From 45f317b03512786720c49b312223af851b92c011 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9F=A9=E5=93=81=E9=BE=99?= Date: Fri, 5 May 2023 14:09:45 +0800 Subject: [PATCH] merge upstream 5.15.8 --- .QT-ENTERPRISE-LICENSE-AGREEMENT | 2568 +- ...-APPLICATION-DEVELOPMENT-LICENSE-AGREEMENT | 1315 - .QT-FOR-AUTOMATION-LICENSE-AGREEMENT | 1315 - .QT-FOR-AUTOMOTIVE-LICENSE-AGREEMENT | 894 - .QT-FOR-DEVICE-CREATION-LICENSE-AGREEMENT | 1315 - .qmake.conf | 2 +- .release-timestamp | 2 +- .tag | 2 +- LICENSE.QT-LICENSE-AGREEMENT | 1660 +- configure.json | 13 +- configure.pri | 23 + debian/changelog | 6 + .../externalsites/external-resources.qdoc | 9 + doc/global/template/style/offline-simple.css | 14 - doc/global/template/style/offline.css | 52 +- doc/global/template/style/online.css | 19 + .../editabletreemodel/mainwindow.cpp | 2 +- .../itemviews/editabletreemodel/treemodel.cpp | 3 + .../widgets/tools/plugandpaint/app/app.pro | 6 +- .../tools/treemodelcompleter/mainwindow.cpp | 5 +- .../widgets/imageviewer/imageviewer.cpp | 7 +- examples/widgets/widgets/imageviewer/main.cpp | 2 +- .../private/qaccessiblebridgeutils_p.h | 0 .../qtaccessibilitysupportversion.h | 4 +- .../QtClipboardSupport/private/qmacmime_p.h | 0 .../qtclipboardsupportversion.h | 4 +- include/QtConcurrent/qtconcurrentversion.h | 4 +- .../QtCore/private/cp949codetbl_p.h | 0 .../QtCore/private/minimum-linux_p.h | 0 .../QtCore/private/qabstractanimation_p.h | 0 .../private/qabstracteventdispatcher_p.h | 0 .../QtCore/private/qabstractfileengine_p.h | 0 .../QtCore/private/qabstractitemmodel_p.h | 0 .../QtCore/private/qabstractproxymodel_p.h | 0 .../QtCore/private/qabstractstate_p.h | 0 .../QtCore/private/qabstracttransition_p.h | 0 .../QtCore/private/qanimationgroup_p.h | 0 .../QtCore/private/qbig5codec_p.h | 0 .../QtCore/private/qbinaryjson_p.h | 0 .../QtCore/private/qbinaryjsonarray_p.h | 0 .../QtCore/private/qbinaryjsonobject_p.h | 0 .../QtCore/private/qbinaryjsonvalue_p.h | 0 .../QtCore/private/qbytearray_p.h | 0 .../QtCore/private/qbytedata_p.h | 0 .../QtCore/private/qcalendarbackend_p.h | 0 .../QtCore/private/qcalendarmath_p.h | 0 .../QtCore/private/qcborcommon_p.h | 0 .../QtCore/private/qcborvalue_p.h | 0 .../QtCore/private/qcfsocketnotifier_p.h | 0 .../QtCore/private/qcollator_p.h | 0 .../QtCore/private/qcore_mac_p.h | 0 .../QtCore/private/qcore_unix_p.h | 0 .../QtCore/private/qcoreapplication_p.h | 0 .../QtCore/private/qcorecmdlineargs_p.h | 0 .../QtCore/private/qcoreglobaldata_p.h | 0 .../QtCore/private/qdatastream_p.h | 0 .../QtCore/private/qdataurl_p.h | 0 .../QtCore/private/qdatetime_p.h | 0 .../QtCore/private/qdatetimeparser_p.h | 0 .../QtCore/private/qdeadlinetimer_p.h | 0 .../QtCore/private/qdebug_p.h | 0 .../QtCore/private/qdir_p.h | 0 .../QtCore/private/qdoublescanprint_p.h | 0 .../QtCore/private/qduplicatetracker_p.h | 0 .../QtCore/private/qelfparser_p.h | 0 .../QtCore/private/qendian_p.h | 0 .../QtCore/private/qeucjpcodec_p.h | 0 .../QtCore/private/qeuckrcodec_p.h | 0 .../QtCore/private/qeventdispatcher_cf_p.h | 0 .../QtCore/private/qeventdispatcher_glib_p.h | 0 .../QtCore/private/qeventdispatcher_unix_p.h | 0 .../QtCore/private/qeventdispatcher_win_p.h | 0 .../QtCore/private/qeventdispatcher_winrt_p.h | 0 .../QtCore/private/qeventloop_p.h | 0 .../QtCore/private/qeventtransition_p.h | 0 .../QtCore/private/qfactoryloader_p.h | 0 .../QtCore/private/qfile_p.h | 0 .../QtCore/private/qfiledevice_p.h | 0 .../QtCore/private/qfileinfo_p.h | 0 .../QtCore/private/qfileselector_p.h | 0 .../QtCore/private/qfilesystemengine_p.h | 0 .../QtCore/private/qfilesystementry_p.h | 0 .../QtCore/private/qfilesystemiterator_p.h | 0 .../QtCore/private/qfilesystemmetadata_p.h | 0 .../private/qfilesystemwatcher_fsevents_p.h | 0 .../private/qfilesystemwatcher_inotify_p.h | 0 .../private/qfilesystemwatcher_kqueue_p.h | 0 .../QtCore/private/qfilesystemwatcher_p.h | 0 .../private/qfilesystemwatcher_polling_p.h | 0 .../QtCore/private/qfilesystemwatcher_win_p.h | 0 .../QtCore/private/qfinalstate_p.h | 0 .../QtCore/private/qfreelist_p.h | 0 .../QtCore/private/qfsfileengine_iterator_p.h | 0 .../QtCore/private/qfsfileengine_p.h | 0 .../QtCore/private/qfunctions_fake_env_p.h | 0 .../QtCore/private/qfunctions_p.h | 0 .../QtCore/private/qfutex_p.h | 0 .../QtCore/private/qfutureinterface_p.h | 0 .../QtCore/private/qfuturewatcher_p.h | 0 .../QtCore/private/qgb18030codec_p.h | 0 .../QtCore/private/qglobal_p.h | 0 .../QtCore/private/qgregoriancalendar_p.h | 0 .../QtCore/private/qharfbuzz_p.h | 0 .../QtCore/private/qhijricalendar_data_p.h | 0 .../QtCore/private/qhijricalendar_p.h | 0 .../QtCore/private/qhistorystate_p.h | 0 .../QtCore/private/qhooks_p.h | 0 .../QtCore/private/qiconvcodec_p.h | 0 .../QtCore/private/qicucodec_p.h | 0 .../QtCore/private/qiodevice_p.h | 0 .../QtCore/private/qipaddress_p.h | 0 .../QtCore/private/qisciicodec_p.h | 0 .../QtCore/private/qislamiccivilcalendar_p.h | 0 .../QtCore/private/qitemselectionmodel_p.h | 0 .../QtCore/private/qjalalicalendar_data_p.h | 0 .../QtCore/private/qjalalicalendar_p.h | 0 .../QtCore/private/qjiscodec_p.h | 0 .../QtCore/private/qjni_p.h | 0 .../QtCore/private/qjnihelpers_p.h | 0 .../QtCore/private/qjpunicode_p.h | 0 .../QtCore/private/qjson_p.h | 0 .../QtCore/private/qjsonparser_p.h | 0 .../QtCore/private/qjsonwriter_p.h | 0 .../QtCore/private/qjuliancalendar_p.h | 0 .../QtCore/private/qlatincodec_p.h | 0 .../QtCore/private/qlibrary_p.h | 0 .../QtCore/private/qlocale_data_p.h | 0 .../QtCore/private/qlocale_p.h | 0 .../QtCore/private/qlocale_tools_p.h | 0 .../QtCore/private/qlockfile_p.h | 0 .../QtCore/private/qlocking_p.h | 0 .../QtCore/private/qlogging_p.h | 0 .../QtCore/private/qloggingregistry_p.h | 0 .../QtCore/private/qmachparser_p.h | 0 .../QtCore/private/qmakearray_p.h | 0 .../QtCore/private/qmemory_p.h | 0 .../QtCore/private/qmetaobject_moc_p.h | 0 .../QtCore/private/qmetaobject_p.h | 0 .../QtCore/private/qmetaobjectbuilder_p.h | 0 .../QtCore/private/qmetatype_p.h | 0 .../QtCore/private/qmetatypeswitcher_p.h | 0 .../QtCore/private/qmilankoviccalendar_p.h | 0 .../QtCore/private/qmimedatabase_p.h | 0 .../QtCore/private/qmimeglobpattern_p.h | 0 .../QtCore/private/qmimemagicrule_p.h | 0 .../QtCore/private/qmimemagicrulematcher_p.h | 0 .../QtCore/private/qmimeprovider_p.h | 0 .../QtCore/private/qmimetype_p.h | 0 .../QtCore/private/qmimetypeparser_p.h | 0 .../QtCore/private/qmutex_p.h | 0 .../private/qnoncontiguousbytedevice_p.h | 0 .../QtCore/private/qnumeric_p.h | 0 .../QtCore/private/qobject_p.h | 0 .../QtCore/private/qoffsetstringarray_p.h | 0 .../private/qoperatingsystemversion_p.h | 0 .../private/qoperatingsystemversion_win_p.h | 0 .../QtCore/private/qorderedmutexlocker_p.h | 0 .../private/qparallelanimationgroup_p.h | 0 .../QtCore/private/qplugin_p.h | 0 .../QtCore/private/qpoll_p.h | 0 .../QtCore/private/qppsattribute_p.h | 0 .../QtCore/private/qppsattributeprivate_p.h | 0 .../QtCore/private/qppsobject_p.h | 0 .../QtCore/private/qppsobjectprivate_p.h | 0 .../QtCore/private/qprocess_p.h | 0 .../QtCore/private/qpropertyanimation_p.h | 0 .../QtCore/private/qrandom_p.h | 0 .../QtCore/private/qreadwritelock_p.h | 0 .../QtCore/private/qresource_iterator_p.h | 0 .../QtCore/private/qresource_p.h | 0 .../QtCore/private/qringbuffer_p.h | 0 .../QtCore/private/qromancalendar_data_p.h | 0 .../QtCore/private/qromancalendar_p.h | 0 .../QtCore/private/qsavefile_p.h | 0 .../QtCore/private/qscopedpointer_p.h | 0 .../private/qsequentialanimationgroup_p.h | 0 .../QtCore/private/qsettings_p.h | 0 .../QtCore/private/qsharedmemory_p.h | 0 .../QtCore/private/qsignaleventgenerator_p.h | 0 .../QtCore/private/qsignaltransition_p.h | 0 .../QtCore/private/qsimd_p.h | 0 .../QtCore/private/qsimd_x86_p.h | 0 .../QtCore/private/qsimplecodec_p.h | 0 .../QtCore/private/qsjiscodec_p.h | 0 .../QtCore/private/qstate_p.h | 0 .../QtCore/private/qstatemachine_p.h | 0 .../QtCore/private/qstdweb_p.h | 0 .../QtCore/private/qstorageinfo_p.h | 0 .../QtCore/private/qstringalgorithms_p.h | 0 .../QtCore/private/qstringiterator_p.h | 0 .../QtCore/private/qsystemerror_p.h | 0 .../QtCore/private/qsystemlibrary_p.h | 0 .../QtCore/private/qsystemsemaphore_p.h | 0 .../QtCore/private/qt_pch.h | 0 .../QtCore/private/qtemporaryfile_p.h | 0 .../QtCore/private/qtextcodec_p.h | 0 .../QtCore/private/qtextstream_p.h | 0 .../QtCore/private/qthread_p.h | 0 .../QtCore/private/qthreadpool_p.h | 0 .../QtCore/private/qtimerinfo_unix_p.h | 0 .../QtCore/private/qtimezoneprivate_data_p.h | 0 .../QtCore/private/qtimezoneprivate_p.h | 0 .../QtCore/private/qtldurl_p.h | 0 .../QtCore/private/qtools_p.h | 0 .../QtCore/private/qtrace_p.h | 0 .../QtCore/private/qtranslator_p.h | 0 .../QtCore/private/qtransposeproxymodel_p.h | 0 .../QtCore/private/qtsciicodec_p.h | 0 .../QtCore/private/qunicodetables_p.h | 0 .../QtCore/private/qunicodetools_p.h | 0 .../QtCore/private/qurl_p.h | 0 .../QtCore/private/qurltlds_p.h | 0 .../QtCore/private/qutfcodec_p.h | 0 .../QtCore/private/qvariant_p.h | 0 .../QtCore/private/qvariantanimation_p.h | 0 .../QtCore/private/qwaitcondition_p.h | 0 .../QtCore/private/qwindowscodec_p.h | 0 .../QtCore/private/qwindowspipereader_p.h | 0 .../QtCore/private/qwindowspipewriter_p.h | 0 .../QtCore/private/qwineventnotifier_p.h | 0 .../QtCore/private/qwinregistry_p.h | 0 .../QtCore/private/qxmlstream_p.h | 0 .../QtCore/private/qxmlutils_p.h | 0 include/QtCore/headers.pri | 2 +- include/QtCore/qtcoreversion.h | 4 +- .../QtDBus/private/dbus_minimal_p.h | 0 .../QtDBus/private/qdbus_symbols_p.h | 0 .../QtDBus/private/qdbusabstractadaptor_p.h | 0 .../QtDBus/private/qdbusabstractinterface_p.h | 0 .../QtDBus/private/qdbusargument_p.h | 0 .../QtDBus/private/qdbusconnection_p.h | 0 .../QtDBus/private/qdbusconnectionmanager_p.h | 0 .../QtDBus/private/qdbuscontext_p.h | 0 .../QtDBus/private/qdbusintegrator_p.h | 0 .../QtDBus/private/qdbusinterface_p.h | 0 .../QtDBus/private/qdbusintrospection_p.h | 0 .../QtDBus/private/qdbusmessage_p.h | 0 .../QtDBus/private/qdbusmetaobject_p.h | 0 .../QtDBus/private/qdbusmetatype_p.h | 0 .../QtDBus/private/qdbuspendingcall_p.h | 0 .../QtDBus/private/qdbusthreaddebug_p.h | 0 .../QtDBus/private/qdbusutil_p.h | 0 .../QtDBus/private/qdbusxmlparser_p.h | 0 .../QtDBus/private/qtdbusglobal_p.h | 0 include/QtDBus/qtdbusversion.h | 4 +- .../private/qdevicediscovery_dummy_p.h | 0 .../private/qdevicediscovery_p.h | 0 .../private/qdevicediscovery_static_p.h | 0 .../private/qdevicediscovery_udev_p.h | 0 .../qtdevicediscoverysupportversion.h | 4 +- .../QtEdidSupport/private/qedidparser_p.h | 0 .../private/qedidvendortable_p.h | 0 include/QtEdidSupport/qtedidsupportversion.h | 4 +- .../private/qeglfscontext_p.h | 0 .../private/qeglfscursor_p.h | 0 .../private/qeglfsdeviceintegration_p.h | 0 .../private/qeglfsglobal_p.h | 0 .../private/qeglfshooks_p.h | 0 .../private/qeglfsintegration_p.h | 0 .../private/qeglfsoffscreenwindow_p.h | 0 .../private/qeglfsscreen_p.h | 0 .../private/qeglfsvulkaninstance_p.h | 0 .../private/qeglfsvulkanwindow_p.h | 0 .../private/qeglfswindow_p.h | 0 .../qteglfsdeviceintegrationversion.h | 4 +- .../QtEglSupport/private/qeglconvenience_p.h | 0 .../QtEglSupport/private/qeglpbuffer_p.h | 0 .../private/qeglplatformcontext_p.h | 0 .../private/qeglstreamconvenience_p.h | 0 .../QtEglSupport/private/qt_egl_p.h | 0 .../private/qxlibeglintegration_p.h | 0 include/QtEglSupport/qteglsupportversion.h | 4 +- .../private/qeventdispatcher_glib_p.h | 0 .../private/qgenericunixeventdispatcher_p.h | 0 .../private/qunixeventdispatcher_qpa_p.h | 0 .../private/qwindowsguieventdispatcher_p.h | 0 .../qteventdispatchersupportversion.h | 4 +- .../QtFbSupport/private/qfbbackingstore_p.h | 0 .../QtFbSupport/private/qfbcursor_p.h | 0 .../QtFbSupport/private/qfbscreen_p.h | 0 .../QtFbSupport/private/qfbvthandler_p.h | 0 .../QtFbSupport/private/qfbwindow_p.h | 0 include/QtFbSupport/qtfbsupportversion.h | 4 +- .../private/qcoretextfontdatabase_p.h | 0 .../private/qfontconfigdatabase_p.h | 0 .../private/qfontengine_coretext_p.h | 0 .../private/qfontengine_ft_p.h | 0 .../private/qfontenginemultifontconfig_p.h | 0 .../private/qfreetypefontdatabase_p.h | 0 .../private/qgenericunixfontdatabase_p.h | 0 .../private/qwindowsfontdatabase_ft_p.h | 0 .../private/qwindowsfontdatabase_p.h | 0 .../private/qwindowsfontengine_p.h | 0 .../private/qwindowsfontenginedirectwrite_p.h | 0 .../private/qwindowsnativeimage_p.h | 0 .../private/qwinrtfontdatabase_p.h | 0 .../qtfontdatabasesupportversion.h | 4 +- .../QtGlxSupport/private/qglxconvenience_p.h | 0 include/QtGlxSupport/qtglxsupportversion.h | 4 +- .../private/qrasterbackingstore_p.h | 0 .../qtgraphicssupportversion.h | 4 +- .../QtGui/private/cs_tdr_p.h | 0 .../private/qabstractlayoutstyleinfo_p.h | 0 .../private/qabstracttextdocumentlayout_p.h | 0 .../QtGui/private/qaccessiblecache_p.h | 0 .../QtGui/private/qastchandler_p.h | 0 .../QtGui/private/qbezier_p.h | 0 .../QtGui/private/qblendfunctions_p.h | 0 .../QtGui/private/qblittable_p.h | 0 .../QtGui/private/qbmphandler_p.h | 0 .../QtGui/private/qcolor_p.h | 0 .../QtGui/private/qcolormatrix_p.h | 0 .../QtGui/private/qcolorspace_p.h | 0 .../QtGui/private/qcolortransferfunction_p.h | 0 .../QtGui/private/qcolortransfertable_p.h | 0 .../QtGui/private/qcolortransform_p.h | 0 .../QtGui/private/qcolortrc_p.h | 0 .../QtGui/private/qcolortrclut_p.h | 0 .../QtGui/private/qcoregraphics_p.h | 0 .../QtGui/private/qcosmeticstroker_p.h | 0 .../QtGui/private/qcssparser_p.h | 0 .../QtGui/private/qcssutil_p.h | 0 .../QtGui/private/qcursor_p.h | 0 .../QtGui/private/qdatabuffer_p.h | 0 .../QtGui/private/qdistancefield_p.h | 0 .../{5.15.3 => 5.15.8}/QtGui/private/qdnd_p.h | 0 .../QtGui/private/qdrawhelper_mips_dsp_p.h | 0 .../QtGui/private/qdrawhelper_neon_p.h | 0 .../QtGui/private/qdrawhelper_p.h | 0 .../QtGui/private/qdrawhelper_x86_p.h | 0 .../QtGui/private/qdrawingprimitive_sse2_p.h | 0 .../QtGui/private/qemulationpaintengine_p.h | 0 .../QtGui/private/qevent_p.h | 0 .../QtGui/private/qfixed_p.h | 0 .../QtGui/private/qfont_p.h | 0 .../QtGui/private/qfontengine_p.h | 0 .../QtGui/private/qfontengine_qpf2_p.h | 0 .../QtGui/private/qfontengineglyphcache_p.h | 0 .../QtGui/private/qfontsubset_p.h | 0 .../QtGui/private/qfragmentmap_p.h | 0 .../QtGui/private/qglyphrun_p.h | 0 .../QtGui/private/qgrayraster_p.h | 0 .../QtGui/private/qgridlayoutengine_p.h | 0 .../QtGui/private/qguiapplication_p.h | 0 .../QtGui/private/qharfbuzzng_p.h | 0 .../QtGui/private/qhexstring_p.h | 0 .../QtGui/private/qhighdpiscaling_p.h | 0 .../{5.15.3 => 5.15.8}/QtGui/private/qicc_p.h | 0 .../QtGui/private/qicon_p.h | 0 .../QtGui/private/qiconloader_p.h | 0 .../QtGui/private/qimage_p.h | 0 .../private/qimagepixmapcleanuphooks_p.h | 0 .../private/qimagereaderwriterhelpers_p.h | 0 .../QtGui/private/qimagescale_p.h | 0 .../QtGui/private/qinputcontrol_p.h | 0 .../QtGui/private/qinputdevicemanager_p.h | 0 .../QtGui/private/qinputdevicemanager_p_p.h | 0 .../QtGui/private/qinputmethod_p.h | 0 .../QtGui/private/qinternalmimedata_p.h | 0 .../QtGui/private/qkeymapper_p.h | 0 .../QtGui/private/qkeysequence_p.h | 0 .../QtGui/private/qktxhandler_p.h | 0 .../QtGui/private/qlayoutpolicy_p.h | 0 .../QtGui/private/qmath_p.h | 0 .../QtGui/private/qmemrotate_p.h | 0 .../QtGui/private/qopengl2pexvertexarray_p.h | 0 .../QtGui/private/qopengl_p.h | 0 .../QtGui/private/qopenglcontext_p.h | 0 .../private/qopenglcustomshaderstage_p.h | 0 .../private/qopenglengineshadermanager_p.h | 0 .../private/qopenglengineshadersource_p.h | 0 .../QtGui/private/qopenglextensions_p.h | 0 .../private/qopenglframebufferobject_p.h | 0 .../QtGui/private/qopenglgradientcache_p.h | 0 .../QtGui/private/qopenglpaintdevice_p.h | 0 .../QtGui/private/qopenglpaintengine_p.h | 0 .../private/qopenglprogrambinarycache_p.h | 0 .../QtGui/private/qopenglqueryhelper_p.h | 0 .../QtGui/private/qopenglshadercache_p.h | 0 .../QtGui/private/qopengltexture_p.h | 0 .../QtGui/private/qopengltexturecache_p.h | 0 .../private/qopengltextureglyphcache_p.h | 0 .../QtGui/private/qopengltexturehelper_p.h | 0 .../QtGui/private/qopengltextureuploader_p.h | 0 .../qopenglversionfunctionsfactory_p.h | 0 .../private/qopenglvertexarrayobject_p.h | 0 .../QtGui/private/qoutlinemapper_p.h | 0 .../QtGui/private/qpagedpaintdevice_p.h | 0 .../QtGui/private/qpaintdevicewindow_p.h | 0 .../QtGui/private/qpaintengine_blitter_p.h | 0 .../QtGui/private/qpaintengine_p.h | 0 .../QtGui/private/qpaintengine_pic_p.h | 0 .../QtGui/private/qpaintengine_raster_p.h | 0 .../QtGui/private/qpaintengineex_p.h | 0 .../QtGui/private/qpainter_p.h | 0 .../QtGui/private/qpainterpath_p.h | 0 .../QtGui/private/qpathclipper_p.h | 0 .../QtGui/private/qpathsimplifier_p.h | 0 .../{5.15.3 => 5.15.8}/QtGui/private/qpdf_p.h | 0 .../{5.15.3 => 5.15.8}/QtGui/private/qpen_p.h | 0 .../QtGui/private/qpicture_p.h | 0 .../QtGui/private/qpixmap_blitter_p.h | 0 .../QtGui/private/qpixmap_raster_p.h | 0 .../QtGui/private/qpixmapcache_p.h | 0 .../QtGui/private/qpkmhandler_p.h | 0 .../QtGui/private/qpnghandler_p.h | 0 .../QtGui/private/qpolygonclipper_p.h | 0 .../QtGui/private/qppmhandler_p.h | 0 .../QtGui/private/qrasterdefs_p.h | 0 .../QtGui/private/qrasterizer_p.h | 0 .../QtGui/private/qrawfont_p.h | 0 .../QtGui/private/qrbtree_p.h | 0 .../QtGui/private/qrgba64_p.h | 0 .../{5.15.3 => 5.15.8}/QtGui/private/qrhi_p.h | 0 .../QtGui/private/qrhi_p_p.h | 0 .../QtGui/private/qrhid3d11_p.h | 0 .../QtGui/private/qrhid3d11_p_p.h | 0 .../QtGui/private/qrhigles2_p.h | 0 .../QtGui/private/qrhigles2_p_p.h | 0 .../QtGui/private/qrhimetal_p.h | 0 .../QtGui/private/qrhimetal_p_p.h | 0 .../QtGui/private/qrhinull_p.h | 0 .../QtGui/private/qrhinull_p_p.h | 0 .../QtGui/private/qrhiprofiler_p.h | 0 .../QtGui/private/qrhiprofiler_p_p.h | 0 .../QtGui/private/qrhivulkan_p.h | 0 .../QtGui/private/qrhivulkan_p_p.h | 0 .../QtGui/private/qrhivulkanext_p.h | 0 .../QtGui/private/qscreen_p.h | 0 .../QtGui/private/qsessionmanager_p.h | 0 .../QtGui/private/qshader_p.h | 0 .../QtGui/private/qshader_p_p.h | 0 .../QtGui/private/qshaderdescription_p.h | 0 .../QtGui/private/qshaderdescription_p_p.h | 0 .../QtGui/private/qshaderformat_p.h | 0 .../QtGui/private/qshadergenerator_p.h | 0 .../QtGui/private/qshadergraph_p.h | 0 .../QtGui/private/qshadergraphloader_p.h | 0 .../QtGui/private/qshaderlanguage_p.h | 0 .../QtGui/private/qshadernode_p.h | 0 .../QtGui/private/qshadernodeport_p.h | 0 .../QtGui/private/qshadernodesloader_p.h | 0 .../QtGui/private/qshapedpixmapdndwindow_p.h | 0 .../QtGui/private/qshortcutmap_p.h | 0 .../QtGui/private/qsimpledrag_p.h | 0 .../QtGui/private/qstandarditemmodel_p.h | 0 .../QtGui/private/qstatictext_p.h | 0 .../QtGui/private/qstroker_p.h | 0 .../QtGui/private/qt_gui_pch.h | 0 .../QtGui/private/qt_mips_asm_dsp_p.h | 0 .../QtGui/private/qtextcursor_p.h | 0 .../QtGui/private/qtextdocument_p.h | 0 .../QtGui/private/qtextdocumentfragment_p.h | 0 .../QtGui/private/qtextdocumentlayout_p.h | 0 .../QtGui/private/qtextengine_p.h | 0 .../QtGui/private/qtextformat_p.h | 0 .../QtGui/private/qtexthtmlparser_p.h | 0 .../QtGui/private/qtextimagehandler_p.h | 0 .../QtGui/private/qtextmarkdownimporter_p.h | 0 .../QtGui/private/qtextmarkdownwriter_p.h | 0 .../QtGui/private/qtextobject_p.h | 0 .../QtGui/private/qtextodfwriter_p.h | 0 .../QtGui/private/qtexttable_p.h | 0 .../QtGui/private/qtexturefiledata_p.h | 0 .../QtGui/private/qtexturefilehandler_p.h | 0 .../QtGui/private/qtexturefilereader_p.h | 0 .../QtGui/private/qtextureglyphcache_p.h | 0 .../QtGui/private/qtguiglobal_p.h | 0 .../QtGui/private/qtouchdevice_p.h | 0 .../QtGui/private/qtriangulatingstroker_p.h | 0 .../QtGui/private/qtriangulator_p.h | 0 .../QtGui/private/qvectorpath_p.h | 0 .../QtGui/private/qvulkanwindow_p.h | 0 .../QtGui/private/qwasmlocalfileaccess_p.h | 0 .../QtGui/private/qwindow_p.h | 0 .../QtGui/private/qxbmhandler_p.h | 0 .../QtGui/private/qxpmhandler_p.h | 0 .../QtGui/private/qzipreader_p.h | 0 .../QtGui/private/qzipwriter_p.h | 0 .../QtGui/qpa/qplatformaccessibility.h | 0 .../QtGui/qpa/qplatformbackingstore.h | 0 .../QtGui/qpa/qplatformclipboard.h | 0 .../QtGui/qpa/qplatformcursor.h | 0 .../QtGui/qpa/qplatformdialoghelper.h | 0 .../QtGui/qpa/qplatformdrag.h | 0 .../QtGui/qpa/qplatformfontdatabase.h | 0 .../QtGui/qpa/qplatformgraphicsbuffer.h | 0 .../QtGui/qpa/qplatformgraphicsbufferhelper.h | 0 .../QtGui/qpa/qplatforminputcontext.h | 0 .../QtGui/qpa/qplatforminputcontext_p.h | 0 .../qpa/qplatforminputcontextfactory_p.h | 0 .../QtGui/qpa/qplatforminputcontextplugin_p.h | 0 .../QtGui/qpa/qplatformintegration.h | 0 .../QtGui/qpa/qplatformintegrationfactory_p.h | 0 .../QtGui/qpa/qplatformintegrationplugin.h | 0 .../QtGui/qpa/qplatformmenu.h | 0 .../QtGui/qpa/qplatformnativeinterface.h | 0 .../QtGui/qpa/qplatformoffscreensurface.h | 0 .../QtGui/qpa/qplatformopenglcontext.h | 0 .../QtGui/qpa/qplatformpixmap.h | 0 .../QtGui/qpa/qplatformscreen.h | 0 .../QtGui/qpa/qplatformscreen_p.h | 0 .../QtGui/qpa/qplatformservices.h | 0 .../QtGui/qpa/qplatformsessionmanager.h | 0 .../QtGui/qpa/qplatformsharedgraphicscache.h | 0 .../QtGui/qpa/qplatformsurface.h | 0 .../QtGui/qpa/qplatformsystemtrayicon.h | 0 .../QtGui/qpa/qplatformtheme.h | 0 .../QtGui/qpa/qplatformtheme_p.h | 0 .../QtGui/qpa/qplatformthemefactory_p.h | 0 .../QtGui/qpa/qplatformthemeplugin.h | 0 .../QtGui/qpa/qplatformvulkaninstance.h | 0 .../QtGui/qpa/qplatformwindow.h | 0 .../QtGui/qpa/qplatformwindow_p.h | 0 .../QtGui/qpa/qwindowsysteminterface.h | 0 .../QtGui/qpa/qwindowsysteminterface_p.h | 0 include/QtGui/headers.pri | 4 +- include/QtGui/qtguiversion.h | 4 +- .../private/devicehandlerlist_p.h | 0 .../private/qevdevkeyboard_defaultmap_p.h | 0 .../private/qevdevkeyboardhandler_p.h | 0 .../private/qevdevkeyboardmanager_p.h | 0 .../private/qevdevmousehandler_p.h | 0 .../private/qevdevmousemanager_p.h | 0 .../private/qevdevtablethandler_p.h | 0 .../private/qevdevtabletmanager_p.h | 0 .../private/qevdevtouchfilter_p.h | 0 .../private/qevdevtouchhandler_p.h | 0 .../private/qevdevtouchmanager_p.h | 0 .../QtInputSupport/private/qevdevutil_p.h | 0 .../private/qlibinputhandler_p.h | 0 .../private/qlibinputkeyboard_p.h | 0 .../private/qlibinputpointer_p.h | 0 .../QtInputSupport/private/qlibinputtouch_p.h | 0 .../private/qtouchoutputmapping_p.h | 0 .../QtInputSupport/private/qtslib_p.h | 0 .../QtInputSupport/private/qxkbcommon_p.h | 0 .../QtInputSupport/qtinputsupportversion.h | 4 +- .../QtKmsSupport/private/qkmsdevice_p.h | 0 include/QtKmsSupport/qtkmssupportversion.h | 4 +- .../private/application_p.h | 0 .../private/atspiadaptor_p.h | 0 .../private/bridge_p.h | 0 .../private/cache_p.h | 0 .../private/constant_mappings_p.h | 0 .../private/dbusconnection_p.h | 0 .../private/struct_marshallers_p.h | 0 .../qtlinuxaccessibilitysupportversion.h | 4 +- .../QtMockPlugins1/qtmockplugins1version.h | 4 +- .../QtMockPlugins2/qtmockplugins2version.h | 4 +- .../QtMockPlugins3/qtmockplugins3version.h | 4 +- .../QtNetwork/private/bitstreams_p.h | 0 .../QtNetwork/private/hpack_p.h | 0 .../QtNetwork/private/hpacktable_p.h | 0 .../QtNetwork/private/http2frames_p.h | 0 .../QtNetwork/private/http2protocol_p.h | 0 .../QtNetwork/private/http2streams_p.h | 0 .../QtNetwork/private/huffman_p.h | 0 .../private/qabstractnetworkcache_p.h | 0 .../private/qabstractprotocolhandler_p.h | 0 .../QtNetwork/private/qabstractsocket_p.h | 0 .../private/qabstractsocketengine_p.h | 0 .../QtNetwork/private/qasn1element_p.h | 0 .../QtNetwork/private/qauthenticator_p.h | 0 .../QtNetwork/private/qbearerengine_p.h | 0 .../QtNetwork/private/qbearerplugin_p.h | 0 .../QtNetwork/private/qdnslookup_p.h | 0 .../QtNetwork/private/qdtls_openssl_p.h | 0 .../QtNetwork/private/qdtls_p.h | 0 .../QtNetwork/private/qftp_p.h | 0 .../QtNetwork/private/qhostaddress_p.h | 0 .../QtNetwork/private/qhostinfo_p.h | 0 .../QtNetwork/private/qhsts_p.h | 0 .../QtNetwork/private/qhstsstore_p.h | 0 .../private/qhttp2protocolhandler_p.h | 0 .../QtNetwork/private/qhttpmultipart_p.h | 0 .../private/qhttpnetworkconnection_p.h | 0 .../private/qhttpnetworkconnectionchannel_p.h | 0 .../QtNetwork/private/qhttpnetworkheader_p.h | 0 .../QtNetwork/private/qhttpnetworkreply_p.h | 0 .../QtNetwork/private/qhttpnetworkrequest_p.h | 0 .../private/qhttpprotocolhandler_p.h | 0 .../QtNetwork/private/qhttpsocketengine_p.h | 0 .../QtNetwork/private/qhttpthreaddelegate_p.h | 0 .../QtNetwork/private/qlocalserver_p.h | 0 .../QtNetwork/private/qlocalsocket_p.h | 0 .../QtNetwork/private/qnativesocketengine_p.h | 0 .../private/qnativesocketengine_winrt_p.h | 0 .../QtNetwork/private/qnet_unix_p.h | 0 .../QtNetwork/private/qnetconmonitor_p.h | 0 .../qnetworkaccessauthenticationmanager_p.h | 0 .../private/qnetworkaccessbackend_p.h | 0 .../QtNetwork/private/qnetworkaccesscache_p.h | 0 .../private/qnetworkaccesscachebackend_p.h | 0 .../qnetworkaccessdebugpipebackend_p.h | 0 .../private/qnetworkaccessfilebackend_p.h | 0 .../private/qnetworkaccessftpbackend_p.h | 0 .../private/qnetworkaccessmanager_p.h | 0 .../private/qnetworkconfigmanager_p.h | 0 .../private/qnetworkconfiguration_p.h | 0 .../QtNetwork/private/qnetworkcookie_p.h | 0 .../QtNetwork/private/qnetworkcookiejar_p.h | 0 .../QtNetwork/private/qnetworkdatagram_p.h | 0 .../QtNetwork/private/qnetworkdiskcache_p.h | 0 .../QtNetwork/private/qnetworkfile_p.h | 0 .../QtNetwork/private/qnetworkinterface_p.h | 0 .../private/qnetworkinterface_uikit_p.h | 0 .../private/qnetworkinterface_unix_p.h | 0 .../QtNetwork/private/qnetworkreply_p.h | 0 .../private/qnetworkreplydataimpl_p.h | 0 .../private/qnetworkreplyfileimpl_p.h | 0 .../private/qnetworkreplyhttpimpl_p.h | 0 .../QtNetwork/private/qnetworkreplyimpl_p.h | 0 .../private/qnetworkreplywasmimpl_p.h | 0 .../QtNetwork/private/qnetworkrequest_p.h | 0 .../QtNetwork/private/qnetworksession_p.h | 0 .../QtNetwork/private/qocsp_p.h | 0 .../QtNetwork/private/qocspresponse_p.h | 0 .../QtNetwork/private/qsctpserver_p.h | 0 .../QtNetwork/private/qsctpsocket_p.h | 0 .../private/qsharednetworksession_p.h | 0 .../QtNetwork/private/qsocks5socketengine_p.h | 0 .../private/qspdyprotocolhandler_p.h | 0 .../QtNetwork/private/qssl_p.h | 0 .../QtNetwork/private/qsslcertificate_p.h | 0 .../private/qsslcertificateextension_p.h | 0 .../QtNetwork/private/qsslcipher_p.h | 0 .../QtNetwork/private/qsslconfiguration_p.h | 0 .../QtNetwork/private/qsslcontext_openssl_p.h | 0 .../private/qssldiffiehellmanparameters_p.h | 0 .../QtNetwork/private/qsslkey_p.h | 0 .../private/qsslpresharedkeyauthenticator_p.h | 0 .../QtNetwork/private/qsslsocket_mac_p.h | 0 .../QtNetwork/private/qsslsocket_openssl_p.h | 0 .../private/qsslsocket_openssl_symbols_p.h | 0 .../QtNetwork/private/qsslsocket_p.h | 0 .../QtNetwork/private/qsslsocket_schannel_p.h | 0 .../QtNetwork/private/qsslsocket_winrt_p.h | 0 .../QtNetwork/private/qtcpserver_p.h | 0 .../QtNetwork/private/qtcpsocket_p.h | 0 .../QtNetwork/private/qtnetworkglobal_p.h | 0 .../QtNetwork/private/qurlinfo_p.h | 0 .../private/qwindowscarootfetcher_p.h | 0 include/QtNetwork/qtnetworkversion.h | 4 +- .../QtOpenGL/private/qgl2pexvertexarray_p.h | 0 .../QtOpenGL/private/qgl_p.h | 0 .../QtOpenGL/private/qglcustomshaderstage_p.h | 0 .../private/qglengineshadermanager_p.h | 0 .../private/qglengineshadersource_p.h | 0 .../QtOpenGL/private/qglframebufferobject_p.h | 0 .../QtOpenGL/private/qglgradientcache_p.h | 0 .../QtOpenGL/private/qglpaintdevice_p.h | 0 .../QtOpenGL/private/qglpixelbuffer_p.h | 0 .../QtOpenGL/private/qglshadercache_p.h | 0 .../private/qgraphicsshadereffect_p.h | 0 .../private/qpaintengineex_opengl2_p.h | 0 .../private/qtextureglyphcache_gl_p.h | 0 include/QtOpenGL/qtopenglversion.h | 4 +- .../qtopenglextensionsversion.h | 4 +- .../private/qopenglcompositor_p.h | 0 .../private/qopenglcompositorbackingstore_p.h | 0 .../qtplatformcompositorsupportversion.h | 4 +- .../qtplatformheadersversion.h | 4 +- .../private/qabstractprintdialog_p.h | 0 .../QtPrintSupport/private/qcups_p.h | 0 .../QtPrintSupport/private/qcupsjobwidget_p.h | 0 .../private/qpagesetupdialog_p.h | 0 .../private/qpagesetupdialog_unix_p.h | 0 .../private/qpaintengine_alpha_p.h | 0 .../private/qpaintengine_preview_p.h | 0 .../QtPrintSupport/private/qprint_p.h | 0 .../QtPrintSupport/private/qprintdevice_p.h | 0 .../private/qprintengine_pdf_p.h | 0 .../private/qprintengine_win_p.h | 0 .../QtPrintSupport/private/qprinter_p.h | 0 .../QtPrintSupport/private/qprinterinfo_p.h | 0 .../private/qtprintsupportglobal_p.h | 0 .../QtPrintSupport/qpa/qplatformprintdevice.h | 0 .../qpa/qplatformprintersupport.h | 0 .../QtPrintSupport/qpa/qplatformprintplugin.h | 0 .../QtPrintSupport/qtprintsupportversion.h | 4 +- .../private/qgenericunixservices_p.h | 0 .../qtservicesupportversion.h | 4 +- .../QtSql/private/qsqlcachedresult_p.h | 0 .../QtSql/private/qsqldriver_p.h | 0 .../QtSql/private/qsqlnulldriver_p.h | 0 .../QtSql/private/qsqlquerymodel_p.h | 0 .../QtSql/private/qsqlresult_p.h | 0 .../QtSql/private/qsqltablemodel_p.h | 0 .../QtSql/private/qtsqlglobal_p.h | 0 include/QtSql/qtsqlversion.h | 4 +- .../QtTest/private/callgrind_p.h | 0 .../QtTest/private/cycle_p.h | 0 .../QtTest/private/linux_perf_event_p.h | 0 .../QtTest/private/qabstracttestlogger_p.h | 0 .../QtTest/private/qappletestlogger_p.h | 0 .../QtTest/private/qbenchmark_p.h | 0 .../QtTest/private/qbenchmarkevent_p.h | 0 .../QtTest/private/qbenchmarkmeasurement_p.h | 0 .../QtTest/private/qbenchmarkmetric_p.h | 0 .../QtTest/private/qbenchmarkperfevents_p.h | 0 .../private/qbenchmarktimemeasurers_p.h | 0 .../QtTest/private/qbenchmarkvalgrind_p.h | 0 .../QtTest/private/qcsvbenchmarklogger_p.h | 0 .../QtTest/private/qjunittestlogger_p.h | 0 .../QtTest/private/qplaintestlogger_p.h | 0 .../QtTest/private/qsignaldumper_p.h | 0 .../QtTest/private/qtaptestlogger_p.h | 0 .../QtTest/private/qteamcitylogger_p.h | 0 .../QtTest/private/qtestblacklist_p.h | 0 .../QtTest/private/qtestcoreelement_p.h | 0 .../QtTest/private/qtestcorelist_p.h | 0 .../QtTest/private/qtestelement_p.h | 0 .../QtTest/private/qtestelementattribute_p.h | 0 .../QtTest/private/qtesthelpers_p.h | 0 .../QtTest/private/qtestjunitstreamer_p.h | 0 .../QtTest/private/qtestlog_p.h | 0 .../QtTest/private/qtestresult_p.h | 0 .../QtTest/private/qtesttable_p.h | 0 .../QtTest/private/qtestutil_macos_p.h | 0 .../QtTest/private/qxctestlogger_p.h | 0 .../QtTest/private/qxmltestlogger_p.h | 0 .../QtTest/private/valgrind_p.h | 0 include/QtTest/qttestversion.h | 4 +- .../private/qabstractfileiconengine_p.h | 0 .../private/qdbusmenuadaptor_p.h | 0 .../QtThemeSupport/private/qdbusmenubar_p.h | 0 .../private/qdbusmenuconnection_p.h | 0 .../private/qdbusmenuregistrarproxy_p.h | 0 .../QtThemeSupport/private/qdbusmenutypes_p.h | 0 .../private/qdbusplatformmenu_p.h | 0 .../QtThemeSupport/private/qdbustrayicon_p.h | 0 .../QtThemeSupport/private/qdbustraytypes_p.h | 0 .../private/qgenericunixthemes_p.h | 0 .../private/qstatusnotifieritemadaptor_p.h | 0 .../private/qxdgnotificationproxy_p.h | 0 .../QtThemeSupport/qtthemesupportversion.h | 4 +- .../private/qbasicvulkanplatforminstance_p.h | 0 .../private/qvkconvenience_p.h | 0 .../QtVulkanSupport/qtvulkansupportversion.h | 4 +- .../QtWidgets/private/complexwidgets_p.h | 0 .../QtWidgets/private/itemviews_p.h | 0 .../QtWidgets/private/qabstractbutton_p.h | 0 .../private/qabstractitemdelegate_p.h | 0 .../QtWidgets/private/qabstractitemview_p.h | 0 .../QtWidgets/private/qabstractscrollarea_p.h | 0 .../QtWidgets/private/qabstractslider_p.h | 0 .../QtWidgets/private/qabstractspinbox_p.h | 0 .../QtWidgets/private/qaccessiblemenu_p.h | 0 .../private/qaccessiblewidgetfactory_p.h | 0 .../QtWidgets/private/qaccessiblewidgets_p.h | 0 .../QtWidgets/private/qaction_p.h | 0 .../QtWidgets/private/qapplication_p.h | 0 .../private/qbasickeyeventtransition_p.h | 0 .../private/qbasicmouseeventtransition_p.h | 0 .../QtWidgets/private/qbsptree_p.h | 0 .../QtWidgets/private/qbuttongroup_p.h | 0 .../QtWidgets/private/qcolumnview_p.h | 0 .../QtWidgets/private/qcolumnviewgrip_p.h | 0 .../QtWidgets/private/qcombobox_p.h | 0 .../QtWidgets/private/qcommonstyle_p.h | 0 .../QtWidgets/private/qcommonstylepixmaps_p.h | 0 .../QtWidgets/private/qcompleter_p.h | 0 .../QtWidgets/private/qdatetimeedit_p.h | 0 .../QtWidgets/private/qdesktopwidget_p.h | 0 .../QtWidgets/private/qdialog_p.h | 0 .../QtWidgets/private/qdockarealayout_p.h | 0 .../QtWidgets/private/qdockwidget_p.h | 0 .../QtWidgets/private/qeffects_p.h | 0 .../QtWidgets/private/qfiledialog_p.h | 0 .../QtWidgets/private/qfileiconprovider_p.h | 0 .../QtWidgets/private/qfileinfogatherer_p.h | 0 .../QtWidgets/private/qfilesystemmodel_p.h | 0 .../QtWidgets/private/qflickgesture_p.h | 0 .../QtWidgets/private/qfontdialog_p.h | 0 .../QtWidgets/private/qframe_p.h | 0 .../QtWidgets/private/qfscompleter_p.h | 0 .../QtWidgets/private/qfusionstyle_p.h | 0 .../QtWidgets/private/qfusionstyle_p_p.h | 0 .../QtWidgets/private/qgesture_p.h | 0 .../QtWidgets/private/qgesturemanager_p.h | 0 .../QtWidgets/private/qgraph_p.h | 0 .../private/qgraphicsanchorlayout_p.h | 0 .../QtWidgets/private/qgraphicseffect_p.h | 0 .../private/qgraphicsgridlayoutengine_p.h | 0 .../QtWidgets/private/qgraphicsitem_p.h | 0 .../QtWidgets/private/qgraphicslayout_p.h | 0 .../QtWidgets/private/qgraphicslayoutitem_p.h | 0 .../private/qgraphicslayoutstyleinfo_p.h | 0 .../private/qgraphicsproxywidget_p.h | 0 .../QtWidgets/private/qgraphicsscene_bsp_p.h | 0 .../QtWidgets/private/qgraphicsscene_p.h | 0 .../private/qgraphicsscenebsptreeindex_p.h | 0 .../QtWidgets/private/qgraphicssceneindex_p.h | 0 .../private/qgraphicsscenelinearindex_p.h | 0 .../QtWidgets/private/qgraphicstransform_p.h | 0 .../QtWidgets/private/qgraphicsview_p.h | 0 .../QtWidgets/private/qgraphicswidget_p.h | 0 .../QtWidgets/private/qheaderview_p.h | 0 .../QtWidgets/private/qitemeditorfactory_p.h | 0 .../QtWidgets/private/qkeysequenceedit_p.h | 0 .../QtWidgets/private/qlabel_p.h | 0 .../QtWidgets/private/qlayout_p.h | 0 .../QtWidgets/private/qlayoutengine_p.h | 0 .../QtWidgets/private/qlineedit_p.h | 0 .../QtWidgets/private/qlistview_p.h | 0 .../QtWidgets/private/qlistwidget_p.h | 0 .../private/qmacgesturerecognizer_p.h | 0 .../QtWidgets/private/qmainwindowlayout_p.h | 0 .../QtWidgets/private/qmdiarea_p.h | 0 .../QtWidgets/private/qmdisubwindow_p.h | 0 .../QtWidgets/private/qmenu_p.h | 0 .../QtWidgets/private/qmenubar_p.h | 0 .../QtWidgets/private/qpixmapfilter_p.h | 0 .../QtWidgets/private/qpixmapstyle_p.h | 0 .../QtWidgets/private/qpixmapstyle_p_p.h | 0 .../QtWidgets/private/qplaintextedit_p.h | 0 .../QtWidgets/private/qproxystyle_p.h | 0 .../QtWidgets/private/qpushbutton_p.h | 0 .../QtWidgets/private/qscrollarea_p.h | 0 .../QtWidgets/private/qscrollbar_p.h | 0 .../QtWidgets/private/qscroller_p.h | 0 .../QtWidgets/private/qscrollerproperties_p.h | 0 .../QtWidgets/private/qsidebar_p.h | 0 .../QtWidgets/private/qsimplex_p.h | 0 .../QtWidgets/private/qsplitter_p.h | 0 .../QtWidgets/private/qstandardgestures_p.h | 0 .../QtWidgets/private/qstyle_p.h | 0 .../QtWidgets/private/qstyleanimation_p.h | 0 .../QtWidgets/private/qstylehelper_p.h | 0 .../QtWidgets/private/qstylesheetstyle_p.h | 0 .../QtWidgets/private/qsystemtrayicon_p.h | 0 .../QtWidgets/private/qt_widgets_pch.h | 0 .../QtWidgets/private/qtabbar_p.h | 0 .../QtWidgets/private/qtableview_p.h | 0 .../QtWidgets/private/qtablewidget_p.h | 0 .../QtWidgets/private/qtextedit_p.h | 0 .../QtWidgets/private/qtoolbar_p.h | 0 .../QtWidgets/private/qtoolbararealayout_p.h | 0 .../QtWidgets/private/qtoolbarextension_p.h | 0 .../QtWidgets/private/qtoolbarlayout_p.h | 0 .../QtWidgets/private/qtoolbarseparator_p.h | 0 .../QtWidgets/private/qtreeview_p.h | 0 .../QtWidgets/private/qtreewidget_p.h | 0 .../private/qtreewidgetitemiterator_p.h | 0 .../QtWidgets/private/qtwidgetsglobal_p.h | 0 .../QtWidgets/private/qundostack_p.h | 0 .../QtWidgets/private/qwidget_p.h | 0 .../QtWidgets/private/qwidgetaction_p.h | 0 .../QtWidgets/private/qwidgetanimator_p.h | 0 .../QtWidgets/private/qwidgetitemdata_p.h | 0 .../QtWidgets/private/qwidgetlinecontrol_p.h | 0 .../private/qwidgetrepaintmanager_p.h | 0 .../private/qwidgetresizehandler_p.h | 0 .../QtWidgets/private/qwidgettextcontrol_p.h | 0 .../private/qwidgettextcontrol_p_p.h | 0 .../QtWidgets/private/qwidgetwindow_p.h | 0 .../QtWidgets/private/qwindowcontainer_p.h | 0 .../QtWidgets/private/qwindowsstyle_p.h | 0 .../QtWidgets/private/qwindowsstyle_p_p.h | 0 .../QtWidgets/private/qwizard_win_p.h | 0 .../QtWidgets/private/rangecontrols_p.h | 0 .../QtWidgets/private/simplewidgets_p.h | 0 include/QtWidgets/qtwidgetsversion.h | 4 +- .../private/qwindowsuiawrapper_p.h | 0 .../private/uiaattributeids_p.h | 0 .../private/uiaclientinterfaces_p.h | 0 .../private/uiacontroltypeids_p.h | 0 .../private/uiaerrorids_p.h | 0 .../private/uiaeventids_p.h | 0 .../private/uiageneralids_p.h | 0 .../private/uiapatternids_p.h | 0 .../private/uiapropertyids_p.h | 0 .../private/uiaserverinterfaces_p.h | 0 .../private/uiatypes_p.h | 0 .../qtwindowsuiautomationsupportversion.h | 4 +- .../QtXkbCommonSupport/private/qxkbcommon_p.h | 0 .../qtxkbcommonsupportversion.h | 4 +- .../{5.15.3 => 5.15.8}/QtXml/private/qdom_p.h | 0 .../QtXml/private/qdomhelpers_p.h | 0 .../{5.15.3 => 5.15.8}/QtXml/private/qxml_p.h | 0 include/QtXml/qtxmlversion.h | 4 +- mkspecs/android-clang/qmake.conf | 2 +- mkspecs/common/gcc-base-mac.conf | 1 + mkspecs/common/gcc-base.conf | 1 + mkspecs/common/macx.conf | 5 +- mkspecs/common/msvc-based-version.conf | 5 + mkspecs/common/msvc-version.conf | 12 + mkspecs/common/qcc-base-qnx-aarch64le.conf | 2 +- mkspecs/common/qcc-base-qnx-armle-v7.conf | 3 +- mkspecs/common/qcc-base-qnx-x86-64.conf | 2 +- mkspecs/common/qcc-base-qnx-x86.conf | 2 +- mkspecs/common/qcc-base.conf | 2 - .../android/android_deployment_settings.prf | 9 +- mkspecs/features/android/sdk.prf | 2 +- mkspecs/features/create_cmake.prf | 9 +- .../data/cmake/Qt5PluginTarget.cmake.in | 9 +- mkspecs/features/default_post.prf | 3 +- mkspecs/features/lrelease.prf | 2 +- mkspecs/features/mac/default_post.prf | 39 +- mkspecs/features/mac/default_pre.prf | 21 + mkspecs/features/mac/sdk.mk | 8 +- mkspecs/features/qt.prf | 27 +- mkspecs/features/qt_docs.prf | 14 +- mkspecs/features/qt_helper_lib.prf | 17 + mkspecs/features/resources_functions.prf | 4 +- mkspecs/features/toolchain.prf | 11 +- mkspecs/features/uikit/default_post.prf | 2 +- mkspecs/features/uikit/xcodebuild.mk | 12 +- mkspecs/features/uikit/xcodebuild.prf | 8 +- .../macx-xcode/WorkspaceSettings.xcsettings | 2 - mkspecs/wasm-emscripten/qmake.conf | 2 + qmake/doc/src/qmake-manual.qdoc | 11 +- qmake/generators/mac/pbuilder_pbx.cpp | 24 +- qmake/generators/mac/pbuilder_pbx.h | 1 + qmake/generators/makefile.cpp | 15 + qmake/generators/makefile.h | 1 + qmake/generators/unix/unixmake2.cpp | 28 + .../generators/win32/msbuild_objectmodel.cpp | 2 + qmake/generators/win32/msvc_objectmodel.cpp | 102 +- qmake/generators/win32/msvc_objectmodel.h | 4 +- qmake/generators/win32/msvc_vcproj.cpp | 110 +- src/3rdparty/freetype/README | 31 +- src/3rdparty/freetype/builds/unix/ftconfig.h | 498 +- src/3rdparty/freetype/builds/unix/ftsystem.c | 15 +- src/3rdparty/freetype/docs/CHANGES | 105 +- src/3rdparty/freetype/docs/CUSTOMIZE | 2 +- src/3rdparty/freetype/docs/DEBUG | 135 +- src/3rdparty/freetype/docs/TODO | 2 +- .../include/freetype/config/ftconfig.h | 532 +- .../include/freetype/config/ftheader.h | 64 +- .../include/freetype/config/ftmodule.h | 2 - .../include/freetype/config/ftoption.h | 32 +- .../include/freetype/config/ftstdlib.h | 2 +- .../include/freetype/config/integer-types.h | 245 + .../include/freetype/config/mac-support.h | 49 + .../include/freetype/config/public-macros.h | 120 + .../freetype/include/freetype/freetype.h | 82 +- .../freetype/include/freetype/ftadvanc.h | 6 +- .../freetype/include/freetype/ftautoh.h | 450 - .../freetype/include/freetype/ftbbox.h | 5 +- .../freetype/include/freetype/ftbdf.h | 5 +- .../freetype/include/freetype/ftbitmap.h | 7 +- .../freetype/include/freetype/ftbzip2.h | 24 +- .../freetype/include/freetype/ftcache.h | 5 +- .../freetype/include/freetype/ftcffdrv.h | 262 - .../freetype/include/freetype/ftcid.h | 5 +- .../freetype/include/freetype/ftcolor.h | 20 +- .../freetype/include/freetype/ftdriver.h | 11 +- .../freetype/include/freetype/fterrdef.h | 2 +- .../freetype/include/freetype/fterrors.h | 23 +- .../freetype/include/freetype/ftfntfmt.h | 5 +- .../freetype/include/freetype/ftgasp.h | 5 +- .../freetype/include/freetype/ftglyph.h | 5 +- .../freetype/include/freetype/ftgxval.h | 5 +- .../freetype/include/freetype/ftgzip.h | 24 +- .../freetype/include/freetype/ftimage.h | 39 +- .../freetype/include/freetype/ftincrem.h | 7 +- .../freetype/include/freetype/ftlcdfil.h | 34 +- .../freetype/include/freetype/ftlist.h | 5 +- .../freetype/include/freetype/ftlzw.h | 24 +- .../freetype/include/freetype/ftmac.h | 3 +- src/3rdparty/freetype/include/freetype/ftmm.h | 5 +- .../freetype/include/freetype/ftmodapi.h | 9 +- .../freetype/include/freetype/ftmoderr.h | 4 +- .../freetype/include/freetype/ftotval.h | 5 +- .../freetype/include/freetype/ftoutln.h | 21 +- .../freetype/include/freetype/ftparams.h | 5 +- .../freetype/include/freetype/ftpfr.h | 5 +- .../freetype/include/freetype/ftrender.h | 7 +- .../freetype/include/freetype/ftsizes.h | 5 +- .../freetype/include/freetype/ftsnames.h | 7 +- .../freetype/include/freetype/ftstroke.h | 43 +- .../freetype/include/freetype/ftsynth.h | 5 +- .../freetype/include/freetype/ftsystem.h | 3 +- .../freetype/include/freetype/fttrigon.h | 4 +- .../freetype/include/freetype/ftttdrv.h | 310 - .../freetype/include/freetype/fttypes.h | 6 +- .../freetype/include/freetype/ftwinfnt.h | 5 +- .../include/freetype/internal/autohint.h | 8 +- .../include/freetype/internal/cffotypes.h | 13 +- .../include/freetype/internal/cfftypes.h | 15 +- .../freetype/internal/compiler-macros.h | 307 + .../include/freetype/internal/ftcalc.h | 9 +- .../include/freetype/internal/ftdebug.h | 8 +- .../include/freetype/internal/ftdriver.h | 409 - .../include/freetype/internal/ftdrv.h | 6 +- .../include/freetype/internal/ftgloadr.h | 7 +- .../include/freetype/internal/fthash.h | 3 +- .../include/freetype/internal/ftmemory.h | 23 +- .../include/freetype/internal/ftobjs.h | 33 +- .../include/freetype/internal/ftpic.h | 71 - .../include/freetype/internal/ftpsprop.h | 5 +- .../include/freetype/internal/ftrfork.h | 5 +- .../include/freetype/internal/ftserv.h | 30 +- .../include/freetype/internal/ftstream.h | 6 +- .../include/freetype/internal/fttrace.h | 3 +- .../include/freetype/internal/ftvalid.h | 5 +- .../include/freetype/internal/internal.h | 67 - .../include/freetype/internal/psaux.h | 17 +- .../include/freetype/internal/pshints.h | 7 +- .../freetype/internal/services/svbdf.h | 6 +- .../freetype/internal/services/svcfftl.h | 6 +- .../freetype/internal/services/svcid.h | 4 +- .../freetype/internal/services/svfntfmt.h | 4 +- .../freetype/internal/services/svgldict.h | 4 +- .../freetype/internal/services/svgxval.h | 6 +- .../freetype/internal/services/svkern.h | 6 +- .../freetype/internal/services/svmetric.h | 4 +- .../include/freetype/internal/services/svmm.h | 4 +- .../freetype/internal/services/svotval.h | 6 +- .../freetype/internal/services/svpfr.h | 7 +- .../freetype/internal/services/svpostnm.h | 4 +- .../freetype/internal/services/svprop.h | 2 +- .../freetype/internal/services/svpscmap.h | 4 +- .../freetype/internal/services/svpsinfo.h | 6 +- .../freetype/internal/services/svsfnt.h | 6 +- .../freetype/internal/services/svttcmap.h | 6 +- .../freetype/internal/services/svtteng.h | 6 +- .../freetype/internal/services/svttglyf.h | 6 +- .../freetype/internal/services/svwinfnt.h | 6 +- .../freetype/include/freetype/internal/sfnt.h | 9 +- .../include/freetype/internal/t1types.h | 13 +- .../include/freetype/internal/tttypes.h | 11 +- .../include/freetype/internal/wofftypes.h | 208 +- .../freetype/include/freetype/t1tables.h | 5 +- .../freetype/include/freetype/ttnameid.h | 3 +- .../freetype/include/freetype/tttables.h | 5 +- .../freetype/include/freetype/tttags.h | 6 +- .../freetype/include/freetype/ttunpat.h | 60 - src/3rdparty/freetype/include/ft2build.h | 10 +- src/3rdparty/freetype/qt_attribution.json | 4 +- src/3rdparty/freetype/src/Jamfile | 19 - src/3rdparty/freetype/src/autofit/Jamfile | 53 - src/3rdparty/freetype/src/autofit/afangles.c | 2 +- src/3rdparty/freetype/src/autofit/afblue.c | 65 +- src/3rdparty/freetype/src/autofit/afblue.cin | 2 +- src/3rdparty/freetype/src/autofit/afblue.dat | 79 +- src/3rdparty/freetype/src/autofit/afblue.h | 164 +- src/3rdparty/freetype/src/autofit/afblue.hin | 2 +- src/3rdparty/freetype/src/autofit/afcjk.c | 25 +- src/3rdparty/freetype/src/autofit/afcjk.h | 2 +- src/3rdparty/freetype/src/autofit/afcover.h | 2 +- src/3rdparty/freetype/src/autofit/afdummy.c | 2 +- src/3rdparty/freetype/src/autofit/afdummy.h | 2 +- src/3rdparty/freetype/src/autofit/aferrors.h | 6 +- src/3rdparty/freetype/src/autofit/afglobal.c | 6 +- src/3rdparty/freetype/src/autofit/afglobal.h | 2 +- src/3rdparty/freetype/src/autofit/afhints.c | 6 +- src/3rdparty/freetype/src/autofit/afhints.h | 2 +- src/3rdparty/freetype/src/autofit/afindic.c | 2 +- src/3rdparty/freetype/src/autofit/afindic.h | 2 +- src/3rdparty/freetype/src/autofit/aflatin.c | 61 +- src/3rdparty/freetype/src/autofit/aflatin.h | 2 +- src/3rdparty/freetype/src/autofit/aflatin2.c | 4 +- src/3rdparty/freetype/src/autofit/aflatin2.h | 2 +- src/3rdparty/freetype/src/autofit/afloader.c | 4 +- src/3rdparty/freetype/src/autofit/afloader.h | 2 +- src/3rdparty/freetype/src/autofit/afmodule.c | 16 +- src/3rdparty/freetype/src/autofit/afmodule.h | 8 +- src/3rdparty/freetype/src/autofit/afpic.c | 152 - src/3rdparty/freetype/src/autofit/afpic.h | 105 - src/3rdparty/freetype/src/autofit/afranges.c | 26 +- src/3rdparty/freetype/src/autofit/afranges.h | 2 +- src/3rdparty/freetype/src/autofit/afscript.h | 14 +- src/3rdparty/freetype/src/autofit/afshaper.c | 7 +- src/3rdparty/freetype/src/autofit/afshaper.h | 5 +- src/3rdparty/freetype/src/autofit/afstyles.h | 16 +- src/3rdparty/freetype/src/autofit/aftypes.h | 11 +- src/3rdparty/freetype/src/autofit/afwarp.c | 2 +- src/3rdparty/freetype/src/autofit/afwarp.h | 2 +- src/3rdparty/freetype/src/autofit/afwrtsys.h | 2 +- src/3rdparty/freetype/src/autofit/autofit.c | 3 +- src/3rdparty/freetype/src/autofit/hbshim.c | 546 - src/3rdparty/freetype/src/autofit/hbshim.h | 56 - src/3rdparty/freetype/src/autofit/module.mk | 2 +- src/3rdparty/freetype/src/autofit/rules.mk | 2 +- src/3rdparty/freetype/src/base/Jamfile | 90 - src/3rdparty/freetype/src/base/basepic.c | 108 - src/3rdparty/freetype/src/base/basepic.h | 91 - src/3rdparty/freetype/src/base/ftadvanc.c | 9 +- src/3rdparty/freetype/src/base/ftapi.c | 121 - src/3rdparty/freetype/src/base/ftbase.c | 3 +- src/3rdparty/freetype/src/base/ftbase.h | 9 +- src/3rdparty/freetype/src/base/ftbbox.c | 23 +- src/3rdparty/freetype/src/base/ftbdf.c | 9 +- src/3rdparty/freetype/src/base/ftbitmap.c | 17 +- src/3rdparty/freetype/src/base/ftcalc.c | 13 +- src/3rdparty/freetype/src/base/ftcid.c | 9 +- src/3rdparty/freetype/src/base/ftcolor.c | 11 +- src/3rdparty/freetype/src/base/ftdbgmem.c | 18 +- src/3rdparty/freetype/src/base/ftdebug.c | 9 +- src/3rdparty/freetype/src/base/fterrors.c | 9 +- src/3rdparty/freetype/src/base/ftfntfmt.c | 9 +- src/3rdparty/freetype/src/base/ftfstype.c | 11 +- src/3rdparty/freetype/src/base/ftgasp.c | 7 +- src/3rdparty/freetype/src/base/ftgloadr.c | 32 +- src/3rdparty/freetype/src/base/ftglyph.c | 15 +- src/3rdparty/freetype/src/base/ftgxval.c | 9 +- src/3rdparty/freetype/src/base/fthash.c | 5 +- src/3rdparty/freetype/src/base/ftinit.c | 8 +- src/3rdparty/freetype/src/base/ftlcdfil.c | 11 +- src/3rdparty/freetype/src/base/ftmac.c | 9 +- src/3rdparty/freetype/src/base/ftmm.c | 13 +- src/3rdparty/freetype/src/base/ftobjs.c | 114 +- src/3rdparty/freetype/src/base/ftotval.c | 11 +- src/3rdparty/freetype/src/base/ftoutln.c | 22 +- src/3rdparty/freetype/src/base/ftpatent.c | 15 +- src/3rdparty/freetype/src/base/ftpfr.c | 9 +- src/3rdparty/freetype/src/base/ftpic.c | 55 - src/3rdparty/freetype/src/base/ftpsprop.c | 17 +- src/3rdparty/freetype/src/base/ftrfork.c | 15 +- src/3rdparty/freetype/src/base/ftsnames.c | 11 +- src/3rdparty/freetype/src/base/ftstream.c | 9 +- src/3rdparty/freetype/src/base/ftstroke.c | 232 +- src/3rdparty/freetype/src/base/ftsynth.c | 15 +- src/3rdparty/freetype/src/base/ftsystem.c | 12 +- src/3rdparty/freetype/src/base/fttrigon.c | 9 +- src/3rdparty/freetype/src/base/fttype1.c | 11 +- src/3rdparty/freetype/src/base/ftutil.c | 11 +- src/3rdparty/freetype/src/base/ftver.rc | 8 +- src/3rdparty/freetype/src/base/ftwinfnt.c | 11 +- src/3rdparty/freetype/src/base/rules.mk | 2 +- src/3rdparty/freetype/src/bdf/Jamfile | 31 - src/3rdparty/freetype/src/bdf/bdf.c | 1 - src/3rdparty/freetype/src/bdf/bdf.h | 7 +- src/3rdparty/freetype/src/bdf/bdfdrivr.c | 44 +- src/3rdparty/freetype/src/bdf/bdfdrivr.h | 3 +- src/3rdparty/freetype/src/bdf/bdferror.h | 4 +- src/3rdparty/freetype/src/bdf/bdflib.c | 9 +- src/3rdparty/freetype/src/bzip2/Jamfile | 18 - src/3rdparty/freetype/src/bzip2/ftbzip2.c | 15 +- src/3rdparty/freetype/src/bzip2/rules.mk | 2 +- src/3rdparty/freetype/src/cache/Jamfile | 37 - src/3rdparty/freetype/src/cache/ftcache.c | 3 +- src/3rdparty/freetype/src/cache/ftcbasic.c | 17 +- src/3rdparty/freetype/src/cache/ftccache.c | 7 +- src/3rdparty/freetype/src/cache/ftccache.h | 4 +- src/3rdparty/freetype/src/cache/ftccback.h | 7 +- src/3rdparty/freetype/src/cache/ftccmap.c | 13 +- src/3rdparty/freetype/src/cache/ftcerror.h | 6 +- src/3rdparty/freetype/src/cache/ftcglyph.c | 9 +- src/3rdparty/freetype/src/cache/ftcglyph.h | 3 +- src/3rdparty/freetype/src/cache/ftcimage.c | 9 +- src/3rdparty/freetype/src/cache/ftcimage.h | 5 +- src/3rdparty/freetype/src/cache/ftcmanag.c | 11 +- src/3rdparty/freetype/src/cache/ftcmanag.h | 5 +- src/3rdparty/freetype/src/cache/ftcmru.c | 9 +- src/3rdparty/freetype/src/cache/ftcmru.h | 6 +- src/3rdparty/freetype/src/cache/ftcsbits.c | 11 +- src/3rdparty/freetype/src/cache/ftcsbits.h | 5 +- src/3rdparty/freetype/src/cache/rules.mk | 2 +- src/3rdparty/freetype/src/cff/Jamfile | 36 - src/3rdparty/freetype/src/cff/cf2arrst.c | 241 - src/3rdparty/freetype/src/cff/cf2arrst.h | 100 - src/3rdparty/freetype/src/cff/cf2blues.c | 579 - src/3rdparty/freetype/src/cff/cf2blues.h | 185 - src/3rdparty/freetype/src/cff/cf2error.c | 52 - src/3rdparty/freetype/src/cff/cf2error.h | 119 - src/3rdparty/freetype/src/cff/cf2fixed.h | 95 - src/3rdparty/freetype/src/cff/cf2font.c | 512 - src/3rdparty/freetype/src/cff/cf2font.h | 121 - src/3rdparty/freetype/src/cff/cf2ft.c | 700 - src/3rdparty/freetype/src/cff/cf2ft.h | 147 - src/3rdparty/freetype/src/cff/cf2glue.h | 144 - src/3rdparty/freetype/src/cff/cf2hints.c | 1847 - src/3rdparty/freetype/src/cff/cf2hints.h | 289 - src/3rdparty/freetype/src/cff/cf2intrp.c | 1571 - src/3rdparty/freetype/src/cff/cf2intrp.h | 83 - src/3rdparty/freetype/src/cff/cf2read.c | 112 - src/3rdparty/freetype/src/cff/cf2read.h | 68 - src/3rdparty/freetype/src/cff/cf2stack.c | 205 - src/3rdparty/freetype/src/cff/cf2stack.h | 106 - src/3rdparty/freetype/src/cff/cf2types.h | 78 - src/3rdparty/freetype/src/cff/cff.c | 3 +- src/3rdparty/freetype/src/cff/cffcmap.c | 5 +- src/3rdparty/freetype/src/cff/cffcmap.h | 8 +- src/3rdparty/freetype/src/cff/cffdrivr.c | 39 +- src/3rdparty/freetype/src/cff/cffdrivr.h | 5 +- src/3rdparty/freetype/src/cff/cfferrs.h | 6 +- src/3rdparty/freetype/src/cff/cffgload.c | 27 +- src/3rdparty/freetype/src/cff/cffgload.h | 7 +- src/3rdparty/freetype/src/cff/cffload.c | 62 +- src/3rdparty/freetype/src/cff/cffload.h | 7 +- src/3rdparty/freetype/src/cff/cffobjs.c | 107 +- src/3rdparty/freetype/src/cff/cffobjs.h | 3 +- src/3rdparty/freetype/src/cff/cffparse.c | 31 +- src/3rdparty/freetype/src/cff/cffparse.h | 7 +- src/3rdparty/freetype/src/cff/cffpic.c | 138 - src/3rdparty/freetype/src/cff/cffpic.h | 121 - src/3rdparty/freetype/src/cff/cfftoken.h | 2 +- src/3rdparty/freetype/src/cff/cfftypes.h | 284 - src/3rdparty/freetype/src/cff/module.mk | 2 +- src/3rdparty/freetype/src/cff/rules.mk | 2 +- src/3rdparty/freetype/src/cid/Jamfile | 34 - src/3rdparty/freetype/src/cid/ciderrs.h | 6 +- src/3rdparty/freetype/src/cid/cidgload.c | 17 +- src/3rdparty/freetype/src/cid/cidgload.h | 3 +- src/3rdparty/freetype/src/cid/cidload.c | 20 +- src/3rdparty/freetype/src/cid/cidload.h | 5 +- src/3rdparty/freetype/src/cid/cidobjs.c | 18 +- src/3rdparty/freetype/src/cid/cidobjs.h | 6 +- src/3rdparty/freetype/src/cid/cidparse.c | 9 +- src/3rdparty/freetype/src/cid/cidparse.h | 9 +- src/3rdparty/freetype/src/cid/cidriver.c | 21 +- src/3rdparty/freetype/src/cid/cidriver.h | 5 +- src/3rdparty/freetype/src/cid/cidtoken.h | 2 +- src/3rdparty/freetype/src/cid/module.mk | 2 +- src/3rdparty/freetype/src/cid/rules.mk | 2 +- src/3rdparty/freetype/src/cid/type1cid.c | 3 +- src/3rdparty/freetype/src/gxvalid/Jamfile | 52 - src/3rdparty/freetype/src/gxvalid/README | 2 +- src/3rdparty/freetype/src/gxvalid/gxvalid.c | 3 +- src/3rdparty/freetype/src/gxvalid/gxvalid.h | 11 +- src/3rdparty/freetype/src/gxvalid/gxvbsln.c | 2 +- src/3rdparty/freetype/src/gxvalid/gxvcommn.c | 2 +- src/3rdparty/freetype/src/gxvalid/gxvcommn.h | 7 +- src/3rdparty/freetype/src/gxvalid/gxverror.h | 6 +- src/3rdparty/freetype/src/gxvalid/gxvfeat.c | 2 +- src/3rdparty/freetype/src/gxvalid/gxvfeat.h | 2 +- src/3rdparty/freetype/src/gxvalid/gxvfgen.c | 2 +- src/3rdparty/freetype/src/gxvalid/gxvjust.c | 4 +- src/3rdparty/freetype/src/gxvalid/gxvkern.c | 6 +- src/3rdparty/freetype/src/gxvalid/gxvlcar.c | 2 +- src/3rdparty/freetype/src/gxvalid/gxvmod.c | 13 +- src/3rdparty/freetype/src/gxvalid/gxvmod.h | 5 +- src/3rdparty/freetype/src/gxvalid/gxvmort.c | 2 +- src/3rdparty/freetype/src/gxvalid/gxvmort.h | 9 +- src/3rdparty/freetype/src/gxvalid/gxvmort0.c | 2 +- src/3rdparty/freetype/src/gxvalid/gxvmort1.c | 2 +- src/3rdparty/freetype/src/gxvalid/gxvmort2.c | 2 +- src/3rdparty/freetype/src/gxvalid/gxvmort4.c | 2 +- src/3rdparty/freetype/src/gxvalid/gxvmort5.c | 2 +- src/3rdparty/freetype/src/gxvalid/gxvmorx.c | 2 +- src/3rdparty/freetype/src/gxvalid/gxvmorx.h | 9 +- src/3rdparty/freetype/src/gxvalid/gxvmorx0.c | 2 +- src/3rdparty/freetype/src/gxvalid/gxvmorx1.c | 2 +- src/3rdparty/freetype/src/gxvalid/gxvmorx2.c | 2 +- src/3rdparty/freetype/src/gxvalid/gxvmorx4.c | 2 +- src/3rdparty/freetype/src/gxvalid/gxvmorx5.c | 2 +- src/3rdparty/freetype/src/gxvalid/gxvopbd.c | 2 +- src/3rdparty/freetype/src/gxvalid/gxvprop.c | 2 +- src/3rdparty/freetype/src/gxvalid/gxvtrak.c | 2 +- src/3rdparty/freetype/src/gxvalid/module.mk | 2 +- src/3rdparty/freetype/src/gxvalid/rules.mk | 2 +- src/3rdparty/freetype/src/gzip/Jamfile | 16 - src/3rdparty/freetype/src/gzip/ftgzip.c | 25 +- src/3rdparty/freetype/src/gzip/infutil.h | 2 +- src/3rdparty/freetype/src/gzip/rules.mk | 2 +- src/3rdparty/freetype/src/gzip/zconf.h | 284 - src/3rdparty/freetype/src/lzw/Jamfile | 16 - src/3rdparty/freetype/src/lzw/ftlzw.c | 15 +- src/3rdparty/freetype/src/lzw/ftzopen.c | 8 +- src/3rdparty/freetype/src/lzw/ftzopen.h | 8 +- src/3rdparty/freetype/src/lzw/rules.mk | 2 +- src/3rdparty/freetype/src/otvalid/Jamfile | 37 - src/3rdparty/freetype/src/otvalid/module.mk | 2 +- src/3rdparty/freetype/src/otvalid/otvalid.c | 3 +- src/3rdparty/freetype/src/otvalid/otvalid.h | 11 +- src/3rdparty/freetype/src/otvalid/otvbase.c | 2 +- src/3rdparty/freetype/src/otvalid/otvcommn.c | 5 +- src/3rdparty/freetype/src/otvalid/otvcommn.h | 5 +- src/3rdparty/freetype/src/otvalid/otverror.h | 6 +- src/3rdparty/freetype/src/otvalid/otvgdef.c | 2 +- src/3rdparty/freetype/src/otvalid/otvgpos.c | 2 +- src/3rdparty/freetype/src/otvalid/otvgpos.h | 2 +- src/3rdparty/freetype/src/otvalid/otvgsub.c | 2 +- src/3rdparty/freetype/src/otvalid/otvjstf.c | 2 +- src/3rdparty/freetype/src/otvalid/otvmath.c | 2 +- src/3rdparty/freetype/src/otvalid/otvmod.c | 13 +- src/3rdparty/freetype/src/otvalid/otvmod.h | 5 +- src/3rdparty/freetype/src/otvalid/rules.mk | 2 +- src/3rdparty/freetype/src/pcf/Jamfile | 32 - src/3rdparty/freetype/src/pcf/pcf.c | 1 - src/3rdparty/freetype/src/pcf/pcf.h | 5 +- src/3rdparty/freetype/src/pcf/pcfdrivr.c | 34 +- src/3rdparty/freetype/src/pcf/pcfdrivr.h | 3 +- src/3rdparty/freetype/src/pcf/pcferror.h | 4 +- src/3rdparty/freetype/src/pcf/pcfread.c | 27 +- src/3rdparty/freetype/src/pcf/pcfread.h | 1 - src/3rdparty/freetype/src/pcf/pcfutil.c | 1 - src/3rdparty/freetype/src/pcf/pcfutil.h | 2 +- src/3rdparty/freetype/src/pfr/Jamfile | 35 - src/3rdparty/freetype/src/pfr/module.mk | 2 +- src/3rdparty/freetype/src/pfr/pfr.c | 3 +- src/3rdparty/freetype/src/pfr/pfrcmap.c | 5 +- src/3rdparty/freetype/src/pfr/pfrcmap.h | 5 +- src/3rdparty/freetype/src/pfr/pfrdrivr.c | 11 +- src/3rdparty/freetype/src/pfr/pfrdrivr.h | 5 +- src/3rdparty/freetype/src/pfr/pfrerror.h | 6 +- src/3rdparty/freetype/src/pfr/pfrgload.c | 8 +- src/3rdparty/freetype/src/pfr/pfrgload.h | 2 +- src/3rdparty/freetype/src/pfr/pfrload.c | 6 +- src/3rdparty/freetype/src/pfr/pfrload.h | 4 +- src/3rdparty/freetype/src/pfr/pfrobjs.c | 10 +- src/3rdparty/freetype/src/pfr/pfrobjs.h | 2 +- src/3rdparty/freetype/src/pfr/pfrsbit.c | 8 +- src/3rdparty/freetype/src/pfr/pfrsbit.h | 2 +- src/3rdparty/freetype/src/pfr/pfrtypes.h | 5 +- src/3rdparty/freetype/src/pfr/rules.mk | 2 +- src/3rdparty/freetype/src/psaux/Jamfile | 45 - src/3rdparty/freetype/src/psaux/afmparse.c | 9 +- src/3rdparty/freetype/src/psaux/afmparse.h | 5 +- src/3rdparty/freetype/src/psaux/cffdecode.c | 16 +- src/3rdparty/freetype/src/psaux/cffdecode.h | 5 +- src/3rdparty/freetype/src/psaux/module.mk | 2 +- src/3rdparty/freetype/src/psaux/psarrst.c | 2 +- src/3rdparty/freetype/src/psaux/psaux.c | 3 +- src/3rdparty/freetype/src/psaux/psauxerr.h | 6 +- src/3rdparty/freetype/src/psaux/psauxmod.c | 11 +- src/3rdparty/freetype/src/psaux/psauxmod.h | 21 +- src/3rdparty/freetype/src/psaux/psblues.c | 2 +- src/3rdparty/freetype/src/psaux/psconv.c | 7 +- src/3rdparty/freetype/src/psaux/psconv.h | 5 +- src/3rdparty/freetype/src/psaux/pserror.h | 5 +- src/3rdparty/freetype/src/psaux/psfont.c | 3 +- src/3rdparty/freetype/src/psaux/psfont.h | 2 +- src/3rdparty/freetype/src/psaux/psft.c | 16 +- src/3rdparty/freetype/src/psaux/psft.h | 6 +- src/3rdparty/freetype/src/psaux/pshints.c | 4 +- src/3rdparty/freetype/src/psaux/psintrp.c | 26 +- src/3rdparty/freetype/src/psaux/psobjs.c | 19 +- src/3rdparty/freetype/src/psaux/psobjs.h | 7 +- src/3rdparty/freetype/src/psaux/psread.c | 2 +- src/3rdparty/freetype/src/psaux/psstack.c | 14 +- src/3rdparty/freetype/src/psaux/psstack.h | 1 + src/3rdparty/freetype/src/psaux/pstypes.h | 3 +- src/3rdparty/freetype/src/psaux/rules.mk | 2 +- src/3rdparty/freetype/src/psaux/t1cmap.c | 4 +- src/3rdparty/freetype/src/psaux/t1cmap.h | 7 +- src/3rdparty/freetype/src/psaux/t1decode.c | 215 +- src/3rdparty/freetype/src/psaux/t1decode.h | 7 +- src/3rdparty/freetype/src/pshinter/Jamfile | 34 - src/3rdparty/freetype/src/pshinter/module.mk | 2 +- src/3rdparty/freetype/src/pshinter/pshalgo.c | 9 +- src/3rdparty/freetype/src/pshinter/pshalgo.h | 2 +- src/3rdparty/freetype/src/pshinter/pshglob.c | 9 +- src/3rdparty/freetype/src/pshinter/pshglob.h | 6 +- src/3rdparty/freetype/src/pshinter/pshinter.c | 3 +- src/3rdparty/freetype/src/pshinter/pshmod.c | 6 +- src/3rdparty/freetype/src/pshinter/pshmod.h | 5 +- src/3rdparty/freetype/src/pshinter/pshnterr.h | 6 +- src/3rdparty/freetype/src/pshinter/pshpic.c | 76 - src/3rdparty/freetype/src/pshinter/pshpic.h | 63 - src/3rdparty/freetype/src/pshinter/pshrec.c | 13 +- src/3rdparty/freetype/src/pshinter/pshrec.h | 5 +- src/3rdparty/freetype/src/pshinter/rules.mk | 2 +- src/3rdparty/freetype/src/psnames/Jamfile | 31 - src/3rdparty/freetype/src/psnames/module.mk | 2 +- src/3rdparty/freetype/src/psnames/psmodule.c | 9 +- src/3rdparty/freetype/src/psnames/psmodule.h | 5 +- src/3rdparty/freetype/src/psnames/psnamerr.h | 6 +- src/3rdparty/freetype/src/psnames/psnames.c | 3 +- src/3rdparty/freetype/src/psnames/pspic.c | 97 - src/3rdparty/freetype/src/psnames/pspic.h | 68 - src/3rdparty/freetype/src/psnames/pstables.h | 2 +- src/3rdparty/freetype/src/psnames/rules.mk | 2 +- src/3rdparty/freetype/src/raster/Jamfile | 32 - src/3rdparty/freetype/src/raster/ftmisc.h | 2 +- src/3rdparty/freetype/src/raster/ftraster.c | 127 +- src/3rdparty/freetype/src/raster/ftraster.h | 5 +- src/3rdparty/freetype/src/raster/ftrend1.c | 9 +- src/3rdparty/freetype/src/raster/ftrend1.h | 5 +- src/3rdparty/freetype/src/raster/module.mk | 2 +- src/3rdparty/freetype/src/raster/raster.c | 3 +- src/3rdparty/freetype/src/raster/rasterrs.h | 6 +- src/3rdparty/freetype/src/raster/rastpic.c | 89 - src/3rdparty/freetype/src/raster/rastpic.h | 63 - src/3rdparty/freetype/src/raster/rules.mk | 2 +- src/3rdparty/freetype/src/sfnt/Jamfile | 42 - src/3rdparty/freetype/src/sfnt/module.mk | 2 +- src/3rdparty/freetype/src/sfnt/pngshim.c | 17 +- src/3rdparty/freetype/src/sfnt/pngshim.h | 3 +- src/3rdparty/freetype/src/sfnt/rules.mk | 30 +- src/3rdparty/freetype/src/sfnt/sfdriver.c | 27 +- src/3rdparty/freetype/src/sfnt/sfdriver.h | 5 +- src/3rdparty/freetype/src/sfnt/sferrors.h | 6 +- src/3rdparty/freetype/src/sfnt/sfnt.c | 5 +- src/3rdparty/freetype/src/sfnt/sfntpic.c | 143 - src/3rdparty/freetype/src/sfnt/sfntpic.h | 112 - src/3rdparty/freetype/src/sfnt/sfobjs.c | 61 +- src/3rdparty/freetype/src/sfnt/sfobjs.h | 7 +- src/3rdparty/freetype/src/sfnt/sfwoff.c | 21 +- src/3rdparty/freetype/src/sfnt/sfwoff.h | 7 +- src/3rdparty/freetype/src/sfnt/sfwoff2.c | 2337 ++ src/3rdparty/freetype/src/sfnt/sfwoff2.h | 75 + src/3rdparty/freetype/src/sfnt/ttbdf.c | 9 +- src/3rdparty/freetype/src/sfnt/ttbdf.h | 5 +- src/3rdparty/freetype/src/sfnt/ttcmap.c | 42 +- src/3rdparty/freetype/src/sfnt/ttcmap.h | 14 +- src/3rdparty/freetype/src/sfnt/ttcmapc.h | 2 +- src/3rdparty/freetype/src/sfnt/ttcolr.c | 17 +- src/3rdparty/freetype/src/sfnt/ttcolr.h | 3 +- src/3rdparty/freetype/src/sfnt/ttcpal.c | 23 +- src/3rdparty/freetype/src/sfnt/ttcpal.h | 3 +- src/3rdparty/freetype/src/sfnt/ttkern.c | 9 +- src/3rdparty/freetype/src/sfnt/ttkern.h | 7 +- src/3rdparty/freetype/src/sfnt/ttload.c | 27 +- src/3rdparty/freetype/src/sfnt/ttload.h | 7 +- src/3rdparty/freetype/src/sfnt/ttmtx.c | 11 +- src/3rdparty/freetype/src/sfnt/ttmtx.h | 7 +- src/3rdparty/freetype/src/sfnt/ttpost.c | 13 +- src/3rdparty/freetype/src/sfnt/ttpost.h | 4 +- src/3rdparty/freetype/src/sfnt/ttsbit.c | 13 +- src/3rdparty/freetype/src/sfnt/ttsbit.h | 3 +- src/3rdparty/freetype/src/sfnt/woff2tags.c | 109 + src/3rdparty/freetype/src/sfnt/woff2tags.h | 39 + src/3rdparty/freetype/src/smooth/Jamfile | 32 - src/3rdparty/freetype/src/smooth/ftgrays.c | 13 +- src/3rdparty/freetype/src/smooth/ftgrays.h | 4 +- src/3rdparty/freetype/src/smooth/ftsmerrs.h | 6 +- src/3rdparty/freetype/src/smooth/ftsmooth.c | 712 +- src/3rdparty/freetype/src/smooth/ftsmooth.h | 9 +- src/3rdparty/freetype/src/smooth/ftspic.c | 118 - src/3rdparty/freetype/src/smooth/ftspic.h | 75 - src/3rdparty/freetype/src/smooth/module.mk | 6 +- src/3rdparty/freetype/src/smooth/rules.mk | 2 +- src/3rdparty/freetype/src/smooth/smooth.c | 3 +- src/3rdparty/freetype/src/tools/Jamfile | 5 - src/3rdparty/freetype/src/tools/afblue.pl | 2 +- src/3rdparty/freetype/src/tools/chktrcmp.py | 0 .../freetype/src/tools/docmaker/content.py | 672 - .../freetype/src/tools/docmaker/docbeauty.py | 111 - .../freetype/src/tools/docmaker/docmaker.py | 115 - .../freetype/src/tools/docmaker/formatter.py | 228 - .../freetype/src/tools/docmaker/sources.py | 410 - .../freetype/src/tools/docmaker/tohtml.py | 725 - .../freetype/src/tools/docmaker/utils.py | 127 - .../freetype/src/tools/ftfuzzer/README | 81 - .../freetype/src/tools/ftfuzzer/ftfuzzer.cc | 428 - .../freetype/src/tools/ftfuzzer/ftmutator.cc | 314 - .../src/tools/ftfuzzer/rasterfuzzer.cc | 129 - .../freetype/src/tools/ftfuzzer/runinput.cc | 58 - .../freetype/src/tools/ftrandom/Makefile | 45 - .../freetype/src/tools/ftrandom/ftrandom.c | 4 +- src/3rdparty/freetype/src/tools/glnames.py | 2 +- .../src/tools/make_distribution_archives.py | 208 + src/3rdparty/freetype/src/tools/test_afm.c | 7 +- src/3rdparty/freetype/src/tools/test_bbox.c | 5 +- src/3rdparty/freetype/src/tools/test_trig.c | 5 +- .../freetype/src/tools/update-copyright | 0 .../freetype/src/tools/update-copyright-year | 2 +- src/3rdparty/freetype/src/truetype/Jamfile | 37 - src/3rdparty/freetype/src/truetype/module.mk | 2 +- src/3rdparty/freetype/src/truetype/rules.mk | 2 +- src/3rdparty/freetype/src/truetype/truetype.c | 3 +- src/3rdparty/freetype/src/truetype/ttdriver.c | 25 +- src/3rdparty/freetype/src/truetype/ttdriver.h | 5 +- src/3rdparty/freetype/src/truetype/tterrors.h | 6 +- src/3rdparty/freetype/src/truetype/ttgload.c | 83 +- src/3rdparty/freetype/src/truetype/ttgload.h | 3 +- src/3rdparty/freetype/src/truetype/ttgxvar.c | 149 +- src/3rdparty/freetype/src/truetype/ttgxvar.h | 3 +- src/3rdparty/freetype/src/truetype/ttinterp.c | 523 +- src/3rdparty/freetype/src/truetype/ttinterp.h | 5 +- src/3rdparty/freetype/src/truetype/ttobjs.c | 21 +- src/3rdparty/freetype/src/truetype/ttobjs.h | 7 +- src/3rdparty/freetype/src/truetype/ttpic.c | 101 - src/3rdparty/freetype/src/truetype/ttpic.h | 88 - src/3rdparty/freetype/src/truetype/ttpload.c | 29 +- src/3rdparty/freetype/src/truetype/ttpload.h | 5 +- src/3rdparty/freetype/src/truetype/ttsubpix.c | 17 +- src/3rdparty/freetype/src/truetype/ttsubpix.h | 3 +- src/3rdparty/freetype/src/type1/Jamfile | 35 - src/3rdparty/freetype/src/type1/module.mk | 2 +- src/3rdparty/freetype/src/type1/rules.mk | 2 +- src/3rdparty/freetype/src/type1/t1afm.c | 9 +- src/3rdparty/freetype/src/type1/t1afm.h | 5 +- src/3rdparty/freetype/src/type1/t1driver.c | 29 +- src/3rdparty/freetype/src/type1/t1driver.h | 5 +- src/3rdparty/freetype/src/type1/t1errors.h | 6 +- src/3rdparty/freetype/src/type1/t1gload.c | 19 +- src/3rdparty/freetype/src/type1/t1gload.h | 3 +- src/3rdparty/freetype/src/type1/t1load.c | 60 +- src/3rdparty/freetype/src/type1/t1load.h | 9 +- src/3rdparty/freetype/src/type1/t1objs.c | 21 +- src/3rdparty/freetype/src/type1/t1objs.h | 6 +- src/3rdparty/freetype/src/type1/t1parse.c | 9 +- src/3rdparty/freetype/src/type1/t1parse.h | 7 +- src/3rdparty/freetype/src/type1/t1tokens.h | 2 +- src/3rdparty/freetype/src/type1/type1.c | 3 +- src/3rdparty/freetype/src/type42/Jamfile | 32 - src/3rdparty/freetype/src/type42/module.mk | 2 +- src/3rdparty/freetype/src/type42/rules.mk | 2 +- src/3rdparty/freetype/src/type42/t42drivr.c | 12 +- src/3rdparty/freetype/src/type42/t42drivr.h | 5 +- src/3rdparty/freetype/src/type42/t42error.h | 6 +- src/3rdparty/freetype/src/type42/t42objs.c | 8 +- src/3rdparty/freetype/src/type42/t42objs.h | 17 +- src/3rdparty/freetype/src/type42/t42parse.c | 10 +- src/3rdparty/freetype/src/type42/t42parse.h | 4 +- src/3rdparty/freetype/src/type42/t42types.h | 11 +- src/3rdparty/freetype/src/type42/type42.c | 3 +- src/3rdparty/freetype/src/winfonts/Jamfile | 16 - src/3rdparty/freetype/src/winfonts/fnterrs.h | 6 +- src/3rdparty/freetype/src/winfonts/module.mk | 2 +- src/3rdparty/freetype/src/winfonts/rules.mk | 2 +- src/3rdparty/freetype/src/winfonts/winfnt.c | 23 +- src/3rdparty/freetype/src/winfonts/winfnt.h | 7 +- src/3rdparty/gradle/LICENSE | 420 + src/3rdparty/gradle/LICENSE-GRADLEW.txt | 965 - src/3rdparty/gradle/gradle.properties | 5 +- .../gradle/wrapper/gradle-wrapper.properties | 2 +- src/3rdparty/gradle/gradlew | 286 +- src/3rdparty/gradle/gradlew.bat | 173 +- src/3rdparty/gradle/qt_attribution.json | 9 +- src/3rdparty/harfbuzz-ng/harfbuzz-ng.pro | 2 +- .../src/{hb-coretext.cc => hb-coretext.mm} | 17 +- src/3rdparty/libjpeg/LICENSE | 2 +- src/3rdparty/libjpeg/ijg-license.txt | 34 + .../libjpeg/import_from_libjpeg_tarball.sh | 3 +- src/3rdparty/libjpeg/libjpeg.pro | 6 +- src/3rdparty/libjpeg/qt_attribution.json | 21 +- src/3rdparty/libjpeg/src/ChangeLog.md | 315 +- src/3rdparty/libjpeg/src/README.ijg | 37 +- src/3rdparty/libjpeg/src/README.md | 23 +- src/3rdparty/libjpeg/src/change.log | 31 +- src/3rdparty/libjpeg/src/jccolext.c | 18 +- src/3rdparty/libjpeg/src/jccolor.c | 12 +- src/3rdparty/libjpeg/src/jcdctmgr.c | 37 +- src/3rdparty/libjpeg/src/jchuff.c | 403 +- src/3rdparty/libjpeg/src/jcinit.c | 5 +- src/3rdparty/libjpeg/src/jcmaster.c | 2 +- src/3rdparty/libjpeg/src/jconfig.h | 4 +- src/3rdparty/libjpeg/src/jconfig.h.in | 5 - src/3rdparty/libjpeg/{ => src}/jconfigint.h | 4 +- src/3rdparty/libjpeg/src/jconfigint.h.in | 10 + src/3rdparty/libjpeg/src/jcphuff.c | 33 +- src/3rdparty/libjpeg/src/jcsample.c | 63 +- src/3rdparty/libjpeg/src/jctrans.c | 5 +- src/3rdparty/libjpeg/src/jdapimin.c | 3 +- src/3rdparty/libjpeg/src/jdapistd.c | 53 +- src/3rdparty/libjpeg/src/jdarith.c | 15 +- src/3rdparty/libjpeg/src/jdcoefct.c | 290 +- src/3rdparty/libjpeg/src/jdcoefct.h | 3 +- src/3rdparty/libjpeg/src/jdcol565.c | 96 +- src/3rdparty/libjpeg/src/jdcolext.c | 8 +- src/3rdparty/libjpeg/src/jdcolor.c | 23 +- src/3rdparty/libjpeg/src/jdhuff.c | 69 +- src/3rdparty/libjpeg/src/jdhuff.h | 13 +- src/3rdparty/libjpeg/src/jdmainct.c | 5 +- src/3rdparty/libjpeg/src/jdmarker.c | 67 +- src/3rdparty/libjpeg/src/jdmaster.c | 15 +- src/3rdparty/libjpeg/src/jdmerge.c | 55 +- src/3rdparty/libjpeg/src/jdmerge.h | 47 + src/3rdparty/libjpeg/src/jdmrg565.c | 78 +- src/3rdparty/libjpeg/src/jdmrgext.c | 40 +- src/3rdparty/libjpeg/src/jdphuff.c | 48 +- src/3rdparty/libjpeg/src/jdsample.c | 38 +- src/3rdparty/libjpeg/src/jdtrans.c | 5 +- src/3rdparty/libjpeg/src/jerror.h | 13 + src/3rdparty/libjpeg/src/jfdctint.c | 4 +- src/3rdparty/libjpeg/src/jidctint.c | 12 +- src/3rdparty/libjpeg/src/jmemmgr.c | 6 +- src/3rdparty/libjpeg/src/jmorecfg.h | 43 +- src/3rdparty/libjpeg/src/jpegcomp.h | 3 +- src/3rdparty/libjpeg/src/jpegint.h | 18 +- src/3rdparty/libjpeg/src/jpeglib.h | 8 +- src/3rdparty/libjpeg/src/jquant1.c | 27 +- src/3rdparty/libjpeg/src/jquant2.c | 52 +- src/3rdparty/libjpeg/src/jsimd.h | 6 + src/3rdparty/libjpeg/src/jsimd_none.c | 13 + src/3rdparty/libjpeg/src/jversion.h | 22 +- src/3rdparty/libjpeg/zlib-license.txt | 15 + src/3rdparty/libpng/pngrutil.c | 6 +- src/3rdparty/libpng/qtpatches.diff | 17 + src/3rdparty/md4c/md4c.c | 93 +- src/3rdparty/md4c/qt_attribution.json | 4 +- src/3rdparty/pcre2/AUTHORS | 8 +- src/3rdparty/pcre2/LICENCE | 8 +- src/3rdparty/pcre2/pcre2.pro | 2 +- src/3rdparty/pcre2/qt_attribution.json | 12 +- src/3rdparty/pcre2/src/pcre2.h | 12 +- src/3rdparty/pcre2/src/pcre2_auto_possess.c | 13 +- src/3rdparty/pcre2/src/pcre2_compile.c | 86 +- src/3rdparty/pcre2/src/pcre2_dfa_match.c | 69 +- src/3rdparty/pcre2/src/pcre2_error.c | 3 +- src/3rdparty/pcre2/src/pcre2_jit_compile.c | 89 +- src/3rdparty/pcre2/src/pcre2_jit_simd_inc.h | 819 +- src/3rdparty/pcre2/src/pcre2_match.c | 77 +- src/3rdparty/pcre2/src/pcre2_tables.c | 347 +- src/3rdparty/pcre2/src/pcre2_ucd.c | 6332 ++-- src/3rdparty/pcre2/src/pcre2_ucp.h | 8 +- .../pcre2/src/sljit/sljitConfigInternal.h | 14 + .../pcre2/src/sljit/sljitExecAllocator.c | 124 +- src/3rdparty/pcre2/src/sljit/sljitLir.c | 25 +- src/3rdparty/pcre2/src/sljit/sljitLir.h | 76 +- .../pcre2/src/sljit/sljitNativeARM_32.c | 23 +- .../pcre2/src/sljit/sljitNativeARM_64.c | 21 +- .../pcre2/src/sljit/sljitNativeARM_T2_32.c | 21 +- .../pcre2/src/sljit/sljitNativeMIPS_32.c | 2 +- .../pcre2/src/sljit/sljitNativeMIPS_64.c | 2 +- .../pcre2/src/sljit/sljitNativeMIPS_common.c | 16 +- .../pcre2/src/sljit/sljitNativePPC_32.c | 26 +- .../pcre2/src/sljit/sljitNativePPC_64.c | 32 +- .../pcre2/src/sljit/sljitNativePPC_common.c | 93 +- .../pcre2/src/sljit/sljitNativeS390X.c | 1838 +- .../pcre2/src/sljit/sljitNativeSPARC_32.c | 3 + .../pcre2/src/sljit/sljitNativeSPARC_common.c | 18 +- .../pcre2/src/sljit/sljitNativeX86_common.c | 2 - src/3rdparty/pcre2/src/sljit/sljitUtils.c | 10 +- .../pcre2/src/sljit/sljitWXExecAllocator.c | 8 +- .../qtproject/qt5/android/CursorHandle.java | 12 +- .../qtproject/qt5/android/ExtractStyle.java | 2280 +- .../qt5/android/QtActivityDelegate.java | 28 +- .../qt5/android/QtInputConnection.java | 23 + .../org/qtproject/qt5/android/QtLayout.java | 32 +- .../org/qtproject/qt5/android/QtNative.java | 52 +- .../qt5/android/QtServiceDelegate.java | 2 +- .../org/qtproject/qt5/android/QtSurface.java | 5 + .../qt5/android/bindings/QtActivity.java | 9 + .../qt5/android/bindings/QtApplication.java | 4 +- .../qt5/android/bindings/QtService.java | 13 + src/android/templates/AndroidManifest.xml | 4 +- src/android/templates/build.gradle | 2 +- src/concurrent/qtconcurrentfilter.h | 32 +- src/concurrent/qtconcurrentmap.h | 34 +- src/concurrent/qtconcurrentthreadengine.cpp | 33 - src/concurrent/qtconcurrentthreadengine.h | 23 - src/corelib/Qt5AndroidSupport.cmake | 40 +- src/corelib/Qt5CoreMacros.cmake | 3 + src/corelib/codecs/qicucodec.cpp | 38 +- src/corelib/configure.json | 3 +- .../doc/snippets/code/doc_src_qset.cpp | 20 - .../code/src_corelib_global_qrandom.cpp | 2 +- .../doc/snippets/code/src_corelib_io_qdir.cpp | 13 + .../code/src_corelib_io_qfileinfo.cpp | 17 +- .../code/src_corelib_tools_qlistdata.cpp | 40 +- .../doc/src/includes/qfile-copy.qdocinc | 11 + src/corelib/global/qcompilerdetection.h | 1 + src/corelib/global/qfloat16_f16c.c | 11 +- src/corelib/global/qglobal.cpp | 20 +- src/corelib/global/qglobal.h | 24 +- src/corelib/global/qglobalstatic.h | 4 +- src/corelib/global/qlibraryinfo.cpp | 4 +- src/corelib/global/qnamespace.qdoc | 31 +- src/corelib/io/qabstractfileengine.cpp | 8 +- src/corelib/io/qdir.cpp | 2 + src/corelib/io/qfile.cpp | 16 +- src/corelib/io/qfilesystemengine_unix.cpp | 2 +- src/corelib/io/qsettings_mac.cpp | 10 +- src/corelib/io/qt_attribution.json | 2 +- src/corelib/io/qurl.cpp | 26 +- src/corelib/io/qurltlds_p.h | 28898 ++++++++-------- .../qconcatenatetablesproxymodel.cpp | 7 +- .../itemmodels/qsortfilterproxymodel.cpp | 59 +- src/corelib/kernel/qcfsocketnotifier.cpp | 14 +- src/corelib/kernel/qcore_mac.mm | 14 +- src/corelib/kernel/qcore_mac_p.h | 1 + src/corelib/kernel/qeventdispatcher_win.cpp | 42 +- src/corelib/kernel/qeventdispatcher_win_p.h | 3 +- src/corelib/kernel/qeventloop.cpp | 6 + src/corelib/kernel/qfunctions_winrt.h | 27 +- src/corelib/kernel/qmetaobject.cpp | 35 +- src/corelib/kernel/qobject.cpp | 81 +- src/corelib/kernel/qobject_p.h | 28 +- src/corelib/kernel/qsystemsemaphore_posix.cpp | 2 +- src/corelib/kernel/qtranslator.cpp | 11 +- src/corelib/mimetypes/qmimeglobpattern.cpp | 108 +- src/corelib/mimetypes/qmimeglobpattern_p.h | 19 +- src/corelib/mimetypes/qmimeprovider.cpp | 1 - src/corelib/plugin/qlibrary.cpp | 5 + src/corelib/serialization/qxmlstream.cpp | 5 + src/corelib/statemachine/qstatemachine.cpp | 5 +- src/corelib/text/qchar.cpp | 24 +- src/corelib/text/qcollator.cpp | 10 +- src/corelib/text/qlocale.cpp | 25 +- src/corelib/text/qlocale.qdoc | 2 +- src/corelib/text/qlocale_data_p.h | 651 +- src/corelib/text/qlocale_p.h | 1 - src/corelib/text/qlocale_win.cpp | 33 +- src/corelib/text/qregularexpression.cpp | 8 +- src/corelib/text/qstring.cpp | 35 +- src/corelib/text/qstring.h | 16 +- src/corelib/text/qstringview.h | 3 +- src/corelib/text/qt_attribution.json | 2 +- src/corelib/text/qtextboundaryfinder.cpp | 12 +- src/corelib/text/qunicodetables.cpp | 12016 +++---- src/corelib/text/qunicodetables_p.h | 5 +- src/corelib/text/qunicodetools.cpp | 197 +- src/corelib/thread/qfutureinterface.h | 2 +- src/corelib/thread/qorderedmutexlocker_p.h | 41 + src/corelib/thread/qresultstore.cpp | 1 + src/corelib/thread/qresultstore.h | 7 + src/corelib/thread/qsemaphore.cpp | 46 +- src/corelib/thread/qthread_unix.cpp | 8 +- src/corelib/thread/qthreadpool.cpp | 6 + src/corelib/time/qcalendar.cpp | 2 +- src/corelib/time/qdatetime.cpp | 130 +- src/corelib/time/qdatetimeparser.cpp | 57 +- src/corelib/time/qhijricalendar_data_p.h | 6 +- src/corelib/time/qjalalicalendar_data_p.h | 6 +- src/corelib/time/qromancalendar_data_p.h | 2 +- src/corelib/time/qtimezoneprivate.cpp | 34 +- src/corelib/time/qtimezoneprivate_data_p.h | 1245 +- src/corelib/time/qtimezoneprivate_tz.cpp | 67 +- src/corelib/tools/qduplicatetracker_p.h | 13 +- src/corelib/tools/qlist.cpp | 68 +- src/corelib/tools/qoffsetstringarray_p.h | 1 + src/corelib/tools/qset.qdoc | 57 +- src/corelib/tools/qsharedpointer_impl.h | 8 +- src/corelib/tools/qsimd.cpp | 22 +- src/corelib/tools/qvarlengtharray.h | 21 +- src/corelib/tools/qvarlengtharray.qdoc | 5 + src/corelib/tools/qvector.h | 29 +- .../code/src_gui_painting_qtransform.cpp | 8 +- src/gui/doc/snippets/transform/main.cpp | 19 +- src/gui/image/qimage.cpp | 18 +- src/gui/image/qpixmap.cpp | 1 + src/gui/image/qpixmapcache.cpp | 5 + src/gui/image/qpnghandler.cpp | 6 +- src/gui/image/qppmhandler.cpp | 49 +- src/gui/image/qxpmhandler.cpp | 35 +- src/gui/kernel/qcursor.cpp | 3 +- src/gui/kernel/qguiapplication.cpp | 13 +- src/gui/kernel/qopenglcontext.cpp | 3 +- src/gui/kernel/qplatformwindow.cpp | 2 +- src/gui/kernel/qwindow.cpp | 21 +- src/gui/math3d/qquaternion.cpp | 6 +- src/gui/opengl/qopenglpaintdevice.cpp | 2 +- src/gui/opengl/qopenglprogrambinarycache.cpp | 61 +- src/gui/opengl/qopenglprogrambinarycache_p.h | 4 +- src/gui/opengl/qopengltextureblitter.cpp | 128 +- src/gui/painting/painting.pri | 2 +- src/gui/painting/qcolorspace.cpp | 15 +- src/gui/painting/qcolortransfertable_p.h | 8 +- src/gui/painting/qcolortrc_p.h | 2 +- src/gui/painting/qdrawhelper.cpp | 22 +- src/gui/painting/qicc.cpp | 31 +- src/gui/painting/qmemrotate.cpp | 42 +- src/gui/painting/qpagesize.h | 2 +- src/gui/painting/qpaintengine_raster.cpp | 14 +- src/gui/painting/qpaintengineex.cpp | 4 +- src/gui/painting/qpainter.cpp | 66 +- src/gui/painting/qpainterpath.cpp | 2 +- src/gui/painting/qpainterpath_p.h | 1 - src/gui/painting/qpdf.cpp | 35 +- src/gui/painting/qpdf_p.h | 1 + src/gui/painting/qstroker.cpp | 53 +- src/gui/painting/qstroker_p.h | 1 + src/gui/painting/qtransform.cpp | 21 + src/gui/painting/qtriangulatingstroker.cpp | 1 + src/gui/qtgui.tracepoints | 10 + src/gui/rhi/qrhimetal.mm | 42 +- src/gui/text/qcssparser.cpp | 4 +- src/gui/text/qfont.cpp | 12 +- src/gui/text/qfontdatabase.cpp | 90 +- src/gui/text/qfontdatabase.h | 2 +- src/gui/text/qfontmetrics.cpp | 18 +- src/gui/text/qrawfont.cpp | 2 +- src/gui/text/qtextdocument.cpp | 29 +- src/gui/text/qtextdocument_p.cpp | 5 +- src/gui/text/qtextdocument_p.h | 1 + src/gui/text/qtextdocumentfragment.cpp | 3 +- src/gui/text/qtextdocumentlayout.cpp | 19 +- src/gui/text/qtextdocumentwriter.cpp | 6 +- src/gui/text/qtextengine.cpp | 31 +- src/gui/text/qtexthtmlparser.cpp | 2 +- src/gui/text/qtextlayout.cpp | 3 +- src/gui/text/qtextodfwriter.cpp | 4 +- src/gui/util/qvalidator.cpp | 4 +- src/network/access/http2/http2frames.cpp | 5 +- src/network/access/http2/http2protocol_p.h | 3 - src/network/access/qhttp2protocolhandler.cpp | 111 +- src/network/access/qhttpnetworkconnection.cpp | 61 +- .../access/qhttpnetworkconnectionchannel.cpp | 24 +- src/network/access/qhttpnetworkrequest.cpp | 4 +- src/network/access/qhttpnetworkrequest_p.h | 1 + src/network/access/qnetworkaccessmanager.cpp | 2 - src/network/access/qnetworkdiskcache.cpp | 17 +- src/network/access/qnetworkreplywasmimpl.cpp | 86 +- src/network/access/qnetworkreplywasmimpl_p.h | 2 - src/network/access/qspdyprotocolhandler.cpp | 3 +- src/network/doc/src/qtnetwork.qdoc | 4 +- src/network/doc/src/ssl.qdoc | 4 +- src/network/kernel/qauthenticator.cpp | 23 +- src/network/socket/qhttpsocketengine.cpp | 2 +- src/network/socket/qlocalsocket.h | 5 +- src/network/socket/qlocalsocket_win.cpp | 7 +- src/network/ssl/qasn1element.cpp | 5 +- src/network/ssl/qsslcertificate_openssl.cpp | 88 +- src/network/ssl/qsslkey_openssl.cpp | 5 +- src/network/ssl/qsslsocket_openssl.cpp | 58 +- src/network/ssl/qsslsocket_openssl_p.h | 7 + .../ssl/qsslsocket_openssl_symbols.cpp | 38 +- .../ssl/qsslsocket_openssl_symbols_p.h | 17 +- src/opengl/opengl.pro | 3 - src/opengl/qgl.cpp | 3 +- src/opengl/qtopengl.tracepoints | 3 - .../fontconfig/qfontconfigdatabase.cpp | 5 + .../fontconfig/qfontconfigdatabase_p.h | 1 + .../fontdatabases/freetype/qfontengine_ft.cpp | 11 +- .../freetype/qfreetypefontdatabase.cpp | 32 +- .../fontdatabases/mac/qfontengine_coretext.mm | 4 +- .../windows/qwindowsfontdatabase.cpp | 5 +- .../windows/qwindowsfontenginedirectwrite.cpp | 3 +- .../evdevkeyboard/qevdevkeyboardhandler.cpp | 6 +- .../evdevkeyboard/qevdevkeyboardhandler_p.h | 1 + .../input/evdevtouch/qevdevtouchhandler.cpp | 2 +- .../input/libinput/qlibinputtouch.cpp | 2 +- .../input/xkbcommon/qxkbcommon.cpp | 6 +- .../linuxaccessibility/application.cpp | 17 +- .../linuxaccessibility/application_p.h | 1 - .../compose/qcomposeplatforminputcontext.cpp | 14 +- .../platforms/android/androidjniinput.cpp | 9 +- .../platforms/android/androidjnimain.cpp | 31 +- .../platforms/android/androidjnimain.h | 1 + .../platforms/android/extract-dummy.cpp | 5 - src/plugins/platforms/android/extract.cpp | 15 +- .../android/qandroidinputcontext.cpp | 48 +- .../qandroidplatformfiledialoghelper.cpp | 28 +- .../qandroidplatformfiledialoghelper.h | 2 +- .../android/qandroidplatformintegration.cpp | 5 + .../android/qandroidplatformscreen.cpp | 72 +- .../android/qandroidplatformscreen.h | 8 +- .../cocoa/qcocoaaccessibilityelement.mm | 2 +- .../cocoa/qcocoacolordialoghelper.mm | 9 +- .../platforms/cocoa/qcocoafontdialoghelper.mm | 8 +- src/plugins/platforms/cocoa/qcocoamenu.mm | 30 +- src/plugins/platforms/cocoa/qcocoamenuitem.h | 1 + src/plugins/platforms/cocoa/qcocoamenuitem.mm | 3 +- src/plugins/platforms/cocoa/qcocoascreen.h | 5 +- src/plugins/platforms/cocoa/qcocoascreen.mm | 115 +- src/plugins/platforms/cocoa/qcocoawindow.h | 2 + src/plugins/platforms/cocoa/qcocoawindow.mm | 57 +- .../cocoa/qiosurfacegraphicsbuffer.h | 2 + src/plugins/platforms/cocoa/qnsview.h | 1 + .../platforms/cocoa/qnsview_dragging.mm | 4 +- src/plugins/platforms/cocoa/qnsview_menus.mm | 9 +- src/plugins/platforms/cocoa/qnsview_mouse.mm | 94 +- src/plugins/platforms/cocoa/qnswindow.mm | 41 +- .../qeglfskmsegldevice.cpp | 7 +- src/plugins/platforms/ios/qiosinputcontext.mm | 3 +- .../platforms/ios/qiostextresponder.mm | 19 +- .../platforms/ios/qiosviewcontroller.mm | 14 +- src/plugins/platforms/ios/qioswindow.mm | 1 + .../platforms/ios/quiaccessibilityelement.mm | 13 +- src/plugins/platforms/ios/quiview.mm | 16 +- .../platforms/ios/quiview_accessibility.mm | 5 + src/plugins/platforms/vnc/qvnc.cpp | 5 +- .../platforms/wasm/qwasmcompositor.cpp | 6 +- src/plugins/platforms/wasm/qwasmcursor.cpp | 16 +- .../platforms/wasm/qwasmeventtranslator.cpp | 159 +- .../platforms/wasm/qwasmeventtranslator.h | 7 +- .../platforms/wasm/qwasmopenglcontext.cpp | 16 +- src/plugins/platforms/wasm/qwasmscreen.cpp | 5 +- src/plugins/platforms/wasm/qwasmwindow.cpp | 14 +- src/plugins/platforms/wasm/qwasmwindow.h | 1 + .../platforms/windows/qwindowscontext.cpp | 9 +- .../platforms/windows/qwindowscontext.h | 3 + .../platforms/windows/qwindowscursor.cpp | 5 + .../windows/qwindowsmousehandler.cpp | 9 +- .../windows/qwindowspointerhandler.cpp | 50 +- .../windows/qwindowspointerhandler.h | 3 +- .../platforms/windows/qwindowswindow.cpp | 10 +- .../platforms/windows/qwindowswindow.h | 3 +- .../uiautomation/qwindowsuiamainprovider.cpp | 13 +- .../windows/uiautomation/qwindowsuiautils.cpp | 17 +- src/plugins/platforms/xcb/qxcbclipboard.cpp | 19 +- src/plugins/platforms/xcb/qxcbconnection.cpp | 55 +- .../platforms/xcb/qxcbconnection_basic.cpp | 8 +- src/plugins/platforms/xcb/qxcbcursor.cpp | 11 +- src/plugins/platforms/xcb/qxcbkeyboard.cpp | 24 +- src/plugins/platforms/xcb/qxcbkeyboard.h | 1 + src/plugins/platforms/xcb/qxcbscreen.cpp | 23 +- src/plugins/platforms/xcb/qxcbscreen.h | 2 + src/plugins/platforms/xcb/qxcbwindow.cpp | 166 +- src/plugins/platforms/xcb/qxcbwindow.h | 16 + .../qxdgdesktopportalfiledialog.cpp | 2 +- src/plugins/sqldrivers/oci/qsql_oci.cpp | 31 +- src/plugins/sqldrivers/sqlite/qsql_sqlite.cpp | 35 +- src/plugins/styles/mac/qmacstyle_mac.mm | 87 +- .../styles/windowsvista/qwindowsxpstyle.cpp | 4 +- .../dialogs/qpagesetupdialog_win.cpp | 31 +- .../dialogs/qprintdialog_unix.cpp | 2 + src/sql/models/qsqltablemodel.cpp | 3 +- src/testlib/doc/src/qttestlib-manual.qdoc | 6 + src/testlib/qabstractitemmodeltester.cpp | 8 +- src/testlib/qtestcase.cpp | 15 +- src/testlib/qtestcase.h | 6 +- src/testlib/qtestcase.qdoc | 27 +- src/testlib/qtestlog.cpp | 4 +- src/tools/androiddeployqt/main.cpp | 99 +- src/tools/moc/moc.cpp | 30 +- src/tools/uic/python/pythonwriteimports.cpp | 6 +- src/widgets/dialogs/qfilesystemmodel.cpp | 10 +- src/widgets/dialogs/qfontdialog.cpp | 8 + src/widgets/dialogs/qmessagebox.cpp | 2 +- src/widgets/doc/src/guibooks.qdoc | 13 - .../src/widgets-and-layouts/stylesheet.qdoc | 10 +- src/widgets/graphicsview/qgraphicsitem.cpp | 23 +- .../graphicsview/qgraphicsproxywidget.cpp | 8 + .../itemviews/qabstractitemdelegate.cpp | 6 +- src/widgets/itemviews/qabstractitemview.cpp | 8 +- src/widgets/itemviews/qabstractitemview_p.h | 1 + src/widgets/itemviews/qlistview.cpp | 4 + src/widgets/itemviews/qtreeview.cpp | 19 +- src/widgets/itemviews/qtreewidget.cpp | 21 +- src/widgets/kernel/qaction.cpp | 6 +- src/widgets/kernel/qapplication.cpp | 5 +- src/widgets/kernel/qlayout.cpp | 5 + src/widgets/kernel/qsizepolicy.h | 5 +- src/widgets/kernel/qwidget.cpp | 29 +- src/widgets/kernel/qwidgetrepaintmanager.cpp | 15 +- src/widgets/styles/qstylesheetstyle.cpp | 56 +- src/widgets/util/qcompleter.cpp | 15 +- src/widgets/widgets/qabstractscrollarea.cpp | 4 +- src/widgets/widgets/qcombobox.cpp | 43 +- src/widgets/widgets/qcombobox_p.h | 1 + src/widgets/widgets/qdatetimeedit_p.h | 2 +- src/widgets/widgets/qdockwidget.cpp | 27 +- src/widgets/widgets/qfontcombobox.cpp | 4 + src/widgets/widgets/qlineedit.cpp | 6 +- src/widgets/widgets/qlineedit_p.cpp | 2 +- .../widgets/qmaccocoaviewcontainer_mac.mm | 1 + src/widgets/widgets/qmacnativewidget_mac.mm | 1 + src/widgets/widgets/qmdisubwindow.cpp | 35 +- src/widgets/widgets/qmdisubwindow_p.h | 1 + src/widgets/widgets/qplaintextedit.cpp | 2 +- src/widgets/widgets/qscrollarea.cpp | 18 +- src/widgets/widgets/qtabbar.cpp | 13 +- src/widgets/widgets/qwidgettextcontrol.cpp | 5 +- .../tst_qtconcurrentiteratekernel.cpp | 22 +- .../tst_qtconcurrentthreadengine.cpp | 122 +- tests/auto/corelib/codecs/qtextcodec/test.pro | 2 +- .../codecs/qtextcodec/tst_qtextcodec.cpp | 69 + .../auto/corelib/io/qprocess/tst_qprocess.cpp | 11 +- .../corelib/io/qsettings/tst_qsettings.cpp | 4 + tests/auto/corelib/io/qurl/tst_qurl.cpp | 4 + .../tst_qconcatenatetablesproxymodel.cpp | 25 + .../tst_qsortfilterproxymodel.cpp | 34 + .../tst_qsortfilterproxymodel.h | 1 + .../qeventdispatcher/tst_qeventdispatcher.cpp | 27 + tests/auto/corelib/kernel/qtimer/BLACKLIST | 3 + .../auto/corelib/kernel/qtimer/tst_qtimer.cpp | 57 +- .../kernel/qtranslator/android_testdata.qrc | 8 - .../kernel/qtranslator/qtranslator.qrc | 2 + .../kernel/qtranslator/tst_qtranslator.cpp | 115 +- .../corelib/plugin/qplugin/tst_qplugin.cpp | 3 + .../qpluginloader/machtest/machtest.pro | 10 +- .../qpluginloader/machtest/machtest_arm64.pro | 3 + .../qpluginloader/machtest/machtest_fat.pro | 41 +- .../qpluginloader/machtest/machtest_i386.pro | 3 - .../qpluginloader/machtest/machtest_ppc64.pro | 9 - .../qpluginloader/tst_qpluginloader.cpp | 15 +- tests/auto/corelib/text/qchar/tst_qchar.cpp | 19 + .../auto/corelib/text/qlocale/tst_qlocale.cpp | 45 +- .../tst_qregularexpression.cpp | 26 + .../auto/corelib/text/qstring/tst_qstring.cpp | 32 +- .../data/GraphemeBreakTest.txt | 8 +- .../data/GraphemeBreakTest.txt.full | 630 - .../tst_qtextboundaryfinder.cpp | 101 + .../corelib/thread/qfuture/tst_qfuture.cpp | 79 + .../thread/qresultstore/tst_qresultstore.cpp | 16 + .../corelib/thread/qthread/tst_qthread.cpp | 95 +- .../thread/qthreadpool/tst_qthreadpool.cpp | 27 +- tests/auto/corelib/time/qdate/tst_qdate.cpp | 23 +- .../corelib/time/qdatetime/tst_qdatetime.cpp | 91 +- .../corelib/time/qtimezone/tst_qtimezone.cpp | 16 + .../tst_containerapisymmetry.cpp | 52 + .../qhashfunctions/tst_qhashfunctions.cpp | 36 +- tests/auto/corelib/tools/qtimeline/BLACKLIST | 2 +- .../qvarlengtharray/tst_qvarlengtharray.cpp | 66 + .../corelib/tools/qvector/tst_qvector.cpp | 108 + tests/auto/gui/image/qimage/tst_qimage.cpp | 89 +- tests/auto/gui/image/qpixmap/tst_qpixmap.cpp | 14 + .../math3d/qquaternion/tst_qquaternion.cpp | 36 +- .../painting/qcolorspace/tst_qcolorspace.cpp | 119 + .../gui/painting/qpainter/tst_qpainter.cpp | 31 + .../qpainterpath/tst_qpainterpath.cpp | 12 +- .../text/qfontdatabase/tst_qfontdatabase.cpp | 10 +- tests/auto/gui/text/qrawfont/tst_qrawfont.cpp | 27 +- .../text/qtextdocument/tst_qtextdocument.cpp | 118 + tests/auto/gui/text/qtextlayout/BLACKLIST | 3 + .../gui/text/qtextlayout/tst_qtextlayout.cpp | 73 +- .../gui/text/qtexttable/tst_qtexttable.cpp | 89 +- tests/auto/network/access/http2/http2srv.cpp | 32 +- tests/auto/network/access/http2/http2srv.h | 8 + tests/auto/network/access/http2/tst_http2.cpp | 191 +- .../access/qdecompresshelper/BLACKLIST | 2 + .../tst_qnetworkdiskcache.cpp | 48 +- .../network/access/qnetworkreply/BLACKLIST | 5 +- .../certs/qt-test-server-cacert.pem | 30 +- .../qauthenticator/tst_qauthenticator.cpp | 30 + .../socket/qsocks5socketengine/BLACKLIST | 3 + .../auto/network/socket/qtcpserver/BLACKLIST | 3 + .../auto/network/socket/qtcpsocket/BLACKLIST | 2 + .../auto/network/socket/qudpsocket/BLACKLIST | 4 + .../ssl/qdtlscookie/tst_qdtlscookie.cpp | 2 +- .../qsslcertificate/tst_qsslcertificate.cpp | 1 + .../ssl/qsslcertificate/verify-certs/README | 7 + .../qsslcertificate/verify-certs/cacert.pem | 44 +- .../test-intermediate-ca-cert.pem | 88 +- .../test-intermediate-is-ca-cert.pem | 74 +- .../test-intermediate-not-ca-cert.pem | 74 +- .../verify-certs/test-ocsp-good-cert.pem | 87 +- .../certs/qt-test-server-cacert.pem | 30 +- .../network/ssl/qsslsocket/tst_qsslsocket.cpp | 3 + tests/auto/opengl/qgl/BLACKLIST | 4 + tests/auto/opengl/qgl/tst_qgl.cpp | 5 + tests/auto/other/gestures/BLACKLIST | 5 + tests/auto/other/lancelot/paintcommands.cpp | 25 +- tests/auto/other/lancelot/paintcommands.h | 1 + .../auto/other/lancelot/scripts/cosmetic.qps | 55 + .../other/lancelot/scripts/linedashes2.qps | 48 +- .../other/lancelot/scripts/tinydashes.qps | 34 + tests/auto/other/lancelot/tst_lancelot.cpp | 49 +- tests/auto/other/qaccessibilitymac/BLACKLIST | 4 + .../tst_qaccessibilitymac_helpers.mm | 21 +- .../qsqltablemodel/tst_qsqltablemodel.cpp | 96 +- .../tst_qabstractitemmodeltester.cpp | 13 + .../tst_verifyexceptionthrown.cpp | 8 +- tests/auto/tools/moc/allmocs_baseline_in.json | 73 + tests/auto/tools/moc/cxx11-trailing-return.h | 68 + tests/auto/tools/moc/moc.pro | 1 + tests/auto/tools/moc/tst_moc.cpp | 38 + tests/auto/tools/uic/baseline/config.ui.py | 6 +- .../qfilesystemmodel/tst_qfilesystemmodel.cpp | 15 + .../qgraphicsview/tst_qgraphicsview.cpp | 55 + .../tst_qabstractitemview.cpp | 134 + .../itemviews/qlistview/tst_qlistview.cpp | 76 +- .../itemviews/qtreeview/tst_qtreeview.cpp | 24 + .../itemviews/qtreewidget/tst_qtreewidget.cpp | 16 + .../kernel/qapplication/tst_qapplication.cpp | 9 +- .../kernel/qgesturerecognizer/BLACKLIST | 3 + .../widgets/kernel/qlayout/tst_qlayout.cpp | 24 + tests/auto/widgets/kernel/qwidget/BLACKLIST | 4 + .../widgets/kernel/qwidget/tst_qwidget.cpp | 226 + .../widgets/kernel/qwidget_window/BLACKLIST | 4 + .../qwidget_window/tst_qwidget_window.cpp | 1 + .../util/qcompleter/tst_qcompleter.cpp | 23 +- .../tst_qabstractscrollarea.cpp | 39 + .../widgets/qcombobox/tst_qcombobox.cpp | 46 + .../qdatetimeedit/tst_qdatetimeedit.cpp | 28 +- .../qfontcombobox/tst_qfontcombobox.cpp | 13 +- .../widgets/widgets/qmdiarea/tst_qmdiarea.cpp | 43 +- .../auto/widgets/widgets/qmenu/tst_qmenu.cpp | 2 + .../widgets/qpushbutton/tst_qpushbutton.cpp | 18 + .../widgets/qscrollarea/tst_qscrollarea.cpp | 58 + .../widgets/widgets/qtabbar/tst_qtabbar.cpp | 69 + .../corelib/io/qdiriterator/main.cpp | 29 +- tests/benchmarks/corelib/io/qfile/main.cpp | 317 +- .../testProcessLoopback.pro | 1 - .../io/qprocess/tst_bench_qprocess.cpp | 10 +- .../corelib/kernel/qmetaobject/main.cpp | 7 +- .../dbus/qdbusperformance/test/test.pro | 1 + .../qdbusperformance/tst_qdbusperformance.cpp | 4 +- .../kernel/qguimetatype/tst_qguimetatype.cpp | 35 +- .../sql/kernel/qsqlrecord/tst_qsqlrecord.cpp | 11 +- .../benchapps/chipTest/chip.debug | Bin 863805 -> 0 bytes .../testdata/www/htdocs/protected/rfc3252.txt | 899 - util/unicode/README | 4 +- util/unicode/data/emoji-data.txt | 1261 + util/unicode/main.cpp | 71 +- 2054 files changed, 50053 insertions(+), 61043 deletions(-) delete mode 100644 .QT-FOR-APPLICATION-DEVELOPMENT-LICENSE-AGREEMENT delete mode 100644 .QT-FOR-AUTOMATION-LICENSE-AGREEMENT delete mode 100644 .QT-FOR-AUTOMOTIVE-LICENSE-AGREEMENT delete mode 100644 .QT-FOR-DEVICE-CREATION-LICENSE-AGREEMENT rename include/QtAccessibilitySupport/{5.15.3 => 5.15.8}/QtAccessibilitySupport/private/qaccessiblebridgeutils_p.h (100%) rename include/QtClipboardSupport/{5.15.3 => 5.15.8}/QtClipboardSupport/private/qmacmime_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/cp949codetbl_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/minimum-linux_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qabstractanimation_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qabstracteventdispatcher_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qabstractfileengine_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qabstractitemmodel_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qabstractproxymodel_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qabstractstate_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qabstracttransition_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qanimationgroup_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qbig5codec_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qbinaryjson_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qbinaryjsonarray_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qbinaryjsonobject_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qbinaryjsonvalue_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qbytearray_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qbytedata_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qcalendarbackend_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qcalendarmath_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qcborcommon_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qcborvalue_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qcfsocketnotifier_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qcollator_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qcore_mac_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qcore_unix_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qcoreapplication_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qcorecmdlineargs_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qcoreglobaldata_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qdatastream_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qdataurl_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qdatetime_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qdatetimeparser_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qdeadlinetimer_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qdebug_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qdir_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qdoublescanprint_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qduplicatetracker_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qelfparser_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qendian_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qeucjpcodec_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qeuckrcodec_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qeventdispatcher_cf_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qeventdispatcher_glib_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qeventdispatcher_unix_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qeventdispatcher_win_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qeventdispatcher_winrt_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qeventloop_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qeventtransition_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qfactoryloader_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qfile_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qfiledevice_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qfileinfo_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qfileselector_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qfilesystemengine_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qfilesystementry_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qfilesystemiterator_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qfilesystemmetadata_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qfilesystemwatcher_fsevents_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qfilesystemwatcher_inotify_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qfilesystemwatcher_kqueue_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qfilesystemwatcher_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qfilesystemwatcher_polling_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qfilesystemwatcher_win_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qfinalstate_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qfreelist_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qfsfileengine_iterator_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qfsfileengine_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qfunctions_fake_env_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qfunctions_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qfutex_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qfutureinterface_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qfuturewatcher_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qgb18030codec_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qglobal_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qgregoriancalendar_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qharfbuzz_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qhijricalendar_data_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qhijricalendar_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qhistorystate_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qhooks_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qiconvcodec_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qicucodec_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qiodevice_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qipaddress_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qisciicodec_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qislamiccivilcalendar_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qitemselectionmodel_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qjalalicalendar_data_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qjalalicalendar_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qjiscodec_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qjni_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qjnihelpers_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qjpunicode_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qjson_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qjsonparser_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qjsonwriter_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qjuliancalendar_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qlatincodec_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qlibrary_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qlocale_data_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qlocale_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qlocale_tools_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qlockfile_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qlocking_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qlogging_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qloggingregistry_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qmachparser_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qmakearray_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qmemory_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qmetaobject_moc_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qmetaobject_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qmetaobjectbuilder_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qmetatype_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qmetatypeswitcher_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qmilankoviccalendar_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qmimedatabase_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qmimeglobpattern_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qmimemagicrule_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qmimemagicrulematcher_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qmimeprovider_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qmimetype_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qmimetypeparser_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qmutex_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qnoncontiguousbytedevice_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qnumeric_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qobject_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qoffsetstringarray_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qoperatingsystemversion_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qoperatingsystemversion_win_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qorderedmutexlocker_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qparallelanimationgroup_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qplugin_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qpoll_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qppsattribute_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qppsattributeprivate_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qppsobject_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qppsobjectprivate_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qprocess_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qpropertyanimation_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qrandom_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qreadwritelock_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qresource_iterator_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qresource_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qringbuffer_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qromancalendar_data_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qromancalendar_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qsavefile_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qscopedpointer_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qsequentialanimationgroup_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qsettings_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qsharedmemory_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qsignaleventgenerator_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qsignaltransition_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qsimd_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qsimd_x86_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qsimplecodec_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qsjiscodec_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qstate_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qstatemachine_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qstdweb_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qstorageinfo_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qstringalgorithms_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qstringiterator_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qsystemerror_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qsystemlibrary_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qsystemsemaphore_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qt_pch.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qtemporaryfile_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qtextcodec_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qtextstream_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qthread_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qthreadpool_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qtimerinfo_unix_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qtimezoneprivate_data_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qtimezoneprivate_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qtldurl_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qtools_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qtrace_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qtranslator_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qtransposeproxymodel_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qtsciicodec_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qunicodetables_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qunicodetools_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qurl_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qurltlds_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qutfcodec_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qvariant_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qvariantanimation_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qwaitcondition_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qwindowscodec_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qwindowspipereader_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qwindowspipewriter_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qwineventnotifier_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qwinregistry_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qxmlstream_p.h (100%) rename include/QtCore/{5.15.3 => 5.15.8}/QtCore/private/qxmlutils_p.h (100%) rename include/QtDBus/{5.15.3 => 5.15.8}/QtDBus/private/dbus_minimal_p.h (100%) rename include/QtDBus/{5.15.3 => 5.15.8}/QtDBus/private/qdbus_symbols_p.h (100%) rename include/QtDBus/{5.15.3 => 5.15.8}/QtDBus/private/qdbusabstractadaptor_p.h (100%) rename include/QtDBus/{5.15.3 => 5.15.8}/QtDBus/private/qdbusabstractinterface_p.h (100%) rename include/QtDBus/{5.15.3 => 5.15.8}/QtDBus/private/qdbusargument_p.h (100%) rename include/QtDBus/{5.15.3 => 5.15.8}/QtDBus/private/qdbusconnection_p.h (100%) rename include/QtDBus/{5.15.3 => 5.15.8}/QtDBus/private/qdbusconnectionmanager_p.h (100%) rename include/QtDBus/{5.15.3 => 5.15.8}/QtDBus/private/qdbuscontext_p.h (100%) rename include/QtDBus/{5.15.3 => 5.15.8}/QtDBus/private/qdbusintegrator_p.h (100%) rename include/QtDBus/{5.15.3 => 5.15.8}/QtDBus/private/qdbusinterface_p.h (100%) rename include/QtDBus/{5.15.3 => 5.15.8}/QtDBus/private/qdbusintrospection_p.h (100%) rename include/QtDBus/{5.15.3 => 5.15.8}/QtDBus/private/qdbusmessage_p.h (100%) rename include/QtDBus/{5.15.3 => 5.15.8}/QtDBus/private/qdbusmetaobject_p.h (100%) rename include/QtDBus/{5.15.3 => 5.15.8}/QtDBus/private/qdbusmetatype_p.h (100%) rename include/QtDBus/{5.15.3 => 5.15.8}/QtDBus/private/qdbuspendingcall_p.h (100%) rename include/QtDBus/{5.15.3 => 5.15.8}/QtDBus/private/qdbusthreaddebug_p.h (100%) rename include/QtDBus/{5.15.3 => 5.15.8}/QtDBus/private/qdbusutil_p.h (100%) rename include/QtDBus/{5.15.3 => 5.15.8}/QtDBus/private/qdbusxmlparser_p.h (100%) rename include/QtDBus/{5.15.3 => 5.15.8}/QtDBus/private/qtdbusglobal_p.h (100%) rename include/QtDeviceDiscoverySupport/{5.15.3 => 5.15.8}/QtDeviceDiscoverySupport/private/qdevicediscovery_dummy_p.h (100%) rename include/QtDeviceDiscoverySupport/{5.15.3 => 5.15.8}/QtDeviceDiscoverySupport/private/qdevicediscovery_p.h (100%) rename include/QtDeviceDiscoverySupport/{5.15.3 => 5.15.8}/QtDeviceDiscoverySupport/private/qdevicediscovery_static_p.h (100%) rename include/QtDeviceDiscoverySupport/{5.15.3 => 5.15.8}/QtDeviceDiscoverySupport/private/qdevicediscovery_udev_p.h (100%) rename include/QtEdidSupport/{5.15.3 => 5.15.8}/QtEdidSupport/private/qedidparser_p.h (100%) rename include/QtEdidSupport/{5.15.3 => 5.15.8}/QtEdidSupport/private/qedidvendortable_p.h (100%) rename include/QtEglFSDeviceIntegration/{5.15.3 => 5.15.8}/QtEglFSDeviceIntegration/private/qeglfscontext_p.h (100%) rename include/QtEglFSDeviceIntegration/{5.15.3 => 5.15.8}/QtEglFSDeviceIntegration/private/qeglfscursor_p.h (100%) rename include/QtEglFSDeviceIntegration/{5.15.3 => 5.15.8}/QtEglFSDeviceIntegration/private/qeglfsdeviceintegration_p.h (100%) rename include/QtEglFSDeviceIntegration/{5.15.3 => 5.15.8}/QtEglFSDeviceIntegration/private/qeglfsglobal_p.h (100%) rename include/QtEglFSDeviceIntegration/{5.15.3 => 5.15.8}/QtEglFSDeviceIntegration/private/qeglfshooks_p.h (100%) rename include/QtEglFSDeviceIntegration/{5.15.3 => 5.15.8}/QtEglFSDeviceIntegration/private/qeglfsintegration_p.h (100%) rename include/QtEglFSDeviceIntegration/{5.15.3 => 5.15.8}/QtEglFSDeviceIntegration/private/qeglfsoffscreenwindow_p.h (100%) rename include/QtEglFSDeviceIntegration/{5.15.3 => 5.15.8}/QtEglFSDeviceIntegration/private/qeglfsscreen_p.h (100%) rename include/QtEglFSDeviceIntegration/{5.15.3 => 5.15.8}/QtEglFSDeviceIntegration/private/qeglfsvulkaninstance_p.h (100%) rename include/QtEglFSDeviceIntegration/{5.15.3 => 5.15.8}/QtEglFSDeviceIntegration/private/qeglfsvulkanwindow_p.h (100%) rename include/QtEglFSDeviceIntegration/{5.15.3 => 5.15.8}/QtEglFSDeviceIntegration/private/qeglfswindow_p.h (100%) rename include/QtEglSupport/{5.15.3 => 5.15.8}/QtEglSupport/private/qeglconvenience_p.h (100%) rename include/QtEglSupport/{5.15.3 => 5.15.8}/QtEglSupport/private/qeglpbuffer_p.h (100%) rename include/QtEglSupport/{5.15.3 => 5.15.8}/QtEglSupport/private/qeglplatformcontext_p.h (100%) rename include/QtEglSupport/{5.15.3 => 5.15.8}/QtEglSupport/private/qeglstreamconvenience_p.h (100%) rename include/QtEglSupport/{5.15.3 => 5.15.8}/QtEglSupport/private/qt_egl_p.h (100%) rename include/QtEglSupport/{5.15.3 => 5.15.8}/QtEglSupport/private/qxlibeglintegration_p.h (100%) rename include/QtEventDispatcherSupport/{5.15.3 => 5.15.8}/QtEventDispatcherSupport/private/qeventdispatcher_glib_p.h (100%) rename include/QtEventDispatcherSupport/{5.15.3 => 5.15.8}/QtEventDispatcherSupport/private/qgenericunixeventdispatcher_p.h (100%) rename include/QtEventDispatcherSupport/{5.15.3 => 5.15.8}/QtEventDispatcherSupport/private/qunixeventdispatcher_qpa_p.h (100%) rename include/QtEventDispatcherSupport/{5.15.3 => 5.15.8}/QtEventDispatcherSupport/private/qwindowsguieventdispatcher_p.h (100%) rename include/QtFbSupport/{5.15.3 => 5.15.8}/QtFbSupport/private/qfbbackingstore_p.h (100%) rename include/QtFbSupport/{5.15.3 => 5.15.8}/QtFbSupport/private/qfbcursor_p.h (100%) rename include/QtFbSupport/{5.15.3 => 5.15.8}/QtFbSupport/private/qfbscreen_p.h (100%) rename include/QtFbSupport/{5.15.3 => 5.15.8}/QtFbSupport/private/qfbvthandler_p.h (100%) rename include/QtFbSupport/{5.15.3 => 5.15.8}/QtFbSupport/private/qfbwindow_p.h (100%) rename include/QtFontDatabaseSupport/{5.15.3 => 5.15.8}/QtFontDatabaseSupport/private/qcoretextfontdatabase_p.h (100%) rename include/QtFontDatabaseSupport/{5.15.3 => 5.15.8}/QtFontDatabaseSupport/private/qfontconfigdatabase_p.h (100%) rename include/QtFontDatabaseSupport/{5.15.3 => 5.15.8}/QtFontDatabaseSupport/private/qfontengine_coretext_p.h (100%) rename include/QtFontDatabaseSupport/{5.15.3 => 5.15.8}/QtFontDatabaseSupport/private/qfontengine_ft_p.h (100%) rename include/QtFontDatabaseSupport/{5.15.3 => 5.15.8}/QtFontDatabaseSupport/private/qfontenginemultifontconfig_p.h (100%) rename include/QtFontDatabaseSupport/{5.15.3 => 5.15.8}/QtFontDatabaseSupport/private/qfreetypefontdatabase_p.h (100%) rename include/QtFontDatabaseSupport/{5.15.3 => 5.15.8}/QtFontDatabaseSupport/private/qgenericunixfontdatabase_p.h (100%) rename include/QtFontDatabaseSupport/{5.15.3 => 5.15.8}/QtFontDatabaseSupport/private/qwindowsfontdatabase_ft_p.h (100%) rename include/QtFontDatabaseSupport/{5.15.3 => 5.15.8}/QtFontDatabaseSupport/private/qwindowsfontdatabase_p.h (100%) rename include/QtFontDatabaseSupport/{5.15.3 => 5.15.8}/QtFontDatabaseSupport/private/qwindowsfontengine_p.h (100%) rename include/QtFontDatabaseSupport/{5.15.3 => 5.15.8}/QtFontDatabaseSupport/private/qwindowsfontenginedirectwrite_p.h (100%) rename include/QtFontDatabaseSupport/{5.15.3 => 5.15.8}/QtFontDatabaseSupport/private/qwindowsnativeimage_p.h (100%) rename include/QtFontDatabaseSupport/{5.15.3 => 5.15.8}/QtFontDatabaseSupport/private/qwinrtfontdatabase_p.h (100%) rename include/QtGlxSupport/{5.15.3 => 5.15.8}/QtGlxSupport/private/qglxconvenience_p.h (100%) rename include/QtGraphicsSupport/{5.15.3 => 5.15.8}/QtGraphicsSupport/private/qrasterbackingstore_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/cs_tdr_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qabstractlayoutstyleinfo_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qabstracttextdocumentlayout_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qaccessiblecache_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qastchandler_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qbezier_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qblendfunctions_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qblittable_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qbmphandler_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qcolor_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qcolormatrix_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qcolorspace_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qcolortransferfunction_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qcolortransfertable_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qcolortransform_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qcolortrc_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qcolortrclut_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qcoregraphics_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qcosmeticstroker_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qcssparser_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qcssutil_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qcursor_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qdatabuffer_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qdistancefield_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qdnd_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qdrawhelper_mips_dsp_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qdrawhelper_neon_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qdrawhelper_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qdrawhelper_x86_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qdrawingprimitive_sse2_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qemulationpaintengine_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qevent_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qfixed_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qfont_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qfontengine_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qfontengine_qpf2_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qfontengineglyphcache_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qfontsubset_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qfragmentmap_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qglyphrun_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qgrayraster_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qgridlayoutengine_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qguiapplication_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qharfbuzzng_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qhexstring_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qhighdpiscaling_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qicc_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qicon_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qiconloader_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qimage_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qimagepixmapcleanuphooks_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qimagereaderwriterhelpers_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qimagescale_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qinputcontrol_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qinputdevicemanager_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qinputdevicemanager_p_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qinputmethod_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qinternalmimedata_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qkeymapper_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qkeysequence_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qktxhandler_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qlayoutpolicy_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qmath_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qmemrotate_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qopengl2pexvertexarray_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qopengl_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qopenglcontext_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qopenglcustomshaderstage_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qopenglengineshadermanager_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qopenglengineshadersource_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qopenglextensions_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qopenglframebufferobject_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qopenglgradientcache_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qopenglpaintdevice_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qopenglpaintengine_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qopenglprogrambinarycache_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qopenglqueryhelper_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qopenglshadercache_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qopengltexture_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qopengltexturecache_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qopengltextureglyphcache_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qopengltexturehelper_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qopengltextureuploader_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qopenglversionfunctionsfactory_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qopenglvertexarrayobject_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qoutlinemapper_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qpagedpaintdevice_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qpaintdevicewindow_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qpaintengine_blitter_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qpaintengine_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qpaintengine_pic_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qpaintengine_raster_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qpaintengineex_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qpainter_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qpainterpath_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qpathclipper_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qpathsimplifier_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qpdf_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qpen_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qpicture_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qpixmap_blitter_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qpixmap_raster_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qpixmapcache_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qpkmhandler_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qpnghandler_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qpolygonclipper_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qppmhandler_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qrasterdefs_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qrasterizer_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qrawfont_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qrbtree_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qrgba64_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qrhi_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qrhi_p_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qrhid3d11_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qrhid3d11_p_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qrhigles2_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qrhigles2_p_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qrhimetal_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qrhimetal_p_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qrhinull_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qrhinull_p_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qrhiprofiler_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qrhiprofiler_p_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qrhivulkan_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qrhivulkan_p_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qrhivulkanext_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qscreen_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qsessionmanager_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qshader_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qshader_p_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qshaderdescription_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qshaderdescription_p_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qshaderformat_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qshadergenerator_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qshadergraph_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qshadergraphloader_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qshaderlanguage_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qshadernode_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qshadernodeport_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qshadernodesloader_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qshapedpixmapdndwindow_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qshortcutmap_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qsimpledrag_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qstandarditemmodel_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qstatictext_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qstroker_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qt_gui_pch.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qt_mips_asm_dsp_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qtextcursor_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qtextdocument_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qtextdocumentfragment_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qtextdocumentlayout_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qtextengine_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qtextformat_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qtexthtmlparser_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qtextimagehandler_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qtextmarkdownimporter_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qtextmarkdownwriter_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qtextobject_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qtextodfwriter_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qtexttable_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qtexturefiledata_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qtexturefilehandler_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qtexturefilereader_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qtextureglyphcache_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qtguiglobal_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qtouchdevice_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qtriangulatingstroker_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qtriangulator_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qvectorpath_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qvulkanwindow_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qwasmlocalfileaccess_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qwindow_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qxbmhandler_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qxpmhandler_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qzipreader_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/private/qzipwriter_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/qpa/qplatformaccessibility.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/qpa/qplatformbackingstore.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/qpa/qplatformclipboard.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/qpa/qplatformcursor.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/qpa/qplatformdialoghelper.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/qpa/qplatformdrag.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/qpa/qplatformfontdatabase.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/qpa/qplatformgraphicsbuffer.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/qpa/qplatformgraphicsbufferhelper.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/qpa/qplatforminputcontext.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/qpa/qplatforminputcontext_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/qpa/qplatforminputcontextfactory_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/qpa/qplatforminputcontextplugin_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/qpa/qplatformintegration.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/qpa/qplatformintegrationfactory_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/qpa/qplatformintegrationplugin.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/qpa/qplatformmenu.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/qpa/qplatformnativeinterface.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/qpa/qplatformoffscreensurface.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/qpa/qplatformopenglcontext.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/qpa/qplatformpixmap.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/qpa/qplatformscreen.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/qpa/qplatformscreen_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/qpa/qplatformservices.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/qpa/qplatformsessionmanager.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/qpa/qplatformsharedgraphicscache.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/qpa/qplatformsurface.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/qpa/qplatformsystemtrayicon.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/qpa/qplatformtheme.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/qpa/qplatformtheme_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/qpa/qplatformthemefactory_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/qpa/qplatformthemeplugin.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/qpa/qplatformvulkaninstance.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/qpa/qplatformwindow.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/qpa/qplatformwindow_p.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/qpa/qwindowsysteminterface.h (100%) rename include/QtGui/{5.15.3 => 5.15.8}/QtGui/qpa/qwindowsysteminterface_p.h (100%) rename include/QtInputSupport/{5.15.3 => 5.15.8}/QtInputSupport/private/devicehandlerlist_p.h (100%) rename include/QtInputSupport/{5.15.3 => 5.15.8}/QtInputSupport/private/qevdevkeyboard_defaultmap_p.h (100%) rename include/QtInputSupport/{5.15.3 => 5.15.8}/QtInputSupport/private/qevdevkeyboardhandler_p.h (100%) rename include/QtInputSupport/{5.15.3 => 5.15.8}/QtInputSupport/private/qevdevkeyboardmanager_p.h (100%) rename include/QtInputSupport/{5.15.3 => 5.15.8}/QtInputSupport/private/qevdevmousehandler_p.h (100%) rename include/QtInputSupport/{5.15.3 => 5.15.8}/QtInputSupport/private/qevdevmousemanager_p.h (100%) rename include/QtInputSupport/{5.15.3 => 5.15.8}/QtInputSupport/private/qevdevtablethandler_p.h (100%) rename include/QtInputSupport/{5.15.3 => 5.15.8}/QtInputSupport/private/qevdevtabletmanager_p.h (100%) rename include/QtInputSupport/{5.15.3 => 5.15.8}/QtInputSupport/private/qevdevtouchfilter_p.h (100%) rename include/QtInputSupport/{5.15.3 => 5.15.8}/QtInputSupport/private/qevdevtouchhandler_p.h (100%) rename include/QtInputSupport/{5.15.3 => 5.15.8}/QtInputSupport/private/qevdevtouchmanager_p.h (100%) rename include/QtInputSupport/{5.15.3 => 5.15.8}/QtInputSupport/private/qevdevutil_p.h (100%) rename include/QtInputSupport/{5.15.3 => 5.15.8}/QtInputSupport/private/qlibinputhandler_p.h (100%) rename include/QtInputSupport/{5.15.3 => 5.15.8}/QtInputSupport/private/qlibinputkeyboard_p.h (100%) rename include/QtInputSupport/{5.15.3 => 5.15.8}/QtInputSupport/private/qlibinputpointer_p.h (100%) rename include/QtInputSupport/{5.15.3 => 5.15.8}/QtInputSupport/private/qlibinputtouch_p.h (100%) rename include/QtInputSupport/{5.15.3 => 5.15.8}/QtInputSupport/private/qtouchoutputmapping_p.h (100%) rename include/QtInputSupport/{5.15.3 => 5.15.8}/QtInputSupport/private/qtslib_p.h (100%) rename include/QtInputSupport/{5.15.3 => 5.15.8}/QtInputSupport/private/qxkbcommon_p.h (100%) rename include/QtKmsSupport/{5.15.3 => 5.15.8}/QtKmsSupport/private/qkmsdevice_p.h (100%) rename include/QtLinuxAccessibilitySupport/{5.15.3 => 5.15.8}/QtLinuxAccessibilitySupport/private/application_p.h (100%) rename include/QtLinuxAccessibilitySupport/{5.15.3 => 5.15.8}/QtLinuxAccessibilitySupport/private/atspiadaptor_p.h (100%) rename include/QtLinuxAccessibilitySupport/{5.15.3 => 5.15.8}/QtLinuxAccessibilitySupport/private/bridge_p.h (100%) rename include/QtLinuxAccessibilitySupport/{5.15.3 => 5.15.8}/QtLinuxAccessibilitySupport/private/cache_p.h (100%) rename include/QtLinuxAccessibilitySupport/{5.15.3 => 5.15.8}/QtLinuxAccessibilitySupport/private/constant_mappings_p.h (100%) rename include/QtLinuxAccessibilitySupport/{5.15.3 => 5.15.8}/QtLinuxAccessibilitySupport/private/dbusconnection_p.h (100%) rename include/QtLinuxAccessibilitySupport/{5.15.3 => 5.15.8}/QtLinuxAccessibilitySupport/private/struct_marshallers_p.h (100%) rename include/QtNetwork/{5.15.3 => 5.15.8}/QtNetwork/private/bitstreams_p.h (100%) rename include/QtNetwork/{5.15.3 => 5.15.8}/QtNetwork/private/hpack_p.h (100%) rename include/QtNetwork/{5.15.3 => 5.15.8}/QtNetwork/private/hpacktable_p.h (100%) rename include/QtNetwork/{5.15.3 => 5.15.8}/QtNetwork/private/http2frames_p.h (100%) rename include/QtNetwork/{5.15.3 => 5.15.8}/QtNetwork/private/http2protocol_p.h (100%) rename include/QtNetwork/{5.15.3 => 5.15.8}/QtNetwork/private/http2streams_p.h (100%) rename include/QtNetwork/{5.15.3 => 5.15.8}/QtNetwork/private/huffman_p.h (100%) rename include/QtNetwork/{5.15.3 => 5.15.8}/QtNetwork/private/qabstractnetworkcache_p.h (100%) rename include/QtNetwork/{5.15.3 => 5.15.8}/QtNetwork/private/qabstractprotocolhandler_p.h (100%) rename include/QtNetwork/{5.15.3 => 5.15.8}/QtNetwork/private/qabstractsocket_p.h (100%) rename include/QtNetwork/{5.15.3 => 5.15.8}/QtNetwork/private/qabstractsocketengine_p.h (100%) rename include/QtNetwork/{5.15.3 => 5.15.8}/QtNetwork/private/qasn1element_p.h (100%) rename include/QtNetwork/{5.15.3 => 5.15.8}/QtNetwork/private/qauthenticator_p.h (100%) rename include/QtNetwork/{5.15.3 => 5.15.8}/QtNetwork/private/qbearerengine_p.h (100%) rename include/QtNetwork/{5.15.3 => 5.15.8}/QtNetwork/private/qbearerplugin_p.h (100%) rename include/QtNetwork/{5.15.3 => 5.15.8}/QtNetwork/private/qdnslookup_p.h (100%) rename include/QtNetwork/{5.15.3 => 5.15.8}/QtNetwork/private/qdtls_openssl_p.h (100%) rename include/QtNetwork/{5.15.3 => 5.15.8}/QtNetwork/private/qdtls_p.h (100%) rename include/QtNetwork/{5.15.3 => 5.15.8}/QtNetwork/private/qftp_p.h (100%) rename include/QtNetwork/{5.15.3 => 5.15.8}/QtNetwork/private/qhostaddress_p.h (100%) rename include/QtNetwork/{5.15.3 => 5.15.8}/QtNetwork/private/qhostinfo_p.h (100%) rename include/QtNetwork/{5.15.3 => 5.15.8}/QtNetwork/private/qhsts_p.h (100%) rename include/QtNetwork/{5.15.3 => 5.15.8}/QtNetwork/private/qhstsstore_p.h (100%) rename include/QtNetwork/{5.15.3 => 5.15.8}/QtNetwork/private/qhttp2protocolhandler_p.h (100%) rename include/QtNetwork/{5.15.3 => 5.15.8}/QtNetwork/private/qhttpmultipart_p.h (100%) rename include/QtNetwork/{5.15.3 => 5.15.8}/QtNetwork/private/qhttpnetworkconnection_p.h (100%) rename include/QtNetwork/{5.15.3 => 5.15.8}/QtNetwork/private/qhttpnetworkconnectionchannel_p.h (100%) rename include/QtNetwork/{5.15.3 => 5.15.8}/QtNetwork/private/qhttpnetworkheader_p.h (100%) rename include/QtNetwork/{5.15.3 => 5.15.8}/QtNetwork/private/qhttpnetworkreply_p.h (100%) rename include/QtNetwork/{5.15.3 => 5.15.8}/QtNetwork/private/qhttpnetworkrequest_p.h (100%) rename include/QtNetwork/{5.15.3 => 5.15.8}/QtNetwork/private/qhttpprotocolhandler_p.h (100%) rename include/QtNetwork/{5.15.3 => 5.15.8}/QtNetwork/private/qhttpsocketengine_p.h (100%) rename include/QtNetwork/{5.15.3 => 5.15.8}/QtNetwork/private/qhttpthreaddelegate_p.h (100%) rename include/QtNetwork/{5.15.3 => 5.15.8}/QtNetwork/private/qlocalserver_p.h (100%) rename include/QtNetwork/{5.15.3 => 5.15.8}/QtNetwork/private/qlocalsocket_p.h (100%) rename include/QtNetwork/{5.15.3 => 5.15.8}/QtNetwork/private/qnativesocketengine_p.h (100%) rename include/QtNetwork/{5.15.3 => 5.15.8}/QtNetwork/private/qnativesocketengine_winrt_p.h (100%) rename include/QtNetwork/{5.15.3 => 5.15.8}/QtNetwork/private/qnet_unix_p.h (100%) rename include/QtNetwork/{5.15.3 => 5.15.8}/QtNetwork/private/qnetconmonitor_p.h (100%) rename include/QtNetwork/{5.15.3 => 5.15.8}/QtNetwork/private/qnetworkaccessauthenticationmanager_p.h (100%) rename include/QtNetwork/{5.15.3 => 5.15.8}/QtNetwork/private/qnetworkaccessbackend_p.h (100%) rename include/QtNetwork/{5.15.3 => 5.15.8}/QtNetwork/private/qnetworkaccesscache_p.h (100%) rename include/QtNetwork/{5.15.3 => 5.15.8}/QtNetwork/private/qnetworkaccesscachebackend_p.h (100%) rename include/QtNetwork/{5.15.3 => 5.15.8}/QtNetwork/private/qnetworkaccessdebugpipebackend_p.h (100%) rename include/QtNetwork/{5.15.3 => 5.15.8}/QtNetwork/private/qnetworkaccessfilebackend_p.h (100%) rename include/QtNetwork/{5.15.3 => 5.15.8}/QtNetwork/private/qnetworkaccessftpbackend_p.h (100%) rename include/QtNetwork/{5.15.3 => 5.15.8}/QtNetwork/private/qnetworkaccessmanager_p.h (100%) rename include/QtNetwork/{5.15.3 => 5.15.8}/QtNetwork/private/qnetworkconfigmanager_p.h (100%) rename include/QtNetwork/{5.15.3 => 5.15.8}/QtNetwork/private/qnetworkconfiguration_p.h (100%) rename include/QtNetwork/{5.15.3 => 5.15.8}/QtNetwork/private/qnetworkcookie_p.h (100%) rename include/QtNetwork/{5.15.3 => 5.15.8}/QtNetwork/private/qnetworkcookiejar_p.h (100%) rename include/QtNetwork/{5.15.3 => 5.15.8}/QtNetwork/private/qnetworkdatagram_p.h (100%) rename include/QtNetwork/{5.15.3 => 5.15.8}/QtNetwork/private/qnetworkdiskcache_p.h (100%) rename include/QtNetwork/{5.15.3 => 5.15.8}/QtNetwork/private/qnetworkfile_p.h (100%) rename include/QtNetwork/{5.15.3 => 5.15.8}/QtNetwork/private/qnetworkinterface_p.h (100%) rename include/QtNetwork/{5.15.3 => 5.15.8}/QtNetwork/private/qnetworkinterface_uikit_p.h (100%) rename include/QtNetwork/{5.15.3 => 5.15.8}/QtNetwork/private/qnetworkinterface_unix_p.h (100%) rename include/QtNetwork/{5.15.3 => 5.15.8}/QtNetwork/private/qnetworkreply_p.h (100%) rename include/QtNetwork/{5.15.3 => 5.15.8}/QtNetwork/private/qnetworkreplydataimpl_p.h (100%) rename include/QtNetwork/{5.15.3 => 5.15.8}/QtNetwork/private/qnetworkreplyfileimpl_p.h (100%) rename include/QtNetwork/{5.15.3 => 5.15.8}/QtNetwork/private/qnetworkreplyhttpimpl_p.h (100%) rename include/QtNetwork/{5.15.3 => 5.15.8}/QtNetwork/private/qnetworkreplyimpl_p.h (100%) rename include/QtNetwork/{5.15.3 => 5.15.8}/QtNetwork/private/qnetworkreplywasmimpl_p.h (100%) rename include/QtNetwork/{5.15.3 => 5.15.8}/QtNetwork/private/qnetworkrequest_p.h (100%) rename include/QtNetwork/{5.15.3 => 5.15.8}/QtNetwork/private/qnetworksession_p.h (100%) rename include/QtNetwork/{5.15.3 => 5.15.8}/QtNetwork/private/qocsp_p.h (100%) rename include/QtNetwork/{5.15.3 => 5.15.8}/QtNetwork/private/qocspresponse_p.h (100%) rename include/QtNetwork/{5.15.3 => 5.15.8}/QtNetwork/private/qsctpserver_p.h (100%) rename include/QtNetwork/{5.15.3 => 5.15.8}/QtNetwork/private/qsctpsocket_p.h (100%) rename include/QtNetwork/{5.15.3 => 5.15.8}/QtNetwork/private/qsharednetworksession_p.h (100%) rename include/QtNetwork/{5.15.3 => 5.15.8}/QtNetwork/private/qsocks5socketengine_p.h (100%) rename include/QtNetwork/{5.15.3 => 5.15.8}/QtNetwork/private/qspdyprotocolhandler_p.h (100%) rename include/QtNetwork/{5.15.3 => 5.15.8}/QtNetwork/private/qssl_p.h (100%) rename include/QtNetwork/{5.15.3 => 5.15.8}/QtNetwork/private/qsslcertificate_p.h (100%) rename include/QtNetwork/{5.15.3 => 5.15.8}/QtNetwork/private/qsslcertificateextension_p.h (100%) rename include/QtNetwork/{5.15.3 => 5.15.8}/QtNetwork/private/qsslcipher_p.h (100%) rename include/QtNetwork/{5.15.3 => 5.15.8}/QtNetwork/private/qsslconfiguration_p.h (100%) rename include/QtNetwork/{5.15.3 => 5.15.8}/QtNetwork/private/qsslcontext_openssl_p.h (100%) rename include/QtNetwork/{5.15.3 => 5.15.8}/QtNetwork/private/qssldiffiehellmanparameters_p.h (100%) rename include/QtNetwork/{5.15.3 => 5.15.8}/QtNetwork/private/qsslkey_p.h (100%) rename include/QtNetwork/{5.15.3 => 5.15.8}/QtNetwork/private/qsslpresharedkeyauthenticator_p.h (100%) rename include/QtNetwork/{5.15.3 => 5.15.8}/QtNetwork/private/qsslsocket_mac_p.h (100%) rename include/QtNetwork/{5.15.3 => 5.15.8}/QtNetwork/private/qsslsocket_openssl_p.h (100%) rename include/QtNetwork/{5.15.3 => 5.15.8}/QtNetwork/private/qsslsocket_openssl_symbols_p.h (100%) rename include/QtNetwork/{5.15.3 => 5.15.8}/QtNetwork/private/qsslsocket_p.h (100%) rename include/QtNetwork/{5.15.3 => 5.15.8}/QtNetwork/private/qsslsocket_schannel_p.h (100%) rename include/QtNetwork/{5.15.3 => 5.15.8}/QtNetwork/private/qsslsocket_winrt_p.h (100%) rename include/QtNetwork/{5.15.3 => 5.15.8}/QtNetwork/private/qtcpserver_p.h (100%) rename include/QtNetwork/{5.15.3 => 5.15.8}/QtNetwork/private/qtcpsocket_p.h (100%) rename include/QtNetwork/{5.15.3 => 5.15.8}/QtNetwork/private/qtnetworkglobal_p.h (100%) rename include/QtNetwork/{5.15.3 => 5.15.8}/QtNetwork/private/qurlinfo_p.h (100%) rename include/QtNetwork/{5.15.3 => 5.15.8}/QtNetwork/private/qwindowscarootfetcher_p.h (100%) rename include/QtOpenGL/{5.15.3 => 5.15.8}/QtOpenGL/private/qgl2pexvertexarray_p.h (100%) rename include/QtOpenGL/{5.15.3 => 5.15.8}/QtOpenGL/private/qgl_p.h (100%) rename include/QtOpenGL/{5.15.3 => 5.15.8}/QtOpenGL/private/qglcustomshaderstage_p.h (100%) rename include/QtOpenGL/{5.15.3 => 5.15.8}/QtOpenGL/private/qglengineshadermanager_p.h (100%) rename include/QtOpenGL/{5.15.3 => 5.15.8}/QtOpenGL/private/qglengineshadersource_p.h (100%) rename include/QtOpenGL/{5.15.3 => 5.15.8}/QtOpenGL/private/qglframebufferobject_p.h (100%) rename include/QtOpenGL/{5.15.3 => 5.15.8}/QtOpenGL/private/qglgradientcache_p.h (100%) rename include/QtOpenGL/{5.15.3 => 5.15.8}/QtOpenGL/private/qglpaintdevice_p.h (100%) rename include/QtOpenGL/{5.15.3 => 5.15.8}/QtOpenGL/private/qglpixelbuffer_p.h (100%) rename include/QtOpenGL/{5.15.3 => 5.15.8}/QtOpenGL/private/qglshadercache_p.h (100%) rename include/QtOpenGL/{5.15.3 => 5.15.8}/QtOpenGL/private/qgraphicsshadereffect_p.h (100%) rename include/QtOpenGL/{5.15.3 => 5.15.8}/QtOpenGL/private/qpaintengineex_opengl2_p.h (100%) rename include/QtOpenGL/{5.15.3 => 5.15.8}/QtOpenGL/private/qtextureglyphcache_gl_p.h (100%) rename include/QtPlatformCompositorSupport/{5.15.3 => 5.15.8}/QtPlatformCompositorSupport/private/qopenglcompositor_p.h (100%) rename include/QtPlatformCompositorSupport/{5.15.3 => 5.15.8}/QtPlatformCompositorSupport/private/qopenglcompositorbackingstore_p.h (100%) rename include/QtPrintSupport/{5.15.3 => 5.15.8}/QtPrintSupport/private/qabstractprintdialog_p.h (100%) rename include/QtPrintSupport/{5.15.3 => 5.15.8}/QtPrintSupport/private/qcups_p.h (100%) rename include/QtPrintSupport/{5.15.3 => 5.15.8}/QtPrintSupport/private/qcupsjobwidget_p.h (100%) rename include/QtPrintSupport/{5.15.3 => 5.15.8}/QtPrintSupport/private/qpagesetupdialog_p.h (100%) rename include/QtPrintSupport/{5.15.3 => 5.15.8}/QtPrintSupport/private/qpagesetupdialog_unix_p.h (100%) rename include/QtPrintSupport/{5.15.3 => 5.15.8}/QtPrintSupport/private/qpaintengine_alpha_p.h (100%) rename include/QtPrintSupport/{5.15.3 => 5.15.8}/QtPrintSupport/private/qpaintengine_preview_p.h (100%) rename include/QtPrintSupport/{5.15.3 => 5.15.8}/QtPrintSupport/private/qprint_p.h (100%) rename include/QtPrintSupport/{5.15.3 => 5.15.8}/QtPrintSupport/private/qprintdevice_p.h (100%) rename include/QtPrintSupport/{5.15.3 => 5.15.8}/QtPrintSupport/private/qprintengine_pdf_p.h (100%) rename include/QtPrintSupport/{5.15.3 => 5.15.8}/QtPrintSupport/private/qprintengine_win_p.h (100%) rename include/QtPrintSupport/{5.15.3 => 5.15.8}/QtPrintSupport/private/qprinter_p.h (100%) rename include/QtPrintSupport/{5.15.3 => 5.15.8}/QtPrintSupport/private/qprinterinfo_p.h (100%) rename include/QtPrintSupport/{5.15.3 => 5.15.8}/QtPrintSupport/private/qtprintsupportglobal_p.h (100%) rename include/QtPrintSupport/{5.15.3 => 5.15.8}/QtPrintSupport/qpa/qplatformprintdevice.h (100%) rename include/QtPrintSupport/{5.15.3 => 5.15.8}/QtPrintSupport/qpa/qplatformprintersupport.h (100%) rename include/QtPrintSupport/{5.15.3 => 5.15.8}/QtPrintSupport/qpa/qplatformprintplugin.h (100%) rename include/QtServiceSupport/{5.15.3 => 5.15.8}/QtServiceSupport/private/qgenericunixservices_p.h (100%) rename include/QtSql/{5.15.3 => 5.15.8}/QtSql/private/qsqlcachedresult_p.h (100%) rename include/QtSql/{5.15.3 => 5.15.8}/QtSql/private/qsqldriver_p.h (100%) rename include/QtSql/{5.15.3 => 5.15.8}/QtSql/private/qsqlnulldriver_p.h (100%) rename include/QtSql/{5.15.3 => 5.15.8}/QtSql/private/qsqlquerymodel_p.h (100%) rename include/QtSql/{5.15.3 => 5.15.8}/QtSql/private/qsqlresult_p.h (100%) rename include/QtSql/{5.15.3 => 5.15.8}/QtSql/private/qsqltablemodel_p.h (100%) rename include/QtSql/{5.15.3 => 5.15.8}/QtSql/private/qtsqlglobal_p.h (100%) rename include/QtTest/{5.15.3 => 5.15.8}/QtTest/private/callgrind_p.h (100%) rename include/QtTest/{5.15.3 => 5.15.8}/QtTest/private/cycle_p.h (100%) rename include/QtTest/{5.15.3 => 5.15.8}/QtTest/private/linux_perf_event_p.h (100%) rename include/QtTest/{5.15.3 => 5.15.8}/QtTest/private/qabstracttestlogger_p.h (100%) rename include/QtTest/{5.15.3 => 5.15.8}/QtTest/private/qappletestlogger_p.h (100%) rename include/QtTest/{5.15.3 => 5.15.8}/QtTest/private/qbenchmark_p.h (100%) rename include/QtTest/{5.15.3 => 5.15.8}/QtTest/private/qbenchmarkevent_p.h (100%) rename include/QtTest/{5.15.3 => 5.15.8}/QtTest/private/qbenchmarkmeasurement_p.h (100%) rename include/QtTest/{5.15.3 => 5.15.8}/QtTest/private/qbenchmarkmetric_p.h (100%) rename include/QtTest/{5.15.3 => 5.15.8}/QtTest/private/qbenchmarkperfevents_p.h (100%) rename include/QtTest/{5.15.3 => 5.15.8}/QtTest/private/qbenchmarktimemeasurers_p.h (100%) rename include/QtTest/{5.15.3 => 5.15.8}/QtTest/private/qbenchmarkvalgrind_p.h (100%) rename include/QtTest/{5.15.3 => 5.15.8}/QtTest/private/qcsvbenchmarklogger_p.h (100%) rename include/QtTest/{5.15.3 => 5.15.8}/QtTest/private/qjunittestlogger_p.h (100%) rename include/QtTest/{5.15.3 => 5.15.8}/QtTest/private/qplaintestlogger_p.h (100%) rename include/QtTest/{5.15.3 => 5.15.8}/QtTest/private/qsignaldumper_p.h (100%) rename include/QtTest/{5.15.3 => 5.15.8}/QtTest/private/qtaptestlogger_p.h (100%) rename include/QtTest/{5.15.3 => 5.15.8}/QtTest/private/qteamcitylogger_p.h (100%) rename include/QtTest/{5.15.3 => 5.15.8}/QtTest/private/qtestblacklist_p.h (100%) rename include/QtTest/{5.15.3 => 5.15.8}/QtTest/private/qtestcoreelement_p.h (100%) rename include/QtTest/{5.15.3 => 5.15.8}/QtTest/private/qtestcorelist_p.h (100%) rename include/QtTest/{5.15.3 => 5.15.8}/QtTest/private/qtestelement_p.h (100%) rename include/QtTest/{5.15.3 => 5.15.8}/QtTest/private/qtestelementattribute_p.h (100%) rename include/QtTest/{5.15.3 => 5.15.8}/QtTest/private/qtesthelpers_p.h (100%) rename include/QtTest/{5.15.3 => 5.15.8}/QtTest/private/qtestjunitstreamer_p.h (100%) rename include/QtTest/{5.15.3 => 5.15.8}/QtTest/private/qtestlog_p.h (100%) rename include/QtTest/{5.15.3 => 5.15.8}/QtTest/private/qtestresult_p.h (100%) rename include/QtTest/{5.15.3 => 5.15.8}/QtTest/private/qtesttable_p.h (100%) rename include/QtTest/{5.15.3 => 5.15.8}/QtTest/private/qtestutil_macos_p.h (100%) rename include/QtTest/{5.15.3 => 5.15.8}/QtTest/private/qxctestlogger_p.h (100%) rename include/QtTest/{5.15.3 => 5.15.8}/QtTest/private/qxmltestlogger_p.h (100%) rename include/QtTest/{5.15.3 => 5.15.8}/QtTest/private/valgrind_p.h (100%) rename include/QtThemeSupport/{5.15.3 => 5.15.8}/QtThemeSupport/private/qabstractfileiconengine_p.h (100%) rename include/QtThemeSupport/{5.15.3 => 5.15.8}/QtThemeSupport/private/qdbusmenuadaptor_p.h (100%) rename include/QtThemeSupport/{5.15.3 => 5.15.8}/QtThemeSupport/private/qdbusmenubar_p.h (100%) rename include/QtThemeSupport/{5.15.3 => 5.15.8}/QtThemeSupport/private/qdbusmenuconnection_p.h (100%) rename include/QtThemeSupport/{5.15.3 => 5.15.8}/QtThemeSupport/private/qdbusmenuregistrarproxy_p.h (100%) rename include/QtThemeSupport/{5.15.3 => 5.15.8}/QtThemeSupport/private/qdbusmenutypes_p.h (100%) rename include/QtThemeSupport/{5.15.3 => 5.15.8}/QtThemeSupport/private/qdbusplatformmenu_p.h (100%) rename include/QtThemeSupport/{5.15.3 => 5.15.8}/QtThemeSupport/private/qdbustrayicon_p.h (100%) rename include/QtThemeSupport/{5.15.3 => 5.15.8}/QtThemeSupport/private/qdbustraytypes_p.h (100%) rename include/QtThemeSupport/{5.15.3 => 5.15.8}/QtThemeSupport/private/qgenericunixthemes_p.h (100%) rename include/QtThemeSupport/{5.15.3 => 5.15.8}/QtThemeSupport/private/qstatusnotifieritemadaptor_p.h (100%) rename include/QtThemeSupport/{5.15.3 => 5.15.8}/QtThemeSupport/private/qxdgnotificationproxy_p.h (100%) rename include/QtVulkanSupport/{5.15.3 => 5.15.8}/QtVulkanSupport/private/qbasicvulkanplatforminstance_p.h (100%) rename include/QtVulkanSupport/{5.15.3 => 5.15.8}/QtVulkanSupport/private/qvkconvenience_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/complexwidgets_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/itemviews_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qabstractbutton_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qabstractitemdelegate_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qabstractitemview_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qabstractscrollarea_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qabstractslider_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qabstractspinbox_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qaccessiblemenu_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qaccessiblewidgetfactory_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qaccessiblewidgets_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qaction_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qapplication_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qbasickeyeventtransition_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qbasicmouseeventtransition_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qbsptree_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qbuttongroup_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qcolumnview_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qcolumnviewgrip_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qcombobox_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qcommonstyle_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qcommonstylepixmaps_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qcompleter_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qdatetimeedit_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qdesktopwidget_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qdialog_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qdockarealayout_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qdockwidget_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qeffects_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qfiledialog_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qfileiconprovider_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qfileinfogatherer_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qfilesystemmodel_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qflickgesture_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qfontdialog_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qframe_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qfscompleter_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qfusionstyle_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qfusionstyle_p_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qgesture_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qgesturemanager_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qgraph_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qgraphicsanchorlayout_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qgraphicseffect_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qgraphicsgridlayoutengine_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qgraphicsitem_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qgraphicslayout_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qgraphicslayoutitem_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qgraphicslayoutstyleinfo_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qgraphicsproxywidget_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qgraphicsscene_bsp_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qgraphicsscene_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qgraphicsscenebsptreeindex_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qgraphicssceneindex_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qgraphicsscenelinearindex_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qgraphicstransform_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qgraphicsview_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qgraphicswidget_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qheaderview_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qitemeditorfactory_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qkeysequenceedit_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qlabel_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qlayout_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qlayoutengine_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qlineedit_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qlistview_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qlistwidget_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qmacgesturerecognizer_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qmainwindowlayout_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qmdiarea_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qmdisubwindow_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qmenu_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qmenubar_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qpixmapfilter_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qpixmapstyle_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qpixmapstyle_p_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qplaintextedit_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qproxystyle_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qpushbutton_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qscrollarea_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qscrollbar_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qscroller_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qscrollerproperties_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qsidebar_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qsimplex_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qsplitter_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qstandardgestures_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qstyle_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qstyleanimation_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qstylehelper_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qstylesheetstyle_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qsystemtrayicon_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qt_widgets_pch.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qtabbar_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qtableview_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qtablewidget_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qtextedit_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qtoolbar_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qtoolbararealayout_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qtoolbarextension_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qtoolbarlayout_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qtoolbarseparator_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qtreeview_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qtreewidget_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qtreewidgetitemiterator_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qtwidgetsglobal_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qundostack_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qwidget_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qwidgetaction_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qwidgetanimator_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qwidgetitemdata_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qwidgetlinecontrol_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qwidgetrepaintmanager_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qwidgetresizehandler_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qwidgettextcontrol_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qwidgettextcontrol_p_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qwidgetwindow_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qwindowcontainer_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qwindowsstyle_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qwindowsstyle_p_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/qwizard_win_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/rangecontrols_p.h (100%) rename include/QtWidgets/{5.15.3 => 5.15.8}/QtWidgets/private/simplewidgets_p.h (100%) rename include/QtWindowsUIAutomationSupport/{5.15.3 => 5.15.8}/QtWindowsUIAutomationSupport/private/qwindowsuiawrapper_p.h (100%) rename include/QtWindowsUIAutomationSupport/{5.15.3 => 5.15.8}/QtWindowsUIAutomationSupport/private/uiaattributeids_p.h (100%) rename include/QtWindowsUIAutomationSupport/{5.15.3 => 5.15.8}/QtWindowsUIAutomationSupport/private/uiaclientinterfaces_p.h (100%) rename include/QtWindowsUIAutomationSupport/{5.15.3 => 5.15.8}/QtWindowsUIAutomationSupport/private/uiacontroltypeids_p.h (100%) rename include/QtWindowsUIAutomationSupport/{5.15.3 => 5.15.8}/QtWindowsUIAutomationSupport/private/uiaerrorids_p.h (100%) rename include/QtWindowsUIAutomationSupport/{5.15.3 => 5.15.8}/QtWindowsUIAutomationSupport/private/uiaeventids_p.h (100%) rename include/QtWindowsUIAutomationSupport/{5.15.3 => 5.15.8}/QtWindowsUIAutomationSupport/private/uiageneralids_p.h (100%) rename include/QtWindowsUIAutomationSupport/{5.15.3 => 5.15.8}/QtWindowsUIAutomationSupport/private/uiapatternids_p.h (100%) rename include/QtWindowsUIAutomationSupport/{5.15.3 => 5.15.8}/QtWindowsUIAutomationSupport/private/uiapropertyids_p.h (100%) rename include/QtWindowsUIAutomationSupport/{5.15.3 => 5.15.8}/QtWindowsUIAutomationSupport/private/uiaserverinterfaces_p.h (100%) rename include/QtWindowsUIAutomationSupport/{5.15.3 => 5.15.8}/QtWindowsUIAutomationSupport/private/uiatypes_p.h (100%) rename include/QtXkbCommonSupport/{5.15.3 => 5.15.8}/QtXkbCommonSupport/private/qxkbcommon_p.h (100%) rename include/QtXml/{5.15.3 => 5.15.8}/QtXml/private/qdom_p.h (100%) rename include/QtXml/{5.15.3 => 5.15.8}/QtXml/private/qdomhelpers_p.h (100%) rename include/QtXml/{5.15.3 => 5.15.8}/QtXml/private/qxml_p.h (100%) create mode 100644 src/3rdparty/freetype/include/freetype/config/integer-types.h create mode 100644 src/3rdparty/freetype/include/freetype/config/mac-support.h create mode 100644 src/3rdparty/freetype/include/freetype/config/public-macros.h delete mode 100644 src/3rdparty/freetype/include/freetype/ftautoh.h delete mode 100644 src/3rdparty/freetype/include/freetype/ftcffdrv.h delete mode 100644 src/3rdparty/freetype/include/freetype/ftttdrv.h create mode 100644 src/3rdparty/freetype/include/freetype/internal/compiler-macros.h delete mode 100644 src/3rdparty/freetype/include/freetype/internal/ftdriver.h delete mode 100644 src/3rdparty/freetype/include/freetype/internal/ftpic.h delete mode 100644 src/3rdparty/freetype/include/freetype/internal/internal.h delete mode 100644 src/3rdparty/freetype/include/freetype/ttunpat.h delete mode 100644 src/3rdparty/freetype/src/Jamfile delete mode 100644 src/3rdparty/freetype/src/autofit/Jamfile delete mode 100644 src/3rdparty/freetype/src/autofit/afpic.c delete mode 100644 src/3rdparty/freetype/src/autofit/afpic.h delete mode 100644 src/3rdparty/freetype/src/autofit/hbshim.c delete mode 100644 src/3rdparty/freetype/src/autofit/hbshim.h delete mode 100644 src/3rdparty/freetype/src/base/Jamfile delete mode 100644 src/3rdparty/freetype/src/base/basepic.c delete mode 100644 src/3rdparty/freetype/src/base/basepic.h delete mode 100644 src/3rdparty/freetype/src/base/ftapi.c delete mode 100644 src/3rdparty/freetype/src/base/ftpic.c delete mode 100644 src/3rdparty/freetype/src/bdf/Jamfile delete mode 100644 src/3rdparty/freetype/src/bzip2/Jamfile delete mode 100644 src/3rdparty/freetype/src/cache/Jamfile delete mode 100644 src/3rdparty/freetype/src/cff/Jamfile delete mode 100644 src/3rdparty/freetype/src/cff/cf2arrst.c delete mode 100644 src/3rdparty/freetype/src/cff/cf2arrst.h delete mode 100644 src/3rdparty/freetype/src/cff/cf2blues.c delete mode 100644 src/3rdparty/freetype/src/cff/cf2blues.h delete mode 100644 src/3rdparty/freetype/src/cff/cf2error.c delete mode 100644 src/3rdparty/freetype/src/cff/cf2error.h delete mode 100644 src/3rdparty/freetype/src/cff/cf2fixed.h delete mode 100644 src/3rdparty/freetype/src/cff/cf2font.c delete mode 100644 src/3rdparty/freetype/src/cff/cf2font.h delete mode 100644 src/3rdparty/freetype/src/cff/cf2ft.c delete mode 100644 src/3rdparty/freetype/src/cff/cf2ft.h delete mode 100644 src/3rdparty/freetype/src/cff/cf2glue.h delete mode 100644 src/3rdparty/freetype/src/cff/cf2hints.c delete mode 100644 src/3rdparty/freetype/src/cff/cf2hints.h delete mode 100644 src/3rdparty/freetype/src/cff/cf2intrp.c delete mode 100644 src/3rdparty/freetype/src/cff/cf2intrp.h delete mode 100644 src/3rdparty/freetype/src/cff/cf2read.c delete mode 100644 src/3rdparty/freetype/src/cff/cf2read.h delete mode 100644 src/3rdparty/freetype/src/cff/cf2stack.c delete mode 100644 src/3rdparty/freetype/src/cff/cf2stack.h delete mode 100644 src/3rdparty/freetype/src/cff/cf2types.h delete mode 100644 src/3rdparty/freetype/src/cff/cffpic.c delete mode 100644 src/3rdparty/freetype/src/cff/cffpic.h delete mode 100644 src/3rdparty/freetype/src/cff/cfftypes.h delete mode 100644 src/3rdparty/freetype/src/cid/Jamfile delete mode 100644 src/3rdparty/freetype/src/gxvalid/Jamfile delete mode 100644 src/3rdparty/freetype/src/gzip/Jamfile delete mode 100644 src/3rdparty/freetype/src/gzip/zconf.h delete mode 100644 src/3rdparty/freetype/src/lzw/Jamfile delete mode 100644 src/3rdparty/freetype/src/otvalid/Jamfile delete mode 100644 src/3rdparty/freetype/src/pcf/Jamfile delete mode 100644 src/3rdparty/freetype/src/pfr/Jamfile delete mode 100644 src/3rdparty/freetype/src/psaux/Jamfile delete mode 100644 src/3rdparty/freetype/src/pshinter/Jamfile delete mode 100644 src/3rdparty/freetype/src/pshinter/pshpic.c delete mode 100644 src/3rdparty/freetype/src/pshinter/pshpic.h delete mode 100644 src/3rdparty/freetype/src/psnames/Jamfile delete mode 100644 src/3rdparty/freetype/src/psnames/pspic.c delete mode 100644 src/3rdparty/freetype/src/psnames/pspic.h delete mode 100644 src/3rdparty/freetype/src/raster/Jamfile delete mode 100644 src/3rdparty/freetype/src/raster/rastpic.c delete mode 100644 src/3rdparty/freetype/src/raster/rastpic.h delete mode 100644 src/3rdparty/freetype/src/sfnt/Jamfile delete mode 100644 src/3rdparty/freetype/src/sfnt/sfntpic.c delete mode 100644 src/3rdparty/freetype/src/sfnt/sfntpic.h create mode 100644 src/3rdparty/freetype/src/sfnt/sfwoff2.c create mode 100644 src/3rdparty/freetype/src/sfnt/sfwoff2.h create mode 100644 src/3rdparty/freetype/src/sfnt/woff2tags.c create mode 100644 src/3rdparty/freetype/src/sfnt/woff2tags.h delete mode 100644 src/3rdparty/freetype/src/smooth/Jamfile delete mode 100644 src/3rdparty/freetype/src/smooth/ftspic.c delete mode 100644 src/3rdparty/freetype/src/smooth/ftspic.h delete mode 100644 src/3rdparty/freetype/src/tools/Jamfile mode change 100644 => 100755 src/3rdparty/freetype/src/tools/chktrcmp.py delete mode 100644 src/3rdparty/freetype/src/tools/docmaker/content.py delete mode 100644 src/3rdparty/freetype/src/tools/docmaker/docbeauty.py delete mode 100644 src/3rdparty/freetype/src/tools/docmaker/docmaker.py delete mode 100644 src/3rdparty/freetype/src/tools/docmaker/formatter.py delete mode 100644 src/3rdparty/freetype/src/tools/docmaker/sources.py delete mode 100644 src/3rdparty/freetype/src/tools/docmaker/tohtml.py delete mode 100644 src/3rdparty/freetype/src/tools/docmaker/utils.py delete mode 100644 src/3rdparty/freetype/src/tools/ftfuzzer/README delete mode 100644 src/3rdparty/freetype/src/tools/ftfuzzer/ftfuzzer.cc delete mode 100644 src/3rdparty/freetype/src/tools/ftfuzzer/ftmutator.cc delete mode 100644 src/3rdparty/freetype/src/tools/ftfuzzer/rasterfuzzer.cc delete mode 100644 src/3rdparty/freetype/src/tools/ftfuzzer/runinput.cc delete mode 100644 src/3rdparty/freetype/src/tools/ftrandom/Makefile create mode 100755 src/3rdparty/freetype/src/tools/make_distribution_archives.py mode change 100644 => 100755 src/3rdparty/freetype/src/tools/update-copyright mode change 100644 => 100755 src/3rdparty/freetype/src/tools/update-copyright-year delete mode 100644 src/3rdparty/freetype/src/truetype/Jamfile delete mode 100644 src/3rdparty/freetype/src/truetype/ttpic.c delete mode 100644 src/3rdparty/freetype/src/truetype/ttpic.h delete mode 100644 src/3rdparty/freetype/src/type1/Jamfile delete mode 100644 src/3rdparty/freetype/src/type42/Jamfile delete mode 100644 src/3rdparty/freetype/src/winfonts/Jamfile create mode 100644 src/3rdparty/gradle/LICENSE delete mode 100644 src/3rdparty/gradle/LICENSE-GRADLEW.txt rename src/3rdparty/harfbuzz-ng/src/{hb-coretext.cc => hb-coretext.mm} (98%) create mode 100644 src/3rdparty/libjpeg/ijg-license.txt rename src/3rdparty/libjpeg/{ => src}/jconfigint.h (86%) create mode 100644 src/3rdparty/libjpeg/src/jdmerge.h create mode 100644 src/3rdparty/libjpeg/zlib-license.txt create mode 100644 src/corelib/doc/src/includes/qfile-copy.qdocinc delete mode 100644 src/opengl/qtopengl.tracepoints create mode 100644 tests/auto/corelib/kernel/qtimer/BLACKLIST delete mode 100644 tests/auto/corelib/kernel/qtranslator/android_testdata.qrc create mode 100644 tests/auto/corelib/plugin/qpluginloader/machtest/machtest_arm64.pro delete mode 100644 tests/auto/corelib/plugin/qpluginloader/machtest/machtest_i386.pro delete mode 100644 tests/auto/corelib/plugin/qpluginloader/machtest/machtest_ppc64.pro delete mode 100644 tests/auto/corelib/text/qtextboundaryfinder/data/GraphemeBreakTest.txt.full create mode 100644 tests/auto/gui/text/qtextlayout/BLACKLIST create mode 100644 tests/auto/network/access/qdecompresshelper/BLACKLIST create mode 100644 tests/auto/other/lancelot/scripts/cosmetic.qps create mode 100644 tests/auto/other/lancelot/scripts/tinydashes.qps create mode 100644 tests/auto/other/qaccessibilitymac/BLACKLIST create mode 100644 tests/auto/tools/moc/cxx11-trailing-return.h create mode 100644 tests/auto/widgets/kernel/qgesturerecognizer/BLACKLIST delete mode 100644 tests/benchmarks/widgets/graphicsview/qgraphicsview/benchapps/chipTest/chip.debug delete mode 100644 tests/testserver/apache2/testdata/www/htdocs/protected/rfc3252.txt create mode 100644 util/unicode/data/emoji-data.txt diff --git a/.QT-ENTERPRISE-LICENSE-AGREEMENT b/.QT-ENTERPRISE-LICENSE-AGREEMENT index 386577c6..8d68b15d 100644 --- a/.QT-ENTERPRISE-LICENSE-AGREEMENT +++ b/.QT-ENTERPRISE-LICENSE-AGREEMENT @@ -1,48 +1,65 @@ QT LICENSE AGREEMENT -Agreement version 4.3 +Agreement version 4.4.1 This Qt License Agreement ("Agreement") is a legal agreement for the licensing of Licensed Software (as defined below) between The Qt Company (as defined -below) and the Licensee who has accepted the terms of this Agreement by -downloading or using the Licensed Software and/or as defined herein: +below) and the Licensee who has accepted the terms of this Agreement by signing +this Agreement or by downloading or using the Licensed Software or in any other +appropriate means. Capitalized terms used herein are defined in Section 1. WHEREAS: - (A) Licensee wishes to use the Licensed Software for the purpose of - developing and distributing Applications and/or Devices (each as - defined below); and - (B) The Qt Company is willing to grant the Licensee a right to use - Licensed Software for such a purpose pursuant to term and conditions - of this Agreement. + (A) Licensee wishes to use the Licensed Software for the purpose of + developing and distributing Applications and/or Devices (each as defined + below); + (B) The Qt Company is willing to grant the Licensee a right to use Licensed + Software for such a purpose pursuant to term and conditions of this + Agreement; and + (C) Parties wish to enable that their respective Affiliates also can sell + and purchase licenses to serve Licensee Affiliates' needs to use Licensed + Software pursuant to terms of the Agreement. Any such license purchases by + Licensee Affiliates from The Qt Company or its Affiliates will create + contractual relationship directly between the relevant The Qt Company and + the respective ordering Licensee Affiliate "Acceding Agreement"). + Accordingly, Licensee shall not be a party to any such Acceding Agreement, + and no rights or obligations are created to the Licensee thereunder but all + rights and obligations under such Acceding Agreement are vested and borne + solely by the ordering Licensee Affiliate and the relevant The Qt Company + as a contracting parties under such Acceding Agreement. NOW, THEREFORE, THE PARTIES HEREBY AGREE AS FOLLOWS: 1. DEFINITIONS -"Affiliate" of a Party shall mean an entity (i) which is directly -or indirectly controlling such Party; (ii) which is under the same direct or -indirect ownership or control as such Party; or (iii) which is directly or -indirectly owned or controlled by such Party. For these purposes, an entity -shall be treated as being controlled by another if that other entity has fifty -percent (50 %) or more of the votes in such entity, is able to direct its -affairs and/or to control the composition of its board of directors or -equivalent body. +"Affiliate" of a Party shall mean an entity + (i) which is directly or indirectly controlling such Party; + (ii) which is under the same direct or indirect ownership or control as + such Party; or + (iii) which is directly or indirectly owned or controlled by such Party. +For these purposes, an entity shall be treated as being controlled by another +if that other entity has fifty percent (50 %) or more of the votes in such +entity, is able to direct its affairs and/or to control the composition of its +board of directors or equivalent body. "Add-on Products" shall mean The Qt Company's specific add-on software products -(for example Qt Safe Renderer, Qt for Automation, Qt Application Manager), which -are not licensed as part of The Qt Company's standard offering, but shall be -included into the scope of Licensed Software only if so specifically agreed -between the Parties. +which are not licensed as part of The Qt Company's standard product offering, +but shall be included into the scope of Licensed Software only if so +specifically agreed between the Parties. -"Applications" shall mean Licensee's software products created using the -Licensed Software, which may include the Redistributables, or part thereof. +"Agreement Term" shall mean the validity period of this Agreement, as set forth +in Section 12. -"Contractor(s)" shall mean third party consultants, distributors and contractors -performing services to the Licensee under applicable contractual arrangement. +"Applications" shall mean software products created using the Licensed +Software, which include the Redistributables, or part thereof. -"Customer(s)" shall mean Licensee's end users to whom Licensee, directly or -indirectly, distributes copies of the Redistributables. +"Contractor(s)" shall mean third party consultants, distributors and +contractors performing services to the Licensee under applicable contractual +arrangement. + +"Customer(s)" shall mean Licensee's customers to whom Licensee, directly or +indirectly, distributes copies of the Redistributables as integrated or +incorporated into Applications or Devices. "Data Protection Legislation" shall mean the General Data Protection Regulation (EU 2016/679) (GDPR) and any national implementing laws, regulations and @@ -50,44 +67,61 @@ secondary legislation, as may be amended or updated from time to time, as well as any other data protection laws or regulations applicable in relevant territory. -"Deployment Platforms" shall mean operating systems and/or hardware specified -in the License Certificate, on which the Redistributables can be distributed -pursuant to the terms and conditions of this Agreement. +"Deployment Platforms" shall mean target operating systems and/or hardware +specified in the License Certificate, on which the Redistributables can be +distributed pursuant to the terms and conditions of this Agreement. "Designated User(s)" shall mean the employee(s) of Licensee or Licensee's -Affiliates acting within the scope of their employment or Licensee's Contractors -acting within the scope of their services for Licensee and on behalf of -Licensee. Designated Users shall be named in the License Certificate. +Affiliates acting within the scope of their employment or Licensee's +Contractors acting within the scope of their services on behalf of Licensee. "Development License" shall mean the license needed by the Licensee for each Designated User to use the Licensed Software under the license grant described in Section 3.1 of this Agreement. Development Licenses are available per respective Licensed Software products, each product having its designated scope -and purpose of use. Distribution Licenses are always connected to Qt for Device -Creation product and Qt for MCUs product only. +and purpose of use. -"Development Platforms" shall mean those operating systems specified in the -License Certificate, in which the Licensed Software can be used under the -Development License, but not distributed in any form or used for any other purpose. +"Development License Term" shall mean the agreed validity period of the +Development License or QA Tools license during which time the relevant Licensed +Software product can be used pursuant to this Agreement. Agreed Development +License Term, as ordered and paid for by the Licensee, shall be memorialized in +the applicable License Certificate. -"Devices" shall mean hardware devices or products that 1) are manufactured -and/or distributed by the Licensee or its Affiliates or Contractors, and (2)(i) -incorporate or integrate the Redistributables or parts thereof; or (ii) where -the main user interface or substantial functionality of such unit , when used by -a Customer, is provided by Application(s) or otherwise depends on the Licensed -Software, regardless of whether the Redistributables are distributed together -with the hardware or not. Devices covered with this Agreement shall be specified -in Appendix 2 or in a quote. +"Development Platforms" shall mean those host operating systems specified in +the License Certificate, in which the Licensed Software can be used under the +Development License. -"Distribution License(s)" shall mean the license required for any kind of sale, -trade, exchange, loan, lease, rental or other distribution by or on behalf of -Licensee to a third party of Redistributables in connection with Devices -ursuant to license grant described in Section 3.3 of this Agreement. +"Devices" shall mean + (1) hardware devices or products that + i. are manufactured and/or distributed by the Licensee, its Affiliates, + Contractors or Customers, and + ii. incorporate, integrate or link to Applications such that + substantial functionality of such unit, when used by an End User, + is provided by Application(s) or otherwise depends on the Licensed + Software, regardless of whether the Application is developed by + Licensee or its Contractors; or + (2) Applications designed for the hardware devices specified in item (1). -"Distribution License Packs" shall mean set of prepaid Distribution Licenses for -distribution of Redistributables, as defined in The Qt Company's standard price -list, quote, Purchase Order confirmation or in an appendix hereto, as the case -may be. + Devices covered by this Agreement shall be specified in Appendix 2 or in a + quote. + +"Distribution License(s)" shall mean a royalty-bearing license required for any +kind of sale, trade, exchange, loan, lease, rental or other distribution by or +on behalf of Licensee to a third party of Redistributables in connection with +Devices pursuant to license grant described in Section 3.3 of this Agreement. +Distribution Licensed are sold separately for each type of Device respectively +and cannot be used for any type of Devices at Licensee's discretion. + +"Distribution License Packs" shall mean set of prepaid Distribution Licenses +for distribution of Redistributables, as defined in The Qt Company's standard +price list, quote, Purchase Order confirmation or in an Appendix 2 hereto, as +the case may be. + +"End User" shall mean the final end user of the Application or a Device. + +"Evaluation License Term" shall mean a time period specified in the License +Certificate for the Licensee to use the relevant Licensed Software for +evaluation purposes according to Section 3.6 herein. "Intellectual Property Rights" shall mean patents (including utility models), design patents, and designs (whether or not capable of registration), chip @@ -99,136 +133,117 @@ well as any trade secrets. "License Certificate" shall mean a certificate generated by The Qt Company for each Designated User respectively upon them downloading the Licensed Software, which will be available under respective Designated User's Qt Account at -account.qt.io. License Certificates will specify the Designated User, the -Development Platforms, Deployment Platforms and the License Term. Such terms are -considered part of the licenses granted hereunder and shall be updated from time -to time to reflect any agreed changes to the foregoing terms relating to -Designated User's rights to the Licensed Software. +account.qt.io. License Certificates will specify relevant information +pertaining the Licensed Software purchased by Licensee and Designated User's +license to the Licensed Software. "License Fee" shall mean the fee charged to the Licensee for rights granted under the terms of this Agreement. -"License Term" shall mean the agreed validity period of the Development License -of the respective Designated User, during which time the Designated User is -entitled to use the Licensed Software, as set forth in the respective License -Certificate. - -"Licensed Software" shall mean either - (i) Qt for Application Development or - (ii) Qt for Device Creation, and/or - (iii) Qt 3D Studio, and/or - (iv) Qt Design Studio, and/or - (v) Qt for MCUs, and/or - (vi) selected Add-on Products, if any, - -depending on which product(s) the Licensee has purchased under this Agreement, -as well as corresponding online or electronic documentation, associated media -and printed materials, including the source code (where applicable), example -programs and the documentation, licensed to the Licensee under this Agreement. -Licensed Software does not include Third Party Software (as defined in -Section 4) or Open Source Qt. The Qt Company may, in the course of its -development activities, at its free and absolute discretion and without any -obligation to send or publish any notifications to the Licensee or in general, -make changes, additions or deletions in the components and functionalities of -the Licensed Software, provided that no such changes, additions or deletions -will affect the already released version of the Licensed Software, but only -upcoming version(s). +"Licensed Software" shall mean specified product of commercially licensed +version of Qt Software and/or QA Tools defined in Appendix 1 and/or Appendix 3, +which Licensee has purchased and which is provided to Licensee under the terms +of this Agreement. Licensed Software shall include corresponding online or +electronic documentation, associated media and printed materials, including the +source code (where applicable), example programs and the documentation. +Licensed Software does not include Third Party Software (as defined in Section +4) or Open Source Qt. The Qt Company may, in the course of its development +activities, at its free and absolute discretion and without any obligation to +send or publish any notifications to the Licensee or in general, make changes, +additions or deletions in the components and functionalities of the Licensed +Software, provided that no such changes, additions or deletions will affect +the already released version of the Licensed Software, but only upcoming +version(s). "Licensee" shall mean the individual or legal entity that is party to this -Agreement, as identified on the signature page hereof. +Agreement. -"Licensee's Records" shall mean books and records that are likely to contain -information bearing on Licensee's compliance with this Agreement, Licensee's use -of Open Source Qt and/or the payments due to The Qt Company under this -Agreement, including, but not limited to user information, assembly logs, sales -records and distribution records. +"Licensee's Records" shall mean books and records that contain information +bearing on Licensee's compliance with this Agreement, Licensee's use of Open +Source Qt and/or the payments due to The Qt Company under this Agreement, +including, but not limited to user information, assembly logs, sales records +and distribution records. "Modified Software" shall have the meaning as set forth in Section 2.3. -"Online Services" shall mean any services or access to systems made available by -The Qt Company to the Licensee over the Internet relating to the Licensed +"Online Services" shall mean any services or access to systems made available +by The Qt Company to the Licensee over the Internet relating to the Licensed Software or for the purpose of use by the Licensee of the Licensed Software or Support. Use of any such Online Services is discretionary for the Licensee and some of them may be subject to additional fees. -"Open Source Qt" shall mean the non-commercial Qt computer software products, -licensed under the terms of the GNU Lesser General Public License, version 2.1 -or later ("LGPL") or the GNU General Public License, version 2.0 or later -("GPL"). For clarity, Open Source Qt shall not be provided nor governed under -this Agreement. +"Open Source Qt" shall mean Qt Software available under the terms of the GNU +Lesser General Public License, version 2.1 or later ("LGPL") or the GNU General +Public License, version 2.0 or later ("GPL"). For clarity, Open Source Qt shall +not be provided, governed or used under this Agreement. "Party" or "Parties" shall mean Licensee and/or The Qt Company. -"Permitted Combination" shall have the meaning as set forth in Section -3.4(viii). +"Permitted Software" shall mean (i) third party open source software products +that are generally available for public in source code form and free of any +charge under any of the licenses approved by Open Source Initiative as listed +on https://opensource.org/licenses, which may include parts of Open Source Qt +or be developed using Open Source Qt; and (ii) software The Qt Company has made +available via its Qt Marketplace online distribution channel. "Pre-Release Code" shall have the meaning as set forth in Section 4. -"Prohibited Combination" shall mean any means to (i) use, combine, incorporate, +"Prohibited Combination" shall mean any effort to use, combine, incorporate, link or integrate Licensed Software with any software created with or -incorporating Open Source Qt, (ii) use Licensed Software for creation of any -software created with or incorporating Open Source Qt, or (iii) incorporate or -integrate Applications into a hardware device or product other than a Device. +incorporating Open Source Qt, or use Licensed Software for creation of any such +software. -"Qt 3D Studio" shall mean The Qt Company's productized offering, which consist -of all versions of modules and tools as set forth in Appendix 1. +"Purchase Order" shall have the meaning as set forth in Section 10.2. -"Qt Design Studio" shall mean The Qt Company's productized offering, which -consist of all versions of modules and tools as set forth in Appendix 1. +"QA Tools" shall mean software libraries and tools as defined in Appendix 1 +depending on which product(s) the Licensee has purchased under the Agreement. -"Qt for Application Development" shall mean The Qt Company's productized -offering, which consist of all versions of modules and tools as set forth in -Appendix 1. - -"Qt for Device Creation" shall mean The Qt Company's productized offering, -which consist of all versions of modules and tools as set forth in Appendix 1. - -"Qt for MCUs" shall mean The Qt Company's productized offering, which consist -of all versions of modules and tools as set forth in Appendix 1. +"Qt Software" shall mean the software libraries and tools of The Qt Company, +which The Qt Company makes available under commercial and/or open source +licenses. "Redistributables" shall mean the portions of the Licensed Software set forth in Appendix 1 that may be distributed pursuant to the terms of this Agreement -in object code form only, including any relevant documentation. Where -relevant, any reference to Licensed Software in this Agreement shall include -and refer also to Redistributables. +in object code form only, including any relevant documentation. Where relevant, +any reference to Licensed Software in this Agreement shall include and refer +also to Redistributables. -"Renewal Term" shall mean an extension of previous License Term as agreed -between the Parties. +"Renewal Term" shall mean an extension of previous Development License Term as +agreed between the Parties. "Submitted Modified Software" shall have the meaning as set forth in Section 2.3. "Support" shall mean standard developer support that is provided by The Qt Company to assist Designated Users in using the Licensed Software in accordance -with The Qt Company's standard support terms available at -https://www.qt.io/terms-conditions/ and as further defined in Section 8 -hereunder. +with this Agreement and the Support Terms. + +"Support Terms" shall mean The Qt Company's standard support terms specified in +Appendix 9 hereto. "Taxes" shall have the meaning set forth in Section 10.5. -"Term" shall have the meaning set forth in Section 12. - "The Qt Company" shall mean: - (i) in the event Licensee is an individual residing in the United States - or a legal entity incorporated in the United States or having its - headquarters in the United States, The Qt Company Inc., a - Delaware corporation with its office at 2350 Mission College Blvd., - Suite 1020, Santa Clara, CA 95054, USA.; or - (ii) in the event the Licensee is an individual residing outside of the - United States or a legal entity incorporated outside of the United - States or having its registered office outside of the United States, - The Qt Company Ltd., a Finnish company with its registered office - at Bertel Jungin aukio D3A, 02600 Espoo, Finland. + (i) in the event Licensee is an individual residing in the United States or + a legal entity incorporated in the United States or having its + headquarters in the United States, The Qt Company Inc., a Delaware + corporation with its office at 3031 Tisch Way, 110 Plaza West, + San Jose, CA 95128, USA.; or + (ii) in the event the Licensee is an individual residing outside of the + United States or a legal entity incorporated outside of the United + States or having its registered office outside of the United States, + The Qt Company Ltd., a Finnish company with its registered office at + Miestentie 7, 02150 Espoo, Finland. "Third-Party Software" shall have the meaning set forth in Section 4. "Updates" shall mean a release or version of the Licensed Software containing -bug fixes, error corrections and other changes that are generally made available -to users of the Licensed Software that have contracted for Support. Updates are -generally depicted as a change to the digits following the decimal in the -Licensed Software version number. The Qt Company shall make Updates available to -the Licensee under the Support. Updates shall be considered as part of the -Licensed Software hereunder. +bug fixes, error corrections and other changes that are generally made +available to users of the Licensed Software that have contracted for Support. +Updates are generally depicted as a change to the digits following the decimal +in the Licensed Software version number. The Qt Company shall make Updates +available to the Licensee under the Support. Updates shall be considered as +part of the Licensed Software hereunder. "Upgrades" shall mean a release or version of the Licensed Software containing enhancements and new features and are generally depicted as a change to the @@ -239,38 +254,45 @@ of the Licensed Software hereunder. 2. OWNERSHIP 2.1. Ownership of The Qt Company -The Licensed Software is protected by copyright laws and international copyright -treaties, as well as other intellectual property laws and treaties. The Licensed -Software is licensed, not sold. + +The Licensed Software is protected by copyright laws and international +copyright treaties, as well as other intellectual property laws and treaties. +The Licensed Software is licensed, not sold. All of The Qt Company's Intellectual Property Rights are and shall remain the -exclusive property of The Qt Company or its licensors respectively. +exclusive property of The Qt Company or its licensors respectively. No rights +to The Qt Company's Intellectual Property Rights are assigned or granted to +Licensee under this Agreement, except when and to the extent expressly +specified herein. 2.2. Ownership of Licensee + All the Licensee's Intellectual Property Rights are and shall remain the exclusive property of the Licensee or its licensors respectively. -All Intellectual Property Rights to the Modified Software, Applications and Devices -shall remain with the Licensee and no rights thereto shall be granted by the -Licensee to The Qt Company under this Agreement (except as set forth in Section -2.3 below). +All Intellectual Property Rights to the Modified Software, Applications and +Devices shall remain with the Licensee and no rights thereto shall be granted +by the Licensee to The Qt Company under this Agreement (except as set forth in +Section 2.3 below). 2.3. Modified Software + Licensee may create bug-fixes, error corrections, patches or modifications to the Licensed Software ("Modified Software"). Such Modified Software may break -the source or binary compatibility with the Licensed Software (including without -limitation through changing the application programming interfaces ("API") or by -adding, changing or deleting any variable, method, or class signature in the -Licensed Software and/or any inter-process protocols, services or standards in -the Licensed Software libraries). To the extent that Licensee's Modified -Software so breaks source or binary compatibility with the Licensed Software, -Licensee acknowledges that The Qt Company's ability to provide Support may be -prevented or limited and Licensee's ability to make use of Updates may be restricted. +the source or binary compatibility with the Licensed Software (including +without limitation through changing the application programming interfaces +("API") or by adding, changing or deleting any variable, method, or class +signature in the Licensed Software and/or any inter-process protocols, +services or standards in the Licensed Software libraries). To the extent that +Licensee's Modified Software so breaks source or binary compatibility with the +Licensed Software, Licensee acknowledges that The Qt Company's ability to +provide Support may be prevented or limited and Licensee's ability to make use +of Updates may be restricted. Licensee may, at its sole and absolute discretion, choose to submit Modified Software to The Qt Company ("Submitted Modified Software") in connection with -Licensee's Support request, service request or otherwise. In the event Licensee -does so, then, Licensee hereby grants The Qt Company a sublicensable, +Licensee's Support request, service request or otherwise. In the event +Licensee does so, then, Licensee hereby grants The Qt Company a sublicensable, assignable, irrevocable, perpetual, worldwide, non-exclusive, royalty-free and fully paid-up license, under all of Licensee's Intellectual Property Rights, to reproduce, adapt, translate, modify, and prepare derivative works of, publicly @@ -281,181 +303,222 @@ discretion. 3. LICENSES GRANTED 3.1. Development with Licensed Software + Subject to the terms of this Agreement, The Qt Company grants to Licensee a -worldwide, non-exclusive, non-transferable license, valid for the License Term, -to use, modify and copy the Licensed Software by Designated Users on the -Development Platforms for the sole purposes of designing, developing, -demonstrating and testing Application(s) and/or Devices, and to provide thereto -related support and other related services to end-user Customers. Each -Application and/or Device can only include, incorporate or integrate code -generated under this Agreement by such Designated Users who are duly licensed -for the applicable Development Platform(s) and Deployment Platform(s) (i.e have -a valid license for the appropriate Licensed Software product). +worldwide, non-exclusive, non-transferable license, valid for each Development +License Term, to use, modify and copy the Licensed Software by Designated +Users on the Development Platforms for the sole purposes of designing, +developing, demonstrating and testing Application(s) and/or Devices, and to +provide thereto related support and other related services to Customers. Each +Application and/or Device can only include, incorporate or integrate +contributions by such Designated Users who are duly licensed for the applicable +Development Platform(s) and Deployment Platform(s) (i.e have a valid license +for the appropriate Licensed Software product). Licensee may install copies of the Licensed Software on five (5) computers per Designated User, provided that only the Designated Users who have a valid Development License may use the Licensed Software. Licensee may at any time designate another Designated User to replace a -then-current Designated User by notifying The Qt Company in writing, provided -that any Designated User may be replaced only once during any six-month period. +then-current Designated User by notifying The Qt Company in writing, where such +replacement is due to termination of employment, change of job duties, long +time absence or other such permanent reason affecting Designated User's need +for Licensed Software. -Upon expiry of the initially agreed License Term, the respective License Terms -shall be automatically extended to one or more Renewal Term(s), unless and -until either Party notifies the other Party in writing, or any other method -acceptable to The Qt Company, that it does not wish to continue the License -Term, such notification to be provided to the other Party no less than thirty -(30) days before expiry of the respective License Term. - -Unless otherwise agreed between the Parties, Renewal Term shall be of equal -length with the initial License Term. +Upon expiry of the initially agreed Development License Term, the respective +Development License Term shall be automatically extended to one or more Renewal +Term(s), unless and until either Party notifies the other Party in writing, or +any other method acceptable to The Qt Company (it being specifically +acknowledged and understood that verbal notification is explicitly deemed +inadequate in all circumstances), that it does not wish to continue the +Development License Term, such notification to be provided to the other Party +no less than thirty (30) days before expiry of the respective Development +License Term. The Qt Company shall, in good time before the due date for the +above notification, remind the Licensee on the coming Renewal Term. Unless +otherwise agreed between the Parties, Renewal Term shall be 12 months. Any such Renewal Term shall be subject to License Fees agreed between the -Parties or, if no advance agreement exists, subject to The Qt Company's standard -pricing applicable at the commencement date of any such Renewal Term. - -Any price or other term specified for a Renewal Term shall be valid only for the -specified time. +Parties or, if no advance agreement exists, subject to The Qt Company's +standard list pricing applicable at the commencement date of any such +Renewal Term. The Qt Company may either request the Licensee to place a purchase order -corresponding to a quote by The Qt Company, or uses Licensees stored Credit -Card information in the QtAccount to automatically charge the Licensee for the +corresponding to a quote by The Qt Company, or use Licensee's stored Credit +Card information in the Qt Account to automatically charge the Licensee for the relevant Renewal Term. -In the event Licensee does not prevent auto-renewal pursuant the above, but a -Renewal Term is nevertheless not duly ordered within 30 days from the date of -the respective notification from The Qt Company and/or the respective License -Fee paid by due date specified in The Qt Company's respective invoice, The Qt -Company shall apply a reinstatement fee equal to ten percent (10 %) of the -total value of the License Fees of the Development Licenses for the expired -term to be added to the License Fee of the respective Renewal Term. - -In the event Licensee chooses not to renew a Development License for a Renewal -Term by notifying The Qt Company thereof no less than thirty (30) days before -expiry of the respective License Term, Licensee may still reinstate such -expired Development Licenses for a Renewal Term subject to applicable renewal -Term License Fees until thirty (30) days from the expiry of the initially -agreed License Term or preceding Renewal Term. After such thirty (30) day -period a Development License shall be subject to applicable License Fees for -a new Development License and not any Renewal Term License Fees. - 3.2. Distribution of Applications -Subject to the terms of this Agreement, The Qt Company grants to Licensee -a worldwide, non-exclusive, non-transferable, revocable (for cause pursuant to -this Agreement) right and license, valid for the Term, to - (i) distribute, by itself or through its Contractors, Redistributables as - installed, incorporated or integrated into Applications for execution - on the Deployment Platforms, and - (ii) grant sublicenses to Redistributables, as distributed hereunder, for - Customers solely for Customer's internal use and to the extent - necessary in order for the Customers to use the Applications for their - respective intended purposes. -Right to distribute the Redistributables as part of an Application as provided -herein is not royalty-bearing but is conditional upon the Licensee not having -any unpaid License Fees for Development Licenses owed to The Qt Company at the -time of distribution of any Redistributables to Customers. - -3.3. Distribution of Devices Subject to the terms of this Agreement, The Qt Company grants to Licensee a worldwide, non-exclusive, non-transferable, revocable (for cause pursuant to -this Agreement) right and license, valid for the Term, to - (i) distribute, by itself or through one or more tiers of Contractors, - Redistributables as installed, incorporated or integrated, or intended - to be installed, incorporated or integrated into Devices for execution - on the Deployment Platforms, and - (ii) grant sublicenses to Redistributables, as distributed hereunder, for - Customers solely for Customer's internal use and to the extent - necessary in order for the Customers to use the Devices for their - respective intended purposes. +this Agreement), right and license, valid for the Agreement Term, to + (i) distribute, by itself or through its Contractors, Redistributables as + installed, incorporated or integrated into Applications for execution + on the Deployment Platforms, and + (ii) grant perpetual and irrevocable sublicenses to Redistributables, as + distributed hereunder, for Customers solely to the extent necessary in + order for the Customers to use the Applications for their respective + intended purposes. -Right to distribute the Redistributables with Devices as provided herein is -conditional upon the Licensee (i) not having any unpaid License Fees for -Development Licenses owed to The Qt Company, and (ii) having purchased and paid -corresponding Distribution Licenses at the time of distribution of any -Redistributables to Customers. +Right to distribute the Redistributables as part of an Application as provided +herein is not royalty-bearing but is conditional upon the Application having +been created, updated and maintained under a valid and duly paid Development +Licenses. + +3.3. Distribution of Devices + +Subject to the terms of this Agreement, The Qt Company grants to Licensee a +worldwide, non-exclusive, non-transferable, revocable (for cause pursuant to +this Agreement), right and license, valid for the Agreement Term, to + (i) distribute, by itself or through one or more tiers of Contractors, + Redistributables as installed, incorporated or integrated, or intended + to be installed, incorporated or integrated into Devices for execution + on the Deployment Platforms, and + (ii) grant perpetual and irrevocable sublicenses to Redistributables, as + distributed hereunder, for Customers solely to the extent necessary in + order for the Customers to use the Devices for their respective + intended purposes. + +Right to distribute the Devices as provided herein is conditional upon + (i) the Devices having been created, updated and maintained under a valid + and duly paid Development Licenses, and + (ii) the Licensee having acquired corresponding Distribution Licenses at + the time of distribution of any Devices to Customers. 3.4. Further Requirements + The licenses granted above in this Section 3 by The Qt Company to Licensee are conditional and subject to Licensee's compliance with the following terms: - (i) Licensee shall not remove or alter any copyright, trademark or other - proprietary rights notice(s) contained in any portion of the Licensed - Software; - (ii) Applications must add primary and substantial functionality to the - Licensed Software so as not to compete with the Licensed Software; - (iii) Applications may not pass on functionality which in any way makes it - possible for others to create software with the Licensed Software; - provided however that Licensee may use the Licensed Software's - scripting and QML ("Qt Quick") functionality solely in order to - enable scripting, themes and styles that augment the functionality - and appearance of the Application(s) without adding primary and - substantial functionality to the Application(s); - (iv) Licensee shall not use Licensed Software in any manner or for any - purpose that infringes, misappropriates or otherwise violates any - Intellectual property or right of any third party, or that violates - any applicable law; - (v) Licensee shall not use The Qt Company's or any of its suppliers' - names, logos, or trademarks to market Applications, except that - Licensee may use "Built with Qt" logo to indicate that - Application(s) was developed using the Licensed Software; - (vi) Licensee shall not distribute, sublicense or disclose source code - of Licensed Software to any third party (provided however that - Licensee may appoint employee(s) of Contractors as Designated - Users to use Licensed Software pursuant to this Agreement). Such - right may be available for the Licensee subject to a separate - software development kit ("SDK") license agreement to be concluded - with The Qt Company; - (vii) Licensee shall not grant the Customers a right to (i) make copies of - the Redistributables except when and to the extent required to use the - Applications and/or Devices for their intended purpose, (ii) modify - the Redistributables or create derivative works thereof, (iii) - decompile, disassemble or otherwise reverse engineer Redistributables, - or (iv) redistribute any copy or portion of the Redistributables to - any third party, except as part of the onward sale of the Device on - which the Redistributables are installed; - (viii) Licensee shall not and shall cause that its Affiliates or - Contractors shall not use Licensed Software in any Prohibited - Combination, unless Licensee has received an advance written - permission from The Qt Company to do so. Absent such written - permission, any and all distribution by the Licensee during the Term - of a hardware device or product a) which incorporate or integrate any - part of Licensed Software or Open Source Qt; or b) where the main - user interface or substantial functionality is provided by software - built with Licensed Software or Open Source Qt or otherwise depends - on the Licensed Software or Open Source Qt, shall be considered to be - Device distribution under this Agreement and shall be dependent on - Licensee's compliance thereof (including but not limited to - obligation to pay applicable License Fees for such distribution). - Notwithstanding what is provided above in this sub-section (viii), - Licensee is entitled to use and combine Licensed Software with any - Permitted Software; - (ix) Licensee shall cause all of its Affiliates and Contractors entitled - to make use of the licenses granted under this Agreement, to be - contractually bound to comply with the relevant terms of this - Agreement and not to use the Licensed Software beyond the terms - hereof and for any purposes other than operating within the scope - of their services for Licensee. Licensee shall be responsible for - any and all actions and omissions of its Affiliates and Contractors - relating to the Licensed Software and use thereof (including but not - limited to payment of all applicable License Fees); - (x) Except when and to the extent explicitly provided in this Section 3, - Licensee shall not transfer, publish, disclose, display or otherwise - make available the Licensed Software; and - (xi) Licensee shall not attempt or enlist a third party to conduct or - attempt to conduct any of the above. + (i) Licensee acknowledges that The Qt Company has separate products of + Licensed Software for the purpose of Applications and Devices + respectively, where development and distribution of Devices is only + allowed using the correct designated product. Licensee shall make sure + and bear the burden of proof that Licensee is using a correct product + of Licensed Software entitling Licensee to development and distribution + of Devices; + (ii) Licensee shall not remove or alter any copyright, trademark or other + proprietary rights notice(s) contained in any portion of the Licensed + Software; + (iii) Applications must add primary and substantial functionality to the + Licensed Software so as not to compete with the Licensed Software; + (iv) Applications may not pass on functionality which in any way makes it + possible for others to create software with the Licensed Software; + provided however that Licensee may use the Licensed Software's + scripting and QML ("Qt Quick") functionality solely in order to enable + scripting, themes and styles that augment the functionality and + appearance of the Application(s) without adding primary and substantial + functionality to the Application(s); + (v) Licensee shall not use Licensed Software in any manner or for any + purpose that infringes, misappropriates or otherwise violates any + Intellectual property or right of any third party, or that violates any + applicable law; + (vi) Licensee shall not use The Qt Company's or any of its suppliers' + names, logos, or trademarks to market Applications, except that + Licensee may use "Built with Qt" logo to indicate that Application(s) + or Device(s) was developed using the Licensed Software; + (vii) Licensee shall not distribute, sublicense or disclose source code of + Licensed Software to any third party (provided however that Licensee + may appoint employee(s) of Contractors and Affiliates as Designated + Users to use Licensed Software pursuant to this Agreement). Such right + may be available for the Licensee subject to a separate software + development kit ("SDK") license agreement to be concluded with The Qt + Company; + (viii) Licensee shall not grant the Customers a right to (a) make copies of + the Redistributables except when and to the extent required to use the + Applications and/or Devices for their intended purpose, (b) modify the + Redistributables or create derivative works thereof, (c) decompile, + disassemble or otherwise reverse engineer Redistributables, or (d) + redistribute any copy or portion of the Redistributables to any third + party, except as part of the onward sale of the Application or Device + on which the Redistributables are installed; + (ix) Licensee shall not and shall cause that its Affiliates or Contractors + shall not use Licensed Software in any Prohibited Combination, unless + Licensee has received an advance written permission from The Qt Company + to do so. Absent such written permission, any and all distribution by + the Licensee during the Agreement Term of a hardware device or product + a) which incorporate or integrate any part of Licensed Software or Open + Source Qt; or b) where substantial functionality is provided by + software built with Licensed Software or Open Source Qt or otherwise + depends on the Licensed Software or Open Source Qt, shall be considered + to be Device distribution under this Agreement and shall be dependent + on Licensee's compliance thereof (including but not limited to + obligation to pay applicable License Fees for such distribution). + Notwithstanding what is provided above in this sub-section (ix), + Licensee is entitled to use and combine Licensed Software with any + Permitted Software; + (x) Licensee shall cause all of its Affiliates, Contractors and Customers + entitled to make use of the licenses granted under this Agreement, to + be contractually bound to comply with the relevant terms of this + Agreement and not to use the Licensed Software beyond the terms hereof + and for any purposes other than operating within the scope of their + services for Licensee. Licensee shall be responsible for any and all + actions and omissions of its Affiliates and Contractors relating to the + Licensed Software and use thereof (including but not limited to payment + of all applicable License Fees); + (xi) Except when and to the extent explicitly provided in this Section 3, + Licensee shall not transfer, publish, disclose, display or otherwise + make available the Licensed Software; and + (xii) Licensee shall not attempt or enlist a third party to conduct or + attempt to conduct any of the above. Above terms shall not be applicable if and to the extent they conflict with any mandatory provisions of any applicable laws. + Any use of Licensed Software beyond the provisions of this Agreement is strictly prohibited and requires an additional license from The Qt Company. +3.5 QA Tools License + +Subject to the terms of this Agreement, The Qt Company grants to Licensee a +worldwide, non-exclusive, non-transferable license, valid for the Development +License Term, to use the QA Tools for Licensee's internal business purposes in +the manner provided below and in Appendix 1 hereto. + +Licensee may modify the QA Tools except for altering or removing any details of +ownership, copyright, trademark or other property right connected with the QA +Tools. + +Licensee shall not distribute the QA Tools or any part thereof, modified or +unmodified, separately or as part of any software package, Application or +Device. + +Upon expiry of the initially agreed Development License Term, the respective +Development License Term shall be automatically extended to one or more Renewal +Term(s), unless and until either Party notifies the other Party in writing, or +any other method acceptable to The Qt Company (it being specifically +acknowledged and understood that verbal notification is explicitly deemed +inadequate in all circumstances), that it does not wish to continue the +Development License Term, such notification to be provided to the other Party +no less than thirty (30) days before expiry of the respective Development +License Term. The Qt Company shall, in good time before the due date for the +above notification, remind the Licensee on the coming Renewal Term. Unless +otherwise agreed between the Parties, Renewal Term shall be 12 months. + +Any such Renewal Term shall be subject to License Fees agreed between the +Parties or, if no advance agreement exists, subject to The Qt Company's +standard list pricing applicable at the commencement date of any such +Renewal Term. + +3.6 Evaluation License + +Subject to the terms of this Agreement, The Qt Company grants to Licensee a +worldwide, non-exclusive, non-transferable license, valid for the Evaluation +License Term to use the Licensed Software solely for the Licensee's internal +use to evaluate and determine whether the Licensed Software meets Licensee's +business requirements, specifically excluding any commercial use of the +Licensed Software or any derived work thereof. + +Upon the expiry of the Evaluation License Term, Licensee must either +discontinue use of the relevant Licensed Software or acquire a commercial +Development License or QA Tools License specified herein. + 4. THIRD-PARTY SOFTWARE -The Licensed Software may provide links to third party libraries or code -(collectively "Third-Party Software") to implement various functions. -Third-Party Software does not comprise part of the Licensed Software. In some -cases, access to Third-Party Software may be included with the Licensed -Software. Such Third-Party Software will be listed in the ".../src/3rdparty" +The Licensed Software may provide links or access to third party libraries or +code (collectively "Third-Party Software") to implement various functions. +Third-Party Software does not, however, comprise part of the Licensed Software, +but is provided to Licensee complimentary and use thereof is discretionary for +the Licensee. Third-Party Software will be listed in the ".../src/3rdparty" source tree delivered with the Licensed Software or documented in the Licensed Software, as such may be amended from time to time. Licensee acknowledges that use or distribution of Third-Party Software is in all respects subject to @@ -464,68 +527,66 @@ applicable license terms of applicable third-party right holders. 5. PRE-RELEASE CODE The Licensed Software may contain pre-release code and functionality, or sample -code marked or otherwise stated with appropriate designation such as "Technology -Preview", "Alpha", "Beta", "Sample" etc. ("Pre-Release Code"). +code marked or otherwise stated with appropriate designation such as +"Technology Preview", "Alpha", "Beta", "Sample", "Example" etc. +("Pre-Release Code"). -Such Pre-Release Code may be present complimentary for the Licensee, in order to -provide experimental support or information for new platforms or preliminary -versions of one or more new functionalities or for other similar reasons. The -Pre-Release Code may not be at the level of performance and compatibility of a -final, generally available, product offering. The Pre-Release Code may not -operate correctly, may contain errors and may be substantially modified by The -Qt Company prior to the first commercial product release, if any. The Qt -Company is under no obligation to make Pre-Release Code commercially available, -or provide any Support or Updates relating thereto. The Qt Company assumes no -liability whatsoever regarding any Pre-Release Code, but any use thereof is -exclusively at Licensee's own risk and expense. +Such Pre-Release Code may be present complimentary for the Licensee, in order +to provide experimental support or information for new platforms or +preliminary versions of one or more new functionalities or for other similar +reasons. The Pre-Release Code may not be at the level of performance and +compatibility of a final, generally available, product offering. The +Pre-Release Code may not operate correctly, may contain errors and may be +substantially modified by The Qt Company prior to the first commercial +product release, if any. The Qt Company is under no obligation to make +Pre-Release Code commercially available, or provide any Support or Updates +relating thereto. The Qt Company assumes no liability whatsoever regarding +any Pre-Release Code, but any use thereof is exclusively at Licensee's own risk +and expense. -For clarity, unless Licensed Software specifies different license terms for -the respective Pre-Release Code, the Licensee is entitled to use such -pre-release code pursuant to Section 3, just like other Licensed Software, -provided however that in the event Add-on Products are included and available -as such Pre-Release Code, Licensee's right to use such Add-on Products is -nevertheless subject to and conditional upon conclusion of separate agreement -with The Qt Company. +For clarity, unless Licensed Software specifies different license terms for the +respective Pre-Release Code, the Licensee is entitled to use such pre-release +code pursuant to Section 3, just like other Licensed Software. 6. LIMITED WARRANTY AND WARRANTY DISCLAIMER -The Qt Company hereby represents and warrants that it has the power and +The Qt Company hereby represents and warrants that (i) it has the power and authority to grant the rights and licenses granted to Licensee under this -Agreement. +Agreement, and (ii) Licensed Software will operate materially in accordance +with its specifications. -Except as set forth above, the Licensed Software is licensed to Licensee -"as is" and Licensee's exclusive remedy and The Qt Company's entire liability -for errors in the Licensed Software shall be limited, at The Qt Company's -option, to correction of the error, replacement of the Licensed Software or -return of the applicable fees paid for the defective Licensed Software for -the time period during which the License is not able to utilize the Licensed -Software under the terms of this Agreement. +Except as set forth above, the Licensed Software is licensed to Licensee "as +is" and Licensee's exclusive remedy and The Qt Company's entire liability for +errors in the Licensed Software shall be limited, at The Qt Company's option, +to correction of the error, replacement of the Licensed Software or return of +the applicable fees paid for the defective Licensed Software for the time +period during which the License is not able to utilize the Licensed Software +under the terms of this Agreement. TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, THE QT COMPANY ON BEHALF OF ITSELF AND ITS LICENSORS, SUPPLIERS AND AFFILIATES, DISCLAIMS ALL OTHER WARRANTIES, EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND -NON-INFRINGEMENT WITH REGARD TO THE LICENSED SOFTWARE. THE QT COMPANY DOES -NOT WARRANT THAT THE LICENSED SOFTWARE WILL SATISFY LICENSEE'S REQUIREMENTS OR -THAT IT WILL OPERATE WITHOUT DEFECT OR ERROR OR THAT THE OPERATION THEREOF -WILL BE UNINTERRUPTED. +NON-INFRINGEMENT WITH REGARD TO THE LICENSED SOFTWARE. THE QT COMPANY DOES NOT +WARRANT THAT THE LICENSED SOFTWARE WILL SATISFY LICENSEE'S REQUIREMENTS OR THAT +IT WILL OPERATE WITHOUT DEFECT OR ERROR OR THAT THE OPERATION THEREOF WILL BE +UNINTERRUPTED. -7. INDEMNIFICATION AND LIMITATION OF LIABILITY +7. LIMITATION OF LIABILITY -7.1. Limitation of Liability -EXCEPT FOR (I) CASES OF GROSS NEGLIGENCE OR INTENTIONAL MISCONDUCT, AND (II) +EXCEPT FOR (I) CASES OF GROSS NEGLIGENCE OR INTENTIONAL MISCONDUCT, AND (II) BREACH OF CONFIDENTIALITY, AND TO THE EXTENT PERMITTED BY APPLICABLE LAW, IN NO EVENT SHALL EITHER PARTY BE LIABLE TO THE OTHER PARTY FOR ANY LOSS OF PROFIT, LOSS OF DATA, LOSS OF BUSINESS OR GOODWILL OR ANY OTHER INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE COST, DAMAGES OR EXPENSE OF ANY KIND, HOWSOEVER ARISING UNDER OR IN CONNECTION WITH THIS AGREEMENT. -EXCEPT FOR (I) CASES OF GROSS NEGLIGENCE OR INTENTIONAL MISCONDUCT, AND (II) +EXCEPT FOR (I) CASES OF GROSS NEGLIGENCE OR INTENTIONAL MISCONDUCT, AND (II) BREACH OF CONFIDENTIALITY, AND TO THE EXTENT PERMITTED BY APPLICABLE LAW, IN NO -EVENT SHALL EITHER PARTY'S TOTAL AGGREGATE LIABILITY UNDER THIS AGREEMENT EXCEED -THE AGGREGATE LICENSE FEES PAID OR PAYABLE TO THE QT COMPANY FROM LICENSEE -DURING THE PERIOD OF TWELVE (12) MONTHS IMMEDIATELY PRECEDING THE EVENT -RESULTING IN SUCH LIABILITY. +EVENT SHALL EITHER PARTY'S TOTAL AGGREGATE LIABILITY UNDER THIS AGREEMENT +EXCEED THE AGGREGATE LICENSE FEES PAID OR PAYABLE TO THE QT COMPANY BY LICENSEE +DURING THE DEVELOPMENT LICENSE TERM DURING WHICH THE EVENT RESULTING IN SUCH +LIABILITY OCCURRED. THE PROVISIONS OF THIS SECTION 7 ALLOCATE THE RISKS UNDER THIS AGREEMENT BETWEEN THE QT COMPANY AND LICENSEE AND THE PARTIES HAVE RELIED UPON THE @@ -533,55 +594,54 @@ LIMITATIONS SET FORTH HEREIN IN DETERMINING WHETHER TO ENTER INTO THIS AGREEMENT. NOTWITHSTANDING ANYTHING TO THE CONTRARY IN THIS AGREEMENT, LICENSEE SHALL -ALWAYS BE LIABLE TO PAY THE APPLICABLE LICENSE FEES CORRESPONDING TO ITS ACTUAL -USE OF LICENSED SOFTWARE. +ALWAYS BE LIABLE TO PAY THE APPLICABLE LICENSE FEES CORRESPONDING TO ITS +ACTUAL USE OF LICENSED SOFTWARE. 8. SUPPORT, UPDATES AND ONLINE SERVICES Upon due payment of the agreed License Fees the Licensee will be eligible to -receive Support and Updates and to use the Online Services during the License -Term, provided, however, that in the event the License Term is longer than 36 -months, the initial payment includes Support for only the first 12 months, -unless the Parties specifically otherwise agree. +receive Support and Updates and to use the Online Services during the agreed +Development License Term or other agreed fixed time period. Support is +provided according to agreed support level and subject to applicable +requirements and restrictions, as specified in the Support Terms. -Unless otherwise decided by The Company at its free and absolute discretion, +Unless otherwise decided by The Qt Company at its free and absolute discretion, Upgrades will not be included in the Support but may be available subject to additional fees. -From time to time The Qt Company may change the Support terms, provided that -during the respective ongoing License Term the level of Support provided by The -Qt Company may not be reduced without the consent of the Licensee. +From time to time The Qt Company may change the Support Terms, provided that +during the respective ongoing Support period the level of Support may not be +reduced without the consent of the Licensee. Unless otherwise agreed, The Qt Company shall not be responsible for providing any service or support to Customers. 9. CONFIDENTIALITY -Each Party acknowledges that during the Term of this Agreement each Party may -receive information about the other Party's business, business methods, -business plans, customers, business relations, technology, and other -information, including the terms of this Agreement, that is confidential and -of great value to the other Party, and the value of which would be -significantly reduced if disclosed to third parties ("Confidential -Information"). Accordingly, when a Party (the "Receiving Party") receives -Confidential Information from the other Party (the "Disclosing Party"), the -Receiving Party shall only disclose such information to employees and -Contractors on a need to know basis, and shall cause its employees and -employees of its Affiliates to: (i) maintain any and all Confidential -Information in confidence; (ii) not disclose the Confidential Information to -a third party without the Disclosing Party's prior written approval; and (iii) -not, directly or indirectly, use the Confidential Information for any purpose -other than for exercising its rights and fulfilling its responsibilities -pursuant to this Agreement. Each Party shall take reasonable measures to -protect the Confidential Information of the other Party, which measures shall -not be less than the measures taken by such Party to protect its own -confidential and proprietary information. +Each Party acknowledges that during the Agreement Term each Party may receive +information about the other Party's business, business methods, business plans, +customers, business relations, technology, and other information, including the +terms of this Agreement, that is confidential and of great value to the other +Party, and the value of which would be significantly reduced if disclosed to +third parties ("Confidential Information"). Accordingly, when a Party (the +"Receiving Party") receives Confidential Information from the other Party (the +"Disclosing Party"), the Receiving Party shall only disclose such information +to employees and Contractors on a need to know basis, and shall cause its +employees and employees of its Affiliates to: (i) maintain any and all +Confidential Information in confidence; (ii) not disclose the Confidential +Information to a third party without the Disclosing Party's prior written +approval; and (iii) not, directly or indirectly, use the Confidential +Information for any purpose other than for exercising its rights and +fulfilling its responsibilities pursuant to this Agreement. Each Party shall +take reasonable measures to protect the Confidential Information of the other +Party, which measures shall not be less than the measures taken by such Party +to protect its own confidential and proprietary information. Obligation of confidentiality shall not apply to information that (i) is or becomes generally known to the public through no act or omission of the -Receiving Party; (ii) was in the Receiving Party's lawful possession prior -to the disclosure hereunder and was not subject to limitations on disclosure -or use; (iii) is developed independently by employees or Contractors of the +Receiving Party; (ii) was in the Receiving Party's lawful possession prior to +the disclosure hereunder and was not subject to limitations on disclosure or +use; (iii) is developed independently by employees or Contractors of the Receiving Party or other persons working for the Receiving Party who have not had access to the Confidential Information of the Disclosing Party, as proven by the written records of the Receiving Party; (iv) is lawfully disclosed to @@ -595,721 +655,1323 @@ Information to the minimum extent necessary. The obligations under this Section 9 shall continue to remain in force for a period of five (5) years after the last disclosure, and, with respect to trade -secrets, for so long as such trade secrets are protected under applicable -trade secret laws. +secrets, for so long as such trade secrets are protected under applicable trade +secret laws. 10. FEES, DELIVERY AND PAYMENT 10.1. License Fees -License Fees are described in The Qt Company's standard price list, quote or -Purchase Order confirmation or in an appendix hereto, as the case may be. -The License Fees shall not be refunded or claimed as a credit in any event or -for any reason whatsoever. +License Fees are described in The Qt Company's standard price list, quote or +Purchase Order confirmation or in an Appendix 2 hereto, as the case may be. + +Unless otherwise expressly provided in this Agreement, the License Fees shall +not be refunded or claimed as a credit in any event or for any reason +whatsoever. 10.2. Ordering Licenses -Licensee may purchase Development Licenses and Distribution Licenses pursuant -to agreed pricing terms or, if no specific pricing terms have been agreed -upon, at The Qt Company's standard pricing terms applicable at the time of -purchase. Unless specifically otherwise provided, any pricing terms -referenced in this Agreement shall be valid for twelve (12) months from the -date of this Agreement. + +Licensee may purchase Development Licenses, Distribution Licenses and QA Tools +Licenses pursuant to agreed pricing terms or, if no specific pricing terms have +been agreed upon, at The Qt Company's standard pricing terms applicable at the +time of purchase. + +Unless expressly otherwise agreed, any price or other term quoted to the +Licensee or specified herein shall only be valid for the thirty (30) days from +the effective date of this Agreement, Appendix 2 or the date of the quote, as +applicable. Licensee shall submit all purchase orders for Development Licenses and -Distribution Licenses to The Qt Company by email or any other method -acceptable to The Qt Company (each such order is referred to herein as a -"Purchase Order") for confirmation, whereupon the Purchase Order shall -become binding between the Parties. +Distribution Licenses to The Qt Company by email or any other method acceptable +to The Qt Company (each such order is referred to herein as a "Purchase Order") +for confirmation, whereupon the Purchase Order shall become binding between the +Parties. + +Licensee acknowledges and agrees that all Purchase Orders for Licensed Software +the Licensee makes during the Agreement Term shall be governed exclusively +under the terms of this Agreement. 10.3. Distribution License Packs + Unless otherwise agreed, Distribution Licenses shall be purchased by way of Distribution License Packs. -Upon due payment of the ordered Distribution License Pack(s), the Licensee -will have an account of Distribution Licenses available for distributing -the Redistributables in accordance with this Agreement. +Upon due payment of the ordered Distribution License Pack(s), the Licensee will +have an account of Distribution Licenses available for distributing the +Redistributables in accordance with this Agreement. Each time Licensee distributes a copy of Redistributables, then one -Distribution License is used, and Licensee's account of available -Distribution Licenses is decreased accordingly. +Distribution License is used, and Licensee's account of available Distribution +Licenses is decreased accordingly. -Licensee may distribute copies of the Redistributables so long as Licensee -has Distribution Licenses remaining on its account. +Licensee may distribute copies of the Redistributables so long as Licensee has +Distribution Licenses remaining on its account. 10.4. Payment Terms + License Fees and any other charges under this Agreement shall be paid by -Licensee no later than thirty (30) days from the date of the applicable -invoice from The Qt Company. +Licensee no later than thirty (30) days from the date of the applicable invoice +from The Qt Company. The Qt Company will submit an invoice to Licensee after the date of this Agreement and/or after The Qt Company receives a Purchase Order from Licensee. A late payment charge of the lower of (a) one percent per month; or (b) the interest rate stipulated by applicable law, shall be charged on any unpaid -balances that remain past due. +balances that remain past due and which have not been disputed by the Licensee +in good faith. 10.5. Taxes + All License Fees and other charges payable hereunder are gross amounts but -exclusive of any value added tax, use tax, sales tax, withholding tax and -other taxes, duties or tariffs ("Taxes") levied directly for the sale, -delivery or use of Licensed Software hereunder pursuant to any applicable -law. Such applicable Taxes shall be paid by Licensee to The Qt Company, or, -where applicable, in lieu of payment of such Taxes to The Qt Company, -Licensee shall provide an exemption certificate to The Qt Company and any -applicable authority. +exclusive of any value added tax, use tax, sales tax, withholding tax and other +taxes, duties or tariffs ("Taxes") levied directly for the sale, delivery or +use of Licensed Software hereunder pursuant to any applicable law. Such +applicable Taxes shall be paid by Licensee to The Qt Company, or, where +applicable, in lieu of payment of such Taxes to The Qt Company, Licensee shall +provide an exemption certificate to The Qt Company and any applicable +authority. 11. RECORD-KEEPING AND REPORTING OBLIGATIONS; AUDIT RIGHTS 11.1. Licensee's Record-keeping -Licensee shall at all times during the Term of this Agreement and for a -period of seven (7) years thereafter maintain Licensee's Records in an -accurate and up-to-date form. Licensee's Records shall be adequate to -reasonably enable The Qt Company to determine Licensee's compliance with -the provisions of this Agreement. The records shall conform to general -good accounting practices. -Licensee shall, within thirty (30) days from receiving The Qt Company's -request to that effect, deliver to The Qt Company a report based on -Licensee's Records, such report to contain information, in sufficient -detail, on (i) number and identity of users working with Licensed Software -or Open Source Qt, (ii) copies of Redistributables distributed by Licensee -during the most recent calendar quarter and/or any other term specified by -The Qt Company, (iii) number of undistributed copies of Redistributables -and corresponding number of unused Distribution Licenses remaining on -Licensee's account, and (iv) any other information as The Qt Company may -reasonably require from time to time. +Licensee shall at all times during the Agreement Term and for a period of two +(2) years thereafter maintain Licensee's Records in an accurate and up-to-date +form. Licensee's Records shall be adequate to reasonably enable The Qt Company +to determine Licensee's compliance with the provisions of this Agreement. The +records shall conform to general good accounting practices. + +Licensee shall, within thirty (30) days from receiving The Qt Company's request +to that effect, deliver to The Qt Company a report based on Licensee's Records, +such report to contain information, in sufficient detail, on (i) number and +identity of users working with Licensed Software or Open Source Qt, (ii) copies +of Redistributables distributed by Licensee during the most recent calendar +quarter and/or any other term specified by The Qt Company, , and (iii) any +other information pertaining to Licensee's compliance with the terms of this +Agreement (like e.g. information on products and/or projects relating to use of +Distribution Licenses), as The Qt Company may reasonably require from time to +time. 11.2. The Qt Company's Audit Rights -The Qt Company or an independent auditor acting on behalf of The Qt -Company's, may, upon at least five (5) business days' prior written -notice and at its expense, audit Licensee with respect to the Licensee's -use of the Licensed Software, but not more frequently than once during -each 6-month period. Such audit may be conducted by mail, electronic means -or through an in-person visit to Licensee's place of business. Any such -in-person audit shall be conducted during regular business hours at -Licensee's facilities and shall not unreasonably interfere with Licensee's -usiness activities. The Qt Company or the independent auditor acting on -behalf of The Qt Company shall be entitled to inspect Licensee's Records -and conduct necessary interviews of Licensee's relevant employees and -Contractors. All such Licensee's Records and use thereof shall be subject -to an obligation of confidentiality under this Agreement. -If an audit reveals that Licensee is using the Licensed Software beyond -scope of the licenses Licensee has paid for, Licensee agrees to pay The Qt -Company any amounts owed for such unauthorized use within 30 days from -receipt of the corresponding invoice from The Qt Company. +The Qt Company or an independent auditor acting on behalf of The Qt Company's, +may, upon at least thirty (30) days' prior written notice and at its expense, +audit Licensee with respect to the Licensee's use of the Licensed Software, but +not more frequently than once during each 6-month period. Such audit may be +conducted by mail, electronic means or through an in-person visit to Licensee's +place of business. Any possible in-person audit shall be conducted during +regular business hours at Licensee's facilities and shall not unreasonably +interfere with Licensee's business activities and shall be limited in scope to +verify Licensee's compliance with the terms of this Agreement. The Qt Company +or the independent auditor acting on behalf of The Qt Company shall be entitled +to inspect Licensee's Records and conduct necessary interviews of Licensee's +relevant employees and Contractors. All such Licensee's Records and use thereof +shall be subject to an obligation of confidentiality under this Agreement. -In addition, in the event the audit reveals a material violation of the -terms of this Agreement (without limitation, either (i) underpayment of -more than 10 % of License Fees or 10,000 euros (whichever is more) or -(ii) distribution of products, which include or result from Prohibited -Combination, shall be deemed a material violation for purposes of this -section), then the Licensee shall pay The Qt Company's reasonable cost of -conducting such audit. +If an audit reveals that Licensee is using the Licensed Software beyond scope +of the licenses Licensee has paid for, Licensee shall pay to The Qt Company any +amounts owed for such unauthorized use within 30 days from receipt of the +corresponding invoice from The Qt Company. + +In addition, in the event the audit reveals a material violation of the terms +of this Agreement (without limitation, either (i) underpayment of more than 10 +% of License Fees or 10,000 euros (whichever is more) or (ii) distribution of +products, which include or result from Prohibited Combination, shall be deemed +a material violation for purposes of this section), then the Licensee shall +pay The Qt Company's reasonable cost of conducting such audit. 12. TERM AND TERMINATION -12.1. Agreement Term -This Agreement shall enter into force upon due acceptance by both -Parties and remain in force for as long as there is any Development -License(s) purchased under this Agreement in force ("Term"), unless and -until terminated pursuant to the terms of this Section 12. -12.2. Termination and suspension of rights -Either Party shall have the right to terminate this Agreement upon thirty -(30) days prior written notice if the other Party commits a material -breach of any obligation of this Agreement and fails to remedy such breach -within such notice period. +12.1. Agreement Term + +This Agreement shall enter into force upon due acceptance by both Parties and +remain in force until terminated pursuant to the terms of this Section 12 +("Agreement Term"). + +12.2. Termination for breach and suspension of rights +Either Party shall have the right to terminate this Agreement upon thirty (30) +days prior written notice if the other Party commits a material breach of any +obligation of this Agreement and fails to remedy such breach within such notice +period. Instead of termination, The Qt Company shall have the right to suspend or -withhold grants of all rights to the Licensed Software hereunder, -including but not limited to the Development Licenses, Distribution -License, and Support, should Licensee fail to make payment in timely -fashion or otherwise violates or is reasonably suspected to violate its -obligations or terms of this Agreement, and where such violation or breach -is not cured within five (5) business days following The Qt Company's -written notice thereof. +withhold grants of all rights to the Licensed Software hereunder, including but +not limited to the Development Licenses, Distribution License, and Support, +should Licensee fail to make payment in timely fashion or otherwise violates or +is reasonably suspected to violate its obligations or terms of this Agreement, +and where such violation or breach is not cured within ten (10) business days +following The Qt Company's written notice thereof. -12.3. Mutual Right to Terminate -Either Party shall have the right to terminate this Agreement immediately -upon written notice in the event that the other Party becomes insolvent, -files for any form of bankruptcy, makes any assignment for the benefit of -creditors, has a receiver, administrative receiver or officer appointed -over the whole or a substantial part of its assets, ceases to conduct -business, or an act equivalent to any of the above occurs under the laws -of the jurisdiction of the other Party. +12.3. Termination for insolvency + +Either Party shall have the right to terminate this Agreement immediately upon +written notice in the event that the other Party becomes insolvent, files for +any form of bankruptcy, makes any assignment for the benefit of creditors, has +a receiver, administrative receiver or officer appointed over the whole or a +substantial part of its assets, ceases to conduct business, or an act +equivalent to any of the above occurs under the laws of the jurisdiction of the +other Party. 12.4. Parties' Rights and Duties upon Termination -Upon expiry or termination of the Agreement, Licensee shall cease and -shall cause all Designated Users (including those of its Affiliates' and -Contractors') to cease using the Licensed Software and distribution of the -Redistributables under this Agreement. -Notwithstanding the above, in the event the Agreement expires or is terminated: - (i) as a result of The Qt Company choosing not to renew the Development - License(s) as set forth in Section 3.1, and where such decision of - non-renewal is not due to any ongoing breach or alleged breach (as - reasonably determined by The Qt Company) by Licensee of the terms of this - Agreement or any applicable license terms of Open Source Qt, then all valid - licenses possessed by the Licensee at such date shall be extended to be - valid in perpetuity under the terms of this Agreement and Licensee is - entitled to purchase additional licenses as set forth in Section 10.2; or - (ii) for reason other than by The Qt Company pursuant to item (i) above - or pursuant to Section 12.2, then the Licensee is entitled, for a - period of six (6) months after the effective date of termination, - to continue distribution of Devices under the Distribution Licenses - paid but unused at such effective date of termination. +Upon expiry or termination of the Agreement, Licensee shall cease and shall +cause all Designated Users (including those of its Affiliates' and +Contractors') to cease using the Licensed Software under this Agreement. For +clarity, a Development License of a Designated User or a QA Tools License, and +all rights relating thereto, shall always terminate at the expiry of the +respective Development License Term, even if the Agreement continues to remain +in force. -Upon any such termination the Licensee shall destroy or return to The Qt -Company all copies of the Licensed Software and all related materials and will -certify the same to The Qt Company upon its request, provided however that -Licensee may retain and exploit such copies of the Licensed Software as it may -reasonably require in providing continued support to Customers. +Upon such termination the Licensee shall destroy or return to The Qt Company +all copies of the Licensed Software and all related materials and will certify +the same by Licensee's duly authorized officer to The Qt Company upon its +request, provided however that Licensee may retain and exploit such copies of +the Licensed Software as it may reasonably require in providing continued +support to Customers. + +Except when this Agreement is terminated by The Qt Company due to Licensee's +material breach as set forth in Section 12.2, the Licensee may continue +distribution of Applications and Devices under the terms of this Agreement +despite the termination of this Agreement. In such event the terms hereof will +continue to be applicable and govern any such distribution of Applications and +Devices beyond the expiry or termination of this Agreement. In case of +termination by The Qt Company due to Licensee's material breach, Licensee must +cease any distribution of Applications and Devices at the date of termination +of this Agreement. Expiry or termination of this Agreement for any reason whatsoever shall not relieve Licensee of its obligation to pay any License Fees accrued or payable -to The Qt Company prior to the effective date of termination, and Licensee -shall immediately pay to The Qt Company all such fees upon the effective date -of termination. Termination of this Agreement shall not affect any rights of -Customers to continue use of Applications and Devices (and therein -incorporated Redistributables). +to The Qt Company prior to the effective date of termination, and Licensee pay +to The Qt Company all such fees within 30 days from the effective date of +termination of this Agreement. -12.5. Extension in case of bankruptcy -In the event The Qt Company is declared bankrupt under a final, -non-cancellable decision by relevant court of law, and this Agreement is not, -at the date of expiry of the Development License(s) pursuant to Section 3.1, -assigned to party, who has assumed The Qt Company's position as a legitimate -licensor of Licensed Software under this Agreement, then all valid licenses -possessed by the Licensee at such date of expiry, and which the Licensee has -not notified for expiry, shall be extended to be valid in perpetuity under the -terms of this Agreement. +Termination of this Agreement shall not affect any rights of Customers to +continue use of Applications and Devices (and therein incorporated +Redistributables). + +12.5. Extension of Rights under Special Circumstances + +In the event of The Qt Company choosing not to renew the Development License(s) +or QA Tools Licenses, as set forth in Section 3.1 and 3.5 respectively, and +where such decision of non-renewal is not due to any ongoing breach or alleged +breach (as reasonably determined by The Qt Company) by Licensee of the terms of +this Agreement or any applicable license terms of Open Source Qt, then all +valid and affected Development Licenses and QA Tools licenses possessed by the +Licensee at such date shall be extended to be valid in perpetuity under the +terms of this Agreement and Licensee is entitled to purchase additional +licenses as set forth in Section 10.2. + +In the event The Qt Company is declared bankrupt under a final, non-cancellable +decision by relevant court of law, and this Agreement is not, at the date of +expiry of the Development License(s) or QA Tools Licenses, assigned to party, +who has assumed The Qt Company's position as a legitimate licensor of Licensed +Software under this Agreement, then all valid Development Licenses and QA Tools +Licenses possessed by the Licensee at such date of expiry, and which the +Licensee has not notified for expiry, shall be extended to be valid in +perpetuity under the terms of this Agreement. + +For clarity, in case of an extension under this Section 12.5, any such +extension shall not apply to The Qt Company's Support obligations, but Support +shall be provided only up until the end of the respective fixed Development +License Term regardless of the extension of relevant Development License or QA +Tools License, unless otherwise agreed between the Parties. 13. GOVERNING LAW AND LEGAL VENUE In the event this Agreement is in the name of The Qt Company Inc., a Delaware Corporation, then: - (i) this Agreement shall be construed and interpreted in accordance with - the laws of the State of California, USA, excluding its choice of - law provisions; - (ii) the United Nations Convention on Contracts for the International - Sale of Goods will not apply to this Agreement; and - (iii) any dispute, claim or controversy arising out of or relating to this - Agreement or the breach, termination, enforcement, interpretation or - validity thereof, including the determination of the scope or - applicability of this Agreement to arbitrate, shall be determined by - arbitration in San Francisco, USA, before one arbitrator. The - arbitration shall be administered by JAMS pursuant to JAMS' - Streamlined Arbitration Rules and Procedures. Judgment on the Award - may be entered in any court having jurisdiction. This Section shall - not preclude parties from seeking provisional remedies in aid of - arbitration from a court of appropriate jurisdiction. + (i) this Agreement shall be construed and interpreted in accordance with + the laws of the State of California, USA, excluding its choice of law + provisions; + (ii) the United Nations Convention on Contracts for the International Sale + of Goods will not apply to this Agreement; and + (iii) any dispute, claim or controversy arising out of or relating to this + Agreement or the breach, termination, enforcement, interpretation or + validity thereof, including the determination of the scope or + applicability of this Agreement to arbitrate, shall be determined by + arbitration in San Francisco, USA, before one arbitrator. The + arbitration shall be administered by JAMS pursuant to JAMS' Streamlined + Arbitration Rules and Procedures. Judgment on the Award may be entered + in any court having jurisdiction. This Section shall not preclude + parties from seeking provisional remedies in aid of arbitration from a + court of appropriate jurisdiction. In the event this Agreement is in the name of The Qt Company Ltd., a Finnish Company, then: - (i) this Agreement shall be construed and interpreted in accordance with - the laws of Finland, excluding its choice of law provisions; - (ii) the United Nations Convention on Contracts for the International - Sale of Goods will not apply to this Agreement; and - (iii) any disputes, controversy or claim arising out of or relating to - this Agreement, or the breach, termination or validity thereof shall - be finally settled by arbitration in accordance with the Arbitration - Rules of Finland Chamber of Commerce. The arbitration tribunal shall - consist of one (1), or if either Party so requires, of three (3), - arbitrators. The award shall be final and binding and enforceable in - any court of competent jurisdiction. The arbitration shall be held - in Helsinki, Finland and the process shall be conducted in the - English language. This Section shall not preclude parties from - seeking provisional remedies in aid of arbitration from a court of - appropriate jurisdiction. + (i) this Agreement shall be construed and interpreted in accordance with + the laws of Finland, excluding its choice of law provisions; + (ii) the United Nations Convention on Contracts for the International Sale + of Goods will not apply to this Agreement; and + (iii) any disputes, controversy or claim arising out of or relating to this + Agreement, or the breach, termination or validity thereof shall be + finally settled by arbitration in accordance with the Arbitration Rules + of International Chamber of Commerce. The arbitration tribunal shall + consist of one (1), or if either Party so requires, of three (3), + arbitrators. The award shall be final and binding and enforceable in + any court of competent jurisdiction. The arbitration shall be held in + Helsinki, Finland and the process shall be conducted in the English + language. This Section shall not preclude parties from seeking + provisional remedies in aid of arbitration from a court of appropriate + jurisdiction. 14. GENERAL PROVISIONS 14.1. No Assignment + Except in the case of a merger or sale of substantially all of its corporate -assets, Licensee shall not be entitled to assign or transfer all or any of -its rights, benefits and obligations under this Agreement without the prior -written consent of The Qt Company, which shall not be unreasonably withheld -or delayed. The Qt Company shall be entitled to freely assign or transfer any -of its rights, benefits or obligations under this Agreement. +assets, Licensee shall not be entitled to assign or transfer all or any of its +rights, benefits and obligations under this Agreement without the prior written +consent of The Qt Company, which shall not be unreasonably withheld or delayed. +The Qt Company shall be entitled to freely assign or transfer any of its +rights, benefits or obligations under this Agreement. 14.2. No Third-Party Representations + Licensee shall make no representations or warranties concerning the Licensed Software on behalf of The Qt Company. Any representation or warranty Licensee -makes or purports to make on The Qt Company's behalf shall be void as to The -Qt Company. +makes or purports to make on The Qt Company's behalf shall be void as to +The Qt Company. 14.3. Surviving Sections + Any terms and conditions that by their nature or otherwise reasonably should survive termination of this Agreement shall so be deemed to survive. Such sections include especially the following: 1, 2, 6, 7, 9, 11, 12.4, 13 and 14. 14.4. Entire Agreement -This Agreement, the exhibits hereto, the License Certificate and any -applicable Purchase Order accepted by The Qt Company constitute the complete -agreement between the Parties and supersedes all prior or contemporaneous -discussions, representations, and proposals, written or oral, with respect -to the subject matters discussed herein. + +This Agreement, the Appendices hereto, the License Certificate and any +applicable quote and Purchase Order accepted by The Qt Company constitute the +complete agreement between the Parties and supersedes all prior or +contemporaneous discussions, representations, and proposals, written or oral, +with respect to the subject matters discussed herein. In the event of any conflict or inconsistency between this Agreement and any -Purchase Order, the terms of this Agreement will prevail over the terms of -the Purchase Order with respect to such conflict or inconsistency. +Purchase Order, the terms of this Agreement will prevail over the terms of the +Purchase Order with respect to such conflict or inconsistency. -Parties specifically acknowledge and agree that this Agreement prevails -over any click-to-accept or similar agreements the Designated Users may -need to accept online upon download of the Licensed Software, as may be -required by The Qt Company's applicable processes relating to Licensed -Software. +Parties specifically acknowledge and agree that this Agreement prevails over +any click-to-accept or similar agreements the Designated Users may need to +accept online upon download of the Licensed Software, as may be required by +The Qt Company's applicable processes relating to Licensed Software. 14.5. Modifications + No modification of this Agreement shall be effective unless contained in a writing executed by an authorized representative of each Party. No term or condition contained in Licensee's Purchase Order ("Deviating Terms") shall apply unless The Qt Company has expressly agreed such Deviating Terms in -writing. Unless and to the extent expressly agreed by The Qt Company, any -such Deviating Terms shall be deemed void and with no legal effect. For -clarity, delivery of the Licensed Software following the receipt of the -Purchase Order including Deviating Terms shall not constitute acceptance of -such Deviating Terms." +writing. Unless and to the extent expressly agreed by The Qt Company, any such +Deviating Terms shall be deemed void and with no legal effect. For clarity, +delivery of the Licensed Software following the receipt of the Purchase Order +including Deviating Terms shall not constitute acceptance of such Deviating +Terms. 14.6. Force Majeure -Except for the payment obligations hereunder, neither Party shall be liable -to the other for any delay or non-performance of its obligations hereunder -in the event and to the extent that such delay or non-performance is due to -an event of act of God, terrorist attack or other similar unforeseeable -catastrophic event that prevents either Party for fulfilling its -obligations under this Agreement and which such Party cannot avoid or -circumvent ("Force Majeure Event"). If the Force Majeure Event results in -a delay or non-performance of a Party for a period of three (3) months or -longer, then either Party shall have the right to terminate this Agreement -with immediate effect without any liability (except for the obligations of -payment arising prior to the event of Force Majeure) towards the other -Party. + +Except for the payment obligations hereunder, neither Party shall be liable to +the other for any delay or non-performance of its obligations hereunder in the +event and to the extent that such delay or non-performance is due to an event +of act of God, terrorist attack or other similar unforeseeable catastrophic +event that prevents either Party for fulfilling its obligations under this +Agreement and which such Party cannot avoid or circumvent ("Force Majeure +Event"). If the Force Majeure Event results in a delay or non-performance of a +Party for a period of three (3) months or longer, then either Party shall have +the right to terminate this Agreement with immediate effect without any +liability (except for the obligations of payment arising prior to the event of +Force Majeure) towards the other Party. 14.7. Notices -Any notice given by one Party to the other shall be deemed properly given -and deemed received if specifically acknowledged by the receiving Party in -writing or when successfully delivered to the recipient by hand, fax, or -special courier during normal business hours on a business day to the -addresses specified for each Party on the signature page. Each -communication and document made or delivered by one Party to the other -Party pursuant to this Agreement shall be in the English language. + +Any notice given by one Party to the other shall be deemed properly given and +deemed received if specifically acknowledged by the receiving Party in writing +or when successfully delivered to the recipient by hand, fax, or special +courier during normal business hours on a business day to the addresses +specified for each Party on the signature page. Each communication and document +made or delivered by one Party to the other Party pursuant to this Agreement +shall be in the English language. 14.8. Export Control + Licensee acknowledges that the Redistributables, as incorporated in -Applications or Devices, may be subject to export control restrictions -under the applicable laws of respective countries. Licensee shall fully -comply with all applicable export license restrictions and requirements -as well as with all laws and regulations relating to the Redistributables -and exercise of licenses hereunder and shall procure all necessary -governmental authorizations, including without limitation, all necessary -licenses, approvals, permissions or consents, where necessary for the -re-exportation of the Redistributables, Applications and/or Devices. +Applications or Devices, may be subject to export control restrictions under +the applicable laws of respective countries. Licensee shall fully comply with +all applicable export license restrictions and requirements as well as with all +laws and regulations relating to the Redistributables and exercise of licenses +hereunder and shall procure all necessary governmental authorizations, +including without limitation, all necessary licenses, approvals, permissions or +consents, where necessary for the re-exportation of the Redistributables, +Applications and/or Devices. 14.9. No Implied License -There are no implied licenses or other implied rights granted under -this Agreement, and all rights, save for those expressly granted hereunder, -shall remain with The Qt Company and its licensors. In addition, no licenses -or immunities are granted to the combination of the Licensed Software with -any other software or hardware not delivered by The Qt Company under this + +There are no implied licenses or other implied rights granted under this +Agreement, and all rights, save for those expressly granted hereunder, shall +remain with The Qt Company and its licensors. In addition, no licenses or +immunities are granted to the combination of the Licensed Software with any +other software or hardware not delivered by The Qt Company under this Agreement. 14.10. Attorney Fees -The prevailing Party in any action to enforce this Agreement shall be -entitled to recover its attorney's fees and costs in connection with such -action. + +The prevailing Party in any action to enforce this Agreement shall be entitled +to recover its attorney's fees and costs in connection with such action, as to +be ordered by the relevant dispute resolution body. 14.11. Privacy + Licensee acknowledges and agrees that for the purpose of this Agreement, -The Qt Company may collect, use, transfer and disclose personal data -pertaining to Designated Users as well as any other employees and directors -of the Licensee and its Contractors relevant for carrying out the intent of -this Agreement. Such personal data may be collected from the Licensee or -directly from the relevant individuals. The Parties acknowledge that with -regard to such personal data processed hereunder, The Qt Company shall be -regarded as the Data Controller under the applicable Data Protection -Legislation. The Qt Company shall process any such personal data in -accordance with its privacy policies and practices, which will comply with -all applicable requirements of the Data Protection Legislation. +The Qt Company may collect, use, transfer and disclose personal data pertaining +to Designated Users as well as any other employees and directors of the +Licensee and its Contractors relevant for carrying out the intent of this +Agreement. Such personal data will be primarily collected from the relevant +individuals but may be collected also from Licensee (e.g. in the course of +Licensee's reporting obligations). The Parties acknowledge that as +The Qt Company determines the purpose and means for such collection and +processing of the applicable personal data, The Qt Company shall be regarded as +the Data Controller under the applicable Data Protection Legislation. +The Qt Company shall process any such personal data in accordance with its +privacy and security policies and practices, which will comply with all +applicable requirements of the Data Protection Legislation. 14.12. Severability -If any provision of this Agreement shall be adjudged by any court of -competent jurisdiction to be unenforceable or invalid, that provision shall -be limited or eliminated to the minimum extent necessary so that this -Agreement shall otherwise remain in full force and effect and enforceable. + +If any provision of this Agreement shall be adjudged by any court of competent +jurisdiction to be unenforceable or invalid, that provision shall be limited or +eliminated to the minimum extent necessary so that this Agreement shall +otherwise remain in full force and effect and enforceable. + +14.13. Marketing Rights + +Parties have agreed upon Marketing Rights pursuant to Appendix 7, if any. + + + APPENDICES - -The Agreement includes Appendix 1, and possibly one or more of the -appendices 3-5, depending on the product(s) purchased by the Licensee, -what is stated in the quote or invoice, and/or what is stated in the -Licensee's License Certificate. - -APPENDIX 1 - -The modules and/or tools that are included in the respective product - Qt -for Application Development (QtAD), Qt for Device Creation (QtDC), Qt for -MCUs (QtMCU), Qt 3D Studio (Qt3DS) and Qt Design Studio (QtDS) - are -marked with 'X' in the below table. The modules and tools are ported to Qt 6 -in stages and are subject to availability. - -Parts of the product that are permitted for distribution in object-code -form only ("Redistributables") are marked with 'R' in the below table. - -+-----------------------------------------------------------------------+ -| Modules / Tools | QtAD | QtDC | QtMCU | Qt3DS | QtDS | -+-----------------------------------------------------------------------+ -| Qt Core | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt GUI | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Multimedia | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Multimedia Widgets | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Network | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt PDF | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt QML | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Quick | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Quick Controls 2 | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Quick Dialogs | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Quick Layouts | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Quick Test | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt SQL | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Test | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Widgets | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Active Qt | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt 3D | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Android Extras | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Bluetooth | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Canvas 3D | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Concurrent | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt D-Bus | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Gamepad | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Graphical Effects | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Help | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Image Formats | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Location | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Mac Extras | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Network Authorization | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt NFC | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Platform Headers | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Positioning | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Print Support | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Purchasing | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt for Python | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Quick Controls | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Quick Extras | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Quick Widgets | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt SCXML | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Sensors | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Serial Bus | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Serial Port | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Speech | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt SVG | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt UI Tools | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt WebChannel | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt WebEngine | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt WebSockets | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt WebView | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Windows Extras | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt X11 Extras | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt XML | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt XML Patterns | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Wayland Compositor | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Charts | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Data Visualization | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Virtual Keyboard | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Boot 2 Qt stack | | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt OTA | | X, R | | | | -+-----------------------------------------------------------------------+ -| Device Utilities | | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Debugging Bridge (QDB) Daemon | | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Quick Ultralite Controls | | | X, R | | | -+-----------------------------------------------------------------------+ -| Qt Quick Ultralite | | | X, R | | | -+-----------------------------------------------------------------------+ -| Qt Creator | X | X | X | | | -+-----------------------------------------------------------------------+ -| Qt Designer (Qt Widget Designer) | X | X | | | | -+-----------------------------------------------------------------------+ -| Qt Quick Designer (Qt Creator | X, R | X, R | X, R | | | -| plugin) | | | | | | -+-----------------------------------------------------------------------+ -| Qt Linguist | X, R | X, R | X, R | | | -+-----------------------------------------------------------------------+ -| Qt Assistant | X, R | X, R | X, R | | | -+-----------------------------------------------------------------------+ -| Lupdate | X, R | X, R | X, R | | | -+-----------------------------------------------------------------------+ -| Lrelease | X, R | X, R | X, R | | | -+-----------------------------------------------------------------------+ -| Qmake | X | X | | | | -+-----------------------------------------------------------------------+ -| Uic | X | X | | | | -+-----------------------------------------------------------------------+ -| Rcc | X | X | | | | -+-----------------------------------------------------------------------+ -| Qlalr | X | X | | | | -+-----------------------------------------------------------------------+ -| Qdoc | X | X | | | | -+-----------------------------------------------------------------------+ -| Qmlscene | X | X | | | | -+-----------------------------------------------------------------------+ -| Qmlviewer | X | X | | | | -+-----------------------------------------------------------------------+ -| Target toolchains | | X | X | | | -+-----------------------------------------------------------------------+ -| Qt Debugging Bridge (QDB) Host | | X | | | | -| Tools | | | | | | -+-----------------------------------------------------------------------+ -| qtconfig-gui | | X | | | | -+-----------------------------------------------------------------------+ -| Qt Emulator | | X | | | | -+-----------------------------------------------------------------------+ -| Qmlinterfacegenerator | | | X | | | -+-----------------------------------------------------------------------+ -| Qmltocpp | | | X | | | -+-----------------------------------------------------------------------+ -| qulfontcompiler | | | X | | | -+-----------------------------------------------------------------------+ -| Qt53DStudioRuntime2 | | | | X, R | | -+-----------------------------------------------------------------------+ -| Qt 3D Studio | | | | X | | -+-----------------------------------------------------------------------+ -| Qt Design Studio | | | | | X | -+-----------------------------------------------------------------------+ +The Agreement includes following Appendices 1-10, as applicable. +- Appendix 1: Licensed Software details +- Appendix 2: Pricing +- Appendix 3: Add-on Software details (optional) +- Appendix 4: Small business and startup Licenses (optional) +- Appendix 5: Non-commercial and educational Licenses (optional) +- Appendix 6: License Reporting (optional) +- Appendix 7: Marketing Rights (optional) +- Appendix 8: Intentionally left blank (optional) +- Appendix 9: Support Terms +- Appendix 10: Conversion from legacy Licenses to Subscription (optional) -APPENDIX 3: ADDITIONS TO LICENSED SOFTWARE +APPENDIX 1: LICENSED SOFTWARE -In addition to what is provided under the definition of the Licensed Software, -Parties agree that Licensed Software shall also include the Add-On Products of -The Qt Company, as mentioned in this Appendix, if included in the quote / -invoice. +The modules and/or tools that are included in the latest publicly available +version of the respective product at the effective date of this Agreement- Qt +for Application Development Professional (ADP), Qt for Application Development +Enterprise (ADE), Qt for Device Creation Professional (DCP), Qt for Device +Creation Enterprise (DCE), - are marked with "X" in the below table. The +modules and tools are specific to each product version respectively and may +vary from version to version. Modules and tools included in the latest publicly +available version of the respective product at any given time are listed in +Appendix 1 of the latest version of this Agreement available at +www.qt.io/terms-conditions/. If a new version of Licensed Software does not +include a module or tool present in an older version which Licensee is entitled +to use under a valid license from The Qt Company, then Licensee will continue +to have such right during the Term of this Agreement. In the event a new +version of the Licensed Software adds modules or tools to any previous +version(s), Licensee's rights will extend to cover also such additional modules +and tools. -The Modules and/or Tools of the Licensed Software that are included with each -Add-On Product respectively are marked with 'X' in the below table. The modules -are ported to Qt 6 in stages and are subject to availability. +Parts of the product that are permitted for distribution in object-code form +only ("Redistributables") are marked with "R" in the below table. -Parts of the respective Add-On Product that are permitted for distribution in -object-code form only ("Redistributables") are marked with 'R' in the below -table. - -+------------------------------------------------------------------------------------------------+ -| | Add-On Product(s) | -| +--------------------------------------------------------------------------+ -| Modules / Tools of | Qt for | Qt | Qt | Qt | Qt | Qt | -| Licensed Software | Automation | Automotive | Safe | Application | GammaRay | Deployment | -| | / Qt M2M | Suite | Renderer | Manager | | Platform | -| | Protocols | | | | | Package | -+------------------------------------------------------------------------------------------------+ -| Qt MQTT | X, R | | | | | | -+------------------------------------------------------------------------------------------------+ -| Qt KNX | X, R | | | | | | -+------------------------------------------------------------------------------------------------+ -| Qt OPC UA | X, R | | | | | | -+------------------------------------------------------------------------------------------------+ -| Qt CoAP | X, R | | | | | | -+------------------------------------------------------------------------------------------------+ -| Qt Safe Renderer | | X, R | X, R | | | | -+------------------------------------------------------------------------------------------------+ -| Qt Application | | X, R | | X, R | | | -| Manager | | | | | | | -+------------------------------------------------------------------------------------------------+ -| Qt IVI | | X, R | | | | | -+------------------------------------------------------------------------------------------------+ -| Reference UI | | X, R | | | | | -+------------------------------------------------------------------------------------------------+ -| Qt GENIVI Extras | | X, R | | | | | -+------------------------------------------------------------------------------------------------+ -| QML Live | | X | | | | | -+------------------------------------------------------------------------------------------------+ -| Qt Creator | | X | | | | | -| Deployment | | | | | | | -+------------------------------------------------------------------------------------------------+ -| Qt Creator Plugin | | X | | X | | | -| for Qt Application Manager | | | | | | -+------------------------------------------------------------------------------------------------+ -| Qt Automotive Suite | | X | | | | | -| Deployment Server | | | | | | | -+------------------------------------------------------------------------------------------------+ -| Qt Design Studio | | X | | | | | -+------------------------------------------------------------------------------------------------+ -| Qt 3D Studio | | X | | | | | -+------------------------------------------------------------------------------------------------+ -| GammaRay | | X | | | X | | -+------------------------------------------------------------------------------------------------+ -| Platform adaptations| | | | | | X | -| for specified | | | | | | -| Deployment Platforms | | | | | | -+------------------------------------------------------------------------------------------------+ -| Qt for Device | | X | | | | | -| Creation | | | | | | | -+------------------------------------------------------------------------------------------------+ ++----------------------------------------------------------+ +| Modules / Tools | ADP | ADE | DCP | DCE | ++----------------------------------------------------------+ +| Active Qt | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt 3D | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt 5 Core Compatibility APIs | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt Android Extras | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt Bluetooth | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt Canvas 3D | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt Charts | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt Concurrent | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt Core | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt Data Visualization | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt D-Bus | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt for Python | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt for WebAssembly | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt Gamepad | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt Graphical Effects | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt GUI | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt Help | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt Image Formats | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt Location | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt Lottie Animation | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt Mac Extras | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt Multimedia | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt Multimedia Widgets | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt Network | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt Network Authorization | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt NFC | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt OpenGL | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt PDF | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt Platform Headers | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt Positioning | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt Print Support | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt Purchasing | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt QML | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt Quick | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt Quick 3D | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt Quick Controls 1 | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt Quick Controls | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt Quick Dialogs | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt Quick Extras | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt Quick Layouts | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt Quick Test | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt Quick Timeline | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt Quick WebGL | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt Quick Widgets | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt Remote Objects | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt Script | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt Script Tools | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt SCXML | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt Sensors | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt Serial Bus | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt Serial Port | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt Shader Tools | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt Speech | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt State Machine | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt SQL | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt SVG | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt Test | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt UI Tools | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt Virtual Keyboard | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt Wayland Compositor | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt WebChannel | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt WebEngine | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt WebSockets | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt WebView | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt Widgets | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt Windows Extras | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt X11 Extras | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt XML | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt XML Patterns | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt Designer (Qt Widget Designer) | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt Linguist | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt Assistant | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| lupdate | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| lrelease | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| lconvert | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt MQTT | | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt KNX | | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt OPC UA | | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt CoAP | | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Boot 2 Qt stacks | | | X,R | X,R | ++----------------------------------------------------------+ +| Qt OTA | | | X,R | X,R | ++----------------------------------------------------------+ +| Device Utilities | | | X,R | X,R | ++----------------------------------------------------------+ +| Qt Debugging Bridge (QBD) Daemon | | | X,R | X,R | ++----------------------------------------------------------+ +| Qt Quick Ultralite Controls | | | X,R | X,R | ++----------------------------------------------------------+ +| Qt Quick Ultralite | | | X,R | X,R | ++----------------------------------------------------------+ +| Qt Safe Renderer (QSR) | | | | X,R | ++----------------------------------------------------------+ +| Qt Application Manager | | | | X,R | ++----------------------------------------------------------+ +| Qt Interface Framework | | | | X,R | ++----------------------------------------------------------+ +| Neptune Reference UI | | | | X,R | ++----------------------------------------------------------+ +| Qt for Android Automotive (QAA) | | | | X,R | ++----------------------------------------------------------+ +| Qt Creator | X | X | X | X | ++----------------------------------------------------------+ +| Qt Design Studio Professional | X | X | X | X | ++----------------------------------------------------------+ +| androiddeployqt | X | X | X | X | ++----------------------------------------------------------+ +| androidtestrunner | X | X | X | X | ++----------------------------------------------------------+ +| canbusutil | X | X | X | X | ++----------------------------------------------------------+ +| dumpcpp | X | X | X | X | ++----------------------------------------------------------+ +| dumpdoc | X | X | X | X | ++----------------------------------------------------------+ +| fixqt4headers.pl | X | X | X | X | ++----------------------------------------------------------+ +| idc | X | X | X | X | ++----------------------------------------------------------+ +| moc | X | X | X | X | ++----------------------------------------------------------+ +| pixeltool | X | X | X | X | ++----------------------------------------------------------+ +| qdbus | X | X | X | X | ++----------------------------------------------------------+ +| qdbuscpp2xml | X | X | X | X | ++----------------------------------------------------------+ +| qdbusviwer | X | X | X | X | ++----------------------------------------------------------+ +| qdbusxml2cpp | X | X | X | X | ++----------------------------------------------------------+ +| qdistancefieldgenerator | X | X | X | X | ++----------------------------------------------------------+ +| qdoc | X | X | X | X | ++----------------------------------------------------------+ +| qhelpgenerator | X | X | X | X | ++----------------------------------------------------------+ +| qlalr | X | X | X | X | ++----------------------------------------------------------+ +| qmake | X | X | X | X | ++----------------------------------------------------------+ +| qml | X | X | X | X | ++----------------------------------------------------------+ +| qmlcachegen | X | X | X | X | ++----------------------------------------------------------+ +| qmldom | X | X | X | X | ++----------------------------------------------------------+ +| qmleasing | X | X | X | X | ++----------------------------------------------------------+ +| qmlformat | X | X | X | X | ++----------------------------------------------------------+ +| qmllint | X | X | X | X | ++----------------------------------------------------------+ +| qmlpreview | X | X | X | X | ++----------------------------------------------------------+ +| qmlprofiler | X | X | X | X | ++----------------------------------------------------------+ +| qmlscene | X | X | X | X | ++----------------------------------------------------------+ +| qmltestrunner | X | X | X | X | ++----------------------------------------------------------+ +| qmltime | X | X | X | X | ++----------------------------------------------------------+ +| qmlviewer | X | X | X | X | ++----------------------------------------------------------+ +| qtdiag | X | X | X | X | ++----------------------------------------------------------+ +| qtpaths | X | X | X | X | ++----------------------------------------------------------+ +| qtplugininfo | X | X | X | X | ++----------------------------------------------------------+ +| qvkgen | X | X | X | X | ++----------------------------------------------------------+ +| rcc | X | X | X | X | ++----------------------------------------------------------+ +| tracegen | X | X | X | X | ++----------------------------------------------------------+ +| uic | X | X | X | X | ++----------------------------------------------------------+ +| windeployqt | X | X | X | X | ++----------------------------------------------------------+ +| Target toolchains | | | X | X | ++----------------------------------------------------------+ +| Qt Debugging Bridge Host Tools | | | X | X | ++----------------------------------------------------------+ +| qtconfig-gui | | | X | X | ++----------------------------------------------------------+ +| Qt Emulator | | | X | X | ++----------------------------------------------------------+ +| Qt Creator VxWorks plugin | | | X | X | ++----------------------------------------------------------+ +| Qt Creator plugin for Qt | | | | X | +| Application Manager | | | | | ++----------------------------------------------------------+ +| qmlinterfacegenerator | | | | X | ++----------------------------------------------------------+ +| qmltocpp | | | | X | ++----------------------------------------------------------+ +| qulfontcompiler | | | | X | ++----------------------------------------------------------+ +| Qt Deployment Server | | | | X | ++----------------------------------------------------------+ -All the above Redistributables are subject to applicable provisions and -limitations including but not limited to what is defined in section 3 of the -Agreement. +Rights for Application and Device use cases + +Following table summarizes the rights afforded by different products of the +Licensed Software to create and distribute Applications and Devices as defined +in this Agreement (X marks for rights): + ++---------------------------------------------------------------+ +| | Applications | Devices | ++---------------------------------------------------------------+ +| ADP | X | | ++---------------------------------------------------------------+ +| ADE | X | | ++---------------------------------------------------------------+ +| DCP | X | X | ++---------------------------------------------------------------+ +| DCE | X | X | ++---------------------------------------------------------------+ + +Licensed Software: Designer tools and modules + +The modules and/or tools that are included in the respective product - Qt for +Design Studio Professional (DSP), Qt for Design Studio Enterprise (DSE) - are +marked with "X" in the below table. + +Designer tools provides no Redistributables. + ++---------------------------------------------+ +| | DSP | DSE | ++---------------------------------------------+ +| Qt Design Studio | X | X | ++---------------------------------------------+ +| Qt Design Bridges | | X | ++---------------------------------------------+ +| QML Live on host | X | X | ++---------------------------------------------+ +| QML Live on target | | X | ++---------------------------------------------+ +| Variant Management | | X | ++---------------------------------------------+ +| Shader creation tools | | X | ++---------------------------------------------+ +| Profiling tools | | X | ++---------------------------------------------+ +| Simulink support | | X | ++---------------------------------------------+ + + +Both DSP and DSE can be used to create an user interface for use cases covered +by ADP, ADE, DCP and DCE. + +Licensed Software: QA Tools + +The modules and/or tools that are included in the respective QA Tools product +- Squish (both Tester and execution Licenses), Coco or Test Center - are marked +with "X" in the below table. Optional features that will need additional +licenses are marked with "O". QA Tools include no Redistributables. + ++---------------------------------------------------------------------+ +| | Squish | Coco | Test Center | ++---------------------------------------------------------------------+ +| Squish IDE | X | | | ++---------------------------------------------------------------------+ +| QA Tool-specific command line tools | X | X | X | ++---------------------------------------------------------------------+ +| Coverage Browser | | X | | ++---------------------------------------------------------------------+ +| HTML interface | | | X | ++---------------------------------------------------------------------+ +| Qt Support Module | X | | | ++---------------------------------------------------------------------+ +| Java support module | X | | | ++---------------------------------------------------------------------+ +| Windows support module | X | | | ++---------------------------------------------------------------------+ +| iOS support module | X | | | ++---------------------------------------------------------------------+ +| Android support module | X | | | ++---------------------------------------------------------------------+ +| Web support module | X | | | ++---------------------------------------------------------------------+ +| macOS support module | X | | | ++---------------------------------------------------------------------+ +| VNC support module | X | | | ++---------------------------------------------------------------------+ +| MCU support module | X | | | ++---------------------------------------------------------------------+ +| C and C++ language module | | X | | ++---------------------------------------------------------------------+ +| C# language module | | X | | ++---------------------------------------------------------------------+ +| QML language module | | X | | ++---------------------------------------------------------------------+ +| Tester Cross-Compilation Add-On | O | O | | ++---------------------------------------------------------------------+ + +License capabilities for Squish + +License capabilities that are included in the Squish Tester and Execution +Licenses are marked with "X" in the below table. + ++-----------------------------------------------------------------------------+ +| | Squish Tester License | Squish Execution License | ++-----------------------------------------------------------------------------+ +| Ability to create, edit, | X | | +| and debug test cas | | | ++-----------------------------------------------------------------------------+ +| Ability to execute test | X | X | +| cases | | | ++-----------------------------------------------------------------------------+ + +Install and use capabilities for QA Tools + +Install and use capabilities that are included in the respective QA Tools +products are defined in the below table. + ++-----------------------------------------------------------------------------+ +| | Squish | Squish | Coco | Test | +| | Tester | Execution | License | Center | +| | License | License | | License | ++-----------------------------------------------------------------------------+ +| Number of installation | Unlimited | Unlimited | Unlimited | One(1) | +| instances per license | | | | | ++-----------------------------------------------------------------------------+ +| Number of concurrent | Limited by| Limited by | Limited by | Limited by | +| users | number of | number of | number of | number of | +| | Squish | Squish | Coco | Test Center | +| | Tester | Execution | Tester | Licenses | +| | Licenses | Licenses | Licenses | | ++-----------------------------------------------------------------------------+ + + +APPENDIX 2: PRICING + +Separate template + +APPENDIX 3: ADD-ON PRODUCTS TO LICENSED SOFTWARE + +Intentionally left blank. APPENDIX 4: SMALL BUSINESS AND STARTUP The provisions of this Appendix 4 are applicable for companies with an annual -revenue, including funding, equivalent to maximum of 250,000 USD (in -applicable currency) during the latest full calendar year, as evidenced by -duly audited records of the Licensee and approved by The Qt Company -("Start-up Company"). +revenue, including funding, equivalent to maximum of 250,000 USD (in applicable +currency) during the latest full calendar year, as evidenced by duly audited +records of the Licensee and approved by The Qt Company ("Start-up Company"). Start-up Companies are qualified for a discounted License Fee for maximum of -four (4) Development Licenses ("Start-up Development License") unless -otherwise agreed between the parties. +four (4) Development Licenses ("Start-up Development License") unless otherwise +agreed between the parties. Start-up Development License entitles the respective Designated User for -Support only for installation related issues. +Support only for Install Support as defined in Appendix 9, Support Terms. -Upon expiry of the respective License Term, the Start-up Development -Licenses shall be automatically extended, pursuant to Section 3.1 of the -Agreement, for a Renewal Term either as new Start-up Development Licenses -(if the Licensee still qualifies as a Start-up Company), or as normal -Development Licenses (if the Licensee no longer qualifies as a Start-up -ompany). +Upon expiry of the respective Development License Term, the Start-up +Development Licenses shall be automatically extended, pursuant to Section 3.1 +of the Agreement, for a Renewal Term either as new Start-up Development +Licenses (if the Licensee still qualifies as a Start-up Company), or as normal +then standard list price Development Licenses (if the Licensee no longer +qualifies as a Start-up Company). -APPENDIX 5: NON-COMMERCIAL USE -The provisions of this Appendix 5 are applicable for non-commercial use of -the Licensed Software by the Licensee. +APPENDIX 5: NON-COMMERCIAL AND EDUCATIONAL USE + +The provisions of this Appendix 5 are applicable for non-commercial use of the +Licensed Software by the Licensee. For the purpose of this Appendix 5, the following additional definitions -(replacing the relevant definition of the Agreement, where applicable) -shall be applicable: +(replacing the relevant definition of the Agreement, where applicable) shall be +applicable: "Demo Units" shall mean (i) hardware development platform, which incorporates -the Licensed Software along with Licensee's software and/or hardware, and -(ii) prototype versions of Applications or Devices. +the Licensed Software along with Licensee's software and/or hardware, and (ii) +prototype versions of Applications or Devices. "Designated User(s)" shall mean the employees and students of the Licensee. "Licensee Products" shall mean Applications and/or Devices. -"Permitted Purpose" shall mean (i) Licensee's internal evaluation and -testing of Licensed Software, (ii) building Demo Units as well as (iii) -educational use. +"Permitted Purpose" shall mean (i) Licensee's internal evaluation and testing +of Licensed Software, (ii) building Demo Units as well as (iii) educational +use. -"Term" shall mean a period of twelve (12) months or any such other period -as may be agreed between the Parties. +"Agreement Term" shall mean a period of twelve (12) months or any such other +period as may be agreed between the Parties. -For the purpose of this Appendix 5, the following changes shall be agreed -with respect to relevant Sections of the Agreement: - - I. Recital (A) shall be replaced in its entirety to read as follows: - "(A) Licensee wishes to use the Licensed Software for the Permitted - Purpose." - II. Section 3.1 shall be replaced in its entirety to read as follows: +For the purpose of this Appendix 5, the following changes shall be agreed with +respect to relevant Sections of the Agreement: + I. Recital (A) shall be replaced in its entirety to read as follows: + "(A) Licensee wishes to use the Licensed Software for the Permitted + Purpose." + II. Section 3.1 shall be replaced in its entirety to read as follows: "The Qt Company grants to Licensee a personal, non-exclusive, non-transferable, revocable, royalty-free license, valid for the - Term, to use, modify and copy the Licensed Software solely for the - Permitted Purpose. - Licensee may install copies of the Licensed Software on five (5) - computers per Designated User, provided that only the Designated - Users who have a valid Development License may use the Licensed - Software. - Licensee may demonstrate the Demo Units, provided that such - demonstrations must be conducted by Licensee, and the Demo Units - must remain in Licensee's possession and under Licensee's control + Agreement Term, to use, modify and copy the Licensed Software solely + for the Permitted Purpose. Licensee may install copies of the Licensed + Software on five (5) computers per Designated User, provided that only + the Designated Users who have a valid Development License may use the + Licensed Software. Licensee may demonstrate the Demo Units, provided + that such demonstrations must be conducted by Licensee, and the Demo + Units must remain in Licensee's possession and under Licensee's control at all times. For clarity, this Agreement does not (i) entitle Licensee to use Licensed Software to create Applications or Devices (other than - prototypes thereof) or (ii) carry any distribution rights to - Licensee, but such rights are subject to and conditional upon - conclusion of a separate license agreement with The Qt Company." - III. Sections 3.2, 3.3, 8 and 10 shall be deleted. - IV. Section 3.4 shall be replaced in its entirety to read as follows: + prototypes thereof) or (ii) carry any distribution rights to Licensee, + but such rights are subject to and conditional upon conclusion of a + separate license agreement with The Qt Company." + III. Sections 3.2, 3.3, 3.5, 3.6, 8 and 10 shall be deleted. + IV. Section 3.4 shall be replaced in its entirety to read as follows: "Licensee shall not: - - remove or alter any copyright, trademark or other proprietary - rights notice contained in any portion of the Licensed Software; - - transfer, publish, sublicense, disclose, display or otherwise - make the Licensed Software available to any third party (except - that Licensee may demonstrate the Demo Units pursuant to Section - 3.1); - - in any way combine, incorporate or integrate Licensed Software - with, or use Licensed Software for creation of, any software - created with or incorporating Open Source Qt; + - remove or alter any copyright, trademark or other proprietary rights + notice contained in any portion of the Licensed Software; + - transfer, publish, sublicense, disclose, display or otherwise make + the Licensed Software available to any third party (except that + Licensee may demonstrate the Demo Units pursuant to Section 3.1); + - in any way combine, incorporate or integrate Licensed Software with, + or use Licensed Software for creation of, any software created with + or incorporating Open Source Qt; Licensee shall cause all Designated + Users who make use of the licenses granted under this Agreement, to + be contractually bound to comply with the relevant terms of this + Agreement and not to use the Licensed Software beyond the terms + hereof. Licensee shall be responsible for any and all actions and + omissions of its Designated Users relating to the Licensed Software + and use thereof. Any use of Licensed Software beyond the provisions + of this Agreement is strictly prohibited and requires an additional + license from The Qt Company." + V. Section 12 shall be replaced in its entirety to read as follows: + "This Agreement shall enter into force upon due acceptance by both + Parties and remain in force for the Agreement Term, unless and until + terminated pursuant to the terms of Section 12. + Upon termination of the Agreement, Licensee shall cease using the + Licensed Software. All other copies of Licensed Software in the + possession or control of Licensee must be erased or destroyed. An + officer of Licensee must, upon request, promptly deliver to The Qt + Company a written confirmation that this has occurred." - Licensee shall cause all Designated Users who make use of the - licenses granted under this Agreement, to be contractually bound - to comply with the relevant terms of this Agreement and not to use - the Licensed Software beyond the terms hereof. Licensee shall be - responsible for any and all actions and omissions of its - Designated Users relating to the Licensed Software and use - thereof. +Except for the modifications specified above, this Appendix carries no change +to the terms of the Agreement which shall remain in full force. - Any use of Licensed Software beyond the provisions of this - Agreement is strictly prohibited and requires an additional license - from The Qt Company." - V. Section 12 shall be replaced in its entirety to read as follows: - "This Agreement shall enter into force upon due acceptance by both - Parties and remain in force for the Term, unless and until - terminated pursuant to the terms of Section 12. +APPENDIX 6: LICENSE REPORTING - Upon termination of the Agreement, Licensee shall cease using the - Licensed Software. All other copies of Licensed Software in the - possession or control of Licensee must be erased or destroyed. - An officer of Licensee must, upon request, promptly deliver to - The Qt Company a written confirmation that this has occurred." +Separate template -Except for the modifications specified above, this Appendix carries no -change to the terms of the Agreement which shall remain in full force. +APPENDIX 7: MARKETING RIGHTS + +This Appendix 7 has the purpose to grant visibility through The Qt Company +marketing channels of the usage of Qt and related product and service in +Licensee product. Following related marketing right are agreed between the Qt +Company and the Licensee. + +1. LICENSEE NAME AND LICENSEE LOGO + +The Qt Company has the right to use Licensee name and Licensee logo in public +channel, in respect of the value proposition that the Qt company provided to +the Licensee. + +2. MARKETING CONTENT COOPERATION + +2.1. LICENSEE CASES + +The Licensee is open to collaborate on content creation for marketing and +communication purpose. The Licensee will nominate one responsible that will be +in charge to support The Qt company with this content creation, according to +content format paragraph, answering technical questions or sharing professional +picture or video of required content. The Qt Company will have the right to +advertise this in Content Format and Channel as mentioned in paragraph 3 and 4. + +2.2. FINAL PRODUCT REFERRAL + +Licensee agree that The Qt Company could connect their software product and +services with the Licensee device or application, that the Licensee has created +using The Qt Company technology and competence. Licensee will provide high +quality picture, and video of the created final product where the Qt technology +is running into. The Qt Company will have the right to advertise this in +Content Format and Channel as mentioned in paragraph 3 and 4. + +3. CONTENT FORMAT + +- Video +- Written Licensee case +- Press release +- Social media posts +- Emails +- Event booth Graphics +- Printed material + +4. CHANNELS + +- Social media +- The Qt Company resource center and website +- Email to the Qt company contact database +- Events +- Online webinars +- Public speech +- Public presentations + +APPENDIX 8: INTENTIONALLY LEFT BLANK + +APPENDIX 9: SUPPORT TERMS + +These Qt support terms and conditions ("Support Terms") set forth the legal +framework, where under The Qt Company ("The Qt Company") provides support +services (as herein defined) to the Licensee. + +1 DEFINITIONS + +"Application Code" shall mean a computer software program written strictly +using the Qt programming language, by or for the Licensee, with a user +interface, enabling the Licensee or their users to accomplish a specific task +and display any results of the task on the display monitor or screen. + +"Dedicated Contact" shall mean the employee of The Qt Company who will be the +first point of contact for all Designated Users' requests for Support. + +"Errors" shall mean an error, flaw, mistake, failure, or fault in Licensed +Software that prevents it from behaving as described in the relevant +documentation or as agreed between the Parties. + +"Extended Support" shall mean a continuation to the normal Support period, +which allows Designated Users to receive selected Support (Standard Support or +Premium Support) for a version of Licensed Software that is no longer generally +supported by The Qt Company. + +"Install Support" shall mean Support that is limited to installation related +Error(s) on Development Platforms specified as supported host platforms for +each Qt release under doc.qt.io. + +"Maintenance Release" shall mean a release or version of Licensed Software +containing bug fixes, error corrections and other changes targeted to +maintaining and improving product stability and quality. Maintenance Releases +are generally depicted as a change to the third digit of Licensed Software +version number. + +"Platforms" shall mean both Development Platforms and Deployment Platforms. +Supported host and target Platforms may vary from for each Qt release as +defined under doc.qt.io. + +"Premium Support" shall mean an upgraded level of Support that The Qt Company +provides pursuant to these Support Terms to Licensee if Licensee has purchased +Premium Support instead of Standard Support. Premium Support shall always be +purchased for all Designated User(s) in the respective development team of the +Licensee. + +"Response Time" shall mean the period of time from when Licensee notifies +TheQt Company about an Error or requests Support until The Qt Company provides +Licensee with a response that addresses (but not necessarily resolves) the +reported Error or provides the requested Support. + +"Standard Support" shall mean standard level of Support that The Qt Company +provides pursuant to these Support Terms to Licensee. + +"Support" shall mean developer assistance that is provided by The Qt Company +to assist eligible Designated Users in Licensed Software installation, usage +and functionality problem resolution for Error(s) and Error workarounds +pursuant to the terms of these Support Terms. Support for different products is +available as specified in the below table ("X" marking the Support that is +included in the license price, optional Add-on Support services are marked as +"O"): + ++-----------------------------------------------------------------------+ +| |ADP|ADE|DCP|DCE|DSP|DSE|Squish|Coco|Test Center| ++-----------------------------------------------------------------------+ +| Install Support | X | X | X | X | X | X | X | X | X | ++-----------------------------------------------------------------------+ +| Standard Support | | X | X | X | X | X | X | X | X | ++-----------------------------------------------------------------------+ +| Premium Support | | O | O | O | O | O | O | O | O | ++-----------------------------------------------------------------------+ +| Extended Support | | O | O | O | O | O | | | | ++-----------------------------------------------------------------------+ +| Tool Qualification Kit| | | | | | | O | O | | ++-----------------------------------------------------------------------+ + +"Support Validity Term" shall mean the Development License Term or any other +fixed time period agreed between the Parties during which time the Customer is +eligible to receive Support from The Qt Company. + +"Tool Qualification Kit" shall mean a customized set of documents and +validation test cases. + +2 SUPPORT SERVICES + +2.1 Support Services Provided by The Qt Company + +Subject to these Support Terms and during the Support Validity Term, The Qt +Company will via its web-based support user-interface, provide Designated +User(s) with Support for the Platforms which Customer has licensed under the +Agreement. +The Qt Company will make commercially reasonable efforts to solve any Errors +reported by Designated User(s). Resolution of an Error may be provided through +Designated User(s) themselves downloading of a later released version of the +applicable Licensed Software product(s) or providing the Designated User with a +temporary workaround addressing such Error. + +2.2 Licensee's Obligations + +To report an Error, the Designated User shall register the Error on The Qt +Company's web-based support user interface located at: +https://account.qt.io/login or at another location designated by The Qt Company. + +The Designated User must provide adequate information and documentation to The +Qt Company to enable it to recreate the Error or problem for which the +Designated User has sought assistance. +To ensure efficient handling of Errors, the Designated User must provide the +following information, where relevant: +- A clear, detailed description of the problem, question or suggestion; +- Identification of which Licensed Software product and version is affected; +- Identification of the operating environment (e.g. operating system, hardware + Platform, build tools, etc.) on which the problem exists; +- On Standard Support: A complete and compilable test case of not more than 500 + lines of code that demonstrates the problem; +- On Premium Support: A complete and compilable test case that demonstrates the + problem or access to Application Code source codes. + +Additional relevant content, such as screenshots, etc. +Additional content should be included as attachments. The preferred image +formats are JPEG and PNG. Compressed content should be included in zip or +tar.gz archives. Executable content and documents in platform specific formats +such as Microsoft Office' are not accepted. + +In order for The Qt Company to provide prompt handling of Errors, the +Designated User shall promptly respond to any requests from The Qt Company for +additional information. + +2.3 Support Limitations + +General limitations: + +Each version or release of the Licensed Software will be Supported under +Standard Support or Premium Support only for limited time period as set forth +in doc.qt.io. For example, regular releases of Qt Software are supported for +one (1) year from the release date of the version x.y.0 and Long Term Support +(LTS) Releases are supported for a period of three (3) years from the release +date of the LTS version x.y.0. + +The Qt Company shall only provide Support for Designated User(s). + +Support is made available for the entire development teams only: It is not +allowed to purchase Support only for some members of the development team, and +all Designated Users of the respective development team must be eligible for +the same level of Support. + +Support is not provided for snapshots, preview releases, beta releases or +release candidates. + +The Qt Company shall have no obligation to provide Support for hardware or +operating system specific problems or problems arising from improper use, +accident, neglect or modification of Qt. + +Limitations with Install Support: + +Support limited to Error(s) regarding installation and setting up of the Qt +development environment on host Platforms. + +Limitations with Standard Support: + +The Qt Company shall not provide Support for third-party software or problems +caused by third-party software even if such third-party software is distributed +together with Licensed Software product(s). + +The Qt Company shall only provide Support for Error(s) that are reported on and +can be reproduced on Platforms that are officially supported for the release of +the Licensed Software. + +Limitations with Premium support: + +The Qt Company shall not provide Support for third-party software or problems +caused by third-party software. However, if such third-party software is +distributed together with Licensed Software, The Qt Company will make +commercially reasonable efforts to solve such problems. + +The Qt Company shall only provide Support for Error(s) that can be reproduced +on Platforms that are officially supported for the release of the Licensed +Software. If the Error is on a Platform that is not supported, The Qt Company +will make commercially reasonable efforts to provide a solution on closest +corresponding supported Platform. + +Premium Support is optional and purchased for an agreed bucket of hours +("Bucket"). Hours can be used by any Designated User in the respective +development team. To encourage continuous usage of the Support, ten percent +(10%) of the purchased Bucket shall automatically expire (regardless of whether +such support hours are actually used or not by the Licensee) each month after +three (3) months from the purchase of the Premium Support. + +2.4 Extended Support + +Extended Support extends the Support Validity Term for a release of Licensed +Software that is no longer generally supported. + +Extended Support includes and is by default provided with Standard Support +rules and limitations, unless Extended Support is purchased with Premium +Support in which case Premium Support rules and limitations will apply. + +Extended Support is optional and purchased with annual fee and separately per +each Licensee product. Extended Support will need definition of (i) Licensee +product, (ii) used Platform(s) and (iii) Licensed Software version(s). + +2.5 Tool Qualification Kit + +The Qt Company shall provide set of customized documents and validation tests +that enable Licensee to qualify QA testing tool for the purpose of ISO 26262, +EN 50128, DO-330, IEC 61508, IEC 62304 or IEC 13485 certification Licensee end +to end solution. + +3 RESPONSE TIME + +In performing Support, The Qt Company shall commit to following, non-binding, +Response Times: + +Standard Support: Errors and Support requests will have a Response Time not to +exceed two (2) business days. + +Premium Support: Errors and Support requests will have a Response Time not to +exceed one (1) business day. + +For complex issues, The Qt Company may provide an initial response to the +Designated User and then follow up, without undue delay, with additional +communication before an Error is properly addressed or Support provided. + +4 ADDITIONAL SERVICES IN PREMIUM SUPPORT + +The Designated User(s) will be assigned a Dedicated Contact to handle requests +for Support. Dedicated Contact is subject to change in cases such as sick +leave, vacation and other similar reasons. + +The Designated User(s) can on request ask The Qt Company to access their +computer remotely in order to resolve problems directly. + +The Designated User(s) can request a session via Instant Messaging or phone +call in the support request to The Qt Company. + +Premium Support can assist Licensee in implementing new features, bug fixes +and accessing patches in Licensed Software or Application Code. + +All Support requests will be handled with high priority. + +5 MAINTENANCE RELEASES, UPDATES AND UPGRADES + +Under the Support the Customer is eligible for Maintenance Releases and Updates +that The Qt Company generally makes available to customers who has purchased +Support. Unless otherwise decided by The Company at its free and absolute +discretion, Upgrades will not be provided under the Support. + +The primary focus of Maintenance Releases is product quality. Therefore, each +Maintenance Release typically includes the following types of changes to the +previous version of Licensed Software: +- Bug fixes caused by changes to previously working code; +- Fixes related to build issues on supported Platforms; +- Error corrections specific to a single Platform that are not present on other + Platforms; +- Critical Error corrections such as crashes, data corruption, loss of data, + race conditions; and +- Updates to documentation and license information when deemed necessary by + The Qt Company. + +The primary focus of Updates is introducing new features to Licensed Software +and covering new platforms. Therefore, each Updates typically includes the +following types of changes to the previous version of Licensed Software: +- New platform support; +- New toolchain support; +- New features and Qt modules; + +6 WARRANTY DISCLAIMER + +The Qt Company makes no warranties that the Support provided will be successful +in resolving any difficulties or problems or in diagnosing faults reported by +Licensee. Support is provided to Licensee on an "as is" basis. To the maximum +extent permitted by applicable law, The Qt Company disclaims all warranties and +conditions, either express or implied, including, but not limited to, implied +warranties of merchantability and fitness for a particular purpose for the +Support provided by The Qt Company to Licensee. + +APPENDIX 10: CONVERSION TO SUBSCRIPTION + +Subject to the terms of this Appendix Licensee's current development licenses +("Current Licenses") for commercial version of Qt Software and the license +agreements governing such Current Licenses ("Existing Agreements") are being +replaced by this Agreement and subscription based Development Licenses +governed hereunder, as further specified below. + ++---------------------------------------------------------------------------+ +| Existing Agreement(s) | and | +| signing parties, version | | +| thereof | | ++---------------------------------------------------------------------------+ + +Parties hereby agree on conversion of Current Licenses listed in attached +Exhibit A to the subscription licenses listed in attached Exhibit B for use +through License Term. As of the date hereof, + +i. Licensee's Current Licenses as listed in Exhibit A shall terminate and be +replaced with the Subscription licenses listed in Exhibit B and; +ii. Existing Agreements are terminated. + +Prices for the conversion of Current Licenses are defined in Appendix 2 +Pricing or Quote. + +Notwithstanding anything in this Appendix to the contrary, and in addition to +any payments due pursuant to this Appendix, Licensee remains fully obligated to +fulfill any and all outstanding payment obligations to The Qt Company under any +applicable Existing Agreements. For the avoidance of doubt, if any payments +remain outstanding on the Current Licenses under the applicable terms Licensee +will continue to make such payments in accordance with the applicable order +documentation, notwithstanding the fact that the Current Licenses are being +converted to Development Licenses pursuant to this Appendix. diff --git a/.QT-FOR-APPLICATION-DEVELOPMENT-LICENSE-AGREEMENT b/.QT-FOR-APPLICATION-DEVELOPMENT-LICENSE-AGREEMENT deleted file mode 100644 index 386577c6..00000000 --- a/.QT-FOR-APPLICATION-DEVELOPMENT-LICENSE-AGREEMENT +++ /dev/null @@ -1,1315 +0,0 @@ -QT LICENSE AGREEMENT -Agreement version 4.3 - -This Qt License Agreement ("Agreement") is a legal agreement for the licensing -of Licensed Software (as defined below) between The Qt Company (as defined -below) and the Licensee who has accepted the terms of this Agreement by -downloading or using the Licensed Software and/or as defined herein: - -Capitalized terms used herein are defined in Section 1. - -WHEREAS: - (A) Licensee wishes to use the Licensed Software for the purpose of - developing and distributing Applications and/or Devices (each as - defined below); and - (B) The Qt Company is willing to grant the Licensee a right to use - Licensed Software for such a purpose pursuant to term and conditions - of this Agreement. - -NOW, THEREFORE, THE PARTIES HEREBY AGREE AS FOLLOWS: - -1. DEFINITIONS - -"Affiliate" of a Party shall mean an entity (i) which is directly -or indirectly controlling such Party; (ii) which is under the same direct or -indirect ownership or control as such Party; or (iii) which is directly or -indirectly owned or controlled by such Party. For these purposes, an entity -shall be treated as being controlled by another if that other entity has fifty -percent (50 %) or more of the votes in such entity, is able to direct its -affairs and/or to control the composition of its board of directors or -equivalent body. - -"Add-on Products" shall mean The Qt Company's specific add-on software products -(for example Qt Safe Renderer, Qt for Automation, Qt Application Manager), which -are not licensed as part of The Qt Company's standard offering, but shall be -included into the scope of Licensed Software only if so specifically agreed -between the Parties. - -"Applications" shall mean Licensee's software products created using the -Licensed Software, which may include the Redistributables, or part thereof. - -"Contractor(s)" shall mean third party consultants, distributors and contractors -performing services to the Licensee under applicable contractual arrangement. - -"Customer(s)" shall mean Licensee's end users to whom Licensee, directly or -indirectly, distributes copies of the Redistributables. - -"Data Protection Legislation" shall mean the General Data Protection Regulation -(EU 2016/679) (GDPR) and any national implementing laws, regulations and -secondary legislation, as may be amended or updated from time to time, as well -as any other data protection laws or regulations applicable in relevant -territory. - -"Deployment Platforms" shall mean operating systems and/or hardware specified -in the License Certificate, on which the Redistributables can be distributed -pursuant to the terms and conditions of this Agreement. - -"Designated User(s)" shall mean the employee(s) of Licensee or Licensee's -Affiliates acting within the scope of their employment or Licensee's Contractors -acting within the scope of their services for Licensee and on behalf of -Licensee. Designated Users shall be named in the License Certificate. - -"Development License" shall mean the license needed by the Licensee for each -Designated User to use the Licensed Software under the license grant described -in Section 3.1 of this Agreement. Development Licenses are available per -respective Licensed Software products, each product having its designated scope -and purpose of use. Distribution Licenses are always connected to Qt for Device -Creation product and Qt for MCUs product only. - -"Development Platforms" shall mean those operating systems specified in the -License Certificate, in which the Licensed Software can be used under the -Development License, but not distributed in any form or used for any other purpose. - -"Devices" shall mean hardware devices or products that 1) are manufactured -and/or distributed by the Licensee or its Affiliates or Contractors, and (2)(i) -incorporate or integrate the Redistributables or parts thereof; or (ii) where -the main user interface or substantial functionality of such unit , when used by -a Customer, is provided by Application(s) or otherwise depends on the Licensed -Software, regardless of whether the Redistributables are distributed together -with the hardware or not. Devices covered with this Agreement shall be specified -in Appendix 2 or in a quote. - -"Distribution License(s)" shall mean the license required for any kind of sale, -trade, exchange, loan, lease, rental or other distribution by or on behalf of -Licensee to a third party of Redistributables in connection with Devices -ursuant to license grant described in Section 3.3 of this Agreement. - -"Distribution License Packs" shall mean set of prepaid Distribution Licenses for -distribution of Redistributables, as defined in The Qt Company's standard price -list, quote, Purchase Order confirmation or in an appendix hereto, as the case -may be. - -"Intellectual Property Rights" shall mean patents (including utility models), -design patents, and designs (whether or not capable of registration), chip -topography rights and other like protection, copyrights, trademarks, service -marks, trade names, logos or other words or symbols and any other form of -statutory protection of any kind and applications for any of the foregoing as -well as any trade secrets. - -"License Certificate" shall mean a certificate generated by The Qt Company for -each Designated User respectively upon them downloading the Licensed Software, -which will be available under respective Designated User's Qt Account at -account.qt.io. License Certificates will specify the Designated User, the -Development Platforms, Deployment Platforms and the License Term. Such terms are -considered part of the licenses granted hereunder and shall be updated from time -to time to reflect any agreed changes to the foregoing terms relating to -Designated User's rights to the Licensed Software. - -"License Fee" shall mean the fee charged to the Licensee for rights granted -under the terms of this Agreement. - -"License Term" shall mean the agreed validity period of the Development License -of the respective Designated User, during which time the Designated User is -entitled to use the Licensed Software, as set forth in the respective License -Certificate. - -"Licensed Software" shall mean either - (i) Qt for Application Development or - (ii) Qt for Device Creation, and/or - (iii) Qt 3D Studio, and/or - (iv) Qt Design Studio, and/or - (v) Qt for MCUs, and/or - (vi) selected Add-on Products, if any, - -depending on which product(s) the Licensee has purchased under this Agreement, -as well as corresponding online or electronic documentation, associated media -and printed materials, including the source code (where applicable), example -programs and the documentation, licensed to the Licensee under this Agreement. -Licensed Software does not include Third Party Software (as defined in -Section 4) or Open Source Qt. The Qt Company may, in the course of its -development activities, at its free and absolute discretion and without any -obligation to send or publish any notifications to the Licensee or in general, -make changes, additions or deletions in the components and functionalities of -the Licensed Software, provided that no such changes, additions or deletions -will affect the already released version of the Licensed Software, but only -upcoming version(s). - -"Licensee" shall mean the individual or legal entity that is party to this -Agreement, as identified on the signature page hereof. - -"Licensee's Records" shall mean books and records that are likely to contain -information bearing on Licensee's compliance with this Agreement, Licensee's use -of Open Source Qt and/or the payments due to The Qt Company under this -Agreement, including, but not limited to user information, assembly logs, sales -records and distribution records. - -"Modified Software" shall have the meaning as set forth in Section 2.3. - -"Online Services" shall mean any services or access to systems made available by -The Qt Company to the Licensee over the Internet relating to the Licensed -Software or for the purpose of use by the Licensee of the Licensed Software or -Support. Use of any such Online Services is discretionary for the Licensee and -some of them may be subject to additional fees. - -"Open Source Qt" shall mean the non-commercial Qt computer software products, -licensed under the terms of the GNU Lesser General Public License, version 2.1 -or later ("LGPL") or the GNU General Public License, version 2.0 or later -("GPL"). For clarity, Open Source Qt shall not be provided nor governed under -this Agreement. - -"Party" or "Parties" shall mean Licensee and/or The Qt Company. - -"Permitted Combination" shall have the meaning as set forth in Section -3.4(viii). - -"Pre-Release Code" shall have the meaning as set forth in Section 4. - -"Prohibited Combination" shall mean any means to (i) use, combine, incorporate, -link or integrate Licensed Software with any software created with or -incorporating Open Source Qt, (ii) use Licensed Software for creation of any -software created with or incorporating Open Source Qt, or (iii) incorporate or -integrate Applications into a hardware device or product other than a Device. - -"Qt 3D Studio" shall mean The Qt Company's productized offering, which consist -of all versions of modules and tools as set forth in Appendix 1. - -"Qt Design Studio" shall mean The Qt Company's productized offering, which -consist of all versions of modules and tools as set forth in Appendix 1. - -"Qt for Application Development" shall mean The Qt Company's productized -offering, which consist of all versions of modules and tools as set forth in -Appendix 1. - -"Qt for Device Creation" shall mean The Qt Company's productized offering, -which consist of all versions of modules and tools as set forth in Appendix 1. - -"Qt for MCUs" shall mean The Qt Company's productized offering, which consist -of all versions of modules and tools as set forth in Appendix 1. - -"Redistributables" shall mean the portions of the Licensed Software set forth -in Appendix 1 that may be distributed pursuant to the terms of this Agreement -in object code form only, including any relevant documentation. Where -relevant, any reference to Licensed Software in this Agreement shall include -and refer also to Redistributables. - -"Renewal Term" shall mean an extension of previous License Term as agreed -between the Parties. - -"Submitted Modified Software" shall have the meaning as set forth in Section -2.3. - -"Support" shall mean standard developer support that is provided by The Qt -Company to assist Designated Users in using the Licensed Software in accordance -with The Qt Company's standard support terms available at -https://www.qt.io/terms-conditions/ and as further defined in Section 8 -hereunder. - -"Taxes" shall have the meaning set forth in Section 10.5. - -"Term" shall have the meaning set forth in Section 12. - -"The Qt Company" shall mean: - (i) in the event Licensee is an individual residing in the United States - or a legal entity incorporated in the United States or having its - headquarters in the United States, The Qt Company Inc., a - Delaware corporation with its office at 2350 Mission College Blvd., - Suite 1020, Santa Clara, CA 95054, USA.; or - (ii) in the event the Licensee is an individual residing outside of the - United States or a legal entity incorporated outside of the United - States or having its registered office outside of the United States, - The Qt Company Ltd., a Finnish company with its registered office - at Bertel Jungin aukio D3A, 02600 Espoo, Finland. - -"Third-Party Software" shall have the meaning set forth in Section 4. - -"Updates" shall mean a release or version of the Licensed Software containing -bug fixes, error corrections and other changes that are generally made available -to users of the Licensed Software that have contracted for Support. Updates are -generally depicted as a change to the digits following the decimal in the -Licensed Software version number. The Qt Company shall make Updates available to -the Licensee under the Support. Updates shall be considered as part of the -Licensed Software hereunder. - -"Upgrades" shall mean a release or version of the Licensed Software containing -enhancements and new features and are generally depicted as a change to the -first digit of the Licensed Software version number. In the event Upgrades are -provided to the Licensee under this Agreement, they shall be considered as part -of the Licensed Software hereunder. - -2. OWNERSHIP - -2.1. Ownership of The Qt Company -The Licensed Software is protected by copyright laws and international copyright -treaties, as well as other intellectual property laws and treaties. The Licensed -Software is licensed, not sold. - -All of The Qt Company's Intellectual Property Rights are and shall remain the -exclusive property of The Qt Company or its licensors respectively. - -2.2. Ownership of Licensee -All the Licensee's Intellectual Property Rights are and shall remain the -exclusive property of the Licensee or its licensors respectively. - -All Intellectual Property Rights to the Modified Software, Applications and Devices -shall remain with the Licensee and no rights thereto shall be granted by the -Licensee to The Qt Company under this Agreement (except as set forth in Section -2.3 below). - -2.3. Modified Software -Licensee may create bug-fixes, error corrections, patches or modifications to -the Licensed Software ("Modified Software"). Such Modified Software may break -the source or binary compatibility with the Licensed Software (including without -limitation through changing the application programming interfaces ("API") or by -adding, changing or deleting any variable, method, or class signature in the -Licensed Software and/or any inter-process protocols, services or standards in -the Licensed Software libraries). To the extent that Licensee's Modified -Software so breaks source or binary compatibility with the Licensed Software, -Licensee acknowledges that The Qt Company's ability to provide Support may be -prevented or limited and Licensee's ability to make use of Updates may be restricted. - -Licensee may, at its sole and absolute discretion, choose to submit Modified -Software to The Qt Company ("Submitted Modified Software") in connection with -Licensee's Support request, service request or otherwise. In the event Licensee -does so, then, Licensee hereby grants The Qt Company a sublicensable, -assignable, irrevocable, perpetual, worldwide, non-exclusive, royalty-free and -fully paid-up license, under all of Licensee's Intellectual Property Rights, to -reproduce, adapt, translate, modify, and prepare derivative works of, publicly -display, publicly perform, sublicense, make available and distribute such -Submitted Modified Software as The Qt Company sees fit at its free and absolute -discretion. - -3. LICENSES GRANTED - -3.1. Development with Licensed Software -Subject to the terms of this Agreement, The Qt Company grants to Licensee a -worldwide, non-exclusive, non-transferable license, valid for the License Term, -to use, modify and copy the Licensed Software by Designated Users on the -Development Platforms for the sole purposes of designing, developing, -demonstrating and testing Application(s) and/or Devices, and to provide thereto -related support and other related services to end-user Customers. Each -Application and/or Device can only include, incorporate or integrate code -generated under this Agreement by such Designated Users who are duly licensed -for the applicable Development Platform(s) and Deployment Platform(s) (i.e have -a valid license for the appropriate Licensed Software product). - -Licensee may install copies of the Licensed Software on five (5) computers per -Designated User, provided that only the Designated Users who have a valid -Development License may use the Licensed Software. - -Licensee may at any time designate another Designated User to replace a -then-current Designated User by notifying The Qt Company in writing, provided -that any Designated User may be replaced only once during any six-month period. - -Upon expiry of the initially agreed License Term, the respective License Terms -shall be automatically extended to one or more Renewal Term(s), unless and -until either Party notifies the other Party in writing, or any other method -acceptable to The Qt Company, that it does not wish to continue the License -Term, such notification to be provided to the other Party no less than thirty -(30) days before expiry of the respective License Term. - -Unless otherwise agreed between the Parties, Renewal Term shall be of equal -length with the initial License Term. - -Any such Renewal Term shall be subject to License Fees agreed between the -Parties or, if no advance agreement exists, subject to The Qt Company's standard -pricing applicable at the commencement date of any such Renewal Term. - -Any price or other term specified for a Renewal Term shall be valid only for the -specified time. - -The Qt Company may either request the Licensee to place a purchase order -corresponding to a quote by The Qt Company, or uses Licensees stored Credit -Card information in the QtAccount to automatically charge the Licensee for the -relevant Renewal Term. - -In the event Licensee does not prevent auto-renewal pursuant the above, but a -Renewal Term is nevertheless not duly ordered within 30 days from the date of -the respective notification from The Qt Company and/or the respective License -Fee paid by due date specified in The Qt Company's respective invoice, The Qt -Company shall apply a reinstatement fee equal to ten percent (10 %) of the -total value of the License Fees of the Development Licenses for the expired -term to be added to the License Fee of the respective Renewal Term. - -In the event Licensee chooses not to renew a Development License for a Renewal -Term by notifying The Qt Company thereof no less than thirty (30) days before -expiry of the respective License Term, Licensee may still reinstate such -expired Development Licenses for a Renewal Term subject to applicable renewal -Term License Fees until thirty (30) days from the expiry of the initially -agreed License Term or preceding Renewal Term. After such thirty (30) day -period a Development License shall be subject to applicable License Fees for -a new Development License and not any Renewal Term License Fees. - -3.2. Distribution of Applications -Subject to the terms of this Agreement, The Qt Company grants to Licensee -a worldwide, non-exclusive, non-transferable, revocable (for cause pursuant to -this Agreement) right and license, valid for the Term, to - (i) distribute, by itself or through its Contractors, Redistributables as - installed, incorporated or integrated into Applications for execution - on the Deployment Platforms, and - (ii) grant sublicenses to Redistributables, as distributed hereunder, for - Customers solely for Customer's internal use and to the extent - necessary in order for the Customers to use the Applications for their - respective intended purposes. - -Right to distribute the Redistributables as part of an Application as provided -herein is not royalty-bearing but is conditional upon the Licensee not having -any unpaid License Fees for Development Licenses owed to The Qt Company at the -time of distribution of any Redistributables to Customers. - -3.3. Distribution of Devices -Subject to the terms of this Agreement, The Qt Company grants to Licensee a -worldwide, non-exclusive, non-transferable, revocable (for cause pursuant to -this Agreement) right and license, valid for the Term, to - (i) distribute, by itself or through one or more tiers of Contractors, - Redistributables as installed, incorporated or integrated, or intended - to be installed, incorporated or integrated into Devices for execution - on the Deployment Platforms, and - (ii) grant sublicenses to Redistributables, as distributed hereunder, for - Customers solely for Customer's internal use and to the extent - necessary in order for the Customers to use the Devices for their - respective intended purposes. - -Right to distribute the Redistributables with Devices as provided herein is -conditional upon the Licensee (i) not having any unpaid License Fees for -Development Licenses owed to The Qt Company, and (ii) having purchased and paid -corresponding Distribution Licenses at the time of distribution of any -Redistributables to Customers. - -3.4. Further Requirements -The licenses granted above in this Section 3 by The Qt Company to Licensee are -conditional and subject to Licensee's compliance with the following terms: - (i) Licensee shall not remove or alter any copyright, trademark or other - proprietary rights notice(s) contained in any portion of the Licensed - Software; - (ii) Applications must add primary and substantial functionality to the - Licensed Software so as not to compete with the Licensed Software; - (iii) Applications may not pass on functionality which in any way makes it - possible for others to create software with the Licensed Software; - provided however that Licensee may use the Licensed Software's - scripting and QML ("Qt Quick") functionality solely in order to - enable scripting, themes and styles that augment the functionality - and appearance of the Application(s) without adding primary and - substantial functionality to the Application(s); - (iv) Licensee shall not use Licensed Software in any manner or for any - purpose that infringes, misappropriates or otherwise violates any - Intellectual property or right of any third party, or that violates - any applicable law; - (v) Licensee shall not use The Qt Company's or any of its suppliers' - names, logos, or trademarks to market Applications, except that - Licensee may use "Built with Qt" logo to indicate that - Application(s) was developed using the Licensed Software; - (vi) Licensee shall not distribute, sublicense or disclose source code - of Licensed Software to any third party (provided however that - Licensee may appoint employee(s) of Contractors as Designated - Users to use Licensed Software pursuant to this Agreement). Such - right may be available for the Licensee subject to a separate - software development kit ("SDK") license agreement to be concluded - with The Qt Company; - (vii) Licensee shall not grant the Customers a right to (i) make copies of - the Redistributables except when and to the extent required to use the - Applications and/or Devices for their intended purpose, (ii) modify - the Redistributables or create derivative works thereof, (iii) - decompile, disassemble or otherwise reverse engineer Redistributables, - or (iv) redistribute any copy or portion of the Redistributables to - any third party, except as part of the onward sale of the Device on - which the Redistributables are installed; - (viii) Licensee shall not and shall cause that its Affiliates or - Contractors shall not use Licensed Software in any Prohibited - Combination, unless Licensee has received an advance written - permission from The Qt Company to do so. Absent such written - permission, any and all distribution by the Licensee during the Term - of a hardware device or product a) which incorporate or integrate any - part of Licensed Software or Open Source Qt; or b) where the main - user interface or substantial functionality is provided by software - built with Licensed Software or Open Source Qt or otherwise depends - on the Licensed Software or Open Source Qt, shall be considered to be - Device distribution under this Agreement and shall be dependent on - Licensee's compliance thereof (including but not limited to - obligation to pay applicable License Fees for such distribution). - Notwithstanding what is provided above in this sub-section (viii), - Licensee is entitled to use and combine Licensed Software with any - Permitted Software; - (ix) Licensee shall cause all of its Affiliates and Contractors entitled - to make use of the licenses granted under this Agreement, to be - contractually bound to comply with the relevant terms of this - Agreement and not to use the Licensed Software beyond the terms - hereof and for any purposes other than operating within the scope - of their services for Licensee. Licensee shall be responsible for - any and all actions and omissions of its Affiliates and Contractors - relating to the Licensed Software and use thereof (including but not - limited to payment of all applicable License Fees); - (x) Except when and to the extent explicitly provided in this Section 3, - Licensee shall not transfer, publish, disclose, display or otherwise - make available the Licensed Software; and - (xi) Licensee shall not attempt or enlist a third party to conduct or - attempt to conduct any of the above. - -Above terms shall not be applicable if and to the extent they conflict with any -mandatory provisions of any applicable laws. -Any use of Licensed Software beyond the provisions of this Agreement is -strictly prohibited and requires an additional license from The Qt Company. - -4. THIRD-PARTY SOFTWARE - -The Licensed Software may provide links to third party libraries or code -(collectively "Third-Party Software") to implement various functions. -Third-Party Software does not comprise part of the Licensed Software. In some -cases, access to Third-Party Software may be included with the Licensed -Software. Such Third-Party Software will be listed in the ".../src/3rdparty" -source tree delivered with the Licensed Software or documented in the Licensed -Software, as such may be amended from time to time. Licensee acknowledges that -use or distribution of Third-Party Software is in all respects subject to -applicable license terms of applicable third-party right holders. - -5. PRE-RELEASE CODE - -The Licensed Software may contain pre-release code and functionality, or sample -code marked or otherwise stated with appropriate designation such as "Technology -Preview", "Alpha", "Beta", "Sample" etc. ("Pre-Release Code"). - -Such Pre-Release Code may be present complimentary for the Licensee, in order to -provide experimental support or information for new platforms or preliminary -versions of one or more new functionalities or for other similar reasons. The -Pre-Release Code may not be at the level of performance and compatibility of a -final, generally available, product offering. The Pre-Release Code may not -operate correctly, may contain errors and may be substantially modified by The -Qt Company prior to the first commercial product release, if any. The Qt -Company is under no obligation to make Pre-Release Code commercially available, -or provide any Support or Updates relating thereto. The Qt Company assumes no -liability whatsoever regarding any Pre-Release Code, but any use thereof is -exclusively at Licensee's own risk and expense. - -For clarity, unless Licensed Software specifies different license terms for -the respective Pre-Release Code, the Licensee is entitled to use such -pre-release code pursuant to Section 3, just like other Licensed Software, -provided however that in the event Add-on Products are included and available -as such Pre-Release Code, Licensee's right to use such Add-on Products is -nevertheless subject to and conditional upon conclusion of separate agreement -with The Qt Company. - -6. LIMITED WARRANTY AND WARRANTY DISCLAIMER - -The Qt Company hereby represents and warrants that it has the power and -authority to grant the rights and licenses granted to Licensee under this -Agreement. - -Except as set forth above, the Licensed Software is licensed to Licensee -"as is" and Licensee's exclusive remedy and The Qt Company's entire liability -for errors in the Licensed Software shall be limited, at The Qt Company's -option, to correction of the error, replacement of the Licensed Software or -return of the applicable fees paid for the defective Licensed Software for -the time period during which the License is not able to utilize the Licensed -Software under the terms of this Agreement. - -TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, THE QT COMPANY ON BEHALF OF -ITSELF AND ITS LICENSORS, SUPPLIERS AND AFFILIATES, DISCLAIMS ALL OTHER -WARRANTIES, EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, ANY IMPLIED -WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND -NON-INFRINGEMENT WITH REGARD TO THE LICENSED SOFTWARE. THE QT COMPANY DOES -NOT WARRANT THAT THE LICENSED SOFTWARE WILL SATISFY LICENSEE'S REQUIREMENTS OR -THAT IT WILL OPERATE WITHOUT DEFECT OR ERROR OR THAT THE OPERATION THEREOF -WILL BE UNINTERRUPTED. - -7. INDEMNIFICATION AND LIMITATION OF LIABILITY - -7.1. Limitation of Liability -EXCEPT FOR (I) CASES OF GROSS NEGLIGENCE OR INTENTIONAL MISCONDUCT, AND (II) -BREACH OF CONFIDENTIALITY, AND TO THE EXTENT PERMITTED BY APPLICABLE LAW, IN NO -EVENT SHALL EITHER PARTY BE LIABLE TO THE OTHER PARTY FOR ANY LOSS OF PROFIT, -LOSS OF DATA, LOSS OF BUSINESS OR GOODWILL OR ANY OTHER INDIRECT, SPECIAL, -CONSEQUENTIAL, INCIDENTAL OR PUNITIVE COST, DAMAGES OR EXPENSE OF ANY KIND, -HOWSOEVER ARISING UNDER OR IN CONNECTION WITH THIS AGREEMENT. - -EXCEPT FOR (I) CASES OF GROSS NEGLIGENCE OR INTENTIONAL MISCONDUCT, AND (II) -BREACH OF CONFIDENTIALITY, AND TO THE EXTENT PERMITTED BY APPLICABLE LAW, IN NO -EVENT SHALL EITHER PARTY'S TOTAL AGGREGATE LIABILITY UNDER THIS AGREEMENT EXCEED -THE AGGREGATE LICENSE FEES PAID OR PAYABLE TO THE QT COMPANY FROM LICENSEE -DURING THE PERIOD OF TWELVE (12) MONTHS IMMEDIATELY PRECEDING THE EVENT -RESULTING IN SUCH LIABILITY. - -THE PROVISIONS OF THIS SECTION 7 ALLOCATE THE RISKS UNDER THIS AGREEMENT -BETWEEN THE QT COMPANY AND LICENSEE AND THE PARTIES HAVE RELIED UPON THE -LIMITATIONS SET FORTH HEREIN IN DETERMINING WHETHER TO ENTER INTO THIS -AGREEMENT. - -NOTWITHSTANDING ANYTHING TO THE CONTRARY IN THIS AGREEMENT, LICENSEE SHALL -ALWAYS BE LIABLE TO PAY THE APPLICABLE LICENSE FEES CORRESPONDING TO ITS ACTUAL -USE OF LICENSED SOFTWARE. - -8. SUPPORT, UPDATES AND ONLINE SERVICES - -Upon due payment of the agreed License Fees the Licensee will be eligible to -receive Support and Updates and to use the Online Services during the License -Term, provided, however, that in the event the License Term is longer than 36 -months, the initial payment includes Support for only the first 12 months, -unless the Parties specifically otherwise agree. - -Unless otherwise decided by The Company at its free and absolute discretion, -Upgrades will not be included in the Support but may be available subject to -additional fees. - -From time to time The Qt Company may change the Support terms, provided that -during the respective ongoing License Term the level of Support provided by The -Qt Company may not be reduced without the consent of the Licensee. - -Unless otherwise agreed, The Qt Company shall not be responsible for providing -any service or support to Customers. - -9. CONFIDENTIALITY - -Each Party acknowledges that during the Term of this Agreement each Party may -receive information about the other Party's business, business methods, -business plans, customers, business relations, technology, and other -information, including the terms of this Agreement, that is confidential and -of great value to the other Party, and the value of which would be -significantly reduced if disclosed to third parties ("Confidential -Information"). Accordingly, when a Party (the "Receiving Party") receives -Confidential Information from the other Party (the "Disclosing Party"), the -Receiving Party shall only disclose such information to employees and -Contractors on a need to know basis, and shall cause its employees and -employees of its Affiliates to: (i) maintain any and all Confidential -Information in confidence; (ii) not disclose the Confidential Information to -a third party without the Disclosing Party's prior written approval; and (iii) -not, directly or indirectly, use the Confidential Information for any purpose -other than for exercising its rights and fulfilling its responsibilities -pursuant to this Agreement. Each Party shall take reasonable measures to -protect the Confidential Information of the other Party, which measures shall -not be less than the measures taken by such Party to protect its own -confidential and proprietary information. - -Obligation of confidentiality shall not apply to information that (i) is or -becomes generally known to the public through no act or omission of the -Receiving Party; (ii) was in the Receiving Party's lawful possession prior -to the disclosure hereunder and was not subject to limitations on disclosure -or use; (iii) is developed independently by employees or Contractors of the -Receiving Party or other persons working for the Receiving Party who have not -had access to the Confidential Information of the Disclosing Party, as proven -by the written records of the Receiving Party; (iv) is lawfully disclosed to -the Receiving Party without restrictions, by a third party not under an -obligation of confidentiality; or (v) the Receiving Party is legally compelled -to disclose, in which case the Receiving Party shall notify the Disclosing -Party of such compelled disclosure and assert the privileged and confidential -nature of the information and cooperate fully with the Disclosing Party to -limit the scope of disclosure and the dissemination of disclosed Confidential -Information to the minimum extent necessary. - -The obligations under this Section 9 shall continue to remain in force for a -period of five (5) years after the last disclosure, and, with respect to trade -secrets, for so long as such trade secrets are protected under applicable -trade secret laws. - -10. FEES, DELIVERY AND PAYMENT - -10.1. License Fees -License Fees are described in The Qt Company's standard price list, quote or -Purchase Order confirmation or in an appendix hereto, as the case may be. - -The License Fees shall not be refunded or claimed as a credit in any event or -for any reason whatsoever. - -10.2. Ordering Licenses -Licensee may purchase Development Licenses and Distribution Licenses pursuant -to agreed pricing terms or, if no specific pricing terms have been agreed -upon, at The Qt Company's standard pricing terms applicable at the time of -purchase. Unless specifically otherwise provided, any pricing terms -referenced in this Agreement shall be valid for twelve (12) months from the -date of this Agreement. - -Licensee shall submit all purchase orders for Development Licenses and -Distribution Licenses to The Qt Company by email or any other method -acceptable to The Qt Company (each such order is referred to herein as a -"Purchase Order") for confirmation, whereupon the Purchase Order shall -become binding between the Parties. - -10.3. Distribution License Packs -Unless otherwise agreed, Distribution Licenses shall be purchased by way of -Distribution License Packs. - -Upon due payment of the ordered Distribution License Pack(s), the Licensee -will have an account of Distribution Licenses available for distributing -the Redistributables in accordance with this Agreement. - -Each time Licensee distributes a copy of Redistributables, then one -Distribution License is used, and Licensee's account of available -Distribution Licenses is decreased accordingly. - -Licensee may distribute copies of the Redistributables so long as Licensee -has Distribution Licenses remaining on its account. - -10.4. Payment Terms -License Fees and any other charges under this Agreement shall be paid by -Licensee no later than thirty (30) days from the date of the applicable -invoice from The Qt Company. - -The Qt Company will submit an invoice to Licensee after the date of this -Agreement and/or after The Qt Company receives a Purchase Order from Licensee. - -A late payment charge of the lower of (a) one percent per month; or (b) the -interest rate stipulated by applicable law, shall be charged on any unpaid -balances that remain past due. - -10.5. Taxes -All License Fees and other charges payable hereunder are gross amounts but -exclusive of any value added tax, use tax, sales tax, withholding tax and -other taxes, duties or tariffs ("Taxes") levied directly for the sale, -delivery or use of Licensed Software hereunder pursuant to any applicable -law. Such applicable Taxes shall be paid by Licensee to The Qt Company, or, -where applicable, in lieu of payment of such Taxes to The Qt Company, -Licensee shall provide an exemption certificate to The Qt Company and any -applicable authority. - -11. RECORD-KEEPING AND REPORTING OBLIGATIONS; AUDIT RIGHTS - -11.1. Licensee's Record-keeping -Licensee shall at all times during the Term of this Agreement and for a -period of seven (7) years thereafter maintain Licensee's Records in an -accurate and up-to-date form. Licensee's Records shall be adequate to -reasonably enable The Qt Company to determine Licensee's compliance with -the provisions of this Agreement. The records shall conform to general -good accounting practices. - -Licensee shall, within thirty (30) days from receiving The Qt Company's -request to that effect, deliver to The Qt Company a report based on -Licensee's Records, such report to contain information, in sufficient -detail, on (i) number and identity of users working with Licensed Software -or Open Source Qt, (ii) copies of Redistributables distributed by Licensee -during the most recent calendar quarter and/or any other term specified by -The Qt Company, (iii) number of undistributed copies of Redistributables -and corresponding number of unused Distribution Licenses remaining on -Licensee's account, and (iv) any other information as The Qt Company may -reasonably require from time to time. - -11.2. The Qt Company's Audit Rights -The Qt Company or an independent auditor acting on behalf of The Qt -Company's, may, upon at least five (5) business days' prior written -notice and at its expense, audit Licensee with respect to the Licensee's -use of the Licensed Software, but not more frequently than once during -each 6-month period. Such audit may be conducted by mail, electronic means -or through an in-person visit to Licensee's place of business. Any such -in-person audit shall be conducted during regular business hours at -Licensee's facilities and shall not unreasonably interfere with Licensee's -usiness activities. The Qt Company or the independent auditor acting on -behalf of The Qt Company shall be entitled to inspect Licensee's Records -and conduct necessary interviews of Licensee's relevant employees and -Contractors. All such Licensee's Records and use thereof shall be subject -to an obligation of confidentiality under this Agreement. - -If an audit reveals that Licensee is using the Licensed Software beyond -scope of the licenses Licensee has paid for, Licensee agrees to pay The Qt -Company any amounts owed for such unauthorized use within 30 days from -receipt of the corresponding invoice from The Qt Company. - -In addition, in the event the audit reveals a material violation of the -terms of this Agreement (without limitation, either (i) underpayment of -more than 10 % of License Fees or 10,000 euros (whichever is more) or -(ii) distribution of products, which include or result from Prohibited -Combination, shall be deemed a material violation for purposes of this -section), then the Licensee shall pay The Qt Company's reasonable cost of -conducting such audit. - -12. TERM AND TERMINATION -12.1. Agreement Term -This Agreement shall enter into force upon due acceptance by both -Parties and remain in force for as long as there is any Development -License(s) purchased under this Agreement in force ("Term"), unless and -until terminated pursuant to the terms of this Section 12. - -12.2. Termination and suspension of rights -Either Party shall have the right to terminate this Agreement upon thirty -(30) days prior written notice if the other Party commits a material -breach of any obligation of this Agreement and fails to remedy such breach -within such notice period. - -Instead of termination, The Qt Company shall have the right to suspend or -withhold grants of all rights to the Licensed Software hereunder, -including but not limited to the Development Licenses, Distribution -License, and Support, should Licensee fail to make payment in timely -fashion or otherwise violates or is reasonably suspected to violate its -obligations or terms of this Agreement, and where such violation or breach -is not cured within five (5) business days following The Qt Company's -written notice thereof. - -12.3. Mutual Right to Terminate -Either Party shall have the right to terminate this Agreement immediately -upon written notice in the event that the other Party becomes insolvent, -files for any form of bankruptcy, makes any assignment for the benefit of -creditors, has a receiver, administrative receiver or officer appointed -over the whole or a substantial part of its assets, ceases to conduct -business, or an act equivalent to any of the above occurs under the laws -of the jurisdiction of the other Party. - -12.4. Parties' Rights and Duties upon Termination -Upon expiry or termination of the Agreement, Licensee shall cease and -shall cause all Designated Users (including those of its Affiliates' and -Contractors') to cease using the Licensed Software and distribution of the -Redistributables under this Agreement. - -Notwithstanding the above, in the event the Agreement expires or is terminated: - (i) as a result of The Qt Company choosing not to renew the Development - License(s) as set forth in Section 3.1, and where such decision of - non-renewal is not due to any ongoing breach or alleged breach (as - reasonably determined by The Qt Company) by Licensee of the terms of this - Agreement or any applicable license terms of Open Source Qt, then all valid - licenses possessed by the Licensee at such date shall be extended to be - valid in perpetuity under the terms of this Agreement and Licensee is - entitled to purchase additional licenses as set forth in Section 10.2; or - (ii) for reason other than by The Qt Company pursuant to item (i) above - or pursuant to Section 12.2, then the Licensee is entitled, for a - period of six (6) months after the effective date of termination, - to continue distribution of Devices under the Distribution Licenses - paid but unused at such effective date of termination. - -Upon any such termination the Licensee shall destroy or return to The Qt -Company all copies of the Licensed Software and all related materials and will -certify the same to The Qt Company upon its request, provided however that -Licensee may retain and exploit such copies of the Licensed Software as it may -reasonably require in providing continued support to Customers. - -Expiry or termination of this Agreement for any reason whatsoever shall not -relieve Licensee of its obligation to pay any License Fees accrued or payable -to The Qt Company prior to the effective date of termination, and Licensee -shall immediately pay to The Qt Company all such fees upon the effective date -of termination. Termination of this Agreement shall not affect any rights of -Customers to continue use of Applications and Devices (and therein -incorporated Redistributables). - -12.5. Extension in case of bankruptcy -In the event The Qt Company is declared bankrupt under a final, -non-cancellable decision by relevant court of law, and this Agreement is not, -at the date of expiry of the Development License(s) pursuant to Section 3.1, -assigned to party, who has assumed The Qt Company's position as a legitimate -licensor of Licensed Software under this Agreement, then all valid licenses -possessed by the Licensee at such date of expiry, and which the Licensee has -not notified for expiry, shall be extended to be valid in perpetuity under the -terms of this Agreement. - -13. GOVERNING LAW AND LEGAL VENUE - -In the event this Agreement is in the name of The Qt Company Inc., a Delaware -Corporation, then: - (i) this Agreement shall be construed and interpreted in accordance with - the laws of the State of California, USA, excluding its choice of - law provisions; - (ii) the United Nations Convention on Contracts for the International - Sale of Goods will not apply to this Agreement; and - (iii) any dispute, claim or controversy arising out of or relating to this - Agreement or the breach, termination, enforcement, interpretation or - validity thereof, including the determination of the scope or - applicability of this Agreement to arbitrate, shall be determined by - arbitration in San Francisco, USA, before one arbitrator. The - arbitration shall be administered by JAMS pursuant to JAMS' - Streamlined Arbitration Rules and Procedures. Judgment on the Award - may be entered in any court having jurisdiction. This Section shall - not preclude parties from seeking provisional remedies in aid of - arbitration from a court of appropriate jurisdiction. - -In the event this Agreement is in the name of The Qt Company Ltd., a Finnish -Company, then: - (i) this Agreement shall be construed and interpreted in accordance with - the laws of Finland, excluding its choice of law provisions; - (ii) the United Nations Convention on Contracts for the International - Sale of Goods will not apply to this Agreement; and - (iii) any disputes, controversy or claim arising out of or relating to - this Agreement, or the breach, termination or validity thereof shall - be finally settled by arbitration in accordance with the Arbitration - Rules of Finland Chamber of Commerce. The arbitration tribunal shall - consist of one (1), or if either Party so requires, of three (3), - arbitrators. The award shall be final and binding and enforceable in - any court of competent jurisdiction. The arbitration shall be held - in Helsinki, Finland and the process shall be conducted in the - English language. This Section shall not preclude parties from - seeking provisional remedies in aid of arbitration from a court of - appropriate jurisdiction. - -14. GENERAL PROVISIONS - -14.1. No Assignment -Except in the case of a merger or sale of substantially all of its corporate -assets, Licensee shall not be entitled to assign or transfer all or any of -its rights, benefits and obligations under this Agreement without the prior -written consent of The Qt Company, which shall not be unreasonably withheld -or delayed. The Qt Company shall be entitled to freely assign or transfer any -of its rights, benefits or obligations under this Agreement. - -14.2. No Third-Party Representations -Licensee shall make no representations or warranties concerning the Licensed -Software on behalf of The Qt Company. Any representation or warranty Licensee -makes or purports to make on The Qt Company's behalf shall be void as to The -Qt Company. - -14.3. Surviving Sections -Any terms and conditions that by their nature or otherwise reasonably should -survive termination of this Agreement shall so be deemed to survive. Such -sections include especially the following: 1, 2, 6, 7, 9, 11, 12.4, 13 and 14. - -14.4. Entire Agreement -This Agreement, the exhibits hereto, the License Certificate and any -applicable Purchase Order accepted by The Qt Company constitute the complete -agreement between the Parties and supersedes all prior or contemporaneous -discussions, representations, and proposals, written or oral, with respect -to the subject matters discussed herein. - -In the event of any conflict or inconsistency between this Agreement and any -Purchase Order, the terms of this Agreement will prevail over the terms of -the Purchase Order with respect to such conflict or inconsistency. - -Parties specifically acknowledge and agree that this Agreement prevails -over any click-to-accept or similar agreements the Designated Users may -need to accept online upon download of the Licensed Software, as may be -required by The Qt Company's applicable processes relating to Licensed -Software. - -14.5. Modifications -No modification of this Agreement shall be effective unless contained in a -writing executed by an authorized representative of each Party. No term or -condition contained in Licensee's Purchase Order ("Deviating Terms") shall -apply unless The Qt Company has expressly agreed such Deviating Terms in -writing. Unless and to the extent expressly agreed by The Qt Company, any -such Deviating Terms shall be deemed void and with no legal effect. For -clarity, delivery of the Licensed Software following the receipt of the -Purchase Order including Deviating Terms shall not constitute acceptance of -such Deviating Terms." - -14.6. Force Majeure -Except for the payment obligations hereunder, neither Party shall be liable -to the other for any delay or non-performance of its obligations hereunder -in the event and to the extent that such delay or non-performance is due to -an event of act of God, terrorist attack or other similar unforeseeable -catastrophic event that prevents either Party for fulfilling its -obligations under this Agreement and which such Party cannot avoid or -circumvent ("Force Majeure Event"). If the Force Majeure Event results in -a delay or non-performance of a Party for a period of three (3) months or -longer, then either Party shall have the right to terminate this Agreement -with immediate effect without any liability (except for the obligations of -payment arising prior to the event of Force Majeure) towards the other -Party. - -14.7. Notices -Any notice given by one Party to the other shall be deemed properly given -and deemed received if specifically acknowledged by the receiving Party in -writing or when successfully delivered to the recipient by hand, fax, or -special courier during normal business hours on a business day to the -addresses specified for each Party on the signature page. Each -communication and document made or delivered by one Party to the other -Party pursuant to this Agreement shall be in the English language. - -14.8. Export Control -Licensee acknowledges that the Redistributables, as incorporated in -Applications or Devices, may be subject to export control restrictions -under the applicable laws of respective countries. Licensee shall fully -comply with all applicable export license restrictions and requirements -as well as with all laws and regulations relating to the Redistributables -and exercise of licenses hereunder and shall procure all necessary -governmental authorizations, including without limitation, all necessary -licenses, approvals, permissions or consents, where necessary for the -re-exportation of the Redistributables, Applications and/or Devices. - -14.9. No Implied License -There are no implied licenses or other implied rights granted under -this Agreement, and all rights, save for those expressly granted hereunder, -shall remain with The Qt Company and its licensors. In addition, no licenses -or immunities are granted to the combination of the Licensed Software with -any other software or hardware not delivered by The Qt Company under this -Agreement. - -14.10. Attorney Fees -The prevailing Party in any action to enforce this Agreement shall be -entitled to recover its attorney's fees and costs in connection with such -action. - -14.11. Privacy -Licensee acknowledges and agrees that for the purpose of this Agreement, -The Qt Company may collect, use, transfer and disclose personal data -pertaining to Designated Users as well as any other employees and directors -of the Licensee and its Contractors relevant for carrying out the intent of -this Agreement. Such personal data may be collected from the Licensee or -directly from the relevant individuals. The Parties acknowledge that with -regard to such personal data processed hereunder, The Qt Company shall be -regarded as the Data Controller under the applicable Data Protection -Legislation. The Qt Company shall process any such personal data in -accordance with its privacy policies and practices, which will comply with -all applicable requirements of the Data Protection Legislation. - -14.12. Severability -If any provision of this Agreement shall be adjudged by any court of -competent jurisdiction to be unenforceable or invalid, that provision shall -be limited or eliminated to the minimum extent necessary so that this -Agreement shall otherwise remain in full force and effect and enforceable. - -APPENDICES - -The Agreement includes Appendix 1, and possibly one or more of the -appendices 3-5, depending on the product(s) purchased by the Licensee, -what is stated in the quote or invoice, and/or what is stated in the -Licensee's License Certificate. - -APPENDIX 1 - -The modules and/or tools that are included in the respective product - Qt -for Application Development (QtAD), Qt for Device Creation (QtDC), Qt for -MCUs (QtMCU), Qt 3D Studio (Qt3DS) and Qt Design Studio (QtDS) - are -marked with 'X' in the below table. The modules and tools are ported to Qt 6 -in stages and are subject to availability. - -Parts of the product that are permitted for distribution in object-code -form only ("Redistributables") are marked with 'R' in the below table. - -+-----------------------------------------------------------------------+ -| Modules / Tools | QtAD | QtDC | QtMCU | Qt3DS | QtDS | -+-----------------------------------------------------------------------+ -| Qt Core | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt GUI | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Multimedia | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Multimedia Widgets | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Network | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt PDF | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt QML | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Quick | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Quick Controls 2 | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Quick Dialogs | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Quick Layouts | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Quick Test | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt SQL | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Test | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Widgets | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Active Qt | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt 3D | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Android Extras | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Bluetooth | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Canvas 3D | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Concurrent | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt D-Bus | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Gamepad | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Graphical Effects | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Help | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Image Formats | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Location | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Mac Extras | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Network Authorization | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt NFC | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Platform Headers | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Positioning | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Print Support | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Purchasing | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt for Python | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Quick Controls | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Quick Extras | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Quick Widgets | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt SCXML | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Sensors | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Serial Bus | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Serial Port | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Speech | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt SVG | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt UI Tools | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt WebChannel | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt WebEngine | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt WebSockets | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt WebView | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Windows Extras | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt X11 Extras | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt XML | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt XML Patterns | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Wayland Compositor | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Charts | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Data Visualization | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Virtual Keyboard | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Boot 2 Qt stack | | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt OTA | | X, R | | | | -+-----------------------------------------------------------------------+ -| Device Utilities | | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Debugging Bridge (QDB) Daemon | | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Quick Ultralite Controls | | | X, R | | | -+-----------------------------------------------------------------------+ -| Qt Quick Ultralite | | | X, R | | | -+-----------------------------------------------------------------------+ -| Qt Creator | X | X | X | | | -+-----------------------------------------------------------------------+ -| Qt Designer (Qt Widget Designer) | X | X | | | | -+-----------------------------------------------------------------------+ -| Qt Quick Designer (Qt Creator | X, R | X, R | X, R | | | -| plugin) | | | | | | -+-----------------------------------------------------------------------+ -| Qt Linguist | X, R | X, R | X, R | | | -+-----------------------------------------------------------------------+ -| Qt Assistant | X, R | X, R | X, R | | | -+-----------------------------------------------------------------------+ -| Lupdate | X, R | X, R | X, R | | | -+-----------------------------------------------------------------------+ -| Lrelease | X, R | X, R | X, R | | | -+-----------------------------------------------------------------------+ -| Qmake | X | X | | | | -+-----------------------------------------------------------------------+ -| Uic | X | X | | | | -+-----------------------------------------------------------------------+ -| Rcc | X | X | | | | -+-----------------------------------------------------------------------+ -| Qlalr | X | X | | | | -+-----------------------------------------------------------------------+ -| Qdoc | X | X | | | | -+-----------------------------------------------------------------------+ -| Qmlscene | X | X | | | | -+-----------------------------------------------------------------------+ -| Qmlviewer | X | X | | | | -+-----------------------------------------------------------------------+ -| Target toolchains | | X | X | | | -+-----------------------------------------------------------------------+ -| Qt Debugging Bridge (QDB) Host | | X | | | | -| Tools | | | | | | -+-----------------------------------------------------------------------+ -| qtconfig-gui | | X | | | | -+-----------------------------------------------------------------------+ -| Qt Emulator | | X | | | | -+-----------------------------------------------------------------------+ -| Qmlinterfacegenerator | | | X | | | -+-----------------------------------------------------------------------+ -| Qmltocpp | | | X | | | -+-----------------------------------------------------------------------+ -| qulfontcompiler | | | X | | | -+-----------------------------------------------------------------------+ -| Qt53DStudioRuntime2 | | | | X, R | | -+-----------------------------------------------------------------------+ -| Qt 3D Studio | | | | X | | -+-----------------------------------------------------------------------+ -| Qt Design Studio | | | | | X | -+-----------------------------------------------------------------------+ - - -APPENDIX 3: ADDITIONS TO LICENSED SOFTWARE - -In addition to what is provided under the definition of the Licensed Software, -Parties agree that Licensed Software shall also include the Add-On Products of -The Qt Company, as mentioned in this Appendix, if included in the quote / -invoice. - -The Modules and/or Tools of the Licensed Software that are included with each -Add-On Product respectively are marked with 'X' in the below table. The modules -are ported to Qt 6 in stages and are subject to availability. - -Parts of the respective Add-On Product that are permitted for distribution in -object-code form only ("Redistributables") are marked with 'R' in the below -table. - -+------------------------------------------------------------------------------------------------+ -| | Add-On Product(s) | -| +--------------------------------------------------------------------------+ -| Modules / Tools of | Qt for | Qt | Qt | Qt | Qt | Qt | -| Licensed Software | Automation | Automotive | Safe | Application | GammaRay | Deployment | -| | / Qt M2M | Suite | Renderer | Manager | | Platform | -| | Protocols | | | | | Package | -+------------------------------------------------------------------------------------------------+ -| Qt MQTT | X, R | | | | | | -+------------------------------------------------------------------------------------------------+ -| Qt KNX | X, R | | | | | | -+------------------------------------------------------------------------------------------------+ -| Qt OPC UA | X, R | | | | | | -+------------------------------------------------------------------------------------------------+ -| Qt CoAP | X, R | | | | | | -+------------------------------------------------------------------------------------------------+ -| Qt Safe Renderer | | X, R | X, R | | | | -+------------------------------------------------------------------------------------------------+ -| Qt Application | | X, R | | X, R | | | -| Manager | | | | | | | -+------------------------------------------------------------------------------------------------+ -| Qt IVI | | X, R | | | | | -+------------------------------------------------------------------------------------------------+ -| Reference UI | | X, R | | | | | -+------------------------------------------------------------------------------------------------+ -| Qt GENIVI Extras | | X, R | | | | | -+------------------------------------------------------------------------------------------------+ -| QML Live | | X | | | | | -+------------------------------------------------------------------------------------------------+ -| Qt Creator | | X | | | | | -| Deployment | | | | | | | -+------------------------------------------------------------------------------------------------+ -| Qt Creator Plugin | | X | | X | | | -| for Qt Application Manager | | | | | | -+------------------------------------------------------------------------------------------------+ -| Qt Automotive Suite | | X | | | | | -| Deployment Server | | | | | | | -+------------------------------------------------------------------------------------------------+ -| Qt Design Studio | | X | | | | | -+------------------------------------------------------------------------------------------------+ -| Qt 3D Studio | | X | | | | | -+------------------------------------------------------------------------------------------------+ -| GammaRay | | X | | | X | | -+------------------------------------------------------------------------------------------------+ -| Platform adaptations| | | | | | X | -| for specified | | | | | | -| Deployment Platforms | | | | | | -+------------------------------------------------------------------------------------------------+ -| Qt for Device | | X | | | | | -| Creation | | | | | | | -+------------------------------------------------------------------------------------------------+ - - -All the above Redistributables are subject to applicable provisions and -limitations including but not limited to what is defined in section 3 of the -Agreement. - -APPENDIX 4: SMALL BUSINESS AND STARTUP - -The provisions of this Appendix 4 are applicable for companies with an annual -revenue, including funding, equivalent to maximum of 250,000 USD (in -applicable currency) during the latest full calendar year, as evidenced by -duly audited records of the Licensee and approved by The Qt Company -("Start-up Company"). - -Start-up Companies are qualified for a discounted License Fee for maximum of -four (4) Development Licenses ("Start-up Development License") unless -otherwise agreed between the parties. - -Start-up Development License entitles the respective Designated User for -Support only for installation related issues. - -Upon expiry of the respective License Term, the Start-up Development -Licenses shall be automatically extended, pursuant to Section 3.1 of the -Agreement, for a Renewal Term either as new Start-up Development Licenses -(if the Licensee still qualifies as a Start-up Company), or as normal -Development Licenses (if the Licensee no longer qualifies as a Start-up -ompany). - -APPENDIX 5: NON-COMMERCIAL USE -The provisions of this Appendix 5 are applicable for non-commercial use of -the Licensed Software by the Licensee. - -For the purpose of this Appendix 5, the following additional definitions -(replacing the relevant definition of the Agreement, where applicable) -shall be applicable: - -"Demo Units" shall mean (i) hardware development platform, which incorporates -the Licensed Software along with Licensee's software and/or hardware, and -(ii) prototype versions of Applications or Devices. - -"Designated User(s)" shall mean the employees and students of the Licensee. - -"Licensee Products" shall mean Applications and/or Devices. - -"Permitted Purpose" shall mean (i) Licensee's internal evaluation and -testing of Licensed Software, (ii) building Demo Units as well as (iii) -educational use. - -"Term" shall mean a period of twelve (12) months or any such other period -as may be agreed between the Parties. - -For the purpose of this Appendix 5, the following changes shall be agreed -with respect to relevant Sections of the Agreement: - - I. Recital (A) shall be replaced in its entirety to read as follows: - "(A) Licensee wishes to use the Licensed Software for the Permitted - Purpose." - II. Section 3.1 shall be replaced in its entirety to read as follows: - "The Qt Company grants to Licensee a personal, non-exclusive, - non-transferable, revocable, royalty-free license, valid for the - Term, to use, modify and copy the Licensed Software solely for the - Permitted Purpose. - Licensee may install copies of the Licensed Software on five (5) - computers per Designated User, provided that only the Designated - Users who have a valid Development License may use the Licensed - Software. - Licensee may demonstrate the Demo Units, provided that such - demonstrations must be conducted by Licensee, and the Demo Units - must remain in Licensee's possession and under Licensee's control - at all times. - For clarity, this Agreement does not (i) entitle Licensee to use - Licensed Software to create Applications or Devices (other than - prototypes thereof) or (ii) carry any distribution rights to - Licensee, but such rights are subject to and conditional upon - conclusion of a separate license agreement with The Qt Company." - III. Sections 3.2, 3.3, 8 and 10 shall be deleted. - IV. Section 3.4 shall be replaced in its entirety to read as follows: - "Licensee shall not: - - remove or alter any copyright, trademark or other proprietary - rights notice contained in any portion of the Licensed Software; - - transfer, publish, sublicense, disclose, display or otherwise - make the Licensed Software available to any third party (except - that Licensee may demonstrate the Demo Units pursuant to Section - 3.1); - - in any way combine, incorporate or integrate Licensed Software - with, or use Licensed Software for creation of, any software - created with or incorporating Open Source Qt; - - Licensee shall cause all Designated Users who make use of the - licenses granted under this Agreement, to be contractually bound - to comply with the relevant terms of this Agreement and not to use - the Licensed Software beyond the terms hereof. Licensee shall be - responsible for any and all actions and omissions of its - Designated Users relating to the Licensed Software and use - thereof. - - Any use of Licensed Software beyond the provisions of this - Agreement is strictly prohibited and requires an additional license - from The Qt Company." - V. Section 12 shall be replaced in its entirety to read as follows: - "This Agreement shall enter into force upon due acceptance by both - Parties and remain in force for the Term, unless and until - terminated pursuant to the terms of Section 12. - - Upon termination of the Agreement, Licensee shall cease using the - Licensed Software. All other copies of Licensed Software in the - possession or control of Licensee must be erased or destroyed. - An officer of Licensee must, upon request, promptly deliver to - The Qt Company a written confirmation that this has occurred." - -Except for the modifications specified above, this Appendix carries no -change to the terms of the Agreement which shall remain in full force. diff --git a/.QT-FOR-AUTOMATION-LICENSE-AGREEMENT b/.QT-FOR-AUTOMATION-LICENSE-AGREEMENT deleted file mode 100644 index 386577c6..00000000 --- a/.QT-FOR-AUTOMATION-LICENSE-AGREEMENT +++ /dev/null @@ -1,1315 +0,0 @@ -QT LICENSE AGREEMENT -Agreement version 4.3 - -This Qt License Agreement ("Agreement") is a legal agreement for the licensing -of Licensed Software (as defined below) between The Qt Company (as defined -below) and the Licensee who has accepted the terms of this Agreement by -downloading or using the Licensed Software and/or as defined herein: - -Capitalized terms used herein are defined in Section 1. - -WHEREAS: - (A) Licensee wishes to use the Licensed Software for the purpose of - developing and distributing Applications and/or Devices (each as - defined below); and - (B) The Qt Company is willing to grant the Licensee a right to use - Licensed Software for such a purpose pursuant to term and conditions - of this Agreement. - -NOW, THEREFORE, THE PARTIES HEREBY AGREE AS FOLLOWS: - -1. DEFINITIONS - -"Affiliate" of a Party shall mean an entity (i) which is directly -or indirectly controlling such Party; (ii) which is under the same direct or -indirect ownership or control as such Party; or (iii) which is directly or -indirectly owned or controlled by such Party. For these purposes, an entity -shall be treated as being controlled by another if that other entity has fifty -percent (50 %) or more of the votes in such entity, is able to direct its -affairs and/or to control the composition of its board of directors or -equivalent body. - -"Add-on Products" shall mean The Qt Company's specific add-on software products -(for example Qt Safe Renderer, Qt for Automation, Qt Application Manager), which -are not licensed as part of The Qt Company's standard offering, but shall be -included into the scope of Licensed Software only if so specifically agreed -between the Parties. - -"Applications" shall mean Licensee's software products created using the -Licensed Software, which may include the Redistributables, or part thereof. - -"Contractor(s)" shall mean third party consultants, distributors and contractors -performing services to the Licensee under applicable contractual arrangement. - -"Customer(s)" shall mean Licensee's end users to whom Licensee, directly or -indirectly, distributes copies of the Redistributables. - -"Data Protection Legislation" shall mean the General Data Protection Regulation -(EU 2016/679) (GDPR) and any national implementing laws, regulations and -secondary legislation, as may be amended or updated from time to time, as well -as any other data protection laws or regulations applicable in relevant -territory. - -"Deployment Platforms" shall mean operating systems and/or hardware specified -in the License Certificate, on which the Redistributables can be distributed -pursuant to the terms and conditions of this Agreement. - -"Designated User(s)" shall mean the employee(s) of Licensee or Licensee's -Affiliates acting within the scope of their employment or Licensee's Contractors -acting within the scope of their services for Licensee and on behalf of -Licensee. Designated Users shall be named in the License Certificate. - -"Development License" shall mean the license needed by the Licensee for each -Designated User to use the Licensed Software under the license grant described -in Section 3.1 of this Agreement. Development Licenses are available per -respective Licensed Software products, each product having its designated scope -and purpose of use. Distribution Licenses are always connected to Qt for Device -Creation product and Qt for MCUs product only. - -"Development Platforms" shall mean those operating systems specified in the -License Certificate, in which the Licensed Software can be used under the -Development License, but not distributed in any form or used for any other purpose. - -"Devices" shall mean hardware devices or products that 1) are manufactured -and/or distributed by the Licensee or its Affiliates or Contractors, and (2)(i) -incorporate or integrate the Redistributables or parts thereof; or (ii) where -the main user interface or substantial functionality of such unit , when used by -a Customer, is provided by Application(s) or otherwise depends on the Licensed -Software, regardless of whether the Redistributables are distributed together -with the hardware or not. Devices covered with this Agreement shall be specified -in Appendix 2 or in a quote. - -"Distribution License(s)" shall mean the license required for any kind of sale, -trade, exchange, loan, lease, rental or other distribution by or on behalf of -Licensee to a third party of Redistributables in connection with Devices -ursuant to license grant described in Section 3.3 of this Agreement. - -"Distribution License Packs" shall mean set of prepaid Distribution Licenses for -distribution of Redistributables, as defined in The Qt Company's standard price -list, quote, Purchase Order confirmation or in an appendix hereto, as the case -may be. - -"Intellectual Property Rights" shall mean patents (including utility models), -design patents, and designs (whether or not capable of registration), chip -topography rights and other like protection, copyrights, trademarks, service -marks, trade names, logos or other words or symbols and any other form of -statutory protection of any kind and applications for any of the foregoing as -well as any trade secrets. - -"License Certificate" shall mean a certificate generated by The Qt Company for -each Designated User respectively upon them downloading the Licensed Software, -which will be available under respective Designated User's Qt Account at -account.qt.io. License Certificates will specify the Designated User, the -Development Platforms, Deployment Platforms and the License Term. Such terms are -considered part of the licenses granted hereunder and shall be updated from time -to time to reflect any agreed changes to the foregoing terms relating to -Designated User's rights to the Licensed Software. - -"License Fee" shall mean the fee charged to the Licensee for rights granted -under the terms of this Agreement. - -"License Term" shall mean the agreed validity period of the Development License -of the respective Designated User, during which time the Designated User is -entitled to use the Licensed Software, as set forth in the respective License -Certificate. - -"Licensed Software" shall mean either - (i) Qt for Application Development or - (ii) Qt for Device Creation, and/or - (iii) Qt 3D Studio, and/or - (iv) Qt Design Studio, and/or - (v) Qt for MCUs, and/or - (vi) selected Add-on Products, if any, - -depending on which product(s) the Licensee has purchased under this Agreement, -as well as corresponding online or electronic documentation, associated media -and printed materials, including the source code (where applicable), example -programs and the documentation, licensed to the Licensee under this Agreement. -Licensed Software does not include Third Party Software (as defined in -Section 4) or Open Source Qt. The Qt Company may, in the course of its -development activities, at its free and absolute discretion and without any -obligation to send or publish any notifications to the Licensee or in general, -make changes, additions or deletions in the components and functionalities of -the Licensed Software, provided that no such changes, additions or deletions -will affect the already released version of the Licensed Software, but only -upcoming version(s). - -"Licensee" shall mean the individual or legal entity that is party to this -Agreement, as identified on the signature page hereof. - -"Licensee's Records" shall mean books and records that are likely to contain -information bearing on Licensee's compliance with this Agreement, Licensee's use -of Open Source Qt and/or the payments due to The Qt Company under this -Agreement, including, but not limited to user information, assembly logs, sales -records and distribution records. - -"Modified Software" shall have the meaning as set forth in Section 2.3. - -"Online Services" shall mean any services or access to systems made available by -The Qt Company to the Licensee over the Internet relating to the Licensed -Software or for the purpose of use by the Licensee of the Licensed Software or -Support. Use of any such Online Services is discretionary for the Licensee and -some of them may be subject to additional fees. - -"Open Source Qt" shall mean the non-commercial Qt computer software products, -licensed under the terms of the GNU Lesser General Public License, version 2.1 -or later ("LGPL") or the GNU General Public License, version 2.0 or later -("GPL"). For clarity, Open Source Qt shall not be provided nor governed under -this Agreement. - -"Party" or "Parties" shall mean Licensee and/or The Qt Company. - -"Permitted Combination" shall have the meaning as set forth in Section -3.4(viii). - -"Pre-Release Code" shall have the meaning as set forth in Section 4. - -"Prohibited Combination" shall mean any means to (i) use, combine, incorporate, -link or integrate Licensed Software with any software created with or -incorporating Open Source Qt, (ii) use Licensed Software for creation of any -software created with or incorporating Open Source Qt, or (iii) incorporate or -integrate Applications into a hardware device or product other than a Device. - -"Qt 3D Studio" shall mean The Qt Company's productized offering, which consist -of all versions of modules and tools as set forth in Appendix 1. - -"Qt Design Studio" shall mean The Qt Company's productized offering, which -consist of all versions of modules and tools as set forth in Appendix 1. - -"Qt for Application Development" shall mean The Qt Company's productized -offering, which consist of all versions of modules and tools as set forth in -Appendix 1. - -"Qt for Device Creation" shall mean The Qt Company's productized offering, -which consist of all versions of modules and tools as set forth in Appendix 1. - -"Qt for MCUs" shall mean The Qt Company's productized offering, which consist -of all versions of modules and tools as set forth in Appendix 1. - -"Redistributables" shall mean the portions of the Licensed Software set forth -in Appendix 1 that may be distributed pursuant to the terms of this Agreement -in object code form only, including any relevant documentation. Where -relevant, any reference to Licensed Software in this Agreement shall include -and refer also to Redistributables. - -"Renewal Term" shall mean an extension of previous License Term as agreed -between the Parties. - -"Submitted Modified Software" shall have the meaning as set forth in Section -2.3. - -"Support" shall mean standard developer support that is provided by The Qt -Company to assist Designated Users in using the Licensed Software in accordance -with The Qt Company's standard support terms available at -https://www.qt.io/terms-conditions/ and as further defined in Section 8 -hereunder. - -"Taxes" shall have the meaning set forth in Section 10.5. - -"Term" shall have the meaning set forth in Section 12. - -"The Qt Company" shall mean: - (i) in the event Licensee is an individual residing in the United States - or a legal entity incorporated in the United States or having its - headquarters in the United States, The Qt Company Inc., a - Delaware corporation with its office at 2350 Mission College Blvd., - Suite 1020, Santa Clara, CA 95054, USA.; or - (ii) in the event the Licensee is an individual residing outside of the - United States or a legal entity incorporated outside of the United - States or having its registered office outside of the United States, - The Qt Company Ltd., a Finnish company with its registered office - at Bertel Jungin aukio D3A, 02600 Espoo, Finland. - -"Third-Party Software" shall have the meaning set forth in Section 4. - -"Updates" shall mean a release or version of the Licensed Software containing -bug fixes, error corrections and other changes that are generally made available -to users of the Licensed Software that have contracted for Support. Updates are -generally depicted as a change to the digits following the decimal in the -Licensed Software version number. The Qt Company shall make Updates available to -the Licensee under the Support. Updates shall be considered as part of the -Licensed Software hereunder. - -"Upgrades" shall mean a release or version of the Licensed Software containing -enhancements and new features and are generally depicted as a change to the -first digit of the Licensed Software version number. In the event Upgrades are -provided to the Licensee under this Agreement, they shall be considered as part -of the Licensed Software hereunder. - -2. OWNERSHIP - -2.1. Ownership of The Qt Company -The Licensed Software is protected by copyright laws and international copyright -treaties, as well as other intellectual property laws and treaties. The Licensed -Software is licensed, not sold. - -All of The Qt Company's Intellectual Property Rights are and shall remain the -exclusive property of The Qt Company or its licensors respectively. - -2.2. Ownership of Licensee -All the Licensee's Intellectual Property Rights are and shall remain the -exclusive property of the Licensee or its licensors respectively. - -All Intellectual Property Rights to the Modified Software, Applications and Devices -shall remain with the Licensee and no rights thereto shall be granted by the -Licensee to The Qt Company under this Agreement (except as set forth in Section -2.3 below). - -2.3. Modified Software -Licensee may create bug-fixes, error corrections, patches or modifications to -the Licensed Software ("Modified Software"). Such Modified Software may break -the source or binary compatibility with the Licensed Software (including without -limitation through changing the application programming interfaces ("API") or by -adding, changing or deleting any variable, method, or class signature in the -Licensed Software and/or any inter-process protocols, services or standards in -the Licensed Software libraries). To the extent that Licensee's Modified -Software so breaks source or binary compatibility with the Licensed Software, -Licensee acknowledges that The Qt Company's ability to provide Support may be -prevented or limited and Licensee's ability to make use of Updates may be restricted. - -Licensee may, at its sole and absolute discretion, choose to submit Modified -Software to The Qt Company ("Submitted Modified Software") in connection with -Licensee's Support request, service request or otherwise. In the event Licensee -does so, then, Licensee hereby grants The Qt Company a sublicensable, -assignable, irrevocable, perpetual, worldwide, non-exclusive, royalty-free and -fully paid-up license, under all of Licensee's Intellectual Property Rights, to -reproduce, adapt, translate, modify, and prepare derivative works of, publicly -display, publicly perform, sublicense, make available and distribute such -Submitted Modified Software as The Qt Company sees fit at its free and absolute -discretion. - -3. LICENSES GRANTED - -3.1. Development with Licensed Software -Subject to the terms of this Agreement, The Qt Company grants to Licensee a -worldwide, non-exclusive, non-transferable license, valid for the License Term, -to use, modify and copy the Licensed Software by Designated Users on the -Development Platforms for the sole purposes of designing, developing, -demonstrating and testing Application(s) and/or Devices, and to provide thereto -related support and other related services to end-user Customers. Each -Application and/or Device can only include, incorporate or integrate code -generated under this Agreement by such Designated Users who are duly licensed -for the applicable Development Platform(s) and Deployment Platform(s) (i.e have -a valid license for the appropriate Licensed Software product). - -Licensee may install copies of the Licensed Software on five (5) computers per -Designated User, provided that only the Designated Users who have a valid -Development License may use the Licensed Software. - -Licensee may at any time designate another Designated User to replace a -then-current Designated User by notifying The Qt Company in writing, provided -that any Designated User may be replaced only once during any six-month period. - -Upon expiry of the initially agreed License Term, the respective License Terms -shall be automatically extended to one or more Renewal Term(s), unless and -until either Party notifies the other Party in writing, or any other method -acceptable to The Qt Company, that it does not wish to continue the License -Term, such notification to be provided to the other Party no less than thirty -(30) days before expiry of the respective License Term. - -Unless otherwise agreed between the Parties, Renewal Term shall be of equal -length with the initial License Term. - -Any such Renewal Term shall be subject to License Fees agreed between the -Parties or, if no advance agreement exists, subject to The Qt Company's standard -pricing applicable at the commencement date of any such Renewal Term. - -Any price or other term specified for a Renewal Term shall be valid only for the -specified time. - -The Qt Company may either request the Licensee to place a purchase order -corresponding to a quote by The Qt Company, or uses Licensees stored Credit -Card information in the QtAccount to automatically charge the Licensee for the -relevant Renewal Term. - -In the event Licensee does not prevent auto-renewal pursuant the above, but a -Renewal Term is nevertheless not duly ordered within 30 days from the date of -the respective notification from The Qt Company and/or the respective License -Fee paid by due date specified in The Qt Company's respective invoice, The Qt -Company shall apply a reinstatement fee equal to ten percent (10 %) of the -total value of the License Fees of the Development Licenses for the expired -term to be added to the License Fee of the respective Renewal Term. - -In the event Licensee chooses not to renew a Development License for a Renewal -Term by notifying The Qt Company thereof no less than thirty (30) days before -expiry of the respective License Term, Licensee may still reinstate such -expired Development Licenses for a Renewal Term subject to applicable renewal -Term License Fees until thirty (30) days from the expiry of the initially -agreed License Term or preceding Renewal Term. After such thirty (30) day -period a Development License shall be subject to applicable License Fees for -a new Development License and not any Renewal Term License Fees. - -3.2. Distribution of Applications -Subject to the terms of this Agreement, The Qt Company grants to Licensee -a worldwide, non-exclusive, non-transferable, revocable (for cause pursuant to -this Agreement) right and license, valid for the Term, to - (i) distribute, by itself or through its Contractors, Redistributables as - installed, incorporated or integrated into Applications for execution - on the Deployment Platforms, and - (ii) grant sublicenses to Redistributables, as distributed hereunder, for - Customers solely for Customer's internal use and to the extent - necessary in order for the Customers to use the Applications for their - respective intended purposes. - -Right to distribute the Redistributables as part of an Application as provided -herein is not royalty-bearing but is conditional upon the Licensee not having -any unpaid License Fees for Development Licenses owed to The Qt Company at the -time of distribution of any Redistributables to Customers. - -3.3. Distribution of Devices -Subject to the terms of this Agreement, The Qt Company grants to Licensee a -worldwide, non-exclusive, non-transferable, revocable (for cause pursuant to -this Agreement) right and license, valid for the Term, to - (i) distribute, by itself or through one or more tiers of Contractors, - Redistributables as installed, incorporated or integrated, or intended - to be installed, incorporated or integrated into Devices for execution - on the Deployment Platforms, and - (ii) grant sublicenses to Redistributables, as distributed hereunder, for - Customers solely for Customer's internal use and to the extent - necessary in order for the Customers to use the Devices for their - respective intended purposes. - -Right to distribute the Redistributables with Devices as provided herein is -conditional upon the Licensee (i) not having any unpaid License Fees for -Development Licenses owed to The Qt Company, and (ii) having purchased and paid -corresponding Distribution Licenses at the time of distribution of any -Redistributables to Customers. - -3.4. Further Requirements -The licenses granted above in this Section 3 by The Qt Company to Licensee are -conditional and subject to Licensee's compliance with the following terms: - (i) Licensee shall not remove or alter any copyright, trademark or other - proprietary rights notice(s) contained in any portion of the Licensed - Software; - (ii) Applications must add primary and substantial functionality to the - Licensed Software so as not to compete with the Licensed Software; - (iii) Applications may not pass on functionality which in any way makes it - possible for others to create software with the Licensed Software; - provided however that Licensee may use the Licensed Software's - scripting and QML ("Qt Quick") functionality solely in order to - enable scripting, themes and styles that augment the functionality - and appearance of the Application(s) without adding primary and - substantial functionality to the Application(s); - (iv) Licensee shall not use Licensed Software in any manner or for any - purpose that infringes, misappropriates or otherwise violates any - Intellectual property or right of any third party, or that violates - any applicable law; - (v) Licensee shall not use The Qt Company's or any of its suppliers' - names, logos, or trademarks to market Applications, except that - Licensee may use "Built with Qt" logo to indicate that - Application(s) was developed using the Licensed Software; - (vi) Licensee shall not distribute, sublicense or disclose source code - of Licensed Software to any third party (provided however that - Licensee may appoint employee(s) of Contractors as Designated - Users to use Licensed Software pursuant to this Agreement). Such - right may be available for the Licensee subject to a separate - software development kit ("SDK") license agreement to be concluded - with The Qt Company; - (vii) Licensee shall not grant the Customers a right to (i) make copies of - the Redistributables except when and to the extent required to use the - Applications and/or Devices for their intended purpose, (ii) modify - the Redistributables or create derivative works thereof, (iii) - decompile, disassemble or otherwise reverse engineer Redistributables, - or (iv) redistribute any copy or portion of the Redistributables to - any third party, except as part of the onward sale of the Device on - which the Redistributables are installed; - (viii) Licensee shall not and shall cause that its Affiliates or - Contractors shall not use Licensed Software in any Prohibited - Combination, unless Licensee has received an advance written - permission from The Qt Company to do so. Absent such written - permission, any and all distribution by the Licensee during the Term - of a hardware device or product a) which incorporate or integrate any - part of Licensed Software or Open Source Qt; or b) where the main - user interface or substantial functionality is provided by software - built with Licensed Software or Open Source Qt or otherwise depends - on the Licensed Software or Open Source Qt, shall be considered to be - Device distribution under this Agreement and shall be dependent on - Licensee's compliance thereof (including but not limited to - obligation to pay applicable License Fees for such distribution). - Notwithstanding what is provided above in this sub-section (viii), - Licensee is entitled to use and combine Licensed Software with any - Permitted Software; - (ix) Licensee shall cause all of its Affiliates and Contractors entitled - to make use of the licenses granted under this Agreement, to be - contractually bound to comply with the relevant terms of this - Agreement and not to use the Licensed Software beyond the terms - hereof and for any purposes other than operating within the scope - of their services for Licensee. Licensee shall be responsible for - any and all actions and omissions of its Affiliates and Contractors - relating to the Licensed Software and use thereof (including but not - limited to payment of all applicable License Fees); - (x) Except when and to the extent explicitly provided in this Section 3, - Licensee shall not transfer, publish, disclose, display or otherwise - make available the Licensed Software; and - (xi) Licensee shall not attempt or enlist a third party to conduct or - attempt to conduct any of the above. - -Above terms shall not be applicable if and to the extent they conflict with any -mandatory provisions of any applicable laws. -Any use of Licensed Software beyond the provisions of this Agreement is -strictly prohibited and requires an additional license from The Qt Company. - -4. THIRD-PARTY SOFTWARE - -The Licensed Software may provide links to third party libraries or code -(collectively "Third-Party Software") to implement various functions. -Third-Party Software does not comprise part of the Licensed Software. In some -cases, access to Third-Party Software may be included with the Licensed -Software. Such Third-Party Software will be listed in the ".../src/3rdparty" -source tree delivered with the Licensed Software or documented in the Licensed -Software, as such may be amended from time to time. Licensee acknowledges that -use or distribution of Third-Party Software is in all respects subject to -applicable license terms of applicable third-party right holders. - -5. PRE-RELEASE CODE - -The Licensed Software may contain pre-release code and functionality, or sample -code marked or otherwise stated with appropriate designation such as "Technology -Preview", "Alpha", "Beta", "Sample" etc. ("Pre-Release Code"). - -Such Pre-Release Code may be present complimentary for the Licensee, in order to -provide experimental support or information for new platforms or preliminary -versions of one or more new functionalities or for other similar reasons. The -Pre-Release Code may not be at the level of performance and compatibility of a -final, generally available, product offering. The Pre-Release Code may not -operate correctly, may contain errors and may be substantially modified by The -Qt Company prior to the first commercial product release, if any. The Qt -Company is under no obligation to make Pre-Release Code commercially available, -or provide any Support or Updates relating thereto. The Qt Company assumes no -liability whatsoever regarding any Pre-Release Code, but any use thereof is -exclusively at Licensee's own risk and expense. - -For clarity, unless Licensed Software specifies different license terms for -the respective Pre-Release Code, the Licensee is entitled to use such -pre-release code pursuant to Section 3, just like other Licensed Software, -provided however that in the event Add-on Products are included and available -as such Pre-Release Code, Licensee's right to use such Add-on Products is -nevertheless subject to and conditional upon conclusion of separate agreement -with The Qt Company. - -6. LIMITED WARRANTY AND WARRANTY DISCLAIMER - -The Qt Company hereby represents and warrants that it has the power and -authority to grant the rights and licenses granted to Licensee under this -Agreement. - -Except as set forth above, the Licensed Software is licensed to Licensee -"as is" and Licensee's exclusive remedy and The Qt Company's entire liability -for errors in the Licensed Software shall be limited, at The Qt Company's -option, to correction of the error, replacement of the Licensed Software or -return of the applicable fees paid for the defective Licensed Software for -the time period during which the License is not able to utilize the Licensed -Software under the terms of this Agreement. - -TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, THE QT COMPANY ON BEHALF OF -ITSELF AND ITS LICENSORS, SUPPLIERS AND AFFILIATES, DISCLAIMS ALL OTHER -WARRANTIES, EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, ANY IMPLIED -WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND -NON-INFRINGEMENT WITH REGARD TO THE LICENSED SOFTWARE. THE QT COMPANY DOES -NOT WARRANT THAT THE LICENSED SOFTWARE WILL SATISFY LICENSEE'S REQUIREMENTS OR -THAT IT WILL OPERATE WITHOUT DEFECT OR ERROR OR THAT THE OPERATION THEREOF -WILL BE UNINTERRUPTED. - -7. INDEMNIFICATION AND LIMITATION OF LIABILITY - -7.1. Limitation of Liability -EXCEPT FOR (I) CASES OF GROSS NEGLIGENCE OR INTENTIONAL MISCONDUCT, AND (II) -BREACH OF CONFIDENTIALITY, AND TO THE EXTENT PERMITTED BY APPLICABLE LAW, IN NO -EVENT SHALL EITHER PARTY BE LIABLE TO THE OTHER PARTY FOR ANY LOSS OF PROFIT, -LOSS OF DATA, LOSS OF BUSINESS OR GOODWILL OR ANY OTHER INDIRECT, SPECIAL, -CONSEQUENTIAL, INCIDENTAL OR PUNITIVE COST, DAMAGES OR EXPENSE OF ANY KIND, -HOWSOEVER ARISING UNDER OR IN CONNECTION WITH THIS AGREEMENT. - -EXCEPT FOR (I) CASES OF GROSS NEGLIGENCE OR INTENTIONAL MISCONDUCT, AND (II) -BREACH OF CONFIDENTIALITY, AND TO THE EXTENT PERMITTED BY APPLICABLE LAW, IN NO -EVENT SHALL EITHER PARTY'S TOTAL AGGREGATE LIABILITY UNDER THIS AGREEMENT EXCEED -THE AGGREGATE LICENSE FEES PAID OR PAYABLE TO THE QT COMPANY FROM LICENSEE -DURING THE PERIOD OF TWELVE (12) MONTHS IMMEDIATELY PRECEDING THE EVENT -RESULTING IN SUCH LIABILITY. - -THE PROVISIONS OF THIS SECTION 7 ALLOCATE THE RISKS UNDER THIS AGREEMENT -BETWEEN THE QT COMPANY AND LICENSEE AND THE PARTIES HAVE RELIED UPON THE -LIMITATIONS SET FORTH HEREIN IN DETERMINING WHETHER TO ENTER INTO THIS -AGREEMENT. - -NOTWITHSTANDING ANYTHING TO THE CONTRARY IN THIS AGREEMENT, LICENSEE SHALL -ALWAYS BE LIABLE TO PAY THE APPLICABLE LICENSE FEES CORRESPONDING TO ITS ACTUAL -USE OF LICENSED SOFTWARE. - -8. SUPPORT, UPDATES AND ONLINE SERVICES - -Upon due payment of the agreed License Fees the Licensee will be eligible to -receive Support and Updates and to use the Online Services during the License -Term, provided, however, that in the event the License Term is longer than 36 -months, the initial payment includes Support for only the first 12 months, -unless the Parties specifically otherwise agree. - -Unless otherwise decided by The Company at its free and absolute discretion, -Upgrades will not be included in the Support but may be available subject to -additional fees. - -From time to time The Qt Company may change the Support terms, provided that -during the respective ongoing License Term the level of Support provided by The -Qt Company may not be reduced without the consent of the Licensee. - -Unless otherwise agreed, The Qt Company shall not be responsible for providing -any service or support to Customers. - -9. CONFIDENTIALITY - -Each Party acknowledges that during the Term of this Agreement each Party may -receive information about the other Party's business, business methods, -business plans, customers, business relations, technology, and other -information, including the terms of this Agreement, that is confidential and -of great value to the other Party, and the value of which would be -significantly reduced if disclosed to third parties ("Confidential -Information"). Accordingly, when a Party (the "Receiving Party") receives -Confidential Information from the other Party (the "Disclosing Party"), the -Receiving Party shall only disclose such information to employees and -Contractors on a need to know basis, and shall cause its employees and -employees of its Affiliates to: (i) maintain any and all Confidential -Information in confidence; (ii) not disclose the Confidential Information to -a third party without the Disclosing Party's prior written approval; and (iii) -not, directly or indirectly, use the Confidential Information for any purpose -other than for exercising its rights and fulfilling its responsibilities -pursuant to this Agreement. Each Party shall take reasonable measures to -protect the Confidential Information of the other Party, which measures shall -not be less than the measures taken by such Party to protect its own -confidential and proprietary information. - -Obligation of confidentiality shall not apply to information that (i) is or -becomes generally known to the public through no act or omission of the -Receiving Party; (ii) was in the Receiving Party's lawful possession prior -to the disclosure hereunder and was not subject to limitations on disclosure -or use; (iii) is developed independently by employees or Contractors of the -Receiving Party or other persons working for the Receiving Party who have not -had access to the Confidential Information of the Disclosing Party, as proven -by the written records of the Receiving Party; (iv) is lawfully disclosed to -the Receiving Party without restrictions, by a third party not under an -obligation of confidentiality; or (v) the Receiving Party is legally compelled -to disclose, in which case the Receiving Party shall notify the Disclosing -Party of such compelled disclosure and assert the privileged and confidential -nature of the information and cooperate fully with the Disclosing Party to -limit the scope of disclosure and the dissemination of disclosed Confidential -Information to the minimum extent necessary. - -The obligations under this Section 9 shall continue to remain in force for a -period of five (5) years after the last disclosure, and, with respect to trade -secrets, for so long as such trade secrets are protected under applicable -trade secret laws. - -10. FEES, DELIVERY AND PAYMENT - -10.1. License Fees -License Fees are described in The Qt Company's standard price list, quote or -Purchase Order confirmation or in an appendix hereto, as the case may be. - -The License Fees shall not be refunded or claimed as a credit in any event or -for any reason whatsoever. - -10.2. Ordering Licenses -Licensee may purchase Development Licenses and Distribution Licenses pursuant -to agreed pricing terms or, if no specific pricing terms have been agreed -upon, at The Qt Company's standard pricing terms applicable at the time of -purchase. Unless specifically otherwise provided, any pricing terms -referenced in this Agreement shall be valid for twelve (12) months from the -date of this Agreement. - -Licensee shall submit all purchase orders for Development Licenses and -Distribution Licenses to The Qt Company by email or any other method -acceptable to The Qt Company (each such order is referred to herein as a -"Purchase Order") for confirmation, whereupon the Purchase Order shall -become binding between the Parties. - -10.3. Distribution License Packs -Unless otherwise agreed, Distribution Licenses shall be purchased by way of -Distribution License Packs. - -Upon due payment of the ordered Distribution License Pack(s), the Licensee -will have an account of Distribution Licenses available for distributing -the Redistributables in accordance with this Agreement. - -Each time Licensee distributes a copy of Redistributables, then one -Distribution License is used, and Licensee's account of available -Distribution Licenses is decreased accordingly. - -Licensee may distribute copies of the Redistributables so long as Licensee -has Distribution Licenses remaining on its account. - -10.4. Payment Terms -License Fees and any other charges under this Agreement shall be paid by -Licensee no later than thirty (30) days from the date of the applicable -invoice from The Qt Company. - -The Qt Company will submit an invoice to Licensee after the date of this -Agreement and/or after The Qt Company receives a Purchase Order from Licensee. - -A late payment charge of the lower of (a) one percent per month; or (b) the -interest rate stipulated by applicable law, shall be charged on any unpaid -balances that remain past due. - -10.5. Taxes -All License Fees and other charges payable hereunder are gross amounts but -exclusive of any value added tax, use tax, sales tax, withholding tax and -other taxes, duties or tariffs ("Taxes") levied directly for the sale, -delivery or use of Licensed Software hereunder pursuant to any applicable -law. Such applicable Taxes shall be paid by Licensee to The Qt Company, or, -where applicable, in lieu of payment of such Taxes to The Qt Company, -Licensee shall provide an exemption certificate to The Qt Company and any -applicable authority. - -11. RECORD-KEEPING AND REPORTING OBLIGATIONS; AUDIT RIGHTS - -11.1. Licensee's Record-keeping -Licensee shall at all times during the Term of this Agreement and for a -period of seven (7) years thereafter maintain Licensee's Records in an -accurate and up-to-date form. Licensee's Records shall be adequate to -reasonably enable The Qt Company to determine Licensee's compliance with -the provisions of this Agreement. The records shall conform to general -good accounting practices. - -Licensee shall, within thirty (30) days from receiving The Qt Company's -request to that effect, deliver to The Qt Company a report based on -Licensee's Records, such report to contain information, in sufficient -detail, on (i) number and identity of users working with Licensed Software -or Open Source Qt, (ii) copies of Redistributables distributed by Licensee -during the most recent calendar quarter and/or any other term specified by -The Qt Company, (iii) number of undistributed copies of Redistributables -and corresponding number of unused Distribution Licenses remaining on -Licensee's account, and (iv) any other information as The Qt Company may -reasonably require from time to time. - -11.2. The Qt Company's Audit Rights -The Qt Company or an independent auditor acting on behalf of The Qt -Company's, may, upon at least five (5) business days' prior written -notice and at its expense, audit Licensee with respect to the Licensee's -use of the Licensed Software, but not more frequently than once during -each 6-month period. Such audit may be conducted by mail, electronic means -or through an in-person visit to Licensee's place of business. Any such -in-person audit shall be conducted during regular business hours at -Licensee's facilities and shall not unreasonably interfere with Licensee's -usiness activities. The Qt Company or the independent auditor acting on -behalf of The Qt Company shall be entitled to inspect Licensee's Records -and conduct necessary interviews of Licensee's relevant employees and -Contractors. All such Licensee's Records and use thereof shall be subject -to an obligation of confidentiality under this Agreement. - -If an audit reveals that Licensee is using the Licensed Software beyond -scope of the licenses Licensee has paid for, Licensee agrees to pay The Qt -Company any amounts owed for such unauthorized use within 30 days from -receipt of the corresponding invoice from The Qt Company. - -In addition, in the event the audit reveals a material violation of the -terms of this Agreement (without limitation, either (i) underpayment of -more than 10 % of License Fees or 10,000 euros (whichever is more) or -(ii) distribution of products, which include or result from Prohibited -Combination, shall be deemed a material violation for purposes of this -section), then the Licensee shall pay The Qt Company's reasonable cost of -conducting such audit. - -12. TERM AND TERMINATION -12.1. Agreement Term -This Agreement shall enter into force upon due acceptance by both -Parties and remain in force for as long as there is any Development -License(s) purchased under this Agreement in force ("Term"), unless and -until terminated pursuant to the terms of this Section 12. - -12.2. Termination and suspension of rights -Either Party shall have the right to terminate this Agreement upon thirty -(30) days prior written notice if the other Party commits a material -breach of any obligation of this Agreement and fails to remedy such breach -within such notice period. - -Instead of termination, The Qt Company shall have the right to suspend or -withhold grants of all rights to the Licensed Software hereunder, -including but not limited to the Development Licenses, Distribution -License, and Support, should Licensee fail to make payment in timely -fashion or otherwise violates or is reasonably suspected to violate its -obligations or terms of this Agreement, and where such violation or breach -is not cured within five (5) business days following The Qt Company's -written notice thereof. - -12.3. Mutual Right to Terminate -Either Party shall have the right to terminate this Agreement immediately -upon written notice in the event that the other Party becomes insolvent, -files for any form of bankruptcy, makes any assignment for the benefit of -creditors, has a receiver, administrative receiver or officer appointed -over the whole or a substantial part of its assets, ceases to conduct -business, or an act equivalent to any of the above occurs under the laws -of the jurisdiction of the other Party. - -12.4. Parties' Rights and Duties upon Termination -Upon expiry or termination of the Agreement, Licensee shall cease and -shall cause all Designated Users (including those of its Affiliates' and -Contractors') to cease using the Licensed Software and distribution of the -Redistributables under this Agreement. - -Notwithstanding the above, in the event the Agreement expires or is terminated: - (i) as a result of The Qt Company choosing not to renew the Development - License(s) as set forth in Section 3.1, and where such decision of - non-renewal is not due to any ongoing breach or alleged breach (as - reasonably determined by The Qt Company) by Licensee of the terms of this - Agreement or any applicable license terms of Open Source Qt, then all valid - licenses possessed by the Licensee at such date shall be extended to be - valid in perpetuity under the terms of this Agreement and Licensee is - entitled to purchase additional licenses as set forth in Section 10.2; or - (ii) for reason other than by The Qt Company pursuant to item (i) above - or pursuant to Section 12.2, then the Licensee is entitled, for a - period of six (6) months after the effective date of termination, - to continue distribution of Devices under the Distribution Licenses - paid but unused at such effective date of termination. - -Upon any such termination the Licensee shall destroy or return to The Qt -Company all copies of the Licensed Software and all related materials and will -certify the same to The Qt Company upon its request, provided however that -Licensee may retain and exploit such copies of the Licensed Software as it may -reasonably require in providing continued support to Customers. - -Expiry or termination of this Agreement for any reason whatsoever shall not -relieve Licensee of its obligation to pay any License Fees accrued or payable -to The Qt Company prior to the effective date of termination, and Licensee -shall immediately pay to The Qt Company all such fees upon the effective date -of termination. Termination of this Agreement shall not affect any rights of -Customers to continue use of Applications and Devices (and therein -incorporated Redistributables). - -12.5. Extension in case of bankruptcy -In the event The Qt Company is declared bankrupt under a final, -non-cancellable decision by relevant court of law, and this Agreement is not, -at the date of expiry of the Development License(s) pursuant to Section 3.1, -assigned to party, who has assumed The Qt Company's position as a legitimate -licensor of Licensed Software under this Agreement, then all valid licenses -possessed by the Licensee at such date of expiry, and which the Licensee has -not notified for expiry, shall be extended to be valid in perpetuity under the -terms of this Agreement. - -13. GOVERNING LAW AND LEGAL VENUE - -In the event this Agreement is in the name of The Qt Company Inc., a Delaware -Corporation, then: - (i) this Agreement shall be construed and interpreted in accordance with - the laws of the State of California, USA, excluding its choice of - law provisions; - (ii) the United Nations Convention on Contracts for the International - Sale of Goods will not apply to this Agreement; and - (iii) any dispute, claim or controversy arising out of or relating to this - Agreement or the breach, termination, enforcement, interpretation or - validity thereof, including the determination of the scope or - applicability of this Agreement to arbitrate, shall be determined by - arbitration in San Francisco, USA, before one arbitrator. The - arbitration shall be administered by JAMS pursuant to JAMS' - Streamlined Arbitration Rules and Procedures. Judgment on the Award - may be entered in any court having jurisdiction. This Section shall - not preclude parties from seeking provisional remedies in aid of - arbitration from a court of appropriate jurisdiction. - -In the event this Agreement is in the name of The Qt Company Ltd., a Finnish -Company, then: - (i) this Agreement shall be construed and interpreted in accordance with - the laws of Finland, excluding its choice of law provisions; - (ii) the United Nations Convention on Contracts for the International - Sale of Goods will not apply to this Agreement; and - (iii) any disputes, controversy or claim arising out of or relating to - this Agreement, or the breach, termination or validity thereof shall - be finally settled by arbitration in accordance with the Arbitration - Rules of Finland Chamber of Commerce. The arbitration tribunal shall - consist of one (1), or if either Party so requires, of three (3), - arbitrators. The award shall be final and binding and enforceable in - any court of competent jurisdiction. The arbitration shall be held - in Helsinki, Finland and the process shall be conducted in the - English language. This Section shall not preclude parties from - seeking provisional remedies in aid of arbitration from a court of - appropriate jurisdiction. - -14. GENERAL PROVISIONS - -14.1. No Assignment -Except in the case of a merger or sale of substantially all of its corporate -assets, Licensee shall not be entitled to assign or transfer all or any of -its rights, benefits and obligations under this Agreement without the prior -written consent of The Qt Company, which shall not be unreasonably withheld -or delayed. The Qt Company shall be entitled to freely assign or transfer any -of its rights, benefits or obligations under this Agreement. - -14.2. No Third-Party Representations -Licensee shall make no representations or warranties concerning the Licensed -Software on behalf of The Qt Company. Any representation or warranty Licensee -makes or purports to make on The Qt Company's behalf shall be void as to The -Qt Company. - -14.3. Surviving Sections -Any terms and conditions that by their nature or otherwise reasonably should -survive termination of this Agreement shall so be deemed to survive. Such -sections include especially the following: 1, 2, 6, 7, 9, 11, 12.4, 13 and 14. - -14.4. Entire Agreement -This Agreement, the exhibits hereto, the License Certificate and any -applicable Purchase Order accepted by The Qt Company constitute the complete -agreement between the Parties and supersedes all prior or contemporaneous -discussions, representations, and proposals, written or oral, with respect -to the subject matters discussed herein. - -In the event of any conflict or inconsistency between this Agreement and any -Purchase Order, the terms of this Agreement will prevail over the terms of -the Purchase Order with respect to such conflict or inconsistency. - -Parties specifically acknowledge and agree that this Agreement prevails -over any click-to-accept or similar agreements the Designated Users may -need to accept online upon download of the Licensed Software, as may be -required by The Qt Company's applicable processes relating to Licensed -Software. - -14.5. Modifications -No modification of this Agreement shall be effective unless contained in a -writing executed by an authorized representative of each Party. No term or -condition contained in Licensee's Purchase Order ("Deviating Terms") shall -apply unless The Qt Company has expressly agreed such Deviating Terms in -writing. Unless and to the extent expressly agreed by The Qt Company, any -such Deviating Terms shall be deemed void and with no legal effect. For -clarity, delivery of the Licensed Software following the receipt of the -Purchase Order including Deviating Terms shall not constitute acceptance of -such Deviating Terms." - -14.6. Force Majeure -Except for the payment obligations hereunder, neither Party shall be liable -to the other for any delay or non-performance of its obligations hereunder -in the event and to the extent that such delay or non-performance is due to -an event of act of God, terrorist attack or other similar unforeseeable -catastrophic event that prevents either Party for fulfilling its -obligations under this Agreement and which such Party cannot avoid or -circumvent ("Force Majeure Event"). If the Force Majeure Event results in -a delay or non-performance of a Party for a period of three (3) months or -longer, then either Party shall have the right to terminate this Agreement -with immediate effect without any liability (except for the obligations of -payment arising prior to the event of Force Majeure) towards the other -Party. - -14.7. Notices -Any notice given by one Party to the other shall be deemed properly given -and deemed received if specifically acknowledged by the receiving Party in -writing or when successfully delivered to the recipient by hand, fax, or -special courier during normal business hours on a business day to the -addresses specified for each Party on the signature page. Each -communication and document made or delivered by one Party to the other -Party pursuant to this Agreement shall be in the English language. - -14.8. Export Control -Licensee acknowledges that the Redistributables, as incorporated in -Applications or Devices, may be subject to export control restrictions -under the applicable laws of respective countries. Licensee shall fully -comply with all applicable export license restrictions and requirements -as well as with all laws and regulations relating to the Redistributables -and exercise of licenses hereunder and shall procure all necessary -governmental authorizations, including without limitation, all necessary -licenses, approvals, permissions or consents, where necessary for the -re-exportation of the Redistributables, Applications and/or Devices. - -14.9. No Implied License -There are no implied licenses or other implied rights granted under -this Agreement, and all rights, save for those expressly granted hereunder, -shall remain with The Qt Company and its licensors. In addition, no licenses -or immunities are granted to the combination of the Licensed Software with -any other software or hardware not delivered by The Qt Company under this -Agreement. - -14.10. Attorney Fees -The prevailing Party in any action to enforce this Agreement shall be -entitled to recover its attorney's fees and costs in connection with such -action. - -14.11. Privacy -Licensee acknowledges and agrees that for the purpose of this Agreement, -The Qt Company may collect, use, transfer and disclose personal data -pertaining to Designated Users as well as any other employees and directors -of the Licensee and its Contractors relevant for carrying out the intent of -this Agreement. Such personal data may be collected from the Licensee or -directly from the relevant individuals. The Parties acknowledge that with -regard to such personal data processed hereunder, The Qt Company shall be -regarded as the Data Controller under the applicable Data Protection -Legislation. The Qt Company shall process any such personal data in -accordance with its privacy policies and practices, which will comply with -all applicable requirements of the Data Protection Legislation. - -14.12. Severability -If any provision of this Agreement shall be adjudged by any court of -competent jurisdiction to be unenforceable or invalid, that provision shall -be limited or eliminated to the minimum extent necessary so that this -Agreement shall otherwise remain in full force and effect and enforceable. - -APPENDICES - -The Agreement includes Appendix 1, and possibly one or more of the -appendices 3-5, depending on the product(s) purchased by the Licensee, -what is stated in the quote or invoice, and/or what is stated in the -Licensee's License Certificate. - -APPENDIX 1 - -The modules and/or tools that are included in the respective product - Qt -for Application Development (QtAD), Qt for Device Creation (QtDC), Qt for -MCUs (QtMCU), Qt 3D Studio (Qt3DS) and Qt Design Studio (QtDS) - are -marked with 'X' in the below table. The modules and tools are ported to Qt 6 -in stages and are subject to availability. - -Parts of the product that are permitted for distribution in object-code -form only ("Redistributables") are marked with 'R' in the below table. - -+-----------------------------------------------------------------------+ -| Modules / Tools | QtAD | QtDC | QtMCU | Qt3DS | QtDS | -+-----------------------------------------------------------------------+ -| Qt Core | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt GUI | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Multimedia | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Multimedia Widgets | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Network | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt PDF | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt QML | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Quick | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Quick Controls 2 | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Quick Dialogs | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Quick Layouts | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Quick Test | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt SQL | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Test | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Widgets | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Active Qt | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt 3D | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Android Extras | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Bluetooth | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Canvas 3D | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Concurrent | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt D-Bus | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Gamepad | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Graphical Effects | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Help | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Image Formats | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Location | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Mac Extras | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Network Authorization | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt NFC | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Platform Headers | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Positioning | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Print Support | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Purchasing | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt for Python | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Quick Controls | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Quick Extras | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Quick Widgets | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt SCXML | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Sensors | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Serial Bus | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Serial Port | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Speech | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt SVG | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt UI Tools | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt WebChannel | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt WebEngine | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt WebSockets | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt WebView | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Windows Extras | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt X11 Extras | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt XML | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt XML Patterns | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Wayland Compositor | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Charts | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Data Visualization | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Virtual Keyboard | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Boot 2 Qt stack | | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt OTA | | X, R | | | | -+-----------------------------------------------------------------------+ -| Device Utilities | | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Debugging Bridge (QDB) Daemon | | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Quick Ultralite Controls | | | X, R | | | -+-----------------------------------------------------------------------+ -| Qt Quick Ultralite | | | X, R | | | -+-----------------------------------------------------------------------+ -| Qt Creator | X | X | X | | | -+-----------------------------------------------------------------------+ -| Qt Designer (Qt Widget Designer) | X | X | | | | -+-----------------------------------------------------------------------+ -| Qt Quick Designer (Qt Creator | X, R | X, R | X, R | | | -| plugin) | | | | | | -+-----------------------------------------------------------------------+ -| Qt Linguist | X, R | X, R | X, R | | | -+-----------------------------------------------------------------------+ -| Qt Assistant | X, R | X, R | X, R | | | -+-----------------------------------------------------------------------+ -| Lupdate | X, R | X, R | X, R | | | -+-----------------------------------------------------------------------+ -| Lrelease | X, R | X, R | X, R | | | -+-----------------------------------------------------------------------+ -| Qmake | X | X | | | | -+-----------------------------------------------------------------------+ -| Uic | X | X | | | | -+-----------------------------------------------------------------------+ -| Rcc | X | X | | | | -+-----------------------------------------------------------------------+ -| Qlalr | X | X | | | | -+-----------------------------------------------------------------------+ -| Qdoc | X | X | | | | -+-----------------------------------------------------------------------+ -| Qmlscene | X | X | | | | -+-----------------------------------------------------------------------+ -| Qmlviewer | X | X | | | | -+-----------------------------------------------------------------------+ -| Target toolchains | | X | X | | | -+-----------------------------------------------------------------------+ -| Qt Debugging Bridge (QDB) Host | | X | | | | -| Tools | | | | | | -+-----------------------------------------------------------------------+ -| qtconfig-gui | | X | | | | -+-----------------------------------------------------------------------+ -| Qt Emulator | | X | | | | -+-----------------------------------------------------------------------+ -| Qmlinterfacegenerator | | | X | | | -+-----------------------------------------------------------------------+ -| Qmltocpp | | | X | | | -+-----------------------------------------------------------------------+ -| qulfontcompiler | | | X | | | -+-----------------------------------------------------------------------+ -| Qt53DStudioRuntime2 | | | | X, R | | -+-----------------------------------------------------------------------+ -| Qt 3D Studio | | | | X | | -+-----------------------------------------------------------------------+ -| Qt Design Studio | | | | | X | -+-----------------------------------------------------------------------+ - - -APPENDIX 3: ADDITIONS TO LICENSED SOFTWARE - -In addition to what is provided under the definition of the Licensed Software, -Parties agree that Licensed Software shall also include the Add-On Products of -The Qt Company, as mentioned in this Appendix, if included in the quote / -invoice. - -The Modules and/or Tools of the Licensed Software that are included with each -Add-On Product respectively are marked with 'X' in the below table. The modules -are ported to Qt 6 in stages and are subject to availability. - -Parts of the respective Add-On Product that are permitted for distribution in -object-code form only ("Redistributables") are marked with 'R' in the below -table. - -+------------------------------------------------------------------------------------------------+ -| | Add-On Product(s) | -| +--------------------------------------------------------------------------+ -| Modules / Tools of | Qt for | Qt | Qt | Qt | Qt | Qt | -| Licensed Software | Automation | Automotive | Safe | Application | GammaRay | Deployment | -| | / Qt M2M | Suite | Renderer | Manager | | Platform | -| | Protocols | | | | | Package | -+------------------------------------------------------------------------------------------------+ -| Qt MQTT | X, R | | | | | | -+------------------------------------------------------------------------------------------------+ -| Qt KNX | X, R | | | | | | -+------------------------------------------------------------------------------------------------+ -| Qt OPC UA | X, R | | | | | | -+------------------------------------------------------------------------------------------------+ -| Qt CoAP | X, R | | | | | | -+------------------------------------------------------------------------------------------------+ -| Qt Safe Renderer | | X, R | X, R | | | | -+------------------------------------------------------------------------------------------------+ -| Qt Application | | X, R | | X, R | | | -| Manager | | | | | | | -+------------------------------------------------------------------------------------------------+ -| Qt IVI | | X, R | | | | | -+------------------------------------------------------------------------------------------------+ -| Reference UI | | X, R | | | | | -+------------------------------------------------------------------------------------------------+ -| Qt GENIVI Extras | | X, R | | | | | -+------------------------------------------------------------------------------------------------+ -| QML Live | | X | | | | | -+------------------------------------------------------------------------------------------------+ -| Qt Creator | | X | | | | | -| Deployment | | | | | | | -+------------------------------------------------------------------------------------------------+ -| Qt Creator Plugin | | X | | X | | | -| for Qt Application Manager | | | | | | -+------------------------------------------------------------------------------------------------+ -| Qt Automotive Suite | | X | | | | | -| Deployment Server | | | | | | | -+------------------------------------------------------------------------------------------------+ -| Qt Design Studio | | X | | | | | -+------------------------------------------------------------------------------------------------+ -| Qt 3D Studio | | X | | | | | -+------------------------------------------------------------------------------------------------+ -| GammaRay | | X | | | X | | -+------------------------------------------------------------------------------------------------+ -| Platform adaptations| | | | | | X | -| for specified | | | | | | -| Deployment Platforms | | | | | | -+------------------------------------------------------------------------------------------------+ -| Qt for Device | | X | | | | | -| Creation | | | | | | | -+------------------------------------------------------------------------------------------------+ - - -All the above Redistributables are subject to applicable provisions and -limitations including but not limited to what is defined in section 3 of the -Agreement. - -APPENDIX 4: SMALL BUSINESS AND STARTUP - -The provisions of this Appendix 4 are applicable for companies with an annual -revenue, including funding, equivalent to maximum of 250,000 USD (in -applicable currency) during the latest full calendar year, as evidenced by -duly audited records of the Licensee and approved by The Qt Company -("Start-up Company"). - -Start-up Companies are qualified for a discounted License Fee for maximum of -four (4) Development Licenses ("Start-up Development License") unless -otherwise agreed between the parties. - -Start-up Development License entitles the respective Designated User for -Support only for installation related issues. - -Upon expiry of the respective License Term, the Start-up Development -Licenses shall be automatically extended, pursuant to Section 3.1 of the -Agreement, for a Renewal Term either as new Start-up Development Licenses -(if the Licensee still qualifies as a Start-up Company), or as normal -Development Licenses (if the Licensee no longer qualifies as a Start-up -ompany). - -APPENDIX 5: NON-COMMERCIAL USE -The provisions of this Appendix 5 are applicable for non-commercial use of -the Licensed Software by the Licensee. - -For the purpose of this Appendix 5, the following additional definitions -(replacing the relevant definition of the Agreement, where applicable) -shall be applicable: - -"Demo Units" shall mean (i) hardware development platform, which incorporates -the Licensed Software along with Licensee's software and/or hardware, and -(ii) prototype versions of Applications or Devices. - -"Designated User(s)" shall mean the employees and students of the Licensee. - -"Licensee Products" shall mean Applications and/or Devices. - -"Permitted Purpose" shall mean (i) Licensee's internal evaluation and -testing of Licensed Software, (ii) building Demo Units as well as (iii) -educational use. - -"Term" shall mean a period of twelve (12) months or any such other period -as may be agreed between the Parties. - -For the purpose of this Appendix 5, the following changes shall be agreed -with respect to relevant Sections of the Agreement: - - I. Recital (A) shall be replaced in its entirety to read as follows: - "(A) Licensee wishes to use the Licensed Software for the Permitted - Purpose." - II. Section 3.1 shall be replaced in its entirety to read as follows: - "The Qt Company grants to Licensee a personal, non-exclusive, - non-transferable, revocable, royalty-free license, valid for the - Term, to use, modify and copy the Licensed Software solely for the - Permitted Purpose. - Licensee may install copies of the Licensed Software on five (5) - computers per Designated User, provided that only the Designated - Users who have a valid Development License may use the Licensed - Software. - Licensee may demonstrate the Demo Units, provided that such - demonstrations must be conducted by Licensee, and the Demo Units - must remain in Licensee's possession and under Licensee's control - at all times. - For clarity, this Agreement does not (i) entitle Licensee to use - Licensed Software to create Applications or Devices (other than - prototypes thereof) or (ii) carry any distribution rights to - Licensee, but such rights are subject to and conditional upon - conclusion of a separate license agreement with The Qt Company." - III. Sections 3.2, 3.3, 8 and 10 shall be deleted. - IV. Section 3.4 shall be replaced in its entirety to read as follows: - "Licensee shall not: - - remove or alter any copyright, trademark or other proprietary - rights notice contained in any portion of the Licensed Software; - - transfer, publish, sublicense, disclose, display or otherwise - make the Licensed Software available to any third party (except - that Licensee may demonstrate the Demo Units pursuant to Section - 3.1); - - in any way combine, incorporate or integrate Licensed Software - with, or use Licensed Software for creation of, any software - created with or incorporating Open Source Qt; - - Licensee shall cause all Designated Users who make use of the - licenses granted under this Agreement, to be contractually bound - to comply with the relevant terms of this Agreement and not to use - the Licensed Software beyond the terms hereof. Licensee shall be - responsible for any and all actions and omissions of its - Designated Users relating to the Licensed Software and use - thereof. - - Any use of Licensed Software beyond the provisions of this - Agreement is strictly prohibited and requires an additional license - from The Qt Company." - V. Section 12 shall be replaced in its entirety to read as follows: - "This Agreement shall enter into force upon due acceptance by both - Parties and remain in force for the Term, unless and until - terminated pursuant to the terms of Section 12. - - Upon termination of the Agreement, Licensee shall cease using the - Licensed Software. All other copies of Licensed Software in the - possession or control of Licensee must be erased or destroyed. - An officer of Licensee must, upon request, promptly deliver to - The Qt Company a written confirmation that this has occurred." - -Except for the modifications specified above, this Appendix carries no -change to the terms of the Agreement which shall remain in full force. diff --git a/.QT-FOR-AUTOMOTIVE-LICENSE-AGREEMENT b/.QT-FOR-AUTOMOTIVE-LICENSE-AGREEMENT deleted file mode 100644 index a2b96062..00000000 --- a/.QT-FOR-AUTOMOTIVE-LICENSE-AGREEMENT +++ /dev/null @@ -1,894 +0,0 @@ -QT AUTOMOTIVE SUITE LICENSE AGREEMENT -Agreement version 3.0 - -This Qt Automotive Suite License Agreement (“Agreement”) is a legal agreement -between The Qt Company (as defined below) and the Licensee (as defined below) -for the license of Licensed Software (as defined below). Capitalized terms used -herein are defined in Section 1. - -WHEREAS: - -(A) Licensee wishes to use the Licensed Software for the purpose of developing -and distributing Applications and/or Devices; and - -(B) The Qt Company is willing to grant the Licensee a right to use Licensed -Software for such purpose pursuant to term and conditions of this Agreement. - -NOW, THEREFORE, THE PARTIES HEREBY AGREE AS FOLLOWS: - -1. DEFINITIONS - -"Affiliate" of a Party shall mean an entity (i) which is directly or indirectly -controlling such Party; (ii) which is under the same direct or indirect -ownership or control as such Party; or (iii) which is directly or indirectly -owned or controlled by such Party. For these purposes, an entity shall be -treated as being controlled by another if that other entity has fifty percent -(50 %) or more of the votes in such entity, is able to direct its affairs and/or -to control the composition of its board of directors or equivalent body. - -"Applications" shall mean Licensee's software products created using the -Licensed Software in connection with the Program, which may include the -Redistributables, or part thereof. - -"Contractor(s)" shall mean third party consultants, distributors and contractors -performing services to a Party under applicable contractual arrangement. - -"Customer(s)" shall mean Licensee's end users to whom Licensee, directly or -indirectly, distributes copies of the Redistributables. - -"Deployment Platforms" shall mean operating systems specified in the License -Certificate, in which the Redistributables can be distributed pursuant to the -terms and conditions of this Agreement. - -"Designated User(s)" shall mean the employee(s) of Licensee or Licensee's -Affiliates acting within the scope of their employment or Licensee's -Contractors acting within the scope of their services for Licensee and on behalf -of Licensee. Designated Users shall be named in the License Certificate. - -"Development License" shall mean the license needed by the Licensee for each -Designated User to use the Licensed Software under the license grant described -in Section 3.1 of this Agreement. - -"Development Platforms" shall mean those operating systems specified in the -License Certificate, in which the Licensed Software can be used under the -Development License, but not distributed in any form or used for any other -purpose. - -"Devices" shall mean hardware devices or products that 1) are manufactured -and/or distributed by the Licensee or its Affiliates or Contractors in -connection with the Program, and (2)(i) incorporate or integrate the -Redistributables or parts thereof; or (ii) do not incorporate or integrate -the Redistributables at the time of distribution, but where, when used by a -Customer, the main user interface or substantial functionality of such -device is provided by Application(s) or otherwise depends on the Licensed -Software. - -"Distribution License(s)" shall mean the license required for distribution of -Redistributables in accordance with the license grant described in Section -3.2(ii)-(iii) of this Agreement. - -"Distribution License Packs" shall mean set of prepaid Distribution Licenses -for distribution of Redistributables, as defined in The Qt Company's standard -price list, quote, Purchase Order confirmation or in an appendix hereto, as the -case may be. - -"Initial Support Term" shall mean a time period of twelve (12) months, -calculated from the effective date of this Agreement. - -"Intellectual Property Rights" shall mean patents (including utility models), -design patents, and designs (whether or not capable of registration), chip -topography rights and other like protection, copyrights, trademarks, service -marks, trade names, logos or other words or symbols and any other form of -statutory protection of any kind and applications for any of the foregoing -as well as any trade secrets. -"Licensee" shall mean the individual or legal entity that is party to this -Agreement, as identified on the signature page hereof. - -"License Certificate" shall mean a certificate accompanying the Licensed -Software and generated for each Designated User respectively. License -Certificate will specify the Designated User, the Development Platforms, -Deployment Platforms, Program and the Term of this Agreement. The terms of the -License Certificate are considered part of this Agreement and shall be updated -from time to time to reflect any changes to the foregoing terms relating to -Licensee's rights to the Licensed Software. - -"Licensee's Records" shall mean books and records that are likely to contain -information bearing on Licensee's compliance with this Agreement or the payments -due to The Qt Company under this Agreement, including, but not limited to: -assembly logs, sales records and distribution records. - -"Licensee´s SDK Contractors" shall mean Contractors of Licensee, who have -purchased or received SDK from the Licensee relating to the Program. - -"License Fee" shall mean the fee charged to the Licensee for rights granted -under the terms of this Agreement. - -"Licensed Software" shall mean all versions of The Qt Company's computer -software products, online or electronic documentation, associated media and -printed materials, including the source code, example programs and the -documentation, licensed to the Licensee under this Agreement. Licensed Software -does not include Third Party Software (as defined in Section 4) or Open Source -Qt. - -"Modified Software" shall mean bug-fixes, error corrections, patches or -modifications made to the Licensed Software by Licensee, including documentation -related thereto. - -"Online Services" shall mean any services or access to systems made available -by The Qt Company to the Licensee over the Internet relating to the Licensed -Software or for the purpose of use by the Licensee of the Licensed Software or -Support. Use of any such Online Services is discretionary for the Licensee and -some of them may be subject to additional fees. - -"Open Source Qt" shall mean all versions of The Qt Company's Qt computer -software products, online or electronic documentation, associated media and -printed materials, including the source code, example programs and the -documentation available under the terms of the GNU Lesser General Public -License, version 2.1 or later ("LGPL") or the GNU General Public License, -version 2.0 or later ("GPL"). - -"Party" or "Parties" shall mean Licensee and/or The Qt Company. - -"Program" shall mean Licensee´s business program for which purpose the Licensee -is entitled to use the Licensed Software and grant the Licensee's SDK -Contractors a right to use the Licensed Software as part of a SDK. - -"Redistributables" shall mean the portions of the Licensed Software set forth -in Appendix 1, Section 1 that may be distributed pursuant to the terms of this -Agreement in object code form only, including any relevant documentation. Where -relevant, any reference to Licensed Software in this Agreement shall include and -refer also to Redistributables. - -"SDK" or "Software Development Kit" shall mean a combination of software modules -including Licensed Software intended to be utilized in connection with the -Program. - -"Submitted Modified Software" shall have the meaning as set forth in Section -2.3. - -"Support" shall mean standard developer support that is provided by -The Qt Company to assist Designated Users in using the Licensed Software in -accordance with The Qt Company's standard support terms. - -"Support Renewal Term" shall mean a time period of twelve (12) months, -calculated from the end of the Initial Support Term or previous Support Renewal -Term, as applicable. - -"Support Term" shall mean the Initial Support Term and any possible Support -Renewal Terms(s) during which time the Licensee is eligible to receive for -Support for the Licensed Software. - -"Taxes" shall have the meaning set forth in Section 10.5. - -"Term" shall mean the validity period of this Agreement, as set forth in the -License Certificate. - -“The Qt Company” shall mean: - -(i) in the event Licensee is an individual residing in the United States or a -legal entity incorporated in the United States or having its headquarters in the -United States, The Qt Company Inc., a Delaware corporation with its office at -2350 Mission College Blvd., Suite 1020, Santa Clara, CA 95054, USA.; or - -(ii) in the event the Licensee is an individual residing outside of the United -States or a legal entity incorporated outside of the United States or having its -registered office outside of the United States, The Qt Company Ltd., a Finnish -company with its registered office at Bertel Jungin aukio D3A, 02600 Espoo, -Finland. - -"Updates" shall mean a release or version of the Licensed Software containing -bug fixes, error corrections and other changes that are generally made available -to users of the Licensed Software that have contracted for Support. Updates are -generally depicted as a change to the digits following the decimal in the -Licensed Software version number. The Qt Company shall make Updates available to -the Licensee under the Support. Updates shall be considered as part of the -Licensed Software hereunder. - -"Upgrades" shall mean a release or version of the Licensed Software containing -enhancements and new features and are generally depicted as a change to the -first digit of the Licensed Software version number. In the event Upgrades are -provided to the Licensee under this Agreement, they shall be considered as part -of the Licensed Software hereunder. - -2. OWNERSHIP 2.1 - -Ownership of The Qt Company - -The Licensed Software is protected by copyright laws and international copyright -treaties, as well as other intellectual property laws and treaties. The Licensed -Software is licensed, not sold. - -All The Qt Company's Intellectual Property Rights are and shall remain the -exclusive property of The Qt Company or its licensors respectively. - -2.2 Ownership of Licensee - -All the Licensee's Intellectual Property Rights are and shall remain the -exclusive property of the Licensee or its licensors respectively. - -All Intellectual Property Rights to the Modified Software, Applications and -Devices shall remain with the Licensee and no rights thereto shall be granted by -the Licensee to The Qt Company under this Agreement (except as set forth in -Section 2.3 below). - -2.3 Modified Software - -Licensee may create Modified Software that breaks the source or binary -compatibility with the Licensed Software. This includes, but is not limited to, -changing the application programming interfaces ("API") by adding, changing or -deleting any variable, method, or class signature in the Licensed Software -and/or any inter-process protocols, services or standards in the Licensed -Software libraries. To the extent that Licensee breaks source or binary -compatibility with the Licensed Software, Licensee acknowledges that The Qt -Company's ability to provide Support may be prevented or limited and Licensee's -ability to make use of Updates may be restricted. - -To the extent Licensee submits Modified Software to The Qt Company ("Submitted -Modified Software"), Licensee hereby grants The Qt Company a sublicensable, -assignable, irrevocable, perpetual, worldwide, non-exclusive, royalty-free and -fully paid-up license, under all of Licensee's Intellectual Property Rights, to -reproduce, adapt, translate, modify, and prepare derivative works of, publicly -display, publicly perform, sublicense, make available and distribute such -Submitted Modified Software as The Qt Company sees fit at its free and absolute -discretion. For the sake of clarity, the Licensee shall have no obligation to -provide Modified Software to The Qt Company. - -3. LICENSES GRANTED - -3.1 Development with Licensed Software - -Subject to the terms of this Agreement, The Qt Company grants to Licensee a -personal, worldwide, non- exclusive, non-transferable license, valid for the -Term, to use, modify and copy the Licensed Software by Designated Users on the -Development Platforms for the sole purposes of designing, developing, -demonstrating and testing Application(s) and/or Devices, and to provide thereto -related support and other services to end-user Customers. - -Licensee may install copies of the Licensed Software on an unlimited number of -computers provided that (i) only the Designated Users may use the Licensed -Software, and (ii) all Designated Users must have a valid Development License to -use Licensed Software. - -Licensee may at any time designate another Designated User to replace a -then-current Designated User by notifying The Qt Company in writing, provided -that any Designated User may be replaced only once during any six-month period. - -3.2 Distribution of Redistributables - -Subject to the terms of this Agreement, The Qt Company grants to Licensee a -personal, worldwide, non- exclusive, non-transferable license, valid for the -Term, to (i) distribute, by itself or through its Contractors, Redistributables -as installed, incorporated or integrated into Applications for execution on the -Deployment Platforms, and (ii) distribute, by itself or through one or more -tiers of Contractors, Redistributables as installed, incorporated or integrated, -or intended to be installed, incorporated or integrated into Devices for -execution on the Deployment Platforms, and (iii) grant sublicenses to -Redistributables, as distributed hereunder, for Customers solely for Customer's -internal use and to the extent necessary in order for the Customers to use the -Applications and/or Devices for their respective intended purposes. - -Right to distribute the Redistributables as provided herein is conditional upon -the Licensee having purchased and paid the appropriate amount of Development and -Distribution Licenses from The Qt Company before distributing any -Redistributables to Customers. - -For the avoidance of any doubt it is specifically acknowledged and agreed that -distribution of Redistributables solely as installed, incorporated or integrated -into Applications for execution on the Deployment Platform(s), as specified in -(i) of the first paragraph of Section 3.2 above, i.e. with no connection to -Devices or intention to use in connection therewith, shall not require a -Distribution License. - -3.3 SDK License - -The Qt Company grants to Licensee a personal, worldwide, non-exclusive, -non-transferable license, valid for the Term, to (i) distribute Licensed -Software as a part of the SDK to Licensee´s SDK Contractors in connection with -the Program and (ii) in connection with the Program, by itself or by Licensee's -SDK Contractors, combine, incorporate or integrate Licensed Software with, or -use Licensed Software for creation of, any software created with or -incorporating Open Source Qt, provided, however, that: - -(i) the Licensee´s SDK Contractors are only entitled to use the Licensed -Software as part of SDK and for the sole purpose of developing software for -Devices that are distributed under the Program; and - -(ii) Licensee´s SDK Contractors shall not be entitled to distribute the SDK or -any part thereof to any third parties. - -For the avoidance of any doubt, the distribution of such software development -tools that do not contain Licensed Software shall not be covered by this -Agreement. - -3.4 Further Requirements - -The licenses granted above in this Section 3 by The Qt Company to Licensee are -conditional and subject to Licensee's compliance with the following terms: - -(i) Licensee shall not remove or alter any copyright, trademark or other -proprietary rights notice contained in any portion of the Licensed Software; - -(ii) Applications and SDKs must add primary and substantial functionality to the -Licensed Software; - -(iii) Applications may not pass on functionality which in any way makes it -possible for others to create software with the Licensed Software; provided -however that Licensee may use the Licensed Software's scripting and QML ("Qt -Quick") functionality solely in order to enable scripting, themes and styles -that augment the functionality and appearance of the Application(s) without -adding primary and substantial functionality to the Application(s); - -(iv) Applications and SDKs must not compete with the Licensed Software; - -(v) Licensee shall not use The Qt Company's or any of its suppliers' names, -logos, or trademarks to market Applications or SDKs, except that Licensee may -use "Built with Qt" logo to indicate that Application(s) was developed using -the Licensed Software; - -(vi) Except as expressly provided in Section 3.3, Licensee shall not -distribute, sublicense or disclose source code of Licensed Software to any third -party (provided however that Licensee may appoint employee(s) of Contractors as -Designated Users to use Licensed Software pursuant to this Agreement); - -(vii) Licensee shall not grant the Customers a right to (i) make copies of the -Redistributables except when and to the extent required to use the Applications -and/or Devices for their intended purpose, (ii) modify the Redistributables or -create derivative works thereof, (iii) decompile, disassemble or otherwise -reverse engineer Redistributables, or (iv) redistribute any copy or portion of -the Redistributables to any third party, except as part of the onward sale of -the Device on which the Redistributables are installed; - -(viii) Except as expressly provided in Section 3.3, Licensee shall not and -shall cause that its Affiliates, Contractors and Licensee's SDK Contractors -shall not a) in any way, combine, incorporate or integrate Licensed Software -with, or use Licensed Software for creation of, any software created with or -incorporating Open Source Qt or b) incorporate or integrate Applications into a -hardware device or product other than a Device, unless Licensee has received an -advance written permission from The Qt Company to do so. Unless specifically -otherwise agreed, any and all distribution by the Licensee during the Term of -a hardware device or product a) which incorporate or integrate any part of -Licensed Software or Open Source Qt; or b) where the main user interface or -substantial functionality is provided by software build with Licensed -Software or Open Source Qt or otherwise depends on the Licensed Software or Open -Open Source Qt, shall be considered as distribution under this Agreement and -dependent on compliance thereof (including but not limited to obligation to -pay applicable License Fees for such distribution); - -(ix) Licensee shall cause all of its Affiliates and Contractors entitled to make -use of the licenses granted under this Agreement, to be contractually bound to -comply with the relevant terms of this Agreement and not to use the Licensed -Software beyond the terms hereof and for any purposes other than operating -within the scope of their services for Licensee. Licensee shall be responsible -for any and all actions and omissions of its Affiliates and Contractors relating -to the Licensed Software and use thereof (including but not limited to payment -of all applicable License Fees); - -(x) Except when and to the extent explicitly provided in this Section 3, -Licensee shall not transfer, publish, disclose, display or otherwise make -available the Licensed Software; - -(xi) Licensee shall not take any action inconsistent with The Qt Company's -Intellectual Property Rights; and - -(xii) Attempt or enlist a third party to conduct or attempt to conduct any of -the above. - -Above terms shall not be applicable if and to the extent they conflict with any -mandatory provisions of any applicable laws. - -Any use of Licensed Software beyond the provisions of this Agreement is strictly -prohibited and requires an additional license from The Qt Company. - -4. THIRD PARTY SOFTWARE - -The Licensed Software may provide links to third party libraries or code -(collectively "Third Party Software") to implement various functions. Third -Party Software does not comprise part of the Licensed Software. In some cases, -access to Third Party Software may be included in the Licensed Software. Such -Third Party Software will be listed in the ".../src/3rdparty" source tree -delivered with the Licensed Software or documented in the Licensed Software, as -such may be amended from time to time. Licensee acknowledges that use or -distribution of Third Party Software is in all respects subject to applicable -license terms of applicable third party right holders. 5. PRE-RELEASE CODE - -The Licensed Software may contain pre-release code and functionality marked or -otherwise stated as "Technology Preview", "Alpha", "Beta" or similar -designation. Such pre-release code may be present in order to provide -experimental support for new platforms or preliminary versions of one or more -new functionalities. The pre-release code may not be at the level of performance -and compatibility of a final, generally available, product offering of the -Licensed Software. The pre-release parts of the Licensed Software may not -operate correctly, may contain errors and may be substantially modified by The -Qt Company prior to the first commercial product release, if any. The Qt Company -is under no obligation to make pre-release code commercially available, or -provide any Support or Updates relating thereto. The Qt Company assumes no -liability whatsoever regarding any pre-release code, but any use thereof is -exclusively at Licensee's own risk and expense. - -6. LIMITED WARRANTY AND WARRANTY DISCLAIMER - -The Qt Company hereby represents and warrants that it has the power and -authority to grant the rights and licenses granted to Licensee under this -Agreement. - -Except as set forth above, the Licensed Software is licensed to Licensee "as -is". - -TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, THE QT COMPANY ON BEHALF OF -ITSELF AND ITS LICENSORS, SUPPLIERS AND AFFILIATES, DISCLAIMS ALL WARRANTIES, -EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, ANY IMPLIED WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT -WITH REGARD TO THE LICENSED SOFTWARE. THE QT COMPANY DOES NOT WARRANT THAT THE -LICENSED SOFTWARE WILL SATISFY LICENSEE'S REQUIREMENTS OR THAT IT WILL OPERATE -WITHOUT DEFECT OR ERROR OR THAT THE OPERATION THEREOF WILL BE UNINTERRUPTED. ALL -USE OF AND RELIANCE ON THE LICENSED SOFTWARE IS AT THE SOLE RISK OF AND -RESPONSIBILITY OF LICENSEE. - -Licensee's exclusive remedy and The Qt Company's entire liability for Licensed -Software shall be limited, at The Qt Company's option, to correction of the -error, replacement of the Licensed Software or return of the applicable fees -paid for the defective Licensed Software for the time period during which the -License is not able to utilize the Licensed Software under the terms of this -Agreement. - -7. INDEMNIFICATION AND LIMITATION OF LIABILITY - -7.1 Limitation of Liability - -EXCEPT FOR (I) CASES OF GROSS NEGLIGENCE OR INTENTIONAL MISCONDUCT, (II) -LICENSEE'S DUTY TO PAY ALL APPLICABLE LICENSE FEES AND COMPENSATIONS, AND (III) -BREACH OF CONFIDENTIALITY, AND TO THE EXTENT PERMITTED BY APPLICABLE LAW, IN NO -EVENT SHALL EITHER PARTY BE LIABLE TO THE OTHER PARTY FOR ANY LOSS OF PROFIT, -LOSS OF DATA, LOSS OF BUSINESS OR GOODWILL OR ANY OTHER INDIRECT, SPECIAL, -CONSEQUENTIAL, INCIDENTAL OR PUNITIVE COST, DAMAGES OR EXPENSE OF ANY KIND, -HOWSOEVER ARISING UNDER OR IN CONNECTION WITH THIS AGREEMENT. - -EXCEPT FOR (I) CASES OF GROSS NEGLIGENCE OR INTENTIONAL MISCONDUCT, (II) -LICENSEE'S DUTY TO PAY ALL APPLICABLE LICENSE FEES AND COMPENSATIONS, AND (III) -BREACH OF CONFIDENTIALITY, AND TO THE EXTENT PERMITTED BY APPLICABLE LAW, IN NO -EVENT SHALL EITHER PARTY'S TOTAL AGGREGATE LIABILITY UNDER THIS AGREEMENT EXCEED -THE AGGREGATE LICENSE FEES RECEIVED BY THE QT COMPANY FROM LICENSEE DURING THE -PERIOD OF TWELVE (12) MONTHS IMMEDIATELY PRECEDING THE EVENT RESULTING IN SUCH -LIABILITY. - -THE PROVISIONS OF THIS SECTION 7 ALLOCATE THE RISKS UNDER THIS AGREEMENT BETWEEN -THE QT COMPANY AND LICENSEE AND THE PARTIES HAVE RELIED UPON THE LIMITATIONS SET -FORTH HEREIN IN DETERMINING WHETHER TO ENTER INTO THIS AGREEMENT. - -7.2 Licensee´s Indemnification - -Licensee shall indemnify and hold harmless The Qt Company from and against any -claim, injury, judgment, settlement, loss or expense, including attorneys' fees -related to: (a) Licensee's misrepresentation in connection with The Qt Company -or the Licensed Software or breach of this Agreement, (b) the Application or -Device (except where such cause of liability is solely attributable to the -Licensed Software). - -8. SUPPORT, UPDATES AND ONLINE SERVICES - -Licensee will be eligible to receive Support and Updates and to use the Online -Services during the Support Term. Unless otherwise decided by The Company at its -free and absolute discretion, Upgrades will not be included in the Support but -may be available subject to additional fees. - -Licenses granted under this Agreement shall include a prepaid Initial Support -Term. - -Initial Support Term shall be automatically extended to one or more Support -Renewal Term(s), unless and until either Party notifies the other Party in -writing that it does not wish to continue the Support, such notification to be -provided to the other Party no less than ninety (90) days before expiry of the -Initial Support Term or respective Support Renewal Term. During any such Support -Renewal Term Support shall be available subject to prices and terms agreed -between the Parties or, if no advance agreement exists, subject to The Qt -Company's standard pricing applicable at the commencement date of any such -Support Renewal Term. From time to time The Qt Company may change Support -provided within each Support plan; provided that during the respective Initial -Support Term or Support Renewal Term (as the case may be), the level of Support -provided by The Qt Company may not be reduced without the consent of the -Licensee. - -Unless otherwise agreed, The Qt Company shall not be responsible for providing -any service or support to the Customers. - -9. CONFIDENTIALITY - -Each Party acknowledges that during the Term of this Agreement each Party may -receive information about the other Party's business, business methods, business -plans, customers, business relations, technology, and other information, -including the terms of this Agreement, that is confidential and of great value -to the other Party, and the value of which would be significantly reduced if -disclosed to third parties ("Confidential Information"). Accordingly, when a -Party (the "Receiving Party") receives Confidential Information from the other -Party (the "Disclosing Party"), the Receiving Party shall only disclose such -information to employees and Contractors on a need to know basis, and shall -cause its employees and employees of its Affiliates to: (i) maintain any and all -Confidential Information in confidence; (ii) not disclose the Confidential -Information to a third party without the Disclosing Party's prior written -approval; and (iii) not, directly or indirectly, use the Confidential -Information for any purpose other than for exercising its rights and fulfilling -its responsibilities pursuant to this Agreement. Each Party shall take -reasonable measures to protect the Confidential Information of the other Party, -which measures shall not be less than the measures taken by such Party to -protect its own confidential and proprietary information. - -Obligation of confidentiality shall not apply to information that (i) is or -becomes generally known to the public through no act or omission of the -Receiving Party; (ii) was in the Receiving Party's lawful possession prior to -the disclosure hereunder and was not subject to limitations on disclosure or -use; (iii) is developed independently by employees or Contractors of the -Receiving Party or other persons working for the Receiving Party who have not -had access to the Confidential Information of the Disclosing Party, as proven by -the written records of the Receiving Party; (iv) is lawfully disclosed to the -Receiving Party without restrictions, by a third party not under an obligation -of confidentiality; or (v) the Receiving Party is legally compelled to disclose, -in which case the Receiving Party shall notify the Disclosing Party of such -compelled disclosure and assert the privileged and confidential nature of the -information and cooperate fully with the Disclosing Party to limit the scope of -disclosure and the dissemination of disclosed Confidential Information to the -minimum extent necessary. - -The obligations under this Section 9 shall continue to remain in force for a -period of five (5) years after the last disclosure, and, with respect to trade -secrets, for so long as such trade secrets are protected under applicable trade -secret laws. - -10. FEES, DELIVERY AND PAYMENT - -10.1 License Fees - -License Fees are described in The Qt Company's standard price list, quote or -Purchase Order confirmation or in an appendix hereto, as the case may be. The -License Fees shall not be refunded or claimed as a credit, even on the ground -that Distribution Licenses are not used, i.e. Redistributables are not actually -distributed corresponding to the Distribution Licenses purchased, or for any -other reason. - -10.2 Ordering Licenses - -Licensee may purchase Development Licenses and Distribution Licenses pursuant to -agreed pricing terms or, if no specific pricing terms have been agreed upon, at -The Qt Company's standard pricing terms applicable at the time of purchase. - -Licensee shall submit all purchase orders for Development Licenses and -Distribution Licenses to The Qt Company by email or any other method acceptable -to The Qt Company (each such order is referred to herein as a "Purchase Order") -for confirmation, whereupon the Purchase Order shall become binding between the -Parties. - -10.3 Distribution - -License Packs Unless otherwise agreed, the Distribution Licenses are bought by -way of Distribution License Packs. - -Upon due payment of the ordered Distribution License Pack(s), the Licensee will -have an account of Distribution Licenses available for installing, bundling or -integrating (all jointly "installing") the Redistributables with the Devices or -for otherwise distributing the Redistributables in accordance with this -Agreement. - -Each time Licensee "installs" or distributes a copy of Redistributables, then -one Distribution License is used, and Licensee's account of available -Distribution Licenses is decreased accordingly. - -Licensee may "install" copies of the Redistributables so long as Licensee has -Distribution Licenses remaining on its account. - -Redistributables will be deemed to have been "installed" into a Device when one -of the following circumstances shall have occurred: a) the Redistributables -have been loaded onto the Device and used outside of the Licensee's premises or -b) the Device has been fully tested and placed into Licensee's inventory (or -sold) for the first time (i.e., Licensee will not be required to use (or pay -for) more than one Distribution License for each individual Device, e.g. in a -situation where a Device is returned to Licensee's inventory after delivery to -a distributor or sale to a Customer). In addition, if Licensee includes a -back-up copy of the Redistributables on a CD-ROM or other storage medium -along with the product, that backup copy of the Redistributables will not -be deemed to have been "installed" and will not require an additional -Distribution License. - -10.4 Payment Terms -License Fees and any other charges under this Agreement shall be paid by -Licensee no later than thirty (30) days from the date of the applicable invoice -from The Qt Company. - -The Qt Company will submit an invoice to Licensee after the date of this -Agreement and/or after The Qt Company receives a Purchase Order from Licensee. -A late payment charge of the lower of (a) one percent per month; or (b) the -interest rate stipulated by applicable law, shall be charged on any unpaid -balances that remain past due. - -The Qt Company shall have the right to suspend, terminate or withhold grants of -all rights to the Licensed Software hereunder, including but not limited to the -Developer License, Distribution License, and Support, should Licensee fail to -make payment in a timely fashion. - -10.5 Taxes -All License Fees and other charges payable hereunder are gross amounts but -exclusive of any value added tax, use tax, sales tax and other taxes, duties or -tariffs ("Taxes"). Such applicable Taxes shall be paid by Licensee, or, where -applicable, in lieu of payment of such Taxes, Licensee shall provide an -exemption certificate to The Qt Company and any applicable authority. - -11 RECORD-KEEPING AND REPORTING OBLIGATIONS; AUDIT RIGHTS - -11.1 Licensee's Record-keeping - -Licensee shall at all times maintain accurate and up-to-date written records of -Licensee's activities related to the use of Licensed Software and distribution -of Redistributables. The records shall be adequate to determine Licensee's -compliance with the provisions of this Agreement and to demonstrate the number -of Designated Users and Redistributables distributed by Licensee. The records -shall conform to good accounting practices reasonably acceptable to The Qt -Company. - -Licensee shall, within thirty (30) days from the end of each calendar -quarter, deliver to The Qt Company a report detailing the number of Designated -Users and copies of Redistributables distributed by Licensee during that -calendar quarter, and also detailing the number of undistributed copies of -Redistributables made by Licensee and remaining in its account (i.e., -undistributed copies for which Distribution Licenses have been or need to be -obtained from The Qt Company). Such report shall contain such other information -as The Qt Company shall reasonably require from time to time. - -11.2. The Qt Company's Audit Rights - -The Qt Company or an independent auditor acting on behalf of The Qt Company's, -may, upon at least five (5) business days' prior written notice and at its -expense, audit Licensee with respect to the use of the Redistributables, but -not more frequently than once during each 6-month period. Such audit may be -conducted by mail, electronic means or through an in-person visit to -Licensee's place of business. Any such in-person audit shall be conducted -during regular business hours at Licensee's facilities and shall not -unreasonably interfere with Licensee's business activities. The Qt Company or -the independent auditor acting on behalf of The Qt Company shall be entitled to -inspect Licensee's Records. All such Licensee's Records and use thereof shall be -subject to an obligation of confidentiality under this Agreement. - -If an audit reveals that Licensee is using the Licensed Software beyond scope of -the licenses Licensee has paid for, Licensee agrees to immediately pay The Qt -Company any amounts owed for such unauthorized use. - -In addition, in the event the audit reveals a material violation of the terms of -this Agreement (underpayment of more than 5% of License Fees shall always be -deemed a material violation for purposes of this section), then the Licensee -shall pay The Qt Company's reasonable cost of conducting such audit. - -12 TERM AND TERMINATION - -12.1 Term - -This Agreement shall enter into force upon due acceptance by both Parties and -remain in force for the Term, unless and until terminated pursuant to the terms -of this Section 12. - -12.2 Termination by The Qt Company - -The Qt Company shall have the right to terminate this Agreement upon thirty -(30) days prior written notice if (i) the Licensee is in material breach of any -obligation of this Agreement and fails to remedy such breach within such notice -period; (ii) or Licensee or any of its Affiliates bring a suit before any court -or administrative agency or otherwise assert a claim against The Qt Company's -or any of its Affiliates' Intellectual Property Rights or validity thereof. - -12.3 Mutual Right to Terminate - -Either Party shall have the right to terminate this Agreement immediately upon -written notice in the event that the other Party becomes insolvent, files for -any form of bankruptcy, makes any assignment for the benefit of creditors, has a -receiver, administrative receiver or officer appointed over the whole or a -substantial part of its assets, ceases to conduct business, or an act equivalent -to any of the above occurs under the laws of the jurisdiction of the other -Party. - -12.4 Parties´ Rights and Duties upon Termination - -Upon expiry or termination of the Agreement for any reason, Licensee shall, -within 30 days after such termination, cease and shall cause all Designated -Users (including those of its Affiliates' and Contractors') and Licensee's SDK -Contractors to cease using the Licensed Software and distribution of the -Redistributables under this Agreement. Notwithstanding the above, in the event -the Agreement expires or is terminated for reason other than by The Qt Company -pursuant to Section 12.2, the Licensee is entitled, for a period of six (6) -months after the effective date of termination, to continue distribution of -Devices under the Distribution Licenses paid but unused at such effective date -of termination. - -Upon any such termination the Licensee shall destroy or return to The Qt -Company all copies of the Licensed Software and all related materials and will -certify the same to The Qt Company upon its request, provided however that -Licensee may retain and exploit such copies of the Licensed Software as it may -reasonably require in providing continued support to Customers. - -Expiry or termination of this Agreement for any reason whatsoever shall not -relieve Licensee of its obligation to pay any License Fees accrued or payable -to The Qt Company prior to the effective date of termination, and Licensee shall -immediately pay to The Qt Company all such fees upon the effective date of -termination. Termination of this Agreement shall not affect any rights of -Customers to continue use of Applications and Devices (and therein incorporated -Redistributables). - -13.GOVERNING LAW AND LEGAL VENUE - -In the event this Agreement is in the name of The Qt Company Inc., a Delaware -Corporation, then: - -(i) this Agreement shall be construed and interpreted in accordance with the -laws of the State of California, USA, excluding its choice of law provisions; - -(ii) the United Nations Convention on Contracts for the International Sale of -Goods will not apply to this Agreement; and - -(iii) any dispute, claim or controversy arising out of or relating to this -Agreement or the breach, termination, enforcement, interpretation or validity -thereof, including the determination of the scope or applicability of this -Agreement to arbitrate, shall be determined by arbitration in San Francisco, -USA, before one arbitrator. The arbitration shall be administered by JAMS -pursuant to JAMS' Streamlined Arbitration Rules and Procedures. Judgment on the -Award may be entered in any court having jurisdiction. This Section shall not -preclude parties from seeking provisional remedies in aid of arbitration from a -court of appropriate jurisdiction. - -In the event this Agreement is in the name of The Qt Company Ltd., a Finnish -Company, then: - -(i) this Agreement shall be construed and interpreted in accordance with the -laws of Finland, excluding its choice of law provisions; - -(ii) the United Nations Convention on Contracts for the International Sale of -Goods will not apply to this Agreement; and - -(iii) any disputes, controversy or claim arising out of or relating to this -Agreement, or the breach, termination or validity thereof shall be shall be -finally settled by arbitration in accordance with the Arbitration Rules of -Finland Chamber of Commerce. The arbitration tribunal shall consist of one (1), -or if either Party so requires, of three (3), arbitrators. The award shall be -final and binding and enforceable in any court of competent jurisdiction. The -arbitration shall be held in Helsinki, Finland and the process shall be -conducted in the English language. This Section shall not preclude parties from -seeking provisional remedies in aid of arbitration from a court of appropriate -jurisdiction. - -14. GENERAL PROVISIONS - -14.1 No Assignment Licensee - -shall not be entitled to assign or transfer all or any of its rights, benefits -and obligations under this Agreement without the prior written consent of The Qt -Company, which shall not be unreasonably withheld or delayed. The Qt Company -shall be entitled to freely assign or transfer any of its rights, benefits or -obligations under this Agreement. - -14.2 No Third Party Representations - -Licensee shall make no representations or warranties concerning the Licensed -Software on behalf of The Qt Company. Any representation or warranty Licensee -makes or purports to make on The Qt Company's behalf shall be void as to The Qt -Company. - -14.3 Surviving Sections - -Any terms and conditions that by their nature or otherwise reasonably should -survive termination of this Agreement shall so be deemed to survive. - -14.4 Entire Agreement - -This Agreement, the exhibits hereto, the License Certificate and any applicable -Purchase Order constitute the complete agreement between the Parties and -supersedes all prior or contemporaneous discussions, representations, and -proposals, written or oral, with respect to the subject matters discussed -herein. In the event of any conflict or inconsistency between this Agreement and -any Purchase Order, the terms of this Agreement will prevail over the terms of -the Purchase Order with respect to such conflict or inconsistency. - -14.5 Modifications - -No modification of this Agreement shall be effective unless contained in a -writing executed by an authorized representative of each Party. No term or -condition contained in Licensee's Purchase Order shall apply unless expressly -accepted by The Qt Company in writing. - -14.6 Force Majeure - -Except for the payment obligations hereunder, neither Party shall be liable to -the other for any delay or non-performance of its obligations hereunder in the -event and to the extent that such delay or non- performance is due to an event -of act of God, terrorist attack or other similar unforeseeable catastrophic -event that prevents either Party for fulfilling its obligations under this -Agreement and which such Party cannot avoid or circumvent ("Force Majeure -Event"). If the Force Majeure Event results in a delay or non- performance of a -Party for a period of three (3) months or longer, then either Party shall have -the right to terminate this Agreement with immediate effect without any -liability (except for the obligations of payment arising prior to the event of -Force Majeure) towards the other Party. - -14.7 Notices - -Any notice given by one Party to the other shall be deemed properly given and -deemed received if specifically acknowledged by the receiving Party in writing -or when successfully delivered to the recipient by hand, fax, or special courier -during normal business hours on a business day to the addresses specified for -The Qt Company in the beginning of this Agreement, and for the Licensee in the -Licensee’s account profile. Each communication and document made or delivered by -one Party to the other Party pursuant to this Agreement shall be in the English -language. - -14.8 Export Control -Licensee acknowledges that the Redistributables may be subject to export -control restrictions under the applicable laws of respective countries. -Licensee shall fully comply with all applicable export license restrictions -and requirements as well as with all lawses hereunder and shall procure all -necessary governmental authorizations, including without limitation, all -necessary licenses, approvals, permissions or consents, where necessary for -the re- exportation of the Redistributables, Applications -and/or Devices. - -14.9 No Implied License -There are no implied licenses or other implied rights granted under this -Agreement, and all rights, save for those expressly granted hereunder, shall -remain with The Qt Company and its licensors. In addition, no licenses or -immunities are granted to the combination of the Licensed Software with any -other software or hardware not delivered by The Qt Company under this Agreement. - -14.10 Attorney Fees - -The prevailing Party in any action to enforce this Agreement shall be entitled -to recover its attorney's fees and costs in connection with such action. - -14.11 Severability - -If any provision of this Agreement shall be adjudged by any court of competent -jurisdiction to be unenforceable or invalid, that provision shall be limited or -eliminated to the minimum extent necessary so that this Agreement shall -otherwise remain in full force and effect and enforceable. - -IN WITNESS WHEREOF, the Parties hereto, intending to be legally bound hereby, -have caused this Agreement to be executed by Licensee’s authorized -representative installing the Licensed Software and accepting the terms hereof -in connection therewith. - -Appendix 1 - -1. Parts of the Licensed Software that are permitted for distribution in object -code form only ("Redistributables") under this Agreement: - -- The Licensed Software's essential and add-on libraries - -- The Licensed Software's configuration tool ("qtconfig") - -- The Licensed Software's help tool ("Qt Assistant") - -- The Licensed Software's internationalization tools ("Qt Linguist", "lupdate", -"lrelease") - -- The Licensed Software's QML ("Qt Quick") launcher tool ("qmlscene" and -"qmlviewer") - -- The Licensed Software's installer framework - -2. Parts of the Licensed Software that are not permitted for distribution -include, but are not limited to: - -- The Licensed Software's source code and header files - -- The Licensed Software's documentation - -- The Licensed Software's documentation generation tool ("qdoc") - -- The Licensed Software's tool for writing makefiles ("qmake") - -- The Licensed Software's Meta Object Compiler ("moc") - -- The Licensed Software's User Interface Compiler ("uic" or in the case of Qt Jambi: "juic") - -- The Licensed Software's Resource Compiler ("rcc") - -- The Licensed Software's generator (only in the case of Qt Jambi if applicable) - -- The Licensed Software's parts of the IDE tool ("Qt Creator") - -- The Licensed Software's Emulator - -- Build scripts, recipes and other material for creating the -configuration of Licensed Software and/or 3rd party components, including the -reference operating system configuration delivered in conjunction with the diff --git a/.QT-FOR-DEVICE-CREATION-LICENSE-AGREEMENT b/.QT-FOR-DEVICE-CREATION-LICENSE-AGREEMENT deleted file mode 100644 index 386577c6..00000000 --- a/.QT-FOR-DEVICE-CREATION-LICENSE-AGREEMENT +++ /dev/null @@ -1,1315 +0,0 @@ -QT LICENSE AGREEMENT -Agreement version 4.3 - -This Qt License Agreement ("Agreement") is a legal agreement for the licensing -of Licensed Software (as defined below) between The Qt Company (as defined -below) and the Licensee who has accepted the terms of this Agreement by -downloading or using the Licensed Software and/or as defined herein: - -Capitalized terms used herein are defined in Section 1. - -WHEREAS: - (A) Licensee wishes to use the Licensed Software for the purpose of - developing and distributing Applications and/or Devices (each as - defined below); and - (B) The Qt Company is willing to grant the Licensee a right to use - Licensed Software for such a purpose pursuant to term and conditions - of this Agreement. - -NOW, THEREFORE, THE PARTIES HEREBY AGREE AS FOLLOWS: - -1. DEFINITIONS - -"Affiliate" of a Party shall mean an entity (i) which is directly -or indirectly controlling such Party; (ii) which is under the same direct or -indirect ownership or control as such Party; or (iii) which is directly or -indirectly owned or controlled by such Party. For these purposes, an entity -shall be treated as being controlled by another if that other entity has fifty -percent (50 %) or more of the votes in such entity, is able to direct its -affairs and/or to control the composition of its board of directors or -equivalent body. - -"Add-on Products" shall mean The Qt Company's specific add-on software products -(for example Qt Safe Renderer, Qt for Automation, Qt Application Manager), which -are not licensed as part of The Qt Company's standard offering, but shall be -included into the scope of Licensed Software only if so specifically agreed -between the Parties. - -"Applications" shall mean Licensee's software products created using the -Licensed Software, which may include the Redistributables, or part thereof. - -"Contractor(s)" shall mean third party consultants, distributors and contractors -performing services to the Licensee under applicable contractual arrangement. - -"Customer(s)" shall mean Licensee's end users to whom Licensee, directly or -indirectly, distributes copies of the Redistributables. - -"Data Protection Legislation" shall mean the General Data Protection Regulation -(EU 2016/679) (GDPR) and any national implementing laws, regulations and -secondary legislation, as may be amended or updated from time to time, as well -as any other data protection laws or regulations applicable in relevant -territory. - -"Deployment Platforms" shall mean operating systems and/or hardware specified -in the License Certificate, on which the Redistributables can be distributed -pursuant to the terms and conditions of this Agreement. - -"Designated User(s)" shall mean the employee(s) of Licensee or Licensee's -Affiliates acting within the scope of their employment or Licensee's Contractors -acting within the scope of their services for Licensee and on behalf of -Licensee. Designated Users shall be named in the License Certificate. - -"Development License" shall mean the license needed by the Licensee for each -Designated User to use the Licensed Software under the license grant described -in Section 3.1 of this Agreement. Development Licenses are available per -respective Licensed Software products, each product having its designated scope -and purpose of use. Distribution Licenses are always connected to Qt for Device -Creation product and Qt for MCUs product only. - -"Development Platforms" shall mean those operating systems specified in the -License Certificate, in which the Licensed Software can be used under the -Development License, but not distributed in any form or used for any other purpose. - -"Devices" shall mean hardware devices or products that 1) are manufactured -and/or distributed by the Licensee or its Affiliates or Contractors, and (2)(i) -incorporate or integrate the Redistributables or parts thereof; or (ii) where -the main user interface or substantial functionality of such unit , when used by -a Customer, is provided by Application(s) or otherwise depends on the Licensed -Software, regardless of whether the Redistributables are distributed together -with the hardware or not. Devices covered with this Agreement shall be specified -in Appendix 2 or in a quote. - -"Distribution License(s)" shall mean the license required for any kind of sale, -trade, exchange, loan, lease, rental or other distribution by or on behalf of -Licensee to a third party of Redistributables in connection with Devices -ursuant to license grant described in Section 3.3 of this Agreement. - -"Distribution License Packs" shall mean set of prepaid Distribution Licenses for -distribution of Redistributables, as defined in The Qt Company's standard price -list, quote, Purchase Order confirmation or in an appendix hereto, as the case -may be. - -"Intellectual Property Rights" shall mean patents (including utility models), -design patents, and designs (whether or not capable of registration), chip -topography rights and other like protection, copyrights, trademarks, service -marks, trade names, logos or other words or symbols and any other form of -statutory protection of any kind and applications for any of the foregoing as -well as any trade secrets. - -"License Certificate" shall mean a certificate generated by The Qt Company for -each Designated User respectively upon them downloading the Licensed Software, -which will be available under respective Designated User's Qt Account at -account.qt.io. License Certificates will specify the Designated User, the -Development Platforms, Deployment Platforms and the License Term. Such terms are -considered part of the licenses granted hereunder and shall be updated from time -to time to reflect any agreed changes to the foregoing terms relating to -Designated User's rights to the Licensed Software. - -"License Fee" shall mean the fee charged to the Licensee for rights granted -under the terms of this Agreement. - -"License Term" shall mean the agreed validity period of the Development License -of the respective Designated User, during which time the Designated User is -entitled to use the Licensed Software, as set forth in the respective License -Certificate. - -"Licensed Software" shall mean either - (i) Qt for Application Development or - (ii) Qt for Device Creation, and/or - (iii) Qt 3D Studio, and/or - (iv) Qt Design Studio, and/or - (v) Qt for MCUs, and/or - (vi) selected Add-on Products, if any, - -depending on which product(s) the Licensee has purchased under this Agreement, -as well as corresponding online or electronic documentation, associated media -and printed materials, including the source code (where applicable), example -programs and the documentation, licensed to the Licensee under this Agreement. -Licensed Software does not include Third Party Software (as defined in -Section 4) or Open Source Qt. The Qt Company may, in the course of its -development activities, at its free and absolute discretion and without any -obligation to send or publish any notifications to the Licensee or in general, -make changes, additions or deletions in the components and functionalities of -the Licensed Software, provided that no such changes, additions or deletions -will affect the already released version of the Licensed Software, but only -upcoming version(s). - -"Licensee" shall mean the individual or legal entity that is party to this -Agreement, as identified on the signature page hereof. - -"Licensee's Records" shall mean books and records that are likely to contain -information bearing on Licensee's compliance with this Agreement, Licensee's use -of Open Source Qt and/or the payments due to The Qt Company under this -Agreement, including, but not limited to user information, assembly logs, sales -records and distribution records. - -"Modified Software" shall have the meaning as set forth in Section 2.3. - -"Online Services" shall mean any services or access to systems made available by -The Qt Company to the Licensee over the Internet relating to the Licensed -Software or for the purpose of use by the Licensee of the Licensed Software or -Support. Use of any such Online Services is discretionary for the Licensee and -some of them may be subject to additional fees. - -"Open Source Qt" shall mean the non-commercial Qt computer software products, -licensed under the terms of the GNU Lesser General Public License, version 2.1 -or later ("LGPL") or the GNU General Public License, version 2.0 or later -("GPL"). For clarity, Open Source Qt shall not be provided nor governed under -this Agreement. - -"Party" or "Parties" shall mean Licensee and/or The Qt Company. - -"Permitted Combination" shall have the meaning as set forth in Section -3.4(viii). - -"Pre-Release Code" shall have the meaning as set forth in Section 4. - -"Prohibited Combination" shall mean any means to (i) use, combine, incorporate, -link or integrate Licensed Software with any software created with or -incorporating Open Source Qt, (ii) use Licensed Software for creation of any -software created with or incorporating Open Source Qt, or (iii) incorporate or -integrate Applications into a hardware device or product other than a Device. - -"Qt 3D Studio" shall mean The Qt Company's productized offering, which consist -of all versions of modules and tools as set forth in Appendix 1. - -"Qt Design Studio" shall mean The Qt Company's productized offering, which -consist of all versions of modules and tools as set forth in Appendix 1. - -"Qt for Application Development" shall mean The Qt Company's productized -offering, which consist of all versions of modules and tools as set forth in -Appendix 1. - -"Qt for Device Creation" shall mean The Qt Company's productized offering, -which consist of all versions of modules and tools as set forth in Appendix 1. - -"Qt for MCUs" shall mean The Qt Company's productized offering, which consist -of all versions of modules and tools as set forth in Appendix 1. - -"Redistributables" shall mean the portions of the Licensed Software set forth -in Appendix 1 that may be distributed pursuant to the terms of this Agreement -in object code form only, including any relevant documentation. Where -relevant, any reference to Licensed Software in this Agreement shall include -and refer also to Redistributables. - -"Renewal Term" shall mean an extension of previous License Term as agreed -between the Parties. - -"Submitted Modified Software" shall have the meaning as set forth in Section -2.3. - -"Support" shall mean standard developer support that is provided by The Qt -Company to assist Designated Users in using the Licensed Software in accordance -with The Qt Company's standard support terms available at -https://www.qt.io/terms-conditions/ and as further defined in Section 8 -hereunder. - -"Taxes" shall have the meaning set forth in Section 10.5. - -"Term" shall have the meaning set forth in Section 12. - -"The Qt Company" shall mean: - (i) in the event Licensee is an individual residing in the United States - or a legal entity incorporated in the United States or having its - headquarters in the United States, The Qt Company Inc., a - Delaware corporation with its office at 2350 Mission College Blvd., - Suite 1020, Santa Clara, CA 95054, USA.; or - (ii) in the event the Licensee is an individual residing outside of the - United States or a legal entity incorporated outside of the United - States or having its registered office outside of the United States, - The Qt Company Ltd., a Finnish company with its registered office - at Bertel Jungin aukio D3A, 02600 Espoo, Finland. - -"Third-Party Software" shall have the meaning set forth in Section 4. - -"Updates" shall mean a release or version of the Licensed Software containing -bug fixes, error corrections and other changes that are generally made available -to users of the Licensed Software that have contracted for Support. Updates are -generally depicted as a change to the digits following the decimal in the -Licensed Software version number. The Qt Company shall make Updates available to -the Licensee under the Support. Updates shall be considered as part of the -Licensed Software hereunder. - -"Upgrades" shall mean a release or version of the Licensed Software containing -enhancements and new features and are generally depicted as a change to the -first digit of the Licensed Software version number. In the event Upgrades are -provided to the Licensee under this Agreement, they shall be considered as part -of the Licensed Software hereunder. - -2. OWNERSHIP - -2.1. Ownership of The Qt Company -The Licensed Software is protected by copyright laws and international copyright -treaties, as well as other intellectual property laws and treaties. The Licensed -Software is licensed, not sold. - -All of The Qt Company's Intellectual Property Rights are and shall remain the -exclusive property of The Qt Company or its licensors respectively. - -2.2. Ownership of Licensee -All the Licensee's Intellectual Property Rights are and shall remain the -exclusive property of the Licensee or its licensors respectively. - -All Intellectual Property Rights to the Modified Software, Applications and Devices -shall remain with the Licensee and no rights thereto shall be granted by the -Licensee to The Qt Company under this Agreement (except as set forth in Section -2.3 below). - -2.3. Modified Software -Licensee may create bug-fixes, error corrections, patches or modifications to -the Licensed Software ("Modified Software"). Such Modified Software may break -the source or binary compatibility with the Licensed Software (including without -limitation through changing the application programming interfaces ("API") or by -adding, changing or deleting any variable, method, or class signature in the -Licensed Software and/or any inter-process protocols, services or standards in -the Licensed Software libraries). To the extent that Licensee's Modified -Software so breaks source or binary compatibility with the Licensed Software, -Licensee acknowledges that The Qt Company's ability to provide Support may be -prevented or limited and Licensee's ability to make use of Updates may be restricted. - -Licensee may, at its sole and absolute discretion, choose to submit Modified -Software to The Qt Company ("Submitted Modified Software") in connection with -Licensee's Support request, service request or otherwise. In the event Licensee -does so, then, Licensee hereby grants The Qt Company a sublicensable, -assignable, irrevocable, perpetual, worldwide, non-exclusive, royalty-free and -fully paid-up license, under all of Licensee's Intellectual Property Rights, to -reproduce, adapt, translate, modify, and prepare derivative works of, publicly -display, publicly perform, sublicense, make available and distribute such -Submitted Modified Software as The Qt Company sees fit at its free and absolute -discretion. - -3. LICENSES GRANTED - -3.1. Development with Licensed Software -Subject to the terms of this Agreement, The Qt Company grants to Licensee a -worldwide, non-exclusive, non-transferable license, valid for the License Term, -to use, modify and copy the Licensed Software by Designated Users on the -Development Platforms for the sole purposes of designing, developing, -demonstrating and testing Application(s) and/or Devices, and to provide thereto -related support and other related services to end-user Customers. Each -Application and/or Device can only include, incorporate or integrate code -generated under this Agreement by such Designated Users who are duly licensed -for the applicable Development Platform(s) and Deployment Platform(s) (i.e have -a valid license for the appropriate Licensed Software product). - -Licensee may install copies of the Licensed Software on five (5) computers per -Designated User, provided that only the Designated Users who have a valid -Development License may use the Licensed Software. - -Licensee may at any time designate another Designated User to replace a -then-current Designated User by notifying The Qt Company in writing, provided -that any Designated User may be replaced only once during any six-month period. - -Upon expiry of the initially agreed License Term, the respective License Terms -shall be automatically extended to one or more Renewal Term(s), unless and -until either Party notifies the other Party in writing, or any other method -acceptable to The Qt Company, that it does not wish to continue the License -Term, such notification to be provided to the other Party no less than thirty -(30) days before expiry of the respective License Term. - -Unless otherwise agreed between the Parties, Renewal Term shall be of equal -length with the initial License Term. - -Any such Renewal Term shall be subject to License Fees agreed between the -Parties or, if no advance agreement exists, subject to The Qt Company's standard -pricing applicable at the commencement date of any such Renewal Term. - -Any price or other term specified for a Renewal Term shall be valid only for the -specified time. - -The Qt Company may either request the Licensee to place a purchase order -corresponding to a quote by The Qt Company, or uses Licensees stored Credit -Card information in the QtAccount to automatically charge the Licensee for the -relevant Renewal Term. - -In the event Licensee does not prevent auto-renewal pursuant the above, but a -Renewal Term is nevertheless not duly ordered within 30 days from the date of -the respective notification from The Qt Company and/or the respective License -Fee paid by due date specified in The Qt Company's respective invoice, The Qt -Company shall apply a reinstatement fee equal to ten percent (10 %) of the -total value of the License Fees of the Development Licenses for the expired -term to be added to the License Fee of the respective Renewal Term. - -In the event Licensee chooses not to renew a Development License for a Renewal -Term by notifying The Qt Company thereof no less than thirty (30) days before -expiry of the respective License Term, Licensee may still reinstate such -expired Development Licenses for a Renewal Term subject to applicable renewal -Term License Fees until thirty (30) days from the expiry of the initially -agreed License Term or preceding Renewal Term. After such thirty (30) day -period a Development License shall be subject to applicable License Fees for -a new Development License and not any Renewal Term License Fees. - -3.2. Distribution of Applications -Subject to the terms of this Agreement, The Qt Company grants to Licensee -a worldwide, non-exclusive, non-transferable, revocable (for cause pursuant to -this Agreement) right and license, valid for the Term, to - (i) distribute, by itself or through its Contractors, Redistributables as - installed, incorporated or integrated into Applications for execution - on the Deployment Platforms, and - (ii) grant sublicenses to Redistributables, as distributed hereunder, for - Customers solely for Customer's internal use and to the extent - necessary in order for the Customers to use the Applications for their - respective intended purposes. - -Right to distribute the Redistributables as part of an Application as provided -herein is not royalty-bearing but is conditional upon the Licensee not having -any unpaid License Fees for Development Licenses owed to The Qt Company at the -time of distribution of any Redistributables to Customers. - -3.3. Distribution of Devices -Subject to the terms of this Agreement, The Qt Company grants to Licensee a -worldwide, non-exclusive, non-transferable, revocable (for cause pursuant to -this Agreement) right and license, valid for the Term, to - (i) distribute, by itself or through one or more tiers of Contractors, - Redistributables as installed, incorporated or integrated, or intended - to be installed, incorporated or integrated into Devices for execution - on the Deployment Platforms, and - (ii) grant sublicenses to Redistributables, as distributed hereunder, for - Customers solely for Customer's internal use and to the extent - necessary in order for the Customers to use the Devices for their - respective intended purposes. - -Right to distribute the Redistributables with Devices as provided herein is -conditional upon the Licensee (i) not having any unpaid License Fees for -Development Licenses owed to The Qt Company, and (ii) having purchased and paid -corresponding Distribution Licenses at the time of distribution of any -Redistributables to Customers. - -3.4. Further Requirements -The licenses granted above in this Section 3 by The Qt Company to Licensee are -conditional and subject to Licensee's compliance with the following terms: - (i) Licensee shall not remove or alter any copyright, trademark or other - proprietary rights notice(s) contained in any portion of the Licensed - Software; - (ii) Applications must add primary and substantial functionality to the - Licensed Software so as not to compete with the Licensed Software; - (iii) Applications may not pass on functionality which in any way makes it - possible for others to create software with the Licensed Software; - provided however that Licensee may use the Licensed Software's - scripting and QML ("Qt Quick") functionality solely in order to - enable scripting, themes and styles that augment the functionality - and appearance of the Application(s) without adding primary and - substantial functionality to the Application(s); - (iv) Licensee shall not use Licensed Software in any manner or for any - purpose that infringes, misappropriates or otherwise violates any - Intellectual property or right of any third party, or that violates - any applicable law; - (v) Licensee shall not use The Qt Company's or any of its suppliers' - names, logos, or trademarks to market Applications, except that - Licensee may use "Built with Qt" logo to indicate that - Application(s) was developed using the Licensed Software; - (vi) Licensee shall not distribute, sublicense or disclose source code - of Licensed Software to any third party (provided however that - Licensee may appoint employee(s) of Contractors as Designated - Users to use Licensed Software pursuant to this Agreement). Such - right may be available for the Licensee subject to a separate - software development kit ("SDK") license agreement to be concluded - with The Qt Company; - (vii) Licensee shall not grant the Customers a right to (i) make copies of - the Redistributables except when and to the extent required to use the - Applications and/or Devices for their intended purpose, (ii) modify - the Redistributables or create derivative works thereof, (iii) - decompile, disassemble or otherwise reverse engineer Redistributables, - or (iv) redistribute any copy or portion of the Redistributables to - any third party, except as part of the onward sale of the Device on - which the Redistributables are installed; - (viii) Licensee shall not and shall cause that its Affiliates or - Contractors shall not use Licensed Software in any Prohibited - Combination, unless Licensee has received an advance written - permission from The Qt Company to do so. Absent such written - permission, any and all distribution by the Licensee during the Term - of a hardware device or product a) which incorporate or integrate any - part of Licensed Software or Open Source Qt; or b) where the main - user interface or substantial functionality is provided by software - built with Licensed Software or Open Source Qt or otherwise depends - on the Licensed Software or Open Source Qt, shall be considered to be - Device distribution under this Agreement and shall be dependent on - Licensee's compliance thereof (including but not limited to - obligation to pay applicable License Fees for such distribution). - Notwithstanding what is provided above in this sub-section (viii), - Licensee is entitled to use and combine Licensed Software with any - Permitted Software; - (ix) Licensee shall cause all of its Affiliates and Contractors entitled - to make use of the licenses granted under this Agreement, to be - contractually bound to comply with the relevant terms of this - Agreement and not to use the Licensed Software beyond the terms - hereof and for any purposes other than operating within the scope - of their services for Licensee. Licensee shall be responsible for - any and all actions and omissions of its Affiliates and Contractors - relating to the Licensed Software and use thereof (including but not - limited to payment of all applicable License Fees); - (x) Except when and to the extent explicitly provided in this Section 3, - Licensee shall not transfer, publish, disclose, display or otherwise - make available the Licensed Software; and - (xi) Licensee shall not attempt or enlist a third party to conduct or - attempt to conduct any of the above. - -Above terms shall not be applicable if and to the extent they conflict with any -mandatory provisions of any applicable laws. -Any use of Licensed Software beyond the provisions of this Agreement is -strictly prohibited and requires an additional license from The Qt Company. - -4. THIRD-PARTY SOFTWARE - -The Licensed Software may provide links to third party libraries or code -(collectively "Third-Party Software") to implement various functions. -Third-Party Software does not comprise part of the Licensed Software. In some -cases, access to Third-Party Software may be included with the Licensed -Software. Such Third-Party Software will be listed in the ".../src/3rdparty" -source tree delivered with the Licensed Software or documented in the Licensed -Software, as such may be amended from time to time. Licensee acknowledges that -use or distribution of Third-Party Software is in all respects subject to -applicable license terms of applicable third-party right holders. - -5. PRE-RELEASE CODE - -The Licensed Software may contain pre-release code and functionality, or sample -code marked or otherwise stated with appropriate designation such as "Technology -Preview", "Alpha", "Beta", "Sample" etc. ("Pre-Release Code"). - -Such Pre-Release Code may be present complimentary for the Licensee, in order to -provide experimental support or information for new platforms or preliminary -versions of one or more new functionalities or for other similar reasons. The -Pre-Release Code may not be at the level of performance and compatibility of a -final, generally available, product offering. The Pre-Release Code may not -operate correctly, may contain errors and may be substantially modified by The -Qt Company prior to the first commercial product release, if any. The Qt -Company is under no obligation to make Pre-Release Code commercially available, -or provide any Support or Updates relating thereto. The Qt Company assumes no -liability whatsoever regarding any Pre-Release Code, but any use thereof is -exclusively at Licensee's own risk and expense. - -For clarity, unless Licensed Software specifies different license terms for -the respective Pre-Release Code, the Licensee is entitled to use such -pre-release code pursuant to Section 3, just like other Licensed Software, -provided however that in the event Add-on Products are included and available -as such Pre-Release Code, Licensee's right to use such Add-on Products is -nevertheless subject to and conditional upon conclusion of separate agreement -with The Qt Company. - -6. LIMITED WARRANTY AND WARRANTY DISCLAIMER - -The Qt Company hereby represents and warrants that it has the power and -authority to grant the rights and licenses granted to Licensee under this -Agreement. - -Except as set forth above, the Licensed Software is licensed to Licensee -"as is" and Licensee's exclusive remedy and The Qt Company's entire liability -for errors in the Licensed Software shall be limited, at The Qt Company's -option, to correction of the error, replacement of the Licensed Software or -return of the applicable fees paid for the defective Licensed Software for -the time period during which the License is not able to utilize the Licensed -Software under the terms of this Agreement. - -TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, THE QT COMPANY ON BEHALF OF -ITSELF AND ITS LICENSORS, SUPPLIERS AND AFFILIATES, DISCLAIMS ALL OTHER -WARRANTIES, EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, ANY IMPLIED -WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND -NON-INFRINGEMENT WITH REGARD TO THE LICENSED SOFTWARE. THE QT COMPANY DOES -NOT WARRANT THAT THE LICENSED SOFTWARE WILL SATISFY LICENSEE'S REQUIREMENTS OR -THAT IT WILL OPERATE WITHOUT DEFECT OR ERROR OR THAT THE OPERATION THEREOF -WILL BE UNINTERRUPTED. - -7. INDEMNIFICATION AND LIMITATION OF LIABILITY - -7.1. Limitation of Liability -EXCEPT FOR (I) CASES OF GROSS NEGLIGENCE OR INTENTIONAL MISCONDUCT, AND (II) -BREACH OF CONFIDENTIALITY, AND TO THE EXTENT PERMITTED BY APPLICABLE LAW, IN NO -EVENT SHALL EITHER PARTY BE LIABLE TO THE OTHER PARTY FOR ANY LOSS OF PROFIT, -LOSS OF DATA, LOSS OF BUSINESS OR GOODWILL OR ANY OTHER INDIRECT, SPECIAL, -CONSEQUENTIAL, INCIDENTAL OR PUNITIVE COST, DAMAGES OR EXPENSE OF ANY KIND, -HOWSOEVER ARISING UNDER OR IN CONNECTION WITH THIS AGREEMENT. - -EXCEPT FOR (I) CASES OF GROSS NEGLIGENCE OR INTENTIONAL MISCONDUCT, AND (II) -BREACH OF CONFIDENTIALITY, AND TO THE EXTENT PERMITTED BY APPLICABLE LAW, IN NO -EVENT SHALL EITHER PARTY'S TOTAL AGGREGATE LIABILITY UNDER THIS AGREEMENT EXCEED -THE AGGREGATE LICENSE FEES PAID OR PAYABLE TO THE QT COMPANY FROM LICENSEE -DURING THE PERIOD OF TWELVE (12) MONTHS IMMEDIATELY PRECEDING THE EVENT -RESULTING IN SUCH LIABILITY. - -THE PROVISIONS OF THIS SECTION 7 ALLOCATE THE RISKS UNDER THIS AGREEMENT -BETWEEN THE QT COMPANY AND LICENSEE AND THE PARTIES HAVE RELIED UPON THE -LIMITATIONS SET FORTH HEREIN IN DETERMINING WHETHER TO ENTER INTO THIS -AGREEMENT. - -NOTWITHSTANDING ANYTHING TO THE CONTRARY IN THIS AGREEMENT, LICENSEE SHALL -ALWAYS BE LIABLE TO PAY THE APPLICABLE LICENSE FEES CORRESPONDING TO ITS ACTUAL -USE OF LICENSED SOFTWARE. - -8. SUPPORT, UPDATES AND ONLINE SERVICES - -Upon due payment of the agreed License Fees the Licensee will be eligible to -receive Support and Updates and to use the Online Services during the License -Term, provided, however, that in the event the License Term is longer than 36 -months, the initial payment includes Support for only the first 12 months, -unless the Parties specifically otherwise agree. - -Unless otherwise decided by The Company at its free and absolute discretion, -Upgrades will not be included in the Support but may be available subject to -additional fees. - -From time to time The Qt Company may change the Support terms, provided that -during the respective ongoing License Term the level of Support provided by The -Qt Company may not be reduced without the consent of the Licensee. - -Unless otherwise agreed, The Qt Company shall not be responsible for providing -any service or support to Customers. - -9. CONFIDENTIALITY - -Each Party acknowledges that during the Term of this Agreement each Party may -receive information about the other Party's business, business methods, -business plans, customers, business relations, technology, and other -information, including the terms of this Agreement, that is confidential and -of great value to the other Party, and the value of which would be -significantly reduced if disclosed to third parties ("Confidential -Information"). Accordingly, when a Party (the "Receiving Party") receives -Confidential Information from the other Party (the "Disclosing Party"), the -Receiving Party shall only disclose such information to employees and -Contractors on a need to know basis, and shall cause its employees and -employees of its Affiliates to: (i) maintain any and all Confidential -Information in confidence; (ii) not disclose the Confidential Information to -a third party without the Disclosing Party's prior written approval; and (iii) -not, directly or indirectly, use the Confidential Information for any purpose -other than for exercising its rights and fulfilling its responsibilities -pursuant to this Agreement. Each Party shall take reasonable measures to -protect the Confidential Information of the other Party, which measures shall -not be less than the measures taken by such Party to protect its own -confidential and proprietary information. - -Obligation of confidentiality shall not apply to information that (i) is or -becomes generally known to the public through no act or omission of the -Receiving Party; (ii) was in the Receiving Party's lawful possession prior -to the disclosure hereunder and was not subject to limitations on disclosure -or use; (iii) is developed independently by employees or Contractors of the -Receiving Party or other persons working for the Receiving Party who have not -had access to the Confidential Information of the Disclosing Party, as proven -by the written records of the Receiving Party; (iv) is lawfully disclosed to -the Receiving Party without restrictions, by a third party not under an -obligation of confidentiality; or (v) the Receiving Party is legally compelled -to disclose, in which case the Receiving Party shall notify the Disclosing -Party of such compelled disclosure and assert the privileged and confidential -nature of the information and cooperate fully with the Disclosing Party to -limit the scope of disclosure and the dissemination of disclosed Confidential -Information to the minimum extent necessary. - -The obligations under this Section 9 shall continue to remain in force for a -period of five (5) years after the last disclosure, and, with respect to trade -secrets, for so long as such trade secrets are protected under applicable -trade secret laws. - -10. FEES, DELIVERY AND PAYMENT - -10.1. License Fees -License Fees are described in The Qt Company's standard price list, quote or -Purchase Order confirmation or in an appendix hereto, as the case may be. - -The License Fees shall not be refunded or claimed as a credit in any event or -for any reason whatsoever. - -10.2. Ordering Licenses -Licensee may purchase Development Licenses and Distribution Licenses pursuant -to agreed pricing terms or, if no specific pricing terms have been agreed -upon, at The Qt Company's standard pricing terms applicable at the time of -purchase. Unless specifically otherwise provided, any pricing terms -referenced in this Agreement shall be valid for twelve (12) months from the -date of this Agreement. - -Licensee shall submit all purchase orders for Development Licenses and -Distribution Licenses to The Qt Company by email or any other method -acceptable to The Qt Company (each such order is referred to herein as a -"Purchase Order") for confirmation, whereupon the Purchase Order shall -become binding between the Parties. - -10.3. Distribution License Packs -Unless otherwise agreed, Distribution Licenses shall be purchased by way of -Distribution License Packs. - -Upon due payment of the ordered Distribution License Pack(s), the Licensee -will have an account of Distribution Licenses available for distributing -the Redistributables in accordance with this Agreement. - -Each time Licensee distributes a copy of Redistributables, then one -Distribution License is used, and Licensee's account of available -Distribution Licenses is decreased accordingly. - -Licensee may distribute copies of the Redistributables so long as Licensee -has Distribution Licenses remaining on its account. - -10.4. Payment Terms -License Fees and any other charges under this Agreement shall be paid by -Licensee no later than thirty (30) days from the date of the applicable -invoice from The Qt Company. - -The Qt Company will submit an invoice to Licensee after the date of this -Agreement and/or after The Qt Company receives a Purchase Order from Licensee. - -A late payment charge of the lower of (a) one percent per month; or (b) the -interest rate stipulated by applicable law, shall be charged on any unpaid -balances that remain past due. - -10.5. Taxes -All License Fees and other charges payable hereunder are gross amounts but -exclusive of any value added tax, use tax, sales tax, withholding tax and -other taxes, duties or tariffs ("Taxes") levied directly for the sale, -delivery or use of Licensed Software hereunder pursuant to any applicable -law. Such applicable Taxes shall be paid by Licensee to The Qt Company, or, -where applicable, in lieu of payment of such Taxes to The Qt Company, -Licensee shall provide an exemption certificate to The Qt Company and any -applicable authority. - -11. RECORD-KEEPING AND REPORTING OBLIGATIONS; AUDIT RIGHTS - -11.1. Licensee's Record-keeping -Licensee shall at all times during the Term of this Agreement and for a -period of seven (7) years thereafter maintain Licensee's Records in an -accurate and up-to-date form. Licensee's Records shall be adequate to -reasonably enable The Qt Company to determine Licensee's compliance with -the provisions of this Agreement. The records shall conform to general -good accounting practices. - -Licensee shall, within thirty (30) days from receiving The Qt Company's -request to that effect, deliver to The Qt Company a report based on -Licensee's Records, such report to contain information, in sufficient -detail, on (i) number and identity of users working with Licensed Software -or Open Source Qt, (ii) copies of Redistributables distributed by Licensee -during the most recent calendar quarter and/or any other term specified by -The Qt Company, (iii) number of undistributed copies of Redistributables -and corresponding number of unused Distribution Licenses remaining on -Licensee's account, and (iv) any other information as The Qt Company may -reasonably require from time to time. - -11.2. The Qt Company's Audit Rights -The Qt Company or an independent auditor acting on behalf of The Qt -Company's, may, upon at least five (5) business days' prior written -notice and at its expense, audit Licensee with respect to the Licensee's -use of the Licensed Software, but not more frequently than once during -each 6-month period. Such audit may be conducted by mail, electronic means -or through an in-person visit to Licensee's place of business. Any such -in-person audit shall be conducted during regular business hours at -Licensee's facilities and shall not unreasonably interfere with Licensee's -usiness activities. The Qt Company or the independent auditor acting on -behalf of The Qt Company shall be entitled to inspect Licensee's Records -and conduct necessary interviews of Licensee's relevant employees and -Contractors. All such Licensee's Records and use thereof shall be subject -to an obligation of confidentiality under this Agreement. - -If an audit reveals that Licensee is using the Licensed Software beyond -scope of the licenses Licensee has paid for, Licensee agrees to pay The Qt -Company any amounts owed for such unauthorized use within 30 days from -receipt of the corresponding invoice from The Qt Company. - -In addition, in the event the audit reveals a material violation of the -terms of this Agreement (without limitation, either (i) underpayment of -more than 10 % of License Fees or 10,000 euros (whichever is more) or -(ii) distribution of products, which include or result from Prohibited -Combination, shall be deemed a material violation for purposes of this -section), then the Licensee shall pay The Qt Company's reasonable cost of -conducting such audit. - -12. TERM AND TERMINATION -12.1. Agreement Term -This Agreement shall enter into force upon due acceptance by both -Parties and remain in force for as long as there is any Development -License(s) purchased under this Agreement in force ("Term"), unless and -until terminated pursuant to the terms of this Section 12. - -12.2. Termination and suspension of rights -Either Party shall have the right to terminate this Agreement upon thirty -(30) days prior written notice if the other Party commits a material -breach of any obligation of this Agreement and fails to remedy such breach -within such notice period. - -Instead of termination, The Qt Company shall have the right to suspend or -withhold grants of all rights to the Licensed Software hereunder, -including but not limited to the Development Licenses, Distribution -License, and Support, should Licensee fail to make payment in timely -fashion or otherwise violates or is reasonably suspected to violate its -obligations or terms of this Agreement, and where such violation or breach -is not cured within five (5) business days following The Qt Company's -written notice thereof. - -12.3. Mutual Right to Terminate -Either Party shall have the right to terminate this Agreement immediately -upon written notice in the event that the other Party becomes insolvent, -files for any form of bankruptcy, makes any assignment for the benefit of -creditors, has a receiver, administrative receiver or officer appointed -over the whole or a substantial part of its assets, ceases to conduct -business, or an act equivalent to any of the above occurs under the laws -of the jurisdiction of the other Party. - -12.4. Parties' Rights and Duties upon Termination -Upon expiry or termination of the Agreement, Licensee shall cease and -shall cause all Designated Users (including those of its Affiliates' and -Contractors') to cease using the Licensed Software and distribution of the -Redistributables under this Agreement. - -Notwithstanding the above, in the event the Agreement expires or is terminated: - (i) as a result of The Qt Company choosing not to renew the Development - License(s) as set forth in Section 3.1, and where such decision of - non-renewal is not due to any ongoing breach or alleged breach (as - reasonably determined by The Qt Company) by Licensee of the terms of this - Agreement or any applicable license terms of Open Source Qt, then all valid - licenses possessed by the Licensee at such date shall be extended to be - valid in perpetuity under the terms of this Agreement and Licensee is - entitled to purchase additional licenses as set forth in Section 10.2; or - (ii) for reason other than by The Qt Company pursuant to item (i) above - or pursuant to Section 12.2, then the Licensee is entitled, for a - period of six (6) months after the effective date of termination, - to continue distribution of Devices under the Distribution Licenses - paid but unused at such effective date of termination. - -Upon any such termination the Licensee shall destroy or return to The Qt -Company all copies of the Licensed Software and all related materials and will -certify the same to The Qt Company upon its request, provided however that -Licensee may retain and exploit such copies of the Licensed Software as it may -reasonably require in providing continued support to Customers. - -Expiry or termination of this Agreement for any reason whatsoever shall not -relieve Licensee of its obligation to pay any License Fees accrued or payable -to The Qt Company prior to the effective date of termination, and Licensee -shall immediately pay to The Qt Company all such fees upon the effective date -of termination. Termination of this Agreement shall not affect any rights of -Customers to continue use of Applications and Devices (and therein -incorporated Redistributables). - -12.5. Extension in case of bankruptcy -In the event The Qt Company is declared bankrupt under a final, -non-cancellable decision by relevant court of law, and this Agreement is not, -at the date of expiry of the Development License(s) pursuant to Section 3.1, -assigned to party, who has assumed The Qt Company's position as a legitimate -licensor of Licensed Software under this Agreement, then all valid licenses -possessed by the Licensee at such date of expiry, and which the Licensee has -not notified for expiry, shall be extended to be valid in perpetuity under the -terms of this Agreement. - -13. GOVERNING LAW AND LEGAL VENUE - -In the event this Agreement is in the name of The Qt Company Inc., a Delaware -Corporation, then: - (i) this Agreement shall be construed and interpreted in accordance with - the laws of the State of California, USA, excluding its choice of - law provisions; - (ii) the United Nations Convention on Contracts for the International - Sale of Goods will not apply to this Agreement; and - (iii) any dispute, claim or controversy arising out of or relating to this - Agreement or the breach, termination, enforcement, interpretation or - validity thereof, including the determination of the scope or - applicability of this Agreement to arbitrate, shall be determined by - arbitration in San Francisco, USA, before one arbitrator. The - arbitration shall be administered by JAMS pursuant to JAMS' - Streamlined Arbitration Rules and Procedures. Judgment on the Award - may be entered in any court having jurisdiction. This Section shall - not preclude parties from seeking provisional remedies in aid of - arbitration from a court of appropriate jurisdiction. - -In the event this Agreement is in the name of The Qt Company Ltd., a Finnish -Company, then: - (i) this Agreement shall be construed and interpreted in accordance with - the laws of Finland, excluding its choice of law provisions; - (ii) the United Nations Convention on Contracts for the International - Sale of Goods will not apply to this Agreement; and - (iii) any disputes, controversy or claim arising out of or relating to - this Agreement, or the breach, termination or validity thereof shall - be finally settled by arbitration in accordance with the Arbitration - Rules of Finland Chamber of Commerce. The arbitration tribunal shall - consist of one (1), or if either Party so requires, of three (3), - arbitrators. The award shall be final and binding and enforceable in - any court of competent jurisdiction. The arbitration shall be held - in Helsinki, Finland and the process shall be conducted in the - English language. This Section shall not preclude parties from - seeking provisional remedies in aid of arbitration from a court of - appropriate jurisdiction. - -14. GENERAL PROVISIONS - -14.1. No Assignment -Except in the case of a merger or sale of substantially all of its corporate -assets, Licensee shall not be entitled to assign or transfer all or any of -its rights, benefits and obligations under this Agreement without the prior -written consent of The Qt Company, which shall not be unreasonably withheld -or delayed. The Qt Company shall be entitled to freely assign or transfer any -of its rights, benefits or obligations under this Agreement. - -14.2. No Third-Party Representations -Licensee shall make no representations or warranties concerning the Licensed -Software on behalf of The Qt Company. Any representation or warranty Licensee -makes or purports to make on The Qt Company's behalf shall be void as to The -Qt Company. - -14.3. Surviving Sections -Any terms and conditions that by their nature or otherwise reasonably should -survive termination of this Agreement shall so be deemed to survive. Such -sections include especially the following: 1, 2, 6, 7, 9, 11, 12.4, 13 and 14. - -14.4. Entire Agreement -This Agreement, the exhibits hereto, the License Certificate and any -applicable Purchase Order accepted by The Qt Company constitute the complete -agreement between the Parties and supersedes all prior or contemporaneous -discussions, representations, and proposals, written or oral, with respect -to the subject matters discussed herein. - -In the event of any conflict or inconsistency between this Agreement and any -Purchase Order, the terms of this Agreement will prevail over the terms of -the Purchase Order with respect to such conflict or inconsistency. - -Parties specifically acknowledge and agree that this Agreement prevails -over any click-to-accept or similar agreements the Designated Users may -need to accept online upon download of the Licensed Software, as may be -required by The Qt Company's applicable processes relating to Licensed -Software. - -14.5. Modifications -No modification of this Agreement shall be effective unless contained in a -writing executed by an authorized representative of each Party. No term or -condition contained in Licensee's Purchase Order ("Deviating Terms") shall -apply unless The Qt Company has expressly agreed such Deviating Terms in -writing. Unless and to the extent expressly agreed by The Qt Company, any -such Deviating Terms shall be deemed void and with no legal effect. For -clarity, delivery of the Licensed Software following the receipt of the -Purchase Order including Deviating Terms shall not constitute acceptance of -such Deviating Terms." - -14.6. Force Majeure -Except for the payment obligations hereunder, neither Party shall be liable -to the other for any delay or non-performance of its obligations hereunder -in the event and to the extent that such delay or non-performance is due to -an event of act of God, terrorist attack or other similar unforeseeable -catastrophic event that prevents either Party for fulfilling its -obligations under this Agreement and which such Party cannot avoid or -circumvent ("Force Majeure Event"). If the Force Majeure Event results in -a delay or non-performance of a Party for a period of three (3) months or -longer, then either Party shall have the right to terminate this Agreement -with immediate effect without any liability (except for the obligations of -payment arising prior to the event of Force Majeure) towards the other -Party. - -14.7. Notices -Any notice given by one Party to the other shall be deemed properly given -and deemed received if specifically acknowledged by the receiving Party in -writing or when successfully delivered to the recipient by hand, fax, or -special courier during normal business hours on a business day to the -addresses specified for each Party on the signature page. Each -communication and document made or delivered by one Party to the other -Party pursuant to this Agreement shall be in the English language. - -14.8. Export Control -Licensee acknowledges that the Redistributables, as incorporated in -Applications or Devices, may be subject to export control restrictions -under the applicable laws of respective countries. Licensee shall fully -comply with all applicable export license restrictions and requirements -as well as with all laws and regulations relating to the Redistributables -and exercise of licenses hereunder and shall procure all necessary -governmental authorizations, including without limitation, all necessary -licenses, approvals, permissions or consents, where necessary for the -re-exportation of the Redistributables, Applications and/or Devices. - -14.9. No Implied License -There are no implied licenses or other implied rights granted under -this Agreement, and all rights, save for those expressly granted hereunder, -shall remain with The Qt Company and its licensors. In addition, no licenses -or immunities are granted to the combination of the Licensed Software with -any other software or hardware not delivered by The Qt Company under this -Agreement. - -14.10. Attorney Fees -The prevailing Party in any action to enforce this Agreement shall be -entitled to recover its attorney's fees and costs in connection with such -action. - -14.11. Privacy -Licensee acknowledges and agrees that for the purpose of this Agreement, -The Qt Company may collect, use, transfer and disclose personal data -pertaining to Designated Users as well as any other employees and directors -of the Licensee and its Contractors relevant for carrying out the intent of -this Agreement. Such personal data may be collected from the Licensee or -directly from the relevant individuals. The Parties acknowledge that with -regard to such personal data processed hereunder, The Qt Company shall be -regarded as the Data Controller under the applicable Data Protection -Legislation. The Qt Company shall process any such personal data in -accordance with its privacy policies and practices, which will comply with -all applicable requirements of the Data Protection Legislation. - -14.12. Severability -If any provision of this Agreement shall be adjudged by any court of -competent jurisdiction to be unenforceable or invalid, that provision shall -be limited or eliminated to the minimum extent necessary so that this -Agreement shall otherwise remain in full force and effect and enforceable. - -APPENDICES - -The Agreement includes Appendix 1, and possibly one or more of the -appendices 3-5, depending on the product(s) purchased by the Licensee, -what is stated in the quote or invoice, and/or what is stated in the -Licensee's License Certificate. - -APPENDIX 1 - -The modules and/or tools that are included in the respective product - Qt -for Application Development (QtAD), Qt for Device Creation (QtDC), Qt for -MCUs (QtMCU), Qt 3D Studio (Qt3DS) and Qt Design Studio (QtDS) - are -marked with 'X' in the below table. The modules and tools are ported to Qt 6 -in stages and are subject to availability. - -Parts of the product that are permitted for distribution in object-code -form only ("Redistributables") are marked with 'R' in the below table. - -+-----------------------------------------------------------------------+ -| Modules / Tools | QtAD | QtDC | QtMCU | Qt3DS | QtDS | -+-----------------------------------------------------------------------+ -| Qt Core | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt GUI | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Multimedia | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Multimedia Widgets | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Network | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt PDF | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt QML | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Quick | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Quick Controls 2 | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Quick Dialogs | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Quick Layouts | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Quick Test | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt SQL | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Test | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Widgets | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Active Qt | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt 3D | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Android Extras | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Bluetooth | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Canvas 3D | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Concurrent | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt D-Bus | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Gamepad | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Graphical Effects | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Help | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Image Formats | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Location | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Mac Extras | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Network Authorization | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt NFC | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Platform Headers | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Positioning | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Print Support | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Purchasing | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt for Python | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Quick Controls | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Quick Extras | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Quick Widgets | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt SCXML | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Sensors | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Serial Bus | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Serial Port | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Speech | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt SVG | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt UI Tools | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt WebChannel | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt WebEngine | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt WebSockets | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt WebView | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Windows Extras | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt X11 Extras | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt XML | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt XML Patterns | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Wayland Compositor | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Charts | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Data Visualization | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Virtual Keyboard | X, R | X, R | | | | -+-----------------------------------------------------------------------+ -| Boot 2 Qt stack | | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt OTA | | X, R | | | | -+-----------------------------------------------------------------------+ -| Device Utilities | | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Debugging Bridge (QDB) Daemon | | X, R | | | | -+-----------------------------------------------------------------------+ -| Qt Quick Ultralite Controls | | | X, R | | | -+-----------------------------------------------------------------------+ -| Qt Quick Ultralite | | | X, R | | | -+-----------------------------------------------------------------------+ -| Qt Creator | X | X | X | | | -+-----------------------------------------------------------------------+ -| Qt Designer (Qt Widget Designer) | X | X | | | | -+-----------------------------------------------------------------------+ -| Qt Quick Designer (Qt Creator | X, R | X, R | X, R | | | -| plugin) | | | | | | -+-----------------------------------------------------------------------+ -| Qt Linguist | X, R | X, R | X, R | | | -+-----------------------------------------------------------------------+ -| Qt Assistant | X, R | X, R | X, R | | | -+-----------------------------------------------------------------------+ -| Lupdate | X, R | X, R | X, R | | | -+-----------------------------------------------------------------------+ -| Lrelease | X, R | X, R | X, R | | | -+-----------------------------------------------------------------------+ -| Qmake | X | X | | | | -+-----------------------------------------------------------------------+ -| Uic | X | X | | | | -+-----------------------------------------------------------------------+ -| Rcc | X | X | | | | -+-----------------------------------------------------------------------+ -| Qlalr | X | X | | | | -+-----------------------------------------------------------------------+ -| Qdoc | X | X | | | | -+-----------------------------------------------------------------------+ -| Qmlscene | X | X | | | | -+-----------------------------------------------------------------------+ -| Qmlviewer | X | X | | | | -+-----------------------------------------------------------------------+ -| Target toolchains | | X | X | | | -+-----------------------------------------------------------------------+ -| Qt Debugging Bridge (QDB) Host | | X | | | | -| Tools | | | | | | -+-----------------------------------------------------------------------+ -| qtconfig-gui | | X | | | | -+-----------------------------------------------------------------------+ -| Qt Emulator | | X | | | | -+-----------------------------------------------------------------------+ -| Qmlinterfacegenerator | | | X | | | -+-----------------------------------------------------------------------+ -| Qmltocpp | | | X | | | -+-----------------------------------------------------------------------+ -| qulfontcompiler | | | X | | | -+-----------------------------------------------------------------------+ -| Qt53DStudioRuntime2 | | | | X, R | | -+-----------------------------------------------------------------------+ -| Qt 3D Studio | | | | X | | -+-----------------------------------------------------------------------+ -| Qt Design Studio | | | | | X | -+-----------------------------------------------------------------------+ - - -APPENDIX 3: ADDITIONS TO LICENSED SOFTWARE - -In addition to what is provided under the definition of the Licensed Software, -Parties agree that Licensed Software shall also include the Add-On Products of -The Qt Company, as mentioned in this Appendix, if included in the quote / -invoice. - -The Modules and/or Tools of the Licensed Software that are included with each -Add-On Product respectively are marked with 'X' in the below table. The modules -are ported to Qt 6 in stages and are subject to availability. - -Parts of the respective Add-On Product that are permitted for distribution in -object-code form only ("Redistributables") are marked with 'R' in the below -table. - -+------------------------------------------------------------------------------------------------+ -| | Add-On Product(s) | -| +--------------------------------------------------------------------------+ -| Modules / Tools of | Qt for | Qt | Qt | Qt | Qt | Qt | -| Licensed Software | Automation | Automotive | Safe | Application | GammaRay | Deployment | -| | / Qt M2M | Suite | Renderer | Manager | | Platform | -| | Protocols | | | | | Package | -+------------------------------------------------------------------------------------------------+ -| Qt MQTT | X, R | | | | | | -+------------------------------------------------------------------------------------------------+ -| Qt KNX | X, R | | | | | | -+------------------------------------------------------------------------------------------------+ -| Qt OPC UA | X, R | | | | | | -+------------------------------------------------------------------------------------------------+ -| Qt CoAP | X, R | | | | | | -+------------------------------------------------------------------------------------------------+ -| Qt Safe Renderer | | X, R | X, R | | | | -+------------------------------------------------------------------------------------------------+ -| Qt Application | | X, R | | X, R | | | -| Manager | | | | | | | -+------------------------------------------------------------------------------------------------+ -| Qt IVI | | X, R | | | | | -+------------------------------------------------------------------------------------------------+ -| Reference UI | | X, R | | | | | -+------------------------------------------------------------------------------------------------+ -| Qt GENIVI Extras | | X, R | | | | | -+------------------------------------------------------------------------------------------------+ -| QML Live | | X | | | | | -+------------------------------------------------------------------------------------------------+ -| Qt Creator | | X | | | | | -| Deployment | | | | | | | -+------------------------------------------------------------------------------------------------+ -| Qt Creator Plugin | | X | | X | | | -| for Qt Application Manager | | | | | | -+------------------------------------------------------------------------------------------------+ -| Qt Automotive Suite | | X | | | | | -| Deployment Server | | | | | | | -+------------------------------------------------------------------------------------------------+ -| Qt Design Studio | | X | | | | | -+------------------------------------------------------------------------------------------------+ -| Qt 3D Studio | | X | | | | | -+------------------------------------------------------------------------------------------------+ -| GammaRay | | X | | | X | | -+------------------------------------------------------------------------------------------------+ -| Platform adaptations| | | | | | X | -| for specified | | | | | | -| Deployment Platforms | | | | | | -+------------------------------------------------------------------------------------------------+ -| Qt for Device | | X | | | | | -| Creation | | | | | | | -+------------------------------------------------------------------------------------------------+ - - -All the above Redistributables are subject to applicable provisions and -limitations including but not limited to what is defined in section 3 of the -Agreement. - -APPENDIX 4: SMALL BUSINESS AND STARTUP - -The provisions of this Appendix 4 are applicable for companies with an annual -revenue, including funding, equivalent to maximum of 250,000 USD (in -applicable currency) during the latest full calendar year, as evidenced by -duly audited records of the Licensee and approved by The Qt Company -("Start-up Company"). - -Start-up Companies are qualified for a discounted License Fee for maximum of -four (4) Development Licenses ("Start-up Development License") unless -otherwise agreed between the parties. - -Start-up Development License entitles the respective Designated User for -Support only for installation related issues. - -Upon expiry of the respective License Term, the Start-up Development -Licenses shall be automatically extended, pursuant to Section 3.1 of the -Agreement, for a Renewal Term either as new Start-up Development Licenses -(if the Licensee still qualifies as a Start-up Company), or as normal -Development Licenses (if the Licensee no longer qualifies as a Start-up -ompany). - -APPENDIX 5: NON-COMMERCIAL USE -The provisions of this Appendix 5 are applicable for non-commercial use of -the Licensed Software by the Licensee. - -For the purpose of this Appendix 5, the following additional definitions -(replacing the relevant definition of the Agreement, where applicable) -shall be applicable: - -"Demo Units" shall mean (i) hardware development platform, which incorporates -the Licensed Software along with Licensee's software and/or hardware, and -(ii) prototype versions of Applications or Devices. - -"Designated User(s)" shall mean the employees and students of the Licensee. - -"Licensee Products" shall mean Applications and/or Devices. - -"Permitted Purpose" shall mean (i) Licensee's internal evaluation and -testing of Licensed Software, (ii) building Demo Units as well as (iii) -educational use. - -"Term" shall mean a period of twelve (12) months or any such other period -as may be agreed between the Parties. - -For the purpose of this Appendix 5, the following changes shall be agreed -with respect to relevant Sections of the Agreement: - - I. Recital (A) shall be replaced in its entirety to read as follows: - "(A) Licensee wishes to use the Licensed Software for the Permitted - Purpose." - II. Section 3.1 shall be replaced in its entirety to read as follows: - "The Qt Company grants to Licensee a personal, non-exclusive, - non-transferable, revocable, royalty-free license, valid for the - Term, to use, modify and copy the Licensed Software solely for the - Permitted Purpose. - Licensee may install copies of the Licensed Software on five (5) - computers per Designated User, provided that only the Designated - Users who have a valid Development License may use the Licensed - Software. - Licensee may demonstrate the Demo Units, provided that such - demonstrations must be conducted by Licensee, and the Demo Units - must remain in Licensee's possession and under Licensee's control - at all times. - For clarity, this Agreement does not (i) entitle Licensee to use - Licensed Software to create Applications or Devices (other than - prototypes thereof) or (ii) carry any distribution rights to - Licensee, but such rights are subject to and conditional upon - conclusion of a separate license agreement with The Qt Company." - III. Sections 3.2, 3.3, 8 and 10 shall be deleted. - IV. Section 3.4 shall be replaced in its entirety to read as follows: - "Licensee shall not: - - remove or alter any copyright, trademark or other proprietary - rights notice contained in any portion of the Licensed Software; - - transfer, publish, sublicense, disclose, display or otherwise - make the Licensed Software available to any third party (except - that Licensee may demonstrate the Demo Units pursuant to Section - 3.1); - - in any way combine, incorporate or integrate Licensed Software - with, or use Licensed Software for creation of, any software - created with or incorporating Open Source Qt; - - Licensee shall cause all Designated Users who make use of the - licenses granted under this Agreement, to be contractually bound - to comply with the relevant terms of this Agreement and not to use - the Licensed Software beyond the terms hereof. Licensee shall be - responsible for any and all actions and omissions of its - Designated Users relating to the Licensed Software and use - thereof. - - Any use of Licensed Software beyond the provisions of this - Agreement is strictly prohibited and requires an additional license - from The Qt Company." - V. Section 12 shall be replaced in its entirety to read as follows: - "This Agreement shall enter into force upon due acceptance by both - Parties and remain in force for the Term, unless and until - terminated pursuant to the terms of Section 12. - - Upon termination of the Agreement, Licensee shall cease using the - Licensed Software. All other copies of Licensed Software in the - possession or control of Licensee must be erased or destroyed. - An officer of Licensee must, upon request, promptly deliver to - The Qt Company a written confirmation that this has occurred." - -Except for the modifications specified above, this Appendix carries no -change to the terms of the Agreement which shall remain in full force. diff --git a/.qmake.conf b/.qmake.conf index 1bf1a804..4048b20d 100644 --- a/.qmake.conf +++ b/.qmake.conf @@ -6,4 +6,4 @@ DEFINES += QT_NO_JAVA_STYLE_ITERATORS QT_SOURCE_TREE = $$PWD QT_BUILD_TREE = $$shadowed($$PWD) -MODULE_VERSION = 5.15.3 +MODULE_VERSION = 5.15.8 diff --git a/.release-timestamp b/.release-timestamp index ab5bf0d1..9fb3e690 100644 --- a/.release-timestamp +++ b/.release-timestamp @@ -1 +1 @@ -QT_PACKAGEDATE_STR=2021-03-29 \ No newline at end of file +QT_PACKAGEDATE_STR=2022-11-12 \ No newline at end of file diff --git a/.tag b/.tag index 900c16fb..58d98946 100644 --- a/.tag +++ b/.tag @@ -1 +1 @@ -c8989ca20fa5798f7853f07df6e150cc407c64a4 +4ee4fc18b4067b90efa46ca9baba74f53b54d9ec diff --git a/LICENSE.QT-LICENSE-AGREEMENT b/LICENSE.QT-LICENSE-AGREEMENT index 19a20ea4..8b80e563 100644 --- a/LICENSE.QT-LICENSE-AGREEMENT +++ b/LICENSE.QT-LICENSE-AGREEMENT @@ -1,5 +1,5 @@ QT LICENSE AGREEMENT -Agreement version 4.2.1 +Agreement version 4.3 This Qt License Agreement ("Agreement") is a legal agreement for the licensing of Licensed Software (as defined below) between The Qt Company (as defined @@ -19,26 +19,27 @@ WHEREAS: NOW, THEREFORE, THE PARTIES HEREBY AGREE AS FOLLOWS: 1. DEFINITIONS -"Affiliate" of a Party shall mean an entity (i) which is directly or indirectly -controlling such Party; (ii) which is under the same direct or indirect -ownership or control as such Party; or (iii) which is directly or indirectly -owned or controlled by such Party. For these purposes, an entity shall be -treated as being controlled by another if that other entity has fifty percent -(50 %) or more of the votes in such entity, is able to direct its affairs -and/or to control the composition of its board of directors or equivalent body. + +"Affiliate" of a Party shall mean an entity (i) which is directly +or indirectly controlling such Party; (ii) which is under the same direct or +indirect ownership or control as such Party; or (iii) which is directly or +indirectly owned or controlled by such Party. For these purposes, an entity +shall be treated as being controlled by another if that other entity has fifty +percent (50 %) or more of the votes in such entity, is able to direct its +affairs and/or to control the composition of its board of directors or +equivalent body. "Add-on Products" shall mean The Qt Company's specific add-on software products -(for example Qt Safe Renderer, Qt for Automation, Qt Application Manager), -which are not licensed as part of The Qt Company's standard offering, but shall -be included into the scope of Licensed Software only if so specifically agreed +(for example Qt Safe Renderer, Qt for Automation, Qt Application Manager), which +are not licensed as part of The Qt Company's standard offering, but shall be +included into the scope of Licensed Software only if so specifically agreed between the Parties. "Applications" shall mean Licensee's software products created using the Licensed Software, which may include the Redistributables, or part thereof. -"Contractor(s)" shall mean third party consultants, distributors and -contractors performing services to the Licensee under applicable contractual -arrangement. +"Contractor(s)" shall mean third party consultants, distributors and contractors +performing services to the Licensee under applicable contractual arrangement. "Customer(s)" shall mean Licensee's end users to whom Licensee, directly or indirectly, distributes copies of the Redistributables. @@ -54,41 +55,39 @@ in the License Certificate, on which the Redistributables can be distributed pursuant to the terms and conditions of this Agreement. "Designated User(s)" shall mean the employee(s) of Licensee or Licensee's -Affiliates acting within the scope of their employment or Licensee's -Contractors acting within the scope of their services for Licensee and on -behalf of Licensee. Designated Users shall be named in the License Certificate. +Affiliates acting within the scope of their employment or Licensee's Contractors +acting within the scope of their services for Licensee and on behalf of +Licensee. Designated Users shall be named in the License Certificate. "Development License" shall mean the license needed by the Licensee for each Designated User to use the Licensed Software under the license grant described -in Section 3.1 of this Agreement. Development Licenses are available -separately for Qt for Application Development and Qt for Device Creation -products, each product having its designated scope and purpose of use. -Distribution Licenses are always connected to Qt for Device Creation -product only. +in Section 3.1 of this Agreement. Development Licenses are available per +respective Licensed Software products, each product having its designated scope +and purpose of use. Distribution Licenses are always connected to Qt for Device +Creation product and Qt for MCUs product only. "Development Platforms" shall mean those operating systems specified in the License Certificate, in which the Licensed Software can be used under the -Development License, but not distributed in any form or used for any other -purpose. +Development License, but not distributed in any form or used for any other purpose. "Devices" shall mean hardware devices or products that 1) are manufactured -and/or distributed by the Licensee or its Affiliates or Contractors, and -(2)(i) incorporate or integrate the Redistributables or parts thereof; or (ii) -where the main user interface or substantial functionality of such unit , when -used by a Customer, is provided by Application(s) or otherwise depends on the -Licensed Software, regardless of whether the Redistributables are distributed -together with the hardware or not. Devices covered with this Agreement shall -be specified in Appendix 2 or in a quote. +and/or distributed by the Licensee or its Affiliates or Contractors, and (2)(i) +incorporate or integrate the Redistributables or parts thereof; or (ii) where +the main user interface or substantial functionality of such unit , when used by +a Customer, is provided by Application(s) or otherwise depends on the Licensed +Software, regardless of whether the Redistributables are distributed together +with the hardware or not. Devices covered with this Agreement shall be specified +in Appendix 2 or in a quote. "Distribution License(s)" shall mean the license required for any kind of sale, trade, exchange, loan, lease, rental or other distribution by or on behalf of Licensee to a third party of Redistributables in connection with Devices pursuant to license grant described in Section 3.3 of this Agreement. -"Distribution License Packs" shall mean set of prepaid Distribution Licenses -for distribution of Redistributables, as defined in The Qt Company's standard -price list, quote, Purchase Order confirmation or in an appendix hereto, as -the case may be. +"Distribution License Packs" shall mean set of prepaid Distribution Licenses for +distribution of Redistributables, as defined in The Qt Company's standard price +list, quote, Purchase Order confirmation or in an appendix hereto, as the case +may be. "Intellectual Property Rights" shall mean patents (including utility models), design patents, and designs (whether or not capable of registration), chip @@ -101,10 +100,10 @@ well as any trade secrets. each Designated User respectively upon them downloading the Licensed Software, which will be available under respective Designated User's Qt Account at account.qt.io. License Certificates will specify the Designated User, the -Development Platforms, Deployment Platforms and the License Term. Such terms -are considered part of the licenses granted hereunder and shall be updated -from time to time to reflect any agreed changes to the foregoing terms -relating to Designated User's rights to the Licensed Software. +Development Platforms, Deployment Platforms and the License Term. Such terms are +considered part of the licenses granted hereunder and shall be updated from time +to time to reflect any agreed changes to the foregoing terms relating to +Designated User's rights to the Licensed Software. "License Fee" shall mean the fee charged to the Licensee for rights granted under the terms of this Agreement. @@ -115,39 +114,39 @@ entitled to use the Licensed Software, as set forth in the respective License Certificate. "Licensed Software" shall mean either - (i) Qt for Application Development or - (ii) Qt for Device Creation, and/or - (iii) Qt 3D Studio, and/or - (iv) Qt Design Studio, and/or - (v) Qt for MCUs, and/or - (vi) selected Add-on Products, if any, + (i) Qt for Application Development or + (ii) Qt for Device Creation, and/or + (iii) Qt 3D Studio, and/or + (iv) Qt Design Studio, and/or + (v) Qt for MCUs, and/or + (vi) selected Add-on Products, if any, depending on which product(s) the Licensee has purchased under this Agreement, as well as corresponding online or electronic documentation, associated media and printed materials, including the source code (where applicable), example programs and the documentation, licensed to the Licensee under this Agreement. -Licensed Software does not include Third Party Software (as defined in Section -4) or Open Source Qt. The Qt Company may, in the course of its development -activities, at its free and absolute discretion and without any obligation to -send or publish any notifications to the Licensee or in general, make changes, -additions or deletions in the components and functionalities of the Licensed -Software, provided that no such changes, additions or deletions will affect -the already released version of the Licensed Software, but only upcoming -version(s). +Licensed Software does not include Third Party Software (as defined in +Section 4) or Open Source Qt. The Qt Company may, in the course of its +development activities, at its free and absolute discretion and without any +obligation to send or publish any notifications to the Licensee or in general, +make changes, additions or deletions in the components and functionalities of +the Licensed Software, provided that no such changes, additions or deletions +will affect the already released version of the Licensed Software, but only +upcoming version(s). "Licensee" shall mean the individual or legal entity that is party to this Agreement, as identified on the signature page hereof. "Licensee's Records" shall mean books and records that are likely to contain -information bearing on Licensee's compliance with this Agreement, Licensee's -use of Open Source Qt and/or the payments due to The Qt Company under this -Agreement, including, but not limited to user information, assembly logs, -sales records and distribution records. +information bearing on Licensee's compliance with this Agreement, Licensee's use +of Open Source Qt and/or the payments due to The Qt Company under this +Agreement, including, but not limited to user information, assembly logs, sales +records and distribution records. "Modified Software" shall have the meaning as set forth in Section 2.3. -"Online Services" shall mean any services or access to systems made available -by The Qt Company to the Licensee over the Internet relating to the Licensed +"Online Services" shall mean any services or access to systems made available by +The Qt Company to the Licensee over the Internet relating to the Licensed Software or for the purpose of use by the Licensee of the Licensed Software or Support. Use of any such Online Services is discretionary for the Licensee and some of them may be subject to additional fees. @@ -196,12 +195,12 @@ and refer also to Redistributables. "Renewal Term" shall mean an extension of previous License Term as agreed between the Parties. -"Submitted Modified Software" shall have the meaning as set forth in -Section 2.3. +"Submitted Modified Software" shall have the meaning as set forth in Section +2.3. "Support" shall mean standard developer support that is provided by The Qt -Company to assist Designated Users in using the Licensed Software in -accordance with The Qt Company's standard support terms available at +Company to assist Designated Users in using the Licensed Software in accordance +with The Qt Company's standard support terms available at https://www.qt.io/terms-conditions/ and as further defined in Section 8 hereunder. @@ -210,39 +209,39 @@ hereunder. "Term" shall have the meaning set forth in Section 12. "The Qt Company" shall mean: - (i) in the event Licensee is an individual residing in the United - States or a legal entity incorporated in the United States or - having its headquarters in the United States, The Qt Company Inc., - a Delaware corporation with its office at 2350 Mission College - Blvd., Suite 1020, Santa Clara, CA 95054, USA.; or - (ii) in the event the Licensee is an individual residing outside of the - United States or a legal entity incorporated outside of the United - States or having its registered office outside of the United - States, The Qt Company Ltd., a Finnish company with its registered - office at Bertel Jungin aukio D3A, 02600 Espoo, Finland. + (i) in the event Licensee is an individual residing in the United States + or a legal entity incorporated in the United States or having its + headquarters in the United States, The Qt Company Inc., a + Delaware corporation with its office at 2350 Mission College Blvd., + Suite 1020, Santa Clara, CA 95054, USA.; or + (ii) in the event the Licensee is an individual residing outside of the + United States or a legal entity incorporated outside of the United + States or having its registered office outside of the United States, + The Qt Company Ltd., a Finnish company with its registered office + at Bertel Jungin aukio D3A, 02600 Espoo, Finland. "Third-Party Software" shall have the meaning set forth in Section 4. "Updates" shall mean a release or version of the Licensed Software containing -bug fixes, error corrections and other changes that are generally made -available to users of the Licensed Software that have contracted for Support. -Updates are generally depicted as a change to the digits following the decimal -in the Licensed Software version number. The Qt Company shall make Updates -available to the Licensee under the Support. Updates shall be considered as -part of the Licensed Software hereunder. +bug fixes, error corrections and other changes that are generally made available +to users of the Licensed Software that have contracted for Support. Updates are +generally depicted as a change to the digits following the decimal in the +Licensed Software version number. The Qt Company shall make Updates available to +the Licensee under the Support. Updates shall be considered as part of the +Licensed Software hereunder. "Upgrades" shall mean a release or version of the Licensed Software containing enhancements and new features and are generally depicted as a change to the first digit of the Licensed Software version number. In the event Upgrades are -provided to the Licensee under this Agreement, they shall be considered as -part of the Licensed Software hereunder. - +provided to the Licensee under this Agreement, they shall be considered as part +of the Licensed Software hereunder. 2. OWNERSHIP + 2.1. Ownership of The Qt Company -The Licensed Software is protected by copyright laws and international -copyright treaties, as well as other intellectual property laws and -treaties. The Licensed Software is licensed, not sold. +The Licensed Software is protected by copyright laws and international copyright +treaties, as well as other intellectual property laws and treaties. The Licensed +Software is licensed, not sold. All of The Qt Company's Intellectual Property Rights are and shall remain the exclusive property of The Qt Company or its licensors respectively. @@ -251,43 +250,47 @@ exclusive property of The Qt Company or its licensors respectively. All the Licensee's Intellectual Property Rights are and shall remain the exclusive property of the Licensee or its licensors respectively. -All Intellectual Property Rights to the Modified Software, Applications and -Devices shall remain with the Licensee and no rights thereto shall be granted -by the Licensee to The Qt Company under this Agreement (except as set forth in -Section 2.3 below). +All Intellectual Property Rights to the Modified Software, Applications and Devices +shall remain with the Licensee and no rights thereto shall be granted by the +Licensee to The Qt Company under this Agreement (except as set forth in Section +2.3 below). 2.3. Modified Software Licensee may create bug-fixes, error corrections, patches or modifications to the Licensed Software ("Modified Software"). Such Modified Software may break -the source or binary compatibility with the Licensed Software (including -without limitation through changing the application programming interfaces -("API") or by adding, changing or deleting any variable, method, or class -signature in the Licensed Software and/or any inter-process protocols, -services or standards in the Licensed Software libraries). To the extent that -Licensee's Modified Software so breaks source or binary compatibility with the -Licensed Software, Licensee acknowledges that The Qt Company's ability to -provide Support may be prevented or limited and Licensee's ability to make use -of Updates may be restricted. +the source or binary compatibility with the Licensed Software (including without +limitation through changing the application programming interfaces ("API") or by +adding, changing or deleting any variable, method, or class signature in the +Licensed Software and/or any inter-process protocols, services or standards in +the Licensed Software libraries). To the extent that Licensee's Modified +Software so breaks source or binary compatibility with the Licensed Software, +Licensee acknowledges that The Qt Company's ability to provide Support may be +prevented or limited and Licensee's ability to make use of Updates may be restricted. Licensee may, at its sole and absolute discretion, choose to submit Modified Software to The Qt Company ("Submitted Modified Software") in connection with -Licensee's Support request, service request or otherwise. In the event -Licensee does so, then, Licensee hereby grants The Qt Company a sublicensable, +Licensee's Support request, service request or otherwise. In the event Licensee +does so, then, Licensee hereby grants The Qt Company a sublicensable, assignable, irrevocable, perpetual, worldwide, non-exclusive, royalty-free and -fully paid-up license, under all of Licensee's Intellectual Property Rights, -to reproduce, adapt, translate, modify, and prepare derivative works of, -publicly display, publicly perform, sublicense, make available and distribute -such Submitted Modified Software as The Qt Company sees fit at its free and -absolute discretion. +fully paid-up license, under all of Licensee's Intellectual Property Rights, to +reproduce, adapt, translate, modify, and prepare derivative works of, publicly +display, publicly perform, sublicense, make available and distribute such +Submitted Modified Software as The Qt Company sees fit at its free and absolute +discretion. 3. LICENSES GRANTED + 3.1. Development with Licensed Software Subject to the terms of this Agreement, The Qt Company grants to Licensee a -worldwide, non-exclusive, non-transferable license, valid for the License -Term, to use, modify and copy the Licensed Software by Designated Users on the +worldwide, non-exclusive, non-transferable license, valid for the License Term, +to use, modify and copy the Licensed Software by Designated Users on the Development Platforms for the sole purposes of designing, developing, -demonstrating and testing Application(s) and/or Devices, and to provide -thereto related support and other related services to end-user Customers. +demonstrating and testing Application(s) and/or Devices, and to provide thereto +related support and other related services to end-user Customers. Each +Application and/or Device can only include, incorporate or integrate code +generated under this Agreement by such Designated Users who are duly licensed +for the applicable Development Platform(s) and Deployment Platform(s) (i.e have +a valid license for the appropriate Licensed Software product). Licensee may install copies of the Licensed Software on five (5) computers per Designated User, provided that only the Designated Users who have a valid @@ -299,50 +302,54 @@ that any Designated User may be replaced only once during any six-month period. Upon expiry of the initially agreed License Term, the respective License Terms shall be automatically extended to one or more Renewal Term(s), unless and -until either Party notifies the other Party in writing that it does not wish -to continue the License Term, such notification to be provided to the other -Party no less than ninety (90) days before expiry of the respective License -Term. Unless otherwise agreed between the Parties, Renewal Term shall be of -equal length with the initial License Term. +until either Party notifies the other Party in writing, or any other method +acceptable to The Qt Company, that it does not wish to continue the License +Term, such notification to be provided to the other Party no less than thirty +(30) days before expiry of the respective License Term. + +Unless otherwise agreed between the Parties, Renewal Term shall be of equal +length with the initial License Term. Any such Renewal Term shall be subject to License Fees agreed between the -Parties or, if no advance agreement exists, subject to The Qt Company's -standard pricing applicable at the commencement date of any such Renewal Term. +Parties or, if no advance agreement exists, subject to The Qt Company's standard +pricing applicable at the commencement date of any such Renewal Term. -Any price or other term specified for a Renewal Term shall be valid only for -the specified time. +Any price or other term specified for a Renewal Term shall be valid only for the +specified time. -The Qt Company may request the Licensee to place a purchase order corresponding -to a quote by The Qt Company for the relevant Renewal Term. +The Qt Company may either request the Licensee to place a purchase order +corresponding to a quote by The Qt Company, or uses Licensees stored Credit +Card information in the QtAccount to automatically charge the Licensee for the +relevant Renewal Term. In the event Licensee does not prevent auto-renewal pursuant the above, but a Renewal Term is nevertheless not duly ordered within 30 days from the date of -the respective quote from The Qt Company and/or the respective License Fee -paid by due date specified in The Qt Company's respective invoice, The Qt +the respective notification from The Qt Company and/or the respective License +Fee paid by due date specified in The Qt Company's respective invoice, The Qt Company shall apply a reinstatement fee equal to ten percent (10 %) of the total value of the License Fees of the Development Licenses for the expired term to be added to the License Fee of the respective Renewal Term. In the event Licensee chooses not to renew a Development License for a Renewal -Term by notifying The Qt Company thereof no less than ninety (90) days before +Term by notifying The Qt Company thereof no less than thirty (30) days before expiry of the respective License Term, Licensee may still reinstate such expired Development Licenses for a Renewal Term subject to applicable renewal Term License Fees until thirty (30) days from the expiry of the initially agreed License Term or preceding Renewal Term. After such thirty (30) day -period a Development License shall be subject to applicable License Fees for a -new Development License and not any Renewal Term License Fees. +period a Development License shall be subject to applicable License Fees for +a new Development License and not any Renewal Term License Fees. 3.2. Distribution of Applications -Subject to the terms of this Agreement, The Qt Company grants to Licensee a -worldwide, non-exclusive, non-transferable, revocable (for cause pursuant to +Subject to the terms of this Agreement, The Qt Company grants to Licensee +a worldwide, non-exclusive, non-transferable, revocable (for cause pursuant to this Agreement) right and license, valid for the Term, to - (i) distribute, by itself or through its Contractors, Redistributables - as installed, incorporated or integrated into Applications for - execution on the Deployment Platforms, and - (ii) grant sublicenses to Redistributables, as distributed hereunder, - for Customers solely for Customer's internal use and to the extent - necessary in order for the Customers to use the Applications for - their respective intended purposes. + (i) distribute, by itself or through its Contractors, Redistributables as + installed, incorporated or integrated into Applications for execution + on the Deployment Platforms, and + (ii) grant sublicenses to Redistributables, as distributed hereunder, for + Customers solely for Customer's internal use and to the extent + necessary in order for the Customers to use the Applications for their + respective intended purposes. Right to distribute the Redistributables as part of an Application as provided herein is not royalty-bearing but is conditional upon the Licensee not having @@ -353,102 +360,97 @@ time of distribution of any Redistributables to Customers. Subject to the terms of this Agreement, The Qt Company grants to Licensee a worldwide, non-exclusive, non-transferable, revocable (for cause pursuant to this Agreement) right and license, valid for the Term, to - (i) distribute, by itself or through one or more tiers of Contractors, - Redistributables as installed, incorporated or integrated, or - intended to be installed, incorporated or integrated into Devices - for execution on the Deployment Platforms, and - (ii) grant sublicenses to Redistributables, as distributed hereunder, - for Customers solely for Customer's internal use and to the extent - necessary in order for the Customers to use the Devices for their - respective intended purposes. + (i) distribute, by itself or through one or more tiers of Contractors, + Redistributables as installed, incorporated or integrated, or intended + to be installed, incorporated or integrated into Devices for execution + on the Deployment Platforms, and + (ii) grant sublicenses to Redistributables, as distributed hereunder, for + Customers solely for Customer's internal use and to the extent + necessary in order for the Customers to use the Devices for their + respective intended purposes. Right to distribute the Redistributables with Devices as provided herein is conditional upon the Licensee (i) not having any unpaid License Fees for -Development Licenses owed to The Qt Company, and (ii) having purchased and -paid corresponding Distribution Licenses at the time of distribution of any +Development Licenses owed to The Qt Company, and (ii) having purchased and paid +corresponding Distribution Licenses at the time of distribution of any Redistributables to Customers. 3.4. Further Requirements The licenses granted above in this Section 3 by The Qt Company to Licensee are conditional and subject to Licensee's compliance with the following terms: - (i) Licensee shall not remove or alter any copyright, trademark or - other proprietary rights notice(s) contained in any portion of the - Licensed Software; - (ii) Applications must add primary and substantial functionality to the - Licensed Software so as not to compete with the Licensed Software; - (iii) Applications may not pass on functionality which in any way makes - it possible for others to create software with the Licensed - Software; provided however that Licensee may use the Licensed - Software's scripting and QML ("Qt Quick") functionality solely in - order to enable scripting, themes and styles that augment the - functionality and appearance of the Application(s) without adding - primary and substantial functionality to the Application(s); - (iv) Licensee shall not use Licensed Software in any manner or for any - purpose that infringes, misappropriates or otherwise violates any - Intellectual property or right of any third party, or that - violates any applicable law; - (v) Licensee shall not use The Qt Company's or any of its suppliers' - names, logos, or trademarks to market Applications, except that - Licensee may use "Built with Qt" logo to indicate that - Application(s) was developed using the Licensed Software; - (vi) Licensee shall not distribute, sublicense or disclose source code - of Licensed Software to any third party (provided however that - Licensee may appoint employee(s) of Contractors as Designated - Users to use Licensed Software pursuant to this Agreement). Such - right may be available for the Licensee subject to a separate - software development kit ("SDK") license agreement to be concluded - with The Qt Company; - (vii) Licensee shall not grant the Customers a right to (i) make copies - of the Redistributables except when and to the extent required to - use the Applications and/or Devices for their intended purpose, - (ii) modify the Redistributables or create derivative works - thereof, (iii) decompile, disassemble or otherwise reverse - engineer Redistributables, or (iv) redistribute any copy or - portion of the Redistributables to any third party, except as part - of the onward sale of the Device on which the Redistributables are - installed; - (viii) Licensee shall not and shall cause that its Affiliates or - Contractors shall not use Licensed Software in any Prohibited - Combination, unless Licensee has received an advance written - permission from The Qt Company to do so. Absent such written - permission, any and all distribution by the Licensee during the - Term of a hardware device or product a) which incorporate or - integrate any part of Licensed Software or Open Source Qt; or b) - where the main user interface or substantial functionality is - provided by software built with Licensed Software or Open Source - Qt or otherwise depends on the Licensed Software or Open Source - Qt, shall be considered to be Device distribution under this - Agreement and shall be dependent on Licensee's compliance thereof - (including but not limited to obligation to pay applicable License - Fees for such distribution). Notwithstanding what is provided - above in this sub-section (viii), Licensee is entitled to use and - combine Qt 3D Studio and/or Qt Design Studio with Open Source Qt - ("Permitted Combination") for its internal evaluation purposes, - provided that Licensee shall in no way transfer, publish, disclose, - display or otherwise make available any software or work resulting - from such Permitted Combination; - (ix) Licensee shall cause all of its Affiliates and Contractors - entitled to make use of the licenses granted under this Agreement, - to be contractually bound to comply with the relevant terms of - this Agreement and not to use the Licensed Software beyond the - terms hereof and for any purposes other than operating within the - scope of their services for Licensee. Licensee shall be responsible - for any and all actions and omissions of its Affiliates and - Contractors relating to the Licensed Software and use thereof - (including but not limited to payment of all applicable License - Fees); - (x) Except when and to the extent explicitly provided in this Section - 3, Licensee shall not transfer, publish, disclose, display or - otherwise make available the Licensed Software; and - (xi) Licensee shall not attempt or enlist a third party to conduct or - attempt to conduct any of the above. + (i) Licensee shall not remove or alter any copyright, trademark or other + proprietary rights notice(s) contained in any portion of the Licensed + Software; + (ii) Applications must add primary and substantial functionality to the + Licensed Software so as not to compete with the Licensed Software; + (iii) Applications may not pass on functionality which in any way makes it + possible for others to create software with the Licensed Software; + provided however that Licensee may use the Licensed Software's + scripting and QML ("Qt Quick") functionality solely in order to + enable scripting, themes and styles that augment the functionality + and appearance of the Application(s) without adding primary and + substantial functionality to the Application(s); + (iv) Licensee shall not use Licensed Software in any manner or for any + purpose that infringes, misappropriates or otherwise violates any + Intellectual property or right of any third party, or that violates + any applicable law; + (v) Licensee shall not use The Qt Company's or any of its suppliers' + names, logos, or trademarks to market Applications, except that + Licensee may use "Built with Qt" logo to indicate that + Application(s) was developed using the Licensed Software; + (vi) Licensee shall not distribute, sublicense or disclose source code + of Licensed Software to any third party (provided however that + Licensee may appoint employee(s) of Contractors as Designated + Users to use Licensed Software pursuant to this Agreement). Such + right may be available for the Licensee subject to a separate + software development kit ("SDK") license agreement to be concluded + with The Qt Company; + (vii) Licensee shall not grant the Customers a right to (i) make copies of + the Redistributables except when and to the extent required to use the + Applications and/or Devices for their intended purpose, (ii) modify + the Redistributables or create derivative works thereof, (iii) + decompile, disassemble or otherwise reverse engineer Redistributables, + or (iv) redistribute any copy or portion of the Redistributables to + any third party, except as part of the onward sale of the Device on + which the Redistributables are installed; + (viii) Licensee shall not and shall cause that its Affiliates or + Contractors shall not use Licensed Software in any Prohibited + Combination, unless Licensee has received an advance written + permission from The Qt Company to do so. Absent such written + permission, any and all distribution by the Licensee during the Term + of a hardware device or product a) which incorporate or integrate any + part of Licensed Software or Open Source Qt; or b) where the main + user interface or substantial functionality is provided by software + built with Licensed Software or Open Source Qt or otherwise depends + on the Licensed Software or Open Source Qt, shall be considered to be + Device distribution under this Agreement and shall be dependent on + Licensee's compliance thereof (including but not limited to + obligation to pay applicable License Fees for such distribution). + Notwithstanding what is provided above in this sub-section (viii), + Licensee is entitled to use and combine Licensed Software with any + Permitted Software; + (ix) Licensee shall cause all of its Affiliates and Contractors entitled + to make use of the licenses granted under this Agreement, to be + contractually bound to comply with the relevant terms of this + Agreement and not to use the Licensed Software beyond the terms + hereof and for any purposes other than operating within the scope + of their services for Licensee. Licensee shall be responsible for + any and all actions and omissions of its Affiliates and Contractors + relating to the Licensed Software and use thereof (including but not + limited to payment of all applicable License Fees); + (x) Except when and to the extent explicitly provided in this Section 3, + Licensee shall not transfer, publish, disclose, display or otherwise + make available the Licensed Software; and + (xi) Licensee shall not attempt or enlist a third party to conduct or + attempt to conduct any of the above. -Above terms shall not be applicable if and to the extent they conflict with -any mandatory provisions of any applicable laws. +Above terms shall not be applicable if and to the extent they conflict with any +mandatory provisions of any applicable laws. Any use of Licensed Software beyond the provisions of this Agreement is strictly prohibited and requires an additional license from The Qt Company. 4. THIRD-PARTY SOFTWARE + The Licensed Software may provide links to third party libraries or code (collectively "Third-Party Software") to implement various functions. Third-Party Software does not comprise part of the Licensed Software. In some @@ -460,15 +462,16 @@ use or distribution of Third-Party Software is in all respects subject to applicable license terms of applicable third-party right holders. 5. PRE-RELEASE CODE -The Licensed Software may contain pre-release code and functionality, or sample -code marked or otherwise stated with appropriate designation such as -"Technology Preview", "Alpha", "Beta", "Sample" etc. ("Pre-Release Code"). -Such Pre-Release Code may be present complimentary for the Licensee, in order -to provide experimental support or information for new platforms or preliminary +The Licensed Software may contain pre-release code and functionality, or sample +code marked or otherwise stated with appropriate designation such as "Technology +Preview", "Alpha", "Beta", "Sample" etc. ("Pre-Release Code"). + +Such Pre-Release Code may be present complimentary for the Licensee, in order to +provide experimental support or information for new platforms or preliminary versions of one or more new functionalities or for other similar reasons. The Pre-Release Code may not be at the level of performance and compatibility of a -final, generally available, product offering. The Pre-Release Code may not +final, generally available, product offering. The Pre-Release Code may not operate correctly, may contain errors and may be substantially modified by The Qt Company prior to the first commercial product release, if any. The Qt Company is under no obligation to make Pre-Release Code commercially available, @@ -476,15 +479,16 @@ or provide any Support or Updates relating thereto. The Qt Company assumes no liability whatsoever regarding any Pre-Release Code, but any use thereof is exclusively at Licensee's own risk and expense. -For clarity, unless Licensed Software specifies different license terms for the -respective Pre-Release Code, the Licensee is entitled to use such pre-release -code pursuant to Section 3, just like other Licensed Software, provided however -that in the event Add-on Products are included and available as such -Pre-Release Code, Licensee's right to use such Add-on Products is nevertheless -subject to and conditional upon conclusion of separate agreement with The Qt -Company. +For clarity, unless Licensed Software specifies different license terms for +the respective Pre-Release Code, the Licensee is entitled to use such +pre-release code pursuant to Section 3, just like other Licensed Software, +provided however that in the event Add-on Products are included and available +as such Pre-Release Code, Licensee's right to use such Add-on Products is +nevertheless subject to and conditional upon conclusion of separate agreement +with The Qt Company. 6. LIMITED WARRANTY AND WARRANTY DISCLAIMER + The Qt Company hereby represents and warrants that it has the power and authority to grant the rights and licenses granted to Licensee under this Agreement. @@ -493,20 +497,21 @@ Except as set forth above, the Licensed Software is licensed to Licensee "as is" and Licensee's exclusive remedy and The Qt Company's entire liability for errors in the Licensed Software shall be limited, at The Qt Company's option, to correction of the error, replacement of the Licensed Software or -return of the applicable fees paid for the defective Licensed Software for the -time period during which the License is not able to utilize the Licensed +return of the applicable fees paid for the defective Licensed Software for +the time period during which the License is not able to utilize the Licensed Software under the terms of this Agreement. TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, THE QT COMPANY ON BEHALF OF ITSELF AND ITS LICENSORS, SUPPLIERS AND AFFILIATES, DISCLAIMS ALL OTHER WARRANTIES, EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND -NON-INFRINGEMENT WITH REGARD TO THE LICENSED SOFTWARE. THE QT COMPANY DOES NOT -WARRANT THAT THE LICENSED SOFTWARE WILL SATISFY LICENSEE'S REQUIREMENTS OR THAT -IT WILL OPERATE WITHOUT DEFECT OR ERROR OR THAT THE OPERATION THEREOF WILL BE -UNINTERRUPTED. +NON-INFRINGEMENT WITH REGARD TO THE LICENSED SOFTWARE. THE QT COMPANY DOES +NOT WARRANT THAT THE LICENSED SOFTWARE WILL SATISFY LICENSEE'S REQUIREMENTS OR +THAT IT WILL OPERATE WITHOUT DEFECT OR ERROR OR THAT THE OPERATION THEREOF +WILL BE UNINTERRUPTED. 7. INDEMNIFICATION AND LIMITATION OF LIABILITY + 7.1. Limitation of Liability EXCEPT FOR (I) CASES OF GROSS NEGLIGENCE OR INTENTIONAL MISCONDUCT, AND (II) BREACH OF CONFIDENTIALITY, AND TO THE EXTENT PERMITTED BY APPLICABLE LAW, IN NO @@ -517,10 +522,10 @@ HOWSOEVER ARISING UNDER OR IN CONNECTION WITH THIS AGREEMENT. EXCEPT FOR (I) CASES OF GROSS NEGLIGENCE OR INTENTIONAL MISCONDUCT, AND (II) BREACH OF CONFIDENTIALITY, AND TO THE EXTENT PERMITTED BY APPLICABLE LAW, IN NO -EVENT SHALL EITHER PARTY'S TOTAL AGGREGATE LIABILITY UNDER THIS AGREEMENT -EXCEED THE AGGREGATE LICENSE FEES PAID OR PAYABLE TO THE QT COMPANY FROM -LICENSEE DURING THE PERIOD OF TWELVE (12) MONTHS IMMEDIATELY PRECEDING THE -EVENT RESULTING IN SUCH LIABILITY. +EVENT SHALL EITHER PARTY'S TOTAL AGGREGATE LIABILITY UNDER THIS AGREEMENT EXCEED +THE AGGREGATE LICENSE FEES PAID OR PAYABLE TO THE QT COMPANY FROM LICENSEE +DURING THE PERIOD OF TWELVE (12) MONTHS IMMEDIATELY PRECEDING THE EVENT +RESULTING IN SUCH LIABILITY. THE PROVISIONS OF THIS SECTION 7 ALLOCATE THE RISKS UNDER THIS AGREEMENT BETWEEN THE QT COMPANY AND LICENSEE AND THE PARTIES HAVE RELIED UPON THE @@ -532,6 +537,7 @@ ALWAYS BE LIABLE TO PAY THE APPLICABLE LICENSE FEES CORRESPONDING TO ITS ACTUAL USE OF LICENSED SOFTWARE. 8. SUPPORT, UPDATES AND ONLINE SERVICES + Upon due payment of the agreed License Fees the Licensee will be eligible to receive Support and Updates and to use the Online Services during the License Term, provided, however, that in the event the License Term is longer than 36 @@ -550,30 +556,32 @@ Unless otherwise agreed, The Qt Company shall not be responsible for providing any service or support to Customers. 9. CONFIDENTIALITY + Each Party acknowledges that during the Term of this Agreement each Party may receive information about the other Party's business, business methods, business plans, customers, business relations, technology, and other -information, including the terms of this Agreement, that is confidential and of -great value to the other Party, and the value of which would be significantly -reduced if disclosed to third parties ("Confidential Information"). -Accordingly, when a Party (the "Receiving Party") receives Confidential -Information from the other Party (the "Disclosing Party"), the Receiving Party -shall only disclose such information to employees and Contractors on a need to -know basis, and shall cause its employees and employees of its Affiliates to: -(i) maintain any and all Confidential Information in confidence; (ii) not -disclose the Confidential Information to a third party without the Disclosing -Party's prior written approval; and (iii) not, directly or indirectly, use the -Confidential Information for any purpose other than for exercising its rights -and fulfilling its responsibilities pursuant to this Agreement. Each Party -shall take reasonable measures to protect the Confidential Information of the -other Party, which measures shall not be less than the measures taken by such -Party to protect its own confidential and proprietary information. +information, including the terms of this Agreement, that is confidential and +of great value to the other Party, and the value of which would be +significantly reduced if disclosed to third parties ("Confidential +Information"). Accordingly, when a Party (the "Receiving Party") receives +Confidential Information from the other Party (the "Disclosing Party"), the +Receiving Party shall only disclose such information to employees and +Contractors on a need to know basis, and shall cause its employees and +employees of its Affiliates to: (i) maintain any and all Confidential +Information in confidence; (ii) not disclose the Confidential Information to +a third party without the Disclosing Party's prior written approval; and (iii) +not, directly or indirectly, use the Confidential Information for any purpose +other than for exercising its rights and fulfilling its responsibilities +pursuant to this Agreement. Each Party shall take reasonable measures to +protect the Confidential Information of the other Party, which measures shall +not be less than the measures taken by such Party to protect its own +confidential and proprietary information. Obligation of confidentiality shall not apply to information that (i) is or becomes generally known to the public through no act or omission of the -Receiving Party; (ii) was in the Receiving Party's lawful possession prior to -the disclosure hereunder and was not subject to limitations on disclosure or -use; (iii) is developed independently by employees or Contractors of the +Receiving Party; (ii) was in the Receiving Party's lawful possession prior +to the disclosure hereunder and was not subject to limitations on disclosure +or use; (iii) is developed independently by employees or Contractors of the Receiving Party or other persons working for the Receiving Party who have not had access to the Confidential Information of the Disclosing Party, as proven by the written records of the Receiving Party; (iv) is lawfully disclosed to @@ -587,10 +595,11 @@ Information to the minimum extent necessary. The obligations under this Section 9 shall continue to remain in force for a period of five (5) years after the last disclosure, and, with respect to trade -secrets, for so long as such trade secrets are protected under applicable trade -secret laws. +secrets, for so long as such trade secrets are protected under applicable +trade secret laws. 10. FEES, DELIVERY AND PAYMENT + 10.1. License Fees License Fees are described in The Qt Company's standard price list, quote or Purchase Order confirmation or in an appendix hereto, as the case may be. @@ -600,30 +609,32 @@ for any reason whatsoever. 10.2. Ordering Licenses Licensee may purchase Development Licenses and Distribution Licenses pursuant -to agreed pricing terms or, if no specific pricing terms have been agreed upon, -at The Qt Company's standard pricing terms applicable at the time of purchase. -Unless specifically otherwise provided, any pricing terms referenced in this -Agreement shall be valid for twelve (12) months from the date of this Agreement. +to agreed pricing terms or, if no specific pricing terms have been agreed +upon, at The Qt Company's standard pricing terms applicable at the time of +purchase. Unless specifically otherwise provided, any pricing terms +referenced in this Agreement shall be valid for twelve (12) months from the +date of this Agreement. Licensee shall submit all purchase orders for Development Licenses and -Distribution Licenses to The Qt Company by email or any other method acceptable -to The Qt Company (each such order is referred to herein as a "Purchase Order") -for confirmation, whereupon the Purchase Order shall become binding between the -Parties. +Distribution Licenses to The Qt Company by email or any other method +acceptable to The Qt Company (each such order is referred to herein as a +"Purchase Order") for confirmation, whereupon the Purchase Order shall +become binding between the Parties. 10.3. Distribution License Packs Unless otherwise agreed, Distribution Licenses shall be purchased by way of Distribution License Packs. -Upon due payment of the ordered Distribution License Pack(s), the Licensee will -have an account of Distribution Licenses available for distributing the -Redistributables in accordance with this Agreement. +Upon due payment of the ordered Distribution License Pack(s), the Licensee +will have an account of Distribution Licenses available for distributing +the Redistributables in accordance with this Agreement. Each time Licensee distributes a copy of Redistributables, then one -Distribution License is used, and Licensee's account of available Distribution -Licenses is decreased accordingly.Licensee may distribute copies of the -Redistributables so long as Licensee has Distribution Licenses remaining on -its account. +Distribution License is used, and Licensee's account of available +Distribution Licenses is decreased accordingly. + +Licensee may distribute copies of the Redistributables so long as Licensee +has Distribution Licenses remaining on its account. 10.4. Payment Terms License Fees and any other charges under this Agreement shall be paid by @@ -639,104 +650,114 @@ balances that remain past due. 10.5. Taxes All License Fees and other charges payable hereunder are gross amounts but -exclusive of any value added tax, use tax, sales tax, withholding tax and other -taxes, duties or tariffs ("Taxes") levied directly for the sale, delivery or -use of Licensed Software hereunder pursuant to any applicable law. Such -applicable Taxes shall be paid by Licensee to The Qt Company, or, where -applicable, in lieu of payment of such Taxes to The Qt Company, Licensee shall -provide an exemption certificate to The Qt Company and any applicable authority. +exclusive of any value added tax, use tax, sales tax, withholding tax and +other taxes, duties or tariffs ("Taxes") levied directly for the sale, +delivery or use of Licensed Software hereunder pursuant to any applicable +law. Such applicable Taxes shall be paid by Licensee to The Qt Company, or, +where applicable, in lieu of payment of such Taxes to The Qt Company, +Licensee shall provide an exemption certificate to The Qt Company and any +applicable authority. 11. RECORD-KEEPING AND REPORTING OBLIGATIONS; AUDIT RIGHTS -11.1. Licensee's Record-keeping -Licensee shall at all times during the Term of this Agreement and for a period -of seven (7) years thereafter maintain Licensee's Records in an accurate and -up-to-date form. Licensee's Records shall be adequate to reasonably enable The -Qt Company to determine Licensee's compliance with the provisions of this -Agreement. The records shall conform to general good accounting practices. -Licensee shall, within thirty (30) days from receiving The Qt Company's request -to that effect, deliver to The Qt Company a report based on Licensee's Records, -such report to contain information, in sufficient detail, on (i) number and -identity of users working with Licensed Software or Open Source Qt, (ii) copies -of Redistributables distributed by Licensee during the most recent calendar -quarter and/or any other term specified by The Qt Company, (iii) number of -undistributed copies of Redistributables and corresponding number of unused -Distribution Licenses remaining on Licensee's account, and (iv) any other -information as The Qt Company may reasonably require from time to time. +11.1. Licensee's Record-keeping +Licensee shall at all times during the Term of this Agreement and for a +period of seven (7) years thereafter maintain Licensee's Records in an +accurate and up-to-date form. Licensee's Records shall be adequate to +reasonably enable The Qt Company to determine Licensee's compliance with +the provisions of this Agreement. The records shall conform to general +good accounting practices. + +Licensee shall, within thirty (30) days from receiving The Qt Company's +request to that effect, deliver to The Qt Company a report based on +Licensee's Records, such report to contain information, in sufficient +detail, on (i) number and identity of users working with Licensed Software +or Open Source Qt, (ii) copies of Redistributables distributed by Licensee +during the most recent calendar quarter and/or any other term specified by +The Qt Company, (iii) number of undistributed copies of Redistributables +and corresponding number of unused Distribution Licenses remaining on +Licensee's account, and (iv) any other information as The Qt Company may +reasonably require from time to time. 11.2. The Qt Company's Audit Rights -The Qt Company or an independent auditor acting on behalf of The Qt Company's, -may, upon at least five (5) business days' prior written notice and at its -expense, audit Licensee with respect to the Licensee's use of the Licensed -Software, but not more frequently than once during each 6-month period. Such -audit may be conducted by mail, electronic means or through an in-person visit -to Licensee's place of business. Any such in-person audit shall be conducted -during regular business hours at Licensee's facilities and shall not -unreasonably interfere with Licensee's business activities. The Qt Company or -the independent auditor acting on behalf of The Qt Company shall be entitled to -inspect Licensee's Records and conduct necessary interviews of Licensee's -relevant employees and Contractors. All such Licensee's Records and use thereof -shall be subject to an obligation of confidentiality under this Agreement. +The Qt Company or an independent auditor acting on behalf of The Qt +Company's, may, upon at least five (5) business days' prior written +notice and at its expense, audit Licensee with respect to the Licensee's +use of the Licensed Software, but not more frequently than once during +each 6-month period. Such audit may be conducted by mail, electronic means +or through an in-person visit to Licensee's place of business. Any such +in-person audit shall be conducted during regular business hours at +Licensee's facilities and shall not unreasonably interfere with Licensee's +business activities. The Qt Company or the independent auditor acting on +behalf of The Qt Company shall be entitled to inspect Licensee's Records +and conduct necessary interviews of Licensee's relevant employees and +Contractors. All such Licensee's Records and use thereof shall be subject +to an obligation of confidentiality under this Agreement. -If an audit reveals that Licensee is using the Licensed Software beyond scope -of the licenses Licensee has paid for, Licensee agrees to pay The Qt Company -any amounts owed for such unauthorized use within 30 days from receipt of the -corresponding invoice from The Qt Company. In addition, in the event the audit -reveals a material violation of the terms of this Agreement (without -limitation, either (i) underpayment of more than 10 % of License Fees or 10,000 -euros (whichever is more) or (ii) distribution of products, which include or -result from Prohibited Combination, shall be deemed a material violation for -purposes of this section), then the Licensee shall pay The Qt Company's -reasonable cost of conducting such audit. +If an audit reveals that Licensee is using the Licensed Software beyond +scope of the licenses Licensee has paid for, Licensee agrees to pay The Qt +Company any amounts owed for such unauthorized use within 30 days from +receipt of the corresponding invoice from The Qt Company. + +In addition, in the event the audit reveals a material violation of the +terms of this Agreement (without limitation, either (i) underpayment of +more than 10 % of License Fees or 10,000 euros (whichever is more) or +(ii) distribution of products, which include or result from Prohibited +Combination, shall be deemed a material violation for purposes of this +section), then the Licensee shall pay The Qt Company's reasonable cost of +conducting such audit. 12. TERM AND TERMINATION 12.1. Agreement Term -This Agreement shall enter into force upon due acceptance by both Parties and -remain in force for as long as there is any Development License(s) purchased -under this Agreement in force ("Term"), unless and until terminated pursuant to -the terms of this Section 12. +This Agreement shall enter into force upon due acceptance by both +Parties and remain in force for as long as there is any Development +License(s) purchased under this Agreement in force ("Term"), unless and +until terminated pursuant to the terms of this Section 12. 12.2. Termination and suspension of rights -Either Party shall have the right to terminate this Agreement upon thirty (30) -days prior written notice if the other Party commits a material breach of any -obligation of this Agreement and fails to remedy such breach within such notice -period. +Either Party shall have the right to terminate this Agreement upon thirty +(30) days prior written notice if the other Party commits a material +breach of any obligation of this Agreement and fails to remedy such breach +within such notice period. Instead of termination, The Qt Company shall have the right to suspend or -withhold grants of all rights to the Licensed Software hereunder, including but -not limited to the Development Licenses, Distribution License, and Support, -should Licensee fail to make payment in timely fashion or otherwise violates or -is reasonably suspected to violate its obligations or terms of this Agreement, -and where such violation or breach is not cured within five (5) business days -following The Qt Company's written notice thereof. +withhold grants of all rights to the Licensed Software hereunder, +including but not limited to the Development Licenses, Distribution +License, and Support, should Licensee fail to make payment in timely +fashion or otherwise violates or is reasonably suspected to violate its +obligations or terms of this Agreement, and where such violation or breach +is not cured within five (5) business days following The Qt Company's +written notice thereof. 12.3. Mutual Right to Terminate -Either Party shall have the right to terminate this Agreement immediately upon -written notice in the event that the other Party becomes insolvent, files for -any form of bankruptcy, makes any assignment for the benefit of creditors, has -a receiver, administrative receiver or officer appointed over the whole or a -substantial part of its assets, ceases to conduct business, or an act -equivalent to any of the above occurs under the laws of the jurisdiction of the -other Party. +Either Party shall have the right to terminate this Agreement immediately +upon written notice in the event that the other Party becomes insolvent, +files for any form of bankruptcy, makes any assignment for the benefit of +creditors, has a receiver, administrative receiver or officer appointed +over the whole or a substantial part of its assets, ceases to conduct +business, or an act equivalent to any of the above occurs under the laws +of the jurisdiction of the other Party. -12.4. Parties´ Rights and Duties upon Termination -Upon expiry or termination of the Agreement, Licensee shall cease and shall -cause all Designated Users (including those of its Affiliates' and +12.4. Parties' Rights and Duties upon Termination +Upon expiry or termination of the Agreement, Licensee shall cease and +shall cause all Designated Users (including those of its Affiliates' and Contractors') to cease using the Licensed Software and distribution of the Redistributables under this Agreement. Notwithstanding the above, in the event the Agreement expires or is terminated: - (i) as a result of The Qt Company choosing not to renew the Development - License(s) as set forth in Section 3.1, then all valid licenses - possessed by the Licensee at such date shall be extended to be - valid in perpetuity under the terms of this Agreement and Licensee - is entitled to purchase additional licenses as set forth in - Section 10.2; or - (ii) for reason other than by The Qt Company pursuant to item (i) above - or pursuant to Section 12.2, then the Licensee is entitled, for a - period of six (6) months after the effective date of termination, - to continue distribution of Devices under the Distribution Licenses - paid but unused at such effective date of termination. + (i) as a result of The Qt Company choosing not to renew the Development + License(s) as set forth in Section 3.1, and where such decision of + non-renewal is not due to any ongoing breach or alleged breach (as + reasonably determined by The Qt Company) by Licensee of the terms of this + Agreement or any applicable license terms of Open Source Qt, then all valid + licenses possessed by the Licensee at such date shall be extended to be + valid in perpetuity under the terms of this Agreement and Licensee is + entitled to purchase additional licenses as set forth in Section 10.2; or + (ii) for reason other than by The Qt Company pursuant to item (i) above + or pursuant to Section 12.2, then the Licensee is entitled, for a + period of six (6) months after the effective date of termination, + to continue distribution of Devices under the Distribution Licenses + paid but unused at such effective date of termination. Upon any such termination the Licensee shall destroy or return to The Qt Company all copies of the Licensed Software and all related materials and will @@ -749,65 +770,66 @@ relieve Licensee of its obligation to pay any License Fees accrued or payable to The Qt Company prior to the effective date of termination, and Licensee shall immediately pay to The Qt Company all such fees upon the effective date of termination. Termination of this Agreement shall not affect any rights of -Customers to continue use of Applications and Devices (and therein incorporated -Redistributables). +Customers to continue use of Applications and Devices (and therein +incorporated Redistributables). 12.5. Extension in case of bankruptcy -In the event The Qt Company is declared bankrupt under a final, non-cancellable -decision by relevant court of law, and this Agreement is not, at the date of -expiry of the Development License(s) pursuant to Section 3.1, assigned to -party, who has assumed The Qt Company's position as a legitimate licensor of -Licensed Software under this Agreement, then all valid licenses possessed by -the Licensee at such date of expiry, and which the Licensee has not notified -for expiry, shall be extended to be valid in perpetuity under the terms of this -Agreement. +In the event The Qt Company is declared bankrupt under a final, +non-cancellable decision by relevant court of law, and this Agreement is not, +at the date of expiry of the Development License(s) pursuant to Section 3.1, +assigned to party, who has assumed The Qt Company's position as a legitimate +licensor of Licensed Software under this Agreement, then all valid licenses +possessed by the Licensee at such date of expiry, and which the Licensee has +not notified for expiry, shall be extended to be valid in perpetuity under the +terms of this Agreement. 13. GOVERNING LAW AND LEGAL VENUE + In the event this Agreement is in the name of The Qt Company Inc., a Delaware Corporation, then: - (i) this Agreement shall be construed and interpreted in accordance - with the laws of the State of California, USA, excluding its choice - of law provisions; - (ii) the United Nations Convention on Contracts for the International - Sale of Goods will not apply to this Agreement; and - (iii) any dispute, claim or controversy arising out of or relating to - this Agreement or the breach, termination, enforcement, - interpretation or validity thereof, including the determination of - the scope or applicability of this Agreement to arbitrate, shall - be determined by arbitration in San Francisco, USA, before one - arbitrator. The arbitration shall be administered by JAMS pursuant - to JAMS' Streamlined Arbitration Rules and Procedures. Judgment on - the Award may be entered in any court having jurisdiction. This - Section shall not preclude parties from seeking provisional - remedies in aid of arbitration from a court of appropriate - jurisdiction. + (i) this Agreement shall be construed and interpreted in accordance with + the laws of the State of California, USA, excluding its choice of + law provisions; + (ii) the United Nations Convention on Contracts for the International + Sale of Goods will not apply to this Agreement; and + (iii) any dispute, claim or controversy arising out of or relating to this + Agreement or the breach, termination, enforcement, interpretation or + validity thereof, including the determination of the scope or + applicability of this Agreement to arbitrate, shall be determined by + arbitration in San Francisco, USA, before one arbitrator. The + arbitration shall be administered by JAMS pursuant to JAMS' + Streamlined Arbitration Rules and Procedures. Judgment on the Award + may be entered in any court having jurisdiction. This Section shall + not preclude parties from seeking provisional remedies in aid of + arbitration from a court of appropriate jurisdiction. In the event this Agreement is in the name of The Qt Company Ltd., a Finnish Company, then: - (i) this Agreement shall be construed and interpreted in accordance - with the laws of Finland, excluding its choice of law provisions; - (ii) the United Nations Convention on Contracts for the International - Sale of Goods will not apply to this Agreement; and - (iii) any disputes, controversy or claim arising out of or relating to - this Agreement, or the breach, termination or validity thereof - shall be finally settled by arbitration in accordance with the - Arbitration Rules of Finland Chamber of Commerce. The arbitration - tribunal shall consist of one (1), or if either Party so requires, - of three (3), arbitrators. The award shall be final and binding and - enforceable in any court of competent jurisdiction. The arbitration - shall be held in Helsinki, Finland and the process shall be - conducted in the English language. This Section shall not preclude - parties from seeking provisional remedies in aid of arbitration - from a court of appropriate jurisdiction. + (i) this Agreement shall be construed and interpreted in accordance with + the laws of Finland, excluding its choice of law provisions; + (ii) the United Nations Convention on Contracts for the International + Sale of Goods will not apply to this Agreement; and + (iii) any disputes, controversy or claim arising out of or relating to + this Agreement, or the breach, termination or validity thereof shall + be finally settled by arbitration in accordance with the Arbitration + Rules of Finland Chamber of Commerce. The arbitration tribunal shall + consist of one (1), or if either Party so requires, of three (3), + arbitrators. The award shall be final and binding and enforceable in + any court of competent jurisdiction. The arbitration shall be held + in Helsinki, Finland and the process shall be conducted in the + English language. This Section shall not preclude parties from + seeking provisional remedies in aid of arbitration from a court of + appropriate jurisdiction. 14. GENERAL PROVISIONS + 14.1. No Assignment Except in the case of a merger or sale of substantially all of its corporate -assets, Licensee shall not be entitled to assign or transfer all or any of its -rights, benefits and obligations under this Agreement without the prior written -consent of The Qt Company, which shall not be unreasonably withheld or delayed. -The Qt Company shall be entitled to freely assign or transfer any of its -rights, benefits or obligations under this Agreement. +assets, Licensee shall not be entitled to assign or transfer all or any of +its rights, benefits and obligations under this Agreement without the prior +written consent of The Qt Company, which shall not be unreasonably withheld +or delayed. The Qt Company shall be entitled to freely assign or transfer any +of its rights, benefits or obligations under this Agreement. 14.2. No Third-Party Representations Licensee shall make no representations or warranties concerning the Licensed @@ -821,511 +843,473 @@ survive termination of this Agreement shall so be deemed to survive. Such sections include especially the following: 1, 2, 6, 7, 9, 11, 12.4, 13 and 14. 14.4. Entire Agreement -This Agreement, the exhibits hereto, the License Certificate and any applicable -Purchase Order accepted by The Qt Company constitute the complete agreement -between the Parties and supersedes all prior or contemporaneous discussions, -representations, and proposals, written or oral, with respect to the subject -matters discussed herein. +This Agreement, the exhibits hereto, the License Certificate and any +applicable Purchase Order accepted by The Qt Company constitute the complete +agreement between the Parties and supersedes all prior or contemporaneous +discussions, representations, and proposals, written or oral, with respect +to the subject matters discussed herein. In the event of any conflict or inconsistency between this Agreement and any -Purchase Order, the terms of this Agreement will prevail over the terms of the -Purchase Order with respect to such conflict or inconsistency. +Purchase Order, the terms of this Agreement will prevail over the terms of +the Purchase Order with respect to such conflict or inconsistency. -Parties specifically acknowledge and agree that this Agreement prevails over -any click-to-accept or similar agreements the Designated Users may need to -accept online upon download of the Licensed Software, as may be required by -The Qt Company's applicable processes relating to Licensed Software. +Parties specifically acknowledge and agree that this Agreement prevails +over any click-to-accept or similar agreements the Designated Users may +need to accept online upon download of the Licensed Software, as may be +required by The Qt Company's applicable processes relating to Licensed +Software. 14.5. Modifications No modification of this Agreement shall be effective unless contained in a writing executed by an authorized representative of each Party. No term or condition contained in Licensee's Purchase Order ("Deviating Terms") shall apply unless The Qt Company has expressly agreed such Deviating Terms in -writing. Unless and to the extent expressly agreed by The Qt Company, any such -Deviating Terms shall be deemed void and with no legal effect. For clarity, -delivery of the Licensed Software following the receipt of the Purchase Order -including Deviating Terms shall not constitute acceptance of such Deviating -Terms." +writing. Unless and to the extent expressly agreed by The Qt Company, any +such Deviating Terms shall be deemed void and with no legal effect. For +clarity, delivery of the Licensed Software following the receipt of the +Purchase Order including Deviating Terms shall not constitute acceptance of +such Deviating Terms." 14.6. Force Majeure -Except for the payment obligations hereunder, neither Party shall be liable to -the other for any delay or non-performance of its obligations hereunder in the -event and to the extent that such delay or non-performance is due to an event -of act of God, terrorist attack or other similar unforeseeable catastrophic -event that prevents either Party for fulfilling its obligations under this -Agreement and which such Party cannot avoid or circumvent ("Force Majeure -Event"). If the Force Majeure Event results in a delay or non-performance of a -Party for a period of three (3) months or longer, then either Party shall have -the right to terminate this Agreement with immediate effect without any -liability (except for the obligations of payment arising prior to the event of -Force Majeure) towards the other Party. +Except for the payment obligations hereunder, neither Party shall be liable +to the other for any delay or non-performance of its obligations hereunder +in the event and to the extent that such delay or non-performance is due to +an event of act of God, terrorist attack or other similar unforeseeable +catastrophic event that prevents either Party for fulfilling its +obligations under this Agreement and which such Party cannot avoid or +circumvent ("Force Majeure Event"). If the Force Majeure Event results in +a delay or non-performance of a Party for a period of three (3) months or +longer, then either Party shall have the right to terminate this Agreement +with immediate effect without any liability (except for the obligations of +payment arising prior to the event of Force Majeure) towards the other +Party. 14.7. Notices -Any notice given by one Party to the other shall be deemed properly given and -deemed received if specifically acknowledged by the receiving Party in writing -or when successfully delivered to the recipient by hand, fax, or special -courier during normal business hours on a business day to the addresses -specified for each Party on the signature page. Each communication and document -made or delivered by one Party to the other Party pursuant to this Agreement -shall be in the English language. +Any notice given by one Party to the other shall be deemed properly given +and deemed received if specifically acknowledged by the receiving Party in +writing or when successfully delivered to the recipient by hand, fax, or +special courier during normal business hours on a business day to the +addresses specified for each Party on the signature page. Each +communication and document made or delivered by one Party to the other +Party pursuant to this Agreement shall be in the English language. 14.8. Export Control Licensee acknowledges that the Redistributables, as incorporated in -Applications or Devices, may be subject to export control restrictions under -the applicable laws of respective countries. Licensee shall fully comply with -all applicable export license restrictions and requirements as well as with all -laws and regulations relating to the Redistributables and exercise of licenses -hereunder and shall procure all necessary governmental authorizations, -including without limitation, all necessary licenses, approvals, permissions or -consents, where necessary for the re-exportation of the Redistributables, -Applications and/or Devices. +Applications or Devices, may be subject to export control restrictions +under the applicable laws of respective countries. Licensee shall fully +comply with all applicable export license restrictions and requirements +as well as with all laws and regulations relating to the Redistributables +and exercise of licenses hereunder and shall procure all necessary +governmental authorizations, including without limitation, all necessary +licenses, approvals, permissions or consents, where necessary for the +re-exportation of the Redistributables, Applications and/or Devices. 14.9. No Implied License -There are no implied licenses or other implied rights granted under this -Agreement, and all rights, save for those expressly granted hereunder, shall -remain with The Qt Company and its licensors. In addition, no licenses or -immunities are granted to the combination of the Licensed Software with any -other software or hardware not delivered by The Qt Company under this Agreement. +There are no implied licenses or other implied rights granted under +this Agreement, and all rights, save for those expressly granted hereunder, +shall remain with The Qt Company and its licensors. In addition, no licenses +or immunities are granted to the combination of the Licensed Software with +any other software or hardware not delivered by The Qt Company under this +Agreement. 14.10. Attorney Fees -The prevailing Party in any action to enforce this Agreement shall be entitled -to recover its attorney's fees and costs in connection with such action. +The prevailing Party in any action to enforce this Agreement shall be +entitled to recover its attorney's fees and costs in connection with such +action. 14.11. Privacy -Licensee acknowledges and agrees that for the purpose of this Agreement, The Qt -Company may collect, use, transfer and disclose personal data pertaining to -Designated Users as well as any other employees and directors of the Licensee -and its Contractors relevant for carrying out the intent of this Agreement. -Such personal data may be collected from the Licensee or directly from the -relevant individuals. The Parties acknowledge that with regard to such personal -data processed hereunder, The Qt Company shall be regarded as the Data -Controller under the applicable Data Protection Legislation. The Qt Company -shall process any such personal data in accordance with its privacy policies -and practices, which will comply with all applicable requirements of the Data -Protection Legislation. +Licensee acknowledges and agrees that for the purpose of this Agreement, +The Qt Company may collect, use, transfer and disclose personal data +pertaining to Designated Users as well as any other employees and directors +of the Licensee and its Contractors relevant for carrying out the intent of +this Agreement. Such personal data may be collected from the Licensee or +directly from the relevant individuals. The Parties acknowledge that with +regard to such personal data processed hereunder, The Qt Company shall be +regarded as the Data Controller under the applicable Data Protection +Legislation. The Qt Company shall process any such personal data in +accordance with its privacy policies and practices, which will comply with +all applicable requirements of the Data Protection Legislation. 14.12. Severability -If any provision of this Agreement shall be adjudged by any court of competent -jurisdiction to be unenforceable or invalid, that provision shall be limited or -eliminated to the minimum extent necessary so that this Agreement shall -otherwise remain in full force and effect and enforceable. - - +If any provision of this Agreement shall be adjudged by any court of +competent jurisdiction to be unenforceable or invalid, that provision shall +be limited or eliminated to the minimum extent necessary so that this +Agreement shall otherwise remain in full force and effect and enforceable. APPENDICES -The Agreement includes Appendix 1, and possibly one or more of the appendices -3-5, depending on the product(s) purchased by the Licensee, what is stated in -the quote or invoice, and/or what is stated in the Licensee's License -Certificate. +The Agreement includes Appendix 1, and possibly one or more of the +appendices 3-5, depending on the product(s) purchased by the Licensee, +what is stated in the quote or invoice, and/or what is stated in the +Licensee's License Certificate. APPENDIX 1 -The modules and/or tools that are included in the respective product - Qt for -Application Development (QtAD), Qt for Device Creation (QtDC), Qt for MCUs -(QtMCU), Qt 3D Studio (Qt3DS) and Qt Design Studio (QtDS) - are marked with 'X' -in the below table. -Parts of the product that are permitted for distribution in object-code form -only ("Redistributables") are marked with 'R' in the below table. +The modules and/or tools that are included in the respective product - Qt +for Application Development (QtAD), Qt for Device Creation (QtDC), Qt for +MCUs (QtMCU), Qt 3D Studio (Qt3DS) and Qt Design Studio (QtDS) - are +marked with 'X' in the below table. The modules and tools are ported to Qt 6 +in stages and are subject to availability. -Modules/Tools | QtAD | QtDC | QtMCU | Qt3DS | QtDS -------------------------------------------------------------------------------- -Qt Core | X,R | X,R | | | -------------------------------------------------------------------------------- -Qt GUI | X,R | X,R | | | -------------------------------------------------------------------------------- -Qt Multimedia | X,R | X,R | | | -------------------------------------------------------------------------------- -Qt Multimedia Widgets | X,R | X,R | | | -------------------------------------------------------------------------------- -Qt Network | X,R | X,R | | | -------------------------------------------------------------------------------- -Qt QML | X,R | X,R | | | -------------------------------------------------------------------------------- -Qt Quick | X,R | X,R | | | -------------------------------------------------------------------------------- -Qt Quick Controls 2 | X,R | X,R | | | -------------------------------------------------------------------------------- -Qt Quick Dialogs | X,R | X,R | | | -------------------------------------------------------------------------------- -Qt Quick Layouts | X,R | X,R | | | -------------------------------------------------------------------------------- -Qt Quick Test | X,R | X,R | | | -------------------------------------------------------------------------------- -Qt SQL | X,R | X,R | | | -------------------------------------------------------------------------------- -Qt Test | X,R | X,R | | | -------------------------------------------------------------------------------- -Qt Widgets | X,R | X,R | | | -------------------------------------------------------------------------------- -Active Qt | X,R | X,R | | | -------------------------------------------------------------------------------- -Qt 3D | X,R | X,R | | | -------------------------------------------------------------------------------- -Qt Android Extras | X,R | X,R | | | -------------------------------------------------------------------------------- -Qt Bluetooth | X,R | X,R | | | -------------------------------------------------------------------------------- -Qt Canvas 3D | X,R | X,R | | | -------------------------------------------------------------------------------- -Qt Concurrent | X,R | X,R | | | -------------------------------------------------------------------------------- -Qt D-Bus | X,R | X,R | | | -------------------------------------------------------------------------------- -Qt Gamepad | X,R | X,R | | | -------------------------------------------------------------------------------- -Qt Graphical Effects | X,R | X,R | | | -------------------------------------------------------------------------------- -Qt Help | X,R | X,R | | | -------------------------------------------------------------------------------- -Qt Image Formats | X,R | X,R | | | -------------------------------------------------------------------------------- -Qt Location | X,R | X,R | | | -------------------------------------------------------------------------------- -Qt Mac Extras | X,R | X,R | | | -------------------------------------------------------------------------------- -Qt Network Authorization | X,R | X,R | | | -------------------------------------------------------------------------------- -Qt NFC | X,R | X,R | | | -------------------------------------------------------------------------------- -Qt Platform Headers | X,R | X,R | | | -------------------------------------------------------------------------------- -Qt Positioning | X,R | X,R | | | -------------------------------------------------------------------------------- -Qt Print Support | X,R | X,R | | | -------------------------------------------------------------------------------- -Qt Purchasing | X,R | X,R | | | -------------------------------------------------------------------------------- -Qt for Python | X,R | X,R | | | -------------------------------------------------------------------------------- -Qt Quick Controls | X,R | X,R | | | -------------------------------------------------------------------------------- -Qt Quick Extras | X,R | X,R | | | -------------------------------------------------------------------------------- -Qt Quick Widgets | X,R | X,R | | | -------------------------------------------------------------------------------- -Qt SCXML | X,R | X,R | | | -------------------------------------------------------------------------------- -Qt Sensors | X,R | X,R | | | -------------------------------------------------------------------------------- -Qt Serial Bus | X,R | X,R | | | -------------------------------------------------------------------------------- -Qt Serial Port | X,R | X,R | | | -------------------------------------------------------------------------------- -Qt Speech | X,R | X,R | | | -------------------------------------------------------------------------------- -Qt SVG | X,R | X,R | | | -------------------------------------------------------------------------------- -Qt UI Tools | X,R | X,R | | | -------------------------------------------------------------------------------- -Qt WebChannel | X,R | X,R | | | -------------------------------------------------------------------------------- -Qt WebEngine | X,R | X,R | | | -------------------------------------------------------------------------------- -Qt WebSockets | X,R | X,R | | | -------------------------------------------------------------------------------- -Qt WebView | X,R | X,R | | | -------------------------------------------------------------------------------- -Qt Windows Extras | X,R | X,R | | | -------------------------------------------------------------------------------- -Qt X11 Extras | X,R | X,R | | | -------------------------------------------------------------------------------- -Qt XML | X,R | X,R | | | -------------------------------------------------------------------------------- -Qt XML Patterns | X,R | X,R | | | -------------------------------------------------------------------------------- -Qt Wayland Compositor | X,R | X,R | | | -------------------------------------------------------------------------------- -Qt Charts | X,R | X,R | | | -------------------------------------------------------------------------------- -Qt Data Visualization | X,R | X,R | | | -------------------------------------------------------------------------------- -Qt Virtual Keyboard | X,R | X,R | | | -------------------------------------------------------------------------------- -Boot 2 Qt stack | | X,R | | | -------------------------------------------------------------------------------- -Qt OTA | | X,R | | | -------------------------------------------------------------------------------- -Device Utilities | | X,R | | | -------------------------------------------------------------------------------- -Qt Debugging Bridge (QDB) Daemon | | X,R | | | -------------------------------------------------------------------------------- -Qt Quick Ultralite Controls | | | X,R | | -------------------------------------------------------------------------------- -Qt Quick Ultralite | | | X,R | | -------------------------------------------------------------------------------- -Qt Creator | X | X | X | | -------------------------------------------------------------------------------- -Qt Designer (Qt Widget Designer) | X | X | | | -------------------------------------------------------------------------------- -Qt Quick Designer (Qt Creator plugin) | X | X | X | | -------------------------------------------------------------------------------- -Qt Linguist | X | X | X | | -------------------------------------------------------------------------------- -Qt Assistant | X | X | X | | -------------------------------------------------------------------------------- -lupdate | X | X | X | | -------------------------------------------------------------------------------- -lrelease | X | X | X | | -------------------------------------------------------------------------------- -qmake | X | X | | | -------------------------------------------------------------------------------- -uic | X | X | | | -------------------------------------------------------------------------------- -rcc | X | X | | | -------------------------------------------------------------------------------- -qlalr | X | X | | | -------------------------------------------------------------------------------- -qdoc | X | X | | | -------------------------------------------------------------------------------- -qmlscene | X | X | | | -------------------------------------------------------------------------------- -qmlviewer | X | X | | | -------------------------------------------------------------------------------- -Target toolchains | | X | X | | -------------------------------------------------------------------------------- -Qt Debugging Bridge (QDB) Host Tools | | X | | | -------------------------------------------------------------------------------- -qtconfig-gui | | X | | | -------------------------------------------------------------------------------- -Qt Emulator | | X | | | -------------------------------------------------------------------------------- -qmlinterfacegenerator | | | X | | -------------------------------------------------------------------------------- -qmltocpp | | | X | | -------------------------------------------------------------------------------- -qulfontcompiler | | | X | | -------------------------------------------------------------------------------- -Qt53DStudioRuntime2 | | | | X,R | -------------------------------------------------------------------------------- -Qt 3D Studio | | | | X | -------------------------------------------------------------------------------- -Qt Design Studio | | | | | X -------------------------------------------------------------------------------- +Parts of the product that are permitted for distribution in object-code +form only ("Redistributables") are marked with 'R' in the below table. + ++-----------------------------------------------------------------------+ +| Modules / Tools | QtAD | QtDC | QtMCU | Qt3DS | QtDS | ++-----------------------------------------------------------------------+ +| Qt Core | X, R | X, R | | | | ++-----------------------------------------------------------------------+ +| Qt GUI | X, R | X, R | | | | ++-----------------------------------------------------------------------+ +| Qt Multimedia | X, R | X, R | | | | ++-----------------------------------------------------------------------+ +| Qt Multimedia Widgets | X, R | X, R | | | | ++-----------------------------------------------------------------------+ +| Qt Network | X, R | X, R | | | | ++-----------------------------------------------------------------------+ +| Qt PDF | X, R | X, R | | | | ++-----------------------------------------------------------------------+ +| Qt QML | X, R | X, R | | | | ++-----------------------------------------------------------------------+ +| Qt Quick | X, R | X, R | | | | ++-----------------------------------------------------------------------+ +| Qt Quick Controls 2 | X, R | X, R | | | | ++-----------------------------------------------------------------------+ +| Qt Quick Dialogs | X, R | X, R | | | | ++-----------------------------------------------------------------------+ +| Qt Quick Layouts | X, R | X, R | | | | ++-----------------------------------------------------------------------+ +| Qt Quick Test | X, R | X, R | | | | ++-----------------------------------------------------------------------+ +| Qt SQL | X, R | X, R | | | | ++-----------------------------------------------------------------------+ +| Qt Test | X, R | X, R | | | | ++-----------------------------------------------------------------------+ +| Qt Widgets | X, R | X, R | | | | ++-----------------------------------------------------------------------+ +| Active Qt | X, R | X, R | | | | ++-----------------------------------------------------------------------+ +| Qt 3D | X, R | X, R | | | | ++-----------------------------------------------------------------------+ +| Qt Android Extras | X, R | X, R | | | | ++-----------------------------------------------------------------------+ +| Qt Bluetooth | X, R | X, R | | | | ++-----------------------------------------------------------------------+ +| Qt Canvas 3D | X, R | X, R | | | | ++-----------------------------------------------------------------------+ +| Qt Concurrent | X, R | X, R | | | | ++-----------------------------------------------------------------------+ +| Qt D-Bus | X, R | X, R | | | | ++-----------------------------------------------------------------------+ +| Qt Gamepad | X, R | X, R | | | | ++-----------------------------------------------------------------------+ +| Qt Graphical Effects | X, R | X, R | | | | ++-----------------------------------------------------------------------+ +| Qt Help | X, R | X, R | | | | ++-----------------------------------------------------------------------+ +| Qt Image Formats | X, R | X, R | | | | ++-----------------------------------------------------------------------+ +| Qt Location | X, R | X, R | | | | ++-----------------------------------------------------------------------+ +| Qt Mac Extras | X, R | X, R | | | | ++-----------------------------------------------------------------------+ +| Qt Network Authorization | X, R | X, R | | | | ++-----------------------------------------------------------------------+ +| Qt NFC | X, R | X, R | | | | ++-----------------------------------------------------------------------+ +| Qt Platform Headers | X, R | X, R | | | | ++-----------------------------------------------------------------------+ +| Qt Positioning | X, R | X, R | | | | ++-----------------------------------------------------------------------+ +| Qt Print Support | X, R | X, R | | | | ++-----------------------------------------------------------------------+ +| Qt Purchasing | X, R | X, R | | | | ++-----------------------------------------------------------------------+ +| Qt for Python | X, R | X, R | | | | ++-----------------------------------------------------------------------+ +| Qt Quick Controls | X, R | X, R | | | | ++-----------------------------------------------------------------------+ +| Qt Quick Extras | X, R | X, R | | | | ++-----------------------------------------------------------------------+ +| Qt Quick Widgets | X, R | X, R | | | | ++-----------------------------------------------------------------------+ +| Qt SCXML | X, R | X, R | | | | ++-----------------------------------------------------------------------+ +| Qt Sensors | X, R | X, R | | | | ++-----------------------------------------------------------------------+ +| Qt Serial Bus | X, R | X, R | | | | ++-----------------------------------------------------------------------+ +| Qt Serial Port | X, R | X, R | | | | ++-----------------------------------------------------------------------+ +| Qt Speech | X, R | X, R | | | | ++-----------------------------------------------------------------------+ +| Qt SVG | X, R | X, R | | | | ++-----------------------------------------------------------------------+ +| Qt UI Tools | X, R | X, R | | | | ++-----------------------------------------------------------------------+ +| Qt WebChannel | X, R | X, R | | | | ++-----------------------------------------------------------------------+ +| Qt WebEngine | X, R | X, R | | | | ++-----------------------------------------------------------------------+ +| Qt WebSockets | X, R | X, R | | | | ++-----------------------------------------------------------------------+ +| Qt WebView | X, R | X, R | | | | ++-----------------------------------------------------------------------+ +| Qt Windows Extras | X, R | X, R | | | | ++-----------------------------------------------------------------------+ +| Qt X11 Extras | X, R | X, R | | | | ++-----------------------------------------------------------------------+ +| Qt XML | X, R | X, R | | | | ++-----------------------------------------------------------------------+ +| Qt XML Patterns | X, R | X, R | | | | ++-----------------------------------------------------------------------+ +| Qt Wayland Compositor | X, R | X, R | | | | ++-----------------------------------------------------------------------+ +| Qt Charts | X, R | X, R | | | | ++-----------------------------------------------------------------------+ +| Qt Data Visualization | X, R | X, R | | | | ++-----------------------------------------------------------------------+ +| Qt Virtual Keyboard | X, R | X, R | | | | ++-----------------------------------------------------------------------+ +| Boot 2 Qt stack | | X, R | | | | ++-----------------------------------------------------------------------+ +| Qt OTA | | X, R | | | | ++-----------------------------------------------------------------------+ +| Device Utilities | | X, R | | | | ++-----------------------------------------------------------------------+ +| Qt Debugging Bridge (QDB) Daemon | | X, R | | | | ++-----------------------------------------------------------------------+ +| Qt Quick Ultralite Controls | | | X, R | | | ++-----------------------------------------------------------------------+ +| Qt Quick Ultralite | | | X, R | | | ++-----------------------------------------------------------------------+ +| Qt Creator | X | X | X | | | ++-----------------------------------------------------------------------+ +| Qt Designer (Qt Widget Designer) | X | X | | | | ++-----------------------------------------------------------------------+ +| Qt Quick Designer (Qt Creator | X, R | X, R | X, R | | | +| plugin) | | | | | | ++-----------------------------------------------------------------------+ +| Qt Linguist | X, R | X, R | X, R | | | ++-----------------------------------------------------------------------+ +| Qt Assistant | X, R | X, R | X, R | | | ++-----------------------------------------------------------------------+ +| Lupdate | X, R | X, R | X, R | | | ++-----------------------------------------------------------------------+ +| Lrelease | X, R | X, R | X, R | | | ++-----------------------------------------------------------------------+ +| Qmake | X | X | | | | ++-----------------------------------------------------------------------+ +| Uic | X | X | | | | ++-----------------------------------------------------------------------+ +| Rcc | X | X | | | | ++-----------------------------------------------------------------------+ +| Qlalr | X | X | | | | ++-----------------------------------------------------------------------+ +| Qdoc | X | X | | | | ++-----------------------------------------------------------------------+ +| Qmlscene | X | X | | | | ++-----------------------------------------------------------------------+ +| Qmlviewer | X | X | | | | ++-----------------------------------------------------------------------+ +| Target toolchains | | X | X | | | ++-----------------------------------------------------------------------+ +| Qt Debugging Bridge (QDB) Host | | X | | | | +| Tools | | | | | | ++-----------------------------------------------------------------------+ +| qtconfig-gui | | X | | | | ++-----------------------------------------------------------------------+ +| Qt Emulator | | X | | | | ++-----------------------------------------------------------------------+ +| Qmlinterfacegenerator | | | X | | | ++-----------------------------------------------------------------------+ +| Qmltocpp | | | X | | | ++-----------------------------------------------------------------------+ +| qulfontcompiler | | | X | | | ++-----------------------------------------------------------------------+ +| Qt53DStudioRuntime2 | | | | X, R | | ++-----------------------------------------------------------------------+ +| Qt 3D Studio | | | | X | | ++-----------------------------------------------------------------------+ +| Qt Design Studio | | | | | X | ++-----------------------------------------------------------------------+ APPENDIX 3: ADDITIONS TO LICENSED SOFTWARE + In addition to what is provided under the definition of the Licensed Software, Parties agree that Licensed Software shall also include the Add-On Products of -The Qt Company, as mentioned in this Appendix, if included in the -quote / invoice. +The Qt Company, as mentioned in this Appendix, if included in the quote / +invoice. The Modules and/or Tools of the Licensed Software that are included with each -Add-On Product respectively are marked with 'X' in the below table. Parts of -the respective Add-On Product that are permitted for distribution in +Add-On Product respectively are marked with 'X' in the below table. The modules +are ported to Qt 6 in stages and are subject to availability. + +Parts of the respective Add-On Product that are permitted for distribution in object-code form only ("Redistributables") are marked with 'R' in the below table. -------------------------------------------------------------------------------- - | Add-On Product(s) -Modules / |------------------------------------------------------------------ -Tools of |Qt for |Qt |Qt Safe |Qt |Qt |Qt -Licensed |Automation |Automotive |Renderer |Application|Gammaray |Deployment -Software | |Suite | |Manager | |Platform - | | | | | |Package -------------------------------------------------------------------------------- -Qt MQTT | X,R | | | | | -------------------------------------------------------------------------------- -Qt KNX | X,R | | | | | -------------------------------------------------------------------------------- -Qt OPC UA | X,R | | | | | -------------------------------------------------------------------------------- -Qt CoAP | X,R | | | | | -------------------------------------------------------------------------------- -Qt Safe | | X,R | X,R | | | -Renderer | | | | | | -------------------------------------------------------------------------------- -Qt | | | | | | -Application | | X,R | | X,R | | -Manager | | | | | | -------------------------------------------------------------------------------- -Qt IVI | | X,R | | | | -------------------------------------------------------------------------------- -Reference UI| | X,R | | | | -------------------------------------------------------------------------------- -Qt GENIVI | | X,R | | | | -Extras | | | | | | -------------------------------------------------------------------------------- -QML Live | | X | | | | -------------------------------------------------------------------------------- -Qt Creator | | X | | | | -Deployment | | | | | | -------------------------------------------------------------------------------- -Qt Creator | | | | | | -Plugin for | | | | | | -Qt | | X | | X | | -Application | | | | | | -Manager | | | | | | -------------------------------------------------------------------------------- -Qt | | | | | | -Automotive | | | | | | -Suite | | X | | | | -Deployment | | | | | | -Server | | | | | | -------------------------------------------------------------------------------- -Qt Design | | X | | | | -Studio | | | | | | -------------------------------------------------------------------------------- -Qt 3D Studio| | X | | | | -------------------------------------------------------------------------------- -GammaRay | | X | | | X | -------------------------------------------------------------------------------- -Platform | | | | | | -adaptations | | | | | | -for | | | | | | X -specified | | | | | | -Deployment | | | | | | -Platforms | | | | | | -------------------------------------------------------------------------------- -Qt for | | | | | | -Device | | X | | | | -Creation | | | | | | -------------------------------------------------------------------------------- ++------------------------------------------------------------------------------------------------+ +| | Add-On Product(s) | +| +--------------------------------------------------------------------------+ +| Modules / Tools of | Qt for | Qt | Qt | Qt | Qt | Qt | +| Licensed Software | Automation | Automotive | Safe | Application | GammaRay | Deployment | +| | / Qt M2M | Suite | Renderer | Manager | | Platform | +| | Protocols | | | | | Package | ++------------------------------------------------------------------------------------------------+ +| Qt MQTT | X, R | | | | | | ++------------------------------------------------------------------------------------------------+ +| Qt KNX | X, R | | | | | | ++------------------------------------------------------------------------------------------------+ +| Qt OPC UA | X, R | | | | | | ++------------------------------------------------------------------------------------------------+ +| Qt CoAP | X, R | | | | | | ++------------------------------------------------------------------------------------------------+ +| Qt Safe Renderer | | X, R | X, R | | | | ++------------------------------------------------------------------------------------------------+ +| Qt Application | | X, R | | X, R | | | +| Manager | | | | | | | ++------------------------------------------------------------------------------------------------+ +| Qt IVI | | X, R | | | | | ++------------------------------------------------------------------------------------------------+ +| Reference UI | | X, R | | | | | ++------------------------------------------------------------------------------------------------+ +| Qt GENIVI Extras | | X, R | | | | | ++------------------------------------------------------------------------------------------------+ +| QML Live | | X | | | | | ++------------------------------------------------------------------------------------------------+ +| Qt Creator | | X | | | | | +| Deployment | | | | | | | ++------------------------------------------------------------------------------------------------+ +| Qt Creator Plugin | | X | | X | | | +| for Qt Application Manager | | | | | | ++------------------------------------------------------------------------------------------------+ +| Qt Automotive Suite | | X | | | | | +| Deployment Server | | | | | | | ++------------------------------------------------------------------------------------------------+ +| Qt Design Studio | | X | | | | | ++------------------------------------------------------------------------------------------------+ +| Qt 3D Studio | | X | | | | | ++------------------------------------------------------------------------------------------------+ +| GammaRay | | X | | | X | | ++------------------------------------------------------------------------------------------------+ +| Platform adaptations| | | | | | X | +| for specified | | | | | | +| Deployment Platforms | | | | | | ++------------------------------------------------------------------------------------------------+ +| Qt for Device | | X | | | | | +| Creation | | | | | | | ++------------------------------------------------------------------------------------------------+ + All the above Redistributables are subject to applicable provisions and limitations including but not limited to what is defined in section 3 of the Agreement. - APPENDIX 4: SMALL BUSINESS AND STARTUP -The provisions of this Appendix 4 are applicable for Start-up Companies and for -the Evaluation Term.For the purpose of this Appendix 4, the following -additional definitions shall be applicable: -"Trial Term" shall mean a period of twelve (12) months. +The provisions of this Appendix 4 are applicable for companies with an annual +revenue, including funding, equivalent to maximum of 250,000 USD (in +applicable currency) during the latest full calendar year, as evidenced by +duly audited records of the Licensee and approved by The Qt Company +("Start-up Company"). -"Start-up Company" means a company with a maximum annual revenue, including -funding, equivalent to 100,000 USD (in applicable currency) during a respective -calendar year, as evidenced by duly audited records of the Licensee and -approved by The Qt Company. +Start-up Companies are qualified for a discounted License Fee for maximum of +four (4) Development Licenses ("Start-up Development License") unless +otherwise agreed between the parties. -During the Trial Term, Section 3 shall apply with following modifications -("Trial Term Modifications"): - (i) Licenses granted under Sections 3.1 and 3.2 shall be free of any - charge. For clarity, License for distribution of Devices pursuant - to Section 3.3 is subject to applicable License Fee for necessary - Distribution Licenses; - (ii) Development License under Section 3.1 is limited to a maximum of - three (3) Designated Users; and - (iii) Support is available subject to availability, as judged by The Qt - Company at its free and absolute discretion, provided that support - will be limited to a maximum of ten (10) tickets during the Trial - Term. - -Upon expiry of the Trial Term: - (a) This Appendix 4 is terminated, Trial Term Modifications cease to - remain in force, Licensee's Development Licenses shall be - automatically converted into licenses subject to a License Fee (in - the amount specified in the quote or in Appendix 2 and payable with - a 30-day payment term) and Licensee's rights and obligations under - this Agreement shall continue to remain in force under the standard - provisions of the Agreement, unless the Licensee notifies The Qt - Company in writing no less than ninety (90) days before such expiry - date that Licensee does not agree to such continuance, in which - event the Agreement, and all rights of the Licensee thereunder, - shall expire; provided however that - (b) in the event the Licensee still qualifies as a Start-up Company, - the Licensee has an option ("Option"), instead of what is stated in - item a) above, to renew the Trial Term. Renewal is limited to one - time, and the total duration of Trial Term is thus 24 months after - the effective date. Licensee shall notify The Qt Company in - writing, no less than ninety (90) days before the expiry date, if - Licensee wish to exercise the Option. +Start-up Development License entitles the respective Designated User for +Support only for installation related issues. +Upon expiry of the respective License Term, the Start-up Development +Licenses shall be automatically extended, pursuant to Section 3.1 of the +Agreement, for a Renewal Term either as new Start-up Development Licenses +(if the Licensee still qualifies as a Start-up Company), or as normal +Development Licenses (if the Licensee no longer qualifies as a Start-up +company). APPENDIX 5: NON-COMMERCIAL USE -The provisions of this Appendix 5 are applicable for non-commercial use of the -Licensed Software by the Licensee. +The provisions of this Appendix 5 are applicable for non-commercial use of +the Licensed Software by the Licensee. For the purpose of this Appendix 5, the following additional definitions -(replacing the relevant definition of the Agreement, where applicable) shall be -applicable: +(replacing the relevant definition of the Agreement, where applicable) +shall be applicable: "Demo Units" shall mean (i) hardware development platform, which incorporates -the Licensed Software along with Licensee's software and/or hardware, and (ii) -prototype versions of Applications or Devices. +the Licensed Software along with Licensee's software and/or hardware, and +(ii) prototype versions of Applications or Devices. "Designated User(s)" shall mean the employees and students of the Licensee. "Licensee Products" shall mean Applications and/or Devices. -"Permitted Purpose" shall mean (i) Licensee's internal evaluation and testing -of Licensed Software, (ii) building Demo Units as well as (iii) educational -use. +"Permitted Purpose" shall mean (i) Licensee's internal evaluation and +testing of Licensed Software, (ii) building Demo Units as well as (iii) +educational use. -"Term" shall mean a period of twelve (12) months or any such other period as -may be agreed between the Parties. +"Term" shall mean a period of twelve (12) months or any such other period +as may be agreed between the Parties. -For the purpose of this Appendix 5, the following changes shall be agreed with -respect to relevant Sections of the Agreement: - I. Recital (A) shall be replaced in its entirety to read as follows: +For the purpose of this Appendix 5, the following changes shall be agreed +with respect to relevant Sections of the Agreement: - "(A) Licensee wishes to use the Licensed Software for the Permitted - Purpose." + I. Recital (A) shall be replaced in its entirety to read as follows: + "(A) Licensee wishes to use the Licensed Software for the Permitted + Purpose." + II. Section 3.1 shall be replaced in its entirety to read as follows: + "The Qt Company grants to Licensee a personal, non-exclusive, + non-transferable, revocable, royalty-free license, valid for the + Term, to use, modify and copy the Licensed Software solely for the + Permitted Purpose. + Licensee may install copies of the Licensed Software on five (5) + computers per Designated User, provided that only the Designated + Users who have a valid Development License may use the Licensed + Software. + Licensee may demonstrate the Demo Units, provided that such + demonstrations must be conducted by Licensee, and the Demo Units + must remain in Licensee's possession and under Licensee's control + at all times. + For clarity, this Agreement does not (i) entitle Licensee to use + Licensed Software to create Applications or Devices (other than + prototypes thereof) or (ii) carry any distribution rights to + Licensee, but such rights are subject to and conditional upon + conclusion of a separate license agreement with The Qt Company." + III. Sections 3.2, 3.3, 8 and 10 shall be deleted. + IV. Section 3.4 shall be replaced in its entirety to read as follows: + "Licensee shall not: + - remove or alter any copyright, trademark or other proprietary + rights notice contained in any portion of the Licensed Software; + - transfer, publish, sublicense, disclose, display or otherwise + make the Licensed Software available to any third party (except + that Licensee may demonstrate the Demo Units pursuant to Section + 3.1); + - in any way combine, incorporate or integrate Licensed Software + with, or use Licensed Software for creation of, any software + created with or incorporating Open Source Qt; - II. Section 3.1 shall be replaced in its entirety to read as follows: + Licensee shall cause all Designated Users who make use of the + licenses granted under this Agreement, to be contractually bound + to comply with the relevant terms of this Agreement and not to use + the Licensed Software beyond the terms hereof. Licensee shall be + responsible for any and all actions and omissions of its + Designated Users relating to the Licensed Software and use + thereof. - "The Qt Company grants to Licensee a personal, non-exclusive, - non-transferable, revocable, royalty-free license, valid for the - Term, to use, modify and copy the Licensed Software solely for the - Permitted Purpose. + Any use of Licensed Software beyond the provisions of this + Agreement is strictly prohibited and requires an additional license + from The Qt Company." + V. Section 12 shall be replaced in its entirety to read as follows: + "This Agreement shall enter into force upon due acceptance by both + Parties and remain in force for the Term, unless and until + terminated pursuant to the terms of Section 12. - Licensee may install copies of the Licensed Software on an - unlimited number of computers provided that only Designated Users - may use the Licensed Software. - - Licensee may demonstrate the Demo Units, provided that such - demonstrations must be conducted by Licensee, and the Demo Units - must remain in Licensee's possession and under Licensee's control - at all times. - - For clarity, this Agreement does not (i) entitle Licensee to use - Licensed Software to create Applications or Devices (other than - prototypes thereof) or (ii) carry any distribution rights to - Licensee, but such rights are subject to and conditional upon - conclusion of a separate license agreement with The Qt Company." - - III. Sections 3.2, 3.3, 8 and 10 shall be deleted. - - IV. Section 3.4 shall be replaced in its entirety to read as follows: - - "Licensee shall not: - - remove or alter any copyright, trademark or other proprietary - rights notice contained in any portion of the Licensed - Software; - - - transfer, publish, sublicense, disclose, display or otherwise - make the Licensed Software available to any third party - (except that Licensee may demonstrate the Demo Units pursuant - to Section 3.1); - - - in any way combine, incorporate or integrate Licensed - Software with, or use Licensed Software for creation of, any - software created with or incorporating Open Source Qt; - - Licensee shall cause all Designated Users who make use of the - licenses granted under this Agreement, to be contractually bound to - comply with the relevant terms of this Agreement and not to use the - Licensed Software beyond the terms hereof. Licensee shall be - responsible for any and all actions and omissions of its Designated - Users relating to the Licensed Software and use thereof. - - Any use of Licensed Software beyond the provisions of this - Agreement is strictly prohibited and requires an additional license - from The Qt Company." - - V. Section 12 shall be replaced in its entirety to read as follows: - - "This Agreement shall enter into force upon due acceptance by both - Parties and remain in force for the Term, unless and until - terminated pursuant to the terms of Section 12. - - Upon termination of the Agreement, Licensee shall cease using the - Licensed Software. All other copies of Licensed Software in the - possession or control of Licensee must be erased or destroyed. An - officer of Licensee must, upon request, promptly deliver to The Qt - Company a written confirmation that this has occurred." - -Except for the modifications specified above, this Appendix carries no change -to the terms of the Agreement which shall remain in full force. + Upon termination of the Agreement, Licensee shall cease using the + Licensed Software. All other copies of Licensed Software in the + possession or control of Licensee must be erased or destroyed. + An officer of Licensee must, upon request, promptly deliver to + The Qt Company a written confirmation that this has occurred." +Except for the modifications specified above, this Appendix carries no +change to the terms of the Agreement which shall remain in full force. diff --git a/configure.json b/configure.json index 4a7c50f6..f0b5fed4 100644 --- a/configure.json +++ b/configure.json @@ -244,11 +244,18 @@ "testTypeDependencies": { "linkerSupportsFlag": [ "use_bfd_linker", "use_gold_linker", "use_lld_linker" ], - "verifySpec": [ "shared", "use_bfd_linker", "use_gold_linker", "use_lld_linker", "compiler-flags", "qmakeargs", "commit" ], + "verifySpec": [ + "shared", + "use_bfd_linker", "use_gold_linker", "use_lld_linker", + "compiler-flags", "qmakeargs", + "simulator_and_device", + "thread", + "commit" ], "compile": [ "verifyspec" ], "detectPkgConfig": [ "cross_compile", "machineTuple" ], "library": [ "pkg-config", "compiler-flags" ], - "getPkgConfigVariable": [ "pkg-config" ] + "getPkgConfigVariable": [ "pkg-config" ], + "architecture" : [ "verifyspec" ] }, "testTypeAliases": { @@ -762,7 +769,7 @@ }, "architecture": { "label": "Architecture", - "output": [ "architecture" ] + "output": [ "architecture", "commitConfig" ] }, "pkg-config": { "label": "Using pkg-config", diff --git a/configure.pri b/configure.pri index 49755f7a..63d6b3f2 100644 --- a/configure.pri +++ b/configure.pri @@ -662,6 +662,13 @@ defineTest(qtConfOutput_commitOptions) { write_file($$QT_BUILD_TREE/mkspecs/qdevice.pri, $${currentConfig}.output.devicePro)|error() } +# Output is written after configuring each Qt module, +# but some tests within a module might depend on the +# configuration output of previous tests. +defineTest(qtConfOutput_commitConfig) { + qtConfProcessOutput() +} + # type (empty or 'host'), option name, default value defineTest(processQtPath) { out_var = config.rel_input.$${2} @@ -985,6 +992,12 @@ defineTest(qtConfOutput_architecture) { subarch = $$qtConfEvaluate('tests.architecture.subarch') buildabi = $$qtConfEvaluate("tests.architecture.buildabi") + macos { + eval($$config.input.qmakeArgs) + apple_archs = $$QMAKE_APPLE_DEVICE_ARCHS + isEmpty(apple_archs): apple_archs = "\$\$QT_ARCH" + } + $$qtConfEvaluate("features.cross_compile") { host_arch = $$qtConfEvaluate("tests.host_architecture.arch") host_buildabi = $$qtConfEvaluate("tests.host_architecture.buildabi") @@ -1006,12 +1019,22 @@ defineTest(qtConfOutput_architecture) { " QT_BUILDABI = $$buildabi" \ "}" + macos { + publicPro += \ + "host_build {" \ + " QT_ARCHS = \$\$QT_ARCH" \ + "} else {" \ + " QT_ARCHS = $$apple_archs" \ + "}" + } } else { privatePro = \ "QT_CPU_FEATURES.$$arch = $$subarch" publicPro = \ "QT_ARCH = $$arch" \ "QT_BUILDABI = $$buildabi" + + macos: publicPro += "QT_ARCHS = $$apple_archs" } $${currentConfig}.output.publicPro += $$publicPro diff --git a/debian/changelog b/debian/changelog index 0f01357a..ec60521e 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +qtbase-opensource-src (5.15.8+dfsg-ok1.1) yangtze; urgency=medium + + * update to 5.15.8 + + -- hanpinlong Fri, 05 May 2023 14:04:33 +0800 + qtbase-opensource-src (5.15.3+dfsg-ok1.1) yangtze; urgency=medium * Bug: Issue#I66RY2 diff --git a/doc/global/externalsites/external-resources.qdoc b/doc/global/externalsites/external-resources.qdoc index 187c73da..0cf9758c 100644 --- a/doc/global/externalsites/external-resources.qdoc +++ b/doc/global/externalsites/external-resources.qdoc @@ -40,6 +40,10 @@ \externalpage https://developer.android.com/studio/publish/versioning#appversioning \title Android: App Versioning */ +/*! + \externalpage https://developer.android.com/studio/command-line/adb#devicestatus + \title Android: Query for devices +*/ /*! \externalpage http://www.freedesktop.org/ \title freedesktop.org @@ -522,3 +526,8 @@ \externalpage https://login.qt.io/ \title Qt Account Sign-up */ + +/*! + \externalpage https://www.unicode.org/ + \title Unicode standard +*/ diff --git a/doc/global/template/style/offline-simple.css b/doc/global/template/style/offline-simple.css index b89ca5a8..9b5ed750 100644 --- a/doc/global/template/style/offline-simple.css +++ b/doc/global/template/style/offline-simple.css @@ -8,10 +8,6 @@ pre, .LegaleseLeft { overflow-x:auto; } -pre a[href] { - color: #5caa15; -} - p { width: 70%; margin: 15px 0px 10px 15px; @@ -22,16 +18,6 @@ table p { padding: 0px; } -a[href] { - color: #007330; - text-decoration: none; -} - -/* Different color for ext. links */ -a[href|="http://"], a[href|="https://"] { - color: #6bb8db; -} - h1.title { margin-top: 30px; margin-left: 6px; diff --git a/doc/global/template/style/offline.css b/doc/global/template/style/offline.css index f99369a0..c6bc6a96 100644 --- a/doc/global/template/style/offline.css +++ b/doc/global/template/style/offline.css @@ -1,6 +1,6 @@ body { font: normal 400 14px/1.2 Arial; - margin-top: 85px; + margin-top: 50px; font-family: Arial, Helvetica; text-align: left; margin-left: 5px; @@ -112,39 +112,18 @@ a[href*="http://"], a[href*="ftp://"], a[href*="https://"] { NOTE styles ------------------------------- */ - -.notetitle, .tiptitle, .fastpathtitle { - font-weight: bold +.admonition { + padding: 5px 0 5px 40px; + border: #ccc 1px solid; } -.attentiontitle, .cautiontitle, .dangertitle, .importanttitle, .remembertitle, .restrictiontitle { - font-weight: bold +.admonition.note, .admonition.important { + background: #f2f2f2 3px 6px no-repeat url(../images/ico_note.png); } -.note, .tip, .fastpath { - background: #F2F2F2 url(../images/ico_note.png); - background-repeat: no-repeat; - background-position: top left; - padding: 5px; - padding-left: 40px; - padding-bottom: 10px; - border: #999 1px dotted; - color: #666666; - margin: 5px; +.admonition.warning { + background: #f2f2f2 3px 6px no-repeat url(../images/ico_note_attention.png); } - -.attention, .caution, .danger, .important, .remember, .restriction { - background: #F2F2F2 url(../images/ico_note_attention.png); - background-repeat: no-repeat; - background-position: top left; - padding: 5px; - padding-left: 40px; - padding-bottom: 10px; - border: #999 1px dotted; - color: #666666; - margin: 5px; -} - /* ------------------------------- Top navigation @@ -232,7 +211,6 @@ footer and license .navigationbar { display: block; position: relative; - top: -20px; border-top: 1px solid #cecece; border-bottom: 1px solid #cecece; background-color: #F2F2F2; @@ -320,18 +298,17 @@ headers @media screen { .title { color: #313131; - font-size: 24px; + font-size: 20px; font-weight: normal; left: 0; - padding-bottom: 20px; + padding-bottom: 15px; padding-left: 10px; - padding-top: 20px; + padding-top: 15px; position: absolute; right: 0; top: 0; background-color: #E6E6E6; border-bottom: 1px #CCC solid; - border-top: 2px #CCC solid; font-weight: bold; margin-left: 0px; margin-right: 0px; @@ -351,7 +328,7 @@ h2, p.h2 { font-weight: 100; background-color: #F2F3F4; padding: 4px; - margin-bottom: 30px; + margin-bottom: 15px; margin-top: 30px; border-top: #E0E0DE 1px solid; border-bottom: #E0E0DE 1px solid; @@ -366,7 +343,7 @@ h3 { font: 500 14px/1.2 Arial; font-weight: 100; text-decoration: underline; - margin-bottom: 30px; + margin-bottom: 15px; margin-top: 30px; } @@ -385,7 +362,7 @@ h3.fn, span.fn { max-width: 75%; font-size: 14px; margin: 0px; - margin-top: 45px; + margin-top: 30px; } .fngroup h3.fngroupitem { margin-bottom: 5px; @@ -659,6 +636,7 @@ Content table width: 200px; text-align: left; margin-left: 20px; + margin-top: 5px; } } diff --git a/doc/global/template/style/online.css b/doc/global/template/style/online.css index 48fe0bfc..0c8ed5c5 100644 --- a/doc/global/template/style/online.css +++ b/doc/global/template/style/online.css @@ -992,6 +992,25 @@ pre, .LegaleseLeft { color:#fff; white-space: pre-wrap } +div.admonition { + margin:1.5em 0 1.5em; + padding:12px; +} +div.admonition.note { + background-color:#c5d3f4; + border-left:5px solid #7a9ae5; +} +div.admonition.warning { + background-color:#ffe4e4; + border-left:5px solid #ff8383; +} +div.admonition.important { + background-color:#fef9f3; + border-left:5px solid #f6cb97; +} +.mainContent .admonition p { + margin:0; +} pre .str,code .str { color:#aaaaaa } diff --git a/examples/widgets/itemviews/editabletreemodel/mainwindow.cpp b/examples/widgets/itemviews/editabletreemodel/mainwindow.cpp index 7faa3254..47fc2327 100644 --- a/examples/widgets/itemviews/editabletreemodel/mainwindow.cpp +++ b/examples/widgets/itemviews/editabletreemodel/mainwindow.cpp @@ -62,7 +62,7 @@ MainWindow::MainWindow(QWidget *parent) QFile file(":/default.txt"); file.open(QIODevice::ReadOnly); - TreeModel *model = new TreeModel(headers, file.readAll()); + TreeModel *model = new TreeModel(headers, file.readAll(), this); file.close(); view->setModel(model); diff --git a/examples/widgets/itemviews/editabletreemodel/treemodel.cpp b/examples/widgets/itemviews/editabletreemodel/treemodel.cpp index 9678e45b..960ce7c1 100644 --- a/examples/widgets/itemviews/editabletreemodel/treemodel.cpp +++ b/examples/widgets/itemviews/editabletreemodel/treemodel.cpp @@ -212,6 +212,9 @@ bool TreeModel::removeRows(int position, int rows, const QModelIndex &parent) //! [8] int TreeModel::rowCount(const QModelIndex &parent) const { + if (parent.isValid() && parent.column() > 0) + return 0; + const TreeItem *parentItem = getItem(parent); return parentItem ? parentItem->childCount() : 0; diff --git a/examples/widgets/tools/plugandpaint/app/app.pro b/examples/widgets/tools/plugandpaint/app/app.pro index 558d359e..e5ff02ec 100644 --- a/examples/widgets/tools/plugandpaint/app/app.pro +++ b/examples/widgets/tools/plugandpaint/app/app.pro @@ -18,7 +18,11 @@ LIBS = -L../plugins macx-xcode { LIBS += -lpnp_basictools$($${QMAKE_XCODE_LIBRARY_SUFFIX_SETTING}) } else { - LIBS += -lpnp_basictools + android { + LIBS += -lpnp_basictools_$${QT_ARCH} + } else { + LIBS += -lpnp_basictools + } if(!debug_and_release|build_pass):CONFIG(debug, debug|release) { mac:LIBS = $$member(LIBS, 0) $$member(LIBS, 1)_debug win32:LIBS = $$member(LIBS, 0) $$member(LIBS, 1)d diff --git a/examples/widgets/tools/treemodelcompleter/mainwindow.cpp b/examples/widgets/tools/treemodelcompleter/mainwindow.cpp index 302ccc43..91cdaee2 100644 --- a/examples/widgets/tools/treemodelcompleter/mainwindow.cpp +++ b/examples/widgets/tools/treemodelcompleter/mainwindow.cpp @@ -206,7 +206,7 @@ QAbstractItemModel *MainWindow::modelFromFile(const QString &fileName) QRegularExpression re("^\\s+"); while (!file.atEnd()) { - const QString line = QString::fromUtf8(file.readLine()).trimmed(); + const QString line = QString::fromUtf8(file.readLine()); const QString trimmedLine = line.trimmed(); if (trimmedLine.isEmpty()) continue; @@ -218,7 +218,7 @@ QAbstractItemModel *MainWindow::modelFromFile(const QString &fileName) level = 0; } else { const int capLen = match.capturedLength(); - level = line.startsWith(QLatin1Char('\t')) ? capLen / 4 : capLen; + level = capLen / 4; } if (level + 1 >= parents.size()) @@ -267,4 +267,3 @@ void MainWindow::updateContentsLabel(const QString &sep) { contentsLabel->setText(tr("Type path from model above with items at each level separated by a '%1'").arg(sep)); } - diff --git a/examples/widgets/widgets/imageviewer/imageviewer.cpp b/examples/widgets/widgets/imageviewer/imageviewer.cpp index 7de0c7c4..bce74a24 100644 --- a/examples/widgets/widgets/imageviewer/imageviewer.cpp +++ b/examples/widgets/widgets/imageviewer/imageviewer.cpp @@ -176,6 +176,7 @@ static void initializeImageFileDialog(QFileDialog &dialog, QFileDialog::AcceptMo mimeTypeFilters.sort(); dialog.setMimeTypeFilters(mimeTypeFilters); dialog.selectMimeTypeFilter("image/jpeg"); + dialog.setAcceptMode(acceptMode); if (acceptMode == QFileDialog::AcceptSave) dialog.setDefaultSuffix("jpg"); } @@ -185,7 +186,7 @@ void ImageViewer::open() QFileDialog dialog(this, tr("Open File")); initializeImageFileDialog(dialog, QFileDialog::AcceptOpen); - while (dialog.exec() == QDialog::Accepted && !loadFile(dialog.selectedFiles().first())) {} + while (dialog.exec() == QDialog::Accepted && !loadFile(dialog.selectedFiles().constFirst())) {} } //! [1] @@ -194,7 +195,7 @@ void ImageViewer::saveAs() QFileDialog dialog(this, tr("Save File As")); initializeImageFileDialog(dialog, QFileDialog::AcceptSave); - while (dialog.exec() == QDialog::Accepted && !saveFile(dialog.selectedFiles().first())) {} + while (dialog.exec() == QDialog::Accepted && !saveFile(dialog.selectedFiles().constFirst())) {} } //! [5] @@ -365,7 +366,7 @@ void ImageViewer::createActions() QMenu *helpMenu = menuBar()->addMenu(tr("&Help")); helpMenu->addAction(tr("&About"), this, &ImageViewer::about); - helpMenu->addAction(tr("About &Qt"), &QApplication::aboutQt); + helpMenu->addAction(tr("About &Qt"), this, &QApplication::aboutQt); } //! [18] diff --git a/examples/widgets/widgets/imageviewer/main.cpp b/examples/widgets/widgets/imageviewer/main.cpp index 035c7696..fbfaecde 100644 --- a/examples/widgets/widgets/imageviewer/main.cpp +++ b/examples/widgets/widgets/imageviewer/main.cpp @@ -63,7 +63,7 @@ int main(int argc, char *argv[]) commandLineParser.process(QCoreApplication::arguments()); ImageViewer imageViewer; if (!commandLineParser.positionalArguments().isEmpty() - && !imageViewer.loadFile(commandLineParser.positionalArguments().front())) { + && !imageViewer.loadFile(commandLineParser.positionalArguments().constFirst())) { return -1; } imageViewer.show(); diff --git a/include/QtAccessibilitySupport/5.15.3/QtAccessibilitySupport/private/qaccessiblebridgeutils_p.h b/include/QtAccessibilitySupport/5.15.8/QtAccessibilitySupport/private/qaccessiblebridgeutils_p.h similarity index 100% rename from include/QtAccessibilitySupport/5.15.3/QtAccessibilitySupport/private/qaccessiblebridgeutils_p.h rename to include/QtAccessibilitySupport/5.15.8/QtAccessibilitySupport/private/qaccessiblebridgeutils_p.h diff --git a/include/QtAccessibilitySupport/qtaccessibilitysupportversion.h b/include/QtAccessibilitySupport/qtaccessibilitysupportversion.h index 2bbbd4e5..dcdc2726 100644 --- a/include/QtAccessibilitySupport/qtaccessibilitysupportversion.h +++ b/include/QtAccessibilitySupport/qtaccessibilitysupportversion.h @@ -2,8 +2,8 @@ #ifndef QT_QTACCESSIBILITYSUPPORT_VERSION_H #define QT_QTACCESSIBILITYSUPPORT_VERSION_H -#define QTACCESSIBILITYSUPPORT_VERSION_STR "5.15.3" +#define QTACCESSIBILITYSUPPORT_VERSION_STR "5.15.8" -#define QTACCESSIBILITYSUPPORT_VERSION 0x050F03 +#define QTACCESSIBILITYSUPPORT_VERSION 0x050F08 #endif // QT_QTACCESSIBILITYSUPPORT_VERSION_H diff --git a/include/QtClipboardSupport/5.15.3/QtClipboardSupport/private/qmacmime_p.h b/include/QtClipboardSupport/5.15.8/QtClipboardSupport/private/qmacmime_p.h similarity index 100% rename from include/QtClipboardSupport/5.15.3/QtClipboardSupport/private/qmacmime_p.h rename to include/QtClipboardSupport/5.15.8/QtClipboardSupport/private/qmacmime_p.h diff --git a/include/QtClipboardSupport/qtclipboardsupportversion.h b/include/QtClipboardSupport/qtclipboardsupportversion.h index f84cad48..63394c20 100644 --- a/include/QtClipboardSupport/qtclipboardsupportversion.h +++ b/include/QtClipboardSupport/qtclipboardsupportversion.h @@ -2,8 +2,8 @@ #ifndef QT_QTCLIPBOARDSUPPORT_VERSION_H #define QT_QTCLIPBOARDSUPPORT_VERSION_H -#define QTCLIPBOARDSUPPORT_VERSION_STR "5.15.3" +#define QTCLIPBOARDSUPPORT_VERSION_STR "5.15.8" -#define QTCLIPBOARDSUPPORT_VERSION 0x050F03 +#define QTCLIPBOARDSUPPORT_VERSION 0x050F08 #endif // QT_QTCLIPBOARDSUPPORT_VERSION_H diff --git a/include/QtConcurrent/qtconcurrentversion.h b/include/QtConcurrent/qtconcurrentversion.h index a8597218..d50f3060 100644 --- a/include/QtConcurrent/qtconcurrentversion.h +++ b/include/QtConcurrent/qtconcurrentversion.h @@ -2,8 +2,8 @@ #ifndef QT_QTCONCURRENT_VERSION_H #define QT_QTCONCURRENT_VERSION_H -#define QTCONCURRENT_VERSION_STR "5.15.3" +#define QTCONCURRENT_VERSION_STR "5.15.8" -#define QTCONCURRENT_VERSION 0x050F03 +#define QTCONCURRENT_VERSION 0x050F08 #endif // QT_QTCONCURRENT_VERSION_H diff --git a/include/QtCore/5.15.3/QtCore/private/cp949codetbl_p.h b/include/QtCore/5.15.8/QtCore/private/cp949codetbl_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/cp949codetbl_p.h rename to include/QtCore/5.15.8/QtCore/private/cp949codetbl_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/minimum-linux_p.h b/include/QtCore/5.15.8/QtCore/private/minimum-linux_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/minimum-linux_p.h rename to include/QtCore/5.15.8/QtCore/private/minimum-linux_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qabstractanimation_p.h b/include/QtCore/5.15.8/QtCore/private/qabstractanimation_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qabstractanimation_p.h rename to include/QtCore/5.15.8/QtCore/private/qabstractanimation_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qabstracteventdispatcher_p.h b/include/QtCore/5.15.8/QtCore/private/qabstracteventdispatcher_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qabstracteventdispatcher_p.h rename to include/QtCore/5.15.8/QtCore/private/qabstracteventdispatcher_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qabstractfileengine_p.h b/include/QtCore/5.15.8/QtCore/private/qabstractfileengine_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qabstractfileengine_p.h rename to include/QtCore/5.15.8/QtCore/private/qabstractfileengine_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qabstractitemmodel_p.h b/include/QtCore/5.15.8/QtCore/private/qabstractitemmodel_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qabstractitemmodel_p.h rename to include/QtCore/5.15.8/QtCore/private/qabstractitemmodel_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qabstractproxymodel_p.h b/include/QtCore/5.15.8/QtCore/private/qabstractproxymodel_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qabstractproxymodel_p.h rename to include/QtCore/5.15.8/QtCore/private/qabstractproxymodel_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qabstractstate_p.h b/include/QtCore/5.15.8/QtCore/private/qabstractstate_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qabstractstate_p.h rename to include/QtCore/5.15.8/QtCore/private/qabstractstate_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qabstracttransition_p.h b/include/QtCore/5.15.8/QtCore/private/qabstracttransition_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qabstracttransition_p.h rename to include/QtCore/5.15.8/QtCore/private/qabstracttransition_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qanimationgroup_p.h b/include/QtCore/5.15.8/QtCore/private/qanimationgroup_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qanimationgroup_p.h rename to include/QtCore/5.15.8/QtCore/private/qanimationgroup_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qbig5codec_p.h b/include/QtCore/5.15.8/QtCore/private/qbig5codec_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qbig5codec_p.h rename to include/QtCore/5.15.8/QtCore/private/qbig5codec_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qbinaryjson_p.h b/include/QtCore/5.15.8/QtCore/private/qbinaryjson_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qbinaryjson_p.h rename to include/QtCore/5.15.8/QtCore/private/qbinaryjson_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qbinaryjsonarray_p.h b/include/QtCore/5.15.8/QtCore/private/qbinaryjsonarray_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qbinaryjsonarray_p.h rename to include/QtCore/5.15.8/QtCore/private/qbinaryjsonarray_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qbinaryjsonobject_p.h b/include/QtCore/5.15.8/QtCore/private/qbinaryjsonobject_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qbinaryjsonobject_p.h rename to include/QtCore/5.15.8/QtCore/private/qbinaryjsonobject_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qbinaryjsonvalue_p.h b/include/QtCore/5.15.8/QtCore/private/qbinaryjsonvalue_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qbinaryjsonvalue_p.h rename to include/QtCore/5.15.8/QtCore/private/qbinaryjsonvalue_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qbytearray_p.h b/include/QtCore/5.15.8/QtCore/private/qbytearray_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qbytearray_p.h rename to include/QtCore/5.15.8/QtCore/private/qbytearray_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qbytedata_p.h b/include/QtCore/5.15.8/QtCore/private/qbytedata_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qbytedata_p.h rename to include/QtCore/5.15.8/QtCore/private/qbytedata_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qcalendarbackend_p.h b/include/QtCore/5.15.8/QtCore/private/qcalendarbackend_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qcalendarbackend_p.h rename to include/QtCore/5.15.8/QtCore/private/qcalendarbackend_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qcalendarmath_p.h b/include/QtCore/5.15.8/QtCore/private/qcalendarmath_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qcalendarmath_p.h rename to include/QtCore/5.15.8/QtCore/private/qcalendarmath_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qcborcommon_p.h b/include/QtCore/5.15.8/QtCore/private/qcborcommon_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qcborcommon_p.h rename to include/QtCore/5.15.8/QtCore/private/qcborcommon_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qcborvalue_p.h b/include/QtCore/5.15.8/QtCore/private/qcborvalue_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qcborvalue_p.h rename to include/QtCore/5.15.8/QtCore/private/qcborvalue_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qcfsocketnotifier_p.h b/include/QtCore/5.15.8/QtCore/private/qcfsocketnotifier_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qcfsocketnotifier_p.h rename to include/QtCore/5.15.8/QtCore/private/qcfsocketnotifier_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qcollator_p.h b/include/QtCore/5.15.8/QtCore/private/qcollator_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qcollator_p.h rename to include/QtCore/5.15.8/QtCore/private/qcollator_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qcore_mac_p.h b/include/QtCore/5.15.8/QtCore/private/qcore_mac_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qcore_mac_p.h rename to include/QtCore/5.15.8/QtCore/private/qcore_mac_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qcore_unix_p.h b/include/QtCore/5.15.8/QtCore/private/qcore_unix_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qcore_unix_p.h rename to include/QtCore/5.15.8/QtCore/private/qcore_unix_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qcoreapplication_p.h b/include/QtCore/5.15.8/QtCore/private/qcoreapplication_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qcoreapplication_p.h rename to include/QtCore/5.15.8/QtCore/private/qcoreapplication_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qcorecmdlineargs_p.h b/include/QtCore/5.15.8/QtCore/private/qcorecmdlineargs_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qcorecmdlineargs_p.h rename to include/QtCore/5.15.8/QtCore/private/qcorecmdlineargs_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qcoreglobaldata_p.h b/include/QtCore/5.15.8/QtCore/private/qcoreglobaldata_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qcoreglobaldata_p.h rename to include/QtCore/5.15.8/QtCore/private/qcoreglobaldata_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qdatastream_p.h b/include/QtCore/5.15.8/QtCore/private/qdatastream_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qdatastream_p.h rename to include/QtCore/5.15.8/QtCore/private/qdatastream_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qdataurl_p.h b/include/QtCore/5.15.8/QtCore/private/qdataurl_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qdataurl_p.h rename to include/QtCore/5.15.8/QtCore/private/qdataurl_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qdatetime_p.h b/include/QtCore/5.15.8/QtCore/private/qdatetime_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qdatetime_p.h rename to include/QtCore/5.15.8/QtCore/private/qdatetime_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qdatetimeparser_p.h b/include/QtCore/5.15.8/QtCore/private/qdatetimeparser_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qdatetimeparser_p.h rename to include/QtCore/5.15.8/QtCore/private/qdatetimeparser_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qdeadlinetimer_p.h b/include/QtCore/5.15.8/QtCore/private/qdeadlinetimer_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qdeadlinetimer_p.h rename to include/QtCore/5.15.8/QtCore/private/qdeadlinetimer_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qdebug_p.h b/include/QtCore/5.15.8/QtCore/private/qdebug_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qdebug_p.h rename to include/QtCore/5.15.8/QtCore/private/qdebug_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qdir_p.h b/include/QtCore/5.15.8/QtCore/private/qdir_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qdir_p.h rename to include/QtCore/5.15.8/QtCore/private/qdir_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qdoublescanprint_p.h b/include/QtCore/5.15.8/QtCore/private/qdoublescanprint_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qdoublescanprint_p.h rename to include/QtCore/5.15.8/QtCore/private/qdoublescanprint_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qduplicatetracker_p.h b/include/QtCore/5.15.8/QtCore/private/qduplicatetracker_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qduplicatetracker_p.h rename to include/QtCore/5.15.8/QtCore/private/qduplicatetracker_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qelfparser_p.h b/include/QtCore/5.15.8/QtCore/private/qelfparser_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qelfparser_p.h rename to include/QtCore/5.15.8/QtCore/private/qelfparser_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qendian_p.h b/include/QtCore/5.15.8/QtCore/private/qendian_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qendian_p.h rename to include/QtCore/5.15.8/QtCore/private/qendian_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qeucjpcodec_p.h b/include/QtCore/5.15.8/QtCore/private/qeucjpcodec_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qeucjpcodec_p.h rename to include/QtCore/5.15.8/QtCore/private/qeucjpcodec_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qeuckrcodec_p.h b/include/QtCore/5.15.8/QtCore/private/qeuckrcodec_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qeuckrcodec_p.h rename to include/QtCore/5.15.8/QtCore/private/qeuckrcodec_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qeventdispatcher_cf_p.h b/include/QtCore/5.15.8/QtCore/private/qeventdispatcher_cf_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qeventdispatcher_cf_p.h rename to include/QtCore/5.15.8/QtCore/private/qeventdispatcher_cf_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qeventdispatcher_glib_p.h b/include/QtCore/5.15.8/QtCore/private/qeventdispatcher_glib_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qeventdispatcher_glib_p.h rename to include/QtCore/5.15.8/QtCore/private/qeventdispatcher_glib_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qeventdispatcher_unix_p.h b/include/QtCore/5.15.8/QtCore/private/qeventdispatcher_unix_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qeventdispatcher_unix_p.h rename to include/QtCore/5.15.8/QtCore/private/qeventdispatcher_unix_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qeventdispatcher_win_p.h b/include/QtCore/5.15.8/QtCore/private/qeventdispatcher_win_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qeventdispatcher_win_p.h rename to include/QtCore/5.15.8/QtCore/private/qeventdispatcher_win_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qeventdispatcher_winrt_p.h b/include/QtCore/5.15.8/QtCore/private/qeventdispatcher_winrt_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qeventdispatcher_winrt_p.h rename to include/QtCore/5.15.8/QtCore/private/qeventdispatcher_winrt_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qeventloop_p.h b/include/QtCore/5.15.8/QtCore/private/qeventloop_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qeventloop_p.h rename to include/QtCore/5.15.8/QtCore/private/qeventloop_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qeventtransition_p.h b/include/QtCore/5.15.8/QtCore/private/qeventtransition_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qeventtransition_p.h rename to include/QtCore/5.15.8/QtCore/private/qeventtransition_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qfactoryloader_p.h b/include/QtCore/5.15.8/QtCore/private/qfactoryloader_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qfactoryloader_p.h rename to include/QtCore/5.15.8/QtCore/private/qfactoryloader_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qfile_p.h b/include/QtCore/5.15.8/QtCore/private/qfile_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qfile_p.h rename to include/QtCore/5.15.8/QtCore/private/qfile_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qfiledevice_p.h b/include/QtCore/5.15.8/QtCore/private/qfiledevice_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qfiledevice_p.h rename to include/QtCore/5.15.8/QtCore/private/qfiledevice_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qfileinfo_p.h b/include/QtCore/5.15.8/QtCore/private/qfileinfo_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qfileinfo_p.h rename to include/QtCore/5.15.8/QtCore/private/qfileinfo_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qfileselector_p.h b/include/QtCore/5.15.8/QtCore/private/qfileselector_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qfileselector_p.h rename to include/QtCore/5.15.8/QtCore/private/qfileselector_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qfilesystemengine_p.h b/include/QtCore/5.15.8/QtCore/private/qfilesystemengine_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qfilesystemengine_p.h rename to include/QtCore/5.15.8/QtCore/private/qfilesystemengine_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qfilesystementry_p.h b/include/QtCore/5.15.8/QtCore/private/qfilesystementry_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qfilesystementry_p.h rename to include/QtCore/5.15.8/QtCore/private/qfilesystementry_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qfilesystemiterator_p.h b/include/QtCore/5.15.8/QtCore/private/qfilesystemiterator_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qfilesystemiterator_p.h rename to include/QtCore/5.15.8/QtCore/private/qfilesystemiterator_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qfilesystemmetadata_p.h b/include/QtCore/5.15.8/QtCore/private/qfilesystemmetadata_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qfilesystemmetadata_p.h rename to include/QtCore/5.15.8/QtCore/private/qfilesystemmetadata_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qfilesystemwatcher_fsevents_p.h b/include/QtCore/5.15.8/QtCore/private/qfilesystemwatcher_fsevents_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qfilesystemwatcher_fsevents_p.h rename to include/QtCore/5.15.8/QtCore/private/qfilesystemwatcher_fsevents_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qfilesystemwatcher_inotify_p.h b/include/QtCore/5.15.8/QtCore/private/qfilesystemwatcher_inotify_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qfilesystemwatcher_inotify_p.h rename to include/QtCore/5.15.8/QtCore/private/qfilesystemwatcher_inotify_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qfilesystemwatcher_kqueue_p.h b/include/QtCore/5.15.8/QtCore/private/qfilesystemwatcher_kqueue_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qfilesystemwatcher_kqueue_p.h rename to include/QtCore/5.15.8/QtCore/private/qfilesystemwatcher_kqueue_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qfilesystemwatcher_p.h b/include/QtCore/5.15.8/QtCore/private/qfilesystemwatcher_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qfilesystemwatcher_p.h rename to include/QtCore/5.15.8/QtCore/private/qfilesystemwatcher_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qfilesystemwatcher_polling_p.h b/include/QtCore/5.15.8/QtCore/private/qfilesystemwatcher_polling_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qfilesystemwatcher_polling_p.h rename to include/QtCore/5.15.8/QtCore/private/qfilesystemwatcher_polling_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qfilesystemwatcher_win_p.h b/include/QtCore/5.15.8/QtCore/private/qfilesystemwatcher_win_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qfilesystemwatcher_win_p.h rename to include/QtCore/5.15.8/QtCore/private/qfilesystemwatcher_win_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qfinalstate_p.h b/include/QtCore/5.15.8/QtCore/private/qfinalstate_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qfinalstate_p.h rename to include/QtCore/5.15.8/QtCore/private/qfinalstate_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qfreelist_p.h b/include/QtCore/5.15.8/QtCore/private/qfreelist_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qfreelist_p.h rename to include/QtCore/5.15.8/QtCore/private/qfreelist_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qfsfileengine_iterator_p.h b/include/QtCore/5.15.8/QtCore/private/qfsfileengine_iterator_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qfsfileengine_iterator_p.h rename to include/QtCore/5.15.8/QtCore/private/qfsfileengine_iterator_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qfsfileengine_p.h b/include/QtCore/5.15.8/QtCore/private/qfsfileengine_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qfsfileengine_p.h rename to include/QtCore/5.15.8/QtCore/private/qfsfileengine_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qfunctions_fake_env_p.h b/include/QtCore/5.15.8/QtCore/private/qfunctions_fake_env_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qfunctions_fake_env_p.h rename to include/QtCore/5.15.8/QtCore/private/qfunctions_fake_env_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qfunctions_p.h b/include/QtCore/5.15.8/QtCore/private/qfunctions_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qfunctions_p.h rename to include/QtCore/5.15.8/QtCore/private/qfunctions_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qfutex_p.h b/include/QtCore/5.15.8/QtCore/private/qfutex_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qfutex_p.h rename to include/QtCore/5.15.8/QtCore/private/qfutex_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qfutureinterface_p.h b/include/QtCore/5.15.8/QtCore/private/qfutureinterface_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qfutureinterface_p.h rename to include/QtCore/5.15.8/QtCore/private/qfutureinterface_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qfuturewatcher_p.h b/include/QtCore/5.15.8/QtCore/private/qfuturewatcher_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qfuturewatcher_p.h rename to include/QtCore/5.15.8/QtCore/private/qfuturewatcher_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qgb18030codec_p.h b/include/QtCore/5.15.8/QtCore/private/qgb18030codec_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qgb18030codec_p.h rename to include/QtCore/5.15.8/QtCore/private/qgb18030codec_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qglobal_p.h b/include/QtCore/5.15.8/QtCore/private/qglobal_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qglobal_p.h rename to include/QtCore/5.15.8/QtCore/private/qglobal_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qgregoriancalendar_p.h b/include/QtCore/5.15.8/QtCore/private/qgregoriancalendar_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qgregoriancalendar_p.h rename to include/QtCore/5.15.8/QtCore/private/qgregoriancalendar_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qharfbuzz_p.h b/include/QtCore/5.15.8/QtCore/private/qharfbuzz_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qharfbuzz_p.h rename to include/QtCore/5.15.8/QtCore/private/qharfbuzz_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qhijricalendar_data_p.h b/include/QtCore/5.15.8/QtCore/private/qhijricalendar_data_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qhijricalendar_data_p.h rename to include/QtCore/5.15.8/QtCore/private/qhijricalendar_data_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qhijricalendar_p.h b/include/QtCore/5.15.8/QtCore/private/qhijricalendar_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qhijricalendar_p.h rename to include/QtCore/5.15.8/QtCore/private/qhijricalendar_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qhistorystate_p.h b/include/QtCore/5.15.8/QtCore/private/qhistorystate_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qhistorystate_p.h rename to include/QtCore/5.15.8/QtCore/private/qhistorystate_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qhooks_p.h b/include/QtCore/5.15.8/QtCore/private/qhooks_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qhooks_p.h rename to include/QtCore/5.15.8/QtCore/private/qhooks_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qiconvcodec_p.h b/include/QtCore/5.15.8/QtCore/private/qiconvcodec_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qiconvcodec_p.h rename to include/QtCore/5.15.8/QtCore/private/qiconvcodec_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qicucodec_p.h b/include/QtCore/5.15.8/QtCore/private/qicucodec_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qicucodec_p.h rename to include/QtCore/5.15.8/QtCore/private/qicucodec_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qiodevice_p.h b/include/QtCore/5.15.8/QtCore/private/qiodevice_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qiodevice_p.h rename to include/QtCore/5.15.8/QtCore/private/qiodevice_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qipaddress_p.h b/include/QtCore/5.15.8/QtCore/private/qipaddress_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qipaddress_p.h rename to include/QtCore/5.15.8/QtCore/private/qipaddress_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qisciicodec_p.h b/include/QtCore/5.15.8/QtCore/private/qisciicodec_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qisciicodec_p.h rename to include/QtCore/5.15.8/QtCore/private/qisciicodec_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qislamiccivilcalendar_p.h b/include/QtCore/5.15.8/QtCore/private/qislamiccivilcalendar_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qislamiccivilcalendar_p.h rename to include/QtCore/5.15.8/QtCore/private/qislamiccivilcalendar_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qitemselectionmodel_p.h b/include/QtCore/5.15.8/QtCore/private/qitemselectionmodel_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qitemselectionmodel_p.h rename to include/QtCore/5.15.8/QtCore/private/qitemselectionmodel_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qjalalicalendar_data_p.h b/include/QtCore/5.15.8/QtCore/private/qjalalicalendar_data_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qjalalicalendar_data_p.h rename to include/QtCore/5.15.8/QtCore/private/qjalalicalendar_data_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qjalalicalendar_p.h b/include/QtCore/5.15.8/QtCore/private/qjalalicalendar_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qjalalicalendar_p.h rename to include/QtCore/5.15.8/QtCore/private/qjalalicalendar_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qjiscodec_p.h b/include/QtCore/5.15.8/QtCore/private/qjiscodec_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qjiscodec_p.h rename to include/QtCore/5.15.8/QtCore/private/qjiscodec_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qjni_p.h b/include/QtCore/5.15.8/QtCore/private/qjni_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qjni_p.h rename to include/QtCore/5.15.8/QtCore/private/qjni_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qjnihelpers_p.h b/include/QtCore/5.15.8/QtCore/private/qjnihelpers_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qjnihelpers_p.h rename to include/QtCore/5.15.8/QtCore/private/qjnihelpers_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qjpunicode_p.h b/include/QtCore/5.15.8/QtCore/private/qjpunicode_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qjpunicode_p.h rename to include/QtCore/5.15.8/QtCore/private/qjpunicode_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qjson_p.h b/include/QtCore/5.15.8/QtCore/private/qjson_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qjson_p.h rename to include/QtCore/5.15.8/QtCore/private/qjson_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qjsonparser_p.h b/include/QtCore/5.15.8/QtCore/private/qjsonparser_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qjsonparser_p.h rename to include/QtCore/5.15.8/QtCore/private/qjsonparser_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qjsonwriter_p.h b/include/QtCore/5.15.8/QtCore/private/qjsonwriter_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qjsonwriter_p.h rename to include/QtCore/5.15.8/QtCore/private/qjsonwriter_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qjuliancalendar_p.h b/include/QtCore/5.15.8/QtCore/private/qjuliancalendar_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qjuliancalendar_p.h rename to include/QtCore/5.15.8/QtCore/private/qjuliancalendar_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qlatincodec_p.h b/include/QtCore/5.15.8/QtCore/private/qlatincodec_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qlatincodec_p.h rename to include/QtCore/5.15.8/QtCore/private/qlatincodec_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qlibrary_p.h b/include/QtCore/5.15.8/QtCore/private/qlibrary_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qlibrary_p.h rename to include/QtCore/5.15.8/QtCore/private/qlibrary_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qlocale_data_p.h b/include/QtCore/5.15.8/QtCore/private/qlocale_data_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qlocale_data_p.h rename to include/QtCore/5.15.8/QtCore/private/qlocale_data_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qlocale_p.h b/include/QtCore/5.15.8/QtCore/private/qlocale_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qlocale_p.h rename to include/QtCore/5.15.8/QtCore/private/qlocale_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qlocale_tools_p.h b/include/QtCore/5.15.8/QtCore/private/qlocale_tools_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qlocale_tools_p.h rename to include/QtCore/5.15.8/QtCore/private/qlocale_tools_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qlockfile_p.h b/include/QtCore/5.15.8/QtCore/private/qlockfile_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qlockfile_p.h rename to include/QtCore/5.15.8/QtCore/private/qlockfile_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qlocking_p.h b/include/QtCore/5.15.8/QtCore/private/qlocking_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qlocking_p.h rename to include/QtCore/5.15.8/QtCore/private/qlocking_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qlogging_p.h b/include/QtCore/5.15.8/QtCore/private/qlogging_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qlogging_p.h rename to include/QtCore/5.15.8/QtCore/private/qlogging_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qloggingregistry_p.h b/include/QtCore/5.15.8/QtCore/private/qloggingregistry_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qloggingregistry_p.h rename to include/QtCore/5.15.8/QtCore/private/qloggingregistry_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qmachparser_p.h b/include/QtCore/5.15.8/QtCore/private/qmachparser_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qmachparser_p.h rename to include/QtCore/5.15.8/QtCore/private/qmachparser_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qmakearray_p.h b/include/QtCore/5.15.8/QtCore/private/qmakearray_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qmakearray_p.h rename to include/QtCore/5.15.8/QtCore/private/qmakearray_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qmemory_p.h b/include/QtCore/5.15.8/QtCore/private/qmemory_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qmemory_p.h rename to include/QtCore/5.15.8/QtCore/private/qmemory_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qmetaobject_moc_p.h b/include/QtCore/5.15.8/QtCore/private/qmetaobject_moc_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qmetaobject_moc_p.h rename to include/QtCore/5.15.8/QtCore/private/qmetaobject_moc_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qmetaobject_p.h b/include/QtCore/5.15.8/QtCore/private/qmetaobject_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qmetaobject_p.h rename to include/QtCore/5.15.8/QtCore/private/qmetaobject_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qmetaobjectbuilder_p.h b/include/QtCore/5.15.8/QtCore/private/qmetaobjectbuilder_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qmetaobjectbuilder_p.h rename to include/QtCore/5.15.8/QtCore/private/qmetaobjectbuilder_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qmetatype_p.h b/include/QtCore/5.15.8/QtCore/private/qmetatype_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qmetatype_p.h rename to include/QtCore/5.15.8/QtCore/private/qmetatype_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qmetatypeswitcher_p.h b/include/QtCore/5.15.8/QtCore/private/qmetatypeswitcher_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qmetatypeswitcher_p.h rename to include/QtCore/5.15.8/QtCore/private/qmetatypeswitcher_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qmilankoviccalendar_p.h b/include/QtCore/5.15.8/QtCore/private/qmilankoviccalendar_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qmilankoviccalendar_p.h rename to include/QtCore/5.15.8/QtCore/private/qmilankoviccalendar_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qmimedatabase_p.h b/include/QtCore/5.15.8/QtCore/private/qmimedatabase_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qmimedatabase_p.h rename to include/QtCore/5.15.8/QtCore/private/qmimedatabase_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qmimeglobpattern_p.h b/include/QtCore/5.15.8/QtCore/private/qmimeglobpattern_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qmimeglobpattern_p.h rename to include/QtCore/5.15.8/QtCore/private/qmimeglobpattern_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qmimemagicrule_p.h b/include/QtCore/5.15.8/QtCore/private/qmimemagicrule_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qmimemagicrule_p.h rename to include/QtCore/5.15.8/QtCore/private/qmimemagicrule_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qmimemagicrulematcher_p.h b/include/QtCore/5.15.8/QtCore/private/qmimemagicrulematcher_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qmimemagicrulematcher_p.h rename to include/QtCore/5.15.8/QtCore/private/qmimemagicrulematcher_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qmimeprovider_p.h b/include/QtCore/5.15.8/QtCore/private/qmimeprovider_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qmimeprovider_p.h rename to include/QtCore/5.15.8/QtCore/private/qmimeprovider_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qmimetype_p.h b/include/QtCore/5.15.8/QtCore/private/qmimetype_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qmimetype_p.h rename to include/QtCore/5.15.8/QtCore/private/qmimetype_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qmimetypeparser_p.h b/include/QtCore/5.15.8/QtCore/private/qmimetypeparser_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qmimetypeparser_p.h rename to include/QtCore/5.15.8/QtCore/private/qmimetypeparser_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qmutex_p.h b/include/QtCore/5.15.8/QtCore/private/qmutex_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qmutex_p.h rename to include/QtCore/5.15.8/QtCore/private/qmutex_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qnoncontiguousbytedevice_p.h b/include/QtCore/5.15.8/QtCore/private/qnoncontiguousbytedevice_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qnoncontiguousbytedevice_p.h rename to include/QtCore/5.15.8/QtCore/private/qnoncontiguousbytedevice_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qnumeric_p.h b/include/QtCore/5.15.8/QtCore/private/qnumeric_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qnumeric_p.h rename to include/QtCore/5.15.8/QtCore/private/qnumeric_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qobject_p.h b/include/QtCore/5.15.8/QtCore/private/qobject_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qobject_p.h rename to include/QtCore/5.15.8/QtCore/private/qobject_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qoffsetstringarray_p.h b/include/QtCore/5.15.8/QtCore/private/qoffsetstringarray_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qoffsetstringarray_p.h rename to include/QtCore/5.15.8/QtCore/private/qoffsetstringarray_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qoperatingsystemversion_p.h b/include/QtCore/5.15.8/QtCore/private/qoperatingsystemversion_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qoperatingsystemversion_p.h rename to include/QtCore/5.15.8/QtCore/private/qoperatingsystemversion_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qoperatingsystemversion_win_p.h b/include/QtCore/5.15.8/QtCore/private/qoperatingsystemversion_win_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qoperatingsystemversion_win_p.h rename to include/QtCore/5.15.8/QtCore/private/qoperatingsystemversion_win_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qorderedmutexlocker_p.h b/include/QtCore/5.15.8/QtCore/private/qorderedmutexlocker_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qorderedmutexlocker_p.h rename to include/QtCore/5.15.8/QtCore/private/qorderedmutexlocker_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qparallelanimationgroup_p.h b/include/QtCore/5.15.8/QtCore/private/qparallelanimationgroup_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qparallelanimationgroup_p.h rename to include/QtCore/5.15.8/QtCore/private/qparallelanimationgroup_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qplugin_p.h b/include/QtCore/5.15.8/QtCore/private/qplugin_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qplugin_p.h rename to include/QtCore/5.15.8/QtCore/private/qplugin_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qpoll_p.h b/include/QtCore/5.15.8/QtCore/private/qpoll_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qpoll_p.h rename to include/QtCore/5.15.8/QtCore/private/qpoll_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qppsattribute_p.h b/include/QtCore/5.15.8/QtCore/private/qppsattribute_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qppsattribute_p.h rename to include/QtCore/5.15.8/QtCore/private/qppsattribute_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qppsattributeprivate_p.h b/include/QtCore/5.15.8/QtCore/private/qppsattributeprivate_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qppsattributeprivate_p.h rename to include/QtCore/5.15.8/QtCore/private/qppsattributeprivate_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qppsobject_p.h b/include/QtCore/5.15.8/QtCore/private/qppsobject_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qppsobject_p.h rename to include/QtCore/5.15.8/QtCore/private/qppsobject_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qppsobjectprivate_p.h b/include/QtCore/5.15.8/QtCore/private/qppsobjectprivate_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qppsobjectprivate_p.h rename to include/QtCore/5.15.8/QtCore/private/qppsobjectprivate_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qprocess_p.h b/include/QtCore/5.15.8/QtCore/private/qprocess_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qprocess_p.h rename to include/QtCore/5.15.8/QtCore/private/qprocess_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qpropertyanimation_p.h b/include/QtCore/5.15.8/QtCore/private/qpropertyanimation_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qpropertyanimation_p.h rename to include/QtCore/5.15.8/QtCore/private/qpropertyanimation_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qrandom_p.h b/include/QtCore/5.15.8/QtCore/private/qrandom_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qrandom_p.h rename to include/QtCore/5.15.8/QtCore/private/qrandom_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qreadwritelock_p.h b/include/QtCore/5.15.8/QtCore/private/qreadwritelock_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qreadwritelock_p.h rename to include/QtCore/5.15.8/QtCore/private/qreadwritelock_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qresource_iterator_p.h b/include/QtCore/5.15.8/QtCore/private/qresource_iterator_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qresource_iterator_p.h rename to include/QtCore/5.15.8/QtCore/private/qresource_iterator_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qresource_p.h b/include/QtCore/5.15.8/QtCore/private/qresource_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qresource_p.h rename to include/QtCore/5.15.8/QtCore/private/qresource_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qringbuffer_p.h b/include/QtCore/5.15.8/QtCore/private/qringbuffer_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qringbuffer_p.h rename to include/QtCore/5.15.8/QtCore/private/qringbuffer_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qromancalendar_data_p.h b/include/QtCore/5.15.8/QtCore/private/qromancalendar_data_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qromancalendar_data_p.h rename to include/QtCore/5.15.8/QtCore/private/qromancalendar_data_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qromancalendar_p.h b/include/QtCore/5.15.8/QtCore/private/qromancalendar_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qromancalendar_p.h rename to include/QtCore/5.15.8/QtCore/private/qromancalendar_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qsavefile_p.h b/include/QtCore/5.15.8/QtCore/private/qsavefile_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qsavefile_p.h rename to include/QtCore/5.15.8/QtCore/private/qsavefile_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qscopedpointer_p.h b/include/QtCore/5.15.8/QtCore/private/qscopedpointer_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qscopedpointer_p.h rename to include/QtCore/5.15.8/QtCore/private/qscopedpointer_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qsequentialanimationgroup_p.h b/include/QtCore/5.15.8/QtCore/private/qsequentialanimationgroup_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qsequentialanimationgroup_p.h rename to include/QtCore/5.15.8/QtCore/private/qsequentialanimationgroup_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qsettings_p.h b/include/QtCore/5.15.8/QtCore/private/qsettings_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qsettings_p.h rename to include/QtCore/5.15.8/QtCore/private/qsettings_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qsharedmemory_p.h b/include/QtCore/5.15.8/QtCore/private/qsharedmemory_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qsharedmemory_p.h rename to include/QtCore/5.15.8/QtCore/private/qsharedmemory_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qsignaleventgenerator_p.h b/include/QtCore/5.15.8/QtCore/private/qsignaleventgenerator_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qsignaleventgenerator_p.h rename to include/QtCore/5.15.8/QtCore/private/qsignaleventgenerator_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qsignaltransition_p.h b/include/QtCore/5.15.8/QtCore/private/qsignaltransition_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qsignaltransition_p.h rename to include/QtCore/5.15.8/QtCore/private/qsignaltransition_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qsimd_p.h b/include/QtCore/5.15.8/QtCore/private/qsimd_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qsimd_p.h rename to include/QtCore/5.15.8/QtCore/private/qsimd_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qsimd_x86_p.h b/include/QtCore/5.15.8/QtCore/private/qsimd_x86_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qsimd_x86_p.h rename to include/QtCore/5.15.8/QtCore/private/qsimd_x86_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qsimplecodec_p.h b/include/QtCore/5.15.8/QtCore/private/qsimplecodec_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qsimplecodec_p.h rename to include/QtCore/5.15.8/QtCore/private/qsimplecodec_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qsjiscodec_p.h b/include/QtCore/5.15.8/QtCore/private/qsjiscodec_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qsjiscodec_p.h rename to include/QtCore/5.15.8/QtCore/private/qsjiscodec_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qstate_p.h b/include/QtCore/5.15.8/QtCore/private/qstate_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qstate_p.h rename to include/QtCore/5.15.8/QtCore/private/qstate_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qstatemachine_p.h b/include/QtCore/5.15.8/QtCore/private/qstatemachine_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qstatemachine_p.h rename to include/QtCore/5.15.8/QtCore/private/qstatemachine_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qstdweb_p.h b/include/QtCore/5.15.8/QtCore/private/qstdweb_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qstdweb_p.h rename to include/QtCore/5.15.8/QtCore/private/qstdweb_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qstorageinfo_p.h b/include/QtCore/5.15.8/QtCore/private/qstorageinfo_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qstorageinfo_p.h rename to include/QtCore/5.15.8/QtCore/private/qstorageinfo_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qstringalgorithms_p.h b/include/QtCore/5.15.8/QtCore/private/qstringalgorithms_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qstringalgorithms_p.h rename to include/QtCore/5.15.8/QtCore/private/qstringalgorithms_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qstringiterator_p.h b/include/QtCore/5.15.8/QtCore/private/qstringiterator_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qstringiterator_p.h rename to include/QtCore/5.15.8/QtCore/private/qstringiterator_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qsystemerror_p.h b/include/QtCore/5.15.8/QtCore/private/qsystemerror_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qsystemerror_p.h rename to include/QtCore/5.15.8/QtCore/private/qsystemerror_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qsystemlibrary_p.h b/include/QtCore/5.15.8/QtCore/private/qsystemlibrary_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qsystemlibrary_p.h rename to include/QtCore/5.15.8/QtCore/private/qsystemlibrary_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qsystemsemaphore_p.h b/include/QtCore/5.15.8/QtCore/private/qsystemsemaphore_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qsystemsemaphore_p.h rename to include/QtCore/5.15.8/QtCore/private/qsystemsemaphore_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qt_pch.h b/include/QtCore/5.15.8/QtCore/private/qt_pch.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qt_pch.h rename to include/QtCore/5.15.8/QtCore/private/qt_pch.h diff --git a/include/QtCore/5.15.3/QtCore/private/qtemporaryfile_p.h b/include/QtCore/5.15.8/QtCore/private/qtemporaryfile_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qtemporaryfile_p.h rename to include/QtCore/5.15.8/QtCore/private/qtemporaryfile_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qtextcodec_p.h b/include/QtCore/5.15.8/QtCore/private/qtextcodec_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qtextcodec_p.h rename to include/QtCore/5.15.8/QtCore/private/qtextcodec_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qtextstream_p.h b/include/QtCore/5.15.8/QtCore/private/qtextstream_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qtextstream_p.h rename to include/QtCore/5.15.8/QtCore/private/qtextstream_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qthread_p.h b/include/QtCore/5.15.8/QtCore/private/qthread_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qthread_p.h rename to include/QtCore/5.15.8/QtCore/private/qthread_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qthreadpool_p.h b/include/QtCore/5.15.8/QtCore/private/qthreadpool_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qthreadpool_p.h rename to include/QtCore/5.15.8/QtCore/private/qthreadpool_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qtimerinfo_unix_p.h b/include/QtCore/5.15.8/QtCore/private/qtimerinfo_unix_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qtimerinfo_unix_p.h rename to include/QtCore/5.15.8/QtCore/private/qtimerinfo_unix_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qtimezoneprivate_data_p.h b/include/QtCore/5.15.8/QtCore/private/qtimezoneprivate_data_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qtimezoneprivate_data_p.h rename to include/QtCore/5.15.8/QtCore/private/qtimezoneprivate_data_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qtimezoneprivate_p.h b/include/QtCore/5.15.8/QtCore/private/qtimezoneprivate_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qtimezoneprivate_p.h rename to include/QtCore/5.15.8/QtCore/private/qtimezoneprivate_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qtldurl_p.h b/include/QtCore/5.15.8/QtCore/private/qtldurl_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qtldurl_p.h rename to include/QtCore/5.15.8/QtCore/private/qtldurl_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qtools_p.h b/include/QtCore/5.15.8/QtCore/private/qtools_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qtools_p.h rename to include/QtCore/5.15.8/QtCore/private/qtools_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qtrace_p.h b/include/QtCore/5.15.8/QtCore/private/qtrace_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qtrace_p.h rename to include/QtCore/5.15.8/QtCore/private/qtrace_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qtranslator_p.h b/include/QtCore/5.15.8/QtCore/private/qtranslator_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qtranslator_p.h rename to include/QtCore/5.15.8/QtCore/private/qtranslator_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qtransposeproxymodel_p.h b/include/QtCore/5.15.8/QtCore/private/qtransposeproxymodel_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qtransposeproxymodel_p.h rename to include/QtCore/5.15.8/QtCore/private/qtransposeproxymodel_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qtsciicodec_p.h b/include/QtCore/5.15.8/QtCore/private/qtsciicodec_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qtsciicodec_p.h rename to include/QtCore/5.15.8/QtCore/private/qtsciicodec_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qunicodetables_p.h b/include/QtCore/5.15.8/QtCore/private/qunicodetables_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qunicodetables_p.h rename to include/QtCore/5.15.8/QtCore/private/qunicodetables_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qunicodetools_p.h b/include/QtCore/5.15.8/QtCore/private/qunicodetools_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qunicodetools_p.h rename to include/QtCore/5.15.8/QtCore/private/qunicodetools_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qurl_p.h b/include/QtCore/5.15.8/QtCore/private/qurl_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qurl_p.h rename to include/QtCore/5.15.8/QtCore/private/qurl_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qurltlds_p.h b/include/QtCore/5.15.8/QtCore/private/qurltlds_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qurltlds_p.h rename to include/QtCore/5.15.8/QtCore/private/qurltlds_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qutfcodec_p.h b/include/QtCore/5.15.8/QtCore/private/qutfcodec_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qutfcodec_p.h rename to include/QtCore/5.15.8/QtCore/private/qutfcodec_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qvariant_p.h b/include/QtCore/5.15.8/QtCore/private/qvariant_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qvariant_p.h rename to include/QtCore/5.15.8/QtCore/private/qvariant_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qvariantanimation_p.h b/include/QtCore/5.15.8/QtCore/private/qvariantanimation_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qvariantanimation_p.h rename to include/QtCore/5.15.8/QtCore/private/qvariantanimation_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qwaitcondition_p.h b/include/QtCore/5.15.8/QtCore/private/qwaitcondition_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qwaitcondition_p.h rename to include/QtCore/5.15.8/QtCore/private/qwaitcondition_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qwindowscodec_p.h b/include/QtCore/5.15.8/QtCore/private/qwindowscodec_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qwindowscodec_p.h rename to include/QtCore/5.15.8/QtCore/private/qwindowscodec_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qwindowspipereader_p.h b/include/QtCore/5.15.8/QtCore/private/qwindowspipereader_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qwindowspipereader_p.h rename to include/QtCore/5.15.8/QtCore/private/qwindowspipereader_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qwindowspipewriter_p.h b/include/QtCore/5.15.8/QtCore/private/qwindowspipewriter_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qwindowspipewriter_p.h rename to include/QtCore/5.15.8/QtCore/private/qwindowspipewriter_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qwineventnotifier_p.h b/include/QtCore/5.15.8/QtCore/private/qwineventnotifier_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qwineventnotifier_p.h rename to include/QtCore/5.15.8/QtCore/private/qwineventnotifier_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qwinregistry_p.h b/include/QtCore/5.15.8/QtCore/private/qwinregistry_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qwinregistry_p.h rename to include/QtCore/5.15.8/QtCore/private/qwinregistry_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qxmlstream_p.h b/include/QtCore/5.15.8/QtCore/private/qxmlstream_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qxmlstream_p.h rename to include/QtCore/5.15.8/QtCore/private/qxmlstream_p.h diff --git a/include/QtCore/5.15.3/QtCore/private/qxmlutils_p.h b/include/QtCore/5.15.8/QtCore/private/qxmlutils_p.h similarity index 100% rename from include/QtCore/5.15.3/QtCore/private/qxmlutils_p.h rename to include/QtCore/5.15.8/QtCore/private/qxmlutils_p.h diff --git a/include/QtCore/headers.pri b/include/QtCore/headers.pri index 066a8127..e8818bd4 100644 --- a/include/QtCore/headers.pri +++ b/include/QtCore/headers.pri @@ -3,4 +3,4 @@ SYNCQT.GENERATED_HEADER_FILES = QAbstractAnimation QAnimationDriver QAnimationGr SYNCQT.PRIVATE_HEADER_FILES = animation/qabstractanimation_p.h animation/qanimationgroup_p.h animation/qparallelanimationgroup_p.h animation/qpropertyanimation_p.h animation/qsequentialanimationgroup_p.h animation/qvariantanimation_p.h codecs/cp949codetbl_p.h codecs/qbig5codec_p.h codecs/qeucjpcodec_p.h codecs/qeuckrcodec_p.h codecs/qgb18030codec_p.h codecs/qiconvcodec_p.h codecs/qicucodec_p.h codecs/qisciicodec_p.h codecs/qjiscodec_p.h codecs/qjpunicode_p.h codecs/qlatincodec_p.h codecs/qsimplecodec_p.h codecs/qsjiscodec_p.h codecs/qtextcodec_p.h codecs/qtsciicodec_p.h codecs/qutfcodec_p.h codecs/qwindowscodec_p.h global/minimum-linux_p.h global/qendian_p.h global/qglobal_p.h global/qhooks_p.h global/qlogging_p.h global/qmemory_p.h global/qnumeric_p.h global/qoperatingsystemversion_p.h global/qoperatingsystemversion_win_p.h global/qrandom_p.h global/qt_pch.h global/qtrace_p.h io/qabstractfileengine_p.h io/qdataurl_p.h io/qdebug_p.h io/qdir_p.h io/qfile_p.h io/qfiledevice_p.h io/qfileinfo_p.h io/qfileselector_p.h io/qfilesystemengine_p.h io/qfilesystementry_p.h io/qfilesystemiterator_p.h io/qfilesystemmetadata_p.h io/qfilesystemwatcher_fsevents_p.h io/qfilesystemwatcher_inotify_p.h io/qfilesystemwatcher_kqueue_p.h io/qfilesystemwatcher_p.h io/qfilesystemwatcher_polling_p.h io/qfilesystemwatcher_win_p.h io/qfsfileengine_iterator_p.h io/qfsfileengine_p.h io/qiodevice_p.h io/qipaddress_p.h io/qlockfile_p.h io/qloggingregistry_p.h io/qnoncontiguousbytedevice_p.h io/qprocess_p.h io/qresource_iterator_p.h io/qresource_p.h io/qsavefile_p.h io/qsettings_p.h io/qstorageinfo_p.h io/qtemporaryfile_p.h io/qtldurl_p.h io/qurl_p.h io/qurltlds_p.h io/qwindowspipereader_p.h io/qwindowspipewriter_p.h itemmodels/qabstractitemmodel_p.h itemmodels/qabstractproxymodel_p.h itemmodels/qitemselectionmodel_p.h itemmodels/qtransposeproxymodel_p.h kernel/qabstracteventdispatcher_p.h kernel/qcfsocketnotifier_p.h kernel/qcore_mac_p.h kernel/qcore_unix_p.h kernel/qcoreapplication_p.h kernel/qcorecmdlineargs_p.h kernel/qcoreglobaldata_p.h kernel/qdeadlinetimer_p.h kernel/qeventdispatcher_cf_p.h kernel/qeventdispatcher_glib_p.h kernel/qeventdispatcher_unix_p.h kernel/qeventdispatcher_win_p.h kernel/qeventdispatcher_winrt_p.h kernel/qeventloop_p.h kernel/qfunctions_fake_env_p.h kernel/qfunctions_p.h kernel/qjni_p.h kernel/qjnihelpers_p.h kernel/qmetaobject_moc_p.h kernel/qmetaobject_p.h kernel/qmetaobjectbuilder_p.h kernel/qmetatype_p.h kernel/qmetatypeswitcher_p.h kernel/qobject_p.h kernel/qpoll_p.h kernel/qppsattribute_p.h kernel/qppsattributeprivate_p.h kernel/qppsobject_p.h kernel/qppsobjectprivate_p.h kernel/qsharedmemory_p.h kernel/qsystemerror_p.h kernel/qsystemsemaphore_p.h kernel/qtimerinfo_unix_p.h kernel/qtranslator_p.h kernel/qvariant_p.h kernel/qwineventnotifier_p.h kernel/qwinregistry_p.h mimetypes/qmimedatabase_p.h mimetypes/qmimeglobpattern_p.h mimetypes/qmimemagicrule_p.h mimetypes/qmimemagicrulematcher_p.h mimetypes/qmimeprovider_p.h mimetypes/qmimetype_p.h mimetypes/qmimetypeparser_p.h plugin/qelfparser_p.h plugin/qfactoryloader_p.h plugin/qlibrary_p.h plugin/qmachparser_p.h plugin/qplugin_p.h plugin/qsystemlibrary_p.h serialization/qbinaryjson_p.h serialization/qbinaryjsonarray_p.h serialization/qbinaryjsonobject_p.h serialization/qbinaryjsonvalue_p.h serialization/qcborcommon_p.h serialization/qcborvalue_p.h serialization/qdatastream_p.h serialization/qjson_p.h serialization/qjsonparser_p.h serialization/qjsonwriter_p.h serialization/qtextstream_p.h serialization/qxmlstream_p.h serialization/qxmlutils_p.h statemachine/qabstractstate_p.h statemachine/qabstracttransition_p.h statemachine/qeventtransition_p.h statemachine/qfinalstate_p.h statemachine/qhistorystate_p.h statemachine/qsignaleventgenerator_p.h statemachine/qsignaltransition_p.h statemachine/qstate_p.h statemachine/qstatemachine_p.h text/qbytearray_p.h text/qbytedata_p.h text/qcollator_p.h text/qdoublescanprint_p.h text/qharfbuzz_p.h text/qlocale_data_p.h text/qlocale_p.h text/qlocale_tools_p.h text/qstringalgorithms_p.h text/qstringiterator_p.h text/qunicodetables_p.h text/qunicodetools_p.h thread/qfutex_p.h thread/qfutureinterface_p.h thread/qfuturewatcher_p.h thread/qlocking_p.h thread/qmutex_p.h thread/qorderedmutexlocker_p.h thread/qreadwritelock_p.h thread/qthread_p.h thread/qthreadpool_p.h thread/qwaitcondition_p.h time/qcalendarbackend_p.h time/qcalendarmath_p.h time/qdatetime_p.h time/qdatetimeparser_p.h time/qgregoriancalendar_p.h time/qhijricalendar_data_p.h time/qhijricalendar_p.h time/qislamiccivilcalendar_p.h time/qjalalicalendar_data_p.h time/qjalalicalendar_p.h time/qjuliancalendar_p.h time/qmilankoviccalendar_p.h time/qromancalendar_data_p.h time/qromancalendar_p.h time/qtimezoneprivate_data_p.h time/qtimezoneprivate_p.h tools/qduplicatetracker_p.h tools/qfreelist_p.h tools/qmakearray_p.h tools/qoffsetstringarray_p.h tools/qringbuffer_p.h tools/qscopedpointer_p.h tools/qsimd_p.h tools/qsimd_x86_p.h tools/qtools_p.h platform/wasm/qstdweb_p.h SYNCQT.QPA_HEADER_FILES = SYNCQT.CLEAN_HEADER_FILES = animation/qabstractanimation.h:animation animation/qanimationgroup.h:animation animation/qparallelanimationgroup.h:animation animation/qpauseanimation.h:animation animation/qpropertyanimation.h:animation animation/qsequentialanimationgroup.h:animation animation/qvariantanimation.h:animation codecs/qtextcodec.h:textcodec global/qcompilerdetection.h global/qendian.h global/qflags.h global/qfloat16.h global/qglobal.h global/qglobalstatic.h global/qisenum.h global/qlibraryinfo.h global/qlogging.h global/qnamespace.h global/qnumeric.h global/qoperatingsystemversion.h global/qprocessordetection.h global/qrandom.h global/qsysinfo.h global/qsystemdetection.h global/qtypeinfo.h global/qtypetraits.h global/qversiontagging.h io/qbuffer.h io/qdebug.h io/qdir.h io/qdiriterator.h io/qfile.h io/qfiledevice.h io/qfileinfo.h io/qfileselector.h io/qfilesystemwatcher.h:filesystemwatcher io/qiodevice.h io/qlockfile.h io/qloggingcategory.h io/qprocess.h:processenvironment io/qresource.h io/qsavefile.h io/qsettings.h:settings io/qstandardpaths.h io/qstorageinfo.h io/qtemporarydir.h io/qtemporaryfile.h io/qurl.h io/qurlquery.h itemmodels/qabstractitemmodel.h:itemmodel itemmodels/qabstractproxymodel.h:proxymodel itemmodels/qconcatenatetablesproxymodel.h:concatenatetablesproxymodel itemmodels/qidentityproxymodel.h:identityproxymodel itemmodels/qitemselectionmodel.h:itemmodel itemmodels/qsortfilterproxymodel.h:sortfilterproxymodel itemmodels/qstringlistmodel.h:stringlistmodel itemmodels/qtransposeproxymodel.h:transposeproxymodel kernel/qabstracteventdispatcher.h kernel/qabstractnativeeventfilter.h kernel/qbasictimer.h kernel/qcoreapplication.h kernel/qcoreevent.h kernel/qdeadlinetimer.h kernel/qelapsedtimer.h kernel/qeventloop.h kernel/qfunctions_nacl.h kernel/qfunctions_vxworks.h kernel/qfunctions_winrt.h kernel/qmath.h kernel/qmetaobject.h kernel/qmetatype.h kernel/qmimedata.h kernel/qobject.h kernel/qobjectcleanuphandler.h kernel/qobjectdefs.h kernel/qpointer.h kernel/qsharedmemory.h kernel/qsignalmapper.h kernel/qsocketnotifier.h kernel/qsystemsemaphore.h kernel/qtestsupport_core.h kernel/qtimer.h kernel/qtranslator.h kernel/qvariant.h kernel/qwineventnotifier.h mimetypes/qmimedatabase.h:mimetype mimetypes/qmimetype.h:mimetype plugin/qfactoryinterface.h plugin/qlibrary.h:library plugin/qplugin.h plugin/qpluginloader.h plugin/quuid.h serialization/qcborarray.h serialization/qcborcommon.h serialization/qcbormap.h serialization/qcborstream.h serialization/qcborstreamreader.h:cborstreamreader serialization/qcborstreamwriter.h:cborstreamwriter serialization/qcborvalue.h serialization/qdatastream.h serialization/qjsonarray.h serialization/qjsondocument.h serialization/qjsonobject.h serialization/qjsonvalue.h serialization/qtextstream.h serialization/qxmlstream.h statemachine/qabstractstate.h:statemachine statemachine/qabstracttransition.h:statemachine statemachine/qeventtransition.h:qeventtransition statemachine/qfinalstate.h:statemachine statemachine/qhistorystate.h:statemachine statemachine/qsignaltransition.h:statemachine statemachine/qstate.h:statemachine statemachine/qstatemachine.h:statemachine text/qbytearray.h text/qbytearraylist.h text/qbytearraymatcher.h text/qchar.h text/qcollator.h text/qlocale.h text/qregexp.h text/qregularexpression.h:regularexpression text/qstring.h text/qstringalgorithms.h text/qstringbuilder.h text/qstringlist.h text/qstringliteral.h text/qstringmatcher.h text/qstringview.h text/qtextboundaryfinder.h thread/qatomic.h thread/qbasicatomic.h thread/qexception.h:future thread/qfuture.h:future thread/qfutureinterface.h:future thread/qfuturesynchronizer.h:future thread/qfuturewatcher.h:future thread/qmutex.h thread/qreadwritelock.h thread/qresultstore.h:future thread/qrunnable.h thread/qsemaphore.h:thread thread/qthread.h thread/qthreadpool.h:thread thread/qthreadstorage.h thread/qwaitcondition.h time/qcalendar.h time/qdatetime.h time/qtimezone.h:timezone tools/qalgorithms.h tools/qarraydata.h tools/qarraydataops.h tools/qarraydatapointer.h tools/qbitarray.h tools/qcache.h tools/qcommandlineoption.h:commandlineparser tools/qcommandlineparser.h:commandlineparser tools/qcontainerfwd.h tools/qcontiguouscache.h tools/qcryptographichash.h tools/qeasingcurve.h:easingcurve tools/qhash.h tools/qhashfunctions.h tools/qiterator.h tools/qline.h tools/qlinkedlist.h tools/qlist.h tools/qmap.h tools/qmargins.h tools/qmessageauthenticationcode.h tools/qpair.h tools/qpoint.h tools/qqueue.h tools/qrect.h tools/qrefcount.h tools/qscopedpointer.h tools/qscopedvaluerollback.h tools/qscopeguard.h tools/qset.h tools/qshareddata.h tools/qsharedpointer.h tools/qsize.h tools/qstack.h tools/qtimeline.h:easingcurve tools/qvarlengtharray.h tools/qvector.h tools/qversionnumber.h -SYNCQT.INJECTIONS = src/corelib/global/qconfig.h:qconfig.h:QtConfig src/corelib/global/qconfig_p.h:5.15.3/QtCore/private/qconfig_p.h +SYNCQT.INJECTIONS = src/corelib/global/qconfig.h:qconfig.h:QtConfig src/corelib/global/qconfig_p.h:5.15.8/QtCore/private/qconfig_p.h diff --git a/include/QtCore/qtcoreversion.h b/include/QtCore/qtcoreversion.h index 479f1c12..fb2ff481 100644 --- a/include/QtCore/qtcoreversion.h +++ b/include/QtCore/qtcoreversion.h @@ -2,8 +2,8 @@ #ifndef QT_QTCORE_VERSION_H #define QT_QTCORE_VERSION_H -#define QTCORE_VERSION_STR "5.15.3" +#define QTCORE_VERSION_STR "5.15.8" -#define QTCORE_VERSION 0x050F03 +#define QTCORE_VERSION 0x050F08 #endif // QT_QTCORE_VERSION_H diff --git a/include/QtDBus/5.15.3/QtDBus/private/dbus_minimal_p.h b/include/QtDBus/5.15.8/QtDBus/private/dbus_minimal_p.h similarity index 100% rename from include/QtDBus/5.15.3/QtDBus/private/dbus_minimal_p.h rename to include/QtDBus/5.15.8/QtDBus/private/dbus_minimal_p.h diff --git a/include/QtDBus/5.15.3/QtDBus/private/qdbus_symbols_p.h b/include/QtDBus/5.15.8/QtDBus/private/qdbus_symbols_p.h similarity index 100% rename from include/QtDBus/5.15.3/QtDBus/private/qdbus_symbols_p.h rename to include/QtDBus/5.15.8/QtDBus/private/qdbus_symbols_p.h diff --git a/include/QtDBus/5.15.3/QtDBus/private/qdbusabstractadaptor_p.h b/include/QtDBus/5.15.8/QtDBus/private/qdbusabstractadaptor_p.h similarity index 100% rename from include/QtDBus/5.15.3/QtDBus/private/qdbusabstractadaptor_p.h rename to include/QtDBus/5.15.8/QtDBus/private/qdbusabstractadaptor_p.h diff --git a/include/QtDBus/5.15.3/QtDBus/private/qdbusabstractinterface_p.h b/include/QtDBus/5.15.8/QtDBus/private/qdbusabstractinterface_p.h similarity index 100% rename from include/QtDBus/5.15.3/QtDBus/private/qdbusabstractinterface_p.h rename to include/QtDBus/5.15.8/QtDBus/private/qdbusabstractinterface_p.h diff --git a/include/QtDBus/5.15.3/QtDBus/private/qdbusargument_p.h b/include/QtDBus/5.15.8/QtDBus/private/qdbusargument_p.h similarity index 100% rename from include/QtDBus/5.15.3/QtDBus/private/qdbusargument_p.h rename to include/QtDBus/5.15.8/QtDBus/private/qdbusargument_p.h diff --git a/include/QtDBus/5.15.3/QtDBus/private/qdbusconnection_p.h b/include/QtDBus/5.15.8/QtDBus/private/qdbusconnection_p.h similarity index 100% rename from include/QtDBus/5.15.3/QtDBus/private/qdbusconnection_p.h rename to include/QtDBus/5.15.8/QtDBus/private/qdbusconnection_p.h diff --git a/include/QtDBus/5.15.3/QtDBus/private/qdbusconnectionmanager_p.h b/include/QtDBus/5.15.8/QtDBus/private/qdbusconnectionmanager_p.h similarity index 100% rename from include/QtDBus/5.15.3/QtDBus/private/qdbusconnectionmanager_p.h rename to include/QtDBus/5.15.8/QtDBus/private/qdbusconnectionmanager_p.h diff --git a/include/QtDBus/5.15.3/QtDBus/private/qdbuscontext_p.h b/include/QtDBus/5.15.8/QtDBus/private/qdbuscontext_p.h similarity index 100% rename from include/QtDBus/5.15.3/QtDBus/private/qdbuscontext_p.h rename to include/QtDBus/5.15.8/QtDBus/private/qdbuscontext_p.h diff --git a/include/QtDBus/5.15.3/QtDBus/private/qdbusintegrator_p.h b/include/QtDBus/5.15.8/QtDBus/private/qdbusintegrator_p.h similarity index 100% rename from include/QtDBus/5.15.3/QtDBus/private/qdbusintegrator_p.h rename to include/QtDBus/5.15.8/QtDBus/private/qdbusintegrator_p.h diff --git a/include/QtDBus/5.15.3/QtDBus/private/qdbusinterface_p.h b/include/QtDBus/5.15.8/QtDBus/private/qdbusinterface_p.h similarity index 100% rename from include/QtDBus/5.15.3/QtDBus/private/qdbusinterface_p.h rename to include/QtDBus/5.15.8/QtDBus/private/qdbusinterface_p.h diff --git a/include/QtDBus/5.15.3/QtDBus/private/qdbusintrospection_p.h b/include/QtDBus/5.15.8/QtDBus/private/qdbusintrospection_p.h similarity index 100% rename from include/QtDBus/5.15.3/QtDBus/private/qdbusintrospection_p.h rename to include/QtDBus/5.15.8/QtDBus/private/qdbusintrospection_p.h diff --git a/include/QtDBus/5.15.3/QtDBus/private/qdbusmessage_p.h b/include/QtDBus/5.15.8/QtDBus/private/qdbusmessage_p.h similarity index 100% rename from include/QtDBus/5.15.3/QtDBus/private/qdbusmessage_p.h rename to include/QtDBus/5.15.8/QtDBus/private/qdbusmessage_p.h diff --git a/include/QtDBus/5.15.3/QtDBus/private/qdbusmetaobject_p.h b/include/QtDBus/5.15.8/QtDBus/private/qdbusmetaobject_p.h similarity index 100% rename from include/QtDBus/5.15.3/QtDBus/private/qdbusmetaobject_p.h rename to include/QtDBus/5.15.8/QtDBus/private/qdbusmetaobject_p.h diff --git a/include/QtDBus/5.15.3/QtDBus/private/qdbusmetatype_p.h b/include/QtDBus/5.15.8/QtDBus/private/qdbusmetatype_p.h similarity index 100% rename from include/QtDBus/5.15.3/QtDBus/private/qdbusmetatype_p.h rename to include/QtDBus/5.15.8/QtDBus/private/qdbusmetatype_p.h diff --git a/include/QtDBus/5.15.3/QtDBus/private/qdbuspendingcall_p.h b/include/QtDBus/5.15.8/QtDBus/private/qdbuspendingcall_p.h similarity index 100% rename from include/QtDBus/5.15.3/QtDBus/private/qdbuspendingcall_p.h rename to include/QtDBus/5.15.8/QtDBus/private/qdbuspendingcall_p.h diff --git a/include/QtDBus/5.15.3/QtDBus/private/qdbusthreaddebug_p.h b/include/QtDBus/5.15.8/QtDBus/private/qdbusthreaddebug_p.h similarity index 100% rename from include/QtDBus/5.15.3/QtDBus/private/qdbusthreaddebug_p.h rename to include/QtDBus/5.15.8/QtDBus/private/qdbusthreaddebug_p.h diff --git a/include/QtDBus/5.15.3/QtDBus/private/qdbusutil_p.h b/include/QtDBus/5.15.8/QtDBus/private/qdbusutil_p.h similarity index 100% rename from include/QtDBus/5.15.3/QtDBus/private/qdbusutil_p.h rename to include/QtDBus/5.15.8/QtDBus/private/qdbusutil_p.h diff --git a/include/QtDBus/5.15.3/QtDBus/private/qdbusxmlparser_p.h b/include/QtDBus/5.15.8/QtDBus/private/qdbusxmlparser_p.h similarity index 100% rename from include/QtDBus/5.15.3/QtDBus/private/qdbusxmlparser_p.h rename to include/QtDBus/5.15.8/QtDBus/private/qdbusxmlparser_p.h diff --git a/include/QtDBus/5.15.3/QtDBus/private/qtdbusglobal_p.h b/include/QtDBus/5.15.8/QtDBus/private/qtdbusglobal_p.h similarity index 100% rename from include/QtDBus/5.15.3/QtDBus/private/qtdbusglobal_p.h rename to include/QtDBus/5.15.8/QtDBus/private/qtdbusglobal_p.h diff --git a/include/QtDBus/qtdbusversion.h b/include/QtDBus/qtdbusversion.h index 0de9871a..a8dd98f3 100644 --- a/include/QtDBus/qtdbusversion.h +++ b/include/QtDBus/qtdbusversion.h @@ -2,8 +2,8 @@ #ifndef QT_QTDBUS_VERSION_H #define QT_QTDBUS_VERSION_H -#define QTDBUS_VERSION_STR "5.15.3" +#define QTDBUS_VERSION_STR "5.15.8" -#define QTDBUS_VERSION 0x050F03 +#define QTDBUS_VERSION 0x050F08 #endif // QT_QTDBUS_VERSION_H diff --git a/include/QtDeviceDiscoverySupport/5.15.3/QtDeviceDiscoverySupport/private/qdevicediscovery_dummy_p.h b/include/QtDeviceDiscoverySupport/5.15.8/QtDeviceDiscoverySupport/private/qdevicediscovery_dummy_p.h similarity index 100% rename from include/QtDeviceDiscoverySupport/5.15.3/QtDeviceDiscoverySupport/private/qdevicediscovery_dummy_p.h rename to include/QtDeviceDiscoverySupport/5.15.8/QtDeviceDiscoverySupport/private/qdevicediscovery_dummy_p.h diff --git a/include/QtDeviceDiscoverySupport/5.15.3/QtDeviceDiscoverySupport/private/qdevicediscovery_p.h b/include/QtDeviceDiscoverySupport/5.15.8/QtDeviceDiscoverySupport/private/qdevicediscovery_p.h similarity index 100% rename from include/QtDeviceDiscoverySupport/5.15.3/QtDeviceDiscoverySupport/private/qdevicediscovery_p.h rename to include/QtDeviceDiscoverySupport/5.15.8/QtDeviceDiscoverySupport/private/qdevicediscovery_p.h diff --git a/include/QtDeviceDiscoverySupport/5.15.3/QtDeviceDiscoverySupport/private/qdevicediscovery_static_p.h b/include/QtDeviceDiscoverySupport/5.15.8/QtDeviceDiscoverySupport/private/qdevicediscovery_static_p.h similarity index 100% rename from include/QtDeviceDiscoverySupport/5.15.3/QtDeviceDiscoverySupport/private/qdevicediscovery_static_p.h rename to include/QtDeviceDiscoverySupport/5.15.8/QtDeviceDiscoverySupport/private/qdevicediscovery_static_p.h diff --git a/include/QtDeviceDiscoverySupport/5.15.3/QtDeviceDiscoverySupport/private/qdevicediscovery_udev_p.h b/include/QtDeviceDiscoverySupport/5.15.8/QtDeviceDiscoverySupport/private/qdevicediscovery_udev_p.h similarity index 100% rename from include/QtDeviceDiscoverySupport/5.15.3/QtDeviceDiscoverySupport/private/qdevicediscovery_udev_p.h rename to include/QtDeviceDiscoverySupport/5.15.8/QtDeviceDiscoverySupport/private/qdevicediscovery_udev_p.h diff --git a/include/QtDeviceDiscoverySupport/qtdevicediscoverysupportversion.h b/include/QtDeviceDiscoverySupport/qtdevicediscoverysupportversion.h index e44aa8ec..56261586 100644 --- a/include/QtDeviceDiscoverySupport/qtdevicediscoverysupportversion.h +++ b/include/QtDeviceDiscoverySupport/qtdevicediscoverysupportversion.h @@ -2,8 +2,8 @@ #ifndef QT_QTDEVICEDISCOVERYSUPPORT_VERSION_H #define QT_QTDEVICEDISCOVERYSUPPORT_VERSION_H -#define QTDEVICEDISCOVERYSUPPORT_VERSION_STR "5.15.3" +#define QTDEVICEDISCOVERYSUPPORT_VERSION_STR "5.15.8" -#define QTDEVICEDISCOVERYSUPPORT_VERSION 0x050F03 +#define QTDEVICEDISCOVERYSUPPORT_VERSION 0x050F08 #endif // QT_QTDEVICEDISCOVERYSUPPORT_VERSION_H diff --git a/include/QtEdidSupport/5.15.3/QtEdidSupport/private/qedidparser_p.h b/include/QtEdidSupport/5.15.8/QtEdidSupport/private/qedidparser_p.h similarity index 100% rename from include/QtEdidSupport/5.15.3/QtEdidSupport/private/qedidparser_p.h rename to include/QtEdidSupport/5.15.8/QtEdidSupport/private/qedidparser_p.h diff --git a/include/QtEdidSupport/5.15.3/QtEdidSupport/private/qedidvendortable_p.h b/include/QtEdidSupport/5.15.8/QtEdidSupport/private/qedidvendortable_p.h similarity index 100% rename from include/QtEdidSupport/5.15.3/QtEdidSupport/private/qedidvendortable_p.h rename to include/QtEdidSupport/5.15.8/QtEdidSupport/private/qedidvendortable_p.h diff --git a/include/QtEdidSupport/qtedidsupportversion.h b/include/QtEdidSupport/qtedidsupportversion.h index 01e5344f..f775f39f 100644 --- a/include/QtEdidSupport/qtedidsupportversion.h +++ b/include/QtEdidSupport/qtedidsupportversion.h @@ -2,8 +2,8 @@ #ifndef QT_QTEDIDSUPPORT_VERSION_H #define QT_QTEDIDSUPPORT_VERSION_H -#define QTEDIDSUPPORT_VERSION_STR "5.15.3" +#define QTEDIDSUPPORT_VERSION_STR "5.15.8" -#define QTEDIDSUPPORT_VERSION 0x050F03 +#define QTEDIDSUPPORT_VERSION 0x050F08 #endif // QT_QTEDIDSUPPORT_VERSION_H diff --git a/include/QtEglFSDeviceIntegration/5.15.3/QtEglFSDeviceIntegration/private/qeglfscontext_p.h b/include/QtEglFSDeviceIntegration/5.15.8/QtEglFSDeviceIntegration/private/qeglfscontext_p.h similarity index 100% rename from include/QtEglFSDeviceIntegration/5.15.3/QtEglFSDeviceIntegration/private/qeglfscontext_p.h rename to include/QtEglFSDeviceIntegration/5.15.8/QtEglFSDeviceIntegration/private/qeglfscontext_p.h diff --git a/include/QtEglFSDeviceIntegration/5.15.3/QtEglFSDeviceIntegration/private/qeglfscursor_p.h b/include/QtEglFSDeviceIntegration/5.15.8/QtEglFSDeviceIntegration/private/qeglfscursor_p.h similarity index 100% rename from include/QtEglFSDeviceIntegration/5.15.3/QtEglFSDeviceIntegration/private/qeglfscursor_p.h rename to include/QtEglFSDeviceIntegration/5.15.8/QtEglFSDeviceIntegration/private/qeglfscursor_p.h diff --git a/include/QtEglFSDeviceIntegration/5.15.3/QtEglFSDeviceIntegration/private/qeglfsdeviceintegration_p.h b/include/QtEglFSDeviceIntegration/5.15.8/QtEglFSDeviceIntegration/private/qeglfsdeviceintegration_p.h similarity index 100% rename from include/QtEglFSDeviceIntegration/5.15.3/QtEglFSDeviceIntegration/private/qeglfsdeviceintegration_p.h rename to include/QtEglFSDeviceIntegration/5.15.8/QtEglFSDeviceIntegration/private/qeglfsdeviceintegration_p.h diff --git a/include/QtEglFSDeviceIntegration/5.15.3/QtEglFSDeviceIntegration/private/qeglfsglobal_p.h b/include/QtEglFSDeviceIntegration/5.15.8/QtEglFSDeviceIntegration/private/qeglfsglobal_p.h similarity index 100% rename from include/QtEglFSDeviceIntegration/5.15.3/QtEglFSDeviceIntegration/private/qeglfsglobal_p.h rename to include/QtEglFSDeviceIntegration/5.15.8/QtEglFSDeviceIntegration/private/qeglfsglobal_p.h diff --git a/include/QtEglFSDeviceIntegration/5.15.3/QtEglFSDeviceIntegration/private/qeglfshooks_p.h b/include/QtEglFSDeviceIntegration/5.15.8/QtEglFSDeviceIntegration/private/qeglfshooks_p.h similarity index 100% rename from include/QtEglFSDeviceIntegration/5.15.3/QtEglFSDeviceIntegration/private/qeglfshooks_p.h rename to include/QtEglFSDeviceIntegration/5.15.8/QtEglFSDeviceIntegration/private/qeglfshooks_p.h diff --git a/include/QtEglFSDeviceIntegration/5.15.3/QtEglFSDeviceIntegration/private/qeglfsintegration_p.h b/include/QtEglFSDeviceIntegration/5.15.8/QtEglFSDeviceIntegration/private/qeglfsintegration_p.h similarity index 100% rename from include/QtEglFSDeviceIntegration/5.15.3/QtEglFSDeviceIntegration/private/qeglfsintegration_p.h rename to include/QtEglFSDeviceIntegration/5.15.8/QtEglFSDeviceIntegration/private/qeglfsintegration_p.h diff --git a/include/QtEglFSDeviceIntegration/5.15.3/QtEglFSDeviceIntegration/private/qeglfsoffscreenwindow_p.h b/include/QtEglFSDeviceIntegration/5.15.8/QtEglFSDeviceIntegration/private/qeglfsoffscreenwindow_p.h similarity index 100% rename from include/QtEglFSDeviceIntegration/5.15.3/QtEglFSDeviceIntegration/private/qeglfsoffscreenwindow_p.h rename to include/QtEglFSDeviceIntegration/5.15.8/QtEglFSDeviceIntegration/private/qeglfsoffscreenwindow_p.h diff --git a/include/QtEglFSDeviceIntegration/5.15.3/QtEglFSDeviceIntegration/private/qeglfsscreen_p.h b/include/QtEglFSDeviceIntegration/5.15.8/QtEglFSDeviceIntegration/private/qeglfsscreen_p.h similarity index 100% rename from include/QtEglFSDeviceIntegration/5.15.3/QtEglFSDeviceIntegration/private/qeglfsscreen_p.h rename to include/QtEglFSDeviceIntegration/5.15.8/QtEglFSDeviceIntegration/private/qeglfsscreen_p.h diff --git a/include/QtEglFSDeviceIntegration/5.15.3/QtEglFSDeviceIntegration/private/qeglfsvulkaninstance_p.h b/include/QtEglFSDeviceIntegration/5.15.8/QtEglFSDeviceIntegration/private/qeglfsvulkaninstance_p.h similarity index 100% rename from include/QtEglFSDeviceIntegration/5.15.3/QtEglFSDeviceIntegration/private/qeglfsvulkaninstance_p.h rename to include/QtEglFSDeviceIntegration/5.15.8/QtEglFSDeviceIntegration/private/qeglfsvulkaninstance_p.h diff --git a/include/QtEglFSDeviceIntegration/5.15.3/QtEglFSDeviceIntegration/private/qeglfsvulkanwindow_p.h b/include/QtEglFSDeviceIntegration/5.15.8/QtEglFSDeviceIntegration/private/qeglfsvulkanwindow_p.h similarity index 100% rename from include/QtEglFSDeviceIntegration/5.15.3/QtEglFSDeviceIntegration/private/qeglfsvulkanwindow_p.h rename to include/QtEglFSDeviceIntegration/5.15.8/QtEglFSDeviceIntegration/private/qeglfsvulkanwindow_p.h diff --git a/include/QtEglFSDeviceIntegration/5.15.3/QtEglFSDeviceIntegration/private/qeglfswindow_p.h b/include/QtEglFSDeviceIntegration/5.15.8/QtEglFSDeviceIntegration/private/qeglfswindow_p.h similarity index 100% rename from include/QtEglFSDeviceIntegration/5.15.3/QtEglFSDeviceIntegration/private/qeglfswindow_p.h rename to include/QtEglFSDeviceIntegration/5.15.8/QtEglFSDeviceIntegration/private/qeglfswindow_p.h diff --git a/include/QtEglFSDeviceIntegration/qteglfsdeviceintegrationversion.h b/include/QtEglFSDeviceIntegration/qteglfsdeviceintegrationversion.h index 09614d4e..f338279f 100644 --- a/include/QtEglFSDeviceIntegration/qteglfsdeviceintegrationversion.h +++ b/include/QtEglFSDeviceIntegration/qteglfsdeviceintegrationversion.h @@ -2,8 +2,8 @@ #ifndef QT_QTEGLFSDEVICEINTEGRATION_VERSION_H #define QT_QTEGLFSDEVICEINTEGRATION_VERSION_H -#define QTEGLFSDEVICEINTEGRATION_VERSION_STR "5.15.3" +#define QTEGLFSDEVICEINTEGRATION_VERSION_STR "5.15.8" -#define QTEGLFSDEVICEINTEGRATION_VERSION 0x050F03 +#define QTEGLFSDEVICEINTEGRATION_VERSION 0x050F08 #endif // QT_QTEGLFSDEVICEINTEGRATION_VERSION_H diff --git a/include/QtEglSupport/5.15.3/QtEglSupport/private/qeglconvenience_p.h b/include/QtEglSupport/5.15.8/QtEglSupport/private/qeglconvenience_p.h similarity index 100% rename from include/QtEglSupport/5.15.3/QtEglSupport/private/qeglconvenience_p.h rename to include/QtEglSupport/5.15.8/QtEglSupport/private/qeglconvenience_p.h diff --git a/include/QtEglSupport/5.15.3/QtEglSupport/private/qeglpbuffer_p.h b/include/QtEglSupport/5.15.8/QtEglSupport/private/qeglpbuffer_p.h similarity index 100% rename from include/QtEglSupport/5.15.3/QtEglSupport/private/qeglpbuffer_p.h rename to include/QtEglSupport/5.15.8/QtEglSupport/private/qeglpbuffer_p.h diff --git a/include/QtEglSupport/5.15.3/QtEglSupport/private/qeglplatformcontext_p.h b/include/QtEglSupport/5.15.8/QtEglSupport/private/qeglplatformcontext_p.h similarity index 100% rename from include/QtEglSupport/5.15.3/QtEglSupport/private/qeglplatformcontext_p.h rename to include/QtEglSupport/5.15.8/QtEglSupport/private/qeglplatformcontext_p.h diff --git a/include/QtEglSupport/5.15.3/QtEglSupport/private/qeglstreamconvenience_p.h b/include/QtEglSupport/5.15.8/QtEglSupport/private/qeglstreamconvenience_p.h similarity index 100% rename from include/QtEglSupport/5.15.3/QtEglSupport/private/qeglstreamconvenience_p.h rename to include/QtEglSupport/5.15.8/QtEglSupport/private/qeglstreamconvenience_p.h diff --git a/include/QtEglSupport/5.15.3/QtEglSupport/private/qt_egl_p.h b/include/QtEglSupport/5.15.8/QtEglSupport/private/qt_egl_p.h similarity index 100% rename from include/QtEglSupport/5.15.3/QtEglSupport/private/qt_egl_p.h rename to include/QtEglSupport/5.15.8/QtEglSupport/private/qt_egl_p.h diff --git a/include/QtEglSupport/5.15.3/QtEglSupport/private/qxlibeglintegration_p.h b/include/QtEglSupport/5.15.8/QtEglSupport/private/qxlibeglintegration_p.h similarity index 100% rename from include/QtEglSupport/5.15.3/QtEglSupport/private/qxlibeglintegration_p.h rename to include/QtEglSupport/5.15.8/QtEglSupport/private/qxlibeglintegration_p.h diff --git a/include/QtEglSupport/qteglsupportversion.h b/include/QtEglSupport/qteglsupportversion.h index 935a16e5..9e520912 100644 --- a/include/QtEglSupport/qteglsupportversion.h +++ b/include/QtEglSupport/qteglsupportversion.h @@ -2,8 +2,8 @@ #ifndef QT_QTEGLSUPPORT_VERSION_H #define QT_QTEGLSUPPORT_VERSION_H -#define QTEGLSUPPORT_VERSION_STR "5.15.3" +#define QTEGLSUPPORT_VERSION_STR "5.15.8" -#define QTEGLSUPPORT_VERSION 0x050F03 +#define QTEGLSUPPORT_VERSION 0x050F08 #endif // QT_QTEGLSUPPORT_VERSION_H diff --git a/include/QtEventDispatcherSupport/5.15.3/QtEventDispatcherSupport/private/qeventdispatcher_glib_p.h b/include/QtEventDispatcherSupport/5.15.8/QtEventDispatcherSupport/private/qeventdispatcher_glib_p.h similarity index 100% rename from include/QtEventDispatcherSupport/5.15.3/QtEventDispatcherSupport/private/qeventdispatcher_glib_p.h rename to include/QtEventDispatcherSupport/5.15.8/QtEventDispatcherSupport/private/qeventdispatcher_glib_p.h diff --git a/include/QtEventDispatcherSupport/5.15.3/QtEventDispatcherSupport/private/qgenericunixeventdispatcher_p.h b/include/QtEventDispatcherSupport/5.15.8/QtEventDispatcherSupport/private/qgenericunixeventdispatcher_p.h similarity index 100% rename from include/QtEventDispatcherSupport/5.15.3/QtEventDispatcherSupport/private/qgenericunixeventdispatcher_p.h rename to include/QtEventDispatcherSupport/5.15.8/QtEventDispatcherSupport/private/qgenericunixeventdispatcher_p.h diff --git a/include/QtEventDispatcherSupport/5.15.3/QtEventDispatcherSupport/private/qunixeventdispatcher_qpa_p.h b/include/QtEventDispatcherSupport/5.15.8/QtEventDispatcherSupport/private/qunixeventdispatcher_qpa_p.h similarity index 100% rename from include/QtEventDispatcherSupport/5.15.3/QtEventDispatcherSupport/private/qunixeventdispatcher_qpa_p.h rename to include/QtEventDispatcherSupport/5.15.8/QtEventDispatcherSupport/private/qunixeventdispatcher_qpa_p.h diff --git a/include/QtEventDispatcherSupport/5.15.3/QtEventDispatcherSupport/private/qwindowsguieventdispatcher_p.h b/include/QtEventDispatcherSupport/5.15.8/QtEventDispatcherSupport/private/qwindowsguieventdispatcher_p.h similarity index 100% rename from include/QtEventDispatcherSupport/5.15.3/QtEventDispatcherSupport/private/qwindowsguieventdispatcher_p.h rename to include/QtEventDispatcherSupport/5.15.8/QtEventDispatcherSupport/private/qwindowsguieventdispatcher_p.h diff --git a/include/QtEventDispatcherSupport/qteventdispatchersupportversion.h b/include/QtEventDispatcherSupport/qteventdispatchersupportversion.h index 2871112c..d0e3f778 100644 --- a/include/QtEventDispatcherSupport/qteventdispatchersupportversion.h +++ b/include/QtEventDispatcherSupport/qteventdispatchersupportversion.h @@ -2,8 +2,8 @@ #ifndef QT_QTEVENTDISPATCHERSUPPORT_VERSION_H #define QT_QTEVENTDISPATCHERSUPPORT_VERSION_H -#define QTEVENTDISPATCHERSUPPORT_VERSION_STR "5.15.3" +#define QTEVENTDISPATCHERSUPPORT_VERSION_STR "5.15.8" -#define QTEVENTDISPATCHERSUPPORT_VERSION 0x050F03 +#define QTEVENTDISPATCHERSUPPORT_VERSION 0x050F08 #endif // QT_QTEVENTDISPATCHERSUPPORT_VERSION_H diff --git a/include/QtFbSupport/5.15.3/QtFbSupport/private/qfbbackingstore_p.h b/include/QtFbSupport/5.15.8/QtFbSupport/private/qfbbackingstore_p.h similarity index 100% rename from include/QtFbSupport/5.15.3/QtFbSupport/private/qfbbackingstore_p.h rename to include/QtFbSupport/5.15.8/QtFbSupport/private/qfbbackingstore_p.h diff --git a/include/QtFbSupport/5.15.3/QtFbSupport/private/qfbcursor_p.h b/include/QtFbSupport/5.15.8/QtFbSupport/private/qfbcursor_p.h similarity index 100% rename from include/QtFbSupport/5.15.3/QtFbSupport/private/qfbcursor_p.h rename to include/QtFbSupport/5.15.8/QtFbSupport/private/qfbcursor_p.h diff --git a/include/QtFbSupport/5.15.3/QtFbSupport/private/qfbscreen_p.h b/include/QtFbSupport/5.15.8/QtFbSupport/private/qfbscreen_p.h similarity index 100% rename from include/QtFbSupport/5.15.3/QtFbSupport/private/qfbscreen_p.h rename to include/QtFbSupport/5.15.8/QtFbSupport/private/qfbscreen_p.h diff --git a/include/QtFbSupport/5.15.3/QtFbSupport/private/qfbvthandler_p.h b/include/QtFbSupport/5.15.8/QtFbSupport/private/qfbvthandler_p.h similarity index 100% rename from include/QtFbSupport/5.15.3/QtFbSupport/private/qfbvthandler_p.h rename to include/QtFbSupport/5.15.8/QtFbSupport/private/qfbvthandler_p.h diff --git a/include/QtFbSupport/5.15.3/QtFbSupport/private/qfbwindow_p.h b/include/QtFbSupport/5.15.8/QtFbSupport/private/qfbwindow_p.h similarity index 100% rename from include/QtFbSupport/5.15.3/QtFbSupport/private/qfbwindow_p.h rename to include/QtFbSupport/5.15.8/QtFbSupport/private/qfbwindow_p.h diff --git a/include/QtFbSupport/qtfbsupportversion.h b/include/QtFbSupport/qtfbsupportversion.h index 97c4713e..32faf42d 100644 --- a/include/QtFbSupport/qtfbsupportversion.h +++ b/include/QtFbSupport/qtfbsupportversion.h @@ -2,8 +2,8 @@ #ifndef QT_QTFBSUPPORT_VERSION_H #define QT_QTFBSUPPORT_VERSION_H -#define QTFBSUPPORT_VERSION_STR "5.15.3" +#define QTFBSUPPORT_VERSION_STR "5.15.8" -#define QTFBSUPPORT_VERSION 0x050F03 +#define QTFBSUPPORT_VERSION 0x050F08 #endif // QT_QTFBSUPPORT_VERSION_H diff --git a/include/QtFontDatabaseSupport/5.15.3/QtFontDatabaseSupport/private/qcoretextfontdatabase_p.h b/include/QtFontDatabaseSupport/5.15.8/QtFontDatabaseSupport/private/qcoretextfontdatabase_p.h similarity index 100% rename from include/QtFontDatabaseSupport/5.15.3/QtFontDatabaseSupport/private/qcoretextfontdatabase_p.h rename to include/QtFontDatabaseSupport/5.15.8/QtFontDatabaseSupport/private/qcoretextfontdatabase_p.h diff --git a/include/QtFontDatabaseSupport/5.15.3/QtFontDatabaseSupport/private/qfontconfigdatabase_p.h b/include/QtFontDatabaseSupport/5.15.8/QtFontDatabaseSupport/private/qfontconfigdatabase_p.h similarity index 100% rename from include/QtFontDatabaseSupport/5.15.3/QtFontDatabaseSupport/private/qfontconfigdatabase_p.h rename to include/QtFontDatabaseSupport/5.15.8/QtFontDatabaseSupport/private/qfontconfigdatabase_p.h diff --git a/include/QtFontDatabaseSupport/5.15.3/QtFontDatabaseSupport/private/qfontengine_coretext_p.h b/include/QtFontDatabaseSupport/5.15.8/QtFontDatabaseSupport/private/qfontengine_coretext_p.h similarity index 100% rename from include/QtFontDatabaseSupport/5.15.3/QtFontDatabaseSupport/private/qfontengine_coretext_p.h rename to include/QtFontDatabaseSupport/5.15.8/QtFontDatabaseSupport/private/qfontengine_coretext_p.h diff --git a/include/QtFontDatabaseSupport/5.15.3/QtFontDatabaseSupport/private/qfontengine_ft_p.h b/include/QtFontDatabaseSupport/5.15.8/QtFontDatabaseSupport/private/qfontengine_ft_p.h similarity index 100% rename from include/QtFontDatabaseSupport/5.15.3/QtFontDatabaseSupport/private/qfontengine_ft_p.h rename to include/QtFontDatabaseSupport/5.15.8/QtFontDatabaseSupport/private/qfontengine_ft_p.h diff --git a/include/QtFontDatabaseSupport/5.15.3/QtFontDatabaseSupport/private/qfontenginemultifontconfig_p.h b/include/QtFontDatabaseSupport/5.15.8/QtFontDatabaseSupport/private/qfontenginemultifontconfig_p.h similarity index 100% rename from include/QtFontDatabaseSupport/5.15.3/QtFontDatabaseSupport/private/qfontenginemultifontconfig_p.h rename to include/QtFontDatabaseSupport/5.15.8/QtFontDatabaseSupport/private/qfontenginemultifontconfig_p.h diff --git a/include/QtFontDatabaseSupport/5.15.3/QtFontDatabaseSupport/private/qfreetypefontdatabase_p.h b/include/QtFontDatabaseSupport/5.15.8/QtFontDatabaseSupport/private/qfreetypefontdatabase_p.h similarity index 100% rename from include/QtFontDatabaseSupport/5.15.3/QtFontDatabaseSupport/private/qfreetypefontdatabase_p.h rename to include/QtFontDatabaseSupport/5.15.8/QtFontDatabaseSupport/private/qfreetypefontdatabase_p.h diff --git a/include/QtFontDatabaseSupport/5.15.3/QtFontDatabaseSupport/private/qgenericunixfontdatabase_p.h b/include/QtFontDatabaseSupport/5.15.8/QtFontDatabaseSupport/private/qgenericunixfontdatabase_p.h similarity index 100% rename from include/QtFontDatabaseSupport/5.15.3/QtFontDatabaseSupport/private/qgenericunixfontdatabase_p.h rename to include/QtFontDatabaseSupport/5.15.8/QtFontDatabaseSupport/private/qgenericunixfontdatabase_p.h diff --git a/include/QtFontDatabaseSupport/5.15.3/QtFontDatabaseSupport/private/qwindowsfontdatabase_ft_p.h b/include/QtFontDatabaseSupport/5.15.8/QtFontDatabaseSupport/private/qwindowsfontdatabase_ft_p.h similarity index 100% rename from include/QtFontDatabaseSupport/5.15.3/QtFontDatabaseSupport/private/qwindowsfontdatabase_ft_p.h rename to include/QtFontDatabaseSupport/5.15.8/QtFontDatabaseSupport/private/qwindowsfontdatabase_ft_p.h diff --git a/include/QtFontDatabaseSupport/5.15.3/QtFontDatabaseSupport/private/qwindowsfontdatabase_p.h b/include/QtFontDatabaseSupport/5.15.8/QtFontDatabaseSupport/private/qwindowsfontdatabase_p.h similarity index 100% rename from include/QtFontDatabaseSupport/5.15.3/QtFontDatabaseSupport/private/qwindowsfontdatabase_p.h rename to include/QtFontDatabaseSupport/5.15.8/QtFontDatabaseSupport/private/qwindowsfontdatabase_p.h diff --git a/include/QtFontDatabaseSupport/5.15.3/QtFontDatabaseSupport/private/qwindowsfontengine_p.h b/include/QtFontDatabaseSupport/5.15.8/QtFontDatabaseSupport/private/qwindowsfontengine_p.h similarity index 100% rename from include/QtFontDatabaseSupport/5.15.3/QtFontDatabaseSupport/private/qwindowsfontengine_p.h rename to include/QtFontDatabaseSupport/5.15.8/QtFontDatabaseSupport/private/qwindowsfontengine_p.h diff --git a/include/QtFontDatabaseSupport/5.15.3/QtFontDatabaseSupport/private/qwindowsfontenginedirectwrite_p.h b/include/QtFontDatabaseSupport/5.15.8/QtFontDatabaseSupport/private/qwindowsfontenginedirectwrite_p.h similarity index 100% rename from include/QtFontDatabaseSupport/5.15.3/QtFontDatabaseSupport/private/qwindowsfontenginedirectwrite_p.h rename to include/QtFontDatabaseSupport/5.15.8/QtFontDatabaseSupport/private/qwindowsfontenginedirectwrite_p.h diff --git a/include/QtFontDatabaseSupport/5.15.3/QtFontDatabaseSupport/private/qwindowsnativeimage_p.h b/include/QtFontDatabaseSupport/5.15.8/QtFontDatabaseSupport/private/qwindowsnativeimage_p.h similarity index 100% rename from include/QtFontDatabaseSupport/5.15.3/QtFontDatabaseSupport/private/qwindowsnativeimage_p.h rename to include/QtFontDatabaseSupport/5.15.8/QtFontDatabaseSupport/private/qwindowsnativeimage_p.h diff --git a/include/QtFontDatabaseSupport/5.15.3/QtFontDatabaseSupport/private/qwinrtfontdatabase_p.h b/include/QtFontDatabaseSupport/5.15.8/QtFontDatabaseSupport/private/qwinrtfontdatabase_p.h similarity index 100% rename from include/QtFontDatabaseSupport/5.15.3/QtFontDatabaseSupport/private/qwinrtfontdatabase_p.h rename to include/QtFontDatabaseSupport/5.15.8/QtFontDatabaseSupport/private/qwinrtfontdatabase_p.h diff --git a/include/QtFontDatabaseSupport/qtfontdatabasesupportversion.h b/include/QtFontDatabaseSupport/qtfontdatabasesupportversion.h index e02e61a7..e136639e 100644 --- a/include/QtFontDatabaseSupport/qtfontdatabasesupportversion.h +++ b/include/QtFontDatabaseSupport/qtfontdatabasesupportversion.h @@ -2,8 +2,8 @@ #ifndef QT_QTFONTDATABASESUPPORT_VERSION_H #define QT_QTFONTDATABASESUPPORT_VERSION_H -#define QTFONTDATABASESUPPORT_VERSION_STR "5.15.3" +#define QTFONTDATABASESUPPORT_VERSION_STR "5.15.8" -#define QTFONTDATABASESUPPORT_VERSION 0x050F03 +#define QTFONTDATABASESUPPORT_VERSION 0x050F08 #endif // QT_QTFONTDATABASESUPPORT_VERSION_H diff --git a/include/QtGlxSupport/5.15.3/QtGlxSupport/private/qglxconvenience_p.h b/include/QtGlxSupport/5.15.8/QtGlxSupport/private/qglxconvenience_p.h similarity index 100% rename from include/QtGlxSupport/5.15.3/QtGlxSupport/private/qglxconvenience_p.h rename to include/QtGlxSupport/5.15.8/QtGlxSupport/private/qglxconvenience_p.h diff --git a/include/QtGlxSupport/qtglxsupportversion.h b/include/QtGlxSupport/qtglxsupportversion.h index 7292c6b0..0c352fa3 100644 --- a/include/QtGlxSupport/qtglxsupportversion.h +++ b/include/QtGlxSupport/qtglxsupportversion.h @@ -2,8 +2,8 @@ #ifndef QT_QTGLXSUPPORT_VERSION_H #define QT_QTGLXSUPPORT_VERSION_H -#define QTGLXSUPPORT_VERSION_STR "5.15.3" +#define QTGLXSUPPORT_VERSION_STR "5.15.8" -#define QTGLXSUPPORT_VERSION 0x050F03 +#define QTGLXSUPPORT_VERSION 0x050F08 #endif // QT_QTGLXSUPPORT_VERSION_H diff --git a/include/QtGraphicsSupport/5.15.3/QtGraphicsSupport/private/qrasterbackingstore_p.h b/include/QtGraphicsSupport/5.15.8/QtGraphicsSupport/private/qrasterbackingstore_p.h similarity index 100% rename from include/QtGraphicsSupport/5.15.3/QtGraphicsSupport/private/qrasterbackingstore_p.h rename to include/QtGraphicsSupport/5.15.8/QtGraphicsSupport/private/qrasterbackingstore_p.h diff --git a/include/QtGraphicsSupport/qtgraphicssupportversion.h b/include/QtGraphicsSupport/qtgraphicssupportversion.h index e59520a8..44d454a0 100644 --- a/include/QtGraphicsSupport/qtgraphicssupportversion.h +++ b/include/QtGraphicsSupport/qtgraphicssupportversion.h @@ -2,8 +2,8 @@ #ifndef QT_QTGRAPHICSSUPPORT_VERSION_H #define QT_QTGRAPHICSSUPPORT_VERSION_H -#define QTGRAPHICSSUPPORT_VERSION_STR "5.15.3" +#define QTGRAPHICSSUPPORT_VERSION_STR "5.15.8" -#define QTGRAPHICSSUPPORT_VERSION 0x050F03 +#define QTGRAPHICSSUPPORT_VERSION 0x050F08 #endif // QT_QTGRAPHICSSUPPORT_VERSION_H diff --git a/include/QtGui/5.15.3/QtGui/private/cs_tdr_p.h b/include/QtGui/5.15.8/QtGui/private/cs_tdr_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/cs_tdr_p.h rename to include/QtGui/5.15.8/QtGui/private/cs_tdr_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qabstractlayoutstyleinfo_p.h b/include/QtGui/5.15.8/QtGui/private/qabstractlayoutstyleinfo_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qabstractlayoutstyleinfo_p.h rename to include/QtGui/5.15.8/QtGui/private/qabstractlayoutstyleinfo_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qabstracttextdocumentlayout_p.h b/include/QtGui/5.15.8/QtGui/private/qabstracttextdocumentlayout_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qabstracttextdocumentlayout_p.h rename to include/QtGui/5.15.8/QtGui/private/qabstracttextdocumentlayout_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qaccessiblecache_p.h b/include/QtGui/5.15.8/QtGui/private/qaccessiblecache_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qaccessiblecache_p.h rename to include/QtGui/5.15.8/QtGui/private/qaccessiblecache_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qastchandler_p.h b/include/QtGui/5.15.8/QtGui/private/qastchandler_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qastchandler_p.h rename to include/QtGui/5.15.8/QtGui/private/qastchandler_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qbezier_p.h b/include/QtGui/5.15.8/QtGui/private/qbezier_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qbezier_p.h rename to include/QtGui/5.15.8/QtGui/private/qbezier_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qblendfunctions_p.h b/include/QtGui/5.15.8/QtGui/private/qblendfunctions_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qblendfunctions_p.h rename to include/QtGui/5.15.8/QtGui/private/qblendfunctions_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qblittable_p.h b/include/QtGui/5.15.8/QtGui/private/qblittable_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qblittable_p.h rename to include/QtGui/5.15.8/QtGui/private/qblittable_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qbmphandler_p.h b/include/QtGui/5.15.8/QtGui/private/qbmphandler_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qbmphandler_p.h rename to include/QtGui/5.15.8/QtGui/private/qbmphandler_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qcolor_p.h b/include/QtGui/5.15.8/QtGui/private/qcolor_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qcolor_p.h rename to include/QtGui/5.15.8/QtGui/private/qcolor_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qcolormatrix_p.h b/include/QtGui/5.15.8/QtGui/private/qcolormatrix_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qcolormatrix_p.h rename to include/QtGui/5.15.8/QtGui/private/qcolormatrix_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qcolorspace_p.h b/include/QtGui/5.15.8/QtGui/private/qcolorspace_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qcolorspace_p.h rename to include/QtGui/5.15.8/QtGui/private/qcolorspace_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qcolortransferfunction_p.h b/include/QtGui/5.15.8/QtGui/private/qcolortransferfunction_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qcolortransferfunction_p.h rename to include/QtGui/5.15.8/QtGui/private/qcolortransferfunction_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qcolortransfertable_p.h b/include/QtGui/5.15.8/QtGui/private/qcolortransfertable_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qcolortransfertable_p.h rename to include/QtGui/5.15.8/QtGui/private/qcolortransfertable_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qcolortransform_p.h b/include/QtGui/5.15.8/QtGui/private/qcolortransform_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qcolortransform_p.h rename to include/QtGui/5.15.8/QtGui/private/qcolortransform_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qcolortrc_p.h b/include/QtGui/5.15.8/QtGui/private/qcolortrc_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qcolortrc_p.h rename to include/QtGui/5.15.8/QtGui/private/qcolortrc_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qcolortrclut_p.h b/include/QtGui/5.15.8/QtGui/private/qcolortrclut_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qcolortrclut_p.h rename to include/QtGui/5.15.8/QtGui/private/qcolortrclut_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qcoregraphics_p.h b/include/QtGui/5.15.8/QtGui/private/qcoregraphics_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qcoregraphics_p.h rename to include/QtGui/5.15.8/QtGui/private/qcoregraphics_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qcosmeticstroker_p.h b/include/QtGui/5.15.8/QtGui/private/qcosmeticstroker_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qcosmeticstroker_p.h rename to include/QtGui/5.15.8/QtGui/private/qcosmeticstroker_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qcssparser_p.h b/include/QtGui/5.15.8/QtGui/private/qcssparser_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qcssparser_p.h rename to include/QtGui/5.15.8/QtGui/private/qcssparser_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qcssutil_p.h b/include/QtGui/5.15.8/QtGui/private/qcssutil_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qcssutil_p.h rename to include/QtGui/5.15.8/QtGui/private/qcssutil_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qcursor_p.h b/include/QtGui/5.15.8/QtGui/private/qcursor_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qcursor_p.h rename to include/QtGui/5.15.8/QtGui/private/qcursor_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qdatabuffer_p.h b/include/QtGui/5.15.8/QtGui/private/qdatabuffer_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qdatabuffer_p.h rename to include/QtGui/5.15.8/QtGui/private/qdatabuffer_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qdistancefield_p.h b/include/QtGui/5.15.8/QtGui/private/qdistancefield_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qdistancefield_p.h rename to include/QtGui/5.15.8/QtGui/private/qdistancefield_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qdnd_p.h b/include/QtGui/5.15.8/QtGui/private/qdnd_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qdnd_p.h rename to include/QtGui/5.15.8/QtGui/private/qdnd_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qdrawhelper_mips_dsp_p.h b/include/QtGui/5.15.8/QtGui/private/qdrawhelper_mips_dsp_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qdrawhelper_mips_dsp_p.h rename to include/QtGui/5.15.8/QtGui/private/qdrawhelper_mips_dsp_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qdrawhelper_neon_p.h b/include/QtGui/5.15.8/QtGui/private/qdrawhelper_neon_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qdrawhelper_neon_p.h rename to include/QtGui/5.15.8/QtGui/private/qdrawhelper_neon_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qdrawhelper_p.h b/include/QtGui/5.15.8/QtGui/private/qdrawhelper_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qdrawhelper_p.h rename to include/QtGui/5.15.8/QtGui/private/qdrawhelper_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qdrawhelper_x86_p.h b/include/QtGui/5.15.8/QtGui/private/qdrawhelper_x86_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qdrawhelper_x86_p.h rename to include/QtGui/5.15.8/QtGui/private/qdrawhelper_x86_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qdrawingprimitive_sse2_p.h b/include/QtGui/5.15.8/QtGui/private/qdrawingprimitive_sse2_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qdrawingprimitive_sse2_p.h rename to include/QtGui/5.15.8/QtGui/private/qdrawingprimitive_sse2_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qemulationpaintengine_p.h b/include/QtGui/5.15.8/QtGui/private/qemulationpaintengine_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qemulationpaintengine_p.h rename to include/QtGui/5.15.8/QtGui/private/qemulationpaintengine_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qevent_p.h b/include/QtGui/5.15.8/QtGui/private/qevent_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qevent_p.h rename to include/QtGui/5.15.8/QtGui/private/qevent_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qfixed_p.h b/include/QtGui/5.15.8/QtGui/private/qfixed_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qfixed_p.h rename to include/QtGui/5.15.8/QtGui/private/qfixed_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qfont_p.h b/include/QtGui/5.15.8/QtGui/private/qfont_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qfont_p.h rename to include/QtGui/5.15.8/QtGui/private/qfont_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qfontengine_p.h b/include/QtGui/5.15.8/QtGui/private/qfontengine_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qfontengine_p.h rename to include/QtGui/5.15.8/QtGui/private/qfontengine_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qfontengine_qpf2_p.h b/include/QtGui/5.15.8/QtGui/private/qfontengine_qpf2_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qfontengine_qpf2_p.h rename to include/QtGui/5.15.8/QtGui/private/qfontengine_qpf2_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qfontengineglyphcache_p.h b/include/QtGui/5.15.8/QtGui/private/qfontengineglyphcache_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qfontengineglyphcache_p.h rename to include/QtGui/5.15.8/QtGui/private/qfontengineglyphcache_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qfontsubset_p.h b/include/QtGui/5.15.8/QtGui/private/qfontsubset_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qfontsubset_p.h rename to include/QtGui/5.15.8/QtGui/private/qfontsubset_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qfragmentmap_p.h b/include/QtGui/5.15.8/QtGui/private/qfragmentmap_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qfragmentmap_p.h rename to include/QtGui/5.15.8/QtGui/private/qfragmentmap_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qglyphrun_p.h b/include/QtGui/5.15.8/QtGui/private/qglyphrun_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qglyphrun_p.h rename to include/QtGui/5.15.8/QtGui/private/qglyphrun_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qgrayraster_p.h b/include/QtGui/5.15.8/QtGui/private/qgrayraster_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qgrayraster_p.h rename to include/QtGui/5.15.8/QtGui/private/qgrayraster_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qgridlayoutengine_p.h b/include/QtGui/5.15.8/QtGui/private/qgridlayoutengine_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qgridlayoutengine_p.h rename to include/QtGui/5.15.8/QtGui/private/qgridlayoutengine_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qguiapplication_p.h b/include/QtGui/5.15.8/QtGui/private/qguiapplication_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qguiapplication_p.h rename to include/QtGui/5.15.8/QtGui/private/qguiapplication_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qharfbuzzng_p.h b/include/QtGui/5.15.8/QtGui/private/qharfbuzzng_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qharfbuzzng_p.h rename to include/QtGui/5.15.8/QtGui/private/qharfbuzzng_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qhexstring_p.h b/include/QtGui/5.15.8/QtGui/private/qhexstring_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qhexstring_p.h rename to include/QtGui/5.15.8/QtGui/private/qhexstring_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qhighdpiscaling_p.h b/include/QtGui/5.15.8/QtGui/private/qhighdpiscaling_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qhighdpiscaling_p.h rename to include/QtGui/5.15.8/QtGui/private/qhighdpiscaling_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qicc_p.h b/include/QtGui/5.15.8/QtGui/private/qicc_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qicc_p.h rename to include/QtGui/5.15.8/QtGui/private/qicc_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qicon_p.h b/include/QtGui/5.15.8/QtGui/private/qicon_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qicon_p.h rename to include/QtGui/5.15.8/QtGui/private/qicon_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qiconloader_p.h b/include/QtGui/5.15.8/QtGui/private/qiconloader_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qiconloader_p.h rename to include/QtGui/5.15.8/QtGui/private/qiconloader_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qimage_p.h b/include/QtGui/5.15.8/QtGui/private/qimage_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qimage_p.h rename to include/QtGui/5.15.8/QtGui/private/qimage_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qimagepixmapcleanuphooks_p.h b/include/QtGui/5.15.8/QtGui/private/qimagepixmapcleanuphooks_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qimagepixmapcleanuphooks_p.h rename to include/QtGui/5.15.8/QtGui/private/qimagepixmapcleanuphooks_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qimagereaderwriterhelpers_p.h b/include/QtGui/5.15.8/QtGui/private/qimagereaderwriterhelpers_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qimagereaderwriterhelpers_p.h rename to include/QtGui/5.15.8/QtGui/private/qimagereaderwriterhelpers_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qimagescale_p.h b/include/QtGui/5.15.8/QtGui/private/qimagescale_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qimagescale_p.h rename to include/QtGui/5.15.8/QtGui/private/qimagescale_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qinputcontrol_p.h b/include/QtGui/5.15.8/QtGui/private/qinputcontrol_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qinputcontrol_p.h rename to include/QtGui/5.15.8/QtGui/private/qinputcontrol_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qinputdevicemanager_p.h b/include/QtGui/5.15.8/QtGui/private/qinputdevicemanager_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qinputdevicemanager_p.h rename to include/QtGui/5.15.8/QtGui/private/qinputdevicemanager_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qinputdevicemanager_p_p.h b/include/QtGui/5.15.8/QtGui/private/qinputdevicemanager_p_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qinputdevicemanager_p_p.h rename to include/QtGui/5.15.8/QtGui/private/qinputdevicemanager_p_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qinputmethod_p.h b/include/QtGui/5.15.8/QtGui/private/qinputmethod_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qinputmethod_p.h rename to include/QtGui/5.15.8/QtGui/private/qinputmethod_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qinternalmimedata_p.h b/include/QtGui/5.15.8/QtGui/private/qinternalmimedata_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qinternalmimedata_p.h rename to include/QtGui/5.15.8/QtGui/private/qinternalmimedata_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qkeymapper_p.h b/include/QtGui/5.15.8/QtGui/private/qkeymapper_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qkeymapper_p.h rename to include/QtGui/5.15.8/QtGui/private/qkeymapper_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qkeysequence_p.h b/include/QtGui/5.15.8/QtGui/private/qkeysequence_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qkeysequence_p.h rename to include/QtGui/5.15.8/QtGui/private/qkeysequence_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qktxhandler_p.h b/include/QtGui/5.15.8/QtGui/private/qktxhandler_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qktxhandler_p.h rename to include/QtGui/5.15.8/QtGui/private/qktxhandler_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qlayoutpolicy_p.h b/include/QtGui/5.15.8/QtGui/private/qlayoutpolicy_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qlayoutpolicy_p.h rename to include/QtGui/5.15.8/QtGui/private/qlayoutpolicy_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qmath_p.h b/include/QtGui/5.15.8/QtGui/private/qmath_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qmath_p.h rename to include/QtGui/5.15.8/QtGui/private/qmath_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qmemrotate_p.h b/include/QtGui/5.15.8/QtGui/private/qmemrotate_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qmemrotate_p.h rename to include/QtGui/5.15.8/QtGui/private/qmemrotate_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qopengl2pexvertexarray_p.h b/include/QtGui/5.15.8/QtGui/private/qopengl2pexvertexarray_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qopengl2pexvertexarray_p.h rename to include/QtGui/5.15.8/QtGui/private/qopengl2pexvertexarray_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qopengl_p.h b/include/QtGui/5.15.8/QtGui/private/qopengl_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qopengl_p.h rename to include/QtGui/5.15.8/QtGui/private/qopengl_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qopenglcontext_p.h b/include/QtGui/5.15.8/QtGui/private/qopenglcontext_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qopenglcontext_p.h rename to include/QtGui/5.15.8/QtGui/private/qopenglcontext_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qopenglcustomshaderstage_p.h b/include/QtGui/5.15.8/QtGui/private/qopenglcustomshaderstage_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qopenglcustomshaderstage_p.h rename to include/QtGui/5.15.8/QtGui/private/qopenglcustomshaderstage_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qopenglengineshadermanager_p.h b/include/QtGui/5.15.8/QtGui/private/qopenglengineshadermanager_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qopenglengineshadermanager_p.h rename to include/QtGui/5.15.8/QtGui/private/qopenglengineshadermanager_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qopenglengineshadersource_p.h b/include/QtGui/5.15.8/QtGui/private/qopenglengineshadersource_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qopenglengineshadersource_p.h rename to include/QtGui/5.15.8/QtGui/private/qopenglengineshadersource_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qopenglextensions_p.h b/include/QtGui/5.15.8/QtGui/private/qopenglextensions_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qopenglextensions_p.h rename to include/QtGui/5.15.8/QtGui/private/qopenglextensions_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qopenglframebufferobject_p.h b/include/QtGui/5.15.8/QtGui/private/qopenglframebufferobject_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qopenglframebufferobject_p.h rename to include/QtGui/5.15.8/QtGui/private/qopenglframebufferobject_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qopenglgradientcache_p.h b/include/QtGui/5.15.8/QtGui/private/qopenglgradientcache_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qopenglgradientcache_p.h rename to include/QtGui/5.15.8/QtGui/private/qopenglgradientcache_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qopenglpaintdevice_p.h b/include/QtGui/5.15.8/QtGui/private/qopenglpaintdevice_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qopenglpaintdevice_p.h rename to include/QtGui/5.15.8/QtGui/private/qopenglpaintdevice_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qopenglpaintengine_p.h b/include/QtGui/5.15.8/QtGui/private/qopenglpaintengine_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qopenglpaintengine_p.h rename to include/QtGui/5.15.8/QtGui/private/qopenglpaintengine_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qopenglprogrambinarycache_p.h b/include/QtGui/5.15.8/QtGui/private/qopenglprogrambinarycache_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qopenglprogrambinarycache_p.h rename to include/QtGui/5.15.8/QtGui/private/qopenglprogrambinarycache_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qopenglqueryhelper_p.h b/include/QtGui/5.15.8/QtGui/private/qopenglqueryhelper_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qopenglqueryhelper_p.h rename to include/QtGui/5.15.8/QtGui/private/qopenglqueryhelper_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qopenglshadercache_p.h b/include/QtGui/5.15.8/QtGui/private/qopenglshadercache_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qopenglshadercache_p.h rename to include/QtGui/5.15.8/QtGui/private/qopenglshadercache_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qopengltexture_p.h b/include/QtGui/5.15.8/QtGui/private/qopengltexture_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qopengltexture_p.h rename to include/QtGui/5.15.8/QtGui/private/qopengltexture_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qopengltexturecache_p.h b/include/QtGui/5.15.8/QtGui/private/qopengltexturecache_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qopengltexturecache_p.h rename to include/QtGui/5.15.8/QtGui/private/qopengltexturecache_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qopengltextureglyphcache_p.h b/include/QtGui/5.15.8/QtGui/private/qopengltextureglyphcache_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qopengltextureglyphcache_p.h rename to include/QtGui/5.15.8/QtGui/private/qopengltextureglyphcache_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qopengltexturehelper_p.h b/include/QtGui/5.15.8/QtGui/private/qopengltexturehelper_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qopengltexturehelper_p.h rename to include/QtGui/5.15.8/QtGui/private/qopengltexturehelper_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qopengltextureuploader_p.h b/include/QtGui/5.15.8/QtGui/private/qopengltextureuploader_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qopengltextureuploader_p.h rename to include/QtGui/5.15.8/QtGui/private/qopengltextureuploader_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qopenglversionfunctionsfactory_p.h b/include/QtGui/5.15.8/QtGui/private/qopenglversionfunctionsfactory_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qopenglversionfunctionsfactory_p.h rename to include/QtGui/5.15.8/QtGui/private/qopenglversionfunctionsfactory_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qopenglvertexarrayobject_p.h b/include/QtGui/5.15.8/QtGui/private/qopenglvertexarrayobject_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qopenglvertexarrayobject_p.h rename to include/QtGui/5.15.8/QtGui/private/qopenglvertexarrayobject_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qoutlinemapper_p.h b/include/QtGui/5.15.8/QtGui/private/qoutlinemapper_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qoutlinemapper_p.h rename to include/QtGui/5.15.8/QtGui/private/qoutlinemapper_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qpagedpaintdevice_p.h b/include/QtGui/5.15.8/QtGui/private/qpagedpaintdevice_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qpagedpaintdevice_p.h rename to include/QtGui/5.15.8/QtGui/private/qpagedpaintdevice_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qpaintdevicewindow_p.h b/include/QtGui/5.15.8/QtGui/private/qpaintdevicewindow_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qpaintdevicewindow_p.h rename to include/QtGui/5.15.8/QtGui/private/qpaintdevicewindow_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qpaintengine_blitter_p.h b/include/QtGui/5.15.8/QtGui/private/qpaintengine_blitter_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qpaintengine_blitter_p.h rename to include/QtGui/5.15.8/QtGui/private/qpaintengine_blitter_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qpaintengine_p.h b/include/QtGui/5.15.8/QtGui/private/qpaintengine_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qpaintengine_p.h rename to include/QtGui/5.15.8/QtGui/private/qpaintengine_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qpaintengine_pic_p.h b/include/QtGui/5.15.8/QtGui/private/qpaintengine_pic_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qpaintengine_pic_p.h rename to include/QtGui/5.15.8/QtGui/private/qpaintengine_pic_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qpaintengine_raster_p.h b/include/QtGui/5.15.8/QtGui/private/qpaintengine_raster_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qpaintengine_raster_p.h rename to include/QtGui/5.15.8/QtGui/private/qpaintengine_raster_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qpaintengineex_p.h b/include/QtGui/5.15.8/QtGui/private/qpaintengineex_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qpaintengineex_p.h rename to include/QtGui/5.15.8/QtGui/private/qpaintengineex_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qpainter_p.h b/include/QtGui/5.15.8/QtGui/private/qpainter_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qpainter_p.h rename to include/QtGui/5.15.8/QtGui/private/qpainter_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qpainterpath_p.h b/include/QtGui/5.15.8/QtGui/private/qpainterpath_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qpainterpath_p.h rename to include/QtGui/5.15.8/QtGui/private/qpainterpath_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qpathclipper_p.h b/include/QtGui/5.15.8/QtGui/private/qpathclipper_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qpathclipper_p.h rename to include/QtGui/5.15.8/QtGui/private/qpathclipper_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qpathsimplifier_p.h b/include/QtGui/5.15.8/QtGui/private/qpathsimplifier_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qpathsimplifier_p.h rename to include/QtGui/5.15.8/QtGui/private/qpathsimplifier_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qpdf_p.h b/include/QtGui/5.15.8/QtGui/private/qpdf_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qpdf_p.h rename to include/QtGui/5.15.8/QtGui/private/qpdf_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qpen_p.h b/include/QtGui/5.15.8/QtGui/private/qpen_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qpen_p.h rename to include/QtGui/5.15.8/QtGui/private/qpen_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qpicture_p.h b/include/QtGui/5.15.8/QtGui/private/qpicture_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qpicture_p.h rename to include/QtGui/5.15.8/QtGui/private/qpicture_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qpixmap_blitter_p.h b/include/QtGui/5.15.8/QtGui/private/qpixmap_blitter_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qpixmap_blitter_p.h rename to include/QtGui/5.15.8/QtGui/private/qpixmap_blitter_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qpixmap_raster_p.h b/include/QtGui/5.15.8/QtGui/private/qpixmap_raster_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qpixmap_raster_p.h rename to include/QtGui/5.15.8/QtGui/private/qpixmap_raster_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qpixmapcache_p.h b/include/QtGui/5.15.8/QtGui/private/qpixmapcache_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qpixmapcache_p.h rename to include/QtGui/5.15.8/QtGui/private/qpixmapcache_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qpkmhandler_p.h b/include/QtGui/5.15.8/QtGui/private/qpkmhandler_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qpkmhandler_p.h rename to include/QtGui/5.15.8/QtGui/private/qpkmhandler_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qpnghandler_p.h b/include/QtGui/5.15.8/QtGui/private/qpnghandler_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qpnghandler_p.h rename to include/QtGui/5.15.8/QtGui/private/qpnghandler_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qpolygonclipper_p.h b/include/QtGui/5.15.8/QtGui/private/qpolygonclipper_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qpolygonclipper_p.h rename to include/QtGui/5.15.8/QtGui/private/qpolygonclipper_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qppmhandler_p.h b/include/QtGui/5.15.8/QtGui/private/qppmhandler_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qppmhandler_p.h rename to include/QtGui/5.15.8/QtGui/private/qppmhandler_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qrasterdefs_p.h b/include/QtGui/5.15.8/QtGui/private/qrasterdefs_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qrasterdefs_p.h rename to include/QtGui/5.15.8/QtGui/private/qrasterdefs_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qrasterizer_p.h b/include/QtGui/5.15.8/QtGui/private/qrasterizer_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qrasterizer_p.h rename to include/QtGui/5.15.8/QtGui/private/qrasterizer_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qrawfont_p.h b/include/QtGui/5.15.8/QtGui/private/qrawfont_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qrawfont_p.h rename to include/QtGui/5.15.8/QtGui/private/qrawfont_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qrbtree_p.h b/include/QtGui/5.15.8/QtGui/private/qrbtree_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qrbtree_p.h rename to include/QtGui/5.15.8/QtGui/private/qrbtree_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qrgba64_p.h b/include/QtGui/5.15.8/QtGui/private/qrgba64_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qrgba64_p.h rename to include/QtGui/5.15.8/QtGui/private/qrgba64_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qrhi_p.h b/include/QtGui/5.15.8/QtGui/private/qrhi_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qrhi_p.h rename to include/QtGui/5.15.8/QtGui/private/qrhi_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qrhi_p_p.h b/include/QtGui/5.15.8/QtGui/private/qrhi_p_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qrhi_p_p.h rename to include/QtGui/5.15.8/QtGui/private/qrhi_p_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qrhid3d11_p.h b/include/QtGui/5.15.8/QtGui/private/qrhid3d11_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qrhid3d11_p.h rename to include/QtGui/5.15.8/QtGui/private/qrhid3d11_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qrhid3d11_p_p.h b/include/QtGui/5.15.8/QtGui/private/qrhid3d11_p_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qrhid3d11_p_p.h rename to include/QtGui/5.15.8/QtGui/private/qrhid3d11_p_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qrhigles2_p.h b/include/QtGui/5.15.8/QtGui/private/qrhigles2_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qrhigles2_p.h rename to include/QtGui/5.15.8/QtGui/private/qrhigles2_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qrhigles2_p_p.h b/include/QtGui/5.15.8/QtGui/private/qrhigles2_p_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qrhigles2_p_p.h rename to include/QtGui/5.15.8/QtGui/private/qrhigles2_p_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qrhimetal_p.h b/include/QtGui/5.15.8/QtGui/private/qrhimetal_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qrhimetal_p.h rename to include/QtGui/5.15.8/QtGui/private/qrhimetal_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qrhimetal_p_p.h b/include/QtGui/5.15.8/QtGui/private/qrhimetal_p_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qrhimetal_p_p.h rename to include/QtGui/5.15.8/QtGui/private/qrhimetal_p_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qrhinull_p.h b/include/QtGui/5.15.8/QtGui/private/qrhinull_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qrhinull_p.h rename to include/QtGui/5.15.8/QtGui/private/qrhinull_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qrhinull_p_p.h b/include/QtGui/5.15.8/QtGui/private/qrhinull_p_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qrhinull_p_p.h rename to include/QtGui/5.15.8/QtGui/private/qrhinull_p_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qrhiprofiler_p.h b/include/QtGui/5.15.8/QtGui/private/qrhiprofiler_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qrhiprofiler_p.h rename to include/QtGui/5.15.8/QtGui/private/qrhiprofiler_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qrhiprofiler_p_p.h b/include/QtGui/5.15.8/QtGui/private/qrhiprofiler_p_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qrhiprofiler_p_p.h rename to include/QtGui/5.15.8/QtGui/private/qrhiprofiler_p_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qrhivulkan_p.h b/include/QtGui/5.15.8/QtGui/private/qrhivulkan_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qrhivulkan_p.h rename to include/QtGui/5.15.8/QtGui/private/qrhivulkan_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qrhivulkan_p_p.h b/include/QtGui/5.15.8/QtGui/private/qrhivulkan_p_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qrhivulkan_p_p.h rename to include/QtGui/5.15.8/QtGui/private/qrhivulkan_p_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qrhivulkanext_p.h b/include/QtGui/5.15.8/QtGui/private/qrhivulkanext_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qrhivulkanext_p.h rename to include/QtGui/5.15.8/QtGui/private/qrhivulkanext_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qscreen_p.h b/include/QtGui/5.15.8/QtGui/private/qscreen_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qscreen_p.h rename to include/QtGui/5.15.8/QtGui/private/qscreen_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qsessionmanager_p.h b/include/QtGui/5.15.8/QtGui/private/qsessionmanager_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qsessionmanager_p.h rename to include/QtGui/5.15.8/QtGui/private/qsessionmanager_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qshader_p.h b/include/QtGui/5.15.8/QtGui/private/qshader_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qshader_p.h rename to include/QtGui/5.15.8/QtGui/private/qshader_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qshader_p_p.h b/include/QtGui/5.15.8/QtGui/private/qshader_p_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qshader_p_p.h rename to include/QtGui/5.15.8/QtGui/private/qshader_p_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qshaderdescription_p.h b/include/QtGui/5.15.8/QtGui/private/qshaderdescription_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qshaderdescription_p.h rename to include/QtGui/5.15.8/QtGui/private/qshaderdescription_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qshaderdescription_p_p.h b/include/QtGui/5.15.8/QtGui/private/qshaderdescription_p_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qshaderdescription_p_p.h rename to include/QtGui/5.15.8/QtGui/private/qshaderdescription_p_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qshaderformat_p.h b/include/QtGui/5.15.8/QtGui/private/qshaderformat_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qshaderformat_p.h rename to include/QtGui/5.15.8/QtGui/private/qshaderformat_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qshadergenerator_p.h b/include/QtGui/5.15.8/QtGui/private/qshadergenerator_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qshadergenerator_p.h rename to include/QtGui/5.15.8/QtGui/private/qshadergenerator_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qshadergraph_p.h b/include/QtGui/5.15.8/QtGui/private/qshadergraph_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qshadergraph_p.h rename to include/QtGui/5.15.8/QtGui/private/qshadergraph_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qshadergraphloader_p.h b/include/QtGui/5.15.8/QtGui/private/qshadergraphloader_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qshadergraphloader_p.h rename to include/QtGui/5.15.8/QtGui/private/qshadergraphloader_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qshaderlanguage_p.h b/include/QtGui/5.15.8/QtGui/private/qshaderlanguage_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qshaderlanguage_p.h rename to include/QtGui/5.15.8/QtGui/private/qshaderlanguage_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qshadernode_p.h b/include/QtGui/5.15.8/QtGui/private/qshadernode_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qshadernode_p.h rename to include/QtGui/5.15.8/QtGui/private/qshadernode_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qshadernodeport_p.h b/include/QtGui/5.15.8/QtGui/private/qshadernodeport_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qshadernodeport_p.h rename to include/QtGui/5.15.8/QtGui/private/qshadernodeport_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qshadernodesloader_p.h b/include/QtGui/5.15.8/QtGui/private/qshadernodesloader_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qshadernodesloader_p.h rename to include/QtGui/5.15.8/QtGui/private/qshadernodesloader_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qshapedpixmapdndwindow_p.h b/include/QtGui/5.15.8/QtGui/private/qshapedpixmapdndwindow_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qshapedpixmapdndwindow_p.h rename to include/QtGui/5.15.8/QtGui/private/qshapedpixmapdndwindow_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qshortcutmap_p.h b/include/QtGui/5.15.8/QtGui/private/qshortcutmap_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qshortcutmap_p.h rename to include/QtGui/5.15.8/QtGui/private/qshortcutmap_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qsimpledrag_p.h b/include/QtGui/5.15.8/QtGui/private/qsimpledrag_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qsimpledrag_p.h rename to include/QtGui/5.15.8/QtGui/private/qsimpledrag_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qstandarditemmodel_p.h b/include/QtGui/5.15.8/QtGui/private/qstandarditemmodel_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qstandarditemmodel_p.h rename to include/QtGui/5.15.8/QtGui/private/qstandarditemmodel_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qstatictext_p.h b/include/QtGui/5.15.8/QtGui/private/qstatictext_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qstatictext_p.h rename to include/QtGui/5.15.8/QtGui/private/qstatictext_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qstroker_p.h b/include/QtGui/5.15.8/QtGui/private/qstroker_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qstroker_p.h rename to include/QtGui/5.15.8/QtGui/private/qstroker_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qt_gui_pch.h b/include/QtGui/5.15.8/QtGui/private/qt_gui_pch.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qt_gui_pch.h rename to include/QtGui/5.15.8/QtGui/private/qt_gui_pch.h diff --git a/include/QtGui/5.15.3/QtGui/private/qt_mips_asm_dsp_p.h b/include/QtGui/5.15.8/QtGui/private/qt_mips_asm_dsp_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qt_mips_asm_dsp_p.h rename to include/QtGui/5.15.8/QtGui/private/qt_mips_asm_dsp_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qtextcursor_p.h b/include/QtGui/5.15.8/QtGui/private/qtextcursor_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qtextcursor_p.h rename to include/QtGui/5.15.8/QtGui/private/qtextcursor_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qtextdocument_p.h b/include/QtGui/5.15.8/QtGui/private/qtextdocument_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qtextdocument_p.h rename to include/QtGui/5.15.8/QtGui/private/qtextdocument_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qtextdocumentfragment_p.h b/include/QtGui/5.15.8/QtGui/private/qtextdocumentfragment_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qtextdocumentfragment_p.h rename to include/QtGui/5.15.8/QtGui/private/qtextdocumentfragment_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qtextdocumentlayout_p.h b/include/QtGui/5.15.8/QtGui/private/qtextdocumentlayout_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qtextdocumentlayout_p.h rename to include/QtGui/5.15.8/QtGui/private/qtextdocumentlayout_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qtextengine_p.h b/include/QtGui/5.15.8/QtGui/private/qtextengine_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qtextengine_p.h rename to include/QtGui/5.15.8/QtGui/private/qtextengine_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qtextformat_p.h b/include/QtGui/5.15.8/QtGui/private/qtextformat_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qtextformat_p.h rename to include/QtGui/5.15.8/QtGui/private/qtextformat_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qtexthtmlparser_p.h b/include/QtGui/5.15.8/QtGui/private/qtexthtmlparser_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qtexthtmlparser_p.h rename to include/QtGui/5.15.8/QtGui/private/qtexthtmlparser_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qtextimagehandler_p.h b/include/QtGui/5.15.8/QtGui/private/qtextimagehandler_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qtextimagehandler_p.h rename to include/QtGui/5.15.8/QtGui/private/qtextimagehandler_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qtextmarkdownimporter_p.h b/include/QtGui/5.15.8/QtGui/private/qtextmarkdownimporter_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qtextmarkdownimporter_p.h rename to include/QtGui/5.15.8/QtGui/private/qtextmarkdownimporter_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qtextmarkdownwriter_p.h b/include/QtGui/5.15.8/QtGui/private/qtextmarkdownwriter_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qtextmarkdownwriter_p.h rename to include/QtGui/5.15.8/QtGui/private/qtextmarkdownwriter_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qtextobject_p.h b/include/QtGui/5.15.8/QtGui/private/qtextobject_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qtextobject_p.h rename to include/QtGui/5.15.8/QtGui/private/qtextobject_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qtextodfwriter_p.h b/include/QtGui/5.15.8/QtGui/private/qtextodfwriter_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qtextodfwriter_p.h rename to include/QtGui/5.15.8/QtGui/private/qtextodfwriter_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qtexttable_p.h b/include/QtGui/5.15.8/QtGui/private/qtexttable_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qtexttable_p.h rename to include/QtGui/5.15.8/QtGui/private/qtexttable_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qtexturefiledata_p.h b/include/QtGui/5.15.8/QtGui/private/qtexturefiledata_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qtexturefiledata_p.h rename to include/QtGui/5.15.8/QtGui/private/qtexturefiledata_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qtexturefilehandler_p.h b/include/QtGui/5.15.8/QtGui/private/qtexturefilehandler_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qtexturefilehandler_p.h rename to include/QtGui/5.15.8/QtGui/private/qtexturefilehandler_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qtexturefilereader_p.h b/include/QtGui/5.15.8/QtGui/private/qtexturefilereader_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qtexturefilereader_p.h rename to include/QtGui/5.15.8/QtGui/private/qtexturefilereader_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qtextureglyphcache_p.h b/include/QtGui/5.15.8/QtGui/private/qtextureglyphcache_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qtextureglyphcache_p.h rename to include/QtGui/5.15.8/QtGui/private/qtextureglyphcache_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qtguiglobal_p.h b/include/QtGui/5.15.8/QtGui/private/qtguiglobal_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qtguiglobal_p.h rename to include/QtGui/5.15.8/QtGui/private/qtguiglobal_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qtouchdevice_p.h b/include/QtGui/5.15.8/QtGui/private/qtouchdevice_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qtouchdevice_p.h rename to include/QtGui/5.15.8/QtGui/private/qtouchdevice_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qtriangulatingstroker_p.h b/include/QtGui/5.15.8/QtGui/private/qtriangulatingstroker_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qtriangulatingstroker_p.h rename to include/QtGui/5.15.8/QtGui/private/qtriangulatingstroker_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qtriangulator_p.h b/include/QtGui/5.15.8/QtGui/private/qtriangulator_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qtriangulator_p.h rename to include/QtGui/5.15.8/QtGui/private/qtriangulator_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qvectorpath_p.h b/include/QtGui/5.15.8/QtGui/private/qvectorpath_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qvectorpath_p.h rename to include/QtGui/5.15.8/QtGui/private/qvectorpath_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qvulkanwindow_p.h b/include/QtGui/5.15.8/QtGui/private/qvulkanwindow_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qvulkanwindow_p.h rename to include/QtGui/5.15.8/QtGui/private/qvulkanwindow_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qwasmlocalfileaccess_p.h b/include/QtGui/5.15.8/QtGui/private/qwasmlocalfileaccess_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qwasmlocalfileaccess_p.h rename to include/QtGui/5.15.8/QtGui/private/qwasmlocalfileaccess_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qwindow_p.h b/include/QtGui/5.15.8/QtGui/private/qwindow_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qwindow_p.h rename to include/QtGui/5.15.8/QtGui/private/qwindow_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qxbmhandler_p.h b/include/QtGui/5.15.8/QtGui/private/qxbmhandler_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qxbmhandler_p.h rename to include/QtGui/5.15.8/QtGui/private/qxbmhandler_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qxpmhandler_p.h b/include/QtGui/5.15.8/QtGui/private/qxpmhandler_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qxpmhandler_p.h rename to include/QtGui/5.15.8/QtGui/private/qxpmhandler_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qzipreader_p.h b/include/QtGui/5.15.8/QtGui/private/qzipreader_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qzipreader_p.h rename to include/QtGui/5.15.8/QtGui/private/qzipreader_p.h diff --git a/include/QtGui/5.15.3/QtGui/private/qzipwriter_p.h b/include/QtGui/5.15.8/QtGui/private/qzipwriter_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/private/qzipwriter_p.h rename to include/QtGui/5.15.8/QtGui/private/qzipwriter_p.h diff --git a/include/QtGui/5.15.3/QtGui/qpa/qplatformaccessibility.h b/include/QtGui/5.15.8/QtGui/qpa/qplatformaccessibility.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/qpa/qplatformaccessibility.h rename to include/QtGui/5.15.8/QtGui/qpa/qplatformaccessibility.h diff --git a/include/QtGui/5.15.3/QtGui/qpa/qplatformbackingstore.h b/include/QtGui/5.15.8/QtGui/qpa/qplatformbackingstore.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/qpa/qplatformbackingstore.h rename to include/QtGui/5.15.8/QtGui/qpa/qplatformbackingstore.h diff --git a/include/QtGui/5.15.3/QtGui/qpa/qplatformclipboard.h b/include/QtGui/5.15.8/QtGui/qpa/qplatformclipboard.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/qpa/qplatformclipboard.h rename to include/QtGui/5.15.8/QtGui/qpa/qplatformclipboard.h diff --git a/include/QtGui/5.15.3/QtGui/qpa/qplatformcursor.h b/include/QtGui/5.15.8/QtGui/qpa/qplatformcursor.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/qpa/qplatformcursor.h rename to include/QtGui/5.15.8/QtGui/qpa/qplatformcursor.h diff --git a/include/QtGui/5.15.3/QtGui/qpa/qplatformdialoghelper.h b/include/QtGui/5.15.8/QtGui/qpa/qplatformdialoghelper.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/qpa/qplatformdialoghelper.h rename to include/QtGui/5.15.8/QtGui/qpa/qplatformdialoghelper.h diff --git a/include/QtGui/5.15.3/QtGui/qpa/qplatformdrag.h b/include/QtGui/5.15.8/QtGui/qpa/qplatformdrag.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/qpa/qplatformdrag.h rename to include/QtGui/5.15.8/QtGui/qpa/qplatformdrag.h diff --git a/include/QtGui/5.15.3/QtGui/qpa/qplatformfontdatabase.h b/include/QtGui/5.15.8/QtGui/qpa/qplatformfontdatabase.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/qpa/qplatformfontdatabase.h rename to include/QtGui/5.15.8/QtGui/qpa/qplatformfontdatabase.h diff --git a/include/QtGui/5.15.3/QtGui/qpa/qplatformgraphicsbuffer.h b/include/QtGui/5.15.8/QtGui/qpa/qplatformgraphicsbuffer.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/qpa/qplatformgraphicsbuffer.h rename to include/QtGui/5.15.8/QtGui/qpa/qplatformgraphicsbuffer.h diff --git a/include/QtGui/5.15.3/QtGui/qpa/qplatformgraphicsbufferhelper.h b/include/QtGui/5.15.8/QtGui/qpa/qplatformgraphicsbufferhelper.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/qpa/qplatformgraphicsbufferhelper.h rename to include/QtGui/5.15.8/QtGui/qpa/qplatformgraphicsbufferhelper.h diff --git a/include/QtGui/5.15.3/QtGui/qpa/qplatforminputcontext.h b/include/QtGui/5.15.8/QtGui/qpa/qplatforminputcontext.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/qpa/qplatforminputcontext.h rename to include/QtGui/5.15.8/QtGui/qpa/qplatforminputcontext.h diff --git a/include/QtGui/5.15.3/QtGui/qpa/qplatforminputcontext_p.h b/include/QtGui/5.15.8/QtGui/qpa/qplatforminputcontext_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/qpa/qplatforminputcontext_p.h rename to include/QtGui/5.15.8/QtGui/qpa/qplatforminputcontext_p.h diff --git a/include/QtGui/5.15.3/QtGui/qpa/qplatforminputcontextfactory_p.h b/include/QtGui/5.15.8/QtGui/qpa/qplatforminputcontextfactory_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/qpa/qplatforminputcontextfactory_p.h rename to include/QtGui/5.15.8/QtGui/qpa/qplatforminputcontextfactory_p.h diff --git a/include/QtGui/5.15.3/QtGui/qpa/qplatforminputcontextplugin_p.h b/include/QtGui/5.15.8/QtGui/qpa/qplatforminputcontextplugin_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/qpa/qplatforminputcontextplugin_p.h rename to include/QtGui/5.15.8/QtGui/qpa/qplatforminputcontextplugin_p.h diff --git a/include/QtGui/5.15.3/QtGui/qpa/qplatformintegration.h b/include/QtGui/5.15.8/QtGui/qpa/qplatformintegration.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/qpa/qplatformintegration.h rename to include/QtGui/5.15.8/QtGui/qpa/qplatformintegration.h diff --git a/include/QtGui/5.15.3/QtGui/qpa/qplatformintegrationfactory_p.h b/include/QtGui/5.15.8/QtGui/qpa/qplatformintegrationfactory_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/qpa/qplatformintegrationfactory_p.h rename to include/QtGui/5.15.8/QtGui/qpa/qplatformintegrationfactory_p.h diff --git a/include/QtGui/5.15.3/QtGui/qpa/qplatformintegrationplugin.h b/include/QtGui/5.15.8/QtGui/qpa/qplatformintegrationplugin.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/qpa/qplatformintegrationplugin.h rename to include/QtGui/5.15.8/QtGui/qpa/qplatformintegrationplugin.h diff --git a/include/QtGui/5.15.3/QtGui/qpa/qplatformmenu.h b/include/QtGui/5.15.8/QtGui/qpa/qplatformmenu.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/qpa/qplatformmenu.h rename to include/QtGui/5.15.8/QtGui/qpa/qplatformmenu.h diff --git a/include/QtGui/5.15.3/QtGui/qpa/qplatformnativeinterface.h b/include/QtGui/5.15.8/QtGui/qpa/qplatformnativeinterface.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/qpa/qplatformnativeinterface.h rename to include/QtGui/5.15.8/QtGui/qpa/qplatformnativeinterface.h diff --git a/include/QtGui/5.15.3/QtGui/qpa/qplatformoffscreensurface.h b/include/QtGui/5.15.8/QtGui/qpa/qplatformoffscreensurface.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/qpa/qplatformoffscreensurface.h rename to include/QtGui/5.15.8/QtGui/qpa/qplatformoffscreensurface.h diff --git a/include/QtGui/5.15.3/QtGui/qpa/qplatformopenglcontext.h b/include/QtGui/5.15.8/QtGui/qpa/qplatformopenglcontext.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/qpa/qplatformopenglcontext.h rename to include/QtGui/5.15.8/QtGui/qpa/qplatformopenglcontext.h diff --git a/include/QtGui/5.15.3/QtGui/qpa/qplatformpixmap.h b/include/QtGui/5.15.8/QtGui/qpa/qplatformpixmap.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/qpa/qplatformpixmap.h rename to include/QtGui/5.15.8/QtGui/qpa/qplatformpixmap.h diff --git a/include/QtGui/5.15.3/QtGui/qpa/qplatformscreen.h b/include/QtGui/5.15.8/QtGui/qpa/qplatformscreen.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/qpa/qplatformscreen.h rename to include/QtGui/5.15.8/QtGui/qpa/qplatformscreen.h diff --git a/include/QtGui/5.15.3/QtGui/qpa/qplatformscreen_p.h b/include/QtGui/5.15.8/QtGui/qpa/qplatformscreen_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/qpa/qplatformscreen_p.h rename to include/QtGui/5.15.8/QtGui/qpa/qplatformscreen_p.h diff --git a/include/QtGui/5.15.3/QtGui/qpa/qplatformservices.h b/include/QtGui/5.15.8/QtGui/qpa/qplatformservices.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/qpa/qplatformservices.h rename to include/QtGui/5.15.8/QtGui/qpa/qplatformservices.h diff --git a/include/QtGui/5.15.3/QtGui/qpa/qplatformsessionmanager.h b/include/QtGui/5.15.8/QtGui/qpa/qplatformsessionmanager.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/qpa/qplatformsessionmanager.h rename to include/QtGui/5.15.8/QtGui/qpa/qplatformsessionmanager.h diff --git a/include/QtGui/5.15.3/QtGui/qpa/qplatformsharedgraphicscache.h b/include/QtGui/5.15.8/QtGui/qpa/qplatformsharedgraphicscache.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/qpa/qplatformsharedgraphicscache.h rename to include/QtGui/5.15.8/QtGui/qpa/qplatformsharedgraphicscache.h diff --git a/include/QtGui/5.15.3/QtGui/qpa/qplatformsurface.h b/include/QtGui/5.15.8/QtGui/qpa/qplatformsurface.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/qpa/qplatformsurface.h rename to include/QtGui/5.15.8/QtGui/qpa/qplatformsurface.h diff --git a/include/QtGui/5.15.3/QtGui/qpa/qplatformsystemtrayicon.h b/include/QtGui/5.15.8/QtGui/qpa/qplatformsystemtrayicon.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/qpa/qplatformsystemtrayicon.h rename to include/QtGui/5.15.8/QtGui/qpa/qplatformsystemtrayicon.h diff --git a/include/QtGui/5.15.3/QtGui/qpa/qplatformtheme.h b/include/QtGui/5.15.8/QtGui/qpa/qplatformtheme.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/qpa/qplatformtheme.h rename to include/QtGui/5.15.8/QtGui/qpa/qplatformtheme.h diff --git a/include/QtGui/5.15.3/QtGui/qpa/qplatformtheme_p.h b/include/QtGui/5.15.8/QtGui/qpa/qplatformtheme_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/qpa/qplatformtheme_p.h rename to include/QtGui/5.15.8/QtGui/qpa/qplatformtheme_p.h diff --git a/include/QtGui/5.15.3/QtGui/qpa/qplatformthemefactory_p.h b/include/QtGui/5.15.8/QtGui/qpa/qplatformthemefactory_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/qpa/qplatformthemefactory_p.h rename to include/QtGui/5.15.8/QtGui/qpa/qplatformthemefactory_p.h diff --git a/include/QtGui/5.15.3/QtGui/qpa/qplatformthemeplugin.h b/include/QtGui/5.15.8/QtGui/qpa/qplatformthemeplugin.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/qpa/qplatformthemeplugin.h rename to include/QtGui/5.15.8/QtGui/qpa/qplatformthemeplugin.h diff --git a/include/QtGui/5.15.3/QtGui/qpa/qplatformvulkaninstance.h b/include/QtGui/5.15.8/QtGui/qpa/qplatformvulkaninstance.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/qpa/qplatformvulkaninstance.h rename to include/QtGui/5.15.8/QtGui/qpa/qplatformvulkaninstance.h diff --git a/include/QtGui/5.15.3/QtGui/qpa/qplatformwindow.h b/include/QtGui/5.15.8/QtGui/qpa/qplatformwindow.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/qpa/qplatformwindow.h rename to include/QtGui/5.15.8/QtGui/qpa/qplatformwindow.h diff --git a/include/QtGui/5.15.3/QtGui/qpa/qplatformwindow_p.h b/include/QtGui/5.15.8/QtGui/qpa/qplatformwindow_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/qpa/qplatformwindow_p.h rename to include/QtGui/5.15.8/QtGui/qpa/qplatformwindow_p.h diff --git a/include/QtGui/5.15.3/QtGui/qpa/qwindowsysteminterface.h b/include/QtGui/5.15.8/QtGui/qpa/qwindowsysteminterface.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/qpa/qwindowsysteminterface.h rename to include/QtGui/5.15.8/QtGui/qpa/qwindowsysteminterface.h diff --git a/include/QtGui/5.15.3/QtGui/qpa/qwindowsysteminterface_p.h b/include/QtGui/5.15.8/QtGui/qpa/qwindowsysteminterface_p.h similarity index 100% rename from include/QtGui/5.15.3/QtGui/qpa/qwindowsysteminterface_p.h rename to include/QtGui/5.15.8/QtGui/qpa/qwindowsysteminterface_p.h diff --git a/include/QtGui/headers.pri b/include/QtGui/headers.pri index 4619832d..02fa589c 100644 --- a/include/QtGui/headers.pri +++ b/include/QtGui/headers.pri @@ -1,6 +1,6 @@ SYNCQT.HEADER_FILES = accessible/qaccessible.h accessible/qaccessiblebridge.h accessible/qaccessibleobject.h accessible/qaccessibleplugin.h image/qbitmap.h image/qicon.h image/qiconengine.h image/qiconengineplugin.h image/qimage.h image/qimageiohandler.h image/qimagereader.h image/qimagewriter.h image/qmovie.h image/qpicture.h image/qpictureformatplugin.h image/qpixmap.h image/qpixmapcache.h itemmodels/qstandarditemmodel.h kernel/qclipboard.h kernel/qcursor.h kernel/qdrag.h kernel/qevent.h kernel/qgenericplugin.h kernel/qgenericpluginfactory.h kernel/qguiapplication.h kernel/qinputmethod.h kernel/qkeysequence.h kernel/qoffscreensurface.h kernel/qopenglcontext.h kernel/qopenglwindow.h kernel/qpaintdevicewindow.h kernel/qpalette.h kernel/qpixelformat.h kernel/qrasterwindow.h kernel/qscreen.h kernel/qsessionmanager.h kernel/qstylehints.h kernel/qsurface.h kernel/qsurfaceformat.h kernel/qtestsupport_gui.h kernel/qtguiglobal.h kernel/qtouchdevice.h kernel/qwindow.h kernel/qwindowdefs.h kernel/qwindowdefs_win.h math3d/qgenericmatrix.h math3d/qmatrix4x4.h math3d/qquaternion.h math3d/qvector2d.h math3d/qvector3d.h math3d/qvector4d.h opengl/qopengl.h opengl/qopenglbuffer.h opengl/qopengldebug.h opengl/qopengles2ext.h opengl/qopenglext.h opengl/qopenglextrafunctions.h opengl/qopenglframebufferobject.h opengl/qopenglfunctions.h opengl/qopenglfunctions_1_0.h opengl/qopenglfunctions_1_1.h opengl/qopenglfunctions_1_2.h opengl/qopenglfunctions_1_3.h opengl/qopenglfunctions_1_4.h opengl/qopenglfunctions_1_5.h opengl/qopenglfunctions_2_0.h opengl/qopenglfunctions_2_1.h opengl/qopenglfunctions_3_0.h opengl/qopenglfunctions_3_1.h opengl/qopenglfunctions_3_2_compatibility.h opengl/qopenglfunctions_3_2_core.h opengl/qopenglfunctions_3_3_compatibility.h opengl/qopenglfunctions_3_3_core.h opengl/qopenglfunctions_4_0_compatibility.h opengl/qopenglfunctions_4_0_core.h opengl/qopenglfunctions_4_1_compatibility.h opengl/qopenglfunctions_4_1_core.h opengl/qopenglfunctions_4_2_compatibility.h opengl/qopenglfunctions_4_2_core.h opengl/qopenglfunctions_4_3_compatibility.h opengl/qopenglfunctions_4_3_core.h opengl/qopenglfunctions_4_4_compatibility.h opengl/qopenglfunctions_4_4_core.h opengl/qopenglfunctions_4_5_compatibility.h opengl/qopenglfunctions_4_5_core.h opengl/qopenglfunctions_es2.h opengl/qopenglpaintdevice.h opengl/qopenglpixeltransferoptions.h opengl/qopenglshaderprogram.h opengl/qopengltexture.h opengl/qopengltextureblitter.h opengl/qopengltimerquery.h opengl/qopenglversionfunctions.h opengl/qopenglvertexarrayobject.h painting/qbackingstore.h painting/qbrush.h painting/qcolor.h painting/qcolorspace.h painting/qcolortransform.h painting/qmatrix.h painting/qpagedpaintdevice.h painting/qpagelayout.h painting/qpagesize.h painting/qpaintdevice.h painting/qpaintengine.h painting/qpainter.h painting/qpainterpath.h painting/qpdfwriter.h painting/qpen.h painting/qpolygon.h painting/qregion.h painting/qrgb.h painting/qrgba64.h painting/qtransform.h text/qabstracttextdocumentlayout.h text/qfont.h text/qfontdatabase.h text/qfontinfo.h text/qfontmetrics.h text/qglyphrun.h text/qrawfont.h text/qstatictext.h text/qsyntaxhighlighter.h text/qtextcursor.h text/qtextdocument.h text/qtextdocumentfragment.h text/qtextdocumentwriter.h text/qtextformat.h text/qtextlayout.h text/qtextlist.h text/qtextobject.h text/qtextoption.h text/qtexttable.h util/qdesktopservices.h util/qvalidator.h vulkan/qvulkaninstance.h vulkan/qvulkanwindow.h -SYNCQT.GENERATED_HEADER_FILES = QAccessible QAccessibleInterface QAccessibleTextInterface QAccessibleEditableTextInterface QAccessibleValueInterface QAccessibleTableCellInterface QAccessibleTableInterface QAccessibleActionInterface QAccessibleImageInterface QAccessibleEvent QAccessibleStateChangeEvent QAccessibleTextCursorEvent QAccessibleTextSelectionEvent QAccessibleTextInsertEvent QAccessibleTextRemoveEvent QAccessibleTextUpdateEvent QAccessibleValueChangeEvent QAccessibleTableModelChangeEvent QAccessibleBridge QAccessibleBridgePlugin QAccessibleObject QAccessibleApplication QAccessiblePlugin QBitmap QIcon QIconEngine QIconEngineV2 QIconEnginePlugin QImageTextKeyLang QImageCleanupFunction QImage QImageIOHandler QImageIOPlugin QImageReader QImageWriter QMovie QPicture QPictureIO QPictureFormatPlugin QPixmap QPixmapCache QStandardItem QStandardItemModel QClipboard QCursor QDrag QInputEvent QEnterEvent QMouseEvent QHoverEvent QWheelEvent QTabletEvent QNativeGestureEvent QKeyEvent QFocusEvent QPaintEvent QMoveEvent QExposeEvent QPlatformSurfaceEvent QResizeEvent QCloseEvent QIconDragEvent QShowEvent QHideEvent QContextMenuEvent QInputMethodEvent QInputMethodQueryEvent QDropEvent QDragMoveEvent QDragEnterEvent QDragLeaveEvent QHelpEvent QStatusTipEvent QWhatsThisClickedEvent QActionEvent QFileOpenEvent QToolBarChangeEvent QShortcutEvent QWindowStateChangeEvent QPointingDeviceUniqueId QTouchEvent QScrollPrepareEvent QScrollEvent QScreenOrientationChangeEvent QApplicationStateChangeEvent QtEvents QGenericPlugin QGenericPluginFactory QGuiApplication QInputMethod QKeySequence QOffscreenSurface QOpenGLVersionProfile QOpenGLContextGroup QOpenGLContext QOpenGLWindow QPaintDeviceWindow QPalette QPixelFormat QRasterWindow QScreen QSessionManager QStyleHints QSurface QSurfaceFormat QTouchDevice QWindow QWidgetList QWindowList QWidgetMapper QWidgetSet QGenericMatrix QMatrix2x2 QMatrix2x3 QMatrix2x4 QMatrix3x2 QMatrix3x3 QMatrix3x4 QMatrix4x2 QMatrix4x3 QMatrix4x4 QQuaternion QVector2D QVector3D QVector4D QOpenGLBuffer QOpenGLDebugMessage QOpenGLDebugLogger QOpenGLExtraFunctions QOpenGLExtraFunctionsPrivate QOpenGLFramebufferObject QOpenGLFramebufferObjectFormat QOpenGLFunctions QOpenGLFunctionsPrivate QOpenGLFunctions_1_0 QOpenGLFunctions_1_1 QOpenGLFunctions_1_2 QOpenGLFunctions_1_3 QOpenGLFunctions_1_4 QOpenGLFunctions_1_5 QOpenGLFunctions_2_0 QOpenGLFunctions_2_1 QOpenGLFunctions_3_0 QOpenGLFunctions_3_1 QOpenGLFunctions_3_2_Compatibility QOpenGLFunctions_3_2_Core QOpenGLFunctions_3_3_Compatibility QOpenGLFunctions_3_3_Core QOpenGLFunctions_4_0_Compatibility QOpenGLFunctions_4_0_Core QOpenGLFunctions_4_1_Compatibility QOpenGLFunctions_4_1_Core QOpenGLFunctions_4_2_Compatibility QOpenGLFunctions_4_2_Core QOpenGLFunctions_4_3_Compatibility QOpenGLFunctions_4_3_Core QOpenGLFunctions_4_4_Compatibility QOpenGLFunctions_4_4_Core QOpenGLFunctions_4_5_Compatibility QOpenGLFunctions_4_5_Core QOpenGLFunctions_ES2 QOpenGLPaintDevice QOpenGLPixelTransferOptions QOpenGLShader QOpenGLShaderProgram QOpenGLTexture QOpenGLTextureBlitter QOpenGLTimerQuery QOpenGLTimeMonitor QOpenGLVersionFunctions QOpenGLVertexArrayObject QBackingStore QBrush QBrushData QGradientStop QGradientStops QGradient QLinearGradient QRadialGradient QConicalGradient QColor QColorSpace QColorTransform QMatrix QPagedPaintDevice QPageLayout QPageSize QPaintDevice QTextItem QPaintEngine QPaintEngineState QPainter QPainterPath QPainterPathStroker QPdfWriter QPen QPolygon QPolygonF QRegion QRgb QRgba64 QTransform QAbstractTextDocumentLayout QTextObjectInterface QFont QFontDatabase QFontInfo QFontMetrics QFontMetricsF QGlyphRun QRawFont QStaticText QSyntaxHighlighter QTextCursor QAbstractUndoItem QTextDocument QTextDocumentFragment QTextDocumentWriter QTextLength QTextFormat QTextCharFormat QTextBlockFormat QTextListFormat QTextImageFormat QTextFrameFormat QTextTableFormat QTextTableCellFormat QTextInlineObject QTextLayout QTextLine QTextList QTextObject QTextBlockGroup QTextFrameLayoutData QTextFrame QTextBlockUserData QTextBlock QTextFragment QTextOption QTextTableCell QTextTable QDesktopServices QValidator QIntValidator QDoubleValidator QRegExpValidator QRegularExpressionValidator QVulkanLayer QVulkanExtension QVulkanInfoVector QVulkanInstance QVulkanWindowRenderer QVulkanWindow QGenericPluginFactory QGenericPlugin qtguiversion.h QtGuiVersion QtGui +SYNCQT.GENERATED_HEADER_FILES = QAccessible QAccessibleInterface QAccessibleTextInterface QAccessibleEditableTextInterface QAccessibleValueInterface QAccessibleTableCellInterface QAccessibleTableInterface QAccessibleActionInterface QAccessibleImageInterface QAccessibleEvent QAccessibleStateChangeEvent QAccessibleTextCursorEvent QAccessibleTextSelectionEvent QAccessibleTextInsertEvent QAccessibleTextRemoveEvent QAccessibleTextUpdateEvent QAccessibleValueChangeEvent QAccessibleTableModelChangeEvent QAccessibleBridge QAccessibleBridgePlugin QAccessibleObject QAccessibleApplication QAccessiblePlugin QBitmap QIcon QIconEngine QIconEngineV2 QIconEnginePlugin QImageTextKeyLang QImageCleanupFunction QImage QImageIOHandler QImageIOPlugin QImageReader QImageWriter QMovie QPicture QPictureIO QPictureFormatPlugin QPixmap QPixmapCache QStandardItem QStandardItemModel QClipboard QCursor QDrag QInputEvent QEnterEvent QMouseEvent QHoverEvent QWheelEvent QTabletEvent QNativeGestureEvent QKeyEvent QFocusEvent QPaintEvent QMoveEvent QExposeEvent QPlatformSurfaceEvent QResizeEvent QCloseEvent QIconDragEvent QShowEvent QHideEvent QContextMenuEvent QInputMethodEvent QInputMethodQueryEvent QDropEvent QDragMoveEvent QDragEnterEvent QDragLeaveEvent QHelpEvent QStatusTipEvent QWhatsThisClickedEvent QActionEvent QFileOpenEvent QToolBarChangeEvent QShortcutEvent QWindowStateChangeEvent QPointingDeviceUniqueId QTouchEvent QScrollPrepareEvent QScrollEvent QScreenOrientationChangeEvent QApplicationStateChangeEvent QtEvents QGenericPlugin QGenericPluginFactory QGuiApplication QInputMethod QKeySequence QOffscreenSurface QOpenGLVersionProfile QOpenGLContextGroup QOpenGLContext QOpenGLWindow QPaintDeviceWindow QPalette QPixelFormat QRasterWindow QScreen QSessionManager QStyleHints QSurface QSurfaceFormat QTouchDevice QWindow QWidgetList QWindowList QWidgetMapper QWidgetSet QGenericMatrix QMatrix2x2 QMatrix2x3 QMatrix2x4 QMatrix3x2 QMatrix3x3 QMatrix3x4 QMatrix4x2 QMatrix4x3 QMatrix4x4 QQuaternion QVector2D QVector3D QVector4D QOpenGLBuffer QOpenGLDebugMessage QOpenGLDebugLogger QOpenGLExtraFunctions QOpenGLExtraFunctionsPrivate QOpenGLFramebufferObject QOpenGLFramebufferObjectFormat QOpenGLFunctions QOpenGLFunctionsPrivate QOpenGLFunctions_1_0 QOpenGLFunctions_1_1 QOpenGLFunctions_1_2 QOpenGLFunctions_1_3 QOpenGLFunctions_1_4 QOpenGLFunctions_1_5 QOpenGLFunctions_2_0 QOpenGLFunctions_2_1 QOpenGLFunctions_3_0 QOpenGLFunctions_3_1 QOpenGLFunctions_3_2_Compatibility QOpenGLFunctions_3_2_Core QOpenGLFunctions_3_3_Compatibility QOpenGLFunctions_3_3_Core QOpenGLFunctions_4_0_Compatibility QOpenGLFunctions_4_0_Core QOpenGLFunctions_4_1_Compatibility QOpenGLFunctions_4_1_Core QOpenGLFunctions_4_2_Compatibility QOpenGLFunctions_4_2_Core QOpenGLFunctions_4_3_Compatibility QOpenGLFunctions_4_3_Core QOpenGLFunctions_4_4_Compatibility QOpenGLFunctions_4_4_Core QOpenGLFunctions_4_5_Compatibility QOpenGLFunctions_4_5_Core QOpenGLFunctions_ES2 QOpenGLPaintDevice QOpenGLPixelTransferOptions QOpenGLShader QOpenGLShaderProgram QOpenGLTexture QOpenGLTextureBlitter QOpenGLTimerQuery QOpenGLTimeMonitor QOpenGLVersionFunctions QOpenGLVertexArrayObject QBackingStore QBrush QBrushData QGradientStop QGradientStops QGradient QLinearGradient QRadialGradient QConicalGradient QColor QColorSpace QColorTransform QMatrix QPagedPaintDevice QPageLayout QPageSize QPaintDevice QTextItem QPaintEngine QPaintEngineState QPainter QPainterPath QPainterPathStroker QPdfWriter QPen QPolygon QPolygonF QRegion QRgb QRgba64 QTransform QAbstractTextDocumentLayout QTextObjectInterface QFont QFontDatabase QFontInfo QFontMetrics QFontMetricsF QGlyphRun QRawFont QStaticText QSyntaxHighlighter QTextCursor QAbstractUndoItem QTextDocument QTextDocumentFragment QTextDocumentWriter QTextLength QTextFormat QTextCharFormat QTextBlockFormat QTextListFormat QTextImageFormat QTextFrameFormat QTextTableFormat QTextTableCellFormat QTextInlineObject QTextLayout QTextLine QTextList QTextObject QTextBlockGroup QTextFrameLayoutData QTextFrame QTextBlockUserData QTextBlock QTextFragment QTextOption QTextTableCell QTextTable QDesktopServices QValidator QIntValidator QDoubleValidator QRegExpValidator QRegularExpressionValidator QVulkanLayer QVulkanExtension QVulkanInfoVector QVulkanInstance QVulkanWindowRenderer QVulkanWindow QGenericPlugin QGenericPluginFactory qtguiversion.h QtGuiVersion QtGui SYNCQT.PRIVATE_HEADER_FILES = accessible/qaccessiblecache_p.h image/qbmphandler_p.h image/qicon_p.h image/qiconloader_p.h image/qimage_p.h image/qimagepixmapcleanuphooks_p.h image/qimagereaderwriterhelpers_p.h image/qpaintengine_pic_p.h image/qpicture_p.h image/qpixmap_blitter_p.h image/qpixmap_raster_p.h image/qpixmapcache_p.h image/qpnghandler_p.h image/qppmhandler_p.h image/qxbmhandler_p.h image/qxpmhandler_p.h itemmodels/qstandarditemmodel_p.h kernel/qcursor_p.h kernel/qdnd_p.h kernel/qevent_p.h kernel/qguiapplication_p.h kernel/qhighdpiscaling_p.h kernel/qinputdevicemanager_p.h kernel/qinputdevicemanager_p_p.h kernel/qinputmethod_p.h kernel/qinternalmimedata_p.h kernel/qkeymapper_p.h kernel/qkeysequence_p.h kernel/qopenglcontext_p.h kernel/qpaintdevicewindow_p.h kernel/qscreen_p.h kernel/qsessionmanager_p.h kernel/qshapedpixmapdndwindow_p.h kernel/qshortcutmap_p.h kernel/qsimpledrag_p.h kernel/qt_gui_pch.h kernel/qtguiglobal_p.h kernel/qtouchdevice_p.h kernel/qwindow_p.h opengl/qopengl2pexvertexarray_p.h opengl/qopengl_p.h opengl/qopenglcustomshaderstage_p.h opengl/qopenglengineshadermanager_p.h opengl/qopenglengineshadersource_p.h opengl/qopenglextensions_p.h opengl/qopenglframebufferobject_p.h opengl/qopenglgradientcache_p.h opengl/qopenglpaintdevice_p.h opengl/qopenglpaintengine_p.h opengl/qopenglprogrambinarycache_p.h opengl/qopenglqueryhelper_p.h opengl/qopenglshadercache_p.h opengl/qopengltexture_p.h opengl/qopengltexturecache_p.h opengl/qopengltextureglyphcache_p.h opengl/qopengltexturehelper_p.h opengl/qopengltextureuploader_p.h opengl/qopenglversionfunctionsfactory_p.h opengl/qopenglvertexarrayobject_p.h painting/qbezier_p.h painting/qblendfunctions_p.h painting/qblittable_p.h painting/qcolor_p.h painting/qcolormatrix_p.h painting/qcolorspace_p.h painting/qcolortransferfunction_p.h painting/qcolortransfertable_p.h painting/qcolortransform_p.h painting/qcolortrc_p.h painting/qcolortrclut_p.h painting/qcoregraphics_p.h painting/qcosmeticstroker_p.h painting/qcssutil_p.h painting/qdatabuffer_p.h painting/qdrawhelper_mips_dsp_p.h painting/qdrawhelper_neon_p.h painting/qdrawhelper_p.h painting/qdrawhelper_x86_p.h painting/qdrawingprimitive_sse2_p.h painting/qemulationpaintengine_p.h painting/qfixed_p.h painting/qgrayraster_p.h painting/qicc_p.h painting/qimagescale_p.h painting/qmath_p.h painting/qmemrotate_p.h painting/qoutlinemapper_p.h painting/qpagedpaintdevice_p.h painting/qpaintengine_blitter_p.h painting/qpaintengine_p.h painting/qpaintengine_raster_p.h painting/qpaintengineex_p.h painting/qpainter_p.h painting/qpainterpath_p.h painting/qpathclipper_p.h painting/qpathsimplifier_p.h painting/qpdf_p.h painting/qpen_p.h painting/qpolygonclipper_p.h painting/qrasterdefs_p.h painting/qrasterizer_p.h painting/qrbtree_p.h painting/qrgba64_p.h painting/qstroker_p.h painting/qt_mips_asm_dsp_p.h painting/qtextureglyphcache_p.h painting/qtriangulatingstroker_p.h painting/qtriangulator_p.h painting/qvectorpath_p.h rhi/cs_tdr_p.h rhi/qrhi_p.h rhi/qrhi_p_p.h rhi/qrhid3d11_p.h rhi/qrhid3d11_p_p.h rhi/qrhigles2_p.h rhi/qrhigles2_p_p.h rhi/qrhimetal_p.h rhi/qrhimetal_p_p.h rhi/qrhinull_p.h rhi/qrhinull_p_p.h rhi/qrhiprofiler_p.h rhi/qrhiprofiler_p_p.h rhi/qrhivulkan_p.h rhi/qrhivulkan_p_p.h rhi/qrhivulkanext_p.h rhi/qshader_p.h rhi/qshader_p_p.h rhi/qshaderdescription_p.h rhi/qshaderdescription_p_p.h text/qabstracttextdocumentlayout_p.h text/qcssparser_p.h text/qdistancefield_p.h text/qfont_p.h text/qfontengine_p.h text/qfontengine_qpf2_p.h text/qfontengineglyphcache_p.h text/qfontsubset_p.h text/qfragmentmap_p.h text/qglyphrun_p.h text/qharfbuzzng_p.h text/qinputcontrol_p.h text/qrawfont_p.h text/qstatictext_p.h text/qtextcursor_p.h text/qtextdocument_p.h text/qtextdocumentfragment_p.h text/qtextdocumentlayout_p.h text/qtextengine_p.h text/qtextformat_p.h text/qtexthtmlparser_p.h text/qtextimagehandler_p.h text/qtextmarkdownimporter_p.h text/qtextmarkdownwriter_p.h text/qtextobject_p.h text/qtextodfwriter_p.h text/qtexttable_p.h text/qzipreader_p.h text/qzipwriter_p.h util/qabstractlayoutstyleinfo_p.h util/qastchandler_p.h util/qgridlayoutengine_p.h util/qhexstring_p.h util/qktxhandler_p.h util/qlayoutpolicy_p.h util/qpkmhandler_p.h util/qshaderformat_p.h util/qshadergenerator_p.h util/qshadergraph_p.h util/qshadergraphloader_p.h util/qshaderlanguage_p.h util/qshadernode_p.h util/qshadernodeport_p.h util/qshadernodesloader_p.h util/qtexturefiledata_p.h util/qtexturefilehandler_p.h util/qtexturefilereader_p.h vulkan/qvulkanwindow_p.h platform/wasm/qwasmlocalfileaccess_p.h SYNCQT.QPA_HEADER_FILES = accessible/qplatformaccessibility.h image/qplatformpixmap.h kernel/qplatformclipboard.h kernel/qplatformcursor.h kernel/qplatformdialoghelper.h kernel/qplatformdrag.h kernel/qplatformgraphicsbuffer.h kernel/qplatformgraphicsbufferhelper.h kernel/qplatforminputcontext.h kernel/qplatforminputcontext_p.h kernel/qplatforminputcontextfactory_p.h kernel/qplatforminputcontextplugin_p.h kernel/qplatformintegration.h kernel/qplatformintegrationfactory_p.h kernel/qplatformintegrationplugin.h kernel/qplatformmenu.h kernel/qplatformnativeinterface.h kernel/qplatformoffscreensurface.h kernel/qplatformopenglcontext.h kernel/qplatformscreen.h kernel/qplatformscreen_p.h kernel/qplatformservices.h kernel/qplatformsessionmanager.h kernel/qplatformsharedgraphicscache.h kernel/qplatformsurface.h kernel/qplatformsystemtrayicon.h kernel/qplatformtheme.h kernel/qplatformtheme_p.h kernel/qplatformthemefactory_p.h kernel/qplatformthemeplugin.h kernel/qplatformwindow.h kernel/qplatformwindow_p.h kernel/qwindowsysteminterface.h kernel/qwindowsysteminterface_p.h painting/qplatformbackingstore.h text/qplatformfontdatabase.h vulkan/qplatformvulkaninstance.h SYNCQT.CLEAN_HEADER_FILES = accessible/qaccessible.h accessible/qaccessiblebridge.h accessible/qaccessibleobject.h accessible/qaccessibleplugin.h image/qbitmap.h image/qicon.h image/qiconengine.h image/qiconengineplugin.h image/qimage.h image/qimageiohandler.h image/qimagereader.h image/qimagewriter.h image/qmovie.h:movie image/qpicture.h image/qpictureformatplugin.h image/qpixmap.h image/qpixmapcache.h itemmodels/qstandarditemmodel.h:standarditemmodel kernel/qclipboard.h kernel/qcursor.h kernel/qdrag.h:draganddrop kernel/qevent.h kernel/qgenericplugin.h kernel/qgenericpluginfactory.h kernel/qguiapplication.h kernel/qinputmethod.h kernel/qkeysequence.h kernel/qoffscreensurface.h kernel/qopenglcontext.h kernel/qopenglwindow.h kernel/qpaintdevicewindow.h kernel/qpalette.h kernel/qpixelformat.h kernel/qrasterwindow.h kernel/qscreen.h kernel/qsessionmanager.h kernel/qstylehints.h kernel/qsurface.h kernel/qsurfaceformat.h kernel/qtestsupport_gui.h kernel/qtguiglobal.h kernel/qtouchdevice.h kernel/qwindow.h kernel/qwindowdefs.h kernel/qwindowdefs_win.h math3d/qgenericmatrix.h math3d/qmatrix4x4.h math3d/qquaternion.h math3d/qvector2d.h math3d/qvector3d.h math3d/qvector4d.h opengl/qopengl.h opengl/qopenglbuffer.h opengl/qopengldebug.h opengl/qopenglextrafunctions.h opengl/qopenglframebufferobject.h opengl/qopenglfunctions.h opengl/qopenglfunctions_1_0.h opengl/qopenglfunctions_1_1.h opengl/qopenglfunctions_1_2.h opengl/qopenglfunctions_1_3.h opengl/qopenglfunctions_1_4.h opengl/qopenglfunctions_1_5.h opengl/qopenglfunctions_2_0.h opengl/qopenglfunctions_2_1.h opengl/qopenglfunctions_3_0.h opengl/qopenglfunctions_3_1.h opengl/qopenglfunctions_3_2_compatibility.h opengl/qopenglfunctions_3_2_core.h opengl/qopenglfunctions_3_3_compatibility.h opengl/qopenglfunctions_3_3_core.h opengl/qopenglfunctions_4_0_compatibility.h opengl/qopenglfunctions_4_0_core.h opengl/qopenglfunctions_4_1_compatibility.h opengl/qopenglfunctions_4_1_core.h opengl/qopenglfunctions_4_2_compatibility.h opengl/qopenglfunctions_4_2_core.h opengl/qopenglfunctions_4_3_compatibility.h opengl/qopenglfunctions_4_3_core.h opengl/qopenglfunctions_4_4_compatibility.h opengl/qopenglfunctions_4_4_core.h opengl/qopenglfunctions_4_5_compatibility.h opengl/qopenglfunctions_4_5_core.h opengl/qopenglfunctions_es2.h opengl/qopenglpaintdevice.h opengl/qopenglpixeltransferoptions.h opengl/qopenglshaderprogram.h opengl/qopengltexture.h opengl/qopengltextureblitter.h opengl/qopengltimerquery.h opengl/qopenglversionfunctions.h opengl/qopenglvertexarrayobject.h painting/qbackingstore.h painting/qbrush.h painting/qcolor.h painting/qcolorspace.h painting/qcolortransform.h painting/qmatrix.h painting/qpagedpaintdevice.h painting/qpagelayout.h painting/qpagesize.h painting/qpaintdevice.h painting/qpaintengine.h painting/qpainter.h painting/qpainterpath.h painting/qpdfwriter.h painting/qpen.h painting/qpolygon.h painting/qregion.h painting/qrgb.h painting/qrgba64.h painting/qtransform.h text/qabstracttextdocumentlayout.h text/qfont.h text/qfontdatabase.h text/qfontinfo.h text/qfontmetrics.h text/qglyphrun.h text/qrawfont.h text/qstatictext.h text/qsyntaxhighlighter.h text/qtextcursor.h text/qtextdocument.h text/qtextdocumentfragment.h text/qtextdocumentwriter.h text/qtextformat.h text/qtextlayout.h text/qtextlist.h text/qtextobject.h text/qtextoption.h text/qtexttable.h util/qdesktopservices.h util/qvalidator.h vulkan/qvulkaninstance.h vulkan/qvulkanwindow.h -SYNCQT.INJECTIONS = src/gui/vulkan/qvulkanfunctions.h:^qvulkanfunctions.h:QVulkanFunctions:QVulkanDeviceFunctions src/gui/vulkan/qvulkanfunctions_p.h:^5.15.3/QtGui/private/qvulkanfunctions_p.h +SYNCQT.INJECTIONS = src/gui/vulkan/qvulkanfunctions.h:^qvulkanfunctions.h:QVulkanFunctions:QVulkanDeviceFunctions src/gui/vulkan/qvulkanfunctions_p.h:^5.15.8/QtGui/private/qvulkanfunctions_p.h diff --git a/include/QtGui/qtguiversion.h b/include/QtGui/qtguiversion.h index 4ca2410a..0de07bae 100644 --- a/include/QtGui/qtguiversion.h +++ b/include/QtGui/qtguiversion.h @@ -2,8 +2,8 @@ #ifndef QT_QTGUI_VERSION_H #define QT_QTGUI_VERSION_H -#define QTGUI_VERSION_STR "5.15.3" +#define QTGUI_VERSION_STR "5.15.8" -#define QTGUI_VERSION 0x050F03 +#define QTGUI_VERSION 0x050F08 #endif // QT_QTGUI_VERSION_H diff --git a/include/QtInputSupport/5.15.3/QtInputSupport/private/devicehandlerlist_p.h b/include/QtInputSupport/5.15.8/QtInputSupport/private/devicehandlerlist_p.h similarity index 100% rename from include/QtInputSupport/5.15.3/QtInputSupport/private/devicehandlerlist_p.h rename to include/QtInputSupport/5.15.8/QtInputSupport/private/devicehandlerlist_p.h diff --git a/include/QtInputSupport/5.15.3/QtInputSupport/private/qevdevkeyboard_defaultmap_p.h b/include/QtInputSupport/5.15.8/QtInputSupport/private/qevdevkeyboard_defaultmap_p.h similarity index 100% rename from include/QtInputSupport/5.15.3/QtInputSupport/private/qevdevkeyboard_defaultmap_p.h rename to include/QtInputSupport/5.15.8/QtInputSupport/private/qevdevkeyboard_defaultmap_p.h diff --git a/include/QtInputSupport/5.15.3/QtInputSupport/private/qevdevkeyboardhandler_p.h b/include/QtInputSupport/5.15.8/QtInputSupport/private/qevdevkeyboardhandler_p.h similarity index 100% rename from include/QtInputSupport/5.15.3/QtInputSupport/private/qevdevkeyboardhandler_p.h rename to include/QtInputSupport/5.15.8/QtInputSupport/private/qevdevkeyboardhandler_p.h diff --git a/include/QtInputSupport/5.15.3/QtInputSupport/private/qevdevkeyboardmanager_p.h b/include/QtInputSupport/5.15.8/QtInputSupport/private/qevdevkeyboardmanager_p.h similarity index 100% rename from include/QtInputSupport/5.15.3/QtInputSupport/private/qevdevkeyboardmanager_p.h rename to include/QtInputSupport/5.15.8/QtInputSupport/private/qevdevkeyboardmanager_p.h diff --git a/include/QtInputSupport/5.15.3/QtInputSupport/private/qevdevmousehandler_p.h b/include/QtInputSupport/5.15.8/QtInputSupport/private/qevdevmousehandler_p.h similarity index 100% rename from include/QtInputSupport/5.15.3/QtInputSupport/private/qevdevmousehandler_p.h rename to include/QtInputSupport/5.15.8/QtInputSupport/private/qevdevmousehandler_p.h diff --git a/include/QtInputSupport/5.15.3/QtInputSupport/private/qevdevmousemanager_p.h b/include/QtInputSupport/5.15.8/QtInputSupport/private/qevdevmousemanager_p.h similarity index 100% rename from include/QtInputSupport/5.15.3/QtInputSupport/private/qevdevmousemanager_p.h rename to include/QtInputSupport/5.15.8/QtInputSupport/private/qevdevmousemanager_p.h diff --git a/include/QtInputSupport/5.15.3/QtInputSupport/private/qevdevtablethandler_p.h b/include/QtInputSupport/5.15.8/QtInputSupport/private/qevdevtablethandler_p.h similarity index 100% rename from include/QtInputSupport/5.15.3/QtInputSupport/private/qevdevtablethandler_p.h rename to include/QtInputSupport/5.15.8/QtInputSupport/private/qevdevtablethandler_p.h diff --git a/include/QtInputSupport/5.15.3/QtInputSupport/private/qevdevtabletmanager_p.h b/include/QtInputSupport/5.15.8/QtInputSupport/private/qevdevtabletmanager_p.h similarity index 100% rename from include/QtInputSupport/5.15.3/QtInputSupport/private/qevdevtabletmanager_p.h rename to include/QtInputSupport/5.15.8/QtInputSupport/private/qevdevtabletmanager_p.h diff --git a/include/QtInputSupport/5.15.3/QtInputSupport/private/qevdevtouchfilter_p.h b/include/QtInputSupport/5.15.8/QtInputSupport/private/qevdevtouchfilter_p.h similarity index 100% rename from include/QtInputSupport/5.15.3/QtInputSupport/private/qevdevtouchfilter_p.h rename to include/QtInputSupport/5.15.8/QtInputSupport/private/qevdevtouchfilter_p.h diff --git a/include/QtInputSupport/5.15.3/QtInputSupport/private/qevdevtouchhandler_p.h b/include/QtInputSupport/5.15.8/QtInputSupport/private/qevdevtouchhandler_p.h similarity index 100% rename from include/QtInputSupport/5.15.3/QtInputSupport/private/qevdevtouchhandler_p.h rename to include/QtInputSupport/5.15.8/QtInputSupport/private/qevdevtouchhandler_p.h diff --git a/include/QtInputSupport/5.15.3/QtInputSupport/private/qevdevtouchmanager_p.h b/include/QtInputSupport/5.15.8/QtInputSupport/private/qevdevtouchmanager_p.h similarity index 100% rename from include/QtInputSupport/5.15.3/QtInputSupport/private/qevdevtouchmanager_p.h rename to include/QtInputSupport/5.15.8/QtInputSupport/private/qevdevtouchmanager_p.h diff --git a/include/QtInputSupport/5.15.3/QtInputSupport/private/qevdevutil_p.h b/include/QtInputSupport/5.15.8/QtInputSupport/private/qevdevutil_p.h similarity index 100% rename from include/QtInputSupport/5.15.3/QtInputSupport/private/qevdevutil_p.h rename to include/QtInputSupport/5.15.8/QtInputSupport/private/qevdevutil_p.h diff --git a/include/QtInputSupport/5.15.3/QtInputSupport/private/qlibinputhandler_p.h b/include/QtInputSupport/5.15.8/QtInputSupport/private/qlibinputhandler_p.h similarity index 100% rename from include/QtInputSupport/5.15.3/QtInputSupport/private/qlibinputhandler_p.h rename to include/QtInputSupport/5.15.8/QtInputSupport/private/qlibinputhandler_p.h diff --git a/include/QtInputSupport/5.15.3/QtInputSupport/private/qlibinputkeyboard_p.h b/include/QtInputSupport/5.15.8/QtInputSupport/private/qlibinputkeyboard_p.h similarity index 100% rename from include/QtInputSupport/5.15.3/QtInputSupport/private/qlibinputkeyboard_p.h rename to include/QtInputSupport/5.15.8/QtInputSupport/private/qlibinputkeyboard_p.h diff --git a/include/QtInputSupport/5.15.3/QtInputSupport/private/qlibinputpointer_p.h b/include/QtInputSupport/5.15.8/QtInputSupport/private/qlibinputpointer_p.h similarity index 100% rename from include/QtInputSupport/5.15.3/QtInputSupport/private/qlibinputpointer_p.h rename to include/QtInputSupport/5.15.8/QtInputSupport/private/qlibinputpointer_p.h diff --git a/include/QtInputSupport/5.15.3/QtInputSupport/private/qlibinputtouch_p.h b/include/QtInputSupport/5.15.8/QtInputSupport/private/qlibinputtouch_p.h similarity index 100% rename from include/QtInputSupport/5.15.3/QtInputSupport/private/qlibinputtouch_p.h rename to include/QtInputSupport/5.15.8/QtInputSupport/private/qlibinputtouch_p.h diff --git a/include/QtInputSupport/5.15.3/QtInputSupport/private/qtouchoutputmapping_p.h b/include/QtInputSupport/5.15.8/QtInputSupport/private/qtouchoutputmapping_p.h similarity index 100% rename from include/QtInputSupport/5.15.3/QtInputSupport/private/qtouchoutputmapping_p.h rename to include/QtInputSupport/5.15.8/QtInputSupport/private/qtouchoutputmapping_p.h diff --git a/include/QtInputSupport/5.15.3/QtInputSupport/private/qtslib_p.h b/include/QtInputSupport/5.15.8/QtInputSupport/private/qtslib_p.h similarity index 100% rename from include/QtInputSupport/5.15.3/QtInputSupport/private/qtslib_p.h rename to include/QtInputSupport/5.15.8/QtInputSupport/private/qtslib_p.h diff --git a/include/QtInputSupport/5.15.3/QtInputSupport/private/qxkbcommon_p.h b/include/QtInputSupport/5.15.8/QtInputSupport/private/qxkbcommon_p.h similarity index 100% rename from include/QtInputSupport/5.15.3/QtInputSupport/private/qxkbcommon_p.h rename to include/QtInputSupport/5.15.8/QtInputSupport/private/qxkbcommon_p.h diff --git a/include/QtInputSupport/qtinputsupportversion.h b/include/QtInputSupport/qtinputsupportversion.h index cc31fec5..d2863ff0 100644 --- a/include/QtInputSupport/qtinputsupportversion.h +++ b/include/QtInputSupport/qtinputsupportversion.h @@ -2,8 +2,8 @@ #ifndef QT_QTINPUTSUPPORT_VERSION_H #define QT_QTINPUTSUPPORT_VERSION_H -#define QTINPUTSUPPORT_VERSION_STR "5.15.3" +#define QTINPUTSUPPORT_VERSION_STR "5.15.8" -#define QTINPUTSUPPORT_VERSION 0x050F03 +#define QTINPUTSUPPORT_VERSION 0x050F08 #endif // QT_QTINPUTSUPPORT_VERSION_H diff --git a/include/QtKmsSupport/5.15.3/QtKmsSupport/private/qkmsdevice_p.h b/include/QtKmsSupport/5.15.8/QtKmsSupport/private/qkmsdevice_p.h similarity index 100% rename from include/QtKmsSupport/5.15.3/QtKmsSupport/private/qkmsdevice_p.h rename to include/QtKmsSupport/5.15.8/QtKmsSupport/private/qkmsdevice_p.h diff --git a/include/QtKmsSupport/qtkmssupportversion.h b/include/QtKmsSupport/qtkmssupportversion.h index 1bcc128d..5fc6aab7 100644 --- a/include/QtKmsSupport/qtkmssupportversion.h +++ b/include/QtKmsSupport/qtkmssupportversion.h @@ -2,8 +2,8 @@ #ifndef QT_QTKMSSUPPORT_VERSION_H #define QT_QTKMSSUPPORT_VERSION_H -#define QTKMSSUPPORT_VERSION_STR "5.15.3" +#define QTKMSSUPPORT_VERSION_STR "5.15.8" -#define QTKMSSUPPORT_VERSION 0x050F03 +#define QTKMSSUPPORT_VERSION 0x050F08 #endif // QT_QTKMSSUPPORT_VERSION_H diff --git a/include/QtLinuxAccessibilitySupport/5.15.3/QtLinuxAccessibilitySupport/private/application_p.h b/include/QtLinuxAccessibilitySupport/5.15.8/QtLinuxAccessibilitySupport/private/application_p.h similarity index 100% rename from include/QtLinuxAccessibilitySupport/5.15.3/QtLinuxAccessibilitySupport/private/application_p.h rename to include/QtLinuxAccessibilitySupport/5.15.8/QtLinuxAccessibilitySupport/private/application_p.h diff --git a/include/QtLinuxAccessibilitySupport/5.15.3/QtLinuxAccessibilitySupport/private/atspiadaptor_p.h b/include/QtLinuxAccessibilitySupport/5.15.8/QtLinuxAccessibilitySupport/private/atspiadaptor_p.h similarity index 100% rename from include/QtLinuxAccessibilitySupport/5.15.3/QtLinuxAccessibilitySupport/private/atspiadaptor_p.h rename to include/QtLinuxAccessibilitySupport/5.15.8/QtLinuxAccessibilitySupport/private/atspiadaptor_p.h diff --git a/include/QtLinuxAccessibilitySupport/5.15.3/QtLinuxAccessibilitySupport/private/bridge_p.h b/include/QtLinuxAccessibilitySupport/5.15.8/QtLinuxAccessibilitySupport/private/bridge_p.h similarity index 100% rename from include/QtLinuxAccessibilitySupport/5.15.3/QtLinuxAccessibilitySupport/private/bridge_p.h rename to include/QtLinuxAccessibilitySupport/5.15.8/QtLinuxAccessibilitySupport/private/bridge_p.h diff --git a/include/QtLinuxAccessibilitySupport/5.15.3/QtLinuxAccessibilitySupport/private/cache_p.h b/include/QtLinuxAccessibilitySupport/5.15.8/QtLinuxAccessibilitySupport/private/cache_p.h similarity index 100% rename from include/QtLinuxAccessibilitySupport/5.15.3/QtLinuxAccessibilitySupport/private/cache_p.h rename to include/QtLinuxAccessibilitySupport/5.15.8/QtLinuxAccessibilitySupport/private/cache_p.h diff --git a/include/QtLinuxAccessibilitySupport/5.15.3/QtLinuxAccessibilitySupport/private/constant_mappings_p.h b/include/QtLinuxAccessibilitySupport/5.15.8/QtLinuxAccessibilitySupport/private/constant_mappings_p.h similarity index 100% rename from include/QtLinuxAccessibilitySupport/5.15.3/QtLinuxAccessibilitySupport/private/constant_mappings_p.h rename to include/QtLinuxAccessibilitySupport/5.15.8/QtLinuxAccessibilitySupport/private/constant_mappings_p.h diff --git a/include/QtLinuxAccessibilitySupport/5.15.3/QtLinuxAccessibilitySupport/private/dbusconnection_p.h b/include/QtLinuxAccessibilitySupport/5.15.8/QtLinuxAccessibilitySupport/private/dbusconnection_p.h similarity index 100% rename from include/QtLinuxAccessibilitySupport/5.15.3/QtLinuxAccessibilitySupport/private/dbusconnection_p.h rename to include/QtLinuxAccessibilitySupport/5.15.8/QtLinuxAccessibilitySupport/private/dbusconnection_p.h diff --git a/include/QtLinuxAccessibilitySupport/5.15.3/QtLinuxAccessibilitySupport/private/struct_marshallers_p.h b/include/QtLinuxAccessibilitySupport/5.15.8/QtLinuxAccessibilitySupport/private/struct_marshallers_p.h similarity index 100% rename from include/QtLinuxAccessibilitySupport/5.15.3/QtLinuxAccessibilitySupport/private/struct_marshallers_p.h rename to include/QtLinuxAccessibilitySupport/5.15.8/QtLinuxAccessibilitySupport/private/struct_marshallers_p.h diff --git a/include/QtLinuxAccessibilitySupport/qtlinuxaccessibilitysupportversion.h b/include/QtLinuxAccessibilitySupport/qtlinuxaccessibilitysupportversion.h index 2450ec37..3c01e662 100644 --- a/include/QtLinuxAccessibilitySupport/qtlinuxaccessibilitysupportversion.h +++ b/include/QtLinuxAccessibilitySupport/qtlinuxaccessibilitysupportversion.h @@ -2,8 +2,8 @@ #ifndef QT_QTLINUXACCESSIBILITYSUPPORT_VERSION_H #define QT_QTLINUXACCESSIBILITYSUPPORT_VERSION_H -#define QTLINUXACCESSIBILITYSUPPORT_VERSION_STR "5.15.3" +#define QTLINUXACCESSIBILITYSUPPORT_VERSION_STR "5.15.8" -#define QTLINUXACCESSIBILITYSUPPORT_VERSION 0x050F03 +#define QTLINUXACCESSIBILITYSUPPORT_VERSION 0x050F08 #endif // QT_QTLINUXACCESSIBILITYSUPPORT_VERSION_H diff --git a/include/QtMockPlugins1/qtmockplugins1version.h b/include/QtMockPlugins1/qtmockplugins1version.h index 71930df2..8e796bac 100644 --- a/include/QtMockPlugins1/qtmockplugins1version.h +++ b/include/QtMockPlugins1/qtmockplugins1version.h @@ -2,8 +2,8 @@ #ifndef QT_QTMOCKPLUGINS1_VERSION_H #define QT_QTMOCKPLUGINS1_VERSION_H -#define QTMOCKPLUGINS1_VERSION_STR "5.15.3" +#define QTMOCKPLUGINS1_VERSION_STR "5.15.8" -#define QTMOCKPLUGINS1_VERSION 0x050F03 +#define QTMOCKPLUGINS1_VERSION 0x050F08 #endif // QT_QTMOCKPLUGINS1_VERSION_H diff --git a/include/QtMockPlugins2/qtmockplugins2version.h b/include/QtMockPlugins2/qtmockplugins2version.h index 9d10aa4b..be49b7e2 100644 --- a/include/QtMockPlugins2/qtmockplugins2version.h +++ b/include/QtMockPlugins2/qtmockplugins2version.h @@ -2,8 +2,8 @@ #ifndef QT_QTMOCKPLUGINS2_VERSION_H #define QT_QTMOCKPLUGINS2_VERSION_H -#define QTMOCKPLUGINS2_VERSION_STR "5.15.3" +#define QTMOCKPLUGINS2_VERSION_STR "5.15.8" -#define QTMOCKPLUGINS2_VERSION 0x050F03 +#define QTMOCKPLUGINS2_VERSION 0x050F08 #endif // QT_QTMOCKPLUGINS2_VERSION_H diff --git a/include/QtMockPlugins3/qtmockplugins3version.h b/include/QtMockPlugins3/qtmockplugins3version.h index c90a9dd3..25ddebf3 100644 --- a/include/QtMockPlugins3/qtmockplugins3version.h +++ b/include/QtMockPlugins3/qtmockplugins3version.h @@ -2,8 +2,8 @@ #ifndef QT_QTMOCKPLUGINS3_VERSION_H #define QT_QTMOCKPLUGINS3_VERSION_H -#define QTMOCKPLUGINS3_VERSION_STR "5.15.3" +#define QTMOCKPLUGINS3_VERSION_STR "5.15.8" -#define QTMOCKPLUGINS3_VERSION 0x050F03 +#define QTMOCKPLUGINS3_VERSION 0x050F08 #endif // QT_QTMOCKPLUGINS3_VERSION_H diff --git a/include/QtNetwork/5.15.3/QtNetwork/private/bitstreams_p.h b/include/QtNetwork/5.15.8/QtNetwork/private/bitstreams_p.h similarity index 100% rename from include/QtNetwork/5.15.3/QtNetwork/private/bitstreams_p.h rename to include/QtNetwork/5.15.8/QtNetwork/private/bitstreams_p.h diff --git a/include/QtNetwork/5.15.3/QtNetwork/private/hpack_p.h b/include/QtNetwork/5.15.8/QtNetwork/private/hpack_p.h similarity index 100% rename from include/QtNetwork/5.15.3/QtNetwork/private/hpack_p.h rename to include/QtNetwork/5.15.8/QtNetwork/private/hpack_p.h diff --git a/include/QtNetwork/5.15.3/QtNetwork/private/hpacktable_p.h b/include/QtNetwork/5.15.8/QtNetwork/private/hpacktable_p.h similarity index 100% rename from include/QtNetwork/5.15.3/QtNetwork/private/hpacktable_p.h rename to include/QtNetwork/5.15.8/QtNetwork/private/hpacktable_p.h diff --git a/include/QtNetwork/5.15.3/QtNetwork/private/http2frames_p.h b/include/QtNetwork/5.15.8/QtNetwork/private/http2frames_p.h similarity index 100% rename from include/QtNetwork/5.15.3/QtNetwork/private/http2frames_p.h rename to include/QtNetwork/5.15.8/QtNetwork/private/http2frames_p.h diff --git a/include/QtNetwork/5.15.3/QtNetwork/private/http2protocol_p.h b/include/QtNetwork/5.15.8/QtNetwork/private/http2protocol_p.h similarity index 100% rename from include/QtNetwork/5.15.3/QtNetwork/private/http2protocol_p.h rename to include/QtNetwork/5.15.8/QtNetwork/private/http2protocol_p.h diff --git a/include/QtNetwork/5.15.3/QtNetwork/private/http2streams_p.h b/include/QtNetwork/5.15.8/QtNetwork/private/http2streams_p.h similarity index 100% rename from include/QtNetwork/5.15.3/QtNetwork/private/http2streams_p.h rename to include/QtNetwork/5.15.8/QtNetwork/private/http2streams_p.h diff --git a/include/QtNetwork/5.15.3/QtNetwork/private/huffman_p.h b/include/QtNetwork/5.15.8/QtNetwork/private/huffman_p.h similarity index 100% rename from include/QtNetwork/5.15.3/QtNetwork/private/huffman_p.h rename to include/QtNetwork/5.15.8/QtNetwork/private/huffman_p.h diff --git a/include/QtNetwork/5.15.3/QtNetwork/private/qabstractnetworkcache_p.h b/include/QtNetwork/5.15.8/QtNetwork/private/qabstractnetworkcache_p.h similarity index 100% rename from include/QtNetwork/5.15.3/QtNetwork/private/qabstractnetworkcache_p.h rename to include/QtNetwork/5.15.8/QtNetwork/private/qabstractnetworkcache_p.h diff --git a/include/QtNetwork/5.15.3/QtNetwork/private/qabstractprotocolhandler_p.h b/include/QtNetwork/5.15.8/QtNetwork/private/qabstractprotocolhandler_p.h similarity index 100% rename from include/QtNetwork/5.15.3/QtNetwork/private/qabstractprotocolhandler_p.h rename to include/QtNetwork/5.15.8/QtNetwork/private/qabstractprotocolhandler_p.h diff --git a/include/QtNetwork/5.15.3/QtNetwork/private/qabstractsocket_p.h b/include/QtNetwork/5.15.8/QtNetwork/private/qabstractsocket_p.h similarity index 100% rename from include/QtNetwork/5.15.3/QtNetwork/private/qabstractsocket_p.h rename to include/QtNetwork/5.15.8/QtNetwork/private/qabstractsocket_p.h diff --git a/include/QtNetwork/5.15.3/QtNetwork/private/qabstractsocketengine_p.h b/include/QtNetwork/5.15.8/QtNetwork/private/qabstractsocketengine_p.h similarity index 100% rename from include/QtNetwork/5.15.3/QtNetwork/private/qabstractsocketengine_p.h rename to include/QtNetwork/5.15.8/QtNetwork/private/qabstractsocketengine_p.h diff --git a/include/QtNetwork/5.15.3/QtNetwork/private/qasn1element_p.h b/include/QtNetwork/5.15.8/QtNetwork/private/qasn1element_p.h similarity index 100% rename from include/QtNetwork/5.15.3/QtNetwork/private/qasn1element_p.h rename to include/QtNetwork/5.15.8/QtNetwork/private/qasn1element_p.h diff --git a/include/QtNetwork/5.15.3/QtNetwork/private/qauthenticator_p.h b/include/QtNetwork/5.15.8/QtNetwork/private/qauthenticator_p.h similarity index 100% rename from include/QtNetwork/5.15.3/QtNetwork/private/qauthenticator_p.h rename to include/QtNetwork/5.15.8/QtNetwork/private/qauthenticator_p.h diff --git a/include/QtNetwork/5.15.3/QtNetwork/private/qbearerengine_p.h b/include/QtNetwork/5.15.8/QtNetwork/private/qbearerengine_p.h similarity index 100% rename from include/QtNetwork/5.15.3/QtNetwork/private/qbearerengine_p.h rename to include/QtNetwork/5.15.8/QtNetwork/private/qbearerengine_p.h diff --git a/include/QtNetwork/5.15.3/QtNetwork/private/qbearerplugin_p.h b/include/QtNetwork/5.15.8/QtNetwork/private/qbearerplugin_p.h similarity index 100% rename from include/QtNetwork/5.15.3/QtNetwork/private/qbearerplugin_p.h rename to include/QtNetwork/5.15.8/QtNetwork/private/qbearerplugin_p.h diff --git a/include/QtNetwork/5.15.3/QtNetwork/private/qdnslookup_p.h b/include/QtNetwork/5.15.8/QtNetwork/private/qdnslookup_p.h similarity index 100% rename from include/QtNetwork/5.15.3/QtNetwork/private/qdnslookup_p.h rename to include/QtNetwork/5.15.8/QtNetwork/private/qdnslookup_p.h diff --git a/include/QtNetwork/5.15.3/QtNetwork/private/qdtls_openssl_p.h b/include/QtNetwork/5.15.8/QtNetwork/private/qdtls_openssl_p.h similarity index 100% rename from include/QtNetwork/5.15.3/QtNetwork/private/qdtls_openssl_p.h rename to include/QtNetwork/5.15.8/QtNetwork/private/qdtls_openssl_p.h diff --git a/include/QtNetwork/5.15.3/QtNetwork/private/qdtls_p.h b/include/QtNetwork/5.15.8/QtNetwork/private/qdtls_p.h similarity index 100% rename from include/QtNetwork/5.15.3/QtNetwork/private/qdtls_p.h rename to include/QtNetwork/5.15.8/QtNetwork/private/qdtls_p.h diff --git a/include/QtNetwork/5.15.3/QtNetwork/private/qftp_p.h b/include/QtNetwork/5.15.8/QtNetwork/private/qftp_p.h similarity index 100% rename from include/QtNetwork/5.15.3/QtNetwork/private/qftp_p.h rename to include/QtNetwork/5.15.8/QtNetwork/private/qftp_p.h diff --git a/include/QtNetwork/5.15.3/QtNetwork/private/qhostaddress_p.h b/include/QtNetwork/5.15.8/QtNetwork/private/qhostaddress_p.h similarity index 100% rename from include/QtNetwork/5.15.3/QtNetwork/private/qhostaddress_p.h rename to include/QtNetwork/5.15.8/QtNetwork/private/qhostaddress_p.h diff --git a/include/QtNetwork/5.15.3/QtNetwork/private/qhostinfo_p.h b/include/QtNetwork/5.15.8/QtNetwork/private/qhostinfo_p.h similarity index 100% rename from include/QtNetwork/5.15.3/QtNetwork/private/qhostinfo_p.h rename to include/QtNetwork/5.15.8/QtNetwork/private/qhostinfo_p.h diff --git a/include/QtNetwork/5.15.3/QtNetwork/private/qhsts_p.h b/include/QtNetwork/5.15.8/QtNetwork/private/qhsts_p.h similarity index 100% rename from include/QtNetwork/5.15.3/QtNetwork/private/qhsts_p.h rename to include/QtNetwork/5.15.8/QtNetwork/private/qhsts_p.h diff --git a/include/QtNetwork/5.15.3/QtNetwork/private/qhstsstore_p.h b/include/QtNetwork/5.15.8/QtNetwork/private/qhstsstore_p.h similarity index 100% rename from include/QtNetwork/5.15.3/QtNetwork/private/qhstsstore_p.h rename to include/QtNetwork/5.15.8/QtNetwork/private/qhstsstore_p.h diff --git a/include/QtNetwork/5.15.3/QtNetwork/private/qhttp2protocolhandler_p.h b/include/QtNetwork/5.15.8/QtNetwork/private/qhttp2protocolhandler_p.h similarity index 100% rename from include/QtNetwork/5.15.3/QtNetwork/private/qhttp2protocolhandler_p.h rename to include/QtNetwork/5.15.8/QtNetwork/private/qhttp2protocolhandler_p.h diff --git a/include/QtNetwork/5.15.3/QtNetwork/private/qhttpmultipart_p.h b/include/QtNetwork/5.15.8/QtNetwork/private/qhttpmultipart_p.h similarity index 100% rename from include/QtNetwork/5.15.3/QtNetwork/private/qhttpmultipart_p.h rename to include/QtNetwork/5.15.8/QtNetwork/private/qhttpmultipart_p.h diff --git a/include/QtNetwork/5.15.3/QtNetwork/private/qhttpnetworkconnection_p.h b/include/QtNetwork/5.15.8/QtNetwork/private/qhttpnetworkconnection_p.h similarity index 100% rename from include/QtNetwork/5.15.3/QtNetwork/private/qhttpnetworkconnection_p.h rename to include/QtNetwork/5.15.8/QtNetwork/private/qhttpnetworkconnection_p.h diff --git a/include/QtNetwork/5.15.3/QtNetwork/private/qhttpnetworkconnectionchannel_p.h b/include/QtNetwork/5.15.8/QtNetwork/private/qhttpnetworkconnectionchannel_p.h similarity index 100% rename from include/QtNetwork/5.15.3/QtNetwork/private/qhttpnetworkconnectionchannel_p.h rename to include/QtNetwork/5.15.8/QtNetwork/private/qhttpnetworkconnectionchannel_p.h diff --git a/include/QtNetwork/5.15.3/QtNetwork/private/qhttpnetworkheader_p.h b/include/QtNetwork/5.15.8/QtNetwork/private/qhttpnetworkheader_p.h similarity index 100% rename from include/QtNetwork/5.15.3/QtNetwork/private/qhttpnetworkheader_p.h rename to include/QtNetwork/5.15.8/QtNetwork/private/qhttpnetworkheader_p.h diff --git a/include/QtNetwork/5.15.3/QtNetwork/private/qhttpnetworkreply_p.h b/include/QtNetwork/5.15.8/QtNetwork/private/qhttpnetworkreply_p.h similarity index 100% rename from include/QtNetwork/5.15.3/QtNetwork/private/qhttpnetworkreply_p.h rename to include/QtNetwork/5.15.8/QtNetwork/private/qhttpnetworkreply_p.h diff --git a/include/QtNetwork/5.15.3/QtNetwork/private/qhttpnetworkrequest_p.h b/include/QtNetwork/5.15.8/QtNetwork/private/qhttpnetworkrequest_p.h similarity index 100% rename from include/QtNetwork/5.15.3/QtNetwork/private/qhttpnetworkrequest_p.h rename to include/QtNetwork/5.15.8/QtNetwork/private/qhttpnetworkrequest_p.h diff --git a/include/QtNetwork/5.15.3/QtNetwork/private/qhttpprotocolhandler_p.h b/include/QtNetwork/5.15.8/QtNetwork/private/qhttpprotocolhandler_p.h similarity index 100% rename from include/QtNetwork/5.15.3/QtNetwork/private/qhttpprotocolhandler_p.h rename to include/QtNetwork/5.15.8/QtNetwork/private/qhttpprotocolhandler_p.h diff --git a/include/QtNetwork/5.15.3/QtNetwork/private/qhttpsocketengine_p.h b/include/QtNetwork/5.15.8/QtNetwork/private/qhttpsocketengine_p.h similarity index 100% rename from include/QtNetwork/5.15.3/QtNetwork/private/qhttpsocketengine_p.h rename to include/QtNetwork/5.15.8/QtNetwork/private/qhttpsocketengine_p.h diff --git a/include/QtNetwork/5.15.3/QtNetwork/private/qhttpthreaddelegate_p.h b/include/QtNetwork/5.15.8/QtNetwork/private/qhttpthreaddelegate_p.h similarity index 100% rename from include/QtNetwork/5.15.3/QtNetwork/private/qhttpthreaddelegate_p.h rename to include/QtNetwork/5.15.8/QtNetwork/private/qhttpthreaddelegate_p.h diff --git a/include/QtNetwork/5.15.3/QtNetwork/private/qlocalserver_p.h b/include/QtNetwork/5.15.8/QtNetwork/private/qlocalserver_p.h similarity index 100% rename from include/QtNetwork/5.15.3/QtNetwork/private/qlocalserver_p.h rename to include/QtNetwork/5.15.8/QtNetwork/private/qlocalserver_p.h diff --git a/include/QtNetwork/5.15.3/QtNetwork/private/qlocalsocket_p.h b/include/QtNetwork/5.15.8/QtNetwork/private/qlocalsocket_p.h similarity index 100% rename from include/QtNetwork/5.15.3/QtNetwork/private/qlocalsocket_p.h rename to include/QtNetwork/5.15.8/QtNetwork/private/qlocalsocket_p.h diff --git a/include/QtNetwork/5.15.3/QtNetwork/private/qnativesocketengine_p.h b/include/QtNetwork/5.15.8/QtNetwork/private/qnativesocketengine_p.h similarity index 100% rename from include/QtNetwork/5.15.3/QtNetwork/private/qnativesocketengine_p.h rename to include/QtNetwork/5.15.8/QtNetwork/private/qnativesocketengine_p.h diff --git a/include/QtNetwork/5.15.3/QtNetwork/private/qnativesocketengine_winrt_p.h b/include/QtNetwork/5.15.8/QtNetwork/private/qnativesocketengine_winrt_p.h similarity index 100% rename from include/QtNetwork/5.15.3/QtNetwork/private/qnativesocketengine_winrt_p.h rename to include/QtNetwork/5.15.8/QtNetwork/private/qnativesocketengine_winrt_p.h diff --git a/include/QtNetwork/5.15.3/QtNetwork/private/qnet_unix_p.h b/include/QtNetwork/5.15.8/QtNetwork/private/qnet_unix_p.h similarity index 100% rename from include/QtNetwork/5.15.3/QtNetwork/private/qnet_unix_p.h rename to include/QtNetwork/5.15.8/QtNetwork/private/qnet_unix_p.h diff --git a/include/QtNetwork/5.15.3/QtNetwork/private/qnetconmonitor_p.h b/include/QtNetwork/5.15.8/QtNetwork/private/qnetconmonitor_p.h similarity index 100% rename from include/QtNetwork/5.15.3/QtNetwork/private/qnetconmonitor_p.h rename to include/QtNetwork/5.15.8/QtNetwork/private/qnetconmonitor_p.h diff --git a/include/QtNetwork/5.15.3/QtNetwork/private/qnetworkaccessauthenticationmanager_p.h b/include/QtNetwork/5.15.8/QtNetwork/private/qnetworkaccessauthenticationmanager_p.h similarity index 100% rename from include/QtNetwork/5.15.3/QtNetwork/private/qnetworkaccessauthenticationmanager_p.h rename to include/QtNetwork/5.15.8/QtNetwork/private/qnetworkaccessauthenticationmanager_p.h diff --git a/include/QtNetwork/5.15.3/QtNetwork/private/qnetworkaccessbackend_p.h b/include/QtNetwork/5.15.8/QtNetwork/private/qnetworkaccessbackend_p.h similarity index 100% rename from include/QtNetwork/5.15.3/QtNetwork/private/qnetworkaccessbackend_p.h rename to include/QtNetwork/5.15.8/QtNetwork/private/qnetworkaccessbackend_p.h diff --git a/include/QtNetwork/5.15.3/QtNetwork/private/qnetworkaccesscache_p.h b/include/QtNetwork/5.15.8/QtNetwork/private/qnetworkaccesscache_p.h similarity index 100% rename from include/QtNetwork/5.15.3/QtNetwork/private/qnetworkaccesscache_p.h rename to include/QtNetwork/5.15.8/QtNetwork/private/qnetworkaccesscache_p.h diff --git a/include/QtNetwork/5.15.3/QtNetwork/private/qnetworkaccesscachebackend_p.h b/include/QtNetwork/5.15.8/QtNetwork/private/qnetworkaccesscachebackend_p.h similarity index 100% rename from include/QtNetwork/5.15.3/QtNetwork/private/qnetworkaccesscachebackend_p.h rename to include/QtNetwork/5.15.8/QtNetwork/private/qnetworkaccesscachebackend_p.h diff --git a/include/QtNetwork/5.15.3/QtNetwork/private/qnetworkaccessdebugpipebackend_p.h b/include/QtNetwork/5.15.8/QtNetwork/private/qnetworkaccessdebugpipebackend_p.h similarity index 100% rename from include/QtNetwork/5.15.3/QtNetwork/private/qnetworkaccessdebugpipebackend_p.h rename to include/QtNetwork/5.15.8/QtNetwork/private/qnetworkaccessdebugpipebackend_p.h diff --git a/include/QtNetwork/5.15.3/QtNetwork/private/qnetworkaccessfilebackend_p.h b/include/QtNetwork/5.15.8/QtNetwork/private/qnetworkaccessfilebackend_p.h similarity index 100% rename from include/QtNetwork/5.15.3/QtNetwork/private/qnetworkaccessfilebackend_p.h rename to include/QtNetwork/5.15.8/QtNetwork/private/qnetworkaccessfilebackend_p.h diff --git a/include/QtNetwork/5.15.3/QtNetwork/private/qnetworkaccessftpbackend_p.h b/include/QtNetwork/5.15.8/QtNetwork/private/qnetworkaccessftpbackend_p.h similarity index 100% rename from include/QtNetwork/5.15.3/QtNetwork/private/qnetworkaccessftpbackend_p.h rename to include/QtNetwork/5.15.8/QtNetwork/private/qnetworkaccessftpbackend_p.h diff --git a/include/QtNetwork/5.15.3/QtNetwork/private/qnetworkaccessmanager_p.h b/include/QtNetwork/5.15.8/QtNetwork/private/qnetworkaccessmanager_p.h similarity index 100% rename from include/QtNetwork/5.15.3/QtNetwork/private/qnetworkaccessmanager_p.h rename to include/QtNetwork/5.15.8/QtNetwork/private/qnetworkaccessmanager_p.h diff --git a/include/QtNetwork/5.15.3/QtNetwork/private/qnetworkconfigmanager_p.h b/include/QtNetwork/5.15.8/QtNetwork/private/qnetworkconfigmanager_p.h similarity index 100% rename from include/QtNetwork/5.15.3/QtNetwork/private/qnetworkconfigmanager_p.h rename to include/QtNetwork/5.15.8/QtNetwork/private/qnetworkconfigmanager_p.h diff --git a/include/QtNetwork/5.15.3/QtNetwork/private/qnetworkconfiguration_p.h b/include/QtNetwork/5.15.8/QtNetwork/private/qnetworkconfiguration_p.h similarity index 100% rename from include/QtNetwork/5.15.3/QtNetwork/private/qnetworkconfiguration_p.h rename to include/QtNetwork/5.15.8/QtNetwork/private/qnetworkconfiguration_p.h diff --git a/include/QtNetwork/5.15.3/QtNetwork/private/qnetworkcookie_p.h b/include/QtNetwork/5.15.8/QtNetwork/private/qnetworkcookie_p.h similarity index 100% rename from include/QtNetwork/5.15.3/QtNetwork/private/qnetworkcookie_p.h rename to include/QtNetwork/5.15.8/QtNetwork/private/qnetworkcookie_p.h diff --git a/include/QtNetwork/5.15.3/QtNetwork/private/qnetworkcookiejar_p.h b/include/QtNetwork/5.15.8/QtNetwork/private/qnetworkcookiejar_p.h similarity index 100% rename from include/QtNetwork/5.15.3/QtNetwork/private/qnetworkcookiejar_p.h rename to include/QtNetwork/5.15.8/QtNetwork/private/qnetworkcookiejar_p.h diff --git a/include/QtNetwork/5.15.3/QtNetwork/private/qnetworkdatagram_p.h b/include/QtNetwork/5.15.8/QtNetwork/private/qnetworkdatagram_p.h similarity index 100% rename from include/QtNetwork/5.15.3/QtNetwork/private/qnetworkdatagram_p.h rename to include/QtNetwork/5.15.8/QtNetwork/private/qnetworkdatagram_p.h diff --git a/include/QtNetwork/5.15.3/QtNetwork/private/qnetworkdiskcache_p.h b/include/QtNetwork/5.15.8/QtNetwork/private/qnetworkdiskcache_p.h similarity index 100% rename from include/QtNetwork/5.15.3/QtNetwork/private/qnetworkdiskcache_p.h rename to include/QtNetwork/5.15.8/QtNetwork/private/qnetworkdiskcache_p.h diff --git a/include/QtNetwork/5.15.3/QtNetwork/private/qnetworkfile_p.h b/include/QtNetwork/5.15.8/QtNetwork/private/qnetworkfile_p.h similarity index 100% rename from include/QtNetwork/5.15.3/QtNetwork/private/qnetworkfile_p.h rename to include/QtNetwork/5.15.8/QtNetwork/private/qnetworkfile_p.h diff --git a/include/QtNetwork/5.15.3/QtNetwork/private/qnetworkinterface_p.h b/include/QtNetwork/5.15.8/QtNetwork/private/qnetworkinterface_p.h similarity index 100% rename from include/QtNetwork/5.15.3/QtNetwork/private/qnetworkinterface_p.h rename to include/QtNetwork/5.15.8/QtNetwork/private/qnetworkinterface_p.h diff --git a/include/QtNetwork/5.15.3/QtNetwork/private/qnetworkinterface_uikit_p.h b/include/QtNetwork/5.15.8/QtNetwork/private/qnetworkinterface_uikit_p.h similarity index 100% rename from include/QtNetwork/5.15.3/QtNetwork/private/qnetworkinterface_uikit_p.h rename to include/QtNetwork/5.15.8/QtNetwork/private/qnetworkinterface_uikit_p.h diff --git a/include/QtNetwork/5.15.3/QtNetwork/private/qnetworkinterface_unix_p.h b/include/QtNetwork/5.15.8/QtNetwork/private/qnetworkinterface_unix_p.h similarity index 100% rename from include/QtNetwork/5.15.3/QtNetwork/private/qnetworkinterface_unix_p.h rename to include/QtNetwork/5.15.8/QtNetwork/private/qnetworkinterface_unix_p.h diff --git a/include/QtNetwork/5.15.3/QtNetwork/private/qnetworkreply_p.h b/include/QtNetwork/5.15.8/QtNetwork/private/qnetworkreply_p.h similarity index 100% rename from include/QtNetwork/5.15.3/QtNetwork/private/qnetworkreply_p.h rename to include/QtNetwork/5.15.8/QtNetwork/private/qnetworkreply_p.h diff --git a/include/QtNetwork/5.15.3/QtNetwork/private/qnetworkreplydataimpl_p.h b/include/QtNetwork/5.15.8/QtNetwork/private/qnetworkreplydataimpl_p.h similarity index 100% rename from include/QtNetwork/5.15.3/QtNetwork/private/qnetworkreplydataimpl_p.h rename to include/QtNetwork/5.15.8/QtNetwork/private/qnetworkreplydataimpl_p.h diff --git a/include/QtNetwork/5.15.3/QtNetwork/private/qnetworkreplyfileimpl_p.h b/include/QtNetwork/5.15.8/QtNetwork/private/qnetworkreplyfileimpl_p.h similarity index 100% rename from include/QtNetwork/5.15.3/QtNetwork/private/qnetworkreplyfileimpl_p.h rename to include/QtNetwork/5.15.8/QtNetwork/private/qnetworkreplyfileimpl_p.h diff --git a/include/QtNetwork/5.15.3/QtNetwork/private/qnetworkreplyhttpimpl_p.h b/include/QtNetwork/5.15.8/QtNetwork/private/qnetworkreplyhttpimpl_p.h similarity index 100% rename from include/QtNetwork/5.15.3/QtNetwork/private/qnetworkreplyhttpimpl_p.h rename to include/QtNetwork/5.15.8/QtNetwork/private/qnetworkreplyhttpimpl_p.h diff --git a/include/QtNetwork/5.15.3/QtNetwork/private/qnetworkreplyimpl_p.h b/include/QtNetwork/5.15.8/QtNetwork/private/qnetworkreplyimpl_p.h similarity index 100% rename from include/QtNetwork/5.15.3/QtNetwork/private/qnetworkreplyimpl_p.h rename to include/QtNetwork/5.15.8/QtNetwork/private/qnetworkreplyimpl_p.h diff --git a/include/QtNetwork/5.15.3/QtNetwork/private/qnetworkreplywasmimpl_p.h b/include/QtNetwork/5.15.8/QtNetwork/private/qnetworkreplywasmimpl_p.h similarity index 100% rename from include/QtNetwork/5.15.3/QtNetwork/private/qnetworkreplywasmimpl_p.h rename to include/QtNetwork/5.15.8/QtNetwork/private/qnetworkreplywasmimpl_p.h diff --git a/include/QtNetwork/5.15.3/QtNetwork/private/qnetworkrequest_p.h b/include/QtNetwork/5.15.8/QtNetwork/private/qnetworkrequest_p.h similarity index 100% rename from include/QtNetwork/5.15.3/QtNetwork/private/qnetworkrequest_p.h rename to include/QtNetwork/5.15.8/QtNetwork/private/qnetworkrequest_p.h diff --git a/include/QtNetwork/5.15.3/QtNetwork/private/qnetworksession_p.h b/include/QtNetwork/5.15.8/QtNetwork/private/qnetworksession_p.h similarity index 100% rename from include/QtNetwork/5.15.3/QtNetwork/private/qnetworksession_p.h rename to include/QtNetwork/5.15.8/QtNetwork/private/qnetworksession_p.h diff --git a/include/QtNetwork/5.15.3/QtNetwork/private/qocsp_p.h b/include/QtNetwork/5.15.8/QtNetwork/private/qocsp_p.h similarity index 100% rename from include/QtNetwork/5.15.3/QtNetwork/private/qocsp_p.h rename to include/QtNetwork/5.15.8/QtNetwork/private/qocsp_p.h diff --git a/include/QtNetwork/5.15.3/QtNetwork/private/qocspresponse_p.h b/include/QtNetwork/5.15.8/QtNetwork/private/qocspresponse_p.h similarity index 100% rename from include/QtNetwork/5.15.3/QtNetwork/private/qocspresponse_p.h rename to include/QtNetwork/5.15.8/QtNetwork/private/qocspresponse_p.h diff --git a/include/QtNetwork/5.15.3/QtNetwork/private/qsctpserver_p.h b/include/QtNetwork/5.15.8/QtNetwork/private/qsctpserver_p.h similarity index 100% rename from include/QtNetwork/5.15.3/QtNetwork/private/qsctpserver_p.h rename to include/QtNetwork/5.15.8/QtNetwork/private/qsctpserver_p.h diff --git a/include/QtNetwork/5.15.3/QtNetwork/private/qsctpsocket_p.h b/include/QtNetwork/5.15.8/QtNetwork/private/qsctpsocket_p.h similarity index 100% rename from include/QtNetwork/5.15.3/QtNetwork/private/qsctpsocket_p.h rename to include/QtNetwork/5.15.8/QtNetwork/private/qsctpsocket_p.h diff --git a/include/QtNetwork/5.15.3/QtNetwork/private/qsharednetworksession_p.h b/include/QtNetwork/5.15.8/QtNetwork/private/qsharednetworksession_p.h similarity index 100% rename from include/QtNetwork/5.15.3/QtNetwork/private/qsharednetworksession_p.h rename to include/QtNetwork/5.15.8/QtNetwork/private/qsharednetworksession_p.h diff --git a/include/QtNetwork/5.15.3/QtNetwork/private/qsocks5socketengine_p.h b/include/QtNetwork/5.15.8/QtNetwork/private/qsocks5socketengine_p.h similarity index 100% rename from include/QtNetwork/5.15.3/QtNetwork/private/qsocks5socketengine_p.h rename to include/QtNetwork/5.15.8/QtNetwork/private/qsocks5socketengine_p.h diff --git a/include/QtNetwork/5.15.3/QtNetwork/private/qspdyprotocolhandler_p.h b/include/QtNetwork/5.15.8/QtNetwork/private/qspdyprotocolhandler_p.h similarity index 100% rename from include/QtNetwork/5.15.3/QtNetwork/private/qspdyprotocolhandler_p.h rename to include/QtNetwork/5.15.8/QtNetwork/private/qspdyprotocolhandler_p.h diff --git a/include/QtNetwork/5.15.3/QtNetwork/private/qssl_p.h b/include/QtNetwork/5.15.8/QtNetwork/private/qssl_p.h similarity index 100% rename from include/QtNetwork/5.15.3/QtNetwork/private/qssl_p.h rename to include/QtNetwork/5.15.8/QtNetwork/private/qssl_p.h diff --git a/include/QtNetwork/5.15.3/QtNetwork/private/qsslcertificate_p.h b/include/QtNetwork/5.15.8/QtNetwork/private/qsslcertificate_p.h similarity index 100% rename from include/QtNetwork/5.15.3/QtNetwork/private/qsslcertificate_p.h rename to include/QtNetwork/5.15.8/QtNetwork/private/qsslcertificate_p.h diff --git a/include/QtNetwork/5.15.3/QtNetwork/private/qsslcertificateextension_p.h b/include/QtNetwork/5.15.8/QtNetwork/private/qsslcertificateextension_p.h similarity index 100% rename from include/QtNetwork/5.15.3/QtNetwork/private/qsslcertificateextension_p.h rename to include/QtNetwork/5.15.8/QtNetwork/private/qsslcertificateextension_p.h diff --git a/include/QtNetwork/5.15.3/QtNetwork/private/qsslcipher_p.h b/include/QtNetwork/5.15.8/QtNetwork/private/qsslcipher_p.h similarity index 100% rename from include/QtNetwork/5.15.3/QtNetwork/private/qsslcipher_p.h rename to include/QtNetwork/5.15.8/QtNetwork/private/qsslcipher_p.h diff --git a/include/QtNetwork/5.15.3/QtNetwork/private/qsslconfiguration_p.h b/include/QtNetwork/5.15.8/QtNetwork/private/qsslconfiguration_p.h similarity index 100% rename from include/QtNetwork/5.15.3/QtNetwork/private/qsslconfiguration_p.h rename to include/QtNetwork/5.15.8/QtNetwork/private/qsslconfiguration_p.h diff --git a/include/QtNetwork/5.15.3/QtNetwork/private/qsslcontext_openssl_p.h b/include/QtNetwork/5.15.8/QtNetwork/private/qsslcontext_openssl_p.h similarity index 100% rename from include/QtNetwork/5.15.3/QtNetwork/private/qsslcontext_openssl_p.h rename to include/QtNetwork/5.15.8/QtNetwork/private/qsslcontext_openssl_p.h diff --git a/include/QtNetwork/5.15.3/QtNetwork/private/qssldiffiehellmanparameters_p.h b/include/QtNetwork/5.15.8/QtNetwork/private/qssldiffiehellmanparameters_p.h similarity index 100% rename from include/QtNetwork/5.15.3/QtNetwork/private/qssldiffiehellmanparameters_p.h rename to include/QtNetwork/5.15.8/QtNetwork/private/qssldiffiehellmanparameters_p.h diff --git a/include/QtNetwork/5.15.3/QtNetwork/private/qsslkey_p.h b/include/QtNetwork/5.15.8/QtNetwork/private/qsslkey_p.h similarity index 100% rename from include/QtNetwork/5.15.3/QtNetwork/private/qsslkey_p.h rename to include/QtNetwork/5.15.8/QtNetwork/private/qsslkey_p.h diff --git a/include/QtNetwork/5.15.3/QtNetwork/private/qsslpresharedkeyauthenticator_p.h b/include/QtNetwork/5.15.8/QtNetwork/private/qsslpresharedkeyauthenticator_p.h similarity index 100% rename from include/QtNetwork/5.15.3/QtNetwork/private/qsslpresharedkeyauthenticator_p.h rename to include/QtNetwork/5.15.8/QtNetwork/private/qsslpresharedkeyauthenticator_p.h diff --git a/include/QtNetwork/5.15.3/QtNetwork/private/qsslsocket_mac_p.h b/include/QtNetwork/5.15.8/QtNetwork/private/qsslsocket_mac_p.h similarity index 100% rename from include/QtNetwork/5.15.3/QtNetwork/private/qsslsocket_mac_p.h rename to include/QtNetwork/5.15.8/QtNetwork/private/qsslsocket_mac_p.h diff --git a/include/QtNetwork/5.15.3/QtNetwork/private/qsslsocket_openssl_p.h b/include/QtNetwork/5.15.8/QtNetwork/private/qsslsocket_openssl_p.h similarity index 100% rename from include/QtNetwork/5.15.3/QtNetwork/private/qsslsocket_openssl_p.h rename to include/QtNetwork/5.15.8/QtNetwork/private/qsslsocket_openssl_p.h diff --git a/include/QtNetwork/5.15.3/QtNetwork/private/qsslsocket_openssl_symbols_p.h b/include/QtNetwork/5.15.8/QtNetwork/private/qsslsocket_openssl_symbols_p.h similarity index 100% rename from include/QtNetwork/5.15.3/QtNetwork/private/qsslsocket_openssl_symbols_p.h rename to include/QtNetwork/5.15.8/QtNetwork/private/qsslsocket_openssl_symbols_p.h diff --git a/include/QtNetwork/5.15.3/QtNetwork/private/qsslsocket_p.h b/include/QtNetwork/5.15.8/QtNetwork/private/qsslsocket_p.h similarity index 100% rename from include/QtNetwork/5.15.3/QtNetwork/private/qsslsocket_p.h rename to include/QtNetwork/5.15.8/QtNetwork/private/qsslsocket_p.h diff --git a/include/QtNetwork/5.15.3/QtNetwork/private/qsslsocket_schannel_p.h b/include/QtNetwork/5.15.8/QtNetwork/private/qsslsocket_schannel_p.h similarity index 100% rename from include/QtNetwork/5.15.3/QtNetwork/private/qsslsocket_schannel_p.h rename to include/QtNetwork/5.15.8/QtNetwork/private/qsslsocket_schannel_p.h diff --git a/include/QtNetwork/5.15.3/QtNetwork/private/qsslsocket_winrt_p.h b/include/QtNetwork/5.15.8/QtNetwork/private/qsslsocket_winrt_p.h similarity index 100% rename from include/QtNetwork/5.15.3/QtNetwork/private/qsslsocket_winrt_p.h rename to include/QtNetwork/5.15.8/QtNetwork/private/qsslsocket_winrt_p.h diff --git a/include/QtNetwork/5.15.3/QtNetwork/private/qtcpserver_p.h b/include/QtNetwork/5.15.8/QtNetwork/private/qtcpserver_p.h similarity index 100% rename from include/QtNetwork/5.15.3/QtNetwork/private/qtcpserver_p.h rename to include/QtNetwork/5.15.8/QtNetwork/private/qtcpserver_p.h diff --git a/include/QtNetwork/5.15.3/QtNetwork/private/qtcpsocket_p.h b/include/QtNetwork/5.15.8/QtNetwork/private/qtcpsocket_p.h similarity index 100% rename from include/QtNetwork/5.15.3/QtNetwork/private/qtcpsocket_p.h rename to include/QtNetwork/5.15.8/QtNetwork/private/qtcpsocket_p.h diff --git a/include/QtNetwork/5.15.3/QtNetwork/private/qtnetworkglobal_p.h b/include/QtNetwork/5.15.8/QtNetwork/private/qtnetworkglobal_p.h similarity index 100% rename from include/QtNetwork/5.15.3/QtNetwork/private/qtnetworkglobal_p.h rename to include/QtNetwork/5.15.8/QtNetwork/private/qtnetworkglobal_p.h diff --git a/include/QtNetwork/5.15.3/QtNetwork/private/qurlinfo_p.h b/include/QtNetwork/5.15.8/QtNetwork/private/qurlinfo_p.h similarity index 100% rename from include/QtNetwork/5.15.3/QtNetwork/private/qurlinfo_p.h rename to include/QtNetwork/5.15.8/QtNetwork/private/qurlinfo_p.h diff --git a/include/QtNetwork/5.15.3/QtNetwork/private/qwindowscarootfetcher_p.h b/include/QtNetwork/5.15.8/QtNetwork/private/qwindowscarootfetcher_p.h similarity index 100% rename from include/QtNetwork/5.15.3/QtNetwork/private/qwindowscarootfetcher_p.h rename to include/QtNetwork/5.15.8/QtNetwork/private/qwindowscarootfetcher_p.h diff --git a/include/QtNetwork/qtnetworkversion.h b/include/QtNetwork/qtnetworkversion.h index 8b06c5fa..4bb759d3 100644 --- a/include/QtNetwork/qtnetworkversion.h +++ b/include/QtNetwork/qtnetworkversion.h @@ -2,8 +2,8 @@ #ifndef QT_QTNETWORK_VERSION_H #define QT_QTNETWORK_VERSION_H -#define QTNETWORK_VERSION_STR "5.15.3" +#define QTNETWORK_VERSION_STR "5.15.8" -#define QTNETWORK_VERSION 0x050F03 +#define QTNETWORK_VERSION 0x050F08 #endif // QT_QTNETWORK_VERSION_H diff --git a/include/QtOpenGL/5.15.3/QtOpenGL/private/qgl2pexvertexarray_p.h b/include/QtOpenGL/5.15.8/QtOpenGL/private/qgl2pexvertexarray_p.h similarity index 100% rename from include/QtOpenGL/5.15.3/QtOpenGL/private/qgl2pexvertexarray_p.h rename to include/QtOpenGL/5.15.8/QtOpenGL/private/qgl2pexvertexarray_p.h diff --git a/include/QtOpenGL/5.15.3/QtOpenGL/private/qgl_p.h b/include/QtOpenGL/5.15.8/QtOpenGL/private/qgl_p.h similarity index 100% rename from include/QtOpenGL/5.15.3/QtOpenGL/private/qgl_p.h rename to include/QtOpenGL/5.15.8/QtOpenGL/private/qgl_p.h diff --git a/include/QtOpenGL/5.15.3/QtOpenGL/private/qglcustomshaderstage_p.h b/include/QtOpenGL/5.15.8/QtOpenGL/private/qglcustomshaderstage_p.h similarity index 100% rename from include/QtOpenGL/5.15.3/QtOpenGL/private/qglcustomshaderstage_p.h rename to include/QtOpenGL/5.15.8/QtOpenGL/private/qglcustomshaderstage_p.h diff --git a/include/QtOpenGL/5.15.3/QtOpenGL/private/qglengineshadermanager_p.h b/include/QtOpenGL/5.15.8/QtOpenGL/private/qglengineshadermanager_p.h similarity index 100% rename from include/QtOpenGL/5.15.3/QtOpenGL/private/qglengineshadermanager_p.h rename to include/QtOpenGL/5.15.8/QtOpenGL/private/qglengineshadermanager_p.h diff --git a/include/QtOpenGL/5.15.3/QtOpenGL/private/qglengineshadersource_p.h b/include/QtOpenGL/5.15.8/QtOpenGL/private/qglengineshadersource_p.h similarity index 100% rename from include/QtOpenGL/5.15.3/QtOpenGL/private/qglengineshadersource_p.h rename to include/QtOpenGL/5.15.8/QtOpenGL/private/qglengineshadersource_p.h diff --git a/include/QtOpenGL/5.15.3/QtOpenGL/private/qglframebufferobject_p.h b/include/QtOpenGL/5.15.8/QtOpenGL/private/qglframebufferobject_p.h similarity index 100% rename from include/QtOpenGL/5.15.3/QtOpenGL/private/qglframebufferobject_p.h rename to include/QtOpenGL/5.15.8/QtOpenGL/private/qglframebufferobject_p.h diff --git a/include/QtOpenGL/5.15.3/QtOpenGL/private/qglgradientcache_p.h b/include/QtOpenGL/5.15.8/QtOpenGL/private/qglgradientcache_p.h similarity index 100% rename from include/QtOpenGL/5.15.3/QtOpenGL/private/qglgradientcache_p.h rename to include/QtOpenGL/5.15.8/QtOpenGL/private/qglgradientcache_p.h diff --git a/include/QtOpenGL/5.15.3/QtOpenGL/private/qglpaintdevice_p.h b/include/QtOpenGL/5.15.8/QtOpenGL/private/qglpaintdevice_p.h similarity index 100% rename from include/QtOpenGL/5.15.3/QtOpenGL/private/qglpaintdevice_p.h rename to include/QtOpenGL/5.15.8/QtOpenGL/private/qglpaintdevice_p.h diff --git a/include/QtOpenGL/5.15.3/QtOpenGL/private/qglpixelbuffer_p.h b/include/QtOpenGL/5.15.8/QtOpenGL/private/qglpixelbuffer_p.h similarity index 100% rename from include/QtOpenGL/5.15.3/QtOpenGL/private/qglpixelbuffer_p.h rename to include/QtOpenGL/5.15.8/QtOpenGL/private/qglpixelbuffer_p.h diff --git a/include/QtOpenGL/5.15.3/QtOpenGL/private/qglshadercache_p.h b/include/QtOpenGL/5.15.8/QtOpenGL/private/qglshadercache_p.h similarity index 100% rename from include/QtOpenGL/5.15.3/QtOpenGL/private/qglshadercache_p.h rename to include/QtOpenGL/5.15.8/QtOpenGL/private/qglshadercache_p.h diff --git a/include/QtOpenGL/5.15.3/QtOpenGL/private/qgraphicsshadereffect_p.h b/include/QtOpenGL/5.15.8/QtOpenGL/private/qgraphicsshadereffect_p.h similarity index 100% rename from include/QtOpenGL/5.15.3/QtOpenGL/private/qgraphicsshadereffect_p.h rename to include/QtOpenGL/5.15.8/QtOpenGL/private/qgraphicsshadereffect_p.h diff --git a/include/QtOpenGL/5.15.3/QtOpenGL/private/qpaintengineex_opengl2_p.h b/include/QtOpenGL/5.15.8/QtOpenGL/private/qpaintengineex_opengl2_p.h similarity index 100% rename from include/QtOpenGL/5.15.3/QtOpenGL/private/qpaintengineex_opengl2_p.h rename to include/QtOpenGL/5.15.8/QtOpenGL/private/qpaintengineex_opengl2_p.h diff --git a/include/QtOpenGL/5.15.3/QtOpenGL/private/qtextureglyphcache_gl_p.h b/include/QtOpenGL/5.15.8/QtOpenGL/private/qtextureglyphcache_gl_p.h similarity index 100% rename from include/QtOpenGL/5.15.3/QtOpenGL/private/qtextureglyphcache_gl_p.h rename to include/QtOpenGL/5.15.8/QtOpenGL/private/qtextureglyphcache_gl_p.h diff --git a/include/QtOpenGL/qtopenglversion.h b/include/QtOpenGL/qtopenglversion.h index 8205a778..aa3a82dc 100644 --- a/include/QtOpenGL/qtopenglversion.h +++ b/include/QtOpenGL/qtopenglversion.h @@ -2,8 +2,8 @@ #ifndef QT_QTOPENGL_VERSION_H #define QT_QTOPENGL_VERSION_H -#define QTOPENGL_VERSION_STR "5.15.3" +#define QTOPENGL_VERSION_STR "5.15.8" -#define QTOPENGL_VERSION 0x050F03 +#define QTOPENGL_VERSION 0x050F08 #endif // QT_QTOPENGL_VERSION_H diff --git a/include/QtOpenGLExtensions/qtopenglextensionsversion.h b/include/QtOpenGLExtensions/qtopenglextensionsversion.h index 775c129d..df4df5e3 100644 --- a/include/QtOpenGLExtensions/qtopenglextensionsversion.h +++ b/include/QtOpenGLExtensions/qtopenglextensionsversion.h @@ -2,8 +2,8 @@ #ifndef QT_QTOPENGLEXTENSIONS_VERSION_H #define QT_QTOPENGLEXTENSIONS_VERSION_H -#define QTOPENGLEXTENSIONS_VERSION_STR "5.15.3" +#define QTOPENGLEXTENSIONS_VERSION_STR "5.15.8" -#define QTOPENGLEXTENSIONS_VERSION 0x050F03 +#define QTOPENGLEXTENSIONS_VERSION 0x050F08 #endif // QT_QTOPENGLEXTENSIONS_VERSION_H diff --git a/include/QtPlatformCompositorSupport/5.15.3/QtPlatformCompositorSupport/private/qopenglcompositor_p.h b/include/QtPlatformCompositorSupport/5.15.8/QtPlatformCompositorSupport/private/qopenglcompositor_p.h similarity index 100% rename from include/QtPlatformCompositorSupport/5.15.3/QtPlatformCompositorSupport/private/qopenglcompositor_p.h rename to include/QtPlatformCompositorSupport/5.15.8/QtPlatformCompositorSupport/private/qopenglcompositor_p.h diff --git a/include/QtPlatformCompositorSupport/5.15.3/QtPlatformCompositorSupport/private/qopenglcompositorbackingstore_p.h b/include/QtPlatformCompositorSupport/5.15.8/QtPlatformCompositorSupport/private/qopenglcompositorbackingstore_p.h similarity index 100% rename from include/QtPlatformCompositorSupport/5.15.3/QtPlatformCompositorSupport/private/qopenglcompositorbackingstore_p.h rename to include/QtPlatformCompositorSupport/5.15.8/QtPlatformCompositorSupport/private/qopenglcompositorbackingstore_p.h diff --git a/include/QtPlatformCompositorSupport/qtplatformcompositorsupportversion.h b/include/QtPlatformCompositorSupport/qtplatformcompositorsupportversion.h index cbda8a09..28229d90 100644 --- a/include/QtPlatformCompositorSupport/qtplatformcompositorsupportversion.h +++ b/include/QtPlatformCompositorSupport/qtplatformcompositorsupportversion.h @@ -2,8 +2,8 @@ #ifndef QT_QTPLATFORMCOMPOSITORSUPPORT_VERSION_H #define QT_QTPLATFORMCOMPOSITORSUPPORT_VERSION_H -#define QTPLATFORMCOMPOSITORSUPPORT_VERSION_STR "5.15.3" +#define QTPLATFORMCOMPOSITORSUPPORT_VERSION_STR "5.15.8" -#define QTPLATFORMCOMPOSITORSUPPORT_VERSION 0x050F03 +#define QTPLATFORMCOMPOSITORSUPPORT_VERSION 0x050F08 #endif // QT_QTPLATFORMCOMPOSITORSUPPORT_VERSION_H diff --git a/include/QtPlatformHeaders/qtplatformheadersversion.h b/include/QtPlatformHeaders/qtplatformheadersversion.h index 771660e2..a019a73c 100644 --- a/include/QtPlatformHeaders/qtplatformheadersversion.h +++ b/include/QtPlatformHeaders/qtplatformheadersversion.h @@ -2,8 +2,8 @@ #ifndef QT_QTPLATFORMHEADERS_VERSION_H #define QT_QTPLATFORMHEADERS_VERSION_H -#define QTPLATFORMHEADERS_VERSION_STR "5.15.3" +#define QTPLATFORMHEADERS_VERSION_STR "5.15.8" -#define QTPLATFORMHEADERS_VERSION 0x050F03 +#define QTPLATFORMHEADERS_VERSION 0x050F08 #endif // QT_QTPLATFORMHEADERS_VERSION_H diff --git a/include/QtPrintSupport/5.15.3/QtPrintSupport/private/qabstractprintdialog_p.h b/include/QtPrintSupport/5.15.8/QtPrintSupport/private/qabstractprintdialog_p.h similarity index 100% rename from include/QtPrintSupport/5.15.3/QtPrintSupport/private/qabstractprintdialog_p.h rename to include/QtPrintSupport/5.15.8/QtPrintSupport/private/qabstractprintdialog_p.h diff --git a/include/QtPrintSupport/5.15.3/QtPrintSupport/private/qcups_p.h b/include/QtPrintSupport/5.15.8/QtPrintSupport/private/qcups_p.h similarity index 100% rename from include/QtPrintSupport/5.15.3/QtPrintSupport/private/qcups_p.h rename to include/QtPrintSupport/5.15.8/QtPrintSupport/private/qcups_p.h diff --git a/include/QtPrintSupport/5.15.3/QtPrintSupport/private/qcupsjobwidget_p.h b/include/QtPrintSupport/5.15.8/QtPrintSupport/private/qcupsjobwidget_p.h similarity index 100% rename from include/QtPrintSupport/5.15.3/QtPrintSupport/private/qcupsjobwidget_p.h rename to include/QtPrintSupport/5.15.8/QtPrintSupport/private/qcupsjobwidget_p.h diff --git a/include/QtPrintSupport/5.15.3/QtPrintSupport/private/qpagesetupdialog_p.h b/include/QtPrintSupport/5.15.8/QtPrintSupport/private/qpagesetupdialog_p.h similarity index 100% rename from include/QtPrintSupport/5.15.3/QtPrintSupport/private/qpagesetupdialog_p.h rename to include/QtPrintSupport/5.15.8/QtPrintSupport/private/qpagesetupdialog_p.h diff --git a/include/QtPrintSupport/5.15.3/QtPrintSupport/private/qpagesetupdialog_unix_p.h b/include/QtPrintSupport/5.15.8/QtPrintSupport/private/qpagesetupdialog_unix_p.h similarity index 100% rename from include/QtPrintSupport/5.15.3/QtPrintSupport/private/qpagesetupdialog_unix_p.h rename to include/QtPrintSupport/5.15.8/QtPrintSupport/private/qpagesetupdialog_unix_p.h diff --git a/include/QtPrintSupport/5.15.3/QtPrintSupport/private/qpaintengine_alpha_p.h b/include/QtPrintSupport/5.15.8/QtPrintSupport/private/qpaintengine_alpha_p.h similarity index 100% rename from include/QtPrintSupport/5.15.3/QtPrintSupport/private/qpaintengine_alpha_p.h rename to include/QtPrintSupport/5.15.8/QtPrintSupport/private/qpaintengine_alpha_p.h diff --git a/include/QtPrintSupport/5.15.3/QtPrintSupport/private/qpaintengine_preview_p.h b/include/QtPrintSupport/5.15.8/QtPrintSupport/private/qpaintengine_preview_p.h similarity index 100% rename from include/QtPrintSupport/5.15.3/QtPrintSupport/private/qpaintengine_preview_p.h rename to include/QtPrintSupport/5.15.8/QtPrintSupport/private/qpaintengine_preview_p.h diff --git a/include/QtPrintSupport/5.15.3/QtPrintSupport/private/qprint_p.h b/include/QtPrintSupport/5.15.8/QtPrintSupport/private/qprint_p.h similarity index 100% rename from include/QtPrintSupport/5.15.3/QtPrintSupport/private/qprint_p.h rename to include/QtPrintSupport/5.15.8/QtPrintSupport/private/qprint_p.h diff --git a/include/QtPrintSupport/5.15.3/QtPrintSupport/private/qprintdevice_p.h b/include/QtPrintSupport/5.15.8/QtPrintSupport/private/qprintdevice_p.h similarity index 100% rename from include/QtPrintSupport/5.15.3/QtPrintSupport/private/qprintdevice_p.h rename to include/QtPrintSupport/5.15.8/QtPrintSupport/private/qprintdevice_p.h diff --git a/include/QtPrintSupport/5.15.3/QtPrintSupport/private/qprintengine_pdf_p.h b/include/QtPrintSupport/5.15.8/QtPrintSupport/private/qprintengine_pdf_p.h similarity index 100% rename from include/QtPrintSupport/5.15.3/QtPrintSupport/private/qprintengine_pdf_p.h rename to include/QtPrintSupport/5.15.8/QtPrintSupport/private/qprintengine_pdf_p.h diff --git a/include/QtPrintSupport/5.15.3/QtPrintSupport/private/qprintengine_win_p.h b/include/QtPrintSupport/5.15.8/QtPrintSupport/private/qprintengine_win_p.h similarity index 100% rename from include/QtPrintSupport/5.15.3/QtPrintSupport/private/qprintengine_win_p.h rename to include/QtPrintSupport/5.15.8/QtPrintSupport/private/qprintengine_win_p.h diff --git a/include/QtPrintSupport/5.15.3/QtPrintSupport/private/qprinter_p.h b/include/QtPrintSupport/5.15.8/QtPrintSupport/private/qprinter_p.h similarity index 100% rename from include/QtPrintSupport/5.15.3/QtPrintSupport/private/qprinter_p.h rename to include/QtPrintSupport/5.15.8/QtPrintSupport/private/qprinter_p.h diff --git a/include/QtPrintSupport/5.15.3/QtPrintSupport/private/qprinterinfo_p.h b/include/QtPrintSupport/5.15.8/QtPrintSupport/private/qprinterinfo_p.h similarity index 100% rename from include/QtPrintSupport/5.15.3/QtPrintSupport/private/qprinterinfo_p.h rename to include/QtPrintSupport/5.15.8/QtPrintSupport/private/qprinterinfo_p.h diff --git a/include/QtPrintSupport/5.15.3/QtPrintSupport/private/qtprintsupportglobal_p.h b/include/QtPrintSupport/5.15.8/QtPrintSupport/private/qtprintsupportglobal_p.h similarity index 100% rename from include/QtPrintSupport/5.15.3/QtPrintSupport/private/qtprintsupportglobal_p.h rename to include/QtPrintSupport/5.15.8/QtPrintSupport/private/qtprintsupportglobal_p.h diff --git a/include/QtPrintSupport/5.15.3/QtPrintSupport/qpa/qplatformprintdevice.h b/include/QtPrintSupport/5.15.8/QtPrintSupport/qpa/qplatformprintdevice.h similarity index 100% rename from include/QtPrintSupport/5.15.3/QtPrintSupport/qpa/qplatformprintdevice.h rename to include/QtPrintSupport/5.15.8/QtPrintSupport/qpa/qplatformprintdevice.h diff --git a/include/QtPrintSupport/5.15.3/QtPrintSupport/qpa/qplatformprintersupport.h b/include/QtPrintSupport/5.15.8/QtPrintSupport/qpa/qplatformprintersupport.h similarity index 100% rename from include/QtPrintSupport/5.15.3/QtPrintSupport/qpa/qplatformprintersupport.h rename to include/QtPrintSupport/5.15.8/QtPrintSupport/qpa/qplatformprintersupport.h diff --git a/include/QtPrintSupport/5.15.3/QtPrintSupport/qpa/qplatformprintplugin.h b/include/QtPrintSupport/5.15.8/QtPrintSupport/qpa/qplatformprintplugin.h similarity index 100% rename from include/QtPrintSupport/5.15.3/QtPrintSupport/qpa/qplatformprintplugin.h rename to include/QtPrintSupport/5.15.8/QtPrintSupport/qpa/qplatformprintplugin.h diff --git a/include/QtPrintSupport/qtprintsupportversion.h b/include/QtPrintSupport/qtprintsupportversion.h index b7916c4d..47abb2fc 100644 --- a/include/QtPrintSupport/qtprintsupportversion.h +++ b/include/QtPrintSupport/qtprintsupportversion.h @@ -2,8 +2,8 @@ #ifndef QT_QTPRINTSUPPORT_VERSION_H #define QT_QTPRINTSUPPORT_VERSION_H -#define QTPRINTSUPPORT_VERSION_STR "5.15.3" +#define QTPRINTSUPPORT_VERSION_STR "5.15.8" -#define QTPRINTSUPPORT_VERSION 0x050F03 +#define QTPRINTSUPPORT_VERSION 0x050F08 #endif // QT_QTPRINTSUPPORT_VERSION_H diff --git a/include/QtServiceSupport/5.15.3/QtServiceSupport/private/qgenericunixservices_p.h b/include/QtServiceSupport/5.15.8/QtServiceSupport/private/qgenericunixservices_p.h similarity index 100% rename from include/QtServiceSupport/5.15.3/QtServiceSupport/private/qgenericunixservices_p.h rename to include/QtServiceSupport/5.15.8/QtServiceSupport/private/qgenericunixservices_p.h diff --git a/include/QtServiceSupport/qtservicesupportversion.h b/include/QtServiceSupport/qtservicesupportversion.h index 7e70b96c..c9bedfca 100644 --- a/include/QtServiceSupport/qtservicesupportversion.h +++ b/include/QtServiceSupport/qtservicesupportversion.h @@ -2,8 +2,8 @@ #ifndef QT_QTSERVICESUPPORT_VERSION_H #define QT_QTSERVICESUPPORT_VERSION_H -#define QTSERVICESUPPORT_VERSION_STR "5.15.3" +#define QTSERVICESUPPORT_VERSION_STR "5.15.8" -#define QTSERVICESUPPORT_VERSION 0x050F03 +#define QTSERVICESUPPORT_VERSION 0x050F08 #endif // QT_QTSERVICESUPPORT_VERSION_H diff --git a/include/QtSql/5.15.3/QtSql/private/qsqlcachedresult_p.h b/include/QtSql/5.15.8/QtSql/private/qsqlcachedresult_p.h similarity index 100% rename from include/QtSql/5.15.3/QtSql/private/qsqlcachedresult_p.h rename to include/QtSql/5.15.8/QtSql/private/qsqlcachedresult_p.h diff --git a/include/QtSql/5.15.3/QtSql/private/qsqldriver_p.h b/include/QtSql/5.15.8/QtSql/private/qsqldriver_p.h similarity index 100% rename from include/QtSql/5.15.3/QtSql/private/qsqldriver_p.h rename to include/QtSql/5.15.8/QtSql/private/qsqldriver_p.h diff --git a/include/QtSql/5.15.3/QtSql/private/qsqlnulldriver_p.h b/include/QtSql/5.15.8/QtSql/private/qsqlnulldriver_p.h similarity index 100% rename from include/QtSql/5.15.3/QtSql/private/qsqlnulldriver_p.h rename to include/QtSql/5.15.8/QtSql/private/qsqlnulldriver_p.h diff --git a/include/QtSql/5.15.3/QtSql/private/qsqlquerymodel_p.h b/include/QtSql/5.15.8/QtSql/private/qsqlquerymodel_p.h similarity index 100% rename from include/QtSql/5.15.3/QtSql/private/qsqlquerymodel_p.h rename to include/QtSql/5.15.8/QtSql/private/qsqlquerymodel_p.h diff --git a/include/QtSql/5.15.3/QtSql/private/qsqlresult_p.h b/include/QtSql/5.15.8/QtSql/private/qsqlresult_p.h similarity index 100% rename from include/QtSql/5.15.3/QtSql/private/qsqlresult_p.h rename to include/QtSql/5.15.8/QtSql/private/qsqlresult_p.h diff --git a/include/QtSql/5.15.3/QtSql/private/qsqltablemodel_p.h b/include/QtSql/5.15.8/QtSql/private/qsqltablemodel_p.h similarity index 100% rename from include/QtSql/5.15.3/QtSql/private/qsqltablemodel_p.h rename to include/QtSql/5.15.8/QtSql/private/qsqltablemodel_p.h diff --git a/include/QtSql/5.15.3/QtSql/private/qtsqlglobal_p.h b/include/QtSql/5.15.8/QtSql/private/qtsqlglobal_p.h similarity index 100% rename from include/QtSql/5.15.3/QtSql/private/qtsqlglobal_p.h rename to include/QtSql/5.15.8/QtSql/private/qtsqlglobal_p.h diff --git a/include/QtSql/qtsqlversion.h b/include/QtSql/qtsqlversion.h index ead8e0d8..cae6b27e 100644 --- a/include/QtSql/qtsqlversion.h +++ b/include/QtSql/qtsqlversion.h @@ -2,8 +2,8 @@ #ifndef QT_QTSQL_VERSION_H #define QT_QTSQL_VERSION_H -#define QTSQL_VERSION_STR "5.15.3" +#define QTSQL_VERSION_STR "5.15.8" -#define QTSQL_VERSION 0x050F03 +#define QTSQL_VERSION 0x050F08 #endif // QT_QTSQL_VERSION_H diff --git a/include/QtTest/5.15.3/QtTest/private/callgrind_p.h b/include/QtTest/5.15.8/QtTest/private/callgrind_p.h similarity index 100% rename from include/QtTest/5.15.3/QtTest/private/callgrind_p.h rename to include/QtTest/5.15.8/QtTest/private/callgrind_p.h diff --git a/include/QtTest/5.15.3/QtTest/private/cycle_p.h b/include/QtTest/5.15.8/QtTest/private/cycle_p.h similarity index 100% rename from include/QtTest/5.15.3/QtTest/private/cycle_p.h rename to include/QtTest/5.15.8/QtTest/private/cycle_p.h diff --git a/include/QtTest/5.15.3/QtTest/private/linux_perf_event_p.h b/include/QtTest/5.15.8/QtTest/private/linux_perf_event_p.h similarity index 100% rename from include/QtTest/5.15.3/QtTest/private/linux_perf_event_p.h rename to include/QtTest/5.15.8/QtTest/private/linux_perf_event_p.h diff --git a/include/QtTest/5.15.3/QtTest/private/qabstracttestlogger_p.h b/include/QtTest/5.15.8/QtTest/private/qabstracttestlogger_p.h similarity index 100% rename from include/QtTest/5.15.3/QtTest/private/qabstracttestlogger_p.h rename to include/QtTest/5.15.8/QtTest/private/qabstracttestlogger_p.h diff --git a/include/QtTest/5.15.3/QtTest/private/qappletestlogger_p.h b/include/QtTest/5.15.8/QtTest/private/qappletestlogger_p.h similarity index 100% rename from include/QtTest/5.15.3/QtTest/private/qappletestlogger_p.h rename to include/QtTest/5.15.8/QtTest/private/qappletestlogger_p.h diff --git a/include/QtTest/5.15.3/QtTest/private/qbenchmark_p.h b/include/QtTest/5.15.8/QtTest/private/qbenchmark_p.h similarity index 100% rename from include/QtTest/5.15.3/QtTest/private/qbenchmark_p.h rename to include/QtTest/5.15.8/QtTest/private/qbenchmark_p.h diff --git a/include/QtTest/5.15.3/QtTest/private/qbenchmarkevent_p.h b/include/QtTest/5.15.8/QtTest/private/qbenchmarkevent_p.h similarity index 100% rename from include/QtTest/5.15.3/QtTest/private/qbenchmarkevent_p.h rename to include/QtTest/5.15.8/QtTest/private/qbenchmarkevent_p.h diff --git a/include/QtTest/5.15.3/QtTest/private/qbenchmarkmeasurement_p.h b/include/QtTest/5.15.8/QtTest/private/qbenchmarkmeasurement_p.h similarity index 100% rename from include/QtTest/5.15.3/QtTest/private/qbenchmarkmeasurement_p.h rename to include/QtTest/5.15.8/QtTest/private/qbenchmarkmeasurement_p.h diff --git a/include/QtTest/5.15.3/QtTest/private/qbenchmarkmetric_p.h b/include/QtTest/5.15.8/QtTest/private/qbenchmarkmetric_p.h similarity index 100% rename from include/QtTest/5.15.3/QtTest/private/qbenchmarkmetric_p.h rename to include/QtTest/5.15.8/QtTest/private/qbenchmarkmetric_p.h diff --git a/include/QtTest/5.15.3/QtTest/private/qbenchmarkperfevents_p.h b/include/QtTest/5.15.8/QtTest/private/qbenchmarkperfevents_p.h similarity index 100% rename from include/QtTest/5.15.3/QtTest/private/qbenchmarkperfevents_p.h rename to include/QtTest/5.15.8/QtTest/private/qbenchmarkperfevents_p.h diff --git a/include/QtTest/5.15.3/QtTest/private/qbenchmarktimemeasurers_p.h b/include/QtTest/5.15.8/QtTest/private/qbenchmarktimemeasurers_p.h similarity index 100% rename from include/QtTest/5.15.3/QtTest/private/qbenchmarktimemeasurers_p.h rename to include/QtTest/5.15.8/QtTest/private/qbenchmarktimemeasurers_p.h diff --git a/include/QtTest/5.15.3/QtTest/private/qbenchmarkvalgrind_p.h b/include/QtTest/5.15.8/QtTest/private/qbenchmarkvalgrind_p.h similarity index 100% rename from include/QtTest/5.15.3/QtTest/private/qbenchmarkvalgrind_p.h rename to include/QtTest/5.15.8/QtTest/private/qbenchmarkvalgrind_p.h diff --git a/include/QtTest/5.15.3/QtTest/private/qcsvbenchmarklogger_p.h b/include/QtTest/5.15.8/QtTest/private/qcsvbenchmarklogger_p.h similarity index 100% rename from include/QtTest/5.15.3/QtTest/private/qcsvbenchmarklogger_p.h rename to include/QtTest/5.15.8/QtTest/private/qcsvbenchmarklogger_p.h diff --git a/include/QtTest/5.15.3/QtTest/private/qjunittestlogger_p.h b/include/QtTest/5.15.8/QtTest/private/qjunittestlogger_p.h similarity index 100% rename from include/QtTest/5.15.3/QtTest/private/qjunittestlogger_p.h rename to include/QtTest/5.15.8/QtTest/private/qjunittestlogger_p.h diff --git a/include/QtTest/5.15.3/QtTest/private/qplaintestlogger_p.h b/include/QtTest/5.15.8/QtTest/private/qplaintestlogger_p.h similarity index 100% rename from include/QtTest/5.15.3/QtTest/private/qplaintestlogger_p.h rename to include/QtTest/5.15.8/QtTest/private/qplaintestlogger_p.h diff --git a/include/QtTest/5.15.3/QtTest/private/qsignaldumper_p.h b/include/QtTest/5.15.8/QtTest/private/qsignaldumper_p.h similarity index 100% rename from include/QtTest/5.15.3/QtTest/private/qsignaldumper_p.h rename to include/QtTest/5.15.8/QtTest/private/qsignaldumper_p.h diff --git a/include/QtTest/5.15.3/QtTest/private/qtaptestlogger_p.h b/include/QtTest/5.15.8/QtTest/private/qtaptestlogger_p.h similarity index 100% rename from include/QtTest/5.15.3/QtTest/private/qtaptestlogger_p.h rename to include/QtTest/5.15.8/QtTest/private/qtaptestlogger_p.h diff --git a/include/QtTest/5.15.3/QtTest/private/qteamcitylogger_p.h b/include/QtTest/5.15.8/QtTest/private/qteamcitylogger_p.h similarity index 100% rename from include/QtTest/5.15.3/QtTest/private/qteamcitylogger_p.h rename to include/QtTest/5.15.8/QtTest/private/qteamcitylogger_p.h diff --git a/include/QtTest/5.15.3/QtTest/private/qtestblacklist_p.h b/include/QtTest/5.15.8/QtTest/private/qtestblacklist_p.h similarity index 100% rename from include/QtTest/5.15.3/QtTest/private/qtestblacklist_p.h rename to include/QtTest/5.15.8/QtTest/private/qtestblacklist_p.h diff --git a/include/QtTest/5.15.3/QtTest/private/qtestcoreelement_p.h b/include/QtTest/5.15.8/QtTest/private/qtestcoreelement_p.h similarity index 100% rename from include/QtTest/5.15.3/QtTest/private/qtestcoreelement_p.h rename to include/QtTest/5.15.8/QtTest/private/qtestcoreelement_p.h diff --git a/include/QtTest/5.15.3/QtTest/private/qtestcorelist_p.h b/include/QtTest/5.15.8/QtTest/private/qtestcorelist_p.h similarity index 100% rename from include/QtTest/5.15.3/QtTest/private/qtestcorelist_p.h rename to include/QtTest/5.15.8/QtTest/private/qtestcorelist_p.h diff --git a/include/QtTest/5.15.3/QtTest/private/qtestelement_p.h b/include/QtTest/5.15.8/QtTest/private/qtestelement_p.h similarity index 100% rename from include/QtTest/5.15.3/QtTest/private/qtestelement_p.h rename to include/QtTest/5.15.8/QtTest/private/qtestelement_p.h diff --git a/include/QtTest/5.15.3/QtTest/private/qtestelementattribute_p.h b/include/QtTest/5.15.8/QtTest/private/qtestelementattribute_p.h similarity index 100% rename from include/QtTest/5.15.3/QtTest/private/qtestelementattribute_p.h rename to include/QtTest/5.15.8/QtTest/private/qtestelementattribute_p.h diff --git a/include/QtTest/5.15.3/QtTest/private/qtesthelpers_p.h b/include/QtTest/5.15.8/QtTest/private/qtesthelpers_p.h similarity index 100% rename from include/QtTest/5.15.3/QtTest/private/qtesthelpers_p.h rename to include/QtTest/5.15.8/QtTest/private/qtesthelpers_p.h diff --git a/include/QtTest/5.15.3/QtTest/private/qtestjunitstreamer_p.h b/include/QtTest/5.15.8/QtTest/private/qtestjunitstreamer_p.h similarity index 100% rename from include/QtTest/5.15.3/QtTest/private/qtestjunitstreamer_p.h rename to include/QtTest/5.15.8/QtTest/private/qtestjunitstreamer_p.h diff --git a/include/QtTest/5.15.3/QtTest/private/qtestlog_p.h b/include/QtTest/5.15.8/QtTest/private/qtestlog_p.h similarity index 100% rename from include/QtTest/5.15.3/QtTest/private/qtestlog_p.h rename to include/QtTest/5.15.8/QtTest/private/qtestlog_p.h diff --git a/include/QtTest/5.15.3/QtTest/private/qtestresult_p.h b/include/QtTest/5.15.8/QtTest/private/qtestresult_p.h similarity index 100% rename from include/QtTest/5.15.3/QtTest/private/qtestresult_p.h rename to include/QtTest/5.15.8/QtTest/private/qtestresult_p.h diff --git a/include/QtTest/5.15.3/QtTest/private/qtesttable_p.h b/include/QtTest/5.15.8/QtTest/private/qtesttable_p.h similarity index 100% rename from include/QtTest/5.15.3/QtTest/private/qtesttable_p.h rename to include/QtTest/5.15.8/QtTest/private/qtesttable_p.h diff --git a/include/QtTest/5.15.3/QtTest/private/qtestutil_macos_p.h b/include/QtTest/5.15.8/QtTest/private/qtestutil_macos_p.h similarity index 100% rename from include/QtTest/5.15.3/QtTest/private/qtestutil_macos_p.h rename to include/QtTest/5.15.8/QtTest/private/qtestutil_macos_p.h diff --git a/include/QtTest/5.15.3/QtTest/private/qxctestlogger_p.h b/include/QtTest/5.15.8/QtTest/private/qxctestlogger_p.h similarity index 100% rename from include/QtTest/5.15.3/QtTest/private/qxctestlogger_p.h rename to include/QtTest/5.15.8/QtTest/private/qxctestlogger_p.h diff --git a/include/QtTest/5.15.3/QtTest/private/qxmltestlogger_p.h b/include/QtTest/5.15.8/QtTest/private/qxmltestlogger_p.h similarity index 100% rename from include/QtTest/5.15.3/QtTest/private/qxmltestlogger_p.h rename to include/QtTest/5.15.8/QtTest/private/qxmltestlogger_p.h diff --git a/include/QtTest/5.15.3/QtTest/private/valgrind_p.h b/include/QtTest/5.15.8/QtTest/private/valgrind_p.h similarity index 100% rename from include/QtTest/5.15.3/QtTest/private/valgrind_p.h rename to include/QtTest/5.15.8/QtTest/private/valgrind_p.h diff --git a/include/QtTest/qttestversion.h b/include/QtTest/qttestversion.h index e849bc69..f5f7868d 100644 --- a/include/QtTest/qttestversion.h +++ b/include/QtTest/qttestversion.h @@ -2,8 +2,8 @@ #ifndef QT_QTTEST_VERSION_H #define QT_QTTEST_VERSION_H -#define QTTEST_VERSION_STR "5.15.3" +#define QTTEST_VERSION_STR "5.15.8" -#define QTTEST_VERSION 0x050F03 +#define QTTEST_VERSION 0x050F08 #endif // QT_QTTEST_VERSION_H diff --git a/include/QtThemeSupport/5.15.3/QtThemeSupport/private/qabstractfileiconengine_p.h b/include/QtThemeSupport/5.15.8/QtThemeSupport/private/qabstractfileiconengine_p.h similarity index 100% rename from include/QtThemeSupport/5.15.3/QtThemeSupport/private/qabstractfileiconengine_p.h rename to include/QtThemeSupport/5.15.8/QtThemeSupport/private/qabstractfileiconengine_p.h diff --git a/include/QtThemeSupport/5.15.3/QtThemeSupport/private/qdbusmenuadaptor_p.h b/include/QtThemeSupport/5.15.8/QtThemeSupport/private/qdbusmenuadaptor_p.h similarity index 100% rename from include/QtThemeSupport/5.15.3/QtThemeSupport/private/qdbusmenuadaptor_p.h rename to include/QtThemeSupport/5.15.8/QtThemeSupport/private/qdbusmenuadaptor_p.h diff --git a/include/QtThemeSupport/5.15.3/QtThemeSupport/private/qdbusmenubar_p.h b/include/QtThemeSupport/5.15.8/QtThemeSupport/private/qdbusmenubar_p.h similarity index 100% rename from include/QtThemeSupport/5.15.3/QtThemeSupport/private/qdbusmenubar_p.h rename to include/QtThemeSupport/5.15.8/QtThemeSupport/private/qdbusmenubar_p.h diff --git a/include/QtThemeSupport/5.15.3/QtThemeSupport/private/qdbusmenuconnection_p.h b/include/QtThemeSupport/5.15.8/QtThemeSupport/private/qdbusmenuconnection_p.h similarity index 100% rename from include/QtThemeSupport/5.15.3/QtThemeSupport/private/qdbusmenuconnection_p.h rename to include/QtThemeSupport/5.15.8/QtThemeSupport/private/qdbusmenuconnection_p.h diff --git a/include/QtThemeSupport/5.15.3/QtThemeSupport/private/qdbusmenuregistrarproxy_p.h b/include/QtThemeSupport/5.15.8/QtThemeSupport/private/qdbusmenuregistrarproxy_p.h similarity index 100% rename from include/QtThemeSupport/5.15.3/QtThemeSupport/private/qdbusmenuregistrarproxy_p.h rename to include/QtThemeSupport/5.15.8/QtThemeSupport/private/qdbusmenuregistrarproxy_p.h diff --git a/include/QtThemeSupport/5.15.3/QtThemeSupport/private/qdbusmenutypes_p.h b/include/QtThemeSupport/5.15.8/QtThemeSupport/private/qdbusmenutypes_p.h similarity index 100% rename from include/QtThemeSupport/5.15.3/QtThemeSupport/private/qdbusmenutypes_p.h rename to include/QtThemeSupport/5.15.8/QtThemeSupport/private/qdbusmenutypes_p.h diff --git a/include/QtThemeSupport/5.15.3/QtThemeSupport/private/qdbusplatformmenu_p.h b/include/QtThemeSupport/5.15.8/QtThemeSupport/private/qdbusplatformmenu_p.h similarity index 100% rename from include/QtThemeSupport/5.15.3/QtThemeSupport/private/qdbusplatformmenu_p.h rename to include/QtThemeSupport/5.15.8/QtThemeSupport/private/qdbusplatformmenu_p.h diff --git a/include/QtThemeSupport/5.15.3/QtThemeSupport/private/qdbustrayicon_p.h b/include/QtThemeSupport/5.15.8/QtThemeSupport/private/qdbustrayicon_p.h similarity index 100% rename from include/QtThemeSupport/5.15.3/QtThemeSupport/private/qdbustrayicon_p.h rename to include/QtThemeSupport/5.15.8/QtThemeSupport/private/qdbustrayicon_p.h diff --git a/include/QtThemeSupport/5.15.3/QtThemeSupport/private/qdbustraytypes_p.h b/include/QtThemeSupport/5.15.8/QtThemeSupport/private/qdbustraytypes_p.h similarity index 100% rename from include/QtThemeSupport/5.15.3/QtThemeSupport/private/qdbustraytypes_p.h rename to include/QtThemeSupport/5.15.8/QtThemeSupport/private/qdbustraytypes_p.h diff --git a/include/QtThemeSupport/5.15.3/QtThemeSupport/private/qgenericunixthemes_p.h b/include/QtThemeSupport/5.15.8/QtThemeSupport/private/qgenericunixthemes_p.h similarity index 100% rename from include/QtThemeSupport/5.15.3/QtThemeSupport/private/qgenericunixthemes_p.h rename to include/QtThemeSupport/5.15.8/QtThemeSupport/private/qgenericunixthemes_p.h diff --git a/include/QtThemeSupport/5.15.3/QtThemeSupport/private/qstatusnotifieritemadaptor_p.h b/include/QtThemeSupport/5.15.8/QtThemeSupport/private/qstatusnotifieritemadaptor_p.h similarity index 100% rename from include/QtThemeSupport/5.15.3/QtThemeSupport/private/qstatusnotifieritemadaptor_p.h rename to include/QtThemeSupport/5.15.8/QtThemeSupport/private/qstatusnotifieritemadaptor_p.h diff --git a/include/QtThemeSupport/5.15.3/QtThemeSupport/private/qxdgnotificationproxy_p.h b/include/QtThemeSupport/5.15.8/QtThemeSupport/private/qxdgnotificationproxy_p.h similarity index 100% rename from include/QtThemeSupport/5.15.3/QtThemeSupport/private/qxdgnotificationproxy_p.h rename to include/QtThemeSupport/5.15.8/QtThemeSupport/private/qxdgnotificationproxy_p.h diff --git a/include/QtThemeSupport/qtthemesupportversion.h b/include/QtThemeSupport/qtthemesupportversion.h index eb454653..560c409e 100644 --- a/include/QtThemeSupport/qtthemesupportversion.h +++ b/include/QtThemeSupport/qtthemesupportversion.h @@ -2,8 +2,8 @@ #ifndef QT_QTTHEMESUPPORT_VERSION_H #define QT_QTTHEMESUPPORT_VERSION_H -#define QTTHEMESUPPORT_VERSION_STR "5.15.3" +#define QTTHEMESUPPORT_VERSION_STR "5.15.8" -#define QTTHEMESUPPORT_VERSION 0x050F03 +#define QTTHEMESUPPORT_VERSION 0x050F08 #endif // QT_QTTHEMESUPPORT_VERSION_H diff --git a/include/QtVulkanSupport/5.15.3/QtVulkanSupport/private/qbasicvulkanplatforminstance_p.h b/include/QtVulkanSupport/5.15.8/QtVulkanSupport/private/qbasicvulkanplatforminstance_p.h similarity index 100% rename from include/QtVulkanSupport/5.15.3/QtVulkanSupport/private/qbasicvulkanplatforminstance_p.h rename to include/QtVulkanSupport/5.15.8/QtVulkanSupport/private/qbasicvulkanplatforminstance_p.h diff --git a/include/QtVulkanSupport/5.15.3/QtVulkanSupport/private/qvkconvenience_p.h b/include/QtVulkanSupport/5.15.8/QtVulkanSupport/private/qvkconvenience_p.h similarity index 100% rename from include/QtVulkanSupport/5.15.3/QtVulkanSupport/private/qvkconvenience_p.h rename to include/QtVulkanSupport/5.15.8/QtVulkanSupport/private/qvkconvenience_p.h diff --git a/include/QtVulkanSupport/qtvulkansupportversion.h b/include/QtVulkanSupport/qtvulkansupportversion.h index b9bebcfb..3c8b825c 100644 --- a/include/QtVulkanSupport/qtvulkansupportversion.h +++ b/include/QtVulkanSupport/qtvulkansupportversion.h @@ -2,8 +2,8 @@ #ifndef QT_QTVULKANSUPPORT_VERSION_H #define QT_QTVULKANSUPPORT_VERSION_H -#define QTVULKANSUPPORT_VERSION_STR "5.15.3" +#define QTVULKANSUPPORT_VERSION_STR "5.15.8" -#define QTVULKANSUPPORT_VERSION 0x050F03 +#define QTVULKANSUPPORT_VERSION 0x050F08 #endif // QT_QTVULKANSUPPORT_VERSION_H diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/complexwidgets_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/complexwidgets_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/complexwidgets_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/complexwidgets_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/itemviews_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/itemviews_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/itemviews_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/itemviews_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qabstractbutton_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qabstractbutton_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qabstractbutton_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qabstractbutton_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qabstractitemdelegate_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qabstractitemdelegate_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qabstractitemdelegate_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qabstractitemdelegate_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qabstractitemview_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qabstractitemview_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qabstractitemview_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qabstractitemview_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qabstractscrollarea_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qabstractscrollarea_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qabstractscrollarea_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qabstractscrollarea_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qabstractslider_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qabstractslider_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qabstractslider_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qabstractslider_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qabstractspinbox_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qabstractspinbox_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qabstractspinbox_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qabstractspinbox_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qaccessiblemenu_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qaccessiblemenu_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qaccessiblemenu_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qaccessiblemenu_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qaccessiblewidgetfactory_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qaccessiblewidgetfactory_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qaccessiblewidgetfactory_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qaccessiblewidgetfactory_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qaccessiblewidgets_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qaccessiblewidgets_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qaccessiblewidgets_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qaccessiblewidgets_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qaction_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qaction_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qaction_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qaction_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qapplication_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qapplication_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qapplication_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qapplication_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qbasickeyeventtransition_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qbasickeyeventtransition_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qbasickeyeventtransition_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qbasickeyeventtransition_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qbasicmouseeventtransition_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qbasicmouseeventtransition_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qbasicmouseeventtransition_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qbasicmouseeventtransition_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qbsptree_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qbsptree_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qbsptree_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qbsptree_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qbuttongroup_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qbuttongroup_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qbuttongroup_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qbuttongroup_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qcolumnview_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qcolumnview_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qcolumnview_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qcolumnview_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qcolumnviewgrip_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qcolumnviewgrip_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qcolumnviewgrip_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qcolumnviewgrip_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qcombobox_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qcombobox_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qcombobox_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qcombobox_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qcommonstyle_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qcommonstyle_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qcommonstyle_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qcommonstyle_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qcommonstylepixmaps_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qcommonstylepixmaps_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qcommonstylepixmaps_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qcommonstylepixmaps_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qcompleter_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qcompleter_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qcompleter_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qcompleter_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qdatetimeedit_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qdatetimeedit_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qdatetimeedit_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qdatetimeedit_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qdesktopwidget_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qdesktopwidget_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qdesktopwidget_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qdesktopwidget_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qdialog_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qdialog_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qdialog_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qdialog_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qdockarealayout_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qdockarealayout_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qdockarealayout_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qdockarealayout_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qdockwidget_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qdockwidget_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qdockwidget_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qdockwidget_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qeffects_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qeffects_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qeffects_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qeffects_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qfiledialog_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qfiledialog_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qfiledialog_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qfiledialog_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qfileiconprovider_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qfileiconprovider_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qfileiconprovider_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qfileiconprovider_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qfileinfogatherer_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qfileinfogatherer_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qfileinfogatherer_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qfileinfogatherer_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qfilesystemmodel_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qfilesystemmodel_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qfilesystemmodel_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qfilesystemmodel_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qflickgesture_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qflickgesture_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qflickgesture_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qflickgesture_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qfontdialog_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qfontdialog_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qfontdialog_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qfontdialog_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qframe_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qframe_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qframe_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qframe_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qfscompleter_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qfscompleter_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qfscompleter_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qfscompleter_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qfusionstyle_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qfusionstyle_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qfusionstyle_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qfusionstyle_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qfusionstyle_p_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qfusionstyle_p_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qfusionstyle_p_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qfusionstyle_p_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qgesture_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qgesture_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qgesture_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qgesture_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qgesturemanager_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qgesturemanager_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qgesturemanager_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qgesturemanager_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qgraph_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qgraph_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qgraph_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qgraph_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qgraphicsanchorlayout_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qgraphicsanchorlayout_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qgraphicsanchorlayout_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qgraphicsanchorlayout_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qgraphicseffect_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qgraphicseffect_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qgraphicseffect_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qgraphicseffect_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qgraphicsgridlayoutengine_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qgraphicsgridlayoutengine_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qgraphicsgridlayoutengine_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qgraphicsgridlayoutengine_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qgraphicsitem_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qgraphicsitem_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qgraphicsitem_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qgraphicsitem_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qgraphicslayout_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qgraphicslayout_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qgraphicslayout_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qgraphicslayout_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qgraphicslayoutitem_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qgraphicslayoutitem_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qgraphicslayoutitem_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qgraphicslayoutitem_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qgraphicslayoutstyleinfo_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qgraphicslayoutstyleinfo_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qgraphicslayoutstyleinfo_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qgraphicslayoutstyleinfo_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qgraphicsproxywidget_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qgraphicsproxywidget_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qgraphicsproxywidget_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qgraphicsproxywidget_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qgraphicsscene_bsp_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qgraphicsscene_bsp_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qgraphicsscene_bsp_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qgraphicsscene_bsp_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qgraphicsscene_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qgraphicsscene_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qgraphicsscene_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qgraphicsscene_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qgraphicsscenebsptreeindex_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qgraphicsscenebsptreeindex_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qgraphicsscenebsptreeindex_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qgraphicsscenebsptreeindex_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qgraphicssceneindex_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qgraphicssceneindex_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qgraphicssceneindex_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qgraphicssceneindex_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qgraphicsscenelinearindex_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qgraphicsscenelinearindex_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qgraphicsscenelinearindex_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qgraphicsscenelinearindex_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qgraphicstransform_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qgraphicstransform_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qgraphicstransform_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qgraphicstransform_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qgraphicsview_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qgraphicsview_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qgraphicsview_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qgraphicsview_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qgraphicswidget_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qgraphicswidget_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qgraphicswidget_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qgraphicswidget_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qheaderview_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qheaderview_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qheaderview_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qheaderview_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qitemeditorfactory_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qitemeditorfactory_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qitemeditorfactory_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qitemeditorfactory_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qkeysequenceedit_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qkeysequenceedit_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qkeysequenceedit_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qkeysequenceedit_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qlabel_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qlabel_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qlabel_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qlabel_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qlayout_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qlayout_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qlayout_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qlayout_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qlayoutengine_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qlayoutengine_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qlayoutengine_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qlayoutengine_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qlineedit_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qlineedit_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qlineedit_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qlineedit_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qlistview_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qlistview_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qlistview_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qlistview_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qlistwidget_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qlistwidget_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qlistwidget_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qlistwidget_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qmacgesturerecognizer_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qmacgesturerecognizer_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qmacgesturerecognizer_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qmacgesturerecognizer_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qmainwindowlayout_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qmainwindowlayout_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qmainwindowlayout_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qmainwindowlayout_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qmdiarea_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qmdiarea_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qmdiarea_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qmdiarea_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qmdisubwindow_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qmdisubwindow_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qmdisubwindow_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qmdisubwindow_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qmenu_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qmenu_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qmenu_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qmenu_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qmenubar_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qmenubar_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qmenubar_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qmenubar_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qpixmapfilter_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qpixmapfilter_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qpixmapfilter_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qpixmapfilter_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qpixmapstyle_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qpixmapstyle_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qpixmapstyle_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qpixmapstyle_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qpixmapstyle_p_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qpixmapstyle_p_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qpixmapstyle_p_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qpixmapstyle_p_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qplaintextedit_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qplaintextedit_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qplaintextedit_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qplaintextedit_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qproxystyle_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qproxystyle_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qproxystyle_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qproxystyle_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qpushbutton_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qpushbutton_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qpushbutton_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qpushbutton_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qscrollarea_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qscrollarea_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qscrollarea_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qscrollarea_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qscrollbar_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qscrollbar_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qscrollbar_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qscrollbar_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qscroller_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qscroller_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qscroller_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qscroller_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qscrollerproperties_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qscrollerproperties_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qscrollerproperties_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qscrollerproperties_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qsidebar_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qsidebar_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qsidebar_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qsidebar_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qsimplex_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qsimplex_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qsimplex_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qsimplex_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qsplitter_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qsplitter_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qsplitter_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qsplitter_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qstandardgestures_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qstandardgestures_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qstandardgestures_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qstandardgestures_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qstyle_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qstyle_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qstyle_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qstyle_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qstyleanimation_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qstyleanimation_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qstyleanimation_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qstyleanimation_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qstylehelper_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qstylehelper_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qstylehelper_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qstylehelper_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qstylesheetstyle_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qstylesheetstyle_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qstylesheetstyle_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qstylesheetstyle_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qsystemtrayicon_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qsystemtrayicon_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qsystemtrayicon_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qsystemtrayicon_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qt_widgets_pch.h b/include/QtWidgets/5.15.8/QtWidgets/private/qt_widgets_pch.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qt_widgets_pch.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qt_widgets_pch.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qtabbar_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qtabbar_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qtabbar_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qtabbar_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qtableview_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qtableview_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qtableview_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qtableview_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qtablewidget_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qtablewidget_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qtablewidget_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qtablewidget_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qtextedit_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qtextedit_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qtextedit_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qtextedit_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qtoolbar_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qtoolbar_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qtoolbar_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qtoolbar_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qtoolbararealayout_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qtoolbararealayout_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qtoolbararealayout_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qtoolbararealayout_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qtoolbarextension_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qtoolbarextension_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qtoolbarextension_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qtoolbarextension_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qtoolbarlayout_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qtoolbarlayout_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qtoolbarlayout_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qtoolbarlayout_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qtoolbarseparator_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qtoolbarseparator_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qtoolbarseparator_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qtoolbarseparator_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qtreeview_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qtreeview_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qtreeview_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qtreeview_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qtreewidget_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qtreewidget_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qtreewidget_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qtreewidget_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qtreewidgetitemiterator_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qtreewidgetitemiterator_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qtreewidgetitemiterator_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qtreewidgetitemiterator_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qtwidgetsglobal_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qtwidgetsglobal_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qtwidgetsglobal_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qtwidgetsglobal_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qundostack_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qundostack_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qundostack_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qundostack_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qwidget_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qwidget_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qwidget_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qwidget_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qwidgetaction_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qwidgetaction_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qwidgetaction_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qwidgetaction_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qwidgetanimator_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qwidgetanimator_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qwidgetanimator_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qwidgetanimator_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qwidgetitemdata_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qwidgetitemdata_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qwidgetitemdata_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qwidgetitemdata_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qwidgetlinecontrol_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qwidgetlinecontrol_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qwidgetlinecontrol_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qwidgetlinecontrol_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qwidgetrepaintmanager_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qwidgetrepaintmanager_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qwidgetrepaintmanager_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qwidgetrepaintmanager_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qwidgetresizehandler_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qwidgetresizehandler_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qwidgetresizehandler_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qwidgetresizehandler_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qwidgettextcontrol_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qwidgettextcontrol_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qwidgettextcontrol_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qwidgettextcontrol_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qwidgettextcontrol_p_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qwidgettextcontrol_p_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qwidgettextcontrol_p_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qwidgettextcontrol_p_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qwidgetwindow_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qwidgetwindow_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qwidgetwindow_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qwidgetwindow_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qwindowcontainer_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qwindowcontainer_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qwindowcontainer_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qwindowcontainer_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qwindowsstyle_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qwindowsstyle_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qwindowsstyle_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qwindowsstyle_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qwindowsstyle_p_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qwindowsstyle_p_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qwindowsstyle_p_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qwindowsstyle_p_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/qwizard_win_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/qwizard_win_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/qwizard_win_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/qwizard_win_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/rangecontrols_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/rangecontrols_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/rangecontrols_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/rangecontrols_p.h diff --git a/include/QtWidgets/5.15.3/QtWidgets/private/simplewidgets_p.h b/include/QtWidgets/5.15.8/QtWidgets/private/simplewidgets_p.h similarity index 100% rename from include/QtWidgets/5.15.3/QtWidgets/private/simplewidgets_p.h rename to include/QtWidgets/5.15.8/QtWidgets/private/simplewidgets_p.h diff --git a/include/QtWidgets/qtwidgetsversion.h b/include/QtWidgets/qtwidgetsversion.h index f056b4bb..1c571c90 100644 --- a/include/QtWidgets/qtwidgetsversion.h +++ b/include/QtWidgets/qtwidgetsversion.h @@ -2,8 +2,8 @@ #ifndef QT_QTWIDGETS_VERSION_H #define QT_QTWIDGETS_VERSION_H -#define QTWIDGETS_VERSION_STR "5.15.3" +#define QTWIDGETS_VERSION_STR "5.15.8" -#define QTWIDGETS_VERSION 0x050F03 +#define QTWIDGETS_VERSION 0x050F08 #endif // QT_QTWIDGETS_VERSION_H diff --git a/include/QtWindowsUIAutomationSupport/5.15.3/QtWindowsUIAutomationSupport/private/qwindowsuiawrapper_p.h b/include/QtWindowsUIAutomationSupport/5.15.8/QtWindowsUIAutomationSupport/private/qwindowsuiawrapper_p.h similarity index 100% rename from include/QtWindowsUIAutomationSupport/5.15.3/QtWindowsUIAutomationSupport/private/qwindowsuiawrapper_p.h rename to include/QtWindowsUIAutomationSupport/5.15.8/QtWindowsUIAutomationSupport/private/qwindowsuiawrapper_p.h diff --git a/include/QtWindowsUIAutomationSupport/5.15.3/QtWindowsUIAutomationSupport/private/uiaattributeids_p.h b/include/QtWindowsUIAutomationSupport/5.15.8/QtWindowsUIAutomationSupport/private/uiaattributeids_p.h similarity index 100% rename from include/QtWindowsUIAutomationSupport/5.15.3/QtWindowsUIAutomationSupport/private/uiaattributeids_p.h rename to include/QtWindowsUIAutomationSupport/5.15.8/QtWindowsUIAutomationSupport/private/uiaattributeids_p.h diff --git a/include/QtWindowsUIAutomationSupport/5.15.3/QtWindowsUIAutomationSupport/private/uiaclientinterfaces_p.h b/include/QtWindowsUIAutomationSupport/5.15.8/QtWindowsUIAutomationSupport/private/uiaclientinterfaces_p.h similarity index 100% rename from include/QtWindowsUIAutomationSupport/5.15.3/QtWindowsUIAutomationSupport/private/uiaclientinterfaces_p.h rename to include/QtWindowsUIAutomationSupport/5.15.8/QtWindowsUIAutomationSupport/private/uiaclientinterfaces_p.h diff --git a/include/QtWindowsUIAutomationSupport/5.15.3/QtWindowsUIAutomationSupport/private/uiacontroltypeids_p.h b/include/QtWindowsUIAutomationSupport/5.15.8/QtWindowsUIAutomationSupport/private/uiacontroltypeids_p.h similarity index 100% rename from include/QtWindowsUIAutomationSupport/5.15.3/QtWindowsUIAutomationSupport/private/uiacontroltypeids_p.h rename to include/QtWindowsUIAutomationSupport/5.15.8/QtWindowsUIAutomationSupport/private/uiacontroltypeids_p.h diff --git a/include/QtWindowsUIAutomationSupport/5.15.3/QtWindowsUIAutomationSupport/private/uiaerrorids_p.h b/include/QtWindowsUIAutomationSupport/5.15.8/QtWindowsUIAutomationSupport/private/uiaerrorids_p.h similarity index 100% rename from include/QtWindowsUIAutomationSupport/5.15.3/QtWindowsUIAutomationSupport/private/uiaerrorids_p.h rename to include/QtWindowsUIAutomationSupport/5.15.8/QtWindowsUIAutomationSupport/private/uiaerrorids_p.h diff --git a/include/QtWindowsUIAutomationSupport/5.15.3/QtWindowsUIAutomationSupport/private/uiaeventids_p.h b/include/QtWindowsUIAutomationSupport/5.15.8/QtWindowsUIAutomationSupport/private/uiaeventids_p.h similarity index 100% rename from include/QtWindowsUIAutomationSupport/5.15.3/QtWindowsUIAutomationSupport/private/uiaeventids_p.h rename to include/QtWindowsUIAutomationSupport/5.15.8/QtWindowsUIAutomationSupport/private/uiaeventids_p.h diff --git a/include/QtWindowsUIAutomationSupport/5.15.3/QtWindowsUIAutomationSupport/private/uiageneralids_p.h b/include/QtWindowsUIAutomationSupport/5.15.8/QtWindowsUIAutomationSupport/private/uiageneralids_p.h similarity index 100% rename from include/QtWindowsUIAutomationSupport/5.15.3/QtWindowsUIAutomationSupport/private/uiageneralids_p.h rename to include/QtWindowsUIAutomationSupport/5.15.8/QtWindowsUIAutomationSupport/private/uiageneralids_p.h diff --git a/include/QtWindowsUIAutomationSupport/5.15.3/QtWindowsUIAutomationSupport/private/uiapatternids_p.h b/include/QtWindowsUIAutomationSupport/5.15.8/QtWindowsUIAutomationSupport/private/uiapatternids_p.h similarity index 100% rename from include/QtWindowsUIAutomationSupport/5.15.3/QtWindowsUIAutomationSupport/private/uiapatternids_p.h rename to include/QtWindowsUIAutomationSupport/5.15.8/QtWindowsUIAutomationSupport/private/uiapatternids_p.h diff --git a/include/QtWindowsUIAutomationSupport/5.15.3/QtWindowsUIAutomationSupport/private/uiapropertyids_p.h b/include/QtWindowsUIAutomationSupport/5.15.8/QtWindowsUIAutomationSupport/private/uiapropertyids_p.h similarity index 100% rename from include/QtWindowsUIAutomationSupport/5.15.3/QtWindowsUIAutomationSupport/private/uiapropertyids_p.h rename to include/QtWindowsUIAutomationSupport/5.15.8/QtWindowsUIAutomationSupport/private/uiapropertyids_p.h diff --git a/include/QtWindowsUIAutomationSupport/5.15.3/QtWindowsUIAutomationSupport/private/uiaserverinterfaces_p.h b/include/QtWindowsUIAutomationSupport/5.15.8/QtWindowsUIAutomationSupport/private/uiaserverinterfaces_p.h similarity index 100% rename from include/QtWindowsUIAutomationSupport/5.15.3/QtWindowsUIAutomationSupport/private/uiaserverinterfaces_p.h rename to include/QtWindowsUIAutomationSupport/5.15.8/QtWindowsUIAutomationSupport/private/uiaserverinterfaces_p.h diff --git a/include/QtWindowsUIAutomationSupport/5.15.3/QtWindowsUIAutomationSupport/private/uiatypes_p.h b/include/QtWindowsUIAutomationSupport/5.15.8/QtWindowsUIAutomationSupport/private/uiatypes_p.h similarity index 100% rename from include/QtWindowsUIAutomationSupport/5.15.3/QtWindowsUIAutomationSupport/private/uiatypes_p.h rename to include/QtWindowsUIAutomationSupport/5.15.8/QtWindowsUIAutomationSupport/private/uiatypes_p.h diff --git a/include/QtWindowsUIAutomationSupport/qtwindowsuiautomationsupportversion.h b/include/QtWindowsUIAutomationSupport/qtwindowsuiautomationsupportversion.h index c5651b66..bb35bdae 100644 --- a/include/QtWindowsUIAutomationSupport/qtwindowsuiautomationsupportversion.h +++ b/include/QtWindowsUIAutomationSupport/qtwindowsuiautomationsupportversion.h @@ -2,8 +2,8 @@ #ifndef QT_QTWINDOWSUIAUTOMATIONSUPPORT_VERSION_H #define QT_QTWINDOWSUIAUTOMATIONSUPPORT_VERSION_H -#define QTWINDOWSUIAUTOMATIONSUPPORT_VERSION_STR "5.15.3" +#define QTWINDOWSUIAUTOMATIONSUPPORT_VERSION_STR "5.15.8" -#define QTWINDOWSUIAUTOMATIONSUPPORT_VERSION 0x050F03 +#define QTWINDOWSUIAUTOMATIONSUPPORT_VERSION 0x050F08 #endif // QT_QTWINDOWSUIAUTOMATIONSUPPORT_VERSION_H diff --git a/include/QtXkbCommonSupport/5.15.3/QtXkbCommonSupport/private/qxkbcommon_p.h b/include/QtXkbCommonSupport/5.15.8/QtXkbCommonSupport/private/qxkbcommon_p.h similarity index 100% rename from include/QtXkbCommonSupport/5.15.3/QtXkbCommonSupport/private/qxkbcommon_p.h rename to include/QtXkbCommonSupport/5.15.8/QtXkbCommonSupport/private/qxkbcommon_p.h diff --git a/include/QtXkbCommonSupport/qtxkbcommonsupportversion.h b/include/QtXkbCommonSupport/qtxkbcommonsupportversion.h index 2f792e69..ceaf91fd 100644 --- a/include/QtXkbCommonSupport/qtxkbcommonsupportversion.h +++ b/include/QtXkbCommonSupport/qtxkbcommonsupportversion.h @@ -2,8 +2,8 @@ #ifndef QT_QTXKBCOMMONSUPPORT_VERSION_H #define QT_QTXKBCOMMONSUPPORT_VERSION_H -#define QTXKBCOMMONSUPPORT_VERSION_STR "5.15.3" +#define QTXKBCOMMONSUPPORT_VERSION_STR "5.15.8" -#define QTXKBCOMMONSUPPORT_VERSION 0x050F03 +#define QTXKBCOMMONSUPPORT_VERSION 0x050F08 #endif // QT_QTXKBCOMMONSUPPORT_VERSION_H diff --git a/include/QtXml/5.15.3/QtXml/private/qdom_p.h b/include/QtXml/5.15.8/QtXml/private/qdom_p.h similarity index 100% rename from include/QtXml/5.15.3/QtXml/private/qdom_p.h rename to include/QtXml/5.15.8/QtXml/private/qdom_p.h diff --git a/include/QtXml/5.15.3/QtXml/private/qdomhelpers_p.h b/include/QtXml/5.15.8/QtXml/private/qdomhelpers_p.h similarity index 100% rename from include/QtXml/5.15.3/QtXml/private/qdomhelpers_p.h rename to include/QtXml/5.15.8/QtXml/private/qdomhelpers_p.h diff --git a/include/QtXml/5.15.3/QtXml/private/qxml_p.h b/include/QtXml/5.15.8/QtXml/private/qxml_p.h similarity index 100% rename from include/QtXml/5.15.3/QtXml/private/qxml_p.h rename to include/QtXml/5.15.8/QtXml/private/qxml_p.h diff --git a/include/QtXml/qtxmlversion.h b/include/QtXml/qtxmlversion.h index e747a895..fc9bb88a 100644 --- a/include/QtXml/qtxmlversion.h +++ b/include/QtXml/qtxmlversion.h @@ -2,8 +2,8 @@ #ifndef QT_QTXML_VERSION_H #define QT_QTXML_VERSION_H -#define QTXML_VERSION_STR "5.15.3" +#define QTXML_VERSION_STR "5.15.8" -#define QTXML_VERSION 0x050F03 +#define QTXML_VERSION 0x050F08 #endif // QT_QTXML_VERSION_H diff --git a/mkspecs/android-clang/qmake.conf b/mkspecs/android-clang/qmake.conf index d9a51835..d0a9a5a1 100644 --- a/mkspecs/android-clang/qmake.conf +++ b/mkspecs/android-clang/qmake.conf @@ -44,7 +44,7 @@ isEmpty(ALL_ANDROID_ABIS): ALL_ANDROID_ABIS = arm64-v8a armeabi-v7a x86_64 x86 CONFIG += $$ANDROID_PLATFORM ANDROID_MIN_SDK_VERSION = $$replace(ANDROID_PLATFORM, "android-", "") -ANDROID_TARGET_SDK_VERSION = 29 +ANDROID_TARGET_SDK_VERSION = 30 NDK_LLVM_PATH = $$NDK_ROOT/toolchains/llvm/prebuilt/$$NDK_HOST QMAKE_CC = $$NDK_LLVM_PATH/bin/clang diff --git a/mkspecs/common/gcc-base-mac.conf b/mkspecs/common/gcc-base-mac.conf index 60089525..30bac3dd 100644 --- a/mkspecs/common/gcc-base-mac.conf +++ b/mkspecs/common/gcc-base-mac.conf @@ -22,3 +22,4 @@ QMAKE_LFLAGS_HEADERPAD += -headerpad_max_install_names QMAKE_LFLAGS_VERSION += -current_version$${LITERAL_WHITESPACE} QMAKE_LFLAGS_COMPAT_VERSION += -compatibility_version$${LITERAL_WHITESPACE} +QMAKE_CFLAGS_ARCH_HASWELL = -Xarch_x86_64 $$QMAKE_CFLAGS_ARCH_HASWELL diff --git a/mkspecs/common/gcc-base.conf b/mkspecs/common/gcc-base.conf index 99d77156..fa65c1dd 100644 --- a/mkspecs/common/gcc-base.conf +++ b/mkspecs/common/gcc-base.conf @@ -86,6 +86,7 @@ QMAKE_LFLAGS_LTCG = $$QMAKE_CFLAGS_LTCG -fuse-linker-plugin QMAKE_CFLAGS_C99 = -std=c99 QMAKE_CFLAGS_C11 = -std=c11 +QMAKE_CFLAGS_C17 = -std=c17 QMAKE_CFLAGS_SSE2 += -msse2 QMAKE_CFLAGS_SSE3 += -msse3 diff --git a/mkspecs/common/macx.conf b/mkspecs/common/macx.conf index 61a13008..2d4ca24e 100644 --- a/mkspecs/common/macx.conf +++ b/mkspecs/common/macx.conf @@ -6,13 +6,12 @@ QMAKE_PLATFORM += macos osx macx QMAKE_MAC_SDK = macosx QMAKE_MACOSX_DEPLOYMENT_TARGET = 10.13 -QMAKE_APPLE_DEVICE_ARCHS = x86_64 # Should be 10.15, but as long as the CI builds with # older SDKs we have to keep this. QT_MAC_SDK_VERSION_MIN = 10.14 -QT_MAC_SDK_VERSION_MAX = 11.0 +QT_MAC_SDK_VERSION_MAX = 12 device.sdk = macosx device.target = device @@ -20,6 +19,8 @@ device.dir_affix = $${device.sdk} device.CONFIG = $${device.sdk} device.deployment_identifier = $${device.sdk} +CONFIG += only_active_arch + QMAKE_LIBS_VULKAN = include(mac.conf) diff --git a/mkspecs/common/msvc-based-version.conf b/mkspecs/common/msvc-based-version.conf index b53e3b61..ba72c3a0 100644 --- a/mkspecs/common/msvc-based-version.conf +++ b/mkspecs/common/msvc-based-version.conf @@ -34,4 +34,9 @@ greaterThan(QMAKE_MSC_VER, 1919) { MSVC_VER = 16.0 } +greaterThan(QMAKE_MSC_VER, 1929) { + # Visual Studio 2022 (17.0) / Visual C++ 19.30 and up + MSVC_VER = 17.0 +} + !isEmpty(COMPAT_MKSPEC):!$$COMPAT_MKSPEC: CONFIG += $$COMPAT_MKSPEC diff --git a/mkspecs/common/msvc-version.conf b/mkspecs/common/msvc-version.conf index adb45582..201c82b9 100644 --- a/mkspecs/common/msvc-version.conf +++ b/mkspecs/common/msvc-version.conf @@ -121,4 +121,16 @@ greaterThan(QMAKE_MSC_VER, 1919) { } +greaterThan(QMAKE_MSC_VER, 1927) { + # Visual Studio 2019 (16.8 or 16.9) / Visual C++ 19.28 and up + MSVC_VER = 16.8 + QMAKE_CFLAGS_C11 = /std:c11 + QMAKE_CFLAGS_C17 = /std:c17 +} + +greaterThan(QMAKE_MSC_VER, 1929) { + # Visual Studio 2022 (17.0) / Visual C++ 19.30 and up + MSVC_VER = 17.0 +} + !isEmpty(COMPAT_MKSPEC):!$$COMPAT_MKSPEC: CONFIG += $$COMPAT_MKSPEC diff --git a/mkspecs/common/qcc-base-qnx-aarch64le.conf b/mkspecs/common/qcc-base-qnx-aarch64le.conf index 914ef33f..92eff229 100644 --- a/mkspecs/common/qcc-base-qnx-aarch64le.conf +++ b/mkspecs/common/qcc-base-qnx-aarch64le.conf @@ -8,7 +8,7 @@ include(g++-unix.conf) include(unix.conf) QMAKE_CC = qcc -Vgcc_ntoaarch64le -QMAKE_CXX = qcc -Vgcc_ntoaarch64le +QMAKE_CXX = q++ -Vgcc_ntoaarch64le QNX_CPUDIR = aarch64le include(qcc-base-qnx.conf) diff --git a/mkspecs/common/qcc-base-qnx-armle-v7.conf b/mkspecs/common/qcc-base-qnx-armle-v7.conf index ad3bb33d..12254541 100644 --- a/mkspecs/common/qcc-base-qnx-armle-v7.conf +++ b/mkspecs/common/qcc-base-qnx-armle-v7.conf @@ -9,9 +9,10 @@ include(unix.conf) include(g++-unix.conf) QMAKE_CC = qcc -Vgcc_ntoarmv7le -QMAKE_CXX = qcc -Vgcc_ntoarmv7le +QMAKE_CXX = q++ -Vgcc_ntoarmv7le QNX_CPUDIR = armle-v7 QMAKE_CFLAGS += -mfpu=neon +QMAKE_CXXFLAGS += -mfpu=neon include(qcc-base-qnx.conf) diff --git a/mkspecs/common/qcc-base-qnx-x86-64.conf b/mkspecs/common/qcc-base-qnx-x86-64.conf index fd04104f..8e77b5b6 100644 --- a/mkspecs/common/qcc-base-qnx-x86-64.conf +++ b/mkspecs/common/qcc-base-qnx-x86-64.conf @@ -8,7 +8,7 @@ include(g++-unix.conf) include(unix.conf) QMAKE_CC = qcc -Vgcc_ntox86_64 -QMAKE_CXX = qcc -Vgcc_ntox86_64 +QMAKE_CXX = q++ -Vgcc_ntox86_64 QNX_CPUDIR = x86_64 include(qcc-base-qnx.conf) diff --git a/mkspecs/common/qcc-base-qnx-x86.conf b/mkspecs/common/qcc-base-qnx-x86.conf index 37a5d9ce..23bc84c3 100644 --- a/mkspecs/common/qcc-base-qnx-x86.conf +++ b/mkspecs/common/qcc-base-qnx-x86.conf @@ -9,7 +9,7 @@ include(unix.conf) include(g++-unix.conf) QMAKE_CC = qcc -Vgcc_ntox86 -QMAKE_CXX = qcc -Vgcc_ntox86 +QMAKE_CXX = q++ -Vgcc_ntox86 QNX_CPUDIR = x86 include(qcc-base-qnx.conf) diff --git a/mkspecs/common/qcc-base.conf b/mkspecs/common/qcc-base.conf index 24ee29b6..b13e3b55 100644 --- a/mkspecs/common/qcc-base.conf +++ b/mkspecs/common/qcc-base.conf @@ -38,7 +38,6 @@ QMAKE_CFLAGS_SHANI += -msha QMAKE_CFLAGS_STACK_PROTECTOR_STRONG = -fstack-protector-strong -QMAKE_CXXFLAGS += $$QMAKE_CFLAGS -lang-c++ QMAKE_CXXFLAGS_DEPS += $$QMAKE_CFLAGS_DEPS QMAKE_CXXFLAGS_WARN_ON += $$QMAKE_CFLAGS_WARN_ON QMAKE_CXXFLAGS_WARN_OFF += $$QMAKE_CFLAGS_WARN_OFF @@ -56,4 +55,3 @@ QMAKE_CFLAGS_USE_PRECOMPILE = -Wc,-include -Wc,${QMAKE_PCH_OUTPUT_BASE} QMAKE_CXXFLAGS_PRECOMPILE = -x c++-header -c ${QMAKE_PCH_INPUT} -o ${QMAKE_PCH_OUTPUT} QMAKE_CXXFLAGS_USE_PRECOMPILE = $$QMAKE_CFLAGS_USE_PRECOMPILE -QMAKE_LFLAGS += -lang-c++ diff --git a/mkspecs/features/android/android_deployment_settings.prf b/mkspecs/features/android/android_deployment_settings.prf index b77d1f26..0fc67308 100644 --- a/mkspecs/features/android/android_deployment_settings.prf +++ b/mkspecs/features/android/android_deployment_settings.prf @@ -78,8 +78,13 @@ contains(TEMPLATE, ".*app"):!build_pass:!android-embedded { contains(resource, ".*qmake_qmake_immediate\\.qrc$") { # They will be created for each architecture, since they could be different # we need to account for all of them - for (arch, ANDROID_ABIS): \ - rescopy += $$absolute_path("qmake_qmake_immediate.qrc", $$OUT_PWD/$$arch) + qmake_qrc_path = "qmake_qmake_immediate.qrc" + multi_android_abi { + for (arch, ANDROID_ABIS): \ + rescopy += $$absolute_path($$qmake_qrc_path, $$OUT_PWD/$$arch) + } else { + rescopy += $$absolute_path($$qmake_qrc_path, $$OUT_PWD) + } } else { contains(resource, ".*\\.qrc$"): rescopy += $$absolute_path($$resource, $$_PRO_FILE_PWD_) } diff --git a/mkspecs/features/android/sdk.prf b/mkspecs/features/android/sdk.prf index 463d399a..83428ae7 100644 --- a/mkspecs/features/android/sdk.prf +++ b/mkspecs/features/android/sdk.prf @@ -1,6 +1,6 @@ API_VERSION_TO_USE = $$(ANDROID_API_VERSION) isEmpty(API_VERSION_TO_USE): API_VERSION_TO_USE = $$API_VERSION -isEmpty(API_VERSION_TO_USE): API_VERSION_TO_USE = android-28 +isEmpty(API_VERSION_TO_USE): API_VERSION_TO_USE = android-31 ANDROID_JAR_FILE = $$ANDROID_SDK_ROOT/platforms/$$API_VERSION_TO_USE/android.jar !exists($$ANDROID_JAR_FILE) { diff --git a/mkspecs/features/create_cmake.prf b/mkspecs/features/create_cmake.prf index 24ed125f..64639f17 100644 --- a/mkspecs/features/create_cmake.prf +++ b/mkspecs/features/create_cmake.prf @@ -170,6 +170,9 @@ qtConfig(debug_and_release) { } contains(CONFIG, plugin) { + CMAKE_PLUGIN_NAME = $$PLUGIN_CLASS_NAME + + plugin_genex_check = equals(PLUGIN_EXTENDS, -) { CMAKE_PLUGIN_EXTENDS = - } else { @@ -177,8 +180,13 @@ contains(CONFIG, plugin) { for (p, PLUGIN_EXTENDS) { m = $$cmakeModuleName($$p) list_plugin_extends += Qt::$$m + + # CMake introduced $ in 3.12 which is too new for Qt, so manually + # unroll each module check with an STREQUAL genex + plugin_genex_check += \"$,Qt::$${m}>,\" } CMAKE_PLUGIN_EXTENDS = $$join(list_plugin_extends, ";") + CMAKE_PLUGIN_EXTENDS_GENEX_CHECK = $$join(plugin_genex_check, "$$escape_expand(\\n) ") } PLUGIN_MODULE_NAME = @@ -207,7 +215,6 @@ contains(CONFIG, plugin) { CMAKE_MODULE_NAME = $$cmakeModuleName($$PLUGIN_MODULE_NAME) - CMAKE_PLUGIN_NAME = $$PLUGIN_CLASS_NAME CMAKE_PLUGIN_TYPE = $$PLUGIN_TYPE CMAKE_PLUGIN_TYPE_ESCAPED = $$replace(PLUGIN_TYPE, [-/], _) diff --git a/mkspecs/features/data/cmake/Qt5PluginTarget.cmake.in b/mkspecs/features/data/cmake/Qt5PluginTarget.cmake.in index b550a52c..2e231091 100644 --- a/mkspecs/features/data/cmake/Qt5PluginTarget.cmake.in +++ b/mkspecs/features/data/cmake/Qt5PluginTarget.cmake.in @@ -86,15 +86,14 @@ string(CONCAT _plugin_genex \"${_user_specified_genex_versionless},\" # Add this plugin if all of the following are true: # 1) the list of explicitly included plugin types is empty - # 2) the QT_PLUGIN_EXTENDS property for the plugin is empty or equal to the current - # module name + # 2) the QT_PLUGIN_EXTENDS property for the plugin is empty or equal to one of the modules + # listed in the plugin's PLUGIN_EXTEND qmake variable # 3) the user hasn\'t explicitly excluded the plugin. + # TODO: Note that the current implementation of (2) is not entirely correct QTBUG-93501 \"$,\" \"$,Qt::$${CMAKE_MODULE_NAME}>,\" + $${CMAKE_PLUGIN_EXTENDS_GENEX_CHECK} \"$,>\" \">,\" \"$>,\" diff --git a/mkspecs/features/default_post.prf b/mkspecs/features/default_post.prf index 1d79f5c9..462dbf77 100644 --- a/mkspecs/features/default_post.prf +++ b/mkspecs/features/default_post.prf @@ -155,7 +155,8 @@ c++11|c++14|c++1z|c++2a { unset(cxxstd) } -c99|c11 { +c99|c11|c17|c18 { + c17|c18: cstd = C17 c11: cstd = C11 else: cstd = C99 diff --git a/mkspecs/features/lrelease.prf b/mkspecs/features/lrelease.prf index f611c741..15d336d8 100644 --- a/mkspecs/features/lrelease.prf +++ b/mkspecs/features/lrelease.prf @@ -24,7 +24,7 @@ all_translations = $$TRANSLATIONS $$EXTRA_TRANSLATIONS for (translation, all_translations) { # mirrors $$LRELEASE_DIR/${QMAKE_FILE_IN_BASE}.qm above translation = $$basename(translation) - QM_FILES += $$OUT_PWD/$$LRELEASE_DIR/$$replace(translation, \\..*$, .qm) + QM_FILES += $$OUT_PWD/$$LRELEASE_DIR/$$replace(translation, \\.[^.]+$, .qm) } embed_translations { qmake_qm_files.files = $$QM_FILES diff --git a/mkspecs/features/mac/default_post.prf b/mkspecs/features/mac/default_post.prf index ded0524e..abc6d82a 100644 --- a/mkspecs/features/mac/default_post.prf +++ b/mkspecs/features/mac/default_post.prf @@ -7,7 +7,12 @@ QMAKE_MAC_SDK_VERSION = $$xcodeSDKInfo(SDKVersion) contains(TEMPLATE, .*app) { !macx-xcode:if(isEmpty(BUILDS)|build_pass) { # Detect changes to the platform SDK - QMAKE_EXTRA_VARIABLES += QMAKE_MAC_SDK QMAKE_MAC_SDK_VERSION QMAKE_XCODE_DEVELOPER_PATH + QMAKE_EXTRA_VARIABLES += \ + QMAKE_MAC_SDK \ + QMAKE_MAC_SDK_VERSION \ + QMAKE_XCODE_DEVELOPER_PATH \ + _QMAKE_STASH_ \ + QMAKE_EXTRA_INCLUDES += $$shell_quote($$PWD/sdk.mk) } @@ -29,7 +34,7 @@ contains(TEMPLATE, .*app) { !sdk_no_version_check:!versionAtMost(QMAKE_MAC_SDK_MAJOR_VERSION, $$QT_MAC_SDK_VERSION_MAX) { warning("Qt has only been tested with version $$QT_MAC_SDK_VERSION_MAX"\ - "of the platform SDK, you're using $${QMAKE_MAC_SDK_MAJOR_MINOR_VERSION}.") + "of the platform SDK, you're using $${QMAKE_MAC_SDK_MAJOR_VERSION}.") warning("This is an unsupported configuration. You may experience build issues," \ "and by using") warning("the $$QMAKE_MAC_SDK_VERSION SDK you are opting in to new features" \ @@ -90,6 +95,19 @@ app_extension_api_only { QMAKE_LFLAGS += $$QMAKE_CFLAGS_APPLICATION_EXTENSION } +macos { + !isEmpty(QMAKE_APPLE_DEVICE_ARCHS) { + # If the user has requested a specific set of architectures, + # build all of those by default, but limited to only those. + CONFIG -= only_active_arch + } else { + # Otherwise allow building all of the architectures available + # in Qt, but only build the active arch (unless the user has + # manually overridden this via CONFIG -= only_active_arch). + QMAKE_APPLE_DEVICE_ARCHS = $$QT_ARCHS + } +} + macx-xcode { qmake_pkginfo_typeinfo.name = QMAKE_PKGINFO_TYPEINFO !isEmpty(QMAKE_PKGINFO_TYPEINFO): \ @@ -145,15 +163,20 @@ macx-xcode { simulator: VALID_SIMULATOR_ARCHS = $$QMAKE_APPLE_SIMULATOR_ARCHS VALID_ARCHS = $$VALID_DEVICE_ARCHS $$VALID_SIMULATOR_ARCHS - isEmpty(VALID_ARCHS): \ - error("QMAKE_APPLE_DEVICE_ARCHS or QMAKE_APPLE_SIMULATOR_ARCHS must contain at least one architecture") - single_arch: VALID_ARCHS = $$first(VALID_ARCHS) - ACTIVE_ARCHS = $(filter $(EXPORT_VALID_ARCHS), $(ARCHS)) - ARCH_ARGS = $(foreach arch, $(if $(EXPORT_ACTIVE_ARCHS), $(EXPORT_ACTIVE_ARCHS), $(EXPORT_VALID_ARCHS)), -arch $(arch)) + macos { + only_active_arch: DEFAULT_ARCHS = $$system("uname -m") + else: DEFAULT_ARCHS = $$VALID_ARCHS + } - QMAKE_EXTRA_VARIABLES += VALID_ARCHS ACTIVE_ARCHS ARCH_ARGS + ARCHS = $(filter $(EXPORT_VALID_ARCHS), \ + $(if $(ARCHS), $(ARCHS), \ + $(if $(EXPORT_DEFAULT_ARCHS), $(EXPORT_DEFAULT_ARCHS), \ + $(EXPORT_VALID_ARCHS)))) + ARCH_ARGS = $(foreach arch, $(if $(EXPORT_ARCHS), $(EXPORT_ARCHS), $(EXPORT_VALID_ARCHS)), -arch $(arch)) + + QMAKE_EXTRA_VARIABLES += VALID_ARCHS DEFAULT_ARCHS ARCHS ARCH_ARGS arch_flags = $(EXPORT_ARCH_ARGS) diff --git a/mkspecs/features/mac/default_pre.prf b/mkspecs/features/mac/default_pre.prf index e3534561..2c91ba66 100644 --- a/mkspecs/features/mac/default_pre.prf +++ b/mkspecs/features/mac/default_pre.prf @@ -1,4 +1,25 @@ CONFIG = asset_catalogs rez $$CONFIG + +macos { + count(QT_ARCHS, 1, >) { + # For universal builds all the config tests are run with the first + # architecture (as reflected by QT_ARCH). We have to manually enable + # CPU features we know exist on the secondary architecture. For + # simplicity we just hard-code the base features we know exist. + # Note that this hack means we end up with QT_CPU_FEATURES.x86_64 + # containing neon, and QT_CPU_FEATURES.arm64 containing sse2 e.g. + QT_CPU_FEATURES.$$QT_ARCH += sse sse2 + CONFIG += sse sse2 + DEFINES += QT_COMPILER_SUPPORTS_SSE2 + # FIXME: For x86_64 there are a bunch more. If building a universal + # build with arm64 as the primary architecture we'll miss those. + + QT_CPU_FEATURES.$$QT_ARCH += neon + CONFIG += neon + DEFINES += QT_COMPILER_SUPPORTS_NEON + } +} + load(default_pre) isEmpty(QMAKE_XCODE_DEVELOPER_PATH) { diff --git a/mkspecs/features/mac/sdk.mk b/mkspecs/features/mac/sdk.mk index c40f58c9..f30b5830 100644 --- a/mkspecs/features/mac/sdk.mk +++ b/mkspecs/features/mac/sdk.mk @@ -13,12 +13,14 @@ ifeq ($(QT_MAC_SDK_NO_VERSION_CHECK),) else ifneq ($(findstring SDK "$(EXPORT_QMAKE_MAC_SDK)" cannot be located,$(CURRENT_MAC_SDK_VERSION)),) $(info The developer dir $(EXPORT_QMAKE_XCODE_DEVELOPER_PATH) no longer contains the $(EXPORT_QMAKE_MAC_SDK_VERSION) platform SDK.) else ifneq ($(CURRENT_MAC_SDK_VERSION),) - $(info The platform SDK has been changed from version $(EXPORT_QMAKE_MAC_SDK_VERSION) to version $(CURRENT_MAC_SDK_VERSION).) + $(info The $(EXPORT_QMAKE_MAC_SDK) platform SDK has been changed from version $(EXPORT_QMAKE_MAC_SDK_VERSION) to version $(CURRENT_MAC_SDK_VERSION).) else $(info Unknown error resolving current platform SDK version.) endif - $(info This requires a fresh build. Please wipe the build directory completely,) - $(info including any .qmake.stash and .qmake.cache files generated by qmake.) + $(info This requires a fresh build of your project. Please wipe the build directory) + ifneq ($(EXPORT__QMAKE_STASH_),) + $(info including the qmake cache in $(EXPORT__QMAKE_STASH_)) + endif $(error ^) endif endif diff --git a/mkspecs/features/qt.prf b/mkspecs/features/qt.prf index 69d19543..da1f44a8 100644 --- a/mkspecs/features/qt.prf +++ b/mkspecs/features/qt.prf @@ -215,13 +215,32 @@ for(ever) { # Linking frameworks by absolute path does not work. LIBS$$var_sfx += -framework $$framework } else { - lib = $$MODULE_MODULE$$qtPlatformTargetSuffix() + candidates = $$MODULE_MODULE$$qtPlatformTargetSuffix() + darwin: candidates *= $$MODULE_MODULE win32|contains(MODULE_CONFIG, staticlib) { - lib = $$MODULE_LIBS/$$QMAKE_PREFIX_STATICLIB$${lib}.$$QMAKE_EXTENSION_STATICLIB - PRE_TARGETDEPS += $$lib + lib_prefix = $$MODULE_LIBS/$$QMAKE_PREFIX_STATICLIB + lib_suffix = $$QMAKE_EXTENSION_STATICLIB + add_lib_to_pretargetdeps = true } else { - lib = $$MODULE_LIBS/$$QMAKE_PREFIX_SHLIB$${lib}.$$QMAKE_EXTENSION_SHLIB + lib_prefix = $$MODULE_LIBS/$$QMAKE_PREFIX_SHLIB + lib_suffix = $$QMAKE_EXTENSION_SHLIB + add_lib_to_pretargetdeps = false } + lib_missing = true + lib_fallback = + for(lib_base, candidates) { + lib = $${lib_prefix}$${lib_base}.$${lib_suffix} + isEmpty(lib_fallback): \ + lib_fallback = $$lib + exists($$lib) { + lib_missing = false + break() + } + } + $$lib_missing: \ + lib = $$lib_fallback + $$add_lib_to_pretargetdeps: \ + PRE_TARGETDEPS += $$lib LIBS$$var_sfx += $$lib } } diff --git a/mkspecs/features/qt_docs.prf b/mkspecs/features/qt_docs.prf index 5178a7d8..05cdb11e 100644 --- a/mkspecs/features/qt_docs.prf +++ b/mkspecs/features/qt_docs.prf @@ -29,20 +29,20 @@ QT_TOOL_ENV = # On Windows, put the includes into a .inc file which QDoc will read, if the project # has too many includes. We do this to overcome a command-line limit on Windows. -WIN_INCLUDETEMP= +QDOC_WIN_INCLUDETEMP= INCLUDE_PATHS=$$INCPATH win32:count(INCLUDE_PATHS, 30, >) { - WIN_INCLUDETEMP = $$OUT_PWD/qdocincludepaths.inc - WIN_INCLUDETEMP_CONTENT = + QDOC_WIN_INCLUDETEMP = $$OUT_PWD/qdocincludepaths.inc + QDOC_WIN_INCLUDETEMP_CONTENT = for (inc, INCLUDE_PATHS): \ - WIN_INCLUDETEMP_CONTENT += -I$$inc - write_file($$absolute_path($$WIN_INCLUDETEMP, $$OUT_PWD), WIN_INCLUDETEMP_CONTENT)|error() + QDOC_WIN_INCLUDETEMP_CONTENT += -I$$inc + write_file($$absolute_path($$QDOC_WIN_INCLUDETEMP, $$OUT_PWD), QDOC_WIN_INCLUDETEMP_CONTENT)|error() } -isEmpty(WIN_INCLUDETEMP) { +isEmpty(QDOC_WIN_INCLUDETEMP) { QDOC_INCLUDE_PATHS=$(INCPATH) } else { - QDOC_INCLUDE_PATHS=@$$shell_quote($$WIN_INCLUDETEMP) + QDOC_INCLUDE_PATHS=@$$shell_quote($$QDOC_WIN_INCLUDETEMP) } macos: QDOC_INCLUDE_PATHS += $$join(QMAKE_DEFAULT_INCDIRS," -I","-I") diff --git a/mkspecs/features/qt_helper_lib.prf b/mkspecs/features/qt_helper_lib.prf index 964e256e..2d67a30f 100644 --- a/mkspecs/features/qt_helper_lib.prf +++ b/mkspecs/features/qt_helper_lib.prf @@ -116,5 +116,22 @@ installed|if(!not_installed:qtConfig(static)) { pri_lib_replace.CONFIG = path pri_lib_replace.filename = qt_ext_$${MODULE}.pri QMAKE_INSTALL_REPLACE += pri_header_replace pri_lib_replace + if(msvc|qtConfig(debug_and_release)): { + rpl_lib_target = $$prefix$${TARGET}.$$suffix + pri_lib_release_replace.match = $$DESTDIR/$${rpl_lib_target} + pri_lib_release_replace.replace = $$qqt_dir/$${rpl_lib_target} + pri_lib_release_replace.CONFIG = path + pri_lib_release_replace.filename = qt_ext_$${MODULE}.pri + QMAKE_INSTALL_REPLACE += pri_lib_release_replace + win32: \ + rpl_lib_target = $$prefix$${TARGET}d.$$suffix + else: darwin: \ + rpl_lib_target = $$prefix$${TARGET}_debug.$$suffix + pri_lib_debug_replace.match = $$DESTDIR/$${rpl_lib_target} + pri_lib_debug_replace.replace = $$qqt_dir/$${rpl_lib_target} + pri_lib_debug_replace.CONFIG = path + pri_lib_debug_replace.filename = qt_ext_$${MODULE}.pri + QMAKE_INSTALL_REPLACE += pri_lib_debug_replace + } load(qt_installs) } diff --git a/mkspecs/features/resources_functions.prf b/mkspecs/features/resources_functions.prf index 9b7c4091..afd6405f 100644 --- a/mkspecs/features/resources_functions.prf +++ b/mkspecs/features/resources_functions.prf @@ -35,10 +35,10 @@ defineTest(qtFlattenResources) { } RESOURCES -= $$resource - !android|isEmpty(BUILDS)|build_pass { + isEmpty(BUILDS)|build_pass { resource_file = $$absolute_path($$RCC_DIR/qmake_$${resource}.qrc, $$OUT_PWD) RESOURCES += $$resource_file - } else { + } else: android { # Android will need a resource file for each architecture make sure it is placed # correctly for other functions that need the right paths for these files for (arch, ANDROID_ABIS) { diff --git a/mkspecs/features/toolchain.prf b/mkspecs/features/toolchain.prf index 11ecd6b2..0c505fc9 100644 --- a/mkspecs/features/toolchain.prf +++ b/mkspecs/features/toolchain.prf @@ -182,9 +182,14 @@ isEmpty($${target_prefix}.INCDIRS) { # UIKit simulator platforms will see the device SDK's sysroot in # QMAKE_DEFAULT_*DIRS, because they're handled in a single build pass. darwin { - # Clang doesn't pick up the architecture from the sysroot, and will - # default to the host architecture, so we need to manually set it. - cxx_flags += -arch $$QMAKE_APPLE_DEVICE_ARCHS + uikit { + # Clang doesn't automatically pick up the architecture, just because + # we're passing the iOS sysroot below, and we will end up building the + # test for the host architecture, resulting in linker errors when + # linking against the iOS libraries. We work around this by passing + # the architecture explicitly. + cxx_flags += -arch $$first(QMAKE_APPLE_DEVICE_ARCHS) + } uikit:macx-xcode: \ cxx_flags += -isysroot $$sdk_path_device.value diff --git a/mkspecs/features/uikit/default_post.prf b/mkspecs/features/uikit/default_post.prf index 088b39ff..46f21ac0 100644 --- a/mkspecs/features/uikit/default_post.prf +++ b/mkspecs/features/uikit/default_post.prf @@ -28,7 +28,7 @@ macx-xcode { device_family.value = $$QMAKE_APPLE_TARGETED_DEVICE_FAMILY QMAKE_MAC_XCODE_SETTINGS += device_family - ios { + equals(TEMPLATE, app):ios { # Set up default 4-inch iPhone/iPod launch image so that our apps # support the full screen resolution of those devices. qmake_launch_image = Default-568h@2x.png diff --git a/mkspecs/features/uikit/xcodebuild.mk b/mkspecs/features/uikit/xcodebuild.mk index e1156d0e..4416240c 100644 --- a/mkspecs/features/uikit/xcodebuild.mk +++ b/mkspecs/features/uikit/xcodebuild.mk @@ -58,7 +58,7 @@ debug-%: CONFIGURATION = Debug MAKEFILE_DIR := $(dir $(lastword $(MAKEFILE_LIST))) -# Test and build (device) destinations +# Test device destinations ifneq ($(filter check%,$(MAKECMDGOALS)),) ifeq ($(DEVICES),) $(info Enumerating test destinations (you may override this by setting DEVICES explicitly), please wait...) @@ -72,10 +72,10 @@ endif %-device: DEVICES = $(HARDWARE_DEVICES) GENERIC_DEVICE_DESTINATION := $(EXPORT_GENERIC_DEVICE_DESTINATION) -GENERIC_SIMULATOR_DESTINATION := "id=$(shell $(MAKEFILE_DIR)devices.py $(EXPORT_DEVICE_FILTER) | tail -n 1)" +GENERIC_SIMULATOR_DESTINATION := $(EXPORT_GENERIC_SIMULATOR_DESTINATION) -%-simulator: DESTINATION = $(if $(DESTINATION_ID),"id=$(DESTINATION_ID)",$(GENERIC_SIMULATOR_DESTINATION)) -%-device: DESTINATION = $(if $(DESTINATION_ID),"id=$(DESTINATION_ID)",$(GENERIC_DEVICE_DESTINATION)) +%-simulator: DESTINATION = $(if $(DESTINATION_ID),"id=$(DESTINATION_ID)","$(GENERIC_SIMULATOR_DESTINATION)") +%-device: DESTINATION = $(if $(DESTINATION_ID),"id=$(DESTINATION_ID)","$(GENERIC_DEVICE_DESTINATION)") XCODE_VERSION_MAJOR := $(shell xcodebuild -version | grep Xcode | sed -e 's/Xcode //' | sed -e 's/\..*//') @@ -83,6 +83,10 @@ ifeq ($(shell test $(XCODE_VERSION_MAJOR) -gt 7; echo $$?),0) XCODEBUILD_FLAGS += $(shell echo "$(MAKEFLAGS)" | sed -e 's/\([^ ]*\).*/\1/' | grep -qv 's' || echo -quiet) endif +ifeq ($(shell test $(XCODE_VERSION_MAJOR) -ge 9; echo $$?),0) + XCODEBUILD_FLAGS += -allowProvisioningUpdates +endif + # Xcodebuild DESTINATION_MESSAGE = "Running $(call tolower,$(CONFIGURATION)) $(ACTION) \ diff --git a/mkspecs/features/uikit/xcodebuild.prf b/mkspecs/features/uikit/xcodebuild.prf index 01022c7b..ddf606cd 100644 --- a/mkspecs/features/uikit/xcodebuild.prf +++ b/mkspecs/features/uikit/xcodebuild.prf @@ -53,7 +53,13 @@ watchos { DEVICE_FILTER = --platform watchOS --minimum-deployment-target $$QMAKE_WATCHOS_DEPLOYMENT_TARGET GENERIC_DEVICE_DESTINATION = "generic/platform=watchOS" } -QMAKE_EXTRA_VARIABLES += DEVICE_SDK SIMULATOR_SDK DEVICE_FILTER GENERIC_DEVICE_DESTINATION +GENERIC_SIMULATOR_DESTINATION = "$$GENERIC_DEVICE_DESTINATION Simulator" + +QMAKE_EXTRA_VARIABLES += \ + DEVICE_SDK SIMULATOR_SDK \ + DEVICE_FILTER \ + GENERIC_DEVICE_DESTINATION \ + GENERIC_SIMULATOR_DESTINATION QMAKE_EXTRA_INCLUDES += $$shell_quote($$PWD/xcodebuild.mk) diff --git a/mkspecs/macx-xcode/WorkspaceSettings.xcsettings b/mkspecs/macx-xcode/WorkspaceSettings.xcsettings index a3f43a8b..08de0be8 100644 --- a/mkspecs/macx-xcode/WorkspaceSettings.xcsettings +++ b/mkspecs/macx-xcode/WorkspaceSettings.xcsettings @@ -2,8 +2,6 @@ - BuildSystemType - Original IDEWorkspaceSharedSettings_AutocreateContextsIfNeeded diff --git a/mkspecs/wasm-emscripten/qmake.conf b/mkspecs/wasm-emscripten/qmake.conf index 2b108a5e..b84ef977 100644 --- a/mkspecs/wasm-emscripten/qmake.conf +++ b/mkspecs/wasm-emscripten/qmake.conf @@ -81,6 +81,8 @@ QMAKE_EXTENSION_STATICLIB = a # llvm bitcode QMAKE_AR = emar cqs equals(QMAKE_HOST.os, Windows) { + QMAKE_LINK_OBJECT_MAX = 10 + QMAKE_LINK_OBJECT_SCRIPT = object_script QMAKE_AR_CMD = \ "$(file >$(OBJECTS_DIR)/$(TARGET).rsp, $(subst \\,/,$(OBJECTS)))$$escape_expand(\\n\\t)" \ "$(AR) $(DESTDIR)$(TARGET) @$(OBJECTS_DIR)/$(TARGET).rsp" diff --git a/qmake/doc/src/qmake-manual.qdoc b/qmake/doc/src/qmake-manual.qdoc index d52f02e9..f86eb049 100644 --- a/qmake/doc/src/qmake-manual.qdoc +++ b/qmake/doc/src/qmake-manual.qdoc @@ -1118,7 +1118,7 @@ \note This variable applies only to Android targets. Specifies the target Android API level for the project. By default, this - variable is set to API level 29. + variable is set to API level 30. \target ANDROID_VERSION_CODE \section1 ANDROID_VERSION_CODE @@ -1142,6 +1142,8 @@ Specifies project configuration and compiler options. The values are recognized internally by qmake and have special meaning. + \note The values are case-sensitive. + The following \c CONFIG values control compiler and linker flags: \table @@ -1195,6 +1197,11 @@ \row \li c11 \li C11 support is enabled. This option has no effect if the compiler does not support C11, or can't select the C standard. By default, the compiler default is used. + \row \li c17 \li C17, also known as C18, support is enabled. + This option has no effect if the compiler does not support C17, or + can't select the C standard. + By default, the compiler default is used. + \row \li c18 \li This is an alias for the \c{c17} value. \row \li strict_c \li Disables support for C compiler extensions. By default, they are enabled. \row \li c++11 \li C++11 support is enabled. This option has no effect if @@ -3357,7 +3364,7 @@ \li publisher \li Display name of the publisher. Defaults to \c{Default publisher display name}. \row - \li publisher_id + \li publisherid \li The publisher's distinguished name (default: \c{CN=MyCN}). \row \li target diff --git a/qmake/generators/mac/pbuilder_pbx.cpp b/qmake/generators/mac/pbuilder_pbx.cpp index c2f6df77..832794fc 100644 --- a/qmake/generators/mac/pbuilder_pbx.cpp +++ b/qmake/generators/mac/pbuilder_pbx.cpp @@ -778,6 +778,8 @@ ProjectBuilderMakefileGenerator::writeMakeParts(QTextStream &t) { QString mkfile = pbx_dir + Option::dir_sep + "qt_preprocess.mak"; QFile mkf(mkfile); + ProStringList outputPaths; + ProStringList inputPaths; if(mkf.open(QIODevice::WriteOnly | QIODevice::Text)) { writingUnixMakefileGenerator = true; debug_msg(1, "pbuilder: Creating file: %s", mkfile.toLatin1().constData()); @@ -827,8 +829,11 @@ ProjectBuilderMakefileGenerator::writeMakeParts(QTextStream &t) ++added; const QString file_name = fileFixify(fn, FileFixifyFromOutdir); const QString tmpOut = fileFixify(tmp_out.first().toQString(), FileFixifyFromOutdir); - mkt << ' ' << escapeDependencyPath(Option::fixPathToTargetOS( + QString path = escapeDependencyPath(Option::fixPathToTargetOS( replaceExtraCompilerVariables(tmpOut, file_name, QString(), NoShell))); + mkt << ' ' << path; + inputPaths << fn; + outputPaths << path; } } } @@ -839,6 +844,14 @@ ProjectBuilderMakefileGenerator::writeMakeParts(QTextStream &t) mkt.flush(); mkf.close(); } + // Remove duplicates from build steps with "combine" + outputPaths.removeDuplicates(); + + // Don't create cycles. We only have one qt_preprocess.mak which runs different compilers + // whose inputs may depend on the output of another. The "compilers" step will run all + // compilers anyway + inputPaths.removeEach(outputPaths); + mkfile = fileFixify(mkfile); QString phase_key = keyFor("QMAKE_PBX_PREPROCESS_TARGET"); // project->values("QMAKE_PBX_BUILDPHASES").append(phase_key); @@ -849,10 +862,13 @@ ProjectBuilderMakefileGenerator::writeMakeParts(QTextStream &t) << "\t\t\t" << writeSettings("isa", "PBXShellScriptBuildPhase", SettingsNoQuote) << ";\n" << "\t\t\t" << writeSettings("runOnlyForDeploymentPostprocessing", "0", SettingsNoQuote) << ";\n" << "\t\t\t" << writeSettings("name", "Qt Preprocessors") << ";\n" + << "\t\t\t" << writeSettings("inputPaths", inputPaths, SettingsAsList, 4) << ";\n" + << "\t\t\t" << writeSettings("outputPaths", outputPaths, SettingsAsList, 4) << ";\n" << "\t\t\t" << writeSettings("shellPath", "/bin/sh") << ";\n" << "\t\t\t" << writeSettings("shellScript", "make -C " + IoUtils::shellQuoteUnix(Option::output_dir) + " -f " + IoUtils::shellQuoteUnix(mkfile)) << ";\n" << "\t\t\t" << writeSettings("showEnvVarsInLog", "0") << ";\n" + << "\t\t\t" << writeSettings("alwaysOutOfDate", "1") << ";\n" << "\t\t};\n"; } @@ -2046,4 +2062,10 @@ ProjectBuilderMakefileGenerator::writeSettings(const QString &var, const ProStri return ret; } +bool +ProjectBuilderMakefileGenerator::inhibitMakeDirOutPath(const ProKey &path) const +{ + return path == "OBJECTS_DIR"; +} + QT_END_NAMESPACE diff --git a/qmake/generators/mac/pbuilder_pbx.h b/qmake/generators/mac/pbuilder_pbx.h index 1b90a3bb..fcf6b055 100644 --- a/qmake/generators/mac/pbuilder_pbx.h +++ b/qmake/generators/mac/pbuilder_pbx.h @@ -68,6 +68,7 @@ public: protected: bool doPrecompiledHeaders() const override { return false; } bool doDepends() const override { return writingUnixMakefileGenerator && UnixMakefileGenerator::doDepends(); } + bool inhibitMakeDirOutPath(const ProKey &path) const override; }; QT_END_NAMESPACE diff --git a/qmake/generators/makefile.cpp b/qmake/generators/makefile.cpp index dfbbde3b..7ff92154 100644 --- a/qmake/generators/makefile.cpp +++ b/qmake/generators/makefile.cpp @@ -173,6 +173,9 @@ MakefileGenerator::initOutPaths() if (noIO() || (project->first("TEMPLATE") == "subdirs")) continue; + if (inhibitMakeDirOutPath(dkey)) + continue; + QString path = project->first(dkey).toQString(); //not to be changed any further path = fileFixify(path, FileFixifyBackwards); debug_msg(3, "Fixed output_dir %s (%s) into %s", dirs[x], @@ -216,6 +219,18 @@ MakefileGenerator::initOutPaths() } } +/* + * For the given directory path, return true if MakefileGenerator::initOutPaths() should inhibit the + * creation of the directory. Overload this in subclasses. + */ +bool +MakefileGenerator::inhibitMakeDirOutPath(const ProKey &path) const +{ + Q_UNUSED(path); + return false; +} + + QMakeProject *MakefileGenerator::projectFile() const { diff --git a/qmake/generators/makefile.h b/qmake/generators/makefile.h index 0ea587f6..106069c4 100644 --- a/qmake/generators/makefile.h +++ b/qmake/generators/makefile.h @@ -153,6 +153,7 @@ protected: void verifyCompilers(); virtual void init(); void initOutPaths(); + virtual bool inhibitMakeDirOutPath(const ProKey &path) const; struct Compiler { QString variable_in; diff --git a/qmake/generators/unix/unixmake2.cpp b/qmake/generators/unix/unixmake2.cpp index ad6a0e94..7cb55a57 100644 --- a/qmake/generators/unix/unixmake2.cpp +++ b/qmake/generators/unix/unixmake2.cpp @@ -37,6 +37,9 @@ #include #include +#include +#include + QT_BEGIN_NAMESPACE void @@ -1415,6 +1418,25 @@ UnixMakefileGenerator::libtoolFileName(bool fixify) return ret; } +static std::pair +splitFrameworksAndLibs(const ProStringList &linkArgs) +{ + std::pair result; + bool frameworkArg = false; + for (auto arg : linkArgs) { + if (frameworkArg) { + frameworkArg = false; + result.second += arg; + } else if (arg == "-framework") { + frameworkArg = true; + result.second += arg; + } else { + result.first += arg; + } + } + return result; +} + void UnixMakefileGenerator::writeLibtoolFile() { @@ -1489,7 +1511,13 @@ UnixMakefileGenerator::writeLibtoolFile() ProStringList libs; for (auto var : libVars) libs += fixLibFlags(var); + ProStringList frameworks; + std::tie(libs, frameworks) = splitFrameworksAndLibs(libs); t << "dependency_libs='" << fixDependencyLibs(libs).join(' ') << "'\n\n"; + if (!frameworks.isEmpty()) { + t << "# Frameworks that this library depends upon.\n"; + t << "inherited_linker_flags='" << frameworks.join(' ') << "'\n\n"; + } t << "# Version information for " << lname << "\n"; int maj = project->first("VER_MAJ").toInt(); diff --git a/qmake/generators/win32/msbuild_objectmodel.cpp b/qmake/generators/win32/msbuild_objectmodel.cpp index 355260c9..3ee4a260 100644 --- a/qmake/generators/win32/msbuild_objectmodel.cpp +++ b/qmake/generators/win32/msbuild_objectmodel.cpp @@ -144,6 +144,7 @@ const char _IntermediateDirectory[] = "IntermediateDirectory"; const char _KeyContainer[] = "KeyContainer"; const char _KeyFile[] = "KeyFile"; const char _LanguageStandard[] = "LanguageStandard"; +const char _LanguageStandard_C[] = "LanguageStandard_C"; const char _LargeAddressAware[] = "LargeAddressAware"; const char _LinkDLL[] = "LinkDLL"; const char _LinkErrorReporting[] = "LinkErrorReporting"; @@ -1483,6 +1484,7 @@ void VCXProjectWriter::write(XmlOutput &xml, const VCCLCompilerTool &tool) << attrTagT(_MinimalRebuild, tool.MinimalRebuild) << attrTagT(_MultiProcessorCompilation, tool.MultiProcessorCompilation) << attrTagS(_LanguageStandard, tool.LanguageStandard) + << attrTagS(_LanguageStandard_C, tool.LanguageStandard_C) << attrTagS(_ObjectFileName, tool.ObjectFile) << attrTagT(_OmitDefaultLibName, tool.OmitDefaultLibName) << attrTagT(_OmitFramePointers, tool.OmitFramePointers) diff --git a/qmake/generators/win32/msvc_objectmodel.cpp b/qmake/generators/win32/msvc_objectmodel.cpp index 1b36feb6..94df594f 100644 --- a/qmake/generators/win32/msvc_objectmodel.cpp +++ b/qmake/generators/win32/msvc_objectmodel.cpp @@ -40,36 +40,42 @@ using namespace QMakeInternal; QT_BEGIN_NAMESPACE -static DotNET vsVersionFromString(const char *versionString) -{ - struct VSVersionMapping - { - const char *str; - DotNET version; - }; - static VSVersionMapping mapping[] = { - { "7.0", NET2002 }, - { "7.1", NET2003 }, - { "8.0", NET2005 }, - { "9.0", NET2008 }, - { "10.0", NET2010 }, - { "11.0", NET2012 }, - { "12.0", NET2013 }, - { "14.0", NET2015 }, - { "15.0", NET2017 }, - { "16.0", NET2019 } - }; - DotNET result = NETUnknown; - for (const auto entry : mapping) { - if (strcmp(entry.str, versionString) == 0) - return entry.version; - } - return result; -} - DotNET vsVersionFromString(const ProString &versionString) { - return vsVersionFromString(versionString.toLatin1().constData()); + int idx = versionString.indexOf(QLatin1Char('.')); + if (idx == -1) + return NETUnknown; + + QStringView versionView = versionString.toQStringView(); + int versionMajor = versionView.left(idx).toInt(); + int versionMinor = versionView.mid(idx + 1).toInt(); + + if (versionMajor == 17) + return NET2022; + if (versionMajor == 16) + return NET2019; + if (versionMajor == 15) + return NET2017; + if (versionMajor == 14) + return NET2015; + if (versionMajor == 12) + return NET2013; + if (versionMajor == 11) + return NET2012; + if (versionMajor == 10) + return NET2010; + if (versionMajor == 9) + return NET2008; + if (versionMajor == 8) + return NET2005; + if (versionMajor == 7) { + if (versionMinor == 0) + return NET2002; + if (versionMinor == 1) + return NET2003; + } + + return NETUnknown; } // XML Tags --------------------------------------------------------- @@ -1147,12 +1153,39 @@ bool VCCLCompilerTool::parseOption(const char* option) ShowIncludes = _True; break; } - if (strlen(option) > 8 && second == 't' && third == 'd') { - const QString version = option + 8; - static const QStringList knownVersions = { "14", "17", "latest" }; - if (knownVersions.contains(version)) { - LanguageStandard = "stdcpp" + version; - break; + if (strlen(option) > 7 && second == 't' && third == 'd' && fourth == ':') { + static const QRegExp rex("(c(?:\\+\\+)?)(.+)"); + if (rex.exactMatch(option + 5)) { + QString *var = nullptr; + const QStringList *knownVersions = nullptr; + QString valuePrefix; + auto lang = rex.cap(1); + auto version = rex.cap(2); + if (lang == QStringLiteral("c++")) { + // Turn /std:c++17 into stdcpp17 + static const QStringList knownCxxVersions = { + "14", + "17", + "20", + "latest" + }; + var = &LanguageStandard; + knownVersions = &knownCxxVersions; + valuePrefix = "stdcpp"; + } else if (lang == QStringLiteral("c")) { + // Turn /std:c17 into stdc17 + static const QStringList knownCVersions = { + "11", + "17" + }; + var = &LanguageStandard_C; + knownVersions = &knownCVersions; + valuePrefix = "stdc"; + } + if (var && knownVersions->contains(version)) { + *var = valuePrefix + version; + break; + } } } found = false; break; @@ -2405,6 +2438,7 @@ bool VCFilter::addExtraCompiler(const VCFilterFile &info) cmd_name = cmd.left(space); else cmd_name = cmd; + cmd_name = cmd_name.trimmed(); } // Fixify paths diff --git a/qmake/generators/win32/msvc_objectmodel.h b/qmake/generators/win32/msvc_objectmodel.h index 33eff0d9..b25205b2 100644 --- a/qmake/generators/win32/msvc_objectmodel.h +++ b/qmake/generators/win32/msvc_objectmodel.h @@ -53,7 +53,8 @@ enum DotNET { NET2013 = 0xc0, NET2015 = 0xd0, NET2017 = 0xe0, - NET2019 + NET2019, + NET2022 }; DotNET vsVersionFromString(const ProString &versionString); @@ -527,6 +528,7 @@ public: inlineExpansionOption InlineFunctionExpansion; triState KeepComments; QString LanguageStandard; + QString LanguageStandard_C; triState MinimalRebuild; QString ObjectFile; triState OmitDefaultLibName; diff --git a/qmake/generators/win32/msvc_vcproj.cpp b/qmake/generators/win32/msvc_vcproj.cpp index c830ae62..d6a825af 100644 --- a/qmake/generators/win32/msvc_vcproj.cpp +++ b/qmake/generators/win32/msvc_vcproj.cpp @@ -37,8 +37,11 @@ #include #include #include +#include #include +#include +#include //#define DEBUG_SOLUTION_GEN @@ -76,6 +79,8 @@ const char _slnHeader141[] = "Microsoft Visual Studio Solution File, Format "\n# Visual Studio 15"; const char _slnHeader142[] = "Microsoft Visual Studio Solution File, Format Version 12.00" "\n# Visual Studio Version 16"; +const char _slnHeader143[] = "Microsoft Visual Studio Solution File, Format Version 12.00" + "\n# Visual Studio Version 17"; // The following UUID _may_ change for later servicepacks... // If so we need to search through the registry at // HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\7.0\Projects @@ -311,6 +316,8 @@ QString VcprojGenerator::retrievePlatformToolSet() const return QStringLiteral("v141"); case NET2019: return QStringLiteral("v142"); + case NET2022: + return QStringLiteral("v143"); default: return QString(); } @@ -538,6 +545,9 @@ void VcprojGenerator::writeSubDirs(QTextStream &t) } switch (vcProject.Configuration.CompilerVersion) { + case NET2022: + t << _slnHeader143; + break; case NET2019: t << _slnHeader142; break; @@ -813,33 +823,62 @@ void VcprojGenerator::init() } } - // Add all input files for a custom compiler into a map for uniqueness, - // unless the compiler is configure as a combined stage, then use the first one + // Helper function to create a fake file foo.cbt for the project view. + // + // This prevents VS from complaining about a circular dependency from "foo -> foo". + // + // The .cbt file is added as "source" of the Custom Build Tool. This means, in the project + // view, this is the file the Custom Build Tool property page is attached to. + // + // This function returns a pair with + // - the fully resolved output file path + // - the file path of the .cbt file + auto addExtraCompilerSourceWithCustomBuildToolFakeFile + = [this](const QString &compilerOutput, const ProString &extraCompiler, + const QStringList &inputs) -> std::pair + { + QString realOut = replaceExtraCompilerVariables(compilerOutput, inputs, {}, NoShell); + QString out = realOut + customBuildToolFilterFileSuffix; + createCustomBuildToolFakeFile(out, realOut); + out = Option::fixPathToTargetOS(out, false); + extraCompilerSources[out] += extraCompiler.toQString(); + return { realOut, out }; + }; + + // Add all input files for a custom compiler into a map for uniqueness. + // + // Use .cbt files for the following cases: + // - CONFIG += combine + // - the input has a built-in compiler (e.g. C++ source file) for (const ProString &quc : project->values("QMAKE_EXTRA_COMPILERS")) { const ProStringList &invar = project->values(ProKey(quc + ".input")); const QString compiler_out = project->first(ProKey(quc + ".output")).toQString(); - for (ProStringList::ConstIterator iit = invar.constBegin(); iit != invar.constEnd(); ++iit) { - ProStringList fileList = project->values((*iit).toKey()); - if (!fileList.isEmpty()) { - if (project->values(ProKey(quc + ".CONFIG")).indexOf("combine") != -1) - fileList.erase(fileList.begin() + 1, fileList.end()); - for (ProStringList::ConstIterator fit = fileList.constBegin(); fit != fileList.constEnd(); ++fit) { - QString file = (*fit).toQString(); - if (verifyExtraCompiler(quc, file)) { - if (!hasBuiltinCompiler(file)) { - extraCompilerSources[file] += quc.toQString(); - } else { - // Create a fake file foo.moc.cbt for the project view. - // This prevents VS from complaining about a circular - // dependency from foo.moc -> foo.moc. - QString realOut = replaceExtraCompilerVariables( - compiler_out, file, QString(), NoShell); - QString out = realOut + customBuildToolFilterFileSuffix; - createCustomBuildToolFakeFile(out, realOut); - out = Option::fixPathToTargetOS(out, false); - extraCompilerSources[out] += quc.toQString(); - extraCompilerOutputs[out] = file; - } + + QStringList inputFiles; + for (auto it = invar.begin(); it != invar.end(); ++it) + inputFiles += project->values(it->toKey()).toQStringList(); + + if (project->values(ProKey(quc + ".CONFIG")).contains("combine")) { + // Handle "CONFIG += combine" extra compilers. + QString realOut; + QString out; + std::tie(realOut, out) + = addExtraCompilerSourceWithCustomBuildToolFakeFile(compiler_out, quc, inputFiles); + if (hasBuiltinCompiler(realOut)) + extraCompilerOutputs[out] = realOut; + } else { + // Handle regular 1-to-1 extra compilers. + for (const QString &file : inputFiles) { + if (verifyExtraCompiler(quc, file)) { + if (!hasBuiltinCompiler(file)) { + extraCompilerSources[file] += quc.toQString(); + } else { + QString out; + std::tie(std::ignore, out) + = addExtraCompilerSourceWithCustomBuildToolFakeFile(compiler_out, + quc, + QStringList(file)); + extraCompilerOutputs[out] = file; } } } @@ -891,6 +930,9 @@ void VcprojGenerator::initProject() // Own elements ----------------------------- vcProject.Name = project->first("QMAKE_ORIG_TARGET").toQString(); switch (vcProject.Configuration.CompilerVersion) { + case NET2022: + vcProject.Version = "17.00"; + break; case NET2019: vcProject.Version = "16.00"; break; @@ -1052,6 +1094,20 @@ void VcprojGenerator::initConfiguration() initPreLinkEventTools(); } +// Filter from the given QMAKE_CFLAGS the options that are relevant +// for the vcxproj-global VCCLCompilerTool. +static ProStringList relevantCFlags(const ProStringList &flags) +{ + ProStringList result; + static const QRegExp rex("^[/-]std:.*"); + for (const ProString &flag : flags) { + if (rex.exactMatch(flag.toQString())) { + result.append(flag); + } + } + return result; +} + void VcprojGenerator::initCompilerTool() { QString placement = project->first("OBJECTS_DIR").toQString(); @@ -1074,6 +1130,7 @@ void VcprojGenerator::initCompilerTool() conf.compiler.ForcedIncludeFiles = project->values("PRECOMPILED_HEADER").toQStringList(); } + conf.compiler.parseOptions(relevantCFlags(project->values("QMAKE_CFLAGS"))); conf.compiler.parseOptions(project->values("QMAKE_CXXFLAGS")); if (project->isActiveConfig("windows")) @@ -1570,9 +1627,10 @@ void VcprojGenerator::initExtraCompilerOutputs() if (!outputs.isEmpty()) tmp_out = outputs.first().toQString(); if (project->values(ProKey(*it + ".CONFIG")).indexOf("combine") != -1) { - // Combined output, only one file result + // Combined output, only one file result. Use .cbt file. extraCompile.addFile(Option::fixPathToTargetOS( - replaceExtraCompilerVariables(tmp_out, QString(), QString(), NoShell), false)); + replaceExtraCompilerVariables(tmp_out + customBuildToolFilterFileSuffix, + QString(), QString(), NoShell), false)); } else if (!inputVars.isEmpty()) { // One output file per input const ProStringList &tmp_in = project->values(inputVars.first().toKey()); diff --git a/src/3rdparty/freetype/README b/src/3rdparty/freetype/README index 8f3e2bc0..e4c8cf1c 100644 --- a/src/3rdparty/freetype/README +++ b/src/3rdparty/freetype/README @@ -1,4 +1,4 @@ - FreeType 2.10.1 + FreeType 2.10.4 =============== Homepage: https://www.freetype.org @@ -16,17 +16,20 @@ the file `docs/LICENSE.TXT' for the available licenses. The FreeType 2 API reference is located in `docs/reference/site'; - use the file `index.html' as the top entry point. Additional - documentation is available as a separate package from our sites. Go - to + use the file `index.html' as the top entry point. [Please note that + currently the search function for locally installed documentation + doesn't work due to cross-site scripting issues.] + + Additional documentation is available as a separate package from our + sites. Go to https://download.savannah.gnu.org/releases/freetype/ and download one of the following files. - freetype-doc-2.10.1.tar.xz - freetype-doc-2.10.1.tar.gz - ftdoc2101.zip + freetype-doc-2.10.4.tar.xz + freetype-doc-2.10.4.tar.gz + ftdoc2104.zip To view the documentation online, go to @@ -64,6 +67,18 @@ a terse message that only says `it doesn't work'. + Patches + ======= + + Please submit patches to the `freetype-devel@nongnu.org' mailing + list -- and thank you in advance for your work on improving + FreeType! + + Details on the process can be found here: + + https://www.freetype.org/developer.html#patches + + Enjoy! @@ -71,7 +86,7 @@ ---------------------------------------------------------------------- -Copyright (C) 2006-2019 by +Copyright (C) 2006-2020 by David Turner, Robert Wilhelm, and Werner Lemberg. This file is part of the FreeType project, and may only be used, diff --git a/src/3rdparty/freetype/builds/unix/ftconfig.h b/src/3rdparty/freetype/builds/unix/ftconfig.h index 39bcaaea..51cb7963 100644 --- a/src/3rdparty/freetype/builds/unix/ftconfig.h +++ b/src/3rdparty/freetype/builds/unix/ftconfig.h @@ -1,481 +1,63 @@ -/* ftconfig.h. Generated from ftconfig.in by configure. */ -/***************************************************************************/ -/* */ -/* ftconfig.in */ -/* */ -/* UNIX-specific configuration file (specification only). */ -/* */ -/* Copyright 1996-2004, 2006-2009, 2011, 2013, 2014 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ +/* ftconfig.h. Generated from ftconfig.h.in by configure. */ +/**************************************************************************** + * + * ftconfig.h.in + * + * UNIX-specific configuration file (specification only). + * + * Copyright (C) 1996-2020 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ - /*************************************************************************/ - /* */ - /* This header file contains a number of macro definitions that are used */ - /* by the rest of the engine. Most of the macros here are automatically */ - /* determined at compile time, and you should not need to change it to */ - /* port FreeType, except to compile the library with a non-ANSI */ - /* compiler. */ - /* */ - /* Note however that if some specific modifications are needed, we */ - /* advise you to place a modified copy in your build directory. */ - /* */ - /* The build directory is usually `builds/', and contains */ - /* system-specific files that are always included first when building */ - /* the library. */ - /* */ - /*************************************************************************/ + /************************************************************************** + * + * This header file contains a number of macro definitions that are used by + * the rest of the engine. Most of the macros here are automatically + * determined at compile time, and you should not need to change it to port + * FreeType, except to compile the library with a non-ANSI compiler. + * + * Note however that if some specific modifications are needed, we advise + * you to place a modified copy in your build directory. + * + * The build directory is usually `builds/`, and contains + * system-specific files that are always included first when building the + * library. + * + */ - -#ifndef __FTCONFIG_H__ -#define __FTCONFIG_H__ +#ifndef FTCONFIG_H_ +#define FTCONFIG_H_ #include #include FT_CONFIG_OPTIONS_H #include FT_CONFIG_STANDARD_LIBRARY_H - -FT_BEGIN_HEADER - - - /*************************************************************************/ - /* */ - /* PLATFORM-SPECIFIC CONFIGURATION MACROS */ - /* */ - /* These macros can be toggled to suit a specific system. The current */ - /* ones are defaults used to compile FreeType in an ANSI C environment */ - /* (16bit compilers are also supported). Copy this file to your own */ - /* `builds/' directory, and edit it to port the engine. */ - /* */ - /*************************************************************************/ - - #define HAVE_UNISTD_H 1 #define HAVE_FCNTL_H 1 -#define HAVE_STDINT_H 1 - - - /* There are systems (like the Texas Instruments 'C54x) where a `char' */ - /* has 16 bits. ANSI C says that sizeof(char) is always 1. Since an */ - /* `int' has 16 bits also for this system, sizeof(int) gives 1 which */ - /* is probably unexpected. */ - /* */ - /* `CHAR_BIT' (defined in limits.h) gives the number of bits in a */ - /* `char' type. */ - -#ifndef FT_CHAR_BIT -#define FT_CHAR_BIT CHAR_BIT -#endif - /* #undef FT_USE_AUTOCONF_SIZEOF_TYPES */ #ifdef FT_USE_AUTOCONF_SIZEOF_TYPES #define SIZEOF_INT 4 -#define SIZEOF_LONG 4 +#define SIZEOF_LONG 8 #define FT_SIZEOF_INT SIZEOF_INT #define FT_SIZEOF_LONG SIZEOF_LONG -#else /* !FT_USE_AUTOCONF_SIZEOF_TYPES */ +#endif /* FT_USE_AUTOCONF_SIZEOF_TYPES */ - /* Following cpp computation of the bit length of int and long */ - /* is copied from default include/config/ftconfig.h. */ - /* If any improvement is required for this file, it should be */ - /* applied to the original header file for the builders that */ - /* does not use configure script. */ +#include +#include +#include - /* The size of an `int' type. */ -#if FT_UINT_MAX == 0xFFFFUL -#define FT_SIZEOF_INT (16 / FT_CHAR_BIT) -#elif FT_UINT_MAX == 0xFFFFFFFFUL -#define FT_SIZEOF_INT (32 / FT_CHAR_BIT) -#elif FT_UINT_MAX > 0xFFFFFFFFUL && FT_UINT_MAX == 0xFFFFFFFFFFFFFFFFUL -#define FT_SIZEOF_INT (64 / FT_CHAR_BIT) -#else -#error "Unsupported size of `int' type!" -#endif - - /* The size of a `long' type. A five-byte `long' (as used e.g. on the */ - /* DM642) is recognized but avoided. */ -#if FT_ULONG_MAX == 0xFFFFFFFFUL -#define FT_SIZEOF_LONG (32 / FT_CHAR_BIT) -#elif FT_ULONG_MAX > 0xFFFFFFFFUL && FT_ULONG_MAX == 0xFFFFFFFFFFUL -#define FT_SIZEOF_LONG (32 / FT_CHAR_BIT) -#elif FT_ULONG_MAX > 0xFFFFFFFFUL && FT_ULONG_MAX == 0xFFFFFFFFFFFFFFFFUL -#define FT_SIZEOF_LONG (64 / FT_CHAR_BIT) -#else -#error "Unsupported size of `long' type!" -#endif - -#endif /* !FT_USE_AUTOCONF_SIZEOF_TYPES */ - - - /* FT_UNUSED is a macro used to indicate that a given parameter is not */ - /* used -- this is only used to get rid of unpleasant compiler warnings */ -#ifndef FT_UNUSED -#define FT_UNUSED( arg ) ( (arg) = (arg) ) -#endif - - - /*************************************************************************/ - /* */ - /* AUTOMATIC CONFIGURATION MACROS */ - /* */ - /* These macros are computed from the ones defined above. Don't touch */ - /* their definition, unless you know precisely what you are doing. No */ - /* porter should need to mess with them. */ - /* */ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* Mac support */ - /* */ - /* This is the only necessary change, so it is defined here instead */ - /* providing a new configuration file. */ - /* */ -#if defined( __APPLE__ ) || ( defined( __MWERKS__ ) && defined( macintosh ) ) - /* no Carbon frameworks for 64bit 10.4.x */ - /* AvailabilityMacros.h is available since Mac OS X 10.2, */ - /* so guess the system version by maximum errno before inclusion */ -#include -#ifdef ECANCELED /* defined since 10.2 */ -#include "AvailabilityMacros.h" -#endif -#if defined( __LP64__ ) && \ - ( MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4 ) -#undef FT_MACINTOSH -#endif - -#elif defined( __SC__ ) || defined( __MRC__ ) - /* Classic MacOS compilers */ -#include "ConditionalMacros.h" -#if TARGET_OS_MAC -#define FT_MACINTOSH 1 -#endif - -#endif - - - /* Fix compiler warning with sgi compiler */ -#if defined( __sgi ) && !defined( __GNUC__ ) -#if defined( _COMPILER_VERSION ) && ( _COMPILER_VERSION >= 730 ) -#pragma set woff 3505 -#endif -#endif - - - /*************************************************************************/ - /* */ - /*
*/ - /* basic_types */ - /* */ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* */ - /* FT_Int16 */ - /* */ - /* */ - /* A typedef for a 16bit signed integer type. */ - /* */ - typedef signed short FT_Int16; - - - /*************************************************************************/ - /* */ - /* */ - /* FT_UInt16 */ - /* */ - /* */ - /* A typedef for a 16bit unsigned integer type. */ - /* */ - typedef unsigned short FT_UInt16; - - /* */ - - - /* this #if 0 ... #endif clause is for documentation purposes */ -#if 0 - - /*************************************************************************/ - /* */ - /* */ - /* FT_Int32 */ - /* */ - /* */ - /* A typedef for a 32bit signed integer type. The size depends on */ - /* the configuration. */ - /* */ - typedef signed XXX FT_Int32; - - - /*************************************************************************/ - /* */ - /* */ - /* FT_UInt32 */ - /* */ - /* A typedef for a 32bit unsigned integer type. The size depends on */ - /* the configuration. */ - /* */ - typedef unsigned XXX FT_UInt32; - - - /*************************************************************************/ - /* */ - /* */ - /* FT_Int64 */ - /* */ - /* A typedef for a 64bit signed integer type. The size depends on */ - /* the configuration. Only defined if there is real 64bit support; */ - /* otherwise, it gets emulated with a structure (if necessary). */ - /* */ - typedef signed XXX FT_Int64; - - - /*************************************************************************/ - /* */ - /* */ - /* FT_UInt64 */ - /* */ - /* A typedef for a 64bit unsigned integer type. The size depends on */ - /* the configuration. Only defined if there is real 64bit support; */ - /* otherwise, it gets emulated with a structure (if necessary). */ - /* */ - typedef unsigned XXX FT_UInt64; - - /* */ - -#endif - -#if FT_SIZEOF_INT == 4 - - typedef signed int FT_Int32; - typedef unsigned int FT_UInt32; - -#elif FT_SIZEOF_LONG == 4 - - typedef signed long FT_Int32; - typedef unsigned long FT_UInt32; - -#else -#error "no 32bit type found -- please check your configuration files" -#endif - - - /* look up an integer type that is at least 32 bits */ -#if FT_SIZEOF_INT >= 4 - - typedef int FT_Fast; - typedef unsigned int FT_UFast; - -#elif FT_SIZEOF_LONG >= 4 - - typedef long FT_Fast; - typedef unsigned long FT_UFast; - -#endif - - - /* determine whether we have a 64-bit int type for platforms without */ - /* Autoconf */ -#if FT_SIZEOF_LONG == 8 - - /* FT_LONG64 must be defined if a 64-bit type is available */ -#define FT_LONG64 -#define FT_INT64 long -#define FT_UINT64 unsigned long - - /*************************************************************************/ - /* */ - /* A 64-bit data type may create compilation problems if you compile */ - /* in strict ANSI mode. To avoid them, we disable other 64-bit data */ - /* types if __STDC__ is defined. You can however ignore this rule */ - /* by defining the FT_CONFIG_OPTION_FORCE_INT64 configuration macro. */ - /* */ -#elif !defined( __STDC__ ) || defined( FT_CONFIG_OPTION_FORCE_INT64 ) - -#if defined( _MSC_VER ) && _MSC_VER >= 900 /* Visual C++ (and Intel C++) */ - - /* this compiler provides the __int64 type */ -#define FT_LONG64 -#define FT_INT64 __int64 -#define FT_UINT64 unsigned __int64 - -#elif defined( __BORLANDC__ ) /* Borland C++ */ - - /* XXXX: We should probably check the value of __BORLANDC__ in order */ - /* to test the compiler version. */ - - /* this compiler provides the __int64 type */ -#define FT_LONG64 -#define FT_INT64 __int64 -#define FT_UINT64 unsigned __int64 - -#elif defined( __WATCOMC__ ) /* Watcom C++ */ - - /* Watcom doesn't provide 64-bit data types */ - -#elif defined( __MWERKS__ ) /* Metrowerks CodeWarrior */ - -#define FT_LONG64 -#define FT_INT64 long long int -#define FT_UINT64 unsigned long long int - -#elif defined( __GNUC__ ) - - /* GCC provides the `long long' type */ -#define FT_LONG64 -#define FT_INT64 long long int -#define FT_UINT64 unsigned long long int - -#endif /* _MSC_VER */ - -#endif /* FT_SIZEOF_LONG == 8 */ - -#ifdef FT_LONG64 - typedef FT_INT64 FT_Int64; - typedef FT_UINT64 FT_UInt64; -#endif - - -#define FT_BEGIN_STMNT do { -#define FT_END_STMNT } while ( 0 ) -#define FT_DUMMY_STMNT FT_BEGIN_STMNT FT_END_STMNT - - -#ifdef FT_MAKE_OPTION_SINGLE_OBJECT - -#define FT_LOCAL( x ) static x -#define FT_LOCAL_DEF( x ) static x - -#else - -#ifdef __cplusplus -#define FT_LOCAL( x ) extern "C" x -#define FT_LOCAL_DEF( x ) extern "C" x -#else -#define FT_LOCAL( x ) extern x -#define FT_LOCAL_DEF( x ) x -#endif - -#endif /* FT_MAKE_OPTION_SINGLE_OBJECT */ - -#define FT_LOCAL_ARRAY( x ) extern const x -#define FT_LOCAL_ARRAY_DEF( x ) const x - - -#ifndef FT_BASE - -#ifdef __cplusplus -#define FT_BASE( x ) extern "C" x -#else -#define FT_BASE( x ) extern x -#endif - -#endif /* !FT_BASE */ - - -#ifndef FT_BASE_DEF - -#ifdef __cplusplus -#define FT_BASE_DEF( x ) x -#else -#define FT_BASE_DEF( x ) x -#endif - -#endif /* !FT_BASE_DEF */ - - -#ifndef FT_EXPORT - -#ifdef __cplusplus -#define FT_EXPORT( x ) extern "C" x -#else -#define FT_EXPORT( x ) extern x -#endif - -#endif /* !FT_EXPORT */ - - -#ifndef FT_EXPORT_DEF - -#ifdef __cplusplus -#define FT_EXPORT_DEF( x ) extern "C" x -#else -#define FT_EXPORT_DEF( x ) extern x -#endif - -#endif /* !FT_EXPORT_DEF */ - - -#ifndef FT_EXPORT_VAR - -#ifdef __cplusplus -#define FT_EXPORT_VAR( x ) extern "C" x -#else -#define FT_EXPORT_VAR( x ) extern x -#endif - -#endif /* !FT_EXPORT_VAR */ - - /* The following macros are needed to compile the library with a */ - /* C++ compiler and with 16bit compilers. */ - /* */ - - /* This is special. Within C++, you must specify `extern "C"' for */ - /* functions which are used via function pointers, and you also */ - /* must do that for structures which contain function pointers to */ - /* assure C linkage -- it's not possible to have (local) anonymous */ - /* functions which are accessed by (global) function pointers. */ - /* */ - /* */ - /* FT_CALLBACK_DEF is used to _define_ a callback function. */ - /* */ - /* FT_CALLBACK_TABLE is used to _declare_ a constant variable that */ - /* contains pointers to callback functions. */ - /* */ - /* FT_CALLBACK_TABLE_DEF is used to _define_ a constant variable */ - /* that contains pointers to callback functions. */ - /* */ - /* */ - /* Some 16bit compilers have to redefine these macros to insert */ - /* the infamous `_cdecl' or `__fastcall' declarations. */ - /* */ -#ifndef FT_CALLBACK_DEF -#ifdef __cplusplus -#define FT_CALLBACK_DEF( x ) extern "C" x -#else -#define FT_CALLBACK_DEF( x ) static x -#endif -#endif /* FT_CALLBACK_DEF */ - -#ifndef FT_CALLBACK_TABLE -#ifdef __cplusplus -#define FT_CALLBACK_TABLE extern "C" -#define FT_CALLBACK_TABLE_DEF extern "C" -#else -#define FT_CALLBACK_TABLE extern -#define FT_CALLBACK_TABLE_DEF /* nothing */ -#endif -#endif /* FT_CALLBACK_TABLE */ - - -FT_END_HEADER - - -#endif /* __FTCONFIG_H__ */ +#endif /* FTCONFIG_H_ */ /* END */ diff --git a/src/3rdparty/freetype/builds/unix/ftsystem.c b/src/3rdparty/freetype/builds/unix/ftsystem.c index 826713f9..22bb4dab 100644 --- a/src/3rdparty/freetype/builds/unix/ftsystem.c +++ b/src/3rdparty/freetype/builds/unix/ftsystem.c @@ -4,7 +4,7 @@ /* */ /* Unix-specific FreeType low-level system interface (body). */ /* */ -/* Copyright (C) 1996-2019 by */ +/* Copyright (C) 1996-2020 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -19,11 +19,12 @@ #include /* we use our special ftconfig.h file, not the standard one */ #include -#include FT_INTERNAL_DEBUG_H -#include FT_SYSTEM_H -#include FT_ERRORS_H -#include FT_TYPES_H -#include FT_INTERNAL_STREAM_H +//#include FT_CONFIG_CONFIG_H +#include +#include +#include +#include +#include /* memory-mapping includes and definitions */ #ifdef HAVE_UNISTD_H @@ -351,7 +352,7 @@ stream->read = 0; FT_TRACE1(( "FT_Stream_Open:" )); - FT_TRACE1(( " opened `%s' (%d bytes) successfully\n", + FT_TRACE1(( " opened `%s' (%ld bytes) successfully\n", filepathname, stream->size )); return FT_Err_Ok; diff --git a/src/3rdparty/freetype/docs/CHANGES b/src/3rdparty/freetype/docs/CHANGES index f36cb19b..3bd5291a 100644 --- a/src/3rdparty/freetype/docs/CHANGES +++ b/src/3rdparty/freetype/docs/CHANGES @@ -1,3 +1,104 @@ +CHANGES BETWEEN 2.10.3 and 2.10.4 + + I. IMPORTANT BUG FIXES + + - A heap buffer overflow has been found in the handling of embedded + PNG bitmaps, introduced in FreeType version 2.6. + + https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-15999 + + If you use option FT_CONFIG_OPTION_USE_PNG you should upgrade + immediately. + + +====================================================================== + +CHANGES BETWEEN 2.10.2 and 2.10.3 + + I. IMPORTANT CHANGES + + - New flag `FT_OUTLINE_OVERLAP'. If set, make the smooth rasterizer + do 4x4 oversampling to mitigate artifacts in pixels partially + covered by overlapping contours. Note that this at least + quadruples the rendering time. + + If a glyph in a TrueType font has the `OVERLAP_SIMPLE' or + `OVERLAP_COMPOUND' bit set, FreeType automatically selects this + rendering mode. + + + II. MISCELLANEOUS + + - Using the arcane method of including FreeType header files with + macros like `FT_FREETYPE_H' is no longer mandatory (but retained + as an optional feature for backward compatibility). + + - Support for building the library with Meson. Building the demo + programs with Meson will follow in a forthcoming release. + + - Minor improvements to the B/W rasterizer. + + - Auto-hinter support for Medefaidrin script. + + - Fix various memory leaks (mainly for CFF) and other issues that + might cause crashes in rare circumstances. + + - Jam support has been removed. + + - In `ftview', custom LCD filter values are now normalized and + balanced. Unorthodox filters are still available through the `-L' + command line option. + + - The GUI demo programs can now be resized. + + - Demo programs that accept command line option `-k' can now handle + function keys, too. The corresponding character codes start with + 0xF1. As an example, the POSIX shell syntax (accepted by bash, + ksh, and zsh) + + -k $'\xF3q' + + emulates the pressing of function key `F3' followed by key `q'. + + +====================================================================== + +CHANGES BETWEEN 2.10.1 and 2.10.2 + + I. IMPORTANT CHANGES + + - Support of WOFF2 fonts. This code contribution was Nikhil + Ramakrishnan's GSoC 2019 project. + + + II. MISCELLANEOUS + + - Function `FT_Get_Var_Axis_Flags' returned random data for Type 1 + MM fonts. + + - Type 1 fonts with non-integer metrics are now supported by the new + (CFF) engine introduced in FreeType 2.9. + + - Drop support for Python 2 in Freetype's API reference generator + `docwriter' (Python >= 3.5 is required for targets `make refdoc' + and `make refdoc-venv'). + + - Auto-hinter support for Hanifi Rohingya. + + - Document the `FT2_KEEP_ALIVE' debugging environment variable. + + - The Visual C++ (and Visual C) project files for Windows builds no + longer generate libraries that contain the FreeType version in its + filenames. Instead, a resource file gets used to make the + libraries contain the corresponding information. + + - The next release will remove Jam build support. + + - The `ftbench' demo program has a new test for testing the + `FT_Glyph_Stroke' functionality. + + +====================================================================== CHANGES BETWEEN 2.10.0 and 2.10.1 @@ -209,7 +310,7 @@ CHANGES BETWEEN 2.9 and 2.9.1 use the `pkg-config' interface. The `configure' script no longer installs `freetype-config' by - default. For backwards compatibility, a new configure option + default. For backward compatibility, a new configure option `--enable-freetype-config' is provided that reverts this decision. @@ -5198,7 +5299,7 @@ Extensions support: ------------------------------------------------------------------------ -Copyright (C) 2000-2019 by +Copyright (C) 2000-2020 by David Turner, Robert Wilhelm, and Werner Lemberg. This file is part of the FreeType project, and may only be used, diff --git a/src/3rdparty/freetype/docs/CUSTOMIZE b/src/3rdparty/freetype/docs/CUSTOMIZE index f3f9f8ed..0f92e700 100644 --- a/src/3rdparty/freetype/docs/CUSTOMIZE +++ b/src/3rdparty/freetype/docs/CUSTOMIZE @@ -139,7 +139,7 @@ IV. Overriding default configuration and module headers ---------------------------------------------------------------------- -Copyright (C) 2003-2019 by +Copyright (C) 2003-2020 by David Turner, Robert Wilhelm, and Werner Lemberg. This file is part of the FreeType project, and may only be used, diff --git a/src/3rdparty/freetype/docs/DEBUG b/src/3rdparty/freetype/docs/DEBUG index 828f2943..a96b5e27 100644 --- a/src/3rdparty/freetype/docs/DEBUG +++ b/src/3rdparty/freetype/docs/DEBUG @@ -11,20 +11,20 @@ located in the file `ftoption.h'. The macros are: FT_DEBUG_LEVEL_ERROR - #define this macro if you want to compile the FT_ERROR macro calls - to print error messages during program execution. This will not - stop the program. Very useful to spot invalid fonts during + #define this macro if you want to compile the `FT_ERROR' macro + calls to print error messages during program execution. This does + not stop the program. Very useful to spot invalid fonts during development and to code workarounds for them. FT_DEBUG_LEVEL_TRACE - #define this macro if you want to compile both macros FT_ERROR and - FT_TRACE. This also includes the variants FT_TRACE0, FT_TRACE1, - FT_TRACE2, ..., FT_TRACE7. + #define this macro if you want to compile both macros `FT_ERROR' + and `FT_TRACE'. This also includes the variants `FT_TRACE0', + `FT_TRACE1', `FT_TRACE2', ..., `FT_TRACE7'. The trace macros are used to send debugging messages when an appropriate `debug level' is configured at runtime through the - FT2_DEBUG environment variable (more on this later). + `FT2_DEBUG' environment variable (more on this later). FT_DEBUG_MEMORY @@ -32,16 +32,16 @@ located in the file `ftoption.h'. The macros are: small but effective debugging memory manager that tracks all allocations and frees that are performed within the font engine. - When the FT2_DEBUG_MEMORY environment variable is defined at - runtime, a call to FT_Done_FreeType will dump memory statistics, - including the list of leaked memory blocks with the source - locations where these were allocated. It is always a very good - idea to define this in development builds. This works with _any_ - program linked to FreeType, but requires a big deal of memory (the - debugging memory manager never frees the blocks to the heap in - order to detect double frees). + When the `FT2_DEBUG_MEMORY' environment variable is defined at + runtime, a call to `FT_Done_FreeType' dumps memory statistics, + including the list of leaked memory blocks and optionally with the + source locations where these were allocated. It is always a very + good idea to define this in development builds. This works with + _any_ program linked to FreeType, but requires a big deal of + memory (the debugging memory manager never frees the blocks to the + heap in order to detect double frees). - When FT2_DEBUG_MEMORY isn't defined at runtime, the debugging + When `FT2_DEBUG_MEMORY' isn't defined at runtime, the debugging memory manager is ignored, and performance is unaffected. @@ -55,10 +55,10 @@ debugging its code: 1. FT_ERROR(( ... )) This macro is used to send debug messages that indicate relatively - serious errors (like broken font files), but will not stop the + serious errors (like broken font files) without stopping the execution of the running program. Its code is compiled only when - either FT_DEBUG_LEVEL_ERROR or FT_DEBUG_LEVEL_TRACE are defined in - `ftoption.h'. + either `FT_DEBUG_LEVEL_ERROR' or `FT_DEBUG_LEVEL_TRACE' are + defined in `ftoption.h'. Note that you have to use a printf-like signature, but with double parentheses, like in @@ -69,53 +69,53 @@ debugging its code: 2. FT_ASSERT( condition ) This macro is used to check strong assertions at runtime. If its - condition isn't TRUE, the program will abort with a panic message. - Its code is compiled when either FT_DEBUG_LEVEL_ERROR or - FT_DEBUG_LEVEL_TRACE are defined. You don't need double - parentheses here. For example + condition isn't TRUE, the program aborts with a panic message. + Its code is compiled when either `FT_DEBUG_LEVEL_ERROR' or + `FT_DEBUG_LEVEL_TRACE' are defined. You don't need double + parentheses here. Example: FT_ASSERT( ptr != NULL ); 3. FT_TRACE( level, (message...) ) - The FT_TRACE macro is used to send general-purpose debugging + The `FT_TRACE' macro is used to send general-purpose debugging messages during program execution. This macro uses an *implicit* - macro named FT_COMPONENT used to name the current FreeType + macro named `FT_COMPONENT', which names the current FreeType component being run. - The developer should always define FT_COMPONENT as appropriate, + The developer should always define `FT_COMPONENT' as appropriate, for example as in #undef FT_COMPONENT #define FT_COMPONENT io - The value of the FT_COMPONENT macro is one of the component - names defined in the internal file `internal/fttrace.h'. If you - modify FreeType source and insert new FT_COMPONENT macro, you must - register it in `fttrace.h'. If you insert or remove many trace - macros, you can check the undefined or the unused trace macro by - `src/tools/chktrcmp.py'. + The value of the `FT_COMPONENT' macro is one of the component + names defined in the internal file `internal/fttrace.h'. If you + modify the FreeType source code and insert a new `FT_COMPONENT' + macro, you must register it in `fttrace.h'. If you insert or + remove many trace macros, you can test for undefined or unused + trace macros with the script `src/tools/chktrcmp.py'. - Each such component is assigned a `debug level', ranging from 0 to - 7, through the use of the FT2_DEBUG environment variable - (described below) when a program linked with FreeType starts. + Each such component is assigned a `debug level', ranging from + value 0 to 7, through the use of the `FT2_DEBUG' environment + variable (described below) when a program linked with FreeType + starts. - When FT_TRACE is called, its level is compared to the one of the + When `FT_TRACE' is called, its level is compared to the one of the corresponding component. Messages with trace levels *higher* than - the corresponding component level are filtered and never printed. + the corresponding component level are filtered out and never + printed. This means that trace messages with level 0 are always + printed, those with level 2 are only printed when the component + level is *at least* 2, etc. - This means that trace messages with level 0 are always printed, - those with level 2 are only printed when the component level is - *at least* 2. - - The second parameter to FT_TRACE must contain parentheses and - correspond to a printf-like call, as in + The second parameter to `FT_TRACE' must contain parentheses and + corresponds to a printf-like call, as in FT_TRACE( 2, ( "your %s is not %s\n", "foo", "bar" ) ) - The shortcut macros FT_TRACE0, FT_TRACE1, FT_TRACE2, ..., - FT_TRACE7 can be used with constant level indices, and are much + The shortcut macros `FT_TRACE0', `FT_TRACE1', `FT_TRACE2', ..., + `FT_TRACE7' can be used with constant level indices, and are much cleaner to use, as in FT_TRACE2(( "your %s is not %s\n", "foo", "bar" )); @@ -131,7 +131,7 @@ behaviour of FreeType at runtime. FT2_DEBUG This variable is only used when FreeType is built with - FT_DEBUG_LEVEL_TRACE defined. It contains a list of component + `FT_DEBUG_LEVEL_TRACE' defined. It contains a list of component level definitions, following this format: component1:level1 component2:level2 component3:level3 ... @@ -140,57 +140,70 @@ behaviour of FreeType at runtime. in `fttrace.h'. `levelX' is the corresponding level to use at runtime. - `any' is a special component name that will be interpreted as - `any/all components'. For example, the following definitions + `any' is a special component name that is interpreted as `any/all + components'. For example, the following definitions set FT2_DEBUG=any:2 memory:5 io:4 (on Windows) export FT2_DEBUG="any:2 memory:5 io:4" (on Linux with bash) both stipulate that all components should have level 2, except for - the memory and io components which will be set to trace levels 5 + the memory and io components, which are set to the trace levels 5 and 4, respectively. FT2_DEBUG_MEMORY This environment variable, when defined, tells FreeType to use a - debugging memory manager that will track leaking memory blocks as - well as other common errors like double frees. It is also capable - of reporting _where_ the leaking blocks were allocated, which + debugging memory manager that tracks leaking memory blocks as well + as other common errors like double frees. It is also capable of + reporting _where_ the leaking blocks were allocated, which considerably saves time when debugging new additions to the library. This code is only compiled when FreeType is built with the - FT_DEBUG_MEMORY macro #defined in `ftoption.h' though, it will be + `FT_DEBUG_MEMORY' macro #defined in `ftoption.h' though, it is ignored in other builds. FT2_ALLOC_TOTAL_MAX - This variable is ignored if FT2_DEBUG_MEMORY is not defined. It + This variable is ignored if `FT2_DEBUG_MEMORY' is not defined. It allows you to specify a maximum heap size for all memory allocations performed by FreeType. This is very useful to test the robustness of the font engine and programs that use it in tight memory conditions. - If it is undefined, or if its value is not strictly positive, then - no allocation bounds are checked at runtime. + If it is undefined, or if its value is not strictly positive, no + allocation bounds are checked at runtime. FT2_ALLOC_COUNT_MAX - This variable is ignored if FT2_DEBUG_MEMORY is not defined. It + This variable is ignored if `FT2_DEBUG_MEMORY' is not defined. It allows you to specify a maximum number of memory allocations performed by FreeType before returning the error - FT_Err_Out_Of_Memory. This is useful for debugging and testing + `FT_Err_Out_Of_Memory'. This is useful for debugging and testing the engine's robustness. - If it is undefined, or if its value is not strictly positive, then - no allocation bounds are checked at runtime. + If it is undefined, or if its value is not strictly positive, no + allocation bounds are checked at runtime. + + + FT2_KEEP_ALIVE + + This variable is ignored if `FT2_DEBUG_MEMORY' is not defined. + `Keep alive' means that freed blocks aren't released to the heap. + This is useful to detect double-frees or weird heap corruption, + reporting the source code location of the original allocation and + deallocation in case of a problem. It uses large amounts of + memory, however. + + If it is undefined, or if its value is not strictly positive, + freed blocks are released at runtime. ------------------------------------------------------------------------ -Copyright (C) 2002-2019 by +Copyright (C) 2002-2020 by David Turner, Robert Wilhelm, and Werner Lemberg. This file is part of the FreeType project, and may only be used, diff --git a/src/3rdparty/freetype/docs/TODO b/src/3rdparty/freetype/docs/TODO index 1efccc68..8b27e269 100644 --- a/src/3rdparty/freetype/docs/TODO +++ b/src/3rdparty/freetype/docs/TODO @@ -27,7 +27,7 @@ Other bugs have been registered at the savannah bugzilla of FreeType. ------------------------------------------------------------------------ -Copyright (C) 2001-2019 by +Copyright (C) 2001-2020 by David Turner, Robert Wilhelm, and Werner Lemberg. This file is part of the FreeType project, and may only be used, diff --git a/src/3rdparty/freetype/include/freetype/config/ftconfig.h b/src/3rdparty/freetype/include/freetype/config/ftconfig.h index 94666033..b464e0b7 100644 --- a/src/3rdparty/freetype/include/freetype/config/ftconfig.h +++ b/src/3rdparty/freetype/include/freetype/config/ftconfig.h @@ -4,7 +4,7 @@ * * ANSI-specific configuration file (specification only). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -41,533 +41,9 @@ #include FT_CONFIG_OPTIONS_H #include FT_CONFIG_STANDARD_LIBRARY_H - -FT_BEGIN_HEADER - - - /************************************************************************** - * - * PLATFORM-SPECIFIC CONFIGURATION MACROS - * - * These macros can be toggled to suit a specific system. The current ones - * are defaults used to compile FreeType in an ANSI C environment (16bit - * compilers are also supported). Copy this file to your own - * `builds/` directory, and edit it to port the engine. - * - */ - - - /* There are systems (like the Texas Instruments 'C54x) where a `char` */ - /* has 16~bits. ANSI~C says that `sizeof(char)` is always~1. Since an */ - /* `int` has 16~bits also for this system, `sizeof(int)` gives~1 which */ - /* is probably unexpected. */ - /* */ - /* `CHAR_BIT` (defined in `limits.h`) gives the number of bits in a */ - /* `char` type. */ - -#ifndef FT_CHAR_BIT -#define FT_CHAR_BIT CHAR_BIT -#endif - - - /* The size of an `int` type. */ -#if FT_UINT_MAX == 0xFFFFUL -#define FT_SIZEOF_INT ( 16 / FT_CHAR_BIT ) -#elif FT_UINT_MAX == 0xFFFFFFFFUL -#define FT_SIZEOF_INT ( 32 / FT_CHAR_BIT ) -#elif FT_UINT_MAX > 0xFFFFFFFFUL && FT_UINT_MAX == 0xFFFFFFFFFFFFFFFFUL -#define FT_SIZEOF_INT ( 64 / FT_CHAR_BIT ) -#else -#error "Unsupported size of `int' type!" -#endif - - /* The size of a `long` type. A five-byte `long` (as used e.g. on the */ - /* DM642) is recognized but avoided. */ -#if FT_ULONG_MAX == 0xFFFFFFFFUL -#define FT_SIZEOF_LONG ( 32 / FT_CHAR_BIT ) -#elif FT_ULONG_MAX > 0xFFFFFFFFUL && FT_ULONG_MAX == 0xFFFFFFFFFFUL -#define FT_SIZEOF_LONG ( 32 / FT_CHAR_BIT ) -#elif FT_ULONG_MAX > 0xFFFFFFFFUL && FT_ULONG_MAX == 0xFFFFFFFFFFFFFFFFUL -#define FT_SIZEOF_LONG ( 64 / FT_CHAR_BIT ) -#else -#error "Unsupported size of `long' type!" -#endif - - - /* `FT_UNUSED` indicates that a given parameter is not used -- */ - /* this is only used to get rid of unpleasant compiler warnings. */ -#ifndef FT_UNUSED -#define FT_UNUSED( arg ) ( (arg) = (arg) ) -#endif - - - /************************************************************************** - * - * AUTOMATIC CONFIGURATION MACROS - * - * These macros are computed from the ones defined above. Don't touch - * their definition, unless you know precisely what you are doing. No - * porter should need to mess with them. - * - */ - - - /************************************************************************** - * - * Mac support - * - * This is the only necessary change, so it is defined here instead - * providing a new configuration file. - */ -#if defined( __APPLE__ ) || ( defined( __MWERKS__ ) && defined( macintosh ) ) - /* No Carbon frameworks for 64bit 10.4.x. */ - /* `AvailabilityMacros.h` is available since Mac OS X 10.2, */ - /* so guess the system version by maximum errno before inclusion. */ -#include -#ifdef ECANCELED /* defined since 10.2 */ -#include "AvailabilityMacros.h" -#endif -#if defined( __LP64__ ) && \ - ( MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4 ) -#undef FT_MACINTOSH -#endif - -#elif defined( __SC__ ) || defined( __MRC__ ) - /* Classic MacOS compilers */ -#include "ConditionalMacros.h" -#if TARGET_OS_MAC -#define FT_MACINTOSH 1 -#endif - -#endif - - - /* Fix compiler warning with sgi compiler. */ -#if defined( __sgi ) && !defined( __GNUC__ ) -#if defined( _COMPILER_VERSION ) && ( _COMPILER_VERSION >= 730 ) -#pragma set woff 3505 -#endif -#endif - - - /************************************************************************** - * - * @section: - * basic_types - * - */ - - - /************************************************************************** - * - * @type: - * FT_Int16 - * - * @description: - * A typedef for a 16bit signed integer type. - */ - typedef signed short FT_Int16; - - - /************************************************************************** - * - * @type: - * FT_UInt16 - * - * @description: - * A typedef for a 16bit unsigned integer type. - */ - typedef unsigned short FT_UInt16; - - /* */ - - - /* this #if 0 ... #endif clause is for documentation purposes */ -#if 0 - - /************************************************************************** - * - * @type: - * FT_Int32 - * - * @description: - * A typedef for a 32bit signed integer type. The size depends on the - * configuration. - */ - typedef signed XXX FT_Int32; - - - /************************************************************************** - * - * @type: - * FT_UInt32 - * - * A typedef for a 32bit unsigned integer type. The size depends on the - * configuration. - */ - typedef unsigned XXX FT_UInt32; - - - /************************************************************************** - * - * @type: - * FT_Int64 - * - * A typedef for a 64bit signed integer type. The size depends on the - * configuration. Only defined if there is real 64bit support; - * otherwise, it gets emulated with a structure (if necessary). - */ - typedef signed XXX FT_Int64; - - - /************************************************************************** - * - * @type: - * FT_UInt64 - * - * A typedef for a 64bit unsigned integer type. The size depends on the - * configuration. Only defined if there is real 64bit support; - * otherwise, it gets emulated with a structure (if necessary). - */ - typedef unsigned XXX FT_UInt64; - - /* */ - -#endif - -#if FT_SIZEOF_INT == ( 32 / FT_CHAR_BIT ) - - typedef signed int FT_Int32; - typedef unsigned int FT_UInt32; - -#elif FT_SIZEOF_LONG == ( 32 / FT_CHAR_BIT ) - - typedef signed long FT_Int32; - typedef unsigned long FT_UInt32; - -#else -#error "no 32bit type found -- please check your configuration files" -#endif - - - /* look up an integer type that is at least 32~bits */ -#if FT_SIZEOF_INT >= ( 32 / FT_CHAR_BIT ) - - typedef int FT_Fast; - typedef unsigned int FT_UFast; - -#elif FT_SIZEOF_LONG >= ( 32 / FT_CHAR_BIT ) - - typedef long FT_Fast; - typedef unsigned long FT_UFast; - -#endif - - - /* determine whether we have a 64-bit `int` type for platforms without */ - /* Autoconf */ -#if FT_SIZEOF_LONG == ( 64 / FT_CHAR_BIT ) - - /* `FT_LONG64` must be defined if a 64-bit type is available */ -#define FT_LONG64 -#define FT_INT64 long -#define FT_UINT64 unsigned long - - /************************************************************************** - * - * A 64-bit data type may create compilation problems if you compile in - * strict ANSI mode. To avoid them, we disable other 64-bit data types if - * `__STDC__` is defined. You can however ignore this rule by defining the - * `FT_CONFIG_OPTION_FORCE_INT64` configuration macro. - */ -#elif !defined( __STDC__ ) || defined( FT_CONFIG_OPTION_FORCE_INT64 ) - -#if defined( __STDC_VERSION__ ) && __STDC_VERSION__ >= 199901L - -#define FT_LONG64 -#define FT_INT64 long long int -#define FT_UINT64 unsigned long long int - -#elif defined( _MSC_VER ) && _MSC_VER >= 900 /* Visual C++ (and Intel C++) */ - - /* this compiler provides the `__int64` type */ -#define FT_LONG64 -#define FT_INT64 __int64 -#define FT_UINT64 unsigned __int64 - -#elif defined( __BORLANDC__ ) /* Borland C++ */ - - /* XXXX: We should probably check the value of `__BORLANDC__` in order */ - /* to test the compiler version. */ - - /* this compiler provides the `__int64` type */ -#define FT_LONG64 -#define FT_INT64 __int64 -#define FT_UINT64 unsigned __int64 - -#elif defined( __WATCOMC__ ) /* Watcom C++ */ - - /* Watcom doesn't provide 64-bit data types */ - -#elif defined( __MWERKS__ ) /* Metrowerks CodeWarrior */ - -#define FT_LONG64 -#define FT_INT64 long long int -#define FT_UINT64 unsigned long long int - -#elif defined( __GNUC__ ) - - /* GCC provides the `long long` type */ -#define FT_LONG64 -#define FT_INT64 long long int -#define FT_UINT64 unsigned long long int - -#endif /* __STDC_VERSION__ >= 199901L */ - -#endif /* FT_SIZEOF_LONG == (64 / FT_CHAR_BIT) */ - -#ifdef FT_LONG64 - typedef FT_INT64 FT_Int64; - typedef FT_UINT64 FT_UInt64; -#endif - - -#ifdef _WIN64 - /* only 64bit Windows uses the LLP64 data model, i.e., */ - /* 32bit integers, 64bit pointers */ -#define FT_UINT_TO_POINTER( x ) (void*)(unsigned __int64)(x) -#else -#define FT_UINT_TO_POINTER( x ) (void*)(unsigned long)(x) -#endif - - - /************************************************************************** - * - * miscellaneous - * - */ - - -#define FT_BEGIN_STMNT do { -#define FT_END_STMNT } while ( 0 ) -#define FT_DUMMY_STMNT FT_BEGIN_STMNT FT_END_STMNT - - - /* `typeof` condition taken from gnulib's `intprops.h` header file */ -#if ( ( defined( __GNUC__ ) && __GNUC__ >= 2 ) || \ - ( defined( __IBMC__ ) && __IBMC__ >= 1210 && \ - defined( __IBM__TYPEOF__ ) ) || \ - ( defined( __SUNPRO_C ) && __SUNPRO_C >= 0x5110 && !__STDC__ ) ) -#define FT_TYPEOF( type ) ( __typeof__ ( type ) ) -#else -#define FT_TYPEOF( type ) /* empty */ -#endif - - - /* Use `FT_LOCAL` and `FT_LOCAL_DEF` to declare and define, */ - /* respectively, a function that gets used only within the scope of a */ - /* module. Normally, both the header and source code files for such a */ - /* function are within a single module directory. */ - /* */ - /* Intra-module arrays should be tagged with `FT_LOCAL_ARRAY` and */ - /* `FT_LOCAL_ARRAY_DEF`. */ - /* */ -#ifdef FT_MAKE_OPTION_SINGLE_OBJECT - -#define FT_LOCAL( x ) static x -#define FT_LOCAL_DEF( x ) static x - -#else - -#ifdef __cplusplus -#define FT_LOCAL( x ) extern "C" x -#define FT_LOCAL_DEF( x ) extern "C" x -#else -#define FT_LOCAL( x ) extern x -#define FT_LOCAL_DEF( x ) x -#endif - -#endif /* FT_MAKE_OPTION_SINGLE_OBJECT */ - -#define FT_LOCAL_ARRAY( x ) extern const x -#define FT_LOCAL_ARRAY_DEF( x ) const x - - - /* Use `FT_BASE` and `FT_BASE_DEF` to declare and define, respectively, */ - /* functions that are used in more than a single module. In the */ - /* current setup this implies that the declaration is in a header file */ - /* in the `include/freetype/internal` directory, and the function body */ - /* is in a file in `src/base`. */ - /* */ -#ifndef FT_BASE - -#ifdef __cplusplus -#define FT_BASE( x ) extern "C" x -#else -#define FT_BASE( x ) extern x -#endif - -#endif /* !FT_BASE */ - - -#ifndef FT_BASE_DEF - -#ifdef __cplusplus -#define FT_BASE_DEF( x ) x -#else -#define FT_BASE_DEF( x ) x -#endif - -#endif /* !FT_BASE_DEF */ - - - /* When compiling FreeType as a DLL or DSO with hidden visibility */ - /* some systems/compilers need a special attribute in front OR after */ - /* the return type of function declarations. */ - /* */ - /* Two macros are used within the FreeType source code to define */ - /* exported library functions: `FT_EXPORT` and `FT_EXPORT_DEF`. */ - /* */ - /* - `FT_EXPORT( return_type )` */ - /* */ - /* is used in a function declaration, as in */ - /* */ - /* ``` */ - /* FT_EXPORT( FT_Error ) */ - /* FT_Init_FreeType( FT_Library* alibrary ); */ - /* ``` */ - /* */ - /* - `FT_EXPORT_DEF( return_type )` */ - /* */ - /* is used in a function definition, as in */ - /* */ - /* ``` */ - /* FT_EXPORT_DEF( FT_Error ) */ - /* FT_Init_FreeType( FT_Library* alibrary ) */ - /* { */ - /* ... some code ... */ - /* return FT_Err_Ok; */ - /* } */ - /* ``` */ - /* */ - /* You can provide your own implementation of `FT_EXPORT` and */ - /* `FT_EXPORT_DEF` here if you want. */ - /* */ - /* To export a variable, use `FT_EXPORT_VAR`. */ - /* */ -#ifndef FT_EXPORT - -#ifdef FT2_BUILD_LIBRARY - -#if defined( _WIN32 ) && defined( DLL_EXPORT ) -#define FT_EXPORT( x ) __declspec( dllexport ) x -#elif defined( __GNUC__ ) && __GNUC__ >= 4 -#define FT_EXPORT( x ) __attribute__(( visibility( "default" ) )) x -#elif defined( __SUNPRO_C ) && __SUNPRO_C >= 0x550 -#define FT_EXPORT( x ) __global x -#elif defined( __cplusplus ) -#define FT_EXPORT( x ) extern "C" x -#else -#define FT_EXPORT( x ) extern x -#endif - -#else - -#if defined( _WIN32 ) && defined( DLL_IMPORT ) -#define FT_EXPORT( x ) __declspec( dllimport ) x -#elif defined( __cplusplus ) -#define FT_EXPORT( x ) extern "C" x -#else -#define FT_EXPORT( x ) extern x -#endif - -#endif - -#endif /* !FT_EXPORT */ - - -#ifndef FT_EXPORT_DEF - -#ifdef __cplusplus -#define FT_EXPORT_DEF( x ) extern "C" x -#else -#define FT_EXPORT_DEF( x ) extern x -#endif - -#endif /* !FT_EXPORT_DEF */ - - -#ifndef FT_EXPORT_VAR - -#ifdef __cplusplus -#define FT_EXPORT_VAR( x ) extern "C" x -#else -#define FT_EXPORT_VAR( x ) extern x -#endif - -#endif /* !FT_EXPORT_VAR */ - - - /* The following macros are needed to compile the library with a */ - /* C++ compiler and with 16bit compilers. */ - /* */ - - /* This is special. Within C++, you must specify `extern "C"` for */ - /* functions which are used via function pointers, and you also */ - /* must do that for structures which contain function pointers to */ - /* assure C linkage -- it's not possible to have (local) anonymous */ - /* functions which are accessed by (global) function pointers. */ - /* */ - /* */ - /* FT_CALLBACK_DEF is used to _define_ a callback function, */ - /* located in the same source code file as the structure that uses */ - /* it. */ - /* */ - /* FT_BASE_CALLBACK and FT_BASE_CALLBACK_DEF are used to declare */ - /* and define a callback function, respectively, in a similar way */ - /* as FT_BASE and FT_BASE_DEF work. */ - /* */ - /* FT_CALLBACK_TABLE is used to _declare_ a constant variable that */ - /* contains pointers to callback functions. */ - /* */ - /* FT_CALLBACK_TABLE_DEF is used to _define_ a constant variable */ - /* that contains pointers to callback functions. */ - /* */ - /* */ - /* Some 16bit compilers have to redefine these macros to insert */ - /* the infamous `_cdecl` or `__fastcall` declarations. */ - /* */ -#ifndef FT_CALLBACK_DEF -#ifdef __cplusplus -#define FT_CALLBACK_DEF( x ) extern "C" x -#else -#define FT_CALLBACK_DEF( x ) static x -#endif -#endif /* FT_CALLBACK_DEF */ - -#ifndef FT_BASE_CALLBACK -#ifdef __cplusplus -#define FT_BASE_CALLBACK( x ) extern "C" x -#define FT_BASE_CALLBACK_DEF( x ) extern "C" x -#else -#define FT_BASE_CALLBACK( x ) extern x -#define FT_BASE_CALLBACK_DEF( x ) x -#endif -#endif /* FT_BASE_CALLBACK */ - -#ifndef FT_CALLBACK_TABLE -#ifdef __cplusplus -#define FT_CALLBACK_TABLE extern "C" -#define FT_CALLBACK_TABLE_DEF extern "C" -#else -#define FT_CALLBACK_TABLE extern -#define FT_CALLBACK_TABLE_DEF /* nothing */ -#endif -#endif /* FT_CALLBACK_TABLE */ - - -FT_END_HEADER - +#include +#include +#include #endif /* FTCONFIG_H_ */ diff --git a/src/3rdparty/freetype/include/freetype/config/ftheader.h b/src/3rdparty/freetype/include/freetype/config/ftheader.h index 696d6ba9..28b5cc60 100644 --- a/src/3rdparty/freetype/include/freetype/config/ftheader.h +++ b/src/3rdparty/freetype/include/freetype/config/ftheader.h @@ -4,7 +4,7 @@ * * Build macros of the FreeType 2 library. * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -30,10 +30,12 @@ /* encapsulated in an `extern "C" { .. }` block when included from a */ /* C++ compiler. */ /* */ -#ifdef __cplusplus -#define FT_BEGIN_HEADER extern "C" { -#else -#define FT_BEGIN_HEADER /* nothing */ +#ifndef FT_BEGIN_HEADER +# ifdef __cplusplus +# define FT_BEGIN_HEADER extern "C" { +# else +# define FT_BEGIN_HEADER /* nothing */ +# endif #endif @@ -48,10 +50,12 @@ /* encapsulated in an `extern "C" { .. }` block when included from a */ /* C++ compiler. */ /* */ -#ifdef __cplusplus -#define FT_END_HEADER } -#else -#define FT_END_HEADER /* nothing */ +#ifndef FT_END_HEADER +# ifdef __cplusplus +# define FT_END_HEADER } +# else +# define FT_END_HEADER /* nothing */ +# endif #endif @@ -73,9 +77,16 @@ * Macro definitions used to `#include` specific header files. * * @description: - * The following macros are defined to the name of specific FreeType~2 - * header files. They can be used directly in `#include` statements as - * in: + * In addition to the normal scheme of including header files like + * + * ``` + * #include + * #include + * #include + * ``` + * + * it is possible to used named macros instead. They can be used + * directly in `#include` statements as in * * ``` * #include FT_FREETYPE_H @@ -83,13 +94,9 @@ * #include FT_GLYPH_H * ``` * - * There are several reasons why we are now using macros to name public - * header files. The first one is that such macros are not limited to - * the infamous 8.3~naming rule required by DOS (and - * `FT_MULTIPLE_MASTERS_H` is a lot more meaningful than `ftmm.h`). - * - * The second reason is that it allows for more flexibility in the way - * FreeType~2 is installed on a given system. + * These macros were introduced to overcome the infamous 8.3~naming rule + * required by DOS (and `FT_MULTIPLE_MASTERS_H` is a lot more meaningful + * than `ftmm.h`). * */ @@ -797,16 +804,19 @@ #define FT_CACHE_INTERNAL_IMAGE_H FT_CACHE_H #define FT_CACHE_INTERNAL_SBITS_H FT_CACHE_H - - /* - * Include internal headers definitions from `` only when - * building the library. - */ +/* TODO(david): Move this section below to a different header */ #ifdef FT2_BUILD_LIBRARY -#define FT_INTERNAL_INTERNAL_H -#include FT_INTERNAL_INTERNAL_H -#endif /* FT2_BUILD_LIBRARY */ +#if defined( _MSC_VER ) /* Visual C++ (and Intel C++) */ + /* We disable the warning `conditional expression is constant' here */ + /* in order to compile cleanly with the maximum level of warnings. */ + /* In particular, the warning complains about stuff like `while(0)' */ + /* which is very useful in macro definitions. There is no benefit */ + /* in having it enabled. */ +#pragma warning( disable : 4127 ) + +#endif /* _MSC_VER */ +#endif /* FT2_BUILD_LIBRARY */ #endif /* FTHEADER_H_ */ diff --git a/src/3rdparty/freetype/include/freetype/config/ftmodule.h b/src/3rdparty/freetype/include/freetype/config/ftmodule.h index 7c603e53..b5c4b1ee 100644 --- a/src/3rdparty/freetype/include/freetype/config/ftmodule.h +++ b/src/3rdparty/freetype/include/freetype/config/ftmodule.h @@ -25,8 +25,6 @@ FT_USE_MODULE( FT_Module_Class, pshinter_module_class ) FT_USE_MODULE( FT_Renderer_Class, ft_raster1_renderer_class ) FT_USE_MODULE( FT_Module_Class, sfnt_module_class ) FT_USE_MODULE( FT_Renderer_Class, ft_smooth_renderer_class ) -FT_USE_MODULE( FT_Renderer_Class, ft_smooth_lcd_renderer_class ) -FT_USE_MODULE( FT_Renderer_Class, ft_smooth_lcdv_renderer_class ) FT_USE_MODULE( FT_Driver_ClassRec, bdf_driver_class ) /* EOF */ diff --git a/src/3rdparty/freetype/include/freetype/config/ftoption.h b/src/3rdparty/freetype/include/freetype/config/ftoption.h index 12f47a82..097f19b8 100644 --- a/src/3rdparty/freetype/include/freetype/config/ftoption.h +++ b/src/3rdparty/freetype/include/freetype/config/ftoption.h @@ -4,7 +4,7 @@ * * User-selectable configuration macros (specification only). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -42,7 +42,7 @@ FT_BEGIN_HEADER * the name of a directory that is included _before_ the FreeType include * path during compilation. * - * The default FreeType Makefiles and Jamfiles use the build directory + * The default FreeType Makefiles use the build directory * `builds/` by default, but you can easily change that for your * own projects. * @@ -121,10 +121,8 @@ FT_BEGIN_HEADER * mitigate color fringes inherent to this technology, you also need to * explicitly set up LCD filtering. * - * Note that this feature is covered by several Microsoft patents and - * should not be activated in any default build of the library. When this - * macro is not defined, FreeType offers alternative LCD rendering - * technology that produces excellent output without LCD filtering. + * When this macro is not defined, FreeType offers alternative LCD + * rendering technology that produces excellent output. */ /* #define FT_CONFIG_OPTION_SUBPIXEL_RENDERING */ @@ -292,6 +290,22 @@ FT_BEGIN_HEADER /* #define FT_CONFIG_OPTION_USE_HARFBUZZ */ + /************************************************************************** + * + * Brotli support. + * + * FreeType uses the Brotli library to provide support for decompressing + * WOFF2 streams. + * + * Define this macro if you want to enable this 'feature'. + * + * If you use a build system like cmake or the `configure` script, + * options set by those programs have precedence, overwriting the value + * here with the configured one. + */ +/* #define FT_CONFIG_OPTION_USE_BROTLI */ + + /************************************************************************** * * Glyph Postscript Names handling @@ -526,7 +540,7 @@ FT_BEGIN_HEADER /************************************************************************** * - * Define `TT_CONFIG_OPTION_COLOR_LAYERS` if you want to support coloured + * Define `TT_CONFIG_OPTION_COLOR_LAYERS` if you want to support colored * outlines (from the 'COLR'/'CPAL' tables) in all formats using the 'sfnt' * module (namely TrueType~& OpenType). */ @@ -871,9 +885,11 @@ FT_BEGIN_HEADER * * Compile 'autofit' module with fallback Indic script support, covering * some scripts that the 'latin' submodule of the 'autofit' module doesn't - * (yet) handle. + * (yet) handle. Currently, this needs option `AF_CONFIG_OPTION_CJK`. */ +#ifdef AF_CONFIG_OPTION_CJK #define AF_CONFIG_OPTION_INDIC +#endif /************************************************************************** diff --git a/src/3rdparty/freetype/include/freetype/config/ftstdlib.h b/src/3rdparty/freetype/include/freetype/config/ftstdlib.h index 438b6145..d6091f8b 100644 --- a/src/3rdparty/freetype/include/freetype/config/ftstdlib.h +++ b/src/3rdparty/freetype/include/freetype/config/ftstdlib.h @@ -5,7 +5,7 @@ * ANSI-specific library and header configuration file (specification * only). * - * Copyright (C) 2002-2019 by + * Copyright (C) 2002-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, diff --git a/src/3rdparty/freetype/include/freetype/config/integer-types.h b/src/3rdparty/freetype/include/freetype/config/integer-types.h new file mode 100644 index 00000000..a0ca0c95 --- /dev/null +++ b/src/3rdparty/freetype/include/freetype/config/integer-types.h @@ -0,0 +1,245 @@ +/**************************************************************************** + * + * config/integer-types.h + * + * FreeType integer types definitions. + * + * Copyright (C) 1996-2020 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ +#ifndef FREETYPE_CONFIG_INTEGER_TYPES_H_ +#define FREETYPE_CONFIG_INTEGER_TYPES_H_ + + /* There are systems (like the Texas Instruments 'C54x) where a `char` */ + /* has 16~bits. ANSI~C says that `sizeof(char)` is always~1. Since an */ + /* `int` has 16~bits also for this system, `sizeof(int)` gives~1 which */ + /* is probably unexpected. */ + /* */ + /* `CHAR_BIT` (defined in `limits.h`) gives the number of bits in a */ + /* `char` type. */ + +#ifndef FT_CHAR_BIT +#define FT_CHAR_BIT CHAR_BIT +#endif + +#ifndef FT_SIZEOF_INT + + /* The size of an `int` type. */ +#if FT_UINT_MAX == 0xFFFFUL +#define FT_SIZEOF_INT ( 16 / FT_CHAR_BIT ) +#elif FT_UINT_MAX == 0xFFFFFFFFUL +#define FT_SIZEOF_INT ( 32 / FT_CHAR_BIT ) +#elif FT_UINT_MAX > 0xFFFFFFFFUL && FT_UINT_MAX == 0xFFFFFFFFFFFFFFFFUL +#define FT_SIZEOF_INT ( 64 / FT_CHAR_BIT ) +#else +#error "Unsupported size of `int' type!" +#endif + +#endif /* !defined(FT_SIZEOF_INT) */ + +#ifndef FT_SIZEOF_LONG + + /* The size of a `long` type. A five-byte `long` (as used e.g. on the */ + /* DM642) is recognized but avoided. */ +#if FT_ULONG_MAX == 0xFFFFFFFFUL +#define FT_SIZEOF_LONG ( 32 / FT_CHAR_BIT ) +#elif FT_ULONG_MAX > 0xFFFFFFFFUL && FT_ULONG_MAX == 0xFFFFFFFFFFUL +#define FT_SIZEOF_LONG ( 32 / FT_CHAR_BIT ) +#elif FT_ULONG_MAX > 0xFFFFFFFFUL && FT_ULONG_MAX == 0xFFFFFFFFFFFFFFFFUL +#define FT_SIZEOF_LONG ( 64 / FT_CHAR_BIT ) +#else +#error "Unsupported size of `long' type!" +#endif + +#endif /* !defined(FT_SIZEOF_LONG) */ + + /************************************************************************** + * + * @section: + * basic_types + * + */ + + + /************************************************************************** + * + * @type: + * FT_Int16 + * + * @description: + * A typedef for a 16bit signed integer type. + */ + typedef signed short FT_Int16; + + + /************************************************************************** + * + * @type: + * FT_UInt16 + * + * @description: + * A typedef for a 16bit unsigned integer type. + */ + typedef unsigned short FT_UInt16; + + /* */ + + + /* this #if 0 ... #endif clause is for documentation purposes */ +#if 0 + + /************************************************************************** + * + * @type: + * FT_Int32 + * + * @description: + * A typedef for a 32bit signed integer type. The size depends on the + * configuration. + */ + typedef signed XXX FT_Int32; + + + /************************************************************************** + * + * @type: + * FT_UInt32 + * + * A typedef for a 32bit unsigned integer type. The size depends on the + * configuration. + */ + typedef unsigned XXX FT_UInt32; + + + /************************************************************************** + * + * @type: + * FT_Int64 + * + * A typedef for a 64bit signed integer type. The size depends on the + * configuration. Only defined if there is real 64bit support; + * otherwise, it gets emulated with a structure (if necessary). + */ + typedef signed XXX FT_Int64; + + + /************************************************************************** + * + * @type: + * FT_UInt64 + * + * A typedef for a 64bit unsigned integer type. The size depends on the + * configuration. Only defined if there is real 64bit support; + * otherwise, it gets emulated with a structure (if necessary). + */ + typedef unsigned XXX FT_UInt64; + + /* */ + +#endif + +#if FT_SIZEOF_INT == ( 32 / FT_CHAR_BIT ) + + typedef signed int FT_Int32; + typedef unsigned int FT_UInt32; + +#elif FT_SIZEOF_LONG == ( 32 / FT_CHAR_BIT ) + + typedef signed long FT_Int32; + typedef unsigned long FT_UInt32; + +#else +#error "no 32bit type found -- please check your configuration files" +#endif + + + /* look up an integer type that is at least 32~bits */ +#if FT_SIZEOF_INT >= ( 32 / FT_CHAR_BIT ) + + typedef int FT_Fast; + typedef unsigned int FT_UFast; + +#elif FT_SIZEOF_LONG >= ( 32 / FT_CHAR_BIT ) + + typedef long FT_Fast; + typedef unsigned long FT_UFast; + +#endif + + + /* determine whether we have a 64-bit `int` type for platforms without */ + /* Autoconf */ +#if FT_SIZEOF_LONG == ( 64 / FT_CHAR_BIT ) + + /* `FT_LONG64` must be defined if a 64-bit type is available */ +#define FT_LONG64 +#define FT_INT64 long +#define FT_UINT64 unsigned long + + /************************************************************************** + * + * A 64-bit data type may create compilation problems if you compile in + * strict ANSI mode. To avoid them, we disable other 64-bit data types if + * `__STDC__` is defined. You can however ignore this rule by defining the + * `FT_CONFIG_OPTION_FORCE_INT64` configuration macro. + */ +#elif !defined( __STDC__ ) || defined( FT_CONFIG_OPTION_FORCE_INT64 ) + +#if defined( __STDC_VERSION__ ) && __STDC_VERSION__ >= 199901L + +#define FT_LONG64 +#define FT_INT64 long long int +#define FT_UINT64 unsigned long long int + +#elif defined( _MSC_VER ) && _MSC_VER >= 900 /* Visual C++ (and Intel C++) */ + + /* this compiler provides the `__int64` type */ +#define FT_LONG64 +#define FT_INT64 __int64 +#define FT_UINT64 unsigned __int64 + +#elif defined( __BORLANDC__ ) /* Borland C++ */ + + /* XXXX: We should probably check the value of `__BORLANDC__` in order */ + /* to test the compiler version. */ + + /* this compiler provides the `__int64` type */ +#define FT_LONG64 +#define FT_INT64 __int64 +#define FT_UINT64 unsigned __int64 + +#elif defined( __WATCOMC__ ) /* Watcom C++ */ + + /* Watcom doesn't provide 64-bit data types */ + +#elif defined( __MWERKS__ ) /* Metrowerks CodeWarrior */ + +#define FT_LONG64 +#define FT_INT64 long long int +#define FT_UINT64 unsigned long long int + +#elif defined( __GNUC__ ) + + /* GCC provides the `long long` type */ +#define FT_LONG64 +#define FT_INT64 long long int +#define FT_UINT64 unsigned long long int + +#endif /* __STDC_VERSION__ >= 199901L */ + +#endif /* FT_SIZEOF_LONG == (64 / FT_CHAR_BIT) */ + +#ifdef FT_LONG64 + typedef FT_INT64 FT_Int64; + typedef FT_UINT64 FT_UInt64; +#endif + + +#endif /* FREETYPE_CONFIG_INTEGER_TYPES_H_ */ diff --git a/src/3rdparty/freetype/include/freetype/config/mac-support.h b/src/3rdparty/freetype/include/freetype/config/mac-support.h new file mode 100644 index 00000000..94867088 --- /dev/null +++ b/src/3rdparty/freetype/include/freetype/config/mac-support.h @@ -0,0 +1,49 @@ +/**************************************************************************** + * + * config/mac-support.h + * + * Mac/OS X support configuration header. + * + * Copyright (C) 1996-2020 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ +#ifndef FREETYPE_CONFIG_MAC_SUPPORT_H_ +#define FREETYPE_CONFIG_MAC_SUPPORT_H_ + + /************************************************************************** + * + * Mac support + * + * This is the only necessary change, so it is defined here instead + * providing a new configuration file. + */ +#if defined( __APPLE__ ) || ( defined( __MWERKS__ ) && defined( macintosh ) ) + /* No Carbon frameworks for 64bit 10.4.x. */ + /* `AvailabilityMacros.h` is available since Mac OS X 10.2, */ + /* so guess the system version by maximum errno before inclusion. */ +#include +#ifdef ECANCELED /* defined since 10.2 */ +#include "AvailabilityMacros.h" +#endif +#if defined( __LP64__ ) && \ + ( MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4 ) +#undef FT_MACINTOSH +#endif + +#elif defined( __SC__ ) || defined( __MRC__ ) + /* Classic MacOS compilers */ +#include "ConditionalMacros.h" +#if TARGET_OS_MAC +#define FT_MACINTOSH 1 +#endif + +#endif /* Mac support */ + +#endif /* FREETYPE_CONFIG_MAC_SUPPORT_H_ */ diff --git a/src/3rdparty/freetype/include/freetype/config/public-macros.h b/src/3rdparty/freetype/include/freetype/config/public-macros.h new file mode 100644 index 00000000..6aa673e8 --- /dev/null +++ b/src/3rdparty/freetype/include/freetype/config/public-macros.h @@ -0,0 +1,120 @@ +/**************************************************************************** + * + * config/public-macros.h + * + * Define a set of compiler macros used in public FreeType headers. + * + * Copyright (C) 2020 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + /* + * The definitions in this file are used by the public FreeType headers + * and thus should be considered part of the public API. + * + * Other compiler-specific macro definitions that are not exposed by the + * FreeType API should go into + * `include/freetype/internal/compiler-macros.h` instead. + */ +#ifndef FREETYPE_CONFIG_PUBLIC_MACROS_H_ +#define FREETYPE_CONFIG_PUBLIC_MACROS_H_ + + /* + * `FT_BEGIN_HEADER` and `FT_END_HEADER` might have already been defined + * by `freetype/config/ftheader.h`, but we don't want to include this + * header here, so redefine the macros here only when needed. Their + * definition is very stable, so keeping them in sync with the ones in the + * header should not be a maintenance issue. + */ +#ifndef FT_BEGIN_HEADER +#ifdef __cplusplus +#define FT_BEGIN_HEADER extern "C" { +#else +#define FT_BEGIN_HEADER /* empty */ +#endif +#endif /* FT_BEGIN_HEADER */ + +#ifndef FT_END_HEADER +#ifdef __cplusplus +#define FT_END_HEADER } +#else +#define FT_END_HEADER /* empty */ +#endif +#endif /* FT_END_HEADER */ + + +FT_BEGIN_HEADER + + /* + * Mark a function declaration as public. This ensures it will be + * properly exported to client code. Place this before a function + * declaration. + * + * NOTE: This macro should be considered an internal implementation + * detail, and not part of the FreeType API. It is only defined here + * because it is needed by `FT_EXPORT`. + */ + + /* Visual C, mingw */ +#if defined( _WIN32 ) + +#if defined( FT2_BUILD_LIBRARY ) && defined( DLL_EXPORT ) +#define FT_PUBLIC_FUNCTION_ATTRIBUTE __declspec( dllexport ) +#elif defined( DLL_IMPORT ) +#define FT_PUBLIC_FUNCTION_ATTRIBUTE __declspec( dllimport ) +#endif + + /* gcc, clang */ +#elif ( defined( __GNUC__ ) && __GNUC__ >= 4 ) || defined( __clang__ ) +#define FT_PUBLIC_FUNCTION_ATTRIBUTE \ + __attribute__(( visibility( "default" ) )) + + /* Sun */ +#elif defined( __SUNPRO_C ) && __SUNPRO_C >= 0x550 +#define FT_PUBLIC_FUNCTION_ATTRIBUTE __global +#endif + + +#ifndef FT_PUBLIC_FUNCTION_ATTRIBUTE +#define FT_PUBLIC_FUNCTION_ATTRIBUTE /* empty */ +#endif + + + /* + * Define a public FreeType API function. This ensures it is properly + * exported or imported at build time. The macro parameter is the + * function's return type as in: + * + * FT_EXPORT( FT_Bool ) + * FT_Object_Method( FT_Object obj, + * ... ); + * + * NOTE: This requires that all `FT_EXPORT` uses are inside + * `FT_BEGIN_HEADER ... FT_END_HEADER` blocks. This guarantees that the + * functions are exported with C linkage, even when the header is included + * by a C++ source file. + */ +#define FT_EXPORT( x ) FT_PUBLIC_FUNCTION_ATTRIBUTE extern x + + /* + * `FT_UNUSED` indicates that a given parameter is not used -- this is + * only used to get rid of unpleasant compiler warnings. + * + * Technically, this was not meant to be part of the public API, but some + * third-party code depends on it. + */ +#ifndef FT_UNUSED +#define FT_UNUSED( arg ) ( (arg) = (arg) ) +#endif + + +FT_END_HEADER + +#endif /* FREETYPE_CONFIG_PUBLIC_MACROS_H_ */ diff --git a/src/3rdparty/freetype/include/freetype/freetype.h b/src/3rdparty/freetype/include/freetype/freetype.h index a6bb667e..be191f5a 100644 --- a/src/3rdparty/freetype/include/freetype/freetype.h +++ b/src/3rdparty/freetype/include/freetype/freetype.h @@ -4,7 +4,7 @@ * * FreeType high-level API and common types (specification only). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -20,19 +20,10 @@ #define FREETYPE_H_ -#ifndef FT_FREETYPE_H -#error "`ft2build.h' hasn't been included yet!" -#error "Please always use macros to include FreeType header files." -#error "Example:" -#error " #include " -#error " #include FT_FREETYPE_H" -#endif - - #include #include FT_CONFIG_CONFIG_H -#include FT_TYPES_H -#include FT_ERRORS_H +#include +#include FT_BEGIN_HEADER @@ -51,22 +42,15 @@ FT_BEGIN_HEADER * How client applications should include FreeType header files. * * @description: - * To be as flexible as possible (and for historical reasons), FreeType - * uses a very special inclusion scheme to load header files, for example + * To be as flexible as possible (and for historical reasons), you must + * load file `ft2build.h` first before other header files, for example * * ``` * #include * - * #include FT_FREETYPE_H - * #include FT_OUTLINE_H + * #include + * #include * ``` - * - * A compiler and its preprocessor only needs an include path to find the - * file `ft2build.h`; the exact locations and names of the other FreeType - * header files are hidden by @header_file_macros, loaded by - * `ft2build.h`. The API documentation always gives the header macro - * name needed for a particular function. - * */ @@ -974,6 +958,9 @@ FT_BEGIN_HEADER * Note that the bounding box might be off by (at least) one pixel for * hinted fonts. See @FT_Size_Metrics for further discussion. * + * Note that the bounding box does not vary in OpenType variable fonts + * and should only be used in relation to the default instance. + * * units_per_EM :: * The number of font units per EM square for this face. This is * typically 2048 for TrueType fonts, and 1000 for Type~1 fonts. Only @@ -1239,7 +1226,7 @@ FT_BEGIN_HEADER * */ #define FT_HAS_HORIZONTAL( face ) \ - ( (face)->face_flags & FT_FACE_FLAG_HORIZONTAL ) + ( !!( (face)->face_flags & FT_FACE_FLAG_HORIZONTAL ) ) /************************************************************************** @@ -1253,7 +1240,7 @@ FT_BEGIN_HEADER * */ #define FT_HAS_VERTICAL( face ) \ - ( (face)->face_flags & FT_FACE_FLAG_VERTICAL ) + ( !!( (face)->face_flags & FT_FACE_FLAG_VERTICAL ) ) /************************************************************************** @@ -1267,7 +1254,7 @@ FT_BEGIN_HEADER * */ #define FT_HAS_KERNING( face ) \ - ( (face)->face_flags & FT_FACE_FLAG_KERNING ) + ( !!( (face)->face_flags & FT_FACE_FLAG_KERNING ) ) /************************************************************************** @@ -1282,7 +1269,7 @@ FT_BEGIN_HEADER * */ #define FT_IS_SCALABLE( face ) \ - ( (face)->face_flags & FT_FACE_FLAG_SCALABLE ) + ( !!( (face)->face_flags & FT_FACE_FLAG_SCALABLE ) ) /************************************************************************** @@ -1301,7 +1288,7 @@ FT_BEGIN_HEADER * */ #define FT_IS_SFNT( face ) \ - ( (face)->face_flags & FT_FACE_FLAG_SFNT ) + ( !!( (face)->face_flags & FT_FACE_FLAG_SFNT ) ) /************************************************************************** @@ -1316,7 +1303,7 @@ FT_BEGIN_HEADER * */ #define FT_IS_FIXED_WIDTH( face ) \ - ( (face)->face_flags & FT_FACE_FLAG_FIXED_WIDTH ) + ( !!( (face)->face_flags & FT_FACE_FLAG_FIXED_WIDTH ) ) /************************************************************************** @@ -1331,7 +1318,7 @@ FT_BEGIN_HEADER * */ #define FT_HAS_FIXED_SIZES( face ) \ - ( (face)->face_flags & FT_FACE_FLAG_FIXED_SIZES ) + ( !!( (face)->face_flags & FT_FACE_FLAG_FIXED_SIZES ) ) /************************************************************************** @@ -1357,7 +1344,7 @@ FT_BEGIN_HEADER * */ #define FT_HAS_GLYPH_NAMES( face ) \ - ( (face)->face_flags & FT_FACE_FLAG_GLYPH_NAMES ) + ( !!( (face)->face_flags & FT_FACE_FLAG_GLYPH_NAMES ) ) /************************************************************************** @@ -1372,7 +1359,7 @@ FT_BEGIN_HEADER * */ #define FT_HAS_MULTIPLE_MASTERS( face ) \ - ( (face)->face_flags & FT_FACE_FLAG_MULTIPLE_MASTERS ) + ( !!( (face)->face_flags & FT_FACE_FLAG_MULTIPLE_MASTERS ) ) /************************************************************************** @@ -1394,7 +1381,7 @@ FT_BEGIN_HEADER * */ #define FT_IS_NAMED_INSTANCE( face ) \ - ( (face)->face_index & 0x7FFF0000L ) + ( !!( (face)->face_index & 0x7FFF0000L ) ) /************************************************************************** @@ -1412,7 +1399,7 @@ FT_BEGIN_HEADER * */ #define FT_IS_VARIATION( face ) \ - ( (face)->face_flags & FT_FACE_FLAG_VARIATION ) + ( !!( (face)->face_flags & FT_FACE_FLAG_VARIATION ) ) /************************************************************************** @@ -1429,7 +1416,7 @@ FT_BEGIN_HEADER * */ #define FT_IS_CID_KEYED( face ) \ - ( (face)->face_flags & FT_FACE_FLAG_CID_KEYED ) + ( !!( (face)->face_flags & FT_FACE_FLAG_CID_KEYED ) ) /************************************************************************** @@ -1443,7 +1430,7 @@ FT_BEGIN_HEADER * */ #define FT_IS_TRICKY( face ) \ - ( (face)->face_flags & FT_FACE_FLAG_TRICKY ) + ( !!( (face)->face_flags & FT_FACE_FLAG_TRICKY ) ) /************************************************************************** @@ -1460,7 +1447,7 @@ FT_BEGIN_HEADER * */ #define FT_HAS_COLOR( face ) \ - ( (face)->face_flags & FT_FACE_FLAG_COLOR ) + ( !!( (face)->face_flags & FT_FACE_FLAG_COLOR ) ) /************************************************************************** @@ -2078,7 +2065,8 @@ FT_BEGIN_HEADER * The size in bytes of the file in memory. * * pathname :: - * A pointer to an 8-bit file pathname. + * A pointer to an 8-bit file pathname. The pointer is not owned by + * FreeType. * * stream :: * A handle to a source stream object. @@ -3187,6 +3175,12 @@ FT_BEGIN_HEADER * A pointer to the translation vector. Use `NULL` for the null vector. * * @note: + * This function is provided as a convenience, but keep in mind that + * @FT_Matrix coefficients are only 16.16 fixed point values, which can + * limit the accuracy of the results. Using floating-point computations + * to perform the transform directly in client code instead will always + * yield better numbers. + * * The transformation is only applied to scalable image formats after the * glyph has been loaded. It means that hinting is unaltered by the * transformation and is performed on the character size given in the @@ -3245,14 +3239,6 @@ FT_BEGIN_HEADER * pixels and use the @FT_PIXEL_MODE_LCD_V mode. * * @note: - * Should you define `FT_CONFIG_OPTION_SUBPIXEL_RENDERING` in your - * `ftoption.h`, which enables patented ClearType-style rendering, the - * LCD-optimized glyph bitmaps should be filtered to reduce color fringes - * inherent to this technology. You can either set up LCD filtering with - * @FT_Library_SetLcdFilter or @FT_Face_Properties, or do the filtering - * yourself. The default FreeType LCD rendering technology does not - * require filtering. - * * The selected render mode only affects vector glyphs of a font. * Embedded bitmaps often have a different pixel mode like * @FT_PIXEL_MODE_MONO. You can use @FT_Bitmap_Convert to transform them @@ -4088,7 +4074,7 @@ FT_BEGIN_HEADER * https://docs.microsoft.com/en-us/typography/opentype/spec/colr * * The glyph layer data for a given glyph index, if present, provides an - * alternative, multi-colour glyph representation: Instead of rendering + * alternative, multi-color glyph representation: Instead of rendering * the outline or bitmap with the given glyph index, glyphs with the * indices and colors returned by this function are rendered layer by * layer. @@ -4781,7 +4767,7 @@ FT_BEGIN_HEADER */ #define FREETYPE_MAJOR 2 #define FREETYPE_MINOR 10 -#define FREETYPE_PATCH 1 +#define FREETYPE_PATCH 4 /************************************************************************** diff --git a/src/3rdparty/freetype/include/freetype/ftadvanc.h b/src/3rdparty/freetype/include/freetype/ftadvanc.h index 95c38f92..f166bc6f 100644 --- a/src/3rdparty/freetype/include/freetype/ftadvanc.h +++ b/src/3rdparty/freetype/include/freetype/ftadvanc.h @@ -4,7 +4,7 @@ * * Quick computation of advance widths (specification only). * - * Copyright (C) 2008-2019 by + * Copyright (C) 2008-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -20,8 +20,7 @@ #define FTADVANC_H_ -#include -#include FT_FREETYPE_H +#include #ifdef FREETYPE_H #error "freetype.h of FreeType 1 has been loaded!" @@ -96,6 +95,7 @@ FT_BEGIN_HEADER * load_flags :: * A set of bit flags similar to those used when calling * @FT_Load_Glyph, used to determine what kind of advances you need. + * * @output: * padvance :: * The advance value. If scaling is performed (based on the value of diff --git a/src/3rdparty/freetype/include/freetype/ftautoh.h b/src/3rdparty/freetype/include/freetype/ftautoh.h deleted file mode 100644 index ab39c219..00000000 --- a/src/3rdparty/freetype/include/freetype/ftautoh.h +++ /dev/null @@ -1,450 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftautoh.h */ -/* */ -/* FreeType API for controlling the auto-hinter (specification only). */ -/* */ -/* Copyright 2012-2015 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __FTAUTOH_H__ -#define __FTAUTOH_H__ - -#include -#include FT_FREETYPE_H - -#ifdef FREETYPE_H -#error "freetype.h of FreeType 1 has been loaded!" -#error "Please fix the directory search order for header files" -#error "so that freetype.h of FreeType 2 is found first." -#endif - - -FT_BEGIN_HEADER - - - /************************************************************************** - * - * @section: - * auto_hinter - * - * @title: - * The auto-hinter - * - * @abstract: - * Controlling the auto-hinting module. - * - * @description: - * While FreeType's auto-hinter doesn't expose API functions by itself, - * it is possible to control its behaviour with @FT_Property_Set and - * @FT_Property_Get. The following lists the available properties - * together with the necessary macros and structures. - * - * Note that the auto-hinter's module name is `autofitter' for - * historical reasons. - * - */ - - - /************************************************************************** - * - * @property: - * glyph-to-script-map - * - * @description: - * *Experimental* *only* - * - * The auto-hinter provides various script modules to hint glyphs. - * Examples of supported scripts are Latin or CJK. Before a glyph is - * auto-hinted, the Unicode character map of the font gets examined, and - * the script is then determined based on Unicode character ranges, see - * below. - * - * OpenType fonts, however, often provide much more glyphs than - * character codes (small caps, superscripts, ligatures, swashes, etc.), - * to be controlled by so-called `features'. Handling OpenType features - * can be quite complicated and thus needs a separate library on top of - * FreeType. - * - * The mapping between glyph indices and scripts (in the auto-hinter - * sense, see the @FT_AUTOHINTER_SCRIPT_XXX values) is stored as an - * array with `num_glyphs' elements, as found in the font's @FT_Face - * structure. The `glyph-to-script-map' property returns a pointer to - * this array, which can be modified as needed. Note that the - * modification should happen before the first glyph gets processed by - * the auto-hinter so that the global analysis of the font shapes - * actually uses the modified mapping. - * - * The following example code demonstrates how to access it (omitting - * the error handling). - * - * { - * FT_Library library; - * FT_Face face; - * FT_Prop_GlyphToScriptMap prop; - * - * - * FT_Init_FreeType( &library ); - * FT_New_Face( library, "foo.ttf", 0, &face ); - * - * prop.face = face; - * - * FT_Property_Get( library, "autofitter", - * "glyph-to-script-map", &prop ); - * - * // adjust `prop.map' as needed right here - * - * FT_Load_Glyph( face, ..., FT_LOAD_FORCE_AUTOHINT ); - * } - * - */ - - - /************************************************************************** - * - * @enum: - * FT_AUTOHINTER_SCRIPT_XXX - * - * @description: - * *Experimental* *only* - * - * A list of constants used for the @glyph-to-script-map property to - * specify the script submodule the auto-hinter should use for hinting a - * particular glyph. - * - * @values: - * FT_AUTOHINTER_SCRIPT_NONE :: - * Don't auto-hint this glyph. - * - * FT_AUTOHINTER_SCRIPT_LATIN :: - * Apply the latin auto-hinter. For the auto-hinter, `latin' is a - * very broad term, including Cyrillic and Greek also since characters - * from those scripts share the same design constraints. - * - * By default, characters from the following Unicode ranges are - * assigned to this submodule. - * - * { - * U+0020 - U+007F // Basic Latin (no control characters) - * U+00A0 - U+00FF // Latin-1 Supplement (no control characters) - * U+0100 - U+017F // Latin Extended-A - * U+0180 - U+024F // Latin Extended-B - * U+0250 - U+02AF // IPA Extensions - * U+02B0 - U+02FF // Spacing Modifier Letters - * U+0300 - U+036F // Combining Diacritical Marks - * U+0370 - U+03FF // Greek and Coptic - * U+0400 - U+04FF // Cyrillic - * U+0500 - U+052F // Cyrillic Supplement - * U+1D00 - U+1D7F // Phonetic Extensions - * U+1D80 - U+1DBF // Phonetic Extensions Supplement - * U+1DC0 - U+1DFF // Combining Diacritical Marks Supplement - * U+1E00 - U+1EFF // Latin Extended Additional - * U+1F00 - U+1FFF // Greek Extended - * U+2000 - U+206F // General Punctuation - * U+2070 - U+209F // Superscripts and Subscripts - * U+20A0 - U+20CF // Currency Symbols - * U+2150 - U+218F // Number Forms - * U+2460 - U+24FF // Enclosed Alphanumerics - * U+2C60 - U+2C7F // Latin Extended-C - * U+2DE0 - U+2DFF // Cyrillic Extended-A - * U+2E00 - U+2E7F // Supplemental Punctuation - * U+A640 - U+A69F // Cyrillic Extended-B - * U+A720 - U+A7FF // Latin Extended-D - * U+FB00 - U+FB06 // Alphab. Present. Forms (Latin Ligatures) - * U+1D400 - U+1D7FF // Mathematical Alphanumeric Symbols - * U+1F100 - U+1F1FF // Enclosed Alphanumeric Supplement - * } - * - * FT_AUTOHINTER_SCRIPT_CJK :: - * Apply the CJK auto-hinter, covering Chinese, Japanese, Korean, old - * Vietnamese, and some other scripts. - * - * By default, characters from the following Unicode ranges are - * assigned to this submodule. - * - * { - * U+1100 - U+11FF // Hangul Jamo - * U+2E80 - U+2EFF // CJK Radicals Supplement - * U+2F00 - U+2FDF // Kangxi Radicals - * U+2FF0 - U+2FFF // Ideographic Description Characters - * U+3000 - U+303F // CJK Symbols and Punctuation - * U+3040 - U+309F // Hiragana - * U+30A0 - U+30FF // Katakana - * U+3100 - U+312F // Bopomofo - * U+3130 - U+318F // Hangul Compatibility Jamo - * U+3190 - U+319F // Kanbun - * U+31A0 - U+31BF // Bopomofo Extended - * U+31C0 - U+31EF // CJK Strokes - * U+31F0 - U+31FF // Katakana Phonetic Extensions - * U+3200 - U+32FF // Enclosed CJK Letters and Months - * U+3300 - U+33FF // CJK Compatibility - * U+3400 - U+4DBF // CJK Unified Ideographs Extension A - * U+4DC0 - U+4DFF // Yijing Hexagram Symbols - * U+4E00 - U+9FFF // CJK Unified Ideographs - * U+A960 - U+A97F // Hangul Jamo Extended-A - * U+AC00 - U+D7AF // Hangul Syllables - * U+D7B0 - U+D7FF // Hangul Jamo Extended-B - * U+F900 - U+FAFF // CJK Compatibility Ideographs - * U+FE10 - U+FE1F // Vertical forms - * U+FE30 - U+FE4F // CJK Compatibility Forms - * U+FF00 - U+FFEF // Halfwidth and Fullwidth Forms - * U+1B000 - U+1B0FF // Kana Supplement - * U+1D300 - U+1D35F // Tai Xuan Hing Symbols - * U+1F200 - U+1F2FF // Enclosed Ideographic Supplement - * U+20000 - U+2A6DF // CJK Unified Ideographs Extension B - * U+2A700 - U+2B73F // CJK Unified Ideographs Extension C - * U+2B740 - U+2B81F // CJK Unified Ideographs Extension D - * U+2F800 - U+2FA1F // CJK Compatibility Ideographs Supplement - * } - * - * FT_AUTOHINTER_SCRIPT_INDIC :: - * Apply the indic auto-hinter, covering all major scripts from the - * Indian sub-continent and some other related scripts like Thai, Lao, - * or Tibetan. - * - * By default, characters from the following Unicode ranges are - * assigned to this submodule. - * - * { - * U+0900 - U+0DFF // Indic Range - * U+0F00 - U+0FFF // Tibetan - * U+1900 - U+194F // Limbu - * U+1B80 - U+1BBF // Sundanese - * U+1C80 - U+1CDF // Meetei Mayak - * U+A800 - U+A82F // Syloti Nagri - * U+11800 - U+118DF // Sharada - * } - * - * Note that currently Indic support is rudimentary only, missing blue - * zone support. - * - */ -#define FT_AUTOHINTER_SCRIPT_NONE 0 -#define FT_AUTOHINTER_SCRIPT_LATIN 1 -#define FT_AUTOHINTER_SCRIPT_CJK 2 -#define FT_AUTOHINTER_SCRIPT_INDIC 3 - - - /************************************************************************** - * - * @struct: - * FT_Prop_GlyphToScriptMap - * - * @description: - * *Experimental* *only* - * - * The data exchange structure for the @glyph-to-script-map property. - * - */ - typedef struct FT_Prop_GlyphToScriptMap_ - { - FT_Face face; - FT_UShort* map; - - } FT_Prop_GlyphToScriptMap; - - - /************************************************************************** - * - * @property: - * fallback-script - * - * @description: - * *Experimental* *only* - * - * If no auto-hinter script module can be assigned to a glyph, a - * fallback script gets assigned to it (see also the - * @glyph-to-script-map property). By default, this is - * @FT_AUTOHINTER_SCRIPT_CJK. Using the `fallback-script' property, - * this fallback value can be changed. - * - * { - * FT_Library library; - * FT_UInt fallback_script = FT_AUTOHINTER_SCRIPT_NONE; - * - * - * FT_Init_FreeType( &library ); - * - * FT_Property_Set( library, "autofitter", - * "fallback-script", &fallback_script ); - * } - * - * @note: - * This property can be used with @FT_Property_Get also. - * - * It's important to use the right timing for changing this value: The - * creation of the glyph-to-script map that eventually uses the - * fallback script value gets triggered either by setting or reading a - * face-specific property like @glyph-to-script-map, or by auto-hinting - * any glyph from that face. In particular, if you have already created - * an @FT_Face structure but not loaded any glyph (using the - * auto-hinter), a change of the fallback script will affect this face. - * - */ - - - /************************************************************************** - * - * @property: - * default-script - * - * @description: - * *Experimental* *only* - * - * If FreeType gets compiled with FT_CONFIG_OPTION_USE_HARFBUZZ to make - * the HarfBuzz library access OpenType features for getting better - * glyph coverages, this property sets the (auto-fitter) script to be - * used for the default (OpenType) script data of a font's GSUB table. - * Features for the default script are intended for all scripts not - * explicitly handled in GSUB; an example is a `dlig' feature, - * containing the combination of the characters `T', `E', and `L' to - * form a `TEL' ligature. - * - * By default, this is @FT_AUTOHINTER_SCRIPT_LATIN. Using the - * `default-script' property, this default value can be changed. - * - * { - * FT_Library library; - * FT_UInt default_script = FT_AUTOHINTER_SCRIPT_NONE; - * - * - * FT_Init_FreeType( &library ); - * - * FT_Property_Set( library, "autofitter", - * "default-script", &default_script ); - * } - * - * @note: - * This property can be used with @FT_Property_Get also. - * - * It's important to use the right timing for changing this value: The - * creation of the glyph-to-script map that eventually uses the - * default script value gets triggered either by setting or reading a - * face-specific property like @glyph-to-script-map, or by auto-hinting - * any glyph from that face. In particular, if you have already created - * an @FT_Face structure but not loaded any glyph (using the - * auto-hinter), a change of the default script will affect this face. - * - */ - - - /************************************************************************** - * - * @property: - * increase-x-height - * - * @description: - * For ppem values in the range 6~<= ppem <= `increase-x-height', round - * up the font's x~height much more often than normally. If the value - * is set to~0, which is the default, this feature is switched off. Use - * this property to improve the legibility of small font sizes if - * necessary. - * - * { - * FT_Library library; - * FT_Face face; - * FT_Prop_IncreaseXHeight prop; - * - * - * FT_Init_FreeType( &library ); - * FT_New_Face( library, "foo.ttf", 0, &face ); - * FT_Set_Char_Size( face, 10 * 64, 0, 72, 0 ); - * - * prop.face = face; - * prop.limit = 14; - * - * FT_Property_Set( library, "autofitter", - * "increase-x-height", &prop ); - * } - * - * @note: - * This property can be used with @FT_Property_Get also. - * - * Set this value right after calling @FT_Set_Char_Size, but before - * loading any glyph (using the auto-hinter). - * - */ - - - /************************************************************************** - * - * @struct: - * FT_Prop_IncreaseXHeight - * - * @description: - * The data exchange structure for the @increase-x-height property. - * - */ - typedef struct FT_Prop_IncreaseXHeight_ - { - FT_Face face; - FT_UInt limit; - - } FT_Prop_IncreaseXHeight; - - - /************************************************************************** - * - * @property: - * warping - * - * @description: - * *Experimental* *only* - * - * If FreeType gets compiled with option AF_CONFIG_OPTION_USE_WARPER to - * activate the warp hinting code in the auto-hinter, this property - * switches warping on and off. - * - * Warping only works in `light' auto-hinting mode. The idea of the - * code is to slightly scale and shift a glyph along the non-hinted - * dimension (which is usually the horizontal axis) so that as much of - * its segments are aligned (more or less) to the grid. To find out a - * glyph's optimal scaling and shifting value, various parameter - * combinations are tried and scored. - * - * By default, warping is off. The example below shows how to switch on - * warping (omitting the error handling). - * - * { - * FT_Library library; - * FT_Bool warping = 1; - * - * - * FT_Init_FreeType( &library ); - * - * FT_Property_Set( library, "autofitter", - * "warping", &warping ); - * } - * - * @note: - * This property can be used with @FT_Property_Get also. - * - * The warping code can also change advance widths. Have a look at the - * `lsb_delta' and `rsb_delta' fields in the @FT_GlyphSlotRec structure - * for details on improving inter-glyph distances while rendering. - * - * Since warping is a global property of the auto-hinter it is best to - * change its value before rendering any face. Otherwise, you should - * reload all faces that get auto-hinted in `light' hinting mode. - * - */ - - - /* */ - - -FT_END_HEADER - -#endif /* __FTAUTOH_H__ */ - - -/* END */ diff --git a/src/3rdparty/freetype/include/freetype/ftbbox.h b/src/3rdparty/freetype/include/freetype/ftbbox.h index 22da70c0..fda1ad94 100644 --- a/src/3rdparty/freetype/include/freetype/ftbbox.h +++ b/src/3rdparty/freetype/include/freetype/ftbbox.h @@ -4,7 +4,7 @@ * * FreeType exact bbox computation (specification). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -31,8 +31,7 @@ #define FTBBOX_H_ -#include -#include FT_FREETYPE_H +#include #ifdef FREETYPE_H #error "freetype.h of FreeType 1 has been loaded!" diff --git a/src/3rdparty/freetype/include/freetype/ftbdf.h b/src/3rdparty/freetype/include/freetype/ftbdf.h index 1c46da59..2e1daeea 100644 --- a/src/3rdparty/freetype/include/freetype/ftbdf.h +++ b/src/3rdparty/freetype/include/freetype/ftbdf.h @@ -4,7 +4,7 @@ * * FreeType API for accessing BDF-specific strings (specification). * - * Copyright (C) 2002-2019 by + * Copyright (C) 2002-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -19,8 +19,7 @@ #ifndef FTBDF_H_ #define FTBDF_H_ -#include -#include FT_FREETYPE_H +#include #ifdef FREETYPE_H #error "freetype.h of FreeType 1 has been loaded!" diff --git a/src/3rdparty/freetype/include/freetype/ftbitmap.h b/src/3rdparty/freetype/include/freetype/ftbitmap.h index a6acdb96..282c22e1 100644 --- a/src/3rdparty/freetype/include/freetype/ftbitmap.h +++ b/src/3rdparty/freetype/include/freetype/ftbitmap.h @@ -4,7 +4,7 @@ * * FreeType utility functions for bitmaps (specification). * - * Copyright (C) 2004-2019 by + * Copyright (C) 2004-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -20,9 +20,8 @@ #define FTBITMAP_H_ -#include -#include FT_FREETYPE_H -#include FT_COLOR_H +#include +#include #ifdef FREETYPE_H #error "freetype.h of FreeType 1 has been loaded!" diff --git a/src/3rdparty/freetype/include/freetype/ftbzip2.h b/src/3rdparty/freetype/include/freetype/ftbzip2.h index ae88cfdb..eb6a5a55 100644 --- a/src/3rdparty/freetype/include/freetype/ftbzip2.h +++ b/src/3rdparty/freetype/include/freetype/ftbzip2.h @@ -4,7 +4,7 @@ * * Bzip2-compressed stream support. * - * Copyright (C) 2010-2019 by + * Copyright (C) 2010-2020 by * Joel Klinghed. * * This file is part of the FreeType project, and may only be used, @@ -19,8 +19,7 @@ #ifndef FTBZIP2_H_ #define FTBZIP2_H_ -#include -#include FT_FREETYPE_H +#include #ifdef FREETYPE_H #error "freetype.h of FreeType 1 has been loaded!" @@ -43,6 +42,16 @@ FT_BEGIN_HEADER * Using bzip2-compressed font files. * * @description: + * In certain builds of the library, bzip2 compression recognition is + * automatically handled when calling @FT_New_Face or @FT_Open_Face. + * This means that if no font driver is capable of handling the raw + * compressed file, the library will try to open a bzip2 compressed + * stream from it and re-open the face with it. + * + * The stream implementation is very basic and resets the decompression + * process each time seeking backwards is needed within the stream, + * which significantly undermines the performance. + * * This section contains the declaration of Bzip2-specific functions. * */ @@ -75,15 +84,6 @@ FT_BEGIN_HEADER * **not** call `FT_Stream_Close` on the source stream. None of the * stream objects will be released to the heap. * - * The stream implementation is very basic and resets the decompression - * process each time seeking backwards is needed within the stream. - * - * In certain builds of the library, bzip2 compression recognition is - * automatically handled when calling @FT_New_Face or @FT_Open_Face. - * This means that if no font driver is capable of handling the raw - * compressed file, the library will try to open a bzip2 compressed - * stream from it and re-open the face with it. - * * This function may return `FT_Err_Unimplemented_Feature` if your build * of FreeType was not compiled with bzip2 support. */ diff --git a/src/3rdparty/freetype/include/freetype/ftcache.h b/src/3rdparty/freetype/include/freetype/ftcache.h index 0d589d0b..60472752 100644 --- a/src/3rdparty/freetype/include/freetype/ftcache.h +++ b/src/3rdparty/freetype/include/freetype/ftcache.h @@ -4,7 +4,7 @@ * * FreeType Cache subsystem (specification). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -20,8 +20,7 @@ #define FTCACHE_H_ -#include -#include FT_GLYPH_H +#include FT_BEGIN_HEADER diff --git a/src/3rdparty/freetype/include/freetype/ftcffdrv.h b/src/3rdparty/freetype/include/freetype/ftcffdrv.h deleted file mode 100644 index 6c8e416c..00000000 --- a/src/3rdparty/freetype/include/freetype/ftcffdrv.h +++ /dev/null @@ -1,262 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftcffdrv.h */ -/* */ -/* FreeType API for controlling the CFF driver (specification only). */ -/* */ -/* Copyright 2013-2015 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __FTCFFDRV_H__ -#define __FTCFFDRV_H__ - -#include -#include FT_FREETYPE_H - -#ifdef FREETYPE_H -#error "freetype.h of FreeType 1 has been loaded!" -#error "Please fix the directory search order for header files" -#error "so that freetype.h of FreeType 2 is found first." -#endif - - -FT_BEGIN_HEADER - - - /************************************************************************** - * - * @section: - * cff_driver - * - * @title: - * The CFF driver - * - * @abstract: - * Controlling the CFF driver module. - * - * @description: - * While FreeType's CFF driver doesn't expose API functions by itself, - * it is possible to control its behaviour with @FT_Property_Set and - * @FT_Property_Get. The list below gives the available properties - * together with the necessary macros and structures. - * - * The CFF driver's module name is `cff'. - * - * *Hinting* *and* *antialiasing* *principles* *of* *the* *new* *engine* - * - * The rasterizer is positioning horizontal features (e.g., ascender - * height & x-height, or crossbars) on the pixel grid and minimizing the - * amount of antialiasing applied to them, while placing vertical - * features (vertical stems) on the pixel grid without hinting, thus - * representing the stem position and weight accurately. Sometimes the - * vertical stems may be only partially black. In this context, - * `antialiasing' means that stems are not positioned exactly on pixel - * borders, causing a fuzzy appearance. - * - * There are two principles behind this approach. - * - * 1) No hinting in the horizontal direction: Unlike `superhinted' - * TrueType, which changes glyph widths to accommodate regular - * inter-glyph spacing, Adobe's approach is `faithful to the design' in - * representing both the glyph width and the inter-glyph spacing - * designed for the font. This makes the screen display as close as it - * can be to the result one would get with infinite resolution, while - * preserving what is considered the key characteristics of each glyph. - * Note that the distances between unhinted and grid-fitted positions at - * small sizes are comparable to kerning values and thus would be - * noticeable (and distracting) while reading if hinting were applied. - * - * One of the reasons to not hint horizontally is antialiasing for LCD - * screens: The pixel geometry of modern displays supplies three - * vertical sub-pixels as the eye moves horizontally across each visible - * pixel. On devices where we can be certain this characteristic is - * present a rasterizer can take advantage of the sub-pixels to add - * increments of weight. In Western writing systems this turns out to - * be the more critical direction anyway; the weights and spacing of - * vertical stems (see above) are central to Armenian, Cyrillic, Greek, - * and Latin type designs. Even when the rasterizer uses greyscale - * antialiasing instead of color (a necessary compromise when one - * doesn't know the screen characteristics), the unhinted vertical - * features preserve the design's weight and spacing much better than - * aliased type would. - * - * 2) Aligment in the vertical direction: Weights and spacing along the - * y~axis are less critical; what is much more important is the visual - * alignment of related features (like cap-height and x-height). The - * sense of alignment for these is enhanced by the sharpness of grid-fit - * edges, while the cruder vertical resolution (full pixels instead of - * 1/3 pixels) is less of a problem. - * - * On the technical side, horizontal alignment zones for ascender, - * x-height, and other important height values (traditionally called - * `blue zones') as defined in the font are positioned independently, - * each being rounded to the nearest pixel edge, taking care of - * overshoot suppression at small sizes, stem darkening, and scaling. - * - * Hstems (this is, hint values defined in the font to help align - * horizontal features) that fall within a blue zone are said to be - * `captured' and are aligned to that zone. Uncaptured stems are moved - * in one of four ways, top edge up or down, bottom edge up or down. - * Unless there are conflicting hstems, the smallest movement is taken - * to minimize distortion. - * - * @order: - * hinting-engine - * no-stem-darkening - * darkening-parameters - * - */ - - - /************************************************************************** - * - * @property: - * hinting-engine - * - * @description: - * Thanks to Adobe, which contributed a new hinting (and parsing) - * engine, an application can select between `freetype' and `adobe' if - * compiled with CFF_CONFIG_OPTION_OLD_ENGINE. If this configuration - * macro isn't defined, `hinting-engine' does nothing. - * - * The default engine is `freetype' if CFF_CONFIG_OPTION_OLD_ENGINE is - * defined, and `adobe' otherwise. - * - * The following example code demonstrates how to select Adobe's hinting - * engine (omitting the error handling). - * - * { - * FT_Library library; - * FT_UInt hinting_engine = FT_CFF_HINTING_ADOBE; - * - * - * FT_Init_FreeType( &library ); - * - * FT_Property_Set( library, "cff", - * "hinting-engine", &hinting_engine ); - * } - * - * @note: - * This property can be used with @FT_Property_Get also. - * - */ - - - /************************************************************************** - * - * @enum: - * FT_CFF_HINTING_XXX - * - * @description: - * A list of constants used for the @hinting-engine property to select - * the hinting engine for CFF fonts. - * - * @values: - * FT_CFF_HINTING_FREETYPE :: - * Use the old FreeType hinting engine. - * - * FT_CFF_HINTING_ADOBE :: - * Use the hinting engine contributed by Adobe. - * - */ -#define FT_CFF_HINTING_FREETYPE 0 -#define FT_CFF_HINTING_ADOBE 1 - - - /************************************************************************** - * - * @property: - * no-stem-darkening - * - * @description: - * By default, the Adobe CFF engine darkens stems at smaller sizes, - * regardless of hinting, to enhance contrast. This feature requires - * a rendering system with proper gamma correction. Setting this - * property, stem darkening gets switched off. - * - * Note that stem darkening is never applied if @FT_LOAD_NO_SCALE is set. - * - * { - * FT_Library library; - * FT_Bool no_stem_darkening = TRUE; - * - * - * FT_Init_FreeType( &library ); - * - * FT_Property_Set( library, "cff", - * "no-stem-darkening", &no_stem_darkening ); - * } - * - * @note: - * This property can be used with @FT_Property_Get also. - * - */ - - - /************************************************************************** - * - * @property: - * darkening-parameters - * - * @description: - * By default, the Adobe CFF engine darkens stems as follows (if the - * `no-stem-darkening' property isn't set): - * - * { - * stem width <= 0.5px: darkening amount = 0.4px - * stem width = 1px: darkening amount = 0.275px - * stem width = 1.667px: darkening amount = 0.275px - * stem width >= 2.333px: darkening amount = 0px - * } - * - * and piecewise linear in-between. At configuration time, these four - * control points can be set with the macro - * `CFF_CONFIG_OPTION_DARKENING_PARAMETERS'. At runtime, the control - * points can be changed using the `darkening-parameters' property, as - * the following example demonstrates. - * - * { - * FT_Library library; - * FT_Int darken_params[8] = { 500, 300, // x1, y1 - * 1000, 200, // x2, y2 - * 1500, 100, // x3, y3 - * 2000, 0 }; // x4, y4 - * - * - * FT_Init_FreeType( &library ); - * - * FT_Property_Set( library, "cff", - * "darkening-parameters", darken_params ); - * } - * - * The x~values give the stem width, and the y~values the darkening - * amount. The unit is 1000th of pixels. All coordinate values must be - * positive; the x~values must be monotonically increasing; the - * y~values must be monotonically decreasing and smaller than or - * equal to 500 (corresponding to half a pixel); the slope of each - * linear piece must be shallower than -1 (e.g., -.4). - * - * @note: - * This property can be used with @FT_Property_Get also. - * - */ - - /* */ - - -FT_END_HEADER - - -#endif /* __FTCFFDRV_H__ */ - - -/* END */ diff --git a/src/3rdparty/freetype/include/freetype/ftcid.h b/src/3rdparty/freetype/include/freetype/ftcid.h index 8eafc1c7..a29fb333 100644 --- a/src/3rdparty/freetype/include/freetype/ftcid.h +++ b/src/3rdparty/freetype/include/freetype/ftcid.h @@ -4,7 +4,7 @@ * * FreeType API for accessing CID font information (specification). * - * Copyright (C) 2007-2019 by + * Copyright (C) 2007-2020 by * Dereg Clegg and Michael Toftdal. * * This file is part of the FreeType project, and may only be used, @@ -19,8 +19,7 @@ #ifndef FTCID_H_ #define FTCID_H_ -#include -#include FT_FREETYPE_H +#include #ifdef FREETYPE_H #error "freetype.h of FreeType 1 has been loaded!" diff --git a/src/3rdparty/freetype/include/freetype/ftcolor.h b/src/3rdparty/freetype/include/freetype/ftcolor.h index cf180219..ecc6485e 100644 --- a/src/3rdparty/freetype/include/freetype/ftcolor.h +++ b/src/3rdparty/freetype/include/freetype/ftcolor.h @@ -4,7 +4,7 @@ * * FreeType's glyph color management (specification). * - * Copyright (C) 2018-2019 by + * Copyright (C) 2018-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -19,8 +19,7 @@ #ifndef FTCOLOR_H_ #define FTCOLOR_H_ -#include -#include FT_FREETYPE_H +#include #ifdef FREETYPE_H #error "freetype.h of FreeType 1 has been loaded!" @@ -125,9 +124,9 @@ FT_BEGIN_HEADER * The number of palettes. * * palette_name_ids :: - * A read-only array of palette name IDs with `num_palettes` elements, - * corresponding to entries like 'dark' or 'light' in the font's 'name' - * table. + * An optional read-only array of palette name IDs with `num_palettes` + * elements, corresponding to entries like 'dark' or 'light' in the + * font's 'name' table. * * An empty name ID in the 'CPAL' table gets represented as value * 0xFFFF. @@ -135,8 +134,8 @@ FT_BEGIN_HEADER * `NULL` if the font's 'CPAL' table doesn't contain appropriate data. * * palette_flags :: - * A read-only array of palette flags with `num_palettes` elements. - * Possible values are an ORed combination of + * An optional read-only array of palette flags with `num_palettes` + * elements. Possible values are an ORed combination of * @FT_PALETTE_FOR_LIGHT_BACKGROUND and * @FT_PALETTE_FOR_DARK_BACKGROUND. * @@ -147,7 +146,7 @@ FT_BEGIN_HEADER * same size. * * palette_entry_name_ids :: - * A read-only array of palette entry name IDs with + * An optional read-only array of palette entry name IDs with * `num_palette_entries`. In each palette, entries with the same index * have the same function. For example, index~0 might correspond to * string 'outline' in the font's 'name' table to indicate that this @@ -163,6 +162,9 @@ FT_BEGIN_HEADER * Use function @FT_Get_Sfnt_Name to map name IDs and entry name IDs to * name strings. * + * Use function @FT_Palette_Select to get the colors associated with a + * palette entry. + * * @since: * 2.10 */ diff --git a/src/3rdparty/freetype/include/freetype/ftdriver.h b/src/3rdparty/freetype/include/freetype/ftdriver.h index 497bde9f..804ec34a 100644 --- a/src/3rdparty/freetype/include/freetype/ftdriver.h +++ b/src/3rdparty/freetype/include/freetype/ftdriver.h @@ -4,7 +4,7 @@ * * FreeType API for controlling driver modules (specification only). * - * Copyright (C) 2017-2019 by + * Copyright (C) 2017-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -19,9 +19,8 @@ #ifndef FTDRIVER_H_ #define FTDRIVER_H_ -#include -#include FT_FREETYPE_H -#include FT_PARAMETER_TAGS_H +#include +#include #ifdef FREETYPE_H #error "freetype.h of FreeType 1 has been loaded!" @@ -427,10 +426,6 @@ FT_BEGIN_HEADER * counteracts the 'thinning out' of glyphs, making text remain readable * at smaller sizes. * - * By default, the Adobe engines for CFF, Type~1, and CID fonts darken - * stems at smaller sizes, regardless of hinting, to enhance contrast. - * Setting this property, stem darkening gets switched off. - * * For the auto-hinter, stem-darkening is experimental currently and thus * switched off by default (this is, `no-stem-darkening` is set to TRUE * by default). Total consistency with the CFF driver is not achieved diff --git a/src/3rdparty/freetype/include/freetype/fterrdef.h b/src/3rdparty/freetype/include/freetype/fterrdef.h index 9bc7dc65..895d2d4d 100644 --- a/src/3rdparty/freetype/include/freetype/fterrdef.h +++ b/src/3rdparty/freetype/include/freetype/fterrdef.h @@ -4,7 +4,7 @@ * * FreeType error codes (specification). * - * Copyright (C) 2002-2019 by + * Copyright (C) 2002-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, diff --git a/src/3rdparty/freetype/include/freetype/fterrors.h b/src/3rdparty/freetype/include/freetype/fterrors.h index 2b47eb20..60a637c7 100644 --- a/src/3rdparty/freetype/include/freetype/fterrors.h +++ b/src/3rdparty/freetype/include/freetype/fterrors.h @@ -4,7 +4,7 @@ * * FreeType error code handling (specification). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -89,7 +89,7 @@ * const char* err_msg; * } ft_errors[] = * - * #include FT_ERRORS_H + * #include * ``` * * An alternative to using an array is a switch statement. @@ -124,7 +124,7 @@ /* include module base error codes */ -#include FT_MODULE_ERRORS_H +#include /*******************************************************************/ @@ -197,7 +197,7 @@ /* now include the error codes */ -#include FT_ERROR_DEFINITIONS_H +#include #ifdef FT_ERROR_END_LIST @@ -232,11 +232,16 @@ #undef FT_ERR_PREFIX #endif - /* FT_INCLUDE_ERR_PROTOS: Control if function prototypes should be */ - /* included with `#include FT_ERRORS_H'. This is */ - /* only true where `FT_ERRORDEF` is undefined. */ - /* FT_ERR_PROTOS_DEFINED: Actual multiple-inclusion protection of */ - /* `fterrors.h`. */ + /* FT_INCLUDE_ERR_PROTOS: Control whether function prototypes should be */ + /* included with */ + /* */ + /* #include */ + /* */ + /* This is only true where `FT_ERRORDEF` is */ + /* undefined. */ + /* */ + /* FT_ERR_PROTOS_DEFINED: Actual multiple-inclusion protection of */ + /* `fterrors.h`. */ #ifdef FT_INCLUDE_ERR_PROTOS #undef FT_INCLUDE_ERR_PROTOS diff --git a/src/3rdparty/freetype/include/freetype/ftfntfmt.h b/src/3rdparty/freetype/include/freetype/ftfntfmt.h index aae0b132..f803349c 100644 --- a/src/3rdparty/freetype/include/freetype/ftfntfmt.h +++ b/src/3rdparty/freetype/include/freetype/ftfntfmt.h @@ -4,7 +4,7 @@ * * Support functions for font formats. * - * Copyright (C) 2002-2019 by + * Copyright (C) 2002-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -19,8 +19,7 @@ #ifndef FTFNTFMT_H_ #define FTFNTFMT_H_ -#include -#include FT_FREETYPE_H +#include #ifdef FREETYPE_H #error "freetype.h of FreeType 1 has been loaded!" diff --git a/src/3rdparty/freetype/include/freetype/ftgasp.h b/src/3rdparty/freetype/include/freetype/ftgasp.h index 24673d8c..6b76882c 100644 --- a/src/3rdparty/freetype/include/freetype/ftgasp.h +++ b/src/3rdparty/freetype/include/freetype/ftgasp.h @@ -4,7 +4,7 @@ * * Access of TrueType's 'gasp' table (specification). * - * Copyright (C) 2007-2019 by + * Copyright (C) 2007-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -19,8 +19,7 @@ #ifndef FTGASP_H_ #define FTGASP_H_ -#include -#include FT_FREETYPE_H +#include #ifdef FREETYPE_H #error "freetype.h of FreeType 1 has been loaded!" diff --git a/src/3rdparty/freetype/include/freetype/ftglyph.h b/src/3rdparty/freetype/include/freetype/ftglyph.h index fedab849..704619e3 100644 --- a/src/3rdparty/freetype/include/freetype/ftglyph.h +++ b/src/3rdparty/freetype/include/freetype/ftglyph.h @@ -4,7 +4,7 @@ * * FreeType convenience functions to handle glyphs (specification). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -33,8 +33,7 @@ #define FTGLYPH_H_ -#include -#include FT_FREETYPE_H +#include #ifdef FREETYPE_H #error "freetype.h of FreeType 1 has been loaded!" diff --git a/src/3rdparty/freetype/include/freetype/ftgxval.h b/src/3rdparty/freetype/include/freetype/ftgxval.h index b14f637c..354460a9 100644 --- a/src/3rdparty/freetype/include/freetype/ftgxval.h +++ b/src/3rdparty/freetype/include/freetype/ftgxval.h @@ -4,7 +4,7 @@ * * FreeType API for validating TrueTypeGX/AAT tables (specification). * - * Copyright (C) 2004-2019 by + * Copyright (C) 2004-2020 by * Masatake YAMATO, Redhat K.K, * David Turner, Robert Wilhelm, and Werner Lemberg. * @@ -28,8 +28,7 @@ #ifndef FTGXVAL_H_ #define FTGXVAL_H_ -#include -#include FT_FREETYPE_H +#include #ifdef FREETYPE_H #error "freetype.h of FreeType 1 has been loaded!" diff --git a/src/3rdparty/freetype/include/freetype/ftgzip.h b/src/3rdparty/freetype/include/freetype/ftgzip.h index 418c6122..ec5939a1 100644 --- a/src/3rdparty/freetype/include/freetype/ftgzip.h +++ b/src/3rdparty/freetype/include/freetype/ftgzip.h @@ -4,7 +4,7 @@ * * Gzip-compressed stream support. * - * Copyright (C) 2002-2019 by + * Copyright (C) 2002-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -19,8 +19,7 @@ #ifndef FTGZIP_H_ #define FTGZIP_H_ -#include -#include FT_FREETYPE_H +#include #ifdef FREETYPE_H #error "freetype.h of FreeType 1 has been loaded!" @@ -43,6 +42,16 @@ FT_BEGIN_HEADER * Using gzip-compressed font files. * * @description: + * In certain builds of the library, gzip compression recognition is + * automatically handled when calling @FT_New_Face or @FT_Open_Face. + * This means that if no font driver is capable of handling the raw + * compressed file, the library will try to open a gzipped stream from it + * and re-open the face with it. + * + * The stream implementation is very basic and resets the decompression + * process each time seeking backwards is needed within the stream, + * which significantly undermines the performance. + * * This section contains the declaration of Gzip-specific functions. * */ @@ -75,15 +84,6 @@ FT_BEGIN_HEADER * **not** call `FT_Stream_Close` on the source stream. None of the * stream objects will be released to the heap. * - * The stream implementation is very basic and resets the decompression - * process each time seeking backwards is needed within the stream. - * - * In certain builds of the library, gzip compression recognition is - * automatically handled when calling @FT_New_Face or @FT_Open_Face. - * This means that if no font driver is capable of handling the raw - * compressed file, the library will try to open a gzipped stream from it - * and re-open the face with it. - * * This function may return `FT_Err_Unimplemented_Feature` if your build * of FreeType was not compiled with zlib support. */ diff --git a/src/3rdparty/freetype/include/freetype/ftimage.h b/src/3rdparty/freetype/include/freetype/ftimage.h index face34fe..74911620 100644 --- a/src/3rdparty/freetype/include/freetype/ftimage.h +++ b/src/3rdparty/freetype/include/freetype/ftimage.h @@ -5,7 +5,7 @@ * FreeType glyph image formats and default raster interface * (specification). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -30,7 +30,6 @@ /* STANDALONE_ is from ftgrays.c */ #ifndef STANDALONE_ -#include #endif @@ -401,6 +400,13 @@ FT_BEGIN_HEADER * if @FT_OUTLINE_IGNORE_DROPOUTS is set. See below for more * information. * + * FT_OUTLINE_OVERLAP :: + * This flag indicates that this outline contains overlapping contrours + * and the anti-aliased renderer should perform oversampling to + * mitigate possible artifacts. This flag should _not_ be set for + * well designed glyphs without overlaps because it quadruples the + * rendering time. + * * FT_OUTLINE_HIGH_PRECISION :: * This flag indicates that the scan-line converter should try to * convert this outline to bitmaps with the highest possible quality. @@ -432,6 +438,7 @@ FT_BEGIN_HEADER #define FT_OUTLINE_IGNORE_DROPOUTS 0x8 #define FT_OUTLINE_SMART_DROPOUTS 0x10 #define FT_OUTLINE_INCLUDE_STUBS 0x20 +#define FT_OUTLINE_OVERLAP 0x40 #define FT_OUTLINE_HIGH_PRECISION 0x100 #define FT_OUTLINE_SINGLE_PASS 0x200 @@ -1004,20 +1011,26 @@ FT_BEGIN_HEADER * User-supplied data that is passed to each drawing callback. * * clip_box :: - * An optional clipping box. It is only used in direct rendering mode. - * Note that coordinates here should be expressed in _integer_ pixels - * (and not in 26.6 fixed-point units). + * An optional span clipping box expressed in _integer_ pixels + * (not in 26.6 fixed-point units). * * @note: - * An anti-aliased glyph bitmap is drawn if the @FT_RASTER_FLAG_AA bit - * flag is set in the `flags` field, otherwise a monochrome bitmap is - * generated. + * The @FT_RASTER_FLAG_AA bit flag must be set in the `flags` to + * generate an anti-aliased glyph bitmap, otherwise a monochrome bitmap + * is generated. The `target` should have appropriate pixel mode and its + * dimensions define the clipping region. * - * If the @FT_RASTER_FLAG_DIRECT bit flag is set in `flags`, the raster - * will call the `gray_spans` callback to draw gray pixel spans. This - * allows direct composition over a pre-existing bitmap through - * user-provided callbacks to perform the span drawing and composition. - * Not supported by the monochrome rasterizer. + * If both @FT_RASTER_FLAG_AA and @FT_RASTER_FLAG_DIRECT bit flags + * are set in `flags`, the raster calls an @FT_SpanFunc callback + * `gray_spans` with `user` data as an argument ignoring `target`. This + * allows direct composition over a pre-existing user surface to perform + * the span drawing and composition. To optionally clip the spans, set + * the @FT_RASTER_FLAG_CLIP flag and `clip_box`. The monochrome raster + * does not support the direct mode. + * + * The gray-level rasterizer always uses 256 gray levels. If you want + * fewer gray levels, you have to use @FT_RASTER_FLAG_DIRECT and reduce + * the levels in the callback function. */ typedef struct FT_Raster_Params_ { diff --git a/src/3rdparty/freetype/include/freetype/ftincrem.h b/src/3rdparty/freetype/include/freetype/ftincrem.h index a4db02b5..f67655ed 100644 --- a/src/3rdparty/freetype/include/freetype/ftincrem.h +++ b/src/3rdparty/freetype/include/freetype/ftincrem.h @@ -4,7 +4,7 @@ * * FreeType incremental loading (specification). * - * Copyright (C) 2002-2019 by + * Copyright (C) 2002-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -19,9 +19,8 @@ #ifndef FTINCREM_H_ #define FTINCREM_H_ -#include -#include FT_FREETYPE_H -#include FT_PARAMETER_TAGS_H +#include +#include #ifdef FREETYPE_H #error "freetype.h of FreeType 1 has been loaded!" diff --git a/src/3rdparty/freetype/include/freetype/ftlcdfil.h b/src/3rdparty/freetype/include/freetype/ftlcdfil.h index 3a19d043..c6995f2f 100644 --- a/src/3rdparty/freetype/include/freetype/ftlcdfil.h +++ b/src/3rdparty/freetype/include/freetype/ftlcdfil.h @@ -5,7 +5,7 @@ * FreeType API for color filtering of subpixel bitmap glyphs * (specification). * - * Copyright (C) 2006-2019 by + * Copyright (C) 2006-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -20,9 +20,8 @@ #ifndef FTLCDFIL_H_ #define FTLCDFIL_H_ -#include -#include FT_FREETYPE_H -#include FT_PARAMETER_TAGS_H +#include +#include #ifdef FREETYPE_H #error "freetype.h of FreeType 1 has been loaded!" @@ -47,7 +46,7 @@ FT_BEGIN_HEADER * @description: * FreeType provides two alternative subpixel rendering technologies. * Should you define `FT_CONFIG_OPTION_SUBPIXEL_RENDERING` in your - * `ftoption.h` file, this enables patented ClearType-style rendering. + * `ftoption.h` file, this enables ClearType-style rendering. * Otherwise, Harmony LCD rendering is enabled. These technologies are * controlled differently and API described below, although always * available, performs its function when appropriate method is enabled @@ -177,7 +176,7 @@ FT_BEGIN_HEADER * FT_Library_SetLcdFilter * * @description: - * This function is used to apply color filtering to LCD decimated + * This function is used to change filter applied to LCD decimated * bitmaps, like the ones used when calling @FT_Render_Glyph with * @FT_RENDER_MODE_LCD or @FT_RENDER_MODE_LCD_V. * @@ -196,15 +195,14 @@ FT_BEGIN_HEADER * FreeType error code. 0~means success. * * @note: - * This feature is always disabled by default. Clients must make an - * explicit call to this function with a `filter` value other than - * @FT_LCD_FILTER_NONE in order to enable it. + * Since 2.10.3 the LCD filtering is enabled with @FT_LCD_FILTER_DEFAULT. + * It is no longer necessary to call this function explicitly except + * to choose a different filter or disable filtering altogether with + * @FT_LCD_FILTER_NONE. * - * Due to **PATENTS** covering subpixel rendering, this function doesn't - * do anything except returning `FT_Err_Unimplemented_Feature` if the - * configuration macro `FT_CONFIG_OPTION_SUBPIXEL_RENDERING` is not - * defined in your build of the library, which should correspond to all - * default builds of FreeType. + * This function does nothing but returns `FT_Err_Unimplemented_Feature` + * if the configuration macro `FT_CONFIG_OPTION_SUBPIXEL_RENDERING` is + * not defined in your build of the library. * * @since: * 2.3.0 @@ -235,11 +233,9 @@ FT_BEGIN_HEADER * FreeType error code. 0~means success. * * @note: - * Due to **PATENTS** covering subpixel rendering, this function doesn't - * do anything except returning `FT_Err_Unimplemented_Feature` if the - * configuration macro `FT_CONFIG_OPTION_SUBPIXEL_RENDERING` is not - * defined in your build of the library, which should correspond to all - * default builds of FreeType. + * This function does nothing but returns `FT_Err_Unimplemented_Feature` + * if the configuration macro `FT_CONFIG_OPTION_SUBPIXEL_RENDERING` is + * not defined in your build of the library. * * LCD filter weights can also be set per face using @FT_Face_Properties * with @FT_PARAM_TAG_LCD_FILTER_WEIGHTS. diff --git a/src/3rdparty/freetype/include/freetype/ftlist.h b/src/3rdparty/freetype/include/freetype/ftlist.h index 4782892d..45889227 100644 --- a/src/3rdparty/freetype/include/freetype/ftlist.h +++ b/src/3rdparty/freetype/include/freetype/ftlist.h @@ -4,7 +4,7 @@ * * Generic list support for FreeType (specification). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -28,8 +28,7 @@ #define FTLIST_H_ -#include -#include FT_FREETYPE_H +#include #ifdef FREETYPE_H #error "freetype.h of FreeType 1 has been loaded!" diff --git a/src/3rdparty/freetype/include/freetype/ftlzw.h b/src/3rdparty/freetype/include/freetype/ftlzw.h index fd22968f..ae46ad60 100644 --- a/src/3rdparty/freetype/include/freetype/ftlzw.h +++ b/src/3rdparty/freetype/include/freetype/ftlzw.h @@ -4,7 +4,7 @@ * * LZW-compressed stream support. * - * Copyright (C) 2004-2019 by + * Copyright (C) 2004-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -19,8 +19,7 @@ #ifndef FTLZW_H_ #define FTLZW_H_ -#include -#include FT_FREETYPE_H +#include #ifdef FREETYPE_H #error "freetype.h of FreeType 1 has been loaded!" @@ -43,6 +42,16 @@ FT_BEGIN_HEADER * Using LZW-compressed font files. * * @description: + * In certain builds of the library, LZW compression recognition is + * automatically handled when calling @FT_New_Face or @FT_Open_Face. + * This means that if no font driver is capable of handling the raw + * compressed file, the library will try to open a LZW stream from it and + * re-open the face with it. + * + * The stream implementation is very basic and resets the decompression + * process each time seeking backwards is needed within the stream, + * which significantly undermines the performance. + * * This section contains the declaration of LZW-specific functions. * */ @@ -73,15 +82,6 @@ FT_BEGIN_HEADER * **not** call `FT_Stream_Close` on the source stream. None of the * stream objects will be released to the heap. * - * The stream implementation is very basic and resets the decompression - * process each time seeking backwards is needed within the stream - * - * In certain builds of the library, LZW compression recognition is - * automatically handled when calling @FT_New_Face or @FT_Open_Face. - * This means that if no font driver is capable of handling the raw - * compressed file, the library will try to open a LZW stream from it and - * re-open the face with it. - * * This function may return `FT_Err_Unimplemented_Feature` if your build * of FreeType was not compiled with LZW support. */ diff --git a/src/3rdparty/freetype/include/freetype/ftmac.h b/src/3rdparty/freetype/include/freetype/ftmac.h index 92b9f3dc..c9de9818 100644 --- a/src/3rdparty/freetype/include/freetype/ftmac.h +++ b/src/3rdparty/freetype/include/freetype/ftmac.h @@ -4,7 +4,7 @@ * * Additional Mac-specific API. * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * Just van Rossum, David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -29,7 +29,6 @@ #define FTMAC_H_ -#include FT_BEGIN_HEADER diff --git a/src/3rdparty/freetype/include/freetype/ftmm.h b/src/3rdparty/freetype/include/freetype/ftmm.h index f2e16b64..d8781a82 100644 --- a/src/3rdparty/freetype/include/freetype/ftmm.h +++ b/src/3rdparty/freetype/include/freetype/ftmm.h @@ -4,7 +4,7 @@ * * FreeType Multiple Master font interface (specification). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -20,8 +20,7 @@ #define FTMM_H_ -#include -#include FT_TYPE1_TABLES_H +#include FT_BEGIN_HEADER diff --git a/src/3rdparty/freetype/include/freetype/ftmodapi.h b/src/3rdparty/freetype/include/freetype/ftmodapi.h index 8d039c4f..3f7ae82b 100644 --- a/src/3rdparty/freetype/include/freetype/ftmodapi.h +++ b/src/3rdparty/freetype/include/freetype/ftmodapi.h @@ -4,7 +4,7 @@ * * FreeType modules public interface (specification). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -20,8 +20,7 @@ #define FTMODAPI_H_ -#include -#include FT_FREETYPE_H +#include #ifdef FREETYPE_H #error "freetype.h of FreeType 1 has been loaded!" @@ -65,7 +64,7 @@ FT_BEGIN_HEADER * psnames * raster1 * sfnt - * smooth, smooth-lcd, smooth-lcdv + * smooth * truetype * type1 * type42 @@ -486,7 +485,7 @@ FT_BEGIN_HEADER * * ``` * FREETYPE_PROPERTIES=truetype:interpreter-version=35 \ - * cff:no-stem-darkening=1 \ + * cff:no-stem-darkening=0 \ * autofitter:warping=1 * ``` * diff --git a/src/3rdparty/freetype/include/freetype/ftmoderr.h b/src/3rdparty/freetype/include/freetype/ftmoderr.h index e1699357..f05fc53a 100644 --- a/src/3rdparty/freetype/include/freetype/ftmoderr.h +++ b/src/3rdparty/freetype/include/freetype/ftmoderr.h @@ -4,7 +4,7 @@ * * FreeType module error offsets (specification). * - * Copyright (C) 2001-2019 by + * Copyright (C) 2001-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -94,7 +94,7 @@ * const char* mod_err_msg * } ft_mod_errors[] = * - * #include FT_MODULE_ERRORS_H + * #include * ``` * */ diff --git a/src/3rdparty/freetype/include/freetype/ftotval.h b/src/3rdparty/freetype/include/freetype/ftotval.h index c034f489..9c00ad30 100644 --- a/src/3rdparty/freetype/include/freetype/ftotval.h +++ b/src/3rdparty/freetype/include/freetype/ftotval.h @@ -4,7 +4,7 @@ * * FreeType API for validating OpenType tables (specification). * - * Copyright (C) 2004-2019 by + * Copyright (C) 2004-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -30,8 +30,7 @@ #ifndef FTOTVAL_H_ #define FTOTVAL_H_ -#include -#include FT_FREETYPE_H +#include #ifdef FREETYPE_H #error "freetype.h of FreeType 1 has been loaded!" diff --git a/src/3rdparty/freetype/include/freetype/ftoutln.h b/src/3rdparty/freetype/include/freetype/ftoutln.h index b72327b7..84e9b144 100644 --- a/src/3rdparty/freetype/include/freetype/ftoutln.h +++ b/src/3rdparty/freetype/include/freetype/ftoutln.h @@ -5,7 +5,7 @@ * Support for the FT_Outline type used to store glyph shapes of * most scalable font formats (specification). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -21,8 +21,7 @@ #define FTOUTLN_H_ -#include -#include FT_FREETYPE_H +#include #ifdef FREETYPE_H #error "freetype.h of FreeType 1 has been loaded!" @@ -483,19 +482,13 @@ FT_BEGIN_HEADER * FreeType error code. 0~means success. * * @note: - * This advanced function uses @FT_Raster_Params as an argument, - * allowing FreeType rasterizer to be used for direct composition, - * translucency, etc. You should know how to set up @FT_Raster_Params - * for this function to work. - * + * This advanced function uses @FT_Raster_Params as an argument. * The field `params.source` will be set to `outline` before the scan * converter is called, which means that the value you give to it is - * actually ignored. - * - * The gray-level rasterizer always uses 256 gray levels. If you want - * less gray levels, you have to provide your own span callback. See the - * @FT_RASTER_FLAG_DIRECT value of the `flags` field in the - * @FT_Raster_Params structure for more details. + * actually ignored. Either `params.target` must point to preallocated + * bitmap, or @FT_RASTER_FLAG_DIRECT must be set in `params.flags` + * allowing FreeType rasterizer to be used for direct composition, + * translucency, etc. See @FT_Raster_Params for more details. */ FT_EXPORT( FT_Error ) FT_Outline_Render( FT_Library library, diff --git a/src/3rdparty/freetype/include/freetype/ftparams.h b/src/3rdparty/freetype/include/freetype/ftparams.h index c374ee2f..55ea2a38 100644 --- a/src/3rdparty/freetype/include/freetype/ftparams.h +++ b/src/3rdparty/freetype/include/freetype/ftparams.h @@ -4,7 +4,7 @@ * * FreeType API for possible FT_Parameter tags (specification only). * - * Copyright (C) 2017-2019 by + * Copyright (C) 2017-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -19,8 +19,7 @@ #ifndef FTPARAMS_H_ #define FTPARAMS_H_ -#include -#include FT_FREETYPE_H +#include #ifdef FREETYPE_H #error "freetype.h of FreeType 1 has been loaded!" diff --git a/src/3rdparty/freetype/include/freetype/ftpfr.h b/src/3rdparty/freetype/include/freetype/ftpfr.h index b4eca76e..9a5383f9 100644 --- a/src/3rdparty/freetype/include/freetype/ftpfr.h +++ b/src/3rdparty/freetype/include/freetype/ftpfr.h @@ -4,7 +4,7 @@ * * FreeType API for accessing PFR-specific data (specification only). * - * Copyright (C) 2002-2019 by + * Copyright (C) 2002-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -19,8 +19,7 @@ #ifndef FTPFR_H_ #define FTPFR_H_ -#include -#include FT_FREETYPE_H +#include #ifdef FREETYPE_H #error "freetype.h of FreeType 1 has been loaded!" diff --git a/src/3rdparty/freetype/include/freetype/ftrender.h b/src/3rdparty/freetype/include/freetype/ftrender.h index a01c7742..8007951b 100644 --- a/src/3rdparty/freetype/include/freetype/ftrender.h +++ b/src/3rdparty/freetype/include/freetype/ftrender.h @@ -4,7 +4,7 @@ * * FreeType renderer modules public interface (specification). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -20,9 +20,8 @@ #define FTRENDER_H_ -#include -#include FT_MODULE_H -#include FT_GLYPH_H +#include +#include FT_BEGIN_HEADER diff --git a/src/3rdparty/freetype/include/freetype/ftsizes.h b/src/3rdparty/freetype/include/freetype/ftsizes.h index 6c63cef2..a8682a30 100644 --- a/src/3rdparty/freetype/include/freetype/ftsizes.h +++ b/src/3rdparty/freetype/include/freetype/ftsizes.h @@ -4,7 +4,7 @@ * * FreeType size objects management (specification). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -29,8 +29,7 @@ #define FTSIZES_H_ -#include -#include FT_FREETYPE_H +#include #ifdef FREETYPE_H #error "freetype.h of FreeType 1 has been loaded!" diff --git a/src/3rdparty/freetype/include/freetype/ftsnames.h b/src/3rdparty/freetype/include/freetype/ftsnames.h index 4d43602a..729e6ab0 100644 --- a/src/3rdparty/freetype/include/freetype/ftsnames.h +++ b/src/3rdparty/freetype/include/freetype/ftsnames.h @@ -7,7 +7,7 @@ * * This is _not_ used to retrieve glyph names! * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -23,9 +23,8 @@ #define FTSNAMES_H_ -#include -#include FT_FREETYPE_H -#include FT_PARAMETER_TAGS_H +#include +#include #ifdef FREETYPE_H #error "freetype.h of FreeType 1 has been loaded!" diff --git a/src/3rdparty/freetype/include/freetype/ftstroke.h b/src/3rdparty/freetype/include/freetype/ftstroke.h index 01a9c181..a759c94d 100644 --- a/src/3rdparty/freetype/include/freetype/ftstroke.h +++ b/src/3rdparty/freetype/include/freetype/ftstroke.h @@ -4,7 +4,7 @@ * * FreeType path stroker (specification). * - * Copyright (C) 2002-2019 by + * Copyright (C) 2002-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -19,9 +19,8 @@ #ifndef FTSTROKE_H_ #define FTSTROKE_H_ -#include -#include FT_OUTLINE_H -#include FT_GLYPH_H +#include +#include FT_BEGIN_HEADER @@ -44,7 +43,7 @@ FT_BEGIN_HEADER * borders of the stroke. * * This can be useful to generate 'bordered' glyph, i.e., glyphs - * displayed with a coloured (and anti-aliased) border around their + * displayed with a colored (and anti-aliased) border around their * shape. * * @order: @@ -114,22 +113,19 @@ FT_BEGIN_HEADER * FT_STROKER_LINEJOIN_MITER_FIXED :: * Used to render mitered line joins, with fixed bevels if the miter * limit is exceeded. The outer edges of the strokes for the two - * segments are extended until they meet at an angle. If the segments - * meet at too sharp an angle (such that the miter would extend from - * the intersection of the segments a distance greater than the product - * of the miter limit value and the border radius), then a bevel join - * (see above) is used instead. This prevents long spikes being - * created. `FT_STROKER_LINEJOIN_MITER_FIXED` generates a miter line - * join as used in PostScript and PDF. + * segments are extended until they meet at an angle. A bevel join + * (see above) is used if the segments meet at too sharp an angle and + * the outer edges meet beyond a distance corresponding to the meter + * limit. This prevents long spikes being created. + * `FT_STROKER_LINEJOIN_MITER_FIXED` generates a miter line join as + * used in PostScript and PDF. * * FT_STROKER_LINEJOIN_MITER_VARIABLE :: * FT_STROKER_LINEJOIN_MITER :: * Used to render mitered line joins, with variable bevels if the miter - * limit is exceeded. The intersection of the strokes is clipped at a - * line perpendicular to the bisector of the angle between the strokes, - * at the distance from the intersection of the segments equal to the - * product of the miter limit value and the border radius. This - * prevents long spikes being created. + * limit is exceeded. The intersection of the strokes is clipped + * perpendicularly to the bisector, at a distance corresponding to + * the miter limit. This prevents long spikes being created. * `FT_STROKER_LINEJOIN_MITER_VARIABLE` generates a mitered line join * as used in XPS. `FT_STROKER_LINEJOIN_MITER` is an alias for * `FT_STROKER_LINEJOIN_MITER_VARIABLE`, retained for backward @@ -296,12 +292,17 @@ FT_BEGIN_HEADER * The line join style. * * miter_limit :: - * The miter limit for the `FT_STROKER_LINEJOIN_MITER_FIXED` and - * `FT_STROKER_LINEJOIN_MITER_VARIABLE` line join styles, expressed as - * 16.16 fixed-point value. + * The maximum reciprocal sine of half-angle at the miter join, + * expressed as 16.16 fixed point value. * * @note: - * The radius is expressed in the same units as the outline coordinates. + * The `radius` is expressed in the same units as the outline + * coordinates. + * + * The `miter_limit` multiplied by the `radius` gives the maximum size + * of a miter spike, at which it is clipped for + * @FT_STROKER_LINEJOIN_MITER_VARIABLE or replaced with a bevel join for + * @FT_STROKER_LINEJOIN_MITER_FIXED. * * This function calls @FT_Stroker_Rewind automatically. */ diff --git a/src/3rdparty/freetype/include/freetype/ftsynth.h b/src/3rdparty/freetype/include/freetype/ftsynth.h index 8754f97c..bdb4c575 100644 --- a/src/3rdparty/freetype/include/freetype/ftsynth.h +++ b/src/3rdparty/freetype/include/freetype/ftsynth.h @@ -5,7 +5,7 @@ * FreeType synthesizing code for emboldening and slanting * (specification). * - * Copyright (C) 2000-2019 by + * Copyright (C) 2000-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -45,8 +45,7 @@ #define FTSYNTH_H_ -#include -#include FT_FREETYPE_H +#include #ifdef FREETYPE_H #error "freetype.h of FreeType 1 has been loaded!" diff --git a/src/3rdparty/freetype/include/freetype/ftsystem.h b/src/3rdparty/freetype/include/freetype/ftsystem.h index 889a6ba1..22aead71 100644 --- a/src/3rdparty/freetype/include/freetype/ftsystem.h +++ b/src/3rdparty/freetype/include/freetype/ftsystem.h @@ -4,7 +4,7 @@ * * FreeType low-level system interface definition (specification). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -20,7 +20,6 @@ #define FTSYSTEM_H_ -#include FT_BEGIN_HEADER diff --git a/src/3rdparty/freetype/include/freetype/fttrigon.h b/src/3rdparty/freetype/include/freetype/fttrigon.h index 37e1412f..2ce6b324 100644 --- a/src/3rdparty/freetype/include/freetype/fttrigon.h +++ b/src/3rdparty/freetype/include/freetype/fttrigon.h @@ -4,7 +4,7 @@ * * FreeType trigonometric functions (specification). * - * Copyright (C) 2001-2019 by + * Copyright (C) 2001-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -19,7 +19,7 @@ #ifndef FTTRIGON_H_ #define FTTRIGON_H_ -#include FT_FREETYPE_H +#include #ifdef FREETYPE_H #error "freetype.h of FreeType 1 has been loaded!" diff --git a/src/3rdparty/freetype/include/freetype/ftttdrv.h b/src/3rdparty/freetype/include/freetype/ftttdrv.h deleted file mode 100644 index dc0081a0..00000000 --- a/src/3rdparty/freetype/include/freetype/ftttdrv.h +++ /dev/null @@ -1,310 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftttdrv.h */ -/* */ -/* FreeType API for controlling the TrueType driver */ -/* (specification only). */ -/* */ -/* Copyright 2013-2015 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __FTTTDRV_H__ -#define __FTTTDRV_H__ - -#include -#include FT_FREETYPE_H - -#ifdef FREETYPE_H -#error "freetype.h of FreeType 1 has been loaded!" -#error "Please fix the directory search order for header files" -#error "so that freetype.h of FreeType 2 is found first." -#endif - - -FT_BEGIN_HEADER - - - /************************************************************************** - * - * @section: - * tt_driver - * - * @title: - * The TrueType driver - * - * @abstract: - * Controlling the TrueType driver module. - * - * @description: - * While FreeType's TrueType driver doesn't expose API functions by - * itself, it is possible to control its behaviour with @FT_Property_Set - * and @FT_Property_Get. The following lists the available properties - * together with the necessary macros and structures. - * - * The TrueType driver's module name is `truetype'. - * - * We start with a list of definitions, kindly provided by Greg - * Hitchcock. - * - * _Bi-Level_ _Rendering_ - * - * Monochromatic rendering, exclusively used in the early days of - * TrueType by both Apple and Microsoft. Microsoft's GDI interface - * supported hinting of the right-side bearing point, such that the - * advance width could be non-linear. Most often this was done to - * achieve some level of glyph symmetry. To enable reasonable - * performance (e.g., not having to run hinting on all glyphs just to - * get the widths) there was a bit in the head table indicating if the - * side bearing was hinted, and additional tables, `hdmx' and `LTSH', to - * cache hinting widths across multiple sizes and device aspect ratios. - * - * _Font_ _Smoothing_ - * - * Microsoft's GDI implementation of anti-aliasing. Not traditional - * anti-aliasing as the outlines were hinted before the sampling. The - * widths matched the bi-level rendering. - * - * _ClearType_ _Rendering_ - * - * Technique that uses physical subpixels to improve rendering on LCD - * (and other) displays. Because of the higher resolution, many methods - * of improving symmetry in glyphs through hinting the right-side - * bearing were no longer necessary. This lead to what GDI calls - * `natural widths' ClearType, see - * http://www.beatstamm.com/typography/RTRCh4.htm#Sec21. Since hinting - * has extra resolution, most non-linearity went away, but it is still - * possible for hints to change the advance widths in this mode. - * - * _ClearType_ _Compatible_ _Widths_ - * - * One of the earliest challenges with ClearType was allowing the - * implementation in GDI to be selected without requiring all UI and - * documents to reflow. To address this, a compatible method of - * rendering ClearType was added where the font hints are executed once - * to determine the width in bi-level rendering, and then re-run in - * ClearType, with the difference in widths being absorbed in the font - * hints for ClearType (mostly in the white space of hints); see - * http://www.beatstamm.com/typography/RTRCh4.htm#Sec20. Somewhat by - * definition, compatible width ClearType allows for non-linear widths, - * but only when the bi-level version has non-linear widths. - * - * _ClearType_ _Subpixel_ _Positioning_ - * - * One of the nice benefits of ClearType is the ability to more crisply - * display fractional widths; unfortunately, the GDI model of integer - * bitmaps did not support this. However, the WPF and Direct Write - * frameworks do support fractional widths. DWrite calls this `natural - * mode', not to be confused with GDI's `natural widths'. Subpixel - * positioning, in the current implementation of Direct Write, - * unfortunately does not support hinted advance widths, see - * http://www.beatstamm.com/typography/RTRCh4.htm#Sec22. Note that the - * TrueType interpreter fully allows the advance width to be adjusted in - * this mode, just the DWrite client will ignore those changes. - * - * _ClearType_ _Backwards_ _Compatibility_ - * - * This is a set of exceptions made in the TrueType interpreter to - * minimize hinting techniques that were problematic with the extra - * resolution of ClearType; see - * http://www.beatstamm.com/typography/RTRCh4.htm#Sec1 and - * http://www.microsoft.com/typography/cleartype/truetypecleartype.aspx. - * This technique is not to be confused with ClearType compatible - * widths. ClearType backwards compatibility has no direct impact on - * changing advance widths, but there might be an indirect impact on - * disabling some deltas. This could be worked around in backwards - * compatibility mode. - * - * _Native_ _ClearType_ _Mode_ - * - * (Not to be confused with `natural widths'.) This mode removes all - * the exceptions in the TrueType interpreter when running with - * ClearType. Any issues on widths would still apply, though. - * - */ - - - /************************************************************************** - * - * @property: - * interpreter-version - * - * @description: - * Currently, two versions are available, representing the bytecode - * interpreter with and without subpixel hinting support, - * respectively. The default is subpixel support if - * TT_CONFIG_OPTION_SUBPIXEL_HINTING is defined, and no subpixel - * support otherwise (since it isn't available then). - * - * If subpixel hinting is on, many TrueType bytecode instructions behave - * differently compared to B/W or grayscale rendering (except if `native - * ClearType' is selected by the font). The main idea is to render at a - * much increased horizontal resolution, then sampling down the created - * output to subpixel precision. However, many older fonts are not - * suited to this and must be specially taken care of by applying - * (hardcoded) font-specific tweaks. - * - * Details on subpixel hinting and some of the necessary tweaks can be - * found in Greg Hitchcock's whitepaper at - * `http://www.microsoft.com/typography/cleartype/truetypecleartype.aspx'. - * - * The following example code demonstrates how to activate subpixel - * hinting (omitting the error handling). - * - * { - * FT_Library library; - * FT_Face face; - * FT_UInt interpreter_version = TT_INTERPRETER_VERSION_38; - * - * - * FT_Init_FreeType( &library ); - * - * FT_Property_Set( library, "truetype", - * "interpreter-version", - * &interpreter_version ); - * } - * - * @note: - * This property can be used with @FT_Property_Get also. - * - */ - - - /************************************************************************** - * - * @enum: - * TT_INTERPRETER_VERSION_XXX - * - * @description: - * A list of constants used for the @interpreter-version property to - * select the hinting engine for Truetype fonts. - * - * The numeric value in the constant names represents the version - * number as returned by the `GETINFO' bytecode instruction. - * - * @values: - * TT_INTERPRETER_VERSION_35 :: - * Version~35 corresponds to MS rasterizer v.1.7 as used e.g. in - * Windows~98; only grayscale and B/W rasterizing is supported. - * - * TT_INTERPRETER_VERSION_38 :: - * Version~38 corresponds to MS rasterizer v.1.9; it is roughly - * equivalent to the hinting provided by DirectWrite ClearType (as - * can be found, for example, in the Internet Explorer~9 running on - * Windows~7). - * - * @note: - * This property controls the behaviour of the bytecode interpreter - * and thus how outlines get hinted. It does *not* control how glyph - * get rasterized! In particular, it does not control subpixel color - * filtering. - * - * If FreeType has not been compiled with configuration option - * FT_CONFIG_OPTION_SUBPIXEL_HINTING, selecting version~38 causes an - * `FT_Err_Unimplemented_Feature' error. - * - * Depending on the graphics framework, Microsoft uses different - * bytecode and rendering engines. As a consequence, the version - * numbers returned by a call to the `GETINFO' bytecode instruction are - * more convoluted than desired. - * - * Here are two tables that try to shed some light on the possible - * values for the MS rasterizer engine, together with the additional - * features introduced by it. - * - * { - * GETINFO framework version feature - * ------------------------------------------------------------------- - * 3 GDI (Win 3.1), v1.0 16-bit, first version - * TrueImage - * 33 GDI (Win NT 3.1), v1.5 32-bit - * HP Laserjet - * 34 GDI (Win 95) v1.6 font smoothing, - * new SCANTYPE opcode - * 35 GDI (Win 98/2000) v1.7 (UN)SCALED_COMPONENT_OFFSET - * bits in composite glyphs - * 36 MGDI (Win CE 2) v1.6+ classic ClearType - * 37 GDI (XP and later), v1.8 ClearType - * GDI+ old (before Vista) - * 38 GDI+ old (Vista, Win 7), v1.9 subpixel ClearType, - * WPF Y-direction ClearType, - * additional error checking - * 39 DWrite (before Win 8) v2.0 subpixel ClearType flags - * in GETINFO opcode, - * bug fixes - * 40 GDI+ (after Win 7), v2.1 Y-direction ClearType flag - * DWrite (Win 8) in GETINFO opcode, - * Gray ClearType - * } - * - * The `version' field gives a rough orientation only, since some - * applications provided certain features much earlier (as an example, - * Microsoft Reader used subpixel and Y-direction ClearType already in - * Windows 2000). Similarly, updates to a given framework might include - * improved hinting support. - * - * { - * version sampling rendering comment - * x y x y - * -------------------------------------------------------------- - * v1.0 normal normal B/W B/W bi-level - * v1.6 high high gray gray grayscale - * v1.8 high normal color-filter B/W (GDI) ClearType - * v1.9 high high color-filter gray Color ClearType - * v2.1 high normal gray B/W Gray ClearType - * v2.1 high high gray gray Gray ClearType - * } - * - * Color and Gray ClearType are the two available variants of - * `Y-direction ClearType', meaning grayscale rasterization along the - * Y-direction; the name used in the TrueType specification for this - * feature is `symmetric smoothing'. `Classic ClearType' is the - * original algorithm used before introducing a modified version in - * Win~XP. Another name for v1.6's grayscale rendering is `font - * smoothing', and `Color ClearType' is sometimes also called `DWrite - * ClearType'. To differentiate between today's Color ClearType and the - * earlier ClearType variant with B/W rendering along the vertical axis, - * the latter is sometimes called `GDI ClearType'. - * - * `Normal' and `high' sampling describe the (virtual) resolution to - * access the rasterized outline after the hinting process. `Normal' - * means 1 sample per grid line (i.e., B/W). In the current Microsoft - * implementation, `high' means an extra virtual resolution of 16x16 (or - * 16x1) grid lines per pixel for bytecode instructions like `MIRP'. - * After hinting, these 16 grid lines are mapped to 6x5 (or 6x1) grid - * lines for color filtering if Color ClearType is activated. - * - * Note that `Gray ClearType' is essentially the same as v1.6's - * grayscale rendering. However, the GETINFO instruction handles it - * differently: v1.6 returns bit~12 (hinting for grayscale), while v2.1 - * returns bits~13 (hinting for ClearType), 18 (symmetrical smoothing), - * and~19 (Gray ClearType). Also, this mode respects bits 2 and~3 for - * the version~1 gasp table exclusively (like Color ClearType), while - * v1.6 only respects the values of version~0 (bits 0 and~1). - * - * FreeType doesn't provide all capabilities of the most recent - * ClearType incarnation, thus we identify our subpixel support as - * version~38. - * - */ -#define TT_INTERPRETER_VERSION_35 35 -#define TT_INTERPRETER_VERSION_38 38 - - /* */ - - -FT_END_HEADER - - -#endif /* __FTTTDRV_H__ */ - - -/* END */ diff --git a/src/3rdparty/freetype/include/freetype/fttypes.h b/src/3rdparty/freetype/include/freetype/fttypes.h index 10571505..aaeb9e87 100644 --- a/src/3rdparty/freetype/include/freetype/fttypes.h +++ b/src/3rdparty/freetype/include/freetype/fttypes.h @@ -4,7 +4,7 @@ * * FreeType simple types definitions (specification only). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -22,8 +22,8 @@ #include #include FT_CONFIG_CONFIG_H -#include FT_SYSTEM_H -#include FT_IMAGE_H +#include +#include #include diff --git a/src/3rdparty/freetype/include/freetype/ftwinfnt.h b/src/3rdparty/freetype/include/freetype/ftwinfnt.h index a2fba903..786528c6 100644 --- a/src/3rdparty/freetype/include/freetype/ftwinfnt.h +++ b/src/3rdparty/freetype/include/freetype/ftwinfnt.h @@ -4,7 +4,7 @@ * * FreeType API for accessing Windows fnt-specific data. * - * Copyright (C) 2003-2019 by + * Copyright (C) 2003-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -19,8 +19,7 @@ #ifndef FTWINFNT_H_ #define FTWINFNT_H_ -#include -#include FT_FREETYPE_H +#include #ifdef FREETYPE_H #error "freetype.h of FreeType 1 has been loaded!" diff --git a/src/3rdparty/freetype/include/freetype/internal/autohint.h b/src/3rdparty/freetype/include/freetype/internal/autohint.h index f64c28bb..2a472e20 100644 --- a/src/3rdparty/freetype/include/freetype/internal/autohint.h +++ b/src/3rdparty/freetype/include/freetype/internal/autohint.h @@ -4,7 +4,7 @@ * * High-level 'autohint' module-specific interface (specification). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -70,8 +70,7 @@ */ -#include -#include FT_FREETYPE_H +#include FT_BEGIN_HEADER @@ -208,6 +207,9 @@ FT_BEGIN_HEADER } FT_AutoHinter_InterfaceRec, *FT_AutoHinter_Interface; +#define FT_DECLARE_AUTOHINTER_INTERFACE( class_ ) \ + FT_CALLBACK_TABLE const FT_AutoHinter_InterfaceRec class_; + #define FT_DEFINE_AUTOHINTER_INTERFACE( \ class_, \ reset_face_, \ diff --git a/src/3rdparty/freetype/include/freetype/internal/cffotypes.h b/src/3rdparty/freetype/include/freetype/internal/cffotypes.h index b26893ea..a316fd1f 100644 --- a/src/3rdparty/freetype/include/freetype/internal/cffotypes.h +++ b/src/3rdparty/freetype/include/freetype/internal/cffotypes.h @@ -4,7 +4,7 @@ * * Basic OpenType/CFF object type definitions (specification). * - * Copyright (C) 2017-2019 by + * Copyright (C) 2017-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -19,12 +19,11 @@ #ifndef CFFOTYPES_H_ #define CFFOTYPES_H_ -#include -#include FT_INTERNAL_OBJECTS_H -#include FT_INTERNAL_CFF_TYPES_H -#include FT_INTERNAL_TRUETYPE_TYPES_H -#include FT_SERVICE_POSTSCRIPT_CMAPS_H -#include FT_INTERNAL_POSTSCRIPT_HINTS_H +#include +#include +#include +#include +#include FT_BEGIN_HEADER diff --git a/src/3rdparty/freetype/include/freetype/internal/cfftypes.h b/src/3rdparty/freetype/include/freetype/internal/cfftypes.h index 2fc905ec..f21167b1 100644 --- a/src/3rdparty/freetype/include/freetype/internal/cfftypes.h +++ b/src/3rdparty/freetype/include/freetype/internal/cfftypes.h @@ -5,7 +5,7 @@ * Basic OpenType/CFF type definitions and interface (specification * only). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -21,13 +21,12 @@ #define CFFTYPES_H_ -#include -#include FT_FREETYPE_H -#include FT_TYPE1_TABLES_H -#include FT_INTERNAL_SERVICE_H -#include FT_SERVICE_POSTSCRIPT_CMAPS_H -#include FT_INTERNAL_POSTSCRIPT_HINTS_H -#include FT_INTERNAL_TYPE1_TYPES_H +#include +#include +#include +#include +#include +#include FT_BEGIN_HEADER diff --git a/src/3rdparty/freetype/include/freetype/internal/compiler-macros.h b/src/3rdparty/freetype/include/freetype/internal/compiler-macros.h new file mode 100644 index 00000000..97c18d3a --- /dev/null +++ b/src/3rdparty/freetype/include/freetype/internal/compiler-macros.h @@ -0,0 +1,307 @@ +/**************************************************************************** + * + * internal/compiler-macros.h + * + * Compiler-specific macro definitions used internally by FreeType. + * + * Copyright (C) 2020 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + +#ifndef INTERNAL_COMPILER_MACROS_H_ +#define INTERNAL_COMPILER_MACROS_H_ + +#include + +FT_BEGIN_HEADER + + /* Fix compiler warning with sgi compiler. */ +#if defined( __sgi ) && !defined( __GNUC__ ) +# if defined( _COMPILER_VERSION ) && ( _COMPILER_VERSION >= 730 ) +# pragma set woff 3505 +# endif +#endif + + /* Fix compiler warning with sgi compiler. */ +#if defined( __sgi ) && !defined( __GNUC__ ) +# if defined( _COMPILER_VERSION ) && ( _COMPILER_VERSION >= 730 ) +# pragma set woff 3505 +# endif +#endif + + /* + * When defining a macro that expands to a non-trivial C statement, use + * FT_BEGIN_STMNT and FT_END_STMNT to enclose the macro's body. This + * ensures there are no surprises when the macro is invoked in conditional + * branches. + * + * Example: + * + * #define LOG( ... ) \ + * FT_BEGIN_STMNT \ + * if ( logging_enabled ) \ + * log( __VA_ARGS__ ); \ + * FT_END_STMNT + */ +#define FT_BEGIN_STMNT do { +#define FT_END_STMNT } while ( 0 ) + + /* + * FT_DUMMY_STMNT expands to an empty C statement. Useful for + * conditionally defined statement macros. + * + * Example: + * + * #ifdef BUILD_CONFIG_LOGGING + * #define LOG( ... ) \ + * FT_BEGIN_STMNT \ + * if ( logging_enabled ) \ + * log( __VA_ARGS__ ); \ + * FT_END_STMNT + * #else + * # define LOG( ... ) FT_DUMMY_STMNT + * #endif + */ +#define FT_DUMMY_STMNT FT_BEGIN_STMNT FT_END_STMNT + +#ifdef _WIN64 + /* only 64bit Windows uses the LLP64 data model, i.e., */ + /* 32-bit integers, 64-bit pointers. */ +#define FT_UINT_TO_POINTER( x ) (void *)(unsigned __int64)(x) +#else +#define FT_UINT_TO_POINTER( x ) (void *)(unsigned long)(x) +#endif + + /* + * Use `FT_TYPEOF( type )` to cast a value to `type`. This is useful to + * suppress signedness compilation warnings in macros. + * + * Example: + * + * #define PAD_( x, n ) ( (x) & ~FT_TYPEOF( x )( (n) - 1 ) ) + * + * (The `typeof` condition is taken from gnulib's `intprops.h` header + * file.) + */ +#if ( ( defined( __GNUC__ ) && __GNUC__ >= 2 ) || \ + ( defined( __IBMC__ ) && __IBMC__ >= 1210 && \ + defined( __IBM__TYPEOF__ ) ) || \ + ( defined( __SUNPRO_C ) && __SUNPRO_C >= 0x5110 && !__STDC__ ) ) +#define FT_TYPEOF( type ) ( __typeof__ ( type ) ) +#else +#define FT_TYPEOF( type ) /* empty */ +#endif + + /* + * Mark a function declaration as internal to the library. This ensures + * that it will not be exposed by default to client code, and helps + * generate smaller and faster code on ELF-based platforms. Place this + * before a function declaration. + */ + + /* Visual C, mingw */ +#if defined( _WIN32 ) +#define FT_INTERNAL_FUNCTION_ATTRIBUTE /* empty */ + + /* gcc, clang */ +#elif ( defined( __GNUC__ ) && __GNUC__ >= 4 ) || defined( __clang__ ) +#define FT_INTERNAL_FUNCTION_ATTRIBUTE \ + __attribute__(( visibility( "hidden" ) )) + + /* Sun */ +#elif defined( __SUNPRO_C ) && __SUNPRO_C >= 0x550 +#define FT_INTERNAL_FUNCTION_ATTRIBUTE __hidden + +#else +#define FT_INTERNAL_FUNCTION_ATTRIBUTE /* empty */ +#endif + + /* + * FreeType supports compilation of its C sources with a C++ compiler (in + * C++ mode); this introduces a number of subtle issues. + * + * The main one is that a C++ function declaration and its definition must + * have the same 'linkage'. Because all FreeType headers declare their + * functions with C linkage (i.e., within an `extern "C" { ... }` block + * due to the magic of FT_BEGIN_HEADER and FT_END_HEADER), their + * definition in FreeType sources should also be prefixed with `extern + * "C"` when compiled in C++ mode. + * + * The `FT_FUNCTION_DECLARATION` and `FT_FUNCTION_DEFINITION` macros are + * provided to deal with this case, as well as `FT_CALLBACK_DEF` and its + * siblings below. + */ + + /* + * `FT_FUNCTION_DECLARATION( type )` can be used to write a C function + * declaration to ensure it will have C linkage when the library is built + * with a C++ compiler. The parameter is the function's return type, so a + * declaration would look like + * + * FT_FUNCTION_DECLARATION( int ) + * foo( int x ); + * + * NOTE: This requires that all uses are inside of `FT_BEGIN_HEADER ... + * FT_END_HEADER` blocks, which guarantees that the declarations have C + * linkage when the headers are included by C++ sources. + * + * NOTE: Do not use directly. Use `FT_LOCAL`, `FT_BASE`, and `FT_EXPORT` + * instead. + */ +#define FT_FUNCTION_DECLARATION( x ) extern x + + /* + * Same as `FT_FUNCTION_DECLARATION`, but for function definitions instead. + * + * NOTE: Do not use directly. Use `FT_LOCAL_DEF`, `FT_BASE_DEF`, and + * `FT_EXPORT_DEF` instead. + */ +#ifdef __cplusplus +#define FT_FUNCTION_DEFINITION( x ) extern "C" x +#else +#define FT_FUNCTION_DEFINITION( x ) x +#endif + + /* + * Use `FT_LOCAL` and `FT_LOCAL_DEF` to declare and define, respectively, + * an internal FreeType function that is only used by the sources of a + * single `src/module/` directory. This ensures that the functions are + * turned into static ones at build time, resulting in smaller and faster + * code. + */ +#ifdef FT_MAKE_OPTION_SINGLE_OBJECT + +#define FT_LOCAL( x ) static x +#define FT_LOCAL_DEF( x ) static x + +#else + +#define FT_LOCAL( x ) FT_INTERNAL_FUNCTION_ATTRIBUTE \ + FT_FUNCTION_DECLARATION( x ) +#define FT_LOCAL_DEF( x ) FT_FUNCTION_DEFINITION( x ) + +#endif /* FT_MAKE_OPTION_SINGLE_OBJECT */ + + /* + * Use `FT_LOCAL_ARRAY` and `FT_LOCAL_ARRAY_DEF` to declare and define, + * respectively, a constant array that must be accessed from several + * sources in the same `src/module/` sub-directory, and which are internal + * to the library. + */ +#define FT_LOCAL_ARRAY( x ) FT_INTERNAL_FUNCTION_ATTRIBUTE \ + extern const x +#define FT_LOCAL_ARRAY_DEF( x ) FT_FUNCTION_DEFINITION( const x ) + + /* + * `Use FT_BASE` and `FT_BASE_DEF` to declare and define, respectively, an + * internal library function that is used by more than a single module. + */ +#define FT_BASE( x ) FT_INTERNAL_FUNCTION_ATTRIBUTE \ + FT_FUNCTION_DECLARATION( x ) +#define FT_BASE_DEF( x ) FT_FUNCTION_DEFINITION( x ) + + + /* + * NOTE: Conditionally define `FT_EXPORT_VAR` due to its definition in + * `src/smooth/ftgrays.h` to make the header more portable. + */ +#ifndef FT_EXPORT_VAR +#define FT_EXPORT_VAR( x ) FT_FUNCTION_DECLARATION( x ) +#endif + + /* When compiling FreeType as a DLL or DSO with hidden visibility, */ + /* some systems/compilers need a special attribute in front OR after */ + /* the return type of function declarations. */ + /* */ + /* Two macros are used within the FreeType source code to define */ + /* exported library functions: `FT_EXPORT` and `FT_EXPORT_DEF`. */ + /* */ + /* - `FT_EXPORT( return_type )` */ + /* */ + /* is used in a function declaration, as in */ + /* */ + /* ``` */ + /* FT_EXPORT( FT_Error ) */ + /* FT_Init_FreeType( FT_Library* alibrary ); */ + /* ``` */ + /* */ + /* - `FT_EXPORT_DEF( return_type )` */ + /* */ + /* is used in a function definition, as in */ + /* */ + /* ``` */ + /* FT_EXPORT_DEF( FT_Error ) */ + /* FT_Init_FreeType( FT_Library* alibrary ) */ + /* { */ + /* ... some code ... */ + /* return FT_Err_Ok; */ + /* } */ + /* ``` */ + /* */ + /* You can provide your own implementation of `FT_EXPORT` and */ + /* `FT_EXPORT_DEF` here if you want. */ + /* */ + /* To export a variable, use `FT_EXPORT_VAR`. */ + /* */ + + /* See `freetype/config/compiler_macros.h` for the `FT_EXPORT` definition */ +#define FT_EXPORT_DEF( x ) FT_FUNCTION_DEFINITION( x ) + + /* The following macros are needed to compile the library with a */ + /* C++ compiler and with 16bit compilers. */ + /* */ + + /* This is special. Within C++, you must specify `extern "C"` for */ + /* functions which are used via function pointers, and you also */ + /* must do that for structures which contain function pointers to */ + /* assure C linkage -- it's not possible to have (local) anonymous */ + /* functions which are accessed by (global) function pointers. */ + /* */ + /* */ + /* FT_CALLBACK_DEF is used to _define_ a callback function, */ + /* located in the same source code file as the structure that uses */ + /* it. */ + /* */ + /* FT_BASE_CALLBACK and FT_BASE_CALLBACK_DEF are used to declare */ + /* and define a callback function, respectively, in a similar way */ + /* as FT_BASE and FT_BASE_DEF work. */ + /* */ + /* FT_CALLBACK_TABLE is used to _declare_ a constant variable that */ + /* contains pointers to callback functions. */ + /* */ + /* FT_CALLBACK_TABLE_DEF is used to _define_ a constant variable */ + /* that contains pointers to callback functions. */ + /* */ + /* */ + /* Some 16bit compilers have to redefine these macros to insert */ + /* the infamous `_cdecl` or `__fastcall` declarations. */ + /* */ +#ifdef __cplusplus +#define FT_CALLBACK_DEF( x ) extern "C" x +#else +#define FT_CALLBACK_DEF( x ) static x +#endif + +#define FT_BASE_CALLBACK( x ) FT_FUNCTION_DECLARATION( x ) +#define FT_BASE_CALLBACK_DEF( x ) FT_FUNCTION_DEFINITION( x ) + +#ifndef FT_CALLBACK_TABLE +#ifdef __cplusplus +#define FT_CALLBACK_TABLE extern "C" +#define FT_CALLBACK_TABLE_DEF extern "C" +#else +#define FT_CALLBACK_TABLE extern +#define FT_CALLBACK_TABLE_DEF /* nothing */ +#endif +#endif /* FT_CALLBACK_TABLE */ + +FT_END_HEADER + +#endif /* INTERNAL_COMPILER_MACROS_H_ */ diff --git a/src/3rdparty/freetype/include/freetype/internal/ftcalc.h b/src/3rdparty/freetype/include/freetype/internal/ftcalc.h index 1811fcd1..c6530747 100644 --- a/src/3rdparty/freetype/include/freetype/internal/ftcalc.h +++ b/src/3rdparty/freetype/include/freetype/internal/ftcalc.h @@ -4,7 +4,7 @@ * * Arithmetic computations (specification). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -20,9 +20,9 @@ #define FTCALC_H_ -#include -#include FT_FREETYPE_H +#include +#include "compiler-macros.h" FT_BEGIN_HEADER @@ -449,8 +449,7 @@ FT_BEGIN_HEADER #define F2DOT14_TO_FIXED( x ) ( (FT_Long)(x) * 4 ) /* << 2 */ #define FIXED_TO_INT( x ) ( FT_RoundFix( x ) >> 16 ) -#define ROUND_F26DOT6( x ) ( x >= 0 ? ( ( (x) + 32 ) & -64 ) \ - : ( -( ( 32 - (x) ) & -64 ) ) ) +#define ROUND_F26DOT6( x ) ( ( (x) + 32 - ( x < 0 ) ) & -64 ) /* * The following macros have two purposes. diff --git a/src/3rdparty/freetype/include/freetype/internal/ftdebug.h b/src/3rdparty/freetype/include/freetype/internal/ftdebug.h index 54a9673a..df5357ad 100644 --- a/src/3rdparty/freetype/include/freetype/internal/ftdebug.h +++ b/src/3rdparty/freetype/include/freetype/internal/ftdebug.h @@ -4,7 +4,7 @@ * * Debugging and logging component (specification). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -27,7 +27,9 @@ #include #include FT_CONFIG_CONFIG_H -#include FT_FREETYPE_H +#include + +#include "compiler-macros.h" FT_BEGIN_HEADER @@ -56,7 +58,7 @@ FT_BEGIN_HEADER /* defining the enumeration */ typedef enum FT_Trace_ { -#include FT_INTERNAL_TRACE_H +#include trace_count } FT_Trace; diff --git a/src/3rdparty/freetype/include/freetype/internal/ftdriver.h b/src/3rdparty/freetype/include/freetype/internal/ftdriver.h deleted file mode 100644 index 16856d3d..00000000 --- a/src/3rdparty/freetype/include/freetype/internal/ftdriver.h +++ /dev/null @@ -1,409 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftdriver.h */ -/* */ -/* FreeType font driver interface (specification). */ -/* */ -/* Copyright 1996-2015 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __FTDRIVER_H__ -#define __FTDRIVER_H__ - - -#include -#include FT_MODULE_H - - -FT_BEGIN_HEADER - - - typedef FT_Error - (*FT_Face_InitFunc)( FT_Stream stream, - FT_Face face, - FT_Int typeface_index, - FT_Int num_params, - FT_Parameter* parameters ); - - typedef void - (*FT_Face_DoneFunc)( FT_Face face ); - - - typedef FT_Error - (*FT_Size_InitFunc)( FT_Size size ); - - typedef void - (*FT_Size_DoneFunc)( FT_Size size ); - - - typedef FT_Error - (*FT_Slot_InitFunc)( FT_GlyphSlot slot ); - - typedef void - (*FT_Slot_DoneFunc)( FT_GlyphSlot slot ); - - - typedef FT_Error - (*FT_Size_RequestFunc)( FT_Size size, - FT_Size_Request req ); - - typedef FT_Error - (*FT_Size_SelectFunc)( FT_Size size, - FT_ULong size_index ); - - typedef FT_Error - (*FT_Slot_LoadFunc)( FT_GlyphSlot slot, - FT_Size size, - FT_UInt glyph_index, - FT_Int32 load_flags ); - - - typedef FT_UInt - (*FT_CharMap_CharIndexFunc)( FT_CharMap charmap, - FT_Long charcode ); - - typedef FT_Long - (*FT_CharMap_CharNextFunc)( FT_CharMap charmap, - FT_Long charcode ); - - - typedef FT_Error - (*FT_Face_GetKerningFunc)( FT_Face face, - FT_UInt left_glyph, - FT_UInt right_glyph, - FT_Vector* kerning ); - - - typedef FT_Error - (*FT_Face_AttachFunc)( FT_Face face, - FT_Stream stream ); - - - typedef FT_Error - (*FT_Face_GetAdvancesFunc)( FT_Face face, - FT_UInt first, - FT_UInt count, - FT_Int32 flags, - FT_Fixed* advances ); - - - /*************************************************************************/ - /* */ - /* */ - /* FT_Driver_ClassRec */ - /* */ - /* */ - /* The font driver class. This structure mostly contains pointers to */ - /* driver methods. */ - /* */ - /* */ - /* root :: The parent module. */ - /* */ - /* face_object_size :: The size of a face object in bytes. */ - /* */ - /* size_object_size :: The size of a size object in bytes. */ - /* */ - /* slot_object_size :: The size of a glyph object in bytes. */ - /* */ - /* init_face :: The format-specific face constructor. */ - /* */ - /* done_face :: The format-specific face destructor. */ - /* */ - /* init_size :: The format-specific size constructor. */ - /* */ - /* done_size :: The format-specific size destructor. */ - /* */ - /* init_slot :: The format-specific slot constructor. */ - /* */ - /* done_slot :: The format-specific slot destructor. */ - /* */ - /* */ - /* load_glyph :: A function handle to load a glyph to a slot. */ - /* This field is mandatory! */ - /* */ - /* get_kerning :: A function handle to return the unscaled */ - /* kerning for a given pair of glyphs. Can be */ - /* set to 0 if the format doesn't support */ - /* kerning. */ - /* */ - /* attach_file :: This function handle is used to read */ - /* additional data for a face from another */ - /* file/stream. For example, this can be used to */ - /* add data from AFM or PFM files on a Type 1 */ - /* face, or a CIDMap on a CID-keyed face. */ - /* */ - /* get_advances :: A function handle used to return advance */ - /* widths of `count' glyphs (in font units), */ - /* starting at `first'. The `vertical' flag must */ - /* be set to get vertical advance heights. The */ - /* `advances' buffer is caller-allocated. */ - /* The idea of this function is to be able to */ - /* perform device-independent text layout without */ - /* loading a single glyph image. */ - /* */ - /* request_size :: A handle to a function used to request the new */ - /* character size. Can be set to 0 if the */ - /* scaling done in the base layer suffices. */ - /* */ - /* select_size :: A handle to a function used to select a new */ - /* fixed size. It is used only if */ - /* @FT_FACE_FLAG_FIXED_SIZES is set. Can be set */ - /* to 0 if the scaling done in the base layer */ - /* suffices. */ - /* */ - /* Most function pointers, with the exception of `load_glyph', can be */ - /* set to 0 to indicate a default behaviour. */ - /* */ - typedef struct FT_Driver_ClassRec_ - { - FT_Module_Class root; - - FT_Long face_object_size; - FT_Long size_object_size; - FT_Long slot_object_size; - - FT_Face_InitFunc init_face; - FT_Face_DoneFunc done_face; - - FT_Size_InitFunc init_size; - FT_Size_DoneFunc done_size; - - FT_Slot_InitFunc init_slot; - FT_Slot_DoneFunc done_slot; - - FT_Slot_LoadFunc load_glyph; - - FT_Face_GetKerningFunc get_kerning; - FT_Face_AttachFunc attach_file; - FT_Face_GetAdvancesFunc get_advances; - - /* since version 2.2 */ - FT_Size_RequestFunc request_size; - FT_Size_SelectFunc select_size; - - } FT_Driver_ClassRec, *FT_Driver_Class; - - - /*************************************************************************/ - /* */ - /* */ - /* FT_DECLARE_DRIVER */ - /* */ - /* */ - /* Used to create a forward declaration of an FT_Driver_ClassRec */ - /* struct instance. */ - /* */ - /* */ - /* FT_DEFINE_DRIVER */ - /* */ - /* */ - /* Used to initialize an instance of FT_Driver_ClassRec struct. */ - /* */ - /* When FT_CONFIG_OPTION_PIC is defined a `create' function has to be */ - /* called with a pointer where the allocated structure is returned. */ - /* And when it is no longer needed a `destroy' function needs to be */ - /* called to release that allocation. */ - /* */ - /* `fcinit.c' (ft_create_default_module_classes) already contains a */ - /* mechanism to call these functions for the default modules */ - /* described in `ftmodule.h'. */ - /* */ - /* Notice that the created `create' and `destroy' functions call */ - /* `pic_init' and `pic_free' to allow you to manually allocate and */ - /* initialize any additional global data, like a module specific */ - /* interface, and put them in the global pic container defined in */ - /* `ftpic.h'. If you don't need them just implement the functions as */ - /* empty to resolve the link error. Also the `pic_init' and */ - /* `pic_free' functions should be declared in `pic.h', to be referred */ - /* by driver definition calling `FT_DEFINE_DRIVER' in following. */ - /* */ - /* When FT_CONFIG_OPTION_PIC is not defined the struct will be */ - /* allocated in the global scope (or the scope where the macro is */ - /* used). */ - /* */ -#ifndef FT_CONFIG_OPTION_PIC - -#define FT_DECLARE_DRIVER( class_ ) \ - FT_CALLBACK_TABLE \ - const FT_Driver_ClassRec class_; - -#define FT_DEFINE_DRIVER( \ - class_, \ - flags_, \ - size_, \ - name_, \ - version_, \ - requires_, \ - interface_, \ - init_, \ - done_, \ - get_interface_, \ - face_object_size_, \ - size_object_size_, \ - slot_object_size_, \ - init_face_, \ - done_face_, \ - init_size_, \ - done_size_, \ - init_slot_, \ - done_slot_, \ - load_glyph_, \ - get_kerning_, \ - attach_file_, \ - get_advances_, \ - request_size_, \ - select_size_ ) \ - FT_CALLBACK_TABLE_DEF \ - const FT_Driver_ClassRec class_ = \ - { \ - FT_DEFINE_ROOT_MODULE( flags_, \ - size_, \ - name_, \ - version_, \ - requires_, \ - interface_, \ - init_, \ - done_, \ - get_interface_ ) \ - \ - face_object_size_, \ - size_object_size_, \ - slot_object_size_, \ - \ - init_face_, \ - done_face_, \ - \ - init_size_, \ - done_size_, \ - \ - init_slot_, \ - done_slot_, \ - \ - load_glyph_, \ - \ - get_kerning_, \ - attach_file_, \ - get_advances_, \ - \ - request_size_, \ - select_size_ \ - }; - -#else /* FT_CONFIG_OPTION_PIC */ - -#define FT_DECLARE_DRIVER( class_ ) FT_DECLARE_MODULE( class_ ) - -#define FT_DEFINE_DRIVER( \ - class_, \ - flags_, \ - size_, \ - name_, \ - version_, \ - requires_, \ - interface_, \ - init_, \ - done_, \ - get_interface_, \ - face_object_size_, \ - size_object_size_, \ - slot_object_size_, \ - init_face_, \ - done_face_, \ - init_size_, \ - done_size_, \ - init_slot_, \ - done_slot_, \ - load_glyph_, \ - get_kerning_, \ - attach_file_, \ - get_advances_, \ - request_size_, \ - select_size_ ) \ - void \ - FT_Destroy_Class_ ## class_( FT_Library library, \ - FT_Module_Class* clazz ) \ - { \ - FT_Memory memory = library->memory; \ - FT_Driver_Class dclazz = (FT_Driver_Class)clazz; \ - \ - \ - class_ ## _pic_free( library ); \ - if ( dclazz ) \ - FT_FREE( dclazz ); \ - } \ - \ - \ - FT_Error \ - FT_Create_Class_ ## class_( FT_Library library, \ - FT_Module_Class** output_class ) \ - { \ - FT_Driver_Class clazz = NULL; \ - FT_Error error; \ - FT_Memory memory = library->memory; \ - \ - \ - if ( FT_ALLOC( clazz, sizeof ( *clazz ) ) ) \ - return error; \ - \ - error = class_ ## _pic_init( library ); \ - if ( error ) \ - { \ - FT_FREE( clazz ); \ - return error; \ - } \ - \ - FT_DEFINE_ROOT_MODULE( flags_, \ - size_, \ - name_, \ - version_, \ - requires_, \ - interface_, \ - init_, \ - done_, \ - get_interface_ ) \ - \ - clazz->face_object_size = face_object_size_; \ - clazz->size_object_size = size_object_size_; \ - clazz->slot_object_size = slot_object_size_; \ - \ - clazz->init_face = init_face_; \ - clazz->done_face = done_face_; \ - \ - clazz->init_size = init_size_; \ - clazz->done_size = done_size_; \ - \ - clazz->init_slot = init_slot_; \ - clazz->done_slot = done_slot_; \ - \ - clazz->load_glyph = load_glyph_; \ - \ - clazz->get_kerning = get_kerning_; \ - clazz->attach_file = attach_file_; \ - clazz->get_advances = get_advances_; \ - \ - clazz->request_size = request_size_; \ - clazz->select_size = select_size_; \ - \ - *output_class = (FT_Module_Class*)clazz; \ - \ - return FT_Err_Ok; \ - } - - -#endif /* FT_CONFIG_OPTION_PIC */ - -FT_END_HEADER - -#endif /* __FTDRIVER_H__ */ - - -/* END */ diff --git a/src/3rdparty/freetype/include/freetype/internal/ftdrv.h b/src/3rdparty/freetype/include/freetype/internal/ftdrv.h index 09e846e1..7f22710e 100644 --- a/src/3rdparty/freetype/include/freetype/internal/ftdrv.h +++ b/src/3rdparty/freetype/include/freetype/internal/ftdrv.h @@ -4,7 +4,7 @@ * * FreeType internal font driver interface (specification). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -20,9 +20,9 @@ #define FTDRV_H_ -#include -#include FT_MODULE_H +#include +#include "compiler-macros.h" FT_BEGIN_HEADER diff --git a/src/3rdparty/freetype/include/freetype/internal/ftgloadr.h b/src/3rdparty/freetype/include/freetype/internal/ftgloadr.h index 770871d8..27b8659f 100644 --- a/src/3rdparty/freetype/include/freetype/internal/ftgloadr.h +++ b/src/3rdparty/freetype/include/freetype/internal/ftgloadr.h @@ -4,7 +4,7 @@ * * The FreeType glyph loader (specification). * - * Copyright (C) 2002-2019 by + * Copyright (C) 2002-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg * * This file is part of the FreeType project, and may only be used, @@ -20,8 +20,7 @@ #define FTGLOADR_H_ -#include -#include FT_FREETYPE_H +#include FT_BEGIN_HEADER @@ -138,8 +137,6 @@ FT_BEGIN_HEADER FT_BASE( void ) FT_GlyphLoader_Add( FT_GlyphLoader loader ); - /* */ - FT_END_HEADER diff --git a/src/3rdparty/freetype/include/freetype/internal/fthash.h b/src/3rdparty/freetype/include/freetype/internal/fthash.h index 24918804..622ec76b 100644 --- a/src/3rdparty/freetype/include/freetype/internal/fthash.h +++ b/src/3rdparty/freetype/include/freetype/internal/fthash.h @@ -43,8 +43,7 @@ #define FTHASH_H_ -#include -#include FT_FREETYPE_H +#include FT_BEGIN_HEADER diff --git a/src/3rdparty/freetype/include/freetype/internal/ftmemory.h b/src/3rdparty/freetype/include/freetype/internal/ftmemory.h index 78bd3bc2..ddb18b05 100644 --- a/src/3rdparty/freetype/include/freetype/internal/ftmemory.h +++ b/src/3rdparty/freetype/include/freetype/internal/ftmemory.h @@ -4,7 +4,7 @@ * * The FreeType memory management macros (specification). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg * * This file is part of the FreeType project, and may only be used, @@ -22,8 +22,9 @@ #include #include FT_CONFIG_CONFIG_H -#include FT_TYPES_H +#include +#include "compiler-macros.h" FT_BEGIN_HEADER @@ -57,6 +58,14 @@ FT_BEGIN_HEADER /*************************************************************************/ + /* The calculation `NULL + n' is undefined in C. Even if the resulting */ + /* pointer doesn't get dereferenced, this causes warnings with */ + /* sanitizers. */ + /* */ + /* We thus provide a macro that should be used if `base' can be NULL. */ +#define FT_OFFSET( base, count ) ( (base) ? (base) + (count) : NULL ) + + /* * C++ refuses to handle statements like p = (void*)anything, with `p' a * typed pointer. Since we don't have a `typeof' operator in standard C++, @@ -153,10 +162,10 @@ extern "C++" (FT_Long)(size), \ &error ) ) -#define FT_MEM_FREE( ptr ) \ - FT_BEGIN_STMNT \ - ft_mem_free( memory, (ptr) ); \ - (ptr) = NULL; \ +#define FT_MEM_FREE( ptr ) \ + FT_BEGIN_STMNT \ + FT_DEBUG_INNER( ft_mem_free( memory, (ptr) ) ); \ + (ptr) = NULL; \ FT_END_STMNT #define FT_MEM_NEW( ptr ) \ @@ -381,8 +390,6 @@ extern "C++" #define FT_STRCPYN( dst, src, size ) \ ft_mem_strcpyn( (char*)dst, (const char*)(src), (FT_ULong)(size) ) - /* */ - FT_END_HEADER diff --git a/src/3rdparty/freetype/include/freetype/internal/ftobjs.h b/src/3rdparty/freetype/include/freetype/internal/ftobjs.h index 0c1d3e5b..25db2c49 100644 --- a/src/3rdparty/freetype/include/freetype/internal/ftobjs.h +++ b/src/3rdparty/freetype/include/freetype/internal/ftobjs.h @@ -4,7 +4,7 @@ * * The FreeType private base classes (specification). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -26,21 +26,21 @@ #ifndef FTOBJS_H_ #define FTOBJS_H_ -#include -#include FT_RENDER_H -#include FT_SIZES_H -#include FT_LCD_FILTER_H -#include FT_INTERNAL_MEMORY_H -#include FT_INTERNAL_GLYPH_LOADER_H -#include FT_INTERNAL_DRIVER_H -#include FT_INTERNAL_AUTOHINT_H -#include FT_INTERNAL_SERVICE_H -#include FT_INTERNAL_CALC_H +#include +#include +#include +#include +#include +#include +#include +#include +#include #ifdef FT_CONFIG_OPTION_INCREMENTAL -#include FT_INCREMENTAL_H +#include #endif +#include "compiler-macros.h" FT_BEGIN_HEADER @@ -226,8 +226,8 @@ FT_BEGIN_HEADER } FT_CMap_ClassRec; -#define FT_DECLARE_CMAP_CLASS( class_ ) \ - FT_CALLBACK_TABLE const FT_CMap_ClassRec class_; +#define FT_DECLARE_CMAP_CLASS( class_ ) \ + FT_CALLBACK_TABLE const FT_CMap_ClassRec class_; #define FT_DEFINE_CMAP_CLASS( \ class_, \ @@ -653,7 +653,7 @@ FT_BEGIN_HEADER FT_BASE( void ) FT_Done_GlyphSlot( FT_GlyphSlot slot ); - /* */ + /* */ #define FT_REQUEST_WIDTH( req ) \ ( (req)->horiResolution \ @@ -1057,6 +1057,9 @@ FT_BEGIN_HEADER * The struct will be allocated in the global scope (or the scope where * the macro is used). */ +#define FT_DECLARE_GLYPH( class_ ) \ + FT_CALLBACK_TABLE const FT_Glyph_Class class_; + #define FT_DEFINE_GLYPH( \ class_, \ size_, \ diff --git a/src/3rdparty/freetype/include/freetype/internal/ftpic.h b/src/3rdparty/freetype/include/freetype/internal/ftpic.h deleted file mode 100644 index 5214f059..00000000 --- a/src/3rdparty/freetype/include/freetype/internal/ftpic.h +++ /dev/null @@ -1,71 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftpic.h */ -/* */ -/* The FreeType position independent code services (declaration). */ -/* */ -/* Copyright 2009-2018 by */ -/* Oran Agra and Mickey Gabel. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - /*************************************************************************/ - /* */ - /* Modules that ordinarily have const global data that need address */ - /* can instead define pointers here. */ - /* */ - /*************************************************************************/ - - -#ifndef FTPIC_H_ -#define FTPIC_H_ - - -FT_BEGIN_HEADER - -#ifdef FT_CONFIG_OPTION_PIC - - typedef struct FT_PIC_Container_ - { - /* pic containers for base */ - void* base; - - /* pic containers for modules */ - void* autofit; - void* cff; - void* pshinter; - void* psnames; - void* raster; - void* sfnt; - void* smooth; - void* truetype; - - } FT_PIC_Container; - - - /* Initialize the various function tables, structs, etc. */ - /* stored in the container. */ - FT_BASE( FT_Error ) - ft_pic_container_init( FT_Library library ); - - - /* Destroy the contents of the container. */ - FT_BASE( void ) - ft_pic_container_destroy( FT_Library library ); - -#endif /* FT_CONFIG_OPTION_PIC */ - - /* */ - -FT_END_HEADER - -#endif /* FTPIC_H_ */ - - -/* END */ diff --git a/src/3rdparty/freetype/include/freetype/internal/ftpsprop.h b/src/3rdparty/freetype/include/freetype/internal/ftpsprop.h index 574837f6..81ec2915 100644 --- a/src/3rdparty/freetype/include/freetype/internal/ftpsprop.h +++ b/src/3rdparty/freetype/include/freetype/internal/ftpsprop.h @@ -4,7 +4,7 @@ * * Get and set properties of PostScript drivers (specification). * - * Copyright (C) 2017-2019 by + * Copyright (C) 2017-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -20,8 +20,7 @@ #define FTPSPROP_H_ -#include -#include FT_FREETYPE_H +#include FT_BEGIN_HEADER diff --git a/src/3rdparty/freetype/include/freetype/internal/ftrfork.h b/src/3rdparty/freetype/include/freetype/internal/ftrfork.h index 75b3e531..1b7b25ac 100644 --- a/src/3rdparty/freetype/include/freetype/internal/ftrfork.h +++ b/src/3rdparty/freetype/include/freetype/internal/ftrfork.h @@ -4,7 +4,7 @@ * * Embedded resource forks accessor (specification). * - * Copyright (C) 2004-2019 by + * Copyright (C) 2004-2020 by * Masatake YAMATO and Redhat K.K. * * This file is part of the FreeType project, and may only be used, @@ -25,8 +25,7 @@ #define FTRFORK_H_ -#include -#include FT_INTERNAL_OBJECTS_H +#include FT_BEGIN_HEADER diff --git a/src/3rdparty/freetype/include/freetype/internal/ftserv.h b/src/3rdparty/freetype/include/freetype/internal/ftserv.h index 8836cf3f..6e1a9472 100644 --- a/src/3rdparty/freetype/include/freetype/internal/ftserv.h +++ b/src/3rdparty/freetype/include/freetype/internal/ftserv.h @@ -4,7 +4,7 @@ * * The FreeType services (specification only). * - * Copyright (C) 2003-2019 by + * Copyright (C) 2003-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -31,6 +31,7 @@ #ifndef FTSERV_H_ #define FTSERV_H_ +#include "compiler-macros.h" FT_BEGIN_HEADER @@ -486,33 +487,6 @@ FT_BEGIN_HEADER /* */ - /* - * The header files containing the services. - */ - -#define FT_SERVICE_BDF_H -#define FT_SERVICE_CFF_TABLE_LOAD_H -#define FT_SERVICE_CID_H -#define FT_SERVICE_FONT_FORMAT_H -#define FT_SERVICE_GLYPH_DICT_H -#define FT_SERVICE_GX_VALIDATE_H -#define FT_SERVICE_KERNING_H -#define FT_SERVICE_METRICS_VARIATIONS_H -#define FT_SERVICE_MULTIPLE_MASTERS_H -#define FT_SERVICE_OPENTYPE_VALIDATE_H -#define FT_SERVICE_PFR_H -#define FT_SERVICE_POSTSCRIPT_CMAPS_H -#define FT_SERVICE_POSTSCRIPT_INFO_H -#define FT_SERVICE_POSTSCRIPT_NAME_H -#define FT_SERVICE_PROPERTIES_H -#define FT_SERVICE_SFNT_H -#define FT_SERVICE_TRUETYPE_ENGINE_H -#define FT_SERVICE_TRUETYPE_GLYF_H -#define FT_SERVICE_TT_CMAP_H -#define FT_SERVICE_WINFNT_H - - /* */ - FT_END_HEADER #endif /* FTSERV_H_ */ diff --git a/src/3rdparty/freetype/include/freetype/internal/ftstream.h b/src/3rdparty/freetype/include/freetype/internal/ftstream.h index a579a039..e7d92226 100644 --- a/src/3rdparty/freetype/include/freetype/internal/ftstream.h +++ b/src/3rdparty/freetype/include/freetype/internal/ftstream.h @@ -4,7 +4,7 @@ * * Stream handling (specification). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -21,8 +21,8 @@ #include -#include FT_SYSTEM_H -#include FT_INTERNAL_OBJECTS_H +#include +#include FT_BEGIN_HEADER diff --git a/src/3rdparty/freetype/include/freetype/internal/fttrace.h b/src/3rdparty/freetype/include/freetype/internal/fttrace.h index f5f95980..58bd7741 100644 --- a/src/3rdparty/freetype/include/freetype/internal/fttrace.h +++ b/src/3rdparty/freetype/include/freetype/internal/fttrace.h @@ -4,7 +4,7 @@ * * Tracing handling (specification only). * - * Copyright (C) 2002-2019 by + * Copyright (C) 2002-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -49,6 +49,7 @@ FT_TRACE_DEF( cache ) /* cache sub-system (ftcache.c, etc.) */ FT_TRACE_DEF( sfdriver ) /* SFNT font driver (sfdriver.c) */ FT_TRACE_DEF( sfobjs ) /* SFNT object handler (sfobjs.c) */ FT_TRACE_DEF( sfwoff ) /* WOFF format handler (sfwoff.c) */ +FT_TRACE_DEF( sfwoff2 ) /* WOFF2 format handler (sfwoff2.c) */ FT_TRACE_DEF( ttbdf ) /* TrueType embedded BDF (ttbdf.c) */ FT_TRACE_DEF( ttcmap ) /* charmap handler (ttcmap.c) */ FT_TRACE_DEF( ttcolr ) /* glyph layer table (ttcolr.c) */ diff --git a/src/3rdparty/freetype/include/freetype/internal/ftvalid.h b/src/3rdparty/freetype/include/freetype/internal/ftvalid.h index 38aa06cc..a5bc6c9b 100644 --- a/src/3rdparty/freetype/include/freetype/internal/ftvalid.h +++ b/src/3rdparty/freetype/include/freetype/internal/ftvalid.h @@ -4,7 +4,7 @@ * * FreeType validation support (specification). * - * Copyright (C) 2004-2019 by + * Copyright (C) 2004-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -20,8 +20,9 @@ #define FTVALID_H_ #include -#include FT_CONFIG_STANDARD_LIBRARY_H /* for ft_setjmp and ft_longjmp */ +#include FT_CONFIG_STANDARD_LIBRARY_H /* for ft_jmpbuf */ +#include "compiler-macros.h" FT_BEGIN_HEADER diff --git a/src/3rdparty/freetype/include/freetype/internal/internal.h b/src/3rdparty/freetype/include/freetype/internal/internal.h deleted file mode 100644 index 3c8830f7..00000000 --- a/src/3rdparty/freetype/include/freetype/internal/internal.h +++ /dev/null @@ -1,67 +0,0 @@ -/**************************************************************************** - * - * internal.h - * - * Internal header files (specification only). - * - * Copyright (C) 1996-2019 by - * David Turner, Robert Wilhelm, and Werner Lemberg. - * - * This file is part of the FreeType project, and may only be used, - * modified, and distributed under the terms of the FreeType project - * license, LICENSE.TXT. By continuing to use, modify, or distribute - * this file you indicate that you have read the license and - * understand and accept it fully. - * - */ - - - /************************************************************************** - * - * This file is automatically included by `ft2build.h`. Do not include it - * manually! - * - */ - - -#define FT_INTERNAL_OBJECTS_H -#define FT_INTERNAL_STREAM_H -#define FT_INTERNAL_MEMORY_H -#define FT_INTERNAL_DEBUG_H -#define FT_INTERNAL_CALC_H -#define FT_INTERNAL_HASH_H -#define FT_INTERNAL_DRIVER_H -#define FT_INTERNAL_TRACE_H -#define FT_INTERNAL_GLYPH_LOADER_H -#define FT_INTERNAL_SFNT_H -#define FT_INTERNAL_SERVICE_H -#define FT_INTERNAL_RFORK_H -#define FT_INTERNAL_VALIDATE_H - -#define FT_INTERNAL_TRUETYPE_TYPES_H -#define FT_INTERNAL_TYPE1_TYPES_H -#define FT_INTERNAL_WOFF_TYPES_H - -#define FT_INTERNAL_POSTSCRIPT_AUX_H -#define FT_INTERNAL_POSTSCRIPT_HINTS_H -#define FT_INTERNAL_POSTSCRIPT_PROPS_H - -#define FT_INTERNAL_AUTOHINT_H - -#define FT_INTERNAL_CFF_TYPES_H -#define FT_INTERNAL_CFF_OBJECTS_TYPES_H - - -#if defined( _MSC_VER ) /* Visual C++ (and Intel C++) */ - - /* We disable the warning `conditional expression is constant' here */ - /* in order to compile cleanly with the maximum level of warnings. */ - /* In particular, the warning complains about stuff like `while(0)' */ - /* which is very useful in macro definitions. There is no benefit */ - /* in having it enabled. */ -#pragma warning( disable : 4127 ) - -#endif /* _MSC_VER */ - - -/* END */ diff --git a/src/3rdparty/freetype/include/freetype/internal/psaux.h b/src/3rdparty/freetype/include/freetype/internal/psaux.h index f962a973..8e0a262f 100644 --- a/src/3rdparty/freetype/include/freetype/internal/psaux.h +++ b/src/3rdparty/freetype/include/freetype/internal/psaux.h @@ -5,7 +5,7 @@ * Auxiliary functions and data structures related to PostScript fonts * (specification). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -21,14 +21,13 @@ #define PSAUX_H_ -#include -#include FT_INTERNAL_OBJECTS_H -#include FT_INTERNAL_TYPE1_TYPES_H -#include FT_INTERNAL_HASH_H -#include FT_INTERNAL_TRUETYPE_TYPES_H -#include FT_SERVICE_POSTSCRIPT_CMAPS_H -#include FT_INTERNAL_CFF_TYPES_H -#include FT_INTERNAL_CFF_OBJECTS_TYPES_H +#include +#include +#include +#include +#include +#include +#include diff --git a/src/3rdparty/freetype/include/freetype/internal/pshints.h b/src/3rdparty/freetype/include/freetype/internal/pshints.h index 699acea6..663e9d34 100644 --- a/src/3rdparty/freetype/include/freetype/internal/pshints.h +++ b/src/3rdparty/freetype/include/freetype/internal/pshints.h @@ -6,7 +6,7 @@ * recorders (specification only). These are used to support native * T1/T2 hints in the 'type1', 'cid', and 'cff' font drivers. * - * Copyright (C) 2001-2019 by + * Copyright (C) 2001-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -22,9 +22,8 @@ #define PSHINTS_H_ -#include -#include FT_FREETYPE_H -#include FT_TYPE1_TABLES_H +#include +#include FT_BEGIN_HEADER diff --git a/src/3rdparty/freetype/include/freetype/internal/services/svbdf.h b/src/3rdparty/freetype/include/freetype/internal/services/svbdf.h index e4786ed0..81f5a06b 100644 --- a/src/3rdparty/freetype/include/freetype/internal/services/svbdf.h +++ b/src/3rdparty/freetype/include/freetype/internal/services/svbdf.h @@ -4,7 +4,7 @@ * * The FreeType BDF services (specification). * - * Copyright (C) 2003-2019 by + * Copyright (C) 2003-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -19,8 +19,8 @@ #ifndef SVBDF_H_ #define SVBDF_H_ -#include FT_BDF_H -#include FT_INTERNAL_SERVICE_H +#include +#include FT_BEGIN_HEADER diff --git a/src/3rdparty/freetype/include/freetype/internal/services/svcfftl.h b/src/3rdparty/freetype/include/freetype/internal/services/svcfftl.h index 6c621732..1d2dbb6a 100644 --- a/src/3rdparty/freetype/include/freetype/internal/services/svcfftl.h +++ b/src/3rdparty/freetype/include/freetype/internal/services/svcfftl.h @@ -4,7 +4,7 @@ * * The FreeType CFF tables loader service (specification). * - * Copyright (C) 2017-2019 by + * Copyright (C) 2017-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -19,8 +19,8 @@ #ifndef SVCFFTL_H_ #define SVCFFTL_H_ -#include FT_INTERNAL_SERVICE_H -#include FT_INTERNAL_CFF_TYPES_H +#include +#include FT_BEGIN_HEADER diff --git a/src/3rdparty/freetype/include/freetype/internal/services/svcid.h b/src/3rdparty/freetype/include/freetype/internal/services/svcid.h index 555a5af5..bd49f327 100644 --- a/src/3rdparty/freetype/include/freetype/internal/services/svcid.h +++ b/src/3rdparty/freetype/include/freetype/internal/services/svcid.h @@ -4,7 +4,7 @@ * * The FreeType CID font services (specification). * - * Copyright (C) 2007-2019 by + * Copyright (C) 2007-2020 by * Derek Clegg and Michael Toftdal. * * This file is part of the FreeType project, and may only be used, @@ -19,7 +19,7 @@ #ifndef SVCID_H_ #define SVCID_H_ -#include FT_INTERNAL_SERVICE_H +#include FT_BEGIN_HEADER diff --git a/src/3rdparty/freetype/include/freetype/internal/services/svfntfmt.h b/src/3rdparty/freetype/include/freetype/internal/services/svfntfmt.h index 6f4285ea..6114d638 100644 --- a/src/3rdparty/freetype/include/freetype/internal/services/svfntfmt.h +++ b/src/3rdparty/freetype/include/freetype/internal/services/svfntfmt.h @@ -4,7 +4,7 @@ * * The FreeType font format service (specification only). * - * Copyright (C) 2003-2019 by + * Copyright (C) 2003-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -19,7 +19,7 @@ #ifndef SVFNTFMT_H_ #define SVFNTFMT_H_ -#include FT_INTERNAL_SERVICE_H +#include FT_BEGIN_HEADER diff --git a/src/3rdparty/freetype/include/freetype/internal/services/svgldict.h b/src/3rdparty/freetype/include/freetype/internal/services/svgldict.h index 09496218..f9443e40 100644 --- a/src/3rdparty/freetype/include/freetype/internal/services/svgldict.h +++ b/src/3rdparty/freetype/include/freetype/internal/services/svgldict.h @@ -4,7 +4,7 @@ * * The FreeType glyph dictionary services (specification). * - * Copyright (C) 2003-2019 by + * Copyright (C) 2003-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -19,7 +19,7 @@ #ifndef SVGLDICT_H_ #define SVGLDICT_H_ -#include FT_INTERNAL_SERVICE_H +#include FT_BEGIN_HEADER diff --git a/src/3rdparty/freetype/include/freetype/internal/services/svgxval.h b/src/3rdparty/freetype/include/freetype/internal/services/svgxval.h index 0bb76f31..83c2f26c 100644 --- a/src/3rdparty/freetype/include/freetype/internal/services/svgxval.h +++ b/src/3rdparty/freetype/include/freetype/internal/services/svgxval.h @@ -4,7 +4,7 @@ * * FreeType API for validating TrueTypeGX/AAT tables (specification). * - * Copyright (C) 2004-2019 by + * Copyright (C) 2004-2020 by * Masatake YAMATO, Red Hat K.K., * David Turner, Robert Wilhelm, and Werner Lemberg. * @@ -28,8 +28,8 @@ #ifndef SVGXVAL_H_ #define SVGXVAL_H_ -#include FT_GX_VALIDATE_H -#include FT_INTERNAL_VALIDATE_H +#include +#include FT_BEGIN_HEADER diff --git a/src/3rdparty/freetype/include/freetype/internal/services/svkern.h b/src/3rdparty/freetype/include/freetype/internal/services/svkern.h index f992a327..13cfb327 100644 --- a/src/3rdparty/freetype/include/freetype/internal/services/svkern.h +++ b/src/3rdparty/freetype/include/freetype/internal/services/svkern.h @@ -4,7 +4,7 @@ * * The FreeType Kerning service (specification). * - * Copyright (C) 2006-2019 by + * Copyright (C) 2006-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -19,8 +19,8 @@ #ifndef SVKERN_H_ #define SVKERN_H_ -#include FT_INTERNAL_SERVICE_H -#include FT_TRUETYPE_TABLES_H +#include +#include FT_BEGIN_HEADER diff --git a/src/3rdparty/freetype/include/freetype/internal/services/svmetric.h b/src/3rdparty/freetype/include/freetype/internal/services/svmetric.h index d688bc7c..2b30edaa 100644 --- a/src/3rdparty/freetype/include/freetype/internal/services/svmetric.h +++ b/src/3rdparty/freetype/include/freetype/internal/services/svmetric.h @@ -4,7 +4,7 @@ * * The FreeType services for metrics variations (specification). * - * Copyright (C) 2016-2019 by + * Copyright (C) 2016-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -19,7 +19,7 @@ #ifndef SVMETRIC_H_ #define SVMETRIC_H_ -#include FT_INTERNAL_SERVICE_H +#include FT_BEGIN_HEADER diff --git a/src/3rdparty/freetype/include/freetype/internal/services/svmm.h b/src/3rdparty/freetype/include/freetype/internal/services/svmm.h index 3652f205..5a807636 100644 --- a/src/3rdparty/freetype/include/freetype/internal/services/svmm.h +++ b/src/3rdparty/freetype/include/freetype/internal/services/svmm.h @@ -4,7 +4,7 @@ * * The FreeType Multiple Masters and GX var services (specification). * - * Copyright (C) 2003-2019 by + * Copyright (C) 2003-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -19,7 +19,7 @@ #ifndef SVMM_H_ #define SVMM_H_ -#include FT_INTERNAL_SERVICE_H +#include FT_BEGIN_HEADER diff --git a/src/3rdparty/freetype/include/freetype/internal/services/svotval.h b/src/3rdparty/freetype/include/freetype/internal/services/svotval.h index cab4c6ef..763fb2ef 100644 --- a/src/3rdparty/freetype/include/freetype/internal/services/svotval.h +++ b/src/3rdparty/freetype/include/freetype/internal/services/svotval.h @@ -4,7 +4,7 @@ * * The FreeType OpenType validation service (specification). * - * Copyright (C) 2004-2019 by + * Copyright (C) 2004-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -19,8 +19,8 @@ #ifndef SVOTVAL_H_ #define SVOTVAL_H_ -#include FT_OPENTYPE_VALIDATE_H -#include FT_INTERNAL_VALIDATE_H +#include +#include FT_BEGIN_HEADER diff --git a/src/3rdparty/freetype/include/freetype/internal/services/svpfr.h b/src/3rdparty/freetype/include/freetype/internal/services/svpfr.h index fd01d614..bdeba078 100644 --- a/src/3rdparty/freetype/include/freetype/internal/services/svpfr.h +++ b/src/3rdparty/freetype/include/freetype/internal/services/svpfr.h @@ -4,7 +4,7 @@ * * Internal PFR service functions (specification). * - * Copyright (C) 2003-2019 by + * Copyright (C) 2003-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -19,8 +19,8 @@ #ifndef SVPFR_H_ #define SVPFR_H_ -#include FT_PFR_H -#include FT_INTERNAL_SERVICE_H +#include +#include FT_BEGIN_HEADER @@ -56,7 +56,6 @@ FT_BEGIN_HEADER }; - /* */ FT_END_HEADER diff --git a/src/3rdparty/freetype/include/freetype/internal/services/svpostnm.h b/src/3rdparty/freetype/include/freetype/internal/services/svpostnm.h index 18e3843c..8ef62c5f 100644 --- a/src/3rdparty/freetype/include/freetype/internal/services/svpostnm.h +++ b/src/3rdparty/freetype/include/freetype/internal/services/svpostnm.h @@ -4,7 +4,7 @@ * * The FreeType PostScript name services (specification). * - * Copyright (C) 2003-2019 by + * Copyright (C) 2003-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -19,7 +19,7 @@ #ifndef SVPOSTNM_H_ #define SVPOSTNM_H_ -#include FT_INTERNAL_SERVICE_H +#include FT_BEGIN_HEADER diff --git a/src/3rdparty/freetype/include/freetype/internal/services/svprop.h b/src/3rdparty/freetype/include/freetype/internal/services/svprop.h index e48d0151..8f755436 100644 --- a/src/3rdparty/freetype/include/freetype/internal/services/svprop.h +++ b/src/3rdparty/freetype/include/freetype/internal/services/svprop.h @@ -4,7 +4,7 @@ * * The FreeType property service (specification). * - * Copyright (C) 2012-2019 by + * Copyright (C) 2012-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, diff --git a/src/3rdparty/freetype/include/freetype/internal/services/svpscmap.h b/src/3rdparty/freetype/include/freetype/internal/services/svpscmap.h index dfac3baf..b4dcd807 100644 --- a/src/3rdparty/freetype/include/freetype/internal/services/svpscmap.h +++ b/src/3rdparty/freetype/include/freetype/internal/services/svpscmap.h @@ -4,7 +4,7 @@ * * The FreeType PostScript charmap service (specification). * - * Copyright (C) 2003-2019 by + * Copyright (C) 2003-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -19,7 +19,7 @@ #ifndef SVPSCMAP_H_ #define SVPSCMAP_H_ -#include FT_INTERNAL_OBJECTS_H +#include FT_BEGIN_HEADER diff --git a/src/3rdparty/freetype/include/freetype/internal/services/svpsinfo.h b/src/3rdparty/freetype/include/freetype/internal/services/svpsinfo.h index fb4e0e3f..1e7276ff 100644 --- a/src/3rdparty/freetype/include/freetype/internal/services/svpsinfo.h +++ b/src/3rdparty/freetype/include/freetype/internal/services/svpsinfo.h @@ -4,7 +4,7 @@ * * The FreeType PostScript info service (specification). * - * Copyright (C) 2003-2019 by + * Copyright (C) 2003-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -19,8 +19,8 @@ #ifndef SVPSINFO_H_ #define SVPSINFO_H_ -#include FT_INTERNAL_SERVICE_H -#include FT_INTERNAL_TYPE1_TYPES_H +#include +#include FT_BEGIN_HEADER diff --git a/src/3rdparty/freetype/include/freetype/internal/services/svsfnt.h b/src/3rdparty/freetype/include/freetype/internal/services/svsfnt.h index 464aa209..39c8b5e1 100644 --- a/src/3rdparty/freetype/include/freetype/internal/services/svsfnt.h +++ b/src/3rdparty/freetype/include/freetype/internal/services/svsfnt.h @@ -4,7 +4,7 @@ * * The FreeType SFNT table loading service (specification). * - * Copyright (C) 2003-2019 by + * Copyright (C) 2003-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -19,8 +19,8 @@ #ifndef SVSFNT_H_ #define SVSFNT_H_ -#include FT_INTERNAL_SERVICE_H -#include FT_TRUETYPE_TABLES_H +#include +#include FT_BEGIN_HEADER diff --git a/src/3rdparty/freetype/include/freetype/internal/services/svttcmap.h b/src/3rdparty/freetype/include/freetype/internal/services/svttcmap.h index 0fcb8137..c18bb233 100644 --- a/src/3rdparty/freetype/include/freetype/internal/services/svttcmap.h +++ b/src/3rdparty/freetype/include/freetype/internal/services/svttcmap.h @@ -4,7 +4,7 @@ * * The FreeType TrueType/sfnt cmap extra information service. * - * Copyright (C) 2003-2019 by + * Copyright (C) 2003-2020 by * Masatake YAMATO, Redhat K.K., * David Turner, Robert Wilhelm, and Werner Lemberg. * @@ -22,8 +22,8 @@ #ifndef SVTTCMAP_H_ #define SVTTCMAP_H_ -#include FT_INTERNAL_SERVICE_H -#include FT_TRUETYPE_TABLES_H +#include +#include FT_BEGIN_HEADER diff --git a/src/3rdparty/freetype/include/freetype/internal/services/svtteng.h b/src/3rdparty/freetype/include/freetype/internal/services/svtteng.h index a852f5c6..7a17e4a7 100644 --- a/src/3rdparty/freetype/include/freetype/internal/services/svtteng.h +++ b/src/3rdparty/freetype/include/freetype/internal/services/svtteng.h @@ -4,7 +4,7 @@ * * The FreeType TrueType engine query service (specification). * - * Copyright (C) 2006-2019 by + * Copyright (C) 2006-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -19,8 +19,8 @@ #ifndef SVTTENG_H_ #define SVTTENG_H_ -#include FT_INTERNAL_SERVICE_H -#include FT_MODULE_H +#include +#include FT_BEGIN_HEADER diff --git a/src/3rdparty/freetype/include/freetype/internal/services/svttglyf.h b/src/3rdparty/freetype/include/freetype/internal/services/svttglyf.h index c8798771..90a81dd4 100644 --- a/src/3rdparty/freetype/include/freetype/internal/services/svttglyf.h +++ b/src/3rdparty/freetype/include/freetype/internal/services/svttglyf.h @@ -4,7 +4,7 @@ * * The FreeType TrueType glyph service. * - * Copyright (C) 2007-2019 by + * Copyright (C) 2007-2020 by * David Turner. * * This file is part of the FreeType project, and may only be used, @@ -18,8 +18,8 @@ #ifndef SVTTGLYF_H_ #define SVTTGLYF_H_ -#include FT_INTERNAL_SERVICE_H -#include FT_TRUETYPE_TABLES_H +#include +#include FT_BEGIN_HEADER diff --git a/src/3rdparty/freetype/include/freetype/internal/services/svwinfnt.h b/src/3rdparty/freetype/include/freetype/internal/services/svwinfnt.h index 38ee0209..8c915f52 100644 --- a/src/3rdparty/freetype/include/freetype/internal/services/svwinfnt.h +++ b/src/3rdparty/freetype/include/freetype/internal/services/svwinfnt.h @@ -4,7 +4,7 @@ * * The FreeType Windows FNT/FONT service (specification). * - * Copyright (C) 2003-2019 by + * Copyright (C) 2003-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -19,8 +19,8 @@ #ifndef SVWINFNT_H_ #define SVWINFNT_H_ -#include FT_INTERNAL_SERVICE_H -#include FT_WINFONTS_H +#include +#include FT_BEGIN_HEADER diff --git a/src/3rdparty/freetype/include/freetype/internal/sfnt.h b/src/3rdparty/freetype/include/freetype/internal/sfnt.h index b19241c3..b4c12dbb 100644 --- a/src/3rdparty/freetype/include/freetype/internal/sfnt.h +++ b/src/3rdparty/freetype/include/freetype/internal/sfnt.h @@ -4,7 +4,7 @@ * * High-level 'sfnt' driver interface (specification). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -20,10 +20,9 @@ #define SFNT_H_ -#include -#include FT_INTERNAL_DRIVER_H -#include FT_INTERNAL_TRUETYPE_TYPES_H -#include FT_INTERNAL_WOFF_TYPES_H +#include +#include +#include FT_BEGIN_HEADER diff --git a/src/3rdparty/freetype/include/freetype/internal/t1types.h b/src/3rdparty/freetype/include/freetype/internal/t1types.h index d94c8c12..6a0fe5e9 100644 --- a/src/3rdparty/freetype/include/freetype/internal/t1types.h +++ b/src/3rdparty/freetype/include/freetype/internal/t1types.h @@ -5,7 +5,7 @@ * Basic Type1/Type2 type definitions and interface (specification * only). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -21,12 +21,11 @@ #define T1TYPES_H_ -#include -#include FT_TYPE1_TABLES_H -#include FT_INTERNAL_POSTSCRIPT_HINTS_H -#include FT_INTERNAL_SERVICE_H -#include FT_INTERNAL_HASH_H -#include FT_SERVICE_POSTSCRIPT_CMAPS_H +#include +#include +#include +#include +#include FT_BEGIN_HEADER diff --git a/src/3rdparty/freetype/include/freetype/internal/tttypes.h b/src/3rdparty/freetype/include/freetype/internal/tttypes.h index 23db240e..c36342c9 100644 --- a/src/3rdparty/freetype/include/freetype/internal/tttypes.h +++ b/src/3rdparty/freetype/include/freetype/internal/tttypes.h @@ -5,7 +5,7 @@ * Basic SFNT/TrueType type definitions and interface (specification * only). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -21,13 +21,12 @@ #define TTTYPES_H_ -#include -#include FT_TRUETYPE_TABLES_H -#include FT_INTERNAL_OBJECTS_H -#include FT_COLOR_H +#include +#include +#include #ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT -#include FT_MULTIPLE_MASTERS_H +#include #endif diff --git a/src/3rdparty/freetype/include/freetype/internal/wofftypes.h b/src/3rdparty/freetype/include/freetype/internal/wofftypes.h index ba55bf88..1874a138 100644 --- a/src/3rdparty/freetype/include/freetype/internal/wofftypes.h +++ b/src/3rdparty/freetype/include/freetype/internal/wofftypes.h @@ -5,7 +5,7 @@ * Basic WOFF/WOFF2 type definitions and interface (specification * only). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -21,9 +21,8 @@ #define WOFFTYPES_H_ -#include -#include FT_TRUETYPE_TABLES_H -#include FT_INTERNAL_OBJECTS_H +#include +#include FT_BEGIN_HEADER @@ -104,6 +103,207 @@ FT_BEGIN_HEADER } WOFF_TableRec, *WOFF_Table; + /************************************************************************** + * + * @struct: + * WOFF2_TtcFontRec + * + * @description: + * Metadata for a TTC font entry in WOFF2. + * + * @fields: + * flavor :: + * TTC font flavor. + * + * num_tables :: + * Number of tables in TTC, indicating number of elements in + * `table_indices`. + * + * table_indices :: + * Array of table indices for each TTC font. + */ + typedef struct WOFF2_TtcFontRec_ + { + FT_ULong flavor; + FT_UShort num_tables; + FT_UShort* table_indices; + + } WOFF2_TtcFontRec, *WOFF2_TtcFont; + + + /************************************************************************** + * + * @struct: + * WOFF2_HeaderRec + * + * @description: + * WOFF2 file format header. + * + * @fields: + * See + * + * https://www.w3.org/TR/WOFF2/#woff20Header + * + * @note: + * We don't care about the fields `reserved`, `majorVersion` and + * `minorVersion`, so they are not included. The `totalSfntSize` field + * does not necessarily represent the actual size of the uncompressed + * SFNT font stream, so that is used as a reference value instead. + */ + typedef struct WOFF2_HeaderRec_ + { + FT_ULong signature; + FT_ULong flavor; + FT_ULong length; + FT_UShort num_tables; + FT_ULong totalSfntSize; + FT_ULong totalCompressedSize; + FT_ULong metaOffset; + FT_ULong metaLength; + FT_ULong metaOrigLength; + FT_ULong privOffset; + FT_ULong privLength; + + FT_ULong uncompressed_size; /* uncompressed brotli stream size */ + FT_ULong compressed_offset; /* compressed stream offset */ + FT_ULong header_version; /* version of original TTC Header */ + FT_UShort num_fonts; /* number of fonts in TTC */ + FT_ULong actual_sfnt_size; /* actual size of sfnt stream */ + + WOFF2_TtcFont ttc_fonts; /* metadata for fonts in a TTC */ + + } WOFF2_HeaderRec, *WOFF2_Header; + + + /************************************************************************** + * + * @struct: + * WOFF2_TableRec + * + * @description: + * This structure describes a given table of a WOFF2 font. + * + * @fields: + * See + * + * https://www.w3.org/TR/WOFF2/#table_dir_format + */ + typedef struct WOFF2_TableRec_ + { + FT_Byte FlagByte; /* table type and flags */ + FT_ULong Tag; /* table file offset */ + FT_ULong dst_length; /* uncompressed table length */ + FT_ULong TransformLength; /* transformed length */ + + FT_ULong flags; /* calculated flags */ + FT_ULong src_offset; /* compressed table offset */ + FT_ULong src_length; /* compressed table length */ + FT_ULong dst_offset; /* uncompressed table offset */ + + } WOFF2_TableRec, *WOFF2_Table; + + + /************************************************************************** + * + * @struct: + * WOFF2_InfoRec + * + * @description: + * Metadata for WOFF2 font that may be required for reconstruction of + * sfnt tables. + * + * @fields: + * header_checksum :: + * Checksum of SFNT offset table. + * + * num_glyphs :: + * Number of glyphs in the font. + * + * num_hmetrics :: + * `numberOfHMetrics` field in the 'hhea' table. + * + * x_mins :: + * `xMin` values of glyph bounding box. + * + * glyf_table :: + * A pointer to the `glyf' table record. + * + * loca_table :: + * A pointer to the `loca' table record. + * + * head_table :: + * A pointer to the `head' table record. + */ + typedef struct WOFF2_InfoRec_ + { + FT_ULong header_checksum; + FT_UShort num_glyphs; + FT_UShort num_hmetrics; + FT_Short* x_mins; + + WOFF2_Table glyf_table; + WOFF2_Table loca_table; + WOFF2_Table head_table; + + } WOFF2_InfoRec, *WOFF2_Info; + + + /************************************************************************** + * + * @struct: + * WOFF2_SubstreamRec + * + * @description: + * This structure stores information about a substream in the transformed + * 'glyf' table in a WOFF2 stream. + * + * @fields: + * start :: + * Beginning of the substream relative to uncompressed table stream. + * + * offset :: + * Offset of the substream relative to uncompressed table stream. + * + * size :: + * Size of the substream. + */ + typedef struct WOFF2_SubstreamRec_ + { + FT_ULong start; + FT_ULong offset; + FT_ULong size; + + } WOFF2_SubstreamRec, *WOFF2_Substream; + + + /************************************************************************** + * + * @struct: + * WOFF2_PointRec + * + * @description: + * This structure stores information about a point in the transformed + * 'glyf' table in a WOFF2 stream. + * + * @fields: + * x :: + * x-coordinate of point. + * + * y :: + * y-coordinate of point. + * + * on_curve :: + * Set if point is on-curve. + */ + typedef struct WOFF2_PointRec_ + { + FT_Int x; + FT_Int y; + FT_Bool on_curve; + + } WOFF2_PointRec, *WOFF2_Point; + + FT_END_HEADER #endif /* WOFFTYPES_H_ */ diff --git a/src/3rdparty/freetype/include/freetype/t1tables.h b/src/3rdparty/freetype/include/freetype/t1tables.h index 645e6457..426e1402 100644 --- a/src/3rdparty/freetype/include/freetype/t1tables.h +++ b/src/3rdparty/freetype/include/freetype/t1tables.h @@ -5,7 +5,7 @@ * Basic Type 1/Type 2 tables definitions and interface (specification * only). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -21,8 +21,7 @@ #define T1TABLES_H_ -#include -#include FT_FREETYPE_H +#include #ifdef FREETYPE_H #error "freetype.h of FreeType 1 has been loaded!" diff --git a/src/3rdparty/freetype/include/freetype/ttnameid.h b/src/3rdparty/freetype/include/freetype/ttnameid.h index cc677de7..2b2ed4c6 100644 --- a/src/3rdparty/freetype/include/freetype/ttnameid.h +++ b/src/3rdparty/freetype/include/freetype/ttnameid.h @@ -4,7 +4,7 @@ * * TrueType name ID definitions (specification only). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -20,7 +20,6 @@ #define TTNAMEID_H_ -#include FT_BEGIN_HEADER diff --git a/src/3rdparty/freetype/include/freetype/tttables.h b/src/3rdparty/freetype/include/freetype/tttables.h index d04f8102..c8fa35ef 100644 --- a/src/3rdparty/freetype/include/freetype/tttables.h +++ b/src/3rdparty/freetype/include/freetype/tttables.h @@ -5,7 +5,7 @@ * Basic SFNT/TrueType tables definitions and interface * (specification only). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -21,8 +21,7 @@ #define TTTABLES_H_ -#include -#include FT_FREETYPE_H +#include #ifdef FREETYPE_H #error "freetype.h of FreeType 1 has been loaded!" diff --git a/src/3rdparty/freetype/include/freetype/tttags.h b/src/3rdparty/freetype/include/freetype/tttags.h index bd0986ef..3c9fbd59 100644 --- a/src/3rdparty/freetype/include/freetype/tttags.h +++ b/src/3rdparty/freetype/include/freetype/tttags.h @@ -4,7 +4,7 @@ * * Tags for TrueType and OpenType tables (specification only). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -20,8 +20,7 @@ #define TTAGS_H_ -#include -#include FT_FREETYPE_H +#include #ifdef FREETYPE_H #error "freetype.h of FreeType 1 has been loaded!" @@ -107,6 +106,7 @@ FT_BEGIN_HEADER #define TTAG_vmtx FT_MAKE_TAG( 'v', 'm', 't', 'x' ) #define TTAG_VVAR FT_MAKE_TAG( 'V', 'V', 'A', 'R' ) #define TTAG_wOFF FT_MAKE_TAG( 'w', 'O', 'F', 'F' ) +#define TTAG_wOF2 FT_MAKE_TAG( 'w', 'O', 'F', '2' ) /* used by "Keyboard.dfont" on legacy Mac OS X */ #define TTAG_0xA5kbd FT_MAKE_TAG( 0xA5, 'k', 'b', 'd' ) diff --git a/src/3rdparty/freetype/include/freetype/ttunpat.h b/src/3rdparty/freetype/include/freetype/ttunpat.h deleted file mode 100644 index 8ea55689..00000000 --- a/src/3rdparty/freetype/include/freetype/ttunpat.h +++ /dev/null @@ -1,60 +0,0 @@ -/***************************************************************************/ -/* */ -/* ttunpat.h */ -/* */ -/* Definitions for the unpatented TrueType hinting system */ -/* */ -/* Copyright 2003-2015 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* Written by Graham Asher */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __TTUNPAT_H__ -#define __TTUNPAT_H__ - - -#include -#include FT_FREETYPE_H - -#ifdef FREETYPE_H -#error "freetype.h of FreeType 1 has been loaded!" -#error "Please fix the directory search order for header files" -#error "so that freetype.h of FreeType 2 is found first." -#endif - - -FT_BEGIN_HEADER - - - /*************************************************************************** - * - * @constant: - * FT_PARAM_TAG_UNPATENTED_HINTING - * - * @description: - * A constant used as the tag of an @FT_Parameter structure to indicate - * that unpatented methods only should be used by the TrueType bytecode - * interpreter for a typeface opened by @FT_Open_Face. - * - */ -#define FT_PARAM_TAG_UNPATENTED_HINTING FT_MAKE_TAG( 'u', 'n', 'p', 'a' ) - - /* */ - - -FT_END_HEADER - - -#endif /* __TTUNPAT_H__ */ - - -/* END */ diff --git a/src/3rdparty/freetype/include/ft2build.h b/src/3rdparty/freetype/include/ft2build.h index e3f48879..b4fd1f8c 100644 --- a/src/3rdparty/freetype/include/ft2build.h +++ b/src/3rdparty/freetype/include/ft2build.h @@ -4,7 +4,7 @@ * * FreeType 2 build and setup macros. * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -18,16 +18,14 @@ /************************************************************************** * - * This is the 'entry point' for FreeType header file inclusions. It is - * the only header file which should be included directly; all other - * FreeType header files should be accessed with macro names (after - * including `ft2build.h`). + * This is the 'entry point' for FreeType header file inclusions, to be + * loaded before all other header files. * * A typical example is * * ``` * #include - * #include FT_FREETYPE_H + * #include * ``` * */ diff --git a/src/3rdparty/freetype/qt_attribution.json b/src/3rdparty/freetype/qt_attribution.json index 93a48ce2..398a623d 100644 --- a/src/3rdparty/freetype/qt_attribution.json +++ b/src/3rdparty/freetype/qt_attribution.json @@ -7,12 +7,12 @@ "Description": "FreeType is a freely available software library to render fonts.", "Homepage": "http://www.freetype.org", - "Version": "2.10.1", + "Version": "2.10.4", "License": "Freetype Project License or GNU General Public License v2.0 only", "LicenseId": "FTL OR GPL-2.0", "LicenseFile": "LICENSE.txt", - "Copyright": "Copyright 2006-2015 by David Turner, Robert Wilhelm, and Werner Lemberg." + "Copyright": "Copyright 2006-2020 by David Turner, Robert Wilhelm, and Werner Lemberg." }, { "Id": "freetype-zlib", diff --git a/src/3rdparty/freetype/src/Jamfile b/src/3rdparty/freetype/src/Jamfile deleted file mode 100644 index 3ad2d5c9..00000000 --- a/src/3rdparty/freetype/src/Jamfile +++ /dev/null @@ -1,19 +0,0 @@ -# FreeType 2 src Jamfile -# -# Copyright (C) 2001-2019 by -# David Turner, Robert Wilhelm, and Werner Lemberg. -# -# This file is part of the FreeType project, and may only be used, modified, -# and distributed under the terms of the FreeType project license, -# LICENSE.TXT. By continuing to use, modify, or distribute this file you -# indicate that you have read the license and understand and accept it -# fully. - -SubDir FT2_TOP $(FT2_SRC_DIR) ; - -for xx in $(FT2_COMPONENTS) -{ - SubInclude FT2_TOP $(FT2_SRC_DIR) $(xx) ; -} - -# end of src Jamfile diff --git a/src/3rdparty/freetype/src/autofit/Jamfile b/src/3rdparty/freetype/src/autofit/Jamfile deleted file mode 100644 index ea69dee3..00000000 --- a/src/3rdparty/freetype/src/autofit/Jamfile +++ /dev/null @@ -1,53 +0,0 @@ -# FreeType 2 src/autofit Jamfile -# -# Copyright (C) 2003-2019 by -# David Turner, Robert Wilhelm, and Werner Lemberg. -# -# This file is part of the FreeType project, and may only be used, modified, -# and distributed under the terms of the FreeType project license, -# LICENSE.TXT. By continuing to use, modify, or distribute this file you -# indicate that you have read the license and understand and accept it -# fully. - -SubDir FT2_TOP src autofit ; - -{ - local _sources ; - - # define FT2_AUTOFIT2 to enable experimental latin hinter replacement - if $(FT2_AUTOFIT2) - { - CCFLAGS += FT_OPTION_AUTOFIT2 ; - } - if $(FT2_MULTI) - { - _sources = afangles - afblue - afcjk - afdummy - afglobal - afhints - afindic - aflatin - afloader - afmodule - afpic - afranges - afshaper - afwarp - ; - - if $(FT2_AUTOFIT2) - { - _sources += aflatin2 ; - } - } - else - { - _sources = autofit ; - } - - Library $(FT2_LIB) : $(_sources).c ; -} - -# end of src/autofit Jamfile diff --git a/src/3rdparty/freetype/src/autofit/afangles.c b/src/3rdparty/freetype/src/autofit/afangles.c index 9e1f7a21..a2d45eb7 100644 --- a/src/3rdparty/freetype/src/autofit/afangles.c +++ b/src/3rdparty/freetype/src/autofit/afangles.c @@ -5,7 +5,7 @@ * Routines used to compute vector angles with limited accuracy * and very high speed. It also contains sorting routines (body). * - * Copyright (C) 2003-2019 by + * Copyright (C) 2003-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, diff --git a/src/3rdparty/freetype/src/autofit/afblue.c b/src/3rdparty/freetype/src/autofit/afblue.c index b99dbeb1..9ebffdd0 100644 --- a/src/3rdparty/freetype/src/autofit/afblue.c +++ b/src/3rdparty/freetype/src/autofit/afblue.c @@ -7,7 +7,7 @@ * * Auto-fitter data for blue strings (body). * - * Copyright (C) 2013-2019 by + * Copyright (C) 2013-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -134,7 +134,7 @@ '\0', '\xF0', '\x90', '\x90', '\xA8', ' ', '\xF0', '\x90', '\x90', '\xAA', ' ', '\xF0', '\x90', '\x90', '\xAC', ' ', '\xF0', '\x90', '\x90', '\xBF', ' ', '\xF0', '\x90', '\x91', '\x83', /* 𐐨 𐐪 𐐬 𐐿 𐑃 */ '\0', - '\xE0', '\xA4', '\x95', ' ', '\xE0', '\xA4', '\xAE', ' ', '\xE0', '\xA4', '\x85', ' ', '\xE0', '\xA4', '\x86', ' ', '\xE0', '\xA4', '\xA5', ' ', '\xE0', '\xA4', '\xA7', ' ', '\xE0', '\xA4', '\xAD', ' ', '\xE0', '\xA4', '\xB6', /* क म अ आ थ ध भ श */ + '\xE0', '\xA4', '\x95', ' ', '\xE0', '\xA4', '\xA8', ' ', '\xE0', '\xA4', '\xAE', ' ', '\xE0', '\xA4', '\x89', ' ', '\xE0', '\xA4', '\x9B', ' ', '\xE0', '\xA4', '\x9F', ' ', '\xE0', '\xA4', '\xA0', ' ', '\xE0', '\xA4', '\xA1', /* क न म उ छ ट ठ ड */ '\0', '\xE0', '\xA4', '\x88', ' ', '\xE0', '\xA4', '\x90', ' ', '\xE0', '\xA4', '\x93', ' ', '\xE0', '\xA4', '\x94', ' ', '\xE0', '\xA4', '\xBF', ' ', '\xE0', '\xA5', '\x80', ' ', '\xE0', '\xA5', '\x8B', ' ', '\xE0', '\xA5', '\x8C', /* ई ऐ ओ औ ि ी ो ौ */ '\0', @@ -296,6 +296,20 @@ '\0', '\xE0', '\xB4', '\x9F', ' ', '\xE0', '\xB4', '\xA0', ' ', '\xE0', '\xB4', '\xA7', ' ', '\xE0', '\xB4', '\xB6', ' ', '\xE0', '\xB4', '\x98', ' ', '\xE0', '\xB4', '\x9A', ' ', '\xE0', '\xB4', '\xA5', ' ', '\xE0', '\xB4', '\xB2', /* ട ഠ ധ ശ ഘ ച ഥ ല */ '\0', + '\xF0', '\x96', '\xB9', '\x80', ' ', '\xF0', '\x96', '\xB9', '\x81', ' ', '\xF0', '\x96', '\xB9', '\x82', ' ', '\xF0', '\x96', '\xB9', '\x83', ' ', '\xF0', '\x96', '\xB9', '\x8F', ' ', '\xF0', '\x96', '\xB9', '\x9A', ' ', '\xF0', '\x96', '\xB9', '\x9F', /* 𖹀 𖹁 𖹂 𖹃 𖹏 𖹚 𖹟 */ + '\0', + '\xF0', '\x96', '\xB9', '\x80', ' ', '\xF0', '\x96', '\xB9', '\x81', ' ', '\xF0', '\x96', '\xB9', '\x82', ' ', '\xF0', '\x96', '\xB9', '\x83', ' ', '\xF0', '\x96', '\xB9', '\x8F', ' ', '\xF0', '\x96', '\xB9', '\x9A', ' ', '\xF0', '\x96', '\xB9', '\x92', ' ', '\xF0', '\x96', '\xB9', '\x93', /* 𖹀 𖹁 𖹂 𖹃 𖹏 𖹚 𖹒 𖹓 */ + '\0', + '\xF0', '\x96', '\xB9', '\xA4', ' ', '\xF0', '\x96', '\xB9', '\xAC', ' ', '\xF0', '\x96', '\xB9', '\xA7', ' ', '\xF0', '\x96', '\xB9', '\xB4', ' ', '\xF0', '\x96', '\xB9', '\xB6', ' ', '\xF0', '\x96', '\xB9', '\xBE', /* 𖹤 𖹬 𖹧 𖹴 𖹶 𖹾 */ + '\0', + '\xF0', '\x96', '\xB9', '\xA0', ' ', '\xF0', '\x96', '\xB9', '\xA1', ' ', '\xF0', '\x96', '\xB9', '\xA2', ' ', '\xF0', '\x96', '\xB9', '\xB9', ' ', '\xF0', '\x96', '\xB9', '\xB3', ' ', '\xF0', '\x96', '\xB9', '\xAE', /* 𖹠 𖹡 𖹢 𖹹 𖹳 𖹮 */ + '\0', + '\xF0', '\x96', '\xB9', '\xA0', ' ', '\xF0', '\x96', '\xB9', '\xA1', ' ', '\xF0', '\x96', '\xB9', '\xA2', ' ', '\xF0', '\x96', '\xB9', '\xB3', ' ', '\xF0', '\x96', '\xB9', '\xAD', ' ', '\xF0', '\x96', '\xB9', '\xBD', /* 𖹠 𖹡 𖹢 𖹳 𖹭 𖹽 */ + '\0', + '\xF0', '\x96', '\xB9', '\xA5', ' ', '\xF0', '\x96', '\xB9', '\xA8', ' ', '\xF0', '\x96', '\xB9', '\xA9', /* 𖹥 𖹨 𖹩 */ + '\0', + '\xF0', '\x96', '\xBA', '\x80', ' ', '\xF0', '\x96', '\xBA', '\x85', ' ', '\xF0', '\x96', '\xBA', '\x88', ' ', '\xF0', '\x96', '\xBA', '\x84', ' ', '\xF0', '\x96', '\xBA', '\x8D', /* 𖺀 𖺅 𖺈 𖺄 𖺍 */ + '\0', '\xE1', '\xA0', '\xB3', ' ', '\xE1', '\xA0', '\xB4', ' ', '\xE1', '\xA0', '\xB6', ' ', '\xE1', '\xA0', '\xBD', ' ', '\xE1', '\xA1', '\x82', ' ', '\xE1', '\xA1', '\x8A', ' ', '\xE2', '\x80', '\x8D', '\xE1', '\xA1', '\xA1', '\xE2', '\x80', '\x8D', ' ', '\xE2', '\x80', '\x8D', '\xE1', '\xA1', '\xB3', '\xE2', '\x80', '\x8D', /* ᠳ ᠴ ᠶ ᠽ ᡂ ᡊ ‍ᡡ‍ ‍ᡳ‍ */ '\0', '\xE1', '\xA1', '\x83', /* ᡃ */ @@ -340,6 +354,12 @@ '\0', '\xF0', '\x90', '\x92', '\x80', ' ', '\xF0', '\x90', '\x92', '\x82', ' ', '\xF0', '\x90', '\x92', '\x86', ' ', '\xF0', '\x90', '\x92', '\x88', ' ', '\xF0', '\x90', '\x92', '\x8A', ' ', '\xF0', '\x90', '\x92', '\x92', ' ', '\xF0', '\x90', '\x92', '\xA0', ' ', '\xF0', '\x90', '\x92', '\xA9', /* 𐒀 𐒂 𐒆 𐒈 𐒊 𐒒 𐒠 𐒩 */ '\0', + '\xF0', '\x90', '\xB4', '\x83', ' ', '\xF0', '\x90', '\xB4', '\x80', ' ', '\xF0', '\x90', '\xB4', '\x86', ' ', '\xF0', '\x90', '\xB4', '\x96', ' ', '\xF0', '\x90', '\xB4', '\x95', /* 𐴃 𐴀 𐴆 𐴖 𐴕 */ + '\0', + '\xF0', '\x90', '\xB4', '\x94', ' ', '\xF0', '\x90', '\xB4', '\x96', ' ', '\xF0', '\x90', '\xB4', '\x95', ' ', '\xF0', '\x90', '\xB4', '\x91', ' ', '\xF0', '\x90', '\xB4', '\x90', /* 𐴔 𐴖 𐴕 𐴑 𐴐 */ + '\0', + '\xD9', '\x80', /* ـ */ + '\0', '\xEA', '\xA2', '\x9C', ' ', '\xEA', '\xA2', '\x9E', ' ', '\xEA', '\xA2', '\xB3', ' ', '\xEA', '\xA2', '\x82', ' ', '\xEA', '\xA2', '\x96', ' ', '\xEA', '\xA2', '\x92', ' ', '\xEA', '\xA2', '\x9D', ' ', '\xEA', '\xA2', '\x9B', /* ꢜ ꢞ ꢳ ꢂ ꢖ ꢒ ꢝ ꢛ */ '\0', '\xEA', '\xA2', '\x82', ' ', '\xEA', '\xA2', '\xA8', ' ', '\xEA', '\xA2', '\xBA', ' ', '\xEA', '\xA2', '\xA4', ' ', '\xEA', '\xA2', '\x8E', /* ꢂ ꢨ ꢺ ꢤ ꢎ */ @@ -488,14 +508,14 @@ { AF_BLUE_STRING_CHAKMA_BOTTOM, 0 }, { AF_BLUE_STRING_CHAKMA_DESCENDER, 0 }, { AF_BLUE_STRING_MAX, 0 }, - { AF_BLUE_STRING_CANADIAN_SYLLABICS_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, - { AF_BLUE_STRING_CANADIAN_SYLLABICS_BOTTOM, 0 }, - { AF_BLUE_STRING_CANADIAN_SYLLABICS_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP | - AF_BLUE_PROPERTY_LATIN_X_HEIGHT }, - { AF_BLUE_STRING_CANADIAN_SYLLABICS_SMALL_BOTTOM, 0 }, - { AF_BLUE_STRING_CANADIAN_SYLLABICS_SUPS_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, - { AF_BLUE_STRING_CANADIAN_SYLLABICS_SUPS_BOTTOM, 0 }, - { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_CANADIAN_SYLLABICS_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_CANADIAN_SYLLABICS_BOTTOM, 0 }, + { AF_BLUE_STRING_CANADIAN_SYLLABICS_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT }, + { AF_BLUE_STRING_CANADIAN_SYLLABICS_SMALL_BOTTOM, 0 }, + { AF_BLUE_STRING_CANADIAN_SYLLABICS_SUPS_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_CANADIAN_SYLLABICS_SUPS_BOTTOM, 0 }, + { AF_BLUE_STRING_MAX, 0 }, { AF_BLUE_STRING_CARIAN_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, { AF_BLUE_STRING_CARIAN_BOTTOM, 0 }, { AF_BLUE_STRING_MAX, 0 }, @@ -595,6 +615,9 @@ { AF_BLUE_STRING_HEBREW_BOTTOM, 0 }, { AF_BLUE_STRING_HEBREW_DESCENDER, 0 }, { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_KANNADA_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_KANNADA_BOTTOM, 0 }, + { AF_BLUE_STRING_MAX, 0 }, { AF_BLUE_STRING_KAYAH_LI_TOP, AF_BLUE_PROPERTY_LATIN_TOP | AF_BLUE_PROPERTY_LATIN_X_HEIGHT }, { AF_BLUE_STRING_KAYAH_LI_BOTTOM, 0 }, @@ -613,9 +636,6 @@ AF_BLUE_PROPERTY_LATIN_X_HEIGHT }, { AF_BLUE_STRING_KHMER_SYMBOLS_WANING_BOTTOM, 0 }, { AF_BLUE_STRING_MAX, 0 }, - { AF_BLUE_STRING_KANNADA_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, - { AF_BLUE_STRING_KANNADA_BOTTOM, 0 }, - { AF_BLUE_STRING_MAX, 0 }, { AF_BLUE_STRING_LAO_TOP, AF_BLUE_PROPERTY_LATIN_TOP | AF_BLUE_PROPERTY_LATIN_X_HEIGHT }, { AF_BLUE_STRING_LAO_BOTTOM, 0 }, @@ -653,6 +673,15 @@ { AF_BLUE_STRING_MALAYALAM_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, { AF_BLUE_STRING_MALAYALAM_BOTTOM, 0 }, { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_MEDEFAIDRIN_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_MEDEFAIDRIN_CAPITAL_BOTTOM, 0 }, + { AF_BLUE_STRING_MEDEFAIDRIN_SMALL_F_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_MEDEFAIDRIN_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT }, + { AF_BLUE_STRING_MEDEFAIDRIN_SMALL_BOTTOM, 0 }, + { AF_BLUE_STRING_MEDEFAIDRIN_SMALL_DESCENDER, 0 }, + { AF_BLUE_STRING_MEDEFAIDRIN_DIGIT_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_MAX, 0 }, { AF_BLUE_STRING_MONGOLIAN_TOP_BASE, AF_BLUE_PROPERTY_LATIN_TOP }, { AF_BLUE_STRING_MONGOLIAN_BOTTOM_BASE, 0 }, { AF_BLUE_STRING_MAX, 0 }, @@ -687,6 +716,10 @@ { AF_BLUE_STRING_OSMANYA_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, { AF_BLUE_STRING_OSMANYA_BOTTOM, 0 }, { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_ROHINGYA_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_ROHINGYA_BOTTOM, 0 }, + { AF_BLUE_STRING_ROHINGYA_JOIN, AF_BLUE_PROPERTY_LATIN_NEUTRAL }, + { AF_BLUE_STRING_MAX, 0 }, { AF_BLUE_STRING_SAURASHTRA_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, { AF_BLUE_STRING_SAURASHTRA_BOTTOM, 0 }, { AF_BLUE_STRING_MAX, 0 }, @@ -714,9 +747,6 @@ { AF_BLUE_STRING_TELUGU_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, { AF_BLUE_STRING_TELUGU_BOTTOM, 0 }, { AF_BLUE_STRING_MAX, 0 }, - { AF_BLUE_STRING_TIFINAGH, AF_BLUE_PROPERTY_LATIN_TOP }, - { AF_BLUE_STRING_TIFINAGH, 0 }, - { AF_BLUE_STRING_MAX, 0 }, { AF_BLUE_STRING_THAI_TOP, AF_BLUE_PROPERTY_LATIN_TOP | AF_BLUE_PROPERTY_LATIN_X_HEIGHT }, { AF_BLUE_STRING_THAI_BOTTOM, 0 }, @@ -726,6 +756,9 @@ { AF_BLUE_STRING_THAI_LARGE_DESCENDER, 0 }, { AF_BLUE_STRING_THAI_DIGIT_TOP, 0 }, { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_TIFINAGH, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_TIFINAGH, 0 }, + { AF_BLUE_STRING_MAX, 0 }, { AF_BLUE_STRING_VAI_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, { AF_BLUE_STRING_VAI_BOTTOM, 0 }, { AF_BLUE_STRING_MAX, 0 }, diff --git a/src/3rdparty/freetype/src/autofit/afblue.cin b/src/3rdparty/freetype/src/autofit/afblue.cin index 6545d1fd..c6a697fe 100644 --- a/src/3rdparty/freetype/src/autofit/afblue.cin +++ b/src/3rdparty/freetype/src/autofit/afblue.cin @@ -4,7 +4,7 @@ * * Auto-fitter data for blue strings (body). * - * Copyright (C) 2013-2019 by + * Copyright (C) 2013-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, diff --git a/src/3rdparty/freetype/src/autofit/afblue.dat b/src/3rdparty/freetype/src/autofit/afblue.dat index 46db43fe..b19b8df0 100644 --- a/src/3rdparty/freetype/src/autofit/afblue.dat +++ b/src/3rdparty/freetype/src/autofit/afblue.dat @@ -2,7 +2,7 @@ // // Auto-fitter data for blue strings. // -// Copyright (C) 2013-2019 by +// Copyright (C) 2013-2020 by // David Turner, Robert Wilhelm, and Werner Lemberg. // // This file is part of the FreeType project, and may only be used, @@ -203,7 +203,7 @@ AF_BLUE_STRING_ENUM AF_BLUE_STRINGS_ARRAY AF_BLUE_STRING_MAX_LEN: "𐐨 𐐪 𐐬 𐐿 𐑃" AF_BLUE_STRING_DEVANAGARI_BASE - "क म अ आ थ ध भ श" + "क न म उ छ ट ठ ड" AF_BLUE_STRING_DEVANAGARI_TOP "ई ऐ ओ औ ि ी ो ौ" // note that some fonts have extreme variation in the height of the @@ -392,6 +392,21 @@ AF_BLUE_STRING_ENUM AF_BLUE_STRINGS_ARRAY AF_BLUE_STRING_MAX_LEN: AF_BLUE_STRING_MALAYALAM_BOTTOM "ട ഠ ധ ശ ഘ ച ഥ ല" + AF_BLUE_STRING_MEDEFAIDRIN_CAPITAL_TOP + "𖹀 𖹁 𖹂 𖹃 𖹏 𖹚 𖹟" + AF_BLUE_STRING_MEDEFAIDRIN_CAPITAL_BOTTOM + "𖹀 𖹁 𖹂 𖹃 𖹏 𖹚 𖹒 𖹓" + AF_BLUE_STRING_MEDEFAIDRIN_SMALL_F_TOP + "𖹤 𖹬 𖹧 𖹴 𖹶 𖹾" + AF_BLUE_STRING_MEDEFAIDRIN_SMALL_TOP + "𖹠 𖹡 𖹢 𖹹 𖹳 𖹮" + AF_BLUE_STRING_MEDEFAIDRIN_SMALL_BOTTOM + "𖹠 𖹡 𖹢 𖹳 𖹭 𖹽" + AF_BLUE_STRING_MEDEFAIDRIN_SMALL_DESCENDER + "𖹥 𖹨 𖹩" + AF_BLUE_STRING_MEDEFAIDRIN_DIGIT_TOP + "𖺀 𖺅 𖺈 𖺄 𖺍" + AF_BLUE_STRING_MONGOLIAN_TOP_BASE "ᠳ ᠴ ᠶ ᠽ ᡂ ᡊ ‍ᡡ‍ ‍ᡳ‍" AF_BLUE_STRING_MONGOLIAN_BOTTOM_BASE @@ -443,6 +458,13 @@ AF_BLUE_STRING_ENUM AF_BLUE_STRINGS_ARRAY AF_BLUE_STRING_MAX_LEN: AF_BLUE_STRING_OSMANYA_BOTTOM "𐒀 𐒂 𐒆 𐒈 𐒊 𐒒 𐒠 𐒩" + AF_BLUE_STRING_ROHINGYA_TOP + "𐴃 𐴀 𐴆 𐴖 𐴕" + AF_BLUE_STRING_ROHINGYA_BOTTOM + "𐴔 𐴖 𐴕 𐴑 𐴐" + AF_BLUE_STRING_ROHINGYA_JOIN + "ـ" + AF_BLUE_STRING_SAURASHTRA_TOP "ꢜ ꢞ ꢳ ꢂ ꢖ ꢒ ꢝ ꢛ" AF_BLUE_STRING_SAURASHTRA_BOTTOM @@ -734,14 +756,14 @@ AF_BLUE_STRINGSET_ENUM AF_BLUE_STRINGSETS_ARRAY AF_BLUE_STRINGSET_MAX_LEN: { AF_BLUE_STRING_MAX, 0 } AF_BLUE_STRINGSET_CANS - { AF_BLUE_STRING_CANADIAN_SYLLABICS_TOP, AF_BLUE_PROPERTY_LATIN_TOP } - { AF_BLUE_STRING_CANADIAN_SYLLABICS_BOTTOM, 0 } - { AF_BLUE_STRING_CANADIAN_SYLLABICS_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP | - AF_BLUE_PROPERTY_LATIN_X_HEIGHT } - { AF_BLUE_STRING_CANADIAN_SYLLABICS_SMALL_BOTTOM, 0 } - { AF_BLUE_STRING_CANADIAN_SYLLABICS_SUPS_TOP, AF_BLUE_PROPERTY_LATIN_TOP } - { AF_BLUE_STRING_CANADIAN_SYLLABICS_SUPS_BOTTOM, 0 } - { AF_BLUE_STRING_MAX, 0 } + { AF_BLUE_STRING_CANADIAN_SYLLABICS_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_CANADIAN_SYLLABICS_BOTTOM, 0 } + { AF_BLUE_STRING_CANADIAN_SYLLABICS_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT } + { AF_BLUE_STRING_CANADIAN_SYLLABICS_SMALL_BOTTOM, 0 } + { AF_BLUE_STRING_CANADIAN_SYLLABICS_SUPS_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_CANADIAN_SYLLABICS_SUPS_BOTTOM, 0 } + { AF_BLUE_STRING_MAX, 0 } AF_BLUE_STRINGSET_CARI { AF_BLUE_STRING_CARIAN_TOP, AF_BLUE_PROPERTY_LATIN_TOP } @@ -874,6 +896,11 @@ AF_BLUE_STRINGSET_ENUM AF_BLUE_STRINGSETS_ARRAY AF_BLUE_STRINGSET_MAX_LEN: { AF_BLUE_STRING_HEBREW_DESCENDER, 0 } { AF_BLUE_STRING_MAX, 0 } + AF_BLUE_STRINGSET_KNDA + { AF_BLUE_STRING_KANNADA_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_KANNADA_BOTTOM, 0 } + { AF_BLUE_STRING_MAX, 0 } + AF_BLUE_STRINGSET_KALI { AF_BLUE_STRING_KAYAH_LI_TOP, AF_BLUE_PROPERTY_LATIN_TOP | AF_BLUE_PROPERTY_LATIN_X_HEIGHT } @@ -898,11 +925,6 @@ AF_BLUE_STRINGSET_ENUM AF_BLUE_STRINGSETS_ARRAY AF_BLUE_STRINGSET_MAX_LEN: { AF_BLUE_STRING_KHMER_SYMBOLS_WANING_BOTTOM, 0 } { AF_BLUE_STRING_MAX, 0 } - AF_BLUE_STRINGSET_KNDA - { AF_BLUE_STRING_KANNADA_TOP, AF_BLUE_PROPERTY_LATIN_TOP } - { AF_BLUE_STRING_KANNADA_BOTTOM, 0 } - { AF_BLUE_STRING_MAX, 0 } - AF_BLUE_STRINGSET_LAO { AF_BLUE_STRING_LAO_TOP, AF_BLUE_PROPERTY_LATIN_TOP | AF_BLUE_PROPERTY_LATIN_X_HEIGHT } @@ -952,6 +974,17 @@ AF_BLUE_STRINGSET_ENUM AF_BLUE_STRINGSETS_ARRAY AF_BLUE_STRINGSET_MAX_LEN: { AF_BLUE_STRING_MALAYALAM_BOTTOM, 0 } { AF_BLUE_STRING_MAX, 0 } + AF_BLUE_STRINGSET_MEDF + { AF_BLUE_STRING_MEDEFAIDRIN_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_MEDEFAIDRIN_CAPITAL_BOTTOM, 0 } + { AF_BLUE_STRING_MEDEFAIDRIN_SMALL_F_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_MEDEFAIDRIN_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT } + { AF_BLUE_STRING_MEDEFAIDRIN_SMALL_BOTTOM, 0 } + { AF_BLUE_STRING_MEDEFAIDRIN_SMALL_DESCENDER, 0 } + { AF_BLUE_STRING_MEDEFAIDRIN_DIGIT_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_MAX, 0 } + AF_BLUE_STRINGSET_MONG { AF_BLUE_STRING_MONGOLIAN_TOP_BASE, AF_BLUE_PROPERTY_LATIN_TOP } { AF_BLUE_STRING_MONGOLIAN_BOTTOM_BASE, 0 } @@ -1002,6 +1035,12 @@ AF_BLUE_STRINGSET_ENUM AF_BLUE_STRINGSETS_ARRAY AF_BLUE_STRINGSET_MAX_LEN: { AF_BLUE_STRING_OSMANYA_BOTTOM, 0 } { AF_BLUE_STRING_MAX, 0 } + AF_BLUE_STRINGSET_ROHG + { AF_BLUE_STRING_ROHINGYA_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_ROHINGYA_BOTTOM, 0 } + { AF_BLUE_STRING_ROHINGYA_JOIN, AF_BLUE_PROPERTY_LATIN_NEUTRAL } + { AF_BLUE_STRING_MAX, 0 } + AF_BLUE_STRINGSET_SAUR { AF_BLUE_STRING_SAURASHTRA_TOP, AF_BLUE_PROPERTY_LATIN_TOP } { AF_BLUE_STRING_SAURASHTRA_BOTTOM, 0 } @@ -1043,11 +1082,6 @@ AF_BLUE_STRINGSET_ENUM AF_BLUE_STRINGSETS_ARRAY AF_BLUE_STRINGSET_MAX_LEN: { AF_BLUE_STRING_TELUGU_BOTTOM, 0 } { AF_BLUE_STRING_MAX, 0 } - AF_BLUE_STRINGSET_TFNG - { AF_BLUE_STRING_TIFINAGH, AF_BLUE_PROPERTY_LATIN_TOP } - { AF_BLUE_STRING_TIFINAGH, 0 } - { AF_BLUE_STRING_MAX, 0 } - AF_BLUE_STRINGSET_THAI { AF_BLUE_STRING_THAI_TOP, AF_BLUE_PROPERTY_LATIN_TOP | AF_BLUE_PROPERTY_LATIN_X_HEIGHT } @@ -1059,6 +1093,11 @@ AF_BLUE_STRINGSET_ENUM AF_BLUE_STRINGSETS_ARRAY AF_BLUE_STRINGSET_MAX_LEN: { AF_BLUE_STRING_THAI_DIGIT_TOP, 0 } { AF_BLUE_STRING_MAX, 0 } + AF_BLUE_STRINGSET_TFNG + { AF_BLUE_STRING_TIFINAGH, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_TIFINAGH, 0 } + { AF_BLUE_STRING_MAX, 0 } + AF_BLUE_STRINGSET_VAII { AF_BLUE_STRING_VAI_TOP, AF_BLUE_PROPERTY_LATIN_TOP } { AF_BLUE_STRING_VAI_BOTTOM, 0 } diff --git a/src/3rdparty/freetype/src/autofit/afblue.h b/src/3rdparty/freetype/src/autofit/afblue.h index b69b1df5..486d663b 100644 --- a/src/3rdparty/freetype/src/autofit/afblue.h +++ b/src/3rdparty/freetype/src/autofit/afblue.h @@ -7,7 +7,7 @@ * * Auto-fitter data for blue strings (specification). * - * Copyright (C) 2013-2019 by + * Copyright (C) 2013-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -212,58 +212,68 @@ FT_BEGIN_HEADER AF_BLUE_STRING_LISU_BOTTOM = 3506, AF_BLUE_STRING_MALAYALAM_TOP = 3538, AF_BLUE_STRING_MALAYALAM_BOTTOM = 3582, - AF_BLUE_STRING_MONGOLIAN_TOP_BASE = 3614, - AF_BLUE_STRING_MONGOLIAN_BOTTOM_BASE = 3658, - AF_BLUE_STRING_MYANMAR_TOP = 3662, - AF_BLUE_STRING_MYANMAR_BOTTOM = 3694, - AF_BLUE_STRING_MYANMAR_ASCENDER = 3726, - AF_BLUE_STRING_MYANMAR_DESCENDER = 3754, - AF_BLUE_STRING_NKO_TOP = 3786, - AF_BLUE_STRING_NKO_BOTTOM = 3810, - AF_BLUE_STRING_NKO_SMALL_TOP = 3825, - AF_BLUE_STRING_NKO_SMALL_BOTTOM = 3834, - AF_BLUE_STRING_OL_CHIKI = 3846, - AF_BLUE_STRING_OLD_TURKIC_TOP = 3870, - AF_BLUE_STRING_OLD_TURKIC_BOTTOM = 3885, - AF_BLUE_STRING_OSAGE_CAPITAL_TOP = 3905, - AF_BLUE_STRING_OSAGE_CAPITAL_BOTTOM = 3945, - AF_BLUE_STRING_OSAGE_CAPITAL_DESCENDER = 3975, - AF_BLUE_STRING_OSAGE_SMALL_TOP = 3990, - AF_BLUE_STRING_OSAGE_SMALL_BOTTOM = 4030, - AF_BLUE_STRING_OSAGE_SMALL_ASCENDER = 4070, - AF_BLUE_STRING_OSAGE_SMALL_DESCENDER = 4095, - AF_BLUE_STRING_OSMANYA_TOP = 4110, - AF_BLUE_STRING_OSMANYA_BOTTOM = 4150, - AF_BLUE_STRING_SAURASHTRA_TOP = 4190, - AF_BLUE_STRING_SAURASHTRA_BOTTOM = 4222, - AF_BLUE_STRING_SHAVIAN_TOP = 4242, - AF_BLUE_STRING_SHAVIAN_BOTTOM = 4252, - AF_BLUE_STRING_SHAVIAN_DESCENDER = 4277, - AF_BLUE_STRING_SHAVIAN_SMALL_TOP = 4287, - AF_BLUE_STRING_SHAVIAN_SMALL_BOTTOM = 4322, - AF_BLUE_STRING_SINHALA_TOP = 4337, - AF_BLUE_STRING_SINHALA_BOTTOM = 4369, - AF_BLUE_STRING_SINHALA_DESCENDER = 4401, - AF_BLUE_STRING_SUNDANESE_TOP = 4445, - AF_BLUE_STRING_SUNDANESE_BOTTOM = 4469, - AF_BLUE_STRING_SUNDANESE_DESCENDER = 4501, - AF_BLUE_STRING_TAI_VIET_TOP = 4509, - AF_BLUE_STRING_TAI_VIET_BOTTOM = 4529, - AF_BLUE_STRING_TAMIL_TOP = 4541, - AF_BLUE_STRING_TAMIL_BOTTOM = 4573, - AF_BLUE_STRING_TELUGU_TOP = 4605, - AF_BLUE_STRING_TELUGU_BOTTOM = 4633, - AF_BLUE_STRING_THAI_TOP = 4661, - AF_BLUE_STRING_THAI_BOTTOM = 4685, - AF_BLUE_STRING_THAI_ASCENDER = 4713, - AF_BLUE_STRING_THAI_LARGE_ASCENDER = 4725, - AF_BLUE_STRING_THAI_DESCENDER = 4737, - AF_BLUE_STRING_THAI_LARGE_DESCENDER = 4753, - AF_BLUE_STRING_THAI_DIGIT_TOP = 4761, - AF_BLUE_STRING_TIFINAGH = 4773, - AF_BLUE_STRING_VAI_TOP = 4805, - AF_BLUE_STRING_VAI_BOTTOM = 4837, - af_blue_1_1 = 4868, + AF_BLUE_STRING_MEDEFAIDRIN_CAPITAL_TOP = 3614, + AF_BLUE_STRING_MEDEFAIDRIN_CAPITAL_BOTTOM = 3649, + AF_BLUE_STRING_MEDEFAIDRIN_SMALL_F_TOP = 3689, + AF_BLUE_STRING_MEDEFAIDRIN_SMALL_TOP = 3719, + AF_BLUE_STRING_MEDEFAIDRIN_SMALL_BOTTOM = 3749, + AF_BLUE_STRING_MEDEFAIDRIN_SMALL_DESCENDER = 3779, + AF_BLUE_STRING_MEDEFAIDRIN_DIGIT_TOP = 3794, + AF_BLUE_STRING_MONGOLIAN_TOP_BASE = 3819, + AF_BLUE_STRING_MONGOLIAN_BOTTOM_BASE = 3863, + AF_BLUE_STRING_MYANMAR_TOP = 3867, + AF_BLUE_STRING_MYANMAR_BOTTOM = 3899, + AF_BLUE_STRING_MYANMAR_ASCENDER = 3931, + AF_BLUE_STRING_MYANMAR_DESCENDER = 3959, + AF_BLUE_STRING_NKO_TOP = 3991, + AF_BLUE_STRING_NKO_BOTTOM = 4015, + AF_BLUE_STRING_NKO_SMALL_TOP = 4030, + AF_BLUE_STRING_NKO_SMALL_BOTTOM = 4039, + AF_BLUE_STRING_OL_CHIKI = 4051, + AF_BLUE_STRING_OLD_TURKIC_TOP = 4075, + AF_BLUE_STRING_OLD_TURKIC_BOTTOM = 4090, + AF_BLUE_STRING_OSAGE_CAPITAL_TOP = 4110, + AF_BLUE_STRING_OSAGE_CAPITAL_BOTTOM = 4150, + AF_BLUE_STRING_OSAGE_CAPITAL_DESCENDER = 4180, + AF_BLUE_STRING_OSAGE_SMALL_TOP = 4195, + AF_BLUE_STRING_OSAGE_SMALL_BOTTOM = 4235, + AF_BLUE_STRING_OSAGE_SMALL_ASCENDER = 4275, + AF_BLUE_STRING_OSAGE_SMALL_DESCENDER = 4300, + AF_BLUE_STRING_OSMANYA_TOP = 4315, + AF_BLUE_STRING_OSMANYA_BOTTOM = 4355, + AF_BLUE_STRING_ROHINGYA_TOP = 4395, + AF_BLUE_STRING_ROHINGYA_BOTTOM = 4420, + AF_BLUE_STRING_ROHINGYA_JOIN = 4445, + AF_BLUE_STRING_SAURASHTRA_TOP = 4448, + AF_BLUE_STRING_SAURASHTRA_BOTTOM = 4480, + AF_BLUE_STRING_SHAVIAN_TOP = 4500, + AF_BLUE_STRING_SHAVIAN_BOTTOM = 4510, + AF_BLUE_STRING_SHAVIAN_DESCENDER = 4535, + AF_BLUE_STRING_SHAVIAN_SMALL_TOP = 4545, + AF_BLUE_STRING_SHAVIAN_SMALL_BOTTOM = 4580, + AF_BLUE_STRING_SINHALA_TOP = 4595, + AF_BLUE_STRING_SINHALA_BOTTOM = 4627, + AF_BLUE_STRING_SINHALA_DESCENDER = 4659, + AF_BLUE_STRING_SUNDANESE_TOP = 4703, + AF_BLUE_STRING_SUNDANESE_BOTTOM = 4727, + AF_BLUE_STRING_SUNDANESE_DESCENDER = 4759, + AF_BLUE_STRING_TAI_VIET_TOP = 4767, + AF_BLUE_STRING_TAI_VIET_BOTTOM = 4787, + AF_BLUE_STRING_TAMIL_TOP = 4799, + AF_BLUE_STRING_TAMIL_BOTTOM = 4831, + AF_BLUE_STRING_TELUGU_TOP = 4863, + AF_BLUE_STRING_TELUGU_BOTTOM = 4891, + AF_BLUE_STRING_THAI_TOP = 4919, + AF_BLUE_STRING_THAI_BOTTOM = 4943, + AF_BLUE_STRING_THAI_ASCENDER = 4971, + AF_BLUE_STRING_THAI_LARGE_ASCENDER = 4983, + AF_BLUE_STRING_THAI_DESCENDER = 4995, + AF_BLUE_STRING_THAI_LARGE_DESCENDER = 5011, + AF_BLUE_STRING_THAI_DIGIT_TOP = 5019, + AF_BLUE_STRING_TIFINAGH = 5031, + AF_BLUE_STRING_VAI_TOP = 5063, + AF_BLUE_STRING_VAI_BOTTOM = 5095, + af_blue_1_1 = 5126, #ifdef AF_CONFIG_OPTION_CJK AF_BLUE_STRING_CJK_TOP = af_blue_1_1 + 1, AF_BLUE_STRING_CJK_BOTTOM = af_blue_1_1 + 203, @@ -347,35 +357,37 @@ FT_BEGIN_HEADER AF_BLUE_STRINGSET_GUJR = 112, AF_BLUE_STRINGSET_GURU = 118, AF_BLUE_STRINGSET_HEBR = 124, - AF_BLUE_STRINGSET_KALI = 128, - AF_BLUE_STRINGSET_KHMR = 134, - AF_BLUE_STRINGSET_KHMS = 140, - AF_BLUE_STRINGSET_KNDA = 143, + AF_BLUE_STRINGSET_KNDA = 128, + AF_BLUE_STRINGSET_KALI = 131, + AF_BLUE_STRINGSET_KHMR = 137, + AF_BLUE_STRINGSET_KHMS = 143, AF_BLUE_STRINGSET_LAO = 146, AF_BLUE_STRINGSET_LATN = 152, AF_BLUE_STRINGSET_LATB = 159, AF_BLUE_STRINGSET_LATP = 166, AF_BLUE_STRINGSET_LISU = 173, AF_BLUE_STRINGSET_MLYM = 176, - AF_BLUE_STRINGSET_MONG = 179, - AF_BLUE_STRINGSET_MYMR = 182, - AF_BLUE_STRINGSET_NKOO = 187, - AF_BLUE_STRINGSET_NONE = 192, - AF_BLUE_STRINGSET_OLCK = 193, - AF_BLUE_STRINGSET_ORKH = 196, - AF_BLUE_STRINGSET_OSGE = 199, - AF_BLUE_STRINGSET_OSMA = 207, - AF_BLUE_STRINGSET_SAUR = 210, - AF_BLUE_STRINGSET_SHAW = 213, - AF_BLUE_STRINGSET_SINH = 219, - AF_BLUE_STRINGSET_SUND = 223, - AF_BLUE_STRINGSET_TAML = 227, - AF_BLUE_STRINGSET_TAVT = 230, - AF_BLUE_STRINGSET_TELU = 233, - AF_BLUE_STRINGSET_TFNG = 236, - AF_BLUE_STRINGSET_THAI = 239, - AF_BLUE_STRINGSET_VAII = 247, - af_blue_2_1 = 250, + AF_BLUE_STRINGSET_MEDF = 179, + AF_BLUE_STRINGSET_MONG = 187, + AF_BLUE_STRINGSET_MYMR = 190, + AF_BLUE_STRINGSET_NKOO = 195, + AF_BLUE_STRINGSET_NONE = 200, + AF_BLUE_STRINGSET_OLCK = 201, + AF_BLUE_STRINGSET_ORKH = 204, + AF_BLUE_STRINGSET_OSGE = 207, + AF_BLUE_STRINGSET_OSMA = 215, + AF_BLUE_STRINGSET_ROHG = 218, + AF_BLUE_STRINGSET_SAUR = 222, + AF_BLUE_STRINGSET_SHAW = 225, + AF_BLUE_STRINGSET_SINH = 231, + AF_BLUE_STRINGSET_SUND = 235, + AF_BLUE_STRINGSET_TAML = 239, + AF_BLUE_STRINGSET_TAVT = 242, + AF_BLUE_STRINGSET_TELU = 245, + AF_BLUE_STRINGSET_THAI = 248, + AF_BLUE_STRINGSET_TFNG = 256, + AF_BLUE_STRINGSET_VAII = 259, + af_blue_2_1 = 262, #ifdef AF_CONFIG_OPTION_CJK AF_BLUE_STRINGSET_HANI = af_blue_2_1 + 0, af_blue_2_1_1 = af_blue_2_1 + 2, diff --git a/src/3rdparty/freetype/src/autofit/afblue.hin b/src/3rdparty/freetype/src/autofit/afblue.hin index 30a28daf..39570270 100644 --- a/src/3rdparty/freetype/src/autofit/afblue.hin +++ b/src/3rdparty/freetype/src/autofit/afblue.hin @@ -4,7 +4,7 @@ * * Auto-fitter data for blue strings (specification). * - * Copyright (C) 2013-2019 by + * Copyright (C) 2013-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, diff --git a/src/3rdparty/freetype/src/autofit/afcjk.c b/src/3rdparty/freetype/src/autofit/afcjk.c index a61689be..3b340cd5 100644 --- a/src/3rdparty/freetype/src/autofit/afcjk.c +++ b/src/3rdparty/freetype/src/autofit/afcjk.c @@ -4,7 +4,7 @@ * * Auto-fitter hinting routines for CJK writing system (body). * - * Copyright (C) 2006-2019 by + * Copyright (C) 2006-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -22,9 +22,8 @@ * */ -#include -#include FT_ADVANCES_H -#include FT_INTERNAL_DEBUG_H +#include +#include #include "afglobal.h" #include "aflatin.h" @@ -158,7 +157,7 @@ if ( !glyph_index ) goto Exit; - FT_TRACE5(( "standard character: U+%04lX (glyph index %d)\n", + FT_TRACE5(( "standard character: U+%04lX (glyph index %ld)\n", ch, glyph_index )); error = FT_Load_Glyph( face, glyph_index, FT_LOAD_NO_SCALE ); @@ -261,9 +260,9 @@ dim == AF_DIMENSION_VERT ? "horizontal" : "vertical" )); - FT_TRACE5(( " %d (standard)", axis->standard_width )); + FT_TRACE5(( " %ld (standard)", axis->standard_width )); for ( i = 1; i < axis->width_count; i++ ) - FT_TRACE5(( " %d", axis->widths[i].org )); + FT_TRACE5(( " %ld", axis->widths[i].org )); FT_TRACE5(( "\n" )); } @@ -728,7 +727,7 @@ delta2 = FT_MulFix( delta2, scale ); - FT_TRACE5(( "delta: %d", delta1 )); + FT_TRACE5(( "delta: %ld", delta1 )); if ( delta2 < 32 ) delta2 = 0; #if 0 @@ -737,7 +736,7 @@ #endif else delta2 = FT_PIX_ROUND( delta2 ); - FT_TRACE5(( "/%d\n", delta2 )); + FT_TRACE5(( "/%ld\n", delta2 )); if ( delta1 < 0 ) delta2 = -delta2; @@ -806,7 +805,7 @@ { AF_AxisHints axis = &hints->axis[dim]; AF_Segment segments = axis->segments; - AF_Segment segment_limit = segments + axis->num_segments; + AF_Segment segment_limit = FT_OFFSET( segments, axis->num_segments ); FT_Error error; AF_Segment seg; @@ -1644,7 +1643,7 @@ stem_edge->pos = base_edge->pos + fitted_width; - FT_TRACE5(( " CJKLINK: edge %d @%d (opos=%.2f) linked to %.2f," + FT_TRACE5(( " CJKLINK: edge %ld @%d (opos=%.2f) linked to %.2f," " dist was %.2f, now %.2f\n", stem_edge - hints->axis[dim].edges, stem_edge->fpos, stem_edge->opos / 64.0, stem_edge->pos / 64.0, @@ -1866,7 +1865,7 @@ continue; #ifdef FT_DEBUG_LEVEL_TRACE - FT_TRACE5(( " CJKBLUE: edge %d @%d (opos=%.2f) snapped to %.2f," + FT_TRACE5(( " CJKBLUE: edge %ld @%d (opos=%.2f) snapped to %.2f," " was %.2f\n", edge1 - edges, edge1->fpos, edge1->opos / 64.0, blue->fit / 64.0, edge1->pos / 64.0 )); @@ -1930,7 +1929,7 @@ /* this should not happen, but it's better to be safe */ if ( edge2->blue_edge ) { - FT_TRACE5(( "ASSERTION FAILED for edge %d\n", edge2-edges )); + FT_TRACE5(( "ASSERTION FAILED for edge %ld\n", edge2-edges )); af_cjk_align_linked_edge( hints, dim, edge2, edge ); edge->flags |= AF_EDGE_DONE; diff --git a/src/3rdparty/freetype/src/autofit/afcjk.h b/src/3rdparty/freetype/src/autofit/afcjk.h index 59acae53..fd0f451a 100644 --- a/src/3rdparty/freetype/src/autofit/afcjk.h +++ b/src/3rdparty/freetype/src/autofit/afcjk.h @@ -4,7 +4,7 @@ * * Auto-fitter hinting routines for CJK writing system (specification). * - * Copyright (C) 2006-2019 by + * Copyright (C) 2006-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, diff --git a/src/3rdparty/freetype/src/autofit/afcover.h b/src/3rdparty/freetype/src/autofit/afcover.h index ff207a97..03085ad0 100644 --- a/src/3rdparty/freetype/src/autofit/afcover.h +++ b/src/3rdparty/freetype/src/autofit/afcover.h @@ -4,7 +4,7 @@ * * Auto-fitter coverages (specification only). * - * Copyright (C) 2013-2019 by + * Copyright (C) 2013-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, diff --git a/src/3rdparty/freetype/src/autofit/afdummy.c b/src/3rdparty/freetype/src/autofit/afdummy.c index 7e07a41e..77d31df9 100644 --- a/src/3rdparty/freetype/src/autofit/afdummy.c +++ b/src/3rdparty/freetype/src/autofit/afdummy.c @@ -5,7 +5,7 @@ * Auto-fitter dummy routines to be used if no hinting should be * performed (body). * - * Copyright (C) 2003-2019 by + * Copyright (C) 2003-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, diff --git a/src/3rdparty/freetype/src/autofit/afdummy.h b/src/3rdparty/freetype/src/autofit/afdummy.h index ab9227d3..efd799e8 100644 --- a/src/3rdparty/freetype/src/autofit/afdummy.h +++ b/src/3rdparty/freetype/src/autofit/afdummy.h @@ -5,7 +5,7 @@ * Auto-fitter dummy routines to be used if no hinting should be * performed (specification). * - * Copyright (C) 2003-2019 by + * Copyright (C) 2003-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, diff --git a/src/3rdparty/freetype/src/autofit/aferrors.h b/src/3rdparty/freetype/src/autofit/aferrors.h index 2ec336f7..f9089994 100644 --- a/src/3rdparty/freetype/src/autofit/aferrors.h +++ b/src/3rdparty/freetype/src/autofit/aferrors.h @@ -4,7 +4,7 @@ * * Autofitter error codes (specification only). * - * Copyright (C) 2005-2019 by + * Copyright (C) 2005-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -26,7 +26,7 @@ #ifndef AFERRORS_H_ #define AFERRORS_H_ -#include FT_MODULE_ERRORS_H +#include #undef FTERRORS_H_ @@ -34,7 +34,7 @@ #define FT_ERR_PREFIX AF_Err_ #define FT_ERR_BASE FT_Mod_Err_Autofit -#include FT_ERRORS_H +#include #endif /* AFERRORS_H_ */ diff --git a/src/3rdparty/freetype/src/autofit/afglobal.c b/src/3rdparty/freetype/src/autofit/afglobal.c index 6a9a1e5a..d5129423 100644 --- a/src/3rdparty/freetype/src/autofit/afglobal.c +++ b/src/3rdparty/freetype/src/autofit/afglobal.c @@ -4,7 +4,7 @@ * * Auto-fitter routines to compute global hinting values (body). * - * Copyright (C) 2003-2019 by + * Copyright (C) 2003-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -19,7 +19,7 @@ #include "afglobal.h" #include "afranges.h" #include "afshaper.h" -#include FT_INTERNAL_DEBUG_H +#include /************************************************************************** @@ -306,7 +306,7 @@ if ( !( count % 10 ) ) FT_TRACE4(( " " )); - FT_TRACE4(( " %d", idx )); + FT_TRACE4(( " %ld", idx )); count++; if ( !( count % 10 ) ) diff --git a/src/3rdparty/freetype/src/autofit/afglobal.h b/src/3rdparty/freetype/src/autofit/afglobal.h index 52f38350..fecf7af9 100644 --- a/src/3rdparty/freetype/src/autofit/afglobal.h +++ b/src/3rdparty/freetype/src/autofit/afglobal.h @@ -5,7 +5,7 @@ * Auto-fitter routines to compute global hinting values * (specification). * - * Copyright (C) 2003-2019 by + * Copyright (C) 2003-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, diff --git a/src/3rdparty/freetype/src/autofit/afhints.c b/src/3rdparty/freetype/src/autofit/afhints.c index ed111c41..a8e00890 100644 --- a/src/3rdparty/freetype/src/autofit/afhints.c +++ b/src/3rdparty/freetype/src/autofit/afhints.c @@ -4,7 +4,7 @@ * * Auto-fitter hinting routines (body). * - * Copyright (C) 2003-2019 by + * Copyright (C) 2003-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -18,8 +18,8 @@ #include "afhints.h" #include "aferrors.h" -#include FT_INTERNAL_CALC_H -#include FT_INTERNAL_DEBUG_H +#include +#include /************************************************************************** diff --git a/src/3rdparty/freetype/src/autofit/afhints.h b/src/3rdparty/freetype/src/autofit/afhints.h index e0cf612f..6397f098 100644 --- a/src/3rdparty/freetype/src/autofit/afhints.h +++ b/src/3rdparty/freetype/src/autofit/afhints.h @@ -4,7 +4,7 @@ * * Auto-fitter hinting routines (specification). * - * Copyright (C) 2003-2019 by + * Copyright (C) 2003-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, diff --git a/src/3rdparty/freetype/src/autofit/afindic.c b/src/3rdparty/freetype/src/autofit/afindic.c index a17117c7..bc2837a2 100644 --- a/src/3rdparty/freetype/src/autofit/afindic.c +++ b/src/3rdparty/freetype/src/autofit/afindic.c @@ -4,7 +4,7 @@ * * Auto-fitter hinting routines for Indic writing system (body). * - * Copyright (C) 2007-2019 by + * Copyright (C) 2007-2020 by * Rahul Bhalerao , . * * This file is part of the FreeType project, and may only be used, diff --git a/src/3rdparty/freetype/src/autofit/afindic.h b/src/3rdparty/freetype/src/autofit/afindic.h index bc5bc59f..088b88b1 100644 --- a/src/3rdparty/freetype/src/autofit/afindic.h +++ b/src/3rdparty/freetype/src/autofit/afindic.h @@ -5,7 +5,7 @@ * Auto-fitter hinting routines for Indic writing system * (specification). * - * Copyright (C) 2007-2019 by + * Copyright (C) 2007-2020 by * Rahul Bhalerao , . * * This file is part of the FreeType project, and may only be used, diff --git a/src/3rdparty/freetype/src/autofit/aflatin.c b/src/3rdparty/freetype/src/autofit/aflatin.c index 27d40248..21ec02eb 100644 --- a/src/3rdparty/freetype/src/autofit/aflatin.c +++ b/src/3rdparty/freetype/src/autofit/aflatin.c @@ -4,7 +4,7 @@ * * Auto-fitter hinting routines for latin writing system (body). * - * Copyright (C) 2003-2019 by + * Copyright (C) 2003-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -16,9 +16,8 @@ */ -#include -#include FT_ADVANCES_H -#include FT_INTERNAL_DEBUG_H +#include +#include #include "afglobal.h" #include "aflatin.h" @@ -155,7 +154,7 @@ goto Exit; } - FT_TRACE5(( "standard character: U+%04lX (glyph index %d)\n", + FT_TRACE5(( "standard character: U+%04lX (glyph index %ld)\n", ch, glyph_index )); error = FT_Load_Glyph( face, glyph_index, FT_LOAD_NO_SCALE ); @@ -258,9 +257,9 @@ dim == AF_DIMENSION_VERT ? "horizontal" : "vertical" )); - FT_TRACE5(( " %d (standard)", axis->standard_width )); + FT_TRACE5(( " %ld (standard)", axis->standard_width )); for ( i = 1; i < axis->width_count; i++ ) - FT_TRACE5(( " %d", axis->widths[i].org )); + FT_TRACE5(( " %ld", axis->widths[i].org )); FT_TRACE5(( "\n" )); } @@ -1032,7 +1031,7 @@ { *a = *b; FT_TRACE5(( "blue zone overlap:" - " adjusting %s %d to %ld\n", + " adjusting %s %ld to %ld\n", a_is_top ? "overshoot" : "reference", blue_sorted[i] - axis->blues, *a )); @@ -1280,7 +1279,7 @@ "af_latin_metrics_scale_dim:" " x height alignment (style `%s'):\n" " " - " vertical scaling changed from %.5f to %.5f (by %d%%)\n" + " vertical scaling changed from %.5f to %.5f (by %ld%%)\n" "\n", af_style_names[metrics->root.style_class->style], scale / 65536.0, @@ -1333,7 +1332,7 @@ width->cur = FT_MulFix( width->org, scale ); width->fit = width->cur; - FT_TRACE5(( " %d scaled to %.2f\n", + FT_TRACE5(( " %ld scaled to %.2f\n", width->org, width->cur / 64.0 )); } @@ -1474,8 +1473,8 @@ AF_LatinBlue blue = &axis->blues[nn]; - FT_TRACE5(( " reference %d: %d scaled to %.2f%s\n" - " overshoot %d: %d scaled to %.2f%s\n", + FT_TRACE5(( " reference %d: %ld scaled to %.2f%s\n" + " overshoot %d: %ld scaled to %.2f%s\n", nn, blue->ref.org, blue->ref.fit / 64.0, @@ -1910,7 +1909,7 @@ /* sense -- this is used to better detect and ignore serifs */ { AF_Segment segments = axis->segments; - AF_Segment segments_end = segments + axis->num_segments; + AF_Segment segments_end = FT_OFFSET( segments, axis->num_segments ); for ( segment = segments; segment < segments_end; segment++ ) @@ -2314,7 +2313,7 @@ */ { AF_Edge edges = axis->edges; - AF_Edge edge_limit = edges + axis->num_edges; + AF_Edge edge_limit = FT_OFFSET( edges, axis->num_edges ); AF_Edge edge; @@ -2945,7 +2944,7 @@ stem_edge->pos = base_edge->pos + fitted_width; - FT_TRACE5(( " LINK: edge %d (opos=%.2f) linked to %.2f," + FT_TRACE5(( " LINK: edge %ld (opos=%.2f) linked to %.2f," " dist was %.2f, now %.2f\n", stem_edge - hints->axis[dim].edges, stem_edge->opos / 64.0, stem_edge->pos / 64.0, dist / 64.0, fitted_width / 64.0 )); @@ -3069,12 +3068,12 @@ #ifdef FT_DEBUG_LEVEL_TRACE if ( !anchor ) - FT_TRACE5(( " BLUE_ANCHOR: edge %d (opos=%.2f) snapped to %.2f," - " was %.2f (anchor=edge %d)\n", + FT_TRACE5(( " BLUE_ANCHOR: edge %ld (opos=%.2f) snapped to %.2f," + " was %.2f (anchor=edge %ld)\n", edge1 - edges, edge1->opos / 64.0, blue->fit / 64.0, edge1->pos / 64.0, edge - edges )); else - FT_TRACE5(( " BLUE: edge %d (opos=%.2f) snapped to %.2f," + FT_TRACE5(( " BLUE: edge %ld (opos=%.2f) snapped to %.2f," " was %.2f\n", edge1 - edges, edge1->opos / 64.0, blue->fit / 64.0, edge1->pos / 64.0 )); @@ -3123,7 +3122,7 @@ /* this should not happen, but it's better to be safe */ if ( edge2->blue_edge ) { - FT_TRACE5(( " ASSERTION FAILED for edge %d\n", edge2 - edges )); + FT_TRACE5(( " ASSERTION FAILED for edge %ld\n", edge2 - edges )); af_latin_align_linked_edge( hints, dim, edge2, edge ); edge->flags |= AF_EDGE_DONE; @@ -3191,7 +3190,7 @@ anchor = edge; edge->flags |= AF_EDGE_DONE; - FT_TRACE5(( " ANCHOR: edge %d (opos=%.2f) and %d (opos=%.2f)" + FT_TRACE5(( " ANCHOR: edge %ld (opos=%.2f) and %ld (opos=%.2f)" " snapped to %.2f and %.2f\n", edge - edges, edge->opos / 64.0, edge2 - edges, edge2->opos / 64.0, @@ -3220,7 +3219,7 @@ if ( edge2->flags & AF_EDGE_DONE ) { - FT_TRACE5(( " ADJUST: edge %d (pos=%.2f) moved to %.2f\n", + FT_TRACE5(( " ADJUST: edge %ld (pos=%.2f) moved to %.2f\n", edge - edges, edge->pos / 64.0, ( edge2->pos - cur_len ) / 64.0 )); @@ -3261,7 +3260,7 @@ edge->pos = cur_pos1 - cur_len / 2; edge2->pos = cur_pos1 + cur_len / 2; - FT_TRACE5(( " STEM: edge %d (opos=%.2f) linked to %d (opos=%.2f)" + FT_TRACE5(( " STEM: edge %ld (opos=%.2f) linked to %ld (opos=%.2f)" " snapped to %.2f and %.2f\n", edge - edges, edge->opos / 64.0, edge2 - edges, edge2->opos / 64.0, @@ -3292,7 +3291,7 @@ edge->pos = ( delta1 < delta2 ) ? cur_pos1 : cur_pos2; edge2->pos = edge->pos + cur_len; - FT_TRACE5(( " STEM: edge %d (opos=%.2f) linked to %d (opos=%.2f)" + FT_TRACE5(( " STEM: edge %ld (opos=%.2f) linked to %ld (opos=%.2f)" " snapped to %.2f and %.2f\n", edge - edges, edge->opos / 64.0, edge2 - edges, edge2->opos / 64.0, @@ -3315,7 +3314,7 @@ if ( edge->link && FT_ABS( edge->link->pos - edge[-1].pos ) > 16 ) { #ifdef FT_DEBUG_LEVEL_TRACE - FT_TRACE5(( " BOUND: edge %d (pos=%.2f) moved to %.2f\n", + FT_TRACE5(( " BOUND: edge %ld (pos=%.2f) moved to %.2f\n", edge - edges, edge->pos / 64.0, edge[-1].pos / 64.0 )); @@ -3417,7 +3416,7 @@ if ( delta < 64 + 16 ) { af_latin_align_serif_edge( hints, edge->serif, edge ); - FT_TRACE5(( " SERIF: edge %d (opos=%.2f) serif to %d (opos=%.2f)" + FT_TRACE5(( " SERIF: edge %ld (opos=%.2f) serif to %ld (opos=%.2f)" " aligned to %.2f\n", edge - edges, edge->opos / 64.0, edge->serif - edges, edge->serif->opos / 64.0, @@ -3427,7 +3426,7 @@ { edge->pos = FT_PIX_ROUND( edge->opos ); anchor = edge; - FT_TRACE5(( " SERIF_ANCHOR: edge %d (opos=%.2f)" + FT_TRACE5(( " SERIF_ANCHOR: edge %ld (opos=%.2f)" " snapped to %.2f\n", edge-edges, edge->opos / 64.0, edge->pos / 64.0 )); } @@ -3455,8 +3454,8 @@ after->pos - before->pos, after->opos - before->opos ); - FT_TRACE5(( " SERIF_LINK1: edge %d (opos=%.2f) snapped to %.2f" - " from %d (opos=%.2f)\n", + FT_TRACE5(( " SERIF_LINK1: edge %ld (opos=%.2f) snapped to %.2f" + " from %ld (opos=%.2f)\n", edge - edges, edge->opos / 64.0, edge->pos / 64.0, before - edges, before->opos / 64.0 )); @@ -3465,7 +3464,7 @@ { edge->pos = anchor->pos + ( ( edge->opos - anchor->opos + 16 ) & ~31 ); - FT_TRACE5(( " SERIF_LINK2: edge %d (opos=%.2f)" + FT_TRACE5(( " SERIF_LINK2: edge %ld (opos=%.2f)" " snapped to %.2f\n", edge - edges, edge->opos / 64.0, edge->pos / 64.0 )); } @@ -3485,7 +3484,7 @@ if ( edge->link && FT_ABS( edge->link->pos - edge[-1].pos ) > 16 ) { #ifdef FT_DEBUG_LEVEL_TRACE - FT_TRACE5(( " BOUND: edge %d (pos=%.2f) moved to %.2f\n", + FT_TRACE5(( " BOUND: edge %ld (pos=%.2f) moved to %.2f\n", edge - edges, edge->pos / 64.0, edge[-1].pos / 64.0 )); @@ -3506,7 +3505,7 @@ if ( edge->link && FT_ABS( edge->link->pos - edge[-1].pos ) > 16 ) { #ifdef FT_DEBUG_LEVEL_TRACE - FT_TRACE5(( " BOUND: edge %d (pos=%.2f) moved to %.2f\n", + FT_TRACE5(( " BOUND: edge %ld (pos=%.2f) moved to %.2f\n", edge - edges, edge->pos / 64.0, edge[1].pos / 64.0 )); diff --git a/src/3rdparty/freetype/src/autofit/aflatin.h b/src/3rdparty/freetype/src/autofit/aflatin.h index 40479538..62bc4c8d 100644 --- a/src/3rdparty/freetype/src/autofit/aflatin.h +++ b/src/3rdparty/freetype/src/autofit/aflatin.h @@ -5,7 +5,7 @@ * Auto-fitter hinting routines for latin writing system * (specification). * - * Copyright (C) 2003-2019 by + * Copyright (C) 2003-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, diff --git a/src/3rdparty/freetype/src/autofit/aflatin2.c b/src/3rdparty/freetype/src/autofit/aflatin2.c index c601ab8d..902f3982 100644 --- a/src/3rdparty/freetype/src/autofit/aflatin2.c +++ b/src/3rdparty/freetype/src/autofit/aflatin2.c @@ -9,7 +9,7 @@ * * Auto-fitter hinting routines for latin writing system (body). * - * Copyright (C) 2003-2019 by + * Copyright (C) 2003-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -21,7 +21,7 @@ */ -#include FT_ADVANCES_H +#include #ifdef FT_OPTION_AUTOFIT2 diff --git a/src/3rdparty/freetype/src/autofit/aflatin2.h b/src/3rdparty/freetype/src/autofit/aflatin2.h index 507cef3d..c2aebc49 100644 --- a/src/3rdparty/freetype/src/autofit/aflatin2.h +++ b/src/3rdparty/freetype/src/autofit/aflatin2.h @@ -10,7 +10,7 @@ * Auto-fitter hinting routines for latin writing system * (specification). * - * Copyright (C) 2003-2019 by + * Copyright (C) 2003-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, diff --git a/src/3rdparty/freetype/src/autofit/afloader.c b/src/3rdparty/freetype/src/autofit/afloader.c index 83743b7b..c35d85c4 100644 --- a/src/3rdparty/freetype/src/autofit/afloader.c +++ b/src/3rdparty/freetype/src/autofit/afloader.c @@ -4,7 +4,7 @@ * * Auto-fitter glyph loading routines (body). * - * Copyright (C) 2003-2019 by + * Copyright (C) 2003-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -22,7 +22,7 @@ #include "aferrors.h" #include "afmodule.h" -#include FT_INTERNAL_CALC_H +#include /* Initialize glyph loader. */ diff --git a/src/3rdparty/freetype/src/autofit/afloader.h b/src/3rdparty/freetype/src/autofit/afloader.h index d1e0f3c0..97282371 100644 --- a/src/3rdparty/freetype/src/autofit/afloader.h +++ b/src/3rdparty/freetype/src/autofit/afloader.h @@ -4,7 +4,7 @@ * * Auto-fitter glyph loading routines (specification). * - * Copyright (C) 2003-2019 by + * Copyright (C) 2003-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, diff --git a/src/3rdparty/freetype/src/autofit/afmodule.c b/src/3rdparty/freetype/src/autofit/afmodule.c index 3e46a365..e1649446 100644 --- a/src/3rdparty/freetype/src/autofit/afmodule.c +++ b/src/3rdparty/freetype/src/autofit/afmodule.c @@ -4,7 +4,7 @@ * * Auto-fitter module implementation (body). * - * Copyright (C) 2003-2019 by + * Copyright (C) 2003-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -53,10 +53,10 @@ void* _af_debug_hints = _af_debug_hints_rec; #endif -#include FT_INTERNAL_OBJECTS_H -#include FT_INTERNAL_DEBUG_H -#include FT_DRIVER_H -#include FT_SERVICE_PROPERTIES_H +#include +#include +#include +#include /************************************************************************** @@ -149,7 +149,7 @@ if ( !af_style_classes[ss] ) { FT_TRACE0(( "af_property_set: Invalid value %d for property `%s'\n", - fallback_script, property_name )); + *fallback_script, property_name )); return FT_THROW( Invalid_Argument ); } @@ -550,8 +550,8 @@ NULL, /* reset_face */ NULL, /* get_global_hints */ NULL, /* done_global_hints */ - (FT_AutoHinter_GlyphLoadFunc)af_autofitter_load_glyph ) /* load_glyph */ - + (FT_AutoHinter_GlyphLoadFunc)af_autofitter_load_glyph /* load_glyph */ + ) FT_DEFINE_MODULE( autofit_module_class, diff --git a/src/3rdparty/freetype/src/autofit/afmodule.h b/src/3rdparty/freetype/src/autofit/afmodule.h index b410809a..e8fe4a93 100644 --- a/src/3rdparty/freetype/src/autofit/afmodule.h +++ b/src/3rdparty/freetype/src/autofit/afmodule.h @@ -4,7 +4,7 @@ * * Auto-fitter module implementation (specification). * - * Copyright (C) 2003-2019 by + * Copyright (C) 2003-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -19,9 +19,8 @@ #ifndef AFMODULE_H_ #define AFMODULE_H_ -#include -#include FT_INTERNAL_OBJECTS_H -#include FT_MODULE_H +#include +#include FT_BEGIN_HEADER @@ -47,6 +46,7 @@ FT_BEGIN_HEADER } AF_ModuleRec, *AF_Module; +FT_DECLARE_AUTOHINTER_INTERFACE( af_autofitter_interface ) FT_DECLARE_MODULE( autofit_module_class ) diff --git a/src/3rdparty/freetype/src/autofit/afpic.c b/src/3rdparty/freetype/src/autofit/afpic.c deleted file mode 100644 index d48d016a..00000000 --- a/src/3rdparty/freetype/src/autofit/afpic.c +++ /dev/null @@ -1,152 +0,0 @@ -/***************************************************************************/ -/* */ -/* afpic.c */ -/* */ -/* The FreeType position independent code services for autofit module. */ -/* */ -/* Copyright 2009-2018 by */ -/* Oran Agra and Mickey Gabel. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#include -#include FT_FREETYPE_H -#include FT_INTERNAL_OBJECTS_H -#include "afpic.h" -#include "afglobal.h" -#include "aferrors.h" - - -#ifdef FT_CONFIG_OPTION_PIC - - /* forward declaration of PIC init functions from afmodule.c */ - FT_Error - FT_Create_Class_af_services( FT_Library library, - FT_ServiceDescRec** output_class ); - - void - FT_Destroy_Class_af_services( FT_Library library, - FT_ServiceDescRec* clazz ); - - void - FT_Init_Class_af_service_properties( FT_Service_PropertiesRec* clazz ); - - void FT_Init_Class_af_autofitter_interface( - FT_Library library, - FT_AutoHinter_InterfaceRec* clazz ); - - - /* forward declaration of PIC init functions from writing system classes */ -#undef WRITING_SYSTEM -#define WRITING_SYSTEM( ws, WS ) /* empty */ - -#include "afwrtsys.h" - - - void - autofit_module_class_pic_free( FT_Library library ) - { - FT_PIC_Container* pic_container = &library->pic_container; - FT_Memory memory = library->memory; - - - if ( pic_container->autofit ) - { - AFModulePIC* container = (AFModulePIC*)pic_container->autofit; - - - if ( container->af_services ) - FT_Destroy_Class_af_services( library, - container->af_services ); - container->af_services = NULL; - - FT_FREE( container ); - pic_container->autofit = NULL; - } - } - - - FT_Error - autofit_module_class_pic_init( FT_Library library ) - { - FT_PIC_Container* pic_container = &library->pic_container; - FT_UInt ss; - FT_Error error = FT_Err_Ok; - AFModulePIC* container = NULL; - FT_Memory memory = library->memory; - - - /* allocate pointer, clear and set global container pointer */ - if ( FT_ALLOC ( container, sizeof ( *container ) ) ) - return error; - FT_MEM_SET( container, 0, sizeof ( *container ) ); - pic_container->autofit = container; - - /* initialize pointer table - */ - /* this is how the module usually expects this data */ - error = FT_Create_Class_af_services( library, - &container->af_services ); - if ( error ) - goto Exit; - - FT_Init_Class_af_service_properties( &container->af_service_properties ); - - for ( ss = 0; ss < AF_WRITING_SYSTEM_MAX; ss++ ) - container->af_writing_system_classes[ss] = - &container->af_writing_system_classes_rec[ss]; - container->af_writing_system_classes[AF_WRITING_SYSTEM_MAX] = NULL; - - for ( ss = 0; ss < AF_SCRIPT_MAX; ss++ ) - container->af_script_classes[ss] = - &container->af_script_classes_rec[ss]; - container->af_script_classes[AF_SCRIPT_MAX] = NULL; - - for ( ss = 0; ss < AF_STYLE_MAX; ss++ ) - container->af_style_classes[ss] = - &container->af_style_classes_rec[ss]; - container->af_style_classes[AF_STYLE_MAX] = NULL; - -#undef WRITING_SYSTEM -#define WRITING_SYSTEM( ws, WS ) \ - FT_Init_Class_af_ ## ws ## _writing_system_class( \ - &container->af_writing_system_classes_rec[ss++] ); - - ss = 0; -#include "afwrtsys.h" - -#undef SCRIPT -#define SCRIPT( s, S, d, h, H, sss ) \ - FT_Init_Class_af_ ## s ## _script_class( \ - &container->af_script_classes_rec[ss++] ); - - ss = 0; -#include "afscript.h" - -#undef STYLE -#define STYLE( s, S, d, ws, sc, bss, c ) \ - FT_Init_Class_af_ ## s ## _style_class( \ - &container->af_style_classes_rec[ss++] ); - - ss = 0; -#include "afstyles.h" - - FT_Init_Class_af_autofitter_interface( - library, &container->af_autofitter_interface ); - - Exit: - if ( error ) - autofit_module_class_pic_free( library ); - return error; - } - -#endif /* FT_CONFIG_OPTION_PIC */ - - -/* END */ diff --git a/src/3rdparty/freetype/src/autofit/afpic.h b/src/3rdparty/freetype/src/autofit/afpic.h deleted file mode 100644 index 0c734567..00000000 --- a/src/3rdparty/freetype/src/autofit/afpic.h +++ /dev/null @@ -1,105 +0,0 @@ -/***************************************************************************/ -/* */ -/* afpic.h */ -/* */ -/* The FreeType position independent code services for autofit module. */ -/* */ -/* Copyright 2009-2018 by */ -/* Oran Agra and Mickey Gabel. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef AFPIC_H_ -#define AFPIC_H_ - - -#include FT_INTERNAL_PIC_H - - -#ifndef FT_CONFIG_OPTION_PIC - -#define AF_SERVICES_GET af_services -#define AF_SERVICE_PROPERTIES_GET af_service_properties - -#define AF_WRITING_SYSTEM_CLASSES_GET af_writing_system_classes -#define AF_SCRIPT_CLASSES_GET af_script_classes -#define AF_STYLE_CLASSES_GET af_style_classes -#define AF_INTERFACE_GET af_autofitter_interface - -#else /* FT_CONFIG_OPTION_PIC */ - - /* some include files required for members of AFModulePIC */ -#include FT_SERVICE_PROPERTIES_H - -#include "aftypes.h" - - -FT_BEGIN_HEADER - - typedef struct AFModulePIC_ - { - FT_ServiceDescRec* af_services; - FT_Service_PropertiesRec af_service_properties; - - AF_WritingSystemClass af_writing_system_classes - [AF_WRITING_SYSTEM_MAX + 1]; - AF_WritingSystemClassRec af_writing_system_classes_rec - [AF_WRITING_SYSTEM_MAX]; - - AF_ScriptClass af_script_classes - [AF_SCRIPT_MAX + 1]; - AF_ScriptClassRec af_script_classes_rec - [AF_SCRIPT_MAX]; - - AF_StyleClass af_style_classes - [AF_STYLE_MAX + 1]; - AF_StyleClassRec af_style_classes_rec - [AF_STYLE_MAX]; - - FT_AutoHinter_InterfaceRec af_autofitter_interface; - - } AFModulePIC; - - -#define GET_PIC( lib ) \ - ( (AFModulePIC*)( (lib)->pic_container.autofit ) ) - -#define AF_SERVICES_GET \ - ( GET_PIC( library )->af_services ) -#define AF_SERVICE_PROPERTIES_GET \ - ( GET_PIC( library )->af_service_properties ) - -#define AF_WRITING_SYSTEM_CLASSES_GET \ - ( GET_PIC( FT_FACE_LIBRARY( globals->face ) )->af_writing_system_classes ) -#define AF_SCRIPT_CLASSES_GET \ - ( GET_PIC( FT_FACE_LIBRARY( globals->face ) )->af_script_classes ) -#define AF_STYLE_CLASSES_GET \ - ( GET_PIC( FT_FACE_LIBRARY( globals->face ) )->af_style_classes ) -#define AF_INTERFACE_GET \ - ( GET_PIC( library )->af_autofitter_interface ) - - - /* see afpic.c for the implementation */ - void - autofit_module_class_pic_free( FT_Library library ); - - FT_Error - autofit_module_class_pic_init( FT_Library library ); - -FT_END_HEADER - -#endif /* FT_CONFIG_OPTION_PIC */ - - /* */ - -#endif /* AFPIC_H_ */ - - -/* END */ diff --git a/src/3rdparty/freetype/src/autofit/afranges.c b/src/3rdparty/freetype/src/autofit/afranges.c index 45c8bbfc..c8ebf5e7 100644 --- a/src/3rdparty/freetype/src/autofit/afranges.c +++ b/src/3rdparty/freetype/src/autofit/afranges.c @@ -4,7 +4,7 @@ * * Auto-fitter Unicode script ranges (body). * - * Copyright (C) 2013-2019 by + * Copyright (C) 2013-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -664,6 +664,18 @@ }; + const AF_Script_UniRangeRec af_medf_uniranges[] = + { + AF_UNIRANGE_REC( 0x16E40, 0x16E9F ), /* Medefaidrin */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_medf_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_mong_uniranges[] = { AF_UNIRANGE_REC( 0x1800, 0x18AF ), /* Mongolian */ @@ -778,6 +790,18 @@ }; + const AF_Script_UniRangeRec af_rohg_uniranges[] = + { + AF_UNIRANGE_REC( 0x10D00, 0x10D3F ), /* Hanifi Rohingya */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_rohg_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_saur_uniranges[] = { AF_UNIRANGE_REC( 0xA880, 0xA8DF ), /* Saurashtra */ diff --git a/src/3rdparty/freetype/src/autofit/afranges.h b/src/3rdparty/freetype/src/autofit/afranges.h index d5917aef..c2ffda4b 100644 --- a/src/3rdparty/freetype/src/autofit/afranges.h +++ b/src/3rdparty/freetype/src/autofit/afranges.h @@ -4,7 +4,7 @@ * * Auto-fitter Unicode script ranges (specification). * - * Copyright (C) 2013-2019 by + * Copyright (C) 2013-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, diff --git a/src/3rdparty/freetype/src/autofit/afscript.h b/src/3rdparty/freetype/src/autofit/afscript.h index 2da8c701..4cf9cc19 100644 --- a/src/3rdparty/freetype/src/autofit/afscript.h +++ b/src/3rdparty/freetype/src/autofit/afscript.h @@ -4,7 +4,7 @@ * * Auto-fitter scripts (specification only). * - * Copyright (C) 2013-2019 by + * Copyright (C) 2013-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -243,6 +243,12 @@ HINTING_BOTTOM_TO_TOP, "\xE0\xB4\xA0 \xE0\xB4\xB1" ) /* ഠ റ */ + SCRIPT( medf, MEDF, + "Medefaidrin", + HB_SCRIPT_MEDEFAIDRIN, + HINTING_BOTTOM_TO_TOP, + "\xF0\x96\xB9\xA1 \xF0\x96\xB9\x9B \xF0\x96\xB9\xAF" ) /* 𖹡 𖹛 𖹯 */ + SCRIPT( mong, MONG, "Mongolian", HB_SCRIPT_MONGOLIAN, @@ -291,6 +297,12 @@ HINTING_BOTTOM_TO_TOP, "\xF0\x90\x92\x86 \xF0\x90\x92\xA0" ) /* 𐒆 𐒠 */ + SCRIPT( rohg, ROHG, + "Hanifi Rohingya", + HB_SCRIPT_HANIFI_ROHINGYA, + HINTING_BOTTOM_TO_TOP, + "\xF0\x90\xB4\xB0" ) /* 𐴰 */ + SCRIPT( saur, SAUR, "Saurashtra", HB_SCRIPT_SAURASHTRA, diff --git a/src/3rdparty/freetype/src/autofit/afshaper.c b/src/3rdparty/freetype/src/autofit/afshaper.c index a5191c69..bbf7b6b1 100644 --- a/src/3rdparty/freetype/src/autofit/afshaper.c +++ b/src/3rdparty/freetype/src/autofit/afshaper.c @@ -4,7 +4,7 @@ * * HarfBuzz interface for accessing OpenType features (body). * - * Copyright (C) 2013-2019 by + * Copyright (C) 2013-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -16,9 +16,8 @@ */ -#include -#include FT_FREETYPE_H -#include FT_ADVANCES_H +#include +#include #include "afglobal.h" #include "aftypes.h" #include "afshaper.h" diff --git a/src/3rdparty/freetype/src/autofit/afshaper.h b/src/3rdparty/freetype/src/autofit/afshaper.h index 06a1e066..138c27b3 100644 --- a/src/3rdparty/freetype/src/autofit/afshaper.h +++ b/src/3rdparty/freetype/src/autofit/afshaper.h @@ -4,7 +4,7 @@ * * HarfBuzz interface for accessing OpenType features (specification). * - * Copyright (C) 2013-2019 by + * Copyright (C) 2013-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -20,8 +20,7 @@ #define AFSHAPER_H_ -#include -#include FT_FREETYPE_H +#include #ifdef FT_CONFIG_OPTION_USE_HARFBUZZ diff --git a/src/3rdparty/freetype/src/autofit/afstyles.h b/src/3rdparty/freetype/src/autofit/afstyles.h index 8d1d7081..9113ec45 100644 --- a/src/3rdparty/freetype/src/autofit/afstyles.h +++ b/src/3rdparty/freetype/src/autofit/afstyles.h @@ -4,7 +4,7 @@ * * Auto-fitter styles (specification only). * - * Copyright (C) 2013-2019 by + * Copyright (C) 2013-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -322,6 +322,13 @@ AF_BLUE_STRINGSET_MLYM, AF_COVERAGE_DEFAULT ) + STYLE( medf_dflt, MEDF_DFLT, + "Medefaidrin default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_MEDF, + AF_BLUE_STRINGSET_MEDF, + AF_COVERAGE_DEFAULT ) + STYLE( mong_dflt, MONG_DFLT, "Mongolian default style", AF_WRITING_SYSTEM_LATIN, @@ -378,6 +385,13 @@ AF_BLUE_STRINGSET_OSMA, AF_COVERAGE_DEFAULT ) + STYLE( rohg_dflt, ROHG_DFLT, + "Hanifi Rohingya default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_ROHG, + AF_BLUE_STRINGSET_ROHG, + AF_COVERAGE_DEFAULT ) + STYLE( saur_dflt, SAUR_DFLT, "Saurashtra default style", AF_WRITING_SYSTEM_LATIN, diff --git a/src/3rdparty/freetype/src/autofit/aftypes.h b/src/3rdparty/freetype/src/autofit/aftypes.h index 579003d2..5f040c6b 100644 --- a/src/3rdparty/freetype/src/autofit/aftypes.h +++ b/src/3rdparty/freetype/src/autofit/aftypes.h @@ -4,7 +4,7 @@ * * Auto-fitter types (specification only). * - * Copyright (C) 2003-2019 by + * Copyright (C) 2003-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -32,12 +32,11 @@ #ifndef AFTYPES_H_ #define AFTYPES_H_ -#include -#include FT_FREETYPE_H -#include FT_OUTLINE_H -#include FT_INTERNAL_OBJECTS_H -#include FT_INTERNAL_DEBUG_H +#include +#include +#include +#include #include "afblue.h" diff --git a/src/3rdparty/freetype/src/autofit/afwarp.c b/src/3rdparty/freetype/src/autofit/afwarp.c index 84e9753a..808280df 100644 --- a/src/3rdparty/freetype/src/autofit/afwarp.c +++ b/src/3rdparty/freetype/src/autofit/afwarp.c @@ -4,7 +4,7 @@ * * Auto-fitter warping algorithm (body). * - * Copyright (C) 2006-2019 by + * Copyright (C) 2006-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, diff --git a/src/3rdparty/freetype/src/autofit/afwarp.h b/src/3rdparty/freetype/src/autofit/afwarp.h index 9a2c9a42..cdea23e7 100644 --- a/src/3rdparty/freetype/src/autofit/afwarp.h +++ b/src/3rdparty/freetype/src/autofit/afwarp.h @@ -4,7 +4,7 @@ * * Auto-fitter warping algorithm (specification). * - * Copyright (C) 2006-2019 by + * Copyright (C) 2006-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, diff --git a/src/3rdparty/freetype/src/autofit/afwrtsys.h b/src/3rdparty/freetype/src/autofit/afwrtsys.h index 5611cf44..3990633d 100644 --- a/src/3rdparty/freetype/src/autofit/afwrtsys.h +++ b/src/3rdparty/freetype/src/autofit/afwrtsys.h @@ -4,7 +4,7 @@ * * Auto-fitter writing systems (specification only). * - * Copyright (C) 2013-2019 by + * Copyright (C) 2013-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, diff --git a/src/3rdparty/freetype/src/autofit/autofit.c b/src/3rdparty/freetype/src/autofit/autofit.c index facfec17..ef5e7f14 100644 --- a/src/3rdparty/freetype/src/autofit/autofit.c +++ b/src/3rdparty/freetype/src/autofit/autofit.c @@ -4,7 +4,7 @@ * * Auto-fitter module (body). * - * Copyright (C) 2003-2019 by + * Copyright (C) 2003-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -17,7 +17,6 @@ #define FT_MAKE_OPTION_SINGLE_OBJECT -#include #include "afangles.c" #include "afblue.c" diff --git a/src/3rdparty/freetype/src/autofit/hbshim.c b/src/3rdparty/freetype/src/autofit/hbshim.c deleted file mode 100644 index 7a45059c..00000000 --- a/src/3rdparty/freetype/src/autofit/hbshim.c +++ /dev/null @@ -1,546 +0,0 @@ -/***************************************************************************/ -/* */ -/* hbshim.c */ -/* */ -/* HarfBuzz interface for accessing OpenType features (body). */ -/* */ -/* Copyright 2013-2015 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#include -#include FT_FREETYPE_H -#include "afglobal.h" -#include "aftypes.h" -#include "hbshim.h" - -#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_afharfbuzz - - - /* - * We use `sets' (in the HarfBuzz sense, which comes quite near to the - * usual mathematical meaning) to manage both lookups and glyph indices. - * - * 1. For each coverage, collect lookup IDs in a set. Note that an - * auto-hinter `coverage' is represented by one `feature', and a - * feature consists of an arbitrary number of (font specific) `lookup's - * that actually do the mapping job. Please check the OpenType - * specification for more details on features and lookups. - * - * 2. Create glyph ID sets from the corresponding lookup sets. - * - * 3. The glyph set corresponding to AF_COVERAGE_DEFAULT is computed - * with all lookups specific to the OpenType script activated. It - * relies on the order of AF_DEFINE_STYLE_CLASS entries so that - * special coverages (like `oldstyle figures') don't get overwritten. - * - */ - - - /* load coverage tags */ -#undef COVERAGE -#define COVERAGE( name, NAME, description, \ - tag1, tag2, tag3, tag4 ) \ - static const hb_tag_t name ## _coverage[] = \ - { \ - HB_TAG( tag1, tag2, tag3, tag4 ), \ - HB_TAG_NONE \ - }; - - -#include "afcover.h" - - - /* define mapping between coverage tags and AF_Coverage */ -#undef COVERAGE -#define COVERAGE( name, NAME, description, \ - tag1, tag2, tag3, tag4 ) \ - name ## _coverage, - - - static const hb_tag_t* coverages[] = - { -#include "afcover.h" - - NULL /* AF_COVERAGE_DEFAULT */ - }; - - - /* load HarfBuzz script tags */ -#undef SCRIPT -#define SCRIPT( s, S, d, h, sc1, sc2, sc3 ) h, - - - static const hb_script_t scripts[] = - { -#include "afscript.h" - }; - - - FT_Error - af_get_coverage( AF_FaceGlobals globals, - AF_StyleClass style_class, - FT_UShort* gstyles ) - { - hb_face_t* face; - - hb_set_t* gsub_lookups; /* GSUB lookups for a given script */ - hb_set_t* gsub_glyphs; /* glyphs covered by GSUB lookups */ - hb_set_t* gpos_lookups; /* GPOS lookups for a given script */ - hb_set_t* gpos_glyphs; /* glyphs covered by GPOS lookups */ - - hb_script_t script; - const hb_tag_t* coverage_tags; - hb_tag_t script_tags[] = { HB_TAG_NONE, - HB_TAG_NONE, - HB_TAG_NONE, - HB_TAG_NONE }; - - hb_codepoint_t idx; -#ifdef FT_DEBUG_LEVEL_TRACE - int count; -#endif - - - if ( !globals || !style_class || !gstyles ) - return FT_THROW( Invalid_Argument ); - - face = hb_font_get_face( globals->hb_font ); - - gsub_lookups = hb_set_create(); - gsub_glyphs = hb_set_create(); - gpos_lookups = hb_set_create(); - gpos_glyphs = hb_set_create(); - - coverage_tags = coverages[style_class->coverage]; - script = scripts[style_class->script]; - - /* Convert a HarfBuzz script tag into the corresponding OpenType */ - /* tag or tags -- some Indic scripts like Devanagari have an old */ - /* and a new set of features. */ - hb_ot_tags_from_script( script, - &script_tags[0], - &script_tags[1] ); - - /* `hb_ot_tags_from_script' usually returns HB_OT_TAG_DEFAULT_SCRIPT */ - /* as the second tag. We change that to HB_TAG_NONE except for the */ - /* default script. */ - if ( style_class->script == globals->module->default_script && - style_class->coverage == AF_COVERAGE_DEFAULT ) - { - if ( script_tags[0] == HB_TAG_NONE ) - script_tags[0] = HB_OT_TAG_DEFAULT_SCRIPT; - else - { - if ( script_tags[1] == HB_TAG_NONE ) - script_tags[1] = HB_OT_TAG_DEFAULT_SCRIPT; - else if ( script_tags[1] != HB_OT_TAG_DEFAULT_SCRIPT ) - script_tags[2] = HB_OT_TAG_DEFAULT_SCRIPT; - } - } - else - { - if ( script_tags[1] == HB_OT_TAG_DEFAULT_SCRIPT ) - script_tags[1] = HB_TAG_NONE; - } - - hb_ot_layout_collect_lookups( face, - HB_OT_TAG_GSUB, - script_tags, - NULL, - coverage_tags, - gsub_lookups ); - - if ( hb_set_is_empty( gsub_lookups ) ) - goto Exit; /* nothing to do */ - - hb_ot_layout_collect_lookups( face, - HB_OT_TAG_GPOS, - script_tags, - NULL, - coverage_tags, - gpos_lookups ); - - FT_TRACE4(( "GSUB lookups (style `%s'):\n" - " ", - af_style_names[style_class->style] )); - -#ifdef FT_DEBUG_LEVEL_TRACE - count = 0; -#endif - - for ( idx = HB_SET_VALUE_INVALID; hb_set_next( gsub_lookups, &idx ); ) - { -#ifdef FT_DEBUG_LEVEL_TRACE - FT_TRACE4(( " %d", idx )); - count++; -#endif - - /* get output coverage of GSUB feature */ - hb_ot_layout_lookup_collect_glyphs( face, - HB_OT_TAG_GSUB, - idx, - NULL, - NULL, - NULL, - gsub_glyphs ); - } - -#ifdef FT_DEBUG_LEVEL_TRACE - if ( !count ) - FT_TRACE4(( " (none)" )); - FT_TRACE4(( "\n\n" )); -#endif - - FT_TRACE4(( "GPOS lookups (style `%s'):\n" - " ", - af_style_names[style_class->style] )); - -#ifdef FT_DEBUG_LEVEL_TRACE - count = 0; -#endif - - for ( idx = HB_SET_VALUE_INVALID; hb_set_next( gpos_lookups, &idx ); ) - { -#ifdef FT_DEBUG_LEVEL_TRACE - FT_TRACE4(( " %d", idx )); - count++; -#endif - - /* get input coverage of GPOS feature */ - hb_ot_layout_lookup_collect_glyphs( face, - HB_OT_TAG_GPOS, - idx, - NULL, - gpos_glyphs, - NULL, - NULL ); - } - -#ifdef FT_DEBUG_LEVEL_TRACE - if ( !count ) - FT_TRACE4(( " (none)" )); - FT_TRACE4(( "\n\n" )); -#endif - - /* - * We now check whether we can construct blue zones, using glyphs - * covered by the feature only. In case there is not a single zone - * (this is, not a single character is covered), we skip this coverage. - * - */ - if ( style_class->coverage != AF_COVERAGE_DEFAULT ) - { - AF_Blue_Stringset bss = style_class->blue_stringset; - const AF_Blue_StringRec* bs = &af_blue_stringsets[bss]; - - FT_Bool found = 0; - - - for ( ; bs->string != AF_BLUE_STRING_MAX; bs++ ) - { - const char* p = &af_blue_strings[bs->string]; - - - while ( *p ) - { - hb_codepoint_t ch; - - - GET_UTF8_CHAR( ch, p ); - - for ( idx = HB_SET_VALUE_INVALID; hb_set_next( gsub_lookups, - &idx ); ) - { - hb_codepoint_t gidx = FT_Get_Char_Index( globals->face, ch ); - - - if ( hb_ot_layout_lookup_would_substitute( face, idx, - &gidx, 1, 1 ) ) - { - found = 1; - break; - } - } - } - } - - if ( !found ) - { - FT_TRACE4(( " no blue characters found; style skipped\n" )); - goto Exit; - } - } - - /* - * Various OpenType features might use the same glyphs at different - * vertical positions; for example, superscript and subscript glyphs - * could be the same. However, the auto-hinter is completely - * agnostic of OpenType features after the feature analysis has been - * completed: The engine then simply receives a glyph index and returns a - * hinted and usually rendered glyph. - * - * Consider the superscript feature of font `pala.ttf': Some of the - * glyphs are `real', this is, they have a zero vertical offset, but - * most of them are small caps glyphs shifted up to the superscript - * position (this is, the `sups' feature is present in both the GSUB and - * GPOS tables). The code for blue zones computation actually uses a - * feature's y offset so that the `real' glyphs get correct hints. But - * later on it is impossible to decide whether a glyph index belongs to, - * say, the small caps or superscript feature. - * - * For this reason, we don't assign a style to a glyph if the current - * feature covers the glyph in both the GSUB and the GPOS tables. This - * is quite a broad condition, assuming that - * - * (a) glyphs that get used in multiple features are present in a - * feature without vertical shift, - * - * and - * - * (b) a feature's GPOS data really moves the glyph vertically. - * - * Not fulfilling condition (a) makes a font larger; it would also - * reduce the number of glyphs that could be addressed directly without - * using OpenType features, so this assumption is rather strong. - * - * Condition (b) is much weaker, and there might be glyphs which get - * missed. However, the OpenType features we are going to handle are - * primarily located in GSUB, and HarfBuzz doesn't provide an API to - * directly get the necessary information from the GPOS table. A - * possible solution might be to directly parse the GPOS table to find - * out whether a glyph gets shifted vertically, but this is something I - * would like to avoid if not really necessary. - * - * Note that we don't follow this logic for the default coverage. - * Complex scripts like Devanagari have mandatory GPOS features to - * position many glyph elements, using mark-to-base or mark-to-ligature - * tables; the number of glyphs missed due to condition (b) would be far - * too large. - * - */ - if ( style_class->coverage != AF_COVERAGE_DEFAULT ) - hb_set_subtract( gsub_glyphs, gpos_glyphs ); - -#ifdef FT_DEBUG_LEVEL_TRACE - FT_TRACE4(( " glyphs without GPOS data (`*' means already assigned)" )); - count = 0; -#endif - - for ( idx = HB_SET_VALUE_INVALID; hb_set_next( gsub_glyphs, &idx ); ) - { -#ifdef FT_DEBUG_LEVEL_TRACE - if ( !( count % 10 ) ) - FT_TRACE4(( "\n" - " " )); - - FT_TRACE4(( " %d", idx )); - count++; -#endif - - /* glyph indices returned by `hb_ot_layout_lookup_collect_glyphs' */ - /* can be arbitrary: some fonts use fake indices for processing */ - /* internal to GSUB or GPOS, which is fully valid */ - if ( idx >= (hb_codepoint_t)globals->glyph_count ) - continue; - - if ( gstyles[idx] == AF_STYLE_UNASSIGNED ) - gstyles[idx] = (FT_UShort)style_class->style; -#ifdef FT_DEBUG_LEVEL_TRACE - else - FT_TRACE4(( "*" )); -#endif - } - -#ifdef FT_DEBUG_LEVEL_TRACE - if ( !count ) - FT_TRACE4(( "\n" - " (none)" )); - FT_TRACE4(( "\n\n" )); -#endif - - Exit: - hb_set_destroy( gsub_lookups ); - hb_set_destroy( gsub_glyphs ); - hb_set_destroy( gpos_lookups ); - hb_set_destroy( gpos_glyphs ); - - return FT_Err_Ok; - } - - - /* construct HarfBuzz features */ -#undef COVERAGE -#define COVERAGE( name, NAME, description, \ - tag1, tag2, tag3, tag4 ) \ - static const hb_feature_t name ## _feature[] = \ - { \ - { \ - HB_TAG( tag1, tag2, tag3, tag4 ), \ - 1, 0, (unsigned int)-1 \ - } \ - }; - - -#include "afcover.h" - - - /* define mapping between HarfBuzz features and AF_Coverage */ -#undef COVERAGE -#define COVERAGE( name, NAME, description, \ - tag1, tag2, tag3, tag4 ) \ - name ## _feature, - - - static const hb_feature_t* features[] = - { -#include "afcover.h" - - NULL /* AF_COVERAGE_DEFAULT */ - }; - - - FT_Error - af_get_char_index( AF_StyleMetrics metrics, - FT_ULong charcode, - FT_ULong *codepoint, - FT_Long *y_offset ) - { - AF_StyleClass style_class; - - const hb_feature_t* feature; - - FT_ULong in_idx, out_idx; - - - if ( !metrics ) - return FT_THROW( Invalid_Argument ); - - in_idx = FT_Get_Char_Index( metrics->globals->face, charcode ); - - style_class = metrics->style_class; - - feature = features[style_class->coverage]; - - if ( feature ) - { - FT_Int upem = (FT_Int)metrics->globals->face->units_per_EM; - - hb_font_t* font = metrics->globals->hb_font; - hb_buffer_t* buf = hb_buffer_create(); - - uint32_t c = (uint32_t)charcode; - - hb_glyph_info_t* ginfo; - hb_glyph_position_t* gpos; - unsigned int gcount; - - - /* we shape at a size of units per EM; this means font units */ - hb_font_set_scale( font, upem, upem ); - - /* XXX: is this sufficient for a single character of any script? */ - hb_buffer_set_direction( buf, HB_DIRECTION_LTR ); - hb_buffer_set_script( buf, scripts[style_class->script] ); - - /* we add one character to `buf' ... */ - hb_buffer_add_utf32( buf, &c, 1, 0, 1 ); - - /* ... and apply one feature */ - hb_shape( font, buf, feature, 1 ); - - ginfo = hb_buffer_get_glyph_infos( buf, &gcount ); - gpos = hb_buffer_get_glyph_positions( buf, &gcount ); - - out_idx = ginfo[0].codepoint; - - /* getting the same index indicates no substitution, */ - /* which means that the glyph isn't available in the feature */ - if ( in_idx == out_idx ) - { - *codepoint = 0; - *y_offset = 0; - } - else - { - *codepoint = out_idx; - *y_offset = gpos[0].y_offset; - } - - hb_buffer_destroy( buf ); - -#ifdef FT_DEBUG_LEVEL_TRACE - if ( gcount > 1 ) - FT_TRACE1(( "af_get_char_index:" - " input character mapped to multiple glyphs\n" )); -#endif - } - else - { - *codepoint = in_idx; - *y_offset = 0; - } - - return FT_Err_Ok; - } - - -#else /* !FT_CONFIG_OPTION_USE_HARFBUZZ */ - - - FT_Error - af_get_coverage( AF_FaceGlobals globals, - AF_StyleClass style_class, - FT_UShort* gstyles ) - { - FT_UNUSED( globals ); - FT_UNUSED( style_class ); - FT_UNUSED( gstyles ); - - return FT_Err_Ok; - } - - - FT_Error - af_get_char_index( AF_StyleMetrics metrics, - FT_ULong charcode, - FT_ULong *codepoint, - FT_Long *y_offset ) - { - FT_Face face; - - - if ( !metrics ) - return FT_THROW( Invalid_Argument ); - - face = metrics->globals->face; - - *codepoint = FT_Get_Char_Index( face, charcode ); - *y_offset = 0; - - return FT_Err_Ok; - } - - -#endif /* !FT_CONFIG_OPTION_USE_HARFBUZZ */ - - -/* END */ diff --git a/src/3rdparty/freetype/src/autofit/hbshim.h b/src/3rdparty/freetype/src/autofit/hbshim.h deleted file mode 100644 index 3824941c..00000000 --- a/src/3rdparty/freetype/src/autofit/hbshim.h +++ /dev/null @@ -1,56 +0,0 @@ -/***************************************************************************/ -/* */ -/* hbshim.h */ -/* */ -/* HarfBuzz interface for accessing OpenType features (specification). */ -/* */ -/* Copyright 2013-2015 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __HBSHIM_H__ -#define __HBSHIM_H__ - - -#include -#include FT_FREETYPE_H - - -#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ - -#include -#include -#include - -#endif - - -FT_BEGIN_HEADER - - FT_Error - af_get_coverage( AF_FaceGlobals globals, - AF_StyleClass style_class, - FT_UShort* gstyles ); - - FT_Error - af_get_char_index( AF_StyleMetrics metrics, - FT_ULong charcode, - FT_ULong *codepoint, - FT_Long *y_offset ); - - /* */ - -FT_END_HEADER - -#endif /* __HBSHIM_H__ */ - - -/* END */ diff --git a/src/3rdparty/freetype/src/autofit/module.mk b/src/3rdparty/freetype/src/autofit/module.mk index cf77b169..c32781f4 100644 --- a/src/3rdparty/freetype/src/autofit/module.mk +++ b/src/3rdparty/freetype/src/autofit/module.mk @@ -3,7 +3,7 @@ # -# Copyright (C) 2003-2019 by +# Copyright (C) 2003-2020 by # David Turner, Robert Wilhelm, and Werner Lemberg. # # This file is part of the FreeType project, and may only be used, modified, diff --git a/src/3rdparty/freetype/src/autofit/rules.mk b/src/3rdparty/freetype/src/autofit/rules.mk index c59da33a..553ddce6 100644 --- a/src/3rdparty/freetype/src/autofit/rules.mk +++ b/src/3rdparty/freetype/src/autofit/rules.mk @@ -3,7 +3,7 @@ # -# Copyright (C) 2003-2019 by +# Copyright (C) 2003-2020 by # David Turner, Robert Wilhelm, and Werner Lemberg. # # This file is part of the FreeType project, and may only be used, modified, diff --git a/src/3rdparty/freetype/src/base/Jamfile b/src/3rdparty/freetype/src/base/Jamfile deleted file mode 100644 index 8e1ec427..00000000 --- a/src/3rdparty/freetype/src/base/Jamfile +++ /dev/null @@ -1,90 +0,0 @@ -# FreeType 2 src/base Jamfile -# -# Copyright (C) 2001-2019 by -# David Turner, Robert Wilhelm, and Werner Lemberg. -# -# This file is part of the FreeType project, and may only be used, modified, -# and distributed under the terms of the FreeType project license, -# LICENSE.TXT. By continuing to use, modify, or distribute this file you -# indicate that you have read the license and understand and accept it -# fully. - -SubDir FT2_TOP $(FT2_SRC_DIR) base ; - - -{ - local _sources ; - - if $(FT2_MULTI) - { - _sources = basepic - ftadvanc - ftcalc - ftcolor - ftdbgmem - fterrors - ftfntfmt - ftgloadr - fthash - ftlcdfil - ftobjs - ftoutln - ftpic - ftpsprop - ftrfork - ftsnames - ftstream - fttrigon - ftutil - ; - } - else - { - _sources = ftbase ; - } - - Library $(FT2_LIB) : $(_sources).c ; -} - -# Add the optional/replaceable files. -# -{ - local _sources = ftbbox - ftbdf - ftbitmap - ftcid - ftdebug - ftfstype - ftgasp - ftglyph - ftgxval - ftinit - ftmm - ftotval - ftpatent - ftpfr - ftstroke - ftsynth - ftsystem - fttype1 - ftwinfnt - ; - - Library $(FT2_LIB) : $(_sources).c ; -} - -# Add Macintosh-specific file to the library when necessary. -# -if $(MAC) -{ - Library $(FT2_LIB) : ftmac.c ; -} -else if $(OS) = MACOSX -{ - if $(FT2_MULTI) - { - Library $(FT2_LIB) : ftmac.c ; - } -} - -# end of src/base Jamfile diff --git a/src/3rdparty/freetype/src/base/basepic.c b/src/3rdparty/freetype/src/base/basepic.c deleted file mode 100644 index bc804064..00000000 --- a/src/3rdparty/freetype/src/base/basepic.c +++ /dev/null @@ -1,108 +0,0 @@ -/***************************************************************************/ -/* */ -/* basepic.c */ -/* */ -/* The FreeType position independent code services for base. */ -/* */ -/* Copyright 2009-2018 by */ -/* Oran Agra and Mickey Gabel. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#include -#include FT_FREETYPE_H -#include FT_INTERNAL_OBJECTS_H -#include "basepic.h" - - -#ifdef FT_CONFIG_OPTION_PIC - - /* forward declaration of PIC init functions from ftglyph.c */ - void - FT_Init_Class_ft_outline_glyph_class( FT_Glyph_Class* clazz ); - - void - FT_Init_Class_ft_bitmap_glyph_class( FT_Glyph_Class* clazz ); - -#ifdef FT_CONFIG_OPTION_MAC_FONTS - /* forward declaration of PIC init function from ftrfork.c */ - /* (not modularized) */ - void - FT_Init_Table_ft_raccess_guess_table( ft_raccess_guess_rec* record ); -#endif - - /* forward declaration of PIC init functions from ftinit.c */ - FT_Error - ft_create_default_module_classes( FT_Library library ); - - void - ft_destroy_default_module_classes( FT_Library library ); - - - void - ft_base_pic_free( FT_Library library ) - { - FT_PIC_Container* pic_container = &library->pic_container; - FT_Memory memory = library->memory; - - - if ( pic_container->base ) - { - /* destroy default module classes */ - /* (in case FT_Add_Default_Modules was used) */ - ft_destroy_default_module_classes( library ); - - FT_FREE( pic_container->base ); - pic_container->base = NULL; - } - } - - - FT_Error - ft_base_pic_init( FT_Library library ) - { - FT_PIC_Container* pic_container = &library->pic_container; - FT_Error error = FT_Err_Ok; - BasePIC* container = NULL; - FT_Memory memory = library->memory; - - - /* allocate pointer, clear and set global container pointer */ - if ( FT_ALLOC( container, sizeof ( *container ) ) ) - return error; - FT_MEM_SET( container, 0, sizeof ( *container ) ); - pic_container->base = container; - - /* initialize default modules list and pointers */ - error = ft_create_default_module_classes( library ); - if ( error ) - goto Exit; - - /* initialize pointer table - */ - /* this is how the module usually expects this data */ - FT_Init_Class_ft_outline_glyph_class( - &container->ft_outline_glyph_class ); - FT_Init_Class_ft_bitmap_glyph_class( - &container->ft_bitmap_glyph_class ); -#ifdef FT_CONFIG_OPTION_MAC_FONTS - FT_Init_Table_ft_raccess_guess_table( - (ft_raccess_guess_rec*)&container->ft_raccess_guess_table ); -#endif - - Exit: - if ( error ) - ft_base_pic_free( library ); - return error; - } - -#endif /* FT_CONFIG_OPTION_PIC */ - - -/* END */ diff --git a/src/3rdparty/freetype/src/base/basepic.h b/src/3rdparty/freetype/src/base/basepic.h deleted file mode 100644 index 492d1ede..00000000 --- a/src/3rdparty/freetype/src/base/basepic.h +++ /dev/null @@ -1,91 +0,0 @@ -/***************************************************************************/ -/* */ -/* basepic.h */ -/* */ -/* The FreeType position independent code services for base. */ -/* */ -/* Copyright 2009-2018 by */ -/* Oran Agra and Mickey Gabel. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef BASEPIC_H_ -#define BASEPIC_H_ - - -#include FT_INTERNAL_PIC_H - - -#ifndef FT_CONFIG_OPTION_PIC - -#define FT_OUTLINE_GLYPH_CLASS_GET &ft_outline_glyph_class -#define FT_BITMAP_GLYPH_CLASS_GET &ft_bitmap_glyph_class -#define FT_DEFAULT_MODULES_GET ft_default_modules - -#ifdef FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK -#define FT_RACCESS_GUESS_TABLE_GET ft_raccess_guess_table -#endif - -#else /* FT_CONFIG_OPTION_PIC */ - -#include FT_GLYPH_H - -#ifdef FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK -#include FT_INTERNAL_RFORK_H -#endif - - -FT_BEGIN_HEADER - - typedef struct BasePIC_ - { - FT_Module_Class** default_module_classes; - FT_Glyph_Class ft_outline_glyph_class; - FT_Glyph_Class ft_bitmap_glyph_class; - -#ifdef FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK - ft_raccess_guess_rec ft_raccess_guess_table[FT_RACCESS_N_RULES]; -#endif - - } BasePIC; - - -#define GET_PIC( lib ) ( (BasePIC*)( (lib)->pic_container.base ) ) - -#define FT_OUTLINE_GLYPH_CLASS_GET \ - ( &GET_PIC( library )->ft_outline_glyph_class ) -#define FT_BITMAP_GLYPH_CLASS_GET \ - ( &GET_PIC( library )->ft_bitmap_glyph_class ) -#define FT_DEFAULT_MODULES_GET \ - ( GET_PIC( library )->default_module_classes ) - -#ifdef FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK -#define FT_RACCESS_GUESS_TABLE_GET \ - ( GET_PIC( library )->ft_raccess_guess_table ) -#endif - - - /* see basepic.c for the implementation */ - void - ft_base_pic_free( FT_Library library ); - - FT_Error - ft_base_pic_init( FT_Library library ); - -FT_END_HEADER - -#endif /* FT_CONFIG_OPTION_PIC */ - - /* */ - -#endif /* BASEPIC_H_ */ - - -/* END */ diff --git a/src/3rdparty/freetype/src/base/ftadvanc.c b/src/3rdparty/freetype/src/base/ftadvanc.c index 0dfba570..c689e6a1 100644 --- a/src/3rdparty/freetype/src/base/ftadvanc.c +++ b/src/3rdparty/freetype/src/base/ftadvanc.c @@ -4,7 +4,7 @@ * * Quick computation of advance widths (body). * - * Copyright (C) 2008-2019 by + * Copyright (C) 2008-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -16,11 +16,10 @@ */ -#include -#include FT_INTERNAL_DEBUG_H +#include -#include FT_ADVANCES_H -#include FT_INTERNAL_OBJECTS_H +#include +#include static FT_Error diff --git a/src/3rdparty/freetype/src/base/ftapi.c b/src/3rdparty/freetype/src/base/ftapi.c deleted file mode 100644 index 32d6e95d..00000000 --- a/src/3rdparty/freetype/src/base/ftapi.c +++ /dev/null @@ -1,121 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftapi.c */ -/* */ -/* The FreeType compatibility functions (body). */ -/* */ -/* Copyright 2002-2018 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#include -#include FT_LIST_H -#include FT_OUTLINE_H -#include FT_INTERNAL_OBJECTS_H -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_STREAM_H -#include FT_TRUETYPE_TABLES_H -#include FT_OUTLINE_H - - - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /**** ****/ - /**** ****/ - /**** C O M P A T I B I L I T Y ****/ - /**** ****/ - /**** ****/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - - /* backward compatibility API */ - - FT_BASE_DEF( void ) - FT_New_Memory_Stream( FT_Library library, - FT_Byte* base, - FT_ULong size, - FT_Stream stream ) - { - FT_UNUSED( library ); - - FT_Stream_OpenMemory( stream, base, size ); - } - - - FT_BASE_DEF( FT_Error ) - FT_Seek_Stream( FT_Stream stream, - FT_ULong pos ) - { - return FT_Stream_Seek( stream, pos ); - } - - - FT_BASE_DEF( FT_Error ) - FT_Skip_Stream( FT_Stream stream, - FT_Long distance ) - { - return FT_Stream_Skip( stream, distance ); - } - - - FT_BASE_DEF( FT_Error ) - FT_Read_Stream( FT_Stream stream, - FT_Byte* buffer, - FT_ULong count ) - { - return FT_Stream_Read( stream, buffer, count ); - } - - - FT_BASE_DEF( FT_Error ) - FT_Read_Stream_At( FT_Stream stream, - FT_ULong pos, - FT_Byte* buffer, - FT_ULong count ) - { - return FT_Stream_ReadAt( stream, pos, buffer, count ); - } - - - FT_BASE_DEF( FT_Error ) - FT_Extract_Frame( FT_Stream stream, - FT_ULong count, - FT_Byte** pbytes ) - { - return FT_Stream_ExtractFrame( stream, count, pbytes ); - } - - - FT_BASE_DEF( void ) - FT_Release_Frame( FT_Stream stream, - FT_Byte** pbytes ) - { - FT_Stream_ReleaseFrame( stream, pbytes ); - } - - FT_BASE_DEF( FT_Error ) - FT_Access_Frame( FT_Stream stream, - FT_ULong count ) - { - return FT_Stream_EnterFrame( stream, count ); - } - - - FT_BASE_DEF( void ) - FT_Forget_Frame( FT_Stream stream ) - { - FT_Stream_ExitFrame( stream ); - } - - -/* END */ diff --git a/src/3rdparty/freetype/src/base/ftbase.c b/src/3rdparty/freetype/src/base/ftbase.c index fb8cbfcc..bfbaffd6 100644 --- a/src/3rdparty/freetype/src/base/ftbase.c +++ b/src/3rdparty/freetype/src/base/ftbase.c @@ -4,7 +4,7 @@ * * Single object library component (body only). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -16,7 +16,6 @@ */ -#include #define FT_MAKE_OPTION_SINGLE_OBJECT #include "ftadvanc.c" diff --git a/src/3rdparty/freetype/src/base/ftbase.h b/src/3rdparty/freetype/src/base/ftbase.h index 35b1c47f..25afa9bc 100644 --- a/src/3rdparty/freetype/src/base/ftbase.h +++ b/src/3rdparty/freetype/src/base/ftbase.h @@ -4,7 +4,7 @@ * * Private functions used in the `base' module (specification). * - * Copyright (C) 2008-2019 by + * Copyright (C) 2008-2020 by * David Turner, Robert Wilhelm, Werner Lemberg, and suzuki toshiya. * * This file is part of the FreeType project, and may only be used, @@ -20,13 +20,16 @@ #define FTBASE_H_ -#include -#include FT_INTERNAL_OBJECTS_H +#include FT_BEGIN_HEADER + FT_DECLARE_GLYPH( ft_bitmap_glyph_class ) + FT_DECLARE_GLYPH( ft_outline_glyph_class ) + + #ifdef FT_CONFIG_OPTION_MAC_FONTS /* MacOS resource fork cannot exceed 16MB at least for Carbon code; */ diff --git a/src/3rdparty/freetype/src/base/ftbbox.c b/src/3rdparty/freetype/src/base/ftbbox.c index a0b2c46f..30a4eba0 100644 --- a/src/3rdparty/freetype/src/base/ftbbox.c +++ b/src/3rdparty/freetype/src/base/ftbbox.c @@ -4,7 +4,7 @@ * * FreeType bbox computation (body). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used @@ -24,14 +24,13 @@ */ -#include -#include FT_INTERNAL_DEBUG_H +#include -#include FT_BBOX_H -#include FT_IMAGE_H -#include FT_OUTLINE_H -#include FT_INTERNAL_CALC_H -#include FT_INTERNAL_OBJECTS_H +#include +#include +#include +#include +#include typedef struct TBBox_Rec_ @@ -294,10 +293,10 @@ if ( shift > 2 ) shift = 2; - q1 <<= shift; - q2 <<= shift; - q3 <<= shift; - q4 <<= shift; + q1 *= 1 << shift; + q2 *= 1 << shift; + q3 *= 1 << shift; + q4 *= 1 << shift; } else { diff --git a/src/3rdparty/freetype/src/base/ftbdf.c b/src/3rdparty/freetype/src/base/ftbdf.c index c0fccd7b..fc374c66 100644 --- a/src/3rdparty/freetype/src/base/ftbdf.c +++ b/src/3rdparty/freetype/src/base/ftbdf.c @@ -4,7 +4,7 @@ * * FreeType API for accessing BDF-specific strings (body). * - * Copyright (C) 2002-2019 by + * Copyright (C) 2002-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -16,11 +16,10 @@ */ -#include -#include FT_INTERNAL_DEBUG_H +#include -#include FT_INTERNAL_OBJECTS_H -#include FT_SERVICE_BDF_H +#include +#include /* documentation is in ftbdf.h */ diff --git a/src/3rdparty/freetype/src/base/ftbitmap.c b/src/3rdparty/freetype/src/base/ftbitmap.c index 0e0a76fe..584213dd 100644 --- a/src/3rdparty/freetype/src/base/ftbitmap.c +++ b/src/3rdparty/freetype/src/base/ftbitmap.c @@ -4,7 +4,7 @@ * * FreeType utility functions for bitmaps (body). * - * Copyright (C) 2004-2019 by + * Copyright (C) 2004-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -16,12 +16,11 @@ */ -#include -#include FT_INTERNAL_DEBUG_H +#include -#include FT_BITMAP_H -#include FT_IMAGE_H -#include FT_INTERNAL_OBJECTS_H +#include +#include +#include /************************************************************************** @@ -909,13 +908,13 @@ #ifdef FT_DEBUG_LEVEL_TRACE FT_TRACE5(( "FT_Bitmap_Blend:\n" - " source bitmap: (%d, %d) -- (%d, %d); %d x %d\n", + " source bitmap: (%ld, %ld) -- (%ld, %ld); %d x %d\n", source_llx / 64, source_lly / 64, source_urx / 64, source_ury / 64, source_->width, source_->rows )); if ( target->width && target->rows ) - FT_TRACE5(( " target bitmap: (%d, %d) -- (%d, %d); %d x %d\n", + FT_TRACE5(( " target bitmap: (%ld, %ld) -- (%ld, %ld); %d x %d\n", target_llx / 64, target_lly / 64, target_urx / 64, target_ury / 64, target->width, target->rows )); @@ -923,7 +922,7 @@ FT_TRACE5(( " target bitmap: empty\n" )); if ( final_width && final_rows ) - FT_TRACE5(( " final bitmap: (%d, %d) -- (%d, %d); %d x %d\n", + FT_TRACE5(( " final bitmap: (%ld, %ld) -- (%ld, %ld); %d x %d\n", final_llx / 64, final_lly / 64, final_urx / 64, final_ury / 64, final_width, final_rows )); diff --git a/src/3rdparty/freetype/src/base/ftcalc.c b/src/3rdparty/freetype/src/base/ftcalc.c index 315dc441..b5258c85 100644 --- a/src/3rdparty/freetype/src/base/ftcalc.c +++ b/src/3rdparty/freetype/src/base/ftcalc.c @@ -4,7 +4,7 @@ * * Arithmetic computations (body). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -32,12 +32,11 @@ */ -#include -#include FT_GLYPH_H -#include FT_TRIGONOMETRY_H -#include FT_INTERNAL_CALC_H -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_OBJECTS_H +#include +#include +#include +#include +#include #ifdef FT_MULFIX_ASSEMBLER diff --git a/src/3rdparty/freetype/src/base/ftcid.c b/src/3rdparty/freetype/src/base/ftcid.c index 190b23f3..ce8a876a 100644 --- a/src/3rdparty/freetype/src/base/ftcid.c +++ b/src/3rdparty/freetype/src/base/ftcid.c @@ -4,7 +4,7 @@ * * FreeType API for accessing CID font information. * - * Copyright (C) 2007-2019 by + * Copyright (C) 2007-2020 by * Derek Clegg and Michael Toftdal. * * This file is part of the FreeType project, and may only be used, @@ -16,10 +16,9 @@ */ -#include -#include FT_CID_H -#include FT_INTERNAL_OBJECTS_H -#include FT_SERVICE_CID_H +#include +#include +#include /* documentation is in ftcid.h */ diff --git a/src/3rdparty/freetype/src/base/ftcolor.c b/src/3rdparty/freetype/src/base/ftcolor.c index 8cb057a3..a50d6800 100644 --- a/src/3rdparty/freetype/src/base/ftcolor.c +++ b/src/3rdparty/freetype/src/base/ftcolor.c @@ -4,7 +4,7 @@ * * FreeType's glyph color management (body). * - * Copyright (C) 2018-2019 by + * Copyright (C) 2018-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -16,11 +16,10 @@ */ -#include -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_SFNT_H -#include FT_INTERNAL_TRUETYPE_TYPES_H -#include FT_COLOR_H +#include +#include +#include +#include #ifdef TT_CONFIG_OPTION_COLOR_LAYERS diff --git a/src/3rdparty/freetype/src/base/ftdbgmem.c b/src/3rdparty/freetype/src/base/ftdbgmem.c index 55cd269e..eb0d6516 100644 --- a/src/3rdparty/freetype/src/base/ftdbgmem.c +++ b/src/3rdparty/freetype/src/base/ftdbgmem.c @@ -4,7 +4,7 @@ * * Memory debugger (body). * - * Copyright (C) 2001-2019 by + * Copyright (C) 2001-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -18,11 +18,11 @@ #include #include FT_CONFIG_CONFIG_H -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_MEMORY_H -#include FT_SYSTEM_H -#include FT_ERRORS_H -#include FT_TYPES_H +#include +#include +#include +#include +#include #ifdef FT_DEBUG_MEMORY @@ -621,8 +621,10 @@ if ( node->size < 0 ) ft_mem_debug_panic( - "freeing memory block at %p more than once at (%s:%ld)\n" - "block allocated at (%s:%ld) and released at (%s:%ld)", + "freeing memory block at %p more than once\n" + " at (%s:%ld)!\n" + " Block was allocated at (%s:%ld)\n" + " and released at (%s:%ld).", address, FT_FILENAME( _ft_debug_file ), _ft_debug_lineno, FT_FILENAME( node->source->file_name ), node->source->line_no, diff --git a/src/3rdparty/freetype/src/base/ftdebug.c b/src/3rdparty/freetype/src/base/ftdebug.c index ec723378..62cf680b 100644 --- a/src/3rdparty/freetype/src/base/ftdebug.c +++ b/src/3rdparty/freetype/src/base/ftdebug.c @@ -4,7 +4,7 @@ * * Debugging and logging component (body). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -41,9 +41,8 @@ */ -#include -#include FT_FREETYPE_H -#include FT_INTERNAL_DEBUG_H +#include +#include #ifdef FT_DEBUG_LEVEL_ERROR @@ -126,7 +125,7 @@ static const char* ft_trace_toggles[trace_count + 1] = { -#include FT_INTERNAL_TRACE_H +#include NULL }; diff --git a/src/3rdparty/freetype/src/base/fterrors.c b/src/3rdparty/freetype/src/base/fterrors.c index 84fe5902..eba9e765 100644 --- a/src/3rdparty/freetype/src/base/fterrors.c +++ b/src/3rdparty/freetype/src/base/fterrors.c @@ -4,7 +4,7 @@ * * FreeType API for error code handling. * - * Copyright (C) 2018-2019 by + * Copyright (C) 2018-2020 by * Armin Hasitzka, David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -16,9 +16,8 @@ */ -#include -#include FT_INTERNAL_DEBUG_H -#include FT_ERRORS_H +#include +#include /* documentation is in fterrors.h */ @@ -38,7 +37,7 @@ #define FT_ERRORDEF( e, v, s ) case v: return s; #define FT_ERROR_END_LIST } -#include FT_ERRORS_H +#include #endif /* defined( FT_CONFIG_OPTION_ERROR_STRINGS ) || ... */ diff --git a/src/3rdparty/freetype/src/base/ftfntfmt.c b/src/3rdparty/freetype/src/base/ftfntfmt.c index 54ba5374..a45317e7 100644 --- a/src/3rdparty/freetype/src/base/ftfntfmt.c +++ b/src/3rdparty/freetype/src/base/ftfntfmt.c @@ -4,7 +4,7 @@ * * FreeType utility file for font formats (body). * - * Copyright (C) 2002-2019 by + * Copyright (C) 2002-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -16,10 +16,9 @@ */ -#include -#include FT_FONT_FORMATS_H -#include FT_INTERNAL_OBJECTS_H -#include FT_SERVICE_FONT_FORMAT_H +#include +#include +#include /* documentation is in ftfntfmt.h */ diff --git a/src/3rdparty/freetype/src/base/ftfstype.c b/src/3rdparty/freetype/src/base/ftfstype.c index 45e2d808..bca548fc 100644 --- a/src/3rdparty/freetype/src/base/ftfstype.c +++ b/src/3rdparty/freetype/src/base/ftfstype.c @@ -4,7 +4,7 @@ * * FreeType utility file to access FSType data (body). * - * Copyright (C) 2008-2019 by + * Copyright (C) 2008-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -15,11 +15,10 @@ * */ -#include -#include FT_TYPE1_TABLES_H -#include FT_TRUETYPE_TABLES_H -#include FT_INTERNAL_SERVICE_H -#include FT_SERVICE_POSTSCRIPT_INFO_H +#include +#include +#include +#include /* documentation is in freetype.h */ diff --git a/src/3rdparty/freetype/src/base/ftgasp.c b/src/3rdparty/freetype/src/base/ftgasp.c index 720fb113..eed05a32 100644 --- a/src/3rdparty/freetype/src/base/ftgasp.c +++ b/src/3rdparty/freetype/src/base/ftgasp.c @@ -4,7 +4,7 @@ * * Access of TrueType's `gasp' table (body). * - * Copyright (C) 2007-2019 by + * Copyright (C) 2007-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -16,9 +16,8 @@ */ -#include -#include FT_GASP_H -#include FT_INTERNAL_TRUETYPE_TYPES_H +#include +#include FT_EXPORT_DEF( FT_Int ) diff --git a/src/3rdparty/freetype/src/base/ftgloadr.c b/src/3rdparty/freetype/src/base/ftgloadr.c index bfeed461..05fc7692 100644 --- a/src/3rdparty/freetype/src/base/ftgloadr.c +++ b/src/3rdparty/freetype/src/base/ftgloadr.c @@ -4,7 +4,7 @@ * * The FreeType glyph loader (body). * - * Copyright (C) 2002-2019 by + * Copyright (C) 2002-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg * * This file is part of the FreeType project, and may only be used, @@ -16,11 +16,10 @@ */ -#include -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_GLYPH_LOADER_H -#include FT_INTERNAL_MEMORY_H -#include FT_INTERNAL_OBJECTS_H +#include +#include +#include +#include #undef FT_COMPONENT #define FT_COMPONENT gloader @@ -93,6 +92,7 @@ base->outline.n_points = 0; base->outline.n_contours = 0; + base->outline.flags = 0; base->num_subglyphs = 0; *current = *base; @@ -146,9 +146,9 @@ FT_Outline* current = &loader->current.outline; - current->points = base->points + base->n_points; - current->tags = base->tags + base->n_points; - current->contours = base->contours + base->n_contours; + current->points = FT_OFFSET( base->points, base->n_points ); + current->tags = FT_OFFSET( base->tags, base->n_points ); + current->contours = FT_OFFSET( base->contours, base->n_contours ); /* handle extra points table - if any */ if ( loader->use_extra ) @@ -169,6 +169,10 @@ FT_Memory memory = loader->memory; + if ( loader->max_points == 0 || + loader->base.extra_points != NULL ) + return FT_Err_Ok; + if ( !FT_NEW_ARRAY( loader->base.extra_points, 2 * loader->max_points ) ) { loader->use_extra = 1; @@ -189,7 +193,7 @@ FT_GlyphLoad current = &loader->current; - current->subglyphs = base->subglyphs + base->num_subglyphs; + current->subglyphs = FT_OFFSET( base->subglyphs, base->num_subglyphs ); } @@ -211,6 +215,10 @@ FT_UInt new_max, old_max; + error = FT_GlyphLoader_CreateExtra( loader ); + if ( error ) + return error; + /* check points & tags */ new_max = (FT_UInt)base->n_points + (FT_UInt)current->n_points + n_points; @@ -244,6 +252,10 @@ loader->max_points = new_max; } + error = FT_GlyphLoader_CreateExtra( loader ); + if ( error ) + return error; + /* check contours */ old_max = loader->max_contours; new_max = (FT_UInt)base->n_contours + (FT_UInt)current->n_contours + diff --git a/src/3rdparty/freetype/src/base/ftglyph.c b/src/3rdparty/freetype/src/base/ftglyph.c index e6b13279..825eba2c 100644 --- a/src/3rdparty/freetype/src/base/ftglyph.c +++ b/src/3rdparty/freetype/src/base/ftglyph.c @@ -4,7 +4,7 @@ * * FreeType convenience functions to handle glyphs (body). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -28,13 +28,14 @@ */ -#include -#include FT_INTERNAL_DEBUG_H +#include -#include FT_GLYPH_H -#include FT_OUTLINE_H -#include FT_BITMAP_H -#include FT_INTERNAL_OBJECTS_H +#include +#include +#include +#include + +#include "ftbase.h" /************************************************************************** diff --git a/src/3rdparty/freetype/src/base/ftgxval.c b/src/3rdparty/freetype/src/base/ftgxval.c index 0677d26f..f04df145 100644 --- a/src/3rdparty/freetype/src/base/ftgxval.c +++ b/src/3rdparty/freetype/src/base/ftgxval.c @@ -4,7 +4,7 @@ * * FreeType API for validating TrueTypeGX/AAT tables (body). * - * Copyright (C) 2004-2019 by + * Copyright (C) 2004-2020 by * Masatake YAMATO, Redhat K.K, * David Turner, Robert Wilhelm, and Werner Lemberg. * @@ -25,11 +25,10 @@ */ -#include -#include FT_INTERNAL_DEBUG_H +#include -#include FT_INTERNAL_OBJECTS_H -#include FT_SERVICE_GX_VALIDATE_H +#include +#include /* documentation is in ftgxval.h */ diff --git a/src/3rdparty/freetype/src/base/fthash.c b/src/3rdparty/freetype/src/base/fthash.c index 387e6d26..449b03a5 100644 --- a/src/3rdparty/freetype/src/base/fthash.c +++ b/src/3rdparty/freetype/src/base/fthash.c @@ -39,9 +39,8 @@ */ -#include -#include FT_INTERNAL_HASH_H -#include FT_INTERNAL_MEMORY_H +#include +#include #define INITIAL_HT_SIZE 241 diff --git a/src/3rdparty/freetype/src/base/ftinit.c b/src/3rdparty/freetype/src/base/ftinit.c index c73cd78b..0acc75e4 100644 --- a/src/3rdparty/freetype/src/base/ftinit.c +++ b/src/3rdparty/freetype/src/base/ftinit.c @@ -4,7 +4,7 @@ * * FreeType initialization layer (body). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -39,9 +39,9 @@ #include #include FT_CONFIG_CONFIG_H -#include FT_INTERNAL_OBJECTS_H -#include FT_INTERNAL_DEBUG_H -#include FT_MODULE_H +#include +#include +#include /************************************************************************** diff --git a/src/3rdparty/freetype/src/base/ftlcdfil.c b/src/3rdparty/freetype/src/base/ftlcdfil.c index d9f4af42..1e84dbc8 100644 --- a/src/3rdparty/freetype/src/base/ftlcdfil.c +++ b/src/3rdparty/freetype/src/base/ftlcdfil.c @@ -4,7 +4,7 @@ * * FreeType API for color filtering of subpixel bitmap glyphs (body). * - * Copyright (C) 2006-2019 by + * Copyright (C) 2006-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -16,12 +16,11 @@ */ -#include -#include FT_INTERNAL_DEBUG_H +#include -#include FT_LCD_FILTER_H -#include FT_IMAGE_H -#include FT_INTERNAL_OBJECTS_H +#include +#include +#include #ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING diff --git a/src/3rdparty/freetype/src/base/ftmac.c b/src/3rdparty/freetype/src/base/ftmac.c index 5f23ceea..55a631fd 100644 --- a/src/3rdparty/freetype/src/base/ftmac.c +++ b/src/3rdparty/freetype/src/base/ftmac.c @@ -8,7 +8,7 @@ * This file is for Mac OS X only; see builds/mac/ftoldmac.c for * classic platforms built by MPW. * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * Just van Rossum, David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -65,10 +65,9 @@ */ -#include -#include FT_FREETYPE_H -#include FT_TRUETYPE_TAGS_H -#include FT_INTERNAL_STREAM_H +#include +#include +#include #include "ftbase.h" diff --git a/src/3rdparty/freetype/src/base/ftmm.c b/src/3rdparty/freetype/src/base/ftmm.c index ba9e67f0..9a702b99 100644 --- a/src/3rdparty/freetype/src/base/ftmm.c +++ b/src/3rdparty/freetype/src/base/ftmm.c @@ -4,7 +4,7 @@ * * Multiple Master font support (body). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -16,13 +16,12 @@ */ -#include -#include FT_INTERNAL_DEBUG_H +#include -#include FT_MULTIPLE_MASTERS_H -#include FT_INTERNAL_OBJECTS_H -#include FT_SERVICE_MULTIPLE_MASTERS_H -#include FT_SERVICE_METRICS_VARIATIONS_H +#include +#include +#include +#include /************************************************************************** diff --git a/src/3rdparty/freetype/src/base/ftobjs.c b/src/3rdparty/freetype/src/base/ftobjs.c index e301f8f1..c060bbbc 100644 --- a/src/3rdparty/freetype/src/base/ftobjs.c +++ b/src/3rdparty/freetype/src/base/ftobjs.c @@ -4,7 +4,7 @@ * * The FreeType private base classes (body). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -16,32 +16,31 @@ */ -#include -#include FT_LIST_H -#include FT_OUTLINE_H -#include FT_FONT_FORMATS_H +#include +#include +#include -#include FT_INTERNAL_VALIDATE_H -#include FT_INTERNAL_OBJECTS_H -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_RFORK_H -#include FT_INTERNAL_STREAM_H -#include FT_INTERNAL_SFNT_H /* for SFNT_Load_Table_Func */ -#include FT_INTERNAL_POSTSCRIPT_AUX_H /* for PS_Driver */ +#include +#include +#include +#include +#include +#include /* for SFNT_Load_Table_Func */ +#include /* for PS_Driver */ -#include FT_TRUETYPE_TABLES_H -#include FT_TRUETYPE_TAGS_H -#include FT_TRUETYPE_IDS_H +#include +#include +#include -#include FT_SERVICE_PROPERTIES_H -#include FT_SERVICE_SFNT_H -#include FT_SERVICE_POSTSCRIPT_NAME_H -#include FT_SERVICE_GLYPH_DICT_H -#include FT_SERVICE_TT_CMAP_H -#include FT_SERVICE_KERNING_H -#include FT_SERVICE_TRUETYPE_ENGINE_H +#include +#include +#include +#include +#include +#include +#include -#include FT_DRIVER_H +#include #ifdef FT_CONFIG_OPTION_MAC_FONTS #include "ftbase.h" @@ -50,7 +49,7 @@ #ifdef FT_DEBUG_LEVEL_TRACE -#include FT_BITMAP_H +#include #if defined( _MSC_VER ) /* Visual C++ (and Intel C++) */ /* We disable the warning `conversion from XXX to YYY, */ @@ -1063,11 +1062,30 @@ slot->linearHoriAdvance / 65536.0 )); FT_TRACE5(( " linear y advance: %f\n", slot->linearVertAdvance / 65536.0 )); + FT_TRACE5(( "\n" )); FT_TRACE5(( " bitmap %dx%d, %s (mode %d)\n", slot->bitmap.width, slot->bitmap.rows, pixel_modes[slot->bitmap.pixel_mode], slot->bitmap.pixel_mode )); + FT_TRACE5(( "\n" )); + + { + FT_Glyph_Metrics* metrics = &slot->metrics; + + + FT_TRACE5(( " metrics:\n" )); + FT_TRACE5(( " width: %f\n", metrics->width / 64.0 )); + FT_TRACE5(( " height: %f\n", metrics->height / 64.0 )); + FT_TRACE5(( "\n" )); + FT_TRACE5(( " horiBearingX: %f\n", metrics->horiBearingX / 64.0 )); + FT_TRACE5(( " horiBearingY: %f\n", metrics->horiBearingY / 64.0 )); + FT_TRACE5(( " horiAdvance: %f\n", metrics->horiAdvance / 64.0 )); + FT_TRACE5(( "\n" )); + FT_TRACE5(( " vertBearingX: %f\n", metrics->vertBearingX / 64.0 )); + FT_TRACE5(( " vertBearingY: %f\n", metrics->vertBearingY / 64.0 )); + FT_TRACE5(( " vertAdvance: %f\n", metrics->vertAdvance / 64.0 )); + } #endif Exit: @@ -1842,15 +1860,15 @@ /* FT2 allocator takes signed long buffer length, * too large value causing overflow should be checked */ - FT_TRACE4(( " POST fragment #%d: length=0x%08x" - " total pfb_len=0x%08x\n", + FT_TRACE4(( " POST fragment #%d: length=0x%08lx" + " total pfb_len=0x%08lx\n", i, temp, pfb_len + temp + 6 )); if ( FT_MAC_RFORK_MAX_LEN < temp || FT_MAC_RFORK_MAX_LEN - temp < pfb_len + 6 ) { FT_TRACE2(( " MacOS resource length cannot exceed" - " 0x%08x\n", + " 0x%08lx\n", FT_MAC_RFORK_MAX_LEN )); error = FT_THROW( Invalid_Offset ); @@ -1861,13 +1879,13 @@ } FT_TRACE2(( " total buffer size to concatenate" - " %d POST fragments: 0x%08x\n", + " %ld POST fragments: 0x%08lx\n", resource_cnt, pfb_len + 2 )); if ( pfb_len + 2 < 6 ) { FT_TRACE2(( " too long fragment length makes" - " pfb_len confused: pfb_len=0x%08x\n", + " pfb_len confused: pfb_len=0x%08lx\n", pfb_len )); error = FT_THROW( Array_Too_Large ); @@ -1910,7 +1928,7 @@ goto Exit2; FT_TRACE3(( "POST fragment[%d]:" - " offsets=0x%08x, rlen=0x%08x, flags=0x%04x\n", + " offsets=0x%08lx, rlen=0x%08lx, flags=0x%04x\n", i, offsets[i], rlen, flags )); error = FT_ERR( Array_Too_Large ); @@ -1937,7 +1955,7 @@ else { FT_TRACE3(( " Write POST fragment #%d header (4-byte) to buffer" - " %p + 0x%08x\n", + " %p + 0x%08lx\n", i, pfb_data, pfb_lenpos )); if ( pfb_lenpos + 3 > pfb_len + 2 ) @@ -1952,7 +1970,7 @@ break; FT_TRACE3(( " Write POST fragment #%d header (6-byte) to buffer" - " %p + 0x%08x\n", + " %p + 0x%08lx\n", i, pfb_data, pfb_pos )); if ( pfb_pos + 6 > pfb_len + 2 ) @@ -1974,8 +1992,8 @@ if ( pfb_pos > pfb_len || pfb_pos + rlen > pfb_len ) goto Exit2; - FT_TRACE3(( " Load POST fragment #%d (%d byte) to buffer" - " %p + 0x%08x\n", + FT_TRACE3(( " Load POST fragment #%d (%ld byte) to buffer" + " %p + 0x%08lx\n", i, rlen, pfb_data, pfb_pos )); error = FT_Stream_Read( stream, (FT_Byte *)pfb_data + pfb_pos, rlen ); @@ -2260,7 +2278,7 @@ args2.flags = FT_OPEN_PATHNAME; args2.pathname = file_names[i] ? file_names[i] : args->pathname; - FT_TRACE3(( "Try rule %d: %s (offset=%d) ...", + FT_TRACE3(( "Try rule %d: %s (offset=%ld) ...", i, args2.pathname, offsets[i] )); error = FT_Stream_New( library, &args2, &stream2 ); @@ -2858,6 +2876,8 @@ if ( error ) { FT_FREE( node ); + if ( size ) + FT_FREE( size->internal ); FT_FREE( size ); } @@ -3213,9 +3233,9 @@ FT_Size_Metrics* metrics = &face->size->metrics; - FT_TRACE5(( " x scale: %d (%f)\n", + FT_TRACE5(( " x scale: %ld (%f)\n", metrics->x_scale, metrics->x_scale / 65536.0 )); - FT_TRACE5(( " y scale: %d (%f)\n", + FT_TRACE5(( " y scale: %ld (%f)\n", metrics->y_scale, metrics->y_scale / 65536.0 )); FT_TRACE5(( " ascender: %f\n", metrics->ascender / 64.0 )); FT_TRACE5(( " descender: %f\n", metrics->descender / 64.0 )); @@ -3288,9 +3308,9 @@ FT_Size_Metrics* metrics = &face->size->metrics; - FT_TRACE5(( " x scale: %d (%f)\n", + FT_TRACE5(( " x scale: %ld (%f)\n", metrics->x_scale, metrics->x_scale / 65536.0 )); - FT_TRACE5(( " y scale: %d (%f)\n", + FT_TRACE5(( " y scale: %ld (%f)\n", metrics->y_scale, metrics->y_scale / 65536.0 )); FT_TRACE5(( " ascender: %f\n", metrics->ascender / 64.0 )); FT_TRACE5(( " descender: %f\n", metrics->descender / 64.0 )); @@ -3450,7 +3470,7 @@ if ( akerning->x != orig_x_rounded || akerning->y != orig_y_rounded ) FT_TRACE5(( "FT_Get_Kerning: horizontal kerning" - " (%d, %d) scaled down to (%d, %d) pixels\n", + " (%ld, %ld) scaled down to (%ld, %ld) pixels\n", orig_x_rounded / 64, orig_y_rounded / 64, akerning->x / 64, akerning->y / 64 )); } @@ -3722,7 +3742,7 @@ if ( charcode > 0xFFFFFFFFUL ) { FT_TRACE1(( "FT_Get_Char_Index: too large charcode" )); - FT_TRACE1(( " 0x%x is truncated\n", charcode )); + FT_TRACE1(( " 0x%lx is truncated\n", charcode )); } result = cmap->clazz->char_index( cmap, (FT_UInt32)charcode ); @@ -3898,13 +3918,13 @@ { FT_TRACE1(( "FT_Face_GetCharVariantIndex:" " too large charcode" )); - FT_TRACE1(( " 0x%x is truncated\n", charcode )); + FT_TRACE1(( " 0x%lx is truncated\n", charcode )); } if ( variantSelector > 0xFFFFFFFFUL ) { FT_TRACE1(( "FT_Face_GetCharVariantIndex:" " too large variantSelector" )); - FT_TRACE1(( " 0x%x is truncated\n", variantSelector )); + FT_TRACE1(( " 0x%lx is truncated\n", variantSelector )); } result = vcmap->clazz->char_var_index( vcmap, ucmap, @@ -3941,13 +3961,13 @@ { FT_TRACE1(( "FT_Face_GetCharVariantIsDefault:" " too large charcode" )); - FT_TRACE1(( " 0x%x is truncated\n", charcode )); + FT_TRACE1(( " 0x%lx is truncated\n", charcode )); } if ( variantSelector > 0xFFFFFFFFUL ) { FT_TRACE1(( "FT_Face_GetCharVariantIsDefault:" " too large variantSelector" )); - FT_TRACE1(( " 0x%x is truncated\n", variantSelector )); + FT_TRACE1(( " 0x%lx is truncated\n", variantSelector )); } result = vcmap->clazz->char_var_default( vcmap, @@ -4010,7 +4030,7 @@ if ( charcode > 0xFFFFFFFFUL ) { FT_TRACE1(( "FT_Face_GetVariantsOfChar: too large charcode" )); - FT_TRACE1(( " 0x%x is truncated\n", charcode )); + FT_TRACE1(( " 0x%lx is truncated\n", charcode )); } result = vcmap->clazz->charvariant_list( vcmap, memory, @@ -4044,7 +4064,7 @@ if ( variantSelector > 0xFFFFFFFFUL ) { FT_TRACE1(( "FT_Get_Char_Index: too large variantSelector" )); - FT_TRACE1(( " 0x%x is truncated\n", variantSelector )); + FT_TRACE1(( " 0x%lx is truncated\n", variantSelector )); } result = vcmap->clazz->variantchar_list( vcmap, memory, diff --git a/src/3rdparty/freetype/src/base/ftotval.c b/src/3rdparty/freetype/src/base/ftotval.c index 007576ce..90a5dd61 100644 --- a/src/3rdparty/freetype/src/base/ftotval.c +++ b/src/3rdparty/freetype/src/base/ftotval.c @@ -4,7 +4,7 @@ * * FreeType API for validating OpenType tables (body). * - * Copyright (C) 2004-2019 by + * Copyright (C) 2004-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -15,12 +15,11 @@ * */ -#include -#include FT_INTERNAL_DEBUG_H +#include -#include FT_INTERNAL_OBJECTS_H -#include FT_SERVICE_OPENTYPE_VALIDATE_H -#include FT_OPENTYPE_VALIDATE_H +#include +#include +#include /* documentation is in ftotval.h */ diff --git a/src/3rdparty/freetype/src/base/ftoutln.c b/src/3rdparty/freetype/src/base/ftoutln.c index 0e2ba347..311f098e 100644 --- a/src/3rdparty/freetype/src/base/ftoutln.c +++ b/src/3rdparty/freetype/src/base/ftoutln.c @@ -4,7 +4,7 @@ * * FreeType outline management (body). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -16,12 +16,11 @@ */ -#include -#include FT_OUTLINE_H -#include FT_INTERNAL_OBJECTS_H -#include FT_INTERNAL_CALC_H -#include FT_INTERNAL_DEBUG_H -#include FT_TRIGONOMETRY_H +#include +#include +#include +#include +#include /************************************************************************** @@ -275,7 +274,7 @@ first = (FT_UInt)last + 1; } - FT_TRACE5(( "FT_Outline_Decompose: Done\n", n )); + FT_TRACE5(( "FT_Outline_Decompose: Done\n" )); return FT_Err_Ok; Invalid_Outline: @@ -711,7 +710,7 @@ FT_Vector* limit; - if ( !outline || !matrix ) + if ( !outline || !matrix || !outline->points ) return; vec = outline->points; @@ -1061,6 +1060,11 @@ if ( cbox.xMin == cbox.xMax || cbox.yMin == cbox.yMax ) return FT_ORIENTATION_NONE; + /* Reject values large outlines. */ + if ( cbox.xMin < -0x1000000L || cbox.yMin < -0x1000000L || + cbox.xMax > 0x1000000L || cbox.yMax > 0x1000000L ) + return FT_ORIENTATION_NONE; + xshift = FT_MSB( (FT_UInt32)( FT_ABS( cbox.xMax ) | FT_ABS( cbox.xMin ) ) ) - 14; xshift = FT_MAX( xshift, 0 ); diff --git a/src/3rdparty/freetype/src/base/ftpatent.c b/src/3rdparty/freetype/src/base/ftpatent.c index 020f4646..a02c636a 100644 --- a/src/3rdparty/freetype/src/base/ftpatent.c +++ b/src/3rdparty/freetype/src/base/ftpatent.c @@ -5,7 +5,7 @@ * FreeType API for checking patented TrueType bytecode instructions * (body). Obsolete, retained for backward compatibility. * - * Copyright (C) 2007-2019 by + * Copyright (C) 2007-2020 by * David Turner. * * This file is part of the FreeType project, and may only be used, @@ -16,13 +16,12 @@ * */ -#include -#include FT_FREETYPE_H -#include FT_TRUETYPE_TAGS_H -#include FT_INTERNAL_OBJECTS_H -#include FT_INTERNAL_STREAM_H -#include FT_SERVICE_SFNT_H -#include FT_SERVICE_TRUETYPE_GLYF_H +#include +#include +#include +#include +#include +#include /* documentation is in freetype.h */ diff --git a/src/3rdparty/freetype/src/base/ftpfr.c b/src/3rdparty/freetype/src/base/ftpfr.c index aeff1db8..c656fcd9 100644 --- a/src/3rdparty/freetype/src/base/ftpfr.c +++ b/src/3rdparty/freetype/src/base/ftpfr.c @@ -4,7 +4,7 @@ * * FreeType API for accessing PFR-specific data (body). * - * Copyright (C) 2002-2019 by + * Copyright (C) 2002-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -15,11 +15,10 @@ * */ -#include -#include FT_INTERNAL_DEBUG_H +#include -#include FT_INTERNAL_OBJECTS_H -#include FT_SERVICE_PFR_H +#include +#include /* check the format */ diff --git a/src/3rdparty/freetype/src/base/ftpic.c b/src/3rdparty/freetype/src/base/ftpic.c deleted file mode 100644 index 1492e180..00000000 --- a/src/3rdparty/freetype/src/base/ftpic.c +++ /dev/null @@ -1,55 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftpic.c */ -/* */ -/* The FreeType position independent code services (body). */ -/* */ -/* Copyright 2009-2018 by */ -/* Oran Agra and Mickey Gabel. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#include -#include FT_FREETYPE_H -#include FT_INTERNAL_OBJECTS_H -#include "basepic.h" - -#ifdef FT_CONFIG_OPTION_PIC - - /* documentation is in ftpic.h */ - - FT_BASE_DEF( FT_Error ) - ft_pic_container_init( FT_Library library ) - { - FT_PIC_Container* pic_container = &library->pic_container; - FT_Error error; - - - FT_MEM_SET( pic_container, 0, sizeof ( *pic_container ) ); - - error = ft_base_pic_init( library ); - if ( error ) - return error; - - return FT_Err_Ok; - } - - - /* Destroy the contents of the container. */ - FT_BASE_DEF( void ) - ft_pic_container_destroy( FT_Library library ) - { - ft_base_pic_free( library ); - } - -#endif /* FT_CONFIG_OPTION_PIC */ - - -/* END */ diff --git a/src/3rdparty/freetype/src/base/ftpsprop.c b/src/3rdparty/freetype/src/base/ftpsprop.c index 52b9d453..8c29f50f 100644 --- a/src/3rdparty/freetype/src/base/ftpsprop.c +++ b/src/3rdparty/freetype/src/base/ftpsprop.c @@ -5,7 +5,7 @@ * Get and set properties of PostScript drivers (body). * See `ftdriver.h' for available properties. * - * Copyright (C) 2017-2019 by + * Copyright (C) 2017-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -17,12 +17,11 @@ */ -#include -#include FT_DRIVER_H -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_POSTSCRIPT_AUX_H -#include FT_INTERNAL_OBJECTS_H -#include FT_INTERNAL_POSTSCRIPT_PROPS_H +#include +#include +#include +#include +#include /************************************************************************** @@ -165,9 +164,9 @@ driver->hinting_engine = *hinting_engine; else error = FT_ERR( Unimplemented_Feature ); - - return error; } + + return error; } else if ( !ft_strcmp( property_name, "no-stem-darkening" ) ) diff --git a/src/3rdparty/freetype/src/base/ftrfork.c b/src/3rdparty/freetype/src/base/ftrfork.c index 73b7eb0d..f989be47 100644 --- a/src/3rdparty/freetype/src/base/ftrfork.c +++ b/src/3rdparty/freetype/src/base/ftrfork.c @@ -4,7 +4,7 @@ * * Embedded resource forks accessor (body). * - * Copyright (C) 2004-2019 by + * Copyright (C) 2004-2020 by * Masatake YAMATO and Redhat K.K. * * FT_Raccess_Get_HeaderInfo() and raccess_guess_darwin_hfsplus() are @@ -24,10 +24,9 @@ */ -#include -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_STREAM_H -#include FT_INTERNAL_RFORK_H +#include +#include +#include #include "ftbase.h" @@ -240,7 +239,7 @@ (char)( 0xFF & ( tag_internal >> 16 ) ), (char)( 0xFF & ( tag_internal >> 8 ) ), (char)( 0xFF & ( tag_internal >> 0 ) ) )); - FT_TRACE3(( " : subcount=%d, suboffset=0x%04x\n", + FT_TRACE3(( " : subcount=%d, suboffset=0x%04lx\n", subcnt, rpos )); if ( tag_internal == tag ) @@ -286,7 +285,7 @@ ref[j].offset = temp & 0xFFFFFFL; FT_TRACE3(( " [%d]:" - " resource_id=0x%04x, offset=0x%08x\n", + " resource_id=0x%04x, offset=0x%08lx\n", j, (FT_UShort)ref[j].res_id, ref[j].offset )); } @@ -302,7 +301,7 @@ for ( j = 0; j < *count; j++ ) FT_TRACE3(( " [%d]:" - " resource_id=0x%04x, offset=0x%08x\n", + " resource_id=0x%04x, offset=0x%08lx\n", j, ref[j].res_id, ref[j].offset )); } diff --git a/src/3rdparty/freetype/src/base/ftsnames.c b/src/3rdparty/freetype/src/base/ftsnames.c index 7ab3fe3c..8507f28d 100644 --- a/src/3rdparty/freetype/src/base/ftsnames.c +++ b/src/3rdparty/freetype/src/base/ftsnames.c @@ -7,7 +7,7 @@ * * This is _not_ used to retrieve glyph names! * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -19,12 +19,11 @@ */ -#include -#include FT_INTERNAL_DEBUG_H +#include -#include FT_SFNT_NAMES_H -#include FT_INTERNAL_TRUETYPE_TYPES_H -#include FT_INTERNAL_STREAM_H +#include +#include +#include #ifdef TT_CONFIG_OPTION_SFNT_NAMES diff --git a/src/3rdparty/freetype/src/base/ftstream.c b/src/3rdparty/freetype/src/base/ftstream.c index 4b0890d7..d940254d 100644 --- a/src/3rdparty/freetype/src/base/ftstream.c +++ b/src/3rdparty/freetype/src/base/ftstream.c @@ -4,7 +4,7 @@ * * I/O stream support (body). * - * Copyright (C) 2000-2019 by + * Copyright (C) 2000-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -16,9 +16,8 @@ */ -#include -#include FT_INTERNAL_STREAM_H -#include FT_INTERNAL_DEBUG_H +#include +#include /************************************************************************** @@ -286,7 +285,7 @@ } stream->cursor = stream->base; - stream->limit = stream->cursor + count; + stream->limit = FT_OFFSET( stream->cursor, count ); stream->pos += read_bytes; } else diff --git a/src/3rdparty/freetype/src/base/ftstroke.c b/src/3rdparty/freetype/src/base/ftstroke.c index 1b2c0f65..56f98e1d 100644 --- a/src/3rdparty/freetype/src/base/ftstroke.c +++ b/src/3rdparty/freetype/src/base/ftstroke.c @@ -4,7 +4,7 @@ * * FreeType path stroker (body). * - * Copyright (C) 2002-2019 by + * Copyright (C) 2002-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -16,13 +16,12 @@ */ -#include -#include FT_STROKER_H -#include FT_TRIGONOMETRY_H -#include FT_OUTLINE_H -#include FT_INTERNAL_MEMORY_H -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_OBJECTS_H +#include +#include +#include +#include +#include +#include /* declare an extern to access `ft_outline_glyph_class' globally */ @@ -540,63 +539,52 @@ FT_Angle angle_start, FT_Angle angle_diff ) { - FT_Angle total, angle, step, rotate, next, theta; - FT_Vector a, b, a2, b2; - FT_Fixed length; + FT_Fixed coef; + FT_Vector a0, a1, a2, a3; + FT_Int i, arcs = 1; FT_Error error = FT_Err_Ok; - /* compute start point */ - FT_Vector_From_Polar( &a, radius, angle_start ); - a.x += center->x; - a.y += center->y; + /* number of cubic arcs to draw */ + while ( angle_diff > FT_ARC_CUBIC_ANGLE * arcs || + -angle_diff > FT_ARC_CUBIC_ANGLE * arcs ) + arcs++; - total = angle_diff; - angle = angle_start; - rotate = ( angle_diff >= 0 ) ? FT_ANGLE_PI2 : -FT_ANGLE_PI2; + /* control tangents */ + coef = FT_Tan( angle_diff / ( 4 * arcs ) ); + coef += coef / 3; - while ( total != 0 ) + /* compute start and first control point */ + FT_Vector_From_Polar( &a0, radius, angle_start ); + a1.x = FT_MulFix( -a0.y, coef ); + a1.y = FT_MulFix( a0.x, coef ); + + a0.x += center->x; + a0.y += center->y; + a1.x += a0.x; + a1.y += a0.y; + + for ( i = 1; i <= arcs; i++ ) { - step = total; - if ( step > FT_ARC_CUBIC_ANGLE ) - step = FT_ARC_CUBIC_ANGLE; + /* compute end and second control point */ + FT_Vector_From_Polar( &a3, radius, + angle_start + i * angle_diff / arcs ); + a2.x = FT_MulFix( a3.y, coef ); + a2.y = FT_MulFix( -a3.x, coef ); - else if ( step < -FT_ARC_CUBIC_ANGLE ) - step = -FT_ARC_CUBIC_ANGLE; - - next = angle + step; - theta = step; - if ( theta < 0 ) - theta = -theta; - - theta >>= 1; - - /* compute end point */ - FT_Vector_From_Polar( &b, radius, next ); - b.x += center->x; - b.y += center->y; - - /* compute first and second control points */ - length = FT_MulDiv( radius, FT_Sin( theta ) * 4, - ( 0x10000L + FT_Cos( theta ) ) * 3 ); - - FT_Vector_From_Polar( &a2, length, angle + rotate ); - a2.x += a.x; - a2.y += a.y; - - FT_Vector_From_Polar( &b2, length, next - rotate ); - b2.x += b.x; - b2.y += b.y; + a3.x += center->x; + a3.y += center->y; + a2.x += a3.x; + a2.y += a3.y; /* add cubic arc */ - error = ft_stroke_border_cubicto( border, &a2, &b2, &b ); + error = ft_stroke_border_cubicto( border, &a1, &a2, &a3 ); if ( error ) break; - /* process the rest of the arc ?? */ - a = b; - total -= step; - angle = next; + /* a0 = a3; */ + a1.x = a3.x - a2.x + a3.x; + a1.y = a3.y - a2.y + a3.y; } return error; @@ -934,55 +922,40 @@ error = ft_stroker_arcto( stroker, side ); } - else if ( stroker->line_cap == FT_STROKER_LINECAP_SQUARE ) + else { - /* add a square cap */ - FT_Vector delta, delta2; - FT_Angle rotate = FT_SIDE_TO_ROTATE( side ); + /* add a square or butt cap */ + FT_Vector middle, delta; FT_Fixed radius = stroker->radius; FT_StrokeBorder border = stroker->borders + side; - FT_Vector_From_Polar( &delta2, radius, angle + rotate ); - FT_Vector_From_Polar( &delta, radius, angle ); + /* compute middle point and first angle point */ + FT_Vector_From_Polar( &middle, radius, angle ); + delta.x = side ? middle.y : -middle.y; + delta.y = side ? -middle.x : middle.x; - delta.x += stroker->center.x + delta2.x; - delta.y += stroker->center.y + delta2.y; + if ( stroker->line_cap == FT_STROKER_LINECAP_SQUARE ) + { + middle.x += stroker->center.x; + middle.y += stroker->center.y; + } + else /* FT_STROKER_LINECAP_BUTT */ + { + middle.x = stroker->center.x; + middle.y = stroker->center.y; + } + + delta.x += middle.x; + delta.y += middle.y; error = ft_stroke_border_lineto( border, &delta, FALSE ); if ( error ) goto Exit; - FT_Vector_From_Polar( &delta2, radius, angle - rotate ); - FT_Vector_From_Polar( &delta, radius, angle ); - - delta.x += delta2.x + stroker->center.x; - delta.y += delta2.y + stroker->center.y; - - error = ft_stroke_border_lineto( border, &delta, FALSE ); - } - else if ( stroker->line_cap == FT_STROKER_LINECAP_BUTT ) - { - /* add a butt ending */ - FT_Vector delta; - FT_Angle rotate = FT_SIDE_TO_ROTATE( side ); - FT_Fixed radius = stroker->radius; - FT_StrokeBorder border = stroker->borders + side; - - - FT_Vector_From_Polar( &delta, radius, angle + rotate ); - - delta.x += stroker->center.x; - delta.y += stroker->center.y; - - error = ft_stroke_border_lineto( border, &delta, FALSE ); - if ( error ) - goto Exit; - - FT_Vector_From_Polar( &delta, radius, angle - rotate ); - - delta.x += stroker->center.x; - delta.y += stroker->center.y; + /* compute second angle point */ + delta.x = middle.x - delta.x + middle.x; + delta.y = middle.y - delta.y + middle.y; error = ft_stroke_border_lineto( border, &delta, FALSE ); } @@ -1000,8 +973,8 @@ { FT_StrokeBorder border = stroker->borders + side; FT_Angle phi, theta, rotate; - FT_Fixed length, thcos; - FT_Vector delta; + FT_Fixed length; + FT_Vector sigma, delta; FT_Error error = FT_Err_Ok; FT_Bool intersect; /* use intersection of lines? */ @@ -1019,10 +992,13 @@ else { /* compute minimum required length of lines */ - FT_Fixed min_length = ft_pos_abs( FT_MulFix( stroker->radius, - FT_Tan( theta ) ) ); + FT_Fixed min_length; + FT_Vector_Unit( &sigma, theta ); + min_length = + ft_pos_abs( FT_MulDiv( stroker->radius, sigma.y, sigma.x ) ); + intersect = FT_BOOL( min_length && stroker->line_length >= min_length && line_length >= min_length ); @@ -1040,13 +1016,11 @@ else { /* compute median angle */ - phi = stroker->angle_in + theta; + phi = stroker->angle_in + theta + rotate; - thcos = FT_Cos( theta ); + length = FT_DivFix( stroker->radius, sigma.x ); - length = FT_DivFix( stroker->radius, thcos ); - - FT_Vector_From_Polar( &delta, length, phi + rotate ); + FT_Vector_From_Polar( &delta, length, phi ); delta.x += stroker->center.x; delta.y += stroker->center.y; } @@ -1073,10 +1047,10 @@ else { /* this is a mitered (pointed) or beveled (truncated) corner */ - FT_Fixed sigma = 0, radius = stroker->radius; - FT_Angle theta = 0, phi = 0; - FT_Fixed thcos = 0; - FT_Bool bevel, fixed_bevel; + FT_Fixed radius = stroker->radius; + FT_Vector sigma; + FT_Angle theta = 0, phi = 0; + FT_Bool bevel, fixed_bevel; rotate = FT_SIDE_TO_ROTATE( side ); @@ -1087,26 +1061,20 @@ fixed_bevel = FT_BOOL( stroker->line_join != FT_STROKER_LINEJOIN_MITER_VARIABLE ); + /* check miter limit first */ if ( !bevel ) { - theta = FT_Angle_Diff( stroker->angle_in, stroker->angle_out ); + theta = FT_Angle_Diff( stroker->angle_in, stroker->angle_out ) / 2; - if ( theta == FT_ANGLE_PI ) - { - theta = rotate; - phi = stroker->angle_in; - } - else - { - theta /= 2; - phi = stroker->angle_in + theta + rotate; - } + if ( theta == FT_ANGLE_PI2 ) + theta = -rotate; - thcos = FT_Cos( theta ); - sigma = FT_MulFix( stroker->miter_limit, thcos ); + phi = stroker->angle_in + theta + rotate; + + FT_Vector_From_Polar( &sigma, stroker->miter_limit, theta ); /* is miter limit exceeded? */ - if ( sigma < 0x10000L ) + if ( sigma.x < 0x10000L ) { /* don't create variable bevels for very small deviations; */ /* FT_Sin(x) = 0 for x <= 57 */ @@ -1133,36 +1101,34 @@ border->movable = FALSE; error = ft_stroke_border_lineto( border, &delta, FALSE ); } - else /* variable bevel */ + else /* variable bevel or clipped miter */ { /* the miter is truncated */ FT_Vector middle, delta; - FT_Fixed length; + FT_Fixed coef; - /* compute middle point */ + /* compute middle point and first angle point */ FT_Vector_From_Polar( &middle, FT_MulFix( radius, stroker->miter_limit ), phi ); + + coef = FT_DivFix( 0x10000L - sigma.x, sigma.y ); + delta.x = FT_MulFix( middle.y, coef ); + delta.y = FT_MulFix( -middle.x, coef ); + middle.x += stroker->center.x; middle.y += stroker->center.y; - - /* compute first angle point */ - length = FT_MulDiv( radius, 0x10000L - sigma, - ft_pos_abs( FT_Sin( theta ) ) ); - - FT_Vector_From_Polar( &delta, length, phi + rotate ); - delta.x += middle.x; - delta.y += middle.y; + delta.x += middle.x; + delta.y += middle.y; error = ft_stroke_border_lineto( border, &delta, FALSE ); if ( error ) goto Exit; /* compute second angle point */ - FT_Vector_From_Polar( &delta, length, phi - rotate ); - delta.x += middle.x; - delta.y += middle.y; + delta.x = middle.x - delta.x + middle.x; + delta.y = middle.y - delta.y + middle.y; error = ft_stroke_border_lineto( border, &delta, FALSE ); if ( error ) @@ -1189,7 +1155,7 @@ FT_Vector delta; - length = FT_DivFix( stroker->radius, thcos ); + length = FT_MulDiv( stroker->radius, stroker->miter_limit, sigma.x ); FT_Vector_From_Polar( &delta, length, phi ); delta.x += stroker->center.x; diff --git a/src/3rdparty/freetype/src/base/ftsynth.c b/src/3rdparty/freetype/src/base/ftsynth.c index f87ed65e..a9119e2b 100644 --- a/src/3rdparty/freetype/src/base/ftsynth.c +++ b/src/3rdparty/freetype/src/base/ftsynth.c @@ -4,7 +4,7 @@ * * FreeType synthesizing code for emboldening and slanting (body). * - * Copyright (C) 2000-2019 by + * Copyright (C) 2000-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -16,12 +16,11 @@ */ -#include -#include FT_SYNTHESIS_H -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_OBJECTS_H -#include FT_OUTLINE_H -#include FT_BITMAP_H +#include +#include +#include +#include +#include /************************************************************************** @@ -130,7 +129,7 @@ if ( ( ystr >> 6 ) > FT_INT_MAX || ( ystr >> 6 ) < FT_INT_MIN ) { FT_TRACE1(( "FT_GlyphSlot_Embolden:" )); - FT_TRACE1(( "too strong emboldening parameter ystr=%d\n", ystr )); + FT_TRACE1(( "too strong emboldening parameter ystr=%ld\n", ystr )); return; } error = FT_GlyphSlot_Own_Bitmap( slot ); diff --git a/src/3rdparty/freetype/src/base/ftsystem.c b/src/3rdparty/freetype/src/base/ftsystem.c index f92b3a03..3013cbda 100644 --- a/src/3rdparty/freetype/src/base/ftsystem.c +++ b/src/3rdparty/freetype/src/base/ftsystem.c @@ -4,7 +4,7 @@ * * ANSI-specific FreeType low-level system interface (body). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -27,11 +27,11 @@ #include #include FT_CONFIG_CONFIG_H -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_STREAM_H -#include FT_SYSTEM_H -#include FT_ERRORS_H -#include FT_TYPES_H +#include +#include +#include +#include +#include /************************************************************************** diff --git a/src/3rdparty/freetype/src/base/fttrigon.c b/src/3rdparty/freetype/src/base/fttrigon.c index 38721977..c6f027cf 100644 --- a/src/3rdparty/freetype/src/base/fttrigon.c +++ b/src/3rdparty/freetype/src/base/fttrigon.c @@ -4,7 +4,7 @@ * * FreeType trigonometric functions (body). * - * Copyright (C) 2001-2019 by + * Copyright (C) 2001-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -29,10 +29,9 @@ * */ -#include -#include FT_INTERNAL_OBJECTS_H -#include FT_INTERNAL_CALC_H -#include FT_TRIGONOMETRY_H +#include +#include +#include /* the Cordic shrink factor 0.858785336480436 * 2^32 */ diff --git a/src/3rdparty/freetype/src/base/fttype1.c b/src/3rdparty/freetype/src/base/fttype1.c index 26d4f1c3..be60ed6e 100644 --- a/src/3rdparty/freetype/src/base/fttype1.c +++ b/src/3rdparty/freetype/src/base/fttype1.c @@ -4,7 +4,7 @@ * * FreeType utility file for PS names support (body). * - * Copyright (C) 2002-2019 by + * Copyright (C) 2002-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -16,11 +16,10 @@ */ -#include -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_OBJECTS_H -#include FT_INTERNAL_SERVICE_H -#include FT_SERVICE_POSTSCRIPT_INFO_H +#include +#include +#include +#include /* documentation is in t1tables.h */ diff --git a/src/3rdparty/freetype/src/base/ftutil.c b/src/3rdparty/freetype/src/base/ftutil.c index 92bd857e..d90cfbcd 100644 --- a/src/3rdparty/freetype/src/base/ftutil.c +++ b/src/3rdparty/freetype/src/base/ftutil.c @@ -4,7 +4,7 @@ * * FreeType utility file for memory and list management (body). * - * Copyright (C) 2002-2019 by + * Copyright (C) 2002-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -16,11 +16,10 @@ */ -#include -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_MEMORY_H -#include FT_INTERNAL_OBJECTS_H -#include FT_LIST_H +#include +#include +#include +#include /************************************************************************** diff --git a/src/3rdparty/freetype/src/base/ftver.rc b/src/3rdparty/freetype/src/base/ftver.rc index 13544974..0b92e9b8 100644 --- a/src/3rdparty/freetype/src/base/ftver.rc +++ b/src/3rdparty/freetype/src/base/ftver.rc @@ -4,7 +4,7 @@ /* */ /* FreeType VERSIONINFO resource for Windows DLLs. */ /* */ -/* Copyright (C) 2018-2019 by */ +/* Copyright (C) 2018-2020 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -18,8 +18,8 @@ #include -#define FT_VERSION 2,10,1,0 -#define FT_VERSION_STR "2.10.1" +#define FT_VERSION 2,10,4,0 +#define FT_VERSION_STR "2.10.4" VS_VERSION_INFO VERSIONINFO FILEVERSION FT_VERSION @@ -45,7 +45,7 @@ BEGIN VALUE "FileVersion", FT_VERSION_STR VALUE "ProductName", "FreeType" VALUE "ProductVersion", FT_VERSION_STR - VALUE "LegalCopyright", "\251 2018-2019 The FreeType Project www.freetype.org. All rights reserved." + VALUE "LegalCopyright", "\251 2000-2020 The FreeType Project www.freetype.org. All rights reserved." VALUE "InternalName", "freetype" VALUE "OriginalFilename", FT_FILENAME END diff --git a/src/3rdparty/freetype/src/base/ftwinfnt.c b/src/3rdparty/freetype/src/base/ftwinfnt.c index 59daa770..699dc3d7 100644 --- a/src/3rdparty/freetype/src/base/ftwinfnt.c +++ b/src/3rdparty/freetype/src/base/ftwinfnt.c @@ -4,7 +4,7 @@ * * FreeType API for accessing Windows FNT specific info (body). * - * Copyright (C) 2003-2019 by + * Copyright (C) 2003-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -16,11 +16,10 @@ */ -#include -#include FT_INTERNAL_DEBUG_H -#include FT_WINFONTS_H -#include FT_INTERNAL_OBJECTS_H -#include FT_SERVICE_WINFNT_H +#include +#include +#include +#include /* documentation is in ftwinfnt.h */ diff --git a/src/3rdparty/freetype/src/base/rules.mk b/src/3rdparty/freetype/src/base/rules.mk index 4b24c6dc..411c4c82 100644 --- a/src/3rdparty/freetype/src/base/rules.mk +++ b/src/3rdparty/freetype/src/base/rules.mk @@ -3,7 +3,7 @@ # -# Copyright (C) 1996-2019 by +# Copyright (C) 1996-2020 by # David Turner, Robert Wilhelm, and Werner Lemberg. # # This file is part of the FreeType project, and may only be used, modified, diff --git a/src/3rdparty/freetype/src/bdf/Jamfile b/src/3rdparty/freetype/src/bdf/Jamfile deleted file mode 100644 index a49c7f5d..00000000 --- a/src/3rdparty/freetype/src/bdf/Jamfile +++ /dev/null @@ -1,31 +0,0 @@ -# FreeType 2 src/bdf Jamfile -# -# Copyright (C) 2002-2019 by -# David Turner, Robert Wilhelm, and Werner Lemberg. -# -# This file is part of the FreeType project, and may only be used, modified, -# and distributed under the terms of the FreeType project license, -# LICENSE.TXT. By continuing to use, modify, or distribute this file you -# indicate that you have read the license and understand and accept it -# fully. - -SubDir FT2_TOP $(FT2_SRC_DIR) bdf ; - -{ - local _sources ; - - if $(FT2_MULTI) - { - _sources = bdfdrivr - bdflib - ; - } - else - { - _sources = bdf ; - } - - Library $(FT2_LIB) : $(_sources).c ; -} - -# end of src/bdf Jamfile diff --git a/src/3rdparty/freetype/src/bdf/bdf.c b/src/3rdparty/freetype/src/bdf/bdf.c index e54df664..249012e5 100644 --- a/src/3rdparty/freetype/src/bdf/bdf.c +++ b/src/3rdparty/freetype/src/bdf/bdf.c @@ -26,7 +26,6 @@ THE SOFTWARE. #define FT_MAKE_OPTION_SINGLE_OBJECT -#include #include "bdflib.c" #include "bdfdrivr.c" diff --git a/src/3rdparty/freetype/src/bdf/bdf.h b/src/3rdparty/freetype/src/bdf/bdf.h index d9abd237..5acbd5f2 100644 --- a/src/3rdparty/freetype/src/bdf/bdf.h +++ b/src/3rdparty/freetype/src/bdf/bdf.h @@ -30,10 +30,9 @@ * Based on bdf.h,v 1.16 2000/03/16 20:08:51 mleisher */ -#include -#include FT_INTERNAL_OBJECTS_H -#include FT_INTERNAL_STREAM_H -#include FT_INTERNAL_HASH_H +#include +#include +#include FT_BEGIN_HEADER diff --git a/src/3rdparty/freetype/src/bdf/bdfdrivr.c b/src/3rdparty/freetype/src/bdf/bdfdrivr.c index 60eb9330..d29188b9 100644 --- a/src/3rdparty/freetype/src/bdf/bdfdrivr.c +++ b/src/3rdparty/freetype/src/bdf/bdfdrivr.c @@ -24,16 +24,15 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -#include -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_STREAM_H -#include FT_INTERNAL_OBJECTS_H -#include FT_BDF_H -#include FT_TRUETYPE_IDS_H +#include +#include +#include +#include +#include -#include FT_SERVICE_BDF_H -#include FT_SERVICE_FONT_FORMAT_H +#include +#include #include "bdf.h" #include "bdfdrivr.h" @@ -184,7 +183,8 @@ THE SOFTWARE. Exit: if ( charcode > 0xFFFFFFFFUL ) { - FT_TRACE1(( "bdf_cmap_char_next: charcode 0x%x > 32bit API" )); + FT_TRACE1(( "bdf_cmap_char_next: charcode 0x%lx > 32bit API", + charcode )); *acharcode = 0; /* XXX: result should be changed to indicate an overflow error */ } @@ -402,10 +402,10 @@ THE SOFTWARE. bdf_property_t* prop = NULL; - FT_TRACE4(( " number of glyphs: allocated %d (used %d)\n", + FT_TRACE4(( " number of glyphs: allocated %ld (used %ld)\n", font->glyphs_size, font->glyphs_used )); - FT_TRACE4(( " number of unencoded glyphs: allocated %d (used %d)\n", + FT_TRACE4(( " number of unencoded glyphs: allocated %ld (used %ld)\n", font->unencoded_size, font->unencoded_used )); @@ -457,13 +457,13 @@ THE SOFTWARE. if ( font->font_ascent > 0x7FFF || font->font_ascent < -0x7FFF ) { font->font_ascent = font->font_ascent < 0 ? -0x7FFF : 0x7FFF; - FT_TRACE0(( "BDF_Face_Init: clamping font ascent to value %d\n", + FT_TRACE0(( "BDF_Face_Init: clamping font ascent to value %ld\n", font->font_ascent )); } if ( font->font_descent > 0x7FFF || font->font_descent < -0x7FFF ) { font->font_descent = font->font_descent < 0 ? -0x7FFF : 0x7FFF; - FT_TRACE0(( "BDF_Face_Init: clamping font descent to value %d\n", + FT_TRACE0(( "BDF_Face_Init: clamping font descent to value %ld\n", font->font_descent )); } @@ -504,7 +504,7 @@ THE SOFTWARE. prop->value.l < -0x504C2L ) { bsize->size = 0x7FFF; - FT_TRACE0(( "BDF_Face_Init: clamping point size to value %d\n", + FT_TRACE0(( "BDF_Face_Init: clamping point size to value %ld\n", bsize->size )); } else @@ -517,7 +517,7 @@ THE SOFTWARE. if ( font->point_size > 0x7FFF ) { bsize->size = 0x7FFF; - FT_TRACE0(( "BDF_Face_Init: clamping point size to value %d\n", + FT_TRACE0(( "BDF_Face_Init: clamping point size to value %ld\n", bsize->size )); } else @@ -539,7 +539,7 @@ THE SOFTWARE. if ( prop->value.l > 0x7FFF || prop->value.l < -0x7FFF ) { bsize->y_ppem = 0x7FFF << 6; - FT_TRACE0(( "BDF_Face_Init: clamping pixel size to value %d\n", + FT_TRACE0(( "BDF_Face_Init: clamping pixel size to value %ld\n", bsize->y_ppem )); } else @@ -615,7 +615,7 @@ THE SOFTWARE. for ( n = 0; n < font->glyphs_size; n++ ) { (face->en_table[n]).enc = cur[n].encoding; - FT_TRACE4(( " idx %d, val 0x%lX\n", n, cur[n].encoding )); + FT_TRACE4(( " idx %ld, val 0x%lX\n", n, cur[n].encoding )); (face->en_table[n]).glyph = (FT_UShort)n; if ( cur[n].encoding == font->default_char ) @@ -624,7 +624,7 @@ THE SOFTWARE. face->default_glyph = (FT_UInt)n; else FT_TRACE1(( "BDF_Face_Init:" - " idx %d is too large for this system\n", n )); + " idx %ld is too large for this system\n", n )); } } } @@ -825,7 +825,7 @@ THE SOFTWARE. bitmap->rows = glyph.bbx.height; bitmap->width = glyph.bbx.width; if ( glyph.bpr > FT_INT_MAX ) - FT_TRACE1(( "BDF_Glyph_Load: too large pitch %d is truncated\n", + FT_TRACE1(( "BDF_Glyph_Load: too large pitch %ld is truncated\n", glyph.bpr )); bitmap->pitch = (int)glyph.bpr; /* same as FT_Bitmap.pitch */ @@ -902,7 +902,8 @@ THE SOFTWARE. if ( prop->value.l > 0x7FFFFFFFL || prop->value.l < ( -1 - 0x7FFFFFFFL ) ) { FT_TRACE1(( "bdf_get_bdf_property:" - " too large integer 0x%x is truncated\n" )); + " too large integer 0x%lx is truncated\n", + prop->value.l )); } aproperty->type = BDF_PROPERTY_TYPE_INTEGER; aproperty->u.integer = (FT_Int32)prop->value.l; @@ -912,7 +913,8 @@ THE SOFTWARE. if ( prop->value.ul > 0xFFFFFFFFUL ) { FT_TRACE1(( "bdf_get_bdf_property:" - " too large cardinal 0x%x is truncated\n" )); + " too large cardinal 0x%lx is truncated\n", + prop->value.ul )); } aproperty->type = BDF_PROPERTY_TYPE_CARDINAL; aproperty->u.cardinal = (FT_UInt32)prop->value.ul; diff --git a/src/3rdparty/freetype/src/bdf/bdfdrivr.h b/src/3rdparty/freetype/src/bdf/bdfdrivr.h index b37b84ea..54aaa335 100644 --- a/src/3rdparty/freetype/src/bdf/bdfdrivr.h +++ b/src/3rdparty/freetype/src/bdf/bdfdrivr.h @@ -28,8 +28,7 @@ THE SOFTWARE. #ifndef BDFDRIVR_H_ #define BDFDRIVR_H_ -#include -#include FT_INTERNAL_DRIVER_H +#include #include "bdf.h" diff --git a/src/3rdparty/freetype/src/bdf/bdferror.h b/src/3rdparty/freetype/src/bdf/bdferror.h index dbe41c02..c1b54448 100644 --- a/src/3rdparty/freetype/src/bdf/bdferror.h +++ b/src/3rdparty/freetype/src/bdf/bdferror.h @@ -29,7 +29,7 @@ #ifndef BDFERROR_H_ #define BDFERROR_H_ -#include FT_MODULE_ERRORS_H +#include #undef FTERRORS_H_ @@ -37,7 +37,7 @@ #define FT_ERR_PREFIX BDF_Err_ #define FT_ERR_BASE FT_Mod_Err_BDF -#include FT_ERRORS_H +#include #endif /* BDFERROR_H_ */ diff --git a/src/3rdparty/freetype/src/bdf/bdflib.c b/src/3rdparty/freetype/src/bdf/bdflib.c index 63813f7e..a4ddb9a1 100644 --- a/src/3rdparty/freetype/src/bdf/bdflib.c +++ b/src/3rdparty/freetype/src/bdf/bdflib.c @@ -31,12 +31,11 @@ */ -#include -#include FT_FREETYPE_H -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_STREAM_H -#include FT_INTERNAL_OBJECTS_H +#include +#include +#include +#include #include "bdf.h" #include "bdferror.h" diff --git a/src/3rdparty/freetype/src/bzip2/Jamfile b/src/3rdparty/freetype/src/bzip2/Jamfile deleted file mode 100644 index 4b77916a..00000000 --- a/src/3rdparty/freetype/src/bzip2/Jamfile +++ /dev/null @@ -1,18 +0,0 @@ -# FreeType 2 src/bzip2 Jamfile -# -# Copyright (C) 2010-2019 by -# Joel Klinghed -# -# based on `src/lzw/Jamfile' -# -# This file is part of the FreeType project, and may only be used, modified, -# and distributed under the terms of the FreeType project license, -# LICENSE.TXT. By continuing to use, modify, or distribute this file you -# indicate that you have read the license and understand and accept it -# fully. - -SubDir FT2_TOP $(FT2_SRC_DIR) bzip2 ; - -Library $(FT2_LIB) : ftbzip2.c ; - -# end of src/bzip2 Jamfile diff --git a/src/3rdparty/freetype/src/bzip2/ftbzip2.c b/src/3rdparty/freetype/src/bzip2/ftbzip2.c index 1fda59b6..411c5d26 100644 --- a/src/3rdparty/freetype/src/bzip2/ftbzip2.c +++ b/src/3rdparty/freetype/src/bzip2/ftbzip2.c @@ -8,7 +8,7 @@ * parse compressed PCF fonts, as found with many X11 server * distributions. * - * Copyright (C) 2010-2019 by + * Copyright (C) 2010-2020 by * Joel Klinghed. * * based on `src/gzip/ftgzip.c' @@ -22,15 +22,14 @@ */ -#include -#include FT_INTERNAL_MEMORY_H -#include FT_INTERNAL_STREAM_H -#include FT_INTERNAL_DEBUG_H -#include FT_BZIP2_H +#include +#include +#include +#include #include FT_CONFIG_STANDARD_LIBRARY_H -#include FT_MODULE_ERRORS_H +#include #undef FTERRORS_H_ @@ -38,7 +37,7 @@ #define FT_ERR_PREFIX Bzip2_Err_ #define FT_ERR_BASE FT_Mod_Err_Bzip2 -#include FT_ERRORS_H +#include #ifdef FT_CONFIG_OPTION_USE_BZIP2 diff --git a/src/3rdparty/freetype/src/bzip2/rules.mk b/src/3rdparty/freetype/src/bzip2/rules.mk index f365c1f7..eed0f4ba 100644 --- a/src/3rdparty/freetype/src/bzip2/rules.mk +++ b/src/3rdparty/freetype/src/bzip2/rules.mk @@ -2,7 +2,7 @@ # FreeType 2 BZIP2 support configuration rules # -# Copyright (C) 2010-2019 by +# Copyright (C) 2010-2020 by # Joel Klinghed. # # based on `src/lzw/rules.mk' diff --git a/src/3rdparty/freetype/src/cache/Jamfile b/src/3rdparty/freetype/src/cache/Jamfile deleted file mode 100644 index 51f7196d..00000000 --- a/src/3rdparty/freetype/src/cache/Jamfile +++ /dev/null @@ -1,37 +0,0 @@ -# FreeType 2 src/cache Jamfile -# -# Copyright (C) 2001-2019 by -# David Turner, Robert Wilhelm, and Werner Lemberg. -# -# This file is part of the FreeType project, and may only be used, modified, -# and distributed under the terms of the FreeType project license, -# LICENSE.TXT. By continuing to use, modify, or distribute this file you -# indicate that you have read the license and understand and accept it -# fully. - -SubDir FT2_TOP $(FT2_SRC_DIR) cache ; - -{ - local _sources ; - - if $(FT2_MULTI) - { - _sources = ftcbasic - ftccache - ftcglyph - ftcimage - ftcmanag - ftccmap - ftcmru - ftcsbits - ; - } - else - { - _sources = ftcache ; - } - - Library $(FT2_LIB) : $(_sources).c ; -} - -# end of src/cache Jamfile diff --git a/src/3rdparty/freetype/src/cache/ftcache.c b/src/3rdparty/freetype/src/cache/ftcache.c index a6a3e63e..e90f4639 100644 --- a/src/3rdparty/freetype/src/cache/ftcache.c +++ b/src/3rdparty/freetype/src/cache/ftcache.c @@ -4,7 +4,7 @@ * * The FreeType Caching sub-system (body only). * - * Copyright (C) 2000-2019 by + * Copyright (C) 2000-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -17,7 +17,6 @@ #define FT_MAKE_OPTION_SINGLE_OBJECT -#include #include "ftcbasic.c" #include "ftccache.c" diff --git a/src/3rdparty/freetype/src/cache/ftcbasic.c b/src/3rdparty/freetype/src/cache/ftcbasic.c index a473585e..43ea314d 100644 --- a/src/3rdparty/freetype/src/cache/ftcbasic.c +++ b/src/3rdparty/freetype/src/cache/ftcbasic.c @@ -4,7 +4,7 @@ * * The FreeType basic cache interface (body). * - * Copyright (C) 2003-2019 by + * Copyright (C) 2003-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -16,10 +16,9 @@ */ -#include -#include FT_INTERNAL_OBJECTS_H -#include FT_INTERNAL_DEBUG_H -#include FT_CACHE_H +#include +#include +#include #include "ftcglyph.h" #include "ftcimage.h" #include "ftcsbits.h" @@ -111,7 +110,9 @@ if ( (FT_ULong)face->num_glyphs > FT_UINT_MAX || 0 > face->num_glyphs ) FT_TRACE1(( "ftc_basic_family_get_count:" - " too large number of glyphs in this face, truncated\n", + " the number of glyphs in this face is %ld,\n" + " " + " which is too much and thus truncated\n", face->num_glyphs )); if ( !error ) @@ -394,7 +395,7 @@ #if FT_ULONG_MAX > FT_UINT_MAX if ( load_flags > FT_UINT_MAX ) FT_TRACE1(( "FTC_ImageCache_LookupScaler:" - " higher bits in load_flags 0x%x are dropped\n", + " higher bits in load_flags 0x%lx are dropped\n", load_flags & ~((FT_ULong)FT_UINT_MAX) )); #endif @@ -594,7 +595,7 @@ #if FT_ULONG_MAX > FT_UINT_MAX if ( load_flags > FT_UINT_MAX ) FT_TRACE1(( "FTC_ImageCache_LookupScaler:" - " higher bits in load_flags 0x%x are dropped\n", + " higher bits in load_flags 0x%lx are dropped\n", load_flags & ~((FT_ULong)FT_UINT_MAX) )); #endif diff --git a/src/3rdparty/freetype/src/cache/ftccache.c b/src/3rdparty/freetype/src/cache/ftccache.c index f38ca44d..1c8e0f32 100644 --- a/src/3rdparty/freetype/src/cache/ftccache.c +++ b/src/3rdparty/freetype/src/cache/ftccache.c @@ -4,7 +4,7 @@ * * The FreeType internal cache interface (body). * - * Copyright (C) 2000-2019 by + * Copyright (C) 2000-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -16,10 +16,9 @@ */ -#include #include "ftcmanag.h" -#include FT_INTERNAL_OBJECTS_H -#include FT_INTERNAL_DEBUG_H +#include +#include #include "ftccback.h" #include "ftcerror.h" diff --git a/src/3rdparty/freetype/src/cache/ftccache.h b/src/3rdparty/freetype/src/cache/ftccache.h index 140ceadb..11698bb0 100644 --- a/src/3rdparty/freetype/src/cache/ftccache.h +++ b/src/3rdparty/freetype/src/cache/ftccache.h @@ -4,7 +4,7 @@ * * FreeType internal cache interface (specification). * - * Copyright (C) 2000-2019 by + * Copyright (C) 2000-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -19,7 +19,7 @@ #ifndef FTCCACHE_H_ #define FTCCACHE_H_ - +#include #include "ftcmru.h" FT_BEGIN_HEADER diff --git a/src/3rdparty/freetype/src/cache/ftccback.h b/src/3rdparty/freetype/src/cache/ftccback.h index 9321bc3d..542acb15 100644 --- a/src/3rdparty/freetype/src/cache/ftccback.h +++ b/src/3rdparty/freetype/src/cache/ftccback.h @@ -4,7 +4,7 @@ * * Callback functions of the caching sub-system (specification only). * - * Copyright (C) 2004-2019 by + * Copyright (C) 2004-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -18,14 +18,14 @@ #ifndef FTCCBACK_H_ #define FTCCBACK_H_ -#include -#include FT_CACHE_H +#include #include "ftcmru.h" #include "ftcimage.h" #include "ftcmanag.h" #include "ftcglyph.h" #include "ftcsbits.h" +FT_BEGIN_HEADER FT_LOCAL( void ) ftc_inode_free( FTC_Node inode, @@ -85,6 +85,7 @@ ftc_node_destroy( FTC_Node node, FTC_Manager manager ); +FT_END_HEADER #endif /* FTCCBACK_H_ */ diff --git a/src/3rdparty/freetype/src/cache/ftccmap.c b/src/3rdparty/freetype/src/cache/ftccmap.c index 76ba10e3..468c008c 100644 --- a/src/3rdparty/freetype/src/cache/ftccmap.c +++ b/src/3rdparty/freetype/src/cache/ftccmap.c @@ -4,7 +4,7 @@ * * FreeType CharMap cache (body) * - * Copyright (C) 2000-2019 by + * Copyright (C) 2000-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -16,13 +16,12 @@ */ -#include -#include FT_FREETYPE_H -#include FT_CACHE_H +#include +#include #include "ftcmanag.h" -#include FT_INTERNAL_MEMORY_H -#include FT_INTERNAL_OBJECTS_H -#include FT_INTERNAL_DEBUG_H +#include +#include +#include #include "ftccback.h" #include "ftcerror.h" diff --git a/src/3rdparty/freetype/src/cache/ftcerror.h b/src/3rdparty/freetype/src/cache/ftcerror.h index e2d64171..bedfd283 100644 --- a/src/3rdparty/freetype/src/cache/ftcerror.h +++ b/src/3rdparty/freetype/src/cache/ftcerror.h @@ -4,7 +4,7 @@ * * Caching sub-system error codes (specification only). * - * Copyright (C) 2001-2019 by + * Copyright (C) 2001-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -26,7 +26,7 @@ #ifndef FTCERROR_H_ #define FTCERROR_H_ -#include FT_MODULE_ERRORS_H +#include #undef FTERRORS_H_ @@ -34,7 +34,7 @@ #define FT_ERR_PREFIX FTC_Err_ #define FT_ERR_BASE FT_Mod_Err_Cache -#include FT_ERRORS_H +#include #endif /* FTCERROR_H_ */ diff --git a/src/3rdparty/freetype/src/cache/ftcglyph.c b/src/3rdparty/freetype/src/cache/ftcglyph.c index 2a0e97d4..7f5438aa 100644 --- a/src/3rdparty/freetype/src/cache/ftcglyph.c +++ b/src/3rdparty/freetype/src/cache/ftcglyph.c @@ -4,7 +4,7 @@ * * FreeType Glyph Image (FT_Glyph) cache (body). * - * Copyright (C) 2000-2019 by + * Copyright (C) 2000-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -16,11 +16,10 @@ */ -#include -#include FT_INTERNAL_OBJECTS_H -#include FT_CACHE_H +#include +#include #include "ftcglyph.h" -#include FT_ERRORS_H +#include #include "ftccback.h" #include "ftcerror.h" diff --git a/src/3rdparty/freetype/src/cache/ftcglyph.h b/src/3rdparty/freetype/src/cache/ftcglyph.h index 5a1f0e2a..5629545f 100644 --- a/src/3rdparty/freetype/src/cache/ftcglyph.h +++ b/src/3rdparty/freetype/src/cache/ftcglyph.h @@ -4,7 +4,7 @@ * * FreeType abstract glyph cache (specification). * - * Copyright (C) 2000-2019 by + * Copyright (C) 2000-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -117,7 +117,6 @@ #define FTCGLYPH_H_ -#include #include "ftcmanag.h" diff --git a/src/3rdparty/freetype/src/cache/ftcimage.c b/src/3rdparty/freetype/src/cache/ftcimage.c index 9e64d51a..58ebad8c 100644 --- a/src/3rdparty/freetype/src/cache/ftcimage.c +++ b/src/3rdparty/freetype/src/cache/ftcimage.c @@ -4,7 +4,7 @@ * * FreeType Image cache (body). * - * Copyright (C) 2000-2019 by + * Copyright (C) 2000-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -16,11 +16,10 @@ */ -#include -#include FT_CACHE_H +#include #include "ftcimage.h" -#include FT_INTERNAL_MEMORY_H -#include FT_INTERNAL_OBJECTS_H +#include +#include #include "ftccback.h" #include "ftcerror.h" diff --git a/src/3rdparty/freetype/src/cache/ftcimage.h b/src/3rdparty/freetype/src/cache/ftcimage.h index dcb101fa..a400788b 100644 --- a/src/3rdparty/freetype/src/cache/ftcimage.h +++ b/src/3rdparty/freetype/src/cache/ftcimage.h @@ -4,7 +4,7 @@ * * FreeType Generic Image cache (specification) * - * Copyright (C) 2000-2019 by + * Copyright (C) 2000-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -36,8 +36,7 @@ #define FTCIMAGE_H_ -#include -#include FT_CACHE_H +#include #include "ftcglyph.h" FT_BEGIN_HEADER diff --git a/src/3rdparty/freetype/src/cache/ftcmanag.c b/src/3rdparty/freetype/src/cache/ftcmanag.c index bd585968..436d41f3 100644 --- a/src/3rdparty/freetype/src/cache/ftcmanag.c +++ b/src/3rdparty/freetype/src/cache/ftcmanag.c @@ -4,7 +4,7 @@ * * FreeType Cache Manager (body). * - * Copyright (C) 2000-2019 by + * Copyright (C) 2000-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -16,12 +16,11 @@ */ -#include -#include FT_CACHE_H +#include #include "ftcmanag.h" -#include FT_INTERNAL_OBJECTS_H -#include FT_INTERNAL_DEBUG_H -#include FT_SIZES_H +#include +#include +#include #include "ftccback.h" #include "ftcerror.h" diff --git a/src/3rdparty/freetype/src/cache/ftcmanag.h b/src/3rdparty/freetype/src/cache/ftcmanag.h index 60c66c8f..6c6ec685 100644 --- a/src/3rdparty/freetype/src/cache/ftcmanag.h +++ b/src/3rdparty/freetype/src/cache/ftcmanag.h @@ -4,7 +4,7 @@ * * FreeType Cache Manager (specification). * - * Copyright (C) 2000-2019 by + * Copyright (C) 2000-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -63,8 +63,7 @@ #define FTCMANAG_H_ -#include -#include FT_CACHE_H +#include #include "ftcmru.h" #include "ftccache.h" diff --git a/src/3rdparty/freetype/src/cache/ftcmru.c b/src/3rdparty/freetype/src/cache/ftcmru.c index 18a7b800..8feed45f 100644 --- a/src/3rdparty/freetype/src/cache/ftcmru.c +++ b/src/3rdparty/freetype/src/cache/ftcmru.c @@ -4,7 +4,7 @@ * * FreeType MRU support (body). * - * Copyright (C) 2003-2019 by + * Copyright (C) 2003-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -16,11 +16,10 @@ */ -#include -#include FT_CACHE_H +#include #include "ftcmru.h" -#include FT_INTERNAL_OBJECTS_H -#include FT_INTERNAL_DEBUG_H +#include +#include #include "ftcerror.h" diff --git a/src/3rdparty/freetype/src/cache/ftcmru.h b/src/3rdparty/freetype/src/cache/ftcmru.h index 58721ed3..ac4f9b12 100644 --- a/src/3rdparty/freetype/src/cache/ftcmru.h +++ b/src/3rdparty/freetype/src/cache/ftcmru.h @@ -4,7 +4,7 @@ * * Simple MRU list-cache (specification). * - * Copyright (C) 2000-2019 by + * Copyright (C) 2000-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -44,8 +44,8 @@ #define FTCMRU_H_ -#include -#include FT_FREETYPE_H +#include +#include #ifdef FREETYPE_H #error "freetype.h of FreeType 1 has been loaded!" diff --git a/src/3rdparty/freetype/src/cache/ftcsbits.c b/src/3rdparty/freetype/src/cache/ftcsbits.c index 06b46c89..e0db930a 100644 --- a/src/3rdparty/freetype/src/cache/ftcsbits.c +++ b/src/3rdparty/freetype/src/cache/ftcsbits.c @@ -4,7 +4,7 @@ * * FreeType sbits manager (body). * - * Copyright (C) 2000-2019 by + * Copyright (C) 2000-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -16,12 +16,11 @@ */ -#include -#include FT_CACHE_H +#include #include "ftcsbits.h" -#include FT_INTERNAL_OBJECTS_H -#include FT_INTERNAL_DEBUG_H -#include FT_ERRORS_H +#include +#include +#include #include "ftccback.h" #include "ftcerror.h" diff --git a/src/3rdparty/freetype/src/cache/ftcsbits.h b/src/3rdparty/freetype/src/cache/ftcsbits.h index f1b71c28..46f797e7 100644 --- a/src/3rdparty/freetype/src/cache/ftcsbits.h +++ b/src/3rdparty/freetype/src/cache/ftcsbits.h @@ -4,7 +4,7 @@ * * A small-bitmap cache (specification). * - * Copyright (C) 2000-2019 by + * Copyright (C) 2000-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -20,8 +20,7 @@ #define FTCSBITS_H_ -#include -#include FT_CACHE_H +#include #include "ftcglyph.h" diff --git a/src/3rdparty/freetype/src/cache/rules.mk b/src/3rdparty/freetype/src/cache/rules.mk index 1618d983..4738b515 100644 --- a/src/3rdparty/freetype/src/cache/rules.mk +++ b/src/3rdparty/freetype/src/cache/rules.mk @@ -3,7 +3,7 @@ # -# Copyright (C) 2000-2019 by +# Copyright (C) 2000-2020 by # David Turner, Robert Wilhelm, and Werner Lemberg. # # This file is part of the FreeType project, and may only be used, modified, diff --git a/src/3rdparty/freetype/src/cff/Jamfile b/src/3rdparty/freetype/src/cff/Jamfile deleted file mode 100644 index 10f49cef..00000000 --- a/src/3rdparty/freetype/src/cff/Jamfile +++ /dev/null @@ -1,36 +0,0 @@ -# FreeType 2 src/cff Jamfile -# -# Copyright (C) 2001-2019 by -# David Turner, Robert Wilhelm, and Werner Lemberg. -# -# This file is part of the FreeType project, and may only be used, modified, -# and distributed under the terms of the FreeType project license, -# LICENSE.TXT. By continuing to use, modify, or distribute this file you -# indicate that you have read the license and understand and accept it -# fully. - -SubDir FT2_TOP $(FT2_SRC_DIR) cff ; - -{ - local _sources ; - - if $(FT2_MULTI) - { - _sources = cffcmap - cffdrivr - cffgload - cffload - cffobjs - cffparse - cffpic - ; - } - else - { - _sources = cff ; - } - - Library $(FT2_LIB) : $(_sources).c ; -} - -# end of src/cff Jamfile diff --git a/src/3rdparty/freetype/src/cff/cf2arrst.c b/src/3rdparty/freetype/src/cff/cf2arrst.c deleted file mode 100644 index 89f3e9f1..00000000 --- a/src/3rdparty/freetype/src/cff/cf2arrst.c +++ /dev/null @@ -1,241 +0,0 @@ -/***************************************************************************/ -/* */ -/* cf2arrst.c */ -/* */ -/* Adobe's code for Array Stacks (body). */ -/* */ -/* Copyright 2007-2013 Adobe Systems Incorporated. */ -/* */ -/* This software, and all works of authorship, whether in source or */ -/* object code form as indicated by the copyright notice(s) included */ -/* herein (collectively, the "Work") is made available, and may only be */ -/* used, modified, and distributed under the FreeType Project License, */ -/* LICENSE.TXT. Additionally, subject to the terms and conditions of the */ -/* FreeType Project License, each contributor to the Work hereby grants */ -/* to any individual or legal entity exercising permissions granted by */ -/* the FreeType Project License and this section (hereafter, "You" or */ -/* "Your") a perpetual, worldwide, non-exclusive, no-charge, */ -/* royalty-free, irrevocable (except as stated in this section) patent */ -/* license to make, have made, use, offer to sell, sell, import, and */ -/* otherwise transfer the Work, where such license applies only to those */ -/* patent claims licensable by such contributor that are necessarily */ -/* infringed by their contribution(s) alone or by combination of their */ -/* contribution(s) with the Work to which such contribution(s) was */ -/* submitted. If You institute patent litigation against any entity */ -/* (including a cross-claim or counterclaim in a lawsuit) alleging that */ -/* the Work or a contribution incorporated within the Work constitutes */ -/* direct or contributory patent infringement, then any patent licenses */ -/* granted to You under this License for that Work shall terminate as of */ -/* the date such litigation is filed. */ -/* */ -/* By using, modifying, or distributing the Work you indicate that you */ -/* have read and understood the terms and conditions of the */ -/* FreeType Project License as well as those provided in this section, */ -/* and you accept them fully. */ -/* */ -/***************************************************************************/ - - -#include "cf2ft.h" -#include FT_INTERNAL_DEBUG_H - -#include "cf2glue.h" -#include "cf2arrst.h" - -#include "cf2error.h" - - - /* - * CF2_ArrStack uses an error pointer, to enable shared errors. - * Shared errors are necessary when multiple objects allow the program - * to continue after detecting errors. Only the first error should be - * recorded. - */ - - FT_LOCAL_DEF( void ) - cf2_arrstack_init( CF2_ArrStack arrstack, - FT_Memory memory, - FT_Error* error, - size_t sizeItem ) - { - FT_ASSERT( arrstack != NULL ); - - /* initialize the structure */ - arrstack->memory = memory; - arrstack->error = error; - arrstack->sizeItem = sizeItem; - arrstack->allocated = 0; - arrstack->chunk = 10; /* chunks of 10 items */ - arrstack->count = 0; - arrstack->totalSize = 0; - arrstack->ptr = NULL; - } - - - FT_LOCAL_DEF( void ) - cf2_arrstack_finalize( CF2_ArrStack arrstack ) - { - FT_Memory memory = arrstack->memory; /* for FT_FREE */ - - - FT_ASSERT( arrstack != NULL ); - - arrstack->allocated = 0; - arrstack->count = 0; - arrstack->totalSize = 0; - - /* free the data buffer */ - FT_FREE( arrstack->ptr ); - } - - - /* allocate or reallocate the buffer size; */ - /* return false on memory error */ - static FT_Bool - cf2_arrstack_setNumElements( CF2_ArrStack arrstack, - size_t numElements ) - { - FT_ASSERT( arrstack != NULL ); - - { - FT_Error error = FT_Err_Ok; /* for FT_REALLOC */ - FT_Memory memory = arrstack->memory; /* for FT_REALLOC */ - - size_t newSize = numElements * arrstack->sizeItem; - - - if ( numElements > FT_LONG_MAX / arrstack->sizeItem ) - goto exit; - - - FT_ASSERT( newSize > 0 ); /* avoid realloc with zero size */ - - if ( !FT_REALLOC( arrstack->ptr, arrstack->totalSize, newSize ) ) - { - arrstack->allocated = numElements; - arrstack->totalSize = newSize; - - if ( arrstack->count > numElements ) - { - /* we truncated the list! */ - CF2_SET_ERROR( arrstack->error, Stack_Overflow ); - arrstack->count = numElements; - return FALSE; - } - - return TRUE; /* success */ - } - } - - exit: - /* if there's not already an error, store this one */ - CF2_SET_ERROR( arrstack->error, Out_Of_Memory ); - - return FALSE; - } - - - /* set the count, ensuring allocation is sufficient */ - FT_LOCAL_DEF( void ) - cf2_arrstack_setCount( CF2_ArrStack arrstack, - size_t numElements ) - { - FT_ASSERT( arrstack != NULL ); - - if ( numElements > arrstack->allocated ) - { - /* expand the allocation first */ - if ( !cf2_arrstack_setNumElements( arrstack, numElements ) ) - return; - } - - arrstack->count = numElements; - } - - - /* clear the count */ - FT_LOCAL_DEF( void ) - cf2_arrstack_clear( CF2_ArrStack arrstack ) - { - FT_ASSERT( arrstack != NULL ); - - arrstack->count = 0; - } - - - /* current number of items */ - FT_LOCAL_DEF( size_t ) - cf2_arrstack_size( const CF2_ArrStack arrstack ) - { - FT_ASSERT( arrstack != NULL ); - - return arrstack->count; - } - - - FT_LOCAL_DEF( void* ) - cf2_arrstack_getBuffer( const CF2_ArrStack arrstack ) - { - FT_ASSERT( arrstack != NULL ); - - return arrstack->ptr; - } - - - /* return pointer to the given element */ - FT_LOCAL_DEF( void* ) - cf2_arrstack_getPointer( const CF2_ArrStack arrstack, - size_t idx ) - { - void* newPtr; - - - FT_ASSERT( arrstack != NULL ); - - if ( idx >= arrstack->count ) - { - /* overflow */ - CF2_SET_ERROR( arrstack->error, Stack_Overflow ); - idx = 0; /* choose safe default */ - } - - newPtr = (FT_Byte*)arrstack->ptr + idx * arrstack->sizeItem; - - return newPtr; - } - - - /* push (append) an element at the end of the list; */ - /* return false on memory error */ - /* TODO: should there be a length param for extra checking? */ - FT_LOCAL_DEF( void ) - cf2_arrstack_push( CF2_ArrStack arrstack, - const void* ptr ) - { - FT_ASSERT( arrstack != NULL ); - - if ( arrstack->count == arrstack->allocated ) - { - /* grow the buffer by one chunk */ - if ( !cf2_arrstack_setNumElements( - arrstack, arrstack->allocated + arrstack->chunk ) ) - { - /* on error, ignore the push */ - return; - } - } - - FT_ASSERT( ptr != NULL ); - - { - size_t offset = arrstack->count * arrstack->sizeItem; - void* newPtr = (FT_Byte*)arrstack->ptr + offset; - - - FT_MEM_COPY( newPtr, ptr, arrstack->sizeItem ); - arrstack->count += 1; - } - } - - -/* END */ diff --git a/src/3rdparty/freetype/src/cff/cf2arrst.h b/src/3rdparty/freetype/src/cff/cf2arrst.h deleted file mode 100644 index ff5ad8b1..00000000 --- a/src/3rdparty/freetype/src/cff/cf2arrst.h +++ /dev/null @@ -1,100 +0,0 @@ -/***************************************************************************/ -/* */ -/* cf2arrst.h */ -/* */ -/* Adobe's code for Array Stacks (specification). */ -/* */ -/* Copyright 2007-2013 Adobe Systems Incorporated. */ -/* */ -/* This software, and all works of authorship, whether in source or */ -/* object code form as indicated by the copyright notice(s) included */ -/* herein (collectively, the "Work") is made available, and may only be */ -/* used, modified, and distributed under the FreeType Project License, */ -/* LICENSE.TXT. Additionally, subject to the terms and conditions of the */ -/* FreeType Project License, each contributor to the Work hereby grants */ -/* to any individual or legal entity exercising permissions granted by */ -/* the FreeType Project License and this section (hereafter, "You" or */ -/* "Your") a perpetual, worldwide, non-exclusive, no-charge, */ -/* royalty-free, irrevocable (except as stated in this section) patent */ -/* license to make, have made, use, offer to sell, sell, import, and */ -/* otherwise transfer the Work, where such license applies only to those */ -/* patent claims licensable by such contributor that are necessarily */ -/* infringed by their contribution(s) alone or by combination of their */ -/* contribution(s) with the Work to which such contribution(s) was */ -/* submitted. If You institute patent litigation against any entity */ -/* (including a cross-claim or counterclaim in a lawsuit) alleging that */ -/* the Work or a contribution incorporated within the Work constitutes */ -/* direct or contributory patent infringement, then any patent licenses */ -/* granted to You under this License for that Work shall terminate as of */ -/* the date such litigation is filed. */ -/* */ -/* By using, modifying, or distributing the Work you indicate that you */ -/* have read and understood the terms and conditions of the */ -/* FreeType Project License as well as those provided in this section, */ -/* and you accept them fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __CF2ARRST_H__ -#define __CF2ARRST_H__ - - -#include "cf2error.h" - - -FT_BEGIN_HEADER - - - /* need to define the struct here (not opaque) so it can be allocated by */ - /* clients */ - typedef struct CF2_ArrStackRec_ - { - FT_Memory memory; - FT_Error* error; - - size_t sizeItem; /* bytes per element */ - size_t allocated; /* items allocated */ - size_t chunk; /* allocation increment in items */ - size_t count; /* number of elements allocated */ - size_t totalSize; /* total bytes allocated */ - - void* ptr; /* ptr to data */ - - } CF2_ArrStackRec, *CF2_ArrStack; - - - FT_LOCAL( void ) - cf2_arrstack_init( CF2_ArrStack arrstack, - FT_Memory memory, - FT_Error* error, - size_t sizeItem ); - FT_LOCAL( void ) - cf2_arrstack_finalize( CF2_ArrStack arrstack ); - - FT_LOCAL( void ) - cf2_arrstack_setCount( CF2_ArrStack arrstack, - size_t numElements ); - FT_LOCAL( void ) - cf2_arrstack_clear( CF2_ArrStack arrstack ); - FT_LOCAL( size_t ) - cf2_arrstack_size( const CF2_ArrStack arrstack ); - - FT_LOCAL( void* ) - cf2_arrstack_getBuffer( const CF2_ArrStack arrstack ); - FT_LOCAL( void* ) - cf2_arrstack_getPointer( const CF2_ArrStack arrstack, - size_t idx ); - - FT_LOCAL( void ) - cf2_arrstack_push( CF2_ArrStack arrstack, - const void* ptr ); - - -FT_END_HEADER - - -#endif /* __CF2ARRST_H__ */ - - -/* END */ diff --git a/src/3rdparty/freetype/src/cff/cf2blues.c b/src/3rdparty/freetype/src/cff/cf2blues.c deleted file mode 100644 index 250f89e0..00000000 --- a/src/3rdparty/freetype/src/cff/cf2blues.c +++ /dev/null @@ -1,579 +0,0 @@ -/***************************************************************************/ -/* */ -/* cf2blues.c */ -/* */ -/* Adobe's code for handling Blue Zones (body). */ -/* */ -/* Copyright 2009-2014 Adobe Systems Incorporated. */ -/* */ -/* This software, and all works of authorship, whether in source or */ -/* object code form as indicated by the copyright notice(s) included */ -/* herein (collectively, the "Work") is made available, and may only be */ -/* used, modified, and distributed under the FreeType Project License, */ -/* LICENSE.TXT. Additionally, subject to the terms and conditions of the */ -/* FreeType Project License, each contributor to the Work hereby grants */ -/* to any individual or legal entity exercising permissions granted by */ -/* the FreeType Project License and this section (hereafter, "You" or */ -/* "Your") a perpetual, worldwide, non-exclusive, no-charge, */ -/* royalty-free, irrevocable (except as stated in this section) patent */ -/* license to make, have made, use, offer to sell, sell, import, and */ -/* otherwise transfer the Work, where such license applies only to those */ -/* patent claims licensable by such contributor that are necessarily */ -/* infringed by their contribution(s) alone or by combination of their */ -/* contribution(s) with the Work to which such contribution(s) was */ -/* submitted. If You institute patent litigation against any entity */ -/* (including a cross-claim or counterclaim in a lawsuit) alleging that */ -/* the Work or a contribution incorporated within the Work constitutes */ -/* direct or contributory patent infringement, then any patent licenses */ -/* granted to You under this License for that Work shall terminate as of */ -/* the date such litigation is filed. */ -/* */ -/* By using, modifying, or distributing the Work you indicate that you */ -/* have read and understood the terms and conditions of the */ -/* FreeType Project License as well as those provided in this section, */ -/* and you accept them fully. */ -/* */ -/***************************************************************************/ - - -#include "cf2ft.h" -#include FT_INTERNAL_DEBUG_H - -#include "cf2blues.h" -#include "cf2hints.h" -#include "cf2font.h" - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_cf2blues - - - /* - * For blue values, the FreeType parser produces an array of integers, - * while the Adobe CFF engine produces an array of fixed. - * Define a macro to convert FreeType to fixed. - */ -#define cf2_blueToFixed( x ) cf2_intToFixed( x ) - - - FT_LOCAL_DEF( void ) - cf2_blues_init( CF2_Blues blues, - CF2_Font font ) - { - /* pointer to parsed font object */ - CFF_Decoder* decoder = font->decoder; - - CF2_Fixed zoneHeight; - CF2_Fixed maxZoneHeight = 0; - CF2_Fixed csUnitsPerPixel; - - size_t numBlueValues; - size_t numOtherBlues; - size_t numFamilyBlues; - size_t numFamilyOtherBlues; - - FT_Pos* blueValues; - FT_Pos* otherBlues; - FT_Pos* familyBlues; - FT_Pos* familyOtherBlues; - - size_t i; - CF2_Fixed emBoxBottom, emBoxTop; - -#if 0 - CF2_Int unitsPerEm = font->unitsPerEm; - - - if ( unitsPerEm == 0 ) - unitsPerEm = 1000; -#endif - - FT_ZERO( blues ); - blues->scale = font->innerTransform.d; - - cf2_getBlueMetrics( decoder, - &blues->blueScale, - &blues->blueShift, - &blues->blueFuzz ); - - cf2_getBlueValues( decoder, &numBlueValues, &blueValues ); - cf2_getOtherBlues( decoder, &numOtherBlues, &otherBlues ); - cf2_getFamilyBlues( decoder, &numFamilyBlues, &familyBlues ); - cf2_getFamilyOtherBlues( decoder, &numFamilyOtherBlues, &familyOtherBlues ); - - /* - * synthetic em box hint heuristic - * - * Apply this when ideographic dictionary (LanguageGroup 1) has no - * real alignment zones. Adobe tools generate dummy zones at -250 and - * 1100 for a 1000 unit em. Fonts with ICF-based alignment zones - * should not enable the heuristic. When the heuristic is enabled, - * the font's blue zones are ignored. - * - */ - - /* get em box from OS/2 typoAscender/Descender */ - /* TODO: FreeType does not parse these metrics. Skip them for now. */ -#if 0 - FCM_getHorizontalLineMetrics( &e, - font->font, - &ascender, - &descender, - &linegap ); - if ( ascender - descender == unitsPerEm ) - { - emBoxBottom = cf2_intToFixed( descender ); - emBoxTop = cf2_intToFixed( ascender ); - } - else -#endif - { - emBoxBottom = CF2_ICF_Bottom; - emBoxTop = CF2_ICF_Top; - } - - if ( cf2_getLanguageGroup( decoder ) == 1 && - ( numBlueValues == 0 || - ( numBlueValues == 4 && - cf2_blueToFixed( blueValues[0] ) < emBoxBottom && - cf2_blueToFixed( blueValues[1] ) < emBoxBottom && - cf2_blueToFixed( blueValues[2] ) > emBoxTop && - cf2_blueToFixed( blueValues[3] ) > emBoxTop ) ) ) - { - /* - * Construct hint edges suitable for synthetic ghost hints at top - * and bottom of em box. +-CF2_MIN_COUNTER allows for unhinted - * features above or below the last hinted edge. This also gives a - * net 1 pixel boost to the height of ideographic glyphs. - * - * Note: Adjust synthetic hints outward by epsilon (0x.0001) to - * avoid interference. E.g., some fonts have real hints at - * 880 and -120. - */ - - blues->emBoxBottomEdge.csCoord = emBoxBottom - CF2_FIXED_EPSILON; - blues->emBoxBottomEdge.dsCoord = cf2_fixedRound( - FT_MulFix( - blues->emBoxBottomEdge.csCoord, - blues->scale ) ) - - CF2_MIN_COUNTER; - blues->emBoxBottomEdge.scale = blues->scale; - blues->emBoxBottomEdge.flags = CF2_GhostBottom | - CF2_Locked | - CF2_Synthetic; - - blues->emBoxTopEdge.csCoord = emBoxTop + CF2_FIXED_EPSILON + - 2 * font->darkenY; - blues->emBoxTopEdge.dsCoord = cf2_fixedRound( - FT_MulFix( - blues->emBoxTopEdge.csCoord, - blues->scale ) ) + - CF2_MIN_COUNTER; - blues->emBoxTopEdge.scale = blues->scale; - blues->emBoxTopEdge.flags = CF2_GhostTop | - CF2_Locked | - CF2_Synthetic; - - blues->doEmBoxHints = TRUE; /* enable the heuristic */ - - return; - } - - /* copy `BlueValues' and `OtherBlues' to a combined array of top and */ - /* bottom zones */ - for ( i = 0; i < numBlueValues; i += 2 ) - { - blues->zone[blues->count].csBottomEdge = - cf2_blueToFixed( blueValues[i] ); - blues->zone[blues->count].csTopEdge = - cf2_blueToFixed( blueValues[i + 1] ); - - zoneHeight = blues->zone[blues->count].csTopEdge - - blues->zone[blues->count].csBottomEdge; - - if ( zoneHeight < 0 ) - { - FT_TRACE4(( "cf2_blues_init: ignoring negative zone height\n" )); - continue; /* reject this zone */ - } - - if ( zoneHeight > maxZoneHeight ) - { - /* take maximum before darkening adjustment */ - /* so overshoot suppression point doesn't change */ - maxZoneHeight = zoneHeight; - } - - /* adjust both edges of top zone upward by twice darkening amount */ - if ( i != 0 ) - { - blues->zone[blues->count].csTopEdge += 2 * font->darkenY; - blues->zone[blues->count].csBottomEdge += 2 * font->darkenY; - } - - /* first `BlueValue' is bottom zone; others are top */ - if ( i == 0 ) - { - blues->zone[blues->count].bottomZone = - TRUE; - blues->zone[blues->count].csFlatEdge = - blues->zone[blues->count].csTopEdge; - } - else - { - blues->zone[blues->count].bottomZone = - FALSE; - blues->zone[blues->count].csFlatEdge = - blues->zone[blues->count].csBottomEdge; - } - - blues->count += 1; - } - - for ( i = 0; i < numOtherBlues; i += 2 ) - { - blues->zone[blues->count].csBottomEdge = - cf2_blueToFixed( otherBlues[i] ); - blues->zone[blues->count].csTopEdge = - cf2_blueToFixed( otherBlues[i + 1] ); - - zoneHeight = blues->zone[blues->count].csTopEdge - - blues->zone[blues->count].csBottomEdge; - - if ( zoneHeight < 0 ) - { - FT_TRACE4(( "cf2_blues_init: ignoring negative zone height\n" )); - continue; /* reject this zone */ - } - - if ( zoneHeight > maxZoneHeight ) - { - /* take maximum before darkening adjustment */ - /* so overshoot suppression point doesn't change */ - maxZoneHeight = zoneHeight; - } - - /* Note: bottom zones are not adjusted for darkening amount */ - - /* all OtherBlues are bottom zone */ - blues->zone[blues->count].bottomZone = - TRUE; - blues->zone[blues->count].csFlatEdge = - blues->zone[blues->count].csTopEdge; - - blues->count += 1; - } - - /* Adjust for FamilyBlues */ - - /* Search for the nearest flat edge in `FamilyBlues' or */ - /* `FamilyOtherBlues'. According to the Black Book, any matching edge */ - /* must be within one device pixel */ - - csUnitsPerPixel = FT_DivFix( cf2_intToFixed( 1 ), blues->scale ); - - /* loop on all zones in this font */ - for ( i = 0; i < blues->count; i++ ) - { - size_t j; - CF2_Fixed minDiff; - CF2_Fixed flatFamilyEdge, diff; - /* value for this font */ - CF2_Fixed flatEdge = blues->zone[i].csFlatEdge; - - - if ( blues->zone[i].bottomZone ) - { - /* In a bottom zone, the top edge is the flat edge. */ - /* Search `FamilyOtherBlues' for bottom zones; look for closest */ - /* Family edge that is within the one pixel threshold. */ - - minDiff = CF2_FIXED_MAX; - - for ( j = 0; j < numFamilyOtherBlues; j += 2 ) - { - /* top edge */ - flatFamilyEdge = cf2_blueToFixed( familyOtherBlues[j + 1] ); - - diff = cf2_fixedAbs( flatEdge - flatFamilyEdge ); - - if ( diff < minDiff && diff < csUnitsPerPixel ) - { - blues->zone[i].csFlatEdge = flatFamilyEdge; - minDiff = diff; - - if ( diff == 0 ) - break; - } - } - - /* check the first member of FamilyBlues, which is a bottom zone */ - if ( numFamilyBlues >= 2 ) - { - /* top edge */ - flatFamilyEdge = cf2_blueToFixed( familyBlues[1] ); - - diff = cf2_fixedAbs( flatEdge - flatFamilyEdge ); - - if ( diff < minDiff && diff < csUnitsPerPixel ) - blues->zone[i].csFlatEdge = flatFamilyEdge; - } - } - else - { - /* In a top zone, the bottom edge is the flat edge. */ - /* Search `FamilyBlues' for top zones; skip first zone, which is a */ - /* bottom zone; look for closest Family edge that is within the */ - /* one pixel threshold */ - - minDiff = CF2_FIXED_MAX; - - for ( j = 2; j < numFamilyBlues; j += 2 ) - { - /* bottom edge */ - flatFamilyEdge = cf2_blueToFixed( familyBlues[j] ); - - /* adjust edges of top zone upward by twice darkening amount */ - flatFamilyEdge += 2 * font->darkenY; /* bottom edge */ - - diff = cf2_fixedAbs( flatEdge - flatFamilyEdge ); - - if ( diff < minDiff && diff < csUnitsPerPixel ) - { - blues->zone[i].csFlatEdge = flatFamilyEdge; - minDiff = diff; - - if ( diff == 0 ) - break; - } - } - } - } - - /* TODO: enforce separation of zones, including BlueFuzz */ - - /* Adjust BlueScale; similar to AdjustBlueScale() in coretype */ - /* `bcsetup.c'. */ - - if ( maxZoneHeight > 0 ) - { - if ( blues->blueScale > FT_DivFix( cf2_intToFixed( 1 ), - maxZoneHeight ) ) - { - /* clamp at maximum scale */ - blues->blueScale = FT_DivFix( cf2_intToFixed( 1 ), - maxZoneHeight ); - } - - /* - * TODO: Revisit the bug fix for 613448. The minimum scale - * requirement catches a number of library fonts. For - * example, with default BlueScale (.039625) and 0.4 minimum, - * the test below catches any font with maxZoneHeight < 10.1. - * There are library fonts ranging from 2 to 10 that get - * caught, including e.g., Eurostile LT Std Medium with - * maxZoneHeight of 6. - * - */ -#if 0 - if ( blueScale < .4 / maxZoneHeight ) - { - tetraphilia_assert( 0 ); - /* clamp at minimum scale, per bug 0613448 fix */ - blueScale = .4 / maxZoneHeight; - } -#endif - - } - - /* - * Suppress overshoot and boost blue zones at small sizes. Boost - * amount varies linearly from 0.5 pixel near 0 to 0 pixel at - * blueScale cutoff. - * Note: This boost amount is different from the coretype heuristic. - * - */ - - if ( blues->scale < blues->blueScale ) - { - blues->suppressOvershoot = TRUE; - - /* Change rounding threshold for `dsFlatEdge'. */ - /* Note: constant changed from 0.5 to 0.6 to avoid a problem with */ - /* 10ppem Arial */ - - blues->boost = cf2_floatToFixed( .6 ) - - FT_MulDiv( cf2_floatToFixed ( .6 ), - blues->scale, - blues->blueScale ); - if ( blues->boost > 0x7FFF ) - { - /* boost must remain less than 0.5, or baseline could go negative */ - blues->boost = 0x7FFF; - } - } - - /* boost and darkening have similar effects; don't do both */ - if ( font->stemDarkened ) - blues->boost = 0; - - /* set device space alignment for each zone; */ - /* apply boost amount before rounding flat edge */ - - for ( i = 0; i < blues->count; i++ ) - { - if ( blues->zone[i].bottomZone ) - blues->zone[i].dsFlatEdge = cf2_fixedRound( - FT_MulFix( - blues->zone[i].csFlatEdge, - blues->scale ) - - blues->boost ); - else - blues->zone[i].dsFlatEdge = cf2_fixedRound( - FT_MulFix( - blues->zone[i].csFlatEdge, - blues->scale ) + - blues->boost ); - } - } - - - /* - * Check whether `stemHint' is captured by one of the blue zones. - * - * Zero, one or both edges may be valid; only valid edges can be - * captured. For compatibility with CoolType, search top and bottom - * zones in the same pass (see `BlueLock'). If a hint is captured, - * return true and position the edge(s) in one of 3 ways: - * - * 1) If `BlueScale' suppresses overshoot, position the captured edge - * at the flat edge of the zone. - * 2) If overshoot is not suppressed and `BlueShift' requires - * overshoot, position the captured edge a minimum of 1 device pixel - * from the flat edge. - * 3) If overshoot is not suppressed or required, position the captured - * edge at the nearest device pixel. - * - */ - FT_LOCAL_DEF( FT_Bool ) - cf2_blues_capture( const CF2_Blues blues, - CF2_Hint bottomHintEdge, - CF2_Hint topHintEdge ) - { - /* TODO: validate? */ - CF2_Fixed csFuzz = blues->blueFuzz; - - /* new position of captured edge */ - CF2_Fixed dsNew; - - /* amount that hint is moved when positioned */ - CF2_Fixed dsMove = 0; - - FT_Bool captured = FALSE; - CF2_UInt i; - - - /* assert edge flags are consistent */ - FT_ASSERT( !cf2_hint_isTop( bottomHintEdge ) && - !cf2_hint_isBottom( topHintEdge ) ); - - /* TODO: search once without blue fuzz for compatibility with coretype? */ - for ( i = 0; i < blues->count; i++ ) - { - if ( blues->zone[i].bottomZone && - cf2_hint_isBottom( bottomHintEdge ) ) - { - if ( ( blues->zone[i].csBottomEdge - csFuzz ) <= - bottomHintEdge->csCoord && - bottomHintEdge->csCoord <= - ( blues->zone[i].csTopEdge + csFuzz ) ) - { - /* bottom edge captured by bottom zone */ - - if ( blues->suppressOvershoot ) - dsNew = blues->zone[i].dsFlatEdge; - - else if ( ( blues->zone[i].csTopEdge - bottomHintEdge->csCoord ) >= - blues->blueShift ) - { - /* guarantee minimum of 1 pixel overshoot */ - dsNew = FT_MIN( - cf2_fixedRound( bottomHintEdge->dsCoord ), - blues->zone[i].dsFlatEdge - cf2_intToFixed( 1 ) ); - } - - else - { - /* simply round captured edge */ - dsNew = cf2_fixedRound( bottomHintEdge->dsCoord ); - } - - dsMove = dsNew - bottomHintEdge->dsCoord; - captured = TRUE; - - break; - } - } - - if ( !blues->zone[i].bottomZone && cf2_hint_isTop( topHintEdge ) ) - { - if ( ( blues->zone[i].csBottomEdge - csFuzz ) <= - topHintEdge->csCoord && - topHintEdge->csCoord <= - ( blues->zone[i].csTopEdge + csFuzz ) ) - { - /* top edge captured by top zone */ - - if ( blues->suppressOvershoot ) - dsNew = blues->zone[i].dsFlatEdge; - - else if ( ( topHintEdge->csCoord - blues->zone[i].csBottomEdge ) >= - blues->blueShift ) - { - /* guarantee minimum of 1 pixel overshoot */ - dsNew = FT_MAX( - cf2_fixedRound( topHintEdge->dsCoord ), - blues->zone[i].dsFlatEdge + cf2_intToFixed( 1 ) ); - } - - else - { - /* simply round captured edge */ - dsNew = cf2_fixedRound( topHintEdge->dsCoord ); - } - - dsMove = dsNew - topHintEdge->dsCoord; - captured = TRUE; - - break; - } - } - } - - if ( captured ) - { - /* move both edges and flag them `locked' */ - if ( cf2_hint_isValid( bottomHintEdge ) ) - { - bottomHintEdge->dsCoord += dsMove; - cf2_hint_lock( bottomHintEdge ); - } - - if ( cf2_hint_isValid( topHintEdge ) ) - { - topHintEdge->dsCoord += dsMove; - cf2_hint_lock( topHintEdge ); - } - } - - return captured; - } - - -/* END */ diff --git a/src/3rdparty/freetype/src/cff/cf2blues.h b/src/3rdparty/freetype/src/cff/cf2blues.h deleted file mode 100644 index 2f38fcad..00000000 --- a/src/3rdparty/freetype/src/cff/cf2blues.h +++ /dev/null @@ -1,185 +0,0 @@ -/***************************************************************************/ -/* */ -/* cf2blues.h */ -/* */ -/* Adobe's code for handling Blue Zones (specification). */ -/* */ -/* Copyright 2009-2013 Adobe Systems Incorporated. */ -/* */ -/* This software, and all works of authorship, whether in source or */ -/* object code form as indicated by the copyright notice(s) included */ -/* herein (collectively, the "Work") is made available, and may only be */ -/* used, modified, and distributed under the FreeType Project License, */ -/* LICENSE.TXT. Additionally, subject to the terms and conditions of the */ -/* FreeType Project License, each contributor to the Work hereby grants */ -/* to any individual or legal entity exercising permissions granted by */ -/* the FreeType Project License and this section (hereafter, "You" or */ -/* "Your") a perpetual, worldwide, non-exclusive, no-charge, */ -/* royalty-free, irrevocable (except as stated in this section) patent */ -/* license to make, have made, use, offer to sell, sell, import, and */ -/* otherwise transfer the Work, where such license applies only to those */ -/* patent claims licensable by such contributor that are necessarily */ -/* infringed by their contribution(s) alone or by combination of their */ -/* contribution(s) with the Work to which such contribution(s) was */ -/* submitted. If You institute patent litigation against any entity */ -/* (including a cross-claim or counterclaim in a lawsuit) alleging that */ -/* the Work or a contribution incorporated within the Work constitutes */ -/* direct or contributory patent infringement, then any patent licenses */ -/* granted to You under this License for that Work shall terminate as of */ -/* the date such litigation is filed. */ -/* */ -/* By using, modifying, or distributing the Work you indicate that you */ -/* have read and understood the terms and conditions of the */ -/* FreeType Project License as well as those provided in this section, */ -/* and you accept them fully. */ -/* */ -/***************************************************************************/ - - - /* - * A `CF2_Blues' object stores the blue zones (horizontal alignment - * zones) of a font. These are specified in the CFF private dictionary - * by `BlueValues', `OtherBlues', `FamilyBlues', and `FamilyOtherBlues'. - * Each zone is defined by a top and bottom edge in character space. - * Further, each zone is either a top zone or a bottom zone, as recorded - * by `bottomZone'. - * - * The maximum number of `BlueValues' and `FamilyBlues' is 7 each. - * However, these are combined to produce a total of 7 zones. - * Similarly, the maximum number of `OtherBlues' and `FamilyOtherBlues' - * is 5 and these are combined to produce an additional 5 zones. - * - * Blue zones are used to `capture' hints and force them to a common - * alignment point. This alignment is recorded in device space in - * `dsFlatEdge'. Except for this value, a `CF2_Blues' object could be - * constructed independently of scaling. Construction may occur once - * the matrix is known. Other features implemented in the Capture - * method are overshoot suppression, overshoot enforcement, and Blue - * Boost. - * - * Capture is determined by `BlueValues' and `OtherBlues', but the - * alignment point may be adjusted to the scaled flat edge of - * `FamilyBlues' or `FamilyOtherBlues'. No alignment is done to the - * curved edge of a zone. - * - */ - - -#ifndef __CF2BLUES_H__ -#define __CF2BLUES_H__ - - -#include "cf2glue.h" - - -FT_BEGIN_HEADER - - - /* - * `CF2_Hint' is shared by `cf2hints.h' and - * `cf2blues.h', but `cf2blues.h' depends on - * `cf2hints.h', so define it here. Note: The typedef is in - * `cf2glue.h'. - * - */ - enum - { - CF2_GhostBottom = 0x1, /* a single bottom edge */ - CF2_GhostTop = 0x2, /* a single top edge */ - CF2_PairBottom = 0x4, /* the bottom edge of a stem hint */ - CF2_PairTop = 0x8, /* the top edge of a stem hint */ - CF2_Locked = 0x10, /* this edge has been aligned */ - /* by a blue zone */ - CF2_Synthetic = 0x20 /* this edge was synthesized */ - }; - - - /* - * Default value for OS/2 typoAscender/Descender when their difference - * is not equal to `unitsPerEm'. The default is based on -250 and 1100 - * in `CF2_Blues', assuming 1000 units per em here. - * - */ - enum - { - CF2_ICF_Top = cf2_intToFixed( 880 ), - CF2_ICF_Bottom = cf2_intToFixed( -120 ) - }; - - - /* - * Constant used for hint adjustment and for synthetic em box hint - * placement. - */ -#define CF2_MIN_COUNTER cf2_floatToFixed( 0.5 ) - - - /* shared typedef is in cf2glue.h */ - struct CF2_HintRec_ - { - CF2_UInt flags; /* attributes of the edge */ - size_t index; /* index in original stem hint array */ - /* (if not synthetic) */ - CF2_Fixed csCoord; - CF2_Fixed dsCoord; - CF2_Fixed scale; - }; - - - typedef struct CF2_BlueRec_ - { - CF2_Fixed csBottomEdge; - CF2_Fixed csTopEdge; - CF2_Fixed csFlatEdge; /* may be from either local or Family zones */ - CF2_Fixed dsFlatEdge; /* top edge of bottom zone or bottom edge */ - /* of top zone (rounded) */ - FT_Bool bottomZone; - - } CF2_BlueRec; - - - /* max total blue zones is 12 */ - enum - { - CF2_MAX_BLUES = 7, - CF2_MAX_OTHERBLUES = 5 - }; - - - typedef struct CF2_BluesRec_ - { - CF2_Fixed scale; - CF2_UInt count; - FT_Bool suppressOvershoot; - FT_Bool doEmBoxHints; - - CF2_Fixed blueScale; - CF2_Fixed blueShift; - CF2_Fixed blueFuzz; - - CF2_Fixed boost; - - CF2_HintRec emBoxTopEdge; - CF2_HintRec emBoxBottomEdge; - - CF2_BlueRec zone[CF2_MAX_BLUES + CF2_MAX_OTHERBLUES]; - - } CF2_BluesRec, *CF2_Blues; - - - FT_LOCAL( void ) - cf2_blues_init( CF2_Blues blues, - CF2_Font font ); - FT_LOCAL( FT_Bool ) - cf2_blues_capture( const CF2_Blues blues, - CF2_Hint bottomHintEdge, - CF2_Hint topHintEdge ); - - -FT_END_HEADER - - -#endif /* __CF2BLUES_H__ */ - - -/* END */ diff --git a/src/3rdparty/freetype/src/cff/cf2error.c b/src/3rdparty/freetype/src/cff/cf2error.c deleted file mode 100644 index b5595a3d..00000000 --- a/src/3rdparty/freetype/src/cff/cf2error.c +++ /dev/null @@ -1,52 +0,0 @@ -/***************************************************************************/ -/* */ -/* cf2error.c */ -/* */ -/* Adobe's code for error handling (body). */ -/* */ -/* Copyright 2006-2013 Adobe Systems Incorporated. */ -/* */ -/* This software, and all works of authorship, whether in source or */ -/* object code form as indicated by the copyright notice(s) included */ -/* herein (collectively, the "Work") is made available, and may only be */ -/* used, modified, and distributed under the FreeType Project License, */ -/* LICENSE.TXT. Additionally, subject to the terms and conditions of the */ -/* FreeType Project License, each contributor to the Work hereby grants */ -/* to any individual or legal entity exercising permissions granted by */ -/* the FreeType Project License and this section (hereafter, "You" or */ -/* "Your") a perpetual, worldwide, non-exclusive, no-charge, */ -/* royalty-free, irrevocable (except as stated in this section) patent */ -/* license to make, have made, use, offer to sell, sell, import, and */ -/* otherwise transfer the Work, where such license applies only to those */ -/* patent claims licensable by such contributor that are necessarily */ -/* infringed by their contribution(s) alone or by combination of their */ -/* contribution(s) with the Work to which such contribution(s) was */ -/* submitted. If You institute patent litigation against any entity */ -/* (including a cross-claim or counterclaim in a lawsuit) alleging that */ -/* the Work or a contribution incorporated within the Work constitutes */ -/* direct or contributory patent infringement, then any patent licenses */ -/* granted to You under this License for that Work shall terminate as of */ -/* the date such litigation is filed. */ -/* */ -/* By using, modifying, or distributing the Work you indicate that you */ -/* have read and understood the terms and conditions of the */ -/* FreeType Project License as well as those provided in this section, */ -/* and you accept them fully. */ -/* */ -/***************************************************************************/ - - -#include "cf2ft.h" -#include "cf2error.h" - - - FT_LOCAL_DEF( void ) - cf2_setError( FT_Error* error, - FT_Error value ) - { - if ( error && *error == 0 ) - *error = value; - } - - -/* END */ diff --git a/src/3rdparty/freetype/src/cff/cf2error.h b/src/3rdparty/freetype/src/cff/cf2error.h deleted file mode 100644 index 6453ebcb..00000000 --- a/src/3rdparty/freetype/src/cff/cf2error.h +++ /dev/null @@ -1,119 +0,0 @@ -/***************************************************************************/ -/* */ -/* cf2error.h */ -/* */ -/* Adobe's code for error handling (specification). */ -/* */ -/* Copyright 2006-2013 Adobe Systems Incorporated. */ -/* */ -/* This software, and all works of authorship, whether in source or */ -/* object code form as indicated by the copyright notice(s) included */ -/* herein (collectively, the "Work") is made available, and may only be */ -/* used, modified, and distributed under the FreeType Project License, */ -/* LICENSE.TXT. Additionally, subject to the terms and conditions of the */ -/* FreeType Project License, each contributor to the Work hereby grants */ -/* to any individual or legal entity exercising permissions granted by */ -/* the FreeType Project License and this section (hereafter, "You" or */ -/* "Your") a perpetual, worldwide, non-exclusive, no-charge, */ -/* royalty-free, irrevocable (except as stated in this section) patent */ -/* license to make, have made, use, offer to sell, sell, import, and */ -/* otherwise transfer the Work, where such license applies only to those */ -/* patent claims licensable by such contributor that are necessarily */ -/* infringed by their contribution(s) alone or by combination of their */ -/* contribution(s) with the Work to which such contribution(s) was */ -/* submitted. If You institute patent litigation against any entity */ -/* (including a cross-claim or counterclaim in a lawsuit) alleging that */ -/* the Work or a contribution incorporated within the Work constitutes */ -/* direct or contributory patent infringement, then any patent licenses */ -/* granted to You under this License for that Work shall terminate as of */ -/* the date such litigation is filed. */ -/* */ -/* By using, modifying, or distributing the Work you indicate that you */ -/* have read and understood the terms and conditions of the */ -/* FreeType Project License as well as those provided in this section, */ -/* and you accept them fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __CF2ERROR_H__ -#define __CF2ERROR_H__ - - -#include FT_MODULE_ERRORS_H - -#undef __FTERRORS_H__ - -#undef FT_ERR_PREFIX -#define FT_ERR_PREFIX CF2_Err_ -#define FT_ERR_BASE FT_Mod_Err_CF2 - - -#include FT_ERRORS_H -#include "cf2ft.h" - - -FT_BEGIN_HEADER - - - /* - * A poor-man error facility. - * - * This code being written in vanilla C, doesn't have the luxury of a - * language-supported exception mechanism such as the one available in - * Java. Instead, we are stuck with using error codes that must be - * carefully managed and preserved. However, it is convenient for us to - * model our error mechanism on a Java-like exception mechanism. - * When we assign an error code we are thus `throwing' an error. - * - * The perservation of an error code is done by coding convention. - * Upon a function call if the error code is anything other than - * `FT_Err_Ok', which is guaranteed to be zero, we - * will return without altering that error. This will allow the - * error to propogate and be handled at the appropriate location in - * the code. - * - * This allows a style of code where the error code is initialized - * up front and a block of calls are made with the error code only - * being checked after the block. If a new error occurs, the original - * error will be preserved and a functional no-op should result in any - * subsequent function that has an initial error code not equal to - * `FT_Err_Ok'. - * - * Errors are encoded by calling the `FT_THROW' macro. For example, - * - * { - * FT_Error e; - * - * - * ... - * e = FT_THROW( Out_Of_Memory ); - * } - * - */ - - - /* Set error code to a particular value. */ - FT_LOCAL( void ) - cf2_setError( FT_Error* error, - FT_Error value ); - - - /* - * A macro that conditionally sets an error code. - * - * This macro will first check whether `error' is set; - * if not, it will set it to `e'. - * - */ -#define CF2_SET_ERROR( error, e ) \ - cf2_setError( error, FT_THROW( e ) ) - - -FT_END_HEADER - - -#endif /* __CF2ERROR_H__ */ - - -/* END */ diff --git a/src/3rdparty/freetype/src/cff/cf2fixed.h b/src/3rdparty/freetype/src/cff/cf2fixed.h deleted file mode 100644 index d6d9faf8..00000000 --- a/src/3rdparty/freetype/src/cff/cf2fixed.h +++ /dev/null @@ -1,95 +0,0 @@ -/***************************************************************************/ -/* */ -/* cf2fixed.h */ -/* */ -/* Adobe's code for Fixed Point Mathematics (specification only). */ -/* */ -/* Copyright 2007-2013 Adobe Systems Incorporated. */ -/* */ -/* This software, and all works of authorship, whether in source or */ -/* object code form as indicated by the copyright notice(s) included */ -/* herein (collectively, the "Work") is made available, and may only be */ -/* used, modified, and distributed under the FreeType Project License, */ -/* LICENSE.TXT. Additionally, subject to the terms and conditions of the */ -/* FreeType Project License, each contributor to the Work hereby grants */ -/* to any individual or legal entity exercising permissions granted by */ -/* the FreeType Project License and this section (hereafter, "You" or */ -/* "Your") a perpetual, worldwide, non-exclusive, no-charge, */ -/* royalty-free, irrevocable (except as stated in this section) patent */ -/* license to make, have made, use, offer to sell, sell, import, and */ -/* otherwise transfer the Work, where such license applies only to those */ -/* patent claims licensable by such contributor that are necessarily */ -/* infringed by their contribution(s) alone or by combination of their */ -/* contribution(s) with the Work to which such contribution(s) was */ -/* submitted. If You institute patent litigation against any entity */ -/* (including a cross-claim or counterclaim in a lawsuit) alleging that */ -/* the Work or a contribution incorporated within the Work constitutes */ -/* direct or contributory patent infringement, then any patent licenses */ -/* granted to You under this License for that Work shall terminate as of */ -/* the date such litigation is filed. */ -/* */ -/* By using, modifying, or distributing the Work you indicate that you */ -/* have read and understood the terms and conditions of the */ -/* FreeType Project License as well as those provided in this section, */ -/* and you accept them fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __CF2FIXED_H__ -#define __CF2FIXED_H__ - - -FT_BEGIN_HEADER - - - /* rasterizer integer and fixed point arithmetic must be 32-bit */ - -#define CF2_Fixed CF2_F16Dot16 - typedef FT_Int32 CF2_Frac; /* 2.30 fixed point */ - - -#define CF2_FIXED_MAX ( (CF2_Fixed)0x7FFFFFFFL ) -#define CF2_FIXED_MIN ( (CF2_Fixed)0x80000000L ) -#define CF2_FIXED_ONE 0x10000L -#define CF2_FIXED_EPSILON 0x0001 - - /* in C 89, left and right shift of negative numbers is */ - /* implementation specific behaviour in the general case */ - -#define cf2_intToFixed( i ) \ - ( (CF2_Fixed)( (FT_UInt32)(i) << 16 ) ) -#define cf2_fixedToInt( x ) \ - ( (FT_Short)( ( (FT_UInt32)(x) + 0x8000U ) >> 16 ) ) -#define cf2_fixedRound( x ) \ - ( (CF2_Fixed)( ( (FT_UInt32)(x) + 0x8000U ) & 0xFFFF0000UL ) ) -#define cf2_floatToFixed( f ) \ - ( (CF2_Fixed)( (f) * 65536.0 + 0.5 ) ) -#define cf2_fixedAbs( x ) \ - ( (x) < 0 ? -(x) : (x) ) -#define cf2_fixedFloor( x ) \ - ( (CF2_Fixed)( (FT_UInt32)(x) & 0xFFFF0000UL ) ) -#define cf2_fixedFraction( x ) \ - ( (x) - cf2_fixedFloor( x ) ) -#define cf2_fracToFixed( x ) \ - ( (x) < 0 ? -( ( -(x) + 0x2000 ) >> 14 ) \ - : ( ( (x) + 0x2000 ) >> 14 ) ) - - - /* signed numeric types */ - typedef enum CF2_NumberType_ - { - CF2_NumberFixed, /* 16.16 */ - CF2_NumberFrac, /* 2.30 */ - CF2_NumberInt /* 32.0 */ - - } CF2_NumberType; - - -FT_END_HEADER - - -#endif /* __CF2FIXED_H__ */ - - -/* END */ diff --git a/src/3rdparty/freetype/src/cff/cf2font.c b/src/3rdparty/freetype/src/cff/cf2font.c deleted file mode 100644 index 83fd348f..00000000 --- a/src/3rdparty/freetype/src/cff/cf2font.c +++ /dev/null @@ -1,512 +0,0 @@ -/***************************************************************************/ -/* */ -/* cf2font.c */ -/* */ -/* Adobe's code for font instances (body). */ -/* */ -/* Copyright 2007-2014 Adobe Systems Incorporated. */ -/* */ -/* This software, and all works of authorship, whether in source or */ -/* object code form as indicated by the copyright notice(s) included */ -/* herein (collectively, the "Work") is made available, and may only be */ -/* used, modified, and distributed under the FreeType Project License, */ -/* LICENSE.TXT. Additionally, subject to the terms and conditions of the */ -/* FreeType Project License, each contributor to the Work hereby grants */ -/* to any individual or legal entity exercising permissions granted by */ -/* the FreeType Project License and this section (hereafter, "You" or */ -/* "Your") a perpetual, worldwide, non-exclusive, no-charge, */ -/* royalty-free, irrevocable (except as stated in this section) patent */ -/* license to make, have made, use, offer to sell, sell, import, and */ -/* otherwise transfer the Work, where such license applies only to those */ -/* patent claims licensable by such contributor that are necessarily */ -/* infringed by their contribution(s) alone or by combination of their */ -/* contribution(s) with the Work to which such contribution(s) was */ -/* submitted. If You institute patent litigation against any entity */ -/* (including a cross-claim or counterclaim in a lawsuit) alleging that */ -/* the Work or a contribution incorporated within the Work constitutes */ -/* direct or contributory patent infringement, then any patent licenses */ -/* granted to You under this License for that Work shall terminate as of */ -/* the date such litigation is filed. */ -/* */ -/* By using, modifying, or distributing the Work you indicate that you */ -/* have read and understood the terms and conditions of the */ -/* FreeType Project License as well as those provided in this section, */ -/* and you accept them fully. */ -/* */ -/***************************************************************************/ - - -#include -#include FT_INTERNAL_CALC_H - -#include "cf2ft.h" - -#include "cf2glue.h" -#include "cf2font.h" -#include "cf2error.h" -#include "cf2intrp.h" - - - /* Compute a stem darkening amount in character space. */ - static void - cf2_computeDarkening( CF2_Fixed emRatio, - CF2_Fixed ppem, - CF2_Fixed stemWidth, - CF2_Fixed* darkenAmount, - CF2_Fixed boldenAmount, - FT_Bool stemDarkened, - FT_Int* darkenParams ) - { - /* - * Total darkening amount is computed in 1000 unit character space - * using the modified 5 part curve as Adobe's Avalon rasterizer. - * The darkening amount is smaller for thicker stems. - * It becomes zero when the stem is thicker than 2.333 pixels. - * - * By default, we use - * - * darkenAmount = 0.4 pixels if scaledStem <= 0.5 pixels, - * darkenAmount = 0.275 pixels if 1 <= scaledStem <= 1.667 pixels, - * darkenAmount = 0 pixel if scaledStem >= 2.333 pixels, - * - * and piecewise linear in-between: - * - * - * darkening - * ^ - * | - * | (x1,y1) - * |--------+ - * | \ - * | \ - * | \ (x3,y3) - * | +----------+ - * | (x2,y2) \ - * | \ - * | \ - * | +----------------- - * | (x4,y4) - * +---------------------------------------------> stem - * thickness - * - * - * This corresponds to the following values for the - * `darkening-parameters' property: - * - * (x1, y1) = (500, 400) - * (x2, y2) = (1000, 275) - * (x3, y3) = (1667, 275) - * (x4, y4) = (2333, 0) - * - */ - - /* Internal calculations are done in units per thousand for */ - /* convenience. The x axis is scaled stem width in */ - /* thousandths of a pixel. That is, 1000 is 1 pixel. */ - /* The y axis is darkening amount in thousandths of a pixel.*/ - /* In the code, below, dividing by ppem and */ - /* adjusting for emRatio converts darkenAmount to character */ - /* space (font units). */ - CF2_Fixed stemWidthPer1000, scaledStem; - FT_Int logBase2; - - - *darkenAmount = 0; - - if ( boldenAmount == 0 && !stemDarkened ) - return; - - /* protect against range problems and divide by zero */ - if ( emRatio < cf2_floatToFixed( .01 ) ) - return; - - if ( stemDarkened ) - { - FT_Int x1 = darkenParams[0]; - FT_Int y1 = darkenParams[1]; - FT_Int x2 = darkenParams[2]; - FT_Int y2 = darkenParams[3]; - FT_Int x3 = darkenParams[4]; - FT_Int y3 = darkenParams[5]; - FT_Int x4 = darkenParams[6]; - FT_Int y4 = darkenParams[7]; - - - /* convert from true character space to 1000 unit character space; */ - /* add synthetic emboldening effect */ - - /* `stemWidthPer1000' will not overflow for a legitimate font */ - - stemWidthPer1000 = FT_MulFix( stemWidth + boldenAmount, emRatio ); - - /* `scaledStem' can easily overflow, so we must clamp its maximum */ - /* value; the test doesn't need to be precise, but must be */ - /* conservative. The clamp value (default 2333) where */ - /* `darkenAmount' is zero is well below the overflow value of */ - /* 32767. */ - /* */ - /* FT_MSB computes the integer part of the base 2 logarithm. The */ - /* number of bits for the product is 1 or 2 more than the sum of */ - /* logarithms; remembering that the 16 lowest bits of the fraction */ - /* are dropped this is correct to within a factor of almost 4. */ - /* For example, 0x80.0000 * 0x80.0000 = 0x4000.0000 is 23+23 and */ - /* is flagged as possible overflow because 0xFF.FFFF * 0xFF.FFFF = */ - /* 0xFFFF.FE00 is also 23+23. */ - - logBase2 = FT_MSB( (FT_UInt32)stemWidthPer1000 ) + - FT_MSB( (FT_UInt32)ppem ); - - if ( logBase2 >= 46 ) - /* possible overflow */ - scaledStem = cf2_intToFixed( x4 ); - else - scaledStem = FT_MulFix( stemWidthPer1000, ppem ); - - /* now apply the darkening parameters */ - - if ( scaledStem < cf2_intToFixed( x1 ) ) - *darkenAmount = FT_DivFix( cf2_intToFixed( y1 ), ppem ); - - else if ( scaledStem < cf2_intToFixed( x2 ) ) - { - FT_Int xdelta = x2 - x1; - FT_Int ydelta = y2 - y1; - FT_Int x = stemWidthPer1000 - - FT_DivFix( cf2_intToFixed( x1 ), ppem ); - - - if ( !xdelta ) - goto Try_x3; - - *darkenAmount = FT_MulDiv( x, ydelta, xdelta ) + - FT_DivFix( cf2_intToFixed( y1 ), ppem ); - } - - else if ( scaledStem < cf2_intToFixed( x3 ) ) - { - Try_x3: - { - FT_Int xdelta = x3 - x2; - FT_Int ydelta = y3 - y2; - FT_Int x = stemWidthPer1000 - - FT_DivFix( cf2_intToFixed( x2 ), ppem ); - - - if ( !xdelta ) - goto Try_x4; - - *darkenAmount = FT_MulDiv( x, ydelta, xdelta ) + - FT_DivFix( cf2_intToFixed( y2 ), ppem ); - } - } - - else if ( scaledStem < cf2_intToFixed( x4 ) ) - { - Try_x4: - { - FT_Int xdelta = x4 - x3; - FT_Int ydelta = y4 - y3; - FT_Int x = stemWidthPer1000 - - FT_DivFix( cf2_intToFixed( x3 ), ppem ); - - - if ( !xdelta ) - goto Use_y4; - - *darkenAmount = FT_MulDiv( x, ydelta, xdelta ) + - FT_DivFix( cf2_intToFixed( y3 ), ppem ); - } - } - - else - { - Use_y4: - *darkenAmount = FT_DivFix( cf2_intToFixed( y4 ), ppem ); - } - - /* use half the amount on each side and convert back to true */ - /* character space */ - *darkenAmount = FT_DivFix( *darkenAmount, 2 * emRatio ); - } - - /* add synthetic emboldening effect in character space */ - *darkenAmount += boldenAmount / 2; - } - - - /* set up values for the current FontDict and matrix */ - - /* caller's transform is adjusted for subpixel positioning */ - static void - cf2_font_setup( CF2_Font font, - const CF2_Matrix* transform ) - { - /* pointer to parsed font object */ - CFF_Decoder* decoder = font->decoder; - - FT_Bool needExtraSetup = FALSE; - - /* character space units */ - CF2_Fixed boldenX = font->syntheticEmboldeningAmountX; - CF2_Fixed boldenY = font->syntheticEmboldeningAmountY; - - CFF_SubFont subFont; - CF2_Fixed ppem; - - - /* clear previous error */ - font->error = FT_Err_Ok; - - /* if a CID fontDict has changed, we need to recompute some cached */ - /* data */ - subFont = cf2_getSubfont( decoder ); - if ( font->lastSubfont != subFont ) - { - font->lastSubfont = subFont; - needExtraSetup = TRUE; - } - - /* if ppem has changed, we need to recompute some cached data */ - /* note: because of CID font matrix concatenation, ppem and transform */ - /* do not necessarily track. */ - ppem = cf2_getPpemY( decoder ); - if ( font->ppem != ppem ) - { - font->ppem = ppem; - needExtraSetup = TRUE; - } - - /* copy hinted flag on each call */ - font->hinted = (FT_Bool)( font->renderingFlags & CF2_FlagsHinted ); - - /* determine if transform has changed; */ - /* include Fontmatrix but ignore translation */ - if ( ft_memcmp( transform, - &font->currentTransform, - 4 * sizeof ( CF2_Fixed ) ) != 0 ) - { - /* save `key' information for `cache of one' matrix data; */ - /* save client transform, without the translation */ - font->currentTransform = *transform; - font->currentTransform.tx = - font->currentTransform.ty = cf2_intToFixed( 0 ); - - /* TODO: FreeType transform is simple scalar; for now, use identity */ - /* for outer */ - font->innerTransform = *transform; - font->outerTransform.a = - font->outerTransform.d = cf2_intToFixed( 1 ); - font->outerTransform.b = - font->outerTransform.c = cf2_intToFixed( 0 ); - - needExtraSetup = TRUE; - } - - /* - * font->darkened is set to true if there is a stem darkening request or - * the font is synthetic emboldened. - * font->darkened controls whether to adjust blue zones, winding order, - * and hinting. - * - */ - if ( font->stemDarkened != ( font->renderingFlags & CF2_FlagsDarkened ) ) - { - font->stemDarkened = - (FT_Bool)( font->renderingFlags & CF2_FlagsDarkened ); - - /* blue zones depend on darkened flag */ - needExtraSetup = TRUE; - } - - /* recompute variables that are dependent on transform or FontDict or */ - /* darken flag */ - if ( needExtraSetup ) - { - /* StdVW is found in the private dictionary; */ - /* recompute darkening amounts whenever private dictionary or */ - /* transform change */ - /* Note: a rendering flag turns darkening on or off, so we want to */ - /* store the `on' amounts; */ - /* darkening amount is computed in character space */ - /* TODO: testing size-dependent darkening here; */ - /* what to do for rotations? */ - - CF2_Fixed emRatio; - CF2_Fixed stdHW; - CF2_Int unitsPerEm = font->unitsPerEm; - - - if ( unitsPerEm == 0 ) - unitsPerEm = 1000; - - ppem = FT_MAX( cf2_intToFixed( 4 ), - font->ppem ); /* use minimum ppem of 4 */ - -#if 0 - /* since vstem is measured in the x-direction, we use the `a' member */ - /* of the fontMatrix */ - emRatio = cf2_fixedFracMul( cf2_intToFixed( 1000 ), fontMatrix->a ); -#endif - - /* Freetype does not preserve the fontMatrix when parsing; use */ - /* unitsPerEm instead. */ - /* TODO: check precision of this */ - emRatio = cf2_intToFixed( 1000 ) / unitsPerEm; - font->stdVW = cf2_getStdVW( decoder ); - - if ( font->stdVW <= 0 ) - font->stdVW = FT_DivFix( cf2_intToFixed( 75 ), emRatio ); - - if ( boldenX > 0 ) - { - /* Ensure that boldenX is at least 1 pixel for synthetic bold font */ - /* (similar to what Avalon does) */ - boldenX = FT_MAX( boldenX, - FT_DivFix( cf2_intToFixed( unitsPerEm ), ppem ) ); - - /* Synthetic emboldening adds at least 1 pixel to darkenX, while */ - /* stem darkening adds at most half pixel. Since the purpose of */ - /* stem darkening (readability at small sizes) is met with */ - /* synthetic emboldening, no need to add stem darkening for a */ - /* synthetic bold font. */ - cf2_computeDarkening( emRatio, - ppem, - font->stdVW, - &font->darkenX, - boldenX, - FALSE, - font->darkenParams ); - } - else - cf2_computeDarkening( emRatio, - ppem, - font->stdVW, - &font->darkenX, - 0, - font->stemDarkened, - font->darkenParams ); - -#if 0 - /* since hstem is measured in the y-direction, we use the `d' member */ - /* of the fontMatrix */ - /* TODO: use the same units per em as above; check this */ - emRatio = cf2_fixedFracMul( cf2_intToFixed( 1000 ), fontMatrix->d ); -#endif - - /* set the default stem width, because it must be the same for all */ - /* family members; */ - /* choose a constant for StdHW that depends on font contrast */ - stdHW = cf2_getStdHW( decoder ); - - if ( stdHW > 0 && font->stdVW > 2 * stdHW ) - font->stdHW = FT_DivFix( cf2_intToFixed( 75 ), emRatio ); - else - { - /* low contrast font gets less hstem darkening */ - font->stdHW = FT_DivFix( cf2_intToFixed( 110 ), emRatio ); - } - - cf2_computeDarkening( emRatio, - ppem, - font->stdHW, - &font->darkenY, - boldenY, - font->stemDarkened, - font->darkenParams ); - - if ( font->darkenX != 0 || font->darkenY != 0 ) - font->darkened = TRUE; - else - font->darkened = FALSE; - - font->reverseWinding = FALSE; /* initial expectation is CCW */ - - /* compute blue zones for this instance */ - cf2_blues_init( &font->blues, font ); - } - } - - - /* equivalent to AdobeGetOutline */ - FT_LOCAL_DEF( FT_Error ) - cf2_getGlyphOutline( CF2_Font font, - CF2_Buffer charstring, - const CF2_Matrix* transform, - CF2_F16Dot16* glyphWidth ) - { - FT_Error lastError = FT_Err_Ok; - - FT_Vector translation; - -#if 0 - FT_Vector advancePoint; -#endif - - CF2_Fixed advWidth = 0; - FT_Bool needWinding; - - - /* Note: use both integer and fraction for outlines. This allows bbox */ - /* to come out directly. */ - - translation.x = transform->tx; - translation.y = transform->ty; - - /* set up values based on transform */ - cf2_font_setup( font, transform ); - if ( font->error ) - goto exit; /* setup encountered an error */ - - /* reset darken direction */ - font->reverseWinding = FALSE; - - /* winding order only affects darkening */ - needWinding = font->darkened; - - while ( 1 ) - { - /* reset output buffer */ - cf2_outline_reset( &font->outline ); - - /* build the outline, passing the full translation */ - cf2_interpT2CharString( font, - charstring, - (CF2_OutlineCallbacks)&font->outline, - &translation, - FALSE, - 0, - 0, - &advWidth ); - - if ( font->error ) - goto exit; - - if ( !needWinding ) - break; - - /* check winding order */ - if ( font->outline.root.windingMomentum >= 0 ) /* CFF is CCW */ - break; - - /* invert darkening and render again */ - /* TODO: this should be a parameter to getOutline-computeOffset */ - font->reverseWinding = TRUE; - - needWinding = FALSE; /* exit after next iteration */ - } - - /* finish storing client outline */ - cf2_outline_close( &font->outline ); - - exit: - /* FreeType just wants the advance width; there is no translation */ - *glyphWidth = advWidth; - - /* free resources and collect errors from objects we've used */ - cf2_setError( &font->error, lastError ); - - return font->error; - } - - -/* END */ diff --git a/src/3rdparty/freetype/src/cff/cf2font.h b/src/3rdparty/freetype/src/cff/cf2font.h deleted file mode 100644 index 86cf02f4..00000000 --- a/src/3rdparty/freetype/src/cff/cf2font.h +++ /dev/null @@ -1,121 +0,0 @@ -/***************************************************************************/ -/* */ -/* cf2font.h */ -/* */ -/* Adobe's code for font instances (specification). */ -/* */ -/* Copyright 2007-2013 Adobe Systems Incorporated. */ -/* */ -/* This software, and all works of authorship, whether in source or */ -/* object code form as indicated by the copyright notice(s) included */ -/* herein (collectively, the "Work") is made available, and may only be */ -/* used, modified, and distributed under the FreeType Project License, */ -/* LICENSE.TXT. Additionally, subject to the terms and conditions of the */ -/* FreeType Project License, each contributor to the Work hereby grants */ -/* to any individual or legal entity exercising permissions granted by */ -/* the FreeType Project License and this section (hereafter, "You" or */ -/* "Your") a perpetual, worldwide, non-exclusive, no-charge, */ -/* royalty-free, irrevocable (except as stated in this section) patent */ -/* license to make, have made, use, offer to sell, sell, import, and */ -/* otherwise transfer the Work, where such license applies only to those */ -/* patent claims licensable by such contributor that are necessarily */ -/* infringed by their contribution(s) alone or by combination of their */ -/* contribution(s) with the Work to which such contribution(s) was */ -/* submitted. If You institute patent litigation against any entity */ -/* (including a cross-claim or counterclaim in a lawsuit) alleging that */ -/* the Work or a contribution incorporated within the Work constitutes */ -/* direct or contributory patent infringement, then any patent licenses */ -/* granted to You under this License for that Work shall terminate as of */ -/* the date such litigation is filed. */ -/* */ -/* By using, modifying, or distributing the Work you indicate that you */ -/* have read and understood the terms and conditions of the */ -/* FreeType Project License as well as those provided in this section, */ -/* and you accept them fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __CF2FONT_H__ -#define __CF2FONT_H__ - - -#include "cf2ft.h" -#include "cf2blues.h" - - -FT_BEGIN_HEADER - - -#define CF2_OPERAND_STACK_SIZE 48 -#define CF2_MAX_SUBR 16 /* maximum subroutine nesting; */ - /* only 10 are allowed but there exist */ - /* fonts like `HiraKakuProN-W3.ttf' */ - /* (Hiragino Kaku Gothic ProN W3; */ - /* 8.2d6e1; 2014-12-19) that exceed */ - /* this limit */ - - - /* typedef is in `cf2glue.h' */ - struct CF2_FontRec_ - { - FT_Memory memory; - FT_Error error; /* shared error for this instance */ - - CF2_RenderingFlags renderingFlags; - - /* variables that depend on Transform: */ - /* the following have zero translation; */ - /* inner * outer = font * original */ - - CF2_Matrix currentTransform; /* original client matrix */ - CF2_Matrix innerTransform; /* for hinting; erect, scaled */ - CF2_Matrix outerTransform; /* post hinting; includes rotations */ - CF2_Fixed ppem; /* transform-dependent */ - - CF2_Int unitsPerEm; - - CF2_Fixed syntheticEmboldeningAmountX; /* character space units */ - CF2_Fixed syntheticEmboldeningAmountY; /* character space units */ - - /* FreeType related members */ - CF2_OutlineRec outline; /* freetype glyph outline functions */ - CFF_Decoder* decoder; - CFF_SubFont lastSubfont; /* FreeType parsed data; */ - /* top font or subfont */ - - /* these flags can vary from one call to the next */ - FT_Bool hinted; - FT_Bool darkened; /* true if stemDarkened or synthetic bold */ - /* i.e. darkenX != 0 || darkenY != 0 */ - FT_Bool stemDarkened; - - FT_Int darkenParams[8]; /* 1000 unit character space */ - - /* variables that depend on both FontDict and Transform */ - CF2_Fixed stdVW; /* in character space; depends on dict entry */ - CF2_Fixed stdHW; /* in character space; depends on dict entry */ - CF2_Fixed darkenX; /* character space units */ - CF2_Fixed darkenY; /* depends on transform */ - /* and private dict (StdVW) */ - FT_Bool reverseWinding; /* darken assuming */ - /* counterclockwise winding */ - - CF2_BluesRec blues; /* computed zone data */ - }; - - - FT_LOCAL( FT_Error ) - cf2_getGlyphOutline( CF2_Font font, - CF2_Buffer charstring, - const CF2_Matrix* transform, - CF2_F16Dot16* glyphWidth ); - - -FT_END_HEADER - - -#endif /* __CF2FONT_H__ */ - - -/* END */ diff --git a/src/3rdparty/freetype/src/cff/cf2ft.c b/src/3rdparty/freetype/src/cff/cf2ft.c deleted file mode 100644 index d2544a23..00000000 --- a/src/3rdparty/freetype/src/cff/cf2ft.c +++ /dev/null @@ -1,700 +0,0 @@ -/***************************************************************************/ -/* */ -/* cf2ft.c */ -/* */ -/* FreeType Glue Component to Adobe's Interpreter (body). */ -/* */ -/* Copyright 2013-2014 Adobe Systems Incorporated. */ -/* */ -/* This software, and all works of authorship, whether in source or */ -/* object code form as indicated by the copyright notice(s) included */ -/* herein (collectively, the "Work") is made available, and may only be */ -/* used, modified, and distributed under the FreeType Project License, */ -/* LICENSE.TXT. Additionally, subject to the terms and conditions of the */ -/* FreeType Project License, each contributor to the Work hereby grants */ -/* to any individual or legal entity exercising permissions granted by */ -/* the FreeType Project License and this section (hereafter, "You" or */ -/* "Your") a perpetual, worldwide, non-exclusive, no-charge, */ -/* royalty-free, irrevocable (except as stated in this section) patent */ -/* license to make, have made, use, offer to sell, sell, import, and */ -/* otherwise transfer the Work, where such license applies only to those */ -/* patent claims licensable by such contributor that are necessarily */ -/* infringed by their contribution(s) alone or by combination of their */ -/* contribution(s) with the Work to which such contribution(s) was */ -/* submitted. If You institute patent litigation against any entity */ -/* (including a cross-claim or counterclaim in a lawsuit) alleging that */ -/* the Work or a contribution incorporated within the Work constitutes */ -/* direct or contributory patent infringement, then any patent licenses */ -/* granted to You under this License for that Work shall terminate as of */ -/* the date such litigation is filed. */ -/* */ -/* By using, modifying, or distributing the Work you indicate that you */ -/* have read and understood the terms and conditions of the */ -/* FreeType Project License as well as those provided in this section, */ -/* and you accept them fully. */ -/* */ -/***************************************************************************/ - - -#include "cf2ft.h" -#include FT_INTERNAL_DEBUG_H - -#include "cf2font.h" -#include "cf2error.h" - - -#define CF2_MAX_SIZE cf2_intToFixed( 2000 ) /* max ppem */ - - - /* - * This check should avoid most internal overflow cases. Clients should - * generally respond to `Glyph_Too_Big' by getting a glyph outline - * at EM size, scaling it and filling it as a graphics operation. - * - */ - static FT_Error - cf2_checkTransform( const CF2_Matrix* transform, - CF2_Int unitsPerEm ) - { - CF2_Fixed maxScale; - - - FT_ASSERT( unitsPerEm > 0 ); - - if ( transform->a <= 0 || transform->d <= 0 ) - return FT_THROW( Invalid_Size_Handle ); - - FT_ASSERT( transform->b == 0 && transform->c == 0 ); - FT_ASSERT( transform->tx == 0 && transform->ty == 0 ); - - if ( unitsPerEm > 0x7FFF ) - return FT_THROW( Glyph_Too_Big ); - - maxScale = FT_DivFix( CF2_MAX_SIZE, cf2_intToFixed( unitsPerEm ) ); - - if ( transform->a > maxScale || transform->d > maxScale ) - return FT_THROW( Glyph_Too_Big ); - - return FT_Err_Ok; - } - - - static void - cf2_setGlyphWidth( CF2_Outline outline, - CF2_Fixed width ) - { - CFF_Decoder* decoder = outline->decoder; - - - FT_ASSERT( decoder ); - - decoder->glyph_width = cf2_fixedToInt( width ); - } - - - /* Clean up font instance. */ - static void - cf2_free_instance( void* ptr ) - { - CF2_Font font = (CF2_Font)ptr; - - - if ( font ) - { - FT_Memory memory = font->memory; - - - (void)memory; - } - } - - - /********************************************/ - /* */ - /* functions for handling client outline; */ - /* FreeType uses coordinates in 26.6 format */ - /* */ - /********************************************/ - - static void - cf2_builder_moveTo( CF2_OutlineCallbacks callbacks, - const CF2_CallbackParams params ) - { - /* downcast the object pointer */ - CF2_Outline outline = (CF2_Outline)callbacks; - CFF_Builder* builder; - - (void)params; /* only used in debug mode */ - - - FT_ASSERT( outline && outline->decoder ); - FT_ASSERT( params->op == CF2_PathOpMoveTo ); - - builder = &outline->decoder->builder; - - /* note: two successive moves simply close the contour twice */ - cff_builder_close_contour( builder ); - builder->path_begun = 0; - } - - - static void - cf2_builder_lineTo( CF2_OutlineCallbacks callbacks, - const CF2_CallbackParams params ) - { - FT_Error error; - - /* downcast the object pointer */ - CF2_Outline outline = (CF2_Outline)callbacks; - CFF_Builder* builder; - - - FT_ASSERT( outline && outline->decoder ); - FT_ASSERT( params->op == CF2_PathOpLineTo ); - - builder = &outline->decoder->builder; - - if ( !builder->path_begun ) - { - /* record the move before the line; also check points and set */ - /* `path_begun' */ - error = cff_builder_start_point( builder, - params->pt0.x, - params->pt0.y ); - if ( error ) - { - if ( !*callbacks->error ) - *callbacks->error = error; - return; - } - } - - /* `cff_builder_add_point1' includes a check_points call for one point */ - error = cff_builder_add_point1( builder, - params->pt1.x, - params->pt1.y ); - if ( error ) - { - if ( !*callbacks->error ) - *callbacks->error = error; - return; - } - } - - - static void - cf2_builder_cubeTo( CF2_OutlineCallbacks callbacks, - const CF2_CallbackParams params ) - { - FT_Error error; - - /* downcast the object pointer */ - CF2_Outline outline = (CF2_Outline)callbacks; - CFF_Builder* builder; - - - FT_ASSERT( outline && outline->decoder ); - FT_ASSERT( params->op == CF2_PathOpCubeTo ); - - builder = &outline->decoder->builder; - - if ( !builder->path_begun ) - { - /* record the move before the line; also check points and set */ - /* `path_begun' */ - error = cff_builder_start_point( builder, - params->pt0.x, - params->pt0.y ); - if ( error ) - { - if ( !*callbacks->error ) - *callbacks->error = error; - return; - } - } - - /* prepare room for 3 points: 2 off-curve, 1 on-curve */ - error = cff_check_points( builder, 3 ); - if ( error ) - { - if ( !*callbacks->error ) - *callbacks->error = error; - return; - } - - cff_builder_add_point( builder, - params->pt1.x, - params->pt1.y, 0 ); - cff_builder_add_point( builder, - params->pt2.x, - params->pt2.y, 0 ); - cff_builder_add_point( builder, - params->pt3.x, - params->pt3.y, 1 ); - } - - - static void - cf2_outline_init( CF2_Outline outline, - FT_Memory memory, - FT_Error* error ) - { - FT_MEM_ZERO( outline, sizeof ( CF2_OutlineRec ) ); - - outline->root.memory = memory; - outline->root.error = error; - - outline->root.moveTo = cf2_builder_moveTo; - outline->root.lineTo = cf2_builder_lineTo; - outline->root.cubeTo = cf2_builder_cubeTo; - } - - - /* get scaling and hint flag from GlyphSlot */ - static void - cf2_getScaleAndHintFlag( CFF_Decoder* decoder, - CF2_Fixed* x_scale, - CF2_Fixed* y_scale, - FT_Bool* hinted, - FT_Bool* scaled ) - { - FT_ASSERT( decoder && decoder->builder.glyph ); - - /* note: FreeType scale includes a factor of 64 */ - *hinted = decoder->builder.glyph->hint; - *scaled = decoder->builder.glyph->scaled; - - if ( *hinted ) - { - *x_scale = ( decoder->builder.glyph->x_scale + 32 ) / 64; - *y_scale = ( decoder->builder.glyph->y_scale + 32 ) / 64; - } - else - { - /* for unhinted outlines, `cff_slot_load' does the scaling, */ - /* thus render at `unity' scale */ - - *x_scale = 0x0400; /* 1/64 as 16.16 */ - *y_scale = 0x0400; - } - } - - - /* get units per em from `FT_Face' */ - /* TODO: should handle font matrix concatenation? */ - static FT_UShort - cf2_getUnitsPerEm( CFF_Decoder* decoder ) - { - FT_ASSERT( decoder && decoder->builder.face ); - FT_ASSERT( decoder->builder.face->root.units_per_EM ); - - return decoder->builder.face->root.units_per_EM; - } - - - /* Main entry point: Render one glyph. */ - FT_LOCAL_DEF( FT_Error ) - cf2_decoder_parse_charstrings( CFF_Decoder* decoder, - FT_Byte* charstring_base, - FT_ULong charstring_len ) - { - FT_Memory memory; - FT_Error error = FT_Err_Ok; - CF2_Font font; - - - FT_ASSERT( decoder && decoder->cff ); - - memory = decoder->builder.memory; - - /* CF2 data is saved here across glyphs */ - font = (CF2_Font)decoder->cff->cf2_instance.data; - - /* on first glyph, allocate instance structure */ - if ( decoder->cff->cf2_instance.data == NULL ) - { - decoder->cff->cf2_instance.finalizer = - (FT_Generic_Finalizer)cf2_free_instance; - - if ( FT_ALLOC( decoder->cff->cf2_instance.data, - sizeof ( CF2_FontRec ) ) ) - return FT_THROW( Out_Of_Memory ); - - font = (CF2_Font)decoder->cff->cf2_instance.data; - - font->memory = memory; - - /* initialize a client outline, to be shared by each glyph rendered */ - cf2_outline_init( &font->outline, font->memory, &font->error ); - } - - /* save decoder; it is a stack variable and will be different on each */ - /* call */ - font->decoder = decoder; - font->outline.decoder = decoder; - - { - /* build parameters for Adobe engine */ - - CFF_Builder* builder = &decoder->builder; - CFF_Driver driver = (CFF_Driver)FT_FACE_DRIVER( builder->face ); - - /* local error */ - FT_Error error2 = FT_Err_Ok; - CF2_BufferRec buf; - CF2_Matrix transform; - CF2_F16Dot16 glyphWidth; - - FT_Bool hinted; - FT_Bool scaled; - - - /* FreeType has already looked up the GID; convert to */ - /* `RegionBuffer', assuming that the input has been validated */ - FT_ASSERT( charstring_base + charstring_len >= charstring_base ); - - FT_ZERO( &buf ); - buf.start = - buf.ptr = charstring_base; - buf.end = charstring_base + charstring_len; - - FT_ZERO( &transform ); - - cf2_getScaleAndHintFlag( decoder, - &transform.a, - &transform.d, - &hinted, - &scaled ); - - font->renderingFlags = 0; - if ( hinted ) - font->renderingFlags |= CF2_FlagsHinted; - if ( scaled && !driver->no_stem_darkening ) - font->renderingFlags |= CF2_FlagsDarkened; - - font->darkenParams[0] = driver->darken_params[0]; - font->darkenParams[1] = driver->darken_params[1]; - font->darkenParams[2] = driver->darken_params[2]; - font->darkenParams[3] = driver->darken_params[3]; - font->darkenParams[4] = driver->darken_params[4]; - font->darkenParams[5] = driver->darken_params[5]; - font->darkenParams[6] = driver->darken_params[6]; - font->darkenParams[7] = driver->darken_params[7]; - - /* now get an outline for this glyph; */ - /* also get units per em to validate scale */ - font->unitsPerEm = (CF2_Int)cf2_getUnitsPerEm( decoder ); - - if ( scaled ) - { - error2 = cf2_checkTransform( &transform, font->unitsPerEm ); - if ( error2 ) - return error2; - } - - error2 = cf2_getGlyphOutline( font, &buf, &transform, &glyphWidth ); - if ( error2 ) - return FT_ERR( Invalid_File_Format ); - - cf2_setGlyphWidth( &font->outline, glyphWidth ); - - return FT_Err_Ok; - } - } - - - /* get pointer to current FreeType subfont (based on current glyphID) */ - FT_LOCAL_DEF( CFF_SubFont ) - cf2_getSubfont( CFF_Decoder* decoder ) - { - FT_ASSERT( decoder && decoder->current_subfont ); - - return decoder->current_subfont; - } - - - /* get `y_ppem' from `CFF_Size' */ - FT_LOCAL_DEF( CF2_Fixed ) - cf2_getPpemY( CFF_Decoder* decoder ) - { - FT_ASSERT( decoder && - decoder->builder.face && - decoder->builder.face->root.size ); - - /* - * Note that `y_ppem' can be zero if there wasn't a call to - * `FT_Set_Char_Size' or something similar. However, this isn't a - * problem since we come to this place in the code only if - * FT_LOAD_NO_SCALE is set (the other case gets caught by - * `cf2_checkTransform'). The ppem value is needed to compute the stem - * darkening, which is disabled for getting the unscaled outline. - * - */ - return cf2_intToFixed( - decoder->builder.face->root.size->metrics.y_ppem ); - } - - - /* get standard stem widths for the current subfont; */ - /* FreeType stores these as integer font units */ - /* (note: variable names seem swapped) */ - FT_LOCAL_DEF( CF2_Fixed ) - cf2_getStdVW( CFF_Decoder* decoder ) - { - FT_ASSERT( decoder && decoder->current_subfont ); - - return cf2_intToFixed( - decoder->current_subfont->private_dict.standard_height ); - } - - - FT_LOCAL_DEF( CF2_Fixed ) - cf2_getStdHW( CFF_Decoder* decoder ) - { - FT_ASSERT( decoder && decoder->current_subfont ); - - return cf2_intToFixed( - decoder->current_subfont->private_dict.standard_width ); - } - - - /* note: FreeType stores 1000 times the actual value for `BlueScale' */ - FT_LOCAL_DEF( void ) - cf2_getBlueMetrics( CFF_Decoder* decoder, - CF2_Fixed* blueScale, - CF2_Fixed* blueShift, - CF2_Fixed* blueFuzz ) - { - FT_ASSERT( decoder && decoder->current_subfont ); - - *blueScale = FT_DivFix( - decoder->current_subfont->private_dict.blue_scale, - cf2_intToFixed( 1000 ) ); - *blueShift = cf2_intToFixed( - decoder->current_subfont->private_dict.blue_shift ); - *blueFuzz = cf2_intToFixed( - decoder->current_subfont->private_dict.blue_fuzz ); - } - - - /* get blue values counts and arrays; the FreeType parser has validated */ - /* the counts and verified that each is an even number */ - FT_LOCAL_DEF( void ) - cf2_getBlueValues( CFF_Decoder* decoder, - size_t* count, - FT_Pos* *data ) - { - FT_ASSERT( decoder && decoder->current_subfont ); - - *count = decoder->current_subfont->private_dict.num_blue_values; - *data = (FT_Pos*) - &decoder->current_subfont->private_dict.blue_values; - } - - - FT_LOCAL_DEF( void ) - cf2_getOtherBlues( CFF_Decoder* decoder, - size_t* count, - FT_Pos* *data ) - { - FT_ASSERT( decoder && decoder->current_subfont ); - - *count = decoder->current_subfont->private_dict.num_other_blues; - *data = (FT_Pos*) - &decoder->current_subfont->private_dict.other_blues; - } - - - FT_LOCAL_DEF( void ) - cf2_getFamilyBlues( CFF_Decoder* decoder, - size_t* count, - FT_Pos* *data ) - { - FT_ASSERT( decoder && decoder->current_subfont ); - - *count = decoder->current_subfont->private_dict.num_family_blues; - *data = (FT_Pos*) - &decoder->current_subfont->private_dict.family_blues; - } - - - FT_LOCAL_DEF( void ) - cf2_getFamilyOtherBlues( CFF_Decoder* decoder, - size_t* count, - FT_Pos* *data ) - { - FT_ASSERT( decoder && decoder->current_subfont ); - - *count = decoder->current_subfont->private_dict.num_family_other_blues; - *data = (FT_Pos*) - &decoder->current_subfont->private_dict.family_other_blues; - } - - - FT_LOCAL_DEF( CF2_Int ) - cf2_getLanguageGroup( CFF_Decoder* decoder ) - { - FT_ASSERT( decoder && decoder->current_subfont ); - - return decoder->current_subfont->private_dict.language_group; - } - - - /* convert unbiased subroutine index to `CF2_Buffer' and */ - /* return 0 on success */ - FT_LOCAL_DEF( CF2_Int ) - cf2_initGlobalRegionBuffer( CFF_Decoder* decoder, - CF2_UInt idx, - CF2_Buffer buf ) - { - FT_ASSERT( decoder ); - - FT_ZERO( buf ); - - idx += (CF2_UInt)decoder->globals_bias; - if ( idx >= decoder->num_globals ) - return TRUE; /* error */ - - FT_ASSERT( decoder->globals ); - - buf->start = - buf->ptr = decoder->globals[idx]; - buf->end = decoder->globals[idx + 1]; - - return FALSE; /* success */ - } - - - /* convert AdobeStandardEncoding code to CF2_Buffer; */ - /* used for seac component */ - FT_LOCAL_DEF( FT_Error ) - cf2_getSeacComponent( CFF_Decoder* decoder, - CF2_Int code, - CF2_Buffer buf ) - { - CF2_Int gid; - FT_Byte* charstring; - FT_ULong len; - FT_Error error; - - - FT_ASSERT( decoder ); - - FT_ZERO( buf ); - -#ifdef FT_CONFIG_OPTION_INCREMENTAL - /* Incremental fonts don't necessarily have valid charsets. */ - /* They use the character code, not the glyph index, in this case. */ - if ( decoder->builder.face->root.internal->incremental_interface ) - gid = code; - else -#endif /* FT_CONFIG_OPTION_INCREMENTAL */ - { - gid = cff_lookup_glyph_by_stdcharcode( decoder->cff, code ); - if ( gid < 0 ) - return FT_THROW( Invalid_Glyph_Format ); - } - - error = cff_get_glyph_data( decoder->builder.face, - (CF2_UInt)gid, - &charstring, - &len ); - /* TODO: for now, just pass the FreeType error through */ - if ( error ) - return error; - - /* assume input has been validated */ - FT_ASSERT( charstring + len >= charstring ); - - buf->start = charstring; - buf->end = charstring + len; - buf->ptr = buf->start; - - return FT_Err_Ok; - } - - - FT_LOCAL_DEF( void ) - cf2_freeSeacComponent( CFF_Decoder* decoder, - CF2_Buffer buf ) - { - FT_ASSERT( decoder ); - - cff_free_glyph_data( decoder->builder.face, - (FT_Byte**)&buf->start, - (FT_ULong)( buf->end - buf->start ) ); - } - - - FT_LOCAL_DEF( CF2_Int ) - cf2_initLocalRegionBuffer( CFF_Decoder* decoder, - CF2_UInt idx, - CF2_Buffer buf ) - { - FT_ASSERT( decoder ); - - FT_ZERO( buf ); - - idx += (CF2_UInt)decoder->locals_bias; - if ( idx >= decoder->num_locals ) - return TRUE; /* error */ - - FT_ASSERT( decoder->locals ); - - buf->start = - buf->ptr = decoder->locals[idx]; - buf->end = decoder->locals[idx + 1]; - - return FALSE; /* success */ - } - - - FT_LOCAL_DEF( CF2_Fixed ) - cf2_getDefaultWidthX( CFF_Decoder* decoder ) - { - FT_ASSERT( decoder && decoder->current_subfont ); - - return cf2_intToFixed( - decoder->current_subfont->private_dict.default_width ); - } - - - FT_LOCAL_DEF( CF2_Fixed ) - cf2_getNominalWidthX( CFF_Decoder* decoder ) - { - FT_ASSERT( decoder && decoder->current_subfont ); - - return cf2_intToFixed( - decoder->current_subfont->private_dict.nominal_width ); - } - - - FT_LOCAL_DEF( void ) - cf2_outline_reset( CF2_Outline outline ) - { - CFF_Decoder* decoder = outline->decoder; - - - FT_ASSERT( decoder ); - - outline->root.windingMomentum = 0; - - FT_GlyphLoader_Rewind( decoder->builder.loader ); - } - - - FT_LOCAL_DEF( void ) - cf2_outline_close( CF2_Outline outline ) - { - CFF_Decoder* decoder = outline->decoder; - - - FT_ASSERT( decoder ); - - cff_builder_close_contour( &decoder->builder ); - - FT_GlyphLoader_Add( decoder->builder.loader ); - } - - -/* END */ diff --git a/src/3rdparty/freetype/src/cff/cf2ft.h b/src/3rdparty/freetype/src/cff/cf2ft.h deleted file mode 100644 index 3073df38..00000000 --- a/src/3rdparty/freetype/src/cff/cf2ft.h +++ /dev/null @@ -1,147 +0,0 @@ -/***************************************************************************/ -/* */ -/* cf2ft.h */ -/* */ -/* FreeType Glue Component to Adobe's Interpreter (specification). */ -/* */ -/* Copyright 2013 Adobe Systems Incorporated. */ -/* */ -/* This software, and all works of authorship, whether in source or */ -/* object code form as indicated by the copyright notice(s) included */ -/* herein (collectively, the "Work") is made available, and may only be */ -/* used, modified, and distributed under the FreeType Project License, */ -/* LICENSE.TXT. Additionally, subject to the terms and conditions of the */ -/* FreeType Project License, each contributor to the Work hereby grants */ -/* to any individual or legal entity exercising permissions granted by */ -/* the FreeType Project License and this section (hereafter, "You" or */ -/* "Your") a perpetual, worldwide, non-exclusive, no-charge, */ -/* royalty-free, irrevocable (except as stated in this section) patent */ -/* license to make, have made, use, offer to sell, sell, import, and */ -/* otherwise transfer the Work, where such license applies only to those */ -/* patent claims licensable by such contributor that are necessarily */ -/* infringed by their contribution(s) alone or by combination of their */ -/* contribution(s) with the Work to which such contribution(s) was */ -/* submitted. If You institute patent litigation against any entity */ -/* (including a cross-claim or counterclaim in a lawsuit) alleging that */ -/* the Work or a contribution incorporated within the Work constitutes */ -/* direct or contributory patent infringement, then any patent licenses */ -/* granted to You under this License for that Work shall terminate as of */ -/* the date such litigation is filed. */ -/* */ -/* By using, modifying, or distributing the Work you indicate that you */ -/* have read and understood the terms and conditions of the */ -/* FreeType Project License as well as those provided in this section, */ -/* and you accept them fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __CF2FT_H__ -#define __CF2FT_H__ - - -#include "cf2types.h" - - - /* TODO: disable asserts for now */ -#define CF2_NDEBUG - - -#include FT_SYSTEM_H - -#include "cf2glue.h" -#include "cffgload.h" /* for CFF_Decoder */ - - -FT_BEGIN_HEADER - - - FT_LOCAL( FT_Error ) - cf2_decoder_parse_charstrings( CFF_Decoder* decoder, - FT_Byte* charstring_base, - FT_ULong charstring_len ); - - FT_LOCAL( CFF_SubFont ) - cf2_getSubfont( CFF_Decoder* decoder ); - - - FT_LOCAL( CF2_Fixed ) - cf2_getPpemY( CFF_Decoder* decoder ); - FT_LOCAL( CF2_Fixed ) - cf2_getStdVW( CFF_Decoder* decoder ); - FT_LOCAL( CF2_Fixed ) - cf2_getStdHW( CFF_Decoder* decoder ); - - FT_LOCAL( void ) - cf2_getBlueMetrics( CFF_Decoder* decoder, - CF2_Fixed* blueScale, - CF2_Fixed* blueShift, - CF2_Fixed* blueFuzz ); - FT_LOCAL( void ) - cf2_getBlueValues( CFF_Decoder* decoder, - size_t* count, - FT_Pos* *data ); - FT_LOCAL( void ) - cf2_getOtherBlues( CFF_Decoder* decoder, - size_t* count, - FT_Pos* *data ); - FT_LOCAL( void ) - cf2_getFamilyBlues( CFF_Decoder* decoder, - size_t* count, - FT_Pos* *data ); - FT_LOCAL( void ) - cf2_getFamilyOtherBlues( CFF_Decoder* decoder, - size_t* count, - FT_Pos* *data ); - - FT_LOCAL( CF2_Int ) - cf2_getLanguageGroup( CFF_Decoder* decoder ); - - FT_LOCAL( CF2_Int ) - cf2_initGlobalRegionBuffer( CFF_Decoder* decoder, - CF2_UInt idx, - CF2_Buffer buf ); - FT_LOCAL( FT_Error ) - cf2_getSeacComponent( CFF_Decoder* decoder, - CF2_Int code, - CF2_Buffer buf ); - FT_LOCAL( void ) - cf2_freeSeacComponent( CFF_Decoder* decoder, - CF2_Buffer buf ); - FT_LOCAL( CF2_Int ) - cf2_initLocalRegionBuffer( CFF_Decoder* decoder, - CF2_UInt idx, - CF2_Buffer buf ); - - FT_LOCAL( CF2_Fixed ) - cf2_getDefaultWidthX( CFF_Decoder* decoder ); - FT_LOCAL( CF2_Fixed ) - cf2_getNominalWidthX( CFF_Decoder* decoder ); - - - /* - * FreeType client outline - * - * process output from the charstring interpreter - */ - typedef struct CF2_OutlineRec_ - { - CF2_OutlineCallbacksRec root; /* base class must be first */ - CFF_Decoder* decoder; - - } CF2_OutlineRec, *CF2_Outline; - - - FT_LOCAL( void ) - cf2_outline_reset( CF2_Outline outline ); - FT_LOCAL( void ) - cf2_outline_close( CF2_Outline outline ); - - -FT_END_HEADER - - -#endif /* __CF2FT_H__ */ - - -/* END */ diff --git a/src/3rdparty/freetype/src/cff/cf2glue.h b/src/3rdparty/freetype/src/cff/cf2glue.h deleted file mode 100644 index a24da39e..00000000 --- a/src/3rdparty/freetype/src/cff/cf2glue.h +++ /dev/null @@ -1,144 +0,0 @@ -/***************************************************************************/ -/* */ -/* cf2glue.h */ -/* */ -/* Adobe's code for shared stuff (specification only). */ -/* */ -/* Copyright 2007-2013 Adobe Systems Incorporated. */ -/* */ -/* This software, and all works of authorship, whether in source or */ -/* object code form as indicated by the copyright notice(s) included */ -/* herein (collectively, the "Work") is made available, and may only be */ -/* used, modified, and distributed under the FreeType Project License, */ -/* LICENSE.TXT. Additionally, subject to the terms and conditions of the */ -/* FreeType Project License, each contributor to the Work hereby grants */ -/* to any individual or legal entity exercising permissions granted by */ -/* the FreeType Project License and this section (hereafter, "You" or */ -/* "Your") a perpetual, worldwide, non-exclusive, no-charge, */ -/* royalty-free, irrevocable (except as stated in this section) patent */ -/* license to make, have made, use, offer to sell, sell, import, and */ -/* otherwise transfer the Work, where such license applies only to those */ -/* patent claims licensable by such contributor that are necessarily */ -/* infringed by their contribution(s) alone or by combination of their */ -/* contribution(s) with the Work to which such contribution(s) was */ -/* submitted. If You institute patent litigation against any entity */ -/* (including a cross-claim or counterclaim in a lawsuit) alleging that */ -/* the Work or a contribution incorporated within the Work constitutes */ -/* direct or contributory patent infringement, then any patent licenses */ -/* granted to You under this License for that Work shall terminate as of */ -/* the date such litigation is filed. */ -/* */ -/* By using, modifying, or distributing the Work you indicate that you */ -/* have read and understood the terms and conditions of the */ -/* FreeType Project License as well as those provided in this section, */ -/* and you accept them fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __CF2GLUE_H__ -#define __CF2GLUE_H__ - - -/* common includes for other modules */ -#include "cf2error.h" -#include "cf2fixed.h" -#include "cf2arrst.h" -#include "cf2read.h" - - -FT_BEGIN_HEADER - - - /* rendering parameters */ - - /* apply hints to rendered glyphs */ -#define CF2_FlagsHinted 1 - /* for testing */ -#define CF2_FlagsDarkened 2 - - /* type for holding the flags */ - typedef CF2_Int CF2_RenderingFlags; - - - /* elements of a glyph outline */ - typedef enum CF2_PathOp_ - { - CF2_PathOpMoveTo = 1, /* change the current point */ - CF2_PathOpLineTo = 2, /* line */ - CF2_PathOpQuadTo = 3, /* quadratic curve */ - CF2_PathOpCubeTo = 4 /* cubic curve */ - - } CF2_PathOp; - - - /* a matrix of fixed point values */ - typedef struct CF2_Matrix_ - { - CF2_F16Dot16 a; - CF2_F16Dot16 b; - CF2_F16Dot16 c; - CF2_F16Dot16 d; - CF2_F16Dot16 tx; - CF2_F16Dot16 ty; - - } CF2_Matrix; - - - /* these typedefs are needed by more than one header file */ - /* and gcc compiler doesn't allow redefinition */ - typedef struct CF2_FontRec_ CF2_FontRec, *CF2_Font; - typedef struct CF2_HintRec_ CF2_HintRec, *CF2_Hint; - - - /* A common structure for all callback parameters. */ - /* */ - /* Some members may be unused. For example, `pt0' is not used for */ - /* `moveTo' and `pt3' is not used for `quadTo'. The initial point `pt0' */ - /* is included for each path element for generality; curve conversions */ - /* need it. The `op' parameter allows one function to handle multiple */ - /* element types. */ - - typedef struct CF2_CallbackParamsRec_ - { - FT_Vector pt0; - FT_Vector pt1; - FT_Vector pt2; - FT_Vector pt3; - - CF2_Int op; - - } CF2_CallbackParamsRec, *CF2_CallbackParams; - - - /* forward reference */ - typedef struct CF2_OutlineCallbacksRec_ CF2_OutlineCallbacksRec, - *CF2_OutlineCallbacks; - - /* callback function pointers */ - typedef void - (*CF2_Callback_Type)( CF2_OutlineCallbacks callbacks, - const CF2_CallbackParams params ); - - - struct CF2_OutlineCallbacksRec_ - { - CF2_Callback_Type moveTo; - CF2_Callback_Type lineTo; - CF2_Callback_Type quadTo; - CF2_Callback_Type cubeTo; - - CF2_Int windingMomentum; /* for winding order detection */ - - FT_Memory memory; - FT_Error* error; - }; - - -FT_END_HEADER - - -#endif /* __CF2GLUE_H__ */ - - -/* END */ diff --git a/src/3rdparty/freetype/src/cff/cf2hints.c b/src/3rdparty/freetype/src/cff/cf2hints.c deleted file mode 100644 index 0e270002..00000000 --- a/src/3rdparty/freetype/src/cff/cf2hints.c +++ /dev/null @@ -1,1847 +0,0 @@ -/***************************************************************************/ -/* */ -/* cf2hints.c */ -/* */ -/* Adobe's code for handling CFF hints (body). */ -/* */ -/* Copyright 2007-2014 Adobe Systems Incorporated. */ -/* */ -/* This software, and all works of authorship, whether in source or */ -/* object code form as indicated by the copyright notice(s) included */ -/* herein (collectively, the "Work") is made available, and may only be */ -/* used, modified, and distributed under the FreeType Project License, */ -/* LICENSE.TXT. Additionally, subject to the terms and conditions of the */ -/* FreeType Project License, each contributor to the Work hereby grants */ -/* to any individual or legal entity exercising permissions granted by */ -/* the FreeType Project License and this section (hereafter, "You" or */ -/* "Your") a perpetual, worldwide, non-exclusive, no-charge, */ -/* royalty-free, irrevocable (except as stated in this section) patent */ -/* license to make, have made, use, offer to sell, sell, import, and */ -/* otherwise transfer the Work, where such license applies only to those */ -/* patent claims licensable by such contributor that are necessarily */ -/* infringed by their contribution(s) alone or by combination of their */ -/* contribution(s) with the Work to which such contribution(s) was */ -/* submitted. If You institute patent litigation against any entity */ -/* (including a cross-claim or counterclaim in a lawsuit) alleging that */ -/* the Work or a contribution incorporated within the Work constitutes */ -/* direct or contributory patent infringement, then any patent licenses */ -/* granted to You under this License for that Work shall terminate as of */ -/* the date such litigation is filed. */ -/* */ -/* By using, modifying, or distributing the Work you indicate that you */ -/* have read and understood the terms and conditions of the */ -/* FreeType Project License as well as those provided in this section, */ -/* and you accept them fully. */ -/* */ -/***************************************************************************/ - - -#include "cf2ft.h" -#include FT_INTERNAL_DEBUG_H - -#include "cf2glue.h" -#include "cf2font.h" -#include "cf2hints.h" -#include "cf2intrp.h" - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_cf2hints - - - typedef struct CF2_HintMoveRec_ - { - size_t j; /* index of upper hint map edge */ - CF2_Fixed moveUp; /* adjustment to optimum position */ - - } CF2_HintMoveRec, *CF2_HintMove; - - - /* Compute angular momentum for winding order detection. It is called */ - /* for all lines and curves, but not necessarily in element order. */ - static CF2_Int - cf2_getWindingMomentum( CF2_Fixed x1, - CF2_Fixed y1, - CF2_Fixed x2, - CF2_Fixed y2 ) - { - /* cross product of pt1 position from origin with pt2 position from */ - /* pt1; we reduce the precision so that the result fits into 32 bits */ - - return ( x1 >> 16 ) * ( ( y2 - y1 ) >> 16 ) - - ( y1 >> 16 ) * ( ( x2 - x1 ) >> 16 ); - } - - - /* - * Construct from a StemHint; this is used as a parameter to - * `cf2_blues_capture'. - * `hintOrigin' is the character space displacement of a seac accent. - * Adjust stem hint for darkening here. - * - */ - static void - cf2_hint_init( CF2_Hint hint, - const CF2_ArrStack stemHintArray, - size_t indexStemHint, - const CF2_Font font, - CF2_Fixed hintOrigin, - CF2_Fixed scale, - FT_Bool bottom ) - { - CF2_Fixed width; - const CF2_StemHintRec* stemHint; - - - FT_ZERO( hint ); - - stemHint = (const CF2_StemHintRec*)cf2_arrstack_getPointer( - stemHintArray, - indexStemHint ); - - width = stemHint->max - stemHint->min; - - if ( width == cf2_intToFixed( -21 ) ) - { - /* ghost bottom */ - - if ( bottom ) - { - hint->csCoord = stemHint->max; - hint->flags = CF2_GhostBottom; - } - else - hint->flags = 0; - } - - else if ( width == cf2_intToFixed( -20 ) ) - { - /* ghost top */ - - if ( bottom ) - hint->flags = 0; - else - { - hint->csCoord = stemHint->min; - hint->flags = CF2_GhostTop; - } - } - - else if ( width < 0 ) - { - /* inverted pair */ - - /* - * Hints with negative widths were produced by an early version of a - * non-Adobe font tool. The Type 2 spec allows edge (ghost) hints - * with negative widths, but says - * - * All other negative widths have undefined meaning. - * - * CoolType has a silent workaround that negates the hint width; for - * permissive mode, we do the same here. - * - * Note: Such fonts cannot use ghost hints, but should otherwise work. - * Note: Some poor hints in our faux fonts can produce negative - * widths at some blends. For example, see a light weight of - * `u' in ASerifMM. - * - */ - if ( bottom ) - { - hint->csCoord = stemHint->max; - hint->flags = CF2_PairBottom; - } - else - { - hint->csCoord = stemHint->min; - hint->flags = CF2_PairTop; - } - } - - else - { - /* normal pair */ - - if ( bottom ) - { - hint->csCoord = stemHint->min; - hint->flags = CF2_PairBottom; - } - else - { - hint->csCoord = stemHint->max; - hint->flags = CF2_PairTop; - } - } - - /* Now that ghost hints have been detected, adjust this edge for */ - /* darkening. Bottoms are not changed; tops are incremented by twice */ - /* `darkenY'. */ - if ( cf2_hint_isTop( hint ) ) - hint->csCoord += 2 * font->darkenY; - - hint->csCoord += hintOrigin; - hint->scale = scale; - hint->index = indexStemHint; /* index in original stem hint array */ - - /* if original stem hint has been used, use the same position */ - if ( hint->flags != 0 && stemHint->used ) - { - if ( cf2_hint_isTop( hint ) ) - hint->dsCoord = stemHint->maxDS; - else - hint->dsCoord = stemHint->minDS; - - cf2_hint_lock( hint ); - } - else - hint->dsCoord = FT_MulFix( hint->csCoord, scale ); - } - - - /* initialize an invalid hint map element */ - static void - cf2_hint_initZero( CF2_Hint hint ) - { - FT_ZERO( hint ); - } - - - FT_LOCAL_DEF( FT_Bool ) - cf2_hint_isValid( const CF2_Hint hint ) - { - return (FT_Bool)( hint->flags != 0 ); - } - - - static FT_Bool - cf2_hint_isPair( const CF2_Hint hint ) - { - return (FT_Bool)( ( hint->flags & - ( CF2_PairBottom | CF2_PairTop ) ) != 0 ); - } - - - static FT_Bool - cf2_hint_isPairTop( const CF2_Hint hint ) - { - return (FT_Bool)( ( hint->flags & CF2_PairTop ) != 0 ); - } - - - FT_LOCAL_DEF( FT_Bool ) - cf2_hint_isTop( const CF2_Hint hint ) - { - return (FT_Bool)( ( hint->flags & - ( CF2_PairTop | CF2_GhostTop ) ) != 0 ); - } - - - FT_LOCAL_DEF( FT_Bool ) - cf2_hint_isBottom( const CF2_Hint hint ) - { - return (FT_Bool)( ( hint->flags & - ( CF2_PairBottom | CF2_GhostBottom ) ) != 0 ); - } - - - static FT_Bool - cf2_hint_isLocked( const CF2_Hint hint ) - { - return (FT_Bool)( ( hint->flags & CF2_Locked ) != 0 ); - } - - - static FT_Bool - cf2_hint_isSynthetic( const CF2_Hint hint ) - { - return (FT_Bool)( ( hint->flags & CF2_Synthetic ) != 0 ); - } - - - FT_LOCAL_DEF( void ) - cf2_hint_lock( CF2_Hint hint ) - { - hint->flags |= CF2_Locked; - } - - - FT_LOCAL_DEF( void ) - cf2_hintmap_init( CF2_HintMap hintmap, - CF2_Font font, - CF2_HintMap initialMap, - CF2_ArrStack hintMoves, - CF2_Fixed scale ) - { - FT_ZERO( hintmap ); - - /* copy parameters from font instance */ - hintmap->hinted = font->hinted; - hintmap->scale = scale; - hintmap->font = font; - hintmap->initialHintMap = initialMap; - /* will clear in `cf2_hintmap_adjustHints' */ - hintmap->hintMoves = hintMoves; - } - - - static FT_Bool - cf2_hintmap_isValid( const CF2_HintMap hintmap ) - { - return hintmap->isValid; - } - - - /* transform character space coordinate to device space using hint map */ - static CF2_Fixed - cf2_hintmap_map( CF2_HintMap hintmap, - CF2_Fixed csCoord ) - { - if ( hintmap->count == 0 || ! hintmap->hinted ) - { - /* there are no hints; use uniform scale and zero offset */ - return FT_MulFix( csCoord, hintmap->scale ); - } - else - { - /* start linear search from last hit */ - CF2_UInt i = hintmap->lastIndex; - - FT_ASSERT( hintmap->lastIndex < CF2_MAX_HINT_EDGES ); - - /* search up */ - while ( i < hintmap->count - 1 && - csCoord >= hintmap->edge[i + 1].csCoord ) - i += 1; - - /* search down */ - while ( i > 0 && csCoord < hintmap->edge[i].csCoord ) - i -= 1; - - hintmap->lastIndex = i; - - if ( i == 0 && csCoord < hintmap->edge[0].csCoord ) - { - /* special case for points below first edge: use uniform scale */ - return FT_MulFix( csCoord - hintmap->edge[0].csCoord, - hintmap->scale ) + - hintmap->edge[0].dsCoord; - } - else - { - /* - * Note: entries with duplicate csCoord are allowed. - * Use edge[i], the highest entry where csCoord >= entry[i].csCoord - */ - return FT_MulFix( csCoord - hintmap->edge[i].csCoord, - hintmap->edge[i].scale ) + - hintmap->edge[i].dsCoord; - } - } - } - - - /* - * This hinting policy moves a hint pair in device space so that one of - * its two edges is on a device pixel boundary (its fractional part is - * zero). `cf2_hintmap_insertHint' guarantees no overlap in CS - * space. Ensure here that there is no overlap in DS. - * - * In the first pass, edges are adjusted relative to adjacent hints. - * Those that are below have already been adjusted. Those that are - * above have not yet been adjusted. If a hint above blocks an - * adjustment to an optimal position, we will try again in a second - * pass. The second pass is top-down. - * - */ - - static void - cf2_hintmap_adjustHints( CF2_HintMap hintmap ) - { - size_t i, j; - - - cf2_arrstack_clear( hintmap->hintMoves ); /* working storage */ - - /* - * First pass is bottom-up (font hint order) without look-ahead. - * Locked edges are already adjusted. - * Unlocked edges begin with dsCoord from `initialHintMap'. - * Save edges that are not optimally adjusted in `hintMoves' array, - * and process them in second pass. - */ - - for ( i = 0; i < hintmap->count; i++ ) - { - FT_Bool isPair = cf2_hint_isPair( &hintmap->edge[i] ); - - - /* index of upper edge (same value for ghost hint) */ - j = isPair ? i + 1 : i; - - FT_ASSERT( j < hintmap->count ); - FT_ASSERT( cf2_hint_isValid( &hintmap->edge[i] ) ); - FT_ASSERT( cf2_hint_isValid( &hintmap->edge[j] ) ); - FT_ASSERT( cf2_hint_isLocked( &hintmap->edge[i] ) == - cf2_hint_isLocked( &hintmap->edge[j] ) ); - - if ( !cf2_hint_isLocked( &hintmap->edge[i] ) ) - { - /* hint edge is not locked, we can adjust it */ - CF2_Fixed fracDown = cf2_fixedFraction( hintmap->edge[i].dsCoord ); - CF2_Fixed fracUp = cf2_fixedFraction( hintmap->edge[j].dsCoord ); - - /* calculate all four possibilities; moves down are negative */ - CF2_Fixed downMoveDown = 0 - fracDown; - CF2_Fixed upMoveDown = 0 - fracUp; - CF2_Fixed downMoveUp = fracDown == 0 - ? 0 - : cf2_intToFixed( 1 ) - fracDown; - CF2_Fixed upMoveUp = fracUp == 0 - ? 0 - : cf2_intToFixed( 1 ) - fracUp; - - /* smallest move up */ - CF2_Fixed moveUp = FT_MIN( downMoveUp, upMoveUp ); - /* smallest move down */ - CF2_Fixed moveDown = FT_MAX( downMoveDown, upMoveDown ); - - /* final amount to move edge or edge pair */ - CF2_Fixed move; - - CF2_Fixed downMinCounter = CF2_MIN_COUNTER; - CF2_Fixed upMinCounter = CF2_MIN_COUNTER; - FT_Bool saveEdge = FALSE; - - - /* minimum counter constraint doesn't apply when adjacent edges */ - /* are synthetic */ - /* TODO: doesn't seem a big effect; for now, reduce the code */ -#if 0 - if ( i == 0 || - cf2_hint_isSynthetic( &hintmap->edge[i - 1] ) ) - downMinCounter = 0; - - if ( j >= hintmap->count - 1 || - cf2_hint_isSynthetic( &hintmap->edge[j + 1] ) ) - upMinCounter = 0; -#endif - - /* is there room to move up? */ - /* there is if we are at top of array or the next edge is at or */ - /* beyond proposed move up? */ - if ( j >= hintmap->count - 1 || - hintmap->edge[j + 1].dsCoord >= - hintmap->edge[j].dsCoord + moveUp + upMinCounter ) - { - /* there is room to move up; is there also room to move down? */ - if ( i == 0 || - hintmap->edge[i - 1].dsCoord <= - hintmap->edge[i].dsCoord + moveDown - downMinCounter ) - { - /* move smaller absolute amount */ - move = ( -moveDown < moveUp ) ? moveDown : moveUp; /* optimum */ - } - else - move = moveUp; - } - else - { - /* is there room to move down? */ - if ( i == 0 || - hintmap->edge[i - 1].dsCoord <= - hintmap->edge[i].dsCoord + moveDown - downMinCounter ) - { - move = moveDown; - /* true if non-optimum move */ - saveEdge = (FT_Bool)( moveUp < -moveDown ); - } - else - { - /* no room to move either way without overlapping or reducing */ - /* the counter too much */ - move = 0; - saveEdge = TRUE; - } - } - - /* Identify non-moves and moves down that aren't optimal, and save */ - /* them for second pass. */ - /* Do this only if there is an unlocked edge above (which could */ - /* possibly move). */ - if ( saveEdge && - j < hintmap->count - 1 && - !cf2_hint_isLocked( &hintmap->edge[j + 1] ) ) - { - CF2_HintMoveRec savedMove; - - - savedMove.j = j; - /* desired adjustment in second pass */ - savedMove.moveUp = moveUp - move; - - cf2_arrstack_push( hintmap->hintMoves, &savedMove ); - } - - /* move the edge(s) */ - hintmap->edge[i].dsCoord += move; - if ( isPair ) - hintmap->edge[j].dsCoord += move; - } - - /* assert there are no overlaps in device space */ - FT_ASSERT( i == 0 || - hintmap->edge[i - 1].dsCoord <= hintmap->edge[i].dsCoord ); - FT_ASSERT( i < j || - hintmap->edge[i].dsCoord <= hintmap->edge[j].dsCoord ); - - /* adjust the scales, avoiding divide by zero */ - if ( i > 0 ) - { - if ( hintmap->edge[i].csCoord != hintmap->edge[i - 1].csCoord ) - hintmap->edge[i - 1].scale = - FT_DivFix( - hintmap->edge[i].dsCoord - hintmap->edge[i - 1].dsCoord, - hintmap->edge[i].csCoord - hintmap->edge[i - 1].csCoord ); - } - - if ( isPair ) - { - if ( hintmap->edge[j].csCoord != hintmap->edge[j - 1].csCoord ) - hintmap->edge[j - 1].scale = - FT_DivFix( - hintmap->edge[j].dsCoord - hintmap->edge[j - 1].dsCoord, - hintmap->edge[j].csCoord - hintmap->edge[j - 1].csCoord ); - - i += 1; /* skip upper edge on next loop */ - } - } - - /* second pass tries to move non-optimal hints up, in case there is */ - /* room now */ - for ( i = cf2_arrstack_size( hintmap->hintMoves ); i > 0; i-- ) - { - CF2_HintMove hintMove = (CF2_HintMove) - cf2_arrstack_getPointer( hintmap->hintMoves, i - 1 ); - - - j = hintMove->j; - - /* this was tested before the push, above */ - FT_ASSERT( j < hintmap->count - 1 ); - - /* is there room to move up? */ - if ( hintmap->edge[j + 1].dsCoord >= - hintmap->edge[j].dsCoord + hintMove->moveUp + CF2_MIN_COUNTER ) - { - /* there is more room now, move edge up */ - hintmap->edge[j].dsCoord += hintMove->moveUp; - - if ( cf2_hint_isPair( &hintmap->edge[j] ) ) - { - FT_ASSERT( j > 0 ); - hintmap->edge[j - 1].dsCoord += hintMove->moveUp; - } - } - } - } - - - /* insert hint edges into map, sorted by csCoord */ - static void - cf2_hintmap_insertHint( CF2_HintMap hintmap, - CF2_Hint bottomHintEdge, - CF2_Hint topHintEdge ) - { - CF2_UInt indexInsert; - - /* set default values, then check for edge hints */ - FT_Bool isPair = TRUE; - CF2_Hint firstHintEdge = bottomHintEdge; - CF2_Hint secondHintEdge = topHintEdge; - - - /* one or none of the input params may be invalid when dealing with */ - /* edge hints; at least one edge must be valid */ - FT_ASSERT( cf2_hint_isValid( bottomHintEdge ) || - cf2_hint_isValid( topHintEdge ) ); - - /* determine how many and which edges to insert */ - if ( !cf2_hint_isValid( bottomHintEdge ) ) - { - /* insert only the top edge */ - firstHintEdge = topHintEdge; - isPair = FALSE; - } - else if ( !cf2_hint_isValid( topHintEdge ) ) - { - /* insert only the bottom edge */ - isPair = FALSE; - } - - /* paired edges must be in proper order */ - FT_ASSERT( !isPair || - topHintEdge->csCoord >= bottomHintEdge->csCoord ); - - /* linear search to find index value of insertion point */ - indexInsert = 0; - for ( ; indexInsert < hintmap->count; indexInsert++ ) - { - if ( hintmap->edge[indexInsert].csCoord >= firstHintEdge->csCoord ) - break; - } - - /* - * Discard any hints that overlap in character space. Most often, this - * is while building the initial map, where captured hints from all - * zones are combined. Define overlap to include hints that `touch' - * (overlap zero). Hiragino Sans/Gothic fonts have numerous hints that - * touch. Some fonts have non-ideographic glyphs that overlap our - * synthetic hints. - * - * Overlap also occurs when darkening stem hints that are close. - * - */ - if ( indexInsert < hintmap->count ) - { - /* we are inserting before an existing edge: */ - /* verify that an existing edge is not the same */ - if ( hintmap->edge[indexInsert].csCoord == firstHintEdge->csCoord ) - return; /* ignore overlapping stem hint */ - - /* verify that a new pair does not straddle the next edge */ - if ( isPair && - hintmap->edge[indexInsert].csCoord <= secondHintEdge->csCoord ) - return; /* ignore overlapping stem hint */ - - /* verify that we are not inserting between paired edges */ - if ( cf2_hint_isPairTop( &hintmap->edge[indexInsert] ) ) - return; /* ignore overlapping stem hint */ - } - - /* recompute device space locations using initial hint map */ - if ( cf2_hintmap_isValid( hintmap->initialHintMap ) && - !cf2_hint_isLocked( firstHintEdge ) ) - { - if ( isPair ) - { - /* Use hint map to position the center of stem, and nominal scale */ - /* to position the two edges. This preserves the stem width. */ - CF2_Fixed midpoint = cf2_hintmap_map( - hintmap->initialHintMap, - ( secondHintEdge->csCoord + - firstHintEdge->csCoord ) / 2 ); - CF2_Fixed halfWidth = FT_MulFix( - ( secondHintEdge->csCoord - - firstHintEdge->csCoord ) / 2, - hintmap->scale ); - - - firstHintEdge->dsCoord = midpoint - halfWidth; - secondHintEdge->dsCoord = midpoint + halfWidth; - } - else - firstHintEdge->dsCoord = cf2_hintmap_map( hintmap->initialHintMap, - firstHintEdge->csCoord ); - } - - /* - * Discard any hints that overlap in device space; this can occur - * because locked hints have been moved to align with blue zones. - * - * TODO: Although we might correct this later during adjustment, we - * don't currently have a way to delete a conflicting hint once it has - * been inserted. See v2.030 MinionPro-Regular, 12 ppem darkened, - * initial hint map for second path, glyph 945 (the perispomeni (tilde) - * in U+1F6E, Greek omega with psili and perispomeni). Darkening is - * 25. Pair 667,747 initially conflicts in design space with top edge - * 660. This is because 667 maps to 7.87, and the top edge was - * captured by a zone at 8.0. The pair is later successfully inserted - * in a zone without the top edge. In this zone it is adjusted to 8.0, - * and no longer conflicts with the top edge in design space. This - * means it can be included in yet a later zone which does have the top - * edge hint. This produces a small mismatch between the first and - * last points of this path, even though the hint masks are the same. - * The density map difference is tiny (1/256). - * - */ - - if ( indexInsert > 0 ) - { - /* we are inserting after an existing edge */ - if ( firstHintEdge->dsCoord < hintmap->edge[indexInsert - 1].dsCoord ) - return; - } - - if ( indexInsert < hintmap->count ) - { - /* we are inserting before an existing edge */ - if ( isPair ) - { - if ( secondHintEdge->dsCoord > hintmap->edge[indexInsert].dsCoord ) - return; - } - else - { - if ( firstHintEdge->dsCoord > hintmap->edge[indexInsert].dsCoord ) - return; - } - } - - /* make room to insert */ - { - CF2_UInt iSrc = hintmap->count - 1; - CF2_UInt iDst = isPair ? hintmap->count + 1 : hintmap->count; - - CF2_UInt count = hintmap->count - indexInsert; - - - if ( iDst >= CF2_MAX_HINT_EDGES ) - { - FT_TRACE4(( "cf2_hintmap_insertHint: too many hintmaps\n" )); - return; - } - - while ( count-- ) - hintmap->edge[iDst--] = hintmap->edge[iSrc--]; - - /* insert first edge */ - hintmap->edge[indexInsert] = *firstHintEdge; /* copy struct */ - hintmap->count += 1; - - if ( isPair ) - { - /* insert second edge */ - hintmap->edge[indexInsert + 1] = *secondHintEdge; /* copy struct */ - hintmap->count += 1; - } - } - - return; - } - - - /* - * Build a map from hints and mask. - * - * This function may recur one level if `hintmap->initialHintMap' is not yet - * valid. - * If `initialMap' is true, simply build initial map. - * - * Synthetic hints are used in two ways. A hint at zero is inserted, if - * needed, in the initial hint map, to prevent translations from - * propagating across the origin. If synthetic em box hints are enabled - * for ideographic dictionaries, then they are inserted in all hint - * maps, including the initial one. - * - */ - FT_LOCAL_DEF( void ) - cf2_hintmap_build( CF2_HintMap hintmap, - CF2_ArrStack hStemHintArray, - CF2_ArrStack vStemHintArray, - CF2_HintMask hintMask, - CF2_Fixed hintOrigin, - FT_Bool initialMap ) - { - FT_Byte* maskPtr; - - CF2_Font font = hintmap->font; - CF2_HintMaskRec tempHintMask; - - size_t bitCount, i; - FT_Byte maskByte; - - - /* check whether initial map is constructed */ - if ( !initialMap && !cf2_hintmap_isValid( hintmap->initialHintMap ) ) - { - /* make recursive call with initialHintMap and temporary mask; */ - /* temporary mask will get all bits set, below */ - cf2_hintmask_init( &tempHintMask, hintMask->error ); - cf2_hintmap_build( hintmap->initialHintMap, - hStemHintArray, - vStemHintArray, - &tempHintMask, - hintOrigin, - TRUE ); - } - - if ( !cf2_hintmask_isValid( hintMask ) ) - { - /* without a hint mask, assume all hints are active */ - cf2_hintmask_setAll( hintMask, - cf2_arrstack_size( hStemHintArray ) + - cf2_arrstack_size( vStemHintArray ) ); - if ( !cf2_hintmask_isValid( hintMask ) ) - return; /* too many stem hints */ - } - - /* begin by clearing the map */ - hintmap->count = 0; - hintmap->lastIndex = 0; - - /* make a copy of the hint mask so we can modify it */ - tempHintMask = *hintMask; - maskPtr = cf2_hintmask_getMaskPtr( &tempHintMask ); - - /* use the hStem hints only, which are first in the mask */ - bitCount = cf2_arrstack_size( hStemHintArray ); - - /* Defense-in-depth. Should never return here. */ - if ( bitCount > hintMask->bitCount ) - return; - - /* synthetic embox hints get highest priority */ - if ( font->blues.doEmBoxHints ) - { - CF2_HintRec dummy; - - - cf2_hint_initZero( &dummy ); /* invalid hint map element */ - - /* ghost bottom */ - cf2_hintmap_insertHint( hintmap, - &font->blues.emBoxBottomEdge, - &dummy ); - /* ghost top */ - cf2_hintmap_insertHint( hintmap, - &dummy, - &font->blues.emBoxTopEdge ); - } - - /* insert hints captured by a blue zone or already locked (higher */ - /* priority) */ - for ( i = 0, maskByte = 0x80; i < bitCount; i++ ) - { - if ( maskByte & *maskPtr ) - { - /* expand StemHint into two `CF2_Hint' elements */ - CF2_HintRec bottomHintEdge, topHintEdge; - - - cf2_hint_init( &bottomHintEdge, - hStemHintArray, - i, - font, - hintOrigin, - hintmap->scale, - TRUE /* bottom */ ); - cf2_hint_init( &topHintEdge, - hStemHintArray, - i, - font, - hintOrigin, - hintmap->scale, - FALSE /* top */ ); - - if ( cf2_hint_isLocked( &bottomHintEdge ) || - cf2_hint_isLocked( &topHintEdge ) || - cf2_blues_capture( &font->blues, - &bottomHintEdge, - &topHintEdge ) ) - { - /* insert captured hint into map */ - cf2_hintmap_insertHint( hintmap, &bottomHintEdge, &topHintEdge ); - - *maskPtr &= ~maskByte; /* turn off the bit for this hint */ - } - } - - if ( ( i & 7 ) == 7 ) - { - /* move to next mask byte */ - maskPtr++; - maskByte = 0x80; - } - else - maskByte >>= 1; - } - - /* initial hint map includes only captured hints plus maybe one at 0 */ - - /* - * TODO: There is a problem here because we are trying to build a - * single hint map containing all captured hints. It is - * possible for there to be conflicts between captured hints, - * either because of darkening or because the hints are in - * separate hint zones (we are ignoring hint zones for the - * initial map). An example of the latter is MinionPro-Regular - * v2.030 glyph 883 (Greek Capital Alpha with Psili) at 15ppem. - * A stem hint for the psili conflicts with the top edge hint - * for the base character. The stem hint gets priority because - * of its sort order. In glyph 884 (Greek Capital Alpha with - * Psili and Oxia), the top of the base character gets a stem - * hint, and the psili does not. This creates different initial - * maps for the two glyphs resulting in different renderings of - * the base character. Will probably defer this either as not - * worth the cost or as a font bug. I don't think there is any - * good reason for an accent to be captured by an alignment - * zone. -darnold 2/12/10 - */ - - if ( initialMap ) - { - /* Apply a heuristic that inserts a point for (0,0), unless it's */ - /* already covered by a mapping. This locks the baseline for glyphs */ - /* that have no baseline hints. */ - - if ( hintmap->count == 0 || - hintmap->edge[0].csCoord > 0 || - hintmap->edge[hintmap->count - 1].csCoord < 0 ) - { - /* all edges are above 0 or all edges are below 0; */ - /* construct a locked edge hint at 0 */ - - CF2_HintRec edge, invalid; - - - cf2_hint_initZero( &edge ); - - edge.flags = CF2_GhostBottom | - CF2_Locked | - CF2_Synthetic; - edge.scale = hintmap->scale; - - cf2_hint_initZero( &invalid ); - cf2_hintmap_insertHint( hintmap, &edge, &invalid ); - } - } - else - { - /* insert remaining hints */ - - maskPtr = cf2_hintmask_getMaskPtr( &tempHintMask ); - - for ( i = 0, maskByte = 0x80; i < bitCount; i++ ) - { - if ( maskByte & *maskPtr ) - { - CF2_HintRec bottomHintEdge, topHintEdge; - - - cf2_hint_init( &bottomHintEdge, - hStemHintArray, - i, - font, - hintOrigin, - hintmap->scale, - TRUE /* bottom */ ); - cf2_hint_init( &topHintEdge, - hStemHintArray, - i, - font, - hintOrigin, - hintmap->scale, - FALSE /* top */ ); - - cf2_hintmap_insertHint( hintmap, &bottomHintEdge, &topHintEdge ); - } - - if ( ( i & 7 ) == 7 ) - { - /* move to next mask byte */ - maskPtr++; - maskByte = 0x80; - } - else - maskByte >>= 1; - } - } - - /* - * Note: The following line is a convenient place to break when - * debugging hinting. Examine `hintmap->edge' for the list of - * enabled hints, then step over the call to see the effect of - * adjustment. We stop here first on the recursive call that - * creates the initial map, and then on each counter group and - * hint zone. - */ - - /* adjust positions of hint edges that are not locked to blue zones */ - cf2_hintmap_adjustHints( hintmap ); - - /* save the position of all hints that were used in this hint map; */ - /* if we use them again, we'll locate them in the same position */ - if ( !initialMap ) - { - for ( i = 0; i < hintmap->count; i++ ) - { - if ( !cf2_hint_isSynthetic( &hintmap->edge[i] ) ) - { - /* Note: include both valid and invalid edges */ - /* Note: top and bottom edges are copied back separately */ - CF2_StemHint stemhint = (CF2_StemHint) - cf2_arrstack_getPointer( hStemHintArray, - hintmap->edge[i].index ); - - - if ( cf2_hint_isTop( &hintmap->edge[i] ) ) - stemhint->maxDS = hintmap->edge[i].dsCoord; - else - stemhint->minDS = hintmap->edge[i].dsCoord; - - stemhint->used = TRUE; - } - } - } - - /* hint map is ready to use */ - hintmap->isValid = TRUE; - - /* remember this mask has been used */ - cf2_hintmask_setNew( hintMask, FALSE ); - } - - - FT_LOCAL_DEF( void ) - cf2_glyphpath_init( CF2_GlyphPath glyphpath, - CF2_Font font, - CF2_OutlineCallbacks callbacks, - CF2_Fixed scaleY, - /* CF2_Fixed hShift, */ - CF2_ArrStack hStemHintArray, - CF2_ArrStack vStemHintArray, - CF2_HintMask hintMask, - CF2_Fixed hintOriginY, - const CF2_Blues blues, - const FT_Vector* fractionalTranslation ) - { - FT_ZERO( glyphpath ); - - glyphpath->font = font; - glyphpath->callbacks = callbacks; - - cf2_arrstack_init( &glyphpath->hintMoves, - font->memory, - &font->error, - sizeof ( CF2_HintMoveRec ) ); - - cf2_hintmap_init( &glyphpath->initialHintMap, - font, - &glyphpath->initialHintMap, - &glyphpath->hintMoves, - scaleY ); - cf2_hintmap_init( &glyphpath->firstHintMap, - font, - &glyphpath->initialHintMap, - &glyphpath->hintMoves, - scaleY ); - cf2_hintmap_init( &glyphpath->hintMap, - font, - &glyphpath->initialHintMap, - &glyphpath->hintMoves, - scaleY ); - - glyphpath->scaleX = font->innerTransform.a; - glyphpath->scaleC = font->innerTransform.c; - glyphpath->scaleY = font->innerTransform.d; - - glyphpath->fractionalTranslation = *fractionalTranslation; - -#if 0 - glyphpath->hShift = hShift; /* for fauxing */ -#endif - - glyphpath->hStemHintArray = hStemHintArray; - glyphpath->vStemHintArray = vStemHintArray; - glyphpath->hintMask = hintMask; /* ptr to current mask */ - glyphpath->hintOriginY = hintOriginY; - glyphpath->blues = blues; - glyphpath->darken = font->darkened; /* TODO: should we make copies? */ - glyphpath->xOffset = font->darkenX; - glyphpath->yOffset = font->darkenY; - glyphpath->miterLimit = 2 * FT_MAX( - cf2_fixedAbs( glyphpath->xOffset ), - cf2_fixedAbs( glyphpath->yOffset ) ); - - /* .1 character space unit */ - glyphpath->snapThreshold = cf2_floatToFixed( 0.1f ); - - glyphpath->moveIsPending = TRUE; - glyphpath->pathIsOpen = FALSE; - glyphpath->pathIsClosing = FALSE; - glyphpath->elemIsQueued = FALSE; - } - - - FT_LOCAL_DEF( void ) - cf2_glyphpath_finalize( CF2_GlyphPath glyphpath ) - { - cf2_arrstack_finalize( &glyphpath->hintMoves ); - } - - - /* - * Hint point in y-direction and apply outerTransform. - * Input `current' hint map (which is actually delayed by one element). - * Input x,y point in Character Space. - * Output x,y point in Device Space, including translation. - */ - static void - cf2_glyphpath_hintPoint( CF2_GlyphPath glyphpath, - CF2_HintMap hintmap, - FT_Vector* ppt, - CF2_Fixed x, - CF2_Fixed y ) - { - FT_Vector pt; /* hinted point in upright DS */ - - - pt.x = FT_MulFix( glyphpath->scaleX, x ) + - FT_MulFix( glyphpath->scaleC, y ); - pt.y = cf2_hintmap_map( hintmap, y ); - - ppt->x = FT_MulFix( glyphpath->font->outerTransform.a, pt.x ) + - FT_MulFix( glyphpath->font->outerTransform.c, pt.y ) + - glyphpath->fractionalTranslation.x; - ppt->y = FT_MulFix( glyphpath->font->outerTransform.b, pt.x ) + - FT_MulFix( glyphpath->font->outerTransform.d, pt.y ) + - glyphpath->fractionalTranslation.y; - } - - - /* - * From two line segments, (u1,u2) and (v1,v2), compute a point of - * intersection on the corresponding lines. - * Return false if no intersection is found, or if the intersection is - * too far away from the ends of the line segments, u2 and v1. - * - */ - static FT_Bool - cf2_glyphpath_computeIntersection( CF2_GlyphPath glyphpath, - const FT_Vector* u1, - const FT_Vector* u2, - const FT_Vector* v1, - const FT_Vector* v2, - FT_Vector* intersection ) - { - /* - * Let `u' be a zero-based vector from the first segment, `v' from the - * second segment. - * Let `w 'be the zero-based vector from `u1' to `v1'. - * `perp' is the `perpendicular dot product'; see - * http://mathworld.wolfram.com/PerpDotProduct.html. - * `s' is the parameter for the parametric line for the first segment - * (`u'). - * - * See notation in - * http://softsurfer.com/Archive/algorithm_0104/algorithm_0104B.htm. - * Calculations are done in 16.16, but must handle the squaring of - * line lengths in character space. We scale all vectors by 1/32 to - * avoid overflow. This allows values up to 4095 to be squared. The - * scale factor cancels in the divide. - * - * TODO: the scale factor could be computed from UnitsPerEm. - * - */ - -#define cf2_perp( a, b ) \ - ( FT_MulFix( a.x, b.y ) - FT_MulFix( a.y, b.x ) ) - - /* round and divide by 32 */ -#define CF2_CS_SCALE( x ) \ - ( ( (x) + 0x10 ) >> 5 ) - - FT_Vector u, v, w; /* scaled vectors */ - CF2_Fixed denominator, s; - - - u.x = CF2_CS_SCALE( u2->x - u1->x ); - u.y = CF2_CS_SCALE( u2->y - u1->y ); - v.x = CF2_CS_SCALE( v2->x - v1->x ); - v.y = CF2_CS_SCALE( v2->y - v1->y ); - w.x = CF2_CS_SCALE( v1->x - u1->x ); - w.y = CF2_CS_SCALE( v1->y - u1->y ); - - denominator = cf2_perp( u, v ); - - if ( denominator == 0 ) - return FALSE; /* parallel or coincident lines */ - - s = FT_DivFix( cf2_perp( w, v ), denominator ); - - intersection->x = u1->x + FT_MulFix( s, u2->x - u1->x ); - intersection->y = u1->y + FT_MulFix( s, u2->y - u1->y ); - - /* - * Special case snapping for horizontal and vertical lines. - * This cleans up intersections and reduces problems with winding - * order detection. - * Sample case is sbc cd KozGoPr6N-Medium.otf 20 16685. - * Note: these calculations are in character space. - * - */ - - if ( u1->x == u2->x && - cf2_fixedAbs( intersection->x - u1->x ) < glyphpath->snapThreshold ) - intersection->x = u1->x; - if ( u1->y == u2->y && - cf2_fixedAbs( intersection->y - u1->y ) < glyphpath->snapThreshold ) - intersection->y = u1->y; - - if ( v1->x == v2->x && - cf2_fixedAbs( intersection->x - v1->x ) < glyphpath->snapThreshold ) - intersection->x = v1->x; - if ( v1->y == v2->y && - cf2_fixedAbs( intersection->y - v1->y ) < glyphpath->snapThreshold ) - intersection->y = v1->y; - - /* limit the intersection distance from midpoint of u2 and v1 */ - if ( cf2_fixedAbs( intersection->x - ( u2->x + v1->x ) / 2 ) > - glyphpath->miterLimit || - cf2_fixedAbs( intersection->y - ( u2->y + v1->y ) / 2 ) > - glyphpath->miterLimit ) - return FALSE; - - return TRUE; - } - - - /* - * Push the cached element (glyphpath->prevElem*) to the outline - * consumer. When a darkening offset is used, the end point of the - * cached element may be adjusted to an intersection point or we may - * synthesize a connecting line to the current element. If we are - * closing a subpath, we may also generate a connecting line to the start - * point. - * - * This is where Character Space (CS) is converted to Device Space (DS) - * using a hint map. This calculation must use a HintMap that was valid - * at the time the element was saved. For the first point in a subpath, - * that is a saved HintMap. For most elements, it just means the caller - * has delayed building a HintMap from the current HintMask. - * - * Transform each point with outerTransform and call the outline - * callbacks. This is a general 3x3 transform: - * - * x' = a*x + c*y + tx, y' = b*x + d*y + ty - * - * but it uses 4 elements from CF2_Font and the translation part - * from CF2_GlyphPath. - * - */ - static void - cf2_glyphpath_pushPrevElem( CF2_GlyphPath glyphpath, - CF2_HintMap hintmap, - FT_Vector* nextP0, - FT_Vector nextP1, - FT_Bool close ) - { - CF2_CallbackParamsRec params; - - FT_Vector* prevP0; - FT_Vector* prevP1; - - FT_Vector intersection = { 0, 0 }; - FT_Bool useIntersection = FALSE; - - - FT_ASSERT( glyphpath->prevElemOp == CF2_PathOpLineTo || - glyphpath->prevElemOp == CF2_PathOpCubeTo ); - - if ( glyphpath->prevElemOp == CF2_PathOpLineTo ) - { - prevP0 = &glyphpath->prevElemP0; - prevP1 = &glyphpath->prevElemP1; - } - else - { - prevP0 = &glyphpath->prevElemP2; - prevP1 = &glyphpath->prevElemP3; - } - - /* optimization: if previous and next elements are offset by the same */ - /* amount, then there will be no gap, and no need to compute an */ - /* intersection. */ - if ( prevP1->x != nextP0->x || prevP1->y != nextP0->y ) - { - /* previous element does not join next element: */ - /* adjust end point of previous element to the intersection */ - useIntersection = cf2_glyphpath_computeIntersection( glyphpath, - prevP0, - prevP1, - nextP0, - &nextP1, - &intersection ); - if ( useIntersection ) - { - /* modify the last point of the cached element (either line or */ - /* curve) */ - *prevP1 = intersection; - } - } - - params.pt0 = glyphpath->currentDS; - - switch( glyphpath->prevElemOp ) - { - case CF2_PathOpLineTo: - params.op = CF2_PathOpLineTo; - - /* note: pt2 and pt3 are unused */ - - if ( close ) - { - /* use first hint map if closing */ - cf2_glyphpath_hintPoint( glyphpath, - &glyphpath->firstHintMap, - ¶ms.pt1, - glyphpath->prevElemP1.x, - glyphpath->prevElemP1.y ); - } - else - { - cf2_glyphpath_hintPoint( glyphpath, - hintmap, - ¶ms.pt1, - glyphpath->prevElemP1.x, - glyphpath->prevElemP1.y ); - } - - /* output only non-zero length lines */ - if ( params.pt0.x != params.pt1.x || params.pt0.y != params.pt1.y ) - { - glyphpath->callbacks->lineTo( glyphpath->callbacks, ¶ms ); - - glyphpath->currentDS = params.pt1; - } - break; - - case CF2_PathOpCubeTo: - params.op = CF2_PathOpCubeTo; - - /* TODO: should we intersect the interior joins (p1-p2 and p2-p3)? */ - cf2_glyphpath_hintPoint( glyphpath, - hintmap, - ¶ms.pt1, - glyphpath->prevElemP1.x, - glyphpath->prevElemP1.y ); - cf2_glyphpath_hintPoint( glyphpath, - hintmap, - ¶ms.pt2, - glyphpath->prevElemP2.x, - glyphpath->prevElemP2.y ); - cf2_glyphpath_hintPoint( glyphpath, - hintmap, - ¶ms.pt3, - glyphpath->prevElemP3.x, - glyphpath->prevElemP3.y ); - - glyphpath->callbacks->cubeTo( glyphpath->callbacks, ¶ms ); - - glyphpath->currentDS = params.pt3; - - break; - } - - if ( !useIntersection || close ) - { - /* insert connecting line between end of previous element and start */ - /* of current one */ - /* note: at the end of a subpath, we might do both, so use `nextP0' */ - /* before we change it, below */ - - if ( close ) - { - /* if we are closing the subpath, then nextP0 is in the first */ - /* hint zone */ - cf2_glyphpath_hintPoint( glyphpath, - &glyphpath->firstHintMap, - ¶ms.pt1, - nextP0->x, - nextP0->y ); - } - else - { - cf2_glyphpath_hintPoint( glyphpath, - hintmap, - ¶ms.pt1, - nextP0->x, - nextP0->y ); - } - - if ( params.pt1.x != glyphpath->currentDS.x || - params.pt1.y != glyphpath->currentDS.y ) - { - /* length is nonzero */ - params.op = CF2_PathOpLineTo; - params.pt0 = glyphpath->currentDS; - - /* note: pt2 and pt3 are unused */ - glyphpath->callbacks->lineTo( glyphpath->callbacks, ¶ms ); - - glyphpath->currentDS = params.pt1; - } - } - - if ( useIntersection ) - { - /* return intersection point to caller */ - *nextP0 = intersection; - } - } - - - /* push a MoveTo element based on current point and offset of current */ - /* element */ - static void - cf2_glyphpath_pushMove( CF2_GlyphPath glyphpath, - FT_Vector start ) - { - CF2_CallbackParamsRec params; - - - params.op = CF2_PathOpMoveTo; - params.pt0 = glyphpath->currentDS; - - /* Test if move has really happened yet; it would have called */ - /* `cf2_hintmap_build' to set `isValid'. */ - if ( !cf2_hintmap_isValid( &glyphpath->hintMap ) ) - { - /* we are here iff first subpath is missing a moveto operator: */ - /* synthesize first moveTo to finish initialization of hintMap */ - cf2_glyphpath_moveTo( glyphpath, - glyphpath->start.x, - glyphpath->start.y ); - } - - cf2_glyphpath_hintPoint( glyphpath, - &glyphpath->hintMap, - ¶ms.pt1, - start.x, - start.y ); - - /* note: pt2 and pt3 are unused */ - glyphpath->callbacks->moveTo( glyphpath->callbacks, ¶ms ); - - glyphpath->currentDS = params.pt1; - glyphpath->offsetStart0 = start; - } - - - /* - * All coordinates are in character space. - * On input, (x1, y1) and (x2, y2) give line segment. - * On output, (x, y) give offset vector. - * We use a piecewise approximation to trig functions. - * - * TODO: Offset true perpendicular and proper length - * supply the y-translation for hinting here, too, - * that adds yOffset unconditionally to *y. - */ - static void - cf2_glyphpath_computeOffset( CF2_GlyphPath glyphpath, - CF2_Fixed x1, - CF2_Fixed y1, - CF2_Fixed x2, - CF2_Fixed y2, - CF2_Fixed* x, - CF2_Fixed* y ) - { - CF2_Fixed dx = x2 - x1; - CF2_Fixed dy = y2 - y1; - - - /* note: negative offsets don't work here; negate deltas to change */ - /* quadrants, below */ - if ( glyphpath->font->reverseWinding ) - { - dx = -dx; - dy = -dy; - } - - *x = *y = 0; - - if ( !glyphpath->darken ) - return; - - /* add momentum for this path element */ - glyphpath->callbacks->windingMomentum += - cf2_getWindingMomentum( x1, y1, x2, y2 ); - - /* note: allow mixed integer and fixed multiplication here */ - if ( dx >= 0 ) - { - if ( dy >= 0 ) - { - /* first quadrant, +x +y */ - - if ( dx > 2 * dy ) - { - /* +x */ - *x = 0; - *y = 0; - } - else if ( dy > 2 * dx ) - { - /* +y */ - *x = glyphpath->xOffset; - *y = glyphpath->yOffset; - } - else - { - /* +x +y */ - *x = FT_MulFix( cf2_floatToFixed( 0.7 ), - glyphpath->xOffset ); - *y = FT_MulFix( cf2_floatToFixed( 1.0 - 0.7 ), - glyphpath->yOffset ); - } - } - else - { - /* fourth quadrant, +x -y */ - - if ( dx > -2 * dy ) - { - /* +x */ - *x = 0; - *y = 0; - } - else if ( -dy > 2 * dx ) - { - /* -y */ - *x = -glyphpath->xOffset; - *y = glyphpath->yOffset; - } - else - { - /* +x -y */ - *x = FT_MulFix( cf2_floatToFixed( -0.7 ), - glyphpath->xOffset ); - *y = FT_MulFix( cf2_floatToFixed( 1.0 - 0.7 ), - glyphpath->yOffset ); - } - } - } - else - { - if ( dy >= 0 ) - { - /* second quadrant, -x +y */ - - if ( -dx > 2 * dy ) - { - /* -x */ - *x = 0; - *y = 2 * glyphpath->yOffset; - } - else if ( dy > -2 * dx ) - { - /* +y */ - *x = glyphpath->xOffset; - *y = glyphpath->yOffset; - } - else - { - /* -x +y */ - *x = FT_MulFix( cf2_floatToFixed( 0.7 ), - glyphpath->xOffset ); - *y = FT_MulFix( cf2_floatToFixed( 1.0 + 0.7 ), - glyphpath->yOffset ); - } - } - else - { - /* third quadrant, -x -y */ - - if ( -dx > -2 * dy ) - { - /* -x */ - *x = 0; - *y = 2 * glyphpath->yOffset; - } - else if ( -dy > -2 * dx ) - { - /* -y */ - *x = -glyphpath->xOffset; - *y = glyphpath->yOffset; - } - else - { - /* -x -y */ - *x = FT_MulFix( cf2_floatToFixed( -0.7 ), - glyphpath->xOffset ); - *y = FT_MulFix( cf2_floatToFixed( 1.0 + 0.7 ), - glyphpath->yOffset ); - } - } - } - } - - - /* - * The functions cf2_glyphpath_{moveTo,lineTo,curveTo,closeOpenPath} are - * called by the interpreter with Character Space (CS) coordinates. Each - * path element is placed into a queue of length one to await the - * calculation of the following element. At that time, the darkening - * offset of the following element is known and joins can be computed, - * including possible modification of this element, before mapping to - * Device Space (DS) and passing it on to the outline consumer. - * - */ - FT_LOCAL_DEF( void ) - cf2_glyphpath_moveTo( CF2_GlyphPath glyphpath, - CF2_Fixed x, - CF2_Fixed y ) - { - cf2_glyphpath_closeOpenPath( glyphpath ); - - /* save the parameters of the move for later, when we'll know how to */ - /* offset it; */ - /* also save last move point */ - glyphpath->currentCS.x = glyphpath->start.x = x; - glyphpath->currentCS.y = glyphpath->start.y = y; - - glyphpath->moveIsPending = TRUE; - - /* ensure we have a valid map with current mask */ - if ( !cf2_hintmap_isValid( &glyphpath->hintMap ) || - cf2_hintmask_isNew( glyphpath->hintMask ) ) - cf2_hintmap_build( &glyphpath->hintMap, - glyphpath->hStemHintArray, - glyphpath->vStemHintArray, - glyphpath->hintMask, - glyphpath->hintOriginY, - FALSE ); - - /* save a copy of current HintMap to use when drawing initial point */ - glyphpath->firstHintMap = glyphpath->hintMap; /* structure copy */ - } - - - FT_LOCAL_DEF( void ) - cf2_glyphpath_lineTo( CF2_GlyphPath glyphpath, - CF2_Fixed x, - CF2_Fixed y ) - { - CF2_Fixed xOffset, yOffset; - FT_Vector P0, P1; - FT_Bool newHintMap; - - /* - * New hints will be applied after cf2_glyphpath_pushPrevElem has run. - * In case this is a synthesized closing line, any new hints should be - * delayed until this path is closed (`cf2_hintmask_isNew' will be - * called again before the next line or curve). - */ - - /* true if new hint map not on close */ - newHintMap = cf2_hintmask_isNew( glyphpath->hintMask ) && - !glyphpath->pathIsClosing; - - /* - * Zero-length lines may occur in the charstring. Because we cannot - * compute darkening offsets or intersections from zero-length lines, - * it is best to remove them and avoid artifacts. However, zero-length - * lines in CS at the start of a new hint map can generate non-zero - * lines in DS due to hint substitution. We detect a change in hint - * map here and pass those zero-length lines along. - */ - - /* - * Note: Find explicitly closed paths here with a conditional - * breakpoint using - * - * !gp->pathIsClosing && gp->start.x == x && gp->start.y == y - * - */ - - if ( glyphpath->currentCS.x == x && - glyphpath->currentCS.y == y && - !newHintMap ) - /* - * Ignore zero-length lines in CS where the hint map is the same - * because the line in DS will also be zero length. - * - * Ignore zero-length lines when we synthesize a closing line because - * the close will be handled in cf2_glyphPath_pushPrevElem. - */ - return; - - cf2_glyphpath_computeOffset( glyphpath, - glyphpath->currentCS.x, - glyphpath->currentCS.y, - x, - y, - &xOffset, - &yOffset ); - - /* construct offset points */ - P0.x = glyphpath->currentCS.x + xOffset; - P0.y = glyphpath->currentCS.y + yOffset; - P1.x = x + xOffset; - P1.y = y + yOffset; - - if ( glyphpath->moveIsPending ) - { - /* emit offset 1st point as MoveTo */ - cf2_glyphpath_pushMove( glyphpath, P0 ); - - glyphpath->moveIsPending = FALSE; /* adjust state machine */ - glyphpath->pathIsOpen = TRUE; - - glyphpath->offsetStart1 = P1; /* record second point */ - } - - if ( glyphpath->elemIsQueued ) - { - FT_ASSERT( cf2_hintmap_isValid( &glyphpath->hintMap ) || - glyphpath->hintMap.count == 0 ); - - cf2_glyphpath_pushPrevElem( glyphpath, - &glyphpath->hintMap, - &P0, - P1, - FALSE ); - } - - /* queue the current element with offset points */ - glyphpath->elemIsQueued = TRUE; - glyphpath->prevElemOp = CF2_PathOpLineTo; - glyphpath->prevElemP0 = P0; - glyphpath->prevElemP1 = P1; - - /* update current map */ - if ( newHintMap ) - cf2_hintmap_build( &glyphpath->hintMap, - glyphpath->hStemHintArray, - glyphpath->vStemHintArray, - glyphpath->hintMask, - glyphpath->hintOriginY, - FALSE ); - - glyphpath->currentCS.x = x; /* pre-offset current point */ - glyphpath->currentCS.y = y; - } - - - FT_LOCAL_DEF( void ) - cf2_glyphpath_curveTo( CF2_GlyphPath glyphpath, - CF2_Fixed x1, - CF2_Fixed y1, - CF2_Fixed x2, - CF2_Fixed y2, - CF2_Fixed x3, - CF2_Fixed y3 ) - { - CF2_Fixed xOffset1, yOffset1, xOffset3, yOffset3; - FT_Vector P0, P1, P2, P3; - - - /* TODO: ignore zero length portions of curve?? */ - cf2_glyphpath_computeOffset( glyphpath, - glyphpath->currentCS.x, - glyphpath->currentCS.y, - x1, - y1, - &xOffset1, - &yOffset1 ); - cf2_glyphpath_computeOffset( glyphpath, - x2, - y2, - x3, - y3, - &xOffset3, - &yOffset3 ); - - /* add momentum from the middle segment */ - glyphpath->callbacks->windingMomentum += - cf2_getWindingMomentum( x1, y1, x2, y2 ); - - /* construct offset points */ - P0.x = glyphpath->currentCS.x + xOffset1; - P0.y = glyphpath->currentCS.y + yOffset1; - P1.x = x1 + xOffset1; - P1.y = y1 + yOffset1; - /* note: preserve angle of final segment by using offset3 at both ends */ - P2.x = x2 + xOffset3; - P2.y = y2 + yOffset3; - P3.x = x3 + xOffset3; - P3.y = y3 + yOffset3; - - if ( glyphpath->moveIsPending ) - { - /* emit offset 1st point as MoveTo */ - cf2_glyphpath_pushMove( glyphpath, P0 ); - - glyphpath->moveIsPending = FALSE; - glyphpath->pathIsOpen = TRUE; - - glyphpath->offsetStart1 = P1; /* record second point */ - } - - if ( glyphpath->elemIsQueued ) - { - FT_ASSERT( cf2_hintmap_isValid( &glyphpath->hintMap ) || - glyphpath->hintMap.count == 0 ); - - cf2_glyphpath_pushPrevElem( glyphpath, - &glyphpath->hintMap, - &P0, - P1, - FALSE ); - } - - /* queue the current element with offset points */ - glyphpath->elemIsQueued = TRUE; - glyphpath->prevElemOp = CF2_PathOpCubeTo; - glyphpath->prevElemP0 = P0; - glyphpath->prevElemP1 = P1; - glyphpath->prevElemP2 = P2; - glyphpath->prevElemP3 = P3; - - /* update current map */ - if ( cf2_hintmask_isNew( glyphpath->hintMask ) ) - cf2_hintmap_build( &glyphpath->hintMap, - glyphpath->hStemHintArray, - glyphpath->vStemHintArray, - glyphpath->hintMask, - glyphpath->hintOriginY, - FALSE ); - - glyphpath->currentCS.x = x3; /* pre-offset current point */ - glyphpath->currentCS.y = y3; - } - - - FT_LOCAL_DEF( void ) - cf2_glyphpath_closeOpenPath( CF2_GlyphPath glyphpath ) - { - if ( glyphpath->pathIsOpen ) - { - /* - * A closing line in Character Space line is always generated below - * with `cf2_glyphPath_lineTo'. It may be ignored later if it turns - * out to be zero length in Device Space. - */ - glyphpath->pathIsClosing = TRUE; - - cf2_glyphpath_lineTo( glyphpath, - glyphpath->start.x, - glyphpath->start.y ); - - /* empty the final element from the queue and close the path */ - if ( glyphpath->elemIsQueued ) - cf2_glyphpath_pushPrevElem( glyphpath, - &glyphpath->hintMap, - &glyphpath->offsetStart0, - glyphpath->offsetStart1, - TRUE ); - - /* reset state machine */ - glyphpath->moveIsPending = TRUE; - glyphpath->pathIsOpen = FALSE; - glyphpath->pathIsClosing = FALSE; - glyphpath->elemIsQueued = FALSE; - } - } - - -/* END */ diff --git a/src/3rdparty/freetype/src/cff/cf2hints.h b/src/3rdparty/freetype/src/cff/cf2hints.h deleted file mode 100644 index f25d91bf..00000000 --- a/src/3rdparty/freetype/src/cff/cf2hints.h +++ /dev/null @@ -1,289 +0,0 @@ -/***************************************************************************/ -/* */ -/* cf2hints.h */ -/* */ -/* Adobe's code for handling CFF hints (body). */ -/* */ -/* Copyright 2007-2013 Adobe Systems Incorporated. */ -/* */ -/* This software, and all works of authorship, whether in source or */ -/* object code form as indicated by the copyright notice(s) included */ -/* herein (collectively, the "Work") is made available, and may only be */ -/* used, modified, and distributed under the FreeType Project License, */ -/* LICENSE.TXT. Additionally, subject to the terms and conditions of the */ -/* FreeType Project License, each contributor to the Work hereby grants */ -/* to any individual or legal entity exercising permissions granted by */ -/* the FreeType Project License and this section (hereafter, "You" or */ -/* "Your") a perpetual, worldwide, non-exclusive, no-charge, */ -/* royalty-free, irrevocable (except as stated in this section) patent */ -/* license to make, have made, use, offer to sell, sell, import, and */ -/* otherwise transfer the Work, where such license applies only to those */ -/* patent claims licensable by such contributor that are necessarily */ -/* infringed by their contribution(s) alone or by combination of their */ -/* contribution(s) with the Work to which such contribution(s) was */ -/* submitted. If You institute patent litigation against any entity */ -/* (including a cross-claim or counterclaim in a lawsuit) alleging that */ -/* the Work or a contribution incorporated within the Work constitutes */ -/* direct or contributory patent infringement, then any patent licenses */ -/* granted to You under this License for that Work shall terminate as of */ -/* the date such litigation is filed. */ -/* */ -/* By using, modifying, or distributing the Work you indicate that you */ -/* have read and understood the terms and conditions of the */ -/* FreeType Project License as well as those provided in this section, */ -/* and you accept them fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __CF2HINTS_H__ -#define __CF2HINTS_H__ - - -FT_BEGIN_HEADER - - - enum - { - CF2_MAX_HINTS = 96 /* maximum # of hints */ - }; - - - /* - * A HintMask object stores a bit mask that specifies which hints in the - * charstring are active at a given time. Hints in CFF must be declared - * at the start, before any drawing operators, with horizontal hints - * preceding vertical hints. The HintMask is ordered the same way, with - * horizontal hints immediately followed by vertical hints. Clients are - * responsible for knowing how many of each type are present. - * - * The maximum total number of hints is 96, as specified by the CFF - * specification. - * - * A HintMask is built 0 or more times while interpreting a charstring, by - * the HintMask operator. There is only one HintMask, but it is built or - * rebuilt each time there is a hint substitution (HintMask operator) in - * the charstring. A default HintMask with all bits set is built if there - * has been no HintMask operator prior to the first drawing operator. - * - */ - - typedef struct CF2_HintMaskRec_ - { - FT_Error* error; - - FT_Bool isValid; - FT_Bool isNew; - - size_t bitCount; - size_t byteCount; - - FT_Byte mask[( CF2_MAX_HINTS + 7 ) / 8]; - - } CF2_HintMaskRec, *CF2_HintMask; - - - typedef struct CF2_StemHintRec_ - { - FT_Bool used; /* DS positions are valid */ - - CF2_Fixed min; /* original character space value */ - CF2_Fixed max; - - CF2_Fixed minDS; /* DS position after first use */ - CF2_Fixed maxDS; - - } CF2_StemHintRec, *CF2_StemHint; - - - /* - * A HintMap object stores a piecewise linear function for mapping - * y-coordinates from character space to device space, providing - * appropriate pixel alignment to stem edges. - * - * The map is implemented as an array of `CF2_Hint' elements, each - * representing an edge. When edges are paired, as from stem hints, the - * bottom edge must immediately precede the top edge in the array. - * Element character space AND device space positions must both increase - * monotonically in the array. `CF2_Hint' elements are also used as - * parameters to `cf2_blues_capture'. - * - * The `cf2_hintmap_build' method must be called before any drawing - * operation (beginning with a Move operator) and at each hint - * substitution (HintMask operator). - * - * The `cf2_hintmap_map' method is called to transform y-coordinates at - * each drawing operation (move, line, curve). - * - */ - - /* TODO: make this a CF2_ArrStack and add a deep copy method */ - enum - { - CF2_MAX_HINT_EDGES = CF2_MAX_HINTS * 2 - }; - - - typedef struct CF2_HintMapRec_ - { - CF2_Font font; - - /* initial map based on blue zones */ - struct CF2_HintMapRec_* initialHintMap; - - /* working storage for 2nd pass adjustHints */ - CF2_ArrStack hintMoves; - - FT_Bool isValid; - FT_Bool hinted; - - CF2_Fixed scale; - CF2_UInt count; - - /* start search from this index */ - CF2_UInt lastIndex; - - CF2_HintRec edge[CF2_MAX_HINT_EDGES]; /* 192 */ - - } CF2_HintMapRec, *CF2_HintMap; - - - FT_LOCAL( FT_Bool ) - cf2_hint_isValid( const CF2_Hint hint ); - FT_LOCAL( FT_Bool ) - cf2_hint_isTop( const CF2_Hint hint ); - FT_LOCAL( FT_Bool ) - cf2_hint_isBottom( const CF2_Hint hint ); - FT_LOCAL( void ) - cf2_hint_lock( CF2_Hint hint ); - - - FT_LOCAL( void ) - cf2_hintmap_init( CF2_HintMap hintmap, - CF2_Font font, - CF2_HintMap initialMap, - CF2_ArrStack hintMoves, - CF2_Fixed scale ); - FT_LOCAL( void ) - cf2_hintmap_build( CF2_HintMap hintmap, - CF2_ArrStack hStemHintArray, - CF2_ArrStack vStemHintArray, - CF2_HintMask hintMask, - CF2_Fixed hintOrigin, - FT_Bool initialMap ); - - - /* - * GlyphPath is a wrapper for drawing operations that scales the - * coordinates according to the render matrix and HintMap. It also tracks - * open paths to control ClosePath and to insert MoveTo for broken fonts. - * - */ - typedef struct CF2_GlyphPathRec_ - { - /* TODO: gather some of these into a hinting context */ - - CF2_Font font; /* font instance */ - CF2_OutlineCallbacks callbacks; /* outline consumer */ - - - CF2_HintMapRec hintMap; /* current hint map */ - CF2_HintMapRec firstHintMap; /* saved copy */ - CF2_HintMapRec initialHintMap; /* based on all captured hints */ - - CF2_ArrStackRec hintMoves; /* list of hint moves for 2nd pass */ - - CF2_Fixed scaleX; /* matrix a */ - CF2_Fixed scaleC; /* matrix c */ - CF2_Fixed scaleY; /* matrix d */ - - FT_Vector fractionalTranslation; /* including deviceXScale */ -#if 0 - CF2_Fixed hShift; /* character space horizontal shift */ - /* (for fauxing) */ -#endif - - FT_Bool pathIsOpen; /* true after MoveTo */ - FT_Bool pathIsClosing; /* true when synthesizing closepath line */ - FT_Bool darken; /* true if stem darkening */ - FT_Bool moveIsPending; /* true between MoveTo and offset MoveTo */ - - /* references used to call `cf2_hintmap_build', if necessary */ - CF2_ArrStack hStemHintArray; - CF2_ArrStack vStemHintArray; - CF2_HintMask hintMask; /* ptr to the current mask */ - CF2_Fixed hintOriginY; /* copy of current origin */ - const CF2_BluesRec* blues; - - CF2_Fixed xOffset; /* character space offsets */ - CF2_Fixed yOffset; - - /* character space miter limit threshold */ - CF2_Fixed miterLimit; - /* vertical/horzizontal snap distance in character space */ - CF2_Fixed snapThreshold; - - FT_Vector offsetStart0; /* first and second points of first */ - FT_Vector offsetStart1; /* element with offset applied */ - - /* current point, character space, before offset */ - FT_Vector currentCS; - /* current point, device space */ - FT_Vector currentDS; - /* start point of subpath, character space */ - FT_Vector start; - - /* the following members constitute the `queue' of one element */ - FT_Bool elemIsQueued; - CF2_Int prevElemOp; - - FT_Vector prevElemP0; - FT_Vector prevElemP1; - FT_Vector prevElemP2; - FT_Vector prevElemP3; - - } CF2_GlyphPathRec, *CF2_GlyphPath; - - - FT_LOCAL( void ) - cf2_glyphpath_init( CF2_GlyphPath glyphpath, - CF2_Font font, - CF2_OutlineCallbacks callbacks, - CF2_Fixed scaleY, - /* CF2_Fixed hShift, */ - CF2_ArrStack hStemHintArray, - CF2_ArrStack vStemHintArray, - CF2_HintMask hintMask, - CF2_Fixed hintOrigin, - const CF2_Blues blues, - const FT_Vector* fractionalTranslation ); - FT_LOCAL( void ) - cf2_glyphpath_finalize( CF2_GlyphPath glyphpath ); - - FT_LOCAL( void ) - cf2_glyphpath_moveTo( CF2_GlyphPath glyphpath, - CF2_Fixed x, - CF2_Fixed y ); - FT_LOCAL( void ) - cf2_glyphpath_lineTo( CF2_GlyphPath glyphpath, - CF2_Fixed x, - CF2_Fixed y ); - FT_LOCAL( void ) - cf2_glyphpath_curveTo( CF2_GlyphPath glyphpath, - CF2_Fixed x1, - CF2_Fixed y1, - CF2_Fixed x2, - CF2_Fixed y2, - CF2_Fixed x3, - CF2_Fixed y3 ); - FT_LOCAL( void ) - cf2_glyphpath_closeOpenPath( CF2_GlyphPath glyphpath ); - - -FT_END_HEADER - - -#endif /* __CF2HINTS_H__ */ - - -/* END */ diff --git a/src/3rdparty/freetype/src/cff/cf2intrp.c b/src/3rdparty/freetype/src/cff/cf2intrp.c deleted file mode 100644 index ff3fa9aa..00000000 --- a/src/3rdparty/freetype/src/cff/cf2intrp.c +++ /dev/null @@ -1,1571 +0,0 @@ -/***************************************************************************/ -/* */ -/* cf2intrp.c */ -/* */ -/* Adobe's CFF Interpreter (body). */ -/* */ -/* Copyright 2007-2014 Adobe Systems Incorporated. */ -/* */ -/* This software, and all works of authorship, whether in source or */ -/* object code form as indicated by the copyright notice(s) included */ -/* herein (collectively, the "Work") is made available, and may only be */ -/* used, modified, and distributed under the FreeType Project License, */ -/* LICENSE.TXT. Additionally, subject to the terms and conditions of the */ -/* FreeType Project License, each contributor to the Work hereby grants */ -/* to any individual or legal entity exercising permissions granted by */ -/* the FreeType Project License and this section (hereafter, "You" or */ -/* "Your") a perpetual, worldwide, non-exclusive, no-charge, */ -/* royalty-free, irrevocable (except as stated in this section) patent */ -/* license to make, have made, use, offer to sell, sell, import, and */ -/* otherwise transfer the Work, where such license applies only to those */ -/* patent claims licensable by such contributor that are necessarily */ -/* infringed by their contribution(s) alone or by combination of their */ -/* contribution(s) with the Work to which such contribution(s) was */ -/* submitted. If You institute patent litigation against any entity */ -/* (including a cross-claim or counterclaim in a lawsuit) alleging that */ -/* the Work or a contribution incorporated within the Work constitutes */ -/* direct or contributory patent infringement, then any patent licenses */ -/* granted to You under this License for that Work shall terminate as of */ -/* the date such litigation is filed. */ -/* */ -/* By using, modifying, or distributing the Work you indicate that you */ -/* have read and understood the terms and conditions of the */ -/* FreeType Project License as well as those provided in this section, */ -/* and you accept them fully. */ -/* */ -/***************************************************************************/ - - -#include "cf2ft.h" -#include FT_INTERNAL_DEBUG_H - -#include "cf2glue.h" -#include "cf2font.h" -#include "cf2stack.h" -#include "cf2hints.h" -#include "cf2intrp.h" - -#include "cf2error.h" - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_cf2interp - - - /* some operators are not implemented yet */ -#define CF2_FIXME FT_TRACE4(( "cf2_interpT2CharString:" \ - " operator not implemented yet\n" )) - - - - FT_LOCAL_DEF( void ) - cf2_hintmask_init( CF2_HintMask hintmask, - FT_Error* error ) - { - FT_ZERO( hintmask ); - - hintmask->error = error; - } - - - FT_LOCAL_DEF( FT_Bool ) - cf2_hintmask_isValid( const CF2_HintMask hintmask ) - { - return hintmask->isValid; - } - - - FT_LOCAL_DEF( FT_Bool ) - cf2_hintmask_isNew( const CF2_HintMask hintmask ) - { - return hintmask->isNew; - } - - - FT_LOCAL_DEF( void ) - cf2_hintmask_setNew( CF2_HintMask hintmask, - FT_Bool val ) - { - hintmask->isNew = val; - } - - - /* clients call `getMaskPtr' in order to iterate */ - /* through hint mask */ - - FT_LOCAL_DEF( FT_Byte* ) - cf2_hintmask_getMaskPtr( CF2_HintMask hintmask ) - { - return hintmask->mask; - } - - - static size_t - cf2_hintmask_setCounts( CF2_HintMask hintmask, - size_t bitCount ) - { - if ( bitCount > CF2_MAX_HINTS ) - { - /* total of h and v stems must be <= 96 */ - CF2_SET_ERROR( hintmask->error, Invalid_Glyph_Format ); - return 0; - } - - hintmask->bitCount = bitCount; - hintmask->byteCount = ( hintmask->bitCount + 7 ) / 8; - - hintmask->isValid = TRUE; - hintmask->isNew = TRUE; - - return bitCount; - } - - - /* consume the hintmask bytes from the charstring, advancing the src */ - /* pointer */ - static void - cf2_hintmask_read( CF2_HintMask hintmask, - CF2_Buffer charstring, - size_t bitCount ) - { - size_t i; - -#ifndef CF2_NDEBUG - /* these are the bits in the final mask byte that should be zero */ - /* Note: this variable is only used in an assert expression below */ - /* and then only if CF2_NDEBUG is not defined */ - CF2_UInt mask = ( 1 << ( -(CF2_Int)bitCount & 7 ) ) - 1; -#endif - - - /* initialize counts and isValid */ - if ( cf2_hintmask_setCounts( hintmask, bitCount ) == 0 ) - return; - - FT_ASSERT( hintmask->byteCount > 0 ); - - FT_TRACE4(( " (maskbytes:" )); - - /* set mask and advance interpreter's charstring pointer */ - for ( i = 0; i < hintmask->byteCount; i++ ) - { - hintmask->mask[i] = (FT_Byte)cf2_buf_readByte( charstring ); - FT_TRACE4(( " 0x%02X", hintmask->mask[i] )); - } - - FT_TRACE4(( ")\n" )); - - /* assert any unused bits in last byte are zero unless there's a prior */ - /* error */ - /* bitCount -> mask, 0 -> 0, 1 -> 7f, 2 -> 3f, ... 6 -> 3, 7 -> 1 */ -#ifndef CF2_NDEBUG - FT_ASSERT( ( hintmask->mask[hintmask->byteCount - 1] & mask ) == 0 || - *hintmask->error ); -#endif - } - - - FT_LOCAL_DEF( void ) - cf2_hintmask_setAll( CF2_HintMask hintmask, - size_t bitCount ) - { - size_t i; - CF2_UInt mask = ( 1 << ( -(CF2_Int)bitCount & 7 ) ) - 1; - - - /* initialize counts and isValid */ - if ( cf2_hintmask_setCounts( hintmask, bitCount ) == 0 ) - return; - - FT_ASSERT( hintmask->byteCount > 0 ); - FT_ASSERT( hintmask->byteCount < - sizeof ( hintmask->mask ) / sizeof ( hintmask->mask[0] ) ); - - /* set mask to all ones */ - for ( i = 0; i < hintmask->byteCount; i++ ) - hintmask->mask[i] = 0xFF; - - /* clear unused bits */ - /* bitCount -> mask, 0 -> 0, 1 -> 7f, 2 -> 3f, ... 6 -> 3, 7 -> 1 */ - hintmask->mask[hintmask->byteCount - 1] &= ~mask; - } - - - /* Type2 charstring opcodes */ - enum - { - cf2_cmdRESERVED_0, /* 0 */ - cf2_cmdHSTEM, /* 1 */ - cf2_cmdRESERVED_2, /* 2 */ - cf2_cmdVSTEM, /* 3 */ - cf2_cmdVMOVETO, /* 4 */ - cf2_cmdRLINETO, /* 5 */ - cf2_cmdHLINETO, /* 6 */ - cf2_cmdVLINETO, /* 7 */ - cf2_cmdRRCURVETO, /* 8 */ - cf2_cmdRESERVED_9, /* 9 */ - cf2_cmdCALLSUBR, /* 10 */ - cf2_cmdRETURN, /* 11 */ - cf2_cmdESC, /* 12 */ - cf2_cmdRESERVED_13, /* 13 */ - cf2_cmdENDCHAR, /* 14 */ - cf2_cmdRESERVED_15, /* 15 */ - cf2_cmdRESERVED_16, /* 16 */ - cf2_cmdRESERVED_17, /* 17 */ - cf2_cmdHSTEMHM, /* 18 */ - cf2_cmdHINTMASK, /* 19 */ - cf2_cmdCNTRMASK, /* 20 */ - cf2_cmdRMOVETO, /* 21 */ - cf2_cmdHMOVETO, /* 22 */ - cf2_cmdVSTEMHM, /* 23 */ - cf2_cmdRCURVELINE, /* 24 */ - cf2_cmdRLINECURVE, /* 25 */ - cf2_cmdVVCURVETO, /* 26 */ - cf2_cmdHHCURVETO, /* 27 */ - cf2_cmdEXTENDEDNMBR, /* 28 */ - cf2_cmdCALLGSUBR, /* 29 */ - cf2_cmdVHCURVETO, /* 30 */ - cf2_cmdHVCURVETO /* 31 */ - }; - - enum - { - cf2_escDOTSECTION, /* 0 */ - cf2_escRESERVED_1, /* 1 */ - cf2_escRESERVED_2, /* 2 */ - cf2_escAND, /* 3 */ - cf2_escOR, /* 4 */ - cf2_escNOT, /* 5 */ - cf2_escRESERVED_6, /* 6 */ - cf2_escRESERVED_7, /* 7 */ - cf2_escRESERVED_8, /* 8 */ - cf2_escABS, /* 9 */ - cf2_escADD, /* 10 like otherADD */ - cf2_escSUB, /* 11 like otherSUB */ - cf2_escDIV, /* 12 */ - cf2_escRESERVED_13, /* 13 */ - cf2_escNEG, /* 14 */ - cf2_escEQ, /* 15 */ - cf2_escRESERVED_16, /* 16 */ - cf2_escRESERVED_17, /* 17 */ - cf2_escDROP, /* 18 */ - cf2_escRESERVED_19, /* 19 */ - cf2_escPUT, /* 20 like otherPUT */ - cf2_escGET, /* 21 like otherGET */ - cf2_escIFELSE, /* 22 like otherIFELSE */ - cf2_escRANDOM, /* 23 like otherRANDOM */ - cf2_escMUL, /* 24 like otherMUL */ - cf2_escRESERVED_25, /* 25 */ - cf2_escSQRT, /* 26 */ - cf2_escDUP, /* 27 like otherDUP */ - cf2_escEXCH, /* 28 like otherEXCH */ - cf2_escINDEX, /* 29 */ - cf2_escROLL, /* 30 */ - cf2_escRESERVED_31, /* 31 */ - cf2_escRESERVED_32, /* 32 */ - cf2_escRESERVED_33, /* 33 */ - cf2_escHFLEX, /* 34 */ - cf2_escFLEX, /* 35 */ - cf2_escHFLEX1, /* 36 */ - cf2_escFLEX1 /* 37 */ - }; - - - /* `stemHintArray' does not change once we start drawing the outline. */ - static void - cf2_doStems( const CF2_Font font, - CF2_Stack opStack, - CF2_ArrStack stemHintArray, - CF2_Fixed* width, - FT_Bool* haveWidth, - CF2_Fixed hintOffset ) - { - CF2_UInt i; - CF2_UInt count = cf2_stack_count( opStack ); - FT_Bool hasWidthArg = (FT_Bool)( count & 1 ); - - /* variable accumulates delta values from operand stack */ - CF2_Fixed position = hintOffset; - - if ( hasWidthArg && ! *haveWidth ) - *width = cf2_stack_getReal( opStack, 0 ) + - cf2_getNominalWidthX( font->decoder ); - - if ( font->decoder->width_only ) - goto exit; - - for ( i = hasWidthArg ? 1 : 0; i < count; i += 2 ) - { - /* construct a CF2_StemHint and push it onto the list */ - CF2_StemHintRec stemhint; - - - stemhint.min = - position += cf2_stack_getReal( opStack, i ); - stemhint.max = - position += cf2_stack_getReal( opStack, i + 1 ); - - stemhint.used = FALSE; - stemhint.maxDS = - stemhint.minDS = 0; - - cf2_arrstack_push( stemHintArray, &stemhint ); /* defer error check */ - } - - cf2_stack_clear( opStack ); - - exit: - /* cf2_doStems must define a width (may be default) */ - *haveWidth = TRUE; - } - - - static void - cf2_doFlex( CF2_Stack opStack, - CF2_Fixed* curX, - CF2_Fixed* curY, - CF2_GlyphPath glyphPath, - const FT_Bool* readFromStack, - FT_Bool doConditionalLastRead ) - { - CF2_Fixed vals[14]; - CF2_UInt index; - FT_Bool isHFlex; - CF2_Int top, i, j; - - - vals[0] = *curX; - vals[1] = *curY; - index = 0; - isHFlex = readFromStack[9] == FALSE; - top = isHFlex ? 9 : 10; - - for ( i = 0; i < top; i++ ) - { - vals[i + 2] = vals[i]; - if ( readFromStack[i] ) - vals[i + 2] += cf2_stack_getReal( opStack, index++ ); - } - - if ( isHFlex ) - vals[9 + 2] = *curY; - - if ( doConditionalLastRead ) - { - FT_Bool lastIsX = (FT_Bool)( cf2_fixedAbs( vals[10] - *curX ) > - cf2_fixedAbs( vals[11] - *curY ) ); - CF2_Fixed lastVal = cf2_stack_getReal( opStack, index ); - - - if ( lastIsX ) - { - vals[12] = vals[10] + lastVal; - vals[13] = *curY; - } - else - { - vals[12] = *curX; - vals[13] = vals[11] + lastVal; - } - } - else - { - if ( readFromStack[10] ) - vals[12] = vals[10] + cf2_stack_getReal( opStack, index++ ); - else - vals[12] = *curX; - - if ( readFromStack[11] ) - vals[13] = vals[11] + cf2_stack_getReal( opStack, index ); - else - vals[13] = *curY; - } - - for ( j = 0; j < 2; j++ ) - cf2_glyphpath_curveTo( glyphPath, vals[j * 6 + 2], - vals[j * 6 + 3], - vals[j * 6 + 4], - vals[j * 6 + 5], - vals[j * 6 + 6], - vals[j * 6 + 7] ); - - cf2_stack_clear( opStack ); - - *curX = vals[12]; - *curY = vals[13]; - } - - - /* - * `error' is a shared error code used by many objects in this - * routine. Before the code continues from an error, it must check and - * record the error in `*error'. The idea is that this shared - * error code will record the first error encountered. If testing - * for an error anyway, the cost of `goto exit' is small, so we do it, - * even if continuing would be safe. In this case, `lastError' is - * set, so the testing and storing can be done in one place, at `exit'. - * - * Continuing after an error is intended for objects which do their own - * testing of `*error', e.g., array stack functions. This allows us to - * avoid an extra test after the call. - * - * Unimplemented opcodes are ignored. - * - */ - FT_LOCAL_DEF( void ) - cf2_interpT2CharString( CF2_Font font, - CF2_Buffer buf, - CF2_OutlineCallbacks callbacks, - const FT_Vector* translation, - FT_Bool doingSeac, - CF2_Fixed curX, - CF2_Fixed curY, - CF2_Fixed* width ) - { - /* lastError is used for errors that are immediately tested */ - FT_Error lastError = FT_Err_Ok; - - /* pointer to parsed font object */ - CFF_Decoder* decoder = font->decoder; - - FT_Error* error = &font->error; - FT_Memory memory = font->memory; - - CF2_Fixed scaleY = font->innerTransform.d; - CF2_Fixed nominalWidthX = cf2_getNominalWidthX( decoder ); - - /* save this for hinting seac accents */ - CF2_Fixed hintOriginY = curY; - - CF2_Stack opStack = NULL; - FT_Byte op1; /* first opcode byte */ - - /* instruction limit; 20,000,000 matches Avalon */ - FT_UInt32 instructionLimit = 20000000UL; - - CF2_ArrStackRec subrStack; - - FT_Bool haveWidth; - CF2_Buffer charstring = NULL; - - CF2_Int charstringIndex = -1; /* initialize to empty */ - - /* TODO: placeholders for hint structures */ - - /* objects used for hinting */ - CF2_ArrStackRec hStemHintArray; - CF2_ArrStackRec vStemHintArray; - - CF2_HintMaskRec hintMask; - CF2_GlyphPathRec glyphPath; - - - /* initialize the remaining objects */ - cf2_arrstack_init( &subrStack, - memory, - error, - sizeof ( CF2_BufferRec ) ); - cf2_arrstack_init( &hStemHintArray, - memory, - error, - sizeof ( CF2_StemHintRec ) ); - cf2_arrstack_init( &vStemHintArray, - memory, - error, - sizeof ( CF2_StemHintRec ) ); - - /* initialize CF2_StemHint arrays */ - cf2_hintmask_init( &hintMask, error ); - - /* initialize path map to manage drawing operations */ - - /* Note: last 4 params are used to handle `MoveToPermissive', which */ - /* may need to call `hintMap.Build' */ - /* TODO: MoveToPermissive is gone; are these still needed? */ - cf2_glyphpath_init( &glyphPath, - font, - callbacks, - scaleY, - /* hShift, */ - &hStemHintArray, - &vStemHintArray, - &hintMask, - hintOriginY, - &font->blues, - translation ); - - /* - * Initialize state for width parsing. From the CFF Spec: - * - * The first stack-clearing operator, which must be one of hstem, - * hstemhm, vstem, vstemhm, cntrmask, hintmask, hmoveto, vmoveto, - * rmoveto, or endchar, takes an additional argument - the width (as - * described earlier), which may be expressed as zero or one numeric - * argument. - * - * What we implement here uses the first validly specified width, but - * does not detect errors for specifying more than one width. - * - * If one of the above operators occurs without explicitly specifying - * a width, we assume the default width. - * - */ - haveWidth = FALSE; - *width = cf2_getDefaultWidthX( decoder ); - - /* - * Note: at this point, all pointers to resources must be NULL - * and all local objects must be initialized. - * There must be no branches to exit: above this point. - * - */ - - /* allocate an operand stack */ - opStack = cf2_stack_init( memory, error ); - if ( !opStack ) - { - lastError = FT_THROW( Out_Of_Memory ); - goto exit; - } - - /* initialize subroutine stack by placing top level charstring as */ - /* first element (max depth plus one for the charstring) */ - /* Note: Caller owns and must finalize the first charstring. */ - /* Our copy of it does not change that requirement. */ - cf2_arrstack_setCount( &subrStack, CF2_MAX_SUBR + 1 ); - - charstring = (CF2_Buffer)cf2_arrstack_getBuffer( &subrStack ); - *charstring = *buf; /* structure copy */ - - charstringIndex = 0; /* entry is valid now */ - - /* catch errors so far */ - if ( *error ) - goto exit; - - /* main interpreter loop */ - while ( 1 ) - { - if ( cf2_buf_isEnd( charstring ) ) - { - /* If we've reached the end of the charstring, simulate a */ - /* cf2_cmdRETURN or cf2_cmdENDCHAR. */ - if ( charstringIndex ) - op1 = cf2_cmdRETURN; /* end of buffer for subroutine */ - else - op1 = cf2_cmdENDCHAR; /* end of buffer for top level charstring */ - } - else - op1 = (FT_Byte)cf2_buf_readByte( charstring ); - - /* check for errors once per loop */ - if ( *error ) - goto exit; - - instructionLimit--; - if ( instructionLimit == 0 ) - { - lastError = FT_THROW( Invalid_Glyph_Format ); - goto exit; - } - - switch( op1 ) - { - case cf2_cmdRESERVED_0: - case cf2_cmdRESERVED_2: - case cf2_cmdRESERVED_9: - case cf2_cmdRESERVED_13: - case cf2_cmdRESERVED_15: - case cf2_cmdRESERVED_16: - case cf2_cmdRESERVED_17: - /* we may get here if we have a prior error */ - FT_TRACE4(( " unknown op (%d)\n", op1 )); - break; - - case cf2_cmdHSTEMHM: - case cf2_cmdHSTEM: - FT_TRACE4(( op1 == cf2_cmdHSTEMHM ? " hstemhm\n" : " hstem\n" )); - - /* never add hints after the mask is computed */ - if ( cf2_hintmask_isValid( &hintMask ) ) - { - FT_TRACE4(( "cf2_interpT2CharString:" - " invalid horizontal hint mask\n" )); - break; - } - - cf2_doStems( font, - opStack, - &hStemHintArray, - width, - &haveWidth, - 0 ); - - if ( font->decoder->width_only ) - goto exit; - - break; - - case cf2_cmdVSTEMHM: - case cf2_cmdVSTEM: - FT_TRACE4(( op1 == cf2_cmdVSTEMHM ? " vstemhm\n" : " vstem\n" )); - - /* never add hints after the mask is computed */ - if ( cf2_hintmask_isValid( &hintMask ) ) - { - FT_TRACE4(( "cf2_interpT2CharString:" - " invalid vertical hint mask\n" )); - break; - } - - cf2_doStems( font, - opStack, - &vStemHintArray, - width, - &haveWidth, - 0 ); - - if ( font->decoder->width_only ) - goto exit; - - break; - - case cf2_cmdVMOVETO: - FT_TRACE4(( " vmoveto\n" )); - - if ( cf2_stack_count( opStack ) > 1 && !haveWidth ) - *width = cf2_stack_getReal( opStack, 0 ) + nominalWidthX; - - /* width is defined or default after this */ - haveWidth = TRUE; - - if ( font->decoder->width_only ) - goto exit; - - curY += cf2_stack_popFixed( opStack ); - - cf2_glyphpath_moveTo( &glyphPath, curX, curY ); - - break; - - case cf2_cmdRLINETO: - { - CF2_UInt index; - CF2_UInt count = cf2_stack_count( opStack ); - - - FT_TRACE4(( " rlineto\n" )); - - for ( index = 0; index < count; index += 2 ) - { - curX += cf2_stack_getReal( opStack, index + 0 ); - curY += cf2_stack_getReal( opStack, index + 1 ); - - cf2_glyphpath_lineTo( &glyphPath, curX, curY ); - } - - cf2_stack_clear( opStack ); - } - continue; /* no need to clear stack again */ - - case cf2_cmdHLINETO: - case cf2_cmdVLINETO: - { - CF2_UInt index; - CF2_UInt count = cf2_stack_count( opStack ); - - FT_Bool isX = op1 == cf2_cmdHLINETO; - - - FT_TRACE4(( isX ? " hlineto\n" : " vlineto\n" )); - - for ( index = 0; index < count; index++ ) - { - CF2_Fixed v = cf2_stack_getReal( opStack, index ); - - - if ( isX ) - curX += v; - else - curY += v; - - isX = !isX; - - cf2_glyphpath_lineTo( &glyphPath, curX, curY ); - } - - cf2_stack_clear( opStack ); - } - continue; - - case cf2_cmdRCURVELINE: - case cf2_cmdRRCURVETO: - { - CF2_UInt count = cf2_stack_count( opStack ); - CF2_UInt index = 0; - - - FT_TRACE4(( op1 == cf2_cmdRCURVELINE ? " rcurveline\n" - : " rrcurveto\n" )); - - while ( index + 6 <= count ) - { - CF2_Fixed x1 = cf2_stack_getReal( opStack, index + 0 ) + curX; - CF2_Fixed y1 = cf2_stack_getReal( opStack, index + 1 ) + curY; - CF2_Fixed x2 = cf2_stack_getReal( opStack, index + 2 ) + x1; - CF2_Fixed y2 = cf2_stack_getReal( opStack, index + 3 ) + y1; - CF2_Fixed x3 = cf2_stack_getReal( opStack, index + 4 ) + x2; - CF2_Fixed y3 = cf2_stack_getReal( opStack, index + 5 ) + y2; - - - cf2_glyphpath_curveTo( &glyphPath, x1, y1, x2, y2, x3, y3 ); - - curX = x3; - curY = y3; - index += 6; - } - - if ( op1 == cf2_cmdRCURVELINE ) - { - curX += cf2_stack_getReal( opStack, index + 0 ); - curY += cf2_stack_getReal( opStack, index + 1 ); - - cf2_glyphpath_lineTo( &glyphPath, curX, curY ); - } - - cf2_stack_clear( opStack ); - } - continue; /* no need to clear stack again */ - - case cf2_cmdCALLGSUBR: - case cf2_cmdCALLSUBR: - { - CF2_UInt subrIndex; - - - FT_TRACE4(( op1 == cf2_cmdCALLGSUBR ? " callgsubr" - : " callsubr" )); - - if ( charstringIndex > CF2_MAX_SUBR ) - { - /* max subr plus one for charstring */ - lastError = FT_THROW( Invalid_Glyph_Format ); - goto exit; /* overflow of stack */ - } - - /* push our current CFF charstring region on subrStack */ - charstring = (CF2_Buffer) - cf2_arrstack_getPointer( - &subrStack, - (size_t)charstringIndex + 1 ); - - /* set up the new CFF region and pointer */ - subrIndex = (CF2_UInt)cf2_stack_popInt( opStack ); - - switch ( op1 ) - { - case cf2_cmdCALLGSUBR: - FT_TRACE4(( " (idx %d, entering level %d)\n", - subrIndex + (CF2_UInt)decoder->globals_bias, - charstringIndex + 1 )); - - if ( cf2_initGlobalRegionBuffer( decoder, - subrIndex, - charstring ) ) - { - lastError = FT_THROW( Invalid_Glyph_Format ); - goto exit; /* subroutine lookup or stream error */ - } - break; - - default: - /* cf2_cmdCALLSUBR */ - FT_TRACE4(( " (idx %d, entering level %d)\n", - subrIndex + (CF2_UInt)decoder->locals_bias, - charstringIndex + 1 )); - - if ( cf2_initLocalRegionBuffer( decoder, - subrIndex, - charstring ) ) - { - lastError = FT_THROW( Invalid_Glyph_Format ); - goto exit; /* subroutine lookup or stream error */ - } - } - - charstringIndex += 1; /* entry is valid now */ - } - continue; /* do not clear the stack */ - - case cf2_cmdRETURN: - FT_TRACE4(( " return (leaving level %d)\n", charstringIndex )); - - if ( charstringIndex < 1 ) - { - /* Note: cannot return from top charstring */ - lastError = FT_THROW( Invalid_Glyph_Format ); - goto exit; /* underflow of stack */ - } - - /* restore position in previous charstring */ - charstring = (CF2_Buffer) - cf2_arrstack_getPointer( - &subrStack, - (CF2_UInt)--charstringIndex ); - continue; /* do not clear the stack */ - - case cf2_cmdESC: - { - FT_Byte op2 = (FT_Byte)cf2_buf_readByte( charstring ); - - - switch ( op2 ) - { - case cf2_escDOTSECTION: - /* something about `flip type of locking' -- ignore it */ - FT_TRACE4(( " dotsection\n" )); - - break; - - /* TODO: should these operators be supported? */ - case cf2_escAND: /* in spec */ - FT_TRACE4(( " and\n" )); - - CF2_FIXME; - break; - - case cf2_escOR: /* in spec */ - FT_TRACE4(( " or\n" )); - - CF2_FIXME; - break; - - case cf2_escNOT: /* in spec */ - FT_TRACE4(( " not\n" )); - - CF2_FIXME; - break; - - case cf2_escABS: /* in spec */ - FT_TRACE4(( " abs\n" )); - - CF2_FIXME; - break; - - case cf2_escADD: /* in spec */ - FT_TRACE4(( " add\n" )); - - CF2_FIXME; - break; - - case cf2_escSUB: /* in spec */ - FT_TRACE4(( " sub\n" )); - - CF2_FIXME; - break; - - case cf2_escDIV: /* in spec */ - FT_TRACE4(( " div\n" )); - - CF2_FIXME; - break; - - case cf2_escNEG: /* in spec */ - FT_TRACE4(( " neg\n" )); - - CF2_FIXME; - break; - - case cf2_escEQ: /* in spec */ - FT_TRACE4(( " eq\n" )); - - CF2_FIXME; - break; - - case cf2_escDROP: /* in spec */ - FT_TRACE4(( " drop\n" )); - - CF2_FIXME; - break; - - case cf2_escPUT: /* in spec */ - FT_TRACE4(( " put\n" )); - - CF2_FIXME; - break; - - case cf2_escGET: /* in spec */ - FT_TRACE4(( " get\n" )); - - CF2_FIXME; - break; - - case cf2_escIFELSE: /* in spec */ - FT_TRACE4(( " ifelse\n" )); - - CF2_FIXME; - break; - - case cf2_escRANDOM: /* in spec */ - FT_TRACE4(( " random\n" )); - - CF2_FIXME; - break; - - case cf2_escMUL: /* in spec */ - FT_TRACE4(( " mul\n" )); - - CF2_FIXME; - break; - - case cf2_escSQRT: /* in spec */ - FT_TRACE4(( " sqrt\n" )); - - CF2_FIXME; - break; - - case cf2_escDUP: /* in spec */ - FT_TRACE4(( " dup\n" )); - - CF2_FIXME; - break; - - case cf2_escEXCH: /* in spec */ - FT_TRACE4(( " exch\n" )); - - CF2_FIXME; - break; - - case cf2_escINDEX: /* in spec */ - FT_TRACE4(( " index\n" )); - - CF2_FIXME; - break; - - case cf2_escROLL: /* in spec */ - FT_TRACE4(( " roll\n" )); - - CF2_FIXME; - break; - - case cf2_escHFLEX: - { - static const FT_Bool readFromStack[12] = - { - TRUE /* dx1 */, FALSE /* dy1 */, - TRUE /* dx2 */, TRUE /* dy2 */, - TRUE /* dx3 */, FALSE /* dy3 */, - TRUE /* dx4 */, FALSE /* dy4 */, - TRUE /* dx5 */, FALSE /* dy5 */, - TRUE /* dx6 */, FALSE /* dy6 */ - }; - - - FT_TRACE4(( " hflex\n" )); - - cf2_doFlex( opStack, - &curX, - &curY, - &glyphPath, - readFromStack, - FALSE /* doConditionalLastRead */ ); - } - continue; - - case cf2_escFLEX: - { - static const FT_Bool readFromStack[12] = - { - TRUE /* dx1 */, TRUE /* dy1 */, - TRUE /* dx2 */, TRUE /* dy2 */, - TRUE /* dx3 */, TRUE /* dy3 */, - TRUE /* dx4 */, TRUE /* dy4 */, - TRUE /* dx5 */, TRUE /* dy5 */, - TRUE /* dx6 */, TRUE /* dy6 */ - }; - - - FT_TRACE4(( " flex\n" )); - - cf2_doFlex( opStack, - &curX, - &curY, - &glyphPath, - readFromStack, - FALSE /* doConditionalLastRead */ ); - } - break; /* TODO: why is this not a continue? */ - - case cf2_escHFLEX1: - { - static const FT_Bool readFromStack[12] = - { - TRUE /* dx1 */, TRUE /* dy1 */, - TRUE /* dx2 */, TRUE /* dy2 */, - TRUE /* dx3 */, FALSE /* dy3 */, - TRUE /* dx4 */, FALSE /* dy4 */, - TRUE /* dx5 */, TRUE /* dy5 */, - TRUE /* dx6 */, FALSE /* dy6 */ - }; - - - FT_TRACE4(( " hflex1\n" )); - - cf2_doFlex( opStack, - &curX, - &curY, - &glyphPath, - readFromStack, - FALSE /* doConditionalLastRead */ ); - } - continue; - - case cf2_escFLEX1: - { - static const FT_Bool readFromStack[12] = - { - TRUE /* dx1 */, TRUE /* dy1 */, - TRUE /* dx2 */, TRUE /* dy2 */, - TRUE /* dx3 */, TRUE /* dy3 */, - TRUE /* dx4 */, TRUE /* dy4 */, - TRUE /* dx5 */, TRUE /* dy5 */, - FALSE /* dx6 */, FALSE /* dy6 */ - }; - - - FT_TRACE4(( " flex1\n" )); - - cf2_doFlex( opStack, - &curX, - &curY, - &glyphPath, - readFromStack, - TRUE /* doConditionalLastRead */ ); - } - continue; - - case cf2_escRESERVED_1: - case cf2_escRESERVED_2: - case cf2_escRESERVED_6: - case cf2_escRESERVED_7: - case cf2_escRESERVED_8: - case cf2_escRESERVED_13: - case cf2_escRESERVED_16: - case cf2_escRESERVED_17: - case cf2_escRESERVED_19: - case cf2_escRESERVED_25: - case cf2_escRESERVED_31: - case cf2_escRESERVED_32: - case cf2_escRESERVED_33: - default: - FT_TRACE4(( " unknown op (12, %d)\n", op2 )); - - }; /* end of switch statement checking `op2' */ - - } /* case cf2_cmdESC */ - break; - - case cf2_cmdENDCHAR: - FT_TRACE4(( " endchar\n" )); - - if ( cf2_stack_count( opStack ) == 1 || - cf2_stack_count( opStack ) == 5 ) - { - if ( !haveWidth ) - *width = cf2_stack_getReal( opStack, 0 ) + nominalWidthX; - } - - /* width is defined or default after this */ - haveWidth = TRUE; - - if ( font->decoder->width_only ) - goto exit; - - /* close path if still open */ - cf2_glyphpath_closeOpenPath( &glyphPath ); - - if ( cf2_stack_count( opStack ) > 1 ) - { - /* must be either 4 or 5 -- */ - /* this is a (deprecated) implied `seac' operator */ - - CF2_Int achar; - CF2_Int bchar; - CF2_BufferRec component; - CF2_Fixed dummyWidth; /* ignore component width */ - FT_Error error2; - - - if ( doingSeac ) - { - lastError = FT_THROW( Invalid_Glyph_Format ); - goto exit; /* nested seac */ - } - - achar = cf2_stack_popInt( opStack ); - bchar = cf2_stack_popInt( opStack ); - - curY = cf2_stack_popFixed( opStack ); - curX = cf2_stack_popFixed( opStack ); - - error2 = cf2_getSeacComponent( decoder, achar, &component ); - if ( error2 ) - { - lastError = error2; /* pass FreeType error through */ - goto exit; - } - cf2_interpT2CharString( font, - &component, - callbacks, - translation, - TRUE, - curX, - curY, - &dummyWidth ); - cf2_freeSeacComponent( decoder, &component ); - - error2 = cf2_getSeacComponent( decoder, bchar, &component ); - if ( error2 ) - { - lastError = error2; /* pass FreeType error through */ - goto exit; - } - cf2_interpT2CharString( font, - &component, - callbacks, - translation, - TRUE, - 0, - 0, - &dummyWidth ); - cf2_freeSeacComponent( decoder, &component ); - } - goto exit; - - case cf2_cmdCNTRMASK: - case cf2_cmdHINTMASK: - /* the final \n in the tracing message gets added in */ - /* `cf2_hintmask_read' (which also traces the mask bytes) */ - FT_TRACE4(( op1 == cf2_cmdCNTRMASK ? " cntrmask" : " hintmask" )); - - /* never add hints after the mask is computed */ - if ( cf2_stack_count( opStack ) > 1 && - cf2_hintmask_isValid( &hintMask ) ) - { - FT_TRACE4(( "cf2_interpT2CharString: invalid hint mask\n" )); - break; - } - - /* if there are arguments on the stack, there this is an */ - /* implied cf2_cmdVSTEMHM */ - cf2_doStems( font, - opStack, - &vStemHintArray, - width, - &haveWidth, - 0 ); - - if ( font->decoder->width_only ) - goto exit; - - if ( op1 == cf2_cmdHINTMASK ) - { - /* consume the hint mask bytes which follow the operator */ - cf2_hintmask_read( &hintMask, - charstring, - cf2_arrstack_size( &hStemHintArray ) + - cf2_arrstack_size( &vStemHintArray ) ); - } - else - { - /* - * Consume the counter mask bytes which follow the operator: - * Build a temporary hint map, just to place and lock those - * stems participating in the counter mask. These are most - * likely the dominant hstems, and are grouped together in a - * few counter groups, not necessarily in correspondence - * with the hint groups. This reduces the chances of - * conflicts between hstems that are initially placed in - * separate hint groups and then brought together. The - * positions are copied back to `hStemHintArray', so we can - * discard `counterMask' and `counterHintMap'. - * - */ - CF2_HintMapRec counterHintMap; - CF2_HintMaskRec counterMask; - - - cf2_hintmap_init( &counterHintMap, - font, - &glyphPath.initialHintMap, - &glyphPath.hintMoves, - scaleY ); - cf2_hintmask_init( &counterMask, error ); - - cf2_hintmask_read( &counterMask, - charstring, - cf2_arrstack_size( &hStemHintArray ) + - cf2_arrstack_size( &vStemHintArray ) ); - cf2_hintmap_build( &counterHintMap, - &hStemHintArray, - &vStemHintArray, - &counterMask, - 0, - FALSE ); - } - break; - - case cf2_cmdRMOVETO: - FT_TRACE4(( " rmoveto\n" )); - - if ( cf2_stack_count( opStack ) > 2 && !haveWidth ) - *width = cf2_stack_getReal( opStack, 0 ) + nominalWidthX; - - /* width is defined or default after this */ - haveWidth = TRUE; - - if ( font->decoder->width_only ) - goto exit; - - curY += cf2_stack_popFixed( opStack ); - curX += cf2_stack_popFixed( opStack ); - - cf2_glyphpath_moveTo( &glyphPath, curX, curY ); - - break; - - case cf2_cmdHMOVETO: - FT_TRACE4(( " hmoveto\n" )); - - if ( cf2_stack_count( opStack ) > 1 && !haveWidth ) - *width = cf2_stack_getReal( opStack, 0 ) + nominalWidthX; - - /* width is defined or default after this */ - haveWidth = TRUE; - - if ( font->decoder->width_only ) - goto exit; - - curX += cf2_stack_popFixed( opStack ); - - cf2_glyphpath_moveTo( &glyphPath, curX, curY ); - - break; - - case cf2_cmdRLINECURVE: - { - CF2_UInt count = cf2_stack_count( opStack ); - CF2_UInt index = 0; - - - FT_TRACE4(( " rlinecurve\n" )); - - while ( index + 6 < count ) - { - curX += cf2_stack_getReal( opStack, index + 0 ); - curY += cf2_stack_getReal( opStack, index + 1 ); - - cf2_glyphpath_lineTo( &glyphPath, curX, curY ); - index += 2; - } - - while ( index < count ) - { - CF2_Fixed x1 = cf2_stack_getReal( opStack, index + 0 ) + curX; - CF2_Fixed y1 = cf2_stack_getReal( opStack, index + 1 ) + curY; - CF2_Fixed x2 = cf2_stack_getReal( opStack, index + 2 ) + x1; - CF2_Fixed y2 = cf2_stack_getReal( opStack, index + 3 ) + y1; - CF2_Fixed x3 = cf2_stack_getReal( opStack, index + 4 ) + x2; - CF2_Fixed y3 = cf2_stack_getReal( opStack, index + 5 ) + y2; - - - cf2_glyphpath_curveTo( &glyphPath, x1, y1, x2, y2, x3, y3 ); - - curX = x3; - curY = y3; - index += 6; - } - - cf2_stack_clear( opStack ); - } - continue; /* no need to clear stack again */ - - case cf2_cmdVVCURVETO: - { - CF2_UInt count, count1 = cf2_stack_count( opStack ); - CF2_UInt index = 0; - - - /* if `cf2_stack_count' isn't of the form 4n or 4n+1, */ - /* we enforce it by clearing the second bit */ - /* (and sorting the stack indexing to suit) */ - count = count1 & ~2U; - index += count1 - count; - - FT_TRACE4(( " vvcurveto\n" )); - - while ( index < count ) - { - CF2_Fixed x1, y1, x2, y2, x3, y3; - - - if ( ( count - index ) & 1 ) - { - x1 = cf2_stack_getReal( opStack, index ) + curX; - - ++index; - } - else - x1 = curX; - - y1 = cf2_stack_getReal( opStack, index + 0 ) + curY; - x2 = cf2_stack_getReal( opStack, index + 1 ) + x1; - y2 = cf2_stack_getReal( opStack, index + 2 ) + y1; - x3 = x2; - y3 = cf2_stack_getReal( opStack, index + 3 ) + y2; - - cf2_glyphpath_curveTo( &glyphPath, x1, y1, x2, y2, x3, y3 ); - - curX = x3; - curY = y3; - index += 4; - } - - cf2_stack_clear( opStack ); - } - continue; /* no need to clear stack again */ - - case cf2_cmdHHCURVETO: - { - CF2_UInt count, count1 = cf2_stack_count( opStack ); - CF2_UInt index = 0; - - - /* if `cf2_stack_count' isn't of the form 4n or 4n+1, */ - /* we enforce it by clearing the second bit */ - /* (and sorting the stack indexing to suit) */ - count = count1 & ~2U; - index += count1 - count; - - FT_TRACE4(( " hhcurveto\n" )); - - while ( index < count ) - { - CF2_Fixed x1, y1, x2, y2, x3, y3; - - - if ( ( count - index ) & 1 ) - { - y1 = cf2_stack_getReal( opStack, index ) + curY; - - ++index; - } - else - y1 = curY; - - x1 = cf2_stack_getReal( opStack, index + 0 ) + curX; - x2 = cf2_stack_getReal( opStack, index + 1 ) + x1; - y2 = cf2_stack_getReal( opStack, index + 2 ) + y1; - x3 = cf2_stack_getReal( opStack, index + 3 ) + x2; - y3 = y2; - - cf2_glyphpath_curveTo( &glyphPath, x1, y1, x2, y2, x3, y3 ); - - curX = x3; - curY = y3; - index += 4; - } - - cf2_stack_clear( opStack ); - } - continue; /* no need to clear stack again */ - - case cf2_cmdVHCURVETO: - case cf2_cmdHVCURVETO: - { - CF2_UInt count, count1 = cf2_stack_count( opStack ); - CF2_UInt index = 0; - - FT_Bool alternate = op1 == cf2_cmdHVCURVETO; - - - /* if `cf2_stack_count' isn't of the form 8n, 8n+1, */ - /* 8n+4, or 8n+5, we enforce it by clearing the */ - /* second bit */ - /* (and sorting the stack indexing to suit) */ - count = count1 & ~2U; - index += count1 - count; - - FT_TRACE4(( alternate ? " hvcurveto\n" : " vhcurveto\n" )); - - while ( index < count ) - { - CF2_Fixed x1, x2, x3, y1, y2, y3; - - - if ( alternate ) - { - x1 = cf2_stack_getReal( opStack, index + 0 ) + curX; - y1 = curY; - x2 = cf2_stack_getReal( opStack, index + 1 ) + x1; - y2 = cf2_stack_getReal( opStack, index + 2 ) + y1; - y3 = cf2_stack_getReal( opStack, index + 3 ) + y2; - - if ( count - index == 5 ) - { - x3 = cf2_stack_getReal( opStack, index + 4 ) + x2; - - ++index; - } - else - x3 = x2; - - alternate = FALSE; - } - else - { - x1 = curX; - y1 = cf2_stack_getReal( opStack, index + 0 ) + curY; - x2 = cf2_stack_getReal( opStack, index + 1 ) + x1; - y2 = cf2_stack_getReal( opStack, index + 2 ) + y1; - x3 = cf2_stack_getReal( opStack, index + 3 ) + x2; - - if ( count - index == 5 ) - { - y3 = cf2_stack_getReal( opStack, index + 4 ) + y2; - - ++index; - } - else - y3 = y2; - - alternate = TRUE; - } - - cf2_glyphpath_curveTo( &glyphPath, x1, y1, x2, y2, x3, y3 ); - - curX = x3; - curY = y3; - index += 4; - } - - cf2_stack_clear( opStack ); - } - continue; /* no need to clear stack again */ - - case cf2_cmdEXTENDEDNMBR: - { - CF2_Int v; - - - v = (FT_Short)( ( cf2_buf_readByte( charstring ) << 8 ) | - cf2_buf_readByte( charstring ) ); - - FT_TRACE4(( " %d", v )); - - cf2_stack_pushInt( opStack, v ); - } - continue; - - default: - /* numbers */ - { - if ( /* op1 >= 32 && */ op1 <= 246 ) - { - CF2_Int v; - - - v = op1 - 139; - - FT_TRACE4(( " %d", v )); - - /* -107 .. 107 */ - cf2_stack_pushInt( opStack, v ); - } - - else if ( /* op1 >= 247 && */ op1 <= 250 ) - { - CF2_Int v; - - - v = op1; - v -= 247; - v *= 256; - v += cf2_buf_readByte( charstring ); - v += 108; - - FT_TRACE4(( " %d", v )); - - /* 108 .. 1131 */ - cf2_stack_pushInt( opStack, v ); - } - - else if ( /* op1 >= 251 && */ op1 <= 254 ) - { - CF2_Int v; - - - v = op1; - v -= 251; - v *= 256; - v += cf2_buf_readByte( charstring ); - v = -v - 108; - - FT_TRACE4(( " %d", v )); - - /* -1131 .. -108 */ - cf2_stack_pushInt( opStack, v ); - } - - else /* op1 == 255 */ - { - CF2_Fixed v; - - - v = (CF2_Fixed) - ( ( (FT_UInt32)cf2_buf_readByte( charstring ) << 24 ) | - ( (FT_UInt32)cf2_buf_readByte( charstring ) << 16 ) | - ( (FT_UInt32)cf2_buf_readByte( charstring ) << 8 ) | - (FT_UInt32)cf2_buf_readByte( charstring ) ); - - FT_TRACE4(( " %.2f", v / 65536.0 )); - - cf2_stack_pushFixed( opStack, v ); - } - } - continue; /* don't clear stack */ - - } /* end of switch statement checking `op1' */ - - cf2_stack_clear( opStack ); - - } /* end of main interpreter loop */ - - /* we get here if the charstring ends without cf2_cmdENDCHAR */ - FT_TRACE4(( "cf2_interpT2CharString:" - " charstring ends without ENDCHAR\n" )); - - exit: - /* check whether last error seen is also the first one */ - cf2_setError( error, lastError ); - - /* free resources from objects we've used */ - cf2_glyphpath_finalize( &glyphPath ); - cf2_arrstack_finalize( &vStemHintArray ); - cf2_arrstack_finalize( &hStemHintArray ); - cf2_arrstack_finalize( &subrStack ); - cf2_stack_free( opStack ); - - FT_TRACE4(( "\n" )); - - return; - } - - -/* END */ diff --git a/src/3rdparty/freetype/src/cff/cf2intrp.h b/src/3rdparty/freetype/src/cff/cf2intrp.h deleted file mode 100644 index b5d89478..00000000 --- a/src/3rdparty/freetype/src/cff/cf2intrp.h +++ /dev/null @@ -1,83 +0,0 @@ -/***************************************************************************/ -/* */ -/* cf2font.h */ -/* */ -/* Adobe's CFF Interpreter (specification). */ -/* */ -/* Copyright 2007-2013 Adobe Systems Incorporated. */ -/* */ -/* This software, and all works of authorship, whether in source or */ -/* object code form as indicated by the copyright notice(s) included */ -/* herein (collectively, the "Work") is made available, and may only be */ -/* used, modified, and distributed under the FreeType Project License, */ -/* LICENSE.TXT. Additionally, subject to the terms and conditions of the */ -/* FreeType Project License, each contributor to the Work hereby grants */ -/* to any individual or legal entity exercising permissions granted by */ -/* the FreeType Project License and this section (hereafter, "You" or */ -/* "Your") a perpetual, worldwide, non-exclusive, no-charge, */ -/* royalty-free, irrevocable (except as stated in this section) patent */ -/* license to make, have made, use, offer to sell, sell, import, and */ -/* otherwise transfer the Work, where such license applies only to those */ -/* patent claims licensable by such contributor that are necessarily */ -/* infringed by their contribution(s) alone or by combination of their */ -/* contribution(s) with the Work to which such contribution(s) was */ -/* submitted. If You institute patent litigation against any entity */ -/* (including a cross-claim or counterclaim in a lawsuit) alleging that */ -/* the Work or a contribution incorporated within the Work constitutes */ -/* direct or contributory patent infringement, then any patent licenses */ -/* granted to You under this License for that Work shall terminate as of */ -/* the date such litigation is filed. */ -/* */ -/* By using, modifying, or distributing the Work you indicate that you */ -/* have read and understood the terms and conditions of the */ -/* FreeType Project License as well as those provided in this section, */ -/* and you accept them fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __CF2INTRP_H__ -#define __CF2INTRP_H__ - - -#include "cf2ft.h" -#include "cf2hints.h" - - -FT_BEGIN_HEADER - - - FT_LOCAL( void ) - cf2_hintmask_init( CF2_HintMask hintmask, - FT_Error* error ); - FT_LOCAL( FT_Bool ) - cf2_hintmask_isValid( const CF2_HintMask hintmask ); - FT_LOCAL( FT_Bool ) - cf2_hintmask_isNew( const CF2_HintMask hintmask ); - FT_LOCAL( void ) - cf2_hintmask_setNew( CF2_HintMask hintmask, - FT_Bool val ); - FT_LOCAL( FT_Byte* ) - cf2_hintmask_getMaskPtr( CF2_HintMask hintmask ); - FT_LOCAL( void ) - cf2_hintmask_setAll( CF2_HintMask hintmask, - size_t bitCount ); - - FT_LOCAL( void ) - cf2_interpT2CharString( CF2_Font font, - CF2_Buffer charstring, - CF2_OutlineCallbacks callbacks, - const FT_Vector* translation, - FT_Bool doingSeac, - CF2_Fixed curX, - CF2_Fixed curY, - CF2_Fixed* width ); - - -FT_END_HEADER - - -#endif /* __CF2INTRP_H__ */ - - -/* END */ diff --git a/src/3rdparty/freetype/src/cff/cf2read.c b/src/3rdparty/freetype/src/cff/cf2read.c deleted file mode 100644 index 2b429e3e..00000000 --- a/src/3rdparty/freetype/src/cff/cf2read.c +++ /dev/null @@ -1,112 +0,0 @@ -/***************************************************************************/ -/* */ -/* cf2read.c */ -/* */ -/* Adobe's code for stream handling (body). */ -/* */ -/* Copyright 2007-2013 Adobe Systems Incorporated. */ -/* */ -/* This software, and all works of authorship, whether in source or */ -/* object code form as indicated by the copyright notice(s) included */ -/* herein (collectively, the "Work") is made available, and may only be */ -/* used, modified, and distributed under the FreeType Project License, */ -/* LICENSE.TXT. Additionally, subject to the terms and conditions of the */ -/* FreeType Project License, each contributor to the Work hereby grants */ -/* to any individual or legal entity exercising permissions granted by */ -/* the FreeType Project License and this section (hereafter, "You" or */ -/* "Your") a perpetual, worldwide, non-exclusive, no-charge, */ -/* royalty-free, irrevocable (except as stated in this section) patent */ -/* license to make, have made, use, offer to sell, sell, import, and */ -/* otherwise transfer the Work, where such license applies only to those */ -/* patent claims licensable by such contributor that are necessarily */ -/* infringed by their contribution(s) alone or by combination of their */ -/* contribution(s) with the Work to which such contribution(s) was */ -/* submitted. If You institute patent litigation against any entity */ -/* (including a cross-claim or counterclaim in a lawsuit) alleging that */ -/* the Work or a contribution incorporated within the Work constitutes */ -/* direct or contributory patent infringement, then any patent licenses */ -/* granted to You under this License for that Work shall terminate as of */ -/* the date such litigation is filed. */ -/* */ -/* By using, modifying, or distributing the Work you indicate that you */ -/* have read and understood the terms and conditions of the */ -/* FreeType Project License as well as those provided in this section, */ -/* and you accept them fully. */ -/* */ -/***************************************************************************/ - - -#include "cf2ft.h" -#include FT_INTERNAL_DEBUG_H - -#include "cf2glue.h" - -#include "cf2error.h" - - - /* Define CF2_IO_FAIL as 1 to enable random errors and random */ - /* value errors in I/O. */ -#define CF2_IO_FAIL 0 - - -#if CF2_IO_FAIL - - /* set the .00 value to a nonzero probability */ - static int - randomError2( void ) - { - /* for region buffer ReadByte (interp) function */ - return (double)rand() / RAND_MAX < .00; - } - - /* set the .00 value to a nonzero probability */ - static CF2_Int - randomValue() - { - return (double)rand() / RAND_MAX < .00 ? rand() : 0; - } - -#endif /* CF2_IO_FAIL */ - - - /* Region Buffer */ - /* */ - /* Can be constructed from a copied buffer managed by */ - /* `FCM_getDatablock'. */ - /* Reads bytes with check for end of buffer. */ - - /* reading past the end of the buffer sets error and returns zero */ - FT_LOCAL_DEF( CF2_Int ) - cf2_buf_readByte( CF2_Buffer buf ) - { - if ( buf->ptr < buf->end ) - { -#if CF2_IO_FAIL - if ( randomError2() ) - { - CF2_SET_ERROR( buf->error, Invalid_Stream_Operation ); - return 0; - } - - return *(buf->ptr)++ + randomValue(); -#else - return *(buf->ptr)++; -#endif - } - else - { - CF2_SET_ERROR( buf->error, Invalid_Stream_Operation ); - return 0; - } - } - - - /* note: end condition can occur without error */ - FT_LOCAL_DEF( FT_Bool ) - cf2_buf_isEnd( CF2_Buffer buf ) - { - return (FT_Bool)( buf->ptr >= buf->end ); - } - - -/* END */ diff --git a/src/3rdparty/freetype/src/cff/cf2read.h b/src/3rdparty/freetype/src/cff/cf2read.h deleted file mode 100644 index 7ef7c8c1..00000000 --- a/src/3rdparty/freetype/src/cff/cf2read.h +++ /dev/null @@ -1,68 +0,0 @@ -/***************************************************************************/ -/* */ -/* cf2read.h */ -/* */ -/* Adobe's code for stream handling (specification). */ -/* */ -/* Copyright 2007-2013 Adobe Systems Incorporated. */ -/* */ -/* This software, and all works of authorship, whether in source or */ -/* object code form as indicated by the copyright notice(s) included */ -/* herein (collectively, the "Work") is made available, and may only be */ -/* used, modified, and distributed under the FreeType Project License, */ -/* LICENSE.TXT. Additionally, subject to the terms and conditions of the */ -/* FreeType Project License, each contributor to the Work hereby grants */ -/* to any individual or legal entity exercising permissions granted by */ -/* the FreeType Project License and this section (hereafter, "You" or */ -/* "Your") a perpetual, worldwide, non-exclusive, no-charge, */ -/* royalty-free, irrevocable (except as stated in this section) patent */ -/* license to make, have made, use, offer to sell, sell, import, and */ -/* otherwise transfer the Work, where such license applies only to those */ -/* patent claims licensable by such contributor that are necessarily */ -/* infringed by their contribution(s) alone or by combination of their */ -/* contribution(s) with the Work to which such contribution(s) was */ -/* submitted. If You institute patent litigation against any entity */ -/* (including a cross-claim or counterclaim in a lawsuit) alleging that */ -/* the Work or a contribution incorporated within the Work constitutes */ -/* direct or contributory patent infringement, then any patent licenses */ -/* granted to You under this License for that Work shall terminate as of */ -/* the date such litigation is filed. */ -/* */ -/* By using, modifying, or distributing the Work you indicate that you */ -/* have read and understood the terms and conditions of the */ -/* FreeType Project License as well as those provided in this section, */ -/* and you accept them fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __CF2READ_H__ -#define __CF2READ_H__ - - -FT_BEGIN_HEADER - - - typedef struct CF2_BufferRec_ - { - FT_Error* error; - const FT_Byte* start; - const FT_Byte* end; - const FT_Byte* ptr; - - } CF2_BufferRec, *CF2_Buffer; - - - FT_LOCAL( CF2_Int ) - cf2_buf_readByte( CF2_Buffer buf ); - FT_LOCAL( FT_Bool ) - cf2_buf_isEnd( CF2_Buffer buf ); - - -FT_END_HEADER - - -#endif /* __CF2READ_H__ */ - - -/* END */ diff --git a/src/3rdparty/freetype/src/cff/cf2stack.c b/src/3rdparty/freetype/src/cff/cf2stack.c deleted file mode 100644 index 8332b5d9..00000000 --- a/src/3rdparty/freetype/src/cff/cf2stack.c +++ /dev/null @@ -1,205 +0,0 @@ -/***************************************************************************/ -/* */ -/* cf2stack.c */ -/* */ -/* Adobe's code for emulating a CFF stack (body). */ -/* */ -/* Copyright 2007-2013 Adobe Systems Incorporated. */ -/* */ -/* This software, and all works of authorship, whether in source or */ -/* object code form as indicated by the copyright notice(s) included */ -/* herein (collectively, the "Work") is made available, and may only be */ -/* used, modified, and distributed under the FreeType Project License, */ -/* LICENSE.TXT. Additionally, subject to the terms and conditions of the */ -/* FreeType Project License, each contributor to the Work hereby grants */ -/* to any individual or legal entity exercising permissions granted by */ -/* the FreeType Project License and this section (hereafter, "You" or */ -/* "Your") a perpetual, worldwide, non-exclusive, no-charge, */ -/* royalty-free, irrevocable (except as stated in this section) patent */ -/* license to make, have made, use, offer to sell, sell, import, and */ -/* otherwise transfer the Work, where such license applies only to those */ -/* patent claims licensable by such contributor that are necessarily */ -/* infringed by their contribution(s) alone or by combination of their */ -/* contribution(s) with the Work to which such contribution(s) was */ -/* submitted. If You institute patent litigation against any entity */ -/* (including a cross-claim or counterclaim in a lawsuit) alleging that */ -/* the Work or a contribution incorporated within the Work constitutes */ -/* direct or contributory patent infringement, then any patent licenses */ -/* granted to You under this License for that Work shall terminate as of */ -/* the date such litigation is filed. */ -/* */ -/* By using, modifying, or distributing the Work you indicate that you */ -/* have read and understood the terms and conditions of the */ -/* FreeType Project License as well as those provided in this section, */ -/* and you accept them fully. */ -/* */ -/***************************************************************************/ - - -#include "cf2ft.h" -#include FT_INTERNAL_DEBUG_H - -#include "cf2glue.h" -#include "cf2font.h" -#include "cf2stack.h" - -#include "cf2error.h" - - - /* Allocate and initialize an instance of CF2_Stack. */ - /* Note: This function returns NULL on error (does not set */ - /* `error'). */ - FT_LOCAL_DEF( CF2_Stack ) - cf2_stack_init( FT_Memory memory, - FT_Error* e ) - { - FT_Error error = FT_Err_Ok; /* for FT_QNEW */ - - CF2_Stack stack = NULL; - - - if ( !FT_QNEW( stack ) ) - { - /* initialize the structure; FT_QNEW zeroes it */ - stack->memory = memory; - stack->error = e; - stack->top = &stack->buffer[0]; /* empty stack */ - } - - return stack; - } - - - FT_LOCAL_DEF( void ) - cf2_stack_free( CF2_Stack stack ) - { - if ( stack ) - { - FT_Memory memory = stack->memory; - - - /* free the main structure */ - FT_FREE( stack ); - } - } - - - FT_LOCAL_DEF( CF2_UInt ) - cf2_stack_count( CF2_Stack stack ) - { - return (CF2_UInt)( stack->top - &stack->buffer[0] ); - } - - - FT_LOCAL_DEF( void ) - cf2_stack_pushInt( CF2_Stack stack, - CF2_Int val ) - { - if ( stack->top == &stack->buffer[CF2_OPERAND_STACK_SIZE] ) - { - CF2_SET_ERROR( stack->error, Stack_Overflow ); - return; /* stack overflow */ - } - - stack->top->u.i = val; - stack->top->type = CF2_NumberInt; - ++stack->top; - } - - - FT_LOCAL_DEF( void ) - cf2_stack_pushFixed( CF2_Stack stack, - CF2_Fixed val ) - { - if ( stack->top == &stack->buffer[CF2_OPERAND_STACK_SIZE] ) - { - CF2_SET_ERROR( stack->error, Stack_Overflow ); - return; /* stack overflow */ - } - - stack->top->u.r = val; - stack->top->type = CF2_NumberFixed; - ++stack->top; - } - - - /* this function is only allowed to pop an integer type */ - FT_LOCAL_DEF( CF2_Int ) - cf2_stack_popInt( CF2_Stack stack ) - { - if ( stack->top == &stack->buffer[0] ) - { - CF2_SET_ERROR( stack->error, Stack_Underflow ); - return 0; /* underflow */ - } - if ( stack->top[-1].type != CF2_NumberInt ) - { - CF2_SET_ERROR( stack->error, Syntax_Error ); - return 0; /* type mismatch */ - } - - --stack->top; - - return stack->top->u.i; - } - - - /* Note: type mismatch is silently cast */ - /* TODO: check this */ - FT_LOCAL_DEF( CF2_Fixed ) - cf2_stack_popFixed( CF2_Stack stack ) - { - if ( stack->top == &stack->buffer[0] ) - { - CF2_SET_ERROR( stack->error, Stack_Underflow ); - return cf2_intToFixed( 0 ); /* underflow */ - } - - --stack->top; - - switch ( stack->top->type ) - { - case CF2_NumberInt: - return cf2_intToFixed( stack->top->u.i ); - case CF2_NumberFrac: - return cf2_fracToFixed( stack->top->u.f ); - default: - return stack->top->u.r; - } - } - - - /* Note: type mismatch is silently cast */ - /* TODO: check this */ - FT_LOCAL_DEF( CF2_Fixed ) - cf2_stack_getReal( CF2_Stack stack, - CF2_UInt idx ) - { - FT_ASSERT( cf2_stack_count( stack ) <= CF2_OPERAND_STACK_SIZE ); - - if ( idx >= cf2_stack_count( stack ) ) - { - CF2_SET_ERROR( stack->error, Stack_Overflow ); - return cf2_intToFixed( 0 ); /* bounds error */ - } - - switch ( stack->buffer[idx].type ) - { - case CF2_NumberInt: - return cf2_intToFixed( stack->buffer[idx].u.i ); - case CF2_NumberFrac: - return cf2_fracToFixed( stack->buffer[idx].u.f ); - default: - return stack->buffer[idx].u.r; - } - } - - - FT_LOCAL_DEF( void ) - cf2_stack_clear( CF2_Stack stack ) - { - stack->top = &stack->buffer[0]; - } - - -/* END */ diff --git a/src/3rdparty/freetype/src/cff/cf2stack.h b/src/3rdparty/freetype/src/cff/cf2stack.h deleted file mode 100644 index 7d6d1961..00000000 --- a/src/3rdparty/freetype/src/cff/cf2stack.h +++ /dev/null @@ -1,106 +0,0 @@ -/***************************************************************************/ -/* */ -/* cf2stack.h */ -/* */ -/* Adobe's code for emulating a CFF stack (specification). */ -/* */ -/* Copyright 2007-2013 Adobe Systems Incorporated. */ -/* */ -/* This software, and all works of authorship, whether in source or */ -/* object code form as indicated by the copyright notice(s) included */ -/* herein (collectively, the "Work") is made available, and may only be */ -/* used, modified, and distributed under the FreeType Project License, */ -/* LICENSE.TXT. Additionally, subject to the terms and conditions of the */ -/* FreeType Project License, each contributor to the Work hereby grants */ -/* to any individual or legal entity exercising permissions granted by */ -/* the FreeType Project License and this section (hereafter, "You" or */ -/* "Your") a perpetual, worldwide, non-exclusive, no-charge, */ -/* royalty-free, irrevocable (except as stated in this section) patent */ -/* license to make, have made, use, offer to sell, sell, import, and */ -/* otherwise transfer the Work, where such license applies only to those */ -/* patent claims licensable by such contributor that are necessarily */ -/* infringed by their contribution(s) alone or by combination of their */ -/* contribution(s) with the Work to which such contribution(s) was */ -/* submitted. If You institute patent litigation against any entity */ -/* (including a cross-claim or counterclaim in a lawsuit) alleging that */ -/* the Work or a contribution incorporated within the Work constitutes */ -/* direct or contributory patent infringement, then any patent licenses */ -/* granted to You under this License for that Work shall terminate as of */ -/* the date such litigation is filed. */ -/* */ -/* By using, modifying, or distributing the Work you indicate that you */ -/* have read and understood the terms and conditions of the */ -/* FreeType Project License as well as those provided in this section, */ -/* and you accept them fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __CF2STACK_H__ -#define __CF2STACK_H__ - - -FT_BEGIN_HEADER - - - /* CFF operand stack; specified maximum of 48 or 192 values */ - typedef struct CF2_StackNumber_ - { - union - { - CF2_Fixed r; /* 16.16 fixed point */ - CF2_Frac f; /* 2.30 fixed point (for font matrix) */ - CF2_Int i; - } u; - - CF2_NumberType type; - - } CF2_StackNumber; - - - typedef struct CF2_StackRec_ - { - FT_Memory memory; - FT_Error* error; - CF2_StackNumber buffer[CF2_OPERAND_STACK_SIZE]; - CF2_StackNumber* top; - - } CF2_StackRec, *CF2_Stack; - - - FT_LOCAL( CF2_Stack ) - cf2_stack_init( FT_Memory memory, - FT_Error* error ); - FT_LOCAL( void ) - cf2_stack_free( CF2_Stack stack ); - - FT_LOCAL( CF2_UInt ) - cf2_stack_count( CF2_Stack stack ); - - FT_LOCAL( void ) - cf2_stack_pushInt( CF2_Stack stack, - CF2_Int val ); - FT_LOCAL( void ) - cf2_stack_pushFixed( CF2_Stack stack, - CF2_Fixed val ); - - FT_LOCAL( CF2_Int ) - cf2_stack_popInt( CF2_Stack stack ); - FT_LOCAL( CF2_Fixed ) - cf2_stack_popFixed( CF2_Stack stack ); - - FT_LOCAL( CF2_Fixed ) - cf2_stack_getReal( CF2_Stack stack, - CF2_UInt idx ); - - FT_LOCAL( void ) - cf2_stack_clear( CF2_Stack stack ); - - -FT_END_HEADER - - -#endif /* __CF2STACK_H__ */ - - -/* END */ diff --git a/src/3rdparty/freetype/src/cff/cf2types.h b/src/3rdparty/freetype/src/cff/cf2types.h deleted file mode 100644 index ac6a0226..00000000 --- a/src/3rdparty/freetype/src/cff/cf2types.h +++ /dev/null @@ -1,78 +0,0 @@ -/***************************************************************************/ -/* */ -/* cf2types.h */ -/* */ -/* Adobe's code for defining data types (specification only). */ -/* */ -/* Copyright 2011-2013 Adobe Systems Incorporated. */ -/* */ -/* This software, and all works of authorship, whether in source or */ -/* object code form as indicated by the copyright notice(s) included */ -/* herein (collectively, the "Work") is made available, and may only be */ -/* used, modified, and distributed under the FreeType Project License, */ -/* LICENSE.TXT. Additionally, subject to the terms and conditions of the */ -/* FreeType Project License, each contributor to the Work hereby grants */ -/* to any individual or legal entity exercising permissions granted by */ -/* the FreeType Project License and this section (hereafter, "You" or */ -/* "Your") a perpetual, worldwide, non-exclusive, no-charge, */ -/* royalty-free, irrevocable (except as stated in this section) patent */ -/* license to make, have made, use, offer to sell, sell, import, and */ -/* otherwise transfer the Work, where such license applies only to those */ -/* patent claims licensable by such contributor that are necessarily */ -/* infringed by their contribution(s) alone or by combination of their */ -/* contribution(s) with the Work to which such contribution(s) was */ -/* submitted. If You institute patent litigation against any entity */ -/* (including a cross-claim or counterclaim in a lawsuit) alleging that */ -/* the Work or a contribution incorporated within the Work constitutes */ -/* direct or contributory patent infringement, then any patent licenses */ -/* granted to You under this License for that Work shall terminate as of */ -/* the date such litigation is filed. */ -/* */ -/* By using, modifying, or distributing the Work you indicate that you */ -/* have read and understood the terms and conditions of the */ -/* FreeType Project License as well as those provided in this section, */ -/* and you accept them fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __CF2TYPES_H__ -#define __CF2TYPES_H__ - -#include -#include FT_FREETYPE_H - - -FT_BEGIN_HEADER - - - /* - * The data models that we expect to support are as follows: - * - * name char short int long long-long pointer example - * ----------------------------------------------------- - * ILP32 8 16 32 32 64* 32 32-bit MacOS, x86 - * LLP64 8 16 32 32 64 64 x64 - * LP64 8 16 32 64 64 64 64-bit MacOS - * - * *) type may be supported by emulation on a 32-bit architecture - * - */ - - - /* integers at least 32 bits wide */ -#define CF2_UInt FT_UFast -#define CF2_Int FT_Fast - - - /* fixed-float numbers */ - typedef FT_Int32 CF2_F16Dot16; - - -FT_END_HEADER - - -#endif /* __CF2TYPES_H__ */ - - -/* END */ diff --git a/src/3rdparty/freetype/src/cff/cff.c b/src/3rdparty/freetype/src/cff/cff.c index a34ba9b7..0fa6c878 100644 --- a/src/3rdparty/freetype/src/cff/cff.c +++ b/src/3rdparty/freetype/src/cff/cff.c @@ -4,7 +4,7 @@ * * FreeType OpenType driver component (body only). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -17,7 +17,6 @@ #define FT_MAKE_OPTION_SINGLE_OBJECT -#include #include "cffcmap.c" #include "cffdrivr.c" diff --git a/src/3rdparty/freetype/src/cff/cffcmap.c b/src/3rdparty/freetype/src/cff/cffcmap.c index 15cc94ca..6d16ed42 100644 --- a/src/3rdparty/freetype/src/cff/cffcmap.c +++ b/src/3rdparty/freetype/src/cff/cffcmap.c @@ -4,7 +4,7 @@ * * CFF character mapping table (cmap) support (body). * - * Copyright (C) 2002-2019 by + * Copyright (C) 2002-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -16,8 +16,7 @@ */ -#include -#include FT_INTERNAL_DEBUG_H +#include #include "cffcmap.h" #include "cffload.h" diff --git a/src/3rdparty/freetype/src/cff/cffcmap.h b/src/3rdparty/freetype/src/cff/cffcmap.h index 07366bc7..69fab8dc 100644 --- a/src/3rdparty/freetype/src/cff/cffcmap.h +++ b/src/3rdparty/freetype/src/cff/cffcmap.h @@ -4,7 +4,7 @@ * * CFF character mapping table (cmap) support (specification). * - * Copyright (C) 2002-2019 by + * Copyright (C) 2002-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -19,7 +19,7 @@ #ifndef CFFCMAP_H_ #define CFFCMAP_H_ -#include FT_INTERNAL_CFF_OBJECTS_TYPES_H +#include FT_BEGIN_HEADER @@ -43,7 +43,7 @@ FT_BEGIN_HEADER } CFF_CMapStdRec; - FT_DECLARE_CMAP_CLASS(cff_cmap_encoding_class_rec) + FT_DECLARE_CMAP_CLASS( cff_cmap_encoding_class_rec ) /*************************************************************************/ @@ -56,7 +56,7 @@ FT_BEGIN_HEADER /* unicode (synthetic) cmaps */ - FT_DECLARE_CMAP_CLASS(cff_cmap_unicode_class_rec) + FT_DECLARE_CMAP_CLASS( cff_cmap_unicode_class_rec ) FT_END_HEADER diff --git a/src/3rdparty/freetype/src/cff/cffdrivr.c b/src/3rdparty/freetype/src/cff/cffdrivr.c index 23249898..486ab242 100644 --- a/src/3rdparty/freetype/src/cff/cffdrivr.c +++ b/src/3rdparty/freetype/src/cff/cffdrivr.c @@ -4,7 +4,7 @@ * * OpenType font driver implementation (body). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -16,18 +16,17 @@ */ -#include -#include FT_FREETYPE_H -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_STREAM_H -#include FT_INTERNAL_SFNT_H -#include FT_INTERNAL_POSTSCRIPT_AUX_H -#include FT_INTERNAL_POSTSCRIPT_PROPS_H -#include FT_SERVICE_CID_H -#include FT_SERVICE_POSTSCRIPT_INFO_H -#include FT_SERVICE_POSTSCRIPT_NAME_H -#include FT_SERVICE_TT_CMAP_H -#include FT_SERVICE_CFF_TABLE_LOAD_H +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include "cffdrivr.h" #include "cffgload.h" @@ -37,16 +36,16 @@ #include "cffobjs.h" #ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT -#include FT_SERVICE_MULTIPLE_MASTERS_H -#include FT_SERVICE_METRICS_VARIATIONS_H +#include +#include #endif #include "cfferrs.h" -#include FT_SERVICE_FONT_FORMAT_H -#include FT_SERVICE_GLYPH_DICT_H -#include FT_SERVICE_PROPERTIES_H -#include FT_DRIVER_H +#include +#include +#include +#include /************************************************************************** @@ -738,7 +737,7 @@ { if ( dict->cid_supplement < FT_INT_MIN || dict->cid_supplement > FT_INT_MAX ) - FT_TRACE1(( "cff_get_ros: too large supplement %d is truncated\n", + FT_TRACE1(( "cff_get_ros: too large supplement %ld is truncated\n", dict->cid_supplement )); *supplement = (FT_Int)dict->cid_supplement; } diff --git a/src/3rdparty/freetype/src/cff/cffdrivr.h b/src/3rdparty/freetype/src/cff/cffdrivr.h index f2bbcfe4..d198dd35 100644 --- a/src/3rdparty/freetype/src/cff/cffdrivr.h +++ b/src/3rdparty/freetype/src/cff/cffdrivr.h @@ -4,7 +4,7 @@ * * High-level OpenType driver interface (specification). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -20,8 +20,7 @@ #define CFFDRIVER_H_ -#include -#include FT_INTERNAL_DRIVER_H +#include FT_BEGIN_HEADER diff --git a/src/3rdparty/freetype/src/cff/cfferrs.h b/src/3rdparty/freetype/src/cff/cfferrs.h index 78d47a15..5b00a3f0 100644 --- a/src/3rdparty/freetype/src/cff/cfferrs.h +++ b/src/3rdparty/freetype/src/cff/cfferrs.h @@ -4,7 +4,7 @@ * * CFF error codes (specification only). * - * Copyright (C) 2001-2019 by + * Copyright (C) 2001-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -25,7 +25,7 @@ #ifndef CFFERRS_H_ #define CFFERRS_H_ -#include FT_MODULE_ERRORS_H +#include #undef FTERRORS_H_ @@ -34,7 +34,7 @@ #define FT_ERR_BASE FT_Mod_Err_CFF -#include FT_ERRORS_H +#include #endif /* CFFERRS_H_ */ diff --git a/src/3rdparty/freetype/src/cff/cffgload.c b/src/3rdparty/freetype/src/cff/cffgload.c index 36aa7d1b..feee38a4 100644 --- a/src/3rdparty/freetype/src/cff/cffgload.c +++ b/src/3rdparty/freetype/src/cff/cffgload.c @@ -4,7 +4,7 @@ * * OpenType Glyph Loader (body). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -16,14 +16,13 @@ */ -#include -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_STREAM_H -#include FT_INTERNAL_SFNT_H -#include FT_INTERNAL_CALC_H -#include FT_INTERNAL_POSTSCRIPT_AUX_H -#include FT_OUTLINE_H -#include FT_DRIVER_H +#include +#include +#include +#include +#include +#include +#include #include "cffload.h" #include "cffgload.h" @@ -207,8 +206,8 @@ PSAux_Service psaux = (PSAux_Service)face->psaux; const CFF_Decoder_Funcs decoder_funcs = psaux->cff_decoder_funcs; - FT_Matrix font_matrix; - FT_Vector font_offset; + FT_Matrix font_matrix; + FT_Vector font_offset; force_scaling = FALSE; @@ -364,7 +363,6 @@ top_upm = (FT_Long)cff->top_font.font_dict.units_per_em; sub_upm = (FT_Long)cff->subfonts[fd_index]->font_dict.units_per_em; - font_matrix = cff->subfonts[fd_index]->font_dict.font_matrix; font_offset = cff->subfonts[fd_index]->font_dict.font_offset; @@ -399,7 +397,6 @@ PS_Driver driver = (PS_Driver)FT_FACE_DRIVER( face ); #endif - FT_Byte* charstring; FT_ULong charstring_len; @@ -665,8 +662,12 @@ metrics->horiBearingY = cbox.yMax; if ( has_vertical_info ) + { metrics->vertBearingX = metrics->horiBearingX - metrics->horiAdvance / 2; + metrics->vertBearingY = FT_MulFix( metrics->vertBearingY, + glyph->y_scale ); + } else { if ( load_flags & FT_LOAD_VERTICAL_LAYOUT ) diff --git a/src/3rdparty/freetype/src/cff/cffgload.h b/src/3rdparty/freetype/src/cff/cffgload.h index 754c55ac..3b312f45 100644 --- a/src/3rdparty/freetype/src/cff/cffgload.h +++ b/src/3rdparty/freetype/src/cff/cffgload.h @@ -4,7 +4,7 @@ * * OpenType Glyph Loader (specification). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -20,9 +20,8 @@ #define CFFGLOAD_H_ -#include -#include FT_FREETYPE_H -#include FT_INTERNAL_CFF_OBJECTS_TYPES_H +#include +#include FT_BEGIN_HEADER diff --git a/src/3rdparty/freetype/src/cff/cffload.c b/src/3rdparty/freetype/src/cff/cffload.c index 12efd18d..73d3eecd 100644 --- a/src/3rdparty/freetype/src/cff/cffload.c +++ b/src/3rdparty/freetype/src/cff/cffload.c @@ -4,7 +4,7 @@ * * OpenType and CFF data/program tables loader (body). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -16,17 +16,16 @@ */ -#include -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_OBJECTS_H -#include FT_INTERNAL_STREAM_H -#include FT_TRUETYPE_TAGS_H -#include FT_TYPE1_TABLES_H -#include FT_INTERNAL_POSTSCRIPT_AUX_H +#include +#include +#include +#include +#include +#include #ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT -#include FT_MULTIPLE_MASTERS_H -#include FT_SERVICE_MULTIPLE_MASTERS_H +#include +#include #endif #include "cffload.h" @@ -411,7 +410,7 @@ FT_Error error = FT_Err_Ok; FT_Memory memory = idx->stream->memory; - FT_Byte** t = NULL; + FT_Byte** tbl = NULL; FT_Byte* new_bytes = NULL; FT_ULong new_size; @@ -428,11 +427,11 @@ new_size = idx->data_size + idx->count; if ( idx->count > 0 && - !FT_NEW_ARRAY( t, idx->count + 1 ) && + !FT_NEW_ARRAY( tbl, idx->count + 1 ) && ( !pool || !FT_ALLOC( new_bytes, new_size ) ) ) { FT_ULong n, cur_offset; - FT_ULong extra = 0; + FT_ULong extra = 0; FT_Byte* org_bytes = idx->bytes; @@ -443,15 +442,15 @@ if ( cur_offset != 0 ) { FT_TRACE0(( "cff_index_get_pointers:" - " invalid first offset value %d set to zero\n", + " invalid first offset value %ld set to zero\n", cur_offset )); cur_offset = 0; } if ( !pool ) - t[0] = org_bytes + cur_offset; + tbl[0] = org_bytes + cur_offset; else - t[0] = new_bytes + cur_offset; + tbl[0] = new_bytes + cur_offset; for ( n = 1; n <= idx->count; n++ ) { @@ -465,23 +464,25 @@ next_offset = idx->data_size; if ( !pool ) - t[n] = org_bytes + next_offset; + tbl[n] = org_bytes + next_offset; else { - t[n] = new_bytes + next_offset + extra; + tbl[n] = new_bytes + next_offset + extra; if ( next_offset != cur_offset ) { - FT_MEM_COPY( t[n - 1], org_bytes + cur_offset, t[n] - t[n - 1] ); - t[n][0] = '\0'; - t[n] += 1; + FT_MEM_COPY( tbl[n - 1], + org_bytes + cur_offset, + tbl[n] - tbl[n - 1] ); + tbl[n][0] = '\0'; + tbl[n] += 1; extra++; } } cur_offset = next_offset; } - *table = t; + *table = tbl; if ( pool ) *pool = new_bytes; @@ -490,6 +491,11 @@ } Exit: + if ( error && new_bytes ) + FT_FREE( new_bytes ); + if ( error && tbl ) + FT_FREE( tbl ); + return error; } @@ -553,8 +559,8 @@ idx->data_offset > stream->size - off2 + 1 ) { FT_ERROR(( "cff_index_access_element:" - " offset to next entry (%d)" - " exceeds the end of stream (%d)\n", + " offset to next entry (%ld)" + " exceeds the end of stream (%ld)\n", off2, stream->size - idx->data_offset + 1 )); off2 = stream->size - idx->data_offset + 1; } @@ -978,7 +984,7 @@ if ( glyph_sid > 0xFFFFL - nleft ) { FT_ERROR(( "cff_charset_load: invalid SID range trimmed" - " nleft=%d -> %d\n", nleft, 0xFFFFL - glyph_sid )); + " nleft=%d -> %ld\n", nleft, 0xFFFFL - glyph_sid )); nleft = ( FT_UInt )( 0xFFFFL - glyph_sid ); } @@ -1945,7 +1951,7 @@ if ( priv->blue_shift > 1000 || priv->blue_shift < 0 ) { FT_TRACE2(( "cff_load_private_dict:" - " setting unlikely BlueShift value %d to default (7)\n", + " setting unlikely BlueShift value %ld to default (7)\n", priv->blue_shift )); priv->blue_shift = 7; } @@ -1953,7 +1959,7 @@ if ( priv->blue_fuzz > 1000 || priv->blue_fuzz < 0 ) { FT_TRACE2(( "cff_load_private_dict:" - " setting unlikely BlueFuzz value %d to default (1)\n", + " setting unlikely BlueFuzz value %ld to default (1)\n", priv->blue_fuzz )); priv->blue_fuzz = 1; } @@ -2057,7 +2063,7 @@ if ( !error ) { FT_TRACE4(( " top dictionary:\n" )); - error = cff_parser_run( &parser, dict, dict + dict_len ); + error = cff_parser_run( &parser, dict, FT_OFFSET( dict, dict_len ) ); } /* clean up regardless of error */ diff --git a/src/3rdparty/freetype/src/cff/cffload.h b/src/3rdparty/freetype/src/cff/cffload.h index 42d2696f..fc998db2 100644 --- a/src/3rdparty/freetype/src/cff/cffload.h +++ b/src/3rdparty/freetype/src/cff/cffload.h @@ -4,7 +4,7 @@ * * OpenType & CFF data/program tables loader (specification). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -20,10 +20,9 @@ #define CFFLOAD_H_ -#include -#include FT_INTERNAL_CFF_TYPES_H +#include #include "cffparse.h" -#include FT_INTERNAL_CFF_OBJECTS_TYPES_H /* for CFF_Face */ +#include /* for CFF_Face */ FT_BEGIN_HEADER diff --git a/src/3rdparty/freetype/src/cff/cffobjs.c b/src/3rdparty/freetype/src/cff/cffobjs.c index f76245f3..d555d523 100644 --- a/src/3rdparty/freetype/src/cff/cffobjs.c +++ b/src/3rdparty/freetype/src/cff/cffobjs.c @@ -4,7 +4,7 @@ * * OpenType objects manager (body). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -16,32 +16,31 @@ */ -#include -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_CALC_H -#include FT_INTERNAL_STREAM_H -#include FT_ERRORS_H -#include FT_TRUETYPE_IDS_H -#include FT_TRUETYPE_TAGS_H -#include FT_INTERNAL_SFNT_H -#include FT_DRIVER_H +#include +#include +#include +#include +#include +#include +#include +#include #ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT -#include FT_MULTIPLE_MASTERS_H -#include FT_SERVICE_MULTIPLE_MASTERS_H -#include FT_SERVICE_METRICS_VARIATIONS_H +#include +#include +#include #endif -#include FT_INTERNAL_CFF_OBJECTS_TYPES_H +#include #include "cffobjs.h" #include "cffload.h" #include "cffcmap.h" #include "cfferrs.h" -#include FT_INTERNAL_POSTSCRIPT_AUX_H -#include FT_SERVICE_CFF_TABLE_LOAD_H +#include +#include /************************************************************************** @@ -167,46 +166,56 @@ FT_Error error = FT_Err_Ok; PSH_Globals_Funcs funcs = cff_size_get_globals_funcs( size ); + FT_Memory memory = cffsize->face->memory; + CFF_Internal internal = NULL; + CFF_Face face = (CFF_Face)cffsize->face; + CFF_Font font = (CFF_Font)face->extra.data; - if ( funcs ) - { - CFF_Face face = (CFF_Face)cffsize->face; - CFF_Font font = (CFF_Font)face->extra.data; - CFF_Internal internal = NULL; + PS_PrivateRec priv; - PS_PrivateRec priv; - FT_Memory memory = cffsize->face->memory; + FT_UInt i; - FT_UInt i; + if ( !funcs ) + goto Exit; + if ( FT_NEW( internal ) ) + goto Exit; - if ( FT_NEW( internal ) ) - goto Exit; - - cff_make_private_dict( &font->top_font, &priv ); - error = funcs->create( cffsize->face->memory, &priv, + cff_make_private_dict( &font->top_font, &priv ); + error = funcs->create( cffsize->face->memory, &priv, &internal->topfont ); + if ( error ) + goto Exit; + + for ( i = font->num_subfonts; i > 0; i-- ) + { + CFF_SubFont sub = font->subfonts[i - 1]; + + + cff_make_private_dict( sub, &priv ); + error = funcs->create( cffsize->face->memory, &priv, + &internal->subfonts[i - 1] ); if ( error ) goto Exit; - - for ( i = font->num_subfonts; i > 0; i-- ) - { - CFF_SubFont sub = font->subfonts[i - 1]; - - - cff_make_private_dict( sub, &priv ); - error = funcs->create( cffsize->face->memory, &priv, - &internal->subfonts[i - 1] ); - if ( error ) - goto Exit; - } - - cffsize->internal->module_data = internal; } + cffsize->internal->module_data = internal; + size->strike_index = 0xFFFFFFFFUL; Exit: + if ( error ) + { + if ( internal ) + { + for ( i = font->num_subfonts; i > 0; i-- ) + FT_FREE( internal->subfonts[i - 1] ); + FT_FREE( internal->topfont ); + } + + FT_FREE( internal ); + } + return error; } @@ -349,7 +358,8 @@ FT_LOCAL_DEF( void ) cff_slot_done( FT_GlyphSlot slot ) { - slot->internal->glyph_hints = NULL; + if ( slot->internal ) + slot->internal->glyph_hints = NULL; } @@ -940,7 +950,8 @@ style_name = cff_strcpy( memory, fullp ); /* remove the style part from the family name (if present) */ - remove_style( cffface->family_name, style_name ); + if ( style_name ) + remove_style( cffface->family_name, style_name ); } break; } @@ -1018,9 +1029,9 @@ } #ifndef FT_CONFIG_OPTION_NO_GLYPH_NAMES - /* CID-keyed CFF fonts don't have glyph names -- the SFNT loader */ - /* has unset this flag because of the 3.0 `post' table. */ - if ( dict->cid_registry == 0xFFFFU ) + /* CID-keyed CFF or CFF2 fonts don't have glyph names -- the SFNT */ + /* loader has unset this flag because of the 3.0 `post' table. */ + if ( dict->cid_registry == 0xFFFFU && !cff2 ) cffface->face_flags |= FT_FACE_FLAG_GLYPH_NAMES; #endif diff --git a/src/3rdparty/freetype/src/cff/cffobjs.h b/src/3rdparty/freetype/src/cff/cffobjs.h index 03bc78a6..845bd909 100644 --- a/src/3rdparty/freetype/src/cff/cffobjs.h +++ b/src/3rdparty/freetype/src/cff/cffobjs.h @@ -4,7 +4,7 @@ * * OpenType objects manager (specification). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -20,7 +20,6 @@ #define CFFOBJS_H_ -#include FT_BEGIN_HEADER diff --git a/src/3rdparty/freetype/src/cff/cffparse.c b/src/3rdparty/freetype/src/cff/cffparse.c index 008752c3..69bcd5d9 100644 --- a/src/3rdparty/freetype/src/cff/cffparse.c +++ b/src/3rdparty/freetype/src/cff/cffparse.c @@ -4,7 +4,7 @@ * * CFF token stream parser (body) * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -16,13 +16,12 @@ */ -#include #include "cffparse.h" -#include FT_INTERNAL_STREAM_H -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_CALC_H -#include FT_INTERNAL_POSTSCRIPT_AUX_H -#include FT_LIST_H +#include +#include +#include +#include +#include #include "cfferrs.h" #include "cffload.h" @@ -714,7 +713,7 @@ ( max_scaling - min_scaling ) > 9 ) { FT_TRACE1(( "cff_parse_font_matrix:" - " strange scaling values (minimum %d, maximum %d),\n" + " strange scaling values (minimum %ld, maximum %ld),\n" " " " using default matrix\n", min_scaling, max_scaling )); goto Unlikely; @@ -811,7 +810,7 @@ bbox->yMax = FT_RoundFix( cff_parse_fixed( parser, data ) ); error = FT_Err_Ok; - FT_TRACE4(( " [%d %d %d %d]\n", + FT_TRACE4(( " [%ld %ld %ld %ld]\n", bbox->xMin / 65536, bbox->yMin / 65536, bbox->xMax / 65536, @@ -934,11 +933,11 @@ FT_TRACE1(( "cff_parse_cid_ros: real supplement is rounded\n" )); dict->cid_supplement = cff_parse_num( parser, data ); if ( dict->cid_supplement < 0 ) - FT_TRACE1(( "cff_parse_cid_ros: negative supplement %d is found\n", + FT_TRACE1(( "cff_parse_cid_ros: negative supplement %ld is found\n", dict->cid_supplement )); error = FT_Err_Ok; - FT_TRACE4(( " %d %d %d\n", + FT_TRACE4(( " %d %d %ld\n", dict->cid_registry, dict->cid_ordering, dict->cid_supplement )); @@ -1264,11 +1263,11 @@ FT_Byte* charstring_base; FT_ULong charstring_len; - FT_Fixed* stack; - FT_ListNode node; - CFF_T2_String t2; - size_t t2_size; - FT_Byte* q; + FT_Fixed* stack; + FT_ListNode node; + CFF_T2_String t2; + FT_Fixed t2_size; + FT_Byte* q; charstring_base = ++p; diff --git a/src/3rdparty/freetype/src/cff/cffparse.h b/src/3rdparty/freetype/src/cff/cffparse.h index 4e74709a..6f3fbb37 100644 --- a/src/3rdparty/freetype/src/cff/cffparse.h +++ b/src/3rdparty/freetype/src/cff/cffparse.h @@ -4,7 +4,7 @@ * * CFF token stream parser (specification) * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -20,9 +20,8 @@ #define CFFPARSE_H_ -#include -#include FT_INTERNAL_CFF_TYPES_H -#include FT_INTERNAL_OBJECTS_H +#include +#include FT_BEGIN_HEADER diff --git a/src/3rdparty/freetype/src/cff/cffpic.c b/src/3rdparty/freetype/src/cff/cffpic.c deleted file mode 100644 index 08b74c7c..00000000 --- a/src/3rdparty/freetype/src/cff/cffpic.c +++ /dev/null @@ -1,138 +0,0 @@ -/***************************************************************************/ -/* */ -/* cffpic.c */ -/* */ -/* The FreeType position independent code services for cff module. */ -/* */ -/* Copyright 2009-2018 by */ -/* Oran Agra and Mickey Gabel. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#include -#include FT_FREETYPE_H -#include FT_INTERNAL_OBJECTS_H -#include "cffcmap.h" -#include "cffpic.h" -#include "cfferrs.h" - - -#ifdef FT_CONFIG_OPTION_PIC - - /* forward declaration of PIC init functions from cffdrivr.c */ - FT_Error - FT_Create_Class_cff_services( FT_Library library, - FT_ServiceDescRec** output_class ); - void - FT_Destroy_Class_cff_services( FT_Library library, - FT_ServiceDescRec* clazz ); - void - FT_Init_Class_cff_service_ps_info( FT_Library library, - FT_Service_PsInfoRec* clazz ); - void - FT_Init_Class_cff_service_glyph_dict( FT_Library library, - FT_Service_GlyphDictRec* clazz ); - void - FT_Init_Class_cff_service_ps_name( FT_Library library, - FT_Service_PsFontNameRec* clazz ); - void - FT_Init_Class_cff_service_get_cmap_info( FT_Library library, - FT_Service_TTCMapsRec* clazz ); - void - FT_Init_Class_cff_service_cid_info( FT_Library library, - FT_Service_CIDRec* clazz ); - - /* forward declaration of PIC init functions from cffparse.c */ - FT_Error - FT_Create_Class_cff_field_handlers( FT_Library library, - CFF_Field_Handler** output_class ); - void - FT_Destroy_Class_cff_field_handlers( FT_Library library, - CFF_Field_Handler* clazz ); - - - void - cff_driver_class_pic_free( FT_Library library ) - { - FT_PIC_Container* pic_container = &library->pic_container; - FT_Memory memory = library->memory; - - - if ( pic_container->cff ) - { - CffModulePIC* container = (CffModulePIC*)pic_container->cff; - - - if ( container->cff_services ) - FT_Destroy_Class_cff_services( library, - container->cff_services ); - container->cff_services = NULL; - if ( container->cff_field_handlers ) - FT_Destroy_Class_cff_field_handlers( - library, container->cff_field_handlers ); - container->cff_field_handlers = NULL; - FT_FREE( container ); - pic_container->cff = NULL; - } - } - - - FT_Error - cff_driver_class_pic_init( FT_Library library ) - { - FT_PIC_Container* pic_container = &library->pic_container; - FT_Error error = FT_Err_Ok; - CffModulePIC* container = NULL; - FT_Memory memory = library->memory; - - - /* allocate pointer, clear and set global container pointer */ - if ( FT_ALLOC ( container, sizeof ( *container ) ) ) - return error; - FT_MEM_SET( container, 0, sizeof ( *container ) ); - pic_container->cff = container; - - /* initialize pointer table - */ - /* this is how the module usually expects this data */ - error = FT_Create_Class_cff_services( library, - &container->cff_services ); - if ( error ) - goto Exit; - - error = FT_Create_Class_cff_field_handlers( - library, &container->cff_field_handlers ); - if ( error ) - goto Exit; - - FT_Init_Class_cff_service_ps_info( - library, &container->cff_service_ps_info ); - FT_Init_Class_cff_service_glyph_dict( - library, &container->cff_service_glyph_dict ); - FT_Init_Class_cff_service_ps_name( - library, &container->cff_service_ps_name ); - FT_Init_Class_cff_service_get_cmap_info( - library, &container->cff_service_get_cmap_info ); - FT_Init_Class_cff_service_cid_info( - library, &container->cff_service_cid_info ); - FT_Init_Class_cff_cmap_encoding_class_rec( - library, &container->cff_cmap_encoding_class_rec ); - FT_Init_Class_cff_cmap_unicode_class_rec( - library, &container->cff_cmap_unicode_class_rec ); - - Exit: - if ( error ) - cff_driver_class_pic_free( library ); - return error; - } - -#endif /* FT_CONFIG_OPTION_PIC */ - - -/* END */ diff --git a/src/3rdparty/freetype/src/cff/cffpic.h b/src/3rdparty/freetype/src/cff/cffpic.h deleted file mode 100644 index 8ba4203a..00000000 --- a/src/3rdparty/freetype/src/cff/cffpic.h +++ /dev/null @@ -1,121 +0,0 @@ -/***************************************************************************/ -/* */ -/* cffpic.h */ -/* */ -/* The FreeType position independent code services for cff module. */ -/* */ -/* Copyright 2009-2018 by */ -/* Oran Agra and Mickey Gabel. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef CFFPIC_H_ -#define CFFPIC_H_ - - -#include FT_INTERNAL_PIC_H - -#ifndef FT_CONFIG_OPTION_PIC - -#define CFF_SERVICE_PS_INFO_GET cff_service_ps_info -#define CFF_SERVICE_GLYPH_DICT_GET cff_service_glyph_dict -#define CFF_SERVICE_PS_NAME_GET cff_service_ps_name -#define CFF_SERVICE_GET_CMAP_INFO_GET cff_service_get_cmap_info -#define CFF_SERVICE_CID_INFO_GET cff_service_cid_info -#define CFF_SERVICE_PROPERTIES_GET cff_service_properties -#define CFF_SERVICES_GET cff_services -#define CFF_SERVICE_MULTI_MASTERS_GET cff_service_multi_masters -#define CFF_SERVICE_METRICS_VAR_GET cff_service_metrics_variations -#define CFF_SERVICE_CFF_LOAD_GET cff_service_cff_load -#define CFF_CMAP_ENCODING_CLASS_REC_GET cff_cmap_encoding_class_rec -#define CFF_CMAP_UNICODE_CLASS_REC_GET cff_cmap_unicode_class_rec -#define CFF_FIELD_HANDLERS_GET cff_field_handlers - -#else /* FT_CONFIG_OPTION_PIC */ - -#include FT_SERVICE_GLYPH_DICT_H -#include "cffparse.h" -#include FT_SERVICE_POSTSCRIPT_INFO_H -#include FT_SERVICE_POSTSCRIPT_NAME_H -#include FT_SERVICE_TT_CMAP_H -#include FT_SERVICE_CID_H -#include FT_SERVICE_PROPERTIES_H -#include FT_SERVICE_MULTIPLE_MASTERS_H -#include FT_SERVICE_METRICS_VARIATIONS_H - - -FT_BEGIN_HEADER - - typedef struct CffModulePIC_ - { - FT_ServiceDescRec* cff_services; - CFF_Field_Handler* cff_field_handlers; - FT_Service_PsInfoRec cff_service_ps_info; - FT_Service_GlyphDictRec cff_service_glyph_dict; - FT_Service_PsFontNameRec cff_service_ps_name; - FT_Service_TTCMapsRec cff_service_get_cmap_info; - FT_Service_CIDRec cff_service_cid_info; - FT_Service_PropertiesRec cff_service_properties; - FT_Service_MultiMastersRec cff_service_multi_masters; - FT_Service_MetricsVariationsRec cff_service_metrics_variations; - FT_Service_CFFLoadRec cff_service_cff_load; - FT_CMap_ClassRec cff_cmap_encoding_class_rec; - FT_CMap_ClassRec cff_cmap_unicode_class_rec; - - } CffModulePIC; - - -#define GET_PIC( lib ) \ - ( (CffModulePIC*)( (lib)->pic_container.cff ) ) - -#define CFF_SERVICE_PS_INFO_GET \ - ( GET_PIC( library )->cff_service_ps_info ) -#define CFF_SERVICE_GLYPH_DICT_GET \ - ( GET_PIC( library )->cff_service_glyph_dict ) -#define CFF_SERVICE_PS_NAME_GET \ - ( GET_PIC( library )->cff_service_ps_name ) -#define CFF_SERVICE_GET_CMAP_INFO_GET \ - ( GET_PIC( library )->cff_service_get_cmap_info ) -#define CFF_SERVICE_CID_INFO_GET \ - ( GET_PIC( library )->cff_service_cid_info ) -#define CFF_SERVICE_PROPERTIES_GET \ - ( GET_PIC( library )->cff_service_properties ) -#define CFF_SERVICES_GET \ - ( GET_PIC( library )->cff_services ) -#define CFF_SERVICE_MULTI_MASTERS_GET \ - ( GET_PIC( library )->cff_service_multi_masters ) -#define CFF_SERVICE_METRICS_VAR_GET \ - ( GET_PIC( library )->cff_service_metrics_variations ) -#define CFF_SERVICE_CFF_LOAD_GET \ - ( GET_PIC( library )->cff_service_cff_load ) -#define CFF_CMAP_ENCODING_CLASS_REC_GET \ - ( GET_PIC( library )->cff_cmap_encoding_class_rec ) -#define CFF_CMAP_UNICODE_CLASS_REC_GET \ - ( GET_PIC( library )->cff_cmap_unicode_class_rec ) -#define CFF_FIELD_HANDLERS_GET \ - ( GET_PIC( library )->cff_field_handlers ) - - /* see cffpic.c for the implementation */ - void - cff_driver_class_pic_free( FT_Library library ); - - FT_Error - cff_driver_class_pic_init( FT_Library library ); - -FT_END_HEADER - -#endif /* FT_CONFIG_OPTION_PIC */ - - /* */ - -#endif /* CFFPIC_H_ */ - - -/* END */ diff --git a/src/3rdparty/freetype/src/cff/cfftoken.h b/src/3rdparty/freetype/src/cff/cfftoken.h index 063a7b3b..4c6a53ee 100644 --- a/src/3rdparty/freetype/src/cff/cfftoken.h +++ b/src/3rdparty/freetype/src/cff/cfftoken.h @@ -4,7 +4,7 @@ * * CFF token definitions (specification only). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, diff --git a/src/3rdparty/freetype/src/cff/cfftypes.h b/src/3rdparty/freetype/src/cff/cfftypes.h deleted file mode 100644 index de8a5ee9..00000000 --- a/src/3rdparty/freetype/src/cff/cfftypes.h +++ /dev/null @@ -1,284 +0,0 @@ -/***************************************************************************/ -/* */ -/* cfftypes.h */ -/* */ -/* Basic OpenType/CFF type definitions and interface (specification */ -/* only). */ -/* */ -/* Copyright 1996-2015 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __CFFTYPES_H__ -#define __CFFTYPES_H__ - - -#include -#include FT_FREETYPE_H -#include FT_TYPE1_TABLES_H -#include FT_INTERNAL_SERVICE_H -#include FT_SERVICE_POSTSCRIPT_CMAPS_H -#include FT_INTERNAL_POSTSCRIPT_HINTS_H - - -FT_BEGIN_HEADER - - - /*************************************************************************/ - /* */ - /* */ - /* CFF_IndexRec */ - /* */ - /* */ - /* A structure used to model a CFF Index table. */ - /* */ - /* */ - /* stream :: The source input stream. */ - /* */ - /* start :: The position of the first index byte in the */ - /* input stream. */ - /* */ - /* count :: The number of elements in the index. */ - /* */ - /* off_size :: The size in bytes of object offsets in index. */ - /* */ - /* data_offset :: The position of first data byte in the index's */ - /* bytes. */ - /* */ - /* data_size :: The size of the data table in this index. */ - /* */ - /* offsets :: A table of element offsets in the index. Must be */ - /* loaded explicitly. */ - /* */ - /* bytes :: If the index is loaded in memory, its bytes. */ - /* */ - typedef struct CFF_IndexRec_ - { - FT_Stream stream; - FT_ULong start; - FT_UInt count; - FT_Byte off_size; - FT_ULong data_offset; - FT_ULong data_size; - - FT_ULong* offsets; - FT_Byte* bytes; - - } CFF_IndexRec, *CFF_Index; - - - typedef struct CFF_EncodingRec_ - { - FT_UInt format; - FT_ULong offset; - - FT_UInt count; - FT_UShort sids [256]; /* avoid dynamic allocations */ - FT_UShort codes[256]; - - } CFF_EncodingRec, *CFF_Encoding; - - - typedef struct CFF_CharsetRec_ - { - - FT_UInt format; - FT_ULong offset; - - FT_UShort* sids; - FT_UShort* cids; /* the inverse mapping of `sids'; only needed */ - /* for CID-keyed fonts */ - FT_UInt max_cid; - FT_UInt num_glyphs; - - } CFF_CharsetRec, *CFF_Charset; - - - typedef struct CFF_FontRecDictRec_ - { - FT_UInt version; - FT_UInt notice; - FT_UInt copyright; - FT_UInt full_name; - FT_UInt family_name; - FT_UInt weight; - FT_Bool is_fixed_pitch; - FT_Fixed italic_angle; - FT_Fixed underline_position; - FT_Fixed underline_thickness; - FT_Int paint_type; - FT_Int charstring_type; - FT_Matrix font_matrix; - FT_Bool has_font_matrix; - FT_ULong units_per_em; /* temporarily used as scaling value also */ - FT_Vector font_offset; - FT_ULong unique_id; - FT_BBox font_bbox; - FT_Pos stroke_width; - FT_ULong charset_offset; - FT_ULong encoding_offset; - FT_ULong charstrings_offset; - FT_ULong private_offset; - FT_ULong private_size; - FT_Long synthetic_base; - FT_UInt embedded_postscript; - - /* these should only be used for the top-level font dictionary */ - FT_UInt cid_registry; - FT_UInt cid_ordering; - FT_Long cid_supplement; - - FT_Long cid_font_version; - FT_Long cid_font_revision; - FT_Long cid_font_type; - FT_ULong cid_count; - FT_ULong cid_uid_base; - FT_ULong cid_fd_array_offset; - FT_ULong cid_fd_select_offset; - FT_UInt cid_font_name; - - } CFF_FontRecDictRec, *CFF_FontRecDict; - - - typedef struct CFF_PrivateRec_ - { - FT_Byte num_blue_values; - FT_Byte num_other_blues; - FT_Byte num_family_blues; - FT_Byte num_family_other_blues; - - FT_Pos blue_values[14]; - FT_Pos other_blues[10]; - FT_Pos family_blues[14]; - FT_Pos family_other_blues[10]; - - FT_Fixed blue_scale; - FT_Pos blue_shift; - FT_Pos blue_fuzz; - FT_Pos standard_width; - FT_Pos standard_height; - - FT_Byte num_snap_widths; - FT_Byte num_snap_heights; - FT_Pos snap_widths[13]; - FT_Pos snap_heights[13]; - FT_Bool force_bold; - FT_Fixed force_bold_threshold; - FT_Int lenIV; - FT_Int language_group; - FT_Fixed expansion_factor; - FT_Long initial_random_seed; - FT_ULong local_subrs_offset; - FT_Pos default_width; - FT_Pos nominal_width; - - } CFF_PrivateRec, *CFF_Private; - - - typedef struct CFF_FDSelectRec_ - { - FT_Byte format; - FT_UInt range_count; - - /* that's the table, taken from the file `as is' */ - FT_Byte* data; - FT_UInt data_size; - - /* small cache for format 3 only */ - FT_UInt cache_first; - FT_UInt cache_count; - FT_Byte cache_fd; - - } CFF_FDSelectRec, *CFF_FDSelect; - - - /* A SubFont packs a font dict and a private dict together. They are */ - /* needed to support CID-keyed CFF fonts. */ - typedef struct CFF_SubFontRec_ - { - CFF_FontRecDictRec font_dict; - CFF_PrivateRec private_dict; - - CFF_IndexRec local_subrs_index; - FT_Byte** local_subrs; /* array of pointers into Local Subrs INDEX data */ - - } CFF_SubFontRec, *CFF_SubFont; - - -#define CFF_MAX_CID_FONTS 256 - - - typedef struct CFF_FontRec_ - { - FT_Stream stream; - FT_Memory memory; - FT_UInt num_faces; - FT_UInt num_glyphs; - - FT_Byte version_major; - FT_Byte version_minor; - FT_Byte header_size; - FT_Byte absolute_offsize; - - - CFF_IndexRec name_index; - CFF_IndexRec top_dict_index; - CFF_IndexRec global_subrs_index; - - CFF_EncodingRec encoding; - CFF_CharsetRec charset; - - CFF_IndexRec charstrings_index; - CFF_IndexRec font_dict_index; - CFF_IndexRec private_index; - CFF_IndexRec local_subrs_index; - - FT_String* font_name; - - /* array of pointers into Global Subrs INDEX data */ - FT_Byte** global_subrs; - - /* array of pointers into String INDEX data stored at string_pool */ - FT_UInt num_strings; - FT_Byte** strings; - FT_Byte* string_pool; - - CFF_SubFontRec top_font; - FT_UInt num_subfonts; - CFF_SubFont subfonts[CFF_MAX_CID_FONTS]; - - CFF_FDSelectRec fd_select; - - /* interface to PostScript hinter */ - PSHinter_Service pshinter; - - /* interface to Postscript Names service */ - FT_Service_PsCMaps psnames; - - /* since version 2.3.0 */ - PS_FontInfoRec* font_info; /* font info dictionary */ - - /* since version 2.3.6 */ - FT_String* registry; - FT_String* ordering; - - /* since version 2.4.12 */ - FT_Generic cf2_instance; - - } CFF_FontRec, *CFF_Font; - - -FT_END_HEADER - -#endif /* __CFFTYPES_H__ */ - - -/* END */ diff --git a/src/3rdparty/freetype/src/cff/module.mk b/src/3rdparty/freetype/src/cff/module.mk index 8c610959..bd728c6a 100644 --- a/src/3rdparty/freetype/src/cff/module.mk +++ b/src/3rdparty/freetype/src/cff/module.mk @@ -3,7 +3,7 @@ # -# Copyright (C) 1996-2019 by +# Copyright (C) 1996-2020 by # David Turner, Robert Wilhelm, and Werner Lemberg. # # This file is part of the FreeType project, and may only be used, modified, diff --git a/src/3rdparty/freetype/src/cff/rules.mk b/src/3rdparty/freetype/src/cff/rules.mk index 6e2dc476..70bb92d5 100644 --- a/src/3rdparty/freetype/src/cff/rules.mk +++ b/src/3rdparty/freetype/src/cff/rules.mk @@ -3,7 +3,7 @@ # -# Copyright (C) 1996-2019 by +# Copyright (C) 1996-2020 by # David Turner, Robert Wilhelm, and Werner Lemberg. # # This file is part of the FreeType project, and may only be used, modified, diff --git a/src/3rdparty/freetype/src/cid/Jamfile b/src/3rdparty/freetype/src/cid/Jamfile deleted file mode 100644 index 1cfb7025..00000000 --- a/src/3rdparty/freetype/src/cid/Jamfile +++ /dev/null @@ -1,34 +0,0 @@ -# FreeType 2 src/cid Jamfile -# -# Copyright (C) 2001-2019 by -# David Turner, Robert Wilhelm, and Werner Lemberg. -# -# This file is part of the FreeType project, and may only be used, modified, -# and distributed under the terms of the FreeType project license, -# LICENSE.TXT. By continuing to use, modify, or distribute this file you -# indicate that you have read the license and understand and accept it -# fully. - -SubDir FT2_TOP $(FT2_SRC_DIR) cid ; - -{ - local _sources ; - - if $(FT2_MULTI) - { - _sources = cidgload - cidload - cidobjs - cidparse - cidriver - ; - } - else - { - _sources = type1cid ; - } - - Library $(FT2_LIB) : $(_sources).c ; -} - -# end of src/cid Jamfile diff --git a/src/3rdparty/freetype/src/cid/ciderrs.h b/src/3rdparty/freetype/src/cid/ciderrs.h index be80bed3..f698bb22 100644 --- a/src/3rdparty/freetype/src/cid/ciderrs.h +++ b/src/3rdparty/freetype/src/cid/ciderrs.h @@ -4,7 +4,7 @@ * * CID error codes (specification only). * - * Copyright (C) 2001-2019 by + * Copyright (C) 2001-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -25,7 +25,7 @@ #ifndef CIDERRS_H_ #define CIDERRS_H_ -#include FT_MODULE_ERRORS_H +#include #undef FTERRORS_H_ @@ -33,7 +33,7 @@ #define FT_ERR_PREFIX CID_Err_ #define FT_ERR_BASE FT_Mod_Err_CID -#include FT_ERRORS_H +#include #endif /* CIDERRS_H_ */ diff --git a/src/3rdparty/freetype/src/cid/cidgload.c b/src/3rdparty/freetype/src/cid/cidgload.c index f59f2880..54aa62f8 100644 --- a/src/3rdparty/freetype/src/cid/cidgload.c +++ b/src/3rdparty/freetype/src/cid/cidgload.c @@ -4,7 +4,7 @@ * * CID-keyed Type1 Glyph Loader (body). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -16,17 +16,16 @@ */ -#include #include "cidload.h" #include "cidgload.h" -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_STREAM_H -#include FT_OUTLINE_H -#include FT_INTERNAL_CALC_H +#include +#include +#include +#include -#include FT_INTERNAL_POSTSCRIPT_AUX_H -#include FT_INTERNAL_CFF_TYPES_H -#include FT_DRIVER_H +#include +#include +#include #include "ciderrs.h" diff --git a/src/3rdparty/freetype/src/cid/cidgload.h b/src/3rdparty/freetype/src/cid/cidgload.h index 37eba7ca..da36e37e 100644 --- a/src/3rdparty/freetype/src/cid/cidgload.h +++ b/src/3rdparty/freetype/src/cid/cidgload.h @@ -4,7 +4,7 @@ * * OpenType Glyph Loader (specification). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -20,7 +20,6 @@ #define CIDGLOAD_H_ -#include #include "cidobjs.h" diff --git a/src/3rdparty/freetype/src/cid/cidload.c b/src/3rdparty/freetype/src/cid/cidload.c index fce3e37d..bb9136a3 100644 --- a/src/3rdparty/freetype/src/cid/cidload.c +++ b/src/3rdparty/freetype/src/cid/cidload.c @@ -4,7 +4,7 @@ * * CID-keyed Type1 font loader (body). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -17,11 +17,11 @@ #include -#include FT_INTERNAL_DEBUG_H +#include #include FT_CONFIG_CONFIG_H -#include FT_MULTIPLE_MASTERS_H -#include FT_INTERNAL_TYPE1_TYPES_H -#include FT_INTERNAL_POSTSCRIPT_AUX_H +#include +#include +#include #include "cidload.h" @@ -254,7 +254,7 @@ goto Exit; } - FT_TRACE4(( " %d\n", num_dicts )); + FT_TRACE4(( " %ld\n", num_dicts )); /* * A single entry in the FDArray must (at least) contain the following @@ -275,7 +275,7 @@ if ( (FT_ULong)num_dicts > stream->size / 100 ) { FT_TRACE0(( "parse_fd_array: adjusting FDArray size" - " (from %d to %d)\n", + " (from %ld to %ld)\n", num_dicts, stream->size / 100 )); num_dicts = (FT_Long)( stream->size / 100 ); @@ -329,7 +329,7 @@ dict->expansion_factor = cid_parser_to_fixed( parser, 0 ); dict->private_dict.expansion_factor = dict->expansion_factor; - FT_TRACE4(( "%d\n", dict->expansion_factor )); + FT_TRACE4(( "%ld\n", dict->expansion_factor )); } return; @@ -715,7 +715,7 @@ if ( ft_isdigit( *p ) ) val = (FT_Byte)( *p - '0' ); else if ( *p >= 'a' && *p <= 'f' ) - val = (FT_Byte)( *p - 'a' ); + val = (FT_Byte)( *p - 'a' + 10 ); else if ( *p >= 'A' && *p <= 'F' ) val = (FT_Byte)( *p - 'A' + 10 ); else if ( *p == ' ' || @@ -804,7 +804,7 @@ face->root.stream->size - parser->data_offset ) { FT_TRACE0(( "cid_face_open: adjusting length of binary data\n" - " (from %d to %d bytes)\n", + " (from %ld to %ld bytes)\n", parser->binary_length, face->root.stream->size - parser->data_offset )); parser->binary_length = face->root.stream->size - diff --git a/src/3rdparty/freetype/src/cid/cidload.h b/src/3rdparty/freetype/src/cid/cidload.h index fb9d4621..06fb9ef4 100644 --- a/src/3rdparty/freetype/src/cid/cidload.h +++ b/src/3rdparty/freetype/src/cid/cidload.h @@ -4,7 +4,7 @@ * * CID-keyed Type1 font loader (specification). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -20,8 +20,7 @@ #define CIDLOAD_H_ -#include -#include FT_INTERNAL_STREAM_H +#include #include "cidparse.h" diff --git a/src/3rdparty/freetype/src/cid/cidobjs.c b/src/3rdparty/freetype/src/cid/cidobjs.c index 4e972871..04b295eb 100644 --- a/src/3rdparty/freetype/src/cid/cidobjs.c +++ b/src/3rdparty/freetype/src/cid/cidobjs.c @@ -4,7 +4,7 @@ * * CID objects manager (body). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -16,17 +16,16 @@ */ -#include -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_STREAM_H +#include +#include #include "cidgload.h" #include "cidload.h" -#include FT_SERVICE_POSTSCRIPT_CMAPS_H -#include FT_INTERNAL_POSTSCRIPT_AUX_H -#include FT_INTERNAL_POSTSCRIPT_HINTS_H -#include FT_DRIVER_H +#include +#include +#include +#include #include "ciderrs.h" @@ -50,7 +49,8 @@ FT_LOCAL_DEF( void ) cid_slot_done( FT_GlyphSlot slot ) { - slot->internal->glyph_hints = NULL; + if ( slot->internal ) + slot->internal->glyph_hints = NULL; } diff --git a/src/3rdparty/freetype/src/cid/cidobjs.h b/src/3rdparty/freetype/src/cid/cidobjs.h index 89c9aa74..6ae30613 100644 --- a/src/3rdparty/freetype/src/cid/cidobjs.h +++ b/src/3rdparty/freetype/src/cid/cidobjs.h @@ -4,7 +4,7 @@ * * CID objects manager (specification). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -21,9 +21,9 @@ #include -#include FT_INTERNAL_OBJECTS_H +#include #include FT_CONFIG_CONFIG_H -#include FT_INTERNAL_TYPE1_TYPES_H +#include FT_BEGIN_HEADER diff --git a/src/3rdparty/freetype/src/cid/cidparse.c b/src/3rdparty/freetype/src/cid/cidparse.c index 1be46ec3..1fc098b4 100644 --- a/src/3rdparty/freetype/src/cid/cidparse.c +++ b/src/3rdparty/freetype/src/cid/cidparse.c @@ -4,7 +4,7 @@ * * CID-keyed Type1 parser (body). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -16,10 +16,9 @@ */ -#include -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_OBJECTS_H -#include FT_INTERNAL_STREAM_H +#include +#include +#include #include "cidparse.h" diff --git a/src/3rdparty/freetype/src/cid/cidparse.h b/src/3rdparty/freetype/src/cid/cidparse.h index ec1f6a34..0b49bebf 100644 --- a/src/3rdparty/freetype/src/cid/cidparse.h +++ b/src/3rdparty/freetype/src/cid/cidparse.h @@ -4,7 +4,7 @@ * * CID-keyed Type1 parser (specification). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -20,10 +20,9 @@ #define CIDPARSE_H_ -#include -#include FT_INTERNAL_TYPE1_TYPES_H -#include FT_INTERNAL_STREAM_H -#include FT_INTERNAL_POSTSCRIPT_AUX_H +#include +#include +#include FT_BEGIN_HEADER diff --git a/src/3rdparty/freetype/src/cid/cidriver.c b/src/3rdparty/freetype/src/cid/cidriver.c index 4d91e875..d08cea1d 100644 --- a/src/3rdparty/freetype/src/cid/cidriver.c +++ b/src/3rdparty/freetype/src/cid/cidriver.c @@ -4,7 +4,7 @@ * * CID driver interface (body). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -16,22 +16,21 @@ */ -#include #include "cidriver.h" #include "cidgload.h" -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_POSTSCRIPT_PROPS_H +#include +#include #include "ciderrs.h" -#include FT_SERVICE_POSTSCRIPT_NAME_H -#include FT_SERVICE_FONT_FORMAT_H -#include FT_SERVICE_POSTSCRIPT_INFO_H -#include FT_SERVICE_CID_H -#include FT_SERVICE_PROPERTIES_H -#include FT_DRIVER_H +#include +#include +#include +#include +#include +#include -#include FT_INTERNAL_POSTSCRIPT_AUX_H +#include /************************************************************************** diff --git a/src/3rdparty/freetype/src/cid/cidriver.h b/src/3rdparty/freetype/src/cid/cidriver.h index 3402fd7e..0fc8ed37 100644 --- a/src/3rdparty/freetype/src/cid/cidriver.h +++ b/src/3rdparty/freetype/src/cid/cidriver.h @@ -4,7 +4,7 @@ * * High-level CID driver interface (specification). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -20,8 +20,7 @@ #define CIDRIVER_H_ -#include -#include FT_INTERNAL_DRIVER_H +#include FT_BEGIN_HEADER diff --git a/src/3rdparty/freetype/src/cid/cidtoken.h b/src/3rdparty/freetype/src/cid/cidtoken.h index f505c9e1..e9f068bb 100644 --- a/src/3rdparty/freetype/src/cid/cidtoken.h +++ b/src/3rdparty/freetype/src/cid/cidtoken.h @@ -4,7 +4,7 @@ * * CID token definitions (specification only). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, diff --git a/src/3rdparty/freetype/src/cid/module.mk b/src/3rdparty/freetype/src/cid/module.mk index 875c683c..9fb02235 100644 --- a/src/3rdparty/freetype/src/cid/module.mk +++ b/src/3rdparty/freetype/src/cid/module.mk @@ -3,7 +3,7 @@ # -# Copyright (C) 1996-2019 by +# Copyright (C) 1996-2020 by # David Turner, Robert Wilhelm, and Werner Lemberg. # # This file is part of the FreeType project, and may only be used, modified, diff --git a/src/3rdparty/freetype/src/cid/rules.mk b/src/3rdparty/freetype/src/cid/rules.mk index 2b68dd48..94f663c8 100644 --- a/src/3rdparty/freetype/src/cid/rules.mk +++ b/src/3rdparty/freetype/src/cid/rules.mk @@ -3,7 +3,7 @@ # -# Copyright (C) 1996-2019 by +# Copyright (C) 1996-2020 by # David Turner, Robert Wilhelm, and Werner Lemberg. # # This file is part of the FreeType project, and may only be used, modified, diff --git a/src/3rdparty/freetype/src/cid/type1cid.c b/src/3rdparty/freetype/src/cid/type1cid.c index d21801ce..082e8bfe 100644 --- a/src/3rdparty/freetype/src/cid/type1cid.c +++ b/src/3rdparty/freetype/src/cid/type1cid.c @@ -4,7 +4,7 @@ * * FreeType OpenType driver component (body only). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -17,7 +17,6 @@ #define FT_MAKE_OPTION_SINGLE_OBJECT -#include #include "cidgload.c" #include "cidload.c" diff --git a/src/3rdparty/freetype/src/gxvalid/Jamfile b/src/3rdparty/freetype/src/gxvalid/Jamfile deleted file mode 100644 index a08e7a99..00000000 --- a/src/3rdparty/freetype/src/gxvalid/Jamfile +++ /dev/null @@ -1,52 +0,0 @@ -# FreeType 2 src/gxvalid Jamfile -# -# Copyright (C) 2005-2019 by -# suzuki toshiya, Masatake YAMATO and Red Hat K.K. -# -# This file is part of the FreeType project, and may only be used, modified, -# and distributed under the terms of the FreeType project license, -# LICENSE.TXT. By continuing to use, modify, or distribute this file you -# indicate that you have read the license and understand and accept it -# fully. - -SubDir FT2_TOP $(FT2_SRC_DIR) gxvalid ; - - -{ - local _sources ; - - if $(FT2_MULTI) - { - _sources = gxvbsln - gxvcommn - gxvfeat - gxvjust - gxvkern - gxvlcar - gxvmod - gxvmort - gxvmort0 - gxvmort1 - gxvmort2 - gxvmort4 - gxvmort5 - gxvmorx - gxvmorx0 - gxvmorx1 - gxvmorx2 - gxvmorx4 - gxvmorx5 - gxvopbd - gxvprop - gxvtrak - ; - } - else - { - _sources = gxvalid ; - } - - Library $(FT2_LIB) : $(_sources).c ; -} - -# end of src/gxvalid Jamfile diff --git a/src/3rdparty/freetype/src/gxvalid/README b/src/3rdparty/freetype/src/gxvalid/README index d4935878..2a32bab2 100644 --- a/src/3rdparty/freetype/src/gxvalid/README +++ b/src/3rdparty/freetype/src/gxvalid/README @@ -518,7 +518,7 @@ gxvalid: TrueType GX validator ------------------------------------------------------------------------ -Copyright (C) 2004-2019 by +Copyright (C) 2004-2020 by suzuki toshiya, Masatake YAMATO, Red hat K.K., David Turner, Robert Wilhelm, and Werner Lemberg. diff --git a/src/3rdparty/freetype/src/gxvalid/gxvalid.c b/src/3rdparty/freetype/src/gxvalid/gxvalid.c index 462e461b..683b8a69 100644 --- a/src/3rdparty/freetype/src/gxvalid/gxvalid.c +++ b/src/3rdparty/freetype/src/gxvalid/gxvalid.c @@ -4,7 +4,7 @@ * * FreeType validator for TrueTypeGX/AAT tables (body only). * - * Copyright (C) 2005-2019 by + * Copyright (C) 2005-2020 by * suzuki toshiya, Masatake YAMATO, Red Hat K.K., * David Turner, Robert Wilhelm, and Werner Lemberg. * @@ -18,7 +18,6 @@ #define FT_MAKE_OPTION_SINGLE_OBJECT -#include #include "gxvbsln.c" #include "gxvcommn.c" diff --git a/src/3rdparty/freetype/src/gxvalid/gxvalid.h b/src/3rdparty/freetype/src/gxvalid/gxvalid.h index 969cd092..ff2812da 100644 --- a/src/3rdparty/freetype/src/gxvalid/gxvalid.h +++ b/src/3rdparty/freetype/src/gxvalid/gxvalid.h @@ -4,7 +4,7 @@ * * TrueTypeGX/AAT table validation (specification only). * - * Copyright (C) 2005-2019 by + * Copyright (C) 2005-2020 by * suzuki toshiya, Masatake YAMATO, Red Hat K.K., * David Turner, Robert Wilhelm, and Werner Lemberg. * @@ -28,13 +28,12 @@ #ifndef GXVALID_H_ #define GXVALID_H_ -#include -#include FT_FREETYPE_H +#include -#include "gxverror.h" /* must come before FT_INTERNAL_VALIDATE_H */ +#include "gxverror.h" /* must come before `ftvalid.h' */ -#include FT_INTERNAL_VALIDATE_H -#include FT_INTERNAL_STREAM_H +#include +#include FT_BEGIN_HEADER diff --git a/src/3rdparty/freetype/src/gxvalid/gxvbsln.c b/src/3rdparty/freetype/src/gxvalid/gxvbsln.c index f22f2545..ac58d461 100644 --- a/src/3rdparty/freetype/src/gxvalid/gxvbsln.c +++ b/src/3rdparty/freetype/src/gxvalid/gxvbsln.c @@ -4,7 +4,7 @@ * * TrueTypeGX/AAT bsln table validation (body). * - * Copyright (C) 2004-2019 by + * Copyright (C) 2004-2020 by * suzuki toshiya, Masatake YAMATO, Red Hat K.K., * David Turner, Robert Wilhelm, and Werner Lemberg. * diff --git a/src/3rdparty/freetype/src/gxvalid/gxvcommn.c b/src/3rdparty/freetype/src/gxvalid/gxvcommn.c index c5cb8ebe..ead0f24c 100644 --- a/src/3rdparty/freetype/src/gxvalid/gxvcommn.c +++ b/src/3rdparty/freetype/src/gxvalid/gxvcommn.c @@ -4,7 +4,7 @@ * * TrueTypeGX/AAT common tables validation (body). * - * Copyright (C) 2004-2019 by + * Copyright (C) 2004-2020 by * suzuki toshiya, Masatake YAMATO, Red Hat K.K., * David Turner, Robert Wilhelm, and Werner Lemberg. * diff --git a/src/3rdparty/freetype/src/gxvalid/gxvcommn.h b/src/3rdparty/freetype/src/gxvalid/gxvcommn.h index 334dc9df..59d14921 100644 --- a/src/3rdparty/freetype/src/gxvalid/gxvcommn.h +++ b/src/3rdparty/freetype/src/gxvalid/gxvcommn.h @@ -4,7 +4,7 @@ * * TrueTypeGX/AAT common tables validation (specification). * - * Copyright (C) 2004-2019 by + * Copyright (C) 2004-2020 by * suzuki toshiya, Masatake YAMATO, Red Hat K.K., * David Turner, Robert Wilhelm, and Werner Lemberg. * @@ -43,10 +43,9 @@ #define GXVCOMMN_H_ -#include #include "gxvalid.h" -#include FT_INTERNAL_DEBUG_H -#include FT_SFNT_NAMES_H +#include +#include FT_BEGIN_HEADER diff --git a/src/3rdparty/freetype/src/gxvalid/gxverror.h b/src/3rdparty/freetype/src/gxvalid/gxverror.h index da0edb35..5d8f0b68 100644 --- a/src/3rdparty/freetype/src/gxvalid/gxverror.h +++ b/src/3rdparty/freetype/src/gxvalid/gxverror.h @@ -4,7 +4,7 @@ * * TrueTypeGX/AAT validation module error codes (specification only). * - * Copyright (C) 2004-2019 by + * Copyright (C) 2004-2020 by * suzuki toshiya, Masatake YAMATO, Red Hat K.K., * David Turner, Robert Wilhelm, and Werner Lemberg. * @@ -35,7 +35,7 @@ #ifndef GXVERROR_H_ #define GXVERROR_H_ -#include FT_MODULE_ERRORS_H +#include #undef FTERRORS_H_ @@ -43,7 +43,7 @@ #define FT_ERR_PREFIX GXV_Err_ #define FT_ERR_BASE FT_Mod_Err_GXvalid -#include FT_ERRORS_H +#include #endif /* GXVERROR_H_ */ diff --git a/src/3rdparty/freetype/src/gxvalid/gxvfeat.c b/src/3rdparty/freetype/src/gxvalid/gxvfeat.c index e1a12a18..400ec8a3 100644 --- a/src/3rdparty/freetype/src/gxvalid/gxvfeat.c +++ b/src/3rdparty/freetype/src/gxvalid/gxvfeat.c @@ -4,7 +4,7 @@ * * TrueTypeGX/AAT feat table validation (body). * - * Copyright (C) 2004-2019 by + * Copyright (C) 2004-2020 by * suzuki toshiya, Masatake YAMATO, Red Hat K.K., * David Turner, Robert Wilhelm, and Werner Lemberg. * diff --git a/src/3rdparty/freetype/src/gxvalid/gxvfeat.h b/src/3rdparty/freetype/src/gxvalid/gxvfeat.h index 6c989291..435dcefb 100644 --- a/src/3rdparty/freetype/src/gxvalid/gxvfeat.h +++ b/src/3rdparty/freetype/src/gxvalid/gxvfeat.h @@ -4,7 +4,7 @@ * * TrueTypeGX/AAT feat table validation (specification). * - * Copyright (C) 2004-2019 by + * Copyright (C) 2004-2020 by * suzuki toshiya, Masatake YAMATO, Red Hat K.K., * David Turner, Robert Wilhelm, and Werner Lemberg. * diff --git a/src/3rdparty/freetype/src/gxvalid/gxvfgen.c b/src/3rdparty/freetype/src/gxvalid/gxvfgen.c index 5ecb9443..fe05a6f3 100644 --- a/src/3rdparty/freetype/src/gxvalid/gxvfgen.c +++ b/src/3rdparty/freetype/src/gxvalid/gxvfgen.c @@ -5,7 +5,7 @@ * Generate feature registry data for gxv `feat' validator. * This program is derived from gxfeatreg.c in gxlayout. * - * Copyright (C) 2004-2019 by + * Copyright (C) 2004-2020 by * Masatake YAMATO and Redhat K.K. * * This file may only be used, diff --git a/src/3rdparty/freetype/src/gxvalid/gxvjust.c b/src/3rdparty/freetype/src/gxvalid/gxvjust.c index a5823778..3c7f1f95 100644 --- a/src/3rdparty/freetype/src/gxvalid/gxvjust.c +++ b/src/3rdparty/freetype/src/gxvalid/gxvjust.c @@ -4,7 +4,7 @@ * * TrueTypeGX/AAT just table validation (body). * - * Copyright (C) 2005-2019 by + * Copyright (C) 2005-2020 by * suzuki toshiya, Masatake YAMATO, Red Hat K.K., * David Turner, Robert Wilhelm, and Werner Lemberg. * @@ -28,7 +28,7 @@ #include "gxvalid.h" #include "gxvcommn.h" -#include FT_SFNT_NAMES_H +#include /************************************************************************** diff --git a/src/3rdparty/freetype/src/gxvalid/gxvkern.c b/src/3rdparty/freetype/src/gxvalid/gxvkern.c index a7532335..cc0b3dfc 100644 --- a/src/3rdparty/freetype/src/gxvalid/gxvkern.c +++ b/src/3rdparty/freetype/src/gxvalid/gxvkern.c @@ -4,7 +4,7 @@ * * TrueTypeGX/AAT kern table validation (body). * - * Copyright (C) 2004-2019 by + * Copyright (C) 2004-2020 by * suzuki toshiya, Masatake YAMATO, Red Hat K.K., * David Turner, Robert Wilhelm, and Werner Lemberg. * @@ -28,8 +28,8 @@ #include "gxvalid.h" #include "gxvcommn.h" -#include FT_SFNT_NAMES_H -#include FT_SERVICE_GX_VALIDATE_H +#include +#include /************************************************************************** diff --git a/src/3rdparty/freetype/src/gxvalid/gxvlcar.c b/src/3rdparty/freetype/src/gxvalid/gxvlcar.c index 13b3de3e..82ac1907 100644 --- a/src/3rdparty/freetype/src/gxvalid/gxvlcar.c +++ b/src/3rdparty/freetype/src/gxvalid/gxvlcar.c @@ -4,7 +4,7 @@ * * TrueTypeGX/AAT lcar table validation (body). * - * Copyright (C) 2004-2019 by + * Copyright (C) 2004-2020 by * suzuki toshiya, Masatake YAMATO, Red Hat K.K., * David Turner, Robert Wilhelm, and Werner Lemberg. * diff --git a/src/3rdparty/freetype/src/gxvalid/gxvmod.c b/src/3rdparty/freetype/src/gxvalid/gxvmod.c index eeadeb3e..a467e871 100644 --- a/src/3rdparty/freetype/src/gxvalid/gxvmod.c +++ b/src/3rdparty/freetype/src/gxvalid/gxvmod.c @@ -4,7 +4,7 @@ * * FreeType's TrueTypeGX/AAT validation module implementation (body). * - * Copyright (C) 2004-2019 by + * Copyright (C) 2004-2020 by * suzuki toshiya, Masatake YAMATO, Red Hat K.K., * David Turner, Robert Wilhelm, and Werner Lemberg. * @@ -25,12 +25,11 @@ */ -#include -#include FT_TRUETYPE_TABLES_H -#include FT_TRUETYPE_TAGS_H -#include FT_GX_VALIDATE_H -#include FT_INTERNAL_OBJECTS_H -#include FT_SERVICE_GX_VALIDATE_H +#include +#include +#include +#include +#include #include "gxvmod.h" #include "gxvalid.h" diff --git a/src/3rdparty/freetype/src/gxvalid/gxvmod.h b/src/3rdparty/freetype/src/gxvalid/gxvmod.h index 6ecd7312..f2982c96 100644 --- a/src/3rdparty/freetype/src/gxvalid/gxvmod.h +++ b/src/3rdparty/freetype/src/gxvalid/gxvmod.h @@ -5,7 +5,7 @@ * FreeType's TrueTypeGX/AAT validation module implementation * (specification). * - * Copyright (C) 2004-2019 by + * Copyright (C) 2004-2020 by * suzuki toshiya, Masatake YAMATO, Red Hat K.K., * David Turner, Robert Wilhelm, and Werner Lemberg. * @@ -29,8 +29,7 @@ #ifndef GXVMOD_H_ #define GXVMOD_H_ -#include -#include FT_MODULE_H +#include FT_BEGIN_HEADER diff --git a/src/3rdparty/freetype/src/gxvalid/gxvmort.c b/src/3rdparty/freetype/src/gxvalid/gxvmort.c index 288ef698..aae7f01a 100644 --- a/src/3rdparty/freetype/src/gxvalid/gxvmort.c +++ b/src/3rdparty/freetype/src/gxvalid/gxvmort.c @@ -4,7 +4,7 @@ * * TrueTypeGX/AAT mort table validation (body). * - * Copyright (C) 2005-2019 by + * Copyright (C) 2005-2020 by * suzuki toshiya, Masatake YAMATO, Red Hat K.K., * David Turner, Robert Wilhelm, and Werner Lemberg. * diff --git a/src/3rdparty/freetype/src/gxvalid/gxvmort.h b/src/3rdparty/freetype/src/gxvalid/gxvmort.h index 0619e24f..7237c582 100644 --- a/src/3rdparty/freetype/src/gxvalid/gxvmort.h +++ b/src/3rdparty/freetype/src/gxvalid/gxvmort.h @@ -4,7 +4,7 @@ * * TrueTypeGX/AAT common definition for mort table (specification). * - * Copyright (C) 2004-2019 by + * Copyright (C) 2004-2020 by * suzuki toshiya, Masatake YAMATO, Red Hat K.K., * David Turner, Robert Wilhelm, and Werner Lemberg. * @@ -31,7 +31,10 @@ #include "gxvalid.h" #include "gxvcommn.h" -#include FT_SFNT_NAMES_H +#include + + +FT_BEGIN_HEADER typedef struct GXV_mort_featureRec_ @@ -88,6 +91,8 @@ GXV_Validator gxvalid ); +FT_END_HEADER + #endif /* GXVMORT_H_ */ diff --git a/src/3rdparty/freetype/src/gxvalid/gxvmort0.c b/src/3rdparty/freetype/src/gxvalid/gxvmort0.c index 2c01bf95..d452c1cc 100644 --- a/src/3rdparty/freetype/src/gxvalid/gxvmort0.c +++ b/src/3rdparty/freetype/src/gxvalid/gxvmort0.c @@ -5,7 +5,7 @@ * TrueTypeGX/AAT mort table validation * body for type0 (Indic Script Rearrangement) subtable. * - * Copyright (C) 2005-2019 by + * Copyright (C) 2005-2020 by * suzuki toshiya, Masatake YAMATO, Red Hat K.K., * David Turner, Robert Wilhelm, and Werner Lemberg. * diff --git a/src/3rdparty/freetype/src/gxvalid/gxvmort1.c b/src/3rdparty/freetype/src/gxvalid/gxvmort1.c index c71ba133..d743f89f 100644 --- a/src/3rdparty/freetype/src/gxvalid/gxvmort1.c +++ b/src/3rdparty/freetype/src/gxvalid/gxvmort1.c @@ -5,7 +5,7 @@ * TrueTypeGX/AAT mort table validation * body for type1 (Contextual Substitution) subtable. * - * Copyright (C) 2005-2019 by + * Copyright (C) 2005-2020 by * suzuki toshiya, Masatake YAMATO, Red Hat K.K., * David Turner, Robert Wilhelm, and Werner Lemberg. * diff --git a/src/3rdparty/freetype/src/gxvalid/gxvmort2.c b/src/3rdparty/freetype/src/gxvalid/gxvmort2.c index 889d3bd5..9e69e126 100644 --- a/src/3rdparty/freetype/src/gxvalid/gxvmort2.c +++ b/src/3rdparty/freetype/src/gxvalid/gxvmort2.c @@ -5,7 +5,7 @@ * TrueTypeGX/AAT mort table validation * body for type2 (Ligature Substitution) subtable. * - * Copyright (C) 2005-2019 by + * Copyright (C) 2005-2020 by * suzuki toshiya, Masatake YAMATO, Red Hat K.K., * David Turner, Robert Wilhelm, and Werner Lemberg. * diff --git a/src/3rdparty/freetype/src/gxvalid/gxvmort4.c b/src/3rdparty/freetype/src/gxvalid/gxvmort4.c index f8ce6cf7..4584d204 100644 --- a/src/3rdparty/freetype/src/gxvalid/gxvmort4.c +++ b/src/3rdparty/freetype/src/gxvalid/gxvmort4.c @@ -5,7 +5,7 @@ * TrueTypeGX/AAT mort table validation * body for type4 (Non-Contextual Glyph Substitution) subtable. * - * Copyright (C) 2005-2019 by + * Copyright (C) 2005-2020 by * suzuki toshiya, Masatake YAMATO, Red Hat K.K., * David Turner, Robert Wilhelm, and Werner Lemberg. * diff --git a/src/3rdparty/freetype/src/gxvalid/gxvmort5.c b/src/3rdparty/freetype/src/gxvalid/gxvmort5.c index 1ba1e5de..a15a24fe 100644 --- a/src/3rdparty/freetype/src/gxvalid/gxvmort5.c +++ b/src/3rdparty/freetype/src/gxvalid/gxvmort5.c @@ -5,7 +5,7 @@ * TrueTypeGX/AAT mort table validation * body for type5 (Contextual Glyph Insertion) subtable. * - * Copyright (C) 2005-2019 by + * Copyright (C) 2005-2020 by * suzuki toshiya, Masatake YAMATO, Red Hat K.K., * David Turner, Robert Wilhelm, and Werner Lemberg. * diff --git a/src/3rdparty/freetype/src/gxvalid/gxvmorx.c b/src/3rdparty/freetype/src/gxvalid/gxvmorx.c index 8bd45c27..754d9f8b 100644 --- a/src/3rdparty/freetype/src/gxvalid/gxvmorx.c +++ b/src/3rdparty/freetype/src/gxvalid/gxvmorx.c @@ -4,7 +4,7 @@ * * TrueTypeGX/AAT morx table validation (body). * - * Copyright (C) 2005-2019 by + * Copyright (C) 2005-2020 by * suzuki toshiya, Masatake YAMATO, Red Hat K.K., * David Turner, Robert Wilhelm, and Werner Lemberg. * diff --git a/src/3rdparty/freetype/src/gxvalid/gxvmorx.h b/src/3rdparty/freetype/src/gxvalid/gxvmorx.h index e2572703..f747b1d6 100644 --- a/src/3rdparty/freetype/src/gxvalid/gxvmorx.h +++ b/src/3rdparty/freetype/src/gxvalid/gxvmorx.h @@ -4,7 +4,7 @@ * * TrueTypeGX/AAT common definition for morx table (specification). * - * Copyright (C) 2005-2019 by + * Copyright (C) 2005-2020 by * suzuki toshiya, Masatake YAMATO, Red Hat K.K., * David Turner, Robert Wilhelm, and Werner Lemberg. * @@ -33,7 +33,10 @@ #include "gxvcommn.h" #include "gxvmort.h" -#include FT_SFNT_NAMES_H +#include + + +FT_BEGIN_HEADER FT_LOCAL( void ) @@ -62,6 +65,8 @@ GXV_Validator gxvalid ); +FT_END_HEADER + #endif /* GXVMORX_H_ */ diff --git a/src/3rdparty/freetype/src/gxvalid/gxvmorx0.c b/src/3rdparty/freetype/src/gxvalid/gxvmorx0.c index d7764a0a..5a42e552 100644 --- a/src/3rdparty/freetype/src/gxvalid/gxvmorx0.c +++ b/src/3rdparty/freetype/src/gxvalid/gxvmorx0.c @@ -5,7 +5,7 @@ * TrueTypeGX/AAT morx table validation * body for type0 (Indic Script Rearrangement) subtable. * - * Copyright (C) 2005-2019 by + * Copyright (C) 2005-2020 by * suzuki toshiya, Masatake YAMATO, Red Hat K.K., * David Turner, Robert Wilhelm, and Werner Lemberg. * diff --git a/src/3rdparty/freetype/src/gxvalid/gxvmorx1.c b/src/3rdparty/freetype/src/gxvalid/gxvmorx1.c index 5b41b360..9f8b6906 100644 --- a/src/3rdparty/freetype/src/gxvalid/gxvmorx1.c +++ b/src/3rdparty/freetype/src/gxvalid/gxvmorx1.c @@ -5,7 +5,7 @@ * TrueTypeGX/AAT morx table validation * body for type1 (Contextual Substitution) subtable. * - * Copyright (C) 2005-2019 by + * Copyright (C) 2005-2020 by * suzuki toshiya, Masatake YAMATO, Red Hat K.K., * David Turner, Robert Wilhelm, and Werner Lemberg. * diff --git a/src/3rdparty/freetype/src/gxvalid/gxvmorx2.c b/src/3rdparty/freetype/src/gxvalid/gxvmorx2.c index ec4c8129..98b5c49c 100644 --- a/src/3rdparty/freetype/src/gxvalid/gxvmorx2.c +++ b/src/3rdparty/freetype/src/gxvalid/gxvmorx2.c @@ -5,7 +5,7 @@ * TrueTypeGX/AAT morx table validation * body for type2 (Ligature Substitution) subtable. * - * Copyright (C) 2005-2019 by + * Copyright (C) 2005-2020 by * suzuki toshiya, Masatake YAMATO, Red Hat K.K., * David Turner, Robert Wilhelm, and Werner Lemberg. * diff --git a/src/3rdparty/freetype/src/gxvalid/gxvmorx4.c b/src/3rdparty/freetype/src/gxvalid/gxvmorx4.c index 7b041534..857e4d4e 100644 --- a/src/3rdparty/freetype/src/gxvalid/gxvmorx4.c +++ b/src/3rdparty/freetype/src/gxvalid/gxvmorx4.c @@ -5,7 +5,7 @@ * TrueTypeGX/AAT morx table validation * body for "morx" type4 (Non-Contextual Glyph Substitution) subtable. * - * Copyright (C) 2005-2019 by + * Copyright (C) 2005-2020 by * suzuki toshiya, Masatake YAMATO, Red Hat K.K., * David Turner, Robert Wilhelm, and Werner Lemberg. * diff --git a/src/3rdparty/freetype/src/gxvalid/gxvmorx5.c b/src/3rdparty/freetype/src/gxvalid/gxvmorx5.c index 70a46236..7ceba077 100644 --- a/src/3rdparty/freetype/src/gxvalid/gxvmorx5.c +++ b/src/3rdparty/freetype/src/gxvalid/gxvmorx5.c @@ -5,7 +5,7 @@ * TrueTypeGX/AAT morx table validation * body for type5 (Contextual Glyph Insertion) subtable. * - * Copyright (C) 2005-2019 by + * Copyright (C) 2005-2020 by * suzuki toshiya, Masatake YAMATO, Red Hat K.K., * David Turner, Robert Wilhelm, and Werner Lemberg. * diff --git a/src/3rdparty/freetype/src/gxvalid/gxvopbd.c b/src/3rdparty/freetype/src/gxvalid/gxvopbd.c index f055a220..a398fe09 100644 --- a/src/3rdparty/freetype/src/gxvalid/gxvopbd.c +++ b/src/3rdparty/freetype/src/gxvalid/gxvopbd.c @@ -4,7 +4,7 @@ * * TrueTypeGX/AAT opbd table validation (body). * - * Copyright (C) 2004-2019 by + * Copyright (C) 2004-2020 by * suzuki toshiya, Masatake YAMATO, Red Hat K.K., * David Turner, Robert Wilhelm, and Werner Lemberg. * diff --git a/src/3rdparty/freetype/src/gxvalid/gxvprop.c b/src/3rdparty/freetype/src/gxvalid/gxvprop.c index e1911edd..bee8bab9 100644 --- a/src/3rdparty/freetype/src/gxvalid/gxvprop.c +++ b/src/3rdparty/freetype/src/gxvalid/gxvprop.c @@ -4,7 +4,7 @@ * * TrueTypeGX/AAT prop table validation (body). * - * Copyright (C) 2004-2019 by + * Copyright (C) 2004-2020 by * suzuki toshiya, Masatake YAMATO, Red Hat K.K., * David Turner, Robert Wilhelm, and Werner Lemberg. * diff --git a/src/3rdparty/freetype/src/gxvalid/gxvtrak.c b/src/3rdparty/freetype/src/gxvalid/gxvtrak.c index b7794b7a..58a631c9 100644 --- a/src/3rdparty/freetype/src/gxvalid/gxvtrak.c +++ b/src/3rdparty/freetype/src/gxvalid/gxvtrak.c @@ -4,7 +4,7 @@ * * TrueTypeGX/AAT trak table validation (body). * - * Copyright (C) 2004-2019 by + * Copyright (C) 2004-2020 by * suzuki toshiya, Masatake YAMATO, Red Hat K.K., * David Turner, Robert Wilhelm, and Werner Lemberg. * diff --git a/src/3rdparty/freetype/src/gxvalid/module.mk b/src/3rdparty/freetype/src/gxvalid/module.mk index 04067ce6..e7d408df 100644 --- a/src/3rdparty/freetype/src/gxvalid/module.mk +++ b/src/3rdparty/freetype/src/gxvalid/module.mk @@ -2,7 +2,7 @@ # FreeType 2 gxvalid module definition # -# Copyright (C) 2004-2019 by +# Copyright (C) 2004-2020 by # suzuki toshiya, Masatake YAMATO, Red Hat K.K., # David Turner, Robert Wilhelm, and Werner Lemberg. # diff --git a/src/3rdparty/freetype/src/gxvalid/rules.mk b/src/3rdparty/freetype/src/gxvalid/rules.mk index 4ef463bc..d55a4935 100644 --- a/src/3rdparty/freetype/src/gxvalid/rules.mk +++ b/src/3rdparty/freetype/src/gxvalid/rules.mk @@ -3,7 +3,7 @@ # -# Copyright (C) 2004-2019 by +# Copyright (C) 2004-2020 by # suzuki toshiya, Masatake YAMATO, Red Hat K.K., # David Turner, Robert Wilhelm, and Werner Lemberg. # diff --git a/src/3rdparty/freetype/src/gzip/Jamfile b/src/3rdparty/freetype/src/gzip/Jamfile deleted file mode 100644 index 2c808b74..00000000 --- a/src/3rdparty/freetype/src/gzip/Jamfile +++ /dev/null @@ -1,16 +0,0 @@ -# FreeType 2 src/gzip Jamfile -# -# Copyright (C) 2001-2019 by -# David Turner, Robert Wilhelm, and Werner Lemberg. -# -# This file is part of the FreeType project, and may only be used, modified, -# and distributed under the terms of the FreeType project license, -# LICENSE.TXT. By continuing to use, modify, or distribute this file you -# indicate that you have read the license and understand and accept it -# fully. - -SubDir FT2_TOP $(FT2_SRC_DIR) gzip ; - -Library $(FT2_LIB) : ftgzip.c ; - -# end of src/pcf Jamfile diff --git a/src/3rdparty/freetype/src/gzip/ftgzip.c b/src/3rdparty/freetype/src/gzip/ftgzip.c index 5e78bc6f..de7d0fdd 100644 --- a/src/3rdparty/freetype/src/gzip/ftgzip.c +++ b/src/3rdparty/freetype/src/gzip/ftgzip.c @@ -8,7 +8,7 @@ * parse compressed PCF fonts, as found with many X11 server * distributions. * - * Copyright (C) 2002-2019 by + * Copyright (C) 2002-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -20,15 +20,14 @@ */ -#include -#include FT_INTERNAL_MEMORY_H -#include FT_INTERNAL_STREAM_H -#include FT_INTERNAL_DEBUG_H -#include FT_GZIP_H +#include +#include +#include +#include #include FT_CONFIG_STANDARD_LIBRARY_H -#include FT_MODULE_ERRORS_H +#include #undef FTERRORS_H_ @@ -36,7 +35,7 @@ #define FT_ERR_PREFIX Gzip_Err_ #define FT_ERR_BASE FT_Mod_Err_Gzip -#include FT_ERRORS_H +#include #ifdef FT_CONFIG_OPTION_USE_ZLIB @@ -746,7 +745,17 @@ stream.zfree = (free_func) ft_gzip_free; stream.opaque = memory; + /* This is a temporary fix and will be removed once the internal + * copy of zlib is updated to the newest version. The `|32' flag + * is only supported in the new versions of zlib to enable gzip + * encoded header. + */ +#ifdef FT_CONFIG_OPTION_SYSTEM_ZLIB err = inflateInit2( &stream, MAX_WBITS|32 ); +#else + err = inflateInit2( &stream, MAX_WBITS ); +#endif + if ( err != Z_OK ) return FT_THROW( Invalid_Argument ); diff --git a/src/3rdparty/freetype/src/gzip/infutil.h b/src/3rdparty/freetype/src/gzip/infutil.h index 7174b6dd..cdf18b4f 100644 --- a/src/3rdparty/freetype/src/gzip/infutil.h +++ b/src/3rdparty/freetype/src/gzip/infutil.h @@ -86,7 +86,7 @@ struct inflate_blocks_state { /* masks for lower bits (size given to avoid silly warnings with Visual C++) */ #ifndef NO_INFLATE_MASK -local uInt inflate_mask[17]; +local const uInt inflate_mask[17]; #endif /* copy as much as possible from the sliding window to the output area */ diff --git a/src/3rdparty/freetype/src/gzip/rules.mk b/src/3rdparty/freetype/src/gzip/rules.mk index 44206a1d..4ea823f8 100644 --- a/src/3rdparty/freetype/src/gzip/rules.mk +++ b/src/3rdparty/freetype/src/gzip/rules.mk @@ -3,7 +3,7 @@ # -# Copyright (C) 2002-2019 by +# Copyright (C) 2002-2020 by # David Turner, Robert Wilhelm, and Werner Lemberg. # # This file is part of the FreeType project, and may only be used, modified, diff --git a/src/3rdparty/freetype/src/gzip/zconf.h b/src/3rdparty/freetype/src/gzip/zconf.h deleted file mode 100644 index 3abf0ba0..00000000 --- a/src/3rdparty/freetype/src/gzip/zconf.h +++ /dev/null @@ -1,284 +0,0 @@ -/* zconf.h -- configuration of the zlib compression library - * Copyright (C) 1995-2002 Jean-loup Gailly. - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* @(#) $Id$ */ - -#ifndef _ZCONF_H -#define _ZCONF_H - -/* - * If you *really* need a unique prefix for all types and library functions, - * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it. - */ -#ifdef Z_PREFIX -# define deflateInit_ z_deflateInit_ -# define deflate z_deflate -# define deflateEnd z_deflateEnd -# define inflateInit_ z_inflateInit_ -# define inflate z_inflate -# define inflateEnd z_inflateEnd -# define deflateInit2_ z_deflateInit2_ -# define deflateSetDictionary z_deflateSetDictionary -# define deflateCopy z_deflateCopy -# define deflateReset z_deflateReset -# define deflateParams z_deflateParams -# define inflateInit2_ z_inflateInit2_ -# define inflateSetDictionary z_inflateSetDictionary -# define inflateSync z_inflateSync -# define inflateSyncPoint z_inflateSyncPoint -# define inflateReset z_inflateReset -# define compress z_compress -# define compress2 z_compress2 -# define uncompress z_uncompress -# define adler32 z_adler32 -# define crc32 z_crc32 -# define get_crc_table z_get_crc_table - -# define Byte z_Byte -# define uInt z_uInt -# define uLong z_uLong -# define Bytef z_Bytef -# define charf z_charf -# define intf z_intf -# define uIntf z_uIntf -# define uLongf z_uLongf -# define voidpf z_voidpf -# define voidp z_voidp -#endif - -#if (defined(_WIN32) || defined(__WIN32__)) && !defined(WIN32) -# define WIN32 -#endif -#if defined(__GNUC__) || defined(WIN32) || defined(__386__) || defined(i386) -# ifndef __32BIT__ -# define __32BIT__ -# endif -#endif -#if defined(__MSDOS__) && !defined(MSDOS) -# define MSDOS -#endif - -/* WinCE doesn't have errno.h */ -#ifdef _WIN32_WCE -# define NO_ERRNO_H -#endif - - -/* - * Compile with -DMAXSEG_64K if the alloc function cannot allocate more - * than 64k bytes at a time (needed on systems with 16-bit int). - */ -#if defined(MSDOS) && !defined(__32BIT__) -# define MAXSEG_64K -#endif -#ifdef MSDOS -# define UNALIGNED_OK -#endif - -#if (defined(MSDOS) || defined(_WINDOWS) || defined(WIN32)) && !defined(STDC) -# define STDC -#endif -#if defined(__STDC__) || defined(__cplusplus) || defined(__OS2__) -# ifndef STDC -# define STDC -# endif -#endif - -#ifndef STDC -# ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */ -# define const -# endif -#endif - -/* Some Mac compilers merge all .h files incorrectly: */ -#if defined(__MWERKS__) || defined(applec) ||defined(THINK_C) ||defined(__SC__) -# define NO_DUMMY_DECL -#endif - -/* Old Borland C and LCC incorrectly complains about missing returns: */ -#if defined(__BORLANDC__) && (__BORLANDC__ < 0x500) -# define NEED_DUMMY_RETURN -#endif - -#if defined(__LCC__) -# define NEED_DUMMY_RETURN -#endif - -/* Maximum value for memLevel in deflateInit2 */ -#ifndef MAX_MEM_LEVEL -# ifdef MAXSEG_64K -# define MAX_MEM_LEVEL 8 -# else -# define MAX_MEM_LEVEL 9 -# endif -#endif - -/* Maximum value for windowBits in deflateInit2 and inflateInit2. - * WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files - * created by gzip. (Files created by minigzip can still be extracted by - * gzip.) - */ -#ifndef MAX_WBITS -# define MAX_WBITS 15 /* 32K LZ77 window */ -#endif - -/* The memory requirements for deflate are (in bytes): - (1 << (windowBits+2)) + (1 << (memLevel+9)) - that is: 128K for windowBits=15 + 128K for memLevel = 8 (default values) - plus a few kilobytes for small objects. For example, if you want to reduce - the default memory requirements from 256K to 128K, compile with - make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7" - Of course this will generally degrade compression (there's no free lunch). - - The memory requirements for inflate are (in bytes) 1 << windowBits - that is, 32K for windowBits=15 (default value) plus a few kilobytes - for small objects. -*/ - - /* Type declarations */ - -#ifndef OF /* function prototypes */ -# ifdef STDC -# define OF(args) args -# else -# define OF(args) () -# endif -#endif - -/* The following definitions for FAR are needed only for MSDOS mixed - * model programming (small or medium model with some far allocations). - * This was tested only with MSC; for other MSDOS compilers you may have - * to define NO_MEMCPY in zutil.h. If you don't need the mixed model, - * just define FAR to be empty. - */ -#if (defined(M_I86SM) || defined(M_I86MM)) && !defined(__32BIT__) - /* MSC small or medium model */ -# define SMALL_MEDIUM -# ifdef _MSC_VER -# define FAR _far -# else -# define FAR far -# endif -#endif -#if defined(__BORLANDC__) && (defined(__SMALL__) || defined(__MEDIUM__)) -# ifndef __32BIT__ -# define SMALL_MEDIUM -# define FAR _far -# endif -#endif - -/* Compile with -DZLIB_DLL for Windows DLL support */ -#if defined(ZLIB_DLL) -# if defined(_WINDOWS) || defined(WINDOWS) -# ifdef FAR -# undef FAR -# endif -# include -# define ZEXPORT(x) x WINAPI -# ifdef WIN32 -# define ZEXPORTVA(x) x WINAPIV -# else -# define ZEXPORTVA(x) x FAR _cdecl _export -# endif -# endif -# if defined (__BORLANDC__) -# if (__BORLANDC__ >= 0x0500) && defined (WIN32) -# include -# define ZEXPORT(x) x __declspec(dllexport) WINAPI -# define ZEXPORTRVA(x) x __declspec(dllexport) WINAPIV -# else -# if defined (_Windows) && defined (__DLL__) -# define ZEXPORT(x) x _export -# define ZEXPORTVA(x) x _export -# endif -# endif -# endif -#endif - - -#ifndef ZEXPORT -# define ZEXPORT(x) static x -#endif -#ifndef ZEXPORTVA -# define ZEXPORTVA(x) static x -#endif -#ifndef ZEXTERN -# define ZEXTERN(x) static x -#endif -#ifndef ZEXTERNDEF -# define ZEXTERNDEF(x) static x -#endif - -#ifndef FAR -# define FAR -#endif - -#if !defined(MACOS) && !defined(TARGET_OS_MAC) -typedef unsigned char Byte; /* 8 bits */ -#endif -typedef unsigned int uInt; /* 16 bits or more */ -typedef unsigned long uLong; /* 32 bits or more */ - -#ifdef SMALL_MEDIUM - /* Borland C/C++ and some old MSC versions ignore FAR inside typedef */ -# define Bytef Byte FAR -#else - typedef Byte FAR Bytef; -#endif -typedef char FAR charf; -typedef int FAR intf; -typedef uInt FAR uIntf; -typedef uLong FAR uLongf; - -#ifdef STDC - typedef void FAR *voidpf; - typedef void *voidp; -#else - typedef Byte FAR *voidpf; - typedef Byte *voidp; -#endif - -#ifdef HAVE_UNISTD_H -# include /* for off_t */ -# include /* for SEEK_* and off_t */ -# define z_off_t off_t -#endif -#ifndef SEEK_SET -# define SEEK_SET 0 /* Seek from beginning of file. */ -# define SEEK_CUR 1 /* Seek from current position. */ -# define SEEK_END 2 /* Set file pointer to EOF plus "offset" */ -#endif -#ifndef z_off_t -# define z_off_t long -#endif - -/* MVS linker does not support external names larger than 8 bytes */ -#if defined(__MVS__) -# pragma map(deflateInit_,"DEIN") -# pragma map(deflateInit2_,"DEIN2") -# pragma map(deflateEnd,"DEEND") -# pragma map(inflateInit_,"ININ") -# pragma map(inflateInit2_,"ININ2") -# pragma map(inflateEnd,"INEND") -# pragma map(inflateSync,"INSY") -# pragma map(inflateSetDictionary,"INSEDI") -# pragma map(inflate_blocks,"INBL") -# pragma map(inflate_blocks_new,"INBLNE") -# pragma map(inflate_blocks_free,"INBLFR") -# pragma map(inflate_blocks_reset,"INBLRE") -# pragma map(inflate_codes_free,"INCOFR") -# pragma map(inflate_codes,"INCO") -# pragma map(inflate_fast,"INFA") -# pragma map(inflate_flush,"INFLU") -# pragma map(inflate_mask,"INMA") -# pragma map(inflate_set_dictionary,"INSEDI2") -# pragma map(inflate_copyright,"INCOPY") -# pragma map(inflate_trees_bits,"INTRBI") -# pragma map(inflate_trees_dynamic,"INTRDY") -# pragma map(inflate_trees_fixed,"INTRFI") -# pragma map(inflate_trees_free,"INTRFR") -#endif - -#endif /* _ZCONF_H */ diff --git a/src/3rdparty/freetype/src/lzw/Jamfile b/src/3rdparty/freetype/src/lzw/Jamfile deleted file mode 100644 index ba2d6ebb..00000000 --- a/src/3rdparty/freetype/src/lzw/Jamfile +++ /dev/null @@ -1,16 +0,0 @@ -# FreeType 2 src/lzw Jamfile -# -# Copyright (C) 2004-2019 by -# David Turner, Robert Wilhelm, and Werner Lemberg. -# -# This file is part of the FreeType project, and may only be used, modified, -# and distributed under the terms of the FreeType project license, -# LICENSE.TXT. By continuing to use, modify, or distribute this file you -# indicate that you have read the license and understand and accept it -# fully. - -SubDir FT2_TOP $(FT2_SRC_DIR) lzw ; - -Library $(FT2_LIB) : ftlzw.c ; - -# end of src/lzw Jamfile diff --git a/src/3rdparty/freetype/src/lzw/ftlzw.c b/src/3rdparty/freetype/src/lzw/ftlzw.c index 9805a1e3..ddb81e6e 100644 --- a/src/3rdparty/freetype/src/lzw/ftlzw.c +++ b/src/3rdparty/freetype/src/lzw/ftlzw.c @@ -8,7 +8,7 @@ * be used to parse compressed PCF fonts, as found with many X11 server * distributions. * - * Copyright (C) 2004-2019 by + * Copyright (C) 2004-2020 by * Albert Chin-A-Young. * * based on code in `src/gzip/ftgzip.c' @@ -21,15 +21,14 @@ * */ -#include -#include FT_INTERNAL_MEMORY_H -#include FT_INTERNAL_STREAM_H -#include FT_INTERNAL_DEBUG_H -#include FT_LZW_H +#include +#include +#include +#include #include FT_CONFIG_STANDARD_LIBRARY_H -#include FT_MODULE_ERRORS_H +#include #undef FTERRORS_H_ @@ -37,7 +36,7 @@ #define FT_ERR_PREFIX LZW_Err_ #define FT_ERR_BASE FT_Mod_Err_LZW -#include FT_ERRORS_H +#include #ifdef FT_CONFIG_OPTION_USE_LZW diff --git a/src/3rdparty/freetype/src/lzw/ftzopen.c b/src/3rdparty/freetype/src/lzw/ftzopen.c index 67e6760f..884d2ec7 100644 --- a/src/3rdparty/freetype/src/lzw/ftzopen.c +++ b/src/3rdparty/freetype/src/lzw/ftzopen.c @@ -8,7 +8,7 @@ * be used to parse compressed PCF fonts, as found with many X11 server * distributions. * - * Copyright (C) 2005-2019 by + * Copyright (C) 2005-2020 by * David Turner. * * This file is part of the FreeType project, and may only be used, @@ -20,9 +20,9 @@ */ #include "ftzopen.h" -#include FT_INTERNAL_MEMORY_H -#include FT_INTERNAL_STREAM_H -#include FT_INTERNAL_DEBUG_H +#include +#include +#include static int diff --git a/src/3rdparty/freetype/src/lzw/ftzopen.h b/src/3rdparty/freetype/src/lzw/ftzopen.h index 44fe36d6..d8768f7b 100644 --- a/src/3rdparty/freetype/src/lzw/ftzopen.h +++ b/src/3rdparty/freetype/src/lzw/ftzopen.h @@ -8,7 +8,7 @@ * be used to parse compressed PCF fonts, as found with many X11 server * distributions. * - * Copyright (C) 2005-2019 by + * Copyright (C) 2005-2020 by * David Turner. * * This file is part of the FreeType project, and may only be used, @@ -22,9 +22,9 @@ #ifndef FTZOPEN_H_ #define FTZOPEN_H_ -#include -#include FT_FREETYPE_H +#include +FT_BEGIN_HEADER /* * This is a complete re-implementation of the LZW file reader, @@ -166,6 +166,8 @@ /* */ +FT_END_HEADER + #endif /* FTZOPEN_H_ */ diff --git a/src/3rdparty/freetype/src/lzw/rules.mk b/src/3rdparty/freetype/src/lzw/rules.mk index 930b32e6..3468ee02 100644 --- a/src/3rdparty/freetype/src/lzw/rules.mk +++ b/src/3rdparty/freetype/src/lzw/rules.mk @@ -3,7 +3,7 @@ # -# Copyright (C) 2004-2019 by +# Copyright (C) 2004-2020 by # Albert Chin-A-Young. # # based on `src/lzw/rules.mk' diff --git a/src/3rdparty/freetype/src/otvalid/Jamfile b/src/3rdparty/freetype/src/otvalid/Jamfile deleted file mode 100644 index 36db0e1f..00000000 --- a/src/3rdparty/freetype/src/otvalid/Jamfile +++ /dev/null @@ -1,37 +0,0 @@ -# FreeType 2 src/otvalid Jamfile -# -# Copyright (C) 2004-2019 by -# David Turner, Robert Wilhelm, and Werner Lemberg. -# -# This file is part of the FreeType project, and may only be used, modified, -# and distributed under the terms of the FreeType project license, -# LICENSE.TXT. By continuing to use, modify, or distribute this file you -# indicate that you have read the license and understand and accept it -# fully. - -SubDir FT2_TOP $(FT2_SRC_DIR) otvalid ; - -{ - local _sources ; - - if $(FT2_MULTI) - { - _sources = otvbase - otvcommn - otvgdef - otvgpos - otvgsub - otvjstf - otvmath - otvmod - ; - } - else - { - _sources = otvalid ; - } - - Library $(FT2_LIB) : $(_sources).c ; -} - -# end of src/otvalid Jamfile diff --git a/src/3rdparty/freetype/src/otvalid/module.mk b/src/3rdparty/freetype/src/otvalid/module.mk index 5ea5b7b5..67b9820d 100644 --- a/src/3rdparty/freetype/src/otvalid/module.mk +++ b/src/3rdparty/freetype/src/otvalid/module.mk @@ -3,7 +3,7 @@ # -# Copyright (C) 2004-2019 by +# Copyright (C) 2004-2020 by # David Turner, Robert Wilhelm, and Werner Lemberg. # # This file is part of the FreeType project, and may only be used, modified, diff --git a/src/3rdparty/freetype/src/otvalid/otvalid.c b/src/3rdparty/freetype/src/otvalid/otvalid.c index e3964b99..d640209f 100644 --- a/src/3rdparty/freetype/src/otvalid/otvalid.c +++ b/src/3rdparty/freetype/src/otvalid/otvalid.c @@ -4,7 +4,7 @@ * * FreeType validator for OpenType tables (body only). * - * Copyright (C) 2004-2019 by + * Copyright (C) 2004-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -17,7 +17,6 @@ #define FT_MAKE_OPTION_SINGLE_OBJECT -#include #include "otvbase.c" #include "otvcommn.c" diff --git a/src/3rdparty/freetype/src/otvalid/otvalid.h b/src/3rdparty/freetype/src/otvalid/otvalid.h index 5ca819f2..8208ff01 100644 --- a/src/3rdparty/freetype/src/otvalid/otvalid.h +++ b/src/3rdparty/freetype/src/otvalid/otvalid.h @@ -4,7 +4,7 @@ * * OpenType table validation (specification only). * - * Copyright (C) 2004-2019 by + * Copyright (C) 2004-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -20,13 +20,12 @@ #define OTVALID_H_ -#include -#include FT_FREETYPE_H +#include -#include "otverror.h" /* must come before FT_INTERNAL_VALIDATE_H */ +#include "otverror.h" /* must come before `ftvalid.h' */ -#include FT_INTERNAL_VALIDATE_H -#include FT_INTERNAL_STREAM_H +#include +#include FT_BEGIN_HEADER diff --git a/src/3rdparty/freetype/src/otvalid/otvbase.c b/src/3rdparty/freetype/src/otvalid/otvbase.c index be69d7ca..250ae98a 100644 --- a/src/3rdparty/freetype/src/otvalid/otvbase.c +++ b/src/3rdparty/freetype/src/otvalid/otvbase.c @@ -4,7 +4,7 @@ * * OpenType BASE table validation (body). * - * Copyright (C) 2004-2019 by + * Copyright (C) 2004-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, diff --git a/src/3rdparty/freetype/src/otvalid/otvcommn.c b/src/3rdparty/freetype/src/otvalid/otvcommn.c index 5ed17235..faaa8468 100644 --- a/src/3rdparty/freetype/src/otvalid/otvcommn.c +++ b/src/3rdparty/freetype/src/otvalid/otvcommn.c @@ -4,7 +4,7 @@ * * OpenType common tables validation (body). * - * Copyright (C) 2004-2019 by + * Copyright (C) 2004-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -151,6 +151,9 @@ FT_UInt result = 0; + if ( !count ) + return result; + switch ( CoverageFormat ) { case 1: diff --git a/src/3rdparty/freetype/src/otvalid/otvcommn.h b/src/3rdparty/freetype/src/otvalid/otvcommn.h index bfcc5b97..f9926034 100644 --- a/src/3rdparty/freetype/src/otvalid/otvcommn.h +++ b/src/3rdparty/freetype/src/otvalid/otvcommn.h @@ -4,7 +4,7 @@ * * OpenType common tables validation (specification). * - * Copyright (C) 2004-2019 by + * Copyright (C) 2004-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -20,9 +20,8 @@ #define OTVCOMMN_H_ -#include #include "otvalid.h" -#include FT_INTERNAL_DEBUG_H +#include FT_BEGIN_HEADER diff --git a/src/3rdparty/freetype/src/otvalid/otverror.h b/src/3rdparty/freetype/src/otvalid/otverror.h index a7d35acf..979e9cbd 100644 --- a/src/3rdparty/freetype/src/otvalid/otverror.h +++ b/src/3rdparty/freetype/src/otvalid/otverror.h @@ -4,7 +4,7 @@ * * OpenType validation module error codes (specification only). * - * Copyright (C) 2004-2019 by + * Copyright (C) 2004-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -26,7 +26,7 @@ #ifndef OTVERROR_H_ #define OTVERROR_H_ -#include FT_MODULE_ERRORS_H +#include #undef FTERRORS_H_ @@ -34,7 +34,7 @@ #define FT_ERR_PREFIX OTV_Err_ #define FT_ERR_BASE FT_Mod_Err_OTvalid -#include FT_ERRORS_H +#include #endif /* OTVERROR_H_ */ diff --git a/src/3rdparty/freetype/src/otvalid/otvgdef.c b/src/3rdparty/freetype/src/otvalid/otvgdef.c index 2529b544..88874b84 100644 --- a/src/3rdparty/freetype/src/otvalid/otvgdef.c +++ b/src/3rdparty/freetype/src/otvalid/otvgdef.c @@ -4,7 +4,7 @@ * * OpenType GDEF table validation (body). * - * Copyright (C) 2004-2019 by + * Copyright (C) 2004-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, diff --git a/src/3rdparty/freetype/src/otvalid/otvgpos.c b/src/3rdparty/freetype/src/otvalid/otvgpos.c index f3bddeac..29d56f91 100644 --- a/src/3rdparty/freetype/src/otvalid/otvgpos.c +++ b/src/3rdparty/freetype/src/otvalid/otvgpos.c @@ -4,7 +4,7 @@ * * OpenType GPOS table validation (body). * - * Copyright (C) 2002-2019 by + * Copyright (C) 2002-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, diff --git a/src/3rdparty/freetype/src/otvalid/otvgpos.h b/src/3rdparty/freetype/src/otvalid/otvgpos.h index b3154312..06a03a0e 100644 --- a/src/3rdparty/freetype/src/otvalid/otvgpos.h +++ b/src/3rdparty/freetype/src/otvalid/otvgpos.h @@ -4,7 +4,7 @@ * * OpenType GPOS table validator (specification). * - * Copyright (C) 2004-2019 by + * Copyright (C) 2004-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, diff --git a/src/3rdparty/freetype/src/otvalid/otvgsub.c b/src/3rdparty/freetype/src/otvalid/otvgsub.c index 97da997d..f0d563ba 100644 --- a/src/3rdparty/freetype/src/otvalid/otvgsub.c +++ b/src/3rdparty/freetype/src/otvalid/otvgsub.c @@ -4,7 +4,7 @@ * * OpenType GSUB table validation (body). * - * Copyright (C) 2004-2019 by + * Copyright (C) 2004-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, diff --git a/src/3rdparty/freetype/src/otvalid/otvjstf.c b/src/3rdparty/freetype/src/otvalid/otvjstf.c index d4e6d871..79de7b80 100644 --- a/src/3rdparty/freetype/src/otvalid/otvjstf.c +++ b/src/3rdparty/freetype/src/otvalid/otvjstf.c @@ -4,7 +4,7 @@ * * OpenType JSTF table validation (body). * - * Copyright (C) 2004-2019 by + * Copyright (C) 2004-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, diff --git a/src/3rdparty/freetype/src/otvalid/otvmath.c b/src/3rdparty/freetype/src/otvalid/otvmath.c index 3aaf0ec0..dfdeaaba 100644 --- a/src/3rdparty/freetype/src/otvalid/otvmath.c +++ b/src/3rdparty/freetype/src/otvalid/otvmath.c @@ -4,7 +4,7 @@ * * OpenType MATH table validation (body). * - * Copyright (C) 2007-2019 by + * Copyright (C) 2007-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * Written by George Williams. diff --git a/src/3rdparty/freetype/src/otvalid/otvmod.c b/src/3rdparty/freetype/src/otvalid/otvmod.c index f417bd22..0188b270 100644 --- a/src/3rdparty/freetype/src/otvalid/otvmod.c +++ b/src/3rdparty/freetype/src/otvalid/otvmod.c @@ -4,7 +4,7 @@ * * FreeType's OpenType validation module implementation (body). * - * Copyright (C) 2004-2019 by + * Copyright (C) 2004-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -16,12 +16,11 @@ */ -#include -#include FT_TRUETYPE_TABLES_H -#include FT_TRUETYPE_TAGS_H -#include FT_OPENTYPE_VALIDATE_H -#include FT_INTERNAL_OBJECTS_H -#include FT_SERVICE_OPENTYPE_VALIDATE_H +#include +#include +#include +#include +#include #include "otvmod.h" #include "otvalid.h" diff --git a/src/3rdparty/freetype/src/otvalid/otvmod.h b/src/3rdparty/freetype/src/otvalid/otvmod.h index 5539de7e..efd6da03 100644 --- a/src/3rdparty/freetype/src/otvalid/otvmod.h +++ b/src/3rdparty/freetype/src/otvalid/otvmod.h @@ -5,7 +5,7 @@ * FreeType's OpenType validation module implementation * (specification). * - * Copyright (C) 2004-2019 by + * Copyright (C) 2004-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -21,8 +21,7 @@ #define OTVMOD_H_ -#include -#include FT_MODULE_H +#include FT_BEGIN_HEADER diff --git a/src/3rdparty/freetype/src/otvalid/rules.mk b/src/3rdparty/freetype/src/otvalid/rules.mk index 3c6ece1c..7f0169fd 100644 --- a/src/3rdparty/freetype/src/otvalid/rules.mk +++ b/src/3rdparty/freetype/src/otvalid/rules.mk @@ -3,7 +3,7 @@ # -# Copyright (C) 2004-2019 by +# Copyright (C) 2004-2020 by # David Turner, Robert Wilhelm, and Werner Lemberg. # # This file is part of the FreeType project, and may only be used, modified, diff --git a/src/3rdparty/freetype/src/pcf/Jamfile b/src/3rdparty/freetype/src/pcf/Jamfile deleted file mode 100644 index fd17d53f..00000000 --- a/src/3rdparty/freetype/src/pcf/Jamfile +++ /dev/null @@ -1,32 +0,0 @@ -# FreeType 2 src/pcf Jamfile -# -# Copyright (C) 2001-2019 by -# David Turner, Robert Wilhelm, and Werner Lemberg. -# -# This file is part of the FreeType project, and may only be used, modified, -# and distributed under the terms of the FreeType project license, -# LICENSE.TXT. By continuing to use, modify, or distribute this file you -# indicate that you have read the license and understand and accept it -# fully. - -SubDir FT2_TOP $(FT2_SRC_DIR) pcf ; - -{ - local _sources ; - - if $(FT2_MULTI) - { - _sources = pcfdrivr - pcfread - pcfutil - ; - } - else - { - _sources = pcf ; - } - - Library $(FT2_LIB) : $(_sources).c ; -} - -# end of src/pcf Jamfile diff --git a/src/3rdparty/freetype/src/pcf/pcf.c b/src/3rdparty/freetype/src/pcf/pcf.c index 8ffd6e28..6b30fb24 100644 --- a/src/3rdparty/freetype/src/pcf/pcf.c +++ b/src/3rdparty/freetype/src/pcf/pcf.c @@ -26,7 +26,6 @@ THE SOFTWARE. #define FT_MAKE_OPTION_SINGLE_OBJECT -#include #include "pcfdrivr.c" #include "pcfread.c" diff --git a/src/3rdparty/freetype/src/pcf/pcf.h b/src/3rdparty/freetype/src/pcf/pcf.h index 33be4bcd..3134cc35 100644 --- a/src/3rdparty/freetype/src/pcf/pcf.h +++ b/src/3rdparty/freetype/src/pcf/pcf.h @@ -29,9 +29,8 @@ THE SOFTWARE. #define PCF_H_ -#include -#include FT_INTERNAL_DRIVER_H -#include FT_INTERNAL_STREAM_H +#include +#include FT_BEGIN_HEADER diff --git a/src/3rdparty/freetype/src/pcf/pcfdrivr.c b/src/3rdparty/freetype/src/pcf/pcfdrivr.c index b39592c7..e9dd5175 100644 --- a/src/3rdparty/freetype/src/pcf/pcfdrivr.c +++ b/src/3rdparty/freetype/src/pcf/pcfdrivr.c @@ -25,17 +25,16 @@ THE SOFTWARE. */ -#include -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_STREAM_H -#include FT_INTERNAL_OBJECTS_H -#include FT_GZIP_H -#include FT_LZW_H -#include FT_BZIP2_H -#include FT_ERRORS_H -#include FT_BDF_H -#include FT_TRUETYPE_IDS_H +#include +#include +#include +#include +#include +#include +#include +#include +#include #include "pcf.h" #include "pcfdrivr.h" @@ -47,10 +46,10 @@ THE SOFTWARE. #undef FT_COMPONENT #define FT_COMPONENT pcfread -#include FT_SERVICE_BDF_H -#include FT_SERVICE_FONT_FORMAT_H -#include FT_SERVICE_PROPERTIES_H -#include FT_DRIVER_H +#include +#include +#include +#include /************************************************************************** @@ -137,7 +136,7 @@ THE SOFTWARE. FT_UInt32 charcode = *acharcode; FT_UShort charcodeRow; FT_UShort charcodeCol; - FT_Int result = 0; + FT_UInt result = 0; while ( charcode < (FT_UInt32)( enc->lastRow * 256 + enc->lastCol ) ) @@ -607,8 +606,9 @@ THE SOFTWARE. if ( prop->value.l > 0x7FFFFFFFL || prop->value.l < ( -1 - 0x7FFFFFFFL ) ) { - FT_TRACE1(( "pcf_get_bdf_property:" )); - FT_TRACE1(( " too large integer 0x%x is truncated\n" )); + FT_TRACE1(( "pcf_get_bdf_property:" + " too large integer 0x%lx is truncated\n", + prop->value.l )); } /* diff --git a/src/3rdparty/freetype/src/pcf/pcfdrivr.h b/src/3rdparty/freetype/src/pcf/pcfdrivr.h index 73db0823..d4653937 100644 --- a/src/3rdparty/freetype/src/pcf/pcfdrivr.h +++ b/src/3rdparty/freetype/src/pcf/pcfdrivr.h @@ -28,8 +28,7 @@ THE SOFTWARE. #ifndef PCFDRIVR_H_ #define PCFDRIVR_H_ -#include -#include FT_INTERNAL_DRIVER_H +#include FT_BEGIN_HEADER diff --git a/src/3rdparty/freetype/src/pcf/pcferror.h b/src/3rdparty/freetype/src/pcf/pcferror.h index 2e69d1d2..8b9e9902 100644 --- a/src/3rdparty/freetype/src/pcf/pcferror.h +++ b/src/3rdparty/freetype/src/pcf/pcferror.h @@ -25,7 +25,7 @@ #ifndef PCFERROR_H_ #define PCFERROR_H_ -#include FT_MODULE_ERRORS_H +#include #undef FTERRORS_H_ @@ -33,7 +33,7 @@ #define FT_ERR_PREFIX PCF_Err_ #define FT_ERR_BASE FT_Mod_Err_PCF -#include FT_ERRORS_H +#include #endif /* PCFERROR_H_ */ diff --git a/src/3rdparty/freetype/src/pcf/pcfread.c b/src/3rdparty/freetype/src/pcf/pcfread.c index 2ffe22d7..8817682c 100644 --- a/src/3rdparty/freetype/src/pcf/pcfread.c +++ b/src/3rdparty/freetype/src/pcf/pcfread.c @@ -25,11 +25,10 @@ THE SOFTWARE. */ -#include -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_STREAM_H -#include FT_INTERNAL_OBJECTS_H +#include +#include +#include #include "pcf.h" #include "pcfread.h" @@ -122,7 +121,7 @@ THE SOFTWARE. toc->count > 9 ) { FT_TRACE0(( "pcf_read_TOC: adjusting number of tables" - " (from %d to %d)\n", + " (from %ld to %ld)\n", toc->count, FT_MIN( stream->size >> 4, 9 ) )); toc->count = FT_MIN( stream->size >> 4, 9 ); @@ -242,7 +241,7 @@ THE SOFTWARE. if ( tables[i].type == (FT_UInt)( 1 << j ) ) name = tableNames[j]; - FT_TRACE4(( " %d: type=%s, format=0x%X," + FT_TRACE4(( " %d: type=%s, format=0x%lX," " size=%ld (0x%lX), offset=%ld (0x%lX)\n", i, name, tables[i].format, @@ -661,7 +660,7 @@ THE SOFTWARE. { properties[i].value.l = props[i].value; - FT_TRACE4(( " %d\n", properties[i].value.l )); + FT_TRACE4(( " %ld\n", properties[i].value.l )); } } @@ -798,7 +797,7 @@ THE SOFTWARE. metrics->descent = 0; FT_TRACE0(( "pcf_get_metrics:" - " invalid metrics for glyph %d\n", i )); + " invalid metrics for glyph %ld\n", i )); } } @@ -918,11 +917,11 @@ THE SOFTWARE. sizebitmaps = bitmapSizes[PCF_GLYPH_PAD_INDEX( format )]; - FT_TRACE4(( " %ld-bit padding implies a size of %lu\n", + FT_TRACE4(( " %d-bit padding implies a size of %lu\n", 8 << i, bitmapSizes[i] )); } - FT_TRACE4(( " %lu bitmaps, using %ld-bit padding\n", + FT_TRACE4(( " %lu bitmaps, using %d-bit padding\n", nbitmaps, 8 << PCF_GLYPH_PAD_INDEX( format ) )); FT_TRACE4(( " bitmap size: %lu\n", sizebitmaps )); @@ -1252,13 +1251,13 @@ THE SOFTWARE. if ( FT_ABS( accel->fontAscent ) > 0x7FFF ) { accel->fontAscent = accel->fontAscent < 0 ? -0x7FFF : 0x7FFF; - FT_TRACE0(( "pfc_get_accel: clamping font ascent to value %d\n", + FT_TRACE0(( "pfc_get_accel: clamping font ascent to value %ld\n", accel->fontAscent )); } if ( FT_ABS( accel->fontDescent ) > 0x7FFF ) { accel->fontDescent = accel->fontDescent < 0 ? -0x7FFF : 0x7FFF; - FT_TRACE0(( "pfc_get_accel: clamping font descent to value %d\n", + FT_TRACE0(( "pfc_get_accel: clamping font descent to value %ld\n", accel->fontDescent )); } @@ -1631,7 +1630,7 @@ THE SOFTWARE. if ( FT_ABS( prop->value.l ) > 0x504C2L ) /* 0x7FFF * 72270/7200 */ { bsize->size = 0x7FFF; - FT_TRACE0(( "pcf_load_font: clamping point size to value %d\n", + FT_TRACE0(( "pcf_load_font: clamping point size to value %ld\n", bsize->size )); } else @@ -1650,7 +1649,7 @@ THE SOFTWARE. if ( FT_ABS( prop->value.l ) > 0x7FFF ) { bsize->y_ppem = 0x7FFF << 6; - FT_TRACE0(( "pcf_load_font: clamping pixel size to value %d\n", + FT_TRACE0(( "pcf_load_font: clamping pixel size to value %ld\n", bsize->y_ppem )); } else diff --git a/src/3rdparty/freetype/src/pcf/pcfread.h b/src/3rdparty/freetype/src/pcf/pcfread.h index bed30e50..a54648fb 100644 --- a/src/3rdparty/freetype/src/pcf/pcfread.h +++ b/src/3rdparty/freetype/src/pcf/pcfread.h @@ -29,7 +29,6 @@ THE SOFTWARE. #define PCFREAD_H_ -#include FT_BEGIN_HEADER diff --git a/src/3rdparty/freetype/src/pcf/pcfutil.c b/src/3rdparty/freetype/src/pcf/pcfutil.c index 045c42d6..5d3c0079 100644 --- a/src/3rdparty/freetype/src/pcf/pcfutil.c +++ b/src/3rdparty/freetype/src/pcf/pcfutil.c @@ -32,7 +32,6 @@ in this Software without prior written authorization from The Open Group. /* Modified for use with FreeType */ -#include #include "pcfutil.h" diff --git a/src/3rdparty/freetype/src/pcf/pcfutil.h b/src/3rdparty/freetype/src/pcf/pcfutil.h index be986e75..a197c155 100644 --- a/src/3rdparty/freetype/src/pcf/pcfutil.h +++ b/src/3rdparty/freetype/src/pcf/pcfutil.h @@ -31,7 +31,7 @@ THE SOFTWARE. #include #include FT_CONFIG_CONFIG_H - +#include FT_BEGIN_HEADER diff --git a/src/3rdparty/freetype/src/pfr/Jamfile b/src/3rdparty/freetype/src/pfr/Jamfile deleted file mode 100644 index fbca8065..00000000 --- a/src/3rdparty/freetype/src/pfr/Jamfile +++ /dev/null @@ -1,35 +0,0 @@ -# FreeType 2 src/pfr Jamfile -# -# Copyright (C) 2002-2019 by -# David Turner, Robert Wilhelm, and Werner Lemberg. -# -# This file is part of the FreeType project, and may only be used, modified, -# and distributed under the terms of the FreeType project license, -# LICENSE.TXT. By continuing to use, modify, or distribute this file you -# indicate that you have read the license and understand and accept it -# fully. - -SubDir FT2_TOP $(FT2_SRC_DIR) pfr ; - -{ - local _sources ; - - if $(FT2_MULTI) - { - _sources = pfrcmap - pfrdrivr - pfrgload - pfrload - pfrobjs - pfrsbit - ; - } - else - { - _sources = pfr ; - } - - Library $(FT2_LIB) : $(_sources).c ; -} - -# end of src/pfr Jamfile diff --git a/src/3rdparty/freetype/src/pfr/module.mk b/src/3rdparty/freetype/src/pfr/module.mk index 30d876d4..762353dd 100644 --- a/src/3rdparty/freetype/src/pfr/module.mk +++ b/src/3rdparty/freetype/src/pfr/module.mk @@ -3,7 +3,7 @@ # -# Copyright (C) 2002-2019 by +# Copyright (C) 2002-2020 by # David Turner, Robert Wilhelm, and Werner Lemberg. # # This file is part of the FreeType project, and may only be used, modified, diff --git a/src/3rdparty/freetype/src/pfr/pfr.c b/src/3rdparty/freetype/src/pfr/pfr.c index 6d885ea4..9264c77d 100644 --- a/src/3rdparty/freetype/src/pfr/pfr.c +++ b/src/3rdparty/freetype/src/pfr/pfr.c @@ -4,7 +4,7 @@ * * FreeType PFR driver component. * - * Copyright (C) 2002-2019 by + * Copyright (C) 2002-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -17,7 +17,6 @@ #define FT_MAKE_OPTION_SINGLE_OBJECT -#include #include "pfrcmap.c" #include "pfrdrivr.c" diff --git a/src/3rdparty/freetype/src/pfr/pfrcmap.c b/src/3rdparty/freetype/src/pfr/pfrcmap.c index bfa1b9ea..ebc7b843 100644 --- a/src/3rdparty/freetype/src/pfr/pfrcmap.c +++ b/src/3rdparty/freetype/src/pfr/pfrcmap.c @@ -4,7 +4,7 @@ * * FreeType PFR cmap handling (body). * - * Copyright (C) 2002-2019 by + * Copyright (C) 2002-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -16,8 +16,7 @@ */ -#include -#include FT_INTERNAL_DEBUG_H +#include #include "pfrcmap.h" #include "pfrobjs.h" diff --git a/src/3rdparty/freetype/src/pfr/pfrcmap.h b/src/3rdparty/freetype/src/pfr/pfrcmap.h index 1e203a05..a6d920c3 100644 --- a/src/3rdparty/freetype/src/pfr/pfrcmap.h +++ b/src/3rdparty/freetype/src/pfr/pfrcmap.h @@ -4,7 +4,7 @@ * * FreeType PFR cmap handling (specification). * - * Copyright (C) 2002-2019 by + * Copyright (C) 2002-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -19,8 +19,7 @@ #ifndef PFRCMAP_H_ #define PFRCMAP_H_ -#include -#include FT_INTERNAL_OBJECTS_H +#include #include "pfrtypes.h" diff --git a/src/3rdparty/freetype/src/pfr/pfrdrivr.c b/src/3rdparty/freetype/src/pfr/pfrdrivr.c index f67eebf1..b1432087 100644 --- a/src/3rdparty/freetype/src/pfr/pfrdrivr.c +++ b/src/3rdparty/freetype/src/pfr/pfrdrivr.c @@ -4,7 +4,7 @@ * * FreeType PFR driver interface (body). * - * Copyright (C) 2002-2019 by + * Copyright (C) 2002-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -16,11 +16,10 @@ */ -#include -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_STREAM_H -#include FT_SERVICE_PFR_H -#include FT_SERVICE_FONT_FORMAT_H +#include +#include +#include +#include #include "pfrdrivr.h" #include "pfrobjs.h" diff --git a/src/3rdparty/freetype/src/pfr/pfrdrivr.h b/src/3rdparty/freetype/src/pfr/pfrdrivr.h index 33b7b941..7646b4d1 100644 --- a/src/3rdparty/freetype/src/pfr/pfrdrivr.h +++ b/src/3rdparty/freetype/src/pfr/pfrdrivr.h @@ -4,7 +4,7 @@ * * High-level Type PFR driver interface (specification). * - * Copyright (C) 2002-2019 by + * Copyright (C) 2002-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -20,8 +20,7 @@ #define PFRDRIVR_H_ -#include -#include FT_INTERNAL_DRIVER_H +#include FT_BEGIN_HEADER diff --git a/src/3rdparty/freetype/src/pfr/pfrerror.h b/src/3rdparty/freetype/src/pfr/pfrerror.h index 4829cfc0..33460ef4 100644 --- a/src/3rdparty/freetype/src/pfr/pfrerror.h +++ b/src/3rdparty/freetype/src/pfr/pfrerror.h @@ -4,7 +4,7 @@ * * PFR error codes (specification only). * - * Copyright (C) 2002-2019 by + * Copyright (C) 2002-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -25,7 +25,7 @@ #ifndef PFRERROR_H_ #define PFRERROR_H_ -#include FT_MODULE_ERRORS_H +#include #undef FTERRORS_H_ @@ -33,7 +33,7 @@ #define FT_ERR_PREFIX PFR_Err_ #define FT_ERR_BASE FT_Mod_Err_PFR -#include FT_ERRORS_H +#include #endif /* PFRERROR_H_ */ diff --git a/src/3rdparty/freetype/src/pfr/pfrgload.c b/src/3rdparty/freetype/src/pfr/pfrgload.c index 6ef5856a..aa640c3b 100644 --- a/src/3rdparty/freetype/src/pfr/pfrgload.c +++ b/src/3rdparty/freetype/src/pfr/pfrgload.c @@ -4,7 +4,7 @@ * * FreeType PFR glyph loader (body). * - * Copyright (C) 2002-2019 by + * Copyright (C) 2002-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -19,7 +19,7 @@ #include "pfrgload.h" #include "pfrsbit.h" #include "pfrload.h" /* for macro definitions */ -#include FT_INTERNAL_DEBUG_H +#include #include "pfrerror.h" @@ -451,7 +451,7 @@ case 1: /* 16-bit absolute value */ PFR_CHECK( 2 ); cur->x = PFR_NEXT_SHORT( p ); - FT_TRACE7(( " x.%d", cur->x )); + FT_TRACE7(( " x.%ld", cur->x )); break; case 2: /* 8-bit delta */ @@ -481,7 +481,7 @@ case 1: /* 16-bit absolute value */ PFR_CHECK( 2 ); cur->y = PFR_NEXT_SHORT( p ); - FT_TRACE7(( " y.%d", cur->y )); + FT_TRACE7(( " y.%ld", cur->y )); break; case 2: /* 8-bit delta */ diff --git a/src/3rdparty/freetype/src/pfr/pfrgload.h b/src/3rdparty/freetype/src/pfr/pfrgload.h index d0e1420b..f356b4c7 100644 --- a/src/3rdparty/freetype/src/pfr/pfrgload.h +++ b/src/3rdparty/freetype/src/pfr/pfrgload.h @@ -4,7 +4,7 @@ * * FreeType PFR glyph loader (specification). * - * Copyright (C) 2002-2019 by + * Copyright (C) 2002-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, diff --git a/src/3rdparty/freetype/src/pfr/pfrload.c b/src/3rdparty/freetype/src/pfr/pfrload.c index ccf0b7e1..a2832e55 100644 --- a/src/3rdparty/freetype/src/pfr/pfrload.c +++ b/src/3rdparty/freetype/src/pfr/pfrload.c @@ -4,7 +4,7 @@ * * FreeType PFR loader (body). * - * Copyright (C) 2002-2019 by + * Copyright (C) 2002-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -17,8 +17,8 @@ #include "pfrload.h" -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_STREAM_H +#include +#include #include "pfrerror.h" diff --git a/src/3rdparty/freetype/src/pfr/pfrload.h b/src/3rdparty/freetype/src/pfr/pfrload.h index 2e7ffd01..7615b9ce 100644 --- a/src/3rdparty/freetype/src/pfr/pfrload.h +++ b/src/3rdparty/freetype/src/pfr/pfrload.h @@ -4,7 +4,7 @@ * * FreeType PFR loader (specification). * - * Copyright (C) 2002-2019 by + * Copyright (C) 2002-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -20,7 +20,7 @@ #define PFRLOAD_H_ #include "pfrobjs.h" -#include FT_INTERNAL_STREAM_H +#include FT_BEGIN_HEADER diff --git a/src/3rdparty/freetype/src/pfr/pfrobjs.c b/src/3rdparty/freetype/src/pfr/pfrobjs.c index 9765f95c..918e7fd4 100644 --- a/src/3rdparty/freetype/src/pfr/pfrobjs.c +++ b/src/3rdparty/freetype/src/pfr/pfrobjs.c @@ -4,7 +4,7 @@ * * FreeType PFR object methods (body). * - * Copyright (C) 2002-2019 by + * Copyright (C) 2002-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -21,10 +21,10 @@ #include "pfrgload.h" #include "pfrcmap.h" #include "pfrsbit.h" -#include FT_OUTLINE_H -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_CALC_H -#include FT_TRUETYPE_IDS_H +#include +#include +#include +#include #include "pfrerror.h" diff --git a/src/3rdparty/freetype/src/pfr/pfrobjs.h b/src/3rdparty/freetype/src/pfr/pfrobjs.h index 39cffd07..808822f1 100644 --- a/src/3rdparty/freetype/src/pfr/pfrobjs.h +++ b/src/3rdparty/freetype/src/pfr/pfrobjs.h @@ -4,7 +4,7 @@ * * FreeType PFR object methods (specification). * - * Copyright (C) 2002-2019 by + * Copyright (C) 2002-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, diff --git a/src/3rdparty/freetype/src/pfr/pfrsbit.c b/src/3rdparty/freetype/src/pfr/pfrsbit.c index 00a96164..a6691e6d 100644 --- a/src/3rdparty/freetype/src/pfr/pfrsbit.c +++ b/src/3rdparty/freetype/src/pfr/pfrsbit.c @@ -4,7 +4,7 @@ * * FreeType PFR bitmap loader (body). * - * Copyright (C) 2002-2019 by + * Copyright (C) 2002-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -18,8 +18,8 @@ #include "pfrsbit.h" #include "pfrload.h" -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_STREAM_H +#include +#include #include "pfrerror.h" @@ -745,7 +745,7 @@ ypos + (FT_Long)ysize < FT_INT_MIN ) { FT_TRACE1(( "pfr_slot_load_bitmap:" )); - FT_TRACE1(( "huge bitmap glyph %dx%d over FT_GlyphSlot\n", + FT_TRACE1(( "huge bitmap glyph %ldx%ld over FT_GlyphSlot\n", xpos, ypos )); error = FT_THROW( Invalid_Pixel_Size ); } diff --git a/src/3rdparty/freetype/src/pfr/pfrsbit.h b/src/3rdparty/freetype/src/pfr/pfrsbit.h index 6568b909..8cb0de0d 100644 --- a/src/3rdparty/freetype/src/pfr/pfrsbit.h +++ b/src/3rdparty/freetype/src/pfr/pfrsbit.h @@ -4,7 +4,7 @@ * * FreeType PFR bitmap loader (specification). * - * Copyright (C) 2002-2019 by + * Copyright (C) 2002-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, diff --git a/src/3rdparty/freetype/src/pfr/pfrtypes.h b/src/3rdparty/freetype/src/pfr/pfrtypes.h index 6a5f9d57..06fb82d5 100644 --- a/src/3rdparty/freetype/src/pfr/pfrtypes.h +++ b/src/3rdparty/freetype/src/pfr/pfrtypes.h @@ -4,7 +4,7 @@ * * FreeType PFR data structures (specification only). * - * Copyright (C) 2002-2019 by + * Copyright (C) 2002-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -19,8 +19,7 @@ #ifndef PFRTYPES_H_ #define PFRTYPES_H_ -#include -#include FT_INTERNAL_OBJECTS_H +#include FT_BEGIN_HEADER diff --git a/src/3rdparty/freetype/src/pfr/rules.mk b/src/3rdparty/freetype/src/pfr/rules.mk index f14ca699..a1fe82ba 100644 --- a/src/3rdparty/freetype/src/pfr/rules.mk +++ b/src/3rdparty/freetype/src/pfr/rules.mk @@ -3,7 +3,7 @@ # -# Copyright (C) 2002-2019 by +# Copyright (C) 2002-2020 by # David Turner, Robert Wilhelm, and Werner Lemberg. # # This file is part of the FreeType project, and may only be used, modified, diff --git a/src/3rdparty/freetype/src/psaux/Jamfile b/src/3rdparty/freetype/src/psaux/Jamfile deleted file mode 100644 index 30bcc1c0..00000000 --- a/src/3rdparty/freetype/src/psaux/Jamfile +++ /dev/null @@ -1,45 +0,0 @@ -# FreeType 2 src/psaux Jamfile -# -# Copyright (C) 2001-2019 by -# David Turner, Robert Wilhelm, and Werner Lemberg. -# -# This file is part of the FreeType project, and may only be used, modified, -# and distributed under the terms of the FreeType project license, -# LICENSE.TXT. By continuing to use, modify, or distribute this file you -# indicate that you have read the license and understand and accept it -# fully. - -SubDir FT2_TOP $(FT2_SRC_DIR) psaux ; - -{ - local _sources ; - - if $(FT2_MULTI) - { - _sources = afmparse - psauxmod - psconv - psobjs - t1cmap - t1decode - cffdecode - psarrst - psblues - pserror - psfont - psft - pshints - psintrp - psread - psstack - ; - } - else - { - _sources = psaux ; - } - - Library $(FT2_LIB) : $(_sources).c ; -} - -# end of src/psaux Jamfile diff --git a/src/3rdparty/freetype/src/psaux/afmparse.c b/src/3rdparty/freetype/src/psaux/afmparse.c index f78adbba..2d6a0d9a 100644 --- a/src/3rdparty/freetype/src/psaux/afmparse.c +++ b/src/3rdparty/freetype/src/psaux/afmparse.c @@ -4,7 +4,7 @@ * * AFM parser (body). * - * Copyright (C) 2006-2019 by + * Copyright (C) 2006-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -15,10 +15,9 @@ * */ -#include -#include FT_FREETYPE_H -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_POSTSCRIPT_AUX_H +#include +#include +#include #ifndef T1_CONFIG_OPTION_NO_AFM diff --git a/src/3rdparty/freetype/src/psaux/afmparse.h b/src/3rdparty/freetype/src/psaux/afmparse.h index 2ceb7755..16a3a3e9 100644 --- a/src/3rdparty/freetype/src/psaux/afmparse.h +++ b/src/3rdparty/freetype/src/psaux/afmparse.h @@ -4,7 +4,7 @@ * * AFM parser (specification). * - * Copyright (C) 2006-2019 by + * Copyright (C) 2006-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -20,8 +20,7 @@ #define AFMPARSE_H_ -#include -#include FT_INTERNAL_POSTSCRIPT_AUX_H +#include FT_BEGIN_HEADER diff --git a/src/3rdparty/freetype/src/psaux/cffdecode.c b/src/3rdparty/freetype/src/psaux/cffdecode.c index 17cccf81..3d2da1e0 100644 --- a/src/3rdparty/freetype/src/psaux/cffdecode.c +++ b/src/3rdparty/freetype/src/psaux/cffdecode.c @@ -4,7 +4,7 @@ * * PostScript CFF (Type 2) decoding routines (body). * - * Copyright (C) 2017-2019 by + * Copyright (C) 2017-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -16,11 +16,10 @@ */ -#include -#include FT_FREETYPE_H -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_SERVICE_H -#include FT_SERVICE_CFF_TABLE_LOAD_H +#include +#include +#include +#include #include "cffdecode.h" #include "psobjs.h" @@ -330,7 +329,7 @@ builder->left_bearing.x = 0; builder->left_bearing.y = 0; - builder->pos_x = adx - asb; + builder->pos_x = SUB_LONG( adx, asb ); builder->pos_y = ady; /* Now load `achar' on top of the base outline. */ @@ -530,6 +529,9 @@ builder->path_begun = 0; + if ( !charstring_base ) + return FT_Err_Ok; + zone->base = charstring_base; limit = zone->limit = charstring_base + charstring_len; ip = zone->cursor = zone->base; diff --git a/src/3rdparty/freetype/src/psaux/cffdecode.h b/src/3rdparty/freetype/src/psaux/cffdecode.h index a6691979..77a49626 100644 --- a/src/3rdparty/freetype/src/psaux/cffdecode.h +++ b/src/3rdparty/freetype/src/psaux/cffdecode.h @@ -4,7 +4,7 @@ * * PostScript CFF (Type 2) decoding routines (specification). * - * Copyright (C) 2017-2019 by + * Copyright (C) 2017-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -20,8 +20,7 @@ #define CFFDECODE_H_ -#include -#include FT_INTERNAL_POSTSCRIPT_AUX_H +#include FT_BEGIN_HEADER diff --git a/src/3rdparty/freetype/src/psaux/module.mk b/src/3rdparty/freetype/src/psaux/module.mk index bb0886ab..651db014 100644 --- a/src/3rdparty/freetype/src/psaux/module.mk +++ b/src/3rdparty/freetype/src/psaux/module.mk @@ -3,7 +3,7 @@ # -# Copyright (C) 1996-2019 by +# Copyright (C) 1996-2020 by # David Turner, Robert Wilhelm, and Werner Lemberg. # # This file is part of the FreeType project, and may only be used, modified, diff --git a/src/3rdparty/freetype/src/psaux/psarrst.c b/src/3rdparty/freetype/src/psaux/psarrst.c index 011803b4..8751d275 100644 --- a/src/3rdparty/freetype/src/psaux/psarrst.c +++ b/src/3rdparty/freetype/src/psaux/psarrst.c @@ -37,7 +37,7 @@ #include "psft.h" -#include FT_INTERNAL_DEBUG_H +#include #include "psglue.h" #include "psarrst.h" diff --git a/src/3rdparty/freetype/src/psaux/psaux.c b/src/3rdparty/freetype/src/psaux/psaux.c index 1db04625..f4282222 100644 --- a/src/3rdparty/freetype/src/psaux/psaux.c +++ b/src/3rdparty/freetype/src/psaux/psaux.c @@ -4,7 +4,7 @@ * * FreeType auxiliary PostScript driver component (body only). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -17,7 +17,6 @@ #define FT_MAKE_OPTION_SINGLE_OBJECT -#include #include "afmparse.c" #include "psauxmod.c" diff --git a/src/3rdparty/freetype/src/psaux/psauxerr.h b/src/3rdparty/freetype/src/psaux/psauxerr.h index 523e1886..8b9a958a 100644 --- a/src/3rdparty/freetype/src/psaux/psauxerr.h +++ b/src/3rdparty/freetype/src/psaux/psauxerr.h @@ -4,7 +4,7 @@ * * PS auxiliary module error codes (specification only). * - * Copyright (C) 2001-2019 by + * Copyright (C) 2001-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -26,7 +26,7 @@ #ifndef PSAUXERR_H_ #define PSAUXERR_H_ -#include FT_MODULE_ERRORS_H +#include #undef FTERRORS_H_ @@ -34,7 +34,7 @@ #define FT_ERR_PREFIX PSaux_Err_ #define FT_ERR_BASE FT_Mod_Err_PSaux -#include FT_ERRORS_H +#include #endif /* PSAUXERR_H_ */ diff --git a/src/3rdparty/freetype/src/psaux/psauxmod.c b/src/3rdparty/freetype/src/psaux/psauxmod.c index 5df8e690..e73ba224 100644 --- a/src/3rdparty/freetype/src/psaux/psauxmod.c +++ b/src/3rdparty/freetype/src/psaux/psauxmod.c @@ -4,7 +4,7 @@ * * FreeType auxiliary PostScript module implementation (body). * - * Copyright (C) 2000-2019 by + * Copyright (C) 2000-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -16,7 +16,6 @@ */ -#include #include "psauxmod.h" #include "psobjs.h" #include "t1decode.h" @@ -171,9 +170,9 @@ }; - FT_CALLBACK_TABLE_DEF - const FT_Module_Class psaux_module_class = - { + FT_DEFINE_MODULE( + psaux_module_class, + 0, sizeof ( FT_ModuleRec ), "psaux", @@ -185,7 +184,7 @@ (FT_Module_Constructor)NULL, /* module_init */ (FT_Module_Destructor) NULL, /* module_done */ (FT_Module_Requester) NULL /* get_interface */ - }; + ) /* END */ diff --git a/src/3rdparty/freetype/src/psaux/psauxmod.h b/src/3rdparty/freetype/src/psaux/psauxmod.h index a0eda0bf..a6bebe4b 100644 --- a/src/3rdparty/freetype/src/psaux/psauxmod.h +++ b/src/3rdparty/freetype/src/psaux/psauxmod.h @@ -4,7 +4,7 @@ * * FreeType auxiliary PostScript module implementation (specification). * - * Copyright (C) 2000-2019 by + * Copyright (C) 2000-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -20,10 +20,9 @@ #define PSAUXMOD_H_ -#include -#include FT_MODULE_H +#include -#include FT_INTERNAL_POSTSCRIPT_AUX_H +#include FT_BEGIN_HEADER @@ -35,10 +34,24 @@ FT_BEGIN_HEADER FT_CALLBACK_TABLE const PS_Builder_FuncsRec ps_builder_funcs; +#ifndef T1_CONFIG_OPTION_NO_AFM + FT_CALLBACK_TABLE + const AFM_Parser_FuncsRec afm_parser_funcs; +#endif + + FT_CALLBACK_TABLE + const T1_CMap_ClassesRec t1_cmap_classes; + + FT_CALLBACK_TABLE + const CFF_Decoder_FuncsRec cff_decoder_funcs; + FT_EXPORT_VAR( const FT_Module_Class ) psaux_driver_class; + FT_DECLARE_MODULE( psaux_module_class ) + + FT_END_HEADER #endif /* PSAUXMOD_H_ */ diff --git a/src/3rdparty/freetype/src/psaux/psblues.c b/src/3rdparty/freetype/src/psaux/psblues.c index 89738ce4..3878e9bd 100644 --- a/src/3rdparty/freetype/src/psaux/psblues.c +++ b/src/3rdparty/freetype/src/psaux/psblues.c @@ -37,7 +37,7 @@ #include "psft.h" -#include FT_INTERNAL_DEBUG_H +#include #include "psblues.h" #include "pshints.h" diff --git a/src/3rdparty/freetype/src/psaux/psconv.c b/src/3rdparty/freetype/src/psaux/psconv.c index c8876168..4cf5cd5d 100644 --- a/src/3rdparty/freetype/src/psaux/psconv.c +++ b/src/3rdparty/freetype/src/psaux/psconv.c @@ -4,7 +4,7 @@ * * Some convenience conversions (body). * - * Copyright (C) 2006-2019 by + * Copyright (C) 2006-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -16,9 +16,8 @@ */ -#include -#include FT_INTERNAL_POSTSCRIPT_AUX_H -#include FT_INTERNAL_DEBUG_H +#include +#include #include "psconv.h" #include "psauxerr.h" diff --git a/src/3rdparty/freetype/src/psaux/psconv.h b/src/3rdparty/freetype/src/psaux/psconv.h index 6b24bf6f..833e8273 100644 --- a/src/3rdparty/freetype/src/psaux/psconv.h +++ b/src/3rdparty/freetype/src/psaux/psconv.h @@ -4,7 +4,7 @@ * * Some convenience conversions (specification). * - * Copyright (C) 2006-2019 by + * Copyright (C) 2006-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -20,8 +20,7 @@ #define PSCONV_H_ -#include -#include FT_INTERNAL_POSTSCRIPT_AUX_H +#include FT_BEGIN_HEADER diff --git a/src/3rdparty/freetype/src/psaux/pserror.h b/src/3rdparty/freetype/src/psaux/pserror.h index b2156b33..5738853f 100644 --- a/src/3rdparty/freetype/src/psaux/pserror.h +++ b/src/3rdparty/freetype/src/psaux/pserror.h @@ -40,7 +40,7 @@ #define PSERROR_H_ -#include FT_MODULE_ERRORS_H +#include #undef FTERRORS_H_ @@ -49,7 +49,8 @@ #define FT_ERR_BASE FT_Mod_Err_CF2 -#include FT_ERRORS_H +#include +#include #include "psft.h" diff --git a/src/3rdparty/freetype/src/psaux/psfont.c b/src/3rdparty/freetype/src/psaux/psfont.c index 00e42108..0db1f0c5 100644 --- a/src/3rdparty/freetype/src/psaux/psfont.c +++ b/src/3rdparty/freetype/src/psaux/psfont.c @@ -36,8 +36,7 @@ */ -#include -#include FT_INTERNAL_CALC_H +#include #include "psft.h" diff --git a/src/3rdparty/freetype/src/psaux/psfont.h b/src/3rdparty/freetype/src/psaux/psfont.h index 8fbacbb6..836fce4e 100644 --- a/src/3rdparty/freetype/src/psaux/psfont.h +++ b/src/3rdparty/freetype/src/psaux/psfont.h @@ -40,7 +40,7 @@ #define PSFONT_H_ -#include FT_SERVICE_CFF_TABLE_LOAD_H +#include #include "psft.h" #include "psblues.h" diff --git a/src/3rdparty/freetype/src/psaux/psft.c b/src/3rdparty/freetype/src/psaux/psft.c index 54be4683..41c16542 100644 --- a/src/3rdparty/freetype/src/psaux/psft.c +++ b/src/3rdparty/freetype/src/psaux/psft.c @@ -37,7 +37,7 @@ #include "psft.h" -#include FT_INTERNAL_DEBUG_H +#include #include "psfont.h" #include "pserror.h" @@ -45,11 +45,11 @@ #include "cffdecode.h" #ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT -#include FT_MULTIPLE_MASTERS_H -#include FT_SERVICE_MULTIPLE_MASTERS_H +#include +#include #endif -#include FT_SERVICE_CFF_TABLE_LOAD_H +#include #define CF2_MAX_SIZE cf2_intToFixed( 2000 ) /* max ppem */ @@ -313,7 +313,7 @@ FT_Error error = FT_Err_Ok; CF2_Font font; - FT_Bool is_t1 = decoder->builder.is_t1; + FT_Bool is_t1 = decoder->builder.is_t1; FT_ASSERT( decoder && @@ -385,7 +385,7 @@ FT_ZERO( &buf ); buf.start = buf.ptr = charstring_base; - buf.end = charstring_base + charstring_len; + buf.end = FT_OFFSET( charstring_base, charstring_len ); FT_ZERO( &transform ); @@ -697,7 +697,7 @@ FT_ASSERT( charstring + len >= charstring ); buf->start = charstring; - buf->end = charstring + len; + buf->end = FT_OFFSET( charstring, len ); buf->ptr = buf->start; return FT_Err_Ok; @@ -820,7 +820,7 @@ /* The CID driver stores subroutines with seed bytes. This */ /* case is taken care of when decoder->subrs_len == 0. */ if ( decoder->locals_len ) - buf->end = buf->start + decoder->locals_len[idx]; + buf->end = FT_OFFSET( buf->start, decoder->locals_len[idx] ); else { /* We are using subroutines from a CID font. We must adjust */ diff --git a/src/3rdparty/freetype/src/psaux/psft.h b/src/3rdparty/freetype/src/psaux/psft.h index 4c930f0d..3da454e6 100644 --- a/src/3rdparty/freetype/src/psaux/psft.h +++ b/src/3rdparty/freetype/src/psaux/psft.h @@ -40,17 +40,17 @@ #define PSFT_H_ +#include #include "pstypes.h" - /* TODO: disable asserts for now */ #define CF2_NDEBUG -#include FT_SYSTEM_H +#include #include "psglue.h" -#include FT_INTERNAL_POSTSCRIPT_AUX_H /* for PS_Decoder */ +#include /* for PS_Decoder */ FT_BEGIN_HEADER diff --git a/src/3rdparty/freetype/src/psaux/pshints.c b/src/3rdparty/freetype/src/psaux/pshints.c index 1cbecd2b..ce8cfca7 100644 --- a/src/3rdparty/freetype/src/psaux/pshints.c +++ b/src/3rdparty/freetype/src/psaux/pshints.c @@ -37,7 +37,7 @@ #include "psft.h" -#include FT_INTERNAL_DEBUG_H +#include #include "psglue.h" #include "psfont.h" @@ -310,7 +310,7 @@ CF2_Hint hint = &hintmap->edge[i]; - FT_TRACE6(( " %3d %7.2f %7.2f %5d %s%s%s%s\n", + FT_TRACE6(( " %3ld %7.2f %7.2f %5d %s%s%s%s\n", hint->index, hint->csCoord / 65536.0, hint->dsCoord / ( hint->scale * 1.0 ), diff --git a/src/3rdparty/freetype/src/psaux/psintrp.c b/src/3rdparty/freetype/src/psaux/psintrp.c index e2f3accd..519c6944 100644 --- a/src/3rdparty/freetype/src/psaux/psintrp.c +++ b/src/3rdparty/freetype/src/psaux/psintrp.c @@ -37,8 +37,8 @@ #include "psft.h" -#include FT_INTERNAL_DEBUG_H -#include FT_SERVICE_CFF_TABLE_LOAD_H +#include +#include #include "psglue.h" #include "psfont.h" @@ -1433,6 +1433,13 @@ lastError = error2; /* pass FreeType error through */ goto exit; } + + /* save the left bearing and width of the SEAC */ + /* glyph as they will be erased by the next load */ + + left_bearing = *decoder->builder.left_bearing; + advance = *decoder->builder.advance; + cf2_interpT2CharString( font, &component, callbacks, @@ -1443,11 +1450,14 @@ &dummyWidth ); cf2_freeT1SeacComponent( decoder, &component ); - /* save the left bearing and width of the base */ - /* character as they will be erased by the next load */ + /* If the SEAC glyph doesn't have a (H)SBW of its */ + /* own use the values from the base glyph. */ - left_bearing = *decoder->builder.left_bearing; - advance = *decoder->builder.advance; + if ( !haveWidth ) + { + left_bearing = *decoder->builder.left_bearing; + advance = *decoder->builder.advance; + } decoder->builder.left_bearing->x = 0; decoder->builder.left_bearing->y = 0; @@ -1473,8 +1483,8 @@ &dummyWidth ); cf2_freeT1SeacComponent( decoder, &component ); - /* restore the left side bearing and */ - /* advance width of the base character */ + /* restore the left side bearing and advance width */ + /* of the SEAC glyph or base character (saved above) */ *decoder->builder.left_bearing = left_bearing; *decoder->builder.advance = advance; diff --git a/src/3rdparty/freetype/src/psaux/psobjs.c b/src/3rdparty/freetype/src/psaux/psobjs.c index 8bfdb923..defc4d4f 100644 --- a/src/3rdparty/freetype/src/psaux/psobjs.c +++ b/src/3rdparty/freetype/src/psaux/psobjs.c @@ -4,7 +4,7 @@ * * Auxiliary functions for PostScript fonts (body). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -16,11 +16,10 @@ */ -#include -#include FT_INTERNAL_POSTSCRIPT_AUX_H -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_CALC_H -#include FT_DRIVER_H +#include +#include +#include +#include #include "psobjs.h" #include "psconv.h" @@ -214,7 +213,7 @@ } /* add the object to the base block and adjust offset */ - table->elements[idx] = table->block + table->cursor; + table->elements[idx] = FT_OFFSET( table->block, table->cursor ); table->lengths [idx] = length; FT_MEM_COPY( table->block + table->cursor, object, length ); @@ -1233,7 +1232,7 @@ bbox->xMax = FT_RoundFix( temp[2] ); bbox->yMax = FT_RoundFix( temp[3] ); - FT_TRACE4(( " [%d %d %d %d]", + FT_TRACE4(( " [%ld %ld %ld %ld]", bbox->xMin / 65536, bbox->yMin / 65536, bbox->xMax / 65536, @@ -1287,7 +1286,7 @@ bbox->xMax = FT_RoundFix( temp[i + 2 * max_objects] ); bbox->yMax = FT_RoundFix( temp[i + 3 * max_objects] ); - FT_TRACE4(( " [%d %d %d %d]", + FT_TRACE4(( " [%ld %ld %ld %ld]", bbox->xMin / 65536, bbox->yMin / 65536, bbox->xMax / 65536, @@ -2577,7 +2576,7 @@ FT_UShort seed ) { PS_Conv_EexecDecode( &buffer, - buffer + length, + FT_OFFSET( buffer, length ), buffer, length, &seed ); diff --git a/src/3rdparty/freetype/src/psaux/psobjs.h b/src/3rdparty/freetype/src/psaux/psobjs.h index c44dc450..fdad672b 100644 --- a/src/3rdparty/freetype/src/psaux/psobjs.h +++ b/src/3rdparty/freetype/src/psaux/psobjs.h @@ -4,7 +4,7 @@ * * Auxiliary functions for PostScript fonts (specification). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -20,9 +20,8 @@ #define PSOBJS_H_ -#include -#include FT_INTERNAL_POSTSCRIPT_AUX_H -#include FT_INTERNAL_CFF_OBJECTS_TYPES_H +#include +#include FT_BEGIN_HEADER diff --git a/src/3rdparty/freetype/src/psaux/psread.c b/src/3rdparty/freetype/src/psaux/psread.c index 86bfc03c..7f657f2c 100644 --- a/src/3rdparty/freetype/src/psaux/psread.c +++ b/src/3rdparty/freetype/src/psaux/psread.c @@ -37,7 +37,7 @@ #include "psft.h" -#include FT_INTERNAL_DEBUG_H +#include #include "psglue.h" diff --git a/src/3rdparty/freetype/src/psaux/psstack.c b/src/3rdparty/freetype/src/psaux/psstack.c index 66590680..7ae5256e 100644 --- a/src/3rdparty/freetype/src/psaux/psstack.c +++ b/src/3rdparty/freetype/src/psaux/psstack.c @@ -37,7 +37,7 @@ #include "psft.h" -#include FT_INTERNAL_DEBUG_H +#include #include "psglue.h" #include "psfont.h" @@ -59,12 +59,12 @@ CF2_Stack stack = NULL; - if ( !FT_NEW( stack ) ) - { - /* initialize the structure; FT_NEW zeroes it */ - stack->memory = memory; - stack->error = e; - } + if ( FT_NEW( stack ) ) + return NULL; + + /* initialize the structure; FT_NEW zeroes it */ + stack->memory = memory; + stack->error = e; /* allocate the stack buffer */ if ( FT_NEW_ARRAY( stack->buffer, stackSize ) ) diff --git a/src/3rdparty/freetype/src/psaux/psstack.h b/src/3rdparty/freetype/src/psaux/psstack.h index 18cd39bc..b9ef9edf 100644 --- a/src/3rdparty/freetype/src/psaux/psstack.h +++ b/src/3rdparty/freetype/src/psaux/psstack.h @@ -39,6 +39,7 @@ #ifndef PSSTACK_H_ #define PSSTACK_H_ +#include FT_BEGIN_HEADER diff --git a/src/3rdparty/freetype/src/psaux/pstypes.h b/src/3rdparty/freetype/src/psaux/pstypes.h index 041287e8..435ef7e1 100644 --- a/src/3rdparty/freetype/src/psaux/pstypes.h +++ b/src/3rdparty/freetype/src/psaux/pstypes.h @@ -39,8 +39,7 @@ #ifndef PSTYPES_H_ #define PSTYPES_H_ -#include -#include FT_FREETYPE_H +#include FT_BEGIN_HEADER diff --git a/src/3rdparty/freetype/src/psaux/rules.mk b/src/3rdparty/freetype/src/psaux/rules.mk index 2de734d5..f49aecbc 100644 --- a/src/3rdparty/freetype/src/psaux/rules.mk +++ b/src/3rdparty/freetype/src/psaux/rules.mk @@ -3,7 +3,7 @@ # -# Copyright (C) 1996-2019 by +# Copyright (C) 1996-2020 by # David Turner, Robert Wilhelm, and Werner Lemberg. # # This file is part of the FreeType project, and may only be used, modified, diff --git a/src/3rdparty/freetype/src/psaux/t1cmap.c b/src/3rdparty/freetype/src/psaux/t1cmap.c index d62d2d5c..e21e93ca 100644 --- a/src/3rdparty/freetype/src/psaux/t1cmap.c +++ b/src/3rdparty/freetype/src/psaux/t1cmap.c @@ -4,7 +4,7 @@ * * Type 1 character map support (body). * - * Copyright (C) 2002-2019 by + * Copyright (C) 2002-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -18,7 +18,7 @@ #include "t1cmap.h" -#include FT_INTERNAL_DEBUG_H +#include #include "psauxerr.h" diff --git a/src/3rdparty/freetype/src/psaux/t1cmap.h b/src/3rdparty/freetype/src/psaux/t1cmap.h index d325e7b5..03179651 100644 --- a/src/3rdparty/freetype/src/psaux/t1cmap.h +++ b/src/3rdparty/freetype/src/psaux/t1cmap.h @@ -4,7 +4,7 @@ * * Type 1 character map support (specification). * - * Copyright (C) 2002-2019 by + * Copyright (C) 2002-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -19,9 +19,8 @@ #ifndef T1CMAP_H_ #define T1CMAP_H_ -#include -#include FT_INTERNAL_OBJECTS_H -#include FT_INTERNAL_TYPE1_TYPES_H +#include +#include FT_BEGIN_HEADER diff --git a/src/3rdparty/freetype/src/psaux/t1decode.c b/src/3rdparty/freetype/src/psaux/t1decode.c index c2b3729b..2ed27ca1 100644 --- a/src/3rdparty/freetype/src/psaux/t1decode.c +++ b/src/3rdparty/freetype/src/psaux/t1decode.c @@ -4,7 +4,7 @@ * * PostScript Type 1 decoding routines (body). * - * Copyright (C) 2000-2019 by + * Copyright (C) 2000-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -16,12 +16,11 @@ */ -#include -#include FT_INTERNAL_CALC_H -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_POSTSCRIPT_HINTS_H -#include FT_INTERNAL_HASH_H -#include FT_OUTLINE_H +#include +#include +#include +#include +#include #include "t1decode.h" #include "psobjs.h" @@ -367,6 +366,12 @@ FT_GlyphLoader_Prepare( decoder->builder.loader ); /* prepare loader */ + /* save the left bearing and width of the SEAC */ + /* glyph as they will be erased by the next load */ + + left_bearing = decoder->builder.left_bearing; + advance = decoder->builder.advance; + /* the seac operator must not be nested */ decoder->seac = TRUE; error = t1_decoder_parse_glyph( decoder, (FT_UInt)bchar_index ); @@ -374,11 +379,14 @@ if ( error ) goto Exit; - /* save the left bearing and width of the base character */ - /* as they will be erased by the next load. */ + /* If the SEAC glyph doesn't have a (H)SBW of its */ + /* own use the values from the base glyph. */ - left_bearing = decoder->builder.left_bearing; - advance = decoder->builder.advance; + if ( decoder->builder.parse_state != T1_Parse_Have_Width ) + { + left_bearing = decoder->builder.left_bearing; + advance = decoder->builder.advance; + } decoder->builder.left_bearing.x = 0; decoder->builder.left_bearing.y = 0; @@ -396,8 +404,8 @@ if ( error ) goto Exit; - /* restore the left side bearing and */ - /* advance width of the base character */ + /* restore the left side bearing and advance width */ + /* of the SEAC glyph or base character (saved above) */ decoder->builder.left_bearing = left_bearing; decoder->builder.advance = advance; @@ -650,10 +658,8 @@ if ( value > 32000 || value < -32000 ) { if ( large_int ) - { FT_ERROR(( "t1_decoder_parse_charstrings:" " no `div' after large integer\n" )); - } else large_int = TRUE; } @@ -1231,8 +1237,8 @@ FT_UNUSED( orig_y ); - /* the `metrics_only' indicates that we only want to compute */ - /* the glyph's metrics (lsb + advance width), not load the */ + /* `metrics_only' indicates that we only want to compute the */ + /* glyph's metrics (lsb + advance width) without loading the */ /* rest of it; so exit immediately */ if ( builder->metrics_only ) { @@ -1266,8 +1272,8 @@ x = ADD_LONG( builder->pos_x, top[0] ); y = ADD_LONG( builder->pos_y, top[1] ); - /* the `metrics_only' indicates that we only want to compute */ - /* the glyph's metrics (lsb + advance width), not load the */ + /* `metrics_only' indicates that we only want to compute the */ + /* glyph's metrics (lsb + advance width) without loading the */ /* rest of it; so exit immediately */ if ( builder->metrics_only ) { @@ -1690,6 +1696,7 @@ FT_Byte* ip; FT_Byte* limit; T1_Builder builder = &decoder->builder; + FT_Bool large_int; #ifdef FT_DEBUG_LEVEL_TRACE FT_Bool bol = TRUE; @@ -1707,6 +1714,8 @@ limit = zone->limit = charstring_base + charstring_len; ip = zone->cursor = zone->base; + large_int = FALSE; + /* now, execute loop */ while ( ip < limit ) { @@ -1718,7 +1727,7 @@ #ifdef FT_DEBUG_LEVEL_TRACE if ( bol ) { - FT_TRACE5(( " (%d)", decoder->top - decoder->stack )); + FT_TRACE5(( " (%ld)", decoder->top - decoder->stack )); bol = FALSE; } #endif @@ -1740,8 +1749,6 @@ case 7: case 8: case 9: - case 10: - case 11: case 14: case 15: case 21: @@ -1750,6 +1757,13 @@ case 31: goto No_Width; + case 10: + op = op_callsubr; + break; + case 11: + op = op_return; + break; + case 13: op = op_hsbw; break; @@ -1767,6 +1781,9 @@ case 7: op = op_sbw; break; + case 12: + op = op_div; + break; default: goto No_Width; @@ -1796,13 +1813,19 @@ /* anyway. */ if ( value > 32000 || value < -32000 ) { - FT_ERROR(( "t1_decoder_parse_metrics:" - " large integer found for width\n" )); - goto Syntax_Error; + if ( large_int ) + { + FT_ERROR(( "t1_decoder_parse_metrics:" + " no `div' after large integer\n" )); + goto Syntax_Error; + } + else + large_int = TRUE; } else { - value = (FT_Int32)( (FT_UInt32)value << 16 ); + if ( !large_int ) + value = (FT_Int32)( (FT_UInt32)value << 16 ); } break; @@ -1827,7 +1850,8 @@ value = -( ( ( ip[-2] - 251 ) * 256 ) + ip[-1] + 108 ); } - value = (FT_Int32)( (FT_UInt32)value << 16 ); + if ( !large_int ) + value = (FT_Int32)( (FT_UInt32)value << 16 ); } else { @@ -1837,6 +1861,13 @@ } } + if ( large_int && !( op == op_none || op == op_div ) ) + { + FT_ERROR(( "t1_decoder_parse_metrics:" + " no `div' after large integer\n" )); + goto Syntax_Error; + } + /********************************************************************** * * Push value on stack, or process operator @@ -1851,6 +1882,9 @@ } #ifdef FT_DEBUG_LEVEL_TRACE + if ( large_int ) + FT_TRACE4(( " %d", value )); + else FT_TRACE4(( " %d", value / 65536 )); #endif @@ -1869,11 +1903,21 @@ #ifdef FT_DEBUG_LEVEL_TRACE - if ( top - decoder->stack != num_args ) - FT_TRACE0(( "t1_decoder_parse_metrics:" - " too much operands on the stack" - " (seen %d, expected %d)\n", - top - decoder->stack, num_args )); + switch ( op ) + { + case op_callsubr: + case op_div: + case op_return: + break; + + default: + if ( top - decoder->stack != num_args ) + FT_TRACE0(( "t1_decoder_parse_metrics:" + " too much operands on the stack" + " (seen %ld, expected %d)\n", + top - decoder->stack, num_args )); + break; + } #endif /* FT_DEBUG_LEVEL_TRACE */ @@ -1893,8 +1937,8 @@ builder->advance.y = 0; /* we only want to compute the glyph's metrics */ - /* (lsb + advance width), not load the rest of */ - /* it; so exit immediately */ + /* (lsb + advance width) without loading the */ + /* rest of it; so exit immediately */ FT_TRACE4(( "\n" )); return FT_Err_Ok; @@ -1912,17 +1956,116 @@ builder->advance.y = top[3]; /* we only want to compute the glyph's metrics */ - /* (lsb + advance width), not load the rest of */ - /* it; so exit immediately */ + /* (lsb + advance width), without loading the */ + /* rest of it; so exit immediately */ FT_TRACE4(( "\n" )); return FT_Err_Ok; + case op_div: + FT_TRACE4(( " div" )); + + /* if `large_int' is set, we divide unscaled numbers; */ + /* otherwise, we divide numbers in 16.16 format -- */ + /* in both cases, it is the same operation */ + *top = FT_DivFix( top[0], top[1] ); + top++; + + large_int = FALSE; + break; + + case op_callsubr: + { + FT_Int idx; + + + FT_TRACE4(( " callsubr" )); + + idx = Fix2Int( top[0] ); + + if ( decoder->subrs_hash ) + { + size_t* val = ft_hash_num_lookup( idx, + decoder->subrs_hash ); + + + if ( val ) + idx = *val; + else + idx = -1; + } + + if ( idx < 0 || idx >= decoder->num_subrs ) + { + FT_ERROR(( "t1_decoder_parse_metrics:" + " invalid subrs index\n" )); + goto Syntax_Error; + } + + if ( zone - decoder->zones >= T1_MAX_SUBRS_CALLS ) + { + FT_ERROR(( "t1_decoder_parse_metrics:" + " too many nested subrs\n" )); + goto Syntax_Error; + } + + zone->cursor = ip; /* save current instruction pointer */ + + zone++; + + /* The Type 1 driver stores subroutines without the seed bytes. */ + /* The CID driver stores subroutines with seed bytes. This */ + /* case is taken care of when decoder->subrs_len == 0. */ + zone->base = decoder->subrs[idx]; + + if ( decoder->subrs_len ) + zone->limit = zone->base + decoder->subrs_len[idx]; + else + { + /* We are using subroutines from a CID font. We must adjust */ + /* for the seed bytes. */ + zone->base += ( decoder->lenIV >= 0 ? decoder->lenIV : 0 ); + zone->limit = decoder->subrs[idx + 1]; + } + + zone->cursor = zone->base; + + if ( !zone->base ) + { + FT_ERROR(( "t1_decoder_parse_metrics:" + " invoking empty subrs\n" )); + goto Syntax_Error; + } + + decoder->zone = zone; + ip = zone->base; + limit = zone->limit; + break; + } + + case op_return: + FT_TRACE4(( " return" )); + + if ( zone <= decoder->zones ) + { + FT_ERROR(( "t1_decoder_parse_metrics:" + " unexpected return\n" )); + goto Syntax_Error; + } + + zone--; + ip = zone->cursor; + limit = zone->limit; + decoder->zone = zone; + break; + default: FT_ERROR(( "t1_decoder_parse_metrics:" " unhandled opcode %d\n", op )); goto Syntax_Error; } + decoder->top = top; + } /* general operator processing */ } /* while ip < limit */ diff --git a/src/3rdparty/freetype/src/psaux/t1decode.h b/src/3rdparty/freetype/src/psaux/t1decode.h index 1b5d6263..b793504a 100644 --- a/src/3rdparty/freetype/src/psaux/t1decode.h +++ b/src/3rdparty/freetype/src/psaux/t1decode.h @@ -4,7 +4,7 @@ * * PostScript Type 1 decoding routines (specification). * - * Copyright (C) 2000-2019 by + * Copyright (C) 2000-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -20,9 +20,8 @@ #define T1DECODE_H_ -#include -#include FT_INTERNAL_POSTSCRIPT_AUX_H -#include FT_INTERNAL_TYPE1_TYPES_H +#include +#include FT_BEGIN_HEADER diff --git a/src/3rdparty/freetype/src/pshinter/Jamfile b/src/3rdparty/freetype/src/pshinter/Jamfile deleted file mode 100644 index 0e44c191..00000000 --- a/src/3rdparty/freetype/src/pshinter/Jamfile +++ /dev/null @@ -1,34 +0,0 @@ -# FreeType 2 src/pshinter Jamfile -# -# Copyright (C) 2001-2019 by -# David Turner, Robert Wilhelm, and Werner Lemberg. -# -# This file is part of the FreeType project, and may only be used, modified, -# and distributed under the terms of the FreeType project license, -# LICENSE.TXT. By continuing to use, modify, or distribute this file you -# indicate that you have read the license and understand and accept it -# fully. - -SubDir FT2_TOP $(FT2_SRC_DIR) pshinter ; - -{ - local _sources ; - - if $(FT2_MULTI) - { - _sources = pshalgo - pshglob - pshmod - pshpic - pshrec - ; - } - else - { - _sources = pshinter ; - } - - Library $(FT2_LIB) : $(_sources).c ; -} - -# end of src/pshinter Jamfile diff --git a/src/3rdparty/freetype/src/pshinter/module.mk b/src/3rdparty/freetype/src/pshinter/module.mk index 0a12a260..b440d2e7 100644 --- a/src/3rdparty/freetype/src/pshinter/module.mk +++ b/src/3rdparty/freetype/src/pshinter/module.mk @@ -3,7 +3,7 @@ # -# Copyright (C) 1996-2019 by +# Copyright (C) 1996-2020 by # David Turner, Robert Wilhelm, and Werner Lemberg. # # This file is part of the FreeType project, and may only be used, modified, diff --git a/src/3rdparty/freetype/src/pshinter/pshalgo.c b/src/3rdparty/freetype/src/pshinter/pshalgo.c index 0c5ae626..920b9a74 100644 --- a/src/3rdparty/freetype/src/pshinter/pshalgo.c +++ b/src/3rdparty/freetype/src/pshinter/pshalgo.c @@ -4,7 +4,7 @@ * * PostScript hinting algorithm (body). * - * Copyright (C) 2001-2019 by + * Copyright (C) 2001-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used @@ -16,10 +16,9 @@ */ -#include -#include FT_INTERNAL_OBJECTS_H -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_CALC_H +#include +#include +#include #include "pshalgo.h" #include "pshnterr.h" diff --git a/src/3rdparty/freetype/src/pshinter/pshalgo.h b/src/3rdparty/freetype/src/pshinter/pshalgo.h index 6859e95c..5367a5d1 100644 --- a/src/3rdparty/freetype/src/pshinter/pshalgo.h +++ b/src/3rdparty/freetype/src/pshinter/pshalgo.h @@ -4,7 +4,7 @@ * * PostScript hinting algorithm (specification). * - * Copyright (C) 2001-2019 by + * Copyright (C) 2001-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, diff --git a/src/3rdparty/freetype/src/pshinter/pshglob.c b/src/3rdparty/freetype/src/pshinter/pshglob.c index b021e6e4..cdc1c3af 100644 --- a/src/3rdparty/freetype/src/pshinter/pshglob.c +++ b/src/3rdparty/freetype/src/pshinter/pshglob.c @@ -5,7 +5,7 @@ * PostScript hinter global hinting management (body). * Inspired by the new auto-hinter module. * - * Copyright (C) 2001-2019 by + * Copyright (C) 2001-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used @@ -17,10 +17,9 @@ */ -#include -#include FT_FREETYPE_H -#include FT_INTERNAL_OBJECTS_H -#include FT_INTERNAL_CALC_H +#include +#include +#include #include "pshglob.h" #ifdef DEBUG_HINTER diff --git a/src/3rdparty/freetype/src/pshinter/pshglob.h b/src/3rdparty/freetype/src/pshinter/pshglob.h index 0049d4c0..8181324e 100644 --- a/src/3rdparty/freetype/src/pshinter/pshglob.h +++ b/src/3rdparty/freetype/src/pshinter/pshglob.h @@ -4,7 +4,7 @@ * * PostScript hinter global hinting management. * - * Copyright (C) 2001-2019 by + * Copyright (C) 2001-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -20,8 +20,8 @@ #define PSHGLOB_H_ -#include FT_FREETYPE_H -#include FT_INTERNAL_POSTSCRIPT_HINTS_H +#include +#include FT_BEGIN_HEADER diff --git a/src/3rdparty/freetype/src/pshinter/pshinter.c b/src/3rdparty/freetype/src/pshinter/pshinter.c index 16c3a0a1..3cca0ad7 100644 --- a/src/3rdparty/freetype/src/pshinter/pshinter.c +++ b/src/3rdparty/freetype/src/pshinter/pshinter.c @@ -4,7 +4,7 @@ * * FreeType PostScript Hinting module * - * Copyright (C) 2001-2019 by + * Copyright (C) 2001-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -17,7 +17,6 @@ #define FT_MAKE_OPTION_SINGLE_OBJECT -#include #include "pshalgo.c" #include "pshglob.c" diff --git a/src/3rdparty/freetype/src/pshinter/pshmod.c b/src/3rdparty/freetype/src/pshinter/pshmod.c index 2d36ea2a..e0abd386 100644 --- a/src/3rdparty/freetype/src/pshinter/pshmod.c +++ b/src/3rdparty/freetype/src/pshinter/pshmod.c @@ -4,7 +4,7 @@ * * FreeType PostScript hinter module implementation (body). * - * Copyright (C) 2001-2019 by + * Copyright (C) 2001-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -16,10 +16,10 @@ */ -#include -#include FT_INTERNAL_OBJECTS_H +#include #include "pshrec.h" #include "pshalgo.h" +#include "pshmod.h" /* the Postscript Hinter module structure */ diff --git a/src/3rdparty/freetype/src/pshinter/pshmod.h b/src/3rdparty/freetype/src/pshinter/pshmod.h index ea877130..2a6eb1c4 100644 --- a/src/3rdparty/freetype/src/pshinter/pshmod.h +++ b/src/3rdparty/freetype/src/pshinter/pshmod.h @@ -4,7 +4,7 @@ * * PostScript hinter module interface (specification). * - * Copyright (C) 2001-2019 by + * Copyright (C) 2001-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -20,8 +20,7 @@ #define PSHMOD_H_ -#include -#include FT_MODULE_H +#include FT_BEGIN_HEADER diff --git a/src/3rdparty/freetype/src/pshinter/pshnterr.h b/src/3rdparty/freetype/src/pshinter/pshnterr.h index fb9dbca2..d67955c4 100644 --- a/src/3rdparty/freetype/src/pshinter/pshnterr.h +++ b/src/3rdparty/freetype/src/pshinter/pshnterr.h @@ -4,7 +4,7 @@ * * PS Hinter error codes (specification only). * - * Copyright (C) 2003-2019 by + * Copyright (C) 2003-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -25,7 +25,7 @@ #ifndef PSHNTERR_H_ #define PSHNTERR_H_ -#include FT_MODULE_ERRORS_H +#include #undef FTERRORS_H_ @@ -33,7 +33,7 @@ #define FT_ERR_PREFIX PSH_Err_ #define FT_ERR_BASE FT_Mod_Err_PShinter -#include FT_ERRORS_H +#include #endif /* PSHNTERR_H_ */ diff --git a/src/3rdparty/freetype/src/pshinter/pshpic.c b/src/3rdparty/freetype/src/pshinter/pshpic.c deleted file mode 100644 index 465ad318..00000000 --- a/src/3rdparty/freetype/src/pshinter/pshpic.c +++ /dev/null @@ -1,76 +0,0 @@ -/***************************************************************************/ -/* */ -/* pshpic.c */ -/* */ -/* The FreeType position independent code services for pshinter module. */ -/* */ -/* Copyright 2009-2018 by */ -/* Oran Agra and Mickey Gabel. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#include -#include FT_FREETYPE_H -#include FT_INTERNAL_OBJECTS_H -#include "pshpic.h" -#include "pshnterr.h" - - -#ifdef FT_CONFIG_OPTION_PIC - - /* forward declaration of PIC init functions from pshmod.c */ - void - FT_Init_Class_pshinter_interface( FT_Library library, - PSHinter_Interface* clazz ); - - void - pshinter_module_class_pic_free( FT_Library library ) - { - FT_PIC_Container* pic_container = &library->pic_container; - FT_Memory memory = library->memory; - - - if ( pic_container->pshinter ) - { - FT_FREE( pic_container->pshinter ); - pic_container->pshinter = NULL; - } - } - - - FT_Error - pshinter_module_class_pic_init( FT_Library library ) - { - FT_PIC_Container* pic_container = &library->pic_container; - FT_Error error = FT_Err_Ok; - PSHinterPIC* container = NULL; - FT_Memory memory = library->memory; - - - /* allocate pointer, clear and set global container pointer */ - if ( FT_ALLOC( container, sizeof ( *container ) ) ) - return error; - FT_MEM_SET( container, 0, sizeof ( *container ) ); - pic_container->pshinter = container; - - /* add call to initialization function when you add new scripts */ - FT_Init_Class_pshinter_interface( - library, &container->pshinter_interface ); - - if ( error ) - pshinter_module_class_pic_free( library ); - - return error; - } - -#endif /* FT_CONFIG_OPTION_PIC */ - - -/* END */ diff --git a/src/3rdparty/freetype/src/pshinter/pshpic.h b/src/3rdparty/freetype/src/pshinter/pshpic.h deleted file mode 100644 index 4469ba87..00000000 --- a/src/3rdparty/freetype/src/pshinter/pshpic.h +++ /dev/null @@ -1,63 +0,0 @@ -/***************************************************************************/ -/* */ -/* pshpic.h */ -/* */ -/* The FreeType position independent code services for pshinter module. */ -/* */ -/* Copyright 2009-2018 by */ -/* Oran Agra and Mickey Gabel. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef PSHPIC_H_ -#define PSHPIC_H_ - - -#include FT_INTERNAL_PIC_H - - -#ifndef FT_CONFIG_OPTION_PIC - -#define PSHINTER_INTERFACE_GET pshinter_interface - -#else /* FT_CONFIG_OPTION_PIC */ - -#include FT_INTERNAL_POSTSCRIPT_HINTS_H - -FT_BEGIN_HEADER - - typedef struct PSHinterPIC_ - { - PSHinter_Interface pshinter_interface; - - } PSHinterPIC; - - -#define GET_PIC( lib ) ( (PSHinterPIC*)( (lib)->pic_container.pshinter ) ) - -#define PSHINTER_INTERFACE_GET ( GET_PIC( library )->pshinter_interface ) - - /* see pshpic.c for the implementation */ - void - pshinter_module_class_pic_free( FT_Library library ); - - FT_Error - pshinter_module_class_pic_init( FT_Library library ); - -FT_END_HEADER - -#endif /* FT_CONFIG_OPTION_PIC */ - - /* */ - -#endif /* PSHPIC_H_ */ - - -/* END */ diff --git a/src/3rdparty/freetype/src/pshinter/pshrec.c b/src/3rdparty/freetype/src/pshinter/pshrec.c index 9dd09efe..bddccf2a 100644 --- a/src/3rdparty/freetype/src/pshinter/pshrec.c +++ b/src/3rdparty/freetype/src/pshinter/pshrec.c @@ -4,7 +4,7 @@ * * FreeType PostScript hints recorder (body). * - * Copyright (C) 2001-2019 by + * Copyright (C) 2001-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -16,11 +16,10 @@ */ -#include -#include FT_FREETYPE_H -#include FT_INTERNAL_OBJECTS_H -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_CALC_H +#include +#include +#include +#include #include "pshrec.h" #include "pshalgo.h" @@ -875,7 +874,7 @@ if ( error ) { FT_ERROR(( "ps_hints_stem: could not add stem" - " (%d,%d) to hints table\n", stems[0], stems[1] )); + " (%ld,%ld) to hints table\n", stems[0], stems[1] )); hints->error = error; return; diff --git a/src/3rdparty/freetype/src/pshinter/pshrec.h b/src/3rdparty/freetype/src/pshinter/pshrec.h index 02cc2102..b13c7be1 100644 --- a/src/3rdparty/freetype/src/pshinter/pshrec.h +++ b/src/3rdparty/freetype/src/pshinter/pshrec.h @@ -4,7 +4,7 @@ * * Postscript (Type1/Type2) hints recorder (specification). * - * Copyright (C) 2001-2019 by + * Copyright (C) 2001-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -32,8 +32,7 @@ #define PSHREC_H_ -#include -#include FT_INTERNAL_POSTSCRIPT_HINTS_H +#include #include "pshglob.h" diff --git a/src/3rdparty/freetype/src/pshinter/rules.mk b/src/3rdparty/freetype/src/pshinter/rules.mk index 58227d10..c845c255 100644 --- a/src/3rdparty/freetype/src/pshinter/rules.mk +++ b/src/3rdparty/freetype/src/pshinter/rules.mk @@ -3,7 +3,7 @@ # -# Copyright (C) 2001-2019 by +# Copyright (C) 2001-2020 by # David Turner, Robert Wilhelm, and Werner Lemberg. # # This file is part of the FreeType project, and may only be used, modified, diff --git a/src/3rdparty/freetype/src/psnames/Jamfile b/src/3rdparty/freetype/src/psnames/Jamfile deleted file mode 100644 index 75978a87..00000000 --- a/src/3rdparty/freetype/src/psnames/Jamfile +++ /dev/null @@ -1,31 +0,0 @@ -# FreeType 2 src/psnames Jamfile -# -# Copyright (C) 2001-2019 by -# David Turner, Robert Wilhelm, and Werner Lemberg. -# -# This file is part of the FreeType project, and may only be used, modified, -# and distributed under the terms of the FreeType project license, -# LICENSE.TXT. By continuing to use, modify, or distribute this file you -# indicate that you have read the license and understand and accept it -# fully. - -SubDir FT2_TOP $(FT2_SRC_DIR) psnames ; - -{ - local _sources ; - - if $(FT2_MULTI) - { - _sources = psmodule - pspic - ; - } - else - { - _sources = psnames ; - } - - Library $(FT2_LIB) : $(_sources).c ; -} - -# end of src/psnames Jamfile diff --git a/src/3rdparty/freetype/src/psnames/module.mk b/src/3rdparty/freetype/src/psnames/module.mk index 0806a318..675bb371 100644 --- a/src/3rdparty/freetype/src/psnames/module.mk +++ b/src/3rdparty/freetype/src/psnames/module.mk @@ -3,7 +3,7 @@ # -# Copyright (C) 1996-2019 by +# Copyright (C) 1996-2020 by # David Turner, Robert Wilhelm, and Werner Lemberg. # # This file is part of the FreeType project, and may only be used, modified, diff --git a/src/3rdparty/freetype/src/psnames/psmodule.c b/src/3rdparty/freetype/src/psnames/psmodule.c index 0ec440e6..b38f9d3b 100644 --- a/src/3rdparty/freetype/src/psnames/psmodule.c +++ b/src/3rdparty/freetype/src/psnames/psmodule.c @@ -4,7 +4,7 @@ * * psnames module implementation (body). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -16,10 +16,9 @@ */ -#include -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_OBJECTS_H -#include FT_SERVICE_POSTSCRIPT_CMAPS_H +#include +#include +#include #include "psmodule.h" diff --git a/src/3rdparty/freetype/src/psnames/psmodule.h b/src/3rdparty/freetype/src/psnames/psmodule.h index 0df9a7d8..c85a9eca 100644 --- a/src/3rdparty/freetype/src/psnames/psmodule.h +++ b/src/3rdparty/freetype/src/psnames/psmodule.h @@ -4,7 +4,7 @@ * * High-level psnames module interface (specification). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -20,8 +20,7 @@ #define PSMODULE_H_ -#include -#include FT_MODULE_H +#include FT_BEGIN_HEADER diff --git a/src/3rdparty/freetype/src/psnames/psnamerr.h b/src/3rdparty/freetype/src/psnames/psnamerr.h index 67ab1765..154c701d 100644 --- a/src/3rdparty/freetype/src/psnames/psnamerr.h +++ b/src/3rdparty/freetype/src/psnames/psnamerr.h @@ -4,7 +4,7 @@ * * PS names module error codes (specification only). * - * Copyright (C) 2001-2019 by + * Copyright (C) 2001-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -26,7 +26,7 @@ #ifndef PSNAMERR_H_ #define PSNAMERR_H_ -#include FT_MODULE_ERRORS_H +#include #undef FTERRORS_H_ @@ -34,7 +34,7 @@ #define FT_ERR_PREFIX PSnames_Err_ #define FT_ERR_BASE FT_Mod_Err_PSnames -#include FT_ERRORS_H +#include #endif /* PSNAMERR_H_ */ diff --git a/src/3rdparty/freetype/src/psnames/psnames.c b/src/3rdparty/freetype/src/psnames/psnames.c index 4722f988..cff36851 100644 --- a/src/3rdparty/freetype/src/psnames/psnames.c +++ b/src/3rdparty/freetype/src/psnames/psnames.c @@ -4,7 +4,7 @@ * * FreeType psnames module component (body only). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -17,7 +17,6 @@ #define FT_MAKE_OPTION_SINGLE_OBJECT -#include #include "psmodule.c" diff --git a/src/3rdparty/freetype/src/psnames/pspic.c b/src/3rdparty/freetype/src/psnames/pspic.c deleted file mode 100644 index 85a06f36..00000000 --- a/src/3rdparty/freetype/src/psnames/pspic.c +++ /dev/null @@ -1,97 +0,0 @@ -/***************************************************************************/ -/* */ -/* pspic.c */ -/* */ -/* The FreeType position independent code services for psnames module. */ -/* */ -/* Copyright 2009-2018 by */ -/* Oran Agra and Mickey Gabel. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#include -#include FT_FREETYPE_H -#include FT_INTERNAL_OBJECTS_H -#include "pspic.h" -#include "psnamerr.h" - - -#ifdef FT_CONFIG_OPTION_PIC - - /* forward declaration of PIC init functions from psmodule.c */ - FT_Error - FT_Create_Class_pscmaps_services( FT_Library library, - FT_ServiceDescRec** output_class ); - void - FT_Destroy_Class_pscmaps_services( FT_Library library, - FT_ServiceDescRec* clazz ); - - void - FT_Init_Class_pscmaps_interface( FT_Library library, - FT_Service_PsCMapsRec* clazz ); - - - void - psnames_module_class_pic_free( FT_Library library ) - { - FT_PIC_Container* pic_container = &library->pic_container; - FT_Memory memory = library->memory; - - - if ( pic_container->psnames ) - { - PSModulePIC* container = (PSModulePIC*)pic_container->psnames; - - - if ( container->pscmaps_services ) - FT_Destroy_Class_pscmaps_services( library, - container->pscmaps_services ); - container->pscmaps_services = NULL; - FT_FREE( container ); - pic_container->psnames = NULL; - } - } - - - FT_Error - psnames_module_class_pic_init( FT_Library library ) - { - FT_PIC_Container* pic_container = &library->pic_container; - FT_Error error = FT_Err_Ok; - PSModulePIC* container = NULL; - FT_Memory memory = library->memory; - - - /* allocate pointer, clear and set global container pointer */ - if ( FT_ALLOC( container, sizeof ( *container ) ) ) - return error; - FT_MEM_SET( container, 0, sizeof ( *container ) ); - pic_container->psnames = container; - - /* initialize pointer table - */ - /* this is how the module usually expects this data */ - error = FT_Create_Class_pscmaps_services( - library, &container->pscmaps_services ); - if ( error ) - goto Exit; - FT_Init_Class_pscmaps_interface( library, - &container->pscmaps_interface ); - - Exit: - if ( error ) - psnames_module_class_pic_free( library ); - return error; - } - - -#endif /* FT_CONFIG_OPTION_PIC */ - - -/* END */ diff --git a/src/3rdparty/freetype/src/psnames/pspic.h b/src/3rdparty/freetype/src/psnames/pspic.h deleted file mode 100644 index 889780cc..00000000 --- a/src/3rdparty/freetype/src/psnames/pspic.h +++ /dev/null @@ -1,68 +0,0 @@ -/***************************************************************************/ -/* */ -/* pspic.h */ -/* */ -/* The FreeType position independent code services for psnames module. */ -/* */ -/* Copyright 2009-2018 by */ -/* Oran Agra and Mickey Gabel. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef PSPIC_H_ -#define PSPIC_H_ - - -#include FT_INTERNAL_PIC_H - - -#ifndef FT_CONFIG_OPTION_PIC - -#define PSCMAPS_SERVICES_GET pscmaps_services -#define PSCMAPS_INTERFACE_GET pscmaps_interface - -#else /* FT_CONFIG_OPTION_PIC */ - -#include FT_SERVICE_POSTSCRIPT_CMAPS_H - - -FT_BEGIN_HEADER - - typedef struct PSModulePIC_ - { - FT_ServiceDescRec* pscmaps_services; - FT_Service_PsCMapsRec pscmaps_interface; - - } PSModulePIC; - - -#define GET_PIC( lib ) \ - ( (PSModulePIC*)((lib)->pic_container.psnames) ) -#define PSCMAPS_SERVICES_GET ( GET_PIC( library )->pscmaps_services ) -#define PSCMAPS_INTERFACE_GET ( GET_PIC( library )->pscmaps_interface ) - - - /* see pspic.c for the implementation */ - void - psnames_module_class_pic_free( FT_Library library ); - - FT_Error - psnames_module_class_pic_init( FT_Library library ); - -FT_END_HEADER - -#endif /* FT_CONFIG_OPTION_PIC */ - - /* */ - -#endif /* PSPIC_H_ */ - - -/* END */ diff --git a/src/3rdparty/freetype/src/psnames/pstables.h b/src/3rdparty/freetype/src/psnames/pstables.h index c0139bbc..c215f16f 100644 --- a/src/3rdparty/freetype/src/psnames/pstables.h +++ b/src/3rdparty/freetype/src/psnames/pstables.h @@ -4,7 +4,7 @@ * * PostScript glyph names. * - * Copyright (C) 2005-2019 by + * Copyright (C) 2005-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, diff --git a/src/3rdparty/freetype/src/psnames/rules.mk b/src/3rdparty/freetype/src/psnames/rules.mk index dcc203e3..14cdda3a 100644 --- a/src/3rdparty/freetype/src/psnames/rules.mk +++ b/src/3rdparty/freetype/src/psnames/rules.mk @@ -3,7 +3,7 @@ # -# Copyright (C) 1996-2019 by +# Copyright (C) 1996-2020 by # David Turner, Robert Wilhelm, and Werner Lemberg. # # This file is part of the FreeType project, and may only be used, modified, diff --git a/src/3rdparty/freetype/src/raster/Jamfile b/src/3rdparty/freetype/src/raster/Jamfile deleted file mode 100644 index 3990c05c..00000000 --- a/src/3rdparty/freetype/src/raster/Jamfile +++ /dev/null @@ -1,32 +0,0 @@ -# FreeType 2 src/raster Jamfile -# -# Copyright (C) 2001-2019 by -# David Turner, Robert Wilhelm, and Werner Lemberg. -# -# This file is part of the FreeType project, and may only be used, modified, -# and distributed under the terms of the FreeType project license, -# LICENSE.TXT. By continuing to use, modify, or distribute this file you -# indicate that you have read the license and understand and accept it -# fully. - -SubDir FT2_TOP $(FT2_SRC_DIR) raster ; - -{ - local _sources ; - - if $(FT2_MULTI) - { - _sources = ftraster - ftrend1 - rastpic - ; - } - else - { - _sources = raster ; - } - - Library $(FT2_LIB) : $(_sources).c ; -} - -# end of src/raster Jamfile diff --git a/src/3rdparty/freetype/src/raster/ftmisc.h b/src/3rdparty/freetype/src/raster/ftmisc.h index a246569e..6efe4a9a 100644 --- a/src/3rdparty/freetype/src/raster/ftmisc.h +++ b/src/3rdparty/freetype/src/raster/ftmisc.h @@ -5,7 +5,7 @@ * Miscellaneous macros for stand-alone rasterizer (specification * only). * - * Copyright (C) 2005-2019 by + * Copyright (C) 2005-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used diff --git a/src/3rdparty/freetype/src/raster/ftraster.c b/src/3rdparty/freetype/src/raster/ftraster.c index 023b6c1e..9f0a7976 100644 --- a/src/3rdparty/freetype/src/raster/ftraster.c +++ b/src/3rdparty/freetype/src/raster/ftraster.c @@ -4,7 +4,7 @@ * * The FreeType glyph rasterizer (body). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -62,10 +62,9 @@ #else /* !STANDALONE_ */ -#include #include "ftraster.h" -#include FT_INTERNAL_CALC_H /* for FT_MulDiv and FT_MulDiv_No_Round */ -#include FT_OUTLINE_H /* for FT_Outline_Get_CBox */ +#include /* for FT_MulDiv and FT_MulDiv_No_Round */ +#include /* for FT_Outline_Get_CBox */ #endif /* !STANDALONE_ */ @@ -226,8 +225,8 @@ #else /* !STANDALONE_ */ -#include FT_INTERNAL_OBJECTS_H -#include FT_INTERNAL_DEBUG_H /* for FT_TRACE, FT_ERROR, and FT_THROW */ +#include +#include /* for FT_TRACE, FT_ERROR, and FT_THROW */ #include "rasterrs.h" @@ -460,6 +459,11 @@ #define IS_TOP_OVERSHOOT( x ) \ (Bool)( x - FLOOR( x ) >= ras.precision_half ) + /* Smart dropout rounding to find which pixel is closer to span ends. */ + /* To mimick Windows, symmetric cases break down indepenently of the */ + /* precision. */ +#define SMART( p, q ) FLOOR( ( (p) + (q) + ras.precision * 63 / 64 ) >> 1 ) + #if FT_RENDER_POOL_SIZE > 2048 #define FT_MAX_BLACK_POOL ( FT_RENDER_POOL_SIZE / sizeof ( Long ) ) #else @@ -674,13 +678,13 @@ if ( overshoot ) ras.cProfile->flags |= Overshoot_Bottom; - FT_TRACE6(( " new ascending profile = %p\n", ras.cProfile )); + FT_TRACE6(( " new ascending profile = %p\n", (void *)ras.cProfile )); break; case Descending_State: if ( overshoot ) ras.cProfile->flags |= Overshoot_Top; - FT_TRACE6(( " new descending profile = %p\n", ras.cProfile )); + FT_TRACE6(( " new descending profile = %p\n", (void *)ras.cProfile )); break; default: @@ -737,7 +741,7 @@ FT_TRACE6(( " ending profile %p, start = %ld, height = %ld\n", - ras.cProfile, ras.cProfile->start, h )); + (void *)ras.cProfile, ras.cProfile->start, h )); ras.cProfile->height = h; if ( overshoot ) @@ -2242,11 +2246,10 @@ /* in high-precision mode, we need 12 digits after the comma to */ /* represent multiples of 1/(1<<12) = 1/4096 */ - FT_TRACE7(( " y=%d x=[%.12f;%.12f], drop-out=%d", + FT_TRACE7(( " y=%d x=[% .12f;% .12f]", y, x1 / (double)ras.precision, - x2 / (double)ras.precision, - dropOutControl )); + x2 / (double)ras.precision )); /* Drop-out control */ @@ -2274,7 +2277,7 @@ if ( e2 >= ras.bWidth ) e2 = ras.bWidth - 1; - FT_TRACE7(( " -> x=[%d;%d]", e1, e2 )); + FT_TRACE7(( " -> x=[%ld;%ld]", e1, e2 )); c1 = (Short)( e1 >> 3 ); c2 = (Short)( e2 >> 3 ); @@ -2316,7 +2319,7 @@ Short c1, f1; - FT_TRACE7(( " y=%d x=[%.12f;%.12f]", + FT_TRACE7(( " y=%d x=[% .12f;% .12f]", y, x1 / (double)ras.precision, x2 / (double)ras.precision )); @@ -2353,8 +2356,6 @@ Int dropOutControl = left->flags & 7; - FT_TRACE7(( ", drop-out=%d", dropOutControl )); - if ( e1 == e2 + ras.precision ) { switch ( dropOutControl ) @@ -2364,7 +2365,7 @@ break; case 4: /* smart drop-outs including stubs */ - pxl = FLOOR( ( x1 + x2 - 1 ) / 2 + ras.precision_half ); + pxl = SMART( x1, x2 ); break; case 1: /* simple drop-outs excluding stubs */ @@ -2413,7 +2414,7 @@ if ( dropOutControl == 1 ) pxl = e2; else - pxl = FLOOR( ( x1 + x2 - 1 ) / 2 + ras.precision_half ); + pxl = SMART( x1, x2 ); break; default: /* modes 2, 3, 6, 7 */ @@ -2448,7 +2449,7 @@ if ( e1 >= 0 && e1 < ras.bWidth ) { - FT_TRACE7(( " -> x=%d (drop-out)", e1 )); + FT_TRACE7(( " -> x=%ld", e1 )); c1 = (Short)( e1 >> 3 ); f1 = (Short)( e1 & 7 ); @@ -2457,7 +2458,7 @@ } Exit: - FT_TRACE7(( "\n" )); + FT_TRACE7(( " dropout=%d\n", left->flags & 7 )); } @@ -2495,44 +2496,68 @@ PProfile left, PProfile right ) { + Long e1, e2; + FT_UNUSED( left ); FT_UNUSED( right ); - if ( x2 - x1 < ras.precision ) + FT_TRACE7(( " x=%d y=[% .12f;% .12f]", + y, + x1 / (double)ras.precision, + x2 / (double)ras.precision )); + + /* We should not need this procedure but the vertical sweep */ + /* mishandles horizontal lines through pixel centers. So we */ + /* have to check perfectly aligned span edges here. */ + /* */ + /* XXX: Can we handle horizontal lines better and drop this? */ + + e1 = CEILING( x1 ); + + if ( x1 == e1 ) { - Long e1, e2; + e1 = TRUNC( e1 ); - - FT_TRACE7(( " x=%d y=[%.12f;%.12f]", - y, - x1 / (double)ras.precision, - x2 / (double)ras.precision )); - - e1 = CEILING( x1 ); - e2 = FLOOR ( x2 ); - - if ( e1 == e2 ) + if ( e1 >= 0 && (ULong)e1 < ras.target.rows ) { - e1 = TRUNC( e1 ); - - if ( e1 >= 0 && (ULong)e1 < ras.target.rows ) - { - Byte f1; - PByte bits; + Byte f1; + PByte bits; - FT_TRACE7(( " -> y=%d (drop-out)", e1 )); + bits = ras.bOrigin + ( y >> 3 ) - e1 * ras.target.pitch; + f1 = (Byte)( 0x80 >> ( y & 7 ) ); - bits = ras.bOrigin + ( y >> 3 ) - e1 * ras.target.pitch; - f1 = (Byte)( 0x80 >> ( y & 7 ) ); + FT_TRACE7(( bits[0] & f1 ? " redundant" + : " -> y=%ld edge", e1 )); - bits[0] |= f1; - } + bits[0] |= f1; } - - FT_TRACE7(( "\n" )); } + + e2 = FLOOR ( x2 ); + + if ( x2 == e2 ) + { + e2 = TRUNC( e2 ); + + if ( e2 >= 0 && (ULong)e2 < ras.target.rows ) + { + Byte f1; + PByte bits; + + + bits = ras.bOrigin + ( y >> 3 ) - e2 * ras.target.pitch; + f1 = (Byte)( 0x80 >> ( y & 7 ) ); + + FT_TRACE7(( bits[0] & f1 ? " redundant" + : " -> y=%ld edge", e2 )); + + bits[0] |= f1; + } + } + + FT_TRACE7(( "\n" )); } @@ -2548,7 +2573,7 @@ Byte f1; - FT_TRACE7(( " x=%d y=[%.12f;%.12f]", + FT_TRACE7(( " x=%d y=[% .12f;% .12f]", y, x1 / (double)ras.precision, x2 / (double)ras.precision )); @@ -2574,8 +2599,6 @@ Int dropOutControl = left->flags & 7; - FT_TRACE7(( ", dropout=%d", dropOutControl )); - if ( e1 == e2 + ras.precision ) { switch ( dropOutControl ) @@ -2585,7 +2608,7 @@ break; case 4: /* smart drop-outs including stubs */ - pxl = FLOOR( ( x1 + x2 - 1 ) / 2 + ras.precision_half ); + pxl = SMART( x1, x2 ); break; case 1: /* simple drop-outs excluding stubs */ @@ -2609,7 +2632,7 @@ if ( dropOutControl == 1 ) pxl = e2; else - pxl = FLOOR( ( x1 + x2 - 1 ) / 2 + ras.precision_half ); + pxl = SMART( x1, x2 ); break; default: /* modes 2, 3, 6, 7 */ @@ -2645,7 +2668,7 @@ if ( e1 >= 0 && (ULong)e1 < ras.target.rows ) { - FT_TRACE7(( " -> y=%d (drop-out)", e1 )); + FT_TRACE7(( " -> y=%ld", e1 )); bits = ras.bOrigin + ( y >> 3 ) - e1 * ras.target.pitch; f1 = (Byte)( 0x80 >> ( y & 7 ) ); @@ -2654,7 +2677,7 @@ } Exit: - FT_TRACE7(( "\n" )); + FT_TRACE7(( " dropout=%d\n", left->flags & 7 )); } diff --git a/src/3rdparty/freetype/src/raster/ftraster.h b/src/3rdparty/freetype/src/raster/ftraster.h index 50d34201..1b2ee3c0 100644 --- a/src/3rdparty/freetype/src/raster/ftraster.h +++ b/src/3rdparty/freetype/src/raster/ftraster.h @@ -4,7 +4,7 @@ * * The FreeType glyph rasterizer (specification). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used @@ -22,8 +22,9 @@ #include #include FT_CONFIG_CONFIG_H -#include FT_IMAGE_H +#include +#include FT_BEGIN_HEADER diff --git a/src/3rdparty/freetype/src/raster/ftrend1.c b/src/3rdparty/freetype/src/raster/ftrend1.c index 62c72718..57fed9bc 100644 --- a/src/3rdparty/freetype/src/raster/ftrend1.c +++ b/src/3rdparty/freetype/src/raster/ftrend1.c @@ -4,7 +4,7 @@ * * The FreeType glyph rasterizer interface (body). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -16,10 +16,9 @@ */ -#include -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_OBJECTS_H -#include FT_OUTLINE_H +#include +#include +#include #include "ftrend1.h" #include "ftraster.h" diff --git a/src/3rdparty/freetype/src/raster/ftrend1.h b/src/3rdparty/freetype/src/raster/ftrend1.h index 82ecac68..3f6be536 100644 --- a/src/3rdparty/freetype/src/raster/ftrend1.h +++ b/src/3rdparty/freetype/src/raster/ftrend1.h @@ -4,7 +4,7 @@ * * The FreeType glyph rasterizer interface (specification). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -20,8 +20,7 @@ #define FTREND1_H_ -#include -#include FT_RENDER_H +#include FT_BEGIN_HEADER diff --git a/src/3rdparty/freetype/src/raster/module.mk b/src/3rdparty/freetype/src/raster/module.mk index 0a6d4b09..3600732b 100644 --- a/src/3rdparty/freetype/src/raster/module.mk +++ b/src/3rdparty/freetype/src/raster/module.mk @@ -3,7 +3,7 @@ # -# Copyright (C) 1996-2019 by +# Copyright (C) 1996-2020 by # David Turner, Robert Wilhelm, and Werner Lemberg. # # This file is part of the FreeType project, and may only be used, modified, diff --git a/src/3rdparty/freetype/src/raster/raster.c b/src/3rdparty/freetype/src/raster/raster.c index e3ac9e56..cd37943b 100644 --- a/src/3rdparty/freetype/src/raster/raster.c +++ b/src/3rdparty/freetype/src/raster/raster.c @@ -4,7 +4,7 @@ * * FreeType monochrome rasterer module component (body only). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -17,7 +17,6 @@ #define FT_MAKE_OPTION_SINGLE_OBJECT -#include #include "ftraster.c" #include "ftrend1.c" diff --git a/src/3rdparty/freetype/src/raster/rasterrs.h b/src/3rdparty/freetype/src/raster/rasterrs.h index 72664073..a29651a6 100644 --- a/src/3rdparty/freetype/src/raster/rasterrs.h +++ b/src/3rdparty/freetype/src/raster/rasterrs.h @@ -4,7 +4,7 @@ * * monochrome renderer error codes (specification only). * - * Copyright (C) 2001-2019 by + * Copyright (C) 2001-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -26,7 +26,7 @@ #ifndef RASTERRS_H_ #define RASTERRS_H_ -#include FT_MODULE_ERRORS_H +#include #undef FTERRORS_H_ @@ -34,7 +34,7 @@ #define FT_ERR_PREFIX Raster_Err_ #define FT_ERR_BASE FT_Mod_Err_Raster -#include FT_ERRORS_H +#include #endif /* RASTERRS_H_ */ diff --git a/src/3rdparty/freetype/src/raster/rastpic.c b/src/3rdparty/freetype/src/raster/rastpic.c deleted file mode 100644 index 1dc8981b..00000000 --- a/src/3rdparty/freetype/src/raster/rastpic.c +++ /dev/null @@ -1,89 +0,0 @@ -/***************************************************************************/ -/* */ -/* rastpic.c */ -/* */ -/* The FreeType position independent code services for raster module. */ -/* */ -/* Copyright 2009-2018 by */ -/* Oran Agra and Mickey Gabel. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#include -#include FT_FREETYPE_H -#include FT_INTERNAL_OBJECTS_H -#include "rastpic.h" -#include "rasterrs.h" - - -#ifdef FT_CONFIG_OPTION_PIC - - /* forward declaration of PIC init functions from ftraster.c */ - void - FT_Init_Class_ft_standard_raster( FT_Raster_Funcs* funcs ); - - - void - ft_raster1_renderer_class_pic_free( FT_Library library ) - { - FT_PIC_Container* pic_container = &library->pic_container; - FT_Memory memory = library->memory; - - - if ( pic_container->raster ) - { - RasterPIC* container = (RasterPIC*)pic_container->raster; - - - if ( --container->ref_count ) - return; - FT_FREE( container ); - pic_container->raster = NULL; - } - } - - - FT_Error - ft_raster1_renderer_class_pic_init( FT_Library library ) - { - FT_PIC_Container* pic_container = &library->pic_container; - FT_Error error = FT_Err_Ok; - RasterPIC* container = NULL; - FT_Memory memory = library->memory; - - - /* XXX: since this function also served the no longer available */ - /* raster5 renderer it uses reference counting, which could */ - /* be removed now */ - if ( pic_container->raster ) - { - ((RasterPIC*)pic_container->raster)->ref_count++; - return error; - } - - /* allocate pointer, clear and set global container pointer */ - if ( FT_ALLOC( container, sizeof ( *container ) ) ) - return error; - FT_MEM_SET( container, 0, sizeof ( *container ) ); - pic_container->raster = container; - - container->ref_count = 1; - - /* initialize pointer table - */ - /* this is how the module usually expects this data */ - FT_Init_Class_ft_standard_raster( &container->ft_standard_raster ); - - return error; - } - -#endif /* FT_CONFIG_OPTION_PIC */ - - -/* END */ diff --git a/src/3rdparty/freetype/src/raster/rastpic.h b/src/3rdparty/freetype/src/raster/rastpic.h deleted file mode 100644 index 6d0877c4..00000000 --- a/src/3rdparty/freetype/src/raster/rastpic.h +++ /dev/null @@ -1,63 +0,0 @@ -/***************************************************************************/ -/* */ -/* rastpic.h */ -/* */ -/* The FreeType position independent code services for raster module. */ -/* */ -/* Copyright 2009-2018 by */ -/* Oran Agra and Mickey Gabel. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef RASTPIC_H_ -#define RASTPIC_H_ - - -#include FT_INTERNAL_PIC_H - - -FT_BEGIN_HEADER - -#ifndef FT_CONFIG_OPTION_PIC - -#define FT_STANDARD_RASTER_GET ft_standard_raster - -#else /* FT_CONFIG_OPTION_PIC */ - - typedef struct RasterPIC_ - { - int ref_count; - FT_Raster_Funcs ft_standard_raster; - - } RasterPIC; - - -#define GET_PIC( lib ) \ - ( (RasterPIC*)( (lib)->pic_container.raster ) ) -#define FT_STANDARD_RASTER_GET ( GET_PIC( library )->ft_standard_raster ) - - - /* see rastpic.c for the implementation */ - void - ft_raster1_renderer_class_pic_free( FT_Library library ); - - FT_Error - ft_raster1_renderer_class_pic_init( FT_Library library ); - -#endif /* FT_CONFIG_OPTION_PIC */ - - /* */ - -FT_END_HEADER - -#endif /* RASTPIC_H_ */ - - -/* END */ diff --git a/src/3rdparty/freetype/src/raster/rules.mk b/src/3rdparty/freetype/src/raster/rules.mk index 7664671e..3e949d77 100644 --- a/src/3rdparty/freetype/src/raster/rules.mk +++ b/src/3rdparty/freetype/src/raster/rules.mk @@ -3,7 +3,7 @@ # -# Copyright (C) 1996-2019 by +# Copyright (C) 1996-2020 by # David Turner, Robert Wilhelm, and Werner Lemberg. # # This file is part of the FreeType project, and may only be used, modified, diff --git a/src/3rdparty/freetype/src/sfnt/Jamfile b/src/3rdparty/freetype/src/sfnt/Jamfile deleted file mode 100644 index f646b352..00000000 --- a/src/3rdparty/freetype/src/sfnt/Jamfile +++ /dev/null @@ -1,42 +0,0 @@ -# FreeType 2 src/sfnt Jamfile -# -# Copyright (C) 2001-2019 by -# David Turner, Robert Wilhelm, and Werner Lemberg. -# -# This file is part of the FreeType project, and may only be used, modified, -# and distributed under the terms of the FreeType project license, -# LICENSE.TXT. By continuing to use, modify, or distribute this file you -# indicate that you have read the license and understand and accept it -# fully. - -SubDir FT2_TOP $(FT2_SRC_DIR) sfnt ; - -{ - local _sources ; - - if $(FT2_MULTI) - { - _sources = pngshim - sfdriver - sfntpic - sfobjs - ttbdf - ttcmap - ttcolr - ttcpal - ttkern - ttload - ttmtx - ttpost - ttsbit - ; - } - else - { - _sources = sfnt ; - } - - Library $(FT2_LIB) : $(_sources).c ; -} - -# end of src/sfnt Jamfile diff --git a/src/3rdparty/freetype/src/sfnt/module.mk b/src/3rdparty/freetype/src/sfnt/module.mk index 8c3b44fe..0f459d84 100644 --- a/src/3rdparty/freetype/src/sfnt/module.mk +++ b/src/3rdparty/freetype/src/sfnt/module.mk @@ -3,7 +3,7 @@ # -# Copyright (C) 1996-2019 by +# Copyright (C) 1996-2020 by # David Turner, Robert Wilhelm, and Werner Lemberg. # # This file is part of the FreeType project, and may only be used, modified, diff --git a/src/3rdparty/freetype/src/sfnt/pngshim.c b/src/3rdparty/freetype/src/sfnt/pngshim.c index 2e0904ff..1bd3a7ee 100644 --- a/src/3rdparty/freetype/src/sfnt/pngshim.c +++ b/src/3rdparty/freetype/src/sfnt/pngshim.c @@ -4,7 +4,7 @@ * * PNG Bitmap glyph support. * - * Copyright (C) 2013-2019 by + * Copyright (C) 2013-2020 by * Google, Inc. * Written by Stuart Gill and Behdad Esfahbod. * @@ -17,10 +17,9 @@ */ -#include -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_STREAM_H -#include FT_TRUETYPE_TAGS_H +#include +#include +#include #include FT_CONFIG_STANDARD_LIBRARY_H @@ -61,7 +60,12 @@ /* predates clang; the `__BYTE_ORDER__' preprocessor symbol was */ /* introduced in gcc 4.6 and clang 3.2, respectively. */ /* `__builtin_shuffle' for gcc was introduced in gcc 4.7.0. */ -#if ( ( defined( __GNUC__ ) && \ + /* */ + /* Intel compilers do not currently support __builtin_shuffle; */ + + /* The Intel check must be first. */ +#if !defined( __INTEL_COMPILER ) && \ + ( ( defined( __GNUC__ ) && \ ( ( __GNUC__ >= 5 ) || \ ( ( __GNUC__ == 4 ) && ( __GNUC_MINOR__ >= 7 ) ) ) ) || \ ( defined( __clang__ ) && \ @@ -69,6 +73,7 @@ ( ( __clang_major__ == 3 ) && ( __clang_minor__ >= 2 ) ) ) ) ) && \ defined( __OPTIMIZE__ ) && \ !defined( __EMSCRIPTEN__ ) && \ + defined( __SSE__ ) && \ __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ #ifdef __clang__ diff --git a/src/3rdparty/freetype/src/sfnt/pngshim.h b/src/3rdparty/freetype/src/sfnt/pngshim.h index 06c6f6b2..2d6e83d6 100644 --- a/src/3rdparty/freetype/src/sfnt/pngshim.h +++ b/src/3rdparty/freetype/src/sfnt/pngshim.h @@ -4,7 +4,7 @@ * * PNG Bitmap glyph support. * - * Copyright (C) 2013-2019 by + * Copyright (C) 2013-2020 by * Google, Inc. * Written by Stuart Gill and Behdad Esfahbod. * @@ -21,7 +21,6 @@ #define PNGSHIM_H_ -#include #include "ttload.h" diff --git a/src/3rdparty/freetype/src/sfnt/rules.mk b/src/3rdparty/freetype/src/sfnt/rules.mk index ee3314ea..f56ef060 100644 --- a/src/3rdparty/freetype/src/sfnt/rules.mk +++ b/src/3rdparty/freetype/src/sfnt/rules.mk @@ -3,7 +3,7 @@ # -# Copyright (C) 1996-2019 by +# Copyright (C) 1996-2020 by # David Turner, Robert Wilhelm, and Werner Lemberg. # # This file is part of the FreeType project, and may only be used, modified, @@ -28,19 +28,21 @@ SFNT_COMPILE := $(CC) $(ANSIFLAGS) \ # SFNT driver sources (i.e., C files) # -SFNT_DRV_SRC := $(SFNT_DIR)/pngshim.c \ - $(SFNT_DIR)/sfdriver.c \ - $(SFNT_DIR)/sfobjs.c \ - $(SFNT_DIR)/sfwoff.c \ - $(SFNT_DIR)/ttbdf.c \ - $(SFNT_DIR)/ttcmap.c \ - $(SFNT_DIR)/ttcolr.c \ - $(SFNT_DIR)/ttcpal.c \ - $(SFNT_DIR)/ttkern.c \ - $(SFNT_DIR)/ttload.c \ - $(SFNT_DIR)/ttmtx.c \ - $(SFNT_DIR)/ttpost.c \ - $(SFNT_DIR)/ttsbit.c +SFNT_DRV_SRC := $(SFNT_DIR)/pngshim.c \ + $(SFNT_DIR)/sfdriver.c \ + $(SFNT_DIR)/sfobjs.c \ + $(SFNT_DIR)/sfwoff.c \ + $(SFNT_DIR)/sfwoff2.c \ + $(SFNT_DIR)/ttbdf.c \ + $(SFNT_DIR)/ttcmap.c \ + $(SFNT_DIR)/ttcolr.c \ + $(SFNT_DIR)/ttcpal.c \ + $(SFNT_DIR)/ttkern.c \ + $(SFNT_DIR)/ttload.c \ + $(SFNT_DIR)/ttmtx.c \ + $(SFNT_DIR)/ttpost.c \ + $(SFNT_DIR)/ttsbit.c \ + $(SFNT_DIR)/woff2tags.c # SFNT driver headers # diff --git a/src/3rdparty/freetype/src/sfnt/sfdriver.c b/src/3rdparty/freetype/src/sfnt/sfdriver.c index 26116852..0460339a 100644 --- a/src/3rdparty/freetype/src/sfnt/sfdriver.c +++ b/src/3rdparty/freetype/src/sfnt/sfdriver.c @@ -4,7 +4,7 @@ * * High-level SFNT driver interface (body). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -16,11 +16,10 @@ */ -#include -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_SFNT_H -#include FT_INTERNAL_OBJECTS_H -#include FT_TRUETYPE_IDS_H +#include +#include +#include +#include #include "sfdriver.h" #include "ttload.h" @@ -43,21 +42,21 @@ #ifdef TT_CONFIG_OPTION_BDF #include "ttbdf.h" -#include FT_SERVICE_BDF_H +#include #endif #include "ttcmap.h" #include "ttkern.h" #include "ttmtx.h" -#include FT_SERVICE_GLYPH_DICT_H -#include FT_SERVICE_POSTSCRIPT_NAME_H -#include FT_SERVICE_SFNT_H -#include FT_SERVICE_TT_CMAP_H +#include +#include +#include +#include #ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT -#include FT_MULTIPLE_MASTERS_H -#include FT_SERVICE_MULTIPLE_MASTERS_H +#include +#include #endif @@ -195,7 +194,7 @@ else if ( (FT_ULong)face->num_glyphs < FT_UINT_MAX ) max_gid = (FT_UInt)face->num_glyphs; else - FT_TRACE0(( "Ignore glyph names for invalid GID 0x%08x - 0x%08x\n", + FT_TRACE0(( "Ignore glyph names for invalid GID 0x%08x - 0x%08lx\n", FT_UINT_MAX, face->num_glyphs )); for ( i = 0; i < max_gid; i++ ) diff --git a/src/3rdparty/freetype/src/sfnt/sfdriver.h b/src/3rdparty/freetype/src/sfnt/sfdriver.h index 8c174634..1ac27063 100644 --- a/src/3rdparty/freetype/src/sfnt/sfdriver.h +++ b/src/3rdparty/freetype/src/sfnt/sfdriver.h @@ -4,7 +4,7 @@ * * High-level SFNT driver interface (specification). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -20,8 +20,7 @@ #define SFDRIVER_H_ -#include -#include FT_MODULE_H +#include FT_BEGIN_HEADER diff --git a/src/3rdparty/freetype/src/sfnt/sferrors.h b/src/3rdparty/freetype/src/sfnt/sferrors.h index 43e148d2..55c3e76b 100644 --- a/src/3rdparty/freetype/src/sfnt/sferrors.h +++ b/src/3rdparty/freetype/src/sfnt/sferrors.h @@ -4,7 +4,7 @@ * * SFNT error codes (specification only). * - * Copyright (C) 2001-2019 by + * Copyright (C) 2001-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -25,7 +25,7 @@ #ifndef SFERRORS_H_ #define SFERRORS_H_ -#include FT_MODULE_ERRORS_H +#include #undef FTERRORS_H_ @@ -33,7 +33,7 @@ #define FT_ERR_PREFIX SFNT_Err_ #define FT_ERR_BASE FT_Mod_Err_SFNT -#include FT_ERRORS_H +#include #endif /* SFERRORS_H_ */ diff --git a/src/3rdparty/freetype/src/sfnt/sfnt.c b/src/3rdparty/freetype/src/sfnt/sfnt.c index b4faf34a..471239ff 100644 --- a/src/3rdparty/freetype/src/sfnt/sfnt.c +++ b/src/3rdparty/freetype/src/sfnt/sfnt.c @@ -4,7 +4,7 @@ * * Single object library component. * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -17,12 +17,12 @@ #define FT_MAKE_OPTION_SINGLE_OBJECT -#include #include "pngshim.c" #include "sfdriver.c" #include "sfobjs.c" #include "sfwoff.c" +#include "sfwoff2.c" #include "ttbdf.c" #include "ttcmap.c" #include "ttcolr.c" @@ -33,6 +33,7 @@ #include "ttmtx.c" #include "ttpost.c" #include "ttsbit.c" +#include "woff2tags.c" /* END */ diff --git a/src/3rdparty/freetype/src/sfnt/sfntpic.c b/src/3rdparty/freetype/src/sfnt/sfntpic.c deleted file mode 100644 index db2d816c..00000000 --- a/src/3rdparty/freetype/src/sfnt/sfntpic.c +++ /dev/null @@ -1,143 +0,0 @@ -/***************************************************************************/ -/* */ -/* sfntpic.c */ -/* */ -/* The FreeType position independent code services for sfnt module. */ -/* */ -/* Copyright 2009-2018 by */ -/* Oran Agra and Mickey Gabel. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#include -#include FT_FREETYPE_H -#include FT_INTERNAL_OBJECTS_H -#include "sfntpic.h" -#include "sferrors.h" - - -#ifdef FT_CONFIG_OPTION_PIC - - /* forward declaration of PIC init functions from sfdriver.c */ - FT_Error - FT_Create_Class_sfnt_services( FT_Library library, - FT_ServiceDescRec** output_class ); - void - FT_Destroy_Class_sfnt_services( FT_Library library, - FT_ServiceDescRec* clazz ); - void - FT_Init_Class_sfnt_service_bdf( FT_Service_BDFRec* clazz ); - void - FT_Init_Class_sfnt_interface( FT_Library library, - SFNT_Interface* clazz ); - void - FT_Init_Class_sfnt_service_glyph_dict( - FT_Library library, - FT_Service_GlyphDictRec* clazz ); - void - FT_Init_Class_sfnt_service_ps_name( - FT_Library library, - FT_Service_PsFontNameRec* clazz ); - void - FT_Init_Class_tt_service_get_cmap_info( - FT_Library library, - FT_Service_TTCMapsRec* clazz ); - void - FT_Init_Class_sfnt_service_sfnt_table( - FT_Service_SFNT_TableRec* clazz ); - - - /* forward declaration of PIC init functions from ttcmap.c */ - FT_Error - FT_Create_Class_tt_cmap_classes( FT_Library library, - TT_CMap_Class** output_class ); - void - FT_Destroy_Class_tt_cmap_classes( FT_Library library, - TT_CMap_Class* clazz ); - - - void - sfnt_module_class_pic_free( FT_Library library ) - { - FT_PIC_Container* pic_container = &library->pic_container; - FT_Memory memory = library->memory; - - - if ( pic_container->sfnt ) - { - sfntModulePIC* container = (sfntModulePIC*)pic_container->sfnt; - - - if ( container->sfnt_services ) - FT_Destroy_Class_sfnt_services( library, - container->sfnt_services ); - container->sfnt_services = NULL; - - if ( container->tt_cmap_classes ) - FT_Destroy_Class_tt_cmap_classes( library, - container->tt_cmap_classes ); - container->tt_cmap_classes = NULL; - - FT_FREE( container ); - pic_container->sfnt = NULL; - } - } - - - FT_Error - sfnt_module_class_pic_init( FT_Library library ) - { - FT_PIC_Container* pic_container = &library->pic_container; - FT_Error error = FT_Err_Ok; - sfntModulePIC* container = NULL; - FT_Memory memory = library->memory; - - - /* allocate pointer, clear and set global container pointer */ - if ( FT_ALLOC( container, sizeof ( *container ) ) ) - return error; - FT_MEM_SET( container, 0, sizeof ( *container ) ); - pic_container->sfnt = container; - - /* initialize pointer table - */ - /* this is how the module usually expects this data */ - error = FT_Create_Class_sfnt_services( library, - &container->sfnt_services ); - if ( error ) - goto Exit; - - error = FT_Create_Class_tt_cmap_classes( library, - &container->tt_cmap_classes ); - if ( error ) - goto Exit; - - FT_Init_Class_sfnt_service_glyph_dict( - library, &container->sfnt_service_glyph_dict ); - FT_Init_Class_sfnt_service_ps_name( - library, &container->sfnt_service_ps_name ); - FT_Init_Class_tt_service_get_cmap_info( - library, &container->tt_service_get_cmap_info ); - FT_Init_Class_sfnt_service_sfnt_table( - &container->sfnt_service_sfnt_table ); -#ifdef TT_CONFIG_OPTION_BDF - FT_Init_Class_sfnt_service_bdf( &container->sfnt_service_bdf ); -#endif - FT_Init_Class_sfnt_interface( library, &container->sfnt_interface ); - - Exit: - if ( error ) - sfnt_module_class_pic_free( library ); - return error; - } - -#endif /* FT_CONFIG_OPTION_PIC */ - - -/* END */ diff --git a/src/3rdparty/freetype/src/sfnt/sfntpic.h b/src/3rdparty/freetype/src/sfnt/sfntpic.h deleted file mode 100644 index 8f43122d..00000000 --- a/src/3rdparty/freetype/src/sfnt/sfntpic.h +++ /dev/null @@ -1,112 +0,0 @@ -/***************************************************************************/ -/* */ -/* sfntpic.h */ -/* */ -/* The FreeType position independent code services for sfnt module. */ -/* */ -/* Copyright 2009-2018 by */ -/* Oran Agra and Mickey Gabel. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef SFNTPIC_H_ -#define SFNTPIC_H_ - - -#include FT_INTERNAL_PIC_H - - -#ifndef FT_CONFIG_OPTION_PIC - -#define SFNT_SERVICES_GET sfnt_services -#define SFNT_SERVICE_GLYPH_DICT_GET sfnt_service_glyph_dict -#define SFNT_SERVICE_PS_NAME_GET sfnt_service_ps_name -#define TT_SERVICE_CMAP_INFO_GET tt_service_get_cmap_info -#define TT_CMAP_CLASSES_GET tt_cmap_classes -#define SFNT_SERVICE_SFNT_TABLE_GET sfnt_service_sfnt_table -#define SFNT_SERVICE_BDF_GET sfnt_service_bdf -#define SFNT_INTERFACE_GET sfnt_interface - -#else /* FT_CONFIG_OPTION_PIC */ - - /* some include files required for members of sfntModulePIC */ -#include FT_SERVICE_GLYPH_DICT_H -#include FT_SERVICE_POSTSCRIPT_NAME_H -#include FT_SERVICE_SFNT_H -#include FT_SERVICE_TT_CMAP_H - -#ifdef TT_CONFIG_OPTION_BDF -#include "ttbdf.h" -#include FT_SERVICE_BDF_H -#endif - -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_STREAM_H -#include FT_INTERNAL_SFNT_H -#include "ttcmap.h" - - -FT_BEGIN_HEADER - - typedef struct sfntModulePIC_ - { - FT_ServiceDescRec* sfnt_services; - FT_Service_GlyphDictRec sfnt_service_glyph_dict; - FT_Service_PsFontNameRec sfnt_service_ps_name; - FT_Service_TTCMapsRec tt_service_get_cmap_info; - TT_CMap_Class* tt_cmap_classes; - FT_Service_SFNT_TableRec sfnt_service_sfnt_table; -#ifdef TT_CONFIG_OPTION_BDF - FT_Service_BDFRec sfnt_service_bdf; -#endif - SFNT_Interface sfnt_interface; - - } sfntModulePIC; - - -#define GET_PIC( lib ) \ - ( (sfntModulePIC*)( (lib)->pic_container.sfnt ) ) - -#define SFNT_SERVICES_GET \ - ( GET_PIC( library )->sfnt_services ) -#define SFNT_SERVICE_GLYPH_DICT_GET \ - ( GET_PIC( library )->sfnt_service_glyph_dict ) -#define SFNT_SERVICE_PS_NAME_GET \ - ( GET_PIC( library )->sfnt_service_ps_name ) -#define TT_SERVICE_CMAP_INFO_GET \ - ( GET_PIC( library )->tt_service_get_cmap_info ) -#define TT_CMAP_CLASSES_GET \ - ( GET_PIC( library )->tt_cmap_classes ) -#define SFNT_SERVICE_SFNT_TABLE_GET \ - ( GET_PIC( library )->sfnt_service_sfnt_table ) -#define SFNT_SERVICE_BDF_GET \ - ( GET_PIC( library )->sfnt_service_bdf ) -#define SFNT_INTERFACE_GET \ - ( GET_PIC( library )->sfnt_interface ) - - - /* see sfntpic.c for the implementation */ - void - sfnt_module_class_pic_free( FT_Library library ); - - FT_Error - sfnt_module_class_pic_init( FT_Library library ); - - -FT_END_HEADER - -#endif /* FT_CONFIG_OPTION_PIC */ - - /* */ - -#endif /* SFNTPIC_H_ */ - - -/* END */ diff --git a/src/3rdparty/freetype/src/sfnt/sfobjs.c b/src/3rdparty/freetype/src/sfnt/sfobjs.c index 6edf3ae1..39460be2 100644 --- a/src/3rdparty/freetype/src/sfnt/sfobjs.c +++ b/src/3rdparty/freetype/src/sfnt/sfobjs.c @@ -4,7 +4,7 @@ * * SFNT object management (base). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -16,22 +16,22 @@ */ -#include #include "sfobjs.h" #include "ttload.h" #include "ttcmap.h" #include "ttkern.h" #include "sfwoff.h" -#include FT_INTERNAL_SFNT_H -#include FT_INTERNAL_DEBUG_H -#include FT_TRUETYPE_IDS_H -#include FT_TRUETYPE_TAGS_H -#include FT_SERVICE_POSTSCRIPT_CMAPS_H -#include FT_SFNT_NAMES_H +#include "sfwoff2.h" +#include +#include +#include +#include +#include +#include #ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT -#include FT_SERVICE_MULTIPLE_MASTERS_H -#include FT_SERVICE_METRICS_VARIATIONS_H +#include +#include #endif #include "sferrors.h" @@ -341,7 +341,9 @@ /* synthesized into a TTC with one offset table. */ static FT_Error sfnt_open_font( FT_Stream stream, - TT_Face face ) + TT_Face face, + FT_Int* face_instance_index, + FT_Long* woff2_num_faces ) { FT_Memory memory = stream->memory; FT_Error error; @@ -385,6 +387,25 @@ goto retry; } + if ( tag == TTAG_wOF2 ) + { + FT_TRACE2(( "sfnt_open_font: file is a WOFF2; synthesizing SFNT\n" )); + + if ( FT_STREAM_SEEK( offset ) ) + return error; + + error = woff2_open_font( stream, + face, + face_instance_index, + woff2_num_faces ); + if ( error ) + return error; + + /* Swap out stream and retry! */ + stream = face->root.stream; + goto retry; + } + if ( tag != 0x00010000UL && tag != TTAG_ttcf && tag != TTAG_OTTO && @@ -461,9 +482,10 @@ FT_Parameter* params ) { FT_Error error; - FT_Library library = face->root.driver->root.library; + FT_Library library = face->root.driver->root.library; SFNT_Service sfnt; FT_Int face_index; + FT_Long woff2_num_faces = 0; /* for now, parameters are unused */ @@ -514,15 +536,18 @@ FT_TRACE2(( "SFNT driver\n" )); - error = sfnt_open_font( stream, face ); + error = sfnt_open_font( stream, + face, + &face_instance_index, + &woff2_num_faces ); if ( error ) return error; /* Stream may have changed in sfnt_open_font. */ stream = face->root.stream; - FT_TRACE2(( "sfnt_init_face: %08p (index %d)\n", - face, + FT_TRACE2(( "sfnt_init_face: %p (index %d)\n", + (void *)face, face_instance_index )); face_index = FT_ABS( face_instance_index ) & 0xFFFF; @@ -689,6 +714,10 @@ face->root.num_faces = face->ttc_header.count; face->root.face_index = face_instance_index; + /* `num_faces' for a WOFF2 needs to be handled separately. */ + if ( woff2_num_faces ) + face->root.num_faces = woff2_num_faces; + return error; } @@ -791,7 +820,7 @@ /* it doesn't contain outlines. */ /* */ - FT_TRACE2(( "sfnt_load_face: %08p\n\n", face )); + FT_TRACE2(( "sfnt_load_face: %p\n\n", (void *)face )); /* do we have outlines in there? */ #ifdef FT_CONFIG_OPTION_INCREMENTAL diff --git a/src/3rdparty/freetype/src/sfnt/sfobjs.h b/src/3rdparty/freetype/src/sfnt/sfobjs.h index 3fbf2dd6..e8e30420 100644 --- a/src/3rdparty/freetype/src/sfnt/sfobjs.h +++ b/src/3rdparty/freetype/src/sfnt/sfobjs.h @@ -4,7 +4,7 @@ * * SFNT object management (specification). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -20,9 +20,8 @@ #define SFOBJS_H_ -#include -#include FT_INTERNAL_SFNT_H -#include FT_INTERNAL_OBJECTS_H +#include +#include FT_BEGIN_HEADER diff --git a/src/3rdparty/freetype/src/sfnt/sfwoff.c b/src/3rdparty/freetype/src/sfnt/sfwoff.c index ca4821a2..f0a32e1e 100644 --- a/src/3rdparty/freetype/src/sfnt/sfwoff.c +++ b/src/3rdparty/freetype/src/sfnt/sfwoff.c @@ -4,7 +4,7 @@ * * WOFF format management (base). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -16,12 +16,11 @@ */ -#include #include "sfwoff.h" -#include FT_TRUETYPE_TAGS_H -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_STREAM_H -#include FT_GZIP_H +#include +#include +#include +#include /************************************************************************** @@ -371,18 +370,18 @@ sfnt + table->OrigOffset, &output_len, stream->cursor, table->CompLength ); if ( error ) - goto Exit; + goto Exit1; if ( output_len != table->OrigLength ) { FT_ERROR(( "woff_font_open: compressed table length mismatch\n" )); error = FT_THROW( Invalid_Table ); - goto Exit; + goto Exit1; } #else /* !FT_CONFIG_OPTION_USE_ZLIB */ error = FT_THROW( Unimplemented_Feature ); - goto Exit; + goto Exit1; #endif /* !FT_CONFIG_OPTION_USE_ZLIB */ } @@ -424,6 +423,10 @@ } return error; + + Exit1: + FT_FRAME_EXIT(); + goto Exit; } diff --git a/src/3rdparty/freetype/src/sfnt/sfwoff.h b/src/3rdparty/freetype/src/sfnt/sfwoff.h index 15495c32..d177ab11 100644 --- a/src/3rdparty/freetype/src/sfnt/sfwoff.h +++ b/src/3rdparty/freetype/src/sfnt/sfwoff.h @@ -4,7 +4,7 @@ * * WOFFF format management (specification). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -20,9 +20,8 @@ #define SFWOFF_H_ -#include -#include FT_INTERNAL_SFNT_H -#include FT_INTERNAL_OBJECTS_H +#include +#include FT_BEGIN_HEADER diff --git a/src/3rdparty/freetype/src/sfnt/sfwoff2.c b/src/3rdparty/freetype/src/sfnt/sfwoff2.c new file mode 100644 index 00000000..5c8202f8 --- /dev/null +++ b/src/3rdparty/freetype/src/sfnt/sfwoff2.c @@ -0,0 +1,2337 @@ +/**************************************************************************** + * + * sfwoff2.c + * + * WOFF2 format management (base). + * + * Copyright (C) 2019-2020 by + * Nikhil Ramakrishnan, David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + +#include "sfwoff2.h" +#include "woff2tags.h" +#include +#include +#include + + +#ifdef FT_CONFIG_OPTION_USE_BROTLI + +#include + +#endif + + + /************************************************************************** + * + * The macro FT_COMPONENT is used in trace mode. It is an implicit + * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log + * messages during execution. + */ +#undef FT_COMPONENT +#define FT_COMPONENT sfwoff2 + + +#define READ_255USHORT( var ) FT_SET_ERROR( Read255UShort( stream, &var ) ) + +#define READ_BASE128( var ) FT_SET_ERROR( ReadBase128( stream, &var ) ) + + /* `var' should be FT_ULong */ +#define ROUND4( var ) ( ( var + 3 ) & ~3UL ) + +#define WRITE_USHORT( p, v ) \ + do \ + { \ + *(p)++ = (FT_Byte)( (v) >> 8 ); \ + *(p)++ = (FT_Byte)( (v) >> 0 ); \ + \ + } while ( 0 ) + +#define WRITE_ULONG( p, v ) \ + do \ + { \ + *(p)++ = (FT_Byte)( (v) >> 24 ); \ + *(p)++ = (FT_Byte)( (v) >> 16 ); \ + *(p)++ = (FT_Byte)( (v) >> 8 ); \ + *(p)++ = (FT_Byte)( (v) >> 0 ); \ + \ + } while ( 0 ) + +#define WRITE_SHORT( p, v ) \ + do \ + { \ + *(p)++ = (FT_Byte)( (v) >> 8 ); \ + *(p)++ = (FT_Byte)( (v) >> 0 ); \ + \ + } while ( 0 ) + +#define WRITE_SFNT_BUF( buf, s ) \ + write_buf( &sfnt, sfnt_size, &dest_offset, buf, s, memory ) + +#define WRITE_SFNT_BUF_AT( offset, buf, s ) \ + write_buf( &sfnt, sfnt_size, &offset, buf, s, memory ) + +#define N_CONTOUR_STREAM 0 +#define N_POINTS_STREAM 1 +#define FLAG_STREAM 2 +#define GLYPH_STREAM 3 +#define COMPOSITE_STREAM 4 +#define BBOX_STREAM 5 +#define INSTRUCTION_STREAM 6 + + + static void + stream_close( FT_Stream stream ) + { + FT_Memory memory = stream->memory; + + + FT_FREE( stream->base ); + + stream->size = 0; + stream->base = NULL; + stream->close = NULL; + } + + + FT_CALLBACK_DEF( int ) + compare_tags( const void* a, + const void* b ) + { + WOFF2_Table table1 = *(WOFF2_Table*)a; + WOFF2_Table table2 = *(WOFF2_Table*)b; + + FT_ULong tag1 = table1->Tag; + FT_ULong tag2 = table2->Tag; + + + if ( tag1 > tag2 ) + return 1; + else if ( tag1 < tag2 ) + return -1; + else + return 0; + } + + + static FT_Error + Read255UShort( FT_Stream stream, + FT_UShort* value ) + { + const FT_Byte oneMoreByteCode1 = 255; + const FT_Byte oneMoreByteCode2 = 254; + const FT_Byte wordCode = 253; + const FT_UShort lowestUCode = 253; + + FT_Error error = FT_Err_Ok; + FT_Byte code; + FT_Byte result_byte = 0; + FT_UShort result_short = 0; + + + if ( FT_READ_BYTE( code ) ) + return error; + if ( code == wordCode ) + { + /* Read next two bytes and store `FT_UShort' value. */ + if ( FT_READ_USHORT( result_short ) ) + return error; + *value = result_short; + return FT_Err_Ok; + } + else if ( code == oneMoreByteCode1 ) + { + if ( FT_READ_BYTE( result_byte ) ) + return error; + *value = result_byte + lowestUCode; + return FT_Err_Ok; + } + else if ( code == oneMoreByteCode2 ) + { + if ( FT_READ_BYTE( result_byte ) ) + return error; + *value = result_byte + lowestUCode * 2; + return FT_Err_Ok; + } + else + { + *value = code; + return FT_Err_Ok; + } + } + + + static FT_Error + ReadBase128( FT_Stream stream, + FT_ULong* value ) + { + FT_ULong result = 0; + FT_Int i; + FT_Byte code; + FT_Error error = FT_Err_Ok; + + + for ( i = 0; i < 5; ++i ) + { + code = 0; + if ( FT_READ_BYTE( code ) ) + return error; + + /* Leading zeros are invalid. */ + if ( i == 0 && code == 0x80 ) + return FT_THROW( Invalid_Table ); + + /* If any of top seven bits are set then we're about to overflow. */ + if ( result & 0xfe000000 ) + return FT_THROW( Invalid_Table ); + + result = ( result << 7 ) | ( code & 0x7f ); + + /* Spin until most significant bit of data byte is false. */ + if ( ( code & 0x80 ) == 0 ) + { + *value = result; + return FT_Err_Ok; + } + } + + /* Make sure not to exceed the size bound. */ + return FT_THROW( Invalid_Table ); + } + + + /* Extend memory of `dst_bytes' buffer and copy data from `src'. */ + static FT_Error + write_buf( FT_Byte** dst_bytes, + FT_ULong* dst_size, + FT_ULong* offset, + FT_Byte* src, + FT_ULong size, + FT_Memory memory ) + { + FT_Error error = FT_Err_Ok; + /* We are reallocating memory for `dst', so its pointer may change. */ + FT_Byte* dst = *dst_bytes; + + + /* Check whether we are within limits. */ + if ( ( *offset + size ) > WOFF2_DEFAULT_MAX_SIZE ) + return FT_THROW( Array_Too_Large ); + + /* Reallocate `dst'. */ + if ( ( *offset + size ) > *dst_size ) + { + FT_TRACE6(( "Reallocating %lu to %lu.\n", + *dst_size, (*offset + size) )); + if ( FT_REALLOC( dst, + (FT_ULong)( *dst_size ), + (FT_ULong)( *offset + size ) ) ) + goto Exit; + + *dst_size = *offset + size; + } + + /* Copy data. */ + ft_memcpy( dst + *offset, src, size ); + + *offset += size; + /* Set pointer of `dst' to its correct value. */ + *dst_bytes = dst; + + Exit: + return error; + } + + + /* Pad buffer to closest multiple of 4. */ + static FT_Error + pad4( FT_Byte** sfnt_bytes, + FT_ULong* sfnt_size, + FT_ULong* out_offset, + FT_Memory memory ) + { + FT_Byte* sfnt = *sfnt_bytes; + FT_ULong dest_offset = *out_offset; + + FT_Byte zeroes[] = { 0, 0, 0 }; + FT_ULong pad_bytes; + + + if ( dest_offset + 3 < dest_offset ) + return FT_THROW( Invalid_Table ); + + pad_bytes = ROUND4( dest_offset ) - dest_offset; + if ( pad_bytes > 0 ) + { + if ( WRITE_SFNT_BUF( &zeroes[0], pad_bytes ) ) + return FT_THROW( Invalid_Table ); + } + + *sfnt_bytes = sfnt; + *out_offset = dest_offset; + return FT_Err_Ok; + } + + + /* Calculate table checksum of `buf'. */ + static FT_ULong + compute_ULong_sum( FT_Byte* buf, + FT_ULong size ) + { + FT_ULong checksum = 0; + FT_ULong aligned_size = size & ~3UL; + FT_ULong i; + FT_ULong v; + + + for ( i = 0; i < aligned_size; i += 4 ) + checksum += ( (FT_ULong)buf[i ] << 24 ) | + ( (FT_ULong)buf[i + 1] << 16 ) | + ( (FT_ULong)buf[i + 2] << 8 ) | + ( (FT_ULong)buf[i + 3] << 0 ); + + /* If size is not aligned to 4, treat as if it is padded with 0s. */ + if ( size != aligned_size ) + { + v = 0; + for ( i = aligned_size ; i < size; ++i ) + v |= (FT_ULong)buf[i] << ( 24 - 8 * ( i & 3 ) ); + checksum += v; + } + + return checksum; + } + + + static FT_Error + woff2_decompress( FT_Byte* dst, + FT_ULong dst_size, + const FT_Byte* src, + FT_ULong src_size ) + { +#ifdef FT_CONFIG_OPTION_USE_BROTLI + + /* this cast is only of importance on 32bit systems; */ + /* we don't validate it */ + FT_Offset uncompressed_size = (FT_Offset)dst_size; + BrotliDecoderResult result; + + + result = BrotliDecoderDecompress( src_size, + src, + &uncompressed_size, + dst ); + + if ( result != BROTLI_DECODER_RESULT_SUCCESS || + uncompressed_size != dst_size ) + { + FT_ERROR(( "woff2_decompress: Stream length mismatch.\n" )); + return FT_THROW( Invalid_Table ); + } + + FT_TRACE2(( "woff2_decompress: Brotli stream decompressed.\n" )); + return FT_Err_Ok; + +#else /* !FT_CONFIG_OPTION_USE_BROTLI */ + + FT_ERROR(( "woff2_decompress: Brotli support not available.\n" )); + return FT_THROW( Unimplemented_Feature ); + +#endif /* !FT_CONFIG_OPTION_USE_BROTLI */ + } + + + static WOFF2_Table + find_table( WOFF2_Table* tables, + FT_UShort num_tables, + FT_ULong tag ) + { + FT_Int i; + + + for ( i = 0; i < num_tables; i++ ) + { + if ( tables[i]->Tag == tag ) + return tables[i]; + } + return NULL; + } + + + /* Read `numberOfHMetrics' field from `hhea' table. */ + static FT_Error + read_num_hmetrics( FT_Stream stream, + FT_UShort* num_hmetrics ) + { + FT_Error error = FT_Err_Ok; + FT_UShort num_metrics; + + + if ( FT_STREAM_SKIP( 34 ) ) + return FT_THROW( Invalid_Table ); + + if ( FT_READ_USHORT( num_metrics ) ) + return FT_THROW( Invalid_Table ); + + *num_hmetrics = num_metrics; + + return error; + } + + + /* An auxiliary function for overflow-safe addition. */ + static FT_Int + with_sign( FT_Byte flag, + FT_Int base_val ) + { + /* Precondition: 0 <= base_val < 65536 (to avoid overflow). */ + return ( flag & 1 ) ? base_val : -base_val; + } + + + /* An auxiliary function for overflow-safe addition. */ + static FT_Int + safe_int_addition( FT_Int a, + FT_Int b, + FT_Int* result ) + { + if ( ( ( a > 0 ) && ( b > FT_INT_MAX - a ) ) || + ( ( a < 0 ) && ( b < FT_INT_MIN - a ) ) ) + return FT_THROW( Invalid_Table ); + + *result = a + b; + return FT_Err_Ok; + } + + + /* + * Decode variable-length (flag, xCoordinate, yCoordinate) triplet for a + * simple glyph. See + * + * https://www.w3.org/TR/WOFF2/#triplet_decoding + */ + static FT_Error + triplet_decode( const FT_Byte* flags_in, + const FT_Byte* in, + FT_ULong in_size, + FT_ULong n_points, + WOFF2_Point result, + FT_ULong* in_bytes_used ) + { + FT_Int x = 0; + FT_Int y = 0; + FT_Int dx; + FT_Int dy; + FT_Int b0, b1, b2; + + FT_ULong triplet_index = 0; + FT_ULong data_bytes; + + FT_UInt i; + + + if ( n_points > in_size ) + return FT_THROW( Invalid_Table ); + + for ( i = 0; i < n_points; ++i ) + { + FT_Byte flag = flags_in[i]; + FT_Bool on_curve = !( flag >> 7 ); + + + flag &= 0x7f; + if ( flag < 84 ) + data_bytes = 1; + else if ( flag < 120 ) + data_bytes = 2; + else if ( flag < 124 ) + data_bytes = 3; + else + data_bytes = 4; + + /* Overflow checks */ + if ( triplet_index + data_bytes > in_size || + triplet_index + data_bytes < triplet_index ) + return FT_THROW( Invalid_Table ); + + if ( flag < 10 ) + { + dx = 0; + dy = with_sign( flag, + ( ( flag & 14 ) << 7 ) + in[triplet_index] ); + } + else if ( flag < 20 ) + { + dx = with_sign( flag, + ( ( ( flag - 10 ) & 14 ) << 7 ) + + in[triplet_index] ); + dy = 0; + } + else if ( flag < 84 ) + { + b0 = flag - 20; + b1 = in[triplet_index]; + dx = with_sign( flag, + 1 + ( b0 & 0x30 ) + ( b1 >> 4 ) ); + dy = with_sign( flag >> 1, + 1 + ( ( b0 & 0x0c ) << 2 ) + ( b1 & 0x0f ) ); + } + else if ( flag < 120 ) + { + b0 = flag - 84; + dx = with_sign( flag, + 1 + ( ( b0 / 12 ) << 8 ) + in[triplet_index] ); + dy = with_sign( flag >> 1, + 1 + ( ( ( b0 % 12 ) >> 2 ) << 8 ) + + in[triplet_index + 1] ); + } + else if ( flag < 124 ) + { + b2 = in[triplet_index + 1]; + dx = with_sign( flag, + ( in[triplet_index] << 4 ) + ( b2 >> 4 ) ); + dy = with_sign( flag >> 1, + ( ( b2 & 0x0f ) << 8 ) + in[triplet_index + 2] ); + } + else + { + dx = with_sign( flag, + ( in[triplet_index] << 8 ) + + in[triplet_index + 1] ); + dy = with_sign( flag >> 1, + ( in[triplet_index + 2] << 8 ) + + in[triplet_index + 3] ); + } + + triplet_index += data_bytes; + + if ( safe_int_addition( x, dx, &x ) ) + return FT_THROW( Invalid_Table ); + + if ( safe_int_addition( y, dy, &y ) ) + return FT_THROW( Invalid_Table ); + + result[i].x = x; + result[i].y = y; + result[i].on_curve = on_curve; + } + + *in_bytes_used = triplet_index; + return FT_Err_Ok; + } + + + /* Store decoded points in glyph buffer. */ + static FT_Error + store_points( FT_ULong n_points, + const WOFF2_Point points, + FT_UShort n_contours, + FT_UShort instruction_len, + FT_Byte* dst, + FT_ULong dst_size, + FT_ULong* glyph_size ) + { + FT_UInt flag_offset = 10 + ( 2 * n_contours ) + 2 + instruction_len; + FT_Byte last_flag = 0xFFU; + FT_Byte repeat_count = 0; + FT_Int last_x = 0; + FT_Int last_y = 0; + FT_UInt x_bytes = 0; + FT_UInt y_bytes = 0; + FT_UInt xy_bytes; + FT_UInt i; + FT_UInt x_offset; + FT_UInt y_offset; + FT_Byte* pointer; + + + for ( i = 0; i < n_points; ++i ) + { + const WOFF2_PointRec point = points[i]; + + FT_Byte flag = point.on_curve ? GLYF_ON_CURVE : 0; + FT_Int dx = point.x - last_x; + FT_Int dy = point.y - last_y; + + + if ( dx == 0 ) + flag |= GLYF_THIS_X_IS_SAME; + else if ( dx > -256 && dx < 256 ) + { + flag |= GLYF_X_SHORT | ( dx > 0 ? GLYF_THIS_X_IS_SAME : 0 ); + x_bytes += 1; + } + else + x_bytes += 2; + + if ( dy == 0 ) + flag |= GLYF_THIS_Y_IS_SAME; + else if ( dy > -256 && dy < 256 ) + { + flag |= GLYF_Y_SHORT | ( dy > 0 ? GLYF_THIS_Y_IS_SAME : 0 ); + y_bytes += 1; + } + else + y_bytes += 2; + + if ( flag == last_flag && repeat_count != 255 ) + { + dst[flag_offset - 1] |= GLYF_REPEAT; + repeat_count++; + } + else + { + if ( repeat_count != 0 ) + { + if ( flag_offset >= dst_size ) + return FT_THROW( Invalid_Table ); + + dst[flag_offset++] = repeat_count; + } + if ( flag_offset >= dst_size ) + return FT_THROW( Invalid_Table ); + + dst[flag_offset++] = flag; + repeat_count = 0; + } + + last_x = point.x; + last_y = point.y; + last_flag = flag; + } + + if ( repeat_count != 0 ) + { + if ( flag_offset >= dst_size ) + return FT_THROW( Invalid_Table ); + + dst[flag_offset++] = repeat_count; + } + + xy_bytes = x_bytes + y_bytes; + if ( xy_bytes < x_bytes || + flag_offset + xy_bytes < flag_offset || + flag_offset + xy_bytes > dst_size ) + return FT_THROW( Invalid_Table ); + + x_offset = flag_offset; + y_offset = flag_offset + x_bytes; + last_x = 0; + last_y = 0; + + for ( i = 0; i < n_points; ++i ) + { + FT_Int dx = points[i].x - last_x; + FT_Int dy = points[i].y - last_y; + + + if ( dx == 0 ) + ; + else if ( dx > -256 && dx < 256 ) + dst[x_offset++] = (FT_Byte)FT_ABS( dx ); + else + { + pointer = dst + x_offset; + WRITE_SHORT( pointer, dx ); + x_offset += 2; + } + + last_x += dx; + + if ( dy == 0 ) + ; + else if ( dy > -256 && dy < 256 ) + dst[y_offset++] = (FT_Byte)FT_ABS( dy ); + else + { + pointer = dst + y_offset; + WRITE_SHORT( pointer, dy ); + y_offset += 2; + } + + last_y += dy; + } + + *glyph_size = y_offset; + return FT_Err_Ok; + } + + + static void + compute_bbox( FT_ULong n_points, + const WOFF2_Point points, + FT_Byte* dst, + FT_UShort* src_x_min ) + { + FT_Int x_min = 0; + FT_Int y_min = 0; + FT_Int x_max = 0; + FT_Int y_max = 0; + + FT_UInt i; + + FT_ULong offset; + FT_Byte* pointer; + + + if ( n_points > 0 ) + { + x_min = points[0].x; + y_min = points[0].y; + x_max = points[0].x; + y_max = points[0].y; + } + + for ( i = 1; i < n_points; ++i ) + { + FT_Int x = points[i].x; + FT_Int y = points[i].y; + + + x_min = FT_MIN( x, x_min ); + y_min = FT_MIN( y, y_min ); + x_max = FT_MAX( x, x_max ); + y_max = FT_MAX( y, y_max ); + } + + /* Write values to `glyf' record. */ + offset = 2; + pointer = dst + offset; + + WRITE_SHORT( pointer, x_min ); + WRITE_SHORT( pointer, y_min ); + WRITE_SHORT( pointer, x_max ); + WRITE_SHORT( pointer, y_max ); + + *src_x_min = (FT_UShort)x_min; + } + + + static FT_Error + compositeGlyph_size( FT_Stream stream, + FT_ULong offset, + FT_ULong* size, + FT_Bool* have_instructions ) + { + FT_Error error = FT_Err_Ok; + FT_ULong start_offset = offset; + FT_Bool we_have_inst = FALSE; + FT_UShort flags = FLAG_MORE_COMPONENTS; + + + if ( FT_STREAM_SEEK( start_offset ) ) + goto Exit; + while ( flags & FLAG_MORE_COMPONENTS ) + { + FT_ULong arg_size; + + + if ( FT_READ_USHORT( flags ) ) + goto Exit; + we_have_inst |= ( flags & FLAG_WE_HAVE_INSTRUCTIONS ) != 0; + /* glyph index */ + arg_size = 2; + if ( flags & FLAG_ARG_1_AND_2_ARE_WORDS ) + arg_size += 4; + else + arg_size += 2; + + if ( flags & FLAG_WE_HAVE_A_SCALE ) + arg_size += 2; + else if ( flags & FLAG_WE_HAVE_AN_X_AND_Y_SCALE ) + arg_size += 4; + else if ( flags & FLAG_WE_HAVE_A_TWO_BY_TWO ) + arg_size += 8; + + if ( FT_STREAM_SKIP( arg_size ) ) + goto Exit; + } + + *size = FT_STREAM_POS() - start_offset; + *have_instructions = we_have_inst; + + Exit: + return error; + } + + + /* Store loca values (provided by `reconstruct_glyf') to output stream. */ + static FT_Error + store_loca( FT_ULong* loca_values, + FT_ULong loca_values_size, + FT_UShort index_format, + FT_ULong* checksum, + FT_Byte** sfnt_bytes, + FT_ULong* sfnt_size, + FT_ULong* out_offset, + FT_Memory memory ) + { + FT_Error error = FT_Err_Ok; + FT_Byte* sfnt = *sfnt_bytes; + FT_ULong dest_offset = *out_offset; + + FT_Byte* loca_buf = NULL; + FT_Byte* dst = NULL; + + FT_UInt i = 0; + FT_ULong loca_buf_size; + + const FT_ULong offset_size = index_format ? 4 : 2; + + + if ( ( loca_values_size << 2 ) >> 2 != loca_values_size ) + goto Fail; + + loca_buf_size = loca_values_size * offset_size; + if ( FT_NEW_ARRAY( loca_buf, loca_buf_size ) ) + goto Fail; + + dst = loca_buf; + for ( i = 0; i < loca_values_size; i++ ) + { + FT_ULong value = loca_values[i]; + + + if ( index_format ) + WRITE_ULONG( dst, value ); + else + WRITE_USHORT( dst, ( value >> 1 ) ); + } + + *checksum = compute_ULong_sum( loca_buf, loca_buf_size ); + /* Write `loca' table to sfnt buffer. */ + if ( WRITE_SFNT_BUF( loca_buf, loca_buf_size ) ) + goto Fail; + + /* Set pointer `sfnt_bytes' to its correct value. */ + *sfnt_bytes = sfnt; + *out_offset = dest_offset; + + FT_FREE( loca_buf ); + return error; + + Fail: + if ( !error ) + error = FT_THROW( Invalid_Table ); + + FT_FREE( loca_buf ); + + return error; + } + + + static FT_Error + reconstruct_glyf( FT_Stream stream, + FT_ULong* glyf_checksum, + FT_ULong* loca_checksum, + FT_Byte** sfnt_bytes, + FT_ULong* sfnt_size, + FT_ULong* out_offset, + WOFF2_Info info, + FT_Memory memory ) + { + FT_Error error = FT_Err_Ok; + FT_Byte* sfnt = *sfnt_bytes; + + /* current position in stream */ + const FT_ULong pos = FT_STREAM_POS(); + + FT_UInt num_substreams = 7; + + FT_UShort num_glyphs; + FT_UShort index_format; + FT_ULong expected_loca_length; + FT_UInt offset; + FT_UInt i; + FT_ULong points_size; + FT_ULong bitmap_length; + FT_ULong glyph_buf_size; + FT_ULong bbox_bitmap_offset; + + const FT_ULong glyf_start = *out_offset; + FT_ULong dest_offset = *out_offset; + + WOFF2_Substream substreams = NULL; + + FT_ULong* loca_values = NULL; + FT_UShort* n_points_arr = NULL; + FT_Byte* glyph_buf = NULL; + WOFF2_Point points = NULL; + + + if ( FT_NEW_ARRAY( substreams, num_substreams ) ) + goto Fail; + + if ( FT_STREAM_SKIP( 4 ) ) + goto Fail; + if ( FT_READ_USHORT( num_glyphs ) ) + goto Fail; + if ( FT_READ_USHORT( index_format ) ) + goto Fail; + + FT_TRACE4(( "num_glyphs = %u; index_format = %u\n", + num_glyphs, index_format )); + + info->num_glyphs = num_glyphs; + + /* Calculate expected length of loca and compare. */ + /* See https://www.w3.org/TR/WOFF2/#conform-mustRejectLoca */ + /* index_format = 0 => Short version `loca'. */ + /* index_format = 1 => Long version `loca'. */ + expected_loca_length = ( index_format ? 4 : 2 ) * + ( (FT_ULong)num_glyphs + 1 ); + if ( info->loca_table->dst_length != expected_loca_length ) + goto Fail; + + offset = ( 2 + num_substreams ) * 4; + if ( offset > info->glyf_table->TransformLength ) + goto Fail; + + for ( i = 0; i < num_substreams; ++i ) + { + FT_ULong substream_size; + + + if ( FT_READ_ULONG( substream_size ) ) + goto Fail; + if ( substream_size > info->glyf_table->TransformLength - offset ) + goto Fail; + + substreams[i].start = pos + offset; + substreams[i].offset = pos + offset; + substreams[i].size = substream_size; + + FT_TRACE5(( " Substream %d: offset = %lu; size = %lu;\n", + i, substreams[i].offset, substreams[i].size )); + offset += substream_size; + } + + if ( FT_NEW_ARRAY( loca_values, num_glyphs + 1 ) ) + goto Fail; + + points_size = 0; + bbox_bitmap_offset = substreams[BBOX_STREAM].offset; + + /* Size of bboxBitmap = 4 * floor((numGlyphs + 31) / 32) */ + bitmap_length = ( ( num_glyphs + 31U ) >> 5 ) << 2; + substreams[BBOX_STREAM].offset += bitmap_length; + + glyph_buf_size = WOFF2_DEFAULT_GLYPH_BUF; + if ( FT_NEW_ARRAY( glyph_buf, glyph_buf_size ) ) + goto Fail; + + if ( FT_NEW_ARRAY( info->x_mins, num_glyphs ) ) + goto Fail; + + for ( i = 0; i < num_glyphs; ++i ) + { + FT_ULong glyph_size = 0; + FT_UShort n_contours = 0; + FT_Bool have_bbox = FALSE; + FT_Byte bbox_bitmap; + FT_ULong bbox_offset; + FT_UShort x_min = 0; + + + /* Set `have_bbox'. */ + bbox_offset = bbox_bitmap_offset + ( i >> 3 ); + if ( FT_STREAM_SEEK( bbox_offset ) || + FT_READ_BYTE( bbox_bitmap ) ) + goto Fail; + if ( bbox_bitmap & ( 0x80 >> ( i & 7 ) ) ) + have_bbox = TRUE; + + /* Read value from `nContourStream'. */ + if ( FT_STREAM_SEEK( substreams[N_CONTOUR_STREAM].offset ) || + FT_READ_USHORT( n_contours ) ) + goto Fail; + substreams[N_CONTOUR_STREAM].offset += 2; + + if ( n_contours == 0xffff ) + { + /* composite glyph */ + FT_Bool have_instructions = FALSE; + FT_UShort instruction_size = 0; + FT_ULong composite_size; + FT_ULong size_needed; + FT_Byte* pointer = NULL; + + + /* Composite glyphs must have explicit bbox. */ + if ( !have_bbox ) + goto Fail; + + if ( compositeGlyph_size( stream, + substreams[COMPOSITE_STREAM].offset, + &composite_size, + &have_instructions) ) + goto Fail; + + if ( have_instructions ) + { + if ( FT_STREAM_SEEK( substreams[GLYPH_STREAM].offset ) || + READ_255USHORT( instruction_size ) ) + goto Fail; + substreams[GLYPH_STREAM].offset = FT_STREAM_POS(); + } + + size_needed = 12 + composite_size + instruction_size; + if ( glyph_buf_size < size_needed ) + { + if ( FT_RENEW_ARRAY( glyph_buf, glyph_buf_size, size_needed ) ) + goto Fail; + glyph_buf_size = size_needed; + } + + pointer = glyph_buf + glyph_size; + WRITE_USHORT( pointer, n_contours ); + glyph_size += 2; + + /* Read x_min for current glyph. */ + if ( FT_STREAM_SEEK( substreams[BBOX_STREAM].offset ) || + FT_READ_USHORT( x_min ) ) + goto Fail; + /* No increment here because we read again. */ + + if ( FT_STREAM_SEEK( substreams[BBOX_STREAM].offset ) || + FT_STREAM_READ( glyph_buf + glyph_size, 8 ) ) + goto Fail; + + substreams[BBOX_STREAM].offset += 8; + glyph_size += 8; + + if ( FT_STREAM_SEEK( substreams[COMPOSITE_STREAM].offset ) || + FT_STREAM_READ( glyph_buf + glyph_size, composite_size ) ) + goto Fail; + + substreams[COMPOSITE_STREAM].offset += composite_size; + glyph_size += composite_size; + + if ( have_instructions ) + { + pointer = glyph_buf + glyph_size; + WRITE_USHORT( pointer, instruction_size ); + glyph_size += 2; + + if ( FT_STREAM_SEEK( substreams[INSTRUCTION_STREAM].offset ) || + FT_STREAM_READ( glyph_buf + glyph_size, instruction_size ) ) + goto Fail; + + substreams[INSTRUCTION_STREAM].offset += instruction_size; + glyph_size += instruction_size; + } + } + else if ( n_contours > 0 ) + { + /* simple glyph */ + FT_ULong total_n_points = 0; + FT_UShort n_points_contour; + FT_UInt j; + FT_ULong flag_size; + FT_ULong triplet_size; + FT_ULong triplet_bytes_used; + FT_Byte* flags_buf = NULL; + FT_Byte* triplet_buf = NULL; + FT_UShort instruction_size; + FT_ULong size_needed; + FT_Int end_point; + FT_UInt contour_ix; + + FT_Byte* pointer = NULL; + + + if ( FT_NEW_ARRAY( n_points_arr, n_contours ) ) + goto Fail; + + if ( FT_STREAM_SEEK( substreams[N_POINTS_STREAM].offset ) ) + goto Fail; + + for ( j = 0; j < n_contours; ++j ) + { + if ( READ_255USHORT( n_points_contour ) ) + goto Fail; + n_points_arr[j] = n_points_contour; + /* Prevent negative/overflow. */ + if ( total_n_points + n_points_contour < total_n_points ) + goto Fail; + total_n_points += n_points_contour; + } + substreams[N_POINTS_STREAM].offset = FT_STREAM_POS(); + + flag_size = total_n_points; + if ( flag_size > substreams[FLAG_STREAM].size ) + goto Fail; + + flags_buf = stream->base + substreams[FLAG_STREAM].offset; + triplet_buf = stream->base + substreams[GLYPH_STREAM].offset; + + if ( substreams[GLYPH_STREAM].size < + ( substreams[GLYPH_STREAM].offset - + substreams[GLYPH_STREAM].start ) ) + goto Fail; + + triplet_size = substreams[GLYPH_STREAM].size - + ( substreams[GLYPH_STREAM].offset - + substreams[GLYPH_STREAM].start ); + triplet_bytes_used = 0; + + /* Create array to store point information. */ + points_size = total_n_points; + if ( FT_NEW_ARRAY( points, points_size ) ) + goto Fail; + + if ( triplet_decode( flags_buf, + triplet_buf, + triplet_size, + total_n_points, + points, + &triplet_bytes_used ) ) + goto Fail; + + substreams[FLAG_STREAM].offset += flag_size; + substreams[GLYPH_STREAM].offset += triplet_bytes_used; + + if ( FT_STREAM_SEEK( substreams[GLYPH_STREAM].offset ) || + READ_255USHORT( instruction_size ) ) + goto Fail; + + substreams[GLYPH_STREAM].offset = FT_STREAM_POS(); + + if ( total_n_points >= ( 1 << 27 ) ) + goto Fail; + + size_needed = 12 + + ( 2 * n_contours ) + + ( 5 * total_n_points ) + + instruction_size; + if ( glyph_buf_size < size_needed ) + { + if ( FT_RENEW_ARRAY( glyph_buf, glyph_buf_size, size_needed ) ) + goto Fail; + glyph_buf_size = size_needed; + } + + pointer = glyph_buf + glyph_size; + WRITE_USHORT( pointer, n_contours ); + glyph_size += 2; + + if ( have_bbox ) + { + /* Read x_min for current glyph. */ + if ( FT_STREAM_SEEK( substreams[BBOX_STREAM].offset ) || + FT_READ_USHORT( x_min ) ) + goto Fail; + /* No increment here because we read again. */ + + if ( FT_STREAM_SEEK( substreams[BBOX_STREAM].offset ) || + FT_STREAM_READ( glyph_buf + glyph_size, 8 ) ) + goto Fail; + substreams[BBOX_STREAM].offset += 8; + } + else + compute_bbox( total_n_points, points, glyph_buf, &x_min ); + + glyph_size = CONTOUR_OFFSET_END_POINT; + + pointer = glyph_buf + glyph_size; + end_point = -1; + + for ( contour_ix = 0; contour_ix < n_contours; ++contour_ix ) + { + end_point += n_points_arr[contour_ix]; + if ( end_point >= 65536 ) + goto Fail; + + WRITE_SHORT( pointer, end_point ); + glyph_size += 2; + } + + WRITE_USHORT( pointer, instruction_size ); + glyph_size += 2; + + if ( FT_STREAM_SEEK( substreams[INSTRUCTION_STREAM].offset ) || + FT_STREAM_READ( glyph_buf + glyph_size, instruction_size ) ) + goto Fail; + + substreams[INSTRUCTION_STREAM].offset += instruction_size; + glyph_size += instruction_size; + + if ( store_points( total_n_points, + points, + n_contours, + instruction_size, + glyph_buf, + glyph_buf_size, + &glyph_size ) ) + goto Fail; + + FT_FREE( points ); + FT_FREE( n_points_arr ); + } + else + { + /* Empty glyph. */ + /* Must not have a bbox. */ + if ( have_bbox ) + { + FT_ERROR(( "Empty glyph has a bbox.\n" )); + goto Fail; + } + } + + loca_values[i] = dest_offset - glyf_start; + + if ( WRITE_SFNT_BUF( glyph_buf, glyph_size ) ) + goto Fail; + + if ( pad4( &sfnt, sfnt_size, &dest_offset, memory ) ) + goto Fail; + + *glyf_checksum += compute_ULong_sum( glyph_buf, glyph_size ); + + /* Store x_mins, may be required to reconstruct `hmtx'. */ + if ( n_contours > 0 ) + info->x_mins[i] = (FT_Short)x_min; + } + + info->glyf_table->dst_length = dest_offset - info->glyf_table->dst_offset; + info->loca_table->dst_offset = dest_offset; + + /* `loca[n]' will be equal to the length of the `glyf' table. */ + loca_values[num_glyphs] = info->glyf_table->dst_length; + + if ( store_loca( loca_values, + num_glyphs + 1, + index_format, + loca_checksum, + &sfnt, + sfnt_size, + &dest_offset, + memory ) ) + goto Fail; + + info->loca_table->dst_length = dest_offset - info->loca_table->dst_offset; + + FT_TRACE4(( " loca table info:\n" )); + FT_TRACE4(( " dst_offset = %lu\n", info->loca_table->dst_offset )); + FT_TRACE4(( " dst_length = %lu\n", info->loca_table->dst_length )); + FT_TRACE4(( " checksum = %09lx\n", *loca_checksum )); + + /* Set pointer `sfnt_bytes' to its correct value. */ + *sfnt_bytes = sfnt; + *out_offset = dest_offset; + + FT_FREE( substreams ); + FT_FREE( loca_values ); + FT_FREE( n_points_arr ); + FT_FREE( glyph_buf ); + FT_FREE( points ); + + return error; + + Fail: + if ( !error ) + error = FT_THROW( Invalid_Table ); + + /* Set pointer `sfnt_bytes' to its correct value. */ + *sfnt_bytes = sfnt; + + FT_FREE( substreams ); + FT_FREE( loca_values ); + FT_FREE( n_points_arr ); + FT_FREE( glyph_buf ); + FT_FREE( points ); + + return error; + } + + + /* Get `x_mins' for untransformed `glyf' table. */ + static FT_Error + get_x_mins( FT_Stream stream, + WOFF2_Table* tables, + FT_UShort num_tables, + WOFF2_Info info, + FT_Memory memory ) + { + FT_UShort num_glyphs; + FT_UShort index_format; + FT_ULong glyf_offset; + FT_UShort glyf_offset_short; + FT_ULong loca_offset; + FT_Int i; + FT_Error error = FT_Err_Ok; + FT_ULong offset_size; + + /* At this point of time those tables might not have been read yet. */ + const WOFF2_Table maxp_table = find_table( tables, num_tables, + TTAG_maxp ); + const WOFF2_Table head_table = find_table( tables, num_tables, + TTAG_head ); + + + if ( !maxp_table ) + { + FT_ERROR(( "`maxp' table is missing.\n" )); + return FT_THROW( Invalid_Table ); + } + + if ( !head_table ) + { + FT_ERROR(( "`head' table is missing.\n" )); + return FT_THROW( Invalid_Table ); + } + + if ( !info->loca_table ) + { + FT_ERROR(( "`loca' table is missing.\n" )); + return FT_THROW( Invalid_Table ); + } + + /* Read `numGlyphs' field from `maxp' table. */ + if ( FT_STREAM_SEEK( maxp_table->src_offset ) || FT_STREAM_SKIP( 8 ) ) + return error; + + if ( FT_READ_USHORT( num_glyphs ) ) + return error; + + info->num_glyphs = num_glyphs; + + /* Read `indexToLocFormat' field from `head' table. */ + if ( FT_STREAM_SEEK( head_table->src_offset ) || + FT_STREAM_SKIP( 50 ) ) + return error; + + if ( FT_READ_USHORT( index_format ) ) + return error; + + offset_size = index_format ? 4 : 2; + + /* Create `x_mins' array. */ + if ( FT_NEW_ARRAY( info->x_mins, num_glyphs ) ) + return error; + + loca_offset = info->loca_table->src_offset; + + for ( i = 0; i < num_glyphs; ++i ) + { + if ( FT_STREAM_SEEK( loca_offset ) ) + return error; + + loca_offset += offset_size; + + if ( index_format ) + { + if ( FT_READ_ULONG( glyf_offset ) ) + return error; + } + else + { + if ( FT_READ_USHORT( glyf_offset_short ) ) + return error; + + glyf_offset = (FT_ULong)( glyf_offset_short ); + glyf_offset = glyf_offset << 1; + } + + glyf_offset += info->glyf_table->src_offset; + + if ( FT_STREAM_SEEK( glyf_offset ) || FT_STREAM_SKIP( 2 ) ) + return error; + + if ( FT_READ_SHORT( info->x_mins[i] ) ) + return error; + } + + return error; + } + + + static FT_Error + reconstruct_hmtx( FT_Stream stream, + FT_UShort num_glyphs, + FT_UShort num_hmetrics, + FT_Short* x_mins, + FT_ULong* checksum, + FT_Byte** sfnt_bytes, + FT_ULong* sfnt_size, + FT_ULong* out_offset, + FT_Memory memory ) + { + FT_Error error = FT_Err_Ok; + FT_Byte* sfnt = *sfnt_bytes; + FT_ULong dest_offset = *out_offset; + + FT_Byte hmtx_flags; + FT_Bool has_proportional_lsbs, has_monospace_lsbs; + FT_ULong hmtx_table_size; + FT_Int i; + + FT_UShort* advance_widths = NULL; + FT_Short* lsbs = NULL; + FT_Byte* hmtx_table = NULL; + FT_Byte* dst = NULL; + + + if ( FT_READ_BYTE( hmtx_flags ) ) + goto Fail; + + has_proportional_lsbs = ( hmtx_flags & 1 ) == 0; + has_monospace_lsbs = ( hmtx_flags & 2 ) == 0; + + /* Bits 2-7 are reserved and MUST be zero. */ + if ( ( hmtx_flags & 0xFC ) != 0 ) + goto Fail; + + /* Are you REALLY transformed? */ + if ( has_proportional_lsbs && has_monospace_lsbs ) + goto Fail; + + /* Cannot have a transformed `hmtx' without `glyf'. */ + if ( ( num_hmetrics > num_glyphs ) || + ( num_hmetrics < 1 ) ) + goto Fail; + + /* Must have at least one entry. */ + if ( num_hmetrics < 1 ) + goto Fail; + + if ( FT_NEW_ARRAY( advance_widths, num_hmetrics ) || + FT_NEW_ARRAY( lsbs, num_glyphs ) ) + goto Fail; + + /* Read `advanceWidth' stream. Always present. */ + for ( i = 0; i < num_hmetrics; i++ ) + { + FT_UShort advance_width; + + + if ( FT_READ_USHORT( advance_width ) ) + goto Fail; + + advance_widths[i] = advance_width; + } + + /* lsb values for proportional glyphs. */ + for ( i = 0; i < num_hmetrics; i++ ) + { + FT_Short lsb; + + + if ( has_proportional_lsbs ) + { + if ( FT_READ_SHORT( lsb ) ) + goto Fail; + } + else + lsb = x_mins[i]; + + lsbs[i] = lsb; + } + + /* lsb values for monospaced glyphs. */ + for ( i = num_hmetrics; i < num_glyphs; i++ ) + { + FT_Short lsb; + + + if ( has_monospace_lsbs ) + { + if ( FT_READ_SHORT( lsb ) ) + goto Fail; + } + else + lsb = x_mins[i]; + + lsbs[i] = lsb; + } + + /* Build the hmtx table. */ + hmtx_table_size = 2 * num_hmetrics + 2 * num_glyphs; + if ( FT_NEW_ARRAY( hmtx_table, hmtx_table_size ) ) + goto Fail; + + dst = hmtx_table; + FT_TRACE6(( "hmtx values: \n" )); + for ( i = 0; i < num_glyphs; i++ ) + { + if ( i < num_hmetrics ) + { + WRITE_SHORT( dst, advance_widths[i] ); + FT_TRACE6(( "%d ", advance_widths[i] )); + } + + WRITE_SHORT( dst, lsbs[i] ); + FT_TRACE6(( "%d ", lsbs[i] )); + } + FT_TRACE6(( "\n" )); + + *checksum = compute_ULong_sum( hmtx_table, hmtx_table_size ); + /* Write `hmtx' table to sfnt buffer. */ + if ( WRITE_SFNT_BUF( hmtx_table, hmtx_table_size ) ) + goto Fail; + + /* Set pointer `sfnt_bytes' to its correct value. */ + *sfnt_bytes = sfnt; + *out_offset = dest_offset; + + FT_FREE( advance_widths ); + FT_FREE( lsbs ); + FT_FREE( hmtx_table ); + + return error; + + Fail: + FT_FREE( advance_widths ); + FT_FREE( lsbs ); + FT_FREE( hmtx_table ); + + if ( !error ) + error = FT_THROW( Invalid_Table ); + + return error; + } + + + static FT_Error + reconstruct_font( FT_Byte* transformed_buf, + FT_ULong transformed_buf_size, + WOFF2_Table* indices, + WOFF2_Header woff2, + WOFF2_Info info, + FT_Byte** sfnt_bytes, + FT_ULong* sfnt_size, + FT_Memory memory ) + { + /* Memory management of `transformed_buf' is handled by the caller. */ + + FT_Error error = FT_Err_Ok; + FT_Stream stream = NULL; + FT_Byte* buf_cursor = NULL; + FT_Byte* table_entry = NULL; + + /* We are reallocating memory for `sfnt', so its pointer may change. */ + FT_Byte* sfnt = *sfnt_bytes; + + FT_UShort num_tables = woff2->num_tables; + FT_ULong dest_offset = 12 + num_tables * 16UL; + + FT_ULong checksum = 0; + FT_ULong loca_checksum = 0; + FT_Int nn = 0; + FT_UShort num_hmetrics = 0; + FT_ULong font_checksum = info->header_checksum; + FT_Bool is_glyf_xform = FALSE; + + FT_ULong table_entry_offset = 12; + + + /* A few table checks before reconstruction. */ + /* `glyf' must be present with `loca'. */ + info->glyf_table = find_table( indices, num_tables, TTAG_glyf ); + info->loca_table = find_table( indices, num_tables, TTAG_loca ); + + if ( ( info->glyf_table == NULL ) ^ ( info->loca_table == NULL ) ) + { + FT_ERROR(( "One of `glyf'/`loca' tables missing.\n" )); + return FT_THROW( Invalid_Table ); + } + + /* Both `glyf' and `loca' must have same transformation. */ + if ( info->glyf_table != NULL ) + { + if ( ( info->glyf_table->flags & WOFF2_FLAGS_TRANSFORM ) != + ( info->loca_table->flags & WOFF2_FLAGS_TRANSFORM ) ) + { + FT_ERROR(( "Transformation mismatch" + " between `glyf' and `loca' table." )); + return FT_THROW( Invalid_Table ); + } + } + + /* Create buffer for table entries. */ + if ( FT_NEW_ARRAY( table_entry, 16 ) ) + goto Fail; + + /* Create a stream for the uncompressed buffer. */ + if ( FT_NEW( stream ) ) + goto Fail; + FT_Stream_OpenMemory( stream, transformed_buf, transformed_buf_size ); + + FT_ASSERT( FT_STREAM_POS() == 0 ); + + /* Reconstruct/copy tables to output stream. */ + for ( nn = 0; nn < num_tables; nn++ ) + { + WOFF2_TableRec table = *( indices[nn] ); + + + FT_TRACE3(( "Seeking to %ld with table size %ld.\n", + table.src_offset, table.src_length )); + FT_TRACE3(( "Table tag: %c%c%c%c.\n", + (FT_Char)( table.Tag >> 24 ), + (FT_Char)( table.Tag >> 16 ), + (FT_Char)( table.Tag >> 8 ), + (FT_Char)( table.Tag ) )); + + if ( FT_STREAM_SEEK( table.src_offset ) ) + goto Fail; + + if ( table.src_offset + table.src_length > transformed_buf_size ) + goto Fail; + + /* Get stream size for fields of `hmtx' table. */ + if ( table.Tag == TTAG_hhea ) + { + if ( read_num_hmetrics( stream, &num_hmetrics ) ) + goto Fail; + } + + info->num_hmetrics = num_hmetrics; + + checksum = 0; + if ( ( table.flags & WOFF2_FLAGS_TRANSFORM ) != WOFF2_FLAGS_TRANSFORM ) + { + /* Check whether `head' is at least 12 bytes. */ + if ( table.Tag == TTAG_head ) + { + if ( table.src_length < 12 ) + goto Fail; + + buf_cursor = transformed_buf + table.src_offset + 8; + /* Set checkSumAdjustment = 0 */ + WRITE_ULONG( buf_cursor, 0 ); + } + + table.dst_offset = dest_offset; + + checksum = compute_ULong_sum( transformed_buf + table.src_offset, + table.src_length ); + FT_TRACE4(( "Checksum = %09lx.\n", checksum )); + + if ( WRITE_SFNT_BUF( transformed_buf + table.src_offset, + table.src_length ) ) + goto Fail; + } + else + { + FT_TRACE3(( "This table is transformed.\n" )); + + if ( table.Tag == TTAG_glyf ) + { + is_glyf_xform = TRUE; + table.dst_offset = dest_offset; + + if ( reconstruct_glyf( stream, + &checksum, + &loca_checksum, + &sfnt, + sfnt_size, + &dest_offset, + info, + memory ) ) + goto Fail; + + FT_TRACE4(( "Checksum = %09lx.\n", checksum )); + } + + else if ( table.Tag == TTAG_loca ) + checksum = loca_checksum; + + else if ( table.Tag == TTAG_hmtx ) + { + /* If glyf is not transformed and hmtx is, handle separately. */ + if ( !is_glyf_xform ) + { + if ( get_x_mins( stream, indices, num_tables, info, memory ) ) + goto Fail; + } + + table.dst_offset = dest_offset; + + if ( reconstruct_hmtx( stream, + info->num_glyphs, + info->num_hmetrics, + info->x_mins, + &checksum, + &sfnt, + sfnt_size, + &dest_offset, + memory ) ) + goto Fail; + } + else + { + /* Unknown transform. */ + FT_ERROR(( "Unknown table transform.\n" )); + goto Fail; + } + } + + font_checksum += checksum; + + buf_cursor = &table_entry[0]; + WRITE_ULONG( buf_cursor, table.Tag ); + WRITE_ULONG( buf_cursor, checksum ); + WRITE_ULONG( buf_cursor, table.dst_offset ); + WRITE_ULONG( buf_cursor, table.dst_length ); + + WRITE_SFNT_BUF_AT( table_entry_offset, table_entry, 16 ); + + /* Update checksum. */ + font_checksum += compute_ULong_sum( table_entry, 16 ); + + if ( pad4( &sfnt, sfnt_size, &dest_offset, memory ) ) + goto Fail; + + /* Sanity check. */ + if ( (FT_ULong)( table.dst_offset + table.dst_length ) > dest_offset ) + { + FT_ERROR(( "Table was partially written.\n" )); + goto Fail; + } + } + + /* Update `head' checkSumAdjustment. */ + info->head_table = find_table( indices, num_tables, TTAG_head ); + if ( !info->head_table ) + { + FT_ERROR(( "`head' table is missing.\n" )); + goto Fail; + } + + if ( info->head_table->dst_length < 12 ) + goto Fail; + + buf_cursor = sfnt + info->head_table->dst_offset + 8; + font_checksum = 0xB1B0AFBA - font_checksum; + + WRITE_ULONG( buf_cursor, font_checksum ); + + FT_TRACE2(( "Final checksum = %09lx.\n", font_checksum )); + + woff2->actual_sfnt_size = dest_offset; + + /* Set pointer of sfnt stream to its correct value. */ + *sfnt_bytes = sfnt; + + FT_FREE( table_entry ); + FT_Stream_Close( stream ); + FT_FREE( stream ); + + return error; + + Fail: + if ( !error ) + error = FT_THROW( Invalid_Table ); + + /* Set pointer of sfnt stream to its correct value. */ + *sfnt_bytes = sfnt; + + FT_FREE( table_entry ); + FT_Stream_Close( stream ); + FT_FREE( stream ); + + return error; + } + + + /* Replace `face->root.stream' with a stream containing the extracted */ + /* SFNT of a WOFF2 font. */ + + FT_LOCAL_DEF( FT_Error ) + woff2_open_font( FT_Stream stream, + TT_Face face, + FT_Int* face_instance_index, + FT_Long* num_faces ) + { + FT_Memory memory = stream->memory; + FT_Error error = FT_Err_Ok; + FT_Int face_index; + + WOFF2_HeaderRec woff2; + WOFF2_InfoRec info = { 0, 0, 0, NULL, NULL, NULL, NULL }; + WOFF2_Table tables = NULL; + WOFF2_Table* indices = NULL; + WOFF2_Table* temp_indices = NULL; + WOFF2_Table last_table; + + FT_Int nn; + FT_ULong j; + FT_ULong flags; + FT_UShort xform_version; + FT_ULong src_offset = 0; + + FT_UInt glyf_index; + FT_UInt loca_index; + FT_UInt32 file_offset; + + FT_Byte* sfnt = NULL; + FT_Stream sfnt_stream = NULL; + FT_Byte* sfnt_header; + FT_ULong sfnt_size; + + FT_Byte* uncompressed_buf = NULL; + + static const FT_Frame_Field woff2_header_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE WOFF2_HeaderRec + + FT_FRAME_START( 48 ), + FT_FRAME_ULONG ( signature ), + FT_FRAME_ULONG ( flavor ), + FT_FRAME_ULONG ( length ), + FT_FRAME_USHORT ( num_tables ), + FT_FRAME_SKIP_BYTES( 2 ), + FT_FRAME_ULONG ( totalSfntSize ), + FT_FRAME_ULONG ( totalCompressedSize ), + FT_FRAME_SKIP_BYTES( 2 * 2 ), + FT_FRAME_ULONG ( metaOffset ), + FT_FRAME_ULONG ( metaLength ), + FT_FRAME_ULONG ( metaOrigLength ), + FT_FRAME_ULONG ( privOffset ), + FT_FRAME_ULONG ( privLength ), + FT_FRAME_END + }; + + + FT_ASSERT( stream == face->root.stream ); + FT_ASSERT( FT_STREAM_POS() == 0 ); + + face_index = FT_ABS( *face_instance_index ) & 0xFFFF; + + /* Read WOFF2 Header. */ + if ( FT_STREAM_READ_FIELDS( woff2_header_fields, &woff2 ) ) + return error; + + FT_TRACE4(( "signature -> 0x%lX\n", woff2.signature )); + FT_TRACE2(( "flavor -> 0x%08lx\n", woff2.flavor )); + FT_TRACE4(( "length -> %lu\n", woff2.length )); + FT_TRACE2(( "num_tables -> %hu\n", woff2.num_tables )); + FT_TRACE4(( "totalSfntSize -> %lu\n", woff2.totalSfntSize )); + FT_TRACE4(( "metaOffset -> %lu\n", woff2.metaOffset )); + FT_TRACE4(( "metaLength -> %lu\n", woff2.metaLength )); + FT_TRACE4(( "privOffset -> %lu\n", woff2.privOffset )); + FT_TRACE4(( "privLength -> %lu\n", woff2.privLength )); + + /* Make sure we don't recurse back here. */ + if ( woff2.flavor == TTAG_wOF2 ) + return FT_THROW( Invalid_Table ); + + /* Miscellaneous checks. */ + if ( woff2.length != stream->size || + woff2.num_tables == 0 || + 48 + woff2.num_tables * 20UL >= woff2.length || + ( woff2.metaOffset == 0 && ( woff2.metaLength != 0 || + woff2.metaOrigLength != 0 ) ) || + ( woff2.metaLength != 0 && woff2.metaOrigLength == 0 ) || + ( woff2.metaOffset >= woff2.length ) || + ( woff2.length - woff2.metaOffset < woff2.metaLength ) || + ( woff2.privOffset == 0 && woff2.privLength != 0 ) || + ( woff2.privOffset >= woff2.length ) || + ( woff2.length - woff2.privOffset < woff2.privLength ) ) + { + FT_ERROR(( "woff2_open_font: invalid WOFF2 header\n" )); + return FT_THROW( Invalid_Table ); + } + + FT_TRACE2(( "woff2_open_font: WOFF2 Header is valid.\n" )); + + woff2.ttc_fonts = NULL; + + /* Read table directory. */ + if ( FT_NEW_ARRAY( tables, woff2.num_tables ) || + FT_NEW_ARRAY( indices, woff2.num_tables ) ) + goto Exit; + + FT_TRACE2(( + "\n" + " tag flags transform origLen transformLen offset\n" + " -----------------------------------------------------------\n" )); + /* " XXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX" */ + + for ( nn = 0; nn < woff2.num_tables; nn++ ) + { + WOFF2_Table table = tables + nn; + + + if ( FT_READ_BYTE( table->FlagByte ) ) + goto Exit; + + if ( ( table->FlagByte & 0x3f ) == 0x3f ) + { + if ( FT_READ_ULONG( table->Tag ) ) + goto Exit; + } + else + { + table->Tag = woff2_known_tags( table->FlagByte & 0x3f ); + if ( !table->Tag ) + { + FT_ERROR(( "woff2_open_font: Unknown table tag." )); + error = FT_THROW( Invalid_Table ); + goto Exit; + } + } + + flags = 0; + xform_version = ( table->FlagByte >> 6 ) & 0x03; + + /* 0 means xform for glyph/loca, non-0 for others. */ + if ( table->Tag == TTAG_glyf || table->Tag == TTAG_loca ) + { + if ( xform_version == 0 ) + flags |= WOFF2_FLAGS_TRANSFORM; + } + else if ( xform_version != 0 ) + flags |= WOFF2_FLAGS_TRANSFORM; + + flags |= xform_version; + + if ( READ_BASE128( table->dst_length ) ) + goto Exit; + + table->TransformLength = table->dst_length; + + if ( ( flags & WOFF2_FLAGS_TRANSFORM ) != 0 ) + { + if ( READ_BASE128( table->TransformLength ) ) + goto Exit; + + if ( table->Tag == TTAG_loca && table->TransformLength ) + { + FT_ERROR(( "woff2_open_font: Invalid loca `transformLength'.\n" )); + error = FT_THROW( Invalid_Table ); + goto Exit; + } + } + + if ( src_offset + table->TransformLength < src_offset ) + { + FT_ERROR(( "woff2_open_font: invalid WOFF2 table directory.\n" )); + error = FT_THROW( Invalid_Table ); + goto Exit; + } + + table->src_offset = src_offset; + table->src_length = table->TransformLength; + src_offset += table->TransformLength; + table->flags = flags; + + FT_TRACE2(( " %c%c%c%c %08d %08d %08ld %08ld %08ld\n", + (FT_Char)( table->Tag >> 24 ), + (FT_Char)( table->Tag >> 16 ), + (FT_Char)( table->Tag >> 8 ), + (FT_Char)( table->Tag ), + table->FlagByte & 0x3f, + ( table->FlagByte >> 6 ) & 0x03, + table->dst_length, + table->TransformLength, + table->src_offset )); + + indices[nn] = table; + } + + /* End of last table is uncompressed size. */ + last_table = indices[woff2.num_tables - 1]; + + woff2.uncompressed_size = last_table->src_offset + + last_table->src_length; + if ( woff2.uncompressed_size < last_table->src_offset ) + { + error = FT_THROW( Invalid_Table ); + goto Exit; + } + + FT_TRACE2(( "Table directory parsed.\n" )); + + /* Check for and read collection directory. */ + woff2.num_fonts = 1; + woff2.header_version = 0; + + if ( woff2.flavor == TTAG_ttcf ) + { + FT_TRACE2(( "Font is a TTC, reading collection directory.\n" )); + + if ( FT_READ_ULONG( woff2.header_version ) ) + goto Exit; + + if ( woff2.header_version != 0x00010000 && + woff2.header_version != 0x00020000 ) + { + error = FT_THROW( Invalid_Table ); + goto Exit; + } + + if ( READ_255USHORT( woff2.num_fonts ) ) + goto Exit; + + if ( !woff2.num_fonts ) + { + error = FT_THROW( Invalid_Table ); + goto Exit; + } + + FT_TRACE4(( "Number of fonts in TTC: %d\n", woff2.num_fonts )); + + if ( FT_NEW_ARRAY( woff2.ttc_fonts, woff2.num_fonts ) ) + goto Exit; + + for ( nn = 0; nn < woff2.num_fonts; nn++ ) + { + WOFF2_TtcFont ttc_font = woff2.ttc_fonts + nn; + + + if ( READ_255USHORT( ttc_font->num_tables ) ) + goto Exit; + if ( FT_READ_ULONG( ttc_font->flavor ) ) + goto Exit; + + if ( FT_NEW_ARRAY( ttc_font->table_indices, ttc_font->num_tables ) ) + goto Exit; + + FT_TRACE5(( "Number of tables in font %d: %d\n", + nn, ttc_font->num_tables )); + +#ifdef FT_DEBUG_LEVEL_TRACE + if ( ttc_font->num_tables ) + FT_TRACE6(( " Indices: " )); +#endif + + glyf_index = 0; + loca_index = 0; + + for ( j = 0; j < ttc_font->num_tables; j++ ) + { + FT_UShort table_index; + WOFF2_Table table; + + + if ( READ_255USHORT( table_index ) ) + goto Exit; + + FT_TRACE6(( "%hu ", table_index )); + if ( table_index >= woff2.num_tables ) + { + FT_ERROR(( "woff2_open_font: invalid table index\n" )); + error = FT_THROW( Invalid_Table ); + goto Exit; + } + + ttc_font->table_indices[j] = table_index; + + table = indices[table_index]; + if ( table->Tag == TTAG_loca ) + loca_index = table_index; + if ( table->Tag == TTAG_glyf ) + glyf_index = table_index; + } + +#ifdef FT_DEBUG_LEVEL_TRACE + if ( ttc_font->num_tables ) + FT_TRACE6(( "\n" )); +#endif + + /* glyf and loca must be consecutive */ + if ( glyf_index > 0 || loca_index > 0 ) + { + if ( glyf_index > loca_index || + loca_index - glyf_index != 1 ) + { + error = FT_THROW( Invalid_Table ); + goto Exit; + } + } + } + + /* Collection directory reading complete. */ + FT_TRACE2(( "WOFF2 collection directory is valid.\n" )); + } + else + woff2.ttc_fonts = NULL; + + woff2.compressed_offset = FT_STREAM_POS(); + file_offset = ROUND4( woff2.compressed_offset + + woff2.totalCompressedSize ); + + /* Some more checks before we start reading the tables. */ + if ( file_offset > woff2.length ) + { + error = FT_THROW( Invalid_Table ); + goto Exit; + } + + if ( woff2.metaOffset ) + { + if ( file_offset != woff2.metaOffset ) + { + error = FT_THROW( Invalid_Table ); + goto Exit; + } + file_offset = ROUND4(woff2.metaOffset + woff2.metaLength); + } + + if ( woff2.privOffset ) + { + if ( file_offset != woff2.privOffset ) + { + error = FT_THROW( Invalid_Table ); + goto Exit; + } + file_offset = ROUND4(woff2.privOffset + woff2.privLength); + } + + if ( file_offset != ( ROUND4( woff2.length ) ) ) + { + error = FT_THROW( Invalid_Table ); + goto Exit; + } + + /* Validate requested face index. */ + *num_faces = woff2.num_fonts; + /* value -(N+1) requests information on index N */ + if ( *face_instance_index < 0 ) + face_index--; + + if ( face_index >= woff2.num_fonts ) + { + if ( *face_instance_index >= 0 ) + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + else + face_index = 0; + } + + /* Only retain tables of the requested face in a TTC. */ + if ( woff2.header_version ) + { + WOFF2_TtcFont ttc_font = woff2.ttc_fonts + face_index; + + + /* Create a temporary array. */ + if ( FT_NEW_ARRAY( temp_indices, + ttc_font->num_tables ) ) + goto Exit; + + FT_TRACE4(( "Storing tables for TTC face index %d.\n", face_index )); + for ( nn = 0; nn < ttc_font->num_tables; nn++ ) + temp_indices[nn] = indices[ttc_font->table_indices[nn]]; + + /* Resize array to required size. */ + if ( FT_RENEW_ARRAY( indices, + woff2.num_tables, + ttc_font->num_tables ) ) + goto Exit; + + for ( nn = 0; nn < ttc_font->num_tables; nn++ ) + indices[nn] = temp_indices[nn]; + + FT_FREE( temp_indices ); + + /* Change header values. */ + woff2.flavor = ttc_font->flavor; + woff2.num_tables = ttc_font->num_tables; + } + + /* We need to allocate this much at the minimum. */ + sfnt_size = 12 + woff2.num_tables * 16UL; + /* This is what we normally expect. */ + /* Initially trust `totalSfntSize' and change later as required. */ + if ( woff2.totalSfntSize > sfnt_size ) + { + /* However, adjust the value to something reasonable. */ + + /* Factor 64 is heuristic. */ + if ( ( woff2.totalSfntSize >> 6 ) > woff2.length ) + sfnt_size = woff2.length << 6; + else + sfnt_size = woff2.totalSfntSize; + + /* Value 1<<26 = 67108864 is heuristic. */ + if (sfnt_size >= (1 << 26)) + sfnt_size = 1 << 26; + +#ifdef FT_DEBUG_LEVEL_TRACE + if ( sfnt_size != woff2.totalSfntSize ) + FT_TRACE4(( "adjusting estimate of uncompressed font size" + " to %lu bytes\n", + sfnt_size )); +#endif + } + + /* Write sfnt header. */ + if ( FT_ALLOC( sfnt, sfnt_size ) || + FT_NEW( sfnt_stream ) ) + goto Exit; + + sfnt_header = sfnt; + + WRITE_ULONG( sfnt_header, woff2.flavor ); + + if ( woff2.num_tables ) + { + FT_UInt searchRange, entrySelector, rangeShift, x; + + + x = woff2.num_tables; + entrySelector = 0; + while ( x ) + { + x >>= 1; + entrySelector += 1; + } + entrySelector--; + + searchRange = ( 1 << entrySelector ) * 16; + rangeShift = ( woff2.num_tables * 16 ) - searchRange; + + WRITE_USHORT( sfnt_header, woff2.num_tables ); + WRITE_USHORT( sfnt_header, searchRange ); + WRITE_USHORT( sfnt_header, entrySelector ); + WRITE_USHORT( sfnt_header, rangeShift ); + } + + info.header_checksum = compute_ULong_sum( sfnt, 12 ); + + /* Sort tables by tag. */ + ft_qsort( indices, + woff2.num_tables, + sizeof ( WOFF2_Table ), + compare_tags ); + + if ( woff2.uncompressed_size < 1 ) + { + error = FT_THROW( Invalid_Table ); + goto Exit; + } + + if ( woff2.uncompressed_size > sfnt_size ) + { + FT_ERROR(( "woff2_open_font: SFNT table lengths are too large.\n" )); + error = FT_THROW( Invalid_Table ); + goto Exit; + } + + /* Allocate memory for uncompressed table data. */ + if ( FT_ALLOC( uncompressed_buf, woff2.uncompressed_size ) || + FT_FRAME_ENTER( woff2.totalCompressedSize ) ) + goto Exit; + + /* Uncompress the stream. */ + error = woff2_decompress( uncompressed_buf, + woff2.uncompressed_size, + stream->cursor, + woff2.totalCompressedSize ); + + FT_FRAME_EXIT(); + + if ( error ) + goto Exit; + + error = reconstruct_font( uncompressed_buf, + woff2.uncompressed_size, + indices, + &woff2, + &info, + &sfnt, + &sfnt_size, + memory ); + + if ( error ) + goto Exit; + + /* Resize `sfnt' to actual size of sfnt stream. */ + if ( woff2.actual_sfnt_size < sfnt_size ) + { + FT_TRACE5(( "Trimming sfnt stream from %lu to %lu.\n", + sfnt_size, woff2.actual_sfnt_size )); + if ( FT_REALLOC( sfnt, + (FT_ULong)( sfnt_size ), + (FT_ULong)( woff2.actual_sfnt_size ) ) ) + goto Exit; + } + + /* `reconstruct_font' has done all the work. */ + /* Swap out stream and return. */ + FT_Stream_OpenMemory( sfnt_stream, sfnt, woff2.actual_sfnt_size ); + sfnt_stream->memory = stream->memory; + sfnt_stream->close = stream_close; + + FT_Stream_Free( + face->root.stream, + ( face->root.face_flags & FT_FACE_FLAG_EXTERNAL_STREAM ) != 0 ); + + face->root.stream = sfnt_stream; + face->root.face_flags &= ~FT_FACE_FLAG_EXTERNAL_STREAM; + + /* Set face_index to 0 or -1. */ + if ( *face_instance_index >= 0 ) + *face_instance_index = 0; + else + *face_instance_index = -1; + + FT_TRACE2(( "woff2_open_font: SFNT synthesized.\n" )); + + Exit: + FT_FREE( tables ); + FT_FREE( indices ); + FT_FREE( uncompressed_buf ); + FT_FREE( info.x_mins ); + + if ( woff2.ttc_fonts ) + { + WOFF2_TtcFont ttc_font = woff2.ttc_fonts; + + + for ( nn = 0; nn < woff2.num_fonts; nn++ ) + { + FT_FREE( ttc_font->table_indices ); + ttc_font++; + } + + FT_FREE( woff2.ttc_fonts ); + } + + if ( error ) + { + FT_FREE( sfnt ); + if ( sfnt_stream ) + { + FT_Stream_Close( sfnt_stream ); + FT_FREE( sfnt_stream ); + } + } + + return error; + } + + +#undef READ_255USHORT +#undef READ_BASE128 +#undef ROUND4 +#undef WRITE_USHORT +#undef WRITE_ULONG +#undef WRITE_SHORT +#undef WRITE_SFNT_BUF +#undef WRITE_SFNT_BUF_AT + +#undef N_CONTOUR_STREAM +#undef N_POINTS_STREAM +#undef FLAG_STREAM +#undef GLYPH_STREAM +#undef COMPOSITE_STREAM +#undef BBOX_STREAM +#undef INSTRUCTION_STREAM + + +/* END */ diff --git a/src/3rdparty/freetype/src/sfnt/sfwoff2.h b/src/3rdparty/freetype/src/sfnt/sfwoff2.h new file mode 100644 index 00000000..798f66bd --- /dev/null +++ b/src/3rdparty/freetype/src/sfnt/sfwoff2.h @@ -0,0 +1,75 @@ +/**************************************************************************** + * + * sfwoff2.h + * + * WOFFF2 format management (specification). + * + * Copyright (C) 2019-2020 by + * Nikhil Ramakrishnan, David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef SFWOFF2_H_ +#define SFWOFF2_H_ + + +#include +#include + + +FT_BEGIN_HEADER + + + /* Leave the first byte open to store `flag_byte'. */ +#define WOFF2_FLAGS_TRANSFORM 1 << 8 + +#define WOFF2_SFNT_HEADER_SIZE 12 +#define WOFF2_SFNT_ENTRY_SIZE 16 + + /* Suggested maximum size for output. */ +#define WOFF2_DEFAULT_MAX_SIZE 30 * 1024 * 1024 + + /* 98% of Google Fonts have no glyph above 5k bytes. */ +#define WOFF2_DEFAULT_GLYPH_BUF 5120 + + /* Composite glyph flags. */ + /* See `CompositeGlyph.java' in `sfntly' for full definitions. */ +#define FLAG_ARG_1_AND_2_ARE_WORDS 1 << 0 +#define FLAG_WE_HAVE_A_SCALE 1 << 3 +#define FLAG_MORE_COMPONENTS 1 << 5 +#define FLAG_WE_HAVE_AN_X_AND_Y_SCALE 1 << 6 +#define FLAG_WE_HAVE_A_TWO_BY_TWO 1 << 7 +#define FLAG_WE_HAVE_INSTRUCTIONS 1 << 8 + + /* Simple glyph flags */ +#define GLYF_ON_CURVE 1 << 0 +#define GLYF_X_SHORT 1 << 1 +#define GLYF_Y_SHORT 1 << 2 +#define GLYF_REPEAT 1 << 3 +#define GLYF_THIS_X_IS_SAME 1 << 4 +#define GLYF_THIS_Y_IS_SAME 1 << 5 + + /* Other constants */ +#define CONTOUR_OFFSET_END_POINT 10 + + + FT_LOCAL( FT_Error ) + woff2_open_font( FT_Stream stream, + TT_Face face, + FT_Int* face_index, + FT_Long* num_faces ); + + +FT_END_HEADER + +#endif /* SFWOFF2_H_ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/sfnt/ttbdf.c b/src/3rdparty/freetype/src/sfnt/ttbdf.c index 853599fc..a287d3af 100644 --- a/src/3rdparty/freetype/src/sfnt/ttbdf.c +++ b/src/3rdparty/freetype/src/sfnt/ttbdf.c @@ -4,7 +4,7 @@ * * TrueType and OpenType embedded BDF properties (body). * - * Copyright (C) 2005-2019 by + * Copyright (C) 2005-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -16,10 +16,9 @@ */ -#include -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_STREAM_H -#include FT_TRUETYPE_TAGS_H +#include +#include +#include #include "ttbdf.h" #include "sferrors.h" diff --git a/src/3rdparty/freetype/src/sfnt/ttbdf.h b/src/3rdparty/freetype/src/sfnt/ttbdf.h index e4164e61..e60c01cb 100644 --- a/src/3rdparty/freetype/src/sfnt/ttbdf.h +++ b/src/3rdparty/freetype/src/sfnt/ttbdf.h @@ -4,7 +4,7 @@ * * TrueType and OpenType embedded BDF properties (specification). * - * Copyright (C) 2005-2019 by + * Copyright (C) 2005-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -20,9 +20,8 @@ #define TTBDF_H_ -#include #include "ttload.h" -#include FT_BDF_H +#include FT_BEGIN_HEADER diff --git a/src/3rdparty/freetype/src/sfnt/ttcmap.c b/src/3rdparty/freetype/src/sfnt/ttcmap.c index 683f3b18..556a7121 100644 --- a/src/3rdparty/freetype/src/sfnt/ttcmap.c +++ b/src/3rdparty/freetype/src/sfnt/ttcmap.c @@ -4,7 +4,7 @@ * * TrueType character mapping table (cmap) support (body). * - * Copyright (C) 2002-2019 by + * Copyright (C) 2002-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -16,14 +16,13 @@ */ -#include -#include FT_INTERNAL_DEBUG_H +#include -#include "sferrors.h" /* must come before FT_INTERNAL_VALIDATE_H */ +#include "sferrors.h" /* must come before `ftvalid.h' */ -#include FT_INTERNAL_VALIDATE_H -#include FT_INTERNAL_STREAM_H -#include FT_SERVICE_POSTSCRIPT_CMAPS_H +#include +#include +#include #include "ttload.h" #include "ttcmap.h" #include "ttpost.h" @@ -3752,6 +3751,7 @@ static const TT_CMap_Class tt_cmap_classes[] = { +#undef TTCMAPCITEM #define TTCMAPCITEM( a ) &a, #include "ttcmapc.h" NULL, @@ -3764,29 +3764,33 @@ FT_LOCAL_DEF( FT_Error ) tt_face_build_cmaps( TT_Face face ) { - FT_Byte* table = face->cmap_table; - FT_Byte* limit = table + face->cmap_size; + FT_Byte* const table = face->cmap_table; + FT_Byte* limit; FT_UInt volatile num_cmaps; - FT_Byte* volatile p = table; + FT_Byte* volatile p = table; FT_Library library = FT_FACE_LIBRARY( face ); FT_UNUSED( library ); - if ( !p || p + 4 > limit ) + if ( !p || face->cmap_size < 4 ) return FT_THROW( Invalid_Table ); - /* only recognize format 0 */ - if ( TT_NEXT_USHORT( p ) != 0 ) - { - FT_ERROR(( "tt_face_build_cmaps:" - " unsupported `cmap' table format = %d\n", - TT_PEEK_USHORT( p - 2 ) )); - return FT_THROW( Invalid_Table ); - } + /* Version 1.8.3 of the OpenType specification contains the following */ + /* (https://docs.microsoft.com/en-us/typography/opentype/spec/cmap): */ + /* */ + /* The 'cmap' table version number remains at 0x0000 for fonts that */ + /* make use of the newer subtable formats. */ + /* */ + /* This essentially means that a version format test is useless. */ + + /* ignore format */ + p += 2; num_cmaps = TT_NEXT_USHORT( p ); + FT_TRACE4(( "tt_face_build_cmaps: %d cmaps\n", num_cmaps )); + limit = table + face->cmap_size; for ( ; num_cmaps > 0 && p + 8 <= limit; num_cmaps-- ) { FT_CharMapRec charmap; diff --git a/src/3rdparty/freetype/src/sfnt/ttcmap.h b/src/3rdparty/freetype/src/sfnt/ttcmap.h index 36801c93..c7d7c21d 100644 --- a/src/3rdparty/freetype/src/sfnt/ttcmap.h +++ b/src/3rdparty/freetype/src/sfnt/ttcmap.h @@ -4,7 +4,7 @@ * * TrueType character mapping table (cmap) support (specification). * - * Copyright (C) 2002-2019 by + * Copyright (C) 2002-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -20,10 +20,9 @@ #define TTCMAP_H_ -#include -#include FT_INTERNAL_TRUETYPE_TYPES_H -#include FT_INTERNAL_VALIDATE_H -#include FT_SERVICE_TT_CMAP_H +#include +#include +#include FT_BEGIN_HEADER @@ -91,6 +90,11 @@ FT_BEGIN_HEADER }; +#undef TTCMAPCITEM +#define TTCMAPCITEM( a ) FT_CALLBACK_TABLE const TT_CMap_ClassRec a; +#include "ttcmapc.h" + + typedef struct TT_ValidatorRec_ { FT_ValidatorRec validator; diff --git a/src/3rdparty/freetype/src/sfnt/ttcmapc.h b/src/3rdparty/freetype/src/sfnt/ttcmapc.h index ace9e69c..2e4ce507 100644 --- a/src/3rdparty/freetype/src/sfnt/ttcmapc.h +++ b/src/3rdparty/freetype/src/sfnt/ttcmapc.h @@ -4,7 +4,7 @@ * * TT CMAP classes definitions (specification only). * - * Copyright (C) 2009-2019 by + * Copyright (C) 2009-2020 by * Oran Agra and Mickey Gabel. * * This file is part of the FreeType project, and may only be used, diff --git a/src/3rdparty/freetype/src/sfnt/ttcolr.c b/src/3rdparty/freetype/src/sfnt/ttcolr.c index 6b537d95..9025e356 100644 --- a/src/3rdparty/freetype/src/sfnt/ttcolr.c +++ b/src/3rdparty/freetype/src/sfnt/ttcolr.c @@ -4,7 +4,7 @@ * * TrueType and OpenType colored glyph layer support (body). * - * Copyright (C) 2018-2019 by + * Copyright (C) 2018-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * Originally written by Shao Yu Zhang . @@ -27,11 +27,10 @@ */ -#include -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_STREAM_H -#include FT_TRUETYPE_TAGS_H -#include FT_COLOR_H +#include +#include +#include +#include #ifdef TT_CONFIG_OPTION_COLOR_LAYERS @@ -40,9 +39,9 @@ /* NOTE: These are the table sizes calculated through the specs. */ -#define BASE_GLYPH_SIZE 6 -#define LAYER_SIZE 4 -#define COLR_HEADER_SIZE 14 +#define BASE_GLYPH_SIZE 6U +#define LAYER_SIZE 4U +#define COLR_HEADER_SIZE 14U typedef struct BaseGlyphRecord_ diff --git a/src/3rdparty/freetype/src/sfnt/ttcolr.h b/src/3rdparty/freetype/src/sfnt/ttcolr.h index 817489a8..64121626 100644 --- a/src/3rdparty/freetype/src/sfnt/ttcolr.h +++ b/src/3rdparty/freetype/src/sfnt/ttcolr.h @@ -4,7 +4,7 @@ * * TrueType and OpenType colored glyph layer support (specification). * - * Copyright (C) 2018-2019 by + * Copyright (C) 2018-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * Originally written by Shao Yu Zhang . @@ -22,7 +22,6 @@ #define __TTCOLR_H__ -#include #include "ttload.h" diff --git a/src/3rdparty/freetype/src/sfnt/ttcpal.c b/src/3rdparty/freetype/src/sfnt/ttcpal.c index 3482169a..9c514baf 100644 --- a/src/3rdparty/freetype/src/sfnt/ttcpal.c +++ b/src/3rdparty/freetype/src/sfnt/ttcpal.c @@ -4,7 +4,7 @@ * * TrueType and OpenType color palette support (body). * - * Copyright (C) 2018-2019 by + * Copyright (C) 2018-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * Originally written by Shao Yu Zhang . @@ -27,11 +27,10 @@ */ -#include -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_STREAM_H -#include FT_TRUETYPE_TAGS_H -#include FT_COLOR_H +#include +#include +#include +#include #ifdef TT_CONFIG_OPTION_COLOR_LAYERS @@ -40,8 +39,8 @@ /* NOTE: These are the table sizes calculated through the specs. */ -#define CPAL_V0_HEADER_BASE_SIZE 12 -#define COLOR_SIZE 4 +#define CPAL_V0_HEADER_BASE_SIZE 12U +#define COLOR_SIZE 4U /* all data from `CPAL' not covered in FT_Palette_Data */ @@ -140,7 +139,7 @@ 3U * 4 > table_size ) goto InvalidTable; - p += face->palette_data.num_palettes * 2; + p += face->palette_data.num_palettes * 2U; type_offset = FT_NEXT_ULONG( p ); label_offset = FT_NEXT_ULONG( p ); @@ -150,7 +149,7 @@ { if ( type_offset >= table_size ) goto InvalidTable; - if ( face->palette_data.num_palettes * 2 > + if ( face->palette_data.num_palettes * 2U > table_size - type_offset ) goto InvalidTable; @@ -171,7 +170,7 @@ { if ( label_offset >= table_size ) goto InvalidTable; - if ( face->palette_data.num_palettes * 2 > + if ( face->palette_data.num_palettes * 2U > table_size - label_offset ) goto InvalidTable; @@ -192,7 +191,7 @@ { if ( entry_label_offset >= table_size ) goto InvalidTable; - if ( face->palette_data.num_palette_entries * 2 > + if ( face->palette_data.num_palette_entries * 2U > table_size - entry_label_offset ) goto InvalidTable; diff --git a/src/3rdparty/freetype/src/sfnt/ttcpal.h b/src/3rdparty/freetype/src/sfnt/ttcpal.h index d1b244f3..b544be69 100644 --- a/src/3rdparty/freetype/src/sfnt/ttcpal.h +++ b/src/3rdparty/freetype/src/sfnt/ttcpal.h @@ -4,7 +4,7 @@ * * TrueType and OpenType color palette support (specification). * - * Copyright (C) 2018-2019 by + * Copyright (C) 2018-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * Originally written by Shao Yu Zhang . @@ -22,7 +22,6 @@ #define __TTCPAL_H__ -#include #include "ttload.h" diff --git a/src/3rdparty/freetype/src/sfnt/ttkern.c b/src/3rdparty/freetype/src/sfnt/ttkern.c index 8d1b7810..d4a70c78 100644 --- a/src/3rdparty/freetype/src/sfnt/ttkern.c +++ b/src/3rdparty/freetype/src/sfnt/ttkern.c @@ -5,7 +5,7 @@ * Load the basic TrueType kerning table. This doesn't handle * kerning data within the GPOS table at the moment. * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -17,10 +17,9 @@ */ -#include -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_STREAM_H -#include FT_TRUETYPE_TAGS_H +#include +#include +#include #include "ttkern.h" #include "sferrors.h" diff --git a/src/3rdparty/freetype/src/sfnt/ttkern.h b/src/3rdparty/freetype/src/sfnt/ttkern.h index 5f283e5e..f44b5bde 100644 --- a/src/3rdparty/freetype/src/sfnt/ttkern.h +++ b/src/3rdparty/freetype/src/sfnt/ttkern.h @@ -5,7 +5,7 @@ * Load the basic TrueType kerning table. This doesn't handle * kerning data within the GPOS table at the moment. * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -21,9 +21,8 @@ #define TTKERN_H_ -#include -#include FT_INTERNAL_STREAM_H -#include FT_INTERNAL_TRUETYPE_TYPES_H +#include +#include FT_BEGIN_HEADER diff --git a/src/3rdparty/freetype/src/sfnt/ttload.c b/src/3rdparty/freetype/src/sfnt/ttload.c index 5443bf4b..4b46f413 100644 --- a/src/3rdparty/freetype/src/sfnt/ttload.c +++ b/src/3rdparty/freetype/src/sfnt/ttload.c @@ -5,7 +5,7 @@ * Load the basic TrueType tables, i.e., tables that can be either in * TTF or OTF fonts (body). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -17,10 +17,9 @@ */ -#include -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_STREAM_H -#include FT_TRUETYPE_TAGS_H +#include +#include +#include #include "ttload.h" #include "sferrors.h" @@ -65,8 +64,8 @@ #endif - FT_TRACE4(( "tt_face_lookup_table: %08p, `%c%c%c%c' -- ", - face, + FT_TRACE4(( "tt_face_lookup_table: %p, `%c%c%c%c' -- ", + (void *)face, (FT_Char)( tag >> 24 ), (FT_Char)( tag >> 16 ), (FT_Char)( tag >> 8 ), @@ -363,7 +362,7 @@ }; - FT_TRACE2(( "tt_face_load_font_dir: %08p\n", face )); + FT_TRACE2(( "tt_face_load_font_dir: %p\n", (void *)face )); /* read the offset table */ @@ -397,7 +396,15 @@ } } else + { valid_entries = sfnt.num_tables; + if ( !valid_entries ) + { + FT_TRACE2(( "tt_face_load_font_dir: no valid tables found\n" )); + error = FT_THROW( Unknown_File_Format ); + goto Exit; + } + } face->num_tables = valid_entries; face->format_tag = sfnt.format_tag; @@ -916,7 +923,7 @@ /* load language tags */ { TT_LangTag entry = table->langTags; - TT_LangTag limit = entry + table->numLangTagRecords; + TT_LangTag limit = FT_OFFSET( entry, table->numLangTagRecords ); for ( ; entry < limit; entry++ ) @@ -1307,7 +1314,7 @@ /* we don't load the glyph names, we do that in another */ /* module (ttpost). */ - FT_TRACE3(( "FormatType: 0x%x\n", post->FormatType )); + FT_TRACE3(( "FormatType: 0x%lx\n", post->FormatType )); FT_TRACE3(( "isFixedPitch: %s\n", post->isFixedPitch ? " yes" : " no" )); diff --git a/src/3rdparty/freetype/src/sfnt/ttload.h b/src/3rdparty/freetype/src/sfnt/ttload.h index cc18c186..4e53d8b7 100644 --- a/src/3rdparty/freetype/src/sfnt/ttload.h +++ b/src/3rdparty/freetype/src/sfnt/ttload.h @@ -5,7 +5,7 @@ * Load the basic TrueType tables, i.e., tables that can be either in * TTF or OTF fonts (specification). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -21,9 +21,8 @@ #define TTLOAD_H_ -#include -#include FT_INTERNAL_STREAM_H -#include FT_INTERNAL_TRUETYPE_TYPES_H +#include +#include FT_BEGIN_HEADER diff --git a/src/3rdparty/freetype/src/sfnt/ttmtx.c b/src/3rdparty/freetype/src/sfnt/ttmtx.c index b6725c96..02112333 100644 --- a/src/3rdparty/freetype/src/sfnt/ttmtx.c +++ b/src/3rdparty/freetype/src/sfnt/ttmtx.c @@ -4,7 +4,7 @@ * * Load the metrics tables common to TTF and OTF fonts (body). * - * Copyright (C) 2006-2019 by + * Copyright (C) 2006-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -16,13 +16,12 @@ */ -#include -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_STREAM_H -#include FT_TRUETYPE_TAGS_H +#include +#include +#include #ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT -#include FT_SERVICE_METRICS_VARIATIONS_H +#include #endif #include "ttmtx.h" diff --git a/src/3rdparty/freetype/src/sfnt/ttmtx.h b/src/3rdparty/freetype/src/sfnt/ttmtx.h index 5b0b60b6..dba65ca9 100644 --- a/src/3rdparty/freetype/src/sfnt/ttmtx.h +++ b/src/3rdparty/freetype/src/sfnt/ttmtx.h @@ -4,7 +4,7 @@ * * Load the metrics tables common to TTF and OTF fonts (specification). * - * Copyright (C) 2006-2019 by + * Copyright (C) 2006-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -20,9 +20,8 @@ #define TTMTX_H_ -#include -#include FT_INTERNAL_STREAM_H -#include FT_INTERNAL_TRUETYPE_TYPES_H +#include +#include FT_BEGIN_HEADER diff --git a/src/3rdparty/freetype/src/sfnt/ttpost.c b/src/3rdparty/freetype/src/sfnt/ttpost.c index 636a0a00..e93a4bf1 100644 --- a/src/3rdparty/freetype/src/sfnt/ttpost.c +++ b/src/3rdparty/freetype/src/sfnt/ttpost.c @@ -5,7 +5,7 @@ * PostScript name table processing for TrueType and OpenType fonts * (body). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -25,10 +25,9 @@ */ -#include -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_STREAM_H -#include FT_TRUETYPE_TAGS_H +#include +#include +#include #ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES @@ -54,7 +53,7 @@ #ifdef FT_CONFIG_OPTION_POSTSCRIPT_NAMES -#include FT_SERVICE_POSTSCRIPT_CMAPS_H +#include #define MAC_NAME( x ) (FT_String*)psnames->macintosh_name( (FT_UInt)(x) ) @@ -240,7 +239,7 @@ break; else { - FT_TRACE6(( "load_format_20: %d byte left in post table\n", + FT_TRACE6(( "load_format_20: %ld byte left in post table\n", post_limit - FT_STREAM_POS() )); if ( FT_READ_BYTE( len ) ) diff --git a/src/3rdparty/freetype/src/sfnt/ttpost.h b/src/3rdparty/freetype/src/sfnt/ttpost.h index 812a0fc9..94c7d168 100644 --- a/src/3rdparty/freetype/src/sfnt/ttpost.h +++ b/src/3rdparty/freetype/src/sfnt/ttpost.h @@ -5,7 +5,7 @@ * PostScript name table processing for TrueType and OpenType fonts * (specification). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -23,7 +23,7 @@ #include #include FT_CONFIG_CONFIG_H -#include FT_INTERNAL_TRUETYPE_TYPES_H +#include FT_BEGIN_HEADER diff --git a/src/3rdparty/freetype/src/sfnt/ttsbit.c b/src/3rdparty/freetype/src/sfnt/ttsbit.c index 23bd9d7e..9dd44197 100644 --- a/src/3rdparty/freetype/src/sfnt/ttsbit.c +++ b/src/3rdparty/freetype/src/sfnt/ttsbit.c @@ -4,7 +4,7 @@ * * TrueType and OpenType embedded bitmap support (body). * - * Copyright (C) 2005-2019 by + * Copyright (C) 2005-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * Copyright 2013 by Google, Inc. @@ -19,11 +19,10 @@ */ -#include -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_STREAM_H -#include FT_TRUETYPE_TAGS_H -#include FT_BITMAP_H +#include +#include +#include +#include #ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS @@ -348,7 +347,7 @@ FT_TRACE2(( "tt_face_load_strike_metrics:" " sanitizing invalid ascender and descender\n" " " - " values for strike %d (%dppem, %dppem)\n", + " values for strike %ld (%dppem, %dppem)\n", strike_index, metrics->x_ppem, metrics->y_ppem )); diff --git a/src/3rdparty/freetype/src/sfnt/ttsbit.h b/src/3rdparty/freetype/src/sfnt/ttsbit.h index 5ab8ff55..b867e43a 100644 --- a/src/3rdparty/freetype/src/sfnt/ttsbit.h +++ b/src/3rdparty/freetype/src/sfnt/ttsbit.h @@ -4,7 +4,7 @@ * * TrueType and OpenType embedded bitmap support (specification). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -20,7 +20,6 @@ #define TTSBIT_H_ -#include #include "ttload.h" diff --git a/src/3rdparty/freetype/src/sfnt/woff2tags.c b/src/3rdparty/freetype/src/sfnt/woff2tags.c new file mode 100644 index 00000000..fd9f2e6c --- /dev/null +++ b/src/3rdparty/freetype/src/sfnt/woff2tags.c @@ -0,0 +1,109 @@ +/**************************************************************************** + * + * woff2tags.c + * + * WOFF2 Font table tags (base). + * + * Copyright (C) 2019-2020 by + * Nikhil Ramakrishnan, David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#include +#include "woff2tags.h" + + /* + * Return tag from index in the order given in WOFF2 specification. + * + * See + * + * https://www.w3.org/TR/WOFF2/#table_dir_format + * + * for details. + */ + FT_LOCAL_DEF( FT_ULong ) + woff2_known_tags( FT_Byte index ) + { + const FT_ULong known_tags[63] = + { + FT_MAKE_TAG('c', 'm', 'a', 'p'), /* 0 */ + FT_MAKE_TAG('h', 'e', 'a', 'd'), /* 1 */ + FT_MAKE_TAG('h', 'h', 'e', 'a'), /* 2 */ + FT_MAKE_TAG('h', 'm', 't', 'x'), /* 3 */ + FT_MAKE_TAG('m', 'a', 'x', 'p'), /* 4 */ + FT_MAKE_TAG('n', 'a', 'm', 'e'), /* 5 */ + FT_MAKE_TAG('O', 'S', '/', '2'), /* 6 */ + FT_MAKE_TAG('p', 'o', 's', 't'), /* 7 */ + FT_MAKE_TAG('c', 'v', 't', ' '), /* 8 */ + FT_MAKE_TAG('f', 'p', 'g', 'm'), /* 9 */ + FT_MAKE_TAG('g', 'l', 'y', 'f'), /* 10 */ + FT_MAKE_TAG('l', 'o', 'c', 'a'), /* 11 */ + FT_MAKE_TAG('p', 'r', 'e', 'p'), /* 12 */ + FT_MAKE_TAG('C', 'F', 'F', ' '), /* 13 */ + FT_MAKE_TAG('V', 'O', 'R', 'G'), /* 14 */ + FT_MAKE_TAG('E', 'B', 'D', 'T'), /* 15 */ + FT_MAKE_TAG('E', 'B', 'L', 'C'), /* 16 */ + FT_MAKE_TAG('g', 'a', 's', 'p'), /* 17 */ + FT_MAKE_TAG('h', 'd', 'm', 'x'), /* 18 */ + FT_MAKE_TAG('k', 'e', 'r', 'n'), /* 19 */ + FT_MAKE_TAG('L', 'T', 'S', 'H'), /* 20 */ + FT_MAKE_TAG('P', 'C', 'L', 'T'), /* 21 */ + FT_MAKE_TAG('V', 'D', 'M', 'X'), /* 22 */ + FT_MAKE_TAG('v', 'h', 'e', 'a'), /* 23 */ + FT_MAKE_TAG('v', 'm', 't', 'x'), /* 24 */ + FT_MAKE_TAG('B', 'A', 'S', 'E'), /* 25 */ + FT_MAKE_TAG('G', 'D', 'E', 'F'), /* 26 */ + FT_MAKE_TAG('G', 'P', 'O', 'S'), /* 27 */ + FT_MAKE_TAG('G', 'S', 'U', 'B'), /* 28 */ + FT_MAKE_TAG('E', 'B', 'S', 'C'), /* 29 */ + FT_MAKE_TAG('J', 'S', 'T', 'F'), /* 30 */ + FT_MAKE_TAG('M', 'A', 'T', 'H'), /* 31 */ + FT_MAKE_TAG('C', 'B', 'D', 'T'), /* 32 */ + FT_MAKE_TAG('C', 'B', 'L', 'C'), /* 33 */ + FT_MAKE_TAG('C', 'O', 'L', 'R'), /* 34 */ + FT_MAKE_TAG('C', 'P', 'A', 'L'), /* 35 */ + FT_MAKE_TAG('S', 'V', 'G', ' '), /* 36 */ + FT_MAKE_TAG('s', 'b', 'i', 'x'), /* 37 */ + FT_MAKE_TAG('a', 'c', 'n', 't'), /* 38 */ + FT_MAKE_TAG('a', 'v', 'a', 'r'), /* 39 */ + FT_MAKE_TAG('b', 'd', 'a', 't'), /* 40 */ + FT_MAKE_TAG('b', 'l', 'o', 'c'), /* 41 */ + FT_MAKE_TAG('b', 's', 'l', 'n'), /* 42 */ + FT_MAKE_TAG('c', 'v', 'a', 'r'), /* 43 */ + FT_MAKE_TAG('f', 'd', 's', 'c'), /* 44 */ + FT_MAKE_TAG('f', 'e', 'a', 't'), /* 45 */ + FT_MAKE_TAG('f', 'm', 't', 'x'), /* 46 */ + FT_MAKE_TAG('f', 'v', 'a', 'r'), /* 47 */ + FT_MAKE_TAG('g', 'v', 'a', 'r'), /* 48 */ + FT_MAKE_TAG('h', 's', 't', 'y'), /* 49 */ + FT_MAKE_TAG('j', 'u', 's', 't'), /* 50 */ + FT_MAKE_TAG('l', 'c', 'a', 'r'), /* 51 */ + FT_MAKE_TAG('m', 'o', 'r', 't'), /* 52 */ + FT_MAKE_TAG('m', 'o', 'r', 'x'), /* 53 */ + FT_MAKE_TAG('o', 'p', 'b', 'd'), /* 54 */ + FT_MAKE_TAG('p', 'r', 'o', 'p'), /* 55 */ + FT_MAKE_TAG('t', 'r', 'a', 'k'), /* 56 */ + FT_MAKE_TAG('Z', 'a', 'p', 'f'), /* 57 */ + FT_MAKE_TAG('S', 'i', 'l', 'f'), /* 58 */ + FT_MAKE_TAG('G', 'l', 'a', 't'), /* 59 */ + FT_MAKE_TAG('G', 'l', 'o', 'c'), /* 60 */ + FT_MAKE_TAG('F', 'e', 'a', 't'), /* 61 */ + FT_MAKE_TAG('S', 'i', 'l', 'l'), /* 62 */ + }; + + + if ( index > 62 ) + return 0; + + return known_tags[index]; + } + + +/* END */ diff --git a/src/3rdparty/freetype/src/sfnt/woff2tags.h b/src/3rdparty/freetype/src/sfnt/woff2tags.h new file mode 100644 index 00000000..c437c77a --- /dev/null +++ b/src/3rdparty/freetype/src/sfnt/woff2tags.h @@ -0,0 +1,39 @@ +/**************************************************************************** + * + * woff2tags.h + * + * WOFFF2 Font table tags (specification). + * + * Copyright (C) 2019-2020 by + * Nikhil Ramakrishnan, David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef WOFF2TAGS_H +#define WOFF2TAGS_H + + +#include +#include + + +FT_BEGIN_HEADER + + + FT_LOCAL( FT_ULong ) + woff2_known_tags( FT_Byte index ); + + +FT_END_HEADER + +#endif /* WOFF2TAGS_H */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/smooth/Jamfile b/src/3rdparty/freetype/src/smooth/Jamfile deleted file mode 100644 index 6ca1cede..00000000 --- a/src/3rdparty/freetype/src/smooth/Jamfile +++ /dev/null @@ -1,32 +0,0 @@ -# FreeType 2 src/smooth Jamfile -# -# Copyright (C) 2001-2019 by -# David Turner, Robert Wilhelm, and Werner Lemberg. -# -# This file is part of the FreeType project, and may only be used, modified, -# and distributed under the terms of the FreeType project license, -# LICENSE.TXT. By continuing to use, modify, or distribute this file you -# indicate that you have read the license and understand and accept it -# fully. - -SubDir FT2_TOP $(FT2_SRC_DIR) smooth ; - -{ - local _sources ; - - if $(FT2_MULTI) - { - _sources = ftgrays - ftsmooth - ftspic - ; - } - else - { - _sources = smooth ; - } - - Library $(FT2_LIB) : $(_sources).c ; -} - -# end of src/smooth Jamfile diff --git a/src/3rdparty/freetype/src/smooth/ftgrays.c b/src/3rdparty/freetype/src/smooth/ftgrays.c index fd357a50..681900fd 100644 --- a/src/3rdparty/freetype/src/smooth/ftgrays.c +++ b/src/3rdparty/freetype/src/smooth/ftgrays.c @@ -4,7 +4,7 @@ * * A new `perfect' anti-aliasing renderer (body). * - * Copyright (C) 2000-2019 by + * Copyright (C) 2000-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -278,12 +278,11 @@ typedef ptrdiff_t FT_PtrDist; #else /* !STANDALONE_ */ -#include #include "ftgrays.h" -#include FT_INTERNAL_OBJECTS_H -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_CALC_H -#include FT_OUTLINE_H +#include +#include +#include +#include #include "ftsmerrs.h" @@ -1649,7 +1648,7 @@ typedef ptrdiff_t FT_PtrDist; if ( !ras.invalid ) gray_record_cell( RAS_VAR ); - FT_TRACE7(( "band [%d..%d]: %d cell%s\n", + FT_TRACE7(( "band [%d..%d]: %ld cell%s\n", ras.min_ey, ras.max_ey, ras.num_cells, diff --git a/src/3rdparty/freetype/src/smooth/ftgrays.h b/src/3rdparty/freetype/src/smooth/ftgrays.h index e9f9c7a4..caba6328 100644 --- a/src/3rdparty/freetype/src/smooth/ftgrays.h +++ b/src/3rdparty/freetype/src/smooth/ftgrays.h @@ -4,7 +4,7 @@ * * FreeType smooth renderer declaration * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -28,7 +28,7 @@ #include "ftimage.h" #else #include -#include FT_IMAGE_H +#include #endif diff --git a/src/3rdparty/freetype/src/smooth/ftsmerrs.h b/src/3rdparty/freetype/src/smooth/ftsmerrs.h index d52c0dd9..e93f3df9 100644 --- a/src/3rdparty/freetype/src/smooth/ftsmerrs.h +++ b/src/3rdparty/freetype/src/smooth/ftsmerrs.h @@ -4,7 +4,7 @@ * * smooth renderer error codes (specification only). * - * Copyright (C) 2001-2019 by + * Copyright (C) 2001-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -26,7 +26,7 @@ #ifndef FTSMERRS_H_ #define FTSMERRS_H_ -#include FT_MODULE_ERRORS_H +#include #undef FTERRORS_H_ @@ -34,7 +34,7 @@ #define FT_ERR_PREFIX Smooth_Err_ #define FT_ERR_BASE FT_Mod_Err_Smooth -#include FT_ERRORS_H +#include #endif /* FTSMERRS_H_ */ diff --git a/src/3rdparty/freetype/src/smooth/ftsmooth.c b/src/3rdparty/freetype/src/smooth/ftsmooth.c index cd034d2b..5d66bd6f 100644 --- a/src/3rdparty/freetype/src/smooth/ftsmooth.c +++ b/src/3rdparty/freetype/src/smooth/ftsmooth.c @@ -4,7 +4,7 @@ * * Anti-aliasing renderer interface (body). * - * Copyright (C) 2000-2019 by + * Copyright (C) 2000-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -16,46 +16,15 @@ */ -#include -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_OBJECTS_H -#include FT_OUTLINE_H +#include +#include +#include #include "ftsmooth.h" #include "ftgrays.h" #include "ftsmerrs.h" - /* initialize renderer -- init its raster */ - static FT_Error - ft_smooth_init( FT_Renderer render ) - { - -#ifndef FT_CONFIG_OPTION_SUBPIXEL_RENDERING - - FT_Vector* sub = render->root.library->lcd_geometry; - - - /* set up default subpixel geometry for striped RGB panels. */ - sub[0].x = -21; - sub[0].y = 0; - sub[1].x = 0; - sub[1].y = 0; - sub[2].x = 21; - sub[2].y = 0; - -#elif 0 /* or else, once ClearType patents expire */ - - FT_Library_SetLcdFilter( render->root.library, FT_LCD_FILTER_DEFAULT ); - -#endif - - render->clazz->raster_class->raster_reset( render->raster, NULL, 0 ); - - return 0; - } - - /* sets render-specific mode */ static FT_Error ft_smooth_set_mode( FT_Renderer render, @@ -107,14 +76,359 @@ FT_Outline_Get_CBox( &slot->outline, cbox ); } + typedef struct TOrigin_ + { + unsigned char* origin; /* pixmap origin at the bottom-left */ + int pitch; /* pitch to go down one row */ - /* convert a slot's glyph image into a bitmap */ + } TOrigin; + +#ifndef FT_CONFIG_OPTION_SUBPIXEL_RENDERING + + /* initialize renderer -- init its raster */ static FT_Error - ft_smooth_render_generic( FT_Renderer render, - FT_GlyphSlot slot, - FT_Render_Mode mode, - const FT_Vector* origin, - FT_Render_Mode required_mode ) + ft_smooth_init( FT_Renderer render ) + { + FT_Vector* sub = render->root.library->lcd_geometry; + + + /* set up default subpixel geometry for striped RGB panels. */ + sub[0].x = -21; + sub[0].y = 0; + sub[1].x = 0; + sub[1].y = 0; + sub[2].x = 21; + sub[2].y = 0; + + render->clazz->raster_class->raster_reset( render->raster, NULL, 0 ); + + return 0; + } + + + /* This function writes every third byte in direct rendering mode */ + static void + ft_smooth_lcd_spans( int y, + int count, + const FT_Span* spans, + TOrigin* target ) + { + unsigned char* dst_line = target->origin - y * target->pitch; + unsigned char* dst; + unsigned short w; + + + for ( ; count--; spans++ ) + for ( dst = dst_line + spans->x * 3, w = spans->len; w--; dst += 3 ) + *dst = spans->coverage; + } + + + static FT_Error + ft_smooth_raster_lcd( FT_Renderer render, + FT_Outline* outline, + FT_Bitmap* bitmap ) + { + FT_Error error = FT_Err_Ok; + FT_Vector* sub = render->root.library->lcd_geometry; + FT_Pos x, y; + + FT_Raster_Params params; + TOrigin target; + + + /* Render 3 separate coverage bitmaps, shifting the outline. */ + /* Set up direct rendering to record them on each third byte. */ + params.source = outline; + params.flags = FT_RASTER_FLAG_AA | FT_RASTER_FLAG_DIRECT; + params.gray_spans = (FT_SpanFunc)ft_smooth_lcd_spans; + params.user = ⌖ + + params.clip_box.xMin = 0; + params.clip_box.yMin = 0; + params.clip_box.xMax = bitmap->width; + params.clip_box.yMax = bitmap->rows; + + if ( bitmap->pitch < 0 ) + target.origin = bitmap->buffer; + else + target.origin = bitmap->buffer + + ( bitmap->rows - 1 ) * (unsigned int)bitmap->pitch; + + target.pitch = bitmap->pitch; + + FT_Outline_Translate( outline, + -sub[0].x, + -sub[0].y ); + error = render->raster_render( render->raster, ¶ms ); + x = sub[0].x; + y = sub[0].y; + if ( error ) + goto Exit; + + target.origin++; + FT_Outline_Translate( outline, + sub[0].x - sub[1].x, + sub[0].y - sub[1].y ); + error = render->raster_render( render->raster, ¶ms ); + x = sub[1].x; + y = sub[1].y; + if ( error ) + goto Exit; + + target.origin++; + FT_Outline_Translate( outline, + sub[1].x - sub[2].x, + sub[1].y - sub[2].y ); + error = render->raster_render( render->raster, ¶ms ); + x = sub[2].x; + y = sub[2].y; + + Exit: + FT_Outline_Translate( outline, x, y ); + + return error; + } + + + static FT_Error + ft_smooth_raster_lcdv( FT_Renderer render, + FT_Outline* outline, + FT_Bitmap* bitmap ) + { + FT_Error error = FT_Err_Ok; + int pitch = bitmap->pitch; + FT_Vector* sub = render->root.library->lcd_geometry; + FT_Pos x, y; + + FT_Raster_Params params; + + + params.target = bitmap; + params.source = outline; + params.flags = FT_RASTER_FLAG_AA; + + /* Render 3 separate coverage bitmaps, shifting the outline. */ + /* Notice that the subpixel geometry vectors are rotated. */ + /* Triple the pitch to render on each third row. */ + bitmap->pitch *= 3; + bitmap->rows /= 3; + + FT_Outline_Translate( outline, + -sub[0].y, + sub[0].x ); + error = render->raster_render( render->raster, ¶ms ); + x = sub[0].y; + y = -sub[0].x; + if ( error ) + goto Exit; + + bitmap->buffer += pitch; + FT_Outline_Translate( outline, + sub[0].y - sub[1].y, + sub[1].x - sub[0].x ); + error = render->raster_render( render->raster, ¶ms ); + x = sub[1].y; + y = -sub[1].x; + bitmap->buffer -= pitch; + if ( error ) + goto Exit; + + bitmap->buffer += 2 * pitch; + FT_Outline_Translate( outline, + sub[1].y - sub[2].y, + sub[2].x - sub[1].x ); + error = render->raster_render( render->raster, ¶ms ); + x = sub[2].y; + y = -sub[2].x; + bitmap->buffer -= 2 * pitch; + + Exit: + FT_Outline_Translate( outline, x, y ); + + bitmap->pitch /= 3; + bitmap->rows *= 3; + + return error; + } + +#else /* FT_CONFIG_OPTION_SUBPIXEL_RENDERING */ + + /* initialize renderer -- init its raster */ + static FT_Error + ft_smooth_init( FT_Renderer render ) + { + /* set up default LCD filtering */ + FT_Library_SetLcdFilter( render->root.library, FT_LCD_FILTER_DEFAULT ); + + render->clazz->raster_class->raster_reset( render->raster, NULL, 0 ); + + return 0; + } + + + static FT_Error + ft_smooth_raster_lcd( FT_Renderer render, + FT_Outline* outline, + FT_Bitmap* bitmap ) + { + FT_Error error = FT_Err_Ok; + FT_Vector* points = outline->points; + FT_Vector* points_end = FT_OFFSET( points, outline->n_points ); + FT_Vector* vec; + + FT_Raster_Params params; + + + params.target = bitmap; + params.source = outline; + params.flags = FT_RASTER_FLAG_AA; + + /* implode outline */ + for ( vec = points; vec < points_end; vec++ ) + vec->x *= 3; + + /* render outline into the bitmap */ + error = render->raster_render( render->raster, ¶ms ); + + /* deflate outline */ + for ( vec = points; vec < points_end; vec++ ) + vec->x /= 3; + + return error; + } + + + static FT_Error + ft_smooth_raster_lcdv( FT_Renderer render, + FT_Outline* outline, + FT_Bitmap* bitmap ) + { + FT_Error error = FT_Err_Ok; + FT_Vector* points = outline->points; + FT_Vector* points_end = FT_OFFSET( points, outline->n_points ); + FT_Vector* vec; + + FT_Raster_Params params; + + + params.target = bitmap; + params.source = outline; + params.flags = FT_RASTER_FLAG_AA; + + /* implode outline */ + for ( vec = points; vec < points_end; vec++ ) + vec->y *= 3; + + /* render outline into the bitmap */ + error = render->raster_render( render->raster, ¶ms ); + + /* deflate outline */ + for ( vec = points; vec < points_end; vec++ ) + vec->y /= 3; + + return error; + } + +#endif /* FT_CONFIG_OPTION_SUBPIXEL_RENDERING */ + +/* Oversampling scale to be used in rendering overlaps */ +#define SCALE ( 1 << 2 ) + + /* This function averages inflated spans in direct rendering mode */ + static void + ft_smooth_overlap_spans( int y, + int count, + const FT_Span* spans, + TOrigin* target ) + { + unsigned char* dst = target->origin - ( y / SCALE ) * target->pitch; + unsigned short x; + unsigned int cover, sum; + + + /* When accumulating the oversampled spans we need to assure that */ + /* fully covered pixels are equal to 255 and do not overflow. */ + /* It is important that the SCALE is a power of 2, each subpixel */ + /* cover can also reach a power of 2 after rounding, and the total */ + /* is clamped to 255 when it adds up to 256. */ + for ( ; count--; spans++ ) + { + cover = ( spans->coverage + SCALE * SCALE / 2 ) / ( SCALE * SCALE ); + for ( x = 0; x < spans->len; x++ ) + { + sum = dst[( spans->x + x ) / SCALE] + cover; + dst[( spans->x + x ) / SCALE] = (unsigned char)( sum - ( sum >> 8 ) ); + } + } + } + + + static FT_Error + ft_smooth_raster_overlap( FT_Renderer render, + FT_Outline* outline, + FT_Bitmap* bitmap ) + { + FT_Error error = FT_Err_Ok; + FT_Vector* points = outline->points; + FT_Vector* points_end = FT_OFFSET( points, outline->n_points ); + FT_Vector* vec; + + FT_Raster_Params params; + TOrigin target; + + + /* Reject outlines that are too wide for 16-bit FT_Span. */ + /* Other limits are applied upstream with the same error code. */ + if ( bitmap->width * SCALE > 0x7FFF ) + return FT_THROW( Raster_Overflow ); + + /* Set up direct rendering to average oversampled spans. */ + params.source = outline; + params.flags = FT_RASTER_FLAG_AA | FT_RASTER_FLAG_DIRECT; + params.gray_spans = (FT_SpanFunc)ft_smooth_overlap_spans; + params.user = ⌖ + + params.clip_box.xMin = 0; + params.clip_box.yMin = 0; + params.clip_box.xMax = bitmap->width * SCALE; + params.clip_box.yMax = bitmap->rows * SCALE; + + if ( bitmap->pitch < 0 ) + target.origin = bitmap->buffer; + else + target.origin = bitmap->buffer + + ( bitmap->rows - 1 ) * (unsigned int)bitmap->pitch; + + target.pitch = bitmap->pitch; + + /* inflate outline */ + for ( vec = points; vec < points_end; vec++ ) + { + vec->x *= SCALE; + vec->y *= SCALE; + } + + /* render outline into the bitmap */ + error = render->raster_render( render->raster, ¶ms ); + + /* deflate outline */ + for ( vec = points; vec < points_end; vec++ ) + { + vec->x /= SCALE; + vec->y /= SCALE; + } + + return error; + } + +#undef SCALE + + static FT_Error + ft_smooth_render( FT_Renderer render, + FT_GlyphSlot slot, + FT_Render_Mode mode, + const FT_Vector* origin ) { FT_Error error = FT_Err_Ok; FT_Outline* outline = &slot->outline; @@ -122,10 +436,6 @@ FT_Memory memory = render->root.memory; FT_Pos x_shift = 0; FT_Pos y_shift = 0; - FT_Int hmul = ( mode == FT_RENDER_MODE_LCD ); - FT_Int vmul = ( mode == FT_RENDER_MODE_LCD_V ); - - FT_Raster_Params params; /* check glyph image format */ @@ -136,7 +446,10 @@ } /* check mode */ - if ( mode != required_mode ) + if ( mode != FT_RENDER_MODE_NORMAL && + mode != FT_RENDER_MODE_LIGHT && + mode != FT_RENDER_MODE_LCD && + mode != FT_RENDER_MODE_LCD_V ) { error = FT_THROW( Cannot_Render_Glyph ); goto Exit; @@ -155,6 +468,9 @@ goto Exit; } + if ( !bitmap->rows || !bitmap->pitch ) + goto Exit; + /* allocate new one */ if ( FT_ALLOC_MULT( bitmap->buffer, bitmap->rows, bitmap->pitch ) ) goto Exit; @@ -178,188 +494,57 @@ if ( x_shift || y_shift ) FT_Outline_Translate( outline, x_shift, y_shift ); - /* set up parameters */ - params.target = bitmap; - params.source = outline; - params.flags = FT_RASTER_FLAG_AA; + if ( mode == FT_RENDER_MODE_NORMAL || + mode == FT_RENDER_MODE_LIGHT ) + { + if ( outline->flags & FT_OUTLINE_OVERLAP ) + error = ft_smooth_raster_overlap( render, outline, bitmap ); + else + { + FT_Raster_Params params; + + + params.target = bitmap; + params.source = outline; + params.flags = FT_RASTER_FLAG_AA; + + error = render->raster_render( render->raster, ¶ms ); + } + } + else + { + if ( mode == FT_RENDER_MODE_LCD ) + error = ft_smooth_raster_lcd ( render, outline, bitmap ); + else if ( mode == FT_RENDER_MODE_LCD_V ) + error = ft_smooth_raster_lcdv( render, outline, bitmap ); #ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING - /* implode outline if needed */ - { - FT_Vector* points = outline->points; - FT_Vector* points_end = points + outline->n_points; - FT_Vector* vec; - - - if ( hmul ) - for ( vec = points; vec < points_end; vec++ ) - vec->x *= 3; - - if ( vmul ) - for ( vec = points; vec < points_end; vec++ ) - vec->y *= 3; - } - - /* render outline into the bitmap */ - error = render->raster_render( render->raster, ¶ms ); - - /* deflate outline if needed */ - { - FT_Vector* points = outline->points; - FT_Vector* points_end = points + outline->n_points; - FT_Vector* vec; - - - if ( hmul ) - for ( vec = points; vec < points_end; vec++ ) - vec->x /= 3; - - if ( vmul ) - for ( vec = points; vec < points_end; vec++ ) - vec->y /= 3; - } - - if ( error ) - goto Exit; - - /* finally apply filtering */ - if ( hmul || vmul ) - { - FT_Byte* lcd_weights; - FT_Bitmap_LcdFilterFunc lcd_filter_func; - - - /* Per-face LCD filtering takes priority if set up. */ - if ( slot->face && slot->face->internal->lcd_filter_func ) + /* finally apply filtering */ { - lcd_weights = slot->face->internal->lcd_weights; - lcd_filter_func = slot->face->internal->lcd_filter_func; - } - else - { - lcd_weights = slot->library->lcd_weights; - lcd_filter_func = slot->library->lcd_filter_func; - } - - if ( lcd_filter_func ) - lcd_filter_func( bitmap, lcd_weights ); - } - -#else /* !FT_CONFIG_OPTION_SUBPIXEL_RENDERING */ - - if ( hmul ) /* lcd */ - { - FT_Byte* line; - FT_Byte* temp = NULL; - FT_UInt i, j; - - unsigned int height = bitmap->rows; - unsigned int width = bitmap->width; - int pitch = bitmap->pitch; - - FT_Vector* sub = slot->library->lcd_geometry; + FT_Byte* lcd_weights; + FT_Bitmap_LcdFilterFunc lcd_filter_func; - /* Render 3 separate monochrome bitmaps, shifting the outline. */ - width /= 3; - - FT_Outline_Translate( outline, - -sub[0].x, - -sub[0].y ); - error = render->raster_render( render->raster, ¶ms ); - if ( error ) - goto Exit; - - bitmap->buffer += width; - FT_Outline_Translate( outline, - sub[0].x - sub[1].x, - sub[0].y - sub[1].y ); - error = render->raster_render( render->raster, ¶ms ); - bitmap->buffer -= width; - if ( error ) - goto Exit; - - bitmap->buffer += 2 * width; - FT_Outline_Translate( outline, - sub[1].x - sub[2].x, - sub[1].y - sub[2].y ); - error = render->raster_render( render->raster, ¶ms ); - bitmap->buffer -= 2 * width; - if ( error ) - goto Exit; - - x_shift -= sub[2].x; - y_shift -= sub[2].y; - - /* XXX: Rearrange the bytes according to FT_PIXEL_MODE_LCD. */ - /* XXX: It is more efficient to render every third byte above. */ - - if ( FT_ALLOC( temp, (FT_ULong)pitch ) ) - goto Exit; - - for ( i = 0; i < height; i++ ) - { - line = bitmap->buffer + i * (FT_ULong)pitch; - for ( j = 0; j < width; j++ ) + /* Per-face LCD filtering takes priority if set up. */ + if ( slot->face && slot->face->internal->lcd_filter_func ) { - temp[3 * j ] = line[j]; - temp[3 * j + 1] = line[j + width]; - temp[3 * j + 2] = line[j + width + width]; + lcd_weights = slot->face->internal->lcd_weights; + lcd_filter_func = slot->face->internal->lcd_filter_func; } - FT_MEM_COPY( line, temp, pitch ); + else + { + lcd_weights = slot->library->lcd_weights; + lcd_filter_func = slot->library->lcd_filter_func; + } + + if ( lcd_filter_func ) + lcd_filter_func( bitmap, lcd_weights ); } - FT_FREE( temp ); +#endif /* FT_CONFIG_OPTION_SUBPIXEL_RENDERING */ + } - else if ( vmul ) /* lcd_v */ - { - int pitch = bitmap->pitch; - - FT_Vector* sub = slot->library->lcd_geometry; - - - /* Render 3 separate monochrome bitmaps, shifting the outline. */ - /* Notice that the subpixel geometry vectors are rotated. */ - /* Triple the pitch to render on each third row. */ - bitmap->pitch *= 3; - bitmap->rows /= 3; - - FT_Outline_Translate( outline, - -sub[0].y, - sub[0].x ); - error = render->raster_render( render->raster, ¶ms ); - if ( error ) - goto Exit; - - bitmap->buffer += pitch; - FT_Outline_Translate( outline, - sub[0].y - sub[1].y, - sub[1].x - sub[0].x ); - error = render->raster_render( render->raster, ¶ms ); - bitmap->buffer -= pitch; - if ( error ) - goto Exit; - - bitmap->buffer += 2 * pitch; - FT_Outline_Translate( outline, - sub[1].y - sub[2].y, - sub[2].x - sub[1].x ); - error = render->raster_render( render->raster, ¶ms ); - bitmap->buffer -= 2 * pitch; - if ( error ) - goto Exit; - - x_shift -= sub[2].y; - y_shift += sub[2].x; - - bitmap->pitch /= 3; - bitmap->rows *= 3; - } - else /* grayscale */ - error = render->raster_render( render->raster, ¶ms ); - -#endif /* !FT_CONFIG_OPTION_SUBPIXEL_RENDERING */ Exit: if ( !error ) @@ -380,45 +565,6 @@ } - /* convert a slot's glyph image into a bitmap */ - static FT_Error - ft_smooth_render( FT_Renderer render, - FT_GlyphSlot slot, - FT_Render_Mode mode, - const FT_Vector* origin ) - { - if ( mode == FT_RENDER_MODE_LIGHT ) - mode = FT_RENDER_MODE_NORMAL; - - return ft_smooth_render_generic( render, slot, mode, origin, - FT_RENDER_MODE_NORMAL ); - } - - - /* convert a slot's glyph image into a horizontal LCD bitmap */ - static FT_Error - ft_smooth_render_lcd( FT_Renderer render, - FT_GlyphSlot slot, - FT_Render_Mode mode, - const FT_Vector* origin ) - { - return ft_smooth_render_generic( render, slot, mode, origin, - FT_RENDER_MODE_LCD ); - } - - - /* convert a slot's glyph image into a vertical LCD bitmap */ - static FT_Error - ft_smooth_render_lcd_v( FT_Renderer render, - FT_GlyphSlot slot, - FT_Render_Mode mode, - const FT_Vector* origin ) - { - return ft_smooth_render_generic( render, slot, mode, origin, - FT_RENDER_MODE_LCD_V ); - } - - FT_DEFINE_RENDERER( ft_smooth_renderer_class, @@ -446,58 +592,4 @@ ) - FT_DEFINE_RENDERER( - ft_smooth_lcd_renderer_class, - - FT_MODULE_RENDERER, - sizeof ( FT_RendererRec ), - - "smooth-lcd", - 0x10000L, - 0x20000L, - - NULL, /* module specific interface */ - - (FT_Module_Constructor)ft_smooth_init, /* module_init */ - (FT_Module_Destructor) NULL, /* module_done */ - (FT_Module_Requester) NULL, /* get_interface */ - - FT_GLYPH_FORMAT_OUTLINE, - - (FT_Renderer_RenderFunc) ft_smooth_render_lcd, /* render_glyph */ - (FT_Renderer_TransformFunc)ft_smooth_transform, /* transform_glyph */ - (FT_Renderer_GetCBoxFunc) ft_smooth_get_cbox, /* get_glyph_cbox */ - (FT_Renderer_SetModeFunc) ft_smooth_set_mode, /* set_mode */ - - (FT_Raster_Funcs*)&ft_grays_raster /* raster_class */ - ) - - - FT_DEFINE_RENDERER( - ft_smooth_lcdv_renderer_class, - - FT_MODULE_RENDERER, - sizeof ( FT_RendererRec ), - - "smooth-lcdv", - 0x10000L, - 0x20000L, - - NULL, /* module specific interface */ - - (FT_Module_Constructor)ft_smooth_init, /* module_init */ - (FT_Module_Destructor) NULL, /* module_done */ - (FT_Module_Requester) NULL, /* get_interface */ - - FT_GLYPH_FORMAT_OUTLINE, - - (FT_Renderer_RenderFunc) ft_smooth_render_lcd_v, /* render_glyph */ - (FT_Renderer_TransformFunc)ft_smooth_transform, /* transform_glyph */ - (FT_Renderer_GetCBoxFunc) ft_smooth_get_cbox, /* get_glyph_cbox */ - (FT_Renderer_SetModeFunc) ft_smooth_set_mode, /* set_mode */ - - (FT_Raster_Funcs*)&ft_grays_raster /* raster_class */ - ) - - /* END */ diff --git a/src/3rdparty/freetype/src/smooth/ftsmooth.h b/src/3rdparty/freetype/src/smooth/ftsmooth.h index fbb21a31..22a88d54 100644 --- a/src/3rdparty/freetype/src/smooth/ftsmooth.h +++ b/src/3rdparty/freetype/src/smooth/ftsmooth.h @@ -4,7 +4,7 @@ * * Anti-aliasing renderer interface (specification). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -20,8 +20,7 @@ #define FTSMOOTH_H_ -#include -#include FT_RENDER_H +#include FT_BEGIN_HEADER @@ -29,10 +28,6 @@ FT_BEGIN_HEADER FT_DECLARE_RENDERER( ft_smooth_renderer_class ) - FT_DECLARE_RENDERER( ft_smooth_lcd_renderer_class ) - - FT_DECLARE_RENDERER( ft_smooth_lcdv_renderer_class ) - FT_END_HEADER diff --git a/src/3rdparty/freetype/src/smooth/ftspic.c b/src/3rdparty/freetype/src/smooth/ftspic.c deleted file mode 100644 index 10f04cf4..00000000 --- a/src/3rdparty/freetype/src/smooth/ftspic.c +++ /dev/null @@ -1,118 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftspic.c */ -/* */ -/* The FreeType position independent code services for smooth module. */ -/* */ -/* Copyright 2009-2018 by */ -/* Oran Agra and Mickey Gabel. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#include -#include FT_FREETYPE_H -#include FT_INTERNAL_OBJECTS_H -#include "ftspic.h" -#include "ftsmerrs.h" - - -#ifdef FT_CONFIG_OPTION_PIC - - /* forward declaration of PIC init functions from ftgrays.c */ - void - FT_Init_Class_ft_grays_raster( FT_Raster_Funcs* funcs ); - - - void - ft_smooth_renderer_class_pic_free( FT_Library library ) - { - FT_PIC_Container* pic_container = &library->pic_container; - FT_Memory memory = library->memory; - - - if ( pic_container->smooth ) - { - SmoothPIC* container = (SmoothPIC*)pic_container->smooth; - - - if ( --container->ref_count ) - return; - - FT_FREE( container ); - pic_container->smooth = NULL; - } - } - - - FT_Error - ft_smooth_renderer_class_pic_init( FT_Library library ) - { - FT_PIC_Container* pic_container = &library->pic_container; - FT_Error error = FT_Err_Ok; - SmoothPIC* container = NULL; - FT_Memory memory = library->memory; - - - /* since this function also serve smooth_lcd and smooth_lcdv renderers, - it implements reference counting */ - if ( pic_container->smooth ) - { - ((SmoothPIC*)pic_container->smooth)->ref_count++; - return error; - } - - /* allocate pointer, clear and set global container pointer */ - if ( FT_ALLOC( container, sizeof ( *container ) ) ) - return error; - FT_MEM_SET( container, 0, sizeof ( *container ) ); - pic_container->smooth = container; - - container->ref_count = 1; - - /* initialize pointer table - */ - /* this is how the module usually expects this data */ - FT_Init_Class_ft_grays_raster( &container->ft_grays_raster ); - - return error; - } - - - /* re-route these init and free functions to the above functions */ - FT_Error - ft_smooth_lcd_renderer_class_pic_init( FT_Library library ) - { - return ft_smooth_renderer_class_pic_init( library ); - } - - - void - ft_smooth_lcd_renderer_class_pic_free( FT_Library library ) - { - ft_smooth_renderer_class_pic_free( library ); - } - - - FT_Error - ft_smooth_lcdv_renderer_class_pic_init( FT_Library library ) - { - return ft_smooth_renderer_class_pic_init( library ); - } - - - void - ft_smooth_lcdv_renderer_class_pic_free( FT_Library library ) - { - ft_smooth_renderer_class_pic_free( library ); - } - -#endif /* FT_CONFIG_OPTION_PIC */ - - -/* END */ diff --git a/src/3rdparty/freetype/src/smooth/ftspic.h b/src/3rdparty/freetype/src/smooth/ftspic.h deleted file mode 100644 index 80fb64cf..00000000 --- a/src/3rdparty/freetype/src/smooth/ftspic.h +++ /dev/null @@ -1,75 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftspic.h */ -/* */ -/* The FreeType position independent code services for smooth module. */ -/* */ -/* Copyright 2009-2018 by */ -/* Oran Agra and Mickey Gabel. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef FTSPIC_H_ -#define FTSPIC_H_ - - -#include FT_INTERNAL_PIC_H - - -FT_BEGIN_HEADER - -#ifndef FT_CONFIG_OPTION_PIC - -#define FT_GRAYS_RASTER_GET ft_grays_raster - -#else /* FT_CONFIG_OPTION_PIC */ - - typedef struct SmoothPIC_ - { - int ref_count; - FT_Raster_Funcs ft_grays_raster; - - } SmoothPIC; - - -#define GET_PIC( lib ) \ - ( (SmoothPIC*)( (lib)->pic_container.smooth ) ) -#define FT_GRAYS_RASTER_GET ( GET_PIC( library )->ft_grays_raster ) - - - /* see ftspic.c for the implementation */ - void - ft_smooth_renderer_class_pic_free( FT_Library library ); - - void - ft_smooth_lcd_renderer_class_pic_free( FT_Library library ); - - void - ft_smooth_lcdv_renderer_class_pic_free( FT_Library library ); - - FT_Error - ft_smooth_renderer_class_pic_init( FT_Library library ); - - FT_Error - ft_smooth_lcd_renderer_class_pic_init( FT_Library library ); - - FT_Error - ft_smooth_lcdv_renderer_class_pic_init( FT_Library library ); - -#endif /* FT_CONFIG_OPTION_PIC */ - - /* */ - -FT_END_HEADER - -#endif /* FTSPIC_H_ */ - - -/* END */ diff --git a/src/3rdparty/freetype/src/smooth/module.mk b/src/3rdparty/freetype/src/smooth/module.mk index 44b76dfe..9b1507f1 100644 --- a/src/3rdparty/freetype/src/smooth/module.mk +++ b/src/3rdparty/freetype/src/smooth/module.mk @@ -3,7 +3,7 @@ # -# Copyright (C) 1996-2019 by +# Copyright (C) 1996-2020 by # David Turner, Robert Wilhelm, and Werner Lemberg. # # This file is part of the FreeType project, and may only be used, modified, @@ -18,10 +18,6 @@ FTMODULE_H_COMMANDS += SMOOTH_RENDERER define SMOOTH_RENDERER $(OPEN_DRIVER) FT_Renderer_Class, ft_smooth_renderer_class $(CLOSE_DRIVER) $(ECHO_DRIVER)smooth $(ECHO_DRIVER_DESC)anti-aliased bitmap renderer$(ECHO_DRIVER_DONE) -$(OPEN_DRIVER) FT_Renderer_Class, ft_smooth_lcd_renderer_class $(CLOSE_DRIVER) -$(ECHO_DRIVER)smooth $(ECHO_DRIVER_DESC)anti-aliased bitmap renderer for LCDs$(ECHO_DRIVER_DONE) -$(OPEN_DRIVER) FT_Renderer_Class, ft_smooth_lcdv_renderer_class $(CLOSE_DRIVER) -$(ECHO_DRIVER)smooth $(ECHO_DRIVER_DESC)anti-aliased bitmap renderer for vertical LCDs$(ECHO_DRIVER_DONE) endef # EOF diff --git a/src/3rdparty/freetype/src/smooth/rules.mk b/src/3rdparty/freetype/src/smooth/rules.mk index 0153ac24..b08056fa 100644 --- a/src/3rdparty/freetype/src/smooth/rules.mk +++ b/src/3rdparty/freetype/src/smooth/rules.mk @@ -3,7 +3,7 @@ # -# Copyright (C) 1996-2019 by +# Copyright (C) 1996-2020 by # David Turner, Robert Wilhelm, and Werner Lemberg. # # This file is part of the FreeType project, and may only be used, modified, diff --git a/src/3rdparty/freetype/src/smooth/smooth.c b/src/3rdparty/freetype/src/smooth/smooth.c index 9c543d33..04b531c0 100644 --- a/src/3rdparty/freetype/src/smooth/smooth.c +++ b/src/3rdparty/freetype/src/smooth/smooth.c @@ -4,7 +4,7 @@ * * FreeType anti-aliasing rasterer module component (body only). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -17,7 +17,6 @@ #define FT_MAKE_OPTION_SINGLE_OBJECT -#include #include "ftgrays.c" #include "ftsmooth.c" diff --git a/src/3rdparty/freetype/src/tools/Jamfile b/src/3rdparty/freetype/src/tools/Jamfile deleted file mode 100644 index 475161e0..00000000 --- a/src/3rdparty/freetype/src/tools/Jamfile +++ /dev/null @@ -1,5 +0,0 @@ -# Jamfile for src/tools -# -SubDir FT2_TOP src tools ; - -Main apinames : apinames.c ; diff --git a/src/3rdparty/freetype/src/tools/afblue.pl b/src/3rdparty/freetype/src/tools/afblue.pl index 937d4ecf..bbc4f472 100644 --- a/src/3rdparty/freetype/src/tools/afblue.pl +++ b/src/3rdparty/freetype/src/tools/afblue.pl @@ -5,7 +5,7 @@ # # Process a blue zone character data file. # -# Copyright (C) 2013-2019 by +# Copyright (C) 2013-2020 by # David Turner, Robert Wilhelm, and Werner Lemberg. # # This file is part of the FreeType project, and may only be used, diff --git a/src/3rdparty/freetype/src/tools/chktrcmp.py b/src/3rdparty/freetype/src/tools/chktrcmp.py old mode 100644 new mode 100755 diff --git a/src/3rdparty/freetype/src/tools/docmaker/content.py b/src/3rdparty/freetype/src/tools/docmaker/content.py deleted file mode 100644 index 198780ae..00000000 --- a/src/3rdparty/freetype/src/tools/docmaker/content.py +++ /dev/null @@ -1,672 +0,0 @@ -# -# content.py -# -# Parse comment blocks to build content blocks (library file). -# -# Copyright 2002-2018 by -# David Turner. -# -# This file is part of the FreeType project, and may only be used, -# modified, and distributed under the terms of the FreeType project -# license, LICENSE.TXT. By continuing to use, modify, or distribute -# this file you indicate that you have read the license and -# understand and accept it fully. - -# -# This file contains routines to parse documentation comment blocks, -# building more structured objects out of them. -# - - -from sources import * -from utils import * - -import string, re - - -# -# Regular expressions to detect code sequences. `Code sequences' are simply -# code fragments embedded in '{' and '}', as demonstrated in the following -# example. -# -# { -# x = y + z; -# if ( zookoo == 2 ) -# { -# foobar(); -# } -# } -# -# Note that the indentation of the first opening brace and the last closing -# brace must be exactly the same. The code sequence itself should have a -# larger indentation than the surrounding braces. -# -re_code_start = re.compile( r"(\s*){\s*$" ) -re_code_end = re.compile( r"(\s*)}\s*$" ) - - -# -# A regular expression to isolate identifiers from other text. Two syntax -# forms are supported: -# -# -# [] -# -# where both `' and `' consist of alphanumeric characters, `_', -# and `-'. Use `' if there are multiple, valid `' entries; in the -# index, `' will be appended in parentheses. -# -# For example, -# -# stem_darkening[autofit] -# -# becomes `stem_darkening (autofit)' in the index. -# -re_identifier = re.compile( r""" - ((?:\w|-)+ - (?:\[(?:\w|-)+\])?) - """, re.VERBOSE ) - - -# -# We collect macro names ending in `_H' (group 1), as defined in -# `freetype/config/ftheader.h'. While outputting the object data, we use -# this info together with the object's file location (group 2) to emit the -# appropriate header file macro and its associated file name before the -# object itself. -# -# Example: -# -# #define FT_FREETYPE_H -# -re_header_macro = re.compile( r'^#define\s{1,}(\w{1,}_H)\s{1,}<(.*)>' ) - - -################################################################ -## -## DOC CODE CLASS -## -## The `DocCode' class is used to store source code lines. -## -## `self.lines' contains a set of source code lines that will be dumped as -## HTML in a
 tag.
-##
-##  The object is filled line by line by the parser; it strips the leading
-##  `margin' space from each input line before storing it in `self.lines'.
-##
-class  DocCode:
-
-    def  __init__( self, margin, lines ):
-        self.lines = []
-        self.words = None
-
-        # remove margin spaces
-        for l in lines:
-            if string.strip( l[:margin] ) == "":
-                l = l[margin:]
-            self.lines.append( l )
-
-    def  dump( self, prefix = "", width = 60 ):
-        lines = self.dump_lines( 0, width )
-        for l in lines:
-            print( prefix + l )
-
-    def  dump_lines( self, margin = 0, width = 60 ):
-        result = []
-        for l in self.lines:
-            result.append( " " * margin + l )
-        return result
-
-
-
-################################################################
-##
-##  DOC PARA CLASS
-##
-##  `Normal' text paragraphs are stored in the `DocPara' class.
-##
-##  `self.words' contains the list of words that make up the paragraph.
-##
-class  DocPara:
-
-    def  __init__( self, lines ):
-        self.lines = None
-        self.words = []
-        for l in lines:
-            l = string.strip( l )
-            self.words.extend( string.split( l ) )
-
-    def  dump( self, prefix = "", width = 60 ):
-        lines = self.dump_lines( 0, width )
-        for l in lines:
-            print( prefix + l )
-
-    def  dump_lines( self, margin = 0, width = 60 ):
-        cur    = ""  # current line
-        col    = 0   # current width
-        result = []
-
-        for word in self.words:
-            ln = len( word )
-            if col > 0:
-                ln = ln + 1
-
-            if col + ln > width:
-                result.append( " " * margin + cur )
-                cur = word
-                col = len( word )
-            else:
-                if col > 0:
-                    cur = cur + " "
-                cur = cur + word
-                col = col + ln
-
-        if col > 0:
-            result.append( " " * margin + cur )
-
-        return result
-
-
-################################################################
-##
-##  DOC FIELD CLASS
-##
-##  The `DocField' class stores a list containing either `DocPara' or
-##  `DocCode' objects.  Each DocField object also has an optional `name'
-##  that is used when the object corresponds to a field or value definition.
-##
-class  DocField:
-
-    def  __init__( self, name, lines ):
-        self.name  = name  # can be `None' for normal paragraphs/sources
-        self.items = []    # list of items
-
-        mode_none  = 0     # start parsing mode
-        mode_code  = 1     # parsing code sequences
-        mode_para  = 3     # parsing normal paragraph
-
-        margin     = -1    # current code sequence indentation
-        cur_lines  = []
-
-        # analyze the markup lines to check whether they contain paragraphs,
-        # code sequences, or fields definitions
-        #
-        start = 0
-        mode  = mode_none
-
-        for l in lines:
-            # are we parsing a code sequence?
-            if mode == mode_code:
-                m = re_code_end.match( l )
-                if m and len( m.group( 1 ) ) <= margin:
-                    # that's it, we finished the code sequence
-                    code = DocCode( 0, cur_lines )
-                    self.items.append( code )
-                    margin    = -1
-                    cur_lines = []
-                    mode      = mode_none
-                else:
-                    # otherwise continue the code sequence
-                    cur_lines.append( l[margin:] )
-            else:
-                # start of code sequence?
-                m = re_code_start.match( l )
-                if m:
-                    # save current lines
-                    if cur_lines:
-                        para = DocPara( cur_lines )
-                        self.items.append( para )
-                        cur_lines = []
-
-                    # switch to code extraction mode
-                    margin = len( m.group( 1 ) )
-                    mode   = mode_code
-                else:
-                    if not string.split( l ) and cur_lines:
-                        # if the line is empty, we end the current paragraph,
-                        # if any
-                        para = DocPara( cur_lines )
-                        self.items.append( para )
-                        cur_lines = []
-                    else:
-                        # otherwise, simply add the line to the current
-                        # paragraph
-                        cur_lines.append( l )
-
-        if mode == mode_code:
-            # unexpected end of code sequence
-            code = DocCode( margin, cur_lines )
-            self.items.append( code )
-        elif cur_lines:
-            para = DocPara( cur_lines )
-            self.items.append( para )
-
-    def  dump( self, prefix = "" ):
-        if self.field:
-            print( prefix + self.field + " ::" )
-            prefix = prefix + "----"
-
-        first = 1
-        for p in self.items:
-            if not first:
-                print( "" )
-            p.dump( prefix )
-            first = 0
-
-    def  dump_lines( self, margin = 0, width = 60 ):
-        result = []
-        nl     = None
-
-        for p in self.items:
-            if nl:
-                result.append( "" )
-
-            result.extend( p.dump_lines( margin, width ) )
-            nl = 1
-
-        return result
-
-
-#
-# A regular expression to detect field definitions.
-#
-# Examples:
-#
-#   foo     ::
-#   foo.bar ::
-#
-re_field = re.compile( r"""
-                         \s*
-                           (
-                             \w*
-                           |
-                             \w (\w | \.)* \w
-                           )
-                         \s* ::
-                       """, re.VERBOSE )
-
-
-################################################################
-##
-##  DOC MARKUP CLASS
-##
-class  DocMarkup:
-
-    def  __init__( self, tag, lines ):
-        self.tag    = string.lower( tag )
-        self.fields = []
-
-        cur_lines = []
-        field     = None
-        mode      = 0
-
-        for l in lines:
-            m = re_field.match( l )
-            if m:
-                # We detected the start of a new field definition.
-
-                # first, save the current one
-                if cur_lines:
-                    f = DocField( field, cur_lines )
-                    self.fields.append( f )
-                    cur_lines = []
-                    field     = None
-
-                field     = m.group( 1 )   # record field name
-                ln        = len( m.group( 0 ) )
-                l         = " " * ln + l[ln:]
-                cur_lines = [l]
-            else:
-                cur_lines.append( l )
-
-        if field or cur_lines:
-            f = DocField( field, cur_lines )
-            self.fields.append( f )
-
-    def  get_name( self ):
-        try:
-            return self.fields[0].items[0].words[0]
-        except:
-            return None
-
-    def  dump( self, margin ):
-        print( " " * margin + "<" + self.tag + ">" )
-        for f in self.fields:
-            f.dump( "  " )
-        print( " " * margin + "" )
-
-
-################################################################
-##
-##  DOC CHAPTER CLASS
-##
-class  DocChapter:
-
-    def  __init__( self, block ):
-        self.block    = block
-        self.sections = []
-        if block:
-            self.name  = block.name
-            self.title = block.get_markup_words( "title" )
-            self.order = block.get_markup_words( "sections" )
-        else:
-            self.name  = "Other"
-            self.title = string.split( "Miscellaneous" )
-            self.order = []
-
-
-################################################################
-##
-##  DOC SECTION CLASS
-##
-class  DocSection:
-
-    def  __init__( self, name = "Other" ):
-        self.name        = name
-        self.blocks      = {}
-        self.block_names = []  # ordered block names in section
-        self.defs        = []
-        self.abstract    = ""
-        self.description = ""
-        self.order       = []
-        self.title       = "ERROR"
-        self.chapter     = None
-
-    def  add_def( self, block ):
-        self.defs.append( block )
-
-    def  add_block( self, block ):
-        self.block_names.append( block.name )
-        self.blocks[block.name] = block
-
-    def  process( self ):
-        # look up one block that contains a valid section description
-        for block in self.defs:
-            title = block.get_markup_text( "title" )
-            if title:
-                self.title       = title
-                self.abstract    = block.get_markup_words( "abstract" )
-                self.description = block.get_markup_items( "description" )
-                self.order       = block.get_markup_words_all( "order" )
-                return
-
-    def  reorder( self ):
-        self.block_names = sort_order_list( self.block_names, self.order )
-
-
-################################################################
-##
-##  CONTENT PROCESSOR CLASS
-##
-class  ContentProcessor:
-
-    def  __init__( self ):
-        """Initialize a block content processor."""
-        self.reset()
-
-        self.sections = {}    # dictionary of documentation sections
-        self.section  = None  # current documentation section
-
-        self.chapters = []    # list of chapters
-
-        self.headers  = {}    # dictionary of header macros
-
-    def  set_section( self, section_name ):
-        """Set current section during parsing."""
-        if not section_name in self.sections:
-            section = DocSection( section_name )
-            self.sections[section_name] = section
-            self.section                = section
-        else:
-            self.section = self.sections[section_name]
-
-    def  add_chapter( self, block ):
-        chapter = DocChapter( block )
-        self.chapters.append( chapter )
-
-    def  reset( self ):
-        """Reset the content processor for a new block."""
-        self.markups      = []
-        self.markup       = None
-        self.markup_lines = []
-
-    def  add_markup( self ):
-        """Add a new markup section."""
-        if self.markup and self.markup_lines:
-
-            # get rid of last line of markup if it's empty
-            marks = self.markup_lines
-            if len( marks ) > 0 and not string.strip( marks[-1] ):
-                self.markup_lines = marks[:-1]
-
-            m = DocMarkup( self.markup, self.markup_lines )
-
-            self.markups.append( m )
-
-            self.markup       = None
-            self.markup_lines = []
-
-    def  process_content( self, content ):
-        """Process a block content and return a list of DocMarkup objects
-           corresponding to it."""
-        markup       = None
-        markup_lines = []
-        first        = 1
-
-        margin  = -1
-        in_code = 0
-
-        for line in content:
-            if in_code:
-                m = re_code_end.match( line )
-                if m and len( m.group( 1 ) ) <= margin:
-                    in_code = 0
-                    margin  = -1
-            else:
-                m = re_code_start.match( line )
-                if m:
-                    in_code = 1
-                    margin  = len( m.group( 1 ) )
-
-            found = None
-
-            if not in_code:
-                for t in re_markup_tags:
-                    m = t.match( line )
-                    if m:
-                        found  = string.lower( m.group( 1 ) )
-                        prefix = len( m.group( 0 ) )
-                        # remove markup from line
-                        line   = " " * prefix + line[prefix:]
-                        break
-
-            # is it the start of a new markup section ?
-            if found:
-                first = 0
-                self.add_markup()  # add current markup content
-                self.markup = found
-                if len( string.strip( line ) ) > 0:
-                    self.markup_lines.append( line )
-            elif first == 0:
-                self.markup_lines.append( line )
-
-        self.add_markup()
-
-        return self.markups
-
-    def  parse_sources( self, source_processor ):
-        blocks = source_processor.blocks
-        count  = len( blocks )
-
-        for n in range( count ):
-            source = blocks[n]
-            if source.content:
-                # this is a documentation comment, we need to catch
-                # all following normal blocks in the "follow" list
-                #
-                follow = []
-                m = n + 1
-                while m < count and not blocks[m].content:
-                    follow.append( blocks[m] )
-                    m = m + 1
-
-                doc_block = DocBlock( source, follow, self )
-
-    def  finish( self ):
-        # process all sections to extract their abstract, description
-        # and ordered list of items
-        #
-        for sec in self.sections.values():
-            sec.process()
-
-        # process chapters to check that all sections are correctly
-        # listed there
-        for chap in self.chapters:
-            for sec in chap.order:
-                if sec in self.sections:
-                    section = self.sections[sec]
-                    section.chapter = chap
-                    section.reorder()
-                    chap.sections.append( section )
-                else:
-                    sys.stderr.write( "WARNING: chapter '" +          \
-                        chap.name + "' in " + chap.block.location() + \
-                        " lists unknown section '" + sec + "'\n" )
-
-        # check that all sections are in a chapter
-        #
-        others = []
-        for sec in self.sections.values():
-            if not sec.chapter:
-                sec.reorder()
-                others.append( sec )
-
-        # create a new special chapter for all remaining sections
-        # when necessary
-        #
-        if others:
-            chap = DocChapter( None )
-            chap.sections = others
-            self.chapters.append( chap )
-
-
-################################################################
-##
-##  DOC BLOCK CLASS
-##
-class  DocBlock:
-
-    def  __init__( self, source, follow, processor ):
-        processor.reset()
-
-        self.source  = source
-        self.code    = []
-        self.type    = "ERRTYPE"
-        self.name    = "ERRNAME"
-        self.section = processor.section
-        self.markups = processor.process_content( source.content )
-
-        # compute block type from first markup tag
-        try:
-            self.type = self.markups[0].tag
-        except:
-            pass
-
-        # compute block name from first markup paragraph
-        try:
-            markup = self.markups[0]
-            para   = markup.fields[0].items[0]
-            name   = para.words[0]
-            m = re_identifier.match( name )
-            if m:
-                name = m.group( 1 )
-            self.name = name
-        except:
-            pass
-
-        if self.type == "section":
-            # detect new section starts
-            processor.set_section( self.name )
-            processor.section.add_def( self )
-        elif self.type == "chapter":
-            # detect new chapter
-            processor.add_chapter( self )
-        else:
-            processor.section.add_block( self )
-
-        # now, compute the source lines relevant to this documentation
-        # block. We keep normal comments in for obvious reasons (??)
-        source = []
-        for b in follow:
-            if b.format:
-                break
-            for l in b.lines:
-                # collect header macro definitions
-                m = re_header_macro.match( l )
-                if m:
-                    processor.headers[m.group( 2 )] = m.group( 1 );
-
-                # we use "/* */" as a separator
-                if re_source_sep.match( l ):
-                    break
-                source.append( l )
-
-        # now strip the leading and trailing empty lines from the sources
-        start = 0
-        end   = len( source ) - 1
-
-        while start < end and not string.strip( source[start] ):
-            start = start + 1
-
-        while start < end and not string.strip( source[end] ):
-            end = end - 1
-
-        if start == end and not string.strip( source[start] ):
-            self.code = []
-        else:
-            self.code = source[start:end + 1]
-
-    def  location( self ):
-        return self.source.location()
-
-    def  get_markup( self, tag_name ):
-        """Return the DocMarkup corresponding to a given tag in a block."""
-        for m in self.markups:
-            if m.tag == string.lower( tag_name ):
-                return m
-        return None
-
-    def  get_markup_words( self, tag_name ):
-        try:
-            m = self.get_markup( tag_name )
-            return m.fields[0].items[0].words
-        except:
-            return []
-
-    def  get_markup_words_all( self, tag_name ):
-        try:
-            m = self.get_markup( tag_name )
-            words = []
-            for item in m.fields[0].items:
-                # We honour empty lines in an `' section element by
-                # adding the sentinel `/empty/'.  The formatter should then
-                # convert it to an appropriate representation in the
-                # `section_enter' function.
-                words += item.words
-                words.append( "/empty/" )
-            return words
-        except:
-            return []
-
-    def  get_markup_text( self, tag_name ):
-        result = self.get_markup_words( tag_name )
-        return string.join( result )
-
-    def  get_markup_items( self, tag_name ):
-        try:
-            m = self.get_markup( tag_name )
-            return m.fields[0].items
-        except:
-            return None
-
-# eof
diff --git a/src/3rdparty/freetype/src/tools/docmaker/docbeauty.py b/src/3rdparty/freetype/src/tools/docmaker/docbeauty.py
deleted file mode 100644
index 0b021fa6..00000000
--- a/src/3rdparty/freetype/src/tools/docmaker/docbeauty.py
+++ /dev/null
@@ -1,111 +0,0 @@
-#!/usr/bin/env python
-#
-#  DocBeauty (c) 2003, 2004, 2008 David Turner 
-#
-# This program is used to beautify the documentation comments used
-# in the FreeType 2 public headers.
-#
-
-from sources import *
-from content import *
-from utils   import *
-
-import sys, os, string, getopt
-
-
-content_processor = ContentProcessor()
-
-
-def  beautify_block( block ):
-    if block.content:
-        content_processor.reset()
-
-        markups = content_processor.process_content( block.content )
-        text    = []
-        first   = 1
-
-        for markup in markups:
-            text.extend( markup.beautify( first ) )
-            first = 0
-
-        # now beautify the documentation "borders" themselves
-        lines = [" /*************************************************************************"]
-        for l in text:
-            lines.append( "  *" + l )
-        lines.append( "  */" )
-
-        block.lines = lines
-
-
-def  usage():
-    print( "\nDocBeauty 0.1 Usage information\n" )
-    print( "  docbeauty [options] file1 [file2 ...]\n" )
-    print( "using the following options:\n" )
-    print( "  -h : print this page" )
-    print( "  -b : backup original files with the 'orig' extension" )
-    print( "" )
-    print( "  --backup : same as -b" )
-
-
-def  main( argv ):
-    """main program loop"""
-
-    global output_dir
-
-    try:
-        opts, args = getopt.getopt( sys.argv[1:], \
-                                    "hb",         \
-                                    ["help", "backup"] )
-    except getopt.GetoptError:
-        usage()
-        sys.exit( 2 )
-
-    if args == []:
-        usage()
-        sys.exit( 1 )
-
-    # process options
-    #
-    output_dir = None
-    do_backup  = None
-
-    for opt in opts:
-        if opt[0] in ( "-h", "--help" ):
-            usage()
-            sys.exit( 0 )
-
-        if opt[0] in ( "-b", "--backup" ):
-            do_backup = 1
-
-    # create context and processor
-    source_processor = SourceProcessor()
-
-    # retrieve the list of files to process
-    file_list = make_file_list( args )
-    for filename in file_list:
-        source_processor.parse_file( filename )
-
-        for block in source_processor.blocks:
-            beautify_block( block )
-
-        new_name = filename + ".new"
-        ok       = None
-
-        try:
-            file = open( new_name, "wt" )
-            for block in source_processor.blocks:
-                for line in block.lines:
-                    file.write( line )
-                    file.write( "\n" )
-            file.close()
-        except:
-            ok = 0
-
-
-# if called from the command line
-#
-if __name__ == '__main__':
-    main( sys.argv )
-
-
-# eof
diff --git a/src/3rdparty/freetype/src/tools/docmaker/docmaker.py b/src/3rdparty/freetype/src/tools/docmaker/docmaker.py
deleted file mode 100644
index eb49afb0..00000000
--- a/src/3rdparty/freetype/src/tools/docmaker/docmaker.py
+++ /dev/null
@@ -1,115 +0,0 @@
-#!/usr/bin/env python
-#
-#  docmaker.py
-#
-#    Convert source code markup to HTML documentation.
-#
-#  Copyright 2002-2018 by
-#  David Turner.
-#
-#  This file is part of the FreeType project, and may only be used,
-#  modified, and distributed under the terms of the FreeType project
-#  license, LICENSE.TXT.  By continuing to use, modify, or distribute
-#  this file you indicate that you have read the license and
-#  understand and accept it fully.
-
-#
-# This program is a re-write of the original DocMaker tool used to generate
-# the API Reference of the FreeType font rendering engine by converting
-# in-source comments into structured HTML.
-#
-# This new version is capable of outputting XML data as well as accepting
-# more liberal formatting options.  It also uses regular expression matching
-# and substitution to speed up operation significantly.
-#
-
-from sources   import *
-from content   import *
-from utils     import *
-from formatter import *
-from tohtml    import *
-
-import utils
-
-import sys, glob, getopt
-
-
-def  usage():
-    print( "\nDocMaker Usage information\n" )
-    print( "  docmaker [options] file1 [file2 ...]\n" )
-    print( "using the following options:\n" )
-    print( "  -h : print this page" )
-    print( "  -t : set project title, as in '-t \"My Project\"'" )
-    print( "  -o : set output directory, as in '-o mydir'" )
-    print( "  -p : set documentation prefix, as in '-p ft2'" )
-    print( "" )
-    print( "  --title  : same as -t, as in '--title=\"My Project\"'" )
-    print( "  --output : same as -o, as in '--output=mydir'" )
-    print( "  --prefix : same as -p, as in '--prefix=ft2'" )
-
-
-def  main( argv ):
-    """Main program loop."""
-
-    global output_dir
-
-    try:
-        opts, args = getopt.getopt( sys.argv[1:],
-                                    "ht:o:p:",
-                                    ["help", "title=", "output=", "prefix="] )
-    except getopt.GetoptError:
-        usage()
-        sys.exit( 2 )
-
-    if args == []:
-        usage()
-        sys.exit( 1 )
-
-    # process options
-    project_title  = "Project"
-    project_prefix = None
-    output_dir     = None
-
-    for opt in opts:
-        if opt[0] in ( "-h", "--help" ):
-            usage()
-            sys.exit( 0 )
-
-        if opt[0] in ( "-t", "--title" ):
-            project_title = opt[1]
-
-        if opt[0] in ( "-o", "--output" ):
-            utils.output_dir = opt[1]
-
-        if opt[0] in ( "-p", "--prefix" ):
-            project_prefix = opt[1]
-
-    check_output()
-
-    # create context and processor
-    source_processor  = SourceProcessor()
-    content_processor = ContentProcessor()
-
-    # retrieve the list of files to process
-    file_list = make_file_list( args )
-    for filename in file_list:
-        source_processor.parse_file( filename )
-        content_processor.parse_sources( source_processor )
-
-    # process sections
-    content_processor.finish()
-
-    formatter = HtmlFormatter( content_processor,
-                               project_title,
-                               project_prefix )
-
-    formatter.toc_dump()
-    formatter.index_dump()
-    formatter.section_dump_all()
-
-
-# if called from the command line
-if __name__ == '__main__':
-    main( sys.argv )
-
-# eof
diff --git a/src/3rdparty/freetype/src/tools/docmaker/formatter.py b/src/3rdparty/freetype/src/tools/docmaker/formatter.py
deleted file mode 100644
index 2708fd40..00000000
--- a/src/3rdparty/freetype/src/tools/docmaker/formatter.py
+++ /dev/null
@@ -1,228 +0,0 @@
-#
-#  formatter.py
-#
-#    Convert parsed content blocks to a structured document (library file).
-#
-#  Copyright 2002-2018 by
-#  David Turner.
-#
-#  This file is part of the FreeType project, and may only be used,
-#  modified, and distributed under the terms of the FreeType project
-#  license, LICENSE.TXT.  By continuing to use, modify, or distribute
-#  this file you indicate that you have read the license and
-#  understand and accept it fully.
-
-#
-# This is the base Formatter class.  Its purpose is to convert a content
-# processor's data into specific documents (i.e., table of contents, global
-# index, and individual API reference indices).
-#
-# You need to sub-class it to output anything sensible.  For example, the
-# file `tohtml.py' contains the definition of the `HtmlFormatter' sub-class
-# to output HTML.
-#
-
-
-from sources import *
-from content import *
-from utils   import *
-
-
-################################################################
-##
-##  FORMATTER CLASS
-##
-class  Formatter:
-
-    def  __init__( self, processor ):
-        self.processor   = processor
-        self.identifiers = {}
-        self.chapters    = processor.chapters
-        self.sections    = processor.sections.values()
-        self.block_index = []
-
-        # store all blocks in a dictionary
-        self.blocks = []
-        for section in self.sections:
-            for block in section.blocks.values():
-                self.add_identifier( block.name, block )
-
-                # add enumeration values to the index, since this is useful
-                for markup in block.markups:
-                    if markup.tag == 'values':
-                        for field in markup.fields:
-                            self.add_identifier( field.name, block )
-
-        self.block_index = self.identifiers.keys()
-        self.block_index.sort( key = index_key )
-
-        # also add section names to dictionary (without making them appear
-        # in the index)
-        for section in self.sections:
-            self.add_identifier( section.name, section )
-
-    def  add_identifier( self, name, block ):
-        if name in self.identifiers:
-            # duplicate name!
-            sys.stderr.write( "WARNING: duplicate definition for"
-                              + " '" + name + "' "
-                              + "in " + block.location() + ", "
-                              + "previous definition in "
-                              + self.identifiers[name].location()
-                              + "\n" )
-        else:
-            self.identifiers[name] = block
-
-    #
-    # formatting the table of contents
-    #
-    def  toc_enter( self ):
-        pass
-
-    def  toc_chapter_enter( self, chapter ):
-        pass
-
-    def  toc_section_enter( self, section ):
-        pass
-
-    def  toc_section_exit( self, section ):
-        pass
-
-    def  toc_chapter_exit( self, chapter ):
-        pass
-
-    def  toc_index( self, index_filename ):
-        pass
-
-    def  toc_exit( self ):
-        pass
-
-    def  toc_dump( self, toc_filename = None, index_filename = None ):
-        output = None
-        if toc_filename:
-            output = open_output( toc_filename )
-
-        self.toc_enter()
-
-        for chap in self.processor.chapters:
-
-            self.toc_chapter_enter( chap )
-
-            for section in chap.sections:
-                self.toc_section_enter( section )
-                self.toc_section_exit( section )
-
-            self.toc_chapter_exit( chap )
-
-        self.toc_index( index_filename )
-
-        self.toc_exit()
-
-        if output:
-            close_output( output )
-
-    #
-    # formatting the index
-    #
-    def  index_enter( self ):
-        pass
-
-    def  index_name_enter( self, name ):
-        pass
-
-    def  index_name_exit( self, name ):
-        pass
-
-    def  index_exit( self ):
-        pass
-
-    def  index_dump( self, index_filename = None ):
-        output = None
-        if index_filename:
-            output = open_output( index_filename )
-
-        self.index_enter()
-
-        for name in self.block_index:
-            self.index_name_enter( name )
-            self.index_name_exit( name )
-
-        self.index_exit()
-
-        if output:
-            close_output( output )
-
-    #
-    # formatting a section
-    #
-    def  section_enter( self, section ):
-        pass
-
-    def  block_enter( self, block ):
-        pass
-
-    def  markup_enter( self, markup, block = None ):
-        pass
-
-    def  field_enter( self, field, markup = None, block = None ):
-        pass
-
-    def  field_exit( self, field, markup = None, block = None ):
-        pass
-
-    def  markup_exit( self, markup, block = None ):
-        pass
-
-    def  block_exit( self, block ):
-        pass
-
-    def  section_exit( self, section ):
-        pass
-
-    def  section_dump( self, section, section_filename = None ):
-        output = None
-        if section_filename:
-            output = open_output( section_filename )
-
-        self.section_enter( section )
-
-        for name in section.block_names:
-            skip_entry = 0
-            try:
-                block = self.identifiers[name]
-                # `block_names' can contain field names also,
-                # which we filter out
-                for markup in block.markups:
-                    if markup.tag == 'values':
-                        for field in markup.fields:
-                            if field.name == name:
-                                skip_entry = 1
-            except:
-                skip_entry = 1   # this happens e.g. for `/empty/' entries
-
-            if skip_entry:
-              continue
-
-            self.block_enter( block )
-
-            for markup in block.markups[1:]:   # always ignore first markup!
-                self.markup_enter( markup, block )
-
-                for field in markup.fields:
-                    self.field_enter( field, markup, block )
-                    self.field_exit( field, markup, block )
-
-                self.markup_exit( markup, block )
-
-            self.block_exit( block )
-
-        self.section_exit( section )
-
-        if output:
-            close_output( output )
-
-    def  section_dump_all( self ):
-        for section in self.sections:
-            self.section_dump( section )
-
-# eof
diff --git a/src/3rdparty/freetype/src/tools/docmaker/sources.py b/src/3rdparty/freetype/src/tools/docmaker/sources.py
deleted file mode 100644
index e3b95e0f..00000000
--- a/src/3rdparty/freetype/src/tools/docmaker/sources.py
+++ /dev/null
@@ -1,410 +0,0 @@
-#
-#  sources.py
-#
-#    Convert source code comments to multi-line blocks (library file).
-#
-#  Copyright 2002-2018 by
-#  David Turner.
-#
-#  This file is part of the FreeType project, and may only be used,
-#  modified, and distributed under the terms of the FreeType project
-#  license, LICENSE.TXT.  By continuing to use, modify, or distribute
-#  this file you indicate that you have read the license and
-#  understand and accept it fully.
-
-#
-# This library file contains definitions of classes needed to decompose C
-# source code files into a series of multi-line `blocks'.  There are two
-# kinds of blocks.
-#
-#   - Normal blocks, which contain source code or ordinary comments.
-#
-#   - Documentation blocks, which have restricted formatting, and whose text
-#     always start with a documentation markup tag like `',
-#     `', etc.
-#
-# The routines to process the content of documentation blocks are contained
-# in file `content.py'; the classes and methods found here only deal with
-# text parsing and basic documentation block extraction.
-#
-
-
-import fileinput, re, string
-
-
-################################################################
-##
-##  SOURCE BLOCK FORMAT CLASS
-##
-##  A simple class containing compiled regular expressions to detect
-##  potential documentation format block comments within C source code.
-##
-##  The `column' pattern must contain a group to `unbox' the content of
-##  documentation comment blocks.
-##
-##  Later on, paragraphs are converted to long lines, which simplifies the
-##  regular expressions that act upon the text.
-##
-class  SourceBlockFormat:
-
-    def  __init__( self, id, start, column, end ):
-        """Create a block pattern, used to recognize special documentation
-           blocks."""
-        self.id     = id
-        self.start  = re.compile( start, re.VERBOSE )
-        self.column = re.compile( column, re.VERBOSE )
-        self.end    = re.compile( end, re.VERBOSE )
-
-
-#
-# Format 1 documentation comment blocks.
-#
-#    /************************************/ (at least 2 asterisks)
-#    /*                                  */
-#    /*                                  */
-#    /*                                  */
-#    /************************************/ (at least 2 asterisks)
-#
-start = r'''
-  \s*      # any number of whitespace
-  /\*{2,}/ # followed by '/' and at least two asterisks then '/'
-  \s*$     # probably followed by whitespace
-'''
-
-column = r'''
-  \s*      # any number of whitespace
-  /\*{1}   # followed by '/' and precisely one asterisk
-  ([^*].*) # followed by anything (group 1)
-  \*{1}/   # followed by one asterisk and a '/'
-  \s*$     # probably followed by whitespace
-'''
-
-re_source_block_format1 = SourceBlockFormat( 1, start, column, start )
-
-
-#
-# Format 2 documentation comment blocks.
-#
-#    /************************************ (at least 2 asterisks)
-#     *
-#     *                                    (1 asterisk)
-#     *
-#     */                                   (1 or more asterisks)
-#
-start = r'''
-  \s*     # any number of whitespace
-  /\*{2,} # followed by '/' and at least two asterisks
-  \s*$    # probably followed by whitespace
-'''
-
-column = r'''
-  \s*           # any number of whitespace
-  \*{1}(?![*/]) # followed by precisely one asterisk not followed by `/'
-  (.*)          # then anything (group1)
-'''
-
-end = r'''
-  \s*  # any number of whitespace
-  \*+/ # followed by at least one asterisk, then '/'
-'''
-
-re_source_block_format2 = SourceBlockFormat( 2, start, column, end )
-
-
-#
-# The list of supported documentation block formats.  We could add new ones
-# quite easily.
-#
-re_source_block_formats = [re_source_block_format1, re_source_block_format2]
-
-
-#
-# The following regular expressions correspond to markup tags within the
-# documentation comment blocks.  They are equivalent despite their different
-# syntax.
-#
-# A markup tag consists of letters or character `-', to be found in group 1.
-#
-# Notice that a markup tag _must_ begin a new paragraph.
-#
-re_markup_tag1 = re.compile( r'''\s*<((?:\w|-)*)>''' )  #  format
-re_markup_tag2 = re.compile( r'''\s*@((?:\w|-)*):''' )  # @xxxx: format
-
-#
-# The list of supported markup tags.  We could add new ones quite easily.
-#
-re_markup_tags = [re_markup_tag1, re_markup_tag2]
-
-
-#
-# A regular expression to detect a cross reference, after markup tags have
-# been stripped off.
-#
-# Two syntax forms are supported:
-#
-#   @
-#   @[]
-#
-# where both `' and `' consist of alphanumeric characters, `_',
-# and `-'.  Use `' if there are multiple, valid `' entries.
-#
-# Example: @foo[bar]
-#
-re_crossref = re.compile( r"""
-                            @
-                            (?P(?:\w|-)+
-                                     (?:\[(?:\w|-)+\])?)
-                            (?P.*)
-                          """, re.VERBOSE )
-
-#
-# Two regular expressions to detect italic and bold markup, respectively.
-# Group 1 is the markup, group 2 the rest of the line.
-#
-# Note that the markup is limited to words consisting of letters, digits,
-# the characters `_' and `-', or an apostrophe (but not as the first
-# character).
-#
-re_italic = re.compile( r"_((?:\w|-)(?:\w|'|-)*)_(.*)" )     #  _italic_
-re_bold   = re.compile( r"\*((?:\w|-)(?:\w|'|-)*)\*(.*)" )   #  *bold*
-
-#
-# This regular expression code to identify an URL has been taken from
-#
-#   https://mail.python.org/pipermail/tutor/2002-September/017228.html
-#
-# (with slight modifications).
-#
-urls = r'(?:https?|telnet|gopher|file|wais|ftp)'
-ltrs = r'\w'
-gunk = r'/#~:.?+=&%@!\-'
-punc = r'.:?\-'
-any  = "%(ltrs)s%(gunk)s%(punc)s" % { 'ltrs' : ltrs,
-                                      'gunk' : gunk,
-                                      'punc' : punc }
-url  = r"""
-         (
-           \b                    # start at word boundary
-           %(urls)s :            # need resource and a colon
-           [%(any)s] +?          # followed by one or more of any valid
-                                 # character, but be conservative and
-                                 # take only what you need to...
-           (?=                   # [look-ahead non-consumptive assertion]
-             [%(punc)s]*         # either 0 or more punctuation
-             (?:                 # [non-grouping parentheses]
-               [^%(any)s] | $    # followed by a non-url char
-                                 # or end of the string
-             )
-           )
-         )
-        """ % {'urls' : urls,
-               'any'  : any,
-               'punc' : punc }
-
-re_url = re.compile( url, re.VERBOSE | re.MULTILINE )
-
-#
-# A regular expression that stops collection of comments for the current
-# block.
-#
-re_source_sep = re.compile( r'\s*/\*\s*\*/' )   #  /* */
-
-#
-# A regular expression to find possible C identifiers while outputting
-# source code verbatim, covering things like `*foo' or `(bar'.  Group 1 is
-# the prefix, group 2 the identifier -- since we scan lines from left to
-# right, sequentially splitting the source code into prefix and identifier
-# is fully sufficient for our purposes.
-#
-re_source_crossref = re.compile( r'(\W*)(\w*)' )
-
-#
-# A regular expression that matches a list of reserved C source keywords.
-#
-re_source_keywords = re.compile( '''\\b ( typedef   |
-                                          struct    |
-                                          enum      |
-                                          union     |
-                                          const     |
-                                          char      |
-                                          int       |
-                                          short     |
-                                          long      |
-                                          void      |
-                                          signed    |
-                                          unsigned  |
-                                          \#include |
-                                          \#define  |
-                                          \#undef   |
-                                          \#if      |
-                                          \#ifdef   |
-                                          \#ifndef  |
-                                          \#else    |
-                                          \#endif   ) \\b''', re.VERBOSE )
-
-
-################################################################
-##
-##  SOURCE BLOCK CLASS
-##
-##  There are two important fields in a `SourceBlock' object.
-##
-##    self.lines
-##      A list of text lines for the corresponding block.
-##
-##    self.content
-##      For documentation comment blocks only, this is the block content
-##      that has been `unboxed' from its decoration.  This is `None' for all
-##      other blocks (i.e., sources or ordinary comments with no starting
-##      markup tag)
-##
-class  SourceBlock:
-
-    def  __init__( self, processor, filename, lineno, lines ):
-        self.processor = processor
-        self.filename  = filename
-        self.lineno    = lineno
-        self.lines     = lines[:]
-        self.format    = processor.format
-        self.content   = []
-
-        if self.format == None:
-            return
-
-        words = []
-
-        # extract comment lines
-        lines = []
-
-        for line0 in self.lines:
-            m = self.format.column.match( line0 )
-            if m:
-                lines.append( m.group( 1 ) )
-
-        # now, look for a markup tag
-        for l in lines:
-            l = string.strip( l )
-            if len( l ) > 0:
-                for tag in re_markup_tags:
-                    if tag.match( l ):
-                        self.content = lines
-                        return
-
-    def  location( self ):
-        return "(" + self.filename + ":" + repr( self.lineno ) + ")"
-
-    # debugging only -- not used in normal operations
-    def  dump( self ):
-        if self.content:
-            print( "{{{content start---" )
-            for l in self.content:
-                print( l )
-            print( "---content end}}}" )
-            return
-
-        fmt = ""
-        if self.format:
-            fmt = repr( self.format.id ) + " "
-
-        for line in self.lines:
-            print( line )
-
-
-################################################################
-##
-##  SOURCE PROCESSOR CLASS
-##
-##  The `SourceProcessor' is in charge of reading a C source file and
-##  decomposing it into a series of different `SourceBlock' objects.
-##
-##  A SourceBlock object consists of the following data.
-##
-##    - A documentation comment block using one of the layouts above.  Its
-##      exact format will be discussed later.
-##
-##    - Normal sources lines, including comments.
-##
-##
-class  SourceProcessor:
-
-    def  __init__( self ):
-        """Initialize a source processor."""
-        self.blocks   = []
-        self.filename = None
-        self.format   = None
-        self.lines    = []
-
-    def  reset( self ):
-        """Reset a block processor and clean up all its blocks."""
-        self.blocks = []
-        self.format = None
-
-    def  parse_file( self, filename ):
-        """Parse a C source file and add its blocks to the processor's
-           list."""
-        self.reset()
-
-        self.filename = filename
-
-        fileinput.close()
-        self.format = None
-        self.lineno = 0
-        self.lines  = []
-
-        for line in fileinput.input( filename ):
-            # strip trailing newlines, important on Windows machines!
-            if line[-1] == '\012':
-                line = line[0:-1]
-
-            if self.format == None:
-                self.process_normal_line( line )
-            else:
-                if self.format.end.match( line ):
-                    # A normal block end.  Add it to `lines' and create a
-                    # new block
-                    self.lines.append( line )
-                    self.add_block_lines()
-                elif self.format.column.match( line ):
-                    # A normal column line.  Add it to `lines'.
-                    self.lines.append( line )
-                else:
-                    # An unexpected block end.  Create a new block, but
-                    # don't process the line.
-                    self.add_block_lines()
-
-                    # we need to process the line again
-                    self.process_normal_line( line )
-
-        # record the last lines
-        self.add_block_lines()
-
-    def  process_normal_line( self, line ):
-        """Process a normal line and check whether it is the start of a new
-           block."""
-        for f in re_source_block_formats:
-            if f.start.match( line ):
-                self.add_block_lines()
-                self.format = f
-                self.lineno = fileinput.filelineno()
-
-        self.lines.append( line )
-
-    def  add_block_lines( self ):
-        """Add the current accumulated lines and create a new block."""
-        if self.lines != []:
-            block = SourceBlock( self,
-                                 self.filename,
-                                 self.lineno,
-                                 self.lines )
-
-            self.blocks.append( block )
-            self.format = None
-            self.lines  = []
-
-    # debugging only, not used in normal operations
-    def  dump( self ):
-        """Print all blocks in a processor."""
-        for b in self.blocks:
-            b.dump()
-
-# eof
diff --git a/src/3rdparty/freetype/src/tools/docmaker/tohtml.py b/src/3rdparty/freetype/src/tools/docmaker/tohtml.py
deleted file mode 100644
index 9f318a2a..00000000
--- a/src/3rdparty/freetype/src/tools/docmaker/tohtml.py
+++ /dev/null
@@ -1,725 +0,0 @@
-#
-#  tohtml.py
-#
-#    A sub-class container of the `Formatter' class to produce HTML.
-#
-#  Copyright 2002-2018 by
-#  David Turner.
-#
-#  This file is part of the FreeType project, and may only be used,
-#  modified, and distributed under the terms of the FreeType project
-#  license, LICENSE.TXT.  By continuing to use, modify, or distribute
-#  this file you indicate that you have read the license and
-#  understand and accept it fully.
-
-# The parent class is contained in file `formatter.py'.
-
-
-from sources import *
-from content import *
-from formatter import *
-
-import time
-
-
-# The following strings define the HTML header used by all generated pages.
-html_header_1 = """\
-
-
-
-
-\
-"""
-
-html_header_2 = """\
- API Reference
-
-
-
-"""
-
-html_header_3l = """
-
-

\ -""" - -html_header_5i = """\ -">Index] -

\ -""" - -html_header_6 = """\ - API Reference

-""" - - -# The HTML footer used by all generated pages. -html_footer = """\ - -\ -""" - -# The header and footer used for each section. -section_title_header1 = '

' -section_title_footer = "

" - -# The header and footer used for code segments. -code_header = '
'
-code_footer = '
' - -# Paragraph header and footer. -para_header = "

" -para_footer = "

" - -# Block header and footer. -block_header = '
' -block_footer_start = """\ -
-\ -\ -
-""" - -# Description header/footer. -description_header = "" -description_footer = "" - -# Marker header/inter/footer combination. -marker_header = "

" -marker_inter = "

" -marker_footer = "" - -# Header location header/footer. -header_location_header = "

" -header_location_footer = "

" - -# Source code extracts header/footer. -source_header = "
"
-source_footer = "
" - -# Chapter header/inter/footer. -chapter_header = """\ -
-

\ -""" -chapter_inter = '

' -chapter_footer = '
' - -# Index footer. -index_footer_start = """\ -
- -""" - -# TOC footer. -toc_footer_start = """\ -
- -""" - - -# Source language keyword coloration and styling. -keyword_prefix = '' -keyword_suffix = '' - -section_synopsis_header = '

Synopsis

' -section_synopsis_footer = '' - - -# Translate a single line of source to HTML. This converts `<', `>', and -# `&' into `<',`>', and `&'. -# -def html_quote( line ): - result = string.replace( line, "&", "&" ) - result = string.replace( result, "<", "<" ) - result = string.replace( result, ">", ">" ) - return result - - -################################################################ -## -## HTML FORMATTER CLASS -## -class HtmlFormatter( Formatter ): - - def __init__( self, processor, project_title, file_prefix ): - Formatter.__init__( self, processor ) - - global html_header_1 - global html_header_2 - global html_header_3l, html_header_3r - global html_header_4 - global html_header_5t, html_header_5i - global html_header_6 - global html_footer - - if file_prefix: - file_prefix = file_prefix + "-" - else: - file_prefix = "" - - self.headers = processor.headers - self.project_title = project_title - self.file_prefix = file_prefix - self.html_header = ( - html_header_1 + project_title - + html_header_2 - + html_header_3l + file_prefix + "index.html" - + html_header_4 + file_prefix + "toc.html" - + html_header_5t + project_title - + html_header_6 ) - self.html_index_header = ( - html_header_1 + project_title - + html_header_2 - + html_header_3r + file_prefix + "toc.html" - + html_header_5t + project_title - + html_header_6 ) - self.html_toc_header = ( - html_header_1 + project_title - + html_header_2 - + html_header_3l + file_prefix + "index.html" - + html_header_5i + project_title - + html_header_6 ) - self.html_footer = ( - '
generated on ' - + time.asctime( time.localtime( time.time() ) ) - + "
" + html_footer ) - - self.columns = 3 - - def make_section_url( self, section ): - return self.file_prefix + section.name + ".html" - - def make_block_url( self, block, name = None ): - if name == None: - name = block.name - - try: - section_url = self.make_section_url( block.section ) - except: - # we already have a section - section_url = self.make_section_url( block ) - - return section_url + "#" + name - - def make_html_word( self, word ): - """Analyze a simple word to detect cross-references and markup.""" - # handle cross-references - m = re_crossref.match( word ) - if m: - try: - name = m.group( 'name' ) - rest = m.group( 'rest' ) - block = self.identifiers[name] - url = self.make_block_url( block ) - # display `foo[bar]' as `foo' - name = re.sub( r'\[.*\]', '', name ) - # normalize url, following RFC 3986 - url = string.replace( url, "[", "(" ) - url = string.replace( url, "]", ")" ) - - try: - # for sections, display title - url = ( '‘' - + block.title + '’' - + rest ) - except: - url = ( '' - + name + '' - + rest ) - - return url - except: - # we detected a cross-reference to an unknown item - sys.stderr.write( "WARNING: undefined cross reference" - + " '" + name + "'.\n" ) - return '?' + name + '?' + rest - - # handle markup for italic and bold - m = re_italic.match( word ) - if m: - name = m.group( 1 ) - rest = m.group( 2 ) - return '' + name + '' + rest - - m = re_bold.match( word ) - if m: - name = m.group( 1 ) - rest = m.group( 2 ) - return '' + name + '' + rest - - return html_quote( word ) - - def make_html_para( self, words ): - """Convert words of a paragraph into tagged HTML text. Also handle - cross references.""" - line = "" - if words: - line = self.make_html_word( words[0] ) - for word in words[1:]: - line = line + " " + self.make_html_word( word ) - # handle hyperlinks - line = re_url.sub( r'\1', line ) - # convert `...' quotations into real left and right single quotes - line = re.sub( r"(^|\W)`(.*?)'(\W|$)", - r'\1‘\2’\3', - line ) - # convert tilde into non-breakable space - line = string.replace( line, "~", " " ) - - return para_header + line + para_footer - - def make_html_code( self, lines ): - """Convert a code sequence to HTML.""" - line = code_header + '\n' - for l in lines: - line = line + html_quote( l ).rstrip() + '\n' - - return line + code_footer - - def make_html_items( self, items ): - """Convert a field's content into HTML.""" - lines = [] - for item in items: - if item.lines: - lines.append( self.make_html_code( item.lines ) ) - else: - lines.append( self.make_html_para( item.words ) ) - - return string.join( lines, '\n' ) - - def print_html_items( self, items ): - print( self.make_html_items( items ) ) - - def print_html_field( self, field ): - if field.name: - print( '
' - + field.name - + "" ) - - print( self.make_html_items( field.items ) ) - - if field.name: - print( "
" ) - - def html_source_quote( self, line, block_name = None ): - result = "" - while line: - m = re_source_crossref.match( line ) - if m: - name = m.group( 2 ) - prefix = html_quote( m.group( 1 ) ) - length = len( m.group( 0 ) ) - - if name == block_name: - # this is the current block name, if any - result = result + prefix + '' + name + '' - elif re_source_keywords.match( name ): - # this is a C keyword - result = ( result + prefix - + keyword_prefix + name + keyword_suffix ) - elif name in self.identifiers: - # this is a known identifier - block = self.identifiers[name] - id = block.name - - # link to a field ID if possible - try: - for markup in block.markups: - if markup.tag == 'values': - for field in markup.fields: - if field.name: - id = name - - result = ( result + prefix - + '' + name + '' ) - except: - # sections don't have `markups'; however, we don't - # want references to sections here anyway - result = result + html_quote( line[:length] ) - - else: - result = result + html_quote( line[:length] ) - - line = line[length:] - else: - result = result + html_quote( line ) - line = [] - - return result - - def print_html_field_list( self, fields ): - print( '' ) - for field in fields: - print( '" ) - print( "
' - + field.name - + '' ) - self.print_html_items( field.items ) - print( "
" ) - - def print_html_markup( self, markup ): - table_fields = [] - for field in markup.fields: - if field.name: - # We begin a new series of field or value definitions. We - # record them in the `table_fields' list before outputting - # all of them as a single table. - table_fields.append( field ) - else: - if table_fields: - self.print_html_field_list( table_fields ) - table_fields = [] - - self.print_html_items( field.items ) - - if table_fields: - self.print_html_field_list( table_fields ) - - # - # formatting the index - # - def index_enter( self ): - print( self.html_index_header ) - self.index_items = {} - - def index_name_enter( self, name ): - block = self.identifiers[name] - url = self.make_block_url( block ) - self.index_items[name] = url - - def index_exit( self ): - # `block_index' already contains the sorted list of index names - count = len( self.block_index ) - rows = ( count + self.columns - 1 ) // self.columns - - print( '' ) - for r in range( rows ): - line = "" - for c in range( self.columns ): - i = r + c * rows - if i < count: - bname = self.block_index[r + c * rows] - url = self.index_items[bname] - # display `foo[bar]' as `foo (bar)' - bname = string.replace( bname, "[", " (" ) - bname = string.replace( bname, "]", ")" ) - # normalize url, following RFC 3986 - url = string.replace( url, "[", "(" ) - url = string.replace( url, "]", ")" ) - line = ( line + '' ) - else: - line = line + '' - line = line + "" - print( line ) - - print( "
' - + bname + '
" ) - - print( index_footer_start - + self.file_prefix + "toc.html" - + index_footer_end ) - - print( self.html_footer ) - - self.index_items = {} - - def index_dump( self, index_filename = None ): - if index_filename == None: - index_filename = self.file_prefix + "index.html" - - Formatter.index_dump( self, index_filename ) - - # - # formatting the table of contents - # - def toc_enter( self ): - print( self.html_toc_header ) - print( "

Table of Contents

" ) - - def toc_chapter_enter( self, chapter ): - print( chapter_header + string.join( chapter.title ) + chapter_inter ) - print( '' ) - - def toc_section_enter( self, section ): - print( '" ) - - def toc_chapter_exit( self, chapter ): - print( "
' ) - print( self.make_html_para( section.abstract ) ) - - def toc_section_exit( self, section ): - print( "
" ) - print( chapter_footer ) - - def toc_index( self, index_filename ): - print( chapter_header - + 'Global Index' - + chapter_inter + chapter_footer ) - - def toc_exit( self ): - print( toc_footer_start - + self.file_prefix + "index.html" - + toc_footer_end ) - - print( self.html_footer ) - - def toc_dump( self, toc_filename = None, index_filename = None ): - if toc_filename == None: - toc_filename = self.file_prefix + "toc.html" - - if index_filename == None: - index_filename = self.file_prefix + "index.html" - - Formatter.toc_dump( self, toc_filename, index_filename ) - - # - # formatting sections - # - def section_enter( self, section ): - print( self.html_header ) - - print( section_title_header1 + section.name + section_title_header2 - + section.title - + section_title_footer ) - - maxwidth = 0 - for b in section.blocks.values(): - if len( b.name ) > maxwidth: - maxwidth = len( b.name ) - - width = 70 # XXX magic number - if maxwidth > 0: - # print section synopsis - print( section_synopsis_header ) - print( '' ) - - columns = width // maxwidth - if columns < 1: - columns = 1 - - count = len( section.block_names ) - # don't handle last entry if it is empty - if section.block_names[-1] == "/empty/": - count -= 1 - rows = ( count + columns - 1 ) // columns - - for r in range( rows ): - line = "" - for c in range( columns ): - i = r + c * rows - line = line + '' - line = line + "" - print( line ) - - print( "
' - if i < count: - name = section.block_names[i] - if name == "/empty/": - # it can happen that a complete row is empty, and - # without a proper `filler' the browser might - # collapse the row to a much smaller height (or - # even omit it completely) - line = line + " " - else: - url = name - # display `foo[bar]' as `foo' - name = re.sub( r'\[.*\]', '', name ) - # normalize url, following RFC 3986 - url = string.replace( url, "[", "(" ) - url = string.replace( url, "]", ")" ) - line = ( line + '' - + name + '' ) - - line = line + '
" ) - print( section_synopsis_footer ) - - print( description_header ) - print( self.make_html_items( section.description ) ) - print( description_footer ) - - def block_enter( self, block ): - print( block_header ) - - # place html anchor if needed - if block.name: - url = block.name - # display `foo[bar]' as `foo' - name = re.sub( r'\[.*\]', '', block.name ) - # normalize url, following RFC 3986 - url = string.replace( url, "[", "(" ) - url = string.replace( url, "]", ")" ) - print( '

' + name + '

' ) - - # dump the block C source lines now - if block.code: - header = '' - for f in self.headers.keys(): - if block.source.filename.find( f ) >= 0: - header = self.headers[f] + ' (' + f + ')' - break - -# if not header: -# sys.stderr.write( -# "WARNING: No header macro for" -# + " '" + block.source.filename + "'.\n" ) - - if header: - print( header_location_header - + 'Defined in ' + header + '.' - + header_location_footer ) - - print( source_header ) - for l in block.code: - print( self.html_source_quote( l, block.name ) ) - print( source_footer ) - - def markup_enter( self, markup, block ): - if markup.tag == "description": - print( description_header ) - else: - print( marker_header + markup.tag + marker_inter ) - - self.print_html_markup( markup ) - - def markup_exit( self, markup, block ): - if markup.tag == "description": - print( description_footer ) - else: - print( marker_footer ) - - def block_exit( self, block ): - print( block_footer_start + self.file_prefix + "index.html" - + block_footer_middle + self.file_prefix + "toc.html" - + block_footer_end ) - - def section_exit( self, section ): - print( html_footer ) - - def section_dump_all( self ): - for section in self.sections: - self.section_dump( section, - self.file_prefix + section.name + '.html' ) - -# eof diff --git a/src/3rdparty/freetype/src/tools/docmaker/utils.py b/src/3rdparty/freetype/src/tools/docmaker/utils.py deleted file mode 100644 index f40f1674..00000000 --- a/src/3rdparty/freetype/src/tools/docmaker/utils.py +++ /dev/null @@ -1,127 +0,0 @@ -# -# utils.py -# -# Auxiliary functions for the `docmaker' tool (library file). -# -# Copyright 2002-2018 by -# David Turner. -# -# This file is part of the FreeType project, and may only be used, -# modified, and distributed under the terms of the FreeType project -# license, LICENSE.TXT. By continuing to use, modify, or distribute -# this file you indicate that you have read the license and -# understand and accept it fully. - - -import string, sys, os, glob, itertools - - -# current output directory -# -output_dir = None - - -# A function that generates a sorting key. We want lexicographical order -# (primary key) except that capital letters are sorted before lowercase -# ones (secondary key). -# -# The primary key is implemented by lowercasing the input. The secondary -# key is simply the original data appended, character by character. For -# example, the sort key for `FT_x' is `fFtT__xx', while the sort key for -# `ft_X' is `fftt__xX'. Since ASCII codes of uppercase letters are -# numerically smaller than the codes of lowercase letters, `fFtT__xx' gets -# sorted before `fftt__xX'. -# -def index_key( s ): - return string.join( itertools.chain( *zip( s.lower(), s ) ) ) - - -# Sort `input_list', placing the elements of `order_list' in front. -# -def sort_order_list( input_list, order_list ): - new_list = order_list[:] - for id in input_list: - if not id in order_list: - new_list.append( id ) - return new_list - - -# Divert standard output to a given project documentation file. Use -# `output_dir' to determine the filename location if necessary and save the -# old stdout handle in a tuple that is returned by this function. -# -def open_output( filename ): - global output_dir - - if output_dir and output_dir != "": - filename = output_dir + os.sep + filename - - old_stdout = sys.stdout - new_file = open( filename, "w" ) - sys.stdout = new_file - - return ( new_file, old_stdout ) - - -# Close the output that was returned by `open_output'. -# -def close_output( output ): - output[0].close() - sys.stdout = output[1] - - -# Check output directory. -# -def check_output(): - global output_dir - if output_dir: - if output_dir != "": - if not os.path.isdir( output_dir ): - sys.stderr.write( "argument" - + " '" + output_dir + "' " - + "is not a valid directory\n" ) - sys.exit( 2 ) - else: - output_dir = None - - -def file_exists( pathname ): - """Check that a given file exists.""" - result = 1 - try: - file = open( pathname, "r" ) - file.close() - except: - result = None - sys.stderr.write( pathname + " couldn't be accessed\n" ) - - return result - - -def make_file_list( args = None ): - """Build a list of input files from command-line arguments.""" - file_list = [] - # sys.stderr.write( repr( sys.argv[1 :] ) + '\n' ) - - if not args: - args = sys.argv[1:] - - for pathname in args: - if string.find( pathname, '*' ) >= 0: - newpath = glob.glob( pathname ) - newpath.sort() # sort files -- this is important because - # of the order of files - else: - newpath = [pathname] - - file_list.extend( newpath ) - - if len( file_list ) == 0: - file_list = None - else: - # now filter the file list to remove non-existing ones - file_list = filter( file_exists, file_list ) - - return file_list - -# eof diff --git a/src/3rdparty/freetype/src/tools/ftfuzzer/README b/src/3rdparty/freetype/src/tools/ftfuzzer/README deleted file mode 100644 index 09d8e9f3..00000000 --- a/src/3rdparty/freetype/src/tools/ftfuzzer/README +++ /dev/null @@ -1,81 +0,0 @@ -ftfuzzer -======== - - -ftfuzzer.cc ------------ - -This file contains a target function for FreeType fuzzing. It can be -used with libFuzzer (https://llvm.org/docs/LibFuzzer.html) or -potentially any other similar fuzzer. - -Usage: - - 1. Build `libfreetype.a' and `ftfuzzer.cc' using the most recent - clang compiler with these flags: - - # for fuzzer coverage feedback - -fsanitize-coverage=edge,8bit-counters - # for bug checking - -fsanitize=address,signed-integer-overflow,shift - - You also need the header files from the `libarchive' library - (https://www.libarchive.org/) for handling tar files (see file - `ftmutator.cc' below for more). - - 2. Link with `libFuzzer' (it contains `main') and `libarchive'. - - 3. Run the fuzzer on some test corpus. - -The exact flags and commands may vary. - - https://github.com/google/oss-fuzz/tree/master/projects/freetype2 - -There is a continuous fuzzing bot that runs ftfuzzer. - - https://oss-fuzz.com - -(You need an account to be able to see coverage reports and the like -on oss-fuzz.com.) - -Check the bot configuration for the most current settings. - - -ftmutator.cc ------------- - -FreeType has the ability to `attach' auxiliary files to a font file, -providing additional information. The main usage is to load AFM files -for PostScript Type 1 fonts. - -However, libFuzzer currently only supports mutation of a single input -file. For this reason, `ftmutator.cc' contains a custom fuzzer -mutator that uses an uncompressed tar file archive as the input. The -first file in such a tarball gets opened by FreeType as a font, all -other files are treated as input for `FT_Attach_Stream'. - -Compilation is similar to `ftfuzzer.c'. - - -runinput.cc ------------ - -To run the target function on a set of input files, this file contains -a convenience `main' function. Link it with `ftfuzzer.cc', -`libfreetype.a', and `libarchive' and run like - - ./a.out my_tests_inputs/* - ----------------------------------------------------------------------- - -Copyright 2015-2018 by -David Turner, Robert Wilhelm, and Werner Lemberg. - -This file is part of the FreeType project, and may only be used, -modified, and distributed under the terms of the FreeType project -license, LICENSE.TXT. By continuing to use, modify, or distribute -this file you indicate that you have read the license and understand -and accept it fully. - - ---- end of README --- diff --git a/src/3rdparty/freetype/src/tools/ftfuzzer/ftfuzzer.cc b/src/3rdparty/freetype/src/tools/ftfuzzer/ftfuzzer.cc deleted file mode 100644 index acf2bc98..00000000 --- a/src/3rdparty/freetype/src/tools/ftfuzzer/ftfuzzer.cc +++ /dev/null @@ -1,428 +0,0 @@ -// ftfuzzer.cc -// -// A fuzzing function to test FreeType with libFuzzer. -// -// Copyright 2015-2018 by -// David Turner, Robert Wilhelm, and Werner Lemberg. -// -// This file is part of the FreeType project, and may only be used, -// modified, and distributed under the terms of the FreeType project -// license, LICENSE.TXT. By continuing to use, modify, or distribute -// this file you indicate that you have read the license and -// understand and accept it fully. - - -// we use `unique_ptr', `decltype', and other gimmicks defined since C++11 -#if __cplusplus < 201103L -# error "a C++11 compiler is needed" -#endif - -#include -#include - -#include -#include - -#include -#include - - - using namespace std; - - -#include - -#include FT_FREETYPE_H -#include FT_GLYPH_H -#include FT_CACHE_H -#include FT_CACHE_CHARMAP_H -#include FT_CACHE_IMAGE_H -#include FT_CACHE_SMALL_BITMAPS_H -#include FT_SYNTHESIS_H -#include FT_ADVANCES_H -#include FT_OUTLINE_H -#include FT_BBOX_H -#include FT_MODULE_H -#include FT_DRIVER_H -#include FT_MULTIPLE_MASTERS_H - - - static FT_Library library; - static int InitResult; - - - struct FT_Global - { - FT_Global() - { - InitResult = FT_Init_FreeType( &library ); - if ( InitResult ) - return; - - // try to activate Adobe's CFF engine; it might not be the default - unsigned int cff_hinting_engine = FT_HINTING_ADOBE; - FT_Property_Set( library, - "cff", - "hinting-engine", &cff_hinting_engine ); - } - - ~FT_Global() - { - FT_Done_FreeType( library ); - } - }; - - FT_Global global_ft; - - - // We want to select n values at random (without repetition), - // with 0 < n <= N. The algorithm is taken from TAoCP, Vol. 2 - // (Algorithm S, selection sampling technique) - struct Random - { - int n; - int N; - - int t; // total number of values so far - int m; // number of selected values so far - - uint32_t r; // the current pseudo-random number - - Random( int n_, - int N_ ) - : n( n_ ), - N( N_ ) - { - t = 0; - m = 0; - - // Ideally, this should depend on the input file, - // for example, taking the sha256 as input; - // however, this is overkill for fuzzying tests. - r = 12345; - } - - int get() - { - if ( m >= n ) - return -1; - - Redo: - // We can't use `rand': different C libraries might provide - // different implementations of this function. As a replacement, - // we use a 32bit version of the `xorshift' algorithm. - r ^= r << 13; - r ^= r >> 17; - r ^= r << 5; - - double U = double( r ) / UINT32_MAX; - - if ( ( N - t ) * U >= ( n - m ) ) - { - t++; - goto Redo; - } - - t++; - m++; - - return t; - } - }; - - - static int - archive_read_entry_data( struct archive *ar, - vector *vw ) - { - int r; - const FT_Byte* buff; - size_t size; - int64_t offset; - - for (;;) - { - r = archive_read_data_block( ar, - reinterpret_cast( &buff ), - &size, - &offset ); - if ( r == ARCHIVE_EOF ) - return ARCHIVE_OK; - if ( r != ARCHIVE_OK ) - return r; - - vw->insert( vw->end(), buff, buff + size ); - } - } - - - static vector> - parse_data( const uint8_t* data, - size_t size ) - { - struct archive_entry* entry; - int r; - vector> files; - - unique_ptr a( archive_read_new(), - archive_read_free ); - - // activate reading of uncompressed tar archives - archive_read_support_format_tar( a.get() ); - - // the need for `const_cast' was removed with libarchive commit be4d4dd - if ( !( r = archive_read_open_memory( - a.get(), - const_cast(static_cast( data ) ), - size ) ) ) - { - unique_ptr a_open( a.get(), - archive_read_close ); - - // read files contained in archive - for (;;) - { - r = archive_read_next_header( a_open.get(), &entry ); - if ( r == ARCHIVE_EOF ) - break; - if ( r != ARCHIVE_OK ) - break; - - vector entry_data; - r = archive_read_entry_data( a.get(), &entry_data ); - if ( r != ARCHIVE_OK ) - break; - - files.push_back( move( entry_data ) ); - } - } - - if ( files.size() == 0 ) - files.emplace_back( data, data + size ); - - return files; - } - - - static void - setIntermediateAxis( FT_Face face ) - { - // only handle Multiple Masters and GX variation fonts - if ( !FT_HAS_MULTIPLE_MASTERS( face ) ) - return; - - // get variation data for current instance - FT_MM_Var* variations_ptr = nullptr; - if ( FT_Get_MM_Var( face, &variations_ptr ) ) - return; - - unique_ptr variations( variations_ptr, free ); - vector coords( variations->num_axis ); - - // select an arbitrary instance - for ( unsigned int i = 0; i < variations->num_axis; i++ ) - coords[i] = ( variations->axis[i].minimum + - variations->axis[i].def ) / 2; - - if ( FT_Set_Var_Design_Coordinates( face, - FT_UInt( coords.size() ), - coords.data() ) ) - return; - } - - - // the interface function to the libFuzzer library - extern "C" int - LLVMFuzzerTestOneInput( const uint8_t* data, - size_t size_ ) - { - assert( !InitResult ); - - if ( size_ < 1 ) - return 0; - - const vector>& files = parse_data( data, size_ ); - - FT_Face face; - FT_Int32 load_flags = FT_LOAD_DEFAULT; -#if 0 - FT_Render_Mode render_mode = FT_RENDER_MODE_NORMAL; -#endif - - // We use a conservative approach here, at the cost of calling - // `FT_New_Face' quite often. The idea is that the fuzzer should be - // able to try all faces and named instances of a font, expecting that - // some faces don't work for various reasons, e.g., a broken subfont, or - // an unsupported NFNT bitmap font in a Mac dfont resource that holds - // more than a single font. - - // get number of faces - if ( FT_New_Memory_Face( library, - files[0].data(), - (FT_Long)files[0].size(), - -1, - &face ) ) - return 0; - long num_faces = face->num_faces; - FT_Done_Face( face ); - - // loop over up to 20 arbitrarily selected faces - // from index range [0;num-faces-1] - long max_face_cnt = num_faces < 20 - ? num_faces - : 20; - - Random faces_pool( (int)max_face_cnt, (int)num_faces ); - - for ( long face_cnt = 0; - face_cnt < max_face_cnt; - face_cnt++ ) - { - long face_index = faces_pool.get() - 1; - - // get number of instances - if ( FT_New_Memory_Face( library, - files[0].data(), - (FT_Long)files[0].size(), - -( face_index + 1 ), - &face ) ) - continue; - long num_instances = face->style_flags >> 16; - FT_Done_Face( face ); - - // loop over the face without instance (index 0) - // and up to 20 arbitrarily selected instances - // from index range [1;num_instances] - long max_instance_cnt = num_instances < 20 - ? num_instances - : 20; - - Random instances_pool( (int)max_instance_cnt, (int)num_instances ); - - for ( long instance_cnt = 0; - instance_cnt <= max_instance_cnt; - instance_cnt++ ) - { - long instance_index = 0; - - if ( !instance_cnt ) - { - if ( FT_New_Memory_Face( library, - files[0].data(), - (FT_Long)files[0].size(), - face_index, - &face ) ) - continue; - } - else - { - instance_index = instances_pool.get(); - - if ( FT_New_Memory_Face( library, - files[0].data(), - (FT_Long)files[0].size(), - ( instance_index << 16 ) + face_index, - &face ) ) - continue; - } - - // if we have more than a single input file coming from an archive, - // attach them (starting with the second file) using the order given - // in the archive - for ( size_t files_index = 1; - files_index < files.size(); - files_index++ ) - { - FT_Open_Args open_args = {}; - open_args.flags = FT_OPEN_MEMORY; - open_args.memory_base = files[files_index].data(); - open_args.memory_size = (FT_Long)files[files_index].size(); - - // the last archive element will be eventually used as the - // attachment - FT_Attach_Stream( face, &open_args ); - } - - // loop over an arbitrary size for outlines - // and up to ten arbitrarily selected bitmap strike sizes - // from the range [0;num_fixed_sizes - 1] - int max_size_cnt = face->num_fixed_sizes < 10 - ? face->num_fixed_sizes - : 10; - - Random sizes_pool( max_size_cnt, face->num_fixed_sizes ); - - for ( int size_cnt = 0; - size_cnt <= max_size_cnt; - size_cnt++ ) - { - FT_Int32 flags = load_flags; - - int size_index = 0; - - if ( !size_cnt ) - { - // set up 20pt at 72dpi as an arbitrary size - if ( FT_Set_Char_Size( face, 20 * 64, 20 * 64, 72, 72 ) ) - continue; - flags |= FT_LOAD_NO_BITMAP; - } - else - { - // bitmap strikes are not active for font variations - if ( instance_index ) - continue; - - size_index = sizes_pool.get() - 1; - - if ( FT_Select_Size( face, size_index ) ) - continue; - flags |= FT_LOAD_COLOR; - } - - // test MM interface only for a face without a selected instance - // and without a selected bitmap strike - if ( !instance_index && !size_cnt ) - setIntermediateAxis( face ); - - // loop over all glyphs - for ( unsigned int glyph_index = 0; - glyph_index < (unsigned int)face->num_glyphs; - glyph_index++ ) - { - if ( FT_Load_Glyph( face, glyph_index, flags ) ) - continue; - - // Rendering is the most expensive and the least interesting part. - // - // if ( FT_Render_Glyph( face->glyph, render_mode) ) - // continue; - // FT_GlyphSlot_Embolden( face->glyph ); - -#if 0 - FT_Glyph glyph; - if ( !FT_Get_Glyph( face->glyph, &glyph ) ) - FT_Done_Glyph( glyph ); - - FT_Outline* outline = &face->glyph->outline; - FT_Matrix rot30 = { 0xDDB4, -0x8000, 0x8000, 0xDDB4 }; - - FT_Outline_Transform( outline, &rot30 ); - - FT_BBox bbox; - FT_Outline_Get_BBox( outline, &bbox ); -#endif - } - } - FT_Done_Face( face ); - } - } - - return 0; - } - - -// END diff --git a/src/3rdparty/freetype/src/tools/ftfuzzer/ftmutator.cc b/src/3rdparty/freetype/src/tools/ftfuzzer/ftmutator.cc deleted file mode 100644 index ae4b1404..00000000 --- a/src/3rdparty/freetype/src/tools/ftfuzzer/ftmutator.cc +++ /dev/null @@ -1,314 +0,0 @@ -// ftmutator.cc -// -// A custom fuzzer mutator to test for FreeType with libFuzzer. -// -// Copyright 2015-2018 by -// David Turner, Robert Wilhelm, and Werner Lemberg. -// -// This file is part of the FreeType project, and may only be used, -// modified, and distributed under the terms of the FreeType project -// license, LICENSE.TXT. By continuing to use, modify, or distribute -// this file you indicate that you have read the license and -// understand and accept it fully. - - -// Since `tar' is not a valid format for input to FreeType, treat any input -// that looks like `tar' as multiple files and mutate them separately. -// -// In the future, a variation of this may be used to guide mutation on a -// logically higher level. - - -// we use `unique_ptr', `decltype', and other gimmicks defined since C++11 -#if __cplusplus < 201103L -# error "a C++11 compiler is needed" -#endif - -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -#include -#include - -#include "FuzzerInterface.h" - - - using namespace std; - - - // This function should be defined by `ftfuzzer.cc'. - extern "C" int - LLVMFuzzerTestOneInput( const uint8_t* Data, - size_t Size ); - - - static void - check_result( struct archive* a, - int r ) - { - if ( r == ARCHIVE_OK ) - return; - - const char* m = archive_error_string( a ); - write( 1, m, strlen( m ) ); - exit( 1 ); - } - - - static int - archive_read_entry_data( struct archive *ar, - vector *vw ) - { - int r; - const uint8_t* buff; - size_t size; - int64_t offset; - - for (;;) - { - r = archive_read_data_block( ar, - reinterpret_cast( &buff ), - &size, - &offset ); - if ( r == ARCHIVE_EOF ) - return ARCHIVE_OK; - if ( r != ARCHIVE_OK ) - return r; - - vw->insert( vw->end(), buff, buff + size ); - } - } - - - static vector> - parse_data( const uint8_t* data, - size_t size ) - { - struct archive_entry* entry; - int r; - vector> files; - - unique_ptr a( archive_read_new(), - archive_read_free ); - - // activate reading of uncompressed tar archives - archive_read_support_format_tar( a.get() ); - - // the need for `const_cast' was removed with libarchive commit be4d4dd - if ( !( r = archive_read_open_memory( - a.get(), - const_cast(static_cast( data ) ), - size ) ) ) - { - unique_ptr a_open( a.get(), - archive_read_close ); - - // read files contained in archive - for (;;) - { - r = archive_read_next_header( a_open.get(), &entry ); - if ( r == ARCHIVE_EOF ) - break; - if ( r != ARCHIVE_OK ) - break; - - vector entry_data; - r = archive_read_entry_data( a.get(), &entry_data ); - if ( entry_data.size() == 0 ) - continue; - - files.push_back( move( entry_data ) ); - if ( r != ARCHIVE_OK ) - break; - } - } - - return files; - } - - - class FTFuzzer - : public fuzzer::UserSuppliedFuzzer - { - - public: - FTFuzzer( fuzzer::FuzzerRandomBase* Rand ) - : fuzzer::UserSuppliedFuzzer( Rand ) {} - - - int - TargetFunction( const uint8_t* Data, - size_t Size ) - { - return LLVMFuzzerTestOneInput( Data, Size ); - } - - - // Custom mutator. - virtual size_t - Mutate( uint8_t* Data, - size_t Size, - size_t MaxSize ) - { - vector> files = parse_data( Data, Size ); - - // If the file was not recognized as a tar file, treat it as non-tar. - if ( files.size() == 0 ) - return fuzzer::UserSuppliedFuzzer::Mutate( Data, Size, MaxSize ); - - // This is somewhat `white box' on tar. The tar format uses 512 byte - // blocks. One block as header for each file, two empty blocks of 0's - // at the end. File data is padded to fill its last block. - size_t used_blocks = files.size() + 2; - for ( const auto& file : files ) - used_blocks += ( file.size() + 511 ) / 512; - - size_t max_blocks = MaxSize / 512; - - // If the input is big, it will need to be downsized. If the original - // tar file was too big, it may have been clipped to fit. In this - // case it may not be possible to properly write out the data, as - // there may not be enough space for the trailing two blocks. Start - // dropping file data or files from the end. - for ( size_t i = files.size(); - i-- > 1 && used_blocks > max_blocks; ) - { - size_t blocks_to_free = used_blocks - max_blocks; - size_t blocks_currently_used_by_file_data = - ( files[i].size() + 511 ) / 512; - - if ( blocks_currently_used_by_file_data >= blocks_to_free ) - { - files[i].resize( ( blocks_currently_used_by_file_data - - blocks_to_free ) * 512 ); - used_blocks -= blocks_to_free; - continue; - } - - files.pop_back(); - used_blocks -= blocks_currently_used_by_file_data + 1; - } - - // If we get down to one file, don't use tar. - if ( files.size() == 1 ) - { - memcpy( Data, files[0].data(), files[0].size() ); - return fuzzer::UserSuppliedFuzzer::Mutate( Data, - files[0].size(), - MaxSize ); - } - - size_t free_blocks = max_blocks - used_blocks; - - // Allow each file to use up as much of the currently available space - // it can. If it uses or gives up blocks, add them or remove them - // from the pool. - for ( auto&& file : files ) - { - size_t blocks_currently_used_by_file = ( file.size() + 511 ) / 512; - size_t blocks_available = blocks_currently_used_by_file + - free_blocks; - size_t max_size = blocks_available * 512; - size_t data_size = file.size(); - - file.resize( max_size ); - file.resize( fuzzer::UserSuppliedFuzzer::Mutate( file.data(), - data_size, - max_size ) ); - - size_t blocks_now_used_by_file = ( file.size() + 511 ) / 512; - free_blocks = free_blocks + - blocks_currently_used_by_file - - blocks_now_used_by_file; - } - - unique_ptr a( archive_write_new(), - archive_write_free ); - - check_result( a.get(), archive_write_add_filter_none( a.get() ) ); - check_result( a.get(), archive_write_set_format_ustar( a.get() ) ); - - // `used' may not be correct until after the archive is closed. - size_t used = 0xbadbeef; - check_result( a.get(), archive_write_open_memory( a.get(), - Data, - MaxSize, - &used ) ); - - { - unique_ptr a_open( a.get(), - archive_write_close ); - - int file_index = 0; - for ( const auto& file : files ) - { - unique_ptr - e( archive_entry_new2( a_open.get() ), - archive_entry_free ); - - char name_buffer[100]; - snprintf( name_buffer, 100, "file%d", file_index++ ); - - archive_entry_set_pathname( e.get(), name_buffer ); - archive_entry_set_size( e.get(), file.size() ); - archive_entry_set_filetype( e.get(), AE_IFREG ); - archive_entry_set_perm( e.get(), 0644 ); - - check_result( a_open.get(), - archive_write_header( a_open.get(), e.get() ) ); - archive_write_data( a_open.get(), file.data(), file.size() ); - check_result( a_open.get(), - archive_write_finish_entry( a_open.get() ) ); - } - } - - return used; - } - - - // Cross `Data1' and `Data2', write up to `MaxOutSize' bytes into `Out', - // return the number of bytes written, which should be positive. - virtual size_t - CrossOver( const uint8_t* Data1, - size_t Size1, - const uint8_t* Data2, - size_t Size2, - uint8_t* Out, - size_t MaxOutSize ) - { - return fuzzer::UserSuppliedFuzzer::CrossOver( Data1, - Size1, - Data2, - Size2, - Out, - MaxOutSize ); - } - - }; // end of FTFuzzer class - - - int - main( int argc, - char* *argv ) - { - fuzzer::FuzzerRandomLibc Rand( 0 ); - FTFuzzer F( &Rand ); - - fuzzer::FuzzerDriver( argc, argv, F ); - } - - -// END diff --git a/src/3rdparty/freetype/src/tools/ftfuzzer/rasterfuzzer.cc b/src/3rdparty/freetype/src/tools/ftfuzzer/rasterfuzzer.cc deleted file mode 100644 index c69b95ea..00000000 --- a/src/3rdparty/freetype/src/tools/ftfuzzer/rasterfuzzer.cc +++ /dev/null @@ -1,129 +0,0 @@ -// rasterfuzzer.cc -// -// A fuzzing function to test FreeType's rasterizers with libFuzzer. -// -// Copyright 2016-2018 by -// David Turner, Robert Wilhelm, and Werner Lemberg. -// -// This file is part of the FreeType project, and may only be used, -// modified, and distributed under the terms of the FreeType project -// license, LICENSE.TXT. By continuing to use, modify, or distribute -// this file you indicate that you have read the license and -// understand and accept it fully. - - -#include - -#include - - - using namespace std; - - -#include - -#include FT_FREETYPE_H -#include FT_IMAGE_H -#include FT_OUTLINE_H - - - static FT_Library library; - static int InitResult; - - - struct FT_Global { - FT_Global() { - InitResult = FT_Init_FreeType( &library ); - } - ~FT_Global() { - FT_Done_FreeType( library ); - } - }; - - FT_Global global_ft; - - - extern "C" int - LLVMFuzzerTestOneInput( const uint8_t* data, - size_t size_ ) - { - unsigned char pixels[4]; - - FT_Bitmap bitmap_mono = { - 1, // rows - 1, // width - 4, // pitch - pixels, // buffer - 2, // num_grays - FT_PIXEL_MODE_MONO, // pixel_mode - 0, // palette_mode - NULL // palette - }; - - FT_Bitmap bitmap_gray = { - 1, // rows - 1, // width - 4, // pitch - pixels, // buffer - 256, // num_grays - FT_PIXEL_MODE_GRAY, // pixel_mode - 0, // palette_mode - NULL // palette - }; - - const size_t vsize = sizeof ( FT_Vector ); - const size_t tsize = sizeof ( char ); - - // we use the input data for both points and tags - short n_points = short( size_ / ( vsize + tsize ) ); - if ( n_points <= 2 ) - return 0; - - FT_Vector* points = reinterpret_cast( - const_cast( - data ) ); - char* tags = reinterpret_cast( - const_cast( - data + size_t( n_points ) * vsize ) ); - - // to reduce the number of invalid outlines that are immediately - // rejected in `FT_Outline_Render', limit values to 2^18 pixels - // (i.e., 2^24 bits) - for ( short i = 0; i < n_points; i++ ) - { - if ( points[i].x == LONG_MIN ) - points[i].x = 0; - else if ( points[i].x < 0 ) - points[i].x = -( -points[i].x & 0xFFFFFF ) - 1; - else - points[i].x = ( points[i].x & 0xFFFFFF ) + 1; - - if ( points[i].y == LONG_MIN ) - points[i].y = 0; - else if ( points[i].y < 0 ) - points[i].y = -( -points[i].y & 0xFFFFFF ) - 1; - else - points[i].y = ( points[i].y & 0xFFFFFF ) + 1; - } - - short contours[1]; - contours[0] = n_points - 1; - - FT_Outline outline = - { - 1, // n_contours - n_points, // n_points - points, // points - tags, // tags - contours, // contours - FT_OUTLINE_NONE // flags - }; - - FT_Outline_Get_Bitmap( library, &outline, &bitmap_mono ); - FT_Outline_Get_Bitmap( library, &outline, &bitmap_gray ); - - return 0; - } - - -// END diff --git a/src/3rdparty/freetype/src/tools/ftfuzzer/runinput.cc b/src/3rdparty/freetype/src/tools/ftfuzzer/runinput.cc deleted file mode 100644 index 2b02f575..00000000 --- a/src/3rdparty/freetype/src/tools/ftfuzzer/runinput.cc +++ /dev/null @@ -1,58 +0,0 @@ -// runinput.cc -// -// A `main' function for fuzzers like `ftfuzzer.cc'. -// -// Copyright 2015-2018 by -// David Turner, Robert Wilhelm, and Werner Lemberg. -// -// This file is part of the FreeType project, and may only be used, -// modified, and distributed under the terms of the FreeType project -// license, LICENSE.TXT. By continuing to use, modify, or distribute -// this file you indicate that you have read the license and -// understand and accept it fully. - - -#include -#include -#include -#include -#include - - - extern "C" void - LLVMFuzzerTestOneInput( const uint8_t* data, - size_t size ); - - - unsigned char a[1 << 24]; - - - int - main( int argc, - char* *argv ) - { - assert( argc >= 2 ); - - for ( int i = 1; i < argc; i++ ) - { - fprintf( stderr, "%s\n", argv[i] ); - - FILE* f = fopen( argv[i], "r" ); - assert( f ); - - size_t n = fread( a, 1, sizeof ( a ), f ); - fclose( f ); - if ( !n ) - continue; - - unsigned char* b = (unsigned char*)malloc( n ); - memcpy( b, a, n ); - - LLVMFuzzerTestOneInput( b, n ); - - free( b ); - } - } - - -// END diff --git a/src/3rdparty/freetype/src/tools/ftrandom/Makefile b/src/3rdparty/freetype/src/tools/ftrandom/Makefile deleted file mode 100644 index 24dc49c5..00000000 --- a/src/3rdparty/freetype/src/tools/ftrandom/Makefile +++ /dev/null @@ -1,45 +0,0 @@ -# TOP_DIR and OBJ_DIR should be set by the user to the right directories, -# if necessary. - -TOP_DIR ?= ../../.. -OBJ_DIR ?= $(TOP_DIR)/objs - - -# The setup below is for gcc on a Unix-like platform, -# where FreeType has been set up to create a static library -# (which is the default). - -VPATH = $(OBJ_DIR) \ - $(OBJ_DIR)/.libs - -SRC_DIR = $(TOP_DIR)/src/tools/ftrandom - -CC = gcc -WFLAGS = -Wmissing-prototypes \ - -Wunused \ - -Wimplicit \ - -Wreturn-type \ - -Wparentheses \ - -pedantic \ - -Wformat \ - -Wchar-subscripts \ - -Wsequence-point -CFLAGS = $(WFLAGS) \ - -g -INCLUDES = -I $(TOP_DIR)/include -LDFLAGS = -LIBS = -lm \ - -lz \ - -lpng \ - -lbz2 \ - -lharfbuzz - -all: $(OBJ_DIR)/ftrandom - -$(OBJ_DIR)/ftrandom.o: $(SRC_DIR)/ftrandom.c - $(CC) $(CFLAGS) $(INCLUDES) -c -o $@ $< - -$(OBJ_DIR)/ftrandom: $(OBJ_DIR)/ftrandom.o libfreetype.a - $(CC) $(LDFLAGS) -o $@ $^ $(LIBS) - -# EOF diff --git a/src/3rdparty/freetype/src/tools/ftrandom/ftrandom.c b/src/3rdparty/freetype/src/tools/ftrandom/ftrandom.c index ab5cfc98..ab624297 100644 --- a/src/3rdparty/freetype/src/tools/ftrandom/ftrandom.c +++ b/src/3rdparty/freetype/src/tools/ftrandom/ftrandom.c @@ -45,8 +45,8 @@ #include #include -#include FT_FREETYPE_H -#include FT_OUTLINE_H +#include +#include #define true 1 #define false 0 diff --git a/src/3rdparty/freetype/src/tools/glnames.py b/src/3rdparty/freetype/src/tools/glnames.py index e1b613d1..a19ce178 100644 --- a/src/3rdparty/freetype/src/tools/glnames.py +++ b/src/3rdparty/freetype/src/tools/glnames.py @@ -6,7 +6,7 @@ # -# Copyright (C) 1996-2019 by +# Copyright (C) 1996-2020 by # David Turner, Robert Wilhelm, and Werner Lemberg. # # This file is part of the FreeType project, and may only be used, modified, diff --git a/src/3rdparty/freetype/src/tools/make_distribution_archives.py b/src/3rdparty/freetype/src/tools/make_distribution_archives.py new file mode 100755 index 00000000..f29eb128 --- /dev/null +++ b/src/3rdparty/freetype/src/tools/make_distribution_archives.py @@ -0,0 +1,208 @@ +#!/usr/bin/env python3 +"""Generate distribution archives for a given FreeType 2 release.""" + +from __future__ import print_function + +import argparse +import atexit +import os +import shutil +import subprocess +import sys +import tempfile + +_TOP_DIR = os.path.abspath(os.path.join(__file__, "..", "..", "..")) +_SCRIPT_DIR = os.path.dirname(os.path.join(_TOP_DIR, "builds", "meson", "")) + + +def get_cmd_output(cmd, cwd=None): + """Run a command and return its output as a string.""" + if cwd is not None: + out = subprocess.check_output(cmd, cwd=cwd) + else: + out = subprocess.check_output(cmd) + return out.decode("utf-8").rstrip() + + +def is_git_dir_clean(git_dir): + """Return True iff |git_dir| is a git directory in clean state.""" + out = get_cmd_output(["git", "status", "--porcelain"], cwd=git_dir) + return len(out) == 0 + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + + parser.add_argument( + "--source_dir", default=_TOP_DIR, help="Source directory path." + ) + + parser.add_argument( + "--version", + help=( + "Specify alternate FreeType version (it is otherwise extracted" + " from current sources by default)." + ), + ) + + parser.add_argument( + "--gnu-config-dir", + help=( + "Path of input directory containing recent `config.guess` and" + " `config.sub` files from GNU config." + ), + ) + + parser.add_argument( + "--build-dir", + help="Specify build directory. Only used for debugging this script.", + ) + + parser.add_argument( + "--ignore-clean-check", + action="store_true", + help=( + "Do not check for a clean source git repository. Only used for" + " debugging this script." + ), + ) + + parser.add_argument( + "output_dir", help="Output directory for generated archives." + ) + + args = parser.parse_args() + + git_dir = args.source_dir if args.source_dir else _TOP_DIR + if not args.ignore_clean_check and not is_git_dir_clean(git_dir): + sys.stderr.write( + "ERROR: Your git repository is not in a clean state: %s\n" + % git_dir + ) + return 1 + + if args.version: + version = args.version + else: + # Extract FreeType version from sources. + version = get_cmd_output( + [ + sys.executable, + os.path.join(_SCRIPT_DIR, "extract_freetype_version.py"), + os.path.join(_TOP_DIR, "include", "freetype", "freetype.h"), + ] + ) + + # Determine the build directory. This will be a temporary file that is + # cleaned up on script exit by default, unless --build-dir=DIR is used, + # in which case we only create and empty the directory, but never remove + # its content on exit. + if args.build_dir: + build_dir = args.build_dir + if not os.path.exists(build_dir): + os.makedirs(build_dir) + else: + # Remove anything from the build directory, if any. + for item in os.listdir(build_dir): + file_path = os.path.join(build_dir, item) + if os.path.isdir(file_path): + shutil.rmtree(file_path) + else: + os.unlink(file_path) + else: + # Create a temporary directory, and ensure it is removed on exit. + build_dir = tempfile.mkdtemp(prefix="freetype-dist-") + + def clean_build_dir(): + shutil.rmtree(build_dir) + + atexit.register(clean_build_dir) + + # Copy all source files known to git into $BUILD_DIR/freetype-$VERSION + # with the exception of .gitignore and .mailmap files. + source_files = [ + f + for f in get_cmd_output(["git", "ls-files"], cwd=git_dir).split("\n") + if os.path.basename(f) not in (".gitignore", ".mailmap") + ] + + freetype_dir = "freetype-" + version + tmp_src_dir = os.path.join(build_dir, freetype_dir) + os.makedirs(tmp_src_dir) + + for src in source_files: + dst = os.path.join(tmp_src_dir, src) + dst_dir = os.path.dirname(dst) + if not os.path.exists(dst_dir): + os.makedirs(dst_dir) + shutil.copy(os.path.join(git_dir, src), dst) + + # Run autogen.sh in directory. + subprocess.check_call(["/bin/sh", "autogen.sh"], cwd=tmp_src_dir) + shutil.rmtree( + os.path.join(tmp_src_dir, "builds", "unix", "autom4te.cache") + ) + + # Copy config.guess and config.sub if possible! + if args.gnu_config_dir: + for f in ("config.guess", "config.sub"): + shutil.copy( + os.path.join(args.gnu_config_dir, f), + os.path.join(tmp_src_dir, "builds", "unix", f), + ) + + # Generate reference documentation under docs/ + subprocess.check_call( + [ + sys.executable, + os.path.join(_SCRIPT_DIR, "generate_reference_docs.py"), + "--input-dir", + tmp_src_dir, + "--version", + version, + "--output-dir", + os.path.join(tmp_src_dir, "docs"), + ] + ) + + shutil.rmtree(os.path.join(tmp_src_dir, "docs", "markdown")) + os.unlink(os.path.join(tmp_src_dir, "docs", "mkdocs.yml")) + + # Generate our archives + freetype_tar = freetype_dir + ".tar" + + subprocess.check_call( + ["tar", "-H", "ustar", "-chf", freetype_tar, freetype_dir], + cwd=build_dir, + ) + + subprocess.check_call( + ["gzip", "-9", "--keep", freetype_tar], cwd=build_dir + ) + + subprocess.check_call(["xz", "--keep", freetype_tar], cwd=build_dir) + + ftwinversion = "ft" + "".join(version.split(".")) + subprocess.check_call( + ["zip", "-qlr9", ftwinversion + ".zip", freetype_dir], cwd=build_dir + ) + + # Copy file to output directory now. + if not os.path.exists(args.output_dir): + os.makedirs(args.output_dir) + + for f in ( + freetype_tar + ".gz", + freetype_tar + ".xz", + ftwinversion + ".zip", + ): + shutil.copy( + os.path.join(build_dir, f), os.path.join(args.output_dir, f) + ) + + # Done! + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/src/3rdparty/freetype/src/tools/test_afm.c b/src/3rdparty/freetype/src/tools/test_afm.c index 8de619bb..a4b22689 100644 --- a/src/3rdparty/freetype/src/tools/test_afm.c +++ b/src/3rdparty/freetype/src/tools/test_afm.c @@ -2,10 +2,9 @@ * gcc -DFT2_BUILD_LIBRARY -I../../include -o test_afm test_afm.c \ * -L../../objs/.libs -lfreetype -lz -static */ -#include -#include FT_FREETYPE_H -#include FT_INTERNAL_STREAM_H -#include FT_INTERNAL_POSTSCRIPT_AUX_H +#include +#include +#include void dump_fontinfo( AFM_FontInfo fi ) { diff --git a/src/3rdparty/freetype/src/tools/test_bbox.c b/src/3rdparty/freetype/src/tools/test_bbox.c index 64b82c38..d9fd9329 100644 --- a/src/3rdparty/freetype/src/tools/test_bbox.c +++ b/src/3rdparty/freetype/src/tools/test_bbox.c @@ -1,6 +1,5 @@ -#include -#include FT_FREETYPE_H -#include FT_BBOX_H +#include +#include #include /* for clock() */ diff --git a/src/3rdparty/freetype/src/tools/test_trig.c b/src/3rdparty/freetype/src/tools/test_trig.c index 99ac1cf1..4f3410ab 100644 --- a/src/3rdparty/freetype/src/tools/test_trig.c +++ b/src/3rdparty/freetype/src/tools/test_trig.c @@ -1,6 +1,5 @@ -#include -#include FT_FREETYPE_H -#include FT_TRIGONOMETRY_H +#include +#include #include #include diff --git a/src/3rdparty/freetype/src/tools/update-copyright b/src/3rdparty/freetype/src/tools/update-copyright old mode 100644 new mode 100755 diff --git a/src/3rdparty/freetype/src/tools/update-copyright-year b/src/3rdparty/freetype/src/tools/update-copyright-year old mode 100644 new mode 100755 index 2ae50d6f..c659bbaf --- a/src/3rdparty/freetype/src/tools/update-copyright-year +++ b/src/3rdparty/freetype/src/tools/update-copyright-year @@ -2,7 +2,7 @@ eval '(exit $?0)' && eval 'exec perl -wS -i "$0" ${1+"$@"}' & eval 'exec perl -wS -i "$0" $argv:q' if 0; -# Copyright (C) 2015-2019 by +# Copyright (C) 2015-2020 by # Werner Lemberg. # # This file is part of the FreeType project, and may only be used, modified, diff --git a/src/3rdparty/freetype/src/truetype/Jamfile b/src/3rdparty/freetype/src/truetype/Jamfile deleted file mode 100644 index 2de63a7b..00000000 --- a/src/3rdparty/freetype/src/truetype/Jamfile +++ /dev/null @@ -1,37 +0,0 @@ -# FreeType 2 src/truetype Jamfile -# -# Copyright (C) 2001-2019 by -# David Turner, Robert Wilhelm, and Werner Lemberg. -# -# This file is part of the FreeType project, and may only be used, modified, -# and distributed under the terms of the FreeType project license, -# LICENSE.TXT. By continuing to use, modify, or distribute this file you -# indicate that you have read the license and understand and accept it -# fully. - -SubDir FT2_TOP $(FT2_SRC_DIR) truetype ; - -{ - local _sources ; - - if $(FT2_MULTI) - { - _sources = ttdriver - ttgload - ttgxvar - ttinterp - ttobjs - ttpic - ttpload - ttsubpix - ; - } - else - { - _sources = truetype ; - } - - Library $(FT2_LIB) : $(_sources).c ; -} - -# end of src/truetype Jamfile diff --git a/src/3rdparty/freetype/src/truetype/module.mk b/src/3rdparty/freetype/src/truetype/module.mk index 8a841cc9..2d8d39d1 100644 --- a/src/3rdparty/freetype/src/truetype/module.mk +++ b/src/3rdparty/freetype/src/truetype/module.mk @@ -3,7 +3,7 @@ # -# Copyright (C) 1996-2019 by +# Copyright (C) 1996-2020 by # David Turner, Robert Wilhelm, and Werner Lemberg. # # This file is part of the FreeType project, and may only be used, modified, diff --git a/src/3rdparty/freetype/src/truetype/rules.mk b/src/3rdparty/freetype/src/truetype/rules.mk index df8dcd4a..2f6fecfc 100644 --- a/src/3rdparty/freetype/src/truetype/rules.mk +++ b/src/3rdparty/freetype/src/truetype/rules.mk @@ -3,7 +3,7 @@ # -# Copyright (C) 1996-2019 by +# Copyright (C) 1996-2020 by # David Turner, Robert Wilhelm, and Werner Lemberg. # # This file is part of the FreeType project, and may only be used, modified, diff --git a/src/3rdparty/freetype/src/truetype/truetype.c b/src/3rdparty/freetype/src/truetype/truetype.c index 84928e73..41b6808a 100644 --- a/src/3rdparty/freetype/src/truetype/truetype.c +++ b/src/3rdparty/freetype/src/truetype/truetype.c @@ -4,7 +4,7 @@ * * FreeType TrueType driver component (body only). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -17,7 +17,6 @@ #define FT_MAKE_OPTION_SINGLE_OBJECT -#include #include "ttdriver.c" /* driver interface */ #include "ttgload.c" /* glyph loader */ diff --git a/src/3rdparty/freetype/src/truetype/ttdriver.c b/src/3rdparty/freetype/src/truetype/ttdriver.c index ff626d53..bf830b14 100644 --- a/src/3rdparty/freetype/src/truetype/ttdriver.c +++ b/src/3rdparty/freetype/src/truetype/ttdriver.c @@ -4,7 +4,7 @@ * * TrueType font driver implementation (body). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -16,22 +16,21 @@ */ -#include -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_STREAM_H -#include FT_INTERNAL_SFNT_H -#include FT_SERVICE_FONT_FORMAT_H +#include +#include +#include +#include #ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT -#include FT_MULTIPLE_MASTERS_H -#include FT_SERVICE_MULTIPLE_MASTERS_H -#include FT_SERVICE_METRICS_VARIATIONS_H +#include +#include +#include #endif -#include FT_SERVICE_TRUETYPE_ENGINE_H -#include FT_SERVICE_TRUETYPE_GLYF_H -#include FT_SERVICE_PROPERTIES_H -#include FT_DRIVER_H +#include +#include +#include +#include #include "ttdriver.h" #include "ttgload.h" diff --git a/src/3rdparty/freetype/src/truetype/ttdriver.h b/src/3rdparty/freetype/src/truetype/ttdriver.h index 3936c6a4..ee1438eb 100644 --- a/src/3rdparty/freetype/src/truetype/ttdriver.h +++ b/src/3rdparty/freetype/src/truetype/ttdriver.h @@ -4,7 +4,7 @@ * * High-level TrueType driver interface (specification). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -20,8 +20,7 @@ #define TTDRIVER_H_ -#include -#include FT_INTERNAL_DRIVER_H +#include FT_BEGIN_HEADER diff --git a/src/3rdparty/freetype/src/truetype/tterrors.h b/src/3rdparty/freetype/src/truetype/tterrors.h index 5609d28d..efeafd3a 100644 --- a/src/3rdparty/freetype/src/truetype/tterrors.h +++ b/src/3rdparty/freetype/src/truetype/tterrors.h @@ -4,7 +4,7 @@ * * TrueType error codes (specification only). * - * Copyright (C) 2001-2019 by + * Copyright (C) 2001-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -26,7 +26,7 @@ #ifndef TTERRORS_H_ #define TTERRORS_H_ -#include FT_MODULE_ERRORS_H +#include #undef FTERRORS_H_ @@ -34,7 +34,7 @@ #define FT_ERR_PREFIX TT_Err_ #define FT_ERR_BASE FT_Mod_Err_TrueType -#include FT_ERRORS_H +#include #endif /* TTERRORS_H_ */ diff --git a/src/3rdparty/freetype/src/truetype/ttgload.c b/src/3rdparty/freetype/src/truetype/ttgload.c index a0468408..1dd319dc 100644 --- a/src/3rdparty/freetype/src/truetype/ttgload.c +++ b/src/3rdparty/freetype/src/truetype/ttgload.c @@ -4,7 +4,7 @@ * * TrueType Glyph Loader (body). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -17,15 +17,15 @@ #include -#include FT_INTERNAL_DEBUG_H +#include #include FT_CONFIG_CONFIG_H -#include FT_INTERNAL_CALC_H -#include FT_INTERNAL_STREAM_H -#include FT_INTERNAL_SFNT_H -#include FT_TRUETYPE_TAGS_H -#include FT_OUTLINE_H -#include FT_DRIVER_H -#include FT_LIST_H +#include +#include +#include +#include +#include +#include +#include #include "ttgload.h" #include "ttpload.h" @@ -60,7 +60,7 @@ #define SAME_X 0x10 #define Y_POSITIVE 0x20 /* two meanings depending on Y_SHORT_VECTOR */ #define SAME_Y 0x20 -#define OVERLAP_SIMPLE 0x40 /* we ignore this value */ +#define OVERLAP_SIMPLE 0x40 /* retained as FT_OUTLINE_OVERLAP */ /************************************************************************** @@ -77,7 +77,7 @@ #define WE_HAVE_A_2X2 0x0080 #define WE_HAVE_INSTR 0x0100 #define USE_MY_METRICS 0x0200 -#define OVERLAP_COMPOUND 0x0400 /* we ignore this value */ +#define OVERLAP_COMPOUND 0x0400 /* retained as FT_OUTLINE_OVERLAP */ #define SCALED_COMPONENT_OFFSET 0x0800 #define UNSCALED_COMPONENT_OFFSET 0x1000 @@ -137,6 +137,11 @@ face->horizontal.Descender ); } +#ifdef FT_DEBUG_LEVEL_TRACE + if ( !face->vertical_info ) + FT_TRACE5(( " [vertical metrics missing, computing values]\n" )); +#endif + FT_TRACE5(( " advance height (font units): %d\n", *ah )); FT_TRACE5(( " top side bearing (font units): %d\n", *tsb )); } @@ -333,9 +338,9 @@ loader->bbox.yMax = FT_NEXT_SHORT( p ); FT_TRACE5(( " # of contours: %d\n", loader->n_contours )); - FT_TRACE5(( " xMin: %4d xMax: %4d\n", loader->bbox.xMin, + FT_TRACE5(( " xMin: %4ld xMax: %4ld\n", loader->bbox.xMin, loader->bbox.xMax )); - FT_TRACE5(( " yMin: %4d yMax: %4d\n", loader->bbox.yMin, + FT_TRACE5(( " yMin: %4ld yMax: %4ld\n", loader->bbox.yMin, loader->bbox.yMax )); loader->cursor = p; @@ -489,6 +494,10 @@ } } + /* retain the overlap flag */ + if ( n_points && outline->tags[0] & OVERLAP_SIMPLE ) + gloader->base.outline.flags |= FT_OUTLINE_OVERLAP; + /* reading the X coordinates */ vec = outline->points; @@ -1102,9 +1111,16 @@ } #ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT - /* if we have a HVAR table, `pp1' and/or `pp2' are already adjusted */ - if ( !( loader->face->variation_support & TT_FACE_FLAG_VAR_HADVANCE ) || - !IS_HINTED( loader->load_flags ) ) + /* if we have a HVAR table, `pp1' and/or `pp2' */ + /* are already adjusted but unscaled */ + if ( ( loader->face->variation_support & TT_FACE_FLAG_VAR_HADVANCE ) && + IS_HINTED( loader->load_flags ) ) + { + loader->pp1.x = FT_MulFix( loader->pp1.x, x_scale ); + loader->pp2.x = FT_MulFix( loader->pp2.x, x_scale ); + /* pp1.y and pp2.y are always zero */ + } + else #endif { loader->pp1 = outline->points[n_points - 4]; @@ -1112,9 +1128,17 @@ } #ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT - /* if we have a VVAR table, `pp3' and/or `pp4' are already adjusted */ - if ( !( loader->face->variation_support & TT_FACE_FLAG_VAR_VADVANCE ) || - !IS_HINTED( loader->load_flags ) ) + /* if we have a VVAR table, `pp3' and/or `pp4' */ + /* are already adjusted but unscaled */ + if ( ( loader->face->variation_support & TT_FACE_FLAG_VAR_VADVANCE ) && + IS_HINTED( loader->load_flags ) ) + { + loader->pp3.x = FT_MulFix( loader->pp3.x, x_scale ); + loader->pp3.y = FT_MulFix( loader->pp3.y, y_scale ); + loader->pp4.x = FT_MulFix( loader->pp4.x, x_scale ); + loader->pp4.y = FT_MulFix( loader->pp4.y, y_scale ); + } + else #endif { loader->pp3 = outline->points[n_points - 2]; @@ -2168,6 +2192,11 @@ goto Exit; } } + + /* retain the overlap flag */ + if ( gloader->base.num_subglyphs && + gloader->base.subglyphs[0].flags & OVERLAP_COMPOUND ) + gloader->base.outline.flags |= FT_OUTLINE_OVERLAP; } /***********************************************************************/ @@ -2287,13 +2316,14 @@ if ( face->vertical_info && face->vertical.number_Of_VMetrics > 0 ) { - top = (FT_Short)FT_DivFix( loader->pp3.y - bbox.yMax, + top = (FT_Short)FT_DivFix( SUB_LONG( loader->pp3.y, bbox.yMax ), y_scale ); if ( loader->pp3.y <= loader->pp4.y ) advance = 0; else - advance = (FT_UShort)FT_DivFix( loader->pp3.y - loader->pp4.y, + advance = (FT_UShort)FT_DivFix( SUB_LONG( loader->pp3.y, + loader->pp4.y ), y_scale ); } else @@ -2965,8 +2995,6 @@ error = compute_glyph_metrics( &loader, glyph_index ); } - tt_loader_done( &loader ); - /* Set the `high precision' bit flag. */ /* This is _critical_ to get correct output for monochrome */ /* TrueType glyphs at all sizes using the bytecode interpreter. */ @@ -2975,6 +3003,15 @@ size->metrics->y_ppem < 24 ) glyph->outline.flags |= FT_OUTLINE_HIGH_PRECISION; + FT_TRACE1(( " subglyphs = %u, contours = %hd, points = %hd," + " flags = 0x%.3x\n", + loader.gloader->base.num_subglyphs, + glyph->outline.n_contours, + glyph->outline.n_points, + glyph->outline.flags )); + + tt_loader_done( &loader ); + Exit: #ifdef FT_DEBUG_LEVEL_TRACE if ( error ) diff --git a/src/3rdparty/freetype/src/truetype/ttgload.h b/src/3rdparty/freetype/src/truetype/ttgload.h index f1324bc8..8f72cd55 100644 --- a/src/3rdparty/freetype/src/truetype/ttgload.h +++ b/src/3rdparty/freetype/src/truetype/ttgload.h @@ -4,7 +4,7 @@ * * TrueType Glyph Loader (specification). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -20,7 +20,6 @@ #define TTGLOAD_H_ -#include #include "ttobjs.h" #ifdef TT_USE_BYTECODE_INTERPRETER diff --git a/src/3rdparty/freetype/src/truetype/ttgxvar.c b/src/3rdparty/freetype/src/truetype/ttgxvar.c index 78d87dc0..b462263d 100644 --- a/src/3rdparty/freetype/src/truetype/ttgxvar.c +++ b/src/3rdparty/freetype/src/truetype/ttgxvar.c @@ -4,7 +4,7 @@ * * TrueType GX Font Variation loader * - * Copyright (C) 2004-2019 by + * Copyright (C) 2004-2020 by * David Turner, Robert Wilhelm, Werner Lemberg, and George Williams. * * This file is part of the FreeType project, and may only be used, @@ -40,14 +40,14 @@ #include -#include FT_INTERNAL_DEBUG_H +#include #include FT_CONFIG_CONFIG_H -#include FT_INTERNAL_STREAM_H -#include FT_INTERNAL_SFNT_H -#include FT_TRUETYPE_TAGS_H -#include FT_TRUETYPE_IDS_H -#include FT_MULTIPLE_MASTERS_H -#include FT_LIST_H +#include +#include +#include +#include +#include +#include #include "ttpload.h" #include "ttgxvar.h" @@ -1470,6 +1470,7 @@ FT_ULong table_len; FT_ULong gvar_start; FT_ULong offsetToData; + FT_ULong offsets_len; GX_GVar_Head gvar_head; static const FT_Frame_Field gvar_fields[] = @@ -1530,9 +1531,13 @@ goto Exit; } - /* rough sanity check: offsets can be either 2 or 4 bytes */ - if ( (FT_ULong)gvar_head.glyphCount * - ( ( gvar_head.flags & 1 ) ? 4 : 2 ) > table_len ) + /* offsets can be either 2 or 4 bytes */ + /* (one more offset than glyphs, to mark size of last) */ + offsets_len = ( gvar_head.glyphCount + 1 ) * + ( ( gvar_head.flags & 1 ) ? 4L : 2L ); + + /* rough sanity check */ + if (offsets_len > table_len ) { FT_TRACE1(( "ft_var_load_gvar: invalid number of glyphs\n" )); error = FT_THROW( Invalid_Table ); @@ -1541,81 +1546,102 @@ FT_TRACE2(( "loaded\n" )); - blend->gvar_size = table_len; - blend->tuplecount = gvar_head.globalCoordCount; - blend->gv_glyphcnt = gvar_head.glyphCount; - offsetToData = gvar_start + gvar_head.offsetToData; + blend->gvar_size = table_len; + offsetToData = gvar_start + gvar_head.offsetToData; FT_TRACE5(( "gvar: there %s %d shared coordinate%s:\n", - blend->tuplecount == 1 ? "is" : "are", - blend->tuplecount, - blend->tuplecount == 1 ? "" : "s" )); + gvar_head.globalCoordCount == 1 ? "is" : "are", + gvar_head.globalCoordCount, + gvar_head.globalCoordCount == 1 ? "" : "s" )); - if ( FT_NEW_ARRAY( blend->glyphoffsets, blend->gv_glyphcnt + 1 ) ) + if ( FT_FRAME_ENTER( offsets_len ) ) goto Exit; + /* offsets (one more offset than glyphs, to mark size of last) */ + if ( FT_NEW_ARRAY( blend->glyphoffsets, gvar_head.glyphCount + 1 ) ) + goto Fail2; + if ( gvar_head.flags & 1 ) { - FT_ULong limit = gvar_start + table_len; + FT_ULong limit = gvar_start + table_len; + FT_ULong max_offset = 0; - /* long offsets (one more offset than glyphs, to mark size of last) */ - if ( FT_FRAME_ENTER( ( blend->gv_glyphcnt + 1 ) * 4L ) ) - goto Exit; - - for ( i = 0; i <= blend->gv_glyphcnt; i++ ) + for ( i = 0; i <= gvar_head.glyphCount; i++ ) { blend->glyphoffsets[i] = offsetToData + FT_GET_ULONG(); - /* use `>', not `>=' */ - if ( blend->glyphoffsets[i] > limit ) + + if ( max_offset <= blend->glyphoffsets[i] ) + max_offset = blend->glyphoffsets[i]; + else { FT_TRACE2(( "ft_var_load_gvar:" - " invalid glyph variation data offset for index %d\n", + " glyph variation data offset %d not monotonic\n", i )); - error = FT_THROW( Invalid_Table ); - break; + blend->glyphoffsets[i] = max_offset; + } + + /* use `<', not `<=' */ + if ( limit < blend->glyphoffsets[i] ) + { + FT_TRACE2(( "ft_var_load_gvar:" + " glyph variation data offset %d out of range\n", + i )); + blend->glyphoffsets[i] = limit; } } } else { - FT_ULong limit = gvar_start + table_len; + FT_ULong limit = gvar_start + table_len; + FT_ULong max_offset = 0; - /* short offsets (one more offset than glyphs, to mark size of last) */ - if ( FT_FRAME_ENTER( ( blend->gv_glyphcnt + 1 ) * 2L ) ) - goto Exit; - - for ( i = 0; i <= blend->gv_glyphcnt; i++ ) + for ( i = 0; i <= gvar_head.glyphCount; i++ ) { blend->glyphoffsets[i] = offsetToData + FT_GET_USHORT() * 2; - /* use `>', not `>=' */ - if ( blend->glyphoffsets[i] > limit ) + + if ( max_offset <= blend->glyphoffsets[i] ) + max_offset = blend->glyphoffsets[i]; + else { FT_TRACE2(( "ft_var_load_gvar:" - " invalid glyph variation data offset for index %d\n", + " glyph variation data offset %d not monotonic\n", i )); - error = FT_THROW( Invalid_Table ); - break; + blend->glyphoffsets[i] = max_offset; + } + + /* use `<', not `<=' */ + if ( limit < blend->glyphoffsets[i] ) + { + FT_TRACE2(( "ft_var_load_gvar:" + " glyph variation data offset %d out of range\n", + i )); + blend->glyphoffsets[i] = limit; } } } + blend->gv_glyphcnt = gvar_head.glyphCount; + FT_FRAME_EXIT(); - if ( error ) - goto Exit; - if ( blend->tuplecount != 0 ) + if ( gvar_head.globalCoordCount != 0 ) { + if ( FT_STREAM_SEEK( gvar_start + gvar_head.offsetToCoord ) || + FT_FRAME_ENTER( gvar_head.globalCoordCount * + gvar_head.axisCount * 2L ) ) + { + FT_TRACE2(( "ft_var_load_gvar:" + " glyph variation shared tuples missing\n" )); + goto Fail; + } + if ( FT_NEW_ARRAY( blend->tuplecoords, - gvar_head.axisCount * blend->tuplecount ) ) - goto Exit; + gvar_head.axisCount * gvar_head.globalCoordCount ) ) + goto Fail2; - if ( FT_STREAM_SEEK( gvar_start + gvar_head.offsetToCoord ) || - FT_FRAME_ENTER( blend->tuplecount * gvar_head.axisCount * 2L ) ) - goto Exit; - - for ( i = 0; i < blend->tuplecount; i++ ) + for ( i = 0; i < gvar_head.globalCoordCount; i++ ) { FT_TRACE5(( " [ " )); for ( j = 0; j < (FT_UInt)gvar_head.axisCount; j++ ) @@ -1628,6 +1654,8 @@ FT_TRACE5(( "]\n" )); } + blend->tuplecount = gvar_head.globalCoordCount; + FT_TRACE5(( "\n" )); FT_FRAME_EXIT(); @@ -1635,6 +1663,14 @@ Exit: return error; + + Fail2: + FT_FRAME_EXIT(); + + Fail: + FT_FREE( blend->glyphoffsets ); + blend->gv_glyphcnt = 0; + goto Exit; } @@ -1693,7 +1729,7 @@ if ( tuple_coords[i] == 0 ) { - FT_TRACE6(( " tuple coordinate is zero, ignore\n", i )); + FT_TRACE6(( " tuple coordinate is zero, ignore\n" )); continue; } @@ -2127,7 +2163,7 @@ /* `fvar' table validity check in `sfnt_init_face' */ /* the various `*_size' variables, which we also use as */ - /* offsets into the `mmlen' array, must be multiples of the */ + /* offsets into the `mmvar' array, must be multiples of the */ /* pointer size (except the last one); without such an */ /* alignment there might be runtime errors due to */ /* misaligned addresses */ @@ -3037,7 +3073,7 @@ TT_Set_Named_Instance( TT_Face face, FT_UInt instance_index ) { - FT_Error error = FT_ERR( Invalid_Argument ); + FT_Error error; GX_Blend blend; FT_MM_Var* mmvar; @@ -3057,7 +3093,10 @@ /* `instance_index' starts with value 1, thus `>' */ if ( instance_index > num_instances ) + { + error = FT_ERR( Invalid_Argument ); goto Exit; + } if ( instance_index > 0 ) { @@ -3766,7 +3805,7 @@ blend->glyphoffsets[glyph_index + 1] ) { FT_TRACE2(( "TT_Vary_Apply_Glyph_Deltas:" - " no variation data for this glyph\n" )); + " no variation data for glyph %d\n", glyph_index )); return FT_Err_Ok; } diff --git a/src/3rdparty/freetype/src/truetype/ttgxvar.h b/src/3rdparty/freetype/src/truetype/ttgxvar.h index 07c99b64..26e89bcf 100644 --- a/src/3rdparty/freetype/src/truetype/ttgxvar.h +++ b/src/3rdparty/freetype/src/truetype/ttgxvar.h @@ -4,7 +4,7 @@ * * TrueType GX Font Variation loader (specification) * - * Copyright (C) 2004-2019 by + * Copyright (C) 2004-2020 by * David Turner, Robert Wilhelm, Werner Lemberg and George Williams. * * This file is part of the FreeType project, and may only be used, @@ -20,7 +20,6 @@ #define TTGXVAR_H_ -#include #include "ttobjs.h" diff --git a/src/3rdparty/freetype/src/truetype/ttinterp.c b/src/3rdparty/freetype/src/truetype/ttinterp.c index 70434e17..0c3cb10a 100644 --- a/src/3rdparty/freetype/src/truetype/ttinterp.c +++ b/src/3rdparty/freetype/src/truetype/ttinterp.c @@ -4,7 +4,7 @@ * * TrueType bytecode interpreter (body). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -20,13 +20,12 @@ /* issues; many thanks! */ -#include -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_CALC_H -#include FT_TRIGONOMETRY_H -#include FT_SYSTEM_H -#include FT_DRIVER_H -#include FT_MULTIPLE_MASTERS_H +#include +#include +#include +#include +#include +#include #include "ttinterp.h" #include "tterrors.h" @@ -294,7 +293,7 @@ FT_Error error; - FT_TRACE1(( "Init_Context: new object at 0x%08p\n", exec )); + FT_TRACE1(( "Init_Context: new object at %p\n", (void *)exec )); exec->memory = memory; exec->callSize = 32; @@ -319,7 +318,7 @@ return FT_Err_Ok; Fail_Memory: - FT_ERROR(( "Init_Context: not enough memory for %p\n", exec )); + FT_ERROR(( "Init_Context: not enough memory for %p\n", (void *)exec )); TT_Done_Context( exec ); return error; @@ -1956,8 +1955,8 @@ * distance :: * The distance (not) to round. * - * compensation :: - * The engine compensation. + * color :: + * The engine compensation color. * * @Return: * The compensated distance. @@ -1965,12 +1964,11 @@ static FT_F26Dot6 Round_None( TT_ExecContext exc, FT_F26Dot6 distance, - FT_F26Dot6 compensation ) + FT_Int color ) { + FT_F26Dot6 compensation = exc->tt_metrics.compensations[color]; FT_F26Dot6 val; - FT_UNUSED( exc ); - if ( distance >= 0 ) { @@ -2000,8 +1998,8 @@ * distance :: * The distance to round. * - * compensation :: - * The engine compensation. + * color :: + * The engine compensation color. * * @Return: * Rounded distance. @@ -2009,12 +2007,11 @@ static FT_F26Dot6 Round_To_Grid( TT_ExecContext exc, FT_F26Dot6 distance, - FT_F26Dot6 compensation ) + FT_Int color ) { + FT_F26Dot6 compensation = exc->tt_metrics.compensations[color]; FT_F26Dot6 val; - FT_UNUSED( exc ); - if ( distance >= 0 ) { @@ -2046,8 +2043,8 @@ * distance :: * The distance to round. * - * compensation :: - * The engine compensation. + * color :: + * The engine compensation color. * * @Return: * Rounded distance. @@ -2055,12 +2052,11 @@ static FT_F26Dot6 Round_To_Half_Grid( TT_ExecContext exc, FT_F26Dot6 distance, - FT_F26Dot6 compensation ) + FT_Int color ) { + FT_F26Dot6 compensation = exc->tt_metrics.compensations[color]; FT_F26Dot6 val; - FT_UNUSED( exc ); - if ( distance >= 0 ) { @@ -2094,8 +2090,8 @@ * distance :: * The distance to round. * - * compensation :: - * The engine compensation. + * color :: + * The engine compensation color. * * @Return: * Rounded distance. @@ -2103,12 +2099,11 @@ static FT_F26Dot6 Round_Down_To_Grid( TT_ExecContext exc, FT_F26Dot6 distance, - FT_F26Dot6 compensation ) + FT_Int color ) { + FT_F26Dot6 compensation = exc->tt_metrics.compensations[color]; FT_F26Dot6 val; - FT_UNUSED( exc ); - if ( distance >= 0 ) { @@ -2139,8 +2134,8 @@ * distance :: * The distance to round. * - * compensation :: - * The engine compensation. + * color :: + * The engine compensation color. * * @Return: * Rounded distance. @@ -2148,12 +2143,11 @@ static FT_F26Dot6 Round_Up_To_Grid( TT_ExecContext exc, FT_F26Dot6 distance, - FT_F26Dot6 compensation ) + FT_Int color ) { + FT_F26Dot6 compensation = exc->tt_metrics.compensations[color]; FT_F26Dot6 val; - FT_UNUSED( exc ); - if ( distance >= 0 ) { @@ -2185,8 +2179,8 @@ * distance :: * The distance to round. * - * compensation :: - * The engine compensation. + * color :: + * The engine compensation color. * * @Return: * Rounded distance. @@ -2194,12 +2188,11 @@ static FT_F26Dot6 Round_To_Double_Grid( TT_ExecContext exc, FT_F26Dot6 distance, - FT_F26Dot6 compensation ) + FT_Int color ) { + FT_F26Dot6 compensation = exc->tt_metrics.compensations[color]; FT_F26Dot6 val; - FT_UNUSED( exc ); - if ( distance >= 0 ) { @@ -2231,8 +2224,8 @@ * distance :: * The distance to round. * - * compensation :: - * The engine compensation. + * color :: + * The engine compensation color. * * @Return: * Rounded distance. @@ -2246,8 +2239,9 @@ static FT_F26Dot6 Round_Super( TT_ExecContext exc, FT_F26Dot6 distance, - FT_F26Dot6 compensation ) + FT_Int color ) { + FT_F26Dot6 compensation = exc->tt_metrics.compensations[color]; FT_F26Dot6 val; @@ -2286,8 +2280,8 @@ * distance :: * The distance to round. * - * compensation :: - * The engine compensation. + * color :: + * The engine compensation color. * * @Return: * Rounded distance. @@ -2299,8 +2293,9 @@ static FT_F26Dot6 Round_Super_45( TT_ExecContext exc, FT_F26Dot6 distance, - FT_F26Dot6 compensation ) + FT_Int color ) { + FT_F26Dot6 compensation = exc->tt_metrics.compensations[color]; FT_F26Dot6 val; @@ -2899,7 +2894,7 @@ Ins_ODD( TT_ExecContext exc, FT_Long* args ) { - args[0] = ( ( exc->func_round( exc, args[0], 0 ) & 127 ) == 64 ); + args[0] = ( ( exc->func_round( exc, args[0], 3 ) & 127 ) == 64 ); } @@ -2913,7 +2908,7 @@ Ins_EVEN( TT_ExecContext exc, FT_Long* args ) { - args[0] = ( ( exc->func_round( exc, args[0], 0 ) & 127 ) == 0 ); + args[0] = ( ( exc->func_round( exc, args[0], 3 ) & 127 ) == 0 ); } @@ -3243,10 +3238,7 @@ Ins_ROUND( TT_ExecContext exc, FT_Long* args ) { - args[0] = exc->func_round( - exc, - args[0], - exc->tt_metrics.compensations[exc->opcode - 0x68] ); + args[0] = exc->func_round( exc, args[0], exc->opcode & 3 ); } @@ -3260,10 +3252,7 @@ Ins_NROUND( TT_ExecContext exc, FT_Long* args ) { - args[0] = Round_None( - exc, - args[0], - exc->tt_metrics.compensations[exc->opcode - 0x6C] ); + args[0] = Round_None( exc, args[0], exc->opcode & 3 ); } @@ -3718,7 +3707,7 @@ /* We will then parse the current table. */ rec = exc->FDefs; - limit = rec + exc->numFDefs; + limit = FT_OFFSET( rec, exc->numFDefs ); n = (FT_ULong)args[0]; for ( ; rec < limit; rec++ ) @@ -3965,6 +3954,9 @@ if ( BOUNDSL( F, exc->maxFunc + 1 ) ) goto Fail; + if ( !exc->FDefs ) + goto Fail; + /* Except for some old Apple fonts, all functions in a TrueType */ /* font are defined in increasing order, starting from 0. This */ /* means that we normally have */ @@ -4062,7 +4054,7 @@ /* */ /* If this isn't true, we need to look up the function table. */ - def = exc->FDefs + F; + def = FT_OFFSET( exc->FDefs, F ); if ( exc->maxFunc + 1 != exc->numFDefs || def->opc != F ) { /* look up the FDefs table */ @@ -4070,7 +4062,7 @@ def = exc->FDefs; - limit = def + exc->numFDefs; + limit = FT_OFFSET( def, exc->numFDefs ); while ( def < limit && def->opc != F ) def++; @@ -4150,7 +4142,7 @@ /* First of all, look for the same function in our table */ def = exc->IDefs; - limit = def + exc->numIDefs; + limit = FT_OFFSET( def, exc->numIDefs ); for ( ; def < limit; def++ ) if ( def->opc == (FT_ULong)args[0] ) @@ -5730,9 +5722,6 @@ { FT_F26Dot6 dx, dy; FT_UShort point; -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - FT_Int B1, B2; -#endif #ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL FT_Bool in_twilight = FT_BOOL( exc->GS.gep0 == 0 || exc->GS.gep1 == 0 || @@ -5767,8 +5756,12 @@ } else #ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - if ( SUBPIXEL_HINTING_INFINALITY ) + if ( SUBPIXEL_HINTING_INFINALITY && + exc->ignore_x_mode ) { + FT_Int B1, B2; + + /* If not using ignore_x_mode rendering, allow ZP2 move. */ /* If inline deltas aren't allowed, skip ZP2 move. */ /* If using ignore_x_mode rendering, allow ZP2 point move if: */ @@ -5777,72 +5770,57 @@ /* - the glyph is specifically set to allow SHPIX moves */ /* - the move is on a previously Y-touched point */ - if ( exc->ignore_x_mode ) + /* save point for later comparison */ + B1 = exc->zp2.cur[point].y; + + if ( exc->face->sph_compatibility_mode ) { - /* save point for later comparison */ + if ( exc->sph_tweak_flags & SPH_TWEAK_ROUND_NONPIXEL_Y_MOVES ) + dy = FT_PIX_ROUND( B1 + dy ) - B1; + + /* skip post-iup deltas */ + if ( exc->iup_called && + ( ( exc->sph_in_func_flags & SPH_FDEF_INLINE_DELTA_1 ) || + ( exc->sph_in_func_flags & SPH_FDEF_INLINE_DELTA_2 ) ) ) + goto Skip; + + if ( !( exc->sph_tweak_flags & SPH_TWEAK_ALWAYS_SKIP_DELTAP ) && + ( ( exc->is_composite && exc->GS.freeVector.y != 0 ) || + ( exc->zp2.tags[point] & FT_CURVE_TAG_TOUCH_Y ) || + ( exc->sph_tweak_flags & SPH_TWEAK_DO_SHPIX ) ) ) + Move_Zp2_Point( exc, point, 0, dy, TRUE ); + + /* save new point */ if ( exc->GS.freeVector.y != 0 ) - B1 = exc->zp2.cur[point].y; - else - B1 = exc->zp2.cur[point].x; - - if ( !exc->face->sph_compatibility_mode && - exc->GS.freeVector.y != 0 ) { - Move_Zp2_Point( exc, point, dx, dy, TRUE ); + B2 = exc->zp2.cur[point].y; - /* save new point */ - if ( exc->GS.freeVector.y != 0 ) - { - B2 = exc->zp2.cur[point].y; - - /* reverse any disallowed moves */ - if ( ( exc->sph_tweak_flags & SPH_TWEAK_SKIP_NONPIXEL_Y_MOVES ) && - ( B1 & 63 ) != 0 && - ( B2 & 63 ) != 0 && - B1 != B2 ) - Move_Zp2_Point( exc, - point, - NEG_LONG( dx ), - NEG_LONG( dy ), - TRUE ); - } + /* reverse any disallowed moves */ + if ( ( B1 & 63 ) == 0 && + ( B2 & 63 ) != 0 && + B1 != B2 ) + Move_Zp2_Point( exc, point, 0, NEG_LONG( dy ), TRUE ); } - else if ( exc->face->sph_compatibility_mode ) - { - if ( exc->sph_tweak_flags & SPH_TWEAK_ROUND_NONPIXEL_Y_MOVES ) - { - dx = FT_PIX_ROUND( B1 + dx ) - B1; - dy = FT_PIX_ROUND( B1 + dy ) - B1; - } - - /* skip post-iup deltas */ - if ( exc->iup_called && - ( ( exc->sph_in_func_flags & SPH_FDEF_INLINE_DELTA_1 ) || - ( exc->sph_in_func_flags & SPH_FDEF_INLINE_DELTA_2 ) ) ) - goto Skip; - - if ( !( exc->sph_tweak_flags & SPH_TWEAK_ALWAYS_SKIP_DELTAP ) && - ( ( exc->is_composite && exc->GS.freeVector.y != 0 ) || - ( exc->zp2.tags[point] & FT_CURVE_TAG_TOUCH_Y ) || - ( exc->sph_tweak_flags & SPH_TWEAK_DO_SHPIX ) ) ) - Move_Zp2_Point( exc, point, 0, dy, TRUE ); - - /* save new point */ - if ( exc->GS.freeVector.y != 0 ) - { - B2 = exc->zp2.cur[point].y; - - /* reverse any disallowed moves */ - if ( ( B1 & 63 ) == 0 && - ( B2 & 63 ) != 0 && - B1 != B2 ) - Move_Zp2_Point( exc, point, 0, NEG_LONG( dy ), TRUE ); - } - } - else if ( exc->sph_in_func_flags & SPH_FDEF_TYPEMAN_DIAGENDCTRL ) - Move_Zp2_Point( exc, point, dx, dy, TRUE ); } - else + else if ( exc->GS.freeVector.y != 0 ) + { + Move_Zp2_Point( exc, point, dx, dy, TRUE ); + + /* save new point */ + B2 = exc->zp2.cur[point].y; + + /* reverse any disallowed moves */ + if ( ( exc->sph_tweak_flags & SPH_TWEAK_SKIP_NONPIXEL_Y_MOVES ) && + ( B1 & 63 ) != 0 && + ( B2 & 63 ) != 0 && + B1 != B2 ) + Move_Zp2_Point( exc, + point, + NEG_LONG( dx ), + NEG_LONG( dy ), + TRUE ); + } + else if ( exc->sph_in_func_flags & SPH_FDEF_TYPEMAN_DIAGENDCTRL ) Move_Zp2_Point( exc, point, dx, dy, TRUE ); } else @@ -5890,22 +5868,8 @@ { FT_UShort point = 0; FT_F26Dot6 distance; -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - FT_F26Dot6 control_value_cutin = 0; - FT_F26Dot6 delta; - if ( SUBPIXEL_HINTING_INFINALITY ) - { - control_value_cutin = exc->GS.control_value_cutin; - - if ( exc->ignore_x_mode && - exc->GS.freeVector.x != 0 && - !( exc->sph_tweak_flags & SPH_TWEAK_NORMAL_ROUND ) ) - control_value_cutin = 0; - } -#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ - point = (FT_UShort)args[0]; if ( BOUNDS( point, exc->zp1.n_points ) || @@ -5928,16 +5892,25 @@ distance = PROJECT( exc->zp1.cur + point, exc->zp0.cur + exc->GS.rp0 ); #ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - delta = SUB_LONG( distance, args[1] ); - if ( delta < 0 ) - delta = NEG_LONG( delta ); - /* subpixel hinting - make MSIRP respect CVT cut-in; */ - if ( SUBPIXEL_HINTING_INFINALITY && - exc->ignore_x_mode && - exc->GS.freeVector.x != 0 && - delta >= control_value_cutin ) - distance = args[1]; + if ( SUBPIXEL_HINTING_INFINALITY && + exc->ignore_x_mode && + exc->GS.freeVector.x != 0 ) + { + FT_F26Dot6 control_value_cutin = exc->GS.control_value_cutin; + FT_F26Dot6 delta; + + + if ( !( exc->sph_tweak_flags & SPH_TWEAK_NORMAL_ROUND ) ) + control_value_cutin = 0; + + delta = SUB_LONG( distance, args[1] ); + if ( delta < 0 ) + delta = NEG_LONG( delta ); + + if ( delta >= control_value_cutin ) + distance = args[1]; + } #endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ exc->func_move( exc, @@ -5984,18 +5957,10 @@ if ( SUBPIXEL_HINTING_INFINALITY && exc->ignore_x_mode && exc->GS.freeVector.x != 0 ) - distance = SUB_LONG( - Round_None( exc, - cur_dist, - exc->tt_metrics.compensations[0] ), - cur_dist ); + distance = SUB_LONG( Round_None( exc, cur_dist, 3 ), cur_dist ); else #endif - distance = SUB_LONG( - exc->func_round( exc, - cur_dist, - exc->tt_metrics.compensations[0] ), - cur_dist ); + distance = SUB_LONG( exc->func_round( exc, cur_dist, 3 ), cur_dist ); } else distance = 0; @@ -6021,21 +5986,10 @@ FT_UShort point; FT_F26Dot6 distance; FT_F26Dot6 org_dist; - FT_F26Dot6 control_value_cutin; - control_value_cutin = exc->GS.control_value_cutin; - cvtEntry = (FT_ULong)args[1]; - point = (FT_UShort)args[0]; - -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - if ( SUBPIXEL_HINTING_INFINALITY && - exc->ignore_x_mode && - exc->GS.freeVector.x != 0 && - exc->GS.freeVector.y == 0 && - !( exc->sph_tweak_flags & SPH_TWEAK_NORMAL_ROUND ) ) - control_value_cutin = 0; -#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ + cvtEntry = (FT_ULong)args[1]; + point = (FT_UShort)args[0]; if ( BOUNDS( point, exc->zp0.n_points ) || BOUNDSL( cvtEntry, exc->cvtSize ) ) @@ -6079,7 +6033,7 @@ exc->zp0.org[point].x = TT_MulFix14( distance, exc->GS.freeVector.x ); exc->zp0.org[point].y = TT_MulFix14( distance, - exc->GS.freeVector.y ), + exc->GS.freeVector.y ); exc->zp0.cur[point] = exc->zp0.org[point]; } #ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY @@ -6095,9 +6049,19 @@ if ( ( exc->opcode & 1 ) != 0 ) /* rounding and control cut-in flag */ { + FT_F26Dot6 control_value_cutin = exc->GS.control_value_cutin; FT_F26Dot6 delta; +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY + if ( SUBPIXEL_HINTING_INFINALITY && + exc->ignore_x_mode && + exc->GS.freeVector.x != 0 && + exc->GS.freeVector.y == 0 && + !( exc->sph_tweak_flags & SPH_TWEAK_NORMAL_ROUND ) ) + control_value_cutin = 0; +#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ + delta = SUB_LONG( distance, org_dist ); if ( delta < 0 ) delta = NEG_LONG( delta ); @@ -6109,14 +6073,10 @@ if ( SUBPIXEL_HINTING_INFINALITY && exc->ignore_x_mode && exc->GS.freeVector.x != 0 ) - distance = Round_None( exc, - distance, - exc->tt_metrics.compensations[0] ); + distance = Round_None( exc, distance, 3 ); else #endif - distance = exc->func_round( exc, - distance, - exc->tt_metrics.compensations[0] ); + distance = exc->func_round( exc, distance, 3 ); } exc->func_move( exc, &exc->zp0, point, SUB_LONG( distance, org_dist ) ); @@ -6138,19 +6098,9 @@ FT_Long* args ) { FT_UShort point = 0; - FT_F26Dot6 org_dist, distance, minimum_distance; + FT_F26Dot6 org_dist, distance; - minimum_distance = exc->GS.minimum_distance; - -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - if ( SUBPIXEL_HINTING_INFINALITY && - exc->ignore_x_mode && - exc->GS.freeVector.x != 0 && - !( exc->sph_tweak_flags & SPH_TWEAK_NORMAL_ROUND ) ) - minimum_distance = 0; -#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ - point = (FT_UShort)args[0]; if ( BOUNDS( point, exc->zp1.n_points ) || @@ -6223,27 +6173,29 @@ if ( SUBPIXEL_HINTING_INFINALITY && exc->ignore_x_mode && exc->GS.freeVector.x != 0 ) - distance = Round_None( - exc, - org_dist, - exc->tt_metrics.compensations[exc->opcode & 3] ); + distance = Round_None( exc, org_dist, exc->opcode & 3 ); else #endif - distance = exc->func_round( - exc, - org_dist, - exc->tt_metrics.compensations[exc->opcode & 3] ); + distance = exc->func_round( exc, org_dist, exc->opcode & 3 ); } else - distance = Round_None( - exc, - org_dist, - exc->tt_metrics.compensations[exc->opcode & 3] ); + distance = Round_None( exc, org_dist, exc->opcode & 3 ); /* minimum distance flag */ if ( ( exc->opcode & 8 ) != 0 ) { + FT_F26Dot6 minimum_distance = exc->GS.minimum_distance; + + +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY + if ( SUBPIXEL_HINTING_INFINALITY && + exc->ignore_x_mode && + exc->GS.freeVector.x != 0 && + !( exc->sph_tweak_flags & SPH_TWEAK_NORMAL_ROUND ) ) + minimum_distance = 0; +#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ + if ( org_dist >= 0 ) { if ( distance < minimum_distance ) @@ -6287,30 +6239,13 @@ FT_F26Dot6 cvt_dist, distance, cur_dist, - org_dist, - control_value_cutin, - minimum_distance; -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - FT_Int B1 = 0; /* pacify compiler */ - FT_Int B2 = 0; - FT_Bool reverse_move = FALSE; -#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ + org_dist; FT_F26Dot6 delta; - minimum_distance = exc->GS.minimum_distance; - control_value_cutin = exc->GS.control_value_cutin; - point = (FT_UShort)args[0]; - cvtEntry = (FT_ULong)( ADD_LONG( args[1], 1 ) ); - -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - if ( SUBPIXEL_HINTING_INFINALITY && - exc->ignore_x_mode && - exc->GS.freeVector.x != 0 && - !( exc->sph_tweak_flags & SPH_TWEAK_NORMAL_ROUND ) ) - control_value_cutin = minimum_distance = 0; -#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ + point = (FT_UShort)args[0]; + cvtEntry = (FT_ULong)( ADD_LONG( args[1], 1 ) ); /* XXX: UNDOCUMENTED! cvt[-1] = 0 always */ @@ -6346,12 +6281,14 @@ /* twilight points (confirmed by Greg Hitchcock) */ if ( exc->GS.gep1 == 0 ) { - exc->zp1.org[point].x = exc->zp0.org[exc->GS.rp0].x + - TT_MulFix14( cvt_dist, - exc->GS.freeVector.x ); - exc->zp1.org[point].y = exc->zp0.org[exc->GS.rp0].y + - TT_MulFix14( cvt_dist, - exc->GS.freeVector.y ); + exc->zp1.org[point].x = ADD_LONG( + exc->zp0.org[exc->GS.rp0].x, + TT_MulFix14( cvt_dist, + exc->GS.freeVector.x ) ); + exc->zp1.org[point].y = ADD_LONG( + exc->zp0.org[exc->GS.rp0].y, + TT_MulFix14( cvt_dist, + exc->GS.freeVector.y ) ); exc->zp1.cur[point] = exc->zp1.org[point]; } @@ -6366,19 +6303,6 @@ cvt_dist = NEG_LONG( cvt_dist ); } -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - if ( SUBPIXEL_HINTING_INFINALITY && - exc->ignore_x_mode && - exc->GS.freeVector.y != 0 && - ( exc->sph_tweak_flags & SPH_TWEAK_TIMES_NEW_ROMAN_HACK ) ) - { - if ( cur_dist < -64 ) - cvt_dist -= 16; - else if ( cur_dist > 64 && cur_dist < 84 ) - cvt_dist += 32; - } -#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ - /* control value cut-in and round */ if ( ( exc->opcode & 4 ) != 0 ) @@ -6388,6 +6312,9 @@ if ( exc->GS.gep0 == exc->GS.gep1 ) { + FT_F26Dot6 control_value_cutin = exc->GS.control_value_cutin; + + /* XXX: According to Greg Hitchcock, the following wording is */ /* the right one: */ /* */ @@ -6408,10 +6335,7 @@ cvt_dist = org_dist; } - distance = exc->func_round( - exc, - cvt_dist, - exc->tt_metrics.compensations[exc->opcode & 3] ); + distance = exc->func_round( exc, cvt_dist, exc->opcode & 3 ); } else { @@ -6422,6 +6346,22 @@ exc->ignore_x_mode && exc->GS.gep0 == exc->GS.gep1 ) { + FT_F26Dot6 control_value_cutin = exc->GS.control_value_cutin; + + + if ( exc->GS.freeVector.x != 0 && + !( exc->sph_tweak_flags & SPH_TWEAK_NORMAL_ROUND ) ) + control_value_cutin = 0; + + if ( exc->GS.freeVector.y != 0 && + ( exc->sph_tweak_flags & SPH_TWEAK_TIMES_NEW_ROMAN_HACK ) ) + { + if ( cur_dist < -64 ) + cvt_dist -= 16; + else if ( cur_dist > 64 && cur_dist < 84 ) + cvt_dist += 32; + } + delta = SUB_LONG( cvt_dist, org_dist ); if ( delta < 0 ) delta = NEG_LONG( delta ); @@ -6431,16 +6371,24 @@ } #endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ - distance = Round_None( - exc, - cvt_dist, - exc->tt_metrics.compensations[exc->opcode & 3] ); + distance = Round_None( exc, cvt_dist, exc->opcode & 3 ); } /* minimum distance test */ if ( ( exc->opcode & 8 ) != 0 ) { + FT_F26Dot6 minimum_distance = exc->GS.minimum_distance; + + +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY + if ( SUBPIXEL_HINTING_INFINALITY && + exc->ignore_x_mode && + exc->GS.freeVector.x != 0 && + !( exc->sph_tweak_flags & SPH_TWEAK_NORMAL_ROUND ) ) + minimum_distance = 0; +#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ + if ( org_dist >= 0 ) { if ( distance < minimum_distance ) @@ -6454,60 +6402,51 @@ } #ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - if ( SUBPIXEL_HINTING_INFINALITY ) + if ( SUBPIXEL_HINTING_INFINALITY && + exc->ignore_x_mode && + exc->GS.freeVector.y != 0 ) { + FT_Int B1, B2; + + B1 = exc->zp1.cur[point].y; /* Round moves if necessary */ - if ( exc->ignore_x_mode && - exc->GS.freeVector.y != 0 && - ( exc->sph_tweak_flags & SPH_TWEAK_ROUND_NONPIXEL_Y_MOVES ) ) + if ( exc->sph_tweak_flags & SPH_TWEAK_ROUND_NONPIXEL_Y_MOVES ) distance = FT_PIX_ROUND( B1 + distance - cur_dist ) - B1 + cur_dist; - if ( exc->ignore_x_mode && - exc->GS.freeVector.y != 0 && - ( exc->opcode & 16 ) == 0 && + if ( ( exc->opcode & 16 ) == 0 && ( exc->opcode & 8 ) == 0 && ( exc->sph_tweak_flags & SPH_TWEAK_COURIER_NEW_2_HACK ) ) distance += 64; - } -#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ - exc->func_move( exc, - &exc->zp1, - point, - SUB_LONG( distance, cur_dist ) ); + exc->func_move( exc, + &exc->zp1, + point, + SUB_LONG( distance, cur_dist ) ); -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - if ( SUBPIXEL_HINTING_INFINALITY ) - { B2 = exc->zp1.cur[point].y; /* Reverse move if necessary */ - if ( exc->ignore_x_mode ) - { - if ( exc->face->sph_compatibility_mode && - exc->GS.freeVector.y != 0 && + if ( ( exc->face->sph_compatibility_mode && ( B1 & 63 ) == 0 && - ( B2 & 63 ) != 0 ) - reverse_move = TRUE; - - if ( ( exc->sph_tweak_flags & SPH_TWEAK_SKIP_NONPIXEL_Y_MOVES ) && - exc->GS.freeVector.y != 0 && - ( B2 & 63 ) != 0 && - ( B1 & 63 ) != 0 ) - reverse_move = TRUE; - } - - if ( reverse_move ) + ( B2 & 63 ) != 0 ) || + ( ( exc->sph_tweak_flags & SPH_TWEAK_SKIP_NONPIXEL_Y_MOVES ) && + ( B1 & 63 ) != 0 && + ( B2 & 63 ) != 0 ) ) exc->func_move( exc, &exc->zp1, point, SUB_LONG( cur_dist, distance ) ); } - + else #endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ + exc->func_move( exc, + &exc->zp1, + point, + SUB_LONG( distance, cur_dist ) ); + Fail: exc->GS.rp1 = exc->GS.rp0; @@ -7180,10 +7119,9 @@ FT_UShort A; FT_ULong C, P; FT_Long B; + + #ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - FT_UShort B1, B2; - - if ( SUBPIXEL_HINTING_INFINALITY && exc->ignore_x_mode && exc->iup_called && @@ -7264,6 +7202,9 @@ /* rules, always skipping deltas in subpixel direction. */ else if ( exc->ignore_x_mode && exc->GS.freeVector.y != 0 ) { + FT_UShort B1, B2; + + /* save the y value of the point now; compare after move */ B1 = (FT_UShort)exc->zp0.cur[A].y; @@ -7715,7 +7656,7 @@ Ins_UNKNOWN( TT_ExecContext exc ) { TT_DefRecord* def = exc->IDefs; - TT_DefRecord* limit = def + exc->numIDefs; + TT_DefRecord* limit = FT_OFFSET( def, exc->numIDefs ); for ( ; def < limit; def++ ) @@ -7841,7 +7782,7 @@ num_twilight_points = 0xFFFFU; FT_TRACE5(( "TT_RunIns: Resetting number of twilight points\n" - " from %d to the more reasonable value %d\n", + " from %d to the more reasonable value %ld\n", exc->twilight.n_points, num_twilight_points )); exc->twilight.n_points = (FT_UShort)num_twilight_points; @@ -7867,7 +7808,7 @@ FT_MAX( 50, exc->cvtSize / 10 ); else - exc->loopcall_counter_max = 300 + 8 * exc->cvtSize; + exc->loopcall_counter_max = 300 + 22 * exc->cvtSize; /* as a protection against an unreasonable number of CVT entries */ /* we assume at most 100 control values per glyph for the counter */ @@ -7876,11 +7817,11 @@ exc->loopcall_counter_max = 100 * (FT_ULong)exc->face->root.num_glyphs; FT_TRACE5(( "TT_RunIns: Limiting total number of loops in LOOPCALL" - " to %d\n", exc->loopcall_counter_max )); + " to %ld\n", exc->loopcall_counter_max )); exc->neg_jump_counter_max = exc->loopcall_counter_max; FT_TRACE5(( "TT_RunIns: Limiting total number of backward jumps" - " to %d\n", exc->neg_jump_counter_max )); + " to %ld\n", exc->neg_jump_counter_max )); /* set PPEM and CVT functions */ exc->tt_metrics.ratio = 0; @@ -7917,14 +7858,14 @@ /* if tracing level is 7, show current code position */ /* and the first few stack elements also */ FT_TRACE6(( " " )); - FT_TRACE7(( "%06d ", exc->IP )); + FT_TRACE7(( "%06ld ", exc->IP )); FT_TRACE6(( "%s", opcode_name[exc->opcode] + 2 )); FT_TRACE7(( "%*s", *opcode_name[exc->opcode] == 'A' ? 2 : 12 - ( *opcode_name[exc->opcode] - '0' ), "#" )); for ( n = 1; n <= cnt; n++ ) - FT_TRACE7(( " %d", exc->stack[exc->top - n] )); + FT_TRACE7(( " %ld", exc->stack[exc->top - n] )); FT_TRACE6(( "\n" )); } #endif /* FT_DEBUG_LEVEL_TRACE */ @@ -8567,7 +8508,7 @@ case FT_ERR( Invalid_Opcode ): { TT_DefRecord* def = exc->IDefs; - TT_DefRecord* limit = def + exc->numIDefs; + TT_DefRecord* limit = FT_OFFSET( def, exc->numIDefs ); for ( ; def < limit; def++ ) @@ -8642,7 +8583,7 @@ } while ( !exc->instruction_trap ); LNo_Error_: - FT_TRACE4(( " %d instruction%s executed\n", + FT_TRACE4(( " %ld instruction%s executed\n", ins_counter, ins_counter == 1 ? "" : "s" )); return FT_Err_Ok; diff --git a/src/3rdparty/freetype/src/truetype/ttinterp.h b/src/3rdparty/freetype/src/truetype/ttinterp.h index 0cb1e892..6a83705a 100644 --- a/src/3rdparty/freetype/src/truetype/ttinterp.h +++ b/src/3rdparty/freetype/src/truetype/ttinterp.h @@ -4,7 +4,7 @@ * * TrueType bytecode interpreter (specification). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -19,7 +19,6 @@ #ifndef TTINTERP_H_ #define TTINTERP_H_ -#include #include "ttobjs.h" @@ -52,7 +51,7 @@ FT_BEGIN_HEADER typedef FT_F26Dot6 (*TT_Round_Func)( TT_ExecContext exc, FT_F26Dot6 distance, - FT_F26Dot6 compensation ); + FT_Int color ); /* Point displacement along the freedom vector routine */ typedef void diff --git a/src/3rdparty/freetype/src/truetype/ttobjs.c b/src/3rdparty/freetype/src/truetype/ttobjs.c index e4775a51..06d45695 100644 --- a/src/3rdparty/freetype/src/truetype/ttobjs.c +++ b/src/3rdparty/freetype/src/truetype/ttobjs.c @@ -4,7 +4,7 @@ * * Objects manager (body). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -16,12 +16,11 @@ */ -#include -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_STREAM_H -#include FT_TRUETYPE_TAGS_H -#include FT_INTERNAL_SFNT_H -#include FT_DRIVER_H +#include +#include +#include +#include +#include #include "ttgload.h" #include "ttpload.h" @@ -1116,10 +1115,10 @@ /* The Apple specification says that the compensation for */ /* `gray' is always zero. FreeType doesn't do any */ /* compensation at all. */ - tt_metrics->compensations[0] = 0; /* gray */ - tt_metrics->compensations[1] = 0; /* black */ - tt_metrics->compensations[2] = 0; /* white */ - tt_metrics->compensations[3] = 0; /* the same as gray */ + tt_metrics->compensations[0] = 0; /* gray */ + tt_metrics->compensations[1] = 0; /* black */ + tt_metrics->compensations[2] = 0; /* white */ + tt_metrics->compensations[3] = 0; /* zero */ } /* allocate function defs, instruction defs, cvt, and storage area */ diff --git a/src/3rdparty/freetype/src/truetype/ttobjs.h b/src/3rdparty/freetype/src/truetype/ttobjs.h index 9fc654d5..d986deab 100644 --- a/src/3rdparty/freetype/src/truetype/ttobjs.h +++ b/src/3rdparty/freetype/src/truetype/ttobjs.h @@ -4,7 +4,7 @@ * * Objects manager (specification). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -20,9 +20,8 @@ #define TTOBJS_H_ -#include -#include FT_INTERNAL_OBJECTS_H -#include FT_INTERNAL_TRUETYPE_TYPES_H +#include +#include FT_BEGIN_HEADER diff --git a/src/3rdparty/freetype/src/truetype/ttpic.c b/src/3rdparty/freetype/src/truetype/ttpic.c deleted file mode 100644 index cdbb8063..00000000 --- a/src/3rdparty/freetype/src/truetype/ttpic.c +++ /dev/null @@ -1,101 +0,0 @@ -/***************************************************************************/ -/* */ -/* ttpic.c */ -/* */ -/* The FreeType position independent code services for truetype module. */ -/* */ -/* Copyright 2009-2018 by */ -/* Oran Agra and Mickey Gabel. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#include -#include FT_FREETYPE_H -#include FT_INTERNAL_OBJECTS_H -#include "ttpic.h" -#include "tterrors.h" - - -#ifdef FT_CONFIG_OPTION_PIC - - /* forward declaration of PIC init functions from ttdriver.c */ - FT_Error - FT_Create_Class_tt_services( FT_Library library, - FT_ServiceDescRec** output_class ); - void - FT_Destroy_Class_tt_services( FT_Library library, - FT_ServiceDescRec* clazz ); - void - FT_Init_Class_tt_service_gx_multi_masters( - FT_Service_MultiMastersRec* sv_mm ); - void - FT_Init_Class_tt_service_truetype_glyf( - FT_Service_TTGlyfRec* sv_ttglyf ); - - - void - tt_driver_class_pic_free( FT_Library library ) - { - FT_PIC_Container* pic_container = &library->pic_container; - FT_Memory memory = library->memory; - - - if ( pic_container->truetype ) - { - TTModulePIC* container = (TTModulePIC*)pic_container->truetype; - - - if ( container->tt_services ) - FT_Destroy_Class_tt_services( library, container->tt_services ); - container->tt_services = NULL; - FT_FREE( container ); - pic_container->truetype = NULL; - } - } - - - FT_Error - tt_driver_class_pic_init( FT_Library library ) - { - FT_PIC_Container* pic_container = &library->pic_container; - FT_Error error = FT_Err_Ok; - TTModulePIC* container = NULL; - FT_Memory memory = library->memory; - - - /* allocate pointer, clear and set global container pointer */ - if ( FT_ALLOC( container, sizeof ( *container ) ) ) - return error; - FT_MEM_SET( container, 0, sizeof ( *container ) ); - pic_container->truetype = container; - - /* initialize pointer table - this is how the module usually */ - /* expects this data */ - error = FT_Create_Class_tt_services( library, - &container->tt_services ); - if ( error ) - goto Exit; -#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT - FT_Init_Class_tt_service_gx_multi_masters( - &container->tt_service_gx_multi_masters ); -#endif - FT_Init_Class_tt_service_truetype_glyf( - &container->tt_service_truetype_glyf ); - - Exit: - if ( error ) - tt_driver_class_pic_free( library ); - return error; - } - -#endif /* FT_CONFIG_OPTION_PIC */ - - -/* END */ diff --git a/src/3rdparty/freetype/src/truetype/ttpic.h b/src/3rdparty/freetype/src/truetype/ttpic.h deleted file mode 100644 index df878ae6..00000000 --- a/src/3rdparty/freetype/src/truetype/ttpic.h +++ /dev/null @@ -1,88 +0,0 @@ -/***************************************************************************/ -/* */ -/* ttpic.h */ -/* */ -/* The FreeType position independent code services for truetype module. */ -/* */ -/* Copyright 2009-2018 by */ -/* Oran Agra and Mickey Gabel. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef TTPIC_H_ -#define TTPIC_H_ - - -#include FT_INTERNAL_PIC_H - - -#ifndef FT_CONFIG_OPTION_PIC - -#define TT_SERVICES_GET tt_services -#define TT_SERVICE_GX_MULTI_MASTERS_GET tt_service_gx_multi_masters -#define TT_SERVICE_METRICS_VARIATIONS_GET tt_service_metrics_variations -#define TT_SERVICE_TRUETYPE_GLYF_GET tt_service_truetype_glyf -#define TT_SERVICE_PROPERTIES_GET tt_service_properties - -#else /* FT_CONFIG_OPTION_PIC */ - -#include FT_MULTIPLE_MASTERS_H -#include FT_SERVICE_MULTIPLE_MASTERS_H -#include FT_SERVICE_METRICS_VARIATIONS_H -#include FT_SERVICE_TRUETYPE_GLYF_H -#include FT_SERVICE_PROPERTIES_H - - -FT_BEGIN_HEADER - - typedef struct TTModulePIC_ - { - FT_ServiceDescRec* tt_services; -#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT - FT_Service_MultiMastersRec tt_service_gx_multi_masters; - FT_Service_MetricsVariationsRec tt_service_metrics_variations; -#endif - FT_Service_TTGlyfRec tt_service_truetype_glyf; - FT_Service_PropertiesRec tt_service_properties; - - } TTModulePIC; - - -#define GET_PIC( lib ) \ - ( (TTModulePIC*)((lib)->pic_container.truetype) ) -#define TT_SERVICES_GET \ - ( GET_PIC( library )->tt_services ) -#define TT_SERVICE_METRICS_VARIATIONS_GET \ - ( GET_PIC( library )->tt_service_metrics_variations ) -#define TT_SERVICE_GX_MULTI_MASTERS_GET \ - ( GET_PIC( library )->tt_service_gx_multi_masters ) -#define TT_SERVICE_TRUETYPE_GLYF_GET \ - ( GET_PIC( library )->tt_service_truetype_glyf ) -#define TT_SERVICE_PROPERTIES_GET \ - ( GET_PIC( library )->tt_service_properties ) - - - /* see ttpic.c for the implementation */ - void - tt_driver_class_pic_free( FT_Library library ); - - FT_Error - tt_driver_class_pic_init( FT_Library library ); - -FT_END_HEADER - -#endif /* FT_CONFIG_OPTION_PIC */ - - /* */ - -#endif /* TTPIC_H_ */ - - -/* END */ diff --git a/src/3rdparty/freetype/src/truetype/ttpload.c b/src/3rdparty/freetype/src/truetype/ttpload.c index bc954c2d..b1255b88 100644 --- a/src/3rdparty/freetype/src/truetype/ttpload.c +++ b/src/3rdparty/freetype/src/truetype/ttpload.c @@ -4,7 +4,7 @@ * * TrueType-specific tables loader (body). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -16,11 +16,10 @@ */ -#include -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_OBJECTS_H -#include FT_INTERNAL_STREAM_H -#include FT_TRUETYPE_TAGS_H +#include +#include +#include +#include #include "ttpload.h" @@ -124,7 +123,7 @@ if ( face->num_locations != (FT_ULong)face->root.num_glyphs + 1 ) { - FT_TRACE2(( "glyph count mismatch! loca: %d, maxp: %d\n", + FT_TRACE2(( "glyph count mismatch! loca: %ld, maxp: %ld\n", face->num_locations - 1, face->root.num_glyphs )); /* we only handle the case where `maxp' gives a larger value */ @@ -165,7 +164,7 @@ face->num_locations = (FT_ULong)face->root.num_glyphs + 1; table_len = new_loca_len; - FT_TRACE2(( "adjusting num_locations to %d\n", + FT_TRACE2(( "adjusting num_locations to %ld\n", face->num_locations )); } else @@ -173,7 +172,7 @@ face->root.num_glyphs = face->num_locations ? (FT_Long)face->num_locations - 1 : 0; - FT_TRACE2(( "adjusting num_glyphs to %d\n", + FT_TRACE2(( "adjusting num_glyphs to %ld\n", face->root.num_glyphs )); } } @@ -238,7 +237,7 @@ if ( pos1 > face->glyf_len ) { FT_TRACE1(( "tt_face_get_location:" - " too large offset (0x%08lx) found for glyph index %ld,\n" + " too large offset (0x%08lx) found for glyph index %d,\n" " " " exceeding the end of `glyf' table (0x%08lx)\n", pos1, gindex, face->glyf_len )); @@ -252,7 +251,7 @@ if ( gindex == face->num_locations - 2 ) { FT_TRACE1(( "tt_face_get_location:" - " too large size (%ld bytes) found for glyph index %ld,\n" + " too large size (%ld bytes) found for glyph index %d,\n" " " " truncating at the end of `glyf' table to %ld bytes\n", pos2 - pos1, gindex, face->glyf_len - pos1 )); @@ -261,7 +260,7 @@ else { FT_TRACE1(( "tt_face_get_location:" - " too large offset (0x%08lx) found for glyph index %ld,\n" + " too large offset (0x%08lx) found for glyph index %d,\n" " " " exceeding the end of `glyf' table (0x%08lx)\n", pos2, gindex + 1, face->glyf_len )); @@ -429,7 +428,7 @@ if ( FT_FRAME_EXTRACT( table_len, face->font_program ) ) goto Exit; - FT_TRACE2(( "loaded, %12d bytes\n", face->font_program_size )); + FT_TRACE2(( "loaded, %12ld bytes\n", face->font_program_size )); } Exit: @@ -492,7 +491,7 @@ if ( FT_FRAME_EXTRACT( table_len, face->cvt_program ) ) goto Exit; - FT_TRACE2(( "loaded, %12d bytes\n", face->cvt_program_size )); + FT_TRACE2(( "loaded, %12ld bytes\n", face->cvt_program_size )); } Exit: @@ -633,7 +632,7 @@ FT_UInt nn; FT_Byte* result = NULL; FT_ULong record_size = face->hdmx_record_size; - FT_Byte* record = face->hdmx_table + 8; + FT_Byte* record = FT_OFFSET( face->hdmx_table, 8 ); for ( nn = 0; nn < face->hdmx_record_count; nn++ ) diff --git a/src/3rdparty/freetype/src/truetype/ttpload.h b/src/3rdparty/freetype/src/truetype/ttpload.h index 022750e3..bb669e02 100644 --- a/src/3rdparty/freetype/src/truetype/ttpload.h +++ b/src/3rdparty/freetype/src/truetype/ttpload.h @@ -4,7 +4,7 @@ * * TrueType-specific tables loader (specification). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -20,8 +20,7 @@ #define TTPLOAD_H_ -#include -#include FT_INTERNAL_TRUETYPE_TYPES_H +#include FT_BEGIN_HEADER diff --git a/src/3rdparty/freetype/src/truetype/ttsubpix.c b/src/3rdparty/freetype/src/truetype/ttsubpix.c index 23a2e5b4..56667dea 100644 --- a/src/3rdparty/freetype/src/truetype/ttsubpix.c +++ b/src/3rdparty/freetype/src/truetype/ttsubpix.c @@ -4,7 +4,7 @@ * * TrueType Subpixel Hinting. * - * Copyright (C) 2010-2019 by + * Copyright (C) 2010-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -15,14 +15,13 @@ * */ -#include -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_CALC_H -#include FT_INTERNAL_STREAM_H -#include FT_INTERNAL_SFNT_H -#include FT_TRUETYPE_TAGS_H -#include FT_OUTLINE_H -#include FT_DRIVER_H +#include +#include +#include +#include +#include +#include +#include #include "ttsubpix.h" diff --git a/src/3rdparty/freetype/src/truetype/ttsubpix.h b/src/3rdparty/freetype/src/truetype/ttsubpix.h index 4966800c..229a6cf0 100644 --- a/src/3rdparty/freetype/src/truetype/ttsubpix.h +++ b/src/3rdparty/freetype/src/truetype/ttsubpix.h @@ -4,7 +4,7 @@ * * TrueType Subpixel Hinting. * - * Copyright (C) 2010-2019 by + * Copyright (C) 2010-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -19,7 +19,6 @@ #ifndef TTSUBPIX_H_ #define TTSUBPIX_H_ -#include #include "ttobjs.h" #include "ttinterp.h" diff --git a/src/3rdparty/freetype/src/type1/Jamfile b/src/3rdparty/freetype/src/type1/Jamfile deleted file mode 100644 index 0bcfb2e4..00000000 --- a/src/3rdparty/freetype/src/type1/Jamfile +++ /dev/null @@ -1,35 +0,0 @@ -# FreeType 2 src/type1 Jamfile -# -# Copyright (C) 2001-2019 by -# David Turner, Robert Wilhelm, and Werner Lemberg. -# -# This file is part of the FreeType project, and may only be used, modified, -# and distributed under the terms of the FreeType project license, -# LICENSE.TXT. By continuing to use, modify, or distribute this file you -# indicate that you have read the license and understand and accept it -# fully. - -SubDir FT2_TOP $(FT2_SRC_DIR) type1 ; - -{ - local _sources ; - - if $(FT2_MULTI) - { - _sources = t1afm - t1driver - t1gload - t1load - t1objs - t1parse - ; - } - else - { - _sources = type1 ; - } - - Library $(FT2_LIB) : $(_sources).c ; -} - -# end of src/type1 Jamfile diff --git a/src/3rdparty/freetype/src/type1/module.mk b/src/3rdparty/freetype/src/type1/module.mk index 2f48c658..cffb774b 100644 --- a/src/3rdparty/freetype/src/type1/module.mk +++ b/src/3rdparty/freetype/src/type1/module.mk @@ -3,7 +3,7 @@ # -# Copyright (C) 1996-2019 by +# Copyright (C) 1996-2020 by # David Turner, Robert Wilhelm, and Werner Lemberg. # # This file is part of the FreeType project, and may only be used, modified, diff --git a/src/3rdparty/freetype/src/type1/rules.mk b/src/3rdparty/freetype/src/type1/rules.mk index 901169c7..213e6192 100644 --- a/src/3rdparty/freetype/src/type1/rules.mk +++ b/src/3rdparty/freetype/src/type1/rules.mk @@ -3,7 +3,7 @@ # -# Copyright (C) 1996-2019 by +# Copyright (C) 1996-2020 by # David Turner, Robert Wilhelm, and Werner Lemberg. # # This file is part of the FreeType project, and may only be used, modified, diff --git a/src/3rdparty/freetype/src/type1/t1afm.c b/src/3rdparty/freetype/src/type1/t1afm.c index 68411845..b9cd66b0 100644 --- a/src/3rdparty/freetype/src/type1/t1afm.c +++ b/src/3rdparty/freetype/src/type1/t1afm.c @@ -4,7 +4,7 @@ * * AFM support for Type 1 fonts (body). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -16,11 +16,10 @@ */ -#include #include "t1afm.h" -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_STREAM_H -#include FT_INTERNAL_POSTSCRIPT_AUX_H +#include +#include +#include #include "t1errors.h" diff --git a/src/3rdparty/freetype/src/type1/t1afm.h b/src/3rdparty/freetype/src/type1/t1afm.h index a8e6a549..edf919c7 100644 --- a/src/3rdparty/freetype/src/type1/t1afm.h +++ b/src/3rdparty/freetype/src/type1/t1afm.h @@ -4,7 +4,7 @@ * * AFM support for Type 1 fonts (specification). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -19,9 +19,8 @@ #ifndef T1AFM_H_ #define T1AFM_H_ -#include #include "t1objs.h" -#include FT_INTERNAL_TYPE1_TYPES_H +#include FT_BEGIN_HEADER diff --git a/src/3rdparty/freetype/src/type1/t1driver.c b/src/3rdparty/freetype/src/type1/t1driver.c index 557733da..b786a878 100644 --- a/src/3rdparty/freetype/src/type1/t1driver.c +++ b/src/3rdparty/freetype/src/type1/t1driver.c @@ -4,7 +4,7 @@ * * Type 1 driver interface (body). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -16,7 +16,6 @@ */ -#include #include "t1driver.h" #include "t1gload.h" #include "t1load.h" @@ -27,20 +26,20 @@ #include "t1afm.h" #endif -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_STREAM_H -#include FT_INTERNAL_HASH_H -#include FT_INTERNAL_POSTSCRIPT_PROPS_H -#include FT_DRIVER_H +#include +#include +#include +#include +#include -#include FT_SERVICE_MULTIPLE_MASTERS_H -#include FT_SERVICE_GLYPH_DICT_H -#include FT_SERVICE_FONT_FORMAT_H -#include FT_SERVICE_POSTSCRIPT_NAME_H -#include FT_SERVICE_POSTSCRIPT_CMAPS_H -#include FT_SERVICE_POSTSCRIPT_INFO_H -#include FT_SERVICE_PROPERTIES_H -#include FT_SERVICE_KERNING_H +#include +#include +#include +#include +#include +#include +#include +#include /************************************************************************** diff --git a/src/3rdparty/freetype/src/type1/t1driver.h b/src/3rdparty/freetype/src/type1/t1driver.h index 206f64a0..e7eae0b8 100644 --- a/src/3rdparty/freetype/src/type1/t1driver.h +++ b/src/3rdparty/freetype/src/type1/t1driver.h @@ -4,7 +4,7 @@ * * High-level Type 1 driver interface (specification). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -20,8 +20,7 @@ #define T1DRIVER_H_ -#include -#include FT_INTERNAL_DRIVER_H +#include FT_BEGIN_HEADER diff --git a/src/3rdparty/freetype/src/type1/t1errors.h b/src/3rdparty/freetype/src/type1/t1errors.h index b35f67a2..ad03a3d3 100644 --- a/src/3rdparty/freetype/src/type1/t1errors.h +++ b/src/3rdparty/freetype/src/type1/t1errors.h @@ -4,7 +4,7 @@ * * Type 1 error codes (specification only). * - * Copyright (C) 2001-2019 by + * Copyright (C) 2001-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -25,7 +25,7 @@ #ifndef T1ERRORS_H_ #define T1ERRORS_H_ -#include FT_MODULE_ERRORS_H +#include #undef FTERRORS_H_ @@ -33,7 +33,7 @@ #define FT_ERR_PREFIX T1_Err_ #define FT_ERR_BASE FT_Mod_Err_Type1 -#include FT_ERRORS_H +#include #endif /* T1ERRORS_H_ */ diff --git a/src/3rdparty/freetype/src/type1/t1gload.c b/src/3rdparty/freetype/src/type1/t1gload.c index f9b115b1..d16b81f2 100644 --- a/src/3rdparty/freetype/src/type1/t1gload.c +++ b/src/3rdparty/freetype/src/type1/t1gload.c @@ -4,7 +4,7 @@ * * Type 1 Glyph Loader (body). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -16,15 +16,14 @@ */ -#include #include "t1gload.h" -#include FT_INTERNAL_CALC_H -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_STREAM_H -#include FT_OUTLINE_H -#include FT_INTERNAL_POSTSCRIPT_AUX_H -#include FT_INTERNAL_CFF_TYPES_H -#include FT_DRIVER_H +#include +#include +#include +#include +#include +#include +#include #include "t1errors.h" @@ -334,7 +333,7 @@ else advances[nn] = 0; - FT_TRACE5(( " idx %d: advance width %d font unit%s\n", + FT_TRACE5(( " idx %d: advance width %ld font unit%s\n", first + nn, advances[nn], advances[nn] == 1 ? "" : "s" )); diff --git a/src/3rdparty/freetype/src/type1/t1gload.h b/src/3rdparty/freetype/src/type1/t1gload.h index 80440369..9947507c 100644 --- a/src/3rdparty/freetype/src/type1/t1gload.h +++ b/src/3rdparty/freetype/src/type1/t1gload.h @@ -4,7 +4,7 @@ * * Type 1 Glyph Loader (specification). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -20,7 +20,6 @@ #define T1GLOAD_H_ -#include #include "t1objs.h" diff --git a/src/3rdparty/freetype/src/type1/t1load.c b/src/3rdparty/freetype/src/type1/t1load.c index 5cffdfaa..84986007 100644 --- a/src/3rdparty/freetype/src/type1/t1load.c +++ b/src/3rdparty/freetype/src/type1/t1load.c @@ -4,7 +4,7 @@ * * Type 1 font loader (body). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -61,12 +61,12 @@ #include -#include FT_INTERNAL_DEBUG_H +#include #include FT_CONFIG_CONFIG_H -#include FT_MULTIPLE_MASTERS_H -#include FT_INTERNAL_TYPE1_TYPES_H -#include FT_INTERNAL_CALC_H -#include FT_INTERNAL_HASH_H +#include +#include +#include +#include #include "t1load.h" #include "t1errors.h" @@ -309,31 +309,55 @@ FT_UInt i; FT_Fixed axiscoords[T1_MAX_MM_AXIS]; PS_Blend blend = face->blend; + FT_UShort* axis_flags; + + FT_Offset mmvar_size; + FT_Offset axis_flags_size; + FT_Offset axis_size; error = T1_Get_Multi_Master( face, &mmaster ); if ( error ) goto Exit; - if ( FT_ALLOC( mmvar, - sizeof ( FT_MM_Var ) + - mmaster.num_axis * sizeof ( FT_Var_Axis ) ) ) + + /* the various `*_size' variables, which we also use as */ + /* offsets into the `mmvar' array, must be multiples of the */ + /* pointer size (except the last one); without such an */ + /* alignment there might be runtime errors due to */ + /* misaligned addresses */ +#undef ALIGN_SIZE +#define ALIGN_SIZE( n ) \ + ( ( (n) + sizeof (void*) - 1 ) & ~( sizeof (void*) - 1 ) ) + + mmvar_size = ALIGN_SIZE( sizeof ( FT_MM_Var ) ); + axis_flags_size = ALIGN_SIZE( mmaster.num_axis * + sizeof ( FT_UShort ) ); + axis_size = mmaster.num_axis * sizeof ( FT_Var_Axis ); + + if ( FT_ALLOC( mmvar, mmvar_size + + axis_flags_size + + axis_size ) ) goto Exit; mmvar->num_axis = mmaster.num_axis; mmvar->num_designs = mmaster.num_designs; mmvar->num_namedstyles = 0; /* Not supported */ - mmvar->axis = (FT_Var_Axis*)&mmvar[1]; - /* Point to axes after MM_Var struct */ - mmvar->namedstyle = NULL; + + /* while axis flags are meaningless here, we have to provide the array */ + /* to make `FT_Get_Var_Axis_Flags' work: the function expects that the */ + /* values directly follow the data of `FT_MM_Var' */ + axis_flags = (FT_UShort*)( (char*)mmvar + mmvar_size ); + for ( i = 0; i < mmaster.num_axis; i++ ) + axis_flags[i] = 0; + + mmvar->axis = (FT_Var_Axis*)( (char*)axis_flags + axis_flags_size ); + mmvar->namedstyle = NULL; for ( i = 0; i < mmaster.num_axis; i++ ) { mmvar->axis[i].name = mmaster.axis[i].name; mmvar->axis[i].minimum = INT_TO_FIXED( mmaster.axis[i].minimum ); mmvar->axis[i].maximum = INT_TO_FIXED( mmaster.axis[i].maximum ); - mmvar->axis[i].def = ( mmvar->axis[i].minimum + - mmvar->axis[i].maximum ) / 2; - /* Does not apply. But this value is in range */ mmvar->axis[i].strid = ~0U; /* Does not apply */ mmvar->axis[i].tag = ~0U; /* Does not apply */ @@ -1039,7 +1063,7 @@ map->design_points[p] = T1_ToInt( parser ); map->blend_points [p] = T1_ToFixed( parser, 0 ); - FT_TRACE4(( " [%d %f]", + FT_TRACE4(( " [%ld %f]", map->design_points[p], (double)map->blend_points[p] / 65536 )); } @@ -1731,7 +1755,7 @@ */ FT_TRACE0(( "parse_subrs: adjusting number of subroutines" - " (from %d to %d)\n", + " (from %d to %ld)\n", num_subrs, ( parser->root.limit - parser->root.cursor ) >> 3 )); num_subrs = ( parser->root.limit - parser->root.cursor ) >> 3; @@ -1902,7 +1926,7 @@ if ( num_glyphs > ( limit - cur ) >> 3 ) { FT_TRACE0(( "parse_charstrings: adjusting number of glyphs" - " (from %d to %d)\n", + " (from %d to %ld)\n", num_glyphs, ( limit - cur ) >> 3 )); num_glyphs = ( limit - cur ) >> 3; } diff --git a/src/3rdparty/freetype/src/type1/t1load.h b/src/3rdparty/freetype/src/type1/t1load.h index 44f835bd..4396415c 100644 --- a/src/3rdparty/freetype/src/type1/t1load.h +++ b/src/3rdparty/freetype/src/type1/t1load.h @@ -4,7 +4,7 @@ * * Type 1 font loader (specification). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -20,10 +20,9 @@ #define T1LOAD_H_ -#include -#include FT_INTERNAL_STREAM_H -#include FT_INTERNAL_POSTSCRIPT_AUX_H -#include FT_MULTIPLE_MASTERS_H +#include +#include +#include #include "t1parse.h" diff --git a/src/3rdparty/freetype/src/type1/t1objs.c b/src/3rdparty/freetype/src/type1/t1objs.c index 741388a6..3b918b73 100644 --- a/src/3rdparty/freetype/src/type1/t1objs.c +++ b/src/3rdparty/freetype/src/type1/t1objs.c @@ -4,7 +4,7 @@ * * Type 1 objects manager (body). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -16,12 +16,11 @@ */ -#include -#include FT_INTERNAL_CALC_H -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_STREAM_H -#include FT_TRUETYPE_IDS_H -#include FT_DRIVER_H +#include +#include +#include +#include +#include #include "t1gload.h" #include "t1load.h" @@ -32,8 +31,8 @@ #include "t1afm.h" #endif -#include FT_SERVICE_POSTSCRIPT_CMAPS_H -#include FT_INTERNAL_POSTSCRIPT_AUX_H +#include +#include /************************************************************************** @@ -347,8 +346,8 @@ if ( error ) goto Exit; - FT_TRACE2(( "T1_Face_Init: %08p (index %d)\n", - face, + FT_TRACE2(( "T1_Face_Init: %p (index %d)\n", + (void *)face, face_index )); /* if we just wanted to check the format, leave successfully now */ diff --git a/src/3rdparty/freetype/src/type1/t1objs.h b/src/3rdparty/freetype/src/type1/t1objs.h index 2161091f..536be8ba 100644 --- a/src/3rdparty/freetype/src/type1/t1objs.h +++ b/src/3rdparty/freetype/src/type1/t1objs.h @@ -4,7 +4,7 @@ * * Type 1 objects manager (specification). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -21,9 +21,9 @@ #include -#include FT_INTERNAL_OBJECTS_H +#include #include FT_CONFIG_CONFIG_H -#include FT_INTERNAL_TYPE1_TYPES_H +#include FT_BEGIN_HEADER diff --git a/src/3rdparty/freetype/src/type1/t1parse.c b/src/3rdparty/freetype/src/type1/t1parse.c index 56caeb9e..74cf38bd 100644 --- a/src/3rdparty/freetype/src/type1/t1parse.c +++ b/src/3rdparty/freetype/src/type1/t1parse.c @@ -4,7 +4,7 @@ * * Type 1 parser (body). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -33,10 +33,9 @@ */ -#include -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_STREAM_H -#include FT_INTERNAL_POSTSCRIPT_AUX_H +#include +#include +#include #include "t1parse.h" diff --git a/src/3rdparty/freetype/src/type1/t1parse.h b/src/3rdparty/freetype/src/type1/t1parse.h index dab8fddc..1ea0110b 100644 --- a/src/3rdparty/freetype/src/type1/t1parse.h +++ b/src/3rdparty/freetype/src/type1/t1parse.h @@ -4,7 +4,7 @@ * * Type 1 parser (specification). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -20,9 +20,8 @@ #define T1PARSE_H_ -#include -#include FT_INTERNAL_TYPE1_TYPES_H -#include FT_INTERNAL_STREAM_H +#include +#include FT_BEGIN_HEADER diff --git a/src/3rdparty/freetype/src/type1/t1tokens.h b/src/3rdparty/freetype/src/type1/t1tokens.h index 97f2dbe0..c0942035 100644 --- a/src/3rdparty/freetype/src/type1/t1tokens.h +++ b/src/3rdparty/freetype/src/type1/t1tokens.h @@ -4,7 +4,7 @@ * * Type 1 tokenizer (specification). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, diff --git a/src/3rdparty/freetype/src/type1/type1.c b/src/3rdparty/freetype/src/type1/type1.c index ce8557a5..cadee789 100644 --- a/src/3rdparty/freetype/src/type1/type1.c +++ b/src/3rdparty/freetype/src/type1/type1.c @@ -4,7 +4,7 @@ * * FreeType Type 1 driver component (body only). * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -17,7 +17,6 @@ #define FT_MAKE_OPTION_SINGLE_OBJECT -#include #include "t1afm.c" #include "t1driver.c" diff --git a/src/3rdparty/freetype/src/type42/Jamfile b/src/3rdparty/freetype/src/type42/Jamfile deleted file mode 100644 index 6123b355..00000000 --- a/src/3rdparty/freetype/src/type42/Jamfile +++ /dev/null @@ -1,32 +0,0 @@ -# FreeType 2 src/type42 Jamfile -# -# Copyright (C) 2002-2019 by -# David Turner, Robert Wilhelm, and Werner Lemberg. -# -# This file is part of the FreeType project, and may only be used, modified, -# and distributed under the terms of the FreeType project license, -# LICENSE.TXT. By continuing to use, modify, or distribute this file you -# indicate that you have read the license and understand and accept it -# fully. - -SubDir FT2_TOP $(FT2_SRC_DIR) type42 ; - -{ - local _sources ; - - if $(FT2_MULTI) - { - _sources = t42drivr - t42objs - t42parse - ; - } - else - { - _sources = type42 ; - } - - Library $(FT2_LIB) : $(_sources).c ; -} - -# end of src/type42 Jamfile diff --git a/src/3rdparty/freetype/src/type42/module.mk b/src/3rdparty/freetype/src/type42/module.mk index 9e9d1545..6ef3a95e 100644 --- a/src/3rdparty/freetype/src/type42/module.mk +++ b/src/3rdparty/freetype/src/type42/module.mk @@ -3,7 +3,7 @@ # -# Copyright (C) 2002-2019 by +# Copyright (C) 2002-2020 by # David Turner, Robert Wilhelm, and Werner Lemberg. # # This file is part of the FreeType project, and may only be used, modified, diff --git a/src/3rdparty/freetype/src/type42/rules.mk b/src/3rdparty/freetype/src/type42/rules.mk index 9d71f530..f4ce91a3 100644 --- a/src/3rdparty/freetype/src/type42/rules.mk +++ b/src/3rdparty/freetype/src/type42/rules.mk @@ -3,7 +3,7 @@ # -# Copyright (C) 2002-2019 by +# Copyright (C) 2002-2020 by # David Turner, Robert Wilhelm, and Werner Lemberg. # # This file is part of the FreeType project, and may only be used, modified, diff --git a/src/3rdparty/freetype/src/type42/t42drivr.c b/src/3rdparty/freetype/src/type42/t42drivr.c index 09ad632e..90898b43 100644 --- a/src/3rdparty/freetype/src/type42/t42drivr.c +++ b/src/3rdparty/freetype/src/type42/t42drivr.c @@ -4,7 +4,7 @@ * * High-level Type 42 driver interface (body). * - * Copyright (C) 2002-2019 by + * Copyright (C) 2002-2020 by * Roberto Alameda. * * This file is part of the FreeType project, and may only be used, @@ -39,12 +39,12 @@ #include "t42drivr.h" #include "t42objs.h" #include "t42error.h" -#include FT_INTERNAL_DEBUG_H +#include -#include FT_SERVICE_FONT_FORMAT_H -#include FT_SERVICE_GLYPH_DICT_H -#include FT_SERVICE_POSTSCRIPT_NAME_H -#include FT_SERVICE_POSTSCRIPT_INFO_H +#include +#include +#include +#include #undef FT_COMPONENT #define FT_COMPONENT t42 diff --git a/src/3rdparty/freetype/src/type42/t42drivr.h b/src/3rdparty/freetype/src/type42/t42drivr.h index a35ca28f..8bf2afc7 100644 --- a/src/3rdparty/freetype/src/type42/t42drivr.h +++ b/src/3rdparty/freetype/src/type42/t42drivr.h @@ -4,7 +4,7 @@ * * High-level Type 42 driver interface (specification). * - * Copyright (C) 2002-2019 by + * Copyright (C) 2002-2020 by * Roberto Alameda. * * This file is part of the FreeType project, and may only be used, @@ -20,8 +20,7 @@ #define T42DRIVR_H_ -#include -#include FT_INTERNAL_DRIVER_H +#include FT_BEGIN_HEADER diff --git a/src/3rdparty/freetype/src/type42/t42error.h b/src/3rdparty/freetype/src/type42/t42error.h index 5fb21439..e48132ec 100644 --- a/src/3rdparty/freetype/src/type42/t42error.h +++ b/src/3rdparty/freetype/src/type42/t42error.h @@ -4,7 +4,7 @@ * * Type 42 error codes (specification only). * - * Copyright (C) 2002-2019 by + * Copyright (C) 2002-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -25,7 +25,7 @@ #ifndef T42ERROR_H_ #define T42ERROR_H_ -#include FT_MODULE_ERRORS_H +#include #undef FTERRORS_H_ @@ -33,7 +33,7 @@ #define FT_ERR_PREFIX T42_Err_ #define FT_ERR_BASE FT_Mod_Err_Type42 -#include FT_ERRORS_H +#include #endif /* T42ERROR_H_ */ diff --git a/src/3rdparty/freetype/src/type42/t42objs.c b/src/3rdparty/freetype/src/type42/t42objs.c index d31bace4..6acfcdf4 100644 --- a/src/3rdparty/freetype/src/type42/t42objs.c +++ b/src/3rdparty/freetype/src/type42/t42objs.c @@ -4,7 +4,7 @@ * * Type 42 objects manager (body). * - * Copyright (C) 2002-2019 by + * Copyright (C) 2002-2020 by * Roberto Alameda. * * This file is part of the FreeType project, and may only be used, @@ -19,9 +19,9 @@ #include "t42objs.h" #include "t42parse.h" #include "t42error.h" -#include FT_INTERNAL_DEBUG_H -#include FT_LIST_H -#include FT_TRUETYPE_IDS_H +#include +#include +#include #undef FT_COMPONENT diff --git a/src/3rdparty/freetype/src/type42/t42objs.h b/src/3rdparty/freetype/src/type42/t42objs.h index 98300cf3..69f5cffd 100644 --- a/src/3rdparty/freetype/src/type42/t42objs.h +++ b/src/3rdparty/freetype/src/type42/t42objs.h @@ -4,7 +4,7 @@ * * Type 42 objects manager (specification). * - * Copyright (C) 2002-2019 by + * Copyright (C) 2002-2020 by * Roberto Alameda. * * This file is part of the FreeType project, and may only be used, @@ -19,15 +19,14 @@ #ifndef T42OBJS_H_ #define T42OBJS_H_ -#include -#include FT_FREETYPE_H -#include FT_TYPE1_TABLES_H -#include FT_INTERNAL_TYPE1_TYPES_H +#include +#include +#include #include "t42types.h" -#include FT_INTERNAL_OBJECTS_H -#include FT_INTERNAL_DRIVER_H -#include FT_SERVICE_POSTSCRIPT_CMAPS_H -#include FT_INTERNAL_POSTSCRIPT_HINTS_H +#include +#include +#include +#include FT_BEGIN_HEADER diff --git a/src/3rdparty/freetype/src/type42/t42parse.c b/src/3rdparty/freetype/src/type42/t42parse.c index c47a7778..98507699 100644 --- a/src/3rdparty/freetype/src/type42/t42parse.c +++ b/src/3rdparty/freetype/src/type42/t42parse.c @@ -4,7 +4,7 @@ * * Type 42 font parser (body). * - * Copyright (C) 2002-2019 by + * Copyright (C) 2002-2020 by * Roberto Alameda. * * This file is part of the FreeType project, and may only be used, @@ -18,9 +18,9 @@ #include "t42parse.h" #include "t42error.h" -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_STREAM_H -#include FT_INTERNAL_POSTSCRIPT_AUX_H +#include +#include +#include /************************************************************************** @@ -826,7 +826,7 @@ if ( loader->num_glyphs > ( limit - parser->root.cursor ) >> 2 ) { FT_TRACE0(( "t42_parse_charstrings: adjusting number of glyphs" - " (from %d to %d)\n", + " (from %d to %ld)\n", loader->num_glyphs, ( limit - parser->root.cursor ) >> 2 )); loader->num_glyphs = ( limit - parser->root.cursor ) >> 2; diff --git a/src/3rdparty/freetype/src/type42/t42parse.h b/src/3rdparty/freetype/src/type42/t42parse.h index 0c7bb484..2ccf052d 100644 --- a/src/3rdparty/freetype/src/type42/t42parse.h +++ b/src/3rdparty/freetype/src/type42/t42parse.h @@ -4,7 +4,7 @@ * * Type 42 font parser (specification). * - * Copyright (C) 2002-2019 by + * Copyright (C) 2002-2020 by * Roberto Alameda. * * This file is part of the FreeType project, and may only be used, @@ -21,7 +21,7 @@ #include "t42objs.h" -#include FT_INTERNAL_POSTSCRIPT_AUX_H +#include FT_BEGIN_HEADER diff --git a/src/3rdparty/freetype/src/type42/t42types.h b/src/3rdparty/freetype/src/type42/t42types.h index a258144e..ba0cc214 100644 --- a/src/3rdparty/freetype/src/type42/t42types.h +++ b/src/3rdparty/freetype/src/type42/t42types.h @@ -4,7 +4,7 @@ * * Type 42 font data types (specification only). * - * Copyright (C) 2002-2019 by + * Copyright (C) 2002-2020 by * Roberto Alameda. * * This file is part of the FreeType project, and may only be used, @@ -20,11 +20,10 @@ #define T42TYPES_H_ -#include -#include FT_FREETYPE_H -#include FT_TYPE1_TABLES_H -#include FT_INTERNAL_TYPE1_TYPES_H -#include FT_INTERNAL_POSTSCRIPT_HINTS_H +#include +#include +#include +#include FT_BEGIN_HEADER diff --git a/src/3rdparty/freetype/src/type42/type42.c b/src/3rdparty/freetype/src/type42/type42.c index 0cb7b77e..012559e2 100644 --- a/src/3rdparty/freetype/src/type42/type42.c +++ b/src/3rdparty/freetype/src/type42/type42.c @@ -4,7 +4,7 @@ * * FreeType Type 42 driver component. * - * Copyright (C) 2002-2019 by + * Copyright (C) 2002-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -17,7 +17,6 @@ #define FT_MAKE_OPTION_SINGLE_OBJECT -#include #include "t42drivr.c" #include "t42objs.c" diff --git a/src/3rdparty/freetype/src/winfonts/Jamfile b/src/3rdparty/freetype/src/winfonts/Jamfile deleted file mode 100644 index 4b922261..00000000 --- a/src/3rdparty/freetype/src/winfonts/Jamfile +++ /dev/null @@ -1,16 +0,0 @@ -# FreeType 2 src/winfonts Jamfile -# -# Copyright (C) 2001-2019 by -# David Turner, Robert Wilhelm, and Werner Lemberg. -# -# This file is part of the FreeType project, and may only be used, modified, -# and distributed under the terms of the FreeType project license, -# LICENSE.TXT. By continuing to use, modify, or distribute this file you -# indicate that you have read the license and understand and accept it -# fully. - -SubDir FT2_TOP $(FT2_SRC_DIR) winfonts ; - -Library $(FT2_LIB) : winfnt.c ; - -# end of src/winfonts Jamfile diff --git a/src/3rdparty/freetype/src/winfonts/fnterrs.h b/src/3rdparty/freetype/src/winfonts/fnterrs.h index af29307c..550de386 100644 --- a/src/3rdparty/freetype/src/winfonts/fnterrs.h +++ b/src/3rdparty/freetype/src/winfonts/fnterrs.h @@ -4,7 +4,7 @@ * * Win FNT/FON error codes (specification only). * - * Copyright (C) 2001-2019 by + * Copyright (C) 2001-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -26,7 +26,7 @@ #ifndef FNTERRS_H_ #define FNTERRS_H_ -#include FT_MODULE_ERRORS_H +#include #undef FTERRORS_H_ @@ -34,7 +34,7 @@ #define FT_ERR_PREFIX FNT_Err_ #define FT_ERR_BASE FT_Mod_Err_Winfonts -#include FT_ERRORS_H +#include #endif /* FNTERRS_H_ */ diff --git a/src/3rdparty/freetype/src/winfonts/module.mk b/src/3rdparty/freetype/src/winfonts/module.mk index 82fb0151..4614c55f 100644 --- a/src/3rdparty/freetype/src/winfonts/module.mk +++ b/src/3rdparty/freetype/src/winfonts/module.mk @@ -3,7 +3,7 @@ # -# Copyright (C) 1996-2019 by +# Copyright (C) 1996-2020 by # David Turner, Robert Wilhelm, and Werner Lemberg. # # This file is part of the FreeType project, and may only be used, modified, diff --git a/src/3rdparty/freetype/src/winfonts/rules.mk b/src/3rdparty/freetype/src/winfonts/rules.mk index 998d49bc..e73ef5ea 100644 --- a/src/3rdparty/freetype/src/winfonts/rules.mk +++ b/src/3rdparty/freetype/src/winfonts/rules.mk @@ -3,7 +3,7 @@ # -# Copyright (C) 1996-2019 by +# Copyright (C) 1996-2020 by # David Turner, Robert Wilhelm, and Werner Lemberg. # # This file is part of the FreeType project, and may only be used, modified, diff --git a/src/3rdparty/freetype/src/winfonts/winfnt.c b/src/3rdparty/freetype/src/winfonts/winfnt.c index 2d771be2..e83312d1 100644 --- a/src/3rdparty/freetype/src/winfonts/winfnt.c +++ b/src/3rdparty/freetype/src/winfonts/winfnt.c @@ -4,7 +4,7 @@ * * FreeType font driver for Windows FNT/FON files * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * Copyright 2003 Huw D M Davies for Codeweavers * Copyright 2007 Dmitry Timoshkov for Codeweavers @@ -18,17 +18,16 @@ */ -#include -#include FT_WINFONTS_H -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_STREAM_H -#include FT_INTERNAL_OBJECTS_H -#include FT_TRUETYPE_IDS_H +#include +#include +#include +#include +#include #include "winfnt.h" #include "fnterrs.h" -#include FT_SERVICE_WINFNT_H -#include FT_SERVICE_FONT_FORMAT_H +#include +#include /************************************************************************** * @@ -331,7 +330,7 @@ { FT_TRACE2(( "invalid alignment shift count for resource data\n" )); error = FT_THROW( Invalid_File_Format ); - goto Exit; + goto Exit1; } @@ -597,6 +596,10 @@ Exit: return error; + + Exit1: + FT_FRAME_EXIT(); + goto Exit; } diff --git a/src/3rdparty/freetype/src/winfonts/winfnt.h b/src/3rdparty/freetype/src/winfonts/winfnt.h index b628ad4c..3367c771 100644 --- a/src/3rdparty/freetype/src/winfonts/winfnt.h +++ b/src/3rdparty/freetype/src/winfonts/winfnt.h @@ -4,7 +4,7 @@ * * FreeType font driver for Windows FNT/FON files * - * Copyright (C) 1996-2019 by + * Copyright (C) 1996-2020 by * David Turner, Robert Wilhelm, and Werner Lemberg. * Copyright 2007 Dmitry Timoshkov for Codeweavers * @@ -21,9 +21,8 @@ #define WINFNT_H_ -#include -#include FT_WINFONTS_H -#include FT_INTERNAL_DRIVER_H +#include +#include FT_BEGIN_HEADER diff --git a/src/3rdparty/gradle/LICENSE b/src/3rdparty/gradle/LICENSE new file mode 100644 index 00000000..f013fd5d --- /dev/null +++ b/src/3rdparty/gradle/LICENSE @@ -0,0 +1,420 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + +============================================================================== +Licenses for included components: + +------------------------------------------------------------------------------ +Eclipse Public License 1.0 +https://opensource.org/licenses/EPL-1.0 + +junit:junit +org.sonatype.aether:aether-api +org.sonatype.aether:aether-connector-wagon +org.sonatype.aether:aether-impl +org.sonatype.aether:aether-spi +org.sonatype.aether:aether-util + +------------------------------------------------------------------------------ +3-Clause BSD +https://opensource.org/licenses/BSD-3-Clause + +com.google.code.findbugs:jsr305 + +org.hamcrest:hamcrest-core +BSD License + +Copyright (c) 2000-2015 www.hamcrest.org +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +Redistributions of source code must retain the above copyright notice, this list of +conditions and the following disclaimer. Redistributions in binary form must reproduce +the above copyright notice, this list of conditions and the following disclaimer in +the documentation and/or other materials provided with the distribution. + +Neither the name of Hamcrest nor the names of its contributors may be used to endorse +or promote products derived from this software without specific prior written +permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT +SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY +WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. + +com.esotericsoftware.kryo:kryo +com.esotericsoftware.minlog:minlog +Copyright (c) 2008-2018, Nathan Sweet All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. +Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. +Neither the name of Esoteric Software nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +org.ow2.asm:asm +org.ow2.asm:asm-analysis +org.ow2.asm:asm-commons +org.ow2.asm:asm-tree +org.ow2.asm:asm-util +ASM: a very small and fast Java bytecode manipulation framework + Copyright (c) 2000-2011 INRIA, France Telecom + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the copyright holders nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + THE POSSIBILITY OF SUCH DAMAGE. + +------------------------------------------------------------------------------ +MIT + +com.googlecode.plist:dd-plist +dd-plist - An open source library to parse and generate property lists +Copyright (C) 2016 Daniel Dreibrodt + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +org.bouncycastle:bcpg-jdk15on +org.bouncycastle:bcprov-jdk15on +Copyright (c) 2000 - 2019 The Legion of the Bouncy Castle Inc. (https://www.bouncycastle.org) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +org.slf4j:jcl-over-slf4j +org.slf4j:jul-to-slf4j +org.slf4j:log4j-over-slf4j +org.slf4j:slf4j-api + Copyright (c) 2004-2017 QOS.ch + All rights reserved. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +------------------------------------------------------------------------------ +CDDL +https://opensource.org/licenses/CDDL-1.0 + +com.sun.xml.bind:jaxb-impl + +------------------------------------------------------------------------------ +LGPL 2.1 +https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html + +org.samba.jcifs:jcifs + +org.jetbrains.intellij.deps:trove4j + +------------------------------------------------------------------------------ +License for the GNU Trove library included by the Kotlin embeddable compiler +------------------------------------------------------------------------------ +The source code for GNU Trove is licensed under the Lesser GNU Public License (LGPL). + + Copyright (c) 2001, Eric D. Friedman All Rights Reserved. This library is free software; you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without + even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + You should have received a copy of the GNU Lesser General Public License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + +Two classes (HashFunctions and PrimeFinder) included in Trove are licensed under the following terms: + + Copyright (c) 1999 CERN - European Organization for Nuclear Research. Permission to use, copy, modify, distribute and sell this software + and its documentation for any purpose is hereby granted without fee, provided that the above copyright notice appear in all copies and + that both that copyright notice and this permission notice appear in supporting documentation. CERN makes no representations about the + suitability of this software for any purpose. It is provided "as is" without expressed or implied warranty. + +The source code of modified GNU Trove library is available at + https://github.com/JetBrains/intellij-deps-trove4j (with trove4j_changes.txt describing the changes) + +------------------------------------------------------------------------------ +Eclipse Distribution License 1.0 +https://www.eclipse.org/org/documents/edl-v10.php + +org.eclipse.jgit:org.eclipse.jgit + +------------------------------------------------------------------------------ +BSD-style + +com.jcraft:jsch +com.jcraft:jzlib + +Copyright (c) 2000-2011 ymnk, JCraft,Inc. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the distribution. + + 3. The names of the authors may not be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, +INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT, +INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, +OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +------------------------------------------------------------------------------ +Eclipse Public License 2.0 +https://www.eclipse.org/legal/epl-2.0/ + +org.junit.platform:junit-platform-launcher + +------------------------------------------------------------------------------ +Mozilla Public License 2.0 +https://www.mozilla.org/en-US/MPL/2.0/ + +org.mozilla:rhino diff --git a/src/3rdparty/gradle/LICENSE-GRADLEW.txt b/src/3rdparty/gradle/LICENSE-GRADLEW.txt deleted file mode 100644 index 0f3f8864..00000000 --- a/src/3rdparty/gradle/LICENSE-GRADLEW.txt +++ /dev/null @@ -1,965 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright {yyyy} {name of copyright owner} - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - - - -============================================================================== -Gradle Subcomponents: - ------------------------------------------------------------------------------- -License for the slf4j package ------------------------------------------------------------------------------- -SLF4J License - -Copyright (c) 2004-2007 QOS.ch -All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -These terms are identical to those of the MIT License, also called the X License or the X11 License, -which is a simple, permissive non-copyleft free software license. It is deemed compatible with virtually -all types of licenses, commercial or otherwise. In particular, the Free Software Foundation has declared it -compatible with GNU GPL. It is also known to be approved by the Apache Software Foundation as compatible -with Apache Software License. - - ------------------------------------------------------------------------------- -License for the JUnit package ------------------------------------------------------------------------------- -THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS COMMON PUBLIC -LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM -CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT. - -1. DEFINITIONS - -"Contribution" means: - -a) in the case of the initial Contributor, the initial code and -documentation distributed under this Agreement, and - -b) in the case of each subsequent Contributor: - -i) changes to the Program, and - -ii) additions to the Program; - -where such changes and/or additions to the Program originate from and are -distributed by that particular Contributor. A Contribution 'originates' from a -Contributor if it was added to the Program by such Contributor itself or anyone -acting on such Contributor's behalf. Contributions do not include additions to -the Program which: (i) are separate modules of software distributed in -conjunction with the Program under their own license agreement, and (ii) are not -derivative works of the Program. - -"Contributor" means any person or entity that distributes the Program. - -"Licensed Patents " mean patent claims licensable by a Contributor which are -necessarily infringed by the use or sale of its Contribution alone or when -combined with the Program. - -"Program" means the Contributions distributed in accordance with this Agreement. - -"Recipient" means anyone who receives the Program under this Agreement, -including all Contributors. - -2. GRANT OF RIGHTS - -a) Subject to the terms of this Agreement, each Contributor hereby grants -Recipient a non-exclusive, worldwide, royalty-free copyright license to -reproduce, prepare derivative works of, publicly display, publicly perform, -distribute and sublicense the Contribution of such Contributor, if any, and such -derivative works, in source code and object code form. - -b) Subject to the terms of this Agreement, each Contributor hereby grants -Recipient a non-exclusive, worldwide, royalty-free patent license under Licensed -Patents to make, use, sell, offer to sell, import and otherwise transfer the -Contribution of such Contributor, if any, in source code and object code form. -This patent license shall apply to the combination of the Contribution and the -Program if, at the time the Contribution is added by the Contributor, such -addition of the Contribution causes such combination to be covered by the -Licensed Patents. The patent license shall not apply to any other combinations -which include the Contribution. No hardware per se is licensed hereunder. - -c) Recipient understands that although each Contributor grants the licenses -to its Contributions set forth herein, no assurances are provided by any -Contributor that the Program does not infringe the patent or other intellectual -property rights of any other entity. Each Contributor disclaims any liability to -Recipient for claims brought by any other entity based on infringement of -intellectual property rights or otherwise. As a condition to exercising the -rights and licenses granted hereunder, each Recipient hereby assumes sole -responsibility to secure any other intellectual property rights needed, if any. -For example, if a third party patent license is required to allow Recipient to -distribute the Program, it is Recipient's responsibility to acquire that license -before distributing the Program. - -d) Each Contributor represents that to its knowledge it has sufficient -copyright rights in its Contribution, if any, to grant the copyright license set -forth in this Agreement. - -3. REQUIREMENTS - -A Contributor may choose to distribute the Program in object code form under its -own license agreement, provided that: - -a) it complies with the terms and conditions of this Agreement; and - -b) its license agreement: - -i) effectively disclaims on behalf of all Contributors all warranties and -conditions, express and implied, including warranties or conditions of title and -non-infringement, and implied warranties or conditions of merchantability and -fitness for a particular purpose; - -ii) effectively excludes on behalf of all Contributors all liability for -damages, including direct, indirect, special, incidental and consequential -damages, such as lost profits; - -iii) states that any provisions which differ from this Agreement are offered -by that Contributor alone and not by any other party; and - -iv) states that source code for the Program is available from such -Contributor, and informs licensees how to obtain it in a reasonable manner on or -through a medium customarily used for software exchange. - -When the Program is made available in source code form: - -a) it must be made available under this Agreement; and - -b) a copy of this Agreement must be included with each copy of the Program. - -Contributors may not remove or alter any copyright notices contained within the -Program. - -Each Contributor must identify itself as the originator of its Contribution, if -any, in a manner that reasonably allows subsequent Recipients to identify the -originator of the Contribution. - -4. COMMERCIAL DISTRIBUTION - -Commercial distributors of software may accept certain responsibilities with -respect to end users, business partners and the like. While this license is -intended to facilitate the commercial use of the Program, the Contributor who -includes the Program in a commercial product offering should do so in a manner -which does not create potential liability for other Contributors. Therefore, if -a Contributor includes the Program in a commercial product offering, such -Contributor ("Commercial Contributor") hereby agrees to defend and indemnify -every other Contributor ("Indemnified Contributor") against any losses, damages -and costs (collectively "Losses") arising from claims, lawsuits and other legal -actions brought by a third party against the Indemnified Contributor to the -extent caused by the acts or omissions of such Commercial Contributor in -connection with its distribution of the Program in a commercial product -offering. The obligations in this section do not apply to any claims or Losses -relating to any actual or alleged intellectual property infringement. In order -to qualify, an Indemnified Contributor must: a) promptly notify the Commercial -Contributor in writing of such claim, and b) allow the Commercial Contributor to -control, and cooperate with the Commercial Contributor in, the defense and any -related settlement negotiations. The Indemnified Contributor may participate in -any such claim at its own expense. - -For example, a Contributor might include the Program in a commercial product -offering, Product X. That Contributor is then a Commercial Contributor. If that -Commercial Contributor then makes performance claims, or offers warranties -related to Product X, those performance claims and warranties are such -Commercial Contributor's responsibility alone. Under this section, the -Commercial Contributor would have to defend claims against the other -Contributors related to those performance claims and warranties, and if a court -requires any other Contributor to pay any damages as a result, the Commercial -Contributor must pay those damages. - -5. NO WARRANTY - -EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN -"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR -IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, -NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each -Recipient is solely responsible for determining the appropriateness of using and -distributing the Program and assumes all risks associated with its exercise of -rights under this Agreement, including but not limited to the risks and costs of -program errors, compliance with applicable laws, damage to or loss of data, -programs or equipment, and unavailability or interruption of operations. - -6. DISCLAIMER OF LIABILITY - -EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY -CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST -PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS -GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. - -7. GENERAL - -If any provision of this Agreement is invalid or unenforceable under applicable -law, it shall not affect the validity or enforceability of the remainder of the -terms of this Agreement, and without further action by the parties hereto, such -provision shall be reformed to the minimum extent necessary to make such -provision valid and enforceable. - -If Recipient institutes patent litigation against a Contributor with respect to -a patent applicable to software (including a cross-claim or counterclaim in a -lawsuit), then any patent licenses granted by that Contributor to such Recipient -under this Agreement shall terminate as of the date such litigation is filed. In -addition, if Recipient institutes patent litigation against any entity -(including a cross-claim or counterclaim in a lawsuit) alleging that the Program -itself (excluding combinations of the Program with other software or hardware) -infringes such Recipient's patent(s), then such Recipient's rights granted under -Section 2(b) shall terminate as of the date such litigation is filed. - -All Recipient's rights under this Agreement shall terminate if it fails to -comply with any of the material terms or conditions of this Agreement and does -not cure such failure in a reasonable period of time after becoming aware of -such noncompliance. If all Recipient's rights under this Agreement terminate, -Recipient agrees to cease use and distribution of the Program as soon as -reasonably practicable. However, Recipient's obligations under this Agreement -and any licenses granted by Recipient relating to the Program shall continue and -survive. - -Everyone is permitted to copy and distribute copies of this Agreement, but in -order to avoid inconsistency the Agreement is copyrighted and may only be -modified in the following manner. The Agreement Steward reserves the right to -publish new versions (including revisions) of this Agreement from time to time. -No one other than the Agreement Steward has the right to modify this Agreement. -IBM is the initial Agreement Steward. IBM may assign the responsibility to serve -as the Agreement Steward to a suitable separate entity. Each new version of the -Agreement will be given a distinguishing version number. The Program (including -Contributions) may always be distributed subject to the version of the Agreement -under which it was received. In addition, after a new version of the Agreement -is published, Contributor may elect to distribute the Program (including its -Contributions) under the new version. Except as expressly stated in Sections -2(a) and 2(b) above, Recipient receives no rights or licenses to the -intellectual property of any Contributor under this Agreement, whether -expressly, by implication, estoppel or otherwise. All rights in the Program not -expressly granted under this Agreement are reserved. - -This Agreement is governed by the laws of the State of New York and the -intellectual property laws of the United States of America. No party to this -Agreement will bring a legal action under this Agreement more than one year -after the cause of action arose. Each party waives its rights to a jury trial in -any resulting litigation. - ------------------------------------------------------------------------------- -License for the JCIFS package ------------------------------------------------------------------------------- -JCIFS License - - GNU LESSER GENERAL PUBLIC LICENSE - Version 2.1, February 1999 - - Copyright (C) 1991, 1999 Free Software Foundation, Inc. - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - -[This is the first released version of the Lesser GPL. It also counts - as the successor of the GNU Library Public License, version 2, hence - the version number 2.1.] - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -Licenses are intended to guarantee your freedom to share and change -free software--to make sure the software is free for all its users. - - This license, the Lesser General Public License, applies to some -specially designated software packages--typically libraries--of the -Free Software Foundation and other authors who decide to use it. You -can use it too, but we suggest you first think carefully about whether -this license or the ordinary General Public License is the better -strategy to use in any particular case, based on the explanations below. - - When we speak of free software, we are referring to freedom of use, -not price. Our General Public Licenses are designed to make sure that -you have the freedom to distribute copies of free software (and charge -for this service if you wish); that you receive source code or can get -it if you want it; that you can change the software and use pieces of -it in new free programs; and that you are informed that you can do -these things. - - To protect your rights, we need to make restrictions that forbid -distributors to deny you these rights or to ask you to surrender these -rights. These restrictions translate to certain responsibilities for -you if you distribute copies of the library or if you modify it. - - For example, if you distribute copies of the library, whether gratis -or for a fee, you must give the recipients all the rights that we gave -you. You must make sure that they, too, receive or can get the source -code. If you link other code with the library, you must provide -complete object files to the recipients, so that they can relink them -with the library after making changes to the library and recompiling -it. And you must show them these terms so they know their rights. - - We protect your rights with a two-step method: (1) we copyright the -library, and (2) we offer you this license, which gives you legal -permission to copy, distribute and/or modify the library. - - To protect each distributor, we want to make it very clear that -there is no warranty for the free library. Also, if the library is -modified by someone else and passed on, the recipients should know -that what they have is not the original version, so that the original -author's reputation will not be affected by problems that might be -introduced by others. - - Finally, software patents pose a constant threat to the existence of -any free program. We wish to make sure that a company cannot -effectively restrict the users of a free program by obtaining a -restrictive license from a patent holder. Therefore, we insist that -any patent license obtained for a version of the library must be -consistent with the full freedom of use specified in this license. - - Most GNU software, including some libraries, is covered by the -ordinary GNU General Public License. This license, the GNU Lesser -General Public License, applies to certain designated libraries, and -is quite different from the ordinary General Public License. We use -this license for certain libraries in order to permit linking those -libraries into non-free programs. - - When a program is linked with a library, whether statically or using -a shared library, the combination of the two is legally speaking a -combined work, a derivative of the original library. The ordinary -General Public License therefore permits such linking only if the -entire combination fits its criteria of freedom. The Lesser General -Public License permits more lax criteria for linking other code with -the library. - - We call this license the "Lesser" General Public License because it -does Less to protect the user's freedom than the ordinary General -Public License. It also provides other free software developers Less -of an advantage over competing non-free programs. These disadvantages -are the reason we use the ordinary General Public License for many -libraries. However, the Lesser license provides advantages in certain -special circumstances. - - For example, on rare occasions, there may be a special need to -encourage the widest possible use of a certain library, so that it becomes -a de-facto standard. To achieve this, non-free programs must be -allowed to use the library. A more frequent case is that a free -library does the same job as widely used non-free libraries. In this -case, there is little to gain by limiting the free library to free -software only, so we use the Lesser General Public License. - - In other cases, permission to use a particular library in non-free -programs enables a greater number of people to use a large body of -free software. For example, permission to use the GNU C Library in -non-free programs enables many more people to use the whole GNU -operating system, as well as its variant, the GNU/Linux operating -system. - - Although the Lesser General Public License is Less protective of the -users' freedom, it does ensure that the user of a program that is -linked with the Library has the freedom and the wherewithal to run -that program using a modified version of the Library. - - The precise terms and conditions for copying, distribution and -modification follow. Pay close attention to the difference between a -"work based on the library" and a "work that uses the library". The -former contains code derived from the library, whereas the latter must -be combined with the library in order to run. - - GNU LESSER GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License Agreement applies to any software library or other -program which contains a notice placed by the copyright holder or -other authorized party saying it may be distributed under the terms of -this Lesser General Public License (also called "this License"). -Each licensee is addressed as "you". - - A "library" means a collection of software functions and/or data -prepared so as to be conveniently linked with application programs -(which use some of those functions and data) to form executables. - - The "Library", below, refers to any such software library or work -which has been distributed under these terms. A "work based on the -Library" means either the Library or any derivative work under -copyright law: that is to say, a work containing the Library or a -portion of it, either verbatim or with modifications and/or translated -straightforwardly into another language. (Hereinafter, translation is -included without limitation in the term "modification".) - - "Source code" for a work means the preferred form of the work for -making modifications to it. For a library, complete source code means -all the source code for all modules it contains, plus any associated -interface definition files, plus the scripts used to control compilation -and installation of the library. - - Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running a program using the Library is not restricted, and output from -such a program is covered only if its contents constitute a work based -on the Library (independent of the use of the Library in a tool for -writing it). Whether that is true depends on what the Library does -and what the program that uses the Library does. - - 1. You may copy and distribute verbatim copies of the Library's -complete source code as you receive it, in any medium, provided that -you conspicuously and appropriately publish on each copy an -appropriate copyright notice and disclaimer of warranty; keep intact -all the notices that refer to this License and to the absence of any -warranty; and distribute a copy of this License along with the -Library. - - You may charge a fee for the physical act of transferring a copy, -and you may at your option offer warranty protection in exchange for a -fee. - - 2. You may modify your copy or copies of the Library or any portion -of it, thus forming a work based on the Library, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) The modified work must itself be a software library. - - b) You must cause the files modified to carry prominent notices - stating that you changed the files and the date of any change. - - c) You must cause the whole of the work to be licensed at no - charge to all third parties under the terms of this License. - - d) If a facility in the modified Library refers to a function or a - table of data to be supplied by an application program that uses - the facility, other than as an argument passed when the facility - is invoked, then you must make a good faith effort to ensure that, - in the event an application does not supply such function or - table, the facility still operates, and performs whatever part of - its purpose remains meaningful. - - (For example, a function in a library to compute square roots has - a purpose that is entirely well-defined independent of the - application. Therefore, Subsection 2d requires that any - application-supplied function or table used by this function must - be optional: if the application does not supply it, the square - root function must still compute square roots.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Library, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Library, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote -it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Library. - -In addition, mere aggregation of another work not based on the Library -with the Library (or with a work based on the Library) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may opt to apply the terms of the ordinary GNU General Public -License instead of this License to a given copy of the Library. To do -this, you must alter all the notices that refer to this License, so -that they refer to the ordinary GNU General Public License, version 2, -instead of to this License. (If a newer version than version 2 of the -ordinary GNU General Public License has appeared, then you can specify -that version instead if you wish.) Do not make any other change in -these notices. - - Once this change is made in a given copy, it is irreversible for -that copy, so the ordinary GNU General Public License applies to all -subsequent copies and derivative works made from that copy. - - This option is useful when you wish to copy part of the code of -the Library into a program that is not a library. - - 4. You may copy and distribute the Library (or a portion or -derivative of it, under Section 2) in object code or executable form -under the terms of Sections 1 and 2 above provided that you accompany -it with the complete corresponding machine-readable source code, which -must be distributed under the terms of Sections 1 and 2 above on a -medium customarily used for software interchange. - - If distribution of object code is made by offering access to copy -from a designated place, then offering equivalent access to copy the -source code from the same place satisfies the requirement to -distribute the source code, even though third parties are not -compelled to copy the source along with the object code. - - 5. A program that contains no derivative of any portion of the -Library, but is designed to work with the Library by being compiled or -linked with it, is called a "work that uses the Library". Such a -work, in isolation, is not a derivative work of the Library, and -therefore falls outside the scope of this License. - - However, linking a "work that uses the Library" with the Library -creates an executable that is a derivative of the Library (because it -contains portions of the Library), rather than a "work that uses the -library". The executable is therefore covered by this License. -Section 6 states terms for distribution of such executables. - - When a "work that uses the Library" uses material from a header file -that is part of the Library, the object code for the work may be a -derivative work of the Library even though the source code is not. -Whether this is true is especially significant if the work can be -linked without the Library, or if the work is itself a library. The -threshold for this to be true is not precisely defined by law. - - If such an object file uses only numerical parameters, data -structure layouts and accessors, and small macros and small inline -functions (ten lines or less in length), then the use of the object -file is unrestricted, regardless of whether it is legally a derivative -work. (Executables containing this object code plus portions of the -Library will still fall under Section 6.) - - Otherwise, if the work is a derivative of the Library, you may -distribute the object code for the work under the terms of Section 6. -Any executables containing that work also fall under Section 6, -whether or not they are linked directly with the Library itself. - - 6. As an exception to the Sections above, you may also combine or -link a "work that uses the Library" with the Library to produce a -work containing portions of the Library, and distribute that work -under terms of your choice, provided that the terms permit -modification of the work for the customer's own use and reverse -engineering for debugging such modifications. - - You must give prominent notice with each copy of the work that the -Library is used in it and that the Library and its use are covered by -this License. You must supply a copy of this License. If the work -during execution displays copyright notices, you must include the -copyright notice for the Library among them, as well as a reference -directing the user to the copy of this License. Also, you must do one -of these things: - - a) Accompany the work with the complete corresponding - machine-readable source code for the Library including whatever - changes were used in the work (which must be distributed under - Sections 1 and 2 above); and, if the work is an executable linked - with the Library, with the complete machine-readable "work that - uses the Library", as object code and/or source code, so that the - user can modify the Library and then relink to produce a modified - executable containing the modified Library. (It is understood - that the user who changes the contents of definitions files in the - Library will not necessarily be able to recompile the application - to use the modified definitions.) - - b) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (1) uses at run time a - copy of the library already present on the user's computer system, - rather than copying library functions into the executable, and (2) - will operate properly with a modified version of the library, if - the user installs one, as long as the modified version is - interface-compatible with the version that the work was made with. - - c) Accompany the work with a written offer, valid for at - least three years, to give the same user the materials - specified in Subsection 6a, above, for a charge no more - than the cost of performing this distribution. - - d) If distribution of the work is made by offering access to copy - from a designated place, offer equivalent access to copy the above - specified materials from the same place. - - e) Verify that the user has already received a copy of these - materials or that you have already sent this user a copy. - - For an executable, the required form of the "work that uses the -Library" must include any data and utility programs needed for -reproducing the executable from it. However, as a special exception, -the materials to be distributed need not include anything that is -normally distributed (in either source or binary form) with the major -components (compiler, kernel, and so on) of the operating system on -which the executable runs, unless that component itself accompanies -the executable. - - It may happen that this requirement contradicts the license -restrictions of other proprietary libraries that do not normally -accompany the operating system. Such a contradiction means you cannot -use both them and the Library together in an executable that you -distribute. - - 7. You may place library facilities that are a work based on the -Library side-by-side in a single library together with other library -facilities not covered by this License, and distribute such a combined -library, provided that the separate distribution of the work based on -the Library and of the other library facilities is otherwise -permitted, and provided that you do these two things: - - a) Accompany the combined library with a copy of the same work - based on the Library, uncombined with any other library - facilities. This must be distributed under the terms of the - Sections above. - - b) Give prominent notice with the combined library of the fact - that part of it is a work based on the Library, and explaining - where to find the accompanying uncombined form of the same work. - - 8. You may not copy, modify, sublicense, link with, or distribute -the Library except as expressly provided under this License. Any -attempt otherwise to copy, modify, sublicense, link with, or -distribute the Library is void, and will automatically terminate your -rights under this License. However, parties who have received copies, -or rights, from you under this License will not have their licenses -terminated so long as such parties remain in full compliance. - - 9. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Library or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Library (or any work based on the -Library), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Library or works based on it. - - 10. Each time you redistribute the Library (or any work based on the -Library), the recipient automatically receives a license from the -original licensor to copy, distribute, link with or modify the Library -subject to these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties with -this License. - - 11. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Library at all. For example, if a patent -license would not permit royalty-free redistribution of the Library by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Library. - -If any portion of this section is held invalid or unenforceable under any -particular circumstance, the balance of the section is intended to apply, -and the section as a whole is intended to apply in other circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 12. If the distribution and/or use of the Library is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Library under this License may add -an explicit geographical distribution limitation excluding those countries, -so that distribution is permitted only in or among countries not thus -excluded. In such case, this License incorporates the limitation as if -written in the body of this License. - - 13. The Free Software Foundation may publish revised and/or new -versions of the Lesser General Public License from time to time. -Such new versions will be similar in spirit to the present version, -but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Library -specifies a version number of this License which applies to it and -"any later version", you have the option of following the terms and -conditions either of that version or of any later version published by -the Free Software Foundation. If the Library does not specify a -license version number, you may choose any version ever published by -the Free Software Foundation. - - 14. If you wish to incorporate parts of the Library into other free -programs whose distribution conditions are incompatible with these, -write to the author to ask for permission. For software which is -copyrighted by the Free Software Foundation, write to the Free -Software Foundation; we sometimes make exceptions for this. Our -decision will be guided by the two goals of preserving the free status -of all derivatives of our free software and of promoting the sharing -and reuse of software generally. - - NO WARRANTY - - 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO -WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. -EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR -OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY -KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE -LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME -THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN -WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY -AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU -FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR -CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE -LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING -RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A -FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF -SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Libraries - - If you develop a new library, and you want it to be of the greatest -possible use to the public, we recommend making it free software that -everyone can redistribute and change. You can do so by permitting -redistribution under these terms (or, alternatively, under the terms of the -ordinary General Public License). - - To apply these terms, attach the following notices to the library. It is -safest to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least the -"copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - -Also add information on how to contact you by electronic and paper mail. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the library, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the - library `Frob' (a library for tweaking knobs) written by James Random Hacker. - - , 1 April 1990 - Ty Coon, President of Vice - -That's all there is to it! - diff --git a/src/3rdparty/gradle/gradle.properties b/src/3rdparty/gradle/gradle.properties index fded106b..263d7023 100644 --- a/src/3rdparty/gradle/gradle.properties +++ b/src/3rdparty/gradle/gradle.properties @@ -3,7 +3,10 @@ # http://www.gradle.org/docs/current/userguide/build_environment.html # Specifies the JVM arguments used for the daemon process. # The setting is particularly useful for tweaking memory settings. -org.gradle.jvmargs=-Xmx2048m +org.gradle.jvmargs=-Xmx2500m -XX:MaxMetaspaceSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 + +# Enable building projects in parallel +org.gradle.parallel=true # Gradle caching allows reusing the build artifacts from a previous # build with the same inputs. However, over time, the cache size will diff --git a/src/3rdparty/gradle/gradle/wrapper/gradle-wrapper.properties b/src/3rdparty/gradle/gradle/wrapper/gradle-wrapper.properties index 5028f28f..ffed3a25 100644 --- a/src/3rdparty/gradle/gradle/wrapper/gradle-wrapper.properties +++ b/src/3rdparty/gradle/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/src/3rdparty/gradle/gradlew b/src/3rdparty/gradle/gradlew index cccdd3d5..005bcde0 100755 --- a/src/3rdparty/gradle/gradlew +++ b/src/3rdparty/gradle/gradlew @@ -1,78 +1,129 @@ -#!/usr/bin/env sh +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ############################################################################## -## -## Gradle start up script for UN*X -## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# ############################################################################## # Attempt to set APP_HOME + # Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null + +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` +APP_BASE_NAME=${0##*/} # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS="" +DEFAULT_JVM_OPTS='-Dfile.encoding=UTF-8 "-Xmx64m" "-Xms64m"' # Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" +MAX_FD=maximum warn () { echo "$*" -} +} >&2 die () { echo echo "$*" echo exit 1 -} +} >&2 # OS specific support (must be 'true' or 'false'). cygwin=false msys=false darwin=false nonstop=false -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MINGW* ) - msys=true - ;; - NONSTOP* ) - nonstop=true - ;; +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; esac CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + # Determine the Java command to use to start the JVM. if [ -n "$JAVA_HOME" ] ; then if [ -x "$JAVA_HOME/jre/sh/java" ] ; then # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" + JAVACMD=$JAVA_HOME/jre/sh/java else - JAVACMD="$JAVA_HOME/bin/java" + JAVACMD=$JAVA_HOME/bin/java fi if [ ! -x "$JAVACMD" ] ; then die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME @@ -81,7 +132,7 @@ Please set the JAVA_HOME variable in your environment to match the location of your Java installation." fi else - JAVACMD="java" + JAVACMD=java which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the @@ -89,84 +140,95 @@ location of your Java installation." fi # Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ] ; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi -fi - -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -fi - -# For Cygwin, switch paths to Windows format before running java -if $cygwin ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - JAVACMD=`cygpath --unix "$JAVACMD"` - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` - SEP="" - for dir in $ROOTDIRSRAW ; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi - # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` - else - eval `echo args$i`="\"$arg\"" - fi - i=$((i+1)) - done - case $i in - (0) set -- ;; - (1) set -- "$args0" ;; - (2) set -- "$args0" "$args1" ;; - (3) set -- "$args0" "$args1" "$args2" ;; - (4) set -- "$args0" "$args1" "$args2" "$args3" ;; - (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" esac fi -# Escape application args -save () { - for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done - echo " " -} -APP_ARGS=$(save "$@") +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. -# Collect all arguments for the java command, following the shell quoting and substitution rules -eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) -# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong -if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then - cd "$(dirname "$0")" + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done fi +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + exec "$JAVACMD" "$@" diff --git a/src/3rdparty/gradle/gradlew.bat b/src/3rdparty/gradle/gradlew.bat index f9553162..4cc84e58 100644 --- a/src/3rdparty/gradle/gradlew.bat +++ b/src/3rdparty/gradle/gradlew.bat @@ -1,84 +1,89 @@ -@if "%DEBUG%" == "" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS= - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto init - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto init - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:init -@rem Get command-line arguments, handling Windows variants - -if not "%OS%" == "Windows_NT" goto win9xME_args - -:win9xME_args -@rem Slurp the command line arguments. -set CMD_LINE_ARGS= -set _SKIP=2 - -:win9xME_args_slurp -if "x%~1" == "x" goto execute - -set CMD_LINE_ARGS=%* - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% - -:end -@rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS=-Dfile.encoding=UTF-8 "-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/src/3rdparty/gradle/qt_attribution.json b/src/3rdparty/gradle/qt_attribution.json index 699fe311..7a7f34e0 100644 --- a/src/3rdparty/gradle/qt_attribution.json +++ b/src/3rdparty/gradle/qt_attribution.json @@ -4,12 +4,11 @@ "QDocModule": "qtcore", "QtParts": ["tools"], "Homepage": "https://gradle.org", - "Version": "3.4.1", - "DownloadLocation": "https://github.com/gradle/gradle/releases/tag/v3.4.1", + "Version": "7.2.0", + "DownloadLocation": "https://github.com/gradle/gradle/releases/tag/v7.2.0", "QtUsage": "Needed to create Android packages", - "License": "Apache License 2.0", "LicenseId": "Apache-2.0", - "LicenseFile": "LICENSE-GRADLEW.txt", - "Copyright": "Copyright (C) 2017 Gradle Inc." + "LicenseFile": "LICENSE", + "Copyright": "Copyright (C) 2021 Gradle Inc." } diff --git a/src/3rdparty/harfbuzz-ng/harfbuzz-ng.pro b/src/3rdparty/harfbuzz-ng/harfbuzz-ng.pro index 332955e2..19699389 100644 --- a/src/3rdparty/harfbuzz-ng/harfbuzz-ng.pro +++ b/src/3rdparty/harfbuzz-ng/harfbuzz-ng.pro @@ -169,7 +169,7 @@ contains(SHAPERS, coretext) { DEFINES += HAVE_CORETEXT SOURCES += \ - $$PWD/src/hb-coretext.cc + $$PWD/src/hb-coretext.mm HEADERS += \ $$PWD/src/hb-coretext.h diff --git a/src/3rdparty/harfbuzz-ng/src/hb-coretext.cc b/src/3rdparty/harfbuzz-ng/src/hb-coretext.mm similarity index 98% rename from src/3rdparty/harfbuzz-ng/src/hb-coretext.cc rename to src/3rdparty/harfbuzz-ng/src/hb-coretext.mm index 11b6deee..185f73cd 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-coretext.cc +++ b/src/3rdparty/harfbuzz-ng/src/hb-coretext.mm @@ -35,6 +35,7 @@ #include "hb-coretext.h" #include +#include typedef bool (*qt_get_font_table_func_t) (void *user_data, unsigned int tag, unsigned char *buffer, unsigned int *length); @@ -1324,7 +1325,21 @@ _hb_coretext_aat_shaper_face_data_create (hb_face_t *face) { static const hb_tag_t tags[] = {HB_CORETEXT_TAG_MORX, HB_CORETEXT_TAG_MORT, HB_CORETEXT_TAG_KERX, HB_CORETEXT_TAG_TRAK}; - for (unsigned int i = 0; i < ARRAY_LENGTH (tags); i++) + // Disable macOS 11 / iOS 14 specific hotfix for Qt on older versions, since it caused a + // regression. (Note: This code should not been upstreamed and is only applicable to Qt 5.15.x). + NSInteger majorVersion = NSProcessInfo.processInfo.operatingSystemVersion.majorVersion; + NSInteger hotfixMinimumVersion; +#if defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE + hotfixMinimumVersion = 14; +#else + hotfixMinimumVersion = 11; +#endif + + unsigned int arrayLength = ARRAY_LENGTH (tags); + if (majorVersion < hotfixMinimumVersion) + arrayLength--; + + for (unsigned int i = 0; i < arrayLength; i++) { hb_blob_t *blob = face->reference_table (tags[i]); if (hb_blob_get_length (blob)) diff --git a/src/3rdparty/libjpeg/LICENSE b/src/3rdparty/libjpeg/LICENSE index 99c9aadc..a1cdad52 100644 --- a/src/3rdparty/libjpeg/LICENSE +++ b/src/3rdparty/libjpeg/LICENSE @@ -91,7 +91,7 @@ best of our understanding. The Modified (3-clause) BSD License =================================== -Copyright (C)2009-2020 D. R. Commander. All Rights Reserved. +Copyright (C)2009-2021 D. R. Commander. All Rights Reserved.
Copyright (C)2015 Viktor Szathmáry. All Rights Reserved. Redistribution and use in source and binary forms, with or without diff --git a/src/3rdparty/libjpeg/ijg-license.txt b/src/3rdparty/libjpeg/ijg-license.txt new file mode 100644 index 00000000..eec5341d --- /dev/null +++ b/src/3rdparty/libjpeg/ijg-license.txt @@ -0,0 +1,34 @@ +The authors make NO WARRANTY or representation, either express or implied, +with respect to this software, its quality, accuracy, merchantability, or +fitness for a particular purpose. This software is provided "AS IS", and you, +its user, assume the entire risk as to its quality and accuracy. + +This software is copyright (C) 1991-2020, Thomas G. Lane, Guido Vollbeding. +All Rights Reserved except as specified below. + +Permission is hereby granted to use, copy, modify, and distribute this +software (or portions thereof) for any purpose, without fee, subject to these +conditions: +(1) If any part of the source code for this software is distributed, then this +README file must be included, with this copyright and no-warranty notice +unaltered; and any additions, deletions, or changes to the original files +must be clearly indicated in accompanying documentation. +(2) If only executable code is distributed, then the accompanying +documentation must state that "this software is based in part on the work of +the Independent JPEG Group". +(3) Permission for use of this software is granted only if the user accepts +full responsibility for any undesirable consequences; the authors accept +NO LIABILITY for damages of any kind. + +These conditions apply to any software derived from or based on the IJG code, +not just to the unmodified library. If you use our work, you ought to +acknowledge us. + +Permission is NOT granted for the use of any IJG author's name or company name +in advertising or publicity relating to this software or products derived from +it. This software may be referred to only as "the Independent JPEG Group's +software". + +We specifically permit and encourage the use of this software as the basis of +commercial products, provided that all warranty or liability claims are +assumed by the product vendor. diff --git a/src/3rdparty/libjpeg/import_from_libjpeg_tarball.sh b/src/3rdparty/libjpeg/import_from_libjpeg_tarball.sh index 8dafbda6..2153eca3 100755 --- a/src/3rdparty/libjpeg/import_from_libjpeg_tarball.sh +++ b/src/3rdparty/libjpeg/import_from_libjpeg_tarball.sh @@ -126,6 +126,7 @@ FILES=" jdmaster.c jdmaster.h jdmerge.c + jdmerge.h jdmrgext.c jdmrg565.c jdpostct.c @@ -164,4 +165,4 @@ for i in $FILES; do copy_file "$i" "src/$i" done -echo Done. $TARGET_DIR/jconfig.h and jconfigint.h may need manual updating. +echo Done. $TARGET_DIR/src/jconfig.h and jconfigint.h may need manual updating. diff --git a/src/3rdparty/libjpeg/libjpeg.pro b/src/3rdparty/libjpeg/libjpeg.pro index 51a25115..d478719a 100644 --- a/src/3rdparty/libjpeg/libjpeg.pro +++ b/src/3rdparty/libjpeg/libjpeg.pro @@ -9,10 +9,10 @@ CONFIG += \ MODULE_INCLUDEPATH = $$PWD/src MODULE_EXT_HEADERS = $$PWD/src/jpeglib.h \ $$PWD/src/jerror.h \ - $$PWD/src/jconfig.h \ - $$PWD/src/jmorecfg.h + $$PWD/src/jconfig.h \ + $$PWD/src/jmorecfg.h -INCLUDEPATH += $$PWD $$PWD/src +INCLUDEPATH += $$PWD/src load(qt_helper_lib) diff --git a/src/3rdparty/libjpeg/qt_attribution.json b/src/3rdparty/libjpeg/qt_attribution.json index 796829e2..b68563cb 100644 --- a/src/3rdparty/libjpeg/qt_attribution.json +++ b/src/3rdparty/libjpeg/qt_attribution.json @@ -6,19 +6,20 @@ "Description": "The Independent JPEG Group's JPEG software", "Homepage": "http://libjpeg-turbo.virtualgl.org/", - "Version": "2.0.5", - "License": "Independent JPEG Group License", - "LicenseId": "IJG", - "LicenseFile": "LICENSE", - "Copyright": "Copyright (C) 2009-2020 D. R. Commander -Copyright (C) 2011-2016 Siarhei Siamashka + "Version": "2.1.1", + "License": "Independent JPEG Group License and BSD 3-Clause \"New\" or \"Revised\" License and zlib License", + "LicenseId": "IJG AND BSD-3-Clause AND Zlib", + "LicenseFiles": [ "LICENSE", "ijg-license.txt", "zlib-license.txt"], + "Copyright": "Copyright (C) 2009-2021 D. R. Commander +Copyright (C) 2015, 2020 Google, Inc. +Copyright (C) 2019 Arm Limited Copyright (C) 2015-2016, 2018 Matthieu Darbois +Copyright (C) 2011-2016 Siarhei Siamashka Copyright (C) 2015 Intel Corporation -Copyright (C) 2015 Google, Inc. +Copyright (C) 2013-2014 Linaro Limited Copyright (C) 2013-2014 MIPS Technologies, Inc. -Copyright (C) 2013 Linaro Limited +Copyright (C) 2009, 2012 Pierre Ossman for Cendio AB Copyright (C) 2009-2011 Nokia Corporation and/or its subsidiary(-ies) -Copyright (C) 2009 Pierre Ossman for Cendio AB Copyright (C) 1999-2006 MIYASAKA Masaru -Copyright (C) 1991-2016 Thomas G. Lane, Guido Vollbeding" +Copyright (C) 1991-2017 Thomas G. Lane, Guido Vollbeding" } diff --git a/src/3rdparty/libjpeg/src/ChangeLog.md b/src/3rdparty/libjpeg/src/ChangeLog.md index 59fb2de9..1fcb065a 100644 --- a/src/3rdparty/libjpeg/src/ChangeLog.md +++ b/src/3rdparty/libjpeg/src/ChangeLog.md @@ -1,3 +1,262 @@ +2.1.1 +===== + +### Significant changes relative to 2.1.0 + +1. Fixed a regression introduced in 2.1.0 that caused build failures with +non-GCC-compatible compilers for Un*x/Arm platforms. + +2. Fixed a regression introduced by 2.1 beta1[13] that prevented the Arm 32-bit +(AArch32) Neon SIMD extensions from building unless the C compiler flags +included `-mfloat-abi=softfp` or `-mfloat-abi=hard`. + +3. Fixed an issue in the AArch32 Neon SIMD Huffman encoder whereby reliance on +undefined C compiler behavior led to crashes ("SIGBUS: illegal alignment") on +Android systems when running AArch32/Thumb builds of libjpeg-turbo built with +recent versions of Clang. + +4. Added a command-line argument (`-copy icc`) to jpegtran that causes it to +copy only the ICC profile markers from the source file and discard any other +metadata. + +5. libjpeg-turbo should now build and run on CHERI-enabled architectures, which +use capability pointers that are larger than the size of `size_t`. + +6. Fixed a regression introduced by 2.1 beta1[5] that caused a segfault in the +64-bit SSE2 Huffman encoder when attempting to losslessly transform a +specially-crafted malformed JPEG image. + + +2.1.0 +===== + +### Significant changes relative to 2.1 beta1 + +1. Fixed a regression introduced by 2.1 beta1[6(b)] whereby attempting to +decompress certain progressive JPEG images with one or more component planes of +width 8 or less caused a buffer overrun. + +2. Fixed a regression introduced by 2.1 beta1[6(b)] whereby attempting to +decompress a specially-crafted malformed progressive JPEG image caused the +block smoothing algorithm to read from uninitialized memory. + +3. Fixed an issue in the Arm Neon SIMD Huffman encoders that caused the +encoders to generate incorrect results when using the Clang compiler with +Visual Studio. + +4. Fixed a floating point exception (CVE-2021-20205) that occurred when +attempting to compress a specially-crafted malformed GIF image with a specified +image width of 0 using cjpeg. + +5. Fixed a regression introduced by 2.0 beta1[15] whereby attempting to +generate a progressive JPEG image on an SSE2-capable CPU using a scan script +containing one or more scans with lengths divisible by 32 and non-zero +successive approximation low bit positions would, under certain circumstances, +result in an error ("Missing Huffman code table entry") and an invalid JPEG +image. + +6. Introduced a new flag (`TJFLAG_LIMITSCANS` in the TurboJPEG C API and +`TJ.FLAG_LIMIT_SCANS` in the TurboJPEG Java API) and a corresponding TJBench +command-line argument (`-limitscans`) that causes the TurboJPEG decompression +and transform functions/operations to return/throw an error if a progressive +JPEG image contains an unreasonably large number of scans. This allows +applications that use the TurboJPEG API to guard against an exploit of the +progressive JPEG format described in the report +["Two Issues with the JPEG Standard"](https://libjpeg-turbo.org/pmwiki/uploads/About/TwoIssueswiththeJPEGStandard.pdf). + +7. The PPM reader now throws an error, rather than segfaulting (due to a buffer +overrun) or generating incorrect pixels, if an application attempts to use the +`tjLoadImage()` function to load a 16-bit binary PPM file (a binary PPM file +with a maximum value greater than 255) into a grayscale image buffer or to load +a 16-bit binary PGM file into an RGB image buffer. + +8. Fixed an issue in the PPM reader that caused incorrect pixels to be +generated when using the `tjLoadImage()` function to load a 16-bit binary PPM +file into an extended RGB image buffer. + +9. Fixed an issue whereby, if a JPEG buffer was automatically re-allocated by +one of the TurboJPEG compression or transform functions and an error +subsequently occurred during compression or transformation, the JPEG buffer +pointer passed by the application was not updated when the function returned. + + +2.0.90 (2.1 beta1) +================== + +### Significant changes relative to 2.0.6: + +1. The build system, x86-64 SIMD extensions, and accelerated Huffman codec now +support the x32 ABI on Linux, which allows for using x86-64 instructions with +32-bit pointers. The x32 ABI is generally enabled by adding `-mx32` to the +compiler flags. + + Caveats: + - CMake 3.9.0 or later is required in order for the build system to +automatically detect an x32 build. + - Java does not support the x32 ABI, and thus the TurboJPEG Java API will +automatically be disabled with x32 builds. + +2. Added Loongson MMI SIMD implementations of the RGB-to-grayscale, 4:2:2 fancy +chroma upsampling, 4:2:2 and 4:2:0 merged chroma upsampling/color conversion, +and fast integer DCT/IDCT algorithms. Relative to libjpeg-turbo 2.0.x, this +speeds up: + + - the compression of RGB source images into grayscale JPEG images by +approximately 20% + - the decompression of 4:2:2 JPEG images by approximately 40-60% when +using fancy upsampling + - the decompression of 4:2:2 and 4:2:0 JPEG images by approximately +15-20% when using merged upsampling + - the compression of RGB source images by approximately 30-45% when using +the fast integer DCT + - the decompression of JPEG images into RGB destination images by +approximately 2x when using the fast integer IDCT + + The overall decompression speedup for RGB images is now approximately +2.3-3.7x (compared to 2-3.5x with libjpeg-turbo 2.0.x.) + +3. 32-bit (Armv7 or Armv7s) iOS builds of libjpeg-turbo are no longer +supported, and the libjpeg-turbo build system can no longer be used to package +such builds. 32-bit iOS apps cannot run in iOS 11 and later, and the App Store +no longer allows them. + +4. 32-bit (i386) OS X/macOS builds of libjpeg-turbo are no longer supported, +and the libjpeg-turbo build system can no longer be used to package such +builds. 32-bit Mac applications cannot run in macOS 10.15 "Catalina" and +later, and the App Store no longer allows them. + +5. The SSE2 (x86 SIMD) and C Huffman encoding algorithms have been +significantly optimized, resulting in a measured average overall compression +speedup of 12-28% for 64-bit code and 22-52% for 32-bit code on various Intel +and AMD CPUs, as well as a measured average overall compression speedup of +0-23% on platforms that do not have a SIMD-accelerated Huffman encoding +implementation. + +6. The block smoothing algorithm that is applied by default when decompressing +progressive Huffman-encoded JPEG images has been improved in the following +ways: + + - The algorithm is now more fault-tolerant. Previously, if a particular +scan was incomplete, then the smoothing parameters for the incomplete scan +would be applied to the entire output image, including the parts of the image +that were generated by the prior (complete) scan. Visually, this had the +effect of removing block smoothing from lower-frequency scans if they were +followed by an incomplete higher-frequency scan. libjpeg-turbo now applies +block smoothing parameters to each iMCU row based on which scan generated the +pixels in that row, rather than always using the block smoothing parameters for +the most recent scan. + - When applying block smoothing to DC scans, a Gaussian-like kernel with a +5x5 window is used to reduce the "blocky" appearance. + +7. Added SIMD acceleration for progressive Huffman encoding on Arm platforms. +This speeds up the compression of full-color progressive JPEGs by about 30-40% +on average (relative to libjpeg-turbo 2.0.x) when using modern Arm CPUs. + +8. Added configure-time and run-time auto-detection of Loongson MMI SIMD +instructions, so that the Loongson MMI SIMD extensions can be included in any +MIPS64 libjpeg-turbo build. + +9. Added fault tolerance features to djpeg and jpegtran, mainly to demonstrate +methods by which applications can guard against the exploits of the JPEG format +described in the report +["Two Issues with the JPEG Standard"](https://libjpeg-turbo.org/pmwiki/uploads/About/TwoIssueswiththeJPEGStandard.pdf). + + - Both programs now accept a `-maxscans` argument, which can be used to +limit the number of allowable scans in the input file. + - Both programs now accept a `-strict` argument, which can be used to +treat all warnings as fatal. + +10. CMake package config files are now included for both the libjpeg and +TurboJPEG API libraries. This facilitates using libjpeg-turbo with CMake's +`find_package()` function. For example: + + find_package(libjpeg-turbo CONFIG REQUIRED) + + add_executable(libjpeg_program libjpeg_program.c) + target_link_libraries(libjpeg_program PUBLIC libjpeg-turbo::jpeg) + + add_executable(libjpeg_program_static libjpeg_program.c) + target_link_libraries(libjpeg_program_static PUBLIC + libjpeg-turbo::jpeg-static) + + add_executable(turbojpeg_program turbojpeg_program.c) + target_link_libraries(turbojpeg_program PUBLIC + libjpeg-turbo::turbojpeg) + + add_executable(turbojpeg_program_static turbojpeg_program.c) + target_link_libraries(turbojpeg_program_static PUBLIC + libjpeg-turbo::turbojpeg-static) + +11. Since the Unisys LZW patent has long expired, cjpeg and djpeg can now +read/write both LZW-compressed and uncompressed GIF files (feature ported from +jpeg-6a and jpeg-9d.) + +12. jpegtran now includes the `-wipe` and `-drop` options from jpeg-9a and +jpeg-9d, as well as the ability to expand the image size using the `-crop` +option. Refer to jpegtran.1 or usage.txt for more details. + +13. Added a complete intrinsics implementation of the Arm Neon SIMD extensions, +thus providing SIMD acceleration on Arm platforms for all of the algorithms +that are SIMD-accelerated on x86 platforms. This new implementation is +significantly faster in some cases than the old GAS implementation-- +depending on the algorithms used, the type of CPU core, and the compiler. GCC, +as of this writing, does not provide a full or optimal set of Neon intrinsics, +so for performance reasons, the default when building libjpeg-turbo with GCC is +to continue using the GAS implementation of the following algorithms: + + - 32-bit RGB-to-YCbCr color conversion + - 32-bit fast and accurate inverse DCT + - 64-bit RGB-to-YCbCr and YCbCr-to-RGB color conversion + - 64-bit accurate forward and inverse DCT + - 64-bit Huffman encoding + + A new CMake variable (`NEON_INTRINSICS`) can be used to override this +default. + + Since the new intrinsics implementation includes SIMD acceleration +for merged upsampling/color conversion, 1.5.1[5] is no longer necessary and has +been reverted. + +14. The Arm Neon SIMD extensions can now be built using Visual Studio. + +15. The build system can now be used to generate a universal x86-64 + Armv8 +libjpeg-turbo SDK package for both iOS and macOS. + + +2.0.6 +===== + +### Significant changes relative to 2.0.5: + +1. Fixed "using JNI after critical get" errors that occurred on Android +platforms when using any of the YUV encoding/compression/decompression/decoding +methods in the TurboJPEG Java API. + +2. Fixed or worked around multiple issues with `jpeg_skip_scanlines()`: + + - Fixed segfaults or "Corrupt JPEG data: premature end of data segment" +errors in `jpeg_skip_scanlines()` that occurred when decompressing 4:2:2 or +4:2:0 JPEG images using merged (non-fancy) upsampling/color conversion (that +is, when setting `cinfo.do_fancy_upsampling` to `FALSE`.) 2.0.0[6] was a +similar fix, but it did not cover all cases. + - `jpeg_skip_scanlines()` now throws an error if two-pass color +quantization is enabled. Two-pass color quantization never worked properly +with `jpeg_skip_scanlines()`, and the issues could not readily be fixed. + - Fixed an issue whereby `jpeg_skip_scanlines()` always returned 0 when +skipping past the end of an image. + +3. The Arm 64-bit (Armv8) Neon SIMD extensions can now be built using MinGW +toolchains targetting Arm64 (AArch64) Windows binaries. + +4. Fixed unexpected visual artifacts that occurred when using +`jpeg_crop_scanline()` and interblock smoothing while decompressing only the DC +scan of a progressive JPEG image. + +5. Fixed an issue whereby libjpeg-turbo would not build if 12-bit-per-component +JPEG support (`WITH_12BIT`) was enabled along with libjpeg v7 or libjpeg v8 +API/ABI emulation (`WITH_JPEG7` or `WITH_JPEG8`.) + + 2.0.5 ===== @@ -54,17 +313,17 @@ JPEG images. This was known to cause a buffer overflow when attempting to decompress some such images using `tjDecompressToYUV2()` or `tjDecompressToYUVPlanes()`. -5. Fixed an issue, detected by ASan, whereby attempting to losslessly transform -a specially-crafted malformed JPEG image containing an extremely-high-frequency -coefficient block (junk image data that could never be generated by a -legitimate JPEG compressor) could cause the Huffman encoder's local buffer to -be overrun. (Refer to 1.4.0[9] and 1.4beta1[15].) Given that the buffer -overrun was fully contained within the stack and did not cause a segfault or -other user-visible errant behavior, and given that the lossless transformer -(unlike the decompressor) is not generally exposed to arbitrary data exploits, -this issue did not likely pose a security risk. +5. Fixed an issue (CVE-2020-17541), detected by ASan, whereby attempting to +losslessly transform a specially-crafted malformed JPEG image containing an +extremely-high-frequency coefficient block (junk image data that could never be +generated by a legitimate JPEG compressor) could cause the Huffman encoder's +local buffer to be overrun. (Refer to 1.4.0[9] and 1.4beta1[15].) Given that +the buffer overrun was fully contained within the stack and did not cause a +segfault or other user-visible errant behavior, and given that the lossless +transformer (unlike the decompressor) is not generally exposed to arbitrary +data exploits, this issue did not likely pose a security risk. -6. The ARM 64-bit (ARMv8) NEON SIMD assembly code now stores constants in a +6. The Arm 64-bit (Armv8) Neon SIMD assembly code now stores constants in a separate read-only data section rather than in the text section, to support execute-only memory layouts. @@ -246,7 +505,7 @@ detect actual security issues, should they arise in the future. 1. Added AVX2 SIMD implementations of the colorspace conversion, chroma downsampling and upsampling, integer quantization and sample conversion, and -slow integer DCT/IDCT algorithms. When using the slow integer DCT/IDCT +accurate integer DCT/IDCT algorithms. When using the accurate integer DCT/IDCT algorithms on AVX2-equipped CPUs, the compression of RGB images is approximately 13-36% (avg. 22%) faster (relative to libjpeg-turbo 1.5.x) with 64-bit code and 11-21% (avg. 17%) faster with 32-bit code, and the @@ -350,16 +609,16 @@ algorithm that caused incorrect dithering in the output image. This algorithm now produces bitwise-identical results to the unmerged algorithms. 12. The SIMD function symbols for x86[-64]/ELF, MIPS/ELF, macOS/x86[-64] (if -libjpeg-turbo is built with YASM), and iOS/ARM[64] builds are now private. +libjpeg-turbo is built with YASM), and iOS/Arm[64] builds are now private. This prevents those symbols from being exposed in applications or shared libraries that link statically with libjpeg-turbo. 13. Added Loongson MMI SIMD implementations of the RGB-to-YCbCr and YCbCr-to-RGB colorspace conversion, 4:2:0 chroma downsampling, 4:2:0 fancy -chroma upsampling, integer quantization, and slow integer DCT/IDCT algorithms. -When using the slow integer DCT/IDCT, this speeds up the compression of RGB -images by approximately 70-100% and the decompression of RGB images by -approximately 2-3.5x. +chroma upsampling, integer quantization, and accurate integer DCT/IDCT +algorithms. When using the accurate integer DCT/IDCT, this speeds up the +compression of RGB images by approximately 70-100% and the decompression of RGB +images by approximately 2-3.5x. 14. Fixed a build error when building with older MinGW releases (regression caused by 1.5.1[7].) @@ -409,9 +668,9 @@ end of a single-scan (non-progressive) image, subsequent calls to `jpeg_consume_input()` would return `JPEG_SUSPENDED` rather than `JPEG_REACHED_EOI`. -9. `jpeg_crop_scanlines()` now works correctly when decompressing grayscale -JPEG images that were compressed with a sampling factor other than 1 (for -instance, with `cjpeg -grayscale -sample 2x2`). +9. `jpeg_crop_scanline()` now works correctly when decompressing grayscale JPEG +images that were compressed with a sampling factor other than 1 (for instance, +with `cjpeg -grayscale -sample 2x2`). 1.5.2 @@ -435,7 +694,7 @@ on PowerPC-based AmigaOS 4 and OpenBSD systems. 5. Fixed build and runtime errors on Windows that occurred when building libjpeg-turbo with libjpeg v7 API/ABI emulation and the in-memory source/destination managers. Due to an oversight, the `jpeg_skip_scanlines()` -and `jpeg_crop_scanlines()` functions were not being included in jpeg7.dll when +and `jpeg_crop_scanline()` functions were not being included in jpeg7.dll when libjpeg-turbo was built with `-DWITH_JPEG7=1` and `-DWITH_MEMSRCDST=1`. 6. Fixed "Bogus virtual array access" error that occurred when using the @@ -691,8 +950,8 @@ benchmarking or regression testing, SIMD-accelerated Huffman encoding can be disabled by setting the `JSIMD_NOHUFFENC` environment variable to `1`. 13. Added ARM 64-bit (ARMv8) NEON SIMD implementations of the commonly-used -compression algorithms (including the slow integer forward DCT and h2v2 & h2v1 -downsampling algorithms, which are not accelerated in the 32-bit NEON +compression algorithms (including the accurate integer forward DCT and h2v2 & +h2v1 downsampling algorithms, which are not accelerated in the 32-bit NEON implementation.) This speeds up the compression of full-color JPEGs by about 75% on average on a Cavium ThunderX processor and by about 2-2.5x on average on Cortex-A53 and Cortex-A57 cores. @@ -823,8 +1082,8 @@ platforms other than Windows or Linux. Oops. 7. Fixed an extremely rare bug in the Huffman encoder that caused 64-bit builds of libjpeg-turbo to incorrectly encode a few specific test images when -quality=98, an optimized Huffman table, and the slow integer forward DCT were -used. +quality=98, an optimized Huffman table, and the accurate integer forward DCT +were used. 8. The Windows (CMake) build system now supports building only static or only shared libraries. This is accomplished by adding either `-DENABLE_STATIC=0` or @@ -983,8 +1242,8 @@ floating point inverse DCT (using code borrowed from libjpeg v8a and later.) The accuracy of this implementation now matches the accuracy of the SSE/SSE2 implementation. Note, however, that the floating point DCT/IDCT algorithms are mainly a legacy feature. They generally do not produce significantly better -accuracy than the slow integer DCT/IDCT algorithms, and they are quite a bit -slower. +accuracy than the accurate integer DCT/IDCT algorithms, and they are quite a +bit slower. 8. Added a new output colorspace (`JCS_RGB565`) to the libjpeg API that allows for decompressing JPEG images into RGB565 (16-bit) pixels. If dithering is not @@ -1394,8 +1653,8 @@ cases. 2. Despite the above, the fast integer forward DCT still degrades somewhat for JPEG qualities greater than 95, so the TurboJPEG wrapper will now automatically -use the slow integer forward DCT when generating JPEG images of quality 96 or -greater. This reduces compression performance by as much as 15% for these +use the accurate integer forward DCT when generating JPEG images of quality 96 +or greater. This reduces compression performance by as much as 15% for these high-quality images but is necessary to ensure that the images are perceptually lossless. It also ensures that the library can avoid the performance pitfall created by [1]. diff --git a/src/3rdparty/libjpeg/src/README.ijg b/src/3rdparty/libjpeg/src/README.ijg index 2e39f965..9453c195 100644 --- a/src/3rdparty/libjpeg/src/README.ijg +++ b/src/3rdparty/libjpeg/src/README.ijg @@ -128,7 +128,7 @@ with respect to this software, its quality, accuracy, merchantability, or fitness for a particular purpose. This software is provided "AS IS", and you, its user, assume the entire risk as to its quality and accuracy. -This software is copyright (C) 1991-2016, Thomas G. Lane, Guido Vollbeding. +This software is copyright (C) 1991-2020, Thomas G. Lane, Guido Vollbeding. All Rights Reserved except as specified below. Permission is hereby granted to use, copy, modify, and distribute this @@ -159,19 +159,6 @@ commercial products, provided that all warranty or liability claims are assumed by the product vendor. -The IJG distribution formerly included code to read and write GIF files. -To avoid entanglement with the Unisys LZW patent (now expired), GIF reading -support has been removed altogether, and the GIF writer has been simplified -to produce "uncompressed GIFs". This technique does not use the LZW -algorithm; the resulting GIF files are larger than usual, but are readable -by all standard GIF decoders. - -We are required to state that - "The Graphics Interchange Format(c) is the Copyright property of - CompuServe Incorporated. GIF(sm) is a Service Mark property of - CompuServe Incorporated." - - REFERENCES ========== @@ -223,12 +210,12 @@ https://www.iso.org/standard/54989.html and http://www.itu.int/rec/T-REC-T.871. A PDF file of the older JFIF 1.02 specification is available at http://www.w3.org/Graphics/JPEG/jfif3.pdf. -The TIFF 6.0 file format specification can be obtained by FTP from -ftp://ftp.sgi.com/graphics/tiff/TIFF6.ps.gz. The JPEG incorporation scheme -found in the TIFF 6.0 spec of 3-June-92 has a number of serious problems. -IJG does not recommend use of the TIFF 6.0 design (TIFF Compression tag 6). -Instead, we recommend the JPEG design proposed by TIFF Technical Note #2 -(Compression tag 7). Copies of this Note can be obtained from +The TIFF 6.0 file format specification can be obtained from +http://mirrors.ctan.org/graphics/tiff/TIFF6.ps.gz. The JPEG incorporation +scheme found in the TIFF 6.0 spec of 3-June-92 has a number of serious +problems. IJG does not recommend use of the TIFF 6.0 design (TIFF Compression +tag 6). Instead, we recommend the JPEG design proposed by TIFF Technical Note +#2 (Compression tag 7). Copies of this Note can be obtained from http://www.ijg.org/files/. It is expected that the next revision of the TIFF spec will replace the 6.0 JPEG design with the Note's design. Although IJG's own code does not support TIFF/JPEG, the free libtiff library @@ -243,14 +230,8 @@ The most recent released version can always be found there in directory "files". The JPEG FAQ (Frequently Asked Questions) article is a source of some -general information about JPEG. -It is available on the World Wide Web at http://www.faqs.org/faqs/jpeg-faq/ -and other news.answers archive sites, including the official news.answers -archive at rtfm.mit.edu: ftp://rtfm.mit.edu/pub/usenet/news.answers/jpeg-faq/. -If you don't have Web or FTP access, send e-mail to mail-server@rtfm.mit.edu -with body - send usenet/news.answers/jpeg-faq/part1 - send usenet/news.answers/jpeg-faq/part2 +general information about JPEG. It is available at +http://www.faqs.org/faqs/jpeg-faq. FILE FORMAT COMPATIBILITY diff --git a/src/3rdparty/libjpeg/src/README.md b/src/3rdparty/libjpeg/src/README.md index e7ff743a..01e391ea 100644 --- a/src/3rdparty/libjpeg/src/README.md +++ b/src/3rdparty/libjpeg/src/README.md @@ -2,8 +2,8 @@ Background ========== libjpeg-turbo is a JPEG image codec that uses SIMD instructions to accelerate -baseline JPEG compression and decompression on x86, x86-64, ARM, PowerPC, and -MIPS systems, as well as progressive JPEG compression on x86 and x86-64 +baseline JPEG compression and decompression on x86, x86-64, Arm, PowerPC, and +MIPS systems, as well as progressive JPEG compression on x86, x86-64, and Arm systems. On such systems, libjpeg-turbo is generally 2-6x as fast as libjpeg, all else being equal. On other types of systems, libjpeg-turbo can still outperform libjpeg by a significant amount, by virtue of its highly-optimized @@ -179,8 +179,8 @@ supported and which aren't. NOTE: As of this writing, extensive research has been conducted into the usefulness of DCT scaling as a means of data reduction and SmartScale as a -means of quality improvement. The reader is invited to peruse the research at - and draw his/her own conclusions, +means of quality improvement. Readers are invited to peruse the research at + and draw their own conclusions, but it is the general belief of our project that these features have not demonstrated sufficient usefulness to justify inclusion in libjpeg-turbo. @@ -287,12 +287,13 @@ following reasons: (and slightly faster) floating point IDCT algorithm introduced in libjpeg v8a as opposed to the algorithm used in libjpeg v6b. It should be noted, however, that this algorithm basically brings the accuracy of the floating - point IDCT in line with the accuracy of the slow integer IDCT. The floating - point DCT/IDCT algorithms are mainly a legacy feature, and they do not - produce significantly more accuracy than the slow integer algorithms (to put - numbers on this, the typical difference in PNSR between the two algorithms - is less than 0.10 dB, whereas changing the quality level by 1 in the upper - range of the quality scale is typically more like a 1.0 dB difference.) + point IDCT in line with the accuracy of the accurate integer IDCT. The + floating point DCT/IDCT algorithms are mainly a legacy feature, and they do + not produce significantly more accuracy than the accurate integer algorithms + (to put numbers on this, the typical difference in PNSR between the two + algorithms is less than 0.10 dB, whereas changing the quality level by 1 in + the upper range of the quality scale is typically more like a 1.0 dB + difference.) - If the floating point algorithms in libjpeg-turbo are not implemented using SIMD instructions on a particular platform, then the accuracy of the @@ -340,7 +341,7 @@ The algorithm used by the SIMD-accelerated quantization function cannot produce correct results whenever the fast integer forward DCT is used along with a JPEG quality of 98-100. Thus, libjpeg-turbo must use the non-SIMD quantization function in those cases. This causes performance to drop by as much as 40%. -It is therefore strongly advised that you use the slow integer forward DCT +It is therefore strongly advised that you use the accurate integer forward DCT whenever encoding images with a JPEG quality of 98 or higher. diff --git a/src/3rdparty/libjpeg/src/change.log b/src/3rdparty/libjpeg/src/change.log index f090d778..e4d0ddc4 100644 --- a/src/3rdparty/libjpeg/src/change.log +++ b/src/3rdparty/libjpeg/src/change.log @@ -6,6 +6,25 @@ reference. Please see ChangeLog.md for information specific to libjpeg-turbo. CHANGE LOG for Independent JPEG Group's JPEG software +Version 9d 12-Jan-2020 +----------------------- + +Restore GIF read and write support from libjpeg version 6a. +Thank to Wolfgang Werner (W.W.) Heinz for suggestion. + +Add jpegtran -drop option; add options to the crop extension and wipe +to fill the extra area with content from the source image region, +instead of gray out. + + +Version 9c 14-Jan-2018 +----------------------- + +jpegtran: add an option to the -wipe switch to fill the region +with the average of adjacent blocks, instead of gray out. +Thank to Caitlyn Feddock and Maddie Ziegler for inspiration. + + Version 9b 17-Jan-2016 ----------------------- @@ -13,6 +32,13 @@ Document 'f' specifier for jpegtran -crop specification. Thank to Michele Martone for suggestion. +Version 9a 19-Jan-2014 +----------------------- + +Add jpegtran -wipe option and extension for -crop. +Thank to Andrew Senior, David Clunie, and Josef Schmid for suggestion. + + Version 9 13-Jan-2013 ---------------------- @@ -138,11 +164,6 @@ Huffman tables being used. Huffman tables are checked for validity much more carefully than before. -To avoid the Unisys LZW patent, djpeg's GIF output capability has been -changed to produce "uncompressed GIFs", and cjpeg's GIF input capability -has been removed altogether. We're not happy about it either, but there -seems to be no good alternative. - The configure script now supports building libjpeg as a shared library on many flavors of Unix (all the ones that GNU libtool knows how to build shared libraries for). Use "./configure --enable-shared" to diff --git a/src/3rdparty/libjpeg/src/jccolext.c b/src/3rdparty/libjpeg/src/jccolext.c index 19c955c9..303b322c 100644 --- a/src/3rdparty/libjpeg/src/jccolext.c +++ b/src/3rdparty/libjpeg/src/jccolext.c @@ -48,9 +48,9 @@ rgb_ycc_convert_internal(j_compress_ptr cinfo, JSAMPARRAY input_buf, outptr2 = output_buf[2][output_row]; output_row++; for (col = 0; col < num_cols; col++) { - r = GETJSAMPLE(inptr[RGB_RED]); - g = GETJSAMPLE(inptr[RGB_GREEN]); - b = GETJSAMPLE(inptr[RGB_BLUE]); + r = inptr[RGB_RED]; + g = inptr[RGB_GREEN]; + b = inptr[RGB_BLUE]; inptr += RGB_PIXELSIZE; /* If the inputs are 0..MAXJSAMPLE, the outputs of these equations * must be too; we do not need an explicit range-limiting operation. @@ -100,9 +100,9 @@ rgb_gray_convert_internal(j_compress_ptr cinfo, JSAMPARRAY input_buf, outptr = output_buf[0][output_row]; output_row++; for (col = 0; col < num_cols; col++) { - r = GETJSAMPLE(inptr[RGB_RED]); - g = GETJSAMPLE(inptr[RGB_GREEN]); - b = GETJSAMPLE(inptr[RGB_BLUE]); + r = inptr[RGB_RED]; + g = inptr[RGB_GREEN]; + b = inptr[RGB_BLUE]; inptr += RGB_PIXELSIZE; /* Y */ outptr[col] = (JSAMPLE)((ctab[r + R_Y_OFF] + ctab[g + G_Y_OFF] + @@ -135,9 +135,9 @@ rgb_rgb_convert_internal(j_compress_ptr cinfo, JSAMPARRAY input_buf, outptr2 = output_buf[2][output_row]; output_row++; for (col = 0; col < num_cols; col++) { - outptr0[col] = GETJSAMPLE(inptr[RGB_RED]); - outptr1[col] = GETJSAMPLE(inptr[RGB_GREEN]); - outptr2[col] = GETJSAMPLE(inptr[RGB_BLUE]); + outptr0[col] = inptr[RGB_RED]; + outptr1[col] = inptr[RGB_GREEN]; + outptr2[col] = inptr[RGB_BLUE]; inptr += RGB_PIXELSIZE; } } diff --git a/src/3rdparty/libjpeg/src/jccolor.c b/src/3rdparty/libjpeg/src/jccolor.c index 036f6016..bdc563c7 100644 --- a/src/3rdparty/libjpeg/src/jccolor.c +++ b/src/3rdparty/libjpeg/src/jccolor.c @@ -392,11 +392,11 @@ cmyk_ycck_convert(j_compress_ptr cinfo, JSAMPARRAY input_buf, outptr3 = output_buf[3][output_row]; output_row++; for (col = 0; col < num_cols; col++) { - r = MAXJSAMPLE - GETJSAMPLE(inptr[0]); - g = MAXJSAMPLE - GETJSAMPLE(inptr[1]); - b = MAXJSAMPLE - GETJSAMPLE(inptr[2]); + r = MAXJSAMPLE - inptr[0]; + g = MAXJSAMPLE - inptr[1]; + b = MAXJSAMPLE - inptr[2]; /* K passes through as-is */ - outptr3[col] = inptr[3]; /* don't need GETJSAMPLE here */ + outptr3[col] = inptr[3]; inptr += 4; /* If the inputs are 0..MAXJSAMPLE, the outputs of these equations * must be too; we do not need an explicit range-limiting operation. @@ -438,7 +438,7 @@ grayscale_convert(j_compress_ptr cinfo, JSAMPARRAY input_buf, outptr = output_buf[0][output_row]; output_row++; for (col = 0; col < num_cols; col++) { - outptr[col] = inptr[0]; /* don't need GETJSAMPLE() here */ + outptr[col] = inptr[0]; inptr += instride; } } @@ -497,7 +497,7 @@ null_convert(j_compress_ptr cinfo, JSAMPARRAY input_buf, JSAMPIMAGE output_buf, inptr = *input_buf; outptr = output_buf[ci][output_row]; for (col = 0; col < num_cols; col++) { - outptr[col] = inptr[ci]; /* don't need GETJSAMPLE() here */ + outptr[col] = inptr[ci]; inptr += nc; } } diff --git a/src/3rdparty/libjpeg/src/jcdctmgr.c b/src/3rdparty/libjpeg/src/jcdctmgr.c index c04058e6..7dae17a6 100644 --- a/src/3rdparty/libjpeg/src/jcdctmgr.c +++ b/src/3rdparty/libjpeg/src/jcdctmgr.c @@ -381,19 +381,19 @@ convsamp(JSAMPARRAY sample_data, JDIMENSION start_col, DCTELEM *workspace) elemptr = sample_data[elemr] + start_col; #if DCTSIZE == 8 /* unroll the inner loop */ - *workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE; - *workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE; - *workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE; - *workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE; - *workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE; - *workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE; - *workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE; - *workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE; + *workspaceptr++ = (*elemptr++) - CENTERJSAMPLE; + *workspaceptr++ = (*elemptr++) - CENTERJSAMPLE; + *workspaceptr++ = (*elemptr++) - CENTERJSAMPLE; + *workspaceptr++ = (*elemptr++) - CENTERJSAMPLE; + *workspaceptr++ = (*elemptr++) - CENTERJSAMPLE; + *workspaceptr++ = (*elemptr++) - CENTERJSAMPLE; + *workspaceptr++ = (*elemptr++) - CENTERJSAMPLE; + *workspaceptr++ = (*elemptr++) - CENTERJSAMPLE; #else { register int elemc; for (elemc = DCTSIZE; elemc > 0; elemc--) - *workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE; + *workspaceptr++ = (*elemptr++) - CENTERJSAMPLE; } #endif } @@ -533,20 +533,19 @@ convsamp_float(JSAMPARRAY sample_data, JDIMENSION start_col, for (elemr = 0; elemr < DCTSIZE; elemr++) { elemptr = sample_data[elemr] + start_col; #if DCTSIZE == 8 /* unroll the inner loop */ - *workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE); - *workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE); - *workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE); - *workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE); - *workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE); - *workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE); - *workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE); - *workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE); + *workspaceptr++ = (FAST_FLOAT)((*elemptr++) - CENTERJSAMPLE); + *workspaceptr++ = (FAST_FLOAT)((*elemptr++) - CENTERJSAMPLE); + *workspaceptr++ = (FAST_FLOAT)((*elemptr++) - CENTERJSAMPLE); + *workspaceptr++ = (FAST_FLOAT)((*elemptr++) - CENTERJSAMPLE); + *workspaceptr++ = (FAST_FLOAT)((*elemptr++) - CENTERJSAMPLE); + *workspaceptr++ = (FAST_FLOAT)((*elemptr++) - CENTERJSAMPLE); + *workspaceptr++ = (FAST_FLOAT)((*elemptr++) - CENTERJSAMPLE); + *workspaceptr++ = (FAST_FLOAT)((*elemptr++) - CENTERJSAMPLE); #else { register int elemc; for (elemc = DCTSIZE; elemc > 0; elemc--) - *workspaceptr++ = (FAST_FLOAT) - (GETJSAMPLE(*elemptr++) - CENTERJSAMPLE); + *workspaceptr++ = (FAST_FLOAT)((*elemptr++) - CENTERJSAMPLE); } #endif } diff --git a/src/3rdparty/libjpeg/src/jchuff.c b/src/3rdparty/libjpeg/src/jchuff.c index cb05055d..8ff817b1 100644 --- a/src/3rdparty/libjpeg/src/jchuff.c +++ b/src/3rdparty/libjpeg/src/jchuff.c @@ -4,8 +4,10 @@ * This file was part of the Independent JPEG Group's software: * Copyright (C) 1991-1997, Thomas G. Lane. * libjpeg-turbo Modifications: - * Copyright (C) 2009-2011, 2014-2016, 2018-2019, D. R. Commander. + * Copyright (C) 2009-2011, 2014-2016, 2018-2021, D. R. Commander. * Copyright (C) 2015, Matthieu Darbois. + * Copyright (C) 2018, Matthias Räncker. + * Copyright (C) 2020, Arm Limited. * For conditions of distribution and use, see the accompanying README.ijg * file. * @@ -34,23 +36,28 @@ * memory footprint by 64k, which is important for some mobile applications * that create many isolated instances of libjpeg-turbo (web browsers, for * instance.) This may improve performance on some mobile platforms as well. - * This feature is enabled by default only on ARM processors, because some x86 + * This feature is enabled by default only on Arm processors, because some x86 * chips have a slow implementation of bsr, and the use of clz/bsr cannot be * shown to have a significant performance impact even on the x86 chips that - * have a fast implementation of it. When building for ARMv6, you can + * have a fast implementation of it. When building for Armv6, you can * explicitly disable the use of clz/bsr by adding -mthumb to the compiler * flags (this defines __thumb__). */ /* NOTE: Both GCC and Clang define __GNUC__ */ -#if defined(__GNUC__) && (defined(__arm__) || defined(__aarch64__)) +#if (defined(__GNUC__) && (defined(__arm__) || defined(__aarch64__))) || \ + defined(_M_ARM) || defined(_M_ARM64) #if !defined(__thumb__) || defined(__thumb2__) #define USE_CLZ_INTRINSIC #endif #endif #ifdef USE_CLZ_INTRINSIC +#if defined(_MSC_VER) && !defined(__clang__) +#define JPEG_NBITS_NONZERO(x) (32 - _CountLeadingZeros(x)) +#else #define JPEG_NBITS_NONZERO(x) (32 - __builtin_clz(x)) +#endif #define JPEG_NBITS(x) (x ? JPEG_NBITS_NONZERO(x) : 0) #else #include "jpeg_nbits_table.h" @@ -65,32 +72,43 @@ * but must not be updated permanently until we complete the MCU. */ +#if defined(__x86_64__) && defined(__ILP32__) +typedef unsigned long long bit_buf_type; +#else +typedef size_t bit_buf_type; +#endif + +/* NOTE: The more optimal Huffman encoding algorithm is only used by the + * intrinsics implementation of the Arm Neon SIMD extensions, which is why we + * retain the old Huffman encoder behavior when using the GAS implementation. + */ +#if defined(WITH_SIMD) && !(defined(__arm__) || defined(__aarch64__) || \ + defined(_M_ARM) || defined(_M_ARM64)) +typedef unsigned long long simd_bit_buf_type; +#else +typedef bit_buf_type simd_bit_buf_type; +#endif + +#if (defined(SIZEOF_SIZE_T) && SIZEOF_SIZE_T == 8) || defined(_WIN64) || \ + (defined(__x86_64__) && defined(__ILP32__)) +#define BIT_BUF_SIZE 64 +#elif (defined(SIZEOF_SIZE_T) && SIZEOF_SIZE_T == 4) || defined(_WIN32) +#define BIT_BUF_SIZE 32 +#else +#error Cannot determine word size +#endif +#define SIMD_BIT_BUF_SIZE (sizeof(simd_bit_buf_type) * 8) + typedef struct { - size_t put_buffer; /* current bit-accumulation buffer */ - int put_bits; /* # of bits now in it */ + union { + bit_buf_type c; + simd_bit_buf_type simd; + } put_buffer; /* current bit accumulation buffer */ + int free_bits; /* # of bits available in it */ + /* (Neon GAS: # of bits now in it) */ int last_dc_val[MAX_COMPS_IN_SCAN]; /* last DC coef for each component */ } savable_state; -/* This macro is to work around compilers with missing or broken - * structure assignment. You'll need to fix this code if you have - * such a compiler and you change MAX_COMPS_IN_SCAN. - */ - -#ifndef NO_STRUCT_ASSIGN -#define ASSIGN_STATE(dest, src) ((dest) = (src)) -#else -#if MAX_COMPS_IN_SCAN == 4 -#define ASSIGN_STATE(dest, src) \ - ((dest).put_buffer = (src).put_buffer, \ - (dest).put_bits = (src).put_bits, \ - (dest).last_dc_val[0] = (src).last_dc_val[0], \ - (dest).last_dc_val[1] = (src).last_dc_val[1], \ - (dest).last_dc_val[2] = (src).last_dc_val[2], \ - (dest).last_dc_val[3] = (src).last_dc_val[3]) -#endif -#endif - - typedef struct { struct jpeg_entropy_encoder pub; /* public fields */ @@ -123,6 +141,7 @@ typedef struct { size_t free_in_buffer; /* # of byte spaces remaining in buffer */ savable_state cur; /* Current bit buffer & DC state */ j_compress_ptr cinfo; /* dump_buffer needs access to this */ + int simd; } working_state; @@ -201,8 +220,17 @@ start_pass_huff(j_compress_ptr cinfo, boolean gather_statistics) } /* Initialize bit buffer to empty */ - entropy->saved.put_buffer = 0; - entropy->saved.put_bits = 0; + if (entropy->simd) { + entropy->saved.put_buffer.simd = 0; +#if defined(__aarch64__) && !defined(NEON_INTRINSICS) + entropy->saved.free_bits = 0; +#else + entropy->saved.free_bits = SIMD_BIT_BUF_SIZE; +#endif + } else { + entropy->saved.put_buffer.c = 0; + entropy->saved.free_bits = BIT_BUF_SIZE; + } /* Initialize restart stuff */ entropy->restarts_to_go = cinfo->restart_interval; @@ -287,6 +315,7 @@ jpeg_make_c_derived_tbl(j_compress_ptr cinfo, boolean isDC, int tblno, * this lets us detect duplicate VAL entries here, and later * allows emit_bits to detect any attempt to emit such symbols. */ + MEMZERO(dtbl->ehufco, sizeof(dtbl->ehufco)); MEMZERO(dtbl->ehufsi, sizeof(dtbl->ehufsi)); /* This is also a convenient place to check for out-of-range @@ -334,94 +363,94 @@ dump_buffer(working_state *state) /* Outputting bits to the file */ -/* These macros perform the same task as the emit_bits() function in the - * original libjpeg code. In addition to reducing overhead by explicitly - * inlining the code, additional performance is achieved by taking into - * account the size of the bit buffer and waiting until it is almost full - * before emptying it. This mostly benefits 64-bit platforms, since 6 - * bytes can be stored in a 64-bit bit buffer before it has to be emptied. +/* Output byte b and, speculatively, an additional 0 byte. 0xFF must be + * encoded as 0xFF 0x00, so the output buffer pointer is advanced by 2 if the + * byte is 0xFF. Otherwise, the output buffer pointer is advanced by 1, and + * the speculative 0 byte will be overwritten by the next byte. */ - -#define EMIT_BYTE() { \ - JOCTET c; \ - put_bits -= 8; \ - c = (JOCTET)GETJOCTET(put_buffer >> put_bits); \ - *buffer++ = c; \ - if (c == 0xFF) /* need to stuff a zero byte? */ \ - *buffer++ = 0; \ +#define EMIT_BYTE(b) { \ + buffer[0] = (JOCTET)(b); \ + buffer[1] = 0; \ + buffer -= -2 + ((JOCTET)(b) < 0xFF); \ } -#define PUT_BITS(code, size) { \ - put_bits += size; \ - put_buffer = (put_buffer << size) | code; \ -} +/* Output the entire bit buffer. If there are no 0xFF bytes in it, then write + * directly to the output buffer. Otherwise, use the EMIT_BYTE() macro to + * encode 0xFF as 0xFF 0x00. + */ +#if BIT_BUF_SIZE == 64 -#if SIZEOF_SIZE_T != 8 && !defined(_WIN64) - -#define CHECKBUF15() { \ - if (put_bits > 15) { \ - EMIT_BYTE() \ - EMIT_BYTE() \ +#define FLUSH() { \ + if (put_buffer & 0x8080808080808080 & ~(put_buffer + 0x0101010101010101)) { \ + EMIT_BYTE(put_buffer >> 56) \ + EMIT_BYTE(put_buffer >> 48) \ + EMIT_BYTE(put_buffer >> 40) \ + EMIT_BYTE(put_buffer >> 32) \ + EMIT_BYTE(put_buffer >> 24) \ + EMIT_BYTE(put_buffer >> 16) \ + EMIT_BYTE(put_buffer >> 8) \ + EMIT_BYTE(put_buffer ) \ + } else { \ + buffer[0] = (JOCTET)(put_buffer >> 56); \ + buffer[1] = (JOCTET)(put_buffer >> 48); \ + buffer[2] = (JOCTET)(put_buffer >> 40); \ + buffer[3] = (JOCTET)(put_buffer >> 32); \ + buffer[4] = (JOCTET)(put_buffer >> 24); \ + buffer[5] = (JOCTET)(put_buffer >> 16); \ + buffer[6] = (JOCTET)(put_buffer >> 8); \ + buffer[7] = (JOCTET)(put_buffer); \ + buffer += 8; \ } \ } -#endif - -#define CHECKBUF31() { \ - if (put_bits > 31) { \ - EMIT_BYTE() \ - EMIT_BYTE() \ - EMIT_BYTE() \ - EMIT_BYTE() \ - } \ -} - -#define CHECKBUF47() { \ - if (put_bits > 47) { \ - EMIT_BYTE() \ - EMIT_BYTE() \ - EMIT_BYTE() \ - EMIT_BYTE() \ - EMIT_BYTE() \ - EMIT_BYTE() \ - } \ -} - -#if !defined(_WIN32) && !defined(SIZEOF_SIZE_T) -#error Cannot determine word size -#endif - -#if SIZEOF_SIZE_T == 8 || defined(_WIN64) - -#define EMIT_BITS(code, size) { \ - CHECKBUF47() \ - PUT_BITS(code, size) \ -} - -#define EMIT_CODE(code, size) { \ - temp2 &= (((JLONG)1) << nbits) - 1; \ - CHECKBUF31() \ - PUT_BITS(code, size) \ - PUT_BITS(temp2, nbits) \ -} - #else -#define EMIT_BITS(code, size) { \ - PUT_BITS(code, size) \ - CHECKBUF15() \ -} - -#define EMIT_CODE(code, size) { \ - temp2 &= (((JLONG)1) << nbits) - 1; \ - PUT_BITS(code, size) \ - CHECKBUF15() \ - PUT_BITS(temp2, nbits) \ - CHECKBUF15() \ +#define FLUSH() { \ + if (put_buffer & 0x80808080 & ~(put_buffer + 0x01010101)) { \ + EMIT_BYTE(put_buffer >> 24) \ + EMIT_BYTE(put_buffer >> 16) \ + EMIT_BYTE(put_buffer >> 8) \ + EMIT_BYTE(put_buffer ) \ + } else { \ + buffer[0] = (JOCTET)(put_buffer >> 24); \ + buffer[1] = (JOCTET)(put_buffer >> 16); \ + buffer[2] = (JOCTET)(put_buffer >> 8); \ + buffer[3] = (JOCTET)(put_buffer); \ + buffer += 4; \ + } \ } #endif +/* Fill the bit buffer to capacity with the leading bits from code, then output + * the bit buffer and put the remaining bits from code into the bit buffer. + */ +#define PUT_AND_FLUSH(code, size) { \ + put_buffer = (put_buffer << (size + free_bits)) | (code >> -free_bits); \ + FLUSH() \ + free_bits += BIT_BUF_SIZE; \ + put_buffer = code; \ +} + +/* Insert code into the bit buffer and output the bit buffer if needed. + * NOTE: We can't flush with free_bits == 0, since the left shift in + * PUT_AND_FLUSH() would have undefined behavior. + */ +#define PUT_BITS(code, size) { \ + free_bits -= size; \ + if (free_bits < 0) \ + PUT_AND_FLUSH(code, size) \ + else \ + put_buffer = (put_buffer << size) | code; \ +} + +#define PUT_CODE(code, size) { \ + temp &= (((JLONG)1) << nbits) - 1; \ + temp |= code << nbits; \ + nbits += size; \ + PUT_BITS(temp, nbits) \ +} + /* Although it is exceedingly rare, it is possible for a Huffman-encoded * coefficient block to be larger than the 128-byte unencoded block. For each @@ -444,6 +473,7 @@ dump_buffer(working_state *state) #define STORE_BUFFER() { \ if (localbuf) { \ + size_t bytes, bytestocopy; \ bytes = buffer - _buffer; \ buffer = _buffer; \ while (bytes > 0) { \ @@ -466,20 +496,46 @@ dump_buffer(working_state *state) LOCAL(boolean) flush_bits(working_state *state) { - JOCTET _buffer[BUFSIZE], *buffer; - size_t put_buffer; int put_bits; - size_t bytes, bytestocopy; int localbuf = 0; + JOCTET _buffer[BUFSIZE], *buffer, temp; + simd_bit_buf_type put_buffer; int put_bits; + int localbuf = 0; + + if (state->simd) { +#if defined(__aarch64__) && !defined(NEON_INTRINSICS) + put_bits = state->cur.free_bits; +#else + put_bits = SIMD_BIT_BUF_SIZE - state->cur.free_bits; +#endif + put_buffer = state->cur.put_buffer.simd; + } else { + put_bits = BIT_BUF_SIZE - state->cur.free_bits; + put_buffer = state->cur.put_buffer.c; + } - put_buffer = state->cur.put_buffer; - put_bits = state->cur.put_bits; LOAD_BUFFER() - /* fill any partial byte with ones */ - PUT_BITS(0x7F, 7) - while (put_bits >= 8) EMIT_BYTE() + while (put_bits >= 8) { + put_bits -= 8; + temp = (JOCTET)(put_buffer >> put_bits); + EMIT_BYTE(temp) + } + if (put_bits) { + /* fill partial byte with ones */ + temp = (JOCTET)((put_buffer << (8 - put_bits)) | (0xFF >> put_bits)); + EMIT_BYTE(temp) + } - state->cur.put_buffer = 0; /* and reset bit-buffer to empty */ - state->cur.put_bits = 0; + if (state->simd) { /* and reset bit buffer to empty */ + state->cur.put_buffer.simd = 0; +#if defined(__aarch64__) && !defined(NEON_INTRINSICS) + state->cur.free_bits = 0; +#else + state->cur.free_bits = SIMD_BIT_BUF_SIZE; +#endif + } else { + state->cur.put_buffer.c = 0; + state->cur.free_bits = BIT_BUF_SIZE; + } STORE_BUFFER() return TRUE; @@ -493,7 +549,7 @@ encode_one_block_simd(working_state *state, JCOEFPTR block, int last_dc_val, c_derived_tbl *dctbl, c_derived_tbl *actbl) { JOCTET _buffer[BUFSIZE], *buffer; - size_t bytes, bytestocopy; int localbuf = 0; + int localbuf = 0; LOAD_BUFFER() @@ -509,53 +565,41 @@ LOCAL(boolean) encode_one_block(working_state *state, JCOEFPTR block, int last_dc_val, c_derived_tbl *dctbl, c_derived_tbl *actbl) { - int temp, temp2, temp3; - int nbits; - int r, code, size; + int temp, nbits, free_bits; + bit_buf_type put_buffer; JOCTET _buffer[BUFSIZE], *buffer; - size_t put_buffer; int put_bits; - int code_0xf0 = actbl->ehufco[0xf0], size_0xf0 = actbl->ehufsi[0xf0]; - size_t bytes, bytestocopy; int localbuf = 0; + int localbuf = 0; - put_buffer = state->cur.put_buffer; - put_bits = state->cur.put_bits; + free_bits = state->cur.free_bits; + put_buffer = state->cur.put_buffer.c; LOAD_BUFFER() /* Encode the DC coefficient difference per section F.1.2.1 */ - temp = temp2 = block[0] - last_dc_val; + temp = block[0] - last_dc_val; /* This is a well-known technique for obtaining the absolute value without a * branch. It is derived from an assembly language technique presented in * "How to Optimize for the Pentium Processors", Copyright (c) 1996, 1997 by - * Agner Fog. + * Agner Fog. This code assumes we are on a two's complement machine. */ - temp3 = temp >> (CHAR_BIT * sizeof(int) - 1); - temp ^= temp3; - temp -= temp3; - - /* For a negative input, want temp2 = bitwise complement of abs(input) */ - /* This code assumes we are on a two's complement machine */ - temp2 += temp3; + nbits = temp >> (CHAR_BIT * sizeof(int) - 1); + temp += nbits; + nbits ^= temp; /* Find the number of bits needed for the magnitude of the coefficient */ - nbits = JPEG_NBITS(temp); + nbits = JPEG_NBITS(nbits); - /* Emit the Huffman-coded symbol for the number of bits */ - code = dctbl->ehufco[nbits]; - size = dctbl->ehufsi[nbits]; - EMIT_BITS(code, size) - - /* Mask off any extra bits in code */ - temp2 &= (((JLONG)1) << nbits) - 1; - - /* Emit that number of bits of the value, if positive, */ - /* or the complement of its magnitude, if negative. */ - EMIT_BITS(temp2, nbits) + /* Emit the Huffman-coded symbol for the number of bits. + * Emit that number of bits of the value, if positive, + * or the complement of its magnitude, if negative. + */ + PUT_CODE(dctbl->ehufco[nbits], dctbl->ehufsi[nbits]) /* Encode the AC coefficients per section F.1.2.2 */ - r = 0; /* r = run length of zeros */ + { + int r = 0; /* r = run length of zeros */ /* Manually unroll the k loop to eliminate the counter variable. This * improves performance greatly on systems with a limited number of @@ -563,51 +607,46 @@ encode_one_block(working_state *state, JCOEFPTR block, int last_dc_val, */ #define kloop(jpeg_natural_order_of_k) { \ if ((temp = block[jpeg_natural_order_of_k]) == 0) { \ - r++; \ + r += 16; \ } else { \ - temp2 = temp; \ /* Branch-less absolute value, bitwise complement, etc., same as above */ \ - temp3 = temp >> (CHAR_BIT * sizeof(int) - 1); \ - temp ^= temp3; \ - temp -= temp3; \ - temp2 += temp3; \ - nbits = JPEG_NBITS_NONZERO(temp); \ + nbits = temp >> (CHAR_BIT * sizeof(int) - 1); \ + temp += nbits; \ + nbits ^= temp; \ + nbits = JPEG_NBITS_NONZERO(nbits); \ /* if run length > 15, must emit special run-length-16 codes (0xF0) */ \ - while (r > 15) { \ - EMIT_BITS(code_0xf0, size_0xf0) \ - r -= 16; \ + while (r >= 16 * 16) { \ + r -= 16 * 16; \ + PUT_BITS(actbl->ehufco[0xf0], actbl->ehufsi[0xf0]) \ } \ /* Emit Huffman symbol for run length / number of bits */ \ - temp3 = (r << 4) + nbits; \ - code = actbl->ehufco[temp3]; \ - size = actbl->ehufsi[temp3]; \ - EMIT_CODE(code, size) \ + r += nbits; \ + PUT_CODE(actbl->ehufco[r], actbl->ehufsi[r]) \ r = 0; \ } \ } - /* One iteration for each value in jpeg_natural_order[] */ - kloop(1); kloop(8); kloop(16); kloop(9); kloop(2); kloop(3); - kloop(10); kloop(17); kloop(24); kloop(32); kloop(25); kloop(18); - kloop(11); kloop(4); kloop(5); kloop(12); kloop(19); kloop(26); - kloop(33); kloop(40); kloop(48); kloop(41); kloop(34); kloop(27); - kloop(20); kloop(13); kloop(6); kloop(7); kloop(14); kloop(21); - kloop(28); kloop(35); kloop(42); kloop(49); kloop(56); kloop(57); - kloop(50); kloop(43); kloop(36); kloop(29); kloop(22); kloop(15); - kloop(23); kloop(30); kloop(37); kloop(44); kloop(51); kloop(58); - kloop(59); kloop(52); kloop(45); kloop(38); kloop(31); kloop(39); - kloop(46); kloop(53); kloop(60); kloop(61); kloop(54); kloop(47); - kloop(55); kloop(62); kloop(63); + /* One iteration for each value in jpeg_natural_order[] */ + kloop(1); kloop(8); kloop(16); kloop(9); kloop(2); kloop(3); + kloop(10); kloop(17); kloop(24); kloop(32); kloop(25); kloop(18); + kloop(11); kloop(4); kloop(5); kloop(12); kloop(19); kloop(26); + kloop(33); kloop(40); kloop(48); kloop(41); kloop(34); kloop(27); + kloop(20); kloop(13); kloop(6); kloop(7); kloop(14); kloop(21); + kloop(28); kloop(35); kloop(42); kloop(49); kloop(56); kloop(57); + kloop(50); kloop(43); kloop(36); kloop(29); kloop(22); kloop(15); + kloop(23); kloop(30); kloop(37); kloop(44); kloop(51); kloop(58); + kloop(59); kloop(52); kloop(45); kloop(38); kloop(31); kloop(39); + kloop(46); kloop(53); kloop(60); kloop(61); kloop(54); kloop(47); + kloop(55); kloop(62); kloop(63); - /* If the last coef(s) were zero, emit an end-of-block code */ - if (r > 0) { - code = actbl->ehufco[0]; - size = actbl->ehufsi[0]; - EMIT_BITS(code, size) + /* If the last coef(s) were zero, emit an end-of-block code */ + if (r > 0) { + PUT_BITS(actbl->ehufco[0], actbl->ehufsi[0]) + } } - state->cur.put_buffer = put_buffer; - state->cur.put_bits = put_bits; + state->cur.put_buffer.c = put_buffer; + state->cur.free_bits = free_bits; STORE_BUFFER() return TRUE; @@ -654,8 +693,9 @@ encode_mcu_huff(j_compress_ptr cinfo, JBLOCKROW *MCU_data) /* Load up working state */ state.next_output_byte = cinfo->dest->next_output_byte; state.free_in_buffer = cinfo->dest->free_in_buffer; - ASSIGN_STATE(state.cur, entropy->saved); + state.cur = entropy->saved; state.cinfo = cinfo; + state.simd = entropy->simd; /* Emit restart marker if needed */ if (cinfo->restart_interval) { @@ -694,7 +734,7 @@ encode_mcu_huff(j_compress_ptr cinfo, JBLOCKROW *MCU_data) /* Completed MCU, so update state */ cinfo->dest->next_output_byte = state.next_output_byte; cinfo->dest->free_in_buffer = state.free_in_buffer; - ASSIGN_STATE(entropy->saved, state.cur); + entropy->saved = state.cur; /* Update restart-interval state too */ if (cinfo->restart_interval) { @@ -723,8 +763,9 @@ finish_pass_huff(j_compress_ptr cinfo) /* Load up working state ... flush_bits needs it */ state.next_output_byte = cinfo->dest->next_output_byte; state.free_in_buffer = cinfo->dest->free_in_buffer; - ASSIGN_STATE(state.cur, entropy->saved); + state.cur = entropy->saved; state.cinfo = cinfo; + state.simd = entropy->simd; /* Flush out the last data */ if (!flush_bits(&state)) @@ -733,7 +774,7 @@ finish_pass_huff(j_compress_ptr cinfo) /* Update state */ cinfo->dest->next_output_byte = state.next_output_byte; cinfo->dest->free_in_buffer = state.free_in_buffer; - ASSIGN_STATE(entropy->saved, state.cur); + entropy->saved = state.cur; } diff --git a/src/3rdparty/libjpeg/src/jcinit.c b/src/3rdparty/libjpeg/src/jcinit.c index 78aa4657..157353a2 100644 --- a/src/3rdparty/libjpeg/src/jcinit.c +++ b/src/3rdparty/libjpeg/src/jcinit.c @@ -1,8 +1,10 @@ /* * jcinit.c * + * This file was part of the Independent JPEG Group's software: * Copyright (C) 1991-1997, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. + * libjpeg-turbo Modifications: + * Copyright (C) 2020, D. R. Commander. * For conditions of distribution and use, see the accompanying README.ijg * file. * @@ -19,6 +21,7 @@ #define JPEG_INTERNALS #include "jinclude.h" #include "jpeglib.h" +#include "jpegcomp.h" /* diff --git a/src/3rdparty/libjpeg/src/jcmaster.c b/src/3rdparty/libjpeg/src/jcmaster.c index 998dc40a..c2b26000 100644 --- a/src/3rdparty/libjpeg/src/jcmaster.c +++ b/src/3rdparty/libjpeg/src/jcmaster.c @@ -493,7 +493,7 @@ prepare_for_pass(j_compress_ptr cinfo) master->pass_type = output_pass; master->pass_number++; #endif - /*FALLTHROUGH*/ + FALLTHROUGH /*FALLTHROUGH*/ case output_pass: /* Do a data-output pass. */ /* We need not repeat per-scan setup if prior optimization pass did it. */ diff --git a/src/3rdparty/libjpeg/src/jconfig.h b/src/3rdparty/libjpeg/src/jconfig.h index e25dba4b..17b9137e 100644 --- a/src/3rdparty/libjpeg/src/jconfig.h +++ b/src/3rdparty/libjpeg/src/jconfig.h @@ -2,9 +2,9 @@ #define JPEG_LIB_VERSION 80 -#define LIBJPEG_TURBO_VERSION 2.0.5 +#define LIBJPEG_TURBO_VERSION 2.1.1 -#define LIBJPEG_TURBO_VERSION_NUMBER 2000005 +#define LIBJPEG_TURBO_VERSION_NUMBER 2001001 #define C_ARITH_CODING_SUPPORTED 1 diff --git a/src/3rdparty/libjpeg/src/jconfig.h.in b/src/3rdparty/libjpeg/src/jconfig.h.in index 18a69a48..d4284d97 100644 --- a/src/3rdparty/libjpeg/src/jconfig.h.in +++ b/src/3rdparty/libjpeg/src/jconfig.h.in @@ -61,11 +61,6 @@ unsigned. */ #cmakedefine RIGHT_SHIFT_IS_UNSIGNED 1 -/* Define to 1 if type `char' is unsigned and you are not using gcc. */ -#ifndef __CHAR_UNSIGNED__ - #cmakedefine __CHAR_UNSIGNED__ 1 -#endif - /* Define to empty if `const' does not conform to ANSI C. */ /* #undef const */ diff --git a/src/3rdparty/libjpeg/jconfigint.h b/src/3rdparty/libjpeg/src/jconfigint.h similarity index 86% rename from src/3rdparty/libjpeg/jconfigint.h rename to src/3rdparty/libjpeg/src/jconfigint.h index d118c9f9..933d92b4 100644 --- a/src/3rdparty/libjpeg/jconfigint.h +++ b/src/3rdparty/libjpeg/src/jconfigint.h @@ -8,10 +8,12 @@ #define PACKAGE_NAME "libjpeg-turbo" -#define VERSION "2.0.5" +#define VERSION "2.1.1" #if SIZE_MAX == 0xffffffff #define SIZEOF_SIZE_T 4 #elif SIZE_MAX == 0xffffffffffffffff #define SIZEOF_SIZE_T 8 #endif + +#define FALLTHROUGH diff --git a/src/3rdparty/libjpeg/src/jconfigint.h.in b/src/3rdparty/libjpeg/src/jconfigint.h.in index 68cbc2a5..d087d7b5 100644 --- a/src/3rdparty/libjpeg/src/jconfigint.h.in +++ b/src/3rdparty/libjpeg/src/jconfigint.h.in @@ -32,3 +32,13 @@ #define HAVE_BITSCANFORWARD #endif #endif + +#if defined(__has_attribute) +#if __has_attribute(fallthrough) +#define FALLTHROUGH __attribute__((fallthrough)); +#else +#define FALLTHROUGH +#endif +#else +#define FALLTHROUGH +#endif diff --git a/src/3rdparty/libjpeg/src/jcphuff.c b/src/3rdparty/libjpeg/src/jcphuff.c index 8c4efaf1..11019871 100644 --- a/src/3rdparty/libjpeg/src/jcphuff.c +++ b/src/3rdparty/libjpeg/src/jcphuff.c @@ -4,8 +4,10 @@ * This file was part of the Independent JPEG Group's software: * Copyright (C) 1995-1997, Thomas G. Lane. * libjpeg-turbo Modifications: - * Copyright (C) 2011, 2015, 2018, D. R. Commander. + * Copyright (C) 2011, 2015, 2018, 2021, D. R. Commander. * Copyright (C) 2016, 2018, Matthieu Darbois. + * Copyright (C) 2020, Arm Limited. + * Copyright (C) 2021, Alex Richardson. * For conditions of distribution and use, see the accompanying README.ijg * file. * @@ -43,23 +45,28 @@ * memory footprint by 64k, which is important for some mobile applications * that create many isolated instances of libjpeg-turbo (web browsers, for * instance.) This may improve performance on some mobile platforms as well. - * This feature is enabled by default only on ARM processors, because some x86 + * This feature is enabled by default only on Arm processors, because some x86 * chips have a slow implementation of bsr, and the use of clz/bsr cannot be * shown to have a significant performance impact even on the x86 chips that - * have a fast implementation of it. When building for ARMv6, you can + * have a fast implementation of it. When building for Armv6, you can * explicitly disable the use of clz/bsr by adding -mthumb to the compiler * flags (this defines __thumb__). */ /* NOTE: Both GCC and Clang define __GNUC__ */ -#if defined(__GNUC__) && (defined(__arm__) || defined(__aarch64__)) +#if (defined(__GNUC__) && (defined(__arm__) || defined(__aarch64__))) || \ + defined(_M_ARM) || defined(_M_ARM64) #if !defined(__thumb__) || defined(__thumb2__) #define USE_CLZ_INTRINSIC #endif #endif #ifdef USE_CLZ_INTRINSIC +#if defined(_MSC_VER) && !defined(__clang__) +#define JPEG_NBITS_NONZERO(x) (32 - _CountLeadingZeros(x)) +#else #define JPEG_NBITS_NONZERO(x) (32 - __builtin_clz(x)) +#endif #define JPEG_NBITS(x) (x ? JPEG_NBITS_NONZERO(x) : 0) #else #include "jpeg_nbits_table.h" @@ -169,24 +176,26 @@ INLINE METHODDEF(int) count_zeroes(size_t *x) { - int result; #if defined(HAVE_BUILTIN_CTZL) + int result; result = __builtin_ctzl(*x); *x >>= result; #elif defined(HAVE_BITSCANFORWARD64) + unsigned long result; _BitScanForward64(&result, *x); *x >>= result; #elif defined(HAVE_BITSCANFORWARD) + unsigned long result; _BitScanForward(&result, *x); *x >>= result; #else - result = 0; + int result = 0; while ((*x & 1) == 0) { ++result; *x >>= 1; } #endif - return result; + return (int)result; } @@ -672,7 +681,7 @@ encode_mcu_AC_first(j_compress_ptr cinfo, JBLOCKROW *MCU_data) emit_restart(entropy, entropy->next_restart_num); #ifdef WITH_SIMD - cvalue = values = (JCOEF *)PAD((size_t)values_unaligned, 16); + cvalue = values = (JCOEF *)PAD((JUINTPTR)values_unaligned, 16); #else /* Not using SIMD, so alignment is not needed */ cvalue = values = values_unaligned; @@ -860,7 +869,7 @@ encode_mcu_AC_refine_prepare(const JCOEF *block, #define ENCODE_COEFS_AC_REFINE(label) { \ while (zerobits) { \ - int idx = count_zeroes(&zerobits); \ + idx = count_zeroes(&zerobits); \ r += idx; \ cabsvalue += idx; \ signbits >>= idx; \ @@ -917,7 +926,7 @@ METHODDEF(boolean) encode_mcu_AC_refine(j_compress_ptr cinfo, JBLOCKROW *MCU_data) { phuff_entropy_ptr entropy = (phuff_entropy_ptr)cinfo->entropy; - register int temp, r; + register int temp, r, idx; char *BR_buffer; unsigned int BR; int Sl = cinfo->Se - cinfo->Ss + 1; @@ -937,7 +946,7 @@ encode_mcu_AC_refine(j_compress_ptr cinfo, JBLOCKROW *MCU_data) emit_restart(entropy, entropy->next_restart_num); #ifdef WITH_SIMD - cabsvalue = absvalues = (JCOEF *)PAD((size_t)absvalues_unaligned, 16); + cabsvalue = absvalues = (JCOEF *)PAD((JUINTPTR)absvalues_unaligned, 16); #else /* Not using SIMD, so alignment is not needed */ cabsvalue = absvalues = absvalues_unaligned; @@ -968,7 +977,7 @@ encode_mcu_AC_refine(j_compress_ptr cinfo, JBLOCKROW *MCU_data) if (zerobits) { int diff = ((absvalues + DCTSIZE2 / 2) - cabsvalue); - int idx = count_zeroes(&zerobits); + idx = count_zeroes(&zerobits); signbits >>= idx; idx += diff; r += idx; diff --git a/src/3rdparty/libjpeg/src/jcsample.c b/src/3rdparty/libjpeg/src/jcsample.c index bd27b84e..e8515ebf 100644 --- a/src/3rdparty/libjpeg/src/jcsample.c +++ b/src/3rdparty/libjpeg/src/jcsample.c @@ -6,7 +6,7 @@ * libjpeg-turbo Modifications: * Copyright 2009 Pierre Ossman for Cendio AB * Copyright (C) 2014, MIPS Technologies, Inc., California. - * Copyright (C) 2015, D. R. Commander. + * Copyright (C) 2015, 2019, D. R. Commander. * For conditions of distribution and use, see the accompanying README.ijg * file. * @@ -103,7 +103,7 @@ expand_right_edge(JSAMPARRAY image_data, int num_rows, JDIMENSION input_cols, if (numcols > 0) { for (row = 0; row < num_rows; row++) { ptr = image_data[row] + input_cols; - pixval = ptr[-1]; /* don't need GETJSAMPLE() here */ + pixval = ptr[-1]; for (count = numcols; count > 0; count--) *ptr++ = pixval; } @@ -174,7 +174,7 @@ int_downsample(j_compress_ptr cinfo, jpeg_component_info *compptr, for (v = 0; v < v_expand; v++) { inptr = input_data[inrow + v] + outcol_h; for (h = 0; h < h_expand; h++) { - outvalue += (JLONG)GETJSAMPLE(*inptr++); + outvalue += (JLONG)(*inptr++); } } *outptr++ = (JSAMPLE)((outvalue + numpix2) / numpix); @@ -237,8 +237,7 @@ h2v1_downsample(j_compress_ptr cinfo, jpeg_component_info *compptr, inptr = input_data[outrow]; bias = 0; /* bias = 0,1,0,1,... for successive samples */ for (outcol = 0; outcol < output_cols; outcol++) { - *outptr++ = - (JSAMPLE)((GETJSAMPLE(*inptr) + GETJSAMPLE(inptr[1]) + bias) >> 1); + *outptr++ = (JSAMPLE)((inptr[0] + inptr[1] + bias) >> 1); bias ^= 1; /* 0=>1, 1=>0 */ inptr += 2; } @@ -277,8 +276,7 @@ h2v2_downsample(j_compress_ptr cinfo, jpeg_component_info *compptr, bias = 1; /* bias = 1,2,1,2,... for successive samples */ for (outcol = 0; outcol < output_cols; outcol++) { *outptr++ = - (JSAMPLE)((GETJSAMPLE(*inptr0) + GETJSAMPLE(inptr0[1]) + - GETJSAMPLE(*inptr1) + GETJSAMPLE(inptr1[1]) + bias) >> 2); + (JSAMPLE)((inptr0[0] + inptr0[1] + inptr1[0] + inptr1[1] + bias) >> 2); bias ^= 3; /* 1=>2, 2=>1 */ inptr0 += 2; inptr1 += 2; } @@ -337,33 +335,25 @@ h2v2_smooth_downsample(j_compress_ptr cinfo, jpeg_component_info *compptr, below_ptr = input_data[inrow + 2]; /* Special case for first column: pretend column -1 is same as column 0 */ - membersum = GETJSAMPLE(*inptr0) + GETJSAMPLE(inptr0[1]) + - GETJSAMPLE(*inptr1) + GETJSAMPLE(inptr1[1]); - neighsum = GETJSAMPLE(*above_ptr) + GETJSAMPLE(above_ptr[1]) + - GETJSAMPLE(*below_ptr) + GETJSAMPLE(below_ptr[1]) + - GETJSAMPLE(*inptr0) + GETJSAMPLE(inptr0[2]) + - GETJSAMPLE(*inptr1) + GETJSAMPLE(inptr1[2]); + membersum = inptr0[0] + inptr0[1] + inptr1[0] + inptr1[1]; + neighsum = above_ptr[0] + above_ptr[1] + below_ptr[0] + below_ptr[1] + + inptr0[0] + inptr0[2] + inptr1[0] + inptr1[2]; neighsum += neighsum; - neighsum += GETJSAMPLE(*above_ptr) + GETJSAMPLE(above_ptr[2]) + - GETJSAMPLE(*below_ptr) + GETJSAMPLE(below_ptr[2]); + neighsum += above_ptr[0] + above_ptr[2] + below_ptr[0] + below_ptr[2]; membersum = membersum * memberscale + neighsum * neighscale; *outptr++ = (JSAMPLE)((membersum + 32768) >> 16); inptr0 += 2; inptr1 += 2; above_ptr += 2; below_ptr += 2; for (colctr = output_cols - 2; colctr > 0; colctr--) { /* sum of pixels directly mapped to this output element */ - membersum = GETJSAMPLE(*inptr0) + GETJSAMPLE(inptr0[1]) + - GETJSAMPLE(*inptr1) + GETJSAMPLE(inptr1[1]); + membersum = inptr0[0] + inptr0[1] + inptr1[0] + inptr1[1]; /* sum of edge-neighbor pixels */ - neighsum = GETJSAMPLE(*above_ptr) + GETJSAMPLE(above_ptr[1]) + - GETJSAMPLE(*below_ptr) + GETJSAMPLE(below_ptr[1]) + - GETJSAMPLE(inptr0[-1]) + GETJSAMPLE(inptr0[2]) + - GETJSAMPLE(inptr1[-1]) + GETJSAMPLE(inptr1[2]); + neighsum = above_ptr[0] + above_ptr[1] + below_ptr[0] + below_ptr[1] + + inptr0[-1] + inptr0[2] + inptr1[-1] + inptr1[2]; /* The edge-neighbors count twice as much as corner-neighbors */ neighsum += neighsum; /* Add in the corner-neighbors */ - neighsum += GETJSAMPLE(above_ptr[-1]) + GETJSAMPLE(above_ptr[2]) + - GETJSAMPLE(below_ptr[-1]) + GETJSAMPLE(below_ptr[2]); + neighsum += above_ptr[-1] + above_ptr[2] + below_ptr[-1] + below_ptr[2]; /* form final output scaled up by 2^16 */ membersum = membersum * memberscale + neighsum * neighscale; /* round, descale and output it */ @@ -372,15 +362,11 @@ h2v2_smooth_downsample(j_compress_ptr cinfo, jpeg_component_info *compptr, } /* Special case for last column */ - membersum = GETJSAMPLE(*inptr0) + GETJSAMPLE(inptr0[1]) + - GETJSAMPLE(*inptr1) + GETJSAMPLE(inptr1[1]); - neighsum = GETJSAMPLE(*above_ptr) + GETJSAMPLE(above_ptr[1]) + - GETJSAMPLE(*below_ptr) + GETJSAMPLE(below_ptr[1]) + - GETJSAMPLE(inptr0[-1]) + GETJSAMPLE(inptr0[1]) + - GETJSAMPLE(inptr1[-1]) + GETJSAMPLE(inptr1[1]); + membersum = inptr0[0] + inptr0[1] + inptr1[0] + inptr1[1]; + neighsum = above_ptr[0] + above_ptr[1] + below_ptr[0] + below_ptr[1] + + inptr0[-1] + inptr0[1] + inptr1[-1] + inptr1[1]; neighsum += neighsum; - neighsum += GETJSAMPLE(above_ptr[-1]) + GETJSAMPLE(above_ptr[1]) + - GETJSAMPLE(below_ptr[-1]) + GETJSAMPLE(below_ptr[1]); + neighsum += above_ptr[-1] + above_ptr[1] + below_ptr[-1] + below_ptr[1]; membersum = membersum * memberscale + neighsum * neighscale; *outptr = (JSAMPLE)((membersum + 32768) >> 16); @@ -429,21 +415,18 @@ fullsize_smooth_downsample(j_compress_ptr cinfo, jpeg_component_info *compptr, below_ptr = input_data[outrow + 1]; /* Special case for first column */ - colsum = GETJSAMPLE(*above_ptr++) + GETJSAMPLE(*below_ptr++) + - GETJSAMPLE(*inptr); - membersum = GETJSAMPLE(*inptr++); - nextcolsum = GETJSAMPLE(*above_ptr) + GETJSAMPLE(*below_ptr) + - GETJSAMPLE(*inptr); + colsum = (*above_ptr++) + (*below_ptr++) + inptr[0]; + membersum = *inptr++; + nextcolsum = above_ptr[0] + below_ptr[0] + inptr[0]; neighsum = colsum + (colsum - membersum) + nextcolsum; membersum = membersum * memberscale + neighsum * neighscale; *outptr++ = (JSAMPLE)((membersum + 32768) >> 16); lastcolsum = colsum; colsum = nextcolsum; for (colctr = output_cols - 2; colctr > 0; colctr--) { - membersum = GETJSAMPLE(*inptr++); + membersum = *inptr++; above_ptr++; below_ptr++; - nextcolsum = GETJSAMPLE(*above_ptr) + GETJSAMPLE(*below_ptr) + - GETJSAMPLE(*inptr); + nextcolsum = above_ptr[0] + below_ptr[0] + inptr[0]; neighsum = lastcolsum + (colsum - membersum) + nextcolsum; membersum = membersum * memberscale + neighsum * neighscale; *outptr++ = (JSAMPLE)((membersum + 32768) >> 16); @@ -451,7 +434,7 @@ fullsize_smooth_downsample(j_compress_ptr cinfo, jpeg_component_info *compptr, } /* Special case for last column */ - membersum = GETJSAMPLE(*inptr); + membersum = *inptr; neighsum = lastcolsum + (colsum - membersum) + colsum; membersum = membersum * memberscale + neighsum * neighscale; *outptr = (JSAMPLE)((membersum + 32768) >> 16); diff --git a/src/3rdparty/libjpeg/src/jctrans.c b/src/3rdparty/libjpeg/src/jctrans.c index ce70a309..ab6a2186 100644 --- a/src/3rdparty/libjpeg/src/jctrans.c +++ b/src/3rdparty/libjpeg/src/jctrans.c @@ -4,8 +4,8 @@ * This file was part of the Independent JPEG Group's software: * Copyright (C) 1995-1998, Thomas G. Lane. * Modified 2000-2009 by Guido Vollbeding. - * It was modified by The libjpeg-turbo Project to include only code relevant - * to libjpeg-turbo. + * libjpeg-turbo Modifications: + * Copyright (C) 2020, D. R. Commander. * For conditions of distribution and use, see the accompanying README.ijg * file. * @@ -17,6 +17,7 @@ #define JPEG_INTERNALS #include "jinclude.h" #include "jpeglib.h" +#include "jpegcomp.h" /* Forward declarations */ diff --git a/src/3rdparty/libjpeg/src/jdapimin.c b/src/3rdparty/libjpeg/src/jdapimin.c index 21a41d2e..4609b132 100644 --- a/src/3rdparty/libjpeg/src/jdapimin.c +++ b/src/3rdparty/libjpeg/src/jdapimin.c @@ -23,6 +23,7 @@ #include "jinclude.h" #include "jpeglib.h" #include "jdmaster.h" +#include "jconfigint.h" /* @@ -308,7 +309,7 @@ jpeg_consume_input(j_decompress_ptr cinfo) /* Initialize application's data source module */ (*cinfo->src->init_source) (cinfo); cinfo->global_state = DSTATE_INHEADER; - /*FALLTHROUGH*/ + FALLTHROUGH /*FALLTHROUGH*/ case DSTATE_INHEADER: retcode = (*cinfo->inputctl->consume_input) (cinfo); if (retcode == JPEG_REACHED_SOS) { /* Found SOS, prepare to decompress */ diff --git a/src/3rdparty/libjpeg/src/jdapistd.c b/src/3rdparty/libjpeg/src/jdapistd.c index 2c808fa5..695a6200 100644 --- a/src/3rdparty/libjpeg/src/jdapistd.c +++ b/src/3rdparty/libjpeg/src/jdapistd.c @@ -4,7 +4,7 @@ * This file was part of the Independent JPEG Group's software: * Copyright (C) 1994-1996, Thomas G. Lane. * libjpeg-turbo Modifications: - * Copyright (C) 2010, 2015-2018, D. R. Commander. + * Copyright (C) 2010, 2015-2020, D. R. Commander. * Copyright (C) 2015, Google, Inc. * For conditions of distribution and use, see the accompanying README.ijg * file. @@ -21,6 +21,8 @@ #include "jinclude.h" #include "jdmainct.h" #include "jdcoefct.h" +#include "jdmaster.h" +#include "jdmerge.h" #include "jdsample.h" #include "jmemsys.h" @@ -316,6 +318,10 @@ LOCAL(void) read_and_discard_scanlines(j_decompress_ptr cinfo, JDIMENSION num_lines) { JDIMENSION n; + my_master_ptr master = (my_master_ptr)cinfo->master; + JSAMPLE dummy_sample[1] = { 0 }; + JSAMPROW dummy_row = dummy_sample; + JSAMPARRAY scanlines = NULL; void (*color_convert) (j_decompress_ptr cinfo, JSAMPIMAGE input_buf, JDIMENSION input_row, JSAMPARRAY output_buf, int num_rows) = NULL; @@ -325,6 +331,10 @@ read_and_discard_scanlines(j_decompress_ptr cinfo, JDIMENSION num_lines) if (cinfo->cconvert && cinfo->cconvert->color_convert) { color_convert = cinfo->cconvert->color_convert; cinfo->cconvert->color_convert = noop_convert; + /* This just prevents UBSan from complaining about adding 0 to a NULL + * pointer. The pointer isn't actually used. + */ + scanlines = &dummy_row; } if (cinfo->cquantize && cinfo->cquantize->color_quantize) { @@ -332,8 +342,13 @@ read_and_discard_scanlines(j_decompress_ptr cinfo, JDIMENSION num_lines) cinfo->cquantize->color_quantize = noop_quantize; } + if (master->using_merged_upsample && cinfo->max_v_samp_factor == 2) { + my_merged_upsample_ptr upsample = (my_merged_upsample_ptr)cinfo->upsample; + scanlines = &upsample->spare_row; + } + for (n = 0; n < num_lines; n++) - jpeg_read_scanlines(cinfo, NULL, 1); + jpeg_read_scanlines(cinfo, scanlines, 1); if (color_convert) cinfo->cconvert->color_convert = color_convert; @@ -353,6 +368,12 @@ increment_simple_rowgroup_ctr(j_decompress_ptr cinfo, JDIMENSION rows) { JDIMENSION rows_left; my_main_ptr main_ptr = (my_main_ptr)cinfo->main; + my_master_ptr master = (my_master_ptr)cinfo->master; + + if (master->using_merged_upsample && cinfo->max_v_samp_factor == 2) { + read_and_discard_scanlines(cinfo, rows); + return; + } /* Increment the counter to the next row group after the skipped rows. */ main_ptr->rowgroup_ctr += rows / cinfo->max_v_samp_factor; @@ -382,21 +403,27 @@ jpeg_skip_scanlines(j_decompress_ptr cinfo, JDIMENSION num_lines) { my_main_ptr main_ptr = (my_main_ptr)cinfo->main; my_coef_ptr coef = (my_coef_ptr)cinfo->coef; + my_master_ptr master = (my_master_ptr)cinfo->master; my_upsample_ptr upsample = (my_upsample_ptr)cinfo->upsample; JDIMENSION i, x; int y; JDIMENSION lines_per_iMCU_row, lines_left_in_iMCU_row, lines_after_iMCU_row; JDIMENSION lines_to_skip, lines_to_read; + /* Two-pass color quantization is not supported. */ + if (cinfo->quantize_colors && cinfo->two_pass_quantize) + ERREXIT(cinfo, JERR_NOTIMPL); + if (cinfo->global_state != DSTATE_SCANNING) ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); /* Do not skip past the bottom of the image. */ if (cinfo->output_scanline + num_lines >= cinfo->output_height) { + num_lines = cinfo->output_height - cinfo->output_scanline; cinfo->output_scanline = cinfo->output_height; (*cinfo->inputctl->finish_input_pass) (cinfo); cinfo->inputctl->eoi_reached = TRUE; - return cinfo->output_height - cinfo->output_scanline; + return num_lines; } if (num_lines == 0) @@ -445,8 +472,10 @@ jpeg_skip_scanlines(j_decompress_ptr cinfo, JDIMENSION num_lines) main_ptr->buffer_full = FALSE; main_ptr->rowgroup_ctr = 0; main_ptr->context_state = CTX_PREPARE_FOR_IMCU; - upsample->next_row_out = cinfo->max_v_samp_factor; - upsample->rows_to_go = cinfo->output_height - cinfo->output_scanline; + if (!master->using_merged_upsample) { + upsample->next_row_out = cinfo->max_v_samp_factor; + upsample->rows_to_go = cinfo->output_height - cinfo->output_scanline; + } } /* Skipping is much simpler when context rows are not required. */ @@ -458,8 +487,10 @@ jpeg_skip_scanlines(j_decompress_ptr cinfo, JDIMENSION num_lines) cinfo->output_scanline += lines_left_in_iMCU_row; main_ptr->buffer_full = FALSE; main_ptr->rowgroup_ctr = 0; - upsample->next_row_out = cinfo->max_v_samp_factor; - upsample->rows_to_go = cinfo->output_height - cinfo->output_scanline; + if (!master->using_merged_upsample) { + upsample->next_row_out = cinfo->max_v_samp_factor; + upsample->rows_to_go = cinfo->output_height - cinfo->output_scanline; + } } } @@ -494,7 +525,8 @@ jpeg_skip_scanlines(j_decompress_ptr cinfo, JDIMENSION num_lines) cinfo->output_iMCU_row += lines_to_skip / lines_per_iMCU_row; increment_simple_rowgroup_ctr(cinfo, lines_to_read); } - upsample->rows_to_go = cinfo->output_height - cinfo->output_scanline; + if (!master->using_merged_upsample) + upsample->rows_to_go = cinfo->output_height - cinfo->output_scanline; return num_lines; } @@ -506,6 +538,8 @@ jpeg_skip_scanlines(j_decompress_ptr cinfo, JDIMENSION num_lines) * decoded coefficients. This is ~5% faster for large subsets, but * it's tough to tell a difference for smaller images. */ + if (!cinfo->entropy->insufficient_data) + cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row; (*cinfo->entropy->decode_mcu) (cinfo, NULL); } } @@ -535,7 +569,8 @@ jpeg_skip_scanlines(j_decompress_ptr cinfo, JDIMENSION num_lines) * bit odd, since "rows_to_go" seems to be redundantly keeping track of * output_scanline. */ - upsample->rows_to_go = cinfo->output_height - cinfo->output_scanline; + if (!master->using_merged_upsample) + upsample->rows_to_go = cinfo->output_height - cinfo->output_scanline; /* Always skip the requested number of lines. */ return num_lines; diff --git a/src/3rdparty/libjpeg/src/jdarith.c b/src/3rdparty/libjpeg/src/jdarith.c index 6002481e..7f0d3a78 100644 --- a/src/3rdparty/libjpeg/src/jdarith.c +++ b/src/3rdparty/libjpeg/src/jdarith.c @@ -4,7 +4,7 @@ * This file was part of the Independent JPEG Group's software: * Developed 1997-2015 by Guido Vollbeding. * libjpeg-turbo Modifications: - * Copyright (C) 2015-2018, D. R. Commander. + * Copyright (C) 2015-2020, D. R. Commander. * For conditions of distribution and use, see the accompanying README.ijg * file. * @@ -80,7 +80,7 @@ get_byte(j_decompress_ptr cinfo) if (!(*src->fill_input_buffer) (cinfo)) ERREXIT(cinfo, JERR_CANT_SUSPEND); src->bytes_in_buffer--; - return GETJOCTET(*src->next_input_byte++); + return *src->next_input_byte++; } @@ -665,8 +665,16 @@ bad: for (ci = 0; ci < cinfo->comps_in_scan; ci++) { int coefi, cindex = cinfo->cur_comp_info[ci]->component_index; int *coef_bit_ptr = &cinfo->coef_bits[cindex][0]; + int *prev_coef_bit_ptr = + &cinfo->coef_bits[cindex + cinfo->num_components][0]; if (cinfo->Ss && coef_bit_ptr[0] < 0) /* AC without prior DC scan */ WARNMS2(cinfo, JWRN_BOGUS_PROGRESSION, cindex, 0); + for (coefi = MIN(cinfo->Ss, 1); coefi <= MAX(cinfo->Se, 9); coefi++) { + if (cinfo->input_scan_number > 1) + prev_coef_bit_ptr[coefi] = coef_bit_ptr[coefi]; + else + prev_coef_bit_ptr[coefi] = 0; + } for (coefi = cinfo->Ss; coefi <= cinfo->Se; coefi++) { int expected = (coef_bit_ptr[coefi] < 0) ? 0 : coef_bit_ptr[coefi]; if (cinfo->Ah != expected) @@ -727,6 +735,7 @@ bad: entropy->c = 0; entropy->a = 0; entropy->ct = -16; /* force reading 2 initial bytes to fill C */ + entropy->pub.insufficient_data = FALSE; /* Initialize restart counter */ entropy->restarts_to_go = cinfo->restart_interval; @@ -763,7 +772,7 @@ jinit_arith_decoder(j_decompress_ptr cinfo) int *coef_bit_ptr, ci; cinfo->coef_bits = (int (*)[DCTSIZE2]) (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE, - cinfo->num_components * DCTSIZE2 * + cinfo->num_components * 2 * DCTSIZE2 * sizeof(int)); coef_bit_ptr = &cinfo->coef_bits[0][0]; for (ci = 0; ci < cinfo->num_components; ci++) diff --git a/src/3rdparty/libjpeg/src/jdcoefct.c b/src/3rdparty/libjpeg/src/jdcoefct.c index 723a9ac2..15e6cded 100644 --- a/src/3rdparty/libjpeg/src/jdcoefct.c +++ b/src/3rdparty/libjpeg/src/jdcoefct.c @@ -5,8 +5,8 @@ * Copyright (C) 1994-1997, Thomas G. Lane. * libjpeg-turbo Modifications: * Copyright 2009 Pierre Ossman for Cendio AB - * Copyright (C) 2010, 2015-2016, D. R. Commander. - * Copyright (C) 2015, Google, Inc. + * Copyright (C) 2010, 2015-2016, 2019-2020, D. R. Commander. + * Copyright (C) 2015, 2020, Google, Inc. * For conditions of distribution and use, see the accompanying README.ijg * file. * @@ -102,6 +102,8 @@ decompress_onepass(j_decompress_ptr cinfo, JSAMPIMAGE output_buf) /* Try to fetch an MCU. Entropy decoder expects buffer to be zeroed. */ jzero_far((void *)coef->MCU_buffer[0], (size_t)(cinfo->blocks_in_MCU * sizeof(JBLOCK))); + if (!cinfo->entropy->insufficient_data) + cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row; if (!(*cinfo->entropy->decode_mcu) (cinfo, coef->MCU_buffer)) { /* Suspension forced; update state counters and exit */ coef->MCU_vert_offset = yoffset; @@ -227,6 +229,8 @@ consume_data(j_decompress_ptr cinfo) } } } + if (!cinfo->entropy->insufficient_data) + cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row; /* Try to fetch the MCU. */ if (!(*cinfo->entropy->decode_mcu) (cinfo, coef->MCU_buffer)) { /* Suspension forced; update state counters and exit */ @@ -326,19 +330,22 @@ decompress_data(j_decompress_ptr cinfo, JSAMPIMAGE output_buf) #ifdef BLOCK_SMOOTHING_SUPPORTED /* - * This code applies interblock smoothing as described by section K.8 - * of the JPEG standard: the first 5 AC coefficients are estimated from - * the DC values of a DCT block and its 8 neighboring blocks. + * This code applies interblock smoothing; the first 9 AC coefficients are + * estimated from the DC values of a DCT block and its 24 neighboring blocks. * We apply smoothing only for progressive JPEG decoding, and only if * the coefficients it can estimate are not yet known to full precision. */ -/* Natural-order array positions of the first 5 zigzag-order coefficients */ +/* Natural-order array positions of the first 9 zigzag-order coefficients */ #define Q01_POS 1 #define Q10_POS 8 #define Q20_POS 16 #define Q11_POS 9 #define Q02_POS 2 +#define Q03_POS 3 +#define Q12_POS 10 +#define Q21_POS 17 +#define Q30_POS 24 /* * Determine whether block smoothing is applicable and safe. @@ -356,8 +363,8 @@ smoothing_ok(j_decompress_ptr cinfo) int ci, coefi; jpeg_component_info *compptr; JQUANT_TBL *qtable; - int *coef_bits; - int *coef_bits_latch; + int *coef_bits, *prev_coef_bits; + int *coef_bits_latch, *prev_coef_bits_latch; if (!cinfo->progressive_mode || cinfo->coef_bits == NULL) return FALSE; @@ -366,34 +373,47 @@ smoothing_ok(j_decompress_ptr cinfo) if (coef->coef_bits_latch == NULL) coef->coef_bits_latch = (int *) (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE, - cinfo->num_components * + cinfo->num_components * 2 * (SAVED_COEFS * sizeof(int))); coef_bits_latch = coef->coef_bits_latch; + prev_coef_bits_latch = + &coef->coef_bits_latch[cinfo->num_components * SAVED_COEFS]; for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; ci++, compptr++) { /* All components' quantization values must already be latched. */ if ((qtable = compptr->quant_table) == NULL) return FALSE; - /* Verify DC & first 5 AC quantizers are nonzero to avoid zero-divide. */ + /* Verify DC & first 9 AC quantizers are nonzero to avoid zero-divide. */ if (qtable->quantval[0] == 0 || qtable->quantval[Q01_POS] == 0 || qtable->quantval[Q10_POS] == 0 || qtable->quantval[Q20_POS] == 0 || qtable->quantval[Q11_POS] == 0 || - qtable->quantval[Q02_POS] == 0) + qtable->quantval[Q02_POS] == 0 || + qtable->quantval[Q03_POS] == 0 || + qtable->quantval[Q12_POS] == 0 || + qtable->quantval[Q21_POS] == 0 || + qtable->quantval[Q30_POS] == 0) return FALSE; /* DC values must be at least partly known for all components. */ coef_bits = cinfo->coef_bits[ci]; + prev_coef_bits = cinfo->coef_bits[ci + cinfo->num_components]; if (coef_bits[0] < 0) return FALSE; + coef_bits_latch[0] = coef_bits[0]; /* Block smoothing is helpful if some AC coefficients remain inaccurate. */ - for (coefi = 1; coefi <= 5; coefi++) { + for (coefi = 1; coefi < SAVED_COEFS; coefi++) { + if (cinfo->input_scan_number > 1) + prev_coef_bits_latch[coefi] = prev_coef_bits[coefi]; + else + prev_coef_bits_latch[coefi] = -1; coef_bits_latch[coefi] = coef_bits[coefi]; if (coef_bits[coefi] != 0) smoothing_useful = TRUE; } coef_bits_latch += SAVED_COEFS; + prev_coef_bits_latch += SAVED_COEFS; } return smoothing_useful; @@ -412,17 +432,20 @@ decompress_smooth_data(j_decompress_ptr cinfo, JSAMPIMAGE output_buf) JDIMENSION block_num, last_block_column; int ci, block_row, block_rows, access_rows; JBLOCKARRAY buffer; - JBLOCKROW buffer_ptr, prev_block_row, next_block_row; + JBLOCKROW buffer_ptr, prev_prev_block_row, prev_block_row; + JBLOCKROW next_block_row, next_next_block_row; JSAMPARRAY output_ptr; JDIMENSION output_col; jpeg_component_info *compptr; inverse_DCT_method_ptr inverse_DCT; - boolean first_row, last_row; + boolean change_dc; JCOEF *workspace; int *coef_bits; JQUANT_TBL *quanttbl; - JLONG Q00, Q01, Q02, Q10, Q11, Q20, num; - int DC1, DC2, DC3, DC4, DC5, DC6, DC7, DC8, DC9; + JLONG Q00, Q01, Q02, Q03 = 0, Q10, Q11, Q12 = 0, Q20, Q21 = 0, Q30 = 0, num; + int DC01, DC02, DC03, DC04, DC05, DC06, DC07, DC08, DC09, DC10, DC11, DC12, + DC13, DC14, DC15, DC16, DC17, DC18, DC19, DC20, DC21, DC22, DC23, DC24, + DC25; int Al, pred; /* Keep a local variable to avoid looking it up more than once */ @@ -434,10 +457,10 @@ decompress_smooth_data(j_decompress_ptr cinfo, JSAMPIMAGE output_buf) if (cinfo->input_scan_number == cinfo->output_scan_number) { /* If input is working on current scan, we ordinarily want it to * have completed the current row. But if input scan is DC, - * we want it to keep one row ahead so that next block row's DC + * we want it to keep two rows ahead so that next two block rows' DC * values are up to date. */ - JDIMENSION delta = (cinfo->Ss == 0) ? 1 : 0; + JDIMENSION delta = (cinfo->Ss == 0) ? 2 : 0; if (cinfo->input_iMCU_row > cinfo->output_iMCU_row + delta) break; } @@ -452,34 +475,53 @@ decompress_smooth_data(j_decompress_ptr cinfo, JSAMPIMAGE output_buf) if (!compptr->component_needed) continue; /* Count non-dummy DCT block rows in this iMCU row. */ - if (cinfo->output_iMCU_row < last_iMCU_row) { + if (cinfo->output_iMCU_row < last_iMCU_row - 1) { + block_rows = compptr->v_samp_factor; + access_rows = block_rows * 3; /* this and next two iMCU rows */ + } else if (cinfo->output_iMCU_row < last_iMCU_row) { block_rows = compptr->v_samp_factor; access_rows = block_rows * 2; /* this and next iMCU row */ - last_row = FALSE; } else { /* NB: can't use last_row_height here; it is input-side-dependent! */ block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor); if (block_rows == 0) block_rows = compptr->v_samp_factor; access_rows = block_rows; /* this iMCU row only */ - last_row = TRUE; } /* Align the virtual buffer for this component. */ - if (cinfo->output_iMCU_row > 0) { - access_rows += compptr->v_samp_factor; /* prior iMCU row too */ + if (cinfo->output_iMCU_row > 1) { + access_rows += 2 * compptr->v_samp_factor; /* prior two iMCU rows too */ + buffer = (*cinfo->mem->access_virt_barray) + ((j_common_ptr)cinfo, coef->whole_image[ci], + (cinfo->output_iMCU_row - 2) * compptr->v_samp_factor, + (JDIMENSION)access_rows, FALSE); + buffer += 2 * compptr->v_samp_factor; /* point to current iMCU row */ + } else if (cinfo->output_iMCU_row > 0) { buffer = (*cinfo->mem->access_virt_barray) ((j_common_ptr)cinfo, coef->whole_image[ci], (cinfo->output_iMCU_row - 1) * compptr->v_samp_factor, (JDIMENSION)access_rows, FALSE); buffer += compptr->v_samp_factor; /* point to current iMCU row */ - first_row = FALSE; } else { buffer = (*cinfo->mem->access_virt_barray) ((j_common_ptr)cinfo, coef->whole_image[ci], (JDIMENSION)0, (JDIMENSION)access_rows, FALSE); - first_row = TRUE; } - /* Fetch component-dependent info */ - coef_bits = coef->coef_bits_latch + (ci * SAVED_COEFS); + /* Fetch component-dependent info. + * If the current scan is incomplete, then we use the component-dependent + * info from the previous scan. + */ + if (cinfo->output_iMCU_row > cinfo->master->last_good_iMCU_row) + coef_bits = + coef->coef_bits_latch + ((ci + cinfo->num_components) * SAVED_COEFS); + else + coef_bits = coef->coef_bits_latch + (ci * SAVED_COEFS); + + /* We only do DC interpolation if no AC coefficient data is available. */ + change_dc = + coef_bits[1] == -1 && coef_bits[2] == -1 && coef_bits[3] == -1 && + coef_bits[4] == -1 && coef_bits[5] == -1 && coef_bits[6] == -1 && + coef_bits[7] == -1 && coef_bits[8] == -1 && coef_bits[9] == -1; + quanttbl = compptr->quant_table; Q00 = quanttbl->quantval[0]; Q01 = quanttbl->quantval[Q01_POS]; @@ -487,25 +529,51 @@ decompress_smooth_data(j_decompress_ptr cinfo, JSAMPIMAGE output_buf) Q20 = quanttbl->quantval[Q20_POS]; Q11 = quanttbl->quantval[Q11_POS]; Q02 = quanttbl->quantval[Q02_POS]; + if (change_dc) { + Q03 = quanttbl->quantval[Q03_POS]; + Q12 = quanttbl->quantval[Q12_POS]; + Q21 = quanttbl->quantval[Q21_POS]; + Q30 = quanttbl->quantval[Q30_POS]; + } inverse_DCT = cinfo->idct->inverse_DCT[ci]; output_ptr = output_buf[ci]; /* Loop over all DCT blocks to be processed. */ for (block_row = 0; block_row < block_rows; block_row++) { buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci]; - if (first_row && block_row == 0) + + if (block_row > 0 || cinfo->output_iMCU_row > 0) + prev_block_row = + buffer[block_row - 1] + cinfo->master->first_MCU_col[ci]; + else prev_block_row = buffer_ptr; + + if (block_row > 1 || cinfo->output_iMCU_row > 1) + prev_prev_block_row = + buffer[block_row - 2] + cinfo->master->first_MCU_col[ci]; + else + prev_prev_block_row = prev_block_row; + + if (block_row < block_rows - 1 || cinfo->output_iMCU_row < last_iMCU_row) + next_block_row = + buffer[block_row + 1] + cinfo->master->first_MCU_col[ci]; else - prev_block_row = buffer[block_row - 1]; - if (last_row && block_row == block_rows - 1) next_block_row = buffer_ptr; + + if (block_row < block_rows - 2 || + cinfo->output_iMCU_row < last_iMCU_row - 1) + next_next_block_row = + buffer[block_row + 2] + cinfo->master->first_MCU_col[ci]; else - next_block_row = buffer[block_row + 1]; + next_next_block_row = next_block_row; + /* We fetch the surrounding DC values using a sliding-register approach. - * Initialize all nine here so as to do the right thing on narrow pics. + * Initialize all 25 here so as to do the right thing on narrow pics. */ - DC1 = DC2 = DC3 = (int)prev_block_row[0][0]; - DC4 = DC5 = DC6 = (int)buffer_ptr[0][0]; - DC7 = DC8 = DC9 = (int)next_block_row[0][0]; + DC01 = DC02 = DC03 = DC04 = DC05 = (int)prev_prev_block_row[0][0]; + DC06 = DC07 = DC08 = DC09 = DC10 = (int)prev_block_row[0][0]; + DC11 = DC12 = DC13 = DC14 = DC15 = (int)buffer_ptr[0][0]; + DC16 = DC17 = DC18 = DC19 = DC20 = (int)next_block_row[0][0]; + DC21 = DC22 = DC23 = DC24 = DC25 = (int)next_next_block_row[0][0]; output_col = 0; last_block_column = compptr->width_in_blocks - 1; for (block_num = cinfo->master->first_MCU_col[ci]; @@ -513,18 +581,39 @@ decompress_smooth_data(j_decompress_ptr cinfo, JSAMPIMAGE output_buf) /* Fetch current DCT block into workspace so we can modify it. */ jcopy_block_row(buffer_ptr, (JBLOCKROW)workspace, (JDIMENSION)1); /* Update DC values */ - if (block_num < last_block_column) { - DC3 = (int)prev_block_row[1][0]; - DC6 = (int)buffer_ptr[1][0]; - DC9 = (int)next_block_row[1][0]; + if (block_num == cinfo->master->first_MCU_col[ci] && + block_num < last_block_column) { + DC04 = (int)prev_prev_block_row[1][0]; + DC09 = (int)prev_block_row[1][0]; + DC14 = (int)buffer_ptr[1][0]; + DC19 = (int)next_block_row[1][0]; + DC24 = (int)next_next_block_row[1][0]; } - /* Compute coefficient estimates per K.8. - * An estimate is applied only if coefficient is still zero, - * and is not known to be fully accurate. + if (block_num + 1 < last_block_column) { + DC05 = (int)prev_prev_block_row[2][0]; + DC10 = (int)prev_block_row[2][0]; + DC15 = (int)buffer_ptr[2][0]; + DC20 = (int)next_block_row[2][0]; + DC25 = (int)next_next_block_row[2][0]; + } + /* If DC interpolation is enabled, compute coefficient estimates using + * a Gaussian-like kernel, keeping the averages of the DC values. + * + * If DC interpolation is disabled, compute coefficient estimates using + * an algorithm similar to the one described in Section K.8 of the JPEG + * standard, except applied to a 5x5 window rather than a 3x3 window. + * + * An estimate is applied only if the coefficient is still zero and is + * not known to be fully accurate. */ /* AC01 */ if ((Al = coef_bits[1]) != 0 && workspace[1] == 0) { - num = 36 * Q00 * (DC4 - DC6); + num = Q00 * (change_dc ? + (-DC01 - DC02 + DC04 + DC05 - 3 * DC06 + 13 * DC07 - + 13 * DC09 + 3 * DC10 - 3 * DC11 + 38 * DC12 - 38 * DC14 + + 3 * DC15 - 3 * DC16 + 13 * DC17 - 13 * DC19 + 3 * DC20 - + DC21 - DC22 + DC24 + DC25) : + (-7 * DC11 + 50 * DC12 - 50 * DC14 + 7 * DC15)); if (num >= 0) { pred = (int)(((Q01 << 7) + num) / (Q01 << 8)); if (Al > 0 && pred >= (1 << Al)) @@ -539,7 +628,12 @@ decompress_smooth_data(j_decompress_ptr cinfo, JSAMPIMAGE output_buf) } /* AC10 */ if ((Al = coef_bits[2]) != 0 && workspace[8] == 0) { - num = 36 * Q00 * (DC2 - DC8); + num = Q00 * (change_dc ? + (-DC01 - 3 * DC02 - 3 * DC03 - 3 * DC04 - DC05 - DC06 + + 13 * DC07 + 38 * DC08 + 13 * DC09 - DC10 + DC16 - + 13 * DC17 - 38 * DC18 - 13 * DC19 + DC20 + DC21 + + 3 * DC22 + 3 * DC23 + 3 * DC24 + DC25) : + (-7 * DC03 + 50 * DC08 - 50 * DC18 + 7 * DC23)); if (num >= 0) { pred = (int)(((Q10 << 7) + num) / (Q10 << 8)); if (Al > 0 && pred >= (1 << Al)) @@ -554,7 +648,10 @@ decompress_smooth_data(j_decompress_ptr cinfo, JSAMPIMAGE output_buf) } /* AC20 */ if ((Al = coef_bits[3]) != 0 && workspace[16] == 0) { - num = 9 * Q00 * (DC2 + DC8 - 2 * DC5); + num = Q00 * (change_dc ? + (DC03 + 2 * DC07 + 7 * DC08 + 2 * DC09 - 5 * DC12 - 14 * DC13 - + 5 * DC14 + 2 * DC17 + 7 * DC18 + 2 * DC19 + DC23) : + (-DC03 + 13 * DC08 - 24 * DC13 + 13 * DC18 - DC23)); if (num >= 0) { pred = (int)(((Q20 << 7) + num) / (Q20 << 8)); if (Al > 0 && pred >= (1 << Al)) @@ -569,7 +666,11 @@ decompress_smooth_data(j_decompress_ptr cinfo, JSAMPIMAGE output_buf) } /* AC11 */ if ((Al = coef_bits[4]) != 0 && workspace[9] == 0) { - num = 5 * Q00 * (DC1 - DC3 - DC7 + DC9); + num = Q00 * (change_dc ? + (-DC01 + DC05 + 9 * DC07 - 9 * DC09 - 9 * DC17 + + 9 * DC19 + DC21 - DC25) : + (DC10 + DC16 - 10 * DC17 + 10 * DC19 - DC02 - DC20 + DC22 - + DC24 + DC04 - DC06 + 10 * DC07 - 10 * DC09)); if (num >= 0) { pred = (int)(((Q11 << 7) + num) / (Q11 << 8)); if (Al > 0 && pred >= (1 << Al)) @@ -584,7 +685,10 @@ decompress_smooth_data(j_decompress_ptr cinfo, JSAMPIMAGE output_buf) } /* AC02 */ if ((Al = coef_bits[5]) != 0 && workspace[2] == 0) { - num = 9 * Q00 * (DC4 + DC6 - 2 * DC5); + num = Q00 * (change_dc ? + (2 * DC07 - 5 * DC08 + 2 * DC09 + DC11 + 7 * DC12 - 14 * DC13 + + 7 * DC14 + DC15 + 2 * DC17 - 5 * DC18 + 2 * DC19) : + (-DC11 + 13 * DC12 - 24 * DC13 + 13 * DC14 - DC15)); if (num >= 0) { pred = (int)(((Q02 << 7) + num) / (Q02 << 8)); if (Al > 0 && pred >= (1 << Al)) @@ -597,14 +701,96 @@ decompress_smooth_data(j_decompress_ptr cinfo, JSAMPIMAGE output_buf) } workspace[2] = (JCOEF)pred; } + if (change_dc) { + /* AC03 */ + if ((Al = coef_bits[6]) != 0 && workspace[3] == 0) { + num = Q00 * (DC07 - DC09 + 2 * DC12 - 2 * DC14 + DC17 - DC19); + if (num >= 0) { + pred = (int)(((Q03 << 7) + num) / (Q03 << 8)); + if (Al > 0 && pred >= (1 << Al)) + pred = (1 << Al) - 1; + } else { + pred = (int)(((Q03 << 7) - num) / (Q03 << 8)); + if (Al > 0 && pred >= (1 << Al)) + pred = (1 << Al) - 1; + pred = -pred; + } + workspace[3] = (JCOEF)pred; + } + /* AC12 */ + if ((Al = coef_bits[7]) != 0 && workspace[10] == 0) { + num = Q00 * (DC07 - 3 * DC08 + DC09 - DC17 + 3 * DC18 - DC19); + if (num >= 0) { + pred = (int)(((Q12 << 7) + num) / (Q12 << 8)); + if (Al > 0 && pred >= (1 << Al)) + pred = (1 << Al) - 1; + } else { + pred = (int)(((Q12 << 7) - num) / (Q12 << 8)); + if (Al > 0 && pred >= (1 << Al)) + pred = (1 << Al) - 1; + pred = -pred; + } + workspace[10] = (JCOEF)pred; + } + /* AC21 */ + if ((Al = coef_bits[8]) != 0 && workspace[17] == 0) { + num = Q00 * (DC07 - DC09 - 3 * DC12 + 3 * DC14 + DC17 - DC19); + if (num >= 0) { + pred = (int)(((Q21 << 7) + num) / (Q21 << 8)); + if (Al > 0 && pred >= (1 << Al)) + pred = (1 << Al) - 1; + } else { + pred = (int)(((Q21 << 7) - num) / (Q21 << 8)); + if (Al > 0 && pred >= (1 << Al)) + pred = (1 << Al) - 1; + pred = -pred; + } + workspace[17] = (JCOEF)pred; + } + /* AC30 */ + if ((Al = coef_bits[9]) != 0 && workspace[24] == 0) { + num = Q00 * (DC07 + 2 * DC08 + DC09 - DC17 - 2 * DC18 - DC19); + if (num >= 0) { + pred = (int)(((Q30 << 7) + num) / (Q30 << 8)); + if (Al > 0 && pred >= (1 << Al)) + pred = (1 << Al) - 1; + } else { + pred = (int)(((Q30 << 7) - num) / (Q30 << 8)); + if (Al > 0 && pred >= (1 << Al)) + pred = (1 << Al) - 1; + pred = -pred; + } + workspace[24] = (JCOEF)pred; + } + /* coef_bits[0] is non-negative. Otherwise this function would not + * be called. + */ + num = Q00 * + (-2 * DC01 - 6 * DC02 - 8 * DC03 - 6 * DC04 - 2 * DC05 - + 6 * DC06 + 6 * DC07 + 42 * DC08 + 6 * DC09 - 6 * DC10 - + 8 * DC11 + 42 * DC12 + 152 * DC13 + 42 * DC14 - 8 * DC15 - + 6 * DC16 + 6 * DC17 + 42 * DC18 + 6 * DC19 - 6 * DC20 - + 2 * DC21 - 6 * DC22 - 8 * DC23 - 6 * DC24 - 2 * DC25); + if (num >= 0) { + pred = (int)(((Q00 << 7) + num) / (Q00 << 8)); + } else { + pred = (int)(((Q00 << 7) - num) / (Q00 << 8)); + pred = -pred; + } + workspace[0] = (JCOEF)pred; + } /* change_dc */ + /* OK, do the IDCT */ (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)workspace, output_ptr, output_col); /* Advance for next column */ - DC1 = DC2; DC2 = DC3; - DC4 = DC5; DC5 = DC6; - DC7 = DC8; DC8 = DC9; - buffer_ptr++, prev_block_row++, next_block_row++; + DC01 = DC02; DC02 = DC03; DC03 = DC04; DC04 = DC05; + DC06 = DC07; DC07 = DC08; DC08 = DC09; DC09 = DC10; + DC11 = DC12; DC12 = DC13; DC13 = DC14; DC14 = DC15; + DC16 = DC17; DC17 = DC18; DC18 = DC19; DC19 = DC20; + DC21 = DC22; DC22 = DC23; DC23 = DC24; DC24 = DC25; + buffer_ptr++, prev_block_row++, next_block_row++, + prev_prev_block_row++, next_next_block_row++; output_col += compptr->_DCT_scaled_size; } output_ptr += compptr->_DCT_scaled_size; @@ -653,7 +839,7 @@ jinit_d_coef_controller(j_decompress_ptr cinfo, boolean need_full_buffer) #ifdef BLOCK_SMOOTHING_SUPPORTED /* If block smoothing could be used, need a bigger window */ if (cinfo->progressive_mode) - access_rows *= 3; + access_rows *= 5; #endif coef->whole_image[ci] = (*cinfo->mem->request_virt_barray) ((j_common_ptr)cinfo, JPOOL_IMAGE, TRUE, diff --git a/src/3rdparty/libjpeg/src/jdcoefct.h b/src/3rdparty/libjpeg/src/jdcoefct.h index c4d1943d..9a0e7806 100644 --- a/src/3rdparty/libjpeg/src/jdcoefct.h +++ b/src/3rdparty/libjpeg/src/jdcoefct.h @@ -5,6 +5,7 @@ * Copyright (C) 1994-1997, Thomas G. Lane. * libjpeg-turbo Modifications: * Copyright 2009 Pierre Ossman for Cendio AB + * Copyright (C) 2020, Google, Inc. * For conditions of distribution and use, see the accompanying README.ijg * file. */ @@ -51,7 +52,7 @@ typedef struct { #ifdef BLOCK_SMOOTHING_SUPPORTED /* When doing block smoothing, we latch coefficient Al values here */ int *coef_bits_latch; -#define SAVED_COEFS 6 /* we save coef_bits[0..5] */ +#define SAVED_COEFS 10 /* we save coef_bits[0..9] */ #endif } my_coef_controller; diff --git a/src/3rdparty/libjpeg/src/jdcol565.c b/src/3rdparty/libjpeg/src/jdcol565.c index 40068ef8..53c7bd91 100644 --- a/src/3rdparty/libjpeg/src/jdcol565.c +++ b/src/3rdparty/libjpeg/src/jdcol565.c @@ -45,9 +45,9 @@ ycc_rgb565_convert_internal(j_decompress_ptr cinfo, JSAMPIMAGE input_buf, outptr = *output_buf++; if (PACK_NEED_ALIGNMENT(outptr)) { - y = GETJSAMPLE(*inptr0++); - cb = GETJSAMPLE(*inptr1++); - cr = GETJSAMPLE(*inptr2++); + y = *inptr0++; + cb = *inptr1++; + cr = *inptr2++; r = range_limit[y + Crrtab[cr]]; g = range_limit[y + ((int)RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS))]; @@ -58,18 +58,18 @@ ycc_rgb565_convert_internal(j_decompress_ptr cinfo, JSAMPIMAGE input_buf, num_cols--; } for (col = 0; col < (num_cols >> 1); col++) { - y = GETJSAMPLE(*inptr0++); - cb = GETJSAMPLE(*inptr1++); - cr = GETJSAMPLE(*inptr2++); + y = *inptr0++; + cb = *inptr1++; + cr = *inptr2++; r = range_limit[y + Crrtab[cr]]; g = range_limit[y + ((int)RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS))]; b = range_limit[y + Cbbtab[cb]]; rgb = PACK_SHORT_565(r, g, b); - y = GETJSAMPLE(*inptr0++); - cb = GETJSAMPLE(*inptr1++); - cr = GETJSAMPLE(*inptr2++); + y = *inptr0++; + cb = *inptr1++; + cr = *inptr2++; r = range_limit[y + Crrtab[cr]]; g = range_limit[y + ((int)RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS))]; @@ -80,9 +80,9 @@ ycc_rgb565_convert_internal(j_decompress_ptr cinfo, JSAMPIMAGE input_buf, outptr += 4; } if (num_cols & 1) { - y = GETJSAMPLE(*inptr0); - cb = GETJSAMPLE(*inptr1); - cr = GETJSAMPLE(*inptr2); + y = *inptr0; + cb = *inptr1; + cr = *inptr2; r = range_limit[y + Crrtab[cr]]; g = range_limit[y + ((int)RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS))]; @@ -125,9 +125,9 @@ ycc_rgb565D_convert_internal(j_decompress_ptr cinfo, JSAMPIMAGE input_buf, input_row++; outptr = *output_buf++; if (PACK_NEED_ALIGNMENT(outptr)) { - y = GETJSAMPLE(*inptr0++); - cb = GETJSAMPLE(*inptr1++); - cr = GETJSAMPLE(*inptr2++); + y = *inptr0++; + cb = *inptr1++; + cr = *inptr2++; r = range_limit[DITHER_565_R(y + Crrtab[cr], d0)]; g = range_limit[DITHER_565_G(y + ((int)RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], @@ -139,9 +139,9 @@ ycc_rgb565D_convert_internal(j_decompress_ptr cinfo, JSAMPIMAGE input_buf, num_cols--; } for (col = 0; col < (num_cols >> 1); col++) { - y = GETJSAMPLE(*inptr0++); - cb = GETJSAMPLE(*inptr1++); - cr = GETJSAMPLE(*inptr2++); + y = *inptr0++; + cb = *inptr1++; + cr = *inptr2++; r = range_limit[DITHER_565_R(y + Crrtab[cr], d0)]; g = range_limit[DITHER_565_G(y + ((int)RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], @@ -150,9 +150,9 @@ ycc_rgb565D_convert_internal(j_decompress_ptr cinfo, JSAMPIMAGE input_buf, d0 = DITHER_ROTATE(d0); rgb = PACK_SHORT_565(r, g, b); - y = GETJSAMPLE(*inptr0++); - cb = GETJSAMPLE(*inptr1++); - cr = GETJSAMPLE(*inptr2++); + y = *inptr0++; + cb = *inptr1++; + cr = *inptr2++; r = range_limit[DITHER_565_R(y + Crrtab[cr], d0)]; g = range_limit[DITHER_565_G(y + ((int)RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], @@ -165,9 +165,9 @@ ycc_rgb565D_convert_internal(j_decompress_ptr cinfo, JSAMPIMAGE input_buf, outptr += 4; } if (num_cols & 1) { - y = GETJSAMPLE(*inptr0); - cb = GETJSAMPLE(*inptr1); - cr = GETJSAMPLE(*inptr2); + y = *inptr0; + cb = *inptr1; + cr = *inptr2; r = range_limit[DITHER_565_R(y + Crrtab[cr], d0)]; g = range_limit[DITHER_565_G(y + ((int)RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], @@ -202,32 +202,32 @@ rgb_rgb565_convert_internal(j_decompress_ptr cinfo, JSAMPIMAGE input_buf, input_row++; outptr = *output_buf++; if (PACK_NEED_ALIGNMENT(outptr)) { - r = GETJSAMPLE(*inptr0++); - g = GETJSAMPLE(*inptr1++); - b = GETJSAMPLE(*inptr2++); + r = *inptr0++; + g = *inptr1++; + b = *inptr2++; rgb = PACK_SHORT_565(r, g, b); *(INT16 *)outptr = (INT16)rgb; outptr += 2; num_cols--; } for (col = 0; col < (num_cols >> 1); col++) { - r = GETJSAMPLE(*inptr0++); - g = GETJSAMPLE(*inptr1++); - b = GETJSAMPLE(*inptr2++); + r = *inptr0++; + g = *inptr1++; + b = *inptr2++; rgb = PACK_SHORT_565(r, g, b); - r = GETJSAMPLE(*inptr0++); - g = GETJSAMPLE(*inptr1++); - b = GETJSAMPLE(*inptr2++); + r = *inptr0++; + g = *inptr1++; + b = *inptr2++; rgb = PACK_TWO_PIXELS(rgb, PACK_SHORT_565(r, g, b)); WRITE_TWO_ALIGNED_PIXELS(outptr, rgb); outptr += 4; } if (num_cols & 1) { - r = GETJSAMPLE(*inptr0); - g = GETJSAMPLE(*inptr1); - b = GETJSAMPLE(*inptr2); + r = *inptr0; + g = *inptr1; + b = *inptr2; rgb = PACK_SHORT_565(r, g, b); *(INT16 *)outptr = (INT16)rgb; } @@ -259,24 +259,24 @@ rgb_rgb565D_convert_internal(j_decompress_ptr cinfo, JSAMPIMAGE input_buf, input_row++; outptr = *output_buf++; if (PACK_NEED_ALIGNMENT(outptr)) { - r = range_limit[DITHER_565_R(GETJSAMPLE(*inptr0++), d0)]; - g = range_limit[DITHER_565_G(GETJSAMPLE(*inptr1++), d0)]; - b = range_limit[DITHER_565_B(GETJSAMPLE(*inptr2++), d0)]; + r = range_limit[DITHER_565_R(*inptr0++, d0)]; + g = range_limit[DITHER_565_G(*inptr1++, d0)]; + b = range_limit[DITHER_565_B(*inptr2++, d0)]; rgb = PACK_SHORT_565(r, g, b); *(INT16 *)outptr = (INT16)rgb; outptr += 2; num_cols--; } for (col = 0; col < (num_cols >> 1); col++) { - r = range_limit[DITHER_565_R(GETJSAMPLE(*inptr0++), d0)]; - g = range_limit[DITHER_565_G(GETJSAMPLE(*inptr1++), d0)]; - b = range_limit[DITHER_565_B(GETJSAMPLE(*inptr2++), d0)]; + r = range_limit[DITHER_565_R(*inptr0++, d0)]; + g = range_limit[DITHER_565_G(*inptr1++, d0)]; + b = range_limit[DITHER_565_B(*inptr2++, d0)]; d0 = DITHER_ROTATE(d0); rgb = PACK_SHORT_565(r, g, b); - r = range_limit[DITHER_565_R(GETJSAMPLE(*inptr0++), d0)]; - g = range_limit[DITHER_565_G(GETJSAMPLE(*inptr1++), d0)]; - b = range_limit[DITHER_565_B(GETJSAMPLE(*inptr2++), d0)]; + r = range_limit[DITHER_565_R(*inptr0++, d0)]; + g = range_limit[DITHER_565_G(*inptr1++, d0)]; + b = range_limit[DITHER_565_B(*inptr2++, d0)]; d0 = DITHER_ROTATE(d0); rgb = PACK_TWO_PIXELS(rgb, PACK_SHORT_565(r, g, b)); @@ -284,9 +284,9 @@ rgb_rgb565D_convert_internal(j_decompress_ptr cinfo, JSAMPIMAGE input_buf, outptr += 4; } if (num_cols & 1) { - r = range_limit[DITHER_565_R(GETJSAMPLE(*inptr0), d0)]; - g = range_limit[DITHER_565_G(GETJSAMPLE(*inptr1), d0)]; - b = range_limit[DITHER_565_B(GETJSAMPLE(*inptr2), d0)]; + r = range_limit[DITHER_565_R(*inptr0, d0)]; + g = range_limit[DITHER_565_G(*inptr1, d0)]; + b = range_limit[DITHER_565_B(*inptr2, d0)]; rgb = PACK_SHORT_565(r, g, b); *(INT16 *)outptr = (INT16)rgb; } diff --git a/src/3rdparty/libjpeg/src/jdcolext.c b/src/3rdparty/libjpeg/src/jdcolext.c index 72a53010..863c7a2f 100644 --- a/src/3rdparty/libjpeg/src/jdcolext.c +++ b/src/3rdparty/libjpeg/src/jdcolext.c @@ -53,9 +53,9 @@ ycc_rgb_convert_internal(j_decompress_ptr cinfo, JSAMPIMAGE input_buf, input_row++; outptr = *output_buf++; for (col = 0; col < num_cols; col++) { - y = GETJSAMPLE(inptr0[col]); - cb = GETJSAMPLE(inptr1[col]); - cr = GETJSAMPLE(inptr2[col]); + y = inptr0[col]; + cb = inptr1[col]; + cr = inptr2[col]; /* Range-limiting is essential due to noise introduced by DCT losses. */ outptr[RGB_RED] = range_limit[y + Crrtab[cr]]; outptr[RGB_GREEN] = range_limit[y + @@ -93,7 +93,6 @@ gray_rgb_convert_internal(j_decompress_ptr cinfo, JSAMPIMAGE input_buf, inptr = input_buf[0][input_row++]; outptr = *output_buf++; for (col = 0; col < num_cols; col++) { - /* We can dispense with GETJSAMPLE() here */ outptr[RGB_RED] = outptr[RGB_GREEN] = outptr[RGB_BLUE] = inptr[col]; /* Set unused byte to 0xFF so it can be interpreted as an opaque */ /* alpha channel value */ @@ -128,7 +127,6 @@ rgb_rgb_convert_internal(j_decompress_ptr cinfo, JSAMPIMAGE input_buf, input_row++; outptr = *output_buf++; for (col = 0; col < num_cols; col++) { - /* We can dispense with GETJSAMPLE() here */ outptr[RGB_RED] = inptr0[col]; outptr[RGB_GREEN] = inptr1[col]; outptr[RGB_BLUE] = inptr2[col]; diff --git a/src/3rdparty/libjpeg/src/jdcolor.c b/src/3rdparty/libjpeg/src/jdcolor.c index dc0e3b6c..8da2b4ea 100644 --- a/src/3rdparty/libjpeg/src/jdcolor.c +++ b/src/3rdparty/libjpeg/src/jdcolor.c @@ -341,9 +341,9 @@ rgb_gray_convert(j_decompress_ptr cinfo, JSAMPIMAGE input_buf, input_row++; outptr = *output_buf++; for (col = 0; col < num_cols; col++) { - r = GETJSAMPLE(inptr0[col]); - g = GETJSAMPLE(inptr1[col]); - b = GETJSAMPLE(inptr2[col]); + r = inptr0[col]; + g = inptr1[col]; + b = inptr2[col]; /* Y */ outptr[col] = (JSAMPLE)((ctab[r + R_Y_OFF] + ctab[g + G_Y_OFF] + ctab[b + B_Y_OFF]) >> SCALEBITS); @@ -550,9 +550,9 @@ ycck_cmyk_convert(j_decompress_ptr cinfo, JSAMPIMAGE input_buf, input_row++; outptr = *output_buf++; for (col = 0; col < num_cols; col++) { - y = GETJSAMPLE(inptr0[col]); - cb = GETJSAMPLE(inptr1[col]); - cr = GETJSAMPLE(inptr2[col]); + y = inptr0[col]; + cb = inptr1[col]; + cr = inptr2[col]; /* Range-limiting is essential due to noise introduced by DCT losses. */ outptr[0] = range_limit[MAXJSAMPLE - (y + Crrtab[cr])]; /* red */ outptr[1] = range_limit[MAXJSAMPLE - (y + /* green */ @@ -560,7 +560,7 @@ ycck_cmyk_convert(j_decompress_ptr cinfo, JSAMPIMAGE input_buf, SCALEBITS)))]; outptr[2] = range_limit[MAXJSAMPLE - (y + Cbbtab[cb])]; /* blue */ /* K passes through unchanged */ - outptr[3] = inptr3[col]; /* don't need GETJSAMPLE here */ + outptr[3] = inptr3[col]; outptr += 4; } } @@ -571,11 +571,10 @@ ycck_cmyk_convert(j_decompress_ptr cinfo, JSAMPIMAGE input_buf, * RGB565 conversion */ -#define PACK_SHORT_565_LE(r, g, b) ((((r) << 8) & 0xF800) | \ - (((g) << 3) & 0x7E0) | ((b) >> 3)) -#define PACK_SHORT_565_BE(r, g, b) (((r) & 0xF8) | ((g) >> 5) | \ - (((g) << 11) & 0xE000) | \ - (((b) << 5) & 0x1F00)) +#define PACK_SHORT_565_LE(r, g, b) \ + ((((r) << 8) & 0xF800) | (((g) << 3) & 0x7E0) | ((b) >> 3)) +#define PACK_SHORT_565_BE(r, g, b) \ + (((r) & 0xF8) | ((g) >> 5) | (((g) << 11) & 0xE000) | (((b) << 5) & 0x1F00)) #define PACK_TWO_PIXELS_LE(l, r) ((r << 16) | l) #define PACK_TWO_PIXELS_BE(l, r) ((l << 16) | r) diff --git a/src/3rdparty/libjpeg/src/jdhuff.c b/src/3rdparty/libjpeg/src/jdhuff.c index a1128178..679d2216 100644 --- a/src/3rdparty/libjpeg/src/jdhuff.c +++ b/src/3rdparty/libjpeg/src/jdhuff.c @@ -5,6 +5,7 @@ * Copyright (C) 1991-1997, Thomas G. Lane. * libjpeg-turbo Modifications: * Copyright (C) 2009-2011, 2016, 2018-2019, D. R. Commander. + * Copyright (C) 2018, Matthias Räncker. * For conditions of distribution and use, see the accompanying README.ijg * file. * @@ -39,24 +40,6 @@ typedef struct { int last_dc_val[MAX_COMPS_IN_SCAN]; /* last DC coef for each component */ } savable_state; -/* This macro is to work around compilers with missing or broken - * structure assignment. You'll need to fix this code if you have - * such a compiler and you change MAX_COMPS_IN_SCAN. - */ - -#ifndef NO_STRUCT_ASSIGN -#define ASSIGN_STATE(dest, src) ((dest) = (src)) -#else -#if MAX_COMPS_IN_SCAN == 4 -#define ASSIGN_STATE(dest, src) \ - ((dest).last_dc_val[0] = (src).last_dc_val[0], \ - (dest).last_dc_val[1] = (src).last_dc_val[1], \ - (dest).last_dc_val[2] = (src).last_dc_val[2], \ - (dest).last_dc_val[3] = (src).last_dc_val[3]) -#endif -#endif - - typedef struct { struct jpeg_entropy_decoder pub; /* public fields */ @@ -325,7 +308,7 @@ jpeg_fill_bit_buffer(bitread_working_state *state, bytes_in_buffer = cinfo->src->bytes_in_buffer; } bytes_in_buffer--; - c = GETJOCTET(*next_input_byte++); + c = *next_input_byte++; /* If it's 0xFF, check and discard stuffed zero byte */ if (c == 0xFF) { @@ -342,7 +325,7 @@ jpeg_fill_bit_buffer(bitread_working_state *state, bytes_in_buffer = cinfo->src->bytes_in_buffer; } bytes_in_buffer--; - c = GETJOCTET(*next_input_byte++); + c = *next_input_byte++; } while (c == 0xFF); if (c == 0) { @@ -405,8 +388,8 @@ no_more_bytes: #define GET_BYTE { \ register int c0, c1; \ - c0 = GETJOCTET(*buffer++); \ - c1 = GETJOCTET(*buffer); \ + c0 = *buffer++; \ + c1 = *buffer; \ /* Pre-execute most common case */ \ get_buffer = (get_buffer << 8) | c0; \ bits_left += 8; \ @@ -423,7 +406,7 @@ no_more_bytes: } \ } -#if SIZEOF_SIZE_T == 8 || defined(_WIN64) +#if SIZEOF_SIZE_T == 8 || defined(_WIN64) || (defined(__x86_64__) && defined(__ILP32__)) /* Pre-fetch 48 bytes, because the holding register is 64-bit */ #define FILL_BIT_BUFFER_FAST \ @@ -557,6 +540,12 @@ process_restart(j_decompress_ptr cinfo) } +#if defined(__has_feature) +#if __has_feature(undefined_behavior_sanitizer) +__attribute__((no_sanitize("signed-integer-overflow"), + no_sanitize("unsigned-integer-overflow"))) +#endif +#endif LOCAL(boolean) decode_mcu_slow(j_decompress_ptr cinfo, JBLOCKROW *MCU_data) { @@ -568,7 +557,7 @@ decode_mcu_slow(j_decompress_ptr cinfo, JBLOCKROW *MCU_data) /* Load up working state */ BITREAD_LOAD_STATE(cinfo, entropy->bitstate); - ASSIGN_STATE(state, entropy->saved); + state = entropy->saved; for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) { JBLOCKROW block = MCU_data ? MCU_data[blkn] : NULL; @@ -589,11 +578,15 @@ decode_mcu_slow(j_decompress_ptr cinfo, JBLOCKROW *MCU_data) if (entropy->dc_needed[blkn]) { /* Convert DC difference to actual value, update last_dc_val */ int ci = cinfo->MCU_membership[blkn]; - /* This is really just - * s += state.last_dc_val[ci]; - * It is written this way in order to shut up UBSan. + /* Certain malformed JPEG images produce repeated DC coefficient + * differences of 2047 or -2047, which causes state.last_dc_val[ci] to + * grow until it overflows or underflows a 32-bit signed integer. This + * behavior is, to the best of our understanding, innocuous, and it is + * unclear how to work around it without potentially affecting + * performance. Thus, we (hopefully temporarily) suppress UBSan integer + * overflow errors for this function and decode_mcu_fast(). */ - s = (int)((unsigned int)s + (unsigned int)state.last_dc_val[ci]); + s += state.last_dc_val[ci]; state.last_dc_val[ci] = s; if (block) { /* Output the DC coefficient (assumes jpeg_natural_order[0] = 0) */ @@ -653,11 +646,17 @@ decode_mcu_slow(j_decompress_ptr cinfo, JBLOCKROW *MCU_data) /* Completed MCU, so update state */ BITREAD_SAVE_STATE(cinfo, entropy->bitstate); - ASSIGN_STATE(entropy->saved, state); + entropy->saved = state; return TRUE; } +#if defined(__has_feature) +#if __has_feature(undefined_behavior_sanitizer) +__attribute__((no_sanitize("signed-integer-overflow"), + no_sanitize("unsigned-integer-overflow"))) +#endif +#endif LOCAL(boolean) decode_mcu_fast(j_decompress_ptr cinfo, JBLOCKROW *MCU_data) { @@ -671,7 +670,7 @@ decode_mcu_fast(j_decompress_ptr cinfo, JBLOCKROW *MCU_data) /* Load up working state */ BITREAD_LOAD_STATE(cinfo, entropy->bitstate); buffer = (JOCTET *)br_state.next_input_byte; - ASSIGN_STATE(state, entropy->saved); + state = entropy->saved; for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) { JBLOCKROW block = MCU_data ? MCU_data[blkn] : NULL; @@ -688,7 +687,10 @@ decode_mcu_fast(j_decompress_ptr cinfo, JBLOCKROW *MCU_data) if (entropy->dc_needed[blkn]) { int ci = cinfo->MCU_membership[blkn]; - s = (int)((unsigned int)s + (unsigned int)state.last_dc_val[ci]); + /* Refer to the comment in decode_mcu_slow() regarding the supression of + * a UBSan integer overflow error in this line of code. + */ + s += state.last_dc_val[ci]; state.last_dc_val[ci] = s; if (block) (*block)[0] = (JCOEF)s; @@ -740,7 +742,7 @@ decode_mcu_fast(j_decompress_ptr cinfo, JBLOCKROW *MCU_data) br_state.bytes_in_buffer -= (buffer - br_state.next_input_byte); br_state.next_input_byte = buffer; BITREAD_SAVE_STATE(cinfo, entropy->bitstate); - ASSIGN_STATE(entropy->saved, state); + entropy->saved = state; return TRUE; } @@ -795,7 +797,8 @@ use_slow: } /* Account for restart interval (no-op if not using restarts) */ - entropy->restarts_to_go--; + if (cinfo->restart_interval) + entropy->restarts_to_go--; return TRUE; } diff --git a/src/3rdparty/libjpeg/src/jdhuff.h b/src/3rdparty/libjpeg/src/jdhuff.h index 6a8d90f4..cfa0b7f5 100644 --- a/src/3rdparty/libjpeg/src/jdhuff.h +++ b/src/3rdparty/libjpeg/src/jdhuff.h @@ -4,7 +4,8 @@ * This file was part of the Independent JPEG Group's software: * Copyright (C) 1991-1997, Thomas G. Lane. * libjpeg-turbo Modifications: - * Copyright (C) 2010-2011, 2015-2016, D. R. Commander. + * Copyright (C) 2010-2011, 2015-2016, 2021, D. R. Commander. + * Copyright (C) 2018, Matthias Räncker. * For conditions of distribution and use, see the accompanying README.ijg * file. * @@ -78,6 +79,11 @@ EXTERN(void) jpeg_make_d_derived_tbl(j_decompress_ptr cinfo, boolean isDC, typedef size_t bit_buf_type; /* type of bit-extraction buffer */ #define BIT_BUF_SIZE 64 /* size of buffer in bits */ +#elif defined(__x86_64__) && defined(__ILP32__) + +typedef unsigned long long bit_buf_type; /* type of bit-extraction buffer */ +#define BIT_BUF_SIZE 64 /* size of buffer in bits */ + #else typedef unsigned long bit_buf_type; /* type of bit-extraction buffer */ @@ -228,7 +234,10 @@ slowlabel: \ s |= GET_BITS(1); \ nb++; \ } \ - s = htbl->pub->huffval[(int)(s + htbl->valoffset[nb]) & 0xFF]; \ + if (nb > 16) \ + s = 0; \ + else \ + s = htbl->pub->huffval[(int)(s + htbl->valoffset[nb]) & 0xFF]; \ } /* Out-of-line case for Huffman code fetching */ diff --git a/src/3rdparty/libjpeg/src/jdmainct.c b/src/3rdparty/libjpeg/src/jdmainct.c index 50301d6b..f466b259 100644 --- a/src/3rdparty/libjpeg/src/jdmainct.c +++ b/src/3rdparty/libjpeg/src/jdmainct.c @@ -18,6 +18,7 @@ #include "jinclude.h" #include "jdmainct.h" +#include "jconfigint.h" /* @@ -360,7 +361,7 @@ process_data_context_main(j_decompress_ptr cinfo, JSAMPARRAY output_buf, main_ptr->context_state = CTX_PREPARE_FOR_IMCU; if (*out_row_ctr >= out_rows_avail) return; /* Postprocessor exactly filled output buf */ - /*FALLTHROUGH*/ + FALLTHROUGH /*FALLTHROUGH*/ case CTX_PREPARE_FOR_IMCU: /* Prepare to process first M-1 row groups of this iMCU row */ main_ptr->rowgroup_ctr = 0; @@ -371,7 +372,7 @@ process_data_context_main(j_decompress_ptr cinfo, JSAMPARRAY output_buf, if (main_ptr->iMCU_row_ctr == cinfo->total_iMCU_rows) set_bottom_pointers(cinfo); main_ptr->context_state = CTX_PROCESS_IMCU; - /*FALLTHROUGH*/ + FALLTHROUGH /*FALLTHROUGH*/ case CTX_PROCESS_IMCU: /* Call postprocessor using previously set pointers */ (*cinfo->post->post_process_data) (cinfo, diff --git a/src/3rdparty/libjpeg/src/jdmarker.c b/src/3rdparty/libjpeg/src/jdmarker.c index c9c7ef63..b964c3a1 100644 --- a/src/3rdparty/libjpeg/src/jdmarker.c +++ b/src/3rdparty/libjpeg/src/jdmarker.c @@ -151,7 +151,7 @@ typedef my_marker_reader *my_marker_ptr; #define INPUT_BYTE(cinfo, V, action) \ MAKESTMT( MAKE_BYTE_AVAIL(cinfo, action); \ bytes_in_buffer--; \ - V = GETJOCTET(*next_input_byte++); ) + V = *next_input_byte++; ) /* As above, but read two bytes interpreted as an unsigned 16-bit integer. * V should be declared unsigned int or perhaps JLONG. @@ -159,10 +159,10 @@ typedef my_marker_reader *my_marker_ptr; #define INPUT_2BYTES(cinfo, V, action) \ MAKESTMT( MAKE_BYTE_AVAIL(cinfo, action); \ bytes_in_buffer--; \ - V = ((unsigned int)GETJOCTET(*next_input_byte++)) << 8; \ + V = ((unsigned int)(*next_input_byte++)) << 8; \ MAKE_BYTE_AVAIL(cinfo, action); \ bytes_in_buffer--; \ - V += GETJOCTET(*next_input_byte++); ) + V += *next_input_byte++; ) /* @@ -608,18 +608,18 @@ examine_app0(j_decompress_ptr cinfo, JOCTET *data, unsigned int datalen, JLONG totallen = (JLONG)datalen + remaining; if (datalen >= APP0_DATA_LEN && - GETJOCTET(data[0]) == 0x4A && - GETJOCTET(data[1]) == 0x46 && - GETJOCTET(data[2]) == 0x49 && - GETJOCTET(data[3]) == 0x46 && - GETJOCTET(data[4]) == 0) { + data[0] == 0x4A && + data[1] == 0x46 && + data[2] == 0x49 && + data[3] == 0x46 && + data[4] == 0) { /* Found JFIF APP0 marker: save info */ cinfo->saw_JFIF_marker = TRUE; - cinfo->JFIF_major_version = GETJOCTET(data[5]); - cinfo->JFIF_minor_version = GETJOCTET(data[6]); - cinfo->density_unit = GETJOCTET(data[7]); - cinfo->X_density = (GETJOCTET(data[8]) << 8) + GETJOCTET(data[9]); - cinfo->Y_density = (GETJOCTET(data[10]) << 8) + GETJOCTET(data[11]); + cinfo->JFIF_major_version = data[5]; + cinfo->JFIF_minor_version = data[6]; + cinfo->density_unit = data[7]; + cinfo->X_density = (data[8] << 8) + data[9]; + cinfo->Y_density = (data[10] << 8) + data[11]; /* Check version. * Major version must be 1, anything else signals an incompatible change. * (We used to treat this as an error, but now it's a nonfatal warning, @@ -634,24 +634,22 @@ examine_app0(j_decompress_ptr cinfo, JOCTET *data, unsigned int datalen, cinfo->JFIF_major_version, cinfo->JFIF_minor_version, cinfo->X_density, cinfo->Y_density, cinfo->density_unit); /* Validate thumbnail dimensions and issue appropriate messages */ - if (GETJOCTET(data[12]) | GETJOCTET(data[13])) - TRACEMS2(cinfo, 1, JTRC_JFIF_THUMBNAIL, - GETJOCTET(data[12]), GETJOCTET(data[13])); + if (data[12] | data[13]) + TRACEMS2(cinfo, 1, JTRC_JFIF_THUMBNAIL, data[12], data[13]); totallen -= APP0_DATA_LEN; - if (totallen != - ((JLONG)GETJOCTET(data[12]) * (JLONG)GETJOCTET(data[13]) * (JLONG)3)) + if (totallen != ((JLONG)data[12] * (JLONG)data[13] * (JLONG)3)) TRACEMS1(cinfo, 1, JTRC_JFIF_BADTHUMBNAILSIZE, (int)totallen); } else if (datalen >= 6 && - GETJOCTET(data[0]) == 0x4A && - GETJOCTET(data[1]) == 0x46 && - GETJOCTET(data[2]) == 0x58 && - GETJOCTET(data[3]) == 0x58 && - GETJOCTET(data[4]) == 0) { + data[0] == 0x4A && + data[1] == 0x46 && + data[2] == 0x58 && + data[3] == 0x58 && + data[4] == 0) { /* Found JFIF "JFXX" extension APP0 marker */ /* The library doesn't actually do anything with these, * but we try to produce a helpful trace message. */ - switch (GETJOCTET(data[5])) { + switch (data[5]) { case 0x10: TRACEMS1(cinfo, 1, JTRC_THUMB_JPEG, (int)totallen); break; @@ -662,8 +660,7 @@ examine_app0(j_decompress_ptr cinfo, JOCTET *data, unsigned int datalen, TRACEMS1(cinfo, 1, JTRC_THUMB_RGB, (int)totallen); break; default: - TRACEMS2(cinfo, 1, JTRC_JFIF_EXTENSION, - GETJOCTET(data[5]), (int)totallen); + TRACEMS2(cinfo, 1, JTRC_JFIF_EXTENSION, data[5], (int)totallen); break; } } else { @@ -684,16 +681,16 @@ examine_app14(j_decompress_ptr cinfo, JOCTET *data, unsigned int datalen, unsigned int version, flags0, flags1, transform; if (datalen >= APP14_DATA_LEN && - GETJOCTET(data[0]) == 0x41 && - GETJOCTET(data[1]) == 0x64 && - GETJOCTET(data[2]) == 0x6F && - GETJOCTET(data[3]) == 0x62 && - GETJOCTET(data[4]) == 0x65) { + data[0] == 0x41 && + data[1] == 0x64 && + data[2] == 0x6F && + data[3] == 0x62 && + data[4] == 0x65) { /* Found Adobe APP14 marker */ - version = (GETJOCTET(data[5]) << 8) + GETJOCTET(data[6]); - flags0 = (GETJOCTET(data[7]) << 8) + GETJOCTET(data[8]); - flags1 = (GETJOCTET(data[9]) << 8) + GETJOCTET(data[10]); - transform = GETJOCTET(data[11]); + version = (data[5] << 8) + data[6]; + flags0 = (data[7] << 8) + data[8]; + flags1 = (data[9] << 8) + data[10]; + transform = data[11]; TRACEMS4(cinfo, 1, JTRC_ADOBE, version, flags0, flags1, transform); cinfo->saw_Adobe_marker = TRUE; cinfo->Adobe_transform = (UINT8)transform; diff --git a/src/3rdparty/libjpeg/src/jdmaster.c b/src/3rdparty/libjpeg/src/jdmaster.c index b2090643..cbc8774b 100644 --- a/src/3rdparty/libjpeg/src/jdmaster.c +++ b/src/3rdparty/libjpeg/src/jdmaster.c @@ -5,7 +5,7 @@ * Copyright (C) 1991-1997, Thomas G. Lane. * Modified 2002-2009 by Guido Vollbeding. * libjpeg-turbo Modifications: - * Copyright (C) 2009-2011, 2016, D. R. Commander. + * Copyright (C) 2009-2011, 2016, 2019, D. R. Commander. * Copyright (C) 2013, Linaro Limited. * Copyright (C) 2015, Google, Inc. * For conditions of distribution and use, see the accompanying README.ijg @@ -22,7 +22,6 @@ #include "jpeglib.h" #include "jpegcomp.h" #include "jdmaster.h" -#include "jsimd.h" /* @@ -70,17 +69,6 @@ use_merged_upsample(j_decompress_ptr cinfo) cinfo->comp_info[1]._DCT_scaled_size != cinfo->_min_DCT_scaled_size || cinfo->comp_info[2]._DCT_scaled_size != cinfo->_min_DCT_scaled_size) return FALSE; -#ifdef WITH_SIMD - /* If YCbCr-to-RGB color conversion is SIMD-accelerated but merged upsampling - isn't, then disabling merged upsampling is likely to be faster when - decompressing YCbCr JPEG images. */ - if (!jsimd_can_h2v2_merged_upsample() && !jsimd_can_h2v1_merged_upsample() && - jsimd_can_ycc_rgb() && cinfo->jpeg_color_space == JCS_YCbCr && - (cinfo->out_color_space == JCS_RGB || - (cinfo->out_color_space >= JCS_EXT_RGB && - cinfo->out_color_space <= JCS_EXT_ARGB))) - return FALSE; -#endif /* ??? also need to test for upsample-time rescaling, when & if supported */ return TRUE; /* by golly, it'll work... */ #else @@ -580,6 +568,7 @@ master_selection(j_decompress_ptr cinfo) */ cinfo->master->first_iMCU_col = 0; cinfo->master->last_iMCU_col = cinfo->MCUs_per_row - 1; + cinfo->master->last_good_iMCU_row = 0; #ifdef D_MULTISCAN_FILES_SUPPORTED /* If jpeg_start_decompress will read the whole file, initialize diff --git a/src/3rdparty/libjpeg/src/jdmerge.c b/src/3rdparty/libjpeg/src/jdmerge.c index dff5a350..3a456d65 100644 --- a/src/3rdparty/libjpeg/src/jdmerge.c +++ b/src/3rdparty/libjpeg/src/jdmerge.c @@ -5,7 +5,7 @@ * Copyright (C) 1994-1996, Thomas G. Lane. * libjpeg-turbo Modifications: * Copyright 2009 Pierre Ossman for Cendio AB - * Copyright (C) 2009, 2011, 2014-2015, D. R. Commander. + * Copyright (C) 2009, 2011, 2014-2015, 2020, D. R. Commander. * Copyright (C) 2013, Linaro Limited. * For conditions of distribution and use, see the accompanying README.ijg * file. @@ -40,41 +40,13 @@ #define JPEG_INTERNALS #include "jinclude.h" #include "jpeglib.h" +#include "jdmerge.h" #include "jsimd.h" #include "jconfigint.h" #ifdef UPSAMPLE_MERGING_SUPPORTED -/* Private subobject */ - -typedef struct { - struct jpeg_upsampler pub; /* public fields */ - - /* Pointer to routine to do actual upsampling/conversion of one row group */ - void (*upmethod) (j_decompress_ptr cinfo, JSAMPIMAGE input_buf, - JDIMENSION in_row_group_ctr, JSAMPARRAY output_buf); - - /* Private state for YCC->RGB conversion */ - int *Cr_r_tab; /* => table for Cr to R conversion */ - int *Cb_b_tab; /* => table for Cb to B conversion */ - JLONG *Cr_g_tab; /* => table for Cr to G conversion */ - JLONG *Cb_g_tab; /* => table for Cb to G conversion */ - - /* For 2:1 vertical sampling, we produce two output rows at a time. - * We need a "spare" row buffer to hold the second output row if the - * application provides just a one-row buffer; we also use the spare - * to discard the dummy last row if the image height is odd. - */ - JSAMPROW spare_row; - boolean spare_full; /* T if spare buffer is occupied */ - - JDIMENSION out_row_width; /* samples per output row */ - JDIMENSION rows_to_go; /* counts rows remaining in image */ -} my_upsampler; - -typedef my_upsampler *my_upsample_ptr; - #define SCALEBITS 16 /* speediest right-shift on some machines */ #define ONE_HALF ((JLONG)1 << (SCALEBITS - 1)) #define FIX(x) ((JLONG)((x) * (1L << SCALEBITS) + 0.5)) @@ -189,7 +161,7 @@ typedef my_upsampler *my_upsample_ptr; LOCAL(void) build_ycc_rgb_table(j_decompress_ptr cinfo) { - my_upsample_ptr upsample = (my_upsample_ptr)cinfo->upsample; + my_merged_upsample_ptr upsample = (my_merged_upsample_ptr)cinfo->upsample; int i; JLONG x; SHIFT_TEMPS @@ -232,7 +204,7 @@ build_ycc_rgb_table(j_decompress_ptr cinfo) METHODDEF(void) start_pass_merged_upsample(j_decompress_ptr cinfo) { - my_upsample_ptr upsample = (my_upsample_ptr)cinfo->upsample; + my_merged_upsample_ptr upsample = (my_merged_upsample_ptr)cinfo->upsample; /* Mark the spare buffer empty */ upsample->spare_full = FALSE; @@ -254,7 +226,7 @@ merged_2v_upsample(j_decompress_ptr cinfo, JSAMPIMAGE input_buf, JDIMENSION *out_row_ctr, JDIMENSION out_rows_avail) /* 2:1 vertical sampling case: may need a spare row. */ { - my_upsample_ptr upsample = (my_upsample_ptr)cinfo->upsample; + my_merged_upsample_ptr upsample = (my_merged_upsample_ptr)cinfo->upsample; JSAMPROW work_ptrs[2]; JDIMENSION num_rows; /* number of rows returned to caller */ @@ -305,7 +277,7 @@ merged_1v_upsample(j_decompress_ptr cinfo, JSAMPIMAGE input_buf, JDIMENSION *out_row_ctr, JDIMENSION out_rows_avail) /* 1:1 vertical sampling case: much easier, never need a spare row. */ { - my_upsample_ptr upsample = (my_upsample_ptr)cinfo->upsample; + my_merged_upsample_ptr upsample = (my_merged_upsample_ptr)cinfo->upsample; /* Just do the upsampling. */ (*upsample->upmethod) (cinfo, input_buf, *in_row_group_ctr, @@ -420,11 +392,10 @@ h2v2_merged_upsample(j_decompress_ptr cinfo, JSAMPIMAGE input_buf, * RGB565 conversion */ -#define PACK_SHORT_565_LE(r, g, b) ((((r) << 8) & 0xF800) | \ - (((g) << 3) & 0x7E0) | ((b) >> 3)) -#define PACK_SHORT_565_BE(r, g, b) (((r) & 0xF8) | ((g) >> 5) | \ - (((g) << 11) & 0xE000) | \ - (((b) << 5) & 0x1F00)) +#define PACK_SHORT_565_LE(r, g, b) \ + ((((r) << 8) & 0xF800) | (((g) << 3) & 0x7E0) | ((b) >> 3)) +#define PACK_SHORT_565_BE(r, g, b) \ + (((r) & 0xF8) | ((g) >> 5) | (((g) << 11) & 0xE000) | (((b) << 5) & 0x1F00)) #define PACK_TWO_PIXELS_LE(l, r) ((r << 16) | l) #define PACK_TWO_PIXELS_BE(l, r) ((l << 16) | r) @@ -566,11 +537,11 @@ h2v2_merged_upsample_565D(j_decompress_ptr cinfo, JSAMPIMAGE input_buf, GLOBAL(void) jinit_merged_upsampler(j_decompress_ptr cinfo) { - my_upsample_ptr upsample; + my_merged_upsample_ptr upsample; - upsample = (my_upsample_ptr) + upsample = (my_merged_upsample_ptr) (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE, - sizeof(my_upsampler)); + sizeof(my_merged_upsampler)); cinfo->upsample = (struct jpeg_upsampler *)upsample; upsample->pub.start_pass = start_pass_merged_upsample; upsample->pub.need_context_rows = FALSE; diff --git a/src/3rdparty/libjpeg/src/jdmerge.h b/src/3rdparty/libjpeg/src/jdmerge.h new file mode 100644 index 00000000..b583396b --- /dev/null +++ b/src/3rdparty/libjpeg/src/jdmerge.h @@ -0,0 +1,47 @@ +/* + * jdmerge.h + * + * This file was part of the Independent JPEG Group's software: + * Copyright (C) 1994-1996, Thomas G. Lane. + * libjpeg-turbo Modifications: + * Copyright (C) 2020, D. R. Commander. + * For conditions of distribution and use, see the accompanying README.ijg + * file. + */ + +#define JPEG_INTERNALS +#include "jpeglib.h" + +#ifdef UPSAMPLE_MERGING_SUPPORTED + + +/* Private subobject */ + +typedef struct { + struct jpeg_upsampler pub; /* public fields */ + + /* Pointer to routine to do actual upsampling/conversion of one row group */ + void (*upmethod) (j_decompress_ptr cinfo, JSAMPIMAGE input_buf, + JDIMENSION in_row_group_ctr, JSAMPARRAY output_buf); + + /* Private state for YCC->RGB conversion */ + int *Cr_r_tab; /* => table for Cr to R conversion */ + int *Cb_b_tab; /* => table for Cb to B conversion */ + JLONG *Cr_g_tab; /* => table for Cr to G conversion */ + JLONG *Cb_g_tab; /* => table for Cb to G conversion */ + + /* For 2:1 vertical sampling, we produce two output rows at a time. + * We need a "spare" row buffer to hold the second output row if the + * application provides just a one-row buffer; we also use the spare + * to discard the dummy last row if the image height is odd. + */ + JSAMPROW spare_row; + boolean spare_full; /* T if spare buffer is occupied */ + + JDIMENSION out_row_width; /* samples per output row */ + JDIMENSION rows_to_go; /* counts rows remaining in image */ +} my_merged_upsampler; + +typedef my_merged_upsampler *my_merged_upsample_ptr; + +#endif /* UPSAMPLE_MERGING_SUPPORTED */ diff --git a/src/3rdparty/libjpeg/src/jdmrg565.c b/src/3rdparty/libjpeg/src/jdmrg565.c index 1b87e371..980a4e21 100644 --- a/src/3rdparty/libjpeg/src/jdmrg565.c +++ b/src/3rdparty/libjpeg/src/jdmrg565.c @@ -5,7 +5,7 @@ * Copyright (C) 1994-1996, Thomas G. Lane. * libjpeg-turbo Modifications: * Copyright (C) 2013, Linaro Limited. - * Copyright (C) 2014-2015, 2018, D. R. Commander. + * Copyright (C) 2014-2015, 2018, 2020, D. R. Commander. * For conditions of distribution and use, see the accompanying README.ijg * file. * @@ -19,7 +19,7 @@ h2v1_merged_upsample_565_internal(j_decompress_ptr cinfo, JSAMPIMAGE input_buf, JDIMENSION in_row_group_ctr, JSAMPARRAY output_buf) { - my_upsample_ptr upsample = (my_upsample_ptr)cinfo->upsample; + my_merged_upsample_ptr upsample = (my_merged_upsample_ptr)cinfo->upsample; register int y, cred, cgreen, cblue; int cb, cr; register JSAMPROW outptr; @@ -43,20 +43,20 @@ h2v1_merged_upsample_565_internal(j_decompress_ptr cinfo, JSAMPIMAGE input_buf, /* Loop for each pair of output pixels */ for (col = cinfo->output_width >> 1; col > 0; col--) { /* Do the chroma part of the calculation */ - cb = GETJSAMPLE(*inptr1++); - cr = GETJSAMPLE(*inptr2++); + cb = *inptr1++; + cr = *inptr2++; cred = Crrtab[cr]; cgreen = (int)RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS); cblue = Cbbtab[cb]; /* Fetch 2 Y values and emit 2 pixels */ - y = GETJSAMPLE(*inptr0++); + y = *inptr0++; r = range_limit[y + cred]; g = range_limit[y + cgreen]; b = range_limit[y + cblue]; rgb = PACK_SHORT_565(r, g, b); - y = GETJSAMPLE(*inptr0++); + y = *inptr0++; r = range_limit[y + cred]; g = range_limit[y + cgreen]; b = range_limit[y + cblue]; @@ -68,12 +68,12 @@ h2v1_merged_upsample_565_internal(j_decompress_ptr cinfo, JSAMPIMAGE input_buf, /* If image width is odd, do the last output column separately */ if (cinfo->output_width & 1) { - cb = GETJSAMPLE(*inptr1); - cr = GETJSAMPLE(*inptr2); + cb = *inptr1; + cr = *inptr2; cred = Crrtab[cr]; cgreen = (int)RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS); cblue = Cbbtab[cb]; - y = GETJSAMPLE(*inptr0); + y = *inptr0; r = range_limit[y + cred]; g = range_limit[y + cgreen]; b = range_limit[y + cblue]; @@ -90,7 +90,7 @@ h2v1_merged_upsample_565D_internal(j_decompress_ptr cinfo, JDIMENSION in_row_group_ctr, JSAMPARRAY output_buf) { - my_upsample_ptr upsample = (my_upsample_ptr)cinfo->upsample; + my_merged_upsample_ptr upsample = (my_merged_upsample_ptr)cinfo->upsample; register int y, cred, cgreen, cblue; int cb, cr; register JSAMPROW outptr; @@ -115,21 +115,21 @@ h2v1_merged_upsample_565D_internal(j_decompress_ptr cinfo, /* Loop for each pair of output pixels */ for (col = cinfo->output_width >> 1; col > 0; col--) { /* Do the chroma part of the calculation */ - cb = GETJSAMPLE(*inptr1++); - cr = GETJSAMPLE(*inptr2++); + cb = *inptr1++; + cr = *inptr2++; cred = Crrtab[cr]; cgreen = (int)RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS); cblue = Cbbtab[cb]; /* Fetch 2 Y values and emit 2 pixels */ - y = GETJSAMPLE(*inptr0++); + y = *inptr0++; r = range_limit[DITHER_565_R(y + cred, d0)]; g = range_limit[DITHER_565_G(y + cgreen, d0)]; b = range_limit[DITHER_565_B(y + cblue, d0)]; d0 = DITHER_ROTATE(d0); rgb = PACK_SHORT_565(r, g, b); - y = GETJSAMPLE(*inptr0++); + y = *inptr0++; r = range_limit[DITHER_565_R(y + cred, d0)]; g = range_limit[DITHER_565_G(y + cgreen, d0)]; b = range_limit[DITHER_565_B(y + cblue, d0)]; @@ -142,12 +142,12 @@ h2v1_merged_upsample_565D_internal(j_decompress_ptr cinfo, /* If image width is odd, do the last output column separately */ if (cinfo->output_width & 1) { - cb = GETJSAMPLE(*inptr1); - cr = GETJSAMPLE(*inptr2); + cb = *inptr1; + cr = *inptr2; cred = Crrtab[cr]; cgreen = (int)RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS); cblue = Cbbtab[cb]; - y = GETJSAMPLE(*inptr0); + y = *inptr0; r = range_limit[DITHER_565_R(y + cred, d0)]; g = range_limit[DITHER_565_G(y + cgreen, d0)]; b = range_limit[DITHER_565_B(y + cblue, d0)]; @@ -163,7 +163,7 @@ h2v2_merged_upsample_565_internal(j_decompress_ptr cinfo, JSAMPIMAGE input_buf, JDIMENSION in_row_group_ctr, JSAMPARRAY output_buf) { - my_upsample_ptr upsample = (my_upsample_ptr)cinfo->upsample; + my_merged_upsample_ptr upsample = (my_merged_upsample_ptr)cinfo->upsample; register int y, cred, cgreen, cblue; int cb, cr; register JSAMPROW outptr0, outptr1; @@ -189,20 +189,20 @@ h2v2_merged_upsample_565_internal(j_decompress_ptr cinfo, JSAMPIMAGE input_buf, /* Loop for each group of output pixels */ for (col = cinfo->output_width >> 1; col > 0; col--) { /* Do the chroma part of the calculation */ - cb = GETJSAMPLE(*inptr1++); - cr = GETJSAMPLE(*inptr2++); + cb = *inptr1++; + cr = *inptr2++; cred = Crrtab[cr]; cgreen = (int)RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS); cblue = Cbbtab[cb]; /* Fetch 4 Y values and emit 4 pixels */ - y = GETJSAMPLE(*inptr00++); + y = *inptr00++; r = range_limit[y + cred]; g = range_limit[y + cgreen]; b = range_limit[y + cblue]; rgb = PACK_SHORT_565(r, g, b); - y = GETJSAMPLE(*inptr00++); + y = *inptr00++; r = range_limit[y + cred]; g = range_limit[y + cgreen]; b = range_limit[y + cblue]; @@ -211,13 +211,13 @@ h2v2_merged_upsample_565_internal(j_decompress_ptr cinfo, JSAMPIMAGE input_buf, WRITE_TWO_PIXELS(outptr0, rgb); outptr0 += 4; - y = GETJSAMPLE(*inptr01++); + y = *inptr01++; r = range_limit[y + cred]; g = range_limit[y + cgreen]; b = range_limit[y + cblue]; rgb = PACK_SHORT_565(r, g, b); - y = GETJSAMPLE(*inptr01++); + y = *inptr01++; r = range_limit[y + cred]; g = range_limit[y + cgreen]; b = range_limit[y + cblue]; @@ -229,20 +229,20 @@ h2v2_merged_upsample_565_internal(j_decompress_ptr cinfo, JSAMPIMAGE input_buf, /* If image width is odd, do the last output column separately */ if (cinfo->output_width & 1) { - cb = GETJSAMPLE(*inptr1); - cr = GETJSAMPLE(*inptr2); + cb = *inptr1; + cr = *inptr2; cred = Crrtab[cr]; cgreen = (int)RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS); cblue = Cbbtab[cb]; - y = GETJSAMPLE(*inptr00); + y = *inptr00; r = range_limit[y + cred]; g = range_limit[y + cgreen]; b = range_limit[y + cblue]; rgb = PACK_SHORT_565(r, g, b); *(INT16 *)outptr0 = (INT16)rgb; - y = GETJSAMPLE(*inptr01); + y = *inptr01; r = range_limit[y + cred]; g = range_limit[y + cgreen]; b = range_limit[y + cblue]; @@ -259,7 +259,7 @@ h2v2_merged_upsample_565D_internal(j_decompress_ptr cinfo, JDIMENSION in_row_group_ctr, JSAMPARRAY output_buf) { - my_upsample_ptr upsample = (my_upsample_ptr)cinfo->upsample; + my_merged_upsample_ptr upsample = (my_merged_upsample_ptr)cinfo->upsample; register int y, cred, cgreen, cblue; int cb, cr; register JSAMPROW outptr0, outptr1; @@ -287,21 +287,21 @@ h2v2_merged_upsample_565D_internal(j_decompress_ptr cinfo, /* Loop for each group of output pixels */ for (col = cinfo->output_width >> 1; col > 0; col--) { /* Do the chroma part of the calculation */ - cb = GETJSAMPLE(*inptr1++); - cr = GETJSAMPLE(*inptr2++); + cb = *inptr1++; + cr = *inptr2++; cred = Crrtab[cr]; cgreen = (int)RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS); cblue = Cbbtab[cb]; /* Fetch 4 Y values and emit 4 pixels */ - y = GETJSAMPLE(*inptr00++); + y = *inptr00++; r = range_limit[DITHER_565_R(y + cred, d0)]; g = range_limit[DITHER_565_G(y + cgreen, d0)]; b = range_limit[DITHER_565_B(y + cblue, d0)]; d0 = DITHER_ROTATE(d0); rgb = PACK_SHORT_565(r, g, b); - y = GETJSAMPLE(*inptr00++); + y = *inptr00++; r = range_limit[DITHER_565_R(y + cred, d0)]; g = range_limit[DITHER_565_G(y + cgreen, d0)]; b = range_limit[DITHER_565_B(y + cblue, d0)]; @@ -311,14 +311,14 @@ h2v2_merged_upsample_565D_internal(j_decompress_ptr cinfo, WRITE_TWO_PIXELS(outptr0, rgb); outptr0 += 4; - y = GETJSAMPLE(*inptr01++); + y = *inptr01++; r = range_limit[DITHER_565_R(y + cred, d1)]; g = range_limit[DITHER_565_G(y + cgreen, d1)]; b = range_limit[DITHER_565_B(y + cblue, d1)]; d1 = DITHER_ROTATE(d1); rgb = PACK_SHORT_565(r, g, b); - y = GETJSAMPLE(*inptr01++); + y = *inptr01++; r = range_limit[DITHER_565_R(y + cred, d1)]; g = range_limit[DITHER_565_G(y + cgreen, d1)]; b = range_limit[DITHER_565_B(y + cblue, d1)]; @@ -331,20 +331,20 @@ h2v2_merged_upsample_565D_internal(j_decompress_ptr cinfo, /* If image width is odd, do the last output column separately */ if (cinfo->output_width & 1) { - cb = GETJSAMPLE(*inptr1); - cr = GETJSAMPLE(*inptr2); + cb = *inptr1; + cr = *inptr2; cred = Crrtab[cr]; cgreen = (int)RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS); cblue = Cbbtab[cb]; - y = GETJSAMPLE(*inptr00); + y = *inptr00; r = range_limit[DITHER_565_R(y + cred, d0)]; g = range_limit[DITHER_565_G(y + cgreen, d0)]; b = range_limit[DITHER_565_B(y + cblue, d0)]; rgb = PACK_SHORT_565(r, g, b); *(INT16 *)outptr0 = (INT16)rgb; - y = GETJSAMPLE(*inptr01); + y = *inptr01; r = range_limit[DITHER_565_R(y + cred, d1)]; g = range_limit[DITHER_565_G(y + cgreen, d1)]; b = range_limit[DITHER_565_B(y + cblue, d1)]; diff --git a/src/3rdparty/libjpeg/src/jdmrgext.c b/src/3rdparty/libjpeg/src/jdmrgext.c index b1c27df5..9bf4f1a3 100644 --- a/src/3rdparty/libjpeg/src/jdmrgext.c +++ b/src/3rdparty/libjpeg/src/jdmrgext.c @@ -4,7 +4,7 @@ * This file was part of the Independent JPEG Group's software: * Copyright (C) 1994-1996, Thomas G. Lane. * libjpeg-turbo Modifications: - * Copyright (C) 2011, 2015, D. R. Commander. + * Copyright (C) 2011, 2015, 2020, D. R. Commander. * For conditions of distribution and use, see the accompanying README.ijg * file. * @@ -25,7 +25,7 @@ h2v1_merged_upsample_internal(j_decompress_ptr cinfo, JSAMPIMAGE input_buf, JDIMENSION in_row_group_ctr, JSAMPARRAY output_buf) { - my_upsample_ptr upsample = (my_upsample_ptr)cinfo->upsample; + my_merged_upsample_ptr upsample = (my_merged_upsample_ptr)cinfo->upsample; register int y, cred, cgreen, cblue; int cb, cr; register JSAMPROW outptr; @@ -46,13 +46,13 @@ h2v1_merged_upsample_internal(j_decompress_ptr cinfo, JSAMPIMAGE input_buf, /* Loop for each pair of output pixels */ for (col = cinfo->output_width >> 1; col > 0; col--) { /* Do the chroma part of the calculation */ - cb = GETJSAMPLE(*inptr1++); - cr = GETJSAMPLE(*inptr2++); + cb = *inptr1++; + cr = *inptr2++; cred = Crrtab[cr]; cgreen = (int)RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS); cblue = Cbbtab[cb]; /* Fetch 2 Y values and emit 2 pixels */ - y = GETJSAMPLE(*inptr0++); + y = *inptr0++; outptr[RGB_RED] = range_limit[y + cred]; outptr[RGB_GREEN] = range_limit[y + cgreen]; outptr[RGB_BLUE] = range_limit[y + cblue]; @@ -60,7 +60,7 @@ h2v1_merged_upsample_internal(j_decompress_ptr cinfo, JSAMPIMAGE input_buf, outptr[RGB_ALPHA] = 0xFF; #endif outptr += RGB_PIXELSIZE; - y = GETJSAMPLE(*inptr0++); + y = *inptr0++; outptr[RGB_RED] = range_limit[y + cred]; outptr[RGB_GREEN] = range_limit[y + cgreen]; outptr[RGB_BLUE] = range_limit[y + cblue]; @@ -71,12 +71,12 @@ h2v1_merged_upsample_internal(j_decompress_ptr cinfo, JSAMPIMAGE input_buf, } /* If image width is odd, do the last output column separately */ if (cinfo->output_width & 1) { - cb = GETJSAMPLE(*inptr1); - cr = GETJSAMPLE(*inptr2); + cb = *inptr1; + cr = *inptr2; cred = Crrtab[cr]; cgreen = (int)RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS); cblue = Cbbtab[cb]; - y = GETJSAMPLE(*inptr0); + y = *inptr0; outptr[RGB_RED] = range_limit[y + cred]; outptr[RGB_GREEN] = range_limit[y + cgreen]; outptr[RGB_BLUE] = range_limit[y + cblue]; @@ -97,7 +97,7 @@ h2v2_merged_upsample_internal(j_decompress_ptr cinfo, JSAMPIMAGE input_buf, JDIMENSION in_row_group_ctr, JSAMPARRAY output_buf) { - my_upsample_ptr upsample = (my_upsample_ptr)cinfo->upsample; + my_merged_upsample_ptr upsample = (my_merged_upsample_ptr)cinfo->upsample; register int y, cred, cgreen, cblue; int cb, cr; register JSAMPROW outptr0, outptr1; @@ -120,13 +120,13 @@ h2v2_merged_upsample_internal(j_decompress_ptr cinfo, JSAMPIMAGE input_buf, /* Loop for each group of output pixels */ for (col = cinfo->output_width >> 1; col > 0; col--) { /* Do the chroma part of the calculation */ - cb = GETJSAMPLE(*inptr1++); - cr = GETJSAMPLE(*inptr2++); + cb = *inptr1++; + cr = *inptr2++; cred = Crrtab[cr]; cgreen = (int)RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS); cblue = Cbbtab[cb]; /* Fetch 4 Y values and emit 4 pixels */ - y = GETJSAMPLE(*inptr00++); + y = *inptr00++; outptr0[RGB_RED] = range_limit[y + cred]; outptr0[RGB_GREEN] = range_limit[y + cgreen]; outptr0[RGB_BLUE] = range_limit[y + cblue]; @@ -134,7 +134,7 @@ h2v2_merged_upsample_internal(j_decompress_ptr cinfo, JSAMPIMAGE input_buf, outptr0[RGB_ALPHA] = 0xFF; #endif outptr0 += RGB_PIXELSIZE; - y = GETJSAMPLE(*inptr00++); + y = *inptr00++; outptr0[RGB_RED] = range_limit[y + cred]; outptr0[RGB_GREEN] = range_limit[y + cgreen]; outptr0[RGB_BLUE] = range_limit[y + cblue]; @@ -142,7 +142,7 @@ h2v2_merged_upsample_internal(j_decompress_ptr cinfo, JSAMPIMAGE input_buf, outptr0[RGB_ALPHA] = 0xFF; #endif outptr0 += RGB_PIXELSIZE; - y = GETJSAMPLE(*inptr01++); + y = *inptr01++; outptr1[RGB_RED] = range_limit[y + cred]; outptr1[RGB_GREEN] = range_limit[y + cgreen]; outptr1[RGB_BLUE] = range_limit[y + cblue]; @@ -150,7 +150,7 @@ h2v2_merged_upsample_internal(j_decompress_ptr cinfo, JSAMPIMAGE input_buf, outptr1[RGB_ALPHA] = 0xFF; #endif outptr1 += RGB_PIXELSIZE; - y = GETJSAMPLE(*inptr01++); + y = *inptr01++; outptr1[RGB_RED] = range_limit[y + cred]; outptr1[RGB_GREEN] = range_limit[y + cgreen]; outptr1[RGB_BLUE] = range_limit[y + cblue]; @@ -161,19 +161,19 @@ h2v2_merged_upsample_internal(j_decompress_ptr cinfo, JSAMPIMAGE input_buf, } /* If image width is odd, do the last output column separately */ if (cinfo->output_width & 1) { - cb = GETJSAMPLE(*inptr1); - cr = GETJSAMPLE(*inptr2); + cb = *inptr1; + cr = *inptr2; cred = Crrtab[cr]; cgreen = (int)RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS); cblue = Cbbtab[cb]; - y = GETJSAMPLE(*inptr00); + y = *inptr00; outptr0[RGB_RED] = range_limit[y + cred]; outptr0[RGB_GREEN] = range_limit[y + cgreen]; outptr0[RGB_BLUE] = range_limit[y + cblue]; #ifdef RGB_ALPHA outptr0[RGB_ALPHA] = 0xFF; #endif - y = GETJSAMPLE(*inptr01); + y = *inptr01; outptr1[RGB_RED] = range_limit[y + cred]; outptr1[RGB_GREEN] = range_limit[y + cgreen]; outptr1[RGB_BLUE] = range_limit[y + cblue]; diff --git a/src/3rdparty/libjpeg/src/jdphuff.c b/src/3rdparty/libjpeg/src/jdphuff.c index 9e82636b..c6d82ca1 100644 --- a/src/3rdparty/libjpeg/src/jdphuff.c +++ b/src/3rdparty/libjpeg/src/jdphuff.c @@ -4,7 +4,7 @@ * This file was part of the Independent JPEG Group's software: * Copyright (C) 1995-1997, Thomas G. Lane. * libjpeg-turbo Modifications: - * Copyright (C) 2015-2016, 2018, D. R. Commander. + * Copyright (C) 2015-2016, 2018-2021, D. R. Commander. * For conditions of distribution and use, see the accompanying README.ijg * file. * @@ -41,25 +41,6 @@ typedef struct { int last_dc_val[MAX_COMPS_IN_SCAN]; /* last DC coef for each component */ } savable_state; -/* This macro is to work around compilers with missing or broken - * structure assignment. You'll need to fix this code if you have - * such a compiler and you change MAX_COMPS_IN_SCAN. - */ - -#ifndef NO_STRUCT_ASSIGN -#define ASSIGN_STATE(dest, src) ((dest) = (src)) -#else -#if MAX_COMPS_IN_SCAN == 4 -#define ASSIGN_STATE(dest, src) \ - ((dest).EOBRUN = (src).EOBRUN, \ - (dest).last_dc_val[0] = (src).last_dc_val[0], \ - (dest).last_dc_val[1] = (src).last_dc_val[1], \ - (dest).last_dc_val[2] = (src).last_dc_val[2], \ - (dest).last_dc_val[3] = (src).last_dc_val[3]) -#endif -#endif - - typedef struct { struct jpeg_entropy_decoder pub; /* public fields */ @@ -102,7 +83,7 @@ start_pass_phuff_decoder(j_decompress_ptr cinfo) boolean is_DC_band, bad; int ci, coefi, tbl; d_derived_tbl **pdtbl; - int *coef_bit_ptr; + int *coef_bit_ptr, *prev_coef_bit_ptr; jpeg_component_info *compptr; is_DC_band = (cinfo->Ss == 0); @@ -143,8 +124,15 @@ start_pass_phuff_decoder(j_decompress_ptr cinfo) for (ci = 0; ci < cinfo->comps_in_scan; ci++) { int cindex = cinfo->cur_comp_info[ci]->component_index; coef_bit_ptr = &cinfo->coef_bits[cindex][0]; + prev_coef_bit_ptr = &cinfo->coef_bits[cindex + cinfo->num_components][0]; if (!is_DC_band && coef_bit_ptr[0] < 0) /* AC without prior DC scan */ WARNMS2(cinfo, JWRN_BOGUS_PROGRESSION, cindex, 0); + for (coefi = MIN(cinfo->Ss, 1); coefi <= MAX(cinfo->Se, 9); coefi++) { + if (cinfo->input_scan_number > 1) + prev_coef_bit_ptr[coefi] = coef_bit_ptr[coefi]; + else + prev_coef_bit_ptr[coefi] = 0; + } for (coefi = cinfo->Ss; coefi <= cinfo->Se; coefi++) { int expected = (coef_bit_ptr[coefi] < 0) ? 0 : coef_bit_ptr[coefi]; if (cinfo->Ah != expected) @@ -323,7 +311,7 @@ decode_mcu_DC_first(j_decompress_ptr cinfo, JBLOCKROW *MCU_data) /* Load up working state */ BITREAD_LOAD_STATE(cinfo, entropy->bitstate); - ASSIGN_STATE(state, entropy->saved); + state = entropy->saved; /* Outer loop handles each block in the MCU */ @@ -356,11 +344,12 @@ decode_mcu_DC_first(j_decompress_ptr cinfo, JBLOCKROW *MCU_data) /* Completed MCU, so update state */ BITREAD_SAVE_STATE(cinfo, entropy->bitstate); - ASSIGN_STATE(entropy->saved, state); + entropy->saved = state; } /* Account for restart interval (no-op if not using restarts) */ - entropy->restarts_to_go--; + if (cinfo->restart_interval) + entropy->restarts_to_go--; return TRUE; } @@ -444,7 +433,8 @@ decode_mcu_AC_first(j_decompress_ptr cinfo, JBLOCKROW *MCU_data) } /* Account for restart interval (no-op if not using restarts) */ - entropy->restarts_to_go--; + if (cinfo->restart_interval) + entropy->restarts_to_go--; return TRUE; } @@ -495,7 +485,8 @@ decode_mcu_DC_refine(j_decompress_ptr cinfo, JBLOCKROW *MCU_data) BITREAD_SAVE_STATE(cinfo, entropy->bitstate); /* Account for restart interval (no-op if not using restarts) */ - entropy->restarts_to_go--; + if (cinfo->restart_interval) + entropy->restarts_to_go--; return TRUE; } @@ -638,7 +629,8 @@ decode_mcu_AC_refine(j_decompress_ptr cinfo, JBLOCKROW *MCU_data) } /* Account for restart interval (no-op if not using restarts) */ - entropy->restarts_to_go--; + if (cinfo->restart_interval) + entropy->restarts_to_go--; return TRUE; @@ -676,7 +668,7 @@ jinit_phuff_decoder(j_decompress_ptr cinfo) /* Create progression status table */ cinfo->coef_bits = (int (*)[DCTSIZE2]) (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE, - cinfo->num_components * DCTSIZE2 * + cinfo->num_components * 2 * DCTSIZE2 * sizeof(int)); coef_bit_ptr = &cinfo->coef_bits[0][0]; for (ci = 0; ci < cinfo->num_components; ci++) diff --git a/src/3rdparty/libjpeg/src/jdsample.c b/src/3rdparty/libjpeg/src/jdsample.c index 50a68b30..eaad72a0 100644 --- a/src/3rdparty/libjpeg/src/jdsample.c +++ b/src/3rdparty/libjpeg/src/jdsample.c @@ -8,7 +8,7 @@ * Copyright (C) 2010, 2015-2016, D. R. Commander. * Copyright (C) 2014, MIPS Technologies, Inc., California. * Copyright (C) 2015, Google, Inc. - * Copyright (C) 2019, Arm Limited. + * Copyright (C) 2019-2020, Arm Limited. * For conditions of distribution and use, see the accompanying README.ijg * file. * @@ -177,7 +177,7 @@ int_upsample(j_decompress_ptr cinfo, jpeg_component_info *compptr, outptr = output_data[outrow]; outend = outptr + cinfo->output_width; while (outptr < outend) { - invalue = *inptr++; /* don't need GETJSAMPLE() here */ + invalue = *inptr++; for (h = h_expand; h > 0; h--) { *outptr++ = invalue; } @@ -213,7 +213,7 @@ h2v1_upsample(j_decompress_ptr cinfo, jpeg_component_info *compptr, outptr = output_data[inrow]; outend = outptr + cinfo->output_width; while (outptr < outend) { - invalue = *inptr++; /* don't need GETJSAMPLE() here */ + invalue = *inptr++; *outptr++ = invalue; *outptr++ = invalue; } @@ -242,7 +242,7 @@ h2v2_upsample(j_decompress_ptr cinfo, jpeg_component_info *compptr, outptr = output_data[outrow]; outend = outptr + cinfo->output_width; while (outptr < outend) { - invalue = *inptr++; /* don't need GETJSAMPLE() here */ + invalue = *inptr++; *outptr++ = invalue; *outptr++ = invalue; } @@ -283,20 +283,20 @@ h2v1_fancy_upsample(j_decompress_ptr cinfo, jpeg_component_info *compptr, inptr = input_data[inrow]; outptr = output_data[inrow]; /* Special case for first column */ - invalue = GETJSAMPLE(*inptr++); + invalue = *inptr++; *outptr++ = (JSAMPLE)invalue; - *outptr++ = (JSAMPLE)((invalue * 3 + GETJSAMPLE(*inptr) + 2) >> 2); + *outptr++ = (JSAMPLE)((invalue * 3 + inptr[0] + 2) >> 2); for (colctr = compptr->downsampled_width - 2; colctr > 0; colctr--) { /* General case: 3/4 * nearer pixel + 1/4 * further pixel */ - invalue = GETJSAMPLE(*inptr++) * 3; - *outptr++ = (JSAMPLE)((invalue + GETJSAMPLE(inptr[-2]) + 1) >> 2); - *outptr++ = (JSAMPLE)((invalue + GETJSAMPLE(*inptr) + 2) >> 2); + invalue = (*inptr++) * 3; + *outptr++ = (JSAMPLE)((invalue + inptr[-2] + 1) >> 2); + *outptr++ = (JSAMPLE)((invalue + inptr[0] + 2) >> 2); } /* Special case for last column */ - invalue = GETJSAMPLE(*inptr); - *outptr++ = (JSAMPLE)((invalue * 3 + GETJSAMPLE(inptr[-1]) + 1) >> 2); + invalue = *inptr; + *outptr++ = (JSAMPLE)((invalue * 3 + inptr[-1] + 1) >> 2); *outptr++ = (JSAMPLE)invalue; } } @@ -338,7 +338,7 @@ h1v2_fancy_upsample(j_decompress_ptr cinfo, jpeg_component_info *compptr, outptr = output_data[outrow++]; for (colctr = 0; colctr < compptr->downsampled_width; colctr++) { - thiscolsum = GETJSAMPLE(*inptr0++) * 3 + GETJSAMPLE(*inptr1++); + thiscolsum = (*inptr0++) * 3 + (*inptr1++); *outptr++ = (JSAMPLE)((thiscolsum + bias) >> 2); } } @@ -381,8 +381,8 @@ h2v2_fancy_upsample(j_decompress_ptr cinfo, jpeg_component_info *compptr, outptr = output_data[outrow++]; /* Special case for first column */ - thiscolsum = GETJSAMPLE(*inptr0++) * 3 + GETJSAMPLE(*inptr1++); - nextcolsum = GETJSAMPLE(*inptr0++) * 3 + GETJSAMPLE(*inptr1++); + thiscolsum = (*inptr0++) * 3 + (*inptr1++); + nextcolsum = (*inptr0++) * 3 + (*inptr1++); *outptr++ = (JSAMPLE)((thiscolsum * 4 + 8) >> 4); *outptr++ = (JSAMPLE)((thiscolsum * 3 + nextcolsum + 7) >> 4); lastcolsum = thiscolsum; thiscolsum = nextcolsum; @@ -390,7 +390,7 @@ h2v2_fancy_upsample(j_decompress_ptr cinfo, jpeg_component_info *compptr, for (colctr = compptr->downsampled_width - 2; colctr > 0; colctr--) { /* General case: 3/4 * nearer pixel + 1/4 * further pixel in each */ /* dimension, thus 9/16, 3/16, 3/16, 1/16 overall */ - nextcolsum = GETJSAMPLE(*inptr0++) * 3 + GETJSAMPLE(*inptr1++); + nextcolsum = (*inptr0++) * 3 + (*inptr1++); *outptr++ = (JSAMPLE)((thiscolsum * 3 + lastcolsum + 8) >> 4); *outptr++ = (JSAMPLE)((thiscolsum * 3 + nextcolsum + 7) >> 4); lastcolsum = thiscolsum; thiscolsum = nextcolsum; @@ -477,7 +477,13 @@ jinit_upsampler(j_decompress_ptr cinfo) } else if (h_in_group == h_out_group && v_in_group * 2 == v_out_group && do_fancy) { /* Non-fancy upsampling is handled by the generic method */ - upsample->methods[ci] = h1v2_fancy_upsample; +#if defined(__arm__) || defined(__aarch64__) || \ + defined(_M_ARM) || defined(_M_ARM64) + if (jsimd_can_h1v2_fancy_upsample()) + upsample->methods[ci] = jsimd_h1v2_fancy_upsample; + else +#endif + upsample->methods[ci] = h1v2_fancy_upsample; upsample->pub.need_context_rows = TRUE; } else if (h_in_group * 2 == h_out_group && v_in_group * 2 == v_out_group) { diff --git a/src/3rdparty/libjpeg/src/jdtrans.c b/src/3rdparty/libjpeg/src/jdtrans.c index 56713efe..d7ec4b83 100644 --- a/src/3rdparty/libjpeg/src/jdtrans.c +++ b/src/3rdparty/libjpeg/src/jdtrans.c @@ -3,8 +3,8 @@ * * This file was part of the Independent JPEG Group's software: * Copyright (C) 1995-1997, Thomas G. Lane. - * It was modified by The libjpeg-turbo Project to include only code relevant - * to libjpeg-turbo. + * libjpeg-turbo Modifications: + * Copyright (C) 2020, D. R. Commander. * For conditions of distribution and use, see the accompanying README.ijg * file. * @@ -16,6 +16,7 @@ #define JPEG_INTERNALS #include "jinclude.h" #include "jpeglib.h" +#include "jpegcomp.h" /* Forward declarations */ diff --git a/src/3rdparty/libjpeg/src/jerror.h b/src/3rdparty/libjpeg/src/jerror.h index 933a3690..4476df2c 100644 --- a/src/3rdparty/libjpeg/src/jerror.h +++ b/src/3rdparty/libjpeg/src/jerror.h @@ -207,6 +207,10 @@ JMESSAGE(JWRN_ARITH_BAD_CODE, "Corrupt JPEG data: bad arithmetic code") #endif #endif JMESSAGE(JWRN_BOGUS_ICC, "Corrupt JPEG data: bad ICC marker") +#if JPEG_LIB_VERSION < 70 +JMESSAGE(JERR_BAD_DROP_SAMPLING, + "Component index %d: mismatching sampling ratio %d:%d, %d:%d, %c") +#endif #ifdef JMAKE_ENUM_LIST @@ -252,6 +256,15 @@ JMESSAGE(JWRN_BOGUS_ICC, "Corrupt JPEG data: bad ICC marker") (cinfo)->err->msg_parm.i[2] = (p3), \ (cinfo)->err->msg_parm.i[3] = (p4), \ (*(cinfo)->err->error_exit) ((j_common_ptr)(cinfo))) +#define ERREXIT6(cinfo, code, p1, p2, p3, p4, p5, p6) \ + ((cinfo)->err->msg_code = (code), \ + (cinfo)->err->msg_parm.i[0] = (p1), \ + (cinfo)->err->msg_parm.i[1] = (p2), \ + (cinfo)->err->msg_parm.i[2] = (p3), \ + (cinfo)->err->msg_parm.i[3] = (p4), \ + (cinfo)->err->msg_parm.i[4] = (p5), \ + (cinfo)->err->msg_parm.i[5] = (p6), \ + (*(cinfo)->err->error_exit) ((j_common_ptr)(cinfo))) #define ERREXITS(cinfo, code, str) \ ((cinfo)->err->msg_code = (code), \ strncpy((cinfo)->err->msg_parm.s, (str), JMSG_STR_PARM_MAX), \ diff --git a/src/3rdparty/libjpeg/src/jfdctint.c b/src/3rdparty/libjpeg/src/jfdctint.c index b47c3061..c95a3a7f 100644 --- a/src/3rdparty/libjpeg/src/jfdctint.c +++ b/src/3rdparty/libjpeg/src/jfdctint.c @@ -4,11 +4,11 @@ * This file was part of the Independent JPEG Group's software: * Copyright (C) 1991-1996, Thomas G. Lane. * libjpeg-turbo Modifications: - * Copyright (C) 2015, D. R. Commander. + * Copyright (C) 2015, 2020, D. R. Commander. * For conditions of distribution and use, see the accompanying README.ijg * file. * - * This file contains a slow-but-accurate integer implementation of the + * This file contains a slower but more accurate integer implementation of the * forward DCT (Discrete Cosine Transform). * * A 2-D DCT can be done by 1-D DCT on each row followed by 1-D DCT diff --git a/src/3rdparty/libjpeg/src/jidctint.c b/src/3rdparty/libjpeg/src/jidctint.c index 98425d5f..bb087480 100644 --- a/src/3rdparty/libjpeg/src/jidctint.c +++ b/src/3rdparty/libjpeg/src/jidctint.c @@ -3,13 +3,13 @@ * * This file was part of the Independent JPEG Group's software: * Copyright (C) 1991-1998, Thomas G. Lane. - * Modification developed 2002-2009 by Guido Vollbeding. + * Modification developed 2002-2018 by Guido Vollbeding. * libjpeg-turbo Modifications: - * Copyright (C) 2015, D. R. Commander. + * Copyright (C) 2015, 2020, D. R. Commander. * For conditions of distribution and use, see the accompanying README.ijg * file. * - * This file contains a slow-but-accurate integer implementation of the + * This file contains a slower but more accurate integer implementation of the * inverse DCT (Discrete Cosine Transform). In the IJG code, this routine * must also perform dequantization of the input coefficients. * @@ -417,7 +417,7 @@ jpeg_idct_islow(j_decompress_ptr cinfo, jpeg_component_info *compptr, /* * Perform dequantization and inverse DCT on one block of coefficients, - * producing a 7x7 output block. + * producing a reduced-size 7x7 output block. * * Optimized algorithm with 12 multiplications in the 1-D kernel. * cK represents sqrt(2) * cos(K*pi/14). @@ -1258,7 +1258,7 @@ jpeg_idct_10x10(j_decompress_ptr cinfo, jpeg_component_info *compptr, /* * Perform dequantization and inverse DCT on one block of coefficients, - * producing a 11x11 output block. + * producing an 11x11 output block. * * Optimized algorithm with 24 multiplications in the 1-D kernel. * cK represents sqrt(2) * cos(K*pi/22). @@ -2398,7 +2398,7 @@ jpeg_idct_16x16(j_decompress_ptr cinfo, jpeg_component_info *compptr, tmp0 = DEQUANTIZE(inptr[DCTSIZE * 0], quantptr[DCTSIZE * 0]); tmp0 = LEFT_SHIFT(tmp0, CONST_BITS); /* Add fudge factor here for final descale. */ - tmp0 += 1 << (CONST_BITS - PASS1_BITS - 1); + tmp0 += ONE << (CONST_BITS - PASS1_BITS - 1); z1 = DEQUANTIZE(inptr[DCTSIZE * 4], quantptr[DCTSIZE * 4]); tmp1 = MULTIPLY(z1, FIX(1.306562965)); /* c4[16] = c2[8] */ diff --git a/src/3rdparty/libjpeg/src/jmemmgr.c b/src/3rdparty/libjpeg/src/jmemmgr.c index 508ca742..70b8ec0c 100644 --- a/src/3rdparty/libjpeg/src/jmemmgr.c +++ b/src/3rdparty/libjpeg/src/jmemmgr.c @@ -4,7 +4,7 @@ * This file was part of the Independent JPEG Group's software: * Copyright (C) 1991-1997, Thomas G. Lane. * libjpeg-turbo Modifications: - * Copyright (C) 2016, D. R. Commander. + * Copyright (C) 2016, 2021, D. R. Commander. * For conditions of distribution and use, see the accompanying README.ijg * file. * @@ -1032,7 +1032,7 @@ free_pool(j_common_ptr cinfo, int pool_id) large_pool_ptr next_lhdr_ptr = lhdr_ptr->next; space_freed = lhdr_ptr->bytes_used + lhdr_ptr->bytes_left + - sizeof(large_pool_hdr); + sizeof(large_pool_hdr) + ALIGN_SIZE - 1; jpeg_free_large(cinfo, (void *)lhdr_ptr, space_freed); mem->total_space_allocated -= space_freed; lhdr_ptr = next_lhdr_ptr; @@ -1045,7 +1045,7 @@ free_pool(j_common_ptr cinfo, int pool_id) while (shdr_ptr != NULL) { small_pool_ptr next_shdr_ptr = shdr_ptr->next; space_freed = shdr_ptr->bytes_used + shdr_ptr->bytes_left + - sizeof(small_pool_hdr); + sizeof(small_pool_hdr) + ALIGN_SIZE - 1; jpeg_free_small(cinfo, (void *)shdr_ptr, space_freed); mem->total_space_allocated -= space_freed; shdr_ptr = next_shdr_ptr; diff --git a/src/3rdparty/libjpeg/src/jmorecfg.h b/src/3rdparty/libjpeg/src/jmorecfg.h index d0b93007..fb3a9cf4 100644 --- a/src/3rdparty/libjpeg/src/jmorecfg.h +++ b/src/3rdparty/libjpeg/src/jmorecfg.h @@ -5,7 +5,7 @@ * Copyright (C) 1991-1997, Thomas G. Lane. * Modified 1997-2009 by Guido Vollbeding. * libjpeg-turbo Modifications: - * Copyright (C) 2009, 2011, 2014-2015, 2018, D. R. Commander. + * Copyright (C) 2009, 2011, 2014-2015, 2018, 2020, D. R. Commander. * For conditions of distribution and use, see the accompanying README.ijg * file. * @@ -43,25 +43,11 @@ #if BITS_IN_JSAMPLE == 8 /* JSAMPLE should be the smallest type that will hold the values 0..255. - * You can use a signed char by having GETJSAMPLE mask it with 0xFF. */ -#ifdef HAVE_UNSIGNED_CHAR - typedef unsigned char JSAMPLE; #define GETJSAMPLE(value) ((int)(value)) -#else /* not HAVE_UNSIGNED_CHAR */ - -typedef char JSAMPLE; -#ifdef __CHAR_UNSIGNED__ -#define GETJSAMPLE(value) ((int)(value)) -#else -#define GETJSAMPLE(value) ((int)(value) & 0xFF) -#endif /* __CHAR_UNSIGNED__ */ - -#endif /* HAVE_UNSIGNED_CHAR */ - #define MAXJSAMPLE 255 #define CENTERJSAMPLE 128 @@ -97,22 +83,9 @@ typedef short JCOEF; * managers, this is also the data type passed to fread/fwrite. */ -#ifdef HAVE_UNSIGNED_CHAR - typedef unsigned char JOCTET; #define GETJOCTET(value) (value) -#else /* not HAVE_UNSIGNED_CHAR */ - -typedef char JOCTET; -#ifdef __CHAR_UNSIGNED__ -#define GETJOCTET(value) (value) -#else -#define GETJOCTET(value) ((value) & 0xFF) -#endif /* __CHAR_UNSIGNED__ */ - -#endif /* HAVE_UNSIGNED_CHAR */ - /* These typedefs are used for various table entries and so forth. * They must be at least as wide as specified; but making them too big @@ -123,15 +96,7 @@ typedef char JOCTET; /* UINT8 must hold at least the values 0..255. */ -#ifdef HAVE_UNSIGNED_CHAR typedef unsigned char UINT8; -#else /* not HAVE_UNSIGNED_CHAR */ -#ifdef __CHAR_UNSIGNED__ -typedef char UINT8; -#else /* not __CHAR_UNSIGNED__ */ -typedef short UINT8; -#endif /* __CHAR_UNSIGNED__ */ -#endif /* HAVE_UNSIGNED_CHAR */ /* UINT16 must hold at least the values 0..65535. */ @@ -273,9 +238,9 @@ typedef int boolean; /* Capability options common to encoder and decoder: */ -#define DCT_ISLOW_SUPPORTED /* slow but accurate integer algorithm */ -#define DCT_IFAST_SUPPORTED /* faster, less accurate integer method */ -#define DCT_FLOAT_SUPPORTED /* floating-point: accurate, fast on fast HW */ +#define DCT_ISLOW_SUPPORTED /* accurate integer method */ +#define DCT_IFAST_SUPPORTED /* less accurate int method [legacy feature] */ +#define DCT_FLOAT_SUPPORTED /* floating-point method [legacy feature] */ /* Encoder capability options: */ diff --git a/src/3rdparty/libjpeg/src/jpegcomp.h b/src/3rdparty/libjpeg/src/jpegcomp.h index b32d544b..c4834ac0 100644 --- a/src/3rdparty/libjpeg/src/jpegcomp.h +++ b/src/3rdparty/libjpeg/src/jpegcomp.h @@ -1,7 +1,7 @@ /* * jpegcomp.h * - * Copyright (C) 2010, D. R. Commander. + * Copyright (C) 2010, 2020, D. R. Commander. * For conditions of distribution and use, see the accompanying README.ijg * file. * @@ -19,6 +19,7 @@ #define _min_DCT_v_scaled_size min_DCT_v_scaled_size #define _jpeg_width jpeg_width #define _jpeg_height jpeg_height +#define JERR_ARITH_NOTIMPL JERR_NOT_COMPILED #else #define _DCT_scaled_size DCT_scaled_size #define _DCT_h_scaled_size DCT_scaled_size diff --git a/src/3rdparty/libjpeg/src/jpegint.h b/src/3rdparty/libjpeg/src/jpegint.h index ad36ca8b..8c853479 100644 --- a/src/3rdparty/libjpeg/src/jpegint.h +++ b/src/3rdparty/libjpeg/src/jpegint.h @@ -5,8 +5,9 @@ * Copyright (C) 1991-1997, Thomas G. Lane. * Modified 1997-2009 by Guido Vollbeding. * libjpeg-turbo Modifications: - * Copyright (C) 2015-2016, D. R. Commander. + * Copyright (C) 2015-2016, 2019, 2021, D. R. Commander. * Copyright (C) 2015, Google, Inc. + * Copyright (C) 2021, Alex Richardson. * For conditions of distribution and use, see the accompanying README.ijg * file. * @@ -47,6 +48,18 @@ typedef enum { /* Operating modes for buffer controllers */ /* JLONG must hold at least signed 32-bit values. */ typedef long JLONG; +/* JUINTPTR must hold pointer values. */ +#ifdef __UINTPTR_TYPE__ +/* + * __UINTPTR_TYPE__ is GNU-specific and available in GCC 4.6+ and Clang 3.0+. + * Fortunately, that is sufficient to support the few architectures for which + * sizeof(void *) != sizeof(size_t). The only other options would require C99 + * or Clang-specific builtins. + */ +typedef __UINTPTR_TYPE__ JUINTPTR; +#else +typedef size_t JUINTPTR; +#endif /* * Left shift macro that handles a negative operand without causing any @@ -158,6 +171,9 @@ struct jpeg_decomp_master { JDIMENSION first_MCU_col[MAX_COMPONENTS]; JDIMENSION last_MCU_col[MAX_COMPONENTS]; boolean jinit_upsampler_no_alloc; + + /* Last iMCU row that was successfully decoded */ + JDIMENSION last_good_iMCU_row; }; /* Input control module */ diff --git a/src/3rdparty/libjpeg/src/jpeglib.h b/src/3rdparty/libjpeg/src/jpeglib.h index 33f8ad27..d7664f06 100644 --- a/src/3rdparty/libjpeg/src/jpeglib.h +++ b/src/3rdparty/libjpeg/src/jpeglib.h @@ -5,7 +5,7 @@ * Copyright (C) 1991-1998, Thomas G. Lane. * Modified 2002-2009 by Guido Vollbeding. * libjpeg-turbo Modifications: - * Copyright (C) 2009-2011, 2013-2014, 2016-2017, D. R. Commander. + * Copyright (C) 2009-2011, 2013-2014, 2016-2017, 2020, D. R. Commander. * Copyright (C) 2015, Google, Inc. * For conditions of distribution and use, see the accompanying README.ijg * file. @@ -244,9 +244,9 @@ typedef enum { /* DCT/IDCT algorithm options. */ typedef enum { - JDCT_ISLOW, /* slow but accurate integer algorithm */ - JDCT_IFAST, /* faster, less accurate integer method */ - JDCT_FLOAT /* floating-point: accurate, fast on fast HW */ + JDCT_ISLOW, /* accurate integer method */ + JDCT_IFAST, /* less accurate integer method [legacy feature] */ + JDCT_FLOAT /* floating-point method [legacy feature] */ } J_DCT_METHOD; #ifndef JDCT_DEFAULT /* may be overridden in jconfig.h */ diff --git a/src/3rdparty/libjpeg/src/jquant1.c b/src/3rdparty/libjpeg/src/jquant1.c index 40bbb28c..73b83e16 100644 --- a/src/3rdparty/libjpeg/src/jquant1.c +++ b/src/3rdparty/libjpeg/src/jquant1.c @@ -479,7 +479,7 @@ color_quantize(j_decompress_ptr cinfo, JSAMPARRAY input_buf, for (col = width; col > 0; col--) { pixcode = 0; for (ci = 0; ci < nc; ci++) { - pixcode += GETJSAMPLE(colorindex[ci][GETJSAMPLE(*ptrin++)]); + pixcode += colorindex[ci][*ptrin++]; } *ptrout++ = (JSAMPLE)pixcode; } @@ -506,9 +506,9 @@ color_quantize3(j_decompress_ptr cinfo, JSAMPARRAY input_buf, ptrin = input_buf[row]; ptrout = output_buf[row]; for (col = width; col > 0; col--) { - pixcode = GETJSAMPLE(colorindex0[GETJSAMPLE(*ptrin++)]); - pixcode += GETJSAMPLE(colorindex1[GETJSAMPLE(*ptrin++)]); - pixcode += GETJSAMPLE(colorindex2[GETJSAMPLE(*ptrin++)]); + pixcode = colorindex0[*ptrin++]; + pixcode += colorindex1[*ptrin++]; + pixcode += colorindex2[*ptrin++]; *ptrout++ = (JSAMPLE)pixcode; } } @@ -552,7 +552,7 @@ quantize_ord_dither(j_decompress_ptr cinfo, JSAMPARRAY input_buf, * required amount of padding. */ *output_ptr += - colorindex_ci[GETJSAMPLE(*input_ptr) + dither[col_index]]; + colorindex_ci[*input_ptr + dither[col_index]]; input_ptr += nc; output_ptr++; col_index = (col_index + 1) & ODITHER_MASK; @@ -595,12 +595,9 @@ quantize3_ord_dither(j_decompress_ptr cinfo, JSAMPARRAY input_buf, col_index = 0; for (col = width; col > 0; col--) { - pixcode = - GETJSAMPLE(colorindex0[GETJSAMPLE(*input_ptr++) + dither0[col_index]]); - pixcode += - GETJSAMPLE(colorindex1[GETJSAMPLE(*input_ptr++) + dither1[col_index]]); - pixcode += - GETJSAMPLE(colorindex2[GETJSAMPLE(*input_ptr++) + dither2[col_index]]); + pixcode = colorindex0[(*input_ptr++) + dither0[col_index]]; + pixcode += colorindex1[(*input_ptr++) + dither1[col_index]]; + pixcode += colorindex2[(*input_ptr++) + dither2[col_index]]; *output_ptr++ = (JSAMPLE)pixcode; col_index = (col_index + 1) & ODITHER_MASK; } @@ -677,15 +674,15 @@ quantize_fs_dither(j_decompress_ptr cinfo, JSAMPARRAY input_buf, * The maximum error is +- MAXJSAMPLE; this sets the required size * of the range_limit array. */ - cur += GETJSAMPLE(*input_ptr); - cur = GETJSAMPLE(range_limit[cur]); + cur += *input_ptr; + cur = range_limit[cur]; /* Select output value, accumulate into output code for this pixel */ - pixcode = GETJSAMPLE(colorindex_ci[cur]); + pixcode = colorindex_ci[cur]; *output_ptr += (JSAMPLE)pixcode; /* Compute actual representation error at this pixel */ /* Note: we can do this even though we don't have the final */ /* pixel code, because the colormap is orthogonal. */ - cur -= GETJSAMPLE(colormap_ci[pixcode]); + cur -= colormap_ci[pixcode]; /* Compute error fractions to be propagated to adjacent pixels. * Add these into the running sums, and simultaneously shift the * next-line error sums left by 1 column. diff --git a/src/3rdparty/libjpeg/src/jquant2.c b/src/3rdparty/libjpeg/src/jquant2.c index 0ce0ca54..44efb18c 100644 --- a/src/3rdparty/libjpeg/src/jquant2.c +++ b/src/3rdparty/libjpeg/src/jquant2.c @@ -4,7 +4,7 @@ * This file was part of the Independent JPEG Group's software: * Copyright (C) 1991-1996, Thomas G. Lane. * libjpeg-turbo Modifications: - * Copyright (C) 2009, 2014-2015, D. R. Commander. + * Copyright (C) 2009, 2014-2015, 2020, D. R. Commander. * For conditions of distribution and use, see the accompanying README.ijg * file. * @@ -215,9 +215,9 @@ prescan_quantize(j_decompress_ptr cinfo, JSAMPARRAY input_buf, ptr = input_buf[row]; for (col = width; col > 0; col--) { /* get pixel value and index into the histogram */ - histp = &histogram[GETJSAMPLE(ptr[0]) >> C0_SHIFT] - [GETJSAMPLE(ptr[1]) >> C1_SHIFT] - [GETJSAMPLE(ptr[2]) >> C2_SHIFT]; + histp = &histogram[ptr[0] >> C0_SHIFT] + [ptr[1] >> C1_SHIFT] + [ptr[2] >> C2_SHIFT]; /* increment, check for overflow and undo increment if so. */ if (++(*histp) <= 0) (*histp)--; @@ -665,7 +665,7 @@ find_nearby_colors(j_decompress_ptr cinfo, int minc0, int minc1, int minc2, for (i = 0; i < numcolors; i++) { /* We compute the squared-c0-distance term, then add in the other two. */ - x = GETJSAMPLE(cinfo->colormap[0][i]); + x = cinfo->colormap[0][i]; if (x < minc0) { tdist = (x - minc0) * C0_SCALE; min_dist = tdist * tdist; @@ -688,7 +688,7 @@ find_nearby_colors(j_decompress_ptr cinfo, int minc0, int minc1, int minc2, } } - x = GETJSAMPLE(cinfo->colormap[1][i]); + x = cinfo->colormap[1][i]; if (x < minc1) { tdist = (x - minc1) * C1_SCALE; min_dist += tdist * tdist; @@ -710,7 +710,7 @@ find_nearby_colors(j_decompress_ptr cinfo, int minc0, int minc1, int minc2, } } - x = GETJSAMPLE(cinfo->colormap[2][i]); + x = cinfo->colormap[2][i]; if (x < minc2) { tdist = (x - minc2) * C2_SCALE; min_dist += tdist * tdist; @@ -788,13 +788,13 @@ find_best_colors(j_decompress_ptr cinfo, int minc0, int minc1, int minc2, #define STEP_C2 ((1 << C2_SHIFT) * C2_SCALE) for (i = 0; i < numcolors; i++) { - icolor = GETJSAMPLE(colorlist[i]); + icolor = colorlist[i]; /* Compute (square of) distance from minc0/c1/c2 to this color */ - inc0 = (minc0 - GETJSAMPLE(cinfo->colormap[0][icolor])) * C0_SCALE; + inc0 = (minc0 - cinfo->colormap[0][icolor]) * C0_SCALE; dist0 = inc0 * inc0; - inc1 = (minc1 - GETJSAMPLE(cinfo->colormap[1][icolor])) * C1_SCALE; + inc1 = (minc1 - cinfo->colormap[1][icolor]) * C1_SCALE; dist0 += inc1 * inc1; - inc2 = (minc2 - GETJSAMPLE(cinfo->colormap[2][icolor])) * C2_SCALE; + inc2 = (minc2 - cinfo->colormap[2][icolor]) * C2_SCALE; dist0 += inc2 * inc2; /* Form the initial difference increments */ inc0 = inc0 * (2 * STEP_C0) + STEP_C0 * STEP_C0; @@ -879,7 +879,7 @@ fill_inverse_cmap(j_decompress_ptr cinfo, int c0, int c1, int c2) for (ic1 = 0; ic1 < BOX_C1_ELEMS; ic1++) { cachep = &histogram[c0 + ic0][c1 + ic1][c2]; for (ic2 = 0; ic2 < BOX_C2_ELEMS; ic2++) { - *cachep++ = (histcell)(GETJSAMPLE(*cptr++) + 1); + *cachep++ = (histcell)((*cptr++) + 1); } } } @@ -909,9 +909,9 @@ pass2_no_dither(j_decompress_ptr cinfo, JSAMPARRAY input_buf, outptr = output_buf[row]; for (col = width; col > 0; col--) { /* get pixel value and index into the cache */ - c0 = GETJSAMPLE(*inptr++) >> C0_SHIFT; - c1 = GETJSAMPLE(*inptr++) >> C1_SHIFT; - c2 = GETJSAMPLE(*inptr++) >> C2_SHIFT; + c0 = (*inptr++) >> C0_SHIFT; + c1 = (*inptr++) >> C1_SHIFT; + c2 = (*inptr++) >> C2_SHIFT; cachep = &histogram[c0][c1][c2]; /* If we have not seen this color before, find nearest colormap entry */ /* and update the cache */ @@ -996,12 +996,12 @@ pass2_fs_dither(j_decompress_ptr cinfo, JSAMPARRAY input_buf, * The maximum error is +- MAXJSAMPLE (or less with error limiting); * this sets the required size of the range_limit array. */ - cur0 += GETJSAMPLE(inptr[0]); - cur1 += GETJSAMPLE(inptr[1]); - cur2 += GETJSAMPLE(inptr[2]); - cur0 = GETJSAMPLE(range_limit[cur0]); - cur1 = GETJSAMPLE(range_limit[cur1]); - cur2 = GETJSAMPLE(range_limit[cur2]); + cur0 += inptr[0]; + cur1 += inptr[1]; + cur2 += inptr[2]; + cur0 = range_limit[cur0]; + cur1 = range_limit[cur1]; + cur2 = range_limit[cur2]; /* Index into the cache with adjusted pixel value */ cachep = &histogram[cur0 >> C0_SHIFT][cur1 >> C1_SHIFT][cur2 >> C2_SHIFT]; @@ -1015,9 +1015,9 @@ pass2_fs_dither(j_decompress_ptr cinfo, JSAMPARRAY input_buf, register int pixcode = *cachep - 1; *outptr = (JSAMPLE)pixcode; /* Compute representation error for this pixel */ - cur0 -= GETJSAMPLE(colormap0[pixcode]); - cur1 -= GETJSAMPLE(colormap1[pixcode]); - cur2 -= GETJSAMPLE(colormap2[pixcode]); + cur0 -= colormap0[pixcode]; + cur1 -= colormap1[pixcode]; + cur2 -= colormap2[pixcode]; } /* Compute error fractions to be propagated to adjacent pixels. * Add these into the running sums, and simultaneously shift the @@ -1145,7 +1145,7 @@ start_pass_2_quant(j_decompress_ptr cinfo, boolean is_pre_scan) int i; /* Only F-S dithering or no dithering is supported. */ - /* If user asks for ordered dither, give him F-S. */ + /* If user asks for ordered dither, give them F-S. */ if (cinfo->dither_mode != JDITHER_NONE) cinfo->dither_mode = JDITHER_FS; @@ -1263,7 +1263,7 @@ jinit_2pass_quantizer(j_decompress_ptr cinfo) cquantize->sv_colormap = NULL; /* Only F-S dithering or no dithering is supported. */ - /* If user asks for ordered dither, give him F-S. */ + /* If user asks for ordered dither, give them F-S. */ if (cinfo->dither_mode != JDITHER_NONE) cinfo->dither_mode = JDITHER_FS; diff --git a/src/3rdparty/libjpeg/src/jsimd.h b/src/3rdparty/libjpeg/src/jsimd.h index 51e2b8c8..6c203655 100644 --- a/src/3rdparty/libjpeg/src/jsimd.h +++ b/src/3rdparty/libjpeg/src/jsimd.h @@ -4,6 +4,7 @@ * Copyright 2009 Pierre Ossman for Cendio AB * Copyright (C) 2011, 2014, D. R. Commander. * Copyright (C) 2015-2016, 2018, Matthieu Darbois. + * Copyright (C) 2020, Arm Limited. * * Based on the x86 SIMD extension for IJG JPEG library, * Copyright (C) 1999-2006, MIYASAKA Masaru. @@ -75,6 +76,7 @@ EXTERN(void) jsimd_int_upsample(j_decompress_ptr cinfo, EXTERN(int) jsimd_can_h2v2_fancy_upsample(void); EXTERN(int) jsimd_can_h2v1_fancy_upsample(void); +EXTERN(int) jsimd_can_h1v2_fancy_upsample(void); EXTERN(void) jsimd_h2v2_fancy_upsample(j_decompress_ptr cinfo, jpeg_component_info *compptr, @@ -84,6 +86,10 @@ EXTERN(void) jsimd_h2v1_fancy_upsample(j_decompress_ptr cinfo, jpeg_component_info *compptr, JSAMPARRAY input_data, JSAMPARRAY *output_data_ptr); +EXTERN(void) jsimd_h1v2_fancy_upsample(j_decompress_ptr cinfo, + jpeg_component_info *compptr, + JSAMPARRAY input_data, + JSAMPARRAY *output_data_ptr); EXTERN(int) jsimd_can_h2v2_merged_upsample(void); EXTERN(int) jsimd_can_h2v1_merged_upsample(void); diff --git a/src/3rdparty/libjpeg/src/jsimd_none.c b/src/3rdparty/libjpeg/src/jsimd_none.c index 3cb6c80f..5b38a9fb 100644 --- a/src/3rdparty/libjpeg/src/jsimd_none.c +++ b/src/3rdparty/libjpeg/src/jsimd_none.c @@ -4,6 +4,7 @@ * Copyright 2009 Pierre Ossman for Cendio AB * Copyright (C) 2009-2011, 2014, D. R. Commander. * Copyright (C) 2015-2016, 2018, Matthieu Darbois. + * Copyright (C) 2020, Arm Limited. * * Based on the x86 SIMD extension for IJG JPEG library, * Copyright (C) 1999-2006, MIYASAKA Masaru. @@ -169,6 +170,12 @@ jsimd_can_h2v1_fancy_upsample(void) return 0; } +GLOBAL(int) +jsimd_can_h1v2_fancy_upsample(void) +{ + return 0; +} + GLOBAL(void) jsimd_h2v2_fancy_upsample(j_decompress_ptr cinfo, jpeg_component_info *compptr, JSAMPARRAY input_data, JSAMPARRAY *output_data_ptr) @@ -181,6 +188,12 @@ jsimd_h2v1_fancy_upsample(j_decompress_ptr cinfo, jpeg_component_info *compptr, { } +GLOBAL(void) +jsimd_h1v2_fancy_upsample(j_decompress_ptr cinfo, jpeg_component_info *compptr, + JSAMPARRAY input_data, JSAMPARRAY *output_data_ptr) +{ +} + GLOBAL(int) jsimd_can_h2v2_merged_upsample(void) { diff --git a/src/3rdparty/libjpeg/src/jversion.h b/src/3rdparty/libjpeg/src/jversion.h index ab4a2c57..2ab534af 100644 --- a/src/3rdparty/libjpeg/src/jversion.h +++ b/src/3rdparty/libjpeg/src/jversion.h @@ -2,9 +2,9 @@ * jversion.h * * This file was part of the Independent JPEG Group's software: - * Copyright (C) 1991-2012, Thomas G. Lane, Guido Vollbeding. + * Copyright (C) 1991-2020, Thomas G. Lane, Guido Vollbeding. * libjpeg-turbo Modifications: - * Copyright (C) 2010, 2012-2020, D. R. Commander. + * Copyright (C) 2010, 2012-2021, D. R. Commander. * For conditions of distribution and use, see the accompanying README.ijg * file. * @@ -30,23 +30,25 @@ * NOTE: It is our convention to place the authors in the following order: * - libjpeg-turbo authors (2009-) in descending order of the date of their * most recent contribution to the project, then in ascending order of the - * date of their first contribution to the project + * date of their first contribution to the project, then in alphabetical + * order * - Upstream authors in descending order of the date of the first inclusion of * their code */ #define JCOPYRIGHT \ - "Copyright (C) 2009-2020 D. R. Commander\n" \ - "Copyright (C) 2011-2016 Siarhei Siamashka\n" \ + "Copyright (C) 2009-2021 D. R. Commander\n" \ + "Copyright (C) 2015, 2020 Google, Inc.\n" \ + "Copyright (C) 2019-2020 Arm Limited\n" \ "Copyright (C) 2015-2016, 2018 Matthieu Darbois\n" \ + "Copyright (C) 2011-2016 Siarhei Siamashka\n" \ "Copyright (C) 2015 Intel Corporation\n" \ - "Copyright (C) 2015 Google, Inc.\n" \ + "Copyright (C) 2013-2014 Linaro Limited\n" \ "Copyright (C) 2013-2014 MIPS Technologies, Inc.\n" \ - "Copyright (C) 2013 Linaro Limited\n" \ + "Copyright (C) 2009, 2012 Pierre Ossman for Cendio AB\n" \ "Copyright (C) 2009-2011 Nokia Corporation and/or its subsidiary(-ies)\n" \ - "Copyright (C) 2009 Pierre Ossman for Cendio AB\n" \ "Copyright (C) 1999-2006 MIYASAKA Masaru\n" \ - "Copyright (C) 1991-2016 Thomas G. Lane, Guido Vollbeding" + "Copyright (C) 1991-2020 Thomas G. Lane, Guido Vollbeding" #define JCOPYRIGHT_SHORT \ - "Copyright (C) 1991-2020 The libjpeg-turbo Project and many others" + "Copyright (C) 1991-2021 The libjpeg-turbo Project and many others" diff --git a/src/3rdparty/libjpeg/zlib-license.txt b/src/3rdparty/libjpeg/zlib-license.txt new file mode 100644 index 00000000..480c61ed --- /dev/null +++ b/src/3rdparty/libjpeg/zlib-license.txt @@ -0,0 +1,15 @@ +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. diff --git a/src/3rdparty/libpng/pngrutil.c b/src/3rdparty/libpng/pngrutil.c index d5fa08c3..4db3de99 100644 --- a/src/3rdparty/libpng/pngrutil.c +++ b/src/3rdparty/libpng/pngrutil.c @@ -2087,10 +2087,8 @@ png_handle_eXIf(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length) } } - if (png_crc_finish(png_ptr, 0) != 0) - return; - - png_set_eXIf_1(png_ptr, info_ptr, length, info_ptr->eXIf_buf); + if (png_crc_finish(png_ptr, 0) == 0) + png_set_eXIf_1(png_ptr, info_ptr, length, info_ptr->eXIf_buf); png_free(png_ptr, info_ptr->eXIf_buf); info_ptr->eXIf_buf = NULL; diff --git a/src/3rdparty/libpng/qtpatches.diff b/src/3rdparty/libpng/qtpatches.diff index 7ec8388e..272532cd 100644 --- a/src/3rdparty/libpng/qtpatches.diff +++ b/src/3rdparty/libpng/qtpatches.diff @@ -46,3 +46,20 @@ index 583c26f9bd..2ab9b70d73 100644 # define PNG_ABORT() ExitProcess(0) # else # define PNG_ABORT() abort() +diff --git a/src/3rdparty/libpng/pngrutil.c b/src/3rdparty/libpng/pngrutil.c +index d5fa08c397..4db3de990b 100644 +--- a/src/3rdparty/libpng/pngrutil.c ++++ b/src/3rdparty/libpng/pngrutil.c +@@ -2087,10 +2087,8 @@ png_handle_eXIf(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length) + } + } + +- if (png_crc_finish(png_ptr, 0) != 0) +- return; +- +- png_set_eXIf_1(png_ptr, info_ptr, length, info_ptr->eXIf_buf); ++ if (png_crc_finish(png_ptr, 0) == 0) ++ png_set_eXIf_1(png_ptr, info_ptr, length, info_ptr->eXIf_buf); + + png_free(png_ptr, info_ptr->eXIf_buf); + info_ptr->eXIf_buf = NULL; diff --git a/src/3rdparty/md4c/md4c.c b/src/3rdparty/md4c/md4c.c index 0119e7a5..e4ab47c2 100644 --- a/src/3rdparty/md4c/md4c.c +++ b/src/3rdparty/md4c/md4c.c @@ -581,7 +581,7 @@ struct MD_UNICODE_FOLD_INFO_tag { #define R(cp_min, cp_max) ((cp_min) | 0x40000000), ((cp_max) | 0x80000000) #define S(cp) (cp) /* Unicode "Pc", "Pd", "Pe", "Pf", "Pi", "Po", "Ps" categories. - * (generated by scripts/build_punct_map.py) */ + * (generated by scripts/build_folding_map.py) */ static const unsigned FOLD_MAP_1[] = { R(0x0041,0x005a), S(0x00b5), R(0x00c0,0x00d6), R(0x00d8,0x00de), R(0x0100,0x012e), R(0x0132,0x0136), R(0x0139,0x0147), R(0x014a,0x0176), S(0x0178), R(0x0179,0x017d), S(0x017f), S(0x0181), S(0x0182), @@ -3601,6 +3601,34 @@ md_resolve_links(MD_CTX* ctx, const MD_LINE* lines, int n_lines) } md_analyze_link_contents(ctx, lines, n_lines, opener_index+1, closer_index); + + /* If the link text is formed by nothing but permissive autolink, + * suppress the autolink. + * See https://github.com/mity/md4c/issues/152 for more info. */ + if(ctx->parser.flags & MD_FLAG_PERMISSIVEAUTOLINKS) { + MD_MARK* first_nested; + MD_MARK* last_nested; + + first_nested = opener + 1; + while(first_nested->ch == _T('D') && first_nested < closer) + first_nested++; + + last_nested = closer - 1; + while(first_nested->ch == _T('D') && last_nested > opener) + last_nested--; + + if((first_nested->flags & MD_MARK_RESOLVED) && + first_nested->beg == opener->end && + ISANYOF_(first_nested->ch, _T("@:.")) && + first_nested->next == (last_nested - ctx->marks) && + last_nested->end == closer->beg) + { + first_nested->ch = _T('D'); + first_nested->flags &= ~MD_MARK_RESOLVED; + last_nested->ch = _T('D'); + last_nested->flags &= ~MD_MARK_RESOLVED; + } + } } opener_index = next_index; @@ -5491,7 +5519,7 @@ md_push_container(MD_CTX* ctx, const MD_CONTAINER* container) } static int -md_enter_child_containers(MD_CTX* ctx, int n_children, unsigned data) +md_enter_child_containers(MD_CTX* ctx, int n_children) { int i; int ret = 0; @@ -5516,7 +5544,7 @@ md_enter_child_containers(MD_CTX* ctx, int n_children, unsigned data) MD_CHECK(md_push_container_bytes(ctx, (is_ordered_list ? MD_BLOCK_OL : MD_BLOCK_UL), - c->start, data, MD_BLOCK_CONTAINER_OPENER)); + c->start, c->ch, MD_BLOCK_CONTAINER_OPENER)); MD_CHECK(md_push_container_bytes(ctx, MD_BLOCK_LI, c->task_mark_off, (c->is_task ? CH(c->task_mark_off) : 0), @@ -5745,25 +5773,30 @@ md_analyze_line(MD_CTX* ctx, OFF beg, OFF* p_end, /* Check whether we are HTML block continuation. */ if(pivot_line->type == MD_LINE_HTML && ctx->html_block_type > 0) { - int html_block_type; - - html_block_type = md_is_html_block_end_condition(ctx, off, &off); - if(html_block_type > 0) { - MD_ASSERT(html_block_type == ctx->html_block_type); - - /* Make sure this is the last line of the block. */ + if(n_parents < ctx->n_containers) { + /* HTML block is implicitly ended if the enclosing container + * block ends. */ ctx->html_block_type = 0; + } else { + int html_block_type; - /* Some end conditions serve as blank lines at the same time. */ - if(html_block_type == 6 || html_block_type == 7) { - line->type = MD_LINE_BLANK; - line->indent = 0; - break; + html_block_type = md_is_html_block_end_condition(ctx, off, &off); + if(html_block_type > 0) { + MD_ASSERT(html_block_type == ctx->html_block_type); + + /* Make sure this is the last line of the block. */ + ctx->html_block_type = 0; + + /* Some end conditions serve as blank lines at the same time. */ + if(html_block_type == 6 || html_block_type == 7) { + line->type = MD_LINE_BLANK; + line->indent = 0; + break; + } } - } - if(n_parents == ctx->n_containers) { line->type = MD_LINE_HTML; + n_parents = ctx->n_containers; break; } } @@ -5827,7 +5860,7 @@ md_analyze_line(MD_CTX* ctx, OFF beg, OFF* p_end, /* Check whether we are Setext underline. */ if(line->indent < ctx->code_indent_offset && pivot_line->type == MD_LINE_TEXT - && (CH(off) == _T('=') || CH(off) == _T('-')) + && off < ctx->size && ISANYOF2(off, _T('='), _T('-')) && (n_parents == ctx->n_containers)) { unsigned level; @@ -5840,7 +5873,10 @@ md_analyze_line(MD_CTX* ctx, OFF beg, OFF* p_end, } /* Check for thematic break line. */ - if(line->indent < ctx->code_indent_offset && ISANYOF(off, _T("-_*")) && off >= hr_killer) { + if(line->indent < ctx->code_indent_offset + && off < ctx->size && off >= hr_killer + && ISANYOF(off, _T("-_*"))) + { if(md_is_hr_line(ctx, off, &off, &hr_killer)) { line->type = MD_LINE_HR; break; @@ -5904,7 +5940,7 @@ md_analyze_line(MD_CTX* ctx, OFF beg, OFF* p_end, { /* Noop. List mark followed by a blank line cannot interrupt a paragraph. */ } else if(pivot_line->type == MD_LINE_TEXT && n_parents == ctx->n_containers && - (container.ch == _T('.') || container.ch == _T(')')) && container.start != 1) + ISANYOF2_(container.ch, _T('.'), _T(')')) && container.start != 1) { /* Noop. Ordered list cannot interrupt a paragraph unless the start index is 1. */ } else { @@ -5945,7 +5981,9 @@ md_analyze_line(MD_CTX* ctx, OFF beg, OFF* p_end, } /* Check for ATX header. */ - if(line->indent < ctx->code_indent_offset && CH(off) == _T('#')) { + if(line->indent < ctx->code_indent_offset && + off < ctx->size && CH(off) == _T('#')) + { unsigned level; if(md_is_atxheader_line(ctx, off, &line->beg, &off, &level)) { @@ -5956,7 +5994,7 @@ md_analyze_line(MD_CTX* ctx, OFF beg, OFF* p_end, } /* Check whether we are starting code fence. */ - if(CH(off) == _T('`') || CH(off) == _T('~')) { + if(off < ctx->size && ISANYOF2(off, _T('`'), _T('~'))) { if(md_is_opening_code_fence(ctx, off, &off)) { line->type = MD_LINE_FENCEDCODE; line->data = 1; @@ -5965,7 +6003,8 @@ md_analyze_line(MD_CTX* ctx, OFF beg, OFF* p_end, } /* Check for start of raw HTML block. */ - if(CH(off) == _T('<') && !(ctx->parser.flags & MD_FLAG_NOHTMLBLOCKS)) + if(off < ctx->size && CH(off) == _T('<') + && !(ctx->parser.flags & MD_FLAG_NOHTMLBLOCKS)) { ctx->html_block_type = md_is_html_block_start_condition(ctx, off); @@ -5986,9 +6025,9 @@ md_analyze_line(MD_CTX* ctx, OFF beg, OFF* p_end, } /* Check for table underline. */ - if((ctx->parser.flags & MD_FLAG_TABLES) && pivot_line->type == MD_LINE_TEXT && - (CH(off) == _T('|') || CH(off) == _T('-') || CH(off) == _T(':')) && - n_parents == ctx->n_containers) + if((ctx->parser.flags & MD_FLAG_TABLES) && pivot_line->type == MD_LINE_TEXT + && off < ctx->size && ISANYOF3(off, _T('|'), _T('-'), _T(':')) + && n_parents == ctx->n_containers) { unsigned col_count; @@ -6120,7 +6159,7 @@ md_analyze_line(MD_CTX* ctx, OFF beg, OFF* p_end, } if(n_children > 0) - MD_CHECK(md_enter_child_containers(ctx, n_children, line->data)); + MD_CHECK(md_enter_child_containers(ctx, n_children)); abort: return ret; diff --git a/src/3rdparty/md4c/qt_attribution.json b/src/3rdparty/md4c/qt_attribution.json index 024cf5ed..29c0666f 100644 --- a/src/3rdparty/md4c/qt_attribution.json +++ b/src/3rdparty/md4c/qt_attribution.json @@ -9,7 +9,7 @@ "License": "MIT License", "LicenseId": "MIT", "LicenseFile": "LICENSE.md", - "Version": "0.4.6", - "DownloadLocation": "https://github.com/mity/md4c/releases/tag/release-0.4.6", + "Version": "0.4.8", + "DownloadLocation": "https://github.com/mity/md4c/releases/tag/release-0.4.8", "Copyright": "Copyright © 2016-2020 Martin Mitáš" } diff --git a/src/3rdparty/pcre2/AUTHORS b/src/3rdparty/pcre2/AUTHORS index f001cb77..bec8a1e5 100644 --- a/src/3rdparty/pcre2/AUTHORS +++ b/src/3rdparty/pcre2/AUTHORS @@ -5,10 +5,10 @@ Written by: Philip Hazel Email local part: Philip.Hazel Email domain: gmail.com -University of Cambridge Computing Service, +Retired from University of Cambridge Computing Service, Cambridge, England. -Copyright (c) 1997-2020 University of Cambridge +Copyright (c) 1997-2021 University of Cambridge All rights reserved @@ -19,7 +19,7 @@ Written by: Zoltan Herczeg Email local part: hzmester Emain domain: freemail.hu -Copyright(c) 2010-2020 Zoltan Herczeg +Copyright(c) 2010-2021 Zoltan Herczeg All rights reserved. @@ -30,7 +30,7 @@ Written by: Zoltan Herczeg Email local part: hzmester Emain domain: freemail.hu -Copyright(c) 2009-2020 Zoltan Herczeg +Copyright(c) 2009-2021 Zoltan Herczeg All rights reserved. #### diff --git a/src/3rdparty/pcre2/LICENCE b/src/3rdparty/pcre2/LICENCE index 155d0731..b1ec61be 100644 --- a/src/3rdparty/pcre2/LICENCE +++ b/src/3rdparty/pcre2/LICENCE @@ -23,10 +23,10 @@ Written by: Philip Hazel Email local part: Philip.Hazel Email domain: gmail.com -University of Cambridge Computing Service, +Retired from University of Cambridge Computing Service, Cambridge, England. -Copyright (c) 1997-2020 University of Cambridge +Copyright (c) 1997-2021 University of Cambridge All rights reserved. @@ -37,7 +37,7 @@ Written by: Zoltan Herczeg Email local part: hzmester Email domain: freemail.hu -Copyright(c) 2010-2020 Zoltan Herczeg +Copyright(c) 2010-2021 Zoltan Herczeg All rights reserved. @@ -48,7 +48,7 @@ Written by: Zoltan Herczeg Email local part: hzmester Email domain: freemail.hu -Copyright(c) 2009-2020 Zoltan Herczeg +Copyright(c) 2009-2021 Zoltan Herczeg All rights reserved. diff --git a/src/3rdparty/pcre2/pcre2.pro b/src/3rdparty/pcre2/pcre2.pro index bfa42b88..fd5f1562 100644 --- a/src/3rdparty/pcre2/pcre2.pro +++ b/src/3rdparty/pcre2/pcre2.pro @@ -23,7 +23,7 @@ qtConfig(intelcet) { uikit|qnx|winrt: DEFINES += PCRE2_DISABLE_JIT win32:contains(QT_ARCH, "arm"): DEFINES += PCRE2_DISABLE_JIT win32:contains(QT_ARCH, "arm64"): DEFINES += PCRE2_DISABLE_JIT -macos:contains(QT_ARCH, "arm64"): DEFINES += PCRE2_DISABLE_JIT +macos:contains(QT_ARCHS, "arm64"): QMAKE_CFLAGS += -Xarch_arm64 -DPCRE2_DISABLE_JIT SOURCES += \ $$PWD/src/pcre2_auto_possess.c \ diff --git a/src/3rdparty/pcre2/qt_attribution.json b/src/3rdparty/pcre2/qt_attribution.json index e7abb567..8fca054c 100644 --- a/src/3rdparty/pcre2/qt_attribution.json +++ b/src/3rdparty/pcre2/qt_attribution.json @@ -7,12 +7,12 @@ "Description": "The PCRE library is a set of functions that implement regular expression pattern matching using the same syntax and semantics as Perl 5.", "Homepage": "http://www.pcre.org/", - "Version": "10.36", - "DownloadLocation": "https://ftp.pcre.org/pub/pcre/pcre2-10.36.tar.bz2", + "Version": "10.39", + "DownloadLocation": "https://github.com/PhilipHazel/pcre2/releases/download/pcre2-10.39/pcre2-10.39.tar.bz2", "License": "BSD 3-clause \"New\" or \"Revised\" License", "LicenseId": "BSD-3-Clause", "LicenseFile": "LICENCE", - "Copyright": "Copyright (c) 1997-2020 University of Cambridge + "Copyright": "Copyright (c) 1997-2021 University of Cambridge Copyright (c) 2010-2020 Zoltan Herczeg" }, { @@ -24,11 +24,11 @@ Copyright (c) 2010-2020 Zoltan Herczeg" "Path": "src/sljit", "Description": "The PCRE library is a set of functions that implement regular expression pattern matching using the same syntax and semantics as Perl 5.", "Homepage": "http://www.pcre.org/", - "Version": "10.36", - "DownloadLocation": "https://ftp.pcre.org/pub/pcre/pcre2-10.36.tar.bz2", + "Version": "10.39", + "DownloadLocation": "https://github.com/PhilipHazel/pcre2/releases/download/pcre2-10.39/pcre2-10.39.tar.bz2", "License": "BSD 2-clause \"Simplified\" License", "LicenseId": "BSD-2-Clause", "LicenseFile": "LICENCE-SLJIT", - "Copyright": "Copyright (c) 2009-2020 Zoltan Herczeg" + "Copyright": "Copyright (c) 2009-2021 Zoltan Herczeg" } ] diff --git a/src/3rdparty/pcre2/src/pcre2.h b/src/3rdparty/pcre2/src/pcre2.h index f204ec81..90a97d9c 100644 --- a/src/3rdparty/pcre2/src/pcre2.h +++ b/src/3rdparty/pcre2/src/pcre2.h @@ -5,7 +5,7 @@ /* This is the public header file for the PCRE library, second API, to be #included by applications that call PCRE2 functions. - Copyright (c) 2016-2020 University of Cambridge + Copyright (c) 2016-2021 University of Cambridge ----------------------------------------------------------------------------- Redistribution and use in source and binary forms, with or without @@ -42,9 +42,9 @@ POSSIBILITY OF SUCH DAMAGE. /* The current PCRE version information. */ #define PCRE2_MAJOR 10 -#define PCRE2_MINOR 36 +#define PCRE2_MINOR 39 #define PCRE2_PRERELEASE -#define PCRE2_DATE 2020-12-04 +#define PCRE2_DATE 2021-10-29 /* When an application links to a PCRE DLL in Windows, the symbols that are imported have to be identified as such. When building PCRE2, the appropriate @@ -84,8 +84,8 @@ set, we ensure here that it has no effect. */ /* Have to include limits.h, stdlib.h, and inttypes.h to ensure that size_t and uint8_t, UCHAR_MAX, etc are defined. Some systems that do have inttypes.h do not have stdint.h, which is why we use inttypes.h, which according to the C -standard is a superset of stdint.h. If none of these headers are available, -the relevant values must be provided by some other means. */ +standard is a superset of stdint.h. If inttypes.h is not available the build +will break and the relevant values must be provided by some other means. */ #include #include @@ -152,6 +152,7 @@ D is inspected during pcre2_dfa_match() execution #define PCRE2_EXTRA_MATCH_LINE 0x00000008u /* C */ #define PCRE2_EXTRA_ESCAPED_CR_IS_LF 0x00000010u /* C */ #define PCRE2_EXTRA_ALT_BSUX 0x00000020u /* C */ +#define PCRE2_EXTRA_ALLOW_LOOKAROUND_BSK 0x00000040u /* C */ /* These are for pcre2_jit_compile(). */ @@ -311,6 +312,7 @@ pcre2_pattern_convert(). */ #define PCRE2_ERROR_SCRIPT_RUN_NOT_AVAILABLE 196 #define PCRE2_ERROR_TOO_MANY_CAPTURES 197 #define PCRE2_ERROR_CONDITION_ATOMIC_ASSERTION_EXPECTED 198 +#define PCRE2_ERROR_BACKSLASH_K_IN_LOOKAROUND 199 /* "Expected" matching error codes: no match and partial match. */ diff --git a/src/3rdparty/pcre2/src/pcre2_auto_possess.c b/src/3rdparty/pcre2/src/pcre2_auto_possess.c index c64cf856..e5e08956 100644 --- a/src/3rdparty/pcre2/src/pcre2_auto_possess.c +++ b/src/3rdparty/pcre2/src/pcre2_auto_possess.c @@ -7,7 +7,7 @@ and semantics are as close as possible to those of the Perl 5 language. Written by Philip Hazel Original API code Copyright (c) 1997-2012 University of Cambridge - New API code Copyright (c) 2016-2020 University of Cambridge + New API code Copyright (c) 2016-2021 University of Cambridge ----------------------------------------------------------------------------- Redistribution and use in source and binary forms, with or without @@ -490,6 +490,7 @@ switch(c) list[2] = (uint32_t)(end - code); return end; } + return NULL; /* Opcode not accepted */ } @@ -1186,12 +1187,16 @@ for (;;) c = *repeat_opcode; if (c >= OP_CRSTAR && c <= OP_CRMINRANGE) { - /* end must not be NULL. */ - end = get_chr_property_list(code, utf, ucp, cb->fcc, list); + /* The return from get_chr_property_list() will never be NULL when + *code (aka c) is one of the three class opcodes. However, gcc with + -fanalyzer notes that a NULL return is possible, and grumbles. Hence we + put in a check. */ + end = get_chr_property_list(code, utf, ucp, cb->fcc, list); list[1] = (c & 1) == 0; - if (compare_opcodes(end, utf, ucp, cb, list, end, &rec_limit)) + if (end != NULL && + compare_opcodes(end, utf, ucp, cb, list, end, &rec_limit)) { switch (c) { diff --git a/src/3rdparty/pcre2/src/pcre2_compile.c b/src/3rdparty/pcre2/src/pcre2_compile.c index e811f12f..383159be 100644 --- a/src/3rdparty/pcre2/src/pcre2_compile.c +++ b/src/3rdparty/pcre2/src/pcre2_compile.c @@ -7,7 +7,7 @@ and semantics are as close as possible to those of the Perl 5 language. Written by Philip Hazel Original API code Copyright (c) 1997-2012 University of Cambridge - New API code Copyright (c) 2016-2020 University of Cambridge + New API code Copyright (c) 2016-2021 University of Cambridge ----------------------------------------------------------------------------- Redistribution and use in source and binary forms, with or without @@ -137,7 +137,7 @@ static BOOL static int check_lookbehinds(uint32_t *, uint32_t **, parsed_recurse_check *, - compile_block *); + compile_block *, int *); /************************************************* @@ -782,12 +782,15 @@ are allowed. */ #define PUBLIC_COMPILE_EXTRA_OPTIONS \ (PUBLIC_LITERAL_COMPILE_EXTRA_OPTIONS| \ PCRE2_EXTRA_ALLOW_SURROGATE_ESCAPES|PCRE2_EXTRA_BAD_ESCAPE_IS_LITERAL| \ - PCRE2_EXTRA_ESCAPED_CR_IS_LF|PCRE2_EXTRA_ALT_BSUX) + PCRE2_EXTRA_ESCAPED_CR_IS_LF|PCRE2_EXTRA_ALT_BSUX| \ + PCRE2_EXTRA_ALLOW_LOOKAROUND_BSK) /* Compile time error code numbers. They are given names so that they can more easily be tracked. When a new number is added, the tables called eint1 and eint2 in pcre2posix.c may need to be updated, and a new error text must be -added to compile_error_texts in pcre2_error.c. */ +added to compile_error_texts in pcre2_error.c. Also, the error codes in +pcre2.h.in must be updated - their values are exactly 100 greater than these +values. */ enum { ERR0 = COMPILE_ERROR_BASE, ERR1, ERR2, ERR3, ERR4, ERR5, ERR6, ERR7, ERR8, ERR9, ERR10, @@ -799,7 +802,7 @@ enum { ERR0 = COMPILE_ERROR_BASE, ERR61, ERR62, ERR63, ERR64, ERR65, ERR66, ERR67, ERR68, ERR69, ERR70, ERR71, ERR72, ERR73, ERR74, ERR75, ERR76, ERR77, ERR78, ERR79, ERR80, ERR81, ERR82, ERR83, ERR84, ERR85, ERR86, ERR87, ERR88, ERR89, ERR90, - ERR91, ERR92, ERR93, ERR94, ERR95, ERR96, ERR97, ERR98 }; + ERR91, ERR92, ERR93, ERR94, ERR95, ERR96, ERR97, ERR98, ERR99 }; /* This is a table of start-of-pattern options such as (*UTF) and settings such as (*LIMIT_MATCH=nnnn) and (*CRLF). For completeness and backward @@ -1398,32 +1401,47 @@ static BOOL read_repeat_counts(PCRE2_SPTR *ptrptr, PCRE2_SPTR ptrend, uint32_t *minp, uint32_t *maxp, int *errorcodeptr) { -PCRE2_SPTR p = *ptrptr; +PCRE2_SPTR p; BOOL yield = FALSE; +BOOL had_comma = FALSE; int32_t min = 0; int32_t max = REPEAT_UNLIMITED; /* This value is larger than MAX_REPEAT_COUNT */ -/* NB read_number() initializes the error code to zero. The only error is for a -number that is too big. */ +/* Check the syntax */ +*errorcodeptr = 0; +for (p = *ptrptr;; p++) + { + uint32_t c; + if (p >= ptrend) return FALSE; + c = *p; + if (IS_DIGIT(c)) continue; + if (c == CHAR_RIGHT_CURLY_BRACKET) break; + if (c == CHAR_COMMA) + { + if (had_comma) return FALSE; + had_comma = TRUE; + } + else return FALSE; + } + +/* The only error from read_number() is for a number that is too big. */ + +p = *ptrptr; if (!read_number(&p, ptrend, -1, MAX_REPEAT_COUNT, ERR5, &min, errorcodeptr)) goto EXIT; -if (p >= ptrend) goto EXIT; - if (*p == CHAR_RIGHT_CURLY_BRACKET) { p++; max = min; } - else { - if (*p++ != CHAR_COMMA || p >= ptrend) goto EXIT; - if (*p != CHAR_RIGHT_CURLY_BRACKET) + if (*(++p) != CHAR_RIGHT_CURLY_BRACKET) { if (!read_number(&p, ptrend, -1, MAX_REPEAT_COUNT, ERR5, &max, - errorcodeptr) || p >= ptrend || *p != CHAR_RIGHT_CURLY_BRACKET) + errorcodeptr)) goto EXIT; if (max < min) { @@ -1438,11 +1456,10 @@ yield = TRUE; if (minp != NULL) *minp = (uint32_t)min; if (maxp != NULL) *maxp = (uint32_t)max; -/* Update the pattern pointer on success, or after an error, but not when -the result is "not a repeat quantifier". */ +/* Update the pattern pointer */ EXIT: -if (yield || *errorcodeptr != 0) *ptrptr = p; +*ptrptr = p; return yield; } @@ -1776,19 +1793,23 @@ else { oldptr = ptr; ptr--; /* Back to the digit */ - if (!read_number(&ptr, ptrend, -1, INT_MAX/10 - 1, ERR61, &s, - errorcodeptr)) - break; - /* \1 to \9 are always back references. \8x and \9x are too; \1x to \7x + /* As we know we are at a digit, the only possible error from + read_number() is a number that is too large to be a group number. In this + case we fall through handle this as not a group reference. If we have + read a small enough number, check for a back reference. + + \1 to \9 are always back references. \8x and \9x are too; \1x to \7x are octal escapes if there are not that many previous captures. */ - if (s < 10 || oldptr[-1] >= CHAR_8 || s <= (int)cb->bracount) + if (read_number(&ptr, ptrend, -1, INT_MAX/10 - 1, 0, &s, errorcodeptr) && + (s < 10 || oldptr[-1] >= CHAR_8 || s <= (int)cb->bracount)) { if (s > (int)MAX_GROUP_NUMBER) *errorcodeptr = ERR61; else escape = -s; /* Indicates a back reference */ break; } + ptr = oldptr; /* Put the pointer back and fall through */ } @@ -7781,6 +7802,16 @@ for (;; pptr++) } #endif + /* \K is forbidden in lookarounds since 10.38 because that's what Perl has + done. However, there's an option, in case anyone was relying on it. */ + + if (cb->assert_depth > 0 && meta_arg == ESC_K && + (cb->cx->extra_options & PCRE2_EXTRA_ALLOW_LOOKAROUND_BSK) == 0) + { + *errorcodeptr = ERR99; + return 0; + } + /* For the rest (including \X when Unicode is supported - if not it's faulted at parse time), the OP value is the escape value when PCRE2_UCP is not set; if it is set, these escapes do not show up here because they are @@ -9130,7 +9161,7 @@ for (;; pptr++) case META_LOOKAHEAD: case META_LOOKAHEADNOT: case META_LOOKAHEAD_NA: - *errcodeptr = check_lookbehinds(pptr + 1, &pptr, recurses, cb); + *errcodeptr = check_lookbehinds(pptr + 1, &pptr, recurses, cb, lcptr); if (*errcodeptr != 0) return -1; /* Ignore any qualifiers that follow a lookahead assertion. */ @@ -9470,16 +9501,16 @@ Arguments retptr if not NULL, return the ket pointer here recurses chain of recurse_check to catch mutual recursion cb points to the compile block + lcptr points to loop counter Returns: 0 on success, or an errorcode (cb->erroroffset will be set) */ static int check_lookbehinds(uint32_t *pptr, uint32_t **retptr, - parsed_recurse_check *recurses, compile_block *cb) + parsed_recurse_check *recurses, compile_block *cb, int *lcptr) { int errorcode = 0; -int loopcount = 0; int nestlevel = 0; cb->erroroffset = PCRE2_UNSET; @@ -9605,7 +9636,7 @@ for (; *pptr != META_END; pptr++) case META_LOOKBEHIND: case META_LOOKBEHINDNOT: case META_LOOKBEHIND_NA: - if (!set_lookbehind_lengths(&pptr, &errorcode, &loopcount, recurses, cb)) + if (!set_lookbehind_lengths(&pptr, &errorcode, lcptr, recurses, cb)) return errorcode; break; } @@ -10060,7 +10091,8 @@ lengths. */ if (has_lookbehind) { - errorcode = check_lookbehinds(cb.parsed_pattern, NULL, NULL, &cb); + int loopcount = 0; + errorcode = check_lookbehinds(cb.parsed_pattern, NULL, NULL, &cb, &loopcount); if (errorcode != 0) goto HAD_CB_ERROR; } diff --git a/src/3rdparty/pcre2/src/pcre2_dfa_match.c b/src/3rdparty/pcre2/src/pcre2_dfa_match.c index 625695b7..060dc766 100644 --- a/src/3rdparty/pcre2/src/pcre2_dfa_match.c +++ b/src/3rdparty/pcre2/src/pcre2_dfa_match.c @@ -7,7 +7,7 @@ and semantics are as close as possible to those of the Perl 5 language. Written by Philip Hazel Original API code Copyright (c) 1997-2012 University of Cambridge - New API code Copyright (c) 2016-2020 University of Cambridge + New API code Copyright (c) 2016-2021 University of Cambridge ----------------------------------------------------------------------------- Redistribution and use in source and binary forms, with or without @@ -3256,8 +3256,8 @@ BOOL has_first_cu = FALSE; BOOL has_req_cu = FALSE; #if PCRE2_CODE_UNIT_WIDTH == 8 -BOOL memchr_not_found_first_cu = FALSE; -BOOL memchr_not_found_first_cu2 = FALSE; +PCRE2_SPTR memchr_found_first_cu = NULL; +PCRE2_SPTR memchr_found_first_cu2 = NULL; #endif PCRE2_UCHAR first_cu = 0; @@ -3648,13 +3648,7 @@ for (;;) } } - /* Not anchored. Advance to a unique first code unit if there is one. In - 8-bit mode, the use of memchr() gives a big speed up, even though we have - to call it twice in caseless mode, in order to find the earliest occurrence - of the character in either of its cases. If a call to memchr() that - searches the rest of the subject fails to find one case, remember that in - order not to keep on repeating the search. This can make a huge difference - when the strings are very long and only one case is present. */ + /* Not anchored. Advance to a unique first code unit if there is one. */ else { @@ -3662,43 +3656,68 @@ for (;;) { if (first_cu != first_cu2) /* Caseless */ { + /* In 16-bit and 32_bit modes we have to do our own search, so can + look for both cases at once. */ + #if PCRE2_CODE_UNIT_WIDTH != 8 PCRE2_UCHAR smc; while (start_match < end_subject && (smc = UCHAR21TEST(start_match)) != first_cu && - smc != first_cu2) + smc != first_cu2) start_match++; +#else + /* In 8-bit mode, the use of memchr() gives a big speed up, even + though we have to call it twice in order to find the earliest + occurrence of the code unit in either of its cases. Caching is used + to remember the positions of previously found code units. This can + make a huge difference when the strings are very long and only one + case is actually present. */ -#else /* 8-bit code units */ PCRE2_SPTR pp1 = NULL; PCRE2_SPTR pp2 = NULL; - PCRE2_SIZE cu2size = end_subject - start_match; + PCRE2_SIZE searchlength = end_subject - start_match; - if (!memchr_not_found_first_cu) + /* If we haven't got a previously found position for first_cu, or if + the current starting position is later, we need to do a search. If + the code unit is not found, set it to the end. */ + + if (memchr_found_first_cu == NULL || + start_match > memchr_found_first_cu) { - pp1 = memchr(start_match, first_cu, end_subject - start_match); - if (pp1 == NULL) memchr_not_found_first_cu = TRUE; - else cu2size = pp1 - start_match; + pp1 = memchr(start_match, first_cu, searchlength); + memchr_found_first_cu = (pp1 == NULL)? end_subject : pp1; } - /* If pp1 is not NULL, we have arranged to search only as far as pp1, - to see if the other case is earlier, so we can set "not found" only - when both searches have returned NULL. */ + /* If the start is before a previously found position, use the + previous position, or NULL if a previous search failed. */ - if (!memchr_not_found_first_cu2) + else pp1 = (memchr_found_first_cu == end_subject)? NULL : + memchr_found_first_cu; + + /* Do the same thing for the other case. */ + + if (memchr_found_first_cu2 == NULL || + start_match > memchr_found_first_cu2) { - pp2 = memchr(start_match, first_cu2, cu2size); - memchr_not_found_first_cu2 = (pp2 == NULL && pp1 == NULL); + pp2 = memchr(start_match, first_cu2, searchlength); + memchr_found_first_cu2 = (pp2 == NULL)? end_subject : pp2; } + else pp2 = (memchr_found_first_cu2 == end_subject)? NULL : + memchr_found_first_cu2; + + /* Set the start to the end of the subject if neither case was found. + Otherwise, use the earlier found point. */ + if (pp1 == NULL) start_match = (pp2 == NULL)? end_subject : pp2; else start_match = (pp2 == NULL || pp1 < pp2)? pp1 : pp2; -#endif + +#endif /* 8-bit handling */ } - /* The caseful case */ + /* The caseful case is much simpler. */ else { diff --git a/src/3rdparty/pcre2/src/pcre2_error.c b/src/3rdparty/pcre2/src/pcre2_error.c index c61648cb..3dee63d0 100644 --- a/src/3rdparty/pcre2/src/pcre2_error.c +++ b/src/3rdparty/pcre2/src/pcre2_error.c @@ -7,7 +7,7 @@ and semantics are as close as possible to those of the Perl 5 language. Written by Philip Hazel Original API code Copyright (c) 1997-2012 University of Cambridge - New API code Copyright (c) 2016-2019 University of Cambridge + New API code Copyright (c) 2016-2021 University of Cambridge ----------------------------------------------------------------------------- Redistribution and use in source and binary forms, with or without @@ -186,6 +186,7 @@ static const unsigned char compile_error_texts[] = "script runs require Unicode support, which this version of PCRE2 does not have\0" "too many capturing groups (maximum 65535)\0" "atomic assertion expected after (?( or (?(?C)\0" + "\\K is not allowed in lookarounds (but see PCRE2_EXTRA_ALLOW_LOOKAROUND_BSK)\0" ; /* Match-time and UTF error texts are in the same format. */ diff --git a/src/3rdparty/pcre2/src/pcre2_jit_compile.c b/src/3rdparty/pcre2/src/pcre2_jit_compile.c index 1977d28a..db2ce655 100644 --- a/src/3rdparty/pcre2/src/pcre2_jit_compile.c +++ b/src/3rdparty/pcre2/src/pcre2_jit_compile.c @@ -1226,7 +1226,7 @@ while (cc < ccend) return TRUE; } -#define EARLY_FAIL_ENHANCE_MAX (1 + 1) +#define EARLY_FAIL_ENHANCE_MAX (1 + 3) /* start: @@ -1236,23 +1236,28 @@ start: return: current number of iterators enhanced with fast fail */ -static int detect_early_fail(compiler_common *common, PCRE2_SPTR cc, int *private_data_start, sljit_s32 depth, int start) +static int detect_early_fail(compiler_common *common, PCRE2_SPTR cc, int *private_data_start, + sljit_s32 depth, int start, BOOL fast_forward_allowed) { +PCRE2_SPTR begin = cc; PCRE2_SPTR next_alt; PCRE2_SPTR end; PCRE2_SPTR accelerated_start; +BOOL prev_fast_forward_allowed; int result = 0; int count; -BOOL fast_forward_allowed = TRUE; SLJIT_ASSERT(*cc == OP_ONCE || *cc == OP_BRA || *cc == OP_CBRA); SLJIT_ASSERT(*cc != OP_CBRA || common->optimized_cbracket[GET2(cc, 1 + LINK_SIZE)] != 0); SLJIT_ASSERT(start < EARLY_FAIL_ENHANCE_MAX); +next_alt = cc + GET(cc, 1); +if (*next_alt == OP_ALT) + fast_forward_allowed = FALSE; + do { count = start; - next_alt = cc + GET(cc, 1); cc += 1 + LINK_SIZE + ((*cc == OP_CBRA) ? IMM2_SIZE : 0); while (TRUE) @@ -1475,31 +1480,20 @@ do case OP_CBRA: end = cc + GET(cc, 1); - if (*end == OP_KET && PRIVATE_DATA(end) == 0) - { - if (*cc == OP_CBRA) - { - if (common->optimized_cbracket[GET2(cc, 1 + LINK_SIZE)] == 0) - break; - cc += IMM2_SIZE; - } - - cc += 1 + LINK_SIZE; - continue; - } - + prev_fast_forward_allowed = fast_forward_allowed; fast_forward_allowed = FALSE; if (depth >= 4) break; end = bracketend(cc) - (1 + LINK_SIZE); - if (*end != OP_KET || PRIVATE_DATA(end) != 0) + if (*end != OP_KET || (*cc == OP_CBRA && common->optimized_cbracket[GET2(cc, 1 + LINK_SIZE)] == 0)) break; - if (*cc == OP_CBRA && common->optimized_cbracket[GET2(cc, 1 + LINK_SIZE)] == 0) - break; + count = detect_early_fail(common, cc, private_data_start, depth + 1, count, prev_fast_forward_allowed); + + if (PRIVATE_DATA(cc) != 0) + common->private_data_ptrs[begin - common->start] = 1; - count = detect_early_fail(common, cc, private_data_start, depth + 1, count); if (count < EARLY_FAIL_ENHANCE_MAX) { cc = end + (1 + LINK_SIZE); @@ -1521,7 +1515,7 @@ do { count++; - if (fast_forward_allowed && *next_alt == OP_KET) + if (fast_forward_allowed) { common->fast_forward_bc_ptr = accelerated_start; common->private_data_ptrs[(accelerated_start + 1) - common->start] = ((*private_data_start) << 3) | type_skip; @@ -1555,6 +1549,8 @@ do return EARLY_FAIL_ENHANCE_MAX; } + /* Cannot be part of a repeat. */ + common->private_data_ptrs[begin - common->start] = 1; count++; if (count < EARLY_FAIL_ENHANCE_MAX) @@ -1569,8 +1565,8 @@ do else if (result < count) result = count; - fast_forward_allowed = FALSE; cc = next_alt; + next_alt = cc + GET(cc, 1); } while (*cc == OP_ALT); @@ -1620,11 +1616,12 @@ sljit_sw length = end - begin; sljit_s32 min, max, i; /* Detect fixed iterations first. */ -if (end[-(1 + LINK_SIZE)] != OP_KET) +if (end[-(1 + LINK_SIZE)] != OP_KET || PRIVATE_DATA(begin) != 0) return FALSE; -/* Already detected repeat. */ -if (common->private_data_ptrs[end - common->start - LINK_SIZE] != 0) +/* /(?:AB){4,6}/ is currently converted to /(?:AB){3}(?AB){1,3}/ + * Skip the check of the second part. */ +if (PRIVATE_DATA(end - LINK_SIZE) == 0) return TRUE; next = end; @@ -1763,6 +1760,7 @@ while (cc < ccend) if (private_data_ptr > SLJIT_MAX_LOCAL_SIZE) break; + /* When the bracket is prefixed by a zero iteration, skip the repeat check (at this point). */ if (repeat_check && (*cc == OP_ONCE || *cc == OP_BRA || *cc == OP_CBRA || *cc == OP_COND)) { if (detect_repeat(common, cc)) @@ -1813,6 +1811,7 @@ while (cc < ccend) case OP_COND: /* Might be a hidden SCOND. */ + common->private_data_ptrs[cc - common->start] = 0; alternative = cc + GET(cc, 1); if (*alternative == OP_KETRMAX || *alternative == OP_KETRMIN) { @@ -4203,9 +4202,6 @@ TMP2 is not used. Otherwise TMP2 must contain the start of the subject buffer, and it is destroyed. Does not modify STR_PTR for invalid character sequences. */ DEFINE_COMPILER; -SLJIT_UNUSED_ARG(backtracks); -SLJIT_UNUSED_ARG(must_be_valid); - #if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32 struct sljit_jump *jump; #endif @@ -4279,6 +4275,10 @@ if (common->invalid_utf && !must_be_valid) } #endif /* PCRE2_CODE_UNIT_WIDTH == [8|16|32] */ #endif /* SUPPORT_UNICODE */ + +SLJIT_UNUSED_ARG(backtracks); +SLJIT_UNUSED_ARG(must_be_valid); + OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); } @@ -8141,7 +8141,7 @@ switch(type) } else OP2(SLJIT_AND32 | SLJIT_SET_Z, SLJIT_UNUSED, 0, SLJIT_MEM1(ARGUMENTS), SLJIT_OFFSETOF(jit_arguments, options), SLJIT_IMM, PCRE2_NOTEOL); - add_jump(compiler, backtracks, JUMP(SLJIT_NOT_ZERO32)); + add_jump(compiler, backtracks, JUMP(SLJIT_NOT_ZERO)); if (!common->endonly) compile_simple_assertion_matchingpath(common, OP_EODN, cc, backtracks); @@ -8161,7 +8161,7 @@ switch(type) } else OP2(SLJIT_AND32 | SLJIT_SET_Z, SLJIT_UNUSED, 0, SLJIT_MEM1(ARGUMENTS), SLJIT_OFFSETOF(jit_arguments, options), SLJIT_IMM, PCRE2_NOTEOL); - add_jump(compiler, backtracks, JUMP(SLJIT_NOT_ZERO32)); + add_jump(compiler, backtracks, JUMP(SLJIT_NOT_ZERO)); check_partial(common, FALSE); jump[0] = JUMP(SLJIT_JUMP); JUMPHERE(jump[1]); @@ -8201,14 +8201,14 @@ switch(type) OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(TMP2), SLJIT_OFFSETOF(jit_arguments, begin)); add_jump(compiler, backtracks, CMP(SLJIT_GREATER, STR_PTR, 0, TMP1, 0)); OP2(SLJIT_AND32 | SLJIT_SET_Z, SLJIT_UNUSED, 0, SLJIT_MEM1(TMP2), SLJIT_OFFSETOF(jit_arguments, options), SLJIT_IMM, PCRE2_NOTBOL); - add_jump(compiler, backtracks, JUMP(SLJIT_NOT_ZERO32)); + add_jump(compiler, backtracks, JUMP(SLJIT_NOT_ZERO)); } else { OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(ARGUMENTS), SLJIT_OFFSETOF(jit_arguments, begin)); add_jump(compiler, backtracks, CMP(SLJIT_GREATER, STR_PTR, 0, TMP1, 0)); OP2(SLJIT_AND32 | SLJIT_SET_Z, SLJIT_UNUSED, 0, SLJIT_MEM1(ARGUMENTS), SLJIT_OFFSETOF(jit_arguments, options), SLJIT_IMM, PCRE2_NOTBOL); - add_jump(compiler, backtracks, JUMP(SLJIT_NOT_ZERO32)); + add_jump(compiler, backtracks, JUMP(SLJIT_NOT_ZERO)); } return cc; @@ -8227,7 +8227,7 @@ switch(type) jump[1] = CMP(SLJIT_GREATER, STR_PTR, 0, TMP2, 0); OP2(SLJIT_AND32 | SLJIT_SET_Z, SLJIT_UNUSED, 0, SLJIT_MEM1(ARGUMENTS), SLJIT_OFFSETOF(jit_arguments, options), SLJIT_IMM, PCRE2_NOTBOL); } - add_jump(compiler, backtracks, JUMP(SLJIT_NOT_ZERO32)); + add_jump(compiler, backtracks, JUMP(SLJIT_NOT_ZERO)); jump[0] = JUMP(SLJIT_JUMP); JUMPHERE(jump[1]); @@ -9581,11 +9581,11 @@ free_stack(common, callout_arg_size); /* Check return value. */ OP2(SLJIT_SUB32 | SLJIT_SET_Z | SLJIT_SET_SIG_GREATER, SLJIT_UNUSED, 0, SLJIT_RETURN_REG, 0, SLJIT_IMM, 0); -add_jump(compiler, &backtrack->topbacktracks, JUMP(SLJIT_SIG_GREATER32)); +add_jump(compiler, &backtrack->topbacktracks, JUMP(SLJIT_SIG_GREATER)); if (common->abort_label == NULL) - add_jump(compiler, &common->abort, JUMP(SLJIT_NOT_EQUAL32) /* SIG_LESS */); + add_jump(compiler, &common->abort, JUMP(SLJIT_NOT_EQUAL) /* SIG_LESS */); else - JUMPTO(SLJIT_NOT_EQUAL32 /* SIG_LESS */, common->abort_label); + JUMPTO(SLJIT_NOT_EQUAL /* SIG_LESS */, common->abort_label); return cc + callout_length; } @@ -11232,7 +11232,7 @@ early_fail_type = (early_fail_ptr & 0x7); early_fail_ptr >>= 3; /* During recursion, these optimizations are disabled. */ -if (common->early_fail_start_ptr == 0) +if (common->early_fail_start_ptr == 0 && common->fast_forward_bc_ptr == NULL) { early_fail_ptr = 0; early_fail_type = type_skip; @@ -13661,9 +13661,11 @@ if (!common->private_data_ptrs) memset(common->private_data_ptrs, 0, total_length * sizeof(sljit_s32)); private_data_size = common->cbra_ptr + (re->top_bracket + 1) * sizeof(sljit_sw); -set_private_data_ptrs(common, &private_data_size, ccend); + if ((re->overall_options & PCRE2_ANCHORED) == 0 && (re->overall_options & PCRE2_NO_START_OPTIMIZE) == 0 && !common->has_skip_in_assert_back) - detect_early_fail(common, common->start, &private_data_size, 0, 0); + detect_early_fail(common, common->start, &private_data_size, 0, 0, TRUE); + +set_private_data_ptrs(common, &private_data_size, ccend); SLJIT_ASSERT(common->early_fail_start_ptr <= common->early_fail_end_ptr); @@ -14130,6 +14132,10 @@ PCRE2_EXP_DEFN int PCRE2_CALL_CONVENTION pcre2_jit_compile(pcre2_code *code, uint32_t options) { pcre2_real_code *re = (pcre2_real_code *)code; +#ifdef SUPPORT_JIT +executable_functions *functions; +static int executable_allocator_is_working = 0; +#endif if (code == NULL) return PCRE2_ERROR_NULL; @@ -14164,8 +14170,7 @@ actions are needed: */ #ifdef SUPPORT_JIT -executable_functions *functions = (executable_functions *)re->executable_jit; -static int executable_allocator_is_working = 0; +functions = (executable_functions *)re->executable_jit; #endif if ((options & PCRE2_JIT_INVALID_UTF) != 0) diff --git a/src/3rdparty/pcre2/src/pcre2_jit_simd_inc.h b/src/3rdparty/pcre2/src/pcre2_jit_simd_inc.h index 5673d338..aa029cce 100644 --- a/src/3rdparty/pcre2/src/pcre2_jit_simd_inc.h +++ b/src/3rdparty/pcre2/src/pcre2_jit_simd_inc.h @@ -39,7 +39,29 @@ POSSIBILITY OF SUCH DAMAGE. ----------------------------------------------------------------------------- */ -#if (defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86) && !(defined SUPPORT_VALGRIND) +#if !(defined SUPPORT_VALGRIND) + +#if ((defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86) \ + || (defined SLJIT_CONFIG_S390X && SLJIT_CONFIG_S390X)) + +typedef enum { + vector_compare_match1, + vector_compare_match1i, + vector_compare_match2, +} vector_compare_type; + +static SLJIT_INLINE sljit_u32 max_fast_forward_char_pair_offset(void) +{ +#if PCRE2_CODE_UNIT_WIDTH == 8 +return 15; +#elif PCRE2_CODE_UNIT_WIDTH == 16 +return 7; +#elif PCRE2_CODE_UNIT_WIDTH == 32 +return 3; +#else +#error "Unsupported unit width" +#endif +} #if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32 static struct sljit_jump *jump_if_utf_char_start(struct sljit_compiler *compiler, sljit_s32 reg) @@ -56,6 +78,10 @@ return CMP(SLJIT_NOT_EQUAL, reg, 0, SLJIT_IMM, 0xdc00); } #endif +#endif /* SLJIT_CONFIG_X86 || SLJIT_CONFIG_S390X */ + +#if (defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86) + static sljit_s32 character_to_int32(PCRE2_UCHAR chr) { sljit_u32 value = chr; @@ -97,13 +123,7 @@ instruction[4] = (sljit_u8)offset; sljit_emit_op_custom(compiler, instruction, 5); } -typedef enum { - sse2_compare_match1, - sse2_compare_match1i, - sse2_compare_match2, -} sse2_compare_type; - -static void fast_forward_char_pair_sse2_compare(struct sljit_compiler *compiler, sse2_compare_type compare_type, +static void fast_forward_char_pair_sse2_compare(struct sljit_compiler *compiler, vector_compare_type compare_type, int step, sljit_s32 dst_ind, sljit_s32 cmp1_ind, sljit_s32 cmp2_ind, sljit_s32 tmp_ind) { sljit_u8 instruction[4]; @@ -112,11 +132,11 @@ instruction[1] = 0x0f; SLJIT_ASSERT(step >= 0 && step <= 3); -if (compare_type != sse2_compare_match2) +if (compare_type != vector_compare_match2) { if (step == 0) { - if (compare_type == sse2_compare_match1i) + if (compare_type == vector_compare_match1i) { /* POR xmm1, xmm2/m128 */ /* instruction[0] = 0x66; */ @@ -185,14 +205,14 @@ switch (step) static void fast_forward_char_simd(compiler_common *common, PCRE2_UCHAR char1, PCRE2_UCHAR char2, sljit_s32 offset) { DEFINE_COMPILER; +sljit_u8 instruction[8]; struct sljit_label *start; #if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32 struct sljit_label *restart; #endif struct sljit_jump *quit; struct sljit_jump *partial_quit[2]; -sse2_compare_type compare_type = sse2_compare_match1; -sljit_u8 instruction[8]; +vector_compare_type compare_type = vector_compare_match1; sljit_s32 tmp1_reg_ind = sljit_get_register_index(TMP1); sljit_s32 str_ptr_reg_ind = sljit_get_register_index(STR_PTR); sljit_s32 data_ind = 0; @@ -207,12 +227,12 @@ SLJIT_UNUSED_ARG(offset); if (char1 != char2) { bit = char1 ^ char2; - compare_type = sse2_compare_match1i; + compare_type = vector_compare_match1i; if (!is_powerof2(bit)) { bit = 0; - compare_type = sse2_compare_match2; + compare_type = vector_compare_match2; } } @@ -349,11 +369,11 @@ if (common->utf && offset > 0) static jump_list *fast_requested_char_simd(compiler_common *common, PCRE2_UCHAR char1, PCRE2_UCHAR char2) { DEFINE_COMPILER; +sljit_u8 instruction[8]; struct sljit_label *start; struct sljit_jump *quit; jump_list *not_found = NULL; -sse2_compare_type compare_type = sse2_compare_match1; -sljit_u8 instruction[8]; +vector_compare_type compare_type = vector_compare_match1; sljit_s32 tmp1_reg_ind = sljit_get_register_index(TMP1); sljit_s32 str_ptr_reg_ind = sljit_get_register_index(STR_PTR); sljit_s32 data_ind = 0; @@ -366,12 +386,12 @@ int i; if (char1 != char2) { bit = char1 ^ char2; - compare_type = sse2_compare_match1i; + compare_type = vector_compare_match1i; if (!is_powerof2(bit)) { bit = 0; - compare_type = sse2_compare_match2; + compare_type = vector_compare_match2; } } @@ -476,27 +496,15 @@ return not_found; #ifndef _WIN64 -static SLJIT_INLINE sljit_u32 max_fast_forward_char_pair_offset(void) -{ -#if PCRE2_CODE_UNIT_WIDTH == 8 -return 15; -#elif PCRE2_CODE_UNIT_WIDTH == 16 -return 7; -#elif PCRE2_CODE_UNIT_WIDTH == 32 -return 3; -#else -#error "Unsupported unit width" -#endif -} - #define JIT_HAS_FAST_FORWARD_CHAR_PAIR_SIMD (sljit_has_cpu_feature(SLJIT_HAS_SSE2)) static void fast_forward_char_pair_simd(compiler_common *common, sljit_s32 offs1, PCRE2_UCHAR char1a, PCRE2_UCHAR char1b, sljit_s32 offs2, PCRE2_UCHAR char2a, PCRE2_UCHAR char2b) { DEFINE_COMPILER; -sse2_compare_type compare1_type = sse2_compare_match1; -sse2_compare_type compare2_type = sse2_compare_match1; +sljit_u8 instruction[8]; +vector_compare_type compare1_type = vector_compare_match1; +vector_compare_type compare2_type = vector_compare_match1; sljit_u32 bit1 = 0; sljit_u32 bit2 = 0; sljit_u32 diff = IN_UCHARS(offs1 - offs2); @@ -516,7 +524,6 @@ struct sljit_label *start; struct sljit_label *restart; #endif struct sljit_jump *jump[2]; -sljit_u8 instruction[8]; int i; SLJIT_ASSERT(common->mode == PCRE2_JIT_COMPLETE && offs1 > offs2); @@ -549,13 +556,13 @@ else bit1 = char1a ^ char1b; if (is_powerof2(bit1)) { - compare1_type = sse2_compare_match1i; + compare1_type = vector_compare_match1i; OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, character_to_int32(char1a | bit1)); OP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, character_to_int32(bit1)); } else { - compare1_type = sse2_compare_match2; + compare1_type = vector_compare_match2; bit1 = 0; OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, character_to_int32(char1a)); OP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, character_to_int32(char1b)); @@ -578,13 +585,13 @@ else bit2 = char2a ^ char2b; if (is_powerof2(bit2)) { - compare2_type = sse2_compare_match1i; + compare2_type = vector_compare_match1i; OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, character_to_int32(char2a | bit2)); OP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, character_to_int32(bit2)); } else { - compare2_type = sse2_compare_match2; + compare2_type = vector_compare_match2; bit2 = 0; OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, character_to_int32(char2a)); OP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, character_to_int32(char2b)); @@ -731,9 +738,6 @@ OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP1, 0); add_jump(compiler, &common->failed_match, CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0)); -if (common->match_end_ptr != 0) - OP1(SLJIT_MOV, STR_END, 0, SLJIT_MEM1(SLJIT_SP), common->match_end_ptr); - #if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32 if (common->utf) { @@ -760,7 +764,7 @@ if (common->match_end_ptr != 0) #undef SSE2_COMPARE_TYPE_INDEX -#endif /* SLJIT_CONFIG_X86 && !SUPPORT_VALGRIND */ +#endif /* SLJIT_CONFIG_X86 */ #if (defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64 && (defined __ARM_NEON || defined __ARM_NEON__)) @@ -1121,3 +1125,734 @@ JUMPHERE(partial_quit); } #endif /* SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64 */ + +#if (defined SLJIT_CONFIG_S390X && SLJIT_CONFIG_S390X) + +#if PCRE2_CODE_UNIT_WIDTH == 8 +#define VECTOR_ELEMENT_SIZE 0 +#elif PCRE2_CODE_UNIT_WIDTH == 16 +#define VECTOR_ELEMENT_SIZE 1 +#elif PCRE2_CODE_UNIT_WIDTH == 32 +#define VECTOR_ELEMENT_SIZE 2 +#else +#error "Unsupported unit width" +#endif + +static void load_from_mem_vector(struct sljit_compiler *compiler, BOOL vlbb, sljit_s32 dst_vreg, + sljit_s32 base_reg, sljit_s32 index_reg) +{ +sljit_u16 instruction[3]; + +instruction[0] = (sljit_u16)(0xe700 | (dst_vreg << 4) | index_reg); +instruction[1] = (sljit_u16)(base_reg << 12); +instruction[2] = (sljit_u16)((0x8 << 8) | (vlbb ? 0x07 : 0x06)); + +sljit_emit_op_custom(compiler, instruction, 6); +} + +#if PCRE2_CODE_UNIT_WIDTH == 32 + +static void replicate_imm_vector(struct sljit_compiler *compiler, int step, sljit_s32 dst_vreg, + PCRE2_UCHAR chr, sljit_s32 tmp_general_reg) +{ +sljit_u16 instruction[3]; + +SLJIT_ASSERT(step >= 0 && step <= 1); + +if (chr < 0x7fff) + { + if (step == 1) + return; + + /* VREPI */ + instruction[0] = (sljit_u16)(0xe700 | (dst_vreg << 4)); + instruction[1] = (sljit_u16)chr; + instruction[2] = (sljit_u16)((VECTOR_ELEMENT_SIZE << 12) | (0x8 << 8) | 0x45); + sljit_emit_op_custom(compiler, instruction, 6); + return; + } + +if (step == 0) + { + OP1(SLJIT_MOV, tmp_general_reg, 0, SLJIT_IMM, chr); + + /* VLVG */ + instruction[0] = (sljit_u16)(0xe700 | (dst_vreg << 4) | sljit_get_register_index(tmp_general_reg)); + instruction[1] = 0; + instruction[2] = (sljit_u16)((VECTOR_ELEMENT_SIZE << 12) | (0x8 << 8) | 0x22); + sljit_emit_op_custom(compiler, instruction, 6); + return; + } + +/* VREP */ +instruction[0] = (sljit_u16)(0xe700 | (dst_vreg << 4) | dst_vreg); +instruction[1] = 0; +instruction[2] = (sljit_u16)((VECTOR_ELEMENT_SIZE << 12) | (0xc << 8) | 0x4d); +sljit_emit_op_custom(compiler, instruction, 6); +} + +#endif + +static void fast_forward_char_pair_sse2_compare(struct sljit_compiler *compiler, vector_compare_type compare_type, + int step, sljit_s32 dst_ind, sljit_s32 cmp1_ind, sljit_s32 cmp2_ind, sljit_s32 tmp_ind) +{ +sljit_u16 instruction[3]; + +SLJIT_ASSERT(step >= 0 && step <= 2); + +if (step == 1) + { + /* VCEQ */ + instruction[0] = (sljit_u16)(0xe700 | (dst_ind << 4) | dst_ind); + instruction[1] = (sljit_u16)(cmp1_ind << 12); + instruction[2] = (sljit_u16)((VECTOR_ELEMENT_SIZE << 12) | (0xe << 8) | 0xf8); + sljit_emit_op_custom(compiler, instruction, 6); + return; + } + +if (compare_type != vector_compare_match2) + { + if (step == 0 && compare_type == vector_compare_match1i) + { + /* VO */ + instruction[0] = (sljit_u16)(0xe700 | (dst_ind << 4) | dst_ind); + instruction[1] = (sljit_u16)(cmp2_ind << 12); + instruction[2] = (sljit_u16)((0xe << 8) | 0x6a); + sljit_emit_op_custom(compiler, instruction, 6); + } + return; + } + +switch (step) + { + case 0: + /* VCEQ */ + instruction[0] = (sljit_u16)(0xe700 | (tmp_ind << 4) | dst_ind); + instruction[1] = (sljit_u16)(cmp2_ind << 12); + instruction[2] = (sljit_u16)((VECTOR_ELEMENT_SIZE << 12) | (0xe << 8) | 0xf8); + sljit_emit_op_custom(compiler, instruction, 6); + return; + + case 2: + /* VO */ + instruction[0] = (sljit_u16)(0xe700 | (dst_ind << 4) | dst_ind); + instruction[1] = (sljit_u16)(tmp_ind << 12); + instruction[2] = (sljit_u16)((0xe << 8) | 0x6a); + sljit_emit_op_custom(compiler, instruction, 6); + return; + } +} + +#define JIT_HAS_FAST_FORWARD_CHAR_SIMD 1 + +static void fast_forward_char_simd(compiler_common *common, PCRE2_UCHAR char1, PCRE2_UCHAR char2, sljit_s32 offset) +{ +DEFINE_COMPILER; +sljit_u16 instruction[3]; +struct sljit_label *start; +#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32 +struct sljit_label *restart; +#endif +struct sljit_jump *quit; +struct sljit_jump *partial_quit[2]; +vector_compare_type compare_type = vector_compare_match1; +sljit_s32 tmp1_reg_ind = sljit_get_register_index(TMP1); +sljit_s32 str_ptr_reg_ind = sljit_get_register_index(STR_PTR); +sljit_s32 data_ind = 0; +sljit_s32 tmp_ind = 1; +sljit_s32 cmp1_ind = 2; +sljit_s32 cmp2_ind = 3; +sljit_s32 zero_ind = 4; +sljit_u32 bit = 0; +int i; + +SLJIT_UNUSED_ARG(offset); + +if (char1 != char2) + { + bit = char1 ^ char2; + compare_type = vector_compare_match1i; + + if (!is_powerof2(bit)) + { + bit = 0; + compare_type = vector_compare_match2; + } + } + +partial_quit[0] = CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0); +if (common->mode == PCRE2_JIT_COMPLETE) + add_jump(compiler, &common->failed_match, partial_quit[0]); + +/* First part (unaligned start) */ + +OP2(SLJIT_ADD, TMP2, 0, STR_PTR, 0, SLJIT_IMM, 16); + +#if PCRE2_CODE_UNIT_WIDTH != 32 + +/* VREPI */ +instruction[0] = (sljit_u16)(0xe700 | (cmp1_ind << 4)); +instruction[1] = (sljit_u16)(char1 | bit); +instruction[2] = (sljit_u16)((VECTOR_ELEMENT_SIZE << 12) | (0x8 << 8) | 0x45); +sljit_emit_op_custom(compiler, instruction, 6); + +if (char1 != char2) + { + /* VREPI */ + instruction[0] = (sljit_u16)(0xe700 | (cmp2_ind << 4)); + instruction[1] = (sljit_u16)(bit != 0 ? bit : char2); + /* instruction[2] = (sljit_u16)((VECTOR_ELEMENT_SIZE << 12) | (0x8 << 8) | 0x45); */ + sljit_emit_op_custom(compiler, instruction, 6); + } + +#else /* PCRE2_CODE_UNIT_WIDTH == 32 */ + +for (int i = 0; i < 2; i++) + { + replicate_imm_vector(compiler, i, cmp1_ind, char1 | bit, TMP1); + + if (char1 != char2) + replicate_imm_vector(compiler, i, cmp2_ind, bit != 0 ? bit : char2, TMP1); + } + +#endif /* PCRE2_CODE_UNIT_WIDTH != 32 */ + +if (compare_type == vector_compare_match2) + { + /* VREPI */ + instruction[0] = (sljit_u16)(0xe700 | (zero_ind << 4)); + instruction[1] = 0; + instruction[2] = (sljit_u16)((0x8 << 8) | 0x45); + sljit_emit_op_custom(compiler, instruction, 6); + } + +#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32 +restart = LABEL(); +#endif + +load_from_mem_vector(compiler, TRUE, data_ind, str_ptr_reg_ind, 0); +OP2(SLJIT_AND, TMP2, 0, TMP2, 0, SLJIT_IMM, ~15); + +if (compare_type != vector_compare_match2) + { + if (compare_type == vector_compare_match1i) + fast_forward_char_pair_sse2_compare(compiler, compare_type, 0, data_ind, cmp1_ind, cmp2_ind, tmp_ind); + + /* VFEE */ + instruction[0] = (sljit_u16)(0xe700 | (data_ind << 4) | data_ind); + instruction[1] = (sljit_u16)((cmp1_ind << 12) | (1 << 4)); + instruction[2] = (sljit_u16)((VECTOR_ELEMENT_SIZE << 12) | (0xe << 8) | 0x80); + sljit_emit_op_custom(compiler, instruction, 6); + } +else + { + for (i = 0; i < 3; i++) + fast_forward_char_pair_sse2_compare(compiler, compare_type, i, data_ind, cmp1_ind, cmp2_ind, tmp_ind); + + /* VFENE */ + instruction[0] = (sljit_u16)(0xe700 | (data_ind << 4) | data_ind); + instruction[1] = (sljit_u16)((zero_ind << 12) | (1 << 4)); + instruction[2] = (sljit_u16)((0xe << 8) | 0x81); + sljit_emit_op_custom(compiler, instruction, 6); + } + +/* VLGVB */ +instruction[0] = (sljit_u16)(0xe700 | (tmp1_reg_ind << 4) | data_ind); +instruction[1] = 7; +instruction[2] = (sljit_u16)((0x4 << 8) | 0x21); +sljit_emit_op_custom(compiler, instruction, 6); + +OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP1, 0); +quit = CMP(SLJIT_LESS, STR_PTR, 0, TMP2, 0); + +OP2(SLJIT_SUB, STR_PTR, 0, TMP2, 0, SLJIT_IMM, 16); + +/* Second part (aligned) */ +start = LABEL(); + +OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, 16); + +partial_quit[1] = CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0); +if (common->mode == PCRE2_JIT_COMPLETE) + add_jump(compiler, &common->failed_match, partial_quit[1]); + +load_from_mem_vector(compiler, TRUE, data_ind, str_ptr_reg_ind, 0); + +if (compare_type != vector_compare_match2) + { + if (compare_type == vector_compare_match1i) + fast_forward_char_pair_sse2_compare(compiler, compare_type, 0, data_ind, cmp1_ind, cmp2_ind, tmp_ind); + + /* VFEE */ + instruction[0] = (sljit_u16)(0xe700 | (data_ind << 4) | data_ind); + instruction[1] = (sljit_u16)((cmp1_ind << 12) | (1 << 4)); + instruction[2] = (sljit_u16)((VECTOR_ELEMENT_SIZE << 12) | (0xe << 8) | 0x80); + sljit_emit_op_custom(compiler, instruction, 6); + } +else + { + for (i = 0; i < 3; i++) + fast_forward_char_pair_sse2_compare(compiler, compare_type, i, data_ind, cmp1_ind, cmp2_ind, tmp_ind); + + /* VFENE */ + instruction[0] = (sljit_u16)(0xe700 | (data_ind << 4) | data_ind); + instruction[1] = (sljit_u16)((zero_ind << 12) | (1 << 4)); + instruction[2] = (sljit_u16)((0xe << 8) | 0x81); + sljit_emit_op_custom(compiler, instruction, 6); + } + +sljit_set_current_flags(compiler, SLJIT_SET_OVERFLOW); +JUMPTO(SLJIT_OVERFLOW, start); + +/* VLGVB */ +instruction[0] = (sljit_u16)(0xe700 | (tmp1_reg_ind << 4) | data_ind); +instruction[1] = 7; +instruction[2] = (sljit_u16)((0x4 << 8) | 0x21); +sljit_emit_op_custom(compiler, instruction, 6); + +OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP1, 0); + +JUMPHERE(quit); + +if (common->mode != PCRE2_JIT_COMPLETE) + { + JUMPHERE(partial_quit[0]); + JUMPHERE(partial_quit[1]); + OP2(SLJIT_SUB | SLJIT_SET_GREATER, SLJIT_UNUSED, 0, STR_PTR, 0, STR_END, 0); + CMOV(SLJIT_GREATER, STR_PTR, STR_END, 0); + } +else + add_jump(compiler, &common->failed_match, CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0)); + +#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32 +if (common->utf && offset > 0) + { + SLJIT_ASSERT(common->mode == PCRE2_JIT_COMPLETE); + + OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(-offset)); + + quit = jump_if_utf_char_start(compiler, TMP1); + + OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); + add_jump(compiler, &common->failed_match, CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0)); + + OP2(SLJIT_ADD, TMP2, 0, STR_PTR, 0, SLJIT_IMM, 16); + JUMPTO(SLJIT_JUMP, restart); + + JUMPHERE(quit); + } +#endif +} + +#define JIT_HAS_FAST_REQUESTED_CHAR_SIMD 1 + +static jump_list *fast_requested_char_simd(compiler_common *common, PCRE2_UCHAR char1, PCRE2_UCHAR char2) +{ +DEFINE_COMPILER; +sljit_u16 instruction[3]; +struct sljit_label *start; +struct sljit_jump *quit; +jump_list *not_found = NULL; +vector_compare_type compare_type = vector_compare_match1; +sljit_s32 tmp1_reg_ind = sljit_get_register_index(TMP1); +sljit_s32 tmp3_reg_ind = sljit_get_register_index(TMP3); +sljit_s32 data_ind = 0; +sljit_s32 tmp_ind = 1; +sljit_s32 cmp1_ind = 2; +sljit_s32 cmp2_ind = 3; +sljit_s32 zero_ind = 4; +sljit_u32 bit = 0; +int i; + +if (char1 != char2) + { + bit = char1 ^ char2; + compare_type = vector_compare_match1i; + + if (!is_powerof2(bit)) + { + bit = 0; + compare_type = vector_compare_match2; + } + } + +add_jump(compiler, ¬_found, CMP(SLJIT_GREATER_EQUAL, TMP1, 0, STR_END, 0)); + +/* First part (unaligned start) */ + +OP2(SLJIT_ADD, TMP2, 0, TMP1, 0, SLJIT_IMM, 16); + +#if PCRE2_CODE_UNIT_WIDTH != 32 + +/* VREPI */ +instruction[0] = (sljit_u16)(0xe700 | (cmp1_ind << 4)); +instruction[1] = (sljit_u16)(char1 | bit); +instruction[2] = (sljit_u16)((VECTOR_ELEMENT_SIZE << 12) | (0x8 << 8) | 0x45); +sljit_emit_op_custom(compiler, instruction, 6); + +if (char1 != char2) + { + /* VREPI */ + instruction[0] = (sljit_u16)(0xe700 | (cmp2_ind << 4)); + instruction[1] = (sljit_u16)(bit != 0 ? bit : char2); + /* instruction[2] = (sljit_u16)((VECTOR_ELEMENT_SIZE << 12) | (0x8 << 8) | 0x45); */ + sljit_emit_op_custom(compiler, instruction, 6); + } + +#else /* PCRE2_CODE_UNIT_WIDTH == 32 */ + +for (int i = 0; i < 2; i++) + { + replicate_imm_vector(compiler, i, cmp1_ind, char1 | bit, TMP3); + + if (char1 != char2) + replicate_imm_vector(compiler, i, cmp2_ind, bit != 0 ? bit : char2, TMP3); + } + +#endif /* PCRE2_CODE_UNIT_WIDTH != 32 */ + +if (compare_type == vector_compare_match2) + { + /* VREPI */ + instruction[0] = (sljit_u16)(0xe700 | (zero_ind << 4)); + instruction[1] = 0; + instruction[2] = (sljit_u16)((0x8 << 8) | 0x45); + sljit_emit_op_custom(compiler, instruction, 6); + } + +load_from_mem_vector(compiler, TRUE, data_ind, tmp1_reg_ind, 0); +OP2(SLJIT_AND, TMP2, 0, TMP2, 0, SLJIT_IMM, ~15); + +if (compare_type != vector_compare_match2) + { + if (compare_type == vector_compare_match1i) + fast_forward_char_pair_sse2_compare(compiler, compare_type, 0, data_ind, cmp1_ind, cmp2_ind, tmp_ind); + + /* VFEE */ + instruction[0] = (sljit_u16)(0xe700 | (data_ind << 4) | data_ind); + instruction[1] = (sljit_u16)((cmp1_ind << 12) | (1 << 4)); + instruction[2] = (sljit_u16)((VECTOR_ELEMENT_SIZE << 12) | (0xe << 8) | 0x80); + sljit_emit_op_custom(compiler, instruction, 6); + } +else + { + for (i = 0; i < 3; i++) + fast_forward_char_pair_sse2_compare(compiler, compare_type, i, data_ind, cmp1_ind, cmp2_ind, tmp_ind); + + /* VFENE */ + instruction[0] = (sljit_u16)(0xe700 | (data_ind << 4) | data_ind); + instruction[1] = (sljit_u16)((zero_ind << 12) | (1 << 4)); + instruction[2] = (sljit_u16)((0xe << 8) | 0x81); + sljit_emit_op_custom(compiler, instruction, 6); + } + +/* VLGVB */ +instruction[0] = (sljit_u16)(0xe700 | (tmp3_reg_ind << 4) | data_ind); +instruction[1] = 7; +instruction[2] = (sljit_u16)((0x4 << 8) | 0x21); +sljit_emit_op_custom(compiler, instruction, 6); + +OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, TMP3, 0); +quit = CMP(SLJIT_LESS, TMP1, 0, TMP2, 0); + +OP2(SLJIT_SUB, TMP1, 0, TMP2, 0, SLJIT_IMM, 16); + +/* Second part (aligned) */ +start = LABEL(); + +OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, SLJIT_IMM, 16); + +add_jump(compiler, ¬_found, CMP(SLJIT_GREATER_EQUAL, TMP1, 0, STR_END, 0)); + +load_from_mem_vector(compiler, TRUE, data_ind, tmp1_reg_ind, 0); + +if (compare_type != vector_compare_match2) + { + if (compare_type == vector_compare_match1i) + fast_forward_char_pair_sse2_compare(compiler, compare_type, 0, data_ind, cmp1_ind, cmp2_ind, tmp_ind); + + /* VFEE */ + instruction[0] = (sljit_u16)(0xe700 | (data_ind << 4) | data_ind); + instruction[1] = (sljit_u16)((cmp1_ind << 12) | (1 << 4)); + instruction[2] = (sljit_u16)((VECTOR_ELEMENT_SIZE << 12) | (0xe << 8) | 0x80); + sljit_emit_op_custom(compiler, instruction, 6); + } +else + { + for (i = 0; i < 3; i++) + fast_forward_char_pair_sse2_compare(compiler, compare_type, i, data_ind, cmp1_ind, cmp2_ind, tmp_ind); + + /* VFENE */ + instruction[0] = (sljit_u16)(0xe700 | (data_ind << 4) | data_ind); + instruction[1] = (sljit_u16)((zero_ind << 12) | (1 << 4)); + instruction[2] = (sljit_u16)((0xe << 8) | 0x81); + sljit_emit_op_custom(compiler, instruction, 6); + } + +sljit_set_current_flags(compiler, SLJIT_SET_OVERFLOW); +JUMPTO(SLJIT_OVERFLOW, start); + +/* VLGVB */ +instruction[0] = (sljit_u16)(0xe700 | (tmp3_reg_ind << 4) | data_ind); +instruction[1] = 7; +instruction[2] = (sljit_u16)((0x4 << 8) | 0x21); +sljit_emit_op_custom(compiler, instruction, 6); + +OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, TMP3, 0); + +JUMPHERE(quit); +add_jump(compiler, ¬_found, CMP(SLJIT_GREATER_EQUAL, TMP1, 0, STR_END, 0)); + +return not_found; +} + +#define JIT_HAS_FAST_FORWARD_CHAR_PAIR_SIMD 1 + +static void fast_forward_char_pair_simd(compiler_common *common, sljit_s32 offs1, + PCRE2_UCHAR char1a, PCRE2_UCHAR char1b, sljit_s32 offs2, PCRE2_UCHAR char2a, PCRE2_UCHAR char2b) +{ +DEFINE_COMPILER; +sljit_u16 instruction[3]; +struct sljit_label *start; +#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32 +struct sljit_label *restart; +#endif +struct sljit_jump *quit; +struct sljit_jump *jump[2]; +vector_compare_type compare1_type = vector_compare_match1; +vector_compare_type compare2_type = vector_compare_match1; +sljit_u32 bit1 = 0; +sljit_u32 bit2 = 0; +sljit_s32 diff = IN_UCHARS(offs2 - offs1); +sljit_s32 tmp1_reg_ind = sljit_get_register_index(TMP1); +sljit_s32 tmp2_reg_ind = sljit_get_register_index(TMP2); +sljit_s32 str_ptr_reg_ind = sljit_get_register_index(STR_PTR); +sljit_s32 data1_ind = 0; +sljit_s32 data2_ind = 1; +sljit_s32 tmp1_ind = 2; +sljit_s32 tmp2_ind = 3; +sljit_s32 cmp1a_ind = 4; +sljit_s32 cmp1b_ind = 5; +sljit_s32 cmp2a_ind = 6; +sljit_s32 cmp2b_ind = 7; +sljit_s32 zero_ind = 8; +int i; + +SLJIT_ASSERT(common->mode == PCRE2_JIT_COMPLETE && offs1 > offs2); +SLJIT_ASSERT(-diff <= (sljit_s32)IN_UCHARS(max_fast_forward_char_pair_offset())); +SLJIT_ASSERT(tmp1_reg_ind != 0 && tmp2_reg_ind != 0); + +if (char1a != char1b) + { + bit1 = char1a ^ char1b; + compare1_type = vector_compare_match1i; + + if (!is_powerof2(bit1)) + { + bit1 = 0; + compare1_type = vector_compare_match2; + } + } + +if (char2a != char2b) + { + bit2 = char2a ^ char2b; + compare2_type = vector_compare_match1i; + + if (!is_powerof2(bit2)) + { + bit2 = 0; + compare2_type = vector_compare_match2; + } + } + +/* Initialize. */ +if (common->match_end_ptr != 0) + { + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), common->match_end_ptr); + OP1(SLJIT_MOV, TMP3, 0, STR_END, 0); + OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, SLJIT_IMM, IN_UCHARS(offs1 + 1)); + + OP2(SLJIT_SUB | SLJIT_SET_LESS, SLJIT_UNUSED, 0, TMP1, 0, STR_END, 0); + CMOV(SLJIT_LESS, STR_END, TMP1, 0); + } + +OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(offs1)); +add_jump(compiler, &common->failed_match, CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0)); +OP2(SLJIT_AND, TMP2, 0, STR_PTR, 0, SLJIT_IMM, ~15); + +#if PCRE2_CODE_UNIT_WIDTH != 32 + +OP2(SLJIT_SUB, TMP1, 0, STR_PTR, 0, SLJIT_IMM, -diff); + +/* VREPI */ +instruction[0] = (sljit_u16)(0xe700 | (cmp1a_ind << 4)); +instruction[1] = (sljit_u16)(char1a | bit1); +instruction[2] = (sljit_u16)((VECTOR_ELEMENT_SIZE << 12) | (0x8 << 8) | 0x45); +sljit_emit_op_custom(compiler, instruction, 6); + +if (char1a != char1b) + { + /* VREPI */ + instruction[0] = (sljit_u16)(0xe700 | (cmp1b_ind << 4)); + instruction[1] = (sljit_u16)(bit1 != 0 ? bit1 : char1b); + /* instruction[2] = (sljit_u16)((VECTOR_ELEMENT_SIZE << 12) | (0x8 << 8) | 0x45); */ + sljit_emit_op_custom(compiler, instruction, 6); + } + +/* VREPI */ +instruction[0] = (sljit_u16)(0xe700 | (cmp2a_ind << 4)); +instruction[1] = (sljit_u16)(char2a | bit2); +/* instruction[2] = (sljit_u16)((VECTOR_ELEMENT_SIZE << 12) | (0x8 << 8) | 0x45); */ +sljit_emit_op_custom(compiler, instruction, 6); + +if (char2a != char2b) + { + /* VREPI */ + instruction[0] = (sljit_u16)(0xe700 | (cmp2b_ind << 4)); + instruction[1] = (sljit_u16)(bit2 != 0 ? bit2 : char2b); + /* instruction[2] = (sljit_u16)((VECTOR_ELEMENT_SIZE << 12) | (0x8 << 8) | 0x45); */ + sljit_emit_op_custom(compiler, instruction, 6); + } + +#else /* PCRE2_CODE_UNIT_WIDTH == 32 */ + +for (int i = 0; i < 2; i++) + { + replicate_imm_vector(compiler, i, cmp1a_ind, char1a | bit1, TMP1); + + if (char1a != char1b) + replicate_imm_vector(compiler, i, cmp1b_ind, bit1 != 0 ? bit1 : char1b, TMP1); + + replicate_imm_vector(compiler, i, cmp2a_ind, char2a | bit2, TMP1); + + if (char2a != char2b) + replicate_imm_vector(compiler, i, cmp2b_ind, bit2 != 0 ? bit2 : char2b, TMP1); + } + +OP2(SLJIT_SUB, TMP1, 0, STR_PTR, 0, SLJIT_IMM, -diff); + +#endif /* PCRE2_CODE_UNIT_WIDTH != 32 */ + +/* VREPI */ +instruction[0] = (sljit_u16)(0xe700 | (zero_ind << 4)); +instruction[1] = 0; +instruction[2] = (sljit_u16)((0x8 << 8) | 0x45); +sljit_emit_op_custom(compiler, instruction, 6); + +#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32 +restart = LABEL(); +#endif + +jump[0] = CMP(SLJIT_LESS, TMP1, 0, TMP2, 0); +load_from_mem_vector(compiler, TRUE, data2_ind, tmp1_reg_ind, 0); +jump[1] = JUMP(SLJIT_JUMP); +JUMPHERE(jump[0]); +load_from_mem_vector(compiler, FALSE, data2_ind, tmp1_reg_ind, 0); +JUMPHERE(jump[1]); + +load_from_mem_vector(compiler, TRUE, data1_ind, str_ptr_reg_ind, 0); +OP2(SLJIT_ADD, TMP2, 0, TMP2, 0, SLJIT_IMM, 16); + +for (i = 0; i < 3; i++) + { + fast_forward_char_pair_sse2_compare(compiler, compare1_type, i, data1_ind, cmp1a_ind, cmp1b_ind, tmp1_ind); + fast_forward_char_pair_sse2_compare(compiler, compare2_type, i, data2_ind, cmp2a_ind, cmp2b_ind, tmp2_ind); + } + +/* VN */ +instruction[0] = (sljit_u16)(0xe700 | (data1_ind << 4) | data1_ind); +instruction[1] = (sljit_u16)(data2_ind << 12); +instruction[2] = (sljit_u16)((0xe << 8) | 0x68); +sljit_emit_op_custom(compiler, instruction, 6); + +/* VFENE */ +instruction[0] = (sljit_u16)(0xe700 | (data1_ind << 4) | data1_ind); +instruction[1] = (sljit_u16)((zero_ind << 12) | (1 << 4)); +instruction[2] = (sljit_u16)((0xe << 8) | 0x81); +sljit_emit_op_custom(compiler, instruction, 6); + +/* VLGVB */ +instruction[0] = (sljit_u16)(0xe700 | (tmp1_reg_ind << 4) | data1_ind); +instruction[1] = 7; +instruction[2] = (sljit_u16)((0x4 << 8) | 0x21); +sljit_emit_op_custom(compiler, instruction, 6); + +OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP1, 0); +quit = CMP(SLJIT_LESS, STR_PTR, 0, TMP2, 0); + +OP2(SLJIT_SUB, STR_PTR, 0, TMP2, 0, SLJIT_IMM, 16); +OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, diff); + +/* Main loop. */ +start = LABEL(); + +OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, 16); +add_jump(compiler, &common->failed_match, CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0)); + +load_from_mem_vector(compiler, FALSE, data1_ind, str_ptr_reg_ind, 0); +load_from_mem_vector(compiler, FALSE, data2_ind, str_ptr_reg_ind, tmp1_reg_ind); + +for (i = 0; i < 3; i++) + { + fast_forward_char_pair_sse2_compare(compiler, compare1_type, i, data1_ind, cmp1a_ind, cmp1b_ind, tmp1_ind); + fast_forward_char_pair_sse2_compare(compiler, compare2_type, i, data2_ind, cmp2a_ind, cmp2b_ind, tmp2_ind); + } + +/* VN */ +instruction[0] = (sljit_u16)(0xe700 | (data1_ind << 4) | data1_ind); +instruction[1] = (sljit_u16)(data2_ind << 12); +instruction[2] = (sljit_u16)((0xe << 8) | 0x68); +sljit_emit_op_custom(compiler, instruction, 6); + +/* VFENE */ +instruction[0] = (sljit_u16)(0xe700 | (data1_ind << 4) | data1_ind); +instruction[1] = (sljit_u16)((zero_ind << 12) | (1 << 4)); +instruction[2] = (sljit_u16)((0xe << 8) | 0x81); +sljit_emit_op_custom(compiler, instruction, 6); + +sljit_set_current_flags(compiler, SLJIT_SET_OVERFLOW); +JUMPTO(SLJIT_OVERFLOW, start); + +/* VLGVB */ +instruction[0] = (sljit_u16)(0xe700 | (tmp2_reg_ind << 4) | data1_ind); +instruction[1] = 7; +instruction[2] = (sljit_u16)((0x4 << 8) | 0x21); +sljit_emit_op_custom(compiler, instruction, 6); + +OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP2, 0); + +JUMPHERE(quit); + +add_jump(compiler, &common->failed_match, CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0)); + +#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32 +if (common->utf) + { + SLJIT_ASSERT(common->mode == PCRE2_JIT_COMPLETE); + + OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(-offs1)); + + quit = jump_if_utf_char_start(compiler, TMP1); + + OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); + add_jump(compiler, &common->failed_match, CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0)); + + /* TMP1 contains diff. */ + OP2(SLJIT_AND, TMP2, 0, STR_PTR, 0, SLJIT_IMM, ~15); + OP2(SLJIT_SUB, TMP1, 0, STR_PTR, 0, SLJIT_IMM, -diff); + JUMPTO(SLJIT_JUMP, restart); + + JUMPHERE(quit); + } +#endif + +OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(offs1)); + +if (common->match_end_ptr != 0) + OP1(SLJIT_MOV, STR_END, 0, TMP3, 0); +} + +#endif /* SLJIT_CONFIG_S390X */ + +#endif /* !SUPPORT_VALGRIND */ diff --git a/src/3rdparty/pcre2/src/pcre2_match.c b/src/3rdparty/pcre2/src/pcre2_match.c index e3f78c2c..f28cdbb4 100644 --- a/src/3rdparty/pcre2/src/pcre2_match.c +++ b/src/3rdparty/pcre2/src/pcre2_match.c @@ -7,7 +7,7 @@ and semantics are as close as possible to those of the Perl 5 language. Written by Philip Hazel Original API code Copyright (c) 1997-2012 University of Cambridge - New API code Copyright (c) 2015-2020 University of Cambridge + New API code Copyright (c) 2015-2021 University of Cambridge ----------------------------------------------------------------------------- Redistribution and use in source and binary forms, with or without @@ -818,10 +818,12 @@ fprintf(stderr, "++ op=%d\n", *Fecode); /* N is now the frame of the recursion; the previous frame is at the OP_RECURSE position. Go back there, copying the current subject position - and mark, and move on past the OP_RECURSE. */ + and mark, and the start_match position (\K might have changed it), and + then move on past the OP_RECURSE. */ P->eptr = Feptr; P->mark = Fmark; + P->start_match = Fstart_match; F = P; Fecode += 1 + LINK_SIZE; continue; @@ -6115,8 +6117,8 @@ BOOL has_req_cu = FALSE; BOOL startline; #if PCRE2_CODE_UNIT_WIDTH == 8 -BOOL memchr_not_found_first_cu; -BOOL memchr_not_found_first_cu2; +PCRE2_SPTR memchr_found_first_cu; +PCRE2_SPTR memchr_found_first_cu2; #endif PCRE2_UCHAR first_cu = 0; @@ -6710,8 +6712,8 @@ start_partial = match_partial = NULL; mb->hitend = FALSE; #if PCRE2_CODE_UNIT_WIDTH == 8 -memchr_not_found_first_cu = FALSE; -memchr_not_found_first_cu2 = FALSE; +memchr_found_first_cu = NULL; +memchr_found_first_cu2 = NULL; #endif for(;;) @@ -6780,13 +6782,7 @@ for(;;) } } - /* Not anchored. Advance to a unique first code unit if there is one. In - 8-bit mode, the use of memchr() gives a big speed up, even though we have - to call it twice in caseless mode, in order to find the earliest occurrence - of the character in either of its cases. If a call to memchr() that - searches the rest of the subject fails to find one case, remember that in - order not to keep on repeating the search. This can make a huge difference - when the strings are very long and only one case is present. */ + /* Not anchored. Advance to a unique first code unit if there is one. */ else { @@ -6794,43 +6790,68 @@ for(;;) { if (first_cu != first_cu2) /* Caseless */ { + /* In 16-bit and 32_bit modes we have to do our own search, so can + look for both cases at once. */ + #if PCRE2_CODE_UNIT_WIDTH != 8 PCRE2_UCHAR smc; while (start_match < end_subject && (smc = UCHAR21TEST(start_match)) != first_cu && - smc != first_cu2) + smc != first_cu2) start_match++; +#else + /* In 8-bit mode, the use of memchr() gives a big speed up, even + though we have to call it twice in order to find the earliest + occurrence of the code unit in either of its cases. Caching is used + to remember the positions of previously found code units. This can + make a huge difference when the strings are very long and only one + case is actually present. */ -#else /* 8-bit code units */ PCRE2_SPTR pp1 = NULL; PCRE2_SPTR pp2 = NULL; - PCRE2_SIZE cu2size = end_subject - start_match; + PCRE2_SIZE searchlength = end_subject - start_match; - if (!memchr_not_found_first_cu) + /* If we haven't got a previously found position for first_cu, or if + the current starting position is later, we need to do a search. If + the code unit is not found, set it to the end. */ + + if (memchr_found_first_cu == NULL || + start_match > memchr_found_first_cu) { - pp1 = memchr(start_match, first_cu, end_subject - start_match); - if (pp1 == NULL) memchr_not_found_first_cu = TRUE; - else cu2size = pp1 - start_match; + pp1 = memchr(start_match, first_cu, searchlength); + memchr_found_first_cu = (pp1 == NULL)? end_subject : pp1; } - /* If pp1 is not NULL, we have arranged to search only as far as pp1, - to see if the other case is earlier, so we can set "not found" only - when both searches have returned NULL. */ + /* If the start is before a previously found position, use the + previous position, or NULL if a previous search failed. */ - if (!memchr_not_found_first_cu2) + else pp1 = (memchr_found_first_cu == end_subject)? NULL : + memchr_found_first_cu; + + /* Do the same thing for the other case. */ + + if (memchr_found_first_cu2 == NULL || + start_match > memchr_found_first_cu2) { - pp2 = memchr(start_match, first_cu2, cu2size); - memchr_not_found_first_cu2 = (pp2 == NULL && pp1 == NULL); + pp2 = memchr(start_match, first_cu2, searchlength); + memchr_found_first_cu2 = (pp2 == NULL)? end_subject : pp2; } + else pp2 = (memchr_found_first_cu2 == end_subject)? NULL : + memchr_found_first_cu2; + + /* Set the start to the end of the subject if neither case was found. + Otherwise, use the earlier found point. */ + if (pp1 == NULL) start_match = (pp2 == NULL)? end_subject : pp2; else start_match = (pp2 == NULL || pp1 < pp2)? pp1 : pp2; -#endif + +#endif /* 8-bit handling */ } - /* The caseful case */ + /* The caseful case is much simpler. */ else { diff --git a/src/3rdparty/pcre2/src/pcre2_tables.c b/src/3rdparty/pcre2/src/pcre2_tables.c index b10de45e..c164e976 100644 --- a/src/3rdparty/pcre2/src/pcre2_tables.c +++ b/src/3rdparty/pcre2/src/pcre2_tables.c @@ -273,6 +273,7 @@ strings to make sure that UTF-8 support works on EBCDIC platforms. */ #define STRING_Cs0 STR_C STR_s "\0" #define STRING_Cuneiform0 STR_C STR_u STR_n STR_e STR_i STR_f STR_o STR_r STR_m "\0" #define STRING_Cypriot0 STR_C STR_y STR_p STR_r STR_i STR_o STR_t "\0" +#define STRING_Cypro_Minoan0 STR_C STR_y STR_p STR_r STR_o STR_UNDERSCORE STR_M STR_i STR_n STR_o STR_a STR_n "\0" #define STRING_Cyrillic0 STR_C STR_y STR_r STR_i STR_l STR_l STR_i STR_c "\0" #define STRING_Deseret0 STR_D STR_e STR_s STR_e STR_r STR_e STR_t "\0" #define STRING_Devanagari0 STR_D STR_e STR_v STR_a STR_n STR_a STR_g STR_a STR_r STR_i "\0" @@ -371,6 +372,7 @@ strings to make sure that UTF-8 support works on EBCDIC platforms. */ #define STRING_Old_Sogdian0 STR_O STR_l STR_d STR_UNDERSCORE STR_S STR_o STR_g STR_d STR_i STR_a STR_n "\0" #define STRING_Old_South_Arabian0 STR_O STR_l STR_d STR_UNDERSCORE STR_S STR_o STR_u STR_t STR_h STR_UNDERSCORE STR_A STR_r STR_a STR_b STR_i STR_a STR_n "\0" #define STRING_Old_Turkic0 STR_O STR_l STR_d STR_UNDERSCORE STR_T STR_u STR_r STR_k STR_i STR_c "\0" +#define STRING_Old_Uyghur0 STR_O STR_l STR_d STR_UNDERSCORE STR_U STR_y STR_g STR_h STR_u STR_r "\0" #define STRING_Oriya0 STR_O STR_r STR_i STR_y STR_a "\0" #define STRING_Osage0 STR_O STR_s STR_a STR_g STR_e "\0" #define STRING_Osmanya0 STR_O STR_s STR_m STR_a STR_n STR_y STR_a "\0" @@ -415,6 +417,7 @@ strings to make sure that UTF-8 support works on EBCDIC platforms. */ #define STRING_Tai_Viet0 STR_T STR_a STR_i STR_UNDERSCORE STR_V STR_i STR_e STR_t "\0" #define STRING_Takri0 STR_T STR_a STR_k STR_r STR_i "\0" #define STRING_Tamil0 STR_T STR_a STR_m STR_i STR_l "\0" +#define STRING_Tangsa0 STR_T STR_a STR_n STR_g STR_s STR_a "\0" #define STRING_Tangut0 STR_T STR_a STR_n STR_g STR_u STR_t "\0" #define STRING_Telugu0 STR_T STR_e STR_l STR_u STR_g STR_u "\0" #define STRING_Thaana0 STR_T STR_h STR_a STR_a STR_n STR_a "\0" @@ -422,9 +425,11 @@ strings to make sure that UTF-8 support works on EBCDIC platforms. */ #define STRING_Tibetan0 STR_T STR_i STR_b STR_e STR_t STR_a STR_n "\0" #define STRING_Tifinagh0 STR_T STR_i STR_f STR_i STR_n STR_a STR_g STR_h "\0" #define STRING_Tirhuta0 STR_T STR_i STR_r STR_h STR_u STR_t STR_a "\0" +#define STRING_Toto0 STR_T STR_o STR_t STR_o "\0" #define STRING_Ugaritic0 STR_U STR_g STR_a STR_r STR_i STR_t STR_i STR_c "\0" #define STRING_Unknown0 STR_U STR_n STR_k STR_n STR_o STR_w STR_n "\0" #define STRING_Vai0 STR_V STR_a STR_i "\0" +#define STRING_Vithkuqi0 STR_V STR_i STR_t STR_h STR_k STR_u STR_q STR_i "\0" #define STRING_Wancho0 STR_W STR_a STR_n STR_c STR_h STR_o "\0" #define STRING_Warang_Citi0 STR_W STR_a STR_r STR_a STR_n STR_g STR_UNDERSCORE STR_C STR_i STR_t STR_i "\0" #define STRING_Xan0 STR_X STR_a STR_n "\0" @@ -476,6 +481,7 @@ const char PRIV(utt_names)[] = STRING_Cs0 STRING_Cuneiform0 STRING_Cypriot0 + STRING_Cypro_Minoan0 STRING_Cyrillic0 STRING_Deseret0 STRING_Devanagari0 @@ -574,6 +580,7 @@ const char PRIV(utt_names)[] = STRING_Old_Sogdian0 STRING_Old_South_Arabian0 STRING_Old_Turkic0 + STRING_Old_Uyghur0 STRING_Oriya0 STRING_Osage0 STRING_Osmanya0 @@ -618,6 +625,7 @@ const char PRIV(utt_names)[] = STRING_Tai_Viet0 STRING_Takri0 STRING_Tamil0 + STRING_Tangsa0 STRING_Tangut0 STRING_Telugu0 STRING_Thaana0 @@ -625,9 +633,11 @@ const char PRIV(utt_names)[] = STRING_Tibetan0 STRING_Tifinagh0 STRING_Tirhuta0 + STRING_Toto0 STRING_Ugaritic0 STRING_Unknown0 STRING_Vai0 + STRING_Vithkuqi0 STRING_Wancho0 STRING_Warang_Citi0 STRING_Xan0 @@ -679,172 +689,177 @@ const ucp_type_table PRIV(utt)[] = { { 255, PT_PC, ucp_Cs }, { 258, PT_SC, ucp_Cuneiform }, { 268, PT_SC, ucp_Cypriot }, - { 276, PT_SC, ucp_Cyrillic }, - { 285, PT_SC, ucp_Deseret }, - { 293, PT_SC, ucp_Devanagari }, - { 304, PT_SC, ucp_Dives_Akuru }, - { 316, PT_SC, ucp_Dogra }, - { 322, PT_SC, ucp_Duployan }, - { 331, PT_SC, ucp_Egyptian_Hieroglyphs }, - { 352, PT_SC, ucp_Elbasan }, - { 360, PT_SC, ucp_Elymaic }, - { 368, PT_SC, ucp_Ethiopic }, - { 377, PT_SC, ucp_Georgian }, - { 386, PT_SC, ucp_Glagolitic }, - { 397, PT_SC, ucp_Gothic }, - { 404, PT_SC, ucp_Grantha }, - { 412, PT_SC, ucp_Greek }, - { 418, PT_SC, ucp_Gujarati }, - { 427, PT_SC, ucp_Gunjala_Gondi }, - { 441, PT_SC, ucp_Gurmukhi }, - { 450, PT_SC, ucp_Han }, - { 454, PT_SC, ucp_Hangul }, - { 461, PT_SC, ucp_Hanifi_Rohingya }, - { 477, PT_SC, ucp_Hanunoo }, - { 485, PT_SC, ucp_Hatran }, - { 492, PT_SC, ucp_Hebrew }, - { 499, PT_SC, ucp_Hiragana }, - { 508, PT_SC, ucp_Imperial_Aramaic }, - { 525, PT_SC, ucp_Inherited }, - { 535, PT_SC, ucp_Inscriptional_Pahlavi }, - { 557, PT_SC, ucp_Inscriptional_Parthian }, - { 580, PT_SC, ucp_Javanese }, - { 589, PT_SC, ucp_Kaithi }, - { 596, PT_SC, ucp_Kannada }, - { 604, PT_SC, ucp_Katakana }, - { 613, PT_SC, ucp_Kayah_Li }, - { 622, PT_SC, ucp_Kharoshthi }, - { 633, PT_SC, ucp_Khitan_Small_Script }, - { 653, PT_SC, ucp_Khmer }, - { 659, PT_SC, ucp_Khojki }, - { 666, PT_SC, ucp_Khudawadi }, - { 676, PT_GC, ucp_L }, - { 678, PT_LAMP, 0 }, - { 681, PT_SC, ucp_Lao }, - { 685, PT_SC, ucp_Latin }, - { 691, PT_SC, ucp_Lepcha }, - { 698, PT_SC, ucp_Limbu }, - { 704, PT_SC, ucp_Linear_A }, - { 713, PT_SC, ucp_Linear_B }, - { 722, PT_SC, ucp_Lisu }, - { 727, PT_PC, ucp_Ll }, - { 730, PT_PC, ucp_Lm }, - { 733, PT_PC, ucp_Lo }, - { 736, PT_PC, ucp_Lt }, - { 739, PT_PC, ucp_Lu }, - { 742, PT_SC, ucp_Lycian }, - { 749, PT_SC, ucp_Lydian }, - { 756, PT_GC, ucp_M }, - { 758, PT_SC, ucp_Mahajani }, - { 767, PT_SC, ucp_Makasar }, - { 775, PT_SC, ucp_Malayalam }, - { 785, PT_SC, ucp_Mandaic }, - { 793, PT_SC, ucp_Manichaean }, - { 804, PT_SC, ucp_Marchen }, - { 812, PT_SC, ucp_Masaram_Gondi }, - { 826, PT_PC, ucp_Mc }, - { 829, PT_PC, ucp_Me }, - { 832, PT_SC, ucp_Medefaidrin }, - { 844, PT_SC, ucp_Meetei_Mayek }, - { 857, PT_SC, ucp_Mende_Kikakui }, - { 871, PT_SC, ucp_Meroitic_Cursive }, - { 888, PT_SC, ucp_Meroitic_Hieroglyphs }, - { 909, PT_SC, ucp_Miao }, - { 914, PT_PC, ucp_Mn }, - { 917, PT_SC, ucp_Modi }, - { 922, PT_SC, ucp_Mongolian }, - { 932, PT_SC, ucp_Mro }, - { 936, PT_SC, ucp_Multani }, - { 944, PT_SC, ucp_Myanmar }, - { 952, PT_GC, ucp_N }, - { 954, PT_SC, ucp_Nabataean }, - { 964, PT_SC, ucp_Nandinagari }, - { 976, PT_PC, ucp_Nd }, - { 979, PT_SC, ucp_New_Tai_Lue }, - { 991, PT_SC, ucp_Newa }, - { 996, PT_SC, ucp_Nko }, - { 1000, PT_PC, ucp_Nl }, - { 1003, PT_PC, ucp_No }, - { 1006, PT_SC, ucp_Nushu }, - { 1012, PT_SC, ucp_Nyiakeng_Puachue_Hmong }, - { 1035, PT_SC, ucp_Ogham }, - { 1041, PT_SC, ucp_Ol_Chiki }, - { 1050, PT_SC, ucp_Old_Hungarian }, - { 1064, PT_SC, ucp_Old_Italic }, - { 1075, PT_SC, ucp_Old_North_Arabian }, - { 1093, PT_SC, ucp_Old_Permic }, - { 1104, PT_SC, ucp_Old_Persian }, - { 1116, PT_SC, ucp_Old_Sogdian }, - { 1128, PT_SC, ucp_Old_South_Arabian }, - { 1146, PT_SC, ucp_Old_Turkic }, - { 1157, PT_SC, ucp_Oriya }, - { 1163, PT_SC, ucp_Osage }, - { 1169, PT_SC, ucp_Osmanya }, - { 1177, PT_GC, ucp_P }, - { 1179, PT_SC, ucp_Pahawh_Hmong }, - { 1192, PT_SC, ucp_Palmyrene }, - { 1202, PT_SC, ucp_Pau_Cin_Hau }, - { 1214, PT_PC, ucp_Pc }, - { 1217, PT_PC, ucp_Pd }, - { 1220, PT_PC, ucp_Pe }, - { 1223, PT_PC, ucp_Pf }, - { 1226, PT_SC, ucp_Phags_Pa }, - { 1235, PT_SC, ucp_Phoenician }, - { 1246, PT_PC, ucp_Pi }, - { 1249, PT_PC, ucp_Po }, - { 1252, PT_PC, ucp_Ps }, - { 1255, PT_SC, ucp_Psalter_Pahlavi }, - { 1271, PT_SC, ucp_Rejang }, - { 1278, PT_SC, ucp_Runic }, - { 1284, PT_GC, ucp_S }, - { 1286, PT_SC, ucp_Samaritan }, - { 1296, PT_SC, ucp_Saurashtra }, - { 1307, PT_PC, ucp_Sc }, - { 1310, PT_SC, ucp_Sharada }, - { 1318, PT_SC, ucp_Shavian }, - { 1326, PT_SC, ucp_Siddham }, - { 1334, PT_SC, ucp_SignWriting }, - { 1346, PT_SC, ucp_Sinhala }, - { 1354, PT_PC, ucp_Sk }, - { 1357, PT_PC, ucp_Sm }, - { 1360, PT_PC, ucp_So }, - { 1363, PT_SC, ucp_Sogdian }, - { 1371, PT_SC, ucp_Sora_Sompeng }, - { 1384, PT_SC, ucp_Soyombo }, - { 1392, PT_SC, ucp_Sundanese }, - { 1402, PT_SC, ucp_Syloti_Nagri }, - { 1415, PT_SC, ucp_Syriac }, - { 1422, PT_SC, ucp_Tagalog }, - { 1430, PT_SC, ucp_Tagbanwa }, - { 1439, PT_SC, ucp_Tai_Le }, - { 1446, PT_SC, ucp_Tai_Tham }, - { 1455, PT_SC, ucp_Tai_Viet }, - { 1464, PT_SC, ucp_Takri }, - { 1470, PT_SC, ucp_Tamil }, - { 1476, PT_SC, ucp_Tangut }, - { 1483, PT_SC, ucp_Telugu }, - { 1490, PT_SC, ucp_Thaana }, - { 1497, PT_SC, ucp_Thai }, - { 1502, PT_SC, ucp_Tibetan }, - { 1510, PT_SC, ucp_Tifinagh }, - { 1519, PT_SC, ucp_Tirhuta }, - { 1527, PT_SC, ucp_Ugaritic }, - { 1536, PT_SC, ucp_Unknown }, - { 1544, PT_SC, ucp_Vai }, - { 1548, PT_SC, ucp_Wancho }, - { 1555, PT_SC, ucp_Warang_Citi }, - { 1567, PT_ALNUM, 0 }, - { 1571, PT_PXSPACE, 0 }, - { 1575, PT_SPACE, 0 }, - { 1579, PT_UCNC, 0 }, - { 1583, PT_WORD, 0 }, - { 1587, PT_SC, ucp_Yezidi }, - { 1594, PT_SC, ucp_Yi }, - { 1597, PT_GC, ucp_Z }, - { 1599, PT_SC, ucp_Zanabazar_Square }, - { 1616, PT_PC, ucp_Zl }, - { 1619, PT_PC, ucp_Zp }, - { 1622, PT_PC, ucp_Zs } + { 276, PT_SC, ucp_Cypro_Minoan }, + { 289, PT_SC, ucp_Cyrillic }, + { 298, PT_SC, ucp_Deseret }, + { 306, PT_SC, ucp_Devanagari }, + { 317, PT_SC, ucp_Dives_Akuru }, + { 329, PT_SC, ucp_Dogra }, + { 335, PT_SC, ucp_Duployan }, + { 344, PT_SC, ucp_Egyptian_Hieroglyphs }, + { 365, PT_SC, ucp_Elbasan }, + { 373, PT_SC, ucp_Elymaic }, + { 381, PT_SC, ucp_Ethiopic }, + { 390, PT_SC, ucp_Georgian }, + { 399, PT_SC, ucp_Glagolitic }, + { 410, PT_SC, ucp_Gothic }, + { 417, PT_SC, ucp_Grantha }, + { 425, PT_SC, ucp_Greek }, + { 431, PT_SC, ucp_Gujarati }, + { 440, PT_SC, ucp_Gunjala_Gondi }, + { 454, PT_SC, ucp_Gurmukhi }, + { 463, PT_SC, ucp_Han }, + { 467, PT_SC, ucp_Hangul }, + { 474, PT_SC, ucp_Hanifi_Rohingya }, + { 490, PT_SC, ucp_Hanunoo }, + { 498, PT_SC, ucp_Hatran }, + { 505, PT_SC, ucp_Hebrew }, + { 512, PT_SC, ucp_Hiragana }, + { 521, PT_SC, ucp_Imperial_Aramaic }, + { 538, PT_SC, ucp_Inherited }, + { 548, PT_SC, ucp_Inscriptional_Pahlavi }, + { 570, PT_SC, ucp_Inscriptional_Parthian }, + { 593, PT_SC, ucp_Javanese }, + { 602, PT_SC, ucp_Kaithi }, + { 609, PT_SC, ucp_Kannada }, + { 617, PT_SC, ucp_Katakana }, + { 626, PT_SC, ucp_Kayah_Li }, + { 635, PT_SC, ucp_Kharoshthi }, + { 646, PT_SC, ucp_Khitan_Small_Script }, + { 666, PT_SC, ucp_Khmer }, + { 672, PT_SC, ucp_Khojki }, + { 679, PT_SC, ucp_Khudawadi }, + { 689, PT_GC, ucp_L }, + { 691, PT_LAMP, 0 }, + { 694, PT_SC, ucp_Lao }, + { 698, PT_SC, ucp_Latin }, + { 704, PT_SC, ucp_Lepcha }, + { 711, PT_SC, ucp_Limbu }, + { 717, PT_SC, ucp_Linear_A }, + { 726, PT_SC, ucp_Linear_B }, + { 735, PT_SC, ucp_Lisu }, + { 740, PT_PC, ucp_Ll }, + { 743, PT_PC, ucp_Lm }, + { 746, PT_PC, ucp_Lo }, + { 749, PT_PC, ucp_Lt }, + { 752, PT_PC, ucp_Lu }, + { 755, PT_SC, ucp_Lycian }, + { 762, PT_SC, ucp_Lydian }, + { 769, PT_GC, ucp_M }, + { 771, PT_SC, ucp_Mahajani }, + { 780, PT_SC, ucp_Makasar }, + { 788, PT_SC, ucp_Malayalam }, + { 798, PT_SC, ucp_Mandaic }, + { 806, PT_SC, ucp_Manichaean }, + { 817, PT_SC, ucp_Marchen }, + { 825, PT_SC, ucp_Masaram_Gondi }, + { 839, PT_PC, ucp_Mc }, + { 842, PT_PC, ucp_Me }, + { 845, PT_SC, ucp_Medefaidrin }, + { 857, PT_SC, ucp_Meetei_Mayek }, + { 870, PT_SC, ucp_Mende_Kikakui }, + { 884, PT_SC, ucp_Meroitic_Cursive }, + { 901, PT_SC, ucp_Meroitic_Hieroglyphs }, + { 922, PT_SC, ucp_Miao }, + { 927, PT_PC, ucp_Mn }, + { 930, PT_SC, ucp_Modi }, + { 935, PT_SC, ucp_Mongolian }, + { 945, PT_SC, ucp_Mro }, + { 949, PT_SC, ucp_Multani }, + { 957, PT_SC, ucp_Myanmar }, + { 965, PT_GC, ucp_N }, + { 967, PT_SC, ucp_Nabataean }, + { 977, PT_SC, ucp_Nandinagari }, + { 989, PT_PC, ucp_Nd }, + { 992, PT_SC, ucp_New_Tai_Lue }, + { 1004, PT_SC, ucp_Newa }, + { 1009, PT_SC, ucp_Nko }, + { 1013, PT_PC, ucp_Nl }, + { 1016, PT_PC, ucp_No }, + { 1019, PT_SC, ucp_Nushu }, + { 1025, PT_SC, ucp_Nyiakeng_Puachue_Hmong }, + { 1048, PT_SC, ucp_Ogham }, + { 1054, PT_SC, ucp_Ol_Chiki }, + { 1063, PT_SC, ucp_Old_Hungarian }, + { 1077, PT_SC, ucp_Old_Italic }, + { 1088, PT_SC, ucp_Old_North_Arabian }, + { 1106, PT_SC, ucp_Old_Permic }, + { 1117, PT_SC, ucp_Old_Persian }, + { 1129, PT_SC, ucp_Old_Sogdian }, + { 1141, PT_SC, ucp_Old_South_Arabian }, + { 1159, PT_SC, ucp_Old_Turkic }, + { 1170, PT_SC, ucp_Old_Uyghur }, + { 1181, PT_SC, ucp_Oriya }, + { 1187, PT_SC, ucp_Osage }, + { 1193, PT_SC, ucp_Osmanya }, + { 1201, PT_GC, ucp_P }, + { 1203, PT_SC, ucp_Pahawh_Hmong }, + { 1216, PT_SC, ucp_Palmyrene }, + { 1226, PT_SC, ucp_Pau_Cin_Hau }, + { 1238, PT_PC, ucp_Pc }, + { 1241, PT_PC, ucp_Pd }, + { 1244, PT_PC, ucp_Pe }, + { 1247, PT_PC, ucp_Pf }, + { 1250, PT_SC, ucp_Phags_Pa }, + { 1259, PT_SC, ucp_Phoenician }, + { 1270, PT_PC, ucp_Pi }, + { 1273, PT_PC, ucp_Po }, + { 1276, PT_PC, ucp_Ps }, + { 1279, PT_SC, ucp_Psalter_Pahlavi }, + { 1295, PT_SC, ucp_Rejang }, + { 1302, PT_SC, ucp_Runic }, + { 1308, PT_GC, ucp_S }, + { 1310, PT_SC, ucp_Samaritan }, + { 1320, PT_SC, ucp_Saurashtra }, + { 1331, PT_PC, ucp_Sc }, + { 1334, PT_SC, ucp_Sharada }, + { 1342, PT_SC, ucp_Shavian }, + { 1350, PT_SC, ucp_Siddham }, + { 1358, PT_SC, ucp_SignWriting }, + { 1370, PT_SC, ucp_Sinhala }, + { 1378, PT_PC, ucp_Sk }, + { 1381, PT_PC, ucp_Sm }, + { 1384, PT_PC, ucp_So }, + { 1387, PT_SC, ucp_Sogdian }, + { 1395, PT_SC, ucp_Sora_Sompeng }, + { 1408, PT_SC, ucp_Soyombo }, + { 1416, PT_SC, ucp_Sundanese }, + { 1426, PT_SC, ucp_Syloti_Nagri }, + { 1439, PT_SC, ucp_Syriac }, + { 1446, PT_SC, ucp_Tagalog }, + { 1454, PT_SC, ucp_Tagbanwa }, + { 1463, PT_SC, ucp_Tai_Le }, + { 1470, PT_SC, ucp_Tai_Tham }, + { 1479, PT_SC, ucp_Tai_Viet }, + { 1488, PT_SC, ucp_Takri }, + { 1494, PT_SC, ucp_Tamil }, + { 1500, PT_SC, ucp_Tangsa }, + { 1507, PT_SC, ucp_Tangut }, + { 1514, PT_SC, ucp_Telugu }, + { 1521, PT_SC, ucp_Thaana }, + { 1528, PT_SC, ucp_Thai }, + { 1533, PT_SC, ucp_Tibetan }, + { 1541, PT_SC, ucp_Tifinagh }, + { 1550, PT_SC, ucp_Tirhuta }, + { 1558, PT_SC, ucp_Toto }, + { 1563, PT_SC, ucp_Ugaritic }, + { 1572, PT_SC, ucp_Unknown }, + { 1580, PT_SC, ucp_Vai }, + { 1584, PT_SC, ucp_Vithkuqi }, + { 1593, PT_SC, ucp_Wancho }, + { 1600, PT_SC, ucp_Warang_Citi }, + { 1612, PT_ALNUM, 0 }, + { 1616, PT_PXSPACE, 0 }, + { 1620, PT_SPACE, 0 }, + { 1624, PT_UCNC, 0 }, + { 1628, PT_WORD, 0 }, + { 1632, PT_SC, ucp_Yezidi }, + { 1639, PT_SC, ucp_Yi }, + { 1642, PT_GC, ucp_Z }, + { 1644, PT_SC, ucp_Zanabazar_Square }, + { 1661, PT_PC, ucp_Zl }, + { 1664, PT_PC, ucp_Zp }, + { 1667, PT_PC, ucp_Zs } }; const size_t PRIV(utt_size) = sizeof(PRIV(utt)) / sizeof(ucp_type_table); diff --git a/src/3rdparty/pcre2/src/pcre2_ucd.c b/src/3rdparty/pcre2/src/pcre2_ucd.c index 46e23ff0..0b8ac75b 100644 --- a/src/3rdparty/pcre2/src/pcre2_ucd.c +++ b/src/3rdparty/pcre2/src/pcre2_ucd.c @@ -20,7 +20,7 @@ needed. */ /* Unicode character database. */ /* This file was autogenerated by the MultiStage2.py script. */ -/* Total size: 101044 bytes, block size: 128. */ +/* Total size: 102844 bytes, block size: 128. */ /* The tables herein are needed only when UCP support is built, and in PCRE2 that happens automatically with UTF support. @@ -39,7 +39,7 @@ const uint16_t PRIV(ucd_stage2)[] = {0}; const uint32_t PRIV(ucd_caseless_sets)[] = {0}; #else -const char *PRIV(unicode_version) = "13.0.0"; +const char *PRIV(unicode_version) = "14.0.0"; /* If the 32-bit library is run in non-32-bit mode, character values greater than 0x10ffff may be encountered. For these we set up a @@ -116,16 +116,16 @@ set of decimal digits. It is used to ensure that all the digits in a script run come from the same set. */ const uint32_t PRIV(ucd_digit_sets)[] = { - 65, /* Number of subsequent values */ + 66, /* Number of subsequent values */ 0x00039, 0x00669, 0x006f9, 0x007c9, 0x0096f, 0x009ef, 0x00a6f, 0x00aef, 0x00b6f, 0x00bef, 0x00c6f, 0x00cef, 0x00d6f, 0x00def, 0x00e59, 0x00ed9, 0x00f29, 0x01049, 0x01099, 0x017e9, 0x01819, 0x0194f, 0x019d9, 0x01a89, 0x01a99, 0x01b59, 0x01bb9, 0x01c49, 0x01c59, 0x0a629, 0x0a8d9, 0x0a909, 0x0a9d9, 0x0a9f9, 0x0aa59, 0x0abf9, 0x0ff19, 0x104a9, 0x10d39, 0x1106f, 0x110f9, 0x1113f, 0x111d9, 0x112f9, 0x11459, 0x114d9, 0x11659, 0x116c9, - 0x11739, 0x118e9, 0x11959, 0x11c59, 0x11d59, 0x11da9, 0x16a69, 0x16b59, - 0x1d7d7, 0x1d7e1, 0x1d7eb, 0x1d7f5, 0x1d7ff, 0x1e149, 0x1e2f9, 0x1e959, - 0x1fbf9, + 0x11739, 0x118e9, 0x11959, 0x11c59, 0x11d59, 0x11da9, 0x16a69, 0x16ac9, + 0x16b59, 0x1d7d7, 0x1d7e1, 0x1d7eb, 0x1d7f5, 0x1d7ff, 0x1e149, 0x1e2f9, + 0x1e959, 0x1fbf9, }; /* This vector is a list of lists of scripts for the Script Extension @@ -135,55 +135,59 @@ const uint8_t PRIV(ucd_script_sets)[] = { /* 0 */ 0, /* 1 */ 1, 11, 0, /* 4 */ 1, 144, 0, - /* 7 */ 1, 50, 0, - /* 10 */ 1, 56, 0, - /* 13 */ 3, 15, 0, - /* 16 */ 4, 23, 0, - /* 19 */ 6, 84, 0, - /* 22 */ 12, 36, 0, - /* 25 */ 13, 18, 0, - /* 28 */ 13, 34, 0, - /* 31 */ 13, 118, 0, - /* 34 */ 13, 50, 0, - /* 37 */ 15, 107, 0, - /* 40 */ 15, 150, 0, - /* 43 */ 15, 100, 0, - /* 46 */ 15, 54, 0, - /* 49 */ 17, 34, 0, - /* 52 */ 107, 54, 0, - /* 55 */ 21, 108, 0, - /* 58 */ 22, 129, 0, - /* 61 */ 23, 34, 0, - /* 64 */ 27, 30, 0, - /* 67 */ 29, 150, 0, - /* 70 */ 34, 38, 0, - /* 73 */ 38, 65, 0, - /* 76 */ 1, 50, 56, 0, - /* 80 */ 1, 56, 156, 0, - /* 84 */ 3, 96, 49, 0, - /* 88 */ 96, 39, 53, 0, - /* 92 */ 12, 110, 36, 0, - /* 96 */ 15, 107, 29, 0, - /* 100 */ 15, 107, 34, 0, - /* 104 */ 23, 27, 30, 0, - /* 108 */ 69, 34, 39, 0, - /* 112 */ 3, 15, 107, 29, 0, - /* 117 */ 7, 25, 52, 51, 0, - /* 122 */ 15, 142, 85, 111, 0, - /* 127 */ 1, 144, 50, 56, 156, 0, - /* 133 */ 4, 24, 23, 27, 30, 0, - /* 139 */ 4, 24, 23, 27, 30, 61, 0, - /* 146 */ 15, 29, 37, 44, 54, 55, 0, - /* 153 */ 132, 1, 95, 112, 121, 144, 148, 50, 0, - /* 162 */ 3, 15, 107, 29, 150, 44, 55, 124, 0, - /* 171 */ 15, 142, 21, 22, 108, 85, 111, 114, 109, 102, 124, 0, - /* 183 */ 3, 15, 107, 21, 22, 29, 34, 37, 44, 54, 55, 124, 0, - /* 196 */ 3, 15, 107, 21, 22, 29, 34, 37, 44, 100, 54, 55, 124, 0, - /* 210 */ 15, 142, 21, 22, 108, 29, 85, 111, 114, 150, 109, 102, 124, 0, - /* 224 */ 15, 142, 21, 22, 108, 29, 85, 111, 37, 114, 150, 109, 102, 124, 0, - /* 239 */ 3, 15, 142, 143, 138, 107, 21, 22, 29, 111, 37, 150, 44, 109, 48, 49, 102, 54, 55, 124, 0, - /* 260 */ 3, 15, 142, 143, 138, 107, 21, 22, 29, 35, 111, 37, 150, 44, 109, 48, 49, 102, 54, 55, 124, 0, - /* 282 */ + /* 7 */ 1, 64, 0, + /* 10 */ 1, 50, 0, + /* 13 */ 1, 56, 0, + /* 16 */ 3, 15, 0, + /* 19 */ 4, 23, 0, + /* 22 */ 6, 84, 0, + /* 25 */ 12, 36, 0, + /* 28 */ 13, 18, 0, + /* 31 */ 13, 34, 0, + /* 34 */ 13, 118, 0, + /* 37 */ 13, 50, 0, + /* 40 */ 15, 107, 0, + /* 43 */ 15, 150, 0, + /* 46 */ 15, 100, 0, + /* 49 */ 15, 54, 0, + /* 52 */ 17, 34, 0, + /* 55 */ 107, 54, 0, + /* 58 */ 21, 108, 0, + /* 61 */ 22, 129, 0, + /* 64 */ 23, 34, 0, + /* 67 */ 27, 30, 0, + /* 70 */ 29, 150, 0, + /* 73 */ 34, 38, 0, + /* 76 */ 112, 158, 0, + /* 79 */ 38, 65, 0, + /* 82 */ 1, 50, 56, 0, + /* 86 */ 1, 56, 156, 0, + /* 90 */ 3, 96, 49, 0, + /* 94 */ 96, 39, 53, 0, + /* 98 */ 157, 12, 36, 0, + /* 102 */ 12, 110, 36, 0, + /* 106 */ 15, 107, 29, 0, + /* 110 */ 15, 107, 34, 0, + /* 114 */ 23, 27, 30, 0, + /* 118 */ 69, 34, 39, 0, + /* 122 */ 3, 15, 107, 29, 0, + /* 127 */ 7, 25, 52, 51, 0, + /* 132 */ 15, 142, 85, 111, 0, + /* 137 */ 4, 24, 23, 27, 30, 0, + /* 143 */ 1, 64, 144, 50, 56, 156, 0, + /* 150 */ 4, 24, 23, 27, 30, 61, 0, + /* 157 */ 15, 29, 37, 44, 54, 55, 0, + /* 164 */ 132, 1, 64, 144, 50, 56, 156, 0, + /* 172 */ 3, 15, 107, 29, 150, 44, 55, 124, 0, + /* 181 */ 132, 1, 95, 112, 158, 121, 144, 148, 50, 0, + /* 191 */ 15, 142, 21, 22, 108, 85, 111, 114, 109, 102, 124, 0, + /* 203 */ 3, 15, 107, 21, 22, 29, 34, 37, 44, 54, 55, 124, 0, + /* 216 */ 3, 15, 107, 21, 22, 29, 34, 37, 44, 100, 54, 55, 124, 0, + /* 230 */ 15, 142, 21, 22, 108, 29, 85, 111, 114, 150, 109, 102, 124, 0, + /* 244 */ 15, 142, 21, 22, 108, 29, 85, 111, 37, 114, 150, 109, 102, 124, 0, + /* 259 */ 3, 15, 142, 143, 138, 107, 21, 22, 29, 111, 37, 150, 44, 109, 48, 49, 102, 54, 55, 124, 0, + /* 280 */ 3, 15, 142, 143, 138, 107, 21, 22, 29, 35, 111, 37, 150, 44, 109, 48, 49, 102, 54, 55, 124, 0, + /* 302 */ }; /* These are the main two-stage UCD tables. The fields in each record are: @@ -192,7 +196,7 @@ offset to multichar other cases or zero (8 bits), offset to other case or zero (32 bits, signed), script extension (16 bits, signed), and a dummy 16-bit field to make the whole thing a multiple of 4 bytes. */ -const ucd_record PRIV(ucd_records)[] = { /* 11700 bytes, record size 12 */ +const ucd_record PRIV(ucd_records)[] = { /* 11964 bytes, record size 12 */ { 10, 0, 2, 0, 0, 10, 256, }, /* 0 */ { 10, 0, 2, 0, 0, 10, 0, }, /* 1 */ { 10, 0, 1, 0, 0, 10, 0, }, /* 2 */ @@ -390,9 +394,9 @@ const ucd_record PRIV(ucd_records)[] = { /* 11700 bytes, record size 12 */ { 13, 9, 12, 88, 1, 13, 0, }, /* 194 */ { 13, 5, 12, 88, -1, 13, 0, }, /* 195 */ { 13, 26, 12, 0, 0, 13, 0, }, /* 196 */ - { 13, 12, 3, 0, 0, -31, 0, }, /* 197 */ - { 13, 12, 3, 0, 0, -25, 0, }, /* 198 */ - { 28, 12, 3, 0, 0, -28, 0, }, /* 199 */ + { 13, 12, 3, 0, 0, -34, 0, }, /* 197 */ + { 13, 12, 3, 0, 0, -28, 0, }, /* 198 */ + { 28, 12, 3, 0, 0, -31, 0, }, /* 199 */ { 13, 11, 3, 0, 0, 13, 0, }, /* 200 */ { 13, 9, 12, 0, 15, 13, 0, }, /* 201 */ { 13, 5, 12, 0, -15, 13, 0, }, /* 202 */ @@ -413,761 +417,783 @@ const ucd_record PRIV(ucd_records)[] = { /* 11700 bytes, record size 12 */ { 1, 25, 12, 0, 0, 1, 0, }, /* 217 */ { 1, 21, 12, 0, 0, 1, 0, }, /* 218 */ { 1, 23, 12, 0, 0, 1, 0, }, /* 219 */ - { 10, 21, 12, 0, 0, -127, 0, }, /* 220 */ + { 10, 21, 12, 0, 0, -143, 0, }, /* 220 */ { 1, 26, 12, 0, 0, 1, 0, }, /* 221 */ { 1, 12, 3, 0, 0, 1, 0, }, /* 222 */ - { 1, 1, 2, 0, 0, -76, 0, }, /* 223 */ - { 1, 7, 12, 0, 0, 1, 0, }, /* 224 */ - { 10, 6, 12, 0, 0, -153, 0, }, /* 225 */ - { 28, 12, 3, 0, 0, -7, 0, }, /* 226 */ - { 1, 13, 12, 0, 0, -80, 0, }, /* 227 */ - { 1, 21, 12, 0, 0, -4, 0, }, /* 228 */ - { 1, 6, 12, 0, 0, 1, 0, }, /* 229 */ - { 1, 13, 12, 0, 0, 1, 0, }, /* 230 */ - { 50, 21, 12, 0, 0, 50, 0, }, /* 231 */ - { 50, 1, 4, 0, 0, 50, 0, }, /* 232 */ - { 50, 7, 12, 0, 0, 50, 0, }, /* 233 */ - { 50, 12, 3, 0, 0, 50, 0, }, /* 234 */ - { 56, 7, 12, 0, 0, 56, 0, }, /* 235 */ - { 56, 12, 3, 0, 0, 56, 0, }, /* 236 */ - { 64, 13, 12, 0, 0, 64, 0, }, /* 237 */ - { 64, 7, 12, 0, 0, 64, 0, }, /* 238 */ - { 64, 12, 3, 0, 0, 64, 0, }, /* 239 */ - { 64, 6, 12, 0, 0, 64, 0, }, /* 240 */ - { 64, 26, 12, 0, 0, 64, 0, }, /* 241 */ - { 64, 21, 12, 0, 0, 64, 0, }, /* 242 */ - { 64, 23, 12, 0, 0, 64, 0, }, /* 243 */ - { 90, 7, 12, 0, 0, 90, 0, }, /* 244 */ - { 90, 12, 3, 0, 0, 90, 0, }, /* 245 */ - { 90, 6, 12, 0, 0, 90, 0, }, /* 246 */ - { 90, 21, 12, 0, 0, 90, 0, }, /* 247 */ - { 95, 7, 12, 0, 0, 95, 0, }, /* 248 */ - { 95, 12, 3, 0, 0, 95, 0, }, /* 249 */ - { 95, 21, 12, 0, 0, 95, 0, }, /* 250 */ - { 15, 12, 3, 0, 0, 15, 0, }, /* 251 */ - { 15, 10, 5, 0, 0, 15, 0, }, /* 252 */ - { 15, 7, 12, 0, 0, 15, 0, }, /* 253 */ - { 28, 12, 3, 0, 0, -196, 0, }, /* 254 */ - { 28, 12, 3, 0, 0, -183, 0, }, /* 255 */ - { 10, 21, 12, 0, 0, -239, 0, }, /* 256 */ - { 10, 21, 12, 0, 0, -260, 0, }, /* 257 */ - { 15, 13, 12, 0, 0, -122, 0, }, /* 258 */ - { 15, 21, 12, 0, 0, 15, 0, }, /* 259 */ - { 15, 6, 12, 0, 0, 15, 0, }, /* 260 */ - { 3, 7, 12, 0, 0, 3, 0, }, /* 261 */ - { 3, 12, 3, 0, 0, 3, 0, }, /* 262 */ - { 3, 10, 5, 0, 0, 3, 0, }, /* 263 */ - { 3, 10, 3, 0, 0, 3, 0, }, /* 264 */ - { 3, 13, 12, 0, 0, -84, 0, }, /* 265 */ - { 3, 23, 12, 0, 0, 3, 0, }, /* 266 */ - { 3, 15, 12, 0, 0, 3, 0, }, /* 267 */ - { 3, 26, 12, 0, 0, 3, 0, }, /* 268 */ - { 3, 21, 12, 0, 0, 3, 0, }, /* 269 */ - { 22, 12, 3, 0, 0, 22, 0, }, /* 270 */ - { 22, 10, 5, 0, 0, 22, 0, }, /* 271 */ - { 22, 7, 12, 0, 0, 22, 0, }, /* 272 */ - { 22, 13, 12, 0, 0, -58, 0, }, /* 273 */ - { 22, 21, 12, 0, 0, 22, 0, }, /* 274 */ - { 21, 12, 3, 0, 0, 21, 0, }, /* 275 */ - { 21, 10, 5, 0, 0, 21, 0, }, /* 276 */ - { 21, 7, 12, 0, 0, 21, 0, }, /* 277 */ - { 21, 13, 12, 0, 0, -55, 0, }, /* 278 */ - { 21, 21, 12, 0, 0, 21, 0, }, /* 279 */ - { 21, 23, 12, 0, 0, 21, 0, }, /* 280 */ - { 44, 12, 3, 0, 0, 44, 0, }, /* 281 */ - { 44, 10, 5, 0, 0, 44, 0, }, /* 282 */ - { 44, 7, 12, 0, 0, 44, 0, }, /* 283 */ - { 44, 10, 3, 0, 0, 44, 0, }, /* 284 */ - { 44, 13, 12, 0, 0, 44, 0, }, /* 285 */ - { 44, 26, 12, 0, 0, 44, 0, }, /* 286 */ - { 44, 15, 12, 0, 0, 44, 0, }, /* 287 */ - { 54, 12, 3, 0, 0, 54, 0, }, /* 288 */ - { 54, 7, 12, 0, 0, 54, 0, }, /* 289 */ - { 54, 10, 3, 0, 0, 54, 0, }, /* 290 */ - { 54, 10, 5, 0, 0, 54, 0, }, /* 291 */ - { 54, 13, 12, 0, 0, -52, 0, }, /* 292 */ - { 54, 15, 12, 0, 0, -52, 0, }, /* 293 */ - { 54, 26, 12, 0, 0, -52, 0, }, /* 294 */ - { 54, 26, 12, 0, 0, 54, 0, }, /* 295 */ - { 54, 23, 12, 0, 0, 54, 0, }, /* 296 */ - { 55, 12, 3, 0, 0, 55, 0, }, /* 297 */ - { 55, 10, 5, 0, 0, 55, 0, }, /* 298 */ - { 55, 7, 12, 0, 0, 55, 0, }, /* 299 */ - { 55, 13, 12, 0, 0, 55, 0, }, /* 300 */ - { 55, 21, 12, 0, 0, 55, 0, }, /* 301 */ - { 55, 15, 12, 0, 0, 55, 0, }, /* 302 */ - { 55, 26, 12, 0, 0, 55, 0, }, /* 303 */ - { 29, 7, 12, 0, 0, 29, 0, }, /* 304 */ - { 29, 12, 3, 0, 0, 29, 0, }, /* 305 */ - { 29, 10, 5, 0, 0, 29, 0, }, /* 306 */ - { 29, 21, 12, 0, 0, 29, 0, }, /* 307 */ - { 29, 10, 3, 0, 0, 29, 0, }, /* 308 */ - { 29, 13, 12, 0, 0, -67, 0, }, /* 309 */ - { 37, 12, 3, 0, 0, 37, 0, }, /* 310 */ - { 37, 10, 5, 0, 0, 37, 0, }, /* 311 */ - { 37, 7, 12, 0, 0, 37, 0, }, /* 312 */ - { 37, 10, 3, 0, 0, 37, 0, }, /* 313 */ - { 37, 7, 4, 0, 0, 37, 0, }, /* 314 */ - { 37, 26, 12, 0, 0, 37, 0, }, /* 315 */ - { 37, 15, 12, 0, 0, 37, 0, }, /* 316 */ - { 37, 13, 12, 0, 0, 37, 0, }, /* 317 */ - { 48, 12, 3, 0, 0, 48, 0, }, /* 318 */ - { 48, 10, 5, 0, 0, 48, 0, }, /* 319 */ - { 48, 7, 12, 0, 0, 48, 0, }, /* 320 */ - { 48, 10, 3, 0, 0, 48, 0, }, /* 321 */ - { 48, 13, 12, 0, 0, 48, 0, }, /* 322 */ - { 48, 21, 12, 0, 0, 48, 0, }, /* 323 */ - { 57, 7, 12, 0, 0, 57, 0, }, /* 324 */ - { 57, 12, 3, 0, 0, 57, 0, }, /* 325 */ - { 57, 7, 5, 0, 0, 57, 0, }, /* 326 */ - { 57, 6, 12, 0, 0, 57, 0, }, /* 327 */ - { 57, 21, 12, 0, 0, 57, 0, }, /* 328 */ - { 57, 13, 12, 0, 0, 57, 0, }, /* 329 */ - { 33, 7, 12, 0, 0, 33, 0, }, /* 330 */ - { 33, 12, 3, 0, 0, 33, 0, }, /* 331 */ - { 33, 7, 5, 0, 0, 33, 0, }, /* 332 */ - { 33, 6, 12, 0, 0, 33, 0, }, /* 333 */ - { 33, 13, 12, 0, 0, 33, 0, }, /* 334 */ - { 58, 7, 12, 0, 0, 58, 0, }, /* 335 */ - { 58, 26, 12, 0, 0, 58, 0, }, /* 336 */ - { 58, 21, 12, 0, 0, 58, 0, }, /* 337 */ - { 58, 12, 3, 0, 0, 58, 0, }, /* 338 */ - { 58, 13, 12, 0, 0, 58, 0, }, /* 339 */ - { 58, 15, 12, 0, 0, 58, 0, }, /* 340 */ - { 58, 22, 12, 0, 0, 58, 0, }, /* 341 */ - { 58, 18, 12, 0, 0, 58, 0, }, /* 342 */ - { 58, 10, 5, 0, 0, 58, 0, }, /* 343 */ - { 39, 7, 12, 0, 0, 39, 0, }, /* 344 */ - { 39, 10, 12, 0, 0, 39, 0, }, /* 345 */ - { 39, 12, 3, 0, 0, 39, 0, }, /* 346 */ - { 39, 10, 5, 0, 0, 39, 0, }, /* 347 */ - { 39, 13, 12, 0, 0, -88, 0, }, /* 348 */ - { 39, 21, 12, 0, 0, 39, 0, }, /* 349 */ - { 39, 13, 12, 0, 0, 39, 0, }, /* 350 */ - { 39, 26, 12, 0, 0, 39, 0, }, /* 351 */ - { 17, 9, 12, 0, 7264, 17, 0, }, /* 352 */ - { 17, 5, 12, 0, 3008, 17, 0, }, /* 353 */ - { 10, 21, 12, 0, 0, -49, 0, }, /* 354 */ - { 17, 6, 12, 0, 0, 17, 0, }, /* 355 */ - { 24, 7, 6, 0, 0, 24, 0, }, /* 356 */ - { 24, 7, 7, 0, 0, 24, 0, }, /* 357 */ - { 24, 7, 8, 0, 0, 24, 0, }, /* 358 */ - { 16, 7, 12, 0, 0, 16, 0, }, /* 359 */ - { 16, 12, 3, 0, 0, 16, 0, }, /* 360 */ - { 16, 21, 12, 0, 0, 16, 0, }, /* 361 */ - { 16, 15, 12, 0, 0, 16, 0, }, /* 362 */ - { 16, 26, 12, 0, 0, 16, 0, }, /* 363 */ - { 9, 9, 12, 0, 38864, 9, 0, }, /* 364 */ - { 9, 9, 12, 0, 8, 9, 0, }, /* 365 */ - { 9, 5, 12, 0, -8, 9, 0, }, /* 366 */ - { 8, 17, 12, 0, 0, 8, 0, }, /* 367 */ - { 8, 7, 12, 0, 0, 8, 0, }, /* 368 */ - { 8, 26, 12, 0, 0, 8, 0, }, /* 369 */ - { 8, 21, 12, 0, 0, 8, 0, }, /* 370 */ - { 41, 29, 12, 0, 0, 41, 0, }, /* 371 */ - { 41, 7, 12, 0, 0, 41, 0, }, /* 372 */ - { 41, 22, 12, 0, 0, 41, 0, }, /* 373 */ - { 41, 18, 12, 0, 0, 41, 0, }, /* 374 */ - { 46, 7, 12, 0, 0, 46, 0, }, /* 375 */ - { 46, 14, 12, 0, 0, 46, 0, }, /* 376 */ - { 51, 7, 12, 0, 0, 51, 0, }, /* 377 */ - { 51, 12, 3, 0, 0, 51, 0, }, /* 378 */ - { 25, 7, 12, 0, 0, 25, 0, }, /* 379 */ - { 25, 12, 3, 0, 0, 25, 0, }, /* 380 */ - { 10, 21, 12, 0, 0, -117, 0, }, /* 381 */ - { 7, 7, 12, 0, 0, 7, 0, }, /* 382 */ - { 7, 12, 3, 0, 0, 7, 0, }, /* 383 */ - { 52, 7, 12, 0, 0, 52, 0, }, /* 384 */ - { 52, 12, 3, 0, 0, 52, 0, }, /* 385 */ - { 32, 7, 12, 0, 0, 32, 0, }, /* 386 */ - { 32, 12, 3, 0, 0, 32, 0, }, /* 387 */ - { 32, 10, 5, 0, 0, 32, 0, }, /* 388 */ - { 32, 21, 12, 0, 0, 32, 0, }, /* 389 */ - { 32, 6, 12, 0, 0, 32, 0, }, /* 390 */ - { 32, 23, 12, 0, 0, 32, 0, }, /* 391 */ - { 32, 13, 12, 0, 0, 32, 0, }, /* 392 */ - { 32, 15, 12, 0, 0, 32, 0, }, /* 393 */ - { 38, 21, 12, 0, 0, 38, 0, }, /* 394 */ - { 10, 21, 12, 0, 0, -73, 0, }, /* 395 */ - { 38, 17, 12, 0, 0, 38, 0, }, /* 396 */ - { 38, 12, 3, 0, 0, 38, 0, }, /* 397 */ - { 38, 1, 2, 0, 0, 38, 0, }, /* 398 */ - { 38, 13, 12, 0, 0, 38, 0, }, /* 399 */ - { 38, 7, 12, 0, 0, 38, 0, }, /* 400 */ - { 38, 6, 12, 0, 0, 38, 0, }, /* 401 */ - { 35, 7, 12, 0, 0, 35, 0, }, /* 402 */ - { 35, 12, 3, 0, 0, 35, 0, }, /* 403 */ - { 35, 10, 5, 0, 0, 35, 0, }, /* 404 */ - { 35, 26, 12, 0, 0, 35, 0, }, /* 405 */ - { 35, 21, 12, 0, 0, 35, 0, }, /* 406 */ - { 35, 13, 12, 0, 0, 35, 0, }, /* 407 */ - { 53, 7, 12, 0, 0, 53, 0, }, /* 408 */ - { 40, 7, 12, 0, 0, 40, 0, }, /* 409 */ - { 40, 13, 12, 0, 0, 40, 0, }, /* 410 */ - { 40, 15, 12, 0, 0, 40, 0, }, /* 411 */ - { 40, 26, 12, 0, 0, 40, 0, }, /* 412 */ - { 32, 26, 12, 0, 0, 32, 0, }, /* 413 */ - { 6, 7, 12, 0, 0, 6, 0, }, /* 414 */ - { 6, 12, 3, 0, 0, 6, 0, }, /* 415 */ - { 6, 10, 5, 0, 0, 6, 0, }, /* 416 */ - { 6, 21, 12, 0, 0, 6, 0, }, /* 417 */ - { 91, 7, 12, 0, 0, 91, 0, }, /* 418 */ - { 91, 10, 5, 0, 0, 91, 0, }, /* 419 */ - { 91, 12, 3, 0, 0, 91, 0, }, /* 420 */ - { 91, 10, 12, 0, 0, 91, 0, }, /* 421 */ - { 91, 13, 12, 0, 0, 91, 0, }, /* 422 */ - { 91, 21, 12, 0, 0, 91, 0, }, /* 423 */ - { 91, 6, 12, 0, 0, 91, 0, }, /* 424 */ - { 28, 11, 3, 0, 0, 28, 0, }, /* 425 */ - { 62, 12, 3, 0, 0, 62, 0, }, /* 426 */ - { 62, 10, 5, 0, 0, 62, 0, }, /* 427 */ - { 62, 7, 12, 0, 0, 62, 0, }, /* 428 */ - { 62, 10, 3, 0, 0, 62, 0, }, /* 429 */ - { 62, 13, 12, 0, 0, 62, 0, }, /* 430 */ - { 62, 21, 12, 0, 0, 62, 0, }, /* 431 */ - { 62, 26, 12, 0, 0, 62, 0, }, /* 432 */ - { 76, 12, 3, 0, 0, 76, 0, }, /* 433 */ - { 76, 10, 5, 0, 0, 76, 0, }, /* 434 */ - { 76, 7, 12, 0, 0, 76, 0, }, /* 435 */ - { 76, 13, 12, 0, 0, 76, 0, }, /* 436 */ - { 93, 7, 12, 0, 0, 93, 0, }, /* 437 */ - { 93, 12, 3, 0, 0, 93, 0, }, /* 438 */ - { 93, 10, 5, 0, 0, 93, 0, }, /* 439 */ - { 93, 21, 12, 0, 0, 93, 0, }, /* 440 */ - { 70, 7, 12, 0, 0, 70, 0, }, /* 441 */ - { 70, 10, 5, 0, 0, 70, 0, }, /* 442 */ - { 70, 12, 3, 0, 0, 70, 0, }, /* 443 */ - { 70, 21, 12, 0, 0, 70, 0, }, /* 444 */ - { 70, 13, 12, 0, 0, 70, 0, }, /* 445 */ - { 73, 13, 12, 0, 0, 73, 0, }, /* 446 */ - { 73, 7, 12, 0, 0, 73, 0, }, /* 447 */ - { 73, 6, 12, 0, 0, 73, 0, }, /* 448 */ - { 73, 21, 12, 0, 0, 73, 0, }, /* 449 */ - { 13, 5, 12, 63, -6222, 13, 0, }, /* 450 */ - { 13, 5, 12, 67, -6221, 13, 0, }, /* 451 */ - { 13, 5, 12, 71, -6212, 13, 0, }, /* 452 */ - { 13, 5, 12, 75, -6210, 13, 0, }, /* 453 */ - { 13, 5, 12, 79, -6210, 13, 0, }, /* 454 */ - { 13, 5, 12, 79, -6211, 13, 0, }, /* 455 */ - { 13, 5, 12, 84, -6204, 13, 0, }, /* 456 */ - { 13, 5, 12, 88, -6180, 13, 0, }, /* 457 */ - { 13, 5, 12, 108, 35267, 13, 0, }, /* 458 */ - { 17, 9, 12, 0, -3008, 17, 0, }, /* 459 */ - { 76, 21, 12, 0, 0, 76, 0, }, /* 460 */ - { 28, 12, 3, 0, 0, -112, 0, }, /* 461 */ - { 28, 12, 3, 0, 0, 15, 0, }, /* 462 */ - { 10, 21, 12, 0, 0, -37, 0, }, /* 463 */ - { 28, 12, 3, 0, 0, -13, 0, }, /* 464 */ - { 28, 12, 3, 0, 0, -43, 0, }, /* 465 */ - { 28, 12, 3, 0, 0, -146, 0, }, /* 466 */ - { 10, 10, 5, 0, 0, -13, 0, }, /* 467 */ - { 10, 7, 12, 0, 0, -40, 0, }, /* 468 */ - { 10, 7, 12, 0, 0, -13, 0, }, /* 469 */ - { 10, 7, 12, 0, 0, 15, 0, }, /* 470 */ - { 10, 7, 12, 0, 0, -162, 0, }, /* 471 */ - { 10, 7, 12, 0, 0, -37, 0, }, /* 472 */ - { 28, 12, 3, 0, 0, -96, 0, }, /* 473 */ - { 10, 10, 5, 0, 0, 3, 0, }, /* 474 */ - { 28, 12, 3, 0, 0, -37, 0, }, /* 475 */ - { 10, 7, 12, 0, 0, 150, 0, }, /* 476 */ - { 13, 5, 12, 0, 0, 13, 0, }, /* 477 */ - { 13, 6, 12, 0, 0, 13, 0, }, /* 478 */ - { 34, 5, 12, 0, 35332, 34, 0, }, /* 479 */ - { 34, 5, 12, 0, 3814, 34, 0, }, /* 480 */ - { 34, 5, 12, 0, 35384, 34, 0, }, /* 481 */ - { 28, 12, 3, 0, 0, -34, 0, }, /* 482 */ - { 34, 9, 12, 92, 1, 34, 0, }, /* 483 */ - { 34, 5, 12, 92, -1, 34, 0, }, /* 484 */ - { 34, 5, 12, 92, -58, 34, 0, }, /* 485 */ - { 34, 9, 12, 0, -7615, 34, 0, }, /* 486 */ - { 20, 5, 12, 0, 8, 20, 0, }, /* 487 */ - { 20, 9, 12, 0, -8, 20, 0, }, /* 488 */ - { 20, 5, 12, 0, 74, 20, 0, }, /* 489 */ - { 20, 5, 12, 0, 86, 20, 0, }, /* 490 */ - { 20, 5, 12, 0, 100, 20, 0, }, /* 491 */ - { 20, 5, 12, 0, 128, 20, 0, }, /* 492 */ - { 20, 5, 12, 0, 112, 20, 0, }, /* 493 */ - { 20, 5, 12, 0, 126, 20, 0, }, /* 494 */ - { 20, 8, 12, 0, -8, 20, 0, }, /* 495 */ - { 20, 5, 12, 0, 9, 20, 0, }, /* 496 */ - { 20, 9, 12, 0, -74, 20, 0, }, /* 497 */ - { 20, 8, 12, 0, -9, 20, 0, }, /* 498 */ - { 20, 5, 12, 21, -7173, 20, 0, }, /* 499 */ - { 20, 9, 12, 0, -86, 20, 0, }, /* 500 */ - { 20, 9, 12, 0, -100, 20, 0, }, /* 501 */ - { 20, 9, 12, 0, -112, 20, 0, }, /* 502 */ - { 20, 9, 12, 0, -128, 20, 0, }, /* 503 */ - { 20, 9, 12, 0, -126, 20, 0, }, /* 504 */ - { 28, 1, 3, 0, 0, 28, 0, }, /* 505 */ - { 28, 1, 13, 0, 0, 28, 0, }, /* 506 */ - { 10, 27, 2, 0, 0, 10, 0, }, /* 507 */ - { 10, 28, 2, 0, 0, 10, 0, }, /* 508 */ - { 10, 29, 12, 0, 0, -70, 0, }, /* 509 */ - { 10, 21, 14, 0, 0, 10, 0, }, /* 510 */ - { 0, 2, 2, 0, 0, 0, 0, }, /* 511 */ - { 28, 12, 3, 0, 0, -100, 0, }, /* 512 */ - { 10, 9, 12, 0, 0, 10, 0, }, /* 513 */ - { 10, 5, 12, 0, 0, 10, 0, }, /* 514 */ - { 20, 9, 12, 96, -7517, 20, 0, }, /* 515 */ - { 34, 9, 12, 100, -8383, 34, 0, }, /* 516 */ - { 34, 9, 12, 104, -8262, 34, 0, }, /* 517 */ - { 34, 9, 12, 0, 28, 34, 0, }, /* 518 */ - { 10, 7, 12, 0, 0, 10, 0, }, /* 519 */ - { 10, 5, 14, 0, 0, 10, 0, }, /* 520 */ - { 34, 5, 12, 0, -28, 34, 0, }, /* 521 */ - { 34, 14, 12, 0, 16, 34, 0, }, /* 522 */ - { 34, 14, 12, 0, -16, 34, 0, }, /* 523 */ - { 34, 14, 12, 0, 0, 34, 0, }, /* 524 */ - { 10, 25, 14, 0, 0, 10, 0, }, /* 525 */ - { 10, 26, 12, 0, 26, 10, 0, }, /* 526 */ - { 10, 26, 14, 0, 26, 10, 0, }, /* 527 */ - { 10, 26, 12, 0, -26, 10, 0, }, /* 528 */ - { 5, 26, 12, 0, 0, 5, 0, }, /* 529 */ - { 18, 9, 12, 0, 48, 18, 0, }, /* 530 */ - { 18, 5, 12, 0, -48, 18, 0, }, /* 531 */ - { 34, 9, 12, 0, -10743, 34, 0, }, /* 532 */ - { 34, 9, 12, 0, -3814, 34, 0, }, /* 533 */ - { 34, 9, 12, 0, -10727, 34, 0, }, /* 534 */ - { 34, 5, 12, 0, -10795, 34, 0, }, /* 535 */ - { 34, 5, 12, 0, -10792, 34, 0, }, /* 536 */ - { 34, 9, 12, 0, -10780, 34, 0, }, /* 537 */ - { 34, 9, 12, 0, -10749, 34, 0, }, /* 538 */ - { 34, 9, 12, 0, -10783, 34, 0, }, /* 539 */ - { 34, 9, 12, 0, -10782, 34, 0, }, /* 540 */ - { 34, 9, 12, 0, -10815, 34, 0, }, /* 541 */ - { 11, 5, 12, 0, 0, 11, 0, }, /* 542 */ - { 11, 26, 12, 0, 0, 11, 0, }, /* 543 */ - { 11, 12, 3, 0, 0, 11, 0, }, /* 544 */ - { 11, 21, 12, 0, 0, 11, 0, }, /* 545 */ - { 11, 15, 12, 0, 0, 11, 0, }, /* 546 */ - { 17, 5, 12, 0, -7264, 17, 0, }, /* 547 */ - { 59, 7, 12, 0, 0, 59, 0, }, /* 548 */ - { 59, 6, 12, 0, 0, 59, 0, }, /* 549 */ - { 59, 21, 12, 0, 0, 59, 0, }, /* 550 */ - { 59, 12, 3, 0, 0, 59, 0, }, /* 551 */ - { 13, 12, 3, 0, 0, 13, 0, }, /* 552 */ - { 10, 21, 12, 0, 0, -25, 0, }, /* 553 */ - { 23, 26, 12, 0, 0, 23, 0, }, /* 554 */ - { 10, 21, 12, 0, 0, -139, 0, }, /* 555 */ - { 10, 21, 12, 0, 0, -133, 0, }, /* 556 */ - { 23, 6, 12, 0, 0, 23, 0, }, /* 557 */ - { 10, 7, 12, 0, 0, 23, 0, }, /* 558 */ - { 23, 14, 12, 0, 0, 23, 0, }, /* 559 */ - { 10, 22, 12, 0, 0, -139, 0, }, /* 560 */ - { 10, 18, 12, 0, 0, -139, 0, }, /* 561 */ - { 10, 26, 12, 0, 0, -133, 0, }, /* 562 */ - { 10, 17, 12, 0, 0, -133, 0, }, /* 563 */ - { 10, 22, 12, 0, 0, -133, 0, }, /* 564 */ - { 10, 18, 12, 0, 0, -133, 0, }, /* 565 */ - { 28, 12, 3, 0, 0, -16, 0, }, /* 566 */ - { 24, 10, 3, 0, 0, 24, 0, }, /* 567 */ - { 10, 17, 14, 0, 0, -133, 0, }, /* 568 */ - { 10, 6, 12, 0, 0, -64, 0, }, /* 569 */ - { 10, 7, 12, 0, 0, -104, 0, }, /* 570 */ - { 10, 21, 14, 0, 0, -104, 0, }, /* 571 */ - { 10, 26, 12, 0, 0, 23, 0, }, /* 572 */ - { 27, 7, 12, 0, 0, 27, 0, }, /* 573 */ - { 28, 12, 3, 0, 0, -64, 0, }, /* 574 */ - { 10, 24, 12, 0, 0, -64, 0, }, /* 575 */ - { 27, 6, 12, 0, 0, 27, 0, }, /* 576 */ - { 10, 17, 12, 0, 0, -64, 0, }, /* 577 */ - { 30, 7, 12, 0, 0, 30, 0, }, /* 578 */ - { 30, 6, 12, 0, 0, 30, 0, }, /* 579 */ - { 4, 7, 12, 0, 0, 4, 0, }, /* 580 */ - { 24, 7, 12, 0, 0, 24, 0, }, /* 581 */ - { 10, 15, 12, 0, 0, 23, 0, }, /* 582 */ - { 24, 26, 12, 0, 0, 24, 0, }, /* 583 */ - { 10, 26, 14, 0, 0, 23, 0, }, /* 584 */ - { 30, 26, 12, 0, 0, 30, 0, }, /* 585 */ - { 23, 7, 12, 0, 0, 23, 0, }, /* 586 */ - { 61, 7, 12, 0, 0, 61, 0, }, /* 587 */ - { 61, 6, 12, 0, 0, 61, 0, }, /* 588 */ - { 61, 26, 12, 0, 0, 61, 0, }, /* 589 */ - { 86, 7, 12, 0, 0, 86, 0, }, /* 590 */ - { 86, 6, 12, 0, 0, 86, 0, }, /* 591 */ - { 86, 21, 12, 0, 0, 86, 0, }, /* 592 */ - { 77, 7, 12, 0, 0, 77, 0, }, /* 593 */ - { 77, 6, 12, 0, 0, 77, 0, }, /* 594 */ - { 77, 21, 12, 0, 0, 77, 0, }, /* 595 */ - { 77, 13, 12, 0, 0, 77, 0, }, /* 596 */ - { 13, 9, 12, 108, 1, 13, 0, }, /* 597 */ - { 13, 5, 12, 108, -35267, 13, 0, }, /* 598 */ - { 13, 7, 12, 0, 0, 13, 0, }, /* 599 */ - { 13, 21, 12, 0, 0, 13, 0, }, /* 600 */ - { 79, 7, 12, 0, 0, 79, 0, }, /* 601 */ - { 79, 14, 12, 0, 0, 79, 0, }, /* 602 */ - { 79, 12, 3, 0, 0, 79, 0, }, /* 603 */ - { 79, 21, 12, 0, 0, 79, 0, }, /* 604 */ - { 10, 24, 12, 0, 0, -61, 0, }, /* 605 */ - { 34, 9, 12, 0, -35332, 34, 0, }, /* 606 */ - { 34, 9, 12, 0, -42280, 34, 0, }, /* 607 */ - { 34, 5, 12, 0, 48, 34, 0, }, /* 608 */ - { 34, 9, 12, 0, -42308, 34, 0, }, /* 609 */ - { 34, 9, 12, 0, -42319, 34, 0, }, /* 610 */ - { 34, 9, 12, 0, -42315, 34, 0, }, /* 611 */ - { 34, 9, 12, 0, -42305, 34, 0, }, /* 612 */ - { 34, 9, 12, 0, -42258, 34, 0, }, /* 613 */ - { 34, 9, 12, 0, -42282, 34, 0, }, /* 614 */ - { 34, 9, 12, 0, -42261, 34, 0, }, /* 615 */ - { 34, 9, 12, 0, 928, 34, 0, }, /* 616 */ - { 34, 9, 12, 0, -48, 34, 0, }, /* 617 */ - { 34, 9, 12, 0, -42307, 34, 0, }, /* 618 */ - { 34, 9, 12, 0, -35384, 34, 0, }, /* 619 */ - { 49, 7, 12, 0, 0, 49, 0, }, /* 620 */ - { 49, 12, 3, 0, 0, 49, 0, }, /* 621 */ - { 49, 10, 5, 0, 0, 49, 0, }, /* 622 */ - { 49, 26, 12, 0, 0, 49, 0, }, /* 623 */ - { 10, 15, 12, 0, 0, -224, 0, }, /* 624 */ - { 10, 15, 12, 0, 0, -210, 0, }, /* 625 */ - { 10, 26, 12, 0, 0, -171, 0, }, /* 626 */ - { 10, 23, 12, 0, 0, -171, 0, }, /* 627 */ - { 65, 7, 12, 0, 0, 65, 0, }, /* 628 */ - { 65, 21, 12, 0, 0, 65, 0, }, /* 629 */ - { 75, 10, 5, 0, 0, 75, 0, }, /* 630 */ - { 75, 7, 12, 0, 0, 75, 0, }, /* 631 */ - { 75, 12, 3, 0, 0, 75, 0, }, /* 632 */ - { 75, 21, 12, 0, 0, 75, 0, }, /* 633 */ - { 75, 13, 12, 0, 0, 75, 0, }, /* 634 */ - { 15, 12, 3, 0, 0, -13, 0, }, /* 635 */ - { 15, 7, 12, 0, 0, -46, 0, }, /* 636 */ - { 69, 13, 12, 0, 0, 69, 0, }, /* 637 */ - { 69, 7, 12, 0, 0, 69, 0, }, /* 638 */ - { 69, 12, 3, 0, 0, 69, 0, }, /* 639 */ - { 10, 21, 12, 0, 0, -108, 0, }, /* 640 */ - { 69, 21, 12, 0, 0, 69, 0, }, /* 641 */ - { 74, 7, 12, 0, 0, 74, 0, }, /* 642 */ - { 74, 12, 3, 0, 0, 74, 0, }, /* 643 */ - { 74, 10, 5, 0, 0, 74, 0, }, /* 644 */ - { 74, 21, 12, 0, 0, 74, 0, }, /* 645 */ - { 84, 12, 3, 0, 0, 84, 0, }, /* 646 */ - { 84, 10, 5, 0, 0, 84, 0, }, /* 647 */ - { 84, 7, 12, 0, 0, 84, 0, }, /* 648 */ - { 84, 21, 12, 0, 0, 84, 0, }, /* 649 */ - { 10, 6, 12, 0, 0, -19, 0, }, /* 650 */ - { 84, 13, 12, 0, 0, 84, 0, }, /* 651 */ - { 39, 6, 12, 0, 0, 39, 0, }, /* 652 */ - { 68, 7, 12, 0, 0, 68, 0, }, /* 653 */ - { 68, 12, 3, 0, 0, 68, 0, }, /* 654 */ - { 68, 10, 5, 0, 0, 68, 0, }, /* 655 */ - { 68, 13, 12, 0, 0, 68, 0, }, /* 656 */ - { 68, 21, 12, 0, 0, 68, 0, }, /* 657 */ - { 92, 7, 12, 0, 0, 92, 0, }, /* 658 */ - { 92, 12, 3, 0, 0, 92, 0, }, /* 659 */ - { 92, 6, 12, 0, 0, 92, 0, }, /* 660 */ - { 92, 21, 12, 0, 0, 92, 0, }, /* 661 */ - { 87, 7, 12, 0, 0, 87, 0, }, /* 662 */ - { 87, 10, 5, 0, 0, 87, 0, }, /* 663 */ - { 87, 12, 3, 0, 0, 87, 0, }, /* 664 */ - { 87, 21, 12, 0, 0, 87, 0, }, /* 665 */ - { 87, 6, 12, 0, 0, 87, 0, }, /* 666 */ - { 34, 5, 12, 0, -928, 34, 0, }, /* 667 */ - { 9, 5, 12, 0, -38864, 9, 0, }, /* 668 */ - { 87, 13, 12, 0, 0, 87, 0, }, /* 669 */ - { 24, 7, 9, 0, 0, 24, 0, }, /* 670 */ - { 24, 7, 10, 0, 0, 24, 0, }, /* 671 */ - { 0, 4, 12, 0, 0, 0, 0, }, /* 672 */ - { 0, 3, 12, 0, 0, 0, 0, }, /* 673 */ - { 26, 25, 12, 0, 0, 26, 0, }, /* 674 */ - { 1, 24, 12, 0, 0, 1, 0, }, /* 675 */ - { 1, 7, 12, 0, 0, -10, 0, }, /* 676 */ - { 1, 26, 12, 0, 0, -10, 0, }, /* 677 */ - { 10, 6, 3, 0, 0, -64, 0, }, /* 678 */ - { 36, 7, 12, 0, 0, 36, 0, }, /* 679 */ - { 10, 21, 12, 0, 0, -22, 0, }, /* 680 */ - { 10, 15, 12, 0, 0, -92, 0, }, /* 681 */ - { 10, 26, 12, 0, 0, -22, 0, }, /* 682 */ - { 20, 14, 12, 0, 0, 20, 0, }, /* 683 */ - { 20, 15, 12, 0, 0, 20, 0, }, /* 684 */ - { 20, 26, 12, 0, 0, 20, 0, }, /* 685 */ - { 71, 7, 12, 0, 0, 71, 0, }, /* 686 */ - { 67, 7, 12, 0, 0, 67, 0, }, /* 687 */ - { 28, 12, 3, 0, 0, -1, 0, }, /* 688 */ - { 10, 15, 12, 0, 0, -1, 0, }, /* 689 */ - { 42, 7, 12, 0, 0, 42, 0, }, /* 690 */ - { 42, 15, 12, 0, 0, 42, 0, }, /* 691 */ - { 19, 7, 12, 0, 0, 19, 0, }, /* 692 */ - { 19, 14, 12, 0, 0, 19, 0, }, /* 693 */ - { 118, 7, 12, 0, 0, 118, 0, }, /* 694 */ - { 118, 12, 3, 0, 0, 118, 0, }, /* 695 */ - { 60, 7, 12, 0, 0, 60, 0, }, /* 696 */ - { 60, 21, 12, 0, 0, 60, 0, }, /* 697 */ - { 43, 7, 12, 0, 0, 43, 0, }, /* 698 */ - { 43, 21, 12, 0, 0, 43, 0, }, /* 699 */ - { 43, 14, 12, 0, 0, 43, 0, }, /* 700 */ - { 14, 9, 12, 0, 40, 14, 0, }, /* 701 */ - { 14, 5, 12, 0, -40, 14, 0, }, /* 702 */ - { 47, 7, 12, 0, 0, 47, 0, }, /* 703 */ - { 45, 7, 12, 0, 0, 45, 0, }, /* 704 */ - { 45, 13, 12, 0, 0, 45, 0, }, /* 705 */ - { 136, 9, 12, 0, 40, 136, 0, }, /* 706 */ - { 136, 5, 12, 0, -40, 136, 0, }, /* 707 */ - { 106, 7, 12, 0, 0, 106, 0, }, /* 708 */ - { 104, 7, 12, 0, 0, 104, 0, }, /* 709 */ - { 104, 21, 12, 0, 0, 104, 0, }, /* 710 */ - { 110, 7, 12, 0, 0, 110, 0, }, /* 711 */ - { 12, 7, 12, 0, 0, 12, 0, }, /* 712 */ - { 81, 7, 12, 0, 0, 81, 0, }, /* 713 */ - { 81, 21, 12, 0, 0, 81, 0, }, /* 714 */ - { 81, 15, 12, 0, 0, 81, 0, }, /* 715 */ - { 120, 7, 12, 0, 0, 120, 0, }, /* 716 */ - { 120, 26, 12, 0, 0, 120, 0, }, /* 717 */ - { 120, 15, 12, 0, 0, 120, 0, }, /* 718 */ - { 116, 7, 12, 0, 0, 116, 0, }, /* 719 */ - { 116, 15, 12, 0, 0, 116, 0, }, /* 720 */ - { 128, 7, 12, 0, 0, 128, 0, }, /* 721 */ - { 128, 15, 12, 0, 0, 128, 0, }, /* 722 */ - { 66, 7, 12, 0, 0, 66, 0, }, /* 723 */ - { 66, 15, 12, 0, 0, 66, 0, }, /* 724 */ - { 66, 21, 12, 0, 0, 66, 0, }, /* 725 */ - { 72, 7, 12, 0, 0, 72, 0, }, /* 726 */ - { 72, 21, 12, 0, 0, 72, 0, }, /* 727 */ - { 98, 7, 12, 0, 0, 98, 0, }, /* 728 */ - { 97, 7, 12, 0, 0, 97, 0, }, /* 729 */ - { 97, 15, 12, 0, 0, 97, 0, }, /* 730 */ - { 31, 7, 12, 0, 0, 31, 0, }, /* 731 */ - { 31, 12, 3, 0, 0, 31, 0, }, /* 732 */ - { 31, 15, 12, 0, 0, 31, 0, }, /* 733 */ - { 31, 21, 12, 0, 0, 31, 0, }, /* 734 */ - { 88, 7, 12, 0, 0, 88, 0, }, /* 735 */ - { 88, 15, 12, 0, 0, 88, 0, }, /* 736 */ - { 88, 21, 12, 0, 0, 88, 0, }, /* 737 */ - { 117, 7, 12, 0, 0, 117, 0, }, /* 738 */ - { 117, 15, 12, 0, 0, 117, 0, }, /* 739 */ - { 112, 7, 12, 0, 0, 112, 0, }, /* 740 */ - { 112, 26, 12, 0, 0, 112, 0, }, /* 741 */ - { 112, 12, 3, 0, 0, 112, 0, }, /* 742 */ - { 112, 15, 12, 0, 0, 112, 0, }, /* 743 */ - { 112, 21, 12, 0, 0, 112, 0, }, /* 744 */ - { 78, 7, 12, 0, 0, 78, 0, }, /* 745 */ - { 78, 21, 12, 0, 0, 78, 0, }, /* 746 */ - { 83, 7, 12, 0, 0, 83, 0, }, /* 747 */ - { 83, 15, 12, 0, 0, 83, 0, }, /* 748 */ - { 82, 7, 12, 0, 0, 82, 0, }, /* 749 */ - { 82, 15, 12, 0, 0, 82, 0, }, /* 750 */ - { 121, 7, 12, 0, 0, 121, 0, }, /* 751 */ - { 121, 21, 12, 0, 0, 121, 0, }, /* 752 */ - { 121, 15, 12, 0, 0, 121, 0, }, /* 753 */ - { 89, 7, 12, 0, 0, 89, 0, }, /* 754 */ - { 130, 9, 12, 0, 64, 130, 0, }, /* 755 */ - { 130, 5, 12, 0, -64, 130, 0, }, /* 756 */ - { 130, 15, 12, 0, 0, 130, 0, }, /* 757 */ - { 144, 7, 12, 0, 0, 144, 0, }, /* 758 */ - { 144, 12, 3, 0, 0, 144, 0, }, /* 759 */ - { 144, 13, 12, 0, 0, 144, 0, }, /* 760 */ - { 1, 15, 12, 0, 0, 1, 0, }, /* 761 */ - { 156, 7, 12, 0, 0, 156, 0, }, /* 762 */ - { 156, 12, 3, 0, 0, 156, 0, }, /* 763 */ - { 156, 17, 12, 0, 0, 156, 0, }, /* 764 */ - { 147, 7, 12, 0, 0, 147, 0, }, /* 765 */ - { 147, 15, 12, 0, 0, 147, 0, }, /* 766 */ - { 148, 7, 12, 0, 0, 148, 0, }, /* 767 */ - { 148, 12, 3, 0, 0, 148, 0, }, /* 768 */ - { 148, 15, 12, 0, 0, 148, 0, }, /* 769 */ - { 148, 21, 12, 0, 0, 148, 0, }, /* 770 */ - { 153, 7, 12, 0, 0, 153, 0, }, /* 771 */ - { 153, 15, 12, 0, 0, 153, 0, }, /* 772 */ - { 149, 7, 12, 0, 0, 149, 0, }, /* 773 */ - { 94, 10, 5, 0, 0, 94, 0, }, /* 774 */ - { 94, 12, 3, 0, 0, 94, 0, }, /* 775 */ - { 94, 7, 12, 0, 0, 94, 0, }, /* 776 */ - { 94, 21, 12, 0, 0, 94, 0, }, /* 777 */ - { 94, 15, 12, 0, 0, 94, 0, }, /* 778 */ - { 94, 13, 12, 0, 0, 94, 0, }, /* 779 */ - { 85, 12, 3, 0, 0, 85, 0, }, /* 780 */ - { 85, 10, 5, 0, 0, 85, 0, }, /* 781 */ - { 85, 7, 12, 0, 0, 85, 0, }, /* 782 */ - { 85, 21, 12, 0, 0, 85, 0, }, /* 783 */ - { 85, 1, 4, 0, 0, 85, 0, }, /* 784 */ - { 101, 7, 12, 0, 0, 101, 0, }, /* 785 */ - { 101, 13, 12, 0, 0, 101, 0, }, /* 786 */ - { 96, 12, 3, 0, 0, 96, 0, }, /* 787 */ - { 96, 7, 12, 0, 0, 96, 0, }, /* 788 */ - { 96, 10, 5, 0, 0, 96, 0, }, /* 789 */ - { 96, 13, 12, 0, 0, 96, 0, }, /* 790 */ - { 96, 21, 12, 0, 0, 96, 0, }, /* 791 */ - { 111, 7, 12, 0, 0, 111, 0, }, /* 792 */ - { 111, 12, 3, 0, 0, 111, 0, }, /* 793 */ - { 111, 21, 12, 0, 0, 111, 0, }, /* 794 */ - { 100, 12, 3, 0, 0, 100, 0, }, /* 795 */ - { 100, 10, 5, 0, 0, 100, 0, }, /* 796 */ - { 100, 7, 12, 0, 0, 100, 0, }, /* 797 */ - { 100, 7, 4, 0, 0, 100, 0, }, /* 798 */ - { 100, 21, 12, 0, 0, 100, 0, }, /* 799 */ - { 100, 13, 12, 0, 0, 100, 0, }, /* 800 */ - { 48, 15, 12, 0, 0, 48, 0, }, /* 801 */ - { 108, 7, 12, 0, 0, 108, 0, }, /* 802 */ - { 108, 10, 5, 0, 0, 108, 0, }, /* 803 */ - { 108, 12, 3, 0, 0, 108, 0, }, /* 804 */ - { 108, 21, 12, 0, 0, 108, 0, }, /* 805 */ - { 129, 7, 12, 0, 0, 129, 0, }, /* 806 */ - { 129, 21, 12, 0, 0, 129, 0, }, /* 807 */ - { 109, 7, 12, 0, 0, 109, 0, }, /* 808 */ - { 109, 12, 3, 0, 0, 109, 0, }, /* 809 */ - { 109, 10, 5, 0, 0, 109, 0, }, /* 810 */ - { 109, 13, 12, 0, 0, 109, 0, }, /* 811 */ - { 107, 12, 3, 0, 0, 107, 0, }, /* 812 */ - { 107, 12, 3, 0, 0, -52, 0, }, /* 813 */ - { 107, 10, 5, 0, 0, 107, 0, }, /* 814 */ - { 107, 10, 5, 0, 0, -52, 0, }, /* 815 */ - { 107, 7, 12, 0, 0, 107, 0, }, /* 816 */ - { 28, 12, 3, 0, 0, -52, 0, }, /* 817 */ - { 107, 10, 3, 0, 0, 107, 0, }, /* 818 */ - { 135, 7, 12, 0, 0, 135, 0, }, /* 819 */ - { 135, 10, 5, 0, 0, 135, 0, }, /* 820 */ - { 135, 12, 3, 0, 0, 135, 0, }, /* 821 */ - { 135, 21, 12, 0, 0, 135, 0, }, /* 822 */ - { 135, 13, 12, 0, 0, 135, 0, }, /* 823 */ - { 124, 7, 12, 0, 0, 124, 0, }, /* 824 */ - { 124, 10, 3, 0, 0, 124, 0, }, /* 825 */ - { 124, 10, 5, 0, 0, 124, 0, }, /* 826 */ - { 124, 12, 3, 0, 0, 124, 0, }, /* 827 */ - { 124, 21, 12, 0, 0, 124, 0, }, /* 828 */ - { 124, 13, 12, 0, 0, 124, 0, }, /* 829 */ - { 123, 7, 12, 0, 0, 123, 0, }, /* 830 */ - { 123, 10, 3, 0, 0, 123, 0, }, /* 831 */ - { 123, 10, 5, 0, 0, 123, 0, }, /* 832 */ - { 123, 12, 3, 0, 0, 123, 0, }, /* 833 */ - { 123, 21, 12, 0, 0, 123, 0, }, /* 834 */ - { 114, 7, 12, 0, 0, 114, 0, }, /* 835 */ - { 114, 10, 5, 0, 0, 114, 0, }, /* 836 */ - { 114, 12, 3, 0, 0, 114, 0, }, /* 837 */ - { 114, 21, 12, 0, 0, 114, 0, }, /* 838 */ - { 114, 13, 12, 0, 0, 114, 0, }, /* 839 */ - { 102, 7, 12, 0, 0, 102, 0, }, /* 840 */ - { 102, 12, 3, 0, 0, 102, 0, }, /* 841 */ - { 102, 10, 5, 0, 0, 102, 0, }, /* 842 */ - { 102, 13, 12, 0, 0, 102, 0, }, /* 843 */ - { 126, 7, 12, 0, 0, 126, 0, }, /* 844 */ - { 126, 12, 3, 0, 0, 126, 0, }, /* 845 */ - { 126, 10, 5, 0, 0, 126, 0, }, /* 846 */ - { 126, 13, 12, 0, 0, 126, 0, }, /* 847 */ - { 126, 15, 12, 0, 0, 126, 0, }, /* 848 */ - { 126, 21, 12, 0, 0, 126, 0, }, /* 849 */ - { 126, 26, 12, 0, 0, 126, 0, }, /* 850 */ - { 142, 7, 12, 0, 0, 142, 0, }, /* 851 */ - { 142, 10, 5, 0, 0, 142, 0, }, /* 852 */ - { 142, 12, 3, 0, 0, 142, 0, }, /* 853 */ - { 142, 21, 12, 0, 0, 142, 0, }, /* 854 */ - { 125, 9, 12, 0, 32, 125, 0, }, /* 855 */ - { 125, 5, 12, 0, -32, 125, 0, }, /* 856 */ - { 125, 13, 12, 0, 0, 125, 0, }, /* 857 */ - { 125, 15, 12, 0, 0, 125, 0, }, /* 858 */ - { 125, 7, 12, 0, 0, 125, 0, }, /* 859 */ - { 154, 7, 12, 0, 0, 154, 0, }, /* 860 */ - { 154, 10, 3, 0, 0, 154, 0, }, /* 861 */ - { 154, 10, 5, 0, 0, 154, 0, }, /* 862 */ - { 154, 12, 3, 0, 0, 154, 0, }, /* 863 */ - { 154, 7, 4, 0, 0, 154, 0, }, /* 864 */ - { 154, 21, 12, 0, 0, 154, 0, }, /* 865 */ - { 154, 13, 12, 0, 0, 154, 0, }, /* 866 */ - { 150, 7, 12, 0, 0, 150, 0, }, /* 867 */ - { 150, 10, 5, 0, 0, 150, 0, }, /* 868 */ - { 150, 12, 3, 0, 0, 150, 0, }, /* 869 */ - { 150, 21, 12, 0, 0, 150, 0, }, /* 870 */ - { 141, 7, 12, 0, 0, 141, 0, }, /* 871 */ - { 141, 12, 3, 0, 0, 141, 0, }, /* 872 */ - { 141, 10, 5, 0, 0, 141, 0, }, /* 873 */ - { 141, 7, 4, 0, 0, 141, 0, }, /* 874 */ - { 141, 21, 12, 0, 0, 141, 0, }, /* 875 */ - { 140, 7, 12, 0, 0, 140, 0, }, /* 876 */ - { 140, 12, 3, 0, 0, 140, 0, }, /* 877 */ - { 140, 10, 5, 0, 0, 140, 0, }, /* 878 */ - { 140, 7, 4, 0, 0, 140, 0, }, /* 879 */ - { 140, 21, 12, 0, 0, 140, 0, }, /* 880 */ - { 122, 7, 12, 0, 0, 122, 0, }, /* 881 */ - { 133, 7, 12, 0, 0, 133, 0, }, /* 882 */ - { 133, 10, 5, 0, 0, 133, 0, }, /* 883 */ - { 133, 12, 3, 0, 0, 133, 0, }, /* 884 */ - { 133, 21, 12, 0, 0, 133, 0, }, /* 885 */ - { 133, 13, 12, 0, 0, 133, 0, }, /* 886 */ - { 133, 15, 12, 0, 0, 133, 0, }, /* 887 */ - { 134, 21, 12, 0, 0, 134, 0, }, /* 888 */ - { 134, 7, 12, 0, 0, 134, 0, }, /* 889 */ - { 134, 12, 3, 0, 0, 134, 0, }, /* 890 */ - { 134, 10, 5, 0, 0, 134, 0, }, /* 891 */ - { 138, 7, 12, 0, 0, 138, 0, }, /* 892 */ - { 138, 12, 3, 0, 0, 138, 0, }, /* 893 */ - { 138, 7, 4, 0, 0, 138, 0, }, /* 894 */ - { 138, 13, 12, 0, 0, 138, 0, }, /* 895 */ - { 143, 7, 12, 0, 0, 143, 0, }, /* 896 */ - { 143, 10, 5, 0, 0, 143, 0, }, /* 897 */ - { 143, 12, 3, 0, 0, 143, 0, }, /* 898 */ - { 143, 13, 12, 0, 0, 143, 0, }, /* 899 */ - { 145, 7, 12, 0, 0, 145, 0, }, /* 900 */ - { 145, 12, 3, 0, 0, 145, 0, }, /* 901 */ - { 145, 10, 5, 0, 0, 145, 0, }, /* 902 */ - { 145, 21, 12, 0, 0, 145, 0, }, /* 903 */ - { 54, 15, 12, 0, 0, 54, 0, }, /* 904 */ - { 54, 21, 12, 0, 0, 54, 0, }, /* 905 */ - { 63, 7, 12, 0, 0, 63, 0, }, /* 906 */ - { 63, 14, 12, 0, 0, 63, 0, }, /* 907 */ - { 63, 21, 12, 0, 0, 63, 0, }, /* 908 */ - { 80, 7, 12, 0, 0, 80, 0, }, /* 909 */ - { 80, 1, 2, 0, 0, 80, 0, }, /* 910 */ - { 127, 7, 12, 0, 0, 127, 0, }, /* 911 */ - { 115, 7, 12, 0, 0, 115, 0, }, /* 912 */ - { 115, 13, 12, 0, 0, 115, 0, }, /* 913 */ - { 115, 21, 12, 0, 0, 115, 0, }, /* 914 */ - { 103, 7, 12, 0, 0, 103, 0, }, /* 915 */ - { 103, 12, 3, 0, 0, 103, 0, }, /* 916 */ - { 103, 21, 12, 0, 0, 103, 0, }, /* 917 */ - { 119, 7, 12, 0, 0, 119, 0, }, /* 918 */ - { 119, 12, 3, 0, 0, 119, 0, }, /* 919 */ - { 119, 21, 12, 0, 0, 119, 0, }, /* 920 */ - { 119, 26, 12, 0, 0, 119, 0, }, /* 921 */ - { 119, 6, 12, 0, 0, 119, 0, }, /* 922 */ - { 119, 13, 12, 0, 0, 119, 0, }, /* 923 */ - { 119, 15, 12, 0, 0, 119, 0, }, /* 924 */ - { 146, 9, 12, 0, 32, 146, 0, }, /* 925 */ - { 146, 5, 12, 0, -32, 146, 0, }, /* 926 */ - { 146, 15, 12, 0, 0, 146, 0, }, /* 927 */ - { 146, 21, 12, 0, 0, 146, 0, }, /* 928 */ - { 99, 7, 12, 0, 0, 99, 0, }, /* 929 */ - { 99, 12, 3, 0, 0, 99, 0, }, /* 930 */ - { 99, 10, 5, 0, 0, 99, 0, }, /* 931 */ - { 99, 6, 12, 0, 0, 99, 0, }, /* 932 */ - { 137, 6, 12, 0, 0, 137, 0, }, /* 933 */ - { 139, 6, 12, 0, 0, 139, 0, }, /* 934 */ - { 155, 12, 3, 0, 0, 155, 0, }, /* 935 */ - { 23, 10, 5, 0, 0, 23, 0, }, /* 936 */ - { 137, 7, 12, 0, 0, 137, 0, }, /* 937 */ - { 155, 7, 12, 0, 0, 155, 0, }, /* 938 */ - { 139, 7, 12, 0, 0, 139, 0, }, /* 939 */ - { 105, 7, 12, 0, 0, 105, 0, }, /* 940 */ - { 105, 26, 12, 0, 0, 105, 0, }, /* 941 */ - { 105, 12, 3, 0, 0, 105, 0, }, /* 942 */ - { 105, 21, 12, 0, 0, 105, 0, }, /* 943 */ - { 10, 1, 2, 0, 0, 105, 0, }, /* 944 */ - { 10, 10, 3, 0, 0, 10, 0, }, /* 945 */ - { 10, 10, 5, 0, 0, 10, 0, }, /* 946 */ - { 20, 12, 3, 0, 0, 20, 0, }, /* 947 */ - { 131, 26, 12, 0, 0, 131, 0, }, /* 948 */ - { 131, 12, 3, 0, 0, 131, 0, }, /* 949 */ - { 131, 21, 12, 0, 0, 131, 0, }, /* 950 */ - { 18, 12, 3, 0, 0, 18, 0, }, /* 951 */ - { 151, 7, 12, 0, 0, 151, 0, }, /* 952 */ - { 151, 12, 3, 0, 0, 151, 0, }, /* 953 */ - { 151, 6, 12, 0, 0, 151, 0, }, /* 954 */ - { 151, 13, 12, 0, 0, 151, 0, }, /* 955 */ - { 151, 26, 12, 0, 0, 151, 0, }, /* 956 */ - { 152, 7, 12, 0, 0, 152, 0, }, /* 957 */ - { 152, 12, 3, 0, 0, 152, 0, }, /* 958 */ - { 152, 13, 12, 0, 0, 152, 0, }, /* 959 */ - { 152, 23, 12, 0, 0, 152, 0, }, /* 960 */ - { 113, 7, 12, 0, 0, 113, 0, }, /* 961 */ - { 113, 15, 12, 0, 0, 113, 0, }, /* 962 */ - { 113, 12, 3, 0, 0, 113, 0, }, /* 963 */ - { 132, 9, 12, 0, 34, 132, 0, }, /* 964 */ - { 132, 5, 12, 0, -34, 132, 0, }, /* 965 */ - { 132, 12, 3, 0, 0, 132, 0, }, /* 966 */ - { 132, 6, 12, 0, 0, 132, 0, }, /* 967 */ - { 132, 13, 12, 0, 0, 132, 0, }, /* 968 */ - { 132, 21, 12, 0, 0, 132, 0, }, /* 969 */ - { 0, 2, 14, 0, 0, 0, 0, }, /* 970 */ - { 10, 26, 11, 0, 0, 10, 0, }, /* 971 */ - { 27, 26, 12, 0, 0, 27, 0, }, /* 972 */ - { 10, 24, 3, 0, 0, 10, 0, }, /* 973 */ - { 10, 1, 3, 0, 0, 10, 0, }, /* 974 */ + { 1, 1, 2, 0, 0, -82, 0, }, /* 223 */ + { 10, 21, 12, 0, 0, -164, 0, }, /* 224 */ + { 1, 7, 12, 0, 0, 1, 0, }, /* 225 */ + { 10, 6, 12, 0, 0, -181, 0, }, /* 226 */ + { 28, 12, 3, 0, 0, -10, 0, }, /* 227 */ + { 1, 13, 12, 0, 0, -86, 0, }, /* 228 */ + { 1, 21, 12, 0, 0, -4, 0, }, /* 229 */ + { 1, 6, 12, 0, 0, 1, 0, }, /* 230 */ + { 1, 13, 12, 0, 0, 1, 0, }, /* 231 */ + { 50, 21, 12, 0, 0, 50, 0, }, /* 232 */ + { 50, 1, 4, 0, 0, 50, 0, }, /* 233 */ + { 50, 7, 12, 0, 0, 50, 0, }, /* 234 */ + { 50, 12, 3, 0, 0, 50, 0, }, /* 235 */ + { 56, 7, 12, 0, 0, 56, 0, }, /* 236 */ + { 56, 12, 3, 0, 0, 56, 0, }, /* 237 */ + { 64, 13, 12, 0, 0, 64, 0, }, /* 238 */ + { 64, 7, 12, 0, 0, 64, 0, }, /* 239 */ + { 64, 12, 3, 0, 0, 64, 0, }, /* 240 */ + { 64, 6, 12, 0, 0, 64, 0, }, /* 241 */ + { 64, 26, 12, 0, 0, 64, 0, }, /* 242 */ + { 64, 21, 12, 0, 0, 64, 0, }, /* 243 */ + { 64, 23, 12, 0, 0, 64, 0, }, /* 244 */ + { 90, 7, 12, 0, 0, 90, 0, }, /* 245 */ + { 90, 12, 3, 0, 0, 90, 0, }, /* 246 */ + { 90, 6, 12, 0, 0, 90, 0, }, /* 247 */ + { 90, 21, 12, 0, 0, 90, 0, }, /* 248 */ + { 95, 7, 12, 0, 0, 95, 0, }, /* 249 */ + { 95, 12, 3, 0, 0, 95, 0, }, /* 250 */ + { 95, 21, 12, 0, 0, 95, 0, }, /* 251 */ + { 1, 24, 12, 0, 0, 1, 0, }, /* 252 */ + { 15, 12, 3, 0, 0, 15, 0, }, /* 253 */ + { 15, 10, 5, 0, 0, 15, 0, }, /* 254 */ + { 15, 7, 12, 0, 0, 15, 0, }, /* 255 */ + { 28, 12, 3, 0, 0, -216, 0, }, /* 256 */ + { 28, 12, 3, 0, 0, -203, 0, }, /* 257 */ + { 10, 21, 12, 0, 0, -259, 0, }, /* 258 */ + { 10, 21, 12, 0, 0, -280, 0, }, /* 259 */ + { 15, 13, 12, 0, 0, -132, 0, }, /* 260 */ + { 15, 21, 12, 0, 0, 15, 0, }, /* 261 */ + { 15, 6, 12, 0, 0, 15, 0, }, /* 262 */ + { 3, 7, 12, 0, 0, 3, 0, }, /* 263 */ + { 3, 12, 3, 0, 0, 3, 0, }, /* 264 */ + { 3, 10, 5, 0, 0, 3, 0, }, /* 265 */ + { 3, 10, 3, 0, 0, 3, 0, }, /* 266 */ + { 3, 13, 12, 0, 0, -90, 0, }, /* 267 */ + { 3, 23, 12, 0, 0, 3, 0, }, /* 268 */ + { 3, 15, 12, 0, 0, 3, 0, }, /* 269 */ + { 3, 26, 12, 0, 0, 3, 0, }, /* 270 */ + { 3, 21, 12, 0, 0, 3, 0, }, /* 271 */ + { 22, 12, 3, 0, 0, 22, 0, }, /* 272 */ + { 22, 10, 5, 0, 0, 22, 0, }, /* 273 */ + { 22, 7, 12, 0, 0, 22, 0, }, /* 274 */ + { 22, 13, 12, 0, 0, -61, 0, }, /* 275 */ + { 22, 21, 12, 0, 0, 22, 0, }, /* 276 */ + { 21, 12, 3, 0, 0, 21, 0, }, /* 277 */ + { 21, 10, 5, 0, 0, 21, 0, }, /* 278 */ + { 21, 7, 12, 0, 0, 21, 0, }, /* 279 */ + { 21, 13, 12, 0, 0, -58, 0, }, /* 280 */ + { 21, 21, 12, 0, 0, 21, 0, }, /* 281 */ + { 21, 23, 12, 0, 0, 21, 0, }, /* 282 */ + { 44, 12, 3, 0, 0, 44, 0, }, /* 283 */ + { 44, 10, 5, 0, 0, 44, 0, }, /* 284 */ + { 44, 7, 12, 0, 0, 44, 0, }, /* 285 */ + { 44, 10, 3, 0, 0, 44, 0, }, /* 286 */ + { 44, 13, 12, 0, 0, 44, 0, }, /* 287 */ + { 44, 26, 12, 0, 0, 44, 0, }, /* 288 */ + { 44, 15, 12, 0, 0, 44, 0, }, /* 289 */ + { 54, 12, 3, 0, 0, 54, 0, }, /* 290 */ + { 54, 7, 12, 0, 0, 54, 0, }, /* 291 */ + { 54, 10, 3, 0, 0, 54, 0, }, /* 292 */ + { 54, 10, 5, 0, 0, 54, 0, }, /* 293 */ + { 54, 13, 12, 0, 0, -55, 0, }, /* 294 */ + { 54, 15, 12, 0, 0, -55, 0, }, /* 295 */ + { 54, 26, 12, 0, 0, -55, 0, }, /* 296 */ + { 54, 26, 12, 0, 0, 54, 0, }, /* 297 */ + { 54, 23, 12, 0, 0, 54, 0, }, /* 298 */ + { 55, 12, 3, 0, 0, 55, 0, }, /* 299 */ + { 55, 10, 5, 0, 0, 55, 0, }, /* 300 */ + { 55, 7, 12, 0, 0, 55, 0, }, /* 301 */ + { 55, 13, 12, 0, 0, 55, 0, }, /* 302 */ + { 55, 21, 12, 0, 0, 55, 0, }, /* 303 */ + { 55, 15, 12, 0, 0, 55, 0, }, /* 304 */ + { 55, 26, 12, 0, 0, 55, 0, }, /* 305 */ + { 29, 7, 12, 0, 0, 29, 0, }, /* 306 */ + { 29, 12, 3, 0, 0, 29, 0, }, /* 307 */ + { 29, 10, 5, 0, 0, 29, 0, }, /* 308 */ + { 29, 21, 12, 0, 0, 29, 0, }, /* 309 */ + { 29, 10, 3, 0, 0, 29, 0, }, /* 310 */ + { 29, 13, 12, 0, 0, -70, 0, }, /* 311 */ + { 37, 12, 3, 0, 0, 37, 0, }, /* 312 */ + { 37, 10, 5, 0, 0, 37, 0, }, /* 313 */ + { 37, 7, 12, 0, 0, 37, 0, }, /* 314 */ + { 37, 10, 3, 0, 0, 37, 0, }, /* 315 */ + { 37, 7, 4, 0, 0, 37, 0, }, /* 316 */ + { 37, 26, 12, 0, 0, 37, 0, }, /* 317 */ + { 37, 15, 12, 0, 0, 37, 0, }, /* 318 */ + { 37, 13, 12, 0, 0, 37, 0, }, /* 319 */ + { 48, 12, 3, 0, 0, 48, 0, }, /* 320 */ + { 48, 10, 5, 0, 0, 48, 0, }, /* 321 */ + { 48, 7, 12, 0, 0, 48, 0, }, /* 322 */ + { 48, 10, 3, 0, 0, 48, 0, }, /* 323 */ + { 48, 13, 12, 0, 0, 48, 0, }, /* 324 */ + { 48, 21, 12, 0, 0, 48, 0, }, /* 325 */ + { 57, 7, 12, 0, 0, 57, 0, }, /* 326 */ + { 57, 12, 3, 0, 0, 57, 0, }, /* 327 */ + { 57, 7, 5, 0, 0, 57, 0, }, /* 328 */ + { 57, 6, 12, 0, 0, 57, 0, }, /* 329 */ + { 57, 21, 12, 0, 0, 57, 0, }, /* 330 */ + { 57, 13, 12, 0, 0, 57, 0, }, /* 331 */ + { 33, 7, 12, 0, 0, 33, 0, }, /* 332 */ + { 33, 12, 3, 0, 0, 33, 0, }, /* 333 */ + { 33, 7, 5, 0, 0, 33, 0, }, /* 334 */ + { 33, 6, 12, 0, 0, 33, 0, }, /* 335 */ + { 33, 13, 12, 0, 0, 33, 0, }, /* 336 */ + { 58, 7, 12, 0, 0, 58, 0, }, /* 337 */ + { 58, 26, 12, 0, 0, 58, 0, }, /* 338 */ + { 58, 21, 12, 0, 0, 58, 0, }, /* 339 */ + { 58, 12, 3, 0, 0, 58, 0, }, /* 340 */ + { 58, 13, 12, 0, 0, 58, 0, }, /* 341 */ + { 58, 15, 12, 0, 0, 58, 0, }, /* 342 */ + { 58, 22, 12, 0, 0, 58, 0, }, /* 343 */ + { 58, 18, 12, 0, 0, 58, 0, }, /* 344 */ + { 58, 10, 5, 0, 0, 58, 0, }, /* 345 */ + { 39, 7, 12, 0, 0, 39, 0, }, /* 346 */ + { 39, 10, 12, 0, 0, 39, 0, }, /* 347 */ + { 39, 12, 3, 0, 0, 39, 0, }, /* 348 */ + { 39, 10, 5, 0, 0, 39, 0, }, /* 349 */ + { 39, 13, 12, 0, 0, -94, 0, }, /* 350 */ + { 39, 21, 12, 0, 0, 39, 0, }, /* 351 */ + { 39, 13, 12, 0, 0, 39, 0, }, /* 352 */ + { 39, 26, 12, 0, 0, 39, 0, }, /* 353 */ + { 17, 9, 12, 0, 7264, 17, 0, }, /* 354 */ + { 17, 5, 12, 0, 3008, 17, 0, }, /* 355 */ + { 10, 21, 12, 0, 0, -52, 0, }, /* 356 */ + { 17, 6, 12, 0, 0, 17, 0, }, /* 357 */ + { 24, 7, 6, 0, 0, 24, 0, }, /* 358 */ + { 24, 7, 7, 0, 0, 24, 0, }, /* 359 */ + { 24, 7, 8, 0, 0, 24, 0, }, /* 360 */ + { 16, 7, 12, 0, 0, 16, 0, }, /* 361 */ + { 16, 12, 3, 0, 0, 16, 0, }, /* 362 */ + { 16, 21, 12, 0, 0, 16, 0, }, /* 363 */ + { 16, 15, 12, 0, 0, 16, 0, }, /* 364 */ + { 16, 26, 12, 0, 0, 16, 0, }, /* 365 */ + { 9, 9, 12, 0, 38864, 9, 0, }, /* 366 */ + { 9, 9, 12, 0, 8, 9, 0, }, /* 367 */ + { 9, 5, 12, 0, -8, 9, 0, }, /* 368 */ + { 8, 17, 12, 0, 0, 8, 0, }, /* 369 */ + { 8, 7, 12, 0, 0, 8, 0, }, /* 370 */ + { 8, 26, 12, 0, 0, 8, 0, }, /* 371 */ + { 8, 21, 12, 0, 0, 8, 0, }, /* 372 */ + { 41, 29, 12, 0, 0, 41, 0, }, /* 373 */ + { 41, 7, 12, 0, 0, 41, 0, }, /* 374 */ + { 41, 22, 12, 0, 0, 41, 0, }, /* 375 */ + { 41, 18, 12, 0, 0, 41, 0, }, /* 376 */ + { 46, 7, 12, 0, 0, 46, 0, }, /* 377 */ + { 46, 14, 12, 0, 0, 46, 0, }, /* 378 */ + { 51, 7, 12, 0, 0, 51, 0, }, /* 379 */ + { 51, 12, 3, 0, 0, 51, 0, }, /* 380 */ + { 51, 10, 5, 0, 0, 51, 0, }, /* 381 */ + { 25, 7, 12, 0, 0, 25, 0, }, /* 382 */ + { 25, 12, 3, 0, 0, 25, 0, }, /* 383 */ + { 25, 10, 5, 0, 0, 25, 0, }, /* 384 */ + { 10, 21, 12, 0, 0, -127, 0, }, /* 385 */ + { 7, 7, 12, 0, 0, 7, 0, }, /* 386 */ + { 7, 12, 3, 0, 0, 7, 0, }, /* 387 */ + { 52, 7, 12, 0, 0, 52, 0, }, /* 388 */ + { 52, 12, 3, 0, 0, 52, 0, }, /* 389 */ + { 32, 7, 12, 0, 0, 32, 0, }, /* 390 */ + { 32, 12, 3, 0, 0, 32, 0, }, /* 391 */ + { 32, 10, 5, 0, 0, 32, 0, }, /* 392 */ + { 32, 21, 12, 0, 0, 32, 0, }, /* 393 */ + { 32, 6, 12, 0, 0, 32, 0, }, /* 394 */ + { 32, 23, 12, 0, 0, 32, 0, }, /* 395 */ + { 32, 13, 12, 0, 0, 32, 0, }, /* 396 */ + { 32, 15, 12, 0, 0, 32, 0, }, /* 397 */ + { 38, 21, 12, 0, 0, 38, 0, }, /* 398 */ + { 10, 21, 12, 0, 0, -79, 0, }, /* 399 */ + { 38, 17, 12, 0, 0, 38, 0, }, /* 400 */ + { 38, 12, 3, 0, 0, 38, 0, }, /* 401 */ + { 38, 1, 2, 0, 0, 38, 0, }, /* 402 */ + { 38, 13, 12, 0, 0, 38, 0, }, /* 403 */ + { 38, 7, 12, 0, 0, 38, 0, }, /* 404 */ + { 38, 6, 12, 0, 0, 38, 0, }, /* 405 */ + { 35, 7, 12, 0, 0, 35, 0, }, /* 406 */ + { 35, 12, 3, 0, 0, 35, 0, }, /* 407 */ + { 35, 10, 5, 0, 0, 35, 0, }, /* 408 */ + { 35, 26, 12, 0, 0, 35, 0, }, /* 409 */ + { 35, 21, 12, 0, 0, 35, 0, }, /* 410 */ + { 35, 13, 12, 0, 0, 35, 0, }, /* 411 */ + { 53, 7, 12, 0, 0, 53, 0, }, /* 412 */ + { 40, 7, 12, 0, 0, 40, 0, }, /* 413 */ + { 40, 13, 12, 0, 0, 40, 0, }, /* 414 */ + { 40, 15, 12, 0, 0, 40, 0, }, /* 415 */ + { 40, 26, 12, 0, 0, 40, 0, }, /* 416 */ + { 32, 26, 12, 0, 0, 32, 0, }, /* 417 */ + { 6, 7, 12, 0, 0, 6, 0, }, /* 418 */ + { 6, 12, 3, 0, 0, 6, 0, }, /* 419 */ + { 6, 10, 5, 0, 0, 6, 0, }, /* 420 */ + { 6, 21, 12, 0, 0, 6, 0, }, /* 421 */ + { 91, 7, 12, 0, 0, 91, 0, }, /* 422 */ + { 91, 10, 5, 0, 0, 91, 0, }, /* 423 */ + { 91, 12, 3, 0, 0, 91, 0, }, /* 424 */ + { 91, 10, 12, 0, 0, 91, 0, }, /* 425 */ + { 91, 13, 12, 0, 0, 91, 0, }, /* 426 */ + { 91, 21, 12, 0, 0, 91, 0, }, /* 427 */ + { 91, 6, 12, 0, 0, 91, 0, }, /* 428 */ + { 28, 11, 3, 0, 0, 28, 0, }, /* 429 */ + { 62, 12, 3, 0, 0, 62, 0, }, /* 430 */ + { 62, 10, 5, 0, 0, 62, 0, }, /* 431 */ + { 62, 7, 12, 0, 0, 62, 0, }, /* 432 */ + { 62, 10, 3, 0, 0, 62, 0, }, /* 433 */ + { 62, 13, 12, 0, 0, 62, 0, }, /* 434 */ + { 62, 21, 12, 0, 0, 62, 0, }, /* 435 */ + { 62, 26, 12, 0, 0, 62, 0, }, /* 436 */ + { 76, 12, 3, 0, 0, 76, 0, }, /* 437 */ + { 76, 10, 5, 0, 0, 76, 0, }, /* 438 */ + { 76, 7, 12, 0, 0, 76, 0, }, /* 439 */ + { 76, 13, 12, 0, 0, 76, 0, }, /* 440 */ + { 93, 7, 12, 0, 0, 93, 0, }, /* 441 */ + { 93, 12, 3, 0, 0, 93, 0, }, /* 442 */ + { 93, 10, 5, 0, 0, 93, 0, }, /* 443 */ + { 93, 21, 12, 0, 0, 93, 0, }, /* 444 */ + { 70, 7, 12, 0, 0, 70, 0, }, /* 445 */ + { 70, 10, 5, 0, 0, 70, 0, }, /* 446 */ + { 70, 12, 3, 0, 0, 70, 0, }, /* 447 */ + { 70, 21, 12, 0, 0, 70, 0, }, /* 448 */ + { 70, 13, 12, 0, 0, 70, 0, }, /* 449 */ + { 73, 13, 12, 0, 0, 73, 0, }, /* 450 */ + { 73, 7, 12, 0, 0, 73, 0, }, /* 451 */ + { 73, 6, 12, 0, 0, 73, 0, }, /* 452 */ + { 73, 21, 12, 0, 0, 73, 0, }, /* 453 */ + { 13, 5, 12, 63, -6222, 13, 0, }, /* 454 */ + { 13, 5, 12, 67, -6221, 13, 0, }, /* 455 */ + { 13, 5, 12, 71, -6212, 13, 0, }, /* 456 */ + { 13, 5, 12, 75, -6210, 13, 0, }, /* 457 */ + { 13, 5, 12, 79, -6210, 13, 0, }, /* 458 */ + { 13, 5, 12, 79, -6211, 13, 0, }, /* 459 */ + { 13, 5, 12, 84, -6204, 13, 0, }, /* 460 */ + { 13, 5, 12, 88, -6180, 13, 0, }, /* 461 */ + { 13, 5, 12, 108, 35267, 13, 0, }, /* 462 */ + { 17, 9, 12, 0, -3008, 17, 0, }, /* 463 */ + { 76, 21, 12, 0, 0, 76, 0, }, /* 464 */ + { 28, 12, 3, 0, 0, -122, 0, }, /* 465 */ + { 28, 12, 3, 0, 0, 15, 0, }, /* 466 */ + { 10, 21, 12, 0, 0, -40, 0, }, /* 467 */ + { 28, 12, 3, 0, 0, -16, 0, }, /* 468 */ + { 28, 12, 3, 0, 0, -46, 0, }, /* 469 */ + { 28, 12, 3, 0, 0, -157, 0, }, /* 470 */ + { 10, 10, 5, 0, 0, -16, 0, }, /* 471 */ + { 10, 7, 12, 0, 0, -43, 0, }, /* 472 */ + { 10, 7, 12, 0, 0, -16, 0, }, /* 473 */ + { 10, 7, 12, 0, 0, 15, 0, }, /* 474 */ + { 10, 7, 12, 0, 0, -172, 0, }, /* 475 */ + { 10, 7, 12, 0, 0, -40, 0, }, /* 476 */ + { 28, 12, 3, 0, 0, -106, 0, }, /* 477 */ + { 10, 10, 5, 0, 0, 3, 0, }, /* 478 */ + { 28, 12, 3, 0, 0, -40, 0, }, /* 479 */ + { 10, 7, 12, 0, 0, 150, 0, }, /* 480 */ + { 13, 5, 12, 0, 0, 13, 0, }, /* 481 */ + { 13, 6, 12, 0, 0, 13, 0, }, /* 482 */ + { 34, 5, 12, 0, 35332, 34, 0, }, /* 483 */ + { 34, 5, 12, 0, 3814, 34, 0, }, /* 484 */ + { 34, 5, 12, 0, 35384, 34, 0, }, /* 485 */ + { 28, 12, 3, 0, 0, -37, 0, }, /* 486 */ + { 28, 12, 3, 0, 0, 50, 0, }, /* 487 */ + { 34, 9, 12, 92, 1, 34, 0, }, /* 488 */ + { 34, 5, 12, 92, -1, 34, 0, }, /* 489 */ + { 34, 5, 12, 92, -58, 34, 0, }, /* 490 */ + { 34, 9, 12, 0, -7615, 34, 0, }, /* 491 */ + { 20, 5, 12, 0, 8, 20, 0, }, /* 492 */ + { 20, 9, 12, 0, -8, 20, 0, }, /* 493 */ + { 20, 5, 12, 0, 74, 20, 0, }, /* 494 */ + { 20, 5, 12, 0, 86, 20, 0, }, /* 495 */ + { 20, 5, 12, 0, 100, 20, 0, }, /* 496 */ + { 20, 5, 12, 0, 128, 20, 0, }, /* 497 */ + { 20, 5, 12, 0, 112, 20, 0, }, /* 498 */ + { 20, 5, 12, 0, 126, 20, 0, }, /* 499 */ + { 20, 8, 12, 0, -8, 20, 0, }, /* 500 */ + { 20, 5, 12, 0, 9, 20, 0, }, /* 501 */ + { 20, 9, 12, 0, -74, 20, 0, }, /* 502 */ + { 20, 8, 12, 0, -9, 20, 0, }, /* 503 */ + { 20, 5, 12, 21, -7173, 20, 0, }, /* 504 */ + { 20, 9, 12, 0, -86, 20, 0, }, /* 505 */ + { 20, 9, 12, 0, -100, 20, 0, }, /* 506 */ + { 20, 9, 12, 0, -112, 20, 0, }, /* 507 */ + { 20, 9, 12, 0, -128, 20, 0, }, /* 508 */ + { 20, 9, 12, 0, -126, 20, 0, }, /* 509 */ + { 28, 1, 3, 0, 0, 28, 0, }, /* 510 */ + { 28, 1, 13, 0, 0, 28, 0, }, /* 511 */ + { 10, 27, 2, 0, 0, 10, 0, }, /* 512 */ + { 10, 28, 2, 0, 0, 10, 0, }, /* 513 */ + { 10, 29, 12, 0, 0, -73, 0, }, /* 514 */ + { 10, 21, 14, 0, 0, 10, 0, }, /* 515 */ + { 0, 2, 2, 0, 0, 0, 0, }, /* 516 */ + { 28, 12, 3, 0, 0, -110, 0, }, /* 517 */ + { 10, 9, 12, 0, 0, 10, 0, }, /* 518 */ + { 10, 5, 12, 0, 0, 10, 0, }, /* 519 */ + { 20, 9, 12, 96, -7517, 20, 0, }, /* 520 */ + { 34, 9, 12, 100, -8383, 34, 0, }, /* 521 */ + { 34, 9, 12, 104, -8262, 34, 0, }, /* 522 */ + { 34, 9, 12, 0, 28, 34, 0, }, /* 523 */ + { 10, 7, 12, 0, 0, 10, 0, }, /* 524 */ + { 10, 5, 14, 0, 0, 10, 0, }, /* 525 */ + { 34, 5, 12, 0, -28, 34, 0, }, /* 526 */ + { 34, 14, 12, 0, 16, 34, 0, }, /* 527 */ + { 34, 14, 12, 0, -16, 34, 0, }, /* 528 */ + { 34, 14, 12, 0, 0, 34, 0, }, /* 529 */ + { 10, 25, 14, 0, 0, 10, 0, }, /* 530 */ + { 10, 26, 12, 0, 26, 10, 0, }, /* 531 */ + { 10, 26, 14, 0, 26, 10, 0, }, /* 532 */ + { 10, 26, 12, 0, -26, 10, 0, }, /* 533 */ + { 5, 26, 12, 0, 0, 5, 0, }, /* 534 */ + { 18, 9, 12, 0, 48, 18, 0, }, /* 535 */ + { 18, 5, 12, 0, -48, 18, 0, }, /* 536 */ + { 34, 9, 12, 0, -10743, 34, 0, }, /* 537 */ + { 34, 9, 12, 0, -3814, 34, 0, }, /* 538 */ + { 34, 9, 12, 0, -10727, 34, 0, }, /* 539 */ + { 34, 5, 12, 0, -10795, 34, 0, }, /* 540 */ + { 34, 5, 12, 0, -10792, 34, 0, }, /* 541 */ + { 34, 9, 12, 0, -10780, 34, 0, }, /* 542 */ + { 34, 9, 12, 0, -10749, 34, 0, }, /* 543 */ + { 34, 9, 12, 0, -10783, 34, 0, }, /* 544 */ + { 34, 9, 12, 0, -10782, 34, 0, }, /* 545 */ + { 34, 9, 12, 0, -10815, 34, 0, }, /* 546 */ + { 11, 5, 12, 0, 0, 11, 0, }, /* 547 */ + { 11, 26, 12, 0, 0, 11, 0, }, /* 548 */ + { 11, 12, 3, 0, 0, 11, 0, }, /* 549 */ + { 11, 21, 12, 0, 0, 11, 0, }, /* 550 */ + { 11, 15, 12, 0, 0, 11, 0, }, /* 551 */ + { 17, 5, 12, 0, -7264, 17, 0, }, /* 552 */ + { 59, 7, 12, 0, 0, 59, 0, }, /* 553 */ + { 59, 6, 12, 0, 0, 59, 0, }, /* 554 */ + { 59, 21, 12, 0, 0, 59, 0, }, /* 555 */ + { 59, 12, 3, 0, 0, 59, 0, }, /* 556 */ + { 13, 12, 3, 0, 0, 13, 0, }, /* 557 */ + { 10, 21, 12, 0, 0, -28, 0, }, /* 558 */ + { 23, 26, 12, 0, 0, 23, 0, }, /* 559 */ + { 10, 21, 12, 0, 0, -150, 0, }, /* 560 */ + { 10, 21, 12, 0, 0, -137, 0, }, /* 561 */ + { 23, 6, 12, 0, 0, 23, 0, }, /* 562 */ + { 10, 7, 12, 0, 0, 23, 0, }, /* 563 */ + { 23, 14, 12, 0, 0, 23, 0, }, /* 564 */ + { 10, 22, 12, 0, 0, -150, 0, }, /* 565 */ + { 10, 18, 12, 0, 0, -150, 0, }, /* 566 */ + { 10, 26, 12, 0, 0, -137, 0, }, /* 567 */ + { 10, 17, 12, 0, 0, -137, 0, }, /* 568 */ + { 10, 22, 12, 0, 0, -137, 0, }, /* 569 */ + { 10, 18, 12, 0, 0, -137, 0, }, /* 570 */ + { 28, 12, 3, 0, 0, -19, 0, }, /* 571 */ + { 24, 10, 3, 0, 0, 24, 0, }, /* 572 */ + { 10, 17, 14, 0, 0, -137, 0, }, /* 573 */ + { 10, 6, 12, 0, 0, -67, 0, }, /* 574 */ + { 10, 7, 12, 0, 0, -114, 0, }, /* 575 */ + { 10, 21, 14, 0, 0, -114, 0, }, /* 576 */ + { 10, 26, 12, 0, 0, 23, 0, }, /* 577 */ + { 27, 7, 12, 0, 0, 27, 0, }, /* 578 */ + { 28, 12, 3, 0, 0, -67, 0, }, /* 579 */ + { 10, 24, 12, 0, 0, -67, 0, }, /* 580 */ + { 27, 6, 12, 0, 0, 27, 0, }, /* 581 */ + { 10, 17, 12, 0, 0, -67, 0, }, /* 582 */ + { 30, 7, 12, 0, 0, 30, 0, }, /* 583 */ + { 30, 6, 12, 0, 0, 30, 0, }, /* 584 */ + { 4, 7, 12, 0, 0, 4, 0, }, /* 585 */ + { 24, 7, 12, 0, 0, 24, 0, }, /* 586 */ + { 10, 15, 12, 0, 0, 23, 0, }, /* 587 */ + { 24, 26, 12, 0, 0, 24, 0, }, /* 588 */ + { 10, 26, 14, 0, 0, 23, 0, }, /* 589 */ + { 30, 26, 12, 0, 0, 30, 0, }, /* 590 */ + { 23, 7, 12, 0, 0, 23, 0, }, /* 591 */ + { 61, 7, 12, 0, 0, 61, 0, }, /* 592 */ + { 61, 6, 12, 0, 0, 61, 0, }, /* 593 */ + { 61, 26, 12, 0, 0, 61, 0, }, /* 594 */ + { 86, 7, 12, 0, 0, 86, 0, }, /* 595 */ + { 86, 6, 12, 0, 0, 86, 0, }, /* 596 */ + { 86, 21, 12, 0, 0, 86, 0, }, /* 597 */ + { 77, 7, 12, 0, 0, 77, 0, }, /* 598 */ + { 77, 6, 12, 0, 0, 77, 0, }, /* 599 */ + { 77, 21, 12, 0, 0, 77, 0, }, /* 600 */ + { 77, 13, 12, 0, 0, 77, 0, }, /* 601 */ + { 13, 9, 12, 108, 1, 13, 0, }, /* 602 */ + { 13, 5, 12, 108, -35267, 13, 0, }, /* 603 */ + { 13, 7, 12, 0, 0, 13, 0, }, /* 604 */ + { 13, 21, 12, 0, 0, 13, 0, }, /* 605 */ + { 79, 7, 12, 0, 0, 79, 0, }, /* 606 */ + { 79, 14, 12, 0, 0, 79, 0, }, /* 607 */ + { 79, 12, 3, 0, 0, 79, 0, }, /* 608 */ + { 79, 21, 12, 0, 0, 79, 0, }, /* 609 */ + { 10, 24, 12, 0, 0, -64, 0, }, /* 610 */ + { 34, 9, 12, 0, -35332, 34, 0, }, /* 611 */ + { 34, 9, 12, 0, -42280, 34, 0, }, /* 612 */ + { 34, 5, 12, 0, 48, 34, 0, }, /* 613 */ + { 34, 9, 12, 0, -42308, 34, 0, }, /* 614 */ + { 34, 9, 12, 0, -42319, 34, 0, }, /* 615 */ + { 34, 9, 12, 0, -42315, 34, 0, }, /* 616 */ + { 34, 9, 12, 0, -42305, 34, 0, }, /* 617 */ + { 34, 9, 12, 0, -42258, 34, 0, }, /* 618 */ + { 34, 9, 12, 0, -42282, 34, 0, }, /* 619 */ + { 34, 9, 12, 0, -42261, 34, 0, }, /* 620 */ + { 34, 9, 12, 0, 928, 34, 0, }, /* 621 */ + { 34, 9, 12, 0, -48, 34, 0, }, /* 622 */ + { 34, 9, 12, 0, -42307, 34, 0, }, /* 623 */ + { 34, 9, 12, 0, -35384, 34, 0, }, /* 624 */ + { 49, 7, 12, 0, 0, 49, 0, }, /* 625 */ + { 49, 12, 3, 0, 0, 49, 0, }, /* 626 */ + { 49, 10, 5, 0, 0, 49, 0, }, /* 627 */ + { 49, 26, 12, 0, 0, 49, 0, }, /* 628 */ + { 10, 15, 12, 0, 0, -244, 0, }, /* 629 */ + { 10, 15, 12, 0, 0, -230, 0, }, /* 630 */ + { 10, 26, 12, 0, 0, -191, 0, }, /* 631 */ + { 10, 23, 12, 0, 0, -191, 0, }, /* 632 */ + { 65, 7, 12, 0, 0, 65, 0, }, /* 633 */ + { 65, 21, 12, 0, 0, 65, 0, }, /* 634 */ + { 75, 10, 5, 0, 0, 75, 0, }, /* 635 */ + { 75, 7, 12, 0, 0, 75, 0, }, /* 636 */ + { 75, 12, 3, 0, 0, 75, 0, }, /* 637 */ + { 75, 21, 12, 0, 0, 75, 0, }, /* 638 */ + { 75, 13, 12, 0, 0, 75, 0, }, /* 639 */ + { 15, 12, 3, 0, 0, -16, 0, }, /* 640 */ + { 15, 7, 12, 0, 0, -49, 0, }, /* 641 */ + { 69, 13, 12, 0, 0, 69, 0, }, /* 642 */ + { 69, 7, 12, 0, 0, 69, 0, }, /* 643 */ + { 69, 12, 3, 0, 0, 69, 0, }, /* 644 */ + { 10, 21, 12, 0, 0, -118, 0, }, /* 645 */ + { 69, 21, 12, 0, 0, 69, 0, }, /* 646 */ + { 74, 7, 12, 0, 0, 74, 0, }, /* 647 */ + { 74, 12, 3, 0, 0, 74, 0, }, /* 648 */ + { 74, 10, 5, 0, 0, 74, 0, }, /* 649 */ + { 74, 21, 12, 0, 0, 74, 0, }, /* 650 */ + { 84, 12, 3, 0, 0, 84, 0, }, /* 651 */ + { 84, 10, 5, 0, 0, 84, 0, }, /* 652 */ + { 84, 7, 12, 0, 0, 84, 0, }, /* 653 */ + { 84, 21, 12, 0, 0, 84, 0, }, /* 654 */ + { 10, 6, 12, 0, 0, -22, 0, }, /* 655 */ + { 84, 13, 12, 0, 0, 84, 0, }, /* 656 */ + { 39, 6, 12, 0, 0, 39, 0, }, /* 657 */ + { 68, 7, 12, 0, 0, 68, 0, }, /* 658 */ + { 68, 12, 3, 0, 0, 68, 0, }, /* 659 */ + { 68, 10, 5, 0, 0, 68, 0, }, /* 660 */ + { 68, 13, 12, 0, 0, 68, 0, }, /* 661 */ + { 68, 21, 12, 0, 0, 68, 0, }, /* 662 */ + { 92, 7, 12, 0, 0, 92, 0, }, /* 663 */ + { 92, 12, 3, 0, 0, 92, 0, }, /* 664 */ + { 92, 6, 12, 0, 0, 92, 0, }, /* 665 */ + { 92, 21, 12, 0, 0, 92, 0, }, /* 666 */ + { 87, 7, 12, 0, 0, 87, 0, }, /* 667 */ + { 87, 10, 5, 0, 0, 87, 0, }, /* 668 */ + { 87, 12, 3, 0, 0, 87, 0, }, /* 669 */ + { 87, 21, 12, 0, 0, 87, 0, }, /* 670 */ + { 87, 6, 12, 0, 0, 87, 0, }, /* 671 */ + { 34, 5, 12, 0, -928, 34, 0, }, /* 672 */ + { 9, 5, 12, 0, -38864, 9, 0, }, /* 673 */ + { 87, 13, 12, 0, 0, 87, 0, }, /* 674 */ + { 24, 7, 9, 0, 0, 24, 0, }, /* 675 */ + { 24, 7, 10, 0, 0, 24, 0, }, /* 676 */ + { 0, 4, 12, 0, 0, 0, 0, }, /* 677 */ + { 0, 3, 12, 0, 0, 0, 0, }, /* 678 */ + { 26, 25, 12, 0, 0, 26, 0, }, /* 679 */ + { 10, 18, 12, 0, 0, -7, 0, }, /* 680 */ + { 10, 22, 12, 0, 0, -7, 0, }, /* 681 */ + { 1, 7, 12, 0, 0, -13, 0, }, /* 682 */ + { 1, 26, 12, 0, 0, -13, 0, }, /* 683 */ + { 10, 6, 3, 0, 0, -67, 0, }, /* 684 */ + { 36, 7, 12, 0, 0, 36, 0, }, /* 685 */ + { 10, 21, 12, 0, 0, -98, 0, }, /* 686 */ + { 10, 21, 12, 0, 0, -25, 0, }, /* 687 */ + { 10, 15, 12, 0, 0, -102, 0, }, /* 688 */ + { 10, 26, 12, 0, 0, -25, 0, }, /* 689 */ + { 20, 14, 12, 0, 0, 20, 0, }, /* 690 */ + { 20, 15, 12, 0, 0, 20, 0, }, /* 691 */ + { 20, 26, 12, 0, 0, 20, 0, }, /* 692 */ + { 71, 7, 12, 0, 0, 71, 0, }, /* 693 */ + { 67, 7, 12, 0, 0, 67, 0, }, /* 694 */ + { 28, 12, 3, 0, 0, -1, 0, }, /* 695 */ + { 10, 15, 12, 0, 0, -1, 0, }, /* 696 */ + { 42, 7, 12, 0, 0, 42, 0, }, /* 697 */ + { 42, 15, 12, 0, 0, 42, 0, }, /* 698 */ + { 19, 7, 12, 0, 0, 19, 0, }, /* 699 */ + { 19, 14, 12, 0, 0, 19, 0, }, /* 700 */ + { 118, 7, 12, 0, 0, 118, 0, }, /* 701 */ + { 118, 12, 3, 0, 0, 118, 0, }, /* 702 */ + { 60, 7, 12, 0, 0, 60, 0, }, /* 703 */ + { 60, 21, 12, 0, 0, 60, 0, }, /* 704 */ + { 43, 7, 12, 0, 0, 43, 0, }, /* 705 */ + { 43, 21, 12, 0, 0, 43, 0, }, /* 706 */ + { 43, 14, 12, 0, 0, 43, 0, }, /* 707 */ + { 14, 9, 12, 0, 40, 14, 0, }, /* 708 */ + { 14, 5, 12, 0, -40, 14, 0, }, /* 709 */ + { 47, 7, 12, 0, 0, 47, 0, }, /* 710 */ + { 45, 7, 12, 0, 0, 45, 0, }, /* 711 */ + { 45, 13, 12, 0, 0, 45, 0, }, /* 712 */ + { 136, 9, 12, 0, 40, 136, 0, }, /* 713 */ + { 136, 5, 12, 0, -40, 136, 0, }, /* 714 */ + { 106, 7, 12, 0, 0, 106, 0, }, /* 715 */ + { 104, 7, 12, 0, 0, 104, 0, }, /* 716 */ + { 104, 21, 12, 0, 0, 104, 0, }, /* 717 */ + { 161, 9, 12, 0, 39, 161, 0, }, /* 718 */ + { 161, 5, 12, 0, -39, 161, 0, }, /* 719 */ + { 110, 7, 12, 0, 0, 110, 0, }, /* 720 */ + { 12, 7, 12, 0, 0, 12, 0, }, /* 721 */ + { 81, 7, 12, 0, 0, 81, 0, }, /* 722 */ + { 81, 21, 12, 0, 0, 81, 0, }, /* 723 */ + { 81, 15, 12, 0, 0, 81, 0, }, /* 724 */ + { 120, 7, 12, 0, 0, 120, 0, }, /* 725 */ + { 120, 26, 12, 0, 0, 120, 0, }, /* 726 */ + { 120, 15, 12, 0, 0, 120, 0, }, /* 727 */ + { 116, 7, 12, 0, 0, 116, 0, }, /* 728 */ + { 116, 15, 12, 0, 0, 116, 0, }, /* 729 */ + { 128, 7, 12, 0, 0, 128, 0, }, /* 730 */ + { 128, 15, 12, 0, 0, 128, 0, }, /* 731 */ + { 66, 7, 12, 0, 0, 66, 0, }, /* 732 */ + { 66, 15, 12, 0, 0, 66, 0, }, /* 733 */ + { 66, 21, 12, 0, 0, 66, 0, }, /* 734 */ + { 72, 7, 12, 0, 0, 72, 0, }, /* 735 */ + { 72, 21, 12, 0, 0, 72, 0, }, /* 736 */ + { 98, 7, 12, 0, 0, 98, 0, }, /* 737 */ + { 97, 7, 12, 0, 0, 97, 0, }, /* 738 */ + { 97, 15, 12, 0, 0, 97, 0, }, /* 739 */ + { 31, 7, 12, 0, 0, 31, 0, }, /* 740 */ + { 31, 12, 3, 0, 0, 31, 0, }, /* 741 */ + { 31, 15, 12, 0, 0, 31, 0, }, /* 742 */ + { 31, 21, 12, 0, 0, 31, 0, }, /* 743 */ + { 88, 7, 12, 0, 0, 88, 0, }, /* 744 */ + { 88, 15, 12, 0, 0, 88, 0, }, /* 745 */ + { 88, 21, 12, 0, 0, 88, 0, }, /* 746 */ + { 117, 7, 12, 0, 0, 117, 0, }, /* 747 */ + { 117, 15, 12, 0, 0, 117, 0, }, /* 748 */ + { 112, 7, 12, 0, 0, 112, 0, }, /* 749 */ + { 112, 26, 12, 0, 0, 112, 0, }, /* 750 */ + { 112, 12, 3, 0, 0, 112, 0, }, /* 751 */ + { 112, 15, 12, 0, 0, 112, 0, }, /* 752 */ + { 112, 21, 12, 0, 0, 112, 0, }, /* 753 */ + { 112, 21, 12, 0, 0, -76, 0, }, /* 754 */ + { 78, 7, 12, 0, 0, 78, 0, }, /* 755 */ + { 78, 21, 12, 0, 0, 78, 0, }, /* 756 */ + { 83, 7, 12, 0, 0, 83, 0, }, /* 757 */ + { 83, 15, 12, 0, 0, 83, 0, }, /* 758 */ + { 82, 7, 12, 0, 0, 82, 0, }, /* 759 */ + { 82, 15, 12, 0, 0, 82, 0, }, /* 760 */ + { 121, 7, 12, 0, 0, 121, 0, }, /* 761 */ + { 121, 21, 12, 0, 0, 121, 0, }, /* 762 */ + { 121, 15, 12, 0, 0, 121, 0, }, /* 763 */ + { 89, 7, 12, 0, 0, 89, 0, }, /* 764 */ + { 130, 9, 12, 0, 64, 130, 0, }, /* 765 */ + { 130, 5, 12, 0, -64, 130, 0, }, /* 766 */ + { 130, 15, 12, 0, 0, 130, 0, }, /* 767 */ + { 144, 7, 12, 0, 0, 144, 0, }, /* 768 */ + { 144, 12, 3, 0, 0, 144, 0, }, /* 769 */ + { 144, 13, 12, 0, 0, 144, 0, }, /* 770 */ + { 1, 15, 12, 0, 0, 1, 0, }, /* 771 */ + { 156, 7, 12, 0, 0, 156, 0, }, /* 772 */ + { 156, 12, 3, 0, 0, 156, 0, }, /* 773 */ + { 156, 17, 12, 0, 0, 156, 0, }, /* 774 */ + { 147, 7, 12, 0, 0, 147, 0, }, /* 775 */ + { 147, 15, 12, 0, 0, 147, 0, }, /* 776 */ + { 148, 7, 12, 0, 0, 148, 0, }, /* 777 */ + { 148, 12, 3, 0, 0, 148, 0, }, /* 778 */ + { 148, 15, 12, 0, 0, 148, 0, }, /* 779 */ + { 148, 21, 12, 0, 0, 148, 0, }, /* 780 */ + { 158, 7, 12, 0, 0, 158, 0, }, /* 781 */ + { 158, 12, 3, 0, 0, 158, 0, }, /* 782 */ + { 158, 21, 12, 0, 0, 158, 0, }, /* 783 */ + { 153, 7, 12, 0, 0, 153, 0, }, /* 784 */ + { 153, 15, 12, 0, 0, 153, 0, }, /* 785 */ + { 149, 7, 12, 0, 0, 149, 0, }, /* 786 */ + { 94, 10, 5, 0, 0, 94, 0, }, /* 787 */ + { 94, 12, 3, 0, 0, 94, 0, }, /* 788 */ + { 94, 7, 12, 0, 0, 94, 0, }, /* 789 */ + { 94, 21, 12, 0, 0, 94, 0, }, /* 790 */ + { 94, 15, 12, 0, 0, 94, 0, }, /* 791 */ + { 94, 13, 12, 0, 0, 94, 0, }, /* 792 */ + { 85, 12, 3, 0, 0, 85, 0, }, /* 793 */ + { 85, 10, 5, 0, 0, 85, 0, }, /* 794 */ + { 85, 7, 12, 0, 0, 85, 0, }, /* 795 */ + { 85, 21, 12, 0, 0, 85, 0, }, /* 796 */ + { 85, 1, 4, 0, 0, 85, 0, }, /* 797 */ + { 101, 7, 12, 0, 0, 101, 0, }, /* 798 */ + { 101, 13, 12, 0, 0, 101, 0, }, /* 799 */ + { 96, 12, 3, 0, 0, 96, 0, }, /* 800 */ + { 96, 7, 12, 0, 0, 96, 0, }, /* 801 */ + { 96, 10, 5, 0, 0, 96, 0, }, /* 802 */ + { 96, 13, 12, 0, 0, 96, 0, }, /* 803 */ + { 96, 21, 12, 0, 0, 96, 0, }, /* 804 */ + { 111, 7, 12, 0, 0, 111, 0, }, /* 805 */ + { 111, 12, 3, 0, 0, 111, 0, }, /* 806 */ + { 111, 21, 12, 0, 0, 111, 0, }, /* 807 */ + { 100, 12, 3, 0, 0, 100, 0, }, /* 808 */ + { 100, 10, 5, 0, 0, 100, 0, }, /* 809 */ + { 100, 7, 12, 0, 0, 100, 0, }, /* 810 */ + { 100, 7, 4, 0, 0, 100, 0, }, /* 811 */ + { 100, 21, 12, 0, 0, 100, 0, }, /* 812 */ + { 100, 13, 12, 0, 0, 100, 0, }, /* 813 */ + { 48, 15, 12, 0, 0, 48, 0, }, /* 814 */ + { 108, 7, 12, 0, 0, 108, 0, }, /* 815 */ + { 108, 10, 5, 0, 0, 108, 0, }, /* 816 */ + { 108, 12, 3, 0, 0, 108, 0, }, /* 817 */ + { 108, 21, 12, 0, 0, 108, 0, }, /* 818 */ + { 129, 7, 12, 0, 0, 129, 0, }, /* 819 */ + { 129, 21, 12, 0, 0, 129, 0, }, /* 820 */ + { 109, 7, 12, 0, 0, 109, 0, }, /* 821 */ + { 109, 12, 3, 0, 0, 109, 0, }, /* 822 */ + { 109, 10, 5, 0, 0, 109, 0, }, /* 823 */ + { 109, 13, 12, 0, 0, 109, 0, }, /* 824 */ + { 107, 12, 3, 0, 0, 107, 0, }, /* 825 */ + { 107, 12, 3, 0, 0, -55, 0, }, /* 826 */ + { 107, 10, 5, 0, 0, 107, 0, }, /* 827 */ + { 107, 10, 5, 0, 0, -55, 0, }, /* 828 */ + { 107, 7, 12, 0, 0, 107, 0, }, /* 829 */ + { 28, 12, 3, 0, 0, -55, 0, }, /* 830 */ + { 107, 10, 3, 0, 0, 107, 0, }, /* 831 */ + { 135, 7, 12, 0, 0, 135, 0, }, /* 832 */ + { 135, 10, 5, 0, 0, 135, 0, }, /* 833 */ + { 135, 12, 3, 0, 0, 135, 0, }, /* 834 */ + { 135, 21, 12, 0, 0, 135, 0, }, /* 835 */ + { 135, 13, 12, 0, 0, 135, 0, }, /* 836 */ + { 124, 7, 12, 0, 0, 124, 0, }, /* 837 */ + { 124, 10, 3, 0, 0, 124, 0, }, /* 838 */ + { 124, 10, 5, 0, 0, 124, 0, }, /* 839 */ + { 124, 12, 3, 0, 0, 124, 0, }, /* 840 */ + { 124, 21, 12, 0, 0, 124, 0, }, /* 841 */ + { 124, 13, 12, 0, 0, 124, 0, }, /* 842 */ + { 123, 7, 12, 0, 0, 123, 0, }, /* 843 */ + { 123, 10, 3, 0, 0, 123, 0, }, /* 844 */ + { 123, 10, 5, 0, 0, 123, 0, }, /* 845 */ + { 123, 12, 3, 0, 0, 123, 0, }, /* 846 */ + { 123, 21, 12, 0, 0, 123, 0, }, /* 847 */ + { 114, 7, 12, 0, 0, 114, 0, }, /* 848 */ + { 114, 10, 5, 0, 0, 114, 0, }, /* 849 */ + { 114, 12, 3, 0, 0, 114, 0, }, /* 850 */ + { 114, 21, 12, 0, 0, 114, 0, }, /* 851 */ + { 114, 13, 12, 0, 0, 114, 0, }, /* 852 */ + { 102, 7, 12, 0, 0, 102, 0, }, /* 853 */ + { 102, 12, 3, 0, 0, 102, 0, }, /* 854 */ + { 102, 10, 5, 0, 0, 102, 0, }, /* 855 */ + { 102, 21, 12, 0, 0, 102, 0, }, /* 856 */ + { 102, 13, 12, 0, 0, 102, 0, }, /* 857 */ + { 126, 7, 12, 0, 0, 126, 0, }, /* 858 */ + { 126, 12, 3, 0, 0, 126, 0, }, /* 859 */ + { 126, 10, 12, 0, 0, 126, 0, }, /* 860 */ + { 126, 10, 5, 0, 0, 126, 0, }, /* 861 */ + { 126, 13, 12, 0, 0, 126, 0, }, /* 862 */ + { 126, 15, 12, 0, 0, 126, 0, }, /* 863 */ + { 126, 21, 12, 0, 0, 126, 0, }, /* 864 */ + { 126, 26, 12, 0, 0, 126, 0, }, /* 865 */ + { 142, 7, 12, 0, 0, 142, 0, }, /* 866 */ + { 142, 10, 5, 0, 0, 142, 0, }, /* 867 */ + { 142, 12, 3, 0, 0, 142, 0, }, /* 868 */ + { 142, 21, 12, 0, 0, 142, 0, }, /* 869 */ + { 125, 9, 12, 0, 32, 125, 0, }, /* 870 */ + { 125, 5, 12, 0, -32, 125, 0, }, /* 871 */ + { 125, 13, 12, 0, 0, 125, 0, }, /* 872 */ + { 125, 15, 12, 0, 0, 125, 0, }, /* 873 */ + { 125, 7, 12, 0, 0, 125, 0, }, /* 874 */ + { 154, 7, 12, 0, 0, 154, 0, }, /* 875 */ + { 154, 10, 3, 0, 0, 154, 0, }, /* 876 */ + { 154, 10, 5, 0, 0, 154, 0, }, /* 877 */ + { 154, 12, 3, 0, 0, 154, 0, }, /* 878 */ + { 154, 7, 4, 0, 0, 154, 0, }, /* 879 */ + { 154, 21, 12, 0, 0, 154, 0, }, /* 880 */ + { 154, 13, 12, 0, 0, 154, 0, }, /* 881 */ + { 150, 7, 12, 0, 0, 150, 0, }, /* 882 */ + { 150, 10, 5, 0, 0, 150, 0, }, /* 883 */ + { 150, 12, 3, 0, 0, 150, 0, }, /* 884 */ + { 150, 21, 12, 0, 0, 150, 0, }, /* 885 */ + { 141, 7, 12, 0, 0, 141, 0, }, /* 886 */ + { 141, 12, 3, 0, 0, 141, 0, }, /* 887 */ + { 141, 10, 5, 0, 0, 141, 0, }, /* 888 */ + { 141, 7, 4, 0, 0, 141, 0, }, /* 889 */ + { 141, 21, 12, 0, 0, 141, 0, }, /* 890 */ + { 140, 7, 12, 0, 0, 140, 0, }, /* 891 */ + { 140, 12, 3, 0, 0, 140, 0, }, /* 892 */ + { 140, 10, 5, 0, 0, 140, 0, }, /* 893 */ + { 140, 7, 4, 0, 0, 140, 0, }, /* 894 */ + { 140, 21, 12, 0, 0, 140, 0, }, /* 895 */ + { 122, 7, 12, 0, 0, 122, 0, }, /* 896 */ + { 133, 7, 12, 0, 0, 133, 0, }, /* 897 */ + { 133, 10, 5, 0, 0, 133, 0, }, /* 898 */ + { 133, 12, 3, 0, 0, 133, 0, }, /* 899 */ + { 133, 21, 12, 0, 0, 133, 0, }, /* 900 */ + { 133, 13, 12, 0, 0, 133, 0, }, /* 901 */ + { 133, 15, 12, 0, 0, 133, 0, }, /* 902 */ + { 134, 21, 12, 0, 0, 134, 0, }, /* 903 */ + { 134, 7, 12, 0, 0, 134, 0, }, /* 904 */ + { 134, 12, 3, 0, 0, 134, 0, }, /* 905 */ + { 134, 10, 5, 0, 0, 134, 0, }, /* 906 */ + { 138, 7, 12, 0, 0, 138, 0, }, /* 907 */ + { 138, 12, 3, 0, 0, 138, 0, }, /* 908 */ + { 138, 7, 4, 0, 0, 138, 0, }, /* 909 */ + { 138, 13, 12, 0, 0, 138, 0, }, /* 910 */ + { 143, 7, 12, 0, 0, 143, 0, }, /* 911 */ + { 143, 10, 5, 0, 0, 143, 0, }, /* 912 */ + { 143, 12, 3, 0, 0, 143, 0, }, /* 913 */ + { 143, 13, 12, 0, 0, 143, 0, }, /* 914 */ + { 145, 7, 12, 0, 0, 145, 0, }, /* 915 */ + { 145, 12, 3, 0, 0, 145, 0, }, /* 916 */ + { 145, 10, 5, 0, 0, 145, 0, }, /* 917 */ + { 145, 21, 12, 0, 0, 145, 0, }, /* 918 */ + { 54, 15, 12, 0, 0, 54, 0, }, /* 919 */ + { 54, 21, 12, 0, 0, 54, 0, }, /* 920 */ + { 63, 7, 12, 0, 0, 63, 0, }, /* 921 */ + { 63, 14, 12, 0, 0, 63, 0, }, /* 922 */ + { 63, 21, 12, 0, 0, 63, 0, }, /* 923 */ + { 157, 7, 12, 0, 0, 157, 0, }, /* 924 */ + { 157, 21, 12, 0, 0, 157, 0, }, /* 925 */ + { 80, 7, 12, 0, 0, 80, 0, }, /* 926 */ + { 80, 1, 2, 0, 0, 80, 0, }, /* 927 */ + { 127, 7, 12, 0, 0, 127, 0, }, /* 928 */ + { 115, 7, 12, 0, 0, 115, 0, }, /* 929 */ + { 115, 13, 12, 0, 0, 115, 0, }, /* 930 */ + { 115, 21, 12, 0, 0, 115, 0, }, /* 931 */ + { 159, 7, 12, 0, 0, 159, 0, }, /* 932 */ + { 159, 13, 12, 0, 0, 159, 0, }, /* 933 */ + { 103, 7, 12, 0, 0, 103, 0, }, /* 934 */ + { 103, 12, 3, 0, 0, 103, 0, }, /* 935 */ + { 103, 21, 12, 0, 0, 103, 0, }, /* 936 */ + { 119, 7, 12, 0, 0, 119, 0, }, /* 937 */ + { 119, 12, 3, 0, 0, 119, 0, }, /* 938 */ + { 119, 21, 12, 0, 0, 119, 0, }, /* 939 */ + { 119, 26, 12, 0, 0, 119, 0, }, /* 940 */ + { 119, 6, 12, 0, 0, 119, 0, }, /* 941 */ + { 119, 13, 12, 0, 0, 119, 0, }, /* 942 */ + { 119, 15, 12, 0, 0, 119, 0, }, /* 943 */ + { 146, 9, 12, 0, 32, 146, 0, }, /* 944 */ + { 146, 5, 12, 0, -32, 146, 0, }, /* 945 */ + { 146, 15, 12, 0, 0, 146, 0, }, /* 946 */ + { 146, 21, 12, 0, 0, 146, 0, }, /* 947 */ + { 99, 7, 12, 0, 0, 99, 0, }, /* 948 */ + { 99, 12, 3, 0, 0, 99, 0, }, /* 949 */ + { 99, 10, 5, 0, 0, 99, 0, }, /* 950 */ + { 99, 6, 12, 0, 0, 99, 0, }, /* 951 */ + { 137, 6, 12, 0, 0, 137, 0, }, /* 952 */ + { 139, 6, 12, 0, 0, 139, 0, }, /* 953 */ + { 23, 21, 12, 0, 0, 23, 0, }, /* 954 */ + { 155, 12, 3, 0, 0, 155, 0, }, /* 955 */ + { 23, 10, 5, 0, 0, 23, 0, }, /* 956 */ + { 137, 7, 12, 0, 0, 137, 0, }, /* 957 */ + { 155, 7, 12, 0, 0, 155, 0, }, /* 958 */ + { 139, 7, 12, 0, 0, 139, 0, }, /* 959 */ + { 105, 7, 12, 0, 0, 105, 0, }, /* 960 */ + { 105, 26, 12, 0, 0, 105, 0, }, /* 961 */ + { 105, 12, 3, 0, 0, 105, 0, }, /* 962 */ + { 105, 21, 12, 0, 0, 105, 0, }, /* 963 */ + { 10, 1, 2, 0, 0, 105, 0, }, /* 964 */ + { 10, 10, 3, 0, 0, 10, 0, }, /* 965 */ + { 10, 10, 5, 0, 0, 10, 0, }, /* 966 */ + { 20, 12, 3, 0, 0, 20, 0, }, /* 967 */ + { 131, 26, 12, 0, 0, 131, 0, }, /* 968 */ + { 131, 12, 3, 0, 0, 131, 0, }, /* 969 */ + { 131, 21, 12, 0, 0, 131, 0, }, /* 970 */ + { 18, 12, 3, 0, 0, 18, 0, }, /* 971 */ + { 151, 7, 12, 0, 0, 151, 0, }, /* 972 */ + { 151, 12, 3, 0, 0, 151, 0, }, /* 973 */ + { 151, 6, 12, 0, 0, 151, 0, }, /* 974 */ + { 151, 13, 12, 0, 0, 151, 0, }, /* 975 */ + { 151, 26, 12, 0, 0, 151, 0, }, /* 976 */ + { 160, 7, 12, 0, 0, 160, 0, }, /* 977 */ + { 160, 12, 3, 0, 0, 160, 0, }, /* 978 */ + { 152, 7, 12, 0, 0, 152, 0, }, /* 979 */ + { 152, 12, 3, 0, 0, 152, 0, }, /* 980 */ + { 152, 13, 12, 0, 0, 152, 0, }, /* 981 */ + { 152, 23, 12, 0, 0, 152, 0, }, /* 982 */ + { 113, 7, 12, 0, 0, 113, 0, }, /* 983 */ + { 113, 15, 12, 0, 0, 113, 0, }, /* 984 */ + { 113, 12, 3, 0, 0, 113, 0, }, /* 985 */ + { 132, 9, 12, 0, 34, 132, 0, }, /* 986 */ + { 132, 5, 12, 0, -34, 132, 0, }, /* 987 */ + { 132, 12, 3, 0, 0, 132, 0, }, /* 988 */ + { 132, 6, 12, 0, 0, 132, 0, }, /* 989 */ + { 132, 13, 12, 0, 0, 132, 0, }, /* 990 */ + { 132, 21, 12, 0, 0, 132, 0, }, /* 991 */ + { 0, 2, 14, 0, 0, 0, 0, }, /* 992 */ + { 10, 26, 11, 0, 0, 10, 0, }, /* 993 */ + { 27, 26, 12, 0, 0, 27, 0, }, /* 994 */ + { 10, 24, 3, 0, 0, 10, 0, }, /* 995 */ + { 10, 1, 3, 0, 0, 10, 0, }, /* 996 */ }; const uint16_t PRIV(ucd_stage1)[] = { /* 17408 bytes */ @@ -1190,51 +1216,51 @@ const uint16_t PRIV(ucd_stage1)[] = { /* 17408 bytes */ 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+8000 */ 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+8800 */ 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+9000 */ - 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98,100, /* U+9800 */ -101,102,102,102,102,102,102,102,102,103,104,104,105,106,107,108, /* U+A000 */ -109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,117, /* U+A800 */ -118,119,120,121,122,123,117,118,119,120,121,122,123,117,118,119, /* U+B000 */ -120,121,122,123,117,118,119,120,121,122,123,117,118,119,120,121, /* U+B800 */ -122,123,117,118,119,120,121,122,123,117,118,119,120,121,122,123, /* U+C000 */ -117,118,119,120,121,122,123,117,118,119,120,121,122,123,117,118, /* U+C800 */ -119,120,121,122,123,117,118,119,120,121,122,123,117,118,119,124, /* U+D000 */ -125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+D800 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+E000 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+E800 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+F000 */ -126,126, 98, 98,127,128,129,130,131,131,132,133,134,135,136,137, /* U+F800 */ -138,139,140,141,142,143,144,145,146,147,148,142,149,149,150,142, /* U+10000 */ -151,152,153,154,155,156,157,158,159,160,161,142,162,163,164,165, /* U+10800 */ -166,167,168,169,170,171,172,142,173,174,142,175,176,177,178,142, /* U+11000 */ -179,180,181,182,183,184,142,142,185,186,187,188,142,189,142,190, /* U+11800 */ -191,191,191,191,191,191,191,192,193,191,194,142,142,142,142,142, /* U+12000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+12800 */ -195,195,195,195,195,195,195,195,196,142,142,142,142,142,142,142, /* U+13000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+13800 */ -142,142,142,142,142,142,142,142,197,197,197,197,198,142,142,142, /* U+14000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+14800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+15000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+15800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+16000 */ -199,199,199,199,200,201,202,203,142,142,142,142,204,205,206,207, /* U+16800 */ -208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208, /* U+17000 */ -208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208, /* U+17800 */ -208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,209, /* U+18000 */ -208,208,208,208,208,208,210,210,210,211,212,142,142,142,142,142, /* U+18800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+19000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+19800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+1A000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+1A800 */ -213,214,215,216,216,217,142,142,142,142,142,142,142,142,142,142, /* U+1B000 */ -142,142,142,142,142,142,142,142,218,219,142,142,142,142,142,142, /* U+1B800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+1C000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+1C800 */ - 71,220,221,222,223,224,225,142,226,227,228,229,230,231,232,233, /* U+1D000 */ -234,234,234,234,235,236,142,142,142,142,142,142,142,142,142,142, /* U+1D800 */ -237,142,238,142,142,239,142,142,142,142,142,142,142,142,142,142, /* U+1E000 */ -240,241,242,142,142,142,142,142,243,244,245,142,246,247,142,142, /* U+1E800 */ -248,249,250,251,252,253,254,255,254,254,256,254,257,258,259,260, /* U+1F000 */ -261,262,263,264,265,266, 71,267,253,253,253,253,253,253,253,268, /* U+1F800 */ + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+9800 */ +100,101,101,101,101,101,101,101,101,102,103,103,104,105,106,107, /* U+A000 */ +108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,116, /* U+A800 */ +117,118,119,120,121,122,116,117,118,119,120,121,122,116,117,118, /* U+B000 */ +119,120,121,122,116,117,118,119,120,121,122,116,117,118,119,120, /* U+B800 */ +121,122,116,117,118,119,120,121,122,116,117,118,119,120,121,122, /* U+C000 */ +116,117,118,119,120,121,122,116,117,118,119,120,121,122,116,117, /* U+C800 */ +118,119,120,121,122,116,117,118,119,120,121,122,116,117,118,123, /* U+D000 */ +124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124, /* U+D800 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+E000 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+E800 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+F000 */ +125,125, 98, 98,126,127,128,129,130,130,131,132,133,134,135,136, /* U+F800 */ +137,138,139,140,141,142,143,144,145,146,147,148,149,149,150,151, /* U+10000 */ +152,153,154,155,156,157,158,159,160,161,162,141,163,164,165,166, /* U+10800 */ +167,168,169,170,171,172,173,141,174,175,141,176,177,178,179,141, /* U+11000 */ +180,181,182,183,184,185,141,141,186,187,188,189,141,190,141,191, /* U+11800 */ +192,192,192,192,192,192,192,193,194,192,195,141,141,141,141,141, /* U+12000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,196, /* U+12800 */ +197,197,197,197,197,197,197,197,198,141,141,141,141,141,141,141, /* U+13000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+13800 */ +141,141,141,141,141,141,141,141,199,199,199,199,200,141,141,141, /* U+14000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+14800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+15000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+15800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+16000 */ +201,201,201,201,202,203,204,205,141,141,141,141,206,207,208,209, /* U+16800 */ +210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210, /* U+17000 */ +210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210, /* U+17800 */ +210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,211, /* U+18000 */ +210,210,210,210,210,210,212,212,212,213,214,141,141,141,141,141, /* U+18800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+19000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+19800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+1A000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,215, /* U+1A800 */ +216,217,218,219,219,220,141,141,141,141,141,141,141,141,141,141, /* U+1B000 */ +141,141,141,141,141,141,141,141,221,222,141,141,141,141,141,141, /* U+1B800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+1C000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,223,224, /* U+1C800 */ + 71,225,226,227,228,229,230,141,231,232,233,234,235,236,237,238, /* U+1D000 */ +239,239,239,239,240,241,141,141,141,141,141,141,141,141,242,141, /* U+1D800 */ +243,141,244,141,141,245,141,141,141,141,141,141,141,141,141,246, /* U+1E000 */ +247,248,249,141,141,141,141,141,250,251,252,141,253,254,141,141, /* U+1E800 */ +255,256,257,258,259,260,261,262,261,261,263,261,264,265,266,267, /* U+1F000 */ +268,269,270,261,271,272, 71,273,260,260,260,260,260,260,260,274, /* U+1F800 */ 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+20000 */ 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+20800 */ 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+21000 */ @@ -1255,469 +1281,469 @@ const uint16_t PRIV(ucd_stage1)[] = { /* 17408 bytes */ 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+28800 */ 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+29000 */ 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+29800 */ - 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98,269, 98, 98, /* U+2A000 */ + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98,275, 98, 98, /* U+2A000 */ 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+2A800 */ - 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98,270, 98, /* U+2B000 */ -271, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+2B800 */ + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98,276, 98, /* U+2B000 */ +277, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+2B800 */ 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+2C000 */ - 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98,272, 98, 98, /* U+2C800 */ + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98,278, 98, 98, /* U+2C800 */ 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+2D000 */ 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+2D800 */ 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+2E000 */ - 98, 98, 98, 98, 98, 98, 98,273,142,142,142,142,142,142,142,142, /* U+2E800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+2F000 */ - 98, 98, 98, 98,274,142,142,142,142,142,142,142,142,142,142,142, /* U+2F800 */ + 98, 98, 98, 98, 98, 98, 98,279,141,141,141,141,141,141,141,141, /* U+2E800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+2F000 */ + 98, 98, 98, 98,280,141,141,141,141,141,141,141,141,141,141,141, /* U+2F800 */ 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+30000 */ 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+30800 */ - 98, 98, 98, 98, 98, 98,275,142,142,142,142,142,142,142,142,142, /* U+31000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+31800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+32000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+32800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+33000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+33800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+34000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+34800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+35000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+35800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+36000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+36800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+37000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+37800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+38000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+38800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+39000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+39800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+3A000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+3A800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+3B000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+3B800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+3C000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+3C800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+3D000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+3D800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+3E000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+3E800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+3F000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+3F800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+40000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+40800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+41000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+41800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+42000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+42800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+43000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+43800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+44000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+44800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+45000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+45800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+46000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+46800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+47000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+47800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+48000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+48800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+49000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+49800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+4A000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+4A800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+4B000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+4B800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+4C000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+4C800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+4D000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+4D800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+4E000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+4E800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+4F000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+4F800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+50000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+50800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+51000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+51800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+52000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+52800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+53000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+53800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+54000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+54800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+55000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+55800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+56000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+56800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+57000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+57800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+58000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+58800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+59000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+59800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+5A000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+5A800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+5B000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+5B800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+5C000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+5C800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+5D000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+5D800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+5E000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+5E800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+5F000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+5F800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+60000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+60800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+61000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+61800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+62000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+62800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+63000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+63800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+64000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+64800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+65000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+65800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+66000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+66800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+67000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+67800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+68000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+68800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+69000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+69800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+6A000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+6A800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+6B000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+6B800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+6C000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+6C800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+6D000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+6D800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+6E000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+6E800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+6F000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+6F800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+70000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+70800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+71000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+71800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+72000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+72800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+73000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+73800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+74000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+74800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+75000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+75800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+76000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+76800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+77000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+77800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+78000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+78800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+79000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+79800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+7A000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+7A800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+7B000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+7B800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+7C000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+7C800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+7D000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+7D800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+7E000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+7E800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+7F000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+7F800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+80000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+80800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+81000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+81800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+82000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+82800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+83000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+83800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+84000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+84800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+85000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+85800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+86000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+86800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+87000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+87800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+88000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+88800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+89000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+89800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+8A000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+8A800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+8B000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+8B800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+8C000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+8C800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+8D000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+8D800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+8E000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+8E800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+8F000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+8F800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+90000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+90800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+91000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+91800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+92000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+92800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+93000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+93800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+94000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+94800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+95000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+95800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+96000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+96800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+97000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+97800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+98000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+98800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+99000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+99800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+9A000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+9A800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+9B000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+9B800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+9C000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+9C800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+9D000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+9D800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+9E000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+9E800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+9F000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+9F800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+A0000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+A0800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+A1000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+A1800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+A2000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+A2800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+A3000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+A3800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+A4000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+A4800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+A5000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+A5800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+A6000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+A6800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+A7000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+A7800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+A8000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+A8800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+A9000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+A9800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+AA000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+AA800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+AB000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+AB800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+AC000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+AC800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+AD000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+AD800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+AE000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+AE800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+AF000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+AF800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+B0000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+B0800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+B1000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+B1800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+B2000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+B2800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+B3000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+B3800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+B4000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+B4800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+B5000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+B5800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+B6000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+B6800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+B7000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+B7800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+B8000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+B8800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+B9000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+B9800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+BA000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+BA800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+BB000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+BB800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+BC000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+BC800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+BD000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+BD800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+BE000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+BE800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+BF000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+BF800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+C0000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+C0800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+C1000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+C1800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+C2000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+C2800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+C3000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+C3800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+C4000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+C4800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+C5000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+C5800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+C6000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+C6800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+C7000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+C7800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+C8000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+C8800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+C9000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+C9800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+CA000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+CA800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+CB000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+CB800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+CC000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+CC800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+CD000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+CD800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+CE000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+CE800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+CF000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+CF800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+D0000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+D0800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+D1000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+D1800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+D2000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+D2800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+D3000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+D3800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+D4000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+D4800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+D5000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+D5800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+D6000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+D6800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+D7000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+D7800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+D8000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+D8800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+D9000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+D9800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+DA000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+DA800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+DB000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+DB800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+DC000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+DC800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+DD000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+DD800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+DE000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+DE800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+DF000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+DF800 */ -276,277,278,279,277,277,277,277,277,277,277,277,277,277,277,277, /* U+E0000 */ -277,277,277,277,277,277,277,277,277,277,277,277,277,277,277,277, /* U+E0800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+E1000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+E1800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+E2000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+E2800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+E3000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+E3800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+E4000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+E4800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+E5000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+E5800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+E6000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+E6800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+E7000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+E7800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+E8000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+E8800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+E9000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+E9800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+EA000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+EA800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+EB000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+EB800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+EC000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+EC800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+ED000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+ED800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+EE000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+EE800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+EF000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+EF800 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+F0000 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+F0800 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+F1000 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+F1800 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+F2000 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+F2800 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+F3000 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+F3800 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+F4000 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+F4800 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+F5000 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+F5800 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+F6000 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+F6800 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+F7000 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+F7800 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+F8000 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+F8800 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+F9000 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+F9800 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+FA000 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+FA800 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+FB000 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+FB800 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+FC000 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+FC800 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+FD000 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+FD800 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+FE000 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+FE800 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+FF000 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,280, /* U+FF800 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+100000 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+100800 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+101000 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+101800 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+102000 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+102800 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+103000 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+103800 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+104000 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+104800 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+105000 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+105800 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+106000 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+106800 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+107000 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+107800 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+108000 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+108800 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+109000 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+109800 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+10A000 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+10A800 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+10B000 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+10B800 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+10C000 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+10C800 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+10D000 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+10D800 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+10E000 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+10E800 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+10F000 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,280, /* U+10F800 */ + 98, 98, 98, 98, 98, 98,281,141,141,141,141,141,141,141,141,141, /* U+31000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+31800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+32000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+32800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+33000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+33800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+34000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+34800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+35000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+35800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+36000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+36800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+37000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+37800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+38000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+38800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+39000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+39800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+3A000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+3A800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+3B000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+3B800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+3C000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+3C800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+3D000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+3D800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+3E000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+3E800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+3F000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+3F800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+40000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+40800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+41000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+41800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+42000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+42800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+43000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+43800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+44000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+44800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+45000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+45800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+46000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+46800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+47000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+47800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+48000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+48800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+49000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+49800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+4A000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+4A800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+4B000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+4B800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+4C000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+4C800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+4D000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+4D800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+4E000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+4E800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+4F000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+4F800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+50000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+50800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+51000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+51800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+52000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+52800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+53000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+53800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+54000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+54800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+55000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+55800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+56000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+56800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+57000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+57800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+58000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+58800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+59000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+59800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+5A000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+5A800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+5B000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+5B800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+5C000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+5C800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+5D000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+5D800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+5E000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+5E800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+5F000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+5F800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+60000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+60800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+61000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+61800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+62000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+62800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+63000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+63800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+64000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+64800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+65000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+65800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+66000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+66800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+67000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+67800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+68000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+68800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+69000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+69800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+6A000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+6A800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+6B000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+6B800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+6C000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+6C800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+6D000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+6D800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+6E000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+6E800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+6F000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+6F800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+70000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+70800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+71000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+71800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+72000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+72800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+73000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+73800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+74000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+74800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+75000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+75800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+76000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+76800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+77000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+77800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+78000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+78800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+79000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+79800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+7A000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+7A800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+7B000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+7B800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+7C000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+7C800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+7D000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+7D800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+7E000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+7E800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+7F000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+7F800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+80000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+80800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+81000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+81800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+82000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+82800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+83000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+83800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+84000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+84800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+85000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+85800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+86000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+86800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+87000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+87800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+88000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+88800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+89000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+89800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+8A000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+8A800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+8B000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+8B800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+8C000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+8C800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+8D000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+8D800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+8E000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+8E800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+8F000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+8F800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+90000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+90800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+91000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+91800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+92000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+92800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+93000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+93800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+94000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+94800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+95000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+95800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+96000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+96800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+97000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+97800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+98000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+98800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+99000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+99800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+9A000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+9A800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+9B000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+9B800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+9C000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+9C800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+9D000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+9D800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+9E000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+9E800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+9F000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+9F800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+A0000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+A0800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+A1000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+A1800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+A2000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+A2800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+A3000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+A3800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+A4000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+A4800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+A5000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+A5800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+A6000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+A6800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+A7000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+A7800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+A8000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+A8800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+A9000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+A9800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+AA000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+AA800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+AB000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+AB800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+AC000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+AC800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+AD000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+AD800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+AE000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+AE800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+AF000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+AF800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+B0000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+B0800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+B1000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+B1800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+B2000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+B2800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+B3000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+B3800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+B4000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+B4800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+B5000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+B5800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+B6000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+B6800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+B7000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+B7800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+B8000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+B8800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+B9000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+B9800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+BA000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+BA800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+BB000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+BB800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+BC000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+BC800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+BD000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+BD800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+BE000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+BE800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+BF000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+BF800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+C0000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+C0800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+C1000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+C1800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+C2000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+C2800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+C3000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+C3800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+C4000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+C4800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+C5000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+C5800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+C6000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+C6800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+C7000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+C7800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+C8000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+C8800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+C9000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+C9800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+CA000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+CA800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+CB000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+CB800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+CC000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+CC800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+CD000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+CD800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+CE000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+CE800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+CF000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+CF800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+D0000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+D0800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+D1000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+D1800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+D2000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+D2800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+D3000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+D3800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+D4000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+D4800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+D5000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+D5800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+D6000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+D6800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+D7000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+D7800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+D8000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+D8800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+D9000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+D9800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+DA000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+DA800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+DB000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+DB800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+DC000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+DC800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+DD000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+DD800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+DE000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+DE800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+DF000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+DF800 */ +282,283,284,285,283,283,283,283,283,283,283,283,283,283,283,283, /* U+E0000 */ +283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283, /* U+E0800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+E1000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+E1800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+E2000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+E2800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+E3000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+E3800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+E4000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+E4800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+E5000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+E5800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+E6000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+E6800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+E7000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+E7800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+E8000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+E8800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+E9000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+E9800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+EA000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+EA800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+EB000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+EB800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+EC000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+EC800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+ED000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+ED800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+EE000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+EE800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+EF000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+EF800 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+F0000 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+F0800 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+F1000 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+F1800 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+F2000 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+F2800 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+F3000 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+F3800 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+F4000 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+F4800 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+F5000 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+F5800 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+F6000 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+F6800 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+F7000 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+F7800 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+F8000 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+F8800 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+F9000 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+F9800 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+FA000 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+FA800 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+FB000 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+FB800 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+FC000 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+FC800 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+FD000 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+FD800 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+FE000 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+FE800 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+FF000 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,286, /* U+FF800 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+100000 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+100800 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+101000 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+101800 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+102000 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+102800 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+103000 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+103800 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+104000 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+104800 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+105000 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+105800 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+106000 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+106800 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+107000 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+107800 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+108000 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+108800 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+109000 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+109800 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+10A000 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+10A800 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+10B000 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+10B800 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+10C000 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+10C800 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+10D000 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+10D800 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+10E000 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+10E800 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+10F000 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,286, /* U+10F800 */ }; -const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */ +const uint16_t PRIV(ucd_stage2)[] = { /* 73472 bytes, block = 128 */ /* block 0 */ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -1840,463 +1866,463 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */ /* block 12 */ 215,215,215,215,215,216,217,217,217,218,218,219,220,218,221,221, -222,222,222,222,222,222,222,222,222,222,222,220,223,120,218,220, -224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, -224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, -225,224,224,224,224,224,224,224,224,224,224,226,226,226,226,226, -226,226,226,226,226,226,222,222,222,222,222,222,222,222,222,222, -227,227,227,227,227,227,227,227,227,227,218,218,218,218,224,224, -226,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, +222,222,222,222,222,222,222,222,222,222,222,220,223,218,218,224, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +226,225,225,225,225,225,225,225,225,225,225,227,227,227,227,227, +227,227,227,227,227,227,222,222,222,222,222,222,222,222,222,222, +228,228,228,228,228,228,228,228,228,228,218,218,218,218,225,225, +227,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, /* block 13 */ -224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, -224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, -224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, -224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, -224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, -224,224,224,224,228,224,222,222,222,222,222,222,222,216,221,222, -222,222,222,222,222,229,229,222,222,221,222,222,222,222,224,224, -230,230,230,230,230,230,230,230,230,230,224,224,224,221,221,224, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,229,225,222,222,222,222,222,222,222,216,221,222, +222,222,222,222,222,230,230,222,222,221,222,222,222,222,225,225, +231,231,231,231,231,231,231,231,231,231,225,225,225,221,221,225, /* block 14 */ -231,231,231,231,231,231,231,231,231,231,231,231,231,231,120,232, -233,234,233,233,233,233,233,233,233,233,233,233,233,233,233,233, -233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233, +232,232,232,232,232,232,232,232,232,232,232,232,232,232,120,233, +234,235,234,234,234,234,234,234,234,234,234,234,234,234,234,234, 234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234, -234,234,234,234,234,234,234,234,234,234,234,120,120,233,233,233, -224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, -224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, -224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, +235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, +235,235,235,235,235,235,235,235,235,235,235,120,120,234,234,234, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, /* block 15 */ -235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, -235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, -235,235,235,235,235,235,236,236,236,236,236,236,236,236,236,236, -236,235,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -237,237,237,237,237,237,237,237,237,237,238,238,238,238,238,238, -238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238, -238,238,238,238,238,238,238,238,238,238,238,239,239,239,239,239, -239,239,239,239,240,240,241,242,242,242,240,120,120,239,243,243, +236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236, +236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236, +236,236,236,236,236,236,237,237,237,237,237,237,237,237,237,237, +237,236,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +238,238,238,238,238,238,238,238,238,238,239,239,239,239,239,239, +239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239, +239,239,239,239,239,239,239,239,239,239,239,240,240,240,240,240, +240,240,240,240,241,241,242,243,243,243,241,120,120,240,244,244, /* block 16 */ -244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244, -244,244,244,244,244,244,245,245,245,245,246,245,245,245,245,245, -245,245,245,245,246,245,245,245,246,245,245,245,245,245,120,120, -247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,120, -248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248, -248,248,248,248,248,248,248,248,248,249,249,249,120,120,250,120, -233,233,233,233,233,233,233,233,233,233,233,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245, +245,245,245,245,245,245,246,246,246,246,247,246,246,246,246,246, +246,246,246,246,247,246,246,246,247,246,246,246,246,246,120,120, +248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,120, +249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249, +249,249,249,249,249,249,249,249,249,250,250,250,120,120,251,120, +234,234,234,234,234,234,234,234,234,234,234,120,120,120,120,120, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, /* block 17 */ -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, -224,224,224,224,224,120,224,224,224,224,224,224,224,224,224,224, -224,224,224,224,224,224,224,224,120,120,120,120,120,120,120,120, -120,120,120,222,222,222,222,222,222,222,222,222,222,222,222,222, +225,225,225,225,225,225,225,225,252,225,225,225,225,225,225,120, +215,215,120,120,120,120,120,120,222,222,222,222,222,222,222,222, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,230,222,222,222,222,222,222, +222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222, 222,222,216,222,222,222,222,222,222,222,222,222,222,222,222,222, 222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222, /* block 18 */ -251,251,251,252,253,253,253,253,253,253,253,253,253,253,253,253, -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, -253,253,253,253,253,253,253,253,253,253,251,252,251,253,252,252, -252,251,251,251,251,251,251,251,251,252,252,252,252,251,252,252, -253,254,255,113,113,251,251,251,253,253,253,253,253,253,253,253, -253,253,251,251,256,257,258,258,258,258,258,258,258,258,258,258, -259,260,253,253,253,253,253,253,253,253,253,253,253,253,253,253, +253,253,253,254,255,255,255,255,255,255,255,255,255,255,255,255, +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +255,255,255,255,255,255,255,255,255,255,253,254,253,255,254,254, +254,253,253,253,253,253,253,253,253,254,254,254,254,253,254,254, +255,256,257,113,113,253,253,253,255,255,255,255,255,255,255,255, +255,255,253,253,258,259,260,260,260,260,260,260,260,260,260,260, +261,262,255,255,255,255,255,255,255,255,255,255,255,255,255,255, /* block 19 */ -261,262,263,263,120,261,261,261,261,261,261,261,261,120,120,261, -261,120,120,261,261,261,261,261,261,261,261,261,261,261,261,261, -261,261,261,261,261,261,261,261,261,120,261,261,261,261,261,261, -261,120,261,120,120,120,261,261,261,261,120,120,262,261,264,263, -263,262,262,262,262,120,120,263,263,120,120,263,263,262,261,120, -120,120,120,120,120,120,120,264,120,120,120,120,261,261,120,261, -261,261,262,262,120,120,265,265,265,265,265,265,265,265,265,265, -261,261,266,266,267,267,267,267,267,267,268,266,261,269,262,120, +263,264,265,265,120,263,263,263,263,263,263,263,263,120,120,263, +263,120,120,263,263,263,263,263,263,263,263,263,263,263,263,263, +263,263,263,263,263,263,263,263,263,120,263,263,263,263,263,263, +263,120,263,120,120,120,263,263,263,263,120,120,264,263,266,265, +265,264,264,264,264,120,120,265,265,120,120,265,265,264,263,120, +120,120,120,120,120,120,120,266,120,120,120,120,263,263,120,263, +263,263,264,264,120,120,267,267,267,267,267,267,267,267,267,267, +263,263,268,268,269,269,269,269,269,269,270,268,263,271,264,120, /* block 20 */ -120,270,270,271,120,272,272,272,272,272,272,120,120,120,120,272, -272,120,120,272,272,272,272,272,272,272,272,272,272,272,272,272, -272,272,272,272,272,272,272,272,272,120,272,272,272,272,272,272, -272,120,272,272,120,272,272,120,272,272,120,120,270,120,271,271, -271,270,270,120,120,120,120,270,270,120,120,270,270,270,120,120, -120,270,120,120,120,120,120,120,120,272,272,272,272,120,272,120, -120,120,120,120,120,120,273,273,273,273,273,273,273,273,273,273, -270,270,272,272,272,270,274,120,120,120,120,120,120,120,120,120, +120,272,272,273,120,274,274,274,274,274,274,120,120,120,120,274, +274,120,120,274,274,274,274,274,274,274,274,274,274,274,274,274, +274,274,274,274,274,274,274,274,274,120,274,274,274,274,274,274, +274,120,274,274,120,274,274,120,274,274,120,120,272,120,273,273, +273,272,272,120,120,120,120,272,272,120,120,272,272,272,120,120, +120,272,120,120,120,120,120,120,120,274,274,274,274,120,274,120, +120,120,120,120,120,120,275,275,275,275,275,275,275,275,275,275, +272,272,274,274,274,272,276,120,120,120,120,120,120,120,120,120, /* block 21 */ -120,275,275,276,120,277,277,277,277,277,277,277,277,277,120,277, -277,277,120,277,277,277,277,277,277,277,277,277,277,277,277,277, -277,277,277,277,277,277,277,277,277,120,277,277,277,277,277,277, -277,120,277,277,120,277,277,277,277,277,120,120,275,277,276,276, -276,275,275,275,275,275,120,275,275,276,120,276,276,275,120,120, -277,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -277,277,275,275,120,120,278,278,278,278,278,278,278,278,278,278, -279,280,120,120,120,120,120,120,120,277,275,275,275,275,275,275, +120,277,277,278,120,279,279,279,279,279,279,279,279,279,120,279, +279,279,120,279,279,279,279,279,279,279,279,279,279,279,279,279, +279,279,279,279,279,279,279,279,279,120,279,279,279,279,279,279, +279,120,279,279,120,279,279,279,279,279,120,120,277,279,278,278, +278,277,277,277,277,277,120,277,277,278,120,278,278,277,120,120, +279,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +279,279,277,277,120,120,280,280,280,280,280,280,280,280,280,280, +281,282,120,120,120,120,120,120,120,279,277,277,277,277,277,277, /* block 22 */ -120,281,282,282,120,283,283,283,283,283,283,283,283,120,120,283, -283,120,120,283,283,283,283,283,283,283,283,283,283,283,283,283, -283,283,283,283,283,283,283,283,283,120,283,283,283,283,283,283, -283,120,283,283,120,283,283,283,283,283,120,120,281,283,284,281, -282,281,281,281,281,120,120,282,282,120,120,282,282,281,120,120, -120,120,120,120,120,281,281,284,120,120,120,120,283,283,120,283, -283,283,281,281,120,120,285,285,285,285,285,285,285,285,285,285, -286,283,287,287,287,287,287,287,120,120,120,120,120,120,120,120, +120,283,284,284,120,285,285,285,285,285,285,285,285,120,120,285, +285,120,120,285,285,285,285,285,285,285,285,285,285,285,285,285, +285,285,285,285,285,285,285,285,285,120,285,285,285,285,285,285, +285,120,285,285,120,285,285,285,285,285,120,120,283,285,286,283, +284,283,283,283,283,120,120,284,284,120,120,284,284,283,120,120, +120,120,120,120,120,283,283,286,120,120,120,120,285,285,120,285, +285,285,283,283,120,120,287,287,287,287,287,287,287,287,287,287, +288,285,289,289,289,289,289,289,120,120,120,120,120,120,120,120, /* block 23 */ -120,120,288,289,120,289,289,289,289,289,289,120,120,120,289,289, -289,120,289,289,289,289,120,120,120,289,289,120,289,120,289,289, -120,120,120,289,289,120,120,120,289,289,289,120,120,120,289,289, -289,289,289,289,289,289,289,289,289,289,120,120,120,120,290,291, -288,291,291,120,120,120,291,291,291,120,291,291,291,288,120,120, -289,120,120,120,120,120,120,290,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,292,292,292,292,292,292,292,292,292,292, -293,293,293,294,295,295,295,295,295,296,295,120,120,120,120,120, +120,120,290,291,120,291,291,291,291,291,291,120,120,120,291,291, +291,120,291,291,291,291,120,120,120,291,291,120,291,120,291,291, +120,120,120,291,291,120,120,120,291,291,291,120,120,120,291,291, +291,291,291,291,291,291,291,291,291,291,120,120,120,120,292,293, +290,293,293,120,120,120,293,293,293,120,293,293,293,290,120,120, +291,120,120,120,120,120,120,292,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,294,294,294,294,294,294,294,294,294,294, +295,295,295,296,297,297,297,297,297,298,297,120,120,120,120,120, /* block 24 */ -297,298,298,298,297,299,299,299,299,299,299,299,299,120,299,299, -299,120,299,299,299,299,299,299,299,299,299,299,299,299,299,299, -299,299,299,299,299,299,299,299,299,120,299,299,299,299,299,299, -299,299,299,299,299,299,299,299,299,299,120,120,120,299,297,297, -297,298,298,298,298,120,297,297,297,120,297,297,297,297,120,120, -120,120,120,120,120,297,297,120,299,299,299,120,120,120,120,120, -299,299,297,297,120,120,300,300,300,300,300,300,300,300,300,300, -120,120,120,120,120,120,120,301,302,302,302,302,302,302,302,303, +299,300,300,300,299,301,301,301,301,301,301,301,301,120,301,301, +301,120,301,301,301,301,301,301,301,301,301,301,301,301,301,301, +301,301,301,301,301,301,301,301,301,120,301,301,301,301,301,301, +301,301,301,301,301,301,301,301,301,301,120,120,299,301,299,299, +299,300,300,300,300,120,299,299,299,120,299,299,299,299,120,120, +120,120,120,120,120,299,299,120,301,301,301,120,120,301,120,120, +301,301,299,299,120,120,302,302,302,302,302,302,302,302,302,302, +120,120,120,120,120,120,120,303,304,304,304,304,304,304,304,305, /* block 25 */ -304,305,306,306,307,304,304,304,304,304,304,304,304,120,304,304, -304,120,304,304,304,304,304,304,304,304,304,304,304,304,304,304, -304,304,304,304,304,304,304,304,304,120,304,304,304,304,304,304, -304,304,304,304,120,304,304,304,304,304,120,120,305,304,306,305, -306,306,308,306,306,120,305,306,306,120,306,306,305,305,120,120, -120,120,120,120,120,308,308,120,120,120,120,120,120,120,304,120, -304,304,305,305,120,120,309,309,309,309,309,309,309,309,309,309, -120,304,304,120,120,120,120,120,120,120,120,120,120,120,120,120, +306,307,308,308,309,306,306,306,306,306,306,306,306,120,306,306, +306,120,306,306,306,306,306,306,306,306,306,306,306,306,306,306, +306,306,306,306,306,306,306,306,306,120,306,306,306,306,306,306, +306,306,306,306,120,306,306,306,306,306,120,120,307,306,308,307, +308,308,310,308,308,120,307,308,308,120,308,308,307,307,120,120, +120,120,120,120,120,310,310,120,120,120,120,120,120,306,306,120, +306,306,307,307,120,120,311,311,311,311,311,311,311,311,311,311, +120,306,306,120,120,120,120,120,120,120,120,120,120,120,120,120, /* block 26 */ -310,310,311,311,312,312,312,312,312,312,312,312,312,120,312,312, -312,120,312,312,312,312,312,312,312,312,312,312,312,312,312,312, -312,312,312,312,312,312,312,312,312,312,312,312,312,312,312,312, -312,312,312,312,312,312,312,312,312,312,312,310,310,312,313,311, -311,310,310,310,310,120,311,311,311,120,311,311,311,310,314,315, -120,120,120,120,312,312,312,313,316,316,316,316,316,316,316,312, -312,312,310,310,120,120,317,317,317,317,317,317,317,317,317,317, -316,316,316,316,316,316,316,316,316,315,312,312,312,312,312,312, +312,312,313,313,314,314,314,314,314,314,314,314,314,120,314,314, +314,120,314,314,314,314,314,314,314,314,314,314,314,314,314,314, +314,314,314,314,314,314,314,314,314,314,314,314,314,314,314,314, +314,314,314,314,314,314,314,314,314,314,314,312,312,314,315,313, +313,312,312,312,312,120,313,313,313,120,313,313,313,312,316,317, +120,120,120,120,314,314,314,315,318,318,318,318,318,318,318,314, +314,314,312,312,120,120,319,319,319,319,319,319,319,319,319,319, +318,318,318,318,318,318,318,318,318,317,314,314,314,314,314,314, /* block 27 */ -120,318,319,319,120,320,320,320,320,320,320,320,320,320,320,320, -320,320,320,320,320,320,320,120,120,120,320,320,320,320,320,320, -320,320,320,320,320,320,320,320,320,320,320,320,320,320,320,320, -320,320,120,320,320,320,320,320,320,320,320,320,120,320,120,120, -320,320,320,320,320,320,320,120,120,120,318,120,120,120,120,321, -319,319,318,318,318,120,318,120,319,319,319,319,319,319,319,321, -120,120,120,120,120,120,322,322,322,322,322,322,322,322,322,322, -120,120,319,319,323,120,120,120,120,120,120,120,120,120,120,120, +120,320,321,321,120,322,322,322,322,322,322,322,322,322,322,322, +322,322,322,322,322,322,322,120,120,120,322,322,322,322,322,322, +322,322,322,322,322,322,322,322,322,322,322,322,322,322,322,322, +322,322,120,322,322,322,322,322,322,322,322,322,120,322,120,120, +322,322,322,322,322,322,322,120,120,120,320,120,120,120,120,323, +321,321,320,320,320,120,320,120,321,321,321,321,321,321,321,323, +120,120,120,120,120,120,324,324,324,324,324,324,324,324,324,324, +120,120,321,321,325,120,120,120,120,120,120,120,120,120,120,120, /* block 28 */ -120,324,324,324,324,324,324,324,324,324,324,324,324,324,324,324, -324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,324, -324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,324, -324,325,324,326,325,325,325,325,325,325,325,120,120,120,120, 6, -324,324,324,324,324,324,327,325,325,325,325,325,325,325,325,328, -329,329,329,329,329,329,329,329,329,329,328,328,120,120,120,120, +120,326,326,326,326,326,326,326,326,326,326,326,326,326,326,326, +326,326,326,326,326,326,326,326,326,326,326,326,326,326,326,326, +326,326,326,326,326,326,326,326,326,326,326,326,326,326,326,326, +326,327,326,328,327,327,327,327,327,327,327,120,120,120,120, 6, +326,326,326,326,326,326,329,327,327,327,327,327,327,327,327,330, +331,331,331,331,331,331,331,331,331,331,330,330,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, /* block 29 */ -120,330,330,120,330,120,330,330,330,330,330,120,330,330,330,330, -330,330,330,330,330,330,330,330,330,330,330,330,330,330,330,330, -330,330,330,330,120,330,120,330,330,330,330,330,330,330,330,330, -330,331,330,332,331,331,331,331,331,331,331,331,331,330,120,120, -330,330,330,330,330,120,333,120,331,331,331,331,331,331,120,120, -334,334,334,334,334,334,334,334,334,334,120,120,330,330,330,330, +120,332,332,120,332,120,332,332,332,332,332,120,332,332,332,332, +332,332,332,332,332,332,332,332,332,332,332,332,332,332,332,332, +332,332,332,332,120,332,120,332,332,332,332,332,332,332,332,332, +332,333,332,334,333,333,333,333,333,333,333,333,333,332,120,120, +332,332,332,332,332,120,335,120,333,333,333,333,333,333,120,120, +336,336,336,336,336,336,336,336,336,336,120,120,332,332,332,332, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, /* block 30 */ -335,336,336,336,337,337,337,337,337,337,337,337,337,337,337,337, -337,337,337,336,337,336,336,336,338,338,336,336,336,336,336,336, -339,339,339,339,339,339,339,339,339,339,340,340,340,340,340,340, -340,340,340,340,336,338,336,338,336,338,341,342,341,342,343,343, -335,335,335,335,335,335,335,335,120,335,335,335,335,335,335,335, -335,335,335,335,335,335,335,335,335,335,335,335,335,335,335,335, -335,335,335,335,335,335,335,335,335,335,335,335,335,120,120,120, -120,338,338,338,338,338,338,338,338,338,338,338,338,338,338,343, +337,338,338,338,339,339,339,339,339,339,339,339,339,339,339,339, +339,339,339,338,339,338,338,338,340,340,338,338,338,338,338,338, +341,341,341,341,341,341,341,341,341,341,342,342,342,342,342,342, +342,342,342,342,338,340,338,340,338,340,343,344,343,344,345,345, +337,337,337,337,337,337,337,337,120,337,337,337,337,337,337,337, +337,337,337,337,337,337,337,337,337,337,337,337,337,337,337,337, +337,337,337,337,337,337,337,337,337,337,337,337,337,120,120,120, +120,340,340,340,340,340,340,340,340,340,340,340,340,340,340,345, /* block 31 */ -338,338,338,338,338,337,338,338,335,335,335,335,335,338,338,338, -338,338,338,338,338,338,338,338,120,338,338,338,338,338,338,338, -338,338,338,338,338,338,338,338,338,338,338,338,338,338,338,338, -338,338,338,338,338,338,338,338,338,338,338,338,338,120,336,336, -336,336,336,336,336,336,338,336,336,336,336,336,336,120,336,336, -337,337,337,337,337, 20, 20, 20, 20,337,337,120,120,120,120,120, +340,340,340,340,340,339,340,340,337,337,337,337,337,340,340,340, +340,340,340,340,340,340,340,340,120,340,340,340,340,340,340,340, +340,340,340,340,340,340,340,340,340,340,340,340,340,340,340,340, +340,340,340,340,340,340,340,340,340,340,340,340,340,120,338,338, +338,338,338,338,338,338,340,338,338,338,338,338,338,120,338,338, +339,339,339,339,339, 20, 20, 20, 20,339,339,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, /* block 32 */ -344,344,344,344,344,344,344,344,344,344,344,344,344,344,344,344, -344,344,344,344,344,344,344,344,344,344,344,344,344,344,344,344, -344,344,344,344,344,344,344,344,344,344,344,345,345,346,346,346, -346,347,346,346,346,346,346,346,345,346,346,347,347,346,346,344, -348,348,348,348,348,348,348,348,348,348,349,349,349,349,349,349, -344,344,344,344,344,344,347,347,346,346,344,344,344,344,346,346, -346,344,345,345,345,344,344,345,345,345,345,345,345,345,344,344, -344,346,346,346,346,344,344,344,344,344,344,344,344,344,344,344, +346,346,346,346,346,346,346,346,346,346,346,346,346,346,346,346, +346,346,346,346,346,346,346,346,346,346,346,346,346,346,346,346, +346,346,346,346,346,346,346,346,346,346,346,347,347,348,348,348, +348,349,348,348,348,348,348,348,347,348,348,349,349,348,348,346, +350,350,350,350,350,350,350,350,350,350,351,351,351,351,351,351, +346,346,346,346,346,346,349,349,348,348,346,346,346,346,348,348, +348,346,347,347,347,346,346,347,347,347,347,347,347,347,346,346, +346,348,348,348,348,346,346,346,346,346,346,346,346,346,346,346, /* block 33 */ -344,344,346,345,347,346,346,345,345,345,345,345,345,346,344,345, -350,350,350,350,350,350,350,350,350,350,345,345,345,346,351,351, -352,352,352,352,352,352,352,352,352,352,352,352,352,352,352,352, -352,352,352,352,352,352,352,352,352,352,352,352,352,352,352,352, -352,352,352,352,352,352,120,352,120,120,120,120,120,352,120,120, -353,353,353,353,353,353,353,353,353,353,353,353,353,353,353,353, -353,353,353,353,353,353,353,353,353,353,353,353,353,353,353,353, -353,353,353,353,353,353,353,353,353,353,353,354,355,353,353,353, +346,346,348,347,349,348,348,347,347,347,347,347,347,348,346,347, +352,352,352,352,352,352,352,352,352,352,347,347,347,348,353,353, +354,354,354,354,354,354,354,354,354,354,354,354,354,354,354,354, +354,354,354,354,354,354,354,354,354,354,354,354,354,354,354,354, +354,354,354,354,354,354,120,354,120,120,120,120,120,354,120,120, +355,355,355,355,355,355,355,355,355,355,355,355,355,355,355,355, +355,355,355,355,355,355,355,355,355,355,355,355,355,355,355,355, +355,355,355,355,355,355,355,355,355,355,355,356,357,355,355,355, /* block 34 */ -356,356,356,356,356,356,356,356,356,356,356,356,356,356,356,356, -356,356,356,356,356,356,356,356,356,356,356,356,356,356,356,356, -356,356,356,356,356,356,356,356,356,356,356,356,356,356,356,356, -356,356,356,356,356,356,356,356,356,356,356,356,356,356,356,356, -356,356,356,356,356,356,356,356,356,356,356,356,356,356,356,356, -356,356,356,356,356,356,356,356,356,356,356,356,356,356,356,356, -357,357,357,357,357,357,357,357,357,357,357,357,357,357,357,357, -357,357,357,357,357,357,357,357,357,357,357,357,357,357,357,357, +358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,358, +358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,358, +358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,358, +358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,358, +358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,358, +358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,358, +359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,359, +359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,359, /* block 35 */ -357,357,357,357,357,357,357,357,357,357,357,357,357,357,357,357, -357,357,357,357,357,357,357,357,357,357,357,357,357,357,357,357, -357,357,357,357,357,357,357,357,358,358,358,358,358,358,358,358, -358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,358, -358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,358, -358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,358, -358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,358, -358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,358, +359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,359, +359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,359, +359,359,359,359,359,359,359,359,360,360,360,360,360,360,360,360, +360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360, +360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360, +360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360, +360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360, +360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360, /* block 36 */ -359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,359, -359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,359, -359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,359, -359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,359, -359,359,359,359,359,359,359,359,359,120,359,359,359,359,120,120, -359,359,359,359,359,359,359,120,359,120,359,359,359,359,120,120, -359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,359, -359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,359, +361,361,361,361,361,361,361,361,361,361,361,361,361,361,361,361, +361,361,361,361,361,361,361,361,361,361,361,361,361,361,361,361, +361,361,361,361,361,361,361,361,361,361,361,361,361,361,361,361, +361,361,361,361,361,361,361,361,361,361,361,361,361,361,361,361, +361,361,361,361,361,361,361,361,361,120,361,361,361,361,120,120, +361,361,361,361,361,361,361,120,361,120,361,361,361,361,120,120, +361,361,361,361,361,361,361,361,361,361,361,361,361,361,361,361, +361,361,361,361,361,361,361,361,361,361,361,361,361,361,361,361, /* block 37 */ -359,359,359,359,359,359,359,359,359,120,359,359,359,359,120,120, -359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,359, -359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,359, -359,120,359,359,359,359,120,120,359,359,359,359,359,359,359,120, -359,120,359,359,359,359,120,120,359,359,359,359,359,359,359,359, -359,359,359,359,359,359,359,120,359,359,359,359,359,359,359,359, -359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,359, -359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,359, +361,361,361,361,361,361,361,361,361,120,361,361,361,361,120,120, +361,361,361,361,361,361,361,361,361,361,361,361,361,361,361,361, +361,361,361,361,361,361,361,361,361,361,361,361,361,361,361,361, +361,120,361,361,361,361,120,120,361,361,361,361,361,361,361,120, +361,120,361,361,361,361,120,120,361,361,361,361,361,361,361,361, +361,361,361,361,361,361,361,120,361,361,361,361,361,361,361,361, +361,361,361,361,361,361,361,361,361,361,361,361,361,361,361,361, +361,361,361,361,361,361,361,361,361,361,361,361,361,361,361,361, /* block 38 */ -359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,359, -359,120,359,359,359,359,120,120,359,359,359,359,359,359,359,359, -359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,359, -359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,359, -359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,359, -359,359,359,359,359,359,359,359,359,359,359,120,120,360,360,360, -361,361,361,361,361,361,361,361,361,362,362,362,362,362,362,362, -362,362,362,362,362,362,362,362,362,362,362,362,362,120,120,120, +361,361,361,361,361,361,361,361,361,361,361,361,361,361,361,361, +361,120,361,361,361,361,120,120,361,361,361,361,361,361,361,361, +361,361,361,361,361,361,361,361,361,361,361,361,361,361,361,361, +361,361,361,361,361,361,361,361,361,361,361,361,361,361,361,361, +361,361,361,361,361,361,361,361,361,361,361,361,361,361,361,361, +361,361,361,361,361,361,361,361,361,361,361,120,120,362,362,362, +363,363,363,363,363,363,363,363,363,364,364,364,364,364,364,364, +364,364,364,364,364,364,364,364,364,364,364,364,364,120,120,120, /* block 39 */ -359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,359, -363,363,363,363,363,363,363,363,363,363,120,120,120,120,120,120, -364,364,364,364,364,364,364,364,364,364,364,364,364,364,364,364, -364,364,364,364,364,364,364,364,364,364,364,364,364,364,364,364, -364,364,364,364,364,364,364,364,364,364,364,364,364,364,364,364, -364,364,364,364,364,364,364,364,364,364,364,364,364,364,364,364, -364,364,364,364,364,364,364,364,364,364,364,364,364,364,364,364, -365,365,365,365,365,365,120,120,366,366,366,366,366,366,120,120, +361,361,361,361,361,361,361,361,361,361,361,361,361,361,361,361, +365,365,365,365,365,365,365,365,365,365,120,120,120,120,120,120, +366,366,366,366,366,366,366,366,366,366,366,366,366,366,366,366, +366,366,366,366,366,366,366,366,366,366,366,366,366,366,366,366, +366,366,366,366,366,366,366,366,366,366,366,366,366,366,366,366, +366,366,366,366,366,366,366,366,366,366,366,366,366,366,366,366, +366,366,366,366,366,366,366,366,366,366,366,366,366,366,366,366, +367,367,367,367,367,367,120,120,368,368,368,368,368,368,120,120, /* block 40 */ -367,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368, -368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368, -368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368, -368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368, -368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368, -368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368, -368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368, -368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368, +369,370,370,370,370,370,370,370,370,370,370,370,370,370,370,370, +370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,370, +370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,370, +370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,370, +370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,370, +370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,370, +370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,370, +370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,370, /* block 41 */ -368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368, -368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368, -368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368, -368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368, -368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368, -368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368, -368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368, -368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368, +370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,370, +370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,370, +370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,370, +370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,370, +370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,370, +370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,370, +370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,370, +370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,370, /* block 42 */ -368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368, -368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368, -368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368, -368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368, -368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368, -368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368, -368,368,368,368,368,368,368,368,368,368,368,368,368,369,370,368, -368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368, +370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,370, +370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,370, +370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,370, +370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,370, +370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,370, +370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,370, +370,370,370,370,370,370,370,370,370,370,370,370,370,371,372,370, +370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,370, /* block 43 */ -371,372,372,372,372,372,372,372,372,372,372,372,372,372,372,372, -372,372,372,372,372,372,372,372,372,372,372,373,374,120,120,120, -375,375,375,375,375,375,375,375,375,375,375,375,375,375,375,375, -375,375,375,375,375,375,375,375,375,375,375,375,375,375,375,375, -375,375,375,375,375,375,375,375,375,375,375,375,375,375,375,375, -375,375,375,375,375,375,375,375,375,375,375,375,375,375,375,375, -375,375,375,375,375,375,375,375,375,375,375, 5, 5, 5,376,376, -376,375,375,375,375,375,375,375,375,120,120,120,120,120,120,120, +373,374,374,374,374,374,374,374,374,374,374,374,374,374,374,374, +374,374,374,374,374,374,374,374,374,374,374,375,376,120,120,120, +377,377,377,377,377,377,377,377,377,377,377,377,377,377,377,377, +377,377,377,377,377,377,377,377,377,377,377,377,377,377,377,377, +377,377,377,377,377,377,377,377,377,377,377,377,377,377,377,377, +377,377,377,377,377,377,377,377,377,377,377,377,377,377,377,377, +377,377,377,377,377,377,377,377,377,377,377, 5, 5, 5,378,378, +378,377,377,377,377,377,377,377,377,120,120,120,120,120,120,120, /* block 44 */ -377,377,377,377,377,377,377,377,377,377,377,377,377,120,377,377, -377,377,378,378,378,120,120,120,120,120,120,120,120,120,120,120, 379,379,379,379,379,379,379,379,379,379,379,379,379,379,379,379, -379,379,380,380,380,381,381,120,120,120,120,120,120,120,120,120, +379,379,380,380,380,381,120,120,120,120,120,120,120,120,120,379, 382,382,382,382,382,382,382,382,382,382,382,382,382,382,382,382, -382,382,383,383,120,120,120,120,120,120,120,120,120,120,120,120, -384,384,384,384,384,384,384,384,384,384,384,384,384,120,384,384, -384,120,385,385,120,120,120,120,120,120,120,120,120,120,120,120, +382,382,383,383,384,385,385,120,120,120,120,120,120,120,120,120, +386,386,386,386,386,386,386,386,386,386,386,386,386,386,386,386, +386,386,387,387,120,120,120,120,120,120,120,120,120,120,120,120, +388,388,388,388,388,388,388,388,388,388,388,388,388,120,388,388, +388,120,389,389,120,120,120,120,120,120,120,120,120,120,120,120, /* block 45 */ -386,386,386,386,386,386,386,386,386,386,386,386,386,386,386,386, -386,386,386,386,386,386,386,386,386,386,386,386,386,386,386,386, -386,386,386,386,386,386,386,386,386,386,386,386,386,386,386,386, -386,386,386,386,387,387,388,387,387,387,387,387,387,387,388,388, -388,388,388,388,388,388,387,388,388,387,387,387,387,387,387,387, -387,387,387,387,389,389,389,390,389,389,389,391,386,387,120,120, -392,392,392,392,392,392,392,392,392,392,120,120,120,120,120,120, -393,393,393,393,393,393,393,393,393,393,120,120,120,120,120,120, +390,390,390,390,390,390,390,390,390,390,390,390,390,390,390,390, +390,390,390,390,390,390,390,390,390,390,390,390,390,390,390,390, +390,390,390,390,390,390,390,390,390,390,390,390,390,390,390,390, +390,390,390,390,391,391,392,391,391,391,391,391,391,391,392,392, +392,392,392,392,392,392,391,392,392,391,391,391,391,391,391,391, +391,391,391,391,393,393,393,394,393,393,393,395,390,391,120,120, +396,396,396,396,396,396,396,396,396,396,120,120,120,120,120,120, +397,397,397,397,397,397,397,397,397,397,120,120,120,120,120,120, /* block 46 */ -394,394,395,395,394,395,396,394,394,394,394,397,397,397,398,120, -399,399,399,399,399,399,399,399,399,399,120,120,120,120,120,120, -400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400, -400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400, -400,400,400,401,400,400,400,400,400,400,400,400,400,400,400,400, -400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400, -400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400, -400,400,400,400,400,400,400,400,400,120,120,120,120,120,120,120, +398,398,399,399,398,399,400,398,398,398,398,401,401,401,402,401, +403,403,403,403,403,403,403,403,403,403,120,120,120,120,120,120, +404,404,404,404,404,404,404,404,404,404,404,404,404,404,404,404, +404,404,404,404,404,404,404,404,404,404,404,404,404,404,404,404, +404,404,404,405,404,404,404,404,404,404,404,404,404,404,404,404, +404,404,404,404,404,404,404,404,404,404,404,404,404,404,404,404, +404,404,404,404,404,404,404,404,404,404,404,404,404,404,404,404, +404,404,404,404,404,404,404,404,404,120,120,120,120,120,120,120, /* block 47 */ -400,400,400,400,400,397,397,400,400,400,400,400,400,400,400,400, -400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400, -400,400,400,400,400,400,400,400,400,397,400,120,120,120,120,120, -368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368, -368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368, -368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368, -368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368, -368,368,368,368,368,368,120,120,120,120,120,120,120,120,120,120, +404,404,404,404,404,401,401,404,404,404,404,404,404,404,404,404, +404,404,404,404,404,404,404,404,404,404,404,404,404,404,404,404, +404,404,404,404,404,404,404,404,404,401,404,120,120,120,120,120, +370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,370, +370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,370, +370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,370, +370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,370, +370,370,370,370,370,370,120,120,120,120,120,120,120,120,120,120, /* block 48 */ -402,402,402,402,402,402,402,402,402,402,402,402,402,402,402,402, -402,402,402,402,402,402,402,402,402,402,402,402,402,402,402,120, -403,403,403,404,404,404,404,403,403,404,404,404,120,120,120,120, -404,404,403,404,404,404,404,404,404,403,403,403,120,120,120,120, -405,120,120,120,406,406,407,407,407,407,407,407,407,407,407,407, -408,408,408,408,408,408,408,408,408,408,408,408,408,408,408,408, -408,408,408,408,408,408,408,408,408,408,408,408,408,408,120,120, -408,408,408,408,408,120,120,120,120,120,120,120,120,120,120,120, +406,406,406,406,406,406,406,406,406,406,406,406,406,406,406,406, +406,406,406,406,406,406,406,406,406,406,406,406,406,406,406,120, +407,407,407,408,408,408,408,407,407,408,408,408,120,120,120,120, +408,408,407,408,408,408,408,408,408,407,407,407,120,120,120,120, +409,120,120,120,410,410,411,411,411,411,411,411,411,411,411,411, +412,412,412,412,412,412,412,412,412,412,412,412,412,412,412,412, +412,412,412,412,412,412,412,412,412,412,412,412,412,412,120,120, +412,412,412,412,412,120,120,120,120,120,120,120,120,120,120,120, /* block 49 */ -409,409,409,409,409,409,409,409,409,409,409,409,409,409,409,409, -409,409,409,409,409,409,409,409,409,409,409,409,409,409,409,409, -409,409,409,409,409,409,409,409,409,409,409,409,120,120,120,120, -409,409,409,409,409,409,409,409,409,409,409,409,409,409,409,409, -409,409,409,409,409,409,409,409,409,409,120,120,120,120,120,120, -410,410,410,410,410,410,410,410,410,410,411,120,120,120,412,412, 413,413,413,413,413,413,413,413,413,413,413,413,413,413,413,413, 413,413,413,413,413,413,413,413,413,413,413,413,413,413,413,413, +413,413,413,413,413,413,413,413,413,413,413,413,120,120,120,120, +413,413,413,413,413,413,413,413,413,413,413,413,413,413,413,413, +413,413,413,413,413,413,413,413,413,413,120,120,120,120,120,120, +414,414,414,414,414,414,414,414,414,414,415,120,120,120,416,416, +417,417,417,417,417,417,417,417,417,417,417,417,417,417,417,417, +417,417,417,417,417,417,417,417,417,417,417,417,417,417,417,417, /* block 50 */ -414,414,414,414,414,414,414,414,414,414,414,414,414,414,414,414, -414,414,414,414,414,414,414,415,415,416,416,415,120,120,417,417, 418,418,418,418,418,418,418,418,418,418,418,418,418,418,418,418, -418,418,418,418,418,418,418,418,418,418,418,418,418,418,418,418, -418,418,418,418,418,418,418,418,418,418,418,418,418,418,418,418, -418,418,418,418,418,419,420,419,420,420,420,420,420,420,420,120, -420,421,420,421,421,420,420,420,420,420,420,420,420,419,419,419, -419,419,419,420,420,420,420,420,420,420,420,420,420,120,120,420, +418,418,418,418,418,418,418,419,419,420,420,419,120,120,421,421, +422,422,422,422,422,422,422,422,422,422,422,422,422,422,422,422, +422,422,422,422,422,422,422,422,422,422,422,422,422,422,422,422, +422,422,422,422,422,422,422,422,422,422,422,422,422,422,422,422, +422,422,422,422,422,423,424,423,424,424,424,424,424,424,424,120, +424,425,424,425,425,424,424,424,424,424,424,424,424,423,423,423, +423,423,423,424,424,424,424,424,424,424,424,424,424,120,120,424, /* block 51 */ -422,422,422,422,422,422,422,422,422,422,120,120,120,120,120,120, -422,422,422,422,422,422,422,422,422,422,120,120,120,120,120,120, -423,423,423,423,423,423,423,424,423,423,423,423,423,423,120,120, -113,113,113,113,113,113,113,113,113,113,113,113,113,113,425,113, -113,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +426,426,426,426,426,426,426,426,426,426,120,120,120,120,120,120, +426,426,426,426,426,426,426,426,426,426,120,120,120,120,120,120, +427,427,427,427,427,427,427,428,427,427,427,427,427,427,120,120, +113,113,113,113,113,113,113,113,113,113,113,113,113,113,429,113, +113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, /* block 52 */ -426,426,426,426,427,428,428,428,428,428,428,428,428,428,428,428, -428,428,428,428,428,428,428,428,428,428,428,428,428,428,428,428, -428,428,428,428,428,428,428,428,428,428,428,428,428,428,428,428, -428,428,428,428,426,429,426,426,426,426,426,427,426,427,427,427, -427,427,426,427,427,428,428,428,428,428,428,428,120,120,120,120, -430,430,430,430,430,430,430,430,430,430,431,431,431,431,431,431, -431,432,432,432,432,432,432,432,432,432,432,426,426,426,426,426, -426,426,426,426,432,432,432,432,432,432,432,432,432,120,120,120, +430,430,430,430,431,432,432,432,432,432,432,432,432,432,432,432, +432,432,432,432,432,432,432,432,432,432,432,432,432,432,432,432, +432,432,432,432,432,432,432,432,432,432,432,432,432,432,432,432, +432,432,432,432,430,433,430,430,430,430,430,431,430,431,431,431, +431,431,430,431,431,432,432,432,432,432,432,432,432,120,120,120, +434,434,434,434,434,434,434,434,434,434,435,435,435,435,435,435, +435,436,436,436,436,436,436,436,436,436,436,430,430,430,430,430, +430,430,430,430,436,436,436,436,436,436,436,436,436,435,435,120, /* block 53 */ -433,433,434,435,435,435,435,435,435,435,435,435,435,435,435,435, -435,435,435,435,435,435,435,435,435,435,435,435,435,435,435,435, -435,434,433,433,433,433,434,434,433,433,434,433,433,433,435,435, -436,436,436,436,436,436,436,436,436,436,435,435,435,435,435,435, -437,437,437,437,437,437,437,437,437,437,437,437,437,437,437,437, -437,437,437,437,437,437,437,437,437,437,437,437,437,437,437,437, -437,437,437,437,437,437,438,439,438,438,439,439,439,438,439,438, -438,438,439,439,120,120,120,120,120,120,120,120,440,440,440,440, +437,437,438,439,439,439,439,439,439,439,439,439,439,439,439,439, +439,439,439,439,439,439,439,439,439,439,439,439,439,439,439,439, +439,438,437,437,437,437,438,438,437,437,438,437,437,437,439,439, +440,440,440,440,440,440,440,440,440,440,439,439,439,439,439,439, +441,441,441,441,441,441,441,441,441,441,441,441,441,441,441,441, +441,441,441,441,441,441,441,441,441,441,441,441,441,441,441,441, +441,441,441,441,441,441,442,443,442,442,443,443,443,442,443,442, +442,442,443,443,120,120,120,120,120,120,120,120,444,444,444,444, /* block 54 */ -441,441,441,441,441,441,441,441,441,441,441,441,441,441,441,441, -441,441,441,441,441,441,441,441,441,441,441,441,441,441,441,441, -441,441,441,441,442,442,442,442,442,442,442,442,443,443,443,443, -443,443,443,443,442,442,443,443,120,120,120,444,444,444,444,444, -445,445,445,445,445,445,445,445,445,445,120,120,120,441,441,441, -446,446,446,446,446,446,446,446,446,446,447,447,447,447,447,447, -447,447,447,447,447,447,447,447,447,447,447,447,447,447,447,447, -447,447,447,447,447,447,447,447,448,448,448,448,448,448,449,449, +445,445,445,445,445,445,445,445,445,445,445,445,445,445,445,445, +445,445,445,445,445,445,445,445,445,445,445,445,445,445,445,445, +445,445,445,445,446,446,446,446,446,446,446,446,447,447,447,447, +447,447,447,447,446,446,447,447,120,120,120,448,448,448,448,448, +449,449,449,449,449,449,449,449,449,449,120,120,120,445,445,445, +450,450,450,450,450,450,450,450,450,450,451,451,451,451,451,451, +451,451,451,451,451,451,451,451,451,451,451,451,451,451,451,451, +451,451,451,451,451,451,451,451,452,452,452,452,452,452,453,453, /* block 55 */ -450,451,452,453,454,455,456,457,458,120,120,120,120,120,120,120, -459,459,459,459,459,459,459,459,459,459,459,459,459,459,459,459, -459,459,459,459,459,459,459,459,459,459,459,459,459,459,459,459, -459,459,459,459,459,459,459,459,459,459,459,120,120,459,459,459, -460,460,460,460,460,460,460,460,120,120,120,120,120,120,120,120, -461,462,461,463,462,464,464,465,464,465,466,462,465,465,462,462, -465,467,462,462,462,462,462,462,462,468,469,470,470,464,470,470, -470,470,471,472,473,469,469,474,475,475,476,120,120,120,120,120, +454,455,456,457,458,459,460,461,462,120,120,120,120,120,120,120, +463,463,463,463,463,463,463,463,463,463,463,463,463,463,463,463, +463,463,463,463,463,463,463,463,463,463,463,463,463,463,463,463, +463,463,463,463,463,463,463,463,463,463,463,120,120,463,463,463, +464,464,464,464,464,464,464,464,120,120,120,120,120,120,120,120, +465,466,465,467,466,468,468,469,468,469,470,466,469,469,466,466, +469,471,466,466,466,466,466,466,466,472,473,474,474,468,474,474, +474,474,475,476,477,473,473,478,479,479,480,120,120,120,120,120, /* block 56 */ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35,128,128,128,128,128,477,110,110,110,110, + 35, 35, 35, 35, 35, 35,128,128,128,128,128,481,110,110,110,110, 110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110, 110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110, 110,110,110,110,110,110,110,110,110,110,110,110,110,121,121,121, 121,121,110,110,110,110,121,121,121,121,121, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35,478,479, 35, 35, 35,480, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35,482,483, 35, 35, 35,484, 35, 35, /* block 57 */ - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,481, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,485, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,110,110,110,110,110, 110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110, 110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,121, 114,114,113,113,113,113,113,113,113,113,113,113,113,113,113,113, 113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113, 113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113, -113,113,113,113,113,113,113,113,482,113,120,113,113,113,113,113, +113,113,113,113,113,113,113,113,486,113,487,113,113,113,113,113, /* block 58 */ 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, @@ -2305,12 +2331,12 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */ 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, -483,484, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, +488,489, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, /* block 59 */ 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, - 32, 33, 32, 33, 32, 33, 35, 35, 35, 35, 35,485, 35, 35,486, 35, + 32, 33, 32, 33, 32, 33, 35, 35, 35, 35, 35,490, 35, 35,491, 35, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, @@ -2319,33 +2345,33 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */ 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, /* block 60 */ -487,487,487,487,487,487,487,487,488,488,488,488,488,488,488,488, -487,487,487,487,487,487,120,120,488,488,488,488,488,488,120,120, -487,487,487,487,487,487,487,487,488,488,488,488,488,488,488,488, -487,487,487,487,487,487,487,487,488,488,488,488,488,488,488,488, -487,487,487,487,487,487,120,120,488,488,488,488,488,488,120,120, -128,487,128,487,128,487,128,487,120,488,120,488,120,488,120,488, -487,487,487,487,487,487,487,487,488,488,488,488,488,488,488,488, -489,489,490,490,490,490,491,491,492,492,493,493,494,494,120,120, +492,492,492,492,492,492,492,492,493,493,493,493,493,493,493,493, +492,492,492,492,492,492,120,120,493,493,493,493,493,493,120,120, +492,492,492,492,492,492,492,492,493,493,493,493,493,493,493,493, +492,492,492,492,492,492,492,492,493,493,493,493,493,493,493,493, +492,492,492,492,492,492,120,120,493,493,493,493,493,493,120,120, +128,492,128,492,128,492,128,492,120,493,120,493,120,493,120,493, +492,492,492,492,492,492,492,492,493,493,493,493,493,493,493,493, +494,494,495,495,495,495,496,496,497,497,498,498,499,499,120,120, /* block 61 */ -487,487,487,487,487,487,487,487,495,495,495,495,495,495,495,495, -487,487,487,487,487,487,487,487,495,495,495,495,495,495,495,495, -487,487,487,487,487,487,487,487,495,495,495,495,495,495,495,495, -487,487,128,496,128,120,128,128,488,488,497,497,498,119,499,119, -119,119,128,496,128,120,128,128,500,500,500,500,498,119,119,119, -487,487,128,128,120,120,128,128,488,488,501,501,120,119,119,119, -487,487,128,128,128,169,128,128,488,488,502,502,174,119,119,119, -120,120,128,496,128,120,128,128,503,503,504,504,498,119,119,120, +492,492,492,492,492,492,492,492,500,500,500,500,500,500,500,500, +492,492,492,492,492,492,492,492,500,500,500,500,500,500,500,500, +492,492,492,492,492,492,492,492,500,500,500,500,500,500,500,500, +492,492,128,501,128,120,128,128,493,493,502,502,503,119,504,119, +119,119,128,501,128,120,128,128,505,505,505,505,503,119,119,119, +492,492,128,128,120,120,128,128,493,493,506,506,120,119,119,119, +492,492,128,128,128,169,128,128,493,493,507,507,174,119,119,119, +120,120,128,501,128,120,128,128,508,508,509,509,503,119,119,120, /* block 62 */ - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 24,505,506, 24, 24, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 24,510,511, 24, 24, 10, 10, 10, 10, 10, 10, 5, 5, 23, 27, 7, 23, 23, 27, 7, 23, - 5, 5, 5, 5, 5, 5, 5, 5,507,508, 24, 24, 24, 24, 24,509, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 23, 27, 5,510, 5, 5, 16, - 16, 5, 5, 5, 9, 7, 8, 5, 5,510, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5,512,513, 24, 24, 24, 24, 24,514, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 23, 27, 5,515, 5, 5, 16, + 16, 5, 5, 5, 9, 7, 8, 5, 5,515, 5, 5, 5, 5, 5, 5, 5, 5, 9, 5, 16, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, - 24, 24, 24, 24, 24,511, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 24, 24, 24, 24, 24,516, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 25,110,120,120, 25, 25, 25, 25, 25, 25, 9, 9, 9, 7, 8,110, /* block 63 */ @@ -2353,24 +2379,24 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */ 110,110,110,110,110,110,110,110,110,110,110,110,110,120,120,120, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -113,113,113,113,113,113,113,113,113,113,113,113,113,425,425,425, -425,113,425,425,425,113,113,113,113,113,113,113,113,113,113,113, -512,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, + 6,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +113,113,113,113,113,113,113,113,113,113,113,113,113,429,429,429, +429,113,429,429,429,113,113,113,113,113,113,113,113,113,113,113, +517,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, /* block 64 */ - 20, 20,513, 20, 20, 20, 20,513, 20, 20,514,513,513,513,514,514, -513,513,513,514, 20,513, 20, 20, 9,513,513,513,513,513, 20, 20, - 20, 20, 21, 20,513, 20,515, 20,513, 20,516,517,513,513, 20,514, -513,513,518,513,514,519,519,519,519,520, 20, 20,514,514,513,513, - 9, 9, 9, 9, 9,513,514,514,514,514, 20, 9, 20, 20,521, 20, + 20, 20,518, 20, 20, 20, 20,518, 20, 20,519,518,518,518,519,519, +518,518,518,519, 20,518, 20, 20, 9,518,518,518,518,518, 20, 20, + 20, 20, 21, 20,518, 20,520, 20,518, 20,521,522,518,518, 20,519, +518,518,523,518,519,524,524,524,524,525, 20, 20,519,519,518,518, + 9, 9, 9, 9, 9,518,519,519,519,519, 20, 9, 20, 20,526, 20, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, -522,522,522,522,522,522,522,522,522,522,522,522,522,522,522,522, -523,523,523,523,523,523,523,523,523,523,523,523,523,523,523,523, +527,527,527,527,527,527,527,527,527,527,527,527,527,527,527,527, +528,528,528,528,528,528,528,528,528,528,528,528,528,528,528,528, /* block 65 */ -524,524,524, 32, 33,524,524,524,524, 25, 20, 20,120,120,120,120, - 9, 9, 9, 9,525, 21, 21, 21, 21, 21, 9, 9, 20, 20, 20, 20, +529,529,529, 32, 33,529,529,529,529, 25, 20, 20,120,120,120,120, + 9, 9, 9, 9,530, 21, 21, 21, 21, 21, 9, 9, 20, 20, 20, 20, 9, 20, 20, 9, 20, 20, 9, 20, 20, 21, 21, 20, 20, 20, 9, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 9, 9, @@ -2422,10 +2448,10 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20,526,526,526,526,526,526,526,526,526,526, -526,526,527,526,526,526,526,526,526,526,526,526,526,526,526,526, -528,528,528,528,528,528,528,528,528,528,528,528,528,528,528,528, -528,528,528,528,528,528,528,528,528,528, 25, 25, 25, 25, 25, 25, + 20, 20, 20, 20, 20, 20,531,531,531,531,531,531,531,531,531,531, +531,531,532,531,531,531,531,531,531,531,531,531,531,531,531,531, +533,533,533,533,533,533,533,533,533,533,533,533,533,533,533,533, +533,533,533,533,533,533,533,533,533,533, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, /* block 71 */ @@ -2446,7 +2472,7 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */ 21, 9, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 9, 9, 9,525,525,525,525, 9, + 20, 20, 20, 20, 20, 20, 20, 20, 9, 9, 9,530,530,530,530, 9, /* block 73 */ 21, 21, 21, 21, 21, 21, 20, 21, 21, 21, 21, 21, 21, 21, 21, 21, @@ -2455,7 +2481,7 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,525, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,530, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, /* block 74 */ @@ -2489,20 +2515,20 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, /* block 77 */ -529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,529, -529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,529, -529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,529, -529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,529, -529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,529, -529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,529, -529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,529, -529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,529, +534,534,534,534,534,534,534,534,534,534,534,534,534,534,534,534, +534,534,534,534,534,534,534,534,534,534,534,534,534,534,534,534, +534,534,534,534,534,534,534,534,534,534,534,534,534,534,534,534, +534,534,534,534,534,534,534,534,534,534,534,534,534,534,534,534, +534,534,534,534,534,534,534,534,534,534,534,534,534,534,534,534, +534,534,534,534,534,534,534,534,534,534,534,534,534,534,534,534, +534,534,534,534,534,534,534,534,534,534,534,534,534,534,534,534, +534,534,534,534,534,534,534,534,534,534,534,534,534,534,534,534, /* block 78 */ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9,525,525, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9,530,530, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, @@ -2539,14 +2565,14 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, /* block 82 */ -530,530,530,530,530,530,530,530,530,530,530,530,530,530,530,530, -530,530,530,530,530,530,530,530,530,530,530,530,530,530,530,530, -530,530,530,530,530,530,530,530,530,530,530,530,530,530,530,120, -531,531,531,531,531,531,531,531,531,531,531,531,531,531,531,531, -531,531,531,531,531,531,531,531,531,531,531,531,531,531,531,531, -531,531,531,531,531,531,531,531,531,531,531,531,531,531,531,120, - 32, 33,532,533,534,535,536, 32, 33, 32, 33, 32, 33,537,538,539, -540, 35, 32, 33, 35, 32, 33, 35, 35, 35, 35, 35,110,110,541,541, +535,535,535,535,535,535,535,535,535,535,535,535,535,535,535,535, +535,535,535,535,535,535,535,535,535,535,535,535,535,535,535,535, +535,535,535,535,535,535,535,535,535,535,535,535,535,535,535,535, +536,536,536,536,536,536,536,536,536,536,536,536,536,536,536,536, +536,536,536,536,536,536,536,536,536,536,536,536,536,536,536,536, +536,536,536,536,536,536,536,536,536,536,536,536,536,536,536,536, + 32, 33,537,538,539,540,541, 32, 33, 32, 33, 32, 33,542,543,544, +545, 35, 32, 33, 35, 32, 33, 35, 35, 35, 35, 35,110,110,546,546, /* block 83 */ 165,166,165,166,165,166,165,166,165,166,165,166,165,166,165,166, @@ -2555,138 +2581,138 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */ 165,166,165,166,165,166,165,166,165,166,165,166,165,166,165,166, 165,166,165,166,165,166,165,166,165,166,165,166,165,166,165,166, 165,166,165,166,165,166,165,166,165,166,165,166,165,166,165,166, -165,166,165,166,542,543,543,543,543,543,543,165,166,165,166,544, -544,544,165,166,120,120,120,120,120,545,545,545,545,546,545,545, +165,166,165,166,547,548,548,548,548,548,548,165,166,165,166,549, +549,549,165,166,120,120,120,120,120,550,550,550,550,551,550,550, /* block 84 */ -547,547,547,547,547,547,547,547,547,547,547,547,547,547,547,547, -547,547,547,547,547,547,547,547,547,547,547,547,547,547,547,547, -547,547,547,547,547,547,120,547,120,120,120,120,120,547,120,120, -548,548,548,548,548,548,548,548,548,548,548,548,548,548,548,548, -548,548,548,548,548,548,548,548,548,548,548,548,548,548,548,548, -548,548,548,548,548,548,548,548,548,548,548,548,548,548,548,548, -548,548,548,548,548,548,548,548,120,120,120,120,120,120,120,549, -550,120,120,120,120,120,120,120,120,120,120,120,120,120,120,551, +552,552,552,552,552,552,552,552,552,552,552,552,552,552,552,552, +552,552,552,552,552,552,552,552,552,552,552,552,552,552,552,552, +552,552,552,552,552,552,120,552,120,120,120,120,120,552,120,120, +553,553,553,553,553,553,553,553,553,553,553,553,553,553,553,553, +553,553,553,553,553,553,553,553,553,553,553,553,553,553,553,553, +553,553,553,553,553,553,553,553,553,553,553,553,553,553,553,553, +553,553,553,553,553,553,553,553,120,120,120,120,120,120,120,554, +555,120,120,120,120,120,120,120,120,120,120,120,120,120,120,556, /* block 85 */ -359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,359, -359,359,359,359,359,359,359,120,120,120,120,120,120,120,120,120, -359,359,359,359,359,359,359,120,359,359,359,359,359,359,359,120, -359,359,359,359,359,359,359,120,359,359,359,359,359,359,359,120, -359,359,359,359,359,359,359,120,359,359,359,359,359,359,359,120, -359,359,359,359,359,359,359,120,359,359,359,359,359,359,359,120, -552,552,552,552,552,552,552,552,552,552,552,552,552,552,552,552, -552,552,552,552,552,552,552,552,552,552,552,552,552,552,552,552, +361,361,361,361,361,361,361,361,361,361,361,361,361,361,361,361, +361,361,361,361,361,361,361,120,120,120,120,120,120,120,120,120, +361,361,361,361,361,361,361,120,361,361,361,361,361,361,361,120, +361,361,361,361,361,361,361,120,361,361,361,361,361,361,361,120, +361,361,361,361,361,361,361,120,361,361,361,361,361,361,361,120, +361,361,361,361,361,361,361,120,361,361,361,361,361,361,361,120, +557,557,557,557,557,557,557,557,557,557,557,557,557,557,557,557, +557,557,557,557,557,557,557,557,557,557,557,557,557,557,557,557, /* block 86 */ 5, 5, 23, 27, 23, 27, 5, 5, 5, 23, 27, 5, 23, 27, 5, 5, 5, 5, 5, 5, 5, 5, 5, 10, 5, 5, 10, 5, 23, 27, 5, 5, 23, 27, 7, 8, 7, 8, 7, 8, 7, 8, 5, 5, 5, 5, 5,111, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 10, 10, 5, 5, 5, 5, - 10, 5, 7,553, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 20, 20, 5,120,120,120,120,120,120,120,120,120,120,120,120,120, + 10, 5, 7,558, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 20, 20, 5, 5, 5, 7, 8, 7, 8, 7, 8, 7, 8, 10,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, /* block 87 */ -554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,554, -554,554,554,554,554,554,554,554,554,554,120,554,554,554,554,554, -554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,554, -554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,554, -554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,554, -554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,554, -554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,554, -554,554,554,554,120,120,120,120,120,120,120,120,120,120,120,120, +559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,559, +559,559,559,559,559,559,559,559,559,559,120,559,559,559,559,559, +559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,559, +559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,559, +559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,559, +559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,559, +559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,559, +559,559,559,559,120,120,120,120,120,120,120,120,120,120,120,120, /* block 88 */ -554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,554, -554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,554, -554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,554, -554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,554, -554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,554, -554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,554, -554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,554, -554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,554, +559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,559, +559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,559, +559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,559, +559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,559, +559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,559, +559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,559, +559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,559, +559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,559, /* block 89 */ -554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,554, -554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,554, -554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,554, -554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,554, -554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,554, -554,554,554,554,554,554,120,120,120,120,120,120,120,120,120,120, +559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,559, +559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,559, +559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,559, +559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,559, +559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,559, +559,559,559,559,559,559,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,120,120,120,120, /* block 90 */ - 4,555,555,556, 20,557,558,559,560,561,560,561,560,561,560,561, -560,561, 20,562,560,561,560,561,560,561,560,561,563,564,565,565, - 20,559,559,559,559,559,559,559,559,559,566,566,566,566,567,567, -568,569,569,569,569,569, 20,562,559,559,559,557,570,571,572,572, -120,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573, -573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573, -573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573, -573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573, + 4,560,560,561, 20,562,563,564,565,566,565,566,565,566,565,566, +565,566, 20,567,565,566,565,566,565,566,565,566,568,569,570,570, + 20,564,564,564,564,564,564,564,564,564,571,571,571,571,572,572, +573,574,574,574,574,574, 20,567,564,564,564,562,575,576,577,577, +120,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578, +578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578, +578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578, +578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578, /* block 91 */ -573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573, -573,573,573,573,573,573,573,120,120,574,574,575,575,576,576,573, -577,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578, 578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578, -578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578, -578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578, -578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578, -578,578,578,578,578,578,578,578,578,578,578,555,569,579,579,578, +578,578,578,578,578,578,578,120,120,579,579,580,580,581,581,578, +582,583,583,583,583,583,583,583,583,583,583,583,583,583,583,583, +583,583,583,583,583,583,583,583,583,583,583,583,583,583,583,583, +583,583,583,583,583,583,583,583,583,583,583,583,583,583,583,583, +583,583,583,583,583,583,583,583,583,583,583,583,583,583,583,583, +583,583,583,583,583,583,583,583,583,583,583,583,583,583,583,583, +583,583,583,583,583,583,583,583,583,583,583,560,574,584,584,583, /* block 92 */ -120,120,120,120,120,580,580,580,580,580,580,580,580,580,580,580, -580,580,580,580,580,580,580,580,580,580,580,580,580,580,580,580, -580,580,580,580,580,580,580,580,580,580,580,580,580,580,580,580, -120,581,581,581,581,581,581,581,581,581,581,581,581,581,581,581, -581,581,581,581,581,581,581,581,581,581,581,581,581,581,581,581, -581,581,581,581,581,581,581,581,581,581,581,581,581,581,581,581, -581,581,581,581,581,581,581,581,581,581,581,581,581,581,581,581, -581,581,581,581,581,581,581,581,581,581,581,581,581,581,581,581, +120,120,120,120,120,585,585,585,585,585,585,585,585,585,585,585, +585,585,585,585,585,585,585,585,585,585,585,585,585,585,585,585, +585,585,585,585,585,585,585,585,585,585,585,585,585,585,585,585, +120,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, +586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, +586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, +586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, +586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, /* block 93 */ -581,581,581,581,581,581,581,581,581,581,581,581,581,581,581,120, -572,572,582,582,582,582,572,572,572,572,572,572,572,572,572,572, -580,580,580,580,580,580,580,580,580,580,580,580,580,580,580,580, -580,580,580,580,580,580,580,580,580,580,580,580,580,580,580,580, -572,572,572,572,572,572,572,572,572,572,572,572,572,572,572,572, -572,572,572,572,572,572,572,572,572,572,572,572,572,572,572,572, -572,572,572,572,120,120,120,120,120,120,120,120,120,120,120,120, -578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578, +586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,120, +577,577,587,587,587,587,577,577,577,577,577,577,577,577,577,577, +585,585,585,585,585,585,585,585,585,585,585,585,585,585,585,585, +585,585,585,585,585,585,585,585,585,585,585,585,585,585,585,585, +577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, +577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, +577,577,577,577,120,120,120,120,120,120,120,120,120,120,120,120, +583,583,583,583,583,583,583,583,583,583,583,583,583,583,583,583, /* block 94 */ -583,583,583,583,583,583,583,583,583,583,583,583,583,583,583,583, -583,583,583,583,583,583,583,583,583,583,583,583,583,583,583,120, -582,582,582,582,582,582,582,582,582,582,572,572,572,572,572,572, -572,572,572,572,572,572,572,572,572,572,572,572,572,572,572,572, -572,572,572,572,572,572,572,572, 25, 25, 25, 25, 25, 25, 25, 25, +588,588,588,588,588,588,588,588,588,588,588,588,588,588,588,588, +588,588,588,588,588,588,588,588,588,588,588,588,588,588,588,120, +587,587,587,587,587,587,587,587,587,587,577,577,577,577,577,577, +577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, +577,577,577,577,577,577,577,577, 25, 25, 25, 25, 25, 25, 25, 25, 20, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, -583,583,583,583,583,583,583,583,583,583,583,583,583,583,583,583, -583,583,583,583,583,583,583,583,583,583,583,583,583,583,583, 20, +588,588,588,588,588,588,588,588,588,588,588,588,588,588,588,588, +588,588,588,588,588,588,588,588,588,588,588,588,588,588,588, 20, /* block 95 */ -582,582,582,582,582,582,582,582,582,582,572,572,572,572,572,572, -572,572,572,572,572,572,572,584,572,584,572,572,572,572,572,572, -572,572,572,572,572,572,572,572,572,572,572,572,572,572,572,572, -572, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, -572,572,572,572,572,572,572,572,572,572,572,572, 20, 20, 20, 20, -585,585,585,585,585,585,585,585,585,585,585,585,585,585,585,585, -585,585,585,585,585,585,585,585,585,585,585,585,585,585,585,585, -585,585,585,585,585,585,585,585,585,585,585,585,585,585,585,572, +587,587,587,587,587,587,587,587,587,587,577,577,577,577,577,577, +577,577,577,577,577,577,577,589,577,589,577,577,577,577,577,577, +577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, +577, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, +577,577,577,577,577,577,577,577,577,577,577,577, 20, 20, 20, 20, +590,590,590,590,590,590,590,590,590,590,590,590,590,590,590,590, +590,590,590,590,590,590,590,590,590,590,590,590,590,590,590,590, +590,590,590,590,590,590,590,590,590,590,590,590,590,590,590,577, /* block 96 */ -585,585,585,585,585,585,585,585,585,585,585,585,585,585,585,585, -585,585,585,585,585,585,585,585,585,585,585,585,585,585,585,585, -585,585,585,585,585,585,585,585,585,585,585,585,585,585,585,585, -585,585,585,585,585,585,585,585,585,585,585,585,585,585,585,585, -585,585,585,585,585,585,585,585,585,585,585,585,585,585,585,585, -585,585,585,585,585,585,585,585,572,572,572,572,572,572,572,572, -572,572,572,572,572,572,572,572,572,572,572,572,572,572,572,572, -572, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,572,572,572,572,572, +590,590,590,590,590,590,590,590,590,590,590,590,590,590,590,590, +590,590,590,590,590,590,590,590,590,590,590,590,590,590,590,590, +590,590,590,590,590,590,590,590,590,590,590,590,590,590,590,590, +590,590,590,590,590,590,590,590,590,590,590,590,590,590,590,590, +590,590,590,590,590,590,590,590,590,590,590,590,590,590,590,590, +590,590,590,590,590,590,590,590,577,577,577,577,577,577,577,577, +577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, +577, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,577,577,577,577,577, /* block 97 */ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, @@ -2695,1082 +2721,1082 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, -572,572,572,572,572,572,572,572,572,572,572,572,572,572,572,572, -572,572,572,572,572,572,572,572,572,572,572,572,572,572,572, 20, +577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, +577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, 20, /* block 98 */ -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, /* block 99 */ -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, /* block 100 */ -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,120,120,120, +592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,592, +592,592,592,592,592,593,592,592,592,592,592,592,592,592,592,592, +592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,592, +592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,592, +592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,592, +592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,592, +592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,592, +592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,592, /* block 101 */ -587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,587, -587,587,587,587,587,588,587,587,587,587,587,587,587,587,587,587, -587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,587, -587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,587, -587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,587, -587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,587, -587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,587, -587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,587, +592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,592, +592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,592, +592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,592, +592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,592, +592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,592, +592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,592, +592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,592, +592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,592, /* block 102 */ -587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,587, -587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,587, -587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,587, -587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,587, -587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,587, -587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,587, -587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,587, -587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,587, +592,592,592,592,592,592,592,592,592,592,592,592,592,120,120,120, +594,594,594,594,594,594,594,594,594,594,594,594,594,594,594,594, +594,594,594,594,594,594,594,594,594,594,594,594,594,594,594,594, +594,594,594,594,594,594,594,594,594,594,594,594,594,594,594,594, +594,594,594,594,594,594,594,120,120,120,120,120,120,120,120,120, +595,595,595,595,595,595,595,595,595,595,595,595,595,595,595,595, +595,595,595,595,595,595,595,595,595,595,595,595,595,595,595,595, +595,595,595,595,595,595,595,595,596,596,596,596,596,596,597,597, /* block 103 */ -587,587,587,587,587,587,587,587,587,587,587,587,587,120,120,120, -589,589,589,589,589,589,589,589,589,589,589,589,589,589,589,589, -589,589,589,589,589,589,589,589,589,589,589,589,589,589,589,589, -589,589,589,589,589,589,589,589,589,589,589,589,589,589,589,589, -589,589,589,589,589,589,589,120,120,120,120,120,120,120,120,120, -590,590,590,590,590,590,590,590,590,590,590,590,590,590,590,590, -590,590,590,590,590,590,590,590,590,590,590,590,590,590,590,590, -590,590,590,590,590,590,590,590,591,591,591,591,591,591,592,592, +598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598, +598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598, +598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598, +598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598, +598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598, +598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598, +598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598, +598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598, /* block 104 */ -593,593,593,593,593,593,593,593,593,593,593,593,593,593,593,593, -593,593,593,593,593,593,593,593,593,593,593,593,593,593,593,593, -593,593,593,593,593,593,593,593,593,593,593,593,593,593,593,593, -593,593,593,593,593,593,593,593,593,593,593,593,593,593,593,593, -593,593,593,593,593,593,593,593,593,593,593,593,593,593,593,593, -593,593,593,593,593,593,593,593,593,593,593,593,593,593,593,593, -593,593,593,593,593,593,593,593,593,593,593,593,593,593,593,593, -593,593,593,593,593,593,593,593,593,593,593,593,593,593,593,593, +598,598,598,598,598,598,598,598,598,598,598,598,599,600,600,600, +598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598, +601,601,601,601,601,601,601,601,601,601,598,598,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +192,193,192,193,192,193,192,193,192,193,602,603,192,193,192,193, +192,193,192,193,192,193,192,193,192,193,192,193,192,193,192,193, +192,193,192,193,192,193,192,193,192,193,192,193,192,193,604,198, +200,200,200,605,557,557,557,557,557,557,557,557,557,557,605,482, /* block 105 */ -593,593,593,593,593,593,593,593,593,593,593,593,594,595,595,595, -593,593,593,593,593,593,593,593,593,593,593,593,593,593,593,593, -596,596,596,596,596,596,596,596,596,596,593,593,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -192,193,192,193,192,193,192,193,192,193,597,598,192,193,192,193, 192,193,192,193,192,193,192,193,192,193,192,193,192,193,192,193, -192,193,192,193,192,193,192,193,192,193,192,193,192,193,599,198, -200,200,200,600,552,552,552,552,552,552,552,552,552,552,600,478, +192,193,192,193,192,193,192,193,192,193,192,193,482,482,557,557, +606,606,606,606,606,606,606,606,606,606,606,606,606,606,606,606, +606,606,606,606,606,606,606,606,606,606,606,606,606,606,606,606, +606,606,606,606,606,606,606,606,606,606,606,606,606,606,606,606, +606,606,606,606,606,606,606,606,606,606,606,606,606,606,606,606, +606,606,606,606,606,606,607,607,607,607,607,607,607,607,607,607, +608,608,609,609,609,609,609,609,120,120,120,120,120,120,120,120, /* block 106 */ -192,193,192,193,192,193,192,193,192,193,192,193,192,193,192,193, -192,193,192,193,192,193,192,193,192,193,192,193,478,478,552,552, -601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,601, -601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,601, -601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,601, -601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,601, -601,601,601,601,601,601,602,602,602,602,602,602,602,602,602,602, -603,603,604,604,604,604,604,604,120,120,120,120,120,120,120,120, - -/* block 107 */ -605,605,605,605,605,605,605,605, 15, 15, 15, 15, 15, 15, 15, 15, +610,610,610,610,610,610,610,610, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,111,111,111,111,111,111,111,111,111, 15, 15, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 35, 35, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, -110, 35, 35, 35, 35, 35, 35, 35, 35, 32, 33, 32, 33,606, 32, 33, +110, 35, 35, 35, 35, 35, 35, 35, 35, 32, 33, 32, 33,611, 32, 33, + +/* block 107 */ + 32, 33, 32, 33, 32, 33, 32, 33,111, 15, 15, 32, 33,612, 35, 22, + 32, 33, 32, 33,613, 35, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, + 32, 33, 32, 33, 32, 33, 32, 33, 32, 33,614,615,616,617,614, 35, +618,619,620,621, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, + 32, 33, 32, 33,622,623,624, 32, 33, 32, 33,120,120,120,120,120, + 32, 33,120, 35,120, 35, 32, 33, 32, 33,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,110,110,110, 32, 33, 22,110,110, 35, 22, 22, 22, 22, 22, /* block 108 */ - 32, 33, 32, 33, 32, 33, 32, 33,111, 15, 15, 32, 33,607, 35, 22, - 32, 33, 32, 33,608, 35, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, - 32, 33, 32, 33, 32, 33, 32, 33, 32, 33,609,610,611,612,609, 35, -613,614,615,616, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, -120,120, 32, 33,617,618,619, 32, 33, 32, 33,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120, 32, 33, 22,110,110, 35, 22, 22, 22, 22, 22, +625,625,626,625,625,625,626,625,625,625,625,626,625,625,625,625, +625,625,625,625,625,625,625,625,625,625,625,625,625,625,625,625, +625,625,625,627,627,626,626,627,628,628,628,628,626,120,120,120, +629,629,629,630,630,630,631,631,632,631,120,120,120,120,120,120, +633,633,633,633,633,633,633,633,633,633,633,633,633,633,633,633, +633,633,633,633,633,633,633,633,633,633,633,633,633,633,633,633, +633,633,633,633,633,633,633,633,633,633,633,633,633,633,633,633, +633,633,633,633,634,634,634,634,120,120,120,120,120,120,120,120, /* block 109 */ -620,620,621,620,620,620,621,620,620,620,620,621,620,620,620,620, -620,620,620,620,620,620,620,620,620,620,620,620,620,620,620,620, -620,620,620,622,622,621,621,622,623,623,623,623,621,120,120,120, -624,624,624,625,625,625,626,626,627,626,120,120,120,120,120,120, -628,628,628,628,628,628,628,628,628,628,628,628,628,628,628,628, -628,628,628,628,628,628,628,628,628,628,628,628,628,628,628,628, -628,628,628,628,628,628,628,628,628,628,628,628,628,628,628,628, -628,628,628,628,629,629,629,629,120,120,120,120,120,120,120,120, +635,635,636,636,636,636,636,636,636,636,636,636,636,636,636,636, +636,636,636,636,636,636,636,636,636,636,636,636,636,636,636,636, +636,636,636,636,636,636,636,636,636,636,636,636,636,636,636,636, +636,636,636,636,635,635,635,635,635,635,635,635,635,635,635,635, +635,635,635,635,637,637,120,120,120,120,120,120,120,120,638,638, +639,639,639,639,639,639,639,639,639,639,120,120,120,120,120,120, +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, +253,640,255,641,255,255,255,255,261,261,261,255,261,255,255,253, /* block 110 */ -630,630,631,631,631,631,631,631,631,631,631,631,631,631,631,631, -631,631,631,631,631,631,631,631,631,631,631,631,631,631,631,631, -631,631,631,631,631,631,631,631,631,631,631,631,631,631,631,631, -631,631,631,631,630,630,630,630,630,630,630,630,630,630,630,630, -630,630,630,630,632,632,120,120,120,120,120,120,120,120,633,633, -634,634,634,634,634,634,634,634,634,634,120,120,120,120,120,120, -251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251, -251,635,253,636,253,253,253,253,259,259,259,253,259,253,253,251, +642,642,642,642,642,642,642,642,642,642,643,643,643,643,643,643, +643,643,643,643,643,643,643,643,643,643,643,643,643,643,643,643, +643,643,643,643,643,643,644,644,644,644,644,644,644,644,645,646, +647,647,647,647,647,647,647,647,647,647,647,647,647,647,647,647, +647,647,647,647,647,647,647,648,648,648,648,648,648,648,648,648, +648,648,649,649,120,120,120,120,120,120,120,120,120,120,120,650, +358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,358, +358,358,358,358,358,358,358,358,358,358,358,358,358,120,120,120, /* block 111 */ -637,637,637,637,637,637,637,637,637,637,638,638,638,638,638,638, -638,638,638,638,638,638,638,638,638,638,638,638,638,638,638,638, -638,638,638,638,638,638,639,639,639,639,639,639,639,639,640,641, -642,642,642,642,642,642,642,642,642,642,642,642,642,642,642,642, -642,642,642,642,642,642,642,643,643,643,643,643,643,643,643,643, -643,643,644,644,120,120,120,120,120,120,120,120,120,120,120,645, -356,356,356,356,356,356,356,356,356,356,356,356,356,356,356,356, -356,356,356,356,356,356,356,356,356,356,356,356,356,120,120,120, +651,651,651,652,653,653,653,653,653,653,653,653,653,653,653,653, +653,653,653,653,653,653,653,653,653,653,653,653,653,653,653,653, +653,653,653,653,653,653,653,653,653,653,653,653,653,653,653,653, +653,653,653,651,652,652,651,651,651,651,652,652,651,651,652,652, +652,654,654,654,654,654,654,654,654,654,654,654,654,654,120,655, +656,656,656,656,656,656,656,656,656,656,120,120,120,120,654,654, +346,346,346,346,346,348,657,346,346,346,346,346,346,346,346,346, +352,352,352,352,352,352,352,352,352,352,346,346,346,346,346,120, /* block 112 */ -646,646,646,647,648,648,648,648,648,648,648,648,648,648,648,648, -648,648,648,648,648,648,648,648,648,648,648,648,648,648,648,648, -648,648,648,648,648,648,648,648,648,648,648,648,648,648,648,648, -648,648,648,646,647,647,646,646,646,646,647,647,646,646,647,647, -647,649,649,649,649,649,649,649,649,649,649,649,649,649,120,650, -651,651,651,651,651,651,651,651,651,651,120,120,120,120,649,649, -344,344,344,344,344,346,652,344,344,344,344,344,344,344,344,344, -350,350,350,350,350,350,350,350,350,350,344,344,344,344,344,120, +658,658,658,658,658,658,658,658,658,658,658,658,658,658,658,658, +658,658,658,658,658,658,658,658,658,658,658,658,658,658,658,658, +658,658,658,658,658,658,658,658,658,659,659,659,659,659,659,660, +660,659,659,660,660,659,659,120,120,120,120,120,120,120,120,120, +658,658,658,659,658,658,658,658,658,658,658,658,659,660,120,120, +661,661,661,661,661,661,661,661,661,661,120,120,662,662,662,662, +346,346,346,346,346,346,346,346,346,346,346,346,346,346,346,346, +657,346,346,346,346,346,346,353,353,353,346,347,348,347,346,346, /* block 113 */ -653,653,653,653,653,653,653,653,653,653,653,653,653,653,653,653, -653,653,653,653,653,653,653,653,653,653,653,653,653,653,653,653, -653,653,653,653,653,653,653,653,653,654,654,654,654,654,654,655, -655,654,654,655,655,654,654,120,120,120,120,120,120,120,120,120, -653,653,653,654,653,653,653,653,653,653,653,653,654,655,120,120, -656,656,656,656,656,656,656,656,656,656,120,120,657,657,657,657, -344,344,344,344,344,344,344,344,344,344,344,344,344,344,344,344, -652,344,344,344,344,344,344,351,351,351,344,345,346,345,344,344, +663,663,663,663,663,663,663,663,663,663,663,663,663,663,663,663, +663,663,663,663,663,663,663,663,663,663,663,663,663,663,663,663, +663,663,663,663,663,663,663,663,663,663,663,663,663,663,663,663, +664,663,664,664,664,663,663,664,664,663,663,663,663,663,664,664, +663,664,663,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,663,663,665,666,666, +667,667,667,667,667,667,667,667,667,667,667,668,669,669,668,668, +670,670,667,671,671,668,669,120,120,120,120,120,120,120,120,120, /* block 114 */ -658,658,658,658,658,658,658,658,658,658,658,658,658,658,658,658, -658,658,658,658,658,658,658,658,658,658,658,658,658,658,658,658, -658,658,658,658,658,658,658,658,658,658,658,658,658,658,658,658, -659,658,659,659,659,658,658,659,659,658,658,658,658,658,659,659, -658,659,658,120,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,658,658,660,661,661, -662,662,662,662,662,662,662,662,662,662,662,663,664,664,663,663, -665,665,662,666,666,663,664,120,120,120,120,120,120,120,120,120, +120,361,361,361,361,361,361,120,120,361,361,361,361,361,361,120, +120,361,361,361,361,361,361,120,120,120,120,120,120,120,120,120, +361,361,361,361,361,361,361,120,361,361,361,361,361,361,361,120, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35,672, 35, 35, 35, 35, 35, 35, 35, 15,110,110,110,110, + 35, 35, 35, 35, 35,128, 35, 35, 35,110, 15, 15,120,120,120,120, +673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673, /* block 115 */ -120,359,359,359,359,359,359,120,120,359,359,359,359,359,359,120, -120,359,359,359,359,359,359,120,120,120,120,120,120,120,120,120, -359,359,359,359,359,359,359,120,359,359,359,359,359,359,359,120, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35,667, 35, 35, 35, 35, 35, 35, 35, 15,110,110,110,110, - 35, 35, 35, 35, 35,128, 35, 35, 35,110, 15, 15,120,120,120,120, -668,668,668,668,668,668,668,668,668,668,668,668,668,668,668,668, +673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673, +673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673, +673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673, +673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673, +667,667,667,667,667,667,667,667,667,667,667,667,667,667,667,667, +667,667,667,667,667,667,667,667,667,667,667,667,667,667,667,667, +667,667,667,668,668,669,668,668,669,668,668,670,668,669,120,120, +674,674,674,674,674,674,674,674,674,674,120,120,120,120,120,120, /* block 116 */ -668,668,668,668,668,668,668,668,668,668,668,668,668,668,668,668, -668,668,668,668,668,668,668,668,668,668,668,668,668,668,668,668, -668,668,668,668,668,668,668,668,668,668,668,668,668,668,668,668, -668,668,668,668,668,668,668,668,668,668,668,668,668,668,668,668, -662,662,662,662,662,662,662,662,662,662,662,662,662,662,662,662, -662,662,662,662,662,662,662,662,662,662,662,662,662,662,662,662, -662,662,662,663,663,664,663,663,664,663,663,665,663,664,120,120, -669,669,669,669,669,669,669,669,669,669,120,120,120,120,120,120, +675,676,676,676,676,676,676,676,676,676,676,676,676,676,676,676, +676,676,676,676,676,676,676,676,676,676,676,676,675,676,676,676, +676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,676, +676,676,676,676,676,676,676,676,675,676,676,676,676,676,676,676, +676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,676, +676,676,676,676,675,676,676,676,676,676,676,676,676,676,676,676, +676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,676, +675,676,676,676,676,676,676,676,676,676,676,676,676,676,676,676, /* block 117 */ -670,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671, -671,671,671,671,671,671,671,671,671,671,671,671,670,671,671,671, -671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671, -671,671,671,671,671,671,671,671,670,671,671,671,671,671,671,671, -671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671, -671,671,671,671,670,671,671,671,671,671,671,671,671,671,671,671, -671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671, -670,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671, +676,676,676,676,676,676,676,676,676,676,676,676,675,676,676,676, +676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,676, +676,676,676,676,676,676,676,676,675,676,676,676,676,676,676,676, +676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,676, +676,676,676,676,675,676,676,676,676,676,676,676,676,676,676,676, +676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,676, +675,676,676,676,676,676,676,676,676,676,676,676,676,676,676,676, +676,676,676,676,676,676,676,676,676,676,676,676,675,676,676,676, /* block 118 */ -671,671,671,671,671,671,671,671,671,671,671,671,670,671,671,671, -671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671, -671,671,671,671,671,671,671,671,670,671,671,671,671,671,671,671, -671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671, -671,671,671,671,670,671,671,671,671,671,671,671,671,671,671,671, -671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671, -670,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671, -671,671,671,671,671,671,671,671,671,671,671,671,670,671,671,671, +676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,676, +676,676,676,676,676,676,676,676,675,676,676,676,676,676,676,676, +676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,676, +676,676,676,676,675,676,676,676,676,676,676,676,676,676,676,676, +676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,676, +675,676,676,676,676,676,676,676,676,676,676,676,676,676,676,676, +676,676,676,676,676,676,676,676,676,676,676,676,675,676,676,676, +676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,676, /* block 119 */ -671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671, -671,671,671,671,671,671,671,671,670,671,671,671,671,671,671,671, -671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671, -671,671,671,671,670,671,671,671,671,671,671,671,671,671,671,671, -671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671, -670,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671, -671,671,671,671,671,671,671,671,671,671,671,671,670,671,671,671, -671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671, +676,676,676,676,676,676,676,676,675,676,676,676,676,676,676,676, +676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,676, +676,676,676,676,675,676,676,676,676,676,676,676,676,676,676,676, +676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,676, +675,676,676,676,676,676,676,676,676,676,676,676,676,676,676,676, +676,676,676,676,676,676,676,676,676,676,676,676,675,676,676,676, +676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,676, +676,676,676,676,676,676,676,676,675,676,676,676,676,676,676,676, /* block 120 */ -671,671,671,671,671,671,671,671,670,671,671,671,671,671,671,671, -671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671, -671,671,671,671,670,671,671,671,671,671,671,671,671,671,671,671, -671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671, -670,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671, -671,671,671,671,671,671,671,671,671,671,671,671,670,671,671,671, -671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671, -671,671,671,671,671,671,671,671,670,671,671,671,671,671,671,671, +676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,676, +676,676,676,676,675,676,676,676,676,676,676,676,676,676,676,676, +676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,676, +675,676,676,676,676,676,676,676,676,676,676,676,676,676,676,676, +676,676,676,676,676,676,676,676,676,676,676,676,675,676,676,676, +676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,676, +676,676,676,676,676,676,676,676,675,676,676,676,676,676,676,676, +676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,676, /* block 121 */ -671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671, -671,671,671,671,670,671,671,671,671,671,671,671,671,671,671,671, -671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671, -670,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671, -671,671,671,671,671,671,671,671,671,671,671,671,670,671,671,671, -671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671, -671,671,671,671,671,671,671,671,670,671,671,671,671,671,671,671, -671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671, +676,676,676,676,675,676,676,676,676,676,676,676,676,676,676,676, +676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,676, +675,676,676,676,676,676,676,676,676,676,676,676,676,676,676,676, +676,676,676,676,676,676,676,676,676,676,676,676,675,676,676,676, +676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,676, +676,676,676,676,676,676,676,676,675,676,676,676,676,676,676,676, +676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,676, +676,676,676,676,675,676,676,676,676,676,676,676,676,676,676,676, /* block 122 */ -671,671,671,671,670,671,671,671,671,671,671,671,671,671,671,671, -671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671, -670,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671, -671,671,671,671,671,671,671,671,671,671,671,671,670,671,671,671, -671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671, -671,671,671,671,671,671,671,671,670,671,671,671,671,671,671,671, -671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671, -671,671,671,671,670,671,671,671,671,671,671,671,671,671,671,671, +676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,676, +675,676,676,676,676,676,676,676,676,676,676,676,676,676,676,676, +676,676,676,676,676,676,676,676,676,676,676,676,675,676,676,676, +676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,676, +676,676,676,676,676,676,676,676,675,676,676,676,676,676,676,676, +676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,676, +676,676,676,676,675,676,676,676,676,676,676,676,676,676,676,676, +676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,676, /* block 123 */ -671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671, -670,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671, -671,671,671,671,671,671,671,671,671,671,671,671,670,671,671,671, -671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671, -671,671,671,671,671,671,671,671,670,671,671,671,671,671,671,671, -671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671, -671,671,671,671,670,671,671,671,671,671,671,671,671,671,671,671, -671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671, +676,676,676,676,676,676,676,676,675,676,676,676,676,676,676,676, +676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,676, +676,676,676,676,120,120,120,120,120,120,120,120,120,120,120,120, +359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,359, +359,359,359,359,359,359,359,120,120,120,120,360,360,360,360,360, +360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360, +360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360, +360,360,360,360,360,360,360,360,360,360,360,360,120,120,120,120, /* block 124 */ -671,671,671,671,671,671,671,671,670,671,671,671,671,671,671,671, -671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671, -671,671,671,671,120,120,120,120,120,120,120,120,120,120,120,120, -357,357,357,357,357,357,357,357,357,357,357,357,357,357,357,357, -357,357,357,357,357,357,357,120,120,120,120,358,358,358,358,358, -358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,358, -358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,358, -358,358,358,358,358,358,358,358,358,358,358,358,120,120,120,120, +677,677,677,677,677,677,677,677,677,677,677,677,677,677,677,677, +677,677,677,677,677,677,677,677,677,677,677,677,677,677,677,677, +677,677,677,677,677,677,677,677,677,677,677,677,677,677,677,677, +677,677,677,677,677,677,677,677,677,677,677,677,677,677,677,677, +677,677,677,677,677,677,677,677,677,677,677,677,677,677,677,677, +677,677,677,677,677,677,677,677,677,677,677,677,677,677,677,677, +677,677,677,677,677,677,677,677,677,677,677,677,677,677,677,677, +677,677,677,677,677,677,677,677,677,677,677,677,677,677,677,677, /* block 125 */ -672,672,672,672,672,672,672,672,672,672,672,672,672,672,672,672, -672,672,672,672,672,672,672,672,672,672,672,672,672,672,672,672, -672,672,672,672,672,672,672,672,672,672,672,672,672,672,672,672, -672,672,672,672,672,672,672,672,672,672,672,672,672,672,672,672, -672,672,672,672,672,672,672,672,672,672,672,672,672,672,672,672, -672,672,672,672,672,672,672,672,672,672,672,672,672,672,672,672, -672,672,672,672,672,672,672,672,672,672,672,672,672,672,672,672, -672,672,672,672,672,672,672,672,672,672,672,672,672,672,672,672, +678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678, +678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678, +678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678, +678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678, +678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678, +678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678, +678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678, +678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678, /* block 126 */ -673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673, -673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673, -673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673, -673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673, -673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673, -673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673, -673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673, -673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,120,120, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, /* block 127 */ -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,120,120, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, +591,591,591,591,591,591,591,591,591,591,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, /* block 128 */ -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, - -/* block 129 */ 35, 35, 35, 35, 35, 35, 35,120,120,120,120,120,120,120,120,120, 120,120,120,206,206,206,206,206,120,120,120,120,120,214,211,214, -214,214,214,214,214,214,214,214,214,674,214,214,214,214,214,214, +214,214,214,214,214,214,214,214,214,679,214,214,214,214,214,214, 214,214,214,214,214,214,214,120,214,214,214,214,214,120,214,120, 214,214,120,214,214,120,214,214,214,214,214,214,214,214,214,214, -224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, -224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, -224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, + +/* block 129 */ +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,252,252,252,252,252,252,252,252,252,252,252,252,252,252, +252,252,252,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, /* block 130 */ -224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, -224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, -224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, -224,224,675,675,675,675,675,675,675,675,675,675,675,675,675,675, -675,675,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,224,224,224,224,224,224,224,224,224,224,224,224,224, -224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, -224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, /* block 131 */ -224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, -224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, -224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, -224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, -224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, -224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, -224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, -224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,680,681, +221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, /* block 132 */ -224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, -224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, -224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, -224,224,224,224,224,224,224,224,224,224,224,224,224,224, 8, 7, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +120,120,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,120,120,120,120,120,120,120,221, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, -224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, -224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +225,225,682,225,225,225,225,225,225,225,225,225,219,683,221,221, /* block 133 */ -224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, -120,120,224,224,224,224,224,224,224,224,224,224,224,224,224,224, -224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, -224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, -224,224,224,224,224,224,224,224,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -224,224,676,224,224,224,224,224,224,224,224,224,219,677,120,120, - -/* block 134 */ 113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113, 5, 5, 5, 5, 5, 5, 5, 7, 8, 5,120,120,120,120,120,120, -113,113,113,113,113,113,113,113,113,113,113,113,113,113,552,552, +113,113,113,113,113,113,113,113,113,113,113,113,113,113,557,557, 5, 10, 10, 16, 16, 7, 8, 7, 8, 7, 8, 7, 8, 7, 8, 7, - 8, 7, 8, 7, 8,556,556, 7, 8, 5, 5, 5, 5, 16, 16, 16, + 8, 7, 8, 7, 8,561,561, 7, 8, 5, 5, 5, 5, 16, 16, 16, 5, 5, 5,120, 5, 5, 5, 5, 10, 7, 8, 7, 8, 7, 8, 5, 5, 5, 9, 10, 9, 9, 9,120, 5, 6, 5, 5,120,120,120,120, -224,224,224,224,224,120,224,224,224,224,224,224,224,224,224,224, +225,225,225,225,225,120,225,225,225,225,225,225,225,225,225,225, + +/* block 134 */ +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,225,120,120, 24, /* block 135 */ -224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, -224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, -224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, -224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, -224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, -224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, -224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, -224,224,224,224,224,224,224,224,224,224,224,224,224,120,120, 24, - -/* block 136 */ 120, 5, 5, 5, 6, 5, 5, 5, 7, 8, 5, 9, 5, 10, 5, 5, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 5, 5, 9, 9, 9, 5, 5, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 7, 5, 8, 15, 16, 15, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 7, 9, 8, 9, 7, - 8,555,560,561,555,555,578,578,578,578,578,578,578,578,578,578, -569,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578, + 8,560,565,566,560,560,583,583,583,583,583,583,583,583,583,583, +574,583,583,583,583,583,583,583,583,583,583,583,583,583,583,583, + +/* block 136 */ +583,583,583,583,583,583,583,583,583,583,583,583,583,583,583,583, +583,583,583,583,583,583,583,583,583,583,583,583,583,583,684,684, +586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, +586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,120, +120,120,586,586,586,586,586,586,120,120,586,586,586,586,586,586, +120,120,586,586,586,586,586,586,120,120,586,586,586,120,120,120, + 6, 6, 9, 15, 20, 6, 6,120, 20, 9, 9, 9, 9, 20, 20,120, +516,516,516,516,516,516,516,516,516, 24, 24, 24, 20, 20,120,120, /* block 137 */ -578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578, -578,578,578,578,578,578,578,578,578,578,578,578,578,578,678,678, -581,581,581,581,581,581,581,581,581,581,581,581,581,581,581,581, -581,581,581,581,581,581,581,581,581,581,581,581,581,581,581,120, -120,120,581,581,581,581,581,581,120,120,581,581,581,581,581,581, -120,120,581,581,581,581,581,581,120,120,581,581,581,120,120,120, - 6, 6, 9, 15, 20, 6, 6,120, 20, 9, 9, 9, 9, 20, 20,120, -511,511,511,511,511,511,511,511,511, 24, 24, 24, 20, 20,120,120, +685,685,685,685,685,685,685,685,685,685,685,685,120,685,685,685, +685,685,685,685,685,685,685,685,685,685,685,685,685,685,685,685, +685,685,685,685,685,685,685,120,685,685,685,685,685,685,685,685, +685,685,685,685,685,685,685,685,685,685,685,120,685,685,120,685, +685,685,685,685,685,685,685,685,685,685,685,685,685,685,120,120, +685,685,685,685,685,685,685,685,685,685,685,685,685,685,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, /* block 138 */ -679,679,679,679,679,679,679,679,679,679,679,679,120,679,679,679, -679,679,679,679,679,679,679,679,679,679,679,679,679,679,679,679, -679,679,679,679,679,679,679,120,679,679,679,679,679,679,679,679, -679,679,679,679,679,679,679,679,679,679,679,120,679,679,120,679, -679,679,679,679,679,679,679,679,679,679,679,679,679,679,120,120, -679,679,679,679,679,679,679,679,679,679,679,679,679,679,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +685,685,685,685,685,685,685,685,685,685,685,685,685,685,685,685, +685,685,685,685,685,685,685,685,685,685,685,685,685,685,685,685, +685,685,685,685,685,685,685,685,685,685,685,685,685,685,685,685, +685,685,685,685,685,685,685,685,685,685,685,685,685,685,685,685, +685,685,685,685,685,685,685,685,685,685,685,685,685,685,685,685, +685,685,685,685,685,685,685,685,685,685,685,685,685,685,685,685, +685,685,685,685,685,685,685,685,685,685,685,685,685,685,685,685, +685,685,685,685,685,685,685,685,685,685,685,120,120,120,120,120, /* block 139 */ -679,679,679,679,679,679,679,679,679,679,679,679,679,679,679,679, -679,679,679,679,679,679,679,679,679,679,679,679,679,679,679,679, -679,679,679,679,679,679,679,679,679,679,679,679,679,679,679,679, -679,679,679,679,679,679,679,679,679,679,679,679,679,679,679,679, -679,679,679,679,679,679,679,679,679,679,679,679,679,679,679,679, -679,679,679,679,679,679,679,679,679,679,679,679,679,679,679,679, -679,679,679,679,679,679,679,679,679,679,679,679,679,679,679,679, -679,679,679,679,679,679,679,679,679,679,679,120,120,120,120,120, +686,686,687,120,120,120,120,688,688,688,688,688,688,688,688,688, +688,688,688,688,688,688,688,688,688,688,688,688,688,688,688,688, +688,688,688,688,688,688,688,688,688,688,688,688,688,688,688,688, +688,688,688,688,120,120,120,689,689,689,689,689,689,689,689,689, +690,690,690,690,690,690,690,690,690,690,690,690,690,690,690,690, +690,690,690,690,690,690,690,690,690,690,690,690,690,690,690,690, +690,690,690,690,690,690,690,690,690,690,690,690,690,690,690,690, +690,690,690,690,690,691,691,691,691,692,692,692,692,692,692,692, /* block 140 */ -680,680,680,120,120,120,120,681,681,681,681,681,681,681,681,681, -681,681,681,681,681,681,681,681,681,681,681,681,681,681,681,681, -681,681,681,681,681,681,681,681,681,681,681,681,681,681,681,681, -681,681,681,681,120,120,120,682,682,682,682,682,682,682,682,682, -683,683,683,683,683,683,683,683,683,683,683,683,683,683,683,683, -683,683,683,683,683,683,683,683,683,683,683,683,683,683,683,683, -683,683,683,683,683,683,683,683,683,683,683,683,683,683,683,683, -683,683,683,683,683,684,684,684,684,685,685,685,685,685,685,685, - -/* block 141 */ -685,685,685,685,685,685,685,685,685,685,684,684,685,685,685,120, +692,692,692,692,692,692,692,692,692,692,691,691,692,692,692,120, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,120,120,120, -685,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +692,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,113,120,120, +/* block 141 */ +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, + /* block 142 */ -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +693,693,693,693,693,693,693,693,693,693,693,693,693,693,693,693, +693,693,693,693,693,693,693,693,693,693,693,693,693,120,120,120, +694,694,694,694,694,694,694,694,694,694,694,694,694,694,694,694, +694,694,694,694,694,694,694,694,694,694,694,694,694,694,694,694, +694,694,694,694,694,694,694,694,694,694,694,694,694,694,694,694, +694,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +695,696,696,696,696,696,696,696,696,696,696,696,696,696,696,696, +696,696,696,696,696,696,696,696,696,696,696,696,120,120,120,120, /* block 143 */ -686,686,686,686,686,686,686,686,686,686,686,686,686,686,686,686, -686,686,686,686,686,686,686,686,686,686,686,686,686,120,120,120, -687,687,687,687,687,687,687,687,687,687,687,687,687,687,687,687, -687,687,687,687,687,687,687,687,687,687,687,687,687,687,687,687, -687,687,687,687,687,687,687,687,687,687,687,687,687,687,687,687, -687,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -688,689,689,689,689,689,689,689,689,689,689,689,689,689,689,689, -689,689,689,689,689,689,689,689,689,689,689,689,120,120,120,120, +697,697,697,697,697,697,697,697,697,697,697,697,697,697,697,697, +697,697,697,697,697,697,697,697,697,697,697,697,697,697,697,697, +698,698,698,698,120,120,120,120,120,120,120,120,120,697,697,697, +699,699,699,699,699,699,699,699,699,699,699,699,699,699,699,699, +699,700,699,699,699,699,699,699,699,699,700,120,120,120,120,120, +701,701,701,701,701,701,701,701,701,701,701,701,701,701,701,701, +701,701,701,701,701,701,701,701,701,701,701,701,701,701,701,701, +701,701,701,701,701,701,702,702,702,702,702,120,120,120,120,120, /* block 144 */ -690,690,690,690,690,690,690,690,690,690,690,690,690,690,690,690, -690,690,690,690,690,690,690,690,690,690,690,690,690,690,690,690, -691,691,691,691,120,120,120,120,120,120,120,120,120,690,690,690, -692,692,692,692,692,692,692,692,692,692,692,692,692,692,692,692, -692,693,692,692,692,692,692,692,692,692,693,120,120,120,120,120, -694,694,694,694,694,694,694,694,694,694,694,694,694,694,694,694, -694,694,694,694,694,694,694,694,694,694,694,694,694,694,694,694, -694,694,694,694,694,694,695,695,695,695,695,120,120,120,120,120, +703,703,703,703,703,703,703,703,703,703,703,703,703,703,703,703, +703,703,703,703,703,703,703,703,703,703,703,703,703,703,120,704, +705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,705, +705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,705, +705,705,705,705,120,120,120,120,705,705,705,705,705,705,705,705, +706,707,707,707,707,707,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, /* block 145 */ -696,696,696,696,696,696,696,696,696,696,696,696,696,696,696,696, -696,696,696,696,696,696,696,696,696,696,696,696,696,696,120,697, -698,698,698,698,698,698,698,698,698,698,698,698,698,698,698,698, -698,698,698,698,698,698,698,698,698,698,698,698,698,698,698,698, -698,698,698,698,120,120,120,120,698,698,698,698,698,698,698,698, -699,700,700,700,700,700,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708, +708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708, +708,708,708,708,708,708,708,708,709,709,709,709,709,709,709,709, +709,709,709,709,709,709,709,709,709,709,709,709,709,709,709,709, +709,709,709,709,709,709,709,709,709,709,709,709,709,709,709,709, +710,710,710,710,710,710,710,710,710,710,710,710,710,710,710,710, +710,710,710,710,710,710,710,710,710,710,710,710,710,710,710,710, +710,710,710,710,710,710,710,710,710,710,710,710,710,710,710,710, /* block 146 */ -701,701,701,701,701,701,701,701,701,701,701,701,701,701,701,701, -701,701,701,701,701,701,701,701,701,701,701,701,701,701,701,701, -701,701,701,701,701,701,701,701,702,702,702,702,702,702,702,702, -702,702,702,702,702,702,702,702,702,702,702,702,702,702,702,702, -702,702,702,702,702,702,702,702,702,702,702,702,702,702,702,702, -703,703,703,703,703,703,703,703,703,703,703,703,703,703,703,703, -703,703,703,703,703,703,703,703,703,703,703,703,703,703,703,703, -703,703,703,703,703,703,703,703,703,703,703,703,703,703,703,703, +711,711,711,711,711,711,711,711,711,711,711,711,711,711,711,711, +711,711,711,711,711,711,711,711,711,711,711,711,711,711,120,120, +712,712,712,712,712,712,712,712,712,712,120,120,120,120,120,120, +713,713,713,713,713,713,713,713,713,713,713,713,713,713,713,713, +713,713,713,713,713,713,713,713,713,713,713,713,713,713,713,713, +713,713,713,713,120,120,120,120,714,714,714,714,714,714,714,714, +714,714,714,714,714,714,714,714,714,714,714,714,714,714,714,714, +714,714,714,714,714,714,714,714,714,714,714,714,120,120,120,120, /* block 147 */ -704,704,704,704,704,704,704,704,704,704,704,704,704,704,704,704, -704,704,704,704,704,704,704,704,704,704,704,704,704,704,120,120, -705,705,705,705,705,705,705,705,705,705,120,120,120,120,120,120, -706,706,706,706,706,706,706,706,706,706,706,706,706,706,706,706, -706,706,706,706,706,706,706,706,706,706,706,706,706,706,706,706, -706,706,706,706,120,120,120,120,707,707,707,707,707,707,707,707, -707,707,707,707,707,707,707,707,707,707,707,707,707,707,707,707, -707,707,707,707,707,707,707,707,707,707,707,707,120,120,120,120, +715,715,715,715,715,715,715,715,715,715,715,715,715,715,715,715, +715,715,715,715,715,715,715,715,715,715,715,715,715,715,715,715, +715,715,715,715,715,715,715,715,120,120,120,120,120,120,120,120, +716,716,716,716,716,716,716,716,716,716,716,716,716,716,716,716, +716,716,716,716,716,716,716,716,716,716,716,716,716,716,716,716, +716,716,716,716,716,716,716,716,716,716,716,716,716,716,716,716, +716,716,716,716,120,120,120,120,120,120,120,120,120,120,120,717, +718,718,718,718,718,718,718,718,718,718,718,120,718,718,718,718, /* block 148 */ -708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708, -708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708, -708,708,708,708,708,708,708,708,120,120,120,120,120,120,120,120, -709,709,709,709,709,709,709,709,709,709,709,709,709,709,709,709, -709,709,709,709,709,709,709,709,709,709,709,709,709,709,709,709, -709,709,709,709,709,709,709,709,709,709,709,709,709,709,709,709, -709,709,709,709,120,120,120,120,120,120,120,120,120,120,120,710, +718,718,718,718,718,718,718,718,718,718,718,120,718,718,718,718, +718,718,718,120,718,718,120,719,719,719,719,719,719,719,719,719, +719,719,120,719,719,719,719,719,719,719,719,719,719,719,719,719, +719,719,120,719,719,719,719,719,719,719,120,719,719,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, /* block 149 */ -711,711,711,711,711,711,711,711,711,711,711,711,711,711,711,711, -711,711,711,711,711,711,711,711,711,711,711,711,711,711,711,711, -711,711,711,711,711,711,711,711,711,711,711,711,711,711,711,711, -711,711,711,711,711,711,711,711,711,711,711,711,711,711,711,711, -711,711,711,711,711,711,711,711,711,711,711,711,711,711,711,711, -711,711,711,711,711,711,711,711,711,711,711,711,711,711,711,711, -711,711,711,711,711,711,711,711,711,711,711,711,711,711,711,711, -711,711,711,711,711,711,711,711,711,711,711,711,711,711,711,711, +720,720,720,720,720,720,720,720,720,720,720,720,720,720,720,720, +720,720,720,720,720,720,720,720,720,720,720,720,720,720,720,720, +720,720,720,720,720,720,720,720,720,720,720,720,720,720,720,720, +720,720,720,720,720,720,720,720,720,720,720,720,720,720,720,720, +720,720,720,720,720,720,720,720,720,720,720,720,720,720,720,720, +720,720,720,720,720,720,720,720,720,720,720,720,720,720,720,720, +720,720,720,720,720,720,720,720,720,720,720,720,720,720,720,720, +720,720,720,720,720,720,720,720,720,720,720,720,720,720,720,720, /* block 150 */ -711,711,711,711,711,711,711,711,711,711,711,711,711,711,711,711, -711,711,711,711,711,711,711,711,711,711,711,711,711,711,711,711, -711,711,711,711,711,711,711,711,711,711,711,711,711,711,711,711, -711,711,711,711,711,711,711,120,120,120,120,120,120,120,120,120, -711,711,711,711,711,711,711,711,711,711,711,711,711,711,711,711, -711,711,711,711,711,711,120,120,120,120,120,120,120,120,120,120, -711,711,711,711,711,711,711,711,120,120,120,120,120,120,120,120, +720,720,720,720,720,720,720,720,720,720,720,720,720,720,720,720, +720,720,720,720,720,720,720,720,720,720,720,720,720,720,720,720, +720,720,720,720,720,720,720,720,720,720,720,720,720,720,720,720, +720,720,720,720,720,720,720,120,120,120,120,120,120,120,120,120, +720,720,720,720,720,720,720,720,720,720,720,720,720,720,720,720, +720,720,720,720,720,720,120,120,120,120,120,120,120,120,120,120, +720,720,720,720,720,720,720,720,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, /* block 151 */ -712,712,712,712,712,712,120,120,712,120,712,712,712,712,712,712, -712,712,712,712,712,712,712,712,712,712,712,712,712,712,712,712, -712,712,712,712,712,712,712,712,712,712,712,712,712,712,712,712, -712,712,712,712,712,712,120,712,712,120,120,120,712,120,120,712, -713,713,713,713,713,713,713,713,713,713,713,713,713,713,713,713, -713,713,713,713,713,713,120,714,715,715,715,715,715,715,715,715, -716,716,716,716,716,716,716,716,716,716,716,716,716,716,716,716, -716,716,716,716,716,716,716,717,717,718,718,718,718,718,718,718, +110,110,110,110,110,110,120,110,110,110,110,110,110,110,110,110, +110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110, +110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110, +110,120,110,110,110,110,110,110,110,110,110,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, /* block 152 */ -719,719,719,719,719,719,719,719,719,719,719,719,719,719,719,719, -719,719,719,719,719,719,719,719,719,719,719,719,719,719,719,120, -120,120,120,120,120,120,120,720,720,720,720,720,720,720,720,720, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +721,721,721,721,721,721,120,120,721,120,721,721,721,721,721,721, 721,721,721,721,721,721,721,721,721,721,721,721,721,721,721,721, -721,721,721,120,721,721,120,120,120,120,120,722,722,722,722,722, +721,721,721,721,721,721,721,721,721,721,721,721,721,721,721,721, +721,721,721,721,721,721,120,721,721,120,120,120,721,120,120,721, +722,722,722,722,722,722,722,722,722,722,722,722,722,722,722,722, +722,722,722,722,722,722,120,723,724,724,724,724,724,724,724,724, +725,725,725,725,725,725,725,725,725,725,725,725,725,725,725,725, +725,725,725,725,725,725,725,726,726,727,727,727,727,727,727,727, /* block 153 */ -723,723,723,723,723,723,723,723,723,723,723,723,723,723,723,723, -723,723,723,723,723,723,724,724,724,724,724,724,120,120,120,725, -726,726,726,726,726,726,726,726,726,726,726,726,726,726,726,726, -726,726,726,726,726,726,726,726,726,726,120,120,120,120,120,727, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +728,728,728,728,728,728,728,728,728,728,728,728,728,728,728,728, +728,728,728,728,728,728,728,728,728,728,728,728,728,728,728,120, +120,120,120,120,120,120,120,729,729,729,729,729,729,729,729,729, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +730,730,730,730,730,730,730,730,730,730,730,730,730,730,730,730, +730,730,730,120,730,730,120,120,120,120,120,731,731,731,731,731, /* block 154 */ -728,728,728,728,728,728,728,728,728,728,728,728,728,728,728,728, -728,728,728,728,728,728,728,728,728,728,728,728,728,728,728,728, -729,729,729,729,729,729,729,729,729,729,729,729,729,729,729,729, -729,729,729,729,729,729,729,729,120,120,120,120,730,730,729,729, -730,730,730,730,730,730,730,730,730,730,730,730,730,730,730,730, -120,120,730,730,730,730,730,730,730,730,730,730,730,730,730,730, -730,730,730,730,730,730,730,730,730,730,730,730,730,730,730,730, -730,730,730,730,730,730,730,730,730,730,730,730,730,730,730,730, +732,732,732,732,732,732,732,732,732,732,732,732,732,732,732,732, +732,732,732,732,732,732,733,733,733,733,733,733,120,120,120,734, +735,735,735,735,735,735,735,735,735,735,735,735,735,735,735,735, +735,735,735,735,735,735,735,735,735,735,120,120,120,120,120,736, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, /* block 155 */ -731,732,732,732,120,732,732,120,120,120,120,120,732,732,732,732, -731,731,731,731,120,731,731,731,120,731,731,731,731,731,731,731, -731,731,731,731,731,731,731,731,731,731,731,731,731,731,731,731, -731,731,731,731,731,731,120,120,732,732,732,120,120,120,120,732, -733,733,733,733,733,733,733,733,733,120,120,120,120,120,120,120, -734,734,734,734,734,734,734,734,734,120,120,120,120,120,120,120, -735,735,735,735,735,735,735,735,735,735,735,735,735,735,735,735, -735,735,735,735,735,735,735,735,735,735,735,735,735,736,736,737, +737,737,737,737,737,737,737,737,737,737,737,737,737,737,737,737, +737,737,737,737,737,737,737,737,737,737,737,737,737,737,737,737, +738,738,738,738,738,738,738,738,738,738,738,738,738,738,738,738, +738,738,738,738,738,738,738,738,120,120,120,120,739,739,738,738, +739,739,739,739,739,739,739,739,739,739,739,739,739,739,739,739, +120,120,739,739,739,739,739,739,739,739,739,739,739,739,739,739, +739,739,739,739,739,739,739,739,739,739,739,739,739,739,739,739, +739,739,739,739,739,739,739,739,739,739,739,739,739,739,739,739, /* block 156 */ -738,738,738,738,738,738,738,738,738,738,738,738,738,738,738,738, -738,738,738,738,738,738,738,738,738,738,738,738,738,739,739,739, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -740,740,740,740,740,740,740,740,741,740,740,740,740,740,740,740, +740,741,741,741,120,741,741,120,120,120,120,120,741,741,741,741, +740,740,740,740,120,740,740,740,120,740,740,740,740,740,740,740, 740,740,740,740,740,740,740,740,740,740,740,740,740,740,740,740, -740,740,740,740,740,742,742,120,120,120,120,743,743,743,743,743, -744,744,744,744,744,744,744,120,120,120,120,120,120,120,120,120, +740,740,740,740,740,740,120,120,741,741,741,120,120,120,120,741, +742,742,742,742,742,742,742,742,742,120,120,120,120,120,120,120, +743,743,743,743,743,743,743,743,743,120,120,120,120,120,120,120, +744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744, +744,744,744,744,744,744,744,744,744,744,744,744,744,745,745,746, /* block 157 */ -745,745,745,745,745,745,745,745,745,745,745,745,745,745,745,745, -745,745,745,745,745,745,745,745,745,745,745,745,745,745,745,745, -745,745,745,745,745,745,745,745,745,745,745,745,745,745,745,745, -745,745,745,745,745,745,120,120,120,746,746,746,746,746,746,746, 747,747,747,747,747,747,747,747,747,747,747,747,747,747,747,747, -747,747,747,747,747,747,120,120,748,748,748,748,748,748,748,748, +747,747,747,747,747,747,747,747,747,747,747,747,747,748,748,748, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +749,749,749,749,749,749,749,749,750,749,749,749,749,749,749,749, 749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749, -749,749,749,120,120,120,120,120,750,750,750,750,750,750,750,750, +749,749,749,749,749,751,751,120,120,120,120,752,752,752,752,752, +753,753,754,753,753,753,753,120,120,120,120,120,120,120,120,120, /* block 158 */ -751,751,751,751,751,751,751,751,751,751,751,751,751,751,751,751, -751,751,120,120,120,120,120,120,120,752,752,752,752,120,120,120, -120,120,120,120,120,120,120,120,120,753,753,753,753,753,753,753, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +755,755,755,755,755,755,755,755,755,755,755,755,755,755,755,755, +755,755,755,755,755,755,755,755,755,755,755,755,755,755,755,755, +755,755,755,755,755,755,755,755,755,755,755,755,755,755,755,755, +755,755,755,755,755,755,120,120,120,756,756,756,756,756,756,756, +757,757,757,757,757,757,757,757,757,757,757,757,757,757,757,757, +757,757,757,757,757,757,120,120,758,758,758,758,758,758,758,758, +759,759,759,759,759,759,759,759,759,759,759,759,759,759,759,759, +759,759,759,120,120,120,120,120,760,760,760,760,760,760,760,760, /* block 159 */ -754,754,754,754,754,754,754,754,754,754,754,754,754,754,754,754, -754,754,754,754,754,754,754,754,754,754,754,754,754,754,754,754, -754,754,754,754,754,754,754,754,754,754,754,754,754,754,754,754, -754,754,754,754,754,754,754,754,754,754,754,754,754,754,754,754, -754,754,754,754,754,754,754,754,754,120,120,120,120,120,120,120, +761,761,761,761,761,761,761,761,761,761,761,761,761,761,761,761, +761,761,120,120,120,120,120,120,120,762,762,762,762,120,120,120, +120,120,120,120,120,120,120,120,120,763,763,763,763,763,763,763, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, /* block 160 */ -755,755,755,755,755,755,755,755,755,755,755,755,755,755,755,755, -755,755,755,755,755,755,755,755,755,755,755,755,755,755,755,755, -755,755,755,755,755,755,755,755,755,755,755,755,755,755,755,755, -755,755,755,120,120,120,120,120,120,120,120,120,120,120,120,120, -756,756,756,756,756,756,756,756,756,756,756,756,756,756,756,756, -756,756,756,756,756,756,756,756,756,756,756,756,756,756,756,756, -756,756,756,756,756,756,756,756,756,756,756,756,756,756,756,756, -756,756,756,120,120,120,120,120,120,120,757,757,757,757,757,757, +764,764,764,764,764,764,764,764,764,764,764,764,764,764,764,764, +764,764,764,764,764,764,764,764,764,764,764,764,764,764,764,764, +764,764,764,764,764,764,764,764,764,764,764,764,764,764,764,764, +764,764,764,764,764,764,764,764,764,764,764,764,764,764,764,764, +764,764,764,764,764,764,764,764,764,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, /* block 161 */ -758,758,758,758,758,758,758,758,758,758,758,758,758,758,758,758, -758,758,758,758,758,758,758,758,758,758,758,758,758,758,758,758, -758,758,758,758,759,759,759,759,120,120,120,120,120,120,120,120, -760,760,760,760,760,760,760,760,760,760,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +765,765,765,765,765,765,765,765,765,765,765,765,765,765,765,765, +765,765,765,765,765,765,765,765,765,765,765,765,765,765,765,765, +765,765,765,765,765,765,765,765,765,765,765,765,765,765,765,765, +765,765,765,120,120,120,120,120,120,120,120,120,120,120,120,120, +766,766,766,766,766,766,766,766,766,766,766,766,766,766,766,766, +766,766,766,766,766,766,766,766,766,766,766,766,766,766,766,766, +766,766,766,766,766,766,766,766,766,766,766,766,766,766,766,766, +766,766,766,120,120,120,120,120,120,120,767,767,767,767,767,767, /* block 162 */ +768,768,768,768,768,768,768,768,768,768,768,768,768,768,768,768, +768,768,768,768,768,768,768,768,768,768,768,768,768,768,768,768, +768,768,768,768,769,769,769,769,120,120,120,120,120,120,120,120, +770,770,770,770,770,770,770,770,770,770,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -761,761,761,761,761,761,761,761,761,761,761,761,761,761,761,761, -761,761,761,761,761,761,761,761,761,761,761,761,761,761,761,120, /* block 163 */ -762,762,762,762,762,762,762,762,762,762,762,762,762,762,762,762, -762,762,762,762,762,762,762,762,762,762,762,762,762,762,762,762, -762,762,762,762,762,762,762,762,762,762,120,763,763,764,120,120, -762,762,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, - -/* block 164 */ -765,765,765,765,765,765,765,765,765,765,765,765,765,765,765,765, -765,765,765,765,765,765,765,765,765,765,765,765,765,766,766,766, -766,766,766,766,766,766,766,765,120,120,120,120,120,120,120,120, -767,767,767,767,767,767,767,767,767,767,767,767,767,767,767,767, -767,767,767,767,767,767,768,768,768,768,768,768,768,768,768,768, -768,769,769,769,769,770,770,770,770,770,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, - -/* block 165 */ -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 771,771,771,771,771,771,771,771,771,771,771,771,771,771,771,771, -771,771,771,771,771,772,772,772,772,772,772,772,120,120,120,120, +771,771,771,771,771,771,771,771,771,771,771,771,771,771,771,120, + +/* block 164 */ +772,772,772,772,772,772,772,772,772,772,772,772,772,772,772,772, +772,772,772,772,772,772,772,772,772,772,772,772,772,772,772,772, +772,772,772,772,772,772,772,772,772,772,120,773,773,774,120,120, +772,772,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -773,773,773,773,773,773,773,773,773,773,773,773,773,773,773,773, -773,773,773,773,773,773,773,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, + +/* block 165 */ +775,775,775,775,775,775,775,775,775,775,775,775,775,775,775,775, +775,775,775,775,775,775,775,775,775,775,775,775,775,776,776,776, +776,776,776,776,776,776,776,775,120,120,120,120,120,120,120,120, +777,777,777,777,777,777,777,777,777,777,777,777,777,777,777,777, +777,777,777,777,777,777,778,778,778,778,778,778,778,778,778,778, +778,779,779,779,779,780,780,780,780,780,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +781,781,781,781,781,781,781,781,781,781,781,781,781,781,781,781, /* block 166 */ -774,775,774,776,776,776,776,776,776,776,776,776,776,776,776,776, -776,776,776,776,776,776,776,776,776,776,776,776,776,776,776,776, -776,776,776,776,776,776,776,776,776,776,776,776,776,776,776,776, -776,776,776,776,776,776,776,776,775,775,775,775,775,775,775,775, -775,775,775,775,775,775,775,777,777,777,777,777,777,777,120,120, -120,120,778,778,778,778,778,778,778,778,778,778,778,778,778,778, -778,778,778,778,778,778,779,779,779,779,779,779,779,779,779,779, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,775, +781,781,782,782,782,782,783,783,783,783,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +784,784,784,784,784,784,784,784,784,784,784,784,784,784,784,784, +784,784,784,784,784,785,785,785,785,785,785,785,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +786,786,786,786,786,786,786,786,786,786,786,786,786,786,786,786, +786,786,786,786,786,786,786,120,120,120,120,120,120,120,120,120, /* block 167 */ -780,780,781,782,782,782,782,782,782,782,782,782,782,782,782,782, -782,782,782,782,782,782,782,782,782,782,782,782,782,782,782,782, -782,782,782,782,782,782,782,782,782,782,782,782,782,782,782,782, -781,781,781,780,780,780,780,781,781,780,780,783,783,784,783,783, -783,783,120,120,120,120,120,120,120,120,120,120,120,784,120,120, -785,785,785,785,785,785,785,785,785,785,785,785,785,785,785,785, -785,785,785,785,785,785,785,785,785,120,120,120,120,120,120,120, -786,786,786,786,786,786,786,786,786,786,120,120,120,120,120,120, +787,788,787,789,789,789,789,789,789,789,789,789,789,789,789,789, +789,789,789,789,789,789,789,789,789,789,789,789,789,789,789,789, +789,789,789,789,789,789,789,789,789,789,789,789,789,789,789,789, +789,789,789,789,789,789,789,789,788,788,788,788,788,788,788,788, +788,788,788,788,788,788,788,790,790,790,790,790,790,790,120,120, +120,120,791,791,791,791,791,791,791,791,791,791,791,791,791,791, +791,791,791,791,791,791,792,792,792,792,792,792,792,792,792,792, +788,789,789,788,788,789,120,120,120,120,120,120,120,120,120,788, /* block 168 */ -787,787,787,788,788,788,788,788,788,788,788,788,788,788,788,788, -788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788, -788,788,788,788,788,788,788,787,787,787,787,787,789,787,787,787, -787,787,787,787,787,120,790,790,790,790,790,790,790,790,790,790, -791,791,791,791,788,789,789,788,120,120,120,120,120,120,120,120, -792,792,792,792,792,792,792,792,792,792,792,792,792,792,792,792, -792,792,792,792,792,792,792,792,792,792,792,792,792,792,792,792, -792,792,792,793,794,794,792,120,120,120,120,120,120,120,120,120, +793,793,794,795,795,795,795,795,795,795,795,795,795,795,795,795, +795,795,795,795,795,795,795,795,795,795,795,795,795,795,795,795, +795,795,795,795,795,795,795,795,795,795,795,795,795,795,795,795, +794,794,794,793,793,793,793,794,794,793,793,796,796,797,796,796, +796,796,793,120,120,120,120,120,120,120,120,120,120,797,120,120, +798,798,798,798,798,798,798,798,798,798,798,798,798,798,798,798, +798,798,798,798,798,798,798,798,798,120,120,120,120,120,120,120, +799,799,799,799,799,799,799,799,799,799,120,120,120,120,120,120, /* block 169 */ -795,795,796,797,797,797,797,797,797,797,797,797,797,797,797,797, -797,797,797,797,797,797,797,797,797,797,797,797,797,797,797,797, -797,797,797,797,797,797,797,797,797,797,797,797,797,797,797,797, -797,797,797,796,796,796,795,795,795,795,795,795,795,795,795,796, -796,797,798,798,797,799,799,799,799,795,795,795,795,799,796,795, -800,800,800,800,800,800,800,800,800,800,797,799,797,799,799,799, -120,801,801,801,801,801,801,801,801,801,801,801,801,801,801,801, -801,801,801,801,801,120,120,120,120,120,120,120,120,120,120,120, +800,800,800,801,801,801,801,801,801,801,801,801,801,801,801,801, +801,801,801,801,801,801,801,801,801,801,801,801,801,801,801,801, +801,801,801,801,801,801,801,800,800,800,800,800,802,800,800,800, +800,800,800,800,800,120,803,803,803,803,803,803,803,803,803,803, +804,804,804,804,801,802,802,801,120,120,120,120,120,120,120,120, +805,805,805,805,805,805,805,805,805,805,805,805,805,805,805,805, +805,805,805,805,805,805,805,805,805,805,805,805,805,805,805,805, +805,805,805,806,807,807,805,120,120,120,120,120,120,120,120,120, /* block 170 */ -802,802,802,802,802,802,802,802,802,802,802,802,802,802,802,802, -802,802,120,802,802,802,802,802,802,802,802,802,802,802,802,802, -802,802,802,802,802,802,802,802,802,802,802,802,803,803,803,804, -804,804,803,803,804,803,804,804,805,805,805,805,805,805,804,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +808,808,809,810,810,810,810,810,810,810,810,810,810,810,810,810, +810,810,810,810,810,810,810,810,810,810,810,810,810,810,810,810, +810,810,810,810,810,810,810,810,810,810,810,810,810,810,810,810, +810,810,810,809,809,809,808,808,808,808,808,808,808,808,808,809, +809,810,811,811,810,812,812,812,812,808,808,808,808,812,809,808, +813,813,813,813,813,813,813,813,813,813,810,812,810,812,812,812, +120,814,814,814,814,814,814,814,814,814,814,814,814,814,814,814, +814,814,814,814,814,120,120,120,120,120,120,120,120,120,120,120, /* block 171 */ -806,806,806,806,806,806,806,120,806,120,806,806,806,806,120,806, -806,806,806,806,806,806,806,806,806,806,806,806,806,806,120,806, -806,806,806,806,806,806,806,806,806,807,120,120,120,120,120,120, -808,808,808,808,808,808,808,808,808,808,808,808,808,808,808,808, -808,808,808,808,808,808,808,808,808,808,808,808,808,808,808,808, -808,808,808,808,808,808,808,808,808,808,808,808,808,808,808,809, -810,810,810,809,809,809,809,809,809,809,809,120,120,120,120,120, -811,811,811,811,811,811,811,811,811,811,120,120,120,120,120,120, +815,815,815,815,815,815,815,815,815,815,815,815,815,815,815,815, +815,815,120,815,815,815,815,815,815,815,815,815,815,815,815,815, +815,815,815,815,815,815,815,815,815,815,815,815,816,816,816,817, +817,817,816,816,817,816,817,817,818,818,818,818,818,818,817,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, /* block 172 */ -812,813,814,815,120,816,816,816,816,816,816,816,816,120,120,816, -816,120,120,816,816,816,816,816,816,816,816,816,816,816,816,816, -816,816,816,816,816,816,816,816,816,120,816,816,816,816,816,816, -816,120,816,816,120,816,816,816,816,816,120,817,813,816,818,814, -812,814,814,814,814,120,120,814,814,120,120,814,814,814,120,120, -816,120,120,120,120,120,120,818,120,120,120,120,120,816,816,816, -816,816,814,814,120,120,812,812,812,812,812,812,812,120,120,120, -812,812,812,812,812,120,120,120,120,120,120,120,120,120,120,120, +819,819,819,819,819,819,819,120,819,120,819,819,819,819,120,819, +819,819,819,819,819,819,819,819,819,819,819,819,819,819,120,819, +819,819,819,819,819,819,819,819,819,820,120,120,120,120,120,120, +821,821,821,821,821,821,821,821,821,821,821,821,821,821,821,821, +821,821,821,821,821,821,821,821,821,821,821,821,821,821,821,821, +821,821,821,821,821,821,821,821,821,821,821,821,821,821,821,822, +823,823,823,822,822,822,822,822,822,822,822,120,120,120,120,120, +824,824,824,824,824,824,824,824,824,824,120,120,120,120,120,120, /* block 173 */ -819,819,819,819,819,819,819,819,819,819,819,819,819,819,819,819, -819,819,819,819,819,819,819,819,819,819,819,819,819,819,819,819, -819,819,819,819,819,819,819,819,819,819,819,819,819,819,819,819, -819,819,819,819,819,820,820,820,821,821,821,821,821,821,821,821, -820,820,821,821,821,820,821,819,819,819,819,822,822,822,822,822, -823,823,823,823,823,823,823,823,823,823,822,822,120,822,821,819, -819,819,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +825,826,827,828,120,829,829,829,829,829,829,829,829,120,120,829, +829,120,120,829,829,829,829,829,829,829,829,829,829,829,829,829, +829,829,829,829,829,829,829,829,829,120,829,829,829,829,829,829, +829,120,829,829,120,829,829,829,829,829,120,830,826,829,831,827, +825,827,827,827,827,120,120,827,827,120,120,827,827,827,120,120, +829,120,120,120,120,120,120,831,120,120,120,120,120,829,829,829, +829,829,827,827,120,120,825,825,825,825,825,825,825,120,120,120, +825,825,825,825,825,120,120,120,120,120,120,120,120,120,120,120, /* block 174 */ -824,824,824,824,824,824,824,824,824,824,824,824,824,824,824,824, -824,824,824,824,824,824,824,824,824,824,824,824,824,824,824,824, -824,824,824,824,824,824,824,824,824,824,824,824,824,824,824,824, -825,826,826,827,827,827,827,827,827,826,827,826,826,825,826,827, -827,826,827,827,824,824,828,824,120,120,120,120,120,120,120,120, -829,829,829,829,829,829,829,829,829,829,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +832,832,832,832,832,832,832,832,832,832,832,832,832,832,832,832, +832,832,832,832,832,832,832,832,832,832,832,832,832,832,832,832, +832,832,832,832,832,832,832,832,832,832,832,832,832,832,832,832, +832,832,832,832,832,833,833,833,834,834,834,834,834,834,834,834, +833,833,834,834,834,833,834,832,832,832,832,835,835,835,835,835, +836,836,836,836,836,836,836,836,836,836,835,835,120,835,834,832, +832,832,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, /* block 175 */ -830,830,830,830,830,830,830,830,830,830,830,830,830,830,830,830, -830,830,830,830,830,830,830,830,830,830,830,830,830,830,830,830, -830,830,830,830,830,830,830,830,830,830,830,830,830,830,830,831, -832,832,833,833,833,833,120,120,832,832,832,832,833,833,832,833, -833,834,834,834,834,834,834,834,834,834,834,834,834,834,834,834, -834,834,834,834,834,834,834,834,830,830,830,830,833,833,120,120, +837,837,837,837,837,837,837,837,837,837,837,837,837,837,837,837, +837,837,837,837,837,837,837,837,837,837,837,837,837,837,837,837, +837,837,837,837,837,837,837,837,837,837,837,837,837,837,837,837, +838,839,839,840,840,840,840,840,840,839,840,839,839,838,839,840, +840,839,840,840,837,837,841,837,120,120,120,120,120,120,120,120, +842,842,842,842,842,842,842,842,842,842,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, /* block 176 */ -835,835,835,835,835,835,835,835,835,835,835,835,835,835,835,835, -835,835,835,835,835,835,835,835,835,835,835,835,835,835,835,835, -835,835,835,835,835,835,835,835,835,835,835,835,835,835,835,835, -836,836,836,837,837,837,837,837,837,837,837,836,836,837,836,837, -837,838,838,838,835,120,120,120,120,120,120,120,120,120,120,120, -839,839,839,839,839,839,839,839,839,839,120,120,120,120,120,120, -394,394,394,394,394,394,394,394,394,394,394,394,394,120,120,120, +843,843,843,843,843,843,843,843,843,843,843,843,843,843,843,843, +843,843,843,843,843,843,843,843,843,843,843,843,843,843,843,843, +843,843,843,843,843,843,843,843,843,843,843,843,843,843,843,844, +845,845,846,846,846,846,120,120,845,845,845,845,846,846,845,846, +846,847,847,847,847,847,847,847,847,847,847,847,847,847,847,847, +847,847,847,847,847,847,847,847,843,843,843,843,846,846,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, /* block 177 */ -840,840,840,840,840,840,840,840,840,840,840,840,840,840,840,840, -840,840,840,840,840,840,840,840,840,840,840,840,840,840,840,840, -840,840,840,840,840,840,840,840,840,840,840,841,842,841,842,842, -841,841,841,841,841,841,842,841,840,120,120,120,120,120,120,120, -843,843,843,843,843,843,843,843,843,843,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +848,848,848,848,848,848,848,848,848,848,848,848,848,848,848,848, +848,848,848,848,848,848,848,848,848,848,848,848,848,848,848,848, +848,848,848,848,848,848,848,848,848,848,848,848,848,848,848,848, +849,849,849,850,850,850,850,850,850,850,850,849,849,850,849,850, +850,851,851,851,848,120,120,120,120,120,120,120,120,120,120,120, +852,852,852,852,852,852,852,852,852,852,120,120,120,120,120,120, +398,398,398,398,398,398,398,398,398,398,398,398,398,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, /* block 178 */ -844,844,844,844,844,844,844,844,844,844,844,844,844,844,844,844, -844,844,844,844,844,844,844,844,844,844,844,120,120,845,845,845, -846,846,845,845,845,845,846,845,845,845,845,845,120,120,120,120, -847,847,847,847,847,847,847,847,847,847,848,848,849,849,849,850, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +853,853,853,853,853,853,853,853,853,853,853,853,853,853,853,853, +853,853,853,853,853,853,853,853,853,853,853,853,853,853,853,853, +853,853,853,853,853,853,853,853,853,853,853,854,855,854,855,855, +854,854,854,854,854,854,855,854,853,856,120,120,120,120,120,120, +857,857,857,857,857,857,857,857,857,857,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, /* block 179 */ -851,851,851,851,851,851,851,851,851,851,851,851,851,851,851,851, -851,851,851,851,851,851,851,851,851,851,851,851,851,851,851,851, -851,851,851,851,851,851,851,851,851,851,851,851,852,852,852,853, -853,853,853,853,853,853,853,853,852,853,853,854,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +858,858,858,858,858,858,858,858,858,858,858,858,858,858,858,858, +858,858,858,858,858,858,858,858,858,858,858,120,120,859,859,859, +860,860,859,859,859,859,861,859,859,859,859,859,120,120,120,120, +862,862,862,862,862,862,862,862,862,862,863,863,864,864,864,865, +858,858,858,858,858,858,858,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, /* block 180 */ +866,866,866,866,866,866,866,866,866,866,866,866,866,866,866,866, +866,866,866,866,866,866,866,866,866,866,866,866,866,866,866,866, +866,866,866,866,866,866,866,866,866,866,866,866,867,867,867,868, +868,868,868,868,868,868,868,868,867,868,868,869,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -855,855,855,855,855,855,855,855,855,855,855,855,855,855,855,855, -855,855,855,855,855,855,855,855,855,855,855,855,855,855,855,855, -856,856,856,856,856,856,856,856,856,856,856,856,856,856,856,856, -856,856,856,856,856,856,856,856,856,856,856,856,856,856,856,856, -857,857,857,857,857,857,857,857,857,857,858,858,858,858,858,858, -858,858,858,120,120,120,120,120,120,120,120,120,120,120,120,859, /* block 181 */ -860,860,860,860,860,860,860,120,120,860,120,120,860,860,860,860, -860,860,860,860,120,860,860,120,860,860,860,860,860,860,860,860, -860,860,860,860,860,860,860,860,860,860,860,860,860,860,860,860, -861,862,862,862,862,862,120,862,862,120,120,863,863,862,863,864, -862,864,862,863,865,865,865,120,120,120,120,120,120,120,120,120, -866,866,866,866,866,866,866,866,866,866,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +870,870,870,870,870,870,870,870,870,870,870,870,870,870,870,870, +870,870,870,870,870,870,870,870,870,870,870,870,870,870,870,870, +871,871,871,871,871,871,871,871,871,871,871,871,871,871,871,871, +871,871,871,871,871,871,871,871,871,871,871,871,871,871,871,871, +872,872,872,872,872,872,872,872,872,872,873,873,873,873,873,873, +873,873,873,120,120,120,120,120,120,120,120,120,120,120,120,874, /* block 182 */ +875,875,875,875,875,875,875,120,120,875,120,120,875,875,875,875, +875,875,875,875,120,875,875,120,875,875,875,875,875,875,875,875, +875,875,875,875,875,875,875,875,875,875,875,875,875,875,875,875, +876,877,877,877,877,877,120,877,877,120,120,878,878,877,878,879, +877,879,877,878,880,880,880,120,120,120,120,120,120,120,120,120, +881,881,881,881,881,881,881,881,881,881,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -867,867,867,867,867,867,867,867,120,120,867,867,867,867,867,867, -867,867,867,867,867,867,867,867,867,867,867,867,867,867,867,867, -867,867,867,867,867,867,867,867,867,867,867,867,867,867,867,867, -867,868,868,868,869,869,869,869,120,120,869,869,868,868,868,868, -869,867,870,867,868,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, /* block 183 */ -871,872,872,872,872,872,872,872,872,872,872,871,871,871,871,871, -871,871,871,871,871,871,871,871,871,871,871,871,871,871,871,871, -871,871,871,871,871,871,871,871,871,871,871,871,871,871,871,871, -871,871,871,872,872,872,872,872,872,873,874,872,872,872,872,875, -875,875,875,875,875,875,875,872,120,120,120,120,120,120,120,120, -876,877,877,877,877,877,877,878,878,877,877,877,876,876,876,876, -876,876,876,876,876,876,876,876,876,876,876,876,876,876,876,876, -876,876,876,876,876,876,876,876,876,876,876,876,876,876,876,876, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +882,882,882,882,882,882,882,882,120,120,882,882,882,882,882,882, +882,882,882,882,882,882,882,882,882,882,882,882,882,882,882,882, +882,882,882,882,882,882,882,882,882,882,882,882,882,882,882,882, +882,883,883,883,884,884,884,884,120,120,884,884,883,883,883,883, +884,882,885,882,883,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, /* block 184 */ -876,876,876,876,879,879,879,879,879,879,877,877,877,877,877,877, -877,877,877,877,877,877,877,878,877,877,880,880,880,876,880,880, -880,880,880,120,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -881,881,881,881,881,881,881,881,881,881,881,881,881,881,881,881, -881,881,881,881,881,881,881,881,881,881,881,881,881,881,881,881, -881,881,881,881,881,881,881,881,881,881,881,881,881,881,881,881, -881,881,881,881,881,881,881,881,881,120,120,120,120,120,120,120, +886,887,887,887,887,887,887,887,887,887,887,886,886,886,886,886, +886,886,886,886,886,886,886,886,886,886,886,886,886,886,886,886, +886,886,886,886,886,886,886,886,886,886,886,886,886,886,886,886, +886,886,886,887,887,887,887,887,887,888,889,887,887,887,887,890, +890,890,890,890,890,890,890,887,120,120,120,120,120,120,120,120, +891,892,892,892,892,892,892,893,893,892,892,892,891,891,891,891, +891,891,891,891,891,891,891,891,891,891,891,891,891,891,891,891, +891,891,891,891,891,891,891,891,891,891,891,891,891,891,891,891, /* block 185 */ -882,882,882,882,882,882,882,882,882,120,882,882,882,882,882,882, -882,882,882,882,882,882,882,882,882,882,882,882,882,882,882,882, -882,882,882,882,882,882,882,882,882,882,882,882,882,882,882,883, -884,884,884,884,884,884,884,120,884,884,884,884,884,884,883,884, -882,885,885,885,885,885,120,120,120,120,120,120,120,120,120,120, -886,886,886,886,886,886,886,886,886,886,887,887,887,887,887,887, -887,887,887,887,887,887,887,887,887,887,887,887,887,120,120,120, -888,888,889,889,889,889,889,889,889,889,889,889,889,889,889,889, +891,891,891,891,894,894,894,894,894,894,892,892,892,892,892,892, +892,892,892,892,892,892,892,893,892,892,895,895,895,891,895,895, +895,895,895,120,120,120,120,120,120,120,120,120,120,120,120,120, +370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,370, +896,896,896,896,896,896,896,896,896,896,896,896,896,896,896,896, +896,896,896,896,896,896,896,896,896,896,896,896,896,896,896,896, +896,896,896,896,896,896,896,896,896,896,896,896,896,896,896,896, +896,896,896,896,896,896,896,896,896,120,120,120,120,120,120,120, /* block 186 */ -889,889,889,889,889,889,889,889,889,889,889,889,889,889,889,889, -120,120,890,890,890,890,890,890,890,890,890,890,890,890,890,890, -890,890,890,890,890,890,890,890,120,891,890,890,890,890,890,890, -890,891,890,890,891,890,890,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +897,897,897,897,897,897,897,897,897,120,897,897,897,897,897,897, +897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897, +897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,898, +899,899,899,899,899,899,899,120,899,899,899,899,899,899,898,899, +897,900,900,900,900,900,120,120,120,120,120,120,120,120,120,120, +901,901,901,901,901,901,901,901,901,901,902,902,902,902,902,902, +902,902,902,902,902,902,902,902,902,902,902,902,902,120,120,120, +903,903,904,904,904,904,904,904,904,904,904,904,904,904,904,904, /* block 187 */ -892,892,892,892,892,892,892,120,892,892,120,892,892,892,892,892, -892,892,892,892,892,892,892,892,892,892,892,892,892,892,892,892, -892,892,892,892,892,892,892,892,892,892,892,892,892,892,892,892, -892,893,893,893,893,893,893,120,120,120,893,120,893,893,120,893, -893,893,893,893,893,893,894,893,120,120,120,120,120,120,120,120, -895,895,895,895,895,895,895,895,895,895,120,120,120,120,120,120, -896,896,896,896,896,896,120,896,896,120,896,896,896,896,896,896, -896,896,896,896,896,896,896,896,896,896,896,896,896,896,896,896, +904,904,904,904,904,904,904,904,904,904,904,904,904,904,904,904, +120,120,905,905,905,905,905,905,905,905,905,905,905,905,905,905, +905,905,905,905,905,905,905,905,120,906,905,905,905,905,905,905, +905,906,905,905,906,905,905,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, /* block 188 */ -896,896,896,896,896,896,896,896,896,896,897,897,897,897,897,120, -898,898,120,897,897,898,897,898,896,120,120,120,120,120,120,120, -899,899,899,899,899,899,899,899,899,899,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +907,907,907,907,907,907,907,120,907,907,120,907,907,907,907,907, +907,907,907,907,907,907,907,907,907,907,907,907,907,907,907,907, +907,907,907,907,907,907,907,907,907,907,907,907,907,907,907,907, +907,908,908,908,908,908,908,120,120,120,908,120,908,908,120,908, +908,908,908,908,908,908,909,908,120,120,120,120,120,120,120,120, +910,910,910,910,910,910,910,910,910,910,120,120,120,120,120,120, +911,911,911,911,911,911,120,911,911,120,911,911,911,911,911,911, +911,911,911,911,911,911,911,911,911,911,911,911,911,911,911,911, /* block 189 */ +911,911,911,911,911,911,911,911,911,911,912,912,912,912,912,120, +913,913,120,912,912,913,912,913,911,120,120,120,120,120,120,120, +914,914,914,914,914,914,914,914,914,914,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -900,900,900,900,900,900,900,900,900,900,900,900,900,900,900,900, -900,900,900,901,901,902,902,903,903,120,120,120,120,120,120,120, /* block 190 */ 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -590,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -904,904,904,904,904,904,904,904,904,904,904,904,904,904,904,904, -293,293,904,293,904,295,295,295,295,295,295,295,295,296,296,296, -296,295,295,295,295,295,295,295,295,295,295,295,295,295,295,295, -295,295,120,120,120,120,120,120,120,120,120,120,120,120,120,905, - -/* block 191 */ -906,906,906,906,906,906,906,906,906,906,906,906,906,906,906,906, -906,906,906,906,906,906,906,906,906,906,906,906,906,906,906,906, -906,906,906,906,906,906,906,906,906,906,906,906,906,906,906,906, -906,906,906,906,906,906,906,906,906,906,906,906,906,906,906,906, -906,906,906,906,906,906,906,906,906,906,906,906,906,906,906,906, -906,906,906,906,906,906,906,906,906,906,906,906,906,906,906,906, -906,906,906,906,906,906,906,906,906,906,906,906,906,906,906,906, -906,906,906,906,906,906,906,906,906,906,906,906,906,906,906,906, - -/* block 192 */ -906,906,906,906,906,906,906,906,906,906,906,906,906,906,906,906, -906,906,906,906,906,906,906,906,906,906,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, - -/* block 193 */ -907,907,907,907,907,907,907,907,907,907,907,907,907,907,907,907, -907,907,907,907,907,907,907,907,907,907,907,907,907,907,907,907, -907,907,907,907,907,907,907,907,907,907,907,907,907,907,907,907, -907,907,907,907,907,907,907,907,907,907,907,907,907,907,907,907, -907,907,907,907,907,907,907,907,907,907,907,907,907,907,907,907, -907,907,907,907,907,907,907,907,907,907,907,907,907,907,907,907, -907,907,907,907,907,907,907,907,907,907,907,907,907,907,907,120, -908,908,908,908,908,120,120,120,120,120,120,120,120,120,120,120, - -/* block 194 */ -906,906,906,906,906,906,906,906,906,906,906,906,906,906,906,906, -906,906,906,906,906,906,906,906,906,906,906,906,906,906,906,906, -906,906,906,906,906,906,906,906,906,906,906,906,906,906,906,906, -906,906,906,906,906,906,906,906,906,906,906,906,906,906,906,906, -906,906,906,906,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, - -/* block 195 */ -909,909,909,909,909,909,909,909,909,909,909,909,909,909,909,909, -909,909,909,909,909,909,909,909,909,909,909,909,909,909,909,909, -909,909,909,909,909,909,909,909,909,909,909,909,909,909,909,909, -909,909,909,909,909,909,909,909,909,909,909,909,909,909,909,909, -909,909,909,909,909,909,909,909,909,909,909,909,909,909,909,909, -909,909,909,909,909,909,909,909,909,909,909,909,909,909,909,909, -909,909,909,909,909,909,909,909,909,909,909,909,909,909,909,909, -909,909,909,909,909,909,909,909,909,909,909,909,909,909,909,909, - -/* block 196 */ -909,909,909,909,909,909,909,909,909,909,909,909,909,909,909,909, -909,909,909,909,909,909,909,909,909,909,909,909,909,909,909,909, -909,909,909,909,909,909,909,909,909,909,909,909,909,909,909,120, -910,910,910,910,910,910,910,910,910,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, - -/* block 197 */ -911,911,911,911,911,911,911,911,911,911,911,911,911,911,911,911, -911,911,911,911,911,911,911,911,911,911,911,911,911,911,911,911, -911,911,911,911,911,911,911,911,911,911,911,911,911,911,911,911, -911,911,911,911,911,911,911,911,911,911,911,911,911,911,911,911, -911,911,911,911,911,911,911,911,911,911,911,911,911,911,911,911, -911,911,911,911,911,911,911,911,911,911,911,911,911,911,911,911, -911,911,911,911,911,911,911,911,911,911,911,911,911,911,911,911, -911,911,911,911,911,911,911,911,911,911,911,911,911,911,911,911, - -/* block 198 */ -911,911,911,911,911,911,911,911,911,911,911,911,911,911,911,911, -911,911,911,911,911,911,911,911,911,911,911,911,911,911,911,911, -911,911,911,911,911,911,911,911,911,911,911,911,911,911,911,911, -911,911,911,911,911,911,911,911,911,911,911,911,911,911,911,911, -911,911,911,911,911,911,911,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, - -/* block 199 */ -601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,601, -601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,601, -601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,601, -601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,601, -601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,601, -601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,601, -601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,601, -601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,601, - -/* block 200 */ -601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,601, -601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,601, -601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,601, -601,601,601,601,601,601,601,601,601,120,120,120,120,120,120,120, -912,912,912,912,912,912,912,912,912,912,912,912,912,912,912,912, -912,912,912,912,912,912,912,912,912,912,912,912,912,912,912,120, -913,913,913,913,913,913,913,913,913,913,120,120,120,120,914,914, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, - -/* block 201 */ -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 915,915,915,915,915,915,915,915,915,915,915,915,915,915,915,915, -915,915,915,915,915,915,915,915,915,915,915,915,915,915,120,120, -916,916,916,916,916,917,120,120,120,120,120,120,120,120,120,120, +915,915,915,916,916,917,917,918,918,120,120,120,120,120,120,120, + +/* block 191 */ +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +595,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +919,919,919,919,919,919,919,919,919,919,919,919,919,919,919,919, +295,295,919,295,919,297,297,297,297,297,297,297,297,298,298,298, +298,297,297,297,297,297,297,297,297,297,297,297,297,297,297,297, +297,297,120,120,120,120,120,120,120,120,120,120,120,120,120,920, + +/* block 192 */ +921,921,921,921,921,921,921,921,921,921,921,921,921,921,921,921, +921,921,921,921,921,921,921,921,921,921,921,921,921,921,921,921, +921,921,921,921,921,921,921,921,921,921,921,921,921,921,921,921, +921,921,921,921,921,921,921,921,921,921,921,921,921,921,921,921, +921,921,921,921,921,921,921,921,921,921,921,921,921,921,921,921, +921,921,921,921,921,921,921,921,921,921,921,921,921,921,921,921, +921,921,921,921,921,921,921,921,921,921,921,921,921,921,921,921, +921,921,921,921,921,921,921,921,921,921,921,921,921,921,921,921, + +/* block 193 */ +921,921,921,921,921,921,921,921,921,921,921,921,921,921,921,921, +921,921,921,921,921,921,921,921,921,921,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, + +/* block 194 */ +922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,922, +922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,922, +922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,922, +922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,922, +922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,922, +922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,922, +922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,120, +923,923,923,923,923,120,120,120,120,120,120,120,120,120,120,120, + +/* block 195 */ +921,921,921,921,921,921,921,921,921,921,921,921,921,921,921,921, +921,921,921,921,921,921,921,921,921,921,921,921,921,921,921,921, +921,921,921,921,921,921,921,921,921,921,921,921,921,921,921,921, +921,921,921,921,921,921,921,921,921,921,921,921,921,921,921,921, +921,921,921,921,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, + +/* block 196 */ +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +924,924,924,924,924,924,924,924,924,924,924,924,924,924,924,924, +924,924,924,924,924,924,924,924,924,924,924,924,924,924,924,924, +924,924,924,924,924,924,924,924,924,924,924,924,924,924,924,924, +924,924,924,924,924,924,924,924,924,924,924,924,924,924,924,924, +924,924,924,924,924,924,924,924,924,924,924,924,924,924,924,924, +924,924,924,924,924,924,924,924,924,924,924,924,924,924,924,924, +924,925,925,120,120,120,120,120,120,120,120,120,120,120,120,120, + +/* block 197 */ +926,926,926,926,926,926,926,926,926,926,926,926,926,926,926,926, +926,926,926,926,926,926,926,926,926,926,926,926,926,926,926,926, +926,926,926,926,926,926,926,926,926,926,926,926,926,926,926,926, +926,926,926,926,926,926,926,926,926,926,926,926,926,926,926,926, +926,926,926,926,926,926,926,926,926,926,926,926,926,926,926,926, +926,926,926,926,926,926,926,926,926,926,926,926,926,926,926,926, +926,926,926,926,926,926,926,926,926,926,926,926,926,926,926,926, +926,926,926,926,926,926,926,926,926,926,926,926,926,926,926,926, + +/* block 198 */ +926,926,926,926,926,926,926,926,926,926,926,926,926,926,926,926, +926,926,926,926,926,926,926,926,926,926,926,926,926,926,926,926, +926,926,926,926,926,926,926,926,926,926,926,926,926,926,926,120, +927,927,927,927,927,927,927,927,927,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, + +/* block 199 */ +928,928,928,928,928,928,928,928,928,928,928,928,928,928,928,928, +928,928,928,928,928,928,928,928,928,928,928,928,928,928,928,928, +928,928,928,928,928,928,928,928,928,928,928,928,928,928,928,928, +928,928,928,928,928,928,928,928,928,928,928,928,928,928,928,928, +928,928,928,928,928,928,928,928,928,928,928,928,928,928,928,928, +928,928,928,928,928,928,928,928,928,928,928,928,928,928,928,928, +928,928,928,928,928,928,928,928,928,928,928,928,928,928,928,928, +928,928,928,928,928,928,928,928,928,928,928,928,928,928,928,928, + +/* block 200 */ +928,928,928,928,928,928,928,928,928,928,928,928,928,928,928,928, +928,928,928,928,928,928,928,928,928,928,928,928,928,928,928,928, +928,928,928,928,928,928,928,928,928,928,928,928,928,928,928,928, +928,928,928,928,928,928,928,928,928,928,928,928,928,928,928,928, +928,928,928,928,928,928,928,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, + +/* block 201 */ +606,606,606,606,606,606,606,606,606,606,606,606,606,606,606,606, +606,606,606,606,606,606,606,606,606,606,606,606,606,606,606,606, +606,606,606,606,606,606,606,606,606,606,606,606,606,606,606,606, +606,606,606,606,606,606,606,606,606,606,606,606,606,606,606,606, +606,606,606,606,606,606,606,606,606,606,606,606,606,606,606,606, +606,606,606,606,606,606,606,606,606,606,606,606,606,606,606,606, +606,606,606,606,606,606,606,606,606,606,606,606,606,606,606,606, +606,606,606,606,606,606,606,606,606,606,606,606,606,606,606,606, /* block 202 */ -918,918,918,918,918,918,918,918,918,918,918,918,918,918,918,918, -918,918,918,918,918,918,918,918,918,918,918,918,918,918,918,918, -918,918,918,918,918,918,918,918,918,918,918,918,918,918,918,918, -919,919,919,919,919,919,919,920,920,920,920,920,921,921,921,921, -922,922,922,922,920,921,120,120,120,120,120,120,120,120,120,120, -923,923,923,923,923,923,923,923,923,923,120,924,924,924,924,924, -924,924,120,918,918,918,918,918,918,918,918,918,918,918,918,918, -918,918,918,918,918,918,918,918,120,120,120,120,120,918,918,918, +606,606,606,606,606,606,606,606,606,606,606,606,606,606,606,606, +606,606,606,606,606,606,606,606,606,606,606,606,606,606,606,606, +606,606,606,606,606,606,606,606,606,606,606,606,606,606,606,606, +606,606,606,606,606,606,606,606,606,120,120,120,120,120,120,120, +929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, +929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,120, +930,930,930,930,930,930,930,930,930,930,120,120,120,120,931,931, +932,932,932,932,932,932,932,932,932,932,932,932,932,932,932,932, /* block 203 */ -918,918,918,918,918,918,918,918,918,918,918,918,918,918,918,918, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +932,932,932,932,932,932,932,932,932,932,932,932,932,932,932,932, +932,932,932,932,932,932,932,932,932,932,932,932,932,932,932,932, +932,932,932,932,932,932,932,932,932,932,932,932,932,932,932,932, +932,932,932,932,932,932,932,932,932,932,932,932,932,932,932,120, +933,933,933,933,933,933,933,933,933,933,120,120,120,120,120,120, +934,934,934,934,934,934,934,934,934,934,934,934,934,934,934,934, +934,934,934,934,934,934,934,934,934,934,934,934,934,934,120,120, +935,935,935,935,935,936,120,120,120,120,120,120,120,120,120,120, /* block 204 */ -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -925,925,925,925,925,925,925,925,925,925,925,925,925,925,925,925, -925,925,925,925,925,925,925,925,925,925,925,925,925,925,925,925, -926,926,926,926,926,926,926,926,926,926,926,926,926,926,926,926, -926,926,926,926,926,926,926,926,926,926,926,926,926,926,926,926, +937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937, +937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937, +937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937, +938,938,938,938,938,938,938,939,939,939,939,939,940,940,940,940, +941,941,941,941,939,940,120,120,120,120,120,120,120,120,120,120, +942,942,942,942,942,942,942,942,942,942,120,943,943,943,943,943, +943,943,120,937,937,937,937,937,937,937,937,937,937,937,937,937, +937,937,937,937,937,937,937,937,120,120,120,120,120,937,937,937, /* block 205 */ -927,927,927,927,927,927,927,927,927,927,927,927,927,927,927,927, -927,927,927,927,927,927,927,928,928,928,928,120,120,120,120,120, +937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, @@ -3779,146 +3805,196 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */ 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, /* block 206 */ -929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, -929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, -929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, -929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, -929,929,929,929,929,929,929,929,929,929,929,120,120,120,120,930, -929,931,931,931,931,931,931,931,931,931,931,931,931,931,931,931, -931,931,931,931,931,931,931,931,931,931,931,931,931,931,931,931, -931,931,931,931,931,931,931,931,931,931,931,931,931,931,931,931, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +944,944,944,944,944,944,944,944,944,944,944,944,944,944,944,944, +944,944,944,944,944,944,944,944,944,944,944,944,944,944,944,944, +945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945, +945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945, /* block 207 */ -931,931,931,931,931,931,931,931,120,120,120,120,120,120,120,930, -930,930,930,932,932,932,932,932,932,932,932,932,932,932,932,932, +946,946,946,946,946,946,946,946,946,946,946,946,946,946,946,946, +946,946,946,946,946,946,946,947,947,947,947,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -933,934, 5,111,935,120,120,120,120,120,120,120,120,120,120,120, -936,936,120,120,120,120,120,120,120,120,120,120,120,120,120,120, /* block 208 */ -937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937, -937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937, -937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937, -937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937, -937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937, -937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937, -937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937, -937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937, +948,948,948,948,948,948,948,948,948,948,948,948,948,948,948,948, +948,948,948,948,948,948,948,948,948,948,948,948,948,948,948,948, +948,948,948,948,948,948,948,948,948,948,948,948,948,948,948,948, +948,948,948,948,948,948,948,948,948,948,948,948,948,948,948,948, +948,948,948,948,948,948,948,948,948,948,948,120,120,120,120,949, +948,950,950,950,950,950,950,950,950,950,950,950,950,950,950,950, +950,950,950,950,950,950,950,950,950,950,950,950,950,950,950,950, +950,950,950,950,950,950,950,950,950,950,950,950,950,950,950,950, /* block 209 */ -937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937, -937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937, -937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937, -937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937, -937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937, -937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937, -937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937, -937,937,937,937,937,937,937,937,120,120,120,120,120,120,120,120, +950,950,950,950,950,950,950,950,120,120,120,120,120,120,120,949, +949,949,949,951,951,951,951,951,951,951,951,951,951,951,951,951, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +952,953,954,562,955,120,120,120,120,120,120,120,120,120,120,120, +956,956,120,120,120,120,120,120,120,120,120,120,120,120,120,120, /* block 210 */ -938,938,938,938,938,938,938,938,938,938,938,938,938,938,938,938, -938,938,938,938,938,938,938,938,938,938,938,938,938,938,938,938, -938,938,938,938,938,938,938,938,938,938,938,938,938,938,938,938, -938,938,938,938,938,938,938,938,938,938,938,938,938,938,938,938, -938,938,938,938,938,938,938,938,938,938,938,938,938,938,938,938, -938,938,938,938,938,938,938,938,938,938,938,938,938,938,938,938, -938,938,938,938,938,938,938,938,938,938,938,938,938,938,938,938, -938,938,938,938,938,938,938,938,938,938,938,938,938,938,938,938, +957,957,957,957,957,957,957,957,957,957,957,957,957,957,957,957, +957,957,957,957,957,957,957,957,957,957,957,957,957,957,957,957, +957,957,957,957,957,957,957,957,957,957,957,957,957,957,957,957, +957,957,957,957,957,957,957,957,957,957,957,957,957,957,957,957, +957,957,957,957,957,957,957,957,957,957,957,957,957,957,957,957, +957,957,957,957,957,957,957,957,957,957,957,957,957,957,957,957, +957,957,957,957,957,957,957,957,957,957,957,957,957,957,957,957, +957,957,957,957,957,957,957,957,957,957,957,957,957,957,957,957, /* block 211 */ -938,938,938,938,938,938,938,938,938,938,938,938,938,938,938,938, -938,938,938,938,938,938,938,938,938,938,938,938,938,938,938,938, -938,938,938,938,938,938,938,938,938,938,938,938,938,938,938,938, -938,938,938,938,938,938,938,938,938,938,938,938,938,938,938,938, -938,938,938,938,938,938,938,938,938,938,938,938,938,938,938,938, -938,938,938,938,938,938,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +957,957,957,957,957,957,957,957,957,957,957,957,957,957,957,957, +957,957,957,957,957,957,957,957,957,957,957,957,957,957,957,957, +957,957,957,957,957,957,957,957,957,957,957,957,957,957,957,957, +957,957,957,957,957,957,957,957,957,957,957,957,957,957,957,957, +957,957,957,957,957,957,957,957,957,957,957,957,957,957,957,957, +957,957,957,957,957,957,957,957,957,957,957,957,957,957,957,957, +957,957,957,957,957,957,957,957,957,957,957,957,957,957,957,957, +957,957,957,957,957,957,957,957,120,120,120,120,120,120,120,120, /* block 212 */ -937,937,937,937,937,937,937,937,937,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958, +958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958, +958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958, +958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958, +958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958, +958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958, +958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958, +958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958, /* block 213 */ -578,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573, -573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573, -573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573, -573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573, -573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573, -573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573, -573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573, -573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573, +958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958, +958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958, +958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958, +958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958, +958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958, +958,958,958,958,958,958,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, /* block 214 */ -573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573, -573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573, -573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573, -573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573, -573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573, -573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573, -573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573, -573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573, +957,957,957,957,957,957,957,957,957,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, /* block 215 */ -573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573, -573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -573,573,573,120,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,578,578,578,578,120,120,120,120,120,120,120,120, -939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,939, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +584,584,584,584,120,584,584,584,584,584,584,584,120,584,584,120, /* block 216 */ -939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,939, -939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,939, -939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,939, -939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,939, -939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,939, -939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,939, -939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,939, -939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,939, +583,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578, +578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578, +578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578, +578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578, +578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578, +578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578, +578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578, +578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578, /* block 217 */ -939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,939, -939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,939, -939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,939, -939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,939, -939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,939, -939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,939, -939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,939, -939,939,939,939,939,939,939,939,939,939,939,939,120,120,120,120, +578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578, +578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578, +578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578, +578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578, +578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578, +578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578, +578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578, +578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578, /* block 218 */ -940,940,940,940,940,940,940,940,940,940,940,940,940,940,940,940, -940,940,940,940,940,940,940,940,940,940,940,940,940,940,940,940, -940,940,940,940,940,940,940,940,940,940,940,940,940,940,940,940, -940,940,940,940,940,940,940,940,940,940,940,940,940,940,940,940, -940,940,940,940,940,940,940,940,940,940,940,940,940,940,940,940, -940,940,940,940,940,940,940,940,940,940,940,940,940,940,940,940, -940,940,940,940,940,940,940,940,940,940,940,120,120,120,120,120, -940,940,940,940,940,940,940,940,940,940,940,940,940,120,120,120, +578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578, +578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578, +583,583,583,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +578,578,578,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,583,583,583,583,120,120,120,120,120,120,120,120, +959,959,959,959,959,959,959,959,959,959,959,959,959,959,959,959, /* block 219 */ -940,940,940,940,940,940,940,940,940,120,120,120,120,120,120,120, -940,940,940,940,940,940,940,940,940,940,120,120,941,942,942,943, -944,944,944,944,120,120,120,120,120,120,120,120,120,120,120,120, +959,959,959,959,959,959,959,959,959,959,959,959,959,959,959,959, +959,959,959,959,959,959,959,959,959,959,959,959,959,959,959,959, +959,959,959,959,959,959,959,959,959,959,959,959,959,959,959,959, +959,959,959,959,959,959,959,959,959,959,959,959,959,959,959,959, +959,959,959,959,959,959,959,959,959,959,959,959,959,959,959,959, +959,959,959,959,959,959,959,959,959,959,959,959,959,959,959,959, +959,959,959,959,959,959,959,959,959,959,959,959,959,959,959,959, +959,959,959,959,959,959,959,959,959,959,959,959,959,959,959,959, + +/* block 220 */ +959,959,959,959,959,959,959,959,959,959,959,959,959,959,959,959, +959,959,959,959,959,959,959,959,959,959,959,959,959,959,959,959, +959,959,959,959,959,959,959,959,959,959,959,959,959,959,959,959, +959,959,959,959,959,959,959,959,959,959,959,959,959,959,959,959, +959,959,959,959,959,959,959,959,959,959,959,959,959,959,959,959, +959,959,959,959,959,959,959,959,959,959,959,959,959,959,959,959, +959,959,959,959,959,959,959,959,959,959,959,959,959,959,959,959, +959,959,959,959,959,959,959,959,959,959,959,959,120,120,120,120, + +/* block 221 */ +960,960,960,960,960,960,960,960,960,960,960,960,960,960,960,960, +960,960,960,960,960,960,960,960,960,960,960,960,960,960,960,960, +960,960,960,960,960,960,960,960,960,960,960,960,960,960,960,960, +960,960,960,960,960,960,960,960,960,960,960,960,960,960,960,960, +960,960,960,960,960,960,960,960,960,960,960,960,960,960,960,960, +960,960,960,960,960,960,960,960,960,960,960,960,960,960,960,960, +960,960,960,960,960,960,960,960,960,960,960,120,120,120,120,120, +960,960,960,960,960,960,960,960,960,960,960,960,960,120,120,120, + +/* block 222 */ +960,960,960,960,960,960,960,960,960,120,120,120,120,120,120,120, +960,960,960,960,960,960,960,960,960,960,120,120,961,962,962,963, +964,964,964,964,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -/* block 220 */ +/* block 223 */ +113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113, +113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113, +113,113,113,113,113,113,113,113,113,113,113,113,113,113,120,120, +113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113, +113,113,113,113,113,113,113,120,120,120,120,120,120,120,120,120, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + +/* block 224 */ + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, + +/* block 225 */ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, @@ -3928,37 +4004,37 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,120,120,120,120,120,120,120,120,120,120, -/* block 221 */ +/* block 226 */ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,120,120, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20,945,946,113,113,113, 20, 20, 20,946,945,945, -945,945,945, 24, 24, 24, 24, 24, 24, 24, 24,113,113,113,113,113, + 20, 20, 20, 20, 20,965,966,113,113,113, 20, 20, 20,966,965,965, +965,965,965, 24, 24, 24, 24, 24, 24, 24, 24,113,113,113,113,113, -/* block 222 */ +/* block 227 */ 113,113,113, 20, 20,113,113,113,113,113,113,113, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,113,113,113,113, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20,120,120,120,120,120,120,120, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -/* block 223 */ -685,685,685,685,685,685,685,685,685,685,685,685,685,685,685,685, -685,685,685,685,685,685,685,685,685,685,685,685,685,685,685,685, -685,685,685,685,685,685,685,685,685,685,685,685,685,685,685,685, -685,685,685,685,685,685,685,685,685,685,685,685,685,685,685,685, -685,685,947,947,947,685,120,120,120,120,120,120,120,120,120,120, +/* block 228 */ +692,692,692,692,692,692,692,692,692,692,692,692,692,692,692,692, +692,692,692,692,692,692,692,692,692,692,692,692,692,692,692,692, +692,692,692,692,692,692,692,692,692,692,692,692,692,692,692,692, +692,692,692,692,692,692,692,692,692,692,692,692,692,692,692,692, +692,692,967,967,967,692,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -/* block 224 */ +/* block 229 */ 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, @@ -3968,187 +4044,207 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,120,120,120,120,120,120,120,120,120,120,120,120, -/* block 225 */ +/* block 230 */ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,120,120,120,120,120,120,120,120,120, -582,582,582,582,582,582,582,582,582,582,582,582,582,582,582,582, -582,582, 25, 25, 25, 25, 25, 25, 25,120,120,120,120,120,120,120, - -/* block 226 */ -513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,513, -513,513,513,513,513,513,513,513,513,513,514,514,514,514,514,514, -514,514,514,514,514,514,514,514,514,514,514,514,514,514,514,514, -514,514,514,514,513,513,513,513,513,513,513,513,513,513,513,513, -513,513,513,513,513,513,513,513,513,513,513,513,513,513,514,514, -514,514,514,514,514,120,514,514,514,514,514,514,514,514,514,514, -514,514,514,514,514,514,514,514,513,513,513,513,513,513,513,513, -513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,513, - -/* block 227 */ -513,513,514,514,514,514,514,514,514,514,514,514,514,514,514,514, -514,514,514,514,514,514,514,514,514,514,514,514,513,120,513,513, -120,120,513,120,120,513,513,120,120,513,513,513,513,120,513,513, -513,513,513,513,513,513,514,514,514,514,120,514,120,514,514,514, -514,514,514,514,120,514,514,514,514,514,514,514,514,514,514,514, -513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,513, -513,513,513,513,513,513,513,513,513,513,514,514,514,514,514,514, -514,514,514,514,514,514,514,514,514,514,514,514,514,514,514,514, - -/* block 228 */ -514,514,514,514,513,513,120,513,513,513,513,120,120,513,513,513, -513,513,513,513,513,120,513,513,513,513,513,513,513,120,514,514, -514,514,514,514,514,514,514,514,514,514,514,514,514,514,514,514, -514,514,514,514,514,514,514,514,513,513,120,513,513,513,513,120, -513,513,513,513,513,120,513,120,120,120,513,513,513,513,513,513, -513,120,514,514,514,514,514,514,514,514,514,514,514,514,514,514, -514,514,514,514,514,514,514,514,514,514,514,514,513,513,513,513, -513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,513, - -/* block 229 */ -513,513,513,513,513,513,514,514,514,514,514,514,514,514,514,514, -514,514,514,514,514,514,514,514,514,514,514,514,514,514,514,514, -513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,513, -513,513,513,513,513,513,513,513,513,513,514,514,514,514,514,514, -514,514,514,514,514,514,514,514,514,514,514,514,514,514,514,514, -514,514,514,514,513,513,513,513,513,513,513,513,513,513,513,513, -513,513,513,513,513,513,513,513,513,513,513,513,513,513,514,514, -514,514,514,514,514,514,514,514,514,514,514,514,514,514,514,514, - -/* block 230 */ -514,514,514,514,514,514,514,514,513,513,513,513,513,513,513,513, -513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,513, -513,513,514,514,514,514,514,514,514,514,514,514,514,514,514,514, -514,514,514,514,514,514,514,514,514,514,514,514,513,513,513,513, -513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,513, -513,513,513,513,513,513,514,514,514,514,514,514,514,514,514,514, -514,514,514,514,514,514,514,514,514,514,514,514,514,514,514,514, -513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,513, +587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,587, +587,587, 25, 25, 25, 25, 25, 25, 25,120,120,120,120,120,120,120, /* block 231 */ -513,513,513,513,513,513,513,513,513,513,514,514,514,514,514,514, -514,514,514,514,514,514,514,514,514,514,514,514,514,514,514,514, -514,514,514,514,514,514,120,120,513,513,513,513,513,513,513,513, -513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,513, -513, 9,514,514,514,514,514,514,514,514,514,514,514,514,514,514, -514,514,514,514,514,514,514,514,514,514,514, 9,514,514,514,514, -514,514,513,513,513,513,513,513,513,513,513,513,513,513,513,513, -513,513,513,513,513,513,513,513,513,513,513, 9,514,514,514,514, +518,518,518,518,518,518,518,518,518,518,518,518,518,518,518,518, +518,518,518,518,518,518,518,518,518,518,519,519,519,519,519,519, +519,519,519,519,519,519,519,519,519,519,519,519,519,519,519,519, +519,519,519,519,518,518,518,518,518,518,518,518,518,518,518,518, +518,518,518,518,518,518,518,518,518,518,518,518,518,518,519,519, +519,519,519,519,519,120,519,519,519,519,519,519,519,519,519,519, +519,519,519,519,519,519,519,519,518,518,518,518,518,518,518,518, +518,518,518,518,518,518,518,518,518,518,518,518,518,518,518,518, /* block 232 */ -514,514,514,514,514,514,514,514,514,514,514,514,514,514,514,514, -514,514,514,514,514, 9,514,514,514,514,514,514,513,513,513,513, -513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,513, -513,513,513,513,513, 9,514,514,514,514,514,514,514,514,514,514, -514,514,514,514,514,514,514,514,514,514,514,514,514,514,514, 9, -514,514,514,514,514,514,513,513,513,513,513,513,513,513,513,513, -513,513,513,513,513,513,513,513,513,513,513,513,513,513,513, 9, -514,514,514,514,514,514,514,514,514,514,514,514,514,514,514,514, +518,518,519,519,519,519,519,519,519,519,519,519,519,519,519,519, +519,519,519,519,519,519,519,519,519,519,519,519,518,120,518,518, +120,120,518,120,120,518,518,120,120,518,518,518,518,120,518,518, +518,518,518,518,518,518,519,519,519,519,120,519,120,519,519,519, +519,519,519,519,120,519,519,519,519,519,519,519,519,519,519,519, +518,518,518,518,518,518,518,518,518,518,518,518,518,518,518,518, +518,518,518,518,518,518,518,518,518,518,519,519,519,519,519,519, +519,519,519,519,519,519,519,519,519,519,519,519,519,519,519,519, /* block 233 */ -514,514,514,514,514,514,514,514,514, 9,514,514,514,514,514,514, -513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,513, -513,513,513,513,513,513,513,513,513, 9,514,514,514,514,514,514, -514,514,514,514,514,514,514,514,514,514,514,514,514,514,514,514, -514,514,514, 9,514,514,514,514,514,514,513,514,120,120, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, +519,519,519,519,518,518,120,518,518,518,518,120,120,518,518,518, +518,518,518,518,518,120,518,518,518,518,518,518,518,120,519,519, +519,519,519,519,519,519,519,519,519,519,519,519,519,519,519,519, +519,519,519,519,519,519,519,519,518,518,120,518,518,518,518,120, +518,518,518,518,518,120,518,120,120,120,518,518,518,518,518,518, +518,120,519,519,519,519,519,519,519,519,519,519,519,519,519,519, +519,519,519,519,519,519,519,519,519,519,519,519,518,518,518,518, +518,518,518,518,518,518,518,518,518,518,518,518,518,518,518,518, /* block 234 */ -948,948,948,948,948,948,948,948,948,948,948,948,948,948,948,948, -948,948,948,948,948,948,948,948,948,948,948,948,948,948,948,948, -948,948,948,948,948,948,948,948,948,948,948,948,948,948,948,948, -948,948,948,948,948,948,948,948,948,948,948,948,948,948,948,948, -948,948,948,948,948,948,948,948,948,948,948,948,948,948,948,948, -948,948,948,948,948,948,948,948,948,948,948,948,948,948,948,948, -948,948,948,948,948,948,948,948,948,948,948,948,948,948,948,948, -948,948,948,948,948,948,948,948,948,948,948,948,948,948,948,948, +518,518,518,518,518,518,519,519,519,519,519,519,519,519,519,519, +519,519,519,519,519,519,519,519,519,519,519,519,519,519,519,519, +518,518,518,518,518,518,518,518,518,518,518,518,518,518,518,518, +518,518,518,518,518,518,518,518,518,518,519,519,519,519,519,519, +519,519,519,519,519,519,519,519,519,519,519,519,519,519,519,519, +519,519,519,519,518,518,518,518,518,518,518,518,518,518,518,518, +518,518,518,518,518,518,518,518,518,518,518,518,518,518,519,519, +519,519,519,519,519,519,519,519,519,519,519,519,519,519,519,519, /* block 235 */ -949,949,949,949,949,949,949,949,949,949,949,949,949,949,949,949, -949,949,949,949,949,949,949,949,949,949,949,949,949,949,949,949, -949,949,949,949,949,949,949,949,949,949,949,949,949,949,949,949, -949,949,949,949,949,949,949,948,948,948,948,949,949,949,949,949, -949,949,949,949,949,949,949,949,949,949,949,949,949,949,949,949, -949,949,949,949,949,949,949,949,949,949,949,949,949,949,949,949, -949,949,949,949,949,949,949,949,949,949,949,949,949,948,948,948, -948,948,948,948,948,949,948,948,948,948,948,948,948,948,948,948, +519,519,519,519,519,519,519,519,518,518,518,518,518,518,518,518, +518,518,518,518,518,518,518,518,518,518,518,518,518,518,518,518, +518,518,519,519,519,519,519,519,519,519,519,519,519,519,519,519, +519,519,519,519,519,519,519,519,519,519,519,519,518,518,518,518, +518,518,518,518,518,518,518,518,518,518,518,518,518,518,518,518, +518,518,518,518,518,518,519,519,519,519,519,519,519,519,519,519, +519,519,519,519,519,519,519,519,519,519,519,519,519,519,519,519, +518,518,518,518,518,518,518,518,518,518,518,518,518,518,518,518, /* block 236 */ -948,948,948,948,949,948,948,950,950,950,950,950,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,949,949,949,949,949, -120,949,949,949,949,949,949,949,949,949,949,949,949,949,949,949, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +518,518,518,518,518,518,518,518,518,518,519,519,519,519,519,519, +519,519,519,519,519,519,519,519,519,519,519,519,519,519,519,519, +519,519,519,519,519,519,120,120,518,518,518,518,518,518,518,518, +518,518,518,518,518,518,518,518,518,518,518,518,518,518,518,518, +518, 9,519,519,519,519,519,519,519,519,519,519,519,519,519,519, +519,519,519,519,519,519,519,519,519,519,519, 9,519,519,519,519, +519,519,518,518,518,518,518,518,518,518,518,518,518,518,518,518, +518,518,518,518,518,518,518,518,518,518,518, 9,519,519,519,519, /* block 237 */ -951,951,951,951,951,951,951,120,951,951,951,951,951,951,951,951, -951,951,951,951,951,951,951,951,951,120,120,951,951,951,951,951, -951,951,120,951,951,120,951,951,951,951,951,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +519,519,519,519,519,519,519,519,519,519,519,519,519,519,519,519, +519,519,519,519,519, 9,519,519,519,519,519,519,518,518,518,518, +518,518,518,518,518,518,518,518,518,518,518,518,518,518,518,518, +518,518,518,518,518, 9,519,519,519,519,519,519,519,519,519,519, +519,519,519,519,519,519,519,519,519,519,519,519,519,519,519, 9, +519,519,519,519,519,519,518,518,518,518,518,518,518,518,518,518, +518,518,518,518,518,518,518,518,518,518,518,518,518,518,518, 9, +519,519,519,519,519,519,519,519,519,519,519,519,519,519,519,519, /* block 238 */ -952,952,952,952,952,952,952,952,952,952,952,952,952,952,952,952, -952,952,952,952,952,952,952,952,952,952,952,952,952,952,952,952, -952,952,952,952,952,952,952,952,952,952,952,952,952,120,120,120, -953,953,953,953,953,953,953,954,954,954,954,954,954,954,120,120, -955,955,955,955,955,955,955,955,955,955,120,120,120,120,952,956, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +519,519,519,519,519,519,519,519,519, 9,519,519,519,519,519,519, +518,518,518,518,518,518,518,518,518,518,518,518,518,518,518,518, +518,518,518,518,518,518,518,518,518, 9,519,519,519,519,519,519, +519,519,519,519,519,519,519,519,519,519,519,519,519,519,519,519, +519,519,519, 9,519,519,519,519,519,519,518,519,120,120, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, /* block 239 */ -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -957,957,957,957,957,957,957,957,957,957,957,957,957,957,957,957, -957,957,957,957,957,957,957,957,957,957,957,957,957,957,957,957, -957,957,957,957,957,957,957,957,957,957,957,957,958,958,958,958, -959,959,959,959,959,959,959,959,959,959,120,120,120,120,120,960, +968,968,968,968,968,968,968,968,968,968,968,968,968,968,968,968, +968,968,968,968,968,968,968,968,968,968,968,968,968,968,968,968, +968,968,968,968,968,968,968,968,968,968,968,968,968,968,968,968, +968,968,968,968,968,968,968,968,968,968,968,968,968,968,968,968, +968,968,968,968,968,968,968,968,968,968,968,968,968,968,968,968, +968,968,968,968,968,968,968,968,968,968,968,968,968,968,968,968, +968,968,968,968,968,968,968,968,968,968,968,968,968,968,968,968, +968,968,968,968,968,968,968,968,968,968,968,968,968,968,968,968, /* block 240 */ -961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961, -961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961, -961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961, -961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961, -961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961, -961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961, -961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961, -961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961, +969,969,969,969,969,969,969,969,969,969,969,969,969,969,969,969, +969,969,969,969,969,969,969,969,969,969,969,969,969,969,969,969, +969,969,969,969,969,969,969,969,969,969,969,969,969,969,969,969, +969,969,969,969,969,969,969,968,968,968,968,969,969,969,969,969, +969,969,969,969,969,969,969,969,969,969,969,969,969,969,969,969, +969,969,969,969,969,969,969,969,969,969,969,969,969,969,969,969, +969,969,969,969,969,969,969,969,969,969,969,969,969,968,968,968, +968,968,968,968,968,969,968,968,968,968,968,968,968,968,968,968, /* block 241 */ -961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961, -961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961, -961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961, -961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961, -961,961,961,961,961,120,120,962,962,962,962,962,962,962,962,962, -963,963,963,963,963,963,963,120,120,120,120,120,120,120,120,120, +968,968,968,968,969,968,968,970,970,970,970,970,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,969,969,969,969,969, +120,969,969,969,969,969,969,969,969,969,969,969,969,969,969,969, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, /* block 242 */ -964,964,964,964,964,964,964,964,964,964,964,964,964,964,964,964, -964,964,964,964,964,964,964,964,964,964,964,964,964,964,964,964, -964,964,965,965,965,965,965,965,965,965,965,965,965,965,965,965, -965,965,965,965,965,965,965,965,965,965,965,965,965,965,965,965, -965,965,965,965,966,966,966,966,966,966,966,967,120,120,120,120, -968,968,968,968,968,968,968,968,968,968,120,120,120,120,969,969, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 22, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, /* block 243 */ +971,971,971,971,971,971,971,120,971,971,971,971,971,971,971,971, +971,971,971,971,971,971,971,971,971,120,120,971,971,971,971,971, +971,971,120,971,971,120,971,971,971,971,971,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, + +/* block 244 */ +972,972,972,972,972,972,972,972,972,972,972,972,972,972,972,972, +972,972,972,972,972,972,972,972,972,972,972,972,972,972,972,972, +972,972,972,972,972,972,972,972,972,972,972,972,972,120,120,120, +973,973,973,973,973,973,973,974,974,974,974,974,974,974,120,120, +975,975,975,975,975,975,975,975,975,975,120,120,120,120,972,976, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, + +/* block 245 */ +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +977,977,977,977,977,977,977,977,977,977,977,977,977,977,977,977, +977,977,977,977,977,977,977,977,977,977,977,977,977,977,978,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +979,979,979,979,979,979,979,979,979,979,979,979,979,979,979,979, +979,979,979,979,979,979,979,979,979,979,979,979,979,979,979,979, +979,979,979,979,979,979,979,979,979,979,979,979,980,980,980,980, +981,981,981,981,981,981,981,981,981,981,120,120,120,120,120,982, + +/* block 246 */ +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +361,361,361,361,361,361,361,120,361,361,361,361,120,361,361,120, +361,361,361,361,361,361,361,361,361,361,361,361,361,361,361,120, + +/* block 247 */ +983,983,983,983,983,983,983,983,983,983,983,983,983,983,983,983, +983,983,983,983,983,983,983,983,983,983,983,983,983,983,983,983, +983,983,983,983,983,983,983,983,983,983,983,983,983,983,983,983, +983,983,983,983,983,983,983,983,983,983,983,983,983,983,983,983, +983,983,983,983,983,983,983,983,983,983,983,983,983,983,983,983, +983,983,983,983,983,983,983,983,983,983,983,983,983,983,983,983, +983,983,983,983,983,983,983,983,983,983,983,983,983,983,983,983, +983,983,983,983,983,983,983,983,983,983,983,983,983,983,983,983, + +/* block 248 */ +983,983,983,983,983,983,983,983,983,983,983,983,983,983,983,983, +983,983,983,983,983,983,983,983,983,983,983,983,983,983,983,983, +983,983,983,983,983,983,983,983,983,983,983,983,983,983,983,983, +983,983,983,983,983,983,983,983,983,983,983,983,983,983,983,983, +983,983,983,983,983,120,120,984,984,984,984,984,984,984,984,984, +985,985,985,985,985,985,985,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, + +/* block 249 */ +986,986,986,986,986,986,986,986,986,986,986,986,986,986,986,986, +986,986,986,986,986,986,986,986,986,986,986,986,986,986,986,986, +986,986,987,987,987,987,987,987,987,987,987,987,987,987,987,987, +987,987,987,987,987,987,987,987,987,987,987,987,987,987,987,987, +987,987,987,987,988,988,988,988,988,988,988,989,120,120,120,120, +990,990,990,990,990,990,990,990,990,990,120,120,120,120,991,991, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, + +/* block 250 */ 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, @@ -4158,7 +4254,7 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */ 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, -/* block 244 */ +/* block 251 */ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 20, 25, 25, 25, @@ -4168,7 +4264,7 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */ 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -/* block 245 */ +/* block 252 */ 120, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 20, 25, @@ -4178,47 +4274,47 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */ 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -/* block 246 */ -224,224,224,224,120,224,224,224,224,224,224,224,224,224,224,224, -224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, -120,224,224,120,224,120,120,224,120,224,224,224,224,224,224,224, -224,224,224,120,224,224,224,224,120,224,120,224,120,120,120,120, -120,120,224,120,120,120,120,224,120,224,120,224,120,224,224,224, -120,224,224,120,224,120,120,224,120,224,120,224,120,224,120,224, -120,224,224,120,224,120,120,224,224,224,224,120,224,224,224,224, -224,224,224,120,224,224,224,224,120,224,224,224,224,120,224,120, +/* block 253 */ +225,225,225,225,120,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +120,225,225,120,225,120,120,225,120,225,225,225,225,225,225,225, +225,225,225,120,225,225,225,225,120,225,120,225,120,120,120,120, +120,120,225,120,120,120,120,225,120,225,120,225,120,225,225,225, +120,225,225,120,225,120,120,225,120,225,120,225,120,225,120,225, +120,225,225,120,225,120,120,225,225,225,225,120,225,225,225,225, +225,225,225,120,225,225,225,225,120,225,225,225,225,120,225,120, -/* block 247 */ -224,224,224,224,224,224,224,224,224,224,120,224,224,224,224,224, -224,224,224,224,224,224,224,224,224,224,224,224,120,120,120,120, -120,224,224,224,120,224,224,224,224,224,120,224,224,224,224,224, -224,224,224,224,224,224,224,224,224,224,224,224,120,120,120,120, +/* block 254 */ +225,225,225,225,225,225,225,225,225,225,120,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,120,120,120,120, +120,225,225,225,120,225,225,225,225,225,120,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 217,217,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -/* block 248 */ +/* block 255 */ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,970,970,970,970, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,992,992,992,992, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, -/* block 249 */ +/* block 256 */ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21,970,970,970,970,970,970,970,970,970,970,970,970, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,970, -970, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, -970, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, -970, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21,992,992,992,992,992,992,992,992,992,992,992,992, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,992, +992, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, +992, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, +992, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21,970,970,970,970,970,970,970,970,970,970, + 21, 21, 21, 21, 21, 21,992,992,992,992,992,992,992,992,992,992, -/* block 250 */ +/* block 257 */ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 21, 21, 21, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, @@ -4228,37 +4324,37 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, 21, -/* block 251 */ +/* block 258 */ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, 20, 20, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21,970,970, -970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970, -970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970, -970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970, -970,970,970,970,970,970,971,971,971,971,971,971,971,971,971,971, -971,971,971,971,971,971,971,971,971,971,971,971,971,971,971,971, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21,992,992, +992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992, +992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992, +992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992, +992,992,992,992,992,992,993,993,993,993,993,993,993,993,993,993, +993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993, -/* block 252 */ -972, 21, 21,970,970,970,970,970,970,970,970,970,970,970,970,970, +/* block 259 */ +994, 21, 21,992,992,992,992,992,992,992,992,992,992,992,992,992, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, - 20, 20, 21, 21, 21, 21, 21, 21, 21, 21, 21, 20,970,970,970,970, - 20, 20, 20, 20, 20, 20, 20, 20, 20,970,970,970,970,970,970,970, -584,584,970,970,970,970,970,970,970,970,970,970,970,970,970,970, - 21, 21, 21, 21, 21, 21,970,970,970,970,970,970,970,970,970,970, -970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970, + 20, 20, 21, 21, 21, 21, 21, 21, 21, 21, 21, 20,992,992,992,992, + 20, 20, 20, 20, 20, 20, 20, 20, 20,992,992,992,992,992,992,992, +589,589,992,992,992,992,992,992,992,992,992,992,992,992,992,992, + 21, 21, 21, 21, 21, 21,992,992,992,992,992,992,992,992,992,992, +992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992, -/* block 253 */ -970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970, -970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970, -970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970, -970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970, -970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970, -970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970, -970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970, -970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970, +/* block 260 */ +992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992, +992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992, +992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992, +992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992, +992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992, +992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992, +992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992, +992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992, -/* block 254 */ +/* block 261 */ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, @@ -4268,7 +4364,7 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, -/* block 255 */ +/* block 262 */ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, @@ -4276,9 +4372,9 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,973,973,973,973,973, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,995,995,995,995,995, -/* block 256 */ +/* block 263 */ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, @@ -4288,85 +4384,15 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, -/* block 257 */ - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - -/* block 258 */ - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21,970,970,970,970,970,970,970,970, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,970,970,970, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,970,970,970, - -/* block 259 */ - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20,970,970,970,970,970,970,970,970,970,970,970,970, - -/* block 260 */ - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 21, 21, 21, 21,970,970,970,970,970,970,970, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,970,970,970,970, -970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970, - -/* block 261 */ - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,970,970,970,970, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20,970,970,970,970,970,970,970,970, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,970,970,970,970,970,970, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - -/* block 262 */ - 20, 20, 20, 20, 20, 20, 20, 20,970,970,970,970,970,970,970,970, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,970,970, - 21, 21,970,970,970,970,970,970,970,970,970,970,970,970,970,970, -970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970, -970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970, -970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970, -970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970, - -/* block 263 */ - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 20, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 20, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21,970, 21, 21, 21, 21, 21, 21, - /* block 264 */ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,970, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, /* block 265 */ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, @@ -4374,21 +4400,81 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21,970,970,970,970,970,970,970,970,970,970,970,970, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,970,970, - 21, 21, 21, 21, 21,970,970,970, 21, 21, 21,970,970,970,970,970, + 21, 21, 21, 21, 21, 21, 21, 21,992,992,992,992,992, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,992,992,992, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,992,992,992, /* block 266 */ - 21, 21, 21, 21, 21, 21, 21,970,970,970,970,970,970,970,970,970, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21,970,970,970,970,970,970,970, - 21, 21, 21, 21, 21, 21, 21,970,970,970,970,970,970,970,970,970, - 21, 21, 21,970,970,970,970,970,970,970,970,970,970,970,970,970, - 21, 21, 21, 21, 21, 21, 21,970,970,970,970,970,970,970,970,970, -970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970, -970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20,992,992,992,992,992,992,992,992,992,992,992,992, /* block 267 */ + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 21, 21, 21, 21,992,992,992,992,992,992,992, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,992,992,992,992, + 21,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992, + +/* block 268 */ + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,992,992,992,992, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20,992,992,992,992,992,992,992,992, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,992,992,992,992,992,992, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + +/* block 269 */ + 20, 20, 20, 20, 20, 20, 20, 20,992,992,992,992,992,992,992,992, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,992,992, + 21, 21,992,992,992,992,992,992,992,992,992,992,992,992,992,992, +992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992, +992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992, +992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992, +992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992, + +/* block 270 */ + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 20, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 20, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + +/* block 271 */ + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21,992,992,992,992,992,992,992,992,992,992,992,992, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,992,992, + 21, 21, 21, 21, 21,992,992,992, 21, 21, 21, 21, 21,992,992,992, + +/* block 272 */ + 21, 21, 21, 21, 21, 21, 21,992,992,992,992,992,992,992,992,992, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,992,992,992, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,992,992,992,992,992, + 21, 21, 21, 21, 21, 21,992,992,992,992,992,992,992,992,992,992, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,992,992,992,992,992,992, + 21, 21, 21, 21, 21, 21, 21, 21,992,992,992,992,992,992,992,992, + 21, 21, 21, 21, 21, 21, 21,992,992,992,992,992,992,992,992,992, + +/* block 273 */ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,120, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, @@ -4398,135 +4484,135 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */ 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,120,120,120,120,120,120, -/* block 268 */ -970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970, -970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970, -970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970, -970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970, -970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970, -970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970, -970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970, -970,970,970,970,970,970,970,970,970,970,970,970,970,970,120,120, - -/* block 269 */ -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, - -/* block 270 */ -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,120,120,120,120,120,120,120,120,120,120,120, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, - -/* block 271 */ -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,120,120, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, - -/* block 272 */ -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, - -/* block 273 */ -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, - /* block 274 */ -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992, +992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992, +992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992, +992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992, +992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992, +992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992, +992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992, +992,992,992,992,992,992,992,992,992,992,992,992,992,992,120,120, /* block 275 */ -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, /* block 276 */ -511, 24,511,511,511,511,511,511,511,511,511,511,511,511,511,511, -511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511, -974,974,974,974,974,974,974,974,974,974,974,974,974,974,974,974, -974,974,974,974,974,974,974,974,974,974,974,974,974,974,974,974, -974,974,974,974,974,974,974,974,974,974,974,974,974,974,974,974, -974,974,974,974,974,974,974,974,974,974,974,974,974,974,974,974, -974,974,974,974,974,974,974,974,974,974,974,974,974,974,974,974, -974,974,974,974,974,974,974,974,974,974,974,974,974,974,974,974, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, +591,591,591,591,591,591,591,591,591,120,120,120,120,120,120,120, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, /* block 277 */ -511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511, -511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511, -511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511, -511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511, -511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511, -511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511, -511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511, -511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,120,120, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, /* block 278 */ -113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113, -113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113, -113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113, -113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113, -113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113, -113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113, -113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113, -113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, +591,591,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, /* block 279 */ -113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113, -113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113, -113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113, -113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113, -113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113, -113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113, -113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113, -511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, +591,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, /* block 280 */ -673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673, -673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673, -673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673, -673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673, -673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673, -673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673, -673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673, -673,673,673,673,673,673,673,673,673,673,673,673,673,673,120,120, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, + +/* block 281 */ +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, +591,591,591,591,591,591,591,591,591,591,591,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, + +/* block 282 */ +516, 24,516,516,516,516,516,516,516,516,516,516,516,516,516,516, +516,516,516,516,516,516,516,516,516,516,516,516,516,516,516,516, +996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996, +996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996, +996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996, +996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996, +996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996, +996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996, + +/* block 283 */ +516,516,516,516,516,516,516,516,516,516,516,516,516,516,516,516, +516,516,516,516,516,516,516,516,516,516,516,516,516,516,516,516, +516,516,516,516,516,516,516,516,516,516,516,516,516,516,516,516, +516,516,516,516,516,516,516,516,516,516,516,516,516,516,516,516, +516,516,516,516,516,516,516,516,516,516,516,516,516,516,516,516, +516,516,516,516,516,516,516,516,516,516,516,516,516,516,516,516, +516,516,516,516,516,516,516,516,516,516,516,516,516,516,516,516, +516,516,516,516,516,516,516,516,516,516,516,516,516,516,516,516, + +/* block 284 */ +113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113, +113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113, +113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113, +113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113, +113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113, +113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113, +113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113, +113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113, + +/* block 285 */ +113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113, +113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113, +113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113, +113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113, +113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113, +113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113, +113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113, +516,516,516,516,516,516,516,516,516,516,516,516,516,516,516,516, + +/* block 286 */ +678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678, +678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678, +678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678, +678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678, +678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678, +678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678, +678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678, +678,678,678,678,678,678,678,678,678,678,678,678,678,678,120,120, }; diff --git a/src/3rdparty/pcre2/src/pcre2_ucp.h b/src/3rdparty/pcre2/src/pcre2_ucp.h index 9538062c..d84f269e 100644 --- a/src/3rdparty/pcre2/src/pcre2_ucp.h +++ b/src/3rdparty/pcre2/src/pcre2_ucp.h @@ -291,7 +291,13 @@ enum { ucp_Chorasmian, ucp_Dives_Akuru, ucp_Khitan_Small_Script, - ucp_Yezidi + ucp_Yezidi, + /* New for Unicode 14.0.0 */ + ucp_Cypro_Minoan, + ucp_Old_Uyghur, + ucp_Tangsa, + ucp_Toto, + ucp_Vithkuqi }; #endif /* PCRE2_UCP_H_IDEMPOTENT_GUARD */ diff --git a/src/3rdparty/pcre2/src/sljit/sljitConfigInternal.h b/src/3rdparty/pcre2/src/sljit/sljitConfigInternal.h index eb1132db..7bb9990a 100644 --- a/src/3rdparty/pcre2/src/sljit/sljitConfigInternal.h +++ b/src/3rdparty/pcre2/src/sljit/sljitConfigInternal.h @@ -158,6 +158,8 @@ extern "C" { #define SLJIT_CONFIG_MIPS_64 1 #elif defined(__sparc__) || defined(__sparc) #define SLJIT_CONFIG_SPARC_32 1 +#elif defined(__s390x__) +#define SLJIT_CONFIG_S390X 1 #else /* Unsupported architecture */ #define SLJIT_CONFIG_UNSUPPORTED 1 @@ -759,6 +761,18 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_sw sljit_exec_offset(void* ptr); #define SLJIT_NUMBER_OF_SCRATCH_FLOAT_REGISTERS \ (SLJIT_NUMBER_OF_FLOAT_REGISTERS - SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS) +/********************************/ +/* CPU status flags management. */ +/********************************/ + +#if (defined SLJIT_CONFIG_ARM_32 && SLJIT_CONFIG_ARM_32) \ + || (defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64) \ + || (defined SLJIT_CONFIG_MIPS && SLJIT_CONFIG_MIPS) \ + || (defined SLJIT_CONFIG_SPARC && SLJIT_CONFIG_SPARC) \ + || (defined SLJIT_CONFIG_S390X && SLJIT_CONFIG_S390X) +#define SLJIT_HAS_STATUS_FLAGS_STATE 1 +#endif + /*************************************/ /* Debug and verbose related macros. */ /*************************************/ diff --git a/src/3rdparty/pcre2/src/sljit/sljitExecAllocator.c b/src/3rdparty/pcre2/src/sljit/sljitExecAllocator.c index 61a32f23..6e5bf78e 100644 --- a/src/3rdparty/pcre2/src/sljit/sljitExecAllocator.c +++ b/src/3rdparty/pcre2/src/sljit/sljitExecAllocator.c @@ -79,6 +79,7 @@ */ #ifdef _WIN32 +#define SLJIT_UPDATE_WX_FLAGS(from, to, enable_exec) static SLJIT_INLINE void* alloc_chunk(sljit_uw size) { @@ -91,96 +92,108 @@ static SLJIT_INLINE void free_chunk(void *chunk, sljit_uw size) VirtualFree(chunk, 0, MEM_RELEASE); } -#else - -#ifdef __APPLE__ -#ifdef MAP_ANON -/* Configures TARGET_OS_OSX when appropriate */ -#include - -#if TARGET_OS_OSX && defined(MAP_JIT) -#include -#endif /* TARGET_OS_OSX && MAP_JIT */ - -#ifdef MAP_JIT +#else /* POSIX */ +#if defined(__APPLE__) && defined(MAP_JIT) /* On macOS systems, returns MAP_JIT if it is defined _and_ we're running on a - version where it's OK to have more than one JIT block. + version where it's OK to have more than one JIT block or where MAP_JIT is + required. On non-macOS systems, returns MAP_JIT if it is defined. */ +#include +#if TARGET_OS_OSX +#if defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86 +#ifdef MAP_ANON +#include +#include + +#define SLJIT_MAP_JIT (get_map_jit_flag()) + static SLJIT_INLINE int get_map_jit_flag() { -#if TARGET_OS_OSX - sljit_sw page_size = get_page_alignment() + 1; + sljit_sw page_size; void *ptr; + struct utsname name; static int map_jit_flag = -1; - /* - The following code is thread safe because multiple initialization - sets map_jit_flag to the same value and the code has no side-effects. - Changing the kernel version witout system restart is (very) unlikely. - */ - if (map_jit_flag == -1) { - struct utsname name; - + if (map_jit_flag < 0) { map_jit_flag = 0; uname(&name); - /* Kernel version for 10.14.0 (Mojave) */ + /* Kernel version for 10.14.0 (Mojave) or later */ if (atoi(name.release) >= 18) { + page_size = get_page_alignment() + 1; /* Only use MAP_JIT if a hardened runtime is used */ + ptr = mmap(NULL, page_size, PROT_WRITE | PROT_EXEC, + MAP_PRIVATE | MAP_ANON, -1, 0); - ptr = mmap(NULL, page_size, PROT_WRITE | PROT_EXEC, MAP_PRIVATE | MAP_ANON, -1, 0); - - if (ptr == MAP_FAILED) { - map_jit_flag = MAP_JIT; - } else { + if (ptr != MAP_FAILED) munmap(ptr, page_size); - } + else + map_jit_flag = MAP_JIT; } } - return map_jit_flag; -#else /* !TARGET_OS_OSX */ - return MAP_JIT; -#endif /* TARGET_OS_OSX */ } - -#endif /* MAP_JIT */ #endif /* MAP_ANON */ -#endif /* __APPLE__ */ +#else /* !SLJIT_CONFIG_X86 */ +#if !(defined SLJIT_CONFIG_ARM && SLJIT_CONFIG_ARM) +#error Unsupported architecture +#endif /* SLJIT_CONFIG_ARM */ +#include + +#define SLJIT_MAP_JIT (MAP_JIT) +#define SLJIT_UPDATE_WX_FLAGS(from, to, enable_exec) \ + apple_update_wx_flags(enable_exec) + +static SLJIT_INLINE void apple_update_wx_flags(sljit_s32 enable_exec) +{ + pthread_jit_write_protect_np(enable_exec); +} +#endif /* SLJIT_CONFIG_X86 */ +#else /* !TARGET_OS_OSX */ +#define SLJIT_MAP_JIT (MAP_JIT) +#endif /* TARGET_OS_OSX */ +#endif /* __APPLE__ && MAP_JIT */ +#ifndef SLJIT_UPDATE_WX_FLAGS +#define SLJIT_UPDATE_WX_FLAGS(from, to, enable_exec) +#endif /* !SLJIT_UPDATE_WX_FLAGS */ +#ifndef SLJIT_MAP_JIT +#define SLJIT_MAP_JIT (0) +#endif /* !SLJIT_MAP_JIT */ static SLJIT_INLINE void* alloc_chunk(sljit_uw size) { void *retval; - const int prot = PROT_READ | PROT_WRITE | PROT_EXEC; + int prot = PROT_READ | PROT_WRITE | PROT_EXEC; + int flags = MAP_PRIVATE; + int fd = -1; -#ifdef MAP_ANON - - int flags = MAP_PRIVATE | MAP_ANON; - -#ifdef MAP_JIT - flags |= get_map_jit_flag(); +#ifdef PROT_MAX + prot |= PROT_MAX(prot); #endif - retval = mmap(NULL, size, prot, flags, -1, 0); +#ifdef MAP_ANON + flags |= MAP_ANON | SLJIT_MAP_JIT; #else /* !MAP_ANON */ if (SLJIT_UNLIKELY((dev_zero < 0) && open_dev_zero())) return NULL; - retval = mmap(NULL, size, prot, MAP_PRIVATE, dev_zero, 0); + fd = dev_zero; #endif /* MAP_ANON */ + retval = mmap(NULL, size, prot, flags, fd, 0); if (retval == MAP_FAILED) - retval = NULL; - else { - if (mprotect(retval, size, prot) < 0) { - munmap(retval, size); - retval = NULL; - } + return NULL; + + if (mprotect(retval, size, PROT_READ | PROT_WRITE | PROT_EXEC) < 0) { + munmap(retval, size); + return NULL; } + SLJIT_UPDATE_WX_FLAGS(retval, (uint8_t *)retval + size, 0); + return retval; } @@ -189,7 +202,7 @@ static SLJIT_INLINE void free_chunk(void *chunk, sljit_uw size) munmap(chunk, size); } -#endif +#endif /* windows */ /* --------------------------------------------------------------------- */ /* Common functions */ @@ -261,6 +274,7 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_malloc_exec(sljit_uw size) while (free_block) { if (free_block->size >= size) { chunk_size = free_block->size; + SLJIT_UPDATE_WX_FLAGS(NULL, NULL, 0); if (chunk_size > size + 64) { /* We just cut a block from the end of the free block. */ chunk_size -= size; @@ -326,6 +340,7 @@ SLJIT_API_FUNC_ATTRIBUTE void sljit_free_exec(void* ptr) allocated_size -= header->size; /* Connecting free blocks together if possible. */ + SLJIT_UPDATE_WX_FLAGS(NULL, NULL, 0); /* If header->prev_size == 0, free_block will equal to header. In this case, free_block->header.size will be > 0. */ @@ -358,6 +373,7 @@ SLJIT_API_FUNC_ATTRIBUTE void sljit_free_exec(void* ptr) } } + SLJIT_UPDATE_WX_FLAGS(NULL, NULL, 1); SLJIT_ALLOCATOR_UNLOCK(); } @@ -367,6 +383,7 @@ SLJIT_API_FUNC_ATTRIBUTE void sljit_free_unused_memory_exec(void) struct free_block* next_free_block; SLJIT_ALLOCATOR_LOCK(); + SLJIT_UPDATE_WX_FLAGS(NULL, NULL, 0); free_block = free_blocks; while (free_block) { @@ -381,5 +398,6 @@ SLJIT_API_FUNC_ATTRIBUTE void sljit_free_unused_memory_exec(void) } SLJIT_ASSERT((total_size && free_blocks) || (!total_size && !free_blocks)); + SLJIT_UPDATE_WX_FLAGS(NULL, NULL, 1); SLJIT_ALLOCATOR_UNLOCK(); } diff --git a/src/3rdparty/pcre2/src/sljit/sljitLir.c b/src/3rdparty/pcre2/src/sljit/sljitLir.c index d817c90b..a24a99ab 100644 --- a/src/3rdparty/pcre2/src/sljit/sljitLir.c +++ b/src/3rdparty/pcre2/src/sljit/sljitLir.c @@ -532,13 +532,21 @@ SLJIT_API_FUNC_ATTRIBUTE void sljit_set_put_label(struct sljit_put_label *put_la put_label->label = label; } +#define SLJIT_CURRENT_FLAGS_ALL \ + (SLJIT_CURRENT_FLAGS_I32_OP | SLJIT_CURRENT_FLAGS_ADD_SUB | SLJIT_CURRENT_FLAGS_COMPARE) + SLJIT_API_FUNC_ATTRIBUTE void sljit_set_current_flags(struct sljit_compiler *compiler, sljit_s32 current_flags) { SLJIT_UNUSED_ARG(compiler); SLJIT_UNUSED_ARG(current_flags); +#if (defined SLJIT_HAS_STATUS_FLAGS_STATE && SLJIT_HAS_STATUS_FLAGS_STATE) + compiler->status_flags_state = current_flags; +#endif + #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) - if ((current_flags & ~(VARIABLE_FLAG_MASK | SLJIT_I32_OP | SLJIT_SET_Z)) == 0) { + compiler->last_flags = 0; + if ((current_flags & ~(VARIABLE_FLAG_MASK | SLJIT_SET_Z | SLJIT_CURRENT_FLAGS_ALL)) == 0) { compiler->last_flags = GET_FLAG_TYPE(current_flags) | (current_flags & (SLJIT_I32_OP | SLJIT_SET_Z)); } #endif @@ -968,7 +976,7 @@ static const char* fop2_names[] = { }; #define JUMP_POSTFIX(type) \ - ((type & 0xff) <= SLJIT_MUL_NOT_OVERFLOW ? ((type & SLJIT_I32_OP) ? "32" : "") \ + ((type & 0xff) <= SLJIT_NOT_OVERFLOW ? ((type & SLJIT_I32_OP) ? "32" : "") \ : ((type & 0xff) <= SLJIT_ORDERED_F64 ? ((type & SLJIT_F32_OP) ? ".f32" : ".f64") : "")) static char* jump_names[] = { @@ -978,7 +986,6 @@ static char* jump_names[] = { (char*)"sig_less", (char*)"sig_greater_equal", (char*)"sig_greater", (char*)"sig_less_equal", (char*)"overflow", (char*)"not_overflow", - (char*)"mul_overflow", (char*)"mul_not_overflow", (char*)"carry", (char*)"", (char*)"equal", (char*)"not_equal", (char*)"less", (char*)"greater_equal", @@ -1278,7 +1285,7 @@ static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_op2(struct sljit_compiler case SLJIT_MUL: CHECK_ARGUMENT(!(op & SLJIT_SET_Z)); CHECK_ARGUMENT(!(op & VARIABLE_FLAG_MASK) - || GET_FLAG_TYPE(op) == SLJIT_MUL_OVERFLOW); + || GET_FLAG_TYPE(op) == SLJIT_OVERFLOW); break; case SLJIT_ADD: CHECK_ARGUMENT(!(op & VARIABLE_FLAG_MASK) @@ -1601,9 +1608,7 @@ static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_jump(struct sljit_compile CHECK_ARGUMENT(compiler->last_flags & SLJIT_SET_Z); else CHECK_ARGUMENT((type & 0xff) == (compiler->last_flags & 0xff) - || ((type & 0xff) == SLJIT_NOT_OVERFLOW && (compiler->last_flags & 0xff) == SLJIT_OVERFLOW) - || ((type & 0xff) == SLJIT_MUL_NOT_OVERFLOW && (compiler->last_flags & 0xff) == SLJIT_MUL_OVERFLOW)); - CHECK_ARGUMENT((type & SLJIT_I32_OP) == (compiler->last_flags & SLJIT_I32_OP)); + || ((type & 0xff) == SLJIT_NOT_OVERFLOW && (compiler->last_flags & 0xff) == SLJIT_OVERFLOW)); } #endif #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) @@ -1818,8 +1823,7 @@ static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_op_flags(struct sljit_com CHECK_ARGUMENT(compiler->last_flags & SLJIT_SET_Z); else CHECK_ARGUMENT((type & 0xff) == (compiler->last_flags & 0xff) - || ((type & 0xff) == SLJIT_NOT_OVERFLOW && (compiler->last_flags & 0xff) == SLJIT_OVERFLOW) - || ((type & 0xff) == SLJIT_MUL_NOT_OVERFLOW && (compiler->last_flags & 0xff) == SLJIT_MUL_OVERFLOW)); + || ((type & 0xff) == SLJIT_NOT_OVERFLOW && (compiler->last_flags & 0xff) == SLJIT_OVERFLOW)); FUNCTION_CHECK_DST(dst, dstw, 0); @@ -1858,8 +1862,7 @@ static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_cmov(struct sljit_compile CHECK_ARGUMENT(compiler->last_flags & SLJIT_SET_Z); else CHECK_ARGUMENT((type & 0xff) == (compiler->last_flags & 0xff) - || ((type & 0xff) == SLJIT_NOT_OVERFLOW && (compiler->last_flags & 0xff) == SLJIT_OVERFLOW) - || ((type & 0xff) == SLJIT_MUL_NOT_OVERFLOW && (compiler->last_flags & 0xff) == SLJIT_MUL_OVERFLOW)); + || ((type & 0xff) == SLJIT_NOT_OVERFLOW && (compiler->last_flags & 0xff) == SLJIT_OVERFLOW)); #endif #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) if (SLJIT_UNLIKELY(!!compiler->verbose)) { diff --git a/src/3rdparty/pcre2/src/sljit/sljitLir.h b/src/3rdparty/pcre2/src/sljit/sljitLir.h index 93d28046..0eb62fc2 100644 --- a/src/3rdparty/pcre2/src/sljit/sljitLir.h +++ b/src/3rdparty/pcre2/src/sljit/sljitLir.h @@ -412,6 +412,10 @@ struct sljit_compiler { /* Executable size for statistical purposes. */ sljit_uw executable_size; +#if (defined SLJIT_HAS_STATUS_FLAGS_STATE && SLJIT_HAS_STATUS_FLAGS_STATE) + sljit_s32 status_flags_state; +#endif + #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) sljit_s32 args; sljit_s32 locals_offset; @@ -460,7 +464,7 @@ struct sljit_compiler { #if (defined SLJIT_CONFIG_S390X && SLJIT_CONFIG_S390X) /* Need to allocate register save area to make calls. */ - sljit_s32 have_save_area; + sljit_s32 mode; #endif #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) @@ -996,7 +1000,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op1(struct sljit_compiler *compile #define SLJIT_SUBC (SLJIT_OP2_BASE + 3) #define SLJIT_SUBC32 (SLJIT_SUBC | SLJIT_I32_OP) /* Note: integer mul - Flags: MUL_OVERFLOW */ + Flags: OVERFLOW */ #define SLJIT_MUL (SLJIT_OP2_BASE + 4) #define SLJIT_MUL32 (SLJIT_MUL | SLJIT_I32_OP) /* Flags: Z */ @@ -1141,89 +1145,69 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_label* sljit_emit_label(struct sljit_compi /* Integer comparison types. */ #define SLJIT_EQUAL 0 -#define SLJIT_EQUAL32 (SLJIT_EQUAL | SLJIT_I32_OP) -#define SLJIT_ZERO 0 -#define SLJIT_ZERO32 (SLJIT_ZERO | SLJIT_I32_OP) +#define SLJIT_ZERO SLJIT_EQUAL #define SLJIT_NOT_EQUAL 1 -#define SLJIT_NOT_EQUAL32 (SLJIT_NOT_EQUAL | SLJIT_I32_OP) -#define SLJIT_NOT_ZERO 1 -#define SLJIT_NOT_ZERO32 (SLJIT_NOT_ZERO | SLJIT_I32_OP) +#define SLJIT_NOT_ZERO SLJIT_NOT_EQUAL #define SLJIT_LESS 2 -#define SLJIT_LESS32 (SLJIT_LESS | SLJIT_I32_OP) #define SLJIT_SET_LESS SLJIT_SET(SLJIT_LESS) #define SLJIT_GREATER_EQUAL 3 -#define SLJIT_GREATER_EQUAL32 (SLJIT_GREATER_EQUAL | SLJIT_I32_OP) #define SLJIT_SET_GREATER_EQUAL SLJIT_SET(SLJIT_GREATER_EQUAL) #define SLJIT_GREATER 4 -#define SLJIT_GREATER32 (SLJIT_GREATER | SLJIT_I32_OP) #define SLJIT_SET_GREATER SLJIT_SET(SLJIT_GREATER) #define SLJIT_LESS_EQUAL 5 -#define SLJIT_LESS_EQUAL32 (SLJIT_LESS_EQUAL | SLJIT_I32_OP) #define SLJIT_SET_LESS_EQUAL SLJIT_SET(SLJIT_LESS_EQUAL) #define SLJIT_SIG_LESS 6 -#define SLJIT_SIG_LESS32 (SLJIT_SIG_LESS | SLJIT_I32_OP) #define SLJIT_SET_SIG_LESS SLJIT_SET(SLJIT_SIG_LESS) #define SLJIT_SIG_GREATER_EQUAL 7 -#define SLJIT_SIG_GREATER_EQUAL32 (SLJIT_SIG_GREATER_EQUAL | SLJIT_I32_OP) #define SLJIT_SET_SIG_GREATER_EQUAL SLJIT_SET(SLJIT_SIG_GREATER_EQUAL) #define SLJIT_SIG_GREATER 8 -#define SLJIT_SIG_GREATER32 (SLJIT_SIG_GREATER | SLJIT_I32_OP) #define SLJIT_SET_SIG_GREATER SLJIT_SET(SLJIT_SIG_GREATER) #define SLJIT_SIG_LESS_EQUAL 9 -#define SLJIT_SIG_LESS_EQUAL32 (SLJIT_SIG_LESS_EQUAL | SLJIT_I32_OP) #define SLJIT_SET_SIG_LESS_EQUAL SLJIT_SET(SLJIT_SIG_LESS_EQUAL) #define SLJIT_OVERFLOW 10 -#define SLJIT_OVERFLOW32 (SLJIT_OVERFLOW | SLJIT_I32_OP) #define SLJIT_SET_OVERFLOW SLJIT_SET(SLJIT_OVERFLOW) #define SLJIT_NOT_OVERFLOW 11 -#define SLJIT_NOT_OVERFLOW32 (SLJIT_NOT_OVERFLOW | SLJIT_I32_OP) - -#define SLJIT_MUL_OVERFLOW 12 -#define SLJIT_MUL_OVERFLOW32 (SLJIT_MUL_OVERFLOW | SLJIT_I32_OP) -#define SLJIT_SET_MUL_OVERFLOW SLJIT_SET(SLJIT_MUL_OVERFLOW) -#define SLJIT_MUL_NOT_OVERFLOW 13 -#define SLJIT_MUL_NOT_OVERFLOW32 (SLJIT_MUL_NOT_OVERFLOW | SLJIT_I32_OP) /* There is no SLJIT_CARRY or SLJIT_NOT_CARRY. */ -#define SLJIT_SET_CARRY SLJIT_SET(14) +#define SLJIT_SET_CARRY SLJIT_SET(12) /* Floating point comparison types. */ -#define SLJIT_EQUAL_F64 16 +#define SLJIT_EQUAL_F64 14 #define SLJIT_EQUAL_F32 (SLJIT_EQUAL_F64 | SLJIT_F32_OP) #define SLJIT_SET_EQUAL_F SLJIT_SET(SLJIT_EQUAL_F64) -#define SLJIT_NOT_EQUAL_F64 17 +#define SLJIT_NOT_EQUAL_F64 15 #define SLJIT_NOT_EQUAL_F32 (SLJIT_NOT_EQUAL_F64 | SLJIT_F32_OP) #define SLJIT_SET_NOT_EQUAL_F SLJIT_SET(SLJIT_NOT_EQUAL_F64) -#define SLJIT_LESS_F64 18 +#define SLJIT_LESS_F64 16 #define SLJIT_LESS_F32 (SLJIT_LESS_F64 | SLJIT_F32_OP) #define SLJIT_SET_LESS_F SLJIT_SET(SLJIT_LESS_F64) -#define SLJIT_GREATER_EQUAL_F64 19 +#define SLJIT_GREATER_EQUAL_F64 17 #define SLJIT_GREATER_EQUAL_F32 (SLJIT_GREATER_EQUAL_F64 | SLJIT_F32_OP) #define SLJIT_SET_GREATER_EQUAL_F SLJIT_SET(SLJIT_GREATER_EQUAL_F64) -#define SLJIT_GREATER_F64 20 +#define SLJIT_GREATER_F64 18 #define SLJIT_GREATER_F32 (SLJIT_GREATER_F64 | SLJIT_F32_OP) #define SLJIT_SET_GREATER_F SLJIT_SET(SLJIT_GREATER_F64) -#define SLJIT_LESS_EQUAL_F64 21 +#define SLJIT_LESS_EQUAL_F64 19 #define SLJIT_LESS_EQUAL_F32 (SLJIT_LESS_EQUAL_F64 | SLJIT_F32_OP) #define SLJIT_SET_LESS_EQUAL_F SLJIT_SET(SLJIT_LESS_EQUAL_F64) -#define SLJIT_UNORDERED_F64 22 +#define SLJIT_UNORDERED_F64 20 #define SLJIT_UNORDERED_F32 (SLJIT_UNORDERED_F64 | SLJIT_F32_OP) #define SLJIT_SET_UNORDERED_F SLJIT_SET(SLJIT_UNORDERED_F64) -#define SLJIT_ORDERED_F64 23 +#define SLJIT_ORDERED_F64 21 #define SLJIT_ORDERED_F32 (SLJIT_ORDERED_F64 | SLJIT_F32_OP) #define SLJIT_SET_ORDERED_F SLJIT_SET(SLJIT_ORDERED_F64) /* Unconditional jump types. */ -#define SLJIT_JUMP 24 +#define SLJIT_JUMP 22 /* Fast calling method. See sljit_emit_fast_enter / SLJIT_FAST_RETURN. */ -#define SLJIT_FAST_CALL 25 +#define SLJIT_FAST_CALL 23 /* Called function must be declared with the SLJIT_FUNC attribute. */ -#define SLJIT_CALL 26 +#define SLJIT_CALL 24 /* Called function must be declared with cdecl attribute. This is the default attribute for C functions. */ -#define SLJIT_CALL_CDECL 27 +#define SLJIT_CALL_CDECL 25 /* The target can be changed during runtime (see: sljit_set_jump_addr). */ #define SLJIT_REWRITABLE_JUMP 0x1000 @@ -1534,8 +1518,22 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_float_register_index(sljit_s32 reg) SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_custom(struct sljit_compiler *compiler, void *instruction, sljit_s32 size); -/* Define the currently available CPU status flags. It is usually used after an - sljit_emit_op_custom call to define which flags are set. */ +/* Flags were set by a 32 bit operation. */ +#define SLJIT_CURRENT_FLAGS_I32_OP SLJIT_I32_OP + +/* Flags were set by an ADD, ADDC, SUB, SUBC, or NEG operation. */ +#define SLJIT_CURRENT_FLAGS_ADD_SUB 0x01 + +/* Flags were set by a SUB with unused destination. + Must be combined with SLJIT_CURRENT_FLAGS_ADD_SUB. */ +#define SLJIT_CURRENT_FLAGS_COMPARE 0x02 + +/* Define the currently available CPU status flags. It is usually used after + an sljit_emit_label or sljit_emit_op_custom operations to define which CPU + status flags are available. + + The current_flags must be a valid combination of SLJIT_SET_* and + SLJIT_CURRENT_FLAGS_* constants. */ SLJIT_API_FUNC_ATTRIBUTE void sljit_set_current_flags(struct sljit_compiler *compiler, sljit_s32 current_flags); diff --git a/src/3rdparty/pcre2/src/sljit/sljitNativeARM_32.c b/src/3rdparty/pcre2/src/sljit/sljitNativeARM_32.c index ae8479f0..74cf55fc 100644 --- a/src/3rdparty/pcre2/src/sljit/sljitNativeARM_32.c +++ b/src/3rdparty/pcre2/src/sljit/sljitNativeARM_32.c @@ -1197,6 +1197,8 @@ static SLJIT_INLINE sljit_s32 emit_single_op(struct sljit_compiler *compiler, sl case SLJIT_ADD: SLJIT_ASSERT(!(flags & INV_IMM)); + compiler->status_flags_state = SLJIT_CURRENT_FLAGS_ADD_SUB; + if ((flags & (UNUSED_RETURN | SET_FLAGS)) == (UNUSED_RETURN | SET_FLAGS) && !(flags & ARGS_SWAPPED)) return push_inst(compiler, CMN | SET_FLAGS | RN(src1) | ((src2 & SRC2_IMM) ? src2 : RM(src2))); return push_inst(compiler, ADD | (flags & SET_FLAGS) | RD(dst) | RN(src1) | ((src2 & SRC2_IMM) ? src2 : RM(src2))); @@ -1207,6 +1209,8 @@ static SLJIT_INLINE sljit_s32 emit_single_op(struct sljit_compiler *compiler, sl case SLJIT_SUB: SLJIT_ASSERT(!(flags & INV_IMM)); + compiler->status_flags_state = SLJIT_CURRENT_FLAGS_ADD_SUB; + if ((flags & (UNUSED_RETURN | SET_FLAGS)) == (UNUSED_RETURN | SET_FLAGS) && !(flags & ARGS_SWAPPED)) return push_inst(compiler, CMP | SET_FLAGS | RN(src1) | ((src2 & SRC2_IMM) ? src2 : RM(src2))); return push_inst(compiler, (!(flags & ARGS_SWAPPED) ? SUB : RSB) | (flags & SET_FLAGS) @@ -1220,6 +1224,7 @@ static SLJIT_INLINE sljit_s32 emit_single_op(struct sljit_compiler *compiler, sl case SLJIT_MUL: SLJIT_ASSERT(!(flags & INV_IMM)); SLJIT_ASSERT(!(src2 & SRC2_IMM)); + compiler->status_flags_state = 0; if (!HAS_FLAGS(op)) return push_inst(compiler, MUL | (reg_map[dst] << 16) | (reg_map[src2] << 8) | reg_map[src1]); @@ -2153,16 +2158,14 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_enter(struct sljit_compiler * /* Conditional instructions */ /* --------------------------------------------------------------------- */ -static sljit_uw get_cc(sljit_s32 type) +static sljit_uw get_cc(struct sljit_compiler *compiler, sljit_s32 type) { switch (type) { case SLJIT_EQUAL: - case SLJIT_MUL_NOT_OVERFLOW: case SLJIT_EQUAL_F64: return 0x00000000; case SLJIT_NOT_EQUAL: - case SLJIT_MUL_OVERFLOW: case SLJIT_NOT_EQUAL_F64: return 0x10000000; @@ -2195,10 +2198,16 @@ static sljit_uw get_cc(sljit_s32 type) return 0xd0000000; case SLJIT_OVERFLOW: + if (!(compiler->status_flags_state & SLJIT_CURRENT_FLAGS_ADD_SUB)) + return 0x10000000; + case SLJIT_UNORDERED_F64: return 0x60000000; case SLJIT_NOT_OVERFLOW: + if (!(compiler->status_flags_state & SLJIT_CURRENT_FLAGS_ADD_SUB)) + return 0x00000000; + case SLJIT_ORDERED_F64: return 0x70000000; @@ -2242,7 +2251,7 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compile if (type >= SLJIT_FAST_CALL) PTR_FAIL_IF(prepare_blx(compiler)); PTR_FAIL_IF(push_inst_with_unique_literal(compiler, ((EMIT_DATA_TRANSFER(WORD_SIZE | LOAD_DATA, 1, - type <= SLJIT_JUMP ? TMP_PC : TMP_REG1, TMP_PC, 0)) & ~COND_MASK) | get_cc(type), 0)); + type <= SLJIT_JUMP ? TMP_PC : TMP_REG1, TMP_PC, 0)) & ~COND_MASK) | get_cc(compiler, type), 0)); if (jump->flags & SLJIT_REWRITABLE_JUMP) { jump->addr = compiler->size; @@ -2260,7 +2269,7 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compile if (type >= SLJIT_FAST_CALL) jump->flags |= IS_BL; PTR_FAIL_IF(emit_imm(compiler, TMP_REG1, 0)); - PTR_FAIL_IF(push_inst(compiler, (((type <= SLJIT_JUMP ? BX : BLX) | RM(TMP_REG1)) & ~COND_MASK) | get_cc(type))); + PTR_FAIL_IF(push_inst(compiler, (((type <= SLJIT_JUMP ? BX : BLX) | RM(TMP_REG1)) & ~COND_MASK) | get_cc(compiler, type))); jump->addr = compiler->size; #endif return jump; @@ -2589,7 +2598,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_flags(struct sljit_compiler *co ADJUST_LOCAL_OFFSET(dst, dstw); op = GET_OPCODE(op); - cc = get_cc(type & 0xff); + cc = get_cc(compiler, type & 0xff); dst_reg = FAST_IS_REG(dst) ? dst : TMP_REG1; if (op < SLJIT_ADD) { @@ -2629,7 +2638,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_cmov(struct sljit_compiler *compil dst_reg &= ~SLJIT_I32_OP; - cc = get_cc(type & 0xff); + cc = get_cc(compiler, type & 0xff); if (SLJIT_UNLIKELY(src & SLJIT_IMM)) { tmp = get_imm(srcw); diff --git a/src/3rdparty/pcre2/src/sljit/sljitNativeARM_64.c b/src/3rdparty/pcre2/src/sljit/sljitNativeARM_64.c index 52267e7d..3f0f5fcc 100644 --- a/src/3rdparty/pcre2/src/sljit/sljitNativeARM_64.c +++ b/src/3rdparty/pcre2/src/sljit/sljitNativeARM_64.c @@ -644,6 +644,7 @@ static sljit_s32 emit_op_imm(struct sljit_compiler *compiler, sljit_s32 flags, s imm = -imm; /* Fall through. */ case SLJIT_ADD: + compiler->status_flags_state = SLJIT_CURRENT_FLAGS_ADD_SUB; if (imm == 0) { CHECK_FLAGS(1 << 29); return push_inst(compiler, ((op == SLJIT_ADD ? ADDI : SUBI) ^ inv_bits) | RD(dst) | RN(reg)); @@ -781,6 +782,7 @@ static sljit_s32 emit_op_imm(struct sljit_compiler *compiler, sljit_s32 flags, s break; /* Set flags. */ case SLJIT_NEG: SLJIT_ASSERT(arg1 == TMP_REG1); + compiler->status_flags_state = SLJIT_CURRENT_FLAGS_ADD_SUB; if (flags & SET_FLAGS) inv_bits |= 1 << 29; return push_inst(compiler, (SUB ^ inv_bits) | RD(dst) | RN(TMP_ZERO) | RM(arg2)); @@ -789,17 +791,20 @@ static sljit_s32 emit_op_imm(struct sljit_compiler *compiler, sljit_s32 flags, s return push_inst(compiler, (CLZ ^ inv_bits) | RD(dst) | RN(arg2)); case SLJIT_ADD: CHECK_FLAGS(1 << 29); + compiler->status_flags_state = SLJIT_CURRENT_FLAGS_ADD_SUB; return push_inst(compiler, (ADD ^ inv_bits) | RD(dst) | RN(arg1) | RM(arg2)); case SLJIT_ADDC: CHECK_FLAGS(1 << 29); return push_inst(compiler, (ADC ^ inv_bits) | RD(dst) | RN(arg1) | RM(arg2)); case SLJIT_SUB: CHECK_FLAGS(1 << 29); + compiler->status_flags_state = SLJIT_CURRENT_FLAGS_ADD_SUB; return push_inst(compiler, (SUB ^ inv_bits) | RD(dst) | RN(arg1) | RM(arg2)); case SLJIT_SUBC: CHECK_FLAGS(1 << 29); return push_inst(compiler, (SBC ^ inv_bits) | RD(dst) | RN(arg1) | RM(arg2)); case SLJIT_MUL: + compiler->status_flags_state = 0; if (!(flags & SET_FLAGS)) return push_inst(compiler, (MADD ^ inv_bits) | RD(dst) | RN(arg1) | RM(arg2) | RT2(TMP_ZERO)); if (flags & INT_OP) { @@ -1600,16 +1605,14 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_enter(struct sljit_compiler * /* Conditional instructions */ /* --------------------------------------------------------------------- */ -static sljit_uw get_cc(sljit_s32 type) +static sljit_uw get_cc(struct sljit_compiler *compiler, sljit_s32 type) { switch (type) { case SLJIT_EQUAL: - case SLJIT_MUL_NOT_OVERFLOW: case SLJIT_EQUAL_F64: return 0x1; case SLJIT_NOT_EQUAL: - case SLJIT_MUL_OVERFLOW: case SLJIT_NOT_EQUAL_F64: return 0x0; @@ -1642,10 +1645,16 @@ static sljit_uw get_cc(sljit_s32 type) return 0xc; case SLJIT_OVERFLOW: + if (!(compiler->status_flags_state & SLJIT_CURRENT_FLAGS_ADD_SUB)) + return 0x0; + case SLJIT_UNORDERED_F64: return 0x7; case SLJIT_NOT_OVERFLOW: + if (!(compiler->status_flags_state & SLJIT_CURRENT_FLAGS_ADD_SUB)) + return 0x1; + case SLJIT_ORDERED_F64: return 0x6; @@ -1685,7 +1694,7 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compile if (type < SLJIT_JUMP) { jump->flags |= IS_COND; - PTR_FAIL_IF(push_inst(compiler, B_CC | (6 << 5) | get_cc(type))); + PTR_FAIL_IF(push_inst(compiler, B_CC | (6 << 5) | get_cc(compiler, type))); } else if (type >= SLJIT_FAST_CALL) jump->flags |= IS_BL; @@ -1799,7 +1808,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_flags(struct sljit_compiler *co CHECK(check_sljit_emit_op_flags(compiler, op, dst, dstw, type)); ADJUST_LOCAL_OFFSET(dst, dstw); - cc = get_cc(type & 0xff); + cc = get_cc(compiler, type & 0xff); dst_r = FAST_IS_REG(dst) ? dst : TMP_REG1; if (GET_OPCODE(op) < SLJIT_ADD) { @@ -1854,7 +1863,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_cmov(struct sljit_compiler *compil srcw = 0; } - cc = get_cc(type & 0xff); + cc = get_cc(compiler, type & 0xff); dst_reg &= ~SLJIT_I32_OP; return push_inst(compiler, (CSEL ^ inv_bits) | (cc << 12) | RD(dst_reg) | RN(dst_reg) | RM(src)); diff --git a/src/3rdparty/pcre2/src/sljit/sljitNativeARM_T2_32.c b/src/3rdparty/pcre2/src/sljit/sljitNativeARM_T2_32.c index 4624882f..e35dbe99 100644 --- a/src/3rdparty/pcre2/src/sljit/sljitNativeARM_T2_32.c +++ b/src/3rdparty/pcre2/src/sljit/sljitNativeARM_T2_32.c @@ -610,6 +610,7 @@ static sljit_s32 emit_op_imm(struct sljit_compiler *compiler, sljit_s32 flags, s Although some clever things could be done here, "NOT IMM" does not worth the efforts. */ break; case SLJIT_ADD: + compiler->status_flags_state = SLJIT_CURRENT_FLAGS_ADD_SUB; nimm = -(sljit_sw)imm; if (IS_2_LO_REGS(reg, dst)) { if (imm <= 0x7) @@ -643,6 +644,7 @@ static sljit_s32 emit_op_imm(struct sljit_compiler *compiler, sljit_s32 flags, s break; case SLJIT_SUB: /* SUB operation can be replaced by ADD because of the negative carry flag. */ + compiler->status_flags_state = SLJIT_CURRENT_FLAGS_ADD_SUB; if (flags & ARG1_IMM) { if (imm == 0 && IS_2_LO_REGS(reg, dst)) return push_inst16(compiler, RSBSI | RD3(dst) | RN3(reg)); @@ -801,6 +803,7 @@ static sljit_s32 emit_op_imm(struct sljit_compiler *compiler, sljit_s32 flags, s FAIL_IF(push_inst32(compiler, CLZ | RN4(arg2) | RD4(dst) | RM4(arg2))); return SLJIT_SUCCESS; case SLJIT_ADD: + compiler->status_flags_state = SLJIT_CURRENT_FLAGS_ADD_SUB; if (IS_3_LO_REGS(dst, arg1, arg2)) return push_inst16(compiler, ADDS | RD3(dst) | RN3(arg1) | RM3(arg2)); if (dst == arg1 && !(flags & SET_FLAGS)) @@ -811,6 +814,7 @@ static sljit_s32 emit_op_imm(struct sljit_compiler *compiler, sljit_s32 flags, s return push_inst16(compiler, ADCS | RD3(dst) | RN3(arg2)); return push_inst32(compiler, ADC_W | (flags & SET_FLAGS) | RD4(dst) | RN4(arg1) | RM4(arg2)); case SLJIT_SUB: + compiler->status_flags_state = SLJIT_CURRENT_FLAGS_ADD_SUB; if (flags & UNUSED_RETURN) { if (IS_2_LO_REGS(arg1, arg2)) return push_inst16(compiler, CMP | RD3(arg1) | RN3(arg2)); @@ -824,6 +828,7 @@ static sljit_s32 emit_op_imm(struct sljit_compiler *compiler, sljit_s32 flags, s return push_inst16(compiler, SBCS | RD3(dst) | RN3(arg2)); return push_inst32(compiler, SBC_W | (flags & SET_FLAGS) | RD4(dst) | RN4(arg1) | RM4(arg2)); case SLJIT_MUL: + compiler->status_flags_state = 0; if (!(flags & SET_FLAGS)) return push_inst32(compiler, MUL | RD4(dst) | RN4(arg1) | RM4(arg2)); SLJIT_ASSERT(dst != TMP_REG2); @@ -1760,16 +1765,14 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_enter(struct sljit_compiler * /* Conditional instructions */ /* --------------------------------------------------------------------- */ -static sljit_uw get_cc(sljit_s32 type) +static sljit_uw get_cc(struct sljit_compiler *compiler, sljit_s32 type) { switch (type) { case SLJIT_EQUAL: - case SLJIT_MUL_NOT_OVERFLOW: case SLJIT_EQUAL_F64: return 0x0; case SLJIT_NOT_EQUAL: - case SLJIT_MUL_OVERFLOW: case SLJIT_NOT_EQUAL_F64: return 0x1; @@ -1802,10 +1805,16 @@ static sljit_uw get_cc(sljit_s32 type) return 0xd; case SLJIT_OVERFLOW: + if (!(compiler->status_flags_state & SLJIT_CURRENT_FLAGS_ADD_SUB)) + return 0x1; + case SLJIT_UNORDERED_F64: return 0x6; case SLJIT_NOT_OVERFLOW: + if (!(compiler->status_flags_state & SLJIT_CURRENT_FLAGS_ADD_SUB)) + return 0x0; + case SLJIT_ORDERED_F64: return 0x7; @@ -1847,7 +1856,7 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compile PTR_FAIL_IF(emit_imm32_const(compiler, TMP_REG1, 0)); if (type < SLJIT_JUMP) { jump->flags |= IS_COND; - cc = get_cc(type); + cc = get_cc(compiler, type); jump->flags |= cc << 8; PTR_FAIL_IF(push_inst16(compiler, IT | (cc << 4) | 0x8)); } @@ -2177,7 +2186,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_flags(struct sljit_compiler *co ADJUST_LOCAL_OFFSET(dst, dstw); op = GET_OPCODE(op); - cc = get_cc(type & 0xff); + cc = get_cc(compiler, type & 0xff); dst_r = FAST_IS_REG(dst) ? dst : TMP_REG1; if (op < SLJIT_ADD) { @@ -2229,7 +2238,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_cmov(struct sljit_compiler *compil dst_reg &= ~SLJIT_I32_OP; - cc = get_cc(type & 0xff); + cc = get_cc(compiler, type & 0xff); if (!(src & SLJIT_IMM)) { FAIL_IF(push_inst16(compiler, IT | (cc << 4) | 0x8)); diff --git a/src/3rdparty/pcre2/src/sljit/sljitNativeMIPS_32.c b/src/3rdparty/pcre2/src/sljit/sljitNativeMIPS_32.c index f887ee13..a90345f1 100644 --- a/src/3rdparty/pcre2/src/sljit/sljitNativeMIPS_32.c +++ b/src/3rdparty/pcre2/src/sljit/sljitNativeMIPS_32.c @@ -367,7 +367,7 @@ static SLJIT_INLINE sljit_s32 emit_single_op(struct sljit_compiler *compiler, sl case SLJIT_MUL: SLJIT_ASSERT(!(flags & SRC2_IMM)); - if (GET_FLAG_TYPE(op) != SLJIT_MUL_OVERFLOW) { + if (GET_FLAG_TYPE(op) != SLJIT_OVERFLOW) { #if (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 1) return push_inst(compiler, MUL | S(src1) | T(src2) | D(dst), DR(dst)); #else /* SLJIT_MIPS_REV < 1 */ diff --git a/src/3rdparty/pcre2/src/sljit/sljitNativeMIPS_64.c b/src/3rdparty/pcre2/src/sljit/sljitNativeMIPS_64.c index 5ab9b7d0..1f22e49e 100644 --- a/src/3rdparty/pcre2/src/sljit/sljitNativeMIPS_64.c +++ b/src/3rdparty/pcre2/src/sljit/sljitNativeMIPS_64.c @@ -458,7 +458,7 @@ static SLJIT_INLINE sljit_s32 emit_single_op(struct sljit_compiler *compiler, sl case SLJIT_MUL: SLJIT_ASSERT(!(flags & SRC2_IMM)); - if (GET_FLAG_TYPE(op) != SLJIT_MUL_OVERFLOW) { + if (GET_FLAG_TYPE(op) != SLJIT_OVERFLOW) { #if (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 6) return push_inst(compiler, SELECT_OP(DMUL, MUL) | S(src1) | T(src2) | D(dst), DR(dst)); #elif (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 1) diff --git a/src/3rdparty/pcre2/src/sljit/sljitNativeMIPS_common.c b/src/3rdparty/pcre2/src/sljit/sljitNativeMIPS_common.c index ecf4dac4..fd747695 100644 --- a/src/3rdparty/pcre2/src/sljit/sljitNativeMIPS_common.c +++ b/src/3rdparty/pcre2/src/sljit/sljitNativeMIPS_common.c @@ -1377,6 +1377,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op1(struct sljit_compiler *compile return emit_op(compiler, op, flags, dst, dstw, TMP_REG1, 0, src, srcw); case SLJIT_NEG: + compiler->status_flags_state = SLJIT_CURRENT_FLAGS_ADD_SUB; return emit_op(compiler, SLJIT_SUB | GET_ALL_FLAGS(op), flags | IMM_OP, dst, dstw, SLJIT_IMM, 0, src, srcw); case SLJIT_CLZ: @@ -1424,13 +1425,16 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op2(struct sljit_compiler *compile switch (GET_OPCODE(op)) { case SLJIT_ADD: case SLJIT_ADDC: + compiler->status_flags_state = SLJIT_CURRENT_FLAGS_ADD_SUB; return emit_op(compiler, op, flags | CUMULATIVE_OP | IMM_OP, dst, dstw, src1, src1w, src2, src2w); case SLJIT_SUB: case SLJIT_SUBC: + compiler->status_flags_state = SLJIT_CURRENT_FLAGS_ADD_SUB; return emit_op(compiler, op, flags | IMM_OP, dst, dstw, src1, src1w, src2, src2w); case SLJIT_MUL: + compiler->status_flags_state = 0; return emit_op(compiler, op, flags | CUMULATIVE_OP, dst, dstw, src1, src1w, src2, src2w); case SLJIT_AND: @@ -1860,7 +1864,6 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compile case SLJIT_SIG_LESS: case SLJIT_SIG_GREATER: case SLJIT_OVERFLOW: - case SLJIT_MUL_OVERFLOW: BR_Z(OTHER_FLAG); break; case SLJIT_GREATER_EQUAL: @@ -1868,7 +1871,6 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compile case SLJIT_SIG_GREATER_EQUAL: case SLJIT_SIG_LESS_EQUAL: case SLJIT_NOT_OVERFLOW: - case SLJIT_MUL_NOT_OVERFLOW: BR_NZ(OTHER_FLAG); break; case SLJIT_NOT_EQUAL_F64: @@ -2127,8 +2129,12 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_flags(struct sljit_compiler *co FAIL_IF(push_inst(compiler, SLTIU | SA(EQUAL_FLAG) | TA(dst_ar) | IMM(1), dst_ar)); src_ar = dst_ar; break; - case SLJIT_MUL_OVERFLOW: - case SLJIT_MUL_NOT_OVERFLOW: + case SLJIT_OVERFLOW: + case SLJIT_NOT_OVERFLOW: + if (compiler->status_flags_state & SLJIT_CURRENT_FLAGS_ADD_SUB) { + src_ar = OTHER_FLAG; + break; + } FAIL_IF(push_inst(compiler, SLTIU | SA(OTHER_FLAG) | TA(dst_ar) | IMM(1), dst_ar)); src_ar = dst_ar; type ^= 0x1; /* Flip type bit for the XORI below. */ @@ -2219,7 +2225,6 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_cmov(struct sljit_compiler *compil case SLJIT_SIG_LESS: case SLJIT_SIG_GREATER: case SLJIT_OVERFLOW: - case SLJIT_MUL_OVERFLOW: ins = MOVN | TA(OTHER_FLAG); break; case SLJIT_GREATER_EQUAL: @@ -2227,7 +2232,6 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_cmov(struct sljit_compiler *compil case SLJIT_SIG_GREATER_EQUAL: case SLJIT_SIG_LESS_EQUAL: case SLJIT_NOT_OVERFLOW: - case SLJIT_MUL_NOT_OVERFLOW: ins = MOVZ | TA(OTHER_FLAG); break; case SLJIT_EQUAL_F64: diff --git a/src/3rdparty/pcre2/src/sljit/sljitNativePPC_32.c b/src/3rdparty/pcre2/src/sljit/sljitNativePPC_32.c index 7d9ec533..6ddb5508 100644 --- a/src/3rdparty/pcre2/src/sljit/sljitNativePPC_32.c +++ b/src/3rdparty/pcre2/src/sljit/sljitNativePPC_32.c @@ -119,9 +119,10 @@ static SLJIT_INLINE sljit_s32 emit_single_op(struct sljit_compiler *compiler, sl SLJIT_ASSERT(src2 == TMP_REG2); return push_inst(compiler, ADDIC | D(dst) | A(src1) | compiler->imm); } + SLJIT_ASSERT(!(flags & ALT_FORM4)); if (!(flags & ALT_SET_FLAGS)) return push_inst(compiler, ADD | D(dst) | A(src1) | B(src2)); - if (flags & ALT_FORM4) + if (flags & ALT_FORM5) return push_inst(compiler, ADDC | RC(ALT_SET_FLAGS) | D(dst) | A(src1) | B(src2)); return push_inst(compiler, ADD | RC(flags) | D(dst) | A(src1) | B(src2)); @@ -143,24 +144,29 @@ static SLJIT_INLINE sljit_s32 emit_single_op(struct sljit_compiler *compiler, sl } if (flags & ALT_FORM2) { + if (flags & ALT_FORM3) { + FAIL_IF(push_inst(compiler, CMPI | CRD(0) | A(src1) | compiler->imm)); + if (!(flags & ALT_FORM4)) + return SLJIT_SUCCESS; + return push_inst(compiler, ADDI | D(dst) | A(src1) | (-compiler->imm & 0xffff)); + } + FAIL_IF(push_inst(compiler, CMP | CRD(0) | A(src1) | B(src2))); + if (!(flags & ALT_FORM4)) + return SLJIT_SUCCESS; + return push_inst(compiler, SUBF | D(dst) | A(src2) | B(src1)); + } + + if (flags & ALT_FORM3) { /* Setting XER SO is not enough, CR SO is also needed. */ return push_inst(compiler, SUBF | OE(ALT_SET_FLAGS) | RC(ALT_SET_FLAGS) | D(dst) | A(src2) | B(src1)); } - if (flags & ALT_FORM3) { + if (flags & ALT_FORM4) { /* Flags does not set: BIN_IMM_EXTS unnecessary. */ SLJIT_ASSERT(src2 == TMP_REG2); return push_inst(compiler, SUBFIC | D(dst) | A(src1) | compiler->imm); } - if (flags & ALT_FORM4) { - if (flags & ALT_FORM5) { - SLJIT_ASSERT(src2 == TMP_REG2); - return push_inst(compiler, CMPI | CRD(0) | A(src1) | compiler->imm); - } - return push_inst(compiler, CMP | CRD(0) | A(src1) | B(src2)); - } - if (!(flags & ALT_SET_FLAGS)) return push_inst(compiler, SUBF | D(dst) | A(src2) | B(src1)); if (flags & ALT_FORM5) diff --git a/src/3rdparty/pcre2/src/sljit/sljitNativePPC_64.c b/src/3rdparty/pcre2/src/sljit/sljitNativePPC_64.c index 92147d2a..cbdf2dd8 100644 --- a/src/3rdparty/pcre2/src/sljit/sljitNativePPC_64.c +++ b/src/3rdparty/pcre2/src/sljit/sljitNativePPC_64.c @@ -252,10 +252,17 @@ static SLJIT_INLINE sljit_s32 emit_single_op(struct sljit_compiler *compiler, sl BIN_IMM_EXTS(); return push_inst(compiler, ADDIC | D(dst) | A(src1) | compiler->imm); } + if (flags & ALT_FORM4) { + if (flags & ALT_FORM5) + FAIL_IF(push_inst(compiler, ADDI | D(dst) | A(src1) | compiler->imm)); + else + FAIL_IF(push_inst(compiler, ADD | D(dst) | A(src1) | B(src2))); + return push_inst(compiler, CMPI | A(dst) | 0); + } if (!(flags & ALT_SET_FLAGS)) return push_inst(compiler, ADD | D(dst) | A(src1) | B(src2)); BIN_EXTS(); - if (flags & ALT_FORM4) + if (flags & ALT_FORM5) return push_inst(compiler, ADDC | RC(ALT_SET_FLAGS) | D(dst) | A(src1) | B(src2)); return push_inst(compiler, ADD | RC(flags) | D(dst) | A(src1) | B(src2)); @@ -278,6 +285,19 @@ static SLJIT_INLINE sljit_s32 emit_single_op(struct sljit_compiler *compiler, sl } if (flags & ALT_FORM2) { + if (flags & ALT_FORM3) { + FAIL_IF(push_inst(compiler, CMPI | CRD(0 | ((flags & ALT_SIGN_EXT) ? 0 : 1)) | A(src1) | compiler->imm)); + if (!(flags & ALT_FORM4)) + return SLJIT_SUCCESS; + return push_inst(compiler, ADDI | D(dst) | A(src1) | (-compiler->imm & 0xffff)); + } + FAIL_IF(push_inst(compiler, CMP | CRD(0 | ((flags & ALT_SIGN_EXT) ? 0 : 1)) | A(src1) | B(src2))); + if (!(flags & ALT_FORM4)) + return SLJIT_SUCCESS; + return push_inst(compiler, SUBF | D(dst) | A(src2) | B(src1)); + } + + if (flags & ALT_FORM3) { if (flags & ALT_SIGN_EXT) { FAIL_IF(push_inst(compiler, RLDI(TMP_REG1, src1, 32, 31, 1))); src1 = TMP_REG1; @@ -291,20 +311,12 @@ static SLJIT_INLINE sljit_s32 emit_single_op(struct sljit_compiler *compiler, sl return SLJIT_SUCCESS; } - if (flags & ALT_FORM3) { + if (flags & ALT_FORM4) { /* Flags does not set: BIN_IMM_EXTS unnecessary. */ SLJIT_ASSERT(src2 == TMP_REG2); return push_inst(compiler, SUBFIC | D(dst) | A(src1) | compiler->imm); } - if (flags & ALT_FORM4) { - if (flags & ALT_FORM5) { - SLJIT_ASSERT(src2 == TMP_REG2); - return push_inst(compiler, CMPI | CRD(0 | ((flags & ALT_SIGN_EXT) ? 0 : 1)) | A(src1) | compiler->imm); - } - return push_inst(compiler, CMP | CRD(0 | ((flags & ALT_SIGN_EXT) ? 0 : 1)) | A(src1) | B(src2)); - } - if (!(flags & ALT_SET_FLAGS)) return push_inst(compiler, SUBF | D(dst) | A(src2) | B(src1)); BIN_EXTS(); diff --git a/src/3rdparty/pcre2/src/sljit/sljitNativePPC_common.c b/src/3rdparty/pcre2/src/sljit/sljitNativePPC_common.c index d84562ce..2174dbb0 100644 --- a/src/3rdparty/pcre2/src/sljit/sljitNativePPC_common.c +++ b/src/3rdparty/pcre2/src/sljit/sljitNativePPC_common.c @@ -1324,6 +1324,25 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op1(struct sljit_compiler *compile ((src) & SLJIT_IMM) #endif +#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) +#define TEST_ADD_FORM1(op) \ + (GET_FLAG_TYPE(op) == SLJIT_OVERFLOW \ + || (op & (SLJIT_I32_OP | SLJIT_SET_Z | VARIABLE_FLAG_MASK)) == (SLJIT_I32_OP | SLJIT_SET_Z | SLJIT_SET_CARRY)) +#define TEST_SUB_FORM2(op) \ + ((GET_FLAG_TYPE(op) >= SLJIT_SIG_LESS && GET_FLAG_TYPE(op) <= SLJIT_SIG_LESS_EQUAL) \ + || (op & (SLJIT_I32_OP | SLJIT_SET_Z | VARIABLE_FLAG_MASK)) == (SLJIT_I32_OP | SLJIT_SET_Z)) +#define TEST_SUB_FORM3(op) \ + (GET_FLAG_TYPE(op) == SLJIT_OVERFLOW \ + || (op & (SLJIT_I32_OP | SLJIT_SET_Z)) == (SLJIT_I32_OP | SLJIT_SET_Z)) +#else +#define TEST_ADD_FORM1(op) \ + (GET_FLAG_TYPE(op) == SLJIT_OVERFLOW) +#define TEST_SUB_FORM2(op) \ + (GET_FLAG_TYPE(op) >= SLJIT_SIG_LESS && GET_FLAG_TYPE(op) <= SLJIT_SIG_LESS_EQUAL) +#define TEST_SUB_FORM3(op) \ + (GET_FLAG_TYPE(op) == SLJIT_OVERFLOW) +#endif + SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op2(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 dst, sljit_sw dstw, sljit_s32 src1, sljit_sw src1w, @@ -1362,7 +1381,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op2(struct sljit_compiler *compile switch (GET_OPCODE(op)) { case SLJIT_ADD: - if (GET_FLAG_TYPE(op) == SLJIT_OVERFLOW) + if (TEST_ADD_FORM1(op)) return emit_op(compiler, SLJIT_ADD, flags | ALT_FORM1, dst, dstw, src1, src1w, src2, src2w); if (!HAS_FLAGS(op) && ((src1 | src2) & SLJIT_IMM)) { @@ -1392,6 +1411,20 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op2(struct sljit_compiler *compile return emit_op(compiler, SLJIT_ADD, flags | ALT_FORM2 | ALT_FORM4, dst, dstw, src2, src2w, TMP_REG2, 0); } } + +#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) + if ((op & (SLJIT_I32_OP | SLJIT_SET_Z)) == (SLJIT_I32_OP | SLJIT_SET_Z)) { + if (TEST_SL_IMM(src2, src2w)) { + compiler->imm = src2w & 0xffff; + return emit_op(compiler, SLJIT_ADD, flags | ALT_FORM4 | ALT_FORM5, dst, dstw, src1, src1w, TMP_REG2, 0); + } + if (TEST_SL_IMM(src1, src1w)) { + compiler->imm = src1w & 0xffff; + return emit_op(compiler, SLJIT_ADD, flags | ALT_FORM4 | ALT_FORM5, dst, dstw, src2, src2w, TMP_REG2, 0); + } + return emit_op(compiler, SLJIT_ADD, flags | ALT_FORM4, dst, dstw, src1, src1w, src2, src2w); + } +#endif if (HAS_FLAGS(op)) { if (TEST_SL_IMM(src2, src2w)) { compiler->imm = src2w & 0xffff; @@ -1402,7 +1435,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op2(struct sljit_compiler *compile return emit_op(compiler, SLJIT_ADD, flags | ALT_FORM3, dst, dstw, src2, src2w, TMP_REG2, 0); } } - return emit_op(compiler, SLJIT_ADD, flags | ((GET_FLAG_TYPE(op) == GET_FLAG_TYPE(SLJIT_SET_CARRY)) ? ALT_FORM4 : 0), dst, dstw, src1, src1w, src2, src2w); + return emit_op(compiler, SLJIT_ADD, flags | ((GET_FLAG_TYPE(op) == GET_FLAG_TYPE(SLJIT_SET_CARRY)) ? ALT_FORM5 : 0), dst, dstw, src1, src1w, src2, src2w); case SLJIT_ADDC: return emit_op(compiler, SLJIT_ADDC, flags, dst, dstw, src1, src1w, src2, src2w); @@ -1424,18 +1457,36 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op2(struct sljit_compiler *compile return emit_op(compiler, SLJIT_SUB, flags | ALT_FORM1 | ALT_FORM3, dst, dstw, src1, src1w, src2, src2w); } - if (GET_FLAG_TYPE(op) == SLJIT_OVERFLOW) + if (dst == SLJIT_UNUSED && GET_FLAG_TYPE(op) <= SLJIT_SIG_LESS_EQUAL) { + if (TEST_SL_IMM(src2, src2w)) { + compiler->imm = src2w & 0xffff; + return emit_op(compiler, SLJIT_SUB, flags | ALT_FORM2 | ALT_FORM3, dst, dstw, src1, src1w, TMP_REG2, 0); + } return emit_op(compiler, SLJIT_SUB, flags | ALT_FORM2, dst, dstw, src1, src1w, src2, src2w); + } - if (!HAS_FLAGS(op) && ((src1 | src2) & SLJIT_IMM)) { - if (TEST_SL_IMM(src2, -src2w)) { - compiler->imm = (-src2w) & 0xffff; - return emit_op(compiler, SLJIT_ADD, flags | ALT_FORM2, dst, dstw, src1, src1w, TMP_REG2, 0); - } - if (TEST_SL_IMM(src1, src1w)) { - compiler->imm = src1w & 0xffff; - return emit_op(compiler, SLJIT_SUB, flags | ALT_FORM3, dst, dstw, src2, src2w, TMP_REG2, 0); + if (TEST_SUB_FORM2(op)) { + if ((src2 & SLJIT_IMM) && src2w >= -SIMM_MAX && src2w <= SIMM_MAX) { + compiler->imm = src2w & 0xffff; + return emit_op(compiler, SLJIT_SUB, flags | ALT_FORM2 | ALT_FORM3 | ALT_FORM4, dst, dstw, src1, src1w, TMP_REG2, 0); } + return emit_op(compiler, SLJIT_SUB, flags | ALT_FORM2 | ALT_FORM4, dst, dstw, src1, src1w, src2, src2w); + } + + if (TEST_SUB_FORM3(op)) + return emit_op(compiler, SLJIT_SUB, flags | ALT_FORM3, dst, dstw, src1, src1w, src2, src2w); + + if (TEST_SL_IMM(src2, -src2w)) { + compiler->imm = (-src2w) & 0xffff; + return emit_op(compiler, SLJIT_ADD, flags | (!HAS_FLAGS(op) ? ALT_FORM2 : ALT_FORM3), dst, dstw, src1, src1w, TMP_REG2, 0); + } + + if (TEST_SL_IMM(src1, src1w) && !(op & SLJIT_SET_Z)) { + compiler->imm = src1w & 0xffff; + return emit_op(compiler, SLJIT_SUB, flags | ALT_FORM4, dst, dstw, src2, src2w, TMP_REG2, 0); + } + + if (!HAS_FLAGS(op)) { if (TEST_SH_IMM(src2, -src2w)) { compiler->imm = ((-src2w) >> 16) & 0xffff; return emit_op(compiler, SLJIT_ADD, flags | ALT_FORM2 | ALT_FORM3, dst, dstw, src1, src1w, TMP_REG2, 0); @@ -1447,18 +1498,6 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op2(struct sljit_compiler *compile } } - if (dst == SLJIT_UNUSED && GET_FLAG_TYPE(op) != GET_FLAG_TYPE(SLJIT_SET_CARRY)) { - if (TEST_SL_IMM(src2, src2w)) { - compiler->imm = src2w & 0xffff; - return emit_op(compiler, SLJIT_SUB, flags | ALT_FORM4 | ALT_FORM5, dst, dstw, src1, src1w, TMP_REG2, 0); - } - return emit_op(compiler, SLJIT_SUB, flags | ALT_FORM4, dst, dstw, src1, src1w, src2, src2w); - } - - if (TEST_SL_IMM(src2, -src2w)) { - compiler->imm = (-src2w) & 0xffff; - return emit_op(compiler, SLJIT_ADD, flags | ALT_FORM3, dst, dstw, src1, src1w, TMP_REG2, 0); - } /* We know ALT_SIGN_EXT is set if it is an SLJIT_I32_OP on 64 bit systems. */ return emit_op(compiler, SLJIT_SUB, flags | ((GET_FLAG_TYPE(op) == GET_FLAG_TYPE(SLJIT_SET_CARRY)) ? ALT_FORM5 : 0), dst, dstw, src1, src1w, src2, src2w); @@ -1536,6 +1575,10 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op2(struct sljit_compiler *compile return SLJIT_SUCCESS; } +#undef TEST_ADD_FORM1 +#undef TEST_SUB_FORM2 +#undef TEST_SUB_FORM3 + SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_src(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 src, sljit_sw srcw) { @@ -1941,11 +1984,9 @@ static sljit_ins get_bo_bi_flags(sljit_s32 type) return (4 << 21) | ((4 + 1) << 16); case SLJIT_OVERFLOW: - case SLJIT_MUL_OVERFLOW: return (12 << 21) | (3 << 16); case SLJIT_NOT_OVERFLOW: - case SLJIT_MUL_NOT_OVERFLOW: return (4 << 21) | (3 << 16); case SLJIT_EQUAL_F64: @@ -2143,12 +2184,10 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_flags(struct sljit_compiler *co break; case SLJIT_OVERFLOW: - case SLJIT_MUL_OVERFLOW: cr_bit = 3; break; case SLJIT_NOT_OVERFLOW: - case SLJIT_MUL_NOT_OVERFLOW: cr_bit = 3; invert = 1; break; diff --git a/src/3rdparty/pcre2/src/sljit/sljitNativeS390X.c b/src/3rdparty/pcre2/src/sljit/sljitNativeS390X.c index a8b65112..716491ec 100644 --- a/src/3rdparty/pcre2/src/sljit/sljitNativeS390X.c +++ b/src/3rdparty/pcre2/src/sljit/sljitNativeS390X.c @@ -42,10 +42,10 @@ SLJIT_API_FUNC_ATTRIBUTE const char* sljit_get_platform_name(void) typedef sljit_uw sljit_ins; /* Instruction tags (most significant halfword). */ -const sljit_ins sljit_ins_const = (sljit_ins)1 << 48; +static const sljit_ins sljit_ins_const = (sljit_ins)1 << 48; static const sljit_u8 reg_map[SLJIT_NUMBER_OF_REGISTERS + 4] = { - 14, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 0, 1 + 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 0, 1 }; /* there are also a[2-15] available, but they are slower to access and @@ -66,22 +66,22 @@ typedef sljit_uw sljit_gpr; * will be retired ASAP (TODO: carenas) */ -const sljit_gpr r0 = 0; /* reg_map[SLJIT_NUMBER_OF_REGISTERS + 2]: 0 in address calculations; reserved */ -const sljit_gpr r1 = 1; /* reg_map[SLJIT_NUMBER_OF_REGISTERS + 3]: reserved */ -const sljit_gpr r2 = 2; /* reg_map[1]: 1st argument */ -const sljit_gpr r3 = 3; /* reg_map[2]: 2nd argument */ -const sljit_gpr r4 = 4; /* reg_map[3]: 3rd argument */ -const sljit_gpr r5 = 5; /* reg_map[4]: 4th argument */ -const sljit_gpr r6 = 6; /* reg_map[5]: 5th argument; 1st saved register */ -const sljit_gpr r7 = 7; /* reg_map[6] */ -const sljit_gpr r8 = 8; /* reg_map[7] */ -const sljit_gpr r9 = 9; /* reg_map[8] */ -const sljit_gpr r10 = 10; /* reg_map[9] */ -const sljit_gpr r11 = 11; /* reg_map[10] */ -const sljit_gpr r12 = 12; /* reg_map[11]: GOT */ -const sljit_gpr r13 = 13; /* reg_map[12]: Literal Pool pointer */ -const sljit_gpr r14 = 14; /* reg_map[0]: return address and flag register */ -const sljit_gpr r15 = 15; /* reg_map[SLJIT_NUMBER_OF_REGISTERS + 1]: stack pointer */ +static const sljit_gpr r0 = 0; /* reg_map[SLJIT_NUMBER_OF_REGISTERS + 2]: 0 in address calculations; reserved */ +static const sljit_gpr r1 = 1; /* reg_map[SLJIT_NUMBER_OF_REGISTERS + 3]: reserved */ +static const sljit_gpr r2 = 2; /* reg_map[1]: 1st argument */ +static const sljit_gpr r3 = 3; /* reg_map[2]: 2nd argument */ +static const sljit_gpr r4 = 4; /* reg_map[3]: 3rd argument */ +static const sljit_gpr r5 = 5; /* reg_map[4]: 4th argument */ +static const sljit_gpr r6 = 6; /* reg_map[5]: 5th argument; 1st saved register */ +static const sljit_gpr r7 = 7; /* reg_map[6] */ +static const sljit_gpr r8 = 8; /* reg_map[7] */ +static const sljit_gpr r9 = 9; /* reg_map[8] */ +static const sljit_gpr r10 = 10; /* reg_map[9] */ +static const sljit_gpr r11 = 11; /* reg_map[10] */ +static const sljit_gpr r12 = 12; /* reg_map[11]: GOT */ +static const sljit_gpr r13 = 13; /* reg_map[12]: Literal Pool pointer */ +static const sljit_gpr r14 = 14; /* reg_map[0]: return address and flag register */ +static const sljit_gpr r15 = 15; /* reg_map[SLJIT_NUMBER_OF_REGISTERS + 1]: stack pointer */ /* WARNING: r12 and r13 shouldn't be used as per ABI recommendation */ /* TODO(carenas): r12 might conflict in PIC code, reserve? */ @@ -100,8 +100,8 @@ const sljit_gpr r15 = 15; /* reg_map[SLJIT_NUMBER_OF_REGISTERS + 1]: stack point /* Link registers. The normal link register is r14, but since we use that for flags we need to use r0 instead to do fast calls so that flags are preserved. */ -const sljit_gpr link_r = 14; /* r14 */ -const sljit_gpr fast_link_r = 0; /* r0 */ +static const sljit_gpr link_r = 14; /* r14 */ +static const sljit_gpr fast_link_r = 0; /* r0 */ /* Flag register layout: @@ -110,7 +110,7 @@ const sljit_gpr fast_link_r = 0; /* r0 */ | ZERO | 0 | 0 | C C |///////| +---------------+---+---+-------+-------+ */ -const sljit_gpr flag_r = 14; /* r14 */ +static const sljit_gpr flag_r = 14; /* r14 */ struct sljit_s390x_const { struct sljit_const const_; /* must be first */ @@ -120,8 +120,7 @@ struct sljit_s390x_const { /* Convert SLJIT register to hardware register. */ static SLJIT_INLINE sljit_gpr gpr(sljit_s32 r) { - SLJIT_ASSERT(r != SLJIT_UNUSED); - SLJIT_ASSERT(r < (sljit_s32)(sizeof(reg_map) / sizeof(reg_map[0]))); + SLJIT_ASSERT(r >= 0 && r < (sljit_s32)(sizeof(reg_map) / sizeof(reg_map[0]))); return reg_map[r]; } @@ -172,51 +171,93 @@ static sljit_s32 encode_inst(void **ptr, sljit_ins ins) return SLJIT_SUCCESS; } +#define SLJIT_ADD_SUB_NO_COMPARE(status_flags_state) \ + (((status_flags_state) & (SLJIT_CURRENT_FLAGS_ADD_SUB | SLJIT_CURRENT_FLAGS_COMPARE)) == SLJIT_CURRENT_FLAGS_ADD_SUB) + /* Map the given type to a 4-bit condition code mask. */ -static SLJIT_INLINE sljit_u8 get_cc(sljit_s32 type) { - const sljit_u8 eq = 1 << 3; /* equal {,to zero} */ - const sljit_u8 lt = 1 << 2; /* less than {,zero} */ - const sljit_u8 gt = 1 << 1; /* greater than {,zero} */ - const sljit_u8 ov = 1 << 0; /* {overflow,NaN} */ +static SLJIT_INLINE sljit_u8 get_cc(struct sljit_compiler *compiler, sljit_s32 type) { + const sljit_u8 cc0 = 1 << 3; /* equal {,to zero} */ + const sljit_u8 cc1 = 1 << 2; /* less than {,zero} */ + const sljit_u8 cc2 = 1 << 1; /* greater than {,zero} */ + const sljit_u8 cc3 = 1 << 0; /* {overflow,NaN} */ switch (type) { case SLJIT_EQUAL: + if (SLJIT_ADD_SUB_NO_COMPARE(compiler->status_flags_state)) { + sljit_s32 type = GET_FLAG_TYPE(compiler->status_flags_state); + if (type >= SLJIT_SIG_LESS && type <= SLJIT_SIG_LESS_EQUAL) + return cc0; + if (type == SLJIT_OVERFLOW) + return (cc0 | cc3); + return (cc0 | cc2); + } + case SLJIT_EQUAL_F64: - return eq; + return cc0; case SLJIT_NOT_EQUAL: + if (SLJIT_ADD_SUB_NO_COMPARE(compiler->status_flags_state)) { + sljit_s32 type = GET_FLAG_TYPE(compiler->status_flags_state); + if (type >= SLJIT_SIG_LESS && type <= SLJIT_SIG_LESS_EQUAL) + return (cc1 | cc2 | cc3); + if (type == SLJIT_OVERFLOW) + return (cc1 | cc2); + return (cc1 | cc3); + } + case SLJIT_NOT_EQUAL_F64: - return ~eq; + return (cc1 | cc2 | cc3); case SLJIT_LESS: - case SLJIT_SIG_LESS: - case SLJIT_LESS_F64: - return lt; - - case SLJIT_LESS_EQUAL: - case SLJIT_SIG_LESS_EQUAL: - case SLJIT_LESS_EQUAL_F64: - return (lt | eq); - - case SLJIT_GREATER: - case SLJIT_SIG_GREATER: - case SLJIT_GREATER_F64: - return gt; + return cc1; case SLJIT_GREATER_EQUAL: + return (cc0 | cc2 | cc3); + + case SLJIT_GREATER: + if (compiler->status_flags_state & SLJIT_CURRENT_FLAGS_COMPARE) + return cc2; + return cc3; + + case SLJIT_LESS_EQUAL: + if (compiler->status_flags_state & SLJIT_CURRENT_FLAGS_COMPARE) + return (cc0 | cc1); + return (cc0 | cc1 | cc2); + + case SLJIT_SIG_LESS: + case SLJIT_LESS_F64: + return cc1; + + case SLJIT_SIG_LESS_EQUAL: + case SLJIT_LESS_EQUAL_F64: + return (cc0 | cc1); + + case SLJIT_SIG_GREATER: + /* Overflow is considered greater, see SLJIT_SUB. */ + return cc2 | cc3; + case SLJIT_SIG_GREATER_EQUAL: - case SLJIT_GREATER_EQUAL_F64: - return (gt | eq); + return (cc0 | cc2 | cc3); case SLJIT_OVERFLOW: - case SLJIT_MUL_OVERFLOW: + if (compiler->status_flags_state & SLJIT_SET_Z) + return (cc2 | cc3); + case SLJIT_UNORDERED_F64: - return ov; + return cc3; case SLJIT_NOT_OVERFLOW: - case SLJIT_MUL_NOT_OVERFLOW: + if (compiler->status_flags_state & SLJIT_SET_Z) + return (cc0 | cc1); + case SLJIT_ORDERED_F64: - return ~ov; + return (cc0 | cc1 | cc2); + + case SLJIT_GREATER_F64: + return cc2; + + case SLJIT_GREATER_EQUAL_F64: + return (cc0 | cc2); } SLJIT_UNREACHABLE(); @@ -346,19 +387,20 @@ HAVE_FACILITY(have_misc2, MISCELLANEOUS_INSTRUCTION_EXTENSIONS_2_FACILITY) #define is_u32(d) (0 <= (d) && (d) <= 0xffffffffL) #define CHECK_SIGNED(v, bitlen) \ - ((v) == (((v) << (sizeof(v) * 8 - bitlen)) >> (sizeof(v) * 8 - bitlen))) + ((v) >= -(1 << ((bitlen) - 1)) && (v) < (1 << ((bitlen) - 1))) +#define is_s8(d) CHECK_SIGNED((d), 8) #define is_s16(d) CHECK_SIGNED((d), 16) #define is_s20(d) CHECK_SIGNED((d), 20) -#define is_s32(d) CHECK_SIGNED((d), 32) +#define is_s32(d) ((d) == (sljit_s32)(d)) -static SLJIT_INLINE sljit_uw disp_s20(sljit_s32 d) +static SLJIT_INLINE sljit_ins disp_s20(sljit_s32 d) { + SLJIT_ASSERT(is_s20(d)); + sljit_uw dh = (d >> 12) & 0xff; sljit_uw dl = (d << 8) & 0xfff00; - - SLJIT_ASSERT(is_s20(d)); - return dh | dl; + return (dh | dl) << 8; } /* TODO(carenas): variadic macro is not strictly needed */ @@ -372,12 +414,6 @@ SLJIT_S390X_INSTRUCTION(name, sljit_gpr dst, sljit_gpr src) \ return (pattern) | ((dst & 0xf) << 4) | (src & 0xf); \ } -/* ADD */ -SLJIT_S390X_RR(ar, 0x1a00) - -/* ADD LOGICAL */ -SLJIT_S390X_RR(alr, 0x1e00) - /* AND */ SLJIT_S390X_RR(nr, 0x1400) @@ -387,12 +423,6 @@ SLJIT_S390X_RR(basr, 0x0d00) /* BRANCH ON CONDITION */ SLJIT_S390X_RR(bcr, 0x0700) /* TODO(mundaym): type for mask? */ -/* COMPARE */ -SLJIT_S390X_RR(cr, 0x1900) - -/* COMPARE LOGICAL */ -SLJIT_S390X_RR(clr, 0x1500) - /* DIVIDE */ SLJIT_S390X_RR(dr, 0x1d00) @@ -408,12 +438,6 @@ SLJIT_S390X_RR(lcr, 0x1300) /* OR */ SLJIT_S390X_RR(or, 0x1600) -/* SUBTRACT */ -SLJIT_S390X_RR(sr, 0x1b00) - -/* SUBTRACT LOGICAL */ -SLJIT_S390X_RR(slr, 0x1f00) - #undef SLJIT_S390X_RR /* RRE form instructions */ @@ -423,25 +447,9 @@ SLJIT_S390X_INSTRUCTION(name, sljit_gpr dst, sljit_gpr src) \ return (pattern) | ((dst & 0xf) << 4) | (src & 0xf); \ } -/* ADD */ -SLJIT_S390X_RRE(agr, 0xb9080000) - -/* ADD LOGICAL */ -SLJIT_S390X_RRE(algr, 0xb90a0000) - -/* ADD LOGICAL WITH CARRY */ -SLJIT_S390X_RRE(alcr, 0xb9980000) -SLJIT_S390X_RRE(alcgr, 0xb9880000) - /* AND */ SLJIT_S390X_RRE(ngr, 0xb9800000) -/* COMPARE */ -SLJIT_S390X_RRE(cgr, 0xb9200000) - -/* COMPARE LOGICAL */ -SLJIT_S390X_RRE(clgr, 0xb9210000) - /* DIVIDE LOGICAL */ SLJIT_S390X_RRE(dlr, 0xb9970000) SLJIT_S390X_RRE(dlgr, 0xb9870000) @@ -482,8 +490,6 @@ SLJIT_S390X_RRE(llghr, 0xb9850000) SLJIT_S390X_RRE(mlgr, 0xb9860000) /* MULTIPLY SINGLE */ -SLJIT_S390X_RRE(msr, 0xb2520000) -SLJIT_S390X_RRE(msgr, 0xb90c0000) SLJIT_S390X_RRE(msgfr, 0xb91c0000) /* OR */ @@ -492,13 +498,6 @@ SLJIT_S390X_RRE(ogr, 0xb9810000) /* SUBTRACT */ SLJIT_S390X_RRE(sgr, 0xb9090000) -/* SUBTRACT LOGICAL */ -SLJIT_S390X_RRE(slgr, 0xb90b0000) - -/* SUBTRACT LOGICAL WITH BORROW */ -SLJIT_S390X_RRE(slbr, 0xb9990000) -SLJIT_S390X_RRE(slbgr, 0xb9890000) - #undef SLJIT_S390X_RRE /* RI-a form instructions */ @@ -509,13 +508,8 @@ SLJIT_S390X_INSTRUCTION(name, sljit_gpr reg, imm_type imm) \ } /* ADD HALFWORD IMMEDIATE */ -SLJIT_S390X_RIA(ahi, 0xa70a0000, sljit_s16) SLJIT_S390X_RIA(aghi, 0xa70b0000, sljit_s16) -/* COMPARE HALFWORD IMMEDIATE */ -SLJIT_S390X_RIA(chi, 0xa70e0000, sljit_s16) -SLJIT_S390X_RIA(cghi, 0xa70f0000, sljit_s16) - /* LOAD HALFWORD IMMEDIATE */ SLJIT_S390X_RIA(lhi, 0xa7080000, sljit_s16) SLJIT_S390X_RIA(lghi, 0xa7090000, sljit_s16) @@ -533,9 +527,6 @@ SLJIT_S390X_RIA(mghi, 0xa70d0000, sljit_s16) /* OR IMMEDIATE */ SLJIT_S390X_RIA(oilh, 0xa50a0000, sljit_u16) -/* TEST UNDER MASK */ -SLJIT_S390X_RIA(tmlh, 0xa7000000, sljit_u16) - #undef SLJIT_S390X_RIA /* RIL-a form instructions (requires extended immediate facility) */ @@ -547,30 +538,13 @@ SLJIT_S390X_INSTRUCTION(name, sljit_gpr reg, imm_type imm) \ } /* ADD IMMEDIATE */ -SLJIT_S390X_RILA(afi, 0xc20900000000, sljit_s32) SLJIT_S390X_RILA(agfi, 0xc20800000000, sljit_s32) /* ADD IMMEDIATE HIGH */ SLJIT_S390X_RILA(aih, 0xcc0800000000, sljit_s32) /* TODO(mundaym): high-word facility? */ -/* ADD LOGICAL IMMEDIATE */ -SLJIT_S390X_RILA(alfi, 0xc20b00000000, sljit_u32) -SLJIT_S390X_RILA(algfi, 0xc20a00000000, sljit_u32) - /* AND IMMEDIATE */ SLJIT_S390X_RILA(nihf, 0xc00a00000000, sljit_u32) -SLJIT_S390X_RILA(nilf, 0xc00b00000000, sljit_u32) - -/* COMPARE IMMEDIATE */ -SLJIT_S390X_RILA(cfi, 0xc20d00000000, sljit_s32) -SLJIT_S390X_RILA(cgfi, 0xc20c00000000, sljit_s32) - -/* COMPARE IMMEDIATE HIGH */ -SLJIT_S390X_RILA(cih, 0xcc0d00000000, sljit_s32) /* TODO(mundaym): high-word facility? */ - -/* COMPARE LOGICAL IMMEDIATE */ -SLJIT_S390X_RILA(clfi, 0xc20f00000000, sljit_u32) -SLJIT_S390X_RILA(clgfi, 0xc20e00000000, sljit_u32) /* EXCLUSIVE OR IMMEDIATE */ SLJIT_S390X_RILA(xilf, 0xc00700000000, sljit_u32) @@ -586,8 +560,8 @@ SLJIT_S390X_RILA(lgfi, 0xc00100000000, sljit_s32) SLJIT_S390X_RILA(llihf, 0xc00e00000000, sljit_u32) SLJIT_S390X_RILA(llilf, 0xc00f00000000, sljit_u32) -/* OR IMMEDIATE */ -SLJIT_S390X_RILA(oilf, 0xc00d00000000, sljit_u32) +/* SUBTRACT LOGICAL IMMEDIATE */ +SLJIT_S390X_RILA(slfi, 0xc20500000000, sljit_u32) #undef SLJIT_S390X_RILA @@ -606,18 +580,6 @@ SLJIT_S390X_INSTRUCTION(name, sljit_gpr r, sljit_u16 d, sljit_gpr x, sljit_gpr b return (pattern) | ri | xi | bi | di; \ } -/* ADD */ -SLJIT_S390X_RXA(a, 0x5a000000) - -/* ADD LOGICAL */ -SLJIT_S390X_RXA(al, 0x5e000000) - -/* AND */ -SLJIT_S390X_RXA(n, 0x54000000) - -/* EXCLUSIVE OR */ -SLJIT_S390X_RXA(x, 0x57000000) - /* LOAD */ SLJIT_S390X_RXA(l, 0x58000000) @@ -630,9 +592,6 @@ SLJIT_S390X_RXA(lh, 0x48000000) /* MULTIPLY SINGLE */ SLJIT_S390X_RXA(ms, 0x71000000) -/* OR */ -SLJIT_S390X_RXA(o, 0x56000000) - /* STORE */ SLJIT_S390X_RXA(st, 0x50000000) @@ -642,12 +601,6 @@ SLJIT_S390X_RXA(stc, 0x42000000) /* STORE HALFWORD */ SLJIT_S390X_RXA(sth, 0x40000000) -/* SUBTRACT */ -SLJIT_S390X_RXA(s, 0x5b000000) - -/* SUBTRACT LOGICAL */ -SLJIT_S390X_RXA(sl, 0x5f000000) - #undef SLJIT_S390X_RXA /* RXY-a instructions */ @@ -660,31 +613,11 @@ SLJIT_S390X_INSTRUCTION(name, sljit_gpr r, sljit_s32 d, sljit_gpr x, sljit_gpr b ri = (sljit_ins)(r & 0xf) << 36; \ xi = (sljit_ins)(x & 0xf) << 32; \ bi = (sljit_ins)(b & 0xf) << 28; \ - di = (sljit_ins)disp_s20(d) << 8; \ + di = disp_s20(d); \ \ return (pattern) | ri | xi | bi | di; \ } -/* ADD */ -SLJIT_S390X_RXYA(ay, 0xe3000000005a, have_ldisp()) -SLJIT_S390X_RXYA(ag, 0xe30000000008, 1) - -/* ADD LOGICAL */ -SLJIT_S390X_RXYA(aly, 0xe3000000005e, have_ldisp()) -SLJIT_S390X_RXYA(alg, 0xe3000000000a, 1) - -/* ADD LOGICAL WITH CARRY */ -SLJIT_S390X_RXYA(alc, 0xe30000000098, 1) -SLJIT_S390X_RXYA(alcg, 0xe30000000088, 1) - -/* AND */ -SLJIT_S390X_RXYA(ny, 0xe30000000054, have_ldisp()) -SLJIT_S390X_RXYA(ng, 0xe30000000080, 1) - -/* EXCLUSIVE OR */ -SLJIT_S390X_RXYA(xy, 0xe30000000057, have_ldisp()) -SLJIT_S390X_RXYA(xg, 0xe30000000082, 1) - /* LOAD */ SLJIT_S390X_RXYA(ly, 0xe30000000058, have_ldisp()) SLJIT_S390X_RXYA(lg, 0xe30000000004, 1) @@ -713,10 +646,6 @@ SLJIT_S390X_RXYA(llgh, 0xe30000000091, 1) SLJIT_S390X_RXYA(msy, 0xe30000000051, have_ldisp()) SLJIT_S390X_RXYA(msg, 0xe3000000000c, 1) -/* OR */ -SLJIT_S390X_RXYA(oy, 0xe30000000056, have_ldisp()) -SLJIT_S390X_RXYA(og, 0xe30000000081, 1) - /* STORE */ SLJIT_S390X_RXYA(sty, 0xe30000000050, have_ldisp()) SLJIT_S390X_RXYA(stg, 0xe30000000024, 1) @@ -727,41 +656,8 @@ SLJIT_S390X_RXYA(stcy, 0xe30000000072, have_ldisp()) /* STORE HALFWORD */ SLJIT_S390X_RXYA(sthy, 0xe30000000070, have_ldisp()) -/* SUBTRACT */ -SLJIT_S390X_RXYA(sy, 0xe3000000005b, have_ldisp()) -SLJIT_S390X_RXYA(sg, 0xe30000000009, 1) - -/* SUBTRACT LOGICAL */ -SLJIT_S390X_RXYA(sly, 0xe3000000005f, have_ldisp()) -SLJIT_S390X_RXYA(slg, 0xe3000000000b, 1) - -/* SUBTRACT LOGICAL WITH BORROW */ -SLJIT_S390X_RXYA(slb, 0xe30000000099, 1) -SLJIT_S390X_RXYA(slbg, 0xe30000000089, 1) - #undef SLJIT_S390X_RXYA -/* RS-a instructions */ -#define SLJIT_S390X_RSA(name, pattern) \ -SLJIT_S390X_INSTRUCTION(name, sljit_gpr reg, sljit_sw d, sljit_gpr b) \ -{ \ - sljit_ins r1 = (sljit_ins)(reg & 0xf) << 20; \ - sljit_ins b2 = (sljit_ins)(b & 0xf) << 12; \ - sljit_ins d2 = (sljit_ins)(d & 0xfff); \ - return (pattern) | r1 | b2 | d2; \ -} - -/* SHIFT LEFT SINGLE LOGICAL */ -SLJIT_S390X_RSA(sll, 0x89000000) - -/* SHIFT RIGHT SINGLE */ -SLJIT_S390X_RSA(sra, 0x8a000000) - -/* SHIFT RIGHT SINGLE LOGICAL */ -SLJIT_S390X_RSA(srl, 0x88000000) - -#undef SLJIT_S390X_RSA - /* RSY-a instructions */ #define SLJIT_S390X_RSYA(name, pattern, cond) \ SLJIT_S390X_INSTRUCTION(name, sljit_gpr dst, sljit_gpr src, sljit_sw d, sljit_gpr b) \ @@ -772,7 +668,7 @@ SLJIT_S390X_INSTRUCTION(name, sljit_gpr dst, sljit_gpr src, sljit_sw d, sljit_gp r1 = (sljit_ins)(dst & 0xf) << 36; \ r3 = (sljit_ins)(src & 0xf) << 32; \ b2 = (sljit_ins)(b & 0xf) << 28; \ - d2 = (sljit_ins)disp_s20(d) << 8; \ + d2 = disp_s20(d); \ \ return (pattern) | r1 | r3 | b2 | d2; \ } @@ -786,9 +682,6 @@ SLJIT_S390X_RSYA(sllg, 0xeb000000000d, 1) /* SHIFT RIGHT SINGLE */ SLJIT_S390X_RSYA(srag, 0xeb000000000a, 1) -/* SHIFT RIGHT SINGLE LOGICAL */ -SLJIT_S390X_RSYA(srlg, 0xeb000000000c, 1) - /* STORE MULTIPLE */ SLJIT_S390X_RSYA(stmg, 0xeb0000000024, 1) @@ -831,26 +724,6 @@ SLJIT_S390X_RIEF(risbhg, 0xec000000005d) #undef SLJIT_S390X_RIEF -/* RRF-a instructions */ -#define SLJIT_S390X_RRFA(name, pattern, cond) \ -SLJIT_S390X_INSTRUCTION(name, sljit_gpr dst, sljit_gpr src1, sljit_gpr src2) \ -{ \ - sljit_ins r1, r2, r3; \ -\ - SLJIT_ASSERT(cond); \ - r1 = (sljit_ins)(dst & 0xf) << 4; \ - r2 = (sljit_ins)(src1 & 0xf); \ - r3 = (sljit_ins)(src2 & 0xf) << 12; \ -\ - return (pattern) | r3 | r1 | r2; \ -} - -/* MULTIPLY */ -SLJIT_S390X_RRFA(msrkc, 0xb9fd0000, have_misc2()) -SLJIT_S390X_RRFA(msgrkc, 0xb9ed0000, have_misc2()) - -#undef SLJIT_S390X_RRFA - /* RRF-c instructions (require load/store-on-condition 1 facility) */ #define SLJIT_S390X_RRFC(name, pattern) \ SLJIT_S390X_INSTRUCTION(name, sljit_gpr dst, sljit_gpr src, sljit_uw mask) \ @@ -919,6 +792,13 @@ SLJIT_S390X_INSTRUCTION(br, sljit_gpr target) return 0x07f0 | target; } +SLJIT_S390X_INSTRUCTION(brc, sljit_uw mask, sljit_sw target) +{ + sljit_ins m1 = (sljit_ins)(mask & 0xf) << 20; + sljit_ins ri2 = (sljit_ins)target & 0xffff; + return 0xa7040000L | m1 | ri2; +} + SLJIT_S390X_INSTRUCTION(brcl, sljit_uw mask, sljit_sw target) { sljit_ins m1 = (sljit_ins)(mask & 0xf) << 36; @@ -940,6 +820,12 @@ SLJIT_S390X_INSTRUCTION(ipm, sljit_gpr dst) return 0xb2220000 | ((sljit_ins)(dst & 0xf) << 4); } +/* SET PROGRAM MASK */ +SLJIT_S390X_INSTRUCTION(spm, sljit_gpr dst) +{ + return 0x0400 | ((sljit_ins)(dst & 0xf) << 4); +} + /* ROTATE THEN INSERT SELECTED BITS HIGH (ZERO) */ SLJIT_S390X_INSTRUCTION(risbhgz, sljit_gpr dst, sljit_gpr src, sljit_u8 start, sljit_u8 end, sljit_u8 rot) { @@ -948,30 +834,20 @@ SLJIT_S390X_INSTRUCTION(risbhgz, sljit_gpr dst, sljit_gpr src, sljit_u8 start, s #undef SLJIT_S390X_INSTRUCTION -/* load condition code as needed to match type */ -static sljit_s32 push_load_cc(struct sljit_compiler *compiler, sljit_s32 type) +static sljit_s32 update_zero_overflow(struct sljit_compiler *compiler, sljit_s32 op, sljit_gpr dst_r) { - type &= ~SLJIT_I32_OP; - switch (type) { - case SLJIT_ZERO: - case SLJIT_NOT_ZERO: - return push_inst(compiler, cih(flag_r, 0)); - break; - default: - return push_inst(compiler, tmlh(flag_r, 0x3000)); - break; - } - return SLJIT_SUCCESS; -} - -static sljit_s32 push_store_zero_flag(struct sljit_compiler *compiler, sljit_s32 op, sljit_gpr source) -{ - /* insert low 32-bits into high 32-bits of flag register */ - FAIL_IF(push_inst(compiler, risbhgz(flag_r, source, 0, 31, 32))); - if (!(op & SLJIT_I32_OP)) { - /* OR high 32-bits with high 32-bits of flag register */ - return push_inst(compiler, rosbg(flag_r, source, 0, 31, 0)); - } + /* Condition codes: bits 18 and 19. + Transformation: + 0 (zero and no overflow) : unchanged + 1 (non-zero and no overflow) : unchanged + 2 (zero and overflow) : decreased by 1 + 3 (non-zero and overflow) : decreased by 1 if non-zero */ + FAIL_IF(push_inst(compiler, brc(0xc, 2 + 2 + ((op & SLJIT_I32_OP) ? 1 : 2) + 2 + 3 + 1))); + FAIL_IF(push_inst(compiler, ipm(flag_r))); + FAIL_IF(push_inst(compiler, (op & SLJIT_I32_OP) ? or(dst_r, dst_r) : ogr(dst_r, dst_r))); + FAIL_IF(push_inst(compiler, brc(0x8, 2 + 3))); + FAIL_IF(push_inst(compiler, slfi(flag_r, 0x10000000))); + FAIL_IF(push_inst(compiler, spm(flag_r))); return SLJIT_SUCCESS; } @@ -1088,18 +964,19 @@ static sljit_s32 make_addr_bx(struct sljit_compiler *compiler, #define WHEN(cond, r, i1, i2, addr) \ (cond) ? EVAL(i1, r, addr) : EVAL(i2, r, addr) +/* May clobber tmp1. */ static sljit_s32 load_word(struct sljit_compiler *compiler, sljit_gpr dst, sljit_s32 src, sljit_sw srcw, - sljit_gpr tmp /* clobbered */, sljit_s32 is_32bit) + sljit_s32 is_32bit) { struct addr addr; sljit_ins ins; SLJIT_ASSERT(src & SLJIT_MEM); if (have_ldisp() || !is_32bit) - FAIL_IF(make_addr_bxy(compiler, &addr, src, srcw, tmp)); + FAIL_IF(make_addr_bxy(compiler, &addr, src, srcw, tmp1)); else - FAIL_IF(make_addr_bx(compiler, &addr, src, srcw, tmp)); + FAIL_IF(make_addr_bx(compiler, &addr, src, srcw, tmp1)); if (is_32bit) ins = WHEN(is_u12(addr.offset), dst, l, ly, addr); @@ -1109,18 +986,19 @@ static sljit_s32 load_word(struct sljit_compiler *compiler, sljit_gpr dst, return push_inst(compiler, ins); } +/* May clobber tmp1. */ static sljit_s32 store_word(struct sljit_compiler *compiler, sljit_gpr src, sljit_s32 dst, sljit_sw dstw, - sljit_gpr tmp /* clobbered */, sljit_s32 is_32bit) + sljit_s32 is_32bit) { struct addr addr; sljit_ins ins; SLJIT_ASSERT(dst & SLJIT_MEM); if (have_ldisp() || !is_32bit) - FAIL_IF(make_addr_bxy(compiler, &addr, dst, dstw, tmp)); + FAIL_IF(make_addr_bxy(compiler, &addr, dst, dstw, tmp1)); else - FAIL_IF(make_addr_bx(compiler, &addr, dst, dstw, tmp)); + FAIL_IF(make_addr_bx(compiler, &addr, dst, dstw, tmp1)); if (is_32bit) ins = WHEN(is_u12(addr.offset), src, st, sty, addr); @@ -1132,6 +1010,358 @@ static sljit_s32 store_word(struct sljit_compiler *compiler, sljit_gpr src, #undef WHEN +static sljit_s32 emit_move(struct sljit_compiler *compiler, + sljit_gpr dst_r, + sljit_s32 src, sljit_sw srcw) +{ + SLJIT_ASSERT(!SLOW_IS_REG(src) || dst_r != gpr(src & REG_MASK)); + + if (src & SLJIT_IMM) + return push_load_imm_inst(compiler, dst_r, srcw); + + if (src & SLJIT_MEM) + return load_word(compiler, dst_r, src, srcw, (compiler->mode & SLJIT_I32_OP) != 0); + + sljit_gpr src_r = gpr(src & REG_MASK); + return push_inst(compiler, (compiler->mode & SLJIT_I32_OP) ? lr(dst_r, src_r) : lgr(dst_r, src_r)); +} + +static sljit_s32 emit_rr(struct sljit_compiler *compiler, sljit_ins ins, + sljit_s32 dst, + sljit_s32 src1, sljit_sw src1w, + sljit_s32 src2, sljit_sw src2w) +{ + sljit_gpr dst_r = tmp0; + sljit_gpr src_r = tmp1; + sljit_s32 needs_move = 1; + + if (SLOW_IS_REG(dst)) { + dst_r = gpr(dst & REG_MASK); + + if (dst == src1) + needs_move = 0; + else if (dst == src2) { + dst_r = tmp0; + needs_move = 2; + } + } + + if (needs_move) + FAIL_IF(emit_move(compiler, dst_r, src1, src1w)); + + if (FAST_IS_REG(src2)) + src_r = gpr(src2 & REG_MASK); + else + FAIL_IF(emit_move(compiler, tmp1, src2, src2w)); + + FAIL_IF(push_inst(compiler, ins | (dst_r << 4) | src_r)); + + if (needs_move != 2) + return SLJIT_SUCCESS; + + dst_r = gpr(dst & REG_MASK); + return push_inst(compiler, (compiler->mode & SLJIT_I32_OP) ? lr(dst_r, tmp0) : lgr(dst_r, tmp0)); +} + +static sljit_s32 emit_rrf(struct sljit_compiler *compiler, sljit_ins ins, + sljit_s32 dst, + sljit_s32 src1, sljit_sw src1w, + sljit_s32 src2, sljit_sw src2w) +{ + sljit_gpr dst_r = SLOW_IS_REG(dst) ? gpr(dst & REG_MASK) : tmp0; + sljit_gpr src1_r = tmp0; + sljit_gpr src2_r = tmp1; + + if (FAST_IS_REG(src1)) + src1_r = gpr(src1 & REG_MASK); + else + FAIL_IF(emit_move(compiler, tmp0, src1, src1w)); + + if (FAST_IS_REG(src2)) + src2_r = gpr(src2 & REG_MASK); + else + FAIL_IF(emit_move(compiler, tmp1, src2, src2w)); + + return push_inst(compiler, ins | (dst_r << 4) | src1_r | (src2_r << 12)); +} + +typedef enum { + RI_A, + RIL_A, +} emit_ril_type; + +static sljit_s32 emit_ri(struct sljit_compiler *compiler, sljit_ins ins, + sljit_s32 dst, + sljit_s32 src1, sljit_sw src1w, + sljit_sw src2w, + emit_ril_type type) +{ + sljit_gpr dst_r = tmp0; + sljit_s32 needs_move = 1; + + if (SLOW_IS_REG(dst)) { + dst_r = gpr(dst & REG_MASK); + + if (dst == src1) + needs_move = 0; + } + + if (needs_move) + FAIL_IF(emit_move(compiler, dst_r, src1, src1w)); + + if (type == RIL_A) + return push_inst(compiler, ins | (dst_r << 36) | (src2w & 0xffffffff)); + return push_inst(compiler, ins | (dst_r << 20) | (src2w & 0xffff)); +} + +static sljit_s32 emit_rie_d(struct sljit_compiler *compiler, sljit_ins ins, + sljit_s32 dst, + sljit_s32 src1, sljit_sw src1w, + sljit_sw src2w) +{ + sljit_gpr dst_r = SLOW_IS_REG(dst) ? gpr(dst & REG_MASK) : tmp0; + sljit_gpr src_r = tmp0; + + if (!SLOW_IS_REG(src1)) + FAIL_IF(emit_move(compiler, tmp0, src1, src1w)); + else + src_r = gpr(src1 & REG_MASK); + + return push_inst(compiler, ins | (dst_r << 36) | (src_r << 32) | (src2w & 0xffff) << 16); +} + +typedef enum { + RX_A, + RXY_A, +} emit_rx_type; + +static sljit_s32 emit_rx(struct sljit_compiler *compiler, sljit_ins ins, + sljit_s32 dst, + sljit_s32 src1, sljit_sw src1w, + sljit_s32 src2, sljit_sw src2w, + emit_rx_type type) +{ + sljit_gpr dst_r = tmp0; + sljit_s32 needs_move = 1; + sljit_gpr base, index; + + SLJIT_ASSERT(src2 & SLJIT_MEM); + + if (SLOW_IS_REG(dst)) { + dst_r = gpr(dst); + + if (dst == src1) + needs_move = 0; + else if (dst == (src2 & REG_MASK) || (dst == OFFS_REG(src2))) { + dst_r = tmp0; + needs_move = 2; + } + } + + if (needs_move) + FAIL_IF(emit_move(compiler, dst_r, src1, src1w)); + + base = gpr(src2 & REG_MASK); + index = tmp0; + + if (src2 & OFFS_REG_MASK) { + index = gpr(OFFS_REG(src2)); + + if (src2w != 0) { + FAIL_IF(push_inst(compiler, sllg(tmp1, index, src2w & 0x3, 0))); + src2w = 0; + index = tmp1; + } + } else if ((type == RX_A && !is_u12(src2w)) || (type == RXY_A && !is_s20(src2w))) { + FAIL_IF(push_load_imm_inst(compiler, tmp1, src2w)); + + if (src2 & REG_MASK) + index = tmp1; + else + base = tmp1; + src2w = 0; + } + + if (type == RX_A) + ins |= (dst_r << 20) | (index << 16) | (base << 12) | src2w; + else + ins |= (dst_r << 36) | (index << 32) | (base << 28) | disp_s20(src2w); + + FAIL_IF(push_inst(compiler, ins)); + + if (needs_move != 2) + return SLJIT_SUCCESS; + + dst_r = gpr(dst); + return push_inst(compiler, (compiler->mode & SLJIT_I32_OP) ? lr(dst_r, tmp0) : lgr(dst_r, tmp0)); +} + +static sljit_s32 emit_siy(struct sljit_compiler *compiler, sljit_ins ins, + sljit_s32 dst, sljit_sw dstw, + sljit_sw srcw) +{ + SLJIT_ASSERT(dst & SLJIT_MEM); + + sljit_gpr dst_r = tmp1; + + if (dst & OFFS_REG_MASK) { + sljit_gpr index = tmp1; + + if ((dstw & 0x3) == 0) + index = gpr(OFFS_REG(dst)); + else + FAIL_IF(push_inst(compiler, sllg(tmp1, index, dstw & 0x3, 0))); + + FAIL_IF(push_inst(compiler, la(tmp1, 0, dst_r, index))); + dstw = 0; + } + else if (!is_s20(dstw)) { + FAIL_IF(push_load_imm_inst(compiler, tmp1, dstw)); + + if (dst & REG_MASK) + FAIL_IF(push_inst(compiler, la(tmp1, 0, dst_r, tmp1))); + + dstw = 0; + } + else + dst_r = gpr(dst & REG_MASK); + + return push_inst(compiler, ins | ((srcw & 0xff) << 32) | (dst_r << 28) | disp_s20(dstw)); +} + +struct ins_forms { + sljit_ins op_r; + sljit_ins op_gr; + sljit_ins op_rk; + sljit_ins op_grk; + sljit_ins op; + sljit_ins op_y; + sljit_ins op_g; +}; + +static sljit_s32 emit_commutative(struct sljit_compiler *compiler, const struct ins_forms *forms, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src1, sljit_sw src1w, + sljit_s32 src2, sljit_sw src2w) +{ + sljit_s32 mode = compiler->mode; + sljit_ins ins, ins_k; + + if ((src1 | src2) & SLJIT_MEM) { + sljit_ins ins12, ins20; + + if (mode & SLJIT_I32_OP) { + ins12 = forms->op; + ins20 = forms->op_y; + } + else { + ins12 = 0; + ins20 = forms->op_g; + } + + if (ins12 && ins20) { + /* Extra instructions needed for address computation can be executed independently. */ + if ((src2 & SLJIT_MEM) && (!(src1 & SLJIT_MEM) + || ((src1 & OFFS_REG_MASK) ? (src1w & 0x3) == 0 : is_s20(src1w)))) { + if ((src2 & OFFS_REG_MASK) || is_u12(src2w) || !is_s20(src2w)) + return emit_rx(compiler, ins12, dst, src1, src1w, src2, src2w, RX_A); + + return emit_rx(compiler, ins20, dst, src1, src1w, src2, src2w, RXY_A); + } + + if (src1 & SLJIT_MEM) { + if ((src1 & OFFS_REG_MASK) || is_u12(src1w) || !is_s20(src1w)) + return emit_rx(compiler, ins12, dst, src2, src2w, src1, src1w, RX_A); + + return emit_rx(compiler, ins20, dst, src2, src2w, src1, src1w, RXY_A); + } + } + else if (ins12 || ins20) { + emit_rx_type rx_type; + + if (ins12) { + rx_type = RX_A; + ins = ins12; + } + else { + rx_type = RXY_A; + ins = ins20; + } + + if ((src2 & SLJIT_MEM) && (!(src1 & SLJIT_MEM) + || ((src1 & OFFS_REG_MASK) ? (src1w & 0x3) == 0 : (rx_type == RX_A ? is_u12(src1w) : is_s20(src1w))))) + return emit_rx(compiler, ins, dst, src1, src1w, src2, src2w, rx_type); + + if (src1 & SLJIT_MEM) + return emit_rx(compiler, ins, dst, src2, src2w, src1, src1w, rx_type); + } + } + + if (mode & SLJIT_I32_OP) { + ins = forms->op_r; + ins_k = forms->op_rk; + } + else { + ins = forms->op_gr; + ins_k = forms->op_grk; + } + + SLJIT_ASSERT(ins != 0 || ins_k != 0); + + if (ins && SLOW_IS_REG(dst)) { + if (dst == src1) + return emit_rr(compiler, ins, dst, src1, src1w, src2, src2w); + + if (dst == src2) + return emit_rr(compiler, ins, dst, src2, src2w, src1, src1w); + } + + if (ins_k == 0) + return emit_rr(compiler, ins, dst, src1, src1w, src2, src2w); + + return emit_rrf(compiler, ins_k, dst, src1, src1w, src2, src2w); +} + +static sljit_s32 emit_non_commutative(struct sljit_compiler *compiler, const struct ins_forms *forms, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src1, sljit_sw src1w, + sljit_s32 src2, sljit_sw src2w) +{ + sljit_s32 mode = compiler->mode; + sljit_ins ins; + + if (src2 & SLJIT_MEM) { + sljit_ins ins12, ins20; + + if (mode & SLJIT_I32_OP) { + ins12 = forms->op; + ins20 = forms->op_y; + } + else { + ins12 = 0; + ins20 = forms->op_g; + } + + if (ins12 && ins20) { + if ((src2 & OFFS_REG_MASK) || is_u12(src2w) || !is_s20(src2w)) + return emit_rx(compiler, ins12, dst, src1, src1w, src2, src2w, RX_A); + + return emit_rx(compiler, ins20, dst, src1, src1w, src2, src2w, RXY_A); + } + else if (ins12) + return emit_rx(compiler, ins12, dst, src1, src1w, src2, src2w, RX_A); + else if (ins20) + return emit_rx(compiler, ins20, dst, src1, src1w, src2, src2w, RXY_A); + } + + ins = (mode & SLJIT_I32_OP) ? forms->op_rk : forms->op_grk; + + if (ins == 0 || (SLOW_IS_REG(dst) && dst == src1)) + return emit_rr(compiler, (mode & SLJIT_I32_OP) ? forms->op_r : forms->op_gr, dst, src1, src1w, src2, src2w); + + return emit_rrf(compiler, ins, dst, src1, src1w, src2, src2w); +} + SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compiler) { struct sljit_label *label; @@ -1465,7 +1695,8 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op0(struct sljit_compiler *compile op = GET_OPCODE(op) | (op & SLJIT_I32_OP); switch (op) { case SLJIT_BREAKPOINT: - /* TODO(mundaym): insert real breakpoint? */ + /* The following invalid instruction is emitted by gdb. */ + return push_inst(compiler, 0x0001 /* 2-byte trap */); case SLJIT_NOP: return push_inst(compiler, 0x0700 /* 2-byte nop */); case SLJIT_LMUL_UW: @@ -1559,6 +1790,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op1(struct sljit_compiler *compile /* TODO(carenas): implement prefetch? */ return SLJIT_SUCCESS; } + if (opcode >= SLJIT_MOV && opcode <= SLJIT_MOV_P) { /* LOAD REGISTER */ if (FAST_IS_REG(dst) && FAST_IS_REG(src)) { @@ -1609,11 +1841,6 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op1(struct sljit_compiler *compile SLJIT_UNREACHABLE(); } FAIL_IF(push_inst(compiler, ins)); - if (HAS_FLAGS(op)) { - /* only handle zero flag */ - SLJIT_ASSERT(!(op & VARIABLE_FLAG_MASK)); - return push_store_zero_flag(compiler, op, dst_r); - } return SLJIT_SUCCESS; } /* LOAD IMMEDIATE */ @@ -1690,11 +1917,6 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op1(struct sljit_compiler *compile SLJIT_UNREACHABLE(); } FAIL_IF(push_inst(compiler, ins)); - if (HAS_FLAGS(op)) { - /* only handle zero flag */ - SLJIT_ASSERT(!(op & VARIABLE_FLAG_MASK)); - return push_store_zero_flag(compiler, op, reg); - } return SLJIT_SUCCESS; } /* STORE and STORE IMMEDIATE */ @@ -1723,11 +1945,6 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op1(struct sljit_compiler *compile case SLJIT_MOV_P: case SLJIT_MOV: FAIL_IF(push_inst(compiler, LEVAL(stg))); - if (HAS_FLAGS(op)) { - /* only handle zero flag */ - SLJIT_ASSERT(!(op & VARIABLE_FLAG_MASK)); - return push_store_zero_flag(compiler, op, reg); - } return SLJIT_SUCCESS; default: SLJIT_UNREACHABLE(); @@ -1767,11 +1984,6 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op1(struct sljit_compiler *compile FAIL_IF(make_addr_bxy(compiler, &mem, dst, dstw, tmp1)); FAIL_IF(push_inst(compiler, EVAL(stg, tmp0, mem))); - if (HAS_FLAGS(op)) { - /* only handle zero flag */ - SLJIT_ASSERT(!(op & VARIABLE_FLAG_MASK)); - return push_store_zero_flag(compiler, op, tmp0); - } return SLJIT_SUCCESS; default: SLJIT_UNREACHABLE(); @@ -1785,7 +1997,9 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op1(struct sljit_compiler *compile dst_r = SLOW_IS_REG(dst) ? gpr(REG_MASK & dst) : tmp0; src_r = FAST_IS_REG(src) ? gpr(REG_MASK & src) : tmp0; if (src & SLJIT_MEM) - FAIL_IF(load_word(compiler, src_r, src, srcw, tmp1, src & SLJIT_I32_OP)); + FAIL_IF(load_word(compiler, src_r, src, srcw, src & SLJIT_I32_OP)); + + compiler->status_flags_state = op & (VARIABLE_FLAG_MASK | SLJIT_SET_Z); /* TODO(mundaym): optimize loads and stores */ switch (opcode | (op & SLJIT_I32_OP)) { @@ -1810,9 +2024,11 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op1(struct sljit_compiler *compile } break; case SLJIT_NEG: + compiler->status_flags_state |= SLJIT_CURRENT_FLAGS_ADD_SUB; FAIL_IF(push_inst(compiler, lcgr(dst_r, src_r))); break; case SLJIT_NEG32: + compiler->status_flags_state |= SLJIT_CURRENT_FLAGS_ADD_SUB; FAIL_IF(push_inst(compiler, lcr(dst_r, src_r))); break; case SLJIT_CLZ: @@ -1839,17 +2055,12 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op1(struct sljit_compiler *compile SLJIT_UNREACHABLE(); } - /* write condition code to emulated flag register */ - if (op & VARIABLE_FLAG_MASK) - FAIL_IF(push_inst(compiler, ipm(flag_r))); - - /* write zero flag to emulated flag register */ - if (op & SLJIT_SET_Z) - FAIL_IF(push_store_zero_flag(compiler, op, dst_r)); + if ((op & (SLJIT_SET_Z | VARIABLE_FLAG_MASK)) == (SLJIT_SET_Z | SLJIT_SET_OVERFLOW)) + FAIL_IF(update_zero_overflow(compiler, op, dst_r)); /* TODO(carenas): doesn't need FAIL_IF */ if ((dst != SLJIT_UNUSED) && (dst & SLJIT_MEM)) - FAIL_IF(store_word(compiler, dst_r, dst, dstw, tmp1, op & SLJIT_I32_OP)); + FAIL_IF(store_word(compiler, dst_r, dst, dstw, op & SLJIT_I32_OP)); return SLJIT_SUCCESS; } @@ -1887,60 +2098,492 @@ static SLJIT_INLINE int sets_signed_flag(sljit_s32 op) return 0; } -/* Report whether we have an instruction for: - op dst src imm - where dst and src are separate registers. */ -static int have_op_3_imm(sljit_s32 op, sljit_sw imm) { - return 0; /* TODO(mundaym): implement */ -} +static const struct ins_forms add_forms = { + 0x1a00, /* ar */ + 0xb9080000, /* agr */ + 0xb9f80000, /* ark */ + 0xb9e80000, /* agrk */ + 0x5a000000, /* a */ + 0xe3000000005a, /* ay */ + 0xe30000000008, /* ag */ +}; -/* Report whether we have an instruction for: - op reg imm - where reg is both a source and the destination. */ -static int have_op_2_imm(sljit_s32 op, sljit_sw imm) { - switch (GET_OPCODE(op) | (op & SLJIT_I32_OP)) { - case SLJIT_ADD32: - case SLJIT_ADD: - if (!HAS_FLAGS(op) || sets_signed_flag(op)) - return have_eimm() ? is_s32(imm) : is_s16(imm); +static const struct ins_forms logical_add_forms = { + 0x1e00, /* alr */ + 0xb90a0000, /* algr */ + 0xb9fa0000, /* alrk */ + 0xb9ea0000, /* algrk */ + 0x5e000000, /* al */ + 0xe3000000005e, /* aly */ + 0xe3000000000a, /* alg */ +}; - return have_eimm() && is_u32(imm); - case SLJIT_MUL32: - case SLJIT_MUL: - /* TODO(mundaym): general extension check */ - /* for ms{,g}fi */ - if (op & VARIABLE_FLAG_MASK) - return 0; +static sljit_s32 sljit_emit_add(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src1, sljit_sw src1w, + sljit_s32 src2, sljit_sw src2w) +{ + int sets_overflow = (op & VARIABLE_FLAG_MASK) == SLJIT_SET_OVERFLOW; + int sets_zero_overflow = (op & (SLJIT_SET_Z | VARIABLE_FLAG_MASK)) == (SLJIT_SET_Z | SLJIT_SET_OVERFLOW); + const struct ins_forms *forms; + sljit_ins ins; - return have_genext() && is_s16(imm); - case SLJIT_OR32: - case SLJIT_XOR32: - case SLJIT_AND32: - /* only use if have extended immediate facility */ - /* this ensures flags are set correctly */ - return have_eimm(); - case SLJIT_AND: - case SLJIT_OR: - case SLJIT_XOR: - /* TODO(mundaym): make this more flexible */ - /* avoid using immediate variations, flags */ - /* won't be set correctly */ - return 0; - case SLJIT_ADDC32: - case SLJIT_ADDC: - /* no ADD LOGICAL WITH CARRY IMMEDIATE */ - return 0; - case SLJIT_SUB: - case SLJIT_SUB32: - case SLJIT_SUBC: - case SLJIT_SUBC32: - /* no SUBTRACT IMMEDIATE */ - /* TODO(mundaym): SUBTRACT LOGICAL IMMEDIATE */ - return 0; + if (src2 & SLJIT_IMM) { + if (!sets_zero_overflow && is_s8(src2w) && (src1 & SLJIT_MEM) && (dst == src1 && dstw == src1w)) { + if (sets_overflow) + ins = (op & SLJIT_I32_OP) ? 0xeb000000006a /* asi */ : 0xeb000000007a /* agsi */; + else + ins = (op & SLJIT_I32_OP) ? 0xeb000000006e /* alsi */ : 0xeb000000007e /* algsi */; + return emit_siy(compiler, ins, dst, dstw, src2w); + } + + if (is_s16(src2w)) { + if (sets_overflow) + ins = (op & SLJIT_I32_OP) ? 0xec00000000d8 /* ahik */ : 0xec00000000d9 /* aghik */; + else + ins = (op & SLJIT_I32_OP) ? 0xec00000000da /* alhsik */ : 0xec00000000db /* alghsik */; + FAIL_IF(emit_rie_d(compiler, ins, dst, src1, src1w, src2w)); + goto done; + } + + if (!sets_overflow) { + if ((op & SLJIT_I32_OP) || is_u32(src2w)) { + ins = (op & SLJIT_I32_OP) ? 0xc20b00000000 /* alfi */ : 0xc20a00000000 /* algfi */; + FAIL_IF(emit_ri(compiler, ins, dst, src1, src1w, src2w, RIL_A)); + goto done; + } + if (is_u32(-src2w)) { + FAIL_IF(emit_ri(compiler, 0xc20400000000 /* slgfi */, dst, src1, src1w, -src2w, RIL_A)); + goto done; + } + } + else if ((op & SLJIT_I32_OP) || is_s32(src2w)) { + ins = (op & SLJIT_I32_OP) ? 0xc20900000000 /* afi */ : 0xc20800000000 /* agfi */; + FAIL_IF(emit_ri(compiler, ins, dst, src1, src1w, src2w, RIL_A)); + goto done; + } } - return 0; + + forms = sets_overflow ? &add_forms : &logical_add_forms; + FAIL_IF(emit_commutative(compiler, forms, dst, dstw, src1, src1w, src2, src2w)); + +done: + if (sets_zero_overflow) + FAIL_IF(update_zero_overflow(compiler, op, SLOW_IS_REG(dst) ? gpr(dst & REG_MASK) : tmp0)); + + if (dst & SLJIT_MEM) + return store_word(compiler, tmp0, dst, dstw, op & SLJIT_I32_OP); + + return SLJIT_SUCCESS; } +static const struct ins_forms sub_forms = { + 0x1b00, /* sr */ + 0xb9090000, /* sgr */ + 0xb9f90000, /* srk */ + 0xb9e90000, /* sgrk */ + 0x5b000000, /* s */ + 0xe3000000005b, /* sy */ + 0xe30000000009, /* sg */ +}; + +static const struct ins_forms logical_sub_forms = { + 0x1f00, /* slr */ + 0xb90b0000, /* slgr */ + 0xb9fb0000, /* slrk */ + 0xb9eb0000, /* slgrk */ + 0x5f000000, /* sl */ + 0xe3000000005f, /* sly */ + 0xe3000000000b, /* slg */ +}; + +static sljit_s32 sljit_emit_sub(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src1, sljit_sw src1w, + sljit_s32 src2, sljit_sw src2w) +{ + int sets_signed = sets_signed_flag(op); + int sets_zero_overflow = (op & (SLJIT_SET_Z | VARIABLE_FLAG_MASK)) == (SLJIT_SET_Z | SLJIT_SET_OVERFLOW); + const struct ins_forms *forms; + sljit_ins ins; + + if (dst == SLJIT_UNUSED && GET_FLAG_TYPE(op) <= SLJIT_SIG_LESS_EQUAL) { + int compare_signed = GET_FLAG_TYPE(op) >= SLJIT_SIG_LESS; + + compiler->status_flags_state |= SLJIT_CURRENT_FLAGS_COMPARE; + + if (src2 & SLJIT_IMM) { + if (compare_signed || ((op & VARIABLE_FLAG_MASK) == 0 && is_s32(src2w))) + { + if ((op & SLJIT_I32_OP) || is_s32(src2w)) { + ins = (op & SLJIT_I32_OP) ? 0xc20d00000000 /* cfi */ : 0xc20c00000000 /* cgfi */; + return emit_ri(compiler, ins, src1, src1, src1w, src2w, RIL_A); + } + } + else { + if ((op & SLJIT_I32_OP) || is_u32(src2w)) { + ins = (op & SLJIT_I32_OP) ? 0xc20f00000000 /* clfi */ : 0xc20e00000000 /* clgfi */; + return emit_ri(compiler, ins, src1, src1, src1w, src2w, RIL_A); + } + if (is_s16(src2w)) + return emit_rie_d(compiler, 0xec00000000db /* alghsik */, SLJIT_UNUSED, src1, src1w, src2w); + } + } + else if (src2 & SLJIT_MEM) { + if ((op & SLJIT_I32_OP) && ((src2 & OFFS_REG_MASK) || is_u12(src2w))) { + ins = compare_signed ? 0x59000000 /* c */ : 0x55000000 /* cl */; + return emit_rx(compiler, ins, src1, src1, src1w, src2, src2w, RX_A); + } + + if (compare_signed) + ins = (op & SLJIT_I32_OP) ? 0xe30000000059 /* cy */ : 0xe30000000020 /* cg */; + else + ins = (op & SLJIT_I32_OP) ? 0xe30000000055 /* cly */ : 0xe30000000021 /* clg */; + return emit_rx(compiler, ins, src1, src1, src1w, src2, src2w, RXY_A); + } + + if (compare_signed) + ins = (op & SLJIT_I32_OP) ? 0x1900 /* cr */ : 0xb9200000 /* cgr */; + else + ins = (op & SLJIT_I32_OP) ? 0x1500 /* clr */ : 0xb9210000 /* clgr */; + return emit_rr(compiler, ins, src1, src1, src1w, src2, src2w); + } + + if (src2 & SLJIT_IMM) { + sljit_sw neg_src2w = -src2w; + + if (sets_signed || neg_src2w != 0 || (op & (SLJIT_SET_Z | VARIABLE_FLAG_MASK)) == 0) { + if (!sets_zero_overflow && is_s8(neg_src2w) && (src1 & SLJIT_MEM) && (dst == src1 && dstw == src1w)) { + if (sets_signed) + ins = (op & SLJIT_I32_OP) ? 0xeb000000006a /* asi */ : 0xeb000000007a /* agsi */; + else + ins = (op & SLJIT_I32_OP) ? 0xeb000000006e /* alsi */ : 0xeb000000007e /* algsi */; + return emit_siy(compiler, ins, dst, dstw, neg_src2w); + } + + if (is_s16(neg_src2w)) { + if (sets_signed) + ins = (op & SLJIT_I32_OP) ? 0xec00000000d8 /* ahik */ : 0xec00000000d9 /* aghik */; + else + ins = (op & SLJIT_I32_OP) ? 0xec00000000da /* alhsik */ : 0xec00000000db /* alghsik */; + FAIL_IF(emit_rie_d(compiler, ins, dst, src1, src1w, neg_src2w)); + goto done; + } + } + + if (!sets_signed) { + if ((op & SLJIT_I32_OP) || is_u32(src2w)) { + ins = (op & SLJIT_I32_OP) ? 0xc20500000000 /* slfi */ : 0xc20400000000 /* slgfi */; + FAIL_IF(emit_ri(compiler, ins, dst, src1, src1w, src2w, RIL_A)); + goto done; + } + if (is_u32(neg_src2w)) { + FAIL_IF(emit_ri(compiler, 0xc20a00000000 /* algfi */, dst, src1, src1w, neg_src2w, RIL_A)); + goto done; + } + } + else if ((op & SLJIT_I32_OP) || is_s32(neg_src2w)) { + ins = (op & SLJIT_I32_OP) ? 0xc20900000000 /* afi */ : 0xc20800000000 /* agfi */; + FAIL_IF(emit_ri(compiler, ins, dst, src1, src1w, neg_src2w, RIL_A)); + goto done; + } + } + + forms = sets_signed ? &sub_forms : &logical_sub_forms; + FAIL_IF(emit_non_commutative(compiler, forms, dst, dstw, src1, src1w, src2, src2w)); + +done: + if (sets_signed) { + sljit_gpr dst_r = SLOW_IS_REG(dst) ? gpr(dst & REG_MASK) : tmp0; + + if ((op & VARIABLE_FLAG_MASK) != SLJIT_SET_OVERFLOW) { + /* In case of overflow, the sign bit of the two source operands must be different, and + - the first operand is greater if the sign bit of the result is set + - the first operand is less if the sign bit of the result is not set + The -result operation sets the corrent sign, because the result cannot be zero. + The overflow is considered greater, since the result must be equal to INT_MIN so its sign bit is set. */ + FAIL_IF(push_inst(compiler, brc(0xe, 2 + 2))); + FAIL_IF(push_inst(compiler, (op & SLJIT_I32_OP) ? lcr(tmp1, dst_r) : lcgr(tmp1, dst_r))); + } + else if (op & SLJIT_SET_Z) + FAIL_IF(update_zero_overflow(compiler, op, dst_r)); + } + + if (dst & SLJIT_MEM) + return store_word(compiler, tmp0, dst, dstw, op & SLJIT_I32_OP); + + return SLJIT_SUCCESS; +} + +static const struct ins_forms multiply_forms = { + 0xb2520000, /* msr */ + 0xb90c0000, /* msgr */ + 0xb9fd0000, /* msrkc */ + 0xb9ed0000, /* msgrkc */ + 0x71000000, /* ms */ + 0xe30000000051, /* msy */ + 0xe3000000000c, /* msg */ +}; + +static const struct ins_forms multiply_overflow_forms = { + 0, + 0, + 0xb9fd0000, /* msrkc */ + 0xb9ed0000, /* msgrkc */ + 0, + 0xe30000000053, /* msc */ + 0xe30000000083, /* msgc */ +}; + +static sljit_s32 sljit_emit_multiply(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src1, sljit_sw src1w, + sljit_s32 src2, sljit_sw src2w) +{ + sljit_ins ins; + + if (HAS_FLAGS(op)) { + /* if have_misc2 fails, this operation should be emulated. 32 bit emulation: + FAIL_IF(push_inst(compiler, lgfr(tmp0, src1_r))); + FAIL_IF(push_inst(compiler, msgfr(tmp0, src2_r))); + if (dst_r != tmp0) { + FAIL_IF(push_inst(compiler, lr(dst_r, tmp0))); + } + FAIL_IF(push_inst(compiler, aih(tmp0, 1))); + FAIL_IF(push_inst(compiler, nihf(tmp0, ~1U))); + FAIL_IF(push_inst(compiler, ipm(flag_r))); + FAIL_IF(push_inst(compiler, oilh(flag_r, 0x2000))); */ + + return emit_commutative(compiler, &multiply_overflow_forms, dst, dstw, src1, src1w, src2, src2w); + } + + if (src2 & SLJIT_IMM) { + if (is_s16(src2w)) { + ins = (op & SLJIT_I32_OP) ? 0xa70c0000 /* mhi */ : 0xa70d0000 /* mghi */; + return emit_ri(compiler, ins, dst, src1, src1w, src2w, RI_A); + } + + if (is_s32(src2w)) { + ins = (op & SLJIT_I32_OP) ? 0xc20100000000 /* msfi */ : 0xc20000000000 /* msgfi */; + return emit_ri(compiler, ins, dst, src1, src1w, src2w, RIL_A); + } + } + + return emit_commutative(compiler, &multiply_forms, dst, dstw, src1, src1w, src2, src2w); +} + +static sljit_s32 sljit_emit_bitwise_imm(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src1, sljit_sw src1w, + sljit_uw imm, sljit_s32 count16) +{ + sljit_s32 mode = compiler->mode; + sljit_gpr dst_r = tmp0; + sljit_s32 needs_move = 1; + + if (SLOW_IS_REG(dst)) { + dst_r = gpr(dst & REG_MASK); + if (dst == src1) + needs_move = 0; + } + + if (needs_move) + FAIL_IF(emit_move(compiler, dst_r, src1, src1w)); + + if (type == SLJIT_AND) { + if (!(mode & SLJIT_I32_OP)) + FAIL_IF(push_inst(compiler, 0xc00a00000000 /* nihf */ | (dst_r << 36) | (imm >> 32))); + return push_inst(compiler, 0xc00b00000000 /* nilf */ | (dst_r << 36) | (imm & 0xffffffff)); + } + else if (type == SLJIT_OR) { + if (count16 >= 3) { + FAIL_IF(push_inst(compiler, 0xc00c00000000 /* oihf */ | (dst_r << 36) | (imm >> 32))); + return push_inst(compiler, 0xc00d00000000 /* oilf */ | (dst_r << 36) | (imm & 0xffffffff)); + } + + if (count16 >= 2) { + if ((imm & 0x00000000ffffffffull) == 0) + return push_inst(compiler, 0xc00c00000000 /* oihf */ | (dst_r << 36) | (imm >> 32)); + if ((imm & 0xffffffff00000000ull) == 0) + return push_inst(compiler, 0xc00d00000000 /* oilf */ | (dst_r << 36) | (imm & 0xffffffff)); + } + + if ((imm & 0xffff000000000000ull) != 0) + FAIL_IF(push_inst(compiler, 0xa5080000 /* oihh */ | (dst_r << 20) | (imm >> 48))); + if ((imm & 0x0000ffff00000000ull) != 0) + FAIL_IF(push_inst(compiler, 0xa5090000 /* oihl */ | (dst_r << 20) | ((imm >> 32) & 0xffff))); + if ((imm & 0x00000000ffff0000ull) != 0) + FAIL_IF(push_inst(compiler, 0xa50a0000 /* oilh */ | (dst_r << 20) | ((imm >> 16) & 0xffff))); + if ((imm & 0x000000000000ffffull) != 0 || imm == 0) + return push_inst(compiler, 0xa50b0000 /* oill */ | (dst_r << 20) | (imm & 0xffff)); + return SLJIT_SUCCESS; + } + + if ((imm & 0xffffffff00000000ull) != 0) + FAIL_IF(push_inst(compiler, 0xc00600000000 /* xihf */ | (dst_r << 36) | (imm >> 32))); + if ((imm & 0x00000000ffffffffull) != 0 || imm == 0) + return push_inst(compiler, 0xc00700000000 /* xilf */ | (dst_r << 36) | (imm & 0xffffffff)); + return SLJIT_SUCCESS; +} + +static const struct ins_forms bitwise_and_forms = { + 0x1400, /* nr */ + 0xb9800000, /* ngr */ + 0xb9f40000, /* nrk */ + 0xb9e40000, /* ngrk */ + 0x54000000, /* n */ + 0xe30000000054, /* ny */ + 0xe30000000080, /* ng */ +}; + +static const struct ins_forms bitwise_or_forms = { + 0x1600, /* or */ + 0xb9810000, /* ogr */ + 0xb9f60000, /* ork */ + 0xb9e60000, /* ogrk */ + 0x56000000, /* o */ + 0xe30000000056, /* oy */ + 0xe30000000081, /* og */ +}; + +static const struct ins_forms bitwise_xor_forms = { + 0x1700, /* xr */ + 0xb9820000, /* xgr */ + 0xb9f70000, /* xrk */ + 0xb9e70000, /* xgrk */ + 0x57000000, /* x */ + 0xe30000000057, /* xy */ + 0xe30000000082, /* xg */ +}; + +static sljit_s32 sljit_emit_bitwise(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src1, sljit_sw src1w, + sljit_s32 src2, sljit_sw src2w) +{ + sljit_s32 type = GET_OPCODE(op); + const struct ins_forms *forms; + + if ((src2 & SLJIT_IMM) && (!(op & SLJIT_SET_Z) || (type == SLJIT_AND && dst == SLJIT_UNUSED))) { + sljit_s32 count16 = 0; + sljit_uw imm = (sljit_uw)src2w; + + if (op & SLJIT_I32_OP) + imm &= 0xffffffffull; + + if ((imm & 0x000000000000ffffull) != 0 || imm == 0) + count16++; + if ((imm & 0x00000000ffff0000ull) != 0) + count16++; + if ((imm & 0x0000ffff00000000ull) != 0) + count16++; + if ((imm & 0xffff000000000000ull) != 0) + count16++; + + if (type == SLJIT_AND && dst == SLJIT_UNUSED && count16 == 1) { + sljit_gpr src_r = tmp0; + + if (FAST_IS_REG(src1)) + src_r = gpr(src1 & REG_MASK); + else + FAIL_IF(emit_move(compiler, tmp0, src1, src1w)); + + if ((imm & 0x000000000000ffffull) != 0 || imm == 0) + return push_inst(compiler, 0xa7010000 | (src_r << 20) | imm); + if ((imm & 0x00000000ffff0000ull) != 0) + return push_inst(compiler, 0xa7000000 | (src_r << 20) | (imm >> 16)); + if ((imm & 0x0000ffff00000000ull) != 0) + return push_inst(compiler, 0xa7030000 | (src_r << 20) | (imm >> 32)); + return push_inst(compiler, 0xa7020000 | (src_r << 20) | (imm >> 48)); + } + + if (!(op & SLJIT_SET_Z)) + return sljit_emit_bitwise_imm(compiler, type, dst, dstw, src1, src1w, imm, count16); + } + + if (type == SLJIT_AND) + forms = &bitwise_and_forms; + else if (type == SLJIT_OR) + forms = &bitwise_or_forms; + else + forms = &bitwise_xor_forms; + + return emit_commutative(compiler, forms, dst, dstw, src1, src1w, src2, src2w); +} + +static sljit_s32 sljit_emit_shift(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src1, sljit_sw src1w, + sljit_s32 src2, sljit_sw src2w) +{ + sljit_s32 type = GET_OPCODE(op); + sljit_gpr dst_r = SLOW_IS_REG(dst) ? gpr(dst & REG_MASK) : tmp0; + sljit_gpr src_r = tmp0; + sljit_gpr base_r = tmp0; + sljit_ins imm = 0; + sljit_ins ins; + + if (FAST_IS_REG(src1)) + src_r = gpr(src1 & REG_MASK); + else + FAIL_IF(emit_move(compiler, tmp0, src1, src1w)); + + if (src2 & SLJIT_IMM) + imm = src2w & ((op & SLJIT_I32_OP) ? 0x1f : 0x3f); + else if (FAST_IS_REG(src2)) + base_r = gpr(src2 & REG_MASK); + else { + FAIL_IF(emit_move(compiler, tmp1, src2, src2w)); + base_r = tmp1; + } + + if ((op & SLJIT_I32_OP) && dst_r == src_r) { + if (type == SLJIT_SHL) + ins = 0x89000000 /* sll */; + else if (type == SLJIT_LSHR) + ins = 0x88000000 /* srl */; + else + ins = 0x8a000000 /* sra */; + + FAIL_IF(push_inst(compiler, ins | (dst_r << 20) | (base_r << 12) | imm)); + } + else { + if (type == SLJIT_SHL) + ins = (op & SLJIT_I32_OP) ? 0xeb00000000df /* sllk */ : 0xeb000000000d /* sllg */; + else if (type == SLJIT_LSHR) + ins = (op & SLJIT_I32_OP) ? 0xeb00000000de /* srlk */ : 0xeb000000000c /* srlg */; + else + ins = (op & SLJIT_I32_OP) ? 0xeb00000000dc /* srak */ : 0xeb000000000a /* srag */; + + FAIL_IF(push_inst(compiler, ins | (dst_r << 36) | (src_r << 32) | (base_r << 28) | (imm << 16))); + } + + if ((op & SLJIT_SET_Z) && type != SLJIT_ASHR) + return push_inst(compiler, (op & SLJIT_I32_OP) ? or(dst_r, dst_r) : ogr(dst_r, dst_r)); + + return SLJIT_SUCCESS; +} + +static const struct ins_forms addc_forms = { + 0xb9980000, /* alcr */ + 0xb9880000, /* alcgr */ + 0, + 0, + 0, + 0xe30000000098, /* alc */ + 0xe30000000088, /* alcg */ +}; + +static const struct ins_forms subc_forms = { + 0xb9990000, /* slbr */ + 0xb9890000, /* slbgr */ + 0, + 0, + 0, + 0xe30000000099, /* slb */ + 0xe30000000089, /* slbg */ +}; + SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op2(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 dst, sljit_sw dstw, sljit_s32 src1, sljit_sw src1w, @@ -1955,462 +2598,54 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op2(struct sljit_compiler *compile if (dst == SLJIT_UNUSED && !HAS_FLAGS(op)) return SLJIT_SUCCESS; - sljit_gpr dst_r = SLOW_IS_REG(dst) ? gpr(dst & REG_MASK) : tmp0; + compiler->mode = op & SLJIT_I32_OP; + compiler->status_flags_state = op & (VARIABLE_FLAG_MASK | SLJIT_SET_Z); - if (is_commutative(op)) { - #define SWAP_ARGS \ - do { \ - sljit_s32 t = src1; \ - sljit_sw tw = src1w; \ - src1 = src2; \ - src1w = src2w; \ - src2 = t; \ - src2w = tw; \ - } while(0); + if (GET_OPCODE(op) >= SLJIT_ADD || GET_OPCODE(op) <= SLJIT_SUBC) + compiler->status_flags_state |= SLJIT_CURRENT_FLAGS_ADD_SUB; - /* prefer immediate in src2 */ - if (src1 & SLJIT_IMM) { - SWAP_ARGS - } + if (is_commutative(op) && (src1 & SLJIT_IMM) && !(src2 & SLJIT_IMM)) { + src1 ^= src2; + src2 ^= src1; + src1 ^= src2; - /* prefer to have src1 use same register as dst */ - if (FAST_IS_REG(src2) && gpr(src2 & REG_MASK) == dst_r) { - SWAP_ARGS - } - - /* prefer memory argument in src2 */ - if (FAST_IS_REG(src2) && (src1 & SLJIT_MEM)) { - SWAP_ARGS - } - #undef SWAP_ARGS + src1w ^= src2w; + src2w ^= src1w; + src1w ^= src2w; } - /* src1 must be in a register */ - sljit_gpr src1_r = FAST_IS_REG(src1) ? gpr(src1 & REG_MASK) : tmp0; - if (src1 & SLJIT_IMM) - FAIL_IF(push_load_imm_inst(compiler, src1_r, src1w)); - - if (src1 & SLJIT_MEM) - FAIL_IF(load_word(compiler, src1_r, src1, src1w, tmp1, op & SLJIT_I32_OP)); - - /* emit comparison before subtract */ - if (GET_OPCODE(op) == SLJIT_SUB && (op & VARIABLE_FLAG_MASK)) { - sljit_sw cmp = 0; - switch (GET_FLAG_TYPE(op)) { - case SLJIT_LESS: - case SLJIT_LESS_EQUAL: - case SLJIT_GREATER: - case SLJIT_GREATER_EQUAL: - cmp = 1; /* unsigned */ - break; - case SLJIT_EQUAL: - case SLJIT_SIG_LESS: - case SLJIT_SIG_LESS_EQUAL: - case SLJIT_SIG_GREATER: - case SLJIT_SIG_GREATER_EQUAL: - cmp = -1; /* signed */ - break; - } - if (cmp) { - /* clear flags - no need to generate now */ - op &= ~VARIABLE_FLAG_MASK; - sljit_gpr src2_r = FAST_IS_REG(src2) ? gpr(src2 & REG_MASK) : tmp1; - if (src2 & SLJIT_IMM) { - #define LEVAL(i) i(src1_r, src2w) - if (cmp > 0 && is_u32(src2w)) { - /* unsigned */ - FAIL_IF(push_inst(compiler, - WHEN2(op & SLJIT_I32_OP, clfi, clgfi))); - } - else if (cmp < 0 && is_s16(src2w)) { - /* signed */ - FAIL_IF(push_inst(compiler, - WHEN2(op & SLJIT_I32_OP, chi, cghi))); - } - else if (cmp < 0 && is_s32(src2w)) { - /* signed */ - FAIL_IF(push_inst(compiler, - WHEN2(op & SLJIT_I32_OP, cfi, cgfi))); - } - #undef LEVAL - #define LEVAL(i) i(src1_r, src2_r) - else { - FAIL_IF(push_load_imm_inst(compiler, src2_r, src2w)); - if (cmp > 0) { - /* unsigned */ - FAIL_IF(push_inst(compiler, - WHEN2(op & SLJIT_I32_OP, clr, clgr))); - } - if (cmp < 0) { - /* signed */ - FAIL_IF(push_inst(compiler, - WHEN2(op & SLJIT_I32_OP, cr, cgr))); - } - } - } - else { - if (src2 & SLJIT_MEM) { - /* TODO(mundaym): comparisons with memory */ - /* load src2 into register */ - FAIL_IF(load_word(compiler, src2_r, src2, src2w, tmp1, op & SLJIT_I32_OP)); - } - if (cmp > 0) { - /* unsigned */ - FAIL_IF(push_inst(compiler, - WHEN2(op & SLJIT_I32_OP, clr, clgr))); - } - if (cmp < 0) { - /* signed */ - FAIL_IF(push_inst(compiler, - WHEN2(op & SLJIT_I32_OP, cr, cgr))); - } - #undef LEVAL - } - FAIL_IF(push_inst(compiler, ipm(flag_r))); - } - } - - if (!HAS_FLAGS(op) && dst == SLJIT_UNUSED) + switch (GET_OPCODE(op)) { + case SLJIT_ADD: + return sljit_emit_add(compiler, op, dst, dstw, src1, src1w, src2, src2w); + case SLJIT_ADDC: + FAIL_IF(emit_commutative(compiler, &addc_forms, dst, dstw, src1, src1w, src2, src2w)); + if (dst & SLJIT_MEM) + return store_word(compiler, tmp0, dst, dstw, op & SLJIT_I32_OP); return SLJIT_SUCCESS; - - /* need to specify signed or logical operation */ - int signed_flags = sets_signed_flag(op); - - if (is_shift(op)) { - /* handle shifts first, they have more constraints than other operations */ - sljit_sw d = 0; - sljit_gpr b = FAST_IS_REG(src2) ? gpr(src2 & REG_MASK) : r0; - if (src2 & SLJIT_IMM) - d = src2w & ((op & SLJIT_I32_OP) ? 31 : 63); - - if (src2 & SLJIT_MEM) { - /* shift amount (b) cannot be in r0 (i.e. tmp0) */ - FAIL_IF(load_word(compiler, tmp1, src2, src2w, tmp1, op & SLJIT_I32_OP)); - b = tmp1; - } - /* src1 and dst share the same register in the base 32-bit ISA */ - /* TODO(mundaym): not needed when distinct-operand facility is available */ - int workaround_alias = op & SLJIT_I32_OP && src1_r != dst_r; - if (workaround_alias) { - /* put src1 into tmp0 so we can overwrite it */ - FAIL_IF(push_inst(compiler, lr(tmp0, src1_r))); - src1_r = tmp0; - } - switch (GET_OPCODE(op) | (op & SLJIT_I32_OP)) { - case SLJIT_SHL: - FAIL_IF(push_inst(compiler, sllg(dst_r, src1_r, d, b))); - break; - case SLJIT_SHL32: - FAIL_IF(push_inst(compiler, sll(src1_r, d, b))); - break; - case SLJIT_LSHR: - FAIL_IF(push_inst(compiler, srlg(dst_r, src1_r, d, b))); - break; - case SLJIT_LSHR32: - FAIL_IF(push_inst(compiler, srl(src1_r, d, b))); - break; - case SLJIT_ASHR: - FAIL_IF(push_inst(compiler, srag(dst_r, src1_r, d, b))); - break; - case SLJIT_ASHR32: - FAIL_IF(push_inst(compiler, sra(src1_r, d, b))); - break; - default: - SLJIT_UNREACHABLE(); - } - if (workaround_alias && dst_r != src1_r) - FAIL_IF(push_inst(compiler, lr(dst_r, src1_r))); - - } - else if ((GET_OPCODE(op) == SLJIT_MUL) && HAS_FLAGS(op)) { - /* multiply instructions do not generally set flags so we need to manually */ - /* detect overflow conditions */ - /* TODO(mundaym): 64-bit overflow */ - SLJIT_ASSERT(GET_FLAG_TYPE(op) == SLJIT_MUL_OVERFLOW || - GET_FLAG_TYPE(op) == SLJIT_MUL_NOT_OVERFLOW); - sljit_gpr src2_r = FAST_IS_REG(src2) ? gpr(src2 & REG_MASK) : tmp1; - if (src2 & SLJIT_IMM) { - /* load src2 into register */ - FAIL_IF(push_load_imm_inst(compiler, src2_r, src2w)); - } - if (src2 & SLJIT_MEM) { - /* load src2 into register */ - FAIL_IF(load_word(compiler, src2_r, src2, src2w, tmp1, op & SLJIT_I32_OP)); - } - if (have_misc2()) { - #define LEVAL(i) i(dst_r, src1_r, src2_r) - FAIL_IF(push_inst(compiler, - WHEN2(op & SLJIT_I32_OP, msrkc, msgrkc))); - #undef LEVAL - } - else if (op & SLJIT_I32_OP) { - op &= ~VARIABLE_FLAG_MASK; - FAIL_IF(push_inst(compiler, lgfr(tmp0, src1_r))); - FAIL_IF(push_inst(compiler, msgfr(tmp0, src2_r))); - if (dst_r != tmp0) { - FAIL_IF(push_inst(compiler, lr(dst_r, tmp0))); - } - FAIL_IF(push_inst(compiler, aih(tmp0, 1))); - FAIL_IF(push_inst(compiler, nihf(tmp0, ~1U))); - FAIL_IF(push_inst(compiler, ipm(flag_r))); - FAIL_IF(push_inst(compiler, oilh(flag_r, 0x2000))); - } - else - return SLJIT_ERR_UNSUPPORTED; - - } - else if ((GET_OPCODE(op) == SLJIT_SUB) && (op & SLJIT_SET_Z) && !signed_flags) { - /* subtract logical instructions do not set the right flags unfortunately */ - /* instead, negate src2 and issue an add logical */ - /* TODO(mundaym): distinct operand facility where needed */ - if (src1_r != dst_r && src1_r != tmp0) { - #define LEVAL(i) i(tmp0, src1_r) - FAIL_IF(push_inst(compiler, - WHEN2(op & SLJIT_I32_OP, lr, lgr))); - src1_r = tmp0; - #undef LEVAL - } - sljit_gpr src2_r = FAST_IS_REG(src2) ? gpr(src2 & REG_MASK) : tmp1; - if (src2 & SLJIT_IMM) { - /* load src2 into register */ - FAIL_IF(push_load_imm_inst(compiler, src2_r, src2w)); - } - if (src2 & SLJIT_MEM) { - /* load src2 into register */ - FAIL_IF(load_word(compiler, src2_r, src2, src2w, tmp1, op & SLJIT_I32_OP)); - } - if (op & SLJIT_I32_OP) { - FAIL_IF(push_inst(compiler, lcr(tmp1, src2_r))); - FAIL_IF(push_inst(compiler, alr(src1_r, tmp1))); - if (src1_r != dst_r) - FAIL_IF(push_inst(compiler, lr(dst_r, src1_r))); - } - else { - FAIL_IF(push_inst(compiler, lcgr(tmp1, src2_r))); - FAIL_IF(push_inst(compiler, algr(src1_r, tmp1))); - if (src1_r != dst_r) - FAIL_IF(push_inst(compiler, lgr(dst_r, src1_r))); - } - } - else if ((src2 & SLJIT_IMM) && (src1_r == dst_r) && have_op_2_imm(op, src2w)) { - switch (GET_OPCODE(op) | (op & SLJIT_I32_OP)) { - #define LEVAL(i) i(dst_r, src2w) - case SLJIT_ADD: - if (!HAS_FLAGS(op) || signed_flags) { - FAIL_IF(push_inst(compiler, - WHEN2(is_s16(src2w), aghi, agfi))); - } - else - FAIL_IF(push_inst(compiler, LEVAL(algfi))); - - break; - case SLJIT_ADD32: - if (!HAS_FLAGS(op) || signed_flags) - FAIL_IF(push_inst(compiler, - WHEN2(is_s16(src2w), ahi, afi))); - else - FAIL_IF(push_inst(compiler, LEVAL(alfi))); - - break; - #undef LEVAL /* TODO(carenas): move down and refactor? */ - case SLJIT_MUL: - FAIL_IF(push_inst(compiler, mhi(dst_r, src2w))); - break; - case SLJIT_MUL32: - FAIL_IF(push_inst(compiler, mghi(dst_r, src2w))); - break; - case SLJIT_OR32: - FAIL_IF(push_inst(compiler, oilf(dst_r, src2w))); - break; - case SLJIT_XOR32: - FAIL_IF(push_inst(compiler, xilf(dst_r, src2w))); - break; - case SLJIT_AND32: - FAIL_IF(push_inst(compiler, nilf(dst_r, src2w))); - break; - default: - SLJIT_UNREACHABLE(); - } - } - else if ((src2 & SLJIT_IMM) && have_op_3_imm(op, src2w)) { - abort(); /* TODO(mundaym): implement */ - } - else if ((src2 & SLJIT_MEM) && (dst_r == src1_r)) { - /* most 32-bit instructions can only handle 12-bit immediate offsets */ - int need_u12 = !have_ldisp() && - (op & SLJIT_I32_OP) && - (GET_OPCODE(op) != SLJIT_ADDC) && - (GET_OPCODE(op) != SLJIT_SUBC); - struct addr mem; - if (need_u12) - FAIL_IF(make_addr_bx(compiler, &mem, src2, src2w, tmp1)); - else - FAIL_IF(make_addr_bxy(compiler, &mem, src2, src2w, tmp1)); - - int can_u12 = is_u12(mem.offset) ? 1 : 0; - sljit_ins ins = 0; - switch (GET_OPCODE(op) | (op & SLJIT_I32_OP)) { - /* 64-bit ops */ - #define LEVAL(i) EVAL(i, dst_r, mem) - case SLJIT_ADD: - ins = WHEN2(signed_flags, ag, alg); - break; - case SLJIT_SUB: - ins = WHEN2(signed_flags, sg, slg); - break; - case SLJIT_ADDC: - ins = LEVAL(alcg); - break; - case SLJIT_SUBC: - ins = LEVAL(slbg); - break; - case SLJIT_MUL: - ins = LEVAL(msg); - break; - case SLJIT_OR: - ins = LEVAL(og); - break; - case SLJIT_XOR: - ins = LEVAL(xg); - break; - case SLJIT_AND: - ins = LEVAL(ng); - break; - /* 32-bit ops */ - case SLJIT_ADD32: - if (signed_flags) - ins = WHEN2(can_u12, a, ay); - else - ins = WHEN2(can_u12, al, aly); - break; - case SLJIT_SUB32: - if (signed_flags) - ins = WHEN2(can_u12, s, sy); - else - ins = WHEN2(can_u12, sl, sly); - break; - case SLJIT_ADDC32: - ins = LEVAL(alc); - break; - case SLJIT_SUBC32: - ins = LEVAL(slb); - break; - case SLJIT_MUL32: - ins = WHEN2(can_u12, ms, msy); - break; - case SLJIT_OR32: - ins = WHEN2(can_u12, o, oy); - break; - case SLJIT_XOR32: - ins = WHEN2(can_u12, x, xy); - break; - case SLJIT_AND32: - ins = WHEN2(can_u12, n, ny); - break; - #undef LEVAL - default: - SLJIT_UNREACHABLE(); - } - FAIL_IF(push_inst(compiler, ins)); - } - else { - sljit_gpr src2_r = FAST_IS_REG(src2) ? gpr(src2 & REG_MASK) : tmp1; - if (src2 & SLJIT_IMM) { - /* load src2 into register */ - FAIL_IF(push_load_imm_inst(compiler, src2_r, src2w)); - } - if (src2 & SLJIT_MEM) { - /* load src2 into register */ - FAIL_IF(load_word(compiler, src2_r, src2, src2w, tmp1, op & SLJIT_I32_OP)); - } - /* TODO(mundaym): distinct operand facility where needed */ - #define LEVAL(i) i(tmp0, src1_r) - if (src1_r != dst_r && src1_r != tmp0) { - FAIL_IF(push_inst(compiler, - WHEN2(op & SLJIT_I32_OP, lr, lgr))); - src1_r = tmp0; - } - #undef LEVAL - sljit_ins ins = 0; - switch (GET_OPCODE(op) | (op & SLJIT_I32_OP)) { - #define LEVAL(i) i(src1_r, src2_r) - /* 64-bit ops */ - case SLJIT_ADD: - ins = WHEN2(signed_flags, agr, algr); - break; - case SLJIT_SUB: - ins = WHEN2(signed_flags, sgr, slgr); - break; - case SLJIT_ADDC: - ins = LEVAL(alcgr); - break; - case SLJIT_SUBC: - ins = LEVAL(slbgr); - break; - case SLJIT_MUL: - ins = LEVAL(msgr); - break; - case SLJIT_AND: - ins = LEVAL(ngr); - break; - case SLJIT_OR: - ins = LEVAL(ogr); - break; - case SLJIT_XOR: - ins = LEVAL(xgr); - break; - /* 32-bit ops */ - case SLJIT_ADD32: - ins = WHEN2(signed_flags, ar, alr); - break; - case SLJIT_SUB32: - ins = WHEN2(signed_flags, sr, slr); - break; - case SLJIT_ADDC32: - ins = LEVAL(alcr); - break; - case SLJIT_SUBC32: - ins = LEVAL(slbr); - break; - case SLJIT_MUL32: - ins = LEVAL(msr); - break; - case SLJIT_AND32: - ins = LEVAL(nr); - break; - case SLJIT_OR32: - ins = LEVAL(or); - break; - case SLJIT_XOR32: - ins = LEVAL(xr); - break; - #undef LEVAL - default: - SLJIT_UNREACHABLE(); - } - FAIL_IF(push_inst(compiler, ins)); - #define LEVAL(i) i(dst_r, src1_r) - if (src1_r != dst_r) - FAIL_IF(push_inst(compiler, - WHEN2(op & SLJIT_I32_OP, lr, lgr))); - #undef LEVAL - } - - /* write condition code to emulated flag register */ - if (op & VARIABLE_FLAG_MASK) - FAIL_IF(push_inst(compiler, ipm(flag_r))); - - /* write zero flag to emulated flag register */ - if (op & SLJIT_SET_Z) - FAIL_IF(push_store_zero_flag(compiler, op, dst_r)); - - /* finally write the result to memory if required */ - if (dst & SLJIT_MEM) { - SLJIT_ASSERT(dst_r != tmp1); - /* TODO(carenas): s/FAIL_IF/ return */ - FAIL_IF(store_word(compiler, dst_r, dst, dstw, tmp1, op & SLJIT_I32_OP)); + case SLJIT_SUB: + return sljit_emit_sub(compiler, op, dst, dstw, src1, src1w, src2, src2w); + case SLJIT_SUBC: + FAIL_IF(emit_non_commutative(compiler, &subc_forms, dst, dstw, src1, src1w, src2, src2w)); + if (dst & SLJIT_MEM) + return store_word(compiler, tmp0, dst, dstw, op & SLJIT_I32_OP); + return SLJIT_SUCCESS; + case SLJIT_MUL: + FAIL_IF(sljit_emit_multiply(compiler, op, dst, dstw, src1, src1w, src2, src2w)); + break; + case SLJIT_AND: + case SLJIT_OR: + case SLJIT_XOR: + FAIL_IF(sljit_emit_bitwise(compiler, op, dst, dstw, src1, src1w, src2, src2w)); + break; + case SLJIT_SHL: + case SLJIT_LSHR: + case SLJIT_ASHR: + FAIL_IF(sljit_emit_shift(compiler, op, dst, dstw, src1, src1w, src2, src2w)); + break; } + if (dst & SLJIT_MEM) + return store_word(compiler, tmp0, dst, dstw, op & SLJIT_I32_OP); return SLJIT_SUCCESS; } @@ -2428,7 +2663,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_src( case SLJIT_FAST_RETURN: src_r = FAST_IS_REG(src) ? gpr(src) : tmp1; if (src & SLJIT_MEM) - FAIL_IF(load_word(compiler, tmp1, src, srcw, tmp1, 0)); + FAIL_IF(load_word(compiler, tmp1, src, srcw, 0)); return push_inst(compiler, br(src_r)); case SLJIT_SKIP_FRAMES_BEFORE_FAST_RETURN: @@ -2507,7 +2742,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_enter(struct sljit_compiler * return push_inst(compiler, lgr(gpr(dst), fast_link_r)); /* memory */ - return store_word(compiler, fast_link_r, dst, dstw, tmp1, 0); + return store_word(compiler, fast_link_r, dst, dstw, 0); } /* --------------------------------------------------------------------- */ @@ -2532,15 +2767,11 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_label* sljit_emit_label(struct sljit_compi SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compiler *compiler, sljit_s32 type) { - sljit_u8 mask = ((type & 0xff) < SLJIT_JUMP) ? get_cc(type & 0xff) : 0xf; + sljit_u8 mask = ((type & 0xff) < SLJIT_JUMP) ? get_cc(compiler, type & 0xff) : 0xf; CHECK_ERROR_PTR(); CHECK_PTR(check_sljit_emit_jump(compiler, type)); - /* reload condition code */ - if (mask != 0xf) - PTR_FAIL_IF(push_load_cc(compiler, type & 0xff)); - /* record jump */ struct sljit_jump *jump = (struct sljit_jump *) ensure_abuf(compiler, sizeof(struct sljit_jump)); @@ -2585,7 +2816,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_ijump(struct sljit_compiler *compi FAIL_IF(push_load_imm_inst(compiler, src_r, srcw)); } else if (src & SLJIT_MEM) - FAIL_IF(load_word(compiler, src_r, src, srcw, tmp1, 0 /* 64-bit */)); + FAIL_IF(load_word(compiler, src_r, src, srcw, 0 /* 64-bit */)); /* emit jump instruction */ if (type >= SLJIT_FAST_CALL) @@ -2613,7 +2844,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_flags(struct sljit_compiler *co sljit_s32 dst, sljit_sw dstw, sljit_s32 type) { - sljit_u8 mask = get_cc(type & 0xff); + sljit_u8 mask = get_cc(compiler, type & 0xff); CHECK_ERROR(); CHECK(check_sljit_emit_op_flags(compiler, op, dst, dstw, type)); @@ -2624,9 +2855,11 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_flags(struct sljit_compiler *co case SLJIT_AND: case SLJIT_OR: case SLJIT_XOR: + compiler->status_flags_state = op & SLJIT_SET_Z; + /* dst is also source operand */ if (dst & SLJIT_MEM) - FAIL_IF(load_word(compiler, dst_r, dst, dstw, tmp1, op & SLJIT_I32_OP)); + FAIL_IF(load_word(compiler, dst_r, dst, dstw, op & SLJIT_I32_OP)); break; case SLJIT_MOV: @@ -2638,9 +2871,6 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_flags(struct sljit_compiler *co SLJIT_UNREACHABLE(); } - if (mask != 0xf) - FAIL_IF(push_load_cc(compiler, type & 0xff)); - /* TODO(mundaym): fold into cmov helper function? */ #define LEVAL(i) i(loc_r, 1, mask) if (have_lscond2()) { @@ -2671,14 +2901,9 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_flags(struct sljit_compiler *co #undef LEVAL } - /* set zero flag if needed */ - if (op & SLJIT_SET_Z) - FAIL_IF(push_store_zero_flag(compiler, op, dst_r)); - /* store result to memory if required */ - /* TODO(carenas): s/FAIL_IF/ return */ if (dst & SLJIT_MEM) - FAIL_IF(store_word(compiler, dst_r, dst, dstw, tmp1, op & SLJIT_I32_OP)); + return store_word(compiler, dst_r, dst, dstw, op & SLJIT_I32_OP); return SLJIT_SUCCESS; } @@ -2687,16 +2912,13 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_cmov(struct sljit_compiler *compil sljit_s32 dst_reg, sljit_s32 src, sljit_sw srcw) { - sljit_u8 mask = get_cc(type & 0xff); + sljit_u8 mask = get_cc(compiler, type & 0xff); sljit_gpr dst_r = gpr(dst_reg & ~SLJIT_I32_OP); sljit_gpr src_r = FAST_IS_REG(src) ? gpr(src) : tmp0; CHECK_ERROR(); CHECK(check_sljit_emit_cmov(compiler, type, dst_reg, src, srcw)); - if (mask != 0xf) - FAIL_IF(push_load_cc(compiler, type & 0xff)); - if (src & SLJIT_IMM) { /* TODO(mundaym): fast path with lscond2 */ FAIL_IF(push_load_imm_inst(compiler, src_r, srcw)); @@ -2750,7 +2972,7 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_const* sljit_emit_const(struct sljit_compi } if (dst & SLJIT_MEM) - PTR_FAIL_IF(store_word(compiler, dst_r, dst, dstw, tmp1, 0 /* always 64-bit */)); + PTR_FAIL_IF(store_word(compiler, dst_r, dst, dstw, 0 /* always 64-bit */)); return (struct sljit_const*)const_; } @@ -2797,7 +3019,7 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_put_label *sljit_emit_put_label( } if (dst & SLJIT_MEM) - PTR_FAIL_IF(store_word(compiler, dst_r, dst, dstw, tmp1, 0)); + PTR_FAIL_IF(store_word(compiler, dst_r, dst, dstw, 0)); return put_label; } diff --git a/src/3rdparty/pcre2/src/sljit/sljitNativeSPARC_32.c b/src/3rdparty/pcre2/src/sljit/sljitNativeSPARC_32.c index e5167f02..28886405 100644 --- a/src/3rdparty/pcre2/src/sljit/sljitNativeSPARC_32.c +++ b/src/3rdparty/pcre2/src/sljit/sljitNativeSPARC_32.c @@ -93,18 +93,21 @@ static SLJIT_INLINE sljit_s32 emit_single_op(struct sljit_compiler *compiler, sl return push_inst(compiler, ADD | D(dst) | S1(dst) | IMM(1), UNMOVABLE_INS); case SLJIT_ADD: + compiler->status_flags_state = SLJIT_CURRENT_FLAGS_ADD_SUB; return push_inst(compiler, ADD | (flags & SET_FLAGS) | D(dst) | S1(src1) | ARG2(flags, src2), DR(dst) | (flags & SET_FLAGS)); case SLJIT_ADDC: return push_inst(compiler, ADDC | (flags & SET_FLAGS) | D(dst) | S1(src1) | ARG2(flags, src2), DR(dst) | (flags & SET_FLAGS)); case SLJIT_SUB: + compiler->status_flags_state = SLJIT_CURRENT_FLAGS_ADD_SUB; return push_inst(compiler, SUB | (flags & SET_FLAGS) | D(dst) | S1(src1) | ARG2(flags, src2), DR(dst) | (flags & SET_FLAGS)); case SLJIT_SUBC: return push_inst(compiler, SUBC | (flags & SET_FLAGS) | D(dst) | S1(src1) | ARG2(flags, src2), DR(dst) | (flags & SET_FLAGS)); case SLJIT_MUL: + compiler->status_flags_state = 0; FAIL_IF(push_inst(compiler, SMUL | D(dst) | S1(src1) | ARG2(flags, src2), DR(dst))); if (!(flags & SET_FLAGS)) return SLJIT_SUCCESS; diff --git a/src/3rdparty/pcre2/src/sljit/sljitNativeSPARC_common.c b/src/3rdparty/pcre2/src/sljit/sljitNativeSPARC_common.c index 544d80d0..e833f09d 100644 --- a/src/3rdparty/pcre2/src/sljit/sljitNativeSPARC_common.c +++ b/src/3rdparty/pcre2/src/sljit/sljitNativeSPARC_common.c @@ -1275,16 +1275,14 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_label* sljit_emit_label(struct sljit_compi return label; } -static sljit_ins get_cc(sljit_s32 type) +static sljit_ins get_cc(struct sljit_compiler *compiler, sljit_s32 type) { switch (type) { case SLJIT_EQUAL: - case SLJIT_MUL_NOT_OVERFLOW: case SLJIT_NOT_EQUAL_F64: /* Unordered. */ return DA(0x1); case SLJIT_NOT_EQUAL: - case SLJIT_MUL_OVERFLOW: case SLJIT_EQUAL_F64: return DA(0x9); @@ -1317,10 +1315,16 @@ static sljit_ins get_cc(sljit_s32 type) return DA(0x2); case SLJIT_OVERFLOW: + if (!(compiler->status_flags_state & SLJIT_CURRENT_FLAGS_ADD_SUB)) + return DA(0x9); + case SLJIT_UNORDERED_F64: return DA(0x7); case SLJIT_NOT_OVERFLOW: + if (!(compiler->status_flags_state & SLJIT_CURRENT_FLAGS_ADD_SUB)) + return DA(0x1); + case SLJIT_ORDERED_F64: return DA(0xf); @@ -1347,7 +1351,7 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compile if (((compiler->delay_slot & DST_INS_MASK) != UNMOVABLE_INS) && !(compiler->delay_slot & ICC_IS_SET)) jump->flags |= IS_MOVABLE; #if (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32) - PTR_FAIL_IF(push_inst(compiler, BICC | get_cc(type ^ 1) | 5, UNMOVABLE_INS)); + PTR_FAIL_IF(push_inst(compiler, BICC | get_cc(compiler, type ^ 1) | 5, UNMOVABLE_INS)); #else #error "Implementation required" #endif @@ -1357,7 +1361,7 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compile if (((compiler->delay_slot & DST_INS_MASK) != UNMOVABLE_INS) && !(compiler->delay_slot & FCC_IS_SET)) jump->flags |= IS_MOVABLE; #if (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32) - PTR_FAIL_IF(push_inst(compiler, FBFCC | get_cc(type ^ 1) | 5, UNMOVABLE_INS)); + PTR_FAIL_IF(push_inst(compiler, FBFCC | get_cc(compiler, type ^ 1) | 5, UNMOVABLE_INS)); #else #error "Implementation required" #endif @@ -1474,9 +1478,9 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_flags(struct sljit_compiler *co type &= 0xff; if (type < SLJIT_EQUAL_F64) - FAIL_IF(push_inst(compiler, BICC | get_cc(type) | 3, UNMOVABLE_INS)); + FAIL_IF(push_inst(compiler, BICC | get_cc(compiler, type) | 3, UNMOVABLE_INS)); else - FAIL_IF(push_inst(compiler, FBFCC | get_cc(type) | 3, UNMOVABLE_INS)); + FAIL_IF(push_inst(compiler, FBFCC | get_cc(compiler, type) | 3, UNMOVABLE_INS)); FAIL_IF(push_inst(compiler, OR | D(reg) | S1(0) | IMM(1), UNMOVABLE_INS)); FAIL_IF(push_inst(compiler, OR | D(reg) | S1(0) | IMM(0), UNMOVABLE_INS)); diff --git a/src/3rdparty/pcre2/src/sljit/sljitNativeX86_common.c b/src/3rdparty/pcre2/src/sljit/sljitNativeX86_common.c index ddcc5ebf..515d98ae 100644 --- a/src/3rdparty/pcre2/src/sljit/sljitNativeX86_common.c +++ b/src/3rdparty/pcre2/src/sljit/sljitNativeX86_common.c @@ -411,11 +411,9 @@ static sljit_u8 get_jump_code(sljit_s32 type) return 0x8e /* jle */; case SLJIT_OVERFLOW: - case SLJIT_MUL_OVERFLOW: return 0x80 /* jo */; case SLJIT_NOT_OVERFLOW: - case SLJIT_MUL_NOT_OVERFLOW: return 0x81 /* jno */; case SLJIT_UNORDERED_F64: diff --git a/src/3rdparty/pcre2/src/sljit/sljitUtils.c b/src/3rdparty/pcre2/src/sljit/sljitUtils.c index 08ca35cf..9bce7147 100644 --- a/src/3rdparty/pcre2/src/sljit/sljitUtils.c +++ b/src/3rdparty/pcre2/src/sljit/sljitUtils.c @@ -48,7 +48,7 @@ static HANDLE allocator_lock; static SLJIT_INLINE void allocator_grab_lock(void) { HANDLE lock; - if (SLJIT_UNLIKELY(!allocator_lock)) { + if (SLJIT_UNLIKELY(!InterlockedCompareExchangePointer(&allocator_lock, NULL, NULL))) { lock = CreateMutex(NULL, FALSE, NULL); if (InterlockedCompareExchangePointer(&allocator_lock, lock, NULL)) CloseHandle(lock); @@ -146,9 +146,13 @@ static SLJIT_INLINE sljit_sw get_page_alignment(void) { #include static SLJIT_INLINE sljit_sw get_page_alignment(void) { - static sljit_sw sljit_page_align; - if (!sljit_page_align) { + static sljit_sw sljit_page_align = -1; + if (sljit_page_align < 0) { +#ifdef _SC_PAGESIZE sljit_page_align = sysconf(_SC_PAGESIZE); +#else + sljit_page_align = getpagesize(); +#endif /* Should never happen. */ if (sljit_page_align < 0) sljit_page_align = 4096; diff --git a/src/3rdparty/pcre2/src/sljit/sljitWXExecAllocator.c b/src/3rdparty/pcre2/src/sljit/sljitWXExecAllocator.c index 6ef71f7d..72d5b8dd 100644 --- a/src/3rdparty/pcre2/src/sljit/sljitWXExecAllocator.c +++ b/src/3rdparty/pcre2/src/sljit/sljitWXExecAllocator.c @@ -121,14 +121,18 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_malloc_exec(sljit_uw size) static pthread_mutex_t se_lock = PTHREAD_MUTEX_INITIALIZER; #endif static int se_protected = !SLJIT_PROT_WX; + int prot = PROT_READ | PROT_WRITE | SLJIT_PROT_WX; sljit_uw* ptr; if (SLJIT_UNLIKELY(se_protected < 0)) return NULL; +#ifdef PROT_MAX + prot |= PROT_MAX(PROT_READ | PROT_WRITE | PROT_EXEC); +#endif + size += sizeof(sljit_uw); - ptr = (sljit_uw*)mmap(NULL, size, PROT_READ | PROT_WRITE | SLJIT_PROT_WX, - MAP_PRIVATE | MAP_ANON, -1, 0); + ptr = (sljit_uw*)mmap(NULL, size, prot, MAP_PRIVATE | MAP_ANON, -1, 0); if (ptr == MAP_FAILED) return NULL; diff --git a/src/android/jar/src/org/qtproject/qt5/android/CursorHandle.java b/src/android/jar/src/org/qtproject/qt5/android/CursorHandle.java index 38cc695c..feb47c8f 100644 --- a/src/android/jar/src/org/qtproject/qt5/android/CursorHandle.java +++ b/src/android/jar/src/org/qtproject/qt5/android/CursorHandle.java @@ -159,11 +159,15 @@ public class CursorHandle implements ViewTreeObserver.OnPreDrawListener public void setPosition(final int x, final int y){ initOverlay(); - final int[] location = new int[2]; - m_layout.getLocationOnScreen(location); + final int[] layoutLocation = new int[2]; + m_layout.getLocationOnScreen(layoutLocation); - int x2 = x + location[0]; - int y2 = y + location[1] + m_yShift; + // This value is used for handling split screen case + final int[] activityLocation = new int[2]; + m_activity.getWindow().getDecorView().getLocationOnScreen(activityLocation); + + int x2 = x + layoutLocation[0] - activityLocation[0]; + int y2 = y + layoutLocation[1] + m_yShift - activityLocation[1]; if (m_id == QtNative.IdCursorHandle) { x2 -= m_popup.getWidth() / 2 ; diff --git a/src/android/jar/src/org/qtproject/qt5/android/ExtractStyle.java b/src/android/jar/src/org/qtproject/qt5/android/ExtractStyle.java index e6de354a..9dba7f2c 100644 --- a/src/android/jar/src/org/qtproject/qt5/android/ExtractStyle.java +++ b/src/android/jar/src/org/qtproject/qt5/android/ExtractStyle.java @@ -1,5 +1,6 @@ /**************************************************************************** ** +** Copyright (C) 2021 The Qt Company Ltd. ** Copyright (C) 2014 BogDan Vatra ** Contact: https://www.qt.io/licensing/ ** @@ -39,21 +40,7 @@ package org.qtproject.qt5.android; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.OutputStreamWriter; -import java.lang.reflect.Field; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Map; - -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; -import org.xmlpull.v1.XmlPullParser; - +import android.annotation.SuppressLint; import android.content.Context; import android.content.res.ColorStateList; import android.content.res.Resources; @@ -64,9 +51,9 @@ import android.graphics.Bitmap.Config; import android.graphics.Canvas; import android.graphics.NinePatch; import android.graphics.Paint; -import android.graphics.Rect; -import android.graphics.RectF; import android.graphics.PorterDuff; +import android.graphics.Rect; +import android.graphics.drawable.AnimatedStateListDrawable; import android.graphics.drawable.AnimationDrawable; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.ClipDrawable; @@ -77,26 +64,53 @@ import android.graphics.drawable.GradientDrawable.Orientation; import android.graphics.drawable.InsetDrawable; import android.graphics.drawable.LayerDrawable; import android.graphics.drawable.NinePatchDrawable; +import android.graphics.drawable.RippleDrawable; import android.graphics.drawable.RotateDrawable; import android.graphics.drawable.ScaleDrawable; import android.graphics.drawable.StateListDrawable; +import android.graphics.drawable.VectorDrawable; import android.os.Build; import android.util.AttributeSet; import android.util.Log; +import android.util.TypedValue; import android.util.Xml; +import android.view.ContextThemeWrapper; import android.view.inputmethod.EditorInfo; +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; +import org.xmlpull.v1.XmlPullParser; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStreamWriter; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; + public class ExtractStyle { - native static int[] extractChunkInfo20(byte[] chunkData); - native static int[] extractNativeChunkInfo20(long nativeChunk); - - Class styleableClass = getClass("android.R$styleable"); - Class rippleDrawableClass = getClass("android.graphics.drawable.RippleDrawable"); - Class animatedStateListDrawableClass = getClass("android.graphics.drawable.AnimatedStateListDrawable"); - Class vectorDrawableClass = getClass("android.graphics.drawable.VectorDrawable"); - + // This used to be retrieved from android.R.styleable.ViewDrawableStates field via reflection, + // but since the access to that is restricted, we need to have hard-coded here. + final int[] viewDrawableStatesState = new int[]{ + android.R.attr.state_focused, + android.R.attr.state_window_focused, + android.R.attr.state_enabled, + android.R.attr.state_selected, + android.R.attr.state_pressed, + android.R.attr.state_activated, + android.R.attr.state_accelerated, + android.R.attr.state_hovered, + android.R.attr.state_drag_can_accept, + android.R.attr.state_drag_hovered + }; final int[] EMPTY_STATE_SET = {}; final int[] ENABLED_STATE_SET = {android.R.attr.state_enabled}; final int[] FOCUSED_STATE_SET = {android.R.attr.state_focused}; @@ -109,10 +123,10 @@ public class ExtractStyle { final int[] FOCUSED_SELECTED_STATE_SET = stateSetUnion(FOCUSED_STATE_SET, SELECTED_STATE_SET); final int[] FOCUSED_WINDOW_FOCUSED_STATE_SET = stateSetUnion(FOCUSED_STATE_SET, WINDOW_FOCUSED_STATE_SET); final int[] SELECTED_WINDOW_FOCUSED_STATE_SET = stateSetUnion(SELECTED_STATE_SET, WINDOW_FOCUSED_STATE_SET); - final int[] ENABLED_FOCUSED_SELECTED_STATE_SET = stateSetUnion(ENABLED_FOCUSED_STATE_SET, SELECTED_STATE_SET); + final int[] ENABLED_FOCUSED_SELECTED_STATE_SET = stateSetUnion(ENABLED_FOCUSED_STATE_SET, SELECTED_STATE_SET); final int[] ENABLED_FOCUSED_WINDOW_FOCUSED_STATE_SET = stateSetUnion(ENABLED_FOCUSED_STATE_SET, WINDOW_FOCUSED_STATE_SET); final int[] ENABLED_SELECTED_WINDOW_FOCUSED_STATE_SET = stateSetUnion(ENABLED_SELECTED_STATE_SET, WINDOW_FOCUSED_STATE_SET); - final int[] FOCUSED_SELECTED_WINDOW_FOCUSED_STATE_SET = stateSetUnion(FOCUSED_SELECTED_STATE_SET, WINDOW_FOCUSED_STATE_SET); + final int[] FOCUSED_SELECTED_WINDOW_FOCUSED_STATE_SET = stateSetUnion(FOCUSED_SELECTED_STATE_SET, WINDOW_FOCUSED_STATE_SET); final int[] ENABLED_FOCUSED_SELECTED_WINDOW_FOCUSED_STATE_SET = stateSetUnion(ENABLED_FOCUSED_SELECTED_STATE_SET, WINDOW_FOCUSED_STATE_SET); final int[] PRESSED_WINDOW_FOCUSED_STATE_SET = stateSetUnion(PRESSED_STATE_SET, WINDOW_FOCUSED_STATE_SET); final int[] PRESSED_SELECTED_STATE_SET = stateSetUnion(PRESSED_STATE_SET, SELECTED_STATE_SET); @@ -129,230 +143,98 @@ public class ExtractStyle { final int[] PRESSED_ENABLED_FOCUSED_WINDOW_FOCUSED_STATE_SET = stateSetUnion(PRESSED_ENABLED_FOCUSED_STATE_SET, WINDOW_FOCUSED_STATE_SET); final int[] PRESSED_ENABLED_FOCUSED_SELECTED_STATE_SET = stateSetUnion(PRESSED_ENABLED_FOCUSED_STATE_SET, SELECTED_STATE_SET); final int[] PRESSED_ENABLED_FOCUSED_SELECTED_WINDOW_FOCUSED_STATE_SET = stateSetUnion(PRESSED_ENABLED_FOCUSED_SELECTED_STATE_SET, WINDOW_FOCUSED_STATE_SET); - - - final int View_background = getField(styleableClass,"View_background"); - final int View_padding = getField(styleableClass,"View_padding"); - final int View_paddingLeft = getField(styleableClass,"View_paddingLeft"); - final int View_paddingTop = getField(styleableClass,"View_paddingTop"); - final int View_paddingRight = getField(styleableClass,"View_paddingRight"); - final int View_paddingBottom = getField(styleableClass,"View_paddingBottom"); - final int View_scrollX = getField(styleableClass,"View_scrollX"); - final int View_scrollY = getField(styleableClass,"View_scrollY"); - final int View_id = getField(styleableClass,"View_id"); - final int View_tag = getField(styleableClass,"View_tag"); - final int View_fitsSystemWindows = getField(styleableClass,"View_fitsSystemWindows"); - final int View_focusable = getField(styleableClass,"View_focusable"); - final int View_focusableInTouchMode = getField(styleableClass,"View_focusableInTouchMode"); - final int View_clickable = getField(styleableClass,"View_clickable"); - final int View_longClickable = getField(styleableClass,"View_longClickable"); - final int View_saveEnabled = getField(styleableClass,"View_saveEnabled"); - final int View_duplicateParentState = getField(styleableClass,"View_duplicateParentState"); - final int View_visibility = getField(styleableClass,"View_visibility"); - final int View_drawingCacheQuality = getField(styleableClass,"View_drawingCacheQuality"); - final int View_contentDescription = getField(styleableClass,"View_contentDescription"); - final int View_soundEffectsEnabled = getField(styleableClass,"View_soundEffectsEnabled"); - final int View_hapticFeedbackEnabled = getField(styleableClass,"View_hapticFeedbackEnabled"); - final int View_scrollbars = getField(styleableClass,"View_scrollbars"); - final int View_fadingEdge = getField(styleableClass,"View_fadingEdge"); - final int View_scrollbarStyle = getField(styleableClass,"View_scrollbarStyle"); - final int View_scrollbarFadeDuration = getField(styleableClass,"View_scrollbarFadeDuration"); - final int View_scrollbarDefaultDelayBeforeFade = getField(styleableClass,"View_scrollbarDefaultDelayBeforeFade"); - final int View_scrollbarSize = getField(styleableClass,"View_scrollbarSize"); - final int View_scrollbarThumbHorizontal = getField(styleableClass,"View_scrollbarThumbHorizontal"); - final int View_scrollbarThumbVertical = getField(styleableClass,"View_scrollbarThumbVertical"); - final int View_scrollbarTrackHorizontal = getField(styleableClass,"View_scrollbarTrackHorizontal"); - final int View_scrollbarTrackVertical = getField(styleableClass,"View_scrollbarTrackVertical"); - final int View_isScrollContainer = getField(styleableClass,"View_isScrollContainer"); - final int View_keepScreenOn = getField(styleableClass,"View_keepScreenOn"); - final int View_filterTouchesWhenObscured = getField(styleableClass,"View_filterTouchesWhenObscured"); - final int View_nextFocusLeft = getField(styleableClass,"View_nextFocusLeft"); - final int View_nextFocusRight = getField(styleableClass,"View_nextFocusRight"); - final int View_nextFocusUp = getField(styleableClass,"View_nextFocusUp"); - final int View_nextFocusDown = getField(styleableClass,"View_nextFocusDown"); - final int View_minWidth = getField(styleableClass,"View_minWidth"); - final int View_minHeight = getField(styleableClass,"View_minHeight"); - final int View_onClick = getField(styleableClass,"View_onClick"); - final int View_overScrollMode = getField(styleableClass,"View_overScrollMode"); - final int View_paddingStart = getField(styleableClass,"View_paddingStart"); - final int View_paddingEnd = getField(styleableClass,"View_paddingEnd"); - - final int TextAppearance_textColorHighlight = getField(styleableClass,"TextAppearance_textColorHighlight"); - final int TextAppearance_textColor = getField(styleableClass,"TextAppearance_textColor"); - final int TextAppearance_textColorHint = getField(styleableClass,"TextAppearance_textColorHint"); - final int TextAppearance_textColorLink = getField(styleableClass,"TextAppearance_textColorLink"); - final int TextAppearance_textSize = getField(styleableClass,"TextAppearance_textSize"); - final int TextAppearance_typeface = getField(styleableClass,"TextAppearance_typeface"); - final int TextAppearance_textStyle = getField(styleableClass,"TextAppearance_textStyle"); - final int TextAppearance_textAllCaps = getField(styleableClass,"TextAppearance_textAllCaps"); - final int TextView_editable = getField(styleableClass,"TextView_editable"); - final int TextView_inputMethod = getField(styleableClass,"TextView_inputMethod"); - final int TextView_numeric = getField(styleableClass,"TextView_numeric"); - final int TextView_digits = getField(styleableClass,"TextView_digits"); - final int TextView_phoneNumber = getField(styleableClass,"TextView_phoneNumber"); - final int TextView_autoText = getField(styleableClass,"TextView_autoText"); - final int TextView_capitalize = getField(styleableClass,"TextView_capitalize"); - final int TextView_bufferType = getField(styleableClass,"TextView_bufferType"); - final int TextView_selectAllOnFocus = getField(styleableClass,"TextView_selectAllOnFocus"); - final int TextView_autoLink = getField(styleableClass,"TextView_autoLink"); - final int TextView_linksClickable = getField(styleableClass,"TextView_linksClickable"); - final int TextView_drawableLeft = getField(styleableClass,"TextView_drawableLeft"); - final int TextView_drawableTop = getField(styleableClass,"TextView_drawableTop"); - final int TextView_drawableRight = getField(styleableClass,"TextView_drawableRight"); - final int TextView_drawableBottom = getField(styleableClass,"TextView_drawableBottom"); - final int TextView_drawableStart = getField(styleableClass,"TextView_drawableStart"); - final int TextView_drawableEnd = getField(styleableClass,"TextView_drawableEnd"); - final int TextView_drawablePadding = getField(styleableClass,"TextView_drawablePadding"); - final int TextView_textCursorDrawable = getField(styleableClass,"TextView_textCursorDrawable"); - final int TextView_maxLines = getField(styleableClass,"TextView_maxLines"); - final int TextView_maxHeight = getField(styleableClass,"TextView_maxHeight"); - final int TextView_lines = getField(styleableClass,"TextView_lines"); - final int TextView_height = getField(styleableClass,"TextView_height"); - final int TextView_minLines = getField(styleableClass,"TextView_minLines"); - final int TextView_minHeight = getField(styleableClass,"TextView_minHeight"); - final int TextView_maxEms = getField(styleableClass,"TextView_maxEms"); - final int TextView_maxWidth = getField(styleableClass,"TextView_maxWidth"); - final int TextView_ems = getField(styleableClass,"TextView_ems"); - final int TextView_width = getField(styleableClass,"TextView_width"); - final int TextView_minEms = getField(styleableClass,"TextView_minEms"); - final int TextView_minWidth = getField(styleableClass,"TextView_minWidth"); - final int TextView_gravity = getField(styleableClass,"TextView_gravity"); - final int TextView_hint = getField(styleableClass,"TextView_hint"); - final int TextView_text = getField(styleableClass,"TextView_text"); - final int TextView_scrollHorizontally = getField(styleableClass,"TextView_scrollHorizontally"); - final int TextView_singleLine = getField(styleableClass,"TextView_singleLine"); - final int TextView_ellipsize = getField(styleableClass,"TextView_ellipsize"); - final int TextView_marqueeRepeatLimit = getField(styleableClass,"TextView_marqueeRepeatLimit"); - final int TextView_includeFontPadding = getField(styleableClass,"TextView_includeFontPadding"); - final int TextView_cursorVisible = getField(styleableClass,"TextView_cursorVisible"); - final int TextView_maxLength = getField(styleableClass,"TextView_maxLength"); - final int TextView_textScaleX = getField(styleableClass,"TextView_textScaleX"); - final int TextView_freezesText = getField(styleableClass,"TextView_freezesText"); - final int TextView_shadowColor = getField(styleableClass,"TextView_shadowColor"); - final int TextView_shadowDx = getField(styleableClass,"TextView_shadowDx"); - final int TextView_shadowDy = getField(styleableClass,"TextView_shadowDy"); - final int TextView_shadowRadius = getField(styleableClass,"TextView_shadowRadius"); - final int TextView_enabled = getField(styleableClass,"TextView_enabled"); - final int TextView_textColorHighlight = getField(styleableClass,"TextView_textColorHighlight"); - final int TextView_textColor = getField(styleableClass,"TextView_textColor"); - final int TextView_textColorHint = getField(styleableClass,"TextView_textColorHint"); - final int TextView_textColorLink = getField(styleableClass,"TextView_textColorLink"); - final int TextView_textSize = getField(styleableClass,"TextView_textSize"); - final int TextView_typeface = getField(styleableClass,"TextView_typeface"); - final int TextView_textStyle = getField(styleableClass,"TextView_textStyle"); - final int TextView_password = getField(styleableClass,"TextView_password"); - final int TextView_lineSpacingExtra = getField(styleableClass,"TextView_lineSpacingExtra"); - final int TextView_lineSpacingMultiplier = getField(styleableClass,"TextView_lineSpacingMultiplier"); - final int TextView_inputType = getField(styleableClass,"TextView_inputType"); - final int TextView_imeOptions = getField(styleableClass,"TextView_imeOptions"); - final int TextView_imeActionLabel = getField(styleableClass,"TextView_imeActionLabel"); - final int TextView_imeActionId = getField(styleableClass,"TextView_imeActionId"); - final int TextView_privateImeOptions = getField(styleableClass,"TextView_privateImeOptions"); - final int TextView_textSelectHandleLeft = getField(styleableClass,"TextView_textSelectHandleLeft"); - final int TextView_textSelectHandleRight = getField(styleableClass,"TextView_textSelectHandleRight"); - final int TextView_textSelectHandle = getField(styleableClass,"TextView_textSelectHandle"); - final int TextView_textIsSelectable = getField(styleableClass,"TextView_textIsSelectable"); - final int TextView_textAllCaps = getField(styleableClass,"TextView_textAllCaps"); - - final int ImageView_src = getField(styleableClass,"ImageView_src"); - final int ImageView_baselineAlignBottom = getField(styleableClass,"ImageView_baselineAlignBottom"); - final int ImageView_adjustViewBounds = getField(styleableClass,"ImageView_adjustViewBounds"); - final int ImageView_maxWidth = getField(styleableClass,"ImageView_maxWidth"); - final int ImageView_maxHeight = getField(styleableClass,"ImageView_maxHeight"); - final int ImageView_scaleType = getField(styleableClass,"ImageView_scaleType"); - final int ImageView_tint = getField(styleableClass,"ImageView_tint"); - final int ImageView_cropToPadding = getField(styleableClass,"ImageView_cropToPadding"); - final Resources.Theme m_theme; final String m_extractPath; - Context m_context; final int defaultBackgroundColor; final int defaultTextColor; final boolean m_minimal; + final int[] DrawableStates = { android.R.attr.state_active, android.R.attr.state_checked, + android.R.attr.state_enabled, android.R.attr.state_focused, + android.R.attr.state_pressed, android.R.attr.state_selected, + android.R.attr.state_window_focused, 16908288, android.R.attr.state_multiline, + android.R.attr.state_activated, android.R.attr.state_accelerated}; + final String[] DrawableStatesLabels = {"active", "checked", "enabled", "focused", "pressed", + "selected", "window_focused", "background", "multiline", "activated", "accelerated"}; + final String[] DisableDrawableStatesLabels = {"inactive", "unchecked", "disabled", + "not_focused", "no_pressed", "unselected", "window_not_focused", "background", + "multiline", "activated", "accelerated"}; + final String[] sScaleTypeArray = { + "MATRIX", + "FIT_XY", + "FIT_START", + "FIT_CENTER", + "FIT_END", + "CENTER", + "CENTER_CROP", + "CENTER_INSIDE" + }; + Context m_context; + private final HashMap m_drawableCache = new HashMap<>(); - class SimpleJsonWriter - { - private OutputStreamWriter m_writer; - private boolean m_addComma = false; - private int m_indentLevel = 0; - public SimpleJsonWriter(String filePath) throws FileNotFoundException - { - m_writer = new OutputStreamWriter(new FileOutputStream(filePath)); - } + public ExtractStyle(Context context, String extractPath, boolean minimal) { + m_minimal = minimal; + m_extractPath = extractPath + "/"; + boolean dirCreated = new File(m_extractPath).mkdirs(); + if (!dirCreated) + Log.w(QtNative.QtTAG, "Cannot create Android style directory."); + m_context = context; + m_theme = context.getTheme(); + TypedArray array = m_theme.obtainStyledAttributes(new int[]{ + android.R.attr.colorBackground, + android.R.attr.textColorPrimary, + android.R.attr.textColor + }); + defaultBackgroundColor = array.getColor(0, 0); + int textColor = array.getColor(1, 0xFFFFFF); + if (textColor == 0xFFFFFF) + textColor = array.getColor(2, 0xFFFFFF); + defaultTextColor = textColor; + array.recycle(); - public void close() throws IOException - { - m_writer.close(); - } - - private void writeIndent() throws IOException - { - m_writer.write(" ", 0, m_indentLevel); - } - - SimpleJsonWriter beginObject() throws IOException - { - writeIndent(); - m_writer.write("{\n"); - ++m_indentLevel; - m_addComma = false; - return this; - } - - SimpleJsonWriter endObject() throws IOException - { - m_writer.write("\n"); - writeIndent(); - m_writer.write("}\n"); - --m_indentLevel; - m_addComma = false; - return this; - } - - SimpleJsonWriter name(String name) throws IOException - { - if (m_addComma) { - m_writer.write(",\n"); + try { + SimpleJsonWriter jsonWriter = new SimpleJsonWriter(m_extractPath + "style.json"); + jsonWriter.beginObject(); + try { + jsonWriter.name("defaultStyle").value(extractDefaultPalette()); + extractWindow(jsonWriter); + jsonWriter.name("buttonStyle").value(extractTextAppearanceInformation(android.R.attr.buttonStyle, "QPushButton")); + jsonWriter.name("spinnerStyle").value(extractTextAppearanceInformation(android.R.attr.spinnerStyle, "QComboBox")); + extractProgressBar(jsonWriter, android.R.attr.progressBarStyleHorizontal, "progressBarStyleHorizontal", "QProgressBar"); + extractProgressBar(jsonWriter, android.R.attr.progressBarStyleLarge, "progressBarStyleLarge", null); + extractProgressBar(jsonWriter, android.R.attr.progressBarStyleSmall, "progressBarStyleSmall", null); + extractProgressBar(jsonWriter, android.R.attr.progressBarStyle, "progressBarStyle", null); + extractAbsSeekBar(jsonWriter); + extractSwitch(jsonWriter); + extractCompoundButton(jsonWriter, android.R.attr.checkboxStyle, "checkboxStyle", "QCheckBox"); + jsonWriter.name("editTextStyle").value(extractTextAppearanceInformation(android.R.attr.editTextStyle, "QLineEdit")); + extractCompoundButton(jsonWriter, android.R.attr.radioButtonStyle, "radioButtonStyle", "QRadioButton"); + jsonWriter.name("textViewStyle").value(extractTextAppearanceInformation(android.R.attr.textViewStyle, "QWidget")); + jsonWriter.name("scrollViewStyle").value(extractTextAppearanceInformation(android.R.attr.scrollViewStyle, "QAbstractScrollArea")); + extractListView(jsonWriter); + jsonWriter.name("listSeparatorTextViewStyle").value(extractTextAppearanceInformation(android.R.attr.listSeparatorTextViewStyle, null)); + extractItemsStyle(jsonWriter); + extractCompoundButton(jsonWriter, android.R.attr.buttonStyleToggle, "buttonStyleToggle", null); + extractCalendar(jsonWriter); + extractToolBar(jsonWriter); + jsonWriter.name("actionButtonStyle").value(extractTextAppearanceInformation(android.R.attr.actionButtonStyle, "QToolButton")); + jsonWriter.name("actionBarTabTextStyle").value(extractTextAppearanceInformation(android.R.attr.actionBarTabTextStyle, null)); + jsonWriter.name("actionBarTabStyle").value(extractTextAppearanceInformation(android.R.attr.actionBarTabStyle, null)); + jsonWriter.name("actionOverflowButtonStyle").value(extractImageViewInformation(android.R.attr.actionOverflowButtonStyle, null)); + extractTabBar(jsonWriter); + } catch (Exception e) { + e.printStackTrace(); } - writeIndent(); - m_writer.write(JSONObject.quote(name) + ": "); - m_addComma = true; - return this; - } - - SimpleJsonWriter value(JSONObject value) throws IOException - { - m_writer.write(value.toString()); - return this; + jsonWriter.endObject(); + jsonWriter.close(); + } catch (Exception e) { + e.printStackTrace(); } } - class FakeCanvas extends Canvas { - int[] chunkData = null; - class Size { - public int s,e; - Size(int start, int end) - { - s=start; - e=end; - } - } + native static int[] extractNativeChunkInfo20(long nativeChunk); - public boolean isHardwareAccelerated() { - return true; - } - - public void drawPatch(Bitmap bmp, byte[] chunks, RectF dst, Paint paint) { - chunkData = extractChunkInfo20(chunks); - } - } - - - - private int[] stateSetUnion(final int[] stateSet1, final int[] stateSet2) - { - try - { + private int[] stateSetUnion(final int[] stateSet1, final int[] stateSet2) { + try { final int stateSet1Length = stateSet1.length; final int stateSet2Length = stateSet2.length; final int[] newSet = new int[stateSet1Length + stateSet2Length]; @@ -361,34 +243,18 @@ public class ExtractStyle { int j = 0; // This is a merge of the two input state sets and assumes that the // input sets are sorted by the order imposed by ViewDrawableStates. - int[] viewDrawableStatesState=(int[]) styleableClass.getDeclaredField("ViewDrawableStates").get(null); - for (int viewState : viewDrawableStatesState) - { - if (i < stateSet1Length && stateSet1[i] == viewState) - { + for (int viewState : viewDrawableStatesState) { + if (i < stateSet1Length && stateSet1[i] == viewState) { newSet[k++] = viewState; i++; } else if (j < stateSet2Length && stateSet2[j] == viewState) { newSet[k++] = viewState; j++; } - if (k > 1) { - assert(newSet[k - 1] > newSet[k - 2]); - } + assert k <= 1 || (newSet[k - 1] > newSet[k - 2]); } return newSet; - } - catch(Exception e) - { - e.printStackTrace(); - } - return null; - } - - private Class getClass(String className) { - try { - return Class.forName(className); - } catch (ClassNotFoundException e) { + } catch (Exception e) { e.printStackTrace(); } return null; @@ -423,21 +289,9 @@ public class ExtractStyle { return tryGetAccessibleField(clazz.getSuperclass(), fieldName); } - int getField(Class clazz, String fieldName) - { - try { - return clazz.getDeclaredField(fieldName).getInt(null); - } catch (Exception e) { - e.printStackTrace(); - } - return -1; - } - - JSONObject getColorStateList(ColorStateList colorList) - { + JSONObject getColorStateList(ColorStateList colorList) { JSONObject json = new JSONObject(); - try - { + try { json.put("EMPTY_STATE_SET", colorList.getColorForState(EMPTY_STATE_SET, 0)); json.put("WINDOW_FOCUSED_STATE_SET", colorList.getColorForState(WINDOW_FOCUSED_STATE_SET, 0)); json.put("SELECTED_STATE_SET", colorList.getColorForState(SELECTED_STATE_SET, 0)); @@ -477,150 +331,70 @@ public class ExtractStyle { return json; } - final int [] DrawableStates ={android.R.attr.state_active, android.R.attr.state_checked - , android.R.attr.state_enabled, android.R.attr.state_focused - , android.R.attr.state_pressed, android.R.attr.state_selected - , android.R.attr.state_window_focused, 16908288, 16843597, 16843518, 16843547}; - final String[] DrawableStatesLabels = {"active", "checked", "enabled", "focused", "pressed", "selected", "window_focused", "background", "multiline", "activated", "accelerated"}; - final String[] DisableDrawableStatesLabels = {"inactive", "unchecked", "disabled", "not_focused", "no_pressed", "unselected", "window_not_focused", "background", "multiline", "activated", "accelerated"}; - - String getFileName(String file, String[] states) - { - for (String state: states) - file+="__"+state; - return file; - } - - String getStatesName(String[] states) - { - String statesName=""; - for (String state: states) - { - if (statesName.length()>0) - statesName+="__"; - statesName += state; - } - return statesName; - } - - void addDrawableItemIfNotExists(JSONObject json, ArrayList list, Drawable item, String[] states, String filename) - { - for (Integer it : list) - { - if (it.equals(item.hashCode())) - return; - } - list.add(item.hashCode()); - try { - json.put(getStatesName(states), getDrawable(item, getFileName(filename, states), null)); - } catch (JSONException e) { - e.printStackTrace(); - } - } - - void addSolution(String filename, JSONObject json, int c, Drawable drawable, ArrayList drawableList, int u) - { - int pos=0; - int states[] = new int[c]; - String [] statesText = new String[c]; - - for (int n= 0;u > 0;++n, u>>= 1) - if ((u & 1) > 0) - { - statesText[pos]=DrawableStatesLabels[n]; - states[pos++]=DrawableStates[n]; - } - drawable.setState(states); - addDrawableItemIfNotExists(json, drawableList, drawable.getCurrent(), statesText, filename); - } - - int bitCount(int u) - { - int n; - for (n= 0;u > 0;++n, u&= (u - 1)); - return n; - } - - JSONObject getStatesList(int [] states) throws JSONException - { + JSONObject getStatesList(int[] states) throws JSONException { JSONObject json = new JSONObject(); - for (int s : states) - { - boolean found=false; - for (int d = 0;d0); + if (!found) { + json.put("unhandled_state_" + s, s > 0); } } return json; } - String getStatesName(int [] states) - { - String statesName=""; - for (int s : states) - { - boolean found=false; - for (int d = 0;d0) - statesName+="__"; - statesName+=DrawableStatesLabels[d]; - found=true; + String getStatesName(int[] states) { + StringBuilder statesName = new StringBuilder(); + for (int s : states) { + boolean found = false; + for (int d = 0; d < DrawableStates.length; d++) { + if (s == DrawableStates[d]) { + if (statesName.length() > 0) + statesName.append("__"); + statesName.append(DrawableStatesLabels[d]); + found = true; break; - } - else if (s==-DrawableStates[d]) - { - if (statesName.length()>0) - statesName+="__"; - statesName+=DisableDrawableStatesLabels[d]; - found=true; + } else if (s == -DrawableStates[d]) { + if (statesName.length() > 0) + statesName.append("__"); + statesName.append(DisableDrawableStatesLabels[d]); + found = true; break; } } - if (!found) - { - if (statesName.length()>0) - statesName+=";"; - statesName+=s; + if (!found) { + if (statesName.length() > 0) + statesName.append(";"); + statesName.append(s); } } - if (statesName.length()>0) - return statesName; + if (statesName.length() > 0) + return statesName.toString(); return "empty"; } - private JSONObject getLayerDrawable(Object drawable, String filename) - { + private JSONObject getLayerDrawable(Object drawable, String filename) { JSONObject json = new JSONObject(); LayerDrawable layers = (LayerDrawable) drawable; - final int nr=layers.getNumberOfLayers(); + final int nr = layers.getNumberOfLayers(); try { - JSONArray array =new JSONArray(); - for (int i = 0; i < nr; i++) - { + JSONArray array = new JSONArray(); + for (int i = 0; i < nr; i++) { int id = layers.getId(i); if (id == -1) id = i; - JSONObject layerJsonObject=getDrawable(layers.getDrawable(i), filename+"__"+id, null); + JSONObject layerJsonObject = getDrawable(layers.getDrawable(i), filename + "__" + id, null); layerJsonObject.put("id", id); array.put(layerJsonObject); } @@ -635,21 +409,23 @@ public class ExtractStyle { return json; } - private JSONObject getStateListDrawable(Object drawable, String filename) - { + private JSONObject getStateListDrawable(Object drawable, String filename) { JSONObject json = new JSONObject(); try { StateListDrawable stateList = (StateListDrawable) drawable; - final int numStates = (Integer) StateListDrawable.class.getMethod("getStateCount").invoke(stateList); - JSONArray array =new JSONArray(); - for (int i = 0; i < numStates; i++) - { + JSONArray array = new JSONArray(); + final int numStates; + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) + numStates = (Integer) StateListDrawable.class.getMethod("getStateCount").invoke(stateList); + else + numStates = stateList.getStateCount(); + for (int i = 0; i < numStates; i++) { JSONObject stateJson = new JSONObject(); - final Drawable d = (Drawable) StateListDrawable.class.getMethod("getStateDrawable", Integer.TYPE).invoke(stateList, i); - final int [] states = (int[]) StateListDrawable.class.getMethod("getStateSet", Integer.TYPE).invoke(stateList, i); + final Drawable d = (Drawable) StateListDrawable.class.getMethod("getStateDrawable", Integer.TYPE).invoke(stateList, i); + final int[] states = (int[]) StateListDrawable.class.getMethod("getStateSet", Integer.TYPE).invoke(stateList, i); if (states != null) stateJson.put("states", getStatesList(states)); - stateJson.put("drawable", getDrawable(d, filename+"__" + (states != null ? getStatesName(states) : ("state_pos_" + i)), null)); + stateJson.put("drawable", getDrawable(d, filename + "__" + (states != null ? getStatesName(states) : ("state_pos_" + i)), null)); array.put(stateJson); } json.put("type", "stateslist"); @@ -667,32 +443,33 @@ public class ExtractStyle { JSONObject json = new JSONObject(); try { json.put("type", "gradient"); - Object obj=drawable.getConstantState(); - Class gradientStateClass=obj.getClass(); - json.put("shape",gradientStateClass.getField("mShape").getInt(obj)); - json.put("gradient",gradientStateClass.getField("mGradient").getInt(obj)); - GradientDrawable.Orientation orientation=(Orientation) gradientStateClass.getField("mOrientation").get(obj); - json.put("orientation",orientation.name()); - int [] intArray=(int[]) gradientStateClass.getField((Build.VERSION.SDK_INT < 23) ? "mColors" : "mGradientColors").get(obj); + Object obj = drawable.getConstantState(); + Class gradientStateClass = obj.getClass(); + json.put("shape", gradientStateClass.getField("mShape").getInt(obj)); + json.put("gradient", gradientStateClass.getField("mGradient").getInt(obj)); + GradientDrawable.Orientation orientation = (Orientation) gradientStateClass.getField("mOrientation").get(obj); + if (orientation != null) + json.put("orientation", orientation.name()); + int[] intArray = (int[]) gradientStateClass.getField("mGradientColors").get(obj); if (intArray != null) - json.put("colors",getJsonArray(intArray, 0, intArray.length)); - json.put("positions",getJsonArray((float[]) gradientStateClass.getField("mPositions").get(obj))); - json.put("strokeWidth",gradientStateClass.getField("mStrokeWidth").getInt(obj)); - json.put("strokeDashWidth",gradientStateClass.getField("mStrokeDashWidth").getFloat(obj)); - json.put("strokeDashGap",gradientStateClass.getField("mStrokeDashGap").getFloat(obj)); - json.put("radius",gradientStateClass.getField("mRadius").getFloat(obj)); - float [] floatArray=(float[]) gradientStateClass.getField("mRadiusArray").get(obj); - if (floatArray!=null) - json.put("radiusArray",getJsonArray(floatArray)); - Rect rc= (Rect) gradientStateClass.getField("mPadding").get(obj); - if (rc!=null) - json.put("padding",getJsonRect(rc)); - json.put("width",gradientStateClass.getField("mWidth").getInt(obj)); - json.put("height",gradientStateClass.getField("mHeight").getInt(obj)); - json.put("innerRadiusRatio",gradientStateClass.getField("mInnerRadiusRatio").getFloat(obj)); - json.put("thicknessRatio",gradientStateClass.getField("mThicknessRatio").getFloat(obj)); - json.put("innerRadius",gradientStateClass.getField("mInnerRadius").getInt(obj)); - json.put("thickness",gradientStateClass.getField("mThickness").getInt(obj)); + json.put("colors", getJsonArray(intArray, 0, intArray.length)); + json.put("positions", getJsonArray((float[]) gradientStateClass.getField("mPositions").get(obj))); + json.put("strokeWidth", gradientStateClass.getField("mStrokeWidth").getInt(obj)); + json.put("strokeDashWidth", gradientStateClass.getField("mStrokeDashWidth").getFloat(obj)); + json.put("strokeDashGap", gradientStateClass.getField("mStrokeDashGap").getFloat(obj)); + json.put("radius", gradientStateClass.getField("mRadius").getFloat(obj)); + float[] floatArray = (float[]) gradientStateClass.getField("mRadiusArray").get(obj); + if (floatArray != null) + json.put("radiusArray", getJsonArray(floatArray)); + Rect rc = (Rect) gradientStateClass.getField("mPadding").get(obj); + if (rc != null) + json.put("padding", getJsonRect(rc)); + json.put("width", gradientStateClass.getField("mWidth").getInt(obj)); + json.put("height", gradientStateClass.getField("mHeight").getInt(obj)); + json.put("innerRadiusRatio", gradientStateClass.getField("mInnerRadiusRatio").getFloat(obj)); + json.put("thicknessRatio", gradientStateClass.getField("mThicknessRatio").getFloat(obj)); + json.put("innerRadius", gradientStateClass.getField("mInnerRadius").getInt(obj)); + json.put("thickness", gradientStateClass.getField("mThickness").getInt(obj)); } catch (Exception e) { e.printStackTrace(); } @@ -705,10 +482,7 @@ public class ExtractStyle { json.put("type", "rotate"); Object obj = drawable.getConstantState(); Class rotateStateClass = obj.getClass(); - if (Build.VERSION.SDK_INT < 23) - json.put("drawable", getDrawable(getAccessibleField(rotateStateClass, "mDrawable").get(obj), filename, null)); - else - json.put("drawable", getDrawable(drawable.getClass().getMethod("getDrawable").invoke(drawable), filename, null)); + json.put("drawable", getDrawable(drawable.getClass().getMethod("getDrawable").invoke(drawable), filename, null)); json.put("pivotX", getAccessibleField(rotateStateClass, "mPivotX").getFloat(obj)); json.put("pivotXRel", getAccessibleField(rotateStateClass, "mPivotXRel").getBoolean(obj)); json.put("pivotY", getAccessibleField(rotateStateClass, "mPivotY").getFloat(obj)); @@ -728,11 +502,10 @@ public class ExtractStyle { json.put("oneshot", drawable.isOneShot()); final int count = drawable.getNumberOfFrames(); JSONArray frames = new JSONArray(); - for (int i = 0; i < count; ++i) - { + for (int i = 0; i < count; ++i) { JSONObject frame = new JSONObject(); frame.put("duration", drawable.getDuration(i)); - frame.put("drawable", getDrawable(drawable.getFrame(i), filename+"__"+i, null)); + frame.put("drawable", getDrawable(drawable.getFrame(i), filename + "__" + i, null)); frames.put(frame); } json.put("frames", frames); @@ -742,8 +515,7 @@ public class ExtractStyle { return json; } - private JSONObject getJsonRect(Rect rect) throws JSONException - { + private JSONObject getJsonRect(Rect rect) throws JSONException { JSONObject jsonRect = new JSONObject(); jsonRect.put("left", rect.left); jsonRect.put("top", rect.top); @@ -753,26 +525,23 @@ public class ExtractStyle { } - private JSONArray getJsonArray(int[] array, int pos, int len) - { + private JSONArray getJsonArray(int[] array, int pos, int len) { JSONArray a = new JSONArray(); - final int l = pos+len; - for (int i=pos; i m_drawableCache = new HashMap(); - - private JSONObject getRippleDrawable(Object drawable, String filename, Rect padding) - { + private JSONObject getRippleDrawable(Object drawable, String filename, Rect padding) { JSONObject json = getLayerDrawable(drawable, filename); - JSONObject ripple = new JSONObject(); + JSONObject ripple = new JSONObject(); try { + Class rippleDrawableClass = Class.forName("android.graphics.drawable.RippleDrawable"); final Object mState = getAccessibleField(rippleDrawableClass, "mState").get(drawable); - ripple.put("mask", getDrawable((Drawable)getAccessibleField(rippleDrawableClass, "mMask").get(drawable), filename, padding)); - ripple.put("maxRadius", getAccessibleField(mState.getClass(), "mMaxRadius").getInt(mState)); - ripple.put("color", getColorStateList((ColorStateList)getAccessibleField(mState.getClass(), "mColor").get(mState))); + ripple.put("mask", getDrawable((Drawable) getAccessibleField(rippleDrawableClass, "mMask").get(drawable), filename, padding)); + if (mState != null) { + ripple.put("maxRadius", getAccessibleField(mState.getClass(), "mMaxRadius").getInt(mState)); + ColorStateList color = (ColorStateList) getAccessibleField(mState.getClass(), "mColor").get(mState); + if (color != null) + ripple.put("color", getColorStateList(color)); + } json.put("ripple", ripple); } catch (Exception e) { e.printStackTrace(); @@ -824,32 +584,31 @@ public class ExtractStyle { return json; } - private HashMap getStateTransitions(Object sa) throws Exception - { - HashMap transitions = new HashMap(); + private HashMap getStateTransitions(Object sa) throws Exception { + HashMap transitions = new HashMap<>(); final int sz = getAccessibleField(sa.getClass(), "mSize").getInt(sa); long[] keys = (long[]) getAccessibleField(sa.getClass(), "mKeys").get(sa); long[] values = (long[]) getAccessibleField(sa.getClass(), "mValues").get(sa); for (int i = 0; i < sz; i++) { - transitions.put(keys[i], values[i]); + if (keys != null && values != null) + transitions.put(keys[i], values[i]); } return transitions; } - private HashMap getStateIds(Object sa) throws Exception - { - HashMap states = new HashMap(); + private HashMap getStateIds(Object sa) throws Exception { + HashMap states = new HashMap<>(); final int sz = getAccessibleField(sa.getClass(), "mSize").getInt(sa); int[] keys = (int[]) getAccessibleField(sa.getClass(), "mKeys").get(sa); int[] values = (int[]) getAccessibleField(sa.getClass(), "mValues").get(sa); for (int i = 0; i < sz; i++) { - states.put(keys[i], values[i]); + if (keys != null && values != null) + states.put(keys[i], values[i]); } return states; } - private int findStateIndex(int id, HashMap stateIds) - { + private int findStateIndex(int id, HashMap stateIds) { for (Map.Entry s : stateIds.entrySet()) { if (id == s.getValue()) return s.getKey(); @@ -857,27 +616,30 @@ public class ExtractStyle { return -1; } - private JSONObject getAnimatedStateListDrawable(Object drawable, String filename) - { + private JSONObject getAnimatedStateListDrawable(Object drawable, String filename) { JSONObject json = getStateListDrawable(drawable, filename); try { + Class animatedStateListDrawableClass = Class.forName("android.graphics.drawable.AnimatedStateListDrawable"); Object state = getAccessibleField(animatedStateListDrawableClass, "mState").get(drawable); - HashMap stateIds = getStateIds(getAccessibleField(state.getClass(), "mStateIds").get(state)); - HashMap transitions = getStateTransitions(getAccessibleField(state.getClass(), "mTransitions").get(state)); + if (state != null) { + Class stateClass = state.getClass(); + HashMap stateIds = getStateIds(Objects.requireNonNull(getAccessibleField(stateClass, "mStateIds").get(state))); + HashMap transitions = getStateTransitions(Objects.requireNonNull(getAccessibleField(stateClass, "mTransitions").get(state))); - for (Map.Entry t : transitions.entrySet()) { - final int toState = findStateIndex(t.getKey().intValue(), stateIds); - final int fromState = findStateIndex((int) (t.getKey() >> 32), stateIds); + for (Map.Entry t : transitions.entrySet()) { + final int toState = findStateIndex(t.getKey().intValue(), stateIds); + final int fromState = findStateIndex((int) (t.getKey() >> 32), stateIds); - JSONObject transition = new JSONObject(); - transition.put("from", fromState); - transition.put("to", toState); - transition.put("reverse", (t.getValue() >> 32) != 0); + JSONObject transition = new JSONObject(); + transition.put("from", fromState); + transition.put("to", toState); + transition.put("reverse", (t.getValue() >> 32) != 0); - JSONArray stateslist = json.getJSONArray("stateslist"); - JSONObject stateobj = stateslist.getJSONObject(t.getValue().intValue()); - stateobj.put("transition", transition); + JSONArray stateslist = json.getJSONArray("stateslist"); + JSONObject stateobj = stateslist.getJSONObject(t.getValue().intValue()); + stateobj.put("transition", transition); + } } } catch (Exception e) { e.printStackTrace(); @@ -885,21 +647,22 @@ public class ExtractStyle { return json; } - private JSONObject getVPath(Object path) throws Exception - { + private JSONObject getVPath(Object path) throws Exception { JSONObject json = new JSONObject(); final Class pathClass = path.getClass(); json.put("type", "path"); json.put("name", tryGetAccessibleField(pathClass, "mPathName").get(path)); Object[] mNodes = (Object[]) tryGetAccessibleField(pathClass, "mNodes").get(path); JSONArray nodes = new JSONArray(); - for (Object n: mNodes) { - JSONObject node = new JSONObject(); - node.put("type", String.valueOf(getAccessibleField(n.getClass(), "mType").getChar(n))); - node.put("params", getJsonArray((float[])getAccessibleField(n.getClass(), "mParams").get(n))); - nodes.put(node); + if (mNodes != null) { + for (Object n : mNodes) { + JSONObject node = new JSONObject(); + node.put("type", String.valueOf(getAccessibleField(n.getClass(), "mType").getChar(n))); + node.put("params", getJsonArray((float[]) getAccessibleField(n.getClass(), "mParams").get(n))); + nodes.put(node); + } + json.put("nodes", nodes); } - json.put("nodes", nodes); json.put("isClip", (Boolean) pathClass.getMethod("isClipPath").invoke(path)); if (tryGetAccessibleField(pathClass, "mStrokeColor") == null) @@ -921,8 +684,7 @@ public class ExtractStyle { } @SuppressWarnings("unchecked") - private JSONObject getVGroup(Object group) throws Exception - { + private JSONObject getVGroup(Object group) throws Exception { JSONObject json = new JSONObject(); json.put("type", "group"); final Class groupClass = group.getClass(); @@ -937,64 +699,63 @@ public class ExtractStyle { ArrayList mChildren = (ArrayList) getAccessibleField(groupClass, "mChildren").get(group); JSONArray children = new JSONArray(); - for (Object c: mChildren) { - if (groupClass.isInstance(c)) - children.put(getVGroup(c)); - else - children.put(getVPath(c)); + if (mChildren != null) { + for (Object c : mChildren) { + if (groupClass.isInstance(c)) + children.put(getVGroup(c)); + else + children.put(getVPath(c)); + } + json.put("children", children); } - json.put("children", children); return json; } - private JSONObject getVectorDrawable(Object drawable, String filename, Rect padding) - { + private JSONObject getVectorDrawable(Object drawable) { JSONObject json = new JSONObject(); try { json.put("type", "vector"); + Class vectorDrawableClass = Class.forName("android.graphics.drawable.VectorDrawable"); final Object state = getAccessibleField(vectorDrawableClass, "mVectorState").get(drawable); - final Class stateClass = state.getClass(); + final Class stateClass = Objects.requireNonNull(state).getClass(); final ColorStateList mTint = (ColorStateList) getAccessibleField(stateClass, "mTint").get(state); if (mTint != null) { json.put("tintList", getColorStateList(mTint)); json.put("tintMode", (PorterDuff.Mode) getAccessibleField(stateClass, "mTintMode").get(state)); } final Object mVPathRenderer = getAccessibleField(stateClass, "mVPathRenderer").get(state); - final Class VPathRendererClass = mVPathRenderer.getClass(); + final Class VPathRendererClass = Objects.requireNonNull(mVPathRenderer).getClass(); json.put("baseWidth", getAccessibleField(VPathRendererClass, "mBaseWidth").getFloat(mVPathRenderer)); json.put("baseHeight", getAccessibleField(VPathRendererClass, "mBaseHeight").getFloat(mVPathRenderer)); json.put("viewportWidth", getAccessibleField(VPathRendererClass, "mViewportWidth").getFloat(mVPathRenderer)); json.put("viewportHeight", getAccessibleField(VPathRendererClass, "mViewportHeight").getFloat(mVPathRenderer)); json.put("rootAlpha", getAccessibleField(VPathRendererClass, "mRootAlpha").getInt(mVPathRenderer)); json.put("rootName", getAccessibleField(VPathRendererClass, "mRootName").get(mVPathRenderer)); - json.put("rootGroup", getVGroup(getAccessibleField(mVPathRenderer.getClass(), "mRootGroup").get(mVPathRenderer))); - } catch(Exception e) { + json.put("rootGroup", getVGroup(Objects.requireNonNull(getAccessibleField(VPathRendererClass, "mRootGroup").get(mVPathRenderer)))); + } catch (Exception e) { e.printStackTrace(); } return json; } - public JSONObject getDrawable(Object drawable, String filename, Rect padding) - { + public JSONObject getDrawable(Object drawable, String filename, Rect padding) { if (drawable == null || m_minimal) return null; DrawableCache dc = m_drawableCache.get(filename); - if (dc != null) - { + if (dc != null) { if (dc.drawable.equals(drawable)) return dc.object; else - Log.e(QtNative.QtTAG, "Different drawable objects points to the same file name \"" + filename +"\""); + Log.e(QtNative.QtTAG, "Different drawable objects points to the same file name \"" + filename + "\""); } JSONObject json = new JSONObject(); Bitmap bmp = null; if (drawable instanceof Bitmap) bmp = (Bitmap) drawable; - else - { + else { if (drawable instanceof BitmapDrawable) { - BitmapDrawable bitmapDrawable = (BitmapDrawable)drawable; + BitmapDrawable bitmapDrawable = (BitmapDrawable) drawable; bmp = bitmapDrawable.getBitmap(); try { json.put("gravity", bitmapDrawable.getGravity()); @@ -1009,48 +770,39 @@ public class ExtractStyle { } catch (Exception e) { e.printStackTrace(); } - } - else - { + } else { - if (rippleDrawableClass != null && rippleDrawableClass.isInstance(drawable)) + if (drawable instanceof RippleDrawable) return getRippleDrawable(drawable, filename, padding); - if (animatedStateListDrawableClass != null && animatedStateListDrawableClass.isInstance(drawable)) + if (drawable instanceof AnimatedStateListDrawable) return getAnimatedStateListDrawable(drawable, filename); - if (vectorDrawableClass != null && vectorDrawableClass.isInstance(drawable)) - return getVectorDrawable(drawable, filename, padding); + if (drawable instanceof VectorDrawable) + return getVectorDrawable(drawable); - if (drawable instanceof ScaleDrawable) - { - return getDrawable(((ScaleDrawable)drawable).getDrawable(), filename, null); + if (drawable instanceof ScaleDrawable) { + return getDrawable(((ScaleDrawable) drawable).getDrawable(), filename, null); } - if (drawable instanceof LayerDrawable) - { + if (drawable instanceof LayerDrawable) { return getLayerDrawable(drawable, filename); } - if (drawable instanceof StateListDrawable) - { + if (drawable instanceof StateListDrawable) { return getStateListDrawable(drawable, filename); } - if (drawable instanceof GradientDrawable) - { + if (drawable instanceof GradientDrawable) { return getGradientDrawable((GradientDrawable) drawable); } - if (drawable instanceof RotateDrawable) - { + if (drawable instanceof RotateDrawable) { return getRotateDrawable((RotateDrawable) drawable, filename); } - if (drawable instanceof AnimationDrawable) - { + if (drawable instanceof AnimationDrawable) { return getAnimationDrawable((AnimationDrawable) drawable, filename); } - if (drawable instanceof ClipDrawable) - { + if (drawable instanceof ClipDrawable) { try { json.put("type", "clipDrawable"); - Drawable.ConstantState dcs = ((ClipDrawable)drawable).getConstantState(); + Drawable.ConstantState dcs = ((ClipDrawable) drawable).getConstantState(); json.put("drawable", getDrawable(getAccessibleField(dcs.getClass(), "mDrawable").get(dcs), filename, null)); if (null != padding) json.put("padding", getJsonRect(padding)); @@ -1064,8 +816,7 @@ public class ExtractStyle { } return json; } - if (drawable instanceof ColorDrawable) - { + if (drawable instanceof ColorDrawable) { bmp = Bitmap.createBitmap(1, 1, Config.ARGB_8888); Drawable d = (Drawable) drawable; d.setBounds(0, 0, 1, 1); @@ -1085,36 +836,29 @@ public class ExtractStyle { } return json; } - if (drawable instanceof InsetDrawable) - { + if (drawable instanceof InsetDrawable) { try { - InsetDrawable d = (InsetDrawable)drawable; - // mInsetState changed to mState in Android 5.1 (22) - Object mInsetStateObject = getAccessibleField(InsetDrawable.class, (Build.VERSION.SDK_INT > 21) ? "mState" - : "mInsetState").get(d); + InsetDrawable d = (InsetDrawable) drawable; + Object mInsetStateObject = getAccessibleField(InsetDrawable.class, "mState").get(d); Rect _padding = new Rect(); boolean hasPadding = d.getPadding(_padding); - return getDrawable(getAccessibleField(mInsetStateObject.getClass(), "mDrawable").get(mInsetStateObject), filename, hasPadding ? _padding : null); + return getDrawable(getAccessibleField(Objects.requireNonNull(mInsetStateObject).getClass(), "mDrawable").get(mInsetStateObject), filename, hasPadding ? _padding : null); } catch (Exception e) { e.printStackTrace(); } - } - else - { + } else { Drawable d = (Drawable) drawable; - int w=d.getIntrinsicWidth(); - int h=d.getIntrinsicHeight(); + int w = d.getIntrinsicWidth(); + int h = d.getIntrinsicHeight(); d.setLevel(10000); - if (w<1 || h< 1) - { - w=100; - h=100; + if (w < 1 || h < 1) { + w = 100; + h = 100; } bmp = Bitmap.createBitmap(w, h, Config.ARGB_8888); d.setBounds(0, 0, w, h); d.draw(new Canvas(bmp)); - if (drawable instanceof NinePatchDrawable) - { + if (drawable instanceof NinePatchDrawable) { NinePatchDrawable npd = (NinePatchDrawable) drawable; try { json.put("type", "9patch"); @@ -1138,657 +882,690 @@ public class ExtractStyle { } FileOutputStream out; try { - filename = m_extractPath+filename+".png"; + filename = m_extractPath + filename + ".png"; out = new FileOutputStream(filename); - bmp.compress(Bitmap.CompressFormat.PNG, 100, out); + if (bmp != null) + bmp.compress(Bitmap.CompressFormat.PNG, 100, out); out.close(); - } catch (FileNotFoundException e) { - e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } try { json.put("type", "image"); json.put("path", filename); - json.put("width", bmp.getWidth()); - json.put("height", bmp.getHeight()); + if (bmp != null) { + json.put("width", bmp.getWidth()); + json.put("height", bmp.getHeight()); + } m_drawableCache.put(filename, new DrawableCache(json, drawable)); -// MinistroActivity.nativeChmode(filename, 0644); } catch (JSONException e) { e.printStackTrace(); } return json; } - public void extractViewInformations(String styleName, int styleId, JSONObject json, String qtClassName, AttributeSet attribSet) + private TypedArray obtainStyledAttributes(int styleName, int[] attributes) { + TypedValue typedValue = new TypedValue(); + Context ctx = new ContextThemeWrapper(m_context, m_theme); + ctx.getTheme().resolveAttribute(styleName, typedValue, true); + return ctx.obtainStyledAttributes(typedValue.data, attributes); + } + + private ArrayList getArrayListFromIntArray(int[] attributes) { + ArrayList sortedAttrs = new ArrayList<>(); + for (int attr : attributes) + sortedAttrs.add(attr); + return sortedAttrs; + } + + public void extractViewInformation(int styleName, JSONObject json, String qtClassName) { + extractViewInformation(styleName, json, qtClassName, null); + } + + public void extractViewInformation(int styleName, JSONObject json, String qtClassName, AttributeSet attributeSet) { try { - int[] viewAttrs; - viewAttrs = (int[]) styleableClass.getDeclaredField("View").get(null); - TypedArray a =m_theme.obtainStyledAttributes(attribSet, viewAttrs, styleId, 0); + TypedValue typedValue = new TypedValue(); + Context ctx = new ContextThemeWrapper(m_context, m_theme); + ctx.getTheme().resolveAttribute(styleName, typedValue, true); + + int[] attributes = new int[]{ + android.R.attr.digits, + android.R.attr.background, + android.R.attr.padding, + android.R.attr.paddingLeft, + android.R.attr.paddingTop, + android.R.attr.paddingRight, + android.R.attr.paddingBottom, + android.R.attr.scrollX, + android.R.attr.scrollY, + android.R.attr.id, + android.R.attr.tag, + android.R.attr.fitsSystemWindows, + android.R.attr.focusable, + android.R.attr.focusableInTouchMode, + android.R.attr.clickable, + android.R.attr.longClickable, + android.R.attr.saveEnabled, + android.R.attr.duplicateParentState, + android.R.attr.visibility, + android.R.attr.drawingCacheQuality, + android.R.attr.contentDescription, + android.R.attr.soundEffectsEnabled, + android.R.attr.hapticFeedbackEnabled, + android.R.attr.scrollbars, + android.R.attr.fadingEdge, + android.R.attr.scrollbarStyle, + android.R.attr.scrollbarFadeDuration, + android.R.attr.scrollbarDefaultDelayBeforeFade, + android.R.attr.scrollbarSize, + android.R.attr.scrollbarThumbHorizontal, + android.R.attr.scrollbarThumbVertical, + android.R.attr.scrollbarTrackHorizontal, + android.R.attr.scrollbarTrackVertical, + android.R.attr.isScrollContainer, + android.R.attr.keepScreenOn, + android.R.attr.filterTouchesWhenObscured, + android.R.attr.nextFocusLeft, + android.R.attr.nextFocusRight, + android.R.attr.nextFocusUp, + android.R.attr.nextFocusDown, + android.R.attr.minWidth, + android.R.attr.minHeight, + android.R.attr.onClick, + android.R.attr.overScrollMode, + android.R.attr.paddingStart, + android.R.attr.paddingEnd, + }; + + // The array must be sorted in ascending order, otherwise obtainStyledAttributes() + // might fail to find some attributes + Arrays.sort(attributes); + TypedArray array; + if (attributeSet != null) + array = m_theme.obtainStyledAttributes(attributeSet, attributes, styleName, 0); + else + array = obtainStyledAttributes(styleName, attributes); + ArrayList sortedAttrs = getArrayListFromIntArray(attributes); if (null != qtClassName) json.put("qtClass", qtClassName); + json.put("defaultBackgroundColor", defaultBackgroundColor); json.put("defaultTextColorPrimary", defaultTextColor); - final int N = a.getIndexCount(); - for (int i = 0; i < N; i++) { - int attr = a.getIndex(i); - if (attr == View_background) - json.put("View_background", getDrawable(a.getDrawable(attr), styleName + "_View_background", null)); - else if (attr == View_padding) - json.put("View_padding", a.getDimensionPixelSize(attr, -1)); - else if (attr == View_paddingLeft) - json.put("View_paddingLeft", a.getDimensionPixelSize(attr, -1)); - else if (attr == View_paddingTop) - json.put("View_paddingTop", a.getDimensionPixelSize(attr, -1)); - else if (attr == View_paddingRight) - json.put("View_paddingRight", a.getDimensionPixelSize(attr, -1)); - else if (attr == View_paddingBottom) - json.put("View_paddingBottom", a.getDimensionPixelSize(attr, -1)); - else if (attr == View_scrollX) - json.put("View_paddingBottom", a.getDimensionPixelOffset(attr, 0)); - else if (attr == View_scrollY) - json.put("View_scrollY", a.getDimensionPixelOffset(attr, 0)); - else if (attr == View_id) - json.put("View_id", a.getResourceId(attr, -1)); - else if (attr == View_tag) - json.put("View_tag", a.getText(attr)); - else if (attr == View_fitsSystemWindows) - json.put("View_fitsSystemWindows", a.getBoolean(attr, false)); - else if (attr == View_focusable) - json.put("View_focusable", a.getBoolean(attr, false)); - else if (attr == View_focusableInTouchMode) - json.put("View_focusableInTouchMode", a.getBoolean(attr, false)); - else if (attr == View_clickable) - json.put("View_clickable", a.getBoolean(attr, false)); - else if (attr == View_longClickable) - json.put("View_longClickable", a.getBoolean(attr, false)); - else if (attr == View_saveEnabled) - json.put("View_saveEnabled", a.getBoolean(attr, true)); - else if (attr == View_duplicateParentState) - json.put("View_duplicateParentState", a.getBoolean(attr, false)); - else if (attr == View_visibility) - json.put("View_visibility", a.getInt(attr, 0)); - else if (attr == View_drawingCacheQuality) - json.put("View_drawingCacheQuality", a.getInt(attr, 0)); - else if (attr == View_drawingCacheQuality) - json.put("View_contentDescription", a.getString(attr)); - else if (attr == View_soundEffectsEnabled) - json.put("View_soundEffectsEnabled", a.getBoolean(attr, true)); - else if (attr == View_hapticFeedbackEnabled) - json.put("View_hapticFeedbackEnabled", a.getBoolean(attr, true)); - else if (attr == View_scrollbars) - json.put("View_scrollbars", a.getInt(attr, 0)); - else if (attr == View_fadingEdge) - json.put("View_fadingEdge", a.getInt(attr, 0)); - else if (attr == View_scrollbarStyle) - json.put("View_scrollbarStyle", a.getInt(attr, 0)); - else if (attr == View_scrollbarFadeDuration) - json.put("View_scrollbarFadeDuration", a.getInt(attr, 0)); - else if (attr == View_scrollbarDefaultDelayBeforeFade) - json.put("View_scrollbarDefaultDelayBeforeFade", a.getInt(attr, 0)); - else if (attr == View_scrollbarSize) - json.put("View_scrollbarSize", a.getDimensionPixelSize(attr, -1)); - else if (attr == View_scrollbarThumbHorizontal) - json.put("View_scrollbarThumbHorizontal", getDrawable(a.getDrawable(attr), styleName + "_View_scrollbarThumbHorizontal", null)); - else if (attr == View_scrollbarThumbVertical) - json.put("View_scrollbarThumbVertical", getDrawable(a.getDrawable(attr), styleName + "_View_scrollbarThumbVertical", null)); - else if (attr == View_scrollbarTrackHorizontal) - json.put("View_scrollbarTrackHorizontal", getDrawable(a.getDrawable(attr), styleName + "_View_scrollbarTrackHorizontal", null)); - else if (attr == View_scrollbarTrackVertical) - json.put("View_scrollbarTrackVertical", getDrawable(a.getDrawable(attr), styleName + "_View_scrollbarTrackVertical", null)); - else if (attr == View_isScrollContainer) - json.put("View_isScrollContainer", a.getBoolean(attr, false)); - else if (attr == View_keepScreenOn) - json.put("View_keepScreenOn", a.getBoolean(attr, false)); - else if (attr == View_filterTouchesWhenObscured) - json.put("View_filterTouchesWhenObscured", a.getBoolean(attr, false)); - else if (attr == View_nextFocusLeft) - json.put("View_nextFocusLeft", a.getResourceId(attr, -1)); - else if (attr == View_nextFocusRight) - json.put("View_nextFocusRight", a.getResourceId(attr, -1)); - else if (attr == View_nextFocusUp) - json.put("View_nextFocusUp", a.getResourceId(attr, -1)); - else if (attr == View_nextFocusDown) - json.put("View_nextFocusDown", a.getResourceId(attr, -1)); - else if (attr == View_minWidth) - json.put("View_minWidth", a.getDimensionPixelSize(attr, 0)); - else if (attr == View_minHeight) - json.put("View_minHeight", a.getDimensionPixelSize(attr, 0)); - else if (attr == View_onClick) - json.put("View_onClick", a.getString(attr)); - else if (attr == View_overScrollMode) - json.put("View_overScrollMode", a.getInt(attr, 1)); - else if (attr == View_paddingStart) - json.put("View_paddingStart", a.getDimensionPixelSize(attr, 0)); - else if (attr == View_paddingEnd) - json.put("View_paddingEnd", a.getDimensionPixelSize(attr, 0)); - } - a.recycle(); + json.put("TextView_digits", array.getText(sortedAttrs.indexOf(android.R.attr.digits))); + json.put("View_background", getDrawable(array.getDrawable(sortedAttrs.indexOf(android.R.attr.background)), styleName + "_View_background", null)); + json.put("View_padding", array.getDimensionPixelSize(sortedAttrs.indexOf(android.R.attr.padding), -1)); + json.put("View_paddingLeft", array.getDimensionPixelSize(sortedAttrs.indexOf(android.R.attr.paddingLeft), -1)); + json.put("View_paddingTop", array.getDimensionPixelSize(sortedAttrs.indexOf(android.R.attr.paddingTop), -1)); + json.put("View_paddingRight", array.getDimensionPixelSize(sortedAttrs.indexOf(android.R.attr.paddingRight), -1)); + json.put("View_paddingBottom", array.getDimensionPixelSize(sortedAttrs.indexOf(android.R.attr.paddingBottom), -1)); + json.put("View_paddingBottom", array.getDimensionPixelOffset(sortedAttrs.indexOf(android.R.attr.scrollX), 0)); + json.put("View_scrollY", array.getDimensionPixelOffset(sortedAttrs.indexOf(android.R.attr.scrollY), 0)); + json.put("View_id", array.getResourceId(sortedAttrs.indexOf(android.R.attr.id), -1)); + json.put("View_tag", array.getText(sortedAttrs.indexOf(android.R.attr.tag))); + json.put("View_fitsSystemWindows", array.getBoolean(sortedAttrs.indexOf(android.R.attr.fitsSystemWindows), false)); + json.put("View_focusable", array.getBoolean(sortedAttrs.indexOf(android.R.attr.focusable), false)); + json.put("View_focusableInTouchMode", array.getBoolean(sortedAttrs.indexOf(android.R.attr.focusableInTouchMode), false)); + json.put("View_clickable", array.getBoolean(sortedAttrs.indexOf(android.R.attr.clickable), false)); + json.put("View_longClickable", array.getBoolean(sortedAttrs.indexOf(android.R.attr.longClickable), false)); + json.put("View_saveEnabled", array.getBoolean(sortedAttrs.indexOf(android.R.attr.saveEnabled), true)); + json.put("View_duplicateParentState", array.getBoolean(sortedAttrs.indexOf(android.R.attr.duplicateParentState), false)); + json.put("View_visibility", array.getInt(sortedAttrs.indexOf(android.R.attr.visibility), 0)); + json.put("View_drawingCacheQuality", array.getInt(sortedAttrs.indexOf(android.R.attr.drawingCacheQuality), 0)); + json.put("View_contentDescription", array.getString(sortedAttrs.indexOf(android.R.attr.contentDescription))); + json.put("View_soundEffectsEnabled", array.getBoolean(sortedAttrs.indexOf(android.R.attr.soundEffectsEnabled), true)); + json.put("View_hapticFeedbackEnabled", array.getBoolean(sortedAttrs.indexOf(android.R.attr.hapticFeedbackEnabled), true)); + json.put("View_scrollbars", array.getInt(sortedAttrs.indexOf(android.R.attr.scrollbars), 0)); + json.put("View_fadingEdge", array.getInt(sortedAttrs.indexOf(android.R.attr.fadingEdge), 0)); + json.put("View_scrollbarStyle", array.getInt(sortedAttrs.indexOf(android.R.attr.scrollbarStyle), 0)); + json.put("View_scrollbarFadeDuration", array.getInt(sortedAttrs.indexOf(android.R.attr.scrollbarFadeDuration), 0)); + json.put("View_scrollbarDefaultDelayBeforeFade", array.getInt(sortedAttrs.indexOf(android.R.attr.scrollbarDefaultDelayBeforeFade), 0)); + json.put("View_scrollbarSize", array.getDimensionPixelSize(sortedAttrs.indexOf(android.R.attr.scrollbarSize), -1)); + json.put("View_scrollbarThumbHorizontal", getDrawable(array.getDrawable(sortedAttrs.indexOf(android.R.attr.scrollbarThumbHorizontal)), styleName + "_View_scrollbarThumbHorizontal", null)); + json.put("View_scrollbarThumbVertical", getDrawable(array.getDrawable(sortedAttrs.indexOf(android.R.attr.scrollbarThumbVertical)), styleName + "_View_scrollbarThumbVertical", null)); + json.put("View_scrollbarTrackHorizontal", getDrawable(array.getDrawable(sortedAttrs.indexOf(android.R.attr.scrollbarTrackHorizontal)), styleName + "_View_scrollbarTrackHorizontal", null)); + json.put("View_scrollbarTrackVertical", getDrawable(array.getDrawable(sortedAttrs.indexOf(android.R.attr.scrollbarTrackVertical)), styleName + "_View_scrollbarTrackVertical", null)); + json.put("View_isScrollContainer", array.getBoolean(sortedAttrs.indexOf(android.R.attr.isScrollContainer), false)); + json.put("View_keepScreenOn", array.getBoolean(sortedAttrs.indexOf(android.R.attr.keepScreenOn), false)); + json.put("View_filterTouchesWhenObscured", array.getBoolean(sortedAttrs.indexOf(android.R.attr.filterTouchesWhenObscured), false)); + json.put("View_nextFocusLeft", array.getResourceId(sortedAttrs.indexOf(android.R.attr.nextFocusLeft), -1)); + json.put("View_nextFocusRight", array.getResourceId(sortedAttrs.indexOf(android.R.attr.nextFocusRight), -1)); + json.put("View_nextFocusUp", array.getResourceId(sortedAttrs.indexOf(android.R.attr.nextFocusUp), -1)); + json.put("View_nextFocusDown", array.getResourceId(sortedAttrs.indexOf(android.R.attr.nextFocusDown), -1)); + json.put("View_minWidth", array.getDimensionPixelSize(sortedAttrs.indexOf(android.R.attr.minWidth), 0)); + json.put("View_minHeight", array.getDimensionPixelSize(sortedAttrs.indexOf(android.R.attr.minHeight), 0)); + json.put("View_onClick", array.getString(sortedAttrs.indexOf(android.R.attr.onClick))); + json.put("View_overScrollMode", array.getInt(sortedAttrs.indexOf(android.R.attr.overScrollMode), 1)); + json.put("View_paddingStart", array.getDimensionPixelSize(sortedAttrs.indexOf(android.R.attr.paddingStart), 0)); + json.put("View_paddingEnd", array.getDimensionPixelSize(sortedAttrs.indexOf(android.R.attr.paddingEnd), 0)); + array.recycle(); } catch (Exception e) { e.printStackTrace(); } } - public JSONObject extractTextAppearance(int styleId) + public JSONObject extractTextAppearance(int styleName) { + return extractTextAppearance(styleName, false); + } + + @SuppressLint("ResourceType") + public JSONObject extractTextAppearance(int styleName, boolean subStyle) + { + final int[] attributes = new int[]{ + android.R.attr.textSize, + android.R.attr.textStyle, + android.R.attr.textColor, + android.R.attr.typeface, + android.R.attr.textAllCaps, + android.R.attr.textColorHint, + android.R.attr.textColorLink, + android.R.attr.textColorHighlight + }; + Arrays.sort(attributes); + TypedArray array; + if (subStyle) + array = m_theme.obtainStyledAttributes(styleName, attributes); + else + array = obtainStyledAttributes(styleName, attributes); + ArrayList sortedAttrs = getArrayListFromIntArray(attributes); JSONObject json = new JSONObject(); - try - { - TypedArray a = m_theme.obtainStyledAttributes(styleId, (int[]) styleableClass.getDeclaredField("TextAppearance").get(null)); - int n = a.getIndexCount(); - for (int i = 0; i < n; i++) - { - int attr = a.getIndex(i); - if (attr == TextAppearance_textColorHighlight) - json.put("TextAppearance_textColorHighlight", a.getColor(attr, 0)); - else if (attr == TextAppearance_textColor) - json.put("TextAppearance_textColor", getColorStateList(a.getColorStateList(attr))); - else if (attr == TextAppearance_textColorHint) - json.put("TextAppearance_textColorHint", getColorStateList(a.getColorStateList(attr))); - else if (attr == TextAppearance_textColorLink) - json.put("TextAppearance_textColorLink", getColorStateList(a.getColorStateList(attr))); - else if (attr == TextAppearance_textSize) - json.put("TextAppearance_textSize", a.getDimensionPixelSize(attr, 15)); - else if (attr == TextAppearance_typeface) - json.put("TextAppearance_typeface", a.getInt(attr, -1)); - else if (attr == TextAppearance_textStyle) - json.put("TextAppearance_textStyle", a.getInt(attr, -1)); - else if (attr == TextAppearance_textAllCaps) - json.put("TextAppearance_textAllCaps", a.getBoolean(attr, false)); - } - a.recycle(); - } - catch (Exception e) - { + try { + int attr = sortedAttrs.indexOf(android.R.attr.textSize); + if (array.hasValue(attr)) + json.put("TextAppearance_textSize", array.getDimensionPixelSize(attr, 15)); + attr = sortedAttrs.indexOf(android.R.attr.textStyle); + if (array.hasValue(attr)) + json.put("TextAppearance_textStyle", array.getInt(attr, -1)); + ColorStateList color = array.getColorStateList(sortedAttrs.indexOf(android.R.attr.textColor)); + if (color != null) + json.put("TextAppearance_textColor", getColorStateList(color)); + attr = sortedAttrs.indexOf(android.R.attr.typeface); + if (array.hasValue(attr)) + json.put("TextAppearance_typeface", array.getInt(attr, -1)); + attr = sortedAttrs.indexOf(android.R.attr.textAllCaps); + if (array.hasValue(attr)) + json.put("TextAppearance_textAllCaps", array.getBoolean(attr, false)); + color = array.getColorStateList(sortedAttrs.indexOf(android.R.attr.textColorHint)); + if (color != null) + json.put("TextAppearance_textColorHint", getColorStateList(color)); + color = array.getColorStateList(sortedAttrs.indexOf(android.R.attr.textColorLink)); + if (color != null) + json.put("TextAppearance_textColorLink", getColorStateList(color)); + attr = sortedAttrs.indexOf(android.R.attr.textColorHighlight); + if (array.hasValue(attr)) + json.put("TextAppearance_textColorHighlight", array.getColor(attr, 0)); + array.recycle(); + } catch (Exception e) { e.printStackTrace(); } return json; } - public JSONObject extractTextAppearanceInformations(String styleName, String qtClass, AttributeSet attribSet, int textAppearance) - { + public JSONObject extractTextAppearanceInformation(int styleName, String qtClass, AttributeSet attributeSet) { + return extractTextAppearanceInformation(styleName, qtClass, android.R.attr.textAppearance, attributeSet); + } + + public JSONObject extractTextAppearanceInformation(int styleName, String qtClass) { + return extractTextAppearanceInformation(styleName, qtClass, android.R.attr.textAppearance, null); + } + + public JSONObject extractTextAppearanceInformation(int styleName, String qtClass, int textAppearance, AttributeSet attributeSet) { JSONObject json = new JSONObject(); - try - { - int textColorHighlight = 0; // - ColorStateList textColor = null; // - ColorStateList textColorHint = null; // - ColorStateList textColorLink = null; // - int textSize = 15; // - int typefaceIndex = -1; // + extractViewInformation(styleName, json, qtClass, attributeSet); + + if (textAppearance == -1) + textAppearance = android.R.attr.textAppearance; + + try { + TypedValue typedValue = new TypedValue(); + Context ctx = new ContextThemeWrapper(m_context, m_theme); + ctx.getTheme().resolveAttribute(styleName, typedValue, true); + + // Get textAppearance values + int[] textAppearanceAttr = new int[]{textAppearance}; + TypedArray textAppearanceArray = ctx.obtainStyledAttributes(typedValue.data, textAppearanceAttr); + int textAppearanceId = textAppearanceArray.getResourceId(0, -1); + textAppearanceArray.recycle(); + + int textSize = 15; int styleIndex = -1; + int typefaceIndex = -1; + int textColorHighlight = 0; boolean allCaps = false; - Class attrClass= Class.forName("android.R$attr"); - int styleId = attrClass.getDeclaredField(styleName).getInt(null); + if (textAppearanceId != -1) { + int[] attributes = new int[]{ + android.R.attr.textSize, + android.R.attr.textStyle, + android.R.attr.typeface, + android.R.attr.textAllCaps, + android.R.attr.textColorHighlight + }; + Arrays.sort(attributes); + TypedArray array = m_theme.obtainStyledAttributes(textAppearanceId, attributes); + ArrayList sortedAttrs = getArrayListFromIntArray(attributes); - extractViewInformations(styleName, styleId, json, qtClass, attribSet); + textSize = array.getDimensionPixelSize(sortedAttrs.indexOf(android.R.attr.textSize), 15); + styleIndex = array.getInt(sortedAttrs.indexOf(android.R.attr.textStyle), -1); + typefaceIndex = array.getInt(sortedAttrs.indexOf(android.R.attr.typeface), -1); + textColorHighlight = array.getColor(sortedAttrs.indexOf(android.R.attr.textColorHighlight), 0); + allCaps = array.getBoolean(sortedAttrs.indexOf(android.R.attr.textAllCaps), false); + array.recycle(); + } + // Get TextView values + int[] attributes = new int[]{ + android.R.attr.editable, + android.R.attr.inputMethod, + android.R.attr.numeric, + android.R.attr.digits, + android.R.attr.phoneNumber, + android.R.attr.autoText, + android.R.attr.capitalize, + android.R.attr.bufferType, + android.R.attr.selectAllOnFocus, + android.R.attr.autoLink, + android.R.attr.linksClickable, + android.R.attr.drawableLeft, + android.R.attr.drawableTop, + android.R.attr.drawableRight, + android.R.attr.drawableBottom, + android.R.attr.drawableStart, + android.R.attr.drawableEnd, + android.R.attr.maxLines, + android.R.attr.drawablePadding, + android.R.attr.textCursorDrawable, + android.R.attr.maxHeight, + android.R.attr.lines, + android.R.attr.height, + android.R.attr.minLines, + android.R.attr.minHeight, + android.R.attr.maxEms, + android.R.attr.maxWidth, + android.R.attr.ems, + android.R.attr.width, + android.R.attr.minEms, + android.R.attr.minWidth, + android.R.attr.gravity, + android.R.attr.hint, + android.R.attr.text, + android.R.attr.scrollHorizontally, + android.R.attr.singleLine, + android.R.attr.ellipsize, + android.R.attr.marqueeRepeatLimit, + android.R.attr.includeFontPadding, + android.R.attr.cursorVisible, + android.R.attr.maxLength, + android.R.attr.textScaleX, + android.R.attr.freezesText, + android.R.attr.shadowColor, + android.R.attr.shadowDx, + android.R.attr.shadowDy, + android.R.attr.shadowRadius, + android.R.attr.enabled, + android.R.attr.textColorHighlight, + android.R.attr.textColor, + android.R.attr.textColorHint, + android.R.attr.textColorLink, + android.R.attr.textSize, + android.R.attr.typeface, + android.R.attr.textStyle, + android.R.attr.password, + android.R.attr.lineSpacingExtra, + android.R.attr.lineSpacingMultiplier, + android.R.attr.inputType, + android.R.attr.imeOptions, + android.R.attr.imeActionLabel, + android.R.attr.imeActionId, + android.R.attr.privateImeOptions, + android.R.attr.textSelectHandleLeft, + android.R.attr.textSelectHandleRight, + android.R.attr.textSelectHandle, + android.R.attr.textIsSelectable, + android.R.attr.textAllCaps + }; - int[] textViewAttrs=(int[]) styleableClass.getDeclaredField("TextView").get(null); - TypedArray a =m_theme.obtainStyledAttributes(null, textViewAttrs, styleId, 0); + // The array must be sorted in ascending order, otherwise obtainStyledAttributes() + // might fail to find some attributes + Arrays.sort(attributes); + TypedArray array = ctx.obtainStyledAttributes(typedValue.data, attributes); + ArrayList sortedAttrs = getArrayListFromIntArray(attributes); - TypedArray appearance = null; - if (-1==textAppearance) - textAppearance = a.getResourceId(styleableClass.getDeclaredField("TextView_textAppearance").getInt(null), -1); + textSize = array.getDimensionPixelSize(sortedAttrs.indexOf(android.R.attr.textSize), textSize); + styleIndex = array.getInt(sortedAttrs.indexOf(android.R.attr.textStyle), styleIndex); + typefaceIndex = array.getInt(sortedAttrs.indexOf(android.R.attr.typeface), typefaceIndex); + textColorHighlight = array.getColor(sortedAttrs.indexOf(android.R.attr.textColorHighlight), textColorHighlight); + allCaps = array.getBoolean(sortedAttrs.indexOf(android.R.attr.textAllCaps), allCaps); - if (textAppearance != -1) - appearance = m_theme.obtainStyledAttributes(textAppearance, (int[]) styleableClass.getDeclaredField("TextAppearance").get(null)); + ColorStateList textColor = array.getColorStateList(sortedAttrs.indexOf(android.R.attr.textColor)); + ColorStateList textColorHint = array.getColorStateList(sortedAttrs.indexOf(android.R.attr.textColorHint)); + ColorStateList textColorLink = array.getColorStateList(sortedAttrs.indexOf(android.R.attr.textColorLink)); - if (appearance != null) - { - int n = appearance.getIndexCount(); - for (int i = 0; i < n; i++) - { - int attr = appearance.getIndex(i); - if (attr == TextAppearance_textColorHighlight) - textColorHighlight = appearance.getColor(attr, textColorHighlight); - else if (attr == TextAppearance_textColor) - textColor = appearance.getColorStateList(attr); - else if (attr == TextAppearance_textColorHint) - textColorHint = appearance.getColorStateList(attr); - else if (attr == TextAppearance_textColorLink) - textColorLink = appearance.getColorStateList(attr); - else if (attr == TextAppearance_textSize) - textSize = appearance.getDimensionPixelSize(attr, textSize); - else if (attr == TextAppearance_typeface) - typefaceIndex = appearance.getInt(attr, -1); - else if (attr == TextAppearance_textStyle) - styleIndex = appearance.getInt(attr, -1); - else if (attr == TextAppearance_textAllCaps) - allCaps = appearance.getBoolean(attr, false); - } - appearance.recycle(); + json.put("TextAppearance_textSize", textSize); + json.put("TextAppearance_textStyle", styleIndex); + json.put("TextAppearance_typeface", typefaceIndex); + json.put("TextAppearance_textColorHighlight", textColorHighlight); + json.put("TextAppearance_textAllCaps", allCaps); + if (textColor != null) + json.put("TextAppearance_textColor", getColorStateList(textColor)); + if (textColorHint != null) + json.put("TextAppearance_textColorHint", getColorStateList(textColorHint)); + if (textColorLink != null) + json.put("TextAppearance_textColorLink", getColorStateList(textColorLink)); + + json.put("TextView_editable", array.getBoolean(sortedAttrs.indexOf(android.R.attr.editable), false)); + json.put("TextView_inputMethod", array.getText(sortedAttrs.indexOf(android.R.attr.inputMethod))); + json.put("TextView_numeric", array.getInt(sortedAttrs.indexOf(android.R.attr.numeric), 0)); + json.put("TextView_digits", array.getText(sortedAttrs.indexOf(android.R.attr.digits))); + json.put("TextView_phoneNumber", array.getBoolean(sortedAttrs.indexOf(android.R.attr.phoneNumber), false)); + json.put("TextView_autoText", array.getBoolean(sortedAttrs.indexOf(android.R.attr.autoText), false)); + json.put("TextView_capitalize", array.getInt(sortedAttrs.indexOf(android.R.attr.capitalize), -1)); + json.put("TextView_bufferType", array.getInt(sortedAttrs.indexOf(android.R.attr.bufferType), 0)); + json.put("TextView_selectAllOnFocus", array.getBoolean(sortedAttrs.indexOf(android.R.attr.selectAllOnFocus), false)); + json.put("TextView_autoLink", array.getInt(sortedAttrs.indexOf(android.R.attr.autoLink), 0)); + json.put("TextView_linksClickable", array.getBoolean(sortedAttrs.indexOf(android.R.attr.linksClickable), true)); + json.put("TextView_drawableLeft", getDrawable(array.getDrawable(sortedAttrs.indexOf(android.R.attr.drawableLeft)), styleName + "_TextView_drawableLeft", null)); + json.put("TextView_drawableTop", getDrawable(array.getDrawable(sortedAttrs.indexOf(android.R.attr.drawableTop)), styleName + "_TextView_drawableTop", null)); + json.put("TextView_drawableRight", getDrawable(array.getDrawable(sortedAttrs.indexOf(android.R.attr.drawableRight)), styleName + "_TextView_drawableRight", null)); + json.put("TextView_drawableBottom", getDrawable(array.getDrawable(sortedAttrs.indexOf(android.R.attr.drawableBottom)), styleName + "_TextView_drawableBottom", null)); + json.put("TextView_drawableStart", getDrawable(array.getDrawable(sortedAttrs.indexOf(android.R.attr.drawableStart)), styleName + "_TextView_drawableStart", null)); + json.put("TextView_drawableEnd", getDrawable(array.getDrawable(sortedAttrs.indexOf(android.R.attr.drawableEnd)), styleName + "_TextView_drawableEnd", null)); + json.put("TextView_maxLines", array.getInt(sortedAttrs.indexOf(android.R.attr.maxLines), -1)); + json.put("TextView_drawablePadding", array.getDimensionPixelSize(sortedAttrs.indexOf(android.R.attr.drawablePadding), 0)); + + try { + json.put("TextView_textCursorDrawable", getDrawable(array.getDrawable(sortedAttrs.indexOf(android.R.attr.textCursorDrawable)), styleName + "_TextView_textCursorDrawable", null)); + } catch (Exception e_) { + json.put("TextView_textCursorDrawable", getDrawable(m_context.getResources().getDrawable(array.getResourceId(sortedAttrs.indexOf(android.R.attr.textCursorDrawable), 0), m_theme), styleName + "_TextView_textCursorDrawable", null)); } - int n = a.getIndexCount(); + json.put("TextView_maxLines", array.getInt(sortedAttrs.indexOf(android.R.attr.maxLines), -1)); + json.put("TextView_maxHeight", array.getDimensionPixelSize(sortedAttrs.indexOf(android.R.attr.maxHeight), -1)); + json.put("TextView_lines", array.getInt(sortedAttrs.indexOf(android.R.attr.lines), -1)); + json.put("TextView_height", array.getDimensionPixelSize(sortedAttrs.indexOf(android.R.attr.height), -1)); + json.put("TextView_minLines", array.getInt(sortedAttrs.indexOf(android.R.attr.minLines), -1)); + json.put("TextView_minHeight", array.getDimensionPixelSize(sortedAttrs.indexOf(android.R.attr.minHeight), -1)); + json.put("TextView_maxEms", array.getInt(sortedAttrs.indexOf(android.R.attr.maxEms), -1)); + json.put("TextView_maxWidth", array.getDimensionPixelSize(sortedAttrs.indexOf(android.R.attr.maxWidth), -1)); + json.put("TextView_ems", array.getInt(sortedAttrs.indexOf(android.R.attr.ems), -1)); + json.put("TextView_width", array.getDimensionPixelSize(sortedAttrs.indexOf(android.R.attr.width), -1)); + json.put("TextView_minEms", array.getInt(sortedAttrs.indexOf(android.R.attr.minEms), -1)); + json.put("TextView_minWidth", array.getDimensionPixelSize(sortedAttrs.indexOf(android.R.attr.minWidth), -1)); + json.put("TextView_gravity", array.getInt(sortedAttrs.indexOf(android.R.attr.gravity), -1)); + json.put("TextView_hint", array.getText(sortedAttrs.indexOf(android.R.attr.hint))); + json.put("TextView_text", array.getText(sortedAttrs.indexOf(android.R.attr.text))); + json.put("TextView_scrollHorizontally", array.getBoolean(sortedAttrs.indexOf(android.R.attr.scrollHorizontally), false)); + json.put("TextView_singleLine", array.getBoolean(sortedAttrs.indexOf(android.R.attr.singleLine), false)); + json.put("TextView_ellipsize", array.getInt(sortedAttrs.indexOf(android.R.attr.ellipsize), -1)); + json.put("TextView_marqueeRepeatLimit", array.getInt(sortedAttrs.indexOf(android.R.attr.marqueeRepeatLimit), 3)); + json.put("TextView_includeFontPadding", array.getBoolean(sortedAttrs.indexOf(android.R.attr.includeFontPadding), true)); + json.put("TextView_cursorVisible", array.getBoolean(sortedAttrs.indexOf(android.R.attr.maxLength), true)); + json.put("TextView_maxLength", array.getInt(sortedAttrs.indexOf(android.R.attr.maxLength), -1)); + json.put("TextView_textScaleX", array.getFloat(sortedAttrs.indexOf(android.R.attr.textScaleX), 1.0f)); + json.put("TextView_freezesText", array.getBoolean(sortedAttrs.indexOf(android.R.attr.freezesText), false)); + json.put("TextView_shadowColor", array.getInt(sortedAttrs.indexOf(android.R.attr.shadowColor), 0)); + json.put("TextView_shadowDx", array.getFloat(sortedAttrs.indexOf(android.R.attr.shadowDx), 0)); + json.put("TextView_shadowDy", array.getFloat(sortedAttrs.indexOf(android.R.attr.shadowDy), 0)); + json.put("TextView_shadowRadius", array.getFloat(sortedAttrs.indexOf(android.R.attr.shadowRadius), 0)); + json.put("TextView_enabled", array.getBoolean(sortedAttrs.indexOf(android.R.attr.enabled), true)); + json.put("TextView_password", array.getBoolean(sortedAttrs.indexOf(android.R.attr.password), false)); + json.put("TextView_lineSpacingExtra", array.getDimensionPixelSize(sortedAttrs.indexOf(android.R.attr.lineSpacingExtra), 0)); + json.put("TextView_lineSpacingMultiplier", array.getFloat(sortedAttrs.indexOf(android.R.attr.lineSpacingMultiplier), 1.0f)); + json.put("TextView_inputType", array.getInt(sortedAttrs.indexOf(android.R.attr.inputType), EditorInfo.TYPE_NULL)); + json.put("TextView_imeOptions", array.getInt(sortedAttrs.indexOf(android.R.attr.imeOptions), EditorInfo.IME_NULL)); + json.put("TextView_imeActionLabel", array.getText(sortedAttrs.indexOf(android.R.attr.imeActionLabel))); + json.put("TextView_imeActionId", array.getInt(sortedAttrs.indexOf(android.R.attr.imeActionId), 0)); + json.put("TextView_privateImeOptions", array.getString(sortedAttrs.indexOf(android.R.attr.privateImeOptions))); - for (int i = 0; i < n; i++) { - int attr = a.getIndex(i); - - if (attr == TextView_editable) - json.put("TextView_editable", a.getBoolean(attr, false)); - else if (attr == TextView_inputMethod) - json.put("TextView_inputMethod", a.getText(attr)); - else if (attr == TextView_numeric) - json.put("TextView_numeric", a.getInt(attr, 0)); - else if (attr == TextView_digits) - json.put("TextView_digits", a.getText(attr)); - else if (attr == TextView_phoneNumber) - json.put("TextView_phoneNumber", a.getBoolean(attr, false)); - else if (attr == TextView_autoText) - json.put("TextView_autoText", a.getBoolean(attr, false)); - else if (attr == TextView_capitalize) - json.put("TextView_capitalize", a.getInt(attr, -1)); - else if (attr == TextView_bufferType) - json.put("TextView_bufferType", a.getInt(attr, 0)); - else if (attr == TextView_selectAllOnFocus) - json.put("TextView_selectAllOnFocus", a.getBoolean(attr, false)); - else if (attr == TextView_autoLink) - json.put("TextView_autoLink", a.getInt(attr, 0)); - else if (attr == TextView_linksClickable) - json.put("TextView_linksClickable", a.getBoolean(attr, true)); - else if (attr == TextView_linksClickable) - json.put("TextView_linksClickable", a.getBoolean(attr, true)); - else if (attr == TextView_drawableLeft) - json.put("TextView_drawableLeft", getDrawable(a.getDrawable(attr), styleName + "_TextView_drawableLeft", null)); - else if (attr == TextView_drawableTop) - json.put("TextView_drawableTop", getDrawable(a.getDrawable(attr), styleName + "_TextView_drawableTop", null)); - else if (attr == TextView_drawableRight) - json.put("TextView_drawableRight", getDrawable(a.getDrawable(attr), styleName + "_TextView_drawableRight", null)); - else if (attr == TextView_drawableBottom) - json.put("TextView_drawableBottom", getDrawable(a.getDrawable(attr), styleName + "_TextView_drawableBottom", null)); - else if (attr == TextView_drawableStart) - json.put("TextView_drawableStart", getDrawable(a.getDrawable(attr), styleName + "_TextView_drawableStart", null)); - else if (attr == TextView_drawableEnd) - json.put("TextView_drawableEnd", getDrawable(a.getDrawable(attr), styleName + "_TextView_drawableEnd", null)); - else if (attr == TextView_drawablePadding) - json.put("TextView_drawablePadding", a.getDimensionPixelSize(attr, 0)); - else if (attr == TextView_textCursorDrawable) { - try { - json.put("TextView_textCursorDrawable", getDrawable(a.getDrawable(attr), styleName + "_TextView_textCursorDrawable", null)); - } catch (Exception e_) { - try { - json.put("TextView_textCursorDrawable", getDrawable(m_context.getResources().getDrawable(a.getResourceId(attr, 0)), styleName + "_TextView_textCursorDrawable", null)); - } catch (Exception e) { - e.printStackTrace(); - } - } - }else if (attr == TextView_maxLines) - json.put("TextView_maxLines", a.getInt(attr, -1)); - else if (attr == TextView_maxHeight) - json.put("TextView_maxHeight", a.getDimensionPixelSize(attr, -1)); - else if (attr == TextView_lines) - json.put("TextView_lines", a.getInt(attr, -1)); - else if (attr == TextView_height) - json.put("TextView_height", a.getDimensionPixelSize(attr, -1)); - else if (attr == TextView_minLines) - json.put("TextView_minLines", a.getInt(attr, -1)); - else if (attr == TextView_minHeight) - json.put("TextView_minHeight", a.getDimensionPixelSize(attr, -1)); - else if (attr == TextView_maxEms) - json.put("TextView_maxEms", a.getInt(attr, -1)); - else if (attr == TextView_maxWidth) - json.put("TextView_maxWidth", a.getDimensionPixelSize(attr, -1)); - else if (attr == TextView_ems) - json.put("TextView_ems", a.getInt(attr, -1)); - else if (attr == TextView_width) - json.put("TextView_width", a.getDimensionPixelSize(attr, -1)); - else if (attr == TextView_minEms) - json.put("TextView_minEms", a.getInt(attr, -1)); - else if (attr == TextView_minWidth) - json.put("TextView_minWidth", a.getDimensionPixelSize(attr, -1)); - else if (attr == TextView_gravity) - json.put("TextView_gravity", a.getInt(attr, -1)); - else if (attr == TextView_hint) - json.put("TextView_hint", a.getText(attr)); - else if (attr == TextView_text) - json.put("TextView_text", a.getText(attr)); - else if (attr == TextView_scrollHorizontally) - json.put("TextView_scrollHorizontally", a.getBoolean(attr, false)); - else if (attr == TextView_singleLine) - json.put("TextView_singleLine", a.getBoolean(attr, false)); - else if (attr == TextView_ellipsize) - json.put("TextView_ellipsize", a.getInt(attr, -1)); - else if (attr == TextView_marqueeRepeatLimit) - json.put("TextView_marqueeRepeatLimit", a.getInt(attr, 3)); - else if (attr == TextView_includeFontPadding) - json.put("TextView_includeFontPadding", a.getBoolean(attr, true)); - else if (attr == TextView_cursorVisible) - json.put("TextView_cursorVisible", a.getBoolean(attr, true)); - else if (attr == TextView_maxLength) - json.put("TextView_maxLength", a.getInt(attr, -1)); - else if (attr == TextView_textScaleX) - json.put("TextView_textScaleX", a.getFloat(attr, 1.0f)); - else if (attr == TextView_freezesText) - json.put("TextView_freezesText", a.getBoolean(attr, false)); - else if (attr == TextView_shadowColor) - json.put("TextView_shadowColor", a.getInt(attr, 0)); - else if (attr == TextView_shadowDx) - json.put("TextView_shadowDx", a.getFloat(attr, 0)); - else if (attr == TextView_shadowDy) - json.put("TextView_shadowDy", a.getFloat(attr, 0)); - else if (attr == TextView_shadowRadius) - json.put("TextView_shadowRadius", a.getFloat(attr, 0)); - else if (attr == TextView_enabled) - json.put("TextView_enabled", a.getBoolean(attr,true)); - else if (attr == TextView_textColorHighlight) - textColorHighlight = a.getColor(attr, textColorHighlight); - else if (attr == TextView_textColor) - textColor = a.getColorStateList(attr); - else if (attr == TextView_textColorHint) - textColorHint = a.getColorStateList(attr); - else if (attr == TextView_textColorLink) - textColorLink = a.getColorStateList(attr); - else if (attr == TextView_textSize) - textSize = a.getDimensionPixelSize(attr, textSize); - else if (attr == TextView_typeface) - typefaceIndex = a.getInt(attr, typefaceIndex); - else if (attr == TextView_textStyle) - styleIndex = a.getInt(attr, styleIndex); - else if (attr == TextView_password) - json.put("TextView_password", a.getBoolean(attr,false)); - else if (attr == TextView_lineSpacingExtra) - json.put("TextView_lineSpacingExtra", a.getDimensionPixelSize(attr, 0)); - else if (attr == TextView_lineSpacingMultiplier) - json.put("TextView_lineSpacingMultiplier", a.getFloat(attr, 1.0f)); - else if (attr == TextView_inputType) - json.put("TextView_inputType", a.getInt(attr, EditorInfo.TYPE_NULL)); - else if (attr == TextView_imeOptions) - json.put("TextView_imeOptions", a.getInt(attr, EditorInfo.IME_NULL)); - else if (attr == TextView_imeActionLabel) - json.put("TextView_imeActionLabel", a.getText(attr)); - else if (attr == TextView_imeActionId) - json.put("TextView_imeActionId", a.getInt(attr,0)); - else if (attr == TextView_privateImeOptions) - json.put("TextView_privateImeOptions", a.getString(attr)); - else if (attr == TextView_textSelectHandleLeft && styleName.equals("textViewStyle")) { - try { - json.put("TextView_textSelectHandleLeft", getDrawable(a.getDrawable(attr), styleName + "_TextView_textSelectHandleLeft", null)); - } catch (Exception _e) { - try { - json.put("TextView_textSelectHandleLeft", getDrawable(m_context.getResources().getDrawable(a.getResourceId(attr, 0)), styleName + "_TextView_textSelectHandleLeft", null)); - } catch (Exception e) { - e.printStackTrace(); - } - } - } else if (attr == TextView_textSelectHandleRight && styleName.equals("textViewStyle")) { - try { - json.put("TextView_textSelectHandleRight", getDrawable(a.getDrawable(attr), styleName + "_TextView_textSelectHandleRight", null)); - } catch (Exception _e) { - try { - json.put("TextView_textSelectHandleRight", getDrawable(m_context.getResources().getDrawable(a.getResourceId(attr, 0)), styleName + "_TextView_textSelectHandleRight", null)); - } catch (Exception e) { - e.printStackTrace(); - } - } - } else if (attr == TextView_textSelectHandle && styleName.equals("textViewStyle")) { - try { - json.put("TextView_textSelectHandle", getDrawable(a.getDrawable(attr), styleName + "_TextView_textSelectHandle", null)); - } catch (Exception _e) { - try { - json.put("TextView_textSelectHandle", getDrawable(m_context.getResources().getDrawable(a.getResourceId(attr, 0)), styleName + "_TextView_textSelectHandle", null)); - } catch (Exception e) { - e.printStackTrace(); - } - } - } else if (attr == TextView_textIsSelectable) - json.put("TextView_textIsSelectable", a.getBoolean(attr, false)); - else if (attr == TextView_textAllCaps) - allCaps = a.getBoolean(attr, false); + try { + json.put("TextView_textSelectHandleLeft", getDrawable(array.getDrawable(sortedAttrs.indexOf(android.R.attr.textSelectHandleLeft)), styleName + "_TextView_textSelectHandleLeft", null)); + } catch (Exception _e) { + json.put("TextView_textSelectHandleLeft", getDrawable(m_context.getResources().getDrawable(array.getResourceId(sortedAttrs.indexOf(android.R.attr.textSelectHandleLeft), 0), m_theme), styleName + "_TextView_textSelectHandleLeft", null)); } - a.recycle(); - json.put("TextAppearance_textColorHighlight",textColorHighlight); - json.put("TextAppearance_textColor", getColorStateList(textColor)); - json.put("TextAppearance_textColorHint", getColorStateList(textColorHint)); - json.put("TextAppearance_textColorLink", getColorStateList(textColorLink)); - json.put("TextAppearance_textSize",textSize); - json.put("TextAppearance_typeface",typefaceIndex); - json.put("TextAppearance_textStyle",styleIndex); - json.put("TextAppearance_textAllCaps",allCaps); - } - catch(Exception e) - { + try { + json.put("TextView_textSelectHandleRight", getDrawable(array.getDrawable(sortedAttrs.indexOf(android.R.attr.textSelectHandleRight)), styleName + "_TextView_textSelectHandleRight", null)); + } catch (Exception _e) { + json.put("TextView_textSelectHandleRight", getDrawable(m_context.getResources().getDrawable(array.getResourceId(sortedAttrs.indexOf(android.R.attr.textSelectHandleRight), 0), m_theme), styleName + "_TextView_textSelectHandleRight", null)); + } + + try { + json.put("TextView_textSelectHandle", getDrawable(array.getDrawable(sortedAttrs.indexOf(android.R.attr.textSelectHandle)), styleName + "_TextView_textSelectHandle", null)); + } catch (Exception _e) { + json.put("TextView_textSelectHandle", getDrawable(m_context.getResources().getDrawable(array.getResourceId(sortedAttrs.indexOf(android.R.attr.textSelectHandle), 0), m_theme), styleName + "_TextView_textSelectHandle", null)); + } + json.put("TextView_textIsSelectable", array.getBoolean(sortedAttrs.indexOf(android.R.attr.textIsSelectable), false)); + array.recycle(); + } catch (Exception e) { e.printStackTrace(); } return json; } - final String[] sScaleTypeArray = { - "MATRIX", - "FIT_XY", - "FIT_START", - "FIT_CENTER", - "FIT_END", - "CENTER", - "CENTER_CROP", - "CENTER_INSIDE" - }; - - public JSONObject extractImageViewInformations(String styleName, String qtClassName ) - { + public JSONObject extractImageViewInformation(int styleName, String qtClassName) { JSONObject json = new JSONObject(); - try - { - Class attrClass= Class.forName("android.R$attr"); - int styleId = attrClass.getDeclaredField(styleName).getInt(null); + try { + extractViewInformation(styleName, json, qtClassName); - extractViewInformations(styleName, styleId, json, qtClassName, null); + int[] attributes = new int[]{ + android.R.attr.src, + android.R.attr.baselineAlignBottom, + android.R.attr.adjustViewBounds, + android.R.attr.maxWidth, + android.R.attr.maxHeight, + android.R.attr.scaleType, + android.R.attr.cropToPadding, + android.R.attr.tint - int[] imageViewAttrs=(int[]) styleableClass.getDeclaredField("ImageView").get(null); - TypedArray a =m_theme.obtainStyledAttributes(null, imageViewAttrs, styleId, 0); - Drawable d = a.getDrawable(ImageView_src); - if (d != null) - json.put("ImageView_src", getDrawable(d, styleName + "_ImageView_src", null)); + }; + Arrays.sort(attributes); + TypedArray array = obtainStyledAttributes(styleName, attributes); + ArrayList sortedAttrs = getArrayListFromIntArray(attributes); - json.put("ImageView_baselineAlignBottom", a.getBoolean(ImageView_baselineAlignBottom, false)); - json.put("ImageView_adjustViewBounds", a.getBoolean(ImageView_adjustViewBounds, false)); - json.put("ImageView_maxWidth", a.getDimensionPixelSize(ImageView_maxWidth, Integer.MAX_VALUE)); - json.put("ImageView_maxHeight", a.getDimensionPixelSize(ImageView_maxHeight, Integer.MAX_VALUE)); - int index = a.getInt(ImageView_scaleType, -1); + Drawable drawable = array.getDrawable(sortedAttrs.indexOf(android.R.attr.src)); + if (drawable != null) + json.put("ImageView_src", getDrawable(drawable, styleName + "_ImageView_src", null)); + + json.put("ImageView_baselineAlignBottom", array.getBoolean(sortedAttrs.indexOf(android.R.attr.baselineAlignBottom), false)); + json.put("ImageView_adjustViewBounds", array.getBoolean(sortedAttrs.indexOf(android.R.attr.baselineAlignBottom), false)); + json.put("ImageView_maxWidth", array.getDimensionPixelSize(sortedAttrs.indexOf(android.R.attr.maxWidth), Integer.MAX_VALUE)); + json.put("ImageView_maxHeight", array.getDimensionPixelSize(sortedAttrs.indexOf(android.R.attr.maxHeight), Integer.MAX_VALUE)); + int index = array.getInt(sortedAttrs.indexOf(android.R.attr.scaleType), -1); if (index >= 0) json.put("ImageView_scaleType", sScaleTypeArray[index]); - int tint = a.getInt(ImageView_tint, 0); + int tint = array.getInt(sortedAttrs.indexOf(android.R.attr.tint), 0); if (tint != 0) json.put("ImageView_tint", tint); - - json.put("ImageView_cropToPadding",a.getBoolean(ImageView_cropToPadding, false)); - a.recycle(); - } - catch(Exception e) - { + json.put("ImageView_cropToPadding", array.getBoolean(sortedAttrs.indexOf(android.R.attr.cropToPadding), false)); + array.recycle(); + } catch (Exception e) { e.printStackTrace(); } return json; - } - void extractCompoundButton(SimpleJsonWriter jsonWriter, String styleName, String qtClass) - { - JSONObject json = extractTextAppearanceInformations(styleName, qtClass, null, -1); - Class attrClass; + void extractCompoundButton(SimpleJsonWriter jsonWriter, int styleName, String className, String qtClass) { + JSONObject json = extractTextAppearanceInformation(styleName, qtClass); + + TypedValue typedValue = new TypedValue(); + Context ctx = new ContextThemeWrapper(m_context, m_theme); + ctx.getTheme().resolveAttribute(styleName, typedValue, true); + final int[] attributes = new int[]{android.R.attr.button}; + TypedArray array = ctx.obtainStyledAttributes(typedValue.data, attributes); + Drawable drawable = array.getDrawable(0); + array.recycle(); + try { - attrClass = Class.forName("android.R$attr"); - int styleId = attrClass.getDeclaredField(styleName).getInt(null); - int[] compoundButtonAttrs=(int[]) styleableClass.getDeclaredField("CompoundButton").get(null); - - TypedArray a = m_theme.obtainStyledAttributes( - null, compoundButtonAttrs, styleId, 0); - - Drawable d = a.getDrawable(getField(styleableClass,"CompoundButton_button")); - if (d != null) - json.put("CompoundButton_button", getDrawable(d, styleName + "_CompoundButton_button", null)); - - a.recycle(); - jsonWriter.name(styleName).value(json); + if (drawable != null) + json.put("CompoundButton_button", getDrawable(drawable, styleName + "_CompoundButton_button", null)); + jsonWriter.name(className).value(json); } catch (Exception e) { e.printStackTrace(); } } - void extractProgressBarInfo(JSONObject json, String styleName) - { - Class attrClass; + void extractProgressBarInfo(JSONObject json, int styleName) { try { - attrClass = Class.forName("android.R$attr"); - int styleId = attrClass.getDeclaredField(styleName).getInt(null); - int[] progressBarAttrs=(int[]) styleableClass.getDeclaredField("ProgressBar").get(null); + final int[] attributes = new int[]{ + android.R.attr.minWidth, + android.R.attr.maxWidth, + android.R.attr.minHeight, + android.R.attr.maxHeight, + android.R.attr.indeterminateDuration, + android.R.attr.progressDrawable, + android.R.attr.indeterminateDrawable + }; - TypedArray a = m_theme.obtainStyledAttributes(null, progressBarAttrs, styleId, 0); - int mMinWidth = 24; - int mMaxWidth = 48; - int mMinHeight = 24; - int mMaxHeight = 48; - mMinWidth = a.getDimensionPixelSize(getField(styleableClass, "ProgressBar_minWidth"), mMinWidth); - mMaxWidth = a.getDimensionPixelSize(getField(styleableClass, "ProgressBar_maxWidth"), mMaxWidth); - mMinHeight = a.getDimensionPixelSize(getField(styleableClass, "ProgressBar_minHeight"), mMinHeight); - mMaxHeight = a.getDimensionPixelSize(getField(styleableClass, "ProgressBar_maxHeight"), mMaxHeight); + // The array must be sorted in ascending order, otherwise obtainStyledAttributes() + // might fail to find some attributes + Arrays.sort(attributes); + TypedArray array = obtainStyledAttributes(styleName, attributes); + ArrayList sortedAttrs = getArrayListFromIntArray(attributes); - json.put("ProgressBar_indeterminateDuration", a.getInt(getField(styleableClass, "ProgressBar_indeterminateDuration"), 4000)); - json.put("ProgressBar_minWidth", mMinWidth); - json.put("ProgressBar_maxWidth", mMaxWidth); - json.put("ProgressBar_minHeight", mMinHeight); - json.put("ProgressBar_maxHeight", mMaxHeight); + json.put("ProgressBar_indeterminateDuration", array.getInt(sortedAttrs.indexOf(android.R.attr.indeterminateDuration), 4000)); + json.put("ProgressBar_minWidth", array.getDimensionPixelSize(sortedAttrs.indexOf(android.R.attr.minWidth), 24)); + json.put("ProgressBar_maxWidth", array.getDimensionPixelSize(sortedAttrs.indexOf(android.R.attr.maxWidth), 48)); + json.put("ProgressBar_minHeight", array.getDimensionPixelSize(sortedAttrs.indexOf(android.R.attr.minHeight), 24)); + json.put("ProgressBar_maxHeight", array.getDimensionPixelSize(sortedAttrs.indexOf(android.R.attr.maxHeight), 28)); json.put("ProgressBar_progress_id", android.R.id.progress); json.put("ProgressBar_secondaryProgress_id", android.R.id.secondaryProgress); - Drawable d = a.getDrawable(getField(styleableClass,"ProgressBar_progressDrawable")); - if (d != null) - json.put("ProgressBar_progressDrawable", getDrawable(d, styleName + "_ProgressBar_progressDrawable", null)); + Drawable drawable = array.getDrawable(sortedAttrs.indexOf(android.R.attr.progressDrawable)); + if (drawable != null) + json.put("ProgressBar_progressDrawable", getDrawable(drawable, + styleName + "_ProgressBar_progressDrawable", null)); - d = a.getDrawable(getField(styleableClass,"ProgressBar_indeterminateDrawable")); - if (d != null) - json.put("ProgressBar_indeterminateDrawable", getDrawable(d, styleName + "_ProgressBar_indeterminateDrawable", null)); + drawable = array.getDrawable(sortedAttrs.indexOf(android.R.attr.indeterminateDrawable)); + if (drawable != null) + json.put("ProgressBar_indeterminateDrawable", getDrawable(drawable, + styleName + "_ProgressBar_indeterminateDrawable", null)); - a.recycle(); + array.recycle(); } catch (Exception e) { e.printStackTrace(); } } - void extractProgressBar(SimpleJsonWriter writer, String styleName, String qtClass) - { - JSONObject json = extractTextAppearanceInformations(styleName, qtClass, null, -1); + void extractProgressBar(SimpleJsonWriter writer, int styleName, String className, String qtClass) { + JSONObject json = extractTextAppearanceInformation(android.R.attr.progressBarStyle, qtClass); try { extractProgressBarInfo(json, styleName); - writer.name(styleName).value(json); + writer.name(className).value(json); } catch (Exception e) { e.printStackTrace(); } } - void extractAbsSeekBar(SimpleJsonWriter jsonWriter, String styleName, String qtClass) - { - JSONObject json = extractTextAppearanceInformations(styleName, qtClass, null, -1); - extractProgressBarInfo(json, styleName); - Class attrClass; + void extractAbsSeekBar(SimpleJsonWriter jsonWriter) { + JSONObject json = extractTextAppearanceInformation(android.R.attr.seekBarStyle, "QSlider"); + extractProgressBarInfo(json, android.R.attr.seekBarStyle); try { - attrClass = Class.forName("android.R$attr"); - int styleId = attrClass.getDeclaredField(styleName).getInt(null); - int[] compoundButtonAttrs=(int[]) styleableClass.getDeclaredField("SeekBar").get(null); + int[] attributes = new int[]{ + android.R.attr.thumb, + android.R.attr.thumbOffset + }; + Arrays.sort(attributes); + TypedArray array = obtainStyledAttributes(android.R.attr.seekBarStyle, attributes); + ArrayList sortedAttrs = getArrayListFromIntArray(attributes); - TypedArray a = m_theme.obtainStyledAttributes( - null, compoundButtonAttrs, styleId, 0); - - Drawable d = a.getDrawable(getField(styleableClass,"SeekBar_thumb")); + Drawable d = array.getDrawable(sortedAttrs.indexOf(android.R.attr.thumb)); if (d != null) - json.put("SeekBar_thumb", getDrawable(d, styleName + "_SeekBar_thumb", null)); - - try { - json.put("SeekBar_thumbOffset", styleableClass.getDeclaredField("SeekBar_thumbOffset").getInt(null)); - } catch (Exception e) { - e.printStackTrace(); - } - - a.recycle(); - jsonWriter.name(styleName).value(json); + json.put("SeekBar_thumb", getDrawable(d, android.R.attr.seekBarStyle + "_SeekBar_thumb", null)); + json.put("SeekBar_thumbOffset", array.getDimensionPixelOffset(sortedAttrs.indexOf(android.R.attr.thumbOffset), -1)); + array.recycle(); + jsonWriter.name("seekBarStyle").value(json); } catch (Exception e) { e.printStackTrace(); } } - void extractSwitch(SimpleJsonWriter jsonWriter, String styleName, String qtClass) - { + void extractSwitch(SimpleJsonWriter jsonWriter) { JSONObject json = new JSONObject(); try { - Class attrClass = Class.forName("com.android.internal.R$attr"); - int styleId = attrClass.getDeclaredField(styleName).getInt(null); + int[] attributes = new int[]{ + android.R.attr.thumb, + android.R.attr.track, + android.R.attr.switchTextAppearance, + android.R.attr.textOn, + android.R.attr.textOff, + android.R.attr.switchMinWidth, + android.R.attr.switchPadding, + android.R.attr.thumbTextPadding, + android.R.attr.showText, + android.R.attr.splitTrack + }; + Arrays.sort(attributes); + TypedArray array = obtainStyledAttributes(android.R.attr.switchStyle, attributes); + ArrayList sortedAttrs = getArrayListFromIntArray(attributes); - int[] switchAttrs = (int[]) styleableClass.getDeclaredField("Switch").get(null); - TypedArray a = m_theme.obtainStyledAttributes(null, switchAttrs, styleId, 0); - - Drawable thumb = a.getDrawable(getField(styleableClass,"Switch_thumb")); + Drawable thumb = array.getDrawable(sortedAttrs.indexOf(android.R.attr.thumb)); if (thumb != null) - json.put("Switch_thumb", getDrawable(thumb, styleName + "_Switch_thumb", null)); + json.put("Switch_thumb", getDrawable(thumb, android.R.attr.switchStyle + "_Switch_thumb", null)); - Drawable track = a.getDrawable(getField(styleableClass,"Switch_track")); + Drawable track = array.getDrawable(sortedAttrs.indexOf(android.R.attr.track)); if (track != null) - json.put("Switch_track", getDrawable(track, styleName + "_Switch_track", null)); + json.put("Switch_track", getDrawable(track, android.R.attr.switchStyle + "_Switch_track", null)); - int textAppearance = a.getResourceId(styleableClass.getDeclaredField("Switch_switchTextAppearance").getInt(null), -1); - json.put("Switch_switchTextAppearance", extractTextAppearance(textAppearance)); + json.put("Switch_textOn", array.getText(sortedAttrs.indexOf(android.R.attr.textOn))); + json.put("Switch_textOff", array.getText(sortedAttrs.indexOf(android.R.attr.textOff))); + json.put("Switch_switchMinWidth", array.getDimensionPixelSize(sortedAttrs.indexOf(android.R.attr.switchMinWidth), 0)); + json.put("Switch_switchPadding", array.getDimensionPixelSize(sortedAttrs.indexOf(android.R.attr.switchPadding), 0)); + json.put("Switch_thumbTextPadding", array.getDimensionPixelSize(sortedAttrs.indexOf(android.R.attr.thumbTextPadding), 0)); + json.put("Switch_showText", array.getBoolean(sortedAttrs.indexOf(android.R.attr.showText), true)); + json.put("Switch_splitTrack", array.getBoolean(sortedAttrs.indexOf(android.R.attr.splitTrack), false)); - json.put("Switch_textOn", a.getText(getField(styleableClass, "Switch_textOn"))); - json.put("Switch_textOff", a.getText(getField(styleableClass, "Switch_textOff"))); - json.put("Switch_switchMinWidth", a.getDimensionPixelSize(getField(styleableClass, "Switch_switchMinWidth"), 0)); - json.put("Switch_switchPadding", a.getDimensionPixelSize(getField(styleableClass, "Switch_switchPadding"), 0)); - json.put("Switch_thumbTextPadding", a.getDimensionPixelSize(getField(styleableClass, "Switch_thumbTextPadding"), 0)); + // Get textAppearance values + final int textAppearanceId = array.getResourceId(sortedAttrs.indexOf(android.R.attr.switchTextAppearance), -1); + json.put("Switch_switchTextAppearance", extractTextAppearance(textAppearanceId, true)); - json.put("Switch_showText", a.getBoolean(getField(styleableClass, "Switch_showText"), true)); - json.put("Switch_splitTrack", a.getBoolean(getField(styleableClass, "Switch_splitTrack"), false)); - - a.recycle(); - jsonWriter.name(styleName).value(json); + array.recycle(); + jsonWriter.name("switchStyle").value(json); } catch (Exception e) { e.printStackTrace(); } } - JSONObject extractCheckedTextView(AttributeSet attribSet, String itemName) - { - JSONObject json = extractTextAppearanceInformations("textViewStyle", itemName, attribSet, -1); + JSONObject extractCheckedTextView(String itemName) { + JSONObject json = extractTextAppearanceInformation(android.R.attr.checkedTextViewStyle, itemName); try { - Class attrClass= Class.forName("android.R$attr"); - int styleId = attrClass.getDeclaredField("textViewStyle").getInt(null); - int[] compoundButtonAttrs=(int[]) styleableClass.getDeclaredField("CheckedTextView").get(null); + int[] attributes = new int[]{ + android.R.attr.checkMark, + }; - TypedArray a = m_theme.obtainStyledAttributes(attribSet, compoundButtonAttrs, styleId, 0); + Arrays.sort(attributes); + TypedArray array = obtainStyledAttributes(android.R.attr.switchStyle, attributes); + ArrayList sortedAttrs = getArrayListFromIntArray(attributes); - Drawable d = a.getDrawable(getField(styleableClass,"CheckedTextView_checkMark")); - if (d != null) - json.put("CheckedTextView_checkMark", getDrawable(d, itemName+"_CheckedTextView_checkMark", null)); - - a.recycle(); + Drawable drawable = array.getDrawable(sortedAttrs.indexOf(android.R.attr.checkMark)); + if (drawable != null) + json.put("CheckedTextView_checkMark", getDrawable(drawable, itemName + "_CheckedTextView_checkMark", null)); + array.recycle(); } catch (Exception e) { e.printStackTrace(); } return json; } - private JSONObject extractItemStyle(int resourceId, String itemName, int textAppearance) { - try - { + private JSONObject extractItemStyle(int resourceId, String itemName) + { + try { XmlResourceParser parser = m_context.getResources().getLayout(resourceId); - int type; - while ((type = parser.next()) != XmlPullParser.START_TAG && - type != XmlPullParser.END_DOCUMENT) { - // Empty - } + int type = parser.next(); + while (type != XmlPullParser.START_TAG && type != XmlPullParser.END_DOCUMENT) + type = parser.next(); - if (type != XmlPullParser.START_TAG) { + if (type != XmlPullParser.START_TAG) return null; - } AttributeSet attributes = Xml.asAttributeSet(parser); String name = parser.getName(); if (name.equals("TextView")) - return extractTextAppearanceInformations("textViewStyle", itemName, attributes, textAppearance); - if (name.equals("CheckedTextView")) - return extractCheckedTextView(attributes, itemName); + return extractTextAppearanceInformation(android.R.attr.textViewStyle, itemName, android.R.attr.textAppearanceListItem, attributes); + else if (name.equals("CheckedTextView")) + return extractCheckedTextView(itemName); } catch (Exception e) { e.printStackTrace(); } @@ -1796,243 +1573,258 @@ public class ExtractStyle { } private void extractItemsStyle(SimpleJsonWriter jsonWriter) { - try - { - jsonWriter.name("simple_list_item").value(extractItemStyle(android.R.layout.simple_list_item_1, "simple_list_item", android.R.style.TextAppearance_Large)); - jsonWriter.name("simple_list_item_checked").value(extractItemStyle(android.R.layout.simple_list_item_checked, "simple_list_item_checked", android.R.style.TextAppearance_Large)); - jsonWriter.name("simple_list_item_multiple_choice").value(extractItemStyle(android.R.layout.simple_list_item_multiple_choice, "simple_list_item_multiple_choice", android.R.style.TextAppearance_Large)); - jsonWriter.name("simple_list_item_single_choice").value(extractItemStyle(android.R.layout.simple_list_item_single_choice, "simple_list_item_single_choice", android.R.style.TextAppearance_Large)); - jsonWriter.name("simple_spinner_item").value(extractItemStyle(android.R.layout.simple_spinner_item, "simple_spinner_item", -1)); - jsonWriter.name("simple_spinner_dropdown_item").value(extractItemStyle(android.R.layout.simple_spinner_dropdown_item, "simple_spinner_dropdown_item",android.R.style.TextAppearance_Large)); - jsonWriter.name("simple_dropdown_item_1line").value(extractItemStyle(android.R.layout.simple_dropdown_item_1line, "simple_dropdown_item_1line",android.R.style.TextAppearance_Large)); - jsonWriter.name("simple_selectable_list_item").value(extractItemStyle(android.R.layout.simple_selectable_list_item, "simple_selectable_list_item",android.R.style.TextAppearance_Large)); + try { + JSONObject itemStyle = extractItemStyle(android.R.layout.simple_list_item_1, "simple_list_item"); + if (itemStyle != null) + jsonWriter.name("simple_list_item").value(itemStyle); + itemStyle = extractItemStyle(android.R.layout.simple_list_item_checked, "simple_list_item_checked"); + if (itemStyle != null) + jsonWriter.name("simple_list_item_checked").value(itemStyle); + itemStyle = extractItemStyle(android.R.layout.simple_list_item_multiple_choice, "simple_list_item_multiple_choice"); + if (itemStyle != null) + jsonWriter.name("simple_list_item_multiple_choice").value(itemStyle); + itemStyle = extractItemStyle(android.R.layout.simple_list_item_single_choice, "simple_list_item_single_choice"); + if (itemStyle != null) + jsonWriter.name("simple_list_item_single_choice").value(itemStyle); + itemStyle = extractItemStyle(android.R.layout.simple_spinner_item, "simple_spinner_item"); + if (itemStyle != null) + jsonWriter.name("simple_spinner_item").value(itemStyle); + itemStyle = extractItemStyle(android.R.layout.simple_spinner_dropdown_item, "simple_spinner_dropdown_item"); + if (itemStyle != null) + jsonWriter.name("simple_spinner_dropdown_item").value(itemStyle); + itemStyle = extractItemStyle(android.R.layout.simple_dropdown_item_1line, "simple_dropdown_item_1line"); + if (itemStyle != null) + jsonWriter.name("simple_dropdown_item_1line").value(itemStyle); + itemStyle = extractItemStyle(android.R.layout.simple_selectable_list_item, "simple_selectable_list_item"); + if (itemStyle != null) + jsonWriter.name("simple_selectable_list_item").value(itemStyle); } catch (Exception e) { e.printStackTrace(); } } - void extractListView(SimpleJsonWriter writer, String styleName, String qtClass) - { - JSONObject json = extractTextAppearanceInformations(styleName, qtClass, null, -1); + void extractListView(SimpleJsonWriter writer) { + JSONObject json = extractTextAppearanceInformation(android.R.attr.listViewStyle, "QListView"); try { - Class attrClass = Class.forName("android.R$attr"); - int styleId = attrClass.getDeclaredField(styleName).getInt(null); + int[] attributes = new int[]{ + android.R.attr.divider, + android.R.attr.dividerHeight + }; + Arrays.sort(attributes); + TypedArray array = obtainStyledAttributes(android.R.attr.listViewStyle, attributes); + ArrayList sortedAttrs = getArrayListFromIntArray(attributes); - int[] styleAttrs = (int[]) styleableClass.getDeclaredField("ListView").get(null); - TypedArray a = m_theme.obtainStyledAttributes(null, styleAttrs, styleId, 0); - - Drawable divider = a.getDrawable(getField(styleableClass,"ListView_divider")); + Drawable divider = array.getDrawable(sortedAttrs.indexOf(android.R.attr.divider)); if (divider != null) - json.put("ListView_divider", getDrawable(divider, styleName + "_ListView_divider", null)); + json.put("ListView_divider", getDrawable(divider, android.R.attr.listViewStyle + "_ListView_divider", null)); - json.put("ListView_dividerHeight", a.getDimensionPixelSize(getField(styleableClass, "ListView_dividerHeight"), 0)); + json.put("ListView_dividerHeight", array.getDimensionPixelSize(sortedAttrs.indexOf(android.R.attr.dividerHeight), 0)); - a.recycle(); - writer.name(styleName).value(json); + array.recycle(); + writer.name("listViewStyle").value(json); } catch (Exception e) { e.printStackTrace(); } } - void extractCalendar(SimpleJsonWriter writer, String styleName, String qtClass) - { - JSONObject json = extractTextAppearanceInformations(styleName, qtClass, null, -1); + void extractCalendar(SimpleJsonWriter writer) { + JSONObject json = extractTextAppearanceInformation(android.R.attr.calendarViewStyle, "QCalendarWidget"); try { - Class attrClass = Class.forName("android.R$attr"); - int styleId = attrClass.getDeclaredField(styleName).getInt(null); + int[] attributes = new int[]{ + android.R.attr.firstDayOfWeek, + android.R.attr.focusedMonthDateColor, + android.R.attr.selectedWeekBackgroundColor, + android.R.attr.showWeekNumber, + android.R.attr.shownWeekCount, + android.R.attr.unfocusedMonthDateColor, + android.R.attr.weekNumberColor, + android.R.attr.weekSeparatorLineColor, + android.R.attr.selectedDateVerticalBar, + android.R.attr.dateTextAppearance, + android.R.attr.weekDayTextAppearance + }; + Arrays.sort(attributes); + TypedArray array = obtainStyledAttributes(android.R.attr.calendarViewStyle, attributes); + ArrayList sortedAttrs = getArrayListFromIntArray(attributes); - int[] styleAttrs = (int[]) styleableClass.getDeclaredField("CalendarView").get(null); - TypedArray a = m_theme.obtainStyledAttributes(null, styleAttrs, styleId, 0); - - Drawable d = a.getDrawable(getField(styleableClass,"CalendarView_selectedDateVerticalBar")); + Drawable d = array.getDrawable(sortedAttrs.indexOf(android.R.attr.selectedDateVerticalBar)); if (d != null) - json.put("CalendarView_selectedDateVerticalBar", getDrawable(d, styleName + "_CalendarView_selectedDateVerticalBar", null)); + json.put("CalendarView_selectedDateVerticalBar", getDrawable(d, android.R.attr.calendarViewStyle + "_CalendarView_selectedDateVerticalBar", null)); - int dateTextAppearance = a.getResourceId(styleableClass.getDeclaredField("CalendarView_dateTextAppearance").getInt(null), -1); - json.put("CalendarView_dateTextAppearance", extractTextAppearance(dateTextAppearance)); + int textAppearanceId = array.getResourceId(sortedAttrs.indexOf(android.R.attr.dateTextAppearance), -1); + json.put("CalendarView_dateTextAppearance", extractTextAppearance(textAppearanceId, true)); + textAppearanceId = array.getResourceId(sortedAttrs.indexOf(android.R.attr.weekDayTextAppearance), -1); + json.put("CalendarView_weekDayTextAppearance", extractTextAppearance(textAppearanceId, true)); - int weekDayTextAppearance = a.getResourceId(styleableClass.getDeclaredField("CalendarView_weekDayTextAppearance").getInt(null), -1); - json.put("CalendarView_weekDayTextAppearance", extractTextAppearance(weekDayTextAppearance)); - json.put("CalendarView_firstDayOfWeek", a.getInt(getField(styleableClass, "CalendarView_firstDayOfWeek"), 0)); - json.put("CalendarView_focusedMonthDateColor", a.getColor(getField(styleableClass, "CalendarView_focusedMonthDateColor"), 0)); - json.put("CalendarView_selectedWeekBackgroundColor", a.getColor(getField(styleableClass, "CalendarView_selectedWeekBackgroundColor"), 0)); - json.put("CalendarView_showWeekNumber", a.getBoolean(getField(styleableClass, "CalendarView_showWeekNumber"), true)); - json.put("CalendarView_shownWeekCount", a.getInt(getField(styleableClass, "CalendarView_shownWeekCount"), 6)); - json.put("CalendarView_unfocusedMonthDateColor", a.getColor(getField(styleableClass, "CalendarView_unfocusedMonthDateColor"), 0)); - json.put("CalendarView_weekNumberColor", a.getColor(getField(styleableClass, "CalendarView_weekNumberColor"), 0)); - json.put("CalendarView_weekSeparatorLineColor", a.getColor(getField(styleableClass, "CalendarView_weekSeparatorLineColor"), 0)); - - a.recycle(); - writer.name(styleName).value(json); + json.put("CalendarView_firstDayOfWeek", array.getInt(sortedAttrs.indexOf(android.R.attr.firstDayOfWeek), 0)); + json.put("CalendarView_focusedMonthDateColor", array.getColor(sortedAttrs.indexOf(android.R.attr.focusedMonthDateColor), 0)); + json.put("CalendarView_selectedWeekBackgroundColor", array.getColor(sortedAttrs.indexOf(android.R.attr.selectedWeekBackgroundColor), 0)); + json.put("CalendarView_showWeekNumber", array.getBoolean(sortedAttrs.indexOf(android.R.attr.showWeekNumber), true)); + json.put("CalendarView_shownWeekCount", array.getInt(sortedAttrs.indexOf(android.R.attr.shownWeekCount), 6)); + json.put("CalendarView_unfocusedMonthDateColor", array.getColor(sortedAttrs.indexOf(android.R.attr.unfocusedMonthDateColor), 0)); + json.put("CalendarView_weekNumberColor", array.getColor(sortedAttrs.indexOf(android.R.attr.weekNumberColor), 0)); + json.put("CalendarView_weekSeparatorLineColor", array.getColor(sortedAttrs.indexOf(android.R.attr.weekSeparatorLineColor), 0)); + array.recycle(); + writer.name("calendarViewStyle").value(json); } catch (Exception e) { e.printStackTrace(); } } - void extractToolBar(SimpleJsonWriter writer, String styleName, String qtClass) - { - JSONObject json = extractTextAppearanceInformations(styleName, qtClass, null, -1); + void extractToolBar(SimpleJsonWriter writer) { + JSONObject json = extractTextAppearanceInformation(android.R.attr.toolbarStyle, "QToolBar"); try { - Class attrClass = Class.forName("com.android.internal.R$attr"); - int styleId = attrClass.getDeclaredField(styleName).getInt(null); + int[] attributes = new int[]{ + android.R.attr.background, + android.R.attr.backgroundStacked, + android.R.attr.backgroundSplit, + android.R.attr.divider, + android.R.attr.itemPadding + }; + Arrays.sort(attributes); + TypedArray array = obtainStyledAttributes(android.R.attr.toolbarStyle, attributes); + ArrayList sortedAttrs = getArrayListFromIntArray(attributes); - int[] styleAttrs = (int[]) styleableClass.getDeclaredField("ActionBar").get(null); - TypedArray a = m_theme.obtainStyledAttributes(null, styleAttrs, styleId, 0); - - Drawable d = a.getDrawable(getField(styleableClass,"ActionBar_background")); + Drawable d = array.getDrawable(sortedAttrs.indexOf(android.R.attr.background)); if (d != null) - json.put("ActionBar_background", getDrawable(d, styleName + "_ActionBar_background", null)); + json.put("ActionBar_background", getDrawable(d, android.R.attr.toolbarStyle + "_ActionBar_background", null)); - d = a.getDrawable(getField(styleableClass,"ActionBar_backgroundStacked")); + d = array.getDrawable(sortedAttrs.indexOf(android.R.attr.backgroundStacked)); if (d != null) - json.put("ActionBar_backgroundStacked", getDrawable(d, styleName + "_ActionBar_backgroundStacked", null)); + json.put("ActionBar_backgroundStacked", getDrawable(d, android.R.attr.toolbarStyle + "_ActionBar_backgroundStacked", null)); - d = a.getDrawable(getField(styleableClass,"ActionBar_backgroundSplit")); + d = array.getDrawable(sortedAttrs.indexOf(android.R.attr.backgroundSplit)); if (d != null) - json.put("ActionBar_backgroundSplit", getDrawable(d, styleName + "_ActionBar_backgroundSplit", null)); + json.put("ActionBar_backgroundSplit", getDrawable(d, android.R.attr.toolbarStyle + "_ActionBar_backgroundSplit", null)); - d = a.getDrawable(getField(styleableClass,"ActionBar_divider")); + d = array.getDrawable(sortedAttrs.indexOf(android.R.attr.divider)); if (d != null) - json.put("ActionBar_divider", getDrawable(d, styleName + "_ActionBar_divider", null)); + json.put("ActionBar_divider", getDrawable(d, android.R.attr.toolbarStyle + "_ActionBar_divider", null)); - json.put("ActionBar_itemPadding", a.getDimensionPixelSize(getField(styleableClass, "ActionBar_itemPadding"), 0)); + json.put("ActionBar_itemPadding", array.getDimensionPixelSize(sortedAttrs.indexOf(android.R.attr.itemPadding), 0)); - a.recycle(); - writer.name(styleName).value(json); + array.recycle(); + writer.name("actionBarStyle").value(json); } catch (Exception e) { e.printStackTrace(); } } - void extractTabBar(SimpleJsonWriter writer, String styleName, String qtClass) - { - JSONObject json = extractTextAppearanceInformations(styleName, qtClass, null, -1); + void extractTabBar(SimpleJsonWriter writer) { + JSONObject json = extractTextAppearanceInformation(android.R.attr.actionBarTabBarStyle, "QTabBar"); try { - Class attrClass = Class.forName("android.R$attr"); - int styleId = attrClass.getDeclaredField(styleName).getInt(null); + int[] attributes = new int[]{ + android.R.attr.showDividers, + android.R.attr.dividerPadding, + android.R.attr.divider + }; + Arrays.sort(attributes); + TypedArray array = obtainStyledAttributes(android.R.attr.actionBarTabStyle, attributes); + ArrayList sortedAttrs = getArrayListFromIntArray(attributes); - int[] styleAttrs = (int[]) styleableClass.getDeclaredField("LinearLayout").get(null); - TypedArray a = m_theme.obtainStyledAttributes(null, styleAttrs, styleId, 0); - - Drawable d = a.getDrawable(getField(styleableClass,"LinearLayout_divider")); + Drawable d = array.getDrawable(sortedAttrs.indexOf(android.R.attr.divider)); if (d != null) - json.put("LinearLayout_divider", getDrawable(d, styleName + "_LinearLayout_divider", null)); - json.put("LinearLayout_showDividers", a.getInt(getField(styleableClass, "LinearLayout_showDividers"), 0)); - json.put("LinearLayout_dividerPadding", a.getDimensionPixelSize(getField(styleableClass, "LinearLayout_dividerPadding"), 0)); + json.put("LinearLayout_divider", getDrawable(d, android.R.attr.actionBarTabStyle + "_LinearLayout_divider", null)); + json.put("LinearLayout_showDividers", array.getInt(sortedAttrs.indexOf(android.R.attr.showDividers), 0)); + json.put("LinearLayout_dividerPadding", array.getDimensionPixelSize(sortedAttrs.indexOf(android.R.attr.dividerPadding), 0)); - a.recycle(); - writer.name(styleName).value(json); + array.recycle(); + writer.name("actionBarTabBarStyle").value(json); } catch (Exception e) { e.printStackTrace(); } } - private void extractWindow(SimpleJsonWriter writer, String styleName) { + private void extractWindow(SimpleJsonWriter writer) { JSONObject json = new JSONObject(); - try - { - Class attrClass = Class.forName("android.R$attr"); - int[] windowAttrs = (int[]) styleableClass.getDeclaredField("Window").get(null); + try { + int[] attributes = new int[]{ + android.R.attr.windowBackground, + android.R.attr.windowFrame + }; + Arrays.sort(attributes); + TypedArray array = obtainStyledAttributes(android.R.attr.popupWindowStyle, attributes); + ArrayList sortedAttrs = getArrayListFromIntArray(attributes); - int backgroundId = attrClass.getDeclaredField("windowBackground").getInt(null); - TypedArray a = m_theme.obtainStyledAttributes(null, windowAttrs, backgroundId, 0); - Drawable background = a.getDrawable(getField(styleableClass, "Window_windowBackground")); + Drawable background = array.getDrawable(sortedAttrs.indexOf(android.R.attr.windowBackground)); if (background != null) - json.put("Window_windowBackground", getDrawable(background, styleName + "_Window_windowBackground", null)); - a.recycle(); + json.put("Window_windowBackground", getDrawable(background, android.R.attr.popupWindowStyle + "_Window_windowBackground", null)); - int frameId = attrClass.getDeclaredField("windowFrame").getInt(null); - a = m_theme.obtainStyledAttributes(null, windowAttrs, frameId, 0); - Drawable frame = a.getDrawable(getField(styleableClass, "Window_windowFrame")); + Drawable frame = array.getDrawable(sortedAttrs.indexOf(android.R.attr.windowFrame)); if (frame != null) - json.put("Window_windowFrame", getDrawable(frame, styleName + "_Window_windowFrame", null)); - a.recycle(); - - writer.name(styleName).value(json); + json.put("Window_windowFrame", getDrawable(frame, android.R.attr.popupWindowStyle + "_Window_windowFrame", null)); + array.recycle(); + writer.name("windowStyle").value(json); } catch (Exception e) { e.printStackTrace(); } } - private JSONObject extractDefaultPalette() - { - TypedArray array = m_theme.obtainStyledAttributes(new int[]{ - android.R.attr.textAppearance - }); - int pos = 0; - JSONObject json = extractTextAppearance(array.getResourceId(pos++, -1)); + private JSONObject extractDefaultPalette() { + JSONObject json = extractTextAppearance(android.R.attr.textAppearance); try { json.put("defaultBackgroundColor", defaultBackgroundColor); json.put("defaultTextColorPrimary", defaultTextColor); } catch (Exception e) { e.printStackTrace(); } - array.recycle(); return json; } - public ExtractStyle(Context context, String extractPath, boolean minimal) - { -// Log.i(MinistroService.TAG, "Extract " + extractPath); - m_minimal = minimal; - m_extractPath = extractPath + "/"; - new File(m_extractPath).mkdirs(); -// MinistroActivity.nativeChmode(m_extractPath, 0755); - m_context = context; - m_theme = context.getTheme(); - TypedArray array = m_theme.obtainStyledAttributes(new int[]{ - android.R.attr.colorBackground, - android.R.attr.textColorPrimary, - android.R.attr.textColor - }); - defaultBackgroundColor = array.getColor(0, 0); - int textColor = array.getColor(1, 0xFFFFFF); - if (textColor == 0xFFFFFF) - textColor = array.getColor(2, 0xFFFFFF); - defaultTextColor = textColor; - array.recycle(); + static class SimpleJsonWriter { + private final OutputStreamWriter m_writer; + private boolean m_addComma = false; + private int m_indentLevel = 0; - try - { - SimpleJsonWriter jsonWriter = new SimpleJsonWriter(m_extractPath+"style.json"); - jsonWriter.beginObject(); - try { - jsonWriter.name("defaultStyle").value(extractDefaultPalette()); - extractWindow(jsonWriter, "windowStyle"); - jsonWriter.name("buttonStyle").value(extractTextAppearanceInformations("buttonStyle", "QPushButton", null, -1)); - jsonWriter.name("spinnerStyle").value(extractTextAppearanceInformations("spinnerStyle", "QComboBox", null, -1)); - extractProgressBar(jsonWriter, "progressBarStyleHorizontal", "QProgressBar"); - extractProgressBar(jsonWriter, "progressBarStyleLarge", null); - extractProgressBar(jsonWriter, "progressBarStyleSmall", null); - extractProgressBar(jsonWriter, "progressBarStyle", null); - extractAbsSeekBar(jsonWriter, "seekBarStyle", "QSlider"); - extractSwitch(jsonWriter, "switchStyle", null); - extractCompoundButton(jsonWriter, "checkboxStyle", "QCheckBox"); - jsonWriter.name("editTextStyle").value(extractTextAppearanceInformations("editTextStyle", "QLineEdit", null, -1)); - extractCompoundButton(jsonWriter, "radioButtonStyle", "QRadioButton"); - jsonWriter.name("textViewStyle").value(extractTextAppearanceInformations("textViewStyle", "QWidget", null, -1)); - jsonWriter.name("scrollViewStyle").value(extractTextAppearanceInformations("scrollViewStyle", "QAbstractScrollArea", null, -1)); - extractListView(jsonWriter, "listViewStyle", "QListView"); - jsonWriter.name("listSeparatorTextViewStyle").value(extractTextAppearanceInformations("listSeparatorTextViewStyle", null, null, -1)); - extractItemsStyle(jsonWriter); - extractCompoundButton(jsonWriter, "buttonStyleToggle", null); - extractCalendar(jsonWriter, "calendarViewStyle", "QCalendarWidget"); - extractToolBar(jsonWriter, "actionBarStyle", "QToolBar"); - jsonWriter.name("actionButtonStyle").value(extractTextAppearanceInformations("actionButtonStyle", "QToolButton", null, -1)); - jsonWriter.name("actionBarTabTextStyle").value(extractTextAppearanceInformations("actionBarTabTextStyle", null, null, -1)); - jsonWriter.name("actionBarTabStyle").value(extractTextAppearanceInformations("actionBarTabStyle", null, null, -1)); - jsonWriter.name("actionOverflowButtonStyle").value(extractImageViewInformations("actionOverflowButtonStyle", null)); - extractTabBar(jsonWriter, "actionBarTabBarStyle", "QTabBar"); - } catch (Exception e) { - e.printStackTrace(); - } - jsonWriter.endObject(); - jsonWriter.close(); -// MinistroActivity.nativeChmode(m_extractPath+"style.json", 0644); + public SimpleJsonWriter(String filePath) throws FileNotFoundException { + m_writer = new OutputStreamWriter(new FileOutputStream(filePath)); } - catch (Exception e) { - e.printStackTrace(); + + public void close() throws IOException { + m_writer.close(); + } + + private void writeIndent() throws IOException { + m_writer.write(" ", 0, m_indentLevel); + } + + void beginObject() throws IOException { + writeIndent(); + m_writer.write("{\n"); + ++m_indentLevel; + m_addComma = false; + } + + void endObject() throws IOException { + m_writer.write("\n"); + writeIndent(); + m_writer.write("}\n"); + --m_indentLevel; + m_addComma = false; + } + + SimpleJsonWriter name(String name) throws IOException { + if (m_addComma) { + m_writer.write(",\n"); + } + writeIndent(); + m_writer.write(JSONObject.quote(name) + ": "); + m_addComma = true; + return this; + } + + void value(JSONObject value) throws IOException { + m_writer.write(value.toString()); + } + } + + static class DrawableCache { + JSONObject object; + Object drawable; + public DrawableCache(JSONObject json, Object drawable) { + object = json; + this.drawable = drawable; } } } diff --git a/src/android/jar/src/org/qtproject/qt5/android/QtActivityDelegate.java b/src/android/jar/src/org/qtproject/qt5/android/QtActivityDelegate.java index 6aa935c2..16f3ea0c 100644 --- a/src/android/jar/src/org/qtproject/qt5/android/QtActivityDelegate.java +++ b/src/android/jar/src/org/qtproject/qt5/android/QtActivityDelegate.java @@ -154,6 +154,7 @@ public class QtActivityDelegate private CursorHandle m_leftSelectionHandle; private CursorHandle m_rightSelectionHandle; private EditPopupMenu m_editPopupMenu; + private boolean m_isPluginRunning = false; public void setFullScreen(boolean enterFullScreen) { @@ -190,6 +191,11 @@ public class QtActivityDelegate } } + public boolean isKeyboardVisible() + { + return m_keyboardIsVisible; + } + // input method hints - must be kept in sync with QTDIR/src/corelib/global/qnamespace.h private final int ImhHiddenText = 0x1; private final int ImhSensitiveData = 0x2; @@ -233,7 +239,6 @@ public class QtActivityDelegate private QtAccessibilityDelegate m_accessibilityDelegate = null; - public boolean setKeyboardVisibility(boolean visibility, long timeStamp) { if (m_showHideTimeStamp > timeStamp) @@ -243,7 +248,7 @@ public class QtActivityDelegate if (m_keyboardIsVisible == visibility) return false; m_keyboardIsVisible = visibility; - QtNative.keyboardVisibilityChanged(m_keyboardIsVisible); + QtNative.keyboardVisibilityUpdated(m_keyboardIsVisible); if (visibility == false) updateFullScreen(); // Hiding the keyboard clears the immersive mode, so we need to set it again. @@ -352,8 +357,12 @@ public class QtActivityDelegate inputType |= android.text.InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS; } - if ((inputHints & ImhMultiLine) != 0) + if ((inputHints & ImhMultiLine) != 0) { inputType |= android.text.InputType.TYPE_TEXT_FLAG_MULTI_LINE; + // Clear imeOptions for Multi-Line Type + // User should be able to insert new line in such case + imeOptions = android.view.inputmethod.EditorInfo.IME_ACTION_DONE; + } if ((inputHints & (ImhNoPredictiveText | ImhSensitiveData | ImhHiddenText)) != 0) inputType |= android.text.InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS; @@ -811,6 +820,10 @@ public class QtActivityDelegate DisplayMetrics metrics = new DisplayMetrics(); m_activity.getWindowManager().getDefaultDisplay().getMetrics(metrics); final int kbHeight = metrics.heightPixels - r.bottom; + if (kbHeight < 0) { + setKeyboardVisibility(false, System.nanoTime()); + return true; + } final int[] location = new int[2]; m_layout.getLocationOnScreen(location); QtNative.keyboardGeometryChanged(location[0], r.bottom - location[1], @@ -876,6 +889,11 @@ public class QtActivityDelegate m_accessibilityDelegate.notifyObjectFocus(viewId); } + public void notifyQtAndroidPluginRunning(boolean running) + { + m_isPluginRunning = running; + } + public void initializeAccessibility() { m_accessibilityDelegate = new QtAccessibilityDelegate(m_activity, m_layout, this); @@ -983,7 +1001,7 @@ public class QtActivityDelegate public boolean onKeyDown(int keyCode, KeyEvent event) { - if (!m_started) + if (!m_started || !m_isPluginRunning) return false; m_metaState = MetaKeyKeyListener.handleKeyDown(m_metaState, keyCode, event); @@ -1017,7 +1035,7 @@ public class QtActivityDelegate public boolean onKeyUp(int keyCode, KeyEvent event) { - if (!m_started) + if (!m_started || !m_isPluginRunning) return false; if ((keyCode == KeyEvent.KEYCODE_VOLUME_UP diff --git a/src/android/jar/src/org/qtproject/qt5/android/QtInputConnection.java b/src/android/jar/src/org/qtproject/qt5/android/QtInputConnection.java index 76fa974e..b5f6af87 100644 --- a/src/android/jar/src/org/qtproject/qt5/android/QtInputConnection.java +++ b/src/android/jar/src/org/qtproject/qt5/android/QtInputConnection.java @@ -257,6 +257,29 @@ public class QtInputConnection extends BaseInputConnection // If the sendKeyEvent was invoked, it means that the button not related with composingText was used // In such case composing text (if it exists) should be finished immediately finishComposingText(); + if (event.getKeyCode() == KeyEvent.KEYCODE_ENTER && m_view != null) { + KeyEvent fakeEvent; + switch (m_view.m_imeOptions) { + case android.view.inputmethod.EditorInfo.IME_ACTION_NEXT: + fakeEvent = new KeyEvent(event.getDownTime(), + event.getEventTime(), + event.getAction(), + KeyEvent.KEYCODE_TAB, + event.getRepeatCount(), + event.getMetaState()); + return super.sendKeyEvent(fakeEvent); + case android.view.inputmethod.EditorInfo.IME_ACTION_PREVIOUS: + fakeEvent = new KeyEvent(event.getDownTime(), + event.getEventTime(), + event.getAction(), + KeyEvent.KEYCODE_TAB, + event.getRepeatCount(), + KeyEvent.META_SHIFT_ON); + return super.sendKeyEvent(fakeEvent); + default: + break; + } + } return super.sendKeyEvent(event); } diff --git a/src/android/jar/src/org/qtproject/qt5/android/QtLayout.java b/src/android/jar/src/org/qtproject/qt5/android/QtLayout.java index f22b8176..e94ce602 100644 --- a/src/android/jar/src/org/qtproject/qt5/android/QtLayout.java +++ b/src/android/jar/src/org/qtproject/qt5/android/QtLayout.java @@ -46,10 +46,13 @@ import android.util.AttributeSet; import android.util.DisplayMetrics; import android.view.View; import android.view.ViewGroup; +import android.graphics.Rect; public class QtLayout extends ViewGroup { private Runnable m_startApplicationRunnable; + private int m_bottomDisplayFrame = -1; + public QtLayout(Context context, Runnable startRunnable) { super(context); @@ -66,13 +69,32 @@ public class QtLayout extends ViewGroup super(context, attrs, defStyle); } - @Override - protected void onSizeChanged (int w, int h, int oldw, int oldh) + private void handleSizeChanged (int w, int h, int oldw, int oldh) { DisplayMetrics metrics = new DisplayMetrics(); ((Activity) getContext()).getWindowManager().getDefaultDisplay().getMetrics(metrics); - QtNative.setApplicationDisplayMetrics(metrics.widthPixels, metrics.heightPixels, w, h, - metrics.xdpi, metrics.ydpi, metrics.scaledDensity, metrics.density); + + Rect r = new Rect(); + ((Activity) getContext()).getWindow().getDecorView().getWindowVisibleDisplayFrame(r); + + if (m_bottomDisplayFrame != r.bottom || oldh == -1) { + m_bottomDisplayFrame = r.bottom; + QtNative.setApplicationDisplayMetrics(metrics.widthPixels, metrics.heightPixels, w, h, + metrics.xdpi, + metrics.ydpi, + metrics.scaledDensity, + metrics.density, + ((metrics.heightPixels == h) + || (metrics.heightPixels == h + r.top) + || (m_bottomDisplayFrame > metrics.heightPixels + r.top))); + } + } + + @Override + protected void onSizeChanged (int w, int h, int oldw, int oldh) + { + handleSizeChanged (w, h, oldw, oldh); + if (m_startApplicationRunnable != null) { m_startApplicationRunnable.run(); m_startApplicationRunnable = null; @@ -150,6 +172,8 @@ public class QtLayout extends ViewGroup } } + + handleSizeChanged (r, b, 0, -1); } // Override to allow type-checking of LayoutParams. diff --git a/src/android/jar/src/org/qtproject/qt5/android/QtNative.java b/src/android/jar/src/org/qtproject/qt5/android/QtNative.java index 39f12207..5792b5b2 100644 --- a/src/android/jar/src/org/qtproject/qt5/android/QtNative.java +++ b/src/android/jar/src/org/qtproject/qt5/android/QtNative.java @@ -65,6 +65,7 @@ import android.os.Looper; import android.content.ClipboardManager; import android.content.ClipboardManager.OnPrimaryClipChangedListener; import android.content.ClipData; +import android.content.ClipDescription; import android.os.ParcelFileDescriptor; import android.util.Log; import android.view.ContextMenu; @@ -97,6 +98,7 @@ public class QtNative public static final String QtTAG = "Qt JAVA"; // string used for Log.x private static ArrayList m_lostActions = new ArrayList(); // a list containing all actions which could not be performed (e.g. the main activity is destroyed, etc.) private static boolean m_started = false; + private static boolean m_isKeyboardHiding = false; private static int m_displayMetricsScreenWidthPixels = 0; private static int m_displayMetricsScreenHeightPixels = 0; private static int m_displayMetricsDesktopWidthPixels = 0; @@ -611,7 +613,8 @@ public class QtNative m_displayMetricsXDpi, m_displayMetricsYDpi, m_displayMetricsScaledDensity, - m_displayMetricsDensity); + m_displayMetricsDensity, + true); } }); m_qtThread.post(new Runnable() { @@ -633,7 +636,8 @@ public class QtNative double XDpi, double YDpi, double scaledDensity, - double density) + double density, + boolean forceUpdate) { /* Fix buggy dpi report */ if (XDpi < android.util.DisplayMetrics.DENSITY_LOW) @@ -650,7 +654,8 @@ public class QtNative XDpi, YDpi, scaledDensity, - density); + density, + forceUpdate); } else { m_displayMetricsScreenWidthPixels = screenWidthPixels; m_displayMetricsScreenHeightPixels = screenHeightPixels; @@ -907,6 +912,7 @@ public class QtNative private static void hideSoftwareKeyboard() { + m_isKeyboardHiding = true; runAction(new Runnable() { @Override public void run() { @@ -929,6 +935,13 @@ public class QtNative }); } + public static boolean isSoftwareKeyboardVisible() + { + if (m_activityDelegate == null) + return false; + return m_activityDelegate.isKeyboardVisible() && !m_isKeyboardHiding; + } + private static void notifyAccessibilityLocationChange() { runAction(new Runnable() { @@ -965,6 +978,11 @@ public class QtNative }); } + public static void notifyQtAndroidPluginRunning(final boolean running) + { + m_activityDelegate.notifyQtAndroidPluginRunning(running); + } + private static void registerClipboardManager() { if (m_service == null || m_activity != null) { // Avoid freezing if only service @@ -996,6 +1014,7 @@ public class QtNative { if (Build.VERSION.SDK_INT >= 28 && m_clipboardManager != null) m_clipboardManager.clearPrimaryClip(); + m_usePrimaryClip = false; } private static void setClipboardText(String text) { @@ -1009,10 +1028,8 @@ public class QtNative { try { if (m_clipboardManager != null && m_clipboardManager.hasPrimaryClip()) { - ClipData primaryClip = m_clipboardManager.getPrimaryClip(); - for (int i = 0; i < primaryClip.getItemCount(); ++i) - if (primaryClip.getItemAt(i).getText() != null) - return true; + ClipDescription primaryClipDescription = m_clipboardManager.getPrimaryClipDescription(); + return primaryClipDescription.hasMimeType("text/*"); } } catch (Exception e) { Log.e(QtTAG, "Failed to get clipboard data", e); @@ -1067,10 +1084,8 @@ public class QtNative { try { if (m_clipboardManager != null && m_clipboardManager.hasPrimaryClip()) { - ClipData primaryClip = m_clipboardManager.getPrimaryClip(); - for (int i = 0; i < Objects.requireNonNull(primaryClip).getItemCount(); ++i) - if (primaryClip.getItemAt(i).getHtmlText() != null) - return true; + ClipDescription primaryClipDescription = m_clipboardManager.getPrimaryClipDescription(); + return primaryClipDescription.hasMimeType("text/html"); } } catch (Exception e) { Log.e(QtTAG, "Failed to get clipboard data", e); @@ -1106,10 +1121,8 @@ public class QtNative { try { if (m_clipboardManager != null && m_clipboardManager.hasPrimaryClip()) { - ClipData primaryClip = m_clipboardManager.getPrimaryClip(); - for (int i = 0; i < primaryClip.getItemCount(); ++i) - if (primaryClip.getItemAt(i).getUri() != null) - return true; + ClipDescription primaryClipDescription = m_clipboardManager.getPrimaryClipDescription(); + return primaryClipDescription.hasMimeType("text/uri-list"); } } catch (Exception e) { Log.e(QtTAG, "Failed to get clipboard data", e); @@ -1293,6 +1306,12 @@ public class QtNative }); } + public static void keyboardVisibilityUpdated(boolean visibility) + { + m_isKeyboardHiding = false; + keyboardVisibilityChanged(visibility); + } + private static String[] listAssetContent(android.content.res.AssetManager asset, String path) { String [] list; ArrayList res = new ArrayList(); @@ -1324,7 +1343,8 @@ public class QtNative double XDpi, double YDpi, double scaledDensity, - double density); + double density, + boolean forceUpdate); public static native void handleOrientationChanged(int newRotation, int nativeOrientation); // screen methods diff --git a/src/android/jar/src/org/qtproject/qt5/android/QtServiceDelegate.java b/src/android/jar/src/org/qtproject/qt5/android/QtServiceDelegate.java index 1da377c2..68e79c27 100644 --- a/src/android/jar/src/org/qtproject/qt5/android/QtServiceDelegate.java +++ b/src/android/jar/src/org/qtproject/qt5/android/QtServiceDelegate.java @@ -115,7 +115,7 @@ public class QtServiceDelegate QtNative.setService(m_service, this); QtNative.setClassLoader(classLoader); - QtNative.setApplicationDisplayMetrics(10, 10, 10, 10, 120, 120, 1.0, 1.0); + QtNative.setApplicationDisplayMetrics(10, 10, 10, 10, 120, 120, 1.0, 1.0, false); if (loaderParams.containsKey(STATIC_INIT_CLASSES_KEY)) { for (String className: loaderParams.getStringArray(STATIC_INIT_CLASSES_KEY)) { diff --git a/src/android/jar/src/org/qtproject/qt5/android/QtSurface.java b/src/android/jar/src/org/qtproject/qt5/android/QtSurface.java index 08b5a80f..2e88da17 100644 --- a/src/android/jar/src/org/qtproject/qt5/android/QtSurface.java +++ b/src/android/jar/src/org/qtproject/qt5/android/QtSurface.java @@ -101,6 +101,11 @@ public class QtSurface extends SurfaceView implements SurfaceHolder.Callback @Override public boolean onTouchEvent(MotionEvent event) { + // QTBUG-65927 + // Fix event positions depending on Surface position. + // In case when Surface is moved, we should also add this move to event position + event.setLocation(event.getX() + getX(), event.getY() + getY()); + QtNative.sendTouchEvent(event, getId()); m_gestureDetector.onTouchEvent(event); return true; diff --git a/src/android/java/src/org/qtproject/qt5/android/bindings/QtActivity.java b/src/android/java/src/org/qtproject/qt5/android/bindings/QtActivity.java index b257a165..487ba7e7 100644 --- a/src/android/java/src/org/qtproject/qt5/android/bindings/QtActivity.java +++ b/src/android/java/src/org/qtproject/qt5/android/bindings/QtActivity.java @@ -1136,4 +1136,13 @@ public class QtActivity extends Activity { QtNative.activityDelegate().notifyObjectFocus(viewId); } + public boolean isKeyboardVisible() + { + return QtNative.activityDelegate().isKeyboardVisible(); + } + + public void notifyQtAndroidPluginRunning(boolean running) + { + QtNative.activityDelegate().notifyQtAndroidPluginRunning(running); + } } diff --git a/src/android/java/src/org/qtproject/qt5/android/bindings/QtApplication.java b/src/android/java/src/org/qtproject/qt5/android/bindings/QtApplication.java index 47dcde30..749b9ac4 100644 --- a/src/android/java/src/org/qtproject/qt5/android/bindings/QtApplication.java +++ b/src/android/java/src/org/qtproject/qt5/android/bindings/QtApplication.java @@ -102,9 +102,7 @@ public class QtApplication extends Application } } } - } catch (Exception e) { - e.printStackTrace(); - } + } catch (Exception e) { } } } diff --git a/src/android/java/src/org/qtproject/qt5/android/bindings/QtService.java b/src/android/java/src/org/qtproject/qt5/android/bindings/QtService.java index cdd6c1ef..67ced752 100644 --- a/src/android/java/src/org/qtproject/qt5/android/bindings/QtService.java +++ b/src/android/java/src/org/qtproject/qt5/android/bindings/QtService.java @@ -39,8 +39,11 @@ package org.qtproject.qt5.android.bindings; import android.app.Service; import android.content.Intent; import android.content.res.Configuration; +import android.os.Bundle; import android.os.IBinder; +import org.qtproject.qt5.android.QtNative; + public class QtService extends Service { QtServiceLoader m_loader = new QtServiceLoader(this); @@ -153,4 +156,14 @@ public class QtService extends Service return super.onUnbind(intent); } //--------------------------------------------------------------------------- + + public boolean loadApplication(Service service, ClassLoader classLoader, Bundle loaderParams) + { + return QtNative.serviceDelegate().loadApplication(service, classLoader, loaderParams); + } + + public boolean startApplication() + { + return QtNative.serviceDelegate().startApplication(); + } } diff --git a/src/android/templates/AndroidManifest.xml b/src/android/templates/AndroidManifest.xml index 092cf165..7079f51a 100644 --- a/src/android/templates/AndroidManifest.xml +++ b/src/android/templates/AndroidManifest.xml @@ -9,7 +9,7 @@ - + @@ -73,7 +73,7 @@ * minimal - useful for Quick Controls 2 apps, it is much faster than "full" * none - useful for apps that don't use any of the above Qt modules --> - + diff --git a/src/android/templates/build.gradle b/src/android/templates/build.gradle index 443a8002..34371c30 100644 --- a/src/android/templates/build.gradle +++ b/src/android/templates/build.gradle @@ -5,7 +5,7 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:3.6.0' + classpath 'com.android.tools.build:gradle:7.0.2' } } diff --git a/src/concurrent/qtconcurrentfilter.h b/src/concurrent/qtconcurrentfilter.h index d01b351a..532057c3 100644 --- a/src/concurrent/qtconcurrentfilter.h +++ b/src/concurrent/qtconcurrentfilter.h @@ -136,7 +136,9 @@ QFuture::value_type> filtered(Iterator begin, Iter template void blockingFilter(Sequence &sequence, KeepFunctor keep) { - filterInternal(sequence, QtPrivate::createFunctionWrapper(keep), QtPrivate::PushBackWrapper()).startBlocking(); + QFuture future = + filterInternal(sequence, QtPrivate::createFunctionWrapper(keep), QtPrivate::PushBackWrapper()); + future.waitForFinished(); } // blocking filteredReduced() on sequences @@ -146,8 +148,9 @@ ResultType blockingFilteredReduced(const Sequence &sequence, ReduceFunctor reduce, ReduceOptions options = ReduceOptions(UnorderedReduce | SequentialReduce)) { - return startFilteredReduced(sequence, QtPrivate::createFunctionWrapper(keep), QtPrivate::createFunctionWrapper(reduce), options) - .startBlocking(); + QFuture future = + startFilteredReduced(sequence, QtPrivate::createFunctionWrapper(keep), QtPrivate::createFunctionWrapper(reduce), options); + return future.result(); } #ifndef Q_CLANG_QDOC @@ -173,12 +176,11 @@ ResultType blockingFilteredReduced(Iterator begin, ReduceFunctor reduce, ReduceOptions options = ReduceOptions(UnorderedReduce | SequentialReduce)) { - return startFilteredReduced - (begin, end, + QFuture future = startFilteredReduced(begin, end, QtPrivate::createFunctionWrapper(keep), QtPrivate::createFunctionWrapper(reduce), - options) - .startBlocking(); + options); + return future.result(); } #ifndef Q_CLANG_QDOC @@ -189,12 +191,13 @@ typename QtPrivate::ReduceResultType::ResultType blockingFiltered ReduceFunctor reduce, ReduceOptions options = ReduceOptions(UnorderedReduce | SequentialReduce)) { - return startFilteredReduced::ResultType> + QFuture::ResultType> future = + startFilteredReduced::ResultType> (begin, end, QtPrivate::createFunctionWrapper(keep), QtPrivate::createFunctionWrapper(reduce), - options) - .startBlocking(); + options); + return future.result(); } #endif @@ -202,17 +205,20 @@ typename QtPrivate::ReduceResultType::ResultType blockingFiltered template Sequence blockingFiltered(const Sequence &sequence, KeepFunctor keep) { - return startFilteredReduced(sequence, QtPrivate::createFunctionWrapper(keep), QtPrivate::PushBackWrapper(), OrderedReduce).startBlocking(); + QFuture future = + startFilteredReduced(sequence, QtPrivate::createFunctionWrapper(keep), QtPrivate::PushBackWrapper(), OrderedReduce); + return future.result(); } // blocking filtered() on iterators template OutputSequence blockingFiltered(Iterator begin, Iterator end, KeepFunctor keep) { - return startFilteredReduced(begin, end, + QFuture future = startFilteredReduced(begin, end, QtPrivate::createFunctionWrapper(keep), QtPrivate::PushBackWrapper(), - OrderedReduce).startBlocking(); + OrderedReduce); + return future.result(); } } // namespace QtConcurrent diff --git a/src/concurrent/qtconcurrentmap.h b/src/concurrent/qtconcurrentmap.h index 151f03cf..70eea29b 100644 --- a/src/concurrent/qtconcurrentmap.h +++ b/src/concurrent/qtconcurrentmap.h @@ -143,14 +143,16 @@ QFuture::ResultType> mapped( template void blockingMap(Sequence &sequence, MapFunctor map) { - startMap(sequence.begin(), sequence.end(), QtPrivate::createFunctionWrapper(map)).startBlocking(); + QFuture future = startMap(sequence.begin(), sequence.end(), QtPrivate::createFunctionWrapper(map)); + future.waitForFinished(); } // blockingMap() for iterator ranges template void blockingMap(Iterator begin, Iterator end, MapFunctor map) { - startMap(begin, end, QtPrivate::createFunctionWrapper(map)).startBlocking(); + QFuture future = startMap(begin, end, QtPrivate::createFunctionWrapper(map)); + future.waitForFinished(); } // blockingMappedReduced() for sequences @@ -160,12 +162,13 @@ ResultType blockingMappedReduced(const Sequence &sequence, ReduceFunctor reduce, ReduceOptions options = ReduceOptions(UnorderedReduce | SequentialReduce)) { - return QtConcurrent::startMappedReduced::ResultType, ResultType> + QFuture future = + QtConcurrent::startMappedReduced::ResultType, ResultType> (sequence, QtPrivate::createFunctionWrapper(map), QtPrivate::createFunctionWrapper(reduce), - options) - .startBlocking(); + options); + return future.result(); } template @@ -174,12 +177,13 @@ typename QtPrivate::ReduceResultType::ResultType blockingMappedRe ReduceFunctor reduce, ReduceOptions options = ReduceOptions(UnorderedReduce | SequentialReduce)) { - return QtConcurrent::startMappedReduced::ResultType, typename QtPrivate::ReduceResultType::ResultType> + QFuture::ResultType> future = + QtConcurrent::startMappedReduced::ResultType, typename QtPrivate::ReduceResultType::ResultType> (sequence, QtPrivate::createFunctionWrapper(map), QtPrivate::createFunctionWrapper(reduce), - options) - .startBlocking(); + options); + return future.result(); } // blockingMappedReduced() for iterator ranges @@ -190,12 +194,13 @@ ResultType blockingMappedReduced(Iterator begin, ReduceFunctor reduce, QtConcurrent::ReduceOptions options = QtConcurrent::ReduceOptions(QtConcurrent::UnorderedReduce | QtConcurrent::SequentialReduce)) { - return QtConcurrent::startMappedReduced::ResultType, ResultType> + QFuture future = + QtConcurrent::startMappedReduced::ResultType, ResultType> (begin, end, QtPrivate::createFunctionWrapper(map), QtPrivate::createFunctionWrapper(reduce), - options) - .startBlocking(); + options); + return future.result(); } template @@ -205,12 +210,13 @@ typename QtPrivate::ReduceResultType::ResultType blockingMappedRe ReduceFunctor reduce, QtConcurrent::ReduceOptions options = QtConcurrent::ReduceOptions(QtConcurrent::UnorderedReduce | QtConcurrent::SequentialReduce)) { - return QtConcurrent::startMappedReduced::ResultType, typename QtPrivate::ReduceResultType::ResultType> + QFuture::ResultType> future = + QtConcurrent::startMappedReduced::ResultType, typename QtPrivate::ReduceResultType::ResultType> (begin, end, QtPrivate::createFunctionWrapper(map), QtPrivate::createFunctionWrapper(reduce), - options) - .startBlocking(); + options); + return future.result(); } // mapped() for sequences with a different putput sequence type. diff --git a/src/concurrent/qtconcurrentthreadengine.cpp b/src/concurrent/qtconcurrentthreadengine.cpp index 7f91a2ba..ea6ce3ac 100644 --- a/src/concurrent/qtconcurrentthreadengine.cpp +++ b/src/concurrent/qtconcurrentthreadengine.cpp @@ -176,39 +176,6 @@ void ThreadEngineBase::startSingleThreaded() finish(); } -void ThreadEngineBase::startBlocking() -{ - start(); - barrier.acquire(); - startThreads(); - - bool throttled = false; -#ifndef QT_NO_EXCEPTIONS - try { -#endif - while (threadFunction() == ThrottleThread) { - if (threadThrottleExit()) { - throttled = true; - break; - } - } -#ifndef QT_NO_EXCEPTIONS - } catch (QException &e) { - handleException(e); - } catch (...) { - handleException(QUnhandledException()); - } -#endif - - if (throttled == false) { - barrier.release(); - } - - barrier.wait(); - finish(); - exceptionStore.throwPossibleException(); -} - void ThreadEngineBase::startThread() { startThreadInternal(); diff --git a/src/concurrent/qtconcurrentthreadengine.h b/src/concurrent/qtconcurrentthreadengine.h index a4c8548c..7c30cebd 100644 --- a/src/concurrent/qtconcurrentthreadengine.h +++ b/src/concurrent/qtconcurrentthreadengine.h @@ -91,7 +91,6 @@ public: ThreadEngineBase(); virtual ~ThreadEngineBase(); void startSingleThreaded(); - void startBlocking(); void startThread(); bool isCanceled(); void waitForResume(); @@ -144,15 +143,6 @@ public: return result(); } - // Runs the user algorithm using multiple threads. - // This function blocks until the algorithm is finished, - // and then returns the result. - T *startBlocking() - { - ThreadEngineBase::startBlocking(); - return result(); - } - // Runs the user algorithm using multiple threads. // Does not block, returns a future. QFuture startAsynchronously() @@ -233,13 +223,6 @@ class ThreadEngineStarter : public ThreadEngineStarterBase public: ThreadEngineStarter(TypedThreadEngine *eng) : Base(eng) { } - - T startBlocking() - { - T t = *this->threadEngine->startBlocking(); - delete this->threadEngine; - return t; - } }; // Full template specialization where T is void. @@ -249,12 +232,6 @@ class ThreadEngineStarter : public ThreadEngineStarterBase public: ThreadEngineStarter(ThreadEngine *_threadEngine) : ThreadEngineStarterBase(_threadEngine) {} - - void startBlocking() - { - this->threadEngine->startBlocking(); - delete this->threadEngine; - } }; //! [qtconcurrentthreadengine-1] diff --git a/src/corelib/Qt5AndroidSupport.cmake b/src/corelib/Qt5AndroidSupport.cmake index 5512635f..6aca9299 100644 --- a/src/corelib/Qt5AndroidSupport.cmake +++ b/src/corelib/Qt5AndroidSupport.cmake @@ -19,7 +19,7 @@ if (NOT ${PROJECT_NAME}-MultiAbiBuild) endif() endforeach() option(ANDROID_MIN_SDK_VERSION "Android minimum SDK version" "21") - option(ANDROID_TARGET_SDK_VERSION "Android target SDK version" "29") + option(ANDROID_TARGET_SDK_VERSION "Android target SDK version" "30") # Make sure to delete the "android-build" directory, which contains all the # build artefacts, and also the androiddeployqt/gradle artefacts @@ -123,24 +123,28 @@ if (NOT ${PROJECT_NAME}-MultiAbiBuild) set(android_deploy_qt_platform "--android-platform ${ANDROID_SDK_PLATFORM}") endif() - add_custom_target(apk - COMMAND ${CMAKE_COMMAND} -E env JAVA_HOME=${JAVA_HOME} ${ANDROID_DEPLOY_QT} - --input "${CMAKE_BINARY_DIR}/android_deployment_settings.json" - --output "${CMAKE_BINARY_DIR}/android-build" - --apk "${CMAKE_BINARY_DIR}/android-build/${PROJECT_NAME}.apk" - ${android_deploy_qt_platform} - ${android_deploy_qt_jdk} - VERBATIM) + if(NOT TARGET apk) + add_custom_target(apk + COMMAND ${CMAKE_COMMAND} -E env JAVA_HOME=${JAVA_HOME} ${ANDROID_DEPLOY_QT} + --input "${CMAKE_BINARY_DIR}/android_deployment_settings.json" + --output "${CMAKE_BINARY_DIR}/android-build" + --apk "${CMAKE_BINARY_DIR}/android-build/${PROJECT_NAME}.apk" + ${android_deploy_qt_platform} + ${android_deploy_qt_jdk} + VERBATIM) + endif() - add_custom_target(aab - COMMAND ${CMAKE_COMMAND} -E env JAVA_HOME=${JAVA_HOME} ${ANDROID_DEPLOY_QT} - --input "${CMAKE_BINARY_DIR}/android_deployment_settings.json" - --output "${CMAKE_BINARY_DIR}/android-build" - --apk "${CMAKE_BINARY_DIR}/android-build/${PROJECT_NAME}.apk" - --aab - ${android_deploy_qt_platform} - ${android_deploy_qt_jdk} - VERBATIM) + if(NOT TARGET aab) + add_custom_target(aab + COMMAND ${CMAKE_COMMAND} -E env JAVA_HOME=${JAVA_HOME} ${ANDROID_DEPLOY_QT} + --input "${CMAKE_BINARY_DIR}/android_deployment_settings.json" + --output "${CMAKE_BINARY_DIR}/android-build" + --apk "${CMAKE_BINARY_DIR}/android-build/${PROJECT_NAME}.apk" + --aab + ${android_deploy_qt_platform} + ${android_deploy_qt_jdk} + VERBATIM) + endif() include(ExternalProject) macro (setup_library library_name android_abi) diff --git a/src/corelib/Qt5CoreMacros.cmake b/src/corelib/Qt5CoreMacros.cmake index f5766f87..d91873f1 100644 --- a/src/corelib/Qt5CoreMacros.cmake +++ b/src/corelib/Qt5CoreMacros.cmake @@ -400,6 +400,9 @@ function(qt5_add_big_resources outfiles) add_library(rcc_object_${outfilename} OBJECT ${tmpoutfile}) set_target_properties(rcc_object_${outfilename} PROPERTIES AUTOMOC OFF) set_target_properties(rcc_object_${outfilename} PROPERTIES AUTOUIC OFF) + + target_link_libraries(rcc_object_${outfilename} PUBLIC Qt5::Core) + add_dependencies(rcc_object_${outfilename} big_resources_${outfilename}) # The modification of TARGET_OBJECTS needs the following change in cmake # https://gitlab.kitware.com/cmake/cmake/commit/93c89bc75ceee599ba7c08b8fe1ac5104942054f diff --git a/src/corelib/codecs/qicucodec.cpp b/src/corelib/codecs/qicucodec.cpp index f9092277..1a727ebb 100644 --- a/src/corelib/codecs/qicucodec.cpp +++ b/src/corelib/codecs/qicucodec.cpp @@ -565,6 +565,32 @@ QIcuCodec::~QIcuCodec() { } +/*! + \internal + + Custom callback for the ICU from Unicode conversion. It's invoked when the + conversion from Unicode detects illegal or unrecognized character. + + Assumes that context contains a pointer to QTextCodec::ConverterState + structure. Updates its invalid characters count and calls a default + callback, that replaces the invalid characters properly. +*/ +static void customFromUnicodeSubstitutionCallback(const void *context, + UConverterFromUnicodeArgs *fromUArgs, + const UChar *codeUnits, + int32_t length, + UChar32 codePoint, + UConverterCallbackReason reason, + UErrorCode *err) +{ + auto *state = reinterpret_cast(const_cast(context)); + if (state) + state->invalidChars++; + // Call the default callback that replaces all illegal or unrecognized + // sequences with the substitute string + UCNV_FROM_U_CALLBACK_SUBSTITUTE(nullptr, fromUArgs, codeUnits, length, codePoint, reason, err); +} + UConverter *QIcuCodec::getConverter(QTextCodec::ConverterState *state) const { UConverter *conv = nullptr; @@ -577,8 +603,18 @@ UConverter *QIcuCodec::getConverter(QTextCodec::ConverterState *state) const state->d = ucnv_open(m_name, &error); ucnv_setSubstChars(static_cast(state->d), state->flags & QTextCodec::ConvertInvalidToNull ? "\0" : "?", 1, &error); - if (U_FAILURE(error)) + if (!U_FAILURE(error)) { + error = U_ZERO_ERROR; + ucnv_setFromUCallBack(static_cast(state->d), + customFromUnicodeSubstitutionCallback, state, nullptr, + nullptr, &error); + if (U_FAILURE(error)) { + qDebug("getConverter(state) failed to install custom callback. " + "canEncode() may report incorrect results."); + } + } else { qDebug("getConverter(state) ucnv_open failed %s %s", m_name, u_errorName(error)); + } } conv = static_cast(state->d); } diff --git a/src/corelib/configure.json b/src/corelib/configure.json index 3cf77dc6..06f43118 100644 --- a/src/corelib/configure.json +++ b/src/corelib/configure.json @@ -356,7 +356,7 @@ "std::future f = std::async([]() { return 42; });", "(void)f.get();" ], - "qmake": "unix:LIBS += -lpthread" + "qmake": "unix:!vxworks:LIBS += -lpthread" } }, "cxx11_random": { @@ -1048,6 +1048,7 @@ "label": "QTimeZone", "purpose": "Provides support for time-zone handling.", "section": "Utilities", + "condition": "!config.wasm", "output": [ "publicFeature" ] }, "datetimeparser": { diff --git a/src/corelib/doc/snippets/code/doc_src_qset.cpp b/src/corelib/doc/snippets/code/doc_src_qset.cpp index 96ef0773..100661e0 100644 --- a/src/corelib/doc/snippets/code/doc_src_qset.cpp +++ b/src/corelib/doc/snippets/code/doc_src_qset.cpp @@ -156,23 +156,3 @@ QSet::const_iterator it = std::find_if(set.cbegin(), set.cend(), predic if (it != set.constEnd()) cout << "Found Jeanette" << endl; //! [12] - - -//! [13] -QSet set; -set << "red" << "green" << "blue" << ... << "black"; - -QList list = set.toList(); -std::sort(list.begin(), list.end()); -//! [13] - - -//! [14] -QStringList list; -list << "Julia" << "Mike" << "Mike" << "Julia" << "Julia"; - -QSet set = QSet::fromList(list); -set.contains("Julia"); // returns true -set.contains("Mike"); // returns true -set.size(); // returns 2 -//! [14] diff --git a/src/corelib/doc/snippets/code/src_corelib_global_qrandom.cpp b/src/corelib/doc/snippets/code/src_corelib_global_qrandom.cpp index 0dc47f23..35bf49c1 100644 --- a/src/corelib/doc/snippets/code/src_corelib_global_qrandom.cpp +++ b/src/corelib/doc/snippets/code/src_corelib_global_qrandom.cpp @@ -127,5 +127,5 @@ //! [15] //! [16] - qint64 value = QRandomGenerator64::generate() & std::numeric_limits::max(); + qint64 value = QRandomGenerator64::global()->generate() & std::numeric_limits::max(); //! [16] diff --git a/src/corelib/doc/snippets/code/src_corelib_io_qdir.cpp b/src/corelib/doc/snippets/code/src_corelib_io_qdir.cpp index 4e5e25a6..3b9435f0 100644 --- a/src/corelib/doc/snippets/code/src_corelib_io_qdir.cpp +++ b/src/corelib/doc/snippets/code/src_corelib_io_qdir.cpp @@ -182,4 +182,17 @@ namespace MyNamespace Q_CLEANUP_RESOURCE(myapp); //! [15] +//! [16] +QString absolute = "/local/bin"; +QString relative = "local/bin"; +QFileInfo absFile(absolute); +QFileInfo relFile(relative); + +QDir::setCurrent(QDir::rootPath()); +// absFile and relFile now point to the same file + +QDir::setCurrent("/tmp"); +// absFile now points to "/local/bin", +// while relFile points to "/tmp/local/bin" +//! [16] } diff --git a/src/corelib/doc/snippets/code/src_corelib_io_qfileinfo.cpp b/src/corelib/doc/snippets/code/src_corelib_io_qfileinfo.cpp index 03662537..d81360ee 100644 --- a/src/corelib/doc/snippets/code/src_corelib_io_qfileinfo.cpp +++ b/src/corelib/doc/snippets/code/src_corelib_io_qfileinfo.cpp @@ -90,20 +90,17 @@ info2.size(); // returns 63942 //! [2] -QString absolute = "/local/bin"; -QString relative = "local/bin"; -QFileInfo absFile(absolute); -QFileInfo relFile(relative); +QFileInfo info("/usr/bin/env"); -QDir::setCurrent(QDir::rootPath()); -// absFile and relFile now point to the same file +QString path = info.absolutePath(); // path = /usr/bin +QString base = info.baseName(); // base = env -QDir::setCurrent("/tmp"); -// absFile now points to "/local/bin", -// while relFile points to "/tmp/local/bin" +info.setFile("/etc/hosts"); + +path = info.absolutePath(); // path = /etc +base = info.baseName(); // base = hosts //! [2] - //! [3] QFileInfo fi("/tmp/archive.tar.gz"); QString name = fi.fileName(); // name = "archive.tar.gz" diff --git a/src/corelib/doc/snippets/code/src_corelib_tools_qlistdata.cpp b/src/corelib/doc/snippets/code/src_corelib_tools_qlistdata.cpp index 38fa526e..418cbe5e 100644 --- a/src/corelib/doc/snippets/code/src_corelib_tools_qlistdata.cpp +++ b/src/corelib/doc/snippets/code/src_corelib_tools_qlistdata.cpp @@ -228,7 +228,7 @@ qDeleteAll(list.constBegin(), list.constEnd()); QVector vect; vect << 20.0 << 30.0 << 40.0 << 50.0; -QList list = QVector::fromVector(vect); +QList list = QList::fromVector(vect); // list: [20.0, 30.0, 40.0, 50.0] //! [21] @@ -240,41 +240,3 @@ list << "Sven" << "Kim" << "Ola"; QVector vect = list.toVector(); // vect: ["Sven", "Kim", "Ola"] //! [22] - - -//! [23] -QSet set; -set << 20 << 30 << 40 << ... << 70; - -QList list = QList::fromSet(set); -std::sort(list.begin(), list.end()); -//! [23] - - -//! [24] -QStringList list; -list << "Julia" << "Mike" << "Mike" << "Julia" << "Julia"; - -QSet set = list.toSet(); -set.contains("Julia"); // returns true -set.contains("Mike"); // returns true -set.size(); // returns 2 -//! [24] - - -//! [25] -std::list stdlist; -list.push_back(1.2); -list.push_back(0.5); -list.push_back(3.14); - -QList list = QList::fromStdList(stdlist); -//! [25] - - -//! [26] -QList list; -list << 1.2 << 0.5 << 3.14; - -std::list stdlist = list.toStdList(); -//! [26] diff --git a/src/corelib/doc/src/includes/qfile-copy.qdocinc b/src/corelib/doc/src/includes/qfile-copy.qdocinc new file mode 100644 index 00000000..5ff68eac --- /dev/null +++ b/src/corelib/doc/src/includes/qfile-copy.qdocinc @@ -0,0 +1,11 @@ +This file is closed before it is copied. + +If the copied file is a symbolic link (symlink), the +file it refers to is copied, not the link itself. With the +exception of permissions, which are copied, no other file metadata +is copied. + +Returns \c true if successful; otherwise returns \c false. + +Note that if a file with the name \a newName already exists, +copy() returns \c false. This means QFile will not overwrite it. diff --git a/src/corelib/global/qcompilerdetection.h b/src/corelib/global/qcompilerdetection.h index ebffe741..412fea96 100644 --- a/src/corelib/global/qcompilerdetection.h +++ b/src/corelib/global/qcompilerdetection.h @@ -1371,6 +1371,7 @@ # undef QT_COMPILER_SUPPORTS_SSE4_2 # undef QT_COMPILER_SUPPORTS_AVX # undef QT_COMPILER_SUPPORTS_AVX2 +# undef QT_COMPILER_SUPPORTS_F16C #endif #if !defined(Q_PROCESSOR_ARM) # undef QT_COMPILER_SUPPORTS_NEON diff --git a/src/corelib/global/qfloat16_f16c.c b/src/corelib/global/qfloat16_f16c.c index ba1e16f4..d60a021b 100644 --- a/src/corelib/global/qfloat16_f16c.c +++ b/src/corelib/global/qfloat16_f16c.c @@ -40,13 +40,8 @@ #include "private/qsimd_p.h" // The x86 F16C instructions operate on AVX registers, so AVX support is -// required. We don't need to check for __F16C__ because we this file wouldn't -// have been compiled if the support was missing in the first place, and not -// all compilers define it. Technically, we didn't need to check for __AVX__ -// either. -#if !QT_COMPILER_SUPPORTS_HERE(AVX) -# error "AVX support required" -#endif +// required. +#if QT_COMPILER_SUPPORTS_HERE(AVX) #ifdef __cplusplus QT_BEGIN_NAMESPACE @@ -89,3 +84,5 @@ void qFloatFromFloat16_fast(float *out, const quint16 *in, qsizetype len) Q_DECL } // extern "C" QT_END_NAMESPACE #endif + +#endif // QT_COMPILER_SUPPORTS_HERE(AVX) diff --git a/src/corelib/global/qglobal.cpp b/src/corelib/global/qglobal.cpp index 0efcf6ba..ac2e85c5 100644 --- a/src/corelib/global/qglobal.cpp +++ b/src/corelib/global/qglobal.cpp @@ -499,6 +499,14 @@ Q_STATIC_ASSERT((std::is_same::value)); \since 4.2 Returns \c true if the flag \a flag is set, otherwise \c false. + + \note if \a flag contains multiple bits set to 1 (for instance, if + it's an enumerator equal to the bitwise-OR of other enumerators) + then this function will return \c true if and only if all the bits + are set in this flags object. On the other hand, if \a flag contains + no bits set to 1 (that is, its value as a integer is 0), then this + function will return \c true if and only if this flags object also + has no bits set to 1. */ /*! @@ -2256,7 +2264,17 @@ static const char *osVer_helper(QOperatingSystemVersion version = QOperatingSyst case Q_WINVER(6, 3): return workstation ? "8.1" : "Server 2012 R2"; case Q_WINVER(10, 0): - return workstation ? "10" : "Server 2016"; + if (workstation) { + if (osver.dwBuildNumber >= 22000) + return "11"; + return "10"; + } + // else: Server + if (osver.dwBuildNumber >= 20348) + return "Server 2022"; + if (osver.dwBuildNumber >= 17763) + return "Server 2019"; + return "Server 2016"; } #undef Q_WINVER // unknown, future version diff --git a/src/corelib/global/qglobal.h b/src/corelib/global/qglobal.h index 12ac48f3..450c1e58 100644 --- a/src/corelib/global/qglobal.h +++ b/src/corelib/global/qglobal.h @@ -1102,13 +1102,16 @@ QForeachContainer::type> qMakeForeachContainer(T &&t) } +#define Q_FOREACH_JOIN(A, B) Q_FOREACH_JOIN_IMPL(A, B) +#define Q_FOREACH_JOIN_IMPL(A, B) A ## B + #if __cplusplus >= 201703L // Use C++17 if statement with initializer. User's code ends up in a else so // scoping of different ifs is not broken -#define Q_FOREACH(variable, container) \ -for (auto _container_ = QtPrivate::qMakeForeachContainer(container); \ - _container_.i != _container_.e; ++_container_.i) \ - if (variable = *_container_.i; false) {} else +#define Q_FOREACH_IMPL(variable, name, container) \ + for (auto name = QtPrivate::qMakeForeachContainer(container); \ + name.i != name.e; ++name.i) \ + if (variable = *name.i; false) {} else #else // Explanation of the control word: // - it's initialized to 1 @@ -1119,12 +1122,15 @@ for (auto _container_ = QtPrivate::qMakeForeachContainer(container); \ // the outer loop to continue executing // - if there was a break inside the inner loop, it will exit with control still // set to 1; in that case, the outer loop will invert it to 0 and will exit too -#define Q_FOREACH(variable, container) \ -for (auto _container_ = QtPrivate::qMakeForeachContainer(container); \ - _container_.control && _container_.i != _container_.e; \ - ++_container_.i, _container_.control ^= 1) \ - for (variable = *_container_.i; _container_.control; _container_.control = 0) +#define Q_FOREACH_IMPL(variable, name, container) \ +for (auto name = QtPrivate::qMakeForeachContainer(container); \ + name.control && name.i != name.e; \ + ++name.i, name.control ^= 1) \ + for (variable = *name.i; name.control; name.control = 0) #endif + +#define Q_FOREACH(variable, container) \ + Q_FOREACH_IMPL(variable, Q_FOREACH_JOIN(_container_, __LINE__), container) #endif // QT_NO_FOREACH #define Q_FOREVER for(;;) diff --git a/src/corelib/global/qglobalstatic.h b/src/corelib/global/qglobalstatic.h index e56fe1db..d1e1107f 100644 --- a/src/corelib/global/qglobalstatic.h +++ b/src/corelib/global/qglobalstatic.h @@ -44,6 +44,8 @@ #include +#include + QT_BEGIN_NAMESPACE namespace QtGlobalStatic { @@ -86,7 +88,7 @@ enum GuardValues { static struct Holder : public HolderBase { \ Type value; \ Holder() \ - noexcept(noexcept(Type ARGS)) \ + noexcept(noexcept(typename std::remove_cv::type ARGS)) \ : value ARGS \ { guard.storeRelaxed(QtGlobalStatic::Initialized); } \ } holder; \ diff --git a/src/corelib/global/qlibraryinfo.cpp b/src/corelib/global/qlibraryinfo.cpp index 8ceb7634..a1558a6a 100644 --- a/src/corelib/global/qlibraryinfo.cpp +++ b/src/corelib/global/qlibraryinfo.cpp @@ -333,8 +333,10 @@ QLibraryInfo::buildDate() # define COMPILER_STRING "MSVC 2015" # elif _MSC_VER < 1917 # define COMPILER_STRING "MSVC 2017" -# elif _MSC_VER < 2000 +# elif _MSC_VER < 1930 # define COMPILER_STRING "MSVC 2019" +# elif _MSC_VER < 2000 +# define COMPILER_STRING "MSVC 2022" # else # define COMPILER_STRING "MSVC _MSC_VER " QT_STRINGIFY(_MSC_VER) # endif diff --git a/src/corelib/global/qnamespace.qdoc b/src/corelib/global/qnamespace.qdoc index 148055e2..97551212 100644 --- a/src/corelib/global/qnamespace.qdoc +++ b/src/corelib/global/qnamespace.qdoc @@ -117,7 +117,9 @@ \value AA_DontShowShortcutsInContextMenus Actions with the Shortcut property won't be shown in any shortcut menus unless specifically set by the QAction::shortcutVisibleInContextMenu property. This value was added - in Qt 5.10. + in Qt 5.10, and defaults to the preference reported by the implementation + of QPlatformIntegration::styleHint. To override the platform integration, + set this attribute after QCoreApplication has been instantiated. \value AA_NativeWindows Ensures that widgets have native windows. @@ -768,10 +770,26 @@ /*! \enum Qt::TimeSpec - \value LocalTime Locale dependent time (Timezones and Daylight Savings Time). - \value UTC Coordinated Universal Time, replaces Greenwich Mean Time. + \value LocalTime Local time, controlled by a system time-zone setting. + \value UTC Coordinated Universal Time. \value OffsetFromUTC An offset in seconds from Coordinated Universal Time. - \value TimeZone A named time zone using a specific set of Daylight Savings rules. + \value TimeZone A named time zone. + + Both LocalTime and TimeZone will take care of transitions, such as + the start and end of daylight-saving time. UTC is the standard + time relative to which time-zones are usually specified: Greenwich + Mean Time has zero offset from it. Neither UTC nor OffsetFromUTC + has any transitions. + + \note After a change to the system time-zone setting, the behavior + of LocalTime-based QDateTime objects created before the change is + undefined: QDateTime may have cached data that the change + invalidates. (This is not triggered by transitions of the system + time-zone.) In long-running processes, updates to the system's + time-zone data (e.g. when politicians change the rules for a zone) + may likewise lead to conflicts between the updated time-zone + information and data cached by QDateTime objects created before + the update, using either LocalTime or TimeZone. */ /*! @@ -2897,6 +2915,11 @@ the first item and continues until all items have been examined. \value MatchRecursive Searches the entire hierarchy. + \note Qt::MatchExactly, Qt::MatchContains, Qt::MatchStartsWith, + Qt::MatchEndsWith, Qt::MatchRegularExpression, Qt::MatchWildcard, and + Qt::MatchFixedString are mutually exclusive. The behavior achieved by + setting several of them in a Qt::MatchFlags argument is undefined. + \sa QString::compare(), QRegExp, QRegularExpression */ diff --git a/src/corelib/io/qabstractfileengine.cpp b/src/corelib/io/qabstractfileengine.cpp index 070139b6..ef6e91d8 100644 --- a/src/corelib/io/qabstractfileengine.cpp +++ b/src/corelib/io/qabstractfileengine.cpp @@ -101,7 +101,7 @@ QT_BEGIN_NAMESPACE \sa QAbstractFileEngine, QAbstractFileEngine::create() */ -static bool qt_file_engine_handlers_in_use = false; +static QBasicAtomicInt qt_file_engine_handlers_in_use = Q_BASIC_ATOMIC_INITIALIZER(false); /* All application-wide handlers are stored in this list. The mutex must be @@ -132,7 +132,7 @@ Q_GLOBAL_STATIC(QAbstractFileEngineHandlerList, fileEngineHandlers) QAbstractFileEngineHandler::QAbstractFileEngineHandler() { QWriteLocker locker(fileEngineHandlerMutex()); - qt_file_engine_handlers_in_use = true; + qt_file_engine_handlers_in_use.storeRelaxed(true); fileEngineHandlers()->prepend(this); } @@ -148,7 +148,7 @@ QAbstractFileEngineHandler::~QAbstractFileEngineHandler() QAbstractFileEngineHandlerList *handlers = fileEngineHandlers(); handlers->removeOne(this); if (handlers->isEmpty()) - qt_file_engine_handlers_in_use = false; + qt_file_engine_handlers_in_use.storeRelaxed(false); } } @@ -161,7 +161,7 @@ QAbstractFileEngine *qt_custom_file_engine_handler_create(const QString &path) { QAbstractFileEngine *engine = nullptr; - if (qt_file_engine_handlers_in_use) { + if (qt_file_engine_handlers_in_use.loadRelaxed()) { QReadLocker locker(fileEngineHandlerMutex()); // check for registered handlers that can load the file diff --git a/src/corelib/io/qdir.cpp b/src/corelib/io/qdir.cpp index ad0e0cc3..f7da997b 100644 --- a/src/corelib/io/qdir.cpp +++ b/src/corelib/io/qdir.cpp @@ -2011,6 +2011,8 @@ QChar QDir::separator() Returns \c true if the directory was successfully changed; otherwise returns \c false. + \snippet code/src_corelib_io_qdir.cpp 16 + \sa current(), currentPath(), home(), root(), temp() */ bool QDir::setCurrent(const QString &path) diff --git a/src/corelib/io/qfile.cpp b/src/corelib/io/qfile.cpp index 6dc7e05e..14ce49da 100644 --- a/src/corelib/io/qfile.cpp +++ b/src/corelib/io/qfile.cpp @@ -829,13 +829,9 @@ QFile::link(const QString &fileName, const QString &linkName) } /*! - Copies the file currently specified by fileName() to a file called - \a newName. Returns \c true if successful; otherwise returns \c false. + Copies the file named fileName() to \a newName. - Note that if a file with the name \a newName already exists, - copy() returns \c false (i.e. QFile will not overwrite it). - - The source file is closed before it is copied. + \include qfile-copy.qdocinc \sa setFileName() */ @@ -910,7 +906,7 @@ QFile::copy(const QString &newName) if (!error) { // Sync to disk if possible. Ignore errors (e.g. not supported). - d->fileEngine->syncToDisk(); + out.d_func()->fileEngine->syncToDisk(); if (!out.rename(newName)) { error = true; @@ -941,11 +937,9 @@ QFile::copy(const QString &newName) /*! \overload - Copies the file \a fileName to \a newName. Returns \c true if successful; - otherwise returns \c false. + Copies the file named \a fileName to \a newName. - If a file with the name \a newName already exists, copy() returns \c false - (i.e., QFile will not overwrite it). + \include qfile-copy.qdocinc \sa rename() */ diff --git a/src/corelib/io/qfilesystemengine_unix.cpp b/src/corelib/io/qfilesystemengine_unix.cpp index 24321714..b0e123a0 100644 --- a/src/corelib/io/qfilesystemengine_unix.cpp +++ b/src/corelib/io/qfilesystemengine_unix.cpp @@ -312,7 +312,7 @@ mtime(const T &statBuffer, int) static int qt_real_statx(int fd, const char *pathname, int flags, struct statx *statxBuffer) { unsigned mask = STATX_BASIC_STATS | STATX_BTIME; - int ret = statx(fd, pathname, flags, mask, statxBuffer); + int ret = statx(fd, pathname, flags | AT_NO_AUTOMOUNT, mask, statxBuffer); return ret == -1 ? -errno : 0; } diff --git a/src/corelib/io/qsettings_mac.cpp b/src/corelib/io/qsettings_mac.cpp index 443e6bb0..de146c6a 100644 --- a/src/corelib/io/qsettings_mac.cpp +++ b/src/corelib/io/qsettings_mac.cpp @@ -274,7 +274,15 @@ static QVariant qtValue(CFPropertyListRef cfvalue) } const QString str = QString::fromUtf8(byteArray.constData(), byteArray.size()); - return QSettingsPrivate::stringToVariant(str); + QVariant variant = QSettingsPrivate::stringToVariant(str); + if (variant == QVariant(str)) { + // We did not find an encoded variant in the string, + // so return the raw byte array instead. + byteArray.detach(); + return byteArray; + } + + return variant; } else if (typeId == CFDictionaryGetTypeID()) { CFDictionaryRef cfdict = static_cast(cfvalue); CFTypeID arrayTypeId = CFArrayGetTypeID(); diff --git a/src/corelib/io/qt_attribution.json b/src/corelib/io/qt_attribution.json index 9cf1081e..cc62beef 100644 --- a/src/corelib/io/qt_attribution.json +++ b/src/corelib/io/qt_attribution.json @@ -20,7 +20,7 @@ supported by Qt (by the QNetworkCookieJar class).", "Homepage": "Consult https://github.com/publicsuffix/list for the sha1 but download from ...", "Homepage": "http://publicsuffix.org/", - "Version": "f2cce86a42f38265c67caa32c6e0ff61793bb534, fetched on 2021-01-21", + "Version": "d4e247a71d1b6da08dad906b098c818493166fcc, fetched on 2021-06-11", "License": "Mozilla Public License 2.0", "LicenseFile": "PSL-LICENSE.txt", "LicenseId": "MPL-2.0", diff --git a/src/corelib/io/qurl.cpp b/src/corelib/io/qurl.cpp index 31bb23b7..50512a4a 100644 --- a/src/corelib/io/qurl.cpp +++ b/src/corelib/io/qurl.cpp @@ -413,7 +413,6 @@ #include "qstringlist.h" #include "qdebug.h" #include "qhash.h" -#include "qdir.h" // for QDir::fromNativeSeparators #include "qdatastream.h" #if QT_CONFIG(topleveldomain) // ### Qt6: Remove section #include "qtldurl_p.h" @@ -3641,6 +3640,8 @@ bool QUrl::operator <(const QUrl &url) const /*! Returns \c true if this URL and the given \a url are equal; otherwise returns \c false. + + \sa matches() */ bool QUrl::operator ==(const QUrl &url) const { @@ -3748,6 +3749,8 @@ bool QUrl::matches(const QUrl &url, FormattingOptions options) const /*! Returns \c true if this URL and the given \a url are not equal; otherwise returns \c false. + + \sa matches() */ bool QUrl::operator !=(const QUrl &url) const { @@ -3816,6 +3819,25 @@ bool QUrl::isDetached() const return !d || d->ref.loadRelaxed() == 1; } +static QString fromNativeSeparators(const QString &pathName) +{ +#if defined(Q_OS_WIN) + QString result(pathName); + const QChar nativeSeparator = u'\\'; + auto i = result.indexOf(nativeSeparator); + if (i != -1) { + QChar * const data = result.data(); + const auto length = result.length(); + for (; i < length; ++i) { + if (data[i] == nativeSeparator) + data[i] = u'/'; + } + } + return result; +#else + return pathName; +#endif +} /*! Returns a QUrl representation of \a localFile, interpreted as a local @@ -3854,7 +3876,7 @@ QUrl QUrl::fromLocalFile(const QString &localFile) if (localFile.isEmpty()) return url; QString scheme = fileScheme(); - QString deslashified = QDir::fromNativeSeparators(localFile); + QString deslashified = fromNativeSeparators(localFile); // magic for drives on windows if (deslashified.length() > 1 && deslashified.at(1) == QLatin1Char(':') && deslashified.at(0) != QLatin1Char('/')) { diff --git a/src/corelib/io/qurltlds_p.h b/src/corelib/io/qurltlds_p.h index 60c3eaa5..1353210a 100644 --- a/src/corelib/io/qurltlds_p.h +++ b/src/corelib/io/qurltlds_p.h @@ -61,14843 +61,14953 @@ QT_BEGIN_NAMESPACE // for instructions see the program at // util/corelib/qurl-generateTLDs/ -static const quint16 tldCount = 9117; +static const quint16 tldCount = 9177; static const quint32 tldIndices[] = { 0, -39, -64, -81, -81, -81, +17, +36, +56, +62, +62, +69, +69, +69, +75, 87, -113, -134, -134, -152, -152, -160, -177, -183, -218, -244, -244, +153, +174, +174, +174, +198, +198, +198, +215, +215, +240, +255, 264, -271, -284, -306, -336, -360, -360, -383, -394, -394, -394, -394, -394, -399, -399, -399, -416, -443, +288, +314, +328, +328, +344, +344, +396, +396, +420, +449, +449, 454, -454, -454, -479, -500, -507, -507, -507, -541, -541, -541, -548, -562, -562, -593, +463, +463, +469, +475, +498, +516, +523, +523, +550, +561, 597, -635, -641, -641, -652, -665, -665, -680, -680, -699, -699, -709, -709, -709, -724, -730, -776, -785, -791, +608, +608, +626, +636, +636, +647, +647, +647, +647, +675, +715, +715, +732, +732, +745, +753, +768, +787, 799, -805, -828, -834, -843, -853, -853, -882, -882, -882, -882, -892, -897, -903, +799, +806, +814, +840, +849, +849, +860, +881, +881, +881, 913, -913, -930, -936, -948, -977, -1032, -1048, -1061, -1061, -1067, -1095, -1095, -1121, -1121, -1130, -1146, -1172, -1172, -1172, -1172, -1172, -1172, -1172, -1178, -1178, -1197, -1225, -1225, -1235, -1254, -1254, -1280, -1302, +926, +946, +946, +946, +946, +946, +952, +971, +971, +978, +996, +1002, +1019, +1019, +1025, +1059, +1059, +1059, +1082, +1082, +1082, +1110, +1117, +1117, +1123, +1139, +1139, +1160, +1170, +1191, +1191, +1191, +1207, +1217, +1217, +1232, +1238, +1245, +1279, +1299, 1319, -1346, -1354, -1391, -1395, -1411, -1436, -1452, -1458, -1458, -1477, -1481, -1481, -1481, -1481, -1492, -1499, -1499, -1515, -1543, -1543, -1543, -1543, -1555, -1559, -1574, -1574, -1598, -1630, -1642, -1654, -1654, -1670, -1670, -1686, -1710, -1710, -1726, -1726, -1742, -1756, -1756, -1756, -1769, -1804, +1336, +1336, +1342, +1357, +1363, +1370, +1370, +1380, +1400, +1405, +1424, +1430, +1430, +1430, +1438, +1438, +1457, +1475, +1493, +1493, +1529, +1541, +1556, +1556, +1563, +1563, +1563, +1576, +1618, +1656, +1685, +1706, +1721, +1741, +1761, +1781, +1797, +1797, +1797, 1804, 1810, 1816, -1832, -1832, -1832, -1838, +1816, +1816, 1854, -1854, -1854, -1854, -1858, -1885, -1924, -1952, -1967, -1967, -1977, -2005, -2024, +1860, +1860, +1899, +1899, +1933, +1945, +1945, +1958, +1986, +1986, +1992, +2007, +2013, +2013, +2019, +2019, +2025, 2036, -2084, -2100, -2126, -2126, -2138, -2174, -2201, -2246, -2246, -2279, -2286, -2330, -2366, -2366, -2372, -2415, -2424, -2443, -2462, -2482, -2488, -2534, -2534, -2557, -2587, -2597, -2623, -2623, -2642, -2686, -2698, -2717, -2754, -2754, +2036, +2036, +2036, +2036, +2036, +2111, +2111, +2111, +2147, +2147, +2158, +2163, +2176, +2176, +2195, +2202, +2216, +2222, +2254, +2284, +2284, +2297, +2319, +2319, +2325, +2340, +2350, +2357, +2362, +2362, +2362, +2380, +2387, +2400, +2400, +2400, +2448, +2448, +2455, +2463, +2478, +2501, +2520, +2538, +2565, +2584, +2591, +2610, +2610, +2651, +2651, +2667, +2667, +2695, +2704, +2716, +2716, +2716, +2723, +2723, +2759, +2759, +2765, 2771, -2795, -2828, -2855, -2884, -2944, +2799, +2818, +2836, +2836, +2848, +2848, +2848, +2859, +2869, +2878, +2878, +2902, +2902, +2902, +2919, +2954, +2954, +2954, +2965, 2980, 2980, -3042, -3042, -3110, -3117, -3127, -3140, -3154, -3164, -3164, -3164, -3169, -3213, -3231, -3253, -3260, -3298, +3012, +3018, +3025, +3062, +3062, +3092, +3104, +3104, +3116, +3122, +3141, +3165, +3165, +3199, +3242, +3273, +3273, +3291, 3322, -3322, -3365, -3376, -3386, -3386, -3393, -3401, -3417, -3417, -3430, +3336, +3375, +3375, +3381, +3412, +3412, +3412, +3434, +3448, +3482, +3482, +3482, 3488, -3488, -3516, +3497, +3510, +3521, +3558, 3563, -3578, +3563, +3581, +3581, +3581, +3587, +3587, +3587, 3593, -3609, -3624, -3624, -3638, -3675, -3721, -3731, -3731, +3616, +3616, +3654, +3670, +3670, +3676, +3688, +3715, 3736, -3751, -3780, -3820, -3820, -3858, -3868, -3920, -3926, -3947, -3947, -3961, -3961, -3961, -3978, -3978, -3987, -4006, -4015, -4031, -4037, -4056, -4067, -4067, -4067, -4067, -4091, -4091, -4099, -4099, -4117, -4153, -4170, -4170, -4187, -4187, -4187, -4205, -4205, -4205, -4205, -4226, -4226, -4226, -4226, -4234, -4252, -4252, -4260, -4260, -4260, -4278, -4313, -4313, -4331, -4344, -4390, -4390, -4390, -4414, -4435, -4435, -4435, -4450, -4467, -4467, -4467, -4467, -4467, -4479, +3763, +3799, +3806, +3813, +3822, +3828, +3871, +3881, +3897, +3897, +3897, +3897, +3897, +3906, +3906, +3916, +3933, +3943, +3943, +3963, +3970, +3996, +4010, +4063, +4063, +4081, +4081, +4092, +4097, +4097, +4097, +4136, +4136, +4146, +4175, +4183, +4183, +4183, +4183, +4199, +4199, +4206, +4206, +4206, +4216, +4224, +4231, +4236, +4236, +4236, +4243, +4243, +4256, +4256, +4262, +4262, +4262, +4272, +4294, +4298, +4298, +4304, +4314, +4314, +4314, +4333, +4357, +4384, +4384, +4384, +4389, +4419, +4419, +4425, +4425, +4446, +4485, +4501, 4535, -4584, -4595, -4595, -4595, -4654, -4669, -4669, -4669, -4713, -4734, -4776, -4776, -4811, -4811, -4828, +4535, +4555, +4555, +4555, +4577, +4577, +4594, +4594, +4594, +4594, +4594, +4594, +4594, +4594, +4594, +4594, +4604, +4604, +4604, +4604, +4623, +4623, +4648, +4658, +4658, +4665, +4695, +4719, +4742, +4742, +4763, +4763, +4784, +4788, +4794, +4794, +4810, +4827, +4827, 4839, 4839, 4839, -4857, -4887, -4887, -4921, -4932, +4839, +4875, +4884, +4884, +4914, +4933, 4948, -4953, -4953, -4965, -4970, -4970, -4970, -4998, -5013, -5013, -5013, -5013, -5013, -5013, -5030, -5048, -5048, -5048, -5048, -5048, -5048, -5078, -5078, -5078, -5078, -5078, -5103, -5127, -5127, +4948, +4992, +5018, +5043, +5058, +5068, +5068, +5090, +5090, +5096, +5117, +5117, +5117, +5123, +5132, 5150, -5164, -5164, -5164, -5175, -5183, -5211, -5211, -5227, -5239, -5239, -5249, +5150, +5166, +5172, +5172, +5184, +5184, +5188, +5209, +5245, +5245, +5245, 5261, -5277, -5277, -5277, -5277, -5296, -5296, -5336, -5336, -5336, -5342, -5342, -5342, -5386, -5419, -5441, -5466, -5466, -5466, -5488, -5488, -5507, -5511, -5511, -5528, -5545, -5545, -5573, -5573, -5588, -5614, -5624, -5624, -5634, -5634, -5661, -5661, -5661, -5679, -5679, -5679, -5689, -5709, -5709, -5747, -5759, -5759, -5759, -5759, -5759, -5759, -5777, -5794, -5834, -5854, -5854, -5873, +5261, +5269, +5269, +5319, +5319, +5319, +5319, +5319, +5334, +5334, +5344, +5381, +5402, +5411, +5446, +5482, +5482, +5498, +5506, +5513, +5531, +5531, +5551, +5555, +5555, +5555, +5577, +5581, +5609, +5609, +5609, +5627, +5627, +5627, +5650, +5667, +5671, +5671, +5677, +5698, +5705, +5705, +5721, +5738, +5755, +5762, +5762, +5762, +5785, +5822, +5822, +5860, 5894, -5918, -5993, -5993, -5993, -6020, -6020, -6020, -6039, -6039, -6062, -6062, -6067, -6067, -6067, -6074, -6088, -6105, -6118, -6138, -6138, -6161, -6161, -6161, -6169, -6169, -6169, -6175, -6175, -6196, -6215, -6280, +5894, +5913, +5913, +5926, +5932, +5932, +5932, +5943, +5963, +5963, +5963, +5986, +5986, +6002, +6012, +6012, +6012, +6012, +6019, +6019, +6023, +6079, +6079, +6083, +6094, +6094, +6111, +6117, +6117, +6117, +6124, +6134, +6147, +6147, +6147, +6153, +6157, +6157, +6157, +6173, +6185, +6205, +6216, +6216, +6248, +6259, +6269, +6269, 6297, -6317, -6321, -6357, -6399, +6320, +6336, +6336, +6356, +6362, +6396, +6396, +6413, 6420, -6420, -6420, -6420, -6420, -6420, -6456, -6482, -6482, -6482, -6536, -6541, -6554, -6578, -6578, -6602, -6602, -6618, -6618, -6618, -6618, -6618, -6626, -6626, -6626, -6626, -6626, +6444, +6444, +6444, +6500, +6512, +6512, +6512, +6512, +6518, +6526, +6526, +6539, +6539, +6557, +6557, +6557, +6571, +6583, +6628, +6628, +6628, 6640, 6640, 6640, -6656, -6656, -6656, 6662, -6662, -6662, -6662, -6678, -6678, -6725, -6744, -6744, -6744, -6753, -6762, -6775, -6799, -6812, -6826, -6836, -6836, -6858, -6914, -6914, -6949, -6989, -6989, -6999, -6999, -7008, -7008, -7014, -7040, -7078, -7096, -7113, -7113, -7130, -7130, -7130, -7130, -7153, -7153, -7153, -7159, -7159, -7159, -7175, -7175, -7175, -7190, -7222, -7222, -7222, -7240, -7240, -7276, -7283, -7310, -7310, -7310, -7310, -7323, -7341, -7341, -7366, -7366, -7366, -7415, -7415, -7415, -7420, -7420, -7438, -7446, -7457, -7475, -7493, -7493, -7528, -7569, -7569, -7569, -7584, -7584, -7593, -7593, -7593, -7593, -7601, -7622, -7633, -7670, -7670, -7701, -7701, -7725, -7764, -7764, -7783, -7783, -7783, -7806, -7806, -7806, -7849, -7854, -7887, -7887, -7894, -7901, -7921, -7921, -7928, -7934, -7934, -7971, -7995, -8010, -8010, -8029, -8067, +6674, +6693, +6693, +6693, +6693, +6718, +6729, +6751, +6751, +6751, +6801, +6811, +6831, +6831, +6831, +6831, +6850, +6869, +6869, +6911, +6922, +6922, +6951, +6951, +6978, +7027, +7027, +7027, +7033, +7033, +7033, +7033, +7057, +7063, +7063, +7081, +7098, +7098, +7098, +7108, +7108, +7108, +7145, +7145, +7145, +7162, +7162, +7162, +7162, +7162, +7162, +7220, +7232, +7239, +7264, +7264, +7268, +7268, +7299, +7299, +7299, +7327, +7346, +7346, +7363, +7377, +7377, +7377, +7392, +7419, +7419, +7419, +7428, +7455, +7455, +7476, +7476, +7501, +7501, +7501, +7501, +7501, +7552, +7574, +7585, +7595, +7595, +7630, +7659, +7659, +7659, +7663, +7663, +7683, +7683, +7711, +7748, +7748, +7772, +7772, +7782, +7794, +7819, +7833, +7840, +7861, +7879, +7910, +7943, +7965, +7979, +7989, +7989, +7989, +8012, +8038, +8058, 8081, -8095, -8114, -8137, -8137, -8137, -8160, -8160, -8167, -8180, -8184, -8237, -8250, -8268, -8268, +8081, +8085, +8107, +8143, +8143, +8151, +8151, +8151, +8193, +8193, +8193, +8193, +8203, +8221, +8221, +8221, +8221, +8251, +8251, +8256, 8286, -8306, -8313, -8320, -8320, -8337, -8359, -8389, -8403, -8470, -8470, -8470, -8483, -8498, -8527, -8531, -8531, -8551, -8563, -8581, -8588, +8286, +8351, +8351, +8367, +8367, +8367, +8392, +8392, +8392, +8392, +8398, +8398, +8398, +8437, +8467, +8472, +8495, +8510, +8517, +8517, +8539, +8570, +8570, 8594, -8601, -8601, -8608, -8608, -8646, -8694, -8705, -8705, -8712, -8716, -8744, -8770, -8783, -8794, -8804, -8820, +8594, +8594, +8594, +8594, +8604, +8604, +8638, +8670, +8720, +8720, +8749, +8749, +8765, +8765, +8765, +8776, +8786, +8795, +8795, +8795, +8795, +8795, +8812, 8827, -8827, -8837, -8866, -8866, -8883, -8910, -8910, -8925, -8925, -8925, -8948, -8964, -8971, -8986, -8986, -8986, -9001, -9001, -9019, +8841, +8841, +8848, +8848, +8848, +8855, +8867, +8867, +8867, +8867, +8867, +8867, +8900, +8900, +8900, +8915, +8953, +8987, +9011, +9032, 9043, -9074, -9081, -9117, -9117, +9043, +9043, +9043, +9043, +9043, +9043, +9043, +9043, +9053, +9053, +9068, +9079, +9089, +9094, +9099, +9099, 9126, -9155, -9159, -9159, -9168, -9186, -9217, -9249, -9262, -9262, -9275, -9296, -9319, -9319, -9355, -9371, -9378, -9419, -9448, -9448, -9455, -9472, -9492, -9492, -9530, -9551, -9573, -9598, -9598, -9631, -9671, -9671, -9676, -9676, -9686, -9691, -9725, -9737, -9752, -9757, -9788, -9788, -9788, -9788, -9795, -9815, -9822, -9822, -9822, -9838, -9845, -9852, -9862, -9869, -9884, +9126, +9150, +9150, +9150, +9150, +9171, +9171, +9171, +9196, +9196, +9233, +9233, +9261, +9261, +9261, +9261, +9280, +9294, +9307, +9307, +9342, +9342, +9373, +9384, +9384, +9384, +9384, +9384, +9394, +9394, +9410, +9410, +9410, +9425, +9442, +9442, +9442, +9442, +9471, +9471, +9471, +9500, +9500, +9510, +9531, +9531, +9561, +9577, +9612, +9642, +9657, +9657, +9657, +9692, +9692, +9692, +9696, +9696, +9714, +9714, +9714, +9730, +9739, +9739, +9739, +9749, +9749, +9770, +9770, +9770, +9775, +9789, +9818, +9818, +9818, +9834, +9834, +9834, +9841, +9868, +9868, +9868, +9875, 9893, -9893, -9893, -9893, -9934, -9934, -9941, -9941, -9948, -9948, -9993, -9993, -9993, -9993, -10013, -10013, -10020, -10020, -10044, -10056, -10056, -10062, -10077, -10119, -10161, -10183, -10190, -10208, -10232, -10245, -10289, -10296, -10303, -10329, -10336, -10366, -10391, -10407, -10407, -10427, -10459, -10482, -10489, -10496, -10503, -10516, -10533, -10551, -10558, -10558, -10565, -10581, -10595, -10602, -10602, -10602, -10609, -10609, -10622, -10622, -10636, +9905, +9905, +9909, +9921, +9938, +9958, +9983, +9983, +10000, +10016, +10016, +10030, +10030, +10030, +10030, +10046, +10066, +10094, +10104, +10118, +10137, +10154, +10177, +10225, +10246, +10264, +10272, +10280, +10299, +10299, +10299, +10304, +10304, +10325, +10344, +10372, +10406, +10424, +10424, +10429, +10429, +10444, +10487, +10500, +10525, +10525, +10525, +10540, +10545, +10554, +10554, +10554, +10554, +10564, +10596, +10617, +10623, +10629, +10643, +10651, 10684, -10710, -10724, -10738, -10745, -10763, -10770, -10797, -10817, -10844, -10858, -10881, -10898, -10909, -10916, -10916, -10916, -10916, -10941, -10951, -10951, -10978, -10995, -10995, -11011, -11036, -11058, -11065, -11065, -11099, -11115, -11154, -11154, -11168, -11199, -11199, -11206, -11214, -11245, -11277, -11304, -11329, -11347, -11356, -11356, -11381, -11407, -11414, -11437, -11482, -11526, -11526, -11562, -11569, -11584, -11628, -11660, -11690, -11699, -11728, -11738, -11738, -11738, -11750, -11767, -11767, -11806, -11816, -11848, -11867, -11871, -11903, -11920, -11932, -11943, -11979, -11994, -12012, -12055, -12062, -12075, -12092, -12098, -12146, -12153, -12153, -12164, -12172, -12197, -12197, -12197, -12204, -12204, -12204, -12235, -12253, -12267, -12304, -12311, -12335, -12354, -12378, -12427, -12437, -12437, -12479, -12486, -12522, -12535, -12542, -12549, +10684, +10704, +10726, +10746, +10758, +10762, +10791, +10806, +10823, +10870, +10877, +10900, +10900, +10922, +10928, +10928, +10949, +11008, +11008, +11048, +11066, +11103, +11103, +11103, +11103, +11103, +11103, +11103, +11103, +11120, +11120, +11120, +11120, +11120, +11120, +11135, +11135, +11135, +11135, +11135, +11155, +11155, +11167, +11167, +11176, +11176, +11187, +11217, +11217, +11225, +11235, +11243, +11262, +11267, +11294, +11307, +11324, +11333, +11343, +11357, +11357, +11357, +11373, +11391, +11408, +11461, +11481, +11500, +11500, +11507, +11511, +11523, +11530, +11571, +11588, +11617, +11639, +11639, +11639, +11664, +11671, +11676, +11708, +11708, +11708, +11708, +11724, +11724, +11731, +11731, +11731, +11731, +11769, +11769, +11769, +11779, +11779, +11791, +11807, +11813, +11813, +11820, +11835, +11847, +11877, +11912, +11917, +11924, +11941, +11953, +11973, +11973, +11983, +12001, +12028, +12042, +12042, +12095, +12095, +12095, +12095, +12095, +12095, +12102, +12112, +12126, +12126, +12145, +12152, +12189, +12205, +12214, +12214, +12231, +12247, +12247, +12293, +12348, +12361, +12389, +12389, +12423, +12423, +12423, +12439, +12439, +12439, +12439, +12439, +12439, +12447, +12447, +12507, +12512, +12512, +12512, +12528, +12528, +12528, +12528, +12528, 12559, 12566, -12578, -12611, -12628, -12652, -12665, -12671, -12712, -12712, -12712, -12712, -12729, -12729, -12746, -12751, -12779, -12779, -12786, -12824, -12841, -12848, -12869, -12876, -12876, -12876, -12898, -12930, -12951, -12969, -13013, -13019, -13019, -13019, -13026, -13026, +12592, +12592, +12597, +12603, +12603, +12603, +12620, +12644, +12644, +12644, +12644, +12666, +12714, +12731, +12731, +12745, +12782, +12791, +12791, +12816, +12832, +12854, +12892, +12892, +12892, +12907, +12928, +12939, +12977, +12996, +12996, +13022, +13027, +13039, +13039, +13039, +13039, +13039, 13049, -13073, -13105, -13125, -13141, -13141, -13182, -13192, -13192, -13228, -13228, -13241, -13282, -13282, -13282, -13282, -13297, -13297, -13297, -13315, -13324, -13335, -13382, -13391, -13391, -13417, -13417, -13440, -13469, -13476, -13496, -13530, -13530, -13548, -13548, -13570, -13580, -13580, -13599, -13609, -13627, -13627, -13634, -13634, -13634, -13634, -13634, -13663, -13663, -13663, -13674, -13674, -13686, -13686, +13088, +13116, +13116, +13156, +13156, +13156, +13156, +13164, +13174, +13174, +13184, +13229, +13229, +13267, +13267, +13267, +13272, +13299, +13299, +13316, +13338, +13338, +13338, +13370, +13370, +13370, +13374, +13394, +13410, +13416, +13459, +13459, +13468, +13468, +13472, +13477, +13488, +13488, +13516, +13528, +13528, +13568, +13579, +13583, +13583, +13608, +13608, +13618, +13676, +13681, +13690, +13690, 13707, -13714, -13714, -13714, -13733, -13733, -13781, -13793, -13793, -13793, -13809, -13809, -13825, -13876, -13886, -13896, -13925, -13958, -13958, -13999, -13999, -13999, -13999, -14018, -14039, -14039, -14046, -14055, -14055, -14059, -14100, -14115, -14129, -14142, -14142, -14148, -14173, -14209, -14209, -14209, -14224, -14224, -14224, -14224, -14224, -14224, -14229, -14244, -14263, -14263, -14271, -14271, -14271, -14288, -14288, -14288, -14335, -14335, -14344, -14363, -14363, -14363, -14394, -14415, -14446, -14495, -14512, -14512, -14518, -14535, -14535, -14548, -14557, -14571, -14582, -14614, -14614, -14635, -14649, -14649, -14656, -14663, -14684, -14689, -14689, -14689, -14689, -14689, -14689, -14689, -14701, -14701, -14713, -14713, -14725, -14725, -14725, -14725, -14762, -14807, -14807, -14814, -14834, -14846, -14846, -14857, -14864, -14864, -14871, -14879, -14879, -14892, -14892, -14932, -14932, +13707, +13707, +13707, +13726, +13726, +13764, +13775, +13775, +13775, +13811, +13842, +13858, +13873, +13885, +13924, +13924, +13924, +13924, +13969, +13984, +13991, +13991, +13991, +13991, +13991, +13991, +14000, +14000, +14000, +14038, +14057, +14057, +14057, +14057, +14057, +14087, +14095, +14106, +14116, +14159, +14167, +14199, +14199, +14199, +14211, +14211, +14217, +14230, +14251, +14251, +14261, +14286, +14290, +14300, +14300, +14300, +14327, +14342, +14356, +14381, +14381, +14381, +14381, +14381, +14402, +14409, +14409, +14419, +14419, +14440, +14444, +14444, +14467, +14467, +14477, +14493, +14511, +14519, +14519, +14576, +14605, +14620, +14647, +14688, +14688, +14719, +14728, +14728, +14732, +14741, +14741, +14741, +14741, +14805, +14805, +14805, +14810, +14810, +14891, +14915, 14942, -14949, -14949, -14961, -14961, -14976, -14990, -14990, -15038, -15038, -15057, -15078, -15078, -15078, -15078, -15091, -15091, +14954, +14954, +14964, +15008, +15008, +15018, +15050, +15063, +15081, 15098, 15098, 15098, -15105, -15105, -15105, -15105, -15105, -15105, -15105, -15113, -15128, -15140, -15140, -15140, -15152, -15164, -15178, -15195, -15207, -15223, +15110, +15110, +15110, +15119, +15119, +15126, +15133, +15133, +15133, +15133, +15166, +15166, +15166, +15166, +15166, +15166, +15166, +15166, +15166, +15173, +15173, +15215, +15215, +15215, +15215, +15215, 15234, -15251, -15251, -15251, -15271, -15287, -15287, -15297, -15328, -15345, -15345, -15383, -15412, -15412, -15412, -15412, -15437, -15470, -15470, -15490, -15490, -15490, -15490, -15495, -15504, -15514, -15514, -15514, -15514, -15522, -15528, -15528, -15528, -15528, -15528, -15539, -15539, -15575, -15575, -15575, -15575, -15575, +15243, +15264, +15264, +15264, +15264, +15284, +15284, +15284, +15284, +15308, +15308, +15326, +15346, +15346, +15346, +15377, +15377, +15389, +15389, +15429, +15429, +15448, +15448, +15457, +15457, +15457, +15483, +15501, +15501, +15511, +15531, +15545, 15595, -15610, -15628, -15641, -15651, -15664, -15675, -15675, -15680, -15690, -15690, -15704, -15719, -15740, -15740, -15740, -15740, -15740, -15740, -15740, -15740, -15752, -15759, -15759, -15816, -15844, -15844, -15844, -15844, -15852, -15859, -15867, -15888, -15936, -15936, -15989, -16014, -16014, -16028, -16028, +15629, +15629, +15646, +15654, +15654, +15668, +15668, +15668, +15697, +15709, +15709, +15709, +15724, +15742, +15742, +15761, +15774, +15811, +15838, +15838, +15838, +15855, +15855, +15865, +15865, +15865, +15865, +15865, +15865, +15872, +15872, +15872, +15896, +15921, +15921, +15921, +15947, +15947, +15947, +15947, +15947, +15978, +15978, +15978, +16009, +16025, 16042, -16069, -16076, -16076, +16042, +16042, +16052, +16052, +16078, +16078, +16082, 16092, -16099, -16108, -16118, -16118, -16123, -16123, -16141, -16158, -16178, -16193, -16205, -16223, -16223, -16223, -16233, -16233, -16233, -16256, -16271, -16271, -16283, -16302, -16310, -16310, -16316, -16338, -16358, -16358, -16358, -16368, -16376, -16409, -16409, -16442, -16442, -16451, -16451, -16451, -16451, -16472, -16487, -16506, -16558, -16579, -16579, -16593, -16593, -16593, -16607, -16607, -16607, -16623, -16661, -16684, -16742, -16742, -16742, -16762, -16762, -16762, -16778, -16815, -16844, -16922, -16922, -16922, +16102, +16102, +16102, +16102, +16102, +16102, +16116, +16126, +16138, +16144, +16144, +16164, +16164, +16174, +16196, +16203, +16214, +16234, +16234, +16261, +16297, +16297, +16319, +16347, +16347, +16347, +16380, +16380, +16380, +16380, +16396, +16396, +16396, +16396, +16415, +16423, +16467, +16514, +16514, +16518, +16568, +16578, +16617, +16637, +16637, +16637, +16657, +16683, +16683, +16704, +16704, +16732, +16737, +16758, +16758, +16797, +16836, +16836, +16883, +16883, +16890, +16890, +16890, +16905, +16905, +16905, +16905, +16905, +16905, +16905, +16929, 16950, -16968, -16968, -16987, -17003, -17003, -17015, -17015, -17015, -17035, -17035, -17035, -17063, -17079, -17079, -17079, +16961, +16961, +17030, +17050, +17062, +17080, +17093, 17093, 17110, -17127, -17140, -17158, -17178, -17192, -17219, -17219, -17219, -17238, -17254, -17254, -17264, -17264, -17279, -17279, -17279, -17279, -17279, -17293, -17293, -17293, -17293, -17304, -17331, -17331, -17347, -17366, -17366, -17391, -17423, -17427, -17427, -17427, -17432, -17432, -17432, -17451, -17451, +17138, +17138, +17148, +17148, +17216, +17228, +17239, +17239, +17269, +17298, +17298, +17312, +17312, +17312, +17312, +17312, +17312, +17312, +17345, +17360, +17360, +17369, +17369, +17389, +17408, +17408, +17416, +17416, +17416, +17440, 17458, -17462, -17462, -17477, -17488, -17515, -17568, -17580, -17580, -17603, -17603, -17615, -17615, -17638, -17668, -17677, -17714, -17714, -17746, -17746, -17762, -17771, -17771, -17771, -17771, -17771, -17793, -17793, -17826, -17826, -17826, -17837, -17861, -17881, -17889, -17889, -17889, -17889, -17889, -17889, -17889, -17889, -17889, -17889, -17904, -17904, -17917, -17917, -17917, -17917, -17935, -17956, -17973, -18008, -18008, -18017, -18027, -18027, -18048, -18065, -18065, -18065, -18071, -18075, -18075, -18103, -18103, -18103, -18168, -18168, -18201, -18213, -18225, -18264, -18274, +17458, +17458, +17458, +17458, +17458, +17458, +17474, +17499, +17499, +17499, +17499, +17506, +17506, +17512, +17512, +17512, +17512, +17532, +17546, +17569, +17569, +17579, +17583, +17583, +17583, +17591, +17604, +17604, +17604, +17604, +17628, +17685, +17693, +17707, +17707, +17734, +17753, +17753, +17770, +17770, +17780, +17798, +17814, +17814, +17820, +17855, +17855, +17855, +17855, +17894, +17921, +17942, +17950, +17969, +17986, +17986, +17999, +18031, +18040, +18053, +18077, +18086, +18129, +18159, +18159, +18159, +18169, +18169, +18169, +18169, +18211, +18234, +18234, +18242, +18242, +18259, +18262, 18292, -18292, -18298, -18298, -18327, -18338, -18390, -18390, -18390, -18410, -18410, -18410, -18410, -18417, -18417, +18304, +18307, +18317, +18317, +18320, +18320, +18342, +18380, +18403, 18432, -18432, -18432, -18438, -18451, -18451, +18435, +18455, +18461, 18467, -18467, -18481, -18485, -18502, -18502, +18480, +18483, +18529, 18532, -18548, -18548, -18564, -18564, -18564, -18575, -18591, -18591, -18637, -18663, -18680, -18680, -18691, -18691, -18691, -18691, -18691, -18691, -18699, -18699, -18715, -18715, -18715, -18715, -18715, -18715, -18715, -18715, -18715, -18728, -18728, -18741, -18741, -18741, -18771, -18789, -18795, -18813, -18825, -18825, -18864, -18880, -18880, -18880, -18880, -18896, -18896, -18896, -18896, -18901, -18931, -18953, -18964, -18964, -18984, -18984, -18993, -19016, -19025, -19036, +18555, +18561, +18592, +18598, +18598, +18598, +18601, +18604, +18607, +18607, +18616, +18619, +18643, +18649, +18649, +18655, +18674, +18677, +18693, +18729, +18729, +18752, +18775, +18802, +18805, +18805, +18805, +18816, +18829, +18838, +18872, +18893, +18921, +18941, +18950, +18967, +18970, +18991, +19004, +19030, 19051, -19072, -19089, -19114, -19121, -19121, -19121, -19141, -19141, -19158, -19158, -19203, -19203, -19203, -19242, -19242, -19242, -19287, -19287, -19287, -19301, -19316, -19338, -19338, -19338, -19358, -19391, -19419, -19419, -19443, -19443, -19456, +19051, +19083, +19090, +19093, +19105, +19132, +19147, +19150, +19207, +19227, +19230, +19230, +19262, +19271, +19280, +19291, +19299, +19299, +19317, +19327, +19330, +19333, +19353, +19377, +19389, +19408, +19418, +19418, +19418, +19427, +19427, +19430, +19436, +19445, +19451, 19468, -19468, -19468, -19479, -19479, -19495, -19512, -19512, -19512, -19540, -19540, -19552, -19552, -19552, -19586, -19586, -19586, -19586, -19594, -19605, -19605, +19471, +19504, +19507, +19532, +19535, +19557, +19569, +19588, +19591, +19614, +19617, +19617, +19627, 19630, -19634, -19634, -19644, -19673, -19694, +19633, +19655, +19658, +19661, +19685, +19703, +19703, +19706, 19714, -19714, -19733, -19743, -19759, -19766, -19778, -19797, -19811, -19825, -19842, -19842, -19878, -19878, -19878, -19887, -19887, -19905, -19905, -19905, -19905, -19922, -19940, -19959, -19959, -19995, -20003, -20018, -20068, -20076, -20092, -20101, -20117, -20148, -20151, -20199, -20199, -20219, -20219, -20225, -20231, +19727, +19727, +19737, +19786, +19795, +19810, +19827, +19830, +19845, +19858, +19864, +19864, +19872, +19889, +19915, +19951, +19951, +19965, +19974, +19994, +20021, +20021, +20036, +20039, +20042, +20052, +20055, +20055, +20055, +20077, +20091, +20119, +20130, +20160, +20160, +20160, +20163, +20166, +20183, +20217, +20228, 20242, -20262, -20268, -20294, -20307, -20313, -20325, -20351, -20351, -20374, -20391, -20407, -20433, -20443, -20446, -20453, -20466, -20472, -20558, +20245, +20245, +20248, +20267, +20270, +20270, +20306, +20327, +20362, +20365, +20365, +20368, +20406, +20412, +20435, +20441, +20441, +20464, +20496, +20515, +20527, 20564, -20599, -20621, -20627, -20630, -20630, -20653, -20669, -20672, -20675, -20682, -20682, -20685, -20696, -20696, -20756, -20759, -20781, -20805, -20808, -20843, -20859, -20859, -20862, -20890, -20916, -20936, -20936, -20936, +20567, +20567, +20575, +20605, +20605, +20605, +20608, +20611, +20634, +20640, +20677, +20680, +20717, +20729, +20754, +20754, +20770, +20773, +20773, +20776, +20779, +20782, +20817, +20820, +20872, +20887, +20904, +20910, +20923, 20946, -20968, -20971, -20982, -20985, -20985, -20998, -21001, -21001, -21010, -21026, -21047, -21073, -21073, -21104, -21113, +20952, +20988, +20988, +20991, +21016, +21032, +21035, +21035, +21035, +21038, +21038, +21053, +21056, +21056, +21056, +21067, +21077, +21080, +21080, +21106, 21129, +21129, +21129, +21144, +21147, 21158, -21182, -21182, +21158, +21158, +21177, 21198, -21206, -21221, -21224, -21224, -21224, -21227, -21235, -21259, -21266, -21275, -21281, -21281, -21298, -21315, -21332, -21335, -21338, -21341, -21341, -21360, -21363, -21366, -21382, -21382, -21385, -21402, -21405, -21428, -21431, -21449, -21449, -21452, -21472, -21481, +21238, +21302, +21302, +21339, +21371, +21374, +21394, +21407, +21407, +21417, +21420, +21437, +21451, +21454, +21454, +21496, 21514, -21544, -21569, +21514, +21517, +21517, +21535, +21535, +21535, +21554, +21580, +21580, 21602, -21605, +21609, 21623, 21623, -21627, -21630, -21643, -21649, -21684, -21684, -21691, +21626, +21636, +21662, +21677, +21686, +21686, 21691, 21697, -21704, -21718, +21713, 21727, -21784, -21793, -21813, -21813, +21751, +21776, +21786, +21812, 21829, -21832, -21835, -21838, -21841, -21841, -21852, -21904, -21922, -21922, -21935, -21935, -21945, -21945, -21981, -21984, -21997, -22018, -22046, +21882, +21895, +21902, +21926, +21951, +21970, +21980, +21990, +22002, +22011, +22021, +22031, +22052, +22062, 22065, -22068, -22068, -22108, +22071, +22082, 22114, -22117, -22121, -22148, -22148, -22151, -22174, -22189, -22204, -22240, -22273, +22127, +22135, +22141, +22144, +22157, +22180, +22183, +22209, +22255, 22289, -22304, -22318, -22342, -22378, -22383, -22404, -22407, -22425, -22425, -22461, -22493, -22493, -22493, -22503, -22528, -22534, -22540, -22546, -22549, -22575, -22608, -22617, -22617, +22325, +22363, +22374, +22413, +22431, +22431, +22434, +22445, +22465, +22472, +22475, +22491, +22523, +22538, +22557, +22581, +22581, +22591, +22591, +22604, +22604, +22607, 22620, -22635, -22640, -22673, -22713, -22746, -22752, -22755, -22791, -22831, -22873, -22904, -22910, +22623, +22634, +22669, +22672, +22672, +22684, +22703, +22724, +22738, +22784, +22788, +22803, +22803, +22803, +22844, +22863, +22898, +22898, 22913, -22925, -22928, -22946, -22969, -23005, -23005, -23008, -23042, -23055, -23058, -23079, -23079, -23098, -23119, -23119, -23129, -23154, -23173, -23185, -23199, -23202, -23202, -23202, -23208, +22913, +22913, +22933, +22933, +22967, +22977, +23017, +23044, +23044, +23047, +23054, +23061, +23066, +23077, +23084, +23094, +23101, +23113, +23120, +23163, +23170, +23170, +23189, +23196, +23196, 23221, 23221, -23233, -23240, -23243, -23246, -23258, -23267, -23267, -23282, -23307, -23327, -23340, -23343, -23343, -23343, -23346, -23349, -23358, -23361, -23409, -23439, -23442, -23442, -23445, +23261, +23271, +23278, +23278, +23315, +23322, +23354, +23365, +23365, +23388, +23393, +23419, +23424, +23424, +23424, +23449, 23464, -23464, -23476, -23482, -23504, -23525, +23471, +23490, +23509, +23509, +23516, 23540, -23540, -23547, -23553, -23553, -23563, -23587, -23605, -23611, -23631, -23631, -23657, -23677, -23677, -23677, -23693, -23700, -23728, -23731, -23746, -23763, -23789, -23789, -23814, -23830, -23853, -23872, -23875, -23885, -23914, -23939, -23942, -23942, -23949, -23971, -23984, -23999, -24002, -24040, -24043, -24110, -24120, -24133, -24136, -24146, -24174, -24184, -24203, -24207, -24210, -24228, -24235, -24251, -24258, -24268, -24274, -24281, -24288, -24298, -24301, -24389, -24454, -24478, -24478, -24478, -24488, -24514, -24549, -24565, -24578, -24606, -24609, -24626, -24646, -24678, -24678, -24684, -24701, +23567, +23577, +23584, +23613, +23620, +23620, +23620, +23620, +23620, +23635, +23642, +23645, +23645, +23654, +23654, +23668, +23684, +23706, +23727, +23745, +23758, +23773, +23784, +23791, +23821, +23849, +23849, +23862, +23891, +23917, +23924, +23933, +23965, +23982, +23989, +24001, +24011, +24049, +24057, +24080, +24096, +24125, +24159, +24173, +24186, +24186, +24200, +24229, +24255, +24255, +24262, +24295, +24305, +24329, +24336, +24372, +24372, +24379, +24413, +24430, +24448, +24453, +24471, +24484, +24484, +24496, +24496, +24529, +24553, +24553, +24560, +24593, +24619, +24667, +24674, +24687, +24705, +24705, 24733, -24745, -24773, -24773, -24780, -24794, -24807, -24817, -24827, -24833, -24833, -24839, -24864, -24871, -24882, -24888, -24910, -24917, -24917, -24955, -24955, -24979, -24986, -24986, -24993, -25000, -25007, -25019, -25049, -25056, -25056, -25073, -25086, -25093, -25100, -25107, -25120, -25133, -25140, -25161, -25161, -25189, -25206, -25206, -25213, -25222, -25267, -25304, -25345, -25345, -25345, -25363, -25363, -25370, -25373, -25373, -25373, -25395, -25411, -25425, -25445, -25445, -25452, -25462, -25475, -25511, -25535, -25560, -25575, -25582, -25589, -25601, -25607, -25610, -25654, -25679, -25698, -25705, -25711, -25711, -25718, -25724, -25724, -25724, -25766, -25766, -25809, -25828, -25852, -25852, -25867, -25867, -25891, -25934, -25969, -25986, -26015, -26041, -26070, -26095, -26109, -26129, -26129, -26150, -26157, -26175, -26189, -26229, -26244, -26244, -26244, -26244, -26263, -26263, -26288, -26326, -26340, -26340, -26347, -26382, -26412, -26448, -26468, -26474, -26481, -26488, -26524, -26563, -26596, -26596, -26613, -26627, -26671, -26710, -26722, -26729, -26773, -26812, -26826, -26844, -26861, -26876, -26905, -26905, -26905, -26919, -26938, -26970, -26970, -26970, -26988, -27001, -27025, -27025, -27025, -27054, +24740, +24757, +24757, +24764, +24793, +24810, +24810, +24824, +24824, +24859, +24859, +24883, +24897, +24897, +24913, +24919, +24919, +24919, +24926, +24938, +24938, +24943, +24954, +24987, +25010, +25017, +25041, +25041, +25067, +25118, +25122, +25129, +25149, +25171, +25185, +25211, +25239, +25262, +25262, +25262, +25287, +25293, +25319, +25347, +25347, +25347, +25356, +25382, +25382, +25397, +25397, +25405, +25405, +25405, +25405, +25420, +25432, +25432, +25471, +25507, +25531, +25541, +25563, +25591, +25591, +25591, +25605, +25612, +25626, +25648, +25671, +25692, +25726, +25739, +25746, +25750, +25774, +25785, +25805, +25812, +25843, +25843, +25843, +25843, +25850, +25888, +25898, +25905, +25905, +25942, +25949, +25956, +25973, +25984, +25991, +26074, +26091, +26101, +26108, +26115, +26125, +26168, +26185, +26192, +26206, +26216, +26223, +26245, +26245, +26245, +26257, +26261, +26283, +26310, +26328, +26350, +26370, +26370, +26383, +26413, +26461, +26475, +26506, +26529, +26529, +26529, +26529, +26543, +26566, +26566, +26579, +26638, +26638, +26638, +26660, +26660, +26678, +26678, +26725, +26725, +26739, +26754, +26754, +26761, +26774, +26774, +26774, +26781, +26788, +26795, +26811, +26817, +26833, +26833, +26833, +26847, +26847, +26880, +26886, +26899, +26899, +26899, +26906, +26928, +26933, +26933, +26964, +26973, +26995, +26995, +26995, +27011, +27011, +27031, +27048, +27048, +27055, 27060, -27073, -27099, -27133, -27140, -27157, -27184, -27231, -27257, -27271, -27293, -27312, -27330, -27392, -27401, -27401, -27426, -27433, -27445, -27482, -27489, -27489, -27524, +27074, +27090, +27090, +27110, +27137, +27137, +27137, +27159, +27175, +27187, +27205, +27205, +27225, +27225, +27255, +27264, +27264, +27264, +27264, +27264, +27264, +27288, +27292, +27292, +27326, +27333, +27337, +27375, +27387, +27403, +27415, +27430, +27446, +27462, +27483, +27514, +27540, +27547, 27556, -27563, -27570, -27570, -27587, -27600, -27600, -27623, -27623, -27673, -27673, -27688, -27688, -27688, -27688, -27694, -27701, -27706, -27706, -27728, -27775, -27782, -27806, -27828, -27828, -27834, +27566, +27573, +27580, +27586, +27586, +27590, +27597, +27657, +27679, +27702, +27724, +27740, +27740, +27768, +27783, +27790, +27790, +27809, +27816, 27840, -27853, -27862, -27868, -27899, -27906, -27923, +27847, +27847, +27872, +27894, +27910, 27937, -27956, -27963, -27974, -27981, -28010, -28046, -28050, -28078, -28085, -28085, -28092, -28099, -28105, -28128, -28146, -28153, -28170, +27937, +27954, +27977, +27977, +27984, +27998, +28032, +28079, +28093, +28100, +28107, +28154, +28160, +28166, +28166, +28176, 28190, -28197, -28215, -28225, -28232, -28251, -28251, -28251, -28258, -28271, -28278, -28278, -28285, -28300, -28300, -28325, -28325, -28325, -28332, -28362, -28392, -28401, -28401, -28416, -28423, -28468, -28475, -28488, -28495, -28504, -28511, -28558, -28565, -28588, -28588, -28622, -28629, -28629, -28647, -28660, -28672, -28683, -28683, -28698, -28705, -28712, -28712, -28730, -28761, -28776, +28217, +28260, +28260, +28305, +28305, +28326, +28361, +28422, +28439, +28455, +28465, +28465, +28465, +28494, +28500, +28516, +28524, +28531, +28538, +28552, +28576, +28576, +28581, +28581, +28581, +28593, +28593, +28593, +28648, +28668, +28675, +28675, +28685, +28700, +28700, +28700, +28707, +28725, +28725, +28732, +28747, +28781, +28781, 28800, -28826, -28832, -28870, -28882, -28905, -28926, -28926, -28933, -28933, -28933, -28958, -28965, -28981, -28981, -28988, -29022, -29034, -29034, -29056, -29070, -29086, +28812, +28833, +28858, +28865, +28891, +28908, +28942, +28959, +28959, +28959, +28975, +28982, +28989, +28989, +28996, +29017, +29035, +29035, +29047, +29063, +29087, 29093, -29099, -29099, -29111, -29118, -29118, +29093, +29114, +29114, +29121, +29121, 29138, -29138, -29155, -29155, -29188, -29231, -29231, -29231, -29245, -29245, -29251, -29263, -29284, -29290, -29313, -29313, -29349, -29362, -29362, -29393, -29393, +29208, +29213, +29213, +29213, +29228, +29238, +29257, +29257, +29257, +29257, +29257, +29300, +29318, +29337, +29344, +29382, +29389, 29407, 29407, -29447, -29453, -29453, -29470, -29470, -29498, -29530, -29530, -29570, -29570, -29576, -29576, -29597, -29610, -29610, -29620, -29620, -29620, -29636, -29661, -29665, -29665, -29665, +29414, +29421, +29457, +29457, +29471, +29494, +29510, +29510, +29522, +29538, +29544, +29544, +29544, +29544, +29558, +29580, +29589, +29589, +29589, +29589, +29626, +29644, +29671, 29680, -29680, -29693, -29693, -29693, -29693, -29698, -29705, -29738, -29747, -29765, -29765, -29775, -29795, -29795, -29818, -29818, -29833, -29885, -29885, -29919, -29919, -29953, -29980, -29988, -30004, -30023, -30027, -30040, -30057, -30064, -30064, -30073, -30098, -30098, -30110, -30110, -30110, -30130, -30138, -30164, -30164, -30168, -30181, -30185, -30210, -30223, -30223, -30251, -30307, -30346, -30346, -30359, -30365, -30365, -30375, -30408, -30408, -30416, -30416, -30422, -30422, -30422, -30422, -30422, -30422, -30444, -30469, -30506, -30506, -30514, -30514, -30540, -30561, -30575, -30601, -30601, -30601, -30617, -30617, -30652, -30663, +29702, +29713, +29713, +29713, +29724, +29731, +29731, +29757, +29764, +29771, +29800, +29815, +29815, +29831, +29870, +29896, +29940, +29947, +29954, +29954, +29954, +29992, +30006, +30035, +30058, +30079, +30086, +30099, +30122, +30166, +30221, +30238, +30245, +30245, +30259, +30266, +30287, +30316, +30323, +30332, +30332, +30341, +30348, +30355, +30366, +30385, +30419, +30426, +30473, +30518, +30551, +30579, +30579, +30596, +30615, +30615, +30615, +30622, +30626, +30643, +30661, +30661, +30661, +30661, 30667, -30674, -30688, -30695, -30725, -30725, -30749, -30760, -30778, -30786, -30786, -30799, -30805, -30809, -30809, -30845, -30845, -30845, -30871, -30871, -30911, -30932, -30932, -30947, -30953, -30957, +30699, +30699, +30721, +30746, +30746, +30758, +30783, +30801, +30824, +30824, +30843, +30876, +30909, +30929, 30976, -30976, -30985, +30986, 30991, -30991, -31008, -31024, -31055, -31055, -31072, -31112, -31120, -31128, -31137, -31181, -31205, -31205, -31205, -31205, -31205, -31227, -31227, -31234, -31273, -31273, -31273, -31273, -31281, -31317, -31327, -31348, -31384, -31392, -31409, -31409, -31417, -31446, -31446, -31446, -31446, -31446, -31463, -31463, -31463, -31463, -31463, -31483, -31490, -31490, -31500, -31500, -31500, -31525, -31584, -31584, -31594, -31594, -31594, -31636, -31647, -31647, -31667, -31667, -31688, -31692, -31692, -31704, -31719, -31734, -31734, -31739, -31739, -31739, -31755, +31005, +31026, +31026, +31045, +31113, +31153, +31160, +31167, +31183, +31210, +31225, +31231, +31247, +31247, +31265, +31288, +31359, +31365, +31376, +31376, +31391, +31391, +31391, +31395, +31395, +31408, +31414, +31434, +31448, +31474, +31491, +31511, +31520, +31548, +31578, +31578, +31578, +31578, +31602, +31609, +31645, +31652, +31671, +31677, +31712, +31726, +31737, +31737, +31737, +31744, +31744, +31744, +31751, +31751, +31762, +31762, +31769, +31776, 31786, -31807, -31807, -31807, -31807, -31822, -31834, -31838, -31856, -31856, -31876, -31884, -31908, -31908, -31908, -31912, -31932, -31954, -31960, -31960, -31990, -31990, -32000, -32000, -32029, -32054, -32094, -32101, -32101, -32111, -32111, +31802, +31802, +31817, +31832, +31852, +31852, +31852, +31859, +31866, +31889, +31889, +31896, +31903, +31903, +31910, +31920, +31945, +31952, +31952, +31969, +31969, +31985, +31985, +31985, +31985, +31985, +31985, +31985, +32009, +32025, +32025, +32058, +32071, +32114, +32114, +32128, +32152, +32159, +32159, +32159, +32166, +32187, +32187, +32200, 32200, -32217, 32226, -32230, -32230, -32230, -32230, -32244, -32270, -32270, -32295, -32311, -32311, -32311, -32325, -32329, -32341, -32350, -32387, -32404, -32414, -32422, -32443, +32226, +32233, +32233, +32233, +32242, +32242, +32242, +32282, +32282, +32282, +32282, +32282, +32282, +32289, +32305, +32312, +32312, +32317, +32357, +32357, +32378, +32378, +32393, +32393, +32400, +32423, +32423, +32423, +32431, +32431, +32431, 32449, -32449, -32449, -32469, -32489, -32489, -32496, -32496, -32502, -32502, -32507, -32524, -32542, -32551, -32571, -32604, -32620, -32639, -32663, -32668, -32674, -32689, -32710, -32710, -32710, -32710, -32720, -32720, -32720, -32775, -32775, -32775, -32775, -32828, -32864, -32864, -32864, -32864, -32880, -32901, -32928, -32953, -32964, -32964, -32976, -32976, -32976, -32976, -32976, -32997, -33013, -33043, -33043, -33075, -33107, -33122, -33168, -33182, -33193, -33193, -33218, -33218, -33234, -33240, -33264, -33304, -33347, -33359, -33359, -33359, -33359, -33368, -33384, -33384, -33428, -33428, -33428, -33428, -33450, +32470, +32494, +32494, +32494, +32501, +32501, +32543, +32561, +32581, +32581, +32629, +32644, +32662, +32673, +32673, +32696, +32705, +32722, +32722, +32728, +32763, +32787, +32803, +32803, +32818, +32865, +32865, +32875, +32882, +32911, +32911, +32943, +32973, +33000, +33018, +33018, +33024, +33060, +33060, +33071, +33071, +33071, +33071, +33085, +33110, +33149, +33149, +33157, +33157, +33206, +33206, +33206, +33206, +33222, +33242, +33242, +33252, +33252, +33252, +33252, +33271, +33285, +33301, +33301, +33301, +33332, +33360, +33360, +33360, +33360, +33398, +33398, +33398, +33398, +33412, +33412, +33412, +33412, +33412, 33459, -33459, -33478, -33489, -33489, -33489, -33496, -33496, -33507, -33541, -33577, -33577, -33587, -33587, -33604, -33616, -33642, -33642, -33642, -33642, -33642, -33642, -33654, -33662, -33662, -33662, -33679, -33679, -33716, -33716, -33726, -33726, -33733, -33733, -33766, -33766, -33766, -33770, -33770, -33782, -33806, -33815, -33815, -33834, -33834, -33834, -33834, -33850, -33864, -33885, -33885, -33895, -33895, -33895, -33931, +33482, +33486, +33486, +33499, +33514, +33514, +33545, +33545, +33545, +33567, +33567, +33567, +33584, +33589, +33605, +33620, +33635, +33667, +33695, +33706, +33722, +33751, +33758, +33758, +33764, +33764, +33764, +33781, +33793, +33804, +33804, +33819, +33826, +33826, +33826, +33826, +33826, +33835, +33835, +33835, +33848, +33862, +33862, +33862, +33866, 33938, 33938, -33944, +33938, +33938, +33955, 33971, -33977, -34000, -34000, -34032, -34036, -34036, -34053, -34053, -34068, -34082, -34082, -34099, -34110, -34110, -34115, -34148, -34148, -34148, -34148, -34161, +33971, +33971, +33983, +33983, +33990, +33990, +34027, +34050, +34050, +34054, +34079, +34079, +34079, +34109, +34124, +34140, +34140, +34140, +34140, +34152, +34163, +34163, 34175, -34194, -34194, -34194, -34249, -34249, +34214, +34214, +34221, +34221, +34231, +34231, +34231, 34253, 34253, -34253, -34253, -34253, -34264, -34264, -34264, -34272, -34272, -34279, -34284, -34292, -34317, -34323, -34323, -34323, -34360, -34360, -34380, -34411, -34411, -34433, -34433, -34454, -34454, -34454, -34477, -34477, -34481, -34481, -34498, -34504, -34504, -34521, -34521, -34556, -34566, -34572, -34593, -34593, -34617, -34617, -34617, -34640, -34640, -34640, -34658, +34270, +34270, +34270, +34303, +34303, +34319, +34325, +34335, +34344, +34357, +34373, +34393, +34393, +34431, +34461, +34471, +34471, +34471, +34492, +34527, +34527, +34535, +34547, +34547, +34554, +34558, +34558, +34558, +34558, +34613, +34613, +34613, +34647, 34665, -34680, -34698, -34698, -34698, -34723, -34723, -34723, -34723, -34729, -34753, -34768, -34768, -34768, -34768, -34768, -34768, -34768, -34768, -34786, -34799, -34824, -34824, -34839, -34859, -34897, -34897, -34897, -34906, -34945, -34945, -34987, -34987, -34987, -34987, +34691, +34695, +34713, +34727, +34760, +34760, +34760, +34765, +34765, +34787, +34787, +34787, +34814, +34820, +34834, +34834, +34866, +34881, +34881, +34881, +34881, +34881, +34881, +34902, +34907, +34907, +34917, +34917, +34917, +34917, +34928, +34933, +34960, +34972, +34972, +34981, 34993, -35016, -35025, -35035, -35035, +35003, +35003, +35003, +35013, +35013, +35054, +35067, +35067, +35067, 35074, -35074, -35080, -35080, -35091, -35098, -35119, -35147, -35147, -35147, -35159, -35165, -35165, -35165, -35177, -35204, -35211, -35211, -35211, -35233, -35233, -35233, -35241, -35241, -35241, -35273, -35273, -35273, -35296, -35303, -35303, -35308, -35308, -35308, -35336, +35081, +35105, +35120, +35120, +35120, +35120, +35142, +35148, +35148, +35173, +35205, +35205, +35214, +35234, +35266, +35266, +35266, +35276, +35290, +35320, 35344, -35355, -35360, -35360, -35385, -35403, -35403, -35436, -35436, -35436, -35447, -35447, -35470, -35476, -35517, -35528, -35537, -35537, -35537, -35563, -35611, -35622, -35622, -35631, -35631, -35655, -35655, -35661, -35661, -35674, -35687, -35687, -35693, -35693, -35702, -35711, -35711, -35722, -35722, -35741, -35759, -35759, -35775, -35775, -35775, -35775, -35782, -35782, -35845, -35845, -35865, -35903, +35373, +35408, +35435, +35463, +35500, +35500, +35500, +35511, +35516, +35516, +35516, +35522, +35522, +35544, +35544, +35566, +35566, +35582, +35594, +35594, +35594, +35594, +35594, +35636, +35636, +35654, +35660, +35680, +35708, +35708, +35729, +35729, +35729, +35734, +35751, +35751, +35766, +35766, +35791, +35791, +35809, +35809, +35809, +35825, +35875, +35875, +35888, 35927, -35949, -35955, -35961, -35961, -35974, -35998, -36040, -36040, -36058, -36058, -36058, -36093, -36093, -36093, -36093, -36135, -36143, -36160, -36171, -36180, -36189, -36196, -36196, -36196, -36224, -36255, -36262, -36337, -36337, -36337, -36349, -36356, -36370, -36401, +35927, +35933, +35933, +35942, +35960, +35960, +35972, +35991, +35991, +36005, +36041, +36041, +36091, +36091, +36115, +36136, +36152, +36168, +36179, +36209, +36227, +36236, +36263, +36263, +36263, +36263, +36263, +36281, +36292, +36292, +36301, +36301, +36372, +36372, +36377, 36401, 36420, -36420, 36434, -36434, -36462, -36462, -36474, -36481, -36481, -36481, -36481, -36481, -36481, -36481, -36488, -36488, -36488, -36505, -36544, -36571, -36571, -36587, +36442, +36442, +36442, +36476, +36515, +36536, +36570, +36570, +36580, +36580, +36580, +36580, +36580, +36598, +36598, +36598, 36616, -36616, -36628, -36680, -36690, -36690, -36711, -36732, -36732, -36736, -36754, -36754, -36761, -36761, -36794, -36812, -36849, -36860, -36860, -36898, -36918, -36927, -36944, -36957, -36957, -36962, -36977, +36635, +36641, +36641, +36641, +36641, +36641, +36641, +36651, +36685, +36685, +36689, +36689, +36689, +36689, +36689, +36694, +36723, +36735, +36757, +36757, +36757, +36757, +36757, +36783, +36783, +36807, +36835, +36835, +36866, +36879, +36885, +36900, +36919, +36961, +36978, +36987, 37000, -37017, -37017, -37017, -37017, -37032, -37032, -37038, -37054, -37054, -37063, -37063, -37063, -37088, -37135, -37145, -37156, +37044, +37076, +37087, +37103, +37117, +37117, +37128, +37151, 37169, -37181, -37210, -37254, -37254, -37285, -37316, -37333, -37378, -37391, -37422, -37444, -37444, -37444, -37444, -37444, -37460, -37460, -37518, -37518, -37541, -37576, -37593, -37610, -37614, -37619, -37625, -37625, -37629, -37649, -37670, -37698, -37714, -37727, -37739, -37739, -37739, -37762, -37762, -37790, -37790, -37807, -37807, -37807, -37862, -37878, -37893, -37900, -37920, -37951, -37951, +37196, +37226, +37226, +37252, +37252, +37252, +37275, +37292, +37292, +37292, +37292, +37292, +37292, +37292, +37292, +37292, +37324, +37335, +37335, +37352, +37358, +37377, +37399, +37410, +37445, +37445, +37451, +37451, +37451, +37462, +37510, +37510, +37555, +37555, +37555, +37555, +37555, +37569, +37620, +37631, +37648, +37656, +37666, +37673, +37697, +37697, +37723, +37769, +37769, +37769, +37788, +37826, +37851, +37851, +37851, +37851, +37873, +37873, +37873, +37891, +37891, +37891, +37904, +37909, +37909, +37909, +37909, +37916, +37943, +37954, +37954, +37964, 37976, -37985, -37985, -38021, -38051, -38065, -38065, -38065, -38065, -38081, -38081, -38112, -38112, -38150, -38150, -38150, -38150, -38150, -38150, -38150, -38167, -38178, -38206, -38238, -38238, -38261, -38296, -38296, -38321, -38321, -38363, -38389, -38389, -38389, -38403, -38403, -38415, -38431, -38431, -38445, -38473, -38525, -38571, -38578, -38578, -38578, +37976, +37989, +37989, +38018, +38018, +38018, +38018, +38025, +38025, +38037, +38074, +38091, +38091, +38091, +38104, +38104, +38104, +38136, +38136, +38163, +38163, +38199, +38218, +38218, +38218, +38218, +38258, +38258, +38258, +38258, +38287, +38308, +38323, +38323, +38323, +38340, +38375, +38419, +38419, +38419, +38419, +38419, +38419, +38435, +38471, +38471, +38504, +38526, +38526, +38582, 38589, 38589, -38589, -38589, -38604, -38618, -38618, -38618, -38624, -38624, -38634, -38640, -38640, -38647, -38685, -38685, -38694, -38714, -38729, -38729, -38729, -38755, -38755, +38609, +38619, +38633, +38633, +38667, +38667, +38667, +38667, +38680, +38709, +38709, +38709, +38709, +38737, +38737, +38737, 38760, 38760, -38778, -38778, -38814, -38814, -38830, -38842, -38857, -38857, -38867, -38882, -38882, -38893, -38893, -38893, -38911, -38911, -38911, -38925, -38925, -38932, -38939, -38939, -38945, -38953, -38953, -38953, -38960, -38960, -38994, -39004, -39004, -39004, -39004, -39014, -39019, -39051, -39073, -39073, +38760, +38760, +38760, +38779, +38833, +38833, +38883, +38883, +38883, +38889, +38908, +38956, +38967, +38988, +38988, +39028, +39047, +39047, 39095, -39095, -39137, -39162, -39162, -39167, -39167, -39188, -39205, -39210, -39223, -39223, -39223, -39237, -39255, -39280, -39280, -39311, -39358, -39406, -39406, -39406, +39149, +39158, +39158, +39158, +39182, +39233, +39262, +39277, +39313, +39313, +39345, +39362, +39369, +39369, +39378, +39395, +39395, 39429, -39444, -39454, -39487, -39487, -39503, -39516, -39516, -39516, -39522, -39540, -39540, -39559, -39559, -39559, -39569, -39591, -39591, -39611, -39611, -39611, -39611, -39619, -39619, -39619, -39619, -39631, -39646, -39646, -39651, -39657, -39657, -39657, -39657, -39674, -39729, -39729, -39758, -39772, -39789, -39875, -39887, -39887, -39887, -39887, -39944, -39944, -39983, -39999, -39999, -40015, -40019, -40049, -40064, -40064, -40073, -40073, -40080, -40089, -40089, -40089, -40089, -40094, -40094, -40101, -40112, -40128, -40155, -40187, -40187, -40187, -40194, -40194, -40221, -40258, -40258, -40265, -40272, -40272, -40279, -40283, -40290, -40290, -40307, -40336, -40370, -40370, -40370, -40389, -40389, -40406, -40429, -40429, -40429, -40429, -40429, -40429, -40429, +39438, +39453, +39502, +39502, +39539, +39539, +39593, +39618, +39644, +39689, +39712, +39712, +39712, +39736, +39736, +39736, +39746, +39759, +39777, +39777, +39802, +39802, +39812, +39812, +39825, +39825, +39832, +39832, +39847, +39847, +39872, +39911, +39957, +39991, +39991, +40009, +40026, +40026, +40035, +40035, +40035, +40035, +40039, +40039, +40039, +40061, +40069, +40086, +40086, +40091, +40111, +40150, +40179, +40199, +40215, +40215, +40215, +40238, +40238, +40238, +40252, +40252, +40252, +40259, +40259, +40321, +40321, +40328, +40328, +40346, +40346, +40369, +40380, +40388, +40388, +40388, +40407, +40423, +40423, +40423, 40436, -40447, -40447, -40447, -40464, -40478, -40487, -40487, -40520, -40520, -40526, -40526, -40531, -40531, -40549, -40568, +40436, +40443, +40449, +40457, +40473, +40473, +40496, +40502, +40534, +40556, 40574, -40574, -40616, -40623, -40630, +40595, +40613, +40613, 40630, +40637, +40637, 40644, -40666, -40666, -40695, -40703, -40703, -40711, -40711, -40718, -40723, -40736, -40736, -40736, -40746, -40785, -40795, -40804, -40804, -40816, -40835, -40851, -40877, -40891, -40931, -40938, -40976, -40986, -41006, -41006, -41013, -41025, -41031, -41045, -41045, -41097, -41118, -41118, -41143, -41157, -41183, -41194, -41194, -41236, -41264, -41286, -41286, -41327, -41334, -41334, -41334, -41334, -41352, -41352, -41358, -41358, -41358, -41375, +40650, +40675, +40686, +40686, +40686, +40752, +40781, +40802, +40815, +40821, +40838, +40838, +40838, +40855, +40887, +40930, +40949, +40965, +40969, +40988, +40988, +40988, +40988, +40988, +40988, +41020, +41036, +41059, +41074, +41074, +41093, +41098, +41098, +41104, +41156, +41184, +41184, +41200, +41223, +41238, +41244, +41244, +41244, +41267, +41267, +41267, +41273, +41273, +41273, +41297, +41297, +41303, +41324, +41335, +41354, +41360, +41360, +41360, +41360, +41367, +41367, 41383, -41383, -41398, -41423, -41423, -41467, -41467, -41474, -41490, -41490, -41521, -41521, -41521, -41559, -41566, -41576, -41598, -41643, +41408, +41449, +41486, +41514, +41514, +41514, +41514, +41514, +41529, +41548, +41548, +41589, +41608, +41608, +41628, +41628, 41667, -41680, -41703, -41703, -41703, -41714, -41752, -41761, -41768, -41775, -41789, -41789, -41825, -41841, -41841, -41841, -41871, -41906, -41906, -41936, +41701, +41701, +41719, +41719, +41732, +41754, +41785, +41810, +41845, +41860, +41860, +41860, +41873, +41890, +41921, +41942, +41942, +41952, 41975, -41990, -41990, -41990, -41990, -42030, -42030, -42056, -42056, -42066, -42066, -42097, -42097, -42124, -42141, -42141, -42141, -42147, -42154, -42161, -42177, -42177, -42203, -42210, -42210, -42210, -42210, -42210, -42222, -42222, -42222, -42244, -42244, -42300, -42300, -42322, -42346, -42356, -42356, -42387, -42387, -42387, -42413, -42413, -42434, -42434, -42487, -42507, -42514, -42528, -42528, -42528, -42548, -42582, -42582, -42588, -42631, -42649, +42000, +42000, +42000, +42021, +42034, +42034, +42034, +42034, +42034, +42049, +42049, +42096, +42096, +42096, +42096, +42107, +42107, +42122, +42173, +42208, +42214, +42231, +42231, +42238, +42252, +42252, +42266, +42292, +42316, +42331, +42331, +42331, +42350, +42365, +42371, +42378, +42389, +42395, +42395, +42435, +42446, +42446, +42458, +42458, +42476, +42476, +42476, +42486, +42506, +42510, +42559, +42565, +42583, +42600, +42643, +42650, 42656, -42676, -42684, -42704, -42718, -42743, -42764, -42777, -42783, -42802, -42829, -42855, -42869, -42869, -42869, -42869, -42879, -42879, -42891, -42891, -42919, -42919, -42934, -42950, -42950, -42992, -43012, -43012, -43021, -43033, -43033, -43056, -43066, -43079, -43079, -43079, +42668, +42688, +42698, +42738, +42761, +42761, +42800, +42806, +42847, +42851, +42877, +42881, +42917, +42929, +42945, +42945, +42945, +42951, +42951, +42967, +43009, +43009, +43028, +43040, +43040, +43046, +43046, +43072, 43088, -43095, -43163, -43163, -43163, -43163, -43171, -43171, -43194, -43217, -43217, -43223, -43252, -43252, -43267, -43281, -43304, -43322, -43348, -43359, -43392, -43402, +43097, +43139, +43146, +43172, +43192, +43192, +43192, +43220, +43232, +43238, +43238, +43256, +43256, +43256, +43277, +43295, +43313, +43325, +43325, +43349, +43367, +43380, +43387, +43425, 43441, -43441, -43441, -43468, -43468, -43468, -43485, -43489, -43519, +43484, +43484, +43507, +43507, 43526, -43526, -43564, -43564, -43564, -43583, -43583, -43605, -43609, -43621, -43640, -43651, -43651, -43655, -43662, -43662, -43685, -43712, -43728, -43733, -43752, -43760, -43775, -43786, -43786, -43796, -43811, +43537, +43572, +43577, +43577, +43587, +43591, +43591, +43619, +43626, +43646, +43646, +43674, +43704, +43704, +43751, +43781, +43798, +43824, +43846, 43846, 43862, 43862, -43892, -43930, -43930, -43956, +43878, +43878, +43884, +43911, +43911, +43911, +43911, +43911, +43925, +43933, +43943, +43949, +43949, +43976, +43976, +43976, 43986, -44006, -44006, -44016, -44059, -44059, -44084, -44091, -44091, -44105, -44113, -44128, -44157, -44167, -44173, -44195, -44195, -44195, -44213, -44213, -44213, -44238, -44255, -44316, -44316, +44000, +44000, +44012, +44035, +44053, +44053, +44053, +44068, +44090, +44118, +44130, +44130, +44130, +44130, +44142, +44149, +44155, +44155, +44155, +44155, +44174, +44174, +44174, +44190, +44190, +44215, +44215, +44215, +44231, +44263, +44273, +44273, +44273, +44273, +44296, +44311, +44311, +44311, 44327, 44327, -44335, -44335, -44335, -44335, -44372, -44372, -44372, -44372, -44379, -44402, -44431, -44454, -44470, -44486, -44486, -44512, -44512, -44525, -44538, -44555, -44574, -44574, -44574, -44583, -44583, -44583, -44583, -44597, -44617, -44627, -44627, -44666, -44666, -44666, -44673, -44673, -44673, -44736, -44736, -44736, -44736, -44743, -44763, -44787, -44804, -44819, -44819, -44835, -44848, -44886, -44886, -44915, -44944, -44949, -44949, -44949, -44949, -44976, -44976, -45008, -45008, -45028, -45028, +44327, +44345, +44368, +44368, +44368, +44368, +44368, +44380, +44414, +44414, +44422, +44439, +44459, +44459, +44484, +44484, +44484, +44503, +44503, +44520, +44520, +44520, +44520, +44524, +44557, +44557, +44564, +44584, +44584, +44606, +44614, +44614, +44614, +44614, +44634, +44648, +44679, +44685, +44728, +44778, +44785, +44792, +44792, +44803, +44814, +44829, +44845, +44863, +44870, +44895, +44910, +44919, +44960, +44960, +44972, +44972, +44972, +44972, +44985, +45017, +45036, 45062, 45062, -45069, -45069, -45095, -45095, -45095, +45074, +45088, 45105, -45122, -45143, -45153, -45153, -45153, -45153, -45153, -45153, -45153, -45153, -45158, -45158, -45158, +45136, +45142, +45142, +45174, 45186, -45198, -45225, -45225, -45243, -45270, -45287, -45287, -45287, -45316, -45348, -45365, -45372, -45381, -45381, -45402, -45402, +45193, +45193, +45203, +45203, +45203, +45213, +45232, +45232, +45236, +45277, +45297, +45297, +45297, +45302, +45315, +45315, +45361, +45385, 45420, -45420, -45435, -45435, -45448, -45448, -45499, -45507, -45507, -45529, -45547, -45547, -45547, -45556, -45573, -45583, -45593, -45609, -45620, -45620, -45663, -45688, -45705, -45705, -45711, -45729, -45752, -45766, -45772, -45782, -45799, -45811, -45866, -45866, -45903, -45903, -45903, -45903, -45924, -45974, -45978, -45994, -45994, +45455, +45455, +45455, +45455, +45464, +45486, +45490, +45490, +45508, +45524, +45524, +45524, +45543, +45543, +45543, +45589, +45613, +45629, +45641, +45669, +45681, +45698, +45698, +45698, +45698, +45723, +45723, +45723, +45735, +45742, +45763, +45787, +45791, +45791, +45818, +45831, +45843, +45861, +45861, +45877, +45877, +45892, +45892, +45901, +45916, +45935, +45935, +45935, +45953, +45953, +45967, +45967, 45998, -46045, -46060, -46083, -46083, -46114, -46123, -46130, -46180, -46186, -46201, -46201, -46201, -46259, -46280, -46291, -46295, -46301, -46347, -46347, -46396, -46412, -46455, -46455, -46455, -46460, -46487, -46509, -46509, -46509, -46523, -46565, -46578, -46578, -46578, -46584, -46594, -46594, -46638, -46659, -46659, -46671, -46671, -46691, -46691, -46691, -46718, -46718, -46732, +46007, +46007, +46011, +46024, +46047, +46047, +46047, +46053, +46053, +46067, +46078, +46098, +46126, +46169, +46194, +46225, +46240, +46240, +46256, +46279, +46279, +46308, +46308, +46308, +46330, +46373, +46383, +46407, +46407, +46425, +46425, +46441, +46476, +46498, +46512, +46525, +46525, +46525, +46540, +46557, +46574, +46590, +46609, +46609, +46632, +46632, +46647, +46655, +46697, 46742, -46759, -46759, -46787, -46803, -46803, -46816, -46844, -46867, -46867, +46742, +46742, +46742, +46742, +46752, +46780, +46780, +46807, +46807, +46807, +46807, +46820, +46829, +46864, +46864, +46894, +46894, 46898, -46898, -46920, -46963, -46991, -47006, -47016, -47016, -47028, -47043, -47047, -47047, -47047, -47078, -47093, -47100, -47120, -47125, -47139, -47139, -47143, -47162, -47162, +46938, +46938, +46938, +46945, +46945, +46971, +46977, +46999, +47012, +47026, +47026, +47044, +47059, +47059, +47104, +47104, +47104, +47104, +47104, +47104, +47104, +47121, +47121, +47121, +47131, +47160, +47170, 47182, 47182, -47204, -47204, -47223, -47223, -47234, -47234, -47234, -47239, -47239, -47247, -47247, -47253, -47287, -47287, -47287, -47287, -47287, -47306, -47346, -47376, -47376, -47412, -47412, -47412, -47412, -47412, -47412, -47420, -47429, -47438, -47438, -47438, -47438, -47449, -47449, +47182, +47209, +47209, +47280, +47302, +47362, +47374, +47389, +47398, +47398, +47418, +47425, +47435, +47452, +47459, +47459, +47459, 47465, -47465, -47479, -47498, -47498, -47498, -47498, -47510, -47532, -47540, +47486, +47486, +47506, +47522, +47541, 47547, -47553, -47553, -47553, -47553, -47569, -47569, -47589, -47589, -47589, +47557, +47603, +47621, 47631, -47637, -47637, -47637, -47637, -47653, -47653, -47653, -47672, -47672, -47672, -47703, -47703, -47703, -47711, -47725, -47725, -47748, -47778, -47790, -47790, -47815, -47815, -47815, -47842, -47842, -47858, -47880, -47880, -47880, -47880, -47910, -47910, -47921, -47948, -47959, -47959, -47959, -47979, -47979, +47631, +47662, +47662, +47683, +47689, +47706, +47731, +47736, +47736, +47736, +47736, +47750, +47780, +47780, +47785, +47792, +47803, +47810, +47837, +47837, +47852, +47852, +47890, +47890, +47890, +47902, +47924, +47968, 47984, -48010, -48019, +48002, +48002, +48002, +48002, +48002, +48002, +48014, +48020, +48020, +48020, 48035, -48035, -48054, -48054, -48089, -48089, -48105, -48115, -48121, -48135, -48159, -48169, -48169, -48169, -48169, +48045, +48045, +48045, +48053, +48053, +48092, +48092, +48117, +48117, +48143, +48143, +48150, +48160, 48187, 48187, 48187, -48227, -48244, -48256, -48272, -48272, -48287, -48287, -48287, -48287, -48287, -48309, -48341, -48341, -48351, -48351, -48351, -48380, -48380, -48380, -48386, -48414, -48439, -48455, -48491, -48505, -48517, -48517, -48517, -48517, -48562, -48577, -48577, -48589, -48594, -48631, -48631, -48644, -48644, -48644, -48648, +48203, +48203, +48239, +48250, +48250, +48250, +48250, +48250, +48269, +48284, +48288, +48288, +48288, +48303, +48303, +48303, +48303, +48303, +48322, +48322, +48322, +48335, +48347, +48347, +48347, +48360, +48360, +48360, +48360, +48360, +48379, +48379, +48392, +48392, +48392, +48392, +48409, +48425, +48459, +48459, +48466, +48483, +48504, +48504, +48536, +48536, +48536, +48550, +48564, +48606, +48626, 48660, -48667, -48685, -48685, -48695, -48695, -48695, -48695, -48710, -48710, -48710, -48727, -48753, -48753, -48769, -48769, -48775, -48788, -48788, -48802, -48830, -48834, -48873, -48873, -48882, -48886, -48898, -48915, -48915, -48950, -49002, -49019, -49019, -49029, -49029, -49068, -49068, -49068, -49090, -49090, -49106, -49106, -49106, -49113, -49148, -49163, -49163, -49206, -49229, -49253, -49281, -49281, -49281, -49281, +48677, +48677, +48677, +48689, +48689, +48689, +48697, +48697, +48728, +48739, +48757, +48757, +48777, +48793, +48793, +48815, +48815, +48829, +48852, +48860, +48860, +48899, +48899, +48912, +48963, +48963, +48992, +48992, +48992, +48992, +49006, +49014, +49042, +49042, +49055, +49055, +49055, +49071, +49077, +49108, +49108, +49120, +49120, +49120, +49120, +49127, +49127, +49131, +49145, +49162, +49162, +49179, +49207, +49207, +49207, +49207, +49207, +49207, +49207, +49207, +49207, +49218, +49218, +49235, +49250, +49260, +49270, +49270, +49286, 49295, -49307, -49311, -49327, -49343, -49360, +49295, +49295, +49295, +49337, +49347, +49358, +49358, +49390, 49403, 49403, -49403, -49429, -49429, -49434, -49434, -49434, -49434, -49444, -49444, -49460, -49460, -49496, -49503, -49538, -49574, -49574, -49574, -49574, +49413, +49423, +49423, +49423, +49455, +49471, +49471, +49477, +49477, +49477, +49494, +49512, +49521, +49521, +49552, +49582, 49612, -49612, -49651, -49661, -49686, -49686, -49695, -49710, -49710, -49725, -49742, -49742, -49742, -49742, -49742, -49757, -49757, -49762, -49815, -49835, -49863, -49863, -49869, -49888, -49907, -49907, -49917, -49940, -49940, -49946, -49963, -49998, -50017, -50031, -50052, -50074, -50074, -50085, -50085, -50105, -50105, -50123, -50123, -50136, -50152, -50192, -50192, -50212, -50212, -50226, -50226, -50259, -50259, -50259, -50282, -50287, -50315, +49641, +49653, +49653, +49653, +49675, +49680, +49690, +49724, +49724, +49755, +49773, +49795, +49795, +49795, +49795, +49795, +49801, +49822, +49822, +49850, +49850, +49878, +49897, +49897, +49897, +49897, +49897, +49919, +49942, +49947, +49956, +49956, +49956, +49975, +49975, +49990, +50000, +50000, +50000, +50008, +50034, +50034, +50050, +50050, +50059, +50059, +50075, +50075, +50075, +50104, +50112, +50112, +50112, +50112, +50149, +50158, +50158, +50198, +50232, +50248, +50262, +50262, +50272, +50272, +50281, +50281, +50281, +50288, +50295, +50295, +50305, 50320, -50320, -50320, -50320, -50379, -50396, -50412, -50412, -50412, -50412, -50443, -50466, -50466, -50489, -50489, +50363, +50363, +50400, +50410, +50410, +50423, +50435, +50448, +50453, +50467, +50467, +50467, +50485, +50485, 50503, -50503, -50503, -50503, -50521, -50529, -50529, -50556, -50575, -50575, -50581, -50581, -50581, -50585, -50585, -50598, -50598, -50598, -50598, -50598, -50611, -50636, -50636, -50646, -50661, -50661, -50661, -50680, -50680, -50713, -50713, -50729, -50753, -50753, -50759, -50791, -50806, -50806, -50806, -50806, -50806, -50814, -50831, -50831, -50831, -50878, -50897, -50897, -50921, -50943, -50949, -50960, -50981, -50991, -51008, -51020, -51020, -51035, -51045, -51045, -51085, -51110, -51123, -51123, -51142, -51176, -51204, -51204, -51214, -51214, -51214, -51214, -51232, +50513, +50535, +50535, +50542, +50583, +50589, +50597, +50602, +50627, +50640, +50682, +50689, +50708, +50712, +50712, +50712, +50728, +50746, +50774, +50774, +50790, +50802, +50802, +50802, +50834, +50847, +50865, +50880, +50880, +50880, +50880, +50899, +50908, +50923, +50955, +50993, +51005, +51005, +51016, +51025, +51043, +51064, +51064, +51081, +51109, +51126, +51178, +51178, +51178, +51187, +51220, +51220, 51239, 51239, -51279, -51279, -51279, -51279, -51279, -51295, -51295, -51314, -51340, -51358, -51383, -51414, -51434, -51434, -51434, +51239, +51258, +51274, +51274, +51311, +51311, +51311, +51325, +51336, +51336, +51336, +51336, +51336, +51336, +51336, +51336, +51349, +51349, +51369, +51375, +51375, +51375, +51375, +51375, +51398, +51417, +51417, +51427, +51427, 51440, -51440, -51459, 51465, -51484, -51502, -51502, -51519, -51536, -51536, -51551, -51551, -51557, -51557, -51557, -51564, -51573, -51573, -51573, -51580, -51580, -51594, -51594, -51610, -51610, -51625, -51625, -51669, -51669, -51669, -51720, -51720, -51720, -51720, -51730, -51730, -51730, -51730, +51465, +51465, +51465, +51465, +51478, +51478, +51485, +51503, +51511, +51517, +51528, +51550, +51550, +51569, +51569, +51586, +51586, +51586, +51595, +51601, +51608, +51633, +51650, +51650, +51650, +51650, +51650, +51650, +51670, +51670, +51690, +51714, +51714, +51732, 51750, -51793, -51800, -51810, -51821, -51827, +51750, +51782, +51791, +51799, +51799, +51805, +51820, +51820, +51820, 51852, -51865, +51856, +51856, +51856, +51856, 51869, -51869, -51875, -51911, -51911, -51911, -51934, -51953, -51953, -51953, -51967, -51967, -51967, -51980, -51985, -51985, -51985, -51985, -51985, -51985, -51996, -52044, -52044, -52044, -52065, -52065, -52079, -52093, -52105, -52105, -52112, -52136, -52136, +51884, +51884, +51925, +51936, +51936, +51941, +51954, +51954, +51954, +51954, +51976, +51976, +51999, +51999, +52008, +52038, +52038, +52055, +52055, +52070, +52087, +52094, +52129, +52145, +52145, 52158, -52167, -52194, -52211, +52165, +52198, +52225, +52225, 52232, -52266, +52245, +52262, +52262, +52262, +52269, +52269, +52269, +52281, +52281, 52290, -52321, -52321, -52338, -52371, -52371, -52371, -52371, -52376, -52401, -52415, -52415, -52425, -52425, -52435, -52435, -52443, -52443, -52455, -52491, -52506, -52547, -52567, -52567, -52584, -52588, -52598, -52638, -52643, -52664, -52664, -52664, -52664, -52664, -52693, -52701, -52701, -52740, -52775, -52775, -52813, -52824, -52849, -52849, -52862, -52877, -52890, -52890, -52890, -52906, -52931, -52952, -52952, -52952, -52952, -52968, -52977, -52995, -52995, -52995, -53010, -53010, -53039, -53039, -53039, -53056, -53056, -53065, -53077, -53095, -53113, -53142, -53142, -53151, -53151, -53167, -53167, -53192, -53192, -53198, -53198, -53198, +52290, +52290, +52290, +52316, +52316, +52341, +52379, +52417, +52417, +52426, +52433, +52446, +52450, +52463, +52467, +52467, +52467, +52479, +52487, +52502, +52522, +52522, +52558, +52574, +52574, +52574, +52574, +52612, +52612, +52633, +52655, +52714, +52722, +52731, +52736, +52765, +52778, +52778, +52819, +52874, +52891, +52891, +52903, +52903, +52903, +52926, +52965, +52982, +53003, +53003, +53023, +53031, +53048, +53062, +53062, +53109, +53115, +53115, +53115, +53125, +53125, +53125, +53132, +53140, +53156, +53156, +53165, +53176, +53183, 53226, -53226, -53226, -53232, -53276, -53288, -53288, -53301, -53301, -53301, -53301, -53301, -53301, -53301, -53301, +53256, +53256, +53275, +53293, +53293, +53293, +53293, +53293, 53313, -53336, -53345, -53363, -53384, -53384, -53413, -53413, -53421, -53421, -53428, -53450, -53472, -53510, -53510, -53510, -53540, -53540, -53546, -53558, -53558, -53558, -53558, -53558, +53323, +53323, +53323, +53323, +53330, +53355, +53355, +53362, +53368, +53374, +53374, +53374, +53374, +53374, +53374, +53374, +53381, +53381, +53381, +53381, +53391, +53400, +53412, +53412, +53412, +53440, +53440, +53448, +53448, +53466, +53481, +53481, +53481, +53481, +53481, +53481, +53491, +53505, +53521, +53550, +53559, +53559, 53570, -53570, -53591, -53611, -53650, -53664, -53671, -53710, -53722, -53722, -53741, -53771, -53780, -53827, -53833, -53863, -53868, -53880, -53893, -53893, -53907, -53919, -53939, -53939, -53956, -54004, -54004, -54004, -54021, -54021, -54045, -54045, -54060, -54060, -54060, -54060, -54060, -54060, -54077, -54077, -54091, -54115, -54124, -54175, -54175, -54175, -54194, -54194, -54221, -54272, -54302, -54314, -54324, -54324, -54324, -54336, -54349, -54369, -54369, -54369, -54431, -54431, -54451, -54479, -54526, -54526, -54568, -54577, -54577, -54577, -54587, -54609, -54609, -54616, -54637, -54658, -54665, -54665, -54681, -54692, -54692, -54705, -54705, -54738, -54750, -54764, -54764, -54770, -54770, -54779, -54779, -54779, -54810, -54810, -54843, -54874, -54874, -54874, -54874, -54900, -54913, -54913, -54929, -54956, -54985, -54991, -55048, -55048, -55069, -55069, -55105, -55105, -55112, -55127, -55127, -55133, -55153, -55171, -55203, -55215, -55250, -55262, -55262, -55272, -55272, -55272, -55286, -55286, -55296, -55336, -55336, -55390, -55390, -55390, -55390, -55421, -55421, -55428, -55460, -55487, -55487, -55505, -55505, +53577, +53577, +53628, +53644, +53665, +53665, +53665, +53675, +53675, +53675, +53675, +53698, +53698, +53719, +53719, +53731, +53753, +53753, +53759, +53777, +53793, +53814, +53838, +53849, +53884, +53884, +53884, +53899, +53899, +53915, +53915, +53925, +53953, +53983, +53993, +53993, +54029, +54053, +54053, +54063, +54063, +54063, +54075, +54094, +54094, +54094, +54104, +54110, +54127, +54127, +54127, +54127, +54158, +54158, +54195, +54208, +54215, +54232, +54232, +54249, +54259, +54278, +54278, +54278, +54284, +54284, +54284, +54294, +54294, +54294, +54310, +54359, +54372, +54372, +54372, +54372, +54377, +54383, +54415, +54415, +54415, +54426, +54447, +54474, +54499, +54499, +54509, +54514, +54514, +54514, +54536, +54547, +54547, +54553, +54578, +54590, +54590, +54603, +54603, +54603, +54619, +54626, +54645, +54645, +54660, +54676, +54704, +54704, +54704, +54721, +54721, +54721, +54729, +54729, +54755, +54755, +54755, +54755, +54755, +54755, +54771, +54812, +54836, +54836, +54846, +54919, +54919, +54937, +54962, +54962, +54962, +55003, +55023, +55023, +55037, +55037, +55037, +55044, +55050, +55050, +55061, +55061, +55061, +55061, +55061, +55092, +55113, +55130, +55142, +55185, +55196, +55196, +55196, +55196, +55196, +55202, +55261, +55278, +55278, +55298, +55298, +55315, +55315, +55354, +55354, +55354, +55382, +55389, +55405, +55410, +55410, +55416, +55416, +55416, +55416, +55416, +55416, +55416, +55416, +55422, +55458, +55465, +55465, +55479, +55508, +55508, +55514, 55521, -55521, -55525, -55530, -55541, -55551, -55551, -55551, -55564, -55564, -55585, -55585, -55585, -55585, -55610, -55661, -55661, +55540, +55540, +55540, +55540, +55553, +55563, +55577, +55577, +55595, +55595, +55617, +55617, +55617, +55621, +55640, +55640, +55640, +55640, +55663, 55681, -55698, -55716, -55716, -55725, -55734, -55751, -55812, -55823, -55832, -55832, -55832, -55871, -55889, -55889, -55905, -55905, -55905, -55948, -55956, -55971, -55971, -55971, -56009, -56037, -56037, -56037, -56044, -56044, -56044, -56044, -56044, -56044, +55681, +55726, +55746, +55746, +55762, +55762, +55774, +55825, +55838, +55854, +55864, +55864, +55864, +55886, +55897, +55917, +55917, +55931, +55961, +55961, +55961, +55985, +56003, +56003, +56003, +56025, +56025, 56074, 56074, 56074, -56078, -56119, -56131, -56152, -56159, -56186, -56248, -56252, -56252, -56256, -56256, -56256, -56256, -56283, -56295, -56342, -56367, -56367, -56367, -56382, -56394, -56415, -56415, -56421, -56421, -56421, -56486, -56499, -56499, -56531, -56531, -56531, -56560, -56597, -56604, -56612, -56621, -56656, -56656, -56656, -56671, -56671, -56671, -56684, -56684, -56684, -56684, -56684, -56684, -56684, -56702, -56710, -56718, -56738, -56738, -56755, -56770, +56105, +56118, +56141, +56141, +56141, +56141, +56141, +56169, +56203, +56203, +56203, +56203, +56221, +56225, +56258, +56272, +56278, +56321, +56321, +56339, +56372, +56372, +56397, +56411, +56428, +56437, +56437, +56458, +56469, +56538, +56544, +56562, +56562, +56579, +56579, +56593, +56593, +56593, +56613, +56613, +56619, +56670, +56676, +56705, +56705, +56705, +56723, +56733, +56733, +56733, +56733, +56739, +56739, +56739, +56758, +56758, +56758, +56775, 56785, -56821, -56821, -56832, -56832, -56832, -56832, -56880, -56906, -56914, -56914, -56914, -56914, -56914, -56914, -56922, -56922, -56931, -56940, -56940, -56950, -56972, -56990, -57000, -57006, -57006, -57006, -57030, -57054, -57063, -57095, -57095, -57095, -57095, -57100, -57100, -57100, -57100, -57100, -57129, -57129, -57129, -57147, -57147, -57184, -57203, -57203, -57215, +56793, +56793, +56819, +56837, +56862, +56862, +56862, +56868, +56868, +56917, +56917, +56942, +56942, +56968, +57007, +57007, +57039, +57043, +57043, +57043, +57043, +57049, +57049, +57075, +57075, +57103, +57118, +57143, +57150, +57165, +57180, +57180, +57187, +57234, +57234, +57252, 57258, -57286, -57308, -57308, -57308, -57335, -57352, -57352, -57382, -57403, -57415, -57450, -57457, -57478, -57499, -57506, -57506, -57523, -57545, -57545, +57258, +57258, +57271, +57285, +57285, +57285, +57294, +57294, +57294, +57304, +57321, +57343, +57374, +57386, +57386, +57428, +57436, +57449, +57449, +57455, +57471, +57482, +57491, +57528, +57550, +57560, +57560, +57560, 57566, -57579, -57589, -57597, -57632, -57659, -57667, -57696, -57696, -57705, -57743, -57751, -57798, -57818, -57830, -57857, -57865, -57865, -57895, -57940, -57976, -57976, -57976, -57976, -57976, -57976, -57976, -57976, -57976, -58011, -58016, -58016, -58052, +57584, +57584, +57611, +57627, +57627, +57656, +57656, +57656, +57656, +57675, +57692, +57727, +57727, +57727, +57727, +57733, +57744, +57780, +57790, +57790, +57790, +57804, +57810, +57810, +57810, +57831, +57855, +57863, +57874, +57887, +57887, +57896, +57938, +57938, +57938, +57938, +57963, +57963, +57963, +57967, +57967, +57990, +57990, +57990, +58012, +58023, +58023, 58066, -58066, -58066, -58066, -58089, -58089, -58089, -58105, -58105, -58123, -58160, -58179, -58179, -58179, -58179, -58179, -58187, -58187, -58187, -58210, -58227, -58227, -58254, -58254, -58254, -58254, -58254, -58254, -58271, -58290, -58305, -58318, -58336, -58336, -58353, -58353, -58353, -58365, -58365, -58365, -58377, -58425, -58425, -58446, -58446, -58446, -58446, -58456, -58456, +58119, +58119, +58144, +58154, +58167, +58189, +58203, +58203, +58217, +58217, +58234, +58234, +58234, +58246, +58259, +58285, +58322, +58322, +58362, +58378, +58386, +58393, +58430, +58430, +58430, +58430, +58451, +58451, 58470, -58495, -58495, -58495, -58495, -58495, -58508, -58508, +58479, +58479, +58479, 58530, -58564, -58574, -58574, -58574, -58615, -58658, -58658, +58544, +58544, +58570, +58570, +58570, +58583, +58583, +58592, +58592, +58606, +58618, +58618, +58628, +58648, +58648, +58663, 58686, -58686, -58686, -58686, -58686, -58686, -58703, -58703, -58738, -58767, -58767, -58767, -58767, -58774, -58774, -58774, -58781, -58781, -58781, -58781, -58781, -58781, -58781, -58795, -58795, -58812, -58836, -58836, -58844, -58844, -58865, -58865, -58871, -58881, -58908, -58908, -58908, -58927, -58927, -58927, -58941, -58941, -58941, -58941, -58941, -58941, -58941, -58959, -58959, -58959, -58959, -58966, -58966, -58980, -58980, -59006, -59016, -59016, -59032, -59055, -59067, -59067, -59092, -59092, -59097, -59116, -59135, -59154, -59154, -59164, -59181, -59209, -59268, -59268, -59281, -59281, -59294, -59310, -59329, -59329, -59329, -59360, +58702, +58717, +58727, +58734, +58744, +58744, +58776, +58776, +58810, +58810, +58810, +58821, +58834, +58845, +58845, +58857, +58874, +58913, +58913, +58913, +58939, +58945, +58955, +58968, +58992, +58992, +59002, +59002, +59035, +59064, +59076, +59120, +59150, +59169, +59169, +59176, +59176, +59193, +59200, +59232, +59232, +59247, +59261, +59284, +59312, +59338, +59338, +59345, +59355, 59367, -59367, -59378, 59385, -59385, -59385, -59385, -59385, -59385, -59385, -59385, -59385, -59409, -59413, -59413, -59413, -59420, -59420, -59449, -59449, -59449, -59467, -59467, -59486, +59392, +59419, +59419, +59431, +59438, 59501, -59507, -59507, -59533, -59540, -59553, -59553, -59553, -59553, -59553, -59553, -59572, -59572, -59592, -59601, -59618, -59654, -59659, -59659, -59659, -59659, -59659, -59669, -59687, -59717, -59717, -59717, -59717, -59717, -59744, +59515, +59546, +59566, +59580, +59587, +59594, +59619, +59638, +59652, +59652, +59696, +59709, +59716, +59716, +59716, +59723, +59764, +59764, 59771, -59803, -59813, -59836, -59876, -59899, -59899, -59899, -59899, -59919, -59919, -59927, +59822, +59859, +59859, +59866, +59891, +59898, +59923, +59937, +59949, 59956, -59975, -59975, -59975, -59993, -60046, -60068, +59956, +59963, +59985, +59992, +59992, +59992, +60017, +60041, +60054, 60087, 60087, -60117, -60117, -60117, -60117, -60127, -60127, -60127, -60142, -60163, -60163, -60179, -60202, -60211, -60245, -60245, -60245, -60245, -60263, -60282, -60294, -60294, -60294, -60318, -60318, -60318, -60318, -60327, -60327, -60327, -60390, -60390, -60395, -60395, -60395, -60395, -60410, -60424, -60444, -60502, -60502, -60502, -60529, -60546, -60573, -60573, -60588, -60609, -60609, -60613, -60613, -60613, -60659, -60700, -60714, -60714, -60714, -60723, -60739, -60739, -60739, -60753, -60753, -60753, -60759, -60759, -60766, -60781, -60810, -60835, -60835, -60835, -60835, -60882, -60891, -60891, -60909, -60927, -60927, -60927, -60927, -60927, -60927, -60927, -60927, -60953, -60959, -60970, -60970, -60991, -60991, -61001, -61037, -61074, -61074, -61093, -61102, -61102, -61112, -61124, -61132, -61141, -61141, -61141, -61141, -61172, -61172, -61172, -61184, -61200, -61200, -61200, -61222, -61237, -61247, -61247, -61261, -61261, -61269, -61269, -61269, -61269, -61269, -61269, -61274, -61274, -61292, -61320, -61320, -61327, -61355, -61368, -61368, -61368, -61379, -61386, -61386, -61386, -61403, -61425, -61453, -61469, -61480, -61487, -61487, -61487, -61487, -61487, -61487, -61487, -61514, -61514, -61522, -61532, -61532, -61532, -61568, -61587, -61599, -61622, -61622, -61622, -61627, -61627, -61627, -61647, -61647, -61652, -61652, -61652, -61652, -61676, -61692, -61692, -61692, -61732, -61732, -61732, -61732, -61732, -61732, -61755, -61755, -61755, -61755, -61755, -61788, -61788, -61788, -61788, -61788, -61826, -61826, -61836, -61849, -61889, -61934, -61934, -61934, -61949, -61949, -61949, -61955, -61955, -61955, -61955, -61955, -61955, -61955, -61966, -61974, -61974, -61974, -61981, -61981, -61981, -61998, -62018, +60094, +60118, +60164, +60178, +60178, +60178, +60207, +60207, +60216, +60234, +60247, +60265, +60272, +60279, +60279, +60279, +60313, +60313, +60320, +60345, +60374, +60382, +60394, +60394, +60394, +60394, +60394, +60449, +60449, +60458, +60483, +60483, +60496, +60503, +60519, +60526, +60540, +60554, +60554, +60570, +60578, +60592, +60592, +60599, +60607, +60624, +60631, +60638, +60638, +60708, +60715, +60722, +60729, +60729, +60729, +60736, +60736, +60736, +60747, +60765, +60789, +60832, +60839, +60839, +60839, +60858, +60858, +60858, +60858, +60873, +60880, +60902, +60924, +60931, +60938, +60945, +60952, +60982, +60989, +61009, +61066, +61078, +61078, +61078, +61078, +61105, +61105, +61144, +61165, +61165, +61165, +61180, +61180, +61180, +61224, +61231, +61258, +61268, +61275, +61295, +61295, +61295, +61302, +61316, +61316, +61351, +61369, +61410, +61428, +61450, +61450, +61463, +61493, +61511, +61552, +61579, +61603, +61617, +61617, +61624, +61624, +61624, +61631, +61656, +61682, +61689, +61707, +61714, +61721, +61735, +61742, +61753, +61760, +61774, +61800, +61838, +61850, +61856, +61863, +61900, +61917, +61932, +61939, +61946, +61960, +61979, +62000, +62026, +62033, +62040, +62052, +62052, 62061, -62080, -62088, -62122, -62133, -62149, -62166, +62068, +62077, +62084, +62096, +62140, +62140, +62147, +62153, +62153, 62182, -62182, -62188, -62188, -62188, -62197, -62205, -62211, -62211, -62211, -62234, -62234, +62195, +62195, +62195, +62213, +62213, 62239, -62247, -62267, -62267, -62286, -62286, -62286, -62286, -62286, -62308, -62308, -62308, -62308, -62323, -62334, -62375, -62383, -62393, -62414, -62427, -62494, -62504, -62525, -62525, -62525, -62525, -62525, -62525, -62563, -62563, -62571, -62583, -62583, -62583, -62594, -62608, -62636, -62648, -62648, -62648, -62648, -62680, -62693, -62693, +62265, +62279, +62304, +62313, +62320, +62327, +62352, +62359, +62366, +62371, +62404, +62434, +62477, +62477, +62484, +62499, +62515, +62522, +62529, +62544, +62565, +62565, +62588, +62588, +62593, +62618, +62618, +62624, +62624, +62624, +62624, +62642, +62660, +62684, +62688, +62688, 62702, 62702, -62702, -62720, -62732, -62757, -62772, -62778, -62793, -62813, -62830, -62847, -62862, -62888, -62888, -62900, -62924, -62934, -62934, -62934, -62953, -63001, -63006, -63006, -63006, -63006, -63006, -63012, -63012, -63025, -63025, -63025, -63057, -63063, -63063, -63081, -63081, -63098, -63118, -63135, -63135, -63135, -63135, -63154, -63170, -63183, -63183, -63183, -63183, -63183, -63183, -63202, -63202, -63202, -63202, -63231, -63242, -63248, -63248, -63265, -63265, -63265, -63265, -63265, -63277, -63287, -63311, -63321, -63336, -63336, +62716, +62738, +62763, +62763, +62782, +62812, +62829, +62858, +62858, +62887, +62887, +62908, +62915, +62929, +62968, +62982, +62982, +62996, +63014, +63024, +63054, +63065, +63082, +63082, +63107, +63143, +63159, +63176, +63176, +63213, +63250, +63250, +63291, +63324, 63348, -63348, -63366, -63366, -63366, -63366, -63366, -63373, -63373, -63373, +63355, 63384, 63384, -63389, -63394, -63407, -63407, -63425, -63444, -63492, -63515, -63542, -63542, -63542, -63569, -63569, -63586, -63586, -63613, -63613, -63626, -63654, -63659, -63659, -63659, -63693, -63693, -63710, -63710, -63737, -63741, -63741, -63778, -63778, -63778, -63784, -63806, -63833, -63846, -63879, -63887, -63887, -63887, -63887, -63916, -63926, -63933, -63952, -63956, -63990, -64002, -64017, -64028, -64028, -64045, -64097, -64130, -64130, -64140, -64148, -64154, -64168, +63390, +63397, +63432, +63439, +63439, +63459, +63497, +63497, +63519, +63519, +63535, +63549, +63582, +63601, +63601, +63608, +63619, +63655, +63662, +63678, +63678, +63678, +63684, +63718, +63745, +63765, +63773, +63779, +63779, +63811, +63818, +63859, +63886, +63892, +63947, +63947, +63988, +64025, +64034, +64058, +64067, +64090, +64106, +64106, +64106, +64111, +64111, +64129, +64129, +64135, +64152, +64189, +64189, +64189, +64189, 64196, -64218, -64225, -64225, -64231, -64256, -64277, -64294, -64308, -64313, -64320, -64320, -64325, -64325, -64345, -64345, -64345, -64345, -64345, -64386, -64386, -64393, -64399, -64405, -64420, +64196, +64209, +64222, +64222, +64235, +64235, +64263, +64270, +64270, +64270, +64296, +64314, +64321, +64321, +64321, +64321, +64321, +64328, +64347, +64359, +64359, +64359, +64359, +64359, +64388, 64427, -64435, -64435, -64435, -64445, -64445, -64445, -64472, -64472, +64434, +64434, +64461, +64468, +64499, +64506, 64513, -64528, -64528, -64539, -64562, -64562, +64513, +64513, +64513, +64513, +64522, +64522, +64558, 64568, -64568, -64568, -64586, -64624, -64650, -64650, -64662, -64662, -64668, -64677, -64677, -64677, -64677, -64677, -64677, -64677, -64698, -64715, +64602, +64615, +64621, +64627, +64627, +64627, +64627, +64627, +64654, +64654, +64661, +64661, +64675, +64675, +64675, +64675, +64685, +64685, +64704, +64730, 64746, -64760, -64774, -64794, -64794, -64819, -64836, -64836, -64862, -64874, -64880, -64899, -64916, -64916, -64916, -64948, -64965, -64965, -64990, -65011, +64761, +64768, +64768, +64811, +64811, +64811, +64811, +64811, +64832, +64844, +64844, +64859, +64878, +64888, +64902, +64933, +64933, +64976, +64987, +65004, +65004, +65013, +65013, +65023, +65023, +65047, +65047, +65047, +65047, +65054, 65060, -65067, -65081, -65081, -65081, -65097, -65097, -65113, -65133, -65152, -65152, -65179, -65196, -65234, -65253, -65272, -65272, -65279, -65279, -65318, -65318, -65364, -65364, -65424, -65493, -65493, -65499, -65499, -65499, +65078, +65104, +65104, +65116, +65127, +65127, +65137, +65156, +65178, +65178, +65178, +65214, +65214, +65214, +65238, +65238, +65266, +65266, +65266, +65266, +65274, +65294, +65294, +65294, +65294, +65306, +65306, +65306, +65363, +65363, +65363, +65363, +65390, +65402, +65408, +65408, +65408, +65408, +65408, +65408, +65454, +65454, +65454, +65464, +65464, +65484, +65491, +65505, 65518, -65525, -65525, -65534, -65534, -65534, -65534, -65541, -65566, -65595, -65595, -65595, -65613, -65681, -65690, -65690, +65518, +65518, +65530, +65554, +65572, +65592, +65639, +65639, +65648, +65655, +65665, +65665, +65665, +65699, +65699, 65711, -65728, -65747, -65762, -65785, -65785, -65809, -65809, -65820, -65826, -65835, -65861, -65883, -65912, -65918, -65918, +65731, +65731, +65731, +65731, +65767, +65787, +65787, +65787, +65808, +65828, +65866, +65878, +65878, +65889, +65889, +65930, +65930, +65930, +65930, +65930, +65930, +65930, 65936, -65936, -65936, -65936, -65941, -65941, 65951, -65967, +65957, +65957, 65973, 65979, -65979, -66008, -66008, -66008, -66013, -66013, -66030, -66030, -66045, -66045, -66045, -66052, -66052, -66052, -66052, -66094, -66098, -66105, -66105, -66143, -66143, -66191, -66196, -66196, -66226, -66226, -66253, -66268, -66268, -66305, -66305, -66305, -66317, -66324, -66324, -66324, -66330, -66330, -66346, -66346, -66346, -66369, -66408, -66408, -66408, -66426, -66426, -66426, -66435, -66443, -66443, -66443, -66443, -66443, -66443, -66443, -66443, -66450, -66450, -66450, -66466, -66471, -66492, -66507, -66507, -66530, -66543, -66564, -66576, -66576, -66576, -66591, -66628, -66628, -66628, -66628, -66628, -66667, -66691, -66691, -66698, -66748, -66760, -66777, -66777, -66795, -66817, -66817, +66004, +66004, +66050, +66050, +66097, +66113, +66140, +66140, +66149, +66175, +66204, +66213, +66213, +66229, +66229, +66263, +66271, +66293, +66293, +66320, +66320, +66339, +66339, +66339, +66339, +66339, +66349, +66355, +66363, +66363, +66407, +66407, +66407, +66416, +66416, +66425, +66425, +66444, +66470, +66470, +66490, +66490, +66490, +66506, +66506, +66521, +66521, +66557, +66557, +66557, +66557, +66557, +66557, +66565, +66565, +66565, +66596, +66632, +66641, +66641, +66641, +66641, +66641, +66655, +66655, +66663, +66663, +66663, +66674, +66684, +66703, +66717, +66734, +66734, +66774, +66800, 66836, -66854, -66854, -66854, -66866, -66888, -66904, -66914, +66853, +66863, +66863, 66924, 66924, -66924, -66953, -66968, -66999, -66999, -67011, -67011, -67011, -67031, -67031, -67031, -67042, -67092, -67107, -67126, -67132, -67143, -67151, -67160, -67160, -67166, -67180, -67180, -67180, -67180, -67180, -67195, -67195, -67195, -67195, -67195, -67206, -67211, -67217, -67217, -67234, -67234, -67276, -67276, -67276, -67287, -67287, -67287, -67297, -67310, -67343, -67360, -67370, -67370, -67386, -67427, -67460, -67480, -67480, -67480, +66937, +66951, +66970, +66970, +66970, +67005, +67005, +67005, +67039, +67067, +67067, +67090, +67097, +67097, +67113, +67119, +67119, +67150, +67170, +67170, +67182, +67188, +67253, +67268, +67295, +67311, +67311, +67311, +67319, +67335, +67340, +67356, +67356, +67368, +67368, +67368, +67377, +67383, +67383, +67383, +67383, +67383, +67396, +67396, +67408, +67426, +67456, +67470, +67494, +67494, +67494, +67494, +67506, +67506, +67506, +67506, +67506, 67511, 67529, 67529, -67546, -67579, -67617, -67617, -67634, -67634, -67658, -67658, -67665, -67679, -67679, -67696, -67732, -67748, -67748, -67748, -67758, -67758, -67758, -67758, -67758, -67758, -67765, -67780, -67791, -67791, -67791, -67791, -67812, -67822, -67822, -67844, -67844, -67844, -67858, -67884, -67884, -67884, -67897, -67897, -67905, -67905, -67939, -67950, -67950, -67950, -67950, -67965, -67977, -67977, -67977, -67977, -68005, -68025, -68025, -68025, -68036, -68036, -68046, -68060, -68106, -68124, -68140, -68162, -68162, -68162, -68162, -68174, -68212, -68212, -68212, -68212, -68239, -68239, -68265, -68265, -68272, -68290, -68290, -68323, -68323, -68332, -68332, -68332, -68332, -68342, -68359, -68359, -68359, -68387, -68387, -68387, -68387, -68387, -68402, -68402, -68402, -68417, -68440, +67551, +67557, +67565, +67581, +67587, +67604, +67604, +67611, +67611, +67611, +67621, +67621, +67628, +67628, +67672, +67693, +67693, +67705, +67712, +67724, +67724, +67724, +67724, +67740, +67749, +67771, +67781, +67781, +67781, +67808, +67808, +67808, +67815, +67862, +67873, +67873, +67873, +67882, +67882, +67888, +67906, +67912, +67931, +67931, +67931, +67941, +67973, +67973, +68011, +68045, +68045, +68062, +68062, +68068, +68068, +68080, +68091, +68091, +68127, +68151, +68151, +68172, +68172, +68172, +68172, +68179, +68189, +68204, +68224, +68233, +68251, +68251, +68258, +68258, +68258, +68270, +68270, +68270, +68307, +68307, +68326, +68326, +68366, +68366, +68366, +68385, +68385, +68385, +68391, +68391, +68391, +68420, +68427, +68427, +68427, +68427, +68437, +68437, +68437, +68437, 68445, -68454, -68454, -68461, -68461, -68482, -68482, -68482, -68512, -68553, +68445, +68462, +68462, +68462, +68475, +68475, +68475, +68488, +68497, +68504, +68504, +68527, +68550, 68563, 68563, -68563, -68563, -68563, -68563, -68583, -68583, -68618, -68627, -68627, -68645, -68645, -68645, -68660, -68666, -68676, -68676, -68697, -68697, -68697, -68702, -68715, -68752, -68767, -68787, -68787, -68808, -68808, -68808, -68827, -68857, -68857, -68871, -68895, -68895, -68910, -68924, -68955, -68968, +68582, +68582, +68582, +68582, +68622, +68622, +68651, +68656, +68669, +68682, +68682, +68693, +68693, +68701, +68701, +68701, +68701, +68701, +68701, +68729, +68743, +68743, +68757, +68757, +68773, +68789, +68801, +68833, +68833, +68833, +68833, +68840, +68866, +68866, +68866, +68881, +68909, +68925, +68946, 68989, 68989, -68989, -69014, -69014, -69035, -69035, -69035, -69062, -69062, -69069, -69077, -69077, -69092, -69107, -69127, -69127, -69127, -69145, -69157, -69157, -69164, -69164, -69171, -69171, +69005, +69015, +69029, +69044, +69076, +69076, +69095, +69095, +69102, +69125, +69125, +69125, +69125, +69139, +69161, +69161, +69166, +69172, +69172, 69178, -69178, -69256, -69270, -69270, -69322, -69322, -69336, -69344, -69344, -69375, -69394, -69452, -69452, -69452, -69452, -69465, -69488, -69508, -69508, -69514, -69514, -69524, -69552, -69552, -69552, -69552, -69569, -69575, -69595, -69595, -69602, -69643, +69186, +69215, +69215, +69243, +69243, +69243, +69273, +69273, +69273, +69273, +69283, +69299, +69299, +69299, +69299, +69299, +69340, +69381, +69388, +69398, +69398, +69398, +69398, +69398, +69438, +69438, +69438, +69445, +69445, +69476, +69476, +69476, +69481, +69503, +69541, +69541, +69541, +69573, +69593, +69593, +69593, +69609, +69619, 69661, -69667, -69681, -69681, -69692, -69699, -69699, -69721, -69721, -69721, -69740, -69740, -69760, -69766, -69774, -69774, -69783, -69815, -69838, -69848, -69848, -69848, -69848, -69848, -69861, -69871, -69871, -69881, -69924, -69940, -69947, -69947, -69977, -69989, -69989, -70005, +69661, +69700, +69706, +69736, +69736, +69770, +69770, +69776, +69799, +69840, +69840, +69875, +69894, +69894, +69917, +69933, +69949, +69949, +69949, +69954, +69965, +69965, +69965, +69965, +69965, +69979, +69986, 70005, +70010, 70016, -70016, -70058, -70058, -70068, -70098, -70098, -70110, -70126, -70137, -70146, -70165, +70035, +70035, +70072, +70082, +70119, +70158, +70168, 70177, -70177, -70177, -70177, -70183, -70183, -70183, -70196, -70223, -70223, -70239, -70258, -70258, -70258, +70202, +70230, +70242, +70242, +70275, +70282, +70282, +70282, 70296, 70296, -70306, -70314, -70330, -70345, -70369, -70369, -70369, -70369, -70369, -70413, -70430, -70430, -70463, -70463, -70479, -70479, -70479, -70486, -70520, -70546, -70559, -70559, -70570, -70619, -70685, -70723, -70742, -70742, +70296, +70296, +70296, +70302, +70302, +70302, +70302, +70302, +70324, +70324, +70341, +70367, +70392, +70425, +70467, +70467, +70504, +70504, +70522, +70522, +70522, +70561, +70561, +70580, +70601, +70612, +70612, +70663, +70663, +70669, +70669, +70669, +70669, +70698, +70698, +70722, +70734, +70750, 70756, -70784, -70784, -70784, -70791, +70794, +70794, 70809, -70816, -70823, -70830, -70837, -70837, -70856, -70863, +70819, +70819, +70819, +70853, 70870, -70877, -70877, -70877, -70884, -70903, -70915, -70925, -70925, -70925, -70954, -70968, -70975, -70975, -70975, -70982, -70989, -71010, -71027, -71036, -71036, -71065, -71065, -71079, -71104, -71111, -71119, -71162, +70906, +70917, +70922, +70935, +70950, +70977, +70990, +71014, +71024, +71041, +71076, +71076, +71090, +71090, +71100, +71125, +71125, +71131, +71131, +71137, +71157, +71169, 71181, 71181, -71196, -71238, -71269, -71276, -71281, -71281, -71298, -71311, -71311, -71352, -71352, -71359, -71359, +71181, +71193, +71201, +71210, +71216, +71243, +71253, +71253, +71290, +71306, 71372, -71395, -71395, -71395, -71404, +71391, +71391, +71405, +71423, +71423, 71428, 71428, -71428, -71449, -71449, -71471, -71478, -71478, -71478, -71478, -71487, -71487, -71494, -71494, -71525, -71532, -71532, -71544, -71544, -71544, -71567, -71584, -71584, -71591, -71591, -71618, -71631, -71638, -71648, -71648, -71655, -71677, -71684, -71699, -71706, -71706, -71713, -71713, -71740, -71763, -71768, -71784, -71812, -71830, -71864, -71882, -71882, -71882, -71910, -71928, -71939, -71977, -71984, -71984, -71999, -71999, -71999, -72023, -72023, -72023, -72037, -72037, -72037, -72081, -72112, -72158, -72177, -72229, -72229, -72253, -72263, -72263, -72278, -72283, -72283, -72283, -72283, +71443, +71460, +71460, +71460, +71460, +71460, +71460, +71460, +71460, +71460, +71460, +71511, +71511, +71521, +71535, +71543, +71548, +71548, +71553, +71553, +71573, +71573, +71596, +71625, +71625, +71625, +71639, +71667, +71674, +71674, +71698, +71705, +71705, +71705, +71725, +71732, +71750, +71773, +71773, +71773, +71780, +71787, +71805, +71805, +71805, +71835, +71869, +71880, +71885, +71892, +71914, +71921, +71950, +71976, +71993, +71993, +72005, +72012, +72019, +72026, +72062, +72093, +72100, +72125, +72146, +72146, +72146, +72195, +72233, +72270, 72294, -72294, -72315, -72330, -72350, -72350, -72375, -72388, -72388, -72388, -72408, -72434, -72462, -72482, -72524, -72530, -72530, -72585, -72600, -72636, -72672, -72679, +72307, +72317, +72345, +72377, +72384, +72413, +72426, +72426, +72449, +72449, +72463, +72463, +72479, +72479, +72486, +72505, +72511, +72531, +72538, +72558, +72565, +72565, +72565, +72591, +72598, +72608, +72640, +72658, 72686, -72717, -72749, -72749, -72749, -72749, -72756, -72762, -72798, -72824, -72843, -72867, -72867, -72885, +72700, +72736, +72743, +72743, +72743, +72743, +72771, +72803, +72819, +72832, +72832, +72857, +72864, +72874, 72897, -72897, -72903, -72916, -72938, -72983, -72983, -73006, -73020, -73036, -73065, -73084, -73103, -73110, -73110, +72910, +72918, +72918, +72941, +72964, +72964, +72976, +72976, +72990, +73023, +73023, +73030, +73038, +73044, +73070, +73079, +73079, +73086, +73093, +73120, +73139, +73146, 73146, 73153, -73153, -73160, -73160, -73177, -73184, -73191, -73205, -73248, -73290, -73304, -73355, -73355, -73355, +73164, +73213, +73262, +73277, +73277, +73292, +73325, +73325, 73355, 73361, -73361, -73367, -73367, -73374, 73390, -73408, -73408, -73420, -73431, -73438, -73448, -73448, -73455, -73455, -73482, -73482, -73493, -73516, -73554, -73591, -73600, -73600, -73607, -73632, -73646, -73674, -73680, -73690, -73697, -73704, -73727, -73744, -73761, -73767, -73774, -73801, -73819, -73826, -73826, -73826, +73390, +73407, +73414, +73414, +73421, +73440, +73479, +73487, +73502, +73511, +73527, +73549, +73556, +73576, +73576, +73576, +73586, +73595, +73595, +73602, +73602, +73621, +73663, +73670, +73684, +73691, +73724, +73743, +73771, +73783, +73783, +73783, +73783, +73800, +73800, +73805, +73811, +73828, +73828, 73833, -73840, -73859, -73888, -73912, -73919, -73930, -73937, +73853, +73870, +73875, +73875, +73894, +73935, 73959, -73959, -73966, -73990, +73979, 74000, 74000, -74012, -74019, -74045, -74045, -74070, -74077, -74077, -74094, -74119, -74139, -74153, -74169, -74176, -74229, -74263, -74277, -74314, -74314, -74344, -74358, -74365, -74411, -74441, -74455, -74461, -74475, -74489, -74489, -74489, -74489, -74503, -74524, -74543, -74550, -74568, -74580, -74596, -74610, +74006, +74013, +74013, +74013, +74042, +74055, +74062, +74069, +74069, +74069, +74069, +74076, +74082, +74107, +74114, +74121, +74141, +74146, +74166, +74166, +74184, +74205, +74219, +74259, +74259, +74259, +74288, +74329, +74329, +74336, +74336, +74376, +74383, +74383, +74383, +74390, +74410, +74417, +74417, +74424, +74431, +74453, +74467, +74481, +74514, +74537, +74552, +74552, +74552, +74561, +74561, +74571, +74571, +74571, +74578, +74597, +74597, 74621, -74628, -74657, -74684, +74641, +74641, +74648, +74685, 74709, 74709, -74716, -74744, -74744, -74783, -74845, -74850, -74887, -74904, -74904, -74918, +74724, +74758, +74758, +74772, +74782, +74805, +74811, +74841, +74899, +74912, +74925, 74933, -74961, -74961, -74995, +74940, +74959, +74975, +74982, +74989, 75002, -75002, -75023, -75023, -75030, -75072, -75079, -75079, -75110, -75117, -75138, -75170, -75179, -75193, -75213, -75220, -75227, -75238, -75246, -75253, -75278, -75285, -75292, -75292, -75311, -75311, -75341, -75358, -75358, -75392, -75421, -75438, -75450, -75456, -75474, -75480, -75501, -75514, -75521, -75521, -75546, -75574, -75600, -75623, -75623, -75642, -75655, -75662, -75694, -75701, -75724, -75724, -75740, -75769, -75801, -75808, -75826, -75826, -75841, -75865, -75879, -75879, -75879, -75910, -75919, -75938, -75945, -75952, -76008, -76018, -76057, -76064, -76071, -76078, -76078, -76100, -76100, -76100, +75036, +75036, +75076, +75083, +75119, +75133, +75155, +75169, +75174, +75195, +75195, +75224, +75224, +75224, +75239, +75269, +75284, +75284, +75312, +75329, +75383, +75383, +75404, +75451, +75451, +75473, +75473, +75482, +75488, +75488, +75488, +75517, +75527, +75534, +75534, +75558, +75581, +75604, +75644, +75666, +75666, +75673, +75706, +75706, +75725, +75757, +75764, +75764, +75783, +75807, +75827, +75866, +75899, +75906, +75913, +75913, +75943, +75955, +75967, +75995, +76031, +76072, +76072, +76079, +76095, +76112, +76112, +76119, +76126, +76126, 76133, -76177, -76177, -76187, -76222, -76222, -76222, -76246, -76286, -76309, -76318, -76346, -76346, -76346, -76354, -76371, -76371, -76412, -76421, -76436, -76446, -76453, -76475, -76506, -76513, -76520, -76543, -76570, -76577, +76144, +76144, +76166, +76186, +76186, +76203, +76203, +76234, +76234, +76249, +76263, +76305, +76316, +76325, +76343, +76361, +76368, +76368, +76368, +76434, +76466, +76473, +76481, +76481, +76499, +76536, +76536, +76536, +76536, +76567, +76567, +76567, +76574, +76574, +76582, +76582, +76582, +76582, +76593, +76608, +76608, +76608, +76608, 76615, -76615, -76639, -76672, -76706, -76713, -76720, -76736, -76736, -76736, -76768, -76775, -76788, -76805, -76827, -76843, -76850, -76857, -76880, -76895, -76902, -76929, -76969, -76976, -76982, -77036, -77043, -77043, -77050, -77050, -77057, -77071, -77087, -77100, +76632, +76661, +76668, +76694, +76701, +76701, +76701, +76718, +76738, +76772, +76780, +76780, +76780, +76780, +76794, +76808, +76808, +76808, +76825, +76841, +76867, +76885, +76912, +76912, +76912, +76939, +76939, +76957, +76957, +76973, +77001, +77015, +77015, +77027, +77027, +77060, +77070, +77070, +77093, +77104, 77114, -77128, -77142, -77159, -77192, -77206, -77213, -77226, -77226, -77292, -77292, -77310, -77310, -77326, -77346, -77375, -77402, -77402, -77425, -77456, -77467, -77467, -77474, -77484, -77484, -77491, -77505, -77505, -77520, -77520, -77541, -77555, -77569, -77576, -77576, -77589, -77603, +77129, +77129, +77129, +77136, +77136, +77136, +77184, +77199, +77221, +77229, +77236, +77236, +77249, +77276, +77309, +77332, +77362, +77362, +77388, +77398, +77404, +77404, +77450, +77460, +77487, +77487, +77504, +77519, +77539, +77549, +77549, +77556, +77556, +77572, +77572, +77580, 77610, -77649, -77681, -77681, -77688, -77724, -77751, -77758, -77792, -77792, -77792, -77798, -77813, -77820, -77853, -77860, -77860, -77897, -77945, -77954, -77954, -77980, -77993, -78011, -78011, -78011, -78027, -78054, -78085, -78085, -78105, -78112, -78119, -78152, -78173, -78188, -78188, -78195, -78223, -78242, -78249, -78300, -78300, -78332, -78339, -78339, -78354, -78354, -78394, -78394, -78418, -78425, -78448, -78455, -78489, -78507, +77631, +77631, +77631, +77631, +77650, +77659, +77659, +77659, +77670, +77670, +77682, +77682, +77682, +77730, +77730, +77730, +77738, +77738, +77738, +77738, +77738, +77748, +77748, +77761, +77789, +77808, +77808, +77824, +77824, +77824, +77824, +77824, +77824, +77835, +77835, +77867, +77895, +77895, +77914, +77914, +77933, +77966, +78003, +78039, +78057, +78071, +78098, +78122, +78122, +78128, +78159, +78159, +78169, +78201, +78201, +78208, +78226, +78247, +78257, +78268, +78268, +78280, +78280, +78280, +78280, +78293, +78319, +78319, +78342, +78356, +78372, +78381, +78381, +78396, +78396, +78396, +78396, +78434, +78453, +78453, +78459, +78477, +78477, +78477, +78477, +78487, +78492, +78492, 78532, -78532, -78549, -78563, -78585, -78592, -78606, -78613, -78613, -78620, -78648, -78692, -78714, +78542, +78570, +78587, +78603, +78633, +78644, +78644, +78644, +78644, +78650, +78693, +78693, +78735, 78758, -78805, -78825, -78839, -78885, -78934, -78979, +78787, +78824, +78838, +78838, +78838, +78838, +78838, +78838, +78849, +78869, +78869, +78869, +78869, +78891, +78891, +78891, +78891, +78898, +78898, +78898, +78918, +78944, +78944, +78958, +78965, +78965, +78972, 78984, -79016, -79016, -79030, -79050, +78998, +78998, +78998, +79034, 79057, -79070, -79070, -79070, -79070, -79070, -79077, -79095, +79064, +79084, +79090, +79090, +79090, 79102, -79102, -79110, -79148, -79176, -79183, -79195, -79195, -79195, -79202, -79202, -79254, -79268, -79268, -79276, -79300, -79315, -79332, -79332, -79340, -79359, -79378, -79390, +79116, +79123, +79132, +79155, +79180, +79180, +79194, +79194, +79217, +79217, +79217, +79224, +79243, +79243, +79243, +79250, +79257, +79264, +79301, +79331, +79339, +79339, +79339, +79346, +79353, +79361, +79368, +79375, +79397, 79404, -79429, -79441, -79453, -79462, -79462, -79485, -79492, -79492, -79492, -79492, -79492, -79512, -79530, -79542, -79552, -79552, -79560, -79588, -79595, -79623, -79652, -79661, -79661, -79696, -79721, -79721, -79731, -79731, -79738, -79749, -79749, -79778, -79796, -79796, -79804, -79804, -79811, -79811, -79811, -79846, -79857, -79865, -79890, -79890, -79890, -79897, -79916, -79916, -79923, -79948, -79987, -79987, -79987, -79987, -80003, +79415, +79428, +79428, +79436, +79448, +79455, +79455, +79487, +79504, +79511, +79534, +79548, +79566, +79573, +79583, +79602, +79633, +79648, +79670, +79677, +79677, +79684, +79684, +79706, +79706, +79725, +79764, +79764, +79770, +79793, +79793, +79809, +79809, +79809, +79809, +79830, +79837, +79843, +79876, +79899, +79899, +79899, +79936, +79942, +79952, +79967, +79998, 80047, -80060, -80068, -80098, -80098, -80098, -80098, -80098, -80127, -80136, -80136, -80136, -80157, -80177, -80177, -80212, -80237, -80237, +80088, +80137, +80144, +80164, +80171, +80178, +80178, +80178, +80185, +80192, +80239, 80247, -80265, -80278, -80278, -80278, -80290, -80308, -80341, -80348, -80356, -80356, -80356, -80387, -80387, -80403, -80418, -80447, -80447, -80453, -80453, -80453, -80479, -80479, -80495, -80495, -80495, -80495, -80495, -80507, -80507, -80507, -80507, -80507, -80507, -80513, -80542, -80573, -80573, -80579, -80579, -80579, -80610, -80620, -80620, -80620, -80636, -80636, -80636, -80663, -80672, -80672, -80672, -80689, -80734, -80734, -80734, -80743, -80771, -80780, -80780, -80789, -80789, -80820, -80828, +80302, +80302, +80326, +80350, +80357, +80357, +80385, +80396, +80417, +80455, +80455, +80455, +80480, +80514, +80531, +80543, +80543, +80543, +80571, +80618, +80618, +80625, +80685, +80690, +80711, +80718, +80741, +80755, +80776, +80776, +80776, +80776, +80790, +80790, +80797, +80815, +80838, +80856, +80863, 80870, -80897, -80908, -80934, -80947, -80947, -80959, -80996, -81025, -81025, -81025, -81037, -81037, -81037, -81037, -81037, -81037, -81044, -81057, -81057, -81091, -81099, -81109, -81126, -81142, -81142, -81157, -81157, -81189, -81189, -81217, -81248, -81248, -81255, +80877, +80877, +80877, +80885, +80904, +80948, +80965, +80986, +81006, +81006, +81027, +81041, +81041, +81062, +81062, +81087, +81094, +81094, +81094, +81108, +81117, +81124, +81143, +81150, +81173, +81192, +81210, +81210, +81227, +81266, 81279, -81289, -81289, -81316, -81316, -81316, -81334, -81334, -81345, -81350, -81378, -81391, -81415, -81426, -81446, -81446, -81488, -81523, -81523, -81533, -81533, -81551, -81580, -81593, -81605, -81605, -81605, -81605, -81612, -81631, -81661, -81681, -81697, -81733, -81733, -81733, -81745, -81770, -81770, -81781, -81781, -81781, -81794, -81805, -81805, -81805, -81837, -81837, -81848, -81866, -81866, -81866, -81866, +81302, +81302, +81309, +81309, +81337, +81348, +81355, +81362, +81386, +81411, +81421, +81421, +81456, +81480, +81504, +81529, +81555, +81590, +81597, +81604, +81621, +81621, +81628, +81628, +81652, +81680, +81680, +81707, +81714, +81738, +81738, +81763, +81776, +81801, +81808, +81830, +81844, +81865, 81872, -81872, -81880, -81891, -81891, -81912, -81912, -81937, -81937, -81943, -81959, -81971, -82016, -82029, -82071, -82071, -82071, -82071, -82071, -82082, -82082, -82094, -82101, -82101, -82108, -82121, -82141, -82154, -82154, -82154, -82154, -82166, -82166, -82173, -82204, -82230, -82249, -82298, -82320, -82348, -82348, -82348, -82373, -82389, -82389, -82405, -82405, +81884, +81884, +81896, +81896, +81896, +81903, +81903, +81917, +81924, +81939, +81995, +82003, +82026, +82056, +82056, +82056, +82078, +82078, +82086, +82109, +82150, +82165, +82165, +82186, +82186, +82186, +82186, +82186, +82208, +82208, +82226, +82226, +82239, +82284, +82291, +82301, +82322, +82339, +82361, +82368, +82396, 82412, -82426, -82433, -82433, +82425, +82425, +82425, 82440, -82463, -82492, -82499, -82499, -82525, -82542, -82560, +82457, +82489, +82503, +82522, +82522, +82541, +82550, +82567, +82567, 82576, -82600, -82613, -82613, -82628, -82642, -82664, -82713, -82747, -82747, -82754, -82763, -82787, -82808, -82808, -82828, -82835, -82842, -82863, -82880, -82880, -82880, -82891, -82891, -82918, -82923, -82958, -82965, -82972, -82972, -82972, -82972, -82979, -82989, -83011, -83021, -83021, -83021, -83028, -83028, -83035, -83059, -83066, -83066, -83066, -83082, -83082, -83082, -83100, -83100, -83100, -83126, -83126, -83126, -83126, -83157, -83157, -83157, -83157, -83168, -83186, -83210, -83210, -83210, -83229, -83235, -83243, -83279, -83307, -83316, -83325, -83353, -83374, -83374, -83384, -83405, +82594, +82601, +82601, +82616, +82616, +82616, +82616, +82634, +82634, +82634, +82655, +82662, +82676, +82676, +82703, +82737, +82744, +82774, +82816, +82839, +82839, +82869, +82894, +82913, +82929, +82941, +82954, +82954, +82954, +82978, +82983, +82983, +83017, +83024, +83024, +83024, +83024, +83024, +83031, +83049, +83092, +83111, +83118, +83131, +83138, +83162, +83182, +83202, +83209, +83209, +83216, +83216, +83216, +83251, +83251, +83251, +83251, +83258, +83272, +83314, +83314, +83314, +83354, +83366, +83366, +83397, +83412, 83419, -83425, -83455, -83471, -83483, -83490, -83510, -83515, -83515, -83549, -83555, -83555, -83595, -83595, -83595, -83595, -83602, -83668, -83696, -83696, -83696, -83696, -83696, -83702, -83718, -83734, -83734, -83771, -83810, -83818, -83836, -83836, -83836, -83867, -83867, -83874, -83874, -83900, -83923, -83923, -83958, -83982, -84022, -84029, -84044, -84044, -84051, -84051, -84067, -84084, -84134, -84149, -84192, -84198, -84205, -84211, -84241, -84259, -84270, -84288, -84310, -84339, -84346, -84353, -84400, -84400, -84400, -84400, -84421, -84428, -84444, -84487, -84507, -84539, -84575, -84575, -84587, -84587, -84602, -84614, -84621, -84628, -84642, -84653, -84653, -84663, -84690, -84699, -84706, -84731, -84738, -84767, +83419, +83434, +83440, +83464, +83464, +83497, +83497, +83497, +83524, +83542, +83556, +83611, +83611, +83611, +83611, +83616, +83616, +83667, +83675, +83681, +83704, +83730, +83730, +83749, +83767, +83784, +83789, +83823, +83823, +83858, +83872, +83872, +83877, +83893, +83893, +83912, +83912, +83934, +83934, +83941, +83957, +83957, +83968, +83984, +83990, +84001, +84016, +84023, +84048, +84073, +84073, +84098, +84140, +84140, +84140, +84160, +84203, +84233, +84233, +84245, +84268, +84304, +84304, +84304, +84309, +84315, +84340, +84376, +84388, +84437, +84455, +84462, +84482, +84502, +84516, +84516, +84516, +84532, +84542, +84542, +84542, +84588, +84588, +84608, +84635, +84635, +84635, +84649, +84681, +84698, +84735, +84756, 84774, -84781, -84799, -84816, -84823, -84836, -84843, -84850, -84872, +84774, +84774, +84774, +84797, +84797, +84815, +84832, +84832, +84832, +84842, +84842, +84869, +84869, +84869, 84879, -84886, -84886, -84886, -84893, -84900, -84921, -84946, -84953, -84967, -84974, -84981, -84988, -85004, -85004, -85004, -85022, -85050, -85050, -85050, -85057, -85071, -85071, -85115, -85135, -85135, -85154, -85174, -85190, -85217, -85243, -85250, -85250, -85276, -85284, -85295, -85313, -85313, -85330, -85330, -85330, -85330, -85337, -85344, -85354, -85374, -85381, -85393, -85400, -85414, -85429, -85452, -85459, -85496, -85520, -85520, -85534, -85534, -85540, -85547, -85547, -85547, +84899, +84906, +84906, +84906, +84920, +84925, +84950, +84965, +84982, +84982, +84994, +84999, +85011, +85041, +85041, +85062, +85062, +85062, +85062, +85086, +85096, +85096, +85121, +85121, +85140, +85140, +85178, +85178, +85196, +85215, +85235, +85235, +85235, +85257, +85257, +85257, +85266, +85279, +85293, +85293, +85293, +85299, +85325, +85325, +85331, +85358, +85358, +85358, +85366, +85379, +85391, +85419, +85419, +85436, +85442, +85465, +85471, +85495, +85495, +85495, +85505, +85505, +85517, +85517, +85517, +85517, +85561, +85577, +85577, 85594, -85594, -85611, -85611, -85633, -85679, -85716, -85732, -85732, -85767, -85782, -85791, -85804, -85818, -85828, -85828, -85828, -85855, -85855, -85855, -85878, -85902, -85909, -85923, -85930, -85973, -85996, -86028, +85599, +85599, +85621, +85635, +85651, +85681, +85689, +85689, +85689, +85689, +85708, +85708, +85718, +85718, +85733, +85733, +85733, +85754, +85774, +85789, +85789, +85811, +85811, +85821, +85821, +85821, +85861, +85882, +85882, +85920, +85920, +85935, +85942, +85962, +85970, +85970, +85994, +85994, +86024, +86035, 86070, -86117, -86117, -86137, -86144, -86144, -86152, -86159, -86181, -86195, -86195, -86202, -86220, -86239, -86239, -86239, -86246, +86098, +86103, +86113, +86134, +86165, +86176, +86176, +86176, +86176, +86176, +86176, +86176, +86189, +86189, +86189, +86189, +86189, +86207, +86217, +86228, +86248, 86265, -86272, -86272, -86296, -86303, -86317, -86340, -86340, -86356, -86368, -86386, -86419, -86419, -86448, -86475, -86482, -86482, -86497, -86520, -86520, -86520, -86530, -86530, -86544, -86576, -86576, -86583, -86583, -86637, -86651, -86668, -86668, -86668, -86679, -86679, -86679, -86701, -86735, -86772, -86772, -86779, -86779, -86798, -86841, -86848, -86848, -86848, -86882, -86903, -86903, -86912, -86924, -86924, -86924, -86950, -86957, -86973, -86982, -86989, -86989, -87009, -87036, -87036, -87036, -87045, -87058, -87094, -87094, -87094, -87120, -87120, -87168, -87174, -87174, -87195, -87211, -87239, -87239, -87239, -87239, -87282, -87282, -87307, -87307, -87307, -87307, -87312, -87338, -87345, -87354, -87382, -87390, -87422, -87440, -87447, -87457, -87472, -87472, -87489, -87489, -87512, -87556, -87556, -87575, -87599, -87599, -87610, -87610, -87610, -87631, -87668, -87680, -87680, -87680, -87693, -87719, -87736, -87787, -87818, -87825, -87831, -87831, -87831, -87831, +86290, +86329, +86329, +86329, +86329, +86329, +86329, +86346, +86346, +86346, +86346, +86375, +86375, +86394, +86394, +86394, +86402, +86418, +86444, +86455, +86455, +86499, +86499, +86518, +86518, +86539, +86554, +86554, +86554, +86581, +86581, +86581, +86591, +86611, +86611, +86650, +86650, +86650, +86693, +86693, +86693, +86716, +86732, +86752, +86752, +86767, +86767, +86767, +86777, +86794, +86794, +86803, +86803, +86803, +86803, +86822, +86827, +86827, +86861, +86880, +86880, +86908, +86908, +86908, +86936, +86936, +86936, +86936, +86945, +86945, +86967, +86990, +87003, +87015, +87029, +87061, +87080, +87080, +87098, +87129, +87129, +87129, +87173, +87184, +87209, +87209, +87262, +87279, +87331, +87331, +87331, +87362, +87378, +87387, +87387, +87398, +87398, +87405, +87405, +87425, +87425, +87425, +87425, +87425, +87449, +87449, +87454, +87516, +87567, +87577, +87577, +87577, +87595, +87616, +87652, +87657, +87657, +87657, +87666, +87676, +87732, +87748, +87748, +87772, +87772, +87793, +87793, +87793, +87793, +87806, +87806, +87812, +87836, +87836, 87843, -87880, -87892, -87909, -87909, -87909, -87929, -87951, -87951, -87973, -87973, -87997, -88019, -88031, -88031, -88040, -88040, -88060, -88067, -88074, -88081, -88111, -88137, -88144, -88144, -88156, -88163, -88163, -88192, -88192, -88192, -88192, -88192, -88192, -88192, -88192, -88211, -88218, -88218, -88245, -88245, -88271, -88286, -88293, -88306, -88336, -88336, -88336, -88336, -88348, -88370, -88370, -88370, +87843, +87843, +87843, +87859, +87859, +87902, +87918, +87918, +87928, +87941, +87975, +87975, +88007, +88007, +88050, +88065, +88108, +88128, +88141, +88146, +88167, +88174, +88181, +88197, +88219, +88219, +88244, +88244, +88262, +88278, +88278, +88285, +88304, +88325, +88325, +88338, +88338, +88349, +88365, +88365, +88365, +88365, +88371, 88394, -88394, -88394, -88409, -88409, -88434, -88448, -88462, -88484, -88512, -88525, -88551, -88584, -88592, -88599, -88611, -88667, -88667, -88684, -88696, -88696, -88728, -88728, -88728, -88744, -88744, -88771, -88792, -88814, -88814, -88814, -88832, -88832, -88832, -88842, -88849, -88849, -88854, +88414, +88414, +88414, +88423, +88452, +88464, +88485, +88505, +88552, +88552, +88552, +88552, +88563, +88563, +88578, +88585, +88585, +88604, +88629, +88629, +88635, +88646, +88676, +88689, +88706, +88706, +88706, +88733, +88740, +88754, +88774, +88791, +88835, +88851, +88851, +88851, +88861, 88868, -88876, -88916, -88916, -88941, -88941, -88976, -88976, -88985, -88993, +88893, +88905, +88924, +88930, +88930, +88937, +88953, +88966, +88987, 89008, -89008, -89008, -89027, -89027, -89027, -89040, -89064, -89064, -89064, -89064, -89105, -89113, -89120, -89142, -89142, -89142, -89150, +89028, +89050, +89069, +89069, +89069, +89069, +89096, +89107, +89114, +89114, +89114, +89139, +89163, +89178, +89191, +89191, 89197, -89197, -89197, -89204, -89210, -89210, -89230, -89248, -89275, -89303, -89303, -89310, -89310, -89321, -89321, -89339, -89374, -89374, -89374, -89391, -89417, -89442, -89442, -89451, -89461, -89461, -89461, -89471, -89471, -89525, -89525, -89541, -89541, -89561, -89592, -89602, -89614, -89636, -89636, -89650, -89684, -89684, -89707, -89733, -89733, -89733, -89746, -89746, -89746, -89746, -89746, -89785, -89785, -89785, -89802, -89802, -89802, -89812, -89819, -89819, -89826, -89826, -89826, -89826, -89826, -89826, -89826, -89844, -89851, +89217, +89217, +89239, +89249, +89249, +89302, +89302, +89312, +89328, +89328, +89328, +89328, +89328, +89328, +89344, +89344, +89344, +89344, +89351, +89351, +89361, +89377, +89377, +89377, +89377, +89384, +89403, +89403, +89409, +89433, +89433, +89440, +89466, +89478, +89518, +89565, +89565, +89581, +89581, +89593, +89598, +89631, +89646, +89646, +89646, +89646, +89669, +89669, +89694, +89694, +89718, +89743, +89743, +89774, +89774, +89811, +89831, +89855, +89855, +89855, 89866, -89876, -89917, -89929, -89948, -89973, -89987, -90013, -90013, -90020, -90020, -90051, -90060, -90070, -90070, -90077, -90088, -90096, -90096, -90096, -90096, -90116, -90142, -90156, -90168, -90175, -90186, -90192, -90212, -90238, -90265, -90277, -90301, -90301, -90301, -90306, -90306, -90384, -90384, -90398, -90418, -90438, -90467, -90474, -90486, -90504, -90513, -90513, -90513, -90529, -90538, +89879, +89886, +89893, +89893, +89902, +89902, +89912, +89928, +89928, +89938, +89966, +89966, +89966, +89966, +89966, +89988, +90001, +90001, +90001, +90019, +90036, +90036, +90036, +90067, +90067, +90104, +90122, +90136, +90177, +90199, +90206, +90206, +90216, +90240, +90240, +90271, +90300, +90322, +90322, +90346, +90346, +90380, +90391, +90403, +90412, +90424, +90424, +90424, +90446, +90446, +90446, +90458, +90458, +90458, +90490, +90490, 90546, -90557, +90546, +90554, +90564, +90564, 90564, -90585, 90592, -90604, -90622, -90627, -90642, -90642, -90652, -90659, -90659, -90666, -90666, -90666, -90686, -90706, -90743, -90743, -90750, -90750, -90750, -90770, -90786, -90830, -90849, -90856, -90856, -90856, -90881, -90896, -90910, -90956, -90969, -90991, -90999, -91007, -91021, -91036, -91036, -91054, +90592, +90592, +90592, +90592, +90600, +90616, +90626, +90650, +90658, +90668, +90692, +90701, +90701, +90701, +90701, +90718, +90725, +90725, +90749, +90749, +90767, +90779, +90779, +90779, +90779, +90797, +90797, +90828, +90869, +90880, +90880, +90909, +90916, +90916, +90928, +90928, +90928, +90928, +90928, +90928, +90928, +90928, +90928, +90937, +90937, +90937, +90946, +90946, +90960, +91009, +91009, +91017, 91059, -91101, -91120, -91159, -91177, +91078, +91078, +91086, +91127, +91145, +91145, +91145, +91155, +91168, +91178, +91185, +91185, +91205, +91205, +91205, 91217, -91236, +91225, +91246, 91268, -91285, -91293, -91300, -91300, -91300, -91300, -91310, -91348, +91268, +91281, +91291, +91291, +91305, +91320, +91333, +91333, +91333, +91345, +91345, +91345, +91345, 91379, -91386, -91386, -91408, -91415, -91438, -91455, -91455, -91474, -91474, -91485, -91485, -91492, -91513, -91546, -91546, -91553, -91553, -91553, -91566, -91566, -91566, -91581, -91596, -91596, -91615, -91615, -91629, -91629, +91399, +91411, +91411, +91442, +91442, +91467, +91482, +91501, +91543, +91543, +91561, +91573, +91598, +91610, 91637, -91637, -91644, -91658, -91673, -91688, -91705, -91705, -91723, -91741, -91759, -91759, -91759, -91759, -91771, -91825, -91825, -91842, +91680, +91680, +91680, +91680, +91711, +91711, +91711, +91730, +91744, +91744, +91762, +91762, +91839, +91847, +91847, 91860, -91870, -91870, -91870, -91888, -91888, -91914, -91940, -91955, -91962, -91962, -91994, -92009, -92036, -92036, -92043, -92054, -92054, -92086, -92086, -92086, -92095, -92125, -92125, -92138, -92138, -92147, -92173, -92234, -92249, -92256, -92277, -92293, -92322, -92322, -92322, -92322, -92322, -92322, -92328, -92339, -92348, -92348, -92348, +91894, +91912, +91928, +91937, +91954, +91966, +91978, +91990, +92021, +92021, +92021, +92039, +92072, +92105, +92105, +92105, +92126, +92133, +92165, +92202, +92244, +92250, +92250, +92261, +92261, +92304, +92315, +92315, +92315, +92341, +92341, 92357, -92400, -92400, -92400, -92415, -92425, -92432, -92432, -92432, -92432, -92438, -92462, -92492, -92499, -92499, -92499, -92499, -92520, -92534, -92560, -92560, -92587, -92587, -92596, -92613, -92642, -92676, -92699, -92699, -92699, -92712, -92712, -92712, +92373, +92396, +92405, +92405, +92405, +92411, +92411, +92430, +92441, +92441, +92441, +92451, +92451, +92451, +92470, +92497, +92526, +92526, +92526, +92526, +92558, +92576, +92576, +92576, +92576, +92588, +92595, +92595, +92622, +92633, +92650, +92650, +92662, +92679, +92708, +92708, +92716, +92716, +92716, 92732, -92732, -92754, -92769, -92795, -92845, -92857, -92857, -92879, -92879, -92879, -92898, -92931, -92943, -92952, -92952, -92952, -92961, -92961, -92969, -92969, -92969, -92969, -93001, -93001, -93001, -93001, -93017, -93017, -93033, -93054, -93054, -93061, -93061, -93061, -93070, -93070, -93070, -93099, -93099, -93112, -93112, -93121, -93153, -93153, -93153, +92759, +92771, +92771, +92790, +92790, +92837, +92891, +92908, +92920, +92920, +92950, +92984, +93000, +93000, +93011, +93011, +93035, +93047, +93077, +93077, +93089, +93089, +93089, +93101, +93101, +93101, +93114, +93148, +93148, +93169, 93187, -93208, -93214, -93220, -93231, -93231, -93231, -93231, -93231, -93256, -93256, -93256, -93262, -93262, -93270, -93270, -93270, -93270, -93270, -93277, -93326, -93344, -93362, -93362, -93362, -93362, -93376, -93408, -93408, -93415, -93415, -93415, -93427, -93427, -93427, -93433, -93445, -93464, -93503, -93513, -93525, -93525, -93547, -93564, -93595, -93595, -93623, -93653, -93662, -93662, -93678, -93678, -93678, -93742, -93763, -93770, -93777, -93790, -93796, -93814, -93823, -93830, -93843, +93207, +93219, +93233, +93233, +93240, +93249, +93249, +93274, +93296, +93333, +93356, +93356, +93356, +93368, +93437, +93465, +93491, +93501, +93519, +93560, +93560, +93560, +93574, +93587, +93619, +93648, +93688, +93700, +93712, +93739, +93739, +93779, +93779, +93797, +93826, 93856, -93864, -93908, -93935, -93935, -93935, -93944, -93952, -93952, +93895, +93911, +93911, +93943, +93943, +93968, +93968, +93968, +93968, +93968, +93977, +93977, +93977, +93986, 93997, -94035, -94054, -94054, -94065, -94065, -94079, -94125, -94138, -94155, -94170, -94182, -94208, -94243, -94253, -94271, -94283, -94295, -94312, -94326, -94326, -94364, -94382, -94382, +94008, +94008, +94031, +94049, +94064, +94064, +94074, +94082, +94099, +94099, +94109, +94128, +94145, +94163, +94169, +94169, +94181, +94181, +94181, +94181, +94181, +94181, +94181, +94203, +94203, +94203, +94203, +94221, +94221, +94221, +94221, +94221, +94241, +94241, +94241, +94241, +94241, +94257, +94270, +94270, +94289, +94289, +94311, +94311, +94311, +94338, +94352, +94352, +94352, +94366, +94366, +94388, +94388, +94388, +94398, +94398, +94398, 94410, -94432, -94432, -94453, -94453, -94479, -94487, -94514, -94529, -94529, -94540, -94540, -94547, -94601, -94601, -94631, -94669, -94669, -94680, -94680, -94706, -94742, -94782, -94782, -94792, -94802, -94824, -94824, -94834, -94834, -94851, -94871, -94878, -94878, -94906, -94906, -94913, -94957, -94980, -94989, -94995, -95008, -95024, -95068, -95089, -95089, -95099, -95099, -95140, -95146, -95146, -95146, -95173, -95185, -95185, -95185, -95185, -95185, +94410, +94436, +94436, +94452, +94483, +94489, +94501, +94528, +94548, +94571, +94571, +94584, +94604, +94604, +94604, +94604, +94614, +94614, +94614, +94626, +94655, +94670, +94691, +94697, +94712, +94712, +94736, +94743, +94767, +94803, +94862, +94907, +94907, +94907, +94907, +94907, +94914, +94924, +94951, +94951, +94951, +94951, +94962, +94962, +94969, +94969, +94988, +94988, +94988, +95002, +95021, +95021, +95058, +95058, +95058, +95085, +95085, +95096, +95112, +95112, +95112, +95125, +95125, +95152, +95152, +95183, +95183, 95208, -95208, -95208, -95208, -95214, -95214, -95214, -95248, -95254, -95261, -95288, -95288, -95300, -95326, -95326, -95344, -95360, -95360, -95360, -95360, -95360, -95360, -95369, -95369, -95381, -95393, -95414, -95414, -95414, -95414, -95420, -95427, -95474, -95474, -95474, -95516, -95516, -95516, -95562, -95569, -95611, -95611, -95611, -95652, -95664, -95664, -95671, -95671, -95716, -95716, +95213, +95213, +95253, +95271, +95291, +95332, +95332, +95332, +95332, +95357, +95373, +95383, +95383, +95397, +95407, +95407, +95407, +95407, +95407, +95428, +95435, +95435, +95442, +95442, +95450, +95478, +95492, +95492, +95492, +95492, +95492, +95492, +95521, +95521, +95521, +95589, +95589, +95599, +95623, +95623, +95637, +95651, +95662, +95702, +95702, +95702, +95711, +95718, +95718, +95734, 95741, -95741, -95741, -95757, -95781, -95781, -95781, -95781, -95792, -95810, -95836, -95836, -95836, -95841, -95860, -95860, -95871, -95871, -95871, -95923, -95923, -95938, +95751, +95751, +95764, +95771, +95771, +95788, +95800, +95804, +95804, +95809, +95826, +95826, +95859, +95859, +95859, +95875, +95875, +95919, +95919, +95919, +95929, +95929, 95956, -95968, -95990, -96000, -96007, -96017, -96017, -96017, -96029, -96047, -96064, -96064, -96078, -96078, -96078, -96085, -96085, -96097, -96097, -96106, -96106, -96128, -96152, -96152, -96152, -96152, -96201, -96217, -96237, -96237, -96237, +95964, +95978, +95992, +96019, +96019, +96019, +96056, +96056, +96056, +96056, +96075, +96075, +96100, +96100, +96158, +96176, 96247, -96255, -96287, -96293, -96301, -96325, -96331, -96331, -96349, -96359, -96375, -96406, -96406, -96412, -96440, -96451, -96451, -96463, -96463, -96488, -96507, -96519, -96519, -96531, -96537, -96558, -96570, -96585, -96604, -96622, -96638, -96638, -96638, -96668, -96668, -96668, -96668, -96668, -96702, -96702, -96725, -96735, -96735, -96735, -96747, -96758, -96777, -96777, -96777, -96777, -96795, -96795, -96804, -96816, -96844, -96844, -96844, -96892, -96904, -96916, -96916, -96935, -96935, -96972, -96972, -96972, -96972, -96989, -97005, -97013, -97013, -97013, -97013, -97013, -97043, -97061, -97061, -97071, -97108, -97124, -97124, +96247, +96275, +96317, +96317, +96317, +96337, +96337, +96337, +96348, +96348, +96348, +96383, +96383, +96403, +96449, +96449, +96458, +96470, +96481, +96481, +96525, +96536, +96543, +96543, +96564, +96564, +96572, +96605, +96643, +96643, +96653, +96659, +96673, +96677, +96685, +96685, +96697, +96706, +96706, +96706, +96740, +96756, +96766, +96782, +96782, +96792, +96839, +96849, +96866, +96866, +96902, +96945, +96945, +96953, +96953, +97000, +97015, +97034, +97038, +97046, +97056, +97104, +97117, +97155, +97155, +97155, 97178, -97178, -97178, -97178, -97178, -97183, -97215, -97235, -97242, -97242, -97273, -97273, -97325, -97325, -97325, -97325, -97366, -97366, -97366, -97377, -97377, -97383, -97390, -97422, -97422, -97434, -97459, -97490, -97490, +97199, +97199, +97217, +97247, +97262, +97269, +97269, +97269, +97269, +97277, +97289, +97322, +97339, +97389, +97409, +97409, +97409, +97432, +97448, +97448, +97448, +97448, +97456, +97510, 97530, 97530, -97530, -97530, -97530, -97541, -97541, -97541, -97541, -97541, -97558, -97571, -97571, -97597, -97608, -97622, -97639, -97639, -97639, -97646, -97646, -97646, -97646, -97668, -97668, -97685, -97711, -97744, -97764, -97764, -97776, -97788, -97817, -97817, -97817, -97817, -97833, -97846, -97846, -97866, -97866, -97866, -97878, -97878, -97878, -97901, -97925, -97931, -97949, -97949, -97957, -97965, -97965, -97965, -97965, -97965, -97980, -97991, -98004, -98023, -98034, -98034, -98045, -98045, -98045, -98056, -98085, -98085, -98085, -98106, -98132, -98141, -98141, -98166, -98183, -98183, -98189, -98189, -98195, -98252, -98252, -98252, -98274, -98278, -98288, -98288, -98309, -98330, -98330, -98336, -98356, -98356, -98411, -98427, -98427, -98448, -98448, -98448, -98448, -98464, -98464, -98495, -98510, -98510, -98510, -98510, -98510, -98510, -98525, -98553, -98553, -98580, -98610, -98610, -98626, -98626, -98637, -98637, -98652, -98662, -98662, -98662, -98662, -98662, -98678, -98691, -98706, -98716, -98732, -98732, -98759, -98774, -98778, -98792, -98792, -98801, -98819, -98819, -98844, -98866, -98886, -98886, -98886, -98886, -98906, -98915, -98915, -98915, -98947, -98947, -98947, -98947, -98995, -99001, -99031, -99031, -99031, -99035, -99035, -99035, -99053, -99053, -99059, -99059, -99059, -99059, -99081, -99097, -99109, -99109, -99116, -99116, -99134, -99134, -99144, -99144, -99187, -99193, -99193, -99193, -99193, -99193, -99234, -99268, -99296, -99313, -99322, -99353, -99353, -99359, -99359, -99359, -99368, -99379, -99379, -99379, -99385, -99385, -99400, -99400, -99404, -99404, -99404, -99422, -99422, -99422, -99447, +97544, +97561, +97581, +97581, +97616, +97616, +97647, +97656, +97660, +97660, +97660, +97683, +97706, +97754, +97775, +97780, +97787, +97787, +97799, +97813, +97813, +97855, +97855, +97855, +97855, +97879, +97919, +97919, +97934, +97945, +97971, +97999, +98016, +98016, +98024, +98024, +98046, +98046, +98053, +98060, +98060, +98060, +98079, +98079, +98089, +98112, +98122, +98151, +98151, +98165, +98172, +98172, +98182, +98211, +98226, +98257, +98275, +98310, +98328, +98343, +98343, +98360, +98360, +98388, +98409, +98418, +98423, +98423, +98444, +98444, +98469, +98469, +98505, +98515, +98515, +98536, +98536, +98536, +98546, +98552, +98552, +98559, +98559, +98576, +98594, +98607, +98607, +98632, +98632, +98663, +98663, +98676, +98692, +98692, +98692, +98707, +98727, +98744, +98744, +98775, +98775, +98811, +98833, +98853, +98877, +98928, +98928, +98932, +98962, +98984, +98996, +98996, +99017, +99017, +99017, +99030, +99030, +99030, +99051, +99100, +99120, +99120, +99125, +99149, +99149, +99149, +99158, +99158, +99170, +99179, +99215, +99246, +99287, +99305, +99316, +99316, +99333, +99342, +99367, +99367, +99376, +99376, +99376, +99412, +99412, +99429, +99429, 99469, -99469, -99469, -99497, -99522, -99544, -99544, -99544, -99544, -99562, -99583, -99603, -99603, -99609, -99609, -99609, -99619, -99654, +99473, +99483, +99506, +99506, +99506, +99506, +99535, +99541, +99541, +99554, +99567, +99567, +99579, +99579, +99579, +99594, +99617, +99657, +99657, +99657, +99668, +99668, +99668, 99673, -99673, -99683, -99683, -99720, -99731, -99747, -99754, -99795, -99805, -99817, -99817, -99841, -99854, -99872, -99885, -99885, -99907, -99939, -99944, -99961, -99988, -100011, -100011, -100011, -100011, -100011, -100011, -100011, -100011, -100011, -100087, -100103, -100103, -100125, -100149, -100157, -100157, -100169, -100169, -100169, -100169, -100184, +99679, +99679, +99679, +99700, +99759, +99772, +99780, +99780, +99780, +99786, +99803, +99803, +99809, +99820, +99839, +99847, +99859, +99859, +99859, +99881, +99881, +99903, +99903, +99903, +99903, +99903, +99909, +99909, +99909, +99929, +99954, +99964, +99964, +99964, +99980, +99980, +99980, +100021, +100029, +100035, +100041, +100045, +100063, +100104, +100136, +100136, +100136, +100144, +100180, +100186, 100196, -100196, -100196, -100196, -100204, -100204, -100217, -100246, -100258, -100284, -100300, -100315, -100338, -100355, -100355, -100361, -100361, -100361, -100387, -100387, -100387, -100387, -100404, -100422, -100428, -100428, -100437, -100443, -100458, -100491, -100529, -100542, -100555, -100559, -100559, -100559, -100575, -100593, -100593, -100593, -100593, -100593, -100615, -100615, -100623, -100641, -100647, -100666, -100690, -100690, -100708, -100724, -100737, -100741, -100770, -100789, -100810, -100810, -100810, -100827, -100827, -100885, -100885, -100885, -100885, -100908, -100918, -100939, -100939, -100939, -100953, -100957, -100987, -101008, -101008, -101008, -101008, -101008, -101008, -101034, -101050, -101050, -101070, -101070, -101079, -101079, -101087, -101087, -101087, -101095, -101116, -101129, -101148, -101148, -101148, -101148, -101148, -101148, -101162, -101215, -101215, -101215, -101215, -101236, -101241, -101267, -101267, -101272, -101272, -101272, -101281, -101296, -101296, -101296, -101296, -101296, -101296, -101296, -101325, -101330, -101330, -101378, -101378, +100238, +100254, +100272, +100296, +100309, +100341, +100341, +100393, +100425, +100425, +100425, +100449, +100449, +100449, +100482, +100482, +100482, +100501, +100535, +100556, +100556, +100573, +100588, +100618, +100618, +100635, +100653, +100653, +100653, +100695, +100695, +100695, +100742, +100742, +100781, +100816, +100816, +100816, +100874, +100874, +100915, +100915, +100923, +100923, +100948, +100948, +100962, +100962, +100962, +100966, +100971, +100979, +100979, +100979, +100979, +100993, +101014, +101029, +101047, +101054, +101086, +101086, +101086, +101094, +101115, +101121, +101140, +101150, +101180, +101180, +101180, +101201, +101201, +101213, +101218, +101226, +101234, +101253, +101260, +101275, +101284, +101284, +101300, +101320, +101364, +101372, +101372, +101380, +101380, +101392, +101392, 101392, 101399, -101406, -101419, -101419, -101469, -101469, -101469, -101494, -101511, -101528, -101528, -101535, -101535, -101539, -101551, -101551, -101571, -101571, -101586, -101608, -101620, -101630, -101630, -101630, -101670, -101670, -101679, -101696, -101728, -101741, -101747, -101758, -101790, -101790, -101804, -101804, +101415, +101415, +101433, +101441, +101451, +101458, +101458, +101466, +101498, +101518, +101553, +101553, +101589, +101615, +101629, +101629, +101629, +101645, +101680, +101680, +101680, +101698, +101719, +101727, +101756, +101767, +101772, +101789, +101805, +101805, 101816, 101816, -101852, -101862, -101876, -101876, -101925, -101939, +101816, +101816, +101816, +101840, +101848, +101868, +101868, +101868, +101884, +101903, +101903, +101903, +101909, +101909, +101926, +101932, 101959, -101978, +101959, +101977, +101984, 101988, 101988, 101988, -101988, -102026, +102001, +102007, +102011, +102011, +102011, +102022, +102044, 102054, -102120, +102054, +102061, +102061, +102061, +102061, +102061, +102093, +102113, +102129, +102147, +102147, 102155, -102166, -102184, -102184, -102198, -102211, -102221, +102174, +102217, 102237, -102248, -102254, -102254, -102277, -102277, -102288, +102259, +102272, +102279, 102297, -102314, -102324, -102382, -102382, -102397, -102404, -102418, -102418, -102431, -102431, -102447, -102455, -102455, -102468, -102468, -102502, -102523, -102532, -102542, -102562, -102598, -102598, -102617, -102617, -102658, -102658, -102675, -102694, -102711, -102750, -102750, +102320, +102351, +102351, +102351, +102365, +102369, +102394, +102420, +102420, +102465, +102492, +102492, +102492, +102492, +102492, +102512, +102512, +102516, +102534, +102534, +102534, +102534, +102576, +102597, +102615, +102615, +102632, +102661, +102674, +102700, +102700, +102727, +102753, 102760, -102760, -102774, -102786, -102833, -102844, -102866, -102881, -102913, -102928, -102952, -102982, -103002, -103021, -103048, -103064, -103083, -103098, -103098, -103098, -103132, -103138, -103152, -103152, -103152, -103174, -103185, -103185, -103197, -103228, -103228, -103228, -103262, -103262, -103296, -103296, -103296, -103317, -103330, -103330, -103343, -103357, -103357, -103411, -103418, -103422, -103436, -103447, -103478, -103478, -103513, -103522, -103557, -103562, -103594, -103607, -103635, -103635, -103635, -103649, -103658, -103664, -103678, -103699, -103699, -103712, -103726, -103730, -103730, -103734, -103756, -103756, -103763, -103782, +102782, +102802, +102802, +102832, +102857, +102868, +102868, +102868, +102868, +102882, +102905, +102956, +102986, +102986, +102986, +102986, +102986, +102997, +102997, +102997, +103003, +103013, +103013, +103013, +103013, +103025, +103043, +103059, +103097, +103097, +103104, +103122, +103126, +103137, +103141, +103141, +103165, +103198, +103204, +103227, +103250, +103263, +103267, +103267, +103275, +103308, +103327, +103344, +103344, +103344, +103350, +103350, +103350, +103379, +103406, +103406, +103406, +103424, +103439, +103484, +103490, +103506, +103533, +103533, +103550, +103581, +103601, +103601, +103601, +103613, +103666, +103666, +103666, +103681, +103681, +103702, +103702, +103702, +103733, +103749, 103786, -103805, -103818, -103832, -103836, -103836, -103848, -103855, -103855, -103855, -103878, -103878, -103878, -103878, -103903, -103903, -103918, -103940, -103945, -103945, -103962, -103973, -103973, -103973, -103987, -104026, -104026, +103786, +103798, +103807, +103820, +103820, +103838, +103838, +103861, +103872, +103880, +103880, +103887, +103894, +103894, +103902, +103922, +103941, +103949, +103949, +103970, +103970, +103976, +103976, +103992, +104021, 104041, -104075, -104079, -104089, -104105, -104109, -104109, -104109, -104109, -104127, -104172, -104188, -104188, -104203, -104203, -104225, -104239, -104254, -104276, +104068, +104073, +104073, +104073, +104083, +104083, +104083, +104093, +104103, +104121, +104121, +104121, +104121, +104121, +104148, +104154, +104166, +104166, +104166, +104189, +104189, +104189, +104189, +104201, +104201, +104201, +104241, +104269, +104281, +104281, 104301, -104338, -104349, -104371, -104390, -104390, -104407, -104421, -104434, -104441, -104441, -104441, -104441, -104441, -104441, -104441, +104331, +104331, +104331, +104348, +104348, +104365, +104393, +104415, +104429, +104436, +104442, +104442, 104448, -104461, -104493, -104511, -104519, -104519, -104527, -104552, -104562, -104581, -104598, -104598, -104598, -104598, -104615, +104466, +104474, +104474, +104474, +104490, +104490, +104508, +104524, +104536, +104536, +104544, +104576, +104576, +104596, +104622, +104622, +104639, 104648, -104675, -104691, -104701, -104737, -104737, -104737, -104737, -104737, -104737, -104737, -104737, -104754, -104775, -104779, -104792, -104796, -104801, -104801, -104816, -104829, -104829, -104845, -104865, -104869, -104869, -104887, -104887, -104887, -104887, -104902, +104665, +104665, +104665, +104672, +104672, +104687, +104703, +104719, +104727, +104751, +104751, +104777, +104815, +104893, +104912, +104912, +104939, +104951, +104951, +104951, +104963, 104967, -104977, -104977, -104984, -104995, -105048, -105048, -105055, -105055, -105055, -105055, -105063, -105063, -105063, -105100, -105130, -105178, -105178, -105206, -105206, +104967, +104999, +105032, +105036, +105050, +105050, +105050, +105066, +105066, +105087, +105087, +105117, +105117, +105117, +105165, +105200, 105228, -105245, -105245, -105245, -105245, -105245, -105245, -105245, -105245, -105245, -105245, -105245, -105257, -105257, -105257, -105257, -105306, -105306, -105328, +105234, +105253, +105253, +105253, +105287, +105310, 105333, -105333, -105351, -105370, -105378, -105378, -105388, -105410, -105410, +105348, +105348, +105364, +105364, +105371, +105381, +105391, +105406, +105406, 105415, -105438, -105438, -105438, -105438, -105438, -105446, -105482, -105486, -105516, -105516, -105516, -105526, -105544, -105544, +105422, +105448, +105448, +105455, +105455, +105466, +105490, +105504, +105504, +105543, +105551, +105551, 105558, -105558, -105570, -105603, -105610, -105610, -105610, -105624, -105670, -105670, -105670, +105565, +105575, +105575, +105575, +105575, +105581, +105643, +105643, +105653, +105653, +105664, +105664, 105680, -105690, -105698, -105709, -105709, -105709, -105729, -105729, -105737, -105742, -105764, -105805, -105836, -105846, -105846, -105890, -105890, -105902, -105920, -105957, -105968, -105968, -105968, -105975, -105975, +105680, +105680, +105701, +105718, +105726, +105726, +105751, +105760, +105803, +105803, +105803, +105803, +105803, +105803, +105803, +105809, +105842, +105842, +105848, +105848, +105866, +105873, +105873, +105882, +105882, +105886, +105886, +105886, +105912, +105919, +105940, +105947, +105956, +105963, +105963, +105963, +105963, +105963, +105963, +105970, 105996, 105996, 105996, -106001, -106001, -106019, -106019, -106043, -106064, -106107, -106153, -106190, -106208, -106208, -106208, -106220, -106220, -106220, -106220, -106220, -106254, -106254, -106254, -106264, -106296, +105996, +106035, +106035, +106035, +106050, +106071, +106082, +106123, +106146, +106167, +106167, +106187, +106197, +106197, +106197, +106197, +106226, +106250, +106250, +106269, +106275, +106281, +106281, +106281, +106304, +106304, 106304, -106309, -106328, 106333, -106348, -106366, -106384, -106384, -106408, -106408, -106424, -106424, -106424, -106443, -106459, -106474, -106474, -106499, -106522, -106545, -106558, -106625, -106630, -106642, -106665, -106684, -106697, -106703, -106703, -106737, -106743, -106743, -106766, -106782, -106782, -106782, -106782, -106788, -106816, -106816, -106834, -106857, -106863, -106889, -106906, -106925, -106925, -106935, -106961, -106971, -106971, -107004, -107004, -107023, -107023, -107023, -107029, -107035, -107041, -107096, -107119, -107123, -107144, -107144, -107165, -107185, -107185, -107234, -107259, -107278, -107294, -107308, -107319, -107319, -107319, -107319, -107333, -107372, -107385, -107385, -107385, -107385, -107405, -107405, -107405, -107405, -107405, -107421, -107427, -107432, -107432, -107432, -107441, -107446, -107446, -107466, -107466, -107466, -107466, -107518, -107528, -107528, -107528, -107544, -107561, -107567, -107567, -107572, -107582, -107594, -107635, -107675, -107675, -107675, -107697, -107703, -107703, -107741, -107751, -107751, -107768, -107773, -107796, -107796, -107828, -107828, -107828, -107828, -107848, -107863, -107873, -107880, -107880, -107886, -107922, -107958, -107981, -107981, -107981 +106355, +106373, +106382, +106382, +106382, +106412, +106419, +106464, +106464, +106464, +106464, +106468, +106489, +106489, +106496, +106528, +106528, +106549, +106549, +106576, +106582, +106591, +106591, +106597, +106597, +106597, +106615, +106651, +106726, +106726, +106736, +106779, +106793, +106793, +106818, +106818, +106818, +106824, +106853, +106868, +106872, +106872, +106872, +106879, +106879, +106897, +106913, +106930, +106940, +106940, +106952, +106980, +106993, +107006, +107006, +107047, +107087, +107087, +107094, +107113, +107139, +107139, +107139, +107139, +107192, +107229, +107237, +107237, +107237, +107263, +107295, +107312, +107337, +107344, +107351, +107371, +107371, +107387, +107429, +107436, +107450, +107471, +107514, +107514, +107553, +107560, +107573, +107573, +107647, +107666, +107671, +107671, +107678, +107678, +107704, +107711, +107711, +107746, +107746, +107776, +107776, +107781, +107827, +107859, +107879, +107879, +107879, +107879, +107925, +107948, +107955, +107959, +108004, +108014, +108038, +108045, +108045, +108079, +108103, +108110, +108139, +108154, +108173, +108188, +108208, +108221, +108231, +108231, +108231, +108239, +108275, +108315, +108329, +108346, +108346, +108375, +108375, +108409, +108409, +108457, +108468, +108468, +108468, +108468, +108468, +108484, +108492, +108492, +108492, +108518, +108535, +108535, +108547, +108594, +108594, +108600, +108600, +108619, +108639, +108655, +108663, +108686, +108686, +108706, +108744, +108794, +108824, +108824, +108830, +108837 }; static const char *tldData[] = { -"misasa.tottori.jp\0is-into-cartoons.com\0" -"pistoia.it\0indian.museum\0" -"traeumtgerade.de\0" -"co.id\0" -"arq.br\0co.hu\0salem.museum\0" -"fukuchiyama.kyoto.jp\0" -"laz.it\0ts.it\0\xd0\xb1\xd0\xb3\0" -"tickets\0" -"pn.it\0gorlice.pl\0" -"co.il\0" -"co.im\0communications.museum\0de.com\0" -"magazine.aero\0co.in\0li.it\0" -"aibetsu.hokkaido.jp\0" -"lk3.ru\0" -"co.ir\0uwu.ai\0" -"trysil.no\0is-gone.com\0" -"co.it\0notteroy.no\0lviv.ua\0dhl\0" -"co.je\0endofinternet.net\0" -"dupont\0kerryproperties\0" -"unjarga.no\0" -"asia\0" -"co.jp\0vercel.dev\0" -"fuel.aero\0ibara.okayama.jp\0" -"ciencia.bo\0" -"marche.it\0co.ke\0\xc3\xa5mot.no\0" -"shimodate.ibaraki.jp\0" -"jor.br\0" -"celtic.museum\0contractors\0mycd.eu\0" -"moscow\0" -"tosa.kochi.jp\0" -"aizumisato.fukushima.jp\0rocher\0" -"diy\0" -"takanezawa.tochigi.jp\0co.kr\0travel.tt\0" -"co.lc\0" -"gorizia.it\0" -"shima.mie.jp\0" -"village.museum\0" -"ujitawara.kyoto.jp\0" -"rj.gov.br\0" -"*.moonscale.io\0" -"reise\0" -"yamakita.kanagawa.jp\0co.ma\0oster\xc3\xb8y.no\0\xe8\xb0\xb7\xe6\xad\x8c\0" -"sampa.br\0" -"co.ls\0" -"express\0" -"co.me\0" -"mamurogawa.yamagata.jp\0" -"co.mg\0" -"engineer\0" -"algard.no\0" -"sasayama.hyogo.jp\0memset.net\0" -"pi.leg.br\0" -"meme\0" -"co.na\0" -"*.otap.co\0" -"fjaler.no\0\xd9\x83\xd9\x88\xd9\x85\0" -"co.mu\0" -"kids.museum\0" -"childrensgarden.museum\0co.mw\0" -"okawa.fukuoka.jp\0mishima.shizuoka.jp\0historisch.museum\0" -"df.gov.br\0co.ni\0" -"co.mz\0locker\0" -"co.nl\0" -"akashi.hyogo.jp\0sorreisa.no\0" -"kibichuo.okayama.jp\0co.no\0" -"lutsk.ua\0" -"toyota.aichi.jp\0" -"ulsan.kr\0uppo.gov.pl\0\xd0\xb5\xd1\x8e\0" -"co.nz\0" +"frankfurt.museum\0" "writesthisblog.com\0" -"co.om\0fastvps.site\0co.place\0" -"tr.eu.org\0" -"jewish.museum\0menu\0" -"music.museum\0freemyip.com\0" -"handson.museum\0degree\0" -"is-a-caterer.com\0" -"steiermark.museum\0valle.no\0" -"android\0" -"toscana.it\0nara.nara.jp\0for-some.biz\0" -"dnp\0" -"building.museum\0" -"paderborn.museum\0berg.no\0" -"fuchu.toyama.jp\0" -"co.pl\0" -"co.pn\0hepforge.org\0" -"dog\0" -"skierva.no\0" -"\xec\x82\xbc\xec\x84\xb1\0" -"shinto.gunma.jp\0" -"nakagawa.tokushima.jp\0co.pw\0" -"blogdns.com\0" -"dot\0" -"so.it\0cleaning\0" -"himi.toyama.jp\0gs.fm.no\0" -"monzaebrianza.it\0hobby-site.com\0" -"co.business\0" -"mydatto.net\0" -"platter-app.dev\0" -"lib.as.us\0earth\0" -"\xe6\x8b\x9b\xe8\x81\x98\0futurehosting.at\0" -"como.it\0walmart\0" -"nishio.aichi.jp\0" -"ueno.gunma.jp\0" -"no.com\0co.ro\0" -"kawara.fukuoka.jp\0arao.kumamoto.jp\0" -"nf.ca\0" -"co.rs\0" -"aya.miyazaki.jp\0" -"co.rw\0" -"vic.gov.au\0spot\0" -"eat\0" -"anjo.aichi.jp\0mo-i-rana.no\0" -"katsuyama.fukui.jp\0akabira.hokkaido.jp\0" -"homebuilt.aero\0kinghost.net\0" -"stor-elvdal.no\0" -"horten.no\0" -"diamonds\0is-an-engineer.com\0" -"co.st\0loginline.io\0" -"griw.gov.pl\0" -"fukudomi.saga.jp\0mashiko.tochigi.jp\0nowaruda.pl\0" -"ozu.kumamoto.jp\0" -"encyclopedic.museum\0co.th\0" -"co.sz\0co.tj\0" -"reggiocalabria.it\0est-le-patron.com\0" -"aizuwakamatsu.fukushima.jp\0" -"friulive-giulia.it\0yamagata.ibaraki.jp\0co.tm\0" -"environmentalconservation.museum\0" -"dunlop\0" -"yamanashi.yamanashi.jp\0burghof.museum\0co.ua\0" -"muroran.hokkaido.jp\0blogspot.com.cy\0" -"co.tt\0" -"kadena.okinawa.jp\0barrel-of-knowledge.info\0" -"softbank\0" -"rodoy.no\0co.ug\0eco\0" -"takasu.hokkaido.jp\0" -"\xc3\xb8yer.no\0loginto.me\0" -"co.tz\0" -"yashio.saitama.jp\0kautokeino.no\0co.uk\0realtor\0" -"ohira.tochigi.jp\0ky.us\0" -"aktyubinsk.su\0blogspot.com.ee\0" -"pe.leg.br\0" -"b\xc3\xb8mlo.no\0blogspot.com.eg\0" -"freemasonry.museum\0" -"co.us\0s3-website.ca-central-1.amazonaws.com\0" -"siracusa.it\0" -"co.ve\0ftpaccess.cc\0" -"kunneppu.hokkaido.jp\0sumida.tokyo.jp\0" -"hachijo.tokyo.jp\0" -"takahama.aichi.jp\0co.vi\0" -"kochi.kochi.jp\0co.uz\0edgeapp.net\0" -"budejju.no\0blogspot.com.ar\0" -"toyoake.aichi.jp\0silk.museum\0" -"edu\0yabu.hyogo.jp\0kashihara.nara.jp\0wloclawek.pl\0square7.de\0" -"dtv\0misconfused.org\0blogspot.com.au\0" -"ichikawa.chiba.jp\0setouchi.okayama.jp\0\xd0\xbf\xd1\x80.\xd1\x81\xd1\x80\xd0\xb1\0photography\0" -"pesaro-urbino.it\0cartoonart.museum\0missoula.museum\0cloudaccess.host\0" -"fin.ci\0" -"k12.sc.us\0" -"basel.museum\0" -"servehttp.com\0" -"k12.oh.us\0" -"l.se\0" -"garden.museum\0dynathome.net\0blogspot.com.br\0" -"maniwa.okayama.jp\0" -"trentinosued-tirol.it\0" -"uwu.nu\0" -"imperia.it\0milano.it\0onojo.fukuoka.jp\0" -"muko.kyoto.jp\0tr\xc3\xa6na.no\0" -"mimata.miyazaki.jp\0exposed\0blogspot.com.by\0" -"belluno.it\0" -"sicily.it\0" -"amazon\0" -"hs.zone\0" -"blogspot.com.co\0" -"bomlo.no\0dvr\0" -"casino.hu\0nishinoshima.shimane.jp\0omaha.museum\0in-dsl.org\0" -"fin.ec\0is-a-hard-worker.com\0" -"ap-southeast-1.elasticbeanstalk.com\0dscloud.me\0" -"country\0eu.com\0" -"luxe\0ddnss.org\0" -"corvette.museum\0" -"miyake.nara.jp\0" -"dontexist.org\0" -"kahoku.ishikawa.jp\0linkyard-cloud.ch\0" -"\xe5\xb1\xb1\xe5\x8f\xa3.jp\0*.sendai.jp\0agakhan\0dyndns-wiki.com\0" -"microsoft\0" -"\xd1\x80\xd1\x84\0" -"filegear-gb.me\0" -"\xe1\x83\x92\xe1\x83\x94\0is-a-conservative.com\0" -"shakotan.hokkaido.jp\0loginline.services\0" -"trani-andria-barletta.it\0\xe5\x8c\x97\xe6\xb5\xb7\xe9\x81\x93.jp\0" -"sa.gov.au\0" -"oslo.no\0\xd9\x85\xd8\xb5\xd8\xb1\0plumbing\0square7.ch\0virtualserver.io\0" -"co.za\0" -"taishin.fukushima.jp\0" -"castle.museum\0" -"azure-mobile.net\0" -"clothing\0" -"yoshida.saitama.jp\0" -"delivery\0" -"blogspot.com.es\0" -"co.zm\0" -"ag.it\0myiphost.com\0" -"vestnes.no\0" -"\xc3\xa5seral.no\0xs4all.space\0" -"hamburg\0" -"mb.ca\0co.zw\0za.bz\0" -"fujisawa.iwate.jp\0is-a-designer.com\0" -"biei.hokkaido.jp\0" -"shitara.aichi.jp\0" -"anan.tokushima.jp\0" -"trentinoaltoadige.it\0" -"booking\0" -"bjark\xc3\xb8y.no\0tools\0" -"odda.no\0" -"rr.gov.br\0publ.pt\0" -"kitahata.saga.jp\0heroy.nordland.no\0" -"automotive.museum\0" -"fastlylb.net\0" -"udi.br\0fujioka.gunma.jp\0rag-cloud.hosteur.com\0" -"hiji.oita.jp\0jolster.no\0" -"takamori.kumamoto.jp\0" -"gs.svalbard.no\0" -"kijo.miyazaki.jp\0" -"from-sd.com\0" -"venice.it\0kamikoani.akita.jp\0b\xc3\xb8.telemark.no\0associates\0" -"kunimi.fukushima.jp\0santabarbara.museum\0barefoot\0" -"university\0" -"bolzano-altoadige.it\0nago.okinawa.jp\0sciencehistory.museum\0" -"dnsiskinky.com\0" -"ginowan.okinawa.jp\0in-vpn.org\0onthewifi.com\0" -"living.museum\0madrid\0" -"ariake.saga.jp\0narvik.no\0nieruchomosci.pl\0" -"rs.gov.br\0sc.gov.br\0usercontent.jp\0" -"niki.hokkaido.jp\0" -"vaapste.no\0" -"cc.ms.us\0cc.nc.us\0" -"social\0mein-iserv.de\0bar1.net\0" -"brindisi.it\0sosnowiec.pl\0cc.in.us\0" -"jeonbuk.kr\0" -"figueres.museum\0" -"u.bg\0" -"bern.museum\0" -"0.bg\0" -"misato.akita.jp\0dyndns.info\0" -"talk\0pr.leg.br\0" -"cam.it\0k12.ak.us\0" -"tamamura.gunma.jp\0" -"kyotanabe.kyoto.jp\0opoczno.pl\0" -"nakatombetsu.hokkaido.jp\0" -"malatvuopmi.no\0zarow.pl\0" -"kvitsoy.no\0enscaled.sg\0" -"aprendemas.cl\0" -"r\xc3\xb8""d\xc3\xb8y.no\0" -"farmers\0" -"abira.hokkaido.jp\0alvdal.no\0" -"massacarrara.it\0" -"design.aero\0" -"uk.eu.org\0" -"ingatlan.hu\0" -"pharmacy.museum\0" -"is-a-therapist.com\0" -"yokote.akita.jp\0from-ms.com\0from-nc.com\0" -"mb.it\0" -"abruzzo.it\0lib.ct.us\0norton\0blogspot.com.mt\0" -"togitsu.nagasaki.jp\0zachpomor.pl\0" -"okinoshima.shimane.jp\0" -"blogspot.com.ng\0ddns.net\0" -"vaga.no\0\xe5\x80\x8b\xe4\xba\xba.\xe9\xa6\x99\xe6\xb8\xaf\0" -"vip.jelastic.cloud\0" -"fan\0" -"brother\0etisalat\0" -"a.ssl.fastly.net\0" -"ayase.kanagawa.jp\0in.london\0" -"nsn.us\0comcast\0" -"press.aero\0s\xc3\xb8r-aurdal.no\0" -"mypsx.net\0" -"afjord.no\0" -"sx.cn\0trentino-sudtirol.it\0" -"home-webserver.de\0" -"kalisz.pl\0" -"kitamoto.saitama.jp\0" -"rn.gov.br\0saigawa.fukuoka.jp\0orsta.no\0" -"agents.aero\0" -"takayama.gunma.jp\0" -"vestre-slidre.no\0" -"khmelnitskiy.ua\0cloud.fedoraproject.org\0" -"inatsuki.fukuoka.jp\0" -"doshi.yamanashi.jp\0" -"mizunami.gifu.jp\0esq\0" -"tsurugashima.saitama.jp\0" -"noto.ishikawa.jp\0s3.dualstack.ap-southeast-2.amazonaws.com\0blogspot.com.tr\0" -"dnsdojo.com\0webspace.rocks\0" -"certification.aero\0" -"seki.gifu.jp\0richardli\0" -"audi\0" -"url.tw\0" -"realestate.pl\0" -"\xe4\xba\xac\xe9\x83\xbd.jp\0estate\0" -"tr\xc3\xb8gstad.no\0" -"ro.gov.br\0aquarelle\0" -"ikeda.osaka.jp\0sandvik\0" -"neustar\0" -"radio\0" -"est-mon-blogueur.com\0" -"kommunalforbund.se\0" -"abashiri.hokkaido.jp\0kitagawa.miyazaki.jp\0hm.no\0\xc3\xa1lt\xc3\xa1.no\0pub.sa\0" -"fujimi.nagano.jp\0" -"ichinoseki.iwate.jp\0" -"eus\0" -"ap-northeast-3.elasticbeanstalk.com\0" -"a.bg\0kofu.yamanashi.jp\0cc.de.us\0in-dsl.de\0" -"kazo.saitama.jp\0beer\0" -"notodden.no\0szczytno.pl\0flir\0in.net\0" -"radom.pl\0blackbaudcdn.net\0" -"matsumoto.kagoshima.jp\0fauske.no\0fin.tn\0serveblog.net\0" -"host\0" -"krasnodar.su\0" -"nsw.au\0monza-brianza.it\0" -"devices.resinstaging.io\0" -"dyndns-pics.com\0" -"i234.me\0" -"services.aero\0" -"maritime.museum\0" -"koeln\0" -"perspecta.cloud\0" -"fredrikstad.no\0s3-ap-southeast-2.amazonaws.com\0" -"\xe6\x89\x8b\xe6\x9c\xba\0freeddns.us\0" -"agrar.hu\0" -"volyn.ua\0" -"leirfjord.no\0" -"pc.it\0ravenna.it\0js.org\0" -"bjerkreim.no\0" -"panama.museum\0" -"\xe7\xbd\x91\xe7\xbb\x9c.cn\0" -"piemonte.it\0barsy.net\0" -"sanda.hyogo.jp\0stuttgart.museum\0vang.no\0blogspot.com.uy\0" -"s3-website-sa-east-1.amazonaws.com\0" -"bt.it\0\xe9\xa3\x9f\xe5\x93\x81\0s3-us-west-1.amazonaws.com\0" -"\xe7\xb5\x84\xe7\xb9\x94.tw\0" -"lecce.it\0" -"eu.ax\0" -"fit\0health-carereform.com\0" -"taxi\0winners\0is-a-personaltrainer.com\0" -"dyndns-remote.com\0" -"kitagata.saga.jp\0" -"sanjo.niigata.jp\0" -"boldlygoingnowhere.org\0" -"sd.cn\0" -"dyndns-free.com\0" -"knx-server.net\0" -"kraanghke.no\0cloudfunctions.net\0" -"rebun.hokkaido.jp\0" -"obuse.nagano.jp\0wpenginepowered.com\0" -"shw.io\0" -"nakatsugawa.gifu.jp\0mutual\0" -"freeboxos.fr\0" -"dh.bytemark.co.uk\0" -"esashi.hokkaido.jp\0cx.ua\0" -"posts-and-telecommunications.museum\0rakkestad.no\0" -"diet\0" -"us-4.evennode.com\0" -"auspost\0" -"barsy.menu\0" -"endofinternet.org\0" +"mil.gh\0leadpages.co\0" +"co.bi\0" +"london\0" +"co.bn\0" +"jevnaker.no\0" +"kihoku.ehime.jp\0cc.ga.us\0lib.tx.us\0fi.cloudplatform.fi\0loginto.me\0" +"aisai.aichi.jp\0co.ca\0" +"mil.gt\0mn.us\0bplaced.de\0" +"co.bw\0wiw.gov.pl\0" +"co.ci\0avocat.fr\0attorney\0" +"eco\0goupile.fr\0" +"anani.br\0" +"co.cl\0sagae.yamagata.jp\0" +"co.cm\0*.sendai.jp\0college\0" +"mil.hn\0sec.ps\0" +"development.run\0" +"co.cr\0nakama.fukuoka.jp\0from-wi.com\0noticeable.news\0" +"mil.id\0kijo.miyazaki.jp\0" +"\xe0\xb8\xad\xe0\xb8\x87\xe0\xb8\x84\xe0\xb9\x8c\xe0\xb8\x81\xe0\xb8\xa3.\xe0\xb9\x84\xe0\xb8\x97\xe0\xb8\xa2\0" +"name\0" +"press.ma\0" +"co.cz\0" +"co.dk\0" +"uruma.okinawa.jp\0za.bz\0" +"savannahga.museum\0" +"mil.in\0" +"edu\0termez.su\0vps-host.net\0" +"mil.iq\0dtv\0" +"s3-website.ap-south-1.amazonaws.com\0" +"deporte.bo\0" "*.bzz.dapps.earth\0" -"kimitsu.chiba.jp\0pittsburgh.museum\0" -"bedzin.pl\0eu-west-1.elasticbeanstalk.com\0" -"ggf.br\0systems\0" -"fly\0kddi\0" -"stat.no\0" -"*.spectrum.myjino.ru\0" -"selfip.net\0" -"chesapeakebay.museum\0dinosaur.museum\0" -"avocat.pro\0\xe3\x82\xaf\xe3\x83\xa9\xe3\x82\xa6\xe3\x83\x89\0hu.com\0" -"aircraft.aero\0\xe7\xbd\x91\xe7\xbb\x9c.hk\0" -"friuli-v-giulia.it\0k12.wy.us\0tec.mi.us\0" -"koshu.yamanashi.jp\0" -"ullensaker.no\0cc.ca.us\0" -"kokubunji.tokyo.jp\0olkusz.pl\0nz.basketball\0" -"u.se\0" -"net.ac\0veneto.it\0hostyhosting.io\0" -"net.ae\0" -"net.af\0" -"gliding.aero\0net.ag\0" -"net.ai\0" -"paris\0" -"net.al\0ako.hyogo.jp\0oarai.ibaraki.jp\0" -"net.am\0cesena-forl\xc3\xac.it\0" -"aisho.shiga.jp\0" -"control.aero\0pc.pl\0" -"net.ba\0otsuchi.iwate.jp\0kawai.nara.jp\0" -"net.ar\0net.bb\0" -"amsterdam\0foo\0" -"customer.enonic.io\0" -"net.au\0kyuragi.saga.jp\0" -"net.bh\0stufftoread.com\0" -"net.az\0" +"allfinanz\0" +"ciencia.bo\0" +"journalism.museum\0dnsup.net\0" +"minamata.kumamoto.jp\0is-a-socialist.com\0" +"mil.jo\0zapto.org\0" "\xe3\x82\xb0\xe3\x83\xbc\xe3\x82\xb0\xe3\x83\xab\0" -"fox\0" -"net.bm\0satsumasendai.kagoshima.jp\0yamato.kanagawa.jp\0" -"net.bn\0iz.hr\0" -"net.bo\0g\xc3\xa1ls\xc3\xa1.no\0" -"us-3.evennode.com\0" -"net.br\0dynalias.net\0" -"net.bs\0" -"net.bt\0" -"gs.nl.no\0fl\xc3\xa5.no\0" -"hiratsuka.kanagawa.jp\0" -"se.gov.br\0hikari.yamaguchi.jp\0" -"net.ci\0inc.hk\0" -"championship.aero\0net.bz\0koori.fukushima.jp\0touch.museum\0lib.mo.us\0" -"net.cm\0no.it\0" -"net.cn\0ddns.me\0" -"net.co\0canada.museum\0lincoln\0" -"gal\0" -"kikonai.hokkaido.jp\0" -"fe.it\0gives\0" -"boston.museum\0gap\0" -"net.cu\0" -"ap.it\0" -"net.cw\0" -"net.cy\0" -"otoineppu.hokkaido.jp\0kasuga.hyogo.jp\0" -"chikuhoku.nagano.jp\0fantasyleague.cc\0dyn-vpn.de\0" -"net.dm\0gay\0" -"net.do\0" -"frl\0" -"kyotango.kyoto.jp\0miasta.pl\0" -"kitahiroshima.hokkaido.jp\0" -"zj.cn\0net.ec\0" -"in-dsl.net\0" -"ba.gov.br\0" -"kosaka.akita.jp\0" -"net.eg\0" -"habmer.no\0" -"net.dz\0morotsuka.miyazaki.jp\0" -"gaular.no\0villas\0" -"mobara.chiba.jp\0fuoisku.no\0" -"even\xc3\xa1\xc5\xa1\xc5\xa1i.no\0" -"uni5.net\0meteorapp.com\0" -"yandexcloud.net\0" -"net.et\0" -"b\xc3\xa5""d\xc3\xa5""ddj\xc3\xa5.no\0" -"vardo.no\0lixil\0" -"net.fj\0hamaroy.no\0" -"\xe7\xbb\x84\xe7\xbb\x87.hk\0nature.museum\0" -"ponpes.id\0sayama.osaka.jp\0best\0" -"net.fm\0" -"toyoura.hokkaido.jp\0barsycenter.com\0" -"dynu.net\0" -"usa.museum\0us-2.evennode.com\0" -"gdn\0" -"cityeats\0" -"net.ge\0tra.kp\0gea\0" -"s\xc3\xa1lat.no\0ftr\0at-band-camp.net\0" -"net.gg\0architecture.museum\0auto\0" -"diadem.cloud\0" -"isa-geek.org\0" -"tsuchiura.ibaraki.jp\0" -"net.gl\0toda.saitama.jp\0" -"net.gn\0hongo.hiroshima.jp\0ooguy.com\0" -"navigation.aero\0" -"net.gp\0" -"higashinaruse.akita.jp\0kurate.fukuoka.jp\0" -"net.gr\0fun\0thingdustdata.com\0" -"net.gt\0" -"net.gu\0kozow.com\0" -"outsystemscloud.com\0" -"asahi.yamagata.jp\0oksnes.no\0barsy.pro\0" -"net.gy\0zao.miyagi.jp\0" -"sukagawa.fukushima.jp\0" -"net.hk\0kasama.ibaraki.jp\0" -"virtual-user.de\0woltlab-demo.com\0" -"net.hn\0otake.hiroshima.jp\0anthro.museum\0" -"cyou\0" -"sa.gov.pl\0" -"9.bg\0" -"net.ht\0net.id\0k12.ms.us\0k12.nc.us\0" -"grosseto.it\0" -"nedre-eiker.no\0" -"a.se\0" -"balsan-suedtirol.it\0bielawa.pl\0" -"net.il\0" -"net.im\0holt\xc3\xa5len.no\0" -"net.in\0" -"net.iq\0clan.rip\0" -"net.ir\0" -"net.is\0" -"odessa.ua\0" -"net.je\0" -"buyshouses.net\0" -"odesa.ua\0" -"modern.museum\0transport.museum\0barsy.pub\0" -"viajes\0" -"net.jo\0" -"sardegna.it\0otoyo.kochi.jp\0us-1.evennode.com\0" -"iitate.fukushima.jp\0" -"net.kg\0" -"mie.jp\0net.ki\0lib.vi.us\0" -"calabria.it\0" -"ve.it\0" -"fyi\0lolipop.io\0" -"net.kn\0s3-website-us-west-2.amazonaws.com\0" -"minamiise.mie.jp\0ocelot.mythic-beasts.com\0" -"shirahama.wakayama.jp\0" -"net.la\0" -"net.lb\0foundation\0" -"net.lc\0dish\0nfshost.com\0" -"trainer.aero\0" -"sorocaba.br\0morimachi.shizuoka.jp\0spdns.org\0" -"log.br\0" -"net.kw\0" -"sg-1.paas.massivegrid.net\0" -"net.ky\0" -"minokamo.gifu.jp\0net.kz\0parts\0" -"tomisato.chiba.jp\0net.lk\0" -"adachi.tokyo.jp\0" -"gop.pk\0gentapps.com\0" -"horology.museum\0salzburg.museum\0" -"yaita.tochigi.jp\0party\0" -"net.ma\0" -"net.lr\0" -"net.ls\0" -"dscloud.mobi\0" -"am.gov.br\0net.me\0" -"erotica.hu\0net.lv\0" -"travel\0" -"net.ly\0" -"gotpantheon.com\0" -"net.mk\0select\0" -"net.ml\0" -"net.mo\0" -"joinville.br\0" -"net.ms\0fam.pk\0" -"hb.cn\0gosen.niigata.jp\0net.mt\0builtwithdark.com\0" -"mutsuzawa.chiba.jp\0net.mu\0" -"net.mv\0net.nf\0" -"net.mw\0net.ng\0" -"net.mx\0" -"net.my\0net.ni\0gle\0" -"net.mz\0" -"yamashina.kyoto.jp\0roan.no\0" -"bandai.fukushima.jp\0" -"kawanishi.nara.jp\0\xd8\xaa\xd9\x88\xd9\x86\xd8\xb3\0" -"kirovograd.ua\0" -"*.elb.amazonaws.com.cn\0" -"caltanissetta.it\0" -"wiw.gov.pl\0" -"net.nr\0" -"hirado.nagasaki.jp\0wi.us\0" -"\xe7\xb5\x84\xe7\xb9\x94.hk\0" -"assassination.museum\0sd.us\0" -"bamble.no\0net.nz\0" -"doesntexist.org\0" -"nogata.fukuoka.jp\0net.om\0" -"culturalcenter.museum\0" -"ryukyu\0" -"mantova.it\0maryland.museum\0net.pa\0" -"epilepsy.museum\0" -"kashima.saga.jp\0interactive.museum\0gmo\0" -"net.pe\0lancia\0" -"isumi.chiba.jp\0bato.tochigi.jp\0" -"net.ph\0" -"jewelry\0" -"us-west-1.elasticbeanstalk.com\0" -"ranzan.saitama.jp\0net.pk\0coffee\0" -"tajiri.osaka.jp\0net.pl\0gmx\0" -"shinshinotsu.hokkaido.jp\0" -"net.pn\0donetsk.ua\0" -"ilawa.pl\0" -"hirakata.osaka.jp\0net.qa\0" -"entertainment.aero\0net.pr\0" -"net.ps\0" -"s\xc3\xb8gne.no\0net.pt\0guide\0" -"j.bg\0nishiaizu.fukushima.jp\0toyooka.hyogo.jp\0" -"higashihiroshima.hiroshima.jp\0oshu.iwate.jp\0" -"yamanashi.jp\0hokksund.no\0svelvik.no\0" -"net.py\0" -"servequake.com\0" -"psc.br\0okayama.jp\0vodka\0j.scaleforce.com.cy\0" -"\xe7\xa6\x8f\xe5\xb3\xb6.jp\0utah.museum\0k12.il.us\0" -"date.hokkaido.jp\0folkebibl.no\0" -"daegu.kr\0" -"mikawa.yamagata.jp\0k12.de.us\0" -"jele.site\0" -"vega.no\0goo\0" -"vegarshei.no\0gop\0" -"monzaedellabrianza.it\0futuremailing.at\0" -"\xe5\x95\x86\xe6\xa5\xad.tw\0" -"journalism.museum\0got\0solutions\0" -"wales.museum\0toray\0" -"gov\0" -"global.ssl.fastly.net\0ms.leg.br\0" -"br\xc3\xb8nn\xc3\xb8ysund.no\0" -"tank.museum\0" -"onyourside\0" -"terni.it\0nakagawa.fukuoka.jp\0co.krd\0" -"lillehammer.no\0" -"net.sa\0in-vpn.net\0" -"net.sb\0\xe9\xa6\x99\xe6\xb8\xaf\0kosher\0ch.trendhosting.cloud\0" -"net.sc\0" -"net.sd\0nikon\0" -"ap.gov.br\0net.ru\0" -"store\0" -"tsumagoi.gunma.jp\0airguard.museum\0net.rw\0net.sg\0" -"net.sh\0" -"sn\xc3\xa5""ase.no\0" -"website\0" -"zoological.museum\0net.sl\0" -"net.so\0" -"karikatur.museum\0international\0" -"enebakk.no\0net.ss\0" -"ass.km\0net.st\0" -"fukuchi.fukuoka.jp\0sherbrooke.museum\0" -"fhs.no\0" -"from-mt.com\0from-nd.com\0" -"net.th\0pcloud.host\0" -"net.sy\0ollo\0productions\0" -"belem.br\0gr.it\0jeju.kr\0konin.pl\0net.tj\0lib.ca.us\0" -"mt.leg.br\0" -"bodo.no\0net.tm\0lon-1.paas.massivegrid.net\0" -"net.tn\0" -"f\xc3\xb8rde.no\0ap.gov.pl\0olawa.pl\0net.to\0" -"isa-geek.com\0" -"net.ua\0" -"net.tr\0" -"lg.jp\0hbo\0" -"net.tt\0" -"limanowa.pl\0" -"bologna.it\0gr.jp\0wake.okayama.jp\0" -"tranoy.no\0net.tw\0" -"web.bo\0hosting\0""4lima.de\0" -"apps.lair.io\0" -"aetna\0" -"hirono.fukushima.jp\0net.uk\0\xd2\x9b\xd0\xb0\xd0\xb7\0abbott\0" -"hobol.no\0fashion\0" -"try-snowplow.com\0" -"star\0" -"nx.cn\0olbiatempio.it\0net.vc\0" -"net.ve\0" -"js.cn\0estate.museum\0malbork.pl\0target\0" -"feira.br\0lanxess\0" -"web.co\0" -"net.uy\0net.vi\0\xe6\x85\x88\xe5\x96\x84\0" -"net.uz\0" -"gitapp.si\0now-dns.net\0" -"net.vn\0is-lost.org\0appchizi.com\0" -"seaport.museum\0mk.ua\0" -"hiranai.aomori.jp\0" -"trieste.it\0usui.fukuoka.jp\0\xd8\xa7\xd9\x84\xd8\xb3\xd8\xb9\xd9\x88\xd8\xaf\xd9\x8a\xd9\x87\0" -"if.ua\0" -"net.vu\0" -"likes-pie.com\0""4lima.at\0" -"web.do\0uk.reclaim.cloud\0" -"yatsushiro.kumamoto.jp\0forde.no\0" -"yotsukaido.chiba.jp\0" -"mansions.museum\0" -"prato.it\0urausu.hokkaido.jp\0force.museum\0" -"mielec.pl\0" -"aoste.it\0ofunato.iwate.jp\0barsy.org\0" -"ome.tokyo.jp\0" -"ono.hyogo.jp\0hoyanger.no\0molde.no\0net.ws\0" -"cancerresearch\0" -"uk.primetel.cloud\0" -"4lima.ch\0" -"cloud66.ws\0" -"matsumoto.nagano.jp\0ishikawa.okinawa.jp\0clinic\0" -"cc.tn.us\0" -"flor\xc3\xb8.no\0nes.buskerud.no\0" -"siellak.no\0uzhgorod.ua\0" -"lodingen.no\0\xd8\xa7\xd9\x84\xd8\xb3\xd8\xb9\xd9\x88\xd8\xaf\xd9\x8a\xd8\xa9\0" -"abo.pa\0" -"net.ye\0rugby\0\xe9\xa4\x90\xe5\x8e\x85\0" -"muenster.museum\0aukra.no\0no-ip.ca\0" -"macys\0selfip.info\0" -"godo.gifu.jp\0romsa.no\0" -"k12.or.us\0" -"kimino.wakayama.jp\0" -"\xe6\xa0\x83\xe6\x9c\xa8.jp\0" -"portlligat.museum\0" -"net.za\0" -"tsukui.kanagawa.jp\0termez.su\0" -"extraspace\0" -"wios.gov.pl\0" -"g\xc3\xa1ivuotna.no\0net.zm\0" -"web.gu\0" -"kaisei.kanagawa.jp\0" -"tas.edu.au\0kasuga.fukuoka.jp\0aure.no\0boehringer\0" -"lans.museum\0" -"sakae.nagano.jp\0" -"delaware.museum\0" -"!city.kitakyushu.jp\0okegawa.saitama.jp\0synology.me\0" -"ybo.faith\0" -"recht.pro\0" -"web.id\0d\xc3\xb8nna.no\0rzgw.gov.pl\0" -"tosashimizu.kochi.jp\0from-hi.com\0" -"tsurugi.ishikawa.jp\0cloud-de.unispace.io\0" -"bifuka.hokkaido.jp\0" -"shell.museum\0flowers\0" -"web.in\0" -"klabu.no\0" -"hiv\0" -"trentino-s\xc3\xbc""d-tirol.it\0gamagori.aichi.jp\0" -"*.banzai.cloud\0" -"movimiento.bo\0" -"hornindal.no\0" -"ua.rs\0" -"cechire.com\0co.financial\0" -"bi.it\0brussel.museum\0history.museum\0" -"trustee.museum\0" -"qpon\0" -"\xd8\xa7\xd9\x84\xd8\xac\xd8\xb2\xd8\xa7\xd8\xa6\xd8\xb1\0" -"showa.yamanashi.jp\0" -"conf.au\0" -"eiheiji.fukui.jp\0" -"bihoro.hokkaido.jp\0hara.nagano.jp\0field.museum\0" -"donna.no\0" -"\xd9\xbe\xd8\xa7\xda\xa9\xd8\xb3\xd8\xaa\xd8\xa7\xd9\x86\0hkt\0" -"is-an-accountant.com\0kurgan.su\0" -"oita.jp\0drayddns.com\0" -"isen.kagoshima.jp\0bydgoszcz.pl\0" -"honbetsu.hokkaido.jp\0oregon.museum\0square.museum\0" -"inagawa.hyogo.jp\0" -"pl.ua\0" -"tsuruga.fukui.jp\0" -"web.lk\0lg.ua\0" -"ardal.no\0" -"dontexist.com\0" -"dr\xc3\xb8""bak.no\0" -"tone.ibaraki.jp\0is-a-techie.com\0" -"kiyokawa.kanagawa.jp\0" -"webhosting.be\0" -"hs.run\0" -"\xe7\xa7\xbb\xe5\x8a\xa8\0" -"takikawa.hokkaido.jp\0" -"mini\0" -"bill.museum\0" -"from-ks.com\0" -"mint\0gsj.bz\0" -"ichikawa.hyogo.jp\0axis.museum\0web.nf\0" -"s3.eu-west-3.amazonaws.com\0is-a-musician.com\0" -"web.ni\0" -"historisches.museum\0" -"laspezia.it\0" -"pescara.it\0" -"market\0" -"reisen\0" -"for.men\0" -"charter.aero\0" -"elasticbeanstalk.com\0dyndns.dappnode.io\0" -"k12.nv.us\0" -"vgs.no\0" -"*.owo.codes\0" -"groks-the.info\0" -"oxford.museum\0" -"from.hr\0gyeongnam.kr\0umig.gov.pl\0hot\0syno-ds.de\0" -"fuchu.hiroshima.jp\0" -"kurobe.toyama.jp\0how\0" -"versicherung\0" -"alipay\0" -"web.pk\0" -"tcp4.me\0" -"fuchu.tokyo.jp\0" -"coal.museum\0" -"myfast.host\0" -"mircloud.us\0" -"tarnobrzeg.pl\0" -"iide.yamagata.jp\0" -"farm.museum\0" -"chino.nagano.jp\0" -"selfip.org\0" -"oumu.hokkaido.jp\0" -"shiroishi.miyagi.jp\0" -"ri.it\0lib.nh.us\0" -"under.one\0" -"mt.it\0kanegasaki.iwate.jp\0zone\0" -"sanuki.kagawa.jp\0" -"gs.jan-mayen.no\0\xc3\xb8ystre-slidre.no\0ibm\0" -"owani.aomori.jp\0oppeg\xc3\xa5rd.no\0" -"dyn-o-saur.com\0ntdll.top\0" -"andasuolo.no\0dyndns.biz\0forte.id\0" -"\xd0\xb8\xd0\xba\xd0\xbe\xd0\xbc.museum\0ice\0" -"team\0" -"\xd8\xb9\xd8\xb1\xd8\xa7\xd9\x82\0" -"police.uk\0" -"riik.ee\0" -"io.kg\0" -"coupon\0icu\0" -"deals\0s3-eu-central-1.amazonaws.com\0" -"hk.cn\0koryo.nara.jp\0" -"matera.it\0raid\0" -"shari.hokkaido.jp\0" -"web.tj\0sm.ua\0" -"hsbc\0icbc\0" -"dynalias.org\0" -"swiftcover\0" -"tech\0" -"online.th\0" -"web.tr\0toyota\0" -"baghdad.museum\0" -"miyoshi.hiroshima.jp\0" -"loans\0phone\0" -"\xd0\xb1\xd0\xb5\xd0\xbb\0" -"semboku.akita.jp\0gotemba.shizuoka.jp\0sebastopol.ua\0oh.us\0" -"nogi.tochigi.jp\0oygarden.no\0" -"fly.dev\0" -"web.ve\0" -"oyer.no\0" -"other.nf\0nissedal.no\0" -"lazio.it\0kunitomi.miyazaki.jp\0ifm\0mo-siemens.io\0" -"\xe5\x80\x8b\xe4\xba\xba.hk\0mesaverde.museum\0hammerfest.no\0mircloud.ru\0" -"poivron.org\0edgestack.me\0" -"gildesk\xc3\xa5l.no\0" -"kami.kochi.jp\0" -"genkai.saga.jp\0from-wv.com\0" -"isa.us\0" -"okaya.nagano.jp\0" -"etc.br\0" -"cc.il.us\0" -"k12.ut.us\0" -"s.bg\0" -"emilia-romagna.it\0" -"flynnhosting.net\0" -"k12.nj.us\0\xe4\xb8\xad\xe6\x96\x87\xe7\xbd\x91\0" -"veterinaire.km\0" -"vercelli.it\0" -"kamigori.hyogo.jp\0" -"ro.eu.org\0" -"minamidaito.okinawa.jp\0" -"loseyourip.com\0" -"kumamoto.jp\0" -"shiojiri.nagano.jp\0" -"2000.hu\0" -"nowtv\0" -"lodi.it\0tobe.ehime.jp\0" -"\xe6\x94\xbf\xe5\xba\x9c\0isa-geek.net\0" -"stange.no\0" -"pisa.it\0" -"kamitonda.wakayama.jp\0bajddar.no\0" -"schools.nsw.edu.au\0bieszczady.pl\0" -"vefsn.no\0" -"is-a-libertarian.com\0" -"filegear-de.me\0" -"showa.fukushima.jp\0" -"lucania.it\0minamiyamashiro.kyoto.jp\0platter-app.com\0" -"alesund.no\0ac.leg.br\0" -"\xc3\xa5l.no\0web.za\0" -"yasu.shiga.jp\0" -"pu.it\0wnext.app\0" -"ide.kyoto.jp\0jelastic.regruhosting.ru\0" -"pagespeedmobilizer.com\0" -"kamifurano.hokkaido.jp\0hidaka.kochi.jp\0photography.museum\0" -"ichinomiya.chiba.jp\0" -"soka.saitama.jp\0" -"onomichi.hiroshima.jp\0leangaviika.no\0" -"veterinaire.fr\0meeres.museum\0" -"larsson.museum\0nordkapp.no\0us-gov-west-1.elasticbeanstalk.com\0internet-dns.de\0" -"kawanabe.kagoshima.jp\0gg.ax\0" -"friuli-vgiulia.it\0" -"mining.museum\0food\0" -"is-very-bad.org\0" -"abkhazia.su\0" -"kamikawa.saitama.jp\0" -"yuasa.wakayama.jp\0si.eu.org\0" -"aviation.museum\0" -"photo\0conf.se\0" -"jerusalem.museum\0" -"sakuho.nagano.jp\0" -"skole.museum\0" -"can.museum\0dealer\0" -"ohtawara.tochigi.jp\0" -"!www.ck\0vn.ua\0" -"osakikamijima.hiroshima.jp\0" -"aogashima.tokyo.jp\0" -"g\xc3\xa1\xc5\x8bgaviika.no\0" -"lahppi.no\0" -"orangecloud.tn\0" -"sydney.museum\0" -"inc\0spb.ru\0" -"oiso.kanagawa.jp\0ee.eu.org\0" -"presse.km\0ri.us\0" -"missile.museum\0ing\0" -"mt.us\0nd.us\0paris.eu.org\0" -"slz.br\0shibata.niigata.jp\0irish\0" -"ink\0" -"ford\0" -"sells-for-less.com\0" -"spb.su\0" -"int\0" -"suita.osaka.jp\0" -"etnedal.no\0" -"carbonia-iglesias.it\0total\0" -"ina.nagano.jp\0cadaques.museum\0cc.pr.us\0hasura-app.io\0" -"notaires.km\0" -"qsl.br\0chiryu.aichi.jp\0" -"kopervik.no\0" -"porsgrunn.no\0k12.tx.us\0" -"trentinosud-tirol.it\0giske.no\0" -"cc.dc.us\0" -"mashiki.kumamoto.jp\0k12.pa.us\0design\0" -"presse.ml\0narviika.no\0s\xc3\xb8rum.no\0" -"poker\0sk.eu.org\0" -"mytis.ru\0" -"selbu.no\0\xe0\xa4\xad\xe0\xa4\xbe\xe0\xa4\xb0\xe0\xa4\xa4\0" -"sciencesnaturelles.museum\0datsun\0" -"hasura.app\0" -"newholland\0yolasite.com\0" -"nombre.bo\0strand.no\0" -"for.mom\0" -"kanra.gunma.jp\0" -"yamaguchi.jp\0" -"tsuno.miyazaki.jp\0" -"shintomi.miyazaki.jp\0" -"sakahogi.gifu.jp\0" -"kaho.fukuoka.jp\0haebaru.okinawa.jp\0" -"somna.no\0" -"kuokgroup\0" -"kitakata.miyazaki.jp\0" -"sv.it\0sandnes.no\0" -"pa.it\0" -"jcb\0" -"lancashire.museum\0jambyl.su\0" -"a\xc3\xa9roport.ci\0ama.shimane.jp\0eurovision\0from-nm.com\0game-host.org\0" -"trentino-stirol.it\0exeter.museum\0" -"br.it\0cb.it\0" -"sauherad.no\0" -"alto-adige.it\0misato.saitama.jp\0vision\0" -"osasco.br\0" -"usantiques.museum\0" -"es.ax\0" -"higashikagawa.kagawa.jp\0surf\0" -"skedsmo.no\0" -"tananger.no\0evenes.no\0ist\0is-a-financialadvisor.com\0" -"ru.eu.org\0se.eu.org\0" -"dep.no\0" -"skydiving.aero\0" -"nm.cn\0" -"council.aero\0" -"os.hordaland.no\0" -"credit\0cya.gg\0" -"itv\0" -"omigawa.chiba.jp\0" -"rsc.cdn77.org\0pantheonsite.io\0" -"suli.hu\0gifu.jp\0" -"tahara.aichi.jp\0" -"nhlfan.net\0" -"*.alces.network\0" -"philadelphiaarea.museum\0cv.ua\0sells-for-u.com\0" -"higashisumiyoshi.osaka.jp\0" -"nagawa.nagano.jp\0" -"barsy.mobi\0" -"conf.lv\0" -"kiyose.tokyo.jp\0" -"press.museum\0" -"hiroshima.jp\0" -"kumiyama.kyoto.jp\0psse.gov.pl\0" -"bialystok.pl\0teva\0" -"lamer\0" -"tagami.niigata.jp\0" -"from-md.com\0" -"kikuchi.kumamoto.jp\0educational.museum\0" -"pulawy.pl\0build\0" -"ent.platform.sh\0" -"s.se\0" -"eniwa.hokkaido.jp\0now-dns.org\0" -"ternopil.ua\0passagens\0" -"\xd9\x87\xd9\x85\xd8\xb1\xd8\xa7\xd9\x87\0" -"north-kazakhstan.su\0" -"hurum.no\0" -"*.oci.customer-oci.com\0" +"digital\0" +"vestv\xc3\xa5g\xc3\xb8y.no\0" +"association.museum\0" +"cloudns.pro\0" +"mil.kg\0" +"capital\0" +"aikawa.kanagawa.jp\0inf.ua\0" +"cc.nj.us\0" +"gloppen.no\0" +"\xe5\xb2\xa1\xe5\xb1\xb1.jp\0mil.km\0dvr\0" +"hanamigawa.chiba.jp\0from-pa.com\0" +"student.aero\0" +"o.bg\0mil.kr\0jeju.kr\0" +"co.gg\0" +"jx.cn\0\xe3\x82\xaf\xe3\x83\xa9\xe3\x82\xa6\xe3\x83\x89\0" +"mil.kz\0" +"humanities.museum\0" +"co.gl\0" +"kusatsu.gunma.jp\0" +"promo\0" +"bauern.museum\0chiropractic.museum\0" +"weibo\0is-a-caterer.com\0" +"kamoenai.hokkaido.jp\0mil.lv\0" +"mil.mg\0" +"co.gy\0" +"fundacio.museum\0" +"shibecha.hokkaido.jp\0" +"beardu.no\0" +"florist\0is-slick.com\0" +"missoula.museum\0" +"lib.nh.us\0" +"co.id\0tgory.pl\0" +"co.hu\0" +"mil.mv\0" +"uwajima.ehime.jp\0mil.ng\0narvik.no\0" +"tkmaxx\0sells-it.net\0" +"sa.au\0mil.my\0mil.ni\0" +"\xe9\x95\xb7\xe9\x87\x8e.jp\0mil.mz\0" +"co.il\0" +"co.im\0opole.pl\0" +"co.in\0" +"mil.no\0" +"of.london\0" +"co.ir\0oyodo.nara.jp\0" +"7.bg\0" +"co.it\0onrender.com\0" +"co.je\0" +"sumy.ua\0" +"boavista.br\0mil.nz\0" +"sera.hiroshima.jp\0" +"targi.pl\0download\0" +"fujiyoshida.yamanashi.jp\0vaapste.no\0" +"glug.org.uk\0" +"co.jp\0football\0" +"aju.br\0" +"co.ke\0mil.pe\0" +"sa.cr\0fineart.museum\0sel.no\0theworkpc.com\0" +"ise.mie.jp\0iheya.okinawa.jp\0snoasa.no\0" +"aomori.aomori.jp\0mil.ph\0\xd1\x80\xd1\x84\0" +"shimogo.fukushima.jp\0" +"shiso.hyogo.jp\0" +"inashiki.ibaraki.jp\0" +"baths.museum\0mil.pl\0" +"sasaguri.fukuoka.jp\0" +"scotland.museum\0" +"mil.qa\0" +"co.kr\0" +"co.lc\0" +"accident-investigation.aero\0nt.edu.au\0" +"tushu\0" +"public.museum\0mil.py\0boutir.com\0qc.com\0" +"ca-central-1.elasticbeanstalk.com\0" +"cechire.com\0" +"ama.aichi.jp\0" +"doshi.yamanashi.jp\0cipriani\0" +"co.ma\0" +"airbus\0mine.nu\0" +"co.ls\0" +"co.me\0" +"co.mg\0" +"elverum.no\0" +"misato.akita.jp\0otoyo.kochi.jp\0corporation.museum\0historicalsociety.museum\0" +"emb.kw\0co.na\0s\xc3\xa1l\xc3\xa1t.no\0uk0.bigv.io\0" +"\xc3\xb8rland.no\0" +"f.se\0" +"co.mu\0mil.ru\0" +"vi.it\0co.mw\0mil.rw\0" +"mil.sh\0" +"co.ni\0exposed\0" +"co.mz\0" +"her\xc3\xb8y.m\xc3\xb8re-og-romsdal.no\0navy\0" +"zj.cn\0ebino.miyazaki.jp\0co.nl\0" +"kolobrzeg.pl\0" +"izu.shizuoka.jp\0co.no\0" +"apple\0" +"kami.miyagi.jp\0" +"ooguy.com\0" +"mil.st\0" +"wang\0" +"!city.yokohama.jp\0" +"mil.sy\0" +"co.nz\0mil.tj\0" +"kaho.fukuoka.jp\0co.om\0mil.tm\0lib.ri.us\0panel.gg\0" +"mil.to\0" +"tiffany\0" +"sakai.osaka.jp\0" +"chosei.chiba.jp\0mil.tr\0" +"educational.museum\0" +"losangeles.museum\0" +"veg\xc3\xa5rshei.no\0h\xc3\xa4kkinen.fi\0" +"yamamoto.miyagi.jp\0" +"mil.tw\0" +"stjordalshalsen.no\0" +"iwakura.aichi.jp\0kusatsu.shiga.jp\0mil.tz\0" +"sp.leg.br\0co.pl\0" +"x.bg\0nyuzen.toyama.jp\0co.pn\0" "natal.br\0" -"poltava.ua\0" -"komae.tokyo.jp\0" -"yukuhashi.fukuoka.jp\0" -"dynamic-dns.info\0" -"baidu\0northwesternmutual\0" -"cat.ax\0" -"mochizuki.nagano.jp\0" -"repbody.aero\0jio\0" -"\xe0\xa4\xb8\xe0\xa4\x82\xe0\xa4\x97\xe0\xa4\xa0\xe0\xa4\xa8\0nordeste-idc.saveincloud.net\0" -"timekeeping.museum\0verran.no\0iopsys.se\0" -"trentino-a-adige.it\0shimonoseki.yamaguchi.jp\0" -"bhz.br\0doctor\0" -"api.stdlib.com\0" -"archaeological.museum\0" -"higashiomi.shiga.jp\0" -"app.br\0skj\xc3\xa5k.no\0visa\0pubtls.org\0" -"ce.gov.br\0!city.kawasaki.jp\0" -"nanao.ishikawa.jp\0ninja\0" -"\xe0\xaa\xad\xe0\xaa\xbe\xe0\xaa\xb0\xe0\xaa\xa4\0" -"zakopane.pl\0" -"bike\0us.ax\0" -"children.museum\0" -"fc.it\0l\xc3\xa6rdal.no\0" -"id.au\0an.it\0otari.nagano.jp\0" -"piedmont.it\0" -"flesberg.no\0tashkent.su\0al.leg.br\0" -"dentist\0" +"\xe6\xbe\xb3\xe9\x96\x80\0bofa\0" +"mil.vc\0" +"mil.ve\0\xe0\xa4\xad\xe0\xa4\xbe\xe0\xa4\xb0\xe0\xa5\x8b\xe0\xa4\xa4\0dattoweb.com\0" +"co.pw\0" +"sa.it\0" +"hekinan.aichi.jp\0mil.uy\0fan\0" +"funabashi.chiba.jp\0" +"kamijima.ehime.jp\0" +"from-sc.com\0" +"barsy.site\0" +"torino.it\0" +"tjome.no\0" +"us-east-1.amazonaws.com\0" +"forsand.no\0music\0" +"taiki.hokkaido.jp\0community-pro.de\0" +"krasnik.pl\0" +"hobby-site.com\0" +"egyptian.museum\0\xe0\xa4\xb8\xe0\xa4\x82\xe0\xa4\x97\xe0\xa4\xa0\xe0\xa4\xa8\0" +"co.ro\0" +"jus.br\0" +"toyama.jp\0tsu.mie.jp\0shiftcrypto.dev\0" +"ikeda.gifu.jp\0co.rs\0k12.pr.us\0" +"myphotos.cc\0" +"nagasaki.jp\0" +"co.rw\0" +"yusui.kagoshima.jp\0" +"aparecida.br\0cupcake.is\0" +"shingo.aomori.jp\0bergen.no\0\xe5\xbe\xae\xe5\x8d\x9a\0" +"esq\0net.eu.org\0paas.datacenter.fi\0no-ip.ca\0" +"toyoura.hokkaido.jp\0nhlfan.net\0" +"uk.primetel.cloud\0" +"us-east-1.elasticbeanstalk.com\0" +"mock.pstmn.io\0" +"tottori.jp\0hofu.yamaguchi.jp\0bievat.no\0" +"co.st\0" +"hi.cn\0warabi.saitama.jp\0mil.ye\0" +"soja.okayama.jp\0co.th\0" +"user.srcf.net\0" +"presidio.museum\0co.sz\0co.tj\0smile\0" +"co.tm\0" +"gs.ol.no\0" +"\xd8\xa7\xd9\x84\xd8\xa7\xd8\xb1\xd8\xaf\xd9\x86\0" +"muos\xc3\xa1t.no\0" +"hitra.no\0mil.za\0for-better.biz\0co.ua\0" +"ggee\0" +"flesberg.no\0co.tt\0" +"co.ug\0" +"co.tz\0" +"andoy.no\0co.uk\0lacaixa\0" +"iwafune.tochigi.jp\0mil.zm\0cloudns.org\0" +"stargard.pl\0eus\0" +"pb.ao\0" +"mer\xc3\xa5ker.no\0" +"greta.fr\0dyndns-office.com\0" +"bo.nordland.no\0co.us\0" +"forl\xc3\xac-cesena.it\0k12.nj.us\0" +"or.at\0rendalen.no\0co.ve\0calvinklein\0" +"social\0" +"mil.zw\0" +"cuneo.it\0" +"co.vi\0" +"or.bi\0westfalen.museum\0namdalseid.no\0co.uz\0" +"cyon.link\0" +"dyndns-pics.com\0" +"cc.sd.us\0" +"jp.eu.org\0" +"kameoka.kyoto.jp\0" +"kozow.com\0" +"balsan-s\xc3\xbc""dtirol.it\0" +"\xe6\xbe\xb3\xe9\x97\xa8\0" +"hirosaki.aomori.jp\0pub.sa\0" +"or.ci\0fitness\0" +"trentinoaadige.it\0matsubushi.saitama.jp\0rackmaze.com\0" +"vic.edu.au\0udi.br\0" +"lezajsk.pl\0" +"o.se\0" +"or.cr\0lom.it\0vr.it\0uchihara.ibaraki.jp\0" +"shangrila\0" +"luroy.no\0datsun\0ftpaccess.cc\0" +"myds.me\0" +"kh.ua\0analytics\0" +"mobile\0" +"lib.ga.us\0" +"for.one\0" +"casino\0" +"bond\0" +"now.sh\0" +"porsgrunn.no\0" +"globo\0" +"dd-dns.de\0" +"trentinos\xc3\xbc""d-tirol.it\0" +"fit\0" +"co.za\0" +"iris.arpa\0" +"lodingen.no\0dni.us\0" +"toyonaka.osaka.jp\0vi.us\0" +"ina.saitama.jp\0porsangu.no\0" +"book\0" +"coloradoplateau.museum\0sydney\0" +"co.zm\0" +"nakanoto.ishikawa.jp\0" +"fie.ee\0gs.hl.no\0is-a-cubicle-slave.com\0" +"muenster.museum\0" +"iamallama.com\0outsystemscloud.com\0" +"shopping\0barsy.shop\0" +"konsulat.gov.pl\0co.zw\0" +"tsuruga.fukui.jp\0" +"ddnss.org\0" +"tsuwano.shimane.jp\0" +"alaska.museum\0bukhara.su\0" +"lib.nv.us\0" +"credit\0" +"sakai.fukui.jp\0\xd8\xa7\xd9\x84\xd8\xac\xd8\xb2\xd8\xa7\xd8\xa6\xd8\xb1\0" +"monza-brianza.it\0lom.no\0" +"schweiz.museum\0na4u.ru\0" +"koshigaya.saitama.jp\0" +"rana.no\0gentapps.com\0" +"fly\0" +"or.id\0" +"mitane.akita.jp\0" +"kitagata.saga.jp\0" +"my-vigor.de\0" +"tc.br\0histoire.museum\0ravpage.co.il\0" +"caa.aero\0" +"indianmarket.museum\0pdns.page\0" +"akune.kagoshima.jp\0" +"tome.miyagi.jp\0" +"or.it\0sakurai.nara.jp\0\xe0\xae\x87\xe0\xae\xa8\xe0\xaf\x8d\xe0\xae\xa4\xe0\xae\xbf\xe0\xae\xaf\xe0\xae\xbe\0" +"b\xc3\xa1hcavuotna.no\0aejrie.no\0" +"nsw.edu.au\0sandefjord.no\0" +"project.museum\0" +"tr\xc3\xa6na.no\0" +"imb.br\0aus.basketball\0" +"cx.ua\0" +"etajima.hiroshima.jp\0" +"or.jp\0" +"mcdir.me\0" +"sakado.saitama.jp\0" +"asmatart.museum\0" +"or.ke\0" +"from-ne.com\0" +"foo\0" +"ishinomaki.miyagi.jp\0" +"tachiarai.fukuoka.jp\0okawa.kochi.jp\0" +"is-uberleet.com\0" +"comcast\0" +"chikujo.fukuoka.jp\0or.kr\0fox\0it1.jenv-aruba.cloud\0" +"ny.us\0noop.app\0" +"rj.gov.br\0" +"bolzano-altoadige.it\0mansions.museum\0" +"tsubetsu.hokkaido.jp\0" +"tokyo.jp\0" +"childrens.museum\0saltdal.no\0webcam\0" +"ap-northeast-1.elasticbeanstalk.com\0" +"wildlife.museum\0" +"orx.biz\0" +"rnu.tn\0" +"hakui.ishikawa.jp\0" +"mashike.hokkaido.jp\0" +"gal\0" +"shimotsuke.tochigi.jp\0" +"gap\0" +"heritage.museum\0x.se\0bostik\0" +"koebenhavn.museum\0" +"or.na\0valer.hedmark.no\0" +"\xe7\x9f\xb3\xe5\xb7\x9d.jp\0co.com\0" +"gay\0" +"or.mu\0" +"frl\0official.academy\0" +"\xc3\xa5l.no\0" +"oshima.tokyo.jp\0" +"tonami.toyama.jp\0" +"is-a-liberal.com\0" +"gallup\0" +"stalbans.museum\0fin.ci\0" +"iwaizumi.iwate.jp\0kainan.wakayama.jp\0" +"witd.gov.pl\0njs.jelastic.vps-host.net\0" +"ogose.saitama.jp\0cambridge.museum\0" +"\xe7\xa5\x9e\xe5\xa5\x88\xe5\xb7\x9d.jp\0mc.ax\0" +"servebbs.net\0" +"la.us\0" +"kherson.ua\0" +"chijiwa.nagasaki.jp\0" +"direct.quickconnect.to\0" +"nagi.okayama.jp\0" +"hadsel.no\0" +"office\0" +"gdn\0" +"fin.ec\0mishima.fukushima.jp\0nesseby.no\0framercanvas.com\0" +"gea\0" +"ftr\0xihuan\0" +"fujimi.nagano.jp\0" +"ss.it\0" +"fed.us\0" +"in-brb.de\0" +"ringsaker.no\0" +"or.pw\0" +"fun\0" +"wallonie.museum\0" +"edgeapp.net\0" +"yabuki.fukushima.jp\0" +"bajddar.no\0" +"higashi.fukuoka.jp\0vestvagoy.no\0" +"art.museum\0" +"df.gov.br\0" +"florence.it\0miasa.nagano.jp\0" +"viking.museum\0cc.al.us\0" +"hinode.tokyo.jp\0" +"shikaoi.hokkaido.jp\0" +"hi.us\0" +"loginline.site\0serveminecraft.net\0" +"kakuda.miyagi.jp\0" +"quebec\0" +"webhop.biz\0cloudapp.net\0" +"hioki.kagoshima.jp\0is-an-engineer.com\0eu-4.evennode.com\0" +"wpmucdn.com\0" +"gallo\0" +"eng.pro\0" +"s\xc3\xb8r-fron.no\0" +"dyndns-remote.com\0" +"boston\0kosher\0" +"co.business\0" +"ina.nagano.jp\0eu-west-3.elasticbeanstalk.com\0" +"from-az.net\0" +"szczecin.pl\0leczna.pl\0" +"potager.org\0" +"ringerike.no\0or.th\0" +"barrel-of-knowledge.info\0" +"kaszuby.pl\0" +"\xed\x95\x9c\xea\xb5\xad\0map.fastly.net\0" +"\xe7\xb6\xb2\xe7\xb5\xa1.cn\0chiyoda.gunma.jp\0misugi.mie.jp\0mcdir.ru\0" +"k12.ca.us\0" +"delaware.museum\0fyi\0" +"bsb.br\0or.ug\0es.ax\0" +"gemological.museum\0" +"ashiya.fukuoka.jp\0notogawa.shiga.jp\0or.tz\0" +"prudential\0" +"usgarden.museum\0yolasite.com\0" +"maizuru.kyoto.jp\0lib.vt.us\0" +"leasing.aero\0ayase.kanagawa.jp\0settlement.museum\0" +"or.us\0" +"fuchu.tokyo.jp\0cityeats\0" +"ar.it\0" +"shikatsu.aichi.jp\0" +"miyota.nagano.jp\0" +"fauske.no\0" +"mc.it\0alstahaug.no\0eu-3.evennode.com\0" +"matsudo.chiba.jp\0" +"oirase.aomori.jp\0furudono.fukushima.jp\0satosho.okayama.jp\0" +"kanagawa.jp\0" +"villas\0" +"yokoshibahikari.chiba.jp\0" +"gle\0" +"campinagrande.br\0london.museum\0" +"nord-aurdal.no\0vegarshei.no\0" +"bulsan-sudtirol.it\0" +"valle-d-aosta.it\0" +"nz.basketball\0" +"umaji.kochi.jp\0" +"matsusaka.mie.jp\0\xe3\x82\xb9\xe3\x83\x88\xe3\x82\xa2\0" +"gulen.no\0" +"kanra.gunma.jp\0holtalen.no\0" +"selfip.net\0is.eu.org\0" +"naturhistorisches.museum\0" +"inami.wakayama.jp\0kvinesdal.no\0gmo\0is-an-actor.com\0" +"saitama.jp\0l\xc3\xa6rdal.no\0" +"q-a.eu.org\0" +"sa.gov.au\0" +"\xe7\xb6\xb2\xe7\xb5\xa1.hk\0uwu.ai\0trycloudflare.com\0" +"m\xc3\xa5lselv.no\0wphostedmail.com\0" +"gmx\0" +"ashikaga.tochigi.jp\0" +"hara.nagano.jp\0kusu.oita.jp\0" +"kumakogen.ehime.jp\0kakogawa.hyogo.jp\0" +"v\xc3\xa1rgg\xc3\xa1t.no\0\xd8\xb3\xd9\x88\xd8\xaf\xd8\xa7\xd9\x86\0" +"to.leg.br\0" +"warszawa.pl\0" +"hatsukaichi.hiroshima.jp\0" +"elburg.museum\0" +"\xe6\x97\xb6\xe5\xb0\x9a\0" +"yanaizu.fukushima.jp\0" +"eu-2.evennode.com\0" +"conf.au\0it.eu.org\0ddnslive.com\0" +"inzai.chiba.jp\0shika.ishikawa.jp\0" +"chintai\0herokussl.com\0" +"karate.museum\0" +"\xe8\xaf\xba\xe5\x9f\xba\xe4\xba\x9a\0" +"it.ao\0goo\0hepforge.org\0" +"crew.aero\0gop\0*.owo.codes\0" +"localhost.daplie.me\0" +"\xe7\xae\x87\xe4\xba\xba.hk\0scholarships\0" +"got\0" +"otoineppu.hokkaido.jp\0" +"gov\0rauma.no\0apartments\0vladimir.su\0" +"bokn.no\0" +"palmas.br\0novara.it\0ghost.io\0serveftp.com\0" +"rr.gov.br\0" +"engine.aero\0games\0" +"s3-ca-central-1.amazonaws.com\0" +"duck\0" +"trentino-stirol.it\0bryansk.su\0" +"fc.it\0suita.osaka.jp\0arakawa.saitama.jp\0gop.pk\0cafe\0myeffect.net\0" +"forgeblocks.com\0" +"midtre-gauldal.no\0crd.co\0" +"pt.it\0" +"kumejima.okinawa.jp\0kahoku.yamagata.jp\0" +"eastcoast.museum\0drayddns.com\0" +"kpmg\0" +"ind.br\0dyndns-work.com\0" +"kawai.iwate.jp\0" +"hzc.io\0" +"verbania.it\0dst.mi.us\0" +"chikuma.nagano.jp\0homelink.one\0" +"rs.gov.br\0sc.gov.br\0hbo\0" +"k12.ct.us\0" +"assn.lk\0jewish.museum\0vladimir.ru\0" +"es.kr\0netbank\0eu-1.evennode.com\0" +"kure.hiroshima.jp\0jolster.no\0siellak.no\0in.eu.org\0" +"tsuyama.okayama.jp\0komvux.se\0" +"asahi.toyama.jp\0" +"czeladz.pl\0" +"sirdal.no\0" +"cc.in.us\0" +"jerusalem.museum\0" +"diskstation.me\0" +"za.com\0rdv.to\0" +"fin.tn\0" +"c66.me\0" +"synology.me\0" +"toyotomi.hokkaido.jp\0griw.gov.pl\0" +"diskstation.eu\0" +"ebetsu.hokkaido.jp\0midatlantic.museum\0" +"saroma.hokkaido.jp\0kerrylogistics\0" +"hoylandet.no\0ostroda.pl\0" +"yamakita.kanagawa.jp\0" "group.aero\0" -"\xe9\x9b\x86\xe5\x9b\xa2\0ilovecollege.info\0" -"jll\0" -"sa.edu.au\0" -"marugame.kagawa.jp\0v\xc3\xa5gan.no\0" -"horonobe.hokkaido.jp\0" -"yonaguni.okinawa.jp\0" -"incheon.kr\0rost.no\0" -"\xe5\xa5\x88\xe8\x89\xaf.jp\0" -"katano.osaka.jp\0" -"vet.br\0" -"dali.museum\0" -"trentinsudtirol.it\0" -"school.museum\0" -"es.kr\0game.tw\0" -"jab.br\0skodje.no\0" -"siena.it\0fentiger.mythic-beasts.com\0" -"jmp\0viva\0" -"a.prod.fastly.net\0" -"santacruz.museum\0" -"university.museum\0" -"hakone.kanagawa.jp\0" -"ac\0kharkov.ua\0jnj\0homeoffice.gov.uk\0" -"ad\0bing\0" -"ae\0jevnaker.no\0" -"accident-investigation.aero\0af\0saitama.saitama.jp\0" -"ag\0vivo\0" -"togane.chiba.jp\0" -"ai\0pa.us\0" -"alp1.ae.flow.ch\0" -"westeurope.azurestaticapps.net\0" -"al\0" -"am\0obanazawa.yamagata.jp\0report\0forgot.her.name\0" -"ao\0kurotaki.nara.jp\0" +"k12.al.us\0" +"is-a-llama.com\0" +"beskidy.pl\0" +"lib.id.us\0" +"town\0" +"imdb\0" +"ar.us\0paas.massivegrid.com\0" +"otsuki.kochi.jp\0oyer.no\0" +"hakodate.hokkaido.jp\0" +"sobetsu.hokkaido.jp\0gift\0" +"trentinos-tirol.it\0saka.hiroshima.jp\0" +"*.nom.br\0ind.gt\0ishikawa.jp\0" +"mihama.wakayama.jp\0" +"museet.museum\0" +"call\0corsica\0" +"tananger.no\0stord.no\0parliament.nz\0" +"ascoli-piceno.it\0bitbridge.net\0" +"nflfan.org\0" +"afjord.no\0" +"masaki.ehime.jp\0" +"rn.gov.br\0toys\0" +"nagawa.nagano.jp\0" +"ind.in\0akagi.shimane.jp\0camp\0" +"fukudomi.saga.jp\0skierv\xc3\xa1.no\0" +"kl\xc3\xa6""bu.no\0" +"vinnica.ua\0lib.fl.us\0" +"minamiaiki.nagano.jp\0lubin.pl\0" +"nes.akershus.no\0" +"lazio.it\0shinjo.okayama.jp\0aaa.pro\0" +"vallee-aoste.it\0gangaviika.no\0" +"amusement.aero\0" +"s3-website-eu-west-1.amazonaws.com\0" +"hiv\0" +"cartoonart.museum\0" +"otaki.nagano.jp\0" +"cc.mo.us\0" +"ro.gov.br\0" +"kudoyama.wakayama.jp\0" +"d.bg\0" +"dnsupdater.de\0" +"r\xc3\xa1isa.no\0appspacehosted.com\0" +"koga.ibaraki.jp\0" +"\xe3\x82\xb3\xe3\x83\xa0\0" +"varese.it\0ind.kw\0bamble.no\0" +"uwu.nu\0" +"\xe5\x85\xb5\xe5\xba\xab.jp\0samsung\0" +"poivron.org\0" +"hkt\0" +"ena.gifu.jp\0" +"morioka.iwate.jp\0" +"friuli-ve-giulia.it\0" +"esp.br\0yonago.tottori.jp\0" +"sakaki.nagano.jp\0" +"kristiansund.no\0" +"vantaa.museum\0" +"\xc3\xa1k\xc5\x8boluokta.no\0" +"kagamino.okayama.jp\0" +"nanao.ishikawa.jp\0frosta.no\0" +"lib.me.us\0" +"omasvuotna.no\0" +"hasami.nagasaki.jp\0" +"ogimi.okinawa.jp\0" +"kongsvinger.no\0careers\0" +"care\0george\0s3-fips-us-gov-west-1.amazonaws.com\0" +"sciencecenter.museum\0" +"static-access.net\0" +"qa2.com\0" +"gallery\0" +"gokase.miyazaki.jp\0" +"pics\0" +"mysecuritycamera.com\0" +"shimamoto.osaka.jp\0" +"bananarepublic\0casa\0jele.io\0" +"bt.it\0cc.tx.us\0customer.enonic.io\0" +"cars\0rackmaze.net\0" +"case\0" +"bahcavuotna.no\0" +"cymru.museum\0cash\0filegear-au.me\0github.io\0" +"holt\xc3\xa5len.no\0" +"yamada.toyama.jp\0lviv.ua\0" +"primetel.cloud\0" +"dvag\0" +"services\0" +"luster.no\0" +"valleaosta.it\0naturbruksgymn.se\0" +"trentin-s\xc3\xbc""dtirol.it\0" +"tatar\0" +"ne.jp\0" +"kuwana.mie.jp\0" +"hoteles\0" +"varggat.no\0alpha-myqnapcloud.com\0" +"ne.ke\0valley.museum\0" +"air-surveillance.aero\0" +"higashiura.aichi.jp\0" +"bjark\xc3\xb8y.no\0" +"hot\0" +"trafficplex.cloud\0draydns.de\0" +"oharu.aichi.jp\0" +"how\0mytuleap.com\0" +"oceanographic.museum\0kmpsp.gov.pl\0immo\0conf.se\0" +"coupon\0" +"clinton.museum\0cruises\0" +"american.museum\0gmail\0" +"ne.kr\0" +"asakawa.fukushima.jp\0" +"harima.hyogo.jp\0artanddesign.museum\0kvafjord.no\0sand\xc3\xb8y.no\0" +"balsan-suedtirol.it\0philadelphia.museum\0" +"toyokawa.aichi.jp\0" +"osakasayama.osaka.jp\0my-firewall.org\0" +"sanjo.niigata.jp\0" +"forlicesena.it\0" +"naganohara.gunma.jp\0" +"rzgw.gov.pl\0" +"volda.no\0" +"hiphop\0ibm\0" +"\xe6\xbb\x8b\xe8\xb3\x80.jp\0gs.va.no\0volkswagen\0" +"realtor\0" +"ruovat.no\0" +"de.cool\0" +"iwaki.fukushima.jp\0" +"land\0" +"nishiaizu.fukushima.jp\0ice\0" +"yao.osaka.jp\0" +"bmd.br\0meland.no\0" +"perso.ht\0" +"lebork.pl\0" +"se.net\0ru.net\0" +"nesoddtangen.no\0" +"matsue.shimane.jp\0" +"lib.pr.us\0viajes\0" +"shiojiri.nagano.jp\0suwa.nagano.jp\0hapmir.no\0wlocl.pl\0" +"kutchan.hokkaido.jp\0" +"shibata.niigata.jp\0" +"ind.tn\0" +"icu\0" +"now-dns.top\0" +"spb.ru\0" +"niigata.jp\0yamagata.yamagata.jp\0cc.nh.us\0" +"arakawa.tokyo.jp\0" +"hachioji.tokyo.jp\0vpndns.net\0" +"nishihara.kumamoto.jp\0" +"lahppi.no\0filegear-ie.me\0" +"coffee\0" +"m.bg\0" +"ge.it\0*.nodebalancer.linode.com\0" +"monzabrianza.it\0" +"spb.su\0" +"inami.toyama.jp\0shirahama.wakayama.jp\0" +"fresenius\0" +"c.cdn77.org\0" +"donostia.museum\0" +"ne.pw\0" +"eti.br\0" +"*.stgstage.dev\0" +"from-in.com\0" +"oshino.yamanashi.jp\0fitjar.no\0" +"genting\0s3-eu-west-1.amazonaws.com\0" +"rmit\0" +"chanel\0" +"hanggliding.aero\0" +"badaddja.no\0" +"ozu.kumamoto.jp\0ifm\0" +"se.gov.br\0" +"desa.id\0lib.nj.us\0" +"ambulance.aero\0ogi.saga.jp\0" +"botany.museum\0" +"ulm.museum\0fl.us\0deals\0olayan\0onza.mythic-beasts.com\0" +"sar.it\0" +"fnwk.site\0" +"servegame.com\0" +"aosta.it\0f\xc3\xb8rde.no\0" +"\xe4\xb8\xad\xe4\xbf\xa1\0" +"kwp.gov.pl\0servebbs.org\0blogsite.xyz\0" +"5.bg\0dvrdns.org\0" +"cc.va.us\0" +"komoro.nagano.jp\0" +"biev\xc3\xa1t.no\0ping\0" +"noticias.bo\0wada.nagano.jp\0j.layershift.co.uk\0" +"isehara.kanagawa.jp\0assassination.museum\0assisi.museum\0" +"publ.pt\0pink\0" +"cesena-forl\xc3\xac.it\0mantova.it\0" +"togakushi.nagano.jp\0family.museum\0" +"kadoma.osaka.jp\0" +"krym.ua\0" +"yawatahama.ehime.jp\0gyokuto.kumamoto.jp\0*.azurecontainer.io\0" +"info\0" +"uki.kumamoto.jp\0" +"bas.it\0minamisanriku.miyagi.jp\0" +"\xe4\xb8\x96\xe7\x95\x8c\0" +"og.ao\0brumunddal.no\0ne.ug\0" +"kred\0" +"ne.tz\0" +"nakagyo.kyoto.jp\0" +"toho.fukuoka.jp\0conf.lv\0" +"obanazawa.yamagata.jp\0" +"kamikoani.akita.jp\0plaza.museum\0lowicz.pl\0ne.us\0" +"baltimore.museum\0" +"servepics.com\0" +"shichinohe.aomori.jp\0dyndns-blog.com\0" +"cc.ri.us\0" +"amakusa.kumamoto.jp\0weir\0" +"national.museum\0" +"takanezawa.tochigi.jp\0" +"hino.tottori.jp\0cherkasy.ua\0wnext.app\0" +"chita.aichi.jp\0" +"minamimaki.nagano.jp\0" +"gjesdal.no\0" +"nagasaki.nagasaki.jp\0ibara.okayama.jp\0" +"saikai.nagasaki.jp\0" +"khmelnitskiy.ua\0firestone\0" +"d.se\0" +"platterp.us\0" +"ba.gov.br\0" +"hikone.shiga.jp\0sa.gov.pl\0\xd8\xa7\xd9\x85\xd8\xa7\xd8\xb1\xd8\xa7\xd8\xaa\0" +"tas.gov.au\0nagiso.nagano.jp\0" +"fujisawa.kanagawa.jp\0reserve-online.com\0" +"flowers\0" +"ask\xc3\xb8y.no\0" +"napoli.it\0" +"yoshimi.saitama.jp\0broadcast.museum\0feedback\0" +"yamagata.nagano.jp\0cloudsite.builders\0" +"cbre\0" +"s3-us-east-2.amazonaws.com\0" +"tomioka.gunma.jp\0" +"sciencehistory.museum\0" +"mihara.hiroshima.jp\0is-leet.com\0" +"inc\0" +"wajiki.tokushima.jp\0" +"dev.static.land\0" +"space\0" +"niteroi.br\0setouchi.okayama.jp\0cooking\0ing\0" +"ngrok.io\0" +"ink\0" +"v.bg\0" +"arendal.no\0" +"ro.im\0mein-iserv.de\0tcp4.me\0" +"nissedal.no\0" +"nogata.fukuoka.jp\0takehara.hiroshima.jp\0" +"kafjord.no\0" +"int\0" +"ro.it\0e12.ve\0from-wa.com\0" +"pt.eu.org\0" +"control.aero\0discovery.museum\0ssl.origin.cdn77-secure.org\0" +"news\0" +"klepp.no\0" +"gosen.niigata.jp\0" +"freetls.fastly.net\0" +"m\xc3\xa1tta-v\xc3\xa1rjjat.no\0\xe3\x83\x95\xe3\x82\xa1\xe3\x83\x83\xe3\x82\xb7\xe3\x83\xa7\xe3\x83\xb3\0" +"ybo.review\0" +"ap-southeast-2.elasticbeanstalk.com\0" +"it1.eur.aruba.jenv-aruba.cloud\0" +"\xe0\xb0\xad\xe0\xb0\xbe\xe0\xb0\xb0\xe0\xb0\xa4\xe0\xb1\x8d\0" +"kiryu.gunma.jp\0" +"next\0hk.org\0" +"ohkura.yamagata.jp\0lib.ms.us\0lib.nc.us\0" +"nirasaki.yamanashi.jp\0hareid.no\0l-o-g-i-n.de\0" +"eu.platform.sh\0" +"vision\0" +"frana.no\0" +"daito.osaka.jp\0selfip.org\0forumz.info\0" +"ryokami.saitama.jp\0" +"gildeskal.no\0paroch.k12.ma.us\0" +"schwarz\0" +"dscloud.me\0" +"myftp.biz\0" +"toda.saitama.jp\0ichiba.tokushima.jp\0pfizer\0" +"drud.io\0" +"modena.it\0og.it\0aogaki.hyogo.jp\0" +"chungbuk.kr\0" +"sh.cn\0" +"charter.aero\0" +"fastly-terrarium.com\0" +"\xe6\xa0\x83\xe6\x9c\xa8.jp\0" +"higashimurayama.tokyo.jp\0" +"jcb\0" +"sigdal.no\0" +"r\xc3\xa6lingen.no\0localzone.xyz\0" +"emergency.aero\0" +"krodsherad.no\0" +"sondre-land.no\0wegrow.pl\0" +"nakayama.yamagata.jp\0" +"sanofi\0" +"dynns.com\0" +"uchinada.ishikawa.jp\0" +"ist\0" +"tamatsukuri.ibaraki.jp\0" +"am.gov.br\0" +"\xd0\xb8\xd0\xba\xd0\xbe\xd0\xbc.museum\0" +"scrapper-site.net\0" +"time.no\0" +"fuchu.hiroshima.jp\0\xc3\xa5lg\xc3\xa5rd.no\0family\0here-for-more.info\0" +"kouzushima.tokyo.jp\0\xd8\xaa\xd9\x88\xd9\x86\xd8\xb3\0" +"aerodrome.aero\0" +"higashichichibu.saitama.jp\0" +"parliament.cy\0zama.kanagawa.jp\0rj.leg.br\0" +"saijo.ehime.jp\0lcube-server.de\0" +"gs.aa.no\0" +"itv\0" +"\xd8\xb9\xd8\xb1\xd8\xa7\xd9\x82\0" +"yoshikawa.saitama.jp\0natuurwetenschappen.museum\0nebraska.museum\0" +"m.se\0" +"aeroport.fr\0iijima.nagano.jp\0jcloud-ver-jpc.ik-server.com\0*.cloud.metacentrum.cz\0" +"incheon.kr\0tokyo\0\xe5\xae\xb6\xe9\x9b\xbb\0" +"marylhurst.museum\0perso.sn\0" +"katowice.pl\0" +"\xe4\xb8\xad\xe6\x96\x87\xe7\xbd\x91\0" +"higashikagawa.kagawa.jp\0is-a-bookkeeper.com\0" +"nohost.me\0" +"hatogaya.saitama.jp\0linz.museum\0" +"jan-mayen.no\0" +"tsugaru.aomori.jp\0" +"vall\xc3\xa9""e-aoste.it\0" +"from-tx.com\0" +"perso.tn\0" +"fst.br\0" +"odo.br\0" +"sicilia.it\0ariake.saga.jp\0\xe8\x87\xba\xe7\x81\xa3\0" +"csx.cc\0" +"fujioka.gunma.jp\0telekommunikation.museum\0" +"grandrapids.museum\0" +"konin.pl\0" +"kamikitayama.nara.jp\0" +"taketomi.okinawa.jp\0" +"shichikashuku.miyagi.jp\0" +"capebreton.museum\0" +"securitytactics.com\0" +"satte.saitama.jp\0jdevcloud.com\0" +"dscloud.biz\0" +"cranbrook.museum\0balestrand.no\0snasa.no\0" +"omachi.saga.jp\0jio\0" +"tbits.me\0" +"loten.no\0fedorapeople.org\0" +"tran\xc3\xb8y.no\0church\0" +"aquila.it\0" +"ap.gov.br\0lib.oh.us\0" +"plants.museum\0" +"showa.fukushima.jp\0shintomi.miyazaki.jp\0df.leg.br\0" +"wiki.bo\0arts.co\0wakasa.tottori.jp\0" +"ookuwa.nagano.jp\0" +"wiki.br\0" +"leitungsen.de\0" +"azumino.nagano.jp\0suwalki.pl\0" +"curitiba.br\0" +"georgia.museum\0" +"zoological.museum\0" +"cieszyn.pl\0mycd.eu\0" +"hita.oita.jp\0" +"fujishiro.ibaraki.jp\0minami.kyoto.jp\0" +"medizinhistorisches.museum\0" +"iiyama.nagano.jp\0" +"ap.gov.pl\0" +"lab.ms\0" +"ikeda.hokkaido.jp\0cv.ua\0" +"matsuura.nagasaki.jp\0jll\0" +"aostavalley.it\0norddal.no\0" +"emr.it\0nationalheritage.museum\0" +"kita.osaka.jp\0*.cns.joyent.com\0" +"m\xc3\xa1latvuopmi.no\0" +"omiya.saitama.jp\0" +"oksnes.no\0" +"nishikatsura.yamanashi.jp\0" +"jmp\0" +"fuel.aero\0" +"lib.va.us\0" +"xen.prgmr.com\0" +"community\0" +"jnj\0drud.us\0" +"ag.it\0" +"yokaichiba.chiba.jp\0" +"genova.it\0" +"katano.osaka.jp\0drive\0" +"rns.tn\0" +"jc.neen.it\0" +"localhistory.museum\0" +"asn.au\0hisayama.fukuoka.jp\0" +"internet-dns.de\0north-kazakhstan.su\0" +"shirataka.yamagata.jp\0" +"\xe5\xb3\xb6\xe6\xa0\xb9.jp\0yuzawa.niigata.jp\0" +"toba.mie.jp\0hirogawa.wakayama.jp\0" +"dinosaur.museum\0" +"british.museum\0jot\0" +"neko.am\0" +"s3.eu-central-1.amazonaws.com\0*.dapps.earth\0" +"otsuki.yamanashi.jp\0berlin.museum\0pomorskie.pl\0" +"joy\0" +"miyako.fukuoka.jp\0ninomiya.kanagawa.jp\0lebesby.no\0" +"dyr\xc3\xb8y.no\0" +"sakae.nagano.jp\0touch.museum\0lublin.pl\0" +"nagato.yamaguchi.jp\0" +"firewall-gateway.de\0" +"tonosho.kagawa.jp\0grue.no\0" +"firewall-gateway.com\0" +"nanbu.yamanashi.jp\0hdfcbank\0" +"v.ua\0" +"kiyosato.hokkaido.jp\0" +"tuscany.it\0mugi.tokushima.jp\0tromsa.no\0" +"nanporo.hokkaido.jp\0showa.yamanashi.jp\0" +"shimoichi.nara.jp\0okinawa.okinawa.jp\0school.na\0" +"lel.br\0" +"linkyard.cloud\0" +"imabari.ehime.jp\0fhs.no\0" +"minamiawaji.hyogo.jp\0" +"commune.am\0" +"hashima.gifu.jp\0toyako.hokkaido.jp\0uscountryestate.museum\0tourism.tn\0" +"mochizuki.nagano.jp\0" +"ta.it\0trade\0" +"sugito.saitama.jp\0" +"stadt.museum\0" +"iwama.ibaraki.jp\0" +"gs.st.no\0is-a-anarchist.com\0" +"school.nz\0" +"nordre-land.no\0\xd0\xbf\xd1\x80.\xd1\x81\xd1\x80\xd0\xb1\0appspaceusercontent.com\0a.ssl.fastly.net\0" +"chungnam.kr\0" +"aremark.no\0" +"takarazuka.hyogo.jp\0gdynia.pl\0" +"takahata.yamagata.jp\0voss.no\0" +"mo-siemens.io\0" +"kamisu.ibaraki.jp\0theater.museum\0" +"dyn.cosidns.de\0" +"sopot.pl\0" +"xfinity\0from-pr.com\0" +"trentino-aadige.it\0" +"sula.no\0" +"nextdirect\0cloud66.zone\0" +"arts.ve\0rr.leg.br\0" +"trana.no\0uy.com\0" +"tmp.br\0hakata.fukuoka.jp\0" +"psc.br\0" +"pi.it\0" +"matsuda.kanagawa.jp\0" +"tj.cn\0oslo.no\0" +"fra1-de.cloudjiffy.net\0" +"venice.it\0" +"kfh\0" +"latrobe\0" +"lima-city.de\0" +"sorocaba.br\0balashov.su\0" +"anthropology.museum\0impertrixcdn.com\0rs.leg.br\0sc.leg.br\0" +"windows\0" +"aprendemas.cl\0" +"lib.ky.us\0is-into-cars.com\0" +"vestby.no\0pymnt.uk\0" +"fuji.shizuoka.jp\0" +"naples.it\0" +"kamikawa.hyogo.jp\0" +"vibovalentia.it\0" +"oy.lc\0" +"kagami.kochi.jp\0kuroiso.tochigi.jp\0" +"rankoshi.hokkaido.jp\0yuasa.wakayama.jp\0" +"algard.no\0dielddanuorri.no\0" +"communication.museum\0" +"oldnavy\0" +"ap.it\0*.sapporo.jp\0" +"podhale.pl\0miami\0" +"otago.museum\0" +"kaita.hiroshima.jp\0lima-city.at\0" +"bradesco\0" +"gifu.gifu.jp\0" +"toscana.it\0omaha.museum\0" +"vikna.no\0" +"garden.museum\0geelvinck.museum\0nittedal.no\0" +"kitanakagusuku.okinawa.jp\0kia\0" +"evenes.no\0" +"s3.dualstack.ap-northeast-2.amazonaws.com\0" +"oceanographique.museum\0" +"arts.ro\0" +"randaberg.no\0kim\0" +"ac\0" +"ad\0tenri.nara.jp\0lima-city.ch\0" +"ae\0bryne.no\0" +"af\0" +"ag\0\xc3\xa5s.no\0" +"ai\0" +"asn.lv\0americanfamily\0" +"al\0akkeshi.hokkaido.jp\0konan.shiga.jp\0" +"am\0hotel.tz\0mmafan.biz\0" +"\xe7\xa6\x8f\xe5\xb3\xb6.jp\0ashoro.hokkaido.jp\0" +"ao\0" +"katsushika.tokyo.jp\0" "aq\0ba\0" "ar\0bb\0" -"as\0amot.no\0" -"at\0yaese.okinawa.jp\0" -"au\0be\0" -"bf\0miners.museum\0cc.vt.us\0" -"aw\0bg\0app.gp\0" +"as\0fbx-os.fr\0" +"at\0" +"au\0be\0date.fukushima.jp\0is-a-conservative.com\0" +"bf\0" +"aw\0bg\0eisenbahn.museum\0" "ax\0bh\0" -"bi\0sejny.pl\0" -"az\0bj\0*.landing.myjino.ru\0" -"cc.nj.us\0mydissent.net\0" -"bm\0jot\0cn.eu.org\0" -"bn\0walbrzych.pl\0" -"bo\0botanicalgarden.museum\0" -"daplie.me\0" -"ca\0" -"br\0joy\0" -"bs\0cc\0hk.com\0" +"bi\0artgallery.museum\0k12.vi.us\0" +"az\0bj\0" +"bm\0" +"bn\0" +"bo\0" +"ca\0wi.us\0" +"br\0" +"bs\0cc\0eniwa.hokkaido.jp\0" "bt\0cd\0" -"7.bg\0shirako.chiba.jp\0biratori.hokkaido.jp\0tabayama.yamanashi.jp\0nittedal.no\0cc.ak.us\0" "bv\0cf\0" -"bw\0cg\0b\xc3\xa1hcavuotna.no\0l\xc3\xb8""dingen.no\0" -"ch\0yamamoto.miyagi.jp\0" -"by\0ci\0" -"bz\0" -"cl\0friuli-ve-giulia.it\0" -"cm\0blogsyte.com\0" -"cn\0" +"bw\0cg\0netflix\0room\0" +"ch\0" +"by\0ci\0\xc3\xb8rsta.no\0" +"bz\0kira.aichi.jp\0aurskog-h\xc3\xb8land.no\0" +"cl\0play\0read-books.org\0" +"cm\0state.museum\0monash\0" +"cn\0gleeze.com\0fastvps.site\0" "co\0" -"pictet\0" -"cr\0" -"s\xc3\xa1l\xc3\xa1t.no\0" -"cu\0de\0sakegawa.yamagata.jp\0science-fiction.museum\0sirdal.no\0" -"cv\0" -"cw\0kitaaiki.nagano.jp\0" -"cx\0kakamigahara.gifu.jp\0" -"cy\0" -"cz\0dj\0kwp.gov.pl\0trafficplex.cloud\0" -"dk\0fukushima.jp\0" -"dm\0" -"oketo.hokkaido.jp\0solund.no\0" -"show.aero\0do\0meiwa.mie.jp\0" -"kumano.hiroshima.jp\0" -"ec\0crd.co\0" -"teshikaga.hokkaido.jp\0" -"ee\0" -"liguria.it\0" +"cr\0bari.it\0" +"clock.museum\0" +"gs.tm.no\0" +"cu\0de\0nesodden.no\0\xe0\xb4\xad\xe0\xb4\xbe\xe0\xb4\xb0\xe0\xb4\xa4\xe0\xb4\x82\0" +"cv\0geek.nz\0rn.leg.br\0" +"cw\0arts.nf\0flynnhosting.net\0" +"cx\0towada.aomori.jp\0" +"cy\0ubank\0" +"cz\0dj\0leirvik.no\0" +"dk\0" +"higashiyama.kyoto.jp\0" +"dm\0baidar.no\0" +"copenhagen.museum\0hosp.uk\0" +"do\0hikimi.shimane.jp\0" +"onjuku.chiba.jp\0chino.nagano.jp\0" +"cbg.ru\0" +"ec\0" +"skanland.no\0" +"ee\0cc.as.us\0*.moonscale.io\0" +"zoology.museum\0" "eg\0" -"is-saved.org\0" +"kawanabe.kagoshima.jp\0computerhistory.museum\0nfshost.com\0" +"chitose.hokkaido.jp\0" "dz\0" -"hemne.no\0" -"tempio-olbia.it\0" -"vc.it\0sabae.fukui.jp\0" -"vall\xc3\xa9""eaoste.it\0iserv.dev\0" -"livorno.it\0lib.me.us\0statebank\0" -"stcgroup\0" -"es\0krellian.net\0" -"et\0mi.it\0tsubata.ishikawa.jp\0" -"eu\0id.ir\0bergbau.museum\0" -"oz.au\0lib.co.us\0" -"watches\0" -"fi\0fireweb.app\0" -"fj\0" -"fm\0" -"gran.no\0" -"fo\0palermo.it\0marker.no\0" -"gon.pk\0" -"ga\0us.kg\0" +"ouda.nara.jp\0schokoladen.museum\0" +"\xd9\x85\xd9\x88\xd9\x82\xd8\xb9\0" +"cc.md.us\0" +"tourism.pl\0" +"auto.pl\0" +"ozora.hokkaido.jp\0" +"es\0otsuka\0" +"et\0" +"eu\0" +"r\xc3\xb8ros.no\0ro.leg.br\0" +"inuyama.aichi.jp\0gon.pk\0" +"mydatto.com\0" +"fi\0komaki.aichi.jp\0" +"fj\0fet.no\0" +"fm\0crown\0" +"fo\0" +"pr.it\0" +"ga\0nexus\0" "fr\0gb\0" -"gd\0vao.it\0vxl.sh\0" -"ge\0online.museum\0" -"gf\0myravendb.com\0" -"gg\0" +"semboku.akita.jp\0" +"gd\0" +"ge\0\xd8\xb3\xd9\x88\xd8\xb1\xd9\x8a\xd8\xa7\0members.linode.com\0" +"gf\0" +"gg\0vaksdal.no\0\xd8\xb3\xd9\x88\xd8\xb1\xd9\x8a\xd8\xa9\0" "gh\0" -"gi\0" -"yurihonjo.akita.jp\0" +"gi\0narashino.chiba.jp\0" +"silk.museum\0" +"hadano.kanagawa.jp\0" "gl\0" -"gm\0" -"gn\0ono.fukui.jp\0" -"gp\0" -"gq\0onfabrica.com\0" +"gm\0tsurugi.ishikawa.jp\0" +"gn\0" +"pvt.ge\0gp\0" +"gq\0" "gr\0" -"gs\0museumcenter.museum\0" +"gs\0pharmaciens.km\0kpn\0" "gt\0" -"gu\0jamison.museum\0" -"gw\0" -"balsan-s\xc3\xbc""dtirol.it\0" -"gy\0sb.ua\0" -"midatlantic.museum\0portal.museum\0" -"presse.ci\0hk\0ogimi.okinawa.jp\0" -"ibaraki.osaka.jp\0reviews\0" -"hm\0anamizu.ishikawa.jp\0cy.eu.org\0" -"hn\0" -"settlement.museum\0" -"kfh\0" +"gu\0" +"nationalfirearms.museum\0" +"gw\0dattorelay.com\0" +"gy\0" +"kitchen\0" +"hk\0k12.ny.us\0" +"hm\0red.sv\0" +"hn\0!city.sendai.jp\0shikokuchuo.ehime.jp\0hotel.lk\0" +"cc.il.us\0" +"filegear-sg.me\0" +"recht.pro\0uk.com\0" "hr\0" -"airport.aero\0" -"ht\0id\0" -"crew.aero\0hu\0ie\0freetls.fastly.net\0" -"eu.int\0" -"id.lv\0" -"plo.ps\0" -"us.na\0storage\0" -"il\0id.ly\0" -"im\0shinyoshitomi.fukuoka.jp\0asahi.nagano.jp\0paris.museum\0" -"in\0nm.us\0" -"io\0iwakura.aichi.jp\0" -"iq\0bashkiria.ru\0" +"amscompute.com\0" +"tur.ar\0ht\0id\0" +"hu\0ie\0" +"juniper\0" +"bi.it\0nyc.museum\0" +"krd\0lat\0git-pages.rit.edu\0" +"ap-northeast-3.elasticbeanstalk.com\0" +"il\0law\0\xd0\xba\xd0\xbe\xd0\xbc\0" +"fj.cn\0im\0" +"in\0edogawa.tokyo.jp\0" +"io\0gmbh\0pythonanywhere.com\0" +"iq\0\xc3\xa5lesund.no\0" "ir\0" "is\0" -"it\0" +"tur.br\0it\0" "je\0" -"os\xc3\xb8yro.no\0" -"chikujo.fukuoka.jp\0mugi.tokushima.jp\0newyork.museum\0" -"democrat\0fbxos.fr\0" -"etne.no\0ieee\0" -"cz.eu.org\0" -"jo\0historicalsociety.museum\0bar.pro\0" +"nativeamerican.museum\0" +"yasu.shiga.jp\0" +"potenza.it\0ono.fukushima.jp\0" +"gotdns.org\0" +"jeonnam.kr\0oregontrail.museum\0" +"jo\0" "jp\0" -"bashkiria.su\0" -"kaneyama.yamagata.jp\0" -"naturalhistorymuseum.museum\0" -"cc.ia.us\0fairwinds\0" +"\xe6\x84\x9b\xe5\xaa\x9b.jp\0travel\0" +"fukuyama.hiroshima.jp\0sdscloud.pl\0" +"olsztyn.pl\0" +"umb.it\0taipei\0" "ke\0" -"h.bg\0beppu.oita.jp\0kg\0is-into-games.com\0" -"crown\0" +"kg\0" +"barsy.club\0""32-b.it\0" "ki\0" -"kia\0" -"tsuruta.aomori.jp\0bradesco\0" -"km\0" -"kn\0jls-sto3.elastx.net\0" -"abeno.osaka.jp\0" -"kp\0blackfriday\0" -"miyakonojo.miyazaki.jp\0la\0k12.dc.us\0" -"nic.in\0kr\0lb\0stryn.no\0gliwice.pl\0" -"lc\0iki.fi\0to.gt\0" -"phoenix.museum\0" -"museum\0ru.com\0" -"newhampshire.museum\0kim\0" -"ogawara.miyagi.jp\0kw\0lucerne.museum\0" -"game\0" -"ky\0li\0alwaysdata.net\0" -"kz\0" -"lk\0nord-aurdal.no\0" -"badajoz.museum\0gloppen.no\0dk.eu.org\0" -"alsace\0selfip.biz\0\xd0\xba\xd0\xbe\xd0\xbc.\xd1\x80\xd1\x83\xd1\x81\0" -"ma\0center\0" -"lr\0heimatunduhren.museum\0" -"ls\0mc\0" +"noboribetsu.hokkaido.jp\0syncloud.it\0" +"trentins\xc3\xbc""d-tirol.it\0" +"geo.br\0minamifurano.hokkaido.jp\0km\0" +"kn\0" +"kp\0" +"\xe7\xbe\xa4\xe9\xa6\xac.jp\0la\0madrid\0staging.onred.one\0" +"kr\0lb\0" +"kunigami.okinawa.jp\0lc\0" +"ma.us\0" +"tromso.no\0mydobiss.com\0" +"cci.fr\0tra.kp\0kw\0textile.museum\0" +"kiso.nagano.jp\0lds\0" +"ky\0li\0build\0" +"des.br\0kz\0gaivuotna.no\0novecore.site\0" +"lk\0" +"temasek\0" +"\xe9\x9d\x99\xe5\xb2\xa1.jp\0preservation.museum\0" +"ma\0" +"lr\0" +"ls\0mc\0r\xc3\xa1hkker\xc3\xa1vju.no\0" "lt\0md\0" -"lu\0me\0" +"lu\0me\0podlasie.pl\0homesecuritypc.com\0" "lv\0" -"mg\0uw.gov.pl\0smushcdn.com\0" -"notaires.fr\0shikatsu.aichi.jp\0mh\0" -"ly\0sucks\0" -"mk\0" -"ml\0tree.museum\0" -"open\0" -"mn\0santafe.museum\0filegear-ie.me\0" -"iwaizumi.iwate.jp\0mo\0sm\xc3\xb8la.no\0\xd8\xa8\xd9\x8a\xd8\xaa\xd9\x83\0" -"fukuoka.jp\0kamiichi.toyama.jp\0mp\0" -"mq\0na\0" +"kawajima.saitama.jp\0mg\0dallas.museum\0" +"hotel.hu\0mh\0" +"ly\0naturalhistory.museum\0" +"ts.it\0plc.ly\0mk\0" +"ml\0" +"mn\0" +"mo\0" +"mp\0" +"gliding.aero\0taishi.hyogo.jp\0mq\0na\0" "mr\0" -"to.it\0ms\0bilbao.museum\0nc\0lib.or.us\0" -"kanazawa.ishikawa.jp\0mt\0instantcloud.cn\0" -"minoh.osaka.jp\0kitayama.wakayama.jp\0mu\0ne\0" -"mv\0nf\0vossevangen.no\0lib.ky.us\0" -"mw\0ng\0" -"mx\0" -"le.it\0my\0ni\0" -"mz\0" -"v\xc3\xa5ler.hedmark.no\0" -"nl\0x.mythic-beasts.com\0" -"azumino.nagano.jp\0savannahga.museum\0" +"minobu.yamanashi.jp\0ms\0anthro.museum\0nc\0augustow.pl\0" +"mt\0hashbang.sh\0" +"mu\0ne\0gs.oslo.no\0" +"mv\0nf\0" +"mw\0ng\0\xe8\xb4\xad\xe7\x89\xa9\0" +"barreau.bj\0mx\0sklep.pl\0" +"my\0ni\0" +"kiyokawa.kanagawa.jp\0mz\0b\xc3\xa1jddar.no\0" +"nl\0" +"mibu.tochigi.jp\0partners\0" +"opensocial.site\0" "no\0" -"s3-eu-west-2.amazonaws.com\0us.org\0" -"trading.aero\0" "nr\0" -"leg.br\0servebeer.com\0" -"sk.ca\0nu\0gdansk.pl\0" -"communication.museum\0" -"in-vpn.de\0" -"app.os.fedoraproject.org\0" -"nz\0mincom.tn\0locus\0" -"from-nv.com\0" -"snillfjord.no\0" -"om\0" -"of.by\0" -"voagat.no\0pa\0" -"krager\xc3\xb8.no\0" -"dental\0" -"pe\0" -"pf\0" -"murmansk.su\0" -"ph\0mi.th\0" -"kasai.hyogo.jp\0" -"ishikawa.fukushima.jp\0pk\0" -"niihama.ehime.jp\0pl\0" -"pm\0de.eu.org\0" -"pn\0" +"ami.ibaraki.jp\0" +"nu\0" +"\xc3\xb8rskog.no\0" +"travel.pl\0" +"nz\0" +"scienceandindustry.museum\0" +"hachinohe.aomori.jp\0om\0" +"western.museum\0" +"pa\0" +"b.bg\0money\0" +"pe\0*.vps.myjino.ru\0" +"kurogi.fukuoka.jp\0pf\0" +"s3-website-ap-southeast-2.amazonaws.com\0" +"vgs.no\0gs.fm.no\0ph\0redumbrella\0static.observableusercontent.com\0" +"shimoda.shizuoka.jp\0uzs.gov.pl\0vodka\0" +"cheltenham.museum\0pk\0foundation\0" +"pl\0" +"b.br\0taki.mie.jp\0pm\0" +"\xe9\xab\x98\xe7\x9f\xa5.jp\0pn\0" +"rybnik.pl\0" "qa\0" -"pr\0" -"ps\0to.md\0" +"pr\0kilatiron.com\0" +"ps\0selfip.biz\0" "pt\0" -"aeroport.fr\0bungoono.oita.jp\0fishing\0istmein.de\0" -"sakai.ibaraki.jp\0ine.kyoto.jp\0" -"pw\0" +"vercelli.it\0sue.fukuoka.jp\0ikeda.osaka.jp\0" +"kin.okinawa.jp\0pw\0" "py\0" -"go.gov.br\0security\0" -"bahn.museum\0" -"actor\0" -"teramo.it\0ishikawa.jp\0" -"osakasayama.osaka.jp\0" -"valledaosta.it\0" -"edu.ac\0" -"mi.us\0" -"edu.af\0re\0" -"molise.it\0id.us\0for.one\0" -"allstate\0yokohama\0" -"gallo\0" -"natural.bo\0football\0" -"edu.al\0*.on-rancher.cloud\0" -"yonabaru.okinawa.jp\0" -"ro\0remotewd.com\0" -"edu.ba\0" -"edu.ar\0edu.bb\0sa\0karacol.su\0" -"sb\0" -"rs\0sc\0copro.uk\0" -"edu.au\0sd\0\xd7\xa7\xd7\x95\xd7\x9d\0" -"ru\0se\0wales\0nh-serv.co.uk\0" -"edu.bh\0rw\0sg\0kpn\0zsew.ru\0" -"edu.bi\0sh\0tours\0" -"edu.az\0turystyka.pl\0si\0" -"loyalist.museum\0sj\0" -"sk\0" -"edu.bm\0sl\0" -"edu.bn\0campidano-medio.it\0sm\0" -"edu.bo\0abiko.chiba.jp\0sn\0" -"so\0" -"edu.br\0" -"edu.bs\0sr\0from-ar.com\0" -"edu.bt\0ss\0tc\0" -"ulvik.no\0st\0td\0" -"su\0" -"narita.chiba.jp\0lubin.pl\0sv\0tf\0\xeb\x8b\xb7\xec\xbb\xb4\0" -"tg\0" -"edu.ci\0lakas.hu\0hamatonbetsu.hokkaido.jp\0judaica.museum\0sx\0th\0free\0" -"edu.bz\0sy\0" -"mil.ac\0sz\0tj\0" -"tk\0" -"mil.ae\0tl\0" -"edu.cn\0tozsde.hu\0tm\0krd\0lat\0" -"edu.co\0tn\0" -"oizumi.gunma.jp\0to\0" -"law\0" -"ua\0" -"tomika.gifu.jp\0tr\0" -"mil.al\0" -"edu.cu\0tt\0drive\0" -"per.la\0" -"edu.cw\0tv\0" -"tw\0ug\0" -"mil.ba\0" -"mil.ar\0" -"tz\0vuelos\0" -"uk\0" -"exchange.aero\0edu.dm\0shizukuishi.iwate.jp\0\xd9\x85\xd9\x88\xd9\x82\xd8\xb9\0s3.dualstack.us-east-1.amazonaws.com\0" -"mashike.hokkaido.jp\0is-a-cubicle-slave.com\0githubusercontent.com\0" -"edu.do\0nishi.fukuoka.jp\0" -"mil.az\0va\0" -"edu.ec\0user.aseinet.ne.jp\0" -"kira.aichi.jp\0detroit.museum\0us\0vc\0" -"edu.ee\0dedyn.io\0" -"lib.sc.us\0ve\0" -"mil.bo\0edu.eg\0tarui.gifu.jp\0" +"kawanishi.nara.jp\0" +"sodegaura.chiba.jp\0" +"edu.ac\0sdn.gov.pl\0android\0" +"agro.bo\0surrey.museum\0" +"edu.af\0" +"noda.chiba.jp\0" +"re\0" +"se.leg.br\0" +"yachiyo.ibaraki.jp\0hu.com\0" +"edu.al\0pioneer\0" +"genoa.it\0" +"nico\0" +"gc.ca\0" +"edu.ba\0agrar.hu\0" +"edu.ar\0edu.bb\0" +"sologne.museum\0ro\0pr.us\0" +"*.bd\0nagatoro.saitama.jp\0" +"edu.au\0sa\0" +"yashio.saitama.jp\0sb\0aarp\0" +"rs\0sc\0golffan.us\0" +"edu.bh\0br.it\0cb.it\0mutsuzawa.chiba.jp\0sd\0\xd0\xbe\xd0\xb4.\xd1\x81\xd1\x80\xd0\xb1\0" +"edu.bi\0ru\0se\0" +"edu.az\0" +"rw\0sg\0cloudapps.digital\0" +"katsuura.chiba.jp\0sh\0llc\0" +"edu.bm\0gs.bu.no\0si\0" +"edu.bn\0sj\0" +"edu.bo\0sk\0" +"sl\0barefoot\0" +"ms.it\0sm\0" +"edu.br\0sn\0" +"edu.bs\0so\0" +"edu.bt\0j\xc3\xb8rpeland.no\0" +"travel.tt\0" +"sr\0" +"ss\0tc\0" +"st\0td\0lego\0" +"edu.ci\0su\0llp\0adobeaemcloud.com\0" +"edu.bz\0sv\0tf\0" +"*.ck\0tg\0" +"sx\0th\0" +"sy\0" +"edu.cn\0sz\0tj\0" +"edu.co\0tk\0servebbs.com\0" +"tl\0" +"malatvuopmi.no\0tm\0weather\0" +"ichikawamisato.yamanashi.jp\0tvedestrand.no\0tn\0" +"to\0s3-us-gov-west-1.amazonaws.com\0" +"trentin-suedtirol.it\0ina.ibaraki.jp\0" +"edu.cu\0iyo.ehime.jp\0ua\0blogspot.co.at\0" +"tr\0wanggou\0" +"edu.cw\0onojo.fukuoka.jp\0simple-url.com\0" +"sakae.chiba.jp\0tt\0" +"tv\0" +"tw\0ug\0cern\0" +"inatsuki.fukuoka.jp\0" +"edu.dm\0" +"tz\0" +"edu.do\0ms.kr\0uk\0" +"yachiyo.chiba.jp\0iida.nagano.jp\0" +"plc.uk\0farmers\0" +"ibaraki.ibaraki.jp\0" +"edu.ec\0honjo.saitama.jp\0" +"edu.ee\0va\0" +"edu.eg\0us\0vc\0" +"ve\0" +"nl.ca\0edu.dz\0" "vg\0" -"lib.nv.us\0school\0" -"mil.br\0edu.dz\0uy\0vi\0" -"ac.ae\0uz\0tiffany\0service.gov.uk\0" -"of.je\0" -"valer.ostfold.no\0" -"karasuyama.tochigi.jp\0nic.tj\0vn\0" -"uvic.museum\0" -"mil.by\0osteroy.no\0rybnik.pl\0" -"edu.es\0" -"mil.cl\0edu.et\0" -"bg.it\0ngo.lk\0" -"mil.cn\0vu\0" -"mil.co\0wf\0" -"globo\0" -"ac.at\0" -"ac.be\0per.nf\0*.on-k3s.io\0" -"nyc.mn\0" -"edu.fm\0lds\0" -"nb.ca\0" -"naturalhistory.museum\0" -"nhs.uk\0" -"agematsu.nagano.jp\0kazimierz-dolny.pl\0" -"edu.gd\0ws\0servepics.com\0" -"edu.ge\0" -"mil.do\0" +"dnsking.ch\0" +"urn.arpa\0namegawa.saitama.jp\0uy\0vi\0" +"uz\0" +"gjerstad.no\0" +"pl.eu.org\0navoi.su\0" +"*.er\0vn\0intuit\0nl.ci\0" +"edu.es\0google\0" +"edu.et\0fermo.it\0bato.tochigi.jp\0game-host.org\0" +"lol\0" +"govt.nz\0br.com\0" +"vu\0s3.dualstack.ap-south-1.amazonaws.com\0" +"daejeon.kr\0wf\0plus\0" +"*.fk\0anan.tokushima.jp\0investments\0" +"edu.fm\0systems\0" +"nagareyama.chiba.jp\0" +"shiiba.miyazaki.jp\0afamilycompany\0" +"ba.leg.br\0" +"edu.gd\0samegawa.fukushima.jp\0psp.gov.pl\0" +"edu.ge\0salzburg.museum\0lpl\0" +"ws\0" "edu.gh\0" "edu.gi\0" -"tysfjord.no\0" -"mil.ec\0kawaminami.miyazaki.jp\0" -"edu.gl\0" -"edu.gn\0ca.eu.org\0" -"ac.ci\0mil.eg\0" -"edu.gp\0" -"ngo.ng\0" -"edu.gr\0" -"trust.museum\0" -"ac.cn\0edu.gt\0" -"edu.gu\0" -"ye\0virtueeldomein.nl\0" -"ac.cr\0essex.museum\0bykle.no\0" -"edu.gy\0lifestyle\0" -"edu.hk\0" -"gunma.jp\0" -"nakadomari.aomori.jp\0sagae.yamagata.jp\0ck.ua\0" -"edu.hn\0monza-e-della-brianza.it\0gbiz\0" -"ac.cy\0mel\xc3\xb8y.no\0porsanger.no\0from-az.net\0" -"mil.fj\0selfip.com\0" -"edu.ht\0" -"yt\0" -"lab.ms\0us.platform.sh\0" -"yamada.iwate.jp\0" -"\xd8\xa7\xdb\x8c\xd8\xb1\xd8\xa7\xd9\x86.ir\0" -"obihiro.hokkaido.jp\0" -"mil.ge\0" -"edu.in\0zm\0" -"texas.museum\0" -"mil.gh\0bushey.museum\0app.render.com\0" -"edu.iq\0kusatsu.gunma.jp\0" -"ngo.ph\0adobeaemcloud.net\0" -"edu.is\0singles\0" -"edu.it\0" -"supply\0" -"rennesoy.no\0" -"of.no\0" -"zw\0" -"hachirogata.akita.jp\0nakamichi.yamanashi.jp\0" -"mibu.tochigi.jp\0bar2.net\0" -"furano.hokkaido.jp\0" -"mil.gt\0" -"games\0" -"edu.jo\0" -"ac.fj\0" -"ichinomiya.aichi.jp\0rahkkeravju.no\0health\0" -"yugawa.fukushima.jp\0tokushima.tokushima.jp\0" -"mil.hn\0h.se\0nic.za\0" -"edu.kg\0jefferson.museum\0" -"name.hr\0edu.ki\0" -"cesena-forli.it\0ferrari\0" -"mil.id\0ooshika.nagano.jp\0per.sg\0nflfan.org\0" -"edu.km\0paroch.k12.ma.us\0bnpparibas\0" -"\xe5\xa4\xa7\xe9\x98\xaa.jp\0edu.kn\0" -"podhale.pl\0finance\0marine.ru\0" -"shingu.wakayama.jp\0edu.kp\0" -"edu.la\0winb.gov.pl\0sp.leg.br\0" -"edu.lb\0eu-4.evennode.com\0" -"edu.lc\0ens.tn\0" -"ac.gn\0\xd8\xa8\xd8\xa7\xd8\xb1\xd8\xaa\0docs\0" -"mil.in\0servegame.com\0" -"edu.kw\0" -"taiki.hokkaido.jp\0" -"mil.iq\0edu.ky\0" -"tomakomai.hokkaido.jp\0edu.kz\0gleeze.com\0" -"name.et\0edu.lk\0" -"sodegaura.chiba.jp\0" -"name.fj\0karumai.iwate.jp\0" -"bmd.br\0edu.lr\0dst.mi.us\0isteingeek.de\0" -"edu.ls\0\xe5\x95\x86\xe6\xa0\x87\0" -"edu.me\0" -"\xe5\xb1\xb1\xe5\xbd\xa2.jp\0inami.wakayama.jp\0edu.lv\0" -"mil.jo\0edu.mg\0lima-city.rocks\0" -"munakata.fukuoka.jp\0\xd1\x81\xd0\xbe\xd1\x87\xd0\xb8.\xd1\x80\xd1\x83\xd1\x81\0" -"edu.ly\0kvinesdal.no\0" -"ac.id\0" -"edu.mk\0" -"edu.ml\0" -"taketa.oita.jp\0nikko.tochigi.jp\0llc\0" -"rg.it\0edu.mn\0lib.nj.us\0cisco\0cd.eu.org\0" -"ibaraki.ibaraki.jp\0mil.kg\0edu.mo\0" -"lib.ia.us\0google\0" -"ac.il\0markets\0" -"ac.im\0ukiha.fukuoka.jp\0gamo.shiga.jp\0edu.ms\0" -"ac.in\0bulsan-s\xc3\xbc""dtirol.it\0im.it\0edu.mt\0" -"mil.km\0page\0" -"edu.mv\0" -"edu.mw\0edu.ng\0lib.ak.us\0read\0dattolocal.net\0" -"ac.ir\0edu.mx\0chernihiv.ua\0ddnsking.com\0" -"edu.my\0edu.ni\0" -"mil.kr\0edu.mz\0llp\0" -"arboretum.museum\0" -"kin.okinawa.jp\0" -"app.os.stg.fedoraproject.org\0" -"qc.ca\0name.cy\0" -"atsuma.hokkaido.jp\0" -"mil.kz\0historical.museum\0edu.nr\0" -"hinohara.tokyo.jp\0" -"ac.jp\0col.ng\0" -"kunst.museum\0dnshome.de\0" -"campinas.br\0uruma.okinawa.jp\0" -"ac.ke\0" -"h\xc3\xb8yanger.no\0" -"trentinoa-adige.it\0edu.om\0" -"name.eg\0kasaoka.okayama.jp\0mil.lv\0" -"mil.mg\0" -"ln.cn\0tochigi.jp\0" -"contemporary.museum\0edu.pa\0" -"nagiso.nagano.jp\0sortland.no\0eu-3.evennode.com\0" -"hi.cn\0kutchan.hokkaido.jp\0" -"theworkpc.com\0" -"edu.pe\0weatherchannel\0" -"berlevag.no\0edu.pf\0" -"rollag.no\0banamex\0" -"tenei.fukushima.jp\0ac.kr\0edu.ph\0um.gov.pl\0cloudcontrolapp.com\0" -"cnpy.gdn\0" -"kure.hiroshima.jp\0edu.pk\0" -"edu.pl\0" -"broker.aero\0" -"yokawa.hyogo.jp\0mil.mv\0edu.pn\0c66.me\0" -"mil.ng\0" -"name.az\0ac.lk\0mil.my\0mil.ni\0edu.qa\0" -"mil.mz\0edu.pr\0anquan\0republican\0" -"edu.ps\0" -"edu.pt\0" -"ama.aichi.jp\0lol\0" -"ac.ma\0mil.no\0" -"rovigo.it\0ac.ls\0edu.py\0" -"ac.me\0jfk.museum\0scotland.museum\0\xc3\xb8rskog.no\0nv.us\0" -"itami.hyogo.jp\0" -"fl.us\0" -"mil.nz\0" -"kiwi\0" -"custom.metacentrum.cz\0" -"lpl\0dnsalias.com\0github.io\0fi.cloudplatform.fi\0" -"qld.au\0" -"bahcavuotna.no\0cc.vi.us\0" -"tas.gov.au\0karelia.su\0" -"ac.mu\0" -"mr.no\0" -"ac.mw\0mil.pe\0" -"cc.mo.us\0" -"ac.ni\0" -"hidaka.saitama.jp\0ac.mz\0mil.ph\0" -"edu.sa\0" -"edu.sb\0\xe0\xa4\xa8\xe0\xa5\x87\xe0\xa4\x9f\0" -"edu.rs\0edu.sc\0" -"q.bg\0mil.pl\0edu.sd\0" -"edu.ru\0" -"draydns.de\0" -"edu.sg\0" -"padova.it\0man\0geekgalaxy.com\0" -"imakane.hokkaido.jp\0mil.qa\0feedback\0" -"map\0" -"miyota.nagano.jp\0ngo.za\0mba\0" -"edu.sl\0" -"edu.sn\0" -"edu.so\0" -"ac.nz\0" -"kanzaki.saga.jp\0mil.py\0" -"eu-2.evennode.com\0" -"edu.ss\0" -"rad\xc3\xb8y.no\0edu.st\0" -"tokigawa.saitama.jp\0" -"edu.sv\0" -"ac.pa\0events\0tiaa\0" -"us.gov.pl\0" -"edu.sy\0" -"edu.tj\0telebit.app\0" -"edu.tm\0" -"arvo.network\0" -"edu.to\0" -"edu.ua\0" -"edu.tr\0jele.io\0" -"hikawa.shimane.jp\0edu.tt\0" -"edu.tw\0" -"ac.pr\0cooking\0firebaseapp.com\0" -"minnesota.museum\0paleo.museum\0" -"lundbeck\0" -"quicksytes.com\0" -"mil.ru\0" -"morena.br\0towada.aomori.jp\0l\xc3\xb8renskog.no\0ltd\0" -"mil.rw\0" -"mil.sh\0study\0" -"nowruz\0" -"computer\0" -"edu.vc\0" -"\xe4\xbd\x9b\xe5\xb1\xb1\0s3-website-ap-southeast-1.amazonaws.com\0" -"edu.ve\0" -"pordenone.it\0lib.gu.us\0" -"kristiansund.no\0folionetwork.site\0" -"edu.uy\0" -"sand\xc3\xb8y.no\0airbus\0" -"ct.it\0mil.st\0" -"service.one\0" -"edu.vn\0med\0" -"dattorelay.com\0" -"mil.sy\0" -"mil.tj\0" -"nakama.fukuoka.jp\0" -"mil.tm\0edu.vu\0b.ssl.fastly.net\0" -"oto.fukuoka.jp\0" -"bonn.museum\0mil.to\0reit\0" -"coastaldefence.museum\0men\0" -"ac.rs\0" -"oamishirasato.chiba.jp\0kvam.no\0mil.tr\0" -"ac.se\0ac.ru\0" -"shirakawa.fukushima.jp\0" -"kawai.iwate.jp\0ac.rw\0" -"mil.tw\0" -"mil.tz\0eu-1.evennode.com\0" -"edu.ws\0" -"sado.niigata.jp\0" -"\xe3\x82\xb3\xe3\x83\xa0\0" -"nakamura.kochi.jp\0montreal.museum\0" -"engineering\0" -"s\xc3\xb8r-odal.no\0brussels\0" -"elk.pl\0mil.vc\0" -"iki.nagasaki.jp\0" -"mil.ve\0" -"ac.th\0" -"ac.sz\0ac.tj\0" -"mil.uy\0" -"jls-sto1.elastx.net\0" -"loabat.no\0edu.ye\0" -"sakyo.kyoto.jp\0toyonaka.osaka.jp\0" -"fukumitsu.toyama.jp\0hembygdsforbund.museum\0" -"muncie.museum\0" -"ac.ug\0" -"mill.museum\0" -"hayashima.okayama.jp\0" -"ac.tz\0" -"wa.gov.au\0ac.uk\0edu.za\0" -"pars\0eu-west-3.elasticbeanstalk.com\0" -"t3l3p0rt.net\0" -"it1.eur.aruba.jenv-aruba.cloud\0" -"joyo.kyoto.jp\0" -"matsushima.miyagi.jp\0kainan.wakayama.jp\0" -"praxi\0" -"edu.zm\0xnbay.com\0" -"lombardia.it\0konan.aichi.jp\0" -"johana.toyama.jp\0kerrylogistics\0" -"scientist.aero\0broadway\0dyndns-mail.com\0" -"ac.vn\0" -"shibuya.tokyo.jp\0mil\0" -"fastblog.net\0" -"cyon.link\0" -"asmatart.museum\0" -"fukaya.saitama.jp\0mil.ye\0" -"mit\0" -"kanie.aichi.jp\0" -"toki.gifu.jp\0" -"rent\0" -"alt.za\0" -"\xe0\xb8\xa8\xe0\xb8\xb6\xe0\xb8\x81\xe0\xb8\xa9\xe0\xb8\xb2.\xe0\xb9\x84\xe0\xb8\x97\xe0\xb8\xa2\0mil.za\0" -"ddnss.de\0" -"nakanojo.gunma.jp\0" -"accenture\0" -"n\xc3\xa5\xc3\xa5mesjevuemie.no\0" -"theater\0readmyblog.org\0" -"*.uberspace.de\0" -"etajima.hiroshima.jp\0kamaishi.iwate.jp\0familyds.com\0" -"name.vn\0mil.zm\0paas.datacenter.fi\0" -"workinggroup.aero\0s\xc3\xb8ndre-land.no\0" -"tottori.jp\0svizzera.museum\0" -"digital\0" -"miyako.iwate.jp\0" -"nakijin.okinawa.jp\0" -"mlb\0" -"space.museum\0" -"maibara.shiga.jp\0" -"mil.zw\0" -"gs.ol.no\0" -"artcenter.museum\0shiksha\0" -"campania.it\0" -"vindafjord.no\0ac.za\0" -"12hp.de\0" -"hasuda.saitama.jp\0osen.no\0" -"mma\0" -"git-repos.de\0" -"mls\0" -"ge.it\0uchinomi.kagawa.jp\0" -"kani.gifu.jp\0" -"nagato.yamaguchi.jp\0name.tj\0" -"koto.shiga.jp\0marburg.museum\0\xc3\xb8stre-toten.no\0golffan.us\0" -"kawaue.gifu.jp\0kamisu.ibaraki.jp\0ac.zm\0" -"ringsaker.no\0" -"we.bs\0" -"dyndns.tv\0" -"shinkamigoto.nagasaki.jp\0name.tr\0" -"name.tt\0" -"ac.zw\0" -"\xc4\x8d\xc3\xa1hcesuolo.no\0boats\0" -"tur.ar\0mizusawa.iwate.jp\0" -"manchester.museum\0dyndns-at-work.com\0" -"12hp.at\0" -"kitanakagusuku.okinawa.jp\0" -"cust.retrosnub.co.uk\0" -"ogaki.gifu.jp\0" -"tennis\0here-for-more.info\0" -"mer\xc3\xa5ker.no\0moe\0" -"act.edu.au\0\xe9\x9d\x99\xe5\xb2\xa1.jp\0fuso.aichi.jp\0" -"psp.gov.pl\0" -"moi\0" -"tur.br\0" -"lucca.it\0blog\0" -"sic.it\0" -"kr\xc3\xa5""anghke.no\0kep.tr\0mom\0rest\0" -"shichikashuku.miyagi.jp\0" -"gotdns.com\0" -"vads\xc3\xb8.no\0""12hp.ch\0" -"asti.it\0" -"feste-ip.net\0" -"tx.us\0" -"mov\0" -"muni.il\0ohda.shimane.jp\0mazowsze.pl\0" -"toho.fukuoka.jp\0dyndns.ws\0" -"shimada.shizuoka.jp\0funahashi.toyama.jp\0" -"society.museum\0hi.us\0" -"rifu.miyagi.jp\0" -"ct.us\0" -"nab\0" -"takamori.nagano.jp\0" -"cc.wv.us\0" -"st.no\0" -"shimane.jp\0citic\0" -"sakurai.nara.jp\0" -"reklam.hu\0\xe6\x84\x9b\xe7\x9f\xa5.jp\0aurland.no\0" -"trentino.it\0mobi\0" -"iijima.nagano.jp\0direct.quickconnect.to\0" -"name.qa\0" -"name.pr\0" -"flora.no\0" -"nba\0s3-website.ap-northeast-2.amazonaws.com\0" -"fortworth.museum\0\xe6\xb8\xb8\xe6\x88\x8f\0" -"matsubushi.saitama.jp\0" -"sld.do\0" -"insure\0s3-ap-southeast-1.amazonaws.com\0" -"name.na\0" -"yachiyo.ibaraki.jp\0tips\0my-vigor.de\0" -"\xe0\xb9\x84\xe0\xb8\x97\xe0\xb8\xa2\0" -"moareke.no\0bloger.id\0" -"office-on-the.net\0demo.jelastic.com\0" -"name.mv\0" -"name.ng\0moda\0msd\0" -"name.my\0" -"hirosaki.aomori.jp\0fr\xc3\xb8ya.no\0" -"cranbrook.museum\0" -"gyokuto.kumamoto.jp\0" -"eun.eg\0" -"ch.eu.org\0" -"barletta-trani-andria.it\0" -"jogasz.hu\0tamatsukuri.ibaraki.jp\0ny-2.paas.massivegrid.net\0" -"lib.wi.us\0" -"s3.dualstack.ap-northeast-2.amazonaws.com\0" -"mattel\0mtn\0" -"lib.ms.us\0lib.nc.us\0" -"mtr\0*.svc.firenet.ch\0" -"nec\0" -"r\xc3\xb8mskog.no\0" -"bearalvahki.no\0" -"ogata.akita.jp\0" -"blue\0" -"al.it\0marshalls\0" -"tsukiyono.gunma.jp\0from-fl.com\0" -"furubira.hokkaido.jp\0" -"synology-ds.de\0" -"nagasaki.jp\0" -"net\0" -"humanities.museum\0" -"sakawa.kochi.jp\0new\0" -"name.mk\0" -"americana.museum\0gda.pl\0" -"nfl\0" -"stavanger.no\0caseih\0" -"koriyama.fukushima.jp\0" -"cymru\0" -"tomioka.gunma.jp\0sykkylven.no\0" -"snaase.no\0" -"uki.kumamoto.jp\0storfjord.no\0" -"redumbrella\0tempurl.host\0" -"\xe0\xb8\xad\xe0\xb8\x87\xe0\xb8\x84\xe0\xb9\x8c\xe0\xb8\x81\xe0\xb8\xa3.\xe0\xb9\x84\xe0\xb8\x97\xe0\xb8\xa2\0mycloud.by\0" -"abbvie\0" -"e164.arpa\0" -"name.jo\0miyako.fukuoka.jp\0miyazaki.miyazaki.jp\0taira.toyama.jp\0ventures\0*.cns.joyent.com\0" -"iiyama.nagano.jp\0" -"fukui.jp\0" -"ngo\0" -"public.museum\0" -"union.aero\0denmark.museum\0" -"telekommunikation.museum\0" -"wy.us\0to.leg.br\0" -"circus.museum\0" -"nhk\0" -"barsy.co.uk\0" -"salud.bo\0" -"noticias.bo\0shingu.fukuoka.jp\0\xe6\x9c\xba\xe6\x9e\x84\0" -"miyoshi.aichi.jp\0" -"travelers\0" -"amsw.nl\0" -"ishinomaki.miyagi.jp\0" -"swiss\0" -"huissier-justice.fr\0" -"kushima.miyazaki.jp\0" -"pug.it\0" -"amfam\0" -"pccw\0" -"tagajo.miyagi.jp\0" -"onagawa.miyagi.jp\0" -"cc.nh.us\0" -"localhistory.museum\0" -"mosvik.no\0yali.mythic-beasts.com\0" -"joso.ibaraki.jp\0" -"sanok.pl\0k12.va.us\0" -"inazawa.aichi.jp\0circle\0" -"z.bg\0" -"al.no\0" -"cloudjiffy.net\0" -"5.bg\0forli-cesena.it\0" -"on-web.fr\0" -"shimizu.hokkaido.jp\0shonai.yamagata.jp\0myqnapcloud.com\0" -"basilicata.it\0ozora.hokkaido.jp\0tokamachi.niigata.jp\0" -"gen.mi.us\0adygeya.su\0basicserver.io\0" -"volda.no\0reg.dk\0" -"\xe7\x9f\xb3\xe5\xb7\x9d.jp\0bplaced.de\0" -"nichinan.miyazaki.jp\0gmail\0" -"fujiyoshida.yamanashi.jp\0" -"utwente.io\0" -"from-wi.com\0" -"m\xc3\xa5s\xc3\xb8y.no\0at.eu.org\0" -"dyndns.ddnss.de\0" -"is-an-actor.com\0\xd0\xbc\xd1\x81\xd0\xba.\xd1\x80\xd1\x83\xd1\x81\0" -"rochester.museum\0gol.no\0lier.no\0" -"izumi.kagoshima.jp\0nord-odal.no\0" -"mitake.gifu.jp\0" -"toyako.hokkaido.jp\0skedsmokorset.no\0ic.gov.pl\0" -"small-web.org\0" -"arendal.no\0" -"sakado.saitama.jp\0\xc3\xa5s.no\0" -"topology.museum\0" -"va.it\0" -"rishirifuji.hokkaido.jp\0" -"s3.dualstack.ca-central-1.amazonaws.com\0" -"aju.br\0warabi.saitama.jp\0olecko.pl\0hangout\0" -"from-il.com\0" -"*.nom.br\0" -"sld.pa\0graphics\0" -"shiiba.miyazaki.jp\0nagai.yamagata.jp\0yandex\0" -"shimotsuma.ibaraki.jp\0" -"samsclub\0" -"takatsuki.shiga.jp\0" -"adygeya.ru\0" -"vic.au\0" -"uzs.gov.pl\0" -"modalen.no\0lynx.mythic-beasts.com\0" -"calvinklein\0we.tc\0community-pro.net\0" -"lowicz.pl\0" -"eu.meteorapp.com\0" -"platterp.us\0" -"scholarships\0pimienta.org\0" -"safety.aero\0" -"theatre\0" -"tm.cy\0viterbo.it\0" -"akaiwa.okayama.jp\0travelersinsurance\0" -"lebork.pl\0" -"gen.in\0" -"andria-barletta-trani.it\0run.app\0" -"now\0" -"*.stolos.io\0" -"mad.museum\0cloud66.zone\0" -"fidelity\0" -"tm.dz\0autos\0wbq.me\0" -"ibigawa.gifu.jp\0" -"cleverapps.io\0" -"ena.gifu.jp\0turek.pl\0" -"marketing\0" -"sennan.osaka.jp\0pruszkow.pl\0edu.krd\0" -"seg.br\0" -"al.us\0" -"is-very-nice.org\0dynvpn.de\0" -"va.no\0" -"asaminami.hiroshima.jp\0" -"miho.ibaraki.jp\0bellevue.museum\0" -"nra\0" -"saltdal.no\0click\0" -"tm.fr\0cc.md.us\0" -"\xd0\xbc\xd0\xb8\xd1\x80.\xd1\x80\xd1\x83\xd1\x81\0" -"guovdageaidnu.no\0" -"pro.az\0obi\0" -"f.bg\0" -"art.museum\0k12.pr.us\0from-me.org\0" -"myddns.rocks\0" -"pro.br\0rnu.tn\0" -"trentino-aadige.it\0" -"matsuzaki.shizuoka.jp\0elvendrell.museum\0ostre-toten.no\0" -"nrw\0" -"fuossko.no\0" -"weather\0" -"hol.no\0" -"moto\0" -"32-b.it\0" -"muosat.no\0ae.org\0""2038.io\0" -"lexus\0" -"pro.cy\0tm.hu\0trapani.it\0blogspot.com\0" -"hirata.fukushima.jp\0" -"center.museum\0lur\xc3\xb8y.no\0gen.ng\0" -"christiansburg.museum\0" -"minamiawaji.hyogo.jp\0" -"pro.ec\0kihoku.ehime.jp\0" -"ntt\0" -"kitagata.gifu.jp\0" -"chase\0" -"vibo-valentia.it\0" -"milan.it\0fujieda.shizuoka.jp\0sport\0" -"equipment\0" -"lc.it\0" -"mat.br\0gen.nz\0kaufen\0" -"nt.au\0neyagawa.osaka.jp\0" -"ci.it\0kaizuka.osaka.jp\0" -"off\0mangyshlak.su\0" -"expert\0" -"tokai.aichi.jp\0" -"deporte.bo\0pro.fj\0" -"nt.ca\0*.advisor.ws\0be.ax\0" -"tm.km\0" -"es.gov.br\0pvt.ge\0giving\0" -"heguri.nara.jp\0" -"cloudycluster.net\0" -"berlev\xc3\xa5g.no\0" -"sande.more-og-romsdal.no\0" -"bc.platform.sh\0" -"fj.cn\0county.museum\0" -"oseto.nagasaki.jp\0preservation.museum\0" -"skaun.no\0" -"gonohe.aomori.jp\0nakatane.kagoshima.jp\0" -"hatoyama.saitama.jp\0tm.mc\0ownprovider.com\0" -"tm.mg\0" -"kharkiv.ua\0zhytomyr.ua\0" -"ip6.arpa\0" -"\xe5\x8d\x83\xe8\x91\x89.jp\0" -"vald-aosta.it\0national.museum\0barum.no\0" -"va.us\0" -"pro.ht\0nyc\0" -"nissan\0" -"nishihara.okinawa.jp\0" -"aosta.it\0grandrapids.museum\0" -"karasjok.no\0" -"sener\0" -"oji.nara.jp\0" -"matsuno.ehime.jp\0l\xc3\xb8ten.no\0" -"nissay\0" -"mihara.kochi.jp\0tm.no\0" -"ismaili\0" -"frogn.no\0fnwk.site\0dyn.ddnss.de\0" -"virginia.museum\0taipei\0" -"far.br\0" -"fund\0" -"okinawa.okinawa.jp\0skjak.no\0" -"rome.it\0" -"sdn.gov.pl\0" -"z.se\0" -"notogawa.shiga.jp\0gen.tr\0" -"joetsu.niigata.jp\0" -"stj\xc3\xb8rdalshalsen.no\0\xe9\xa6\x99\xe6\xa0\xbc\xe9\x87\x8c\xe6\x8b\x89\0" -"tcm.museum\0" -"seihi.nagasaki.jp\0gent\0" -"tm.pl\0" -"trentinosuedtirol.it\0tobetsu.hokkaido.jp\0" -"*.awdev.ca\0" -"capetown\0" -"atlanta.museum\0mmafan.biz\0" -"s3-fips-us-gov-west-1.amazonaws.com\0balashov.su\0" -"restaurant\0" -"zagan.pl\0" -"kamagaya.chiba.jp\0sharp\0" -"be.gy\0" -"definima.net\0" -"mjondalen.no\0" -"rocks\0" -"reliance\0" -"gs.sf.no\0" -"bygland.no\0" -"nagaoka.niigata.jp\0" -"myforum.community\0" -"si.it\0lib.oh.us\0" -"pro.na\0" -"tm.ro\0naturbruksgymn.se\0oncilla.mythic-beasts.com\0*.sys.qcx.io\0" -"au.eu.org\0be.eu.org\0" -"aostavalley.it\0linz.museum\0pro.mv\0one\0" -"usa.oita.jp\0levanger.no\0" -"ikeda.hokkaido.jp\0ong\0" -"tm.se\0" -"ox.rs\0" -"przeworsk.pl\0" -"chitose.hokkaido.jp\0onl\0" -"tomobe.ibaraki.jp\0usuki.oita.jp\0analytics\0" -"matsue.shimane.jp\0" -"mp.br\0tokuyama.yamaguchi.jp\0hzc.io\0" -"*.compute.amazonaws.com.cn\0damnserver.com\0" -"kids.us\0" -"maintenance.aero\0" -"creditcard\0" -"barsy.me\0" -"fedje.no\0" -"pro.om\0" -"nishiawakura.okayama.jp\0ooo\0" -"ibaraki.jp\0akkeshi.hokkaido.jp\0" -"maison\0" -"\xe7\xa7\x8b\xe7\x94\xb0.jp\0obama.nagasaki.jp\0hagi.yamaguchi.jp\0troitsk.su\0wien.funkfeuer.at\0" -"stargard.pl\0" -"bostik\0" -"g.vbrplsbx.io\0" -"us-east-2.elasticbeanstalk.com\0" -"gifu.gifu.jp\0ks.ua\0" -"azerbaijan.su\0" -"westus2.azurestaticapps.net\0" -"hjartdal.no\0" -"pro.pr\0" -"\xe5\xbe\xae\xe5\x8d\x9a\0" -"enna.it\0goodyear\0" -"association.aero\0consulting.aero\0ks.us\0" -"jewelry.museum\0bridgestone\0" -"wakasa.fukui.jp\0" -"maceio.br\0ryd.wafaicloud.com\0" -"tado.mie.jp\0" -"\xe0\xb4\xad\xe0\xb4\xbe\xe0\xb4\xb0\xe0\xb4\xa4\xe0\xb4\x82\0motorcycles\0okinawa\0\xe5\x98\x89\xe9\x87\x8c\xe5\xa4\xa7\xe9\x85\x92\xe5\xba\x97\0" -"bg.eu.org\0" -"au.cloudswitches.com\0" -"goshiki.hyogo.jp\0org\0" -"pay\0" -"nt.no\0from-wy.com\0" -"rep.br\0" -"itoman.okinawa.jp\0theater.museum\0" -"flt.cloud.muni.cz\0" -"seiyo.ehime.jp\0vanylven.no\0k12.vt.us\0" -"apartments\0" -"halloffame.museum\0is-a-linux-user.org\0" -"okuizumo.shimane.jp\0" -"cc.ar.us\0" -"maizuru.kyoto.jp\0" -"\xe7\xbb\x84\xe7\xbb\x87\xe6\x9c\xba\xe6\x9e\x84\0" -"f.se\0" -"eco.br\0assn.lk\0" -"ppg.br\0izu.shizuoka.jp\0" -"valer.hedmark.no\0" -"with.marketing\0" -"dubai\0" -"mito.ibaraki.jp\0" -"akita.jp\0" -"tanabe.wakayama.jp\0sling\0" -"hanggliding.aero\0nakai.kanagawa.jp\0graz.museum\0" -"in-brb.de\0" -"bryansk.su\0" -"kviteseid.no\0" -"b\xc3\xa1jddar.no\0" -"glass.museum\0pasadena.museum\0" -"\xd8\xa7\xd9\x84\xd8\xb3\xd8\xb9\xd9\x88\xd8\xaf\xdb\x8c\xd8\xa9\0jls-sto2.elastx.net\0now.sh\0" -"shimonita.gunma.jp\0gjerstad.no\0" -"meraker.no\0\xd1\x81\xd0\xb0\xd0\xbc\xd0\xb0\xd1\x80\xd0\xb0.\xd1\x80\xd1\x83\xd1\x81\0" -"frosta.no\0pro.tt\0" -"trentinos\xc3\xbc""d-tirol.it\0vestvagoy.no\0tm.za\0ott\0" -"temp-dns.com\0" -"\xe7\xa6\x8f\xe4\xba\x95.jp\0mysecuritycamera.net\0" -"avocat.fr\0swidnica.pl\0" -"ogawa.nagano.jp\0" -"trentin-sud-tirol.it\0lib.ri.us\0is-leet.com\0from.marketing\0" -"osaka.jp\0kilatiron.com\0" -"tv.bb\0re.it\0realm.cz\0*.transurl.be\0" -"soeda.fukuoka.jp\0" -"matsudo.chiba.jp\0" -"pet\0" -"bofa\0" -"skype\0" -"ovh\0" -"boston\0wpmudev.host\0" -"nt.ro\0collegefan.org\0" -"aso.kumamoto.jp\0blockbuster\0" -"inami.toyama.jp\0" -"yk.ca\0pro.vn\0" -"tv.bo\0rodeo\0" -"tv.br\0\xe9\xab\x98\xe7\x9f\xa5.jp\0ath.cx\0" -"\xe8\x8c\xa8\xe5\x9f\x8e.jp\0tokoname.aichi.jp\0" -"myshopblocks.com\0" -"nishikatsura.yamanashi.jp\0\xe0\xb8\x98\xe0\xb8\xb8\xe0\xb8\xa3\xe0\xb8\x81\xe0\xb8\xb4\xe0\xb8\x88.\xe0\xb9\x84\xe0\xb8\x97\xe0\xb8\xa2\0" -"is-a-player.com\0" -"anan.nagano.jp\0" -"agency\0" -"odawara.kanagawa.jp\0" -"numata.gunma.jp\0chtr.k12.ma.us\0" -"kawakami.nagano.jp\0re.kr\0" -"barsy.uk\0" -"tsuru.yamanashi.jp\0dielddanuorri.no\0" -"kujukuri.chiba.jp\0york.museum\0" -"phd\0hr.eu.org\0" -"hamura.tokyo.jp\0" -"geometre-expert.fr\0from-ak.com\0" -"friuli-venezia-giulia.it\0od.ua\0natura\0" -"shiki.saitama.jp\0" -"fvg.it\0pid\0" -"s3-ap-south-1.amazonaws.com\0" -"arteducation.museum\0foodnetwork\0" -"sologne.museum\0sund.no\0" -"mifune.kumamoto.jp\0sano.tochigi.jp\0" -"kalmykia.su\0*.firenet.ch\0" -"takahama.fukui.jp\0direct\0is-an-artist.com\0" -"shimokitayama.nara.jp\0pin\0" -"*.transurl.eu\0" -"wiih.gov.pl\0" -"american.museum\0" -"co.technology\0" -"toyota.yamaguchi.jp\0ferrero\0" -"higashiizu.shizuoka.jp\0ivano-frankivsk.ua\0mypets.ws\0" -"inashiki.ibaraki.jp\0balsfjord.no\0khakassia.su\0" -"nagoya\0" -"karlsoy.no\0" -"textile.museum\0" -"pors\xc3\xa1\xc5\x8bgu.no\0" -"volvo\0" -"*.bd\0o.bg\0" -"aa.no\0" -"rep.kp\0" -"matsuda.kanagawa.jp\0shiroishi.saga.jp\0" -"sklep.pl\0" -"bungotakada.oita.jp\0" -"gateway.museum\0" -"cust.testing.thingdust.io\0" -"vote\0" -"minakami.gunma.jp\0" -"kitaakita.akita.jp\0name\0webhop.info\0" -"asahi.toyama.jp\0" -"kalmykia.ru\0" -"omachi.saga.jp\0" -"*.ck\0voto\0" -"hobby-site.org\0" -"consulting\0" -"dnipropetrovsk.ua\0" -"\xd0\xbe\xd1\x80\xd0\xb3.\xd1\x81\xd1\x80\xd0\xb1\0" -"oya.to\0" -"ski.no\0" -"tv.im\0" -"alibaba\0" -"art.br\0" -"resistance.museum\0is-a-lawyer.com\0" -"tv.it\0pnc\0" -"rj.leg.br\0" -"bond\0" -"orkdal.no\0overhalla.no\0stord.no\0" -"tomigusuku.okinawa.jp\0" -"hamamatsu.shizuoka.jp\0" -"nishiwaki.hyogo.jp\0watch-and-clock.museum\0" -"cr.it\0shinshiro.aichi.jp\0" -"rich\0" -"nat.tn\0servegame.org\0" -"omiya.saitama.jp\0" -"*.er\0" -"bel.tr\0tv.kg\0" -"durham.museum\0" -"collection.museum\0" -"\xe5\xb2\x90\xe9\x98\x9c.jp\0iwate.iwate.jp\0" -"art.do\0nationalfirearms.museum\0" -"empresa.bo\0saobernardo.br\0gc.ca\0*.fk\0hemnes.no\0" -"riobranco.br\0hanawa.fukushima.jp\0hurdal.no\0book\0" -"sagamihara.kanagawa.jp\0" -"idnblogger.com\0" -"df.leg.br\0" -"chikugo.fukuoka.jp\0impertrix.com\0" -"forl\xc3\xac""cesena.it\0" -"jx.cn\0art.dz\0" -"uz.ua\0" -"chikuma.nagano.jp\0" -"aurskog-h\xc3\xb8land.no\0" -"melhus.no\0" -"qld.edu.au\0bronnoy.no\0" -"williamsburg.museum\0" -"hyundai\0" -"from-ri.com\0" -"boleslawiec.pl\0" -"ggee\0" -"tv.na\0" -"izena.okinawa.jp\0" -"flog.br\0okuma.fukushima.jp\0asahi.mie.jp\0primetel.cloud\0" -"florence.it\0chiyoda.gunma.jp\0" -"*.transurl.nl\0" -"\xd8\xa7\xd9\x84\xd8\xb3\xd8\xb9\xd9\x88\xd8\xaf\xdb\x8c\xdb\x83\0" -"kayabe.hokkaido.jp\0memorial\0ham-radio-op.net\0customer.speedpartner.de\0diskstation.org\0" -"duckdns.org\0" -"pro\0s3.dualstack.ap-south-1.amazonaws.com\0uk.com\0mine.nu\0" -"shimogo.fukushima.jp\0yasugi.shimane.jp\0" -"uto.kumamoto.jp\0" -"sandnessjoen.no\0" -"pru\0" -"herad.no\0cc.ky.us\0vapor.cloud\0" -"kr\xc3\xb8""dsherad.no\0" -"jpmorgan\0" -"enf.br\0" -"cc.co.us\0" -"*.jm\0" -"art.ht\0" -"loab\xc3\xa1t.no\0" -"shiroi.chiba.jp\0" -"vlog.br\0americanart.museum\0" -"yamatotakada.nara.jp\0\xc3\xb8rland.no\0" -"hu.net\0" -"ashiya.hyogo.jp\0*.kh\0press\0" -"kawahara.tottori.jp\0d.gv.vc\0barsy.bg\0" -"csx.cc\0" -"biz.bb\0" -"biz.at\0" -"pub\0" -"mol.it\0" -"westfalen.museum\0" -"takahagi.ibaraki.jp\0barsy.ca\0" -"biz.az\0kashima.ibaraki.jp\0godaddy\0" -"schokoladen.museum\0" -"ogano.saitama.jp\0" -"otaki.nagano.jp\0sakura\0" -"realty\0" -"nationwide\0" -"sr.it\0properties\0" -"tamaki.mie.jp\0" -"barsy.de\0" -"urbinopesaro.it\0navy\0certmgr.org\0" -"it.ao\0" -"*.mm\0" -"hakui.ishikawa.jp\0" -"tv.sd\0pwc\0software\0" -"bn.it\0" -"biz.cy\0trentin-sudtirol.it\0taito.tokyo.jp\0" -"\xe4\xb8\xad\xe4\xbf\xa1\0" -"biz.dk\0" -"brasil.museum\0" -"asnes.no\0scrapping.cc\0" -"jcloud-ver-jpc.ik-server.com\0" -"nyan.to\0" -"pisz.pl\0" -"prd.fr\0" -"*.np\0" -"karaganda.su\0" -"co.events\0" -"gemological.museum\0intelligence.museum\0" -"hapmir.no\0" -"barsy.eu\0" -"pleskns.com\0" -"nanbu.yamanashi.jp\0" -"undersea.museum\0" -"kita.kyoto.jp\0progressive\0" -"1337.pictures\0" -"biz.et\0tsuga.tochigi.jp\0tv.tr\0dynns.com\0" -"sch.ae\0" -"higashiyodogawa.osaka.jp\0gratangen.no\0" -"ma.gov.br\0" -"yabuki.fukushima.jp\0" -"biz.fj\0" -"nerdpol.ovh\0" -"tv.tz\0" -"anani.br\0*.pg\0" -"decorativearts.museum\0gallery.museum\0tokke.no\0cr.ua\0" -"yamagata.yamagata.jp\0" -"tenri.nara.jp\0homeip.net\0" -"mymediapc.net\0" -"tochigi.tochigi.jp\0eu.org\0" -"ostroda.pl\0" -"cherkasy.ua\0s3.ca-central-1.amazonaws.com\0" -"googlecode.com\0co.education\0" -"shiranuka.hokkaido.jp\0" -"yokosuka.kanagawa.jp\0hokuto.yamanashi.jp\0" -"biz.gl\0" -"kyoto.jp\0curv.dev\0" -"amica\0" -"sk\xc3\xa1nit.no\0style\0" -"corsica\0" -"amusement.aero\0" -"ogose.saitama.jp\0science\0" -"toyotsu.fukuoka.jp\0ostrowwlkp.pl\0suwalki.pl\0" -"art.pl\0" -"mymailer.com.tw\0" -"aizumi.tokushima.jp\0sunndal.no\0" -"unazuki.toyama.jp\0cloudcontrolled.com\0" -"biz.id\0" -"k12.ny.us\0" -"clic2000.net\0barsy.in\0" -"togura.nagano.jp\0\xd1\x81\xd0\xb0\xd0\xb9\xd1\x82\0il.eu.org\0barsy.io\0" -"miyoshi.saitama.jp\0o.se\0" -"*.sapporo.jp\0" -"yamatokoriyama.nara.jp\0" -"graphox.us\0" -"kagamiishi.fukushima.jp\0hizen.saga.jp\0" -"shopping\0" -"prd.km\0" -"living\0" -"kuji.iwate.jp\0" -"matsuura.nagasaki.jp\0england.museum\0" -"cloudaccess.net\0" -"newport.museum\0clubmed\0\xe4\xb8\x96\xe7\x95\x8c\0" -"komono.mie.jp\0is-not-certified.com\0" -"pharmaciens.km\0*.futurecms.at\0" -"\xd8\xa7\xd8\xa8\xd9\x88\xd8\xb8\xd8\xa8\xd9\x8a\0njs.jelastic.vps-host.net\0" -"konan.shiga.jp\0" -"vestre-toten.no\0us-east-1.amazonaws.com\0" -"my.id\0paas.leviracloud.eu\0" -"lpages.co\0" -"klodzko.pl\0hu.eu.org\0ie.eu.org\0" -"hatogaya.saitama.jp\0biz.ki\0" -"prd.mg\0rr.leg.br\0" -"vs.it\0" -"4u.com\0" -"art.sn\0" -"rn.it\0lib.ne.us\0" -"nose.osaka.jp\0roma.museum\0" -"agr.br\0" -"wmcloud.org\0" -"tokorozawa.saitama.jp\0" -"latina.it\0tranibarlettaandria.it\0\xc3\xa1laheadju.no\0mortgage\0" -"iwamizawa.hokkaido.jp\0" -"komoro.nagano.jp\0\xeb\x8b\xb7\xeb\x84\xb7\0" -"fujixerox\0" -"biz.ls\0s\xc3\xb8mna.no\0go.dyndns.org\0" -"trento.it\0sukumo.kochi.jp\0" -"tachiarai.fukuoka.jp\0" -"makurazaki.kagoshima.jp\0rs.leg.br\0sc.leg.br\0spdns.eu\0" -"schule\0barsy.online\0" -"\xe6\xbe\xb3\xe9\x96\x80\0" -"santamaria.br\0" -"isehara.kanagawa.jp\0" -"motosu.gifu.jp\0delmenhorst.museum\0" -"dabur\0" -"sch.id\0kadogawa.miyazaki.jp\0myfirewall.org\0" -"ayagawa.kagawa.jp\0" -"biz.mv\0" -"biz.mw\0cloudns.club\0" -"taxi.br\0" -"suedtirol.it\0biz.ni\0" -"\xd0\xbe\xd1\x80\xd0\xb3.\xd1\x80\xd1\x83\xd1\x81\0" -"kusu.oita.jp\0dray-dns.de\0" -"mysecuritycamera.org\0" -"alaheadju.no\0" -"kh.ua\0" -"chikuho.fukuoka.jp\0" -"filatelia.museum\0museum.tt\0" -"suzu.ishikawa.jp\0askim.no\0" -"sch.ir\0biz.nr\0" -"\xe6\xb2\x96\xe7\xb8\x84.jp\0" -"gyeonggi.kr\0" -"!city.sapporo.jp\0skoczow.pl\0" -"wpdevcloud.com\0" -"koge.tottori.jp\0" -"val-d-aosta.it\0sch.jo\0pilots.museum\0xerox\0" -"claims\0app.lmpm.com\0" -"smola.no\0" -"homeftp.org\0" -"kasumigaura.ibaraki.jp\0" -"school.na\0" -"langev\xc3\xa5g.no\0" -"pharmacy\0" -"biz.pk\0" -"tatsuno.hyogo.jp\0biz.pl\0homedepot\0ca-central-1.elasticbeanstalk.com\0" -"agro.bo\0" -"biz.pr\0freedesktop.org\0" -"mulhouse.museum\0tattoo\0" -"cheap\0" -"x.bg\0gotdns.ch\0*.telebit.xyz\0" -"jl.serv.net.mx\0" -"3.bg\0media.hu\0" -"consulado.st\0k12.nm.us\0" -"sch.lk\0storj.farm\0" -"nagano.jp\0nakano.tokyo.jp\0" -"vaksdal.no\0" -"akagi.shimane.jp\0berkeley.museum\0" -"school.nz\0" -"shinjo.yamagata.jp\0franziskaner.museum\0" -"gushikami.okinawa.jp\0mango\0" -"soc.dz\0apigee.io\0" -"red\0" -"fujinomiya.shizuoka.jp\0emb.kw\0" -"sch.ly\0" -"skiptvet.no\0barrell-of-knowledge.info\0" -"yamagata.nagano.jp\0" -"shinichi.hiroshima.jp\0" -"ren\0" -"mordovia.su\0" -"zentsuji.kagawa.jp\0" -"\xd8\xa7\xd9\x8a\xd8\xb1\xd8\xa7\xd9\x86\0" -"qvc\0" -"sch.ng\0" -"wang\0*.ex.futurecms.at\0" -"bauhaus\0rn.leg.br\0spdns.de\0" -"is-a-soxfan.org\0" -"cafe\0" -"bozen-suedtirol.it\0" -"hole.no\0" -"point2this.com\0" -"farsund.no\0" -"lib.pr.us\0" -"biz.ss\0aero.tt\0" -"shimamoto.osaka.jp\0gs.hm.no\0\xe6\xbe\xb3\xe9\x97\xa8\0" -"pz.it\0lib.mi.us\0" -"research.aero\0pol.dz\0grane.no\0" -"lu.it\0me.it\0lib.il.us\0voorloper.cloud\0" -"izumisano.osaka.jp\0biz.tj\0" -"trentins\xc3\xbc""dtirol.it\0lib.dc.us\0" -"karuizawa.nagano.jp\0" -"leczna.pl\0" -"samukawa.kanagawa.jp\0video\0home.dyndns.org\0" -"hamada.shimane.jp\0biz.ua\0" -"biz.tr\0" -"biz.tt\0\xe6\x97\xb6\xe5\xb0\x9a\0" -"aero.mv\0" -"ambulance.aero\0" -"fuettertdasnetz.de\0gr.eu.org\0" -"lyngen.no\0" -"me.ke\0" -"szczecin.pl\0ro.leg.br\0" -"yakumo.shimane.jp\0" -"dnsdojo.org\0ddnslive.com\0" -"lunner.no\0sch.qa\0" -"shibata.miyagi.jp\0takahata.yamagata.jp\0hareid.no\0mordovia.ru\0" -"kartuzy.pl\0" -"lapy.pl\0" -"sandvikcoromant\0vs.mythic-beasts.com\0" -"biz.vn\0" -"akune.kagoshima.jp\0ril\0" -"oe.yamagata.jp\0wolterskluwer\0" -"sassari.it\0from-al.com\0" -"stjordal.no\0rio\0" -"rip\0from-mo.com\0" -"nishikata.tochigi.jp\0duck\0" -"s\xc3\xb8r-fron.no\0" -"vevelstad.no\0" -"us.reclaim.cloud\0" -"avianca\0edu.eu.org\0" -"uri.arpa\0" -"pol.ht\0sch.sa\0" -"museum.mv\0sigdal.no\0" -"museum.mw\0" -"matsusaka.mie.jp\0orkanger.no\0skanit.no\0" -"its.me\0" -"kumenan.okayama.jp\0museum.no\0insurance\0oldnavy\0backplaneapp.io\0" -"sch.so\0" -"drammen.no\0media.pl\0" -"observer\0vladikavkaz.ru\0" -"ascoli-piceno.it\0" -"equipment.aero\0" -"yahaba.iwate.jp\0" -"koeln.museum\0" -"ninohe.iwate.jp\0soc.lk\0casino\0xfinity\0" -"arakawa.saitama.jp\0museum.om\0" -"assisi.museum\0bo.telemark.no\0" -"d.bg\0" -"takayama.gifu.jp\0k12.la.us\0" -"wa.edu.au\0rns.tn\0vladikavkaz.su\0" -"geology.museum\0call\0" -"palace.museum\0skien.no\0industries\0" -"beauty\0" -"alfaromeo\0nv.elastyco.com\0" -"meldal.no\0" -"biz.zm\0frontdoor\0" -"tatebayashi.gunma.jp\0" -"bindal.no\0" -"camp\0" -"australia.museum\0lezajsk.pl\0" -"salangen.no\0" -"kiryu.gunma.jp\0netlify.app\0" -"kakogawa.hyogo.jp\0" -"puglia.it\0nisshin.aichi.jp\0" -"esan.hokkaido.jp\0" -"izumi.osaka.jp\0gallup\0photos\0" -"leikanger.no\0meland.no\0demon.nl\0" -"wanouchi.gifu.jp\0" -"\xd0\xba\xd0\xbe\xd0\xbc\0" -"airforce\0" -"nakayama.yamagata.jp\0" -"himeshima.oita.jp\0" -"alabama.museum\0" -"nannestad.no\0" -"urakawa.hokkaido.jp\0yoita.niigata.jp\0homelinux.com\0" -"cpa.pro\0" -"kaneyama.fukushima.jp\0" -"birthplace.museum\0" -"turin.it\0" -"asaka.saitama.jp\0" -"us.eu.org\0" -"tynset.no\0" -"is-a-hunter.com\0" -"ivanovo.su\0" -"inuyama.aichi.jp\0tsuno.kochi.jp\0muos\xc3\xa1t.no\0" -"augustow.pl\0serveirc.com\0" -"vall\xc3\xa9""edaoste.it\0" -"me.so\0" -"gjesdal.no\0ar.com\0" -"bc.ca\0baltimore.museum\0" -"ullensvang.no\0" -"me.tc\0" -"\xe6\xb7\xa1\xe9\xa9\xac\xe9\x94\xa1\0" -"tires\0africa.com\0" -"juif.museum\0" -"s3-website.eu-west-3.amazonaws.com\0*.azurecontainer.io\0" -"tendo.yamagata.jp\0parti.se\0onred.one\0" -"prochowice.pl\0racing\0" -"inf.br\0kota.aichi.jp\0ikeda.nagano.jp\0\xd8\xa7\xd9\x84\xd9\x85\xd8\xba\xd8\xb1\xd8\xa8\0" -"sap\0" -"cesenaforl\xc3\xac.it\0" -"sas\0" -"nesoddtangen.no\0afamilycompany\0dev.static.land\0" -"kongsvinger.no\0" -"trd.br\0yono.saitama.jp\0" -"\xe9\x95\xb7\xe9\x87\x8e.jp\0fujikawa.shizuoka.jp\0" -"care\0sbi\0" -"sch.zm\0" -"\xe7\xbb\x84\xe7\xb9\x94.hk\0agano.niigata.jp\0newmexico.museum\0me.tz\0" -"me.uk\0" -"convent.museum\0" -"ecologia.bo\0gose.nara.jp\0yosemite.museum\0czest.pl\0neko.am\0" -"stockholm.museum\0sca\0" -"inf.cu\0scb\0" -"sbs\0" -"me.us\0" -"ogasawara.tokyo.jp\0\xe0\xae\x87\xe0\xae\xa8\xe0\xaf\x8d\xe0\xae\xa4\xe0\xae\xbf\xe0\xae\xaf\xe0\xae\xbe\0casa\0" -"kagoshima.kagoshima.jp\0cars\0politie\0servemp3.com\0" -"nes.akershus.no\0" -"trentinsuedtirol.it\0keisen.fukuoka.jp\0case\0" -"cash\0" -"s3-us-east-2.amazonaws.com\0" -"honjo.saitama.jp\0gift\0" -"bauern.museum\0" -"kizu.kyoto.jp\0loginline.dev\0mein-vigor.de\0" -"vps.mcdir.ru\0" -"me.vu\0" -"se.leg.br\0" -"saga.jp\0castres.museum\0beta.bounty-full.com\0" -"firewall-gateway.com\0" -"moskenes.no\0" -"arte.bo\0arts.museum\0" -"suwa.nagano.jp\0x.se\0nis.za\0" -"my-gateway.de\0" -"mg.gov.br\0" -"hamatama.saga.jp\0" -"kamiizumi.saitama.jp\0jaguar\0" -"nikaho.akita.jp\0" -"applinzi.com\0" -"oyabe.toyama.jp\0s\xc3\xb8rfold.no\0" -"sakaiminato.tottori.jp\0" -"passenger-association.aero\0run\0" -"air-surveillance.aero\0" -"ritto.shiga.jp\0j\xc3\xb8rpeland.no\0mj\xc3\xb8ndalen.no\0" -"mlbfan.org\0community-pro.de\0" -"nextdirect\0ses\0" -"ba.leg.br\0" -"dynserv.org\0" -"kpmg\0sew\0shell\0" -"sex\0" -"shinjo.nara.jp\0monmouth.museum\0" -"pol.tr\0bugatti\0" -"mar.it\0" -"otofuke.hokkaido.jp\0" -"imdb\0" -"bio.br\0tjmaxx\0" -"sfr\0" -"naoshima.kagawa.jp\0" -"nantan.kyoto.jp\0rwe\0" -"shirataka.yamagata.jp\0" -"is-a-candidate.org\0" -"mitsubishi\0" -"dvag\0" -"cologne\0" -"ed.ao\0" -"kanonji.kagawa.jp\0coach\0education\0" -"association.museum\0" -"kunigami.okinawa.jp\0haibara.shizuoka.jp\0" -"meloy.no\0br.com\0cdn77-ssl.net\0" -"nakagyo.kyoto.jp\0kahoku.yamagata.jp\0" -"grocery\0" -"bozen.it\0" -"tgory.pl\0" -"h\xc3\xa1""bmer.no\0" -"kiwi.nz\0agro.pl\0" -"ed.ci\0geek.nz\0" -"eating-organic.net\0" -"evenassi.no\0" -"kitakata.fukushima.jp\0" -"nara.jp\0" -"imb.br\0" -"ed.cr\0" -"kazuno.akita.jp\0" -"shimizu.shizuoka.jp\0" -"izumiotsu.osaka.jp\0cymru.museum\0pgfog.com\0" -"tirol\0" -"honjyo.akita.jp\0" -"\xd8\xa8\xda\xbe\xd8\xa7\xd8\xb1\xd8\xaa\0fujitsu\0" -"kembuchi.hokkaido.jp\0la.us\0ski\0" -"rade.no\0" -"brunel.museum\0" -"memorial.museum\0unicom\0" -"mediocampidano.it\0from-de.com\0" -"dvrcam.info\0" -"kawaba.gunma.jp\0cc.wi.us\0" -"yaizu.shizuoka.jp\0cc.sd.us\0" -"inf.mk\0loten.no\0" -"kitagawa.kochi.jp\0sky\0" -"judygarland.museum\0ulm.museum\0" -"norddal.no\0" -"cloud.jelastic.open.tim.it\0" -"krasnik.pl\0" -"iglesiascarbonia.it\0" -"d.se\0" -"jinsekikogen.hiroshima.jp\0" -"adult.ht\0" -"\xd0\xba\xd1\x80\xd1\x8b\xd0\xbc.\xd1\x80\xd1\x83\xd1\x81\0" -"tozawa.yamagata.jp\0" -"brandywinevalley.museum\0kherson.ua\0" -"baseball.museum\0" -"edunet.tn\0" -"watch\0" -"babia-gora.pl\0" -"cri.br\0is-a-teacher.com\0" -"am.leg.br\0" -"television.museum\0" -"nishinoomote.kagoshima.jp\0omi.nagano.jp\0" -"servesarcasm.com\0" -"homeftp.net\0" -"otsuki.kochi.jp\0" -"shiwa.iwate.jp\0" -"tondabayashi.osaka.jp\0" -"better-than.tv\0impertrixcdn.com\0" -"lib.ut.us\0" -"mitsuke.niigata.jp\0\xe4\xba\x9a\xe9\xa9\xac\xe9\x80\x8a\0" -"rc.it\0" -"aurskog-holand.no\0stokke.no\0" -"chrome\0ravendb.community\0" -"mn.it\0spa\0xy.ax\0" -"chippubetsu.hokkaido.jp\0lavangen.no\0" -"taifun-dns.de\0" -"witd.gov.pl\0" -"mitane.akita.jp\0chijiwa.nagasaki.jp\0wlocl.pl\0" -"barueri.br\0soy\0" -"*.dweb.link\0" -"immo\0" -"omachi.nagano.jp\0n\xc3\xa1vuotna.no\0gos.pk\0" -"jan-mayen.no\0" -"tab\0" -"ed.jp\0fh.se\0" -"hotels\0" -"pippu.hokkaido.jp\0" -"\xe6\xbb\x8b\xe8\xb3\x80.jp\0" -"openair.museum\0" -"is-into-cars.com\0" -"higashikagura.hokkaido.jp\0" -"soja.okayama.jp\0" -"he.cn\0" -"shiftedit.io\0" -"herokuapp.com\0" -"midtre-gauldal.no\0directory\0" -"tax\0" -"friulivenezia-giulia.it\0\xe7\xbe\xa4\xe9\xa6\xac.jp\0cbre\0" -"pymnt.uk\0" -"srl\0" -"nyny.museum\0" -"s3.amazonaws.com\0" -"minami-alps.yamanashi.jp\0enonic.io\0" -"nishitosa.kochi.jp\0naustdal.no\0paas.massivegrid.com\0" -"publishproxy.com\0" -"halden.no\0" -"narusawa.yamanashi.jp\0astronomy.museum\0" -"tci\0\xe5\xae\xb6\xe9\x9b\xbb\0armenia.su\0" -"yasuda.kochi.jp\0" -"inf.ua\0" -"sjc.br\0yoshimi.saitama.jp\0radoy.no\0" -"meiwa.gunma.jp\0" -"toyotomi.hokkaido.jp\0utashinai.hokkaido.jp\0" -"hokuto.hokkaido.jp\0stc\0" -"film.hu\0as.us\0ap.leg.br\0" -"bo.nordland.no\0elastyco.com\0" -"suisse.museum\0" -"dnsdojo.net\0" -"tdk\0" -"servehumour.com\0" -"\xe0\xb0\xad\xe0\xb0\xbe\xe0\xb0\xb0\xe0\xb0\xa4\xe0\xb1\x8d\0" -"chizu.tottori.jp\0" -"tanabe.kyoto.jp\0jp.net\0azurestaticapps.net\0" -"hjelmeland.no\0investments\0" -"m.bg\0" -"k12.md.us\0" -"citadel\0and.mom\0" -"tamakawa.fukushima.jp\0oppdal.no\0tel\0" -"poa.br\0" -"air-traffic-control.aero\0genova.it\0" -"haboro.hokkaido.jp\0muika.niigata.jp\0" -"yamanobe.yamagata.jp\0divttasvuotna.no\0" -"sa.com\0homelinux.net\0isa-hockeynut.com\0" -"sandoy.no\0" -"\xe5\x85\xac\xe5\x8f\xb8.\xe9\xa6\x99\xe6\xb8\xaf\0boomla.net\0" -"lomza.pl\0" -"chofu.tokyo.jp\0" -"map.fastly.net\0" -"omuta.fukuoka.jp\0" -"seika.kyoto.jp\0" -"land\0" -"higashimatsushima.miyagi.jp\0playstation\0togliatti.su\0" -"abr.it\0plaza.museum\0" -"oshima.yamaguchi.jp\0ebiz.tw\0" -"tt.im\0" -"ota.gunma.jp\0ed.pw\0" -"mail.pl\0\xd8\xa7\xd9\x84\xd9\x8a\xd9\x85\xd9\x86\0" -"lib.tx.us\0" -"caserta.it\0aarborte.no\0" -"ud.it\0" -"yashiro.hyogo.jp\0" -"ogawa.ibaraki.jp\0embroidery.museum\0" -"po.it\0bremanger.no\0" -"thd\0fr.eu.org\0" -"botanicgarden.museum\0" -"navuotna.no\0lib.hi.us\0" -"tsu.mie.jp\0" -"matsukawa.nagano.jp\0" -"wakasa.tottori.jp\0" -"cloudns.info\0" -"kristiansand.no\0" -"lel.br\0uhren.museum\0midsund.no\0hotel.tz\0" -"yoshinogari.saga.jp\0" -"*.kawasaki.jp\0" -"catering.aero\0assabu.hokkaido.jp\0" -"monticello.museum\0pics\0" -"town\0" -"media.aero\0minowa.nagano.jp\0" -"info\0" -"friuli-veneziagiulia.it\0kamikawa.hokkaido.jp\0torino.museum\0" -"yokkaichi.mie.jp\0" -"imizu.toyama.jp\0" -"soma.fukushima.jp\0sells-it.net\0" -"andriabarlettatrani.it\0" -"contemporaryart.museum\0" -"cri.nz\0\xd0\xbc\xd0\xba\xd0\xb4\0" -"cloud.unispace.io\0" -"news.hu\0" -"yamada.toyama.jp\0vestby.no\0" -"yatsuka.shimane.jp\0" -"delta\0" -"tjx\0" -"s\xc3\xbc""dtirol.it\0" -"nome.pt\0toys\0" -"toyohashi.aichi.jp\0mn.us\0" -"b\xc3\xa6rum.no\0" -"readthedocs.io\0" -"chattanooga.museum\0" -"urayasu.chiba.jp\0hirono.iwate.jp\0" -"*.vps.myjino.ru\0" -"bruxelles.museum\0fhv.se\0" -"archi\0" -"narashino.chiba.jp\0broke-it.net\0" -"okawa.kochi.jp\0" -"test.tj\0" -"hiraya.nagano.jp\0" -"nyc.museum\0ap-northeast-2.elasticbeanstalk.com\0" -"shimoji.okinawa.jp\0" -"musica.ar\0miyama.mie.jp\0" -"kushimoto.wakayama.jp\0" -"prime\0" -"ybo.review\0" -"fujisawa.kanagawa.jp\0" -"k12.ga.us\0" -"deno-staging.dev\0" -"from-in.com\0" -"chieti.it\0kred\0" -"krakow.pl\0" -"s3-website-ap-southeast-2.amazonaws.com\0" -"musica.bo\0florida.museum\0" -"house.museum\0" -"yoichi.hokkaido.jp\0" -"futbol\0s3.eu-west-2.amazonaws.com\0" -"misugi.mie.jp\0london.museum\0" -"\xe9\x95\xb7\xe5\xb4\x8e.jp\0" -"isla.pr\0school.za\0" -"\xd0\xbc\xd0\xbe\xd0\xbd\0" -"journal.aero\0bsb.br\0kawajima.saitama.jp\0" -"webredirect.org\0" -"homesecuritypc.com\0" -"time.museum\0fylkesbibl.no\0" -"lib.wy.us\0test.ru\0" -"wakayama.wakayama.jp\0top\0" -"hotel.lk\0shouji\0on-aptible.com\0" -"mizumaki.fukuoka.jp\0" -"sp.it\0" -"urn.arpa\0mc.eu.org\0" -"wa.au\0" -"builders\0\xe6\x88\x91\xe7\x88\xb1\xe4\xbd\xa0\0" -"versailles.museum\0" -"naie.hokkaido.jp\0" -"eastcoast.museum\0" -"\xd8\xa7\xd9\x84\xd8\xb9\xd9\x84\xd9\x8a\xd8\xa7\xd9\x86\0" -"bl.it\0" -"611.to\0" -"woodside\0" -"vda.it\0" -"hb.cldmail.ru\0" -"mallorca.museum\0" -"aerobatic.aero\0" -"moriyama.shiga.jp\0sande.m\xc3\xb8re-og-romsdal.no\0" -"dgca.aero\0rikuzentakata.iwate.jp\0tsunan.niigata.jp\0" -"lt.eu.org\0" -"is-a-bookkeeper.com\0" -"cesenaforli.it\0kamioka.akita.jp\0and.museum\0" -"otsuka\0" -"is.gov.pl\0" -"iveland.no\0" -"ah.cn\0" -"hatsukaichi.hiroshima.jp\0" -"obu.aichi.jp\0" -"ubs\0" -"forex\0" -"gouv.fr\0kvinnherad.no\0siljan.no\0trv\0" -"lamborghini\0pgafan.net\0" -"elverum.no\0hitachi\0" -"halsa.no\0ping\0" -"nordreisa.no\0" -"pink\0" -"rzeszow.pl\0" -"gu.us\0eu-west-2.elasticbeanstalk.com\0ravendb.me\0" -"hotel.hu\0filegear.me\0" -"campobasso.it\0" -"ouchi.saga.jp\0" -"ravendb.run\0" -"fnd.br\0" -"soni.nara.jp\0qbuser.com\0" -"\xc3\xb8rsta.no\0cloudns.pro\0" -"cc.oh.us\0" -"susaki.kochi.jp\0technology\0" -"pagefrontapp.com\0" -"gouv.ht\0homeunix.net\0" -"k12.wa.us\0tui\0is-a-landscaper.com\0" -"monza.it\0inagi.tokyo.jp\0" -"indigena.bo\0mitou.yamaguchi.jp\0" -"rmit\0from-mi.com\0" -"kyowa.akita.jp\0setagaya.tokyo.jp\0" -"m.se\0" -"toyono.osaka.jp\0selje.no\0" -"platform0.app\0" -"stockholm\0" -"k12.ar.us\0" -"caravan\0" -"tonsberg.no\0" -"\xe7\xae\x87\xe4\xba\xba.hk\0iwi.nz\0\xe3\x83\x95\xe3\x82\xa1\xe3\x83\x83\xe3\x82\xb7\xe3\x83\xa7\xe3\x83\xb3\0" -"gouv.bj\0gb.com\0" -"omotego.fukushima.jp\0taketomi.okinawa.jp\0" -"tama.tokyo.jp\0salon\0" -"isesaki.gunma.jp\0" -"tvs\0" -"cuiaba.br\0" -"watari.miyagi.jp\0grong.no\0dyndns-ip.com\0" -"news\0" -"livinghistory.museum\0" -"okutama.tokyo.jp\0kustanai.ru\0" -"gouv.ci\0" -"kawachinagano.osaka.jp\0fribourg.museum\0" -"higashikawa.hokkaido.jp\0steigen.no\0" -"toyokawa.aichi.jp\0ishigaki.okinawa.jp\0" -"firenze.it\0" -"ato.br\0tonaki.okinawa.jp\0" -"vinnytsia.ua\0" -"recife.br\0next\0" -"steam.museum\0" -"\xe4\xbd\x90\xe8\xb3\x80.jp\0onion\0" -"north.museum\0kustanai.su\0" -"trentinsued-tirol.it\0" -"hinode.tokyo.jp\0" -"raisa.no\0" -"miura.kanagawa.jp\0" -"showtime\0mc.ax\0" -"eastasia.azurestaticapps.net\0" -"*.compute.estate\0" -"galsa.no\0" -"moma.museum\0" -"tsugaru.aomori.jp\0" -"dyndns-office.com\0" -"sn\xc3\xa5sa.no\0is-a-anarchist.com\0" -"dyn53.io\0" -"freiburg.museum\0" -"kamisunagawa.hokkaido.jp\0" -"qh.cn\0" -"sera.hiroshima.jp\0malvik.no\0" -"hn.cn\0" -"obira.hokkaido.jp\0dyndns.org\0miniserver.com\0" -"sor-fron.no\0" -"ballangen.no\0" -"sor-odal.no\0" -"minato.tokyo.jp\0pfizer\0" -"caa.aero\0" -"adobeaemcloud.com\0" -"\xe5\xb2\xa9\xe6\x89\x8b.jp\0legnica.pl\0" -"southcarolina.museum\0juniper\0" -"frei.no\0" -"srv.br\0" -"nishikawa.yamagata.jp\0" -"fundacio.museum\0ok.us\0" -"uchinada.ishikawa.jp\0botanical.museum\0" -"nishiarita.saga.jp\0int.eu.org\0" -"ga.us\0" -"ogi.saga.jp\0" -"konyvelo.hu\0" -"mansion.museum\0rl.no\0" -"bestbuy\0from-ky.com\0" -"soo.kagoshima.jp\0kppsp.gov.pl\0cc.ri.us\0" -"saiki.oita.jp\0" -"yachts\0" -"rec.br\0cc.mt.us\0cc.nd.us\0\xe7\xb6\xb2\xe7\xb5\xa1.\xe9\xa6\x99\xe6\xb8\xaf\0" -"protonet.io\0" -"kitami.hokkaido.jp\0" -"centralus.azurestaticapps.net\0" -"ra-ru.ru\0" -"v.bg\0s3.dualstack.ap-southeast-1.amazonaws.com\0" -"ah.no\0" -"britishcolumbia.museum\0aid.pl\0" -"1.bg\0" -"ybo.science\0" -"poniatowa.pl\0" -"rec.co\0gr.com\0" -"k\xc3\xa5""fjord.no\0" -"washingtondc.museum\0" -"kamimine.saga.jp\0" -"ichiba.tokushima.jp\0luzern.museum\0loginline.app\0" -"tosu.saga.jp\0uno\0" -"des.br\0myoko.niigata.jp\0" -"otaki.chiba.jp\0" -"is-very-good.org\0" -"kicks-ass.net\0" -"otsuki.yamanashi.jp\0uol\0" -"frontier\0" -"handa.aichi.jp\0sweetpepper.org\0wellbeingzone.co.uk\0" -"g\xc3\xbcnstigliefern.de\0" -"gildeskal.no\0se.net\0ru.net\0" -"ikeda.fukui.jp\0community.museum\0osaka\0serveftp.net\0" -"culture.museum\0fineart.museum\0" -"from-pr.com\0" -"mk.eu.org\0" -"for-the.biz\0" -"aki.kochi.jp\0" -"yamato.fukushima.jp\0" -"fuefuki.yamanashi.jp\0*.in.futurecms.at\0fra1-de.cloudjiffy.net\0" -"sanfrancisco.museum\0" -"mc.it\0kyonan.chiba.jp\0yahoo\0" -"otsu.shiga.jp\0hoylandet.no\0konsulat.gov.pl\0ups\0" -"nanporo.hokkaido.jp\0honefoss.no\0lib.de.us\0" -"ericsson\0" -"beiarn.no\0" -"fujikawa.yamanashi.jp\0" -"gsm.pl\0" -"trentin-suedtirol.it\0" -"mel.cloudlets.com.au\0" -"ven.it\0" -"cieszyn.pl\0weir\0" -"messina.it\0" -"\xe0\xa6\xad\xe0\xa6\xbe\xe0\xa6\xb0\xe0\xa6\xa4\0" -"static.observableusercontent.com\0" -"mosj\xc3\xb8""en.no\0" -"homelinux.org\0" -"forum\0" -"\xc3\xa5mli.no\0" -"takasago.hyogo.jp\0eigersund.no\0" -"trader.aero\0nakagawa.hokkaido.jp\0" -"onjuku.chiba.jp\0americanfamily\0" -"komatsushima.tokushima.jp\0" -"lima-city.de\0" -"heritage.museum\0" -"kuju.oita.jp\0kv\xc3\xa6nangen.no\0" -"\xe7\xa5\x9e\xe5\xa5\x88\xe5\xb7\x9d.jp\0columbia.museum\0" -"cloud\0" -"\xe5\xba\x83\xe5\xb3\xb6.jp\0hayakawa.yamanashi.jp\0scienceandhistory.museum\0" -"couchpotatofries.org\0" -"takamatsu.kagawa.jp\0oshima.tokyo.jp\0" -"sar.it\0" -"aus.basketball\0" -"wa.us\0" -"lu.eu.org\0me.eu.org\0" -"nanae.hokkaido.jp\0" -"rokunohe.aomori.jp\0naval.museum\0" -"fyresdal.no\0" -"asahi.chiba.jp\0murakami.niigata.jp\0" -"cloudns.org\0" -"christmas\0" -"kumano.mie.jp\0" -"savona.it\0" -"naples.it\0chigasaki.kanagawa.jp\0blog.gt\0" -"airline.aero\0paas.hosted-by-previder.com\0lima-city.at\0" -"us-west-2.elasticbeanstalk.com\0" -"oracle\0" -"katagami.akita.jp\0oyodo.nara.jp\0" -"ugim.gov.pl\0operaunite.com\0" -"luroy.no\0yombo.me\0" -"kuki.saitama.jp\0" -"vet\0" -"b.bg\0" -"ise.mie.jp\0" -"lv.eu.org\0" -"lima-city.ch\0" -"kawaguchi.saitama.jp\0" -"b.br\0miharu.fukushima.jp\0" -"koshimizu.hokkaido.jp\0minato.osaka.jp\0flatanger.no\0" -"wassamu.hokkaido.jp\0" -"gotsu.shimane.jp\0" -"tohnosho.chiba.jp\0" -"bytom.pl\0" -"tokyo.jp\0" -"coz.br\0rindal.no\0" -"macapa.br\0kitakami.iwate.jp\0london.cloudapps.digital\0nyaa.am\0" -"n\xc3\xa6r\xc3\xb8y.no\0" -"saarland\0" -"blog.bo\0kotoura.tottori.jp\0from-or.com\0" -"yakage.okayama.jp\0" -"blog.br\0gouv.sn\0" -"upaas.kazteleport.kz\0alpha.bounty-full.com\0" -"ukco.me\0" -"game-server.cc\0" -"hakata.fukuoka.jp\0yanagawa.fukuoka.jp\0" -"mihama.wakayama.jp\0lukow.pl\0" -"rec.nf\0" -"ot.it\0pd.it\0saka.hiroshima.jp\0" -"vig\0" -"kamitsue.oita.jp\0krodsherad.no\0dnsup.net\0" -"grimstad.no\0" -"shintoku.hokkaido.jp\0" -"cruise\0" -"verdal.no\0global\0panasonic\0" -"ce.it\0illustration.museum\0rauma.no\0lon-2.paas.massivegrid.net\0" -"vin\0" -"vip\0" -"yachiyo.chiba.jp\0es.eu.org\0" -"now-dns.top\0" -"settlers.museum\0cn-north-1.eb.amazonaws.com.cn\0" -"parma.it\0kameyama.mie.jp\0" -"awaji.hyogo.jp\0" -"from-la.net\0" -"tsuruoka.yamagata.jp\0" -"codes\0" -"trentin-s\xc3\xbc""d-tirol.it\0yuzawa.niigata.jp\0nord-fron.no\0scrysec.com\0" -"mino.gifu.jp\0" -"roros.no\0js.wpenginepowered.com\0" -"\xe0\xb8\xa3\xe0\xb8\xb1\xe0\xb8\x90\xe0\xb8\x9a\xe0\xb8\xb2\xe0\xb8\xa5.\xe0\xb9\x84\xe0\xb8\x97\xe0\xb8\xa2\0" -"kawatana.nagasaki.jp\0aquarium.museum\0" -"durban\0" -"info.gu\0" -"lenug.su\0" -"ind.br\0farmequipment.museum\0search\0" -"whaling.museum\0" -"mydobiss.com\0" -"info.ht\0\xe0\xb8\x84\xe0\xb8\xad\xe0\xb8\xa1\0" -"info.hu\0" -"origins\0" -"tec.br\0\xe0\xac\xad\xe0\xac\xbe\xe0\xac\xb0\xe0\xac\xa4\0" -"rana.no\0sochi.su\0" -"holmestrand.no\0" -"\xc3\xb8vre-eiker.no\0" -"sakai.osaka.jp\0aarp\0dyndns-work.com\0" -"schaeffler\0" -"shibecha.hokkaido.jp\0niyodogawa.kochi.jp\0rec.ro\0" -"hattfjelldal.no\0\xe3\x82\xb9\xe3\x83\x88\xe3\x82\xa2\0" -"info.et\0" -"info.fj\0" -"cc.pa.us\0" -"navoi.su\0" -"ce.leg.br\0" -"takehara.hiroshima.jp\0" -"futsu.nagasaki.jp\0" -"kr.eu.org\0" -"bu.no\0" -"yamanakako.yamanashi.jp\0" -"roma.it\0bounty-full.com\0" -"guardian\0" -"stpetersburg.museum\0enterprises\0" -"gmbh\0" -"canon\0square7.net\0prvcy.page\0" -"hachioji.tokyo.jp\0" -"iwanuma.miyagi.jp\0kawasaki.miyagi.jp\0" -"info.cx\0seidat.net\0" -"potager.org\0" -"business\0sydney\0s3-us-west-2.amazonaws.com\0" -"shikabe.hokkaido.jp\0gouv.km\0" -"furudono.fukushima.jp\0" -"s3.us-east-2.amazonaws.com\0" -"wellbeingzone.eu\0" -"info.ec\0ina.saitama.jp\0sanofi\0" -"moseushi.hokkaido.jp\0" -"\xd0\xbe\xd1\x80\xd0\xb3\0v.ua\0" -"civilization.museum\0filegear-au.me\0" -"secure\0" -"hellas.museum\0rec.ve\0" -"ind.gt\0masfjorden.no\0" -"act.au\0" -"massa-carrara.it\0" -"ashibetsu.hokkaido.jp\0" -"place\0resindevice.io\0" -"servebbs.net\0" -"half.host\0" -"info.bb\0" -"s3-website.eu-west-2.amazonaws.com\0" -"tsubame.niigata.jp\0info.at\0" -"info.au\0" -"haga.tochigi.jp\0homeunix.org\0" -"naklo.pl\0" -"port.fr\0izunokuni.shizuoka.jp\0goip.de\0" -"info.az\0" -"noboribetsu.hokkaido.jp\0gouv.ml\0sondre-land.no\0" -"yoshida.shizuoka.jp\0" -"aq.it\0ba.it\0" -"shonai.fukuoka.jp\0gulen.no\0" -"info.bo\0" -"saito.miyazaki.jp\0mykolaiv.ua\0" -"kaminokawa.tochigi.jp\0arna.no\0schulserver.de\0" -"ind.in\0ogawa.saitama.jp\0from-ok.com\0" -"harvestcelebration.museum\0fjell.no\0" -"cern\0" -"info.co\0sec.ps\0on-the-web.tv\0hk.org\0" -"chernovtsy.ua\0" -"kochi.jp\0health.museum\0" -"gojome.akita.jp\0" -"cincinnati.museum\0" -"midori.chiba.jp\0kouyama.kagoshima.jp\0" -"vanguard\0gitlab.io\0" -"blog.vu\0" -"oceanographique.museum\0" -"yorii.saitama.jp\0" -"mobile\0is-an-anarchist.com\0" -"\xe5\x9f\xbc\xe7\x8e\x89.jp\0ind.kw\0" -"sekigahara.gifu.jp\0" -"coldwar.museum\0" -"express.aero\0" -"namikata.ehime.jp\0" -"edogawa.tokyo.jp\0" -"manx.museum\0" -"saogonca.br\0" -"tksat.bo\0batsfjord.no\0karpacz.pl\0bananarepublic\0" -"nishinomiya.hyogo.jp\0" -"fi.eu.org\0" -"cc.nm.us\0able\0" -"sphinx.mythic-beasts.com\0" -"\xc3\xa5krehamn.no\0" -"gwangju.kr\0finn\xc3\xb8y.no\0" -"obama.fukui.jp\0tsukuba.ibaraki.jp\0" -"k12.mn.us\0" -"kunstunddesign.museum\0landes.museum\0b.se\0" -"amber.museum\0annefrank.museum\0\xe0\xb2\xad\xe0\xb2\xbe\xe0\xb2\xb0\xe0\xb2\xa4\0" -"tsushima.aichi.jp\0k12.fl.us\0" -"kusatsu.shiga.jp\0" -"microlight.aero\0trentinos-tirol.it\0" -"skierv\xc3\xa1.no\0skanland.no\0play\0" -"g12.br\0" -"cim.br\0" -"is-a-geek.com\0" -"s\xc3\xb8r-varanger.no\0" -"kamishihoro.hokkaido.jp\0" -"sola.no\0" -"pa.gov.br\0telebit.io\0" -"seven\0" -"luster.no\0" -"okayama.okayama.jp\0organic\0" -"ra.it\0polkowice.pl\0" -"\xe6\x96\xb0\xe5\x8a\xa0\xe5\x9d\xa1\0win\0" -"akishima.tokyo.jp\0" -"eid.no\0" -"balestrand.no\0" -"caracal.mythic-beasts.com\0" -"\xe5\x85\xac\xe5\x8f\xb8.cn\0" -"nasu.tochigi.jp\0" -"idf.il\0miasa.nagano.jp\0" -"cagliari.it\0" -"pb.gov.br\0rentals\0za.com\0" -"room\0" -"dyndns-at-home.com\0" -"floripa.br\0orx.biz\0" -"balsan-sudtirol.it\0" -"\xe5\x85\xac\xe5\x8f\xb8.hk\0" -"urbino-pesaro.it\0" -"oguchi.aichi.jp\0kirkenes.no\0" -"mombetsu.hokkaido.jp\0\xe0\xae\x87\xe0\xae\xb2\xe0\xae\x99\xe0\xaf\x8d\xe0\xae\x95\xe0\xaf\x88\0buzz\0kicks-ass.org\0" -"jdf.br\0gs.cn\0" -"h\xc3\xb8nefoss.no\0" -"is-a-knight.org\0" -"rawa-maz.pl\0e12.ve\0" -"us-east-1.elasticbeanstalk.com\0" -"rel.ht\0" -"kragero.no\0" -"kr.com\0" -"pueblo.bo\0santoandre.br\0" -"wme\0" -"ind.tn\0" -"iwakuni.yamaguchi.jp\0info.ve\0" -"router.management\0" -"doomdns.org\0qcx.io\0" -"daito.osaka.jp\0" -"dr.na\0" -"vf.no\0info.vn\0pokrovsk.su\0" -"foz.br\0" -"bible.museum\0" -"wielun.pl\0cc.mi.us\0" -"nobeoka.miyazaki.jp\0" -"cc.id.us\0" -"nakano.nagano.jp\0" -"miyama.fukuoka.jp\0*.cryptonomic.net\0" -"k.bg\0" -"\xe5\xa4\xa7\xe5\x88\x86.jp\0" -"bozen-sudtirol.it\0" -"hirogawa.wakayama.jp\0bargains\0" -"nuoro.it\0minami.fukuoka.jp\0" -"achi.nagano.jp\0egersund.no\0" -"suzaka.nagano.jp\0tec.ve\0omg.lol\0" -"health.nz\0" -"higashiyamato.tokyo.jp\0" -"kuriyama.hokkaido.jp\0dynamisches-dns.de\0" -"info.tn\0skygearapp.com\0" -"info.tr\0wow\0blog.kg\0" -"info.tt\0" -"ivgu.no\0cbg.ru\0jelastic.team\0" -"gokase.miyazaki.jp\0" -"u.channelsdvr.net\0" -"parachuting.aero\0sanagochi.tokushima.jp\0info.tz\0lego\0" -"madrid.museum\0network\0" -"r\xc3\xb8yrvik.no\0\xe8\x87\xba\xe7\x81\xa3\0" -"shizuoka.shizuoka.jp\0abudhabi\0" -"and\xc3\xb8y.no\0" -"ueda.nagano.jp\0" -"ishikari.hokkaido.jp\0" -"tr.it\0lib.pa.us\0" -"*.ocs.customer-oci.com\0" -"haram.no\0" -"fastly-terrarium.com\0familyds.net\0" -"info.ro\0go.leg.br\0" -"ohkura.yamagata.jp\0" -"contagem.br\0" -"\xe4\xb8\xaa\xe4\xba\xba.hk\0cn.it\0info.sd\0" -"lecco.it\0" -"s3-website-eu-west-1.amazonaws.com\0eastus2.azurestaticapps.net\0" -"nico\0" -"hamburg.museum\0" -"is-a-geek.org\0" -"nagaokakyo.kyoto.jp\0" -"abu.yamaguchi.jp\0kudamatsu.yamaguchi.jp\0git-pages.rit.edu\0" -"sn.cn\0omihachiman.shiga.jp\0" -"tomiya.miyagi.jp\0" -"morioka.iwate.jp\0tj\xc3\xb8me.no\0" -"info.pk\0rel.pl\0" -"tokushima.jp\0info.pl\0" -"wtc\0" -"wtf\0cloudfront.net\0ghost.io\0appengine.flow.ch\0" -"mihara.hiroshima.jp\0info.pr\0serveftp.org\0" -"bj.cn\0med.pro\0" -"firmdale\0" -"sowa.ibaraki.jp\0" -"konskowola.pl\0" -"dr.tr\0" -"zappos\0" -"googleapis.com\0" -"trentins\xc3\xbc""d-tirol.it\0info.na\0" -"botany.museum\0""001www.com\0" -"yanaizu.fukushima.jp\0info.mv\0info.nf\0landrover\0" -"fermo.it\0" -"info.ni\0myvnc.com\0" -"aremark.no\0xihuan\0" -"tatsuno.nagano.jp\0info.nr\0" -"tr.no\0" -"rennebu.no\0" -"beeldengeluid.museum\0" -"cyon.site\0" -"klepp.no\0r\xc3\xb8st.no\0is-very-sweet.org\0" -"randaberg.no\0west1-us.cloudjiffy.net\0" -"iwafune.tochigi.jp\0" -"floro.no\0" -"health.vn\0" -"myphotos.cc\0" -"info.la\0" -"ustka.pl\0" -"embetsu.hokkaido.jp\0\xc3\xa5""fjord.no\0" -"avellino.it\0" -"\xc3\xa1k\xc5\x8boluokta.no\0" -"trentin-sued-tirol.it\0" -"nesna.no\0trust\0" -"secaas.hk\0" -"cahcesuolo.no\0" -"info.ls\0" -"java\0" -"exhibition.museum\0" -"orland.no\0vm.bytemark.co.uk\0" -"\xe4\xb8\xad\xe5\x9b\xbd\0" -"pi.gov.br\0yokoze.saitama.jp\0" -"author\0smart\0" -"works.aero\0" -"viking\0" -"sel.no\0komvux.se\0" -"asahikawa.hokkaido.jp\0" -"gs.of.no\0xin\0net-freaks.com\0" -"karatsu.saga.jp\0" -"georgia.su\0" -"\xe4\xb8\xad\xe5\x9c\x8b\0" -"adm.br\0nordre-land.no\0nike\0" -"info.ke\0" -"lib.ar.us\0" -"info.ki\0frankfurt.museum\0healthcare\0" -"tateyama.toyama.jp\0" -"ribeirao.br\0" -"fusa.no\0zaporizhzhe.ua\0" -"adac\0" -"komatsu.ishikawa.jp\0" -"plus\0" -"riopreto.br\0from-co.net\0" -"withyoutube.com\0" -"kiyosato.hokkaido.jp\0numata.hokkaido.jp\0" -"higashiyoshino.nara.jp\0" -"otama.fukushima.jp\0cdn-edges.net\0" -"s3-website.eu-central-1.amazonaws.com\0" -"barcelona\0" -"hita.oita.jp\0" -"nonoichi.ishikawa.jp\0jelastic.dogado.eu\0" -"itoigawa.niigata.jp\0cn.ua\0is-a-socialist.com\0" -"ryuoh.shiga.jp\0" -"ws.na\0" -"accountant\0" -"firm.ht\0" -"emr.it\0" -"buzen.fukuoka.jp\0" -"knightpoint.systems\0" -"iwatsuki.saitama.jp\0leirvik.no\0vennesla.no\0" -"yamato.kumamoto.jp\0" -"firm.in\0" -"campinagrande.br\0yuu.yamaguchi.jp\0" -"crotone.it\0" -"onga.fukuoka.jp\0" -"alta.no\0cc.nv.us\0" -"yazu.tottori.jp\0" -"azure\0" -"cc.fl.us\0" -"cricket\0" -"cn.vu\0" -"chungnam.kr\0royrvik.no\0" -"k.se\0" -"sumy.ua\0" -"tateshina.nagano.jp\0" -"youtube\0jele.cloud\0" -"tsukigata.hokkaido.jp\0" -"shiso.hyogo.jp\0" -"vicenza.it\0" -"andriatranibarletta.it\0campidanomedio.it\0" -"firm.co\0" -"baidar.no\0" -"kinokawa.wakayama.jp\0" -"lplfinancial\0" -"shinanomachi.nagano.jp\0voss.no\0is-certified.com\0enterprisecloud.nu\0" -"pe.gov.br\0" -"browsersafetymark.io\0" -"shisui.chiba.jp\0kasserver.com\0firm.dk\0" -"qa2.com\0" -"bib.br\0safe\0" -"eidskog.no\0" -"test-iserv.de\0" -"takatsuki.osaka.jp\0gs.mr.no\0" -"iraq.museum\0" -"chat\0s3-sa-east-1.amazonaws.com\0" -"hida.gifu.jp\0" -"ehime.jp\0" -"misato.shimane.jp\0" -"v\xc3\xa5gs\xc3\xb8y.no\0" -"isernia.it\0seto.aichi.jp\0" -"valleeaoste.it\0" -"bible\0" -"clinton.museum\0" -"rishiri.hokkaido.jp\0" -"sakaki.nagano.jp\0" -"ne.jp\0troms\xc3\xb8.no\0" -"emergency.aero\0" -"nayoro.hokkaido.jp\0aramco\0" -"from-ga.com\0" -"ne.ke\0is-an-actress.com\0" -"gamvik.no\0" -"rovno.ua\0bloomberg\0" -"jus.br\0tsuiki.fukuoka.jp\0youth.museum\0raholt.no\0" "tube\0" -"fedex\0" -"ne.kr\0\xd1\x80\xd1\x83\xd1\x81\0" -"niiza.saitama.jp\0is-a-green.com\0" -"hl.cn\0" -"exchange\0hopto.me\0" -"is-a-patsfan.org\0" -"nagatoro.saitama.jp\0" -"nagano.nagano.jp\0" -"nakagawa.nagano.jp\0" -"helsinki.museum\0" -"servebbs.org\0" -"serveminecraft.net\0" -"engine.aero\0yuza.yamagata.jp\0" -"grajewo.pl\0" -"ny.us\0" -"seiro.niigata.jp\0" -"oirm.gov.pl\0" -"\xe6\x9d\xb1\xe4\xba\xac.jp\0" -"seirou.niigata.jp\0az.us\0" -"pa.gov.pl\0" -"lajolla.museum\0" -"shizuoka.jp\0" -"toride.ibaraki.jp\0" -"tel.tr\0" -"vpnplus.to\0" -"t.bg\0" -"sale\0" -"\xd9\x81\xd9\x84\xd8\xb3\xd8\xb7\xd9\x8a\xd9\x86\0" -"k12.ma.us\0domains\0" -"ondigitalocean.app\0" -"minamifurano.hokkaido.jp\0cust.prod.thingdust.io\0" -"friuliveneziagiulia.it\0" -"webcam\0est-a-la-masion.com\0" -"k12.ec\0kagamino.okayama.jp\0" -"cal.it\0k12.al.us\0" -"higashichichibu.saitama.jp\0" -"gold\0jpn.com\0" -"aosta-valley.it\0sandcats.io\0" -"golf\0" -"okoppe.hokkaido.jp\0dyndns-web.com\0" -"hanno.saitama.jp\0" -"uonuma.niigata.jp\0gov.scot\0" -"xxx\0" -"dnepropetrovsk.ua\0pages.wiardweb.com\0" -"ne.pw\0" -"medecin.km\0nalchik.ru\0" -"tajimi.gifu.jp\0ipifony.net\0" -"saga.saga.jp\0" -"komagane.nagano.jp\0moscow.museum\0" -"info.zm\0" -"hitachi.ibaraki.jp\0zp.gov.pl\0" -"jp.eu.org\0" -"\xe4\xbf\xa1\xe6\x81\xaf\0" -"sumoto.kumamoto.jp\0" -"xyz\0" -"shiogama.miyagi.jp\0tvedestrand.no\0" -"pb.ao\0pv.it\0" -"kosei.shiga.jp\0" -"nalchik.su\0" -"genoa.it\0hoteles\0" -"or.at\0vall\xc3\xa9""e-d-aoste.it\0misawa.aomori.jp\0osoyro.no\0" -"catania.it\0torino.it\0b\xc3\xa1id\xc3\xa1r.no\0" -"pr.gov.br\0" -"firm.ve\0" -"or.bi\0" -"\xd0\xbe\xd0\xb1\xd1\x80.\xd1\x81\xd1\x80\xd0\xb1\0" -"abogado\0*.elb.amazonaws.com\0" -"nishimera.miyazaki.jp\0" -"sos.pl\0" -"uk.kg\0" -"sth.ac.at\0odate.akita.jp\0" -"iglesias-carbonia.it\0" -"stuff-4-sale.org\0" -"barsy.support\0" -"goog\0" -"umb.it\0" -"lgbt\0" -"or.ci\0jdevcloud.com\0" -"tos.it\0toya.hokkaido.jp\0toyama.toyama.jp\0" -"camera\0" -"zt.ua\0" -"or.cr\0" -"sue.fukuoka.jp\0" -"k12.il\0" -"x443.pw\0" -"*.stg.dev\0" -"airtraffic.aero\0l\xc3\xa1hppi.no\0" -"ashoro.hokkaido.jp\0farmers.museum\0hiphop\0" -"ami.ibaraki.jp\0" -"ne.ug\0wien\0" -"kaminoyama.yamagata.jp\0" -"ne.tz\0" -"copenhagen.museum\0" -"\xd7\x99\xd7\xa8\xd7\x95\xd7\xa9\xd7\x9c\xd7\x99\xd7\x9d.museum\0ann-arbor.mi.us\0" -"omaezaki.shizuoka.jp\0sarl\0" -"iron.museum\0" -"ne.us\0" -"grainger\0" -"watchandclock.museum\0" -"fst.br\0ris\xc3\xb8r.no\0" -"koebenhavn.museum\0bounceme.net\0" -"is-a-geek.net\0" -"freeboxos.com\0" -"sko.gov.pl\0cc.tx.us\0" -"pup.gov.pl\0accesscam.org\0" -"iwama.ibaraki.jp\0" -"agriculture.museum\0atm.pl\0" -"no-ip.co.uk\0" -"hl.no\0" -"hadano.kanagawa.jp\0" -"firm.ro\0cc.hi.us\0" -"cc.ct.us\0*.ocp.customer-oci.com\0" -"bando.ibaraki.jp\0" -"shirosato.ibaraki.jp\0you\0" -"townnews-staging.com\0" -"tono.iwate.jp\0hakuba.nagano.jp\0foundation.museum\0" -"\xd1\x81\xd1\x80\xd0\xb1\0" -"alaska.museum\0" -"himeji.hyogo.jp\0" -"frana.no\0comsec\0" -"kosuge.yamanashi.jp\0" -"hosting-cluster.nl\0" -"natuurwetenschappen.museum\0" -"iruma.saitama.jp\0" -"harima.hyogo.jp\0ams1.jls.docktera.net\0" -"archaeology.museum\0" -"bulsan-sudtirol.it\0" -"hof.no\0" -"stream\0users.scale.virtualcloud.com.br\0" -"kita.osaka.jp\0lardal.no\0cloud-fr1.unispace.io\0" -"kitaura.miyazaki.jp\0ryokami.saitama.jp\0histoire.museum\0save\0" -"agrigento.it\0katsuura.chiba.jp\0minami.kyoto.jp\0kv\xc3\xa6""fjord.no\0loppa.no\0" -"or.id\0" -"\xe0\xa6\xad\xe0\xa6\xbe\xe0\xa7\xb0\xe0\xa6\xa4\0cc.hn\0" -"tkmaxx\0" -"gs.st.no\0", - -"pri.ee\0" -"from-ia.com\0webthings.io\0" -"kumatori.osaka.jp\0fetsund.no\0" -"otobe.hokkaido.jp\0" -"or.it\0ninomiya.kanagawa.jp\0comunica\xc3\xa7\xc3\xb5""es.museum\0j.layershift.co.uk\0" -"balat.no\0" -"adv.br\0aknoluokta.no\0" -"friulivgiulia.it\0" -"erotika.hu\0firm.nf\0" -"taobao\0firm.ng\0" -"torahime.shiga.jp\0wiki\0" -"bs.it\0sites.static.land\0" -"spy.museum\0" -"or.jp\0" -"mckinsey\0" -"aichi.jp\0geelvinck.museum\0" -"goldpoint\0definima.io\0" -"slupsk.pl\0beep.pl\0pointto.us\0" -"or.ke\0" -"gs.oslo.no\0kinder\0" -"saxo\0" -"\xe7\xb6\xb2\xe8\xb7\xaf.tw\0" -"sumita.iwate.jp\0" -"cards\0" -"sc.cn\0" -"or.kr\0ocs.opusinteractive.io\0" -"itau\0" -"kai.yamanashi.jp\0" -"diskstation.me\0" -"est.pr\0" -"trentin-s\xc3\xbc""dtirol.it\0shijonawate.osaka.jp\0" -"yun\0" -"cci.fr\0" -"numazu.shizuoka.jp\0u2-local.xnbay.com\0" -"chirurgiens-dentistes-en-france.fr\0familyds.org\0" -"wine\0" -"dattolocal.com\0diskstation.eu\0" -"yusui.kagoshima.jp\0sula.no\0" -"is-a-nurse.com\0" -"production.aero\0shibetsu.hokkaido.jp\0" -"or.na\0ma.us\0" -"slg.br\0" -"or.mu\0" -"masaki.ehime.jp\0" -"isshiki.aichi.jp\0cc.na\0" -"kmpsp.gov.pl\0cc.wy.us\0clicketcloud.com\0" -"maebashi.gunma.jp\0" -"ngrok.io\0" -"samsung\0" -"k12.tr\0" -"happou.akita.jp\0" -"t.se\0" -"mysecuritycamera.com\0" -"filegear-jp.me\0" -"uslivinghistory.museum\0" -"depot.museum\0" -"fukagawa.hokkaido.jp\0" -"shacknet.nu\0" -"freebox-os.com\0" -"bozen-s\xc3\xbc""dtirol.it\0oguni.yamagata.jp\0" -"cnt.br\0nosegawa.nara.jp\0railway.museum\0" -"lerdal.no\0*.dapps.earth\0" -"k12.vi\0" -"ap-southeast-2.elasticbeanstalk.com\0bitbridge.net\0" -"zip\0zuerich\0" -"reggio-emilia.it\0" -"serveexchange.com\0" -"kozaki.chiba.jp\0or.pw\0" -"is-a-bulls-fan.com\0" -"bjarkoy.no\0kindle\0" -"curitiba.br\0" -"mus.br\0\xd8\xa7\xd8\xaa\xd8\xb5\xd8\xa7\xd9\x84\xd8\xa7\xd8\xaa\0" -"stalbans.museum\0" -"lib.vt.us\0" -"po.gov.pl\0" -"shimoda.shizuoka.jp\0edu.scot\0" -"umaji.kochi.jp\0" -"shichinohe.aomori.jp\0lib.mn.us\0" -"r.cdn77.net\0" -"kasukabe.saitama.jp\0" -"obninsk.su\0" -"m\xc3\xa1tta-v\xc3\xa1rjjat.no\0holdings\0playstation-cloud.com\0" -"fh-muenster.io\0" -"ichikai.tochigi.jp\0" -"ao.it\0" -"treviso.it\0" -"kaas.gg\0" -"res.aero\0" -"sc.ke\0" -"travelchannel\0" -"sakai.fukui.jp\0" -"no-ip.info\0" -"aero\0" -"sc.kr\0" -"medecin.fr\0miami\0" -"valle-d-aosta.it\0takayama.nagano.jp\0or.th\0" -"boxfuse.io\0" -"vard\xc3\xb8.no\0" -"uji.kyoto.jp\0" -"satosho.okayama.jp\0veg\xc3\xa5rshei.no\0" -"ricoh\0ufcfan.org\0" -"nohost.me\0" -"\xe7\xb6\xb2\xe7\xb5\xa1.cn\0km.ua\0" -"mitaka.tokyo.jp\0sc.ls\0pohl\0toolforge.org\0" -"oystre-slidre.no\0discourse.group\0" -"or.ug\0\xd1\x81\xd0\xbf\xd0\xb1.\xd1\x80\xd1\x83\xd1\x81\0" -"stadt.museum\0or.tz\0promo\0cc.ua\0" -"h\xc3\xa1mm\xc3\xa1rfeasta.no\0" -"tadaoka.osaka.jp\0" -"tomi.nagano.jp\0sakura.tochigi.jp\0" -"adv.mz\0sa-east-1.elasticbeanstalk.com\0" -"ube.yamaguchi.jp\0" -"erimo.hokkaido.jp\0or.us\0" -"emerck\0" -"aioi.hyogo.jp\0" -"starostwo.gov.pl\0" -"futaba.fukushima.jp\0sor-varanger.no\0" -"nagi.okayama.jp\0" -"deatnu.no\0" -"rio.br\0" -"science.museum\0" -"olsztyn.pl\0" -"mayfirst.org\0noip.us\0" -"is.eu.org\0" -"mihama.mie.jp\0schmidt\0" -"8.bg\0cc.al.us\0" -"research.museum\0k12.mt.us\0" -"dnsalias.net\0" -"club.tw\0" -"ono.fukushima.jp\0francaise.museum\0" -"slattum.no\0" -"trolley.museum\0" -"asso.eu.org\0" -"shingu.hyogo.jp\0from-ca.com\0" -"amakusa.kumamoto.jp\0" -"of.fashion\0" -"my-wan.de\0" -"*.triton.zone\0" -"s3-us-gov-west-1.amazonaws.com\0wafflecell.com\0" -"capital\0it.eu.org\0" -"ohira.miyagi.jp\0" -"trentino-altoadige.it\0" -"skjervoy.no\0" -"\xe7\xb6\xb2\xe7\xb5\xa1.hk\0corporation.museum\0gs.va.no\0" -"customer.mythic-beasts.com\0" -"guernsey.museum\0statefarm\0" -"\xe8\xb4\xad\xe7\x89\xa9\0" -"trycloudflare.com\0" -"kamakura.kanagawa.jp\0warszawa.pl\0" -"mcdir.ru\0" -"\xe6\x84\x9b\xe5\xaa\x9b.jp\0" -"oirase.aomori.jp\0" -"rikubetsu.hokkaido.jp\0green\0" -"british.museum\0" -"ina.ibaraki.jp\0" -"shishikui.tokushima.jp\0" -"citi\0" -"trana.no\0" -"office\0" -"yugawara.kanagawa.jp\0" -"iizuna.nagano.jp\0is-found.org\0" -"!city.kobe.jp\0money.museum\0\xd0\xb1\xd0\xb8\xd0\xb7.\xd1\x80\xd1\x83\xd1\x81\0" -"aomori.jp\0" -"ha.cn\0varoy.no\0city\0" -"utazas.hu\0koto.tokyo.jp\0stavern.no\0" -"gmina.pl\0" -"hofu.yamaguchi.jp\0" -"virtual.museum\0" -"sc.ug\0" -"in.eu.org\0" -"honai.ehime.jp\0sc.tz\0" -"hair\0" -"\xe9\xb9\xbf\xe5\x85\x90\xe5\xb3\xb6.jp\0" -"higashiizumo.shimane.jp\0lorenskog.no\0" -"asuke.aichi.jp\0" -"namegawa.saitama.jp\0" -"sc.us\0simple-url.com\0" -"kaita.hiroshima.jp\0" -"lea\xc5\x8bgaviika.no\0\xe6\x94\xbf\xe5\xba\x9c.\xe9\xa6\x99\xe6\xb8\xaf\0" -"parliament.nz\0" -"newjersey.museum\0virgin\0" -"dnsupdate.info\0" -"mircloud.host\0" -"fortmissoula.museum\0immobilien\0" -"yao.osaka.jp\0" -"minamata.kumamoto.jp\0" -"creation.museum\0cc.va.us\0" -"porn\0daemon.panel.gg\0" -"kushiro.hokkaido.jp\0\xe5\xb9\xbf\xe4\xb8\x9c\0" -"grp.lk\0" -"monster\0" -"cooperativa.bo\0" -"jeep\0twmail.cc\0" -"i.bg\0land-4-sale.us\0" -"shinjo.okayama.jp\0" -"eidsberg.no\0" -"\xe7\xbd\x91\xe7\xab\x99\0" -"uk.net\0" -"\xe7\xbd\x91\xe5\x9d\x80\0" -"hidaka.wakayama.jp\0post\0s3-website-us-west-1.amazonaws.com\0chimkent.su\0nid.io\0" -"xen.prgmr.com\0" -"kawanishi.yamagata.jp\0b\xc3\xa1hccavuotna.no\0serveftp.com\0" -"def.br\0george\0" -"free.hr\0" -"s3.cn-north-1.amazonaws.com.cn\0" -"funabashi.chiba.jp\0" -"shimotsuke.tochigi.jp\0tysnes.no\0forgot.his.name\0es.leg.br\0" -"skjerv\xc3\xb8y.no\0" -"odo.br\0koga.ibaraki.jp\0" -"shiraoka.saitama.jp\0" -"gifts\0" -"mw.gov.pl\0" -"s3.ap-south-1.amazonaws.com\0" -"szex.hu\0gs.tm.no\0" -"lease\0" -"is-a-republican.com\0" -"\xd1\x83\xd0\xba\xd1\x80\0" -"alessandria.it\0zamami.okinawa.jp\0noip.me\0" -"tarama.okinawa.jp\0" -"tp.it\0" -"toon.ehime.jp\0" -"og.ao\0scot\0" -"condos\0" -"bod\xc3\xb8.no\0final\0caa.li\0" -"tottori.tottori.jp\0" -"indianmarket.museum\0" -"cl.it\0" -"time.no\0" -"iwate.jp\0" -"sasaguri.fukuoka.jp\0dagestan.ru\0" -"kuchinotsu.nagasaki.jp\0" -"zapto.org\0" -"crafting.xyz\0" -"tysvar.no\0" -"ms.gov.br\0" -"kiyama.saga.jp\0meguro.tokyo.jp\0film.museum\0" -"fm.br\0snoasa.no\0" -"\xd5\xb0\xd5\xa1\xd5\xb5\0" -"hachinohe.aomori.jp\0tranby.no\0" -"dagestan.su\0" -"pilot.aero\0lidl\0" -"debian.net\0" -"americanantiques.museum\0vlaanderen.museum\0" -"bergen.no\0" -"kita.tokyo.jp\0chintai\0mcpe.me\0" -"birkenes.no\0" -"kiyosu.aichi.jp\0" -"webhop.biz\0" -"iobb.net\0" -"shinonsen.hyogo.jp\0" -"dsmynas.org\0" -"dp.ua\0" -"homeunix.com\0" -"mydrobo.com\0linkyard.cloud\0" -"mt.gov.br\0ut.us\0" -"stjohn.museum\0life\0" -"umi.fukuoka.jp\0kolobrzeg.pl\0financial\0" -"wegrow.pl\0" -"charity\0" -"in-the-band.net\0" -"chita.aichi.jp\0" -"synology-diskstation.de\0" -"kouzushima.tokyo.jp\0b\xc3\xa5tsfjord.no\0vacations\0" -"tydal.no\0de.cool\0" -"uchihara.ibaraki.jp\0thruhere.net\0" -"com.ac\0boutique\0" -"com.af\0" -"com.ag\0varggat.no\0washtenaw.mi.us\0" -"takatori.nara.jp\0cc.ks.us\0" -"com.ai\0ha.no\0" -"sicilia.it\0" -"com.al\0*.nodebalancer.linode.com\0ditchyourip.com\0" -"com.am\0emp.br\0fortal.br\0andria-trani-barletta.it\0tonami.toyama.jp\0" -"inawashiro.fukushima.jp\0gangaviika.no\0" -"hiraizumi.iwate.jp\0" -"com.ba\0lefrak\0" -"com.ar\0com.bb\0karate.museum\0" -"com.au\0" -"plantation.museum\0" -"com.aw\0" -"com.bh\0" -"com.bi\0" -"com.az\0" -"saroma.hokkaido.jp\0" -"com.bm\0" -"com.bn\0" -"com.bo\0" -"com.br\0" -"com.bs\0kanagawa.jp\0" -"com.bt\0rsvp\0" -"v\xc3\xa5g\xc3\xa5.no\0" -"frog.museum\0haus\0blogdns.org\0" -"com.by\0com.ci\0" -"com.bz\0" -"com.cm\0" -"com.cn\0" -"com.co\0worse-than.tv\0" -"nore-og-uvdal.no\0" -"masoy.no\0" -"wajiki.tokushima.jp\0turen.tn\0" -"com.cu\0com.de\0" -"portland.museum\0gs.nt.no\0" -"com.cw\0" -"moss.no\0" -"com.cy\0asakawa.fukushima.jp\0apps.fbsbx.com\0" -"wajima.ishikawa.jp\0" -"fukui.fukui.jp\0" -"com.dm\0og.it\0mitoyo.kagawa.jp\0from-ne.com\0" -"l-o-g-i-n.de\0static-access.net\0" -"com.do\0" -"like\0" -"yorkshire.museum\0" -"com.ec\0fm.it\0" -"com.ee\0eu-central-1.elasticbeanstalk.com\0" -"com.eg\0" -"i.ng\0holiday\0" -"com.dz\0hichiso.gifu.jp\0" -"salat.no\0" -"nishiazai.shiga.jp\0yoga\0" -"fedorainfracloud.org\0" -"com.es\0kiso.nagano.jp\0" -"com.et\0" -"naroy.no\0" -"com.fj\0" -"miyashiro.saitama.jp\0\xe3\x82\xbb\xe3\x83\xbc\xe3\x83\xab\0" -"com.fm\0" -"svalbard.no\0" -"federation.aero\0com.fr\0" -"murata.miyagi.jp\0" -"com.ge\0" -"surgeonshall.museum\0safety\0" -"com.gh\0kv.ua\0" -"com.gi\0" -"i.ph\0limo\0" -"com.gl\0" -"sciencecenters.museum\0" -"com.gn\0" -"tamba.hyogo.jp\0" -"com.gp\0" -"com.gr\0" -"com.gt\0nagareyama.chiba.jp\0" -"com.gu\0vegas\0dd-dns.de\0" -"link\0" -"database.museum\0" -"academy.museum\0baths.museum\0" -"vic.edu.au\0com.gy\0" -"\xe0\xae\x9a\xe0\xae\xbf\xe0\xae\x99\xe0\xaf\x8d\xe0\xae\x95\xe0\xae\xaa\xe0\xaf\x8d\xe0\xae\xaa\xe0\xaf\x82\xe0\xae\xb0\xe0\xaf\x8d\0" -"com.hk\0granvin.no\0" -"com.hn\0aquila.it\0perugia.it\0" -"tagawa.fukuoka.jp\0" -"defense.tn\0" -"amagasaki.hyogo.jp\0misato.wakayama.jp\0" -"com.hr\0" -"com.ht\0amli.no\0" -"bibai.hokkaido.jp\0money\0" -"user.srcf.net\0" -"com.im\0ohi.fukui.jp\0naamesjevuemie.no\0dy.fi\0" -"wiki.bo\0fm.no\0jgora.pl\0gallery\0" -"com.io\0bolzano.it\0sandefjord.no\0freesite.host\0" -"hioki.kagoshima.jp\0" -"wiki.br\0com.iq\0s3.dualstack.us-east-2.amazonaws.com\0" -"com.is\0ogori.fukuoka.jp\0" -"k12.ok.us\0" -"saijo.ehime.jp\0" -"i.se\0" -"mosjoen.no\0" -"issmarterthanyou.com\0" -"kanna.gunma.jp\0" -"com.jo\0drangedal.no\0" -"aerodrome.aero\0lima.zone\0" -"dynalias.com\0" -"kanoya.kagoshima.jp\0" -"pacific.museum\0protection\0" -"oristano.it\0com.kg\0redstone\0" -"localhost.daplie.me\0" -"com.ki\0austevoll.no\0infiniti\0servebbs.com\0" -"nexus\0" -"trentino-sued-tirol.it\0*.0emm.com\0firewall-gateway.net\0" -"com.km\0limited\0" -"tokai.ibaraki.jp\0\xd8\xa7\xd9\x84\xd8\xa7\xd8\xb1\xd8\xaf\xd9\x86\0lotte\0" -"yura.wakayama.jp\0evje-og-hornnes.no\0" -"com.kp\0" -"com.la\0" -"iheya.okinawa.jp\0com.lb\0law.za\0" -"com.lc\0bjugn.no\0\xd8\xb4\xd8\xa8\xd9\x83\xd8\xa9\0msk.ru\0" -"com.kw\0" -"lotto\0" -"com.ky\0lib.va.us\0works\0blogsite.xyz\0" -"com.kz\0\xe0\xb6\xbd\xe0\xb6\x82\xe0\xb6\x9a\xe0\xb7\x8f\0world\0" -"londrina.br\0com.lk\0" -"nasushiobara.tochigi.jp\0" -"kurume.fukuoka.jp\0" -"glug.org.uk\0" -"adult\0" -"ms.it\0com.lr\0" -"msk.su\0ciscofreak.com\0" -"kuzumaki.iwate.jp\0juedisches.museum\0gs.aa.no\0" -"com.lv\0homegoods\0stada\0" -"com.mg\0cn.com\0" -"davvenj\xc3\xa1rga.no\0" -"minamiizu.shizuoka.jp\0com.ly\0" -"higashi.fukuoka.jp\0" -"com.mk\0wuoz.gov.pl\0" -"com.ml\0" -"kamijima.ehime.jp\0is-a-democrat.com\0" -"com.mo\0" -"com.na\0" -"*.kobe.jp\0com.ms\0" -"com.mt\0" -"com.mu\0" -"com.mv\0com.nf\0" -"ad.jp\0com.mw\0com.ng\0krokstadelva.no\0\xd8\xb9\xd8\xb1\xd8\xa8\0" -"yn.cn\0com.mx\0sokndal.no\0seat\0\xd8\xa7\xd8\xb1\xd8\xa7\xd9\x85\xd9\x83\xd9\x88\0" -"com.my\0com.ni\0" -"bolivia.bo\0ltd.cy\0otago.museum\0est-a-la-maison.com\0" -"dance\0" -"ms.kr\0" -"com.nr\0" -"sakura.chiba.jp\0" -"gz.cn\0hashbang.sh\0" -"from-tn.com\0" -"air.museum\0" -"review\0" -"\xc3\xa5rdal.no\0" -"\xe4\xbc\x81\xe4\xb8\x9a\0" -"boavista.br\0com.om\0auction\0" -"net.eu.org\0" -"dell-ogliastra.it\0live\0" -"medicina.bo\0com.pa\0is-a-nascarfan.com\0" -"taiji.wakayama.jp\0lon.wafaicloud.com\0" -"\xd0\xb4\xd0\xb5\xd1\x82\xd0\xb8\0" -"com.pe\0" -"res.in\0lebesby.no\0com.pf\0" -"valleaosta.it\0" -"artsandcrafts.museum\0com.ph\0" -"shoes\0" -"hasvik.no\0" -"com.pk\0" -"com.pl\0" -"dyr\xc3\xb8y.no\0embaixada.st\0" -"uwajima.ehime.jp\0" -"beauxarts.museum\0" -"tunes\0" -"com.qa\0" -"in.na\0namdalseid.no\0com.pr\0" -"com.ps\0uber.space\0" -"com.pt\0" -"\xe9\x80\x9a\xe8\xb2\xa9\0" -"org.ac\0" -"gjerdrum.no\0com.py\0" -"org.ae\0ltd.gi\0in.ni\0training\0" -"org.af\0philately.museum\0" -"org.ag\0" -"revista.bo\0" -"org.ai\0" -"aguni.okinawa.jp\0seek\0" -"org.al\0" -"org.am\0arakawa.tokyo.jp\0" -"k12.vi.us\0" -"r.bg\0com.re\0" -"org.ba\0" -"org.ar\0org.bb\0inder\xc3\xb8y.no\0" -"hawaii.museum\0co.network\0" -"org.au\0" -"k12.id.us\0ltd.hk\0" -"org.bh\0minano.saitama.jp\0" -"org.bi\0udono.mie.jp\0" -"org.az\0com.ro\0" -"taishi.osaka.jp\0" -"com.sa\0" -"org.bm\0oishida.yamagata.jp\0rygge.no\0com.sb\0pt.eu.org\0" -"org.bn\0naruto.tokushima.jp\0com.sc\0" -"org.bo\0com.sd\0" -"niepce.museum\0hitra.no\0com.se\0com.ru\0" -"org.br\0naka.ibaraki.jp\0com.sg\0" -"org.bs\0com.sh\0" -"org.bt\0" -"yusuhara.kochi.jp\0syncloud.it\0indowapblog.com\0" -"barsyonline.co.uk\0urown.cloud\0" -"org.bw\0com.sl\0" -"de.gt\0" -"org.ci\0com.sn\0" -"org.bz\0com.so\0" -"org.cn\0com.ss\0" -"org.co\0com.st\0nym.by\0" -"jaworzno.pl\0nym.bz\0" -"com.sv\0" -"ebina.kanagawa.jp\0" -"\xd0\xb0\xd0\xba.\xd1\x81\xd1\x80\xd0\xb1\0" -"com.sy\0\xd8\xb9\xd9\x85\xd8\xa7\xd9\x86\0" -"org.cu\0com.tj\0" -"\xd8\xb3\xd9\x88\xd8\xaf\xd8\xa7\xd9\x86\0" -"org.cw\0" -"com.tm\0ams.cloudswitches.com\0" -"org.cy\0ora.gunma.jp\0com.tn\0" -"tamano.okayama.jp\0com.to\0" -"com.ua\0" -"parliament.cy\0org.dm\0com.tr\0" -"org.do\0pt.it\0shimofusa.chiba.jp\0com.tt\0" -"nishiokoppe.hokkaido.jp\0uscountryestate.museum\0user.party.eus\0" -"ruhr\0" -"forl\xc3\xac-cesena.it\0lo.it\0com.tw\0com.ug\0" -"org.ec\0hadsel.no\0" -"abc.br\0org.ee\0" +"royrvik.no\0" +"edu.gl\0" +"k12.il.us\0" +"edu.gn\0" +"tank.museum\0" +"edu.gp\0" +"airtraffic.aero\0s3.us-east-2.amazonaws.com\0" +"edu.gr\0" +"edu.gt\0zhytomyr.ua\0" +"edu.gu\0" +"man\0mel.cloudlets.com.au\0" +"edu.gy\0gateway.museum\0ye\0map\0vlaanderen\0" +"mba\0quest\0" +"edu.hk\0" +"nozawaonsen.nagano.jp\0miyake.nara.jp\0" +"edu.hn\0" +"kiho.mie.jp\0architecture.museum\0" +"donetsk.ua\0" +"int.ar\0k.bg\0granvin.no\0" +"safe\0" +"edu.ht\0dyndns-at-work.com\0" +"nike\0" +"comunica\xc3\xa7\xc3\xb5""es.museum\0yt\0" "tselinograd.su\0" -"org.eg\0oceanographic.museum\0" -"dnsalias.org\0dyn-berlin.de\0nym.ec\0" -"org.dz\0" -"*.kunden.ortsinfo.at\0" -"com.vc\0" -"catholic.edu.au\0chikusei.ibaraki.jp\0in.rs\0" -"com.ve\0" -"artanddesign.museum\0komforb.se\0" -"org.es\0" -"org.et\0com.uy\0com.vi\0" -"state.museum\0com.uz\0appspot.com\0" -"barclays\0" -"int.ar\0ltd.lk\0" -"xj.cn\0taka.hyogo.jp\0" -"com.vn\0" -"org.fj\0" -"romskog.no\0" -"tuva.su\0" -"org.fm\0" -"plc.co.im\0leclerc\0\xe8\x81\x94\xe9\x80\x9a\0" "int.az\0" -"com.vu\0" +"kasaoka.okayama.jp\0" +"saitama.saitama.jp\0" +"edu.in\0" +"int.bo\0bizen.okayama.jp\0" +"s3-sa-east-1.amazonaws.com\0" +"edu.iq\0zm\0" +"hockey\0" +"edu.is\0from-fl.com\0hopto.org\0" +"edu.it\0" +"int.ci\0surgery\0" +"bhz.br\0" +"zw\0" +"*.jm\0ltd\0" +"int.co\0edu.jo\0" +"chiryu.aichi.jp\0" +"ce.gov.br\0konyvelo.hu\0" +"chesapeakebay.museum\0" +"tochio.niigata.jp\0" +"dnsalias.net\0" +"blogspot.co.id\0" +"modalen.no\0" +"edu.kg\0" +"*.kh\0meraker.no\0aetna\0yamaxun\0" +"edu.ki\0fedorainfracloud.org\0" +"able\0flights\0" +"virtueeldomein.nl\0hra.health\0" +"edu.km\0med\0blogspot.co.il\0" +"edu.kn\0" +"nuoro.it\0" +"isernia.it\0edu.kp\0masfjorden.no\0" +"edu.la\0mosvik.no\0" +"edu.lb\0" +"3.bg\0edu.lc\0" +"\xe3\x82\xbb\xe3\x83\xbc\xe3\x83\xab\0" +"\xe7\xa6\x8f\xe4\xba\x95.jp\0cdn-edges.net\0servehttp.com\0" +"bugatti\0" +"edu.kw\0men\0gets-it.net\0" +"bounty-full.com\0" +"edu.ky\0cust.dev.thingdust.io\0" +"edu.kz\0s3-us-west-2.amazonaws.com\0" +"edu.lk\0abo.pa\0" +"poniatowa.pl\0" +"design.museum\0" +"indianapolis.museum\0asker.no\0" +"seika.kyoto.jp\0and.museum\0" +"edu.lr\0" +"edu.ls\0\xe0\xb8\xa8\xe0\xb8\xb6\xe0\xb8\x81\xe0\xb8\xa9\xe0\xb8\xb2.\xe0\xb9\x84\xe0\xb8\x97\xe0\xb8\xa2\0" +"sa.edu.au\0" +"niiza.saitama.jp\0edu.me\0" +"edu.lv\0" +"nishiawakura.okayama.jp\0edu.mg\0buzz\0" +"edu.ly\0" +"kashihara.nara.jp\0wien\0selfip.com\0" +"edu.mk\0nesset.no\0" +"edu.ml\0co.network\0" +"*.mm\0" +"edu.mn\0tatamotors\0" +"edu.mo\0nc.tr\0" +"tree.museum\0" +"edu.ms\0is-a-financialadvisor.com\0" +"edu.mt\0oystre-slidre.no\0" +"edu.mv\0" +"numata.hokkaido.jp\0edu.mw\0edu.ng\0" +"hakone.kanagawa.jp\0edu.mx\0" +"shoo.okayama.jp\0suginami.tokyo.jp\0edu.my\0edu.ni\0" +"edu.mz\0" +"trainer.aero\0" +"is-into-games.com\0" +"catania.it\0arboretum.museum\0" +"slz.br\0" +"*.np\0ms.us\0nc.us\0" +"edu.nr\0" +"java\0sale\0am.leg.br\0iobb.net\0" +"uk.reclaim.cloud\0" +"nu.ca\0mypi.co\0" +"s3-eu-west-3.amazonaws.com\0ddns.me\0" +"yamanakako.yamanashi.jp\0" +"engineer.aero\0" +"video.hu\0edu.om\0" +"tools\0" +"edu.pa\0" +"gyeonggi.kr\0" +"b.se\0" +"mil\0edu.pe\0" +"kitahiroshima.hokkaido.jp\0edu.pf\0" +"piemonte.it\0ve.it\0*.pg\0" +"edu.ph\0" +"salud.bo\0\xd9\x83\xd8\xa7\xd8\xab\xd9\x88\xd9\x84\xd9\x8a\xd9\x83\0" +"namie.fukushima.jp\0edu.pk\0" +"ip6.arpa\0\xe7\xb6\xb2\xe7\xbb\x9c.hk\0edu.pl\0jpn.com\0workisboring.com\0" +"mit\0" +"edu.pn\0" +"iwatsuki.saitama.jp\0" +"historichouses.museum\0" +"edu.qa\0tattoo\0" +"edu.pr\0pages.wiardweb.com\0" +"int.is\0tono.iwate.jp\0edu.ps\0" +"mizuho.tokyo.jp\0edu.pt\0" +"kuzumaki.iwate.jp\0mutual\0" +"nl.no\0" +"takashima.shiga.jp\0edu.py\0" +"shizuoka.shizuoka.jp\0agency\0" +"yokohama\0" +"support\0lpusercontent.com\0" +"sabae.fukui.jp\0" +"komatsu\0" +"kuleuven.cloud\0" +"aarborte.no\0" +"tec.br\0setagaya.tokyo.jp\0celtic.museum\0" +"trentinosudtirol.it\0bellevue.museum\0" +"trentino-a-adige.it\0mlb\0" +"pueblo.bo\0" +"aridagawa.wakayama.jp\0" +"t.bg\0shirakawa.fukushima.jp\0" +"int.la\0edu.sa\0" +"edu.sb\0" +"edu.rs\0edu.sc\0" +"edu.sd\0arkhangelsk.su\0" +"wiki\0edu.ru\0cistron.nl\0" +"cnpy.gdn\0for-the.biz\0" +"toyama.toyama.jp\0stange.no\0edu.sg\0" +"rm.it\0emerck\0" +"\xe9\x80\x9a\xe8\xb2\xa9\0" +"mma\0" +"iizuna.nagano.jp\0int.lk\0" +"edu.sl\0mls\0" +"azurestaticapps.net\0" +"edu.sn\0" +"edu.so\0*.dev.adobeaemcloud.com\0" +"edu.ss\0" +"sannohe.aomori.jp\0edu.st\0t3l3p0rt.net\0" +"school.za\0" +"edu.sv\0" +"\xe7\xa6\x8f\xe5\xb2\xa1.jp\0!city.kitakyushu.jp\0\xd0\xbc\xd0\xba\xd0\xb4\0" +"edu.sy\0" +"edu.tj\0" +"nieruchomosci.pl\0" +"moareke.no\0" +"edu.tm\0" +"nomi.ishikawa.jp\0nagaokakyo.kyoto.jp\0nishihara.okinawa.jp\0lib.ne.us\0\xd0\xba\xd0\xb0\xd1\x82\xd0\xbe\xd0\xbb\xd0\xb8\xd0\xba\0" +"edu.to\0hisamitsu\0" +"hurdal.no\0" +"edu.ua\0" +"edu.tr\0" +"ap.leg.br\0" +"posts-and-telecommunications.museum\0edu.tt\0" +"iruma.saitama.jp\0" +"int.mv\0" +"int.mw\0edu.tw\0" +"fr\xc3\xb8ya.no\0" +"int.ni\0" +"oumu.hokkaido.jp\0sarl\0" +"urown.cloud\0" +"moe\0" +"fashion\0loginline.dev\0" +"ct.it\0saga.jp\0my-router.de\0" +"wine\0for-our.info\0" +"ranzan.saitama.jp\0moi\0" +"edu.vc\0crafting.xyz\0" +"he.cn\0edu.ve\0" +"kirkenes.no\0mom\0lebtimnetz.de\0" +"industries\0s3.dualstack.us-east-1.amazonaws.com\0" +"servegame.org\0" +"nu.it\0elvendrell.museum\0edu.uy\0" +"sakaiminato.tottori.jp\0" +"pmn.it\0edu.vn\0" +"market\0mov\0williamhill\0" +"ck.ua\0col.ng\0" +"kunneppu.hokkaido.jp\0okuizumo.shimane.jp\0agro.pl\0uw.gov.pl\0" +"ama.shimane.jp\0edu.vu\0" +"iwanuma.miyagi.jp\0" +"skydiving.aero\0karatsu.saga.jp\0blogspot.com.cy\0" +"k12.as.us\0nab\0" +"blogspot.co.uk\0" +"nic.in\0" +"yufu.oita.jp\0" +"abbott\0" +"edu.ws\0" +"int.pt\0" +"blogspot.com.ee\0" +"cisco\0" +"blogspot.com.eg\0" +"nba\0lima.zone\0" +"seranishi.hiroshima.jp\0institute\0" +"cymru\0" +"taiki.mie.jp\0" +"\xd0\xbc\xd0\xbe\xd0\xbd\0" +"on.ca\0blogspot.com.ar\0" +"save\0" +"edu.ye\0blogspot.com.au\0repl.co\0" +"etisalat\0" +"enebakk.no\0bss.design\0" +"storebase.store\0" +"isahaya.nagasaki.jp\0" +"skjerv\xc3\xb8y.no\0msd\0" +"agr.br\0" +"k.se\0" +"edu.za\0\xe7\xbd\x91\xe7\xab\x99\0" +"blogspot.com.br\0" +"emp.br\0soundcast.me\0" +"illustration.museum\0int.ru\0" +"pug.it\0umi.fukuoka.jp\0" +"blogspot.com.by\0" +"lavangen.no\0" +"kumiyama.kyoto.jp\0" +"edu.zm\0lplfinancial\0" +"landes.museum\0blogspot.com.co\0" +"roros.no\0" +"uozu.toyama.jp\0maserati\0" +"mtn\0" +"kawaguchi.saitama.jp\0oppeg\xc3\xa5rd.no\0" +"int.tj\0" +"mtr\0" +"nec\0weatherchannel\0sells-for-less.com\0" +"camera\0saxo\0" +"olbia-tempio.it\0" +"salangen.no\0" +"net.ac\0bentley\0" +"lotte\0no.eu.org\0" +"net.ae\0cc.oh.us\0" +"educator.aero\0net.af\0" +"net.ag\0australia.museum\0int.tt\0" +"force.museum\0thruhere.net\0" +"net.ai\0" +"slask.pl\0" +"v\xc3\xa5g\xc3\xa5.no\0" +"net.al\0" +"net.am\0" +"lotto\0" +"net\0" +"net.ba\0" +"net.ar\0net.bb\0kuju.oita.jp\0karaganda.su\0\xd1\x81\xd0\xb0\xd0\xbc\xd0\xb0\xd1\x80\xd0\xb0.\xd1\x80\xd1\x83\xd1\x81\0" +"tomobe.ibaraki.jp\0new\0" +"fuchu.toyama.jp\0sa.com\0" +"net.au\0cloudjiffy.net\0" +"blogspot.com.es\0" +"net.bh\0int.ve\0nfl\0\xe0\xa4\x95\xe0\xa5\x89\xe0\xa4\xae\0" +"blogspot.co.ke\0" +"net.az\0" +"turin.it\0halden.no\0" +"net.bm\0" +"net.bn\0farmstead.museum\0" +"net.bo\0" +"trentinostirol.it\0int.vn\0" +"net.br\0damnserver.com\0" +"net.bs\0\xd8\xa8\xd9\x8a\xd8\xaa\xd9\x83\0" +"net.bt\0tr\xc3\xb8gstad.no\0\xe7\xbd\x91\xe5\x9d\x80\0" +"isa.kagoshima.jp\0" +"\xe7\xbb\x84\xe7\xb9\x94.hk\0kppsp.gov.pl\0" +"net.ci\0" +"foz.br\0net.bz\0" +"higashihiroshima.hiroshima.jp\0ngo\0" +"sayama.saitama.jp\0hagebostad.no\0vipsinaapp.com\0" +"net.cm\0clinic\0" +"net.cn\0" +"net.co\0" +"\xe0\xae\x9a\xe0\xae\xbf\xe0\xae\x99\xe0\xaf\x8d\xe0\xae\x95\xe0\xae\xaa\xe0\xaf\x8d\xe0\xae\xaa\xe0\xaf\x82\xe0\xae\xb0\xe0\xaf\x8d\0clubmed\0lgbt\0" +"lease\0" +"baidu\0" +"go.gov.br\0" +"net.cu\0cal.it\0" +"stockholm.museum\0in-dsl.de\0" +"net.cw\0heimatunduhren.museum\0nhk\0\xe4\xba\x9a\xe9\xa9\xac\xe9\x80\x8a\0" +"net.cy\0joyo.kyoto.jp\0higashiizumo.shimane.jp\0" +"nishiizu.shizuoka.jp\0" +"kitami.hokkaido.jp\0onna.okinawa.jp\0" +"net.dm\0s3-website.us-east-2.amazonaws.com\0es-1.axarnet.cloud\0" +"monzaebrianza.it\0" +"net.do\0cc.wa.us\0" +"hob\xc3\xb8l.no\0" +"net.ec\0culturalcenter.museum\0" +"hn.cn\0" +"toyone.aichi.jp\0" +"64-b.it\0" +"net.eg\0" +"gb.com\0" +"myshopify.com\0" +"net.dz\0massa-carrara.it\0" +"adac\0" +"stjordal.no\0" +"shingu.fukuoka.jp\0kushiro.hokkaido.jp\0santacruz.museum\0" +"shimizu.shizuoka.jp\0" +"net.et\0" +"show.aero\0" +"net-freaks.com\0" +"net.fj\0" +"naka.hiroshima.jp\0" +"net.fm\0" +"blogspot.co.nz\0" +"sanuki.kagawa.jp\0asaka.saitama.jp\0" +"shimoji.okinawa.jp\0" +"sf.no\0ct.us\0" +"spy.museum\0k12.nm.us\0" +"saku.nagano.jp\0nz.eu.org\0" +"net.ge\0" +"reggiocalabria.it\0watches\0" +"net.gg\0aseral.no\0" +"kobayashi.miyazaki.jp\0iraq.museum\0" +"is-a-student.com\0" +"net.gl\0seoul.kr\0" +"nic.tj\0" +"net.gn\0" +"net.gp\0" +"nakadomari.aomori.jp\0" +"net.gr\0gold\0nokia\0" +"net.gt\0golf\0" +"net.gu\0gs.ah.no\0" +"webhop.org\0tn.oxa.cloud\0" +"dubai\0" +"net.gy\0mayfirst.info\0" +"net.hk\0" +"locker\0al.eu.org\0" +"net.hn\0erotica.hu\0horokanai.hokkaido.jp\0mj\xc3\xb8ndalen.no\0nhs.uk\0ipiranga\0" +"t.se\0" +"costume.museum\0" +"orland.no\0" +"net.ht\0net.id\0chat\0" +"yamaga.kumamoto.jp\0walbrzych.pl\0memset.net\0" +"km.ua\0blogdns.com\0" +"yamato.kumamoto.jp\0" +"net.il\0" +"net.im\0tokushima.jp\0misaki.okayama.jp\0" +"net.in\0" +"appengine.flow.ch\0" +"net.iq\0" +"net.ir\0" +"net.is\0money.museum\0vn.ua\0zapto.xyz\0" +"lib.ee\0net.je\0" +"ingatlan.hu\0bolzano.it\0" +"blogspot.com.mt\0" +"politica.bo\0" +"blogspot.com.ng\0" +"rehab\0" +"net.jo\0tec.ve\0" +"ishikawa.fukushima.jp\0" +"cc.pa.us\0" +"miyazu.kyoto.jp\0goog\0id.forgerock.io\0" +"oketo.hokkaido.jp\0" +"kamisato.saitama.jp\0net.kg\0" +"rodoy.no\0" +"valledaosta.it\0net.ki\0" +"cloud66.ws\0" +"gwangju.kr\0" +"net.kn\0" +"chuo.tokyo.jp\0roma.museum\0" +"net.la\0" +"net.lb\0" +"so.it\0net.lc\0now\0from-vt.com\0" +"\xc3\xb8vre-eiker.no\0" +"bahccavuotna.no\0" +"net.kw\0bmoattachments.org\0fastblog.net\0" +"trondheim.no\0definima.net\0" +"daisen.akita.jp\0net.ky\0flora.no\0krager\xc3\xb8.no\0" +"net.kz\0" +"net.lk\0" +"shimofusa.chiba.jp\0shibukawa.gunma.jp\0" +"konskowola.pl\0" +"matta-varjjat.no\0wuoz.gov.pl\0" +"ballooning.aero\0net.ma\0" +"net.lr\0myravendb.com\0" +"net.ls\0" +"rv.ua\0nic.za\0" +"net.me\0blogspot.com.tr\0" +"midori.gunma.jp\0net.lv\0upaas.kazteleport.kz\0" +"esan.hokkaido.jp\0cust.prod.thingdust.io\0dnsupdate.info\0" +"miyoshi.aichi.jp\0" +"net.ly\0" +"mod.gi\0net.mk\0" +"net.ml\0" +"crotone.it\0gu.us\0nra\0" +"\xe6\x95\x8e\xe8\x82\xb2.hk\0yachimata.chiba.jp\0" +"net.mo\0" +"repl.run\0" +"cc.ky.us\0" +"net.ms\0" +"net.mt\0" +"net.mu\0obi\0" +"net.mv\0net.nf\0pohl\0" +"yoshinogari.saga.jp\0net.mw\0net.ng\0" +"net.mx\0" +"campidanomedio.it\0net.my\0net.ni\0faststacks.net\0" +"veterinaire.km\0net.mz\0radom.pl\0barsy.support\0" +"taiwa.miyagi.jp\0fantasyleague.cc\0" +"mitaka.tokyo.jp\0magnet.page\0" +"semine.miyagi.jp\0" +"itano.tokushima.jp\0" +"net.nr\0" +"nrw\0" +"pg.it\0stranda.no\0" +"tonaki.okinawa.jp\0" +"sx.cn\0" +"\xe5\x85\xac\xe5\x8f\xb8.cn\0gallery.museum\0net.nz\0" +"higashitsuno.kochi.jp\0" +"tsuno.miyazaki.jp\0net.om\0" +"iron.museum\0" +"cust.disrec.thingdust.io\0" +"net.pa\0mlbfan.org\0" +"hembygdsforbund.museum\0" +"hokuto.hokkaido.jp\0" +"iki.nagasaki.jp\0net.pe\0um.gov.pl\0" +"moseushi.hokkaido.jp\0hjartdal.no\0" +"\xe5\x85\xac\xe5\x8f\xb8.hk\0rollag.no\0" +"net.ph\0s3.dualstack.ca-central-1.amazonaws.com\0" +"olecko.pl\0" +"itau\0" +"net.pk\0co.krd\0" +"net.pl\0\xe6\x95\x99\xe8\x82\xb2.\xe9\xa6\x99\xe6\xb8\xaf\0" +"net.pn\0from-ak.com\0" +"bando.ibaraki.jp\0cultural.museum\0s3-website-us-east-1.amazonaws.com\0" +"fukushima.jp\0vevelstad.no\0homesense\0ntt\0" +"net.qa\0" +"net.pr\0" +"net.ps\0cc.ia.us\0" +"shimizu.hokkaido.jp\0net.pt\0" +"blogspot.co.za\0" +"pp.az\0" +"discourse.group\0" +"sn\xc3\xa5""ase.no\0net.py\0" +"andriabarlettatrani.it\0" +"groundhandling.aero\0bbs.tr\0lon-2.paas.massivegrid.net\0wellbeingzone.eu\0" +"an.it\0" +"avocat.pro\0" +"veterinaire.fr\0" +"off\0" +"obu.aichi.jp\0" +"lo.it\0" +"nakatsugawa.gifu.jp\0" +"luzern.museum\0" +"misasa.tottori.jp\0amli.no\0" +"ojiya.niigata.jp\0" +"iitate.fukushima.jp\0" +"vardo.no\0" +"flight.aero\0blogspot.com.uy\0" +"citic\0square7.net\0dvrcam.info\0" +"furniture.museum\0net.sa\0" +"net.sb\0" +"tomika.gifu.jp\0net.sc\0kicks-ass.net\0" +"net.sd\0" +"egersund.no\0net.ru\0" +"kv.ua\0" +"h\xc3\xa1""bmer.no\0net.rw\0net.sg\0aquarelle\0" +"net.sh\0tel.tr\0" +"gliwice.pl\0" +"net.sl\0" +"net.so\0" +"bjarkoy.no\0" +"net.ss\0" +"net.st\0" +"us.gov.pl\0" +"instantcloud.cn\0" +"hole.no\0net.th\0" +"net.sy\0edu.krd\0" +"net.tj\0dnsalias.org\0" +"net.tm\0" +"net.tn\0" +"tonsberg.no\0net.to\0nyc\0" +"net.ua\0" +"net.tr\0" +"net.tt\0" +"*.lcl.dev\0" +"froland.no\0sor-aurdal.no\0" +"net.tw\0" +"yura.wakayama.jp\0" +"net.uk\0baseball\0" +"bo.telemark.no\0cleaning\0" +"net.vc\0\xd8\xa8\xd8\xa7\xd8\xb1\xd8\xaa\0" +"lea\xc5\x8bgaviika.no\0net.ve\0*.stg.dev\0" +"consulado.st\0" +"hidaka.hokkaido.jp\0nayoro.hokkaido.jp\0yoga\0" +"net.uy\0net.vi\0" +"!city.sapporo.jp\0net.uz\0" +"gol.no\0" +"net.vn\0" +"nishinomiya.hyogo.jp\0" +"pixolino.com\0" +"dynalias.com\0for-some.biz\0" +"net.vu\0" +"tydal.no\0" +"is-a-chef.org\0ric.jelastic.vps-host.net\0" +"srv.br\0" +"yatomi.aichi.jp\0" +"net.ws\0" +"scot\0" +"university.museum\0ebiz.tw\0cdn77-ssl.net\0" +"minato.osaka.jp\0porn\0" +"akita.akita.jp\0" +"\xe8\x81\x94\xe9\x80\x9a\0" +"marche.it\0rakkestad.no\0" +"nysa.pl\0" +"ravendb.community\0" +"namerikawa.toyama.jp\0" +"transport.museum\0net.ye\0" +"mormon\0" +"aizubange.fukushima.jp\0nishitosa.kochi.jp\0" +"!city.kawasaki.jp\0" +"moskenes.no\0auspost\0" +"wa.gov.au\0larsson.museum\0aurskog-holand.no\0post\0" +"service.gov.uk\0" +"naamesjevuemie.no\0" +"net.za\0one\0" +"fnd.br\0shizuoka.jp\0ong\0" +"catholic\0" +"cloudaccess.host\0" +"toray\0" +"kitamoto.saitama.jp\0onl\0homeip.net\0" +"west1-us.cloudjiffy.net\0" +"myqnapcloud.com\0" +"kr\xc3\xb8""dsherad.no\0" +"chuo.chiba.jp\0net.zm\0ny-1.paas.massivegrid.net\0" +"lib.wa.us\0" +"nissan\0" +"columbus.museum\0is-saved.org\0" +"s3-ap-northeast-1.amazonaws.com\0" +"tinn.no\0pinb.gov.pl\0mt.eu.org\0" +"tksat.bo\0kariwa.niigata.jp\0" +"ichinohe.iwate.jp\0" +"bg.it\0" +"friuliveneziagiulia.it\0blogsite.org\0" +"nissay\0ooo\0" +"alto-adige.it\0" +"kamisunagawa.hokkaido.jp\0" +"ichikawa.chiba.jp\0kamikawa.hokkaido.jp\0" +"storage\0" +"morotsuka.miyazaki.jp\0wake.okayama.jp\0karelia.su\0" +"is-a-knight.org\0" +"takamatsu.kagawa.jp\0" +"oxa.cloud\0" +"\xe9\xb3\xa5\xe5\x8f\x96.jp\0varoy.no\0" +"is-a-chef.com\0" +"arna.no\0law.pro\0" +"kawaue.gifu.jp\0naha.okinawa.jp\0" +"h\xc3\xa1mm\xc3\xa1rfeasta.no\0wielun.pl\0" +"unzen.nagasaki.jp\0itoigawa.niigata.jp\0" +"research.aero\0" +"andria-trani-barletta.it\0akaiwa.okayama.jp\0org\0" +"\xe0\xb8\x97\xe0\xb8\xab\xe0\xb8\xb2\xe0\xb8\xa3.\xe0\xb9\x84\xe0\xb8\x97\xe0\xb8\xa2\0" +"pay\0" +"construction\0" +"culture.museum\0" +"koori.fukushima.jp\0kiwa.mie.jp\0" +"iwamizawa.hokkaido.jp\0" +"kaga.ishikawa.jp\0" +"rsvp\0" +"horology.museum\0" +"gsm.pl\0neustar\0" +"chtr.k12.ma.us\0" +"cesenaforl\xc3\xac.it\0indowapblog.com\0" +"ureshino.mie.jp\0manx.museum\0" +"consulting\0" +"muroto.kochi.jp\0" +"tsuruoka.yamagata.jp\0reviews\0" +"\xd0\xbe\xd1\x80\xd0\xb3\0" +"click\0" +"*.northflank.app\0" +"from-ri.com\0" +"budejju.no\0" +"otaki.chiba.jp\0" +"aid.pl\0" +"odesa.ua\0" +"sarpsborg.no\0" +"kasserver.com\0" +"ott\0" +"kashima.ibaraki.jp\0kosuge.yamanashi.jp\0russia.museum\0cc.az.us\0lib.pa.us\0" +"toya.hokkaido.jp\0" +"akashi.hyogo.jp\0" +"academia.bo\0" +"cri.br\0" +"friuli-vgiulia.it\0\xe5\xb1\xb1\xe5\xbd\xa2.jp\0lukow.pl\0" +"leirfjord.no\0my-wan.de\0" +"pet\0" +"ora.gunma.jp\0pp.se\0pp.ru\0" +"kumamoto.jp\0kvinnherad.no\0ovh\0" +"better-than.tv\0" +"cable-modem.org\0" +"boats\0wales\0" +"salerno.it\0" +"sauherad.no\0" +"trani-barletta-andria.it\0county.museum\0" +"toyota\0" +"cuiaba.br\0" +"\xc3\xa5mot.no\0kongsberg.no\0" +"starostwo.gov.pl\0" +"yamato.fukushima.jp\0hornindal.no\0" +"gmina.pl\0jp.net\0" +"pp.ua\0" +"k12.co.us\0" +"\xd0\xb4\xd0\xb5\xd1\x82\xd0\xb8\0" +"prato.it\0phd\0" +"osaki.miyagi.jp\0" +"\xe7\xb5\x84\xe7\xbb\x87.hk\0lib.mi.us\0" +"kuriyama.hokkaido.jp\0is-very-evil.org\0" +"mihara.kochi.jp\0jeep\0marriott\0" +"ce.leg.br\0" +"askvoll.no\0mincom.tn\0" +"financial\0casacam.net\0smushcdn.com\0" +"mex.com\0" +"mordovia.su\0" +"safety\0" +"pid\0" +"civilisation.museum\0my.eu.org\0app.os.fedoraproject.org\0" +"recife.br\0gotsu.shimane.jp\0\xe4\xb8\xad\xe5\x9b\xbd\0" +"lidl\0hostedpi.com\0" +"cooperativa.bo\0sunndal.no\0" +"pin\0" +"ryukyu\0twmail.net\0" +"loginline.app\0" +"na.it\0karlsoy.no\0daemon.panel.gg\0" +"hair\0" +"from-sd.com\0in.london\0" +"hatoyama.saitama.jp\0\xe4\xb8\xad\xe5\x9c\x8b\0" +"pizza\0" +"ueno.gunma.jp\0" +"friuli-venezia-giulia.it\0ras.ru\0" +"loseyourip.com\0" +"higashi.fukushima.jp\0" +"life\0" +"lib.ia.us\0" +"dyndns1.de\0" +"aero\0" +"busan.kr\0*.hosting.ovh.net\0" +"troandin.no\0" +"grainger\0" +"mordovia.ru\0" +"gitlab.io\0" +"k12.wi.us\0" +"balsfjord.no\0is-a-geek.com\0*.transurl.be\0" +"mayfirst.org\0" +"us.com\0" +"reisen\0" +"wy.us\0sellsyourhome.org\0" +"diamonds\0ua.rs\0" +"showa.gunma.jp\0stream\0" +"yk.ca\0" +"sande.more-og-romsdal.no\0" +"tosa.kochi.jp\0resistance.museum\0" +"carrd.co\0" +"kakinoki.shimane.jp\0" +"vic.au\0dr\xc3\xb8""bak.no\0swiebodzin.pl\0" +"gen.mi.us\0" +"aeroclub.aero\0" +"\xe8\x8c\xa8\xe5\x9f\x8e.jp\0est-a-la-masion.com\0" +"labor.museum\0eurodir.ru\0" +"ohda.shimane.jp\0edgestack.me\0" +"wakasa.fukui.jp\0vip.jelastic.cloud\0" +"taira.toyama.jp\0ngo.lk\0pnc\0" +"indigena.bo\0uto.kumamoto.jp\0" +"okegawa.saitama.jp\0lancashire.museum\0" +"sorfold.no\0" +"seat\0" +"chase\0" +"forex\0phx.enscaled.us\0" +"trentinosued-tirol.it\0" +"kazo.saitama.jp\0" +"notaires.km\0" +"yoka.hyogo.jp\0fh.se\0kerryhotels\0nl.eu.org\0" +"cc.mt.us\0cc.nd.us\0" +"us.ax\0" +"\xd8\xa7\xd9\x8a\xd8\xb1\xd8\xa7\xd9\x86\0copro.uk\0" +"stryn.no\0citi\0""1337.pictures\0" +"\xd0\xbe\xd0\xb1\xd1\x80.\xd1\x81\xd1\x80\xd0\xb1\0ngo.ng\0" +"i.bg\0" +"hamatama.saga.jp\0" +"mazury.pl\0like\0" +"webhop.net\0*.transurl.eu\0" +"championship.aero\0" +"dyndns-wiki.com\0" +"kommune.no\0city\0eu-central-1.elasticbeanstalk.com\0" +"kviteseid.no\0" +"berg.no\0jcloud.ik-server.com\0""1kapp.com\0" +"reise\0" +"naroy.no\0" +"monticello.museum\0" +"v-info.info\0" +"interactive.museum\0" +"azerbaijan.su\0" +"sande.m\xc3\xb8re-og-romsdal.no\0sytes.net\0" +"fishing\0s3.dualstack.ap-southeast-2.amazonaws.com\0" +"from-ms.com\0from-nc.com\0" +"ngo.ph\0seek\0fbxos.fr\0" +"federation.aero\0" +"figueres.museum\0" +"eidskog.no\0" +"graz.museum\0store\0enscaled.sg\0" +"obama.nagasaki.jp\0" +"kyoto.jp\0" +"cri.nz\0abogado\0asso.eu.org\0" +"jgora.pl\0dyn53.io\0" +"defense.tn\0" +"pro\0limo\0" +"salvador.br\0minamioguni.kumamoto.jp\0minano.saitama.jp\0lifestyle\0n4t.co\0" +"1.bg\0" +"ci.it\0kamigori.hyogo.jp\0" +"pru\0discourse.team\0" +"\xd0\xbc\xd1\x81\xd0\xba.\xd1\x80\xd1\x83\xd1\x81\0" +"etne.no\0" +"parma.it\0sk\xc3\xa1nit.no\0kicks-ass.org\0" +"itayanagi.aomori.jp\0kobierzyce.pl\0link\0" +"nakagawa.hokkaido.jp\0" +"ichinomiya.aichi.jp\0portal.museum\0" +"police.uk\0" +"zamami.okinawa.jp\0" +"motoyama.kochi.jp\0" +"okagaki.fukuoka.jp\0" +"actor\0" +"k12.az.us\0" +"ogano.saitama.jp\0estate\0statefarm\0" +"pub\0" +"ruhr\0" +"feira.br\0k12.la.us\0ng.eu.org\0" +"progressive\0" +"trentino-altoadige.it\0" +"gamagori.aichi.jp\0tula.su\0" +"ukiha.fukuoka.jp\0shw.io\0" +"saintlouis.museum\0ic.gov.pl\0" +"ullensaker.no\0stuff-4-sale.org\0" +"courses\0haus\0" +"ns.ca\0" +"\xd9\xbe\xd8\xa7\xd9\x83\xd8\xb3\xd8\xaa\xd8\xa7\xd9\x86\0" +"agematsu.nagano.jp\0" +"workshop.museum\0mail.pl\0est-le-patron.com\0" +"tsuga.tochigi.jp\0" +"engineer\0" +"servemp3.com\0" +"dell-ogliastra.it\0higashikagura.hokkaido.jp\0" +"trentino-sued-tirol.it\0klabu.no\0" +"gniezno.pl\0" +"lima-city.rocks\0" +"is-a-geek.org\0" +"cruise\0pwc\0" +"wazuka.kyoto.jp\0\xe4\xbf\xa1\xe6\x81\xaf\0" +"portlligat.museum\0" +"palermo.it\0bearalv\xc3\xa1hki.no\0" +"vc.it\0oguni.kumamoto.jp\0lilly\0" +"saobernardo.br\0barsy.menu\0" +"gs.vf.no\0is-a-chef.net\0" +"isleofman.museum\0" +"childrensgarden.museum\0turek.pl\0" +"vercel.app\0" +"ushistory.museum\0" +"us.kg\0" +"nishiazai.shiga.jp\0" +"trentin-s\xc3\xbc""d-tirol.it\0" +"inderoy.no\0" +"honbetsu.hokkaido.jp\0*.transurl.nl\0" +"omega\0" +"university\0" +"tsubame.niigata.jp\0ris\xc3\xb8r.no\0couk.me\0pgafan.net\0" +"matsuzaki.shizuoka.jp\0vindafjord.no\0cc.nm.us\0" +"mein-vigor.de\0" +"hidaka.saitama.jp\0hikawa.shimane.jp\0myfirewall.org\0" +"goiania.br\0" +"r.bg\0from-de.com\0" +"port.fr\0" +"savona.it\0" +"log.br\0" +"americanantiques.museum\0" +"wolomin.pl\0game-server.cc\0" +"midori.chiba.jp\0suzaka.nagano.jp\0mintere.site\0" +"trentinoa-adige.it\0" +"shinagawa.tokyo.jp\0s\xc3\xb8rum.no\0ulvik.no\0" +"\xc3\xa5seral.no\0os.hedmark.no\0" +"katsuragi.wakayama.jp\0" +"nakai.kanagawa.jp\0" +"vet.br\0us.na\0" +"live\0" +"ngo.za\0" +"kofu.yamanashi.jp\0froya.no\0" +"swidnik.pl\0" +"veneto.it\0" +"lamborghini\0" +"bashkiria.ru\0" +"yoshioka.gunma.jp\0i.ng\0ga.us\0" +"bayern\0" +"*.dweb.link\0" +"correios-e-telecomunica\xc3\xa7\xc3\xb5""es.museum\0" +"eid.no\0go.leg.br\0" +"industria.bo\0" +"cr.it\0bashkiria.su\0remotewd.com\0" +"reggioemilia.it\0\xd8\xa7\xdb\x8c\xd8\xb1\xd8\xa7\xd9\x86\0" +"kozaki.chiba.jp\0sekikawa.niigata.jp\0" +"gs.cn\0clic2000.net\0" +"eu-west-2.elasticbeanstalk.com\0radio.am\0" +"musashino.tokyo.jp\0byen.site\0" +"sd.cn\0gs.of.no\0total\0" +"scientist.aero\0" +"itakura.gunma.jp\0" +"rome.it\0i.ph\0forum\0yandexcloud.net\0" +"kasumigaura.ibaraki.jp\0gran.no\0\xd9\x81\xd9\x84\xd8\xb3\xd8\xb7\xd9\x8a\xd9\x86\0" +"misaki.osaka.jp\0" +"nishimera.miyazaki.jp\0\xe5\xb9\xbf\xe4\xb8\x9c\0caa.li\0" +"bungotakada.oita.jp\0myfast.space\0" +"radio.br\0benevento.it\0" +"kadogawa.miyazaki.jp\0oishida.yamagata.jp\0cancerresearch\0" +"hs.run\0" +"rishiri.hokkaido.jp\0" +"k12.md.us\0" +"arita.saga.jp\0" +"nanmoku.gunma.jp\0ogawa.ibaraki.jp\0" +"homeunix.net\0" +"toki.gifu.jp\0nj.us\0\xe3\x81\xbf\xe3\x82\x93\xe3\x81\xaa\0" +"taxi.br\0dev-myqnapcloud.com\0" +"lynx.mythic-beasts.com\0" +"es.gov.br\0shiga.jp\0" +"bible.museum\0naumburg.museum\0imamat\0verm\xc3\xb6gensberater\0" +"tingvoll.no\0s3-website.ca-central-1.amazonaws.com\0" +"ac.ae\0" +"fuettertdasnetz.de\0" +"kitakata.miyazaki.jp\0nakagawa.tokushima.jp\0i.se\0" +"leksvik.no\0" +"philips\0krellian.net\0" +"hachirogata.akita.jp\0otake.hiroshima.jp\0" +"shimane.shimane.jp\0" +"trentinsud-tirol.it\0horonobe.hokkaido.jp\0report\0" +"arq.br\0s3-website-sa-east-1.amazonaws.com\0r.cdn77.net\0" +"allstate\0" +"mill.museum\0upow.gov.pl\0" +"ac.at\0ashiya.hyogo.jp\0loyalist.museum\0vinnytsia.ua\0" +"ac.be\0yamatokoriyama.nara.jp\0" +"redirectme.net\0" +"miyoshi.tokushima.jp\0vossevangen.no\0" +"council.aero\0kawasaki.miyagi.jp\0" +"karikatur.museum\0" +"sex.hu\0" +"delivery\0" +"nanjo.okinawa.jp\0" +"sakura.chiba.jp\0cc.de.us\0radio.fm\0" +"fjell.no\0" +"fudai.iwate.jp\0" +"mishima.shizuoka.jp\0privatizehealthinsurance.net\0" +"fylkesbibl.no\0\xe0\xb2\xad\xe0\xb2\xbe\xe0\xb2\xb0\xe0\xb2\xa4\0cyon.site\0" +"tokai.ibaraki.jp\0kanuma.tochigi.jp\0dyndns.dappnode.io\0" +"chikuho.fukuoka.jp\0""0e.vc\0" +"ac.ci\0alesund.no\0cc.nv.us\0" +"tahara.aichi.jp\0karumai.iwate.jp\0mydatto.net\0" +"guitars\0hobby-site.org\0" +"ac.cn\0kurate.fukuoka.jp\0" +"skanit.no\0" +"ac.cr\0\xe7\xbd\x91\xe7\xbb\x9c\0" +"sakura.tochigi.jp\0" +"assabu.hokkaido.jp\0we.bs\0" +"reklam.hu\0" +"biz.bb\0ac.cy\0" +"biz.at\0" +"jamison.museum\0" +"gangwon.kr\0onavstack.net\0" +"daiwa.hiroshima.jp\0*.magentosite.cloud\0" +"biz.az\0baseball.museum\0\xe5\x95\x86\xe6\xa5\xad.tw\0freeboxos.fr\0" +"serveexchange.com\0gotpantheon.com\0" +"sherbrooke.museum\0" +"arai.shizuoka.jp\0" +"lundbeck\0" +"red\0" +"teshikaga.hokkaido.jp\0" +"lier.no\0" +"cs.keliweb.cloud\0" +"zara\0" +"hokuto.yamanashi.jp\0" +"medecin.km\0santafe.museum\0spydeberg.no\0" +"fukumitsu.toyama.jp\0ren\0sexy\0" +"odawara.kanagawa.jp\0" +"servehumour.com\0" +"ac.fj\0kraanghke.no\0qvc\0" +"\xe7\xb5\x84\xe7\xb9\x94.\xe9\xa6\x99\xe6\xb8\xaf\0" +"biz.cy\0" +"kitashiobara.fukushima.jp\0minato.tokyo.jp\0youth.museum\0biz.dk\0" +"expert\0" +"exhibition.museum\0" +"hl.cn\0americana.museum\0" +"graphox.us\0" +"noho.st\0" +"photography.museum\0" +"ac.gn\0jogasz.hu\0" +"basel.museum\0" +"\xd1\x80\xd1\x83\xd1\x81\0" +"cr.ua\0" +"winners\0" +"pesarourbino.it\0" +"sennan.osaka.jp\0oracle\0" +"autos\0" +"ed.ao\0abeno.osaka.jp\0immobilien\0" +"biz.et\0omi.niigata.jp\0" +"plantation.museum\0" +"shobara.hiroshima.jp\0" +"kujukuri.chiba.jp\0" +"nishi.fukuoka.jp\0" +"biz.fj\0" +"\xd8\xb9\xd8\xb1\xd8\xa8\0" +"ac.id\0" +"boehringer\0meinforum.net\0" +"cosenza.it\0" +"tsukumi.oita.jp\0nachikatsuura.wakayama.jp\0prod\0poznan.pl\0gov.scot\0" +"ascolipiceno.it\0familyds.com\0" +"topology.museum\0prof\0" +"ac.il\0physio\0" +"ac.im\0" +"ac.in\0romskog.no\0" +"newjersey.museum\0" +"ac.ir\0delmenhorst.museum\0sex.pl\0" +"\xc4\x8d\xc3\xa1hcesuolo.no\0ril\0biz.gl\0ditchyourip.com\0" +"ed.ci\0chambagri.fr\0" +"pe.ca\0karmoy.no\0" +"rio\0" +"rip\0torproject.net\0" +"ed.cr\0tama.tokyo.jp\0mosj\xc3\xb8""en.no\0" +"zaporizhzhia.ua\0" +"notaires.fr\0lavagis.no\0" +"ac.jp\0rovno.ua\0" +"natural.bo\0hotmail\0" +"r.se\0" +"ac.ke\0" +"cloud.fedoraproject.org\0vs.mythic-beasts.com\0za.net\0" +"eng.br\0shijonawate.osaka.jp\0" +"yasuda.kochi.jp\0" +"sci.eg\0nogi.tochigi.jp\0" +"biz.id\0cpa.pro\0" +"dabur\0" +"frog.museum\0grajewo.pl\0" +"ac.kr\0" +"safety.aero\0cloudns.biz\0" +"ol.no\0" +"endoftheinternet.org\0" +"tochigi.jp\0" +"nango.fukushima.jp\0" +"ac.lk\0" +"museum\0" +"ac.ma\0k12.tn.us\0" +"matera.it\0alstom\0ferrari\0" +"ono.fukui.jp\0shimokitayama.nara.jp\0ac.ls\0" +"kitagawa.kochi.jp\0tachikawa.tokyo.jp\0" +"ac.me\0hawaii.museum\0coupons\0" +"phoenix.museum\0" +"fastvps-server.com\0" +"tozawa.yamagata.jp\0uenohara.yamanashi.jp\0" +"kamiichi.toyama.jp\0" +"biz.ki\0loginline.io\0" +"furubira.hokkaido.jp\0servehalflife.com\0" +"nagai.yamagata.jp\0washtenaw.mi.us\0" +"ac.mu\0bale.museum\0" +"ac.mw\0lefrak\0" +"eu.pythonanywhere.com\0" +"suzuka.mie.jp\0ac.ni\0twmail.org\0" +"ac.mz\0linde\0togliatti.su\0" +"friuli-veneziagiulia.it\0square7.de\0" +"ikata.ehime.jp\0" +"lindesnes.no\0" +"b.ssl.fastly.net\0" +"hikari.yamaguchi.jp\0opoczno.pl\0" +"shirosato.ibaraki.jp\0" +"lib.ct.us\0" +"fujinomiya.shizuoka.jp\0" +"itoman.okinawa.jp\0\xd5\xb0\xd5\xa1\xd5\xb5\0" +"fujikawa.shizuoka.jp\0" +"biz.ls\0ac.nz\0" +"filegear-jp.me\0" +"consultant.aero\0ferrara.it\0ac.pa\0serveblog.net\0" +"africa.com\0" +"valle.no\0amfam\0" +"watchandclock.museum\0is-a-nurse.com\0miniserver.com\0" +"hamamatsu.shizuoka.jp\0drangedal.no\0" +"sd.us\0" +"ham-radio-op.net\0" +"biz.mv\0" +"pro.az\0biz.mw\0" +"biz.my\0biz.ni\0" +"shinonsen.hyogo.jp\0url.tw\0" +"tsumagoi.gunma.jp\0ac.pr\0" +"giessen.museum\0" +"pro.br\0ravendb.run\0" +"ritto.shiga.jp\0" +"pe.it\0" +"biz.nr\0" +"camdvr.org\0" +"ed.jp\0" +"s3-website.ap-northeast-2.amazonaws.com\0" +"square7.ch\0" +"sinaapp.com\0" +"tohnosho.chiba.jp\0" +"lib.al.us\0" +"wpenginepowered.com\0" +"sap\0" +"ravenna.it\0marugame.kagawa.jp\0atsugi.kanagawa.jp\0" +"hl.no\0" +"software.aero\0sas\0" +"unnan.shimane.jp\0" +"miyama.fukuoka.jp\0toride.ibaraki.jp\0mattel\0" +"pro.cy\0" +"rugby\0" +"doomdns.com\0" +"aso.kumamoto.jp\0sbi\0" +"xnbay.com\0" +"navigation.aero\0divttasvuotna.no\0biz.pk\0" +"biz.pl\0ac.rs\0k12.mn.us\0" +"ac.se\0energy\0radio\0ac.ru\0is-a-geek.net\0" +"pe.kr\0" +"pro.ec\0kisarazu.chiba.jp\0drobak.no\0ac.rw\0" +"sca\0" +"heguri.nara.jp\0biz.pr\0scb\0" +"sbs\0" +"homebuilt.aero\0miyoshi.hiroshima.jp\0" +"karasjok.no\0" +"soka.saitama.jp\0" +"al.it\0" +"sumoto.hyogo.jp\0" +"friulivenezia-giulia.it\0\xd1\x81\xd1\x80\xd0\xb1\0*.0emm.com\0" +"amagasaki.hyogo.jp\0" +"rhcloud.com\0" +"ac.th\0" +"eco.br\0ac.sz\0ac.tj\0juegos\0" +"windmill.museum\0" +"forum.hu\0" +"tarama.okinawa.jp\0artdeco.museum\0ilawa.pl\0" +"pro.fj\0" +"oncilla.mythic-beasts.com\0" +"accountants\0avianca\0" +"ikusaka.nagano.jp\0b\xc3\xb8mlo.no\0" +"author.aero\0" +"we.tc\0" +"fyresdal.no\0ac.ug\0" +"lincoln.museum\0ac.tz\0" +"ac.uk\0from-va.com\0" +"kawara.fukuoka.jp\0" +"webhop.info\0" +"kr\xc3\xa5""anghke.no\0lib.gu.us\0" +"utah.museum\0be.ax\0" +"kvanangen.no\0" +"soc.dz\0" +"h\xc3\xa5.no\0s3.cn-north-1.amazonaws.com.cn\0" +"sciences.museum\0" +"takazaki.miyazaki.jp\0and\xc3\xb8y.no\0limited\0run\0" +"mycloud.by\0bloxcms.com\0" +"misato.wakayama.jp\0" +"biz.ss\0ses\0" +"watch-and-clock.museum\0akrehamn.no\0" +"hdfc\0" +"ac.vn\0sew\0" +"sex\0" +"takamori.kumamoto.jp\0biz.tj\0" +"def.br\0" +"legal\0platform0.app\0" +"itabashi.tokyo.jp\0\xe9\xa3\x9e\xe5\x88\xa9\xe6\xb5\xa6\0" +"takahagi.ibaraki.jp\0yodobashi\0" +"pro.ht\0kyotanabe.kyoto.jp\0kautokeino.no\0biz.ua\0" +"kuroishi.aomori.jp\0biz.tr\0sfr\0" +"niimi.okayama.jp\0" +"agriculture.museum\0biz.tt\0" +"versailles.museum\0rwe\0" +"!city.nagoya.jp\0" +"platter-app.dev\0" +"ed.pw\0" +"sv.it\0biratori.hokkaido.jp\0" +"nose.osaka.jp\0" +"lasalle\0" +"krakow.pl\0" +"al.no\0" +"olawa.pl\0wien.funkfeuer.at\0" +"lur\xc3\xb8y.no\0" +"chernovtsy.ua\0" +"\xd0\xb0\xd0\xba.\xd1\x81\xd1\x80\xd0\xb1\0" +"bruxelles.museum\0sm.ua\0" +"biz.vn\0\xd8\xa7\xd9\x84\xd9\x8a\xd9\x85\xd9\x86\0" +"operaunite.com\0" +"medecin.fr\0mywire.org\0" +"nakano.tokyo.jp\0skiptvet.no\0" +"netlify.app\0" +"limanowa.pl\0" +"yandex\0" +"ac.za\0" +"her\xc3\xb8y.nordland.no\0" +"in-the-band.net\0" +"kyowa.hokkaido.jp\0""611.to\0" +"ac.zm\0travelers\0" +"funahashi.toyama.jp\0tysfjord.no\0" +"oppdal.no\0" +"minamiminowa.nagano.jp\0" +"pn.it\0pictures\0" +"ac.zw\0gitapp.si\0" +"miura.kanagawa.jp\0" +"uslivinghistory.museum\0" +"ski\0""12hp.de\0" +"zachpomor.pl\0is-a-green.com\0be.gy\0" +"hamburg\0" +"blackbaudcdn.net\0" +"pro.na\0homeunix.org\0" +"aisho.shiga.jp\0verdal.no\0" +"pro.mv\0foodnetwork\0" +"servesarcasm.com\0" +"sky\0" +"miharu.fukushima.jp\0\xd0\xbc\xd0\xbe\xd1\x81\xd0\xba\xd0\xb2\xd0\xb0\0" +"soc.lk\0" +"depot.museum\0biz.zm\0" +"insurance.aero\0waw.pl\0" +"tana.no\0" +"okinawa.jp\0forde.no\0" +"ginan.gifu.jp\0" +"tokigawa.saitama.jp\0gitpage.si\0" +"cheap\0" +"takinoue.hokkaido.jp\0sydney.museum\0""12hp.at\0" +"otobe.hokkaido.jp\0kaisei.kanagawa.jp\0versicherung\0" +"pro.om\0" +"ass.km\0" +"vercel.dev\0" +"georgia.su\0" +"shopitsite.com\0" +"sukumo.kochi.jp\0" +"agdenes.no\0own.pm\0" +"off.ai\0" +"london.cloudapps.digital\0" +"cloudfront.net\0" +"training\0" +"wakuya.miyagi.jp\0brandywinevalley.museum\0" +"orsites.com\0" +"shaw\0""12hp.ch\0" +"monzaedellabrianza.it\0melhus.no\0" +"matsubara.osaka.jp\0" +"ma.gov.br\0dovre.no\0pro.pr\0" +"oygarden.no\0" +"\xd0\xbe\xd1\x80\xd0\xb3.\xd1\x81\xd1\x80\xd0\xb1\0" +"misawa.aomori.jp\0" +"maibara.shiga.jp\0health.museum\0" +"tours\0" +"s3-ap-northeast-2.amazonaws.com\0" +"al.us\0to.gt\0" +"\xec\x82\xbc\xec\x84\xb1\0" +"\xe5\x80\x8b\xe4\xba\xba.hk\0" +"pulawy.pl\0" +"sorum.no\0no-ip.org\0" +"spa\0" +"okoppe.hokkaido.jp\0sosnowiec.pl\0holdings\0" +"higashiomi.shiga.jp\0" +"club\0" +"wloclawek.pl\0" +"kosai.shizuoka.jp\0nasushiobara.tochigi.jp\0soy\0" +"aland.fi\0altervista.org\0" +"sor-odal.no\0global.prod.fastly.net\0" +"s3-website-us-west-2.amazonaws.com\0" +"clinique\0" +"udine.it\0turystyka.pl\0" +"tab\0" +"mo.cn\0dnsdojo.com\0" +"*.developer.app\0" +"to.it\0bydgoszcz.pl\0" +"aioi.hyogo.jp\0tsunan.niigata.jp\0nsupdate.info\0" +"tsurugashima.saitama.jp\0" +"sld.do\0gs.tr.no\0" +"workers.dev\0" +"philately.museum\0pomorze.pl\0" +"brindisi.it\0" +"natori.miyagi.jp\0" +"naustdal.no\0fastlylb.net\0" +"athleta\0tax\0" +"nis.za\0" +"miyashiro.saitama.jp\0" +"kisofukushima.nagano.jp\0" +"srl\0" +"kawanishi.hyogo.jp\0rade.no\0" +"appchizi.com\0" +"spacekit.io\0" +"torsken.no\0pro.tt\0" +"kashima.saga.jp\0" +"tsuno.kochi.jp\0" +"cc.mi.us\0" +"society.museum\0" +"ogata.akita.jp\0tci\0" +"royken.no\0academy\0" +"jampa.br\0work\0" +"film.museum\0gos.pk\0definima.io\0" +"milan.it\0" +"stc\0" +"xs4all.space\0" +"spjelkavik.no\0stcgroup\0" +"to.md\0" +"mining.museum\0" +"pro.vn\0tdk\0" +"nature.museum\0in.na\0" +"friulivegiulia.it\0miyagi.jp\0" +"kamioka.akita.jp\0harstad.no\0jotelulu.cloud\0" +"engineering\0\xe9\x9b\xbb\xe8\xa8\x8a\xe7\x9b\x88\xe7\xa7\x91\0" +"nantan.kyoto.jp\0bindal.no\0fage\0" +"*.uberspace.de\0" +"kristiansand.no\0" +"okawa.fukuoka.jp\0in.ni\0" +"transporte.bo\0lib.az.us\0shia\0" +"sciencecenters.museum\0" +"kasamatsu.gifu.jp\0abbvie\0wroc.pl\0srht.site\0" +"k12.de.us\0" +"tel\0cloudcontrolapp.com\0" +"*.ex.futurecms.at\0" +"cloudaccess.net\0" +"ohi.fukui.jp\0cloud-fr1.unispace.io\0" +"rag-cloud.hosteur.com\0" +"!city.kobe.jp\0" +"coach\0voyage\0" +"likescandy.com\0" +"jewishart.museum\0" +"yashiro.hyogo.jp\0" +"kerryproperties\0" +"kahoku.ishikawa.jp\0" +"\xe0\xb9\x80\xe0\xb8\x99\xe0\xb9\x87\xe0\xb8\x95.\xe0\xb9\x84\xe0\xb8\x97\xe0\xb8\xa2\0" +"jewelry\0\xe6\x9b\xb8\xe7\xb1\x8d\0" +"flog.br\0" +"conference.aero\0bn.it\0ostroleka.pl\0eu.com\0" +"stpetersburg.museum\0xerox\0omniwe.site\0za.org\0" +"fail\0guge\0" +"co.technology\0tuxfamily.org\0" +"mo.it\0firewall-gateway.net\0" +"nord-odal.no\0" +"gs.mr.no\0" +"hokuryu.hokkaido.jp\0itami.hyogo.jp\0" +"minami.fukuoka.jp\0sor-fron.no\0" +"thd\0" +"koshimizu.hokkaido.jp\0arida.wakayama.jp\0" +"voting\0" +"la-spezia.it\0pordenone.it\0" +"lv.ua\0" +"kitakata.fukushima.jp\0" +"servep2p.com\0" +"mihama.mie.jp\0" +"vlog.br\0directory\0" +"taito.tokyo.jp\0" +"vibo-valentia.it\0mito.ibaraki.jp\0ashgabad.su\0" +"education.museum\0" +"lancaster\0" +"barlettatraniandria.it\0in.rs\0" +"musica.ar\0" +"r\xc3\xb8mskog.no\0" +"yonezawa.yamagata.jp\0xy.ax\0" +"yokosuka.kanagawa.jp\0sumida.tokyo.jp\0h\xc3\xb8ylandet.no\0jls-sto2.elastx.net\0" +"shimabara.nagasaki.jp\0" +"trentino-alto-adige.it\0tenei.fukushima.jp\0events\0lolipop.io\0" +"from-or.com\0" +"hamburg.museum\0" +"frontier\0" +"musica.bo\0casino.hu\0" +"mat.br\0" +"\xe4\xb8\xaa\xe4\xba\xba.hk\0" +"yuza.yamagata.jp\0" +"walter\0" +"in.th\0" +"carbonia-iglesias.it\0" +"trentino-s-tirol.it\0" +"svizzera.museum\0" +"birdart.museum\0tjx\0" +"movie\0" +"vard\xc3\xb8.no\0" +"takasago.hyogo.jp\0tatsuno.hyogo.jp\0gorlice.pl\0" +"in.ua\0myfast.host\0" +"raholt.no\0" +"haboro.hokkaido.jp\0from-mn.com\0" +"botanicgarden.museum\0" +"sucks\0" +"shirako.chiba.jp\0" +"shinshinotsu.hokkaido.jp\0" +"shop\0" +"ogaki.gifu.jp\0" +"takanabe.miyazaki.jp\0cc.ca.us\0" +"show\0" +"broker\0" +"in.us\0fans\0" +"sld.pa\0" +"iglesiascarbonia.it\0\xe5\x9c\xa8\xe7\xba\xbf\0" +"help\0scjohnson\0" +"\xd8\xa7\xd9\x8a\xd8\xb1\xd8\xa7\xd9\x86.ir\0paris.museum\0barsy.mobi\0" +"wskr.gov.pl\0" +"chikushino.fukuoka.jp\0" +"tosashimizu.kochi.jp\0jewelry.museum\0cologne\0" +"creation.museum\0" +"g.bg\0myiphost.com\0" +"trader.aero\0" +"delta\0" +"watarai.mie.jp\0" +"sm\xc3\xb8la.no\0" +"aure.no\0" +"yame.fukuoka.jp\0otari.nagano.jp\0\xd1\x83\xd0\xba\xd1\x80\0" +"tsukiyono.gunma.jp\0kyoto\0" +"etc.br\0saigawa.fukuoka.jp\0" +"\xe5\xa8\xb1\xe4\xb9\x90\0" +"lib.as.us\0" +"ozu.ehime.jp\0\xd0\xb1\xd0\xb8\xd0\xb7.\xd1\x80\xd1\x83\xd1\x81\0" +"nago.okinawa.jp\0" +"*.sch.uk\0walmart\0\xe4\xbc\x81\xe4\xb8\x9a\0adimo.co.uk\0" +"works.aero\0" +"iwanai.hokkaido.jp\0" +"orangecloud.tn\0" +"top\0" +"farmers.museum\0" +"farm\0international\0" +"skole.museum\0" +"filegear.me\0" +"eigersund.no\0" "matsuyama.ehime.jp\0" -"int.bo\0satte.saitama.jp\0in.th\0" -"org.ge\0larvik.no\0" -"ac.gov.br\0org.gg\0vall\xc3\xa9""e-aoste.it\0" -"org.gh\0fukushima.hokkaido.jp\0" -"org.gi\0\xe9\x9d\x92\xe6\xa3\xae.jp\0" -"rendalen.no\0" -"nc.tr\0" -"org.gl\0repair.men\0" -"in.ua\0" -"int.ci\0org.gn\0com.ws\0" -"pubol.museum\0" -"org.gp\0" -"org.gr\0shop.ht\0toyama.jp\0" -"shop.hu\0yoro.gifu.jp\0ltd.ng\0" -"int.co\0org.gt\0yamagata.jp\0" -"org.gu\0katori.chiba.jp\0" -"soc.srcf.net\0de.ls\0" -"nym.gr\0de.md\0" -"org.gy\0" -"democracia.bo\0shiga.jp\0wblog.id\0" -"org.hk\0" -"tysv\xc3\xa6r.no\0ms.us\0nc.us\0" -"aland.fi\0org.hn\0" -"valleedaoste.it\0in.us\0nym.gy\0" -"finearts.museum\0bardu.no\0com.ye\0" -"nym.hk\0" -"yamada.fukuoka.jp\0" -"org.ht\0city.hu\0" -"org.hu\0cipriani\0temasek\0" -"omasvuotna.no\0" -"okagaki.fukuoka.jp\0ashgabad.su\0" +"\xe9\xb9\xbf\xe5\x85\x90\xe5\xb3\xb6.jp\0" +"kitagata.gifu.jp\0" +"joso.ibaraki.jp\0" +"yokawa.hyogo.jp\0uppo.gov.pl\0green\0" +"ing.pa\0" +"grimstad.no\0fast\0" +"beeldengeluid.museum\0" +"ishigaki.okinawa.jp\0mykolaiv.ua\0" +"travelchannel\0" +"\xd1\x81\xd0\xbf\xd0\xb1.\xd1\x80\xd1\x83\xd1\x81\0" +"shingu.hyogo.jp\0air.museum\0here\0ybo.faith\0" +"santabarbara.museum\0" +"fujimi.saitama.jp\0hammarfeasta.no\0" +"okazaki.aichi.jp\0" +"inder\xc3\xb8y.no\0" +"d.gv.vc\0" +"brussels\0charity\0\xd0\xbe\xd1\x80\xd0\xb3.\xd1\x80\xd1\x83\xd1\x81\0" +"doctor\0ubs\0" +"masuda.shimane.jp\0" +"trv\0\xe5\x98\x89\xe9\x87\x8c\xe5\xa4\xa7\xe9\x85\x92\xe5\xba\x97\0" +"sondrio.it\0guru\0" +"mo.us\0doesntexist.com\0" +"mydissent.net\0" +"naturalsciences.museum\0" +"vang.no\0" +"kosaka.akita.jp\0stateofdelaware.museum\0" +"bjerkreim.no\0" +"utazu.kagawa.jp\0paderborn.museum\0ilovecollege.info\0" +"journalist.aero\0tlon.network\0" +"ikoma.nara.jp\0" +"oita.jp\0" +"es.leg.br\0myforum.community\0" +"polkowice.pl\0" +"pasadena.museum\0" +"va.it\0" +"us-west-1.elasticbeanstalk.com\0" +"mx.na\0volvo\0" +"qsl.br\0" +"tui\0" +"frogans\0jp.kg\0" +"izumo.shimane.jp\0" +"itako.ibaraki.jp\0" +"sampa.br\0miyoshi.saitama.jp\0" +"h\xc3\xa1pmir.no\0" +"*.svc.firenet.ch\0" +"freebox-os.com\0" +"wa.edu.au\0" +"edunet.tn\0" +"is-a-lawyer.com\0" +"budapest\0" +"*.yokohama.jp\0tanohata.iwate.jp\0tx.us\0tvs\0" +"\xe6\x94\xbf\xe5\xba\x9c.hk\0" +"perugia.it\0" +"p.bg\0murayama.yamagata.jp\0jp.md\0" +"*.advisor.ws\0" +"dynv6.net\0" +"verran.no\0" +"yokote.akita.jp\0freiburg.museum\0" +"kyonan.chiba.jp\0" +"ri.it\0" +"yorii.saitama.jp\0" +"vallee-d-aoste.it\0" +"gs.rl.no\0" +"balat.no\0prochowice.pl\0forsale\0" +"\xe7\xb6\xb2\xe7\xb5\xa1.\xe9\xa6\x99\xe6\xb8\xaf\0diskstation.org\0" +"\xe5\xbe\xb3\xe5\xb3\xb6.jp\0*.landing.myjino.ru\0" +"seiyo.ehime.jp\0austin.museum\0" +"oristano.it\0" +"bio.br\0leangaviika.no\0" +"silk\0" +"tr.eu.org\0" +"ebina.kanagawa.jp\0obuse.nagano.jp\0" +"sa-east-1.elasticbeanstalk.com\0" +"television.museum\0" +"karasuyama.tochigi.jp\0" +"va.no\0" +"fukagawa.hokkaido.jp\0" +"shakotan.hokkaido.jp\0ae.org\0" +"baghdad.museum\0*.sys.qcx.io\0" +"bozen-s\xc3\xbc""dtirol.it\0" +"mitoyo.kagawa.jp\0sina\0" +"asnes.no\0homelinux.com\0" +"8.bg\0" +"cc.ut.us\0" +"civilaviation.aero\0" +"ha.cn\0hurum.no\0" +"mg.gov.br\0" +"flap.id\0" +"*.compute-1.amazonaws.com\0" +"guernsey.museum\0" +"gs.nt.no\0" +"is-a-player.com\0" +"yamashina.kyoto.jp\0no-ip.net\0" +"jur.pro\0" +"asahikawa.hokkaido.jp\0bristol.museum\0" +"ericsson\0" +"erni\0is-a-bruinsfan.org\0barsyonline.com\0" +"campobasso.it\0museumcenter.museum\0" +"grong.no\0durban\0" +"likes-pie.com\0" +"myjino.ru\0" +"nesna.no\0" +"ggf.br\0" +"\xe7\xbd\x91\xe5\xba\x97\0" +"lib.tn.us\0" +"station.museum\0" +"minamiyamashiro.kyoto.jp\0*.platformsh.site\0" +"kumamoto.kumamoto.jp\0orkdal.no\0nh.us\0" +"k12.wy.us\0" +"batsfjord.no\0" +"pleskns.com\0" +"gorge.museum\0" +"akdn\0" +"wolterskluwer\0" +"torahime.shiga.jp\0" +"fukusaki.hyogo.jp\0" +"\xe5\xa4\xa9\xe4\xb8\xbb\xe6\x95\x99\0" +"kanna.gunma.jp\0career\0" +"moscow\0" +"shimotsuma.ibaraki.jp\0is-a-candidate.org\0" +"lipsy\0" +"youtube\0" +"g.se\0" +"sphinx.mythic-beasts.com\0" +"neues.museum\0" +"chizu.tottori.jp\0jelastic.regruhosting.ru\0" +"\xe5\x98\x89\xe9\x87\x8c\0" +"kawazu.shizuoka.jp\0" +"uno\0" +"chieti.it\0media\0" +"katsuragi.nara.jp\0" +"*.kobe.jp\0tsuruta.aomori.jp\0" +"meguro.tokyo.jp\0" +"calabria.it\0" +"minnesota.museum\0googleapis.com\0" +"hiroshima.jp\0" +"tarnobrzeg.pl\0uol\0" +"honjo.akita.jp\0" +"shinjo.yamagata.jp\0" +"cc.dc.us\0" +"alabama.museum\0" +"maison\0jelastic.saveincloud.net\0" +"takayama.gifu.jp\0brand.se\0productions\0" +"oji.nara.jp\0" +"abruzzo.it\0" +"meloy.no\0" +"site\0\xe9\xa6\x99\xe6\xa0\xbc\xe9\x87\x8c\xe6\x8b\x89\0" +"homes\0dnsiskinky.com\0" +"ambulance.museum\0" +"konan.aichi.jp\0tara.saga.jp\0" +"ibaraki.jp\0va.us\0" +"annaka.gunma.jp\0misato.miyagi.jp\0kommunalforbund.se\0" +"y.bg\0ups\0" +"sandiego.museum\0amica\0extraspace\0" +"toyohashi.aichi.jp\0" +"americanart.museum\0" +"barsycenter.com\0" +"republican\0fr-1.paas.massivegrid.net\0" +"\xd0\xba\xd0\xbe\xd0\xbc.\xd1\x80\xd1\x83\xd1\x81\0" +"dyndns.biz\0" +"gratangen.no\0" +"kalisz.pl\0lib.ca.us\0" +"fedex\0" +"higashiyoshino.nara.jp\0" +"archaeology.museum\0" +"lib.mn.us\0" +"ino.kochi.jp\0" +"meiwa.mie.jp\0from-ia.com\0" +"marnardal.no\0" +"coz.br\0" +"foundation.museum\0" +"kids.us\0" +"ri.us\0" +"plesk.page\0" +"kimobetsu.hokkaido.jp\0" +"zentsuji.kagawa.jp\0" +"sk.ca\0klodzko.pl\0" +"catering\0" +"gz.cn\0" +"rogers\0" +"higashishirakawa.gifu.jp\0" +"ogawa.saitama.jp\0" +"in-addr.arpa\0taobao\0" +"levanger.no\0rnrt.tn\0" +"tamba.hyogo.jp\0romsa.no\0" +"lombardy.it\0study\0" +"kadena.okinawa.jp\0" +"kasahara.gifu.jp\0*.lclstage.dev\0" +"sveio.no\0" +"asso.fr\0" +"ha.no\0" +"oe.yamagata.jp\0" +"tochigi.tochigi.jp\0freemyip.com\0" +"vet\0" +"stavanger.no\0" +"k12.ma.us\0zero\0" +"asso.gp\0honjyo.akita.jp\0oiso.kanagawa.jp\0" +"mitsubishi\0" +"loan\0" +"kani.gifu.jp\0" +"dyn.home-webserver.de\0" +"gifts\0us.reclaim.cloud\0" +"siena.it\0" +"abudhabi\0cust.retrosnub.co.uk\0" +"kasugai.aichi.jp\0" +"val-d-aosta.it\0" +"kaizuka.osaka.jp\0" +"garden\0" +"asso.ht\0kr.it\0omaezaki.shizuoka.jp\0" +"kariya.aichi.jp\0" +"a\xc3\xa9roport.ci\0" +"uk.net\0" +"modelling.aero\0hyuga.miyazaki.jp\0" +"fukushima.hokkaido.jp\0p.se\0" +"isa.us\0" +"vs.it\0tienda\0" +"teaches-yoga.com\0" +"prd.fr\0" +"kalmykia.su\0" +"lomza.pl\0" +"asso.bj\0dnipropetrovsk.ua\0" +"tokamachi.niigata.jp\0vig\0" +"sosa.chiba.jp\0from-il.com\0static.land\0" +"tagawa.fukuoka.jp\0uz.ua\0dyn-berlin.de\0" +"hyogo.jp\0" +"ntr.br\0" +"s\xc3\xbc""dtirol.it\0" +"vin\0" +"shell.museum\0" +"vip\0" +"engerdal.no\0" +"asso.ci\0" +"quicksytes.com\0" +"ichinoseki.iwate.jp\0" +"pisa.it\0oki.fukuoka.jp\0jorpeland.no\0" +"vall\xc3\xa9""eaoste.it\0" +"sg-1.paas.massivegrid.net\0wixsite.com\0" +"design.aero\0discover\0" +"hakuba.nagano.jp\0cool\0" +"shikama.miyagi.jp\0meldal.no\0sko.gov.pl\0uk.eu.org\0grozny.su\0" +"pila.pl\0" +"commbank\0" +"coop\0" +"encyclopedic.museum\0gs.hm.no\0" +"app.lmpm.com\0" +"nakamura.kochi.jp\0ostrowiec.pl\0ownip.net\0" +"osakikamijima.hiroshima.jp\0samnanger.no\0tele.amune.org\0" +"iide.yamagata.jp\0" +"barclaycard\0" +"vestnes.no\0kalmykia.ru\0" +"trani-andria-barletta.it\0muko.kyoto.jp\0" +"cargo.aero\0aa.no\0" +"nichinan.miyazaki.jp\0" +"loft\0*.paywhirl.com\0" +"asso.dz\0" +"stage.nodeart.io\0" +"stjohn.museum\0" +"southcarolina.museum\0komforb.se\0dyndns-web.com\0" +"sb.ua\0" +"\xe5\xba\x83\xe5\xb3\xb6.jp\0" +"airtel\0" +"ferrero\0" +"backplaneapp.io\0" "for.sale\0" -"flakstad.no\0nym.ie\0" -"org.il\0" +"pescara.it\0" +"vxl.sh\0" +"iizuka.fukuoka.jp\0kamaishi.iwate.jp\0prd.km\0" +"balsan.it\0fujieda.shizuoka.jp\0" +"yurihonjo.akita.jp\0" +"keisen.fukuoka.jp\0" +"hashikami.aomori.jp\0" +"grozny.ru\0" +"\xe6\x94\xbf\xe5\x8a\xa1\0" +"accident-prevention.aero\0" +"eun.eg\0" +"honda\0" +"pc.it\0" +"prd.mg\0" +"half.host\0" +"pharmacy\0" +"wmflabs.org\0" +"takko.aomori.jp\0zhitomir.ua\0" +"prof.pr\0" +"maniwa.okayama.jp\0" +"geology.museum\0" +"k12.mt.us\0" +"omi.nagano.jp\0" +"forli-cesena.it\0" +"friuli-v-giulia.it\0a.run.app\0" +"lecce.it\0" +"appudo.net\0" +"grp.lk\0" +"ohtawara.tochigi.jp\0ethnology.museum\0homelinux.net\0" +"ikeda.nagano.jp\0" +"rahkkeravju.no\0paris\0" +"vagsoy.no\0" +"\xe6\x96\xb0\xe5\x8a\xa0\xe5\x9d\xa1\0for-more.biz\0" +"hu.net\0onfabrica.com\0" +"suzuki\0xbox\0" +"tondabayashi.osaka.jp\0" +"dr.na\0" +"kasuya.fukuoka.jp\0" +"qualifioapp.com\0" +"finearts.museum\0y.se\0" +"broker.aero\0bern.museum\0" +"media.aero\0" +"mino.gifu.jp\0is-an-entertainer.com\0" +"fh-muenster.io\0" +"b\xc3\xb8.nordland.no\0" +"olkusz.pl\0" +"hattfjelldal.no\0kr.ua\0yahoo\0" +"s3-eu-central-1.amazonaws.com\0" +"solutions\0" +"takaishi.osaka.jp\0space-to-rent.com\0" +"sandnessj\xc3\xb8""en.no\0fam.pk\0" +"finnoy.no\0" +"svalbard.no\0" +"ichikai.tochigi.jp\0" +"lib.sd.us\0" +"bc.ca\0" +"futurehosting.at\0" +"abashiri.hokkaido.jp\0lardal.no\0" +"erimo.hokkaido.jp\0nishiwaki.hyogo.jp\0" +"uji.kyoto.jp\0" +"reg.dk\0" +"kai.yamanashi.jp\0" +"bungoono.oita.jp\0" +"enonic.io\0" +"\xe0\xae\x87\xe0\xae\xb2\xe0\xae\x99\xe0\xaf\x8d\xe0\xae\x95\xe0\xaf\x88\0" +"md.ci\0" +"giize.com\0" +"pc.pl\0\xe6\x88\x91\xe7\x88\xb1\xe4\xbd\xa0\0" +"higashiizu.shizuoka.jp\0hitachi\0*.in.futurecms.at\0" +"s\xc3\xb8r-odal.no\0" +"hgtv\0" +"cloud\0" +"pippu.hokkaido.jp\0ikano\0toshiba\0" +"gjemnes.no\0" +"frei.no\0*.firenet.ch\0" +"cinema.museum\0is-a-cpa.com\0" +"act.edu.au\0tobe.ehime.jp\0" +"lib.co.us\0" +"skin\0" +"starnberg.museum\0ally\0" +"obninsk.su\0" +"swiss\0" +"friuli-vegiulia.it\0hs.kr\0" +"flakstad.no\0" +"nara.nara.jp\0" +"mihama.fukui.jp\0" +"\xe5\x95\x86\xe5\x9f\x8e\0" +"fukuchi.fukuoka.jp\0" +"virtualuser.de\0" +"krokstadelva.no\0" +"westus2.azurestaticapps.net\0" +"gonohe.aomori.jp\0" +"cricket\0" +"cloudns.club\0temp-dns.com\0" +"*.statics.cloud\0" +"hitachiota.ibaraki.jp\0kinko.kagoshima.jp\0" +"lig.it\0amsterdam.museum\0" +"from.work\0" +"koriyama.fukushima.jp\0kawachinagano.osaka.jp\0hasuda.saitama.jp\0is.gov.pl\0" +"embroidery.museum\0" +"andria-barletta-trani.it\0" +"bill.museum\0guovdageaidnu.no\0dr.tr\0codes\0" +"hokksund.no\0asso.re\0" +"koka.shiga.jp\0" +"fhv.se\0" +"tm.cy\0" +"tas.edu.au\0" +"portland.museum\0point2this.com\0" +"tolga.no\0win\0beep.pl\0" +"ohira.tochigi.jp\0" +"st.no\0zt.ua\0" +"antiques.museum\0k12.ok.us\0myshopblocks.com\0" +"hamaroy.no\0" +"tm.dz\0" +"pesaro-urbino.it\0gushikami.okinawa.jp\0salat.no\0creditunion\0" +"s3.amazonaws.com\0" +"minamiboso.chiba.jp\0" +"isshiki.aichi.jp\0" +"kakamigahara.gifu.jp\0birthplace.museum\0" +"avellino.it\0virginia.museum\0" +"nyc.mn\0" +"stufftoread.com\0" +"love\0" +"lt.it\0" +"tm.fr\0" +"lerdal.no\0parts\0*.elb.amazonaws.com\0" +"bnr.la\0" +"dynathome.net\0" +"bergamo.it\0tomisato.chiba.jp\0" +"party\0" +"rep.br\0" +"shimonita.gunma.jp\0" +"saga.saga.jp\0" +"lib.il.us\0" +"asso.nc\0video\0" +"is-an-actress.com\0" +"narusawa.yamanashi.jp\0" +"wme\0" +"moriyoshi.akita.jp\0" +"kaminoyama.yamagata.jp\0" +"oseto.nagasaki.jp\0" +"belluno.it\0kurotaki.nara.jp\0averoy.no\0www.ro\0" +"franziskaner.museum\0" +"kanmaki.nara.jp\0" +"tm.hu\0jetzt\0" +"shiwa.iwate.jp\0motobu.okinawa.jp\0atami.shizuoka.jp\0" +"tosu.saga.jp\0" +"katori.chiba.jp\0" +"fortal.br\0" +"shimokawa.hokkaido.jp\0" +"lyngdal.no\0" +"trd.br\0flatanger.no\0" +"miyama.mie.jp\0" +"ryugasaki.ibaraki.jp\0skien.no\0" +"numata.gunma.jp\0amsw.nl\0" +"zushi.kanagawa.jp\0" +"friulivgiulia.it\0amex\0" +"taishi.osaka.jp\0floro.no\0\xc3\xa1laheadju.no\0onred.one\0" +"kitahata.saga.jp\0ski.no\0gr.com\0" +"ddnsgeek.com\0" +"settlers.museum\0\xe5\x81\xa5\xe5\xba\xb7\0" +"s3.ap-south-1.amazonaws.com\0" +"entertainment.aero\0handson.museum\0" +"hiroo.hokkaido.jp\0" +"wow\0" +"stj\xc3\xb8rdalshalsen.no\0ddnsking.com\0" +"ostrowwlkp.pl\0" +"tm.km\0" +"tv.bb\0atsuma.hokkaido.jp\0lund.no\0under.one\0" +"kurume.fukuoka.jp\0" +"bilbao.museum\0balena-devices.com\0" +"halsa.no\0platter-app.com\0" +"democracia.bo\0" +"isesaki.gunma.jp\0" +"res.aero\0" +"omihachiman.shiga.jp\0" +"troms\xc3\xb8.no\0" +"mamurogawa.yamagata.jp\0north.museum\0salvadordali.museum\0alaheadju.no\0" +"tv.bo\0" +"moriya.ibaraki.jp\0" +"tv.br\0saotome.st\0" +"miners.museum\0" +"tm.mc\0estate.museum\0" +"pu.it\0" +"sumoto.kumamoto.jp\0coastaldefence.museum\0trysil.no\0" +"tm.mg\0" +"\xe0\xb8\x98\xe0\xb8\xb8\xe0\xb8\xa3\xe0\xb8\x81\xe0\xb8\xb4\xe0\xb8\x88.\xe0\xb9\x84\xe0\xb8\x97\xe0\xb8\xa2\0" +"e164.arpa\0asso.km\0" +"rindal.no\0" +"final\0" +"mukawa.hokkaido.jp\0" +"venezia.it\0pl.ua\0" +"k12.dc.us\0" +"sandvik\0" +"evje-og-hornnes.no\0select\0" +"toyosato.shiga.jp\0" +"vestre-slidre.no\0club.tw\0" +"tm.no\0" +"ine.kyoto.jp\0higashimatsushima.miyagi.jp\0asso.mc\0" +"england.museum\0gotdns.ch\0" +"pharmacien.fr\0dsmynas.org\0" +"fm.br\0paleo.museum\0slupsk.pl\0watch\0wtc\0" +"divtasvuodna.no\0groks-this.info\0" +"wtf\0" +"bl.it\0" +"sanda.hyogo.jp\0uber.space\0" +"pubol.museum\0b\xc3\xa5""d\xc3\xa5""ddj\xc3\xa5.no\0" +"ryuoh.shiga.jp\0" +"express.aero\0pcloud.host\0" +"ppg.br\0" +"dattolocal.net\0" +"handa.aichi.jp\0" +"rep.kp\0" +"paragliding.aero\0burghof.museum\0sibenik.museum\0" +"steiermark.museum\0" +"tm.pl\0" +"chernihiv.ua\0" +"gamo.shiga.jp\0" +"uni5.net\0" +"skj\xc3\xa5k.no\0" +"kartuzy.pl\0lt.ua\0" +"k12.ak.us\0from-ut.com\0" +"chiyoda.tokyo.jp\0panama.museum\0" +"time.museum\0" +"aerobatic.aero\0*.compute.amazonaws.com.cn\0" +"bodo.no\0" +"soc.srcf.net\0" +"as.us\0" +"oyabe.toyama.jp\0" +"trapani.it\0" +"galsa.no\0" +"kawagoe.saitama.jp\0is-very-sweet.org\0" +"nishikawa.yamagata.jp\0" +"hvaler.no\0" +"md.us\0" +"maebashi.gunma.jp\0" +"katagami.akita.jp\0store.nf\0" +"dyndns-free.com\0" +"dev.br\0nf.ca\0tm.ro\0marshalls\0" +"politie\0lelux.site\0" +"buzen.fukuoka.jp\0" +"val-daosta.it\0badajoz.museum\0tm.se\0" +"tv.im\0" +"ibestad.no\0" +"onga.fukuoka.jp\0kumagaya.saitama.jp\0" +"kuokgroup\0" +"sevastopol.ua\0" +"tv.it\0" +"kurashiki.okayama.jp\0" +"umig.gov.pl\0chimkent.su\0" +"moss.no\0" +"mypep.link\0" +"homeunix.com\0" +"vagan.no\0" +"trentino-s\xc3\xbc""d-tirol.it\0travelersinsurance\0" +"nakatombetsu.hokkaido.jp\0" +"xin\0" +"inagawa.hyogo.jp\0tv.kg\0" +"trentino-sud-tirol.it\0" +"gj\xc3\xb8vik.no\0" +"yotsukaido.chiba.jp\0shishikui.tokushima.jp\0" +"wassamu.hokkaido.jp\0il.us\0*.compute.estate\0dnsfor.me\0" +"kuromatsunai.hokkaido.jp\0" +"\xc3\xa5rdal.no\0" +"agrigento.it\0" +"ipifony.net\0hicam.net\0" +"bushey.museum\0" +"toei.aichi.jp\0" +"mesaverde.museum\0" +"nom.ad\0e.bg\0" +"fm.it\0nom.ae\0" +"haebaru.okinawa.jp\0nom.af\0" +"nom.ag\0mymailer.com.tw\0pyatigorsk.ru\0" +"wanouchi.gifu.jp\0poker\0ntdll.top\0nom.ai\0" +"archi\0homedepot\0" +"holiday\0" +"nom.al\0" +"ooshika.nagano.jp\0mashiko.tochigi.jp\0" +"\xe5\x8f\xb0\xe6\xb9\xbe\0jelastic.team\0" +"shinshiro.aichi.jp\0" +"democrat\0" +"norfolk.museum\0phone\0office-on-the.net\0shacknet.nu\0" +"pilots.museum\0" +"tv.na\0knightpoint.systems\0" +"\xe0\xac\xad\xe0\xac\xbe\xe0\xac\xb0\xe0\xac\xa4\0" +"vefsn.no\0" +"homelinux.org\0" +"fireweb.app\0" +"beiarn.no\0" +"shikabe.hokkaido.jp\0" +"shiftcrypto.io\0" +"yatsushiro.kumamoto.jp\0" +"virtual-user.de\0" +"nom.bz\0nyan.to\0" +"\xe0\xba\xa5\xe0\xba\xb2\xe0\xba\xa7\0" +"nom.cl\0" +"sicily.it\0" +"nom.co\0sayama.osaka.jp\0verisign\0" +"yakumo.hokkaido.jp\0withgoogle.com\0" +"realestate\0" +"law.za\0sport\0" +"ce.it\0maif\0" +"telebit.app\0" +"miyada.nagano.jp\0" +"\xd9\x85\xd9\x84\xd9\x8a\xd8\xb3\xd9\x8a\xd8\xa7\0awsmppl.com\0nh-serv.co.uk\0" +"toyono.osaka.jp\0pony.club\0" +"tm.za\0" +"museum.tt\0" +"sk\xc3\xa5nland.no\0" +"website.yandexcloud.net\0" +"health.nz\0" +"yamanouchi.nagano.jp\0circle\0data\0" +"org.ac\0trentino-suedtirol.it\0" +"contractors\0" +"org.ae\0mar.it\0wakkanai.hokkaido.jp\0store.ve\0" +"org.af\0date\0is-a-designer.com\0" +"org.ag\0is-lost.org\0" +"org.ai\0" +"otaki.saitama.jp\0" +"org.al\0" +"org.am\0fm.no\0\xe5\xa4\xa7\xe6\x8b\xbf\0freeddns.us\0" +"stor-elvdal.no\0" +"nom.es\0gb.net\0" +"org.ba\0giving\0istanbul\0" +"org.ar\0org.bb\0mymediapc.net\0" +"caracal.mythic-beasts.com\0" +"org.au\0" +"alfaromeo\0" +"ugim.gov.pl\0" +"org.bh\0pup.gov.pl\0" +"org.bi\0" +"org.az\0ide.kyoto.jp\0hol.no\0" +"uvic.museum\0" +"org.bm\0" +"org.bn\0rebun.hokkaido.jp\0choyo.kumamoto.jp\0kasukabe.saitama.jp\0" +"org.bo\0nom.fr\0" +"taranto.it\0washingtondc.museum\0" +"airport.aero\0nom.gd\0" +"org.br\0nom.ge\0" +"org.bs\0" +"org.bt\0" +"sic.it\0builtwithdark.com\0" +"izumisano.osaka.jp\0" +"the.br\0org.bw\0" +"org.ci\0kuji.iwate.jp\0yahaba.iwate.jp\0nom.gl\0" +"org.bz\0tv.sd\0" +"sos.pl\0" +"org.cn\0" +"org.co\0sport.hu\0monza-e-della-brianza.it\0" +"nom.gt\0" +"gyeongbuk.kr\0planetarium.museum\0equipment\0redstone\0" +"naie.hokkaido.jp\0obihiro.hokkaido.jp\0" +"org.cu\0" +"azurewebsites.net\0qcx.io\0" +"org.cw\0" +"minami-alps.yamanashi.jp\0" +"org.cy\0abr.it\0" +"nerdpol.ovh\0" +"nom.hn\0" +"org.dm\0" +"bu.no\0\xe0\xb9\x84\xe0\xb8\x97\xe0\xb8\xa2\0photo\0" +"org.do\0" +"ushiku.ibaraki.jp\0claims\0" +"org.ec\0br\xc3\xb8nn\xc3\xb8ysund.no\0" +"chernigov.ua\0" +"org.ee\0kamo.niigata.jp\0marker.no\0" +"org.eg\0" +"iwade.wakayama.jp\0tv.tr\0" +"tanabe.wakayama.jp\0nordreisa.no\0webhosting.be\0" +"org.dz\0nom.im\0" +"bolivia.bo\0canon\0from-tn.com\0" +"store.ro\0" +"principe.st\0tv.tz\0" +"codespot.com\0" +"demo.jelastic.com\0" +"org.es\0" +"org.et\0" +"tako.chiba.jp\0kanegasaki.iwate.jp\0" +"hermes\0" +"org.fj\0shari.hokkaido.jp\0" +"l\xc3\xa1hppi.no\0sande.vestfold.no\0" +"goip.de\0" +"n.bg\0org.fm\0" +"cloud.interhostsolutions.be\0nom.ke\0*.s5y.io\0editorx.io\0" +"store.st\0" +"org.ge\0bulsan.it\0intl.tn\0" +"org.gg\0rg.it\0" +"org.gh\0" +"org.gi\0askim.no\0" +"nom.km\0" +"sayo.hyogo.jp\0" +"org.gl\0viking\0" +"org.gn\0giske.no\0" +"origins\0" +"org.gp\0plo.ps\0" +"org.gr\0" +"bauhaus\0" +"org.gt\0health.vn\0" +"org.gu\0" +"nom.li\0" +"miyawaka.fukuoka.jp\0oshu.iwate.jp\0ap-southeast-1.elasticbeanstalk.com\0" +"org.gy\0" +"vao.it\0" +"org.hk\0" +"org.hn\0" +"\xc3\xa5""fjord.no\0" +"emilia-romagna.it\0" +"is-certified.com\0nom.lv\0" +"org.ht\0nom.mg\0axis.museum\0bci.dnstrace.pro\0" +"org.hu\0" +"from-la.net\0nom.mk\0" +"org.il\0wedding\0" "org.im\0" -"org.in\0monzabrianza.it\0chiba.jp\0storage.yandexcloud.net\0" -"ask\xc3\xb8y.no\0" -"mutsu.aomori.jp\0homes\0j.scaleforce.net\0" +"6.bg\0org.in\0museum.mv\0" +"go.ci\0cn.it\0museum.mw\0" +"nom.nc\0" "org.iq\0" "org.ir\0" "org.is\0" -"org.je\0translate.goog\0" -"krym.ua\0com.zm\0today\0wmflabs.org\0" -"habikino.osaka.jp\0sandiego.museum\0k12.ks.us\0" -"manaus.br\0" -"ushiku.ibaraki.jp\0fedorapeople.org\0" -"org.jo\0k12.ca.us\0intuit\0" -"cambridge.museum\0global.prod.fastly.net\0" -"gujo.gifu.jp\0kaluga.su\0" -"bryne.no\0" -"rankoshi.hokkaido.jp\0monash\0" -"arts.co\0" -"org.kg\0idrett.no\0" -"isa.kagoshima.jp\0org.ki\0jewishart.museum\0" -"yalta.ua\0" -"3utilities.com\0" -"modena.it\0" +"frosinone.it\0stuttgart.museum\0" +"org.je\0" +"godo.gifu.jp\0nom.ni\0" +"seihi.nagasaki.jp\0museum.no\0domains\0*.kunden.ortsinfo.at\0" +"go.cr\0no.it\0" +"s3-eu-west-2.amazonaws.com\0" +"naturalhistorymuseum.museum\0ufcfan.org\0" +"org.jo\0meeres.museum\0" +"roma.it\0nom.nu\0" +"kanazawa.ishikawa.jp\0museum.om\0\xda\x80\xd8\xa7\xd8\xb1\xd8\xaa\0xxx\0" +"kr.com\0" +"matsumoto.nagano.jp\0org.kg\0" +"lierne.no\0" +"org.ki\0" +"oga.akita.jp\0\xe6\x96\xb0\xe9\x97\xbb\0" "org.km\0" -"saku.nagano.jp\0org.kn\0" -"izumizaki.fukushima.jp\0mypi.co\0" -"org.kp\0" -"org.la\0" -"kanmaki.nara.jp\0org.lb\0" -"chikuzen.fukuoka.jp\0org.lc\0" -"zlg.br\0" -"izumo.shimane.jp\0kikugawa.shizuoka.jp\0" -"org.kw\0pramerica\0nym.la\0" -"uk0.bigv.io\0endoftheinternet.org\0" -"fujimino.saitama.jp\0org.ky\0nym.lc\0" -"org.kz\0" -"org.lk\0" -"brussels.museum\0" -"higashishirakawa.gifu.jp\0nym.li\0" -"nym.kz\0" -"te.it\0org.ma\0" -"org.lr\0utsira.no\0" -"org.ls\0davvenjarga.no\0" -"bunkyo.tokyo.jp\0" -"org.me\0" +"org.kn\0nom.pa\0" +"org.kp\0nrw.museum\0clicketcloud.com\0" +"org.la\0r\xc3\xb8""d\xc3\xb8y.no\0" +"org.lb\0n\xc3\xa6r\xc3\xb8y.no\0nom.pe\0home.dyndns.org\0" +"org.lc\0lind\xc3\xa5s.no\0" +"kushimoto.wakayama.jp\0" +"\xc3\xb8ygarden.no\0" +"imperia.it\0org.kw\0dentist\0xyz\0" +"homeoffice.gov.uk\0" +"fussa.tokyo.jp\0org.ky\0nom.pl\0*.on-rio.io\0" +"anamizu.ishikawa.jp\0org.kz\0" +"noto.ishikawa.jp\0org.lk\0" +"is-a-guru.com\0" +"nom.qa\0" +"org.ma\0" +"yahiko.niigata.jp\0org.lr\0" +"bihoro.hokkaido.jp\0org.ls\0" +"nom.pw\0" +"org.me\0skedsmo.no\0" "org.lv\0" -"sa.au\0org.mg\0b-data.io\0" -"betainabox.com\0" +"org.mg\0" +"kota.aichi.jp\0" "org.ly\0" -"*.magentosite.cloud\0nym.lt\0" -"org.mk\0demo.datacenter.fi\0nym.lu\0nym.me\0" -"org.ml\0" -"ca.it\0" -"shobara.hiroshima.jp\0settsu.osaka.jp\0org.mn\0szkola.pl\0" -"org.mo\0" +"gausdal.no\0" +"org.mk\0" +"org.ml\0dev.vu\0" +"club.aero\0nasu.tochigi.jp\0" +"nx.cn\0idf.il\0takahama.aichi.jp\0org.mn\0" +"org.mo\0e.se\0" +"gripe\0" "org.na\0" -"org.ms\0" -"org.mt\0nym.mn\0" -"org.mu\0budapest\0" -"nl.ca\0org.mv\0" +"nom.re\0centralus.azurestaticapps.net\0" +"org.ms\0mypets.ws\0" +"org.mt\0""2038.io\0" +"org.mu\0" +"org.mv\0" "org.mw\0org.ng\0" -"int.is\0org.mx\0" -"org.my\0org.ni\0" -"org.mz\0\xe0\xa4\x95\xe0\xa5\x89\xe0\xa4\xae\0" -"\xe9\xa6\x99\xe5\xb7\x9d.jp\0stateofdelaware.museum\0" -"surrey.museum\0" -"ltd.ua\0" -"nym.mx\0nl.ci\0" -"am.br\0trentinostirol.it\0s3.dualstack.ap-northeast-1.amazonaws.com\0" -"h\xc3\xa1pmir.no\0org.nr\0" -"sa.cr\0lancaster\0" -"pages.dev\0no-ip.org\0" -"paragliding.aero\0politica.bo\0" -"riodejaneiro.museum\0ltd.uk\0" -"coloradoplateau.museum\0" -"org.nz\0\xe5\x9c\xa8\xe7\xba\xbf\0teaches-yoga.com\0" -"oum.gov.pl\0" -"org.om\0" -"ltd.co.im\0" -"nym.nz\0" -"lib.ee\0org.pa\0" -"lincoln.museum\0" -"dallas.museum\0org.pe\0" -"int.la\0org.pf\0" -"freebox-os.fr\0" +"org.mx\0unj\xc3\xa1rga.no\0" +"nsw.au\0org.my\0org.ni\0" +"org.mz\0vana\0g.vbrplsbx.io\0" +"\xe8\xb0\xb7\xe6\xad\x8c\0" +"nom.ro\0" +"psse.gov.pl\0" +"masoy.no\0" +"nom.rs\0" +"vanguard\0" +"org.nr\0" +"from-al.com\0" +"web.bo\0kouhoku.saga.jp\0farmequipment.museum\0" +"nom.si\0" +"kg.kr\0" +"\xe5\x9f\xbc\xe7\x8e\x89.jp\0mosjoen.no\0qoto.io\0" +"go.id\0org.nz\0" +"drammen.no\0org.om\0" +"wa.au\0owariasahi.aichi.jp\0" +"oregon.museum\0from-co.net\0" +"org.pa\0nom.st\0" +"act.au\0shirakawa.gifu.jp\0" +"samsclub\0" +"web.co\0" +"org.pe\0" +"org.pf\0opencraft.hosting\0" +"nom.tj\0" "org.ph\0" -"r\xc3\xa6lingen.no\0" -"org.pk\0nym.pe\0" -"org.pl\0" -"vadso.no\0s3-ca-central-1.amazonaws.com\0" -"heroy.more-og-romsdal.no\0org.pn\0" -"int.lk\0" -"futtsu.chiba.jp\0kongsberg.no\0org.qa\0" -"org.pr\0property\0mypep.link\0" -"org.ps\0" -"valle-daosta.it\0gjemnes.no\0org.pt\0" -"de.us\0" -"station.museum\0" -"org.py\0" -"trentinosudtirol.it\0ca.na\0nym.pt\0" -"\xe5\xa8\xb1\xe4\xb9\x90\0" -"seoul.kr\0colonialwilliamsburg.museum\0" -"yamagata.gifu.jp\0sarpsborg.no\0servehalflife.com\0" -"helsinki\0" -"in-addr.arpa\0catanzaro.it\0" -"uk.oxa.cloud\0" -"trentinoaadige.it\0" -"is-uberleet.com\0" -"katashina.gunma.jp\0trading\0" -"sarufutsu.hokkaido.jp\0that.win\0" -"bulsan-suedtirol.it\0" -"int.mv\0" -"int.mw\0" -"niikappu.hokkaido.jp\0dsmynas.net\0" -"int.ni\0r.se\0verisign\0" -"org.ro\0na4u.ru\0" -"org.sa\0" -"takaharu.miyazaki.jp\0org.sb\0" -"org.rs\0org.sc\0hdfc\0" -"org.sd\0" -"ochi.kochi.jp\0hammarfeasta.no\0org.se\0org.ru\0nym.ro\0" -"shikama.miyagi.jp\0org.rw\0org.sg\0" -"org.sh\0" -"uozu.toyama.jp\0" -"naumburg.museum\0usculture.museum\0org.sl\0" -"broadcast.museum\0org.sn\0" -"org.so\0" -"bas.it\0laakesvuemie.no\0" -"nym.sk\0" -"moriyoshi.akita.jp\0omi.niigata.jp\0" -"beskidy.pl\0org.ss\0" -"nagahama.shiga.jp\0org.st\0" -"org.sv\0grozny.su\0" -"family.museum\0" -"nishihara.kumamoto.jp\0" +"w.bg\0" +"go.it\0murakami.niigata.jp\0nom.tm\0" +"2000.hu\0ueda.nagano.jp\0org.pk\0" +"pa.gov.br\0harvestcelebration.museum\0org.pl\0" +"org.pn\0" +"flekkefjord.no\0" +"ninohe.iwate.jp\0" +"org.qa\0" +"org.pr\0" +"org.ps\0science\0" +"web.do\0org.pt\0nom.ug\0" +"go.jp\0muika.niigata.jp\0" +"sncf\0" +"org.py\0community-pro.net\0" +"go.ke\0" +"yamada.fukuoka.jp\0" +"r\xc3\xb8yken.no\0nom.vc\0" +"ketrzyn.pl\0u2.xnbay.com\0" +"you\0" +"zlg.br\0nom.vg\0" +"fot.br\0nom.uy\0" +"higashiosaka.osaka.jp\0" +"go.kr\0\xe0\xa4\xad\xe0\xa4\xbe\xe0\xa4\xb0\xe0\xa4\xa4\xe0\xa4\xae\xe0\xa5\x8d\0" +"jelastic.dogado.eu\0" +"tamakawa.fukushima.jp\0leka.no\0" +"pb.gov.br\0swatch\0" +"genkai.saga.jp\0cloudera.site\0" +"tokuyama.yamaguchi.jp\0org.ro\0" +"noda.iwate.jp\0org.sa\0" +"org.sb\0" +"org.rs\0org.sc\0" +"org.sd\0s3.ap-northeast-2.amazonaws.com\0" +"org.se\0org.ru\0" +"org.rw\0org.sg\0" +"viterbo.it\0org.sh\0" +"\xe5\x8d\x83\xe8\x91\x89.jp\0" +"izumizaki.fukushima.jp\0bel.tr\0" +"eurovision\0" +"org.sl\0twmail.cc\0" +"alta.no\0zp.gov.pl\0org.sn\0" +"shinto.gunma.jp\0ando.nara.jp\0org.so\0" +"gx.cn\0ybo.trade\0" +"yoita.niigata.jp\0" +"ogliastra.it\0kui.hiroshima.jp\0org.ss\0" +"kawakami.nagano.jp\0org.st\0dnshome.de\0" +"shonai.fukuoka.jp\0maritimo.museum\0org.sv\0" +"saogonca.br\0basketball\0apigee.io\0" +"omachi.nagano.jp\0realty\0" "org.sy\0" -"org.sz\0org.tj\0" -"nym.su\0" +"web.gu\0org.sz\0org.tj\0jobs.tt\0" +"cn.ua\0" "org.tm\0" -"org.tn\0mayfirst.info\0nym.sx\0" -"hokuryu.hokkaido.jp\0ushistory.museum\0org.to\0" -"\xe6\x94\xbf\xe5\xba\x9c.hk\0airtel\0prod\0" -"sandnessj\xc3\xb8""en.no\0org.ua\0*.hosting.myjino.ru\0" -"trani-barletta-andria.it\0ruovat.no\0org.tr\0prof\0" -"vv.it\0karasjohka.no\0" -"org.tt\0bnr.la\0" -"medizinhistorisches.museum\0stjordalshalsen.no\0" -"nsw.edu.au\0press.cy\0sa.it\0annaka.gunma.jp\0\xed\x95\x9c\xea\xb5\xad\0" -"emiliaromagna.it\0davvesiida.no\0org.tw\0org.ug\0" -"sexy\0" -"carrara-massa.it\0int.pt\0pioneer\0" -"idv.hk\0org.uk\0" -"dni.us\0arts.ve\0club\0" -"nym.tw\0" -"freeddns.org\0" -"org.vc\0" -"hyuga.miyazaki.jp\0" -"org.ve\0" -"asso.fr\0" -"her\xc3\xb8y.m\xc3\xb8re-og-romsdal.no\0czeladz.pl\0" -"design.museum\0org.uy\0org.vi\0" +"tohma.hokkaido.jp\0org.tn\0ro.eu.org\0" +"org.to\0" +"org.ua\0cloudns.info\0" +"store.bb\0sarufutsu.hokkaido.jp\0org.tr\0" +"yaotsu.gifu.jp\0org.tt\0" +"ibigawa.gifu.jp\0" +"org.tw\0org.ug\0" +"muncie.museum\0schoenbrunn.museum\0" +"web.id\0macerata.it\0" +"org.uk\0" +"ivanovo.su\0" +"\xe7\xbb\x84\xe7\xbb\x87.hk\0porsanger.no\0in-butter.de\0" +"nom.za\0" +"sweetpepper.org\0" +"sharp\0" +"snaase.no\0lib.vi.us\0org.vc\0web.in\0" +"miyako.iwate.jp\0farsund.no\0" +"org.ve\0in-berlin.de\0" +"game.tw\0" +"sling\0" +"org.uy\0org.vi\0usr.cloud.muni.cz\0" "org.uz\0" -"engerdal.no\0" -"org.vn\0" -"sciencecenter.museum\0v\xc3\xa5ler.\xc3\xb8stfold.no\0blogdns.net\0" -"russia.museum\0" -"leka.no\0" -"tamayu.shimane.jp\0weber\0" -"asso.gp\0org.vu\0" -"vix.br\0grozny.ru\0" -"netbank\0" -"is-a-bruinsfan.org\0" -"int.ru\0gets-it.net\0" -"awsmppl.com\0" -"chuo.tokyo.jp\0" -"nebraska.museum\0snasa.no\0" -"te.ua\0honda\0" -"piacenza.it\0" -"is-by.us\0" -"kashiwazaki.niigata.jp\0" +"\xe0\xa6\xac\xe0\xa6\xbe\xe0\xa6\x82\xe0\xa6\xb2\xe0\xa6\xbe\0iserv.dev\0shopware.store\0" +"motorcycle.museum\0cc.sc.us\0" +"sener\0" +"org.vn\0khakassia.su\0chirurgiens-dentistes-en-france.fr\0" +"kyotamba.kyoto.jp\0annefrank.museum\0cn.vu\0" +"jambyl.su\0customer.mythic-beasts.com\0" +"ventures\0" +"nishiokoppe.hokkaido.jp\0" +"hemne.no\0" +"nerima.tokyo.jp\0org.vu\0" +"catholic.edu.au\0" +"jobs\0" +"n.se\0yun\0store.dk\0" +"go.pw\0" +"niki.hokkaido.jp\0" +"tsubata.ishikawa.jp\0oyama.tochigi.jp\0" "org.ws\0" -"asakuchi.okayama.jp\0" -"asso.ht\0finnoy.no\0" -"jessheim.no\0" -"ragusa.it\0" -"couk.me\0" -"aikawa.kanagawa.jp\0hamar.no\0" -"int.tj\0" -"technology.museum\0r\xc3\xb8ros.no\0" -"kisarazu.chiba.jp\0kaszuby.pl\0" -"lighting\0" -"iwanai.hokkaido.jp\0opensocial.site\0" -"hanamaki.iwate.jp\0org.ye\0" -"al.gov.br\0" -"int.tt\0" -"q-a.eu.org\0" -"geo.br\0divtasvuodna.no\0ca.us\0" -"masuda.shimane.jp\0" -"asso.bj\0" +"eu.int\0skype\0" +"ballangen.no\0" +"joinville.br\0" +"cody.museum\0maryland.museum\0" +"nsn.us\0" +"softbank\0si.eu.org\0nov.ru\0" +"nagahama.shiga.jp\0" +"web.lk\0" +"org.ye\0" +"yoichi.hokkaido.jp\0" +"honefoss.no\0" +"trentino.it\0dclk\0dsmynas.net\0" +"surgeonshall.museum\0cc.ok.us\0cog.mi.us\0" +"nov.su\0" +"teo.br\0homesecuritymac.com\0" "org.za\0" -"chikushino.fukuoka.jp\0nl.no\0org.yt\0" -"ekloges.cy\0" -"arts.ro\0" -"sport.hu\0taiwa.miyagi.jp\0" -"int.ve\0" -"hidaka.hokkaido.jp\0" -"org.zm\0" -"asso.ci\0wakuya.miyagi.jp\0" -"6.bg\0chuo.chiba.jp\0takarazuka.hyogo.jp\0" -"perso.ht\0int.vn\0" -"yatomi.aichi.jp\0altervista.org\0cloudapp.net\0" -"chambagri.fr\0" -"shop.th\0" -"mo\xc3\xa5reke.no\0org.zw\0vlaanderen\0" -"koza.wakayama.jp\0troandin.no\0" -"tjome.no\0" -"it1.jenv-aruba.cloud\0" -"kamisato.saitama.jp\0" -"iwaki.fukushima.jp\0computer.museum\0" -"kuromatsunai.hokkaido.jp\0" -"of.london\0" -"hikimi.shimane.jp\0" -"lillesand.no\0" -"williamhill\0" -"okinawa.jp\0voting\0" -"computerhistory.museum\0lanbib.se\0" -"abarth\0" -"asso.dz\0" -"shiraoi.hokkaido.jp\0swidnik.pl\0" -"biella.it\0bosch\0" -"kami.miyagi.jp\0" -"musashino.tokyo.jp\0byen.site\0" -"vb.it\0" -"shoo.okayama.jp\0lib.md.us\0" -"arts.nf\0shop.ro\0" -"fage\0rogers\0" -"tmall\0" -"guam.gu\0kakegawa.shizuoka.jp\0" -"naka.hiroshima.jp\0tara.saga.jp\0" -"solar\0" -"machida.tokyo.jp\0is-a-chef.org\0" -"\xe5\xae\xae\xe5\xb4\x8e.jp\0" -"nahari.kochi.jp\0" -"minami.tokushima.jp\0family\0" -"carrd.co\0" -"shop.pl\0merckmsd\0" -"go.ci\0wakkanai.hokkaido.jp\0urasoe.okinawa.jp\0" -"discover\0" -"hs.kr\0ontario.museum\0imamat\0" -"r\xc3\xa5""de.no\0" -"jozi.biz\0" -"go.cr\0anpachi.gifu.jp\0penza.su\0" -"audible\0" -"fukushima.fukushima.jp\0oregontrail.museum\0" -"s3-eu-west-1.amazonaws.com\0" -"cloud.goog\0" -"khmelnytskyi.ua\0fail\0zara\0" -"rackmaze.com\0" +"ah.cn\0bluebite.io\0dscloud.mobi\0" +"\xe9\xa3\x9f\xe5\x93\x81\0" +"org.yt\0" +"chiba.jp\0" +"adm.br\0shiranuka.hokkaido.jp\0web.nf\0" +"dyndns.tv\0" +"tado.mie.jp\0org.zm\0with.marketing\0" +"web.ni\0go.th\0" +"si.it\0" +"go.tj\0" +"kyowa.akita.jp\0kustanai.ru\0" +"org.zw\0" +"basilicata.it\0" +"go.ug\0zip\0" +"volkenkunde.museum\0" +"tabuse.yamaguchi.jp\0go.tz\0" +"government.aero\0" +"motosu.gifu.jp\0" +"\xe5\x8f\xb0\xe7\x81\xa3\0" +"funagata.yamagata.jp\0lib.ny.us\0kustanai.su\0" +"est-mon-blogueur.com\0" +"moma.museum\0" +"nedre-eiker.no\0" +"cc.ks.us\0sk.eu.org\0" +"secaas.hk\0" +"web.pk\0joburg\0" +"kawanehon.shizuoka.jp\0bykle.no\0" +"sano.tochigi.jp\0s3.eu-west-3.amazonaws.com\0" +"ski.museum\0" +"aomori.jp\0lk3.ru\0" +"cc.vt.us\0" +"dyndns.ws\0" +"soma.fukushima.jp\0nikon\0" +"comsec\0" +"pa.it\0" +"notodden.no\0style\0" +"mobara.chiba.jp\0\xe7\xb6\xb2\xe8\xb7\xaf.tw\0" +"blockbuster\0" +"lugansk.ua\0" +"ee.eu.org\0" +"unjarga.no\0sola.no\0" +"kaneyama.fukushima.jp\0" +"takayama.nagano.jp\0deno-staging.dev\0" +"tokke.no\0translate.goog\0" +"sakuho.nagano.jp\0war.museum\0" +"hangout\0" +"property\0debian.net\0" +"k\xc3\xa5""fjord.no\0" +"oz.au\0kamiizumi.saitama.jp\0research.museum\0pvt.k12.ma.us\0" +"cloud.jelastic.open.tim.it\0" +"from-hi.com\0" +"oh.us\0" +"from-ny.net\0futuremailing.at\0*.ex.ortsinfo.at\0" +"pi.gov.br\0" +"ru.eu.org\0se.eu.org\0" +"web.tj\0" +"ochi.kochi.jp\0" +"li.it\0lawyer\0" +"kids.museum\0", + +"lucerne.museum\0hopto.me\0" +"takata.fukuoka.jp\0" +"w.se\0web.tr\0finance\0" +"yasuoka.nagano.jp\0folionetwork.site\0syno-ds.de\0" +"frogn.no\0" +"iwi.nz\0" +"rimini.it\0" +"yukuhashi.fukuoka.jp\0\xe0\xaa\xad\xe0\xaa\xbe\xe0\xaa\xb0\xe0\xaa\xa4\0" +"swidnica.pl\0" +"*.devcdnaccesso.com\0" +"nishikata.tochigi.jp\0basicserver.io\0" +"lib.hi.us\0ma.leg.br\0" +"usarts.museum\0web.ve\0" +"chikuhoku.nagano.jp\0" +"choshi.chiba.jp\0stackhero-network.com\0" +"barsy.co.uk\0" +"creditcard\0" +"tempioolbia.it\0minokamo.gifu.jp\0business\0" +"dy.fi\0" +"ainan.ehime.jp\0" +"mb.ca\0" +"tone.ibaraki.jp\0" +"wa.us\0" +"n\xc3\xa1vuotna.no\0photography\0" +"contagem.br\0botanicalgarden.museum\0technology\0" +"castle.museum\0convent.museum\0halloffame.museum\0" +"kiyosu.aichi.jp\0" +"gildesk\xc3\xa5l.no\0isa-geek.org\0" +"herad.no\0" +"adv.br\0mikawa.yamagata.jp\0" +"mihama.aichi.jp\0dlugoleka.pl\0" +"zgora.pl\0" +"sr.it\0loabat.no\0" +"usculture.museum\0giehtavuoatna.no\0" +"fl\xc3\xa5.no\0" +"diskussionsbereich.de\0" +"jab.br\0helsinki\0qbuser.com\0" +"ah.no\0myddns.rocks\0" +"horten.no\0" +"rocks\0" +"i234.me\0" +"sunagawa.hokkaido.jp\0hitachinaka.ibaraki.jp\0" +"firmdale\0" +"cc.ak.us\0" +"geometre-expert.fr\0" +"school.museum\0from-id.com\0" +"glass.museum\0web.za\0" +"fribourg.museum\0" +"ayabe.kyoto.jp\0" +"hitachi.ibaraki.jp\0akiruno.tokyo.jp\0" +"omg.lol\0" +"omitama.ibaraki.jp\0nikolaev.ua\0" +"taketa.oita.jp\0aca.pro\0hosting\0sohu\0" +"naklo.pl\0" +"boston.museum\0" +"amot.no\0" +"gotdns.com\0" +"hemnes.no\0" +"shima.mie.jp\0dp.ua\0" +"vald-aosta.it\0" +"kamitsue.oita.jp\0" +"shimane.jp\0tokoname.aichi.jp\0\xd9\x87\xd9\x85\xd8\xb1\xd8\xa7\xd9\x87\0" +"railroad.museum\0pramerica\0" +"taku.saga.jp\0country\0resindevice.io\0" +"francaise.museum\0" +"pe.gov.br\0" +"kotoura.tottori.jp\0s3.dualstack.ap-northeast-1.amazonaws.com\0" +"blogsyte.com\0" +"fuso.aichi.jp\0" +"okinawa\0en-root.fr\0" +"aosta-valley.it\0ralingen.no\0""4u.com\0" +"tanagura.fukushima.jp\0protonet.io\0" +"oshima.yamaguchi.jp\0nome.pt\0" +"cc.id.us\0dyndns-ip.com\0" +"g12.br\0" +"uchiko.ehime.jp\0" +"pa.us\0" +"westeurope.azurestaticapps.net\0" +"n\xc3\xa5\xc3\xa5mesjevuemie.no\0" +"aq.it\0ba.it\0" +"qc.ca\0" +"osasco.br\0ujitawara.kyoto.jp\0ap-northeast-2.elasticbeanstalk.com\0" +"rifu.miyagi.jp\0" +"indian.museum\0nowtv\0virgin\0" +"forgot.her.name\0" +"nctu.me\0" +"mb.it\0homegoods\0" +"ltda\0" +"stuff-4-sale.us\0" "uda.nara.jp\0" +"yombo.me\0" +"hyatt\0" +"music.museum\0" +"york.museum\0" +"kyotango.kyoto.jp\0" +"fortmissoula.museum\0co.events\0" +"*.gateway.dev\0" +"from-mt.com\0from-nd.com\0" +"piedmont.it\0" +"song\0" +"thingdustdata.com\0" +"kawanishi.yamagata.jp\0" +"tires\0" +"mobi.gp\0" +"owani.aomori.jp\0" +"ky.us\0" +"k12.ut.us\0ath.cx\0" +"pol.dz\0" +"warmia.pl\0" +"\xe9\xa6\x99\xe6\xb8\xaf\0" +"bj.cn\0aogashima.tokyo.jp\0sokndal.no\0ismaili\0" +"news.hu\0test.tj\0sony\0" +"from-dc.com\0" +"yachts\0" +"agents.aero\0" +"b\xc3\xa1l\xc3\xa1t.no\0baby\0" +"belau.pw\0" +"utashinai.hokkaido.jp\0" +"pa.gov.pl\0" +"riopreto.br\0even\xc3\xa1\xc5\xa1\xc5\xa1i.no\0" +"app.br\0" +"biei.hokkaido.jp\0elblag.pl\0deal\0bookonline.app\0" +"edu.eu.org\0" +"radoy.no\0" +"ws.na\0" +"taiji.wakayama.jp\0" +"rodeo\0" +"\xe7\x82\xb9\xe7\x9c\x8b\0httpbin.org\0" +"k12.ga.us\0" +"nishinoomote.kagoshima.jp\0horse\0" +"reggio-calabria.it\0wajima.ishikawa.jp\0" +"verm\xc3\xb6gensberatung\0collegefan.org\0" +"adv.mz\0lunner.no\0" +"ia.us\0" +"enterprises\0" +"m\xc3\xa5s\xc3\xb8y.no\0" +"cc.me.us\0\xd9\x85\xd9\x88\xd8\xb1\xd9\x8a\xd8\xaa\xd8\xa7\xd9\x86\xd9\x8a\xd8\xa7\0test.ru\0" +"yabu.hyogo.jp\0cn.eu.org\0" +"kouyama.kagoshima.jp\0" +"pol.ht\0" +"hasvik.no\0" +"cc.wv.us\0azure\0" +"is-with-theband.com\0" +"bozen.it\0" +"\xd9\x82\xd8\xb7\xd8\xb1\0capitalone\0" +"global\0" +"sardegna.it\0" +"military.museum\0pisz.pl\0isa-geek.com\0" +"ouchi.saga.jp\0fiat\0" +"\xe5\x92\x8c\xe6\xad\x8c\xe5\xb1\xb1.jp\0americanexpress\0prvcy.page\0" +"g\xc3\xbcnstigliefern.de\0" +"praxi\0" +"shibata.miyagi.jp\0sandnes.no\0" +"rio.br\0" +"pr.gov.br\0" +"citadel\0" +"seiro.niigata.jp\0" +"nord-fron.no\0" +"git-repos.de\0" +"smola.no\0" +"app.gp\0" +"tokushima.tokushima.jp\0" +"tranibarlettaandria.it\0" +"house.museum\0" +"cc.tn.us\0microsoft\0" +"fukushima.fukushima.jp\0jefferson.museum\0" +"trentin-sudtirol.it\0ddns.net\0" +"fido\0" +"paris.eu.org\0" +"catanzaro.it\0" +"midsund.no\0" +"x443.pw\0" +"s3-external-1.amazonaws.com\0" +"kv\xc3\xa6nangen.no\0" +"madrid.museum\0" +"sandnessjoen.no\0" +"doesntexist.org\0" +"s\xc3\xb8rfold.no\0" +"s3-ap-southeast-2.amazonaws.com\0" +"its.me\0" +"kyuragi.saga.jp\0sn\xc3\xa5sa.no\0" +"senseering.net\0" +"artcenter.museum\0in-vpn.org\0" +"flanders.museum\0" +"tirol\0from.marketing\0" +"nabari.mie.jp\0mimata.miyazaki.jp\0cy.eu.org\0" +"miho.ibaraki.jp\0" +"iopsys.se\0" +"kizu.kyoto.jp\0" +"kasai.hyogo.jp\0" +"contemporary.museum\0from-wv.com\0" +"oyamazaki.kyoto.jp\0" +"aip.ee\0" +"det.br\0narita.chiba.jp\0" +"snillfjord.no\0" +"\xe9\xa4\x90\xe5\x8e\x85\0to.work\0inc.hk\0" +"jprs\0" +"is.it\0" +"tt.im\0" +"univ.sn\0" +"oguchi.aichi.jp\0audnedaln.no\0" +"nemuro.hokkaido.jp\0bargains\0" +"ud.it\0sango.nara.jp\0malvik.no\0" +"cz.eu.org\0" +"\xe9\xa6\x99\xe5\xb7\x9d.jp\0bible\0" +"medio-campidano.it\0onomichi.hiroshima.jp\0" +"minamiuonuma.niigata.jp\0band\0sandcats.io\0" +"condos\0" +"jele.club\0" +"matsushima.miyagi.jp\0bank\0isteingeek.de\0" +"studio\0" +"berkeley.museum\0mansion.museum\0" +"dell\0" +"bonn.museum\0k12.sc.us\0" +"unazuki.toyama.jp\0songdalen.no\0\xeb\x8b\xb7\xec\xbb\xb4\0" +"swinoujscie.pl\0cc.mn.us\0agakhan\0" +"bulsan-suedtirol.it\0" +"okaya.nagano.jp\0" +"dk.eu.org\0" +"kitaura.miyazaki.jp\0hayakawa.yamanashi.jp\0" +"c.bg\0kitadaito.okinawa.jp\0ota.tokyo.jp\0" +"glade\0" +"watari.miyagi.jp\0berlev\xc3\xa5g.no\0" +"kamagaya.chiba.jp\0is-a-soxfan.org\0" +"jl.cn\0" +"guam.gu\0oi.kanagawa.jp\0" +"ayagawa.kagawa.jp\0hanno.saitama.jp\0cards\0" +"aibetsu.hokkaido.jp\0kanan.osaka.jp\0" +"tsukui.kanagawa.jp\0" +"boldlygoingnowhere.org\0" +"memorial.museum\0" +"perspecta.cloud\0" +"arab\0" +"management\0" +"bib.br\0amazon\0" +"\xe5\x85\xac\xe7\x9b\x8a\0" +"otama.fukushima.jp\0" +"film\0" +"cc.hn\0" +"katashina.gunma.jp\0" "s3.dualstack.eu-west-3.amazonaws.com\0" -"tabuse.yamaguchi.jp\0clinique\0" -"merseine.nu\0" -"\xe5\x98\x89\xe9\x87\x8c\0" -"lindesnes.no\0" -"jcloud.ik-server.com\0siteleaf.net\0" -"prof.pr\0" -"lublin.pl\0" -"gobo.wakayama.jp\0" -"moka.tochigi.jp\0" -"voyage\0conn.uk\0" -"kudoyama.wakayama.jp\0bukhara.su\0" -"higashitsuno.kochi.jp\0lilly\0" -"katsushika.tokyo.jp\0dopaas.com\0" -"idv.tw\0" -"museumvereniging.museum\0" -"ancona.it\0" -"cc.me.us\0dyndns-server.com\0" -"shioya.tochigi.jp\0" +"lib.md.us\0" +"yamagata.ibaraki.jp\0pol.tr\0insurance\0" +"valleeaoste.it\0nanbu.tottori.jp\0beauty\0" +"amsterdam\0" +"belem.br\0" +"customer.speedpartner.de\0" +"indiana.museum\0nannestad.no\0" +"hotels\0meet\0" +"kokonoe.oita.jp\0pagefrontapp.com\0" +"cnt.br\0" +"g\xc3\xa1ivuotna.no\0" +"bs.it\0" +"gd.cn\0edgecompute.app\0" +"rochester.museum\0" +"atl.jelastic.vps-host.net\0" +"mt.it\0kimino.wakayama.jp\0" +"usui.fukuoka.jp\0spot\0wmcloud.org\0" +"de.eu.org\0mg.leg.br\0myactivedirectory.com\0" +"tainai.niigata.jp\0izumiotsu.osaka.jp\0" +"nanyo.yamagata.jp\0" +"casadelamoneda.museum\0is-a-patsfan.org\0" +"tsukuba.ibaraki.jp\0" +"miyazaki.miyazaki.jp\0" "wsa.gov.pl\0" -"g.bg\0" -"friuli-vegiulia.it\0andoy.no\0" -"inabe.mie.jp\0" -"americanexpress\0wedding\0" -"ketrzyn.pl\0" -"namegata.ibaraki.jp\0" -"goiania.br\0hekinan.aichi.jp\0pyatigorsk.ru\0" -"cn-northwest-1.eb.amazonaws.com.cn\0" -"k12.ct.us\0" -"\xe6\x9b\xb8\xe7\xb1\x8d\0lelux.site\0" -"\xe5\xbe\xb3\xe5\xb3\xb6.jp\0fujiidera.osaka.jp\0" -"gaivuotna.no\0" -"\xd0\xbe\xd0\xb4.\xd1\x81\xd1\x80\xd0\xb1\0" -"lawyer\0" -"guge\0is-a-chef.com\0" -"wallonie.museum\0tuxfamily.org\0" -"partners\0dvrdns.org\0" -"donostia.museum\0" -"nanto.toyama.jp\0salvadordali.museum\0" -"\xc3\xa5lesund.no\0" -"software.aero\0dnsking.ch\0" -"commune.am\0" -"dattoweb.com\0" -"bergamo.it\0" -"go.id\0kiho.mie.jp\0dnsupdater.de\0" -"gj\xc3\xb8vik.no\0" -"losangeles.museum\0" -"tn.it\0" -"kitchen\0" -"pi.it\0fans\0" -"hakodate.hokkaido.jp\0" -"tsukumi.oita.jp\0nodum.co\0" -"go.it\0" -"kunohe.iwate.jp\0" -"static.land\0" -"bz.it\0hazu.aichi.jp\0kui.hiroshima.jp\0cruises\0" -"ddnsfree.com\0" -"sunagawa.hokkaido.jp\0ryugasaki.ibaraki.jp\0" -"harstad.no\0" -"nu.ca\0go.jp\0" -"alstom\0" -"chanel\0" -"cloudns.asia\0" -"go.ke\0*.gateway.dev\0" -"oita.oita.jp\0" -"nikolaev.ua\0" +"hirono.fukushima.jp\0hino.tokyo.jp\0is-a-teacher.com\0" +"mk.ua\0" +"nankoku.kochi.jp\0dray-dns.de\0" +"erotika.hu\0shiftedit.io\0" +"from-mi.com\0" +"kashiba.nara.jp\0" +"az.us\0" +"shunan.yamaguchi.jp\0k12.ks.us\0auction\0" +"olbiatempio.it\0" +"molise.it\0" +"maritime.museum\0heroy.nordland.no\0" +"plurinacional.bo\0" +"hitachiomiya.ibaraki.jp\0murmansk.su\0" +"wroclaw.pl\0" +"desi\0" +"yamanashi.jp\0" +"iwate.iwate.jp\0" +"suifu.ibaraki.jp\0jele.host\0" +"ako.hyogo.jp\0" +"milano.it\0go.dyndns.org\0" +"fjaler.no\0" +"hiraya.nagano.jp\0" +"user.aseinet.ne.jp\0us.org\0ddnss.de\0" +"keymachine.de\0" +"stokke.no\0" +"campania.it\0familyds.net\0" +"cc.na\0" +"nm.cn\0" +"hotelwithflight.com\0" +"center\0fire\0" +"ybo.science\0" +"blackfriday\0" +"mobi.tt\0" +"memorial\0" +"yn.cn\0" +"eastafrica.museum\0spdns.eu\0" +"po.gov.pl\0" +"sakuragawa.ibaraki.jp\0mobi.tz\0\xe5\x85\xab\xe5\x8d\xa6\0" +"imizu.toyama.jp\0" +"newhampshire.museum\0fentiger.mythic-beasts.com\0*.quipelements.com\0" +"niigata.niigata.jp\0" +"accesscam.org\0" +"nanae.hokkaido.jp\0" +"fish\0" +"ikeda.fukui.jp\0" +"service.gov.scot\0" +"from.hr\0luxembourg.museum\0vuelos\0home-webserver.de\0" +"barsy.net\0" +"toon.ehime.jp\0" +"godaddy\0" +"meme\0" +"c.la\0" +"l.bg\0marburg.museum\0" +"from-oh.com\0adygeya.su\0" +"\xe0\xb8\xa3\xe0\xb8\xb1\xe0\xb8\x90\xe0\xb8\x9a\xe0\xb8\xb2\xe0\xb8\xa5.\xe0\xb9\x84\xe0\xb8\x97\xe0\xb8\xa2\0" +"canada.museum\0" +"shiraoka.saitama.jp\0roan.no\0" +"orange\0" +"re.it\0vlaanderen.museum\0" +"com.ac\0" +"com.af\0\xe0\xa8\xad\xe0\xa8\xbe\xe0\xa8\xb0\xe0\xa8\xa4\0" +"com.ag\0" +"obira.hokkaido.jp\0" +"com.ai\0lixil\0spdns.org\0" +"com.al\0" +"com.am\0" +"k12.ec\0osteroy.no\0" +"com.ba\0flor\xc3\xb8.no\0barsy.online\0" +"com.ar\0com.bb\0moroyama.saitama.jp\0" +"oum.gov.pl\0" +"menu\0" +"com.au\0" +"not.br\0rockart.museum\0" +"com.aw\0" +"com.bh\0wakayama.jp\0lib.nm.us\0" +"com.bi\0ca.eu.org\0mcpre.ru\0" +"com.az\0gov.nc.tr\0" +"economia.bo\0" +"com.bm\0" +"com.bn\0" +"com.bo\0" +"takatori.nara.jp\0re.kr\0\xd8\xa7\xd9\x84\xd9\x85\xd8\xba\xd8\xb1\xd8\xa8\0" +"mobi.na\0\xe0\xb6\xbd\xe0\xb6\x82\xe0\xb6\x9a\xe0\xb7\x8f\0kurgan.su\0" +"com.br\0" +"com.bs\0moriyama.shiga.jp\0" +"com.bt\0moscow.museum\0" +"kamiamakusa.kumamoto.jp\0minamiise.mie.jp\0mobi.ng\0" +"kikugawa.shizuoka.jp\0shibuya.tokyo.jp\0" +"4.bg\0com.by\0com.ci\0dyndns-server.com\0" +"com.bz\0cl.it\0adygeya.ru\0" +"hiji.oita.jp\0" +"mielec.pl\0" +"com.cm\0omotego.fukushima.jp\0" +"com.cn\0piacenza.it\0freeddns.org\0" +"com.co\0" +"minamiechizen.fukui.jp\0ninja\0" +"repbody.aero\0" +"trento.it\0isa-geek.net\0" +"com.cu\0com.de\0" +"com.cw\0spdns.de\0" +"com.cy\0" +"okayama.okayama.jp\0" +"cc.ua\0" +"minami.tokushima.jp\0" +"com.dm\0" +"aichi.jp\0dyn-vpn.de\0" +"com.do\0" +"otofuke.hokkaido.jp\0epson\0" +"com.ec\0" +"larvik.no\0" +"com.ee\0naruto.tokushima.jp\0army\0" +"entomology.museum\0" +"com.eg\0trentinosud-tirol.it\0" +"anjo.aichi.jp\0" +"schools.nsw.edu.au\0noshiro.akita.jp\0" +"com.dz\0" +"fujisawa.iwate.jp\0strand.no\0" +"nagano.jp\0sukagawa.fukushima.jp\0" +"nes.buskerud.no\0" +"ome.tokyo.jp\0" +"com.es\0is-a-rockstar.com\0" +"com.et\0" +"v\xc3\xa5gan.no\0" +"bus.museum\0mt.us\0nd.us\0" +"k12.il\0dance\0" +"bar.pro\0" +"com.fj\0togane.chiba.jp\0" +"sakahogi.gifu.jp\0glass\0" +"arpa\0com.fm\0" +"fedje.no\0talk\0" +"*.spectrum.myjino.ru\0zakopane.pl\0" +"com.fr\0" +"coop.ht\0" +"of.by\0" +"com.ge\0ondigitalocean.app\0" +"forte.id\0" +"com.gh\0" +"com.gi\0" +"c.se\0uk.oxa.cloud\0bar0.net\0" +"qld.gov.au\0brother\0" +"com.gl\0" +"com.gn\0" +"cloud.goog\0" +"com.gp\0achi.nagano.jp\0h\xc3\xb8yanger.no\0herokuapp.com\0" +"bomlo.no\0d\xc3\xb8nna.no\0singles\0alpha.bounty-full.com\0" +"com.gr\0conn.uk\0" +"!www.ck\0com.gt\0" +"com.gu\0hinohara.tokyo.jp\0mobi.ke\0" +"akishima.tokyo.jp\0b\xc3\xa1id\xc3\xa1r.no\0" +"koeln\0" +"com.gy\0from-ar.com\0cd.eu.org\0" +"com.hk\0ancona.it\0" +"\xe5\x85\xac\xe5\x8f\xb8\0" +"com.hn\0" +"yoshida.saitama.jp\0" +"ven.it\0inazawa.aichi.jp\0*.banzai.cloud\0" +"coop.br\0" +"com.hr\0free.hr\0" +"cc.co.us\0" +"com.ht\0bod\xc3\xb8.no\0" +"adachi.tokyo.jp\0macys\0" +"sjc.br\0" +"toyota.yamaguchi.jp\0" +"marketing\0" +"computer\0" +"com.im\0" +"com.io\0mydrobo.com\0" +"experts-comptables.fr\0yonaguni.okinawa.jp\0" +"com.iq\0" +"taifun-dns.de\0" +"com.is\0" +"u.bg\0higashimatsuyama.saitama.jp\0" +"loginline.services\0" +"bozen-sudtirol.it\0\xe6\x96\xb0\xe6\xbd\x9f.jp\0" +"uzhgorod.ua\0" +"map.fastlylb.net\0" +"asda\0" +"rn.it\0" +"com.jo\0\xc3\xa1lt\xc3\xa1.no\0" +"arte\0" +"komatsu.ishikawa.jp\0" +"yokkaichi.mie.jp\0" +"luxe\0" +"cherkassy.ua\0de.gt\0" +"com.kg\0museumvereniging.museum\0kaluga.su\0" +"devices.resinstaging.io\0" +"com.ki\0embaixada.st\0" +"messina.it\0\xe5\xa4\xa7\xe9\x98\xaa.jp\0" +"gv.ao\0" +"com.km\0" +"com.kp\0aviation.museum\0shell\0" +"gv.at\0com.la\0" +"com.lb\0" +"com.lc\0" +"com.kw\0" +"vf.no\0" +"fujisato.akita.jp\0com.ky\0" +"com.kz\0" +"com.lk\0" +"\xe6\xb2\x96\xe7\xb8\x84.jp\0barsy.pro\0" +"bbva\0" +"shimosuwa.nagano.jp\0" +"omura.nagasaki.jp\0" +"\xc3\xb8yer.no\0sorreisa.no\0" +"com.lr\0gub.uy\0" +"historical.museum\0l\xc3\xb8renskog.no\0shiksha\0" +"com.lv\0cc.vi.us\0dynalias.net\0" +"livorno.it\0kawaminami.miyazaki.jp\0com.mg\0" +"com.ly\0" +"seirou.niigata.jp\0com.mk\0trustee.museum\0" +"com.ml\0" +"com.mo\0" +"crafts.museum\0of.je\0" +"com.na\0" +"com.ms\0" +"com.mt\0" +"tomi.nagano.jp\0com.mu\0" +"com.mv\0com.nf\0" +"com.mw\0com.ng\0" +"com.mx\0mw.gov.pl\0clickrising.net\0" +"com.my\0com.ni\0exchange\0" +"virtual.museum\0" +"skaun.no\0" +"barsy.pub\0" +"com.nr\0" +"campidano-medio.it\0" +"hanyu.saitama.jp\0nid.io\0" +"markets\0certmgr.org\0" +"\xd9\x83\xd9\x88\xd9\x85\0" +"cloudycluster.net\0*.on-rancher.cloud\0" +"*.kawasaki.jp\0k12.me.us\0" +"bergbau.museum\0" +"asia\0shinichi.hiroshima.jp\0com.om\0" +"ovre-eiker.no\0" +"accenture\0" +"kasuga.hyogo.jp\0com.pa\0" +"nm.us\0" +"schlesisches.museum\0s\xc3\xb8mna.no\0" +"s3.dualstack.us-east-2.amazonaws.com\0issmarterthanyou.com\0" +"com.pe\0de.ls\0" +"com.pf\0de.md\0" +"suli.hu\0" +"com.ph\0" +"lewismiller.museum\0" +"organic\0blog.gt\0" +"com.pk\0" +"com.pl\0" +"\xe5\x8c\x97\xe6\xb5\xb7\xe9\x81\x93.jp\0" +"ms.gov.br\0historyofscience.museum\0" +"barletta-trani-andria.it\0holmestrand.no\0" +"com.qa\0" +"fukui.fukui.jp\0com.pr\0dontexist.net\0" +"fla.no\0com.ps\0" +"brussel.museum\0com.pt\0" +"komono.mie.jp\0" +"l.se\0" +"kakegawa.shizuoka.jp\0" +"komae.tokyo.jp\0com.py\0\xe5\x95\x86\xe5\xba\x97\0" +"boleslawiec.pl\0" +"k12.tr\0yali.mythic-beasts.com\0" +"art.br\0fusa.no\0" +"sakata.yamagata.jp\0discount\0" +"abu.yamaguchi.jp\0" +"us-gov-west-1.elasticbeanstalk.com\0jed.wafaicloud.com\0" +"sakegawa.yamagata.jp\0" +"vix.br\0asahi.ibaraki.jp\0ohira.miyagi.jp\0com.re\0" +"kanie.aichi.jp\0natura\0" +"graphics\0" +"of.no\0" +"philadelphiaarea.museum\0taxi\0" +"mt.gov.br\0" +"com.ro\0" +"otsuchi.iwate.jp\0com.sa\0" +"yawata.kyoto.jp\0com.sb\0" +"yazu.tottori.jp\0com.sc\0" +"com.sd\0k12.tx.us\0k12.vi\0withyoutube.com\0" +"blog.bo\0com.se\0com.ru\0" +"com.sg\0" +"blog.br\0com.sh\0cc.ny.us\0tunk.org\0" +"\xd8\xb9\xd9\x85\xd8\xa7\xd9\x86\0no-ip.biz\0" +"art.do\0\xe6\x8b\x9b\xe8\x81\x98\0githubpreview.dev\0" +"com.sl\0" +"bahn.museum\0com.sn\0" +"ogori.fukuoka.jp\0com.so\0" +"kainan.tokushima.jp\0" +"usa.oita.jp\0hemsedal.no\0\xd8\xa7\xd8\xaa\xd8\xb5\xd8\xa7\xd9\x84\xd8\xa7\xd8\xaa\0" +"caxias.br\0mo\xc3\xa5reke.no\0skierva.no\0" +"com.ss\0" +"com.st\0" +"art.dz\0kawaba.gunma.jp\0com.sv\0" +"laspezia.it\0" +"merseine.nu\0" +"trentinos\xc3\xbc""dtirol.it\0com.sy\0" +"com.tj\0eastasia.azurestaticapps.net\0" +"loab\xc3\xa1t.no\0poltava.ua\0*.customer-oci.com\0" +"com.tm\0" +"com.tn\0turen.tn\0" +"teramo.it\0com.to\0" +"com.ua\0" +"com.tr\0" +"com.tt\0" +"pilot.aero\0" +"com.tw\0com.ug\0audible\0" +"ezproxy.kuleuven.be\0" +"yasaka.nagano.jp\0" +"cremona.it\0j.scaleforce.com.cy\0" +"chicago.museum\0" +"tamaki.mie.jp\0" +"seki.gifu.jp\0timekeeping.museum\0lib.ok.us\0" +"tysv\xc3\xa6r.no\0" +"reliance\0" +"com.vc\0in-vpn.net\0" +"is-a-musician.com\0" +"com.ve\0" +"cam.it\0nisshin.aichi.jp\0takahama.fukui.jp\0aga.niigata.jp\0\xd8\xb4\xd8\xa8\xd9\x83\xd8\xa9\0" +"zarow.pl\0cc.la.us\0com.uy\0com.vi\0" +"com.uz\0" +"kyiv.ua\0" +"california.museum\0" +"ibaraki.osaka.jp\0\xc3\xa5krehamn.no\0com.vn\0" +"kokubunji.tokyo.jp\0skjervoy.no\0" +"com.vu\0" +"szex.hu\0" +"telebit.io\0" +"bearalvahki.no\0" +"art.ht\0" +"murata.miyagi.jp\0" +"groks-the.info\0vaporcloud.io\0" +"com.ws\0" +"floripa.br\0""3utilities.com\0" +"far.br\0" +"woltlab-demo.com\0" +"fukuroi.shizuoka.jp\0" +"morimachi.shizuoka.jp\0bridgestone\0" +"bestbuy\0" +"keliweb.cloud\0" +"cleverapps.io\0" +"yamagata.gifu.jp\0" +"yoshino.nara.jp\0" +"de.us\0com.ye\0svn-repos.de\0" +"coop.rw\0k12.nh.us\0" +"landrover\0azure-mobile.net\0" +"ogawara.miyagi.jp\0cc.hi.us\0" +"ekloges.cy\0pri.ee\0" +"puglia.it\0nv.us\0" +"paas.hosted-by-previder.com\0" +"gru.br\0idv.hk\0" +"now-dns.net\0" +"koza.wakayama.jp\0\xd0\xba\xd1\x80\xd1\x8b\xd0\xbc.\xd1\x80\xd1\x83\xd1\x81\0" +"\xe9\x9d\x92\xe6\xa3\xae.jp\0" +"nakamichi.yamanashi.jp\0" +"nalchik.ru\0" +"b\xc3\xa6rum.no\0" +"poa.br\0kiwi.nz\0" +"com.zm\0" +"patria.bo\0fukuoka.jp\0urasoe.okinawa.jp\0bjugn.no\0" +"sakyo.kyoto.jp\0" +"omigawa.chiba.jp\0u.se\0" +"coop.tt\0" +"\xd9\x85\xd8\xb5\xd8\xb1\0" +"uhren.museum\0" +"hamada.shimane.jp\0other.nf\0" +"lg.jp\0nalchik.su\0ent.platform.sh\0" +"shinanomachi.nagano.jp\0" +"lucca.it\0kamakura.kanagawa.jp\0" +"rec.br\0steinkjer.no\0house\0" +"daplie.me\0" +"loans\0" +"avoues.fr\0eiheiji.fukui.jp\0kishiwada.osaka.jp\0" +"gamvik.no\0" +"dnepropetrovsk.ua\0yalta.ua\0" +"pictet\0barsy.org\0" +"ltd.cy\0coop.mv\0" +"coop.mw\0motorcycles\0" +"skodje.no\0" +"rec.co\0" +"forgot.his.name\0" +"aero.tt\0" +"building.museum\0freesite.host\0" +"\xe5\x85\xac\xe5\x8f\xb8.\xe9\xa6\x99\xe6\xb8\xaf\0\xe9\x9b\x86\xe5\x9b\xa2\0" +"shingu.wakayama.jp\0" +"cc.or.us\0" +"liguria.it\0" +"podzone.net\0" +"skedsmokorset.no\0mazowsze.pl\0ivano-frankivsk.ua\0" +"aero.mv\0" +"odessa.ua\0" +"sp.it\0kep.tr\0" +"koeln.museum\0newyork.museum\0" +"urausu.hokkaido.jp\0" +"kuki.saitama.jp\0" +"fuossko.no\0" +"scrapping.cc\0eating-organic.net\0" +"mima.tokushima.jp\0lib.dc.us\0" +"ltd.gi\0eaton.mi.us\0" +"shonai.yamagata.jp\0" +"coop.py\0*.webpaas.ovh.net\0art.pl\0" +"nakaniikawa.toyama.jp\0\xd8\xa7\xd9\x84\xd8\xb9\xd9\x84\xd9\x8a\xd8\xa7\xd9\x86\0" +"mashiki.kumamoto.jp\0sandvikcoromant\0" +"tysnes.no\0blog.vu\0" +"saiki.oita.jp\0" +"kaneyama.yamagata.jp\0gucci\0" +"kagoshima.jp\0legnica.pl\0" +"gv.vc\0" +"archaeological.museum\0agric.za\0" +"bloomberg\0" +"ullensvang.no\0*.cryptonomic.net\0" +"nat.tn\0" +"press.aero\0ltd.hk\0" +"mombetsu.hokkaido.jp\0" +"ch.eu.org\0" +"os\xc3\xb8yro.no\0" +"ternopil.ua\0" +"\xe7\xbb\x84\xe7\xbb\x87\xe6\x9c\xba\xe6\x9e\x84\0" +"jinsekikogen.hiroshima.jp\0" +"kagoshima.kagoshima.jp\0" +"center.museum\0" +"ann-arbor.mi.us\0" +"barum.no\0" +"servequake.com\0" +"coop.km\0gentlentapis.com\0familyds.org\0" +"brescia.it\0nyaa.am\0" +"dn.ua\0" +"technology.museum\0" +"lib.ak.us\0" +"host\0" +"k\xc3\xa1r\xc3\xa1\xc5\xa1johka.no\0*.oci.customer-oci.com\0" +"\xe7\xbd\x91\xe7\xb5\xa1.hk\0" +"yasugi.shimane.jp\0marine.ru\0" +"\xe9\x95\xb7\xe5\xb4\x8e.jp\0art.sn\0" +"recreation.aero\0" +"zuerich\0de.trendhosting.cloud\0" +"ddr.museum\0" +"zp.ua\0" +"ube.yamaguchi.jp\0airguard.museum\0k12.mo.us\0" +"happou.akita.jp\0ny-2.paas.massivegrid.net\0" +"oppegard.no\0mragowo.pl\0" +"terni.it\0lib.wi.us\0christmas\0" +"kisosaki.mie.jp\0wios.gov.pl\0fidelity\0" +"beppu.oita.jp\0" +"troitsk.su\0" +"ao.it\0impertrix.com\0" +"hiratsuka.kanagawa.jp\0" +"ltd.lk\0" +"sanfrancisco.museum\0" +"amber.museum\0\xe0\xa6\xad\xe0\xa6\xbe\xe0\xa6\xb0\xe0\xa6\xa4\0" +"hjelmeland.no\0" "gov.ac\0" -"nakasatsunai.hokkaido.jp\0oy.lc\0" -"gov.ae\0*.quipelements.com\0" -"gov.af\0myfritz.net\0" -"natori.miyagi.jp\0press.se\0\xe0\xb8\x97\xe0\xb8\xab\xe0\xb8\xb2\xe0\xb8\xa3.\xe0\xb9\x84\xe0\xb8\x97\xe0\xb8\xa2\0" -"tanagura.fukushima.jp\0" -"go.kr\0dolls.museum\0nodum.io\0" -"gov.al\0kyotamba.kyoto.jp\0" -"\xe0\xa6\xac\xe0\xa6\xbe\xe0\xa6\x82\xe0\xa6\xb2\xe0\xa6\xbe\0" -"courses\0flap.id\0" -"gov.ba\0" +"gov.ae\0" +"gov.af\0kddi\0" +"gwiddle.co.uk\0" +"gojome.akita.jp\0kumano.hiroshima.jp\0" +"higashikurume.tokyo.jp\0" +"gov.al\0" +"est-a-la-maison.com\0" +"lg.ua\0" +"gov.ba\0flir\0" "gov.ar\0gov.bb\0" "gov.as\0" -"gov.au\0" -"iris.arpa\0gov.bf\0dn.ua\0" -"\xe7\xb5\x84\xe7\xbb\x87.hk\0susono.shizuoka.jp\0" -"gov.bh\0" -"gov.az\0east-kazakhstan.su\0" -"ojiya.niigata.jp\0" -"kamikawa.hyogo.jp\0" -"gov.bm\0marriott\0" -"gov.bn\0goto.nagasaki.jp\0" -"asso.re\0farm\0" -"western.museum\0" -"gov.br\0\xe7\xbd\x91\xe7\xbb\x9c\0" -"gov.bs\0watarai.mie.jp\0" -"gov.bt\0gov.cd\0asahi.ibaraki.jp\0saintlouis.museum\0" -"ostrowiec.pl\0help\0phx.enscaled.us\0" -"mod.gi\0" -"tunk.org\0" -"gov.by\0koganei.tokyo.jp\0" -"gov.bz\0suzuka.mie.jp\0" -"gov.cl\0marnardal.no\0" +"iwate.jp\0" +"gov.au\0jor.br\0demon.nl\0" +"gov.bf\0misato.shimane.jp\0" +"gov.bh\0ltd.ng\0" +"gov.az\0michigan.museum\0" +"gov.bm\0" +"gov.bn\0selfip.info\0" +"idv.tw\0" +"gov.br\0" +"gov.bs\0" +"gov.bt\0gov.cd\0js.wpenginepowered.com\0" +"sassari.it\0nyny.museum\0rec.nf\0" +"staples\0" +"gov.by\0" +"gov.bz\0" +"mcpe.me\0" +"gov.cl\0" "gov.cm\0" -"gov.cn\0" -"gov.co\0nabari.mie.jp\0" -"barcelona.museum\0" -"tourism.tn\0" -"gov.cu\0cc.la.us\0grondar.za\0" -"fast\0" -"priv.hu\0misato.miyagi.jp\0no-ip.net\0" -"gov.cx\0" +"gov.cn\0dyn-o-saur.com\0" +"gov.co\0" +"karm\xc3\xb8y.no\0" +"haugesund.no\0" +"osen.no\0" +"rennesoy.no\0" +"gov.cu\0" +"toyoake.aichi.jp\0knx-server.net\0" +"gov.cx\0\xe5\xae\xae\xe5\xb4\x8e.jp\0" "gov.cy\0" +"takino.hyogo.jp\0cya.gg\0" +"hellas.museum\0" +"medicina.bo\0xj.cn\0" "gov.dm\0" -"vagsoy.no\0" -"gov.do\0tome.miyagi.jp\0" -"crimea.ua\0" +"at.eu.org\0" +"gov.do\0vanylven.no\0" +"cn-north-1.eb.amazonaws.com.cn\0" +"izumi.osaka.jp\0" +"nakagusuku.okinawa.jp\0" "gov.ec\0" "gov.ee\0" -"historyofscience.museum\0" -"gov.eg\0" -"gov.dz\0\xda\x80\xd8\xa7\xd8\xb1\xd8\xaa\0" -"tohma.hokkaido.jp\0" -"imari.saga.jp\0nesodden.no\0" -"gov.et\0balsan.it\0noda.iwate.jp\0" -"capitalone\0" -"niigata.jp\0berlin\0" -"gov.fj\0unnan.shimane.jp\0" -"asso.nc\0karm\xc3\xb8y.no\0" -"go.pw\0" -"jur.pro\0" -"toei.aichi.jp\0oki.fukuoka.jp\0gb.net\0" -"farmstead.museum\0cuisinella\0" -"perso.sn\0" -"press.ma\0" -"gov.gd\0wodzislaw.pl\0academy\0" -"gov.ge\0lifeinsurance\0" -"lib.ny.us\0" -"gov.gh\0berlin.museum\0" -"gov.gi\0fla.no\0" -"nu.it\0" -"birdart.museum\0hisamitsu\0shaw\0" -"wazuka.kyoto.jp\0" -"orsites.com\0" -"gov.gn\0" -"sekikawa.niigata.jp\0" -"\xce\xb5\xce\xbb\0" -"gov.gr\0yoshioka.gunma.jp\0perso.tn\0" -"av.it\0" -"gov.gu\0ujiie.tochigi.jp\0elblag.pl\0gripe\0" -"gov.gy\0" -"trentino-s\xc3\xbc""dtirol.it\0fujikawaguchiko.yamanashi.jp\0\xce\xb5\xcf\x85\0akdn\0here\0" -"gov.hk\0higashi.fukushima.jp\0" -"jp.kg\0" -"presidio.museum\0" -"cable-modem.org\0" -"usdecorativearts.museum\0hyllestad.no\0" -"ab.ca\0gov.ie\0gyeongbuk.kr\0beats\0london\0" -"priv.at\0" -"zushi.kanagawa.jp\0" -"niigata.niigata.jp\0guru\0repair\0" -"gov.il\0" -"gov.in\0palmsprings.museum\0" -"echizen.fukui.jp\0go.th\0" -"gov.iq\0go.tj\0diskussionsbereich.de\0" -"gov.ir\0dreamhosters.com\0" -"gov.is\0hagebostad.no\0barsy.site\0to.work\0" +"gov.eg\0himi.toyama.jp\0" +"esashi.hokkaido.jp\0" +"morena.br\0gov.dz\0vda.it\0skygearapp.com\0" +"works\0" +"firm.ht\0cc.ar.us\0world\0" +"tenkawa.nara.jp\0" +"tokashiki.okinawa.jp\0" +"gov.et\0" +"press\0" +"tempio-olbia.it\0gobo.wakayama.jp\0" +"firm.in\0land-4-sale.us\0" +"gov.fj\0s3.ca-central-1.amazonaws.com\0" +"ox.rs\0" +"\xe7\x86\x8a\xe6\x9c\xac.jp\0" +"asago.hyogo.jp\0" +"\xe5\xa4\xa7\xe5\x88\x86.jp\0kita.tokyo.jp\0flickr\0" +"otaru.hokkaido.jp\0us-east-2.elasticbeanstalk.com\0" +"urbino-pesaro.it\0chihayaakasaka.osaka.jp\0" +"isumi.chiba.jp\0artsandcrafts.museum\0essex.museum\0" +"nagoya\0" +"is-a-linux-user.org\0" +"gov.gd\0" +"gov.ge\0" +"gov.gh\0" +"gov.gi\0" +"izena.okinawa.jp\0kirovograd.ua\0audi\0vologda.su\0" +"monster\0" +"mediocampidano.it\0shiogama.miyagi.jp\0endofinternet.net\0" +"gov.gn\0powiat.pl\0rec.ro\0" +"rel.ht\0s\xc3\xb8r-varanger.no\0" +"degree\0" +"gov.gr\0pimienta.org\0blog.kg\0" +"qld.edu.au\0" +"elasticbeanstalk.com\0" +"gov.gu\0ujiie.tochigi.jp\0exeter.museum\0" +"firm.co\0\xd8\xa7\xd9\x84\xd8\xb3\xd8\xb9\xd9\x88\xd8\xaf\xd9\x8a\xd9\x87\0" +"gov.gy\0\xe5\xb2\xa9\xe6\x89\x8b.jp\0newmexico.museum\0" +"kunisaki.oita.jp\0" +"gov.hk\0star\0" +"yusuhara.kochi.jp\0lib.la.us\0" +"shinkamigoto.nagasaki.jp\0sandoy.no\0minisite.ms\0" +"dating\0" +"hirata.fukushima.jp\0chattanooga.museum\0ltd.ua\0small-web.org\0" +"beer\0" +"media.museum\0firm.dk\0" +"gov.ie\0" +"palace.museum\0plumbing\0" +"taka.hyogo.jp\0" +"kami.kochi.jp\0chrome\0" +"gov.il\0ltd.uk\0" +"gov.in\0" +"yakage.okayama.jp\0" +"toyo.kochi.jp\0vadso.no\0" +"gov.iq\0kvitsoy.no\0" +"gov.ir\0" +"gov.is\0" "gov.it\0" -"filegear-sg.me\0" -"gob.ar\0" -"yuki.ibaraki.jp\0" -"is-very-evil.org\0" -"avoues.fr\0traniandriabarletta.it\0official.academy\0" -"sakae.chiba.jp\0" -"miyazu.kyoto.jp\0murayama.yamagata.jp\0jp.md\0" -"go.ug\0" -"gov.jo\0" -"ikano\0" -"sardinia.it\0go.tz\0tn.us\0epson\0" -"tainai.niigata.jp\0" -"daejeon.kr\0" -"gob.bo\0\xc3\xb8ksnes.no\0" -"utsunomiya.tochigi.jp\0" -"taranto.it\0tateyama.chiba.jp\0" -"gov.kg\0" -"\xe5\x95\x86\xe5\x9f\x8e\0" -"aisai.aichi.jp\0kanan.osaka.jp\0gov.ki\0glogow.pl\0" -"tako.chiba.jp\0gov.km\0" -"gov.kn\0" -"tsk.tr\0istanbul\0" -"gov.kp\0railroad.museum\0aver\xc3\xb8y.no\0dovre.no\0" -"gob.cl\0gov.la\0smile\0" -"gov.lb\0\xd0\xba\xd0\xb0\xd1\x82\xd0\xbe\xd0\xbb\xd0\xb8\xd0\xba\0pl.eu.org\0" -"iwade.wakayama.jp\0gov.lc\0seljord.no\0" -"hokkaido.jp\0" -"asso.km\0gov.kw\0" -"tingvoll.no\0" +"priv.hu\0" +"hiraizumi.iwate.jp\0" +"fi.cr\0mi.it\0aurland.no\0passagens\0istmein.de\0" +"\xd8\xa7\xd9\x84\xd8\xb3\xd8\xb9\xd9\x88\xd8\xaf\xd9\x8a\xd8\xa9\0" +"nonoichi.ishikawa.jp\0" +"ac.gov.br\0kagawa.jp\0" +"lanxess\0\xe3\x83\x9d\xe3\x82\xa4\xe3\x83\xb3\xe3\x83\x88\0" +"gov.jo\0\xe7\xa7\xbb\xe5\x8a\xa8\0" +"trentinsued-tirol.it\0" +"geisei.kochi.jp\0lighting\0" +"rec.ve\0" +"ato.br\0gov.kg\0" +"guardian\0" +"gov.ki\0" +"security\0stockholm\0" +"\xe6\x89\x8b\xe6\x9c\xba\0" +"diet\0unusualperson.com\0" +"gov.km\0surnadal.no\0" +"gov.kn\0bnpparibas\0" +"gov.kp\0bloger.id\0" +"gov.la\0sebastopol.ua\0shouji\0*.tst.site\0" +"gov.lb\0group\0" +"gov.lc\0g\xc3\xa1ls\xc3\xa1.no\0zone\0" +"gratis\0" +"tsushima.nagasaki.jp\0gov.kw\0" +"maringa.br\0" "gov.ky\0" "gov.kz\0" -"gov.lk\0\xe5\x81\xa5\xe5\xba\xb7\0" -"logoip.com\0" -"royken.no\0" -"\xc3\xa5lg\xc3\xa5rd.no\0tele.amune.org\0" -"cc.as.us\0" -"gov.ma\0" -"iizuka.fukuoka.jp\0gov.lr\0" -"gov.ls\0" -"gob.do\0gov.lt\0g.se\0k12.in.us\0" +"slg.br\0gov.lk\0l\xc3\xb8ten.no\0" +"newspaper.museum\0contact\0" +"k12.va.us\0" +"grosseto.it\0trogstad.no\0piw.gov.pl\0" +"noheji.aomori.jp\0rocher\0" +"gov.ma\0stordal.no\0trust\0" +"nb.ca\0gov.lr\0duckdns.org\0" +"nagaoka.niigata.jp\0gov.ls\0" +"gov.lt\0is-a-landscaper.com\0tuva.su\0" "gov.me\0" "gov.lv\0" -"gov.mg\0leksvik.no\0" -"gob.ec\0myjino.ru\0" +"\xe5\xb1\xb1\xe5\x8f\xa3.jp\0gov.mg\0" "gov.ly\0" -"aparecida.br\0" -"gov.mk\0" -"gov.ml\0" -"asso.mc\0keymachine.de\0" -"gov.mn\0" +"echizen.fukui.jp\0gov.mk\0" +"fukuchiyama.kyoto.jp\0gov.ml\0" +"gov.mn\0norton\0dynalias.org\0" "gov.mo\0" -"gov.mr\0" -"gov.ms\0" -"engineer.aero\0cng.br\0" -"gov.mu\0ostroleka.pl\0shia\0" -"gov.mv\0" +"history.museum\0deno.dev\0" +"gov.mr\0cincinnati.museum\0" +"tr.it\0gov.ms\0" +"kiyama.saga.jp\0mypsx.net\0" +"gov.mu\0" +"gov.mv\0schulserver.de\0" "gov.mw\0gov.ng\0" -"gob.es\0" +"tsuchiura.ibaraki.jp\0" "gov.my\0" -"gov.mz\0" -"erni\0barsy.info\0" -"california.museum\0" -"cloud.interhostsolutions.be\0" +"gov.mz\0ollo\0" +"r\xc3\xb8yrvik.no\0" +"africa\0" +"n\xc3\xb8tter\xc3\xb8y.no\0" "gov.nr\0" -"pharmacien.fr\0" -"marumori.miyagi.jp\0cust.disrec.thingdust.io\0" -"shikaoi.hokkaido.jp\0" -"sakata.yamagata.jp\0" -"nichinan.tottori.jp\0" -"hino.tottori.jp\0" -"zaporizhzhia.ua\0barsy.shop\0" -"utazu.kagawa.jp\0lib.nm.us\0" -"gov.om\0" -"na.it\0saskatchewan.museum\0" -"aaa.pro\0" -"tourism.pl\0" -"nanyo.yamagata.jp\0" -"qld.gov.au\0nokia\0" -"gov.ph\0" -"gob.gt\0" -"glitch.me\0" -"gov.pk\0fastvps.host\0" +"\xd9\xbe\xd8\xa7\xda\xa9\xd8\xb3\xd8\xaa\xd8\xa7\xd9\x86\0" +"kikonai.hokkaido.jp\0mifune.kumamoto.jp\0johana.toyama.jp\0" +"hs.zone\0" +"academy.museum\0priv.at\0" +"rel.pl\0pgfog.com\0applinzi.com\0" +"tokorozawa.saitama.jp\0" +"banamex\0" +"gov.om\0channelsdvr.net\0" +"tateyama.chiba.jp\0r\xc3\xb8st.no\0babia-gora.pl\0" +"whaling.museum\0" +"\xce\xb5\xce\xbb\0ownprovider.com\0" +"observer\0diadem.cloud\0" +"kragero.no\0gov.ph\0" +"a.bg\0fhsk.se\0" +"fi.it\0monza.it\0ginoza.okinawa.jp\0gov.pk\0\xce\xb5\xcf\x85\0" "gov.pl\0" -"omniwe.site\0" -"gov.pn\0" -"cinema.museum\0" -"schokokeks.net\0" -"windmill.museum\0gov.qa\0" -"gov.pr\0" -"gob.hn\0potenza.it\0kiwa.mie.jp\0gov.ps\0" -"chocolate.museum\0gov.pt\0" -"nsupdate.info\0" -"tw.cn\0" -"gov.py\0" -"miyada.nagano.jp\0s3.eu-central-1.amazonaws.com\0" -"ethnology.museum\0" -"hitachiota.ibaraki.jp\0" -"gx.cn\0inzai.chiba.jp\0higashiagatsuma.gunma.jp\0" -"reggioemilia.it\0kunstsammlung.museum\0" -"kagami.kochi.jp\0" -"linde\0\xe3\x81\xbf\xe3\x82\x93\xe3\x81\xaa\0bmoattachments.org\0" -"arkhangelsk.su\0" -"lesja.no\0" -"my-router.de\0" -"swiebodzin.pl\0" -"miyagi.jp\0" -"isleofman.museum\0r\xc3\xa1isa.no\0" -"alstahaug.no\0mielno.pl\0" -"forsand.no\0gov.sa\0av.tr\0" -"gov.sb\0" -"gov.rs\0gov.sc\0" -"gov.sd\0" -"kawanishi.hyogo.jp\0furniture.museum\0gov.ru\0" -"dellogliastra.it\0legal\0" -"takata.fukuoka.jp\0gov.rw\0gov.sg\0" -"kumejima.okinawa.jp\0costume.museum\0gov.sh\0" -"economia.bo\0pesarourbino.it\0schoenbrunn.museum\0" -"is-with-theband.com\0" -"gov.sl\0" -"drud.io\0" -"gov.so\0" -"trentinoalto-adige.it\0" -"is-a-chef.net\0" -"gov.ss\0" -"lavagis.no\0gov.st\0" -"*.yokohama.jp\0work\0" -"gov.sx\0" -"gov.sy\0*.on-rio.io\0" -"gov.tj\0" -"gov.tl\0cc.mn.us\0coupons\0" -"gov.tm\0" -"esp.br\0gov.tn\0" -"*.kitakyushu.jp\0gov.to\0" -"greta.fr\0gov.ua\0" -"p.bg\0gov.tr\0" -"opencraft.hosting\0" -"shikokuchuo.ehime.jp\0gov.tt\0shop\0" -"her\xc3\xb8y.nordland.no\0k12.me.us\0" -"ashikaga.tochigi.jp\0gov.tw\0" -"psi.br\0" -"logistics.aero\0" -"cremona.it\0gov.uk\0show\0" -"\xe7\xbd\x91\xe7\xb5\xa1.hk\0" -"aeroclub.aero\0" -"hanamigawa.chiba.jp\0accountants\0" -"gov.vc\0" -"kishiwada.osaka.jp\0muenchen.museum\0gov.ve\0from-wa.com\0" -"malopolska.pl\0" -"fuji.shizuoka.jp\0" -"\xd8\xa7\xdb\x8c\xd8\xb1\xd8\xa7\xd9\x86\0" -"gob.mx\0senseering.net\0" -"gob.ni\0gov.vn\0is-a-celticsfan.org\0" -"higashimatsuyama.saitama.jp\0catholic\0" -"bir.ru\0" -"tawaramoto.nara.jp\0" -"ballooning.aero\0komaki.aichi.jp\0pagexl.com\0" -"lom.it\0" -"moriguchi.osaka.jp\0latrobe\0qc.com\0" -"funagata.yamagata.jp\0" -"store.nf\0" -"from-id.com\0" -"video.hu\0aomori.aomori.jp\0" -"plc.ly\0" -"pr.it\0lib.la.us\0" -"kepno.pl\0" -"gov.ws\0" -"bentley\0homedns.org\0" -"coop.ht\0gob.pa\0kerryhotels\0" -"modum.no\0" -"cs.it\0gob.pe\0" -"olayangroup\0*.dev.adobeaemcloud.com\0" -"hughes\0balena-devices.com\0" -"ichikawamisato.yamanashi.jp\0gob.pk\0pixolino.com\0" -"tc.br\0" -"modelling.aero\0on.ca\0" -"cultural.museum\0" -"\xe5\xb1\xb1\xe6\xa2\xa8.jp\0b\xc3\xa1l\xc3\xa1t.no\0gov.ye\0" -"shimamaki.hokkaido.jp\0tsushima.nagasaki.jp\0" -"niteroi.br\0slask.pl\0cool\0" -"coop\0" -"artdeco.museum\0stranda.no\0" -"gov.za\0" -"risor.no\0" -"zp.ua\0is-an-entertainer.com\0" -"coop.br\0" -"unzen.nagasaki.jp\0vaporcloud.io\0" -"gd.cn\0spacekit.io\0" -"orange\0" -"\xe4\xb8\x89\xe9\x87\x8d.jp\0" -"sibenik.museum\0" -"govt.nz\0tychy.pl\0" -"ito.shizuoka.jp\0gov.zm\0" -"daisen.akita.jp\0mizuho.tokyo.jp\0from-tx.com\0" -"kounosu.saitama.jp\0" -"eidfjord.no\0katowice.pl\0" -"piw.gov.pl\0" -"tsubetsu.hokkaido.jp\0" -"seranishi.hiroshima.jp\0gov.zw\0own.pm\0" -"workers.dev\0" -"gorge.museum\0" -"scienceandindustry.museum\0" -"plurinacional.bo\0" -"shinjuku.tokyo.jp\0austrheim.no\0priv.pl\0zhitomir.ua\0" -"wakayama.jp\0mukawa.hokkaido.jp\0" -"lom.no\0" -"il.us\0" -"from-dc.com\0" -"joboji.iwate.jp\0nishiizu.shizuoka.jp\0" -"hemsedal.no\0" -"itako.ibaraki.jp\0" -"taiki.mie.jp\0gob.sv\0" -"cust.dev.thingdust.io\0" -"ikoma.nara.jp\0lacaixa\0" -"kasahara.gifu.jp\0\xe6\x94\xbf\xe5\x8a\xa1\0" -"trentino-suedtirol.it\0" -"langevag.no\0" -"cc.gu.us\0" -"eng.br\0leadpages.co\0" -"nom.ad\0" -"nom.ae\0" -"nom.af\0" -"nom.ag\0podlasie.pl\0edugit.org\0" -"conference.aero\0k12.ky.us\0" -"nom.ai\0" -"from-va.com\0" -"nom.al\0" -"matsumae.hokkaido.jp\0priv.no\0" -"dazaifu.fukuoka.jp\0" -"gob.ve\0" -"kokonoe.oita.jp\0\xd8\xb3\xd9\x88\xd8\xb1\xd9\x8a\xd8\xa7\0" -"\xd8\xb3\xd9\x88\xd8\xb1\xd9\x8a\xd8\xa9\0loginline.site\0" -"pavia.it\0iveco\0" -"waw.pl\0" -"rennes\xc3\xb8y.no\0" -"nativeamerican.museum\0aca.pro\0" -"toba.mie.jp\0" -"katsuragi.wakayama.jp\0" -"fed.us\0store.ve\0nctu.me\0" -"careers\0nom.bz\0" -"univ.sn\0ma.leg.br\0nom.cl\0" -"namsskogan.no\0" -"sosa.chiba.jp\0" -"nom.co\0plc.uk\0drud.us\0" -"ss.it\0kawanehon.shizuoka.jp\0" -"onrender.com\0" -"toyo.kochi.jp\0kvafjord.no\0" -"kannami.shizuoka.jp\0rackmaze.net\0" -"priv.me\0" -"\xe5\x8f\xb0\xe6\xb9\xbe\0" -"akrehamn.no\0" -"education.museum\0flekkefjord.no\0vinnica.ua\0\xe9\x9b\xbb\xe8\xa8\x8a\xe7\x9b\x88\xe7\xa7\x91\0" -"matta-varjjat.no\0" -"salvador.br\0" -"bo.it\0*.compute-1.amazonaws.com\0" -"koga.fukuoka.jp\0" -"bizen.okayama.jp\0mandal.no\0" -"jelenia-gora.pl\0ally\0" -"v\xc3\xa6r\xc3\xb8y.no\0pomorze.pl\0" -"kariwa.niigata.jp\0" -"fosnes.no\0" -"walter\0" -"silk\0" -"sor-aurdal.no\0" -"pila.pl\0" -"kamo.niigata.jp\0sweden.museum\0no.eu.org\0" -"rag-cloud-ch.hosteur.com\0" -"nom.es\0ushuaia.museum\0jorpeland.no\0" -"rivne.ua\0" -"tula.su\0" -"aoki.nagano.jp\0" -"saikai.nagasaki.jp\0" -"servep2p.com\0" -"minamiuonuma.niigata.jp\0" -"nom.fr\0itayanagi.aomori.jp\0sauda.no\0sina\0" -"genting\0" -"nom.gd\0" -"asago.hyogo.jp\0nom.ge\0" -"bolt.hu\0" -"kitashiobara.fukushima.jp\0jobs.tt\0mintere.site\0" -"nom.gl\0" -"pr.us\0" -"carboniaiglesias.it\0" -"choyo.kumamoto.jp\0" -"motobu.okinawa.jp\0store.ro\0" -"it1-eur.jenv-arubabiz.cloud\0" -"nom.gt\0" -"dc.us\0loan\0" -"yahiko.niigata.jp\0" -"hashikami.aomori.jp\0likescandy.com\0" -"giehtavuoatna.no\0" -"kameoka.kyoto.jp\0*.sch.uk\0" -"space-to-rent.com\0nom.hn\0" -"cc.ok.us\0" -"webhop.me\0" -"ownip.net\0" -"kawazu.shizuoka.jp\0nyuzen.toyama.jp\0store.st\0cc.ga.us\0" -"kouhoku.saga.jp\0" -"owariasahi.aichi.jp\0" -"benevento.it\0azurewebsites.net\0" -"al.eu.org\0" -"p.se\0nom.im\0" -"nakaniikawa.toyama.jp\0" -"plants.museum\0" -"jetzt\0ssl.origin.cdn77-secure.org\0" -"leasing.aero\0k12.as.us\0" -"\xd8\xa7\xd9\x85\xd8\xa7\xd8\xb1\xd8\xa7\xd8\xaa\0\xd0\xbe\xd0\xbd\xd0\xbb\xd0\xb0\xd0\xb9\xd0\xbd\0" -"l\xc3\xa4ns.museum\0" -"sci.eg\0higashimurayama.tokyo.jp\0career\0" -"semine.miyagi.jp\0" -"patria.bo\0" -"2ix.at\0" -"nom.ke\0" -"chuo.yamanashi.jp\0" -"nom.km\0" -"gs.rl.no\0ro.im\0" -"nz.eu.org\0" -"kumagaya.saitama.jp\0mazury.pl\0twmail.net\0" -"kvalsund.no\0" -"vt.it\0ino.kochi.jp\0" -"koka.shiga.jp\0volkswagen\0" -"myasustor.com\0" -"arezzo.it\0ro.it\0\xe5\x85\xb5\xe5\xba\xab.jp\0" -"2ix.ch\0" -"kagawa.jp\0austin.museum\0nom.li\0" -"gs.ah.no\0" -"lib.fl.us\0" -"energy\0" -"plesk.page\0" -"forsale\0" -"\xc3\xa5snes.no\0dynv6.net\0" -"sasebo.nagasaki.jp\0""2ix.de\0" -"\xd8\xa7\xd9\x8a\xd8\xb1\xd8\xa7\xd9\x86.ir\0" -"site\0nom.lv\0" -"nom.mg\0" -"froland.no\0" -"glade\0" -"tromsa.no\0*.lcl.dev\0" -"kashiwara.osaka.jp\0nom.mk\0" -"miki.hyogo.jp\0kyiv.ua\0loft\0" -"from-oh.com\0" -"minamitane.kagoshima.jp\0" -"amex\0" -"industria.bo\0nom.nc\0kvits\xc3\xb8y.no\0is-a-llama.com\0es-1.axarnet.cloud\0brasilia.me\0" -"sevastopol.ua\0" -"j\xc3\xb8lster.no\0coop.rw\0" -"trentino-s-tirol.it\0" -"minamiboso.chiba.jp\0*.s5y.io\0" -"nom.ni\0" -"v-info.info\0" -"fujimi.saitama.jp\0" -"padua.it\0" -"michigan.museum\0" -"tolga.no\0" -"toshiba\0" -"wroclaw.pl\0" -"za.net\0" -"varese.it\0lind\xc3\xa5s.no\0" -"nom.nu\0" -"from-mn.com\0" -"kyowa.hokkaido.jp\0" -"hgtv\0" -"honjo.akita.jp\0" -"caxias.br\0" -"\xe5\xa4\xa7\xe6\x8b\xbf\0" -"broker\0" -"yufu.oita.jp\0nom.pa\0" -"securitytactics.com\0" -"coop.tt\0is-a-student.com\0vladimir.su\0" -"nom.pe\0" -"verona.it\0beardu.no\0" -"\xe0\xa4\xad\xe0\xa4\xbe\xe0\xa4\xb0\xe0\xa5\x8b\xe0\xa4\xa4\0" -"foggia.it\0capebreton.museum\0civilwar.museum\0" -"nemuro.hokkaido.jp\0" -"nom.pl\0" -"cc.wa.us\0tushu\0poznan.pl\0" -"oharu.aichi.jp\0" -"mormon\0nom.qa\0" -"hitachiomiya.ibaraki.jp\0hopto.org\0wedeploy.sh\0" -"\xe0\xa8\xad\xe0\xa8\xbe\xe0\xa8\xb0\xe0\xa8\xa4\0" -"higashine.yamagata.jp\0" -"coop.mv\0" -"coop.mw\0" -"eti.br\0nom.pw\0" -"schweiz.museum\0" -"agdenes.no\0joburg\0" -"y.bg\0" -"hiroo.hokkaido.jp\0torsken.no\0tn.oxa.cloud\0" -"tachikawa.tokyo.jp\0" -"4.bg\0audio\0windows\0*.linodeobjects.com\0" -"k12.nh.us\0philips\0" -"yachimata.chiba.jp\0jeonnam.kr\0cog.mi.us\0" -"bulsan.it\0catering\0" -"powiat.pl\0k12.ia.us\0does-it.net\0" -"kodaira.tokyo.jp\0" -"intl.tn\0" -"nom.re\0" -"aejrie.no\0" -"ureshino.mie.jp\0bievat.no\0casacam.net\0" -"*.nagoya.jp\0kuroiso.tochigi.jp\0" -"dev.br\0" -"samegawa.fukushima.jp\0" -"nom.ro\0" -"nrw.museum\0bplaced.com\0" -"nanjo.okinawa.jp\0" -"vladimir.ru\0nom.rs\0" -"sogndal.no\0" -"asn.au\0" -"sg.cloudswitches.com\0" -"kuwana.mie.jp\0pinb.gov.pl\0nom.si\0" -"makeup\0" -"soundcast.me\0" -"vestv\xc3\xa5g\xc3\xb8y.no\0" -"for-better.biz\0" -"cloudns.biz\0nom.st\0" -"togo.aichi.jp\0" -"coop.py\0" -"nom.tj\0" -"is-a-guru.com\0" -"wada.nagano.jp\0" -"nom.tm\0netflix\0" -"koya.wakayama.jp\0" -"entomology.museum\0" -"sellsyourhome.org\0" -"yawara.ibaraki.jp\0" -"from-nh.com\0" -"environment.museum\0usgarden.museum\0creditunion\0nom.ug\0" -"palmas.br\0gok.pk\0" -"kamogawa.chiba.jp\0" -"\xe9\xa3\x9e\xe5\x88\xa9\xe6\xb5\xa6\0" -"mima.tokushima.jp\0" -"principe.st\0\xd1\x83\xd0\xbf\xd1\x80.\xd1\x81\xd1\x80\xd0\xb1\0" -"hino.tokyo.jp\0surnadal.no\0" -"rockart.museum\0" -"nom.vc\0" -"s3-ap-northeast-1.amazonaws.com\0" -"shopitsite.com\0" -"trogstad.no\0contact\0nom.vg\0" -"nom.uy\0" -"jc.neen.it\0" -"kasamatsu.gifu.jp\0coop.km\0kyoto\0" -"panel.gg\0" -"labor.museum\0n4t.co\0myftp.org\0" -"audnedaln.no\0" -"store.bb\0" -"mikasa.hokkaido.jp\0africa\0" -"ebetsu.hokkaido.jp\0itano.tokushima.jp\0higashikurume.tokyo.jp\0" -"forlicesena.it\0" -"flickr\0" -"nakanoto.ishikawa.jp\0" -"b\xc3\xb8.nordland.no\0" -"nomi.ishikawa.jp\0mydatto.com\0" -"vt.us\0" -"gotdns.org\0" -"kutno.pl\0" -"busan.kr\0" -"correios-e-telecomunica\xc3\xa7\xc3\xb5""es.museum\0nj.us\0" -"swinoujscie.pl\0" -"namsos.no\0" -"garden\0" -"ak.us\0" -"kamiamakusa.kumamoto.jp\0" -"crafts.museum\0*.r.appspot.com\0" -"fot.br\0" -"yonezawa.yamagata.jp\0" -"pvt.k12.ma.us\0" -"quebec\0*.sensiosite.cloud\0" -"sande.vestfold.no\0bar0.net\0" -"store.dk\0" -"k12.tn.us\0church\0" -"\xe5\x92\x8c\xe6\xad\x8c\xe5\xb1\xb1.jp\0azimuth.network\0" -"e.bg\0\xe7\x86\x8a\xe6\x9c\xac.jp\0kinko.kagoshima.jp\0" -"government.aero\0nom.za\0" -"ddnsgeek.com\0" -"k12.gu.us\0fresenius\0" -"higashiosaka.osaka.jp\0" -"cookingchannel\0" -"geisei.kochi.jp\0fbx-os.fr\0" -"kunitachi.tokyo.jp\0commbank\0jelastic.tsukaeru.net\0" -"porsangu.no\0" -"homesense\0wedeploy.me\0" -"lewismiller.museum\0" -"norfolk.museum\0institute\0repl.co\0" -"blogspot.vn\0" -"radio.am\0" -"baseball\0" -"lund.no\0" -"cheltenham.museum\0vantaa.museum\0" -"chosei.chiba.jp\0" -"sannan.hyogo.jp\0" -"kitadaito.okinawa.jp\0" -"\xe7\xbd\x91\xe5\xba\x97\0" -"radio.br\0" -"kisofukushima.nagano.jp\0love\0" -"pg.it\0suzuki\0" -"gs.bu.no\0" -"kr.it\0tenkawa.nara.jp\0lib.ga.us\0" -"\xe5\xaf\x8c\xe5\xb1\xb1.jp\0matsushige.tokushima.jp\0" -"kamoenai.hokkaido.jp\0" -"glass\0" -"ch.it\0" -"webhop.org\0" -"jelastic.saveincloud.net\0" -"ns.ca\0" -"guitars\0" -"asn.lv\0" -"suifu.ibaraki.jp\0muroto.kochi.jp\0gausdal.no\0zero\0" -"artgallery.museum\0" -"sh.cn\0blogspot.re\0" -"meinforum.net\0" -"columbus.museum\0physio\0services\0" -"aip.ee\0" -"blogspot.ro\0" -"fi.cr\0" -"blogspot.rs\0" -"lv.ua\0\xd9\x85\xd9\x84\xd9\x8a\xd8\xb3\xd9\x8a\xd8\xa7\0" -"insurance.aero\0blogspot.ru\0blogspot.se\0" -"mg.leg.br\0" -"blogspot.sg\0" -"mt.eu.org\0blogspot.si\0" -"chiyoda.tokyo.jp\0" -"tmp.br\0blogspot.sk\0bloxcms.com\0" -"e4.cz\0de.trendhosting.cloud\0" -"sayama.saitama.jp\0blogspot.sn\0" -"radio.fm\0" -"!city.sendai.jp\0" -"maserati\0blogspot.td\0jed.wafaicloud.com\0website.yandexcloud.net\0" -"yamanouchi.nagano.jp\0" -"online\0" -"dating\0" -"homelink.one\0" -"ia.us\0" -"sannohe.aomori.jp\0" -"froya.no\0" -"us.com\0" -"blogsite.org\0" -"kagoshima.jp\0" -"kiev.ua\0" -"s3.ap-northeast-2.amazonaws.com\0from-ct.com\0" -"medio-campidano.it\0qoto.io\0" -"opole.pl\0" -"bari.it\0" -"toyone.aichi.jp\0data\0blogspot.tw\0blogspot.ug\0" -"sobetsu.hokkaido.jp\0arida.wakayama.jp\0" -"namie.fukushima.jp\0" -"date\0tatar\0" -"gwiddle.co.uk\0" -"lenvik.no\0ap-northeast-1.elasticbeanstalk.com\0" -"neues.museum\0" -"kaga.ishikawa.jp\0" -"bronnoysund.no\0" -"blogspot.mr\0" -"countryestate.museum\0y.se\0" -"hannan.osaka.jp\0ralingen.no\0\xe5\x8f\xb0\xe7\x81\xa3\0" -"fitjar.no\0" -"unusualperson.com\0" -"oppegard.no\0" -"blogspot.mx\0" -"skin\0blogspot.my\0" -"quebec.museum\0" -"fastvps-server.com\0blogspot.nl\0rdv.to\0" -"iwata.shizuoka.jp\0" -"kisosaki.mie.jp\0blogspot.no\0" -"hashimoto.wakayama.jp\0" -"saves-the-whales.com\0" -"barsyonline.com\0hicam.net\0" -"wanggou\0" -"s3-eu-west-3.amazonaws.com\0" -"virtuel.museum\0" -"ibestad.no\0" -"hermes\0" -"newspaper.museum\0s3.dualstack.eu-west-1.amazonaws.com\0" -"law.pro\0horse\0mozilla-iot.org\0" -"takanabe.miyazaki.jp\0yasaka.nagano.jp\0" -"sorfold.no\0" -"ny-1.paas.massivegrid.net\0" -"gratis\0privatizehealthinsurance.net\0" -"lib.wa.us\0scrapper-site.net\0blogspot.pe\0" -"furniture\0" -"lib.sd.us\0" -"trentino-sud-tirol.it\0" -"lib.ok.us\0" -"ca.reclaim.cloud\0" -"gjovik.no\0lib.in.us\0" -"med.br\0" -"olbia-tempio.it\0blogspot.qa\0" -"co.com\0" -"fi.it\0yame.fukuoka.jp\0allfinanz\0blogspot.pt\0" -"*.cloud.metacentrum.cz\0" -"exnet.su\0" -"at.it\0" -"mytuleap.com\0" -"cargo.aero\0xbox\0" -"imabari.ehime.jp\0supplies\0is-into-anime.com\0" -"nagasaki.nagasaki.jp\0" -"\xe6\x96\xb0\xe6\xbd\x9f.jp\0" -"kosai.shizuoka.jp\0onza.mythic-beasts.com\0" -"lipsy\0" -"mitsue.nara.jp\0blogspot.is\0" -"blogspot.it\0" -"egyptian.museum\0dev.vu\0" -"mo.cn\0" -"med.ec\0blogspot.jp\0vipsinaapp.com\0" -"ch.tc\0" -"med.ee\0" -"blogspot.co.at\0wedeploy.io\0" -"dscloud.biz\0" -"civilaviation.aero\0taa.it\0" -"tochio.niigata.jp\0" -"kr.ua\0a.run.app\0" -"asker.no\0" -"author.aero\0" -"blogspot.kr\0" -"minamiaiki.nagano.jp\0" -"at.md\0" -"gru.br\0" -"lombardy.it\0sogne.no\0\xe6\x95\x99\xe8\x82\xb2.\xe9\xa6\x99\xe6\xb8\xaf\0blogspot.li\0" -"fujisato.akita.jp\0kwpsp.gov.pl\0vpndns.net\0" -"valdaosta.it\0naha.okinawa.jp\0nanbu.tottori.jp\0" -"soccer\0" -"yonago.tottori.jp\0wskr.gov.pl\0bplaced.net\0" -"k\xc3\xa1r\xc3\xa1\xc5\xa1johka.no\0blogspot.lt\0blogspot.md\0" -"blogspot.lu\0" -"luxury\0" -"soundandvision.museum\0my.eu.org\0myeffect.net\0" -"oga.akita.jp\0blogspot.mk\0" -"misaki.osaka.jp\0" -"yoka.hyogo.jp\0k12.wi.us\0" -"\xd8\xa8\xd8\xa7\xd8\xb2\xd8\xa7\xd8\xb1\0" -"takaishi.osaka.jp\0" -"k12.mo.us\0groks-this.info\0" -"e.se\0" -"ecn.br\0blogspot.fi\0" -"gangwon.kr\0" -"chiropractic.museum\0historichouses.museum\0k12.az.us\0" -"fhsk.se\0za.org\0" -"med.ht\0brescia.it\0" -"blogspot.fr\0" -"h\xc3\xb8ylandet.no\0yamaxun\0" -"community\0" -"bharti\0" -"kl\xc3\xa6""bu.no\0" -"taki.mie.jp\0" -"itabashi.tokyo.jp\0" -"hvaler.no\0nov.ru\0" -"leitungsen.de\0" -"ing.pa\0" -"blogspot.gr\0" -"vikna.no\0" -"gs.vf.no\0pomorskie.pl\0" -"military.museum\0compare\0" -"zgorzelec.pl\0space\0nov.su\0blogspot.hk\0hidora.com\0" -"mihama.fukui.jp\0" -"vi.it\0os.hedmark.no\0" -"\xe6\x95\x8e\xe8\x82\xb2.hk\0" -"wroc.pl\0" -"blogspot.hr\0dev-myqnapcloud.com\0" -"mo.it\0" -"web.app\0" -"blogspot.hu\0blogspot.ie\0" -"gv.ao\0" -"motorcycle.museum\0" -"lib.al.us\0" -"tinn.no\0flights\0" -"gv.at\0pp.az\0*.customer-oci.com\0" -"black\0" -"taishi.hyogo.jp\0blogspot.in\0" -"cistron.nl\0" -"blogspot.ba\0" -"sp.gov.br\0blogspot.co.id\0" -"agrinet.tn\0hotmail\0" -"blogspot.be\0" -"blogspot.bg\0" -"bd.se\0" -"xz.cn\0dyroy.no\0hyatt\0" -"blogspot.bj\0" -"blogspot.co.il\0" -"higashi.okinawa.jp\0" -"sveio.no\0repl.run\0" -"rotorcraft.aero\0" -"sugito.saitama.jp\0blogspot.ca\0" -"med.ly\0blogspot.cf\0eu.platform.sh\0" -"cq.cn\0maif\0blogspot.ch\0" -"nl.eu.org\0" -"blogspot.cl\0" -"twmail.org\0" -"oyamazaki.kyoto.jp\0" -"takaoka.toyama.jp\0" -"ipiranga\0" -"blogspot.de\0" -"mihama.aichi.jp\0blogspot.cv\0" -"myhome-server.de\0localzone.xyz\0stage.nodeart.io\0" -"blogspot.cz\0" -"blogspot.dk\0" -"app.banzaicloud.io\0" -"kakuda.miyagi.jp\0shimosuwa.nagano.jp\0" -"otaki.saitama.jp\0" -"chuo.fukuoka.jp\0" -"desa.id\0" -"kasugai.aichi.jp\0med.om\0at.vg\0" -"novara.it\0company\0" -"so.gov.pl\0" -"indianapolis.museum\0med.pa\0firestone\0" -"yawata.kyoto.jp\0" -"valled-aosta.it\0chihayaakasaka.osaka.jp\0usarts.museum\0" -"n.bg\0" -"reggio-calabria.it\0t\xc3\xb8nsberg.no\0" -"groundhandling.aero\0" -"med.pl\0" -"kakinoki.shimane.jp\0ringebu.no\0" -"yokaichiba.chiba.jp\0ap-south-1.elasticbeanstalk.com\0" -"*.compute.amazonaws.com\0is-a-liberal.com\0" -"lyngdal.no\0" -"quest\0" -"\xe6\x96\xb0\xe9\x97\xbb\0" -"moroyama.saitama.jp\0lugs.org.uk\0" -"unicloud.pl\0" -"accident-prevention.aero\0" -"iyo.ehime.jp\0oguni.kumamoto.jp\0" -"aizubange.fukushima.jp\0itakura.gunma.jp\0" -"gitpage.si\0" -"suldal.no\0bip.sh\0" -"la-spezia.it\0" -"oyama.tochigi.jp\0gs.tr.no\0" -"cosenza.it\0" -"cloudera.site\0" -"club.aero\0med.sa\0" -"med.sd\0" -"lib.ks.us\0blogspot.ae\0" -"amsterdam.museum\0" -"fr-1.paas.massivegrid.net\0" -"rieti.it\0brumunddal.no\0ng.eu.org\0" -"recipes\0rhcloud.com\0" -"blogspot.al\0" -"blogspot.am\0" -"knowsitall.info\0svn-repos.de\0" -"bearalv\xc3\xa1hki.no\0" -"media.museum\0" -"firewall-gateway.de\0" -"cody.museum\0" -"yamatsuri.fukushima.jp\0" -"drobak.no\0n\xc3\xb8tter\xc3\xb8y.no\0" -"omega\0" -"athleta\0khplay.nl\0" -"rexroth\0" -"frogans\0" -"\xd9\x83\xd8\xa7\xd8\xab\xd9\x88\xd9\x84\xd9\x8a\xd9\x83\0" -"mragowo.pl\0" -"is-a-cpa.com\0" -"\xd9\x85\xd9\x88\xd8\xb1\xd9\x8a\xd8\xaa\xd8\xa7\xd9\x86\xd9\x8a\xd8\xa7\0" -"r\xc3\xa5holt.no\0" -"inderoy.no\0" -"camdvr.org\0" -"askoy.no\0aaa\0doesntexist.com\0" -"izumozaki.niigata.jp\0" -"\xe5\xa4\xa9\xe4\xb8\xbb\xe6\x95\x99\0qualifioapp.com\0" -"agric.za\0" -"ota.tokyo.jp\0town.museum\0" -"uryu.hokkaido.jp\0" -"movie\0" -"vi.us\0" -"teo.br\0noheji.aomori.jp\0eidsvoll.no\0nesset.no\0tran\xc3\xb8y.no\0" -"nakagusuku.okinawa.jp\0" -"abb\0" -"mo.us\0abc\0" -"kawakita.ishikawa.jp\0" -"hob\xc3\xb8l.no\0realestate\0" -"media\0" -"shunan.yamaguchi.jp\0" -"takko.aomori.jp\0dyn.home-webserver.de\0map.fastlylb.net\0" -"uchiko.ehime.jp\0" -"imageandsound.museum\0" -"mup.gov.pl\0dclk\0" -"minamimaki.nagano.jp\0dnsfor.me\0" -"read-books.org\0" -"blogspot.co.uk\0" -"bristol.museum\0gehirn.ne.jp\0" -"naganohara.gunma.jp\0vik.no\0" -"pvh.br\0daiwa.hiroshima.jp\0aco\0" -"nerima.tokyo.jp\0" -"cupcake.is\0" -"chicago.museum\0" -"\xe7\xa6\x8f\xe5\xb2\xa1.jp\0" -"stalowa-wola.pl\0" -"songdalen.no\0" -"\xd9\xbe\xd8\xa7\xd9\x83\xd8\xb3\xd8\xaa\xd8\xa7\xd9\x86\0" -"sr.gov.pl\0" -"\xe7\xb6\xb2\xe7\xbb\x9c.hk\0bingo\0" -"deloitte\0email\0from-ny.net\0" -"shopware.store\0" -"ads\0" -"wzmiuw.gov.pl\0" -"hyogo.jp\0" -"kobierzyce.pl\0aeg\0" -"naturhistorisches.museum\0" -"shimokawa.hokkaido.jp\0" -"trentinsud-tirol.it\0" -"philadelphia.museum\0" -"belau.pw\0" -"altoadige.it\0nagasu.kumamoto.jp\0" -"ikusaka.nagano.jp\0ambulance.museum\0ringerike.no\0" -"ta.it\0" -"uenohara.yamanashi.jp\0grue.no\0" -"afl\0" -"ichinohe.iwate.jp\0" -"fr.it\0" -"forum.hu\0clock.museum\0" -"*.statics.cloud\0" -"pp.se\0pp.ru\0" -"\xe5\x85\xac\xe7\x9b\x8a\0" -"shika.ishikawa.jp\0" -"tromso.no\0" -"miyoshi.tokushima.jp\0myactivedirectory.com\0" -"pizza\0" -"ikawa.akita.jp\0omitama.ibaraki.jp\0juegos\0" -"daigo.ibaraki.jp\0kunisaki.oita.jp\0" -"dlugoleka.pl\0discourse.team\0" -"kawakami.nara.jp\0" -"rissa.no\0" -"oshino.yamanashi.jp\0wif.gov.pl\0" -"kg.kr\0" -"vagan.no\0" -"war.museum\0" -"pp.ua\0" -"blogspot.co.ke\0" -"aig\0" -"misaki.okayama.jp\0" -"kawagoe.mie.jp\0warmia.pl\0" -"hikone.shiga.jp\0weibo\0" -"nankoku.kochi.jp\0webhop.net\0" -"friulivegiulia.it\0\xe5\x85\xab\xe5\x8d\xa6\0" -"horokanai.hokkaido.jp\0" -"usr.cloud.muni.cz\0" -"g\xc3\xbcnstigbestellen.de\0" -"togakushi.nagano.jp\0" -"gv.vc\0" -"ug.gov.pl\0" -"midori.gunma.jp\0bus.museum\0nysa.pl\0" -"amami.kagoshima.jp\0" -"zapto.xyz\0" -"takahashi.okayama.jp\0dyndns-home.com\0" -"gniezno.pl\0" -"ol.no\0orskog.no\0" -"pmn.it\0" -"maringa.br\0yoshikawa.saitama.jp\0cc.ny.us\0" -"\xe5\xae\xae\xe5\x9f\x8e.jp\0" -"glas.museum\0" -"nationalheritage.museum\0" -"frosinone.it\0" -"motegi.tochigi.jp\0" -"stj\xc3\xb8rdal.no\0" -"chernigov.ua\0cc.az.us\0" -"discovery.museum\0withgoogle.com\0" -"jobs\0" -"starnberg.museum\0" -"casadelamoneda.museum\0n.se\0" -"trentino-alto-adige.it\0" -"koshigaya.saitama.jp\0eastafrica.museum\0s3.dualstack.sa-east-1.amazonaws.com\0" -"stuff-4-sale.us\0" -"chonan.chiba.jp\0""0e.vc\0" -"journalist.aero\0lasalle\0" -"mobi.gp\0" -"holtalen.no\0" -"blogspot.co.nz\0" -"upow.gov.pl\0" -"support\0" -"ogliastra.it\0" -"higashiura.aichi.jp\0sopot.pl\0" -"lubartow.pl\0" -"anthropology.museum\0gucci\0" -"ikaruga.nara.jp\0" -"ayabe.kyoto.jp\0" -"ferrara.it\0verbania.it\0" -"wphostedmail.com\0" -"vr.it\0" -"rm.it\0lib.mt.us\0lib.nd.us\0" -"childrens.museum\0" -"kasuya.fukuoka.jp\0" -"is.it\0" -"acct.pro\0" -"en.it\0" -"valle-aosta.it\0" -"ascolipiceno.it\0nanmoku.gunma.jp\0" -"furukawa.miyagi.jp\0attorney\0\xe8\xaf\xba\xe5\x9f\xba\xe4\xba\x9a\0" -"targi.pl\0anz\0" -"in-butter.de\0" -"aol\0" -"is-a-doctor.com\0" -"stordal.no\0bbs.tr\0" -"kimobetsu.hokkaido.jp\0" -"16-b.it\0" -"yasuoka.nagano.jp\0" -"apple\0" -"md.ci\0\xe3\x83\x9d\xe3\x82\xa4\xe3\x83\xb3\xe3\x83\x88\0" -"minamisanriku.miyagi.jp\0" -"otaru.hokkaido.jp\0" -"aogaki.hyogo.jp\0" -"tlon.network\0" -"app\0" -"ginan.gifu.jp\0giessen.museum\0" -"verm\xc3\xb6gensberatung\0" -"lierne.no\0mywire.org\0" -"kashiwa.chiba.jp\0" -"fukuroi.shizuoka.jp\0musashimurayama.tokyo.jp\0tjeldsund.no\0" -"naturalsciences.museum\0" -"jele.host\0" -"schwarz\0ui.nabu.casa\0" -"kamo.kyoto.jp\0" -"bar\0" -"sciences.museum\0bbc\0gdynia.pl\0" -"akita.akita.jp\0wv.us\0" -"atl.jelastic.vps-host.net\0" -"starachowice.pl\0" -"mx.na\0herokussl.com\0" -"sorum.no\0" -"eng.pro\0" -"art\0bbt\0" -"takinoue.hokkaido.jp\0" -"s\xc3\xb8rreisa.no\0" -"iida.nagano.jp\0bcg\0" -"cc.ne.us\0baby\0" -"kobayashi.miyazaki.jp\0medical.museum\0bcn\0forumz.info\0" -"gov.nc.tr\0vercel.app\0" -"w.bg\0" -"atsugi.kanagawa.jp\0\xe5\x85\xac\xe5\x8f\xb8\0" -"2.bg\0" -"hospital\0" -"redirectme.net\0" -"kozagawa.wakayama.jp\0tana.no\0" -"sncf\0" -"det.br\0to.gov.br\0takazaki.miyazaki.jp\0jele.club\0" -"chernivtsi.ua\0" -"gub.uy\0" -"ong.br\0" -"shoparena.pl\0" -"katsuragi.nara.jp\0tokashiki.okinawa.jp\0prudential\0" -"project.museum\0giize.com\0" -"r\xc3\xa1hkker\xc3\xa1vju.no\0" -"vana\0from-pa.com\0" -"studio\0" -"bet\0" -"podzone.net\0" -"chichibu.saitama.jp\0" -"carrier.museum\0" -"kawamata.fukushima.jp\0" -"flight.aero\0" -"lib.tn.us\0" -"recreation.aero\0vologda.su\0myfast.space\0" -"gs.hl.no\0" -"akiruno.tokyo.jp\0" -"takashima.shiga.jp\0v\xc3\xa1rgg\xc3\xa1t.no\0" -"stathelle.no\0" -"lt.it\0" -"cloudns.eu\0" -"yoshino.nara.jp\0dyndns-blog.com\0" -"spreadbetting\0" -"cz.it\0tokyo\0" -"chirurgiens-dentistes.fr\0biev\xc3\xa1t.no\0" -"rimini.it\0" -"\xe7\xb5\x84\xe7\xb9\x94.\xe9\xa6\x99\xe6\xb8\xaf\0" -"yomitan.okinawa.jp\0folldal.no\0axa\0blogspot.co.za\0" -"noda.chiba.jp\0" -"salerno.it\0aws\0deal\0" -"pe.ca\0is-slick.com\0" -"mus.mi.us\0" -"shingo.aomori.jp\0nishigo.fukushima.jp\0" -"ikeda.gifu.jp\0elburg.museum\0" -"shimabara.nagasaki.jp\0schlesisches.museum\0viking.museum\0pony.club\0" -"kumakogen.ehime.jp\0antiques.museum\0" -"management\0" -"tj.cn\0bale.museum\0" -"educator.aero\0" -"codespot.com\0" -"ybo.trade\0" -"development.run\0" -"sex.hu\0bid\0" -"rehab\0" -"sk\xc3\xa5nland.no\0from.work\0" -"r\xc3\xb8yken.no\0" -"brand.se\0" -"toshima.tokyo.jp\0" -"oxa.cloud\0" -"arai.shizuoka.jp\0kanuma.tochigi.jp\0\xe0\xb9\x80\xe0\xb8\x99\xe0\xb9\x87\xe0\xb8\x95.\xe0\xb9\x84\xe0\xb8\x97\xe0\xb8\xa2\0" -"ski.museum\0bio\0" -"tas.au\0" -"val-daosta.it\0" -"ando.nara.jp\0" -"kadoma.osaka.jp\0" -"whoswho\0" -"\xd9\x82\xd8\xb7\xd8\xb1\0group\0" -"biz\0chungbuk.kr\0staging.onred.one\0" -"mishima.fukushima.jp\0" -"pictures\0" -"logoip.de\0" -"hakusan.ishikawa.jp\0" -"nango.fukushima.jp\0nh.us\0cloudns.in\0" -"planetarium.museum\0" -"luxembourg.museum\0servecounterstrike.com\0" -"ookuwa.nagano.jp\0" -"yamaga.kumamoto.jp\0" -"workisboring.com\0" -"hisayama.fukuoka.jp\0shimane.shimane.jp\0" -"ybo.party\0" -"tecnologia.bo\0" -"dyn-ip24.de\0" -"ebino.miyazaki.jp\0is-a-photographer.com\0ras.ru\0" -"indie.porn\0" -"nirasaki.yamanashi.jp\0" -"indiana.museum\0" -"taku.saga.jp\0cc.ma.us\0yodobashi\0" -"faith\0hdfcbank\0" -"cloudns.cc\0for-our.info\0" -"noshiro.akita.jp\0hostedpi.com\0" -"isahaya.nagasaki.jp\0" -"shibukawa.gunma.jp\0" -"c.bg\0nozawaonsen.nagano.jp\0" -"my-firewall.org\0" -"yakumo.hokkaido.jp\0" -"georgia.museum\0" -"vallee-d-aoste.it\0channelsdvr.net\0" -"house\0" -"moonscale.net\0" -"experts-comptables.fr\0" -"malselv.no\0" -"miyazaki.jp\0" -"ikata.ehime.jp\0bahccavuotna.no\0" -"hashima.gifu.jp\0*.platformsh.site\0" -"sumoto.hyogo.jp\0shimoichi.nara.jp\0" -"namerikawa.toyama.jp\0" -"for-more.biz\0" -"trondheim.no\0" -"bms\0jcloud.kz\0" -"shinagawa.tokyo.jp\0s3-website.us-east-2.amazonaws.com\0" -"not.br\0" -"bmw\0" -"games.hu\0band\0" -"tatamotors\0" -"mihama.chiba.jp\0zoology.museum\0" -"higashiyama.kyoto.jp\0labour.museum\0" -"discount\0" -"\xe6\x95\x99\xe8\x82\xb2.hk\0civilisation.museum\0fiat\0" -"bank\0" -"s3-ap-northeast-2.amazonaws.com\0" -"u2.xnbay.com\0" -"umbria.it\0takasaki.gunma.jp\0" -"www.ro\0hockey\0" -"zgora.pl\0" -"pe.it\0" -"arita.saga.jp\0" -"kamikitayama.nara.jp\0" -"cherkassy.ua\0" -"lebtimnetz.de\0" -"bom\0" -"boo\0" -"stackhero-network.com\0" -"swatch\0" -"tsuwano.shimane.jp\0" -"bot\0" -"volkenkunde.museum\0" -"spydeberg.no\0" -"bialowieza.pl\0" -"box\0" -"satx.museum\0" -"sex.pl\0" -"macerata.it\0nesseby.no\0" -"kumamoto.kumamoto.jp\0cab\0" -"finland.museum\0" -"!city.nagoya.jp\0pe.kr\0" -"arab\0" -"eisenbahn.museum\0" -"jl.cn\0fido\0" -"jondal.no\0cal\0" -"cam\0s3-website-us-east-1.amazonaws.com\0" -"virtualuser.de\0" -"wildlife.museum\0lpusercontent.com\0" -"cba\0" -"lt.ua\0car\0" -"onna.okinawa.jp\0" -"cat\0" -"fr\xc3\xa6na.no\0mobi.tt\0" -"niimi.okayama.jp\0haugesund.no\0h\xc3\xa6gebostad.no\0" -"vibovalentia.it\0" -"aga.niigata.jp\0" -"nt.edu.au\0mobi.tz\0cbn\0" -"chuo.osaka.jp\0" -"nishi.osaka.jp\0" -"alpha-myqnapcloud.com\0" -"laquila.it\0*.webhare.dev\0" -"kommune.no\0cbs\0dell\0bci.dnstrace.pro\0" -"md.us\0ltda\0" -"scjohnson\0doomdns.com\0" -"tsuyama.okayama.jp\0" -"takagi.nagano.jp\0" -"dontexist.net\0" -"\xe3\x82\xa2\xe3\x83\x9e\xe3\x82\xbe\xe3\x83\xb3\0" -"tienda\0" -"h\xc3\xa5.no\0" -"kvanangen.no\0" -"toga.toyama.jp\0rnrt.tn\0cc.or.us\0" -"fukusaki.hyogo.jp\0" -"mex.com\0" -"64-b.it\0" -"date.fukushima.jp\0\xe5\x95\x86\xe5\xba\x97\0" -"karmoy.no\0" -"hasami.nagasaki.jp\0" -"zama.kanagawa.jp\0" -"gentlentapis.com\0" -"samnanger.no\0w.se\0red.sv\0staples\0" +"gdansk.pl\0" +"gov.pn\0meteorapp.com\0" +"minowa.nagano.jp\0" +"tabayama.yamanashi.jp\0" +"gov.qa\0" +"samukawa.kanagawa.jp\0gov.pr\0" +"gov.ps\0nodum.co\0" +"pz.it\0gov.pt\0" +"mitake.gifu.jp\0" +"infiniti\0lincoln\0" +"heroy.more-og-romsdal.no\0gov.py\0" +"dontexist.org\0" +"airforce\0jele.site\0" +"bifuka.hokkaido.jp\0" +"somna.no\0" +"carrara-massa.it\0" +"orsta.no\0" +"shiroishi.saga.jp\0" +"school\0" +"buyshouses.net\0" +"joetsu.niigata.jp\0" +"kembuchi.hokkaido.jp\0" +"seg.br\0" +"tr.no\0firm.ve\0" "*.backyards.banzaicloud.io\0" -"nagara.chiba.jp\0" -"andebu.no\0" -"kurogi.fukuoka.jp\0atami.shizuoka.jp\0" -"southwest.museum\0" -"trentinos\xc3\xbc""dtirol.it\0" -"ceo\0" -"student.aero\0" -"cfa\0" -"c.la\0" -"sondrio.it\0cfd\0" -"ozu.ehime.jp\0" -"consultant.aero\0" -"steinkjer.no\0latino\0" -"buy\0" -"toyosato.shiga.jp\0" -"hasama.oita.jp\0" -"fukuyama.hiroshima.jp\0minamiashigara.kanagawa.jp\0kashiba.nara.jp\0" -"\xe5\xb2\xa1\xe5\xb1\xb1.jp\0" -"lig.it\0" -"cloudns.us\0" -"choshi.chiba.jp\0mobi.na\0saotome.st\0verm\xc3\xb6gensberater\0" -"olayan\0" -"mobi.ng\0" -"omura.nagasaki.jp\0members.linode.com\0" -"sakuragawa.ibaraki.jp\0bokn.no\0" -"tobishima.aichi.jp\0kawagoe.saitama.jp\0lindas.no\0" -"fg.it\0lib.az.us\0from-nj.com\0" -"trade\0lcube-server.de\0" -"ar.it\0wolomin.pl\0" -"unj\xc3\xa1rga.no\0" -"udine.it\0s3.dualstack.eu-central-1.amazonaws.com\0" -"kafjord.no\0bss.design\0" -"film\0" -"ginoza.okinawa.jp\0" -"jampa.br\0napoli.it\0" -"channel\0" -"averoy.no\0" -"download\0\xd0\xbc\xd0\xbe\xd1\x81\xd0\xba\xd0\xb2\xd0\xb0\0" -"desi\0" -"makinohara.shizuoka.jp\0" -"fitness\0" -"sayo.hyogo.jp\0aridagawa.wakayama.jp\0" -"bzh\0" -"academia.bo\0tonosho.kagawa.jp\0" -"9guacu.br\0" -"college\0pdns.page\0" -"sango.nara.jp\0" -"the.br\0sohu\0" -"ddr.museum\0from-sc.com\0\xd1\x8f.\xd1\x80\xd1\x83\xd1\x81\0" -"bayern\0" -"spjelkavik.no\0" -"hitachinaka.ibaraki.jp\0c.cdn77.org\0en-root.fr\0" -"shangrila\0" -"\xe5\xb3\xb6\xe6\xa0\xb9.jp\0" -"myds.me\0" -"saitama.jp\0" -"komatsu\0dsmynas.com\0" -"surgery\0" -"jprs\0" -"maritimo.museum\0sf.no\0" -"ashiya.fukuoka.jp\0minamiminowa.nagano.jp\0" -"tuscany.it\0venezia.it\0cc.sc.us\0" -"pa.leg.br\0" -"kariya.aichi.jp\0miyawaka.fukuoka.jp\0mobi.ke\0" -"from-ma.com\0" -"marylhurst.museum\0" -"s3.dualstack.eu-west-2.amazonaws.com\0" -"dyndns1.de\0" -"off.ai\0" -"lugansk.ua\0k12.ne.us\0" -"c.se\0" -"!city.yokohama.jp\0" -"edeka\0is-a-rockstar.com\0" -"fujishiro.ibaraki.jp\0" -"ainan.ehime.jp\0s3-external-1.amazonaws.com\0" -"hirokawa.fukuoka.jp\0takino.hyogo.jp\0sytes.net\0" -"shiriuchi.hokkaido.jp\0dyn.cosidns.de\0" -"hirara.okinawa.jp\0" -"from-vt.com\0" -"minamioguni.kumamoto.jp\0pb.leg.br\0" -"m\xc4\x81ori.nz\0" -"transporte.bo\0fie.ee\0askvoll.no\0" -"florist\0" -"army\0" -"\xe0\xa4\xad\xe0\xa4\xbe\xe0\xa4\xb0\xe0\xa4\xa4\xe0\xa4\xae\xe0\xa5\x8d\0" -"fire\0" -"yaotsu.gifu.jp\0" -"ichihara.chiba.jp\0" -"shirakawa.gifu.jp\0" -"\xe7\x82\xb9\xe7\x9c\x8b\0is-a-blogger.com\0" -"carraramassa.it\0" -"tomari.hokkaido.jp\0" -"m\xc3\xa1latvuopmi.no\0" +"gen.in\0tateshina.nagano.jp\0gov.sa\0" +"gov.sb\0" +"gov.rs\0gov.sc\0ens.tn\0nodum.io\0" +"toga.toyama.jp\0naval.museum\0gov.sd\0author\0" +"mutsu.aomori.jp\0gov.ru\0" +"himeji.hyogo.jp\0gov.rw\0gov.sg\0" +"kitakami.iwate.jp\0gov.sh\0" +"certification.aero\0" +"koga.fukuoka.jp\0" +"dnsdojo.org\0" +"ca.it\0gov.sl\0" +"gov.so\0\xe6\xb7\xa1\xe9\xa9\xac\xe9\x94\xa1\0eu.org\0" +"qpon\0" +"moka.tochigi.jp\0salon\0pokrovsk.su\0" +"gov.ss\0" +"gov.sx\0" +"treviso.it\0gov.sy\0" +"soeda.fukuoka.jp\0takasu.hokkaido.jp\0gov.tj\0" +"balsan-sudtirol.it\0" +"gov.tl\0" +"mi.th\0gov.tm\0" +"gov.tn\0" +"arao.kumamoto.jp\0gov.to\0" +"askoy.no\0framer.app\0" +"langev\xc3\xa5g.no\0gov.ua\0" +"gov.tr\0" +"gov.tt\0" +"friulive-giulia.it\0ulsan.kr\0gov.tw\0" +"gov.uk\0" +"rsc.cdn77.org\0" +"kotohira.kagawa.jp\0hirakata.osaka.jp\0cyou\0" +"suedtirol.it\0myoko.niigata.jp\0k12.ky.us\0" +"podzone.org\0" +"minamitane.kagoshima.jp\0gov.vc\0" +"iz.hr\0cc.fl.us\0" +"gov.ve\0" +"googlecode.com\0" +"mi.us\0" +"tarui.gifu.jp\0k12.vt.us\0" +"kitagawa.miyazaki.jp\0notteroy.no\0" +"gov.vn\0au.eu.org\0be.eu.org\0" +"minakami.gunma.jp\0" +"\xd8\xa7\xdb\x8c\xd8\xb1\xd8\xa7\xd9\x86.ir\0" +"kinokawa.wakayama.jp\0kudamatsu.yamaguchi.jp\0usa.museum\0" +"best\0" +"suisse.museum\0s3.dualstack.eu-west-1.amazonaws.com\0" +"firm.ro\0" +"ca.na\0" +"nishio.aichi.jp\0gen.ng\0" +"eidfjord.no\0malopolska.pl\0" +"pruszkow.pl\0in.net\0" +"mizusawa.iwate.jp\0" +"community.museum\0" +"auto\0" +"arteducation.museum\0mircloud.host\0" +"koge.tottori.jp\0oster\xc3\xb8y.no\0gov.ws\0" +"hazu.aichi.jp\0" +"team\0" +"\xd1\x81\xd0\xbe\xd1\x87\xd0\xb8.\xd1\x80\xd1\x83\xd1\x81\0" +"ogasawara.tokyo.jp\0" +"anquan\0channel\0hughes\0" +"gen.nz\0" +"futtsu.chiba.jp\0" +"mr.no\0dish\0" +"nikaho.akita.jp\0" +"uk.kg\0" +"swiftcover\0" "profesional.bo\0" -"co.ae\0com\0fudai.iwate.jp\0" -"cyber.museum\0lib.ma.us\0" -"co.ag\0okazaki.aichi.jp\0" -"br\xc3\xb8nn\xc3\xb8y.no\0" -"oi.kanagawa.jp\0minobu.yamanashi.jp\0lib.id.us\0cpa\0cloudapps.digital\0" -"fish\0" -"fet.no\0song\0" -"\xc3\xb8ygarden.no\0melbourne\0" -"co.am\0arpa\0auto.pl\0" -"h\xc3\xa4kkinen.fi\0" -"co.ao\0" -"motoyama.kochi.jp\0flanders.museum\0" -"co.bb\0" -"co.at\0is-a-painter.com\0" -"yamazoe.nara.jp\0" -"co.bi\0" -"barreau.bj\0hanyu.saitama.jp\0" -"dad\0iamallama.com\0" -"tanohata.iwate.jp\0sony\0" -"co.bn\0" -"louvre.museum\0badaddja.no\0" -"*.ex.ortsinfo.at\0" -"co.ca\0in-berlin.de\0" -"myftp.biz\0" -"nachikatsuura.wakayama.jp\0" -"lohmus.me\0" -"co.bw\0tempioolbia.it\0m\xc3\xa5lselv.no\0" -"co.ci\0neat-url.com\0" -"co.cl\0" -"co.cm\0" -"rv.ua\0" -"showa.gunma.jp\0s3-website-ap-northeast-1.amazonaws.com\0" -"cloudns.pw\0podzone.org\0" -"day\0" -"co.cr\0maori.nz\0ubank\0" -"kurashiki.okayama.jp\0" -"cuneo.it\0barsy.club\0" -"friuliv-giulia.it\0urawa.saitama.jp\0myshopify.com\0" -"yokoshibahikari.chiba.jp\0" -"matsubara.osaka.jp\0" -"\xe9\xb3\xa5\xe5\x8f\x96.jp\0co.cz\0" -"crs\0csc\0co.dk\0" -"lug.org.uk\0" -"museet.museum\0" -"kuroishi.aomori.jp\0homesecuritymac.com\0" -"ouda.nara.jp\0" -"\xe5\xa4\xa7\xe4\xbc\x97\xe6\xb1\xbd\xe8\xbd\xa6\0uy.com\0" -"manno.kagawa.jp\0" -"ar.us\0" -"asda\0" -"cc.ut.us\0" -"arte\0" -"yawatahama.ehime.jp\0" -"vallee-aoste.it\0s3-website.ap-south-1.amazonaws.com\0" -"aseral.no\0" -"barclaycard\0dds\0" -"l.bg\0wpmucdn.com\0" -"xx.gl\0" -"meet\0" -"k12.mi.us\0" +"gov.ye\0" +"shinyoshitomi.fukuoka.jp\0" +"nakasatsunai.hokkaido.jp\0" +"nosegawa.nara.jp\0caravan\0" +"s3.dualstack.ap-southeast-1.amazonaws.com\0" +"wellbeingzone.co.uk\0" +"shimodate.ibaraki.jp\0mo-i-rana.no\0cc.ne.us\0" +"brasil.museum\0\xc3\xb8stre-toten.no\0" +"gov.za\0tech\0" +"kamifurano.hokkaido.jp\0" +"takatsuki.shiga.jp\0filatelia.museum\0" +"j.bg\0" +"fr.it\0" +"stalowa-wola.pl\0mckinsey\0" +"haga.tochigi.jp\0hyundai\0bplaced.com\0" +"now-dns.org\0" +"barcelona.museum\0ap-south-1.elasticbeanstalk.com\0" +"js.cn\0hokkaido.jp\0" +"gov.zm\0" +"bg.eu.org\0pa.leg.br\0" +"firm.nf\0vapor.cloud\0" +"rc.it\0firm.ng\0" +"firebaseapp.com\0" +"padova.it\0" +"gov.zw\0s3-us-west-1.amazonaws.com\0myfritz.net\0" +"kibichuo.okayama.jp\0" +"from-nj.com\0api.stdlib.com\0" +"seto.aichi.jp\0" +"union.aero\0townnews-staging.com\0" +"yaese.okinawa.jp\0" +"s3.dualstack.sa-east-1.amazonaws.com\0" +"takaharu.miyazaki.jp\0" +"neyagawa.osaka.jp\0" +"matsumoto.kagoshima.jp\0" +"yakumo.shimane.jp\0" +"is-a-blogger.com\0" +"al.gov.br\0" +"vaga.no\0acct.pro\0pb.leg.br\0" +"lpages.co\0" +"yanagawa.fukuoka.jp\0" +"fvg.it\0" +"sejny.pl\0raid\0" +"2.bg\0" +"bz.it\0alipay\0no-ip.co.uk\0" +"lillehammer.no\0" +"virtualserver.io\0" +"yamagata.jp\0" +"mini\0" +"londrina.br\0" +"lodi.it\0health-carereform.com\0" +"sogndal.no\0\xe0\xa4\xa8\xe0\xa5\x87\xe0\xa4\x9f\0" +"gen.tr\0traeumtgerade.de\0" +"khplay.nl\0" +"kikuchi.kumamoto.jp\0mint\0" +"nagasu.kumamoto.jp\0" +"equipment.aero\0*.elb.amazonaws.com.cn\0" +"barsyonline.co.uk\0" +"tomari.hokkaido.jp\0" +"asakuchi.okayama.jp\0" +"asahi.nagano.jp\0locus\0" +"akita.jp\0" +"bosch\0insure\0" +"my-gateway.de\0" +"ca.us\0" +"inabe.mie.jp\0webthings.io\0" +"nt.au\0" +"brunel.museum\0neat-url.com\0" +"kvam.no\0" +"arvo.network\0" +"lubartow.pl\0" +"massacarrara.it\0from-wy.com\0" +"yorkshire.museum\0" +"lamer\0" +"glogow.pl\0vps.mcdir.ru\0" +"nt.ca\0" +"usdecorativearts.museum\0" +"hr.eu.org\0" +"narviika.no\0" +"miyakonojo.miyazaki.jp\0kitayama.wakayama.jp\0" +"children.museum\0" +"kimitsu.chiba.jp\0" +"a.se\0" +"js.org\0synology-ds.de\0" +"kamo.kyoto.jp\0" +"nahari.kochi.jp\0" +"takahashi.okayama.jp\0curv.dev\0" +"priv.pl\0" +"u2-local.xnbay.com\0" +"tranoy.no\0" +"tajimi.gifu.jp\0" +"trentino-sudtirol.it\0" +"urakawa.hokkaido.jp\0" +"readmyblog.org\0" +"k12.id.us\0dyn-ip24.de\0" +"\xd1\x8f.\xd1\x80\xd1\x83\xd1\x81\0" +"kunimi.fukushima.jp\0williamsburg.museum\0" +"raisa.no\0from-ma.com\0" +"barrell-of-knowledge.info\0scrysec.com\0" +"awaji.hyogo.jp\0" +"luxury\0" +"yugawa.fukushima.jp\0" +"sund.no\0" +"synology-diskstation.de\0" +"kamikawa.saitama.jp\0miasta.pl\0" +"barueri.br\0" +"stj\xc3\xb8rdal.no\0is-a-photographer.com\0" +"trentinsuedtirol.it\0priv.no\0" +"s.bg\0" +"gaular.no\0" +"taa.it\0hizen.saga.jp\0" +"oguni.yamagata.jp\0\xe0\xa4\xad\xe0\xa4\xbe\xe0\xa4\xb0\xe0\xa4\xa4\0" +"slattum.no\0" +"hyllestad.no\0" +"tsushima.aichi.jp\0" +"\xe4\xb8\x89\xe9\x87\x8d.jp\0" +"seidat.net\0" +"intelligence.museum\0" +"is-very-nice.org\0" +"awsglobalaccelerator.com\0" +"air-traffic-control.aero\0davvesiida.no\0" +"k12.fl.us\0hk.com\0" +"lib.mt.us\0lib.nd.us\0barsy.me\0" +"takatsuki.osaka.jp\0" +"priv.me\0" +"rotorcraft.aero\0" +"cahcesuolo.no\0playstation\0" +"healthcare\0" +"trentinoalto-adige.it\0kaminokawa.tochigi.jp\0" +"trentinsudtirol.it\0" +"niikappu.hokkaido.jp\0" +"usercontent.jp\0" +"cs.it\0is-a-libertarian.com\0" +"ragusa.it\0" +"x.mythic-beasts.com\0" +"kunitomi.miyazaki.jp\0juedisches.museum\0" +"caltanissetta.it\0koryo.nara.jp\0langevag.no\0" +"satx.museum\0etnedal.no\0" +"database.museum\0" +"muroran.hokkaido.jp\0" +"denmark.museum\0" +"presse.km\0" +"chocolate.museum\0" +"dyroy.no\0" +"uchinomi.kagawa.jp\0" +"surf\0" +"science-fiction.museum\0\xc3\xb8ksnes.no\0" +"kazimierz-dolny.pl\0" +"eastus2.azurestaticapps.net\0" +"dali.museum\0rl.no\0fairwinds\0" +"media.hu\0" +"trentino-s\xc3\xbc""dtirol.it\0" +"\xe6\x84\x9b\xe7\x9f\xa5.jp\0sykkylven.no\0" +"kwpsp.gov.pl\0" "getmyip.com\0" -"barlettatraniandria.it\0moriya.ibaraki.jp\0" -"workshop.museum\0eaton.mi.us\0from-ut.com\0" -"k12.co.us\0sinaapp.com\0" -"co.gg\0" -"tarumizu.kagoshima.jp\0osaki.miyagi.jp\0" -"travel.pl\0" -"co.gl\0basketball\0" -"bbva\0" -"kotohira.kagawa.jp\0dev\0" -"suginami.tokyo.jp\0valley.museum\0" -"kainan.tokushima.jp\0" -"fussa.tokyo.jp\0" -"1kapp.com\0" -"ntr.br\0" -"co.gy\0" -"tadotsu.kagawa.jp\0no-ip.biz\0noho.st\0" -"ovre-eiker.no\0construction\0deno.dev\0" -"minamiechizen.fukui.jp\0" +"santamaria.br\0" +"taishin.fukushima.jp\0bygland.no\0" +"latina.it\0modum.no\0" +"shinjuku.tokyo.jp\0" +"izumozaki.niigata.jp\0presse.ml\0" +"mitsue.nara.jp\0tendo.yamagata.jp\0r\xc3\xa5holt.no\0" +"properties\0" +"fetsund.no\0myasustor.com\0" +"pistoia.it\0verona.it\0githubusercontent.com\0jcloud.kz\0" +"\xe6\x85\x88\xe5\x96\x84\0pi.leg.br\0" +"dazaifu.fukuoka.jp\0environmentalconservation.museum\0" +"kounosu.saitama.jp\0*.on-k3s.io\0" +"khmelnytskyi.ua\0" +"exnet.su\0" +"fuoisku.no\0" +"tos.it\0" +"imakane.hokkaido.jp\0" +"adult\0endofinternet.org\0" +"visa\0" +"workinggroup.aero\0higashisumiyoshi.osaka.jp\0isa-hockeynut.com\0" +"gob.ar\0nagara.chiba.jp\0colonialwilliamsburg.museum\0" +"m\xc4\x81ori.nz\0" +"is-into-anime.com\0" +"nt.no\0webspace.rocks\0" +"oizumi.gunma.jp\0furniture\0hsbc\0icbc\0" +"teva\0" +"padua.it\0" +"ponpes.id\0" +"settsu.osaka.jp\0voagat.no\0test-iserv.de\0azimuth.network\0" +"gob.bo\0showtime\0" +"rygge.no\0\xd8\xa7\xd9\x84\xd8\xa8\xd8\xad\xd8\xb1\xd9\x8a\xd9\x86\0" +"iwakuni.yamaguchi.jp\0" +"wodzislaw.pl\0" +"ut.us\0" +"koto.tokyo.jp\0alvdal.no\0" +"gob.cl\0" +"hostyhosting.io\0" +"yokoze.saitama.jp\0sauda.no\0is-a-doctor.com\0" +"sado.niigata.jp\0" +"\xe0\xb8\x84\xe0\xb8\xad\xe0\xb8\xa1\0" +"mazeplay.com\0" +"amami.kagoshima.jp\0vegas\0barsy.uk\0" +"oxford.museum\0u.channelsdvr.net\0" +"chirurgiens-dentistes.fr\0kasuga.fukuoka.jp\0" +"wpdevcloud.com\0" +"jelastic.tsukaeru.net\0mysecuritycamera.net\0" +"nakagawa.fukuoka.jp\0" +"gob.do\0seven\0" +"viva\0" +"authgear-staging.com\0" +"mus.br\0" +"gob.ec\0" +"valleedaoste.it\0" +"tomakomai.hokkaido.jp\0" +"oita.oita.jp\0dnsdojo.net\0" +"futsu.nagasaki.jp\0" +"is-a-techie.com\0" +"tas.au\0" +"kumenan.okayama.jp\0" +"vivo\0alp1.ae.flow.ch\0" +"l\xc3\xb8""dingen.no\0" +"storj.farm\0" +"gob.es\0maori.nz\0" +"nt.ro\0" +"pagespeedmobilizer.com\0" +"akabira.hokkaido.jp\0" +"lakas.hu\0" +"oarai.ibaraki.jp\0berlevag.no\0" +"cagliari.it\0" +"goodyear\0bplaced.net\0" +"hakusan.ishikawa.jp\0" +"pavia.it\0nichinan.tottori.jp\0selje.no\0media.pl\0" +"restaurant\0" +"apps.fbsbx.com\0" +"racing\0" +"sekigahara.gifu.jp\0" +"hamatonbetsu.hokkaido.jp\0" +"sn.cn\0" +"lucania.it\0" +"toyooka.hyogo.jp\0cyber.museum\0" +"\xd0\xbe\xd0\xbd\xd0\xbb\xd0\xb0\xd0\xb9\xd0\xbd\0" +"tagajo.miyagi.jp\0" +"gob.gt\0togitsu.nagasaki.jp\0" +"cat.ax\0" +"square.museum\0" +"jls-sto3.elastx.net\0" +"koya.wakayama.jp\0" +"cadaques.museum\0od.ua\0global.ssl.fastly.net\0" +"joboji.iwate.jp\0" +"pe.leg.br\0" +"gob.hn\0" +"moonscale.net\0pagexl.com\0" +"coal.museum\0" +"mikasa.hokkaido.jp\0" +"dc.us\0" +"tsk.tr\0" +"sakawa.kochi.jp\0" +"yamaguchi.jp\0" +"ostre-toten.no\0weber\0" +"is-into-cartoons.com\0" +"bulsan-s\xc3\xbc""dtirol.it\0" +"ikaruga.nara.jp\0smart\0" +"tottori.tottori.jp\0" +"tychy.pl\0us-4.evennode.com\0" +"dyndns.org\0" +"\xeb\x8b\xb7\xeb\x84\xb7\0" +"skoczow.pl\0hasura-app.io\0" +"makurazaki.kagoshima.jp\0" +"filegear-de.me\0" +"salem.museum\0" +"le.it\0" +"arezzo.it\0\xe5\xb2\x90\xe9\x98\x9c.jp\0" +"ad.jp\0nanto.toyama.jp\0" +"il.eu.org\0" +"lillesand.no\0s.se\0ru.com\0bar1.net\0*.sensiosite.cloud\0" +"online.th\0" +"vv.it\0glitch.me\0" +"jdf.br\0jpmorgan\0" +"bir.ru\0" +"ybo.party\0" +"chuo.fukuoka.jp\0" +"jaguar\0" +"k12.in.us\0is-by.us\0" +"email\0" +"wiih.gov.pl\0blogspot.vn\0" +"cim.br\0" +"am.br\0chikuzen.fukuoka.jp\0" +"siracusa.it\0" +"tateyama.toyama.jp\0vega.no\0co.financial\0" +"yaita.tochigi.jp\0tj\xc3\xb8me.no\0hu.eu.org\0ie.eu.org\0" +"mulhouse.museum\0" +"homeftp.org\0" +"food\0" +"finland.museum\0selbu.no\0lenug.su\0" +"anan.nagano.jp\0" +"oamishirasato.chiba.jp\0" +"rivne.ua\0voorloper.cloud\0" +"inawashiro.fukushima.jp\0" +"is-a-personaltrainer.com\0" +"ln.cn\0alsace\0us-3.evennode.com\0" +"pvh.br\0kumano.mie.jp\0*.r.appspot.com\0" +"matsukawa.nagano.jp\0" +"\xe6\x94\xbf\xe5\xba\x9c\0authgearapps.com\0" +"001www.com\0" +"dnsalias.com\0" +"gob.mx\0" +"gob.ni\0" +"realm.cz\0" +"myvnc.com\0" +"mihama.chiba.jp\0" +"lib.de.us\0" +"ribeirao.br\0yamazoe.nara.jp\0" +"utsunomiya.tochigi.jp\0" +"co.education\0" +"takayama.gunma.jp\0" +"is-very-good.org\0" +"toyotsu.fukuoka.jp\0blogspot.re\0" +"iglesias-carbonia.it\0hichiso.gifu.jp\0" +"gorizia.it\0gob.pa\0" +"hamar.no\0ford\0" +"is-an-anarchist.com\0\xd0\xbc\xd0\xb8\xd1\x80.\xd1\x80\xd1\x83\xd1\x81\0gda.pl\0" +"hashimoto.wakayama.jp\0" +"gob.pe\0" +"\xe6\x95\x99\xe8\x82\xb2.hk\0" +"birkenes.no\0blogspot.ro\0" +"ishikari.hokkaido.jp\0mel\xc3\xb8y.no\0" +"gob.pk\0cc.wi.us\0gehirn.ne.jp\0" +"cafjs.com\0blogspot.rs\0" +"blogspot.ru\0blogspot.se\0" +"shiriuchi.hokkaido.jp\0blogspot.sg\0" +"wif.gov.pl\0" +"blogspot.si\0" +"barsy.bg\0" +"blogspot.sk\0" +"blogspot.sn\0on-web.fr\0" +"abkhazia.su\0" +"kharkiv.ua\0barsy.ca\0blogspot.td\0" +"forl\xc3\xac""cesena.it\0fujikawa.yamanashi.jp\0us-2.evennode.com\0" +"stat.no\0" +"deatnu.no\0" +"hm.no\0j\xc3\xb8lster.no\0mus.mi.us\0" +"isla.pr\0" +"ogawa.nagano.jp\0" +"mandal.no\0" +"pors\xc3\xa1\xc5\x8bgu.no\0pr.leg.br\0" +"city.hu\0" +"k12.ne.us\0" +"blogspot.tw\0blogspot.ug\0" +"barsy.de\0" +"aguni.okinawa.jp\0" +"latino\0" +"aizumisato.fukushima.jp\0" +"habikino.osaka.jp\0" +"blogspot.mr\0" +"isen.kagoshima.jp\0" +"bozen-suedtirol.it\0blogspot.mx\0" +"yoshida.shizuoka.jp\0saarland\0blogspot.my\0" +"ravendb.me\0" +"botanical.museum\0blogspot.nl\0" +"gob.sv\0" +"blogspot.no\0" +"barsy.eu\0" +"aukra.no\0" +"gifu.jp\0prime\0" +"brussels.museum\0decorativearts.museum\0schaeffler\0" +"network\0" +"yomitan.okinawa.jp\0niepce.museum\0penza.su\0" +"kunitachi.tokyo.jp\0" +"and.mom\0" +"koshu.yamanashi.jp\0richardli\0blogspot.pe\0" +"us-1.evennode.com\0" +"presse.ci\0" +"valdaosta.it\0" +"lib.sc.us\0" +"gob.ve\0" +"shiraoi.hokkaido.jp\0" +"blogspot.qa\0" +"ivgu.no\0" +"kopervik.no\0dedyn.io\0" +"gr.eu.org\0blogspot.pt\0" +"\xe0\xa6\xad\xe0\xa6\xbe\xe0\xa7\xb0\xe0\xa6\xa4\0" +"orskog.no\0" +"circus.museum\0" +"filegear-gb.me\0" +"h\xc3\xb8nefoss.no\0" +"dagestan.ru\0" +"okinoshima.shimane.jp\0winb.gov.pl\0" +"med.pro\0blogspot.is\0" +"blogspot.it\0" +"does-it.net\0ryd.wafaicloud.com\0" +"scienceandhistory.museum\0" +"nishi.osaka.jp\0" +"yatsuka.shimane.jp\0" +"fukui.jp\0kunstsammlung.museum\0homedns.org\0" +"v\xc3\xa5ler.hedmark.no\0" +"dagestan.su\0" +"jessheim.no\0andasuolo.no\0" +"blogspot.jp\0" +"abira.hokkaido.jp\0barsy.in\0" +"east-kazakhstan.su\0barsy.io\0ciscofreak.com\0" +"vall\xc3\xa9""e-d-aoste.it\0appspot.com\0" +"furano.hokkaido.jp\0" +"namsskogan.no\0" +"takasaki.gunma.jp\0" +"shop.ht\0traniandriabarletta.it\0meiwa.gunma.jp\0kushima.miyazaki.jp\0karpacz.pl\0" +"shop.hu\0" +"aki.kochi.jp\0" +"asahi.chiba.jp\0review\0blogspot.kr\0" +"kumatori.osaka.jp\0" +"computer.museum\0" +"cc.ma.us\0" +"takagi.nagano.jp\0" +"kvits\xc3\xb8y.no\0" +"arts.museum\0" +"blogspot.li\0" +"nikko.tochigi.jp\0\xe5\x80\x8b\xe4\xba\xba.\xe9\xa6\x99\xe6\xb8\xaf\0" +"usantiques.museum\0" +"en.it\0historisches.museum\0gok.pk\0" +"communications.museum\0int.eu.org\0" +"saves-the-whales.com\0" +"abc.br\0" +"compare\0blogspot.lt\0blogspot.md\0" +"psi.br\0beats\0blogspot.lu\0unicloud.pl\0" +"empresa.bo\0dyndns-mail.com\0us.platform.sh\0" +"po.it\0" +"in-dsl.org\0" +"imageandsound.museum\0us.eu.org\0blogspot.mk\0" +"rennebu.no\0" +"broadway\0j.scaleforce.net\0" +"is-very-bad.org\0" +"aya.miyazaki.jp\0" +"britishcolumbia.museum\0" +"co.place\0" +"faith\0" +"mol.it\0blogspot.fi\0" +"hidora.com\0" +"lib.ks.us\0" +"judygarland.museum\0" +"dyn.ddnss.de\0onthewifi.com\0" +"k12.oh.us\0design\0blogspot.fr\0" +"asahi.yamagata.jp\0dontexist.com\0" +"cng.br\0agrinet.tn\0" +"ecologia.bo\0" +"direct\0" +"lon-1.paas.massivegrid.net\0" +"av.it\0open\0" +"koganei.tokyo.jp\0" +"blogspot.gr\0" +"try-snowplow.com\0" +"bunkyo.tokyo.jp\0stathelle.no\0" +"riik.ee\0" +"pharmacy.museum\0" +"med.br\0is-a-republican.com\0" +"blogspot.hk\0" +"qh.cn\0t\xc3\xb8nsberg.no\0" +"namikata.ehime.jp\0*.hosting.myjino.ru\0""4lima.de\0" +"reggio-emilia.it\0yugawara.kanagawa.jp\0mallorca.museum\0" +"yuu.yamaguchi.jp\0" +"blogspot.hr\0" +"kawatana.nagasaki.jp\0volyn.ua\0" +"solund.no\0blogspot.hu\0blogspot.ie\0" +"webredirect.org\0" +"grondar.za\0" +"*.compute.amazonaws.com\0" +"dsmynas.com\0" +"ichihara.chiba.jp\0from-mo.com\0" +"blogspot.in\0" +"blogspot.ba\0" +"kv\xc3\xa6""fjord.no\0" +"tomigusuku.okinawa.jp\0blogspot.be\0" +"loppa.no\0blogspot.bg\0" +"lanbib.se\0company\0" +"nobeoka.miyazaki.jp\0" +"blogspot.bj\0" +"med.ec\0living\0" +"med.ee\0" +"4lima.at\0" +"civilwar.museum\0cc.pr.us\0" +"panasonic\0blogspot.ca\0" +"mp.br\0nakijin.okinawa.jp\0mircloud.us\0" +"yamatsuri.fukushima.jp\0" +"blogspot.cf\0" +"bolt.hu\0kagamiishi.fukushima.jp\0is-a-hunter.com\0mysecuritycamera.org\0" +"knowsitall.info\0blogspot.ch\0" +"laz.it\0nakagawa.nagano.jp\0" +"b-data.io\0" +"manchester.museum\0" +"fujikawaguchiko.yamanashi.jp\0blogspot.cl\0" +"aknoluokta.no\0" +"trading.aero\0" +"s3-ap-southeast-1.amazonaws.com\0" +"tp.it\0alibaba\0irish\0""4lima.ch\0" +"s3-website-ap-northeast-1.amazonaws.com\0" +"tashkent.su\0" +"blogspot.de\0" +"ushuaia.museum\0blogspot.cv\0" +"vall\xc3\xa9""edaoste.it\0asaminami.hiroshima.jp\0" +"if.ua\0blogspot.cz\0" +"urawa.saitama.jp\0blogspot.dk\0" +"io.kg\0storage.yandexcloud.net\0" +"tobishima.aichi.jp\0jls-sto1.elastx.net\0" +"corvette.museum\0" +"jeonbuk.kr\0is-a-hard-worker.com\0" +"gyeongnam.kr\0hoyanger.no\0" +"mytis.ru\0" +"games.hu\0" +"finn\xc3\xb8y.no\0" +"utwente.io\0" +"*.alces.network\0wbq.me\0" +"is-a-democrat.com\0" +"alwaysdata.net\0" +"melbourne\0" +"schmidt\0" +"publishproxy.com\0" +"\xe5\xae\xae\xe5\x9f\x8e.jp\0" +"hirado.nagasaki.jp\0" +"astronomy.museum\0" +"iwata.shizuoka.jp\0" +"fg.it\0" +"med.ht\0bike\0" +"trentin-sued-tirol.it\0" +"tagami.niigata.jp\0" +"ichinomiya.chiba.jp\0" +"ieee\0id.repl.co\0" +"austevoll.no\0" +"res.in\0mircloud.ru\0" +"izunokuni.shizuoka.jp\0" +"catering.aero\0austrheim.no\0" +"toolforge.org\0" +"servebeer.com\0" +"aoki.nagano.jp\0tjmaxx\0" +"lib.wy.us\0" +"blogspot.ae\0" +"sortland.no\0*.triton.zone\0" +"ito.shizuoka.jp\0" +"pittsburgh.museum\0leikanger.no\0" +"bo.it\0" +"blogspot.al\0" +"merckmsd\0tunes\0blogspot.am\0" +"newport.museum\0bing\0" +"minamidaito.okinawa.jp\0" +"kinghost.net\0" +"rovigo.it\0\xe7\xa7\x8b\xe7\x94\xb0.jp\0" +"mielno.pl\0" +"navuotna.no\0" +"maintenance.aero\0vennesla.no\0" +"missile.museum\0" +"living.museum\0kinder\0" +"av.tr\0" +"zaporizhzhe.ua\0" +"manno.kagawa.jp\0odda.no\0" +"med.ly\0" +"soni.nara.jp\0\xd8\xa8\xd8\xa7\xd8\xb2\xd8\xa7\xd8\xb1\0" +"mizumaki.fukuoka.jp\0vestre-toten.no\0" +"*.nagoya.jp\0contemporaryart.museum\0soccer\0software\0theater\0" +"ofunato.iwate.jp\0hidaka.kochi.jp\0homeftp.net\0" +"\xd2\x9b\xd0\xb0\xd0\xb7\0" +"sth.ac.at\0" +"folldal.no\0paas.beebyte.io\0" +"mup.gov.pl\0" +"hof.no\0" +"moriguchi.osaka.jp\0" +"b\xc3\xa5tsfjord.no\0" +"tsuru.yamanashi.jp\0" +"gose.nara.jp\0lajolla.museum\0lesja.no\0" +"minamiashigara.kanagawa.jp\0" +"v\xc3\xa6r\xc3\xb8y.no\0" +"yamada.iwate.jp\0" +"ota.gunma.jp\0" +"kawahara.tottori.jp\0med.om\0" +"tokai.aichi.jp\0mozilla-iot.org\0" +"tatsuno.nagano.jp\0med.pa\0" +"game\0" +"read\0s3-website.eu-west-3.amazonaws.com\0" +"historisch.museum\0" +"chichibu.saitama.jp\0" +"statebank\0us-west-2.elasticbeanstalk.com\0" +"xz.cn\0dynamisches-dns.de\0" +"skjak.no\0med.pl\0" +"\xe7\xbd\x91\xe7\xbb\x9c.cn\0" +"mangyshlak.su\0" +"vacations\0" +"lombardia.it\0""16-b.it\0" +"dep.no\0" +"atm.pl\0" +"shop.th\0" +"mie.jp\0is-not-certified.com\0" +"wzmiuw.gov.pl\0" +"yamato.kanagawa.jp\0lyngen.no\0" +"ono.hyogo.jp\0cc.ms.us\0cc.nc.us\0s3.dualstack.eu-west-2.amazonaws.com\0" +"macapa.br\0" +"v\xc3\xa5ler.\xc3\xb8stfold.no\0tiaa\0" +"online.museum\0" +"tecnologia.bo\0" +"no-ip.info\0" +"h.bg\0louvre.museum\0aver\xc3\xb8y.no\0namsos.no\0" +"parti.se\0" +"med.sa\0" +"monmouth.museum\0" +"med.sd\0" +"idrett.no\0" +"ra.it\0kindle\0" +"abarth\0" +"date.hokkaido.jp\0" +"*.frusky.de\0" +"aaa\0" +"page\0" +"parachuting.aero\0" +"bronnoy.no\0worse-than.tv\0shop.ro\0" +"valle-daosta.it\0" +"shisui.chiba.jp\0durham.museum\0*.telebit.xyz\0" +"9guacu.br\0" +"saskatchewan.museum\0online\0" +"info.gu\0" +"lib.ma.us\0abb\0" +"nombre.bo\0abc\0" +"leclerc\0is-a-nascarfan.com\0" +"helsinki.museum\0k12.or.us\0protection\0" +"tawaramoto.nara.jp\0" +"my.id\0freemasonry.museum\0" +"\xe7\xbd\x91\xe7\xbb\x9c.hk\0kitaakita.akita.jp\0os.hordaland.no\0blogspot.com\0" +"info.ht\0\xe6\x9d\xb1\xe4\xba\xac.jp\0" +"info.hu\0ishikawa.okinawa.jp\0kamitonda.wakayama.jp\0beta.bounty-full.com\0" +"0.bg\0trolley.museum\0shop.pl\0" +"ch.it\0rokunohe.aomori.jp\0eu.meteorapp.com\0" +"qld.au\0zgorzelec.pl\0" +"steigen.no\0" +"tarumizu.kagoshima.jp\0cloudns.asia\0" +"chonan.chiba.jp\0aco\0" +"info.et\0s3-website.eu-central-1.amazonaws.com\0" +"gs.nl.no\0" +"is-gone.com\0" +"seljord.no\0" +"info.fj\0urbinopesaro.it\0hirokawa.fukuoka.jp\0" +"edugit.org\0" +"alt.za\0" +"shizukuishi.iwate.jp\0" +"rost.no\0" +"kanoya.kagoshima.jp\0\xe5\xa4\xa7\xe4\xbc\x97\xe6\xb1\xbd\xe8\xbd\xa6\0" +"chikugo.fukuoka.jp\0hongo.hiroshima.jp\0" +"foggia.it\0" +"guide\0" +"\xd1\x83\xd0\xbf\xd1\x80.\xd1\x81\xd1\x80\xd0\xb1\0" +"ads\0" +"film.hu\0" +"evenassi.no\0" +"aeg\0free\0" +"toshima.tokyo.jp\0kurobe.toyama.jp\0" +"tajiri.osaka.jp\0" +"fosnes.no\0" +"yosemite.museum\0" +"tynset.no\0" +"naka.ibaraki.jp\0nakano.nagano.jp\0freebox-os.fr\0" +"k12.wa.us\0" +"daigo.ibaraki.jp\0" +"nishiarita.saga.jp\0bardu.no\0info.cx\0" +"bibai.hokkaido.jp\0sannan.hyogo.jp\0sochi.su\0" +"rexroth\0" +"muni.il\0furukawa.miyagi.jp\0reit\0vladikavkaz.ru\0" +"cq.cn\0lutsk.ua\0" +"takamori.nagano.jp\0" +"afl\0" +"nara.jp\0" +"vads\xc3\xb8.no\0" +"info.ec\0northwesternmutual\0g\xc3\xbcnstigbestellen.de\0" +"storfjord.no\0" +"mitsuke.niigata.jp\0supplies\0ms.leg.br\0" +"inagi.tokyo.jp\0fly.dev\0" +"shibetsu.hokkaido.jp\0" +"vb.it\0szczytno.pl\0" +"hidaka.wakayama.jp\0of.fashion\0" +"vladikavkaz.su\0" +"iki.fi\0" +"info.bb\0" +"olayangroup\0" +"rieti.it\0gs.jan-mayen.no\0info.at\0" +"info.au\0czest.pl\0" +"atlanta.museum\0environment.museum\0oya.to\0wblog.id\0" +"haibara.shizuoka.jp\0" +"info.az\0oto.fukuoka.jp\0" +"hirono.iwate.jp\0" +"info.bo\0" +"nishinoshima.shimane.jp\0service.one\0sites.static.land\0" +"adult.ht\0pointto.us\0" +"on-the-web.tv\0" +"kodaira.tokyo.jp\0" +"fr.eu.org\0mt.leg.br\0" +"chippubetsu.hokkaido.jp\0in-dsl.net\0" +"tsukigata.hokkaido.jp\0hospital\0" +"hobol.no\0" +"aig\0" +"yamanashi.yamanashi.jp\0" +"info.co\0dealer\0ukco.me\0" +"tamano.okayama.jp\0przeworsk.pl\0is-a-painter.com\0" +"iveland.no\0bedzin.pl\0" +"q.bg\0" +"supply\0" +"from-ks.com\0" +"koto.shiga.jp\0" +"niyodogawa.kochi.jp\0soundandvision.museum\0" +"santoandre.br\0\xe4\xbd\x90\xe8\xb3\x80.jp\0" +"kasama.ibaraki.jp\0christiansburg.museum\0" +"minoh.osaka.jp\0" +"gbiz\0gives\0" +"imari.saga.jp\0jaworzno.pl\0" +"futbol\0browsersafetymark.io\0" +"uryu.hokkaido.jp\0" +"arte.bo\0" +"minamiizu.shizuoka.jp\0" +"de.com\0" +"elk.pl\0" +"aircraft.aero\0rent\0" +"\xe5\xaf\x8c\xe5\xb1\xb1.jp\0" +"*.ocs.customer-oci.com\0" +"osoyro.no\0" +"kitaaiki.nagano.jp\0*.otap.co\0" +"\xe6\x94\xbf\xe5\xba\x9c.\xe9\xa6\x99\xe6\xb8\xaf\0" +"per.la\0" +"k12.pa.us\0" +"openair.museum\0hb.cldmail.ru\0" +"bronnoysund.no\0" +"odate.akita.jp\0yuki.ibaraki.jp\0" +"tamayu.shimane.jp\0" +"komagane.nagano.jp\0freedesktop.org\0" +"wales.museum\0kiwi\0" +"app.render.com\0" +"aoste.it\0recipes\0" +"shitara.aichi.jp\0can.museum\0" +"9.bg\0dyndns.ddnss.de\0" +"kochi.jp\0" +"pars\0" +"ch.tc\0idnblogger.com\0" +"hb.cn\0umbria.it\0haram.no\0" +"torino.museum\0custom.metacentrum.cz\0" +"mc.eu.org\0" +"kochi.kochi.jp\0lexus\0" +"\xe5\xb1\xb1\xe6\xa2\xa8.jp\0" +"sc.cn\0" +"zappos\0" +"sakai.ibaraki.jp\0" +"ichikawa.hyogo.jp\0" +"broke-it.net\0" +"per.nf\0flt.cloud.muni.cz\0" +"aizumi.tokushima.jp\0rzeszow.pl\0" +"udono.mie.jp\0" +"k12.ar.us\0today\0" +"wafflecell.com\0" +"tysvar.no\0lib.in.us\0" +"niihama.ehime.jp\0" +"trentinosuedtirol.it\0education\0" +"shioya.tochigi.jp\0k12.mi.us\0theatre\0" +"v\xc3\xa5gs\xc3\xb8y.no\0lohmus.me\0" +"texas.museum\0est.pr\0" +"uri.arpa\0readthedocs.io\0" +"nakatane.kagoshima.jp\0susono.shizuoka.jp\0lt.eu.org\0" +"anz\0" +"togo.aichi.jp\0starachowice.pl\0" +"yaizu.shizuoka.jp\0aol\0" +"kvalsund.no\0" +"epilepsy.museum\0tips\0" +"br\xc3\xb8nn\xc3\xb8y.no\0" +"trentinoaltoadige.it\0" +"fujimino.saitama.jp\0grane.no\0cloudcontrolled.com\0" +"is-a-celticsfan.org\0" +"rest\0" +"ontario.museum\0clothing\0" +"mortgage\0" +"eidsberg.no\0" +"h.se\0app\0" +"detroit.museum\0couchpotatofries.org\0" +"cesena-forli.it\0dattolocal.com\0" +"tozsde.hu\0carraramassa.it\0fredrikstad.no\0" +"vm.bytemark.co.uk\0" +"ringebu.no\0" +"s\xc3\xb8gne.no\0cn.com\0" +"kepno.pl\0" +"shimonoseki.yamaguchi.jp\0" +"ustka.pl\0" +"audio\0docs\0rag-cloud-ch.hosteur.com\0" +"postman-echo.com\0" +"trentins\xc3\xbc""dtirol.it\0kameyama.mie.jp\0bar\0" +"bbc\0" +"lindas.no\0" +"bialystok.pl\0k12.ia.us\0" +"karuizawa.nagano.jp\0cc.ct.us\0" +"ab.ca\0" +"bounceme.net\0" +"ui.nabu.casa\0" +"blogdns.org\0" +"virtuel.museum\0" +"davvenj\xc3\xa1rga.no\0\xd7\xa7\xd7\x95\xd7\x9d\0" +"undersea.museum\0art\0bbt\0sells-for-u.com\0" +"per.sg\0bcg\0" +"z.bg\0" +"gr.it\0" +"goshiki.hyogo.jp\0bcn\0" +"matsushige.tokushima.jp\0carrier.museum\0s\xc3\xb8rreisa.no\0dental\0" +"vik.no\0stada\0" +"info.ve\0" +"onion\0" +"revista.bo\0osaka\0" +"gr.jp\0" +"karacol.su\0" +"gs.sf.no\0andebu.no\0" +"info.vn\0" +"from-me.org\0" +"\xc3\xa5snes.no\0from-nm.com\0" +"is-found.org\0that.win\0" +"sc.ke\0" +"tobetsu.hokkaido.jp\0" +"g\xc3\xa1\xc5\x8bgaviika.no\0molde.no\0" +"lib.mo.us\0" +"hamura.tokyo.jp\0" +"h\xc3\xa6gebostad.no\0accountant\0betainabox.com\0" +"name.hr\0" +"sc.kr\0" +"edeka\0" +"bet\0" +"place\0from-ky.com\0" +"huissier-justice.fr\0takikawa.hokkaido.jp\0" +"movimiento.bo\0hagi.yamaguchi.jp\0" +"info.tn\0" +"hachijo.tokyo.jp\0kaufen\0from-ct.com\0" +"cz.it\0" +"\xe5\xa5\x88\xe8\x89\xaf.jp\0" +"higashiyamato.tokyo.jp\0info.tr\0indie.porn\0" +"daegu.kr\0schule\0" +"info.tt\0goldpoint\0" +"sch.ae\0hk.cn\0vpnplus.to\0" +"serveftp.net\0" +"name.et\0kanonji.kagawa.jp\0sc.ls\0" +"countryestate.museum\0eu-west-1.elasticbeanstalk.com\0" +"sardinia.it\0nowaruda.pl\0info.tz\0" +"name.fj\0yono.saitama.jp\0" +"omuta.fukuoka.jp\0muenchen.museum\0" +"cloudfunctions.net\0" +"matsumae.hokkaido.jp\0apps.lair.io\0" +"valer.ostfold.no\0axa\0" +"space.museum\0aws\0" +"*.futurecms.at\0" +"fortworth.museum\0\xd8\xa7\xd8\xb1\xd8\xa7\xd9\x85\xd9\x83\xd9\x88\0" +"nagano.nagano.jp\0" +"\xc3\xb8ystre-slidre.no\0" +"gouv.fr\0l\xc3\xa4ns.museum\0info.ro\0fastvps.host\0" +"aizuwakamatsu.fukushima.jp\0riodejaneiro.museum\0" +"ashibetsu.hokkaido.jp\0info.sd\0dynu.net\0" +"sasebo.nagasaki.jp\0pantheonsite.io\0" +"asuke.aichi.jp\0yonabaru.okinawa.jp\0cc.gu.us\0lib.ut.us\0bid\0" +"seaport.museum\0\xd0\xb1\xd0\xb5\xd0\xbb\0dyndns-at-home.com\0" +"name.cy\0" +"ocelot.mythic-beasts.com\0" +"chuo.osaka.jp\0" +"bio\0" +"mobi\0" +"run.app\0" +"*.webhare.dev\0" +"name.eg\0lc.it\0\xe6\xb8\xb8\xe6\x88\x8f\0" +"info.pk\0no.com\0" +"s\xc3\xa1lat.no\0info.pl\0" +"2ix.at\0" +"biz\0railway.museum\0shoparena.pl\0" +"gouv.ht\0" +"info.pr\0ddnsfree.com\0" +"vt.it\0" +"enf.br\0from-nh.com\0" +"in-vpn.de\0" +"tanabe.kyoto.jp\0aktyubinsk.su\0" +"rawa-maz.pl\0boutique\0" +"campinas.br\0" +"moda\0" +"name.az\0" +"tickets\0" +"fujiidera.osaka.jp\0" +"bip.sh\0" +"info.na\0""2ix.ch\0" +"gunma.jp\0" +"jelenia-gora.pl\0" +"shimada.shizuoka.jp\0" +"okutama.tokyo.jp\0info.mv\0info.nf\0jele.cloud\0" +"gouv.bj\0" +"info.ni\0" +"from-md.com\0" +"2ix.de\0" +"production.aero\0" +"chuo.yamanashi.jp\0" +"info.nr\0" +"sp.gov.br\0" +"leg.br\0" +"gouv.ci\0" +"togura.nagano.jp\0bc.platform.sh\0" +"sekd1.beebyteapp.io\0" +"susaki.kochi.jp\0palmsprings.museum\0" +"altoadige.it\0higashinaruse.akita.jp\0" +"consulting.aero\0mk.eu.org\0" +"services.aero\0" +"columbia.museum\0" +"info.la\0s3.eu-west-2.amazonaws.com\0" +"tadotsu.kagawa.jp\0" +"hayashima.okayama.jp\0" +"kaas.gg\0" +"higashiagatsuma.gunma.jp\0bms\0" +"firenze.it\0" +"pccw\0" +"goto.nagasaki.jp\0" +"bmw\0wedeploy.sh\0" +"hasura.app\0" +"rishirifuji.hokkaido.jp\0" +"info.ls\0" +"journal.aero\0sch.id\0" +"kunohe.iwate.jp\0" +"id.au\0press.museum\0" +"sc.ug\0" +"kawakami.nara.jp\0" +"sc.tz\0" +"satsumasendai.kagoshima.jp\0" +"realestate.pl\0bom\0" +"sch.ir\0" +"boo\0" +"serveirc.com\0" +"sc.us\0" +"bot\0" +"vic.gov.au\0" +"motegi.tochigi.jp\0box\0" +"so.gov.pl\0" +"sch.jo\0" +"users.scale.virtualcloud.com.br\0" +"ot.it\0pd.it\0info.ke\0" +"cab\0from-ok.com\0" +"misato.saitama.jp\0" +"info.ki\0" +"is-a-therapist.com\0" +"kuchinotsu.nagasaki.jp\0muosat.no\0crimea.ua\0" +"lu.eu.org\0me.eu.org\0" +"rikubetsu.hokkaido.jp\0" +"kunst.museum\0" +"nowruz\0" +"kawai.nara.jp\0cal\0" +"cam\0demo.datacenter.fi\0" +"beauxarts.museum\0quebec.museum\0" +"gjovik.no\0cba\0" +"car\0" +"utazas.hu\0ehime.jp\0ricoh\0" +"cat\0kawamata.fukushima.jp\0" +"vicenza.it\0kayabe.hokkaido.jp\0schokokeks.net\0" +"sch.lk\0cloudns.eu\0clan.rip\0" +"k12.ms.us\0k12.nc.us\0" +"cbn\0" +"farm.museum\0black\0" +"magazine.aero\0davvenjarga.no\0zagan.pl\0cbs\0" +"ok.us\0geekgalaxy.com\0" +"sch.ly\0svelvik.no\0" +"tomiya.miyagi.jp\0" +"naoshima.kagawa.jp\0lv.eu.org\0" +"\xd8\xa7\xd8\xa8\xd9\x88\xd8\xb8\xd8\xa8\xd9\x8a\0" +"s\xc3\xb8ndre-land.no\0barcelona\0" +"trust.museum\0lifeinsurance\0" +"steam.museum\0\xe3\x82\xa2\xe3\x83\x9e\xe3\x82\xbe\xe3\x83\xb3\0" +"gsj.bz\0" +"zao.miyagi.jp\0fujitsu\0" +"civilization.museum\0" +"village.museum\0tennis\0whoswho\0" +"ecn.br\0sch.ng\0*.code.run\0" +"armenia.su\0" +"z.se\0jozi.biz\0" +"sagamihara.kanagawa.jp\0" +"makinohara.shizuoka.jp\0automotive.museum\0ac.leg.br\0" +"field.museum\0dynamic-dns.info\0" +"stavern.no\0" +"ks.ua\0" +"habmer.no\0" +"orkanger.no\0" +"tsuiki.fukuoka.jp\0" +"hannan.osaka.jp\0" +"medical.museum\0*.ocp.customer-oci.com\0" +"photos\0" +"adobeaemcloud.net\0" +"ceo\0" +"cloudns.in\0" +"cfa\0" +"honai.ehime.jp\0bytom.pl\0" +"cfd\0app.os.stg.fedoraproject.org\0" +"ks.us\0" +"sanagochi.tokushima.jp\0" +"urayasu.chiba.jp\0tmall\0" +"gujo.gifu.jp\0" +"buy\0" +"booking\0" +"airline.aero\0overhalla.no\0unicom\0" +"nordkapp.no\0sch.qa\0" +"okayama.jp\0vt.us\0" +"id.ir\0" +"from-nv.com\0ca.reclaim.cloud\0" +"lapy.pl\0grocery\0cloudns.cc\0" +"tamamura.gunma.jp\0" +"on-aptible.com\0" +"sumita.iwate.jp\0machida.tokyo.jp\0from-ga.com\0" +"e4.cz\0" +"te.it\0tranby.no\0" +"izumi.kagoshima.jp\0name.vn\0" +"b\xc3\xa1hccavuotna.no\0" +"uonuma.niigata.jp\0rennes\xc3\xb8y.no\0" +"bandai.fukushima.jp\0" +"wedeploy.me\0" +"repair\0cn-northwest-1.eb.amazonaws.com.cn\0*.awdev.ca\0" +"pacific.museum\0" +"tempurl.host\0noip.us\0" +"exchange.aero\0sch.sa\0\xe7\xb5\x84\xe7\xb9\x94.tw\0" +"misconfused.org\0" +"shiroishi.miyagi.jp\0capetown\0for.men\0" +"gjerdrum.no\0" +"barclays\0" +"asahi.mie.jp\0" +"a.prod.fastly.net\0" +"kutno.pl\0chernivtsi.ua\0" +"jfk.museum\0" +"name.tj\0" +"sch.so\0" +"dupont\0" +"web.app\0" +"sch.ss\0shoes\0ar.com\0" +"katsuyama.fukui.jp\0" +"name.tr\0" +"dolls.museum\0name.tt\0" +"id.lv\0" +"kazuno.akita.jp\0" +"numazu.shizuoka.jp\0id.ly\0bzh\0" +"sr.gov.pl\0tec.mi.us\0" +"dgca.aero\0at-band-camp.net\0" +"blog\0" +"siljan.no\0" +"es.eu.org\0" +"logoip.de\0" +"onagawa.miyagi.jp\0" +"dellogliastra.it\0kr.eu.org\0" +"mango\0" +"oirm.gov.pl\0" +"andriatranibarletta.it\0" +"glas.museum\0" +"namegata.ibaraki.jp\0bieszczady.pl\0eu.ax\0" +"press.cy\0lon.wafaicloud.com\0" +"moto\0\xe6\x9c\xba\xe6\x9e\x84\0" +"biella.it\0k12.nv.us\0" +"yamatotakada.nara.jp\0rissa.no\0" +"lecco.it\0kiev.ua\0" +"soo.kagoshima.jp\0" +"s3-ap-south-1.amazonaws.com\0" +"higashine.yamagata.jp\0" +"\xe5\x95\x86\xe6\xa0\x87\0nym.by\0" +"nym.bz\0" +"earth\0" +"at.it\0" +"sasayama.hyogo.jp\0" +"gouv.sn\0" +"*.kitakyushu.jp\0" +"hirara.okinawa.jp\0" +"sor-varanger.no\0" +"lu.it\0me.it\0" +"name.qa\0" +"chofu.tokyo.jp\0name.pr\0builders\0" +"kannami.shizuoka.jp\0" +"suzu.ishikawa.jp\0bar2.net\0" +"frontdoor\0target\0" +"\xd1\x81\xd0\xb0\xd0\xb9\xd1\x82\0" +"shiki.saitama.jp\0" +"nym.ec\0" +"abiko.chiba.jp\0" +"laakesvuemie.no\0" +"manaus.br\0me.ke\0" +"name.na\0" +"trieste.it\0folkebibl.no\0" +"cust.testing.thingdust.io\0" +"kanzaki.saga.jp\0ch.trendhosting.cloud\0" +"caserta.it\0rikuzentakata.iwate.jp\0himeshima.oita.jp\0fukaya.saitama.jp\0name.mv\0" +"name.ng\0repair.men\0" +"name.my\0lorenskog.no\0ak.us\0" +"doomdns.org\0" +"lugs.org.uk\0" +"com\0" +"florida.museum\0nore-og-uvdal.no\0" +"coldwar.museum\0router.management\0" +"cpa\0" +"freeboxos.com\0" +"lenvik.no\0at.md\0" +"livinghistory.museum\0" +"ug.gov.pl\0info.zm\0sch.zm\0blue\0" +"website\0s3.dualstack.eu-central-1.amazonaws.com\0" +"hanamaki.iwate.jp\0\xd8\xa7\xd9\x84\xd8\xb3\xd8\xb9\xd9\x88\xd8\xaf\xdb\x8c\xd8\xa9\0" +"hida.gifu.jp\0kosei.shiga.jp\0" +"im.it\0" +"marumori.miyagi.jp\0" +"shintoku.hokkaido.jp\0tjeldsund.no\0" +"dad\0hosting-cluster.nl\0" +"barsy.info\0dynserv.org\0" +"ikawa.akita.jp\0" +"tn.it\0pages.dev\0" +"nym.gr\0" +"ltd.co.im\0" +"webhop.me\0" +"shinjo.nara.jp\0" +"donna.no\0" +"health\0" +"kashiwara.osaka.jp\0nym.gy\0" +"nym.hk\0" +"cloudns.us\0" +"miyazaki.jp\0brasilia.me\0" +"modern.museum\0" +"takaoka.toyama.jp\0te.ua\0day\0logoip.com\0" +"name.mk\0" +"berlin\0" +"nym.ie\0" +"lib.or.us\0" +"id.us\0" +"crs\0csc\0s3-website-us-west-1.amazonaws.com\0reserve-online.net\0" +"maceio.br\0" +"tcm.museum\0" +"dyndns-home.com\0" +"mjondalen.no\0noip.me\0" +"agano.niigata.jp\0" +"name.jo\0" +"fe.it\0utsira.no\0cc.wy.us\0" +"woodside\0" +"osaka.jp\0shiroi.chiba.jp\0nakanojo.gunma.jp\0" +"pv.it\0" +"kashiwa.chiba.jp\0kiyose.tokyo.jp\0" +"bingo\0" +"tw.cn\0wedeploy.io\0" +"inf.br\0" +"ardal.no\0" +"dds\0" +"friuliv-giulia.it\0gouv.km\0" +"\xe1\x83\x92\xe1\x83\x94\0" +"aquarium.museum\0vote\0" +"nym.la\0" +"pstmn.io\0" +"nym.lc\0" +"nym.li\0" +"inf.cu\0aramco\0voto\0nym.kz\0" +"munakata.fukuoka.jp\0r\xc3\xa5""de.no\0bd.se\0dev\0" +"alessandria.it\0" +"cuisinella\0al.leg.br\0" +"pubtls.org\0" +"blogdns.net\0nym.lt\0playstation-cloud.com\0" +"sogne.no\0nym.lu\0nym.me\0" +"wakayama.wakayama.jp\0" +"carboniaiglesias.it\0" +"fi.eu.org\0" +"fuefuki.yamanashi.jp\0gouv.ml\0" +"association.aero\0nym.mn\0" +"mitou.yamaguchi.jp\0" +"me.so\0" +"mn.it\0" +"me.ss\0\xd8\xa8\xda\xbe\xd8\xa7\xd8\xb1\xd8\xaa\0me.tc\0" +"kunstunddesign.museum\0nym.mx\0" +"science.museum\0dunlop\0" +"collection.museum\0" +"\xc3\xa5mli.no\0" +"yawara.ibaraki.jp\0*.stolos.io\0" +"lancia\0" +"trentin-sud-tirol.it\0kamishihoro.hokkaido.jp\0" +"dhl\0" +"labour.museum\0makeup\0" +"search\0" +"shimamaki.hokkaido.jp\0jondal.no\0" +"sweden.museum\0nym.nz\0" +"kozagawa.wakayama.jp\0me.tz\0" +"me.uk\0" +"risor.no\0" +"at.vg\0" +"dh.bytemark.co.uk\0" +"riobranco.br\0servecounterstrike.com\0" +"kawakita.ishikawa.jp\0yamanobe.yamagata.jp\0me.us\0*.linodeobjects.com\0nym.pe\0" +"plc.co.im\0" +"passenger-association.aero\0montreal.museum\0" +"usuki.oita.jp\0" +"kamogawa.chiba.jp\0secure\0" +"wv.us\0" +"nordeste-idc.saveincloud.net\0" +"user.party.eus\0" +"diy\0" +"nym.pt\0" +"fr\xc3\xa6na.no\0for.mom\0" +"to.gov.br\0me.vu\0" +"emiliaromagna.it\0" +"suldal.no\0" +"juif.museum\0" +"kamimine.saga.jp\0kharkov.ua\0" +"serveftp.org\0" +"siteleaf.net\0" +"miki.hyogo.jp\0kawagoe.mie.jp\0lans.museum\0" +"s3-website-ap-southeast-1.amazonaws.com\0" +"msk.ru\0" +"hammerfest.no\0\xd0\xb1\xd0\xb3\0" +"sciencesnaturelles.museum\0" +"\xe7\xb5\x84\xe7\xb9\x94.hk\0boxfuse.io\0dopaas.com\0pages.torproject.net\0" +"hasama.oita.jp\0bielawa.pl\0associates\0" +"enna.it\0" +"valled-aosta.it\0k12.gu.us\0" +"higashiyodogawa.osaka.jp\0nym.ro\0" +"mil.ac\0myftp.org\0" +"bologna.it\0kita.kyoto.jp\0" +"mil.ae\0" +"msk.su\0" +"hanawa.fukushima.jp\0" +"b\xc3\xb8.telemark.no\0" +"judaica.museum\0eidsvoll.no\0cookingchannel\0" +"sakura\0" +"mil.al\0ong.br\0" +"asti.it\0bremanger.no\0" +"malbork.pl\0solar\0nym.sk\0enterprisecloud.nu\0" +"nishigo.fukushima.jp\0saito.miyazaki.jp\0" +"mil.ba\0" +"mil.ar\0tn.us\0" +"matsuno.ehime.jp\0s3-website.eu-west-2.amazonaws.com\0cloudns.pw\0lug.org.uk\0" +"okuma.fukushima.jp\0" +"f.bg\0" +"nym.su\0" +"mil.az\0app.banzaicloud.io\0" +"nym.sx\0" +"futaba.fukushima.jp\0castres.museum\0" +"mil.bo\0kashiwazaki.niigata.jp\0" +"fund\0" +"mil.br\0chigasaki.kanagawa.jp\0\xd8\xa7\xd9\x84\xd8\xb3\xd8\xb9\xd9\x88\xd8\xaf\xdb\x8c\xdb\x83\0" +"cesenaforli.it\0tadaoka.osaka.jp\0" +"embetsu.hokkaido.jp\0" +"mad.museum\0\xd7\x99\xd7\xa8\xd7\x95\xd7\xa9\xd7\x9c\xd7\x99\xd7\x9d.museum\0wpmudev.host\0" +"microlight.aero\0mil.by\0" +"nym.tw\0" +"dnp\0" +"mil.cl\0obama.fukui.jp\0otsu.shiga.jp\0press.se\0" +"lib.ar.us\0" +"mil.cn\0myhome-server.de\0" +"mil.co\0" +"malselv.no\0gent\0linkyard-cloud.ch\0" +"karasjohka.no\0dog\0xx.gl\0" +"inf.mk\0" +"town.museum\0rad\xc3\xb8y.no\0bharti\0" +"s\xc3\xb8r-aurdal.no\0" +"is-a-bulls-fan.com\0" +"deloitte\0gg.ax\0" +"valle-aosta.it\0rich\0" +"krasnodar.su\0" +"\xe4\xba\xac\xe9\x83\xbd.jp\0" +"como.it\0" +"laquila.it\0musashimurayama.tokyo.jp\0" +"mil.do\0tatebayashi.gunma.jp\0dot\0express\0" +"bialowieza.pl\0" +"mizunami.gifu.jp\0" +"mil.ec\0yoro.gifu.jp\0sanok.pl\0" +"toyota.aichi.jp\0hiranai.aomori.jp\0" +"mil.eg\0higashikawa.hokkaido.jp\0is-an-artist.com\0" +"boomla.net\0" +"anpachi.gifu.jp\0" +"trading\0" +"ginowan.okinawa.jp\0\xe4\xbd\x9b\xe5\xb1\xb1\0" +"\xd0\xb5\xd1\x8e\0dyndns.info\0" +"from-ca.com\0" +"co.ae\0logistics.aero\0komatsushima.tokushima.jp\0" +"co.ag\0" +"higashi.okinawa.jp\0" +"mil.fj\0feste-ip.net\0" +"sowa.ibaraki.jp\0" +"rentals\0" +"co.am\0dreamhosters.com\0" +"co.ao\0szkola.pl\0eat\0" +"southwest.museum\0is-an-accountant.com\0" +"chikusei.ibaraki.jp\0gotemba.shizuoka.jp\0dynvpn.de\0" +"co.bb\0gs.svalbard.no\0edu.scot\0" +"co.at\0" +"mil.ge\0" }; static const quint16 tldChunkCount = 2; -static const quint32 tldChunks[] = {65534, 107981}; +static const quint32 tldChunks[] = {65530, 108837}; QT_END_NAMESPACE diff --git a/src/corelib/itemmodels/qconcatenatetablesproxymodel.cpp b/src/corelib/itemmodels/qconcatenatetablesproxymodel.cpp index 1c2d5e9f..efddc146 100644 --- a/src/corelib/itemmodels/qconcatenatetablesproxymodel.cpp +++ b/src/corelib/itemmodels/qconcatenatetablesproxymodel.cpp @@ -622,9 +622,14 @@ void QConcatenateTablesProxyModelPrivate::_q_slotDataChanged(const QModelIndex & Q_Q(QConcatenateTablesProxyModel); Q_ASSERT(from.isValid()); Q_ASSERT(to.isValid()); + if (from.column() >= m_columnCount) + return; + QModelIndex adjustedTo = to; + if (to.column() >= m_columnCount) + adjustedTo = to.siblingAtColumn(m_columnCount - 1); const QModelIndex myFrom = q->mapFromSource(from); Q_ASSERT(q->checkIndex(myFrom, QAbstractItemModel::CheckIndexOption::IndexIsValid)); - const QModelIndex myTo = q->mapFromSource(to); + const QModelIndex myTo = q->mapFromSource(adjustedTo); Q_ASSERT(q->checkIndex(myTo, QAbstractItemModel::CheckIndexOption::IndexIsValid)); emit q->dataChanged(myFrom, myTo, roles); } diff --git a/src/corelib/itemmodels/qsortfilterproxymodel.cpp b/src/corelib/itemmodels/qsortfilterproxymodel.cpp index 9fc59d58..dc6379d9 100644 --- a/src/corelib/itemmodels/qsortfilterproxymodel.cpp +++ b/src/corelib/itemmodels/qsortfilterproxymodel.cpp @@ -307,6 +307,8 @@ public: QHash::const_iterator create_mapping( const QModelIndex &source_parent) const; + QHash::const_iterator create_mapping_recursive( + const QModelIndex &source_parent) const; QModelIndex proxy_to_source(const QModelIndex &proxyIndex) const; QModelIndex source_to_proxy(const QModelIndex &sourceIndex) const; bool can_create_mapping(const QModelIndex &source_parent) const; @@ -533,6 +535,29 @@ IndexMap::const_iterator QSortFilterProxyModelPrivate::create_mapping( return it; } +// Go up the tree, creating mappings, unless of course the parent is filtered out +IndexMap::const_iterator QSortFilterProxyModelPrivate::create_mapping_recursive(const QModelIndex &source_parent) const +{ + if (source_parent.isValid()) { + const QModelIndex source_grand_parent = source_parent.parent(); + IndexMap::const_iterator it = source_index_mapping.constFind(source_grand_parent); + IndexMap::const_iterator end = source_index_mapping.constEnd(); + if (it == end) { + it = create_mapping_recursive(source_grand_parent); + end = source_index_mapping.constEnd(); + if (it == end) + return end; + } + Mapping *gm = it.value(); + if (gm->proxy_rows.at(source_parent.row()) == -1 || + gm->proxy_columns.at(source_parent.column()) == -1) { + // Can't do, parent is filtered + return end; + } + } + return create_mapping(source_parent); +} + QModelIndex QSortFilterProxyModelPrivate::proxy_to_source(const QModelIndex &proxy_index) const { if (!proxy_index.isValid()) @@ -751,8 +776,10 @@ void QSortFilterProxyModelPrivate::remove_source_items( { Q_Q(QSortFilterProxyModel); QModelIndex proxy_parent = q->mapFromSource(source_parent); - if (!proxy_parent.isValid() && source_parent.isValid()) + if (!proxy_parent.isValid() && source_parent.isValid()) { + proxy_to_source.clear(); return; // nothing to do (already removed) + } const auto proxy_intervals = proxy_intervals_for_source_items( source_to_proxy, source_items); @@ -1404,11 +1431,20 @@ void QSortFilterProxyModelPrivate::_q_sourceDataChanged(const QModelIndex &sourc const QModelIndex &source_bottom_right = data_changed.bottomRight; const QModelIndex source_parent = source_top_left.parent(); + bool change_in_unmapped_parent = false; IndexMap::const_iterator it = source_index_mapping.constFind(source_parent); if (it == source_index_mapping.constEnd()) { - // Don't care, since we don't have mapping for this index - continue; + // We don't have mapping for this index, so we cannot know how things + // changed (in case the change affects filtering) in order to forward + // the change correctly. + // But we can at least forward the signal "as is", if the row isn't + // filtered out, this is better than nothing. + it = create_mapping_recursive(source_parent); + if (it == source_index_mapping.constEnd()) + continue; + change_in_unmapped_parent = true; } + Mapping *m = it.value(); // Figure out how the source changes affect us @@ -1418,7 +1454,7 @@ void QSortFilterProxyModelPrivate::_q_sourceDataChanged(const QModelIndex &sourc QVector source_rows_resort; int end = qMin(source_bottom_right.row(), m->proxy_rows.count() - 1); for (int source_row = source_top_left.row(); source_row <= end; ++source_row) { - if (dynamic_sortfilter) { + if (dynamic_sortfilter && !change_in_unmapped_parent) { if (m->proxy_rows.at(source_row) != -1) { if (!filterAcceptsRowInternal(source_row, source_parent)) { // This source row no longer satisfies the filter, so it must be removed @@ -1568,7 +1604,6 @@ void QSortFilterProxyModelPrivate::_q_sourceReset() _q_clearMapping(); // All internal structures are deleted in clear() q->endResetModel(); - create_mapping(QModelIndex()); update_source_sort_column(); if (dynamic_sortfilter && update_source_sort_column()) sort(); @@ -1634,8 +1669,8 @@ void QSortFilterProxyModelPrivate::_q_sourceRowsAboutToBeInserted( const bool toplevel = !source_parent.isValid(); const bool recursive_accepted = filter_recursive && !toplevel && filterAcceptsRowInternal(source_parent.row(), source_parent.parent()); - //Force the creation of a mapping now, even if its empty. - //We need it because the proxy can be acessed at the moment it emits rowsAboutToBeInserted in insert_source_items + //Force the creation of a mapping now, even if it's empty. + //We need it because the proxy can be accessed at the moment it emits rowsAboutToBeInserted in insert_source_items if (!filter_recursive || toplevel || recursive_accepted) { if (can_create_mapping(source_parent)) create_mapping(source_parent); @@ -1754,8 +1789,8 @@ void QSortFilterProxyModelPrivate::_q_sourceColumnsAboutToBeInserted( { Q_UNUSED(start); Q_UNUSED(end); - //Force the creation of a mapping now, even if its empty. - //We need it because the proxy can be acessed at the moment it emits columnsAboutToBeInserted in insert_source_items + //Force the creation of a mapping now, even if it's empty. + //We need it because the proxy can be accessed at the moment it emits columnsAboutToBeInserted in insert_source_items if (can_create_mapping(source_parent)) create_mapping(source_parent); } @@ -1802,7 +1837,10 @@ void QSortFilterProxyModelPrivate::_q_sourceColumnsRemoved( source_sort_column = -1; } - proxy_sort_column = q->mapFromSource(model->index(0,source_sort_column, source_parent)).column(); + if (source_sort_column >= 0) + proxy_sort_column = q->mapFromSource(model->index(0,source_sort_column, source_parent)).column(); + else + proxy_sort_column = -1; } void QSortFilterProxyModelPrivate::_q_sourceColumnsAboutToBeMoved( @@ -2146,7 +2184,6 @@ void QSortFilterProxyModel::setSourceModel(QAbstractItemModel *sourceModel) connect(d->model, SIGNAL(modelReset()), this, SLOT(_q_sourceReset())); endResetModel(); - d->create_mapping(QModelIndex()); if (d->update_source_sort_column() && d->dynamic_sortfilter) d->sort(); } diff --git a/src/corelib/kernel/qcfsocketnotifier.cpp b/src/corelib/kernel/qcfsocketnotifier.cpp index 920ec9cd..13fe30d0 100644 --- a/src/corelib/kernel/qcfsocketnotifier.cpp +++ b/src/corelib/kernel/qcfsocketnotifier.cpp @@ -48,7 +48,7 @@ QT_BEGIN_NAMESPACE Socket Notifiers *************************************************************************/ void qt_mac_socket_callback(CFSocketRef s, CFSocketCallBackType callbackType, CFDataRef, - const void *, void *info) + const void *data, void *info) { QCFSocketNotifier *cfSocketNotifier = static_cast(info); @@ -61,7 +61,15 @@ void qt_mac_socket_callback(CFSocketRef s, CFSocketCallBackType callbackType, CF // notification after we've successfully disabled the CFSocket, but our Qt // notifier is now gone. The upshot is we have to check the notifier // every time. - if (callbackType == kCFSocketReadCallBack) { + if (callbackType == kCFSocketConnectCallBack) { + // The data pointer will be non-null on connection error + if (data) { + if (socketInfo->readNotifier) + QCoreApplication::sendEvent(socketInfo->readNotifier, ¬ifierEvent); + if (socketInfo->writeNotifier) + QCoreApplication::sendEvent(socketInfo->writeNotifier, ¬ifierEvent); + } + } else if (callbackType == kCFSocketReadCallBack) { if (socketInfo->readNotifier && socketInfo->readEnabled) { socketInfo->readEnabled = false; QCoreApplication::sendEvent(socketInfo->readNotifier, ¬ifierEvent); @@ -152,7 +160,7 @@ void QCFSocketNotifier::registerSocketNotifier(QSocketNotifier *notifier) // Create CFSocket, specify that we want both read and write callbacks (the callbacks // are enabled/disabled later on). - const int callbackTypes = kCFSocketReadCallBack | kCFSocketWriteCallBack; + const int callbackTypes = kCFSocketConnectCallBack | kCFSocketReadCallBack | kCFSocketWriteCallBack; CFSocketContext context = {0, this, 0, 0, 0}; socketInfo->socket = CFSocketCreateWithNative(kCFAllocatorDefault, nativeSocket, callbackTypes, qt_mac_socket_callback, &context); if (CFSocketIsValid(socketInfo->socket) == false) { diff --git a/src/corelib/kernel/qcore_mac.mm b/src/corelib/kernel/qcore_mac.mm index 4e13ba52..e774cebc 100644 --- a/src/corelib/kernel/qcore_mac.mm +++ b/src/corelib/kernel/qcore_mac.mm @@ -54,6 +54,7 @@ #include #include #include +#include #include @@ -351,6 +352,15 @@ bool qt_mac_applicationIsInDarkMode() #endif return false; } + +bool qt_mac_runningUnderRosetta() +{ + int translated = 0; + auto size = sizeof(translated); + if (sysctlbyname("sysctl.proc_translated", &translated, &size, nullptr, 0) == 0) + return translated; + return false; +} #endif bool qt_apple_isApplicationExtension() @@ -386,8 +396,8 @@ bool qt_apple_isSandboxed() { static bool isSandboxed = []() { QCFType staticCode = nullptr; - NSURL *bundleUrl = [[NSBundle mainBundle] bundleURL]; - if (SecStaticCodeCreateWithPath((__bridge CFURLRef)bundleUrl, + NSURL *executableUrl = NSBundle.mainBundle.executableURL; + if (SecStaticCodeCreateWithPath((__bridge CFURLRef)executableUrl, kSecCSDefaultFlags, &staticCode) != errSecSuccess) return false; diff --git a/src/corelib/kernel/qcore_mac_p.h b/src/corelib/kernel/qcore_mac_p.h index 96a2ff85..a851c3e7 100644 --- a/src/corelib/kernel/qcore_mac_p.h +++ b/src/corelib/kernel/qcore_mac_p.h @@ -172,6 +172,7 @@ private: Q_CORE_EXPORT QChar qt_mac_qtKey2CocoaKey(Qt::Key key); Q_CORE_EXPORT Qt::Key qt_mac_cocoaKey2QtKey(QChar keyCode); Q_CORE_EXPORT bool qt_mac_applicationIsInDarkMode(); +Q_CORE_EXPORT bool qt_mac_runningUnderRosetta(); #endif #ifndef QT_NO_DEBUG_STREAM diff --git a/src/corelib/kernel/qeventdispatcher_win.cpp b/src/corelib/kernel/qeventdispatcher_win.cpp index 65fc7870..b249d37a 100644 --- a/src/corelib/kernel/qeventdispatcher_win.cpp +++ b/src/corelib/kernel/qeventdispatcher_win.cpp @@ -98,7 +98,7 @@ LRESULT QT_WIN_CALLBACK qt_internal_proc(HWND hwnd, UINT message, WPARAM wp, LPA QEventDispatcherWin32Private::QEventDispatcherWin32Private() : threadId(GetCurrentThreadId()), interrupt(false), internalHwnd(0), - getMessageHook(0), sendPostedEventsTimerId(0), wakeUps(0), + sendPostedEventsTimerId(0), wakeUps(0), activateNotifiersPosted(false), winEventNotifierActivatedEvent(NULL) { } @@ -265,30 +265,21 @@ LRESULT QT_WIN_CALLBACK qt_internal_proc(HWND hwnd, UINT message, WPARAM wp, LPA static const UINT mask = inputQueueMask(); if (HIWORD(GetQueueStatus(mask)) == 0) q->sendPostedEvents(); + else + d->startPostedEventsTimer(); return 0; } // switch (message) return DefWindowProc(hwnd, message, wp, lp); } -LRESULT QT_WIN_CALLBACK qt_GetMessageHook(int code, WPARAM wp, LPARAM lp) +void QEventDispatcherWin32Private::startPostedEventsTimer() { - QEventDispatcherWin32 *q = qobject_cast(QAbstractEventDispatcher::instance()); - Q_ASSERT(q != 0); - QEventDispatcherWin32Private *d = q->d_func(); - MSG *msg = reinterpret_cast(lp); - // Windows unexpectedly passes PM_NOYIELD flag to the hook procedure, - // if ::PeekMessage(..., PM_REMOVE | PM_NOYIELD) is called from the event loop. - // So, retrieve 'removed' tag as a bit field. - const bool messageRemoved = (wp & PM_REMOVE) != 0; - - if (msg->hwnd == d->internalHwnd && msg->message == WM_QT_SENDPOSTEDEVENTS - && messageRemoved && d->sendPostedEventsTimerId == 0) { + if (sendPostedEventsTimerId == 0) { // Start a timer to deliver posted events when the message queue is emptied. - d->sendPostedEventsTimerId = SetTimer(d->internalHwnd, SendPostedEventsTimerId, - USER_TIMER_MINIMUM, NULL); + sendPostedEventsTimerId = SetTimer(internalHwnd, SendPostedEventsTimerId, + USER_TIMER_MINIMUM, NULL); } - return d->getMessageHook ? CallNextHookEx(0, code, wp, lp) : 0; } // Provide class name and atom for the message window used by @@ -469,14 +460,6 @@ void QEventDispatcherWin32::createInternalHwnd() return; d->internalHwnd = qt_create_internal_window(this); - // setup GetMessage hook needed to drive our posted events - d->getMessageHook = SetWindowsHookEx(WH_GETMESSAGE, (HOOKPROC) qt_GetMessageHook, NULL, GetCurrentThreadId()); - if (Q_UNLIKELY(!d->getMessageHook)) { - int errorCode = GetLastError(); - qFatal("Qt: INTERNAL ERROR: failed to install GetMessage hook: %d, %ls", - errorCode, qUtf16Printable(qt_error_string(errorCode))); - } - // start all normal timers for (int i = 0; i < d->timerVec.count(); ++i) d->registerTimer(d->timerVec.at(i)); @@ -520,13 +503,17 @@ bool QEventDispatcherWin32::processEvents(QEventLoop::ProcessEventsFlags flags) wakeUp(); // trigger a call to sendPostedEvents() } - d->interrupt.storeRelaxed(false); + // We don't know _when_ the interrupt occurred so we have to honor it. + const bool wasInterrupted = d->interrupt.fetchAndStoreRelaxed(false); emit awake(); // To prevent livelocks, send posted events once per iteration. // QCoreApplication::sendPostedEvents() takes care about recursions. sendPostedEvents(); + if (wasInterrupted) + return false; + auto threadData = d->threadData.loadRelaxed(); bool canWait; bool retVal = false; @@ -578,6 +565,7 @@ bool QEventDispatcherWin32::processEvents(QEventLoop::ProcessEventsFlags flags) } if (haveMessage) { if (d->internalHwnd == msg.hwnd && msg.message == WM_QT_SENDPOSTEDEVENTS) { + d->startPostedEventsTimer(); // Set result to 'true' because the message was sent by wakeUp(). retVal = true; continue; @@ -1022,10 +1010,6 @@ void QEventDispatcherWin32::closingDown() d->closingDown = true; - if (d->getMessageHook) - UnhookWindowsHookEx(d->getMessageHook); - d->getMessageHook = 0; - if (d->sendPostedEventsTimerId != 0) KillTimer(d->internalHwnd, d->sendPostedEventsTimerId); d->sendPostedEventsTimerId = 0; diff --git a/src/corelib/kernel/qeventdispatcher_win_p.h b/src/corelib/kernel/qeventdispatcher_win_p.h index dbb30ab5..bd007f82 100644 --- a/src/corelib/kernel/qeventdispatcher_win_p.h +++ b/src/corelib/kernel/qeventdispatcher_win_p.h @@ -114,7 +114,6 @@ protected: private: friend LRESULT QT_WIN_CALLBACK qt_internal_proc(HWND hwnd, UINT message, WPARAM wp, LPARAM lp); - friend LRESULT QT_WIN_CALLBACK qt_GetMessageHook(int, WPARAM, LPARAM); }; struct QSockNot { @@ -168,11 +167,11 @@ public: // internal window handle used for socketnotifiers/timers/etc HWND internalHwnd; - HHOOK getMessageHook; // for controlling when to send posted events UINT_PTR sendPostedEventsTimerId; QAtomicInt wakeUps; + void startPostedEventsTimer(); // timers WinTimerVec timerVec; diff --git a/src/corelib/kernel/qeventloop.cpp b/src/corelib/kernel/qeventloop.cpp index dc53af70..5d793ce7 100644 --- a/src/corelib/kernel/qeventloop.cpp +++ b/src/corelib/kernel/qeventloop.cpp @@ -50,6 +50,9 @@ #ifdef Q_OS_WASM #include +#if QT_CONFIG(thread) +#include +#endif #endif QT_BEGIN_NAMESPACE @@ -295,6 +298,9 @@ void QEventLoop::exit(int returnCode) // QEventLoop::exec() never returns in emscripten. We implement approximate behavior here. // QTBUG-70185 if (threadData->loopLevel == 1) { +#if QT_CONFIG(thread) + if (emscripten_is_main_browser_thread()) +#endif emscripten_force_exit(returnCode); } else { d->inExec = false; diff --git a/src/corelib/kernel/qfunctions_winrt.h b/src/corelib/kernel/qfunctions_winrt.h index d0c44be6..d29bd81d 100644 --- a/src/corelib/kernel/qfunctions_winrt.h +++ b/src/corelib/kernel/qfunctions_winrt.h @@ -167,8 +167,11 @@ enum AwaitStyle ProcessMainThreadEvents = 2 }; -template -static inline HRESULT _await_impl(const Microsoft::WRL::ComPtr &asyncOp, AwaitStyle awaitStyle, uint timeout) +using EarlyExitConditionFunction = std::function; + +template +static inline HRESULT _await_impl(const Microsoft::WRL::ComPtr &asyncOp, AwaitStyle awaitStyle, + uint timeout, EarlyExitConditionFunction func) { Microsoft::WRL::ComPtr asyncInfo; HRESULT hr = asyncOp.As(&asyncInfo); @@ -183,6 +186,8 @@ static inline HRESULT _await_impl(const Microsoft::WRL::ComPtr &asyncOp, Awai case ProcessMainThreadEvents: while (SUCCEEDED(hr = asyncInfo->get_Status(&status)) && status == AsyncStatus::Started) { QCoreApplication::processEvents(); + if (func && func()) + return E_ABORT; if (timeout && t.hasExpired(timeout)) return ERROR_TIMEOUT; } @@ -191,6 +196,8 @@ static inline HRESULT _await_impl(const Microsoft::WRL::ComPtr &asyncOp, Awai if (QAbstractEventDispatcher *dispatcher = QThread::currentThread()->eventDispatcher()) { while (SUCCEEDED(hr = asyncInfo->get_Status(&status)) && status == AsyncStatus::Started) { dispatcher->processEvents(QEventLoop::AllEvents); + if (func && func()) + return E_ABORT; if (timeout && t.hasExpired(timeout)) return ERROR_TIMEOUT; } @@ -221,20 +228,24 @@ static inline HRESULT _await_impl(const Microsoft::WRL::ComPtr &asyncOp, Awai return hr; } -template -static inline HRESULT await(const Microsoft::WRL::ComPtr &asyncOp, AwaitStyle awaitStyle = YieldThread, uint timeout = 0) +template +static inline HRESULT await(const Microsoft::WRL::ComPtr &asyncOp, + AwaitStyle awaitStyle = YieldThread, uint timeout = 0, + EarlyExitConditionFunction func = nullptr) { - HRESULT hr = _await_impl(asyncOp, awaitStyle, timeout); + HRESULT hr = _await_impl(asyncOp, awaitStyle, timeout, func); if (FAILED(hr)) return hr; return asyncOp->GetResults(); } -template -static inline HRESULT await(const Microsoft::WRL::ComPtr &asyncOp, U *results, AwaitStyle awaitStyle = YieldThread, uint timeout = 0) +template +static inline HRESULT await(const Microsoft::WRL::ComPtr &asyncOp, U *results, + AwaitStyle awaitStyle = YieldThread, uint timeout = 0, + EarlyExitConditionFunction func = nullptr) { - HRESULT hr = _await_impl(asyncOp, awaitStyle, timeout); + HRESULT hr = _await_impl(asyncOp, awaitStyle, timeout, func); if (FAILED(hr)) return hr; diff --git a/src/corelib/kernel/qmetaobject.cpp b/src/corelib/kernel/qmetaobject.cpp index 47fcada3..7761ab78 100644 --- a/src/corelib/kernel/qmetaobject.cpp +++ b/src/corelib/kernel/qmetaobject.cpp @@ -166,6 +166,13 @@ static inline const QByteArray stringData(const QMetaObject *mo, int index) return data; } +static inline QLatin1String stringDataView(const QMetaObject *mo, int index) +{ + const QByteArrayData &d = mo->d.stringdata[index]; + const char *string = reinterpret_cast(d.data()); + return QLatin1String(string, d.size); +} + static inline const char *rawStringData(const QMetaObject *mo, int index) { return stringData(mo, index).data(); @@ -2819,6 +2826,28 @@ int QMetaEnum::keysToValue(const char *keys, bool *ok) const return value; } +namespace +{ +template +void join_reversed(String &s, const Container &c, Separator sep) +{ + if (c.empty()) + return; + qsizetype len = qsizetype(c.size()) - 1; // N - 1 separators + for (auto &e : c) + len += qsizetype(e.size()); // N parts + s.reserve(len); + bool first = true; + for (auto rit = c.rbegin(), rend = c.rend(); rit != rend; ++rit) { + const auto &e = *rit; + if (!first) + s.append(sep); + first = false; + s.append(e.data(), e.size()); + } +} +} // unnamed namespace + /*! Returns a byte array of '|'-separated keys that represents the given \a value. @@ -2833,17 +2862,17 @@ QByteArray QMetaEnum::valueToKeys(int value) const const int offset = priv(mobj->d.data)->revision >= 8 ? 3 : 2; int count = mobj->d.data[handle + offset]; int data = mobj->d.data[handle + offset + 1]; + QVarLengthArray parts; int v = value; // reverse iterate to ensure values like Qt::Dialog=0x2|Qt::Window are processed first. for (int i = count - 1; i >= 0; --i) { int k = mobj->d.data[data + 2*i + 1]; if ((k != 0 && (v & k) == k ) || (k == value)) { v = v & ~k; - if (!keys.isEmpty()) - keys.prepend('|'); - keys.prepend(stringData(mobj, mobj->d.data[data + 2*i])); + parts.push_back(stringDataView(mobj, mobj->d.data[data + 2 * i])); } } + join_reversed(keys, parts, '|'); return keys; } diff --git a/src/corelib/kernel/qobject.cpp b/src/corelib/kernel/qobject.cpp index 93854190..1eb79138 100644 --- a/src/corelib/kernel/qobject.cpp +++ b/src/corelib/kernel/qobject.cpp @@ -71,6 +71,7 @@ #include #include +#include #include #include @@ -390,8 +391,14 @@ void QObjectPrivate::ConnectionData::removeConnection(QObjectPrivate::Connection Q_ASSERT(c != orphaned.loadRelaxed()); // add c to orphanedConnections - c->nextInOrphanList = orphaned.loadRelaxed(); - orphaned.storeRelaxed(c); + Connection *o = nullptr; + /* No ABA issue here: When adding a node, we only care about the list head, it doesn't + * matter if the tail changes. + */ + do { + o = orphaned.loadRelaxed(); + c->nextInOrphanList = o; + } while (!orphaned.testAndSetRelease(o, c)); #ifndef QT_NO_DEBUG found = false; @@ -406,21 +413,32 @@ void QObjectPrivate::ConnectionData::removeConnection(QObjectPrivate::Connection } -void QObjectPrivate::ConnectionData::cleanOrphanedConnectionsImpl(QObject *sender) +void QObjectPrivate::ConnectionData::cleanOrphanedConnectionsImpl(QObject *sender, LockPolicy lockPolicy) { + QBasicMutex *senderMutex = signalSlotLock(sender); ConnectionOrSignalVector *c = nullptr; { - QBasicMutexLocker l(signalSlotLock(sender)); + std::unique_lock lock(*senderMutex, std::defer_lock_t{}); + if (lockPolicy == NeedToLock) + lock.lock(); if (ref.loadAcquire() > 1) return; // Since ref == 1, no activate() is in process since we locked the mutex. That implies, // that nothing can reference the orphaned connection objects anymore and they can // be safely deleted - c = orphaned.loadRelaxed(); - orphaned.storeRelaxed(nullptr); + c = orphaned.fetchAndStoreRelaxed(nullptr); + } + if (c) { + // Deleting c might run arbitrary user code, so we must not hold the lock + if (lockPolicy == AlreadyLockedAndTemporarilyReleasingLock) { + senderMutex->unlock(); + deleteOrphaned(c); + senderMutex->lock(); + } else { + deleteOrphaned(c); + } } - deleteOrphaned(c); } void QObjectPrivate::ConnectionData::deleteOrphaned(QObjectPrivate::ConnectionOrSignalVector *o) @@ -1022,7 +1040,7 @@ QObject::~QObject() QBasicMutex *m = signalSlotLock(c->receiver.loadRelaxed()); bool needToUnlock = QOrderedMutexLocker::relock(signalSlotMutex, m); - if (c->receiver.loadAcquire()) { + if (c == connectionList.first.loadAcquire() && c->receiver.loadAcquire()) { cd->removeConnection(c); Q_ASSERT(connectionList.first.loadRelaxed() != c); } @@ -1060,14 +1078,29 @@ QObject::~QObject() } senderData->removeConnection(node); + /* + When we unlock, another thread has the chance to delete/modify sender data. + Thus we need to call cleanOrphanedConnections before unlocking. We use the + variant of the function which assumes that the lock is already held to avoid + a deadlock. + We need to hold m, the sender lock. Considering that we might execute arbitrary user + code, we should already release the signalSlotMutex here – unless they are the same. + */ + const bool locksAreTheSame = signalSlotMutex == m; + if (!locksAreTheSame) + locker.unlock(); + senderData->cleanOrphanedConnections( + sender, + QObjectPrivate::ConnectionData::AlreadyLockedAndTemporarilyReleasingLock + ); if (needToUnlock) m->unlock(); - if (slotObj) { + if (locksAreTheSame) // otherwise already unlocked locker.unlock(); + if (slotObj) slotObj->destroyIfLastRef(); - locker.relock(); - } + locker.relock(); } // invalidate all connections on the object and make sure @@ -2292,7 +2325,7 @@ void QObject::removeEventFilter(QObject *obj) event loop was still running: the Qt event loop will delete those objects as soon as the new nested event loop starts. - \b{Note:} It is safe to call this function more than once; when the + \note It is safe to call this function more than once; when the first deferred deletion event is delivered, any pending events for the object are removed from the event queue. @@ -2300,6 +2333,10 @@ void QObject::removeEventFilter(QObject *obj) */ void QObject::deleteLater() { +#ifdef QT_DEBUG + if (qApp == this) + qWarning("You are deferring the delete of QCoreApplication, this may not work as expected."); +#endif QCoreApplication::postEvent(this, new QDeferredDeleteEvent()); } @@ -4175,7 +4212,7 @@ void QObject::dumpObjectTree() /*! Dumps a tree of children to the debug output. - \note before Qt 5.9, this function was not const. + \note Before Qt 5.9, this function was not const. \sa dumpObjectInfo() */ @@ -4206,7 +4243,7 @@ void QObject::dumpObjectInfo() Dumps information about signal connections, etc. for this object to the debug output. - \note before Qt 5.9, this function was not const. + \note Before Qt 5.9, this function was not const. \sa dumpObjectTree() */ @@ -5106,13 +5143,19 @@ bool QObject::disconnect(const QMetaObject::Connection &connection) connections = QObjectPrivate::get(c->sender)->connections.loadRelaxed(); Q_ASSERT(connections); connections->removeConnection(c); + + c->sender->disconnectNotify(QMetaObjectPrivate::signal(c->sender->metaObject(), c->signal_index)); + // We must not hold the receiver mutex, else we risk dead-locking; we also only need the sender mutex + // It is however vital to hold the senderMutex before calling cleanOrphanedConnections, as otherwise + // another thread might modify/delete the connection + if (receiverMutex != senderMutex) { + receiverMutex->unlock(); + } + connections->cleanOrphanedConnections(c->sender, QObjectPrivate::ConnectionData::AlreadyLockedAndTemporarilyReleasingLock); + senderMutex->unlock(); // now both sender and receiver mutex have been manually unlocked + locker.dismiss(); // so we dismiss the QOrderedMutexLocker } - connections->cleanOrphanedConnections(c->sender); - - c->sender->disconnectNotify(QMetaObjectPrivate::signal(c->sender->metaObject(), - c->signal_index)); - const_cast(connection).d_ptr = nullptr; c->deref(); // has been removed from the QMetaObject::Connection object diff --git a/src/corelib/kernel/qobject_p.h b/src/corelib/kernel/qobject_p.h index 66c19d17..0b827a52 100644 --- a/src/corelib/kernel/qobject_p.h +++ b/src/corelib/kernel/qobject_p.h @@ -268,7 +268,10 @@ public: ~ConnectionData() { - deleteOrphaned(orphaned.loadRelaxed()); + Q_ASSERT(ref.loadRelaxed() == 0); + auto *c = orphaned.fetchAndStoreRelaxed(nullptr); + if (c) + deleteOrphaned(c); SignalVector *v = signalVector.loadRelaxed(); if (v) free(v); @@ -277,12 +280,19 @@ public: // must be called on the senders connection data // assumes the senders and receivers lock are held void removeConnection(Connection *c); - void cleanOrphanedConnections(QObject *sender) + enum LockPolicy { + NeedToLock, + // Beware that we need to temporarily release the lock + // and thus calling code must carefully consider whether + // invariants still hold. + AlreadyLockedAndTemporarilyReleasingLock + }; + void cleanOrphanedConnections(QObject *sender, LockPolicy lockPolicy = NeedToLock) { if (orphaned.loadRelaxed() && ref.loadAcquire() == 1) - cleanOrphanedConnectionsImpl(sender); + cleanOrphanedConnectionsImpl(sender, lockPolicy); } - void cleanOrphanedConnectionsImpl(QObject *sender); + void cleanOrphanedConnectionsImpl(QObject *sender, LockPolicy lockPolicy); ConnectionList &connectionsForSignal(int signal) { @@ -307,8 +317,14 @@ public: signalVector.storeRelaxed(newVector); if (vector) { - vector->nextInOrphanList = orphaned.loadRelaxed(); - orphaned.storeRelaxed(ConnectionOrSignalVector::fromSignalVector(vector)); + Connection *o = nullptr; + /* No ABA issue here: When adding a node, we only care about the list head, it doesn't + * matter if the tail changes. + */ + do { + o = orphaned.loadRelaxed(); + vector->nextInOrphanList = o; + } while (!orphaned.testAndSetRelease(o, ConnectionOrSignalVector::fromSignalVector(vector))); } } int signalVectorCount() const { diff --git a/src/corelib/kernel/qsystemsemaphore_posix.cpp b/src/corelib/kernel/qsystemsemaphore_posix.cpp index 9fbf5779..2bff5de4 100644 --- a/src/corelib/kernel/qsystemsemaphore_posix.cpp +++ b/src/corelib/kernel/qsystemsemaphore_posix.cpp @@ -70,7 +70,7 @@ bool QSystemSemaphorePrivate::handle(QSystemSemaphore::AccessMode mode) return true; // we already have a semaphore if (fileName.isEmpty()) { - errorString = QCoreApplication::tr("%1: key is empty", "QSystemSemaphore").arg(QLatin1String("QSystemSemaphore::handle")); + errorString = QCoreApplication::translate("%1: key is empty", "QSystemSemaphore").arg(QLatin1String("QSystemSemaphore::handle")); error = QSystemSemaphore::KeyError; return false; } diff --git a/src/corelib/kernel/qtranslator.cpp b/src/corelib/kernel/qtranslator.cpp index 36d9ea49..2812ffb7 100644 --- a/src/corelib/kernel/qtranslator.cpp +++ b/src/corelib/kernel/qtranslator.cpp @@ -601,9 +601,14 @@ bool QTranslatorPrivate::do_load(const QString &realname, const QString &directo } } - if (ok && d->do_load(reinterpret_cast(d->unmapPointer), d->unmapLength, directory)) { - d->filePath = realname; - return true; + if (ok) { + const QString base_dir = + !directory.isEmpty() ? directory : QFileInfo(realname).absolutePath(); + if (d->do_load(reinterpret_cast(d->unmapPointer), d->unmapLength, + base_dir)) { + d->filePath = realname; + return true; + } } #if defined(QT_USE_MMAP) diff --git a/src/corelib/mimetypes/qmimeglobpattern.cpp b/src/corelib/mimetypes/qmimeglobpattern.cpp index 943eb84b..3ab5bd4c 100644 --- a/src/corelib/mimetypes/qmimeglobpattern.cpp +++ b/src/corelib/mimetypes/qmimeglobpattern.cpp @@ -91,6 +91,40 @@ void QMimeGlobMatchResult::addMatch(const QString &mimeType, int weight, const Q } } +QMimeGlobPattern::PatternType QMimeGlobPattern::detectPatternType(const QString &pattern) const +{ + const int patternLength = pattern.length(); + if (!patternLength) + return OtherPattern; + + const bool starCount = pattern.count(QLatin1Char('*')) == 1; + const bool hasSquareBracket = pattern.indexOf(QLatin1Char('[')) != -1; + const bool hasQuestionMark = pattern.indexOf(QLatin1Char('?')) != -1; + + if (!hasSquareBracket && !hasQuestionMark) { + if (starCount == 1) { + // Patterns like "*~", "*.extension" + if (pattern.at(0) == QLatin1Char('*')) + return SuffixPattern; + // Patterns like "README*" (well this is currently the only one like that...) + if (pattern.at(patternLength - 1) == QLatin1Char('*')) + return PrefixPattern; + } + // Names without any wildcards like "README" + if (starCount == 0) + return LiteralPattern; + } + + if (pattern == QLatin1String("[0-9][0-9][0-9].vdr")) + return VdrPattern; + + if (pattern == QLatin1String("*.anim[1-9j]")) + return AnimPattern; + + return OtherPattern; +} + + /*! \internal \class QMimeGlobPattern @@ -100,58 +134,66 @@ void QMimeGlobMatchResult::addMatch(const QString &mimeType, int weight, const Q \sa QMimeType, QMimeDatabase, QMimeMagicRuleMatcher, QMimeMagicRule */ -bool QMimeGlobPattern::matchFileName(const QString &inputFilename) const +bool QMimeGlobPattern::matchFileName(const QString &inputFileName) const { // "Applications MUST match globs case-insensitively, except when the case-sensitive // attribute is set to true." // The constructor takes care of putting case-insensitive patterns in lowercase. - const QString filename = m_caseSensitivity == Qt::CaseInsensitive ? inputFilename.toLower() : inputFilename; + const QString fileName = m_caseSensitivity == Qt::CaseInsensitive + ? inputFileName.toLower() : inputFileName; - const int pattern_len = m_pattern.length(); - if (!pattern_len) + const int patternLength = m_pattern.length(); + if (!patternLength) return false; - const int len = filename.length(); + const int fileNameLength = fileName.length(); - const int starCount = m_pattern.count(QLatin1Char('*')); + switch (m_patternType) { + case SuffixPattern: { + if (fileNameLength + 1 < patternLength) + return false; - // Patterns like "*~", "*.extension" - if (m_pattern[0] == QLatin1Char('*') && m_pattern.indexOf(QLatin1Char('[')) == -1 && starCount == 1) - { - if (len + 1 < pattern_len) return false; - - const QChar *c1 = m_pattern.unicode() + pattern_len - 1; - const QChar *c2 = filename.unicode() + len - 1; + const QChar *c1 = m_pattern.unicode() + patternLength - 1; + const QChar *c2 = fileName.unicode() + fileNameLength - 1; int cnt = 1; - while (cnt < pattern_len && *c1-- == *c2--) + while (cnt < patternLength && *c1-- == *c2--) ++cnt; - return cnt == pattern_len; + return cnt == patternLength; } - - // Patterns like "README*" (well this is currently the only one like that...) - if (starCount == 1 && m_pattern.at(pattern_len - 1) == QLatin1Char('*')) { - if (len + 1 < pattern_len) return false; - if (m_pattern.at(0) == QLatin1Char('*')) - return filename.indexOf(m_pattern.midRef(1, pattern_len - 2)) != -1; + case PrefixPattern: { + if (fileNameLength + 1 < patternLength) + return false; const QChar *c1 = m_pattern.unicode(); - const QChar *c2 = filename.unicode(); + const QChar *c2 = fileName.unicode(); int cnt = 1; - while (cnt < pattern_len && *c1++ == *c2++) + while (cnt < patternLength && *c1++ == *c2++) ++cnt; - return cnt == pattern_len; + return cnt == patternLength; } - - // Names without any wildcards like "README" - if (m_pattern.indexOf(QLatin1Char('[')) == -1 && starCount == 0 && m_pattern.indexOf(QLatin1Char('?'))) - return (m_pattern == filename); - - // Other (quite rare) patterns, like "*.anim[1-9j]": use slow but correct method + case LiteralPattern: + return (m_pattern == fileName); + case VdrPattern: // "[0-9][0-9][0-9].vdr" case + return fileNameLength == 7 + && fileName.at(0).isDigit() && fileName.at(1).isDigit() && fileName.at(2).isDigit() + && QStringView{fileName}.mid(3, 4) == QLatin1String(".vdr"); + case AnimPattern: { // "*.anim[1-9j]" case + if (fileNameLength < 6) + return false; + const QChar lastChar = fileName.at(fileNameLength - 1); + const bool lastCharOK = (lastChar.isDigit() && lastChar != QLatin1Char('0')) + || lastChar == QLatin1Char('j'); + return lastCharOK && QStringView{fileName}.mid(fileNameLength - 6, 5) == QLatin1String(".anim"); + } + case OtherPattern: + // Other fallback patterns: slow but correct method #if QT_CONFIG(regularexpression) - QRegularExpression rx(QRegularExpression::wildcardToRegularExpression(m_pattern)); - return rx.match(filename).hasMatch(); + QRegularExpression rx(QRegularExpression::wildcardToRegularExpression(m_pattern)); + return rx.match(fileName).hasMatch(); #else - return false; + return false; #endif + } + return false; } static bool isSimplePattern(const QString &pattern) diff --git a/src/corelib/mimetypes/qmimeglobpattern_p.h b/src/corelib/mimetypes/qmimeglobpattern_p.h index 49f145e8..88d032c7 100644 --- a/src/corelib/mimetypes/qmimeglobpattern_p.h +++ b/src/corelib/mimetypes/qmimeglobpattern_p.h @@ -80,7 +80,10 @@ public: explicit QMimeGlobPattern(const QString &thePattern, const QString &theMimeType, unsigned theWeight = DefaultWeight, Qt::CaseSensitivity s = Qt::CaseInsensitive) : m_pattern(s == Qt::CaseInsensitive ? thePattern.toLower() : thePattern), - m_mimeType(theMimeType), m_weight(theWeight), m_caseSensitivity(s) + m_mimeType(theMimeType), + m_weight(theWeight), + m_caseSensitivity(s), + m_patternType(detectPatternType(m_pattern)) { } @@ -90,9 +93,10 @@ public: qSwap(m_mimeType, other.m_mimeType); qSwap(m_weight, other.m_weight); qSwap(m_caseSensitivity, other.m_caseSensitivity); + qSwap(m_patternType, other.m_patternType); } - bool matchFileName(const QString &filename) const; + bool matchFileName(const QString &inputFileName) const; inline const QString &pattern() const { return m_pattern; } inline unsigned weight() const { return m_weight; } @@ -100,10 +104,21 @@ public: inline bool isCaseSensitive() const { return m_caseSensitivity == Qt::CaseSensitive; } private: + enum PatternType { + SuffixPattern, + PrefixPattern, + LiteralPattern, + VdrPattern, // special handling for "[0-9][0-9][0-9].vdr" pattern + AnimPattern, // special handling for "*.anim[1-9j]" pattern + OtherPattern + }; + PatternType detectPatternType(const QString &pattern) const; + QString m_pattern; QString m_mimeType; int m_weight; Qt::CaseSensitivity m_caseSensitivity; + PatternType m_patternType; }; Q_DECLARE_SHARED(QMimeGlobPattern) diff --git a/src/corelib/mimetypes/qmimeprovider.cpp b/src/corelib/mimetypes/qmimeprovider.cpp index 12ce442f..258dddf8 100644 --- a/src/corelib/mimetypes/qmimeprovider.cpp +++ b/src/corelib/mimetypes/qmimeprovider.cpp @@ -272,7 +272,6 @@ void QMimeBinaryProvider::matchGlobList(QMimeGlobMatchResult &result, CacheFile //qDebug() << pattern << mimeType << weight << caseSensitive; QMimeGlobPattern glob(pattern, QString() /*unused*/, weight, qtCaseSensitive); - // TODO: this could be done faster for literals where a simple == would do. if (glob.matchFileName(fileName)) result.addMatch(QLatin1String(mimeType), weight, pattern); } diff --git a/src/corelib/plugin/qlibrary.cpp b/src/corelib/plugin/qlibrary.cpp index c94adc7a..739947ce 100644 --- a/src/corelib/plugin/qlibrary.cpp +++ b/src/corelib/plugin/qlibrary.cpp @@ -414,6 +414,11 @@ inline void QLibraryStore::cleanup() // see https://bugzilla.novell.com/show_bug.cgi?id=622977 // and http://sourceware.org/bugzilla/show_bug.cgi?id=11941 lib->unload(QLibraryPrivate::NoUnloadSys); +#elif defined(Q_OS_DARWIN) + // We cannot fully unload libraries, as we don't know if there are + // lingering references (in system threads e.g.) to Objective-C classes + // defined in the library. + lib->unload(QLibraryPrivate::NoUnloadSys); #else lib->unload(); #endif diff --git a/src/corelib/serialization/qxmlstream.cpp b/src/corelib/serialization/qxmlstream.cpp index 4f282f19..b2f84654 100644 --- a/src/corelib/serialization/qxmlstream.cpp +++ b/src/corelib/serialization/qxmlstream.cpp @@ -1307,6 +1307,11 @@ inline int QXmlStreamReaderPrivate::fastScanName(int *prefix) int n = 0; uint c; while ((c = getChar()) != StreamEOF) { + if (n >= 4096) { + // This is too long to be a sensible name, and + // can exhaust memory + return 0; + } switch (c) { case '\n': case ' ': diff --git a/src/corelib/statemachine/qstatemachine.cpp b/src/corelib/statemachine/qstatemachine.cpp index a257cbc3..aad88da1 100644 --- a/src/corelib/statemachine/qstatemachine.cpp +++ b/src/corelib/statemachine/qstatemachine.cpp @@ -3139,7 +3139,10 @@ void QSignalEventGenerator::execute(void **_a) if (machinePrivate->state != QStateMachinePrivate::Running) return; int signalIndex = senderSignalIndex(); - Q_ASSERT(signalIndex != -1); + if (signalIndex == -1) { + qWarning() << "StateMachine: Could not execute transition because originating object has been deleted"; + return; + } machinePrivate->handleTransitionSignal(sender(), signalIndex, _a); } diff --git a/src/corelib/text/qchar.cpp b/src/corelib/text/qchar.cpp index 4a7af897..6e0bb3c1 100644 --- a/src/corelib/text/qchar.cpp +++ b/src/corelib/text/qchar.cpp @@ -159,7 +159,7 @@ QT_BEGIN_NAMESPACE call toLatin1() to get the 8-bit value back. For more information see - \l{http://www.unicode.org/ucd/}{"About the Unicode Character Database"}. + \l{https://www.unicode.org/ucd/}{"About the Unicode Character Database"}. \sa Unicode, QString, QLatin1Char */ @@ -167,8 +167,8 @@ QT_BEGIN_NAMESPACE /*! \enum QChar::UnicodeVersion - Specifies which version of the \l{http://www.unicode.org/}{Unicode standard} - introduced a certain character. + Specifies which version of the \l{Unicode standard} introduced a certain + character. \value Unicode_1_1 Version 1.1 \value Unicode_2_0 Version 2.0 @@ -279,7 +279,7 @@ QT_BEGIN_NAMESPACE This enum type defines the Unicode script property values. For details about the Unicode script property values see - \l{http://www.unicode.org/reports/tr24/}{Unicode Standard Annex #24}. + \l{https://www.unicode.org/reports/tr24/}{Unicode Standard Annex #24}. In order to conform to C/C++ naming conventions "Script_" is prepended to the codes used in the Unicode Standard. @@ -456,8 +456,8 @@ QT_BEGIN_NAMESPACE \enum QChar::Direction This enum type defines the Unicode direction attributes. See the - \l{http://www.unicode.org/reports/tr9/tr9-35.html#Table_Bidirectional_Character_Types}{Unicode Standard} for a description - of the values. + \l{https://www.unicode.org/reports/tr9/tr9-35.html#Table_Bidirectional_Character_Types}{Unicode + Standard} for a description of the values. In order to conform to C/C++ naming conventions "Dir" is prepended to the codes used in the Unicode Standard. @@ -493,8 +493,7 @@ QT_BEGIN_NAMESPACE \enum QChar::Decomposition This enum type defines the Unicode decomposition attributes. See - the \l{http://www.unicode.org/}{Unicode Standard} for a - description of the values. + the \l{Unicode Standard} for a description of the values. \value NoDecomposition \value Canonical @@ -523,7 +522,7 @@ QT_BEGIN_NAMESPACE since 5.3 This enum type defines the Unicode joining type attributes. See the - \l{http://www.unicode.org/}{Unicode Standard} for a description of the values. + \l{Unicode Standard} for a description of the values. In order to conform to C/C++ naming conventions "Joining_" is prepended to the codes used in the Unicode Standard. @@ -562,8 +561,7 @@ QT_BEGIN_NAMESPACE \internal This enum type defines names for some of the Unicode combining - classes. See the \l{http://www.unicode.org/}{Unicode Standard} - for a description of the values. + classes. See the \l{Unicode Standard} for a description of the values. \value Combining_Above \value Combining_AboveAttached @@ -1826,7 +1824,7 @@ inline bool operator<(const UCS2SurrogatePair &ligature, uint u1) static uint inline ligatureHelper(uint u1, uint u2) { - if (u1 >= Hangul_LBase && u1 <= Hangul_SBase + Hangul_SCount) { + if (u1 >= Hangul_LBase && u1 < Hangul_SBase + Hangul_SCount) { // compute Hangul syllable composition as per UAX #15 // hangul L-V pair const uint LIndex = u1 - Hangul_LBase; @@ -1839,7 +1837,7 @@ static uint inline ligatureHelper(uint u1, uint u2) const uint SIndex = u1 - Hangul_SBase; if (SIndex < Hangul_SCount && (SIndex % Hangul_TCount) == 0) { const uint TIndex = u2 - Hangul_TBase; - if (TIndex <= Hangul_TCount) + if (TIndex < Hangul_TCount && TIndex) return u1 + TIndex; } } diff --git a/src/corelib/text/qcollator.cpp b/src/corelib/text/qcollator.cpp index 958216bd..47f470fb 100644 --- a/src/corelib/text/qcollator.cpp +++ b/src/corelib/text/qcollator.cpp @@ -72,12 +72,16 @@ QT_BEGIN_NAMESPACE /*! \since 5.13 - Constructs a QCollator using the system's default collation locale. + Constructs a QCollator using the default locale's collation locale. - \sa setLocale(), QLocale::collation() + The system locale, when used as default locale, may have a collation locale + other than itself (e.g. on Unix, if LC_COLLATE is set differently to LANG in + the environment). All other locales are their own collation locales. + + \sa setLocale(), QLocale::collation(), QLocale::setDefault() */ QCollator::QCollator() - : d(new QCollatorPrivate(QLocale::system().collation())) + : d(new QCollatorPrivate(QLocale().collation())) { d->init(); } diff --git a/src/corelib/text/qlocale.cpp b/src/corelib/text/qlocale.cpp index 67b06f42..a859badb 100644 --- a/src/corelib/text/qlocale.cpp +++ b/src/corelib/text/qlocale.cpp @@ -337,22 +337,6 @@ QByteArray QLocalePrivate::bcp47Name(char separator) const return localeId.withLikelySubtagsRemoved().name(separator); } -/*! - \internal - */ -QByteArray QLocalePrivate::rawName(char separator) const -{ - QByteArrayList parts; - if (m_data->m_language_id != QLocale::AnyLanguage) - parts.append(languageCode().latin1()); - if (m_data->m_script_id != QLocale::AnyScript) - parts.append(scriptCode().latin1()); - if (m_data->m_country_id != QLocale::AnyCountry) - parts.append(countryCode().latin1()); - - return parts.join(separator); -} - static const QLocaleData *findLocaleDataById(const QLocaleId &localeId) { const uint idx = locale_index[localeId.language_id]; @@ -4554,13 +4538,8 @@ QStringList QLocale::uiLanguages() const if (i < uiLanguages.size()) { // Adding likely-adjusted forms to system locale's list. // Name the locale is derived from: - const QString &name = uiLanguages.at(i); - prior = name.toLatin1(); - // Don't try to likely-adjust if construction's likely-adjustments - // were so drastic the result doesn't match the prior name: - if (locale.name() != name && locale.d->rawName() != prior) - continue; - // Insert just after prior: + prior = uiLanguages.at(i).toLatin1(); + // Insert just after the entry we're supplementing: j = i + 1; } else { // Plain locale, not system locale; just append. diff --git a/src/corelib/text/qlocale.qdoc b/src/corelib/text/qlocale.qdoc index 67fa0f4b..49ac2a78 100644 --- a/src/corelib/text/qlocale.qdoc +++ b/src/corelib/text/qlocale.qdoc @@ -92,7 +92,7 @@ \note For the current keyboard input locale take a look at QInputMethod::locale(). - QLocale's data is based on Common Locale Data Repository v38. + QLocale's data is based on Common Locale Data Repository v39. \sa QString::arg(), QString::toInt(), QString::toDouble(), QInputMethod::locale() diff --git a/src/corelib/text/qlocale_data_p.h b/src/corelib/text/qlocale_data_p.h index c960eaee..c5e6a0d4 100644 --- a/src/corelib/text/qlocale_data_p.h +++ b/src/corelib/text/qlocale_data_p.h @@ -77,8 +77,8 @@ static const int ImperialMeasurementSystemsCount = // GENERATED PART STARTS HERE /* - This part of the file was generated on 2020-11-09 from the - Common Locale Data Repository v38 + This part of the file was generated on 2021-04-26 from the + Common Locale Data Repository v39 http://www.unicode.org/cldr/ @@ -314,7 +314,6 @@ static const QLocaleId likely_subtags[] = { { 259, 0, 0 }, { 259, 7, 37 }, // mgo -> mgo_Latn_CM { 81, 0, 0 }, { 81, 7, 134 }, // mh -> mh_Latn_MH { 79, 0, 0 }, { 79, 7, 154 }, // mi -> mi_Latn_NZ - { 356, 0, 0 }, { 356, 130, 103 }, // mis -> mis_Hatr_IQ { 74, 0, 0 }, { 74, 2, 127 }, // mk -> mk_Cyrl_MK { 77, 0, 0 }, { 77, 24, 100 }, // ml -> ml_Mlym_IN { 82, 0, 0 }, { 82, 2, 143 }, // mn -> mn_Cyrl_MN @@ -718,7 +717,6 @@ static const QLocaleId likely_subtags[] = { { 0, 0, 138 }, { 37, 7, 138 }, // und_YT -> fr_Latn_YT { 0, 0, 240 }, { 104, 7, 240 }, // und_ZW -> sn_Latn_ZW { 0, 134, 0 }, { 177, 134, 91 }, // und_Adlm -> ff_Adlm_GN - { 0, 105, 0 }, { 335, 105, 178 }, // und_Aghb -> lez_Aghb_RU { 0, 128, 0 }, { 340, 128, 100 }, // und_Ahom -> aho_Ahom_IN { 0, 1, 0 }, { 8, 1, 64 }, // und_Arab -> ar_Arab_EG { 0, 1, 46 }, { 76, 1, 46 }, // und_Arab_CC -> ms_Arab_CC @@ -782,7 +780,6 @@ static const QLocaleId likely_subtags[] = { { 0, 56, 0 }, { 280, 56, 170 }, // und_Hano -> hnn_Hano_PH { 0, 5, 0 }, { 25, 5, 44 }, // und_Hans -> zh_Hans_CN { 0, 6, 0 }, { 25, 6, 208 }, // und_Hant -> zh_Hant_TW - { 0, 130, 0 }, { 356, 130, 103 }, // und_Hatr -> mis_Hatr_IQ { 0, 18, 0 }, { 48, 18, 105 }, // und_Hebr -> he_Hebr_IL { 0, 18, 38 }, { 137, 18, 38 }, // und_Hebr_CA -> yi_Hebr_CA { 0, 18, 224 }, { 137, 18, 224 }, // und_Hebr_GB -> yi_Hebr_GB @@ -1288,64 +1285,64 @@ static const QLocaleData locale_data[] = { { 6, 7, 127, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 14,9 , 14,9 , 113,6 , 10,17 , 37,5 , 8,10 , 310,28 , 338,58 , 396,15 , 411,28 , 338,58 , 396,15 , 7,11 , 7,10 , 54,4 , 5,17 , 22,23 , {77,75,68}, 11,3 , 198,54 , 19,5 , 24,7 , 51,5 , 64,18 , 2, 1, 1, 6, 7 }, // Albanian/Latin/Macedonia { 6, 7, 257, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 14,9 , 14,9 , 113,6 , 10,17 , 37,5 , 8,10 , 310,28 , 338,58 , 396,15 , 411,28 , 338,58 , 396,15 , 7,11 , 7,10 , 54,4 , 5,17 , 22,23 , {69,85,82}, 14,1 , 252,21 , 19,5 , 24,7 , 51,5 , 82,6 , 2, 1, 1, 6, 7 }, // Albanian/Latin/Kosovo { 7, 14, 69, 46, 44, 59, 37, 48, 45, 43, 101, 171, 187, 8249, 8250, 23,6 , 23,6 , 29,9 , 38,8 , 119,10 , 63,17 , 18,7 , 25,12 , 439,27 , 466,28 , 494,14 , 439,27 , 466,28 , 494,14 , 18,3 , 17,4 , 58,3 , 61,23 , 22,23 , {69,84,66}, 15,2 , 273,34 , 4,4 , 13,6 , 88,4 , 92,5 , 2, 1, 7, 6, 7 }, // Amharic/Ethiopic/Ethiopia - { 8, 1, 64, 1643, 1644, 1563, 37, 1632, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 46,6 , 46,6 , 129,10 , 139,17 , 18,7 , 25,12 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,47 , 22,23 , {69,71,80}, 17,5 , 307,81 , 19,5 , 4,0 , 97,7 , 104,3 , 2, 1, 6, 5, 6 }, // Arabic/Arabic/Egypt - { 8, 1, 3, 44, 46, 59, 37, 48, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 46,6 , 46,6 , 129,10 , 139,17 , 18,7 , 25,12 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,47 , 22,23 , {68,90,68}, 22,5 , 388,102 , 4,4 , 13,6 , 97,7 , 107,7 , 2, 1, 6, 5, 6 }, // Arabic/Arabic/Algeria - { 8, 1, 17, 1643, 1644, 1563, 37, 1632, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 46,6 , 46,6 , 129,10 , 139,17 , 18,7 , 25,12 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,47 , 22,23 , {66,72,68}, 27,5 , 490,91 , 19,5 , 4,0 , 97,7 , 114,7 , 3, 0, 6, 5, 6 }, // Arabic/Arabic/Bahrain - { 8, 1, 42, 1643, 1644, 1563, 37, 1632, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 46,6 , 46,6 , 129,10 , 139,17 , 18,7 , 25,12 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,47 , 22,23 , {88,65,70}, 32,4 , 581,112 , 19,5 , 4,0 , 97,7 , 121,4 , 0, 0, 1, 6, 7 }, // Arabic/Arabic/Chad - { 8, 1, 48, 1643, 1644, 1563, 37, 1632, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 46,6 , 46,6 , 129,10 , 139,17 , 37,5 , 8,10 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,47 , 22,23 , {75,77,70}, 36,2 , 693,105 , 19,5 , 4,0 , 97,7 , 125,9 , 0, 0, 1, 6, 7 }, // Arabic/Arabic/Comoros - { 8, 1, 59, 1643, 1644, 1563, 37, 1632, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 46,6 , 46,6 , 129,10 , 139,17 , 18,7 , 25,12 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,47 , 22,23 , {68,74,70}, 38,3 , 798,84 , 19,5 , 4,0 , 97,7 , 134,6 , 0, 0, 6, 6, 7 }, // Arabic/Arabic/Djibouti - { 8, 1, 67, 1643, 1644, 1563, 37, 1632, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 46,6 , 46,6 , 129,10 , 139,17 , 18,7 , 25,12 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,47 , 22,23 , {69,82,78}, 41,3 , 882,91 , 19,5 , 4,0 , 97,7 , 140,7 , 2, 1, 1, 6, 7 }, // Arabic/Arabic/Eritrea - { 8, 1, 103, 1643, 1644, 1563, 37, 1632, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 46,6 , 46,6 , 129,10 , 139,17 , 18,7 , 25,12 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,47 , 22,23 , {73,81,68}, 44,5 , 973,84 , 19,5 , 4,0 , 97,7 , 147,6 , 0, 0, 6, 5, 6 }, // Arabic/Arabic/Iraq - { 8, 1, 105, 1643, 1644, 1563, 37, 1632, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 46,6 , 46,6 , 129,10 , 139,17 , 55,4 , 59,9 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,47 , 22,23 , {73,76,83}, 49,1 , 1057,133 , 19,5 , 4,0 , 97,7 , 153,7 , 2, 1, 7, 5, 6 }, // Arabic/Arabic/Israel - { 8, 1, 109, 1643, 1644, 1563, 37, 1632, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 46,6 , 46,6 , 129,10 , 139,17 , 18,7 , 25,12 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,47 , 22,23 , {74,79,68}, 50,5 , 1190,84 , 19,5 , 4,0 , 97,7 , 160,6 , 3, 0, 6, 5, 6 }, // Arabic/Arabic/Jordan - { 8, 1, 115, 1643, 1644, 1563, 37, 1632, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 46,6 , 46,6 , 129,10 , 139,17 , 18,7 , 25,12 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,47 , 22,23 , {75,87,68}, 55,5 , 1274,84 , 19,5 , 4,0 , 97,7 , 166,6 , 3, 0, 6, 5, 6 }, // Arabic/Arabic/Kuwait - { 8, 1, 119, 1643, 1644, 1563, 37, 1632, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 46,6 , 46,6 , 129,10 , 139,17 , 18,7 , 25,12 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,47 , 22,23 , {76,66,80}, 60,5 , 1358,84 , 19,5 , 4,0 , 97,7 , 172,5 , 0, 0, 1, 6, 7 }, // Arabic/Arabic/Lebanon - { 8, 1, 122, 44, 46, 59, 37, 48, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 46,6 , 46,6 , 129,10 , 139,17 , 18,7 , 25,12 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,47 , 22,23 , {76,89,68}, 65,5 , 1442,88 , 4,4 , 13,6 , 97,7 , 177,5 , 3, 0, 6, 5, 6 }, // Arabic/Arabic/Libya - { 8, 1, 136, 1643, 1644, 1563, 37, 1632, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 46,6 , 46,6 , 129,10 , 139,17 , 18,7 , 25,12 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,47 , 22,23 , {77,82,85}, 70,4 , 1530,112 , 19,5 , 4,0 , 97,7 , 182,9 , 2, 1, 1, 6, 7 }, // Arabic/Arabic/Mauritania - { 8, 1, 145, 44, 46, 59, 37, 48, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 46,6 , 46,6 , 129,10 , 139,17 , 37,5 , 8,10 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,47 , 22,23 , {77,65,68}, 74,5 , 1642,87 , 4,4 , 13,6 , 97,7 , 191,6 , 2, 1, 1, 6, 7 }, // Arabic/Arabic/Morocco - { 8, 1, 162, 1643, 1644, 1563, 37, 1632, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 46,6 , 46,6 , 129,10 , 139,17 , 18,7 , 25,12 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,47 , 22,23 , {79,77,82}, 79,5 , 1729,77 , 19,5 , 4,0 , 97,7 , 197,5 , 3, 0, 6, 5, 6 }, // Arabic/Arabic/Oman - { 8, 1, 165, 1643, 1644, 1563, 37, 1632, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 46,6 , 46,6 , 129,10 , 139,17 , 18,7 , 25,12 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,47 , 22,23 , {73,76,83}, 49,1 , 1057,133 , 19,5 , 4,0 , 97,7 , 202,18 , 2, 1, 1, 6, 7 }, // Arabic/Arabic/Palestinian Territories - { 8, 1, 175, 1643, 1644, 1563, 37, 1632, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 46,6 , 46,6 , 129,10 , 139,17 , 18,7 , 25,12 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,47 , 22,23 , {81,65,82}, 84,5 , 1806,70 , 19,5 , 4,0 , 97,7 , 220,3 , 2, 1, 6, 5, 6 }, // Arabic/Arabic/Qatar - { 8, 1, 186, 1643, 1644, 1563, 37, 1632, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 46,6 , 46,6 , 129,10 , 139,17 , 18,7 , 25,12 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,47 , 22,23 , {83,65,82}, 89,5 , 1876,77 , 19,5 , 4,0 , 97,7 , 223,24 , 2, 1, 7, 5, 6 }, // Arabic/Arabic/Saudi Arabia - { 8, 1, 194, 1643, 1644, 1563, 37, 1632, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 46,6 , 46,6 , 129,10 , 139,17 , 18,7 , 25,12 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,47 , 22,23 , {83,79,83}, 94,1 , 1953,77 , 19,5 , 4,0 , 97,7 , 247,7 , 0, 0, 1, 6, 7 }, // Arabic/Arabic/Somalia - { 8, 1, 201, 1643, 1644, 1563, 37, 1632, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 46,6 , 46,6 , 129,10 , 139,17 , 18,7 , 25,12 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,47 , 22,23 , {83,68,71}, 95,4 , 2030,91 , 19,5 , 4,0 , 97,7 , 254,7 , 2, 1, 6, 5, 6 }, // Arabic/Arabic/Sudan - { 8, 1, 207, 1643, 1644, 1563, 37, 1632, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 46,6 , 46,6 , 129,10 , 139,17 , 18,7 , 25,12 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,47 , 22,23 , {83,89,80}, 99,5 , 2121,77 , 19,5 , 4,0 , 97,7 , 261,5 , 0, 0, 6, 5, 6 }, // Arabic/Arabic/Syria - { 8, 1, 216, 44, 46, 59, 37, 48, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 46,6 , 46,6 , 129,10 , 139,17 , 18,7 , 25,12 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,47 , 22,23 , {84,78,68}, 104,5 , 2198,95 , 4,4 , 13,6 , 97,7 , 266,4 , 3, 0, 1, 6, 7 }, // Arabic/Arabic/Tunisia - { 8, 1, 223, 1643, 1644, 1563, 37, 1632, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 46,6 , 46,6 , 129,10 , 139,17 , 18,7 , 25,12 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,47 , 22,23 , {65,69,68}, 109,5 , 2293,91 , 19,5 , 4,0 , 97,7 , 270,24 , 2, 1, 6, 5, 6 }, // Arabic/Arabic/United Arab Emirates - { 8, 1, 236, 46, 44, 59, 37, 48, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 46,6 , 46,6 , 129,10 , 139,17 , 18,7 , 25,12 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,47 , 22,23 , {77,65,68}, 74,5 , 1642,87 , 4,4 , 13,6 , 97,7 , 294,15 , 2, 1, 1, 6, 7 }, // Arabic/Arabic/Western Sahara - { 8, 1, 237, 1643, 1644, 1563, 37, 1632, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 46,6 , 46,6 , 129,10 , 139,17 , 18,7 , 25,12 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,47 , 22,23 , {89,69,82}, 114,5 , 2384,70 , 19,5 , 4,0 , 97,7 , 309,5 , 0, 0, 7, 5, 6 }, // Arabic/Arabic/Yemen - { 8, 1, 254, 1643, 1644, 1563, 37, 1632, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 46,6 , 46,6 , 129,10 , 139,17 , 18,7 , 25,12 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,47 , 22,23 , {83,83,80}, 119,1 , 2454,132 , 19,5 , 4,0 , 97,7 , 314,12 , 2, 1, 1, 6, 7 }, // Arabic/Arabic/South Sudan - { 8, 1, 260, 1643, 1644, 1563, 37, 1632, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 46,6 , 46,6 , 129,10 , 139,17 , 18,7 , 25,12 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,47 , 22,23 , {0,0,0}, 0,0 , 2586,0 , 19,5 , 4,0 , 326,22 , 348,6 , 2, 1, 1, 6, 7 }, // Arabic/Arabic/World - { 9, 10, 11, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 52,7 , 52,7 , 156,8 , 164,20 , 37,5 , 8,10 , 574,28 , 602,62 , 664,14 , 574,28 , 602,62 , 664,14 , 0,2 , 0,2 , 135,6 , 141,17 , 22,23 , {65,77,68}, 120,1 , 2586,46 , 19,5 , 4,0 , 354,7 , 361,8 , 2, 0, 1, 6, 7 }, // Armenian/Armenian/Armenia - { 10, 11, 100, 46, 44, 59, 37, 2534, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 59,9 , 59,9 , 184,8 , 192,18 , 68,7 , 75,12 , 678,32 , 710,58 , 768,14 , 678,32 , 710,58 , 768,14 , 22,9 , 22,7 , 158,4 , 162,37 , 22,23 , {73,78,82}, 121,1 , 2632,43 , 8,5 , 4,0 , 369,7 , 376,4 , 2, 1, 7, 7, 7 }, // Assamese/Bengali/India - { 12, 7, 15, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 68,8 , 68,8 , 156,8 , 210,17 , 37,5 , 8,10 , 782,27 , 809,67 , 99,14 , 876,27 , 809,67 , 99,14 , 0,2 , 0,2 , 199,4 , 5,17 , 22,23 , {65,90,78}, 122,1 , 2675,58 , 19,5 , 4,0 , 380,10 , 390,10 , 2, 1, 1, 6, 7 }, // Azerbaijani/Latin/Azerbaijan + { 8, 1, 64, 1643, 1644, 1563, 37, 1632, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 46,6 , 46,6 , 129,10 , 139,17 , 18,7 , 25,12 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,35 , 22,23 , {69,71,80}, 17,5 , 307,81 , 19,5 , 4,0 , 97,7 , 104,3 , 2, 1, 6, 5, 6 }, // Arabic/Arabic/Egypt + { 8, 1, 3, 44, 46, 59, 37, 48, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 46,6 , 46,6 , 129,10 , 139,17 , 18,7 , 25,12 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,35 , 22,23 , {68,90,68}, 22,5 , 388,102 , 4,4 , 13,6 , 97,7 , 107,7 , 2, 1, 6, 5, 6 }, // Arabic/Arabic/Algeria + { 8, 1, 17, 1643, 1644, 1563, 37, 1632, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 46,6 , 46,6 , 129,10 , 139,17 , 18,7 , 25,12 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,35 , 22,23 , {66,72,68}, 27,5 , 490,91 , 19,5 , 4,0 , 97,7 , 114,7 , 3, 0, 6, 5, 6 }, // Arabic/Arabic/Bahrain + { 8, 1, 42, 1643, 1644, 1563, 37, 1632, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 46,6 , 46,6 , 129,10 , 139,17 , 18,7 , 25,12 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,35 , 22,23 , {88,65,70}, 32,4 , 581,112 , 19,5 , 4,0 , 97,7 , 121,4 , 0, 0, 1, 6, 7 }, // Arabic/Arabic/Chad + { 8, 1, 48, 1643, 1644, 1563, 37, 1632, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 46,6 , 46,6 , 129,10 , 139,17 , 37,5 , 8,10 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,35 , 22,23 , {75,77,70}, 36,2 , 693,105 , 19,5 , 4,0 , 97,7 , 125,9 , 0, 0, 1, 6, 7 }, // Arabic/Arabic/Comoros + { 8, 1, 59, 1643, 1644, 1563, 37, 1632, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 46,6 , 46,6 , 129,10 , 139,17 , 18,7 , 25,12 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,35 , 22,23 , {68,74,70}, 38,3 , 798,84 , 19,5 , 4,0 , 97,7 , 134,6 , 0, 0, 6, 6, 7 }, // Arabic/Arabic/Djibouti + { 8, 1, 67, 1643, 1644, 1563, 37, 1632, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 46,6 , 46,6 , 129,10 , 139,17 , 18,7 , 25,12 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,35 , 22,23 , {69,82,78}, 41,3 , 882,91 , 19,5 , 4,0 , 97,7 , 140,7 , 2, 1, 1, 6, 7 }, // Arabic/Arabic/Eritrea + { 8, 1, 103, 1643, 1644, 1563, 37, 1632, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 46,6 , 46,6 , 129,10 , 139,17 , 18,7 , 25,12 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,35 , 22,23 , {73,81,68}, 44,5 , 973,84 , 19,5 , 4,0 , 97,7 , 147,6 , 0, 0, 6, 5, 6 }, // Arabic/Arabic/Iraq + { 8, 1, 105, 1643, 1644, 1563, 37, 1632, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 46,6 , 46,6 , 129,10 , 139,17 , 55,4 , 59,9 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,35 , 22,23 , {73,76,83}, 49,1 , 1057,133 , 19,5 , 4,0 , 97,7 , 153,7 , 2, 1, 7, 5, 6 }, // Arabic/Arabic/Israel + { 8, 1, 109, 1643, 1644, 1563, 37, 1632, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 46,6 , 46,6 , 129,10 , 139,17 , 18,7 , 25,12 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,35 , 22,23 , {74,79,68}, 50,5 , 1190,84 , 19,5 , 4,0 , 97,7 , 160,6 , 3, 0, 6, 5, 6 }, // Arabic/Arabic/Jordan + { 8, 1, 115, 1643, 1644, 1563, 37, 1632, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 46,6 , 46,6 , 129,10 , 139,17 , 18,7 , 25,12 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,35 , 22,23 , {75,87,68}, 55,5 , 1274,84 , 19,5 , 4,0 , 97,7 , 166,6 , 3, 0, 6, 5, 6 }, // Arabic/Arabic/Kuwait + { 8, 1, 119, 1643, 1644, 1563, 37, 1632, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 46,6 , 46,6 , 129,10 , 139,17 , 18,7 , 25,12 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,35 , 22,23 , {76,66,80}, 60,5 , 1358,84 , 19,5 , 4,0 , 97,7 , 172,5 , 0, 0, 1, 6, 7 }, // Arabic/Arabic/Lebanon + { 8, 1, 122, 44, 46, 59, 37, 48, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 46,6 , 46,6 , 129,10 , 139,17 , 18,7 , 25,12 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,35 , 22,23 , {76,89,68}, 65,5 , 1442,88 , 4,4 , 13,6 , 97,7 , 177,5 , 3, 0, 6, 5, 6 }, // Arabic/Arabic/Libya + { 8, 1, 136, 1643, 1644, 1563, 37, 1632, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 46,6 , 46,6 , 129,10 , 139,17 , 18,7 , 25,12 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,35 , 22,23 , {77,82,85}, 70,4 , 1530,112 , 19,5 , 4,0 , 97,7 , 182,9 , 2, 1, 1, 6, 7 }, // Arabic/Arabic/Mauritania + { 8, 1, 145, 44, 46, 59, 37, 48, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 46,6 , 46,6 , 129,10 , 139,17 , 37,5 , 8,10 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,35 , 22,23 , {77,65,68}, 74,5 , 1642,87 , 4,4 , 13,6 , 97,7 , 191,6 , 2, 1, 1, 6, 7 }, // Arabic/Arabic/Morocco + { 8, 1, 162, 1643, 1644, 1563, 37, 1632, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 46,6 , 46,6 , 129,10 , 139,17 , 18,7 , 25,12 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,35 , 22,23 , {79,77,82}, 79,5 , 1729,77 , 19,5 , 4,0 , 97,7 , 197,5 , 3, 0, 6, 5, 6 }, // Arabic/Arabic/Oman + { 8, 1, 165, 1643, 1644, 1563, 37, 1632, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 46,6 , 46,6 , 129,10 , 139,17 , 18,7 , 25,12 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,35 , 22,23 , {73,76,83}, 49,1 , 1057,133 , 19,5 , 4,0 , 97,7 , 202,18 , 2, 1, 1, 6, 7 }, // Arabic/Arabic/Palestinian Territories + { 8, 1, 175, 1643, 1644, 1563, 37, 1632, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 46,6 , 46,6 , 129,10 , 139,17 , 18,7 , 25,12 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,35 , 22,23 , {81,65,82}, 84,5 , 1806,70 , 19,5 , 4,0 , 97,7 , 220,3 , 2, 1, 6, 5, 6 }, // Arabic/Arabic/Qatar + { 8, 1, 186, 1643, 1644, 1563, 37, 1632, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 46,6 , 46,6 , 129,10 , 139,17 , 18,7 , 25,12 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,35 , 22,23 , {83,65,82}, 89,5 , 1876,77 , 19,5 , 4,0 , 97,7 , 223,24 , 2, 1, 7, 5, 6 }, // Arabic/Arabic/Saudi Arabia + { 8, 1, 194, 1643, 1644, 1563, 37, 1632, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 46,6 , 46,6 , 129,10 , 139,17 , 18,7 , 25,12 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,35 , 22,23 , {83,79,83}, 94,1 , 1953,77 , 19,5 , 4,0 , 97,7 , 247,7 , 0, 0, 1, 6, 7 }, // Arabic/Arabic/Somalia + { 8, 1, 201, 1643, 1644, 1563, 37, 1632, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 46,6 , 46,6 , 129,10 , 139,17 , 18,7 , 25,12 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,35 , 22,23 , {83,68,71}, 95,4 , 2030,91 , 19,5 , 4,0 , 97,7 , 254,7 , 2, 1, 6, 5, 6 }, // Arabic/Arabic/Sudan + { 8, 1, 207, 1643, 1644, 1563, 37, 1632, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 46,6 , 46,6 , 129,10 , 139,17 , 18,7 , 25,12 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,35 , 22,23 , {83,89,80}, 99,5 , 2121,77 , 19,5 , 4,0 , 97,7 , 261,5 , 0, 0, 6, 5, 6 }, // Arabic/Arabic/Syria + { 8, 1, 216, 44, 46, 59, 37, 48, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 46,6 , 46,6 , 129,10 , 139,17 , 18,7 , 25,12 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,35 , 22,23 , {84,78,68}, 104,5 , 2198,95 , 4,4 , 13,6 , 97,7 , 266,4 , 3, 0, 1, 6, 7 }, // Arabic/Arabic/Tunisia + { 8, 1, 223, 1643, 1644, 1563, 37, 1632, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 46,6 , 46,6 , 129,10 , 139,17 , 18,7 , 25,12 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,35 , 22,23 , {65,69,68}, 109,5 , 2293,91 , 19,5 , 4,0 , 97,7 , 270,24 , 2, 1, 6, 5, 6 }, // Arabic/Arabic/United Arab Emirates + { 8, 1, 236, 46, 44, 59, 37, 48, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 46,6 , 46,6 , 129,10 , 139,17 , 18,7 , 25,12 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,35 , 22,23 , {77,65,68}, 74,5 , 1642,87 , 4,4 , 13,6 , 97,7 , 294,15 , 2, 1, 1, 6, 7 }, // Arabic/Arabic/Western Sahara + { 8, 1, 237, 1643, 1644, 1563, 37, 1632, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 46,6 , 46,6 , 129,10 , 139,17 , 18,7 , 25,12 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,35 , 22,23 , {89,69,82}, 114,5 , 2384,70 , 19,5 , 4,0 , 97,7 , 309,5 , 0, 0, 7, 5, 6 }, // Arabic/Arabic/Yemen + { 8, 1, 254, 1643, 1644, 1563, 37, 1632, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 46,6 , 46,6 , 129,10 , 139,17 , 18,7 , 25,12 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,35 , 22,23 , {83,83,80}, 119,1 , 2454,132 , 19,5 , 4,0 , 97,7 , 314,12 , 2, 1, 1, 6, 7 }, // Arabic/Arabic/South Sudan + { 8, 1, 260, 1643, 1644, 1563, 37, 1632, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 46,6 , 46,6 , 129,10 , 139,17 , 18,7 , 25,12 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,35 , 22,23 , {0,0,0}, 0,0 , 2586,0 , 19,5 , 4,0 , 326,22 , 348,6 , 2, 1, 1, 6, 7 }, // Arabic/Arabic/World + { 9, 10, 11, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 52,7 , 52,7 , 156,8 , 164,20 , 37,5 , 8,10 , 574,28 , 602,62 , 664,14 , 574,28 , 602,62 , 664,14 , 0,2 , 0,2 , 123,6 , 129,17 , 22,23 , {65,77,68}, 120,1 , 2586,46 , 19,5 , 4,0 , 354,7 , 361,8 , 2, 0, 1, 6, 7 }, // Armenian/Armenian/Armenia + { 10, 11, 100, 46, 44, 59, 37, 2534, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 59,9 , 59,9 , 184,8 , 192,18 , 68,7 , 75,12 , 678,32 , 710,58 , 768,14 , 678,32 , 710,58 , 768,14 , 22,9 , 22,7 , 146,4 , 150,37 , 22,23 , {73,78,82}, 121,1 , 2632,43 , 8,5 , 4,0 , 369,7 , 376,4 , 2, 1, 7, 7, 7 }, // Assamese/Bengali/India + { 12, 7, 15, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 68,8 , 68,8 , 156,8 , 210,17 , 37,5 , 8,10 , 782,27 , 809,67 , 99,14 , 876,27 , 809,67 , 99,14 , 0,2 , 0,2 , 187,4 , 5,17 , 22,23 , {65,90,78}, 122,1 , 2675,58 , 19,5 , 4,0 , 380,10 , 390,10 , 2, 1, 1, 6, 7 }, // Azerbaijani/Latin/Azerbaijan { 12, 1, 102, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {73,82,82}, 0,0 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 0, 0, 6, 5, 5 }, // Azerbaijani/Arabic/Iran { 12, 2, 15, 44, 46, 59, 37, 48, 45, 43, 101, 171, 187, 8249, 8250, 0,6 , 0,6 , 0,6 , 0,6 , 156,8 , 210,17 , 37,5 , 8,10 , 903,27 , 930,67 , 99,14 , 903,27 , 930,67 , 99,14 , 31,2 , 29,2 , 45,4 , 5,17 , 22,23 , {65,90,78}, 122,1 , 2733,12 , 19,5 , 4,0 , 400,10 , 410,10 , 2, 1, 1, 6, 7 }, // Azerbaijani/Cyrillic/Azerbaijan { 13, 2, 178, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {82,85,66}, 123,1 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 1, 6, 7 }, // Bashkir/Cyrillic/Russia - { 14, 7, 197, 44, 46, 59, 37, 48, 8722, 43, 101, 8220, 8221, 8220, 8221, 0,6 , 0,6 , 76,9 , 76,9 , 227,6 , 233,36 , 37,5 , 87,12 , 997,28 , 1025,68 , 1093,14 , 997,28 , 1025,68 , 1093,14 , 0,2 , 0,2 , 203,7 , 5,17 , 22,23 , {69,85,82}, 14,1 , 2745,20 , 19,5 , 24,7 , 420,7 , 427,8 , 2, 1, 1, 6, 7 }, // Basque/Latin/Spain - { 15, 11, 18, 46, 44, 59, 37, 2534, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 85,9 , 85,9 , 269,6 , 192,18 , 18,7 , 25,12 , 1107,37 , 1144,58 , 1202,18 , 1107,37 , 1144,58 , 1202,18 , 0,2 , 0,2 , 158,4 , 5,17 , 22,23 , {66,68,84}, 124,1 , 2765,49 , 0,4 , 31,6 , 435,5 , 440,8 , 2, 1, 7, 6, 7 }, // Bengali/Bengali/Bangladesh - { 15, 11, 100, 46, 44, 59, 37, 2534, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 85,9 , 85,9 , 269,6 , 192,18 , 18,7 , 25,12 , 1107,37 , 1144,58 , 1202,18 , 1107,37 , 1144,58 , 1202,18 , 0,2 , 0,2 , 158,4 , 5,17 , 22,23 , {73,78,82}, 121,1 , 2814,43 , 0,4 , 31,6 , 435,5 , 448,4 , 2, 1, 7, 7, 7 }, // Bengali/Bengali/India + { 14, 7, 197, 44, 46, 59, 37, 48, 8722, 43, 101, 8220, 8221, 8220, 8221, 0,6 , 0,6 , 76,9 , 76,9 , 227,6 , 233,36 , 37,5 , 87,12 , 997,28 , 1025,68 , 1093,14 , 997,28 , 1025,68 , 1093,14 , 0,2 , 0,2 , 191,7 , 5,17 , 22,23 , {69,85,82}, 14,1 , 2745,20 , 19,5 , 24,7 , 420,7 , 427,8 , 2, 1, 1, 6, 7 }, // Basque/Latin/Spain + { 15, 11, 18, 46, 44, 59, 37, 2534, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 85,9 , 85,9 , 269,6 , 192,18 , 18,7 , 25,12 , 1107,37 , 1144,58 , 1202,18 , 1107,37 , 1144,58 , 1202,18 , 0,2 , 0,2 , 146,4 , 5,17 , 22,23 , {66,68,84}, 124,1 , 2765,49 , 0,4 , 31,6 , 435,5 , 440,8 , 2, 1, 7, 6, 7 }, // Bengali/Bengali/Bangladesh + { 15, 11, 100, 46, 44, 59, 37, 2534, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 85,9 , 85,9 , 269,6 , 192,18 , 18,7 , 25,12 , 1107,37 , 1144,58 , 1202,18 , 1107,37 , 1144,58 , 1202,18 , 0,2 , 0,2 , 146,4 , 5,17 , 22,23 , {73,78,82}, 121,1 , 2814,43 , 0,4 , 31,6 , 435,5 , 448,4 , 2, 1, 7, 7, 7 }, // Bengali/Bengali/India { 16, 31, 25, 46, 44, 59, 37, 3872, 45, 43, 101, 8220, 8221, 8216, 8217, 94,9 , 94,9 , 94,9 , 94,9 , 53,10 , 275,30 , 99,22 , 121,27 , 1220,34 , 1254,79 , 1333,27 , 1220,34 , 1254,79 , 1333,27 , 33,5 , 31,6 , 45,4 , 5,17 , 22,23 , {66,84,78}, 125,3 , 2857,15 , 4,4 , 4,0 , 452,6 , 458,5 , 2, 1, 7, 6, 7 }, // Dzongkha/Tibetan/Bhutan - { 19, 7, 74, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 103,8 , 103,8 , 119,10 , 97,16 , 37,5 , 8,10 , 1360,33 , 1393,43 , 1436,18 , 1360,33 , 1393,43 , 1436,18 , 38,4 , 37,4 , 210,7 , 217,17 , 234,23 , {69,85,82}, 14,1 , 2872,36 , 19,5 , 4,0 , 463,9 , 472,5 , 2, 1, 1, 6, 7 }, // Breton/Latin/France - { 20, 2, 33, 44, 160, 59, 37, 48, 45, 43, 101, 8222, 8220, 8222, 8220, 0,6 , 0,6 , 111,7 , 111,7 , 305,12 , 317,22 , 148,9 , 157,14 , 1454,21 , 1475,55 , 1530,14 , 1454,21 , 1475,55 , 1530,14 , 42,6 , 41,6 , 257,7 , 5,17 , 22,23 , {66,71,78}, 128,3 , 2908,47 , 19,5 , 24,7 , 477,9 , 486,8 , 2, 1, 1, 6, 7 }, // Bulgarian/Cyrillic/Bulgaria - { 21, 25, 147, 46, 44, 4170, 37, 4160, 45, 43, 101, 8220, 8221, 8216, 8217, 118,6 , 118,6 , 124,10 , 124,10 , 339,8 , 347,18 , 171,6 , 177,10 , 1544,54 , 1544,54 , 1598,14 , 1544,54 , 1544,54 , 1598,14 , 48,5 , 47,3 , 264,5 , 5,17 , 22,23 , {77,77,75}, 131,1 , 2955,29 , 8,5 , 4,0 , 494,6 , 494,6 , 0, 0, 7, 6, 7 }, // Burmese/Myanmar/Myanmar - { 22, 2, 20, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8222, 8220, 0,6 , 0,6 , 134,7 , 134,7 , 365,7 , 317,22 , 37,5 , 187,11 , 1612,21 , 1633,56 , 1689,14 , 1612,21 , 1633,56 , 1689,14 , 0,2 , 0,2 , 269,5 , 274,17 , 22,23 , {66,89,78}, 0,2 , 2984,89 , 19,5 , 4,0 , 500,10 , 510,8 , 2, 0, 1, 6, 7 }, // Belarusian/Cyrillic/Belarus - { 23, 20, 36, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 141,9 , 150,9 , 269,6 , 97,16 , 18,7 , 25,12 , 1703,40 , 1743,46 , 1789,14 , 1703,40 , 1803,47 , 1789,14 , 0,2 , 0,2 , 291,2 , 5,17 , 22,23 , {75,72,82}, 132,1 , 3073,29 , 0,4 , 31,6 , 518,5 , 523,7 , 2, 1, 7, 6, 7 }, // Khmer/Khmer/Cambodia + { 19, 7, 74, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 103,8 , 103,8 , 119,10 , 97,16 , 37,5 , 8,10 , 1360,33 , 1393,43 , 1436,18 , 1360,33 , 1393,43 , 1436,18 , 38,4 , 37,4 , 198,7 , 205,17 , 222,23 , {69,85,82}, 14,1 , 2872,36 , 19,5 , 4,0 , 463,9 , 472,5 , 2, 1, 1, 6, 7 }, // Breton/Latin/France + { 20, 2, 33, 44, 160, 59, 37, 48, 45, 43, 101, 8222, 8220, 8222, 8220, 0,6 , 0,6 , 111,7 , 111,7 , 305,12 , 317,22 , 148,9 , 157,14 , 1454,21 , 1475,55 , 1530,14 , 1454,21 , 1475,55 , 1530,14 , 42,6 , 41,6 , 245,7 , 5,17 , 22,23 , {66,71,78}, 128,3 , 2908,47 , 19,5 , 24,7 , 477,9 , 486,8 , 2, 1, 1, 6, 7 }, // Bulgarian/Cyrillic/Bulgaria + { 21, 25, 147, 46, 44, 4170, 37, 4160, 45, 43, 101, 8220, 8221, 8216, 8217, 118,6 , 118,6 , 124,10 , 124,10 , 339,8 , 347,18 , 171,6 , 177,10 , 1544,54 , 1544,54 , 1598,14 , 1544,54 , 1544,54 , 1598,14 , 48,5 , 47,3 , 252,5 , 5,17 , 22,23 , {77,77,75}, 131,1 , 2955,29 , 8,5 , 4,0 , 494,6 , 494,6 , 0, 0, 7, 6, 7 }, // Burmese/Myanmar/Myanmar + { 22, 2, 20, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8222, 8220, 0,6 , 0,6 , 134,7 , 134,7 , 365,7 , 317,22 , 37,5 , 187,11 , 1612,21 , 1633,56 , 1689,14 , 1612,21 , 1633,56 , 1689,14 , 0,2 , 0,2 , 257,5 , 262,17 , 22,23 , {66,89,78}, 0,2 , 2984,89 , 19,5 , 4,0 , 500,10 , 510,8 , 2, 0, 1, 6, 7 }, // Belarusian/Cyrillic/Belarus + { 23, 20, 36, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 141,9 , 150,9 , 269,6 , 97,16 , 18,7 , 25,12 , 1703,40 , 1743,46 , 1789,14 , 1703,40 , 1803,47 , 1789,14 , 0,2 , 0,2 , 279,2 , 5,17 , 22,23 , {75,72,82}, 132,1 , 3073,29 , 0,4 , 31,6 , 518,5 , 523,7 , 2, 1, 7, 6, 7 }, // Khmer/Khmer/Cambodia { 24, 7, 197, 44, 46, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 159,7 , 159,7 , 269,6 , 372,22 , 55,4 , 198,11 , 1850,28 , 1878,60 , 1938,21 , 1850,28 , 1878,60 , 1938,21 , 53,5 , 50,5 , 0,5 , 5,17 , 22,23 , {69,85,82}, 14,1 , 3102,20 , 19,5 , 24,7 , 530,6 , 536,7 , 2, 1, 1, 6, 7 }, // Catalan/Latin/Spain { 24, 7, 5, 44, 46, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 159,7 , 159,7 , 269,6 , 372,22 , 55,4 , 198,11 , 1850,28 , 1878,60 , 1938,21 , 1850,28 , 1878,60 , 1938,21 , 53,5 , 50,5 , 0,5 , 5,17 , 22,23 , {69,85,82}, 14,1 , 3102,20 , 19,5 , 24,7 , 530,6 , 543,7 , 2, 1, 1, 6, 7 }, // Catalan/Latin/Andorra { 24, 7, 74, 44, 46, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 159,7 , 159,7 , 269,6 , 372,22 , 55,4 , 198,11 , 1850,28 , 1878,60 , 1938,21 , 1850,28 , 1878,60 , 1938,21 , 53,5 , 50,5 , 0,5 , 5,17 , 22,23 , {69,85,82}, 14,1 , 3102,20 , 19,5 , 24,7 , 530,6 , 550,6 , 2, 1, 1, 6, 7 }, // Catalan/Latin/France { 24, 7, 106, 44, 46, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 159,7 , 159,7 , 269,6 , 372,22 , 55,4 , 198,11 , 1850,28 , 1878,60 , 1938,21 , 1850,28 , 1878,60 , 1938,21 , 53,5 , 50,5 , 0,5 , 5,17 , 22,23 , {69,85,82}, 14,1 , 3102,20 , 19,5 , 24,7 , 530,6 , 556,6 , 2, 1, 1, 6, 7 }, // Catalan/Latin/Italy - { 25, 5, 44, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 166,5 , 166,5 , 171,5 , 171,5 , 394,8 , 402,13 , 209,6 , 215,11 , 1959,21 , 1980,28 , 2008,14 , 1959,21 , 1980,28 , 2008,14 , 58,2 , 55,2 , 293,2 , 5,17 , 22,23 , {67,78,89}, 133,1 , 3122,13 , 4,4 , 13,6 , 562,4 , 566,2 , 2, 1, 7, 6, 7 }, // Chinese/Simplified Han/China - { 25, 5, 97, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 166,5 , 166,5 , 171,5 , 171,5 , 269,6 , 402,13 , 209,6 , 215,11 , 1959,21 , 1980,28 , 2008,14 , 1959,21 , 1980,28 , 2008,14 , 58,2 , 55,2 , 293,2 , 5,17 , 22,23 , {72,75,68}, 134,3 , 3135,11 , 4,4 , 13,6 , 562,4 , 568,9 , 2, 1, 7, 6, 7 }, // Chinese/Simplified Han/Hong Kong - { 25, 5, 126, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 166,5 , 166,5 , 171,5 , 171,5 , 269,6 , 402,13 , 209,6 , 215,11 , 1959,21 , 1980,28 , 2008,14 , 1959,21 , 1980,28 , 2008,14 , 58,2 , 55,2 , 293,2 , 5,17 , 22,23 , {77,79,80}, 137,4 , 3146,13 , 4,4 , 13,6 , 562,4 , 577,9 , 2, 1, 7, 6, 7 }, // Chinese/Simplified Han/Macau - { 25, 5, 190, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 166,5 , 166,5 , 171,5 , 171,5 , 27,8 , 402,13 , 209,6 , 215,11 , 1959,21 , 1980,28 , 2008,14 , 1959,21 , 1980,28 , 2008,14 , 58,2 , 55,2 , 293,2 , 5,17 , 22,23 , {83,71,68}, 6,1 , 3159,15 , 4,4 , 13,6 , 562,4 , 586,3 , 2, 1, 7, 6, 7 }, // Chinese/Simplified Han/Singapore - { 25, 6, 97, 46, 44, 59, 37, 48, 45, 43, 101, 12300, 12301, 12302, 12303, 166,5 , 166,5 , 176,5 , 176,5 , 415,8 , 402,13 , 209,6 , 226,13 , 2022,21 , 1980,28 , 2008,14 , 2022,21 , 1980,28 , 2008,14 , 58,2 , 55,2 , 295,3 , 5,17 , 22,23 , {72,75,68}, 134,3 , 3135,11 , 4,4 , 13,6 , 589,4 , 593,9 , 2, 1, 7, 6, 7 }, // Chinese/Traditional Han/Hong Kong - { 25, 6, 126, 46, 44, 59, 37, 48, 45, 43, 101, 12300, 12301, 12302, 12303, 166,5 , 166,5 , 176,5 , 176,5 , 415,8 , 402,13 , 209,6 , 226,13 , 2022,21 , 1980,28 , 2008,14 , 2022,21 , 1980,28 , 2008,14 , 58,2 , 55,2 , 295,3 , 5,17 , 22,23 , {77,79,80}, 137,4 , 3174,13 , 4,4 , 13,6 , 589,4 , 602,9 , 2, 1, 7, 6, 7 }, // Chinese/Traditional Han/Macau + { 25, 5, 44, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 166,5 , 166,5 , 171,5 , 171,5 , 394,8 , 402,13 , 209,6 , 215,11 , 1959,21 , 1980,28 , 2008,14 , 1959,21 , 1980,28 , 2008,14 , 58,2 , 55,2 , 281,2 , 5,17 , 22,23 , {67,78,89}, 133,1 , 3122,13 , 4,4 , 13,6 , 562,4 , 566,2 , 2, 1, 7, 6, 7 }, // Chinese/Simplified Han/China + { 25, 5, 97, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 166,5 , 166,5 , 171,5 , 171,5 , 269,6 , 402,13 , 209,6 , 215,11 , 1959,21 , 1980,28 , 2008,14 , 1959,21 , 1980,28 , 2008,14 , 58,2 , 55,2 , 281,2 , 5,17 , 22,23 , {72,75,68}, 134,3 , 3135,11 , 4,4 , 13,6 , 562,4 , 568,9 , 2, 1, 7, 6, 7 }, // Chinese/Simplified Han/Hong Kong + { 25, 5, 126, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 166,5 , 166,5 , 171,5 , 171,5 , 269,6 , 402,13 , 209,6 , 215,11 , 1959,21 , 1980,28 , 2008,14 , 1959,21 , 1980,28 , 2008,14 , 58,2 , 55,2 , 281,2 , 5,17 , 22,23 , {77,79,80}, 137,4 , 3146,13 , 4,4 , 13,6 , 562,4 , 577,9 , 2, 1, 7, 6, 7 }, // Chinese/Simplified Han/Macau + { 25, 5, 190, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 166,5 , 166,5 , 171,5 , 171,5 , 27,8 , 402,13 , 209,6 , 215,11 , 1959,21 , 1980,28 , 2008,14 , 1959,21 , 1980,28 , 2008,14 , 58,2 , 55,2 , 281,2 , 5,17 , 22,23 , {83,71,68}, 6,1 , 3159,15 , 4,4 , 13,6 , 562,4 , 586,3 , 2, 1, 7, 6, 7 }, // Chinese/Simplified Han/Singapore + { 25, 6, 97, 46, 44, 59, 37, 48, 45, 43, 101, 12300, 12301, 12302, 12303, 166,5 , 166,5 , 176,5 , 176,5 , 415,8 , 402,13 , 209,6 , 226,13 , 2022,21 , 1980,28 , 2008,14 , 2022,21 , 1980,28 , 2008,14 , 58,2 , 55,2 , 283,3 , 5,17 , 22,23 , {72,75,68}, 134,3 , 3135,11 , 4,4 , 13,6 , 589,4 , 593,9 , 2, 1, 7, 6, 7 }, // Chinese/Traditional Han/Hong Kong + { 25, 6, 126, 46, 44, 59, 37, 48, 45, 43, 101, 12300, 12301, 12302, 12303, 166,5 , 166,5 , 176,5 , 176,5 , 415,8 , 402,13 , 209,6 , 226,13 , 2022,21 , 1980,28 , 2008,14 , 2022,21 , 1980,28 , 2008,14 , 58,2 , 55,2 , 283,3 , 5,17 , 22,23 , {77,79,80}, 137,4 , 3174,13 , 4,4 , 13,6 , 589,4 , 602,9 , 2, 1, 7, 6, 7 }, // Chinese/Traditional Han/Macau { 25, 6, 208, 46, 44, 59, 37, 48, 45, 43, 101, 12300, 12301, 12302, 12303, 166,5 , 166,5 , 171,5 , 171,5 , 394,8 , 423,14 , 209,6 , 226,13 , 2022,21 , 1980,28 , 2008,14 , 2022,21 , 1980,28 , 2008,14 , 58,2 , 55,2 , 45,4 , 5,17 , 22,23 , {84,87,68}, 6,1 , 3187,13 , 4,4 , 13,6 , 589,4 , 611,2 , 2, 0, 7, 6, 7 }, // Chinese/Traditional Han/Taiwan { 26, 7, 74, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {69,85,82}, 14,1 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 1, 6, 7 }, // Corsican/Latin/France - { 27, 7, 54, 44, 46, 59, 37, 48, 8722, 43, 101, 8222, 8220, 8218, 8216, 0,6 , 0,6 , 159,7 , 159,7 , 437,13 , 450,19 , 37,5 , 87,12 , 2043,28 , 2071,58 , 2129,14 , 2043,28 , 2071,58 , 2143,14 , 0,2 , 0,2 , 298,7 , 5,17 , 22,23 , {72,82,75}, 141,3 , 3200,60 , 19,5 , 4,0 , 613,8 , 621,8 , 2, 1, 1, 6, 7 }, // Croatian/Latin/Croatia - { 27, 7, 27, 44, 46, 59, 37, 48, 8722, 43, 101, 8222, 8220, 8218, 8216, 0,6 , 0,6 , 159,7 , 159,7 , 469,9 , 450,19 , 37,5 , 87,12 , 2043,28 , 2071,58 , 2143,14 , 2043,28 , 2071,58 , 2143,14 , 0,2 , 0,2 , 298,7 , 5,17 , 22,23 , {66,65,77}, 144,2 , 3260,85 , 19,5 , 4,0 , 613,8 , 629,19 , 2, 1, 1, 6, 7 }, // Croatian/Latin/Bosnia And Herzegowina - { 28, 7, 57, 44, 160, 59, 37, 48, 45, 43, 101, 8222, 8220, 8218, 8216, 0,6 , 0,6 , 181,7 , 181,7 , 156,8 , 478,17 , 55,4 , 59,9 , 2157,21 , 2178,49 , 2227,14 , 2157,21 , 2178,49 , 2227,14 , 60,4 , 57,4 , 305,5 , 5,17 , 22,23 , {67,90,75}, 146,2 , 3345,68 , 19,5 , 4,0 , 648,7 , 655,5 , 2, 0, 1, 6, 7 }, // Czech/Latin/Czech Republic + { 27, 7, 54, 44, 46, 59, 37, 48, 8722, 43, 101, 8222, 8220, 8218, 8216, 0,6 , 0,6 , 159,7 , 159,7 , 437,13 , 450,19 , 37,5 , 87,12 , 2043,28 , 2071,58 , 2129,14 , 2043,28 , 2071,58 , 2143,14 , 0,2 , 0,2 , 286,7 , 5,17 , 22,23 , {72,82,75}, 141,3 , 3200,60 , 19,5 , 4,0 , 613,8 , 621,8 , 2, 1, 1, 6, 7 }, // Croatian/Latin/Croatia + { 27, 7, 27, 44, 46, 59, 37, 48, 8722, 43, 101, 8222, 8220, 8218, 8216, 0,6 , 0,6 , 159,7 , 159,7 , 469,9 , 450,19 , 37,5 , 87,12 , 2043,28 , 2071,58 , 2143,14 , 2043,28 , 2071,58 , 2143,14 , 0,2 , 0,2 , 286,7 , 5,17 , 22,23 , {66,65,77}, 144,2 , 3260,85 , 19,5 , 4,0 , 613,8 , 629,19 , 2, 1, 1, 6, 7 }, // Croatian/Latin/Bosnia And Herzegowina + { 28, 7, 57, 44, 160, 59, 37, 48, 45, 43, 101, 8222, 8220, 8218, 8216, 0,6 , 0,6 , 181,7 , 181,7 , 156,8 , 478,17 , 55,4 , 59,9 , 2157,21 , 2178,49 , 2227,14 , 2157,21 , 2178,49 , 2227,14 , 60,4 , 57,4 , 293,5 , 5,17 , 22,23 , {67,90,75}, 146,2 , 3345,68 , 19,5 , 4,0 , 648,7 , 655,5 , 2, 0, 1, 6, 7 }, // Czech/Latin/Czech Republic { 29, 7, 58, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 188,8 , 188,8 , 495,10 , 505,23 , 239,5 , 244,10 , 2241,28 , 2269,51 , 2320,14 , 2334,35 , 2269,51 , 2320,14 , 0,2 , 0,2 , 0,5 , 5,17 , 22,23 , {68,75,75}, 148,3 , 3413,42 , 19,5 , 4,0 , 660,5 , 665,7 , 2, 0, 1, 6, 7 }, // Danish/Latin/Denmark { 29, 7, 86, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 188,8 , 188,8 , 495,10 , 505,23 , 239,5 , 244,10 , 2241,28 , 2269,51 , 2320,14 , 2334,35 , 2269,51 , 2320,14 , 0,2 , 0,2 , 0,5 , 5,17 , 22,23 , {68,75,75}, 148,3 , 3413,42 , 19,5 , 4,0 , 660,5 , 672,8 , 2, 0, 1, 6, 7 }, // Danish/Latin/Greenland { 30, 7, 151, 44, 46, 59, 37, 48, 45, 43, 101, 8216, 8217, 8216, 8217, 0,6 , 0,6 , 6,8 , 6,8 , 528,10 , 97,16 , 37,5 , 8,10 , 2369,21 , 2390,59 , 2449,14 , 2369,21 , 2390,59 , 2449,14 , 64,4 , 61,4 , 45,4 , 5,17 , 22,23 , {69,85,82}, 14,1 , 3455,19 , 8,5 , 37,7 , 680,10 , 690,9 , 2, 1, 1, 6, 7 }, // Dutch/Latin/Netherlands @@ -1461,265 +1458,265 @@ static const QLocaleData locale_data[] = { { 31, 7, 256, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 206,9 , 206,9 , 119,10 , 10,17 , 37,5 , 8,10 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {65,78,71}, 155,4 , 6999,95 , 4,4 , 13,6 , 785,7 , 1867,12 , 2, 1, 1, 6, 7 }, // English/Latin/Sint Maarten { 31, 7, 260, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 206,9 , 206,9 , 119,10 , 10,17 , 18,7 , 25,12 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {0,0,0}, 0,0 , 2586,0 , 4,4 , 13,6 , 785,7 , 1879,5 , 2, 1, 1, 6, 7 }, // English/Latin/World { 31, 7, 261, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 206,9 , 206,9 , 119,10 , 10,17 , 37,5 , 8,10 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {0,0,0}, 0,0 , 2586,0 , 19,5 , 4,0 , 785,7 , 1884,6 , 2, 1, 1, 6, 7 }, // English/Latin/Europe - { 32, 7, 260, 44, 160, 59, 37, 48, 8722, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 215,9 , 215,9 , 588,8 , 596,26 , 37,5 , 267,25 , 2523,21 , 2544,51 , 2595,14 , 2523,21 , 2544,51 , 2595,14 , 70,3 , 67,3 , 310,6 , 5,17 , 22,23 , {0,0,0}, 0,0 , 2586,0 , 8,5 , 4,0 , 1890,9 , 1899,5 , 2, 1, 1, 6, 7 }, // Esperanto/Latin/World - { 33, 7, 68, 44, 160, 59, 37, 48, 8722, 43, 101, 8222, 8220, 8218, 8216, 0,6 , 0,6 , 224,8 , 224,8 , 156,8 , 622,18 , 37,5 , 8,10 , 2609,14 , 2623,63 , 2609,14 , 2609,14 , 2623,63 , 2609,14 , 0,2 , 0,2 , 316,6 , 5,17 , 22,23 , {69,85,82}, 14,1 , 7094,20 , 19,5 , 24,7 , 1904,5 , 1909,5 , 2, 1, 1, 6, 7 }, // Estonian/Latin/Estonia - { 34, 7, 71, 44, 46, 59, 37, 48, 8722, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 188,8 , 188,8 , 156,8 , 622,18 , 37,5 , 8,10 , 2686,28 , 2714,74 , 2788,14 , 2802,35 , 2714,74 , 2788,14 , 0,2 , 0,2 , 322,3 , 5,17 , 22,23 , {68,75,75}, 190,2 , 7114,43 , 19,5 , 24,7 , 1914,8 , 1922,7 , 2, 0, 1, 6, 7 }, // Faroese/Latin/Faroe Islands - { 34, 7, 58, 44, 46, 59, 37, 48, 8722, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 188,8 , 188,8 , 156,8 , 622,18 , 37,5 , 8,10 , 2686,28 , 2714,74 , 2788,14 , 2802,35 , 2714,74 , 2788,14 , 0,2 , 0,2 , 322,3 , 5,17 , 22,23 , {68,75,75}, 148,3 , 7114,43 , 19,5 , 24,7 , 1914,8 , 665,7 , 2, 0, 1, 6, 7 }, // Faroese/Latin/Denmark - { 36, 7, 73, 44, 160, 59, 37, 48, 8722, 43, 101, 8221, 8221, 8217, 8217, 0,6 , 0,6 , 224,8 , 224,8 , 640,8 , 478,17 , 254,4 , 258,9 , 2837,21 , 2858,67 , 2925,14 , 2837,21 , 2939,81 , 2925,14 , 73,3 , 70,3 , 325,5 , 330,17 , 347,23 , {69,85,82}, 14,1 , 7157,20 , 19,5 , 4,0 , 1929,5 , 1934,5 , 2, 1, 1, 6, 7 }, // Finnish/Latin/Finland - { 37, 7, 74, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 232,8 , 232,8 , 119,10 , 97,16 , 37,5 , 8,10 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 370,6 , 217,17 , 234,23 , {69,85,82}, 14,1 , 3102,20 , 19,5 , 24,7 , 1939,8 , 1947,6 , 2, 1, 1, 6, 7 }, // French/Latin/France - { 37, 7, 3, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 232,8 , 232,8 , 119,10 , 97,16 , 18,7 , 25,12 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 370,6 , 217,17 , 234,23 , {68,90,68}, 205,2 , 7177,51 , 19,5 , 24,7 , 1939,8 , 1953,7 , 2, 1, 6, 5, 6 }, // French/Latin/Algeria - { 37, 7, 21, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 232,8 , 232,8 , 571,7 , 97,16 , 37,5 , 292,23 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 370,6 , 217,17 , 234,23 , {69,85,82}, 14,1 , 3102,20 , 19,5 , 24,7 , 1939,8 , 1960,8 , 2, 1, 1, 6, 7 }, // French/Latin/Belgium - { 37, 7, 23, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 232,8 , 232,8 , 119,10 , 97,16 , 37,5 , 8,10 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 370,6 , 217,17 , 234,23 , {88,79,70}, 207,3 , 7228,59 , 19,5 , 24,7 , 1939,8 , 1968,5 , 0, 0, 1, 6, 7 }, // French/Latin/Benin - { 37, 7, 34, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 232,8 , 232,8 , 119,10 , 97,16 , 37,5 , 8,10 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 370,6 , 217,17 , 234,23 , {88,79,70}, 207,3 , 7228,59 , 19,5 , 24,7 , 1939,8 , 1973,12 , 0, 0, 1, 6, 7 }, // French/Latin/Burkina Faso - { 37, 7, 35, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 232,8 , 232,8 , 119,10 , 97,16 , 37,5 , 8,10 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 370,6 , 217,17 , 234,23 , {66,73,70}, 163,3 , 7287,53 , 19,5 , 24,7 , 1939,8 , 938,7 , 0, 0, 1, 6, 7 }, // French/Latin/Burundi - { 37, 7, 37, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 232,8 , 232,8 , 119,10 , 97,16 , 37,5 , 8,10 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 76,5 , 73,4 , 370,6 , 217,17 , 234,23 , {88,65,70}, 32,4 , 7340,56 , 19,5 , 24,7 , 1939,8 , 1985,8 , 0, 0, 1, 6, 7 }, // French/Latin/Cameroon - { 37, 7, 38, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8221, 8220, 0,6 , 0,6 , 232,8 , 232,8 , 53,10 , 97,16 , 315,9 , 324,24 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 64,4 , 61,4 , 370,6 , 217,17 , 234,23 , {67,65,68}, 210,4 , 7396,54 , 19,5 , 24,7 , 1993,17 , 969,6 , 2, 0, 7, 6, 7 }, // French/Latin/Canada - { 37, 7, 41, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 232,8 , 232,8 , 119,10 , 97,16 , 37,5 , 8,10 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 370,6 , 217,17 , 234,23 , {88,65,70}, 32,4 , 7340,56 , 19,5 , 24,7 , 1939,8 , 2010,25 , 0, 0, 1, 6, 7 }, // French/Latin/Central African Republic - { 37, 7, 42, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 232,8 , 232,8 , 119,10 , 97,16 , 18,7 , 25,12 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 370,6 , 217,17 , 234,23 , {88,65,70}, 32,4 , 7340,56 , 19,5 , 24,7 , 1939,8 , 2035,5 , 0, 0, 1, 6, 7 }, // French/Latin/Chad - { 37, 7, 48, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 232,8 , 232,8 , 119,10 , 97,16 , 37,5 , 8,10 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 370,6 , 217,17 , 234,23 , {75,77,70}, 36,2 , 7450,51 , 19,5 , 24,7 , 1939,8 , 2040,7 , 0, 0, 1, 6, 7 }, // French/Latin/Comoros - { 37, 7, 49, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 232,8 , 232,8 , 119,10 , 97,16 , 37,5 , 8,10 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 370,6 , 217,17 , 234,23 , {67,68,70}, 214,2 , 7501,53 , 19,5 , 24,7 , 1939,8 , 2047,14 , 2, 1, 1, 6, 7 }, // French/Latin/Congo Kinshasa - { 37, 7, 50, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 232,8 , 232,8 , 119,10 , 97,16 , 37,5 , 8,10 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 370,6 , 217,17 , 234,23 , {88,65,70}, 32,4 , 7340,56 , 19,5 , 24,7 , 1939,8 , 2061,17 , 0, 0, 1, 6, 7 }, // French/Latin/Congo Brazzaville - { 37, 7, 53, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 232,8 , 232,8 , 119,10 , 97,16 , 37,5 , 8,10 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 370,6 , 217,17 , 234,23 , {88,79,70}, 207,3 , 7228,59 , 19,5 , 24,7 , 1939,8 , 2078,13 , 0, 0, 1, 6, 7 }, // French/Latin/Ivory Coast - { 37, 7, 59, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 232,8 , 232,8 , 119,10 , 97,16 , 18,7 , 25,12 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 370,6 , 217,17 , 234,23 , {68,74,70}, 38,3 , 7554,57 , 19,5 , 24,7 , 1939,8 , 2091,8 , 0, 0, 6, 6, 7 }, // French/Latin/Djibouti - { 37, 7, 66, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 232,8 , 232,8 , 119,10 , 97,16 , 37,5 , 8,10 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 370,6 , 217,17 , 234,23 , {88,65,70}, 32,4 , 7340,56 , 19,5 , 24,7 , 1939,8 , 2099,18 , 0, 0, 1, 6, 7 }, // French/Latin/Equatorial Guinea - { 37, 7, 76, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 232,8 , 232,8 , 119,10 , 97,16 , 37,5 , 8,10 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 370,6 , 217,17 , 234,23 , {69,85,82}, 14,1 , 3102,20 , 19,5 , 24,7 , 1939,8 , 2117,16 , 2, 1, 1, 6, 7 }, // French/Latin/French Guiana - { 37, 7, 77, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 232,8 , 232,8 , 119,10 , 97,16 , 37,5 , 8,10 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 370,6 , 217,17 , 234,23 , {88,80,70}, 216,4 , 7611,35 , 19,5 , 24,7 , 1939,8 , 2133,19 , 0, 0, 1, 6, 7 }, // French/Latin/French Polynesia - { 37, 7, 79, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 232,8 , 232,8 , 119,10 , 97,16 , 37,5 , 8,10 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 370,6 , 217,17 , 234,23 , {88,65,70}, 32,4 , 7340,56 , 19,5 , 24,7 , 1939,8 , 2152,5 , 0, 0, 1, 6, 7 }, // French/Latin/Gabon - { 37, 7, 88, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 232,8 , 232,8 , 119,10 , 97,16 , 37,5 , 8,10 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 370,6 , 217,17 , 234,23 , {69,85,82}, 14,1 , 3102,20 , 19,5 , 24,7 , 1939,8 , 2157,10 , 2, 1, 1, 6, 7 }, // French/Latin/Guadeloupe - { 37, 7, 91, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 232,8 , 232,8 , 119,10 , 97,16 , 37,5 , 8,10 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 370,6 , 217,17 , 234,23 , {71,78,70}, 220,2 , 7646,48 , 19,5 , 24,7 , 1939,8 , 2167,6 , 0, 0, 1, 6, 7 }, // French/Latin/Guinea - { 37, 7, 94, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 232,8 , 232,8 , 119,10 , 97,16 , 37,5 , 8,10 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 370,6 , 217,17 , 234,23 , {72,84,71}, 222,1 , 7694,57 , 19,5 , 24,7 , 1939,8 , 2173,5 , 2, 1, 1, 6, 7 }, // French/Latin/Haiti - { 37, 7, 125, 44, 46, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 232,8 , 232,8 , 119,10 , 97,16 , 37,5 , 8,10 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 370,6 , 217,17 , 234,23 , {69,85,82}, 14,1 , 3102,20 , 19,5 , 24,7 , 1939,8 , 2178,10 , 2, 1, 1, 6, 7 }, // French/Latin/Luxembourg - { 37, 7, 128, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 232,8 , 232,8 , 119,10 , 97,16 , 37,5 , 8,10 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 370,6 , 217,17 , 234,23 , {77,71,65}, 170,2 , 7751,54 , 19,5 , 24,7 , 1939,8 , 1233,10 , 0, 0, 1, 6, 7 }, // French/Latin/Madagascar - { 37, 7, 132, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 232,8 , 232,8 , 119,10 , 97,16 , 37,5 , 8,10 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 370,6 , 217,17 , 234,23 , {88,79,70}, 207,3 , 7228,59 , 19,5 , 24,7 , 1939,8 , 2188,4 , 0, 0, 1, 6, 7 }, // French/Latin/Mali - { 37, 7, 135, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 232,8 , 232,8 , 119,10 , 97,16 , 37,5 , 8,10 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 370,6 , 217,17 , 234,23 , {69,85,82}, 14,1 , 3102,20 , 19,5 , 24,7 , 1939,8 , 2192,10 , 2, 1, 1, 6, 7 }, // French/Latin/Martinique - { 37, 7, 136, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 232,8 , 232,8 , 119,10 , 97,16 , 18,7 , 25,12 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 370,6 , 217,17 , 234,23 , {77,82,85}, 223,2 , 7805,66 , 19,5 , 24,7 , 1939,8 , 2202,10 , 2, 1, 1, 6, 7 }, // French/Latin/Mauritania - { 37, 7, 137, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 232,8 , 232,8 , 119,10 , 97,16 , 37,5 , 8,10 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 370,6 , 217,17 , 234,23 , {77,85,82}, 176,2 , 7871,63 , 19,5 , 24,7 , 1939,8 , 2212,7 , 2, 0, 1, 6, 7 }, // French/Latin/Mauritius - { 37, 7, 138, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 232,8 , 232,8 , 119,10 , 97,16 , 37,5 , 8,10 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 370,6 , 217,17 , 234,23 , {69,85,82}, 14,1 , 3102,20 , 19,5 , 24,7 , 1939,8 , 2219,7 , 2, 1, 1, 6, 7 }, // French/Latin/Mayotte - { 37, 7, 142, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 232,8 , 232,8 , 119,10 , 97,16 , 37,5 , 8,10 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 370,6 , 217,17 , 234,23 , {69,85,82}, 14,1 , 3102,20 , 19,5 , 24,7 , 1939,8 , 2226,6 , 2, 1, 1, 6, 7 }, // French/Latin/Monaco - { 37, 7, 145, 44, 46, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 232,8 , 232,8 , 119,10 , 97,16 , 37,5 , 8,10 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 64,4 , 61,4 , 370,6 , 217,17 , 234,23 , {77,65,68}, 225,3 , 7934,54 , 19,5 , 24,7 , 1939,8 , 2232,5 , 2, 1, 1, 6, 7 }, // French/Latin/Morocco - { 37, 7, 153, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 232,8 , 232,8 , 119,10 , 97,16 , 37,5 , 8,10 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 370,6 , 217,17 , 234,23 , {88,80,70}, 216,4 , 7611,35 , 19,5 , 24,7 , 1939,8 , 2237,18 , 0, 0, 1, 6, 7 }, // French/Latin/New Caledonia - { 37, 7, 156, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 232,8 , 232,8 , 119,10 , 97,16 , 37,5 , 8,10 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 370,6 , 217,17 , 234,23 , {88,79,70}, 207,3 , 7228,59 , 19,5 , 24,7 , 1939,8 , 2255,5 , 0, 0, 1, 6, 7 }, // French/Latin/Niger - { 37, 7, 176, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 232,8 , 232,8 , 119,10 , 97,16 , 37,5 , 8,10 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 370,6 , 217,17 , 234,23 , {69,85,82}, 14,1 , 3102,20 , 19,5 , 24,7 , 1939,8 , 2260,10 , 2, 1, 1, 6, 7 }, // French/Latin/Reunion - { 37, 7, 179, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 232,8 , 232,8 , 119,10 , 97,16 , 37,5 , 8,10 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 370,6 , 217,17 , 234,23 , {82,87,70}, 180,2 , 7988,50 , 19,5 , 24,7 , 1939,8 , 1457,6 , 0, 0, 1, 6, 7 }, // French/Latin/Rwanda - { 37, 7, 187, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 232,8 , 232,8 , 119,10 , 97,16 , 37,5 , 8,10 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 370,6 , 217,17 , 234,23 , {88,79,70}, 207,3 , 7228,59 , 19,5 , 24,7 , 1939,8 , 2270,7 , 0, 0, 1, 6, 7 }, // French/Latin/Senegal - { 37, 7, 188, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 232,8 , 232,8 , 119,10 , 97,16 , 37,5 , 8,10 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 370,6 , 217,17 , 234,23 , {83,67,82}, 185,2 , 8038,71 , 19,5 , 24,7 , 1939,8 , 1518,10 , 2, 1, 1, 6, 7 }, // French/Latin/Seychelles - { 37, 7, 200, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 232,8 , 232,8 , 119,10 , 97,16 , 37,5 , 8,10 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 370,6 , 217,17 , 234,23 , {69,85,82}, 14,1 , 3102,20 , 19,5 , 24,7 , 1939,8 , 2277,24 , 2, 1, 1, 6, 7 }, // French/Latin/Saint Pierre And Miquelon - { 37, 7, 206, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 8249, 8250, 0,6 , 0,6 , 232,8 , 232,8 , 156,8 , 10,17 , 37,5 , 348,14 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 370,6 , 217,17 , 234,23 , {67,72,70}, 228,3 , 8109,45 , 19,5 , 24,7 , 2301,15 , 2316,6 , 2, 0, 1, 6, 7 }, // French/Latin/Switzerland - { 37, 7, 207, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 232,8 , 232,8 , 119,10 , 97,16 , 18,7 , 25,12 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 370,6 , 217,17 , 234,23 , {83,89,80}, 231,2 , 8154,51 , 19,5 , 24,7 , 1939,8 , 2322,5 , 0, 0, 6, 5, 6 }, // French/Latin/Syria - { 37, 7, 212, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 232,8 , 232,8 , 119,10 , 97,16 , 37,5 , 8,10 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 370,6 , 217,17 , 234,23 , {88,79,70}, 207,3 , 7228,59 , 19,5 , 24,7 , 1939,8 , 2327,4 , 0, 0, 1, 6, 7 }, // French/Latin/Togo - { 37, 7, 216, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 232,8 , 232,8 , 119,10 , 97,16 , 18,7 , 25,12 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 370,6 , 217,17 , 234,23 , {84,78,68}, 233,2 , 8205,51 , 19,5 , 24,7 , 1939,8 , 2331,7 , 3, 0, 1, 6, 7 }, // French/Latin/Tunisia - { 37, 7, 229, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 232,8 , 232,8 , 119,10 , 97,16 , 18,7 , 25,12 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 370,6 , 217,17 , 234,23 , {86,85,86}, 203,2 , 8256,51 , 19,5 , 24,7 , 1939,8 , 1765,7 , 0, 0, 1, 6, 7 }, // French/Latin/Vanuatu - { 37, 7, 235, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 232,8 , 232,8 , 119,10 , 97,16 , 37,5 , 8,10 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 370,6 , 217,17 , 234,23 , {88,80,70}, 216,4 , 7611,35 , 19,5 , 24,7 , 1939,8 , 2338,16 , 0, 0, 1, 6, 7 }, // French/Latin/Wallis And Futuna Islands - { 37, 7, 244, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 232,8 , 232,8 , 119,10 , 97,16 , 37,5 , 8,10 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 370,6 , 217,17 , 234,23 , {69,85,82}, 14,1 , 3102,20 , 19,5 , 24,7 , 1939,8 , 2354,16 , 2, 1, 1, 6, 7 }, // French/Latin/Saint Barthelemy - { 37, 7, 245, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 232,8 , 232,8 , 119,10 , 97,16 , 37,5 , 8,10 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 370,6 , 217,17 , 234,23 , {69,85,82}, 14,1 , 3102,20 , 19,5 , 24,7 , 1939,8 , 2370,12 , 2, 1, 1, 6, 7 }, // French/Latin/Saint Martin + { 32, 7, 260, 44, 160, 59, 37, 48, 8722, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 215,9 , 215,9 , 588,8 , 596,26 , 37,5 , 267,25 , 2523,21 , 2544,51 , 2595,14 , 2523,21 , 2544,51 , 2595,14 , 70,3 , 67,3 , 298,6 , 5,17 , 22,23 , {0,0,0}, 0,0 , 2586,0 , 8,5 , 4,0 , 1890,9 , 1899,5 , 2, 1, 1, 6, 7 }, // Esperanto/Latin/World + { 33, 7, 68, 44, 160, 59, 37, 48, 8722, 43, 101, 8222, 8220, 8218, 8216, 0,6 , 0,6 , 224,8 , 224,8 , 156,8 , 622,18 , 37,5 , 8,10 , 2609,14 , 2623,63 , 2609,14 , 2609,14 , 2623,63 , 2609,14 , 0,2 , 0,2 , 304,6 , 5,17 , 22,23 , {69,85,82}, 14,1 , 7094,20 , 19,5 , 24,7 , 1904,5 , 1909,5 , 2, 1, 1, 6, 7 }, // Estonian/Latin/Estonia + { 34, 7, 71, 44, 46, 59, 37, 48, 8722, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 188,8 , 188,8 , 156,8 , 622,18 , 37,5 , 8,10 , 2686,28 , 2714,74 , 2788,14 , 2802,35 , 2714,74 , 2788,14 , 0,2 , 0,2 , 310,3 , 5,17 , 22,23 , {68,75,75}, 190,2 , 7114,43 , 19,5 , 24,7 , 1914,8 , 1922,7 , 2, 0, 1, 6, 7 }, // Faroese/Latin/Faroe Islands + { 34, 7, 58, 44, 46, 59, 37, 48, 8722, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 188,8 , 188,8 , 156,8 , 622,18 , 37,5 , 8,10 , 2686,28 , 2714,74 , 2788,14 , 2802,35 , 2714,74 , 2788,14 , 0,2 , 0,2 , 310,3 , 5,17 , 22,23 , {68,75,75}, 148,3 , 7114,43 , 19,5 , 24,7 , 1914,8 , 665,7 , 2, 0, 1, 6, 7 }, // Faroese/Latin/Denmark + { 36, 7, 73, 44, 160, 59, 37, 48, 8722, 43, 101, 8221, 8221, 8217, 8217, 0,6 , 0,6 , 224,8 , 224,8 , 640,8 , 478,17 , 254,4 , 258,9 , 2837,21 , 2858,67 , 2925,14 , 2837,21 , 2939,81 , 2925,14 , 73,3 , 70,3 , 313,5 , 318,17 , 335,23 , {69,85,82}, 14,1 , 7157,20 , 19,5 , 4,0 , 1929,5 , 1934,5 , 2, 1, 1, 6, 7 }, // Finnish/Latin/Finland + { 37, 7, 74, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 232,8 , 232,8 , 119,10 , 97,16 , 37,5 , 8,10 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 358,6 , 205,17 , 222,23 , {69,85,82}, 14,1 , 3102,20 , 19,5 , 24,7 , 1939,8 , 1947,6 , 2, 1, 1, 6, 7 }, // French/Latin/France + { 37, 7, 3, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 232,8 , 232,8 , 119,10 , 97,16 , 18,7 , 25,12 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 358,6 , 205,17 , 222,23 , {68,90,68}, 205,2 , 7177,51 , 19,5 , 24,7 , 1939,8 , 1953,7 , 2, 1, 6, 5, 6 }, // French/Latin/Algeria + { 37, 7, 21, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 232,8 , 232,8 , 571,7 , 97,16 , 37,5 , 292,23 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 358,6 , 205,17 , 222,23 , {69,85,82}, 14,1 , 3102,20 , 19,5 , 24,7 , 1939,8 , 1960,8 , 2, 1, 1, 6, 7 }, // French/Latin/Belgium + { 37, 7, 23, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 232,8 , 232,8 , 119,10 , 97,16 , 37,5 , 8,10 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 358,6 , 205,17 , 222,23 , {88,79,70}, 207,5 , 7228,59 , 19,5 , 24,7 , 1939,8 , 1968,5 , 0, 0, 1, 6, 7 }, // French/Latin/Benin + { 37, 7, 34, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 232,8 , 232,8 , 119,10 , 97,16 , 37,5 , 8,10 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 358,6 , 205,17 , 222,23 , {88,79,70}, 207,5 , 7228,59 , 19,5 , 24,7 , 1939,8 , 1973,12 , 0, 0, 1, 6, 7 }, // French/Latin/Burkina Faso + { 37, 7, 35, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 232,8 , 232,8 , 119,10 , 97,16 , 37,5 , 8,10 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 358,6 , 205,17 , 222,23 , {66,73,70}, 163,3 , 7287,53 , 19,5 , 24,7 , 1939,8 , 938,7 , 0, 0, 1, 6, 7 }, // French/Latin/Burundi + { 37, 7, 37, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 232,8 , 232,8 , 119,10 , 97,16 , 37,5 , 8,10 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 76,5 , 73,4 , 358,6 , 205,17 , 222,23 , {88,65,70}, 32,4 , 7340,56 , 19,5 , 24,7 , 1939,8 , 1985,8 , 0, 0, 1, 6, 7 }, // French/Latin/Cameroon + { 37, 7, 38, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8221, 8220, 0,6 , 0,6 , 232,8 , 232,8 , 53,10 , 97,16 , 315,9 , 324,24 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 64,4 , 61,4 , 358,6 , 205,17 , 222,23 , {67,65,68}, 212,4 , 7396,54 , 19,5 , 24,7 , 1993,17 , 969,6 , 2, 0, 7, 6, 7 }, // French/Latin/Canada + { 37, 7, 41, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 232,8 , 232,8 , 119,10 , 97,16 , 37,5 , 8,10 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 358,6 , 205,17 , 222,23 , {88,65,70}, 32,4 , 7340,56 , 19,5 , 24,7 , 1939,8 , 2010,25 , 0, 0, 1, 6, 7 }, // French/Latin/Central African Republic + { 37, 7, 42, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 232,8 , 232,8 , 119,10 , 97,16 , 18,7 , 25,12 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 358,6 , 205,17 , 222,23 , {88,65,70}, 32,4 , 7340,56 , 19,5 , 24,7 , 1939,8 , 2035,5 , 0, 0, 1, 6, 7 }, // French/Latin/Chad + { 37, 7, 48, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 232,8 , 232,8 , 119,10 , 97,16 , 37,5 , 8,10 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 358,6 , 205,17 , 222,23 , {75,77,70}, 36,2 , 7450,51 , 19,5 , 24,7 , 1939,8 , 2040,7 , 0, 0, 1, 6, 7 }, // French/Latin/Comoros + { 37, 7, 49, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 232,8 , 232,8 , 119,10 , 97,16 , 37,5 , 8,10 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 358,6 , 205,17 , 222,23 , {67,68,70}, 216,2 , 7501,53 , 19,5 , 24,7 , 1939,8 , 2047,14 , 2, 1, 1, 6, 7 }, // French/Latin/Congo Kinshasa + { 37, 7, 50, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 232,8 , 232,8 , 119,10 , 97,16 , 37,5 , 8,10 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 358,6 , 205,17 , 222,23 , {88,65,70}, 32,4 , 7340,56 , 19,5 , 24,7 , 1939,8 , 2061,17 , 0, 0, 1, 6, 7 }, // French/Latin/Congo Brazzaville + { 37, 7, 53, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 232,8 , 232,8 , 119,10 , 97,16 , 37,5 , 8,10 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 358,6 , 205,17 , 222,23 , {88,79,70}, 207,5 , 7228,59 , 19,5 , 24,7 , 1939,8 , 2078,13 , 0, 0, 1, 6, 7 }, // French/Latin/Ivory Coast + { 37, 7, 59, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 232,8 , 232,8 , 119,10 , 97,16 , 18,7 , 25,12 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 358,6 , 205,17 , 222,23 , {68,74,70}, 38,3 , 7554,57 , 19,5 , 24,7 , 1939,8 , 2091,8 , 0, 0, 6, 6, 7 }, // French/Latin/Djibouti + { 37, 7, 66, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 232,8 , 232,8 , 119,10 , 97,16 , 37,5 , 8,10 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 358,6 , 205,17 , 222,23 , {88,65,70}, 32,4 , 7340,56 , 19,5 , 24,7 , 1939,8 , 2099,18 , 0, 0, 1, 6, 7 }, // French/Latin/Equatorial Guinea + { 37, 7, 76, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 232,8 , 232,8 , 119,10 , 97,16 , 37,5 , 8,10 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 358,6 , 205,17 , 222,23 , {69,85,82}, 14,1 , 3102,20 , 19,5 , 24,7 , 1939,8 , 2117,16 , 2, 1, 1, 6, 7 }, // French/Latin/French Guiana + { 37, 7, 77, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 232,8 , 232,8 , 119,10 , 97,16 , 37,5 , 8,10 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 358,6 , 205,17 , 222,23 , {88,80,70}, 218,4 , 7611,35 , 19,5 , 24,7 , 1939,8 , 2133,19 , 0, 0, 1, 6, 7 }, // French/Latin/French Polynesia + { 37, 7, 79, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 232,8 , 232,8 , 119,10 , 97,16 , 37,5 , 8,10 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 358,6 , 205,17 , 222,23 , {88,65,70}, 32,4 , 7340,56 , 19,5 , 24,7 , 1939,8 , 2152,5 , 0, 0, 1, 6, 7 }, // French/Latin/Gabon + { 37, 7, 88, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 232,8 , 232,8 , 119,10 , 97,16 , 37,5 , 8,10 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 358,6 , 205,17 , 222,23 , {69,85,82}, 14,1 , 3102,20 , 19,5 , 24,7 , 1939,8 , 2157,10 , 2, 1, 1, 6, 7 }, // French/Latin/Guadeloupe + { 37, 7, 91, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 232,8 , 232,8 , 119,10 , 97,16 , 37,5 , 8,10 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 358,6 , 205,17 , 222,23 , {71,78,70}, 222,2 , 7646,48 , 19,5 , 24,7 , 1939,8 , 2167,6 , 0, 0, 1, 6, 7 }, // French/Latin/Guinea + { 37, 7, 94, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 232,8 , 232,8 , 119,10 , 97,16 , 37,5 , 8,10 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 358,6 , 205,17 , 222,23 , {72,84,71}, 224,1 , 7694,57 , 19,5 , 24,7 , 1939,8 , 2173,5 , 2, 1, 1, 6, 7 }, // French/Latin/Haiti + { 37, 7, 125, 44, 46, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 232,8 , 232,8 , 119,10 , 97,16 , 37,5 , 8,10 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 358,6 , 205,17 , 222,23 , {69,85,82}, 14,1 , 3102,20 , 19,5 , 24,7 , 1939,8 , 2178,10 , 2, 1, 1, 6, 7 }, // French/Latin/Luxembourg + { 37, 7, 128, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 232,8 , 232,8 , 119,10 , 97,16 , 37,5 , 8,10 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 358,6 , 205,17 , 222,23 , {77,71,65}, 170,2 , 7751,54 , 19,5 , 24,7 , 1939,8 , 1233,10 , 0, 0, 1, 6, 7 }, // French/Latin/Madagascar + { 37, 7, 132, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 232,8 , 232,8 , 119,10 , 97,16 , 37,5 , 8,10 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 358,6 , 205,17 , 222,23 , {88,79,70}, 207,5 , 7228,59 , 19,5 , 24,7 , 1939,8 , 2188,4 , 0, 0, 1, 6, 7 }, // French/Latin/Mali + { 37, 7, 135, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 232,8 , 232,8 , 119,10 , 97,16 , 37,5 , 8,10 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 358,6 , 205,17 , 222,23 , {69,85,82}, 14,1 , 3102,20 , 19,5 , 24,7 , 1939,8 , 2192,10 , 2, 1, 1, 6, 7 }, // French/Latin/Martinique + { 37, 7, 136, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 232,8 , 232,8 , 119,10 , 97,16 , 18,7 , 25,12 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 358,6 , 205,17 , 222,23 , {77,82,85}, 225,2 , 7805,66 , 19,5 , 24,7 , 1939,8 , 2202,10 , 2, 1, 1, 6, 7 }, // French/Latin/Mauritania + { 37, 7, 137, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 232,8 , 232,8 , 119,10 , 97,16 , 37,5 , 8,10 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 358,6 , 205,17 , 222,23 , {77,85,82}, 176,2 , 7871,63 , 19,5 , 24,7 , 1939,8 , 2212,7 , 2, 0, 1, 6, 7 }, // French/Latin/Mauritius + { 37, 7, 138, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 232,8 , 232,8 , 119,10 , 97,16 , 37,5 , 8,10 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 358,6 , 205,17 , 222,23 , {69,85,82}, 14,1 , 3102,20 , 19,5 , 24,7 , 1939,8 , 2219,7 , 2, 1, 1, 6, 7 }, // French/Latin/Mayotte + { 37, 7, 142, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 232,8 , 232,8 , 119,10 , 97,16 , 37,5 , 8,10 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 358,6 , 205,17 , 222,23 , {69,85,82}, 14,1 , 3102,20 , 19,5 , 24,7 , 1939,8 , 2226,6 , 2, 1, 1, 6, 7 }, // French/Latin/Monaco + { 37, 7, 145, 44, 46, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 232,8 , 232,8 , 119,10 , 97,16 , 37,5 , 8,10 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 64,4 , 61,4 , 358,6 , 205,17 , 222,23 , {77,65,68}, 227,3 , 7934,54 , 19,5 , 24,7 , 1939,8 , 2232,5 , 2, 1, 1, 6, 7 }, // French/Latin/Morocco + { 37, 7, 153, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 232,8 , 232,8 , 119,10 , 97,16 , 37,5 , 8,10 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 358,6 , 205,17 , 222,23 , {88,80,70}, 218,4 , 7611,35 , 19,5 , 24,7 , 1939,8 , 2237,18 , 0, 0, 1, 6, 7 }, // French/Latin/New Caledonia + { 37, 7, 156, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 232,8 , 232,8 , 119,10 , 97,16 , 37,5 , 8,10 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 358,6 , 205,17 , 222,23 , {88,79,70}, 207,5 , 7228,59 , 19,5 , 24,7 , 1939,8 , 2255,5 , 0, 0, 1, 6, 7 }, // French/Latin/Niger + { 37, 7, 176, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 232,8 , 232,8 , 119,10 , 97,16 , 37,5 , 8,10 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 358,6 , 205,17 , 222,23 , {69,85,82}, 14,1 , 3102,20 , 19,5 , 24,7 , 1939,8 , 2260,10 , 2, 1, 1, 6, 7 }, // French/Latin/Reunion + { 37, 7, 179, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 232,8 , 232,8 , 119,10 , 97,16 , 37,5 , 8,10 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 358,6 , 205,17 , 222,23 , {82,87,70}, 180,2 , 7988,50 , 19,5 , 24,7 , 1939,8 , 1457,6 , 0, 0, 1, 6, 7 }, // French/Latin/Rwanda + { 37, 7, 187, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 232,8 , 232,8 , 119,10 , 97,16 , 37,5 , 8,10 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 358,6 , 205,17 , 222,23 , {88,79,70}, 207,5 , 7228,59 , 19,5 , 24,7 , 1939,8 , 2270,7 , 0, 0, 1, 6, 7 }, // French/Latin/Senegal + { 37, 7, 188, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 232,8 , 232,8 , 119,10 , 97,16 , 37,5 , 8,10 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 358,6 , 205,17 , 222,23 , {83,67,82}, 185,2 , 8038,71 , 19,5 , 24,7 , 1939,8 , 1518,10 , 2, 1, 1, 6, 7 }, // French/Latin/Seychelles + { 37, 7, 200, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 232,8 , 232,8 , 119,10 , 97,16 , 37,5 , 8,10 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 358,6 , 205,17 , 222,23 , {69,85,82}, 14,1 , 3102,20 , 19,5 , 24,7 , 1939,8 , 2277,24 , 2, 1, 1, 6, 7 }, // French/Latin/Saint Pierre And Miquelon + { 37, 7, 206, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 8249, 8250, 0,6 , 0,6 , 232,8 , 232,8 , 156,8 , 10,17 , 37,5 , 348,14 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 358,6 , 205,17 , 222,23 , {67,72,70}, 230,3 , 8109,45 , 19,5 , 24,7 , 2301,15 , 2316,6 , 2, 0, 1, 6, 7 }, // French/Latin/Switzerland + { 37, 7, 207, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 232,8 , 232,8 , 119,10 , 97,16 , 18,7 , 25,12 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 358,6 , 205,17 , 222,23 , {83,89,80}, 233,2 , 8154,51 , 19,5 , 24,7 , 1939,8 , 2322,5 , 0, 0, 6, 5, 6 }, // French/Latin/Syria + { 37, 7, 212, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 232,8 , 232,8 , 119,10 , 97,16 , 37,5 , 8,10 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 358,6 , 205,17 , 222,23 , {88,79,70}, 207,5 , 7228,59 , 19,5 , 24,7 , 1939,8 , 2327,4 , 0, 0, 1, 6, 7 }, // French/Latin/Togo + { 37, 7, 216, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 232,8 , 232,8 , 119,10 , 97,16 , 18,7 , 25,12 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 358,6 , 205,17 , 222,23 , {84,78,68}, 235,2 , 8205,51 , 19,5 , 24,7 , 1939,8 , 2331,7 , 3, 0, 1, 6, 7 }, // French/Latin/Tunisia + { 37, 7, 229, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 232,8 , 232,8 , 119,10 , 97,16 , 18,7 , 25,12 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 358,6 , 205,17 , 222,23 , {86,85,86}, 203,2 , 8256,51 , 19,5 , 24,7 , 1939,8 , 1765,7 , 0, 0, 1, 6, 7 }, // French/Latin/Vanuatu + { 37, 7, 235, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 232,8 , 232,8 , 119,10 , 97,16 , 37,5 , 8,10 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 358,6 , 205,17 , 222,23 , {88,80,70}, 218,4 , 7611,35 , 19,5 , 24,7 , 1939,8 , 2338,16 , 0, 0, 1, 6, 7 }, // French/Latin/Wallis And Futuna Islands + { 37, 7, 244, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 232,8 , 232,8 , 119,10 , 97,16 , 37,5 , 8,10 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 358,6 , 205,17 , 222,23 , {69,85,82}, 14,1 , 3102,20 , 19,5 , 24,7 , 1939,8 , 2354,16 , 2, 1, 1, 6, 7 }, // French/Latin/Saint Barthelemy + { 37, 7, 245, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 232,8 , 232,8 , 119,10 , 97,16 , 37,5 , 8,10 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 358,6 , 205,17 , 222,23 , {69,85,82}, 14,1 , 3102,20 , 19,5 , 24,7 , 1939,8 , 2370,12 , 2, 1, 1, 6, 7 }, // French/Latin/Saint Martin { 38, 7, 151, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 6,8 , 6,8 , 339,8 , 97,16 , 37,5 , 8,10 , 3121,21 , 3142,54 , 85,14 , 3121,21 , 3142,54 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {69,85,82}, 14,1 , 3455,19 , 8,5 , 37,7 , 2382,5 , 2387,8 , 2, 1, 1, 6, 7 }, // Western Frisian/Latin/Netherlands - { 39, 7, 224, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 240,10 , 240,10 , 119,10 , 648,21 , 37,5 , 8,10 , 3196,28 , 3224,69 , 3293,14 , 3196,28 , 3224,69 , 3293,14 , 81,1 , 77,1 , 376,6 , 5,17 , 22,23 , {71,66,80}, 119,1 , 8307,86 , 4,4 , 13,6 , 2395,8 , 2403,22 , 2, 1, 1, 6, 7 }, // Gaelic/Latin/United Kingdom + { 39, 7, 224, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 240,10 , 240,10 , 119,10 , 648,21 , 37,5 , 8,10 , 3196,28 , 3224,69 , 3293,14 , 3196,28 , 3224,69 , 3293,14 , 81,1 , 77,1 , 364,6 , 5,17 , 22,23 , {71,66,80}, 119,1 , 8307,86 , 4,4 , 13,6 , 2395,8 , 2403,22 , 2, 1, 1, 6, 7 }, // Gaelic/Latin/United Kingdom { 40, 7, 197, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 250,7 , 250,7 , 27,8 , 669,27 , 37,5 , 8,10 , 3307,35 , 3342,49 , 3391,14 , 3405,35 , 3440,49 , 3489,21 , 64,4 , 61,4 , 0,5 , 5,17 , 22,23 , {69,85,82}, 14,1 , 3102,20 , 19,5 , 4,0 , 2425,6 , 2431,6 , 2, 1, 1, 6, 7 }, // Galician/Latin/Spain - { 41, 15, 81, 44, 160, 59, 37, 48, 45, 43, 101, 8222, 8220, 171, 187, 0,6 , 0,6 , 257,8 , 257,8 , 156,8 , 696,19 , 37,5 , 8,10 , 3510,28 , 3538,62 , 3600,14 , 3510,28 , 3538,62 , 3600,14 , 0,2 , 0,2 , 382,5 , 387,37 , 22,23 , {71,69,76}, 235,1 , 8393,43 , 19,5 , 4,0 , 2437,7 , 2444,10 , 2, 1, 1, 6, 7 }, // Georgian/Georgian/Georgia - { 42, 7, 82, 44, 46, 59, 37, 48, 45, 43, 101, 8222, 8220, 8218, 8216, 0,6 , 0,6 , 265,9 , 265,9 , 156,8 , 622,18 , 37,5 , 8,10 , 3614,21 , 3635,60 , 3695,14 , 3709,28 , 3635,60 , 3695,14 , 0,2 , 0,2 , 424,5 , 5,17 , 22,23 , {69,85,82}, 14,1 , 8436,19 , 19,5 , 4,0 , 2454,7 , 2461,11 , 2, 1, 1, 6, 7 }, // German/Latin/Germany - { 42, 7, 14, 44, 160, 59, 37, 48, 45, 43, 101, 8222, 8220, 8218, 8216, 0,6 , 0,6 , 265,9 , 265,9 , 156,8 , 622,18 , 37,5 , 8,10 , 3614,21 , 3635,60 , 3695,14 , 3709,28 , 3635,60 , 3695,14 , 0,2 , 0,2 , 424,5 , 5,17 , 22,23 , {69,85,82}, 14,1 , 8436,19 , 19,5 , 4,0 , 2472,24 , 2496,10 , 2, 1, 1, 6, 7 }, // German/Latin/Austria - { 42, 7, 21, 44, 46, 59, 37, 48, 45, 43, 101, 8222, 8220, 8218, 8216, 0,6 , 0,6 , 265,9 , 265,9 , 156,8 , 622,18 , 37,5 , 8,10 , 3614,21 , 3635,60 , 3695,14 , 3709,28 , 3635,60 , 3695,14 , 0,2 , 0,2 , 424,5 , 5,17 , 22,23 , {69,85,82}, 14,1 , 8436,19 , 19,5 , 4,0 , 2454,7 , 2506,7 , 2, 1, 1, 6, 7 }, // German/Latin/Belgium - { 42, 7, 106, 44, 46, 59, 37, 48, 45, 43, 101, 8222, 8220, 8218, 8216, 0,6 , 0,6 , 265,9 , 265,9 , 156,8 , 622,18 , 37,5 , 8,10 , 3614,21 , 3635,60 , 3695,14 , 3709,28 , 3635,60 , 3695,14 , 0,2 , 0,2 , 424,5 , 5,17 , 22,23 , {69,85,82}, 14,1 , 8436,19 , 19,5 , 4,0 , 2454,7 , 2513,7 , 2, 1, 1, 6, 7 }, // German/Latin/Italy - { 42, 7, 123, 46, 8217, 59, 37, 48, 45, 43, 101, 8222, 8220, 8218, 8216, 0,6 , 0,6 , 265,9 , 265,9 , 156,8 , 622,18 , 37,5 , 8,10 , 3614,21 , 3635,60 , 3695,14 , 3709,28 , 3635,60 , 3695,14 , 0,2 , 0,2 , 424,5 , 5,17 , 22,23 , {67,72,70}, 228,3 , 8455,58 , 19,5 , 4,0 , 2454,7 , 2520,13 , 2, 0, 1, 6, 7 }, // German/Latin/Liechtenstein - { 42, 7, 125, 44, 46, 59, 37, 48, 45, 43, 101, 8222, 8220, 8218, 8216, 0,6 , 0,6 , 265,9 , 265,9 , 156,8 , 622,18 , 37,5 , 8,10 , 3614,21 , 3635,60 , 3695,14 , 3709,28 , 3635,60 , 3695,14 , 0,2 , 0,2 , 424,5 , 5,17 , 22,23 , {69,85,82}, 14,1 , 8436,19 , 19,5 , 4,0 , 2454,7 , 2533,9 , 2, 1, 1, 6, 7 }, // German/Latin/Luxembourg - { 42, 7, 206, 46, 8217, 59, 37, 48, 45, 43, 101, 8222, 8220, 8218, 8216, 0,6 , 0,6 , 265,9 , 265,9 , 156,8 , 622,18 , 37,5 , 8,10 , 3614,21 , 3635,60 , 3695,14 , 3709,28 , 3635,60 , 3695,14 , 0,2 , 0,2 , 424,5 , 5,17 , 22,23 , {67,72,70}, 228,3 , 8455,58 , 19,5 , 4,0 , 2542,21 , 2563,7 , 2, 0, 1, 6, 7 }, // German/Latin/Switzerland + { 41, 15, 81, 44, 160, 59, 37, 48, 45, 43, 101, 8222, 8220, 171, 187, 0,6 , 0,6 , 257,8 , 257,8 , 156,8 , 696,19 , 37,5 , 8,10 , 3510,28 , 3538,62 , 3600,14 , 3510,28 , 3538,62 , 3600,14 , 0,2 , 0,2 , 370,5 , 375,29 , 22,23 , {71,69,76}, 237,1 , 8393,43 , 19,5 , 4,0 , 2437,7 , 2444,10 , 2, 1, 1, 6, 7 }, // Georgian/Georgian/Georgia + { 42, 7, 82, 44, 46, 59, 37, 48, 45, 43, 101, 8222, 8220, 8218, 8216, 0,6 , 0,6 , 265,9 , 265,9 , 156,8 , 622,18 , 37,5 , 8,10 , 3614,21 , 3635,60 , 3695,14 , 3709,28 , 3635,60 , 3695,14 , 0,2 , 0,2 , 404,5 , 5,17 , 22,23 , {69,85,82}, 14,1 , 8436,19 , 19,5 , 4,0 , 2454,7 , 2461,11 , 2, 1, 1, 6, 7 }, // German/Latin/Germany + { 42, 7, 14, 44, 160, 59, 37, 48, 45, 43, 101, 8222, 8220, 8218, 8216, 0,6 , 0,6 , 265,9 , 265,9 , 156,8 , 622,18 , 37,5 , 8,10 , 3614,21 , 3635,60 , 3695,14 , 3709,28 , 3635,60 , 3695,14 , 0,2 , 0,2 , 404,5 , 5,17 , 22,23 , {69,85,82}, 14,1 , 8436,19 , 19,5 , 4,0 , 2472,24 , 2496,10 , 2, 1, 1, 6, 7 }, // German/Latin/Austria + { 42, 7, 21, 44, 46, 59, 37, 48, 45, 43, 101, 8222, 8220, 8218, 8216, 0,6 , 0,6 , 265,9 , 265,9 , 156,8 , 622,18 , 37,5 , 8,10 , 3614,21 , 3635,60 , 3695,14 , 3709,28 , 3635,60 , 3695,14 , 0,2 , 0,2 , 404,5 , 5,17 , 22,23 , {69,85,82}, 14,1 , 8436,19 , 19,5 , 4,0 , 2454,7 , 2506,7 , 2, 1, 1, 6, 7 }, // German/Latin/Belgium + { 42, 7, 106, 44, 46, 59, 37, 48, 45, 43, 101, 8222, 8220, 8218, 8216, 0,6 , 0,6 , 265,9 , 265,9 , 156,8 , 622,18 , 37,5 , 8,10 , 3614,21 , 3635,60 , 3695,14 , 3709,28 , 3635,60 , 3695,14 , 0,2 , 0,2 , 404,5 , 5,17 , 22,23 , {69,85,82}, 14,1 , 8436,19 , 19,5 , 4,0 , 2454,7 , 2513,7 , 2, 1, 1, 6, 7 }, // German/Latin/Italy + { 42, 7, 123, 46, 8217, 59, 37, 48, 45, 43, 101, 8222, 8220, 8218, 8216, 0,6 , 0,6 , 265,9 , 265,9 , 156,8 , 622,18 , 37,5 , 8,10 , 3614,21 , 3635,60 , 3695,14 , 3709,28 , 3635,60 , 3695,14 , 0,2 , 0,2 , 404,5 , 5,17 , 22,23 , {67,72,70}, 230,3 , 8455,58 , 19,5 , 4,0 , 2454,7 , 2520,13 , 2, 0, 1, 6, 7 }, // German/Latin/Liechtenstein + { 42, 7, 125, 44, 46, 59, 37, 48, 45, 43, 101, 8222, 8220, 8218, 8216, 0,6 , 0,6 , 265,9 , 265,9 , 156,8 , 622,18 , 37,5 , 8,10 , 3614,21 , 3635,60 , 3695,14 , 3709,28 , 3635,60 , 3695,14 , 0,2 , 0,2 , 404,5 , 5,17 , 22,23 , {69,85,82}, 14,1 , 8436,19 , 19,5 , 4,0 , 2454,7 , 2533,9 , 2, 1, 1, 6, 7 }, // German/Latin/Luxembourg + { 42, 7, 206, 46, 8217, 59, 37, 48, 45, 43, 101, 8222, 8220, 8218, 8216, 0,6 , 0,6 , 265,9 , 265,9 , 156,8 , 622,18 , 37,5 , 8,10 , 3614,21 , 3635,60 , 3695,14 , 3709,28 , 3635,60 , 3695,14 , 0,2 , 0,2 , 404,5 , 5,17 , 22,23 , {67,72,70}, 230,3 , 8455,58 , 19,5 , 4,0 , 2542,21 , 2563,7 , 2, 0, 1, 6, 7 }, // German/Latin/Switzerland { 43, 16, 85, 44, 46, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 274,9 , 274,9 , 269,6 , 10,17 , 18,7 , 25,12 , 3737,28 , 3765,55 , 3820,14 , 3737,28 , 3765,55 , 3820,14 , 82,4 , 78,4 , 45,4 , 5,17 , 22,23 , {69,85,82}, 14,1 , 8513,19 , 19,5 , 4,0 , 2570,8 , 2578,6 , 2, 1, 1, 6, 7 }, // Greek/Greek/Greece { 43, 16, 56, 44, 46, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 274,9 , 274,9 , 269,6 , 10,17 , 18,7 , 25,12 , 3737,28 , 3765,55 , 3820,14 , 3737,28 , 3765,55 , 3820,14 , 82,4 , 78,4 , 45,4 , 5,17 , 22,23 , {69,85,82}, 14,1 , 8513,19 , 19,5 , 4,0 , 2570,8 , 2584,6 , 2, 1, 1, 6, 7 }, // Greek/Greek/Cyprus { 44, 7, 86, 44, 46, 59, 37, 48, 8722, 43, 101, 187, 171, 8250, 8249, 0,6 , 0,6 , 283,11 , 283,11 , 53,10 , 80,17 , 239,5 , 244,10 , 3834,28 , 3862,98 , 3960,14 , 3834,28 , 3862,98 , 3960,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {68,75,75}, 148,3 , 8532,62 , 4,4 , 49,5 , 2590,11 , 2601,16 , 2, 0, 1, 6, 7 }, // Greenlandic/Latin/Greenland - { 45, 7, 168, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {80,89,71}, 236,1 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 0, 0, 7, 6, 7 }, // Guarani/Latin/Paraguay - { 46, 17, 100, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 294,9 , 294,9 , 269,6 , 192,18 , 362,8 , 370,13 , 3974,32 , 4006,53 , 4059,19 , 3974,32 , 4006,53 , 4059,19 , 0,2 , 0,2 , 429,4 , 5,17 , 22,23 , {73,78,82}, 121,1 , 8594,46 , 4,4 , 13,6 , 2617,7 , 2624,4 , 2, 1, 7, 7, 7 }, // Gujarati/Gujarati/India - { 47, 7, 157, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 303,9 , 312,8 , 269,6 , 715,17 , 37,5 , 8,10 , 4078,28 , 4106,52 , 4158,14 , 4078,28 , 4106,52 , 4158,14 , 86,6 , 82,5 , 0,5 , 433,41 , 474,47 , {78,71,78}, 178,1 , 8640,52 , 8,5 , 4,0 , 2628,5 , 2633,8 , 2, 1, 1, 6, 7 }, // Hausa/Latin/Nigeria + { 45, 7, 168, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {80,89,71}, 238,1 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 0, 0, 7, 6, 7 }, // Guarani/Latin/Paraguay + { 46, 17, 100, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 294,9 , 294,9 , 269,6 , 192,18 , 362,8 , 370,13 , 3974,32 , 4006,53 , 4059,19 , 3974,32 , 4006,53 , 4059,19 , 0,2 , 0,2 , 409,4 , 5,17 , 22,23 , {73,78,82}, 121,1 , 8594,46 , 4,4 , 13,6 , 2617,7 , 2624,4 , 2, 1, 7, 7, 7 }, // Gujarati/Gujarati/India + { 47, 7, 157, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 303,9 , 312,8 , 269,6 , 715,17 , 37,5 , 8,10 , 4078,28 , 4106,52 , 4158,14 , 4078,28 , 4106,52 , 4158,14 , 86,6 , 82,5 , 0,5 , 413,41 , 454,47 , {78,71,78}, 178,1 , 8640,52 , 8,5 , 4,0 , 2628,5 , 2633,8 , 2, 1, 1, 6, 7 }, // Hausa/Latin/Nigeria { 47, 1, 157, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {78,71,78}, 178,1 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 1, 6, 7 }, // Hausa/Arabic/Nigeria - { 47, 7, 83, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 303,9 , 312,8 , 269,6 , 715,17 , 18,7 , 25,12 , 4078,28 , 4106,52 , 4158,14 , 4078,28 , 4106,52 , 4158,14 , 86,6 , 82,5 , 0,5 , 433,41 , 474,47 , {71,72,83}, 167,3 , 8692,46 , 8,5 , 4,0 , 2628,5 , 2641,4 , 2, 1, 1, 6, 7 }, // Hausa/Latin/Ghana - { 47, 7, 156, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 303,9 , 312,8 , 269,6 , 715,17 , 37,5 , 8,10 , 4078,28 , 4106,52 , 4158,14 , 4078,28 , 4106,52 , 4158,14 , 86,6 , 82,5 , 0,5 , 433,41 , 474,47 , {88,79,70}, 207,3 , 8738,36 , 8,5 , 4,0 , 2628,5 , 2645,5 , 0, 0, 1, 6, 7 }, // Hausa/Latin/Niger - { 48, 18, 105, 46, 44, 59, 37, 48, 45, 43, 101, 8221, 8221, 8217, 8217, 0,6 , 0,6 , 320,6 , 320,6 , 640,8 , 732,18 , 55,4 , 59,9 , 4172,46 , 4218,65 , 4283,21 , 4172,46 , 4218,65 , 4283,21 , 92,6 , 87,5 , 521,4 , 5,17 , 22,23 , {73,76,83}, 49,1 , 8774,54 , 19,5 , 4,0 , 2650,5 , 2655,5 , 2, 1, 7, 5, 6 }, // Hebrew/Hebrew/Israel - { 49, 13, 100, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 326,9 , 335,8 , 269,6 , 10,17 , 18,7 , 25,12 , 4304,32 , 4336,53 , 4389,19 , 4304,32 , 4336,53 , 4389,19 , 68,2 , 65,2 , 525,4 , 5,17 , 22,23 , {73,78,82}, 121,1 , 8828,42 , 4,4 , 4,0 , 2660,6 , 2666,4 , 2, 1, 7, 7, 7 }, // Hindi/Devanagari/India + { 47, 7, 83, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 303,9 , 312,8 , 269,6 , 715,17 , 18,7 , 25,12 , 4078,28 , 4106,52 , 4158,14 , 4078,28 , 4106,52 , 4158,14 , 86,6 , 82,5 , 0,5 , 413,41 , 454,47 , {71,72,83}, 167,3 , 8692,46 , 8,5 , 4,0 , 2628,5 , 2641,4 , 2, 1, 1, 6, 7 }, // Hausa/Latin/Ghana + { 47, 7, 156, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 303,9 , 312,8 , 269,6 , 715,17 , 37,5 , 8,10 , 4078,28 , 4106,52 , 4158,14 , 4078,28 , 4106,52 , 4158,14 , 86,6 , 82,5 , 0,5 , 413,41 , 454,47 , {88,79,70}, 207,5 , 8738,36 , 8,5 , 4,0 , 2628,5 , 2645,5 , 0, 0, 1, 6, 7 }, // Hausa/Latin/Niger + { 48, 18, 105, 46, 44, 59, 37, 48, 45, 43, 101, 8221, 8221, 8217, 8217, 0,6 , 0,6 , 320,6 , 320,6 , 640,8 , 732,18 , 55,4 , 59,9 , 4172,46 , 4218,65 , 4283,21 , 4172,46 , 4218,65 , 4283,21 , 92,6 , 87,5 , 501,4 , 5,17 , 22,23 , {73,76,83}, 49,1 , 8774,54 , 19,5 , 4,0 , 2650,5 , 2655,5 , 2, 1, 7, 5, 6 }, // Hebrew/Hebrew/Israel + { 49, 13, 100, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 326,9 , 335,8 , 269,6 , 10,17 , 18,7 , 25,12 , 4304,32 , 4336,53 , 4389,19 , 4304,32 , 4336,53 , 4389,19 , 68,2 , 65,2 , 505,4 , 5,17 , 22,23 , {73,78,82}, 121,1 , 8828,42 , 4,4 , 4,0 , 2660,6 , 2666,4 , 2, 1, 7, 7, 7 }, // Hindi/Devanagari/India { 49, 7, 100, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {73,78,82}, 121,1 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 7, 7, 7 }, // Hindi/Latin/India - { 50, 7, 98, 44, 160, 59, 37, 48, 45, 43, 101, 8222, 8221, 187, 171, 0,6 , 0,6 , 343,8 , 343,8 , 750,13 , 763,19 , 55,4 , 59,9 , 4408,19 , 4427,52 , 4479,17 , 4408,19 , 4427,52 , 4479,17 , 98,3 , 92,3 , 529,4 , 5,17 , 22,23 , {72,85,70}, 237,2 , 8870,46 , 19,5 , 4,0 , 2670,6 , 2676,12 , 2, 0, 1, 6, 7 }, // Hungarian/Latin/Hungary - { 51, 7, 99, 44, 46, 59, 37, 48, 45, 43, 101, 8222, 8220, 8218, 8216, 0,6 , 0,6 , 188,8 , 188,8 , 640,8 , 622,18 , 37,5 , 8,10 , 4496,35 , 4531,81 , 4612,14 , 4496,35 , 4531,81 , 4612,14 , 101,4 , 95,4 , 533,4 , 5,17 , 22,23 , {73,83,75}, 239,3 , 8916,49 , 19,5 , 4,0 , 2688,8 , 2696,6 , 0, 0, 1, 6, 7 }, // Icelandic/Latin/Iceland - { 52, 7, 101, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 351,10 , 361,9 , 27,8 , 553,18 , 239,5 , 244,10 , 4626,28 , 4654,43 , 4697,14 , 4626,28 , 4654,43 , 4697,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {73,68,82}, 242,2 , 8965,39 , 4,4 , 4,0 , 2702,9 , 2702,9 , 2, 0, 7, 6, 7 }, // Indonesian/Latin/Indonesia + { 50, 7, 98, 44, 160, 59, 37, 48, 45, 43, 101, 8222, 8221, 187, 171, 0,6 , 0,6 , 343,8 , 343,8 , 750,13 , 763,19 , 55,4 , 59,9 , 4408,19 , 4427,52 , 4479,17 , 4408,19 , 4427,52 , 4479,17 , 98,3 , 92,3 , 509,4 , 5,17 , 22,23 , {72,85,70}, 239,2 , 8870,46 , 19,5 , 4,0 , 2670,6 , 2676,12 , 2, 0, 1, 6, 7 }, // Hungarian/Latin/Hungary + { 51, 7, 99, 44, 46, 59, 37, 48, 45, 43, 101, 8222, 8220, 8218, 8216, 0,6 , 0,6 , 188,8 , 188,8 , 640,8 , 622,18 , 37,5 , 8,10 , 4496,35 , 4531,81 , 4612,14 , 4496,35 , 4531,81 , 4612,14 , 101,4 , 95,4 , 513,4 , 5,17 , 22,23 , {73,83,75}, 241,3 , 8916,49 , 19,5 , 4,0 , 2688,8 , 2696,6 , 0, 0, 1, 6, 7 }, // Icelandic/Latin/Iceland + { 52, 7, 101, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 351,10 , 361,9 , 27,8 , 553,18 , 239,5 , 244,10 , 4626,28 , 4654,43 , 4697,14 , 4626,28 , 4654,43 , 4697,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {73,68,82}, 244,2 , 8965,39 , 4,4 , 4,0 , 2702,9 , 2702,9 , 2, 0, 7, 6, 7 }, // Indonesian/Latin/Indonesia { 53, 7, 260, 44, 46, 59, 37, 48, 45, 43, 101, 8216, 8217, 8220, 8221, 0,6 , 0,6 , 250,7 , 250,7 , 528,10 , 782,26 , 37,5 , 8,10 , 4711,28 , 4739,57 , 4796,14 , 4711,28 , 4739,57 , 4796,14 , 0,2 , 0,2 , 0,5 , 5,17 , 22,23 , {0,0,0}, 0,0 , 2586,0 , 8,5 , 37,7 , 2711,11 , 2722,5 , 2, 1, 1, 6, 7 }, // Interlingua/Latin/World - { 55, 44, 38, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {67,65,68}, 244,3 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 0, 7, 6, 7 }, // Inuktitut/Canadian Aboriginal/Canada - { 55, 7, 38, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {67,65,68}, 244,3 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 0, 7, 6, 7 }, // Inuktitut/Latin/Canada - { 57, 7, 104, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 240,10 , 240,10 , 119,10 , 97,16 , 37,5 , 8,10 , 4810,37 , 4847,75 , 4922,14 , 4810,37 , 4847,75 , 4922,14 , 105,4 , 99,4 , 537,6 , 5,17 , 22,23 , {69,85,82}, 14,1 , 9004,31 , 4,4 , 13,6 , 2727,7 , 2734,4 , 2, 1, 1, 6, 7 }, // Irish/Latin/Ireland - { 57, 7, 224, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 240,10 , 240,10 , 119,10 , 97,16 , 37,5 , 8,10 , 4810,37 , 4847,75 , 4922,14 , 4810,37 , 4847,75 , 4922,14 , 105,4 , 99,4 , 537,6 , 5,17 , 22,23 , {71,66,80}, 119,1 , 9035,95 , 4,4 , 13,6 , 2727,7 , 2738,19 , 2, 1, 1, 6, 7 }, // Irish/Latin/United Kingdom + { 55, 44, 38, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {67,65,68}, 246,3 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 0, 7, 6, 7 }, // Inuktitut/Canadian Aboriginal/Canada + { 55, 7, 38, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {67,65,68}, 246,3 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 0, 7, 6, 7 }, // Inuktitut/Latin/Canada + { 57, 7, 104, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 240,10 , 240,10 , 119,10 , 97,16 , 37,5 , 8,10 , 4810,37 , 4847,75 , 4922,14 , 4810,37 , 4847,75 , 4922,14 , 105,4 , 99,4 , 517,6 , 5,17 , 22,23 , {69,85,82}, 14,1 , 9004,31 , 4,4 , 13,6 , 2727,7 , 2734,4 , 2, 1, 1, 6, 7 }, // Irish/Latin/Ireland + { 57, 7, 224, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 240,10 , 240,10 , 119,10 , 97,16 , 37,5 , 8,10 , 4810,37 , 4847,75 , 4922,14 , 4810,37 , 4847,75 , 4922,14 , 105,4 , 99,4 , 517,6 , 5,17 , 22,23 , {71,66,80}, 119,1 , 9035,95 , 4,4 , 13,6 , 2727,7 , 2738,19 , 2, 1, 1, 6, 7 }, // Irish/Latin/United Kingdom { 58, 7, 106, 44, 46, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 250,7 , 250,7 , 27,8 , 97,16 , 37,5 , 8,10 , 4936,28 , 4964,57 , 5021,14 , 4936,28 , 4964,57 , 5021,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {69,85,82}, 14,1 , 9130,19 , 19,5 , 4,0 , 2757,8 , 2765,6 , 2, 1, 1, 6, 7 }, // Italian/Latin/Italy { 58, 7, 184, 44, 46, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 250,7 , 250,7 , 27,8 , 97,16 , 37,5 , 8,10 , 4936,28 , 4964,57 , 5021,14 , 4936,28 , 4964,57 , 5021,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {69,85,82}, 14,1 , 9130,19 , 19,5 , 4,0 , 2757,8 , 2771,10 , 2, 1, 1, 6, 7 }, // Italian/Latin/San Marino { 58, 7, 206, 46, 8217, 59, 37, 48, 45, 43, 101, 171, 187, 8249, 8250, 0,6 , 0,6 , 250,7 , 250,7 , 156,8 , 10,17 , 37,5 , 8,10 , 4936,28 , 4964,57 , 5021,14 , 4936,28 , 4964,57 , 5021,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {67,72,70}, 0,0 , 9149,53 , 19,5 , 4,0 , 2757,8 , 2781,8 , 2, 0, 1, 6, 7 }, // Italian/Latin/Switzerland { 58, 7, 230, 44, 46, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 250,7 , 250,7 , 27,8 , 97,16 , 37,5 , 8,10 , 4936,28 , 4964,57 , 5021,14 , 4936,28 , 4964,57 , 5021,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {69,85,82}, 14,1 , 9130,19 , 19,5 , 4,0 , 2757,8 , 2789,18 , 2, 1, 1, 6, 7 }, // Italian/Latin/Vatican City State - { 59, 19, 108, 46, 44, 59, 37, 48, 45, 43, 101, 12300, 12301, 12302, 12303, 166,5 , 166,5 , 166,5 , 166,5 , 578,10 , 402,13 , 55,4 , 383,10 , 5035,14 , 5049,28 , 5035,14 , 5035,14 , 5049,28 , 5035,14 , 109,2 , 103,2 , 543,3 , 546,17 , 22,23 , {74,80,89}, 247,1 , 9202,11 , 4,4 , 13,6 , 2807,3 , 2810,2 , 0, 0, 7, 6, 7 }, // Japanese/Japanese/Japan - { 60, 7, 101, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 370,10 , 380,9 , 528,10 , 10,17 , 37,5 , 8,10 , 5077,29 , 5106,41 , 5147,14 , 5077,29 , 5106,41 , 5147,14 , 111,4 , 105,5 , 563,4 , 5,17 , 22,23 , {73,68,82}, 242,2 , 8965,39 , 8,5 , 4,0 , 2812,4 , 2816,9 , 2, 0, 7, 6, 7 }, // Javanese/Latin/Indonesia - { 61, 21, 100, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 389,12 , 401,11 , 269,6 , 35,18 , 362,8 , 370,13 , 5161,33 , 5194,54 , 5248,20 , 5161,33 , 5194,54 , 5248,20 , 115,9 , 110,7 , 567,8 , 575,35 , 22,23 , {73,78,82}, 121,1 , 9213,49 , 4,4 , 13,6 , 2825,5 , 2830,4 , 2, 1, 7, 7, 7 }, // Kannada/Kannada/India + { 59, 19, 108, 46, 44, 59, 37, 48, 45, 43, 101, 12300, 12301, 12302, 12303, 166,5 , 166,5 , 166,5 , 166,5 , 578,10 , 402,13 , 55,4 , 383,10 , 5035,14 , 5049,28 , 5035,14 , 5035,14 , 5049,28 , 5035,14 , 109,2 , 103,2 , 523,3 , 526,17 , 22,23 , {74,80,89}, 249,1 , 9202,11 , 4,4 , 13,6 , 2807,3 , 2810,2 , 0, 0, 7, 6, 7 }, // Japanese/Japanese/Japan + { 60, 7, 101, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 370,10 , 380,9 , 528,10 , 10,17 , 37,5 , 8,10 , 5077,29 , 5106,41 , 5147,14 , 5077,29 , 5106,41 , 5147,14 , 111,4 , 105,5 , 543,4 , 5,17 , 22,23 , {73,68,82}, 244,2 , 8965,39 , 8,5 , 4,0 , 2812,4 , 2816,9 , 2, 0, 7, 6, 7 }, // Javanese/Latin/Indonesia + { 61, 21, 100, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 389,12 , 401,11 , 269,6 , 35,18 , 362,8 , 370,13 , 5161,33 , 5194,54 , 5248,20 , 5161,33 , 5194,54 , 5248,20 , 115,9 , 110,7 , 547,8 , 555,35 , 22,23 , {73,78,82}, 121,1 , 9213,49 , 4,4 , 13,6 , 2825,5 , 2830,4 , 2, 1, 7, 7, 7 }, // Kannada/Kannada/India { 62, 1, 100, 1643, 1644, 1563, 1642, 1776, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 547,6 , 35,18 , 18,7 , 25,12 , 5268,50 , 5318,52 , 5370,14 , 5268,50 , 5318,52 , 5370,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {73,78,82}, 121,1 , 9262,23 , 8,5 , 4,0 , 2834,5 , 2839,9 , 2, 1, 7, 7, 7 }, // Kashmiri/Arabic/India { 62, 13, 100, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {73,78,82}, 121,1 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 7, 7, 7 }, // Kashmiri/Devanagari/India - { 63, 2, 110, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 0,6 , 412,10 , 156,8 , 808,22 , 37,5 , 8,10 , 5384,21 , 5405,56 , 5461,14 , 5384,21 , 5405,56 , 5461,14 , 0,2 , 0,2 , 610,4 , 614,17 , 631,23 , {75,90,84}, 248,1 , 9285,58 , 19,5 , 4,0 , 2848,10 , 2858,9 , 2, 1, 1, 6, 7 }, // Kazakh/Cyrillic/Kazakhstan + { 63, 2, 110, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 0,6 , 412,10 , 156,8 , 808,22 , 37,5 , 8,10 , 5384,21 , 5405,56 , 5461,14 , 5384,21 , 5405,56 , 5461,14 , 0,2 , 0,2 , 590,4 , 594,17 , 611,23 , {75,90,84}, 250,1 , 9285,58 , 19,5 , 4,0 , 2848,10 , 2858,9 , 2, 1, 1, 6, 7 }, // Kazakh/Cyrillic/Kazakhstan { 64, 7, 179, 44, 46, 59, 37, 48, 45, 43, 101, 171, 187, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 5475,35 , 5510,84 , 85,14 , 5475,35 , 5510,84 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {82,87,70}, 180,2 , 0,7 , 8,5 , 4,0 , 2867,11 , 2878,8 , 0, 0, 1, 6, 7 }, // Kinyarwanda/Latin/Rwanda - { 65, 2, 116, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8222, 8220, 0,6 , 0,6 , 422,10 , 422,10 , 269,6 , 830,23 , 37,5 , 8,10 , 5594,38 , 5632,57 , 5689,14 , 5594,38 , 5632,57 , 5689,14 , 124,5 , 117,14 , 610,4 , 654,18 , 22,23 , {75,71,83}, 249,3 , 9343,52 , 19,5 , 4,0 , 2886,8 , 2894,10 , 2, 1, 1, 6, 7 }, // Kirghiz/Cyrillic/Kyrgyzstan - { 66, 22, 114, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 432,7 , 432,7 , 853,9 , 862,16 , 393,7 , 400,13 , 5703,14 , 5717,28 , 5703,14 , 5703,14 , 5717,28 , 5703,14 , 129,2 , 131,2 , 672,3 , 5,17 , 22,23 , {75,82,87}, 252,1 , 9395,19 , 4,4 , 13,6 , 2904,3 , 2907,4 , 0, 0, 7, 6, 7 }, // Korean/Korean/South Korea - { 66, 22, 113, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 432,7 , 432,7 , 853,9 , 862,16 , 393,7 , 400,13 , 5703,14 , 5717,28 , 5703,14 , 5703,14 , 5717,28 , 5703,14 , 129,2 , 131,2 , 672,3 , 5,17 , 22,23 , {75,80,87}, 253,3 , 9414,39 , 4,4 , 13,6 , 2904,3 , 2911,11 , 0, 0, 1, 6, 7 }, // Korean/Korean/North Korea - { 67, 7, 217, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 439,7 , 439,7 , 53,10 , 63,17 , 37,5 , 8,10 , 5745,20 , 5765,42 , 5807,14 , 5745,20 , 5765,42 , 5807,14 , 131,2 , 133,2 , 45,4 , 5,17 , 22,23 , {84,82,89}, 256,1 , 0,7 , 19,5 , 24,7 , 2922,5 , 2927,7 , 2, 1, 1, 6, 7 }, // Kurdish/Latin/Turkey + { 65, 2, 116, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8222, 8220, 0,6 , 0,6 , 422,10 , 422,10 , 269,6 , 830,23 , 37,5 , 8,10 , 5594,38 , 5632,57 , 5689,14 , 5594,38 , 5632,57 , 5689,14 , 124,5 , 117,14 , 590,4 , 634,18 , 22,23 , {75,71,83}, 251,3 , 9343,52 , 19,5 , 4,0 , 2886,8 , 2894,10 , 2, 1, 1, 6, 7 }, // Kirghiz/Cyrillic/Kyrgyzstan + { 66, 22, 114, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 432,7 , 432,7 , 853,9 , 862,16 , 393,7 , 400,13 , 5703,14 , 5717,28 , 5703,14 , 5703,14 , 5717,28 , 5703,14 , 129,2 , 131,2 , 652,3 , 5,17 , 22,23 , {75,82,87}, 254,1 , 9395,19 , 4,4 , 13,6 , 2904,3 , 2907,4 , 0, 0, 7, 6, 7 }, // Korean/Korean/South Korea + { 66, 22, 113, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 432,7 , 432,7 , 853,9 , 862,16 , 393,7 , 400,13 , 5703,14 , 5717,28 , 5703,14 , 5703,14 , 5717,28 , 5703,14 , 129,2 , 131,2 , 652,3 , 5,17 , 22,23 , {75,80,87}, 255,3 , 9414,39 , 4,4 , 13,6 , 2904,3 , 2911,11 , 0, 0, 1, 6, 7 }, // Korean/Korean/North Korea + { 67, 7, 217, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 439,7 , 439,7 , 53,10 , 63,17 , 37,5 , 8,10 , 5745,20 , 5765,42 , 5807,14 , 5745,20 , 5765,42 , 5807,14 , 131,2 , 133,2 , 45,4 , 5,17 , 22,23 , {84,82,89}, 258,1 , 0,7 , 19,5 , 24,7 , 2922,5 , 2927,7 , 2, 1, 1, 6, 7 }, // Kurdish/Latin/Turkey { 68, 7, 35, 44, 46, 59, 37, 48, 45, 43, 101, 8221, 8221, 8217, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 37,5 , 8,10 , 5821,34 , 5855,89 , 85,14 , 5821,34 , 5855,89 , 85,14 , 133,5 , 135,5 , 45,4 , 5,17 , 22,23 , {66,73,70}, 163,3 , 9453,27 , 0,4 , 4,0 , 2934,8 , 2942,8 , 0, 0, 1, 6, 7 }, // Rundi/Latin/Burundi - { 69, 23, 117, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 446,9 , 415,8 , 878,19 , 55,4 , 413,24 , 5944,36 , 5980,57 , 6037,17 , 5944,36 , 5980,57 , 6037,17 , 138,8 , 140,8 , 45,4 , 5,17 , 22,23 , {76,65,75}, 257,1 , 9480,21 , 4,4 , 44,5 , 2950,3 , 2950,3 , 0, 0, 7, 6, 7 }, // Lao/Lao/Laos + { 69, 23, 117, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 446,9 , 415,8 , 878,19 , 55,4 , 413,24 , 5944,36 , 5980,57 , 6037,17 , 5944,36 , 5980,57 , 6037,17 , 138,8 , 140,8 , 45,4 , 5,17 , 22,23 , {76,65,75}, 259,1 , 9480,21 , 4,4 , 44,5 , 2950,3 , 2950,3 , 0, 0, 7, 6, 7 }, // Lao/Lao/Laos { 70, 7, 230, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {69,85,82}, 14,1 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 1, 6, 7 }, // Latin/Latin/Vatican City State - { 71, 7, 118, 44, 160, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 455,8 , 455,8 , 156,8 , 897,26 , 37,5 , 8,10 , 6054,51 , 6105,72 , 6177,14 , 6191,51 , 6242,72 , 6177,14 , 146,14 , 148,11 , 675,5 , 5,17 , 22,23 , {69,85,82}, 14,1 , 9501,23 , 19,5 , 4,0 , 2953,8 , 2961,7 , 2, 1, 1, 6, 7 }, // Latvian/Latin/Latvia - { 72, 7, 49, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 463,9 , 463,9 , 415,8 , 97,16 , 37,5 , 8,10 , 6314,28 , 6342,100 , 6442,14 , 6314,28 , 6342,100 , 6442,14 , 160,8 , 159,6 , 45,4 , 5,17 , 22,23 , {67,68,70}, 214,2 , 9524,23 , 19,5 , 4,0 , 2968,7 , 2975,30 , 2, 1, 1, 6, 7 }, // Lingala/Latin/Congo Kinshasa - { 72, 7, 6, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 463,9 , 463,9 , 415,8 , 97,16 , 37,5 , 8,10 , 6314,28 , 6342,100 , 6442,14 , 6314,28 , 6342,100 , 6442,14 , 160,8 , 159,6 , 45,4 , 5,17 , 22,23 , {65,79,65}, 258,2 , 9547,23 , 19,5 , 4,0 , 2968,7 , 3005,6 , 2, 1, 1, 6, 7 }, // Lingala/Latin/Angola + { 71, 7, 118, 44, 160, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 455,8 , 455,8 , 156,8 , 897,26 , 37,5 , 8,10 , 6054,51 , 6105,72 , 6177,14 , 6191,51 , 6242,72 , 6177,14 , 146,14 , 148,11 , 655,5 , 5,17 , 22,23 , {69,85,82}, 14,1 , 9501,23 , 19,5 , 4,0 , 2953,8 , 2961,7 , 2, 1, 1, 6, 7 }, // Latvian/Latin/Latvia + { 72, 7, 49, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 463,9 , 463,9 , 415,8 , 97,16 , 37,5 , 8,10 , 6314,28 , 6342,100 , 6442,14 , 6314,28 , 6342,100 , 6442,14 , 160,8 , 159,6 , 45,4 , 5,17 , 22,23 , {67,68,70}, 216,2 , 9524,23 , 19,5 , 4,0 , 2968,7 , 2975,30 , 2, 1, 1, 6, 7 }, // Lingala/Latin/Congo Kinshasa + { 72, 7, 6, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 463,9 , 463,9 , 415,8 , 97,16 , 37,5 , 8,10 , 6314,28 , 6342,100 , 6442,14 , 6314,28 , 6342,100 , 6442,14 , 160,8 , 159,6 , 45,4 , 5,17 , 22,23 , {65,79,65}, 260,2 , 9547,23 , 19,5 , 4,0 , 2968,7 , 3005,6 , 2, 1, 1, 6, 7 }, // Lingala/Latin/Angola { 72, 7, 41, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 463,9 , 463,9 , 415,8 , 97,16 , 37,5 , 8,10 , 6314,28 , 6342,100 , 6442,14 , 6314,28 , 6342,100 , 6442,14 , 160,8 , 159,6 , 45,4 , 5,17 , 22,23 , {88,65,70}, 32,4 , 9570,23 , 19,5 , 4,0 , 2968,7 , 3011,26 , 0, 0, 1, 6, 7 }, // Lingala/Latin/Central African Republic { 72, 7, 50, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 463,9 , 463,9 , 415,8 , 97,16 , 37,5 , 8,10 , 6314,28 , 6342,100 , 6442,14 , 6314,28 , 6342,100 , 6442,14 , 160,8 , 159,6 , 45,4 , 5,17 , 22,23 , {88,65,70}, 32,4 , 9570,23 , 19,5 , 4,0 , 2968,7 , 3037,5 , 0, 0, 1, 6, 7 }, // Lingala/Latin/Congo Brazzaville - { 73, 7, 124, 44, 160, 59, 37, 48, 8722, 43, 101, 8222, 8220, 8222, 8220, 0,6 , 0,6 , 472,8 , 472,8 , 53,10 , 923,27 , 37,5 , 8,10 , 6456,21 , 6477,89 , 6566,14 , 6456,21 , 6477,89 , 6566,14 , 168,9 , 165,6 , 680,6 , 5,17 , 22,23 , {69,85,82}, 14,1 , 9593,30 , 19,5 , 4,0 , 3042,8 , 3050,7 , 2, 1, 1, 6, 7 }, // Lithuanian/Latin/Lithuania - { 74, 2, 127, 44, 46, 59, 37, 48, 45, 43, 101, 8222, 8220, 8218, 8216, 0,6 , 0,6 , 111,7 , 111,7 , 113,6 , 10,17 , 37,5 , 8,10 , 6580,35 , 6615,54 , 1530,14 , 6669,34 , 6615,54 , 1530,14 , 177,10 , 171,8 , 686,5 , 5,17 , 22,23 , {77,75,68}, 260,4 , 9623,56 , 19,5 , 4,0 , 3057,10 , 3067,18 , 2, 1, 1, 6, 7 }, // Macedonian/Cyrillic/Macedonia + { 73, 7, 124, 44, 160, 59, 37, 48, 8722, 43, 101, 8222, 8220, 8222, 8220, 0,6 , 0,6 , 472,8 , 472,8 , 53,10 , 923,27 , 37,5 , 8,10 , 6456,21 , 6477,89 , 6566,14 , 6456,21 , 6477,89 , 6566,14 , 168,9 , 165,6 , 660,6 , 5,17 , 22,23 , {69,85,82}, 14,1 , 9593,30 , 19,5 , 4,0 , 3042,8 , 3050,7 , 2, 1, 1, 6, 7 }, // Lithuanian/Latin/Lithuania + { 74, 2, 127, 44, 46, 59, 37, 48, 45, 43, 101, 8222, 8220, 8218, 8216, 0,6 , 0,6 , 111,7 , 111,7 , 113,6 , 10,17 , 37,5 , 8,10 , 6580,35 , 6615,54 , 1530,14 , 6669,34 , 6615,54 , 1530,14 , 177,10 , 171,8 , 666,5 , 5,17 , 22,23 , {77,75,68}, 262,4 , 9623,56 , 19,5 , 4,0 , 3057,10 , 3067,18 , 2, 1, 1, 6, 7 }, // Macedonian/Cyrillic/Macedonia { 75, 7, 128, 46, 44, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 97,16 , 37,5 , 8,10 , 6703,34 , 6737,60 , 6797,14 , 6703,34 , 6737,60 , 6797,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {77,71,65}, 170,2 , 9679,13 , 4,4 , 4,0 , 3085,8 , 3093,12 , 0, 0, 1, 6, 7 }, // Malagasy/Latin/Madagascar - { 76, 7, 130, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 361,9 , 361,9 , 571,7 , 10,17 , 18,7 , 25,12 , 6811,28 , 6839,43 , 6882,14 , 6811,28 , 6839,43 , 6882,14 , 187,2 , 179,3 , 691,4 , 5,17 , 22,23 , {77,89,82}, 174,2 , 9692,39 , 4,4 , 13,6 , 3105,6 , 1249,8 , 2, 1, 1, 6, 7 }, // Malay/Latin/Malaysia + { 76, 7, 130, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 361,9 , 361,9 , 571,7 , 10,17 , 18,7 , 25,12 , 6811,28 , 6839,43 , 6882,14 , 6811,28 , 6839,43 , 6882,14 , 187,2 , 179,3 , 671,4 , 5,17 , 22,23 , {77,89,82}, 174,2 , 9692,39 , 4,4 , 13,6 , 3105,6 , 1249,8 , 2, 1, 1, 6, 7 }, // Malay/Latin/Malaysia { 76, 1, 130, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {77,89,82}, 174,2 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 1, 6, 7 }, // Malay/Arabic/Malaysia - { 76, 7, 32, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 361,9 , 361,9 , 571,7 , 950,12 , 18,7 , 25,12 , 6811,28 , 6839,43 , 6882,14 , 6811,28 , 6839,43 , 6882,14 , 187,2 , 179,3 , 691,4 , 5,17 , 22,23 , {66,78,68}, 6,1 , 9731,31 , 4,4 , 13,6 , 3105,6 , 3111,6 , 2, 1, 1, 6, 7 }, // Malay/Latin/Brunei - { 76, 7, 101, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 361,9 , 361,9 , 27,8 , 553,18 , 239,5 , 244,10 , 6811,28 , 6839,43 , 6882,14 , 6811,28 , 6839,43 , 6882,14 , 187,2 , 179,3 , 691,4 , 5,17 , 22,23 , {73,68,82}, 242,2 , 8965,39 , 4,4 , 4,0 , 3105,6 , 2702,9 , 2, 0, 7, 6, 7 }, // Malay/Latin/Indonesia - { 76, 7, 190, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 361,9 , 361,9 , 571,7 , 10,17 , 18,7 , 25,12 , 6811,28 , 6839,43 , 6882,14 , 6811,28 , 6839,43 , 6882,14 , 187,2 , 179,3 , 691,4 , 5,17 , 22,23 , {83,71,68}, 6,1 , 9762,37 , 4,4 , 13,6 , 3105,6 , 3117,9 , 2, 1, 7, 6, 7 }, // Malay/Latin/Singapore - { 77, 24, 100, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 480,13 , 493,12 , 269,6 , 962,18 , 18,7 , 25,12 , 6896,41 , 6937,77 , 7014,22 , 6896,41 , 7036,76 , 7112,21 , 0,2 , 0,2 , 695,6 , 701,27 , 22,23 , {73,78,82}, 121,1 , 9799,40 , 4,4 , 13,6 , 3126,6 , 3132,6 , 2, 1, 7, 7, 7 }, // Malayalam/Malayalam/India + { 76, 7, 32, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 361,9 , 361,9 , 571,7 , 950,12 , 18,7 , 25,12 , 6811,28 , 6839,43 , 6882,14 , 6811,28 , 6839,43 , 6882,14 , 187,2 , 179,3 , 671,4 , 5,17 , 22,23 , {66,78,68}, 6,1 , 9731,31 , 4,4 , 13,6 , 3105,6 , 3111,6 , 2, 1, 1, 6, 7 }, // Malay/Latin/Brunei + { 76, 7, 101, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 361,9 , 361,9 , 27,8 , 553,18 , 239,5 , 244,10 , 6811,28 , 6839,43 , 6882,14 , 6811,28 , 6839,43 , 6882,14 , 187,2 , 179,3 , 671,4 , 5,17 , 22,23 , {73,68,82}, 244,2 , 8965,39 , 4,4 , 4,0 , 3105,6 , 2702,9 , 2, 0, 7, 6, 7 }, // Malay/Latin/Indonesia + { 76, 7, 190, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 361,9 , 361,9 , 571,7 , 10,17 , 18,7 , 25,12 , 6811,28 , 6839,43 , 6882,14 , 6811,28 , 6839,43 , 6882,14 , 187,2 , 179,3 , 671,4 , 5,17 , 22,23 , {83,71,68}, 6,1 , 9762,37 , 4,4 , 13,6 , 3105,6 , 3117,9 , 2, 1, 7, 6, 7 }, // Malay/Latin/Singapore + { 77, 24, 100, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 480,13 , 493,12 , 269,6 , 962,18 , 18,7 , 25,12 , 6896,41 , 6937,77 , 7014,22 , 6896,41 , 7036,76 , 7112,21 , 0,2 , 0,2 , 675,6 , 681,27 , 22,23 , {73,78,82}, 121,1 , 9799,40 , 4,4 , 13,6 , 3126,6 , 3132,6 , 2, 1, 7, 7, 7 }, // Malayalam/Malayalam/India { 78, 7, 133, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 505,8 , 513,7 , 119,10 , 980,23 , 37,5 , 8,10 , 7133,28 , 7161,63 , 7224,21 , 7133,28 , 7161,63 , 7245,20 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {69,85,82}, 14,1 , 9839,27 , 4,4 , 4,0 , 3138,5 , 1257,5 , 2, 1, 7, 6, 7 }, // Maltese/Latin/Malta { 79, 7, 154, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 528,10 , 10,17 , 18,7 , 25,12 , 7265,27 , 7292,47 , 7339,14 , 7265,27 , 7292,47 , 7339,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {78,90,68}, 6,1 , 9866,37 , 8,5 , 4,0 , 3143,12 , 3155,8 , 2, 1, 1, 6, 7 }, // Maori/Latin/New Zealand - { 80, 13, 100, 46, 44, 59, 37, 2406, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 520,9 , 520,9 , 269,6 , 192,18 , 18,7 , 25,12 , 7353,32 , 7385,53 , 4389,19 , 7353,32 , 7385,53 , 4389,19 , 0,2 , 0,2 , 525,4 , 5,17 , 22,23 , {73,78,82}, 121,1 , 9903,43 , 4,4 , 13,6 , 3163,5 , 2666,4 , 2, 1, 7, 7, 7 }, // Marathi/Devanagari/India - { 82, 2, 143, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 1003,10 , 1013,35 , 37,5 , 87,12 , 7438,21 , 7459,43 , 7438,21 , 7438,21 , 7502,43 , 7438,21 , 189,4 , 182,4 , 610,4 , 728,17 , 22,23 , {77,78,84}, 264,1 , 9946,46 , 8,5 , 4,0 , 3168,6 , 3174,6 , 2, 0, 1, 6, 7 }, // Mongolian/Cyrillic/Mongolia - { 82, 8, 44, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {67,78,89}, 265,3 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 7, 6, 7 }, // Mongolian/Mongolian/China - { 84, 13, 150, 46, 44, 59, 37, 2406, 45, 43, 101, 8220, 8221, 8216, 8217, 529,5 , 0,6 , 534,7 , 534,7 , 227,6 , 63,17 , 37,5 , 8,10 , 7545,33 , 7578,54 , 7632,18 , 7545,33 , 7578,54 , 7632,18 , 193,9 , 186,7 , 525,4 , 745,19 , 22,23 , {78,80,82}, 268,4 , 9992,49 , 8,5 , 4,0 , 3180,6 , 3186,5 , 2, 1, 7, 6, 7 }, // Nepali/Devanagari/Nepal - { 84, 13, 100, 46, 44, 59, 37, 2406, 45, 43, 101, 8220, 8221, 8216, 8217, 529,5 , 0,6 , 534,7 , 534,7 , 227,6 , 63,17 , 18,7 , 25,12 , 7545,33 , 7578,54 , 7632,18 , 7545,33 , 7578,54 , 7632,18 , 193,9 , 186,7 , 525,4 , 745,19 , 22,23 , {73,78,82}, 121,1 , 10041,49 , 8,5 , 4,0 , 3180,6 , 2666,4 , 2, 1, 7, 7, 7 }, // Nepali/Devanagari/India + { 80, 13, 100, 46, 44, 59, 37, 2406, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 520,9 , 520,9 , 269,6 , 192,18 , 18,7 , 25,12 , 7353,32 , 7385,53 , 4389,19 , 7353,32 , 7385,53 , 4389,19 , 0,2 , 0,2 , 505,4 , 5,17 , 22,23 , {73,78,82}, 121,1 , 9903,43 , 4,4 , 13,6 , 3163,5 , 2666,4 , 2, 1, 7, 7, 7 }, // Marathi/Devanagari/India + { 82, 2, 143, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 1003,10 , 1013,35 , 37,5 , 87,12 , 7438,21 , 7459,43 , 7438,21 , 7438,21 , 7502,43 , 7438,21 , 189,4 , 182,4 , 590,4 , 708,17 , 22,23 , {77,78,84}, 266,1 , 9946,46 , 8,5 , 4,0 , 3168,6 , 3174,6 , 2, 0, 1, 6, 7 }, // Mongolian/Cyrillic/Mongolia + { 82, 8, 44, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {67,78,89}, 267,3 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 7, 6, 7 }, // Mongolian/Mongolian/China + { 84, 13, 150, 46, 44, 59, 37, 2406, 45, 43, 101, 8220, 8221, 8216, 8217, 529,5 , 0,6 , 534,7 , 534,7 , 227,6 , 63,17 , 37,5 , 8,10 , 7545,33 , 7578,54 , 7632,18 , 7545,33 , 7578,54 , 7632,18 , 193,9 , 186,7 , 505,4 , 725,19 , 22,23 , {78,80,82}, 270,4 , 9992,49 , 8,5 , 4,0 , 3180,6 , 3186,5 , 2, 1, 7, 6, 7 }, // Nepali/Devanagari/Nepal + { 84, 13, 100, 46, 44, 59, 37, 2406, 45, 43, 101, 8220, 8221, 8216, 8217, 529,5 , 0,6 , 534,7 , 534,7 , 227,6 , 63,17 , 18,7 , 25,12 , 7545,33 , 7578,54 , 7632,18 , 7545,33 , 7578,54 , 7632,18 , 193,9 , 186,7 , 505,4 , 725,19 , 22,23 , {73,78,82}, 121,1 , 10041,49 , 8,5 , 4,0 , 3180,6 , 2666,4 , 2, 1, 7, 7, 7 }, // Nepali/Devanagari/India { 85, 7, 161, 44, 160, 59, 37, 48, 8722, 43, 101, 171, 187, 8216, 8217, 0,6 , 0,6 , 188,8 , 188,8 , 495,10 , 478,17 , 37,5 , 8,10 , 2334,35 , 2269,51 , 2320,14 , 2334,35 , 2269,51 , 2320,14 , 64,4 , 61,4 , 45,4 , 5,17 , 22,23 , {78,79,75}, 190,2 , 10090,44 , 8,5 , 4,0 , 3191,12 , 3203,5 , 2, 0, 1, 6, 7 }, // Norwegian Bokmal/Latin/Norway { 85, 7, 203, 44, 160, 59, 37, 48, 8722, 43, 101, 171, 187, 8216, 8217, 0,6 , 0,6 , 188,8 , 188,8 , 495,10 , 478,17 , 37,5 , 8,10 , 2334,35 , 2269,51 , 2320,14 , 2334,35 , 2269,51 , 2320,14 , 64,4 , 61,4 , 45,4 , 5,17 , 22,23 , {78,79,75}, 190,2 , 10090,44 , 8,5 , 4,0 , 3191,12 , 3208,21 , 2, 0, 1, 6, 7 }, // Norwegian Bokmal/Latin/Svalbard And Jan Mayen Islands { 86, 7, 74, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {69,85,82}, 14,1 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 1, 6, 7 }, // Occitan/Latin/France - { 87, 26, 100, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 541,8 , 549,7 , 547,6 , 35,18 , 18,7 , 25,12 , 7650,33 , 7683,54 , 7737,18 , 7650,33 , 7683,54 , 7737,18 , 0,2 , 0,2 , 764,5 , 5,17 , 22,23 , {73,78,82}, 121,1 , 10134,43 , 4,4 , 13,6 , 3229,5 , 3234,4 , 2, 1, 7, 7, 7 }, // Oriya/Oriya/India - { 88, 1, 1, 1643, 1644, 1563, 1642, 1776, 45, 43, 101, 8220, 8221, 8216, 8217, 556,6 , 556,6 , 562,9 , 571,8 , 394,8 , 1048,20 , 55,4 , 198,11 , 7755,39 , 7755,39 , 85,14 , 7755,39 , 7755,39 , 85,14 , 202,4 , 193,4 , 769,5 , 5,17 , 22,23 , {65,70,78}, 272,1 , 10177,25 , 4,4 , 13,6 , 3238,4 , 3242,9 , 0, 0, 6, 4, 5 }, // Pashto/Arabic/Afghanistan - { 88, 1, 163, 1643, 1644, 1563, 1642, 1776, 45, 43, 101, 8220, 8221, 8216, 8217, 556,6 , 556,6 , 562,9 , 571,8 , 394,8 , 1048,20 , 18,7 , 25,12 , 7755,39 , 7755,39 , 85,14 , 7755,39 , 7755,39 , 85,14 , 202,4 , 193,4 , 769,5 , 5,17 , 22,23 , {80,75,82}, 176,2 , 10202,52 , 4,4 , 13,6 , 3238,4 , 3251,7 , 2, 0, 7, 6, 7 }, // Pashto/Arabic/Pakistan - { 89, 1, 102, 1643, 1644, 1563, 1642, 1776, 45, 43, 101, 171, 187, 8249, 8250, 579,7 , 579,7 , 586,8 , 594,7 , 394,8 , 97,16 , 55,4 , 198,11 , 7794,49 , 7794,49 , 7843,14 , 7794,49 , 7794,49 , 7843,14 , 206,9 , 197,8 , 774,4 , 778,42 , 22,23 , {73,82,82}, 273,4 , 10254,37 , 54,6 , 60,8 , 3258,5 , 3263,5 , 0, 0, 6, 5, 5 }, // Persian/Arabic/Iran - { 89, 1, 1, 1643, 1644, 1563, 1642, 1776, 45, 43, 101, 171, 187, 8249, 8250, 579,7 , 579,7 , 586,8 , 594,7 , 394,8 , 97,16 , 55,4 , 198,11 , 7794,49 , 7794,49 , 7843,14 , 7794,49 , 7794,49 , 7843,14 , 206,9 , 197,8 , 774,4 , 778,42 , 22,23 , {65,70,78}, 272,1 , 10291,55 , 8,5 , 60,8 , 3268,3 , 3242,9 , 0, 0, 6, 4, 5 }, // Persian/Arabic/Afghanistan - { 90, 7, 172, 44, 160, 59, 37, 48, 45, 43, 101, 8222, 8221, 171, 187, 0,6 , 0,6 , 159,7 , 159,7 , 495,10 , 10,17 , 37,5 , 8,10 , 7857,34 , 7891,59 , 7950,14 , 7857,34 , 7891,59 , 7964,14 , 0,2 , 0,2 , 305,5 , 5,17 , 22,23 , {80,76,78}, 277,2 , 10346,77 , 19,5 , 24,7 , 3271,6 , 3277,6 , 2, 1, 1, 6, 7 }, // Polish/Latin/Poland - { 91, 7, 30, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 250,7 , 250,7 , 119,10 , 669,27 , 37,5 , 8,10 , 7978,35 , 8013,79 , 8092,14 , 7978,35 , 8013,79 , 8092,14 , 0,2 , 0,2 , 0,5 , 5,17 , 22,23 , {66,82,76}, 279,2 , 10423,54 , 8,5 , 4,0 , 3283,9 , 3292,6 , 2, 1, 7, 6, 7 }, // Portuguese/Latin/Brazil - { 91, 7, 6, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 250,7 , 250,7 , 27,8 , 669,27 , 37,5 , 8,10 , 8106,49 , 8013,79 , 8092,14 , 8106,49 , 8013,79 , 8092,14 , 215,8 , 205,8 , 0,5 , 5,17 , 22,23 , {65,79,65}, 258,2 , 10477,54 , 19,5 , 24,7 , 3283,9 , 3298,6 , 2, 1, 1, 6, 7 }, // Portuguese/Latin/Angola - { 91, 7, 39, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 250,7 , 250,7 , 27,8 , 669,27 , 37,5 , 8,10 , 8106,49 , 8013,79 , 8092,14 , 8106,49 , 8013,79 , 8092,14 , 215,8 , 205,8 , 0,5 , 5,17 , 22,23 , {67,86,69}, 281,1 , 10531,69 , 19,5 , 24,7 , 3283,9 , 3304,10 , 2, 1, 1, 6, 7 }, // Portuguese/Latin/Cape Verde + { 87, 26, 100, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 541,8 , 549,7 , 547,6 , 35,18 , 18,7 , 25,12 , 7650,33 , 7683,54 , 7737,18 , 7650,33 , 7683,54 , 7737,18 , 0,2 , 0,2 , 744,5 , 5,17 , 22,23 , {73,78,82}, 121,1 , 10134,43 , 4,4 , 13,6 , 3229,5 , 3234,4 , 2, 1, 7, 7, 7 }, // Oriya/Oriya/India + { 88, 1, 1, 1643, 1644, 1563, 1642, 1776, 45, 43, 101, 8220, 8221, 8216, 8217, 556,6 , 556,6 , 562,9 , 571,8 , 394,8 , 1048,20 , 55,4 , 198,11 , 7755,39 , 7755,39 , 85,14 , 7755,39 , 7755,39 , 85,14 , 202,4 , 193,4 , 749,5 , 5,17 , 22,23 , {65,70,78}, 274,1 , 10177,25 , 4,4 , 13,6 , 3238,4 , 3242,9 , 0, 0, 6, 4, 5 }, // Pashto/Arabic/Afghanistan + { 88, 1, 163, 1643, 1644, 1563, 1642, 1776, 45, 43, 101, 8220, 8221, 8216, 8217, 556,6 , 556,6 , 562,9 , 571,8 , 394,8 , 1048,20 , 18,7 , 25,12 , 7755,39 , 7755,39 , 85,14 , 7755,39 , 7755,39 , 85,14 , 202,4 , 193,4 , 749,5 , 5,17 , 22,23 , {80,75,82}, 176,2 , 10202,52 , 4,4 , 13,6 , 3238,4 , 3251,7 , 2, 0, 7, 6, 7 }, // Pashto/Arabic/Pakistan + { 89, 1, 102, 1643, 1644, 1563, 1642, 1776, 45, 43, 101, 171, 187, 8249, 8250, 579,7 , 579,7 , 586,8 , 594,7 , 394,8 , 97,16 , 55,4 , 198,11 , 7794,49 , 7794,49 , 7843,14 , 7794,49 , 7794,49 , 7843,14 , 206,9 , 197,8 , 754,4 , 5,17 , 22,23 , {73,82,82}, 275,4 , 10254,37 , 54,6 , 60,8 , 3258,5 , 3263,5 , 0, 0, 6, 5, 5 }, // Persian/Arabic/Iran + { 89, 1, 1, 1643, 1644, 1563, 1642, 1776, 45, 43, 101, 171, 187, 8249, 8250, 579,7 , 579,7 , 586,8 , 594,7 , 394,8 , 97,16 , 55,4 , 198,11 , 7794,49 , 7794,49 , 7843,14 , 7794,49 , 7794,49 , 7843,14 , 206,9 , 197,8 , 754,4 , 5,17 , 22,23 , {65,70,78}, 274,1 , 10291,55 , 8,5 , 60,8 , 3268,3 , 3242,9 , 0, 0, 6, 4, 5 }, // Persian/Arabic/Afghanistan + { 90, 7, 172, 44, 160, 59, 37, 48, 45, 43, 101, 8222, 8221, 171, 187, 0,6 , 0,6 , 159,7 , 159,7 , 495,10 , 10,17 , 37,5 , 8,10 , 7857,34 , 7891,59 , 7950,14 , 7857,34 , 7891,59 , 7964,14 , 0,2 , 0,2 , 293,5 , 5,17 , 22,23 , {80,76,78}, 279,2 , 10346,77 , 19,5 , 24,7 , 3271,6 , 3277,6 , 2, 1, 1, 6, 7 }, // Polish/Latin/Poland + { 91, 7, 30, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 250,7 , 250,7 , 119,10 , 669,27 , 37,5 , 8,10 , 7978,35 , 8013,79 , 8092,14 , 7978,35 , 8013,79 , 8092,14 , 0,2 , 0,2 , 0,5 , 5,17 , 22,23 , {66,82,76}, 281,2 , 10423,54 , 8,5 , 4,0 , 3283,9 , 3292,6 , 2, 1, 7, 6, 7 }, // Portuguese/Latin/Brazil + { 91, 7, 6, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 250,7 , 250,7 , 27,8 , 669,27 , 37,5 , 8,10 , 8106,49 , 8013,79 , 8092,14 , 8106,49 , 8013,79 , 8092,14 , 215,8 , 205,8 , 0,5 , 5,17 , 22,23 , {65,79,65}, 260,2 , 10477,54 , 19,5 , 24,7 , 3283,9 , 3298,6 , 2, 1, 1, 6, 7 }, // Portuguese/Latin/Angola + { 91, 7, 39, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 250,7 , 250,7 , 27,8 , 669,27 , 37,5 , 8,10 , 8106,49 , 8013,79 , 8092,14 , 8106,49 , 8013,79 , 8092,14 , 215,8 , 205,8 , 0,5 , 5,17 , 22,23 , {67,86,69}, 283,1 , 10531,69 , 19,5 , 24,7 , 3283,9 , 3304,10 , 2, 1, 1, 6, 7 }, // Portuguese/Latin/Cape Verde { 91, 7, 62, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 250,7 , 250,7 , 27,8 , 669,27 , 37,5 , 8,10 , 8106,49 , 8013,79 , 8092,14 , 8106,49 , 8013,79 , 8092,14 , 215,8 , 205,8 , 0,5 , 5,17 , 22,23 , {85,83,68}, 159,3 , 10600,81 , 19,5 , 24,7 , 3283,9 , 3314,11 , 2, 1, 1, 6, 7 }, // Portuguese/Latin/East Timor { 91, 7, 66, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 250,7 , 250,7 , 27,8 , 669,27 , 37,5 , 8,10 , 8106,49 , 8013,79 , 8092,14 , 8106,49 , 8013,79 , 8092,14 , 215,8 , 205,8 , 0,5 , 5,17 , 22,23 , {88,65,70}, 32,4 , 10681,59 , 19,5 , 24,7 , 3283,9 , 3325,16 , 0, 0, 1, 6, 7 }, // Portuguese/Latin/Equatorial Guinea - { 91, 7, 92, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 250,7 , 250,7 , 27,8 , 669,27 , 37,5 , 8,10 , 8106,49 , 8013,79 , 8092,14 , 8106,49 , 8013,79 , 8092,14 , 215,8 , 205,8 , 0,5 , 5,17 , 22,23 , {88,79,70}, 207,3 , 10740,62 , 19,5 , 24,7 , 3283,9 , 3341,12 , 0, 0, 1, 6, 7 }, // Portuguese/Latin/Guinea Bissau + { 91, 7, 92, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 250,7 , 250,7 , 27,8 , 669,27 , 37,5 , 8,10 , 8106,49 , 8013,79 , 8092,14 , 8106,49 , 8013,79 , 8092,14 , 215,8 , 205,8 , 0,5 , 5,17 , 22,23 , {88,79,70}, 207,5 , 10740,62 , 19,5 , 24,7 , 3283,9 , 3341,12 , 0, 0, 1, 6, 7 }, // Portuguese/Latin/Guinea Bissau { 91, 7, 125, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 250,7 , 250,7 , 27,8 , 669,27 , 37,5 , 8,10 , 8106,49 , 8013,79 , 8092,14 , 8106,49 , 8013,79 , 8092,14 , 215,8 , 205,8 , 0,5 , 5,17 , 22,23 , {69,85,82}, 14,1 , 3102,20 , 19,5 , 24,7 , 3283,9 , 3353,10 , 2, 1, 1, 6, 7 }, // Portuguese/Latin/Luxembourg { 91, 7, 126, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 250,7 , 250,7 , 27,8 , 669,27 , 18,7 , 25,12 , 8106,49 , 8013,79 , 8092,14 , 8106,49 , 8013,79 , 8092,14 , 215,8 , 205,8 , 0,5 , 5,17 , 22,23 , {77,79,80}, 137,4 , 10802,54 , 19,5 , 24,7 , 3283,9 , 3363,19 , 2, 1, 7, 6, 7 }, // Portuguese/Latin/Macau - { 91, 7, 146, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 250,7 , 250,7 , 27,8 , 669,27 , 37,5 , 8,10 , 8106,49 , 8013,79 , 8092,14 , 8106,49 , 8013,79 , 8092,14 , 215,8 , 205,8 , 0,5 , 5,17 , 22,23 , {77,90,78}, 282,3 , 10856,66 , 19,5 , 24,7 , 3283,9 , 3382,10 , 2, 1, 7, 6, 7 }, // Portuguese/Latin/Mozambique + { 91, 7, 146, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 250,7 , 250,7 , 27,8 , 669,27 , 37,5 , 8,10 , 8106,49 , 8013,79 , 8092,14 , 8106,49 , 8013,79 , 8092,14 , 215,8 , 205,8 , 0,5 , 5,17 , 22,23 , {77,90,78}, 284,3 , 10856,66 , 19,5 , 24,7 , 3283,9 , 3382,10 , 2, 1, 7, 6, 7 }, // Portuguese/Latin/Mozambique { 91, 7, 173, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 250,7 , 250,7 , 27,8 , 669,27 , 37,5 , 8,10 , 8106,49 , 8013,79 , 8092,14 , 8106,49 , 8013,79 , 8092,14 , 215,8 , 205,8 , 0,5 , 5,17 , 22,23 , {69,85,82}, 14,1 , 3102,20 , 19,5 , 24,7 , 3392,17 , 3409,8 , 2, 1, 7, 6, 7 }, // Portuguese/Latin/Portugal - { 91, 7, 185, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 250,7 , 250,7 , 27,8 , 669,27 , 37,5 , 8,10 , 8106,49 , 8013,79 , 8092,14 , 8106,49 , 8013,79 , 8092,14 , 215,8 , 205,8 , 0,5 , 5,17 , 22,23 , {83,84,78}, 285,2 , 10922,92 , 19,5 , 24,7 , 3283,9 , 3417,19 , 2, 1, 1, 6, 7 }, // Portuguese/Latin/Sao Tome And Principe - { 91, 7, 206, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 250,7 , 250,7 , 27,8 , 669,27 , 37,5 , 8,10 , 8106,49 , 8013,79 , 8092,14 , 8106,49 , 8013,79 , 8092,14 , 215,8 , 205,8 , 0,5 , 5,17 , 22,23 , {67,72,70}, 228,3 , 11014,45 , 19,5 , 24,7 , 3283,9 , 3436,5 , 2, 0, 1, 6, 7 }, // Portuguese/Latin/Switzerland - { 92, 4, 100, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 601,9 , 601,9 , 269,6 , 10,17 , 18,7 , 25,12 , 8155,36 , 8191,57 , 8248,23 , 8155,36 , 8191,57 , 8248,23 , 223,6 , 213,6 , 820,4 , 5,17 , 22,23 , {73,78,82}, 121,1 , 11059,39 , 8,5 , 4,0 , 3441,6 , 3447,4 , 2, 1, 7, 7, 7 }, // Punjabi/Gurmukhi/India - { 92, 1, 163, 1643, 1644, 1563, 1642, 1776, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 553,18 , 18,7 , 25,12 , 8271,37 , 8271,37 , 85,14 , 8271,37 , 8271,37 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {80,75,82}, 287,1 , 11098,13 , 8,5 , 4,0 , 3451,6 , 3251,7 , 2, 0, 7, 6, 7 }, // Punjabi/Arabic/Pakistan - { 93, 7, 169, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 192,18 , 37,5 , 8,10 , 8308,28 , 8336,53 , 8389,14 , 8308,28 , 8336,53 , 8389,14 , 64,4 , 61,4 , 45,4 , 5,17 , 22,23 , {80,69,78}, 288,2 , 11111,29 , 8,5 , 4,0 , 3457,8 , 3465,4 , 2, 1, 7, 6, 7 }, // Quechua/Latin/Peru - { 93, 7, 26, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 192,18 , 37,5 , 8,10 , 8308,28 , 8336,53 , 8389,14 , 8308,28 , 8336,53 , 8389,14 , 64,4 , 61,4 , 45,4 , 5,17 , 22,23 , {66,79,66}, 290,2 , 11140,25 , 8,5 , 4,0 , 3457,8 , 3469,7 , 2, 1, 1, 6, 7 }, // Quechua/Latin/Bolivia + { 91, 7, 185, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 250,7 , 250,7 , 27,8 , 669,27 , 37,5 , 8,10 , 8106,49 , 8013,79 , 8092,14 , 8106,49 , 8013,79 , 8092,14 , 215,8 , 205,8 , 0,5 , 5,17 , 22,23 , {83,84,78}, 287,2 , 10922,92 , 19,5 , 24,7 , 3283,9 , 3417,19 , 2, 1, 1, 6, 7 }, // Portuguese/Latin/Sao Tome And Principe + { 91, 7, 206, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 250,7 , 250,7 , 27,8 , 669,27 , 37,5 , 8,10 , 8106,49 , 8013,79 , 8092,14 , 8106,49 , 8013,79 , 8092,14 , 215,8 , 205,8 , 0,5 , 5,17 , 22,23 , {67,72,70}, 230,3 , 11014,45 , 19,5 , 24,7 , 3283,9 , 3436,5 , 2, 0, 1, 6, 7 }, // Portuguese/Latin/Switzerland + { 92, 4, 100, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 601,9 , 601,9 , 269,6 , 10,17 , 18,7 , 25,12 , 8155,36 , 8191,57 , 8248,23 , 8155,36 , 8191,57 , 8248,23 , 223,6 , 213,6 , 758,4 , 5,17 , 22,23 , {73,78,82}, 121,1 , 11059,39 , 8,5 , 4,0 , 3441,6 , 3447,4 , 2, 1, 7, 7, 7 }, // Punjabi/Gurmukhi/India + { 92, 1, 163, 1643, 1644, 1563, 1642, 1776, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 553,18 , 18,7 , 25,12 , 8271,37 , 8271,37 , 85,14 , 8271,37 , 8271,37 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {80,75,82}, 289,1 , 11098,13 , 8,5 , 4,0 , 3451,6 , 3251,7 , 2, 0, 7, 6, 7 }, // Punjabi/Arabic/Pakistan + { 93, 7, 169, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 192,18 , 37,5 , 8,10 , 8308,28 , 8336,53 , 8389,14 , 8308,28 , 8336,53 , 8389,14 , 64,4 , 61,4 , 45,4 , 5,17 , 22,23 , {80,69,78}, 290,2 , 11111,29 , 8,5 , 4,0 , 3457,8 , 3465,4 , 2, 1, 7, 6, 7 }, // Quechua/Latin/Peru + { 93, 7, 26, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 192,18 , 37,5 , 8,10 , 8308,28 , 8336,53 , 8389,14 , 8308,28 , 8336,53 , 8389,14 , 64,4 , 61,4 , 45,4 , 5,17 , 22,23 , {66,79,66}, 292,2 , 11140,25 , 8,5 , 4,0 , 3457,8 , 3469,7 , 2, 1, 1, 6, 7 }, // Quechua/Latin/Bolivia { 93, 7, 63, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 192,18 , 37,5 , 8,10 , 8308,28 , 8336,53 , 8389,14 , 8308,28 , 8336,53 , 8389,14 , 64,4 , 61,4 , 45,4 , 5,17 , 22,23 , {85,83,68}, 6,1 , 11165,37 , 8,5 , 4,0 , 3457,8 , 3476,7 , 2, 1, 1, 6, 7 }, // Quechua/Latin/Ecuador - { 94, 7, 206, 46, 8217, 59, 37, 48, 8722, 43, 101, 171, 187, 8249, 8250, 0,6 , 0,6 , 250,7 , 250,7 , 339,8 , 1068,23 , 37,5 , 8,10 , 8403,23 , 8426,56 , 8482,14 , 8403,23 , 8426,56 , 8482,14 , 0,2 , 0,2 , 0,5 , 5,17 , 22,23 , {67,72,70}, 228,3 , 11202,48 , 19,5 , 4,0 , 3483,9 , 3492,6 , 2, 0, 1, 6, 7 }, // Romansh/Latin/Switzerland - { 95, 7, 177, 44, 46, 59, 37, 48, 45, 43, 101, 8222, 8221, 171, 187, 0,6 , 0,6 , 610,8 , 610,8 , 495,10 , 10,17 , 37,5 , 8,10 , 8496,34 , 8530,48 , 3107,14 , 8496,34 , 8530,48 , 3107,14 , 64,4 , 61,4 , 824,4 , 5,17 , 22,23 , {82,79,78}, 292,3 , 11250,57 , 19,5 , 24,7 , 3498,6 , 3504,7 , 2, 1, 1, 6, 7 }, // Romanian/Latin/Romania - { 95, 7, 141, 44, 46, 59, 37, 48, 45, 43, 101, 8222, 8221, 171, 187, 0,6 , 0,6 , 610,8 , 610,8 , 495,10 , 10,17 , 37,5 , 8,10 , 8578,28 , 8530,48 , 8606,16 , 8578,28 , 8530,48 , 8606,16 , 64,4 , 61,4 , 824,4 , 5,17 , 22,23 , {77,68,76}, 295,1 , 11307,69 , 19,5 , 24,7 , 3498,6 , 3511,17 , 2, 1, 1, 6, 7 }, // Romanian/Latin/Moldova - { 96, 2, 178, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8222, 8220, 0,6 , 0,6 , 111,7 , 111,7 , 495,10 , 317,22 , 37,5 , 8,10 , 8622,21 , 8643,62 , 8705,14 , 8622,21 , 8643,62 , 8622,21 , 0,2 , 0,2 , 269,5 , 728,17 , 22,23 , {82,85,66}, 123,1 , 11376,89 , 19,5 , 4,0 , 3528,7 , 3535,6 , 2, 1, 1, 6, 7 }, // Russian/Cyrillic/Russia - { 96, 2, 20, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8222, 8220, 0,6 , 0,6 , 111,7 , 111,7 , 495,10 , 317,22 , 37,5 , 8,10 , 8622,21 , 8643,62 , 8705,14 , 8622,21 , 8643,62 , 8622,21 , 0,2 , 0,2 , 269,5 , 728,17 , 22,23 , {66,89,78}, 0,2 , 11465,94 , 19,5 , 4,0 , 3528,7 , 510,8 , 2, 0, 1, 6, 7 }, // Russian/Cyrillic/Belarus - { 96, 2, 110, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8222, 8220, 0,6 , 0,6 , 111,7 , 111,7 , 495,10 , 317,22 , 37,5 , 8,10 , 8622,21 , 8643,62 , 8705,14 , 8622,21 , 8643,62 , 8622,21 , 0,2 , 0,2 , 269,5 , 728,17 , 22,23 , {75,90,84}, 248,1 , 11559,83 , 19,5 , 4,0 , 3528,7 , 3541,9 , 2, 1, 1, 6, 7 }, // Russian/Cyrillic/Kazakhstan - { 96, 2, 116, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8222, 8220, 0,6 , 0,6 , 111,7 , 111,7 , 495,10 , 317,22 , 37,5 , 8,10 , 8622,21 , 8643,62 , 8705,14 , 8622,21 , 8643,62 , 8622,21 , 0,2 , 0,2 , 269,5 , 728,17 , 22,23 , {75,71,83}, 249,3 , 11642,82 , 19,5 , 4,0 , 3528,7 , 3550,8 , 2, 1, 1, 6, 7 }, // Russian/Cyrillic/Kyrgyzstan - { 96, 2, 141, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8222, 8220, 0,6 , 0,6 , 111,7 , 111,7 , 495,10 , 317,22 , 37,5 , 8,10 , 8622,21 , 8643,62 , 8705,14 , 8622,21 , 8643,62 , 8622,21 , 0,2 , 0,2 , 269,5 , 728,17 , 22,23 , {77,68,76}, 295,1 , 11724,79 , 19,5 , 4,0 , 3528,7 , 3558,7 , 2, 1, 1, 6, 7 }, // Russian/Cyrillic/Moldova - { 96, 2, 222, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8222, 8220, 0,6 , 0,6 , 111,7 , 111,7 , 495,10 , 317,22 , 37,5 , 8,10 , 8622,21 , 8643,62 , 8705,14 , 8622,21 , 8643,62 , 8622,21 , 0,2 , 0,2 , 269,5 , 728,17 , 22,23 , {85,65,72}, 296,1 , 11803,92 , 19,5 , 4,0 , 3528,7 , 3565,7 , 2, 1, 1, 6, 7 }, // Russian/Cyrillic/Ukraine + { 94, 7, 206, 46, 8217, 59, 37, 48, 8722, 43, 101, 171, 187, 8249, 8250, 0,6 , 0,6 , 250,7 , 250,7 , 339,8 , 1068,23 , 37,5 , 8,10 , 8403,23 , 8426,56 , 8482,14 , 8403,23 , 8426,56 , 8482,14 , 0,2 , 0,2 , 0,5 , 5,17 , 22,23 , {67,72,70}, 230,3 , 11202,48 , 19,5 , 4,0 , 3483,9 , 3492,6 , 2, 0, 1, 6, 7 }, // Romansh/Latin/Switzerland + { 95, 7, 177, 44, 46, 59, 37, 48, 45, 43, 101, 8222, 8221, 171, 187, 0,6 , 0,6 , 610,8 , 610,8 , 495,10 , 10,17 , 37,5 , 8,10 , 8496,34 , 8530,48 , 3107,14 , 8496,34 , 8530,48 , 3107,14 , 64,4 , 61,4 , 762,4 , 5,17 , 22,23 , {82,79,78}, 294,3 , 11250,57 , 19,5 , 24,7 , 3498,6 , 3504,7 , 2, 1, 1, 6, 7 }, // Romanian/Latin/Romania + { 95, 7, 141, 44, 46, 59, 37, 48, 45, 43, 101, 8222, 8221, 171, 187, 0,6 , 0,6 , 610,8 , 610,8 , 495,10 , 10,17 , 37,5 , 8,10 , 8578,28 , 8530,48 , 8606,16 , 8578,28 , 8530,48 , 8606,16 , 64,4 , 61,4 , 762,4 , 5,17 , 22,23 , {77,68,76}, 297,1 , 11307,69 , 19,5 , 24,7 , 3498,6 , 3511,17 , 2, 1, 1, 6, 7 }, // Romanian/Latin/Moldova + { 96, 2, 178, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8222, 8220, 0,6 , 0,6 , 111,7 , 111,7 , 495,10 , 317,22 , 37,5 , 8,10 , 8622,21 , 8643,62 , 8705,14 , 8622,21 , 8643,62 , 8622,21 , 0,2 , 0,2 , 257,5 , 708,17 , 22,23 , {82,85,66}, 123,1 , 11376,89 , 19,5 , 4,0 , 3528,7 , 3535,6 , 2, 1, 1, 6, 7 }, // Russian/Cyrillic/Russia + { 96, 2, 20, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8222, 8220, 0,6 , 0,6 , 111,7 , 111,7 , 495,10 , 317,22 , 37,5 , 8,10 , 8622,21 , 8643,62 , 8705,14 , 8622,21 , 8643,62 , 8622,21 , 0,2 , 0,2 , 257,5 , 708,17 , 22,23 , {66,89,78}, 0,2 , 11465,94 , 19,5 , 4,0 , 3528,7 , 510,8 , 2, 0, 1, 6, 7 }, // Russian/Cyrillic/Belarus + { 96, 2, 110, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8222, 8220, 0,6 , 0,6 , 111,7 , 111,7 , 495,10 , 317,22 , 37,5 , 8,10 , 8622,21 , 8643,62 , 8705,14 , 8622,21 , 8643,62 , 8622,21 , 0,2 , 0,2 , 257,5 , 708,17 , 22,23 , {75,90,84}, 250,1 , 11559,83 , 19,5 , 4,0 , 3528,7 , 3541,9 , 2, 1, 1, 6, 7 }, // Russian/Cyrillic/Kazakhstan + { 96, 2, 116, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8222, 8220, 0,6 , 0,6 , 111,7 , 111,7 , 495,10 , 317,22 , 37,5 , 8,10 , 8622,21 , 8643,62 , 8705,14 , 8622,21 , 8643,62 , 8622,21 , 0,2 , 0,2 , 257,5 , 708,17 , 22,23 , {75,71,83}, 251,3 , 11642,82 , 19,5 , 4,0 , 3528,7 , 3550,8 , 2, 1, 1, 6, 7 }, // Russian/Cyrillic/Kyrgyzstan + { 96, 2, 141, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8222, 8220, 0,6 , 0,6 , 111,7 , 111,7 , 495,10 , 317,22 , 37,5 , 8,10 , 8622,21 , 8643,62 , 8705,14 , 8622,21 , 8643,62 , 8622,21 , 0,2 , 0,2 , 257,5 , 708,17 , 22,23 , {77,68,76}, 297,1 , 11724,79 , 19,5 , 4,0 , 3528,7 , 3558,7 , 2, 1, 1, 6, 7 }, // Russian/Cyrillic/Moldova + { 96, 2, 222, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8222, 8220, 0,6 , 0,6 , 111,7 , 111,7 , 495,10 , 317,22 , 37,5 , 8,10 , 8622,21 , 8643,62 , 8705,14 , 8622,21 , 8643,62 , 8622,21 , 0,2 , 0,2 , 257,5 , 708,17 , 22,23 , {85,65,72}, 298,1 , 11803,92 , 19,5 , 4,0 , 3528,7 , 3565,7 , 2, 1, 1, 6, 7 }, // Russian/Cyrillic/Ukraine { 98, 7, 41, 44, 46, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 37,5 , 8,10 , 8719,28 , 8747,66 , 8813,14 , 8719,28 , 8747,66 , 8813,14 , 229,2 , 219,2 , 45,4 , 5,17 , 22,23 , {88,65,70}, 32,4 , 11895,25 , 4,4 , 44,5 , 3572,5 , 3577,22 , 0, 0, 1, 6, 7 }, // Sango/Latin/Central African Republic { 99, 13, 100, 46, 44, 59, 37, 2406, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 618,10 , 628,9 , 269,6 , 10,17 , 18,7 , 25,12 , 4304,32 , 8827,67 , 4389,19 , 4304,32 , 8827,67 , 4389,19 , 193,9 , 186,7 , 45,4 , 5,17 , 22,23 , {73,78,82}, 121,1 , 11920,37 , 8,5 , 4,0 , 3599,12 , 3611,5 , 2, 1, 7, 7, 7 }, // Sanskrit/Devanagari/India - { 100, 2, 243, 44, 46, 59, 37, 48, 45, 43, 101, 8222, 8220, 8216, 8216, 0,6 , 0,6 , 111,7 , 111,7 , 1091,7 , 1098,20 , 37,5 , 8,10 , 8894,28 , 8922,52 , 8974,14 , 8894,28 , 8922,52 , 8974,14 , 231,9 , 221,8 , 828,7 , 5,17 , 22,23 , {82,83,68}, 297,3 , 11957,58 , 19,5 , 24,7 , 3616,6 , 3622,6 , 0, 0, 1, 6, 7 }, // Serbian/Cyrillic/Serbia - { 100, 7, 27, 44, 46, 59, 37, 48, 45, 43, 101, 8222, 8220, 8216, 8216, 0,6 , 0,6 , 159,7 , 159,7 , 1091,7 , 1098,20 , 37,5 , 8,10 , 2043,28 , 2071,58 , 2129,14 , 8988,28 , 2071,58 , 2129,14 , 240,11 , 229,8 , 298,7 , 5,17 , 22,23 , {66,65,77}, 144,2 , 12015,170 , 19,5 , 24,7 , 3628,6 , 629,19 , 2, 1, 1, 6, 7 }, // Serbian/Latin/Bosnia And Herzegowina - { 100, 7, 242, 44, 46, 59, 37, 48, 45, 43, 101, 8222, 8220, 8216, 8216, 0,6 , 0,6 , 159,7 , 159,7 , 1091,7 , 1098,20 , 37,5 , 8,10 , 8988,28 , 9016,57 , 2129,14 , 8988,28 , 9016,57 , 2129,14 , 240,11 , 229,8 , 298,7 , 5,17 , 22,23 , {69,85,82}, 14,1 , 12185,23 , 19,5 , 24,7 , 3628,6 , 3634,9 , 2, 1, 1, 6, 7 }, // Serbian/Latin/Montenegro - { 100, 7, 243, 44, 46, 59, 37, 48, 45, 43, 101, 8222, 8220, 8216, 8216, 0,6 , 0,6 , 159,7 , 159,7 , 1091,7 , 1098,20 , 37,5 , 8,10 , 8988,28 , 9073,54 , 2129,14 , 8988,28 , 9073,54 , 2129,14 , 251,9 , 229,8 , 298,7 , 5,17 , 22,23 , {82,83,68}, 297,3 , 12208,58 , 19,5 , 24,7 , 3628,6 , 3643,6 , 0, 0, 1, 6, 7 }, // Serbian/Latin/Serbia - { 100, 2, 27, 44, 46, 59, 37, 48, 45, 43, 101, 8222, 8220, 8216, 8216, 0,6 , 0,6 , 111,7 , 111,7 , 1091,7 , 1098,20 , 37,5 , 8,10 , 9127,28 , 9155,56 , 8974,14 , 8894,28 , 9155,56 , 8974,14 , 260,11 , 221,8 , 828,7 , 5,17 , 22,23 , {66,65,77}, 300,2 , 12266,170 , 19,5 , 24,7 , 3616,6 , 3649,19 , 2, 1, 1, 6, 7 }, // Serbian/Cyrillic/Bosnia And Herzegowina - { 100, 2, 242, 44, 46, 59, 37, 48, 45, 43, 101, 8222, 8220, 8216, 8216, 0,6 , 0,6 , 111,7 , 111,7 , 1091,7 , 1098,20 , 37,5 , 8,10 , 8894,28 , 9211,55 , 8974,14 , 8894,28 , 9211,55 , 8974,14 , 260,11 , 221,8 , 828,7 , 5,17 , 22,23 , {69,85,82}, 14,1 , 12436,23 , 19,5 , 24,7 , 3616,6 , 3668,9 , 2, 1, 1, 6, 7 }, // Serbian/Cyrillic/Montenegro - { 100, 2, 257, 44, 46, 59, 37, 48, 45, 43, 101, 8222, 8220, 8216, 8216, 0,6 , 0,6 , 111,7 , 111,7 , 1091,7 , 1098,20 , 37,5 , 8,10 , 8894,28 , 8922,52 , 8974,14 , 8894,28 , 8922,52 , 8974,14 , 231,9 , 221,8 , 828,7 , 5,17 , 22,23 , {69,85,82}, 14,1 , 12436,23 , 19,5 , 24,7 , 3616,6 , 3677,6 , 2, 1, 1, 6, 7 }, // Serbian/Cyrillic/Kosovo - { 100, 7, 257, 44, 46, 59, 37, 48, 45, 43, 101, 8222, 8220, 8216, 8216, 0,6 , 0,6 , 159,7 , 159,7 , 1091,7 , 1098,20 , 37,5 , 8,10 , 8988,28 , 9073,54 , 2129,14 , 8988,28 , 9073,54 , 2129,14 , 251,9 , 229,8 , 298,7 , 5,17 , 22,23 , {69,85,82}, 14,1 , 12185,23 , 19,5 , 24,7 , 3628,6 , 3683,6 , 2, 1, 1, 6, 7 }, // Serbian/Latin/Kosovo - { 101, 2, 81, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8222, 8220, 0,6 , 0,6 , 637,9 , 637,9 , 156,8 , 1118,23 , 37,5 , 8,10 , 9266,28 , 9294,61 , 9355,14 , 9369,28 , 9397,61 , 9355,14 , 271,15 , 237,15 , 45,4 , 5,17 , 22,23 , {71,69,76}, 235,1 , 12459,17 , 8,5 , 4,0 , 3689,4 , 3693,11 , 2, 1, 1, 6, 7 }, // Ossetic/Cyrillic/Georgia + { 100, 2, 243, 44, 46, 59, 37, 48, 45, 43, 101, 8222, 8220, 8216, 8216, 0,6 , 0,6 , 111,7 , 111,7 , 1091,7 , 1098,20 , 37,5 , 8,10 , 8894,28 , 8922,52 , 8974,14 , 8894,28 , 8922,52 , 8974,14 , 231,9 , 221,8 , 766,7 , 5,17 , 22,23 , {82,83,68}, 299,3 , 11957,58 , 19,5 , 24,7 , 3616,6 , 3622,6 , 0, 0, 1, 6, 7 }, // Serbian/Cyrillic/Serbia + { 100, 7, 27, 44, 46, 59, 37, 48, 45, 43, 101, 8222, 8220, 8216, 8216, 0,6 , 0,6 , 159,7 , 159,7 , 1091,7 , 1098,20 , 37,5 , 8,10 , 2043,28 , 2071,58 , 2129,14 , 8988,28 , 2071,58 , 2129,14 , 240,11 , 229,8 , 286,7 , 5,17 , 22,23 , {66,65,77}, 144,2 , 12015,170 , 19,5 , 24,7 , 3628,6 , 629,19 , 2, 1, 1, 6, 7 }, // Serbian/Latin/Bosnia And Herzegowina + { 100, 7, 242, 44, 46, 59, 37, 48, 45, 43, 101, 8222, 8220, 8216, 8216, 0,6 , 0,6 , 159,7 , 159,7 , 1091,7 , 1098,20 , 37,5 , 8,10 , 8988,28 , 9016,57 , 2129,14 , 8988,28 , 9016,57 , 2129,14 , 240,11 , 229,8 , 286,7 , 5,17 , 22,23 , {69,85,82}, 14,1 , 12185,23 , 19,5 , 24,7 , 3628,6 , 3634,9 , 2, 1, 1, 6, 7 }, // Serbian/Latin/Montenegro + { 100, 7, 243, 44, 46, 59, 37, 48, 45, 43, 101, 8222, 8220, 8216, 8216, 0,6 , 0,6 , 159,7 , 159,7 , 1091,7 , 1098,20 , 37,5 , 8,10 , 8988,28 , 9073,54 , 2129,14 , 8988,28 , 9073,54 , 2129,14 , 251,9 , 229,8 , 286,7 , 5,17 , 22,23 , {82,83,68}, 299,3 , 12208,58 , 19,5 , 24,7 , 3628,6 , 3643,6 , 0, 0, 1, 6, 7 }, // Serbian/Latin/Serbia + { 100, 2, 27, 44, 46, 59, 37, 48, 45, 43, 101, 8222, 8220, 8216, 8216, 0,6 , 0,6 , 111,7 , 111,7 , 1091,7 , 1098,20 , 37,5 , 8,10 , 9127,28 , 9155,56 , 8974,14 , 8894,28 , 9155,56 , 8974,14 , 260,11 , 221,8 , 766,7 , 5,17 , 22,23 , {66,65,77}, 302,2 , 12266,170 , 19,5 , 24,7 , 3616,6 , 3649,19 , 2, 1, 1, 6, 7 }, // Serbian/Cyrillic/Bosnia And Herzegowina + { 100, 2, 242, 44, 46, 59, 37, 48, 45, 43, 101, 8222, 8220, 8216, 8216, 0,6 , 0,6 , 111,7 , 111,7 , 1091,7 , 1098,20 , 37,5 , 8,10 , 8894,28 , 9211,55 , 8974,14 , 8894,28 , 9211,55 , 8974,14 , 260,11 , 221,8 , 766,7 , 5,17 , 22,23 , {69,85,82}, 14,1 , 12436,23 , 19,5 , 24,7 , 3616,6 , 3668,9 , 2, 1, 1, 6, 7 }, // Serbian/Cyrillic/Montenegro + { 100, 2, 257, 44, 46, 59, 37, 48, 45, 43, 101, 8222, 8220, 8216, 8216, 0,6 , 0,6 , 111,7 , 111,7 , 1091,7 , 1098,20 , 37,5 , 8,10 , 8894,28 , 8922,52 , 8974,14 , 8894,28 , 8922,52 , 8974,14 , 231,9 , 221,8 , 766,7 , 5,17 , 22,23 , {69,85,82}, 14,1 , 12436,23 , 19,5 , 24,7 , 3616,6 , 3677,6 , 2, 1, 1, 6, 7 }, // Serbian/Cyrillic/Kosovo + { 100, 7, 257, 44, 46, 59, 37, 48, 45, 43, 101, 8222, 8220, 8216, 8216, 0,6 , 0,6 , 159,7 , 159,7 , 1091,7 , 1098,20 , 37,5 , 8,10 , 8988,28 , 9073,54 , 2129,14 , 8988,28 , 9073,54 , 2129,14 , 251,9 , 229,8 , 286,7 , 5,17 , 22,23 , {69,85,82}, 14,1 , 12185,23 , 19,5 , 24,7 , 3628,6 , 3683,6 , 2, 1, 1, 6, 7 }, // Serbian/Latin/Kosovo + { 101, 2, 81, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8222, 8220, 0,6 , 0,6 , 637,9 , 637,9 , 156,8 , 1118,23 , 37,5 , 8,10 , 9266,28 , 9294,61 , 9355,14 , 9369,28 , 9397,61 , 9355,14 , 271,15 , 237,15 , 45,4 , 5,17 , 22,23 , {71,69,76}, 237,1 , 12459,17 , 8,5 , 4,0 , 3689,4 , 3693,11 , 2, 1, 1, 6, 7 }, // Ossetic/Cyrillic/Georgia { 101, 2, 178, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8222, 8220, 0,6 , 0,6 , 637,9 , 637,9 , 156,8 , 1118,23 , 37,5 , 8,10 , 9266,28 , 9294,61 , 9355,14 , 9369,28 , 9397,61 , 9355,14 , 271,15 , 237,15 , 45,4 , 5,17 , 22,23 , {82,85,66}, 123,1 , 12476,17 , 8,5 , 4,0 , 3689,4 , 3704,6 , 2, 1, 1, 6, 7 }, // Ossetic/Cyrillic/Russia { 102, 7, 195, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {90,65,82}, 5,1 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 7, 6, 7 }, // Southern Sotho/Latin/South Africa { 103, 7, 195, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {90,65,82}, 5,1 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 7, 6, 7 }, // Tswana/Latin/South Africa { 104, 7, 240, 46, 44, 59, 37, 48, 45, 43, 101, 8221, 8221, 8217, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 9458,28 , 9486,55 , 9541,14 , 9458,28 , 9486,55 , 9541,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {85,83,68}, 159,3 , 12493,22 , 4,4 , 13,6 , 3710,8 , 1819,8 , 2, 1, 7, 6, 7 }, // Shona/Latin/Zimbabwe - { 105, 1, 163, 1643, 1644, 1563, 37, 1632, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 646,8 , 654,7 , 53,10 , 63,17 , 18,7 , 25,12 , 9555,35 , 9555,35 , 9590,31 , 9555,35 , 9555,35 , 9590,31 , 286,11 , 252,11 , 835,6 , 841,25 , 22,23 , {80,75,82}, 176,2 , 12515,43 , 19,5 , 4,0 , 3718,4 , 3722,7 , 2, 0, 7, 6, 7 }, // Sindhi/Arabic/Pakistan + { 105, 1, 163, 1643, 1644, 1563, 37, 1632, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 646,8 , 654,7 , 53,10 , 63,17 , 18,7 , 25,12 , 9555,35 , 9555,35 , 9590,31 , 9555,35 , 9555,35 , 9590,31 , 286,11 , 252,11 , 773,6 , 779,25 , 22,23 , {80,75,82}, 176,2 , 12515,43 , 19,5 , 4,0 , 3718,4 , 3722,7 , 2, 0, 7, 6, 7 }, // Sindhi/Arabic/Pakistan { 105, 13, 100, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 269,6 , 10,17 , 393,7 , 437,12 , 9621,25 , 9646,27 , 9673,20 , 9693,28 , 9721,41 , 9762,19 , 297,16 , 263,13 , 45,4 , 5,17 , 22,23 , {73,78,82}, 121,1 , 12558,24 , 8,5 , 4,0 , 3729,6 , 2666,4 , 2, 1, 7, 7, 7 }, // Sindhi/Devanagari/India - { 106, 32, 198, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 661,9 , 670,8 , 53,10 , 63,17 , 239,5 , 244,10 , 9781,39 , 9820,62 , 9882,19 , 9781,39 , 9820,62 , 9882,19 , 313,5 , 276,4 , 866,5 , 871,42 , 22,23 , {76,75,82}, 302,3 , 12582,58 , 4,4 , 13,6 , 3735,5 , 3740,11 , 2, 1, 1, 6, 7 }, // Sinhala/Sinhala/Sri Lanka + { 106, 32, 198, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 661,9 , 670,8 , 53,10 , 63,17 , 239,5 , 244,10 , 9781,39 , 9820,62 , 9882,19 , 9781,39 , 9820,62 , 9882,19 , 313,5 , 276,4 , 804,5 , 809,42 , 22,23 , {76,75,82}, 304,3 , 12582,58 , 4,4 , 13,6 , 3735,5 , 3740,11 , 2, 1, 1, 6, 7 }, // Sinhala/Sinhala/Sri Lanka { 107, 7, 195, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {90,65,82}, 5,1 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 7, 6, 7 }, // Swati/Latin/South Africa - { 108, 7, 191, 44, 160, 59, 37, 48, 45, 43, 101, 8222, 8220, 8218, 8216, 0,6 , 0,6 , 181,7 , 678,7 , 1141,10 , 478,17 , 55,4 , 59,9 , 9901,21 , 9922,52 , 9974,14 , 9901,21 , 9922,52 , 9974,14 , 0,2 , 0,2 , 305,5 , 5,17 , 22,23 , {69,85,82}, 14,1 , 12640,26 , 19,5 , 24,7 , 3751,10 , 3761,9 , 2, 1, 1, 6, 7 }, // Slovak/Latin/Slovakia + { 108, 7, 191, 44, 160, 59, 37, 48, 45, 43, 101, 8222, 8220, 8218, 8216, 0,6 , 0,6 , 181,7 , 678,7 , 1141,10 , 478,17 , 55,4 , 59,9 , 9901,21 , 9922,52 , 9974,14 , 9901,21 , 9922,52 , 9974,14 , 0,2 , 0,2 , 293,5 , 5,17 , 22,23 , {69,85,82}, 14,1 , 12640,26 , 19,5 , 24,7 , 3751,10 , 3761,9 , 2, 1, 1, 6, 7 }, // Slovak/Latin/Slovakia { 109, 7, 192, 44, 46, 59, 37, 48, 8722, 43, 101, 8222, 8220, 8218, 8216, 0,6 , 0,6 , 685,8 , 685,8 , 1151,9 , 1160,19 , 37,5 , 8,10 , 9988,35 , 10023,52 , 10075,14 , 9988,35 , 10023,52 , 10075,14 , 60,4 , 280,4 , 54,4 , 5,17 , 22,23 , {69,85,82}, 14,1 , 12666,28 , 19,5 , 24,7 , 3770,11 , 3781,9 , 2, 1, 1, 6, 7 }, // Slovenian/Latin/Slovenia - { 110, 7, 194, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 693,9 , 693,9 , 27,8 , 1179,19 , 18,7 , 25,12 , 10089,32 , 10121,47 , 10168,15 , 10089,32 , 10121,47 , 10168,15 , 318,2 , 284,2 , 913,6 , 919,17 , 22,23 , {83,79,83}, 94,1 , 12694,27 , 4,4 , 13,6 , 3790,8 , 3798,10 , 0, 0, 1, 6, 7 }, // Somali/Latin/Somalia - { 110, 7, 59, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 693,9 , 693,9 , 27,8 , 1179,19 , 18,7 , 25,12 , 10089,32 , 10121,47 , 10168,15 , 10089,32 , 10121,47 , 10168,15 , 318,2 , 284,2 , 913,6 , 919,17 , 22,23 , {68,74,70}, 38,3 , 12721,50 , 4,4 , 13,6 , 3790,8 , 3808,7 , 0, 0, 6, 6, 7 }, // Somali/Latin/Djibouti - { 110, 7, 69, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 693,9 , 693,9 , 27,8 , 1179,19 , 18,7 , 25,12 , 10089,32 , 10121,47 , 10168,15 , 10089,32 , 10121,47 , 10168,15 , 318,2 , 284,2 , 913,6 , 919,17 , 22,23 , {69,84,66}, 0,2 , 12771,52 , 4,4 , 13,6 , 3790,8 , 3815,8 , 2, 1, 7, 6, 7 }, // Somali/Latin/Ethiopia - { 110, 7, 111, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 693,9 , 693,9 , 27,8 , 1179,19 , 37,5 , 8,10 , 10089,32 , 10121,47 , 10168,15 , 10089,32 , 10121,47 , 10168,15 , 318,2 , 284,2 , 913,6 , 919,17 , 22,23 , {75,69,83}, 2,3 , 12823,52 , 4,4 , 13,6 , 3790,8 , 1191,5 , 2, 1, 7, 6, 7 }, // Somali/Latin/Kenya + { 110, 7, 194, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 693,9 , 693,9 , 27,8 , 1179,19 , 18,7 , 25,12 , 10089,32 , 10121,47 , 10168,15 , 10089,32 , 10121,47 , 10168,15 , 318,2 , 284,2 , 851,6 , 857,17 , 22,23 , {83,79,83}, 94,1 , 12694,27 , 4,4 , 13,6 , 3790,8 , 3798,10 , 0, 0, 1, 6, 7 }, // Somali/Latin/Somalia + { 110, 7, 59, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 693,9 , 693,9 , 27,8 , 1179,19 , 18,7 , 25,12 , 10089,32 , 10121,47 , 10168,15 , 10089,32 , 10121,47 , 10168,15 , 318,2 , 284,2 , 851,6 , 857,17 , 22,23 , {68,74,70}, 38,3 , 12721,50 , 4,4 , 13,6 , 3790,8 , 3808,7 , 0, 0, 6, 6, 7 }, // Somali/Latin/Djibouti + { 110, 7, 69, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 693,9 , 693,9 , 27,8 , 1179,19 , 18,7 , 25,12 , 10089,32 , 10121,47 , 10168,15 , 10089,32 , 10121,47 , 10168,15 , 318,2 , 284,2 , 851,6 , 857,17 , 22,23 , {69,84,66}, 0,2 , 12771,52 , 4,4 , 13,6 , 3790,8 , 3815,8 , 2, 1, 7, 6, 7 }, // Somali/Latin/Ethiopia + { 110, 7, 111, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 693,9 , 693,9 , 27,8 , 1179,19 , 37,5 , 8,10 , 10089,32 , 10121,47 , 10168,15 , 10089,32 , 10121,47 , 10168,15 , 318,2 , 284,2 , 851,6 , 857,17 , 22,23 , {75,69,83}, 2,3 , 12823,52 , 4,4 , 13,6 , 3790,8 , 1191,5 , 2, 1, 7, 6, 7 }, // Somali/Latin/Kenya { 111, 7, 197, 44, 46, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 702,7 , 702,7 , 269,6 , 669,27 , 55,4 , 198,11 , 10183,28 , 10211,53 , 8389,14 , 10183,28 , 10211,53 , 8389,14 , 53,5 , 50,5 , 0,5 , 5,17 , 22,23 , {69,85,82}, 14,1 , 3102,20 , 19,5 , 4,0 , 3823,17 , 2431,6 , 2, 1, 1, 6, 7 }, // Spanish/Latin/Spain { 111, 7, 10, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 702,7 , 702,7 , 269,6 , 669,27 , 37,5 , 8,10 , 10264,35 , 10211,53 , 3107,14 , 10183,28 , 10211,53 , 3107,14 , 53,5 , 50,5 , 0,5 , 5,17 , 22,23 , {65,82,83}, 6,1 , 12875,51 , 8,5 , 37,7 , 3840,7 , 3847,9 , 2, 1, 1, 6, 7 }, // Spanish/Latin/Argentina { 111, 7, 22, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 702,7 , 702,7 , 269,6 , 669,27 , 37,5 , 8,10 , 10264,35 , 10211,53 , 3107,14 , 10183,28 , 10211,53 , 4796,14 , 53,5 , 50,5 , 0,5 , 5,17 , 22,23 , {66,90,68}, 6,1 , 12926,52 , 4,4 , 4,0 , 3840,7 , 3856,6 , 2, 1, 7, 6, 7 }, // Spanish/Latin/Belize - { 111, 7, 26, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 702,7 , 702,7 , 269,6 , 669,27 , 37,5 , 8,10 , 10264,35 , 10211,53 , 3107,14 , 10183,28 , 10211,53 , 4796,14 , 53,5 , 50,5 , 0,5 , 5,17 , 22,23 , {66,79,66}, 290,2 , 12978,35 , 4,4 , 4,0 , 3840,7 , 3469,7 , 2, 1, 1, 6, 7 }, // Spanish/Latin/Bolivia - { 111, 7, 30, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 702,7 , 702,7 , 269,6 , 669,27 , 37,5 , 8,10 , 10264,35 , 10211,53 , 3107,14 , 10183,28 , 10211,53 , 4796,14 , 53,5 , 50,5 , 0,5 , 5,17 , 22,23 , {66,82,76}, 279,2 , 13013,52 , 4,4 , 4,0 , 3840,7 , 3292,6 , 2, 1, 7, 6, 7 }, // Spanish/Latin/Brazil + { 111, 7, 26, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 702,7 , 702,7 , 269,6 , 669,27 , 37,5 , 8,10 , 10264,35 , 10211,53 , 3107,14 , 10183,28 , 10211,53 , 4796,14 , 53,5 , 50,5 , 0,5 , 5,17 , 22,23 , {66,79,66}, 292,2 , 12978,35 , 4,4 , 4,0 , 3840,7 , 3469,7 , 2, 1, 1, 6, 7 }, // Spanish/Latin/Bolivia + { 111, 7, 30, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 702,7 , 702,7 , 269,6 , 669,27 , 37,5 , 8,10 , 10264,35 , 10211,53 , 3107,14 , 10183,28 , 10211,53 , 4796,14 , 53,5 , 50,5 , 0,5 , 5,17 , 22,23 , {66,82,76}, 281,2 , 13013,52 , 4,4 , 4,0 , 3840,7 , 3292,6 , 2, 1, 7, 6, 7 }, // Spanish/Latin/Brazil { 111, 7, 43, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 702,7 , 702,7 , 339,8 , 669,27 , 37,5 , 8,10 , 10264,35 , 10211,53 , 3107,14 , 10183,28 , 10211,53 , 4796,14 , 53,5 , 50,5 , 0,5 , 5,17 , 22,23 , {67,76,80}, 6,1 , 13065,45 , 4,4 , 4,0 , 3840,7 , 3862,5 , 0, 0, 1, 6, 7 }, // Spanish/Latin/Chile { 111, 7, 47, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 702,7 , 702,7 , 571,7 , 669,27 , 18,7 , 25,12 , 10264,35 , 10211,53 , 4796,14 , 10183,28 , 10211,53 , 3107,14 , 53,5 , 50,5 , 0,5 , 5,17 , 22,23 , {67,79,80}, 6,1 , 13110,54 , 4,4 , 4,0 , 3840,7 , 3867,8 , 2, 0, 7, 6, 7 }, // Spanish/Latin/Colombia - { 111, 7, 52, 44, 160, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 702,7 , 702,7 , 269,6 , 669,27 , 37,5 , 8,10 , 10264,35 , 10211,53 , 3107,14 , 10183,28 , 10211,53 , 4796,14 , 53,5 , 50,5 , 0,5 , 5,17 , 22,23 , {67,82,67}, 305,1 , 13164,67 , 4,4 , 4,0 , 3840,7 , 3875,10 , 2, 0, 1, 6, 7 }, // Spanish/Latin/Costa Rica + { 111, 7, 52, 44, 160, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 702,7 , 702,7 , 269,6 , 669,27 , 37,5 , 8,10 , 10264,35 , 10211,53 , 3107,14 , 10183,28 , 10211,53 , 4796,14 , 53,5 , 50,5 , 0,5 , 5,17 , 22,23 , {67,82,67}, 307,1 , 13164,67 , 4,4 , 4,0 , 3840,7 , 3875,10 , 2, 0, 1, 6, 7 }, // Spanish/Latin/Costa Rica { 111, 7, 55, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 702,7 , 702,7 , 269,6 , 669,27 , 37,5 , 8,10 , 10264,35 , 10211,53 , 3107,14 , 10183,28 , 10211,53 , 4796,14 , 53,5 , 50,5 , 0,5 , 5,17 , 22,23 , {67,85,80}, 6,1 , 13231,42 , 4,4 , 4,0 , 3840,7 , 3885,4 , 2, 1, 1, 6, 7 }, // Spanish/Latin/Cuba - { 111, 7, 61, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 702,7 , 702,7 , 269,6 , 669,27 , 18,7 , 25,12 , 10264,35 , 10211,53 , 3107,14 , 10183,28 , 10211,53 , 3107,14 , 53,5 , 50,5 , 0,5 , 5,17 , 22,23 , {68,79,80}, 306,3 , 13273,54 , 4,4 , 13,6 , 3840,7 , 3889,20 , 2, 1, 7, 6, 7 }, // Spanish/Latin/Dominican Republic + { 111, 7, 61, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 702,7 , 702,7 , 269,6 , 669,27 , 18,7 , 25,12 , 10264,35 , 10211,53 , 3107,14 , 10183,28 , 10211,53 , 3107,14 , 53,5 , 50,5 , 0,5 , 5,17 , 22,23 , {68,79,80}, 308,3 , 13273,54 , 4,4 , 13,6 , 3840,7 , 3889,20 , 2, 1, 7, 6, 7 }, // Spanish/Latin/Dominican Republic { 111, 7, 63, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 702,7 , 702,7 , 269,6 , 669,27 , 37,5 , 8,10 , 10264,35 , 10211,53 , 3107,14 , 10183,28 , 10211,53 , 4796,14 , 53,5 , 50,5 , 0,5 , 5,17 , 22,23 , {85,83,68}, 6,1 , 13327,70 , 4,4 , 4,0 , 3840,7 , 3476,7 , 2, 1, 1, 6, 7 }, // Spanish/Latin/Ecuador { 111, 7, 65, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 702,7 , 702,7 , 269,6 , 669,27 , 37,5 , 8,10 , 10264,35 , 10211,53 , 3107,14 , 10183,28 , 10211,53 , 4796,14 , 53,5 , 50,5 , 0,5 , 5,17 , 22,23 , {85,83,68}, 6,1 , 13327,70 , 4,4 , 4,0 , 3840,7 , 3909,11 , 2, 1, 7, 6, 7 }, // Spanish/Latin/El Salvador { 111, 7, 66, 44, 46, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 702,7 , 702,7 , 269,6 , 669,27 , 55,4 , 198,11 , 10183,28 , 10211,53 , 8389,14 , 10183,28 , 10211,53 , 8389,14 , 53,5 , 50,5 , 0,5 , 5,17 , 22,23 , {88,65,70}, 32,4 , 13397,92 , 19,5 , 4,0 , 3840,7 , 3920,17 , 0, 0, 1, 6, 7 }, // Spanish/Latin/Equatorial Guinea - { 111, 7, 90, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 702,7 , 702,7 , 571,7 , 669,27 , 37,5 , 8,10 , 10264,35 , 10211,53 , 3107,14 , 10183,28 , 10211,53 , 4796,14 , 53,5 , 50,5 , 0,5 , 5,17 , 22,23 , {71,84,81}, 309,1 , 13489,30 , 4,4 , 4,0 , 3840,7 , 3937,9 , 2, 1, 7, 6, 7 }, // Spanish/Latin/Guatemala - { 111, 7, 96, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 702,7 , 702,7 , 269,6 , 1198,27 , 37,5 , 8,10 , 10264,35 , 10211,53 , 3107,14 , 10183,28 , 10211,53 , 4796,14 , 53,5 , 50,5 , 0,5 , 5,17 , 22,23 , {72,78,76}, 295,1 , 13519,60 , 4,4 , 4,0 , 3840,7 , 3946,8 , 2, 1, 7, 6, 7 }, // Spanish/Latin/Honduras + { 111, 7, 90, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 702,7 , 702,7 , 571,7 , 669,27 , 37,5 , 8,10 , 10264,35 , 10211,53 , 3107,14 , 10183,28 , 10211,53 , 4796,14 , 53,5 , 50,5 , 0,5 , 5,17 , 22,23 , {71,84,81}, 311,1 , 13489,30 , 4,4 , 4,0 , 3840,7 , 3937,9 , 2, 1, 7, 6, 7 }, // Spanish/Latin/Guatemala + { 111, 7, 96, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 702,7 , 702,7 , 269,6 , 1198,27 , 37,5 , 8,10 , 10264,35 , 10211,53 , 3107,14 , 10183,28 , 10211,53 , 4796,14 , 53,5 , 50,5 , 0,5 , 5,17 , 22,23 , {72,78,76}, 297,1 , 13519,60 , 4,4 , 4,0 , 3840,7 , 3946,8 , 2, 1, 7, 6, 7 }, // Spanish/Latin/Honduras { 111, 7, 139, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 702,7 , 702,7 , 27,8 , 669,27 , 37,5 , 8,10 , 10264,35 , 10211,53 , 3107,14 , 10183,28 , 10211,53 , 3107,14 , 53,5 , 50,5 , 0,5 , 5,17 , 22,23 , {77,88,78}, 6,1 , 13579,48 , 4,4 , 4,0 , 3954,17 , 3971,6 , 2, 1, 7, 6, 7 }, // Spanish/Latin/Mexico - { 111, 7, 155, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 702,7 , 702,7 , 269,6 , 669,27 , 37,5 , 8,10 , 10264,35 , 10211,53 , 3107,14 , 10183,28 , 10211,53 , 4796,14 , 53,5 , 50,5 , 0,5 , 5,17 , 22,23 , {78,73,79}, 310,2 , 13627,69 , 4,4 , 4,0 , 3840,7 , 3977,9 , 2, 1, 7, 6, 7 }, // Spanish/Latin/Nicaragua - { 111, 7, 166, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 702,7 , 702,7 , 1225,8 , 669,27 , 18,7 , 25,12 , 10264,35 , 10211,53 , 3107,14 , 10183,28 , 10211,53 , 4796,14 , 53,5 , 50,5 , 0,5 , 5,17 , 22,23 , {80,65,66}, 312,3 , 13696,54 , 4,4 , 4,0 , 3840,7 , 3986,6 , 2, 1, 7, 6, 7 }, // Spanish/Latin/Panama - { 111, 7, 168, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 702,7 , 702,7 , 269,6 , 669,27 , 37,5 , 8,10 , 10264,35 , 10211,53 , 3107,14 , 10183,28 , 10211,53 , 4796,14 , 53,5 , 50,5 , 0,5 , 5,17 , 22,23 , {80,89,71}, 315,3 , 13750,61 , 4,4 , 4,0 , 3840,7 , 3992,8 , 0, 0, 7, 6, 7 }, // Spanish/Latin/Paraguay - { 111, 7, 169, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 702,7 , 702,7 , 571,7 , 669,27 , 37,5 , 8,10 , 10264,35 , 10211,53 , 3107,14 , 10183,28 , 10211,53 , 4796,14 , 53,5 , 50,5 , 0,5 , 5,17 , 22,23 , {80,69,78}, 288,2 , 13811,43 , 4,4 , 4,0 , 3840,7 , 3465,4 , 2, 1, 7, 6, 7 }, // Spanish/Latin/Peru + { 111, 7, 155, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 702,7 , 702,7 , 269,6 , 669,27 , 37,5 , 8,10 , 10264,35 , 10211,53 , 3107,14 , 10183,28 , 10211,53 , 4796,14 , 53,5 , 50,5 , 0,5 , 5,17 , 22,23 , {78,73,79}, 312,2 , 13627,69 , 4,4 , 4,0 , 3840,7 , 3977,9 , 2, 1, 7, 6, 7 }, // Spanish/Latin/Nicaragua + { 111, 7, 166, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 702,7 , 702,7 , 1225,8 , 669,27 , 18,7 , 25,12 , 10264,35 , 10211,53 , 3107,14 , 10183,28 , 10211,53 , 4796,14 , 53,5 , 50,5 , 0,5 , 5,17 , 22,23 , {80,65,66}, 314,3 , 13696,54 , 4,4 , 4,0 , 3840,7 , 3986,6 , 2, 1, 7, 6, 7 }, // Spanish/Latin/Panama + { 111, 7, 168, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 702,7 , 702,7 , 269,6 , 669,27 , 37,5 , 8,10 , 10264,35 , 10211,53 , 3107,14 , 10183,28 , 10211,53 , 4796,14 , 53,5 , 50,5 , 0,5 , 5,17 , 22,23 , {80,89,71}, 317,3 , 13750,61 , 4,4 , 4,0 , 3840,7 , 3992,8 , 0, 0, 7, 6, 7 }, // Spanish/Latin/Paraguay + { 111, 7, 169, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 702,7 , 702,7 , 571,7 , 669,27 , 37,5 , 8,10 , 10264,35 , 10211,53 , 3107,14 , 10183,28 , 10211,53 , 4796,14 , 53,5 , 50,5 , 0,5 , 5,17 , 22,23 , {80,69,78}, 290,2 , 13811,43 , 4,4 , 4,0 , 3840,7 , 3465,4 , 2, 1, 7, 6, 7 }, // Spanish/Latin/Peru { 111, 7, 170, 44, 46, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 702,7 , 702,7 , 269,6 , 669,27 , 18,7 , 25,12 , 10183,28 , 10211,53 , 8389,14 , 10183,28 , 10211,53 , 8389,14 , 53,5 , 50,5 , 0,5 , 5,17 , 22,23 , {80,72,80}, 179,1 , 13854,48 , 19,5 , 4,0 , 3840,7 , 4000,9 , 2, 1, 7, 6, 7 }, // Spanish/Latin/Philippines { 111, 7, 174, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 702,7 , 702,7 , 1225,8 , 669,27 , 18,7 , 25,12 , 10264,35 , 10211,53 , 3107,14 , 10183,28 , 10211,53 , 4796,14 , 53,5 , 50,5 , 0,5 , 5,17 , 22,23 , {85,83,68}, 6,1 , 13327,70 , 4,4 , 4,0 , 3840,7 , 1446,11 , 2, 1, 7, 6, 7 }, // Spanish/Latin/Puerto Rico { 111, 7, 225, 46, 44, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 702,7 , 702,7 , 415,8 , 669,27 , 18,7 , 25,12 , 10264,35 , 10211,53 , 3107,14 , 10183,28 , 10211,53 , 3107,14 , 53,5 , 50,5 , 0,5 , 5,17 , 22,23 , {85,83,68}, 6,1 , 13327,70 , 4,4 , 4,0 , 3840,7 , 4009,14 , 2, 1, 7, 6, 7 }, // Spanish/Latin/United States { 111, 7, 227, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 702,7 , 702,7 , 269,6 , 669,27 , 37,5 , 8,10 , 10264,35 , 10211,53 , 3107,14 , 10183,28 , 10211,53 , 4796,14 , 53,5 , 50,5 , 0,5 , 5,17 , 22,23 , {85,89,85}, 6,1 , 13902,48 , 8,5 , 37,7 , 3840,7 , 4023,7 , 2, 1, 1, 6, 7 }, // Spanish/Latin/Uruguay - { 111, 7, 231, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 702,7 , 702,7 , 269,6 , 669,27 , 18,7 , 25,12 , 10264,35 , 10211,53 , 3107,14 , 10183,28 , 10211,53 , 4796,14 , 53,5 , 50,5 , 0,5 , 5,17 , 22,23 , {86,69,83}, 318,4 , 13950,58 , 4,4 , 4,0 , 3840,7 , 4030,9 , 2, 1, 7, 6, 7 }, // Spanish/Latin/Venezuela + { 111, 7, 231, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 702,7 , 702,7 , 269,6 , 669,27 , 18,7 , 25,12 , 10264,35 , 10211,53 , 3107,14 , 10183,28 , 10211,53 , 4796,14 , 53,5 , 50,5 , 0,5 , 5,17 , 22,23 , {86,69,83}, 320,4 , 13950,58 , 4,4 , 4,0 , 3840,7 , 4030,9 , 2, 1, 7, 6, 7 }, // Spanish/Latin/Venezuela { 111, 7, 238, 44, 46, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 702,7 , 702,7 , 269,6 , 669,27 , 55,4 , 198,11 , 10183,28 , 10211,53 , 8389,14 , 10183,28 , 10211,53 , 8389,14 , 53,5 , 50,5 , 0,5 , 5,17 , 22,23 , {69,85,82}, 14,1 , 3102,20 , 19,5 , 4,0 , 3840,7 , 4039,8 , 2, 1, 1, 6, 7 }, // Spanish/Latin/Canary Islands { 111, 7, 246, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 702,7 , 702,7 , 269,6 , 669,27 , 37,5 , 8,10 , 10264,35 , 10211,53 , 3107,14 , 10183,28 , 10211,53 , 4796,14 , 53,5 , 50,5 , 0,5 , 5,17 , 22,23 , {0,0,0}, 0,0 , 2586,0 , 4,4 , 4,0 , 4047,23 , 4070,13 , 2, 1, 1, 6, 7 }, // Spanish/Latin/Latin America { 111, 7, 250, 44, 46, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 702,7 , 702,7 , 269,6 , 669,27 , 55,4 , 198,11 , 10183,28 , 10211,53 , 8389,14 , 10183,28 , 10211,53 , 8389,14 , 53,5 , 50,5 , 0,5 , 5,17 , 22,23 , {69,85,82}, 14,1 , 3102,20 , 19,5 , 4,0 , 3840,7 , 4083,15 , 2, 1, 1, 6, 7 }, // Spanish/Latin/Ceuta And Melilla - { 112, 7, 101, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 709,13 , 722,12 , 269,6 , 10,17 , 254,4 , 258,9 , 10299,28 , 10327,44 , 4697,14 , 10299,28 , 10327,44 , 4697,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {73,68,82}, 242,2 , 14008,37 , 4,4 , 4,0 , 4098,10 , 0,0 , 2, 0, 7, 6, 7 }, // Sundanese/Latin/Indonesia - { 113, 7, 210, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 734,8 , 734,8 , 119,10 , 10,17 , 37,5 , 8,10 , 10371,60 , 10371,60 , 85,14 , 10371,60 , 10371,60 , 85,14 , 0,2 , 0,2 , 675,5 , 936,51 , 22,23 , {84,90,83}, 192,3 , 14045,67 , 8,5 , 4,0 , 4108,9 , 1624,8 , 2, 0, 1, 6, 7 }, // Swahili/Latin/Tanzania - { 113, 7, 49, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 734,8 , 734,8 , 119,10 , 10,17 , 37,5 , 8,10 , 10371,60 , 10371,60 , 85,14 , 10371,60 , 10371,60 , 85,14 , 0,2 , 0,2 , 675,5 , 936,51 , 22,23 , {67,68,70}, 214,2 , 14112,55 , 8,5 , 4,0 , 4108,9 , 4117,32 , 2, 1, 1, 6, 7 }, // Swahili/Latin/Congo Kinshasa - { 113, 7, 111, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 734,8 , 734,8 , 119,10 , 10,17 , 37,5 , 8,10 , 10371,60 , 10371,60 , 85,14 , 10371,60 , 10371,60 , 85,14 , 0,2 , 0,2 , 675,5 , 936,51 , 22,23 , {75,69,83}, 2,3 , 14167,58 , 8,5 , 4,0 , 4108,9 , 1191,5 , 2, 1, 7, 6, 7 }, // Swahili/Latin/Kenya - { 113, 7, 221, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 734,8 , 734,8 , 119,10 , 10,17 , 37,5 , 8,10 , 10371,60 , 10371,60 , 85,14 , 10371,60 , 10371,60 , 85,14 , 0,2 , 0,2 , 675,5 , 936,51 , 22,23 , {85,71,88}, 197,3 , 14225,61 , 8,5 , 4,0 , 4108,9 , 1689,6 , 0, 0, 1, 7, 7 }, // Swahili/Latin/Uganda + { 112, 7, 101, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 709,13 , 722,12 , 269,6 , 10,17 , 254,4 , 258,9 , 10299,28 , 10327,44 , 4697,14 , 10299,28 , 10327,44 , 4697,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {73,68,82}, 244,2 , 14008,37 , 4,4 , 4,0 , 4098,10 , 0,0 , 2, 0, 7, 6, 7 }, // Sundanese/Latin/Indonesia + { 113, 7, 210, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 734,8 , 734,8 , 119,10 , 10,17 , 37,5 , 8,10 , 10371,60 , 10371,60 , 85,14 , 10371,60 , 10371,60 , 85,14 , 0,2 , 0,2 , 655,5 , 874,51 , 22,23 , {84,90,83}, 192,3 , 14045,67 , 8,5 , 4,0 , 4108,9 , 1624,8 , 2, 0, 1, 6, 7 }, // Swahili/Latin/Tanzania + { 113, 7, 49, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 734,8 , 734,8 , 119,10 , 10,17 , 37,5 , 8,10 , 10371,60 , 10371,60 , 85,14 , 10371,60 , 10371,60 , 85,14 , 0,2 , 0,2 , 655,5 , 874,51 , 22,23 , {67,68,70}, 216,2 , 14112,55 , 8,5 , 4,0 , 4108,9 , 4117,32 , 2, 1, 1, 6, 7 }, // Swahili/Latin/Congo Kinshasa + { 113, 7, 111, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 734,8 , 734,8 , 119,10 , 10,17 , 37,5 , 8,10 , 10371,60 , 10371,60 , 85,14 , 10371,60 , 10371,60 , 85,14 , 0,2 , 0,2 , 655,5 , 874,51 , 22,23 , {75,69,83}, 2,3 , 14167,58 , 8,5 , 4,0 , 4108,9 , 1191,5 , 2, 1, 7, 6, 7 }, // Swahili/Latin/Kenya + { 113, 7, 221, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 734,8 , 734,8 , 119,10 , 10,17 , 37,5 , 8,10 , 10371,60 , 10371,60 , 85,14 , 10371,60 , 10371,60 , 85,14 , 0,2 , 0,2 , 655,5 , 874,51 , 22,23 , {85,71,88}, 197,3 , 14225,61 , 8,5 , 4,0 , 4108,9 , 1689,6 , 0, 0, 1, 7, 7 }, // Swahili/Latin/Uganda { 114, 7, 205, 44, 160, 59, 37, 48, 8722, 43, 101, 8221, 8221, 8217, 8217, 0,6 , 0,6 , 742,9 , 742,9 , 53,10 , 97,16 , 37,5 , 8,10 , 10431,29 , 10460,50 , 2320,14 , 10431,29 , 10460,50 , 2320,14 , 320,2 , 286,2 , 45,4 , 5,17 , 22,23 , {83,69,75}, 190,2 , 14286,45 , 19,5 , 4,0 , 4149,7 , 4156,7 , 2, 0, 1, 6, 7 }, // Swedish/Latin/Sweden { 114, 7, 73, 44, 160, 59, 37, 48, 8722, 43, 101, 8221, 8221, 8217, 8217, 0,6 , 0,6 , 742,9 , 742,9 , 53,10 , 97,16 , 37,5 , 8,10 , 10431,29 , 10460,50 , 2320,14 , 10431,29 , 10460,50 , 2320,14 , 320,2 , 286,2 , 45,4 , 5,17 , 22,23 , {69,85,82}, 14,1 , 9130,19 , 19,5 , 4,0 , 4149,7 , 1088,7 , 2, 1, 1, 6, 7 }, // Swedish/Latin/Finland { 114, 7, 248, 44, 160, 59, 37, 48, 8722, 43, 101, 8221, 8221, 8217, 8217, 0,6 , 0,6 , 742,9 , 742,9 , 53,10 , 97,16 , 37,5 , 8,10 , 10431,29 , 10460,50 , 2320,14 , 10431,29 , 10460,50 , 2320,14 , 320,2 , 286,2 , 45,4 , 5,17 , 22,23 , {69,85,82}, 14,1 , 9130,19 , 19,5 , 4,0 , 4149,7 , 4163,5 , 2, 1, 1, 6, 7 }, // Swedish/Latin/Aland Islands { 115, 7, 106, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {69,85,82}, 14,1 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 1, 6, 7 }, // Sardinian/Latin/Italy - { 116, 2, 209, 44, 160, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 27,8 , 553,18 , 37,5 , 8,10 , 10510,28 , 10538,55 , 10593,14 , 10510,28 , 10538,55 , 10593,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {84,74,83}, 322,4 , 14331,19 , 19,5 , 4,0 , 4168,6 , 4174,10 , 2, 1, 1, 6, 7 }, // Tajik/Cyrillic/Tajikistan - { 117, 27, 100, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 751,13 , 751,13 , 269,6 , 192,18 , 393,7 , 437,12 , 10607,39 , 10646,49 , 10695,20 , 10607,39 , 10646,49 , 10695,20 , 322,8 , 288,8 , 987,7 , 5,17 , 22,23 , {73,78,82}, 121,1 , 14350,49 , 4,4 , 13,6 , 4184,5 , 4189,7 , 2, 1, 7, 7, 7 }, // Tamil/Tamil/India - { 117, 27, 130, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 751,13 , 751,13 , 269,6 , 192,18 , 393,7 , 437,12 , 10607,39 , 10646,49 , 10695,20 , 10607,39 , 10646,49 , 10695,20 , 322,8 , 288,8 , 987,7 , 5,17 , 22,23 , {77,89,82}, 174,2 , 14399,61 , 4,4 , 13,6 , 4184,5 , 4196,7 , 2, 1, 1, 6, 7 }, // Tamil/Tamil/Malaysia - { 117, 27, 190, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 751,13 , 751,13 , 269,6 , 192,18 , 393,7 , 437,12 , 10607,39 , 10646,49 , 10695,20 , 10607,39 , 10646,49 , 10695,20 , 322,8 , 288,8 , 987,7 , 5,17 , 22,23 , {83,71,68}, 6,1 , 14460,61 , 4,4 , 13,6 , 4184,5 , 4203,11 , 2, 1, 7, 6, 7 }, // Tamil/Tamil/Singapore - { 117, 27, 198, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 751,13 , 751,13 , 269,6 , 192,18 , 37,5 , 8,10 , 10607,39 , 10646,49 , 10695,20 , 10607,39 , 10646,49 , 10695,20 , 322,8 , 288,8 , 987,7 , 5,17 , 22,23 , {76,75,82}, 326,3 , 14521,49 , 4,4 , 13,6 , 4184,5 , 4214,6 , 2, 1, 1, 6, 7 }, // Tamil/Tamil/Sri Lanka + { 116, 2, 209, 44, 160, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 27,8 , 553,18 , 37,5 , 8,10 , 10510,28 , 10538,55 , 10593,14 , 10510,28 , 10538,55 , 10593,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {84,74,83}, 324,4 , 14331,19 , 19,5 , 4,0 , 4168,6 , 4174,10 , 2, 1, 1, 6, 7 }, // Tajik/Cyrillic/Tajikistan + { 117, 27, 100, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 751,13 , 751,13 , 269,6 , 192,18 , 393,7 , 437,12 , 10607,39 , 10646,49 , 10695,20 , 10607,39 , 10646,49 , 10695,20 , 322,8 , 288,8 , 925,7 , 5,17 , 22,23 , {73,78,82}, 121,1 , 14350,49 , 4,4 , 13,6 , 4184,5 , 4189,7 , 2, 1, 7, 7, 7 }, // Tamil/Tamil/India + { 117, 27, 130, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 751,13 , 751,13 , 269,6 , 192,18 , 393,7 , 437,12 , 10607,39 , 10646,49 , 10695,20 , 10607,39 , 10646,49 , 10695,20 , 322,8 , 288,8 , 925,7 , 5,17 , 22,23 , {77,89,82}, 174,2 , 14399,61 , 4,4 , 13,6 , 4184,5 , 4196,7 , 2, 1, 1, 6, 7 }, // Tamil/Tamil/Malaysia + { 117, 27, 190, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 751,13 , 751,13 , 269,6 , 192,18 , 393,7 , 437,12 , 10607,39 , 10646,49 , 10695,20 , 10607,39 , 10646,49 , 10695,20 , 322,8 , 288,8 , 925,7 , 5,17 , 22,23 , {83,71,68}, 6,1 , 14460,61 , 4,4 , 13,6 , 4184,5 , 4203,11 , 2, 1, 7, 6, 7 }, // Tamil/Tamil/Singapore + { 117, 27, 198, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 751,13 , 751,13 , 269,6 , 192,18 , 37,5 , 8,10 , 10607,39 , 10646,49 , 10695,20 , 10607,39 , 10646,49 , 10695,20 , 322,8 , 288,8 , 925,7 , 5,17 , 22,23 , {76,75,82}, 328,3 , 14521,49 , 4,4 , 13,6 , 4184,5 , 4214,6 , 2, 1, 1, 6, 7 }, // Tamil/Tamil/Sri Lanka { 118, 2, 178, 44, 160, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 764,9 , 764,9 , 495,10 , 1233,23 , 55,4 , 59,9 , 10715,36 , 10751,56 , 10807,14 , 10715,36 , 10751,56 , 10807,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {82,85,66}, 123,1 , 14570,21 , 19,5 , 4,0 , 4220,5 , 3535,6 , 2, 1, 1, 6, 7 }, // Tatar/Cyrillic/Russia - { 119, 28, 100, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 773,11 , 773,11 , 339,8 , 1256,18 , 18,7 , 25,12 , 10821,32 , 10853,60 , 10913,18 , 10821,32 , 10853,60 , 10913,18 , 0,2 , 0,2 , 994,7 , 1001,29 , 22,23 , {73,78,82}, 121,1 , 14591,26 , 4,4 , 13,6 , 4225,6 , 4231,8 , 2, 1, 7, 7, 7 }, // Telugu/Telugu/India - { 120, 30, 211, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 784,5 , 784,5 , 789,8 , 797,7 , 269,6 , 1274,19 , 37,5 , 449,28 , 10931,23 , 10954,68 , 11022,16 , 10931,23 , 10954,68 , 11022,16 , 330,10 , 296,10 , 1030,4 , 5,17 , 22,23 , {84,72,66}, 329,1 , 14617,16 , 4,4 , 13,6 , 4239,3 , 4239,3 , 2, 1, 7, 6, 7 }, // Thai/Thai/Thailand + { 119, 28, 100, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 773,11 , 773,11 , 339,8 , 1256,18 , 18,7 , 25,12 , 10821,32 , 10853,60 , 10913,18 , 10821,32 , 10853,60 , 10913,18 , 0,2 , 0,2 , 932,7 , 939,29 , 22,23 , {73,78,82}, 121,1 , 14591,26 , 4,4 , 13,6 , 4225,6 , 4231,8 , 2, 1, 7, 7, 7 }, // Telugu/Telugu/India + { 120, 30, 211, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 784,5 , 784,5 , 789,8 , 797,7 , 269,6 , 1274,19 , 37,5 , 449,28 , 10931,23 , 10954,68 , 11022,16 , 10931,23 , 10954,68 , 11022,16 , 330,10 , 296,10 , 968,4 , 5,17 , 22,23 , {84,72,66}, 331,1 , 14617,16 , 4,4 , 13,6 , 4239,3 , 4239,3 , 2, 1, 7, 6, 7 }, // Thai/Thai/Thailand { 121, 31, 44, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 1293,23 , 18,7 , 25,12 , 11038,51 , 11089,79 , 11168,27 , 11038,51 , 11089,79 , 11168,27 , 340,7 , 306,8 , 45,4 , 5,17 , 22,23 , {67,78,89}, 133,1 , 14633,13 , 8,5 , 4,0 , 4242,8 , 4250,6 , 2, 1, 7, 6, 7 }, // Tibetan/Tibetan/China { 121, 31, 100, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 1293,23 , 18,7 , 25,12 , 11038,51 , 11089,79 , 11168,27 , 11038,51 , 11089,79 , 11168,27 , 340,7 , 306,8 , 45,4 , 5,17 , 22,23 , {73,78,82}, 121,1 , 14646,19 , 8,5 , 4,0 , 4242,8 , 4256,7 , 2, 1, 7, 7, 7 }, // Tibetan/Tibetan/India { 122, 14, 69, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 27,8 , 1316,23 , 18,7 , 25,12 , 11195,21 , 11216,29 , 11245,14 , 11195,21 , 11216,29 , 11259,14 , 347,12 , 314,12 , 45,4 , 5,17 , 22,23 , {69,84,66}, 0,2 , 14665,16 , 4,4 , 4,0 , 4263,3 , 92,5 , 2, 1, 7, 6, 7 }, // Tigrinya/Ethiopic/Ethiopia { 122, 14, 67, 46, 44, 59, 37, 48, 45, 43, 101, 8216, 8217, 8220, 8221, 0,6 , 0,6 , 0,6 , 0,6 , 27,8 , 1316,23 , 18,7 , 25,12 , 11195,21 , 11216,29 , 11259,14 , 11195,21 , 11216,29 , 11259,14 , 347,12 , 314,12 , 45,4 , 5,17 , 22,23 , {69,82,78}, 41,3 , 0,7 , 4,4 , 4,0 , 4263,3 , 4266,4 , 2, 1, 1, 6, 7 }, // Tigrinya/Ethiopic/Eritrea - { 123, 7, 214, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 804,8 , 804,8 , 804,8 , 804,8 , 269,6 , 97,16 , 18,7 , 25,12 , 11273,29 , 11302,60 , 11362,14 , 11273,29 , 11302,60 , 11362,14 , 359,10 , 326,6 , 1034,5 , 1039,59 , 1098,65 , {84,79,80}, 195,2 , 14681,41 , 8,5 , 4,0 , 4270,13 , 1639,5 , 2, 1, 1, 6, 7 }, // Tongan/Latin/Tonga + { 123, 7, 214, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 804,8 , 804,8 , 804,8 , 804,8 , 269,6 , 97,16 , 18,7 , 25,12 , 11273,29 , 11302,60 , 11362,14 , 11273,29 , 11302,60 , 11362,14 , 359,10 , 326,6 , 972,5 , 977,59 , 1036,65 , {84,79,80}, 195,2 , 14681,41 , 8,5 , 4,0 , 4270,13 , 1639,5 , 2, 1, 1, 6, 7 }, // Tongan/Latin/Tonga { 124, 7, 195, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {90,65,82}, 5,1 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 7, 6, 7 }, // Tsonga/Latin/South Africa - { 125, 7, 217, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 812,8 , 812,8 , 1339,9 , 1348,16 , 37,5 , 8,10 , 11376,28 , 11404,54 , 11458,14 , 11376,28 , 11404,54 , 11458,14 , 369,2 , 332,2 , 199,4 , 5,17 , 22,23 , {84,82,89}, 256,1 , 14722,40 , 4,4 , 13,6 , 4283,6 , 4289,7 , 2, 1, 1, 6, 7 }, // Turkish/Latin/Turkey - { 125, 7, 56, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 812,8 , 812,8 , 1339,9 , 1348,16 , 18,7 , 25,12 , 11376,28 , 11404,54 , 11458,14 , 11376,28 , 11404,54 , 11458,14 , 369,2 , 332,2 , 199,4 , 5,17 , 22,23 , {69,85,82}, 14,1 , 8436,19 , 4,4 , 13,6 , 4283,6 , 4296,6 , 2, 1, 1, 6, 7 }, // Turkish/Latin/Cyprus - { 126, 7, 218, 44, 160, 59, 37, 48, 45, 43, 101, 8220, 8221, 8220, 8221, 0,6 , 0,6 , 820,8 , 820,8 , 495,10 , 1348,16 , 37,5 , 8,10 , 11472,28 , 11500,54 , 11554,14 , 11568,28 , 11596,54 , 11554,14 , 371,13 , 334,14 , 1163,4 , 5,17 , 22,23 , {84,77,84}, 330,3 , 14762,49 , 19,5 , 4,0 , 4302,12 , 4314,12 , 2, 1, 1, 6, 7 }, // Turkmen/Latin/Turkmenistan - { 128, 1, 44, 46, 44, 59, 37, 48, 45, 43, 101, 187, 171, 8250, 8249, 0,6 , 0,6 , 196,10 , 206,9 , 53,10 , 1364,17 , 18,7 , 25,12 , 11650,21 , 11671,55 , 11726,14 , 11650,21 , 11671,55 , 11726,14 , 384,12 , 348,12 , 45,4 , 5,17 , 22,23 , {67,78,89}, 247,1 , 14811,40 , 4,4 , 13,6 , 4326,8 , 4334,5 , 2, 1, 7, 6, 7 }, // Uighur/Arabic/China - { 129, 2, 222, 44, 160, 59, 37, 48, 45, 43, 1077, 171, 187, 8222, 8220, 0,6 , 0,6 , 134,7 , 134,7 , 156,8 , 1381,22 , 37,5 , 8,10 , 1454,21 , 11740,56 , 11796,14 , 1454,21 , 11740,56 , 11796,14 , 396,2 , 360,2 , 1167,5 , 728,17 , 22,23 , {85,65,72}, 296,1 , 14851,95 , 19,5 , 4,0 , 4339,10 , 4349,7 , 2, 1, 1, 6, 7 }, // Ukrainian/Cyrillic/Ukraine - { 130, 1, 163, 46, 44, 59, 37, 48, 45, 43, 101, 8221, 8220, 8217, 8216, 556,6 , 556,6 , 828,10 , 838,9 , 269,6 , 1403,18 , 18,7 , 25,12 , 11810,36 , 11810,36 , 85,14 , 11810,36 , 11810,36 , 85,14 , 0,2 , 0,2 , 1172,4 , 1176,20 , 22,23 , {80,75,82}, 176,2 , 14946,49 , 4,4 , 13,6 , 4356,4 , 3251,7 , 2, 0, 7, 6, 7 }, // Urdu/Arabic/Pakistan - { 130, 1, 100, 1643, 1644, 59, 37, 1776, 45, 43, 101, 8221, 8220, 8217, 8216, 556,6 , 556,6 , 828,10 , 838,9 , 269,6 , 1403,18 , 18,7 , 25,12 , 11810,36 , 11810,36 , 85,14 , 11810,36 , 11810,36 , 85,14 , 0,2 , 0,2 , 1172,4 , 1176,20 , 22,23 , {73,78,82}, 121,1 , 14995,42 , 4,4 , 13,6 , 4356,4 , 4360,5 , 2, 1, 7, 7, 7 }, // Urdu/Arabic/India - { 131, 7, 228, 44, 160, 59, 37, 48, 45, 43, 101, 8220, 8221, 8217, 8216, 0,6 , 0,6 , 847,8 , 847,8 , 27,8 , 1421,18 , 37,5 , 198,11 , 11846,32 , 11878,61 , 11939,14 , 11846,32 , 11878,61 , 11939,14 , 398,2 , 362,2 , 199,4 , 5,17 , 22,23 , {85,90,83}, 333,4 , 15037,58 , 19,5 , 4,0 , 4365,6 , 4371,11 , 2, 0, 1, 6, 7 }, // Uzbek/Latin/Uzbekistan - { 131, 1, 1, 1643, 1644, 1563, 1642, 1776, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 394,8 , 1439,33 , 55,4 , 198,11 , 11953,21 , 7794,49 , 85,14 , 11953,21 , 7794,49 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {65,70,78}, 272,1 , 15095,13 , 19,5 , 4,0 , 4382,6 , 3242,9 , 0, 0, 6, 4, 5 }, // Uzbek/Arabic/Afghanistan - { 131, 2, 228, 44, 160, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 27,8 , 696,19 , 37,5 , 87,12 , 11974,28 , 12002,53 , 12055,14 , 11974,28 , 12002,53 , 12055,14 , 400,2 , 364,2 , 45,4 , 5,17 , 22,23 , {85,90,83}, 337,3 , 15108,49 , 19,5 , 4,0 , 4388,7 , 4395,10 , 2, 0, 1, 6, 7 }, // Uzbek/Cyrillic/Uzbekistan - { 132, 7, 232, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 855,8 , 855,8 , 119,10 , 192,18 , 37,5 , 8,10 , 12069,33 , 12102,55 , 12157,21 , 12069,33 , 12102,55 , 12157,21 , 402,2 , 366,2 , 45,4 , 5,17 , 22,23 , {86,78,68}, 340,1 , 15157,33 , 19,5 , 4,0 , 4405,10 , 4415,8 , 0, 0, 1, 6, 7 }, // Vietnamese/Latin/Vietnam + { 125, 7, 217, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 812,8 , 812,8 , 1339,9 , 1348,16 , 37,5 , 8,10 , 11376,28 , 11404,54 , 11458,14 , 11376,28 , 11404,54 , 11458,14 , 369,2 , 332,2 , 187,4 , 5,17 , 22,23 , {84,82,89}, 258,1 , 14722,40 , 4,4 , 13,6 , 4283,6 , 4289,7 , 2, 1, 1, 6, 7 }, // Turkish/Latin/Turkey + { 125, 7, 56, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 812,8 , 812,8 , 1339,9 , 1348,16 , 18,7 , 25,12 , 11376,28 , 11404,54 , 11458,14 , 11376,28 , 11404,54 , 11458,14 , 369,2 , 332,2 , 187,4 , 5,17 , 22,23 , {69,85,82}, 14,1 , 8436,19 , 4,4 , 13,6 , 4283,6 , 4296,6 , 2, 1, 1, 6, 7 }, // Turkish/Latin/Cyprus + { 126, 7, 218, 44, 160, 59, 37, 48, 45, 43, 101, 8220, 8221, 8220, 8221, 0,6 , 0,6 , 820,8 , 820,8 , 495,10 , 1348,16 , 37,5 , 8,10 , 11472,28 , 11500,54 , 11554,14 , 11568,28 , 11596,54 , 11554,14 , 371,13 , 334,14 , 1101,4 , 5,17 , 22,23 , {84,77,84}, 332,3 , 14762,49 , 19,5 , 4,0 , 4302,12 , 4314,12 , 2, 1, 1, 6, 7 }, // Turkmen/Latin/Turkmenistan + { 128, 1, 44, 46, 44, 59, 37, 48, 45, 43, 101, 187, 171, 8250, 8249, 0,6 , 0,6 , 196,10 , 206,9 , 53,10 , 1364,17 , 18,7 , 25,12 , 11650,21 , 11671,55 , 11726,14 , 11650,21 , 11671,55 , 11726,14 , 384,12 , 348,12 , 45,4 , 5,17 , 22,23 , {67,78,89}, 249,1 , 14811,40 , 4,4 , 13,6 , 4326,8 , 4334,5 , 2, 1, 7, 6, 7 }, // Uighur/Arabic/China + { 129, 2, 222, 44, 160, 59, 37, 48, 45, 43, 1077, 171, 187, 8222, 8220, 0,6 , 0,6 , 134,7 , 134,7 , 156,8 , 1381,22 , 37,5 , 8,10 , 1454,21 , 11740,56 , 11796,14 , 1454,21 , 11740,56 , 11796,14 , 396,2 , 360,2 , 1105,5 , 708,17 , 22,23 , {85,65,72}, 298,1 , 14851,95 , 19,5 , 4,0 , 4339,10 , 4349,7 , 2, 1, 1, 6, 7 }, // Ukrainian/Cyrillic/Ukraine + { 130, 1, 163, 46, 44, 59, 37, 48, 45, 43, 101, 8221, 8220, 8217, 8216, 556,6 , 556,6 , 828,10 , 838,9 , 269,6 , 1403,18 , 18,7 , 25,12 , 11810,36 , 11810,36 , 85,14 , 11810,36 , 11810,36 , 85,14 , 0,2 , 0,2 , 1110,4 , 1114,20 , 22,23 , {80,75,82}, 176,2 , 14946,49 , 4,4 , 13,6 , 4356,4 , 3251,7 , 2, 0, 7, 6, 7 }, // Urdu/Arabic/Pakistan + { 130, 1, 100, 1643, 1644, 59, 37, 1776, 45, 43, 101, 8221, 8220, 8217, 8216, 556,6 , 556,6 , 828,10 , 838,9 , 269,6 , 1403,18 , 18,7 , 25,12 , 11810,36 , 11810,36 , 85,14 , 11810,36 , 11810,36 , 85,14 , 0,2 , 0,2 , 1110,4 , 1114,20 , 22,23 , {73,78,82}, 121,1 , 14995,42 , 4,4 , 13,6 , 4356,4 , 4360,5 , 2, 1, 7, 7, 7 }, // Urdu/Arabic/India + { 131, 7, 228, 44, 160, 59, 37, 48, 45, 43, 101, 8220, 8221, 8217, 8216, 0,6 , 0,6 , 847,8 , 847,8 , 27,8 , 1421,18 , 37,5 , 198,11 , 11846,32 , 11878,61 , 11939,14 , 11846,32 , 11878,61 , 11939,14 , 398,2 , 362,2 , 187,4 , 5,17 , 22,23 , {85,90,83}, 335,4 , 15037,58 , 19,5 , 4,0 , 4365,6 , 4371,11 , 2, 0, 1, 6, 7 }, // Uzbek/Latin/Uzbekistan + { 131, 1, 1, 1643, 1644, 1563, 1642, 1776, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 394,8 , 1439,33 , 55,4 , 198,11 , 11953,21 , 7794,49 , 85,14 , 11953,21 , 7794,49 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {65,70,78}, 274,1 , 15095,13 , 19,5 , 4,0 , 4382,6 , 3242,9 , 0, 0, 6, 4, 5 }, // Uzbek/Arabic/Afghanistan + { 131, 2, 228, 44, 160, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 27,8 , 696,19 , 37,5 , 87,12 , 11974,28 , 12002,53 , 12055,14 , 11974,28 , 12002,53 , 12055,14 , 400,2 , 364,2 , 45,4 , 5,17 , 22,23 , {85,90,83}, 339,3 , 15108,49 , 19,5 , 4,0 , 4388,7 , 4395,10 , 2, 0, 1, 6, 7 }, // Uzbek/Cyrillic/Uzbekistan + { 132, 7, 232, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 855,8 , 855,8 , 119,10 , 192,18 , 37,5 , 8,10 , 12069,33 , 12102,55 , 12157,21 , 12069,33 , 12102,55 , 12157,21 , 402,2 , 366,2 , 45,4 , 5,17 , 22,23 , {86,78,68}, 342,1 , 15157,33 , 19,5 , 4,0 , 4405,10 , 4415,8 , 0, 0, 1, 6, 7 }, // Vietnamese/Latin/Vietnam { 133, 7, 260, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {0,0,0}, 0,0 , 2586,0 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 1, 6, 7 }, // Volapuk/Latin/World - { 134, 7, 224, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 863,11 , 874,10 , 27,8 , 10,17 , 37,5 , 8,10 , 12178,29 , 12207,77 , 12284,15 , 12299,30 , 12207,77 , 12284,15 , 404,2 , 368,2 , 1196,7 , 5,17 , 22,23 , {71,66,80}, 119,1 , 15190,91 , 4,4 , 13,6 , 4423,7 , 4430,16 , 2, 1, 1, 6, 7 }, // Welsh/Latin/United Kingdom - { 135, 7, 187, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 528,10 , 1472,17 , 37,5 , 8,10 , 12329,28 , 12357,50 , 12329,28 , 12329,28 , 12357,50 , 12329,28 , 406,3 , 370,3 , 45,4 , 5,17 , 22,23 , {88,79,70}, 207,3 , 15281,65 , 8,5 , 4,0 , 4446,5 , 4451,8 , 0, 0, 1, 6, 7 }, // Wolof/Latin/Senegal + { 134, 7, 224, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 863,11 , 874,10 , 27,8 , 10,17 , 37,5 , 8,10 , 12178,29 , 12207,77 , 12284,15 , 12299,30 , 12207,77 , 12284,15 , 404,2 , 368,2 , 1134,7 , 5,17 , 22,23 , {71,66,80}, 119,1 , 15190,91 , 4,4 , 13,6 , 4423,7 , 4430,16 , 2, 1, 1, 6, 7 }, // Welsh/Latin/United Kingdom + { 135, 7, 187, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 528,10 , 1472,17 , 37,5 , 8,10 , 12329,28 , 12357,50 , 12329,28 , 12329,28 , 12357,50 , 12329,28 , 406,3 , 370,3 , 45,4 , 5,17 , 22,23 , {88,79,70}, 207,5 , 15281,65 , 8,5 , 4,0 , 4446,5 , 4451,8 , 0, 0, 1, 6, 7 }, // Wolof/Latin/Senegal { 136, 7, 195, 46, 160, 59, 37, 48, 45, 43, 101, 8216, 8217, 8220, 8221, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 12407,28 , 12435,61 , 85,14 , 12407,28 , 12435,61 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {90,65,82}, 5,1 , 15346,79 , 4,4 , 4,0 , 4459,8 , 4467,15 , 2, 1, 7, 6, 7 }, // Xhosa/Latin/South Africa { 137, 18, 260, 46, 44, 59, 37, 48, 45, 43, 101, 8221, 8221, 8217, 8217, 0,6 , 0,6 , 884,9 , 884,9 , 27,8 , 1489,19 , 37,5 , 8,10 , 12496,54 , 12496,54 , 85,14 , 12496,54 , 12496,54 , 85,14 , 409,11 , 373,10 , 45,4 , 5,17 , 22,23 , {0,0,0}, 0,0 , 2586,0 , 8,5 , 4,0 , 4482,6 , 4488,5 , 2, 1, 1, 6, 7 }, // Yiddish/Hebrew/World - { 138, 7, 157, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 1508,16 , 477,3 , 8,10 , 12550,33 , 12583,44 , 12627,14 , 12550,33 , 12641,69 , 12627,14 , 420,5 , 383,5 , 1203,11 , 1214,37 , 22,23 , {78,71,78}, 178,1 , 15425,35 , 4,4 , 13,6 , 4493,10 , 4503,8 , 2, 1, 1, 6, 7 }, // Yoruba/Latin/Nigeria - { 138, 7, 23, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 1508,16 , 477,3 , 8,10 , 12710,33 , 12743,44 , 12787,14 , 12710,33 , 12801,69 , 12787,14 , 425,5 , 388,5 , 1251,11 , 1214,37 , 22,23 , {88,79,70}, 207,3 , 15460,64 , 4,4 , 13,6 , 4493,10 , 4511,6 , 0, 0, 1, 6, 7 }, // Yoruba/Latin/Benin + { 138, 7, 157, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 1508,16 , 477,3 , 8,10 , 12550,33 , 12583,44 , 12627,14 , 12550,33 , 12641,69 , 12627,14 , 420,5 , 383,5 , 1141,11 , 1152,37 , 22,23 , {78,71,78}, 178,1 , 15425,35 , 4,4 , 13,6 , 4493,10 , 4503,8 , 2, 1, 1, 6, 7 }, // Yoruba/Latin/Nigeria + { 138, 7, 23, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 1508,16 , 477,3 , 8,10 , 12710,33 , 12743,44 , 12787,14 , 12710,33 , 12801,69 , 12787,14 , 425,5 , 388,5 , 1189,11 , 1152,37 , 22,23 , {88,79,70}, 207,5 , 15460,64 , 4,4 , 13,6 , 4493,10 , 4511,6 , 0, 0, 1, 6, 7 }, // Yoruba/Latin/Benin { 140, 7, 195, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 893,9 , 902,8 , 547,6 , 35,18 , 37,5 , 8,10 , 12870,28 , 12898,74 , 12972,14 , 12870,28 , 12898,74 , 12972,14 , 0,2 , 0,2 , 0,5 , 5,17 , 22,23 , {90,65,82}, 5,1 , 15524,67 , 4,4 , 13,6 , 4517,7 , 4524,17 , 2, 1, 7, 6, 7 }, // Zulu/Latin/South Africa { 141, 7, 161, 44, 160, 59, 37, 48, 8722, 43, 101, 171, 187, 8216, 8217, 0,6 , 0,6 , 188,8 , 188,8 , 495,10 , 478,17 , 37,5 , 480,16 , 12986,28 , 13014,51 , 2320,14 , 13065,28 , 13014,51 , 2320,14 , 430,9 , 393,11 , 45,4 , 5,17 , 22,23 , {78,79,75}, 190,2 , 10090,44 , 19,5 , 4,0 , 4541,13 , 4554,5 , 2, 0, 1, 6, 7 }, // Norwegian Nynorsk/Latin/Norway - { 142, 7, 27, 44, 46, 59, 37, 48, 45, 43, 101, 8222, 8221, 8216, 8217, 0,6 , 0,6 , 159,7 , 159,7 , 1524,11 , 450,19 , 37,5 , 8,10 , 2043,28 , 2071,58 , 2129,14 , 2043,28 , 2071,58 , 2143,14 , 439,10 , 404,7 , 298,7 , 5,17 , 22,23 , {66,65,77}, 144,2 , 12015,170 , 19,5 , 4,0 , 4559,8 , 629,19 , 2, 1, 1, 6, 7 }, // Bosnian/Latin/Bosnia And Herzegowina - { 142, 2, 27, 44, 46, 59, 37, 48, 45, 43, 101, 8222, 8220, 8218, 8216, 0,6 , 0,6 , 111,7 , 111,7 , 1091,7 , 1098,20 , 37,5 , 8,10 , 9127,28 , 9155,56 , 8974,14 , 9127,28 , 9155,56 , 8974,14 , 260,11 , 411,13 , 45,4 , 5,17 , 22,23 , {66,65,77}, 300,2 , 15591,152 , 19,5 , 4,0 , 4567,8 , 3649,19 , 2, 1, 1, 6, 7 }, // Bosnian/Cyrillic/Bosnia And Herzegowina + { 142, 7, 27, 44, 46, 59, 37, 48, 45, 43, 101, 8222, 8221, 8216, 8217, 0,6 , 0,6 , 159,7 , 159,7 , 1524,11 , 450,19 , 37,5 , 8,10 , 2043,28 , 2071,58 , 2129,14 , 2043,28 , 2071,58 , 2143,14 , 439,10 , 404,7 , 286,7 , 5,17 , 22,23 , {66,65,77}, 144,2 , 12015,170 , 19,5 , 4,0 , 4559,8 , 629,19 , 2, 1, 1, 6, 7 }, // Bosnian/Latin/Bosnia And Herzegowina + { 142, 2, 27, 44, 46, 59, 37, 48, 45, 43, 101, 8222, 8220, 8218, 8216, 0,6 , 0,6 , 111,7 , 111,7 , 1091,7 , 1098,20 , 37,5 , 8,10 , 9127,28 , 9155,56 , 8974,14 , 9127,28 , 9155,56 , 8974,14 , 260,11 , 411,13 , 45,4 , 5,17 , 22,23 , {66,65,77}, 302,2 , 15591,152 , 19,5 , 4,0 , 4567,8 , 3649,19 , 2, 1, 1, 6, 7 }, // Bosnian/Cyrillic/Bosnia And Herzegowina { 143, 29, 131, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {77,86,82}, 0,0 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 5, 6, 7 }, // Divehi/Thaana/Maldives { 144, 7, 251, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 27,8 , 80,17 , 37,5 , 8,10 , 13093,30 , 13123,57 , 85,14 , 13093,30 , 13123,57 , 85,14 , 64,4 , 61,4 , 45,4 , 5,17 , 22,23 , {71,66,80}, 119,1 , 0,7 , 4,4 , 4,0 , 4575,5 , 4580,12 , 2, 1, 1, 6, 7 }, // Manx/Latin/Isle Of Man { 145, 7, 224, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 97,16 , 37,5 , 8,10 , 13180,28 , 13208,61 , 85,14 , 13180,28 , 13208,61 , 85,14 , 64,4 , 61,4 , 45,4 , 5,17 , 22,23 , {71,66,80}, 119,1 , 0,7 , 4,4 , 4,0 , 4592,8 , 4600,14 , 2, 1, 1, 6, 7 }, // Cornish/Latin/United Kingdom { 146, 7, 83, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 1535,8 , 1543,18 , 18,7 , 25,12 , 13269,28 , 13297,49 , 13346,14 , 13269,28 , 13297,49 , 13346,14 , 449,2 , 424,2 , 45,4 , 5,17 , 22,23 , {71,72,83}, 167,3 , 15743,17 , 4,4 , 4,0 , 4614,4 , 4618,5 , 2, 1, 1, 6, 7 }, // Akan/Latin/Ghana - { 147, 13, 100, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 1561,6 , 97,16 , 18,7 , 25,12 , 13360,51 , 13360,51 , 13411,19 , 13360,51 , 13360,51 , 13430,20 , 0,2 , 0,2 , 1262,4 , 5,17 , 22,23 , {73,78,82}, 121,1 , 15760,19 , 4,4 , 13,6 , 4623,6 , 2666,4 , 2, 1, 7, 7, 7 }, // Konkani/Devanagari/India + { 147, 13, 100, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 1561,6 , 97,16 , 18,7 , 25,12 , 13360,51 , 13360,51 , 13411,19 , 13360,51 , 13360,51 , 13430,20 , 0,2 , 0,2 , 1200,4 , 5,17 , 22,23 , {73,78,82}, 121,1 , 15760,19 , 4,4 , 13,6 , 4623,6 , 2666,4 , 2, 1, 7, 7, 7 }, // Konkani/Devanagari/India { 148, 7, 83, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {71,72,83}, 167,3 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 1, 6, 7 }, // Ga/Latin/Ghana { 149, 7, 157, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 910,9 , 734,8 , 269,6 , 10,17 , 37,5 , 8,10 , 13450,29 , 13479,54 , 85,14 , 13450,29 , 13479,54 , 85,14 , 451,7 , 426,7 , 45,4 , 5,17 , 22,23 , {78,71,78}, 178,1 , 15779,12 , 4,4 , 13,6 , 4629,4 , 4633,8 , 2, 1, 1, 6, 7 }, // Igbo/Latin/Nigeria { 150, 7, 111, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 10,17 , 37,5 , 8,10 , 13533,28 , 13561,74 , 13635,14 , 13533,28 , 13561,74 , 13635,14 , 458,9 , 433,7 , 45,4 , 5,17 , 22,23 , {75,69,83}, 2,3 , 15791,23 , 4,4 , 13,6 , 4641,7 , 1191,5 , 2, 1, 7, 6, 7 }, // Kamba/Latin/Kenya @@ -1733,15 +1730,15 @@ static const QLocaleData locale_data[] = { { 159, 7, 106, 44, 46, 59, 37, 48, 45, 43, 101, 8216, 8217, 8220, 8221, 0,6 , 0,6 , 250,7 , 250,7 , 27,8 , 1567,27 , 37,5 , 8,10 , 13649,28 , 13677,50 , 3107,14 , 13649,28 , 13677,50 , 3107,14 , 467,2 , 440,2 , 45,4 , 5,17 , 22,23 , {69,85,82}, 14,1 , 3102,20 , 8,5 , 4,0 , 4648,6 , 4654,6 , 2, 1, 1, 6, 7 }, // Friulian/Latin/Italy { 160, 7, 195, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {90,65,82}, 5,1 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 7, 6, 7 }, // Venda/Latin/South Africa { 161, 7, 83, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 919,11 , 930,10 , 547,6 , 1594,23 , 496,12 , 508,17 , 13727,28 , 13755,44 , 13799,14 , 13727,28 , 13755,44 , 13799,14 , 469,3 , 442,5 , 45,4 , 5,17 , 22,23 , {71,72,83}, 167,3 , 15814,37 , 4,4 , 13,6 , 4660,6 , 4666,12 , 2, 1, 1, 6, 7 }, // Ewe/Latin/Ghana - { 161, 7, 212, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 919,11 , 930,10 , 547,6 , 1594,23 , 37,5 , 8,10 , 13727,28 , 13755,44 , 13799,14 , 13727,28 , 13755,44 , 13799,14 , 469,3 , 442,5 , 45,4 , 5,17 , 22,23 , {88,79,70}, 207,3 , 15851,106 , 4,4 , 13,6 , 4660,6 , 4678,11 , 0, 0, 1, 6, 7 }, // Ewe/Latin/Togo + { 161, 7, 212, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 919,11 , 930,10 , 547,6 , 1594,23 , 37,5 , 8,10 , 13727,28 , 13755,44 , 13799,14 , 13727,28 , 13755,44 , 13799,14 , 469,3 , 442,5 , 45,4 , 5,17 , 22,23 , {88,79,70}, 207,5 , 15851,106 , 4,4 , 13,6 , 4660,6 , 4678,11 , 0, 0, 1, 6, 7 }, // Ewe/Latin/Togo { 162, 14, 69, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {69,84,66}, 0,0 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 7, 6, 7 }, // Walamo/Ethiopic/Ethiopia { 163, 7, 225, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 269,6 , 10,17 , 18,7 , 25,12 , 13813,21 , 13834,57 , 85,14 , 13813,21 , 13834,57 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {85,83,68}, 6,1 , 0,7 , 4,4 , 13,6 , 4689,14 , 4703,19 , 2, 1, 7, 6, 7 }, // Hawaiian/Latin/United States { 164, 7, 157, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {78,71,78}, 178,1 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 1, 6, 7 }, // Tyap/Latin/Nigeria { 165, 7, 129, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {77,87,75}, 0,0 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 1, 6, 7 }, // Nyanja/Latin/Malawi { 166, 7, 170, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 940,9 , 949,8 , 547,6 , 35,18 , 18,7 , 25,12 , 13891,28 , 13919,55 , 13891,28 , 13891,28 , 13919,55 , 13891,28 , 0,2 , 0,2 , 0,5 , 5,17 , 22,23 , {80,72,80}, 179,1 , 15957,58 , 4,4 , 13,6 , 4722,8 , 4730,9 , 2, 1, 7, 6, 7 }, // Filipino/Latin/Philippines - { 167, 7, 206, 46, 8217, 59, 37, 48, 8722, 43, 101, 171, 187, 8249, 8250, 0,6 , 0,6 , 265,9 , 265,9 , 156,8 , 622,18 , 37,5 , 8,10 , 13974,28 , 14002,63 , 3695,14 , 13974,28 , 14002,63 , 3695,14 , 472,12 , 447,11 , 45,4 , 5,17 , 22,23 , {67,72,70}, 228,3 , 16015,55 , 19,5 , 4,0 , 4739,16 , 4755,7 , 2, 0, 1, 6, 7 }, // Swiss German/Latin/Switzerland + { 167, 7, 206, 46, 8217, 59, 37, 48, 8722, 43, 101, 171, 187, 8249, 8250, 0,6 , 0,6 , 265,9 , 265,9 , 156,8 , 622,18 , 37,5 , 8,10 , 13974,28 , 14002,63 , 3695,14 , 13974,28 , 14002,63 , 3695,14 , 472,12 , 447,11 , 45,4 , 5,17 , 22,23 , {67,72,70}, 230,3 , 16015,55 , 19,5 , 4,0 , 4739,16 , 4755,7 , 2, 0, 1, 6, 7 }, // Swiss German/Latin/Switzerland { 167, 7, 74, 46, 8217, 59, 37, 48, 8722, 43, 101, 171, 187, 8249, 8250, 0,6 , 0,6 , 265,9 , 265,9 , 156,8 , 622,18 , 37,5 , 8,10 , 13974,28 , 14002,63 , 3695,14 , 13974,28 , 14002,63 , 3695,14 , 472,12 , 447,11 , 45,4 , 5,17 , 22,23 , {69,85,82}, 14,1 , 8436,19 , 19,5 , 4,0 , 4739,16 , 4762,10 , 2, 1, 1, 6, 7 }, // Swiss German/Latin/France - { 167, 7, 123, 46, 8217, 59, 37, 48, 8722, 43, 101, 171, 187, 8249, 8250, 0,6 , 0,6 , 265,9 , 265,9 , 156,8 , 622,18 , 37,5 , 8,10 , 13974,28 , 14002,63 , 3695,14 , 13974,28 , 14002,63 , 3695,14 , 472,12 , 447,11 , 45,4 , 5,17 , 22,23 , {67,72,70}, 228,3 , 16015,55 , 19,5 , 4,0 , 4739,16 , 4772,13 , 2, 0, 1, 6, 7 }, // Swiss German/Latin/Liechtenstein + { 167, 7, 123, 46, 8217, 59, 37, 48, 8722, 43, 101, 171, 187, 8249, 8250, 0,6 , 0,6 , 265,9 , 265,9 , 156,8 , 622,18 , 37,5 , 8,10 , 13974,28 , 14002,63 , 3695,14 , 13974,28 , 14002,63 , 3695,14 , 472,12 , 447,11 , 45,4 , 5,17 , 22,23 , {67,72,70}, 230,3 , 16015,55 , 19,5 , 4,0 , 4739,16 , 4772,13 , 2, 0, 1, 6, 7 }, // Swiss German/Latin/Liechtenstein { 168, 34, 44, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 18,7 , 25,12 , 14065,21 , 14086,28 , 14114,14 , 14065,21 , 14086,28 , 14114,14 , 484,2 , 458,2 , 45,4 , 5,17 , 22,23 , {67,78,89}, 133,1 , 0,7 , 8,5 , 4,0 , 4785,3 , 4788,2 , 2, 1, 7, 6, 7 }, // Sichuan Yi/Yi/China { 169, 7, 121, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {76,82,68}, 6,1 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 1, 6, 7 }, // Kpelle/Latin/Liberia { 170, 7, 82, 44, 46, 59, 37, 48, 45, 43, 101, 8222, 8220, 8218, 8216, 0,6 , 0,6 , 455,8 , 455,8 , 365,7 , 1617,23 , 525,10 , 535,19 , 14128,28 , 14156,65 , 3695,14 , 14128,28 , 14156,65 , 3695,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {69,85,82}, 14,1 , 16070,15 , 19,5 , 4,0 , 4790,14 , 4804,11 , 2, 1, 1, 6, 7 }, // Low German/Latin/Germany @@ -1751,42 +1748,42 @@ static const QLocaleData locale_data[] = { { 173, 7, 161, 44, 160, 59, 37, 48, 8722, 43, 101, 8221, 8221, 8217, 8217, 0,6 , 0,6 , 224,8 , 224,8 , 53,10 , 63,17 , 37,5 , 8,10 , 14221,33 , 14254,75 , 14329,14 , 14221,33 , 14254,75 , 14329,14 , 486,11 , 460,13 , 45,4 , 5,17 , 22,23 , {78,79,75}, 190,2 , 16085,63 , 19,5 , 4,0 , 4827,15 , 4842,5 , 2, 0, 1, 6, 7 }, // Northern Sami/Latin/Norway { 173, 7, 73, 44, 160, 59, 37, 48, 8722, 43, 101, 8221, 8221, 8217, 8217, 0,6 , 0,6 , 224,8 , 224,8 , 495,10 , 97,16 , 37,5 , 8,10 , 14343,21 , 14364,70 , 14434,14 , 14343,21 , 14364,70 , 14434,14 , 497,2 , 473,2 , 45,4 , 5,17 , 22,23 , {69,85,82}, 14,1 , 16148,23 , 19,5 , 4,0 , 4827,15 , 4847,6 , 2, 1, 1, 6, 7 }, // Northern Sami/Latin/Finland { 173, 7, 205, 44, 160, 59, 37, 48, 8722, 43, 101, 8221, 8221, 8217, 8217, 0,6 , 0,6 , 224,8 , 224,8 , 53,10 , 63,17 , 37,5 , 8,10 , 14221,33 , 14254,75 , 14329,14 , 14221,33 , 14254,75 , 14329,14 , 486,11 , 460,13 , 45,4 , 5,17 , 22,23 , {83,69,75}, 190,2 , 16171,63 , 19,5 , 4,0 , 4827,15 , 4853,6 , 2, 0, 1, 6, 7 }, // Northern Sami/Latin/Sweden - { 174, 7, 208, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {84,87,68}, 341,3 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 0, 7, 6, 7 }, // Taroko/Latin/Taiwan + { 174, 7, 208, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {84,87,68}, 343,3 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 0, 7, 6, 7 }, // Taroko/Latin/Taiwan { 175, 7, 111, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 10,17 , 37,5 , 8,10 , 14448,28 , 14476,62 , 14538,14 , 14448,28 , 14476,62 , 14538,14 , 499,6 , 475,3 , 45,4 , 5,17 , 22,23 , {75,69,83}, 2,3 , 16234,24 , 4,4 , 13,6 , 4859,8 , 1191,5 , 2, 1, 7, 6, 7 }, // Gusii/Latin/Kenya { 176, 7, 111, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 10,17 , 37,5 , 8,10 , 14552,28 , 14580,105 , 14685,14 , 14552,28 , 14580,105 , 14685,14 , 505,10 , 478,10 , 45,4 , 5,17 , 22,23 , {75,69,83}, 2,3 , 16234,24 , 4,4 , 13,6 , 4867,7 , 1191,5 , 2, 1, 7, 6, 7 }, // Taita/Latin/Kenya - { 177, 7, 187, 44, 160, 59, 37, 48, 45, 43, 101, 8222, 8221, 8218, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 37,5 , 8,10 , 14699,28 , 14727,59 , 14786,14 , 14699,28 , 14727,59 , 14786,14 , 515,6 , 488,7 , 45,4 , 5,17 , 22,23 , {88,79,70}, 207,3 , 16258,26 , 19,5 , 4,0 , 4874,6 , 4451,8 , 0, 0, 1, 6, 7 }, // Fulah/Latin/Senegal - { 177, 7, 34, 44, 160, 59, 37, 48, 45, 43, 101, 8222, 8221, 8218, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 37,5 , 8,10 , 14699,28 , 14727,59 , 14786,14 , 14699,28 , 14727,59 , 14786,14 , 515,6 , 488,7 , 45,4 , 5,17 , 22,23 , {88,79,70}, 207,3 , 16258,26 , 19,5 , 4,0 , 4874,6 , 4880,14 , 0, 0, 1, 6, 7 }, // Fulah/Latin/Burkina Faso + { 177, 7, 187, 44, 160, 59, 37, 48, 45, 43, 101, 8222, 8221, 8218, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 37,5 , 8,10 , 14699,28 , 14727,59 , 14786,14 , 14699,28 , 14727,59 , 14786,14 , 515,6 , 488,7 , 45,4 , 5,17 , 22,23 , {88,79,70}, 207,5 , 16258,26 , 19,5 , 4,0 , 4874,6 , 4451,8 , 0, 0, 1, 6, 7 }, // Fulah/Latin/Senegal + { 177, 7, 34, 44, 160, 59, 37, 48, 45, 43, 101, 8222, 8221, 8218, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 37,5 , 8,10 , 14699,28 , 14727,59 , 14786,14 , 14699,28 , 14727,59 , 14786,14 , 515,6 , 488,7 , 45,4 , 5,17 , 22,23 , {88,79,70}, 207,5 , 16258,26 , 19,5 , 4,0 , 4874,6 , 4880,14 , 0, 0, 1, 6, 7 }, // Fulah/Latin/Burkina Faso { 177, 7, 37, 44, 160, 59, 37, 48, 45, 43, 101, 8222, 8221, 8218, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 37,5 , 8,10 , 14699,28 , 14727,59 , 14786,14 , 14699,28 , 14727,59 , 14786,14 , 515,6 , 488,7 , 45,4 , 5,17 , 22,23 , {88,65,70}, 32,4 , 16284,25 , 19,5 , 4,0 , 4874,6 , 4894,8 , 0, 0, 1, 6, 7 }, // Fulah/Latin/Cameroon { 177, 7, 80, 44, 160, 59, 37, 48, 45, 43, 101, 8222, 8221, 8218, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 18,7 , 25,12 , 14699,28 , 14727,59 , 14786,14 , 14699,28 , 14727,59 , 14786,14 , 515,6 , 488,7 , 45,4 , 5,17 , 22,23 , {71,77,68}, 166,1 , 16309,20 , 19,5 , 4,0 , 4874,6 , 4902,6 , 2, 1, 1, 6, 7 }, // Fulah/Latin/Gambia { 177, 7, 83, 44, 160, 59, 37, 48, 45, 43, 101, 8222, 8221, 8218, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 18,7 , 25,12 , 14699,28 , 14727,59 , 14786,14 , 14699,28 , 14727,59 , 14786,14 , 515,6 , 488,7 , 45,4 , 5,17 , 22,23 , {71,72,83}, 167,3 , 0,7 , 19,5 , 4,0 , 4874,6 , 4908,5 , 2, 1, 1, 6, 7 }, // Fulah/Latin/Ghana - { 177, 7, 91, 44, 160, 59, 37, 48, 45, 43, 101, 8222, 8221, 8218, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 37,5 , 8,10 , 14699,28 , 14727,59 , 14786,14 , 14699,28 , 14727,59 , 14786,14 , 515,6 , 488,7 , 45,4 , 5,17 , 22,23 , {71,78,70}, 220,2 , 0,7 , 19,5 , 4,0 , 4874,6 , 4913,4 , 0, 0, 1, 6, 7 }, // Fulah/Latin/Guinea - { 177, 7, 92, 44, 160, 59, 37, 48, 45, 43, 101, 8222, 8221, 8218, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 37,5 , 8,10 , 14699,28 , 14727,59 , 14786,14 , 14699,28 , 14727,59 , 14786,14 , 515,6 , 488,7 , 45,4 , 5,17 , 22,23 , {88,79,70}, 207,3 , 16258,26 , 19,5 , 4,0 , 4874,6 , 4917,12 , 0, 0, 1, 6, 7 }, // Fulah/Latin/Guinea Bissau + { 177, 7, 91, 44, 160, 59, 37, 48, 45, 43, 101, 8222, 8221, 8218, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 37,5 , 8,10 , 14699,28 , 14727,59 , 14786,14 , 14699,28 , 14727,59 , 14786,14 , 515,6 , 488,7 , 45,4 , 5,17 , 22,23 , {71,78,70}, 222,2 , 0,7 , 19,5 , 4,0 , 4874,6 , 4913,4 , 0, 0, 1, 6, 7 }, // Fulah/Latin/Guinea + { 177, 7, 92, 44, 160, 59, 37, 48, 45, 43, 101, 8222, 8221, 8218, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 37,5 , 8,10 , 14699,28 , 14727,59 , 14786,14 , 14699,28 , 14727,59 , 14786,14 , 515,6 , 488,7 , 45,4 , 5,17 , 22,23 , {88,79,70}, 207,5 , 16258,26 , 19,5 , 4,0 , 4874,6 , 4917,12 , 0, 0, 1, 6, 7 }, // Fulah/Latin/Guinea Bissau { 177, 7, 121, 44, 160, 59, 37, 48, 45, 43, 101, 8222, 8221, 8218, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 18,7 , 25,12 , 14699,28 , 14727,59 , 14786,14 , 14699,28 , 14727,59 , 14786,14 , 515,6 , 488,7 , 45,4 , 5,17 , 22,23 , {76,82,68}, 6,1 , 16329,23 , 19,5 , 4,0 , 4874,6 , 4929,9 , 2, 1, 1, 6, 7 }, // Fulah/Latin/Liberia - { 177, 7, 136, 44, 160, 59, 37, 48, 45, 43, 101, 8222, 8221, 8218, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 18,7 , 25,12 , 14699,28 , 14727,59 , 14786,14 , 14699,28 , 14727,59 , 14786,14 , 515,6 , 488,7 , 45,4 , 5,17 , 22,23 , {77,82,85}, 223,2 , 16352,22 , 19,5 , 4,0 , 4874,6 , 4938,8 , 2, 1, 1, 6, 7 }, // Fulah/Latin/Mauritania - { 177, 7, 156, 44, 160, 59, 37, 48, 45, 43, 101, 8222, 8221, 8218, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 37,5 , 8,10 , 14699,28 , 14727,59 , 14786,14 , 14699,28 , 14727,59 , 14786,14 , 515,6 , 488,7 , 45,4 , 5,17 , 22,23 , {88,79,70}, 207,3 , 16258,26 , 19,5 , 4,0 , 4874,6 , 4946,6 , 0, 0, 1, 6, 7 }, // Fulah/Latin/Niger + { 177, 7, 136, 44, 160, 59, 37, 48, 45, 43, 101, 8222, 8221, 8218, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 18,7 , 25,12 , 14699,28 , 14727,59 , 14786,14 , 14699,28 , 14727,59 , 14786,14 , 515,6 , 488,7 , 45,4 , 5,17 , 22,23 , {77,82,85}, 225,2 , 16352,22 , 19,5 , 4,0 , 4874,6 , 4938,8 , 2, 1, 1, 6, 7 }, // Fulah/Latin/Mauritania + { 177, 7, 156, 44, 160, 59, 37, 48, 45, 43, 101, 8222, 8221, 8218, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 37,5 , 8,10 , 14699,28 , 14727,59 , 14786,14 , 14699,28 , 14727,59 , 14786,14 , 515,6 , 488,7 , 45,4 , 5,17 , 22,23 , {88,79,70}, 207,5 , 16258,26 , 19,5 , 4,0 , 4874,6 , 4946,6 , 0, 0, 1, 6, 7 }, // Fulah/Latin/Niger { 177, 7, 157, 44, 160, 59, 37, 48, 45, 43, 101, 8222, 8221, 8218, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 37,5 , 8,10 , 14699,28 , 14727,59 , 14786,14 , 14699,28 , 14727,59 , 14786,14 , 515,6 , 488,7 , 45,4 , 5,17 , 22,23 , {78,71,78}, 178,1 , 16374,23 , 19,5 , 4,0 , 4874,6 , 4952,9 , 2, 1, 1, 6, 7 }, // Fulah/Latin/Nigeria { 177, 7, 189, 44, 160, 59, 37, 48, 45, 43, 101, 8222, 8221, 8218, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 18,7 , 25,12 , 14699,28 , 14727,59 , 14786,14 , 14699,28 , 14727,59 , 14786,14 , 515,6 , 488,7 , 45,4 , 5,17 , 22,23 , {83,76,76}, 187,2 , 16397,25 , 19,5 , 4,0 , 4874,6 , 4961,11 , 0, 0, 1, 6, 7 }, // Fulah/Latin/Sierra Leone { 178, 7, 111, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 10,17 , 37,5 , 8,10 , 14800,28 , 14828,63 , 14891,14 , 14800,28 , 14828,63 , 14891,14 , 521,6 , 495,8 , 45,4 , 5,17 , 22,23 , {75,69,83}, 2,3 , 16422,23 , 4,4 , 13,6 , 4972,6 , 1191,5 , 2, 1, 7, 6, 7 }, // Kikuyu/Latin/Kenya { 179, 7, 111, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 10,17 , 37,5 , 8,10 , 14905,28 , 14933,105 , 15038,14 , 14905,28 , 14933,105 , 15038,14 , 527,7 , 503,5 , 45,4 , 5,17 , 22,23 , {75,69,83}, 2,3 , 16445,25 , 4,4 , 13,6 , 4978,8 , 1191,5 , 2, 1, 7, 6, 7 }, // Samburu/Latin/Kenya - { 180, 7, 146, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 669,27 , 37,5 , 8,10 , 15052,28 , 15080,55 , 15135,14 , 15052,28 , 15080,55 , 15135,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {77,90,78}, 282,3 , 16470,28 , 0,4 , 4,0 , 4986,4 , 3382,10 , 2, 1, 7, 6, 7 }, // Sena/Latin/Mozambique + { 180, 7, 146, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 669,27 , 37,5 , 8,10 , 15052,28 , 15080,55 , 15135,14 , 15052,28 , 15080,55 , 15135,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {77,90,78}, 284,3 , 16470,28 , 0,4 , 4,0 , 4986,4 , 3382,10 , 2, 1, 7, 6, 7 }, // Sena/Latin/Mozambique { 181, 7, 240, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 10,17 , 37,5 , 8,10 , 15149,28 , 15177,50 , 15227,14 , 15149,28 , 15177,50 , 15227,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {85,83,68}, 159,3 , 16498,24 , 4,4 , 13,6 , 4990,10 , 1819,8 , 2, 1, 7, 6, 7 }, // North Ndebele/Latin/Zimbabwe { 182, 7, 210, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 10,17 , 37,5 , 8,10 , 15241,29 , 15270,65 , 15335,14 , 15241,29 , 15270,65 , 15335,14 , 534,8 , 508,7 , 45,4 , 5,17 , 22,23 , {84,90,83}, 192,3 , 16522,25 , 4,4 , 4,0 , 5000,9 , 1624,8 , 2, 0, 1, 6, 7 }, // Rombo/Latin/Tanzania { 183, 9, 145, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8222, 8221, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 37,5 , 8,10 , 15349,30 , 15379,47 , 85,14 , 15349,30 , 15379,47 , 85,14 , 542,6 , 515,8 , 45,4 , 5,17 , 22,23 , {77,65,68}, 0,0 , 16547,21 , 0,4 , 4,0 , 5009,7 , 5016,6 , 2, 1, 1, 6, 7 }, // Tachelhit/Tifinagh/Morocco { 183, 7, 145, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8222, 8221, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 37,5 , 8,10 , 15426,30 , 15456,48 , 85,14 , 15426,30 , 15456,48 , 85,14 , 548,6 , 523,8 , 45,4 , 5,17 , 22,23 , {77,65,68}, 0,0 , 16568,21 , 0,4 , 4,0 , 5022,10 , 5032,6 , 2, 1, 1, 6, 7 }, // Tachelhit/Latin/Morocco - { 184, 7, 3, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 957,8 , 965,7 , 415,8 , 97,16 , 18,7 , 25,12 , 15504,28 , 15532,34 , 15566,14 , 15580,30 , 15610,51 , 15661,14 , 554,7 , 531,9 , 1266,7 , 1273,21 , 22,23 , {68,90,68}, 205,2 , 16589,57 , 0,4 , 4,0 , 5038,9 , 5047,8 , 2, 1, 6, 5, 6 }, // Kabyle/Latin/Algeria + { 184, 7, 3, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 957,8 , 965,7 , 415,8 , 97,16 , 18,7 , 25,12 , 15504,28 , 15532,34 , 15566,14 , 15580,30 , 15610,51 , 15661,14 , 554,7 , 531,9 , 1204,7 , 1211,21 , 22,23 , {68,90,68}, 205,2 , 16589,57 , 0,4 , 4,0 , 5038,9 , 5047,8 , 2, 1, 6, 5, 6 }, // Kabyle/Latin/Algeria { 185, 7, 221, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 10,17 , 37,5 , 8,10 , 15675,28 , 15703,74 , 15777,14 , 15675,28 , 15703,74 , 15777,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {85,71,88}, 197,3 , 16646,26 , 4,4 , 4,0 , 5055,10 , 1689,6 , 0, 0, 1, 7, 7 }, // Nyankole/Latin/Uganda { 186, 7, 210, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 10,17 , 37,5 , 8,10 , 15791,28 , 15819,82 , 15901,14 , 15791,28 , 15819,82 , 15901,14 , 561,7 , 540,7 , 45,4 , 5,17 , 22,23 , {84,90,83}, 192,3 , 16672,29 , 0,4 , 4,0 , 5065,6 , 5071,10 , 2, 0, 1, 6, 7 }, // Bena/Latin/Tanzania { 187, 7, 210, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 10,17 , 37,5 , 8,10 , 15915,28 , 15943,62 , 16005,14 , 15915,28 , 15943,62 , 16005,14 , 568,5 , 547,9 , 45,4 , 5,17 , 22,23 , {84,90,83}, 192,3 , 16701,27 , 4,4 , 4,0 , 5081,8 , 1624,8 , 2, 0, 1, 6, 7 }, // Vunjo/Latin/Tanzania - { 188, 7, 132, 46, 44, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 37,5 , 8,10 , 16019,28 , 16047,44 , 16091,14 , 16019,28 , 16047,44 , 16091,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {88,79,70}, 207,3 , 16728,24 , 4,4 , 13,6 , 5089,9 , 2188,4 , 0, 0, 1, 6, 7 }, // Bambara/Latin/Mali - { 188, 75, 132, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {88,79,70}, 207,3 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 0, 0, 1, 6, 7 }, // Bambara/Nko/Mali + { 188, 7, 132, 46, 44, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 37,5 , 8,10 , 16019,28 , 16047,44 , 16091,14 , 16019,28 , 16047,44 , 16091,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {88,79,70}, 207,5 , 16728,24 , 4,4 , 13,6 , 5089,9 , 2188,4 , 0, 0, 1, 6, 7 }, // Bambara/Latin/Mali + { 188, 75, 132, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {88,79,70}, 207,5 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 0, 0, 1, 6, 7 }, // Bambara/Nko/Mali { 189, 7, 111, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 10,17 , 37,5 , 8,10 , 16105,28 , 16133,64 , 16197,14 , 16105,28 , 16133,64 , 16197,14 , 573,2 , 556,2 , 45,4 , 5,17 , 22,23 , {75,69,83}, 2,3 , 16234,24 , 4,4 , 13,6 , 5098,6 , 1191,5 , 2, 1, 7, 6, 7 }, // Embu/Latin/Kenya - { 190, 12, 225, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 972,9 , 981,8 , 547,6 , 35,18 , 18,7 , 25,12 , 16211,28 , 16239,49 , 16288,14 , 16211,28 , 16239,49 , 16288,14 , 575,3 , 558,6 , 1294,6 , 5,17 , 22,23 , {85,83,68}, 6,1 , 16752,25 , 4,4 , 13,6 , 5104,3 , 5107,15 , 2, 1, 7, 6, 7 }, // Cherokee/Cherokee/United States + { 190, 12, 225, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 972,9 , 981,8 , 547,6 , 35,18 , 18,7 , 25,12 , 16211,28 , 16239,49 , 16288,14 , 16211,28 , 16239,49 , 16288,14 , 575,3 , 558,6 , 1232,6 , 5,17 , 22,23 , {85,83,68}, 6,1 , 16752,25 , 4,4 , 13,6 , 5104,3 , 5107,15 , 2, 1, 7, 6, 7 }, // Cherokee/Cherokee/United States { 191, 7, 137, 46, 160, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 37,5 , 8,10 , 16302,27 , 16329,48 , 16377,14 , 16302,27 , 16329,48 , 16377,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {77,85,82}, 176,2 , 16777,21 , 8,5 , 4,0 , 5122,14 , 5136,5 , 2, 0, 1, 6, 7 }, // Morisyen/Latin/Mauritius { 192, 7, 210, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 10,17 , 37,5 , 8,10 , 16391,28 , 16419,133 , 15335,14 , 16391,28 , 16419,133 , 15335,14 , 578,4 , 564,5 , 45,4 , 5,17 , 22,23 , {84,90,83}, 192,3 , 16701,27 , 4,4 , 13,6 , 5141,10 , 1624,8 , 2, 0, 1, 6, 7 }, // Makonde/Latin/Tanzania { 193, 7, 210, 46, 44, 59, 37, 48, 45, 43, 101, 8221, 8221, 8217, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 10,17 , 37,5 , 8,10 , 16552,36 , 16588,63 , 16651,14 , 16552,36 , 16588,63 , 16651,14 , 582,3 , 569,3 , 45,4 , 5,17 , 22,23 , {84,90,83}, 192,3 , 16798,29 , 8,5 , 4,0 , 5151,8 , 5159,9 , 2, 0, 1, 6, 7 }, // Langi/Latin/Tanzania { 194, 7, 221, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 10,17 , 37,5 , 8,10 , 16665,28 , 16693,66 , 16759,14 , 16665,28 , 16693,66 , 16759,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {85,71,88}, 197,3 , 16827,26 , 0,4 , 4,0 , 5168,7 , 5175,7 , 0, 0, 1, 7, 7 }, // Ganda/Latin/Uganda { 195, 7, 239, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 10,17 , 18,7 , 25,12 , 16773,80 , 16773,80 , 85,14 , 16773,80 , 16773,80 , 85,14 , 585,8 , 572,7 , 45,4 , 5,17 , 22,23 , {90,77,87}, 131,1 , 0,7 , 4,4 , 13,6 , 5182,9 , 1813,6 , 2, 1, 1, 6, 7 }, // Bemba/Latin/Zambia - { 196, 7, 39, 44, 160, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 159,7 , 159,7 , 119,10 , 1640,27 , 37,5 , 8,10 , 16853,28 , 16881,73 , 16954,14 , 16853,28 , 16881,73 , 16954,14 , 68,2 , 65,2 , 45,4 , 5,17 , 22,23 , {67,86,69}, 281,1 , 16853,43 , 19,5 , 24,7 , 5191,12 , 5203,10 , 2, 1, 1, 6, 7 }, // Kabuverdianu/Latin/Cape Verde + { 196, 7, 39, 44, 160, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 159,7 , 159,7 , 119,10 , 1640,27 , 37,5 , 8,10 , 16853,28 , 16881,73 , 16954,14 , 16853,28 , 16881,73 , 16954,14 , 68,2 , 65,2 , 45,4 , 5,17 , 22,23 , {67,86,69}, 283,1 , 16853,43 , 19,5 , 24,7 , 5191,12 , 5203,10 , 2, 1, 1, 6, 7 }, // Kabuverdianu/Latin/Cape Verde { 197, 7, 111, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 10,17 , 37,5 , 8,10 , 16968,28 , 16996,51 , 17047,14 , 16968,28 , 16996,51 , 17047,14 , 593,2 , 579,2 , 45,4 , 5,17 , 22,23 , {75,69,83}, 2,3 , 16234,24 , 4,4 , 13,6 , 5213,6 , 1191,5 , 2, 1, 7, 6, 7 }, // Meru/Latin/Kenya { 198, 7, 111, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 10,17 , 37,5 , 8,10 , 17061,28 , 17089,53 , 17142,14 , 17061,28 , 17089,53 , 17142,14 , 595,6 , 581,10 , 45,4 , 5,17 , 22,23 , {75,69,83}, 2,3 , 16896,26 , 4,4 , 13,6 , 5219,8 , 5227,12 , 2, 1, 7, 6, 7 }, // Kalenjin/Latin/Kenya { 199, 7, 148, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 10,17 , 18,7 , 25,12 , 17156,23 , 17179,92 , 17271,14 , 17156,23 , 17179,92 , 17271,14 , 601,7 , 591,5 , 45,4 , 5,17 , 22,23 , {78,65,68}, 6,1 , 16922,22 , 4,4 , 4,0 , 5239,13 , 5252,8 , 2, 1, 1, 6, 7 }, // Nama/Latin/Namibia @@ -1800,35 +1797,35 @@ static const QLocaleData locale_data[] = { { 206, 7, 221, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 10,17 , 37,5 , 8,10 , 17681,28 , 17709,69 , 17778,14 , 17681,28 , 17709,69 , 17778,14 , 648,9 , 632,6 , 45,4 , 5,17 , 22,23 , {85,71,88}, 197,3 , 17059,28 , 4,4 , 13,6 , 5325,6 , 1689,6 , 0, 0, 1, 7, 7 }, // Teso/Latin/Uganda { 206, 7, 111, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 10,17 , 37,5 , 8,10 , 17681,28 , 17709,69 , 17778,14 , 17681,28 , 17709,69 , 17778,14 , 648,9 , 632,6 , 45,4 , 5,17 , 22,23 , {75,69,83}, 2,3 , 17087,27 , 4,4 , 13,6 , 5325,6 , 5331,5 , 2, 1, 7, 6, 7 }, // Teso/Latin/Kenya { 207, 7, 67, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {69,82,78}, 0,0 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 1, 6, 7 }, // Saho/Latin/Eritrea - { 208, 7, 132, 46, 160, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 37,5 , 8,10 , 17792,28 , 17820,53 , 17873,14 , 17792,28 , 17820,53 , 17873,14 , 657,6 , 638,6 , 45,4 , 5,17 , 22,23 , {88,79,70}, 207,3 , 17114,23 , 0,4 , 4,0 , 5336,11 , 5347,5 , 0, 0, 1, 6, 7 }, // Koyra Chiini/Latin/Mali + { 208, 7, 132, 46, 160, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 37,5 , 8,10 , 17792,28 , 17820,53 , 17873,14 , 17792,28 , 17820,53 , 17873,14 , 657,6 , 638,6 , 45,4 , 5,17 , 22,23 , {88,79,70}, 207,5 , 17114,23 , 0,4 , 4,0 , 5336,11 , 5347,5 , 0, 0, 1, 6, 7 }, // Koyra Chiini/Latin/Mali { 209, 7, 210, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 10,17 , 37,5 , 8,10 , 15915,28 , 15943,62 , 16005,14 , 15915,28 , 15943,62 , 16005,14 , 568,5 , 547,9 , 45,4 , 5,17 , 22,23 , {84,90,83}, 192,3 , 16701,27 , 0,4 , 4,0 , 5352,6 , 1624,8 , 2, 0, 1, 6, 7 }, // Rwa/Latin/Tanzania { 210, 7, 111, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 10,17 , 37,5 , 8,10 , 17887,28 , 17915,69 , 17984,14 , 17887,28 , 17915,69 , 17984,14 , 663,2 , 644,2 , 45,4 , 5,17 , 22,23 , {75,69,83}, 2,3 , 17137,23 , 0,4 , 4,0 , 5358,6 , 1191,5 , 2, 1, 7, 6, 7 }, // Luo/Latin/Kenya { 211, 7, 221, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 10,17 , 37,5 , 8,10 , 15675,28 , 15703,74 , 15777,14 , 15675,28 , 15703,74 , 15777,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {85,71,88}, 197,3 , 16646,26 , 4,4 , 4,0 , 5364,6 , 1689,6 , 0, 0, 1, 7, 7 }, // Chiga/Latin/Uganda { 212, 7, 145, 44, 160, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 10,17 , 37,5 , 8,10 , 17998,28 , 18026,48 , 18074,14 , 17998,28 , 18026,48 , 18074,14 , 665,9 , 646,10 , 45,4 , 5,17 , 22,23 , {77,65,68}, 0,0 , 17160,22 , 19,5 , 4,0 , 5370,17 , 5387,6 , 2, 1, 1, 6, 7 }, // Central Morocco Tamazight/Latin/Morocco - { 213, 7, 132, 46, 160, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 37,5 , 8,10 , 18088,28 , 18116,54 , 17873,14 , 18088,28 , 18116,54 , 17873,14 , 657,6 , 638,6 , 45,4 , 5,17 , 22,23 , {88,79,70}, 207,3 , 17114,23 , 0,4 , 4,0 , 5393,15 , 5347,5 , 0, 0, 1, 6, 7 }, // Koyraboro Senni/Latin/Mali + { 213, 7, 132, 46, 160, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 37,5 , 8,10 , 18088,28 , 18116,54 , 17873,14 , 18088,28 , 18116,54 , 17873,14 , 657,6 , 638,6 , 45,4 , 5,17 , 22,23 , {88,79,70}, 207,5 , 17114,23 , 0,4 , 4,0 , 5393,15 , 5347,5 , 0, 0, 1, 6, 7 }, // Koyraboro Senni/Latin/Mali { 214, 7, 210, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 10,17 , 37,5 , 8,10 , 18170,28 , 18198,63 , 18261,14 , 18170,28 , 18198,63 , 18261,14 , 674,5 , 656,8 , 45,4 , 5,17 , 22,23 , {84,90,83}, 192,3 , 17182,27 , 0,4 , 4,0 , 5408,9 , 1624,8 , 2, 0, 1, 6, 7 }, // Shambala/Latin/Tanzania { 215, 13, 100, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 547,6 , 35,18 , 18,7 , 25,12 , 18275,33 , 18308,54 , 18362,19 , 18275,33 , 18308,54 , 18362,19 , 679,3 , 664,6 , 45,4 , 5,17 , 22,23 , {73,78,82}, 121,1 , 17209,10 , 8,5 , 4,0 , 5417,4 , 2666,4 , 2, 1, 7, 7, 7 }, // Bodo/Devanagari/India { 218, 2, 178, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 18381,25 , 18406,45 , 18451,17 , 18381,25 , 18406,45 , 18381,25 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {82,85,66}, 123,1 , 17219,43 , 19,5 , 4,0 , 5421,7 , 5428,5 , 2, 1, 1, 6, 7 }, // Chechen/Cyrillic/Russia { 219, 2, 178, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {82,85,66}, 123,1 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 1, 6, 7 }, // Church/Cyrillic/Russia { 220, 2, 178, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {82,85,66}, 123,1 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 1, 6, 7 }, // Chuvash/Cyrillic/Russia - { 230, 7, 49, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 37,5 , 8,10 , 18468,28 , 18496,50 , 18546,14 , 18468,28 , 18496,50 , 18546,14 , 682,5 , 670,6 , 45,4 , 5,17 , 22,23 , {67,68,70}, 214,2 , 17262,24 , 0,4 , 4,0 , 5433,8 , 5441,16 , 2, 1, 1, 6, 7 }, // Luba Katanga/Latin/Congo Kinshasa - { 231, 7, 125, 44, 46, 59, 37, 48, 45, 43, 101, 8222, 8220, 8218, 8216, 0,6 , 0,6 , 989,10 , 989,10 , 156,8 , 622,18 , 37,5 , 8,10 , 18560,28 , 18588,65 , 3695,14 , 18653,35 , 18588,65 , 3695,14 , 687,5 , 676,8 , 424,5 , 5,17 , 22,23 , {69,85,82}, 14,1 , 8436,19 , 19,5 , 4,0 , 5457,14 , 5471,10 , 2, 1, 1, 6, 7 }, // Luxembourgish/Latin/Luxembourg + { 230, 7, 49, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 37,5 , 8,10 , 18468,28 , 18496,50 , 18546,14 , 18468,28 , 18496,50 , 18546,14 , 682,5 , 670,6 , 45,4 , 5,17 , 22,23 , {67,68,70}, 216,2 , 17262,24 , 0,4 , 4,0 , 5433,8 , 5441,16 , 2, 1, 1, 6, 7 }, // Luba Katanga/Latin/Congo Kinshasa + { 231, 7, 125, 44, 46, 59, 37, 48, 45, 43, 101, 8222, 8220, 8218, 8216, 0,6 , 0,6 , 989,10 , 989,10 , 156,8 , 622,18 , 37,5 , 8,10 , 18560,28 , 18588,65 , 3695,14 , 18653,35 , 18588,65 , 3695,14 , 687,5 , 676,8 , 404,5 , 5,17 , 22,23 , {69,85,82}, 14,1 , 8436,19 , 19,5 , 4,0 , 5457,14 , 5471,10 , 2, 1, 1, 6, 7 }, // Luxembourgish/Latin/Luxembourg { 232, 7, 225, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {85,83,68}, 159,3 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 7, 6, 7 }, // Navaho/Latin/United States { 236, 7, 21, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {69,85,82}, 14,1 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 1, 6, 7 }, // Walloon/Latin/Belgium { 237, 7, 37, 44, 160, 59, 37, 48, 45, 43, 101, 8222, 8221, 8218, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 37,5 , 8,10 , 18688,28 , 18716,72 , 18788,14 , 18688,28 , 18716,72 , 18788,14 , 692,3 , 684,3 , 45,4 , 5,17 , 22,23 , {88,65,70}, 32,4 , 17286,21 , 0,4 , 4,0 , 5481,5 , 5486,7 , 0, 0, 1, 6, 7 }, // Aghem/Latin/Cameroon { 238, 7, 37, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8222, 8220, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 37,5 , 8,10 , 18802,28 , 18830,70 , 18900,14 , 18802,28 , 18830,70 , 18900,14 , 695,10 , 687,9 , 45,4 , 5,17 , 22,23 , {88,65,70}, 32,4 , 17307,22 , 19,5 , 4,0 , 5493,5 , 5498,8 , 0, 0, 1, 6, 7 }, // Basaa/Latin/Cameroon - { 239, 7, 156, 46, 160, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 37,5 , 8,10 , 18088,28 , 18914,53 , 18967,14 , 18088,28 , 18914,53 , 18967,14 , 705,8 , 696,10 , 45,4 , 5,17 , 22,23 , {88,79,70}, 207,3 , 17114,23 , 0,4 , 4,0 , 5506,10 , 5516,5 , 0, 0, 1, 6, 7 }, // Zarma/Latin/Niger + { 239, 7, 156, 46, 160, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 37,5 , 8,10 , 18088,28 , 18914,53 , 18967,14 , 18088,28 , 18914,53 , 18967,14 , 705,8 , 696,10 , 45,4 , 5,17 , 22,23 , {88,79,70}, 207,5 , 17114,23 , 0,4 , 4,0 , 5506,10 , 5516,5 , 0, 0, 1, 6, 7 }, // Zarma/Latin/Niger { 240, 7, 37, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 37,5 , 8,10 , 18981,28 , 19009,45 , 19054,14 , 18981,28 , 19009,45 , 19054,14 , 713,5 , 706,6 , 45,4 , 5,17 , 22,23 , {88,65,70}, 32,4 , 0,7 , 19,5 , 4,0 , 5521,5 , 1985,8 , 0, 0, 1, 6, 7 }, // Duala/Latin/Cameroon - { 241, 7, 187, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 37,5 , 8,10 , 19068,28 , 19096,50 , 19146,14 , 19068,28 , 19096,50 , 19146,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {88,79,70}, 207,3 , 17329,23 , 19,5 , 4,0 , 5526,5 , 5531,7 , 0, 0, 1, 6, 7 }, // Jola Fonyi/Latin/Senegal + { 241, 7, 187, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 37,5 , 8,10 , 19068,28 , 19096,50 , 19146,14 , 19068,28 , 19096,50 , 19146,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {88,79,70}, 207,5 , 17329,23 , 19,5 , 4,0 , 5526,5 , 5531,7 , 0, 0, 1, 6, 7 }, // Jola Fonyi/Latin/Senegal { 242, 7, 37, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 37,5 , 8,10 , 19160,30 , 19190,85 , 19275,14 , 19160,30 , 19190,85 , 19275,14 , 718,7 , 712,9 , 45,4 , 5,17 , 22,23 , {88,65,70}, 32,4 , 17352,23 , 19,5 , 4,0 , 5538,6 , 5544,7 , 0, 0, 1, 6, 7 }, // Ewondo/Latin/Cameroon { 243, 7, 37, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 37,5 , 8,10 , 19289,29 , 19318,45 , 19363,14 , 19289,29 , 19318,45 , 19363,14 , 725,6 , 721,7 , 45,4 , 5,17 , 22,23 , {88,65,70}, 32,4 , 17375,11 , 19,5 , 4,0 , 5551,5 , 5556,7 , 0, 0, 1, 6, 7 }, // Bafia/Latin/Cameroon - { 244, 7, 146, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 10,17 , 37,5 , 8,10 , 19377,28 , 19405,59 , 19464,14 , 19377,28 , 19405,59 , 19464,14 , 731,8 , 728,10 , 45,4 , 5,17 , 22,23 , {77,90,78}, 282,3 , 0,7 , 8,5 , 4,0 , 5563,5 , 5568,10 , 2, 1, 7, 6, 7 }, // Makhuwa Meetto/Latin/Mozambique + { 244, 7, 146, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 10,17 , 37,5 , 8,10 , 19377,28 , 19405,59 , 19464,14 , 19377,28 , 19405,59 , 19464,14 , 731,8 , 728,10 , 45,4 , 5,17 , 22,23 , {77,90,78}, 284,3 , 0,7 , 8,5 , 4,0 , 5563,5 , 5568,10 , 2, 1, 7, 6, 7 }, // Makhuwa Meetto/Latin/Mozambique { 245, 7, 37, 44, 46, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 37,5 , 8,10 , 19478,28 , 19506,74 , 19580,14 , 19478,28 , 19506,74 , 19580,14 , 739,5 , 738,5 , 45,4 , 5,17 , 22,23 , {88,65,70}, 32,4 , 17386,17 , 4,4 , 13,6 , 5578,6 , 5584,7 , 0, 0, 1, 6, 7 }, // Mundang/Latin/Cameroon { 246, 7, 37, 44, 160, 59, 37, 48, 45, 43, 101, 8222, 8221, 171, 187, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 37,5 , 8,10 , 19594,30 , 19624,89 , 19713,14 , 19594,30 , 19624,89 , 19713,14 , 744,4 , 743,4 , 45,4 , 5,17 , 22,23 , {88,65,70}, 32,4 , 17403,20 , 19,5 , 4,0 , 5591,6 , 5597,7 , 0, 0, 1, 6, 7 }, // Kwasio/Latin/Cameroon { 247, 7, 254, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 538,9 , 97,16 , 18,7 , 554,12 , 19727,38 , 19765,79 , 19844,14 , 19727,38 , 19765,79 , 19844,14 , 748,2 , 747,2 , 45,4 , 5,17 , 22,23 , {83,83,80}, 119,1 , 0,7 , 4,4 , 13,6 , 5604,9 , 0,0 , 2, 1, 1, 6, 7 }, // Nuer/Latin/South Sudan - { 248, 2, 178, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8222, 8220, 0,6 , 0,6 , 999,11 , 999,11 , 227,6 , 1690,30 , 37,5 , 8,10 , 19858,21 , 19879,71 , 19950,14 , 19858,21 , 19879,71 , 19950,14 , 750,2 , 749,2 , 1300,5 , 1305,17 , 22,23 , {82,85,66}, 123,1 , 17423,47 , 19,5 , 4,0 , 5613,9 , 5622,9 , 2, 1, 1, 6, 7 }, // Sakha/Cyrillic/Russia + { 248, 2, 178, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8222, 8220, 0,6 , 0,6 , 999,11 , 999,11 , 227,6 , 1690,30 , 37,5 , 8,10 , 19858,21 , 19879,71 , 19950,14 , 19858,21 , 19879,71 , 19950,14 , 750,2 , 749,2 , 1238,5 , 1243,17 , 22,23 , {82,85,66}, 123,1 , 17423,47 , 19,5 , 4,0 , 5613,9 , 5622,9 , 2, 1, 1, 6, 7 }, // Sakha/Cyrillic/Russia { 249, 7, 210, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 10,17 , 37,5 , 8,10 , 19964,28 , 19992,60 , 20052,14 , 19964,28 , 19992,60 , 20052,14 , 752,9 , 751,9 , 45,4 , 5,17 , 22,23 , {84,90,83}, 192,3 , 17470,25 , 0,4 , 4,0 , 5631,9 , 5640,9 , 2, 0, 1, 6, 7 }, // Sangu/Latin/Tanzania - { 251, 7, 156, 46, 160, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 37,5 , 8,10 , 18088,28 , 18116,54 , 17873,14 , 18088,28 , 18116,54 , 17873,14 , 705,8 , 696,10 , 45,4 , 5,17 , 22,23 , {88,79,70}, 207,3 , 17114,23 , 0,4 , 4,0 , 5649,13 , 5516,5 , 0, 0, 1, 6, 7 }, // Tasawaq/Latin/Niger + { 251, 7, 156, 46, 160, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 37,5 , 8,10 , 18088,28 , 18116,54 , 17873,14 , 18088,28 , 18116,54 , 17873,14 , 705,8 , 696,10 , 45,4 , 5,17 , 22,23 , {88,79,70}, 207,5 , 17114,23 , 0,4 , 4,0 , 5649,13 , 5516,5 , 0, 0, 1, 6, 7 }, // Tasawaq/Latin/Niger { 252, 35, 121, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 10,17 , 18,7 , 25,12 , 20066,30 , 20066,30 , 85,14 , 20066,30 , 20066,30 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {76,82,68}, 6,1 , 17495,15 , 4,4 , 13,6 , 5662,2 , 5664,4 , 2, 1, 1, 6, 7 }, // Vai/Vai/Liberia { 252, 7, 121, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 10,17 , 18,7 , 25,12 , 20096,48 , 20096,48 , 85,14 , 20096,48 , 20096,48 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {76,82,68}, 6,1 , 17510,20 , 4,4 , 13,6 , 5668,3 , 5671,8 , 2, 1, 1, 6, 7 }, // Vai/Latin/Liberia { 253, 7, 206, 44, 8217, 59, 37, 48, 45, 43, 101, 171, 187, 8249, 8250, 0,6 , 0,6 , 265,9 , 265,9 , 53,10 , 622,18 , 37,5 , 8,10 , 20144,28 , 20172,53 , 20225,14 , 20144,28 , 20172,53 , 20225,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {67,72,70}, 0,0 , 0,7 , 8,5 , 4,0 , 5679,6 , 5685,6 , 2, 0, 1, 6, 7 }, // Walser/Latin/Switzerland @@ -1844,7 +1841,7 @@ static const QLocaleData locale_data[] = { { 290, 72, 100, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {73,78,82}, 121,1 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 7, 7, 7 }, // Manipuri/Meitei Mayek/India { 304, 78, 100, 46, 44, 59, 37, 7248, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 269,6 , 10,17 , 18,7 , 25,12 , 21060,26 , 21086,42 , 21128,14 , 21060,26 , 21086,42 , 21128,14 , 806,5 , 814,5 , 45,4 , 5,17 , 22,23 , {73,78,82}, 121,1 , 17658,71 , 8,5 , 4,0 , 5792,7 , 5799,6 , 2, 1, 7, 7, 7 }, // Santali/Ol Chiki/India { 304, 13, 100, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {73,78,82}, 121,1 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 7, 7, 7 }, // Santali/Devanagari/India - { 309, 100, 232, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {86,78,68}, 340,1 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 0, 0, 1, 6, 7 }, // Tai Dam/Tai Viet/Vietnam + { 309, 100, 232, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {86,78,68}, 342,1 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 0, 0, 1, 6, 7 }, // Tai Dam/Tai Viet/Vietnam { 312, 7, 37, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {88,65,70}, 32,4 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 0, 0, 1, 6, 7 }, // Akoose/Latin/Cameroon { 313, 7, 225, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 547,6 , 35,18 , 18,7 , 25,12 , 21142,87 , 21142,87 , 85,14 , 21142,87 , 21142,87 , 21229,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {85,83,68}, 6,1 , 0,7 , 8,5 , 4,0 , 5805,12 , 5817,22 , 2, 1, 7, 6, 7 }, // Lakota/Latin/United States { 314, 9, 145, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8222, 8221, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 37,5 , 8,10 , 15349,30 , 21243,48 , 85,14 , 15349,30 , 21243,48 , 85,14 , 542,6 , 515,8 , 45,4 , 5,17 , 22,23 , {77,65,68}, 0,0 , 16547,21 , 0,4 , 4,0 , 5839,8 , 5016,6 , 2, 1, 1, 6, 7 }, // Standard Moroccan Tamazight/Tifinagh/Morocco @@ -1852,35 +1849,35 @@ static const QLocaleData locale_data[] = { { 316, 1, 103, 1643, 1644, 1563, 1642, 1632, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 18,7 , 25,12 , 21291,58 , 21291,58 , 21349,14 , 21291,58 , 21291,58 , 21349,14 , 811,3 , 819,3 , 45,4 , 5,17 , 22,23 , {73,81,68}, 44,5 , 17729,20 , 19,5 , 4,0 , 5847,14 , 5861,5 , 0, 0, 6, 5, 6 }, // Central Kurdish/Arabic/Iraq { 316, 1, 102, 1643, 1644, 1563, 1642, 1632, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 21291,58 , 21291,58 , 21349,14 , 21291,58 , 21291,58 , 21349,14 , 811,3 , 819,3 , 45,4 , 5,17 , 22,23 , {73,82,82}, 0,0 , 17749,19 , 19,5 , 4,0 , 5847,14 , 5866,5 , 0, 0, 6, 5, 5 }, // Central Kurdish/Arabic/Iran { 317, 7, 82, 44, 46, 59, 37, 48, 45, 43, 101, 8222, 8220, 8218, 8216, 0,6 , 0,6 , 181,7 , 181,7 , 113,6 , 622,18 , 55,4 , 59,9 , 21363,28 , 21391,53 , 21444,14 , 21363,28 , 21391,53 , 21444,14 , 814,9 , 822,10 , 45,4 , 5,17 , 22,23 , {69,85,82}, 14,1 , 17768,27 , 19,5 , 4,0 , 5871,14 , 5885,6 , 2, 1, 1, 6, 7 }, // Lower Sorbian/Latin/Germany - { 318, 7, 82, 44, 46, 59, 37, 48, 45, 43, 101, 8222, 8220, 8218, 8216, 0,6 , 0,6 , 181,7 , 181,7 , 113,6 , 622,18 , 566,12 , 59,9 , 21458,28 , 21486,53 , 21539,14 , 21458,28 , 21486,53 , 21539,14 , 814,9 , 832,9 , 1322,5 , 5,17 , 22,23 , {69,85,82}, 14,1 , 17795,29 , 19,5 , 4,0 , 5891,15 , 5906,6 , 2, 1, 1, 6, 7 }, // Upper Sorbian/Latin/Germany + { 318, 7, 82, 44, 46, 59, 37, 48, 45, 43, 101, 8222, 8220, 8218, 8216, 0,6 , 0,6 , 181,7 , 181,7 , 113,6 , 622,18 , 566,12 , 59,9 , 21458,28 , 21486,53 , 21539,14 , 21458,28 , 21486,53 , 21539,14 , 814,9 , 832,9 , 1260,5 , 5,17 , 22,23 , {69,85,82}, 14,1 , 17795,29 , 19,5 , 4,0 , 5891,15 , 5906,6 , 2, 1, 1, 6, 7 }, // Upper Sorbian/Latin/Germany { 319, 7, 37, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {88,65,70}, 32,4 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 0, 0, 1, 6, 7 }, // Kenyang/Latin/Cameroon - { 320, 7, 38, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {67,65,68}, 244,3 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 0, 7, 6, 7 }, // Mohawk/Latin/Canada - { 321, 75, 91, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {71,78,70}, 220,2 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 0, 0, 1, 6, 7 }, // Nko/Nko/Guinea + { 320, 7, 38, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {67,65,68}, 246,3 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 0, 7, 6, 7 }, // Mohawk/Latin/Canada + { 321, 75, 91, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {71,78,70}, 222,2 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 0, 0, 1, 6, 7 }, // Nko/Nko/Guinea { 322, 7, 260, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {0,0,0}, 0,0 , 2586,0 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 1, 6, 7 }, // Prussian/Latin/World - { 323, 7, 90, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {71,84,81}, 309,1 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 7, 6, 7 }, // Kiche/Latin/Guatemala + { 323, 7, 90, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {71,84,81}, 311,1 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 7, 6, 7 }, // Kiche/Latin/Guatemala { 324, 7, 205, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {83,69,75}, 190,2 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 0, 1, 6, 7 }, // Southern Sami/Latin/Sweden { 325, 7, 205, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {83,69,75}, 190,2 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 0, 1, 6, 7 }, // Lule Sami/Latin/Sweden { 326, 7, 73, 44, 160, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 640,8 , 1798,18 , 254,4 , 258,9 , 21553,28 , 21581,70 , 85,14 , 21553,28 , 21651,73 , 21724,14 , 823,3 , 841,3 , 45,4 , 5,17 , 22,23 , {69,85,82}, 14,1 , 17824,11 , 19,5 , 4,0 , 5912,11 , 5923,5 , 2, 1, 1, 6, 7 }, // Inari Sami/Latin/Finland { 327, 7, 73, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {69,85,82}, 14,1 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 1, 6, 7 }, // Skolt Sami/Latin/Finland - { 328, 7, 13, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {65,85,68}, 344,2 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 7, 6, 7 }, // Warlpiri/Latin/Australia + { 328, 7, 13, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {65,85,68}, 346,2 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 7, 6, 7 }, // Warlpiri/Latin/Australia { 339, 13, 100, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 326,9 , 335,8 , 269,6 , 10,17 , 18,7 , 25,12 , 4304,32 , 4336,53 , 4389,19 , 4304,32 , 4336,53 , 4389,19 , 68,2 , 65,2 , 45,4 , 5,17 , 22,23 , {73,78,82}, 121,1 , 17835,31 , 8,5 , 4,0 , 5928,6 , 2666,4 , 2, 1, 7, 7, 7 }, // Maithili/Devanagari/India - { 346, 1, 102, 1643, 1644, 1563, 1642, 1776, 45, 43, 101, 171, 187, 8249, 8250, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 774,4 , 1327,39 , 22,23 , {73,82,82}, 346,3 , 17866,27 , 8,5 , 4,0 , 5934,7 , 3263,5 , 0, 0, 6, 5, 5 }, // Mazanderani/Arabic/Iran + { 346, 1, 102, 1643, 1644, 1563, 1642, 1776, 45, 43, 101, 171, 187, 8249, 8250, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 754,4 , 1265,39 , 22,23 , {73,82,82}, 348,3 , 17866,27 , 8,5 , 4,0 , 5934,7 , 3263,5 , 0, 0, 6, 5, 5 }, // Mazanderani/Arabic/Iran { 349, 1, 102, 1643, 1644, 1563, 1642, 1776, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {73,82,82}, 0,0 , 0,7 , 8,5 , 4,0 , 5941,11 , 0,0 , 0, 0, 6, 5, 5 }, // Northern Luri/Arabic/Iran { 349, 1, 103, 1643, 1644, 1563, 1642, 1776, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 18,7 , 25,12 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {73,81,68}, 44,5 , 0,7 , 8,5 , 4,0 , 5941,11 , 0,0 , 0, 0, 6, 5, 6 }, // Northern Luri/Arabic/Iraq { 357, 6, 97, 46, 44, 59, 37, 48, 45, 43, 101, 12300, 12301, 12302, 12303, 166,5 , 166,5 , 1074,5 , 1074,5 , 394,8 , 423,14 , 209,6 , 226,13 , 1980,28 , 1980,28 , 2008,14 , 1980,28 , 1980,28 , 2008,14 , 58,2 , 55,2 , 45,4 , 5,17 , 22,23 , {72,75,68}, 134,3 , 17893,11 , 4,4 , 13,6 , 5952,2 , 5954,14 , 2, 1, 7, 6, 7 }, // Cantonese/Traditional Han/Hong Kong - { 357, 5, 44, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 166,5 , 166,5 , 1074,5 , 1074,5 , 394,8 , 402,13 , 209,6 , 215,11 , 1959,21 , 1980,28 , 2008,14 , 1959,21 , 1980,28 , 2008,14 , 58,2 , 55,2 , 45,4 , 5,17 , 22,23 , {67,78,89}, 247,1 , 3122,13 , 4,4 , 13,6 , 5968,2 , 5970,7 , 2, 1, 7, 6, 7 }, // Cantonese/Simplified Han/China + { 357, 5, 44, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 166,5 , 166,5 , 1074,5 , 1074,5 , 394,8 , 402,13 , 209,6 , 215,11 , 1959,21 , 1980,28 , 2008,14 , 1959,21 , 1980,28 , 2008,14 , 58,2 , 55,2 , 45,4 , 5,17 , 22,23 , {67,78,89}, 249,1 , 3122,13 , 4,4 , 13,6 , 5968,2 , 5970,7 , 2, 1, 7, 6, 7 }, // Cantonese/Simplified Han/China { 358, 138, 225, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {85,83,68}, 159,3 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 7, 6, 7 }, // Osage/Osage/United States { 360, 7, 260, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {0,0,0}, 0,0 , 2586,0 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 1, 6, 7 }, // Ido/Latin/World { 361, 7, 260, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {0,0,0}, 0,0 , 2586,0 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 1, 6, 7 }, // Lojban/Latin/World { 362, 7, 106, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {69,85,82}, 14,1 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 1, 6, 7 }, // Sicilian/Latin/Italy { 363, 1, 102, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {73,82,82}, 0,0 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 0, 0, 6, 5, 5 }, // Southern Kurdish/Arabic/Iran { 364, 1, 163, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {80,75,82}, 176,2 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 0, 7, 6, 7 }, // Western Balochi/Arabic/Pakistan - { 365, 7, 170, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 1079,9 , 1088,8 , 547,6 , 35,18 , 18,7 , 25,12 , 21738,28 , 21766,56 , 21822,14 , 21738,28 , 21766,56 , 21822,14 , 0,2 , 0,2 , 1366,8 , 5,17 , 22,23 , {80,72,80}, 179,1 , 17904,56 , 4,4 , 13,6 , 5977,8 , 4730,9 , 2, 1, 7, 6, 7 }, // Cebuano/Latin/Philippines + { 365, 7, 170, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 1079,9 , 1088,8 , 547,6 , 35,18 , 18,7 , 25,12 , 21738,28 , 21766,56 , 21822,14 , 21738,28 , 21766,56 , 21822,14 , 0,2 , 0,2 , 1304,8 , 5,17 , 22,23 , {80,72,80}, 179,1 , 17904,56 , 4,4 , 13,6 , 5977,8 , 4730,9 , 2, 1, 7, 6, 7 }, // Cebuano/Latin/Philippines { 366, 2, 178, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {82,85,66}, 123,1 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 1, 6, 7 }, // Erzya/Cyrillic/Russia { 367, 7, 225, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {85,83,68}, 159,3 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 7, 6, 7 }, // Chickasaw/Latin/United States { 368, 7, 225, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {85,83,68}, 159,3 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 7, 6, 7 }, // Muscogee/Latin/United States - { 369, 7, 172, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {80,76,78}, 277,2 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 1, 6, 7 }, // Silesian/Latin/Poland - { 370, 7, 157, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 1096,9 , 1105,8 , 119,10 , 10,17 , 37,5 , 8,10 , 21836,33 , 21869,52 , 85,14 , 21836,33 , 21869,52 , 85,14 , 826,9 , 844,8 , 1374,8 , 5,17 , 22,23 , {78,71,78}, 178,1 , 17960,50 , 4,4 , 4,0 , 5985,14 , 5999,8 , 2, 1, 1, 6, 7 }, // Nigerian Pidgin/Latin/Nigeria + { 369, 7, 172, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {80,76,78}, 279,2 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 1, 6, 7 }, // Silesian/Latin/Poland + { 370, 7, 157, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 1096,9 , 1105,8 , 119,10 , 10,17 , 37,5 , 8,10 , 21836,33 , 21869,52 , 85,14 , 21836,33 , 21869,52 , 85,14 , 826,9 , 844,8 , 1312,8 , 5,17 , 22,23 , {78,71,78}, 178,1 , 17960,50 , 4,4 , 4,0 , 5985,14 , 5999,8 , 2, 1, 1, 6, 7 }, // Nigerian Pidgin/Latin/Nigeria { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, {0,0,0}, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0, 0, 0, 0, 0 } // trailing zeros }; @@ -3174,23 +3171,22 @@ static const ushort byte_unit_data[] = { 0x45, 0x42, 0x4b, 0x69, 0x42, 0x3b, 0x4d, 0x69, 0x42, 0x3b, 0x47, 0x69, 0x42, 0x3b, 0x54, 0x69, 0x42, 0x3b, 0x50, 0x69, 0x42, 0x3b, 0x45, 0x69, 0x42, 0x62, 0x79, 0x74, 0x65, 0x67, 0x72, 0x65, 0x65, 0x70, 0x62, 0x61, 0x6a, 0x74, 0x1263, 0x12ed, 0x1275, 0x12aa, 0x1263, 0x3b, 0x121c, 0x130b, 0x1263, 0x12ed, 0x1275, 0x3b, 0x130a, 0x1263, 0x3b, 0x1274, 0x122b, 0x1263, 0x12ed, 0x1275, 0x3b, 0x1354, -0x1263, 0x3b, 0x45, 0x42, 0x628, 0x627, 0x64a, 0x62a, 0x643, 0x64a, 0x644, 0x648, 0x628, 0x627, 0x64a, 0x62a, 0x3b, 0x645, 0x64a, 0x63a, -0x627, 0x628, 0x627, 0x64a, 0x62a, 0x3b, 0x63a, 0x64a, 0x63a, 0x627, 0x628, 0x627, 0x64a, 0x62a, 0x3b, 0x62a, 0x64a, 0x631, 0x627, 0x628, -0x627, 0x64a, 0x62a, 0x3b, 0x628, 0x64a, 0x62a, 0x627, 0x628, 0x627, 0x64a, 0x62a, 0x3b, 0x45, 0x42, 0x562, 0x561, 0x575, 0x569, 0x565, -0x580, 0x56f, 0x532, 0x3b, 0x544, 0x532, 0x3b, 0x533, 0x532, 0x3b, 0x54f, 0x532, 0x3b, 0x54a, 0x532, 0x3b, 0x45, 0x42, 0x9ac, 0x9be, -0x987, 0x99f, 0x995, 0x9bf, 0x983, 0x20, 0x9ac, 0x9be, 0x983, 0x3b, 0x9ae, 0x9c7, 0x983, 0x20, 0x9ac, 0x9be, 0x983, 0x3b, 0x997, 0x9bf, -0x983, 0x20, 0x9ac, 0x9be, 0x983, 0x3b, 0x99f, 0x9c7, 0x983, 0x20, 0x9ac, 0x9be, 0x983, 0x3b, 0x50, 0x42, 0x3b, 0x45, 0x42, 0x62, -0x61, 0x79, 0x74, 0x62, 0x79, 0x74, 0x65, 0x2d, 0x61, 0x6b, 0x6f, 0x6b, 0x74, 0x65, 0x64, 0x6f, 0xf9, 0x6b, 0x6f, 0x3b, -0x4d, 0x6f, 0x3b, 0x47, 0x6f, 0x3b, 0x54, 0x6f, 0x3b, 0x50, 0x6f, 0x3b, 0x45, 0x6f, 0x4b, 0x69, 0x6f, 0x3b, 0x4d, 0x69, -0x6f, 0x3b, 0x47, 0x69, 0x6f, 0x3b, 0x54, 0x69, 0x6f, 0x3b, 0x50, 0x69, 0x6f, 0x3b, 0x45, 0x69, 0x6f, 0x431, 0x430, 0x439, -0x442, 0x43e, 0x432, 0x435, 0x1018, 0x102d, 0x102f, 0x1000, 0x103a, 0x431, 0x430, 0x439, 0x442, 0x44b, 0x41a, 0x411, 0x3b, 0x41c, 0x411, 0x3b, -0x413, 0x411, 0x3b, 0x422, 0x411, 0x3b, 0x41f, 0x411, 0x3b, 0x45, 0x42, 0x1794, 0x17c3, 0x5b57, 0x8282, 0x4f4d, 0x5143, 0x7d44, 0x62, 0x61, -0x6a, 0x74, 0x6f, 0x76, 0x69, 0x62, 0x61, 0x6a, 0x74, 0x79, 0x62, 0x61, 0x6a, 0x74, 0x6f, 0x6a, 0x62, 0x61, 0x69, 0x64, -0x69, 0x64, 0x62, 0xfd, 0x74, 0x74, 0x61, 0x76, 0x75, 0x74, 0x6b, 0x74, 0x3b, 0x4d, 0x74, 0x3b, 0x47, 0x74, 0x3b, 0x54, -0x74, 0x3b, 0x50, 0x74, 0x3b, 0x45, 0x74, 0x4b, 0x69, 0x74, 0x3b, 0x4d, 0x69, 0x74, 0x3b, 0x47, 0x69, 0x74, 0x3b, 0x54, -0x69, 0x74, 0x3b, 0x50, 0x69, 0x74, 0x3b, 0x45, 0x69, 0x74, 0x6f, 0x63, 0x74, 0x65, 0x74, 0x73, 0x62, 0x61, 0x69, 0x64, -0x68, 0x74, 0x10d1, 0x10d0, 0x10d8, 0x10e2, 0x10d8, 0x10d9, 0x10d1, 0x10d0, 0x10d8, 0x10e2, 0x10d8, 0x3b, 0x10db, 0x10d1, 0x10d0, 0x10d8, 0x10e2, 0x10d8, -0x3b, 0x10d2, 0x10d1, 0x10d0, 0x10d8, 0x10e2, 0x10d8, 0x3b, 0x10e2, 0x10d1, 0x10d0, 0x10d8, 0x10e2, 0x10d8, 0x3b, 0x10de, 0x10d1, 0x10d0, 0x10d8, 0x10e2, +0x1263, 0x3b, 0x45, 0x42, 0x628, 0x627, 0x64a, 0x62a, 0x643, 0x64a, 0x644, 0x648, 0x628, 0x627, 0x64a, 0x62a, 0x3b, 0x4d, 0x42, 0x3b, +0x47, 0x42, 0x3b, 0x62a, 0x64a, 0x631, 0x627, 0x628, 0x627, 0x64a, 0x62a, 0x3b, 0x628, 0x64a, 0x62a, 0x627, 0x628, 0x627, 0x64a, 0x62a, +0x3b, 0x45, 0x42, 0x562, 0x561, 0x575, 0x569, 0x565, 0x580, 0x56f, 0x532, 0x3b, 0x544, 0x532, 0x3b, 0x533, 0x532, 0x3b, 0x54f, 0x532, +0x3b, 0x54a, 0x532, 0x3b, 0x45, 0x42, 0x9ac, 0x9be, 0x987, 0x99f, 0x995, 0x9bf, 0x983, 0x20, 0x9ac, 0x9be, 0x983, 0x3b, 0x9ae, 0x9c7, +0x983, 0x20, 0x9ac, 0x9be, 0x983, 0x3b, 0x997, 0x9bf, 0x983, 0x20, 0x9ac, 0x9be, 0x983, 0x3b, 0x99f, 0x9c7, 0x983, 0x20, 0x9ac, 0x9be, +0x983, 0x3b, 0x50, 0x42, 0x3b, 0x45, 0x42, 0x62, 0x61, 0x79, 0x74, 0x62, 0x79, 0x74, 0x65, 0x2d, 0x61, 0x6b, 0x6f, 0x6b, +0x74, 0x65, 0x64, 0x6f, 0xf9, 0x6b, 0x6f, 0x3b, 0x4d, 0x6f, 0x3b, 0x47, 0x6f, 0x3b, 0x54, 0x6f, 0x3b, 0x50, 0x6f, 0x3b, +0x45, 0x6f, 0x4b, 0x69, 0x6f, 0x3b, 0x4d, 0x69, 0x6f, 0x3b, 0x47, 0x69, 0x6f, 0x3b, 0x54, 0x69, 0x6f, 0x3b, 0x50, 0x69, +0x6f, 0x3b, 0x45, 0x69, 0x6f, 0x431, 0x430, 0x439, 0x442, 0x43e, 0x432, 0x435, 0x1018, 0x102d, 0x102f, 0x1000, 0x103a, 0x431, 0x430, 0x439, +0x442, 0x44b, 0x41a, 0x411, 0x3b, 0x41c, 0x411, 0x3b, 0x413, 0x411, 0x3b, 0x422, 0x411, 0x3b, 0x41f, 0x411, 0x3b, 0x45, 0x42, 0x1794, +0x17c3, 0x5b57, 0x8282, 0x4f4d, 0x5143, 0x7d44, 0x62, 0x61, 0x6a, 0x74, 0x6f, 0x76, 0x69, 0x62, 0x61, 0x6a, 0x74, 0x79, 0x62, 0x61, +0x6a, 0x74, 0x6f, 0x6a, 0x62, 0x61, 0x69, 0x64, 0x69, 0x64, 0x62, 0xfd, 0x74, 0x74, 0x61, 0x76, 0x75, 0x74, 0x6b, 0x74, +0x3b, 0x4d, 0x74, 0x3b, 0x47, 0x74, 0x3b, 0x54, 0x74, 0x3b, 0x50, 0x74, 0x3b, 0x45, 0x74, 0x4b, 0x69, 0x74, 0x3b, 0x4d, +0x69, 0x74, 0x3b, 0x47, 0x69, 0x74, 0x3b, 0x54, 0x69, 0x74, 0x3b, 0x50, 0x69, 0x74, 0x3b, 0x45, 0x69, 0x74, 0x6f, 0x63, +0x74, 0x65, 0x74, 0x73, 0x62, 0x61, 0x69, 0x64, 0x68, 0x74, 0x10d1, 0x10d0, 0x10d8, 0x10e2, 0x10d8, 0x10d9, 0x10d1, 0x10d0, 0x10d8, 0x10e2, +0x10d8, 0x3b, 0x4d, 0x42, 0x3b, 0x47, 0x42, 0x3b, 0x10e2, 0x10d1, 0x10d0, 0x10d8, 0x10e2, 0x10d8, 0x3b, 0x10de, 0x10d1, 0x10d0, 0x10d8, 0x10e2, 0x10d8, 0x3b, 0x45, 0x42, 0x42, 0x79, 0x74, 0x65, 0x73, 0xaac, 0xabe, 0xa87, 0xa9f, 0x6b, 0x42, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x4d, 0x42, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x47, 0x42, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x54, 0x42, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x50, 0x42, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x45, 0x42, 0x20, 0x7b, 0x30, 0x7d, 0x4b, 0x69, 0x42, 0x20, 0x7b, 0x30, @@ -3208,38 +3204,35 @@ static const ushort byte_unit_data[] = { 0xd4d, 0xd15, 0xd46, 0xd2c, 0xd3f, 0x3b, 0xd0e, 0xd02, 0xd2c, 0xd3f, 0x3b, 0xd1c, 0xd3f, 0xd2c, 0xd3f, 0x3b, 0xd1f, 0xd3f, 0xd2c, 0xd3f, 0x3b, 0xd2a, 0xd3f, 0xd2c, 0xd3f, 0x3b, 0x45, 0x42, 0x43a, 0x411, 0x3b, 0x41c, 0x411, 0x3b, 0x413, 0x411, 0x3b, 0x422, 0x411, 0x3b, 0x41f, 0x411, 0x3b, 0x45, 0x42, 0x6b, 0x42, 0x3b, 0x4d, 0x42, 0x3b, 0x47, 0x42, 0x3b, 0x54, 0x42, 0x3b, 0x92a, 0x93f, 0x91f, -0x93e, 0x3b, 0x45, 0x42, 0xb2c, 0xb3e, 0xb07, 0xb1f, 0xb4d, 0x628, 0x627, 0x64a, 0x67c, 0x633, 0x628, 0x627, 0x6cc, 0x62a, 0x3c, 0x4c, -0x52, 0x4d, 0x3e, 0x6b, 0x42, 0x3b, 0x3c, 0x4c, 0x52, 0x4d, 0x3e, 0x4d, 0x42, 0x3b, 0x3c, 0x4c, 0x52, 0x4d, 0x3e, 0x47, -0x42, 0x3b, 0x3c, 0x4c, 0x52, 0x4d, 0x3e, 0x54, 0x42, 0x3b, 0x3c, 0x4c, 0x52, 0x4d, 0x3e, 0x50, 0x42, 0x3b, 0x45, 0x42, -0xa2c, 0xa3e, 0xa07, 0xa1f, 0x62, 0x79, 0x21b, 0x69, 0x431, 0x430, 0x458, 0x442, 0x43e, 0x432, 0x438, 0x628, 0x627, 0x626, 0x64a, 0x67d, -0x632, 0x6aa, 0x644, 0x648, 0x20, 0x628, 0x627, 0x626, 0x64a, 0x67d, 0x632, 0x3b, 0x4d, 0x42, 0x3b, 0x47, 0x42, 0x3b, 0x54, 0x42, -0x3b, 0x50, 0x42, 0x3b, 0x45, 0x42, 0xdb6, 0xdba, 0xdd2, 0xda7, 0xdca, 0xd9a, 0xdd2, 0xdb6, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0xdb8, -0xdd9, 0xdb6, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0xd9c, 0xdd2, 0xdb6, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0xda7, 0xdd9, 0xdb6, 0x20, 0x7b, -0x30, 0x7d, 0x3b, 0xdb4, 0xdd9, 0xdb6, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x45, 0x42, 0x62, 0x65, 0x79, 0x74, 0x69, 0x73, 0x6b, -0x42, 0x3b, 0x4d, 0x42, 0x3b, 0x47, 0x42, 0x3b, 0x54, 0x42, 0x3b, 0x42, 0x42, 0x3b, 0x45, 0x42, 0x6b, 0x69, 0x6c, 0x6f, -0x62, 0x61, 0x69, 0x74, 0x69, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x4d, 0x42, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x47, 0x42, 0x20, -0x7b, 0x30, 0x7d, 0x3b, 0x74, 0x65, 0x72, 0x61, 0x62, 0x61, 0x69, 0x74, 0x69, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x50, 0x42, -0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x45, 0x42, 0xbaa, 0xbc8, 0xb9f, 0xbcd, 0xb95, 0xbb3, 0xbcd, 0xc2c, 0xc48, 0xc1f, 0xc4d, 0x200c, 0xc32, -0xc41, 0xc15, 0xc47, 0xc2c, 0xc40, 0x3b, 0xc0e, 0xc2e, 0xc4d, 0x200c, 0xc2c, 0xc3f, 0x3b, 0xc1c, 0xc40, 0xc2c, 0xc40, 0x3b, 0xc1f, 0xc40, -0xc2c, 0xc40, 0x3b, 0xc2a, 0xc40, 0xc2c, 0xc40, 0x3b, 0x45, 0x42, 0xe44, 0xe1a, 0xe15, 0xe4c, 0x70, 0x61, 0x69, 0x74, 0x69, 0x6b, -0x42, 0x20, 0x2bb, 0x65, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x4d, 0x42, 0x20, 0x2bb, 0x65, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x47, -0x42, 0x20, 0x2bb, 0x65, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x54, 0x42, 0x20, 0x2bb, 0x65, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x50, -0x42, 0x20, 0x2bb, 0x65, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x45, 0x42, 0x20, 0x2bb, 0x65, 0x20, 0x7b, 0x30, 0x7d, 0x4b, 0x69, -0x42, 0x20, 0x2bb, 0x65, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x4d, 0x69, 0x42, 0x20, 0x2bb, 0x65, 0x20, 0x7b, 0x30, 0x7d, 0x3b, -0x47, 0x69, 0x42, 0x20, 0x2bb, 0x65, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x54, 0x69, 0x42, 0x20, 0x2bb, 0x65, 0x20, 0x7b, 0x30, -0x7d, 0x3b, 0x50, 0x69, 0x42, 0x20, 0x2bb, 0x65, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x45, 0x69, 0x42, 0x20, 0x2bb, 0x65, 0x20, -0x7b, 0x30, 0x7d, 0x62, 0x61, 0xfd, 0x74, 0x431, 0x430, 0x439, 0x442, 0x438, 0x628, 0x627, 0x626, 0x679, 0x6b, 0x42, 0x3b, 0x4d, -0x42, 0x3b, 0x47, 0x42, 0x3b, 0x54, 0x42, 0x3b, 0x67e, 0x6cc, 0x20, 0x628, 0x6cc, 0x3b, 0x45, 0x42, 0x62, 0x65, 0x69, 0x74, -0x69, 0x61, 0x75, 0xe0, 0x77, 0x1ecd, 0x301, 0x6e, 0x20, 0x62, 0xe1, 0xec, 0x74, 0xec, 0x6b, 0xe9, 0x62, 0xe1, 0xec, 0x74, -0xec, 0x3b, 0x4d, 0x42, 0x3b, 0x6a, 0xed, 0x62, 0xe1, 0xec, 0x74, 0xec, 0x3b, 0x54, 0xed, 0x62, 0xe1, 0xec, 0x74, 0xec, -0x3b, 0x50, 0xed, 0x62, 0xe1, 0xec, 0x74, 0xec, 0x3b, 0x45, 0x42, 0xe0, 0x77, 0x254, 0x301, 0x6e, 0x20, 0x62, 0xe1, 0xec, -0x74, 0xec, 0x92c, 0x93e, 0x92f, 0x91f, 0x61, 0x1e6d, 0x61, 0x6d, 0x1e0d, 0x61, 0x6e, 0x6b, 0x41, 0x1e6c, 0x3b, 0x4d, 0x41, 0x1e6c, -0x3b, 0x47, 0x41, 0x1e6c, 0x3b, 0x54, 0x41, 0x1e6c, 0x3b, 0x50, 0x42, 0x3b, 0x45, 0x42, 0x13d7, 0x13d3, 0x13cd, 0x13a6, 0x13b5, 0x13a9, -0x431, 0x430, 0x430, 0x439, 0x442, 0x43a, 0x411, 0x3b, 0x41c, 0x411, 0x3b, 0x47, 0x42, 0x3b, 0x54, 0x42, 0x3b, 0x50, 0x42, 0x3b, -0x45, 0x42, 0x62, 0x79, 0x74, 0x65, 0x79, 0x6a9, 0x6cc, 0x644, 0x648, 0x628, 0x627, 0x6cc, 0x62a, 0x3b, 0x645, 0x6af, 0x627, 0x628, -0x627, 0x6cc, 0x62a, 0x3b, 0x6af, 0x6cc, 0x6af, 0x627, 0x628, 0x627, 0x6cc, 0x62a, 0x3b, 0x62a, 0x631, 0x627, 0x628, 0x627, 0x6cc, 0x62a, -0x3b, 0x50, 0x42, 0x3b, 0x45, 0x42, 0x6d, 0x67, 0x61, 0x20, 0x62, 0x79, 0x74, 0x65, 0x42, 0x61, 0x69, 0x74, 0x2d, 0x64, -0x1eb9, 0x6d +0x93e, 0x3b, 0x45, 0x42, 0xb2c, 0xb3e, 0xb07, 0xb1f, 0xb4d, 0x628, 0x627, 0x64a, 0x67c, 0x633, 0x628, 0x627, 0x6cc, 0x62a, 0xa2c, 0xa3e, +0xa07, 0xa1f, 0x62, 0x79, 0x21b, 0x69, 0x431, 0x430, 0x458, 0x442, 0x43e, 0x432, 0x438, 0x628, 0x627, 0x626, 0x64a, 0x67d, 0x632, 0x6aa, +0x644, 0x648, 0x20, 0x628, 0x627, 0x626, 0x64a, 0x67d, 0x632, 0x3b, 0x4d, 0x42, 0x3b, 0x47, 0x42, 0x3b, 0x54, 0x42, 0x3b, 0x50, +0x42, 0x3b, 0x45, 0x42, 0xdb6, 0xdba, 0xdd2, 0xda7, 0xdca, 0xd9a, 0xdd2, 0xdb6, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0xdb8, 0xdd9, 0xdb6, +0x20, 0x7b, 0x30, 0x7d, 0x3b, 0xd9c, 0xdd2, 0xdb6, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0xda7, 0xdd9, 0xdb6, 0x20, 0x7b, 0x30, 0x7d, +0x3b, 0xdb4, 0xdd9, 0xdb6, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x45, 0x42, 0x62, 0x65, 0x79, 0x74, 0x69, 0x73, 0x6b, 0x42, 0x3b, +0x4d, 0x42, 0x3b, 0x47, 0x42, 0x3b, 0x54, 0x42, 0x3b, 0x42, 0x42, 0x3b, 0x45, 0x42, 0x6b, 0x69, 0x6c, 0x6f, 0x62, 0x61, +0x69, 0x74, 0x69, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x4d, 0x42, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x47, 0x42, 0x20, 0x7b, 0x30, +0x7d, 0x3b, 0x74, 0x65, 0x72, 0x61, 0x62, 0x61, 0x69, 0x74, 0x69, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x50, 0x42, 0x20, 0x7b, +0x30, 0x7d, 0x3b, 0x45, 0x42, 0xbaa, 0xbc8, 0xb9f, 0xbcd, 0xb95, 0xbb3, 0xbcd, 0xc2c, 0xc48, 0xc1f, 0xc4d, 0x200c, 0xc32, 0xc41, 0xc15, +0xc47, 0xc2c, 0xc40, 0x3b, 0xc0e, 0xc2e, 0xc4d, 0x200c, 0xc2c, 0xc3f, 0x3b, 0xc1c, 0xc40, 0xc2c, 0xc40, 0x3b, 0xc1f, 0xc40, 0xc2c, 0xc40, +0x3b, 0xc2a, 0xc40, 0xc2c, 0xc40, 0x3b, 0x45, 0x42, 0xe44, 0xe1a, 0xe15, 0xe4c, 0x70, 0x61, 0x69, 0x74, 0x69, 0x6b, 0x42, 0x20, +0x2bb, 0x65, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x4d, 0x42, 0x20, 0x2bb, 0x65, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x47, 0x42, 0x20, +0x2bb, 0x65, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x54, 0x42, 0x20, 0x2bb, 0x65, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x50, 0x42, 0x20, +0x2bb, 0x65, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x45, 0x42, 0x20, 0x2bb, 0x65, 0x20, 0x7b, 0x30, 0x7d, 0x4b, 0x69, 0x42, 0x20, +0x2bb, 0x65, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x4d, 0x69, 0x42, 0x20, 0x2bb, 0x65, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x47, 0x69, +0x42, 0x20, 0x2bb, 0x65, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x54, 0x69, 0x42, 0x20, 0x2bb, 0x65, 0x20, 0x7b, 0x30, 0x7d, 0x3b, +0x50, 0x69, 0x42, 0x20, 0x2bb, 0x65, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x45, 0x69, 0x42, 0x20, 0x2bb, 0x65, 0x20, 0x7b, 0x30, +0x7d, 0x62, 0x61, 0xfd, 0x74, 0x431, 0x430, 0x439, 0x442, 0x438, 0x628, 0x627, 0x626, 0x679, 0x6b, 0x42, 0x3b, 0x4d, 0x42, 0x3b, +0x47, 0x42, 0x3b, 0x54, 0x42, 0x3b, 0x67e, 0x6cc, 0x20, 0x628, 0x6cc, 0x3b, 0x45, 0x42, 0x62, 0x65, 0x69, 0x74, 0x69, 0x61, +0x75, 0xe0, 0x77, 0x1ecd, 0x301, 0x6e, 0x20, 0x62, 0xe1, 0xec, 0x74, 0xec, 0x6b, 0xe9, 0x62, 0xe1, 0xec, 0x74, 0xec, 0x3b, +0x4d, 0x42, 0x3b, 0x6a, 0xed, 0x62, 0xe1, 0xec, 0x74, 0xec, 0x3b, 0x54, 0xed, 0x62, 0xe1, 0xec, 0x74, 0xec, 0x3b, 0x50, +0xed, 0x62, 0xe1, 0xec, 0x74, 0xec, 0x3b, 0x45, 0x42, 0xe0, 0x77, 0x254, 0x301, 0x6e, 0x20, 0x62, 0xe1, 0xec, 0x74, 0xec, +0x92c, 0x93e, 0x92f, 0x91f, 0x61, 0x1e6d, 0x61, 0x6d, 0x1e0d, 0x61, 0x6e, 0x6b, 0x41, 0x1e6c, 0x3b, 0x4d, 0x41, 0x1e6c, 0x3b, 0x47, +0x41, 0x1e6c, 0x3b, 0x54, 0x41, 0x1e6c, 0x3b, 0x50, 0x42, 0x3b, 0x45, 0x42, 0x13d7, 0x13d3, 0x13cd, 0x13a6, 0x13b5, 0x13a9, 0x431, 0x430, +0x430, 0x439, 0x442, 0x43a, 0x411, 0x3b, 0x41c, 0x411, 0x3b, 0x47, 0x42, 0x3b, 0x54, 0x42, 0x3b, 0x50, 0x42, 0x3b, 0x45, 0x42, +0x62, 0x79, 0x74, 0x65, 0x79, 0x6a9, 0x6cc, 0x644, 0x648, 0x628, 0x627, 0x6cc, 0x62a, 0x3b, 0x645, 0x6af, 0x627, 0x628, 0x627, 0x6cc, +0x62a, 0x3b, 0x6af, 0x6cc, 0x6af, 0x627, 0x628, 0x627, 0x6cc, 0x62a, 0x3b, 0x62a, 0x631, 0x627, 0x628, 0x627, 0x6cc, 0x62a, 0x3b, 0x50, +0x42, 0x3b, 0x45, 0x42, 0x6d, 0x67, 0x61, 0x20, 0x62, 0x79, 0x74, 0x65, 0x42, 0x61, 0x69, 0x74, 0x2d, 0x64, 0x1eb9, 0x6d }; static const ushort am_data[] = { @@ -3344,14 +3337,14 @@ static const ushort currency_symbol_data[] = { 0x24, 0x48, 0x52, 0x4b, 0x4b, 0x4d, 0x4b, 0x10d, 0x6b, 0x72, 0x2e, 0x41, 0x66, 0x6c, 0x2e, 0x4e, 0x41, 0x66, 0x2e, 0x55, 0x53, 0x24, 0x50, 0x46, 0x42, 0x75, 0x44, 0x47, 0x48, 0x20b5, 0x41, 0x72, 0x4d, 0x4b, 0x52, 0x4d, 0x52, 0x73, 0x20a6, 0x20b1, 0x52, 0x46, 0x57, 0x53, 0x24, 0x53, 0x52, 0x4c, 0x65, 0x45, 0x6b, 0x72, 0x54, 0x53, 0x68, 0x54, 0x24, 0x55, 0x53, 0x68, -0x41, 0x45, 0x44, 0x56, 0x54, 0x44, 0x41, 0x43, 0x46, 0x41, 0x24, 0xa0, 0x43, 0x41, 0x46, 0x43, 0x46, 0x43, 0x46, 0x50, -0x46, 0x47, 0x47, 0x55, 0x4d, 0x4d, 0x41, 0x44, 0x43, 0x48, 0x46, 0x4c, 0x53, 0x44, 0x54, 0x20be, 0x20b2, 0x46, 0x74, 0x49, -0x53, 0x4b, 0x52, 0x70, 0x43, 0x41, 0x24, 0xffe5, 0x20b8, 0x441, 0x43e, 0x43c, 0x20a9, 0x4b, 0x50, 0x57, 0x20ba, 0x20ad, 0x4b, 0x7a, -0x434, 0x435, 0x43d, 0x2e, 0x20ae, 0x43, 0x4e, 0xa5, 0x928, 0x947, 0x930, 0x942, 0x60b, 0x631, 0x6cc, 0x627, 0x644, 0x7a, 0x142, 0x52, -0x24, 0x200b, 0x4d, 0x54, 0x6e, 0x44, 0x62, 0x631, 0x53, 0x2f, 0x42, 0x73, 0x52, 0x4f, 0x4e, 0x4c, 0x20b4, 0x52, 0x53, 0x44, -0x41a, 0x41c, 0xdbb, 0xdd4, 0x2e, 0x20a1, 0x52, 0x44, 0x24, 0x51, 0x43, 0x24, 0x42, 0x2f, 0x2e, 0x47, 0x73, 0x2e, 0x42, 0x73, -0x2e, 0x53, 0x441, 0x43e, 0x43c, 0x2e, 0x52, 0x73, 0x2e, 0xe3f, 0x54, 0x4d, 0x54, 0x73, 0x6f, 0x2bb, 0x6d, 0x441, 0x45e, 0x43c, -0x20ab, 0x4e, 0x54, 0x24, 0x41, 0x24, 0x49, 0x52, 0x52 +0x41, 0x45, 0x44, 0x56, 0x54, 0x44, 0x41, 0x46, 0x202f, 0x43, 0x46, 0x41, 0x24, 0xa0, 0x43, 0x41, 0x46, 0x43, 0x46, 0x43, +0x46, 0x50, 0x46, 0x47, 0x47, 0x55, 0x4d, 0x4d, 0x41, 0x44, 0x43, 0x48, 0x46, 0x4c, 0x53, 0x44, 0x54, 0x20be, 0x20b2, 0x46, +0x74, 0x49, 0x53, 0x4b, 0x52, 0x70, 0x43, 0x41, 0x24, 0xffe5, 0x20b8, 0x441, 0x43e, 0x43c, 0x20a9, 0x4b, 0x50, 0x57, 0x20ba, 0x20ad, +0x4b, 0x7a, 0x434, 0x435, 0x43d, 0x2e, 0x20ae, 0x43, 0x4e, 0xa5, 0x928, 0x947, 0x930, 0x942, 0x60b, 0x631, 0x6cc, 0x627, 0x644, 0x7a, +0x142, 0x52, 0x24, 0x200b, 0x4d, 0x54, 0x6e, 0x44, 0x62, 0x631, 0x53, 0x2f, 0x42, 0x73, 0x52, 0x4f, 0x4e, 0x4c, 0x20b4, 0x52, +0x53, 0x44, 0x41a, 0x41c, 0xdbb, 0xdd4, 0x2e, 0x20a1, 0x52, 0x44, 0x24, 0x51, 0x43, 0x24, 0x42, 0x2f, 0x2e, 0x47, 0x73, 0x2e, +0x42, 0x73, 0x2e, 0x53, 0x441, 0x43e, 0x43c, 0x2e, 0x52, 0x73, 0x2e, 0xe3f, 0x54, 0x4d, 0x54, 0x73, 0x6f, 0x2bb, 0x6d, 0x441, +0x45e, 0x43c, 0x20ab, 0x4e, 0x54, 0x24, 0x41, 0x24, 0x49, 0x52, 0x52 }; static const ushort currency_display_name_data[] = { @@ -4359,7 +4352,7 @@ static const ushort endonyms_data[] = { 0x69, 0x72, 0x67, 0x69, 0x6e, 0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x5a, 0x61, 0x6d, 0x62, 0x69, 0x61, 0x5a, 0x69, 0x6d, 0x62, 0x61, 0x62, 0x77, 0x65, 0x44, 0x69, 0x65, 0x67, 0x6f, 0x20, 0x47, 0x61, 0x72, 0x63, 0x69, 0x61, 0x49, 0x73, 0x6c, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x4d, 0x61, 0x6e, 0x4a, 0x65, 0x72, 0x73, 0x65, 0x79, 0x53, 0x6f, 0x75, 0x74, -0x68, 0x20, 0x53, 0x75, 0x64, 0x61, 0x6e, 0x53, 0x69, 0x6e, 0x74, 0x20, 0x4d, 0x61, 0x61, 0x72, 0x74, 0x65, 0x6e, 0x57, +0x68, 0x20, 0x53, 0x75, 0x64, 0x61, 0x6e, 0x53, 0x69, 0x6e, 0x74, 0x20, 0x4d, 0x61, 0x61, 0x72, 0x74, 0x65, 0x6e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x65, 0x73, 0x70, 0x65, 0x72, 0x61, 0x6e, 0x74, 0x6f, 0x4d, 0x6f, 0x6e, 0x64, 0x6f, 0x65, 0x65, 0x73, 0x74, 0x69, 0x45, 0x65, 0x73, 0x74, 0x69, 0x66, 0xf8, 0x72, 0x6f, 0x79, 0x73, 0x6b, 0x74, 0x46, 0xf8, 0x72, 0x6f, 0x79, 0x61, 0x72, 0x73, 0x75, 0x6f, 0x6d, 0x69, 0x53, 0x75, 0x6f, 0x6d, 0x69, 0x66, diff --git a/src/corelib/text/qlocale_p.h b/src/corelib/text/qlocale_p.h index 149d2874..322eca43 100644 --- a/src/corelib/text/qlocale_p.h +++ b/src/corelib/text/qlocale_p.h @@ -359,7 +359,6 @@ public: quint16 countryId() const { return m_data->m_country_id; } QByteArray bcp47Name(char separator = '-') const; - QByteArray rawName(char separator = '-') const; inline QLatin1String languageCode() const { return languageToCode(QLocale::Language(m_data->m_language_id)); } inline QLatin1String scriptCode() const { return scriptToCode(QLocale::Script(m_data->m_script_id)); } diff --git a/src/corelib/text/qlocale_win.cpp b/src/corelib/text/qlocale_win.cpp index ec0f32e2..ce060cbe 100644 --- a/src/corelib/text/qlocale_win.cpp +++ b/src/corelib/text/qlocale_win.cpp @@ -115,6 +115,7 @@ struct QSystemLocalePrivate QVariant timeFormat(QLocale::FormatType); QVariant dateTimeFormat(QLocale::FormatType); QVariant dayName(int, QLocale::FormatType); + QVariant standaloneMonthName(int, QLocale::FormatType); QVariant monthName(int, QLocale::FormatType); QVariant toString(QDate, QLocale::FormatType); QVariant toString(QTime, QLocale::FormatType); @@ -411,7 +412,7 @@ QVariant QSystemLocalePrivate::dayName(int day, QLocale::FormatType type) return getLocaleInfo(short_day_map[day]); } -QVariant QSystemLocalePrivate::monthName(int month, QLocale::FormatType type) +QVariant QSystemLocalePrivate::standaloneMonthName(int month, QLocale::FormatType type) { static const LCTYPE short_month_map[] = { LOCALE_SABBREVMONTHNAME1, LOCALE_SABBREVMONTHNAME2, LOCALE_SABBREVMONTHNAME3, @@ -434,6 +435,30 @@ QVariant QSystemLocalePrivate::monthName(int month, QLocale::FormatType type) return getLocaleInfo(lctype); } +QVariant QSystemLocalePrivate::monthName(int month, QLocale::FormatType type) +{ + SYSTEMTIME st = {}; + st.wYear = 2001; + st.wMonth = month; + st.wDay = 10; + + const DWORD flags{}; // Must be clear when passing a format string. + // MS's docs for the LOCALE_SMONTHNAME* say to include the day in a format. + // Educated guess: this works for the LOCALE_SABBREVMONTHNAME*, too, in so + // far as the abbreviated plain name might differ from abbreviated + // standalone one. + const wchar_t *const format = type == QLocale::LongFormat ? L"ddMMMM" : L"ddMMM"; + wchar_t buf[255]; + if (getDateFormat(flags, &st, format, buf, 255) > 2) { + // Elide the two digits of day number + QString text = QString::fromWCharArray(buf + 2); + if (substitution() == SAlways) + text = substituteDigits(text); + return text; + } + return {}; +} + QVariant QSystemLocalePrivate::toString(QDate date, QLocale::FormatType type) { SYSTEMTIME st; @@ -818,11 +843,13 @@ QVariant QSystemLocale::query(QueryType type, QVariant in) const case DayNameShort: return d->dayName(in.toInt(), QLocale::ShortFormat); case MonthNameLong: - case StandaloneMonthNameLong: return d->monthName(in.toInt(), QLocale::LongFormat); + case StandaloneMonthNameLong: + return d->standaloneMonthName(in.toInt(), QLocale::LongFormat); case MonthNameShort: - case StandaloneMonthNameShort: return d->monthName(in.toInt(), QLocale::ShortFormat); + case StandaloneMonthNameShort: + return d->standaloneMonthName(in.toInt(), QLocale::ShortFormat); case DateToStringShort: return d->toString(in.toDate(), QLocale::ShortFormat); case DateToStringLong: diff --git a/src/corelib/text/qregularexpression.cpp b/src/corelib/text/qregularexpression.cpp index d7e3cc5e..1f101504 100644 --- a/src/corelib/text/qregularexpression.cpp +++ b/src/corelib/text/qregularexpression.cpp @@ -52,6 +52,10 @@ #include #include +#if defined(Q_OS_MACOS) +#include +#endif + #define PCRE2_CODE_UNIT_WIDTH 16 #include @@ -1122,6 +1126,8 @@ static bool isJitEnabled() #ifdef QT_DEBUG return false; +#elif defined(Q_OS_MACOS) + return !qt_mac_runningUnderRosetta(); #else return true; #endif @@ -1291,7 +1297,7 @@ QRegularExpressionMatchPrivate *QRegularExpressionPrivate::doMatch(const QString pcre2_jit_stack_assign_16(matchContext, &qtPcreCallback, nullptr); pcre2_match_data_16 *matchData = pcre2_match_data_create_from_pattern_16(compiledPattern, nullptr); - const unsigned short * const subjectUtf16 = subject.utf16() + subjectStart; + const auto subjectUtf16 = reinterpret_cast(subject.data()) + subjectStart; int result; diff --git a/src/corelib/text/qstring.cpp b/src/corelib/text/qstring.cpp index 02a9fe3a..3e88ab48 100644 --- a/src/corelib/text/qstring.cpp +++ b/src/corelib/text/qstring.cpp @@ -4550,6 +4550,10 @@ int QString::lastIndexOf(const QRegularExpression &re, int from) const Example: \snippet qstring/main.cpp 100 + + \note Due to how the regular expression matching algorithm works, + this function will actually match repeatedly from the beginning of + the string until the position \a from is reached. */ int QString::lastIndexOf(const QRegularExpression &re, int from, QRegularExpressionMatch *rmatch) const { @@ -4558,13 +4562,13 @@ int QString::lastIndexOf(const QRegularExpression &re, int from, QRegularExpress return -1; } - int endpos = (from < 0) ? (size() + from + 1) : (from); + int endpos = (from < 0) ? (size() + from + 1) : (from + 1); QRegularExpressionMatchIterator iterator = re.globalMatch(*this); int lastIndex = -1; while (iterator.hasNext()) { QRegularExpressionMatch match = iterator.next(); int start = match.capturedStart(); - if (start <= endpos) { + if (start < endpos) { lastIndex = start; if (rmatch) *rmatch = std::move(match); @@ -7180,13 +7184,17 @@ QString QString::vasprintf(const char *cformat, va_list ap) if (length_mod == lm_l) { const ushort *buff = va_arg(ap, const ushort*); const ushort *ch = buff; - while (*ch != 0) + while (precision != 0 && *ch != 0) { ++ch; + --precision; + } subst.setUtf16(buff, ch - buff); - } else + } else if (precision == -1) { subst = QString::fromUtf8(va_arg(ap, const char*)); - if (precision != -1) - subst.truncate(precision); + } else { + const char *buff = va_arg(ap, const char*); + subst = QString::fromUtf8(buff, qstrnlen(buff, precision)); + } ++c; break; } @@ -7868,6 +7876,8 @@ QStringList QString::split(const QString &sep, Qt::SplitBehavior behavior, Qt::C #if QT_DEPRECATED_SINCE(5, 15) /*! \overload + Use QString::split(const QString &sep, Qt::SplitBehavior behavior, Qt::CaseSensitivity cs) instead. + \obsolete */ QStringList QString::split(const QString &sep, SplitBehavior behavior, Qt::CaseSensitivity cs) const @@ -7900,6 +7910,8 @@ QVector QString::splitRef(const QString &sep, Qt::SplitBehavior beha /*! \overload \obsolete + Use QString::splitRef(const QString &sep, Qt::SplitBehavior behavior, Qt::CaseSensitivity cs) instead. + \since 5.4 */ QVector QString::splitRef(const QString &sep, SplitBehavior behavior, Qt::CaseSensitivity cs) const @@ -7921,6 +7933,8 @@ QStringList QString::split(QChar sep, Qt::SplitBehavior behavior, Qt::CaseSensit /*! \overload \obsolete + Use QString::split(QChar sep, Qt::SplitBehavior behavior, Qt::CaseSensitivity cs) instead. + */ QStringList QString::split(QChar sep, SplitBehavior behavior, Qt::CaseSensitivity cs) const { @@ -7971,6 +7985,7 @@ QVector QStringRef::split(const QString &sep, Qt::SplitBehavior beha \overload \since 5.4 \obsolete + Use QString::split(const QString &sep, Qt::SplitBehavior behavior, Qt::CaseSensitivity cs) instead. */ QVector QStringRef::split(const QString &sep, QString::SplitBehavior behavior, Qt::CaseSensitivity cs) const { @@ -7992,6 +8007,7 @@ QVector QStringRef::split(QChar sep, Qt::SplitBehavior behavior, Qt: \overload \since 5.4 \obsolete + Use QString::split(QChar sep, Qt::SplitBehavior behavior, Qt::CaseSensitivity cs) instead. */ QVector QStringRef::split(QChar sep, QString::SplitBehavior behavior, Qt::CaseSensitivity cs) const { @@ -8058,6 +8074,7 @@ QStringList QString::split(const QRegExp &rx, Qt::SplitBehavior behavior) const /*! \overload \obsolete + Use QString::split(const QRegularExpression &sep, Qt::SplitBehavior behavior) instead. */ QStringList QString::split(const QRegExp &rx, SplitBehavior behavior) const { @@ -8089,6 +8106,7 @@ QVector QString::splitRef(const QRegExp &rx, Qt::SplitBehavior behav \overload \since 5.4 \obsolete + Use QString::splitRef(const QRegularExpression &sep, Qt::SplitBehavior behavior) instead. */ QVector QString::splitRef(const QRegExp &rx, SplitBehavior behavior) const { @@ -8164,6 +8182,7 @@ QStringList QString::split(const QRegularExpression &re, Qt::SplitBehavior behav \overload \since 5.0 \obsolete + Use QString::split(const QRegularExpression &sep, Qt::SplitBehavior behavior) instead. */ QStringList QString::split(const QRegularExpression &re, SplitBehavior behavior) const { @@ -8195,6 +8214,8 @@ QVector QString::splitRef(const QRegularExpression &re, Qt::SplitBeh \overload \since 5.4 \obsolete + Use QString::splitRef(const QRegularExpression &sep, Qt::SplitBehavior behavior) instead. + */ QVector QString::splitRef(const QRegularExpression &re, SplitBehavior behavior) const { @@ -8214,7 +8235,7 @@ QVector QString::splitRef(const QRegularExpression &re, SplitBehavio \value NormalizationForm_KC Compatibility Decomposition followed by Canonical Composition \sa normalized(), - {http://www.unicode.org/reports/tr15/}{Unicode Standard Annex #15} + {https://www.unicode.org/reports/tr15/}{Unicode Standard Annex #15} */ /*! diff --git a/src/corelib/text/qstring.h b/src/corelib/text/qstring.h index 8b71c014..0fdab96e 100644 --- a/src/corelib/text/qstring.h +++ b/src/corelib/text/qstring.h @@ -605,28 +605,28 @@ public: SkipEmptyParts Q_DECL_ENUMERATOR_DEPRECATED }; - Q_REQUIRED_RESULT QT_DEPRECATED_VERSION_X_5_15("Use Qt::SplitBehavior variant instead") + Q_REQUIRED_RESULT QT_DEPRECATED_VERSION_X_5_15("Use split(const QString &sep, Qt::SplitBehavior ...) variant instead") QStringList split(const QString &sep, SplitBehavior behavior, Qt::CaseSensitivity cs = Qt::CaseSensitive) const; - Q_REQUIRED_RESULT QT_DEPRECATED_VERSION_X_5_15("Use Qt::SplitBehavior variant instead") + Q_REQUIRED_RESULT QT_DEPRECATED_VERSION_X_5_15("Use splitRef(const QString &sep, Qt::SplitBehavior ...) variant instead") QVector splitRef(const QString &sep, SplitBehavior behavior, Qt::CaseSensitivity cs = Qt::CaseSensitive) const; - Q_REQUIRED_RESULT QT_DEPRECATED_VERSION_X_5_15("Use Qt::SplitBehavior variant instead") + Q_REQUIRED_RESULT QT_DEPRECATED_VERSION_X_5_15("Use split(QChar sep, Qt::SplitBehavior ...) variant instead") QStringList split(QChar sep, SplitBehavior behavior, Qt::CaseSensitivity cs = Qt::CaseSensitive) const; - Q_REQUIRED_RESULT QT_DEPRECATED_VERSION_X_5_15("Use Qt::SplitBehavior variant instead") + Q_REQUIRED_RESULT QT_DEPRECATED_VERSION_X_5_15("Use splitRef(QChar sep, Qt::SplitBehavior ...) variant instead") QVector splitRef(QChar sep, SplitBehavior behavior, Qt::CaseSensitivity cs = Qt::CaseSensitive) const; #ifndef QT_NO_REGEXP - Q_REQUIRED_RESULT QT_DEPRECATED_VERSION_X_5_15("Use Qt::SplitBehavior variant instead") + Q_REQUIRED_RESULT QT_DEPRECATED_VERSION_X_5_15("Use split(const QRegularExpression &, Qt::SplitBehavior) variant instead") QStringList split(const QRegExp &sep, SplitBehavior behavior) const; - Q_REQUIRED_RESULT QT_DEPRECATED_VERSION_X_5_15("Use Qt::SplitBehavior variant instead") + Q_REQUIRED_RESULT QT_DEPRECATED_VERSION_X_5_15("Use splitRef(const QRegularExpression &, Qt::SplitBehavior) variant instead") QVector splitRef(const QRegExp &sep, SplitBehavior behavior) const; #endif #if QT_CONFIG(regularexpression) - Q_REQUIRED_RESULT QT_DEPRECATED_VERSION_X_5_15("Use Qt::SplitBehavior variant instead") + Q_REQUIRED_RESULT QT_DEPRECATED_VERSION_X_5_15("Use split(const QRegularExpression &, Qt::SplitBehavior) variant instead") QStringList split(const QRegularExpression &sep, SplitBehavior behavior) const; - Q_REQUIRED_RESULT QT_DEPRECATED_VERSION_X_5_15("Use Qt::SplitBehavior variant instead") + Q_REQUIRED_RESULT QT_DEPRECATED_VERSION_X_5_15("Use splitRef(const QRegularExpression &, Qt::SplitBehavior) variant instead") QVector splitRef(const QRegularExpression &sep, SplitBehavior behavior) const; #endif #endif // 5.15 deprecations diff --git a/src/corelib/text/qstringview.h b/src/corelib/text/qstringview.h index 38a6a432..cd5bd334 100644 --- a/src/corelib/text/qstringview.h +++ b/src/corelib/text/qstringview.h @@ -244,7 +244,8 @@ public: } Q_REQUIRED_RESULT Q_DECL_CONSTEXPR QStringView mid(qsizetype pos, qsizetype n) const { - return QStringView(m_data + qBound(qsizetype(0), pos, m_size), qBound(qsizetype(0), pos + n, m_size) - qBound(qsizetype(0), pos, m_size)); + return QStringView(m_data + qBound(qsizetype(0), pos, m_size), + n == -1 ? m_size - pos : qBound(qsizetype(0), pos + n, m_size) - qBound(qsizetype(0), pos, m_size)); } Q_REQUIRED_RESULT Q_DECL_CONSTEXPR QStringView left(qsizetype n) const { diff --git a/src/corelib/text/qt_attribution.json b/src/corelib/text/qt_attribution.json index 05c088e9..64269b70 100644 --- a/src/corelib/text/qt_attribution.json +++ b/src/corelib/text/qt_attribution.json @@ -30,7 +30,7 @@ world's languages, with the largest and most extensive standard repository of locale data available.", "Homepage": "http://cldr.unicode.org/", - "Version": "v38", + "Version": "v39", "License": "// as specified in https://spdx.org/licenses/Unicode-DFS-2016.html", "License": "Unicode License Agreement - Data Files and Software (2016)", "LicenseId": "Unicode-DFS-2016", diff --git a/src/corelib/text/qtextboundaryfinder.cpp b/src/corelib/text/qtextboundaryfinder.cpp index ebdba6b2..8ac56197 100644 --- a/src/corelib/text/qtextboundaryfinder.cpp +++ b/src/corelib/text/qtextboundaryfinder.cpp @@ -96,8 +96,8 @@ static void init(QTextBoundaryFinder::BoundaryType type, const QChar *chars, int QTextBoundaryFinder allows to find Unicode text boundaries in a string, accordingly to the Unicode text boundary specification (see - \l{http://www.unicode.org/reports/tr14/}{Unicode Standard Annex #14} and - \l{http://www.unicode.org/reports/tr29/}{Unicode Standard Annex #29}). + \l{https://www.unicode.org/reports/tr14/}{Unicode Standard Annex #14} and + \l{https://www.unicode.org/reports/tr29/}{Unicode Standard Annex #29}). QTextBoundaryFinder can operate on a QString in four possible modes depending on the value of \a BoundaryType. @@ -108,17 +108,17 @@ static void init(QTextBoundaryFinder::BoundaryType type, const QChar *chars, int for example form one grapheme cluster as the user thinks of them as one character, yet it is in this case represented by two unicode code points - (see \l{http://www.unicode.org/reports/tr29/#Grapheme_Cluster_Boundaries}). + (see \l{https://www.unicode.org/reports/tr29/#Grapheme_Cluster_Boundaries}). Word boundaries are there to locate the start and end of what a language considers to be a word - (see \l{http://www.unicode.org/reports/tr29/#Word_Boundaries}). + (see \l{https://www.unicode.org/reports/tr29/#Word_Boundaries}). Line break boundaries give possible places where a line break might happen and sentence boundaries will show the beginning and end of whole sentences - (see \l{http://www.unicode.org/reports/tr29/#Sentence_Boundaries} and - \l{http://www.unicode.org/reports/tr14/}). + (see \l{https://www.unicode.org/reports/tr29/#Sentence_Boundaries} and + \l{https://www.unicode.org/reports/tr14/}). The first position in a string is always a valid boundary and refers to the position before the first character. The last diff --git a/src/corelib/text/qunicodetables.cpp b/src/corelib/text/qunicodetables.cpp index efb8e1f7..b41f9c13 100644 --- a/src/corelib/text/qunicodetables.cpp +++ b/src/corelib/text/qunicodetables.cpp @@ -88,55 +88,21 @@ static const unsigned short uc_property_trie[] = { 14288, 14320, 14352, 14384, 14416, 14448, 14480, 14512, 14544, 14576, 14608, 14640, 14672, 14704, 14736, 14768, 14544, 14544, 14544, 14544, 14800, 14832, 14864, 14896, - 14928, 14960, 14544, 14992, 15024, 15056, 15088, 15120, - 15152, 15184, 15216, 15248, 15280, 15312, 15344, 15376, - 15408, 15408, 15408, 15408, 15408, 15408, 15408, 15408, - 15440, 15440, 15440, 15440, 15472, 15504, 15536, 15568, - 15600, 15632, 15440, 15664, 15696, 15728, 15760, 15792, - 15824, 15856, 15888, 15920, 15952, 15984, 16016, 16048, - 16080, 16112, 16144, 16176, 16208, 16208, 16208, 16240, - 16272, 16304, 16336, 16368, 16400, 16432, 16432, 16464, - 16496, 16528, 16560, 9936, 16592, 16624, 16624, 16656, - 16688, 16688, 16688, 16688, 16688, 16688, 16720, 16752, + 14928, 14960, 14992, 15024, 15056, 15088, 15120, 15152, + 15184, 15216, 15248, 15280, 15312, 15344, 15376, 15408, + 15440, 15440, 15440, 15440, 15440, 15440, 15440, 15440, + 15472, 15504, 15472, 15472, 15536, 15568, 15600, 15632, + 15664, 15696, 15472, 15728, 15760, 15792, 15824, 15856, + 15888, 15920, 15952, 15984, 16016, 16048, 16080, 16112, + 16144, 16176, 16208, 16240, 16272, 16272, 16272, 16304, + 16336, 16368, 16400, 16432, 16464, 16496, 16496, 16528, + 16560, 16592, 16624, 9936, 16656, 16688, 16688, 16720, + 16752, 16752, 16752, 16752, 16752, 16752, 16784, 16816, - 16784, 16816, 16848, 16880, 16912, 16944, 16976, 17008, - 17040, 17072, 17104, 17104, 17136, 17168, 17200, 17232, - 17264, 17296, 17328, 17360, 17296, 17392, 17424, 17456, - 17488, 17488, 17520, 17552, 17584, 17584, 17616, 17648, - 17680, 17680, 17680, 17680, 17680, 17680, 17680, 17680, - 17680, 17680, 17680, 17680, 17680, 17680, 17680, 17680, - 17680, 17680, 17680, 17680, 17680, 17680, 17680, 17680, - 17680, 17680, 17680, 17680, 17680, 17680, 17680, 17680, - 17680, 17680, 17680, 17680, 17680, 17680, 17680, 17680, - 17680, 17680, 17680, 17680, 17680, 17680, 17680, 17680, - 17680, 17680, 17680, 17680, 17680, 17680, 17680, 17680, - 17680, 17680, 17680, 17680, 17680, 17680, 17680, 17680, - 17680, 17680, 17680, 17680, 17680, 17680, 17680, 17680, - 17680, 17680, 17680, 17680, 17680, 17680, 17680, 17680, - 17680, 17680, 17680, 17680, 17680, 17680, 17680, 17680, - 17680, 17680, 17680, 17680, 17680, 17680, 17680, 17680, - - 17680, 17680, 17680, 17680, 17680, 17680, 17680, 17680, - 17680, 17680, 17680, 17680, 17680, 17680, 17680, 17680, - 17680, 17680, 17680, 17680, 17680, 17680, 17680, 17680, - 17680, 17680, 17680, 17680, 17680, 17680, 17680, 17680, - 17680, 17680, 17680, 17680, 17680, 17680, 17680, 17680, - 17680, 17680, 17680, 17680, 17680, 17680, 17680, 17680, - 17680, 17680, 17680, 17680, 17680, 17680, 17680, 17680, - 17680, 17680, 17680, 17680, 17680, 17680, 17680, 17680, - 17680, 17680, 17680, 17680, 17680, 17680, 17680, 17680, - 17680, 17680, 17680, 17680, 17680, 17680, 17680, 17680, - 17680, 17680, 17680, 17680, 17680, 17680, 17680, 17680, - 17680, 17680, 17680, 17680, 17680, 17680, 17680, 17680, - 17680, 17680, 17680, 17680, 17680, 17680, 17680, 17680, - 17680, 17680, 17680, 17680, 17680, 17712, 17744, 17744, - 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776, - 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776, - - 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776, - 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776, - 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776, - 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776, + 16848, 16880, 16912, 16944, 16976, 17008, 17040, 17072, + 17104, 17136, 17168, 17168, 17200, 17232, 17264, 17296, + 17328, 17360, 17392, 17424, 17456, 17488, 17520, 17552, + 17584, 17584, 17616, 17648, 17680, 17680, 17712, 17744, 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776, @@ -163,708 +129,742 @@ static const unsigned short uc_property_trie[] = { 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776, - 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776, - 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776, - 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776, + 17776, 17776, 17776, 17776, 17776, 17808, 17840, 17840, + 17872, 17872, 17872, 17872, 17872, 17872, 17872, 17872, + 17872, 17872, 17872, 17872, 17872, 17872, 17872, 17872, - 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776, - 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776, - 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776, - 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776, - 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776, - 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776, - 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776, - 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776, - 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776, - 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776, - 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776, - 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776, - 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776, - 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776, - 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776, - 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776, + 17872, 17872, 17872, 17872, 17872, 17872, 17872, 17872, + 17872, 17872, 17872, 17872, 17872, 17872, 17872, 17872, + 17872, 17872, 17872, 17872, 17872, 17872, 17872, 17872, + 17872, 17872, 17872, 17872, 17872, 17872, 17872, 17872, + 17872, 17872, 17872, 17872, 17872, 17872, 17872, 17872, + 17872, 17872, 17872, 17872, 17872, 17872, 17872, 17872, + 17872, 17872, 17872, 17872, 17872, 17872, 17872, 17872, + 17872, 17872, 17872, 17872, 17872, 17872, 17872, 17872, + 17872, 17872, 17872, 17872, 17872, 17872, 17872, 17872, + 17872, 17872, 17872, 17872, 17872, 17872, 17872, 17872, + 17872, 17872, 17872, 17872, 17872, 17872, 17872, 17872, + 17872, 17872, 17872, 17872, 17872, 17872, 17872, 17872, + 17872, 17872, 17872, 17872, 17872, 17872, 17872, 17872, + 17872, 17872, 17872, 17872, 17872, 17872, 17872, 17872, + 17872, 17872, 17872, 17872, 17872, 17872, 17872, 17872, + 17872, 17872, 17872, 17872, 17872, 17872, 17872, 17872, - 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776, - 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776, - 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776, - 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776, - 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776, - 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776, - 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776, - 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776, - 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776, - 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776, - 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776, - 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776, - 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776, - 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776, - 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776, - 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776, + 17872, 17872, 17872, 17872, 17872, 17872, 17872, 17872, + 17872, 17872, 17872, 17872, 17872, 17872, 17872, 17872, + 17872, 17872, 17872, 17872, 17872, 17872, 17872, 17872, + 17872, 17872, 17872, 17872, 17872, 17872, 17872, 17872, + 17872, 17872, 17872, 17872, 17872, 17872, 17872, 17872, + 17872, 17872, 17872, 17872, 17872, 17872, 17872, 17872, + 17872, 17872, 17872, 17872, 17872, 17872, 17872, 17872, + 17872, 17872, 17872, 17872, 17872, 17872, 17872, 17872, + 17872, 17872, 17872, 17872, 17872, 17872, 17872, 17872, + 17872, 17872, 17872, 17872, 17872, 17872, 17872, 17872, + 17872, 17872, 17872, 17872, 17872, 17872, 17872, 17872, + 17872, 17872, 17872, 17872, 17872, 17872, 17872, 17872, + 17872, 17872, 17872, 17872, 17872, 17872, 17872, 17872, + 17872, 17872, 17872, 17872, 17872, 17872, 17872, 17872, + 17872, 17872, 17872, 17872, 17872, 17872, 17872, 17872, + 17872, 17872, 17872, 17872, 17872, 17872, 17872, 17872, - 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776, - 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776, - 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776, - 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776, - 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776, - 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776, - 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776, - 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776, - 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776, - 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776, - 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776, - 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776, - 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776, - 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776, - 17776, 17776, 17776, 17776, 17776, 17776, 17776, 17776, - 17776, 17776, 17776, 17776, 17776, 17808, 17840, 17872, + 17872, 17872, 17872, 17872, 17872, 17872, 17872, 17872, + 17872, 17872, 17872, 17872, 17872, 17872, 17872, 17872, + 17872, 17872, 17872, 17872, 17872, 17872, 17872, 17872, + 17872, 17872, 17872, 17872, 17872, 17872, 17872, 17872, + 17872, 17872, 17872, 17872, 17872, 17872, 17872, 17872, + 17872, 17872, 17872, 17872, 17872, 17872, 17872, 17872, + 17872, 17872, 17872, 17872, 17872, 17872, 17872, 17872, + 17872, 17872, 17872, 17872, 17872, 17872, 17872, 17872, + 17872, 17872, 17872, 17872, 17872, 17872, 17872, 17872, + 17872, 17872, 17872, 17872, 17872, 17872, 17872, 17872, + 17872, 17872, 17872, 17872, 17872, 17872, 17872, 17872, + 17872, 17872, 17872, 17872, 17872, 17872, 17872, 17872, + 17872, 17872, 17872, 17872, 17872, 17872, 17872, 17872, + 17872, 17872, 17872, 17872, 17872, 17872, 17872, 17872, + 17872, 17872, 17872, 17872, 17872, 17872, 17872, 17872, + 17872, 17872, 17872, 17872, 17872, 17872, 17872, 17872, - 17904, 17936, 17936, 17936, 17936, 17936, 17936, 17936, - 17936, 17936, 17936, 17936, 17936, 17936, 17936, 17936, - 17936, 17936, 17936, 17936, 17936, 17936, 17936, 17936, - 17936, 17936, 17936, 17936, 17936, 17936, 17936, 17936, - 17936, 17936, 17936, 17936, 17968, 18000, 18032, 18064, - 18096, 18096, 18096, 18096, 18096, 18096, 18096, 18096, - 18128, 18160, 18192, 18224, 18256, 18288, 18288, 18320, - 18352, 18384, 18416, 18448, 18480, 18512, 18544, 18576, - 18608, 18640, 18672, 18704, 18736, 18768, 18800, 18832, - 18864, 18896, 18928, 18960, 18992, 19024, 19056, 19088, - 19120, 19152, 19184, 19216, 19248, 19280, 19312, 19344, - 19376, 19408, 19440, 19472, 19504, 19536, 19568, 19600, - 19632, 19664, 19696, 19728, 19760, 19792, 19824, 19632, - 19664, 19696, 19728, 19760, 19792, 19824, 19632, 19664, - 19696, 19728, 19760, 19792, 19824, 19632, 19664, 19696, - 19728, 19760, 19792, 19824, 19632, 19664, 19696, 19728, + 17872, 17872, 17872, 17872, 17872, 17872, 17872, 17872, + 17872, 17872, 17872, 17872, 17872, 17872, 17872, 17872, + 17872, 17872, 17872, 17872, 17872, 17872, 17872, 17872, + 17872, 17872, 17872, 17872, 17872, 17872, 17872, 17872, + 17872, 17872, 17872, 17872, 17872, 17872, 17872, 17872, + 17872, 17872, 17872, 17872, 17872, 17872, 17872, 17872, + 17872, 17872, 17872, 17872, 17872, 17872, 17872, 17872, + 17872, 17872, 17872, 17872, 17872, 17872, 17872, 17872, + 17872, 17872, 17872, 17872, 17872, 17872, 17872, 17872, + 17872, 17872, 17872, 17872, 17872, 17872, 17872, 17872, + 17872, 17872, 17872, 17872, 17872, 17872, 17872, 17872, + 17872, 17872, 17872, 17872, 17872, 17872, 17872, 17872, + 17872, 17872, 17872, 17872, 17872, 17872, 17872, 17872, + 17872, 17872, 17872, 17872, 17872, 17872, 17872, 17872, + 17872, 17872, 17872, 17872, 17872, 17872, 17872, 17872, + 17872, 17872, 17872, 17872, 17872, 17872, 17872, 17872, - 19760, 19792, 19824, 19632, 19664, 19696, 19728, 19760, - 19792, 19824, 19632, 19664, 19696, 19728, 19760, 19792, - 19824, 19632, 19664, 19696, 19728, 19760, 19792, 19824, - 19632, 19664, 19696, 19728, 19760, 19792, 19824, 19632, - 19664, 19696, 19728, 19760, 19792, 19824, 19632, 19664, - 19696, 19728, 19760, 19792, 19824, 19632, 19664, 19696, - 19728, 19760, 19792, 19824, 19632, 19664, 19696, 19728, - 19760, 19792, 19824, 19632, 19664, 19696, 19728, 19760, - 19792, 19824, 19632, 19664, 19696, 19728, 19760, 19792, - 19824, 19632, 19664, 19696, 19728, 19760, 19792, 19824, - 19632, 19664, 19696, 19728, 19760, 19792, 19824, 19632, - 19664, 19696, 19728, 19760, 19792, 19824, 19632, 19664, - 19696, 19728, 19760, 19792, 19824, 19632, 19664, 19696, - 19728, 19760, 19792, 19824, 19632, 19664, 19696, 19728, - 19760, 19792, 19824, 19632, 19664, 19696, 19728, 19760, - 19792, 19824, 19632, 19664, 19696, 19728, 19760, 19792, + 17872, 17872, 17872, 17872, 17872, 17872, 17872, 17872, + 17872, 17872, 17872, 17872, 17872, 17872, 17872, 17872, + 17872, 17872, 17872, 17872, 17872, 17872, 17872, 17872, + 17872, 17872, 17872, 17872, 17872, 17872, 17872, 17872, + 17872, 17872, 17872, 17872, 17872, 17872, 17872, 17872, + 17872, 17872, 17872, 17872, 17872, 17872, 17872, 17872, + 17872, 17872, 17872, 17872, 17872, 17872, 17872, 17872, + 17872, 17872, 17872, 17872, 17872, 17872, 17872, 17872, + 17872, 17872, 17872, 17872, 17872, 17872, 17872, 17872, + 17872, 17872, 17872, 17872, 17872, 17872, 17872, 17872, + 17872, 17872, 17872, 17872, 17872, 17872, 17872, 17872, + 17872, 17872, 17872, 17872, 17872, 17872, 17872, 17872, + 17872, 17872, 17872, 17872, 17872, 17872, 17872, 17872, + 17872, 17872, 17872, 17872, 17872, 17872, 17872, 17872, + 17872, 17872, 17872, 17872, 17872, 17872, 17872, 17872, + 17872, 17872, 17872, 17872, 17872, 17904, 17936, 17968, - 19824, 19632, 19664, 19696, 19728, 19760, 19792, 19824, - 19632, 19664, 19696, 19728, 19760, 19792, 19824, 19632, - 19664, 19696, 19728, 19760, 19792, 19824, 19632, 19664, - 19696, 19728, 19760, 19792, 19824, 19632, 19664, 19696, - 19728, 19760, 19792, 19824, 19632, 19664, 19696, 19728, - 19760, 19792, 19824, 19632, 19664, 19696, 19728, 19760, - 19792, 19824, 19632, 19664, 19696, 19728, 19760, 19792, - 19824, 19632, 19664, 19696, 19728, 19760, 19792, 19824, - 19632, 19664, 19696, 19728, 19760, 19792, 19824, 19632, - 19664, 19696, 19728, 19760, 19792, 19824, 19632, 19664, - 19696, 19728, 19760, 19792, 19824, 19632, 19664, 19696, - 19728, 19760, 19792, 19824, 19632, 19664, 19696, 19728, - 19760, 19792, 19824, 19632, 19664, 19696, 19728, 19760, - 19792, 19824, 19632, 19664, 19696, 19728, 19760, 19792, - 19824, 19632, 19664, 19696, 19728, 19760, 19792, 19824, - 19632, 19664, 19696, 19728, 19760, 19792, 19824, 19632, + 18000, 18032, 18032, 18032, 18032, 18032, 18032, 18032, + 18032, 18032, 18032, 18032, 18032, 18032, 18032, 18032, + 18032, 18032, 18032, 18032, 18032, 18032, 18032, 18032, + 18032, 18032, 18032, 18032, 18032, 18032, 18032, 18032, + 18032, 18032, 18032, 18032, 18064, 18096, 18128, 18160, + 18192, 18192, 18192, 18192, 18192, 18192, 18192, 18192, + 18224, 18256, 18288, 18320, 18352, 18384, 18384, 18416, + 18448, 18480, 18512, 18544, 18576, 18608, 18640, 18672, + 18704, 18736, 18768, 18800, 18832, 18864, 18896, 18928, + 18960, 18992, 19024, 19056, 19088, 19120, 19152, 19184, + 19216, 19248, 19280, 19312, 19344, 19376, 19408, 19440, + 19472, 19504, 19536, 19568, 19600, 19632, 19664, 19696, + 19728, 19760, 19792, 19824, 19856, 19888, 19920, 19728, + 19760, 19792, 19824, 19856, 19888, 19920, 19728, 19760, + 19792, 19824, 19856, 19888, 19920, 19728, 19760, 19792, + 19824, 19856, 19888, 19920, 19728, 19760, 19792, 19824, - 19664, 19696, 19728, 19760, 19792, 19824, 19632, 19664, - 19696, 19728, 19760, 19792, 19824, 19632, 19664, 19696, - 19728, 19760, 19792, 19824, 19632, 19664, 19696, 19728, - 19760, 19792, 19824, 19632, 19664, 19696, 19728, 19760, - 19792, 19824, 19632, 19664, 19696, 19728, 19760, 19792, - 19824, 19632, 19664, 19696, 19728, 19760, 19792, 19824, - 19632, 19664, 19696, 19728, 19760, 19792, 19824, 19632, - 19664, 19696, 19728, 19760, 19792, 19856, 19888, 19920, - 19952, 19952, 19952, 19952, 19952, 19952, 19952, 19952, - 19952, 19952, 19952, 19952, 19952, 19952, 19952, 19952, - 19952, 19952, 19952, 19952, 19952, 19952, 19952, 19952, - 19952, 19952, 19952, 19952, 19952, 19952, 19952, 19952, - 19952, 19952, 19952, 19952, 19952, 19952, 19952, 19952, - 19952, 19952, 19952, 19952, 19952, 19952, 19952, 19952, - 19952, 19952, 19952, 19952, 19952, 19952, 19952, 19952, - 19952, 19952, 19952, 19952, 19952, 19952, 19952, 19952, + 19856, 19888, 19920, 19728, 19760, 19792, 19824, 19856, + 19888, 19920, 19728, 19760, 19792, 19824, 19856, 19888, + 19920, 19728, 19760, 19792, 19824, 19856, 19888, 19920, + 19728, 19760, 19792, 19824, 19856, 19888, 19920, 19728, + 19760, 19792, 19824, 19856, 19888, 19920, 19728, 19760, + 19792, 19824, 19856, 19888, 19920, 19728, 19760, 19792, + 19824, 19856, 19888, 19920, 19728, 19760, 19792, 19824, + 19856, 19888, 19920, 19728, 19760, 19792, 19824, 19856, + 19888, 19920, 19728, 19760, 19792, 19824, 19856, 19888, + 19920, 19728, 19760, 19792, 19824, 19856, 19888, 19920, + 19728, 19760, 19792, 19824, 19856, 19888, 19920, 19728, + 19760, 19792, 19824, 19856, 19888, 19920, 19728, 19760, + 19792, 19824, 19856, 19888, 19920, 19728, 19760, 19792, + 19824, 19856, 19888, 19920, 19728, 19760, 19792, 19824, + 19856, 19888, 19920, 19728, 19760, 19792, 19824, 19856, + 19888, 19920, 19728, 19760, 19792, 19824, 19856, 19888, - 19984, 19984, 19984, 19984, 19984, 19984, 19984, 19984, - 19984, 19984, 19984, 19984, 19984, 19984, 19984, 19984, - 19984, 19984, 19984, 19984, 19984, 19984, 19984, 19984, - 19984, 19984, 19984, 19984, 19984, 19984, 19984, 19984, - 19984, 19984, 19984, 19984, 19984, 19984, 19984, 19984, - 19984, 19984, 19984, 19984, 19984, 19984, 19984, 19984, - 19984, 19984, 19984, 19984, 19984, 19984, 19984, 19984, - 19984, 19984, 19984, 19984, 19984, 19984, 19984, 19984, - 19984, 19984, 19984, 19984, 19984, 19984, 19984, 19984, - 19984, 19984, 19984, 19984, 19984, 19984, 19984, 19984, - 19984, 19984, 19984, 19984, 19984, 19984, 19984, 19984, - 19984, 19984, 19984, 19984, 19984, 19984, 19984, 19984, - 19984, 19984, 19984, 19984, 19984, 19984, 19984, 19984, - 19984, 19984, 19984, 19984, 19984, 19984, 19984, 19984, - 19984, 19984, 19984, 19984, 19984, 19984, 19984, 19984, - 19984, 19984, 19984, 19984, 19984, 19984, 19984, 19984, + 19920, 19728, 19760, 19792, 19824, 19856, 19888, 19920, + 19728, 19760, 19792, 19824, 19856, 19888, 19920, 19728, + 19760, 19792, 19824, 19856, 19888, 19920, 19728, 19760, + 19792, 19824, 19856, 19888, 19920, 19728, 19760, 19792, + 19824, 19856, 19888, 19920, 19728, 19760, 19792, 19824, + 19856, 19888, 19920, 19728, 19760, 19792, 19824, 19856, + 19888, 19920, 19728, 19760, 19792, 19824, 19856, 19888, + 19920, 19728, 19760, 19792, 19824, 19856, 19888, 19920, + 19728, 19760, 19792, 19824, 19856, 19888, 19920, 19728, + 19760, 19792, 19824, 19856, 19888, 19920, 19728, 19760, + 19792, 19824, 19856, 19888, 19920, 19728, 19760, 19792, + 19824, 19856, 19888, 19920, 19728, 19760, 19792, 19824, + 19856, 19888, 19920, 19728, 19760, 19792, 19824, 19856, + 19888, 19920, 19728, 19760, 19792, 19824, 19856, 19888, + 19920, 19728, 19760, 19792, 19824, 19856, 19888, 19920, + 19728, 19760, 19792, 19824, 19856, 19888, 19920, 19728, - 19984, 19984, 19984, 19984, 19984, 19984, 19984, 19984, - 19984, 19984, 19984, 19984, 19984, 19984, 19984, 19984, - 19984, 19984, 19984, 19984, 19984, 19984, 19984, 19984, - 19984, 19984, 19984, 19984, 19984, 19984, 19984, 19984, - 19984, 19984, 19984, 19984, 19984, 19984, 19984, 19984, - 19984, 19984, 19984, 19984, 19984, 19984, 19984, 19984, - 19984, 19984, 19984, 19984, 19984, 19984, 19984, 19984, - 19984, 19984, 19984, 19984, 19984, 19984, 19984, 19984, - 19984, 19984, 19984, 19984, 19984, 19984, 19984, 19984, - 20016, 20016, 20016, 20016, 20016, 20016, 20016, 20016, - 20048, 20080, 20112, 20144, 20176, 20176, 20208, 20240, - 20272, 20304, 20336, 20368, 20368, 20400, 20432, 20368, - 20368, 20368, 20368, 20368, 20368, 20368, 20368, 20368, - 20368, 20464, 20496, 20368, 20528, 20368, 20560, 20592, - 20624, 20656, 20688, 20720, 20368, 20368, 20368, 20752, - 20784, 20816, 20848, 20880, 20912, 20944, 20976, 21008, + 19760, 19792, 19824, 19856, 19888, 19920, 19728, 19760, + 19792, 19824, 19856, 19888, 19920, 19728, 19760, 19792, + 19824, 19856, 19888, 19920, 19728, 19760, 19792, 19824, + 19856, 19888, 19920, 19728, 19760, 19792, 19824, 19856, + 19888, 19920, 19728, 19760, 19792, 19824, 19856, 19888, + 19920, 19728, 19760, 19792, 19824, 19856, 19888, 19920, + 19728, 19760, 19792, 19824, 19856, 19888, 19920, 19728, + 19760, 19792, 19824, 19856, 19888, 19952, 19984, 20016, + 20048, 20048, 20048, 20048, 20048, 20048, 20048, 20048, + 20048, 20048, 20048, 20048, 20048, 20048, 20048, 20048, + 20048, 20048, 20048, 20048, 20048, 20048, 20048, 20048, + 20048, 20048, 20048, 20048, 20048, 20048, 20048, 20048, + 20048, 20048, 20048, 20048, 20048, 20048, 20048, 20048, + 20048, 20048, 20048, 20048, 20048, 20048, 20048, 20048, + 20048, 20048, 20048, 20048, 20048, 20048, 20048, 20048, + 20048, 20048, 20048, 20048, 20048, 20048, 20048, 20048, - 21040, 21072, 21104, 9936, 21136, 21136, 21136, 21168, - 21200, 21232, 21264, 21296, 21328, 21360, 21392, 21424, - 9936, 9936, 9936, 9936, 21456, 21488, 21520, 21552, - 21584, 21616, 21648, 21680, 21712, 21744, 21776, 9936, - 21808, 21840, 21872, 21904, 21936, 21968, 22000, 22032, - 22064, 22096, 22128, 22160, 9936, 9936, 9936, 9936, - 22192, 22192, 22192, 22192, 22192, 22192, 22192, 22192, - 22192, 22224, 22256, 22288, 9936, 9936, 9936, 9936, - 22320, 22352, 22384, 22416, 22448, 22480, 8432, 22512, - 22544, 22576, 8432, 8432, 22608, 22640, 22672, 22704, - 22736, 22768, 22800, 22832, 22864, 8432, 22896, 22928, - 22960, 22992, 23024, 23056, 23088, 23120, 8432, 8432, - 23152, 23152, 23184, 8432, 23216, 23248, 23280, 23312, - 23344, 23376, 8432, 8432, 8432, 8432, 8432, 8432, - 8432, 8432, 8432, 23408, 23440, 23472, 8432, 8432, - 23504, 23536, 23568, 8432, 8432, 23600, 23632, 23664, + 20080, 20080, 20080, 20080, 20080, 20080, 20080, 20080, + 20080, 20080, 20080, 20080, 20080, 20080, 20080, 20080, + 20080, 20080, 20080, 20080, 20080, 20080, 20080, 20080, + 20080, 20080, 20080, 20080, 20080, 20080, 20080, 20080, + 20080, 20080, 20080, 20080, 20080, 20080, 20080, 20080, + 20080, 20080, 20080, 20080, 20080, 20080, 20080, 20080, + 20080, 20080, 20080, 20080, 20080, 20080, 20080, 20080, + 20080, 20080, 20080, 20080, 20080, 20080, 20080, 20080, + 20080, 20080, 20080, 20080, 20080, 20080, 20080, 20080, + 20080, 20080, 20080, 20080, 20080, 20080, 20080, 20080, + 20080, 20080, 20080, 20080, 20080, 20080, 20080, 20080, + 20080, 20080, 20080, 20080, 20080, 20080, 20080, 20080, + 20080, 20080, 20080, 20080, 20080, 20080, 20080, 20080, + 20080, 20080, 20080, 20080, 20080, 20080, 20080, 20080, + 20080, 20080, 20080, 20080, 20080, 20080, 20080, 20080, + 20080, 20080, 20080, 20080, 20080, 20080, 20080, 20080, + + 20080, 20080, 20080, 20080, 20080, 20080, 20080, 20080, + 20080, 20080, 20080, 20080, 20080, 20080, 20080, 20080, + 20080, 20080, 20080, 20080, 20080, 20080, 20080, 20080, + 20080, 20080, 20080, 20080, 20080, 20080, 20080, 20080, + 20080, 20080, 20080, 20080, 20080, 20080, 20080, 20080, + 20080, 20080, 20080, 20080, 20080, 20080, 20080, 20080, + 20080, 20080, 20080, 20080, 20080, 20080, 20080, 20080, + 20080, 20080, 20080, 20080, 20080, 20080, 20080, 20080, + 20080, 20080, 20080, 20080, 20080, 20080, 20080, 20080, + 20112, 20112, 20112, 20112, 20112, 20112, 20112, 20112, + 20144, 20176, 20208, 20240, 20272, 20272, 20304, 20336, + 20368, 20400, 20432, 20464, 20464, 20496, 20528, 20464, + 20464, 20464, 20464, 20464, 20464, 20464, 20464, 20464, + 20464, 20560, 20592, 20464, 20624, 20464, 20656, 20688, + 20720, 20752, 20784, 20816, 20464, 20464, 20464, 20848, + 20880, 20912, 20944, 20976, 21008, 21040, 21072, 21104, + + 21136, 21168, 21200, 9936, 21232, 21232, 21232, 21264, + 21296, 21328, 21360, 21392, 21424, 21456, 21488, 21520, + 9936, 9936, 9936, 9936, 21552, 21584, 21616, 21648, + 21680, 21712, 21744, 21776, 21808, 21840, 21872, 9936, + 21904, 21936, 21968, 22000, 22032, 22064, 22096, 22128, + 22160, 22192, 22224, 22256, 9936, 9936, 9936, 9936, + 22288, 22288, 22288, 22288, 22288, 22288, 22288, 22288, + 22288, 22320, 22352, 22384, 9936, 9936, 9936, 9936, + 22416, 22448, 22480, 22512, 22544, 22576, 8432, 22608, + 22640, 22672, 8432, 8432, 22704, 22736, 22768, 22800, + 22832, 22864, 22896, 22928, 22960, 8432, 22992, 23024, + 23056, 23088, 23120, 23152, 23184, 23216, 8432, 8432, + 23248, 23248, 23280, 8432, 23312, 23344, 23376, 23408, + 23440, 23472, 8432, 8432, 8432, 8432, 8432, 8432, + 8432, 8432, 8432, 23504, 23536, 23568, 8432, 8432, + 23600, 23632, 23664, 8432, 8432, 23696, 23728, 23760, // [0x11000..0x110000) - 23696, 23952, 24208, 24464, 24720, 24976, 25232, 25488, - 25744, 26000, 26256, 26512, 26768, 27024, 27280, 27536, - 27792, 27792, 27792, 28048, 28304, 28560, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 28816, 28816, 29072, 29328, 29584, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 29840, 30096, 30352, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 30608, 30608, 30864, 31120, 26512, 26512, 31376, 31632, - 31888, 31888, 31888, 31888, 31888, 31888, 31888, 31888, - 31888, 31888, 31888, 31888, 31888, 31888, 31888, 31888, - 31888, 31888, 31888, 31888, 31888, 31888, 31888, 32144, - 31888, 31888, 32400, 32656, 32912, 33168, 26512, 26512, + 23792, 24048, 24304, 24560, 24816, 25072, 25328, 25584, + 25840, 26096, 26352, 26608, 26864, 27120, 27376, 27632, + 27888, 27888, 27888, 28144, 28400, 28656, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 28912, 28912, 29168, 29424, 29680, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 29936, 30192, 30448, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 30704, 30704, 30960, 31216, 26608, 26608, 31472, 31728, + 31984, 31984, 31984, 31984, 31984, 31984, 31984, 31984, + 31984, 31984, 31984, 31984, 31984, 31984, 31984, 31984, + 31984, 31984, 31984, 31984, 31984, 31984, 31984, 32240, + 31984, 31984, 32496, 32752, 33008, 33264, 26608, 26608, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 33424, 33680, 33936, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 34192, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 34448, 34704, 34960, 35216, 35472, 35728, 35984, 36240, - 36496, 36496, 36752, 26512, 26512, 26512, 26512, 26512, - 37008, 37264, 37520, 26512, 26512, 26512, 26512, 26512, - 37776, 38032, 38288, 38288, 38544, 38800, 39056, 38288, - 39312, 39568, 39824, 40080, 40336, 40592, 40848, 41104, - 41360, 41616, 41872, 42128, 42384, 42384, 42384, 42640, - 42896, 42896, 42896, 42896, 42896, 42896, 42896, 42896, - 42896, 42896, 42896, 42896, 42896, 42896, 42896, 42896, - 42896, 42896, 42896, 42896, 42896, 42896, 42896, 42896, - 42896, 42896, 42896, 42896, 42896, 42896, 42896, 42896, - 42896, 42896, 42896, 42896, 42896, 42896, 42896, 42896, - 42896, 42896, 42896, 42896, 42896, 42896, 42896, 42896, - 42896, 42896, 42896, 42896, 42896, 42896, 42896, 42896, - 42896, 42896, 42896, 42896, 42896, 42896, 42896, 42896, - 42896, 42896, 42896, 42896, 42896, 42896, 42896, 42896, - 42896, 42896, 42896, 42896, 42896, 42896, 42896, 42896, - 42896, 42896, 42896, 42896, 42896, 42896, 42896, 42896, - 42896, 42896, 42896, 42896, 42896, 42896, 42896, 42896, - 42896, 42896, 42896, 42896, 42896, 42896, 42896, 42896, - 42896, 42896, 42896, 42896, 42896, 42896, 42896, 42896, - 42896, 42896, 42896, 42896, 42896, 42896, 42896, 42896, - 42896, 42896, 42896, 42896, 42896, 42896, 42896, 42896, - 42896, 42896, 42896, 42896, 42896, 42896, 42896, 42896, - 42896, 42896, 42896, 42896, 42896, 42896, 42896, 42896, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 33520, 33776, 34032, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 34288, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 34544, 34800, 35056, 35312, 35568, 35824, 36080, 36336, + 36592, 36592, 36848, 26608, 26608, 26608, 26608, 26608, + 37104, 37360, 37616, 26608, 26608, 26608, 26608, 26608, + 37872, 38128, 38384, 38384, 38640, 38896, 39152, 38384, + 39408, 39664, 39920, 40176, 40432, 40688, 40944, 41200, + 41456, 41712, 41968, 42224, 42480, 42480, 42480, 42736, + 42992, 42992, 42992, 42992, 42992, 42992, 42992, 42992, + 42992, 42992, 42992, 42992, 42992, 42992, 42992, 42992, + 42992, 42992, 42992, 42992, 42992, 42992, 42992, 42992, + 42992, 42992, 42992, 42992, 42992, 42992, 42992, 42992, + 42992, 42992, 42992, 42992, 42992, 42992, 42992, 42992, + 42992, 42992, 42992, 42992, 42992, 42992, 42992, 42992, + 42992, 42992, 42992, 42992, 42992, 42992, 42992, 42992, + 42992, 42992, 42992, 42992, 42992, 42992, 42992, 42992, + 42992, 42992, 42992, 42992, 42992, 42992, 42992, 42992, + 42992, 42992, 42992, 42992, 42992, 42992, 42992, 42992, + 42992, 42992, 42992, 42992, 42992, 42992, 42992, 42992, + 42992, 42992, 42992, 42992, 42992, 42992, 42992, 42992, + 42992, 42992, 42992, 42992, 42992, 42992, 42992, 42992, + 42992, 42992, 42992, 42992, 42992, 42992, 42992, 42992, + 42992, 42992, 42992, 42992, 42992, 42992, 42992, 42992, + 42992, 42992, 42992, 42992, 42992, 42992, 42992, 42992, + 42992, 42992, 42992, 42992, 42992, 42992, 42992, 42992, + 42992, 42992, 42992, 42992, 42992, 42992, 42992, 42992, - 42896, 42896, 42896, 42896, 42896, 42896, 42896, 42896, - 42896, 42896, 42896, 42896, 42896, 42896, 42896, 42896, - 42896, 42896, 42896, 42896, 42896, 42896, 43152, 43408, - 43408, 43408, 43408, 43408, 43408, 43408, 43408, 43408, - 43408, 43408, 43408, 43408, 43408, 43408, 43408, 43664, - 43920, 44176, 44176, 44176, 44176, 44176, 44176, 44176, - 44176, 44176, 44176, 44176, 44176, 44176, 44176, 44176, - 44176, 44176, 44176, 44176, 44176, 44176, 44432, 44688, - 44688, 44688, 44688, 44688, 44688, 44688, 44688, 44688, - 44688, 44688, 44688, 44688, 44688, 44688, 44688, 44688, - 44688, 44688, 44688, 44688, 44688, 44688, 44688, 44688, - 44688, 44688, 44688, 44944, 42384, 42384, 42384, 42384, - 42384, 42384, 42384, 42384, 42384, 42384, 42384, 42384, - 45200, 45200, 45456, 42384, 42384, 42384, 42384, 42640, - 45712, 45712, 45712, 45712, 45712, 45712, 45712, 45712, - 45712, 45712, 45712, 45712, 45712, 45712, 45712, 45712, - 45712, 45712, 45712, 45968, 42384, 42384, 42384, 42384, - 42384, 42384, 42384, 42384, 42384, 42384, 42384, 42384, - 42384, 42384, 42384, 42384, 42384, 42384, 42384, 42384, - 42384, 42384, 42384, 42384, 42384, 42384, 42384, 42384, - 42384, 42384, 42384, 42384, 42384, 42384, 42384, 42384, - 42384, 42384, 42384, 42384, 42384, 42384, 42384, 42384, - 42384, 42384, 42384, 42384, 42384, 42384, 42384, 42384, - 42384, 42384, 42384, 42384, 42384, 42384, 42384, 42384, - 42384, 42384, 42384, 42384, 42384, 42384, 42384, 42384, - 42384, 42384, 42384, 42384, 42384, 42384, 42384, 42384, - 42384, 42384, 42384, 42384, 42384, 42384, 42384, 42384, - 42384, 42384, 42384, 42384, 42384, 42384, 42384, 42384, - 42384, 42384, 42384, 42384, 42384, 42384, 42384, 42384, - 42384, 42384, 42384, 42384, 42384, 42384, 42384, 42384, - 42384, 42384, 42384, 42384, 42384, 42384, 42384, 42384, - 42384, 42384, 42384, 42384, 42384, 42384, 42384, 42384, + 42992, 42992, 42992, 42992, 42992, 42992, 42992, 42992, + 42992, 42992, 42992, 42992, 42992, 42992, 42992, 42992, + 42992, 42992, 42992, 42992, 42992, 42992, 43248, 43504, + 43504, 43504, 43504, 43504, 43504, 43504, 43504, 43504, + 43504, 43504, 43504, 43504, 43504, 43504, 43504, 43760, + 44016, 44272, 44272, 44272, 44272, 44272, 44272, 44272, + 44272, 44272, 44272, 44272, 44272, 44272, 44272, 44272, + 44272, 44272, 44272, 44272, 44272, 44272, 44528, 44784, + 44784, 44784, 44784, 44784, 44784, 44784, 44784, 44784, + 44784, 44784, 44784, 44784, 44784, 44784, 44784, 44784, + 44784, 44784, 44784, 44784, 44784, 44784, 44784, 44784, + 44784, 44784, 44784, 45040, 45296, 45296, 45296, 45296, + 45296, 45296, 45296, 45296, 45296, 45296, 45296, 45296, + 45552, 45552, 45808, 45296, 45296, 45296, 45296, 46064, + 46320, 46320, 46320, 46320, 46320, 46320, 46320, 46320, + 46320, 46320, 46320, 46320, 46320, 46320, 46320, 46320, + 46320, 46320, 46320, 46576, 45296, 45296, 45296, 45296, + 45296, 45296, 45296, 45296, 45296, 45296, 45296, 45296, + 45296, 45296, 45296, 45296, 45296, 45296, 45296, 45296, + 45296, 45296, 45296, 45296, 45296, 45296, 45296, 45296, + 45296, 45296, 45296, 45296, 45296, 45296, 45296, 45296, + 45296, 45296, 45296, 45296, 45296, 45296, 45296, 45296, + 45296, 45296, 45296, 45296, 45296, 45296, 45296, 45296, + 45296, 45296, 45296, 45296, 45296, 45296, 45296, 45296, + 45296, 45296, 45296, 45296, 45296, 45296, 45296, 45296, + 45296, 45296, 45296, 45296, 45296, 45296, 45296, 45296, + 45296, 45296, 45296, 45296, 45296, 45296, 45296, 45296, + 45296, 45296, 45296, 45296, 45296, 45296, 45296, 45296, + 45296, 45296, 45296, 45296, 45296, 45296, 45296, 45296, + 45296, 45296, 45296, 45296, 45296, 45296, 45296, 45296, + 45296, 45296, 45296, 45296, 45296, 45296, 45296, 45296, + 45296, 45296, 45296, 45296, 45296, 45296, 45296, 45296, - 42384, 42384, 42384, 42384, 42384, 42384, 42384, 42384, - 42384, 42384, 42384, 42384, 42384, 42384, 42384, 42384, - 42384, 42384, 42384, 42384, 42384, 42384, 42384, 42384, - 42384, 42384, 42384, 42384, 42384, 42384, 42384, 42384, - 42384, 42384, 42384, 42384, 42384, 42384, 42384, 42384, - 42384, 42384, 42384, 42384, 42384, 42384, 42384, 42384, - 42384, 42384, 42384, 42384, 42384, 42384, 42384, 42384, - 42384, 42384, 42384, 42384, 42384, 42384, 42384, 42384, - 42384, 42384, 42384, 42384, 42384, 42384, 42384, 42384, - 42384, 42384, 42384, 42384, 42384, 42384, 42384, 42384, - 42384, 42384, 42384, 42384, 42384, 42384, 42384, 42384, - 42384, 42384, 42384, 42384, 42384, 42384, 42384, 42384, - 42384, 42384, 42384, 42384, 42384, 42384, 42384, 42384, - 42384, 42384, 42384, 42384, 42384, 42384, 42384, 42640, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, + 45296, 45296, 45296, 45296, 45296, 45296, 45296, 45296, + 45296, 45296, 45296, 45296, 45296, 45296, 45296, 45296, + 45296, 45296, 45296, 45296, 45296, 45296, 45296, 45296, + 45296, 45296, 45296, 45296, 45296, 45296, 45296, 45296, + 45296, 45296, 45296, 45296, 45296, 45296, 45296, 45296, + 45296, 45296, 45296, 45296, 45296, 45296, 45296, 45296, + 45296, 45296, 45296, 45296, 45296, 45296, 45296, 45296, + 45296, 45296, 45296, 45296, 45296, 45296, 45296, 45296, + 45296, 45296, 45296, 45296, 45296, 45296, 45296, 45296, + 45296, 45296, 45296, 45296, 45296, 45296, 45296, 45296, + 45296, 45296, 45296, 45296, 45296, 45296, 45296, 45296, + 45296, 45296, 45296, 45296, 45296, 45296, 45296, 45296, + 45296, 45296, 45296, 45296, 45296, 45296, 45296, 45296, + 45296, 45296, 45296, 45296, 45296, 45296, 45296, 46064, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 46224, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 46832, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 46224, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 46832, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 46224, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 46832, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 46224, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 46832, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 46224, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 46832, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 46224, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 46832, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 46224, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 46832, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 46224, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 46832, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 46224, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 46832, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 46224, - 46480, 46736, 46992, 46992, 46992, 46992, 46992, 46992, - 46992, 46992, 46992, 46992, 46992, 46992, 46992, 46992, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 46832, + 47088, 47344, 47600, 47600, 47600, 47600, 47600, 47600, + 47600, 47600, 47600, 47600, 47600, 47600, 47600, 47600, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 26512, - 26512, 26512, 26512, 26512, 26512, 26512, 26512, 46224, - 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248, - 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248, - 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248, - 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248, - 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248, - 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248, - 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248, - 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248, - 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248, - 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248, - 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248, - 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248, - 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248, - 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248, - 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248, - 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248, - 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248, - 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 26608, + 26608, 26608, 26608, 26608, 26608, 26608, 26608, 46832, + 47856, 47856, 47856, 47856, 47856, 47856, 47856, 47856, + 47856, 47856, 47856, 47856, 47856, 47856, 47856, 47856, + 47856, 47856, 47856, 47856, 47856, 47856, 47856, 47856, + 47856, 47856, 47856, 47856, 47856, 47856, 47856, 47856, + 47856, 47856, 47856, 47856, 47856, 47856, 47856, 47856, + 47856, 47856, 47856, 47856, 47856, 47856, 47856, 47856, + 47856, 47856, 47856, 47856, 47856, 47856, 47856, 47856, + 47856, 47856, 47856, 47856, 47856, 47856, 47856, 47856, + 47856, 47856, 47856, 47856, 47856, 47856, 47856, 47856, + 47856, 47856, 47856, 47856, 47856, 47856, 47856, 47856, + 47856, 47856, 47856, 47856, 47856, 47856, 47856, 47856, + 47856, 47856, 47856, 47856, 47856, 47856, 47856, 47856, + 47856, 47856, 47856, 47856, 47856, 47856, 47856, 47856, + 47856, 47856, 47856, 47856, 47856, 47856, 47856, 47856, + 47856, 47856, 47856, 47856, 47856, 47856, 47856, 47856, + 47856, 47856, 47856, 47856, 47856, 47856, 47856, 47856, + 47856, 47856, 47856, 47856, 47856, 47856, 47856, 47856, + 47856, 47856, 47856, 47856, 47856, 47856, 47856, 47856, - 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248, - 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248, - 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248, - 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248, - 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248, - 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248, - 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248, - 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248, - 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248, - 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248, - 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248, - 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248, - 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248, - 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47504, - 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248, - 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248, - 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248, - 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248, - 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248, - 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248, - 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248, - 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248, - 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248, - 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248, - 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248, - 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248, - 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248, - 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248, - 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248, - 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248, - 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248, - 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248, + 47856, 47856, 47856, 47856, 47856, 47856, 47856, 47856, + 47856, 47856, 47856, 47856, 47856, 47856, 47856, 47856, + 47856, 47856, 47856, 47856, 47856, 47856, 47856, 47856, + 47856, 47856, 47856, 47856, 47856, 47856, 47856, 47856, + 47856, 47856, 47856, 47856, 47856, 47856, 47856, 47856, + 47856, 47856, 47856, 47856, 47856, 47856, 47856, 47856, + 47856, 47856, 47856, 47856, 47856, 47856, 47856, 47856, + 47856, 47856, 47856, 47856, 47856, 47856, 47856, 47856, + 47856, 47856, 47856, 47856, 47856, 47856, 47856, 47856, + 47856, 47856, 47856, 47856, 47856, 47856, 47856, 47856, + 47856, 47856, 47856, 47856, 47856, 47856, 47856, 47856, + 47856, 47856, 47856, 47856, 47856, 47856, 47856, 47856, + 47856, 47856, 47856, 47856, 47856, 47856, 47856, 47856, + 47856, 47856, 47856, 47856, 47856, 47856, 47856, 48112, + 47856, 47856, 47856, 47856, 47856, 47856, 47856, 47856, + 47856, 47856, 47856, 47856, 47856, 47856, 47856, 47856, + 47856, 47856, 47856, 47856, 47856, 47856, 47856, 47856, + 47856, 47856, 47856, 47856, 47856, 47856, 47856, 47856, + 47856, 47856, 47856, 47856, 47856, 47856, 47856, 47856, + 47856, 47856, 47856, 47856, 47856, 47856, 47856, 47856, + 47856, 47856, 47856, 47856, 47856, 47856, 47856, 47856, + 47856, 47856, 47856, 47856, 47856, 47856, 47856, 47856, + 47856, 47856, 47856, 47856, 47856, 47856, 47856, 47856, + 47856, 47856, 47856, 47856, 47856, 47856, 47856, 47856, + 47856, 47856, 47856, 47856, 47856, 47856, 47856, 47856, + 47856, 47856, 47856, 47856, 47856, 47856, 47856, 47856, + 47856, 47856, 47856, 47856, 47856, 47856, 47856, 47856, + 47856, 47856, 47856, 47856, 47856, 47856, 47856, 47856, + 47856, 47856, 47856, 47856, 47856, 47856, 47856, 47856, + 47856, 47856, 47856, 47856, 47856, 47856, 47856, 47856, + 47856, 47856, 47856, 47856, 47856, 47856, 47856, 47856, + 47856, 47856, 47856, 47856, 47856, 47856, 47856, 47856, - 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248, - 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248, - 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248, - 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248, - 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248, - 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248, - 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248, - 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248, - 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248, - 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248, - 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248, - 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248, - 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47248, - 47248, 47248, 47248, 47248, 47248, 47248, 47248, 47504, + 47856, 47856, 47856, 47856, 47856, 47856, 47856, 47856, + 47856, 47856, 47856, 47856, 47856, 47856, 47856, 47856, + 47856, 47856, 47856, 47856, 47856, 47856, 47856, 47856, + 47856, 47856, 47856, 47856, 47856, 47856, 47856, 47856, + 47856, 47856, 47856, 47856, 47856, 47856, 47856, 47856, + 47856, 47856, 47856, 47856, 47856, 47856, 47856, 47856, + 47856, 47856, 47856, 47856, 47856, 47856, 47856, 47856, + 47856, 47856, 47856, 47856, 47856, 47856, 47856, 47856, + 47856, 47856, 47856, 47856, 47856, 47856, 47856, 47856, + 47856, 47856, 47856, 47856, 47856, 47856, 47856, 47856, + 47856, 47856, 47856, 47856, 47856, 47856, 47856, 47856, + 47856, 47856, 47856, 47856, 47856, 47856, 47856, 47856, + 47856, 47856, 47856, 47856, 47856, 47856, 47856, 47856, + 47856, 47856, 47856, 47856, 47856, 47856, 47856, 48112, 0, 0, 0, 0, 0, 0, 0, 0, @@ -893,2182 +893,2157 @@ static const unsigned short uc_property_trie[] = { 0, 0, 0, 0, 0, 0, 0, 0, 48, 49, 50, 12, 12, 12, 51, 14, - 52, 51, 53, 54, 36, 55, 51, 52, - 56, 57, 58, 59, 60, 61, 14, 62, - 52, 63, 53, 64, 65, 65, 65, 49, + 52, 53, 54, 55, 36, 56, 53, 52, + 57, 58, 59, 60, 61, 62, 14, 63, + 52, 64, 54, 65, 66, 66, 66, 49, - 66, 66, 66, 66, 66, 66, 38, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 38, 66, 66, 66, 66, 66, 66, 36, - 38, 66, 66, 66, 66, 66, 38, 67, + 67, 67, 67, 67, 67, 67, 38, 67, + 67, 67, 67, 67, 67, 67, 67, 67, + 38, 67, 67, 67, 67, 67, 67, 36, + 38, 67, 67, 67, 67, 67, 38, 68, - 68, 68, 68, 68, 68, 68, 44, 68, - 68, 68, 68, 68, 68, 68, 68, 68, - 44, 68, 68, 68, 68, 68, 68, 36, - 44, 68, 68, 68, 68, 68, 44, 69, + 69, 69, 69, 69, 69, 69, 44, 69, + 69, 69, 69, 69, 69, 69, 69, 69, + 44, 69, 69, 69, 69, 69, 69, 36, + 44, 69, 69, 69, 69, 69, 44, 70, - 70, 71, 70, 71, 70, 71, 70, 71, - 70, 71, 70, 71, 70, 71, 70, 71, - 72, 73, 70, 71, 70, 71, 70, 71, - 70, 71, 70, 71, 70, 71, 70, 71, + 71, 72, 71, 72, 71, 72, 71, 72, + 71, 72, 71, 72, 71, 72, 71, 72, + 73, 74, 71, 72, 71, 72, 71, 72, + 71, 72, 71, 72, 71, 72, 71, 72, - 70, 71, 70, 71, 70, 71, 72, 73, - 70, 71, 70, 71, 70, 71, 70, 71, - 74, 75, 76, 77, 70, 71, 70, 71, - 78, 70, 71, 70, 71, 70, 71, 76, + 71, 72, 71, 72, 71, 72, 73, 74, + 71, 72, 71, 72, 71, 72, 71, 72, + 75, 76, 77, 78, 71, 72, 71, 72, + 79, 71, 72, 71, 72, 71, 72, 77, - 77, 72, 73, 70, 71, 70, 71, 70, - 71, 79, 72, 73, 70, 71, 70, 71, - 70, 71, 72, 73, 70, 71, 70, 71, - 70, 71, 70, 71, 70, 71, 70, 71, + 78, 73, 74, 71, 72, 71, 72, 71, + 72, 80, 73, 74, 71, 72, 71, 72, + 71, 72, 73, 74, 71, 72, 71, 72, + 71, 72, 71, 72, 71, 72, 71, 72, - 70, 71, 70, 71, 70, 71, 72, 73, - 70, 71, 70, 71, 70, 71, 70, 71, - 70, 71, 70, 71, 70, 71, 70, 71, - 80, 70, 71, 70, 71, 70, 71, 81, + 71, 72, 71, 72, 71, 72, 73, 74, + 71, 72, 71, 72, 71, 72, 71, 72, + 71, 72, 71, 72, 71, 72, 71, 72, + 81, 71, 72, 71, 72, 71, 72, 82, - 82, 83, 72, 73, 72, 73, 84, 72, - 73, 85, 85, 72, 73, 78, 86, 87, - 88, 72, 73, 85, 89, 90, 91, 92, - 72, 73, 93, 78, 91, 94, 95, 96, + 83, 84, 73, 74, 73, 74, 85, 73, + 74, 86, 86, 73, 74, 79, 87, 88, + 89, 73, 74, 86, 90, 91, 92, 93, + 73, 74, 94, 79, 92, 95, 96, 97, - 70, 71, 72, 73, 72, 73, 97, 72, - 73, 97, 78, 78, 72, 73, 97, 70, - 71, 98, 98, 72, 73, 72, 73, 99, - 72, 73, 78, 100, 72, 73, 78, 101, + 71, 72, 73, 74, 73, 74, 98, 73, + 74, 98, 79, 79, 73, 74, 98, 71, + 72, 99, 99, 73, 74, 73, 74, 100, + 73, 74, 79, 101, 73, 74, 79, 102, - 100, 100, 100, 100, 102, 103, 104, 102, - 103, 104, 102, 103, 104, 70, 71, 70, - 71, 70, 71, 70, 71, 70, 71, 70, - 71, 70, 71, 70, 71, 105, 70, 71, + 101, 101, 101, 101, 103, 104, 105, 103, + 104, 105, 103, 104, 105, 71, 72, 71, + 72, 71, 72, 71, 72, 71, 72, 71, + 72, 71, 72, 71, 72, 106, 71, 72, - 70, 71, 70, 71, 72, 73, 70, 71, - 70, 71, 70, 71, 70, 71, 70, 71, - 106, 102, 103, 104, 70, 71, 107, 108, - 109, 110, 70, 71, 70, 71, 70, 71, + 71, 72, 71, 72, 73, 74, 71, 72, + 71, 72, 71, 72, 71, 72, 71, 72, + 107, 103, 104, 105, 71, 72, 108, 109, + 110, 111, 71, 72, 71, 72, 71, 72, - 70, 71, 70, 71, 70, 71, 70, 71, - 70, 71, 70, 71, 70, 71, 70, 71, - 70, 71, 70, 71, 70, 71, 70, 71, - 109, 110, 109, 110, 111, 112, 109, 110, + 71, 72, 71, 72, 71, 72, 71, 72, + 71, 72, 71, 72, 71, 72, 71, 72, + 71, 72, 71, 72, 71, 72, 71, 72, + 110, 111, 110, 111, 112, 113, 110, 111, - 113, 114, 111, 112, 111, 112, 109, 110, - 109, 110, 109, 110, 109, 110, 109, 110, - 109, 110, 109, 110, 114, 114, 114, 115, - 115, 115, 116, 117, 118, 119, 120, 121, + 114, 115, 112, 113, 112, 113, 110, 111, + 110, 111, 110, 111, 110, 111, 110, 111, + 110, 111, 110, 111, 115, 115, 115, 116, + 116, 116, 117, 118, 119, 120, 121, 122, - 122, 117, 123, 124, 125, 126, 127, 123, - 127, 123, 127, 123, 127, 123, 127, 123, - 128, 129, 130, 131, 132, 78, 133, 133, - 78, 134, 78, 135, 136, 78, 78, 78, + 123, 118, 124, 125, 126, 127, 128, 124, + 128, 124, 128, 124, 128, 124, 128, 124, + 129, 130, 131, 132, 133, 79, 134, 134, + 79, 135, 79, 136, 137, 79, 79, 79, - 133, 137, 78, 138, 78, 139, 140, 78, - 141, 142, 143, 144, 145, 78, 78, 142, - 78, 146, 147, 78, 78, 148, 78, 78, - 78, 78, 78, 78, 78, 149, 78, 78, + 134, 138, 79, 139, 79, 140, 141, 79, + 142, 143, 144, 145, 146, 79, 79, 143, + 79, 147, 148, 79, 79, 149, 79, 79, + 79, 79, 79, 79, 79, 150, 79, 79, - 150, 78, 151, 150, 78, 78, 78, 152, - 150, 153, 154, 154, 155, 78, 78, 78, - 78, 78, 156, 78, 100, 78, 78, 78, - 78, 78, 78, 78, 78, 157, 158, 78, + 151, 79, 152, 151, 79, 79, 79, 153, + 151, 154, 155, 155, 156, 79, 79, 79, + 79, 79, 157, 79, 101, 79, 79, 79, + 79, 79, 79, 79, 79, 158, 159, 79, - 78, 78, 78, 78, 78, 78, 78, 78, - 78, 159, 159, 159, 159, 159, 114, 114, - 160, 160, 160, 160, 160, 160, 160, 160, - 160, 161, 161, 162, 162, 162, 162, 162, + 79, 79, 79, 79, 79, 79, 79, 79, + 79, 160, 160, 160, 160, 160, 115, 115, + 161, 161, 161, 161, 161, 161, 161, 161, + 161, 162, 162, 163, 163, 163, 163, 163, - 163, 163, 164, 164, 164, 164, 161, 161, - 165, 161, 161, 161, 165, 161, 161, 161, - 162, 162, 164, 164, 164, 164, 164, 164, - 52, 52, 52, 52, 52, 52, 164, 166, + 164, 164, 165, 165, 165, 165, 162, 162, + 166, 162, 162, 162, 166, 162, 162, 162, + 163, 163, 165, 165, 165, 165, 165, 165, + 52, 52, 52, 52, 52, 52, 165, 167, - 160, 160, 160, 160, 160, 164, 164, 164, - 164, 164, 167, 167, 168, 169, 170, 171, - 171, 171, 171, 171, 171, 171, 171, 171, - 171, 171, 171, 171, 171, 171, 171, 171, + 161, 161, 161, 161, 161, 165, 165, 165, + 165, 165, 168, 168, 169, 170, 171, 172, + 172, 172, 172, 172, 172, 172, 172, 172, + 172, 172, 172, 172, 172, 172, 172, 172, - 172, 172, 172, 172, 172, 173, 172, 172, - 172, 172, 172, 172, 172, 173, 173, 172, - 173, 172, 173, 172, 172, 174, 175, 175, - 175, 175, 174, 176, 175, 175, 175, 175, + 173, 173, 173, 173, 173, 174, 173, 173, + 173, 173, 173, 173, 173, 174, 174, 173, + 174, 173, 174, 173, 173, 175, 176, 176, + 176, 176, 175, 177, 176, 176, 176, 176, - 175, 177, 177, 178, 178, 178, 178, 179, - 179, 175, 175, 175, 175, 178, 178, 175, - 178, 178, 175, 175, 180, 180, 180, 180, - 181, 175, 175, 175, 175, 173, 173, 173, + 176, 178, 178, 179, 179, 179, 179, 180, + 180, 176, 176, 176, 176, 179, 179, 176, + 179, 179, 176, 176, 181, 181, 181, 181, + 182, 176, 176, 176, 176, 174, 174, 174, - 182, 182, 172, 182, 182, 183, 184, 185, - 185, 185, 184, 184, 184, 185, 185, 186, - 187, 187, 187, 188, 188, 188, 188, 187, - 189, 190, 190, 191, 192, 193, 193, 194, + 183, 183, 173, 183, 183, 184, 185, 186, + 186, 186, 185, 185, 185, 186, 186, 187, + 188, 188, 188, 189, 189, 189, 189, 188, + 190, 191, 191, 192, 193, 194, 194, 195, - 195, 195, 196, 197, 197, 197, 197, 197, - 197, 197, 197, 197, 197, 197, 197, 197, - 198, 199, 198, 199, 200, 201, 198, 199, - 202, 202, 203, 204, 204, 204, 205, 206, + 196, 196, 197, 198, 198, 198, 198, 198, + 198, 198, 198, 198, 198, 198, 198, 198, + 199, 200, 199, 200, 201, 202, 199, 200, + 203, 203, 204, 205, 205, 205, 206, 207, - 202, 202, 202, 202, 207, 208, 209, 210, - 211, 211, 211, 202, 212, 202, 213, 213, - 214, 215, 215, 215, 215, 215, 215, 215, - 215, 215, 215, 215, 215, 215, 215, 215, + 203, 203, 203, 203, 208, 209, 210, 211, + 212, 212, 212, 203, 213, 203, 214, 214, + 215, 216, 216, 216, 216, 216, 216, 216, + 216, 216, 216, 216, 216, 216, 216, 216, - 215, 215, 202, 215, 215, 215, 215, 215, - 215, 215, 216, 216, 217, 218, 218, 218, - 219, 220, 220, 220, 220, 220, 220, 220, - 220, 220, 220, 220, 220, 220, 220, 220, + 216, 216, 203, 216, 216, 216, 216, 216, + 216, 216, 217, 217, 218, 219, 219, 219, + 220, 221, 221, 221, 221, 221, 221, 221, + 221, 221, 221, 221, 221, 221, 221, 221, - 220, 220, 221, 220, 220, 220, 220, 220, - 220, 220, 222, 222, 223, 224, 224, 225, - 226, 227, 228, 229, 229, 230, 231, 232, - 233, 234, 235, 236, 235, 236, 235, 236, + 221, 221, 222, 221, 221, 221, 221, 221, + 221, 221, 223, 223, 224, 225, 225, 226, + 227, 228, 229, 230, 230, 231, 232, 233, + 234, 235, 236, 237, 236, 237, 236, 237, - 235, 236, 237, 238, 237, 238, 237, 238, - 237, 238, 237, 238, 237, 238, 237, 238, - 239, 240, 241, 242, 243, 244, 245, 246, - 247, 248, 246, 247, 249, 250, 250, 250, + 236, 237, 238, 239, 238, 239, 238, 239, + 238, 239, 238, 239, 238, 239, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, + 248, 249, 247, 248, 250, 251, 251, 251, - 251, 252, 253, 252, 253, 253, 253, 252, - 253, 253, 253, 253, 252, 251, 252, 253, - 254, 254, 254, 254, 254, 254, 254, 254, - 254, 255, 254, 254, 254, 254, 254, 254, + 252, 253, 254, 253, 254, 254, 254, 253, + 254, 254, 254, 254, 253, 252, 253, 254, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 256, 255, 255, 255, 255, 255, 255, - 254, 254, 254, 254, 254, 254, 254, 254, - 254, 254, 254, 254, 254, 254, 254, 254, - 256, 256, 256, 256, 256, 256, 256, 256, - 256, 257, 256, 256, 256, 256, 256, 256, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 257, 257, 257, 257, 257, 257, 257, 257, + 257, 258, 257, 257, 257, 257, 257, 257, - 256, 256, 256, 256, 256, 256, 256, 256, - 256, 256, 256, 256, 256, 256, 256, 256, - 258, 259, 260, 259, 260, 260, 260, 259, - 260, 260, 260, 260, 259, 258, 259, 260, + 257, 257, 257, 257, 257, 257, 257, 257, + 257, 257, 257, 257, 257, 257, 257, 257, + 259, 260, 261, 260, 261, 261, 261, 260, + 261, 261, 261, 261, 260, 259, 260, 261, - 261, 262, 261, 262, 261, 262, 261, 262, - 261, 262, 261, 262, 261, 262, 261, 262, - 261, 262, 261, 262, 261, 262, 263, 264, - 261, 262, 261, 262, 261, 262, 261, 262, + 262, 263, 262, 263, 262, 263, 262, 263, + 262, 263, 262, 263, 262, 263, 262, 263, + 262, 263, 262, 263, 262, 263, 264, 265, + 262, 263, 262, 263, 262, 263, 262, 263, - 261, 262, 265, 266, 266, 173, 173, 267, - 268, 268, 269, 270, 271, 272, 271, 272, - 261, 262, 261, 262, 261, 262, 261, 262, - 261, 262, 261, 262, 261, 262, 261, 262, + 262, 263, 266, 267, 267, 174, 174, 268, + 269, 269, 270, 271, 272, 273, 272, 273, + 262, 263, 262, 263, 262, 263, 262, 263, + 262, 263, 262, 263, 262, 263, 262, 263, - 261, 262, 261, 262, 261, 262, 261, 262, - 261, 262, 261, 262, 261, 262, 261, 262, - 261, 262, 261, 262, 261, 262, 261, 262, - 261, 262, 261, 262, 261, 262, 261, 262, + 262, 263, 262, 263, 262, 263, 262, 263, + 262, 263, 262, 263, 262, 263, 262, 263, + 262, 263, 262, 263, 262, 263, 262, 263, + 262, 263, 262, 263, 262, 263, 262, 263, - 273, 263, 264, 261, 262, 269, 270, 261, - 262, 269, 270, 261, 262, 269, 270, 274, - 263, 264, 263, 264, 261, 262, 263, 264, - 261, 262, 263, 264, 263, 264, 263, 264, + 274, 264, 265, 262, 263, 270, 271, 262, + 263, 270, 271, 262, 263, 270, 271, 275, + 264, 265, 264, 265, 262, 263, 264, 265, + 262, 263, 264, 265, 264, 265, 264, 265, - 261, 262, 263, 264, 263, 264, 263, 264, - 261, 262, 263, 264, 275, 276, 263, 264, - 263, 264, 263, 264, 263, 264, 277, 278, - 263, 264, 279, 280, 279, 280, 279, 280, + 262, 263, 264, 265, 264, 265, 264, 265, + 262, 263, 264, 265, 276, 277, 264, 265, + 264, 265, 264, 265, 264, 265, 278, 279, + 264, 265, 280, 281, 280, 281, 280, 281, - 269, 270, 269, 270, 269, 270, 269, 270, - 269, 270, 269, 270, 269, 270, 269, 270, - 279, 280, 279, 280, 281, 282, 281, 282, - 281, 282, 281, 282, 281, 282, 281, 282, + 270, 271, 270, 271, 270, 271, 270, 271, + 270, 271, 270, 271, 270, 271, 270, 271, + 280, 281, 280, 281, 282, 283, 282, 283, + 282, 283, 282, 283, 282, 283, 282, 283, - 281, 282, 281, 282, 283, 284, 285, 286, - 287, 288, 287, 288, 287, 288, 287, 288, - 202, 289, 289, 289, 289, 289, 289, 289, - 289, 289, 289, 289, 289, 289, 289, 289, + 282, 283, 282, 283, 284, 285, 286, 287, + 288, 289, 288, 289, 288, 289, 288, 289, + 203, 290, 290, 290, 290, 290, 290, 290, + 290, 290, 290, 290, 290, 290, 290, 290, - 289, 289, 289, 289, 289, 289, 289, 289, - 289, 289, 289, 289, 289, 289, 289, 289, - 289, 289, 289, 289, 289, 289, 289, 202, - 202, 290, 291, 291, 291, 292, 291, 293, + 290, 290, 290, 290, 290, 290, 290, 290, + 290, 290, 290, 290, 290, 290, 290, 290, + 290, 290, 290, 290, 290, 290, 290, 203, + 203, 291, 292, 292, 292, 293, 292, 294, - 294, 295, 295, 295, 295, 295, 295, 295, - 295, 295, 295, 295, 295, 295, 295, 295, - 295, 295, 295, 295, 295, 295, 295, 295, - 295, 295, 295, 295, 295, 295, 295, 295, + 295, 296, 296, 296, 296, 296, 296, 296, + 296, 296, 296, 296, 296, 296, 296, 296, + 296, 296, 296, 296, 296, 296, 296, 296, + 296, 296, 296, 296, 296, 296, 296, 296, - 295, 295, 295, 295, 295, 295, 295, 296, - 294, 297, 298, 202, 202, 299, 299, 300, - 301, 302, 303, 303, 303, 303, 302, 303, - 303, 303, 304, 302, 303, 303, 303, 303, + 296, 296, 296, 296, 296, 296, 296, 297, + 295, 298, 299, 203, 203, 300, 300, 301, + 302, 303, 304, 304, 304, 304, 303, 304, + 304, 304, 305, 303, 304, 304, 304, 304, - 303, 303, 305, 302, 302, 302, 302, 302, - 303, 303, 302, 303, 303, 304, 306, 303, - 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, 317, 318, 319, 320, 321, 322, + 304, 304, 306, 303, 303, 303, 303, 303, + 304, 304, 303, 304, 304, 305, 307, 304, + 308, 309, 310, 311, 312, 313, 314, 315, + 316, 317, 318, 319, 320, 321, 322, 323, - 323, 324, 325, 323, 303, 305, 326, 327, - 301, 301, 301, 301, 301, 301, 301, 301, - 328, 328, 328, 328, 328, 328, 328, 328, - 328, 328, 328, 328, 328, 328, 328, 328, + 324, 325, 326, 324, 304, 306, 327, 328, + 302, 302, 302, 302, 302, 302, 302, 302, + 329, 329, 329, 329, 329, 329, 329, 329, + 329, 329, 329, 329, 329, 329, 329, 329, - 328, 328, 328, 328, 328, 328, 328, 328, - 328, 328, 328, 301, 301, 301, 301, 329, - 328, 328, 328, 330, 331, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, + 329, 329, 329, 329, 329, 329, 329, 329, + 329, 329, 329, 302, 302, 302, 302, 330, + 329, 329, 329, 331, 332, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, - 332, 332, 332, 332, 333, 334, 335, 335, - 336, 337, 337, 338, 19, 339, 340, 340, - 341, 341, 341, 341, 341, 341, 342, 342, - 343, 344, 345, 346, 347, 348, 349, 350, + 333, 333, 333, 333, 334, 335, 336, 336, + 337, 338, 338, 339, 19, 340, 341, 341, + 342, 342, 342, 342, 342, 342, 343, 343, + 344, 345, 346, 347, 348, 349, 350, 351, - 351, 352, 353, 353, 353, 353, 354, 355, - 356, 355, 356, 356, 356, 356, 356, 355, - 355, 355, 355, 356, 356, 356, 356, 356, + 352, 353, 354, 354, 354, 354, 355, 356, + 357, 356, 357, 357, 357, 357, 357, 356, 356, 356, 356, 357, 357, 357, 357, 357, + 357, 357, 357, 358, 358, 358, 358, 358, - 358, 356, 356, 356, 356, 356, 356, 356, - 355, 356, 356, 359, 360, 361, 362, 363, - 364, 365, 366, 367, 367, 368, 369, 341, - 341, 370, 370, 370, 371, 370, 370, 372, + 359, 357, 357, 357, 357, 357, 357, 357, + 356, 357, 357, 360, 361, 362, 363, 364, + 365, 366, 367, 368, 368, 369, 370, 342, + 342, 371, 371, 371, 372, 371, 371, 373, - 373, 374, 375, 376, 377, 378, 379, 380, - 381, 382, 383, 384, 385, 386, 387, 387, - 388, 355, 355, 355, 352, 389, 389, 389, - 390, 356, 356, 356, 356, 356, 356, 356, - - 356, 356, 356, 356, 356, 356, 356, 356, - 355, 355, 355, 355, 355, 355, 355, 355, - 355, 355, 355, 355, 355, 355, 355, 355, - 355, 355, 356, 356, 356, 356, 356, 356, + 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, 384, 385, 386, 387, 388, 388, + 389, 356, 356, 356, 353, 390, 390, 390, + 391, 357, 357, 357, 357, 357, 357, 357, + 357, 357, 357, 357, 357, 357, 357, 357, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, - 356, 356, 356, 356, 356, 356, 356, 356, - 391, 391, 356, 356, 356, 356, 356, 391, + 356, 356, 357, 357, 357, 357, 357, 357, - 353, 356, 354, 355, 355, 355, 355, 355, - 355, 355, 355, 355, 356, 355, 356, 392, - 356, 356, 355, 353, 393, 355, 394, 394, - 394, 394, 394, 394, 394, 395, 396, 394, + 357, 357, 357, 357, 357, 357, 357, 357, + 357, 357, 357, 357, 357, 357, 357, 357, + 357, 357, 357, 357, 357, 357, 357, 357, + 392, 392, 357, 357, 357, 357, 357, 392, - 394, 394, 394, 397, 394, 398, 398, 394, - 394, 396, 397, 394, 394, 397, 399, 399, - 400, 401, 402, 403, 404, 405, 406, 407, - 408, 409, 391, 391, 391, 410, 410, 411, + 354, 357, 355, 356, 356, 356, 356, 356, + 356, 356, 356, 356, 357, 356, 357, 393, + 357, 357, 356, 354, 394, 356, 395, 395, + 395, 395, 395, 395, 395, 396, 397, 395, - 412, 412, 412, 413, 413, 413, 413, 413, - 413, 413, 413, 413, 413, 413, 348, 414, - 415, 416, 417, 417, 417, 415, 415, 415, - 415, 415, 417, 417, 417, 417, 415, 417, + 395, 395, 395, 398, 395, 399, 399, 395, + 395, 397, 398, 395, 395, 398, 400, 400, + 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 392, 392, 392, 411, 411, 412, - 417, 417, 417, 417, 417, 417, 417, 417, - 415, 417, 415, 417, 415, 418, 418, 419, - 420, 421, 420, 420, 421, 420, 420, 421, - 421, 421, 420, 421, 421, 420, 421, 420, + 413, 413, 413, 414, 414, 414, 414, 414, + 414, 414, 414, 414, 414, 414, 349, 415, + 416, 417, 418, 418, 418, 416, 416, 416, + 416, 416, 418, 418, 418, 418, 416, 418, - 420, 420, 421, 420, 421, 420, 421, 420, - 421, 420, 420, 348, 348, 419, 418, 418, - 422, 422, 422, 422, 422, 422, 422, 422, - 422, 423, 423, 423, 422, 422, 422, 422, + 418, 418, 418, 418, 418, 418, 418, 418, + 416, 418, 416, 418, 416, 419, 419, 420, + 421, 422, 421, 421, 422, 421, 421, 422, + 422, 422, 421, 422, 422, 421, 422, 421, - 422, 422, 422, 422, 422, 422, 422, 422, - 422, 422, 422, 423, 423, 422, 357, 357, - 357, 424, 357, 424, 424, 357, 357, 357, - 424, 424, 357, 357, 357, 357, 357, 357, + 421, 421, 422, 421, 422, 421, 422, 421, + 422, 421, 421, 349, 349, 420, 419, 419, + 423, 423, 423, 423, 423, 423, 423, 423, + 423, 424, 424, 424, 423, 423, 423, 423, - 425, 425, 425, 425, 425, 425, 425, 425, - 425, 425, 425, 425, 425, 425, 425, 425, - 425, 425, 425, 425, 425, 425, 425, 425, - 425, 425, 425, 425, 425, 425, 425, 425, + 423, 423, 423, 423, 423, 423, 423, 423, + 423, 423, 423, 424, 424, 423, 358, 358, + 358, 425, 358, 425, 425, 358, 358, 358, + 425, 425, 358, 358, 358, 358, 358, 358, - 425, 425, 425, 425, 425, 425, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, - 426, 427, 348, 348, 348, 348, 348, 348, - 348, 348, 348, 348, 348, 348, 348, 348, - - 428, 429, 430, 431, 432, 433, 434, 435, - 436, 437, 438, 438, 438, 438, 438, 438, - 438, 438, 438, 438, 438, 438, 438, 438, - 438, 438, 438, 438, 438, 438, 438, 438, - - 438, 438, 438, 438, 438, 438, 438, 438, - 438, 438, 438, 439, 439, 439, 439, 439, - 439, 439, 440, 439, 441, 441, 442, 443, - 444, 445, 446, 301, 301, 447, 448, 448, - - 449, 449, 449, 449, 449, 449, 449, 449, - 449, 449, 449, 449, 449, 449, 449, 449, - 449, 449, 449, 449, 449, 449, 450, 450, - 450, 450, 451, 450, 450, 450, 450, 450, - - 450, 450, 450, 450, 451, 450, 450, 450, - 451, 450, 450, 450, 450, 450, 301, 301, - 452, 452, 452, 452, 452, 452, 452, 453, - 452, 453, 452, 452, 452, 453, 453, 301, - - 454, 455, 455, 455, 455, 455, 454, 454, - 455, 454, 455, 455, 455, 455, 455, 455, - 455, 455, 455, 455, 454, 455, 454, 454, - 454, 456, 456, 456, 301, 301, 457, 301, - - 458, 459, 458, 458, 458, 458, 459, 460, - 458, 460, 460, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, - - 301, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, - - 461, 462, 461, 461, 461, 461, 461, 461, - 461, 461, 463, 463, 463, 464, 465, 462, - 462, 465, 465, 466, 466, 348, 467, 467, - 467, 468, 467, 467, 467, 467, 469, 469, - - 469, 469, 469, 469, 469, 469, 469, 469, - 348, 348, 348, 348, 348, 348, 348, 348, - 348, 348, 348, 470, 471, 471, 471, 471, - 471, 471, 471, 471, 471, 471, 471, 471, - - 471, 471, 472, 473, 474, 474, 475, 474, - 474, 475, 474, 474, 474, 475, 475, 475, - 476, 477, 478, 474, 474, 474, 475, 474, - 474, 475, 475, 474, 474, 474, 474, 479, - - 480, 481, 481, 482, 483, 484, 484, 484, - 484, 484, 484, 484, 484, 484, 484, 484, - 484, 484, 484, 484, 484, 484, 484, 484, - 484, 484, 484, 484, 484, 484, 484, 484, - - 484, 484, 484, 484, 484, 484, 484, 484, - 484, 485, 484, 484, 484, 484, 484, 484, - 484, 485, 484, 484, 485, 484, 484, 484, - 484, 484, 486, 487, 488, 484, 482, 482, - - 482, 481, 481, 481, 481, 481, 481, 481, - 481, 482, 482, 482, 482, 489, 490, 487, - 484, 173, 175, 173, 173, 480, 486, 486, - 491, 491, 491, 491, 491, 491, 491, 491, - - 484, 484, 481, 481, 492, 492, 493, 494, - 495, 496, 497, 498, 499, 500, 501, 502, - 503, 504, 505, 506, 506, 506, 506, 506, - 507, 508, 508, 509, 509, 510, 509, 509, - - 511, 512, 513, 513, 202, 514, 514, 514, - 514, 514, 514, 514, 514, 202, 202, 514, - 514, 202, 202, 514, 514, 514, 514, 514, - 514, 514, 514, 514, 514, 514, 514, 514, - - 514, 514, 514, 514, 514, 514, 514, 514, - 514, 202, 514, 514, 514, 514, 514, 514, - 514, 202, 514, 202, 202, 202, 514, 514, - 514, 514, 202, 202, 515, 516, 517, 513, - - 513, 512, 512, 512, 512, 202, 202, 513, - 513, 202, 202, 518, 518, 519, 520, 202, - 202, 202, 202, 202, 202, 202, 202, 517, - 202, 202, 202, 202, 521, 521, 202, 521, - - 514, 514, 512, 512, 202, 202, 522, 523, - 524, 525, 526, 527, 528, 529, 530, 531, - 514, 514, 532, 532, 533, 533, 533, 533, - 533, 534, 535, 536, 537, 538, 539, 202, - - 202, 540, 541, 542, 202, 543, 543, 543, - 543, 543, 543, 202, 202, 202, 202, 543, - 543, 202, 202, 543, 543, 543, 543, 543, - 543, 543, 543, 543, 543, 543, 543, 543, - - 543, 543, 543, 543, 543, 543, 543, 543, - 543, 202, 543, 543, 543, 543, 543, 543, - 543, 202, 543, 544, 202, 543, 544, 202, - 543, 543, 202, 202, 545, 202, 546, 546, - - 546, 541, 541, 202, 202, 202, 202, 541, - 541, 202, 202, 541, 541, 547, 202, 202, - 202, 548, 202, 202, 202, 202, 202, 202, - 202, 544, 544, 544, 543, 202, 544, 202, - - 202, 202, 202, 202, 202, 202, 549, 550, - 551, 552, 553, 554, 555, 556, 557, 558, - 541, 541, 543, 543, 543, 548, 559, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - - 202, 560, 560, 561, 202, 562, 562, 562, - 562, 562, 562, 562, 563, 562, 202, 562, - 562, 562, 202, 562, 562, 562, 562, 562, - 562, 562, 562, 562, 562, 562, 562, 562, - - 562, 562, 562, 562, 562, 562, 562, 562, - 562, 202, 562, 562, 562, 562, 562, 562, - 562, 202, 562, 562, 202, 562, 562, 562, - 562, 562, 202, 202, 564, 562, 561, 561, - - 561, 560, 560, 560, 560, 560, 202, 560, - 560, 561, 202, 561, 561, 565, 202, 202, - 562, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - - 562, 563, 566, 566, 202, 202, 567, 568, - 569, 570, 571, 572, 573, 574, 575, 576, - 577, 578, 202, 202, 202, 202, 202, 202, - 202, 579, 580, 580, 580, 580, 580, 580, - - 202, 581, 582, 582, 202, 583, 583, 583, - 583, 583, 583, 583, 583, 202, 202, 583, - 583, 202, 202, 583, 583, 583, 583, 583, - 583, 583, 583, 583, 583, 583, 583, 583, - - 583, 583, 583, 583, 583, 583, 583, 583, - 583, 202, 583, 583, 583, 583, 583, 583, - 583, 202, 583, 583, 202, 584, 583, 583, - 583, 583, 202, 202, 585, 583, 586, 581, - - 582, 581, 581, 581, 587, 202, 202, 582, - 588, 202, 202, 588, 588, 589, 202, 202, - 202, 202, 202, 202, 202, 590, 591, 586, - 202, 202, 202, 202, 592, 592, 202, 583, - - 583, 583, 587, 587, 202, 202, 593, 594, - 595, 596, 597, 598, 599, 600, 601, 602, - 603, 584, 604, 604, 604, 604, 604, 604, - 202, 202, 202, 202, 202, 202, 202, 202, - - 202, 202, 605, 606, 202, 606, 606, 606, - 606, 606, 606, 202, 202, 202, 606, 606, - 606, 202, 606, 606, 607, 606, 202, 202, - 202, 606, 606, 202, 606, 202, 606, 606, - - 202, 202, 202, 606, 606, 202, 202, 202, - 606, 606, 606, 202, 202, 202, 606, 606, - 606, 606, 606, 606, 606, 606, 608, 606, - 606, 606, 202, 202, 202, 202, 609, 610, - - 605, 610, 610, 202, 202, 202, 610, 610, - 610, 202, 611, 611, 611, 612, 202, 202, - 613, 202, 202, 202, 202, 202, 202, 609, - 202, 202, 202, 202, 202, 202, 202, 202, - - 202, 202, 202, 202, 202, 202, 614, 615, - 616, 617, 618, 619, 620, 621, 622, 623, - 624, 624, 624, 625, 625, 625, 625, 625, - 625, 626, 625, 202, 202, 202, 202, 202, - - 627, 628, 628, 628, 629, 630, 630, 630, - 630, 630, 630, 630, 630, 202, 630, 630, - 630, 202, 630, 630, 630, 630, 630, 630, - 630, 630, 630, 630, 630, 630, 630, 630, - - 630, 630, 630, 630, 630, 630, 630, 630, - 630, 202, 630, 630, 630, 630, 630, 630, - 630, 630, 630, 630, 631, 630, 630, 630, - 630, 630, 202, 202, 202, 632, 633, 633, - - 633, 628, 628, 628, 628, 202, 633, 633, - 634, 202, 633, 633, 633, 635, 202, 202, - 202, 202, 202, 202, 202, 636, 637, 202, - 632, 632, 638, 202, 202, 202, 202, 202, - - 630, 630, 639, 639, 202, 202, 640, 641, - 642, 643, 644, 645, 646, 647, 648, 649, - 202, 202, 202, 202, 202, 202, 202, 650, - 651, 651, 651, 651, 651, 651, 651, 652, - - 653, 654, 655, 655, 656, 657, 657, 657, - 657, 657, 657, 657, 657, 202, 657, 657, - 657, 202, 657, 657, 657, 657, 657, 657, - 657, 657, 657, 657, 657, 657, 657, 657, - - 657, 657, 657, 657, 657, 657, 657, 657, - 657, 202, 657, 657, 657, 657, 657, 657, - 657, 657, 657, 657, 202, 657, 657, 657, - 657, 657, 202, 202, 658, 659, 655, 660, - - 661, 655, 662, 655, 655, 202, 660, 661, - 661, 202, 661, 661, 663, 664, 202, 202, - 202, 202, 202, 202, 202, 662, 662, 202, - 202, 202, 202, 202, 202, 202, 657, 202, - - 657, 657, 665, 665, 202, 202, 666, 667, - 668, 669, 670, 671, 672, 673, 674, 675, - 202, 676, 676, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - - 677, 678, 679, 679, 680, 681, 681, 681, - 681, 681, 681, 681, 681, 202, 681, 681, - 681, 202, 681, 681, 681, 681, 681, 681, - 681, 681, 681, 681, 681, 681, 681, 681, - - 681, 681, 681, 681, 681, 681, 681, 681, - 681, 682, 681, 681, 681, 681, 681, 681, - 681, 681, 681, 681, 681, 681, 681, 681, - 681, 681, 682, 683, 683, 684, 685, 679, - - 679, 686, 686, 686, 687, 202, 679, 679, - 679, 202, 688, 688, 688, 689, 690, 691, - 202, 202, 202, 202, 692, 692, 692, 685, - 693, 693, 693, 693, 693, 693, 693, 694, - - 681, 681, 687, 687, 202, 202, 695, 696, - 697, 698, 699, 700, 701, 702, 703, 704, - 705, 705, 705, 705, 705, 705, 693, 693, - 693, 706, 684, 684, 684, 684, 684, 684, - - 202, 707, 708, 708, 202, 709, 709, 709, - 709, 709, 709, 709, 709, 709, 709, 709, - 709, 709, 709, 709, 709, 709, 709, 202, - 202, 202, 709, 709, 709, 709, 709, 709, - - 709, 709, 709, 709, 709, 709, 709, 709, - 709, 709, 709, 709, 709, 709, 709, 709, - 709, 709, 202, 709, 709, 709, 709, 709, - 709, 709, 709, 709, 202, 709, 202, 202, - - 709, 709, 709, 709, 709, 709, 709, 202, - 202, 202, 710, 202, 202, 202, 202, 711, - 708, 708, 712, 712, 712, 202, 712, 202, - 708, 708, 713, 708, 713, 713, 713, 711, - - 202, 202, 202, 202, 202, 202, 714, 715, - 716, 717, 718, 719, 720, 721, 722, 723, - 202, 202, 708, 708, 724, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - - 202, 725, 725, 725, 725, 725, 725, 725, - 725, 725, 725, 725, 725, 725, 725, 725, - 725, 725, 725, 725, 725, 725, 725, 725, - 725, 725, 725, 725, 725, 725, 725, 725, - - 725, 725, 725, 725, 725, 725, 725, 725, - 725, 725, 725, 725, 725, 725, 725, 725, - 725, 726, 725, 727, 726, 726, 726, 726, - 728, 728, 729, 202, 202, 202, 202, 12, - - 725, 725, 725, 725, 725, 725, 730, 726, - 731, 731, 731, 731, 726, 726, 726, 732, - 733, 734, 735, 736, 737, 738, 739, 740, - 741, 742, 743, 743, 202, 202, 202, 202, - - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - - 202, 744, 744, 202, 744, 202, 745, 744, - 744, 745, 744, 202, 745, 744, 745, 745, - 745, 745, 745, 745, 744, 744, 744, 744, - 745, 744, 744, 744, 744, 744, 744, 744, - - 745, 744, 744, 744, 202, 744, 202, 744, - 745, 745, 744, 744, 745, 744, 744, 744, - 744, 746, 744, 747, 746, 746, 746, 746, - 748, 748, 749, 746, 746, 744, 202, 202, - - 744, 744, 744, 744, 744, 202, 750, 202, - 751, 751, 751, 751, 746, 746, 202, 202, - 752, 753, 754, 755, 756, 757, 758, 759, - 760, 761, 202, 202, 762, 762, 763, 763, - - 764, 765, 765, 765, 766, 767, 766, 766, - 768, 766, 766, 769, 770, 771, 771, 771, - 771, 771, 768, 772, 771, 772, 772, 772, - 773, 773, 772, 772, 772, 772, 772, 772, - - 774, 775, 776, 777, 778, 779, 780, 781, - 782, 783, 784, 784, 784, 784, 784, 784, - 784, 784, 784, 784, 785, 773, 772, 773, - 772, 786, 787, 788, 787, 788, 789, 789, - - 764, 764, 764, 790, 764, 764, 764, 764, - 202, 764, 764, 764, 764, 790, 764, 764, - 764, 764, 790, 764, 764, 764, 764, 790, - 764, 764, 764, 764, 790, 764, 764, 764, - - 764, 764, 764, 764, 764, 764, 764, 764, - 764, 790, 791, 792, 792, 202, 202, 202, - 202, 793, 794, 795, 796, 795, 795, 797, - 795, 797, 794, 794, 794, 794, 798, 799, - - 794, 795, 800, 800, 801, 769, 800, 800, - 764, 764, 764, 764, 802, 803, 803, 803, - 798, 798, 798, 795, 798, 798, 804, 798, - 202, 798, 798, 798, 798, 795, 798, 798, - - 798, 798, 795, 798, 798, 798, 798, 795, - 798, 798, 798, 798, 795, 798, 804, 804, - 804, 798, 798, 798, 798, 798, 798, 798, - 804, 795, 804, 804, 804, 202, 805, 805, - - 806, 806, 806, 806, 806, 806, 807, 806, - 806, 806, 806, 806, 806, 202, 808, 806, - 809, 809, 810, 811, 812, 813, 813, 813, - 813, 814, 814, 202, 202, 202, 202, 202, - - 815, 815, 815, 815, 815, 815, 815, 815, - 815, 815, 815, 815, 815, 815, 815, 815, - 815, 815, 815, 815, 815, 815, 815, 815, - 815, 815, 815, 815, 815, 815, 815, 815, - - 815, 815, 816, 815, 815, 815, 817, 815, - 816, 815, 815, 818, 819, 820, 821, 820, - 820, 822, 820, 823, 823, 823, 820, 824, - 819, 825, 826, 827, 827, 823, 823, 816, - - 828, 829, 830, 831, 832, 833, 834, 835, - 836, 837, 838, 838, 839, 839, 839, 839, - 815, 815, 815, 815, 815, 815, 822, 822, - 820, 820, 816, 816, 816, 816, 823, 823, - - 823, 816, 818, 818, 818, 816, 816, 818, - 818, 818, 818, 818, 818, 818, 816, 816, - 816, 823, 823, 823, 823, 816, 816, 816, + 426, 426, 426, 426, 426, 426, 426, 426, + 426, 426, 426, 426, 426, 426, 426, 426, + 426, 426, 426, 426, 426, 426, 426, 426, + + 426, 426, 426, 426, 426, 426, 427, 427, + 427, 427, 427, 427, 427, 427, 427, 427, + 427, 428, 349, 349, 349, 349, 349, 349, + 349, 349, 349, 349, 349, 349, 349, 349, + + 429, 430, 431, 432, 433, 434, 435, 436, + 437, 438, 439, 439, 439, 439, 439, 439, + 439, 439, 439, 439, 439, 439, 439, 439, + 439, 439, 439, 439, 439, 439, 439, 439, + + 439, 439, 439, 439, 439, 439, 439, 439, + 439, 439, 439, 440, 440, 440, 440, 440, + 440, 440, 441, 440, 442, 442, 443, 444, + 445, 446, 447, 302, 302, 448, 449, 449, + + 450, 450, 450, 450, 450, 450, 450, 450, + 450, 450, 450, 450, 450, 450, 450, 450, + 450, 450, 450, 450, 450, 450, 451, 451, + 451, 451, 452, 451, 451, 451, 451, 451, + + 451, 451, 451, 451, 452, 451, 451, 451, + 452, 451, 451, 451, 451, 451, 302, 302, + 453, 453, 453, 453, 453, 453, 453, 454, + 453, 454, 453, 453, 453, 454, 454, 302, + + 455, 456, 456, 456, 456, 456, 455, 455, + 456, 455, 456, 456, 456, 456, 456, 456, + 456, 456, 456, 456, 455, 456, 455, 455, + 455, 457, 457, 457, 302, 302, 458, 302, + + 459, 460, 459, 459, 459, 459, 460, 461, + 459, 461, 461, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + + 462, 463, 462, 462, 462, 462, 462, 462, + 462, 462, 464, 464, 464, 465, 466, 463, + 463, 466, 466, 467, 467, 349, 468, 468, + 468, 469, 468, 468, 468, 468, 470, 470, + + 470, 470, 470, 470, 470, 470, 470, 470, + 349, 349, 349, 349, 349, 349, 349, 349, + 349, 349, 349, 471, 472, 472, 472, 472, + 472, 472, 472, 472, 472, 472, 472, 472, + + 472, 472, 473, 474, 475, 475, 476, 475, + 475, 476, 475, 475, 475, 476, 476, 476, + 477, 478, 479, 475, 475, 475, 476, 475, + 475, 476, 476, 475, 475, 475, 475, 480, + + 481, 482, 482, 483, 484, 485, 485, 485, + 485, 485, 485, 485, 485, 485, 485, 485, + 485, 485, 485, 485, 485, 485, 485, 485, + 485, 485, 485, 485, 485, 485, 485, 485, + + 485, 485, 485, 485, 485, 485, 485, 485, + 485, 486, 485, 485, 485, 485, 485, 485, + 485, 486, 485, 485, 486, 485, 485, 485, + 485, 485, 487, 488, 489, 485, 483, 483, + + 483, 482, 482, 482, 482, 482, 482, 482, + 482, 483, 483, 483, 483, 490, 491, 488, + 485, 174, 176, 174, 174, 481, 487, 487, + 492, 492, 492, 492, 492, 492, 492, 492, + + 485, 485, 482, 482, 493, 493, 494, 495, + 496, 497, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 507, 507, 507, 507, + 508, 509, 509, 510, 510, 511, 510, 510, + + 512, 513, 514, 514, 203, 515, 515, 515, + 515, 515, 515, 515, 515, 203, 203, 515, + 515, 203, 203, 515, 515, 515, 515, 515, + 515, 515, 515, 515, 515, 515, 515, 515, + + 515, 515, 515, 515, 515, 515, 515, 515, + 515, 203, 515, 515, 515, 515, 515, 515, + 515, 203, 515, 203, 203, 203, 515, 515, + 515, 515, 203, 203, 516, 517, 518, 514, + + 514, 513, 513, 513, 513, 203, 203, 514, + 514, 203, 203, 519, 519, 520, 521, 203, + 203, 203, 203, 203, 203, 203, 203, 518, + 203, 203, 203, 203, 522, 522, 203, 522, + + 515, 515, 513, 513, 203, 203, 523, 524, + 525, 526, 527, 528, 529, 530, 531, 532, + 515, 515, 533, 533, 534, 534, 534, 534, + 534, 535, 536, 537, 538, 539, 540, 203, + + 203, 541, 542, 543, 203, 544, 544, 544, + 544, 544, 544, 203, 203, 203, 203, 544, + 544, 203, 203, 544, 544, 544, 544, 544, + 544, 544, 544, 544, 544, 544, 544, 544, + + 544, 544, 544, 544, 544, 544, 544, 544, + 544, 203, 544, 544, 544, 544, 544, 544, + 544, 203, 544, 545, 203, 544, 545, 203, + 544, 544, 203, 203, 546, 203, 547, 547, + + 547, 542, 542, 203, 203, 203, 203, 542, + 542, 203, 203, 542, 542, 548, 203, 203, + 203, 549, 203, 203, 203, 203, 203, 203, + 203, 545, 545, 545, 544, 203, 545, 203, + + 203, 203, 203, 203, 203, 203, 550, 551, + 552, 553, 554, 555, 556, 557, 558, 559, + 542, 542, 544, 544, 544, 549, 560, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + + 203, 561, 561, 562, 203, 563, 563, 563, + 563, 563, 563, 563, 564, 563, 203, 563, + 563, 563, 203, 563, 563, 563, 563, 563, + 563, 563, 563, 563, 563, 563, 563, 563, + + 563, 563, 563, 563, 563, 563, 563, 563, + 563, 203, 563, 563, 563, 563, 563, 563, + 563, 203, 563, 563, 203, 563, 563, 563, + 563, 563, 203, 203, 565, 563, 562, 562, + + 562, 561, 561, 561, 561, 561, 203, 561, + 561, 562, 203, 562, 562, 566, 203, 203, + 563, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + + 563, 564, 567, 567, 203, 203, 568, 569, + 570, 571, 572, 573, 574, 575, 576, 577, + 578, 579, 203, 203, 203, 203, 203, 203, + 203, 580, 581, 581, 581, 581, 581, 581, + + 203, 582, 583, 583, 203, 584, 584, 584, + 584, 584, 584, 584, 584, 203, 203, 584, + 584, 203, 203, 584, 584, 584, 584, 584, + 584, 584, 584, 584, 584, 584, 584, 584, + + 584, 584, 584, 584, 584, 584, 584, 584, + 584, 203, 584, 584, 584, 584, 584, 584, + 584, 203, 584, 584, 203, 585, 584, 584, + 584, 584, 203, 203, 586, 584, 587, 582, + + 583, 582, 582, 582, 588, 203, 203, 583, + 589, 203, 203, 589, 589, 590, 203, 203, + 203, 203, 203, 203, 203, 591, 592, 587, + 203, 203, 203, 203, 593, 593, 203, 584, + + 584, 584, 588, 588, 203, 203, 594, 595, + 596, 597, 598, 599, 600, 601, 602, 603, + 604, 585, 605, 605, 605, 605, 605, 605, + 203, 203, 203, 203, 203, 203, 203, 203, + + 203, 203, 606, 607, 203, 607, 607, 607, + 607, 607, 607, 203, 203, 203, 607, 607, + 607, 203, 607, 607, 608, 607, 203, 203, + 203, 607, 607, 203, 607, 203, 607, 607, + + 203, 203, 203, 607, 607, 203, 203, 203, + 607, 607, 607, 203, 203, 203, 607, 607, + 607, 607, 607, 607, 607, 607, 609, 607, + 607, 607, 203, 203, 203, 203, 610, 611, + + 606, 611, 611, 203, 203, 203, 611, 611, + 611, 203, 612, 612, 612, 613, 203, 203, + 614, 203, 203, 203, 203, 203, 203, 610, + 203, 203, 203, 203, 203, 203, 203, 203, + + 203, 203, 203, 203, 203, 203, 615, 616, + 617, 618, 619, 620, 621, 622, 623, 624, + 625, 625, 625, 626, 626, 626, 626, 626, + 626, 627, 626, 203, 203, 203, 203, 203, + + 628, 629, 629, 629, 630, 631, 631, 631, + 631, 631, 631, 631, 631, 203, 631, 631, + 631, 203, 631, 631, 631, 631, 631, 631, + 631, 631, 631, 631, 631, 631, 631, 631, + + 631, 631, 631, 631, 631, 631, 631, 631, + 631, 203, 631, 631, 631, 631, 631, 631, + 631, 631, 631, 631, 632, 631, 631, 631, + 631, 631, 203, 203, 203, 633, 634, 634, + + 634, 629, 629, 629, 629, 203, 634, 634, + 635, 203, 634, 634, 634, 636, 203, 203, + 203, 203, 203, 203, 203, 637, 638, 203, + 633, 633, 639, 203, 203, 203, 203, 203, + + 631, 631, 640, 640, 203, 203, 641, 642, + 643, 644, 645, 646, 647, 648, 649, 650, + 203, 203, 203, 203, 203, 203, 203, 651, + 652, 652, 652, 652, 652, 652, 652, 653, + + 654, 655, 656, 656, 657, 658, 658, 658, + 658, 658, 658, 658, 658, 203, 658, 658, + 658, 203, 658, 658, 658, 658, 658, 658, + 658, 658, 658, 658, 658, 658, 658, 658, + + 658, 658, 658, 658, 658, 658, 658, 658, + 658, 203, 658, 658, 658, 658, 658, 658, + 658, 658, 658, 658, 203, 658, 658, 658, + 658, 658, 203, 203, 659, 660, 656, 661, + + 662, 656, 663, 656, 656, 203, 661, 662, + 662, 203, 662, 662, 664, 665, 203, 203, + 203, 203, 203, 203, 203, 663, 663, 203, + 203, 203, 203, 203, 203, 203, 658, 203, + + 658, 658, 666, 666, 203, 203, 667, 668, + 669, 670, 671, 672, 673, 674, 675, 676, + 203, 677, 677, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + + 678, 679, 680, 680, 681, 682, 682, 682, + 682, 682, 682, 682, 682, 203, 682, 682, + 682, 203, 682, 682, 682, 682, 682, 682, + 682, 682, 682, 682, 682, 682, 682, 682, + + 682, 682, 682, 682, 682, 682, 682, 682, + 682, 683, 682, 682, 682, 682, 682, 682, + 682, 682, 682, 682, 682, 682, 682, 682, + 682, 682, 683, 684, 684, 685, 686, 680, + + 680, 687, 687, 687, 688, 203, 680, 680, + 680, 203, 689, 689, 689, 690, 691, 692, + 203, 203, 203, 203, 693, 693, 693, 686, + 694, 694, 694, 694, 694, 694, 694, 695, + + 682, 682, 688, 688, 203, 203, 696, 697, + 698, 699, 700, 701, 702, 703, 704, 705, + 706, 706, 706, 706, 706, 706, 694, 694, + 694, 707, 685, 685, 685, 685, 685, 685, + + 203, 708, 709, 709, 203, 710, 710, 710, + 710, 710, 710, 710, 710, 710, 710, 710, + 710, 710, 710, 710, 710, 710, 710, 203, + 203, 203, 710, 710, 710, 710, 710, 710, + + 710, 710, 710, 710, 710, 710, 710, 710, + 710, 710, 710, 710, 710, 710, 710, 710, + 710, 710, 203, 710, 710, 710, 710, 710, + 710, 710, 710, 710, 203, 710, 203, 203, + + 710, 710, 710, 710, 710, 710, 710, 203, + 203, 203, 711, 203, 203, 203, 203, 712, + 709, 709, 713, 713, 713, 203, 713, 203, + 709, 709, 714, 709, 714, 714, 714, 712, + + 203, 203, 203, 203, 203, 203, 715, 716, + 717, 718, 719, 720, 721, 722, 723, 724, + 203, 203, 709, 709, 725, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + + 203, 726, 726, 726, 726, 726, 726, 726, + 726, 726, 726, 726, 726, 726, 726, 726, + 726, 726, 726, 726, 726, 726, 726, 726, + 726, 726, 726, 726, 726, 726, 726, 726, + + 726, 726, 726, 726, 726, 726, 726, 726, + 726, 726, 726, 726, 726, 726, 726, 726, + 726, 727, 726, 728, 727, 727, 727, 727, + 729, 729, 730, 203, 203, 203, 203, 12, + + 726, 726, 726, 726, 726, 726, 731, 727, + 732, 732, 732, 732, 727, 727, 727, 733, + 734, 735, 736, 737, 738, 739, 740, 741, + 742, 743, 744, 744, 203, 203, 203, 203, + + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + + 203, 745, 745, 203, 745, 203, 746, 745, + 745, 746, 745, 203, 746, 745, 746, 746, + 746, 746, 746, 746, 745, 745, 745, 745, + 746, 745, 745, 745, 745, 745, 745, 745, + + 746, 745, 745, 745, 203, 745, 203, 745, + 746, 746, 745, 745, 746, 745, 745, 745, + 745, 747, 745, 748, 747, 747, 747, 747, + 749, 749, 750, 747, 747, 745, 203, 203, + + 745, 745, 745, 745, 745, 203, 751, 203, + 752, 752, 752, 752, 747, 747, 203, 203, + 753, 754, 755, 756, 757, 758, 759, 760, + 761, 762, 203, 203, 763, 763, 764, 764, + + 765, 766, 766, 766, 767, 768, 767, 767, + 769, 767, 767, 770, 771, 772, 772, 772, + 772, 772, 769, 773, 772, 773, 773, 773, + 774, 774, 773, 773, 773, 773, 773, 773, + + 775, 776, 777, 778, 779, 780, 781, 782, + 783, 784, 785, 785, 785, 785, 785, 785, + 785, 785, 785, 785, 786, 774, 773, 774, + 773, 787, 788, 789, 788, 789, 790, 790, + + 765, 765, 765, 791, 765, 765, 765, 765, + 203, 765, 765, 765, 765, 791, 765, 765, + 765, 765, 791, 765, 765, 765, 765, 791, + 765, 765, 765, 765, 791, 765, 765, 765, + + 765, 765, 765, 765, 765, 765, 765, 765, + 765, 791, 792, 793, 793, 203, 203, 203, + 203, 794, 795, 796, 797, 796, 796, 798, + 796, 798, 795, 795, 795, 795, 799, 800, + + 795, 796, 801, 801, 802, 770, 801, 801, + 765, 765, 765, 765, 803, 804, 804, 804, + 799, 799, 799, 796, 799, 799, 805, 799, + 203, 799, 799, 799, 799, 796, 799, 799, + + 799, 799, 796, 799, 799, 799, 799, 796, + 799, 799, 799, 799, 796, 799, 805, 805, + 805, 799, 799, 799, 799, 799, 799, 799, + 805, 796, 805, 805, 805, 203, 806, 806, + + 807, 807, 807, 807, 807, 807, 808, 807, + 807, 807, 807, 807, 807, 203, 809, 807, + 810, 810, 811, 812, 813, 814, 814, 814, + 814, 815, 815, 203, 203, 203, 203, 203, + + 816, 816, 816, 816, 816, 816, 816, 816, + 816, 816, 816, 816, 816, 816, 816, 816, + 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, - 816, 816, 823, 818, 827, 823, 823, 818, - 818, 818, 818, 818, 818, 840, 816, 818, - 841, 842, 843, 844, 845, 846, 847, 848, - 849, 850, 851, 851, 851, 852, 853, 853, + 816, 816, 817, 816, 816, 816, 818, 816, + 817, 816, 816, 819, 820, 821, 822, 821, + 821, 823, 821, 824, 824, 824, 821, 825, + 820, 826, 827, 828, 828, 824, 824, 817, - 854, 854, 854, 854, 854, 854, 854, 854, - 854, 854, 854, 854, 854, 854, 854, 854, - 854, 854, 854, 854, 854, 854, 854, 854, - 854, 854, 854, 854, 854, 854, 854, 854, + 829, 830, 831, 832, 833, 834, 835, 836, + 837, 838, 839, 839, 840, 840, 840, 840, + 816, 816, 816, 816, 816, 816, 823, 823, + 821, 821, 817, 817, 817, 817, 824, 824, - 854, 854, 854, 854, 854, 854, 202, 855, - 202, 202, 202, 202, 202, 855, 202, 202, - 856, 856, 856, 856, 856, 856, 856, 856, - 856, 856, 856, 856, 856, 856, 856, 856, + 824, 817, 819, 819, 819, 817, 817, 819, + 819, 819, 819, 819, 819, 819, 817, 817, + 817, 824, 824, 824, 824, 817, 817, 817, + 817, 817, 817, 817, 817, 817, 817, 817, - 856, 856, 856, 856, 856, 856, 856, 856, - 856, 856, 856, 856, 856, 856, 856, 856, - 856, 856, 856, 856, 856, 856, 856, 857, - 857, 858, 858, 859, 860, 861, 861, 861, + 817, 817, 824, 819, 828, 824, 824, 819, + 819, 819, 819, 819, 819, 841, 817, 819, + 842, 843, 844, 845, 846, 847, 848, 849, + 850, 851, 852, 852, 852, 853, 854, 854, - 862, 862, 862, 862, 862, 862, 862, 862, - 862, 862, 862, 862, 862, 862, 862, 862, - 862, 862, 862, 862, 862, 862, 862, 862, - 862, 862, 862, 862, 862, 862, 862, 862, + 855, 855, 855, 855, 855, 855, 855, 855, + 855, 855, 855, 855, 855, 855, 855, 855, + 855, 855, 855, 855, 855, 855, 855, 855, + 855, 855, 855, 855, 855, 855, 855, 855, - 862, 862, 862, 862, 862, 862, 862, 862, - 862, 862, 862, 862, 862, 862, 862, 862, - 862, 862, 862, 862, 862, 862, 862, 862, - 862, 862, 863, 863, 863, 863, 863, 862, + 855, 855, 855, 855, 855, 855, 203, 856, + 203, 203, 203, 203, 203, 856, 203, 203, + 857, 857, 857, 857, 857, 857, 857, 857, + 857, 857, 857, 857, 857, 857, 857, 857, - 864, 865, 865, 865, 865, 865, 865, 865, + 857, 857, 857, 857, 857, 857, 857, 857, + 857, 857, 857, 857, 857, 857, 857, 857, + 857, 857, 857, 857, 857, 857, 857, 858, + 858, 859, 859, 860, 861, 862, 862, 862, + + 863, 863, 863, 863, 863, 863, 863, 863, + 863, 863, 863, 863, 863, 863, 863, 863, + 863, 863, 863, 863, 863, 863, 863, 863, + 863, 863, 863, 863, 863, 863, 863, 863, + + 863, 863, 863, 863, 863, 863, 863, 863, + 863, 863, 863, 863, 863, 863, 863, 863, + 863, 863, 863, 863, 863, 863, 863, 863, + 863, 863, 864, 864, 864, 864, 864, 863, + + 865, 866, 866, 866, 866, 866, 866, 866, + 866, 866, 866, 866, 866, 866, 866, 866, + 866, 866, 866, 866, 866, 866, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, - 865, 865, 865, 865, 865, 865, 864, 864, - 864, 864, 864, 864, 864, 864, 864, 864, - 864, 864, 864, 864, 864, 864, 864, 864, - 864, 864, 864, 864, 864, 864, 864, 864, - 864, 864, 864, 864, 864, 864, 864, 864, - 864, 864, 864, 864, 864, 864, 864, 864, + 865, 865, 865, 865, 865, 865, 865, 865, + 865, 865, 865, 865, 865, 865, 865, 865, + 865, 865, 865, 865, 865, 865, 865, 865, + 865, 865, 865, 865, 865, 865, 865, 865, - 864, 864, 864, 866, 866, 866, 866, 866, - 867, 867, 867, 867, 867, 867, 867, 867, - 867, 867, 867, 867, 867, 867, 867, 867, - 867, 867, 867, 867, 867, 867, 867, 867, - - 867, 867, 867, 868, 868, 868, 868, 868, + 865, 865, 865, 867, 867, 867, 867, 867, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, - 868, 868, 868, 868, 868, 868, 868, 868, - 868, 868, 868, 868, 868, 868, 868, 868, - 868, 868, 868, 868, 868, 868, 868, 868, - 868, 868, 869, 869, 869, 869, 869, 869, + 868, 868, 868, 869, 869, 869, 869, 869, + 869, 869, 869, 869, 869, 869, 869, 869, + 869, 869, 869, 869, 869, 869, 869, 869, + 869, 869, 869, 869, 869, 869, 869, 869, - 870, 870, 870, 870, 870, 870, 870, 871, - 870, 870, 870, 870, 870, 870, 870, 870, - 870, 870, 870, 870, 870, 870, 870, 870, - 870, 870, 870, 870, 870, 870, 870, 870, + 869, 869, 869, 869, 869, 869, 869, 869, + 869, 869, 869, 869, 869, 869, 869, 869, + 869, 869, 869, 869, 869, 869, 869, 869, + 869, 869, 870, 870, 870, 870, 870, 870, - 870, 870, 870, 870, 870, 870, 870, 870, - 870, 870, 870, 870, 870, 870, 870, 870, - 870, 870, 870, 870, 870, 870, 870, 870, - 870, 870, 870, 870, 870, 870, 870, 870, - - 870, 870, 870, 870, 870, 870, 870, 871, - 870, 202, 870, 870, 870, 870, 202, 202, - 870, 870, 870, 870, 870, 870, 870, 202, - 870, 202, 870, 870, 870, 870, 202, 202, - - 870, 870, 870, 870, 870, 870, 870, 871, - 870, 202, 870, 870, 870, 870, 202, 202, - 870, 870, 870, 870, 870, 870, 870, 870, - 870, 870, 870, 870, 870, 870, 870, 870, - - 870, 870, 870, 870, 870, 870, 870, 870, - 870, 870, 870, 870, 870, 870, 870, 871, - 870, 202, 870, 870, 870, 870, 202, 202, - 870, 870, 870, 870, 870, 870, 870, 202, - - 870, 202, 870, 870, 870, 870, 202, 202, - 870, 870, 870, 870, 870, 870, 870, 871, - 870, 870, 870, 870, 870, 870, 870, 202, - 870, 870, 870, 870, 870, 870, 870, 870, - - 870, 870, 870, 870, 870, 870, 870, 870, - 870, 870, 870, 870, 870, 870, 870, 871, - 870, 870, 870, 870, 870, 870, 870, 870, - 870, 870, 870, 870, 870, 870, 870, 870, - - 870, 870, 870, 870, 870, 870, 870, 870, - 870, 870, 870, 870, 870, 870, 870, 871, - 870, 202, 870, 870, 870, 870, 202, 202, - 870, 870, 870, 870, 870, 870, 870, 871, - - 870, 870, 870, 870, 870, 870, 870, 871, - 870, 870, 870, 870, 870, 870, 870, 870, - 870, 870, 870, 870, 870, 870, 870, 870, - 870, 870, 870, 202, 202, 872, 872, 873, - - 874, 875, 876, 877, 877, 877, 877, 876, - 876, 878, 879, 880, 881, 882, 883, 884, - 885, 886, 887, 887, 887, 887, 887, 887, - 887, 887, 887, 887, 887, 202, 202, 202, + 871, 871, 871, 871, 871, 871, 871, 872, + 871, 871, 871, 871, 871, 871, 871, 871, + 871, 871, 871, 871, 871, 871, 871, 871, + 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, - 888, 888, 888, 888, 888, 888, 888, 888, - 888, 888, 202, 202, 202, 202, 202, 202, + 871, 871, 871, 871, 871, 871, 871, 871, + 871, 871, 871, 871, 871, 871, 871, 871, - 889, 890, 891, 892, 893, 894, 895, 896, - 897, 898, 899, 900, 901, 902, 903, 904, - 905, 906, 907, 908, 909, 910, 911, 912, - 913, 914, 915, 916, 917, 918, 919, 920, + 871, 871, 871, 871, 871, 871, 871, 872, + 871, 203, 871, 871, 871, 871, 203, 203, + 871, 871, 871, 871, 871, 871, 871, 203, + 871, 203, 871, 871, 871, 871, 203, 203, - 921, 922, 923, 924, 925, 926, 927, 928, - 929, 930, 931, 932, 933, 934, 935, 936, - 937, 938, 939, 940, 941, 942, 943, 944, - 945, 946, 947, 948, 949, 950, 951, 952, + 871, 871, 871, 871, 871, 871, 871, 872, + 871, 203, 871, 871, 871, 871, 203, 203, + 871, 871, 871, 871, 871, 871, 871, 871, + 871, 871, 871, 871, 871, 871, 871, 871, - 953, 954, 955, 956, 957, 958, 959, 960, - 961, 962, 963, 964, 965, 966, 967, 968, - 969, 969, 969, 969, 969, 970, 202, 202, - 971, 971, 971, 971, 971, 971, 202, 202, + 871, 871, 871, 871, 871, 871, 871, 871, + 871, 871, 871, 871, 871, 871, 871, 872, + 871, 203, 871, 871, 871, 871, 203, 203, + 871, 871, 871, 871, 871, 871, 871, 203, - 972, 973, 973, 973, 973, 973, 973, 973, - 973, 973, 973, 973, 973, 973, 973, 973, - 973, 973, 973, 973, 973, 973, 973, 973, - 973, 973, 973, 973, 973, 973, 973, 973, + 871, 203, 871, 871, 871, 871, 203, 203, + 871, 871, 871, 871, 871, 871, 871, 872, + 871, 871, 871, 871, 871, 871, 871, 203, + 871, 871, 871, 871, 871, 871, 871, 871, - 973, 973, 973, 973, 973, 973, 973, 973, - 973, 973, 973, 973, 973, 973, 973, 973, - 973, 973, 973, 973, 973, 973, 973, 973, - 973, 973, 973, 973, 973, 973, 973, 973, + 871, 871, 871, 871, 871, 871, 871, 871, + 871, 871, 871, 871, 871, 871, 871, 872, + 871, 871, 871, 871, 871, 871, 871, 871, + 871, 871, 871, 871, 871, 871, 871, 871, - 973, 973, 973, 973, 973, 973, 973, 973, - 973, 973, 973, 973, 973, 974, 975, 973, - 973, 973, 973, 973, 973, 973, 973, 976, - 976, 976, 976, 976, 976, 976, 976, 976, + 871, 871, 871, 871, 871, 871, 871, 871, + 871, 871, 871, 871, 871, 871, 871, 872, + 871, 203, 871, 871, 871, 871, 203, 203, + 871, 871, 871, 871, 871, 871, 871, 872, - 977, 978, 978, 978, 978, 978, 978, 978, - 978, 978, 978, 978, 978, 978, 978, 978, - 978, 978, 978, 978, 978, 978, 978, 978, - 978, 978, 978, 979, 980, 202, 202, 202, + 871, 871, 871, 871, 871, 871, 871, 872, + 871, 871, 871, 871, 871, 871, 871, 871, + 871, 871, 871, 871, 871, 871, 871, 871, + 871, 871, 871, 203, 203, 873, 873, 874, - 981, 981, 981, 981, 981, 981, 981, 981, - 981, 981, 981, 981, 981, 981, 981, 981, - 981, 981, 981, 981, 981, 981, 981, 981, - 981, 981, 981, 981, 981, 981, 981, 981, + 875, 876, 877, 878, 878, 878, 878, 877, + 877, 879, 880, 881, 882, 883, 884, 885, + 886, 887, 888, 888, 888, 888, 888, 888, + 888, 888, 888, 888, 888, 203, 203, 203, - 981, 981, 981, 981, 981, 981, 981, 981, - 981, 981, 981, 982, 982, 982, 983, 983, - 983, 984, 984, 984, 984, 984, 984, 984, - 984, 202, 202, 202, 202, 202, 202, 202, + 872, 872, 872, 872, 872, 872, 872, 872, + 872, 872, 872, 872, 872, 872, 872, 872, + 889, 889, 889, 889, 889, 889, 889, 889, + 889, 889, 203, 203, 203, 203, 203, 203, - 985, 985, 985, 985, 985, 985, 985, 985, - 985, 985, 985, 985, 985, 202, 985, 985, - 985, 985, 986, 986, 987, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, + 890, 891, 892, 893, 894, 895, 896, 897, + 898, 899, 900, 901, 902, 903, 904, 905, + 906, 907, 908, 909, 910, 911, 912, 913, + 914, 915, 916, 917, 918, 919, 920, 921, - 988, 988, 988, 988, 988, 988, 988, 988, - 988, 988, 988, 988, 988, 988, 988, 988, - 988, 988, 989, 989, 990, 991, 991, 202, - 202, 202, 202, 202, 202, 202, 202, 202, + 922, 923, 924, 925, 926, 927, 928, 929, + 930, 931, 932, 933, 934, 935, 936, 937, + 938, 939, 940, 941, 942, 943, 944, 945, + 946, 947, 948, 949, 950, 951, 952, 953, - 992, 992, 992, 992, 992, 992, 992, 992, - 992, 992, 992, 992, 992, 992, 992, 992, - 992, 992, 993, 993, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, + 954, 955, 956, 957, 958, 959, 960, 961, + 962, 963, 964, 965, 966, 967, 968, 969, + 970, 970, 970, 970, 970, 971, 203, 203, + 972, 972, 972, 972, 972, 972, 203, 203, - 994, 994, 994, 994, 994, 994, 994, 994, - 994, 994, 994, 994, 994, 202, 994, 994, - 994, 202, 995, 995, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, + 973, 974, 974, 974, 974, 974, 974, 974, + 974, 974, 974, 974, 974, 974, 974, 974, + 974, 974, 974, 974, 974, 974, 974, 974, + 974, 974, 974, 974, 974, 974, 974, 974, - 996, 996, 996, 996, 996, 996, 996, 996, - 996, 996, 996, 996, 996, 996, 996, 996, - 996, 996, 996, 996, 996, 996, 996, 996, - 996, 996, 996, 996, 996, 996, 996, 996, + 974, 974, 974, 974, 974, 974, 974, 974, + 974, 974, 974, 974, 974, 974, 974, 974, + 974, 974, 974, 974, 974, 974, 974, 974, + 974, 974, 974, 974, 974, 974, 974, 974, - 996, 996, 996, 996, 996, 996, 996, 996, - 996, 996, 996, 996, 996, 996, 996, 996, - 996, 996, 996, 996, 997, 997, 998, 997, - 997, 997, 997, 997, 997, 997, 998, 998, + 974, 974, 974, 974, 974, 974, 974, 974, + 974, 974, 974, 974, 974, 975, 976, 974, + 974, 974, 974, 974, 974, 974, 974, 977, + 977, 977, 977, 977, 977, 977, 977, 977, - 998, 998, 998, 998, 998, 998, 997, 998, - 998, 997, 997, 997, 997, 997, 997, 997, - 997, 997, 999, 997, 1000, 1000, 1001, 1002, - 1000, 1003, 1000, 1004, 996, 1005, 202, 202, + 978, 979, 979, 979, 979, 979, 979, 979, + 979, 979, 979, 979, 979, 979, 979, 979, + 979, 979, 979, 979, 979, 979, 979, 979, + 979, 979, 979, 980, 981, 203, 203, 203, - 1006, 1007, 1008, 1009, 1010, 1011, 1012, 1013, - 1014, 1015, 202, 202, 202, 202, 202, 202, - 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, - 1016, 1016, 202, 202, 202, 202, 202, 202, + 982, 982, 982, 982, 982, 982, 982, 982, + 982, 982, 982, 982, 982, 982, 982, 982, + 982, 982, 982, 982, 982, 982, 982, 982, + 982, 982, 982, 982, 982, 982, 982, 982, - 1017, 1017, 1018, 1019, 1020, 1021, 1022, 1023, - 1024, 1025, 1026, 1027, 1027, 1027, 1028, 202, - 1029, 1030, 1031, 1032, 1033, 1034, 1035, 1036, - 1037, 1038, 202, 202, 202, 202, 202, 202, + 982, 982, 982, 982, 982, 982, 982, 982, + 982, 982, 982, 983, 983, 983, 984, 984, + 984, 985, 985, 985, 985, 985, 985, 985, + 985, 203, 203, 203, 203, 203, 203, 203, - 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, - 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, - 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, - 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, + 986, 986, 986, 986, 986, 986, 986, 986, + 986, 986, 986, 986, 986, 203, 986, 986, + 986, 986, 987, 987, 988, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, - 1039, 1039, 1039, 1040, 1039, 1039, 1039, 1039, - 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, - 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, - 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, + 989, 989, 989, 989, 989, 989, 989, 989, + 989, 989, 989, 989, 989, 989, 989, 989, + 989, 989, 990, 990, 991, 992, 992, 203, + 203, 203, 203, 203, 203, 203, 203, 203, - 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, - 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, - 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, - 1041, 202, 202, 202, 202, 202, 202, 202, + 993, 993, 993, 993, 993, 993, 993, 993, + 993, 993, 993, 993, 993, 993, 993, 993, + 993, 993, 994, 994, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, - 1042, 1042, 1042, 1042, 1042, 1027, 1027, 1039, - 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, - 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, - 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, + 995, 995, 995, 995, 995, 995, 995, 995, + 995, 995, 995, 995, 995, 203, 995, 995, + 995, 203, 996, 996, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, - 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, - 1039, 1043, 1044, 202, 202, 202, 202, 202, - 976, 976, 976, 976, 976, 976, 976, 976, - 976, 976, 976, 976, 976, 976, 976, 976, + 997, 997, 997, 997, 997, 997, 997, 997, + 997, 997, 997, 997, 997, 997, 997, 997, + 997, 997, 997, 997, 997, 997, 997, 997, + 997, 997, 997, 997, 997, 997, 997, 997, - 976, 976, 976, 976, 976, 976, 976, 976, - 976, 976, 976, 976, 976, 976, 976, 976, - 976, 976, 976, 976, 976, 976, 976, 976, - 976, 976, 976, 976, 976, 976, 976, 976, + 997, 997, 997, 997, 997, 997, 997, 997, + 997, 997, 997, 997, 997, 997, 997, 997, + 997, 997, 997, 997, 998, 998, 999, 998, + 998, 998, 998, 998, 998, 998, 999, 999, - 976, 976, 976, 976, 976, 976, 976, 976, - 976, 976, 976, 976, 976, 976, 976, 976, - 976, 976, 976, 976, 976, 976, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, + 999, 999, 999, 999, 999, 999, 998, 999, + 999, 998, 998, 998, 998, 998, 998, 998, + 998, 998, 1000, 998, 1001, 1001, 1002, 1003, + 1001, 1004, 1001, 1005, 997, 1006, 203, 203, - 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, - 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, - 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, - 1045, 1045, 1045, 1045, 1045, 1046, 1046, 202, + 1007, 1008, 1009, 1010, 1011, 1012, 1013, 1014, + 1015, 1016, 203, 203, 203, 203, 203, 203, + 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, + 1017, 1017, 203, 203, 203, 203, 203, 203, - 1047, 1047, 1047, 1048, 1048, 1048, 1048, 1047, - 1047, 1048, 1048, 1048, 202, 202, 202, 202, - 1048, 1048, 1047, 1048, 1048, 1048, 1048, 1048, - 1048, 1049, 1050, 1051, 202, 202, 202, 202, + 1018, 1018, 1019, 1020, 1021, 1022, 1023, 1024, + 1025, 1026, 1027, 1028, 1028, 1028, 1029, 203, + 1030, 1031, 1032, 1033, 1034, 1035, 1036, 1037, + 1038, 1039, 203, 203, 203, 203, 203, 203, - 1052, 202, 202, 202, 1053, 1053, 1054, 1055, - 1056, 1057, 1058, 1059, 1060, 1061, 1062, 1063, - 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, - 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, + 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, + 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, + 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, + 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, - 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, - 1064, 1064, 1064, 1064, 1064, 1064, 202, 202, - 1064, 1064, 1064, 1064, 1064, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, + 1040, 1040, 1040, 1041, 1040, 1040, 1040, 1040, + 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, + 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, + 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, - 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, - 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, + 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, + 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, + 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, + 1042, 203, 203, 203, 203, 203, 203, 203, + + 1043, 1043, 1043, 1043, 1043, 1028, 1028, 1040, + 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, + 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, + 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, + + 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, + 1040, 1044, 1045, 203, 203, 203, 203, 203, + 977, 977, 977, 977, 977, 977, 977, 977, + 977, 977, 977, 977, 977, 977, 977, 977, + + 977, 977, 977, 977, 977, 977, 977, 977, + 977, 977, 977, 977, 977, 977, 977, 977, + 977, 977, 977, 977, 977, 977, 977, 977, + 977, 977, 977, 977, 977, 977, 977, 977, + + 977, 977, 977, 977, 977, 977, 977, 977, + 977, 977, 977, 977, 977, 977, 977, 977, + 977, 977, 977, 977, 977, 977, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + + 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, + 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, + 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, + 1046, 1046, 1046, 1046, 1046, 1047, 1047, 203, + + 1048, 1048, 1048, 1049, 1049, 1049, 1049, 1048, + 1048, 1049, 1049, 1049, 203, 203, 203, 203, + 1049, 1049, 1048, 1049, 1049, 1049, 1049, 1049, + 1049, 1050, 1051, 1052, 203, 203, 203, 203, + + 1053, 203, 203, 203, 1054, 1054, 1055, 1056, + 1057, 1058, 1059, 1060, 1061, 1062, 1063, 1064, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, - 1065, 1065, 1066, 1066, 202, 202, 202, 202, - 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, - 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, + 1065, 1065, 1065, 1065, 1065, 1065, 203, 203, + 1065, 1065, 1065, 1065, 1065, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, - 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, - 1065, 1065, 202, 202, 202, 202, 202, 202, - 1067, 1068, 1069, 1070, 1071, 1072, 1073, 1074, - 1075, 1076, 1077, 202, 202, 202, 1078, 1078, + 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, + 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, + 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, + 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, - 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, - 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, - 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, - 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, + 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, + 1066, 1066, 1067, 1067, 203, 203, 203, 203, + 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, + 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, + + 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, + 1066, 1066, 203, 203, 203, 203, 203, 203, + 1068, 1069, 1070, 1071, 1072, 1073, 1074, 1075, + 1076, 1077, 1078, 203, 203, 203, 1079, 1079, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, - 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1081, - 1082, 1083, 1083, 1084, 202, 202, 1085, 1085, + 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, + 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, - 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, - 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, - 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, - 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, + 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, + 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, + 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1082, + 1083, 1084, 1084, 1085, 203, 203, 1086, 1086, - 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, - 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, - 1086, 1086, 1086, 1086, 1086, 1087, 1088, 1087, - 1088, 1088, 1088, 1088, 1088, 1088, 1088, 202, + 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, + 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, + 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, + 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, - 1089, 1090, 1088, 1090, 1090, 1088, 1088, 1088, - 1088, 1088, 1088, 1088, 1088, 1087, 1087, 1087, - 1087, 1087, 1087, 1088, 1088, 1091, 1091, 1091, - 1091, 1091, 1091, 1091, 1091, 202, 202, 1092, + 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, + 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, + 1087, 1087, 1087, 1087, 1087, 1088, 1089, 1088, + 1089, 1089, 1089, 1089, 1089, 1089, 1089, 203, - 1093, 1094, 1095, 1096, 1097, 1098, 1099, 1100, - 1101, 1102, 202, 202, 202, 202, 202, 202, - 1093, 1094, 1095, 1096, 1097, 1098, 1099, 1100, - 1101, 1102, 202, 202, 202, 202, 202, 202, + 1090, 1091, 1089, 1091, 1091, 1089, 1089, 1089, + 1089, 1089, 1089, 1089, 1089, 1088, 1088, 1088, + 1088, 1088, 1088, 1089, 1089, 1092, 1092, 1092, + 1092, 1092, 1092, 1092, 1092, 203, 203, 1093, - 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1104, - 1105, 1105, 1105, 1105, 1103, 1103, 202, 202, - 1106, 1106, 1106, 1106, 1106, 1107, 1107, 1107, - 1107, 1107, 1107, 1106, 1106, 1107, 1108, 1109, + 1094, 1095, 1096, 1097, 1098, 1099, 1100, 1101, + 1102, 1103, 203, 203, 203, 203, 203, 203, + 1094, 1095, 1096, 1097, 1098, 1099, 1100, 1101, + 1102, 1103, 203, 203, 203, 203, 203, 203, - 1109, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, + 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1105, + 1106, 1106, 1106, 1106, 1104, 1104, 203, 203, + 1107, 1107, 1107, 1107, 1107, 1108, 1108, 1108, + 1108, 1108, 1108, 1107, 1107, 1108, 1109, 1110, - 1110, 1110, 1110, 1110, 1111, 1112, 1113, 1112, - 1113, 1112, 1113, 1112, 1113, 1112, 1113, 1112, - 1112, 1112, 1113, 1112, 1112, 1112, 1112, 1112, - 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, + 1110, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, - 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, - 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, - 1112, 1112, 1112, 1112, 1114, 1115, 1110, 1110, - 1110, 1110, 1110, 1116, 1110, 1116, 1111, 1111, + 1111, 1111, 1111, 1111, 1112, 1113, 1114, 1113, + 1114, 1113, 1114, 1113, 1114, 1113, 1114, 1113, + 1113, 1113, 1114, 1113, 1113, 1113, 1113, 1113, + 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, - 1116, 1116, 1110, 1116, 1117, 1112, 1112, 1112, - 1112, 1112, 1112, 1112, 202, 202, 202, 202, - 1118, 1119, 1120, 1121, 1122, 1123, 1124, 1125, - 1126, 1127, 1128, 1128, 1129, 1130, 1128, 1128, + 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, + 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, + 1113, 1113, 1113, 1113, 1115, 1116, 1111, 1111, + 1111, 1111, 1111, 1117, 1111, 1117, 1112, 1112, - 1130, 1131, 1131, 1131, 1131, 1131, 1131, 1131, - 1131, 1131, 1131, 1132, 1133, 1132, 1132, 1132, - 1132, 1132, 1132, 1132, 1131, 1131, 1131, 1131, - 1131, 1131, 1131, 1131, 1131, 202, 202, 202, + 1117, 1117, 1111, 1117, 1118, 1113, 1113, 1113, + 1113, 1113, 1113, 1113, 203, 203, 203, 203, + 1119, 1120, 1121, 1122, 1123, 1124, 1125, 1126, + 1127, 1128, 1129, 1129, 1130, 1131, 1129, 1129, - 1134, 1134, 1135, 1136, 1136, 1136, 1136, 1136, - 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, - 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, - 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, + 1131, 1132, 1132, 1132, 1132, 1132, 1132, 1132, + 1132, 1132, 1132, 1133, 1134, 1133, 1133, 1133, + 1133, 1133, 1133, 1133, 1132, 1132, 1132, 1132, + 1132, 1132, 1132, 1132, 1132, 203, 203, 203, - 1136, 1135, 1134, 1134, 1134, 1134, 1135, 1135, - 1134, 1134, 1137, 1138, 1139, 1139, 1136, 1136, - 1140, 1141, 1142, 1143, 1144, 1145, 1146, 1147, - 1148, 1149, 1150, 1150, 1150, 1150, 1150, 1150, + 1135, 1135, 1136, 1137, 1137, 1137, 1137, 1137, + 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, + 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, + 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, - 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, - 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, - 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, - 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, + 1137, 1136, 1135, 1135, 1135, 1135, 1136, 1136, + 1135, 1135, 1138, 1139, 1140, 1140, 1137, 1137, + 1141, 1142, 1143, 1144, 1145, 1146, 1147, 1148, + 1149, 1150, 1151, 1151, 1151, 1151, 1151, 1151, - 1151, 1151, 1151, 1151, 1151, 1151, 1152, 1153, - 1154, 1154, 1153, 1153, 1153, 1154, 1153, 1154, - 1154, 1154, 1155, 1155, 202, 202, 202, 202, - 202, 202, 202, 202, 1156, 1156, 1156, 1156, + 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, + 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, + 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, + 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, - 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, - 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, - 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, - 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, + 1152, 1152, 1152, 1152, 1152, 1152, 1153, 1154, + 1155, 1155, 1154, 1154, 1154, 1155, 1154, 1155, + 1155, 1155, 1156, 1156, 203, 203, 203, 203, + 203, 203, 203, 203, 1157, 1157, 1157, 1157, + + 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, + 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, + 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, + 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, - 1157, 1157, 1157, 1157, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1159, 1159, 1159, 1159, - 1159, 1159, 1159, 1159, 1158, 1158, 1159, 1160, - 202, 202, 202, 1161, 1161, 1162, 1162, 1162, + 1159, 1159, 1159, 1159, 1160, 1160, 1160, 1160, + 1160, 1160, 1160, 1160, 1159, 1159, 1160, 1161, + 203, 203, 203, 1162, 1162, 1163, 1163, 1163, - 1163, 1164, 1165, 1166, 1167, 1168, 1169, 1170, - 1171, 1172, 202, 202, 202, 1157, 1157, 1157, - 1173, 1174, 1175, 1176, 1177, 1178, 1179, 1180, - 1181, 1182, 1183, 1183, 1183, 1183, 1183, 1183, + 1164, 1165, 1166, 1167, 1168, 1169, 1170, 1171, + 1172, 1173, 203, 203, 203, 1158, 1158, 1158, + 1174, 1175, 1176, 1177, 1178, 1179, 1180, 1181, + 1182, 1183, 1184, 1184, 1184, 1184, 1184, 1184, - 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, - 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, - 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, - 1184, 1184, 1184, 1184, 1184, 1184, 1185, 1185, + 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, + 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, + 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, + 1185, 1185, 1185, 1185, 1185, 1185, 1186, 1186, - 1186, 1187, 1188, 1189, 1189, 1190, 1191, 1192, - 1193, 202, 202, 202, 202, 202, 202, 202, - 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, - 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, - - 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, - 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, - 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, - 1194, 1194, 1194, 202, 202, 1194, 1194, 1194, + 1187, 1188, 1189, 1190, 1190, 1191, 1192, 1193, + 1194, 203, 203, 203, 203, 203, 203, 203, + 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, + 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, - 202, 202, 202, 202, 202, 202, 202, 202, - 1196, 1196, 1196, 1197, 1198, 1199, 1199, 1199, - 1199, 1199, 1196, 1196, 1199, 1199, 1199, 1199, + 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, + 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, + 1195, 1195, 1195, 203, 203, 1195, 1195, 1195, - 1196, 1200, 1198, 1198, 1198, 1198, 1198, 1198, - 1198, 1201, 1201, 1201, 1201, 1199, 1201, 1201, - 1201, 1201, 1201, 1202, 1203, 1202, 1202, 1204, - 1106, 1106, 1205, 202, 202, 202, 202, 202, + 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, + 203, 203, 203, 203, 203, 203, 203, 203, + 1197, 1197, 1197, 1198, 1199, 1200, 1200, 1200, + 1200, 1200, 1197, 1197, 1200, 1200, 1200, 1200, - 114, 114, 114, 114, 114, 114, 114, 114, - 114, 114, 114, 114, 114, 114, 114, 114, - 114, 114, 114, 114, 114, 114, 114, 114, - 114, 114, 114, 114, 114, 114, 114, 114, - - 114, 114, 114, 114, 114, 114, 1206, 1206, - 1206, 1206, 1206, 1207, 1208, 1208, 1208, 1209, - 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, - 1208, 1208, 1208, 1209, 1208, 1208, 1208, 1208, - - 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, - 1208, 1208, 1208, 1208, 1208, 1208, 1209, 1208, - 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, - 1208, 1208, 1208, 1208, 1208, 1210, 1210, 1210, - - 1210, 1210, 1208, 1208, 1208, 1208, 1210, 1210, - 1210, 1210, 1210, 114, 115, 115, 115, 115, - 115, 115, 115, 115, 115, 115, 115, 115, - 1211, 1212, 115, 115, 115, 1213, 115, 115, + 1197, 1201, 1199, 1199, 1199, 1199, 1199, 1199, + 1199, 1202, 1202, 1202, 1202, 1200, 1202, 1202, + 1202, 1202, 1202, 1203, 1204, 1203, 1203, 1205, + 1107, 1107, 1206, 203, 203, 203, 203, 203, 115, 115, 115, 115, 115, 115, 115, 115, - 115, 115, 115, 115, 115, 115, 1214, 115, 115, 115, 115, 115, 115, 115, 115, 115, - 115, 115, 115, 1215, 1215, 1215, 1215, 1215, + 115, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 115, - 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, - 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, - 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, - 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1216, + 115, 115, 115, 115, 115, 115, 1207, 1207, + 1207, 1207, 1207, 1208, 1209, 1209, 1209, 1210, + 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, + 1209, 1209, 1209, 1210, 1209, 1209, 1209, 1209, - 191, 191, 190, 191, 1217, 1217, 1217, 1217, - 1217, 1217, 1218, 1219, 1219, 1220, 1221, 1222, - 1223, 1219, 1219, 1219, 1219, 1219, 1219, 1219, - 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, + 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, + 1209, 1209, 1209, 1209, 1209, 1209, 1210, 1209, + 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, + 1209, 1209, 1209, 1209, 1209, 1211, 1211, 1211, - 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1106, - 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, - 1106, 1106, 1106, 1106, 1106, 1106, 1224, 1225, - 1225, 1226, 202, 1227, 1228, 1199, 1217, 1218, + 1211, 1211, 1209, 1209, 1209, 1209, 1211, 1211, + 1211, 1211, 1211, 115, 116, 116, 116, 116, + 116, 116, 116, 116, 116, 116, 116, 116, + 1212, 1213, 116, 116, 116, 1214, 116, 116, - 70, 71, 70, 71, 70, 71, 70, 71, - 70, 71, 70, 71, 70, 71, 70, 71, - 70, 71, 70, 71, 70, 71, 70, 71, - 70, 71, 70, 71, 70, 71, 70, 71, + 116, 116, 116, 116, 116, 116, 116, 116, + 116, 116, 116, 116, 116, 116, 1215, 116, + 116, 116, 116, 116, 116, 116, 116, 116, + 116, 116, 116, 1216, 1216, 1216, 1216, 1216, - 70, 71, 70, 71, 70, 71, 70, 71, - 70, 71, 70, 71, 70, 71, 70, 71, - 70, 71, 70, 71, 70, 71, 1229, 1230, - 1231, 1232, 1233, 1234, 1235, 1235, 1236, 1235, + 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, + 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, + 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, + 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1217, - 70, 71, 70, 71, 70, 71, 70, 71, - 70, 71, 70, 71, 70, 71, 70, 71, - 70, 71, 70, 71, 70, 71, 70, 71, - 70, 71, 1237, 1238, 1237, 1238, 1237, 1238, + 192, 192, 191, 192, 1218, 1218, 1218, 1218, + 1218, 1218, 1219, 1220, 1220, 1221, 1222, 1223, + 1224, 1220, 1220, 1220, 1220, 1220, 1220, 1220, + 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, + + 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1107, + 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, + 1107, 1107, 1107, 1107, 1107, 1107, 1225, 1226, + 1226, 1227, 203, 1228, 1229, 1200, 1218, 1219, + + 71, 72, 71, 72, 71, 72, 71, 72, + 71, 72, 71, 72, 71, 72, 71, 72, + 71, 72, 71, 72, 71, 72, 71, 72, + 71, 72, 71, 72, 71, 72, 71, 72, + + 71, 72, 71, 72, 71, 72, 71, 72, + 71, 72, 71, 72, 71, 72, 71, 72, + 71, 72, 71, 72, 71, 72, 1230, 1231, + 1232, 1233, 1234, 1235, 1236, 1236, 1237, 1236, + + 71, 72, 71, 72, 71, 72, 71, 72, + 71, 72, 71, 72, 71, 72, 71, 72, + 71, 72, 71, 72, 71, 72, 71, 72, + 71, 72, 1238, 1239, 1238, 1239, 1238, 1239, - 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, - 1239, 1239, 1239, 1239, 1239, 1239, 202, 202, - 1240, 1240, 1240, 1240, 1240, 1240, 202, 202, + 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, + 1240, 1240, 1240, 1240, 1240, 1240, 203, 203, + 1241, 1241, 1241, 1241, 1241, 1241, 203, 203, - 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, - 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, + 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, - 1239, 1239, 1239, 1239, 1239, 1239, 202, 202, - 1240, 1240, 1240, 1240, 1240, 1240, 202, 202, - 1241, 1239, 1242, 1239, 1243, 1239, 1244, 1239, - 202, 1240, 202, 1240, 202, 1240, 202, 1240, + 1240, 1240, 1240, 1240, 1240, 1240, 203, 203, + 1241, 1241, 1241, 1241, 1241, 1241, 203, 203, + 1242, 1240, 1243, 1240, 1244, 1240, 1245, 1240, + 203, 1241, 203, 1241, 203, 1241, 203, 1241, - 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, - 1245, 1246, 1247, 1248, 1247, 1248, 1249, 1250, - 1251, 1252, 1253, 1254, 1255, 1256, 202, 202, + 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, + 1246, 1247, 1248, 1249, 1248, 1249, 1250, 1251, + 1252, 1253, 1254, 1255, 1256, 1257, 203, 203, - 1257, 1258, 1259, 1260, 1261, 1262, 1263, 1264, - 1265, 1266, 1267, 1268, 1269, 1270, 1271, 1272, - 1273, 1274, 1275, 1276, 1277, 1278, 1279, 1280, - 1281, 1282, 1283, 1284, 1285, 1286, 1287, 1288, + 1258, 1259, 1260, 1261, 1262, 1263, 1264, 1265, + 1266, 1267, 1268, 1269, 1270, 1271, 1272, 1273, + 1274, 1275, 1276, 1277, 1278, 1279, 1280, 1281, + 1282, 1283, 1284, 1285, 1286, 1287, 1288, 1289, - 1289, 1290, 1291, 1292, 1293, 1294, 1295, 1296, - 1297, 1298, 1299, 1300, 1301, 1302, 1303, 1304, - 1239, 1239, 1305, 1306, 1307, 202, 1308, 1309, - 1240, 1240, 1310, 1311, 1312, 207, 1313, 207, + 1290, 1291, 1292, 1293, 1294, 1295, 1296, 1297, + 1298, 1299, 1300, 1301, 1302, 1303, 1304, 1305, + 1240, 1240, 1306, 1307, 1308, 203, 1309, 1310, + 1241, 1241, 1311, 1312, 1313, 208, 1314, 208, - 207, 1314, 1315, 1316, 1317, 202, 1318, 1319, - 1320, 1321, 1320, 1321, 1322, 1314, 1314, 1314, - 1239, 1239, 1323, 1324, 202, 202, 1325, 1326, - 1240, 1240, 1327, 1328, 202, 1314, 1314, 1314, + 208, 1315, 1316, 1317, 1318, 203, 1319, 1320, + 1321, 1322, 1321, 1322, 1323, 1315, 1315, 1315, + 1240, 1240, 1324, 1325, 203, 203, 1326, 1327, + 1241, 1241, 1328, 1329, 203, 1315, 1315, 1315, - 1239, 1239, 1329, 1330, 1331, 1332, 1333, 1334, - 1240, 1240, 1335, 1336, 1337, 1314, 1338, 1338, - 202, 202, 1339, 1340, 1341, 202, 1342, 1343, - 1344, 1345, 1346, 1347, 1348, 1349, 207, 202, + 1240, 1240, 1330, 1331, 1332, 1333, 1334, 1335, + 1241, 1241, 1336, 1337, 1338, 1315, 1339, 1339, + 203, 203, 1340, 1341, 1342, 203, 1343, 1344, + 1345, 1346, 1347, 1348, 1349, 1350, 208, 203, - 1350, 1350, 1351, 1351, 1351, 1351, 1351, 1352, - 1351, 1351, 1351, 1353, 1354, 1355, 1356, 1357, - 1358, 1359, 1358, 1360, 1361, 1362, 14, 1363, - 1364, 1365, 1366, 1367, 1367, 1368, 1366, 1367, + 1351, 1351, 1352, 1352, 1352, 1352, 1352, 1353, + 1352, 1352, 1352, 1354, 1355, 1356, 1357, 1358, + 1359, 1360, 1359, 1361, 1362, 1363, 14, 1364, + 1365, 1366, 1367, 1368, 1368, 1369, 1367, 1368, - 14, 14, 14, 14, 1369, 1370, 1370, 1371, - 1372, 1373, 1374, 1375, 1376, 1377, 1378, 1379, - 13, 13, 13, 1380, 1380, 1381, 1382, 1382, - 14, 1383, 1384, 14, 1385, 1386, 1363, 43, + 14, 14, 14, 14, 1370, 1371, 1371, 1372, + 1373, 1374, 1375, 1376, 1377, 1378, 1379, 1380, + 13, 13, 13, 1381, 1381, 1382, 1383, 1383, + 14, 1384, 1385, 14, 1386, 1387, 1364, 43, - 43, 14, 14, 14, 1387, 16, 1388, 1389, - 1390, 1390, 1391, 1391, 1391, 1391, 1392, 1392, - 1392, 1392, 1393, 1394, 1395, 1396, 1397, 1398, - 1397, 1397, 1397, 1397, 1396, 1397, 1397, 1399, + 43, 14, 14, 14, 1388, 16, 1389, 1390, + 1391, 1392, 1393, 1393, 1393, 1393, 1394, 1394, + 1394, 1394, 1395, 1396, 1397, 1398, 1399, 1400, + 1399, 1399, 1399, 1399, 1398, 1399, 1399, 1401, - 1400, 1401, 1401, 1401, 1402, 1403, 1404, 1405, - 1406, 1407, 1408, 1408, 1408, 1408, 1408, 1408, - 1409, 1410, 202, 202, 1411, 1412, 1413, 1414, - 1415, 1416, 1417, 1417, 1418, 1419, 1420, 160, + 1402, 1403, 1403, 1403, 1404, 1405, 1406, 1407, + 1408, 1409, 1410, 1410, 1410, 1410, 1410, 1410, + 1411, 1412, 203, 203, 1413, 1414, 1415, 1416, + 1417, 1418, 1419, 1419, 1420, 1421, 1422, 161, - 1409, 63, 58, 59, 1411, 1412, 1413, 1414, - 1415, 1416, 1417, 1417, 1418, 1419, 1420, 202, - 1215, 1215, 1215, 1215, 1215, 1421, 1421, 1421, - 1421, 1421, 1421, 1421, 1421, 202, 202, 202, + 1411, 64, 59, 60, 1413, 1414, 1415, 1416, + 1417, 1418, 1419, 1419, 1420, 1421, 1422, 203, + 1216, 1216, 1216, 1216, 1216, 1423, 1423, 1423, + 1423, 1423, 1423, 1423, 1423, 203, 203, 203, 12, 12, 12, 12, 12, 12, 12, 50, - 1422, 12, 12, 1423, 1424, 1425, 1425, 1425, - 1426, 1426, 1427, 1427, 1427, 1427, 1428, 1429, - 1429, 1430, 1431, 1432, 1433, 1433, 1434, 1435, + 1424, 12, 12, 1425, 1426, 1427, 1427, 1427, + 1428, 1428, 1429, 1429, 1429, 1429, 1430, 1431, + 1431, 1432, 1433, 1434, 1435, 1435, 1436, 1437, - 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, - 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, - 173, 173, 180, 180, 173, 173, 173, 173, - 180, 180, 180, 173, 173, 1437, 1437, 1437, + 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, + 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, + 174, 174, 181, 181, 174, 174, 174, 174, + 181, 181, 181, 174, 174, 1439, 1439, 1439, - 1437, 173, 1438, 1438, 1439, 1440, 1440, 197, - 1441, 197, 1440, 1442, 1218, 1218, 1218, 1218, - 1219, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, + 1439, 174, 1440, 1440, 1441, 1442, 1442, 198, + 1443, 198, 1442, 1444, 1219, 1219, 1219, 1219, + 1220, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, - 1443, 1443, 1444, 1445, 51, 1443, 1443, 1444, - 51, 1445, 1446, 1444, 1444, 1444, 1446, 1446, - 1444, 1444, 1444, 1446, 51, 1444, 1447, 51, - 36, 1444, 1444, 1444, 1444, 1444, 51, 51, + 1445, 1445, 1446, 1447, 51, 1445, 1445, 1446, + 51, 1447, 1448, 1446, 1446, 1446, 1448, 1448, + 1446, 1446, 1446, 1448, 51, 1446, 1449, 51, + 36, 1446, 1446, 1446, 1446, 1446, 51, 51, - 1443, 1443, 1443, 51, 1444, 51, 1448, 51, - 1444, 51, 1449, 1450, 1444, 1444, 1451, 1446, - 1444, 1444, 1452, 1444, 1446, 1453, 1453, 1453, - 1453, 1454, 1455, 1456, 1457, 1458, 1459, 1459, + 1445, 1445, 1450, 51, 1446, 51, 1451, 51, + 1446, 51, 1452, 1453, 1446, 1446, 1454, 1448, + 1446, 1446, 1455, 1446, 1448, 1456, 1456, 1456, + 1456, 1457, 1458, 1459, 1460, 1461, 1462, 1462, - 1460, 1393, 1393, 1393, 1393, 1459, 1458, 1458, - 1458, 1458, 1461, 1393, 1462, 1463, 1464, 1465, - 1466, 1466, 1466, 65, 65, 65, 65, 65, - 65, 65, 65, 65, 65, 65, 65, 65, + 1463, 1395, 1395, 1395, 1395, 1462, 1461, 1461, + 1461, 1461, 1464, 1395, 1465, 1466, 1467, 1468, + 1469, 1469, 1469, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, - 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, - 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, - 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, - 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, + 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, + 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, + 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, + 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, - 1469, 1469, 1469, 111, 123, 1470, 1470, 1470, - 1470, 1466, 1471, 1471, 202, 202, 202, 202, - 36, 36, 36, 36, 36, 51, 51, 51, - 51, 51, 1472, 1472, 51, 51, 51, 51, + 1472, 1472, 1472, 112, 124, 1473, 1473, 1473, + 1473, 1469, 1474, 1474, 203, 203, 203, 203, + 36, 36, 36, 36, 1475, 53, 53, 53, + 53, 53, 1476, 1476, 51, 51, 51, 51, 36, 51, 51, 36, 51, 51, 36, 51, - 51, 51, 51, 51, 51, 51, 1472, 51, + 51, 53, 53, 51, 51, 51, 1476, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, - 51, 51, 51, 51, 51, 1473, 1472, 1472, + 51, 51, 51, 51, 51, 1477, 1476, 1476, 51, 51, 36, 51, 36, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, - 51, 51, 51, 1455, 1455, 1455, 1455, 1455, - 1455, 1455, 1455, 1455, 1393, 1393, 1393, 1393, - 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, + 51, 51, 51, 1458, 1458, 1458, 1458, 1458, + 1458, 1458, 1458, 1458, 1395, 1395, 1395, 1395, + 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, - 36, 36, 36, 36, 1472, 36, 36, 36, - 1474, 1475, 1474, 1476, 1477, 1476, 36, 36, - 36, 36, 18, 57, 36, 1478, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 1479, + 36, 36, 36, 36, 1476, 36, 36, 36, + 1478, 1479, 1478, 1480, 1481, 1480, 36, 36, + 36, 36, 18, 58, 36, 1482, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 1483, - 1480, 1481, 1482, 36, 1483, 36, 1472, 36, - 36, 36, 36, 36, 1418, 1418, 36, 1418, - 1418, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 1484, 1485, 36, 36, + 1484, 1485, 1486, 36, 1487, 36, 1476, 36, + 36, 36, 36, 36, 1420, 1420, 36, 1420, + 1420, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 1488, 1489, 36, 36, - 36, 1472, 36, 1486, 1472, 1487, 36, 1472, - 36, 1472, 36, 36, 1488, 36, 36, 36, - 36, 36, 1484, 1485, 1484, 1485, 36, 36, + 36, 1476, 36, 1490, 1476, 1491, 36, 1476, + 36, 1476, 36, 36, 1492, 36, 36, 36, + 36, 36, 1488, 1489, 1488, 1489, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 1472, 36, 1472, 36, 1484, 1485, 1484, 1485, - 1484, 1485, 1484, 1485, 36, 1472, 1489, 1490, - 1489, 1490, 1484, 1485, 1489, 1490, 1484, 1485, - 1489, 1490, 1484, 1485, 1484, 1485, 1484, 1485, + 1476, 36, 1476, 36, 1488, 1489, 1488, 1489, + 1488, 1489, 1488, 1489, 36, 1476, 1493, 1494, + 1493, 1494, 1488, 1489, 1493, 1494, 1488, 1489, + 1493, 1494, 1488, 1489, 1488, 1489, 1488, 1489, - 1489, 1490, 1484, 1485, 1489, 1490, 1484, 1485, - 1489, 1490, 1484, 1485, 36, 36, 36, 1484, - 1485, 1484, 1485, 36, 36, 36, 36, 36, - 1491, 36, 36, 36, 36, 36, 36, 36, - - 36, 36, 1484, 1485, 36, 36, 1492, 36, - 1493, 1494, 36, 1494, 1472, 1472, 1472, 1472, - 1484, 1485, 1484, 1485, 1484, 1485, 1484, 1485, + 1493, 1494, 1488, 1489, 1493, 1494, 1488, 1489, + 1493, 1494, 1488, 1489, 36, 36, 36, 1488, + 1489, 1488, 1489, 36, 36, 36, 36, 36, 1495, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 1488, 1489, 36, 36, 1496, 36, + 1497, 1498, 36, 1498, 1476, 1476, 1476, 1476, + 1488, 1489, 1488, 1489, 1488, 1489, 1488, 1489, + 1499, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, - 36, 1484, 1485, 1484, 1485, 1496, 36, 36, - 1484, 1485, 36, 36, 36, 36, 1484, 1485, - 1484, 1485, 1484, 1485, 1484, 1485, 1484, 1485, + 36, 1488, 1489, 1488, 1489, 1500, 36, 36, + 1488, 1489, 36, 36, 36, 36, 1488, 1489, + 1488, 1489, 1488, 1489, 1488, 1489, 1488, 1489, - 1489, 1490, 1489, 1490, 1484, 1485, 1484, 1485, - 1484, 1485, 1489, 1490, 1489, 1490, 36, 1497, - 1484, 1485, 1498, 1498, 1498, 1393, 1499, 1499, - 1393, 1393, 1500, 1500, 1500, 1501, 1501, 1393, + 1493, 1494, 1493, 1494, 1488, 1489, 1488, 1489, + 1488, 1489, 1493, 1494, 1493, 1494, 36, 1501, + 1488, 1489, 1502, 1502, 1502, 1395, 1503, 1503, + 1395, 1395, 1504, 1504, 1504, 1505, 1505, 1395, - 51, 1455, 51, 51, 51, 51, 51, 51, - 16, 1388, 16, 1388, 51, 51, 51, 51, + 51, 1458, 51, 51, 51, 51, 51, 51, + 16, 1389, 16, 1389, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, - 51, 51, 1502, 1502, 51, 51, 51, 51, + 51, 51, 1506, 1506, 51, 51, 51, 51, 36, 36, 51, 51, 51, 51, 51, 51, - 51, 1503, 1504, 51, 51, 51, 51, 51, - 51, 51, 51, 51, 51, 51, 1505, 1505, - 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, + 53, 1507, 1508, 51, 51, 51, 51, 51, + 51, 51, 51, 51, 51, 51, 1509, 1509, + 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, - 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, - 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, - 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, - 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, + 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, + 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, + 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, + 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, - 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, - 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, - 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, - 1505, 1505, 1505, 1455, 1393, 1455, 1455, 1455, + 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, + 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, + 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, + 1509, 1509, 1509, 1458, 1395, 1458, 1458, 1458, - 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, - 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, - 1455, 1455, 1455, 1455, 1455, 1506, 1455, 1455, - 1455, 1455, 1455, 1393, 1393, 1393, 1393, 1393, + 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, + 1510, 1458, 1458, 1458, 1458, 1458, 1458, 1458, + 1458, 1458, 1458, 1458, 1458, 1511, 1458, 1458, + 1458, 1458, 1458, 1395, 1395, 1395, 1395, 1395, - 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, - 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, - 1393, 1393, 1393, 1393, 1461, 1461, 1461, 1461, - 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, + 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, + 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, + 1395, 1395, 1395, 1395, 1464, 1464, 1464, 1464, + 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, - 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, - 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1507, - 1507, 1462, 1462, 1462, 1462, 1462, 1462, 1462, - 1462, 1462, 1462, 1462, 1508, 1508, 1508, 1508, + 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, + 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1512, + 1513, 1465, 1465, 1465, 1465, 1465, 1465, 1465, + 1465, 1465, 1465, 1465, 1514, 1514, 1514, 1514, - 1508, 1508, 1463, 1463, 1463, 1463, 1463, 1463, - 1509, 1510, 1510, 1510, 1510, 1510, 1510, 1510, - 1511, 1511, 1511, 1511, 1512, 1512, 1512, 1512, - 1512, 1512, 1512, 1513, 1513, 1513, 1513, 1514, + 1514, 1514, 1466, 1466, 1466, 1466, 1466, 1466, + 1515, 1516, 1516, 1516, 1516, 1516, 1516, 1516, + 1517, 1517, 1517, 1517, 1518, 1518, 1518, 1518, + 1519, 1519, 1519, 1520, 1520, 1520, 1520, 1521, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, - 51, 51, 51, 51, 51, 1455, 1455, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, + 51, 51, 51, 51, 51, 1458, 1458, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, 51, 51, 51, 51, 51, 51, 51, 51, - 51, 51, 51, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, + 51, 51, 51, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, - 1515, 1516, 1517, 1518, 1519, 1520, 1521, 1522, - 1523, 65, 65, 65, 65, 65, 65, 65, - 65, 65, 65, 65, 1515, 1516, 1517, 1518, - 1519, 1520, 1521, 1522, 1523, 65, 65, 65, + 1522, 1523, 1524, 1525, 1526, 1527, 1528, 1529, + 1530, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 1522, 1523, 1524, 1525, + 1526, 1527, 1528, 1529, 1530, 66, 66, 66, - 65, 65, 65, 65, 65, 65, 65, 65, - 63, 58, 59, 1411, 1412, 1413, 1414, 1415, - 1416, 1524, 1524, 1524, 1524, 1524, 1524, 1524, - 1524, 1524, 1524, 1524, 1525, 1525, 1525, 1525, + 66, 66, 66, 66, 66, 66, 66, 66, + 64, 59, 60, 1413, 1414, 1415, 1416, 1417, + 1418, 1531, 1531, 1531, 1531, 1531, 1531, 1531, + 1531, 1531, 1531, 1531, 1532, 1532, 1532, 1532, - 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, - 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, - 1525, 1525, 1525, 1525, 1525, 1525, 1526, 1526, - 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, + 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, + 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, + 1532, 1532, 1532, 1532, 1532, 1532, 1533, 1533, + 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, - 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, - 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, - 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, - 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, + 1533, 1533, 1534, 1533, 1533, 1533, 1533, 1533, + 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, + 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, + 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, - 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, - 1527, 1527, 1528, 1529, 1529, 1529, 1529, 1529, - 1529, 1529, 1529, 1529, 1529, 1530, 1531, 1532, - 1533, 1534, 1535, 1536, 1537, 1538, 1529, 1539, + 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, + 1535, 1535, 1536, 1537, 1537, 1537, 1537, 1537, + 1537, 1537, 1537, 1537, 1537, 1538, 1539, 1540, + 1541, 1542, 1543, 1544, 1545, 1546, 1537, 1547, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, - 51, 51, 51, 51, 51, 51, 1461, 1461, - 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, + 51, 51, 51, 51, 51, 51, 1464, 1464, + 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 51, 51, 51, 51, 51, 51, 51, 51, - 51, 51, 51, 51, 51, 51, 51, 51, - 51, 51, 51, 51, 51, 51, 51, 36, + 51, 51, 53, 53, 51, 51, 51, 51, + 51, 51, 51, 51, 51, 51, 53, 36, 51, 51, 51, 51, 51, 51, 51, 51, - 51, 36, 51, 51, 51, 51, 51, 51, + 53, 36, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, - 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, - 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, + 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, + 1395, 1395, 1395, 1548, 1548, 1548, 1548, 1395, - 1502, 1502, 1502, 1502, 51, 51, 51, 51, - 51, 51, 51, 51, 51, 51, 51, 51, - 51, 51, 51, 51, 1540, 1540, 1461, 1461, - 1541, 1455, 1502, 1502, 1502, 1542, 1502, 1502, + 1506, 1506, 1506, 1506, 53, 53, 51, 53, + 53, 53, 53, 53, 53, 53, 53, 53, + 53, 53, 53, 51, 1549, 1549, 1550, 1550, + 1551, 1510, 1506, 1506, 1506, 1552, 1506, 1506, - 51, 51, 51, 51, 51, 51, 51, 51, - 51, 51, 51, 51, 51, 51, 51, 51, - 51, 51, 51, 51, 51, 51, 51, 51, - 51, 1502, 1502, 1502, 51, 51, 51, 51, + 53, 53, 53, 53, 53, 53, 53, 53, + 53, 53, 53, 53, 53, 53, 53, 53, + 53, 53, 53, 53, 53, 53, 53, 53, + 53, 1506, 1506, 1506, 53, 53, 53, 53, - 51, 51, 51, 51, 51, 51, 51, 51, - 1502, 51, 51, 51, 51, 51, 51, 36, - 1455, 1455, 1461, 1461, 1461, 1461, 1461, 1461, - 1461, 1461, 1461, 1461, 1461, 1461, 1462, 1541, + 53, 53, 53, 53, 53, 53, 53, 53, + 53, 53, 53, 53, 53, 53, 53, 53, + 53, 53, 53, 53, 53, 53, 53, 53, + 53, 53, 53, 53, 53, 53, 53, 53, - 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, - 1461, 1461, 1507, 1507, 1507, 1507, 1507, 1507, - 1507, 1507, 1462, 1462, 1462, 1462, 1462, 1462, - 1462, 1462, 1462, 1462, 1462, 1543, 1509, 1509, + 53, 53, 53, 53, 53, 53, 53, 53, + 1506, 53, 53, 53, 53, 53, 53, 1475, + 1510, 1510, 1550, 1550, 1550, 1550, 1550, 1550, + 1550, 1550, 1550, 1550, 1550, 1550, 1553, 1551, - 1507, 1507, 1462, 1462, 1462, 1462, 1462, 1462, - 1462, 1462, 1462, 1462, 1544, 1462, 1462, 1462, - 1462, 1462, 1463, 1543, 1543, 1543, 1543, 1543, - 1543, 1543, 1543, 1543, 1543, 1545, 1545, 1545, + 1550, 1550, 1550, 1550, 1550, 1550, 1464, 1464, + 1464, 1464, 1513, 1513, 1513, 1513, 1513, 1513, + 1512, 1512, 1553, 1553, 1553, 1553, 1553, 1553, + 1553, 1553, 1553, 1553, 1553, 1554, 1555, 1555, - 1546, 1546, 1546, 1546, 1545, 1545, 1545, 1545, - 1545, 1509, 1509, 1509, 1509, 1545, 1510, 1545, - 1545, 1545, 1509, 1545, 1545, 1509, 1509, 1509, - 1545, 1545, 1509, 1509, 1545, 1509, 1509, 1545, + 1512, 1512, 1553, 1553, 1553, 1553, 1553, 1553, + 1553, 1553, 1553, 1553, 1556, 1553, 1553, 1553, + 1553, 1553, 1557, 1554, 1554, 1554, 1554, 1554, + 1554, 1554, 1554, 1554, 1554, 1558, 1558, 1558, - 1545, 1545, 1510, 1509, 1510, 1510, 1510, 1510, - 1509, 1509, 1545, 1509, 1509, 1509, 1509, 1509, - 1509, 1545, 1545, 1545, 1545, 1545, 1509, 1545, - 1545, 1547, 1545, 1509, 1509, 1545, 1545, 1545, + 1559, 1559, 1559, 1559, 1558, 1558, 1558, 1558, + 1558, 1555, 1555, 1555, 1555, 1558, 1516, 1558, + 1558, 1558, 1555, 1558, 1558, 1555, 1555, 1555, + 1558, 1558, 1555, 1555, 1558, 1555, 1555, 1558, - 1548, 1502, 1502, 1502, 1502, 1510, 51, 51, - 1502, 1502, 1549, 1549, 1542, 1542, 51, 51, - 51, 51, 51, 51, 51, 51, 51, 51, + 1558, 1558, 1516, 1555, 1516, 1516, 1516, 1516, + 1555, 1555, 1558, 1555, 1555, 1555, 1555, 1555, + 1555, 1558, 1558, 1558, 1558, 1558, 1555, 1558, + 1558, 1560, 1558, 1555, 1555, 1558, 1558, 1558, + + 1561, 1506, 1506, 1506, 1506, 1516, 51, 51, + 1506, 1506, 1562, 1562, 1552, 1552, 53, 53, + 53, 53, 53, 51, 53, 51, 53, 51, + 51, 51, 51, 51, 51, 53, 51, 51, + + 51, 53, 51, 51, 51, 51, 51, 51, + 1516, 51, 51, 51, 51, 51, 51, 51, + 51, 51, 51, 53, 53, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, - 51, 51, 51, 51, 51, 51, 51, 51, - 1510, 51, 51, 51, 51, 51, 51, 51, - 51, 51, 51, 51, 51, 51, 51, 51, + 51, 51, 51, 51, 53, 51, 51, 53, + 51, 51, 51, 51, 1516, 51, 1516, 51, + 51, 51, 51, 1516, 1516, 1516, 51, 1555, + 51, 51, 51, 1563, 1563, 1563, 1563, 1564, + + 1564, 51, 1565, 1566, 1506, 53, 53, 53, + 1567, 1568, 1567, 1568, 1567, 1568, 1567, 1568, + 1567, 1568, 1567, 1568, 1567, 1568, 1569, 1570, + 1571, 1572, 1573, 1574, 1575, 1576, 1577, 1578, + + 1569, 1570, 1571, 1572, 1573, 1574, 1575, 1576, + 1577, 1578, 1569, 1570, 1571, 1572, 1573, 1574, + 1575, 1576, 1577, 1578, 51, 1516, 1516, 1516, 51, 51, 51, 51, 51, 51, 51, 51, + 51, 53, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, - 51, 51, 51, 51, 1510, 51, 1510, 51, - 51, 51, 51, 1510, 1510, 1510, 51, 1509, - 51, 51, 51, 1550, 1550, 1550, 1550, 1551, - - 1551, 51, 1552, 1552, 1502, 51, 51, 51, - 1553, 1554, 1553, 1554, 1553, 1554, 1553, 1554, - 1553, 1554, 1553, 1554, 1553, 1554, 1555, 1556, - 1557, 1558, 1559, 1560, 1561, 1562, 1563, 1564, - - 1555, 1556, 1557, 1558, 1559, 1560, 1561, 1562, - 1563, 1564, 1555, 1556, 1557, 1558, 1559, 1560, - 1561, 1562, 1563, 1564, 51, 1510, 1510, 1510, - 51, 51, 51, 51, 51, 51, 51, 51, - - 51, 51, 51, 51, 51, 51, 51, 51, - 51, 51, 51, 51, 51, 51, 51, 51, - 1510, 51, 51, 51, 51, 51, 51, 51, - 51, 51, 51, 51, 51, 51, 51, 1510, - - 1565, 1565, 1565, 1566, 1567, 1568, 1569, 1508, - 1570, 1571, 1508, 1572, 1573, 1574, 1575, 1575, - 1393, 1393, 1393, 1393, 1393, 1576, 1577, 1393, - 1393, 1393, 1393, 1393, 1578, 1576, 1577, 1393, - - 1393, 1393, 1576, 1577, 1576, 1577, 1553, 1554, - 1553, 1554, 1553, 1554, 1579, 1580, 1579, 1580, - 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, - 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, - - 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, - 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, - 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, - 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, - - 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, - 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, - 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, - 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, - - 1393, 1393, 1393, 1553, 1554, 1553, 1554, 1553, - 1554, 1553, 1554, 1553, 1554, 1582, 1583, 1584, - 1585, 1553, 1554, 1553, 1554, 1553, 1554, 1553, - 1554, 1393, 1393, 1586, 1393, 1393, 1393, 1393, - - 1587, 1393, 1393, 1588, 1576, 1577, 1393, 1393, - 1576, 1577, 1576, 1577, 1576, 1577, 1576, 1577, - 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, - 1589, 1393, 1393, 1393, 1393, 1393, 1393, 1393, - - 1576, 1577, 1393, 1393, 1576, 1577, 1393, 1393, - 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1576, - 1577, 1576, 1577, 1393, 1576, 1577, 1393, 1393, - 1553, 1554, 1553, 1554, 1393, 1393, 1393, 1393, - - 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, - 1576, 1577, 1393, 1393, 1393, 1393, 1393, 1393, - 1393, 1393, 1393, 1393, 1393, 1590, 1393, 1393, - 1576, 1577, 1393, 1393, 1553, 1554, 1393, 1393, - - 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, - 1393, 1393, 1393, 1393, 1460, 1393, 1393, 1393, - 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, - 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, - - 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, - 1393, 1393, 1393, 1576, 1577, 1576, 1577, 1393, - 1393, 1393, 1393, 1393, 1576, 1577, 1393, 1393, - 1393, 1393, 1393, 1393, 1576, 1577, 1393, 1393, - - 1393, 1393, 1393, 1393, 1576, 1577, 1393, 1393, - 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, - 1393, 1393, 1393, 1393, 1460, 1460, 1460, 1393, - 1393, 1576, 1577, 1576, 1577, 1576, 1577, 1576, - - 1577, 1576, 1577, 1576, 1577, 1576, 1577, 1576, - 1577, 1576, 1577, 1576, 1577, 1576, 1577, 1576, - 1577, 1576, 1577, 1576, 1577, 1576, 1577, 1576, - 1577, 1576, 1577, 1576, 1577, 1576, 1577, 1576, - - 1577, 1576, 1577, 1393, 1393, 1393, 1576, 1577, - 1576, 1577, 1576, 1577, 1576, 1577, 1393, 1576, - 1577, 1576, 1577, 1576, 1577, 1576, 1577, 1576, - 1577, 1576, 1577, 1576, 1577, 1576, 1577, 1576, - - 1577, 1576, 1577, 1576, 1577, 1576, 1577, 1576, - 1577, 1576, 1577, 1576, 1577, 1576, 1577, 1576, - 1577, 1576, 1577, 1576, 1577, 1576, 1577, 1393, - 1393, 1393, 1393, 1393, 1591, 1393, 1592, 1393, - - 1393, 1393, 1393, 1593, 1594, 1593, 1393, 1393, - 1393, 1393, 1393, 1393, 1576, 1577, 1595, 1393, - 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1576, - 1577, 1576, 1577, 1393, 1393, 1393, 1393, 1393, - - 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, - 1507, 1507, 1507, 1507, 1507, 1507, 1462, 1462, - 1462, 1462, 1462, 1462, 1463, 1463, 1463, 1463, - 1463, 1463, 1463, 1543, 1543, 1543, 1543, 1543, - - 1463, 1463, 1463, 1463, 1543, 1543, 1543, 1543, - 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, - 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, - 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, - - 1573, 1573, 1573, 1573, 1573, 1543, 1543, 1573, - 1573, 1573, 1573, 1573, 1573, 1512, 1512, 1512, - 1543, 1543, 1543, 1543, 1543, 1509, 1509, 1509, - 1509, 1509, 1512, 1512, 1512, 1512, 1512, 1512, - - 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, - 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, - 1512, 1512, 1512, 1512, 202, 202, 1512, 1512, - 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, - - 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, - 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, - 1512, 1512, 1512, 1512, 1512, 1512, 202, 1596, - 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, - - 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, - 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, - 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, - 1512, 1512, 1597, 1597, 1597, 1512, 1512, 1512, - - 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, - 1512, 1598, 1512, 1512, 1512, 1512, 1512, 1512, - 1512, 1512, 1514, 1597, 1597, 1597, 1597, 1597, - 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, - - 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, - 1597, 1597, 1597, 1597, 1471, 1471, 1471, 1471, - 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, - 1597, 1597, 1597, 1597, 1597, 1597, 1599, 1598, - - 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, - 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, - 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, - 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, - - 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, - 1600, 1600, 1600, 1600, 1600, 1600, 1600, 202, - 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, - 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, - - 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, - 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, - 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, - 1601, 1601, 1601, 1601, 1601, 1601, 1601, 202, - - 127, 123, 1602, 1603, 1604, 1605, 1606, 127, - 123, 127, 123, 127, 123, 1607, 1608, 1609, - 1610, 1235, 1237, 1238, 1611, 127, 123, 1611, - 1235, 1235, 1235, 1235, 1612, 1612, 1613, 1614, - - 1615, 1616, 1615, 1616, 1615, 1616, 1615, 1616, - 1615, 1616, 1615, 1616, 1615, 1616, 1615, 1616, - 1615, 1616, 1615, 1616, 1615, 1616, 1615, 1616, - 1615, 1616, 1615, 1616, 1615, 1616, 1615, 1616, - - 1615, 1616, 1615, 1616, 1617, 1618, 1618, 1618, - 1618, 1618, 1618, 1619, 1620, 1619, 1620, 1621, - 1621, 1621, 1622, 1623, 202, 202, 202, 202, - 202, 1624, 1625, 1625, 1625, 1626, 1624, 1625, - - 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, - 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, - 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, - 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, - - 1627, 1627, 1627, 1627, 1627, 1627, 202, 1628, - 202, 202, 202, 202, 202, 1628, 202, 202, - 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, - 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, - - 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, - 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, - 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, - 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, - - 1629, 1629, 1629, 1629, 1629, 1629, 1630, 1630, - 202, 202, 202, 202, 202, 202, 202, 1631, - 1632, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 1633, - - 871, 871, 871, 871, 871, 871, 871, 871, - 871, 871, 871, 871, 871, 871, 871, 871, - 871, 871, 871, 871, 871, 871, 871, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - - 871, 871, 871, 871, 871, 871, 871, 202, - 871, 871, 871, 871, 871, 871, 871, 202, - 871, 871, 871, 871, 871, 871, 871, 202, - 871, 871, 871, 871, 871, 871, 871, 202, - - 267, 267, 267, 267, 267, 267, 267, 267, - 267, 267, 267, 267, 267, 267, 267, 267, - 267, 267, 267, 267, 267, 267, 267, 267, - 267, 267, 267, 267, 267, 267, 267, 267, - - 1634, 1634, 1635, 1636, 1635, 1636, 1634, 1634, - 1634, 1635, 1636, 1634, 1635, 1636, 1397, 1397, - 1397, 1397, 1397, 1397, 1397, 1397, 1396, 1637, - 1638, 1639, 1640, 1641, 1635, 1636, 1641, 1641, - - 1642, 1643, 1579, 1580, 1579, 1580, 1579, 1580, - 1579, 1580, 1639, 1639, 1639, 1639, 1644, 1645, - 1639, 1646, 1647, 1648, 1648, 1647, 1647, 1647, - 1647, 1647, 1649, 1649, 1650, 1651, 1651, 1652, - - 1653, 1651, 1654, 1655, 1655, 1656, 1656, 1656, - 1656, 1656, 1657, 1658, 1657, 1658, 1657, 1659, - 1596, 1596, 1660, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - - 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, - 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, - 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, - 1661, 1661, 202, 1661, 1661, 1661, 1661, 1662, - - 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, - 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, - 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, - 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, - - 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, - 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, - 1661, 1661, 1661, 1662, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - - 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, - 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, - 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, - 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, - - 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, - 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, - 1662, 1662, 1662, 1662, 1662, 1662, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, - 1663, 1663, 1663, 1663, 202, 202, 202, 202, - - 1351, 1664, 1665, 1666, 1502, 1667, 1668, 1669, - 16, 1388, 16, 1388, 16, 1388, 16, 1388, - 16, 1388, 1502, 1502, 16, 1388, 16, 1388, - 16, 1388, 16, 1388, 1670, 1366, 1671, 1671, - - 1502, 1669, 1669, 1669, 1669, 1669, 1669, 1669, - 1669, 1669, 1672, 1673, 174, 1674, 1675, 1675, - 1676, 1677, 1677, 1677, 1677, 1678, 1679, 1502, - 1680, 1680, 1680, 1681, 1682, 1683, 1663, 1502, - - 202, 1684, 1685, 1684, 1685, 1684, 1685, 1684, - 1685, 1684, 1685, 1685, 1686, 1685, 1686, 1685, - 1686, 1685, 1686, 1685, 1686, 1685, 1686, 1685, - 1686, 1685, 1686, 1685, 1686, 1685, 1686, 1685, - - 1686, 1685, 1686, 1684, 1685, 1686, 1685, 1686, - 1685, 1686, 1685, 1685, 1685, 1685, 1685, 1685, - 1686, 1686, 1685, 1686, 1686, 1685, 1686, 1686, - 1685, 1686, 1686, 1685, 1686, 1686, 1685, 1685, - - 1685, 1685, 1685, 1684, 1685, 1684, 1685, 1684, - 1685, 1685, 1685, 1685, 1685, 1685, 1684, 1685, - 1685, 1685, 1685, 1685, 1686, 1687, 1687, 202, - 202, 1688, 1688, 1689, 1689, 1690, 1691, 1692, - - 1693, 1694, 1695, 1694, 1695, 1694, 1695, 1694, - 1695, 1694, 1695, 1695, 1696, 1695, 1696, 1695, - 1696, 1695, 1696, 1695, 1696, 1695, 1696, 1695, - 1696, 1695, 1696, 1695, 1696, 1695, 1696, 1695, - - 1696, 1695, 1696, 1694, 1695, 1696, 1695, 1696, - 1695, 1696, 1695, 1695, 1695, 1695, 1695, 1695, - 1696, 1696, 1695, 1696, 1696, 1695, 1696, 1696, - 1695, 1696, 1696, 1695, 1696, 1696, 1695, 1695, - - 1695, 1695, 1695, 1694, 1695, 1694, 1695, 1694, - 1695, 1695, 1695, 1695, 1695, 1695, 1694, 1695, - 1695, 1695, 1695, 1695, 1696, 1694, 1694, 1696, - 1696, 1696, 1696, 1697, 1698, 1699, 1700, 1701, - - 202, 202, 202, 202, 202, 1702, 1702, 1702, - 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, - 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, - 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, - - 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, - 1702, 1702, 1702, 1702, 1702, 1703, 1704, 1705, - 202, 1706, 1706, 1706, 1706, 1706, 1706, 1706, - 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, - - 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, - 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, - 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, - 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, - - 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, - 1706, 1706, 1706, 1706, 1706, 1706, 1706, 202, - 1707, 1707, 1708, 1708, 1708, 1708, 1709, 1709, - 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, - - 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, - 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, - 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, - 1711, 1711, 1711, 1712, 1712, 1712, 1712, 1712, - - 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, - 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, - 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, - 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, - - 1546, 1546, 1546, 1546, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, - 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, - - 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, - 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, - 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, - 1714, 1714, 1714, 1714, 1714, 1715, 1715, 202, - - 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, - 1708, 1708, 1709, 1709, 1709, 1709, 1709, 1709, - 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, - 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, - - 1709, 1709, 1709, 1709, 1716, 1716, 1716, 1716, - 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, - 1718, 1719, 1719, 1719, 1719, 1719, 1719, 1719, - 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, - - 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, - 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, - 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, - 1714, 1714, 1714, 1714, 1715, 1715, 1720, 1707, - - 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, - 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, - 1709, 1719, 1719, 1719, 1719, 1719, 1719, 1719, - 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, - - 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, - 1709, 1709, 1709, 1709, 1718, 1718, 1718, 1718, - 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, - 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, - - 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, - 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, - 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, - 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1722, - - 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, - 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, - 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, - 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, - - 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, - 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, - 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, - 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, - - 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, - 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, - 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1718, - 1718, 1718, 1718, 1709, 1709, 1709, 1709, 1709, - - 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, - 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, - 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, - 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, - - 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, - 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, - 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, - 1709, 1709, 1709, 1709, 1709, 1709, 1718, 1718, - - 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, - 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, - 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, - 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1718, - - 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, - 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, - 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, - 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, - - 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, - 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, - 1723, 1723, 1723, 1723, 1723, 1723, 1724, 1724, - 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, - - 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, - 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, - 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, - 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, - - 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, - 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, - 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, + 1516, 51, 51, 51, 51, 51, 51, 51, + 51, 51, 51, 51, 51, 51, 51, 1516, + + 1579, 1579, 1579, 1580, 1581, 1582, 1583, 1514, + 1584, 1585, 1514, 1586, 1587, 1588, 1589, 1589, + 1395, 1395, 1395, 1395, 1395, 1590, 1591, 1395, + 1395, 1395, 1395, 1395, 1592, 1590, 1591, 1395, + + 1395, 1395, 1590, 1591, 1590, 1591, 1567, 1568, + 1567, 1568, 1567, 1568, 1593, 1594, 1593, 1594, + 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, + 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, + + 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, + 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, + 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, + 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, + + 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, + 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, + 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, + 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, + + 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, + 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, + 1395, 1395, 1395, 1395, 1548, 1548, 1395, 1395, + 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, + + 1395, 1395, 1395, 1567, 1568, 1567, 1568, 1567, + 1568, 1567, 1568, 1567, 1568, 1596, 1597, 1598, + 1599, 1567, 1568, 1567, 1568, 1567, 1568, 1567, + 1568, 1395, 1395, 1600, 1395, 1395, 1395, 1395, + + 1601, 1395, 1395, 1602, 1590, 1591, 1395, 1395, + 1590, 1591, 1590, 1591, 1590, 1591, 1590, 1591, + 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, + 1603, 1395, 1395, 1395, 1395, 1395, 1395, 1395, + + 1590, 1591, 1395, 1395, 1590, 1591, 1395, 1395, + 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1590, + 1591, 1590, 1591, 1395, 1590, 1591, 1395, 1395, + 1567, 1568, 1567, 1568, 1395, 1395, 1395, 1395, + + 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, + 1590, 1591, 1395, 1395, 1395, 1395, 1395, 1395, + 1395, 1395, 1395, 1395, 1395, 1604, 1395, 1395, + 1590, 1591, 1395, 1395, 1567, 1568, 1395, 1395, + + 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, + 1395, 1395, 1395, 1395, 1463, 1395, 1395, 1395, + 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, + 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, + + 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, + 1395, 1395, 1395, 1590, 1591, 1590, 1591, 1395, + 1395, 1395, 1395, 1395, 1590, 1591, 1395, 1395, + 1395, 1395, 1395, 1395, 1590, 1591, 1395, 1395, + + 1395, 1395, 1395, 1395, 1590, 1591, 1395, 1395, + 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, + 1395, 1395, 1395, 1395, 1463, 1463, 1463, 1395, + 1395, 1590, 1591, 1590, 1591, 1590, 1591, 1590, + + 1591, 1590, 1591, 1590, 1591, 1590, 1591, 1590, + 1591, 1590, 1591, 1590, 1591, 1590, 1591, 1590, + 1591, 1590, 1591, 1590, 1591, 1590, 1591, 1590, + 1591, 1590, 1591, 1590, 1591, 1590, 1591, 1590, + + 1591, 1590, 1591, 1395, 1395, 1395, 1590, 1591, + 1590, 1591, 1590, 1591, 1590, 1591, 1395, 1590, + 1591, 1590, 1591, 1590, 1591, 1590, 1591, 1590, + 1591, 1590, 1591, 1590, 1591, 1590, 1591, 1590, + + 1591, 1590, 1591, 1590, 1591, 1590, 1591, 1590, + 1591, 1590, 1591, 1590, 1591, 1590, 1591, 1590, + 1591, 1590, 1591, 1590, 1591, 1590, 1591, 1395, + 1395, 1395, 1395, 1395, 1605, 1395, 1606, 1395, + + 1395, 1395, 1395, 1607, 1608, 1607, 1395, 1395, + 1395, 1395, 1395, 1395, 1590, 1591, 1609, 1395, + 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1590, + 1591, 1590, 1591, 1395, 1395, 1395, 1395, 1395, + + 1513, 1513, 1513, 1513, 1513, 1512, 1512, 1512, + 1513, 1513, 1513, 1513, 1513, 1513, 1465, 1465, + 1465, 1465, 1465, 1465, 1466, 1466, 1466, 1466, + 1466, 1466, 1466, 1554, 1554, 1610, 1610, 1610, + + 1466, 1466, 1466, 1466, 1610, 1610, 1610, 1610, + 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, + 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, + 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, + + 1587, 1587, 1587, 1587, 1587, 1610, 1610, 1587, + 1587, 1587, 1587, 1587, 1587, 1518, 1518, 1518, + 1554, 1610, 1610, 1610, 1610, 1555, 1515, 1515, + 1515, 1515, 1518, 1518, 1518, 1518, 1518, 1518, + + 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, + 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, + 1518, 1518, 1518, 1518, 203, 203, 1518, 1518, + 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, + + 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, + 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, + 1518, 1518, 1518, 1518, 1518, 1518, 203, 1611, + 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, + + 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, + 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, + 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, + 1518, 1518, 1612, 1612, 1612, 1518, 1518, 1518, + + 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, + 1518, 1613, 1518, 1518, 1518, 1518, 1518, 1518, + 1518, 1518, 1521, 1612, 1612, 1612, 1612, 1612, + 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, + + 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, + 1612, 1612, 1612, 1612, 1474, 1474, 1474, 1474, + 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, + 1612, 1612, 1612, 1612, 1612, 1612, 1614, 1613, + + 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, + 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, + 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, + 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, + + 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, + 1615, 1615, 1615, 1615, 1615, 1615, 1615, 203, + 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, + 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, + + 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, + 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, + 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, + 1616, 1616, 1616, 1616, 1616, 1616, 1616, 203, + + 128, 124, 1617, 1618, 1619, 1620, 1621, 128, + 124, 128, 124, 128, 124, 1622, 1623, 1624, + 1625, 1236, 1238, 1239, 1626, 128, 124, 1626, + 1236, 1236, 1236, 1236, 1627, 1627, 1628, 1629, + + 1630, 1631, 1630, 1631, 1630, 1631, 1630, 1631, + 1630, 1631, 1630, 1631, 1630, 1631, 1630, 1631, + 1630, 1631, 1630, 1631, 1630, 1631, 1630, 1631, + 1630, 1631, 1630, 1631, 1630, 1631, 1630, 1631, + + 1630, 1631, 1630, 1631, 1632, 1633, 1633, 1633, + 1633, 1633, 1633, 1634, 1635, 1634, 1635, 1636, + 1636, 1636, 1637, 1638, 203, 203, 203, 203, + 203, 1639, 1640, 1640, 1640, 1641, 1639, 1640, + + 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, + 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, + 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, + 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, + + 1642, 1642, 1642, 1642, 1642, 1642, 203, 1643, + 203, 203, 203, 203, 203, 1643, 203, 203, + 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, + 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, + + 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, + 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, + 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, + 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, + + 1644, 1644, 1644, 1644, 1644, 1644, 1645, 1645, + 203, 203, 203, 203, 203, 203, 203, 1646, + 1647, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 1648, + + 872, 872, 872, 872, 872, 872, 872, 872, + 872, 872, 872, 872, 872, 872, 872, 872, + 872, 872, 872, 872, 872, 872, 872, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + + 872, 872, 872, 872, 872, 872, 872, 203, + 872, 872, 872, 872, 872, 872, 872, 203, + 872, 872, 872, 872, 872, 872, 872, 203, + 872, 872, 872, 872, 872, 872, 872, 203, + + 268, 268, 268, 268, 268, 268, 268, 268, + 268, 268, 268, 268, 268, 268, 268, 268, + 268, 268, 268, 268, 268, 268, 268, 268, + 268, 268, 268, 268, 268, 268, 268, 268, + + 1649, 1649, 1650, 1651, 1650, 1651, 1649, 1649, + 1649, 1650, 1651, 1649, 1650, 1651, 1399, 1399, + 1399, 1399, 1399, 1399, 1399, 1399, 1398, 1652, + 1653, 1654, 1655, 1656, 1650, 1651, 1656, 1656, + + 1657, 1658, 1593, 1594, 1593, 1594, 1593, 1594, + 1593, 1594, 1654, 1654, 1654, 1654, 1659, 1660, + 1654, 1661, 1662, 1663, 1663, 1662, 1662, 1662, + 1662, 1662, 1664, 1664, 1665, 1666, 1666, 1667, + + 1668, 1666, 1669, 1670, 1670, 1671, 1671, 1671, + 1671, 1671, 1672, 1673, 1672, 1673, 1672, 1674, + 1611, 1611, 1675, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + + 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, + 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, + 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, + 1676, 1676, 203, 1676, 1676, 1676, 1676, 1677, + + 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, + 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, + 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, + 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, + + 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, + 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, + 1676, 1676, 1676, 1677, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + + 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, + 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, + 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, + 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, + + 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, + 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, + 1677, 1677, 1677, 1677, 1677, 1677, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, + 1678, 1678, 1678, 1678, 203, 203, 203, 203, + + 1352, 1679, 1680, 1681, 1682, 1683, 1684, 1685, + 16, 1389, 16, 1389, 16, 1389, 16, 1389, + 16, 1389, 1682, 1682, 16, 1389, 16, 1389, + 16, 1389, 16, 1389, 1686, 1367, 1687, 1687, + + 1682, 1685, 1685, 1685, 1685, 1685, 1685, 1685, + 1685, 1685, 1688, 1689, 175, 1690, 1691, 1691, + 1692, 1693, 1693, 1693, 1693, 1694, 1695, 1682, + 1696, 1696, 1696, 1697, 1698, 1699, 1678, 1682, + + 203, 1700, 1701, 1700, 1701, 1700, 1701, 1700, + 1701, 1700, 1701, 1701, 1702, 1701, 1702, 1701, + 1702, 1701, 1702, 1701, 1702, 1701, 1702, 1701, + 1702, 1701, 1702, 1701, 1702, 1701, 1702, 1701, + + 1702, 1701, 1702, 1700, 1701, 1702, 1701, 1702, + 1701, 1702, 1701, 1701, 1701, 1701, 1701, 1701, + 1702, 1702, 1701, 1702, 1702, 1701, 1702, 1702, + 1701, 1702, 1702, 1701, 1702, 1702, 1701, 1701, + + 1701, 1701, 1701, 1700, 1701, 1700, 1701, 1700, + 1701, 1701, 1701, 1701, 1701, 1701, 1700, 1701, + 1701, 1701, 1701, 1701, 1702, 1703, 1703, 203, + 203, 1704, 1704, 1705, 1705, 1706, 1707, 1708, + + 1709, 1710, 1711, 1710, 1711, 1710, 1711, 1710, + 1711, 1710, 1711, 1711, 1712, 1711, 1712, 1711, + 1712, 1711, 1712, 1711, 1712, 1711, 1712, 1711, + 1712, 1711, 1712, 1711, 1712, 1711, 1712, 1711, + + 1712, 1711, 1712, 1710, 1711, 1712, 1711, 1712, + 1711, 1712, 1711, 1711, 1711, 1711, 1711, 1711, + 1712, 1712, 1711, 1712, 1712, 1711, 1712, 1712, + 1711, 1712, 1712, 1711, 1712, 1712, 1711, 1711, + + 1711, 1711, 1711, 1710, 1711, 1710, 1711, 1710, + 1711, 1711, 1711, 1711, 1711, 1711, 1710, 1711, + 1711, 1711, 1711, 1711, 1712, 1710, 1710, 1712, + 1712, 1712, 1712, 1713, 1714, 1715, 1716, 1717, + + 203, 203, 203, 203, 203, 1718, 1718, 1718, + 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, + 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, + 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, + + 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, + 1718, 1718, 1718, 1718, 1718, 1719, 1720, 1721, + 203, 1722, 1722, 1722, 1722, 1722, 1722, 1722, + 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, + + 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, + 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, + 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, + 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, + + 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, + 1722, 1722, 1722, 1722, 1722, 1722, 1722, 203, + 1723, 1723, 1724, 1724, 1724, 1724, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, - 1725, 1725, 1725, 1725, 1725, 1725, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, - 1726, 1726, 1726, 1726, 1727, 1727, 1727, 1727, + 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, + 1727, 1727, 1727, 1728, 1728, 1728, 1728, 1728, - 1727, 1727, 1727, 1727, 1728, 1728, 1728, 1728, - 1728, 1728, 1728, 1728, 1729, 1730, 1730, 1730, - 1730, 1730, 1730, 1730, 1730, 1730, 1731, 1731, + 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, + 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, + 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, + 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, + + 1730, 1730, 1730, 1730, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, - 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, - 1731, 1731, 1731, 1732, 1732, 1732, 1732, 1732, + 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, + 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, + 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, + 1732, 1732, 1732, 1732, 1732, 1733, 1733, 203, + 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, - 1724, 1724, 1724, 1724, 1724, 1733, 1733, 1733, + 1724, 1724, 1725, 1725, 1725, 1725, 1725, 1725, + 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, + 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, - 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, - 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, - 1734, 1734, 1734, 1734, 1734, 1735, 1734, 1734, - 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, + 1725, 1725, 1725, 1725, 1734, 1734, 1734, 1734, + 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, + 1736, 1737, 1737, 1737, 1737, 1737, 1737, 1737, + 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, - 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, - 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, - 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, - 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, + 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, + 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, + 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, + 1732, 1732, 1732, 1732, 1733, 1733, 1738, 1723, - 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, - 1734, 1734, 1734, 1734, 1734, 202, 202, 202, - 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, - 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, + 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, + 1724, 1724, 1725, 1725, 1725, 1725, 1725, 1725, + 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1739, + 1725, 1739, 1725, 1725, 1725, 1725, 1725, 1725, - 1736, 1736, 1737, 1737, 1736, 1736, 1736, 1736, - 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, - 1736, 1736, 1736, 1736, 1737, 1736, 1736, 1736, - 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, + 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, + 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, + 1725, 1737, 1737, 1737, 1737, 1737, 1737, 1737, + 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, - 1736, 1737, 1736, 1736, 1736, 1737, 1736, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, - 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, + 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, + 1725, 1725, 1725, 1725, 1736, 1736, 1736, 1736, + 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, + 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, - 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, - 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, - 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, - 1739, 1739, 1739, 1739, 1739, 1739, 1740, 1741, + 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, + 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, + 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, + 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1741, + + 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, + 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, + 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, + 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, + + 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, + 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, + 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, + 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, + + 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, + 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, + 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1736, + 1736, 1736, 1736, 1725, 1725, 1725, 1725, 1725, + + 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, + 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, + 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, + 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, + + 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, + 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, + 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, + 1725, 1725, 1725, 1725, 1725, 1725, 1736, 1736, + + 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, + 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, + 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, + 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1736, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1743, 1744, 1745, 1746, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, + 1742, 1742, 1742, 1742, 1742, 1742, 1743, 1743, + 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, - 1747, 1748, 1749, 1750, 1751, 1752, 1753, 1754, - 1755, 1756, 1742, 1742, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, + 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, + 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, + 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, + 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, - 281, 282, 281, 282, 281, 282, 281, 282, - 281, 282, 281, 282, 281, 282, 281, 282, - 281, 282, 281, 282, 281, 282, 281, 282, - 281, 282, 281, 282, 281, 282, 281, 282, + 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, + 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, + 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, + 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, - 285, 286, 281, 282, 281, 282, 281, 282, - 281, 282, 281, 282, 281, 282, 1757, 267, - 1758, 1758, 1758, 1759, 1760, 1760, 1760, 1760, - 1760, 1760, 1760, 1760, 267, 267, 1759, 1761, + 1744, 1744, 1744, 1744, 1744, 1744, 1745, 1745, + 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, + 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, + 1745, 1745, 1745, 1745, 1746, 1746, 1746, 1746, - 281, 282, 281, 282, 281, 282, 281, 282, - 281, 282, 281, 282, 281, 282, 281, 282, - 281, 282, 281, 282, 281, 282, 281, 282, - 287, 288, 287, 288, 1762, 1762, 1763, 1760, + 1746, 1746, 1746, 1746, 1747, 1747, 1747, 1747, + 1747, 1747, 1747, 1747, 1748, 1749, 1749, 1749, + 1749, 1749, 1749, 1749, 1749, 1749, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, - 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, - 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, - 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, - 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1751, 1751, 1751, 1751, 1751, + 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, + 1743, 1743, 1743, 1743, 1743, 1752, 1752, 1752, - 1764, 1764, 1764, 1764, 1764, 1764, 1765, 1765, - 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, - 1766, 1766, 1767, 1768, 1769, 1769, 1769, 1768, - 202, 202, 202, 202, 202, 202, 202, 202, + 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, + 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, + 1753, 1753, 1753, 1753, 1753, 1754, 1753, 1753, + 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, - 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, - 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, - 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1772, - 1772, 1772, 1772, 1645, 1645, 1645, 1645, 1645, + 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, + 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, + 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, + 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, - 1773, 1773, 1237, 1238, 1237, 1238, 1237, 1238, - 1237, 1238, 1237, 1238, 1237, 1238, 1237, 1238, - 1235, 1235, 1237, 1238, 1237, 1238, 1237, 1238, - 1237, 1238, 1237, 1238, 1237, 1238, 1237, 1238, + 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, + 1753, 1753, 1753, 1753, 1753, 203, 203, 203, + 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, + 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, - 1237, 1238, 1237, 1238, 1237, 1238, 1237, 1238, - 1237, 1238, 1237, 1238, 1237, 1238, 1237, 1238, - 1237, 1238, 1237, 1238, 1237, 1238, 1237, 1238, - 1237, 1238, 1237, 1238, 1237, 1238, 1237, 1238, + 1755, 1755, 1756, 1756, 1755, 1755, 1755, 1755, + 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, + 1755, 1755, 1755, 1755, 1756, 1755, 1755, 1755, + 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, - 1237, 1238, 1237, 1238, 1237, 1238, 1237, 1238, - 1237, 1238, 1237, 1238, 1237, 1238, 1237, 1238, - 1612, 1235, 1235, 1235, 1235, 1235, 1235, 1235, - 1235, 1237, 1238, 1237, 1238, 1774, 1237, 1238, + 1755, 1756, 1755, 1755, 1755, 1756, 1755, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, + 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, - 1237, 1238, 1237, 1238, 1237, 1238, 1237, 1238, - 1645, 1775, 1775, 1237, 1238, 1776, 1777, 1778, - 1779, 1780, 1781, 1782, 1783, 1784, 1785, 1786, - 1785, 1786, 1785, 1786, 1785, 1786, 1785, 1786, + 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, + 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, + 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, + 1758, 1758, 1758, 1758, 1758, 1758, 1759, 1760, - 1779, 1780, 1779, 1780, 1779, 1780, 1779, 1780, - 1779, 1780, 1787, 1788, 1789, 1790, 1791, 1792, - 1793, 1794, 1795, 1796, 1797, 1798, 1797, 1798, - 1799, 1800, 1801, 1802, 1801, 1802, 1801, 1802, + 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, + 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, + 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, + 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, - 202, 202, 1801, 1802, 1803, 1804, 1805, 1806, - 1807, 1806, 1807, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, + 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, + 1761, 1761, 1761, 1761, 1762, 1763, 1764, 1765, + 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, + 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 1806, 1807, 1808, - 1809, 1809, 1777, 1810, 1810, 1810, 1810, 1810, + 1766, 1767, 1768, 1769, 1770, 1771, 1772, 1773, + 1774, 1775, 1761, 1761, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, - 1811, 1811, 1812, 1811, 1811, 1811, 1813, 1811, - 1811, 1811, 1811, 1812, 1811, 1811, 1811, 1811, - 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, - 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, + 282, 283, 282, 283, 282, 283, 282, 283, + 282, 283, 282, 283, 282, 283, 282, 283, + 282, 283, 282, 283, 282, 283, 282, 283, + 282, 283, 282, 283, 282, 283, 282, 283, - 1811, 1811, 1811, 1814, 1814, 1812, 1812, 1814, - 1815, 1815, 1815, 1815, 1816, 202, 202, 202, - 1717, 1717, 1717, 1717, 1717, 1717, 813, 813, - 1428, 1817, 202, 202, 202, 202, 202, 202, + 286, 287, 282, 283, 282, 283, 282, 283, + 282, 283, 282, 283, 282, 283, 1776, 268, + 1777, 1777, 1777, 1778, 1779, 1779, 1779, 1779, + 1779, 1779, 1779, 1779, 268, 268, 1778, 1780, - 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, - 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, - 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, - 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, + 282, 283, 282, 283, 282, 283, 282, 283, + 282, 283, 282, 283, 282, 283, 282, 283, + 282, 283, 282, 283, 282, 283, 282, 283, + 288, 289, 288, 289, 1781, 1781, 1782, 1779, - 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, - 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, - 1818, 1818, 1819, 1820, 1821, 1821, 1822, 1822, - 202, 202, 202, 202, 202, 202, 202, 202, + 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, + 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, + 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, + 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, - 1823, 1823, 1824, 1824, 1824, 1824, 1824, 1824, - 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, - 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, - 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, - - 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, - 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, - 1824, 1824, 1824, 1824, 1823, 1823, 1823, 1823, - 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, - - 1823, 1823, 1823, 1823, 1825, 1826, 202, 202, - 202, 202, 202, 202, 202, 202, 1827, 1827, - 1828, 1829, 1830, 1831, 1832, 1833, 1834, 1835, - 1836, 1837, 202, 202, 202, 202, 202, 202, - - 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, - 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, - 1838, 1838, 508, 508, 508, 508, 508, 508, - 1839, 1839, 1839, 508, 1840, 1841, 1842, 1843, - - 1844, 1845, 1846, 1847, 1848, 1849, 1850, 1851, - 1852, 1853, 1854, 1854, 1854, 1854, 1854, 1854, - 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, - 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, - - 1854, 1854, 1854, 1854, 1854, 1854, 1855, 1855, - 1855, 1855, 1855, 1856, 1856, 1856, 1857, 1858, - 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, - 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, - - 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1860, - 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, - 1860, 1860, 1861, 1862, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 1863, - - 863, 863, 863, 863, 863, 863, 863, 863, - 863, 863, 863, 863, 863, 863, 863, 863, - 863, 863, 863, 863, 863, 863, 863, 863, - 863, 863, 863, 863, 863, 202, 202, 202, - - 1864, 1864, 1864, 1865, 1866, 1866, 1866, 1866, - 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, - 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, - 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, - - 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, - 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, - 1866, 1866, 1866, 1867, 1865, 1865, 1864, 1864, - 1864, 1864, 1865, 1865, 1864, 1864, 1865, 1865, - - 1868, 1869, 1869, 1869, 1869, 1869, 1869, 1870, - 1871, 1871, 1869, 1869, 1869, 1869, 202, 1872, - 1873, 1874, 1875, 1876, 1877, 1878, 1879, 1880, - 1881, 1882, 202, 202, 202, 202, 1869, 1869, - - 1883, 1883, 1883, 1883, 1883, 1884, 1885, 1883, - 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, - 1886, 1887, 1888, 1889, 1890, 1891, 1892, 1893, - 1894, 1895, 1883, 1883, 1883, 1883, 1883, 202, - - 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, - 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, - 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, - 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, - - 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, - 1896, 1897, 1897, 1897, 1897, 1897, 1897, 1898, - 1898, 1897, 1897, 1898, 1898, 1897, 1897, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - - 1896, 1896, 1896, 1897, 1896, 1896, 1896, 1896, - 1896, 1896, 1896, 1896, 1897, 1898, 202, 202, - 1899, 1900, 1901, 1902, 1903, 1904, 1905, 1906, - 1907, 1908, 202, 202, 1909, 1910, 1910, 1910, - - 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, - 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, - 1912, 1911, 1911, 1911, 1911, 1911, 1911, 1913, - 1913, 1913, 1911, 851, 1884, 1914, 1883, 1883, - - 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, - 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, - 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, - 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, - - 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, - 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, - 1916, 1915, 1916, 1916, 1917, 1915, 1915, 1916, - 1916, 1915, 1915, 1915, 1915, 1915, 1916, 1916, - - 1915, 1916, 1915, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 1915, 1915, 1918, 1919, 1919, - - 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, - 1920, 1920, 1920, 1921, 1922, 1922, 1921, 1921, - 1923, 1923, 1920, 1924, 1924, 1921, 1925, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - - 202, 1926, 1926, 1926, 1926, 1926, 1926, 202, - 202, 1926, 1926, 1926, 1926, 1926, 1926, 202, - 202, 1926, 1926, 1926, 1926, 1926, 1926, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - - 1926, 1926, 1926, 1926, 1926, 1926, 1926, 202, - 1926, 1926, 1926, 1926, 1926, 1926, 1926, 202, - 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, + 1783, 1783, 1783, 1783, 1783, 1783, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, + 1785, 1785, 1786, 1787, 1788, 1788, 1788, 1787, + 203, 203, 203, 203, 203, 203, 203, 203, - 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, - 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, - 1784, 1784, 1784, 1927, 1784, 1784, 1784, 1784, - 1784, 1784, 1784, 1928, 1929, 1929, 1929, 1929, + 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, + 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, + 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1791, + 1791, 1791, 1791, 1660, 1660, 1660, 1660, 1660, - 1930, 1930, 1930, 1930, 1784, 1931, 1932, 1932, - 1933, 1934, 1935, 1935, 202, 202, 202, 202, - 1936, 1937, 1938, 1939, 1940, 1941, 1942, 1943, - 1944, 1945, 1946, 1947, 1948, 1949, 1950, 1951, + 1792, 1792, 1238, 1239, 1238, 1239, 1238, 1239, + 1238, 1239, 1238, 1239, 1238, 1239, 1238, 1239, + 1236, 1236, 1238, 1239, 1238, 1239, 1238, 1239, + 1238, 1239, 1238, 1239, 1238, 1239, 1238, 1239, - 1952, 1953, 1954, 1955, 1956, 1957, 1958, 1959, - 1960, 1961, 1962, 1963, 1964, 1965, 1966, 1967, - 1968, 1969, 1970, 1971, 1972, 1973, 1974, 1975, - 1976, 1977, 1978, 1979, 1980, 1981, 1982, 1983, + 1238, 1239, 1238, 1239, 1238, 1239, 1238, 1239, + 1238, 1239, 1238, 1239, 1238, 1239, 1238, 1239, + 1238, 1239, 1238, 1239, 1238, 1239, 1238, 1239, + 1238, 1239, 1238, 1239, 1238, 1239, 1238, 1239, - 1984, 1985, 1986, 1987, 1988, 1989, 1990, 1991, - 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, - 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, - 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, + 1238, 1239, 1238, 1239, 1238, 1239, 1238, 1239, + 1238, 1239, 1238, 1239, 1238, 1239, 1238, 1239, + 1627, 1236, 1236, 1236, 1236, 1236, 1236, 1236, + 1236, 1238, 1239, 1238, 1239, 1793, 1238, 1239, - 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, - 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, - 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, - 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, + 1238, 1239, 1238, 1239, 1238, 1239, 1238, 1239, + 1660, 1794, 1794, 1238, 1239, 1795, 1796, 1797, + 1798, 1799, 1800, 1801, 1802, 1803, 1804, 1805, + 1804, 1805, 1804, 1805, 1804, 1805, 1804, 1805, - 2016, 2016, 2016, 2017, 2017, 2018, 2017, 2017, - 2018, 2017, 2017, 2019, 2017, 2020, 202, 202, - 2021, 2022, 2023, 2024, 2025, 2026, 2027, 2028, - 2029, 2030, 202, 202, 202, 202, 202, 202, + 1798, 1799, 1798, 1799, 1798, 1799, 1798, 1799, + 1798, 1799, 1806, 1807, 1808, 1809, 1810, 1811, + 1812, 1813, 1814, 1815, 1816, 1817, 1816, 1817, + 1818, 1819, 1820, 1821, 1820, 1821, 1820, 1821, - 2031, 2032, 2032, 2032, 2032, 2032, 2032, 2032, - 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, - 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, - 2032, 2032, 2032, 2032, 2031, 2032, 2032, 2032, + 203, 203, 1820, 1821, 1822, 1823, 1824, 1825, + 1826, 1825, 1826, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, - 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, - 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, - 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, - 2031, 2032, 2032, 2032, 2032, 2032, 2032, 2032, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 1825, 1826, 1827, + 1828, 1828, 1796, 1829, 1829, 1829, 1829, 1829, - 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, - 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, - 2032, 2032, 2032, 2032, 2031, 2032, 2032, 2032, - 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, + 1830, 1830, 1831, 1830, 1830, 1830, 1832, 1830, + 1830, 1830, 1830, 1831, 1830, 1830, 1830, 1830, + 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, + 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, - 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, - 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, - 2031, 2032, 2032, 2032, 2032, 2032, 2032, 2032, - 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, + 1830, 1830, 1830, 1833, 1833, 1831, 1831, 1833, + 1834, 1834, 1834, 1834, 1835, 203, 203, 203, + 1735, 1735, 1735, 1735, 1735, 1735, 814, 814, + 1430, 1836, 203, 203, 203, 203, 203, 203, - 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, - 2032, 2032, 2032, 2032, 2031, 2032, 2032, 2032, - 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, - 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, + 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, + 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, + 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, + 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, - 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, - 2031, 2032, 2032, 2032, 2032, 2032, 2032, 2032, - 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, - 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, + 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, + 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, + 1837, 1837, 1838, 1839, 1840, 1840, 1841, 1841, + 203, 203, 203, 203, 203, 203, 203, 203, - 2032, 2032, 2032, 2032, 2031, 2032, 2032, 2032, - 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, - 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, - 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, + 1842, 1842, 1843, 1843, 1843, 1843, 1843, 1843, + 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, + 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, + 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, - 2032, 2032, 2032, 2032, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 866, 866, 866, 866, 866, 866, 866, 866, - 866, 866, 866, 866, 866, 866, 866, 866, + 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, + 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, + 1843, 1843, 1843, 1843, 1842, 1842, 1842, 1842, + 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, - 866, 866, 866, 866, 866, 866, 866, 202, - 202, 202, 202, 869, 869, 869, 869, 869, - 869, 869, 869, 869, 869, 869, 869, 869, - 869, 869, 869, 869, 869, 869, 869, 869, + 1842, 1842, 1842, 1842, 1844, 1845, 203, 203, + 203, 203, 203, 203, 203, 203, 1846, 1846, + 1847, 1848, 1849, 1850, 1851, 1852, 1853, 1854, + 1855, 1856, 203, 203, 203, 203, 203, 203, - 869, 869, 869, 869, 869, 869, 869, 869, - 869, 869, 869, 869, 869, 869, 869, 869, - 869, 869, 869, 869, 869, 869, 869, 869, - 869, 869, 869, 869, 202, 202, 202, 202, + 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, + 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, + 1857, 1857, 509, 509, 509, 509, 509, 509, + 1858, 1858, 1858, 509, 1859, 1860, 1861, 1862, - 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, - 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, - 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, - 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, + 1863, 1864, 1865, 1866, 1867, 1868, 1869, 1870, + 1871, 1872, 1873, 1873, 1873, 1873, 1873, 1873, + 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, + 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, - 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, - 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, - 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, - 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, + 1873, 1873, 1873, 1873, 1873, 1873, 1874, 1874, + 1874, 1874, 1874, 1875, 1875, 1875, 1876, 1877, + 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, + 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, + + 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1879, + 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, + 1879, 1879, 1880, 1881, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 1882, + + 864, 864, 864, 864, 864, 864, 864, 864, + 864, 864, 864, 864, 864, 864, 864, 864, + 864, 864, 864, 864, 864, 864, 864, 864, + 864, 864, 864, 864, 864, 203, 203, 203, + + 1883, 1883, 1883, 1884, 1885, 1885, 1885, 1885, + 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, + 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, + 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, + + 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, + 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, + 1885, 1885, 1885, 1886, 1884, 1884, 1883, 1883, + 1883, 1883, 1884, 1884, 1883, 1883, 1884, 1884, + + 1887, 1888, 1888, 1888, 1888, 1888, 1888, 1889, + 1890, 1890, 1888, 1888, 1888, 1888, 203, 1891, + 1892, 1893, 1894, 1895, 1896, 1897, 1898, 1899, + 1900, 1901, 203, 203, 203, 203, 1888, 1888, + + 1902, 1902, 1902, 1902, 1902, 1903, 1904, 1902, + 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, + 1905, 1906, 1907, 1908, 1909, 1910, 1911, 1912, + 1913, 1914, 1902, 1902, 1902, 1902, 1902, 203, + + 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, + 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, + 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, + 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, + + 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, + 1915, 1916, 1916, 1916, 1916, 1916, 1916, 1917, + 1917, 1916, 1916, 1917, 1917, 1916, 1916, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + + 1915, 1915, 1915, 1916, 1915, 1915, 1915, 1915, + 1915, 1915, 1915, 1915, 1916, 1917, 203, 203, + 1918, 1919, 1920, 1921, 1922, 1923, 1924, 1925, + 1926, 1927, 203, 203, 1928, 1929, 1929, 1929, + + 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, + 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, + 1931, 1930, 1930, 1930, 1930, 1930, 1930, 1932, + 1932, 1932, 1930, 852, 1903, 1933, 1902, 1902, + + 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, + 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, + 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, + 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, + + 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, + 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, + 1935, 1934, 1935, 1935, 1936, 1934, 1934, 1935, + 1935, 1934, 1934, 1934, 1934, 1934, 1935, 1935, + + 1934, 1935, 1934, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 1934, 1934, 1937, 1938, 1938, + + 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, + 1939, 1939, 1939, 1940, 1941, 1941, 1940, 1940, + 1942, 1942, 1939, 1943, 1943, 1940, 1944, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + + 203, 1945, 1945, 1945, 1945, 1945, 1945, 203, + 203, 1945, 1945, 1945, 1945, 1945, 1945, 203, + 203, 1945, 1945, 1945, 1945, 1945, 1945, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + + 1945, 1945, 1945, 1945, 1945, 1945, 1945, 203, + 1945, 1945, 1945, 1945, 1945, 1945, 1945, 203, + 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, + 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, + + 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, + 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, + 1803, 1803, 1803, 1946, 1803, 1803, 1803, 1803, + 1803, 1803, 1803, 1947, 1948, 1948, 1948, 1948, + + 1949, 1949, 1949, 1949, 1803, 1950, 1951, 1951, + 1952, 1953, 1954, 1954, 203, 203, 203, 203, + 1955, 1956, 1957, 1958, 1959, 1960, 1961, 1962, + 1963, 1964, 1965, 1966, 1967, 1968, 1969, 1970, + + 1971, 1972, 1973, 1974, 1975, 1976, 1977, 1978, + 1979, 1980, 1981, 1982, 1983, 1984, 1985, 1986, + 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, + 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, + + 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, + 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, + 2019, 2020, 2021, 2022, 2023, 2024, 2025, 2026, + 2027, 2028, 2029, 2030, 2031, 2032, 2033, 2034, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, - 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, - 2035, 2035, 2035, 2035, 2035, 2035, 1725, 1725, - 2035, 1725, 2035, 1725, 1725, 2035, 2035, 2035, - 2035, 2035, 2035, 2035, 2035, 2035, 2035, 1725, + 2035, 2035, 2035, 2036, 2036, 2037, 2036, 2036, + 2037, 2036, 2036, 2038, 2036, 2039, 203, 203, + 2040, 2041, 2042, 2043, 2044, 2045, 2046, 2047, + 2048, 2049, 203, 203, 203, 203, 203, 203, - 2035, 1725, 2035, 1725, 1725, 2035, 2035, 1725, - 1725, 1725, 2035, 2035, 2035, 2035, 2036, 2036, - 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, - 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, + 2050, 2051, 2051, 2051, 2051, 2051, 2051, 2051, + 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, + 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, + 2051, 2051, 2051, 2051, 2050, 2051, 2051, 2051, - 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, - 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, - 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, - 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, + 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, + 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, + 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, + 2050, 2051, 2051, 2051, 2051, 2051, 2051, 2051, - 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, - 2037, 2037, 2037, 2038, 2038, 2038, 1733, 1733, - 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, - 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, + 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, + 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, + 2051, 2051, 2051, 2051, 2050, 2051, 2051, 2051, + 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, - 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, - 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, - 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, - 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, + 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, + 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, + 2050, 2051, 2051, 2051, 2051, 2051, 2051, 2051, + 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, - 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, - 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, - 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, - 2039, 2039, 1733, 1733, 1733, 1733, 1733, 1733, + 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, + 2051, 2051, 2051, 2051, 2050, 2051, 2051, 2051, + 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, + 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, + 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, + 2050, 2051, 2051, 2051, 2051, 2051, 2051, 2051, + 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, + 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, - 2040, 2041, 2042, 2043, 2044, 2045, 2045, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 2046, 2047, 2048, 2049, 2050, - 202, 202, 202, 202, 202, 2051, 2052, 2053, + 2051, 2051, 2051, 2051, 2050, 2051, 2051, 2051, + 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, + 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, + 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, + + 2051, 2051, 2051, 2051, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 867, 867, 867, 867, 867, 867, 867, 867, + 867, 867, 867, 867, 867, 867, 867, 867, + + 867, 867, 867, 867, 867, 867, 867, 203, + 203, 203, 203, 870, 870, 870, 870, 870, + 870, 870, 870, 870, 870, 870, 870, 870, + 870, 870, 870, 870, 870, 870, 870, 870, + + 870, 870, 870, 870, 870, 870, 870, 870, + 870, 870, 870, 870, 870, 870, 870, 870, + 870, 870, 870, 870, 870, 870, 870, 870, + 870, 870, 870, 870, 203, 203, 203, 203, + + 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, + 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, + 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, + 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, + + 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, + 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, + 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, + 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, - 2054, 2055, 2053, 2053, 2053, 2053, 2053, 2053, - 2053, 2053, 2053, 2053, 2053, 2053, 2053, 301, - 2053, 2053, 2053, 2053, 2053, 301, 2053, 301, + 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, + 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, + 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, - 2053, 2053, 301, 2053, 2053, 301, 2053, 2053, - 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2054, + 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, + 2054, 2054, 2054, 2054, 2054, 2054, 1744, 1744, + 2054, 1744, 2054, 1744, 1744, 2054, 2054, 2054, + 2054, 2054, 2054, 2054, 2054, 2054, 2054, 1744, + + 2054, 1744, 2054, 1744, 1744, 2054, 2054, 1744, + 1744, 1744, 2054, 2054, 2054, 2054, 2055, 2055, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, @@ -3078,3621 +3053,3727 @@ static const unsigned short uc_property_trie[] = { 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, - 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, - 2056, 2056, 2057, 2057, 2057, 2057, 2057, 2057, - 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, - - 2057, 2057, 348, 348, 348, 348, 348, 348, - 348, 348, 348, 348, 348, 348, 348, 348, - 348, 348, 348, 2056, 2056, 2056, 2056, 2056, - 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, - - 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, - 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, - 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, - 2056, 2056, 2056, 2056, 2056, 2056, 1671, 1366, - - 348, 348, 348, 348, 348, 348, 348, 348, - 348, 348, 348, 348, 348, 348, 348, 348, - 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, - 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, - - 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, - 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, - 348, 348, 2056, 2056, 2056, 2056, 2056, 2056, - 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, - - 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, - 348, 348, 348, 348, 348, 348, 348, 348, + 2056, 2056, 2056, 2057, 2057, 2057, 1752, 1752, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, - 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, - 2056, 2056, 2056, 2056, 2059, 340, 348, 348, + 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, + 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, - 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, - 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, - 2061, 2062, 2063, 2064, 2065, 2066, 2066, 2067, - 2068, 2069, 202, 202, 202, 202, 202, 202, + 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, + 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, + 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, + 2058, 2058, 1752, 1752, 1752, 1752, 1752, 1752, - 173, 173, 173, 173, 1219, 1219, 1219, 1107, - 1107, 1107, 1107, 1107, 1107, 1107, 1763, 1763, - 2070, 2071, 2071, 2072, 2072, 2073, 2074, 2073, - 2074, 2073, 2074, 2073, 2074, 2073, 2074, 2073, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, - 2074, 2073, 2074, 2073, 2074, 1683, 1683, 2075, - 2076, 2070, 2070, 2070, 2070, 2072, 2072, 2072, - 2077, 2078, 2079, 202, 2080, 2081, 2082, 2082, - 2071, 1419, 1420, 1419, 1420, 1419, 1420, 2083, + 2059, 2060, 2061, 2062, 2063, 2064, 2064, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 2065, 2066, 2067, 2068, 2069, + 203, 203, 203, 203, 203, 2070, 2071, 2072, - 2070, 2070, 2084, 2085, 2086, 2087, 2088, 202, - 2070, 1422, 1380, 2070, 202, 202, 202, 202, - 2056, 2056, 2056, 2089, 2056, 348, 2056, 2056, - 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, + 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, + 2073, 2074, 2072, 2072, 2072, 2072, 2072, 2072, + 2072, 2072, 2072, 2072, 2072, 2072, 2072, 302, + 2072, 2072, 2072, 2072, 2072, 302, 2072, 302, - 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, - 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, - 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, - 2056, 2056, 2056, 2056, 2056, 348, 348, 2090, + 2072, 2072, 302, 2072, 2072, 302, 2072, 2072, + 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2073, + 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, + 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, - 202, 2082, 2070, 2083, 1422, 1380, 2070, 2091, - 1419, 1420, 2070, 2084, 2077, 2085, 2079, 2092, - 2093, 2094, 2095, 2096, 2097, 2098, 2099, 2100, - 2101, 2102, 2081, 2080, 2103, 2088, 2104, 2082, + 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, + 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, + 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, + 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, - 2070, 2105, 2105, 2105, 2105, 2105, 2105, 2105, - 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, - 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, - 2105, 2105, 2105, 2106, 2070, 2107, 2108, 2072, + 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, + 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, + 2075, 2075, 2076, 2076, 2076, 2076, 2076, 2076, + 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, - 2108, 2109, 2109, 2109, 2109, 2109, 2109, 2109, - 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, - 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, - 2109, 2109, 2109, 2106, 2088, 2107, 2088, 2110, + 2076, 2076, 349, 349, 349, 349, 349, 349, + 349, 349, 349, 349, 349, 349, 349, 349, + 349, 349, 349, 2075, 2075, 2075, 2075, 2075, + 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, - 2111, 2112, 1419, 1420, 2113, 2114, 2115, 2116, - 2116, 2116, 2116, 2116, 2116, 2116, 2116, 2116, - 2117, 2115, 2115, 2115, 2115, 2115, 2115, 2115, - 2115, 2115, 2115, 2115, 2115, 2115, 2115, 2115, + 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, + 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, + 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, + 2075, 2075, 2075, 2075, 2075, 2075, 1687, 1367, - 2115, 2115, 2115, 2115, 2115, 2115, 2115, 2115, - 2115, 2115, 2115, 2115, 2115, 2115, 2115, 2115, - 2115, 2115, 2115, 2115, 2115, 2115, 2115, 2115, - 2115, 2115, 2115, 2115, 2115, 2115, 2118, 2118, + 349, 349, 349, 349, 349, 349, 349, 349, + 349, 349, 349, 349, 349, 349, 349, 349, + 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, + 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, - 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, - 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, - 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, - 1706, 1706, 1706, 1706, 1706, 1706, 1706, 202, + 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, + 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, + 349, 349, 2075, 2075, 2075, 2075, 2075, 2075, + 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, - 202, 202, 1706, 1706, 1706, 1706, 1706, 1706, - 202, 202, 1706, 1706, 1706, 1706, 1706, 1706, - 202, 202, 1706, 1706, 1706, 1706, 1706, 1706, - 202, 202, 1706, 1706, 1706, 202, 202, 202, + 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, + 349, 349, 349, 349, 349, 349, 349, 349, + 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, + 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, - 2119, 1422, 2088, 2108, 1679, 1422, 1422, 202, - 1443, 1418, 1418, 1418, 1418, 1443, 1443, 202, - 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, - 1403, 2120, 2120, 2120, 2121, 51, 2122, 2122, + 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, + 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, + 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, + 2075, 2075, 2075, 2075, 2078, 341, 349, 349, - 2123, 2123, 2123, 2123, 2123, 2123, 2123, 2123, - 2123, 2123, 2123, 2123, 202, 2123, 2123, 2123, - 2123, 2123, 2123, 2123, 2123, 2123, 2123, 2123, - 2123, 2123, 2123, 2123, 2123, 2123, 2123, 2123, + 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, + 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, + 2080, 2081, 2082, 2083, 2084, 2085, 2085, 2086, + 2087, 2088, 203, 203, 203, 203, 203, 203, - 2123, 2123, 2123, 2123, 2123, 2123, 2123, 202, - 2123, 2123, 2123, 2123, 2123, 2123, 2123, 2123, - 2123, 2123, 2123, 2123, 2123, 2123, 2123, 2123, - 2123, 2123, 2123, 202, 2123, 2123, 202, 2123, + 174, 174, 174, 174, 1220, 1220, 1220, 1108, + 1108, 1108, 1108, 1108, 1108, 1108, 1782, 1782, + 2089, 2090, 2090, 2091, 2091, 2092, 2093, 2092, + 2093, 2092, 2093, 2092, 2093, 2092, 2093, 2092, - 2123, 2123, 2123, 2123, 2123, 2123, 2123, 2123, - 2123, 2123, 2123, 2123, 2123, 2123, 202, 202, - 2123, 2123, 2123, 2123, 2123, 2123, 2123, 2123, - 2123, 2123, 2123, 2123, 2123, 2123, 202, 202, + 2093, 2092, 2093, 2092, 2093, 2094, 2094, 2095, + 2096, 2089, 2089, 2089, 2089, 2091, 2091, 2091, + 2097, 2098, 2099, 203, 2100, 2101, 2102, 2102, + 2090, 1421, 1422, 1421, 1422, 1421, 1422, 2103, - 2123, 2123, 2123, 2123, 2123, 2123, 2123, 2123, - 2123, 2123, 2123, 2123, 2123, 2123, 2123, 2123, - 2123, 2123, 2123, 2123, 2123, 2123, 2123, 2123, - 2123, 2123, 2123, 2123, 2123, 2123, 2123, 2123, + 2089, 2089, 2104, 2105, 2106, 2107, 2108, 203, + 2089, 1424, 1381, 2089, 203, 203, 203, 203, + 2075, 2075, 2075, 2109, 2075, 349, 2075, 2075, + 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, - 2123, 2123, 2123, 2123, 2123, 2123, 2123, 2123, - 2123, 2123, 2123, 2123, 2123, 2123, 2123, 2123, - 2123, 2123, 2123, 2123, 2123, 2123, 2123, 2123, - 2123, 2123, 2123, 202, 202, 202, 202, 202, + 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, + 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, + 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, + 2075, 2075, 2075, 2075, 2075, 349, 349, 2110, - 2124, 2125, 2124, 202, 202, 202, 202, 2126, - 2126, 2126, 2126, 2126, 2126, 2126, 2126, 2126, - 2126, 2126, 2126, 2126, 2126, 2126, 2126, 2126, - 2126, 2126, 2126, 2126, 2126, 2126, 2126, 2126, + 203, 2102, 2089, 2103, 1424, 1381, 2089, 2111, + 1421, 1422, 2089, 2104, 2097, 2105, 2099, 2112, + 2113, 2114, 2115, 2116, 2117, 2118, 2119, 2120, + 2121, 2122, 2101, 2100, 2123, 2108, 2124, 2102, - 2126, 2126, 2126, 2126, 2126, 2126, 2126, 2126, - 2126, 2126, 2126, 2126, 2126, 2126, 2126, 2126, - 2126, 2126, 2126, 2126, 202, 202, 202, 2127, - 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, + 2089, 2125, 2125, 2125, 2125, 2125, 2125, 2125, + 2125, 2125, 2125, 2125, 2125, 2125, 2125, 2125, + 2125, 2125, 2125, 2125, 2125, 2125, 2125, 2125, + 2125, 2125, 2125, 2126, 2089, 2127, 2128, 2091, - 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, - 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, - 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, - 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, + 2128, 2129, 2129, 2129, 2129, 2129, 2129, 2129, + 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, + 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, + 2129, 2129, 2129, 2126, 2108, 2127, 2108, 2130, - 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, - 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, - 2128, 2128, 2128, 2128, 2128, 2129, 2129, 2129, - 2129, 2130, 2130, 2130, 2130, 2130, 2130, 2130, - - 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, - 2130, 2130, 2129, 2131, 2132, 2133, 2133, 202, - 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, - 1543, 1543, 1543, 1543, 1596, 202, 202, 202, - - 2132, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, - 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, - - 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, - 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, - 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, - 1465, 1465, 1465, 1465, 1465, 1222, 202, 202, - - 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134, - 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134, - 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134, - 2134, 2134, 2134, 2134, 2134, 202, 202, 202, - - 2135, 2135, 2135, 2135, 2135, 2135, 2135, 2135, - 2135, 2135, 2135, 2135, 2135, 2135, 2135, 2135, - 2135, 2135, 2135, 2135, 2135, 2135, 2135, 2135, - 2135, 2135, 2135, 2135, 2135, 2135, 2135, 2135, - - 2135, 2135, 2135, 2135, 2135, 2135, 2135, 2135, - 2135, 2135, 2135, 2135, 2135, 2135, 2135, 2135, - 2135, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - - 1107, 2136, 2136, 2136, 2136, 2136, 2136, 2136, + 2131, 2132, 1421, 1422, 2133, 2134, 2135, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, - 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, - 2136, 2136, 2136, 2136, 202, 202, 202, 202, + 2137, 2135, 2135, 2135, 2135, 2135, 2135, 2135, + 2135, 2135, 2135, 2135, 2135, 2135, 2135, 2135, - 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, - 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, - 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, - 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2138, + 2135, 2135, 2135, 2135, 2135, 2135, 2135, 2135, + 2135, 2135, 2135, 2135, 2135, 2135, 2135, 2135, + 2135, 2135, 2135, 2135, 2135, 2135, 2135, 2135, + 2135, 2135, 2135, 2135, 2135, 2135, 2138, 2138, - 2139, 2139, 2139, 2139, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 2140, 2140, 2140, - 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, - 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, + 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, + 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, + 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, + 1722, 1722, 1722, 1722, 1722, 1722, 1722, 203, - 2141, 2142, 2141, 2141, 2141, 2141, 2141, 2141, - 2141, 2141, 2142, 202, 202, 202, 202, 202, + 203, 203, 1722, 1722, 1722, 1722, 1722, 1722, + 203, 203, 1722, 1722, 1722, 1722, 1722, 1722, + 203, 203, 1722, 1722, 1722, 1722, 1722, 1722, + 203, 203, 1722, 1722, 1722, 203, 203, 203, + + 2139, 1424, 2108, 2128, 1695, 1424, 1424, 203, + 1445, 1420, 1420, 1420, 1420, 1445, 1445, 203, + 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, + 1405, 2140, 2140, 2140, 2141, 51, 2142, 2142, + + 2143, 2143, 2143, 2143, 2143, 2143, 2143, 2143, + 2143, 2143, 2143, 2143, 203, 2143, 2143, 2143, + 2143, 2143, 2143, 2143, 2143, 2143, 2143, 2143, + 2143, 2143, 2143, 2143, 2143, 2143, 2143, 2143, + + 2143, 2143, 2143, 2143, 2143, 2143, 2143, 203, + 2143, 2143, 2143, 2143, 2143, 2143, 2143, 2143, + 2143, 2143, 2143, 2143, 2143, 2143, 2143, 2143, + 2143, 2143, 2143, 203, 2143, 2143, 203, 2143, + + 2143, 2143, 2143, 2143, 2143, 2143, 2143, 2143, + 2143, 2143, 2143, 2143, 2143, 2143, 203, 203, + 2143, 2143, 2143, 2143, 2143, 2143, 2143, 2143, + 2143, 2143, 2143, 2143, 2143, 2143, 203, 203, + + 2143, 2143, 2143, 2143, 2143, 2143, 2143, 2143, + 2143, 2143, 2143, 2143, 2143, 2143, 2143, 2143, 2143, 2143, 2143, 2143, 2143, 2143, 2143, 2143, 2143, 2143, 2143, 2143, 2143, 2143, 2143, 2143, 2143, 2143, 2143, 2143, 2143, 2143, 2143, 2143, 2143, 2143, 2143, 2143, 2143, 2143, 2143, 2143, - 2143, 2143, 2143, 2143, 2143, 2143, 2144, 2144, - 2144, 2144, 2144, 202, 202, 202, 202, 202, + 2143, 2143, 2143, 2143, 2143, 2143, 2143, 2143, + 2143, 2143, 2143, 203, 203, 203, 203, 203, - 2145, 2145, 2145, 2145, 2145, 2145, 2145, 2145, - 2145, 2145, 2145, 2145, 2145, 2145, 2145, 2145, - 2145, 2145, 2145, 2145, 2145, 2145, 2145, 2145, - 2145, 2145, 2145, 2145, 2145, 2145, 202, 2146, + 2144, 2145, 2144, 203, 203, 203, 203, 2146, + 2146, 2146, 2146, 2146, 2146, 2146, 2146, 2146, + 2146, 2146, 2146, 2146, 2146, 2146, 2146, 2146, + 2146, 2146, 2146, 2146, 2146, 2146, 2146, 2146, - 2147, 2147, 2147, 2147, 2147, 2147, 2147, 2147, - 2147, 2147, 2147, 2147, 2147, 2147, 2147, 2147, - 2147, 2147, 2147, 2147, 2147, 2147, 2147, 2147, + 2146, 2146, 2146, 2146, 2146, 2146, 2146, 2146, + 2146, 2146, 2146, 2146, 2146, 2146, 2146, 2146, + 2146, 2146, 2146, 2146, 203, 203, 203, 2147, 2147, 2147, 2147, 2147, 2147, 2147, 2147, 2147, - 2147, 2147, 2147, 2147, 202, 202, 202, 202, - 2147, 2147, 2147, 2147, 2147, 2147, 2147, 2147, - 2148, 2149, 2149, 2149, 2149, 2149, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, + 2148, 2148, 2148, 2148, 2148, 2148, 2148, 2148, + 2148, 2148, 2148, 2148, 2148, 2148, 2148, 2148, + 2148, 2148, 2148, 2148, 2148, 2148, 2148, 2148, + 2148, 2148, 2148, 2148, 2148, 2148, 2148, 2148, + + 2148, 2148, 2148, 2148, 2148, 2148, 2148, 2148, + 2148, 2148, 2148, 2148, 2148, 2148, 2148, 2148, + 2148, 2148, 2148, 2148, 2148, 2149, 2149, 2149, + 2149, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, - 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, - 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, - 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, + 2150, 2150, 2149, 2151, 2152, 2153, 2153, 203, + 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, + 1610, 1610, 1610, 1610, 1611, 203, 203, 203, - 2150, 2150, 2150, 2150, 2150, 2150, 2151, 2151, - 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152, - 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152, - 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152, + 2152, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, - 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152, - 2152, 2152, 2152, 2152, 2152, 2152, 2153, 2153, - 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, - 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, + 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, + + 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, + 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, + 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, + 1468, 1468, 1468, 1468, 1468, 1223, 203, 203, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, - 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, + 2154, 2154, 2154, 2154, 2154, 203, 203, 203, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, - 2155, 2155, 2155, 2155, 2155, 2155, 202, 202, + 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, - 2156, 2157, 2158, 2159, 2160, 2161, 2162, 2163, - 2164, 2165, 202, 202, 202, 202, 202, 202, - 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, - 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, + 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, + 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, + 2155, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, - 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, - 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, - 2166, 2166, 2166, 2166, 202, 202, 202, 202, - 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, + 1108, 2156, 2156, 2156, 2156, 2156, 2156, 2156, + 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, + 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, + 2156, 2156, 2156, 2156, 203, 203, 203, 203, + + 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, + 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, + 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, + 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2158, + + 2159, 2159, 2159, 2159, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 2160, 2160, 2160, + 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, + 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, + + 2161, 2162, 2161, 2161, 2161, 2161, 2161, 2161, + 2161, 2161, 2162, 203, 203, 203, 203, 203, + 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, + 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, + + 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, + 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, + 2163, 2163, 2163, 2163, 2163, 2163, 2164, 2164, + 2164, 2164, 2164, 203, 203, 203, 203, 203, + + 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, + 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, + 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, + 2165, 2165, 2165, 2165, 2165, 2165, 203, 2166, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, - 2167, 2167, 2167, 2167, 202, 202, 202, 202, + 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, - 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, - 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, - 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, - 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, + 2167, 2167, 2167, 2167, 203, 203, 203, 203, + 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, + 2168, 2169, 2169, 2169, 2169, 2169, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, - 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, - 202, 202, 202, 202, 202, 202, 202, 202, - 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, - 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, + 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, + 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, + 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, + 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, - 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, - 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, - 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, - 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, - - 2169, 2169, 2169, 2169, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 2170, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - - 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, - 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, - 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, - 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, - - 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, - 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, - 2171, 2171, 2171, 2171, 2171, 2171, 2171, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - - 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, - 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, - 2171, 2171, 2171, 2171, 2171, 2171, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - - 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - - 2172, 2172, 2172, 2172, 2172, 2172, 301, 301, - 2172, 301, 2172, 2172, 2172, 2172, 2172, 2172, + 2170, 2170, 2170, 2170, 2170, 2170, 2171, 2171, + 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, - 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, - 2172, 2172, 2172, 2172, 2172, 2172, 301, 2172, - 2172, 301, 301, 301, 2172, 301, 301, 2172, + 2172, 2172, 2172, 2172, 2172, 2172, 2173, 2173, + 2174, 2174, 2174, 2174, 2174, 2174, 2174, 2174, + 2174, 2174, 2174, 2174, 2174, 2174, 2174, 2174, + + 2174, 2174, 2174, 2174, 2174, 2174, 2174, 2174, + 2174, 2174, 2174, 2174, 2174, 2174, 2174, 2174, + 2174, 2174, 2174, 2174, 2174, 2174, 2174, 2174, + 2174, 2174, 2174, 2174, 2174, 2174, 2174, 2174, - 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, - 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, - 2173, 2173, 2173, 2173, 2173, 2173, 301, 2174, 2175, 2175, 2175, 2175, 2175, 2175, 2175, 2175, + 2175, 2175, 2175, 2175, 2175, 2175, 2175, 2175, + 2175, 2175, 2175, 2175, 2175, 2175, 2175, 2175, + 2175, 2175, 2175, 2175, 2175, 2175, 203, 203, - 2176, 2176, 2176, 2176, 2176, 2176, 2176, 2176, - 2176, 2176, 2176, 2176, 2176, 2176, 2176, 2176, - 2176, 2176, 2176, 2176, 2176, 2176, 2176, 2177, - 2177, 2178, 2178, 2178, 2178, 2178, 2178, 2178, + 2176, 2177, 2178, 2179, 2180, 2181, 2182, 2183, + 2184, 2185, 203, 203, 203, 203, 203, 203, + 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, + 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, - 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, - 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, - 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, - 2179, 2179, 2179, 2179, 2179, 2179, 2179, 301, - - 301, 301, 301, 301, 301, 301, 301, 2180, - 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, - 301, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, - - 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, - 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, - 2181, 2181, 2181, 301, 2181, 2181, 301, 301, - 301, 301, 301, 2182, 2182, 2182, 2182, 2182, - - 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, - 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, - 2183, 2183, 2183, 2183, 2183, 2183, 2184, 2184, - 2184, 2184, 2185, 2185, 301, 301, 301, 2186, + 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, + 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, + 2186, 2186, 2186, 2186, 203, 203, 203, 203, + 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, - 2187, 2187, 301, 301, 301, 301, 301, 2188, + 2187, 2187, 2187, 2187, 203, 203, 203, 203, + + 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, + 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, + 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, + 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, + + 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, + 203, 203, 203, 203, 203, 203, 203, 203, + 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, + 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, - 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, - 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, - 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, - 301, 301, 301, 301, 2191, 2191, 2190, 2190, - - 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, - 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, - 301, 301, 2191, 2191, 2191, 2191, 2191, 2191, - 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, + 2189, 2189, 2189, 2189, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 2190, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, - 2192, 2193, 2193, 2193, 301, 2193, 2193, 301, - 301, 301, 301, 301, 2193, 2194, 2193, 2195, - 2192, 2192, 2192, 2192, 301, 2192, 2192, 2192, - 301, 2192, 2192, 2192, 2192, 2192, 2192, 2192, + 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, + 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, + 2191, 2191, 2191, 2191, 2191, 2191, 2191, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + + 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, + 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, + 2191, 2191, 2191, 2191, 2191, 2191, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + + 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + + 2192, 2192, 2192, 2192, 2192, 2192, 302, 302, + 2192, 302, 2192, 2192, 2192, 2192, 2192, 2192, + 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, + 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, - 2192, 2192, 2192, 2192, 2196, 2196, 301, 301, - 2195, 2197, 2194, 301, 301, 301, 301, 2198, + 2192, 2192, 2192, 2192, 2192, 2192, 302, 2192, + 2192, 302, 302, 302, 2192, 302, 302, 2192, - 2199, 2200, 2201, 2202, 2203, 2203, 2203, 2203, - 2204, 301, 301, 301, 301, 301, 301, 301, - 2205, 2205, 2205, 2205, 2205, 2205, 2206, 2206, - 2207, 301, 301, 301, 301, 301, 301, 301, + 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, + 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, + 2193, 2193, 2193, 2193, 2193, 2193, 302, 2194, + 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, - 2208, 2208, 2208, 2208, 2208, 2208, 2208, 2208, - 2208, 2208, 2208, 2208, 2208, 2208, 2208, 2208, - 2208, 2208, 2208, 2208, 2208, 2208, 2208, 2208, - 2208, 2208, 2208, 2208, 2208, 2209, 2209, 2210, + 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, + 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, + 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2197, + 2197, 2198, 2198, 2198, 2198, 2198, 2198, 2198, + + 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, + 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, + 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, + 2199, 2199, 2199, 2199, 2199, 2199, 2199, 302, + + 302, 302, 302, 302, 302, 302, 302, 2200, + 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + + 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, + 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, + 2201, 2201, 2201, 302, 2201, 2201, 302, 302, + 302, 302, 302, 2202, 2202, 2202, 2202, 2202, + + 2203, 2203, 2203, 2203, 2203, 2203, 2203, 2203, + 2203, 2203, 2203, 2203, 2203, 2203, 2203, 2203, + 2203, 2203, 2203, 2203, 2203, 2203, 2204, 2204, + 2204, 2204, 2205, 2205, 302, 302, 302, 2206, + + 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, + 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, + 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, + 2207, 2207, 302, 302, 302, 302, 302, 2208, + + 2209, 2209, 2209, 2209, 2209, 2209, 2209, 2209, + 2209, 2209, 2209, 2209, 2209, 2209, 2209, 2209, + 2209, 2209, 2209, 2209, 2209, 2209, 2209, 2209, + 2209, 2209, 2209, 2209, 2209, 2209, 2209, 2209, + + 2210, 2210, 2210, 2210, 2210, 2210, 2210, 2210, + 2210, 2210, 2210, 2210, 2210, 2210, 2210, 2210, + 2210, 2210, 2210, 2210, 2210, 2210, 2210, 2210, + 302, 302, 302, 302, 2211, 2211, 2210, 2210, + + 2211, 2211, 2211, 2211, 2211, 2211, 2211, 2211, + 2211, 2211, 2211, 2211, 2211, 2211, 2211, 2211, + 302, 302, 2211, 2211, 2211, 2211, 2211, 2211, + 2211, 2211, 2211, 2211, 2211, 2211, 2211, 2211, 2211, 2211, 2211, 2211, 2211, 2211, 2211, 2211, 2211, 2211, 2211, 2211, 2211, 2211, 2211, 2211, 2211, 2211, 2211, 2211, 2211, 2211, 2211, 2211, - 2211, 2211, 2211, 2211, 2211, 2212, 2212, 2212, + 2211, 2211, 2211, 2211, 2211, 2211, 2211, 2211, - 2213, 2213, 2213, 2213, 2213, 2214, 2215, 2214, - 2216, 2214, 2214, 2215, 2215, 2217, 2214, 2214, - 2214, 2214, 2214, 2213, 2213, 2213, 2213, 2217, - 2213, 2213, 2213, 2213, 2213, 2214, 2213, 2213, + 2212, 2213, 2213, 2213, 302, 2213, 2213, 302, + 302, 302, 302, 302, 2213, 2214, 2213, 2215, + 2212, 2212, 2212, 2212, 302, 2212, 2212, 2212, + 302, 2212, 2212, 2212, 2212, 2212, 2212, 2212, - 2213, 2214, 2215, 2215, 2214, 2218, 2219, 301, - 301, 301, 301, 2220, 2220, 2220, 2220, 2221, - 2222, 2222, 2222, 2222, 2222, 2222, 2223, 301, - 301, 301, 301, 301, 301, 301, 301, 301, + 2212, 2212, 2212, 2212, 2212, 2212, 2212, 2212, + 2212, 2212, 2212, 2212, 2212, 2212, 2212, 2212, + 2212, 2212, 2212, 2212, 2216, 2216, 302, 302, + 2215, 2217, 2214, 302, 302, 302, 302, 2218, - 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, - 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, - 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, - 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, - - 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, - 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, - 2224, 2224, 2224, 2224, 2224, 2224, 301, 301, - 301, 2225, 2225, 2225, 2225, 2225, 2225, 2225, - - 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, - 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, - 2226, 2226, 2226, 2226, 2226, 2226, 301, 301, - 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, + 2219, 2220, 2221, 2222, 2223, 2223, 2223, 2223, + 2224, 302, 302, 302, 302, 302, 302, 302, + 2225, 2225, 2225, 2225, 2225, 2225, 2226, 2226, + 2227, 302, 302, 302, 302, 302, 302, 302, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, - 2228, 2228, 2228, 301, 301, 301, 301, 301, - 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, + 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, + 2228, 2228, 2228, 2228, 2228, 2229, 2229, 2230, - 2230, 2231, 2230, 2231, 2231, 2231, 2230, 2230, - 2230, 2231, 2230, 2230, 2231, 2230, 2231, 2231, - 2230, 2231, 301, 301, 301, 301, 301, 301, - 301, 2232, 2232, 2232, 2232, 301, 301, 301, + 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, + 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, + 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, + 2231, 2231, 2231, 2231, 2231, 2232, 2232, 2232, - 301, 301, 301, 301, 301, 301, 301, 301, - 301, 2233, 2233, 2233, 2233, 2234, 2234, 2235, - 301, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, + 2233, 2233, 2233, 2233, 2233, 2234, 2235, 2234, + 2236, 2234, 2234, 2235, 2235, 2237, 2234, 2234, + 2234, 2234, 2234, 2233, 2233, 2233, 2233, 2237, + 2233, 2233, 2233, 2233, 2233, 2234, 2233, 2233, - 2236, 2236, 2236, 2236, 2236, 2236, 2236, 2236, - 2236, 2236, 2236, 2236, 2236, 2236, 2236, 2236, - 2236, 2236, 2236, 2236, 2236, 2236, 2236, 2236, - 2236, 2236, 2236, 2236, 2236, 2236, 2236, 2236, + 2233, 2234, 2235, 2235, 2234, 2238, 2239, 302, + 302, 302, 302, 2240, 2240, 2240, 2240, 2241, + 2242, 2242, 2242, 2242, 2242, 2242, 2243, 302, + 302, 302, 302, 302, 302, 302, 302, 302, - 2236, 2236, 2236, 2236, 2236, 2236, 2236, 2236, - 2236, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, + 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, + 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, + 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, + 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, - 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, - 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, - 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, - 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, + 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, + 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, + 2244, 2244, 2244, 2244, 2244, 2244, 302, 302, + 302, 2245, 2245, 2245, 2245, 2245, 2245, 2245, - 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, - 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, - 2237, 2237, 2237, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, + 2246, 2246, 2246, 2246, 2246, 2246, 2246, 2246, + 2246, 2246, 2246, 2246, 2246, 2246, 2246, 2246, + 2246, 2246, 2246, 2246, 2246, 2246, 302, 302, + 2247, 2247, 2247, 2247, 2247, 2247, 2247, 2247, - 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, - 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, - 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, - 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, + 2248, 2248, 2248, 2248, 2248, 2248, 2248, 2248, + 2248, 2248, 2248, 2248, 2248, 2248, 2248, 2248, + 2248, 2248, 2248, 302, 302, 302, 302, 302, + 2249, 2249, 2249, 2249, 2249, 2249, 2249, 2249, - 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, - 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, - 2238, 2238, 2238, 301, 301, 301, 301, 301, - 301, 301, 2239, 2239, 2239, 2239, 2239, 2239, + 2250, 2251, 2250, 2251, 2251, 2251, 2250, 2250, + 2250, 2251, 2250, 2250, 2251, 2250, 2251, 2251, + 2250, 2251, 302, 302, 302, 302, 302, 302, + 302, 2252, 2252, 2252, 2252, 302, 302, 302, - 2240, 2241, 2241, 2241, 2241, 2241, 2241, 2241, - 2241, 2241, 2241, 2241, 2241, 2241, 2241, 2241, - 2241, 2241, 2241, 2241, 2241, 2241, 2241, 2241, - 2241, 2241, 2241, 2241, 2241, 2241, 2241, 2241, + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 2253, 2253, 2253, 2253, 2254, 2254, 2255, + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, - 2241, 2241, 2242, 2241, 2243, 2243, 2243, 2243, - 301, 301, 301, 301, 301, 301, 301, 301, - 2244, 2245, 2246, 2247, 2248, 2249, 2250, 2251, - 2252, 2253, 301, 301, 301, 301, 301, 301, + 2256, 2256, 2256, 2256, 2256, 2256, 2256, 2256, + 2256, 2256, 2256, 2256, 2256, 2256, 2256, 2256, + 2256, 2256, 2256, 2256, 2256, 2256, 2256, 2256, + 2256, 2256, 2256, 2256, 2256, 2256, 2256, 2256, - 2254, 2255, 2256, 2257, 2258, 2259, 2260, 2261, - 2262, 2263, 2263, 2263, 2263, 2263, 2263, 2263, - 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, - 2263, 2263, 2263, 2263, 2263, 2263, 2263, 301, + 2256, 2256, 2256, 2256, 2256, 2256, 2256, 2256, + 2256, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, - 2264, 2264, 2264, 2264, 2264, 2264, 2264, 2264, - 2264, 2264, 2264, 2264, 2264, 2264, 2264, 2264, - 2264, 2264, 2264, 2264, 2264, 2264, 2264, 2264, - 2264, 2264, 2264, 2264, 2264, 2264, 2264, 2264, + 2257, 2257, 2257, 2257, 2257, 2257, 2257, 2257, + 2257, 2257, 2257, 2257, 2257, 2257, 2257, 2257, + 2257, 2257, 2257, 2257, 2257, 2257, 2257, 2257, + 2257, 2257, 2257, 2257, 2257, 2257, 2257, 2257, - 2264, 2264, 2264, 2264, 2264, 2264, 2264, 2264, - 2264, 2264, 301, 2265, 2265, 2266, 301, 301, - 2264, 2264, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, + 2257, 2257, 2257, 2257, 2257, 2257, 2257, 2257, + 2257, 2257, 2257, 2257, 2257, 2257, 2257, 2257, + 2257, 2257, 2257, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, - 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, - 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, - 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, - 2267, 2267, 2267, 2267, 2267, 2268, 2268, 2268, + 2258, 2258, 2258, 2258, 2258, 2258, 2258, 2258, + 2258, 2258, 2258, 2258, 2258, 2258, 2258, 2258, + 2258, 2258, 2258, 2258, 2258, 2258, 2258, 2258, + 2258, 2258, 2258, 2258, 2258, 2258, 2258, 2258, - 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2267, - 301, 301, 301, 301, 301, 301, 301, 301, - 2269, 2269, 2269, 2270, 2269, 2269, 2269, 2269, - 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, + 2258, 2258, 2258, 2258, 2258, 2258, 2258, 2258, + 2258, 2258, 2258, 2258, 2258, 2258, 2258, 2258, + 2258, 2258, 2258, 302, 302, 302, 302, 302, + 302, 302, 2259, 2259, 2259, 2259, 2259, 2259, - 2269, 2269, 2269, 2269, 2269, 2271, 2272, 2272, - 2273, 2273, 2273, 2272, 2273, 2272, 2272, 2272, - 2272, 2274, 2274, 2274, 2275, 2276, 2276, 2276, - 2276, 2276, 301, 301, 301, 301, 301, 301, + 2260, 2261, 2261, 2261, 2261, 2261, 2261, 2261, + 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, + 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, + 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, - 301, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, - 2277, 2278, 2277, 2277, 2279, 2279, 2279, 2278, - 2277, 2279, 2279, 2277, 2277, 2279, 2277, 2277, + 2261, 2261, 2262, 2261, 2263, 2263, 2263, 2263, + 302, 302, 302, 302, 302, 302, 302, 302, + 2264, 2265, 2266, 2267, 2268, 2269, 2270, 2271, + 2272, 2273, 302, 302, 302, 302, 302, 302, - 2278, 2277, 2279, 2279, 2277, 2280, 2280, 2280, - 2280, 2281, 2282, 2283, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, + 2274, 2275, 2276, 2277, 2278, 2279, 2280, 2281, + 2282, 2283, 2283, 2283, 2283, 2283, 2283, 2283, + 2283, 2283, 2283, 2283, 2283, 2283, 2283, 2283, + 2283, 2283, 2283, 2283, 2283, 2283, 2283, 302, 2284, 2284, 2284, 2284, 2284, 2284, 2284, 2284, 2284, 2284, 2284, 2284, 2284, 2284, 2284, 2284, - 2284, 2284, 2284, 2284, 2284, 2284, 2284, 301, - 301, 301, 301, 301, 301, 301, 301, 301, + 2284, 2284, 2284, 2284, 2284, 2284, 2284, 2284, + 2284, 2284, 2284, 2284, 2284, 2284, 2284, 2284, + + 2284, 2284, 2284, 2284, 2284, 2284, 2284, 2284, + 2284, 2284, 302, 2285, 2285, 2286, 302, 302, + 2284, 2284, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, - 2285, 2286, 2285, 2287, 2287, 2287, 2287, 2287, 2287, 2287, 2287, 2287, 2287, 2287, 2287, 2287, 2287, 2287, 2287, 2287, 2287, 2287, 2287, 2287, 2287, 2287, 2287, 2287, 2287, 2287, 2287, 2287, - 2287, 2287, 2287, 2287, 2287, 2287, 2287, 2287, - 2287, 2287, 2287, 2287, 2287, 2287, 2287, 2287, - 2287, 2287, 2287, 2287, 2287, 2287, 2287, 2287, - 2286, 2286, 2286, 2286, 2286, 2286, 2286, 2286, - 2286, 2286, 2286, 2286, 2286, 2286, 2288, 2289, - 2289, 2290, 2290, 2290, 2290, 2290, 202, 202, - 202, 202, 2291, 2292, 2293, 2294, 2295, 2296, - 2297, 2298, 2299, 2300, 2300, 2300, 2300, 2300, - 2300, 2300, 2300, 2300, 2300, 2300, 2301, 2302, - 2303, 2304, 2305, 2306, 2307, 2308, 2309, 2310, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 2311, - 2312, 2312, 2313, 2314, 2314, 2314, 2314, 2314, - 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, - 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, - 2314, 2314, 2315, 2314, 2315, 2314, 2314, 2314, - 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, - 2314, 2314, 2314, 2315, 2314, 2314, 2314, 2314, - 2313, 2313, 2313, 2312, 2312, 2312, 2312, 2313, - 2313, 2316, 2317, 2318, 2318, 2319, 2320, 2320, - 2320, 2320, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 2321, 202, 202, - 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, - 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, - 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, - 2322, 202, 202, 202, 202, 202, 202, 202, + 2287, 2287, 2287, 2287, 2287, 2288, 2288, 2288, + + 2288, 2288, 2288, 2288, 2288, 2288, 2288, 2287, + 302, 302, 302, 302, 302, 302, 302, 302, + 2289, 2289, 2289, 2290, 2289, 2289, 2289, 2289, + 2289, 2289, 2289, 2289, 2289, 2289, 2289, 2289, + + 2289, 2289, 2289, 2289, 2289, 2291, 2292, 2292, + 2293, 2293, 2293, 2292, 2293, 2292, 2292, 2292, + 2292, 2294, 2294, 2294, 2295, 2296, 2296, 2296, + 2296, 2296, 302, 302, 302, 302, 302, 302, + + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + 2297, 2298, 2297, 2297, 2299, 2299, 2299, 2298, + 2297, 2299, 2299, 2297, 2297, 2299, 2297, 2297, + + 2298, 2297, 2299, 2299, 2297, 2300, 2300, 2300, + 2300, 2301, 2302, 2303, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + + 2304, 2304, 2304, 2304, 2304, 2304, 2304, 2304, + 2304, 2304, 2304, 2304, 2304, 2304, 2304, 2304, + 2304, 2304, 2304, 2304, 2304, 2304, 2304, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + + 2305, 2306, 2305, 2307, 2307, 2307, 2307, 2307, + 2307, 2307, 2307, 2307, 2307, 2307, 2307, 2307, + 2307, 2307, 2307, 2307, 2307, 2307, 2307, 2307, + 2307, 2307, 2307, 2307, 2307, 2307, 2307, 2307, + 2307, 2307, 2307, 2307, 2307, 2307, 2307, 2307, + 2307, 2307, 2307, 2307, 2307, 2307, 2307, 2307, + 2307, 2307, 2307, 2307, 2307, 2307, 2307, 2307, + 2306, 2306, 2306, 2306, 2306, 2306, 2306, 2306, + 2306, 2306, 2306, 2306, 2306, 2306, 2308, 2309, + 2309, 2310, 2310, 2310, 2310, 2310, 203, 203, + 203, 203, 2311, 2312, 2313, 2314, 2315, 2316, + 2317, 2318, 2319, 2320, 2320, 2320, 2320, 2320, + 2320, 2320, 2320, 2320, 2320, 2320, 2321, 2322, 2323, 2324, 2325, 2326, 2327, 2328, 2329, 2330, - 2331, 2332, 202, 202, 202, 202, 202, 202, - - 2333, 2333, 2333, 2334, 2334, 2334, 2334, 2334, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 2331, + 2332, 2332, 2333, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, + 2334, 2334, 2335, 2334, 2335, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, - 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2335, - 2336, 2336, 2336, 2336, 2337, 2336, 2338, 2338, - 2336, 2336, 2336, 2339, 2339, 202, 2340, 2341, - 2342, 2343, 2344, 2345, 2346, 2347, 2348, 2349, - 2350, 2351, 2351, 2351, 2352, 2353, 2353, 2354, - 202, 202, 202, 202, 202, 202, 202, 202, - 2355, 2355, 2355, 2355, 2355, 2355, 2355, 2355, - 2355, 2355, 2355, 2355, 2355, 2355, 2355, 2355, - 2355, 2355, 2355, 2355, 2355, 2355, 2355, 2355, - 2355, 2355, 2355, 2355, 2355, 2355, 2355, 2355, - 2355, 2355, 2355, 2356, 2357, 2358, 2355, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 2359, 2359, 2360, 2361, 2361, 2361, 2361, 2361, - 2361, 2361, 2361, 2361, 2361, 2361, 2361, 2361, - 2361, 2361, 2361, 2361, 2361, 2361, 2361, 2361, - 2361, 2361, 2361, 2361, 2361, 2361, 2361, 2361, - 2361, 2361, 2361, 2361, 2361, 2361, 2361, 2361, - 2361, 2361, 2361, 2361, 2361, 2361, 2361, 2361, - 2361, 2361, 2361, 2360, 2360, 2360, 2359, 2359, - 2359, 2359, 2359, 2359, 2359, 2359, 2359, 2360, - 2362, 2361, 2363, 2363, 2361, 2364, 2364, 2365, - 2366, 2367, 2368, 2367, 2367, 2369, 2370, 2371, - 2372, 2373, 2374, 2375, 2376, 2377, 2378, 2379, - 2380, 2381, 2382, 2383, 2384, 2385, 2386, 2386, - 202, 2387, 2387, 2387, 2387, 2387, 2387, 2387, - 2387, 2387, 2387, 2387, 2387, 2387, 2387, 2387, - 2387, 2387, 2387, 2387, 2387, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, + 2334, 2334, 2334, 2335, 2334, 2334, 2334, 2334, + 2333, 2333, 2333, 2332, 2332, 2332, 2332, 2333, + 2333, 2336, 2337, 2338, 2338, 2339, 2340, 2340, + 2340, 2340, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 2341, 203, 203, + 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, + 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, + 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, + 2342, 203, 203, 203, 203, 203, 203, 203, + 2343, 2344, 2345, 2346, 2347, 2348, 2349, 2350, + 2351, 2352, 203, 203, 203, 203, 203, 203, - 2388, 2388, 2388, 2388, 2388, 2388, 2388, 2388, - 2388, 2388, 2388, 2388, 2388, 2388, 2388, 2388, - 2388, 2388, 202, 2388, 2388, 2388, 2388, 2388, - 2388, 2388, 2388, 2388, 2388, 2388, 2388, 2388, - 2388, 2388, 2388, 2388, 2388, 2388, 2388, 2388, - 2388, 2388, 2388, 2388, 2389, 2389, 2389, 2390, - 2390, 2390, 2389, 2389, 2390, 2391, 2392, 2390, - 2393, 2393, 2394, 2393, 2393, 2394, 2395, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 2396, 2396, 2396, 2396, 2396, 2396, 2396, 202, - 2396, 202, 2396, 2396, 2396, 2396, 202, 2396, - 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, - 2396, 2396, 2396, 2396, 2396, 2396, 202, 2396, - 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, - 2396, 2397, 202, 202, 202, 202, 202, 202, - 2398, 2398, 2398, 2398, 2398, 2398, 2398, 2398, - 2398, 2398, 2398, 2398, 2398, 2398, 2398, 2398, - 2398, 2398, 2398, 2398, 2398, 2398, 2398, 2398, - 2398, 2398, 2398, 2398, 2398, 2398, 2398, 2398, - 2398, 2398, 2398, 2398, 2398, 2398, 2398, 2398, - 2398, 2398, 2398, 2398, 2398, 2398, 2398, 2399, - 2400, 2400, 2400, 2399, 2399, 2399, 2399, 2399, - 2399, 2401, 2402, 202, 202, 202, 202, 202, - 2403, 2404, 2405, 2406, 2407, 2408, 2409, 2410, - 2411, 2412, 202, 202, 202, 202, 202, 202, + 2353, 2353, 2353, 2354, 2354, 2354, 2354, 2354, + 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, + 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, + 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, + 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2355, + 2356, 2356, 2356, 2356, 2357, 2356, 2358, 2358, + 2356, 2356, 2356, 2359, 2359, 203, 2360, 2361, + 2362, 2363, 2364, 2365, 2366, 2367, 2368, 2369, + 2370, 2371, 2371, 2371, 2372, 2373, 2373, 2374, + 203, 203, 203, 203, 203, 203, 203, 203, + 2375, 2375, 2375, 2375, 2375, 2375, 2375, 2375, + 2375, 2375, 2375, 2375, 2375, 2375, 2375, 2375, + 2375, 2375, 2375, 2375, 2375, 2375, 2375, 2375, + 2375, 2375, 2375, 2375, 2375, 2375, 2375, 2375, + 2375, 2375, 2375, 2376, 2377, 2378, 2375, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 2379, 2379, 2380, 2381, 2381, 2381, 2381, 2381, + 2381, 2381, 2381, 2381, 2381, 2381, 2381, 2381, + 2381, 2381, 2381, 2381, 2381, 2381, 2381, 2381, + 2381, 2381, 2381, 2381, 2381, 2381, 2381, 2381, + 2381, 2381, 2381, 2381, 2381, 2381, 2381, 2381, + 2381, 2381, 2381, 2381, 2381, 2381, 2381, 2381, + 2381, 2381, 2381, 2380, 2380, 2380, 2379, 2379, + 2379, 2379, 2379, 2379, 2379, 2379, 2379, 2380, + 2382, 2381, 2383, 2383, 2381, 2384, 2384, 2385, + 2386, 2387, 2388, 2387, 2387, 2389, 2390, 2391, + 2392, 2393, 2394, 2395, 2396, 2397, 2398, 2399, + 2400, 2401, 2402, 2403, 2404, 2405, 2406, 2406, + 203, 2407, 2407, 2407, 2407, 2407, 2407, 2407, + 2407, 2407, 2407, 2407, 2407, 2407, 2407, 2407, + 2407, 2407, 2407, 2407, 2407, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, - 2413, 2414, 2415, 2415, 202, 2416, 2416, 2416, - 2416, 2416, 2416, 2416, 2416, 202, 202, 2416, - 2416, 202, 202, 2416, 2416, 2416, 2416, 2416, + 2408, 2408, 2408, 2408, 2408, 2408, 2408, 2408, + 2408, 2408, 2408, 2408, 2408, 2408, 2408, 2408, + 2408, 2408, 203, 2408, 2408, 2408, 2408, 2408, + 2408, 2408, 2408, 2408, 2408, 2408, 2408, 2408, + 2408, 2408, 2408, 2408, 2408, 2408, 2408, 2408, + 2408, 2408, 2408, 2408, 2409, 2409, 2409, 2410, + 2410, 2410, 2409, 2409, 2410, 2411, 2412, 2410, + 2413, 2413, 2414, 2413, 2413, 2414, 2415, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 2416, 2416, 2416, 2416, 2416, 2416, 2416, 203, + 2416, 203, 2416, 2416, 2416, 2416, 203, 2416, 2416, 2416, 2416, 2416, 2416, 2416, 2416, 2416, + 2416, 2416, 2416, 2416, 2416, 2416, 203, 2416, 2416, 2416, 2416, 2416, 2416, 2416, 2416, 2416, - 2416, 202, 2416, 2416, 2416, 2416, 2416, 2416, - 2416, 202, 2416, 2416, 202, 2416, 2416, 2416, - 2416, 2416, 202, 2417, 2418, 2416, 2419, 2415, - 2414, 2415, 2415, 2415, 2415, 202, 202, 2415, - 2415, 202, 202, 2420, 2420, 2421, 202, 202, - 2422, 202, 202, 202, 202, 202, 202, 2419, - 202, 202, 202, 202, 202, 2416, 2416, 2416, - 2416, 2416, 2415, 2415, 202, 202, 2423, 2423, - 2423, 2423, 2423, 2423, 2423, 202, 202, 202, - 2423, 2423, 2423, 2423, 2423, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, + 2416, 2417, 203, 203, 203, 203, 203, 203, + 2418, 2418, 2418, 2418, 2418, 2418, 2418, 2418, + 2418, 2418, 2418, 2418, 2418, 2418, 2418, 2418, + 2418, 2418, 2418, 2418, 2418, 2418, 2418, 2418, + 2418, 2418, 2418, 2418, 2418, 2418, 2418, 2418, + 2418, 2418, 2418, 2418, 2418, 2418, 2418, 2418, + 2418, 2418, 2418, 2418, 2418, 2418, 2418, 2419, + 2420, 2420, 2420, 2419, 2419, 2419, 2419, 2419, + 2419, 2421, 2422, 203, 203, 203, 203, 203, + 2423, 2424, 2425, 2426, 2427, 2428, 2429, 2430, + 2431, 2432, 203, 203, 203, 203, 203, 203, - 2424, 2424, 2424, 2424, 2424, 2424, 2424, 2424, - 2424, 2424, 2424, 2424, 2424, 2424, 2424, 2424, - 2424, 2424, 2424, 2424, 2424, 2424, 2424, 2424, - 2424, 2424, 2424, 2424, 2424, 2424, 2424, 2424, - 2424, 2424, 2424, 2424, 2424, 2424, 2424, 2424, - 2424, 2424, 2424, 2424, 2424, 2424, 2424, 2424, - 2424, 2424, 2424, 2424, 2424, 2425, 2425, 2425, - 2426, 2426, 2426, 2426, 2426, 2426, 2426, 2426, - 2425, 2425, 2427, 2426, 2426, 2425, 2428, 2424, - 2424, 2424, 2424, 2429, 2429, 2430, 2430, 2431, - 2432, 2433, 2434, 2435, 2436, 2437, 2438, 2439, - 2440, 2441, 2442, 2430, 202, 2431, 2443, 2444, - 2445, 2445, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 2446, 2446, 2446, 2446, 2446, 2446, 2446, 2446, - 2446, 2446, 2446, 2446, 2446, 2446, 2446, 2446, - 2446, 2446, 2446, 2446, 2446, 2446, 2446, 2446, - 2446, 2446, 2446, 2446, 2446, 2446, 2446, 2446, - 2446, 2446, 2446, 2446, 2446, 2446, 2446, 2446, - 2446, 2446, 2446, 2446, 2446, 2446, 2446, 2446, - 2447, 2448, 2448, 2449, 2449, 2449, 2449, 2449, - 2449, 2448, 2450, 2451, 2451, 2447, 2451, 2449, - 2449, 2448, 2452, 2453, 2446, 2446, 2454, 2446, - 202, 202, 202, 202, 202, 202, 202, 202, - 2455, 2456, 2457, 2458, 2459, 2460, 2461, 2462, - 2463, 2464, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, + 2433, 2434, 2435, 2435, 203, 2436, 2436, 2436, + 2436, 2436, 2436, 2436, 2436, 203, 203, 2436, + 2436, 203, 203, 2436, 2436, 2436, 2436, 2436, + 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, + 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, + 2436, 203, 2436, 2436, 2436, 2436, 2436, 2436, + 2436, 203, 2436, 2436, 203, 2436, 2436, 2436, + 2436, 2436, 203, 2437, 2438, 2436, 2439, 2435, + 2434, 2435, 2435, 2435, 2435, 203, 203, 2435, + 2435, 203, 203, 2440, 2440, 2441, 203, 203, + 2442, 203, 203, 203, 203, 203, 203, 2439, + 203, 203, 203, 203, 203, 2436, 2436, 2436, + 2436, 2436, 2435, 2435, 203, 203, 2443, 2443, + 2443, 2443, 2443, 2443, 2443, 203, 203, 203, + 2443, 2443, 2443, 2443, 2443, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 2465, 2465, 2465, 2465, 2465, 2465, 2465, 2465, - 2465, 2465, 2465, 2465, 2465, 2465, 2465, 2465, - 2465, 2465, 2465, 2465, 2465, 2465, 2465, 2465, - 2465, 2465, 2465, 2465, 2465, 2465, 2465, 2465, - 2465, 2465, 2465, 2465, 2465, 2465, 2465, 2465, - 2465, 2465, 2465, 2465, 2465, 2465, 2465, 2466, - 2467, 2467, 2468, 2468, 2468, 2468, 202, 202, - 2467, 2467, 2469, 2469, 2468, 2468, 2467, 2470, - 2471, 2472, 2473, 2473, 2474, 2474, 2475, 2475, - 2475, 2473, 2476, 2476, 2476, 2476, 2476, 2476, - 2476, 2476, 2476, 2476, 2476, 2476, 2476, 2476, - 2477, 2477, 2477, 2477, 2478, 2478, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, + 2444, 2444, 2444, 2444, 2444, 2444, 2444, 2444, + 2444, 2444, 2444, 2444, 2444, 2444, 2444, 2444, + 2444, 2444, 2444, 2444, 2444, 2444, 2444, 2444, + 2444, 2444, 2444, 2444, 2444, 2444, 2444, 2444, + 2444, 2444, 2444, 2444, 2444, 2444, 2444, 2444, + 2444, 2444, 2444, 2444, 2444, 2444, 2444, 2444, + 2444, 2444, 2444, 2444, 2444, 2445, 2445, 2445, + 2446, 2446, 2446, 2446, 2446, 2446, 2446, 2446, + 2445, 2445, 2447, 2446, 2446, 2445, 2448, 2444, + 2444, 2444, 2444, 2449, 2449, 2450, 2450, 2451, + 2452, 2453, 2454, 2455, 2456, 2457, 2458, 2459, + 2460, 2461, 2462, 2450, 203, 2451, 2463, 2464, + 2465, 2465, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 2466, 2466, 2466, 2466, 2466, 2466, 2466, 2466, + 2466, 2466, 2466, 2466, 2466, 2466, 2466, 2466, + 2466, 2466, 2466, 2466, 2466, 2466, 2466, 2466, + 2466, 2466, 2466, 2466, 2466, 2466, 2466, 2466, + 2466, 2466, 2466, 2466, 2466, 2466, 2466, 2466, + 2466, 2466, 2466, 2466, 2466, 2466, 2466, 2466, + 2467, 2468, 2468, 2469, 2469, 2469, 2469, 2469, + 2469, 2468, 2470, 2471, 2471, 2467, 2471, 2469, + 2469, 2468, 2472, 2473, 2466, 2466, 2474, 2466, + 203, 203, 203, 203, 203, 203, 203, 203, + 2475, 2476, 2477, 2478, 2479, 2480, 2481, 2482, + 2483, 2484, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, - 2479, 2479, 2479, 2479, 2479, 2479, 2479, 2479, - 2479, 2479, 2479, 2479, 2479, 2479, 2479, 2479, - 2479, 2479, 2479, 2479, 2479, 2479, 2479, 2479, - 2479, 2479, 2479, 2479, 2479, 2479, 2479, 2479, - 2479, 2479, 2479, 2479, 2479, 2479, 2479, 2479, - 2479, 2479, 2479, 2479, 2479, 2479, 2479, 2479, - 2480, 2480, 2480, 2481, 2481, 2481, 2481, 2481, - 2481, 2481, 2481, 2480, 2480, 2481, 2480, 2482, - 2481, 2483, 2483, 2484, 2479, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 2485, 2486, 2487, 2488, 2489, 2490, 2491, 2492, - 2493, 2494, 202, 202, 202, 202, 202, 202, - 2495, 2495, 2495, 2495, 2495, 2495, 2495, 2495, - 2495, 2495, 2495, 2495, 2495, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, + 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, + 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, + 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, + 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, + 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2486, + 2487, 2487, 2488, 2488, 2488, 2488, 203, 203, + 2487, 2487, 2489, 2489, 2488, 2488, 2487, 2490, + 2491, 2492, 2493, 2493, 2494, 2494, 2495, 2495, + 2495, 2493, 2496, 2496, 2496, 2496, 2496, 2496, 2496, 2496, 2496, 2496, 2496, 2496, 2496, 2496, - 2496, 2496, 2496, 2496, 2496, 2496, 2496, 2496, - 2496, 2496, 2496, 2496, 2496, 2496, 2496, 2496, - 2496, 2496, 2496, 2496, 2496, 2496, 2496, 2496, - 2496, 2496, 2496, 2496, 2496, 2496, 2496, 2496, - 2496, 2496, 2496, 2497, 2498, 2497, 2498, 2498, - 2497, 2497, 2497, 2497, 2497, 2497, 2499, 2500, - 2501, 202, 202, 202, 202, 202, 202, 202, - 2502, 2503, 2504, 2505, 2506, 2507, 2508, 2509, - 2510, 2511, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, + 2497, 2497, 2497, 2497, 2498, 2498, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, - 2512, 2512, 2512, 2512, 2512, 2512, 2512, 2512, - 2512, 2512, 2512, 2512, 2512, 2512, 2512, 2512, - 2512, 2512, 2512, 2512, 2512, 2512, 2512, 2512, - 2512, 2512, 2513, 202, 202, 2514, 2514, 2514, - 2515, 2515, 2514, 2514, 2514, 2514, 2515, 2514, - 2514, 2514, 2514, 2516, 202, 202, 202, 202, - 2517, 2518, 2519, 2520, 2521, 2522, 2523, 2524, - 2525, 2526, 2527, 2527, 2528, 2528, 2528, 2529, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, + 2499, 2499, 2499, 2499, 2499, 2499, 2499, 2499, + 2499, 2499, 2499, 2499, 2499, 2499, 2499, 2499, + 2499, 2499, 2499, 2499, 2499, 2499, 2499, 2499, + 2499, 2499, 2499, 2499, 2499, 2499, 2499, 2499, + 2499, 2499, 2499, 2499, 2499, 2499, 2499, 2499, + 2499, 2499, 2499, 2499, 2499, 2499, 2499, 2499, + 2500, 2500, 2500, 2501, 2501, 2501, 2501, 2501, + 2501, 2501, 2501, 2500, 2500, 2501, 2500, 2502, + 2501, 2503, 2503, 2504, 2499, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 2505, 2506, 2507, 2508, 2509, 2510, 2511, 2512, + 2513, 2514, 203, 203, 203, 203, 203, 203, + 2515, 2515, 2515, 2515, 2515, 2515, 2515, 2515, + 2515, 2515, 2515, 2515, 2515, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 2516, 2516, 2516, 2516, 2516, 2516, 2516, 2516, + 2516, 2516, 2516, 2516, 2516, 2516, 2516, 2516, + 2516, 2516, 2516, 2516, 2516, 2516, 2516, 2516, + 2516, 2516, 2516, 2516, 2516, 2516, 2516, 2516, + 2516, 2516, 2516, 2516, 2516, 2516, 2516, 2516, + 2516, 2516, 2516, 2517, 2518, 2517, 2518, 2518, + 2517, 2517, 2517, 2517, 2517, 2517, 2519, 2520, + 2521, 203, 203, 203, 203, 203, 203, 203, + 2522, 2523, 2524, 2525, 2526, 2527, 2528, 2529, + 2530, 2531, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, - 2530, 2530, 2530, 2530, 2530, 2530, 2530, 2530, - 2530, 2530, 2530, 2530, 2530, 2530, 2530, 2530, - 2530, 2530, 2530, 2530, 2530, 2530, 2530, 2530, - 2530, 2530, 2530, 2530, 2530, 2530, 2530, 2530, - 2530, 2530, 2530, 2530, 2530, 2530, 2530, 2530, - 2530, 2530, 2530, 2530, 2531, 2531, 2531, 2532, 2532, 2532, 2532, 2532, 2532, 2532, 2532, 2532, - 2531, 2533, 2534, 2535, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 2536, 2536, 2536, 2536, 2536, 2536, 2536, 2536, - 2536, 2536, 2536, 2536, 2536, 2536, 2536, 2536, - 2536, 2536, 2536, 2536, 2536, 2536, 2536, 2536, - 2536, 2536, 2536, 2536, 2536, 2536, 2536, 2536, - 2537, 2537, 2537, 2537, 2537, 2537, 2537, 2537, - 2537, 2537, 2537, 2537, 2537, 2537, 2537, 2537, - 2537, 2537, 2537, 2537, 2537, 2537, 2537, 2537, - 2537, 2537, 2537, 2537, 2537, 2537, 2537, 2537, - 2538, 2539, 2540, 2541, 2542, 2543, 2544, 2545, - 2546, 2547, 2548, 2548, 2548, 2548, 2548, 2548, - 2548, 2548, 2548, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 2549, + 2532, 2532, 2532, 2532, 2532, 2532, 2532, 2532, + 2532, 2532, 2532, 2532, 2532, 2532, 2532, 2532, + 2532, 2532, 2533, 203, 203, 2534, 2534, 2534, + 2535, 2535, 2534, 2534, 2534, 2534, 2535, 2534, + 2534, 2534, 2534, 2536, 203, 203, 203, 203, + 2537, 2538, 2539, 2540, 2541, 2542, 2543, 2544, + 2545, 2546, 2547, 2547, 2548, 2548, 2548, 2549, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, - 2550, 2550, 2550, 2550, 2550, 2550, 2550, 202, - 202, 2550, 202, 202, 2550, 2550, 2550, 2550, - 2550, 2550, 2550, 2550, 202, 2550, 2550, 202, 2550, 2550, 2550, 2550, 2550, 2550, 2550, 2550, 2550, 2550, 2550, 2550, 2550, 2550, 2550, 2550, 2550, 2550, 2550, 2550, 2550, 2550, 2550, 2550, - 2551, 2552, 2552, 2552, 2552, 2552, 202, 2552, - 2553, 202, 202, 2554, 2554, 2555, 2556, 2557, - 2552, 2557, 2552, 2558, 2559, 2560, 2559, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 2561, 2562, 2563, 2564, 2565, 2566, 2567, 2568, - 2569, 2570, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 2571, 2571, 2571, 2571, 2571, 2571, 2571, 2571, - 202, 202, 2571, 2571, 2571, 2571, 2571, 2571, - 2571, 2571, 2571, 2571, 2571, 2571, 2571, 2571, - 2571, 2571, 2571, 2571, 2571, 2571, 2571, 2571, - 2571, 2571, 2571, 2571, 2571, 2571, 2571, 2571, - 2571, 2571, 2571, 2571, 2571, 2571, 2571, 2571, - 2571, 2572, 2572, 2572, 2573, 2573, 2573, 2573, - 202, 202, 2573, 2573, 2572, 2572, 2572, 2572, - 2574, 2571, 2575, 2571, 2572, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, + 2550, 2550, 2550, 2550, 2550, 2550, 2550, 2550, + 2550, 2550, 2550, 2550, 2550, 2550, 2550, 2550, + 2550, 2550, 2550, 2550, 2551, 2551, 2551, 2552, + 2552, 2552, 2552, 2552, 2552, 2552, 2552, 2552, + 2551, 2553, 2554, 2555, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 2556, 2556, 2556, 2556, 2556, 2556, 2556, 2556, + 2556, 2556, 2556, 2556, 2556, 2556, 2556, 2556, + 2556, 2556, 2556, 2556, 2556, 2556, 2556, 2556, + 2556, 2556, 2556, 2556, 2556, 2556, 2556, 2556, + 2557, 2557, 2557, 2557, 2557, 2557, 2557, 2557, + 2557, 2557, 2557, 2557, 2557, 2557, 2557, 2557, + 2557, 2557, 2557, 2557, 2557, 2557, 2557, 2557, + 2557, 2557, 2557, 2557, 2557, 2557, 2557, 2557, + 2558, 2559, 2560, 2561, 2562, 2563, 2564, 2565, + 2566, 2567, 2568, 2568, 2568, 2568, 2568, 2568, + 2568, 2568, 2568, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 2569, - 2576, 2577, 2577, 2577, 2577, 2577, 2577, 2578, - 2578, 2577, 2577, 2576, 2576, 2576, 2576, 2576, - 2576, 2576, 2576, 2576, 2576, 2576, 2576, 2576, - 2576, 2576, 2576, 2576, 2576, 2576, 2576, 2576, - 2576, 2576, 2576, 2576, 2576, 2576, 2576, 2576, - 2576, 2576, 2576, 2576, 2576, 2576, 2576, 2576, - 2576, 2576, 2576, 2577, 2579, 2577, 2577, 2577, - 2577, 2580, 2581, 2577, 2577, 2577, 2577, 2582, - 2583, 2584, 2585, 2585, 2584, 2582, 2583, 2579, - 202, 202, 202, 202, 202, 202, 202, 202, - 2586, 2587, 2587, 2587, 2587, 2587, 2587, 2588, - 2588, 2587, 2587, 2587, 2586, 2586, 2586, 2586, - 2586, 2586, 2586, 2586, 2586, 2586, 2586, 2586, - 2586, 2586, 2586, 2586, 2586, 2586, 2586, 2586, - 2586, 2586, 2586, 2586, 2586, 2586, 2586, 2586, - 2586, 2586, 2586, 2586, 2586, 2586, 2586, 2586, - 2586, 2586, 2586, 2586, 2589, 2589, 2590, 2590, - 2590, 2590, 2587, 2587, 2587, 2587, 2587, 2587, - 2587, 2587, 2587, 2587, 2587, 2587, 2587, 2588, - 2587, 2591, 2592, 2593, 2593, 2594, 2595, 2595, - 2595, 2592, 2592, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 2596, 2596, 2596, 2596, 2596, 2596, 2596, 2596, - 2596, 2596, 2596, 2596, 2596, 2596, 2596, 2596, - 2596, 2596, 2596, 2596, 2596, 2596, 2596, 2596, - 2596, 2596, 2596, 2596, 2596, 2596, 2596, 2596, - 2596, 2596, 2596, 2596, 2596, 2596, 2596, 2596, - 2596, 2596, 2596, 2596, 2596, 2596, 2596, 2596, - 2596, 2596, 2596, 2596, 2596, 2596, 2596, 2596, - 2596, 202, 202, 202, 202, 202, 202, 202, + 2570, 2570, 2570, 2570, 2570, 2570, 2570, 203, + 203, 2570, 203, 203, 2570, 2570, 2570, 2570, + 2570, 2570, 2570, 2570, 203, 2570, 2570, 203, + 2570, 2570, 2570, 2570, 2570, 2570, 2570, 2570, + 2570, 2570, 2570, 2570, 2570, 2570, 2570, 2570, + 2570, 2570, 2570, 2570, 2570, 2570, 2570, 2570, + 2571, 2572, 2572, 2572, 2572, 2572, 203, 2572, + 2573, 203, 203, 2574, 2574, 2575, 2576, 2577, + 2572, 2577, 2572, 2578, 2579, 2580, 2579, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 2581, 2582, 2583, 2584, 2585, 2586, 2587, 2588, + 2589, 2590, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 2591, 2591, 2591, 2591, 2591, 2591, 2591, 2591, + 203, 203, 2591, 2591, 2591, 2591, 2591, 2591, + 2591, 2591, 2591, 2591, 2591, 2591, 2591, 2591, + 2591, 2591, 2591, 2591, 2591, 2591, 2591, 2591, + 2591, 2591, 2591, 2591, 2591, 2591, 2591, 2591, + 2591, 2591, 2591, 2591, 2591, 2591, 2591, 2591, + 2591, 2592, 2592, 2592, 2593, 2593, 2593, 2593, + 203, 203, 2593, 2593, 2592, 2592, 2592, 2592, + 2594, 2591, 2595, 2591, 2592, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - - 2597, 2597, 2597, 2597, 2597, 2597, 2597, 2597, - 2597, 202, 2597, 2597, 2597, 2597, 2597, 2597, - 2597, 2597, 2597, 2597, 2597, 2597, 2597, 2597, - 2597, 2597, 2597, 2597, 2597, 2597, 2597, 2597, - 2597, 2597, 2597, 2597, 2597, 2597, 2597, 2597, - 2597, 2597, 2597, 2597, 2597, 2597, 2597, 2598, - 2599, 2599, 2599, 2599, 2599, 2599, 2599, 202, - 2599, 2599, 2599, 2599, 2599, 2599, 2598, 2600, - 2597, 2601, 2601, 2602, 2602, 2602, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 2603, 2604, 2605, 2606, 2607, 2608, 2609, 2610, - 2611, 2612, 2613, 2613, 2613, 2613, 2613, 2613, - 2613, 2613, 2613, 2613, 2613, 2613, 2613, 2613, - 2613, 2613, 2613, 2613, 2613, 202, 202, 202, - 2614, 2615, 2616, 2616, 2616, 2616, 2616, 2616, + 2596, 2597, 2597, 2597, 2597, 2597, 2597, 2598, + 2598, 2597, 2597, 2596, 2596, 2596, 2596, 2596, + 2596, 2596, 2596, 2596, 2596, 2596, 2596, 2596, + 2596, 2596, 2596, 2596, 2596, 2596, 2596, 2596, + 2596, 2596, 2596, 2596, 2596, 2596, 2596, 2596, + 2596, 2596, 2596, 2596, 2596, 2596, 2596, 2596, + 2596, 2596, 2596, 2597, 2599, 2597, 2597, 2597, + 2597, 2600, 2601, 2597, 2597, 2597, 2597, 2602, + 2603, 2604, 2605, 2605, 2604, 2602, 2603, 2599, + 203, 203, 203, 203, 203, 203, 203, 203, + 2606, 2607, 2607, 2607, 2607, 2607, 2607, 2608, + 2608, 2607, 2607, 2607, 2606, 2606, 2606, 2606, + 2606, 2606, 2606, 2606, 2606, 2606, 2606, 2606, + 2606, 2606, 2606, 2606, 2606, 2606, 2606, 2606, + 2606, 2606, 2606, 2606, 2606, 2606, 2606, 2606, + 2606, 2606, 2606, 2606, 2606, 2606, 2606, 2606, + 2606, 2606, 2606, 2606, 2609, 2609, 2610, 2610, + 2610, 2610, 2607, 2607, 2607, 2607, 2607, 2607, + 2607, 2607, 2607, 2607, 2607, 2607, 2607, 2608, + 2607, 2611, 2612, 2613, 2613, 2614, 2615, 2615, + 2615, 2612, 2612, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, 2616, 2616, 2616, 2616, 2616, 2616, 2616, 2616, 2616, 2616, 2616, 2616, 2616, 2616, 2616, 2616, 2616, 2616, 2616, 2616, 2616, 2616, 2616, 2616, - 202, 202, 2617, 2617, 2617, 2617, 2617, 2617, + 2616, 2616, 2616, 2616, 2616, 2616, 2616, 2616, + 2616, 2616, 2616, 2616, 2616, 2616, 2616, 2616, + 2616, 2616, 2616, 2616, 2616, 2616, 2616, 2616, + 2616, 2616, 2616, 2616, 2616, 2616, 2616, 2616, + 2616, 203, 203, 203, 203, 203, 203, 203, + + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + + 2617, 2617, 2617, 2617, 2617, 2617, 2617, 2617, + 2617, 203, 2617, 2617, 2617, 2617, 2617, 2617, 2617, 2617, 2617, 2617, 2617, 2617, 2617, 2617, 2617, 2617, 2617, 2617, 2617, 2617, 2617, 2617, - 202, 2618, 2617, 2617, 2617, 2617, 2617, 2617, - 2617, 2618, 2617, 2617, 2618, 2617, 2617, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, + 2617, 2617, 2617, 2617, 2617, 2617, 2617, 2617, + 2617, 2617, 2617, 2617, 2617, 2617, 2617, 2618, + 2619, 2619, 2619, 2619, 2619, 2619, 2619, 203, + 2619, 2619, 2619, 2619, 2619, 2619, 2618, 2620, + 2617, 2621, 2621, 2622, 2622, 2622, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 2623, 2624, 2625, 2626, 2627, 2628, 2629, 2630, + 2631, 2632, 2633, 2633, 2633, 2633, 2633, 2633, + 2633, 2633, 2633, 2633, 2633, 2633, 2633, 2633, + 2633, 2633, 2633, 2633, 2633, 203, 203, 203, + 2634, 2635, 2636, 2636, 2636, 2636, 2636, 2636, + 2636, 2636, 2636, 2636, 2636, 2636, 2636, 2636, + 2636, 2636, 2636, 2636, 2636, 2636, 2636, 2636, + 2636, 2636, 2636, 2636, 2636, 2636, 2636, 2636, + 203, 203, 2637, 2637, 2637, 2637, 2637, 2637, + 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, + 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, + 203, 2638, 2637, 2637, 2637, 2637, 2637, 2637, + 2637, 2638, 2637, 2637, 2638, 2637, 2637, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, - 2619, 2619, 2619, 2619, 2619, 2619, 2619, 202, - 2619, 2619, 202, 2619, 2619, 2619, 2619, 2619, - 2619, 2619, 2619, 2619, 2619, 2619, 2619, 2619, - 2619, 2619, 2619, 2619, 2619, 2619, 2619, 2619, - 2619, 2619, 2619, 2619, 2619, 2619, 2619, 2619, - 2619, 2619, 2619, 2619, 2619, 2619, 2619, 2619, - 2619, 2620, 2620, 2620, 2620, 2620, 2620, 202, - 202, 202, 2620, 202, 2620, 2620, 202, 2620, - 2620, 2620, 2621, 2620, 2622, 2622, 2623, 2620, - 202, 202, 202, 202, 202, 202, 202, 202, - 2624, 2625, 2626, 2627, 2628, 2629, 2630, 2631, - 2632, 2633, 202, 202, 202, 202, 202, 202, - 2634, 2634, 2634, 2634, 2634, 2634, 202, 2634, - 2634, 202, 2634, 2634, 2634, 2634, 2634, 2634, - 2634, 2634, 2634, 2634, 2634, 2634, 2634, 2634, - 2634, 2634, 2634, 2634, 2634, 2634, 2634, 2634, - 2634, 2634, 2634, 2634, 2634, 2634, 2634, 2634, - 2634, 2634, 2635, 2635, 2635, 2635, 2635, 202, - 2636, 2636, 202, 2635, 2635, 2636, 2635, 2637, - 2634, 202, 202, 202, 202, 202, 202, 202, - 2638, 2639, 2640, 2641, 2642, 2643, 2644, 2645, - 2646, 2647, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 2648, 2648, 2648, 2648, 2648, 2648, 2648, 2648, - 2648, 2648, 2648, 2648, 2648, 2648, 2648, 2648, - 2648, 2648, 2648, 2649, 2649, 2650, 2650, 2651, - 2651, 202, 202, 202, 202, 202, 202, 202, - - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 2652, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 2653, 2653, 2653, 2653, 2653, 2653, 2653, 2653, - 2653, 2653, 2653, 2653, 2653, 2653, 2653, 2653, - 2653, 2653, 2653, 2653, 2653, 2654, 2654, 2654, - 2654, 2654, 2654, 2654, 2654, 2655, 2655, 2655, - 2655, 2654, 2654, 2654, 2654, 2654, 2654, 2654, + 2639, 2639, 2639, 2639, 2639, 2639, 2639, 203, + 2639, 2639, 203, 2639, 2639, 2639, 2639, 2639, + 2639, 2639, 2639, 2639, 2639, 2639, 2639, 2639, + 2639, 2639, 2639, 2639, 2639, 2639, 2639, 2639, + 2639, 2639, 2639, 2639, 2639, 2639, 2639, 2639, + 2639, 2639, 2639, 2639, 2639, 2639, 2639, 2639, + 2639, 2640, 2640, 2640, 2640, 2640, 2640, 203, + 203, 203, 2640, 203, 2640, 2640, 203, 2640, + 2640, 2640, 2641, 2640, 2642, 2642, 2643, 2640, + 203, 203, 203, 203, 203, 203, 203, 203, + 2644, 2645, 2646, 2647, 2648, 2649, 2650, 2651, + 2652, 2653, 203, 203, 203, 203, 203, 203, + 2654, 2654, 2654, 2654, 2654, 2654, 203, 2654, + 2654, 203, 2654, 2654, 2654, 2654, 2654, 2654, 2654, 2654, 2654, 2654, 2654, 2654, 2654, 2654, - 2654, 2654, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 2656, + 2654, 2654, 2654, 2654, 2654, 2654, 2654, 2654, + 2654, 2654, 2654, 2654, 2654, 2654, 2654, 2654, + 2654, 2654, 2655, 2655, 2655, 2655, 2655, 203, + 2656, 2656, 203, 2655, 2655, 2656, 2655, 2657, + 2654, 203, 203, 203, 203, 203, 203, 203, + 2658, 2659, 2660, 2661, 2662, 2663, 2664, 2665, + 2666, 2667, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, - 2657, 2657, 2657, 2657, 2657, 2657, 2657, 2657, - 2657, 2657, 2657, 2657, 2657, 2657, 2657, 2657, - 2657, 2657, 2657, 2657, 2657, 2657, 2657, 2657, - 2657, 2657, 2657, 2657, 2657, 2657, 2657, 2657, - 2657, 2657, 2657, 2657, 2657, 2657, 2657, 2657, - 2657, 2657, 2657, 2657, 2657, 2657, 2657, 2657, - 2657, 2657, 2657, 2657, 2657, 2657, 2657, 2657, - 2657, 2657, 2657, 2657, 2657, 2657, 2657, 2657, - 2657, 2657, 2657, 2657, 2657, 2657, 2657, 2657, - 2657, 2657, 2657, 2657, 2657, 2657, 2657, 2657, - 2657, 2657, 2657, 2657, 2657, 2657, 2657, 2657, - 2657, 2657, 2657, 2657, 2657, 2657, 2657, 2657, - 2657, 2657, 2657, 2657, 2657, 2657, 2657, 2657, - 2657, 2657, 2657, 2657, 2657, 2657, 2657, 2657, - 2657, 2657, 2657, 2657, 2657, 2657, 2657, 2657, - 2657, 2657, 2657, 2657, 2657, 2657, 2657, 2657, - 2657, 2657, 2657, 2657, 2657, 2657, 2657, 2657, - 2657, 2657, 2657, 2657, 2657, 2657, 2657, 2657, - 2657, 2657, 2657, 2657, 2657, 2657, 2657, 2657, - 2657, 2657, 2657, 2657, 2657, 2657, 2657, 2657, - 2657, 2657, 2657, 2657, 2657, 2657, 2657, 2657, - 2657, 2657, 2657, 2657, 2657, 2657, 2657, 2657, - 2657, 2657, 2657, 2657, 2657, 2657, 2657, 2657, - 2657, 2657, 2657, 2657, 2657, 2657, 2657, 2657, - 2657, 2657, 2657, 2657, 2657, 2657, 2657, 2657, - 2657, 2657, 2657, 2657, 2657, 2657, 2657, 2657, - 2657, 2657, 2657, 2657, 2657, 2657, 2657, 2657, - 2657, 2657, 2657, 2657, 2657, 2657, 2657, 2657, - 2657, 2657, 2657, 2657, 2657, 2657, 2657, 2657, - 2657, 2657, 2657, 2657, 2657, 2657, 2657, 2657, - 2657, 2657, 2657, 2657, 2657, 2657, 2657, 2657, - 2657, 2657, 2657, 2657, 2657, 2657, 2657, 2657, - - 2657, 2657, 2657, 2657, 2657, 2657, 2657, 2657, - 2657, 2657, 2657, 2657, 2657, 2657, 2657, 2657, - 2657, 2657, 2657, 2657, 2657, 2657, 2657, 2657, - 2657, 2657, 2657, 2657, 2657, 2657, 2657, 2657, - 2657, 2657, 2657, 2657, 2657, 2657, 2657, 2657, - 2657, 2657, 2657, 2657, 2657, 2657, 2657, 2657, - 2657, 2657, 2657, 2657, 2657, 2657, 2657, 2657, - 2657, 2657, 2657, 2657, 2657, 2657, 2657, 2657, - 2657, 2657, 2657, 2657, 2657, 2657, 2657, 2657, - 2657, 2657, 2657, 2657, 2657, 2657, 2657, 2657, - 2657, 2657, 2657, 2657, 2657, 2657, 2657, 2657, - 2657, 2657, 2657, 2657, 2657, 2657, 2657, 2657, - 2657, 2657, 2657, 2657, 2657, 2657, 2657, 2657, - 2657, 2657, 2657, 2657, 2657, 2657, 2657, 2658, - 2658, 2658, 2658, 2658, 2658, 2658, 2658, 2658, - 2658, 2658, 2658, 2658, 2658, 2658, 2658, 2658, - 2658, 2658, 2658, 2658, 2658, 2658, 2658, 2658, - 2658, 2658, 2658, 2658, 2658, 2658, 2658, 2658, - 2658, 2658, 2658, 2658, 2658, 2658, 2658, 2658, - 2658, 2659, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - - 2660, 2660, 2660, 2660, 2660, 2660, 2660, 2660, - 2660, 2660, 2660, 2660, 2660, 2660, 2660, 2660, - 2660, 2660, 2660, 2660, 2660, 2660, 2660, 2660, - 2660, 2660, 2660, 2660, 2660, 2660, 2660, 2660, - 2660, 2660, 2660, 2660, 2660, 2660, 2660, 2660, - 2660, 2660, 2660, 2660, 2660, 2660, 2660, 2660, - 2660, 2660, 2660, 2660, 2660, 2660, 2660, 2660, - 2660, 2660, 2660, 2660, 2660, 2660, 2660, 2660, - 2660, 2660, 2660, 2660, 2660, 2660, 2660, 2660, - 2660, 2660, 2660, 2660, 2660, 2660, 2660, 2660, - 2660, 2660, 2660, 2660, 2660, 2660, 2660, 2660, - 2660, 2660, 2660, 2660, 2660, 2660, 2660, 2660, - 2660, 2660, 2660, 2661, 2661, 2661, 2661, 2661, - 2661, 2661, 2661, 2661, 2661, 2661, 2661, 202, - 2662, 2662, 2662, 2662, 2663, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 2659, 2659, 2659, 2659, 2659, 2659, 2659, 2659, - 2659, 2659, 2659, 2659, 2659, 2659, 2659, 2659, - 2659, 2659, 2659, 2659, 2659, 2659, 2659, 2659, - 2659, 2659, 2659, 2659, 2659, 2659, 2659, 2659, - 2659, 2659, 2659, 2659, 2659, 2659, 2659, 2659, - 2659, 2659, 2659, 2659, 2659, 2659, 2659, 2659, - 2659, 2659, 2659, 2659, 2659, 2659, 2659, 2659, - 2659, 2659, 2659, 2659, 2659, 2659, 2659, 2659, - 2659, 2659, 2659, 2659, 2659, 2659, 2659, 2659, - 2659, 2659, 2659, 2659, 2659, 2659, 2659, 2659, - 2659, 2659, 2659, 2659, 2659, 2659, 2659, 2659, - 2659, 2659, 2659, 2659, 2659, 2659, 2659, 2659, - 2659, 2659, 2659, 2659, 2659, 2659, 2659, 2659, - 2659, 2659, 2659, 2659, 2659, 2659, 2659, 2659, - 2659, 2659, 2659, 2659, 2659, 2659, 2659, 2659, - 2659, 2659, 2659, 2659, 2659, 2659, 2659, 2659, - - 2659, 2659, 2659, 2659, 2659, 2659, 2659, 2659, - 2659, 2659, 2659, 2659, 2659, 2659, 2659, 2659, - 2659, 2659, 2659, 2659, 2659, 2659, 2659, 2659, - 2659, 2659, 2659, 2659, 2659, 2659, 2659, 2659, - 2659, 2659, 2659, 2659, 2659, 2659, 2659, 2659, - 2659, 2659, 2659, 2659, 2659, 2659, 2659, 2659, - 2659, 2659, 2659, 2659, 2659, 2659, 2659, 2659, - 2659, 2659, 2659, 2659, 2659, 2659, 2659, 2659, - 2659, 2659, 2659, 2659, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - - 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664, - 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664, - 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664, - 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664, - 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664, - 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664, - 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664, - 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664, - 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664, - 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664, - 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664, - 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664, - 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664, - 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664, - 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664, - 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664, - 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664, - 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664, - 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664, - 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664, - 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664, - 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664, - 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664, - 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664, - 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664, - 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664, - 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664, - 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664, - 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664, - 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664, - 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664, - 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664, - - 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664, - 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664, - 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664, - 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664, - 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664, - 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664, - 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664, - 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664, - 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664, - 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664, - 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664, - 2665, 2665, 2665, 2666, 2666, 2666, 2664, 2664, - 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664, - 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664, - 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664, - 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664, - 2664, 2664, 2666, 2664, 2664, 2664, 2665, 2666, - 2665, 2666, 2664, 2664, 2664, 2664, 2664, 2664, - 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664, - 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664, - 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664, - 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664, - 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664, - 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664, - 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664, - 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664, - 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664, - 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664, - 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664, - 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664, - 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664, - 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664, - - 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664, - 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664, - 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664, - 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664, - 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664, - 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664, - 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664, - 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664, - 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664, - 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664, - 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664, - 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664, - 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664, - 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664, - 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664, - 2664, 2665, 2666, 2666, 2664, 2664, 2664, 2664, - 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664, - 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664, - 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664, - 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664, - 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664, - 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664, - 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664, - 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664, - 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664, - 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664, - 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664, - 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664, - 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664, - 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664, - 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664, - 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664, - - 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664, - 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664, - 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664, - 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664, - 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664, - 2664, 2664, 2664, 2664, 2664, 2664, 2664, 202, - 2667, 2667, 2667, 2667, 2667, 2667, 2667, 2668, - 2669, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - - 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670, - 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670, - 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670, - 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670, - 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670, - 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670, - 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670, - 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670, - 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670, - 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670, - 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670, - 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670, - 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670, - 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670, - 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670, - 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670, - 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670, - 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670, - 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670, - 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670, - 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670, - 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670, - 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670, - 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670, - 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670, - 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670, - 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670, - 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670, - 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670, - 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670, - 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670, - 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670, - - 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670, - 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670, - 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670, - 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670, - 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670, - 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670, - 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670, - 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670, - 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670, - 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670, - 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670, - 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670, - 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670, - 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670, - 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670, - 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670, - 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670, - 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670, - 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670, - 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670, - 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670, - 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670, - 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670, - 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670, - 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670, - 2670, 2670, 2670, 2670, 2670, 2670, 2671, 2672, - 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670, - 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670, - 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670, - 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670, - 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670, - 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670, - - 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670, - 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670, - 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670, - 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670, - 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670, - 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670, - 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670, - 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670, - 2670, 2670, 2670, 2670, 2670, 2670, 2670, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 2668, 2668, 2668, 2668, 2668, 2668, 2668, 2668, + 2668, 2668, 2668, 2668, 2668, 2668, 2668, 2668, + 2668, 2668, 2668, 2669, 2669, 2670, 2670, 2671, + 2671, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 2672, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, 2673, 2673, 2673, 2673, 2673, 2673, 2673, 2673, 2673, 2673, 2673, 2673, 2673, 2673, 2673, 2673, - 2673, 2673, 2673, 2673, 2673, 2673, 2673, 2673, - 2673, 2673, 2673, 2673, 2673, 2673, 2673, 2673, - 2673, 2673, 2673, 2673, 2673, 2673, 2673, 2673, - 2673, 2673, 2673, 2673, 2673, 2673, 2673, 2673, - 2673, 2673, 2673, 2673, 2673, 2673, 2673, 2673, - 2673, 2673, 2673, 2673, 2673, 2673, 2673, 2673, - 2673, 2673, 2673, 2673, 2673, 2673, 2673, 2673, - 2673, 2673, 2673, 2673, 2673, 2673, 2673, 2673, - 2673, 2673, 2673, 2673, 2673, 2673, 2673, 2673, - 2673, 2673, 2673, 2673, 2673, 2673, 2673, 2673, - 2673, 2673, 2673, 2673, 2673, 2673, 2673, 2673, - 2673, 2673, 2673, 2673, 2673, 2673, 2673, 2673, - 2673, 2673, 2673, 2673, 2673, 2673, 2673, 2673, - 2673, 2673, 2673, 2673, 2673, 2673, 2673, 2673, - 2673, 2673, 2673, 2673, 2673, 2673, 2673, 2673, - 2673, 2673, 2673, 2673, 2673, 2673, 2673, 2673, - 2673, 2673, 2673, 2673, 2673, 2673, 2673, 2673, - 2673, 2673, 2673, 2673, 2673, 2673, 2673, 2673, - 2673, 2673, 2673, 2673, 2673, 2673, 2673, 2673, - 2673, 2673, 2673, 2673, 2673, 2673, 2673, 2673, - 2673, 2673, 2673, 2673, 2673, 2673, 2673, 2673, - 2673, 2673, 2673, 2673, 2673, 2673, 2673, 2673, - 2673, 2673, 2673, 2673, 2673, 2673, 2673, 2673, - 2673, 2673, 2673, 2673, 2673, 2673, 2673, 2673, - 2673, 2673, 2673, 2673, 2673, 2673, 2673, 2673, - 2673, 2673, 2673, 2673, 2673, 2673, 2673, 2673, - 2673, 2673, 2673, 2673, 2673, 2673, 2673, 2673, - 2673, 2673, 2673, 2673, 2673, 2673, 2673, 2673, - 2673, 2673, 2673, 2673, 2673, 2673, 2673, 2673, - 2673, 2673, 2673, 2673, 2673, 2673, 2673, 2673, - - 2673, 2673, 2673, 2673, 2673, 2673, 2673, 2673, - 2673, 2673, 2673, 2673, 2673, 2673, 2673, 2673, - 2673, 2673, 2673, 2673, 2673, 2673, 2673, 2673, - 2673, 2673, 2673, 2673, 2673, 2673, 2673, 2673, - 2673, 2673, 2673, 2673, 2673, 2673, 2673, 2673, - 2673, 2673, 2673, 2673, 2673, 2673, 2673, 2673, - 2673, 2673, 2673, 2673, 2673, 2673, 2673, 2673, - 2673, 202, 202, 202, 202, 202, 202, 202, + 2673, 2673, 2673, 2673, 2673, 2674, 2674, 2674, + 2674, 2674, 2674, 2674, 2674, 2675, 2675, 2675, + 2675, 2674, 2674, 2674, 2674, 2674, 2674, 2674, 2674, 2674, 2674, 2674, 2674, 2674, 2674, 2674, - 2674, 2674, 2674, 2674, 2674, 2674, 2674, 2674, - 2674, 2674, 2674, 2674, 2674, 2674, 2674, 2674, - 2674, 2674, 2674, 2674, 2674, 2674, 2674, 202, - 2675, 2676, 2677, 2678, 2679, 2680, 2681, 2682, - 2683, 2684, 202, 202, 202, 202, 2685, 2685, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 2686, 2686, 2686, 2686, 2686, 2686, 2686, 2686, - 2686, 2686, 2686, 2686, 2686, 2686, 2686, 2686, - 2686, 2686, 2686, 2686, 2686, 2686, 2686, 2686, - 2686, 2686, 2686, 2686, 2686, 2686, 202, 202, - 2687, 2687, 2687, 2687, 2687, 2688, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, + 2674, 2674, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 2676, - 2689, 2689, 2689, 2689, 2689, 2689, 2689, 2689, - 2689, 2689, 2689, 2689, 2689, 2689, 2689, 2689, - 2689, 2689, 2689, 2689, 2689, 2689, 2689, 2689, - 2689, 2689, 2689, 2689, 2689, 2689, 2689, 2689, - 2689, 2689, 2689, 2689, 2689, 2689, 2689, 2689, - 2689, 2689, 2689, 2689, 2689, 2689, 2689, 2689, - 2690, 2690, 2690, 2690, 2690, 2690, 2690, 2691, - 2691, 2692, 2693, 2693, 2694, 2694, 2694, 2694, - 2695, 2695, 2695, 2695, 2691, 2694, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 2696, 2697, 2698, 2699, 2700, 2701, 2702, 2703, - 2704, 2705, 202, 2706, 2706, 2706, 2706, 2706, - 2706, 2706, 202, 2689, 2689, 2689, 2689, 2689, - 2689, 2689, 2689, 2689, 2689, 2689, 2689, 2689, - 2689, 2689, 2689, 2689, 2689, 2689, 2689, 2689, - 202, 202, 202, 202, 202, 2689, 2689, 2689, - 2689, 2689, 2689, 2689, 2689, 2689, 2689, 2689, - 2689, 2689, 2689, 2689, 2689, 2689, 2689, 2689, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, + 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2677, + 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2677, + 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2677, + 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2677, + 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2677, + 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2677, + 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2677, + 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2677, + 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2677, + 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2677, + 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2677, + 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2677, + 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2677, + 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2677, + 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2677, + 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2677, + 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2677, + 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2677, + 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2677, + 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2677, + 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2677, + 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2677, + 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2677, + 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2677, + 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2677, + 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2677, + 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2677, + 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2677, + 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2677, + 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2677, + 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2677, + 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2677, + + 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2677, + 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2677, + 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2677, + 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2677, + 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2677, + 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2677, + 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2677, + 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2677, + 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2677, + 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2677, + 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2677, + 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2677, + 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2677, + 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2678, + 2678, 2678, 2678, 2678, 2678, 2678, 2678, 2678, + 2678, 2678, 2678, 2678, 2678, 2678, 2678, 2678, + 2678, 2678, 2678, 2678, 2678, 2678, 2678, 2678, + 2678, 2678, 2678, 2678, 2678, 2678, 2678, 2678, + 2678, 2678, 2678, 2678, 2678, 2678, 2678, 2678, + 2678, 2679, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + + 2680, 2680, 2680, 2680, 2680, 2680, 2680, 2680, + 2680, 2680, 2680, 2680, 2680, 2680, 2680, 2680, + 2680, 2680, 2680, 2680, 2680, 2680, 2680, 2680, + 2680, 2680, 2680, 2680, 2680, 2680, 2680, 2680, + 2680, 2680, 2680, 2680, 2680, 2680, 2680, 2680, + 2680, 2680, 2680, 2680, 2680, 2680, 2680, 2680, + 2680, 2680, 2680, 2680, 2680, 2680, 2680, 2680, + 2680, 2680, 2680, 2680, 2680, 2680, 2680, 2680, + 2680, 2680, 2680, 2680, 2680, 2680, 2680, 2680, + 2680, 2680, 2680, 2680, 2680, 2680, 2680, 2680, + 2680, 2680, 2680, 2680, 2680, 2680, 2680, 2680, + 2680, 2680, 2680, 2680, 2680, 2680, 2680, 2680, + 2680, 2680, 2680, 2681, 2681, 2681, 2681, 2681, + 2681, 2681, 2681, 2681, 2681, 2681, 2681, 203, + 2682, 2682, 2682, 2682, 2683, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 2679, 2679, 2679, 2679, 2679, 2679, 2679, 2679, + 2679, 2679, 2679, 2679, 2679, 2679, 2679, 2679, + 2679, 2679, 2679, 2679, 2679, 2679, 2679, 2679, + 2679, 2679, 2679, 2679, 2679, 2679, 2679, 2679, + 2679, 2679, 2679, 2679, 2679, 2679, 2679, 2679, + 2679, 2679, 2679, 2679, 2679, 2679, 2679, 2679, + 2679, 2679, 2679, 2679, 2679, 2679, 2679, 2679, + 2679, 2679, 2679, 2679, 2679, 2679, 2679, 2679, + 2679, 2679, 2679, 2679, 2679, 2679, 2679, 2679, + 2679, 2679, 2679, 2679, 2679, 2679, 2679, 2679, + 2679, 2679, 2679, 2679, 2679, 2679, 2679, 2679, + 2679, 2679, 2679, 2679, 2679, 2679, 2679, 2679, + 2679, 2679, 2679, 2679, 2679, 2679, 2679, 2679, + 2679, 2679, 2679, 2679, 2679, 2679, 2679, 2679, + 2679, 2679, 2679, 2679, 2679, 2679, 2679, 2679, + 2679, 2679, 2679, 2679, 2679, 2679, 2679, 2679, + + 2679, 2679, 2679, 2679, 2679, 2679, 2679, 2679, + 2679, 2679, 2679, 2679, 2679, 2679, 2679, 2679, + 2679, 2679, 2679, 2679, 2679, 2679, 2679, 2679, + 2679, 2679, 2679, 2679, 2679, 2679, 2679, 2679, + 2679, 2679, 2679, 2679, 2679, 2679, 2679, 2679, + 2679, 2679, 2679, 2679, 2679, 2679, 2679, 2679, + 2679, 2679, 2679, 2679, 2679, 2679, 2679, 2679, + 2679, 2679, 2679, 2679, 2679, 2679, 2679, 2679, + 2679, 2679, 2679, 2679, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + + 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684, + 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684, + 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684, + 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684, + 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684, + 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684, + 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684, + 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684, + 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684, + 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684, + 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684, + 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684, + 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684, + 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684, + 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684, + 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684, + 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684, + 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684, + 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684, + 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684, + 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684, + 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684, + 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684, + 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684, + 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684, + 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684, + 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684, + 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684, + 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684, + 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684, + 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684, + 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684, + + 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684, + 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684, + 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684, + 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684, + 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684, + 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684, + 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684, + 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684, + 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684, + 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684, + 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684, + 2685, 2685, 2685, 2686, 2686, 2686, 2684, 2684, + 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684, + 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684, + 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684, + 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684, + 2684, 2684, 2686, 2684, 2684, 2684, 2685, 2686, + 2685, 2686, 2684, 2684, 2684, 2684, 2684, 2684, + 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684, + 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684, + 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684, + 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684, + 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684, + 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684, + 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684, + 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684, + 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684, + 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684, + 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684, + 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684, + 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684, + 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684, + + 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684, + 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684, + 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684, + 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684, + 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684, + 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684, + 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684, + 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684, + 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684, + 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684, + 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684, + 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684, + 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684, + 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684, + 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684, + 2684, 2685, 2686, 2686, 2684, 2684, 2684, 2684, + 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684, + 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684, + 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684, + 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684, + 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684, + 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684, + 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684, + 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684, + 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684, + 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684, + 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684, + 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684, + 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684, + 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684, + 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684, + 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684, + + 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684, + 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684, + 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684, + 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684, + 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684, + 2684, 2684, 2684, 2684, 2684, 2684, 2684, 203, + 2687, 2687, 2687, 2687, 2687, 2687, 2687, 2688, + 2689, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + + 2690, 2690, 2690, 2690, 2690, 2690, 2690, 2690, + 2690, 2690, 2690, 2690, 2690, 2690, 2690, 2690, + 2690, 2690, 2690, 2690, 2690, 2690, 2690, 2690, + 2690, 2690, 2690, 2690, 2690, 2690, 2690, 2690, + 2690, 2690, 2690, 2690, 2690, 2690, 2690, 2690, + 2690, 2690, 2690, 2690, 2690, 2690, 2690, 2690, + 2690, 2690, 2690, 2690, 2690, 2690, 2690, 2690, + 2690, 2690, 2690, 2690, 2690, 2690, 2690, 2690, + 2690, 2690, 2690, 2690, 2690, 2690, 2690, 2690, + 2690, 2690, 2690, 2690, 2690, 2690, 2690, 2690, + 2690, 2690, 2690, 2690, 2690, 2690, 2690, 2690, + 2690, 2690, 2690, 2690, 2690, 2690, 2690, 2690, + 2690, 2690, 2690, 2690, 2690, 2690, 2690, 2690, + 2690, 2690, 2690, 2690, 2690, 2690, 2690, 2690, + 2690, 2690, 2690, 2690, 2690, 2690, 2690, 2690, + 2690, 2690, 2690, 2690, 2690, 2690, 2690, 2690, + 2690, 2690, 2690, 2690, 2690, 2690, 2690, 2690, + 2690, 2690, 2690, 2690, 2690, 2690, 2690, 2690, + 2690, 2690, 2690, 2690, 2690, 2690, 2690, 2690, + 2690, 2690, 2690, 2690, 2690, 2690, 2690, 2690, + 2690, 2690, 2690, 2690, 2690, 2690, 2690, 2690, + 2690, 2690, 2690, 2690, 2690, 2690, 2690, 2690, + 2690, 2690, 2690, 2690, 2690, 2690, 2690, 2690, + 2690, 2690, 2690, 2690, 2690, 2690, 2690, 2690, + 2690, 2690, 2690, 2690, 2690, 2690, 2690, 2690, + 2690, 2690, 2690, 2690, 2690, 2690, 2690, 2690, + 2690, 2690, 2690, 2690, 2690, 2690, 2690, 2690, + 2690, 2690, 2690, 2690, 2690, 2690, 2690, 2690, + 2690, 2690, 2690, 2690, 2690, 2690, 2690, 2690, + 2690, 2690, 2690, 2690, 2690, 2690, 2690, 2690, + 2690, 2690, 2690, 2690, 2690, 2690, 2690, 2690, + 2690, 2690, 2690, 2690, 2690, 2690, 2690, 2690, + + 2690, 2690, 2690, 2690, 2690, 2690, 2690, 2690, + 2690, 2690, 2690, 2690, 2690, 2690, 2690, 2690, + 2690, 2690, 2690, 2690, 2690, 2690, 2690, 2690, + 2690, 2690, 2690, 2690, 2690, 2690, 2690, 2690, + 2690, 2690, 2690, 2690, 2690, 2690, 2690, 2690, + 2690, 2690, 2690, 2690, 2690, 2690, 2690, 2690, + 2690, 2690, 2690, 2690, 2690, 2690, 2690, 2690, + 2690, 2690, 2690, 2690, 2690, 2690, 2690, 2690, + 2690, 2690, 2690, 2690, 2690, 2690, 2690, 2690, + 2690, 2690, 2690, 2690, 2690, 2690, 2690, 2690, + 2690, 2690, 2690, 2690, 2690, 2690, 2690, 2690, + 2690, 2690, 2690, 2690, 2690, 2690, 2690, 2690, + 2690, 2690, 2690, 2690, 2690, 2690, 2690, 2690, + 2690, 2690, 2690, 2690, 2690, 2690, 2690, 2690, + 2690, 2690, 2690, 2690, 2690, 2690, 2690, 2690, + 2690, 2690, 2690, 2690, 2690, 2690, 2690, 2690, + 2690, 2690, 2690, 2690, 2690, 2690, 2690, 2690, + 2690, 2690, 2690, 2690, 2690, 2690, 2690, 2690, + 2690, 2690, 2690, 2690, 2690, 2690, 2690, 2690, + 2690, 2690, 2690, 2690, 2690, 2690, 2690, 2690, + 2690, 2690, 2690, 2690, 2690, 2690, 2690, 2690, + 2690, 2690, 2690, 2690, 2690, 2690, 2690, 2690, + 2690, 2690, 2690, 2690, 2690, 2690, 2690, 2690, + 2690, 2690, 2690, 2690, 2690, 2690, 2690, 2690, + 2690, 2690, 2690, 2690, 2690, 2690, 2690, 2690, + 2690, 2690, 2690, 2690, 2690, 2690, 2691, 2692, + 2690, 2690, 2690, 2690, 2690, 2690, 2690, 2690, + 2690, 2690, 2690, 2690, 2690, 2690, 2690, 2690, + 2690, 2690, 2690, 2690, 2690, 2690, 2690, 2690, + 2690, 2690, 2690, 2690, 2690, 2690, 2690, 2690, + 2690, 2690, 2690, 2690, 2690, 2690, 2690, 2690, + 2690, 2690, 2690, 2690, 2690, 2690, 2690, 2690, + + 2690, 2690, 2690, 2690, 2690, 2690, 2690, 2690, + 2690, 2690, 2690, 2690, 2690, 2690, 2690, 2690, + 2690, 2690, 2690, 2690, 2690, 2690, 2690, 2690, + 2690, 2690, 2690, 2690, 2690, 2690, 2690, 2690, + 2690, 2690, 2690, 2690, 2690, 2690, 2690, 2690, + 2690, 2690, 2690, 2690, 2690, 2690, 2690, 2690, + 2690, 2690, 2690, 2690, 2690, 2690, 2690, 2690, + 2690, 2690, 2690, 2690, 2690, 2690, 2690, 2690, + 2690, 2690, 2690, 2690, 2690, 2690, 2690, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + + 2693, 2693, 2693, 2693, 2693, 2693, 2693, 2693, + 2693, 2693, 2693, 2693, 2693, 2693, 2693, 2693, + 2693, 2693, 2693, 2693, 2693, 2693, 2693, 2693, + 2693, 2693, 2693, 2693, 2693, 2693, 2693, 2693, + 2693, 2693, 2693, 2693, 2693, 2693, 2693, 2693, + 2693, 2693, 2693, 2693, 2693, 2693, 2693, 2693, + 2693, 2693, 2693, 2693, 2693, 2693, 2693, 2693, + 2693, 2693, 2693, 2693, 2693, 2693, 2693, 2693, + 2693, 2693, 2693, 2693, 2693, 2693, 2693, 2693, + 2693, 2693, 2693, 2693, 2693, 2693, 2693, 2693, + 2693, 2693, 2693, 2693, 2693, 2693, 2693, 2693, + 2693, 2693, 2693, 2693, 2693, 2693, 2693, 2693, + 2693, 2693, 2693, 2693, 2693, 2693, 2693, 2693, + 2693, 2693, 2693, 2693, 2693, 2693, 2693, 2693, + 2693, 2693, 2693, 2693, 2693, 2693, 2693, 2693, + 2693, 2693, 2693, 2693, 2693, 2693, 2693, 2693, + 2693, 2693, 2693, 2693, 2693, 2693, 2693, 2693, + 2693, 2693, 2693, 2693, 2693, 2693, 2693, 2693, + 2693, 2693, 2693, 2693, 2693, 2693, 2693, 2693, + 2693, 2693, 2693, 2693, 2693, 2693, 2693, 2693, + 2693, 2693, 2693, 2693, 2693, 2693, 2693, 2693, + 2693, 2693, 2693, 2693, 2693, 2693, 2693, 2693, + 2693, 2693, 2693, 2693, 2693, 2693, 2693, 2693, + 2693, 2693, 2693, 2693, 2693, 2693, 2693, 2693, + 2693, 2693, 2693, 2693, 2693, 2693, 2693, 2693, + 2693, 2693, 2693, 2693, 2693, 2693, 2693, 2693, + 2693, 2693, 2693, 2693, 2693, 2693, 2693, 2693, + 2693, 2693, 2693, 2693, 2693, 2693, 2693, 2693, + 2693, 2693, 2693, 2693, 2693, 2693, 2693, 2693, + 2693, 2693, 2693, 2693, 2693, 2693, 2693, 2693, + 2693, 2693, 2693, 2693, 2693, 2693, 2693, 2693, + 2693, 2693, 2693, 2693, 2693, 2693, 2693, 2693, + + 2693, 2693, 2693, 2693, 2693, 2693, 2693, 2693, + 2693, 2693, 2693, 2693, 2693, 2693, 2693, 2693, + 2693, 2693, 2693, 2693, 2693, 2693, 2693, 2693, + 2693, 2693, 2693, 2693, 2693, 2693, 2693, 2693, + 2693, 2693, 2693, 2693, 2693, 2693, 2693, 2693, + 2693, 2693, 2693, 2693, 2693, 2693, 2693, 2693, + 2693, 2693, 2693, 2693, 2693, 2693, 2693, 2693, + 2693, 203, 203, 203, 203, 203, 203, 203, + 2694, 2694, 2694, 2694, 2694, 2694, 2694, 2694, + 2694, 2694, 2694, 2694, 2694, 2694, 2694, 2694, + 2694, 2694, 2694, 2694, 2694, 2694, 2694, 2694, + 2694, 2694, 2694, 2694, 2694, 2694, 2694, 203, + 2695, 2696, 2697, 2698, 2699, 2700, 2701, 2702, + 2703, 2704, 203, 203, 203, 203, 2705, 2705, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 2706, 2706, 2706, 2706, 2706, 2706, 2706, 2706, + 2706, 2706, 2706, 2706, 2706, 2706, 2706, 2706, + 2706, 2706, 2706, 2706, 2706, 2706, 2706, 2706, + 2706, 2706, 2706, 2706, 2706, 2706, 203, 203, + 2707, 2707, 2707, 2707, 2707, 2708, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 2707, 2707, 2707, 2707, 2707, 2707, 2707, 2707, - 2707, 2707, 2707, 2707, 2707, 2707, 2707, 2707, - 2707, 2707, 2707, 2707, 2707, 2707, 2707, 2707, - 2707, 2707, 2707, 2707, 2707, 2707, 2707, 2707, - 2708, 2708, 2708, 2708, 2708, 2708, 2708, 2708, - 2708, 2708, 2708, 2708, 2708, 2708, 2708, 2708, - 2708, 2708, 2708, 2708, 2708, 2708, 2708, 2708, - 2708, 2708, 2708, 2708, 2708, 2708, 2708, 2708, 2709, 2709, 2709, 2709, 2709, 2709, 2709, 2709, 2709, 2709, 2709, 2709, 2709, 2709, 2709, 2709, - 2709, 2709, 2709, 2709, 2709, 2709, 2709, 2710, - 2711, 2712, 2712, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, + 2709, 2709, 2709, 2709, 2709, 2709, 2709, 2709, + 2709, 2709, 2709, 2709, 2709, 2709, 2709, 2709, + 2709, 2709, 2709, 2709, 2709, 2709, 2709, 2709, + 2709, 2709, 2709, 2709, 2709, 2709, 2709, 2709, + 2710, 2710, 2710, 2710, 2710, 2710, 2710, 2711, + 2711, 2712, 2713, 2713, 2714, 2714, 2714, 2714, + 2715, 2715, 2715, 2715, 2711, 2714, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 2716, 2717, 2718, 2719, 2720, 2721, 2722, 2723, + 2724, 2725, 203, 2726, 2726, 2726, 2726, 2726, + 2726, 2726, 203, 2709, 2709, 2709, 2709, 2709, + 2709, 2709, 2709, 2709, 2709, 2709, 2709, 2709, + 2709, 2709, 2709, 2709, 2709, 2709, 2709, 2709, + 203, 203, 203, 203, 203, 2709, 2709, 2709, + 2709, 2709, 2709, 2709, 2709, 2709, 2709, 2709, + 2709, 2709, 2709, 2709, 2709, 2709, 2709, 2709, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, - 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, - 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, - 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, - 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, - 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, - 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, - 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, - 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, - 2713, 2713, 2713, 2713, 2713, 2714, 2714, 2714, - 2714, 2714, 2714, 202, 202, 202, 202, 2715, - 2713, 2716, 2716, 2716, 2716, 2716, 2716, 2716, - 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, - 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, - 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, - 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, - 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2717, - 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, - 202, 202, 202, 202, 202, 202, 202, 2718, - 2718, 2718, 2718, 2719, 2719, 2719, 2719, 2719, - 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 2720, 2721, 2722, 2723, 2724, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 2725, 2725, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - - 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726, - 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726, - 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726, - 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726, - 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726, - 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726, - 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726, - 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726, - 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726, - 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726, - 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726, - 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726, - 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726, - 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726, - 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726, - 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726, - 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726, - 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726, - 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726, - 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726, - 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726, - 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726, - 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726, - 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726, - 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726, - 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726, - 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726, - 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726, - 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726, - 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726, - 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726, - 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726, - - 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726, - 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726, - 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726, - 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726, - 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726, - 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726, - 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726, - 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726, - 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726, - 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726, - 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726, - 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726, - 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726, - 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726, - 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726, - 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726, - 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726, - 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726, - 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726, - 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726, - 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726, - 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726, - 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726, - 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726, - 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726, - 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726, - 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726, - 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726, - 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726, - 2726, 2726, 2726, 2726, 2726, 2727, 2727, 2727, - 2727, 2727, 2728, 2728, 2728, 2728, 2728, 2728, - 202, 202, 202, 202, 202, 202, 202, 202, - - 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726, - 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726, - 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726, - 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726, - 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726, - 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726, - 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726, - 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726, - 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726, - 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726, - 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726, - 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726, - 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726, - 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726, - 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726, - 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726, - 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726, - 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726, - 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726, - 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726, - 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726, - 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726, - 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726, - 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726, - 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726, - 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726, - 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726, - 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726, - 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726, - 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726, - 2726, 2726, 2726, 2729, 2729, 2729, 2729, 2729, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 2727, 2727, 2727, 2727, 2727, 2727, 2727, 2727, + 2727, 2727, 2727, 2727, 2727, 2727, 2727, 2727, + 2727, 2727, 2727, 2727, 2727, 2727, 2727, 2727, + 2727, 2727, 2727, 2727, 2727, 2727, 2727, 2727, + 2728, 2728, 2728, 2728, 2728, 2728, 2728, 2728, + 2728, 2728, 2728, 2728, 2728, 2728, 2728, 2728, + 2728, 2728, 2728, 2728, 2728, 2728, 2728, 2728, + 2728, 2728, 2728, 2728, 2728, 2728, 2728, 2728, 2729, 2729, 2729, 2729, 2729, 2729, 2729, 2729, - - 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730, - 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730, - 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730, - 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730, - 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730, - 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730, - 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730, - 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730, - 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730, - 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730, - 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730, - 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730, - 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730, - 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730, - 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730, - 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730, - 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730, - 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730, - 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730, - 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730, - 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730, - 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730, - 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730, - 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730, - 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730, - 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730, - 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730, - 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730, - 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730, - 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730, - 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730, - 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730, - - 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730, - 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730, - 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730, - 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730, - 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730, - 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730, - 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730, - 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730, - 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730, - 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730, - 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730, - 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730, - 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730, - 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730, - 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730, - 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730, - 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730, - 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730, - 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730, - 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730, - 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730, - 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730, - 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730, - 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730, - 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730, - 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730, - 2730, 2730, 2730, 2730, 2730, 2730, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 2729, 2729, 2729, 2729, 2729, 2729, 2729, 2729, - 2729, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - - 2731, 2732, 2733, 2733, 2733, 2733, 2733, 2733, - 2733, 2733, 2733, 2733, 2733, 2733, 2733, 2733, - 2733, 2733, 2733, 2733, 2733, 2733, 2733, 2733, - 2733, 2733, 2733, 2733, 2733, 2733, 2733, 2733, - 2733, 2733, 2733, 2733, 2733, 2733, 2733, 2733, - 2733, 2733, 2733, 2733, 2733, 2733, 2733, 2733, - 2733, 2733, 2733, 2733, 2733, 2733, 2733, 2733, - 2733, 2733, 2733, 2733, 2733, 2733, 2733, 2733, - 2733, 2733, 2733, 2733, 2733, 2733, 2733, 2733, - 2733, 2733, 2733, 2733, 2733, 2733, 2733, 2733, - 2733, 2733, 2733, 2733, 2733, 2733, 2733, 2733, - 2733, 2733, 2733, 2733, 2733, 2733, 2733, 2733, - 2733, 2733, 2733, 2733, 2733, 2733, 2733, 2733, - 2733, 2733, 2733, 2733, 2733, 2733, 2733, 2733, - 2733, 2733, 2733, 2733, 2733, 2733, 2733, 2733, - 2733, 2733, 2733, 2733, 2733, 2733, 2733, 2733, - 2733, 2733, 2733, 2733, 2733, 2733, 2733, 2733, - 2733, 2733, 2733, 2733, 2733, 2733, 2733, 2733, - 2733, 2733, 2733, 2733, 2733, 2733, 2733, 2733, - 2733, 2733, 2733, 2733, 2733, 2733, 2733, 2733, - 2733, 2733, 2733, 2733, 2733, 2733, 2733, 2733, - 2733, 2733, 2733, 2733, 2733, 2733, 2733, 2733, - 2733, 2733, 2733, 2733, 2733, 2733, 2733, 2733, - 2733, 2733, 2733, 2733, 2733, 2733, 2733, 2733, - 2733, 2733, 2733, 2733, 2733, 2733, 2733, 2733, - 2733, 2733, 2733, 2733, 2733, 2733, 2733, 2733, - 2733, 2733, 2733, 2733, 2733, 2733, 2733, 2733, - 2733, 2733, 2733, 2733, 2733, 2733, 2733, 2733, - 2733, 2733, 2733, 2733, 2733, 2733, 2733, 2733, - 2733, 2733, 2733, 2733, 2733, 2733, 2733, 2733, - 2733, 2733, 2733, 2733, 2733, 2733, 2733, 2733, - 2733, 2733, 2733, 2733, 2733, 2733, 2733, 2733, + 2729, 2729, 2729, 2729, 2729, 2729, 2729, 2730, + 2731, 2732, 2732, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, 2733, 2733, 2733, 2733, 2733, 2733, 2733, 2733, 2733, 2733, 2733, 2733, 2733, 2733, 2733, 2733, 2733, 2733, 2733, 2733, 2733, 2733, 2733, 2733, - 2733, 2733, 2733, 2733, 2733, 2733, 2733, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 2734, 2734, 2734, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 2735, 2735, 2735, 2735, - 202, 202, 202, 202, 202, 202, 202, 202, - 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736, - 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736, - 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736, - 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736, - 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736, - 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736, - 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736, - 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736, - 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736, - 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736, - 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736, - 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736, - 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736, - 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736, + 2733, 2733, 2733, 2733, 2733, 2733, 2733, 2733, + 2733, 2733, 2733, 2733, 2733, 2733, 2733, 2733, + 2733, 2733, 2733, 2733, 2733, 2733, 2733, 2733, + 2733, 2733, 2733, 2733, 2733, 2733, 2733, 2733, + 2733, 2733, 2733, 2733, 2733, 2733, 2733, 2733, + 2733, 2733, 2733, 2733, 2733, 2734, 2734, 2734, + 2734, 2734, 2734, 203, 203, 203, 203, 2735, + 2733, 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736, + 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2737, + 2737, 2737, 2737, 2737, 2737, 2737, 2737, 2737, + 203, 203, 203, 203, 203, 203, 203, 2738, + 2738, 2738, 2738, 2739, 2739, 2739, 2739, 2739, + 2739, 2739, 2739, 2739, 2739, 2739, 2739, 2739, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 2740, 2741, 2742, 2743, 2744, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 2745, 2745, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, - 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736, - 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736, - 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736, - 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736, - 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736, - 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736, - 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736, - 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736, - 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736, - 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736, - 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736, - 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736, - 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736, - 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736, - 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736, - 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736, - 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736, - 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736, - 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736, - 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736, - 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736, - 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736, - 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736, - 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736, - 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736, - 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736, - 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736, - 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736, - 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736, - 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736, - 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736, - 2736, 2736, 2736, 2736, 202, 202, 202, 202, + 2746, 2746, 2746, 2746, 2746, 2746, 2746, 2746, + 2746, 2746, 2746, 2746, 2746, 2746, 2746, 2746, + 2746, 2746, 2746, 2746, 2746, 2746, 2746, 2746, + 2746, 2746, 2746, 2746, 2746, 2746, 2746, 2746, + 2746, 2746, 2746, 2746, 2746, 2746, 2746, 2746, + 2746, 2746, 2746, 2746, 2746, 2746, 2746, 2746, + 2746, 2746, 2746, 2746, 2746, 2746, 2746, 2746, + 2746, 2746, 2746, 2746, 2746, 2746, 2746, 2746, + 2746, 2746, 2746, 2746, 2746, 2746, 2746, 2746, + 2746, 2746, 2746, 2746, 2746, 2746, 2746, 2746, + 2746, 2746, 2746, 2746, 2746, 2746, 2746, 2746, + 2746, 2746, 2746, 2746, 2746, 2746, 2746, 2746, + 2746, 2746, 2746, 2746, 2746, 2746, 2746, 2746, + 2746, 2746, 2746, 2746, 2746, 2746, 2746, 2746, + 2746, 2746, 2746, 2746, 2746, 2746, 2746, 2746, + 2746, 2746, 2746, 2746, 2746, 2746, 2746, 2746, + 2746, 2746, 2746, 2746, 2746, 2746, 2746, 2746, + 2746, 2746, 2746, 2746, 2746, 2746, 2746, 2746, + 2746, 2746, 2746, 2746, 2746, 2746, 2746, 2746, + 2746, 2746, 2746, 2746, 2746, 2746, 2746, 2746, + 2746, 2746, 2746, 2746, 2746, 2746, 2746, 2746, + 2746, 2746, 2746, 2746, 2746, 2746, 2746, 2746, + 2746, 2746, 2746, 2746, 2746, 2746, 2746, 2746, + 2746, 2746, 2746, 2746, 2746, 2746, 2746, 2746, + 2746, 2746, 2746, 2746, 2746, 2746, 2746, 2746, + 2746, 2746, 2746, 2746, 2746, 2746, 2746, 2746, + 2746, 2746, 2746, 2746, 2746, 2746, 2746, 2746, + 2746, 2746, 2746, 2746, 2746, 2746, 2746, 2746, + 2746, 2746, 2746, 2746, 2746, 2746, 2746, 2746, + 2746, 2746, 2746, 2746, 2746, 2746, 2746, 2746, + 2746, 2746, 2746, 2746, 2746, 2746, 2746, 2746, + 2746, 2746, 2746, 2746, 2746, 2746, 2746, 2746, - 2737, 2737, 2737, 2737, 2737, 2737, 2737, 2737, - 2737, 2737, 2737, 2737, 2737, 2737, 2737, 2737, - 2737, 2737, 2737, 2737, 2737, 2737, 2737, 2737, - 2737, 2737, 2737, 2737, 2737, 2737, 2737, 2737, - 2737, 2737, 2737, 2737, 2737, 2737, 2737, 2737, - 2737, 2737, 2737, 2737, 2737, 2737, 2737, 2737, - 2737, 2737, 2737, 2737, 2737, 2737, 2737, 2737, - 2737, 2737, 2737, 2737, 2737, 2737, 2737, 2737, - 2737, 2737, 2737, 2737, 2737, 2737, 2737, 2737, - 2737, 2737, 2737, 2737, 2737, 2737, 2737, 2737, - 2737, 2737, 2737, 2737, 2737, 2737, 2737, 2737, - 2737, 2737, 2737, 2737, 2737, 2737, 2737, 2737, - 2737, 2737, 2737, 2737, 2737, 2737, 2737, 2737, - 2737, 2737, 2737, 202, 202, 202, 202, 202, - 2737, 2737, 2737, 2737, 2737, 2737, 2737, 2737, - 2737, 2737, 2737, 2737, 2737, 202, 202, 202, - 2737, 2737, 2737, 2737, 2737, 2737, 2737, 2737, - 2737, 202, 202, 202, 202, 202, 202, 202, - 2737, 2737, 2737, 2737, 2737, 2737, 2737, 2737, - 2737, 2737, 202, 202, 2738, 2739, 2740, 2741, - 2742, 2742, 2742, 2742, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, + 2746, 2746, 2746, 2746, 2746, 2746, 2746, 2746, + 2746, 2746, 2746, 2746, 2746, 2746, 2746, 2746, + 2746, 2746, 2746, 2746, 2746, 2746, 2746, 2746, + 2746, 2746, 2746, 2746, 2746, 2746, 2746, 2746, + 2746, 2746, 2746, 2746, 2746, 2746, 2746, 2746, + 2746, 2746, 2746, 2746, 2746, 2746, 2746, 2746, + 2746, 2746, 2746, 2746, 2746, 2746, 2746, 2746, + 2746, 2746, 2746, 2746, 2746, 2746, 2746, 2746, + 2746, 2746, 2746, 2746, 2746, 2746, 2746, 2746, + 2746, 2746, 2746, 2746, 2746, 2746, 2746, 2746, + 2746, 2746, 2746, 2746, 2746, 2746, 2746, 2746, + 2746, 2746, 2746, 2746, 2746, 2746, 2746, 2746, + 2746, 2746, 2746, 2746, 2746, 2746, 2746, 2746, + 2746, 2746, 2746, 2746, 2746, 2746, 2746, 2746, + 2746, 2746, 2746, 2746, 2746, 2746, 2746, 2746, + 2746, 2746, 2746, 2746, 2746, 2746, 2746, 2746, + 2746, 2746, 2746, 2746, 2746, 2746, 2746, 2746, + 2746, 2746, 2746, 2746, 2746, 2746, 2746, 2746, + 2746, 2746, 2746, 2746, 2746, 2746, 2746, 2746, + 2746, 2746, 2746, 2746, 2746, 2746, 2746, 2746, + 2746, 2746, 2746, 2746, 2746, 2746, 2746, 2746, + 2746, 2746, 2746, 2746, 2746, 2746, 2746, 2746, + 2746, 2746, 2746, 2746, 2746, 2746, 2746, 2746, + 2746, 2746, 2746, 2746, 2746, 2746, 2746, 2746, + 2746, 2746, 2746, 2746, 2746, 2746, 2746, 2746, + 2746, 2746, 2746, 2746, 2746, 2746, 2746, 2746, + 2746, 2746, 2746, 2746, 2746, 2746, 2746, 2746, + 2746, 2746, 2746, 2746, 2746, 2746, 2746, 2746, + 2746, 2746, 2746, 2746, 2746, 2746, 2746, 2746, + 2746, 2746, 2746, 2746, 2746, 2747, 2747, 2747, + 2747, 2747, 2748, 2748, 2748, 2748, 2748, 2748, + 203, 203, 203, 203, 203, 203, 203, 203, - 2743, 2743, 2743, 2743, 2743, 2743, 2743, 2743, - 2743, 2743, 2743, 2743, 2743, 2743, 2743, 2743, - 2743, 2743, 2743, 2743, 2743, 2743, 2743, 2743, - 2743, 2743, 2743, 2743, 2743, 2743, 2743, 2743, - 2743, 2743, 2743, 2743, 2743, 2743, 2743, 2743, - 2743, 2743, 2743, 2743, 2743, 2743, 2743, 2743, - 2743, 2743, 2743, 2743, 2743, 2743, 2743, 2743, - 2743, 2743, 2743, 2743, 2743, 2743, 2743, 2743, - 2743, 2743, 2743, 2743, 2743, 2743, 2743, 2743, - 2743, 2743, 2743, 2743, 2743, 2743, 2743, 2743, - 2743, 2743, 2743, 2743, 2743, 2743, 2743, 2743, - 2743, 2743, 2743, 2743, 2743, 2743, 2743, 2743, - 2743, 2743, 2743, 2743, 2743, 2743, 2743, 2743, - 2743, 2743, 2743, 2743, 2743, 2743, 2743, 2743, - 2743, 2743, 2743, 2743, 2743, 2743, 2743, 2743, - 2743, 2743, 2743, 2743, 2743, 2743, 2743, 2743, - 2743, 2743, 2743, 2743, 2743, 2743, 2743, 2743, - 2743, 2743, 2743, 2743, 2743, 2743, 2743, 2743, - 2743, 2743, 2743, 2743, 2743, 2743, 2743, 2743, - 2743, 2743, 2743, 2743, 2743, 2743, 2743, 2743, - 2743, 2743, 2743, 2743, 2743, 2743, 2743, 2743, - 2743, 2743, 2743, 2743, 2743, 2743, 2743, 2743, - 2743, 2743, 2743, 2743, 2743, 2743, 2743, 2743, - 2743, 2743, 2743, 2743, 2743, 2743, 2743, 2743, - 2743, 2743, 2743, 2743, 2743, 2743, 2743, 2743, - 2743, 2743, 2743, 2743, 2743, 2743, 2743, 2743, - 2743, 2743, 2743, 2743, 2743, 2743, 2743, 2743, - 2743, 2743, 2743, 2743, 2743, 2743, 2743, 2743, - 2743, 2743, 2743, 2743, 2743, 2743, 2743, 2743, - 2743, 2743, 2743, 2743, 2743, 2743, 2743, 2743, - 2743, 2743, 2743, 2743, 2743, 2743, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, + 2746, 2746, 2746, 2746, 2746, 2746, 2746, 2746, + 2746, 2746, 2746, 2746, 2746, 2746, 2746, 2746, + 2746, 2746, 2746, 2746, 2746, 2746, 2746, 2746, + 2746, 2746, 2746, 2746, 2746, 2746, 2746, 2746, + 2746, 2746, 2746, 2746, 2746, 2746, 2746, 2746, + 2746, 2746, 2746, 2746, 2746, 2746, 2746, 2746, + 2746, 2746, 2746, 2746, 2746, 2746, 2746, 2746, + 2746, 2746, 2746, 2746, 2746, 2746, 2746, 2746, + 2746, 2746, 2746, 2746, 2746, 2746, 2746, 2746, + 2746, 2746, 2746, 2746, 2746, 2746, 2746, 2746, + 2746, 2746, 2746, 2746, 2746, 2746, 2746, 2746, + 2746, 2746, 2746, 2746, 2746, 2746, 2746, 2746, + 2746, 2746, 2746, 2746, 2746, 2746, 2746, 2746, + 2746, 2746, 2746, 2746, 2746, 2746, 2746, 2746, + 2746, 2746, 2746, 2746, 2746, 2746, 2746, 2746, + 2746, 2746, 2746, 2746, 2746, 2746, 2746, 2746, + 2746, 2746, 2746, 2746, 2746, 2746, 2746, 2746, + 2746, 2746, 2746, 2746, 2746, 2746, 2746, 2746, + 2746, 2746, 2746, 2746, 2746, 2746, 2746, 2746, + 2746, 2746, 2746, 2746, 2746, 2746, 2746, 2746, + 2746, 2746, 2746, 2746, 2746, 2746, 2746, 2746, + 2746, 2746, 2746, 2746, 2746, 2746, 2746, 2746, + 2746, 2746, 2746, 2746, 2746, 2746, 2746, 2746, + 2746, 2746, 2746, 2746, 2746, 2746, 2746, 2746, + 2746, 2746, 2746, 2746, 2746, 2746, 2746, 2746, + 2746, 2746, 2746, 2746, 2746, 2746, 2746, 2746, + 2746, 2746, 2746, 2746, 2746, 2746, 2746, 2746, + 2746, 2746, 2746, 2746, 2746, 2746, 2746, 2746, + 2746, 2746, 2746, 2746, 2746, 2746, 2746, 2746, + 2746, 2746, 2746, 2746, 2746, 2746, 2746, 2746, + 2746, 2746, 2746, 2749, 2749, 2749, 2749, 2749, + 2749, 2749, 2749, 2749, 2749, 2749, 2749, 2749, - 2743, 2743, 2743, 2743, 2743, 2743, 2743, 2743, - 2743, 2743, 2743, 2743, 2743, 2743, 2743, 2743, - 2743, 2743, 2743, 2743, 2743, 2743, 2743, 2743, - 2743, 2743, 2743, 2743, 2743, 2743, 2743, 2743, - 2743, 2743, 2743, 2743, 2743, 2743, 2743, 202, - 202, 1465, 2743, 2743, 2743, 2743, 2743, 2743, - 2743, 2743, 2743, 2743, 2743, 2743, 2743, 2743, - 2743, 2743, 2743, 2743, 2743, 2743, 2743, 2743, - 2743, 2743, 2743, 2743, 2743, 2743, 2743, 2743, - 2743, 2743, 2743, 2743, 2743, 2743, 2743, 2743, - 2743, 2743, 2743, 2743, 2743, 2743, 2743, 2743, - 2743, 2743, 2743, 2743, 2743, 2743, 2744, 2744, - 2744, 2744, 2744, 2744, 2744, 2745, 2746, 2747, - 2747, 2747, 2743, 2743, 2743, 2748, 2745, 2745, - 2745, 2745, 2745, 2749, 2749, 2749, 2749, 2749, - 2749, 2749, 2749, 2750, 2750, 2750, 2750, 2750, - 2750, 2750, 2750, 2743, 2743, 2751, 2751, 2751, - 2751, 2751, 2750, 2750, 2743, 2743, 2743, 2743, - 2743, 2743, 2743, 2743, 2743, 2743, 2743, 2743, - 2743, 2743, 2743, 2743, 2743, 2743, 2743, 2743, - 2743, 2743, 2743, 2743, 2743, 2743, 2743, 2743, - 2743, 2743, 2751, 2751, 2751, 2751, 2743, 2743, - 2743, 2743, 2743, 2743, 2743, 2743, 2743, 2743, - 2743, 2743, 2743, 2744, 2744, 2744, 2744, 2744, - 2744, 2743, 2743, 2743, 2743, 2743, 2743, 2743, - 2743, 2743, 2743, 2743, 2743, 2743, 2743, 2743, - 2743, 2743, 2743, 2743, 2743, 2743, 2743, 2743, - 2743, 2743, 2743, 2743, 2743, 2743, 2752, 2752, - 2752, 2752, 2752, 2752, 2752, 2752, 2752, 2752, - 2752, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, + 2750, 2750, 2750, 2750, 2750, 2750, 2750, 2750, + 2750, 2750, 2750, 2750, 2750, 2750, 2750, 2750, + 2750, 2750, 2750, 2750, 2750, 2750, 2750, 2750, + 2750, 2750, 2750, 2750, 2750, 2750, 2750, 2750, + 2750, 2750, 2750, 2750, 2750, 2750, 2750, 2750, + 2750, 2750, 2750, 2750, 2750, 2750, 2750, 2750, + 2750, 2750, 2750, 2750, 2750, 2750, 2750, 2750, + 2750, 2750, 2750, 2750, 2750, 2750, 2750, 2750, + 2750, 2750, 2750, 2750, 2750, 2750, 2750, 2750, + 2750, 2750, 2750, 2750, 2750, 2750, 2750, 2750, + 2750, 2750, 2750, 2750, 2750, 2750, 2750, 2750, + 2750, 2750, 2750, 2750, 2750, 2750, 2750, 2750, + 2750, 2750, 2750, 2750, 2750, 2750, 2750, 2750, + 2750, 2750, 2750, 2750, 2750, 2750, 2750, 2750, + 2750, 2750, 2750, 2750, 2750, 2750, 2750, 2750, + 2750, 2750, 2750, 2750, 2750, 2750, 2750, 2750, + 2750, 2750, 2750, 2750, 2750, 2750, 2750, 2750, + 2750, 2750, 2750, 2750, 2750, 2750, 2750, 2750, + 2750, 2750, 2750, 2750, 2750, 2750, 2750, 2750, + 2750, 2750, 2750, 2750, 2750, 2750, 2750, 2750, + 2750, 2750, 2750, 2750, 2750, 2750, 2750, 2750, + 2750, 2750, 2750, 2750, 2750, 2750, 2750, 2750, + 2750, 2750, 2750, 2750, 2750, 2750, 2750, 2750, + 2750, 2750, 2750, 2750, 2750, 2750, 2750, 2750, + 2750, 2750, 2750, 2750, 2750, 2750, 2750, 2750, + 2750, 2750, 2750, 2750, 2750, 2750, 2750, 2750, + 2750, 2750, 2750, 2750, 2750, 2750, 2750, 2750, + 2750, 2750, 2750, 2750, 2750, 2750, 2750, 2750, + 2750, 2750, 2750, 2750, 2750, 2750, 2750, 2750, + 2750, 2750, 2750, 2750, 2750, 2750, 2750, 2750, + 2750, 2750, 2750, 2750, 2750, 2750, 2750, 2750, + 2750, 2750, 2750, 2750, 2750, 2750, 2750, 2750, - 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, - 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, - 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, - 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, - 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, - 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, - 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, - 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, - 2130, 2130, 2753, 2753, 2753, 2130, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 2754, 2754, 2754, 2754, 2754, 2754, 2754, 2754, - 2754, 2754, 2754, 2754, 2754, 2754, 2754, 2754, - 2754, 2754, 2754, 2754, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, + 2750, 2750, 2750, 2750, 2750, 2750, 2750, 2750, + 2750, 2750, 2750, 2750, 2750, 2750, 2750, 2750, + 2750, 2750, 2750, 2750, 2750, 2750, 2750, 2750, + 2750, 2750, 2750, 2750, 2750, 2750, 2750, 2750, + 2750, 2750, 2750, 2750, 2750, 2750, 2750, 2750, + 2750, 2750, 2750, 2750, 2750, 2750, 2750, 2750, + 2750, 2750, 2750, 2750, 2750, 2750, 2750, 2750, + 2750, 2750, 2750, 2750, 2750, 2750, 2750, 2750, + 2750, 2750, 2750, 2750, 2750, 2750, 2750, 2750, + 2750, 2750, 2750, 2750, 2750, 2750, 2750, 2750, + 2750, 2750, 2750, 2750, 2750, 2750, 2750, 2750, + 2750, 2750, 2750, 2750, 2750, 2750, 2750, 2750, + 2750, 2750, 2750, 2750, 2750, 2750, 2750, 2750, + 2750, 2750, 2750, 2750, 2750, 2750, 2750, 2750, + 2750, 2750, 2750, 2750, 2750, 2750, 2750, 2750, + 2750, 2750, 2750, 2750, 2750, 2750, 2750, 2750, + 2750, 2750, 2750, 2750, 2750, 2750, 2750, 2750, + 2750, 2750, 2750, 2750, 2750, 2750, 2750, 2750, + 2750, 2750, 2750, 2750, 2750, 2750, 2750, 2750, + 2750, 2750, 2750, 2750, 2750, 2750, 2750, 2750, + 2750, 2750, 2750, 2750, 2750, 2750, 2750, 2750, + 2750, 2750, 2750, 2750, 2750, 2750, 2750, 2750, + 2750, 2750, 2750, 2750, 2750, 2750, 2750, 2750, + 2750, 2750, 2750, 2750, 2750, 2750, 2750, 2750, + 2750, 2750, 2750, 2750, 2750, 2750, 2750, 2750, + 2750, 2750, 2750, 2750, 2750, 2750, 2750, 2750, + 2750, 2750, 2750, 2750, 2750, 2750, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, - 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, - 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, - 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, - 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, - 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, - 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, - 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, - 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, - 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, - 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, - 1507, 1507, 1507, 1507, 1507, 1507, 1507, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, - 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, - 2755, 2755, 2754, 2754, 2754, 2754, 2754, 2754, - 2754, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, + 2749, 2749, 2749, 2749, 2749, 2749, 2749, 2749, + 2749, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + + 2751, 2752, 2753, 2753, 2753, 2753, 2753, 2753, + 2753, 2753, 2753, 2753, 2753, 2753, 2753, 2753, + 2753, 2753, 2753, 2753, 2753, 2753, 2753, 2753, + 2753, 2753, 2753, 2753, 2753, 2753, 2753, 2753, + 2753, 2753, 2753, 2753, 2753, 2753, 2753, 2753, + 2753, 2753, 2753, 2753, 2753, 2753, 2753, 2753, + 2753, 2753, 2753, 2753, 2753, 2753, 2753, 2753, + 2753, 2753, 2753, 2753, 2753, 2753, 2753, 2753, + 2753, 2753, 2753, 2753, 2753, 2753, 2753, 2753, + 2753, 2753, 2753, 2753, 2753, 2753, 2753, 2753, + 2753, 2753, 2753, 2753, 2753, 2753, 2753, 2753, + 2753, 2753, 2753, 2753, 2753, 2753, 2753, 2753, + 2753, 2753, 2753, 2753, 2753, 2753, 2753, 2753, + 2753, 2753, 2753, 2753, 2753, 2753, 2753, 2753, + 2753, 2753, 2753, 2753, 2753, 2753, 2753, 2753, + 2753, 2753, 2753, 2753, 2753, 2753, 2753, 2753, + 2753, 2753, 2753, 2753, 2753, 2753, 2753, 2753, + 2753, 2753, 2753, 2753, 2753, 2753, 2753, 2753, + 2753, 2753, 2753, 2753, 2753, 2753, 2753, 2753, + 2753, 2753, 2753, 2753, 2753, 2753, 2753, 2753, + 2753, 2753, 2753, 2753, 2753, 2753, 2753, 2753, + 2753, 2753, 2753, 2753, 2753, 2753, 2753, 2753, + 2753, 2753, 2753, 2753, 2753, 2753, 2753, 2753, + 2753, 2753, 2753, 2753, 2753, 2753, 2753, 2753, + 2753, 2753, 2753, 2753, 2753, 2753, 2753, 2753, + 2753, 2753, 2753, 2753, 2753, 2753, 2753, 2753, + 2753, 2753, 2753, 2753, 2753, 2753, 2753, 2753, + 2753, 2753, 2753, 2753, 2753, 2753, 2753, 2753, + 2753, 2753, 2753, 2753, 2753, 2753, 2753, 2753, + 2753, 2753, 2753, 2753, 2753, 2753, 2753, 2753, + 2753, 2753, 2753, 2753, 2753, 2753, 2753, 2753, + 2753, 2753, 2753, 2753, 2753, 2753, 2753, 2753, + + 2753, 2753, 2753, 2753, 2753, 2753, 2753, 2753, + 2753, 2753, 2753, 2753, 2753, 2753, 2753, 2753, + 2753, 2753, 2753, 2753, 2753, 2753, 2753, 2753, + 2753, 2753, 2753, 2753, 2753, 2753, 2753, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 2754, 2754, 2754, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 2755, 2755, 2755, 2755, + 203, 203, 203, 203, 203, 203, 203, 203, + 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, + 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, + 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, + 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, + 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, + 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, + 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, + 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, + 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, + 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, + 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, + 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, + 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, + 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, + 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, + 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, + 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, + 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, - 2756, 2756, 2757, 2757, 2757, 2757, 2757, 2757, - 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757, - 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757, - 2757, 2757, 2757, 2757, 2756, 2756, 2756, 2756, - 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, - 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, - 2756, 2756, 2756, 2756, 2756, 2756, 2757, 2757, - 2757, 2757, 2757, 2757, 2757, 202, 2757, 2757, - 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757, - 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, - 2756, 2756, 2757, 2757, 2757, 2757, 2757, 2757, - 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757, - 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757, - 2757, 2757, 2757, 2757, 2756, 202, 2756, 2756, - 202, 202, 2756, 202, 202, 2756, 2756, 202, - 202, 2756, 2756, 2756, 2756, 202, 2756, 2756, - 2756, 2756, 2756, 2756, 2756, 2756, 2757, 2757, - 2757, 2757, 202, 2757, 202, 2757, 2757, 2757, - 2757, 2758, 2757, 2757, 202, 2757, 2757, 2757, - 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, - 2756, 2756, 2757, 2757, 2757, 2757, 2757, 2757, - 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757, - 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757, - - 2757, 2757, 2757, 2757, 2756, 2756, 202, 2756, - 2756, 2756, 2756, 202, 202, 2756, 2756, 2756, - 2756, 2756, 2756, 2756, 2756, 202, 2756, 2756, - 2756, 2756, 2756, 2756, 2756, 202, 2757, 2757, - 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757, - 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757, - 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757, - 2756, 2756, 202, 2756, 2756, 2756, 2756, 202, - 2756, 2756, 2756, 2756, 2756, 202, 2756, 202, - 202, 202, 2756, 2756, 2756, 2756, 2756, 2756, - 2756, 202, 2757, 2757, 2757, 2757, 2757, 2757, - 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757, - 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757, - 2757, 2757, 2757, 2757, 2756, 2756, 2756, 2756, - 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, - 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, - 2756, 2756, 2756, 2756, 2756, 2756, 2757, 2757, - 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757, - 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757, - 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, - 2756, 2756, 2757, 2757, 2757, 2757, 2757, 2757, - 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757, - 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757, - 2757, 2757, 2757, 2757, 2756, 2756, 2756, 2756, - 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, - 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, - 2756, 2756, 2756, 2756, 2756, 2756, 2757, 2757, - 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757, - 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757, - - 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, - 2756, 2756, 2757, 2757, 2757, 2757, 2757, 2757, - 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757, - 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757, - 2757, 2757, 2757, 2757, 2756, 2756, 2756, 2756, - 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, - 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, - 2756, 2756, 2756, 2756, 2756, 2756, 2757, 2757, - 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757, - 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757, - 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, - 2756, 2756, 2757, 2757, 2757, 2757, 2757, 2757, - 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757, - 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757, - 2757, 2757, 2757, 2757, 1457, 1457, 202, 202, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, - 2756, 2759, 2757, 2757, 2757, 2757, 2757, 2757, - 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757, - 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757, - 2757, 2757, 2757, 2760, 2757, 2757, 2757, 2757, - 2757, 2757, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, - 2756, 2756, 2756, 2759, 2757, 2757, 2757, 2757, + 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, + 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, + 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, + 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, + 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, + 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, + 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, + 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, + 2756, 2756, 2756, 2756, 203, 203, 203, 203, 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757, - 2757, 2757, 2757, 2757, 2757, 2760, 2757, 2757, - 2757, 2757, 2757, 2757, 2756, 2756, 2756, 2756, - 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, - 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, - 2756, 2756, 2756, 2756, 2756, 2759, 2757, 2757, - 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757, - 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757, - 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2760, - 2757, 2757, 2757, 2757, 2757, 2757, 2756, 2756, - 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, - 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, - 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2759, 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757, - 2757, 2760, 2757, 2757, 2757, 2757, 2757, 2757, - 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, - 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, - 2756, 2756, 2756, 2756, 2756, 2756, 2756, 2756, - 2756, 2759, 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757, - 2757, 2757, 2757, 2760, 2757, 2757, 2757, 2757, - 2757, 2757, 2761, 2762, 202, 202, 2763, 2764, - 2765, 2766, 2767, 2768, 2769, 2770, 2771, 2772, - 2763, 2764, 2765, 2766, 2767, 2768, 2769, 2770, - 2771, 2772, 2763, 2764, 2765, 2766, 2767, 2768, - 2769, 2770, 2771, 2772, 2763, 2764, 2765, 2766, - 2767, 2768, 2769, 2770, 2771, 2772, 2763, 2764, - 2765, 2766, 2767, 2768, 2769, 2770, 2771, 2772, + 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757, + 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757, + 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757, + 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757, + 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757, + 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757, + 2757, 2757, 2757, 203, 203, 203, 203, 203, + 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757, + 2757, 2757, 2757, 2757, 2757, 203, 203, 203, + 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757, + 2757, 203, 203, 203, 203, 203, 203, 203, + 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757, + 2757, 2757, 203, 203, 2758, 2759, 2760, 2761, + 2762, 2762, 2762, 2762, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, - 2773, 2773, 2773, 2773, 2773, 2773, 2773, 2773, - 2773, 2773, 2773, 2773, 2773, 2773, 2773, 2773, - 2773, 2773, 2773, 2773, 2773, 2773, 2773, 2773, - 2773, 2773, 2773, 2773, 2773, 2773, 2773, 2773, - 2773, 2773, 2773, 2773, 2773, 2773, 2773, 2773, - 2773, 2773, 2773, 2773, 2773, 2773, 2773, 2773, - 2773, 2773, 2773, 2773, 2773, 2773, 2773, 2773, - 2773, 2773, 2773, 2773, 2773, 2773, 2773, 2773, - 2773, 2773, 2773, 2773, 2773, 2773, 2773, 2773, - 2773, 2773, 2773, 2773, 2773, 2773, 2773, 2773, - 2773, 2773, 2773, 2773, 2773, 2773, 2773, 2773, - 2773, 2773, 2773, 2773, 2773, 2773, 2773, 2773, - 2773, 2773, 2773, 2773, 2773, 2773, 2773, 2773, - 2773, 2773, 2773, 2773, 2773, 2773, 2773, 2773, - 2773, 2773, 2773, 2773, 2773, 2773, 2773, 2773, - 2773, 2773, 2773, 2773, 2773, 2773, 2773, 2773, - 2773, 2773, 2773, 2773, 2773, 2773, 2773, 2773, - 2773, 2773, 2773, 2773, 2773, 2773, 2773, 2773, - 2773, 2773, 2773, 2773, 2773, 2773, 2773, 2773, - 2773, 2773, 2773, 2773, 2773, 2773, 2773, 2773, - 2773, 2773, 2773, 2773, 2773, 2773, 2773, 2773, - 2773, 2773, 2773, 2773, 2773, 2773, 2773, 2773, - 2773, 2773, 2773, 2773, 2773, 2773, 2773, 2773, - 2773, 2773, 2773, 2773, 2773, 2773, 2773, 2773, - 2773, 2773, 2773, 2773, 2773, 2773, 2773, 2773, - 2773, 2773, 2773, 2773, 2773, 2773, 2773, 2773, - 2773, 2773, 2773, 2773, 2773, 2773, 2773, 2773, - 2773, 2773, 2773, 2773, 2773, 2773, 2773, 2773, - 2773, 2773, 2773, 2773, 2773, 2773, 2773, 2773, - 2773, 2773, 2773, 2773, 2773, 2773, 2773, 2773, - 2773, 2773, 2773, 2773, 2773, 2773, 2773, 2773, - 2773, 2773, 2773, 2773, 2773, 2773, 2773, 2773, + 2763, 2763, 2763, 2763, 2763, 2763, 2763, 2763, + 2763, 2763, 2763, 2763, 2763, 2763, 2763, 2763, + 2763, 2763, 2763, 2763, 2763, 2763, 2763, 2763, + 2763, 2763, 2763, 2763, 2763, 2763, 2763, 2763, + 2763, 2763, 2763, 2763, 2763, 2763, 2763, 2763, + 2763, 2763, 2763, 2763, 2763, 2763, 2763, 2763, + 2763, 2763, 2763, 2763, 2763, 2763, 2763, 2763, + 2763, 2763, 2763, 2763, 2763, 2763, 2763, 2763, + 2763, 2763, 2763, 2763, 2763, 2763, 2763, 2763, + 2763, 2763, 2763, 2763, 2763, 2763, 2763, 2763, + 2763, 2763, 2763, 2763, 2763, 2763, 2763, 2763, + 2763, 2763, 2763, 2763, 2763, 2763, 2763, 2763, + 2763, 2763, 2763, 2763, 2763, 2763, 2763, 2763, + 2763, 2763, 2763, 2763, 2763, 2763, 2763, 2763, + 2763, 2763, 2763, 2763, 2763, 2763, 2763, 2763, + 2763, 2763, 2763, 2763, 2763, 2763, 2763, 2763, + 2763, 2763, 2763, 2763, 2763, 2763, 2763, 2763, + 2763, 2763, 2763, 2763, 2763, 2763, 2763, 2763, + 2763, 2763, 2763, 2763, 2763, 2763, 2763, 2763, + 2763, 2763, 2763, 2763, 2763, 2763, 2763, 2763, + 2763, 2763, 2763, 2763, 2763, 2763, 2763, 2763, + 2763, 2763, 2763, 2763, 2763, 2763, 2763, 2763, + 2763, 2763, 2763, 2763, 2763, 2763, 2763, 2763, + 2763, 2763, 2763, 2763, 2763, 2763, 2763, 2763, + 2763, 2763, 2763, 2763, 2763, 2763, 2763, 2763, + 2763, 2763, 2763, 2763, 2763, 2763, 2763, 2763, + 2763, 2763, 2763, 2763, 2763, 2763, 2763, 2763, + 2763, 2763, 2763, 2763, 2763, 2763, 2763, 2763, + 2763, 2763, 2763, 2763, 2763, 2763, 2763, 2763, + 2763, 2763, 2763, 2763, 2763, 2763, 2763, 2763, + 2763, 2763, 2763, 2763, 2763, 2763, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 2763, 2763, 2763, 2763, 2763, 2763, 2763, 2763, + 2763, 2763, 2763, 2763, 2763, 2763, 2763, 2763, + 2763, 2763, 2763, 2763, 2763, 2763, 2763, 2763, + 2763, 2763, 2763, 2763, 2763, 2763, 2763, 2763, + 2763, 2763, 2763, 2763, 2763, 2763, 2763, 203, + 203, 1468, 2763, 2763, 2763, 2763, 2763, 2763, + 2763, 2763, 2763, 2763, 2763, 2763, 2763, 2763, + 2763, 2763, 2763, 2763, 2763, 2763, 2763, 2763, + 2763, 2763, 2763, 2763, 2763, 2763, 2763, 2763, + 2763, 2763, 2763, 2763, 2763, 2763, 2763, 2763, + 2763, 2763, 2763, 2763, 2763, 2763, 2763, 2763, + 2763, 2763, 2763, 2763, 2763, 2763, 2764, 2764, + 2764, 2764, 2764, 2764, 2764, 2765, 2766, 2767, + 2767, 2767, 2763, 2763, 2763, 2768, 2765, 2765, + 2765, 2765, 2765, 2769, 2769, 2769, 2769, 2769, + 2769, 2769, 2769, 2770, 2770, 2770, 2770, 2770, + 2770, 2770, 2770, 2763, 2763, 2771, 2771, 2771, + 2771, 2771, 2770, 2770, 2763, 2763, 2763, 2763, + 2763, 2763, 2763, 2763, 2763, 2763, 2763, 2763, + 2763, 2763, 2763, 2763, 2763, 2763, 2763, 2763, + 2763, 2763, 2763, 2763, 2763, 2763, 2763, 2763, + 2763, 2763, 2771, 2771, 2771, 2771, 2763, 2763, + 2763, 2763, 2763, 2763, 2763, 2763, 2763, 2763, + 2763, 2763, 2763, 2764, 2764, 2764, 2764, 2764, + 2764, 2763, 2763, 2763, 2763, 2763, 2763, 2763, + 2763, 2763, 2763, 2763, 2763, 2763, 2763, 2763, + 2763, 2763, 2763, 2763, 2763, 2763, 2763, 2763, + 2763, 2763, 2763, 2763, 2763, 2763, 2772, 2772, + 2772, 2772, 2772, 2772, 2772, 2772, 2772, 2772, + 2772, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + + 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, + 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, + 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, + 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, + 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, + 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, + 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, + 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, + 2150, 2150, 2773, 2773, 2773, 2150, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, 2774, 2774, 2774, 2774, 2774, 2774, 2774, 2774, 2774, 2774, 2774, 2774, 2774, 2774, 2774, 2774, - 2774, 2774, 2774, 2774, 2774, 2774, 2774, 2774, - 2774, 2774, 2774, 2774, 2774, 2774, 2774, 2774, - 2774, 2774, 2774, 2774, 2774, 2774, 2774, 2774, - 2774, 2774, 2774, 2774, 2774, 2774, 2774, 2774, - 2774, 2774, 2774, 2774, 2774, 2774, 2774, 2773, - 2773, 2773, 2773, 2774, 2774, 2774, 2774, 2774, - 2774, 2774, 2774, 2774, 2774, 2774, 2774, 2774, - 2774, 2774, 2774, 2774, 2774, 2774, 2774, 2774, - 2774, 2774, 2774, 2774, 2774, 2774, 2774, 2774, - 2774, 2774, 2774, 2774, 2774, 2774, 2774, 2774, - 2774, 2774, 2774, 2774, 2774, 2774, 2774, 2774, - 2774, 2774, 2774, 2774, 2774, 2773, 2773, 2773, - 2773, 2773, 2773, 2773, 2773, 2774, 2773, 2773, - 2773, 2773, 2773, 2773, 2773, 2773, 2773, 2773, - 2773, 2773, 2773, 2773, 2774, 2773, 2773, 2775, - 2776, 2775, 2775, 2777, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 2774, 2774, 2774, 2774, 2774, - 202, 2774, 2774, 2774, 2774, 2774, 2774, 2774, - 2774, 2774, 2774, 2774, 2774, 2774, 2774, 2774, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, + 2774, 2774, 2774, 2774, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, - 2778, 2778, 2778, 2778, 2778, 2778, 2778, 202, - 2778, 2778, 2778, 2778, 2778, 2778, 2778, 2778, - 2778, 2778, 2778, 2778, 2778, 2778, 2778, 2778, - 2778, 202, 202, 2778, 2778, 2778, 2778, 2778, - 2778, 2778, 202, 2778, 2778, 202, 2778, 2778, - 2778, 2778, 2778, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, + 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, + 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, + 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, + 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, + 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, + 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, + 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, + 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, + 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, + 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, + 1513, 1513, 1513, 1513, 1513, 1513, 1513, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 2775, 2775, 2775, 2775, 2775, 2775, 2775, 2775, + 2775, 2775, 2775, 2775, 2775, 2775, 2775, 2775, + 2775, 2775, 2774, 2774, 2774, 2774, 2774, 2774, + 2774, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, - 2779, 2779, 2779, 2779, 2779, 2779, 2779, 2779, - 2779, 2779, 2779, 2779, 2779, 2779, 2779, 2779, - 2779, 2779, 2779, 2779, 2779, 2779, 2779, 2779, - 2779, 2779, 2779, 2779, 2779, 2779, 2779, 2779, - 2779, 2779, 2779, 2779, 2779, 2779, 2779, 2779, - 2779, 2779, 2779, 2779, 2779, 202, 202, 202, - 2780, 2780, 2780, 2780, 2780, 2780, 2780, 2781, - 2781, 2781, 2781, 2781, 2781, 2781, 202, 202, - 2782, 2783, 2784, 2785, 2786, 2787, 2788, 2789, - 2790, 2791, 202, 202, 202, 202, 2779, 2792, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, + 2776, 2776, 2776, 2776, 2776, 2776, 2776, 2776, + 2776, 2776, 2776, 2776, 2776, 2776, 2776, 2776, + 2776, 2776, 2776, 2776, 2776, 2776, 2776, 2776, + 2776, 2776, 2777, 2777, 2777, 2777, 2777, 2777, + 2777, 2777, 2777, 2777, 2777, 2777, 2777, 2777, + 2777, 2777, 2777, 2777, 2777, 2777, 2777, 2777, + 2777, 2777, 2777, 2777, 2776, 2776, 2776, 2776, + 2776, 2776, 2776, 2776, 2776, 2776, 2776, 2776, + 2776, 2776, 2776, 2776, 2776, 2776, 2776, 2776, + 2776, 2776, 2776, 2776, 2776, 2776, 2777, 2777, + 2777, 2777, 2777, 2777, 2777, 203, 2777, 2777, + 2777, 2777, 2777, 2777, 2777, 2777, 2777, 2777, + 2777, 2777, 2777, 2777, 2777, 2777, 2777, 2777, + 2776, 2776, 2776, 2776, 2776, 2776, 2776, 2776, + 2776, 2776, 2776, 2776, 2776, 2776, 2776, 2776, + 2776, 2776, 2776, 2776, 2776, 2776, 2776, 2776, + 2776, 2776, 2777, 2777, 2777, 2777, 2777, 2777, + 2777, 2777, 2777, 2777, 2777, 2777, 2777, 2777, + 2777, 2777, 2777, 2777, 2777, 2777, 2777, 2777, + 2777, 2777, 2777, 2777, 2776, 203, 2776, 2776, + 203, 203, 2776, 203, 203, 2776, 2776, 203, + 203, 2776, 2776, 2776, 2776, 203, 2776, 2776, + 2776, 2776, 2776, 2776, 2776, 2776, 2777, 2777, + 2777, 2777, 203, 2777, 203, 2777, 2777, 2777, + 2777, 2778, 2777, 2777, 203, 2777, 2777, 2777, + 2777, 2777, 2777, 2777, 2777, 2777, 2777, 2777, + 2776, 2776, 2776, 2776, 2776, 2776, 2776, 2776, + 2776, 2776, 2776, 2776, 2776, 2776, 2776, 2776, + 2776, 2776, 2776, 2776, 2776, 2776, 2776, 2776, + 2776, 2776, 2777, 2777, 2777, 2777, 2777, 2777, + 2777, 2777, 2777, 2777, 2777, 2777, 2777, 2777, + 2777, 2777, 2777, 2777, 2777, 2777, 2777, 2777, + + 2777, 2777, 2777, 2777, 2776, 2776, 203, 2776, + 2776, 2776, 2776, 203, 203, 2776, 2776, 2776, + 2776, 2776, 2776, 2776, 2776, 203, 2776, 2776, + 2776, 2776, 2776, 2776, 2776, 203, 2777, 2777, + 2777, 2777, 2777, 2777, 2777, 2777, 2777, 2777, + 2777, 2777, 2777, 2777, 2777, 2777, 2777, 2777, + 2777, 2777, 2777, 2777, 2777, 2777, 2777, 2777, + 2776, 2776, 203, 2776, 2776, 2776, 2776, 203, + 2776, 2776, 2776, 2776, 2776, 203, 2776, 203, + 203, 203, 2776, 2776, 2776, 2776, 2776, 2776, + 2776, 203, 2777, 2777, 2777, 2777, 2777, 2777, + 2777, 2777, 2777, 2777, 2777, 2777, 2777, 2777, + 2777, 2777, 2777, 2777, 2777, 2777, 2777, 2777, + 2777, 2777, 2777, 2777, 2776, 2776, 2776, 2776, + 2776, 2776, 2776, 2776, 2776, 2776, 2776, 2776, + 2776, 2776, 2776, 2776, 2776, 2776, 2776, 2776, + 2776, 2776, 2776, 2776, 2776, 2776, 2777, 2777, + 2777, 2777, 2777, 2777, 2777, 2777, 2777, 2777, + 2777, 2777, 2777, 2777, 2777, 2777, 2777, 2777, + 2777, 2777, 2777, 2777, 2777, 2777, 2777, 2777, + 2776, 2776, 2776, 2776, 2776, 2776, 2776, 2776, + 2776, 2776, 2776, 2776, 2776, 2776, 2776, 2776, + 2776, 2776, 2776, 2776, 2776, 2776, 2776, 2776, + 2776, 2776, 2777, 2777, 2777, 2777, 2777, 2777, + 2777, 2777, 2777, 2777, 2777, 2777, 2777, 2777, + 2777, 2777, 2777, 2777, 2777, 2777, 2777, 2777, + 2777, 2777, 2777, 2777, 2776, 2776, 2776, 2776, + 2776, 2776, 2776, 2776, 2776, 2776, 2776, 2776, + 2776, 2776, 2776, 2776, 2776, 2776, 2776, 2776, + 2776, 2776, 2776, 2776, 2776, 2776, 2777, 2777, + 2777, 2777, 2777, 2777, 2777, 2777, 2777, 2777, + 2777, 2777, 2777, 2777, 2777, 2777, 2777, 2777, + + 2777, 2777, 2777, 2777, 2777, 2777, 2777, 2777, + 2776, 2776, 2776, 2776, 2776, 2776, 2776, 2776, + 2776, 2776, 2776, 2776, 2776, 2776, 2776, 2776, + 2776, 2776, 2776, 2776, 2776, 2776, 2776, 2776, + 2776, 2776, 2777, 2777, 2777, 2777, 2777, 2777, + 2777, 2777, 2777, 2777, 2777, 2777, 2777, 2777, + 2777, 2777, 2777, 2777, 2777, 2777, 2777, 2777, + 2777, 2777, 2777, 2777, 2776, 2776, 2776, 2776, + 2776, 2776, 2776, 2776, 2776, 2776, 2776, 2776, + 2776, 2776, 2776, 2776, 2776, 2776, 2776, 2776, + 2776, 2776, 2776, 2776, 2776, 2776, 2777, 2777, + 2777, 2777, 2777, 2777, 2777, 2777, 2777, 2777, + 2777, 2777, 2777, 2777, 2777, 2777, 2777, 2777, + 2777, 2777, 2777, 2777, 2777, 2777, 2777, 2777, + 2776, 2776, 2776, 2776, 2776, 2776, 2776, 2776, + 2776, 2776, 2776, 2776, 2776, 2776, 2776, 2776, + 2776, 2776, 2776, 2776, 2776, 2776, 2776, 2776, + 2776, 2776, 2777, 2777, 2777, 2777, 2777, 2777, + 2777, 2777, 2777, 2777, 2777, 2777, 2777, 2777, + 2777, 2777, 2777, 2777, 2777, 2777, 2777, 2777, + 2777, 2777, 2777, 2777, 1460, 1460, 203, 203, + 2776, 2776, 2776, 2776, 2776, 2776, 2776, 2776, + 2776, 2776, 2776, 2776, 2776, 2776, 2776, 2776, + 2776, 2776, 2776, 2776, 2776, 2776, 2776, 2776, + 2776, 2779, 2777, 2777, 2777, 2777, 2777, 2777, + 2777, 2777, 2777, 2777, 2777, 2777, 2777, 2777, + 2777, 2777, 2777, 2777, 2777, 2777, 2777, 2777, + 2777, 2777, 2777, 2780, 2777, 2777, 2777, 2777, + 2777, 2777, 2776, 2776, 2776, 2776, 2776, 2776, + 2776, 2776, 2776, 2776, 2776, 2776, 2776, 2776, + 2776, 2776, 2776, 2776, 2776, 2776, 2776, 2776, + 2776, 2776, 2776, 2779, 2777, 2777, 2777, 2777, + + 2777, 2777, 2777, 2777, 2777, 2777, 2777, 2777, + 2777, 2777, 2777, 2777, 2777, 2777, 2777, 2777, + 2777, 2777, 2777, 2777, 2777, 2780, 2777, 2777, + 2777, 2777, 2777, 2777, 2776, 2776, 2776, 2776, + 2776, 2776, 2776, 2776, 2776, 2776, 2776, 2776, + 2776, 2776, 2776, 2776, 2776, 2776, 2776, 2776, + 2776, 2776, 2776, 2776, 2776, 2779, 2777, 2777, + 2777, 2777, 2777, 2777, 2777, 2777, 2777, 2777, + 2777, 2777, 2777, 2777, 2777, 2777, 2777, 2777, + 2777, 2777, 2777, 2777, 2777, 2777, 2777, 2780, + 2777, 2777, 2777, 2777, 2777, 2777, 2776, 2776, + 2776, 2776, 2776, 2776, 2776, 2776, 2776, 2776, + 2776, 2776, 2776, 2776, 2776, 2776, 2776, 2776, + 2776, 2776, 2776, 2776, 2776, 2776, 2776, 2779, + 2777, 2777, 2777, 2777, 2777, 2777, 2777, 2777, + 2777, 2777, 2777, 2777, 2777, 2777, 2777, 2777, + 2777, 2777, 2777, 2777, 2777, 2777, 2777, 2777, + 2777, 2780, 2777, 2777, 2777, 2777, 2777, 2777, + 2776, 2776, 2776, 2776, 2776, 2776, 2776, 2776, + 2776, 2776, 2776, 2776, 2776, 2776, 2776, 2776, + 2776, 2776, 2776, 2776, 2776, 2776, 2776, 2776, + 2776, 2779, 2777, 2777, 2777, 2777, 2777, 2777, + 2777, 2777, 2777, 2777, 2777, 2777, 2777, 2777, + 2777, 2777, 2777, 2777, 2777, 2777, 2777, 2777, + 2777, 2777, 2777, 2780, 2777, 2777, 2777, 2777, + 2777, 2777, 2781, 2782, 203, 203, 2783, 2784, + 2785, 2786, 2787, 2788, 2789, 2790, 2791, 2792, + 2783, 2784, 2785, 2786, 2787, 2788, 2789, 2790, + 2791, 2792, 2783, 2784, 2785, 2786, 2787, 2788, + 2789, 2790, 2791, 2792, 2783, 2784, 2785, 2786, + 2787, 2788, 2789, 2790, 2791, 2792, 2783, 2784, + 2785, 2786, 2787, 2788, 2789, 2790, 2791, 2792, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, 2793, 2793, 2793, 2793, 2793, 2793, 2793, 2793, 2793, 2793, 2793, 2793, 2793, 2793, 2793, 2793, 2793, 2793, 2793, 2793, 2793, 2793, 2793, 2793, 2793, 2793, 2793, 2793, 2793, 2793, 2793, 2793, 2793, 2793, 2793, 2793, 2793, 2793, 2793, 2793, - 2793, 2793, 2793, 2793, 2794, 2794, 2794, 2794, - 2795, 2796, 2797, 2798, 2799, 2800, 2801, 2802, - 2803, 2804, 202, 202, 202, 202, 202, 2805, + 2793, 2793, 2793, 2793, 2793, 2793, 2793, 2793, + 2793, 2793, 2793, 2793, 2793, 2793, 2793, 2793, + 2793, 2793, 2793, 2793, 2793, 2793, 2793, 2793, + 2793, 2793, 2793, 2793, 2793, 2793, 2793, 2793, + 2793, 2793, 2793, 2793, 2793, 2793, 2793, 2793, + 2793, 2793, 2793, 2793, 2793, 2793, 2793, 2793, + 2793, 2793, 2793, 2793, 2793, 2793, 2793, 2793, + 2793, 2793, 2793, 2793, 2793, 2793, 2793, 2793, + 2793, 2793, 2793, 2793, 2793, 2793, 2793, 2793, + 2793, 2793, 2793, 2793, 2793, 2793, 2793, 2793, + 2793, 2793, 2793, 2793, 2793, 2793, 2793, 2793, + 2793, 2793, 2793, 2793, 2793, 2793, 2793, 2793, + 2793, 2793, 2793, 2793, 2793, 2793, 2793, 2793, + 2793, 2793, 2793, 2793, 2793, 2793, 2793, 2793, + 2793, 2793, 2793, 2793, 2793, 2793, 2793, 2793, + 2793, 2793, 2793, 2793, 2793, 2793, 2793, 2793, + 2793, 2793, 2793, 2793, 2793, 2793, 2793, 2793, + 2793, 2793, 2793, 2793, 2793, 2793, 2793, 2793, + 2793, 2793, 2793, 2793, 2793, 2793, 2793, 2793, + 2793, 2793, 2793, 2793, 2793, 2793, 2793, 2793, + 2793, 2793, 2793, 2793, 2793, 2793, 2793, 2793, + 2793, 2793, 2793, 2793, 2793, 2793, 2793, 2793, + 2793, 2793, 2793, 2793, 2793, 2793, 2793, 2793, + 2793, 2793, 2793, 2793, 2793, 2793, 2793, 2793, + 2793, 2793, 2793, 2793, 2793, 2793, 2793, 2793, + 2793, 2793, 2793, 2793, 2793, 2793, 2793, 2793, + 2793, 2793, 2793, 2793, 2793, 2793, 2793, 2793, - 2806, 2806, 2806, 2806, 2806, 2806, 2806, 2806, - 2806, 2806, 2806, 2806, 2806, 2806, 2806, 2806, - 2806, 2806, 2806, 2806, 2806, 2806, 2806, 2806, - 2806, 2806, 2806, 2806, 2806, 2806, 2806, 2806, - 2806, 2806, 2806, 2806, 2806, 2806, 2806, 2806, - 2806, 2806, 2806, 2806, 2806, 2806, 2806, 2806, - 2806, 2806, 2806, 2806, 2806, 2806, 2806, 2806, - 2806, 2806, 2806, 2806, 2806, 2806, 2806, 2806, - 2806, 2806, 2806, 2806, 2806, 2806, 2806, 2806, - 2806, 2806, 2806, 2806, 2806, 2806, 2806, 2806, - 2806, 2806, 2806, 2806, 2806, 2806, 2806, 2806, - 2806, 2806, 2806, 2806, 2806, 2806, 2806, 2806, - 2806, 2806, 2806, 2806, 2806, 2806, 2806, 2806, - 2806, 2806, 2806, 2806, 2806, 2806, 2806, 2806, - 2806, 2806, 2806, 2806, 2806, 2806, 2806, 2806, - 2806, 2806, 2806, 2806, 2806, 2806, 2806, 2806, - 2806, 2806, 2806, 2806, 2806, 2806, 2806, 2806, - 2806, 2806, 2806, 2806, 2806, 2806, 2806, 2806, - 2806, 2806, 2806, 2806, 2806, 2806, 2806, 2806, - 2806, 2806, 2806, 2806, 2806, 2806, 2806, 2806, - 2806, 2806, 2806, 2806, 2806, 2806, 2806, 2806, - 2806, 2806, 2806, 2806, 2806, 2806, 2806, 2806, - 2806, 2806, 2806, 2806, 2806, 2806, 2806, 2806, - 2806, 2806, 2806, 2806, 2806, 2806, 2806, 2806, - 2806, 2806, 2806, 2806, 2806, 301, 301, 2807, - 2807, 2807, 2807, 2807, 2807, 2807, 2807, 2807, - 2808, 2808, 2808, 2808, 2808, 2808, 2808, 301, - 301, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, + 2794, 2794, 2794, 2794, 2794, 2794, 2794, 2794, + 2794, 2794, 2794, 2794, 2794, 2794, 2794, 2794, + 2794, 2794, 2794, 2794, 2794, 2794, 2794, 2794, + 2794, 2794, 2794, 2794, 2794, 2794, 2794, 2794, + 2794, 2794, 2794, 2794, 2794, 2794, 2794, 2794, + 2794, 2794, 2794, 2794, 2794, 2794, 2794, 2794, + 2794, 2794, 2794, 2794, 2794, 2794, 2794, 2793, + 2793, 2793, 2793, 2794, 2794, 2794, 2794, 2794, + 2794, 2794, 2794, 2794, 2794, 2794, 2794, 2794, + 2794, 2794, 2794, 2794, 2794, 2794, 2794, 2794, + 2794, 2794, 2794, 2794, 2794, 2794, 2794, 2794, + 2794, 2794, 2794, 2794, 2794, 2794, 2794, 2794, + 2794, 2794, 2794, 2794, 2794, 2794, 2794, 2794, + 2794, 2794, 2794, 2794, 2794, 2793, 2793, 2793, + 2793, 2793, 2793, 2793, 2793, 2794, 2793, 2793, + 2793, 2793, 2793, 2793, 2793, 2793, 2793, 2793, + 2793, 2793, 2793, 2793, 2794, 2793, 2793, 2795, + 2796, 2795, 2795, 2797, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 2794, 2794, 2794, 2794, 2794, + 203, 2794, 2794, 2794, 2794, 2794, 2794, 2794, + 2794, 2794, 2794, 2794, 2794, 2794, 2794, 2794, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, - 2809, 2809, 2809, 2809, 2809, 2809, 2809, 2809, - 2809, 2809, 2809, 2809, 2809, 2809, 2809, 2809, - 2809, 2809, 2809, 2809, 2809, 2809, 2809, 2809, - 2809, 2809, 2809, 2809, 2809, 2809, 2809, 2809, - 2809, 2809, 2810, 2810, 2810, 2810, 2810, 2810, - 2810, 2810, 2810, 2810, 2810, 2810, 2810, 2810, - 2810, 2810, 2810, 2810, 2810, 2810, 2810, 2810, - 2810, 2810, 2810, 2810, 2810, 2810, 2810, 2810, - 2810, 2810, 2810, 2810, 2811, 2811, 2811, 2811, - 2811, 2811, 2812, 2813, 301, 301, 301, 301, - 2814, 2815, 2816, 2817, 2818, 2819, 2820, 2821, - 2822, 2823, 301, 301, 301, 301, 2824, 2824, - 301, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, + 2798, 2798, 2798, 2798, 2798, 2798, 2798, 203, + 2798, 2798, 2798, 2798, 2798, 2798, 2798, 2798, + 2798, 2798, 2798, 2798, 2798, 2798, 2798, 2798, + 2798, 203, 203, 2798, 2798, 2798, 2798, 2798, + 2798, 2798, 203, 2798, 2798, 203, 2798, 2798, + 2798, 2798, 2798, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, - 301, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, + 2799, 2799, 2799, 2799, 2799, 2799, 2799, 2799, + 2799, 2799, 2799, 2799, 2799, 2799, 2799, 2799, + 2799, 2799, 2799, 2799, 2799, 2799, 2799, 2799, + 2799, 2799, 2799, 2799, 2799, 2799, 2799, 2799, + 2799, 2799, 2799, 2799, 2799, 2799, 2799, 2799, + 2799, 2799, 2799, 2799, 2799, 203, 203, 203, + 2800, 2800, 2800, 2800, 2800, 2800, 2800, 2801, + 2801, 2801, 2801, 2801, 2801, 2801, 203, 203, + 2802, 2803, 2804, 2805, 2806, 2807, 2808, 2809, + 2810, 2811, 203, 203, 203, 203, 2799, 2812, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, - 301, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, - 301, 2825, 2825, 2825, 2825, 2825, 2825, 2825, - 2825, 2825, 2825, 2825, 2825, 2825, 2825, 2825, - 2825, 2825, 2825, 2825, 2825, 2825, 2825, 2825, - 2825, 2825, 2825, 2825, 2825, 2825, 2825, 2825, - 2825, 2825, 2825, 2825, 2825, 2825, 2825, 2825, - 2825, 2825, 2825, 2825, 2825, 2825, 2825, 2825, - 2825, 2825, 2825, 2825, 2825, 2825, 2825, 2825, - 2825, 2825, 2825, 2825, 2826, 2825, 2825, 2825, - 2827, 2825, 2825, 2825, 2825, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, + 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, + 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, + 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, + 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, + 2813, 2813, 2813, 2813, 2814, 2814, 2814, 2814, + 2815, 2816, 2817, 2818, 2819, 2820, 2821, 2822, + 2823, 2824, 203, 203, 203, 203, 203, 2825, - 301, 2828, 2828, 2828, 2828, 2828, 2828, 2828, - 2828, 2828, 2828, 2828, 2828, 2828, 2828, 2828, - 2828, 2828, 2828, 2828, 2828, 2828, 2828, 2828, - 2828, 2828, 2828, 2828, 2828, 2828, 2828, 2828, - 2828, 2828, 2828, 2828, 2828, 2828, 2828, 2828, - 2828, 2828, 2828, 2828, 2828, 2828, 2829, 2828, - 2828, 2828, 2828, 2828, 2828, 2828, 2828, 2828, - 2828, 2828, 2828, 2828, 2828, 2828, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, + 2826, 2826, 2826, 2826, 2826, 2826, 2826, 2826, + 2826, 2826, 2826, 2826, 2826, 2826, 2826, 2826, + 2826, 2826, 2826, 2826, 2826, 2826, 2826, 2826, + 2826, 2826, 2826, 2826, 2826, 2826, 2826, 2826, + 2826, 2826, 2826, 2826, 2826, 2826, 2826, 2826, + 2826, 2826, 2826, 2826, 2826, 2826, 2826, 2826, + 2826, 2826, 2826, 2826, 2826, 2826, 2826, 2826, + 2826, 2826, 2826, 2826, 2826, 2826, 2826, 2826, + 2826, 2826, 2826, 2826, 2826, 2826, 2826, 2826, + 2826, 2826, 2826, 2826, 2826, 2826, 2826, 2826, + 2826, 2826, 2826, 2826, 2826, 2826, 2826, 2826, + 2826, 2826, 2826, 2826, 2826, 2826, 2826, 2826, + 2826, 2826, 2826, 2826, 2826, 2826, 2826, 2826, + 2826, 2826, 2826, 2826, 2826, 2826, 2826, 2826, + 2826, 2826, 2826, 2826, 2826, 2826, 2826, 2826, + 2826, 2826, 2826, 2826, 2826, 2826, 2826, 2826, + 2826, 2826, 2826, 2826, 2826, 2826, 2826, 2826, + 2826, 2826, 2826, 2826, 2826, 2826, 2826, 2826, + 2826, 2826, 2826, 2826, 2826, 2826, 2826, 2826, + 2826, 2826, 2826, 2826, 2826, 2826, 2826, 2826, + 2826, 2826, 2826, 2826, 2826, 2826, 2826, 2826, + 2826, 2826, 2826, 2826, 2826, 2826, 2826, 2826, + 2826, 2826, 2826, 2826, 2826, 2826, 2826, 2826, + 2826, 2826, 2826, 2826, 2826, 2826, 2826, 2826, + 2826, 2826, 2826, 2826, 2826, 302, 302, 2827, + 2827, 2827, 2827, 2827, 2827, 2827, 2827, 2827, + 2828, 2828, 2828, 2828, 2828, 2828, 2828, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, - 2830, 2830, 2830, 2830, 348, 2830, 2830, 2830, + 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, + 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, + 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, + 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, + 2829, 2829, 2830, 2830, 2830, 2830, 2830, 2830, 2830, 2830, 2830, 2830, 2830, 2830, 2830, 2830, 2830, 2830, 2830, 2830, 2830, 2830, 2830, 2830, 2830, 2830, 2830, 2830, 2830, 2830, 2830, 2830, - 348, 2830, 2830, 348, 2830, 348, 348, 2830, - 348, 2830, 2830, 2830, 2830, 2830, 2830, 2830, - 2830, 2830, 2830, 348, 2830, 2830, 2830, 2830, - 348, 2830, 348, 2830, 348, 348, 348, 348, - 348, 348, 2830, 348, 348, 348, 348, 2830, - 348, 2830, 348, 2830, 348, 2830, 2830, 2830, - 348, 2830, 2830, 348, 2830, 348, 348, 2830, - 348, 2830, 348, 2830, 348, 2830, 348, 2830, - 348, 2830, 2830, 348, 2830, 348, 348, 2830, - 2830, 2830, 2830, 348, 2830, 2830, 2830, 2830, - 2830, 2830, 2830, 348, 2830, 2830, 2830, 2830, - 348, 2830, 2830, 2830, 2830, 348, 2830, 348, - 2830, 2830, 2830, 2830, 2830, 2830, 2830, 2830, - 2830, 2830, 348, 2830, 2830, 2830, 2830, 2830, - 2830, 2830, 2830, 2830, 2830, 2830, 2830, 2830, - 2830, 2830, 2830, 2830, 348, 348, 348, 348, - 348, 2830, 2830, 2830, 348, 2830, 2830, 2830, - 2830, 2830, 348, 2830, 2830, 2830, 2830, 2830, - 2830, 2830, 2830, 2830, 2830, 2830, 2830, 2830, - 2830, 2830, 2830, 2830, 348, 348, 348, 348, - 348, 348, 348, 348, 348, 348, 348, 348, - 348, 348, 348, 348, 348, 348, 348, 348, - 348, 348, 348, 348, 348, 348, 348, 348, - 348, 348, 348, 348, 348, 348, 348, 348, - 348, 348, 348, 348, 348, 348, 348, 348, - 348, 348, 348, 348, 348, 348, 348, 348, - 2831, 2831, 348, 348, 348, 348, 348, 348, - 348, 348, 348, 348, 348, 348, 348, 348, + 2830, 2830, 2830, 2830, 2831, 2831, 2831, 2831, + 2831, 2831, 2832, 2833, 302, 302, 302, 302, + 2834, 2835, 2836, 2837, 2838, 2839, 2840, 2841, + 2842, 2843, 302, 302, 302, 302, 2844, 2844, + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, - 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, - 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, - 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, - 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, - 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, - 1546, 1546, 1546, 1546, 1733, 1733, 1733, 1733, - 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, - 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, - 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, - 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, - 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, - 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, - 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, - 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, - 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, - 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, - 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, - 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, - 1546, 1546, 1546, 1546, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, - 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1733, - 1733, 1511, 1511, 1511, 1511, 1511, 1511, 1511, - 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1548, - 1733, 1511, 1511, 1511, 1511, 1511, 1511, 1511, - 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, - 1733, 1511, 1511, 1511, 1511, 1511, 1511, 1511, - 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, - 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, - 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, - 1548, 1548, 1548, 1548, 1548, 1548, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, - 2832, 2832, 2833, 2834, 2835, 2836, 2837, 2838, - 2839, 2840, 2841, 2842, 2842, 2843, 2843, 2843, - 2844, 2844, 2844, 2844, 2844, 2844, 2844, 2844, - 2844, 2844, 2844, 2844, 2844, 2844, 2844, 2844, - 2844, 2844, 2844, 2844, 2844, 2844, 2844, 2844, - 2844, 2844, 2844, 2844, 2844, 2844, 2844, 1597, - 2845, 2846, 2845, 2845, 2845, 2845, 2845, 2845, - 2845, 2845, 2845, 2845, 2845, 2846, 2845, 2846, - 2845, 2845, 2846, 2845, 2845, 2845, 2846, 2845, - 2845, 2845, 2844, 2844, 2844, 2844, 2844, 2847, - 2848, 2848, 2848, 2848, 2848, 2848, 2848, 2849, - 2848, 2848, 2848, 2848, 2848, 2848, 2848, 2849, + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 2845, 2845, 2845, 2845, 2845, 2845, 2845, + 2845, 2845, 2845, 2845, 2845, 2845, 2845, 2845, + 2845, 2845, 2845, 2845, 2845, 2845, 2845, 2845, + 2845, 2845, 2845, 2845, 2845, 2845, 2845, 2845, + 2845, 2845, 2845, 2845, 2845, 2845, 2845, 2845, + 2845, 2845, 2845, 2845, 2845, 2845, 2845, 2845, + 2845, 2845, 2845, 2845, 2845, 2845, 2845, 2845, + 2845, 2845, 2845, 2845, 2846, 2845, 2845, 2845, + 2847, 2845, 2845, 2845, 2845, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + + 302, 2848, 2848, 2848, 2848, 2848, 2848, 2848, 2848, 2848, 2848, 2848, 2848, 2848, 2848, 2848, - 2848, 2848, 2850, 2850, 2851, 2843, 2843, 2843, 2848, 2848, 2848, 2848, 2848, 2848, 2848, 2848, - 2848, 2849, 2848, 2849, 2849, 2848, 2848, 2849, 2848, 2848, 2848, 2848, 2848, 2848, 2848, 2848, - 2848, 2848, 813, 813, 813, 813, 2852, 2852, - 2844, 2852, 2852, 2852, 2852, 2852, 2852, 2852, - 2852, 2852, 2852, 2853, 2853, 2853, 2853, 2853, - 2853, 2853, 2853, 2853, 2853, 2853, 2853, 2853, - 2853, 2853, 2853, 2853, 2853, 2843, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 2854, 2854, - 2854, 2854, 2854, 2854, 2854, 2854, 2854, 2854, - 2854, 2854, 2854, 2854, 2854, 2854, 2854, 2854, - 2854, 2854, 2854, 2854, 2854, 2854, 2854, 2854, + 2848, 2848, 2848, 2848, 2848, 2848, 2848, 2848, + 2848, 2848, 2848, 2848, 2848, 2848, 2849, 2848, + 2848, 2848, 2848, 2848, 2848, 2848, 2848, 2848, + 2848, 2848, 2848, 2848, 2848, 2848, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, - 2855, 2856, 2856, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, - 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, - 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, - 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, - 1716, 1716, 2856, 2856, 2856, 2856, 2856, 2856, - 2856, 2856, 2856, 2857, 1733, 1733, 1733, 1733, - 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, - 1716, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 2856, 2856, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 2858, 2858, 2858, 2858, 2858, 2858, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, + 2850, 2850, 2850, 2850, 349, 2850, 2850, 2850, + 2850, 2850, 2850, 2850, 2850, 2850, 2850, 2850, + 2850, 2850, 2850, 2850, 2850, 2850, 2850, 2850, + 2850, 2850, 2850, 2850, 2850, 2850, 2850, 2850, + 349, 2850, 2850, 349, 2850, 349, 349, 2850, + 349, 2850, 2850, 2850, 2850, 2850, 2850, 2850, + 2850, 2850, 2850, 349, 2850, 2850, 2850, 2850, + 349, 2850, 349, 2850, 349, 349, 349, 349, + 349, 349, 2850, 349, 349, 349, 349, 2850, + 349, 2850, 349, 2850, 349, 2850, 2850, 2850, + 349, 2850, 2850, 349, 2850, 349, 349, 2850, + 349, 2850, 349, 2850, 349, 2850, 349, 2850, + 349, 2850, 2850, 349, 2850, 349, 349, 2850, + 2850, 2850, 2850, 349, 2850, 2850, 2850, 2850, + 2850, 2850, 2850, 349, 2850, 2850, 2850, 2850, + 349, 2850, 2850, 2850, 2850, 349, 2850, 349, + 2850, 2850, 2850, 2850, 2850, 2850, 2850, 2850, + 2850, 2850, 349, 2850, 2850, 2850, 2850, 2850, + 2850, 2850, 2850, 2850, 2850, 2850, 2850, 2850, + 2850, 2850, 2850, 2850, 349, 349, 349, 349, + 349, 2850, 2850, 2850, 349, 2850, 2850, 2850, + 2850, 2850, 349, 2850, 2850, 2850, 2850, 2850, + 2850, 2850, 2850, 2850, 2850, 2850, 2850, 2850, + 2850, 2850, 2850, 2850, 349, 349, 349, 349, + 349, 349, 349, 349, 349, 349, 349, 349, + 349, 349, 349, 349, 349, 349, 349, 349, + 349, 349, 349, 349, 349, 349, 349, 349, + 349, 349, 349, 349, 349, 349, 349, 349, + 349, 349, 349, 349, 349, 349, 349, 349, + 349, 349, 349, 349, 349, 349, 349, 349, + 2851, 2851, 349, 349, 349, 349, 349, 349, + 349, 349, 349, 349, 349, 349, 349, 349, - 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, - 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, - 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, - 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, - 1511, 1548, 1548, 1548, 1548, 1548, 1548, 1548, - 1548, 1548, 1548, 1548, 1548, 2859, 2859, 2859, - 1511, 1511, 1511, 1511, 1511, 1511, 1548, 1511, - 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, - 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, - 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, - 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, - 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, - 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, - 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, - 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, - 1511, 1511, 1511, 1511, 1511, 1548, 2859, 2859, - 1511, 1511, 1511, 1511, 1511, 1549, 1511, 1511, - 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, - 1511, 1511, 1511, 1511, 1548, 1548, 1548, 1548, - 1548, 1548, 1548, 1548, 1512, 1512, 1548, 1548, - 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, - 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, - 1511, 1511, 1511, 1511, 1511, 1510, 1510, 1511, - 1511, 1511, 1511, 1511, 1510, 1511, 1511, 1511, - 1511, 1511, 1549, 1549, 1549, 1548, 1511, 1549, - 1511, 1511, 1549, 2860, 2860, 1548, 1548, 2859, - 2859, 2859, 2859, 2859, 1548, 1548, 1548, 1548, - 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, - 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, - 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, - 1511, 1548, 1548, 1548, 1548, 1548, 1548, 1548, - 2859, 2859, 2859, 2861, 2861, 2861, 2861, 2861, + 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, + 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, + 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, + 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, + 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, + 1559, 1559, 1559, 1559, 2852, 2852, 2852, 2852, + 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, + 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, + 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, + 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, + 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, + 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, + 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, + 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, + 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, + 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, + 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, + 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, + 1559, 1559, 1559, 1559, 2852, 2852, 2852, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, + 1517, 1517, 1517, 1517, 1517, 1517, 1517, 2852, + 2852, 1517, 1517, 1517, 1517, 1517, 1517, 1517, + 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1561, + 2852, 1517, 1517, 1517, 1517, 1517, 1517, 1517, + 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, + 2852, 1517, 1517, 1517, 1517, 1517, 1517, 1517, + 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, + 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, + 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, + 1561, 1561, 1561, 1561, 1561, 1561, 2852, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, - 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, - 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, - 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, - 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, - 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, - 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, - 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, - 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1548, - 1511, 1548, 1549, 1549, 1511, 1511, 1549, 1549, - 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, - 1549, 1511, 1511, 1511, 1511, 1511, 1511, 1511, - 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, - 1511, 1511, 1511, 1511, 1511, 1511, 1549, 1549, - 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, - 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, - 1549, 1511, 1511, 1511, 1549, 1511, 1511, 1511, - 1511, 1549, 1549, 1549, 1511, 1549, 1549, 1549, - 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1549, - 1511, 1549, 1511, 1511, 1511, 1511, 1511, 1511, - 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, - 1510, 1511, 1510, 1511, 1510, 1511, 1511, 1511, - 1511, 1511, 1549, 1511, 1511, 1511, 1511, 1510, - 1511, 1510, 1510, 1511, 1511, 1511, 1511, 1511, - 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, - 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, - 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, - 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, - 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, - 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, - 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, - 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, - 1548, 1511, 1511, 1511, 1511, 1548, 1548, 2859, + 2853, 2853, 2854, 2855, 2856, 2857, 2858, 2859, + 2860, 2861, 2862, 2863, 2863, 2864, 2864, 2864, + 2865, 2865, 2865, 2865, 2865, 2865, 2865, 2865, + 2865, 2865, 2865, 2865, 2865, 2865, 2865, 2865, + 2865, 2865, 2865, 2865, 2865, 2865, 2865, 2865, + 2865, 2865, 2865, 2865, 2865, 2865, 2865, 2866, + 2867, 2868, 2867, 2867, 2867, 2867, 2867, 2867, + 2867, 2867, 2867, 2867, 2867, 2868, 2867, 2868, + 2867, 2867, 2868, 2867, 2867, 2867, 2868, 2867, + 2867, 2867, 2865, 2865, 2865, 2865, 2865, 2869, + 2870, 2870, 2870, 2870, 2870, 2870, 2870, 2871, + 2870, 2870, 2870, 2870, 2870, 2870, 2870, 2871, + 2870, 2870, 2870, 2870, 2870, 2870, 2870, 2870, + 2870, 2870, 2872, 2872, 2873, 2864, 2864, 2864, + 2874, 2874, 2870, 2870, 2870, 2870, 2870, 2870, + 2870, 2871, 2870, 2871, 2871, 2870, 2874, 2875, + 2870, 2870, 2870, 2870, 2870, 2870, 2870, 2870, + 2870, 2870, 814, 814, 814, 814, 2876, 2877, + 2865, 2876, 2876, 2876, 2876, 2876, 2876, 2876, + 2876, 2876, 2876, 2878, 2878, 2878, 2878, 2878, + 2878, 2878, 2878, 2878, 2878, 2878, 2878, 2878, + 2878, 2878, 2878, 2878, 2878, 2864, 2852, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2879, 2879, + 2879, 2879, 2879, 2879, 2879, 2879, 2879, 2879, + 2879, 2879, 2879, 2879, 2879, 2879, 2879, 2879, + 2879, 2879, 2879, 2879, 2879, 2879, 2879, 2879, - 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1511, - 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, - 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1510, - 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, - 1510, 1510, 1510, 1510, 1510, 1511, 1511, 1511, - 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, - 1511, 1511, 1510, 1510, 1510, 1510, 1510, 1510, - 1510, 1510, 1510, 1510, 1510, 1510, 1512, 1512, - 2862, 2862, 2862, 2862, 1512, 1512, 1512, 1512, - 1512, 1512, 1548, 2859, 2859, 2859, 2859, 2859, - 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, - 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, - 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, - 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, - 1548, 1548, 1548, 1548, 2860, 2860, 1548, 1548, - 1548, 1548, 2863, 1548, 1548, 1548, 1548, 1548, - 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, - 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, - 2860, 1548, 1548, 1548, 1548, 2860, 2860, 1548, - 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, - 1548, 1548, 1548, 1548, 2864, 1548, 1548, 1548, - 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, - 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, - 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, - 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, - 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, - 1548, 1548, 1548, 1548, 1512, 1512, 1512, 1512, - 1512, 1512, 1512, 1512, 1548, 1548, 1548, 1548, - 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, - 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, - 1548, 1548, 1548, 1548, 1512, 1512, 1512, 1512, - 1512, 1512, 1548, 1511, 1511, 1511, 1511, 1511, + 2880, 2881, 2881, 2852, 2852, 2852, 2852, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, + 1734, 1734, 2882, 1734, 1734, 1734, 1734, 1734, + 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, + 1734, 1734, 1734, 1734, 1734, 1734, 1734, 2882, + 1734, 1734, 2881, 2881, 2881, 2881, 2881, 2881, + 2881, 2881, 2881, 2883, 2852, 2852, 2852, 2852, + 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, + 1734, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 2881, 2881, 2852, 2852, 2852, 2852, 2852, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 2884, 2884, 2884, 2884, 2884, 2884, 2852, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, - 2865, 1511, 1511, 1511, 1511, 1511, 1511, 1511, - 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, - 1511, 2865, 1511, 1511, 1511, 2865, 1511, 2865, - 1511, 2865, 1511, 2865, 1511, 1511, 1511, 2865, - 1511, 1511, 1511, 1511, 1511, 1511, 2865, 2865, - 1511, 1511, 1511, 1511, 2865, 1511, 2865, 2865, - 1511, 1511, 1511, 1511, 2865, 1511, 1511, 1511, - 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, - 1511, 1548, 1548, 2859, 2859, 1549, 1549, 1549, - 1511, 1511, 1511, 1549, 1549, 1549, 1549, 1549, - 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, - 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, - 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, - 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, - 1512, 1512, 1512, 1512, 1512, 1512, 2866, 2866, - 2866, 2867, 2867, 2867, 1512, 1512, 1512, 1512, - 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, - 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, - 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, - 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, - 1511, 1511, 1511, 1549, 1511, 1511, 1511, 1511, - 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, - 1511, 1511, 1511, 1511, 1549, 1549, 1549, 1511, - 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, - 1549, 1511, 1511, 1511, 1511, 1511, 1548, 1548, - 1548, 1548, 1548, 1548, 2860, 1548, 1548, 1548, - 2859, 2864, 2864, 2858, 2858, 2868, 2843, 2843, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, - 1548, 1548, 1548, 1548, 1548, 1733, 1733, 1733, - 1548, 1548, 1548, 1548, 2864, 2864, 2864, 2858, - 2858, 2869, 2868, 2843, 2843, 1733, 1733, 1733, + 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, + 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, + 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, + 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, + 1517, 1561, 1561, 1561, 1561, 1561, 1561, 1561, + 1561, 1561, 1561, 1561, 1561, 2885, 2885, 2885, + 1517, 1517, 1517, 1517, 1517, 1517, 1561, 1517, + 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, + 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, + 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, + 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, + 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, + 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, + 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, + 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, + 1517, 1517, 1517, 1517, 1517, 1561, 2885, 2885, + 1517, 1517, 1517, 1517, 1517, 1562, 1517, 1517, + 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, + 1517, 1517, 1517, 1517, 1561, 1561, 1561, 1561, + 1561, 1561, 1561, 1561, 1519, 1519, 1561, 1561, + 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, + 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, + 1517, 1517, 1517, 1517, 1517, 1516, 1516, 1517, + 1517, 1517, 1517, 1517, 1516, 1517, 1517, 1517, + 1517, 1517, 1562, 1562, 1562, 1561, 1517, 1562, + 1517, 1517, 1562, 2886, 2886, 1561, 1561, 2885, + 2885, 2885, 2885, 2885, 1561, 1561, 1561, 1561, + 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, + 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, + 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, + 1517, 1561, 1561, 1561, 1561, 1561, 1561, 1561, + 2885, 2885, 2885, 2887, 2887, 2887, 2887, 2887, - 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, - 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, - 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, - 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, - 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, - 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, - 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, - 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, - 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, - 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, - 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, - 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, - 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, - 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, - 1510, 1510, 1510, 1510, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, - 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, - 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, - 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, - 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, - 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, - 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, - 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, - 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, - 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, - 1512, 1512, 1512, 1512, 1512, 2869, 2869, 2869, - 2869, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868, - 2868, 2868, 2868, 2868, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, + 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, + 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, + 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, + 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, + 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, + 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, + 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, + 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1561, + 1517, 1561, 1562, 1562, 1517, 1517, 1562, 1562, + 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, + 1562, 1517, 1517, 1517, 1517, 1517, 1517, 1517, + 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, + 1517, 1517, 1517, 1517, 1517, 1517, 1562, 1562, + 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, + 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, + 1562, 1517, 1517, 1517, 1562, 1517, 1517, 1517, + 1517, 1562, 1562, 1562, 1517, 1562, 1562, 1562, + 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1562, + 1517, 1562, 1517, 1517, 1517, 1517, 1517, 1517, + 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, + 1516, 1517, 1516, 1517, 1516, 1517, 1517, 1517, + 1517, 1517, 1562, 1517, 1517, 1517, 1517, 1516, + 1517, 1516, 1516, 1517, 1517, 1517, 1517, 1517, + 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, + 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, + 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, + 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, + 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, + 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, + 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, + 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, + 1561, 1517, 1517, 1517, 1517, 1561, 1561, 2885, - 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, - 1512, 1512, 1512, 1512, 1733, 1733, 1733, 1733, - 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, - 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, - 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, - 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, - 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, - 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, - 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, - 1512, 1512, 1733, 1733, 1733, 1733, 1733, 1733, - 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, - 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, - 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, - 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, - 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, - 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, - 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, - 1512, 1512, 1512, 1512, 1512, 1512, 1733, 1733, - 2843, 2843, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, + 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1517, + 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, + 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1516, + 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, + 1516, 1516, 1516, 1516, 1516, 1517, 1517, 1517, + 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, + 1517, 1517, 1516, 1516, 1516, 1516, 1516, 1516, + 1516, 1516, 1516, 1516, 1516, 1516, 1518, 1518, + 2888, 2888, 2888, 2888, 1518, 1518, 1519, 1519, + 1519, 1519, 1561, 2885, 2885, 2885, 2885, 2885, + 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, + 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, + 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, + 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, + 1561, 1561, 1561, 1561, 2886, 2886, 1561, 1561, + 1561, 1561, 2889, 1561, 1561, 1561, 1561, 1561, + 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, + 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, + 2886, 1561, 1561, 1561, 1561, 2886, 2886, 1561, + 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, + 1561, 1561, 1561, 1561, 2890, 1561, 1561, 1561, + 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, + 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, + 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, + 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, + 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, + 1561, 1561, 1561, 1561, 1519, 1519, 1519, 1519, + 1519, 1519, 1519, 1519, 1561, 1561, 1561, 1561, + 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, + 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, + 1561, 1561, 1561, 1561, 1519, 1519, 1519, 1519, + 1519, 1519, 1561, 1517, 1517, 1517, 1517, 1517, - 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, - 1514, 1514, 1514, 1514, 2870, 2868, 2868, 2871, - 2859, 2859, 2859, 2859, 2859, 2859, 2859, 2859, - 2872, 2863, 2863, 2863, 2863, 2863, 2863, 2873, - 2864, 2864, 2864, 2864, 2864, 2864, 2863, 2864, - 2858, 2858, 2858, 2858, 2858, 2858, 2858, 2858, - 2863, 2873, 2873, 2863, 2863, 2863, 2863, 2863, - 2863, 2863, 2864, 2864, 2863, 2863, 2863, 2868, + 2891, 1517, 1517, 1517, 1517, 1517, 1517, 1517, + 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, + 1517, 2891, 1517, 1517, 1517, 2891, 1517, 2891, + 1517, 2891, 1517, 2891, 1517, 1517, 1517, 2891, + 1517, 1517, 1517, 1517, 1517, 1517, 2891, 2891, + 1517, 1517, 1517, 1517, 2891, 1517, 2891, 2891, + 1517, 1517, 1517, 1517, 2891, 1517, 1517, 1517, + 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, + 1517, 1561, 1561, 2885, 2885, 1562, 1562, 1562, + 1517, 1517, 1517, 1562, 1562, 1562, 1562, 1562, + 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, + 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, + 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, + 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, + 1518, 1518, 1518, 1518, 1518, 1518, 2892, 2892, + 2892, 2893, 2893, 2893, 1518, 1518, 1518, 1518, + 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, + 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, + 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, + 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, + 1517, 1517, 1517, 1562, 1517, 1517, 1517, 1517, + 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, + 1517, 1517, 1517, 1517, 1562, 1562, 1562, 1517, + 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, + 1562, 1517, 1517, 1517, 1517, 1517, 1561, 1561, + 1561, 1561, 1561, 1561, 2886, 1561, 1561, 1561, + 2885, 2890, 2890, 2884, 2884, 2894, 2864, 2864, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, + 1561, 1561, 1561, 1561, 1561, 2852, 2852, 2852, + 1561, 1561, 1561, 1561, 2890, 2890, 2890, 2884, + 2884, 2895, 2894, 2864, 2864, 2852, 2852, 2852, + + 2896, 2896, 2896, 2896, 2896, 2896, 2896, 2896, + 2896, 2896, 2896, 2896, 2896, 2896, 2896, 2896, + 2896, 2896, 2896, 2896, 2896, 2896, 2896, 2896, + 2896, 2896, 2896, 2896, 2896, 2896, 2896, 2896, + 2896, 2896, 2896, 2896, 2896, 2896, 2896, 2896, + 2896, 2896, 2896, 2896, 2896, 2896, 2896, 2896, + 2896, 2896, 2896, 2896, 2896, 2896, 2896, 2896, + 2896, 2896, 2896, 2896, 2896, 2896, 2896, 2896, + 2896, 2896, 2896, 2896, 2896, 2896, 2896, 2896, + 2896, 2896, 2896, 2896, 2896, 2896, 2896, 2896, + 2896, 2896, 2896, 2896, 2896, 2896, 2896, 2896, + 2896, 2896, 2896, 2896, 2896, 2896, 2896, 2896, + 2896, 2896, 2896, 2896, 2896, 2896, 2896, 2896, + 2896, 2896, 2896, 2896, 2896, 2896, 2896, 2896, + 2896, 2896, 2896, 2896, 2852, 2852, 2852, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, + 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, + 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, + 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, + 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, + 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, + 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, + 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, + 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, + 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, + 1518, 1518, 1518, 1518, 1518, 2895, 2895, 2895, + 2895, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 2894, 2894, 2894, 2894, 2894, 2894, 2894, 2894, + 2894, 2894, 2894, 2894, 2852, 2852, 2852, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + + 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, + 1518, 1518, 1518, 1518, 2852, 2852, 2852, 2852, + 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, + 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, + 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, + 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, + 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, + 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, + 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, + 1518, 1518, 2852, 2852, 2852, 2852, 2852, 2852, + 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, + 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, + 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, + 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, + 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, + 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, + 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, + 1518, 1518, 1518, 1518, 1518, 1518, 2852, 2852, + 2864, 2864, 2852, 2852, 2852, 2852, 2852, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + + 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, + 1521, 1521, 1521, 1521, 2897, 2894, 2894, 2898, + 2885, 2885, 2885, 2885, 2885, 2885, 2885, 2885, + 2899, 2889, 2889, 2889, 2889, 2889, 2889, 2900, + 2890, 2890, 2890, 2890, 2890, 2890, 2889, 2890, + 2884, 2884, 2884, 2884, 2884, 2884, 2884, 2884, + 2889, 2900, 2900, 2889, 2889, 2889, 2889, 2889, + 2889, 2889, 2890, 2901, 2889, 2889, 2889, 2894, + 2890, 2890, 2890, 2890, 2890, 2890, 2901, 2890, + 2890, 2890, 2890, 2890, 2884, 2895, 2895, 2895, + 2890, 2890, 2890, 2890, 2890, 2890, 2890, 2890, + 2890, 2890, 2890, 2890, 2890, 2890, 2890, 2884, + 2884, 2884, 2884, 2884, 2884, 2884, 2884, 2884, + 2884, 2884, 2884, 2884, 2895, 2895, 2895, 2895, + 2895, 2894, 2864, 2895, 2895, 2895, 2895, 2897, + 2864, 2852, 2895, 2894, 2895, 2895, 2895, 2895, + 2885, 2885, 2885, 2885, 2885, 2890, 2890, 2890, + 2890, 2890, 2890, 2890, 2890, 2890, 2890, 2890, + 2890, 2890, 2884, 2884, 2884, 2884, 2884, 2884, + 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, + 2895, 2895, 2895, 2864, 2864, 2894, 2894, 2894, + 2894, 2894, 2894, 2864, 2864, 2864, 2894, 2894, + 2895, 2895, 2895, 2895, 2895, 2902, 2902, 2895, + 2902, 2902, 2894, 2898, 2894, 2894, 2894, 2894, + 2885, 2895, 2895, 2894, 2894, 2894, 2894, 2894, + 2894, 2894, 2894, 2864, 2852, 2898, 2898, 2898, + 2884, 2900, 2900, 2900, 2900, 2900, 2900, 2900, + 2900, 2900, 2900, 2900, 2900, 2900, 2884, 2884, + 2884, 2884, 2884, 2884, 2884, 2884, 2884, 2895, + 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, + 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, + 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, + + 2903, 2903, 2903, 2903, 2903, 2903, 2903, 2903, + 2903, 2903, 2903, 2903, 2903, 2903, 2903, 2903, + 2903, 2903, 2903, 2903, 2903, 2903, 2903, 2903, + 2903, 2903, 2903, 2903, 2903, 2903, 2903, 2903, + 2903, 2903, 2903, 2903, 2903, 2903, 2903, 2903, + 2903, 2903, 2903, 2903, 2903, 2903, 2903, 2903, + 2903, 2903, 2903, 2903, 2903, 2903, 2903, 2903, + 2903, 2903, 2903, 2903, 2903, 2903, 2903, 2903, + 2903, 2903, 2903, 2903, 2903, 2903, 2903, 2903, + 2903, 2903, 2903, 2903, 2903, 2903, 2903, 2903, + 2903, 2903, 2903, 2903, 2852, 2852, 2852, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, + 2895, 2895, 2895, 2895, 2895, 2895, 2852, 2852, + 2894, 2894, 2894, 2894, 2864, 2852, 2852, 2852, + 2894, 2894, 2894, 2852, 2852, 2852, 2852, 2852, + 2894, 2894, 2894, 2864, 2864, 2864, 2864, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 2894, 2894, 2894, 2894, 2894, 2894, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, - 2864, 2864, 2864, 2864, 2858, 2869, 2869, 2869, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, - 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2858, - 2858, 2858, 2858, 2858, 2858, 2858, 2858, 2858, - 2858, 2858, 2858, 2858, 2869, 2869, 2869, 2869, - 2869, 2868, 2843, 2869, 2869, 2869, 2869, 2870, - 2843, 1733, 2869, 2868, 2869, 2869, 2869, 2869, - 2859, 2859, 2859, 2859, 2859, 2864, 2864, 2864, - 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, - 2864, 2864, 2858, 2858, 2858, 2858, 2858, 2858, - 2869, 2869, 2869, 2869, 2869, 2869, 2869, 2869, - 2869, 2869, 2869, 2843, 2843, 2868, 2868, 2868, - 2868, 2868, 2868, 2843, 2843, 2843, 2868, 2868, - 2869, 2869, 2869, 2869, 2869, 2874, 2874, 2869, - 2874, 2874, 2868, 2871, 2868, 2868, 2868, 2868, - 2859, 2869, 2869, 2868, 2868, 2868, 2868, 2868, - 2868, 2868, 2868, 2843, 1733, 2871, 2871, 2871, - 2858, 2873, 2873, 2873, 2873, 2873, 2873, 2873, - 2873, 2873, 2873, 2873, 2873, 2873, 2858, 2858, - 2858, 2858, 2858, 2858, 2858, 2858, 2858, 2869, - 2869, 2869, 2869, 2869, 2869, 2869, 2869, 2869, - 2869, 2869, 2869, 2869, 2869, 2869, 2869, 2869, - 2869, 2869, 2869, 2869, 2869, 2869, 2869, 2869, + 2864, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 2864, 2864, 2864, 2852, 2852, 2852, 2852, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, - 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, - 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, - 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, - 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, - 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, - 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, - 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, - 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, - 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, - 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, - 1598, 1598, 1598, 1598, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 2869, 2869, 2869, 2869, 2869, 2869, 2869, 2869, - 2869, 2869, 2869, 2869, 2869, 2869, 1733, 1733, - 2868, 2868, 2868, 2868, 2843, 1733, 1733, 1733, - 2868, 2868, 2868, 1733, 1733, 1733, 1733, 1733, - 2868, 2868, 2868, 2843, 2843, 2843, 2843, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 2868, 2868, 2868, 2868, 2868, 2868, 2843, 2843, - 2843, 2843, 2843, 2843, 2843, 2843, 2843, 2843, - 2843, 2843, 2843, 2843, 2843, 2843, 2843, 2843, - 2843, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 2843, 2843, 2843, 2843, 2843, 2843, 2843, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 2843, 2843, 2843, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 2843, 2843, 2843, 2843, 2843, 2843, 2843, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, + 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, + 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, + 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, + 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, + 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, + 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, + 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, + 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, + 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, + 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, + 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, + 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, + 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, + 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, + 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, + 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, + 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, + 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, + 1611, 1611, 1611, 203, 1611, 1611, 1611, 1611, + 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, + 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, + 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, + 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, + 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, + 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, + 1611, 1611, 1611, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 2904, 2905, 2906, 2907, 2908, 2909, 2910, 2911, + 2912, 2913, 203, 203, 203, 203, 203, 203, - 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, - 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, - 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, - 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, - 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, - 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, - 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, - 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, - 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, - 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, - 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, - 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, - 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, - 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, - 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, - 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, - 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, - 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, - 1596, 1596, 1596, 202, 1596, 1596, 1596, 1596, - 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, - 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, - 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, - 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, - 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, - 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, - 1596, 1596, 1596, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 2875, 2876, 2877, 2878, 2879, 2880, 2881, 2882, - 2883, 2884, 202, 202, 202, 202, 202, 202, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 2852, 2852, 2852, 2852, 2852, 2852, 2914, 2914, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 2885, 2885, + 2915, 2915, 2915, 2915, 2915, 2915, 2915, 2915, + 2915, 2915, 2915, 2915, 2915, 2915, 2915, 2915, + 2915, 2915, 2915, 2915, 2915, 2915, 2915, 2915, + 2915, 2915, 2915, 2915, 2915, 2915, 2915, 2915, + 2915, 2915, 2915, 2915, 2915, 2915, 2915, 2915, + 2915, 2915, 2915, 2915, 2915, 2915, 2915, 2915, + 2915, 2915, 2915, 2915, 2915, 2915, 2915, 2915, + 2915, 2915, 2915, 2915, 2915, 2915, 2915, 2915, + 2915, 2915, 2915, 2915, 2915, 2915, 2915, 2915, + 2915, 2915, 2915, 2915, 2915, 2915, 2915, 2915, + 2915, 2915, 2915, 2915, 2915, 2915, 2915, 2915, + 2915, 2915, 2915, 2915, 2915, 2915, 2915, 2915, + 2915, 2915, 2915, 2915, 2915, 2915, 2915, 2915, + 2915, 2915, 2915, 2915, 2915, 2915, 2915, 2915, + 2915, 2915, 2915, 2915, 2915, 2915, 2915, 2915, + 2915, 2915, 2915, 2915, 2915, 2915, 2915, 2915, + 2915, 2915, 2915, 2915, 2915, 2915, 2915, 2915, + 2915, 2915, 2915, 2915, 2915, 2915, 2915, 2915, + 2915, 2915, 2915, 2915, 2915, 2915, 2915, 2915, + 2915, 2915, 2915, 2915, 2915, 2915, 2915, 2915, + 2915, 2915, 2915, 2915, 2915, 2915, 2915, 2915, + 2915, 2915, 2915, 2915, 2915, 2915, 2915, 2915, + 2915, 2915, 2915, 2915, 2915, 2915, 2915, 2915, + 2915, 2915, 2915, 2915, 2915, 2915, 2915, 2915, + 2915, 2915, 2915, 2915, 2915, 2915, 2915, 2915, + 2915, 2915, 2915, 2915, 2915, 2915, 2915, 2915, + 2915, 2915, 2915, 2915, 2915, 2915, 2915, 2915, + 2915, 2915, 2915, 2915, 2915, 2915, 2915, 2915, + 2915, 2915, 2915, 2915, 2915, 2915, 2915, 2915, + 2915, 2915, 2915, 2915, 2915, 2915, 2915, 2915, + 2915, 2915, 2915, 2915, 2915, 2915, 2915, 2915, + 2915, 2915, 2915, 2915, 2915, 2915, 2915, 2915, - 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886, - 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886, - 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886, - 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886, - 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886, - 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886, - 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886, - 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886, - 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886, - 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886, - 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886, - 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886, - 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886, - 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886, - 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886, - 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886, - 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886, - 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886, - 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886, - 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886, - 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886, - 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886, - 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886, - 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886, - 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886, - 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886, - 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886, - 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886, - 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886, - 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886, - 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886, - 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886, + 2915, 2915, 2915, 2915, 2915, 2915, 2915, 2915, + 2915, 2915, 2915, 2915, 2915, 2915, 2915, 2915, + 2915, 2915, 2915, 2915, 2915, 2915, 2915, 2915, + 2915, 2915, 2915, 2915, 2915, 2915, 2915, 2915, + 2915, 2915, 2915, 2915, 2915, 2915, 2915, 2915, + 2915, 2915, 2915, 2915, 2915, 2915, 2915, 2915, + 2915, 2915, 2915, 2915, 2915, 2915, 2915, 2915, + 2915, 2915, 2915, 2915, 2915, 2915, 2915, 2915, + 2915, 2915, 2915, 2915, 2915, 2915, 2915, 2915, + 2915, 2915, 2915, 2915, 2915, 2915, 2915, 2915, + 2915, 2915, 2915, 2915, 2915, 2915, 2915, 2915, + 2915, 2915, 2915, 2915, 2915, 2915, 2915, 2915, + 2915, 2915, 2915, 2915, 2915, 2915, 2915, 2915, + 2915, 2915, 2915, 2915, 2915, 2915, 2915, 2915, + 2915, 2915, 2915, 2915, 2915, 2915, 2915, 2915, + 2915, 2915, 2915, 2915, 2915, 2915, 2915, 2915, + 2915, 2915, 2915, 2915, 2915, 2915, 2915, 2915, + 2915, 2915, 2915, 2915, 2915, 2915, 2915, 2915, + 2915, 2915, 2915, 2915, 2915, 2915, 2915, 2915, + 2915, 2915, 2915, 2915, 2915, 2915, 2915, 2915, + 2915, 2915, 2915, 2915, 2915, 2915, 2915, 2915, + 2915, 2915, 2915, 2915, 2915, 2915, 2915, 2915, + 2915, 2915, 2915, 2915, 2915, 2915, 2915, 2915, + 2915, 2915, 2915, 2915, 2915, 2915, 2915, 2915, + 2915, 2915, 2915, 2915, 2915, 2915, 2915, 2915, + 2915, 2915, 2915, 2915, 2915, 2915, 2915, 2915, + 2915, 2915, 2915, 2915, 2915, 2915, 2915, 1743, + 1743, 1743, 1743, 1743, 1743, 1743, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, - 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886, - 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886, - 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886, - 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886, - 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886, - 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886, - 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886, - 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886, - 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886, - 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886, - 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886, - 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886, - 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886, - 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886, - 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886, - 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886, - 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886, - 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886, - 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886, - 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886, - 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886, - 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886, - 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886, - 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886, - 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886, - 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886, - 2886, 2886, 2886, 2886, 2886, 2886, 2886, 1724, - 1724, 1724, 1724, 1724, 1724, 1724, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, + 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, + 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, + 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, + 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, + 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, + 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, + 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, + 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, + 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, + 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, + 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, + 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, + 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, + 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, + 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, + 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, + 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, + 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, + 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, + 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, + 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, + 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, + 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, + 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, + 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, + 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, + 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, + 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, + 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, + 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, + 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, + 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, - 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, - 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, - 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, - 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, - 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, - 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, - 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, - 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, - 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, - 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, - 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, - 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, - 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, - 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, - 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, - 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, - 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, - 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, - 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, - 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, - 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, - 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, - 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, - 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, - 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, - 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, - 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, - 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, - 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, - 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, - 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, - 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, + 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, + 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, + 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, + 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, + 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, + 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, + 1747, 1747, 1747, 1747, 1747, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 2916, 2916, 2916, 2916, 2916, 2916, 2916, 2916, + 2916, 2916, 2916, 2916, 2916, 2916, 2916, 2916, + 2916, 2916, 2916, 2916, 2916, 2916, 2916, 2916, + 2916, 2916, 2916, 2916, 2916, 2916, 2916, 2916, + 2916, 2916, 2916, 2916, 2916, 2916, 2916, 2916, + 2916, 2916, 2916, 2916, 2916, 2916, 2916, 2916, + 2916, 2916, 2916, 2916, 2916, 2916, 2916, 2916, + 2916, 2916, 2916, 2916, 2916, 2916, 2916, 2916, + 2916, 2916, 2916, 2916, 2916, 2916, 2916, 2916, + 2916, 2916, 2916, 2916, 2916, 2916, 2916, 2916, + 2916, 2916, 2916, 2916, 2916, 2916, 2916, 2916, + 2916, 2916, 2916, 2916, 2916, 2916, 2916, 2916, + 2916, 2916, 2916, 2916, 2916, 2916, 2916, 2916, + 2916, 2916, 2916, 2916, 2916, 2916, 2916, 2916, + 2916, 2916, 2916, 2916, 2916, 2916, 2916, 2916, + 2916, 2916, 2916, 2916, 2916, 2916, 2916, 2916, + 2916, 2916, 2916, 2916, 2916, 2916, 2916, 2916, + 2916, 2916, 2916, 2916, 2916, 2916, 2916, 2916, + 2916, 2916, 2916, 2916, 2916, 2916, 2916, 2916, + 2916, 2916, 2916, 2916, 2916, 2916, 2916, 2916, + 2916, 2916, 2916, 2916, 2916, 2916, 2916, 2916, + 2916, 2916, 2916, 2916, 2916, 2916, 2916, 2916, + 2916, 2916, 2916, 2916, 2916, 2916, 2916, 2916, + 2916, 2916, 2916, 2916, 2916, 2916, 2916, 2916, - 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, - 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, - 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, - 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, - 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, - 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, - 1728, 1728, 1728, 1728, 1728, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 2887, 2887, 2887, 2887, 2887, 2887, 2887, 2887, - 2887, 2887, 2887, 2887, 2887, 2887, 2887, 2887, - 2887, 2887, 2887, 2887, 2887, 2887, 2887, 2887, - 2887, 2887, 2887, 2887, 2887, 2887, 2887, 2887, - 2887, 2887, 2887, 2887, 2887, 2887, 2887, 2887, - 2887, 2887, 2887, 2887, 2887, 2887, 2887, 2887, - 2887, 2887, 2887, 2887, 2887, 2887, 2887, 2887, - 2887, 2887, 2887, 2887, 2887, 2887, 2887, 2887, - 2887, 2887, 2887, 2887, 2887, 2887, 2887, 2887, - 2887, 2887, 2887, 2887, 2887, 2887, 2887, 2887, - 2887, 2887, 2887, 2887, 2887, 2887, 2887, 2887, - 2887, 2887, 2887, 2887, 2887, 2887, 2887, 2887, - 2887, 2887, 2887, 2887, 2887, 2887, 2887, 2887, - 2887, 2887, 2887, 2887, 2887, 2887, 2887, 2887, - 2887, 2887, 2887, 2887, 2887, 2887, 2887, 2887, - 2887, 2887, 2887, 2887, 2887, 2887, 2887, 2887, - 2887, 2887, 2887, 2887, 2887, 2887, 2887, 2887, - 2887, 2887, 2887, 2887, 2887, 2887, 2887, 2887, - 2887, 2887, 2887, 2887, 2887, 2887, 2887, 2887, - 2887, 2887, 2887, 2887, 2887, 2887, 2887, 2887, - 2887, 2887, 2887, 2887, 2887, 2887, 2887, 2887, - 2887, 2887, 2887, 2887, 2887, 2887, 2887, 2887, - 2887, 2887, 2887, 2887, 2887, 2887, 2887, 2887, - 2887, 2887, 2887, 2887, 2887, 2887, 2887, 2887, + 2916, 2916, 2916, 2916, 2916, 2916, 2916, 2916, + 2916, 2916, 2916, 2916, 2916, 2916, 2916, 2916, + 2916, 2916, 2916, 2916, 2916, 2916, 2916, 2916, + 2916, 2916, 2916, 2916, 2916, 2916, 1752, 1752, + 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, + 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, + 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, + 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, + 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, + 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, + 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, + 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, + 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, + 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, + 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, + 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, + 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, + 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, + 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, + 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, + 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, + 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, + 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, + 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, + 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, + 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, + 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, + 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, + 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, + 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, + 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, + 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, - 2887, 2887, 2887, 2887, 2887, 2887, 2887, 2887, - 2887, 2887, 2887, 2887, 2887, 2887, 2887, 2887, - 2887, 2887, 2887, 2887, 2887, 2887, 2887, 2887, - 2887, 2887, 2887, 2887, 2887, 2887, 1733, 1733, - 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, - 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, - 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, - 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, - 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, - 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, - 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, - 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, - 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, - 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, - 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, - 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, - 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, - 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, - 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, - 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, - 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, - 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, - 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, - 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, - 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, - 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, - 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, - 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, - 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, - 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, - 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, - 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, + 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, + 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, + 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, + 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, + 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, + 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, + 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, + 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, + 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, + 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, + 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, + 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, + 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, + 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, + 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, + 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, + 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, + 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, + 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, + 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, + 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, + 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, + 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, + 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, + 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, + 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, + 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, + 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, + 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, + 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, + 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, + 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, - 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, - 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, - 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, - 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, - 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, - 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, - 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, - 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, - 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, - 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, - 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, - 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, - 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, - 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, - 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, - 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, - 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, - 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, - 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, - 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, - 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, - 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, - 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, - 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, - 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, - 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, - 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, - 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, - 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, - 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, - 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, - 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, + 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, + 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, + 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, + 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, + 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, + 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, + 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, + 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, + 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, + 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, + 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, + 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, + 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, + 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, + 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, + 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, + 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, + 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, + 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, + 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, + 1749, 1749, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, - 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, - 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, - 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, - 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, - 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, - 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, - 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, - 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, - 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, - 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, - 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, - 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, - 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, - 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, - 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, - 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, - 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, - 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, - 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, - 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, - 1730, 1730, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, - 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, - 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, - 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, - 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, - 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, - 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, - 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, - 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, - 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, - 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, - 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, - 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, - 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, - 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, - 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, - 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, - 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, - 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, - 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, - 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, - 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, - 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, - 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, - 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, - 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, - 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, - 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, - 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, - 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, - 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, - 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, - 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, - 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, - 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, - 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, - 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, - 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, - 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, - 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, - 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, - 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, - 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, - 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, - 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, - 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, - 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, - 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, - 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, - 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, - 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, - 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, - 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, - 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, - 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, - 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, - 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, - 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, - 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, - 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, - 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, - 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, - 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, - 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, - 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, - 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, - 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, - 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, - 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, - 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, - 1731, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, - 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, - 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, - 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, - 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, - 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, - 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, - 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, - 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, - 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, - 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, - 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, - 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, - 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, - 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, - 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, - 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, - 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, - 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, - 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, - 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, - 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, - 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, - 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, - 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, - 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, - 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, - 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, - 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, - 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, - 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, - 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, - 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, + 2917, 2917, 2917, 2917, 2917, 2917, 2917, 2917, + 2917, 2917, 2917, 2917, 2917, 2917, 2917, 2917, + 2917, 2917, 2917, 2917, 2917, 2917, 2917, 2917, + 2917, 2917, 2917, 2917, 2917, 2917, 2917, 2917, + 2917, 2917, 2917, 2917, 2917, 2917, 2917, 2917, + 2917, 2917, 2917, 2917, 2917, 2917, 2917, 2917, + 2917, 2917, 2917, 2917, 2917, 2917, 2917, 2917, + 2917, 2917, 2917, 2917, 2917, 2917, 2917, 2917, + 2917, 2917, 2917, 2917, 2917, 2917, 2917, 2917, + 2917, 2917, 2917, 2917, 2917, 2917, 2917, 2917, + 2917, 2917, 2917, 2917, 2917, 2917, 2917, 2917, + 2917, 2917, 2917, 2917, 2917, 2917, 2917, 2917, + 2917, 2917, 2917, 2917, 2917, 2917, 2917, 2917, + 2917, 2917, 2917, 2917, 2917, 2917, 2917, 2917, + 2917, 2917, 2917, 2917, 2917, 2917, 2917, 2917, + 2917, 2917, 2917, 2917, 2917, 2917, 2917, 2917, + 2917, 2917, 2917, 2917, 2917, 2917, 2917, 2917, + 2917, 2917, 2917, 2917, 2917, 2917, 2917, 2917, + 2917, 2917, 2917, 2917, 2917, 2917, 2917, 2917, + 2917, 2917, 2917, 2917, 2917, 2917, 2917, 2917, + 2917, 2917, 2917, 2917, 2917, 2917, 2917, 2917, + 2917, 2917, 2917, 2917, 2917, 2917, 2917, 2917, + 2917, 2917, 2917, 2917, 2917, 2917, 2917, 2917, + 2917, 2917, 2917, 2917, 2917, 2917, 2917, 2917, + 2917, 2917, 2917, 2917, 2917, 2917, 2917, 2917, + 2917, 2917, 2917, 2917, 2917, 2917, 2917, 2917, + 2917, 2917, 2917, 2917, 2917, 2917, 2917, 2917, + 2917, 2917, 2917, 2917, 2917, 2917, 2917, 2917, + 2917, 2917, 2917, 2917, 2917, 2917, 2917, 2917, + 2917, 2917, 2917, 2917, 2917, 2917, 2917, 2917, + 2917, 2917, 2917, 2917, 2917, 2917, 2917, 2917, + 2917, 2917, 2917, 2917, 2917, 2917, 2917, 2917, - 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, - 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, - 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, - 2888, 2888, 2888, 2888, 2888, 2888, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, + 2917, 2917, 2917, 2917, 2917, 2917, 2917, 2917, + 2917, 2917, 2917, 2917, 2917, 2917, 2917, 2917, + 2917, 2917, 2917, 2917, 2917, 2917, 2917, 2917, + 2917, 2917, 2917, 2917, 2917, 2917, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, - 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, - 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, - 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, - 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, - 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, - 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, - 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, - 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, - 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, - 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, - 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, - 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, - 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, - 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, - 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, - 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, - 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, - 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, - 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, - 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, - 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, - 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, - 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, - 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, - 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, - 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, - 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, - 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, - 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, - 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, - 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, - 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 2914, 2914, - 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, - 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, - 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, - 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, - 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, - 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, - 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, - 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, - 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, - 1724, 1724, 1724, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, - 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, + 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, + 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, + 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, + 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, + 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, + 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, + 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, + 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, + 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, + 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, + 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, + 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, + 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, + 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, + 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, + 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, + 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, + 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, + 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, + 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, + 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, + 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, + 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, + 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, + 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, + 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, + 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, + 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, + 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, + 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, + 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, + 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 2885, 2885, + 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, + 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, + 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, + 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, + 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, + 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, + 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, + 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, + 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, + 1743, 1743, 1743, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, + 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, - 1403, 2749, 1403, 1403, 1403, 1403, 1403, 1403, - 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, - 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, - 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, - 2889, 2889, 2889, 2889, 2889, 2889, 2889, 2889, - 2889, 2889, 2889, 2889, 2889, 2889, 2889, 2889, - 2889, 2889, 2889, 2889, 2889, 2889, 2889, 2889, - 2889, 2889, 2889, 2889, 2889, 2889, 2889, 2889, - 2889, 2889, 2889, 2889, 2889, 2889, 2889, 2889, - 2889, 2889, 2889, 2889, 2889, 2889, 2889, 2889, - 2889, 2889, 2889, 2889, 2889, 2889, 2889, 2889, - 2889, 2889, 2889, 2889, 2889, 2889, 2889, 2889, - 2889, 2889, 2889, 2889, 2889, 2889, 2889, 2889, - 2889, 2889, 2889, 2889, 2889, 2889, 2889, 2889, - 2889, 2889, 2889, 2889, 2889, 2889, 2889, 2889, - 2889, 2889, 2889, 2889, 2889, 2889, 2889, 2889, - 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, - 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, - 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, - 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, - 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, - 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, - 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, - 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, - 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, - 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, - 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, - 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, - 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, - 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, - 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, - 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 2914, 2914, - 2890, 2890, 2890, 2890, 2890, 2890, 2890, 2890, - 2890, 2890, 2890, 2890, 2890, 2890, 2890, 2890, - 2890, 2890, 2890, 2890, 2890, 2890, 2890, 2890, - 2890, 2890, 2890, 2890, 2890, 2890, 2890, 2890, - 2890, 2890, 2890, 2890, 2890, 2890, 2890, 2890, - 2890, 2890, 2890, 2890, 2890, 2890, 2890, 2890, - 2890, 2890, 2890, 2890, 2890, 2890, 2890, 2890, - 2890, 2890, 2890, 2890, 2890, 2890, 2890, 2890, - 2890, 2890, 2890, 2890, 2890, 2890, 2890, 2890, - 2890, 2890, 2890, 2890, 2890, 2890, 2890, 2890, - 2890, 2890, 2890, 2890, 2890, 2890, 2890, 2890, - 2890, 2890, 2890, 2890, 2890, 2890, 2890, 2890, - 2890, 2890, 2890, 2890, 2890, 2890, 2890, 2890, - 2890, 2890, 2890, 2890, 2890, 2890, 2890, 2890, - 2890, 2890, 2890, 2890, 2890, 2890, 2890, 2890, - 2890, 2890, 2890, 2890, 2890, 2890, 2890, 2890, - 2890, 2890, 2890, 2890, 2890, 2890, 2890, 2890, - 2890, 2890, 2890, 2890, 2890, 2890, 2890, 2890, - 2890, 2890, 2890, 2890, 2890, 2890, 2890, 2890, - 2890, 2890, 2890, 2890, 2890, 2890, 2890, 2890, - 2890, 2890, 2890, 2890, 2890, 2890, 2890, 2890, - 2890, 2890, 2890, 2890, 2890, 2890, 2890, 2890, - 2890, 2890, 2890, 2890, 2890, 2890, 2890, 2890, - 2890, 2890, 2890, 2890, 2890, 2890, 2890, 2890, - 2890, 2890, 2890, 2890, 2890, 2890, 2890, 2890, - 2890, 2890, 2890, 2890, 2890, 2890, 2890, 2890, - 2890, 2890, 2890, 2890, 2890, 2890, 2890, 2890, - 2890, 2890, 2890, 2890, 2890, 2890, 2890, 2890, - 2890, 2890, 2890, 2890, 2890, 2890, 2890, 2890, - 2890, 2890, 2890, 2890, 2890, 2890, 2890, 2890, - 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, - 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, + 1405, 2769, 1405, 1405, 1405, 1405, 1405, 1405, + 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, + 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, + 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, + 2918, 2918, 2918, 2918, 2918, 2918, 2918, 2918, + 2918, 2918, 2918, 2918, 2918, 2918, 2918, 2918, + 2918, 2918, 2918, 2918, 2918, 2918, 2918, 2918, + 2918, 2918, 2918, 2918, 2918, 2918, 2918, 2918, + 2918, 2918, 2918, 2918, 2918, 2918, 2918, 2918, + 2918, 2918, 2918, 2918, 2918, 2918, 2918, 2918, + 2918, 2918, 2918, 2918, 2918, 2918, 2918, 2918, + 2918, 2918, 2918, 2918, 2918, 2918, 2918, 2918, + 2918, 2918, 2918, 2918, 2918, 2918, 2918, 2918, + 2918, 2918, 2918, 2918, 2918, 2918, 2918, 2918, + 2918, 2918, 2918, 2918, 2918, 2918, 2918, 2918, + 2918, 2918, 2918, 2918, 2918, 2918, 2918, 2918, + 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, + 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, + 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, + 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, + 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, + 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, + 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, + 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, + 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, + 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, + 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, + 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, + 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, + 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, + 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, + 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, - 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, - 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, - 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, - 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, - 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, - 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, - 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, - 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, - 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, - 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, - 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, - 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, - 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, - 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, - 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, - 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, - 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, - 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, - 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, - 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, - 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, - 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, - 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, - 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, - 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, - 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, - 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, - 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, - 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, - 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, - 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, - 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, + 2919, 2919, 2919, 2919, 2919, 2919, 2919, 2919, + 2919, 2919, 2919, 2919, 2919, 2919, 2919, 2919, + 2919, 2919, 2919, 2919, 2919, 2919, 2919, 2919, + 2919, 2919, 2919, 2919, 2919, 2919, 2919, 2919, + 2919, 2919, 2919, 2919, 2919, 2919, 2919, 2919, + 2919, 2919, 2919, 2919, 2919, 2919, 2919, 2919, + 2919, 2919, 2919, 2919, 2919, 2919, 2919, 2919, + 2919, 2919, 2919, 2919, 2919, 2919, 2919, 2919, + 2919, 2919, 2919, 2919, 2919, 2919, 2919, 2919, + 2919, 2919, 2919, 2919, 2919, 2919, 2919, 2919, + 2919, 2919, 2919, 2919, 2919, 2919, 2919, 2919, + 2919, 2919, 2919, 2919, 2919, 2919, 2919, 2919, + 2919, 2919, 2919, 2919, 2919, 2919, 2919, 2919, + 2919, 2919, 2919, 2919, 2919, 2919, 2919, 2919, + 2919, 2919, 2919, 2919, 2919, 2919, 2919, 2919, + 2919, 2919, 2919, 2919, 2919, 2919, 2919, 2919, + 2919, 2919, 2919, 2919, 2919, 2919, 2919, 2919, + 2919, 2919, 2919, 2919, 2919, 2919, 2919, 2919, + 2919, 2919, 2919, 2919, 2919, 2919, 2919, 2919, + 2919, 2919, 2919, 2919, 2919, 2919, 2919, 2919, + 2919, 2919, 2919, 2919, 2919, 2919, 2919, 2919, + 2919, 2919, 2919, 2919, 2919, 2919, 2919, 2919, + 2919, 2919, 2919, 2919, 2919, 2919, 2919, 2919, + 2919, 2919, 2919, 2919, 2919, 2919, 2919, 2919, + 2919, 2919, 2919, 2919, 2919, 2919, 2919, 2919, + 2919, 2919, 2919, 2919, 2919, 2919, 2919, 2919, + 2919, 2919, 2919, 2919, 2919, 2919, 2919, 2919, + 2919, 2919, 2919, 2919, 2919, 2919, 2919, 2919, + 2919, 2919, 2919, 2919, 2919, 2919, 2919, 2919, + 2919, 2919, 2919, 2919, 2919, 2919, 2919, 2919, + 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, + 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, - 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891, - 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891, - 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891, - 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891, - 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891, - 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891, - 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891, - 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891, - 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891, - 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891, - 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891, - 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891, - 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891, - 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891, - 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891, - 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891, - 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891, - 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891, - 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891, - 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891, - 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891, - 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891, - 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891, - 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891, - 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891, - 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891, - 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891, - 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891, - 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891, - 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891, - 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891, - 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891, + 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, + 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, + 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, + 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, + 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, + 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, + 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, + 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, + 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, + 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, + 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, + 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, + 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, + 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, + 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, + 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, + 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, + 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, + 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, + 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, + 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, + 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, + 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, + 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, + 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, + 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, + 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, + 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, + 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, + 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, + 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, + 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, - 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891, - 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891, - 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891, - 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891, - 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891, - 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891, - 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891, - 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891, - 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891, - 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891, - 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891, - 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891, - 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891, - 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891, - 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891, - 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891, - 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891, - 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891, - 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891, - 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891, - 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891, - 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891, - 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891, - 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891, - 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891, - 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891, - 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891, - 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891, - 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891, - 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891, - 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891, - 2891, 2891, 2891, 2891, 2891, 2891, 2885, 2885 + 2920, 2920, 2920, 2920, 2920, 2920, 2920, 2920, + 2920, 2920, 2920, 2920, 2920, 2920, 2920, 2920, + 2920, 2920, 2920, 2920, 2920, 2920, 2920, 2920, + 2920, 2920, 2920, 2920, 2920, 2920, 2920, 2920, + 2920, 2920, 2920, 2920, 2920, 2920, 2920, 2920, + 2920, 2920, 2920, 2920, 2920, 2920, 2920, 2920, + 2920, 2920, 2920, 2920, 2920, 2920, 2920, 2920, + 2920, 2920, 2920, 2920, 2920, 2920, 2920, 2920, + 2920, 2920, 2920, 2920, 2920, 2920, 2920, 2920, + 2920, 2920, 2920, 2920, 2920, 2920, 2920, 2920, + 2920, 2920, 2920, 2920, 2920, 2920, 2920, 2920, + 2920, 2920, 2920, 2920, 2920, 2920, 2920, 2920, + 2920, 2920, 2920, 2920, 2920, 2920, 2920, 2920, + 2920, 2920, 2920, 2920, 2920, 2920, 2920, 2920, + 2920, 2920, 2920, 2920, 2920, 2920, 2920, 2920, + 2920, 2920, 2920, 2920, 2920, 2920, 2920, 2920, + 2920, 2920, 2920, 2920, 2920, 2920, 2920, 2920, + 2920, 2920, 2920, 2920, 2920, 2920, 2920, 2920, + 2920, 2920, 2920, 2920, 2920, 2920, 2920, 2920, + 2920, 2920, 2920, 2920, 2920, 2920, 2920, 2920, + 2920, 2920, 2920, 2920, 2920, 2920, 2920, 2920, + 2920, 2920, 2920, 2920, 2920, 2920, 2920, 2920, + 2920, 2920, 2920, 2920, 2920, 2920, 2920, 2920, + 2920, 2920, 2920, 2920, 2920, 2920, 2920, 2920, + 2920, 2920, 2920, 2920, 2920, 2920, 2920, 2920, + 2920, 2920, 2920, 2920, 2920, 2920, 2920, 2920, + 2920, 2920, 2920, 2920, 2920, 2920, 2920, 2920, + 2920, 2920, 2920, 2920, 2920, 2920, 2920, 2920, + 2920, 2920, 2920, 2920, 2920, 2920, 2920, 2920, + 2920, 2920, 2920, 2920, 2920, 2920, 2920, 2920, + 2920, 2920, 2920, 2920, 2920, 2920, 2920, 2920, + 2920, 2920, 2920, 2920, 2920, 2920, 2920, 2920, + + 2920, 2920, 2920, 2920, 2920, 2920, 2920, 2920, + 2920, 2920, 2920, 2920, 2920, 2920, 2920, 2920, + 2920, 2920, 2920, 2920, 2920, 2920, 2920, 2920, + 2920, 2920, 2920, 2920, 2920, 2920, 2920, 2920, + 2920, 2920, 2920, 2920, 2920, 2920, 2920, 2920, + 2920, 2920, 2920, 2920, 2920, 2920, 2920, 2920, + 2920, 2920, 2920, 2920, 2920, 2920, 2920, 2920, + 2920, 2920, 2920, 2920, 2920, 2920, 2920, 2920, + 2920, 2920, 2920, 2920, 2920, 2920, 2920, 2920, + 2920, 2920, 2920, 2920, 2920, 2920, 2920, 2920, + 2920, 2920, 2920, 2920, 2920, 2920, 2920, 2920, + 2920, 2920, 2920, 2920, 2920, 2920, 2920, 2920, + 2920, 2920, 2920, 2920, 2920, 2920, 2920, 2920, + 2920, 2920, 2920, 2920, 2920, 2920, 2920, 2920, + 2920, 2920, 2920, 2920, 2920, 2920, 2920, 2920, + 2920, 2920, 2920, 2920, 2920, 2920, 2920, 2920, + 2920, 2920, 2920, 2920, 2920, 2920, 2920, 2920, + 2920, 2920, 2920, 2920, 2920, 2920, 2920, 2920, + 2920, 2920, 2920, 2920, 2920, 2920, 2920, 2920, + 2920, 2920, 2920, 2920, 2920, 2920, 2920, 2920, + 2920, 2920, 2920, 2920, 2920, 2920, 2920, 2920, + 2920, 2920, 2920, 2920, 2920, 2920, 2920, 2920, + 2920, 2920, 2920, 2920, 2920, 2920, 2920, 2920, + 2920, 2920, 2920, 2920, 2920, 2920, 2920, 2920, + 2920, 2920, 2920, 2920, 2920, 2920, 2920, 2920, + 2920, 2920, 2920, 2920, 2920, 2920, 2920, 2920, + 2920, 2920, 2920, 2920, 2920, 2920, 2920, 2920, + 2920, 2920, 2920, 2920, 2920, 2920, 2920, 2920, + 2920, 2920, 2920, 2920, 2920, 2920, 2920, 2920, + 2920, 2920, 2920, 2920, 2920, 2920, 2920, 2920, + 2920, 2920, 2920, 2920, 2920, 2920, 2920, 2920, + 2920, 2920, 2920, 2920, 2920, 2920, 2914, 2914 }; #define GET_PROP_INDEX(ucs4) \ @@ -6757,6 +6838,7 @@ static const Properties uc_properties[] = { { 27, 4, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 10, 0, 2 }, { 29, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 }, { 28, 10, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 }, + { 29, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 12, 0, 2 }, { 18, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 3 }, { 23, 10, 0, 0, -1, 16, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 3, 13, 2 }, { 10, 18, 0, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 17, 4, 2 }, @@ -8089,12 +8171,13 @@ static const Properties uc_properties[] = { { 25, 10, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 10, 0, 2 }, { 23, 10, 0, 0, -1, 1, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 3, 13, 2 }, { 24, 10, 0, 0, -1, -1, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 3, 13, 2 }, - { 25, 10, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 5, 12, 2 }, + { 25, 10, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 5, 12, 2 }, { 25, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 5, 12, 2 }, { 26, 6, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 15, 8, 0, 2 }, { 22, 10, 0, 0, -1, -1, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 13, 2 }, { 25, 10, 0, 0, -1, 0, 6, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 5, 12, 2 }, { 25, 10, 0, 0, -1, 0, 4, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 5, 12, 2 }, + { 25, 10, 0, 0, -1, 0, 4, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 5, 12, 2 }, { 25, 10, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 }, { 25, 10, 0, 0, -1, 0, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 }, { 26, 10, 0, 0, -1, 0, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 }, @@ -8152,13 +8235,14 @@ static const Properties uc_properties[] = { { 29, 10, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 10, 0, 2 }, { 15, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 2 }, { 29, 10, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 9, 0, 2 }, + { 29, 10, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 12, 0, 2 }, { 14, 0, 0, 0, -1, 0, 1, 85, { {0, -7517}, {0, 0}, {0, 0}, {0, -7517} }, 0, 10, 12, 7, 4 }, { 14, 0, 0, 0, -1, 0, 1, 85, { {1, 207}, {0, 0}, {0, 0}, {1, 207} }, 0, 10, 12, 7, 3 }, { 14, 0, 0, 0, -1, 0, 1, 85, { {1, 209}, {0, 0}, {0, 0}, {1, 209} }, 0, 10, 12, 7, 3 }, { 29, 4, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 }, { 14, 0, 0, 0, -1, 0, 1, 0, { {0, 28}, {0, 0}, {0, 0}, {0, 28} }, 0, 10, 12, 7, 3 }, { 18, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 2 }, - { 15, 0, 0, 0, -1, 0, 4, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 2 }, + { 15, 0, 0, 0, -1, 0, 4, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 10, 12, 6, 2 }, { 29, 10, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 }, { 29, 10, 0, 0, -1, 0, 7, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 }, { 15, 0, 0, 0, -1, 0, 8, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 2 }, @@ -8176,6 +8260,7 @@ static const Properties uc_properties[] = { { 4, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 3 }, { 4, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 3 }, { 29, 10, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 }, + { 26, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 12, 0, 2 }, { 26, 10, 0, 0, -1, 0, 1, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 }, { 29, 10, 0, 0, -1, 0, 1, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 }, { 26, 10, 0, 0, -1, 3, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 }, @@ -8206,17 +8291,20 @@ static const Properties uc_properties[] = { { 26, 10, 0, 0, -1, 7, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 }, { 26, 10, 0, 0, -1, -8, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 }, { 26, 10, 0, 0, -1, -7, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 }, - { 29, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 2 }, + { 29, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 14, 0, 2 }, { 21, 10, 0, 0, -1, 1, 1, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 13, 2 }, { 22, 10, 0, 0, -1, -1, 1, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 13, 2 }, { 29, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 }, + { 29, 10, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 12, 0, 2 }, { 29, 0, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 }, + { 29, 10, 0, 0, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 12, 0, 2 }, { 29, 10, 0, 0, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 }, { 26, 10, 0, 0, -1, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 }, { 29, 10, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 }, - { 29, 10, 0, 0, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 }, - { 29, 10, 0, 0, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 2 }, + { 29, 10, 0, 0, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 12, 0, 2 }, + { 29, 10, 0, 0, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 14, 0, 2 }, { 29, 10, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 }, + { 29, 10, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 12, 0, 2 }, { 29, 10, 0, 0, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 }, { 29, 10, 0, 0, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 }, { 5, 10, 0, 0, 1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 }, @@ -8231,6 +8319,7 @@ static const Properties uc_properties[] = { { 5, 2, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 }, { 29, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 }, { 29, 0, 0, 0, -1, 0, 1, 80, { {0, 26}, {0, 0}, {0, 0}, {0, 26} }, 0, 10, 12, 7, 2 }, + { 29, 0, 0, 0, -1, 0, 1, 80, { {0, 26}, {0, 0}, {0, 0}, {0, 26} }, 14, 10, 12, 7, 2 }, { 29, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, -26}, {0, -26}, {0, 0} }, 0, 10, 12, 6, 2 }, { 5, 10, 0, 0, 0, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 }, { 5, 10, 0, 0, -1, 0, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 }, @@ -8244,19 +8333,25 @@ static const Properties uc_properties[] = { { 5, 10, 0, 0, 8, 0, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 }, { 5, 10, 0, 0, 9, 0, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 }, { 5, 10, 0, 0, 0, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 }, - { 29, 10, 0, 0, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 2 }, - { 29, 10, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 2 }, - { 29, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 30, 0, 2 }, - { 29, 10, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 }, - { 29, 0, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 }, - { 29, 10, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 2 }, - { 29, 10, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 2 }, - { 29, 10, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 30, 0, 2 }, - { 29, 10, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 2 }, - { 29, 10, 0, 0, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 30, 0, 2 }, + { 26, 10, 0, 0, -1, 0, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 12, 0, 2 }, + { 29, 10, 0, 0, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 14, 0, 2 }, + { 29, 10, 0, 0, -1, 0, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 12, 0, 2 }, + { 29, 10, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 14, 0, 2 }, + { 29, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 30, 0, 2 }, + { 29, 10, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 12, 0, 2 }, + { 29, 10, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 12, 0, 2 }, + { 29, 10, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 12, 0, 2 }, + { 29, 0, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 12, 0, 2 }, + { 29, 10, 0, 0, -1, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 12, 0, 2 }, + { 29, 10, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 14, 0, 2 }, + { 29, 10, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 14, 0, 2 }, + { 29, 10, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 30, 0, 2 }, + { 29, 10, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 14, 0, 2 }, + { 29, 10, 0, 0, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 30, 0, 2 }, { 29, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 3, 13, 2 }, { 29, 10, 0, 0, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 3, 13, 2 }, { 29, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 6, 0, 2 }, + { 29, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 6, 0, 2 }, { 21, 10, 0, 0, -1, 1, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 13, 2 }, { 22, 10, 0, 0, -1, -1, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 13, 2 }, { 5, 10, 0, 0, 1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 }, @@ -8300,6 +8395,7 @@ static const Properties uc_properties[] = { { 26, 10, 0, 0, -1, -2106, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 }, { 26, 10, 0, 0, -1, -2108, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 }, { 26, 10, 0, 0, -1, -2250, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 }, + { 29, 10, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 }, { 29, 10, 0, 0, -1, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 }, { 29, 10, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 }, { 29, 10, 0, 0, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 }, @@ -8371,6 +8467,7 @@ static const Properties uc_properties[] = { { 25, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 11, 2 }, { 25, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 12, 2 }, { 25, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 2 }, + { 29, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 2 }, { 17, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 5, 8, 37 }, { 18, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 8, 2 }, { 4, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 8, 37 }, @@ -8380,14 +8477,14 @@ static const Properties uc_properties[] = { { 0, 17, 228, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1 }, { 0, 17, 222, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1 }, { 1, 0, 224, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 26 }, - { 20, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 2 }, + { 20, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 14, 0, 2 }, { 17, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 8, 14, 8, 2 }, { 17, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 8, 21, 8, 2 }, { 29, 10, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 2 }, { 4, 0, 0, 0, -1, 0, 4, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 8, 37 }, { 17, 0, 0, 0, -1, 0, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 5, 8, 37 }, { 18, 0, 0, 0, -1, 0, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 5, 8, 2 }, - { 25, 10, 0, 0, -1, 0, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 2 }, + { 25, 10, 0, 0, -1, 0, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 14, 0, 2 }, { 18, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 5, 8, 34 }, { 18, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 8, 34 }, { 18, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 8, 34 }, @@ -8417,6 +8514,8 @@ static const Properties uc_properties[] = { { 18, 0, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 36 }, { 18, 0, 0, 0, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 36 }, { 18, 0, 0, 0, -1, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 36 }, + { 29, 10, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 2 }, + { 29, 10, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 2 }, { 18, 0, 0, 0, -1, 0, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 8, 5, 8, 35 }, { 29, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 26 }, { 29, 10, 0, 0, -1, 0, 7, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 26 }, @@ -8425,6 +8524,7 @@ static const Properties uc_properties[] = { { 29, 10, 0, 0, -1, 0, 7, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 2 }, { 5, 10, 0, 0, -1, 0, 6, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 2 }, { 29, 10, 0, 0, -1, 0, 8, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 26 }, + { 29, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 14, 0, 2 }, { 29, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 8, 14, 0, 35 }, { 29, 0, 0, 0, -1, 0, 22, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 2 }, { 18, 0, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 8, 37 }, @@ -8779,6 +8879,7 @@ static const Properties uc_properties[] = { { 19, 10, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 17, 14, 0, 2 }, { 21, 10, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 13, 2 }, { 22, 10, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 13, 2 }, + { 25, 10, 0, 0, -1, 0, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 2 }, { 21, 10, 0, 0, -1, 0, 7, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 13, 2 }, { 22, 10, 0, 0, -1, 0, 7, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 13, 2 }, { 25, 6, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 15, 1, 11, 2 }, @@ -9536,6 +9637,7 @@ static const Properties uc_properties[] = { { 29, 13, 0, 0, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 }, { 18, 13, 0, 0, -1, 0, 13, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 8 }, { 26, 10, 0, 0, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 8 }, + { 13, 0, 0, 0, -1, 0, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 14, 0, 0 }, { 5, 2, 0, 0, 0, 0, 11, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 }, { 5, 2, 0, 0, 1, 0, 11, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 }, { 5, 2, 0, 0, 2, 0, 11, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 }, @@ -9547,38 +9649,46 @@ static const Properties uc_properties[] = { { 5, 2, 0, 0, 8, 0, 11, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 }, { 5, 2, 0, 0, 9, 0, 11, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 }, { 5, 10, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 }, - { 29, 10, 0, 0, -1, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 2 }, + { 29, 10, 0, 0, -1, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 14, 0, 2 }, { 29, 0, 0, 0, -1, 0, 11, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 }, + { 29, 10, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 12, 0, 2 }, { 29, 0, 0, 0, -1, 0, 12, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 2 }, { 29, 0, 0, 0, -1, 0, 11, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 2 }, { 29, 0, 0, 0, -1, 0, 12, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 }, { 29, 0, 0, 0, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 2 }, { 29, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 2 }, { 29, 10, 0, 0, -1, 0, 13, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 }, - { 29, 10, 0, 0, -1, 0, 21, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 }, + { 29, 10, 0, 0, -1, 0, 21, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 12, 0, 2 }, + { 29, 0, 0, 0, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 10, 12, 7, 2 }, + { 29, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 10, 12, 7, 2 }, + { 29, 0, 0, 0, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 12, 0, 2 }, { 29, 0, 0, 0, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 }, { 29, 0, 0, 0, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 }, { 29, 0, 0, 0, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 6, 7, 28, 0, 2 }, { 29, 0, 0, 0, -1, 0, 11, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 34 }, - { 29, 0, 0, 0, -1, 0, 12, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 2 }, + { 29, 0, 0, 0, -1, 0, 12, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 14, 0, 2 }, + { 29, 0, 0, 0, -1, 0, 11, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 14, 0, 2 }, { 29, 0, 0, 0, -1, 0, 18, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 2 }, - { 29, 10, 0, 0, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 2 }, - { 29, 10, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 2 }, - { 29, 10, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 30, 0, 2 }, + { 29, 10, 0, 0, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 14, 0, 2 }, + { 29, 10, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 14, 0, 2 }, + { 29, 10, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 30, 0, 2 }, { 28, 10, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 31, 0, 2 }, { 29, 10, 0, 0, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 }, - { 29, 10, 0, 0, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 30, 0, 2 }, - { 29, 10, 0, 0, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 2 }, - { 29, 10, 0, 0, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 2 }, + { 29, 10, 0, 0, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 30, 0, 2 }, + { 29, 10, 0, 0, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 14, 0, 2 }, + { 29, 10, 0, 0, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 14, 0, 2 }, { 29, 10, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 3, 13, 2 }, { 29, 10, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 5, 0, 2 }, - { 29, 10, 0, 0, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 2 }, - { 29, 10, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 2 }, - { 29, 10, 0, 0, -1, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 30, 0, 2 }, - { 29, 10, 0, 0, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 30, 0, 2 }, - { 29, 10, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 30, 0, 2 }, - { 29, 10, 0, 0, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 30, 0, 2 }, - { 29, 10, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 30, 0, 2 }, + { 29, 10, 0, 0, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 14, 0, 2 }, + { 29, 10, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 14, 0, 2 }, + { 29, 10, 0, 0, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 }, + { 29, 10, 0, 0, -1, 0, 23, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 30, 0, 2 }, + { 29, 10, 0, 0, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 30, 0, 2 }, + { 29, 10, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 30, 0, 2 }, + { 29, 10, 0, 0, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 30, 0, 2 }, + { 29, 10, 0, 0, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 2 }, + { 29, 10, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 30, 0, 2 }, + { 29, 10, 0, 0, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 0, 12, 0, 2 }, { 3, 2, 0, 0, 0, 0, 23, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 2 }, { 3, 2, 0, 0, 1, 0, 23, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 2 }, { 3, 2, 0, 0, 2, 0, 23, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 2 }, diff --git a/src/corelib/text/qunicodetables_p.h b/src/corelib/text/qunicodetables_p.h index 3578bb88..6aa8be88 100644 --- a/src/corelib/text/qunicodetables_p.h +++ b/src/corelib/text/qunicodetables_p.h @@ -118,10 +118,7 @@ enum GraphemeBreakClass { GraphemeBreak_T, GraphemeBreak_LV, GraphemeBreak_LVT, - Graphemebreak_E_Base, - Graphemebreak_E_Modifier, - Graphemebreak_Glue_After_Zwj, - Graphemebreak_E_Base_GAZ, + GraphemeBreak_Extended_Pictographic, NumGraphemeBreakClasses }; diff --git a/src/corelib/text/qunicodetools.cpp b/src/corelib/text/qunicodetools.cpp index 0db3dc74..a809960d 100644 --- a/src/corelib/text/qunicodetools.cpp +++ b/src/corelib/text/qunicodetools.cpp @@ -44,6 +44,8 @@ #include "qharfbuzz_p.h" +#include + #define FLAG(x) (1 << (x)) QT_BEGIN_NAMESPACE @@ -55,45 +57,90 @@ namespace QUnicodeTools { // ----------------------------------------------------------------------------------------------------- // // The text boundaries determination algorithm. -// See http://www.unicode.org/reports/tr29/tr29-31.html +// See https://www.unicode.org/reports/tr29/tr29-37.html // // ----------------------------------------------------------------------------------------------------- namespace GB { -/* - * Most grapheme break rules can be implemented table driven, but rules GB10, GB12 and GB13 need a bit - * of special treatment. - */ -enum State : uchar { - Break, - Inside, - GB10, - GB10_2, - GB10_3, - GB13, // also covers GB12 +// This table is indexed by the grapheme break classes of two +// (adjacent) code points. +// The class of the first code point selects an entry. +// If the entry's bit at position second_cp_class is set +// (in other words: if entry & (1u << second_cp_class) is non-zero) +// then there is NO grapheme break between the two code points. + +using GBTableEntryType = quint16; + +// Check that we have enough bits in the table (in case +// NumGraphemeBreakClasses grows too much). +static_assert(sizeof(GBTableEntryType) * CHAR_BIT >= QUnicodeTables::NumGraphemeBreakClasses, + "Internal error: increase the size in bits of GBTableEntryType"); + +// GB9, GB9a +static const GBTableEntryType Extend_SpacingMark_ZWJ = + FLAG(QUnicodeTables::GraphemeBreak_Extend) + | FLAG(QUnicodeTables::GraphemeBreak_SpacingMark) + | FLAG(QUnicodeTables::GraphemeBreak_ZWJ); + +static const GBTableEntryType HardBreak = 0u; + +static const GBTableEntryType breakTable[QUnicodeTables::NumGraphemeBreakClasses] = { + Extend_SpacingMark_ZWJ, // Any + FLAG(QUnicodeTables::GraphemeBreak_LF), // CR + HardBreak, // LF + HardBreak, // Control + Extend_SpacingMark_ZWJ, // Extend + Extend_SpacingMark_ZWJ, // ZWJ + Extend_SpacingMark_ZWJ, // RegionalIndicator + (Extend_SpacingMark_ZWJ + | FLAG(QUnicodeTables::GraphemeBreak_Any) + | FLAG(QUnicodeTables::GraphemeBreak_Prepend) + | FLAG(QUnicodeTables::GraphemeBreak_L) + | FLAG(QUnicodeTables::GraphemeBreak_V) + | FLAG(QUnicodeTables::GraphemeBreak_T) + | FLAG(QUnicodeTables::GraphemeBreak_LV) + | FLAG(QUnicodeTables::GraphemeBreak_LVT) + | FLAG(QUnicodeTables::GraphemeBreak_RegionalIndicator) + | FLAG(QUnicodeTables::GraphemeBreak_Extended_Pictographic) + ), // Prepend + Extend_SpacingMark_ZWJ, // SpacingMark + (Extend_SpacingMark_ZWJ + | FLAG(QUnicodeTables::GraphemeBreak_L) + | FLAG(QUnicodeTables::GraphemeBreak_V) + | FLAG(QUnicodeTables::GraphemeBreak_LV) + | FLAG(QUnicodeTables::GraphemeBreak_LVT) + ), // L + (Extend_SpacingMark_ZWJ + | FLAG(QUnicodeTables::GraphemeBreak_V) + | FLAG(QUnicodeTables::GraphemeBreak_T) + ), // V + (Extend_SpacingMark_ZWJ + | FLAG(QUnicodeTables::GraphemeBreak_T) + ), // T + (Extend_SpacingMark_ZWJ + | FLAG(QUnicodeTables::GraphemeBreak_V) + | FLAG(QUnicodeTables::GraphemeBreak_T) + ), // LV + (Extend_SpacingMark_ZWJ + | FLAG(QUnicodeTables::GraphemeBreak_T) + ), // LVT + Extend_SpacingMark_ZWJ // Extended_Pictographic }; -static const State breakTable[QUnicodeTables::NumGraphemeBreakClasses][QUnicodeTables::NumGraphemeBreakClasses] = { -// Any CR LF Control Extend ZWJ RI Prepend S-Mark L V T LV LVT E_B E_M GAZ EBG - { Break , Break , Break , Break , Inside, Inside, Break , Break , Inside, Break , Break , Break , Break , Break , Break , Break , Break , Break }, // Any - { Break , Break , Inside, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break }, // CR - { Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break }, // LF - { Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break }, // Control - { Break , Break , Break , Break , GB10_2, Inside, Break , Break , Inside, Break , Break , Break , Break , Break , Break , GB10_3, Break , Break }, // Extend - { Break , Break , Break , Break , Inside, Inside, Break , Break , Inside, Break , Break , Break , Break , Break , Break , Break , Inside, Inside }, // ZWJ - { Break , Break , Break , Break , Inside, Inside, GB13 , Break , Inside, Break , Break , Break , Break , Break , Break , Break , Break , Break }, // RegionalIndicator - { Inside, Break , Break , Break , Inside, Inside, Inside, Inside, Inside, Inside, Inside, Inside, Inside, Inside, Inside, Inside, Inside, Inside }, // Prepend - { Break , Break , Break , Break , Inside, Inside, Break , Break , Inside, Break , Break , Break , Break , Break , Break , Break , Break , Break }, // SpacingMark - { Break , Break , Break , Break , Inside, Inside, Break , Break , Inside, Inside, Inside, Break , Inside, Inside, Break , Break , Break , Break }, // L - { Break , Break , Break , Break , Inside, Inside, Break , Break , Inside, Break , Inside, Inside, Break , Break , Break , Break , Break , Break }, // V - { Break , Break , Break , Break , Inside, Inside, Break , Break , Inside, Break , Break , Inside, Break , Break , Break , Break , Break , Break }, // T - { Break , Break , Break , Break , Inside, Inside, Break , Break , Inside, Break , Inside, Inside, Break , Break , Break , Break , Break , Break }, // LV - { Break , Break , Break , Break , Inside, Inside, Break , Break , Inside, Break , Break , Inside, Break , Break , Break , Break , Break , Break }, // LVT - { Break , Break , Break , Break , GB10 , Inside, Break , Break , Inside, Break , Break , Break , Break , Break , Break , Inside, Break , Break }, // E_B - { Break , Break , Break , Break , Inside, Inside, Break , Break , Inside, Break , Break , Break , Break , Break , Break , Break , Break , Break }, // E_M - { Break , Break , Break , Break , Inside, Inside, Break , Break , Inside, Break , Break , Break , Break , Break , Break , Break , Break , Break }, // GAZ - { Break , Break , Break , Break , GB10 , Inside, Break , Break , Inside, Break , Break , Break , Break , Break , Break , Inside, Break , Break }, // EBG +static bool shouldBreakBetweenClasses(QUnicodeTables::GraphemeBreakClass first, + QUnicodeTables::GraphemeBreakClass second) +{ + return (breakTable[first] & FLAG(second)) == 0; +} + +// Some rules (GB11, GB12, GB13) cannot be represented by the table alone, +// so we need to store some local state. +enum class State : uchar { + Normal, + GB11_ExtPicExt, // saw a Extend after a Extended_Pictographic + GB11_ExtPicExtZWJ, // saw a ZWG after a Extended_Pictographic and zero or more Extend + GB12_13_RI, // saw a RegionalIndicator following a non-RegionalIndicator }; } // namespace GB @@ -101,7 +148,7 @@ static const State breakTable[QUnicodeTables::NumGraphemeBreakClasses][QUnicodeT static void getGraphemeBreaks(const ushort *string, quint32 len, QCharAttributes *attributes) { QUnicodeTables::GraphemeBreakClass lcls = QUnicodeTables::GraphemeBreak_LF; // to meet GB1 - GB::State state = GB::Break; // only required to track some of the rules + GB::State state = GB::State::Normal; for (quint32 i = 0; i != len; ++i) { quint32 pos = i; uint ucs4 = string[i]; @@ -116,37 +163,67 @@ static void getGraphemeBreaks(const ushort *string, quint32 len, QCharAttributes const QUnicodeTables::Properties *prop = QUnicodeTables::properties(ucs4); QUnicodeTables::GraphemeBreakClass cls = (QUnicodeTables::GraphemeBreakClass) prop->graphemeBreakClass; - switch (GB::breakTable[lcls][cls]) { - case GB::Break: - attributes[pos].graphemeBoundary = true; - state = GB::Break; - break; - case GB::Inside: - state = GB::Break; - break; - case GB::GB10: - state = GB::GB10; - break; - case GB::GB10_2: - if (state == GB::GB10 || state == GB::GB10_2) - state = GB::GB10_2; - else - state = GB::Break; - break; - case GB::GB10_3: - if (state != GB::GB10 && state != GB::GB10_2) - attributes[pos].graphemeBoundary = true; - state = GB::Break; - break; - case GB::GB13: - if (state != GB::GB13) { - state = GB::GB13; + bool shouldBreak = GB::shouldBreakBetweenClasses(lcls, cls); + bool handled = false; + + switch (state) { + case GB::State::Normal: + break; // will deal with it below + + case GB::State::GB11_ExtPicExt: + Q_ASSERT(lcls == QUnicodeTables::GraphemeBreak_Extend); + if (cls == QUnicodeTables::GraphemeBreak_Extend) { + // keep going in the current state + Q_ASSERT(!shouldBreak); // GB9, do not break before Extend + handled = true; + } else if (cls == QUnicodeTables::GraphemeBreak_ZWJ) { + state = GB::State::GB11_ExtPicExtZWJ; + Q_ASSERT(!shouldBreak); // GB9, do not break before ZWJ + handled = true; } else { - attributes[pos].graphemeBoundary = true; - state = GB::Break; + state = GB::State::Normal; + } + break; + + case GB::State::GB11_ExtPicExtZWJ: + Q_ASSERT(lcls == QUnicodeTables::GraphemeBreak_ZWJ); + if (cls == QUnicodeTables::GraphemeBreak_Extended_Pictographic) { + shouldBreak = false; + handled = true; + } + + state = GB::State::Normal; + break; + + case GB::State::GB12_13_RI: + Q_ASSERT(lcls == QUnicodeTables::GraphemeBreak_RegionalIndicator); + if (cls == QUnicodeTables::GraphemeBreak_RegionalIndicator) { + shouldBreak = false; + handled = true; + } + + state = GB::State::Normal; + break; + } + + if (!handled) { + Q_ASSERT(state == GB::State::Normal); + if (lcls == QUnicodeTables::GraphemeBreak_Extended_Pictographic) { // GB11 + if (cls == QUnicodeTables::GraphemeBreak_Extend) { + state = GB::State::GB11_ExtPicExt; + Q_ASSERT(!shouldBreak); // GB9, do not break before Extend + } else if (cls == QUnicodeTables::GraphemeBreak_ZWJ) { + state = GB::State::GB11_ExtPicExtZWJ; + Q_ASSERT(!shouldBreak); // GB9, do not break before ZWJ + } + } else if (cls == QUnicodeTables::GraphemeBreak_RegionalIndicator) { // GB12, GB13 + state = GB::State::GB12_13_RI; } } + if (shouldBreak) + attributes[pos].graphemeBoundary = true; + lcls = cls; } diff --git a/src/corelib/thread/qfutureinterface.h b/src/corelib/thread/qfutureinterface.h index bcdae248..e4cc46e9 100644 --- a/src/corelib/thread/qfutureinterface.h +++ b/src/corelib/thread/qfutureinterface.h @@ -201,7 +201,7 @@ inline void QFutureInterface::reportResult(const T *result, int index) if (store.filterMode()) { const int resultCountBefore = store.count(); store.addResult(index, result); - this->reportResultsReady(resultCountBefore, resultCountBefore + store.count()); + this->reportResultsReady(resultCountBefore, store.count()); } else { const int insertIndex = store.addResult(index, result); this->reportResultsReady(insertIndex, insertIndex + 1); diff --git a/src/corelib/thread/qorderedmutexlocker_p.h b/src/corelib/thread/qorderedmutexlocker_p.h index 83edfd58..9a9aaefa 100644 --- a/src/corelib/thread/qorderedmutexlocker_p.h +++ b/src/corelib/thread/qorderedmutexlocker_p.h @@ -74,6 +74,28 @@ public: { relock(); } + + Q_DISABLE_COPY(QOrderedMutexLocker) + + void swap(QOrderedMutexLocker &other) noexcept + { + qSwap(this->mtx1, other.mtx1); + qSwap(this->mtx2, other.mtx2); + qSwap(this->locked, other.locked); + } + + QOrderedMutexLocker &operator=(QOrderedMutexLocker &&other) noexcept { + QOrderedMutexLocker moved(std::move(other)); + swap(moved); + return *this; + } + + QOrderedMutexLocker(QOrderedMutexLocker &&other) noexcept + : mtx1(std::exchange(other.mtx1, nullptr)) + , mtx2(std::exchange(other.mtx2, nullptr)) + , locked(std::exchange(other.locked, false)) + {} + ~QOrderedMutexLocker() { unlock(); @@ -88,6 +110,21 @@ public: } } + /*! + \internal + Can be called if the mutexes have been unlocked manually, and sets the + state of the QOrderedMutexLocker to unlocked. + The caller is expected to have unlocked both of them if they + are not the same. Calling this method when the QOrderedMutexLocker is + unlocked or when the provided mutexes have not actually been unlocked is + UB. + */ + void dismiss() + { + Q_ASSERT(locked); + locked = false; + } + void unlock() { if (locked) { @@ -153,11 +190,15 @@ private: class QOrderedMutexLocker { public: + Q_DISABLE_COPY(QOrderedMutexLocker) QOrderedMutexLocker(QBasicMutex *, QBasicMutex *) {} + QOrderedMutexLocker(QOrderedMutexLocker &&) = default; + QOrderedMutexLocker& operator=(QOrderedMutexLocker &&other) = default; ~QOrderedMutexLocker() {} void relock() {} void unlock() {} + void dismiss() {} static bool relock(QBasicMutex *, QBasicMutex *) { return false; } }; diff --git a/src/corelib/thread/qresultstore.cpp b/src/corelib/thread/qresultstore.cpp index 0b82b938..069e2a7a 100644 --- a/src/corelib/thread/qresultstore.cpp +++ b/src/corelib/thread/qresultstore.cpp @@ -185,6 +185,7 @@ int ResultStoreBase::addResult(int index, const void *result) int ResultStoreBase::addResults(int index, const void *results, int vectorSize, int totalCount) { if (m_filterMode == false || vectorSize == totalCount) { + Q_ASSERT(vectorSize != 0); ResultItem resultItem(results, vectorSize); return insertResultItem(index, resultItem); } else { diff --git a/src/corelib/thread/qresultstore.h b/src/corelib/thread/qresultstore.h index 7a650893..f58341cd 100644 --- a/src/corelib/thread/qresultstore.h +++ b/src/corelib/thread/qresultstore.h @@ -151,12 +151,19 @@ public: template int addResults(int index, const QVector *results) { + if (results->empty()) // reject if results are empty + return -1; + return addResults(index, new QVector(*results), results->count(), results->count()); } template int addResults(int index, const QVector *results, int totalCount) { + // reject if results are empty, and nothing is filtered away + if ((m_filterMode == false || results->count() == totalCount) && results->empty()) + return -1; + if (m_filterMode == true && results->count() != totalCount && 0 == results->count()) return addResults(index, nullptr, 0, totalCount); else diff --git a/src/corelib/thread/qsemaphore.cpp b/src/corelib/thread/qsemaphore.cpp index d4fb756b..1d01fc1b 100644 --- a/src/corelib/thread/qsemaphore.cpp +++ b/src/corelib/thread/qsemaphore.cpp @@ -357,47 +357,31 @@ void QSemaphore::release(int n) quintptr prevValue = u.fetchAndAddRelease(nn); if (futexNeedsWake(prevValue)) { #ifdef FUTEX_OP - if (!futexHasWaiterCount) { - /* - On 32-bit systems, all waiters are waiting on the same address, - so we'll wake them all and ask the kernel to clear the high bit. - - atomic { - int oldval = u; - u = oldval & ~(1 << 31); - futexWake(u, INT_MAX); - if (oldval == 0) // impossible condition - futexWake(u, INT_MAX); - } - */ - quint32 op = FUTEX_OP_ANDN | FUTEX_OP_OPARG_SHIFT; - quint32 oparg = 31; - quint32 cmp = FUTEX_OP_CMP_EQ; - quint32 cmparg = 0; - futexWakeOp(u, INT_MAX, INT_MAX, u, FUTEX_OP(op, oparg, cmp, cmparg)); - } else { + if (futexHasWaiterCount) { /* On 64-bit systems, the single-token waiters wait on the low half and the multi-token waiters wait on the upper half. So we ask the kernel to wake up n single-token waiters and all multi-token - waiters (if any), then clear the multi-token wait bit. + waiters (if any), and clear the multi-token wait bit. atomic { int oldval = *upper; - *upper = oldval & ~(1 << 31); + *upper = oldval | 0; futexWake(lower, n); - if (oldval < 0) // sign bit set + if (oldval != 0) // always true futexWake(upper, INT_MAX); } */ - quint32 op = FUTEX_OP_ANDN | FUTEX_OP_OPARG_SHIFT; - quint32 oparg = 31; - quint32 cmp = FUTEX_OP_CMP_LT; + quint32 op = FUTEX_OP_OR; + quint32 oparg = 0; + quint32 cmp = FUTEX_OP_CMP_NE; quint32 cmparg = 0; + u.fetchAndAndRelease(futexNeedsWakeAllBit - 1); futexWakeOp(*futexLow32(&u), n, INT_MAX, *futexHigh32(&u), FUTEX_OP(op, oparg, cmp, cmparg)); + return; } -#else - // Unset the bit and wake everyone. There are two possibibilies +#endif + // Unset the bit and wake everyone. There are two possibilities // under which a thread can set the bit between the AND and the // futexWake: // 1) it did see the new counter value, but it wasn't enough for @@ -405,8 +389,12 @@ void QSemaphore::release(int n) // 2) it did not see the new counter value, in which case its // futexWait will fail. u.fetchAndAndRelease(futexNeedsWakeAllBit - 1); - futexWakeAll(u); -#endif + if (futexHasWaiterCount) { + futexWakeAll(*futexLow32(&u)); + futexWakeAll(*futexHigh32(&u)); + } else { + futexWakeAll(u); + } } return; } diff --git a/src/corelib/thread/qthread_unix.cpp b/src/corelib/thread/qthread_unix.cpp index 659d5fb0..56a8e0a0 100644 --- a/src/corelib/thread/qthread_unix.cpp +++ b/src/corelib/thread/qthread_unix.cpp @@ -300,7 +300,9 @@ void *QThreadPrivate::start(void *arg) thr->d_func()->setPriority(QThread::Priority(thr->d_func()->priority & ~ThreadPriorityResetFlag)); } - data->threadId.storeRelaxed(to_HANDLE(pthread_self())); + // threadId is set in QThread::start() + Q_ASSERT(pthread_equal(from_HANDLE(data->threadId.loadRelaxed()), + pthread_self())); set_thread_data(data); data->ref(); @@ -384,6 +386,8 @@ void QThreadPrivate::finish(void *arg) d->interruptionRequested = false; d->isInFinish = false; + d->data->threadId.storeRelaxed(nullptr); + d->thread_done.wakeAll(); } #ifndef QT_NO_EXCEPTIONS @@ -755,6 +759,8 @@ bool QThread::wait(QDeadlineTimer deadline) if (!d->thread_done.wait(locker.mutex(), deadline)) return false; } + Q_ASSERT(d->data->threadId.loadRelaxed() == nullptr); + return true; } diff --git a/src/corelib/thread/qthreadpool.cpp b/src/corelib/thread/qthreadpool.cpp index 93d0ffe6..40cc6465 100644 --- a/src/corelib/thread/qthreadpool.cpp +++ b/src/corelib/thread/qthreadpool.cpp @@ -195,6 +195,11 @@ bool QThreadPoolPrivate::tryStart(QRunnable *task) ++activeThreads; thread->runnable = task; + + // Ensure that the thread has actually finished, otherwise the following + // start() has no effect. + thread->wait(); + Q_ASSERT(thread->isFinished()); thread->start(); return true; } @@ -788,6 +793,7 @@ bool QThreadPool::contains(const QThread *thread) const const QThreadPoolThread *poolThread = qobject_cast(thread); if (!poolThread) return false; + QMutexLocker locker(&d->mutex); return d->allThreads.contains(const_cast(poolThread)); } diff --git a/src/corelib/time/qcalendar.cpp b/src/corelib/time/qcalendar.cpp index 281fe895..62b32370 100644 --- a/src/corelib/time/qcalendar.cpp +++ b/src/corelib/time/qcalendar.cpp @@ -851,7 +851,7 @@ const QCalendarBackend *QCalendarBackend::fromEnum(QCalendar::System system) This enumerated type is used to specify a choice of calendar system. \value Gregorian The default calendar, used internationally. - \value Julian An ancient Roman calendar with too few leap years. + \value Julian An ancient Roman calendar. \value Milankovic A revised Julian calendar used by some Orthodox churches. \value Jalali The Solar Hijri calendar (also called Persian). \value IslamicCivil The (tabular) Islamic Civil calendar. diff --git a/src/corelib/time/qdatetime.cpp b/src/corelib/time/qdatetime.cpp index bd5995a1..ec12569e 100644 --- a/src/corelib/time/qdatetime.cpp +++ b/src/corelib/time/qdatetime.cpp @@ -1701,22 +1701,25 @@ QT_WARNING_POP return rfcDateImpl(string).date; default: case Qt::TextDate: { + // Accept only "ddd MMM d yyyy" form (in contrast with QDateTime), e.g. "Sun Dec 1 1974" QVector parts = string.splitRef(QLatin1Char(' '), Qt::SkipEmptyParts); - - if (parts.count() != 4) + const int count = parts.count(); + bool ok = count > 3; + int year = ok ? parts.at(count - 1).toInt(&ok) : 0; + int day = ok ? parts.at(count - 2).toInt(&ok) : 0; + if (!ok || !day || !year) return QDate(); - bool ok = false; - int year = parts.at(3).toInt(&ok); - int day = ok ? parts.at(2).toInt(&ok) : 0; - if (!ok || !day) - return QDate(); - - const int month = fromShortMonthName(parts.at(1), year); - if (month == -1) // Month name matches no English or localised name. - return QDate(); - - return QDate(year, month, day); + // Some locales have multi-word month names: + int i = count - 3; + QString monthName = parts.at(i).toString(); + while (i > 0) { + const int month = fromShortMonthName(monthName, year); + if (month > 0) // Month name matches an English or localised name. + return QDate(year, month, day); + monthName = parts.at(--i) + QLatin1Char(' ') + monthName; + } + return QDate(); } case Qt::ISODate: // Semi-strict parsing, must be long enough and have punctuators as separators @@ -5378,49 +5381,66 @@ QT_WARNING_POP case Qt::TextDate: { QVector parts = string.splitRef(QLatin1Char(' '), Qt::SkipEmptyParts); - if ((parts.count() < 5) || (parts.count() > 6)) + const int count = parts.count(); + if (count < 5) return QDateTime(); - // Accept "Sun Dec 1 13:02:00 1974" and "Sun 1. Dec 13:02:00 1974" + // Accept "Sun Dec 1 13:02:00 1974" and "Sun 1. Dec 13:02:00 1974" with + // optional GMT-based zone-suffix, with time and year in either order; + // and some locales have spaces even in short names of months and days. + int tail = count - 1, zonePart = 0; + if (parts.at(tail).startsWith(QLatin1String("GMT"), Qt::CaseInsensitive)) + zonePart = tail--; // Year and time can be in either order. // Guess which by looking for ':' in the time - int yearPart = 3; - int timePart = 3; - if (parts.at(3).contains(QLatin1Char(':'))) - yearPart = 4; - else if (parts.at(4).contains(QLatin1Char(':'))) - timePart = 4; + int yearPart = tail; + int timePart = tail; + if (parts.at(timePart).contains(QLatin1Char(':'))) + yearPart--; + else if (parts.at(timePart - 1).contains(QLatin1Char(':'))) + timePart--; else return QDateTime(); - int month = 0; - int day = 0; - bool ok = false; - - int year = parts.at(yearPart).toInt(&ok); - if (!ok || year == 0) - return QDateTime(); - - // Next try month then day - month = fromShortMonthName(parts.at(1), year); - if (month) - day = parts.at(2).toInt(&ok); - - // If failed, try day then month - if (!ok || !month || !day) { - month = fromShortMonthName(parts.at(2), year); - if (month) { - QStringRef dayStr = parts.at(1); - if (dayStr.endsWith(QLatin1Char('.'))) { - dayStr = dayStr.left(dayStr.size() - 1); - day = dayStr.toInt(&ok); - } - } + int dayPart = tail - 2; // but may be earlier, with a comma after: + for (int i = 1; i < dayPart; i++) { + if (parts.at(i).endsWith(QLatin1Char('.'))) + dayPart = i; // exits the loop } - // If both failed, give up - if (!ok || !month || !day) + bool ok = false; + int year = parts.at(yearPart).toInt(&ok); + int day = 0; + + if (ok && year) { + QStringRef dayStr = parts.at(dayPart); + if (dayStr.endsWith(QLatin1Char('.'))) + dayStr.chop(1); + day = dayStr.toInt(&ok); + } + if (!ok || !year || !day) + return QDateTime(); + + int month = 0; + if (dayPart < tail - 2) { + // Easy case, month is the parts from dayPart + 1 to count - 3 + int i = dayPart + 1; + QString monthName = parts.at(i).toString(); + while (++i < tail - 1) + monthName += QLatin1Char(' ') + parts.at(i); + month = fromShortMonthName(monthName, year); + } else { + int i = dayPart - 1; + QString monthName = parts.at(i).toString(); + while (i > 0) { + month = fromShortMonthName(monthName, year); + if (month > 0) + break; + monthName = parts.at(--i) + QLatin1Char(' ') + monthName; + } + } + if (month <= 0) return QDateTime(); QDate date(year, month, day); @@ -5464,21 +5484,15 @@ QT_WARNING_POP if (!time.isValid()) return QDateTime(); - if (parts.count() == 5) + if (!zonePart) return QDateTime(date, time, Qt::LocalTime); - QStringView tz = parts.at(5); - if (!tz.startsWith(QLatin1String("GMT"), Qt::CaseInsensitive)) - return QDateTime(); - tz = tz.mid(3); - if (!tz.isEmpty()) { - int offset = fromOffsetString(tz, &ok); - if (!ok) - return QDateTime(); - return QDateTime(date, time, Qt::OffsetFromUTC, offset); - } else { + const QStringView tz = parts.at(zonePart).mid(3); + if (tz.isEmpty()) return QDateTime(date, time, Qt::UTC); - } + + int offset = fromOffsetString(tz, &ok); + return ok ? QDateTime(date, time, Qt::OffsetFromUTC, offset) : QDateTime(); } } diff --git a/src/corelib/time/qdatetimeparser.cpp b/src/corelib/time/qdatetimeparser.cpp index 68ec73f4..c5e0493d 100644 --- a/src/corelib/time/qdatetimeparser.cpp +++ b/src/corelib/time/qdatetimeparser.cpp @@ -1385,21 +1385,34 @@ QDateTimeParser::scanString(const QDateTime &defaultValue, // If hour wasn't specified, check the default we're using exists on the // given date (which might be a spring-forward, skipping an hour). - if (parserType == QMetaType::QDateTime && !(isSet & HourSectionMask) && !when.isValid()) { - qint64 msecs = when.toMSecsSinceEpoch(); - // Fortunately, that gets a useful answer, even though when is invalid ... - const QDateTime replace = + if (!(isSet & HourSectionMask) && !when.isValid()) { + switch (parserType) { + case QMetaType::QDateTime: { + qint64 msecs = when.toMSecsSinceEpoch(); + // Fortunately, that gets a useful answer, even though when is invalid ... + const QDateTime replace = #if QT_CONFIG(timezone) - tspec == Qt::TimeZone - ? QDateTime::fromMSecsSinceEpoch(msecs, timeZone) : + tspec == Qt::TimeZone ? QDateTime::fromMSecsSinceEpoch(msecs, timeZone) : #endif - QDateTime::fromMSecsSinceEpoch(msecs, tspec, zoneOffset); - const QTime tick = replace.time(); - if (replace.date() == date - && (!(isSet & MinuteSection) || tick.minute() == minute) - && (!(isSet & SecondSection) || tick.second() == second) - && (!(isSet & MSecSection) || tick.msec() == msec)) { - return StateNode(replace, state, padding, conflicts); + QDateTime::fromMSecsSinceEpoch(msecs, tspec, zoneOffset); + const QTime tick = replace.time(); + if (replace.date() == date + && (!(isSet & MinuteSection) || tick.minute() == minute) + && (!(isSet & SecondSection) || tick.second() == second) + && (!(isSet & MSecSection) || tick.msec() == msec)) { + return StateNode(replace, state, padding, conflicts); + } + } break; + case QMetaType::QDate: + // Don't care about time, so just use start of day (and ignore spec): + return StateNode(date.startOfDay(Qt::UTC), state, padding, conflicts); + break; + case QMetaType::QTime: + // Don't care about date or spec, so pick a safe spec: + return StateNode(QDateTime(date, time, Qt::UTC), state, padding, conflicts); + default: + Q_UNREACHABLE(); + return StateNode(); } } @@ -1737,6 +1750,24 @@ QDateTimeParser::findTimeZoneName(QStringRef str, const QDateTime &when) const int index = std::distance(str.cbegin(), std::find_if(str.cbegin(), str.cend(), invalidZoneNameCharacter)); + // Limit name fragments (between slashes) to 20 characters. + // (Valid time-zone IDs are allowed up to 14 and Android has quirks up to 17.) + // Limit number of fragments to six; no known zone name has more than four. + int lastSlash = -1; + int count = 0; + Q_ASSERT(index <= str.size()); + while (lastSlash < index) { + int slash = str.indexOf(QLatin1Char('/'), lastSlash + 1); + if (slash < 0) + slash = index; // i.e. the end of the candidate text + else if (++count > 5) + index = slash; // Truncate + if (slash - lastSlash > 20) + index = lastSlash + 20; // Truncate + // If any of those conditions was met, index <= slash, so this exits the loop: + lastSlash = slash; + } + for (; index > systemLength; --index) { // Find longest match str.truncate(index); QTimeZone zone(str.toLatin1()); diff --git a/src/corelib/time/qhijricalendar_data_p.h b/src/corelib/time/qhijricalendar_data_p.h index 0083e6b3..96f6a3a1 100644 --- a/src/corelib/time/qhijricalendar_data_p.h +++ b/src/corelib/time/qhijricalendar_data_p.h @@ -59,8 +59,8 @@ QT_BEGIN_NAMESPACE // GENERATED PART STARTS HERE /* - This part of the file was generated on 2020-11-09 from the - Common Locale Data Repository v38 + This part of the file was generated on 2021-04-26 from the + Common Locale Data Repository v39 http://www.unicode.org/cldr/ @@ -505,7 +505,7 @@ static const QCalendarLocale locale_data[] = { { 138, 7, 157,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Yoruba/Latin/Nigeria { 138, 7, 23,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Yoruba/Latin/Benin { 140, 7, 195,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Zulu/Latin/South Africa - { 141, 7, 161,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Norwegian Nynorsk/Latin/Norway + { 141, 7, 161,{ 5041,79 },{ 5120,107 },{ 215,27 },{ 5227,79 },{ 5120,107 },{ 215,27 }}, // Norwegian Nynorsk/Latin/Norway { 142, 7, 27,{ 10423,75 },{ 10498,100 },{ 215,27 },{ 10423,75 },{ 10498,100 },{ 215,27 }}, // Bosnian/Latin/Bosnia And Herzegowina { 142, 2, 27,{ 6638,70 },{ 6708,91 },{ 215,27 },{ 6638,70 },{ 6799,98 },{ 215,27 }}, // Bosnian/Cyrillic/Bosnia And Herzegowina { 143, 29, 131,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Divehi/Thaana/Maldives diff --git a/src/corelib/time/qjalalicalendar_data_p.h b/src/corelib/time/qjalalicalendar_data_p.h index 202b5f98..b9d0d219 100644 --- a/src/corelib/time/qjalalicalendar_data_p.h +++ b/src/corelib/time/qjalalicalendar_data_p.h @@ -59,8 +59,8 @@ QT_BEGIN_NAMESPACE // GENERATED PART STARTS HERE /* - This part of the file was generated on 2020-11-09 from the - Common Locale Data Repository v38 + This part of the file was generated on 2021-04-26 from the + Common Locale Data Repository v39 http://www.unicode.org/cldr/ @@ -505,7 +505,7 @@ static const QCalendarLocale locale_data[] = { { 138, 7, 157,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Yoruba/Latin/Nigeria { 138, 7, 23,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Yoruba/Latin/Benin { 140, 7, 195,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Zulu/Latin/South Africa - { 141, 7, 161,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Norwegian Nynorsk/Latin/Norway + { 141, 7, 161,{ 682,84 },{ 682,84 },{ 185,27 },{ 682,84 },{ 682,84 },{ 185,27 }}, // Norwegian Nynorsk/Latin/Norway { 142, 7, 27,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Bosnian/Latin/Bosnia And Herzegowina { 142, 2, 27,{ 3275,81 },{ 3275,81 },{ 185,27 },{ 3275,81 },{ 3275,81 },{ 185,27 }}, // Bosnian/Cyrillic/Bosnia And Herzegowina { 143, 29, 131,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Divehi/Thaana/Maldives diff --git a/src/corelib/time/qromancalendar_data_p.h b/src/corelib/time/qromancalendar_data_p.h index 465ea683..0d9b60d8 100644 --- a/src/corelib/time/qromancalendar_data_p.h +++ b/src/corelib/time/qromancalendar_data_p.h @@ -59,7 +59,7 @@ QT_BEGIN_NAMESPACE // GENERATED PART STARTS HERE /* - This part of the file was generated on 2020-11-09 from the + This part of the file was generated on 2021-04-26 from the Common Locale Data Repository v38 http://www.unicode.org/cldr/ diff --git a/src/corelib/time/qtimezoneprivate.cpp b/src/corelib/time/qtimezoneprivate.cpp index b2fae3cc..244ebbb0 100644 --- a/src/corelib/time/qtimezoneprivate.cpp +++ b/src/corelib/time/qtimezoneprivate.cpp @@ -356,26 +356,33 @@ QTimeZonePrivate::Data QTimeZonePrivate::dataForLocalTime(qint64 forLocalMSecs, // Check we do *really* have transitions for this zone: if (tran.atMSecsSinceEpoch != invalidMSecs()) { - - /* - So now tran is definitely before and nextTran is either after or only - slightly before. One is standard time; we interpret the other as DST - (although the transition might in fact by a change in standard offset). Our - hint tells us which of those to use (defaulting to standard if no hint): try - it first; if that fails, try the other; if both fail, life's tricky. - */ + /* So now tran is definitely before ... */ Q_ASSERT(forLocalMSecs < 0 || forLocalMSecs - tran.offsetFromUtc * 1000 > tran.atMSecsSinceEpoch); - const qint64 nextStart = nextTran.atMSecsSinceEpoch; - // Work out the UTC values it might make sense to return: - nextTran.atMSecsSinceEpoch = forLocalMSecs - nextTran.offsetFromUtc * 1000; + // Work out the UTC value it would make sense to return if using tran: tran.atMSecsSinceEpoch = forLocalMSecs - tran.offsetFromUtc * 1000; + // If we know of no transition after it, the answer is easy: + const qint64 nextStart = nextTran.atMSecsSinceEpoch; + if (nextStart == invalidMSecs()) + return tran; + + /* + ... and nextTran is either after or only slightly before. We're + going to interpret one as standard time, the other as DST + (although the transition might in fact be a change in standard + offset, or a change in DST offset, e.g. to/from double-DST). Our + hint tells us which of those to use (defaulting to standard if no + hint): try it first; if that fails, try the other; if both fail, + life's tricky. + */ + // Work out the UTC value it would make sense to return if using nextTran: + nextTran.atMSecsSinceEpoch = forLocalMSecs - nextTran.offsetFromUtc * 1000; // If both or neither have zero DST, treat the one with lower offset as standard: const bool nextIsDst = !nextTran.daylightTimeOffset == !tran.daylightTimeOffset ? tran.offsetFromUtc < nextTran.offsetFromUtc : nextTran.daylightTimeOffset; // If that agrees with hint > 0, our first guess is to use nextTran; else tran. - const bool nextFirst = nextIsDst == (hint > 0) && nextStart != invalidMSecs(); + const bool nextFirst = nextIsDst == (hint > 0); for (int i = 0; i < 2; i++) { /* On the first pass, the case we consider is what hint told us to expect @@ -384,12 +391,11 @@ QTimeZonePrivate::Data QTimeZonePrivate::dataForLocalTime(qint64 forLocalMSecs, by which time the second case, that we're trying, is likely right. */ if (nextFirst ? i == 0 : i) { - Q_ASSERT(nextStart != invalidMSecs()); if (nextStart <= nextTran.atMSecsSinceEpoch) return nextTran; } else { // If next is invalid, nextFirst is false, to route us here first: - if (nextStart == invalidMSecs() || nextStart > tran.atMSecsSinceEpoch) + if (nextStart > tran.atMSecsSinceEpoch) return tran; } } diff --git a/src/corelib/time/qtimezoneprivate_data_p.h b/src/corelib/time/qtimezoneprivate_data_p.h index 8f161f25..540b8145 100644 --- a/src/corelib/time/qtimezoneprivate_data_p.h +++ b/src/corelib/time/qtimezoneprivate_data_p.h @@ -115,8 +115,8 @@ struct QUtcData { // GENERATED PART STARTS HERE /* - This part of the file was generated on 2021-01-27 from the - Common Locale Data Repository v38.1 file supplemental/windowsZones.xml + This part of the file was generated on 2021-04-26 from the + Common Locale Data Repository v39 file supplemental/windowsZones.xml http://www.unicode.org/cldr/ @@ -215,283 +215,284 @@ static const QZoneData zoneDataTable[] = { { 36, 194, 2061 }, // E. Africa Standard Time / Somalia { 36, 210, 2078 }, // E. Africa Standard Time / Tanzania { 36, 221, 2099 }, // E. Africa Standard Time / Uganda - { 36, 254, 2114 }, // E. Africa Standard Time / South Sudan - { 37, 13, 2126 }, // E. Australia Standard Time / Australia - { 38, 141, 2164 }, // E. Europe Standard Time / Moldova - { 39, 30, 2180 }, // E. South America Standard Time / Brazil - { 40, 43, 2198 }, // Easter Island Standard Time / Chile - { 41, 0, 2213 }, // Eastern Standard Time / AnyCountry - { 41, 16, 2221 }, // Eastern Standard Time / Bahamas - { 41, 38, 2236 }, // Eastern Standard Time / Canada - { 41, 225, 2341 }, // Eastern Standard Time / United States - { 42, 139, 2498 }, // Eastern Standard Time (Mexico) / Mexico - { 43, 64, 2513 }, // Egypt Standard Time / Egypt - { 44, 178, 2526 }, // Ekaterinburg Standard Time / Russia - { 45, 72, 2545 }, // Fiji Standard Time / Fiji - { 46, 33, 2558 }, // FLE Standard Time / Bulgaria - { 46, 68, 2571 }, // FLE Standard Time / Estonia - { 46, 73, 2586 }, // FLE Standard Time / Finland - { 46, 118, 2602 }, // FLE Standard Time / Latvia - { 46, 124, 2614 }, // FLE Standard Time / Lithuania - { 46, 222, 2629 }, // FLE Standard Time / Ukraine - { 46, 248, 2675 }, // FLE Standard Time / Aland Islands - { 47, 81, 2692 }, // Georgian Standard Time / Georgia - { 48, 71, 2705 }, // GMT Standard Time / Faroe Islands - { 48, 75, 2721 }, // GMT Standard Time / Guernsey - { 48, 104, 2737 }, // GMT Standard Time / Ireland - { 48, 173, 2751 }, // GMT Standard Time / Portugal - { 48, 197, 2782 }, // GMT Standard Time / Spain - { 48, 224, 2798 }, // GMT Standard Time / United Kingdom - { 48, 251, 2812 }, // GMT Standard Time / Isle Of Man - { 48, 252, 2831 }, // GMT Standard Time / Jersey - { 49, 86, 2845 }, // Greenland Standard Time / Greenland - { 50, 34, 2861 }, // Greenwich Standard Time / Burkina Faso - { 50, 53, 2880 }, // Greenwich Standard Time / Ivory Coast - { 50, 80, 2895 }, // Greenwich Standard Time / Gambia - { 50, 83, 2909 }, // Greenwich Standard Time / Ghana - { 50, 91, 2922 }, // Greenwich Standard Time / Guinea - { 50, 92, 2937 }, // Greenwich Standard Time / Guinea Bissau - { 50, 99, 2951 }, // Greenwich Standard Time / Iceland - { 50, 121, 2970 }, // Greenwich Standard Time / Liberia - { 50, 132, 2986 }, // Greenwich Standard Time / Mali - { 50, 136, 3000 }, // Greenwich Standard Time / Mauritania - { 50, 187, 3018 }, // Greenwich Standard Time / Senegal - { 50, 189, 3031 }, // Greenwich Standard Time / Sierra Leone - { 50, 199, 3047 }, // Greenwich Standard Time / Saint Helena - { 50, 212, 3066 }, // Greenwich Standard Time / Togo - { 51, 56, 3078 }, // GTB Standard Time / Cyprus - { 51, 85, 3106 }, // GTB Standard Time / Greece - { 51, 177, 3120 }, // GTB Standard Time / Romania - { 52, 94, 3137 }, // Haiti Standard Time / Haiti - { 53, 0, 3160 }, // Hawaiian Standard Time / AnyCountry - { 53, 51, 3171 }, // Hawaiian Standard Time / Cook Islands - { 53, 77, 3189 }, // Hawaiian Standard Time / French Polynesia - { 53, 225, 3204 }, // Hawaiian Standard Time / United States - { 53, 226, 3221 }, // Hawaiian Standard Time / United States Minor Outlying Islands - { 54, 100, 3238 }, // India Standard Time / India - { 55, 102, 3252 }, // Iran Standard Time / Iran - { 56, 105, 3264 }, // Israel Standard Time / Israel - { 57, 109, 3279 }, // Jordan Standard Time / Jordan - { 58, 178, 3290 }, // Kaliningrad Standard Time / Russia - { 59, 114, 3309 }, // Korea Standard Time / South Korea - { 60, 122, 3320 }, // Libya Standard Time / Libya - { 61, 0, 3335 }, // Line Islands Standard Time / AnyCountry - { 61, 112, 3346 }, // Line Islands Standard Time / Kiribati - { 62, 13, 3365 }, // Lord Howe Standard Time / Australia - { 63, 178, 3385 }, // Magadan Standard Time / Russia - { 64, 43, 3398 }, // Magallanes Standard Time / Chile - { 65, 77, 3419 }, // Marquesas Standard Time / French Polynesia - { 66, 137, 3437 }, // Mauritius Standard Time / Mauritius - { 66, 176, 3454 }, // Mauritius Standard Time / Reunion - { 66, 188, 3469 }, // Mauritius Standard Time / Seychelles - { 67, 119, 3481 }, // Middle East Standard Time / Lebanon - { 68, 227, 3493 }, // Montevideo Standard Time / Uruguay - { 69, 145, 3512 }, // Morocco Standard Time / Morocco - { 69, 236, 3530 }, // Morocco Standard Time / Western Sahara - { 70, 139, 3546 }, // Mountain Standard Time (Mexico) / Mexico - { 71, 0, 3581 }, // Mountain Standard Time / AnyCountry - { 71, 38, 3589 }, // Mountain Standard Time / Canada - { 71, 139, 3663 }, // Mountain Standard Time / Mexico - { 71, 225, 3679 }, // Mountain Standard Time / United States - { 72, 46, 3708 }, // Myanmar Standard Time / Cocos Islands - { 72, 147, 3721 }, // Myanmar Standard Time / Myanmar - { 73, 178, 3734 }, // N. Central Asia Standard Time / Russia - { 74, 148, 3751 }, // Namibia Standard Time / Namibia - { 75, 150, 3767 }, // Nepal Standard Time / Nepal - { 76, 8, 3781 }, // New Zealand Standard Time / Antarctica - { 76, 154, 3800 }, // New Zealand Standard Time / New Zealand - { 77, 38, 3817 }, // Newfoundland Standard Time / Canada - { 78, 159, 3834 }, // Norfolk Standard Time / Norfolk Island - { 79, 178, 3850 }, // North Asia East Standard Time / Russia - { 80, 178, 3863 }, // North Asia Standard Time / Russia - { 81, 113, 3898 }, // North Korea Standard Time / North Korea - { 82, 178, 3913 }, // Omsk Standard Time / Russia - { 83, 43, 3923 }, // Pacific SA Standard Time / Chile - { 84, 0, 3940 }, // Pacific Standard Time / AnyCountry - { 84, 38, 3948 }, // Pacific Standard Time / Canada - { 84, 225, 3966 }, // Pacific Standard Time / United States - { 85, 139, 3986 }, // Pacific Standard Time (Mexico) / Mexico - { 86, 163, 4023 }, // Pakistan Standard Time / Pakistan - { 87, 168, 4036 }, // Paraguay Standard Time / Paraguay - { 88, 110, 4053 }, // Qyzylorda Standard Time / Kazakhstan - { 89, 21, 4068 }, // Romance Standard Time / Belgium - { 89, 58, 4084 }, // Romance Standard Time / Denmark - { 89, 74, 4102 }, // Romance Standard Time / France - { 89, 197, 4115 }, // Romance Standard Time / Spain - { 90, 178, 4142 }, // Russia Time Zone 3 / Russia - { 91, 178, 4156 }, // Russia Time Zone 10 / Russia - { 92, 178, 4175 }, // Russia Time Zone 11 / Russia - { 93, 178, 4202 }, // Russian Standard Time / Russia - { 93, 222, 4229 }, // Russian Standard Time / Ukraine - { 94, 0, 4247 }, // SA Eastern Standard Time / AnyCountry - { 94, 8, 4257 }, // SA Eastern Standard Time / Antarctica - { 94, 30, 4294 }, // SA Eastern Standard Time / Brazil - { 94, 70, 4373 }, // SA Eastern Standard Time / Falkland Islands - { 94, 76, 4390 }, // SA Eastern Standard Time / French Guiana - { 94, 202, 4406 }, // SA Eastern Standard Time / Suriname - { 95, 0, 4425 }, // SA Pacific Standard Time / AnyCountry - { 95, 30, 4435 }, // SA Pacific Standard Time / Brazil - { 95, 38, 4471 }, // SA Pacific Standard Time / Canada - { 95, 40, 4493 }, // SA Pacific Standard Time / Cayman Islands - { 95, 47, 4508 }, // SA Pacific Standard Time / Colombia - { 95, 63, 4523 }, // SA Pacific Standard Time / Ecuador - { 95, 107, 4541 }, // SA Pacific Standard Time / Jamaica - { 95, 166, 4557 }, // SA Pacific Standard Time / Panama - { 95, 169, 4572 }, // SA Pacific Standard Time / Peru - { 96, 0, 4585 }, // SA Western Standard Time / AnyCountry - { 96, 7, 4595 }, // SA Western Standard Time / Anguilla - { 96, 9, 4612 }, // SA Western Standard Time / Antigua And Barbuda - { 96, 12, 4628 }, // SA Western Standard Time / Aruba - { 96, 19, 4642 }, // SA Western Standard Time / Barbados - { 96, 26, 4659 }, // SA Western Standard Time / Bolivia - { 96, 30, 4674 }, // SA Western Standard Time / Brazil - { 96, 38, 4727 }, // SA Western Standard Time / Canada - { 96, 60, 4748 }, // SA Western Standard Time / Dominica - { 96, 61, 4765 }, // SA Western Standard Time / Dominican Republic - { 96, 87, 4787 }, // SA Western Standard Time / Grenada - { 96, 88, 4803 }, // SA Western Standard Time / Guadeloupe - { 96, 93, 4822 }, // SA Western Standard Time / Guyana - { 96, 135, 4837 }, // SA Western Standard Time / Martinique - { 96, 144, 4856 }, // SA Western Standard Time / Montserrat - { 96, 152, 4875 }, // SA Western Standard Time / Cura Sao - { 96, 174, 4891 }, // SA Western Standard Time / Puerto Rico - { 96, 180, 4911 }, // SA Western Standard Time / Saint Kitts And Nevis - { 96, 181, 4928 }, // SA Western Standard Time / Saint Lucia - { 96, 182, 4945 }, // SA Western Standard Time / Saint Vincent And The Grenadines - { 96, 215, 4964 }, // SA Western Standard Time / Trinidad And Tobago - { 96, 233, 4986 }, // SA Western Standard Time / British Virgin Islands - { 96, 234, 5002 }, // SA Western Standard Time / United States Virgin Islands - { 96, 244, 5020 }, // SA Western Standard Time / Saint Barthelemy - { 96, 245, 5042 }, // SA Western Standard Time / Saint Martin - { 96, 255, 5058 }, // SA Western Standard Time / Bonaire - { 96, 256, 5077 }, // SA Western Standard Time / Sint Maarten - { 97, 200, 5099 }, // Saint Pierre Standard Time / Saint Pierre And Miquelon - { 98, 178, 5116 }, // Sakhalin Standard Time / Russia - { 99, 183, 5130 }, // Samoa Standard Time / Samoa - { 100, 185, 5143 }, // Sao Tome Standard Time / Sao Tome And Principe - { 101, 178, 5159 }, // Saratov Standard Time / Russia - { 102, 0, 5174 }, // SE Asia Standard Time / AnyCountry - { 102, 8, 5184 }, // SE Asia Standard Time / Antarctica - { 102, 36, 5201 }, // SE Asia Standard Time / Cambodia - { 102, 45, 5217 }, // SE Asia Standard Time / Christmas Island - { 102, 101, 5234 }, // SE Asia Standard Time / Indonesia - { 102, 117, 5262 }, // SE Asia Standard Time / Laos - { 102, 211, 5277 }, // SE Asia Standard Time / Thailand - { 102, 232, 5290 }, // SE Asia Standard Time / Vietnam - { 103, 0, 5302 }, // Singapore Standard Time / AnyCountry - { 103, 32, 5312 }, // Singapore Standard Time / Brunei - { 103, 101, 5324 }, // Singapore Standard Time / Indonesia - { 103, 130, 5338 }, // Singapore Standard Time / Malaysia - { 103, 170, 5369 }, // Singapore Standard Time / Philippines - { 103, 190, 5381 }, // Singapore Standard Time / Singapore - { 104, 0, 5396 }, // South Africa Standard Time / AnyCountry - { 104, 28, 5406 }, // South Africa Standard Time / Botswana - { 104, 35, 5422 }, // South Africa Standard Time / Burundi - { 104, 49, 5439 }, // South Africa Standard Time / Congo Kinshasa - { 104, 120, 5457 }, // South Africa Standard Time / Lesotho - { 104, 129, 5471 }, // South Africa Standard Time / Malawi - { 104, 146, 5487 }, // South Africa Standard Time / Mozambique - { 104, 179, 5501 }, // South Africa Standard Time / Rwanda - { 104, 195, 5515 }, // South Africa Standard Time / South Africa - { 104, 204, 5535 }, // South Africa Standard Time / Swaziland - { 104, 239, 5550 }, // South Africa Standard Time / Zambia - { 104, 240, 5564 }, // South Africa Standard Time / Zimbabwe - { 105, 198, 5578 }, // Sri Lanka Standard Time / Sri Lanka - { 106, 201, 5591 }, // Sudan Standard Time / Sudan - { 107, 207, 5607 }, // Syria Standard Time / Syria - { 108, 208, 5621 }, // Taipei Standard Time / Taiwan - { 109, 13, 5633 }, // Tasmania Standard Time / Australia - { 110, 30, 5688 }, // Tocantins Standard Time / Brazil - { 111, 0, 5706 }, // Tokyo Standard Time / AnyCountry - { 111, 62, 5716 }, // Tokyo Standard Time / East Timor - { 111, 101, 5726 }, // Tokyo Standard Time / Indonesia - { 111, 108, 5740 }, // Tokyo Standard Time / Japan - { 111, 164, 5751 }, // Tokyo Standard Time / Palau - { 112, 178, 5765 }, // Tomsk Standard Time / Russia - { 113, 214, 5776 }, // Tonga Standard Time / Tonga - { 114, 178, 5794 }, // Transbaikal Standard Time / Russia - { 115, 217, 5805 }, // Turkey Standard Time / Turkey - { 116, 219, 5821 }, // Turks And Caicos Standard Time / Turks And Caicos Islands - { 117, 143, 5840 }, // Ulaanbaatar Standard Time / Mongolia - { 118, 225, 5873 }, // US Eastern Standard Time / United States - { 119, 0, 5940 }, // US Mountain Standard Time / AnyCountry - { 119, 139, 5950 }, // US Mountain Standard Time / Mexico - { 119, 225, 5969 }, // US Mountain Standard Time / United States - { 120, 0, 5985 }, // UTC-11 / AnyCountry - { 120, 4, 5996 }, // UTC-11 / American Samoa - { 120, 158, 6014 }, // UTC-11 / Niue - { 120, 226, 6027 }, // UTC-11 / United States Minor Outlying Islands - { 121, 0, 6042 }, // UTC-09 / AnyCountry - { 121, 77, 6052 }, // UTC-09 / French Polynesia - { 122, 0, 6068 }, // UTC-08 / AnyCountry - { 122, 171, 6078 }, // UTC-08 / Pitcairn - { 123, 0, 6095 }, // UTC-02 / AnyCountry - { 123, 30, 6105 }, // UTC-02 / Brazil - { 123, 196, 6121 }, // UTC-02 / South Georgia And The South Sandwich Islands - { 124, 0, 6144 }, // UTC / AnyCountry - { 124, 86, 6160 }, // UTC / Greenland - { 125, 0, 6181 }, // UTC+12 / AnyCountry - { 125, 112, 6192 }, // UTC+12 / Kiribati - { 125, 134, 6207 }, // UTC+12 / Marshall Islands - { 125, 149, 6240 }, // UTC+12 / Nauru - { 125, 220, 6254 }, // UTC+12 / Tuvalu - { 125, 226, 6271 }, // UTC+12 / United States Minor Outlying Islands - { 125, 235, 6284 }, // UTC+12 / Wallis And Futuna Islands - { 126, 0, 6299 }, // UTC+13 / AnyCountry - { 126, 112, 6310 }, // UTC+13 / Kiribati - { 126, 213, 6328 }, // UTC+13 / Tokelau - { 127, 231, 6344 }, // Venezuela Standard Time / Venezuela - { 128, 178, 6360 }, // Vladivostok Standard Time / Russia - { 129, 178, 6391 }, // Volgograd Standard Time / Russia - { 130, 13, 6408 }, // W. Australia Standard Time / Australia - { 131, 0, 6424 }, // W. Central Africa Standard Time / AnyCountry - { 131, 3, 6434 }, // W. Central Africa Standard Time / Algeria - { 131, 6, 6449 }, // W. Central Africa Standard Time / Angola - { 131, 23, 6463 }, // W. Central Africa Standard Time / Benin - { 131, 37, 6481 }, // W. Central Africa Standard Time / Cameroon - { 131, 41, 6495 }, // W. Central Africa Standard Time / Central African Republic - { 131, 42, 6509 }, // W. Central Africa Standard Time / Chad - { 131, 49, 6525 }, // W. Central Africa Standard Time / Congo Kinshasa - { 131, 50, 6541 }, // W. Central Africa Standard Time / Congo Brazzaville - { 131, 66, 6560 }, // W. Central Africa Standard Time / Equatorial Guinea - { 131, 79, 6574 }, // W. Central Africa Standard Time / Gabon - { 131, 156, 6592 }, // W. Central Africa Standard Time / Niger - { 131, 157, 6606 }, // W. Central Africa Standard Time / Nigeria - { 131, 216, 6619 }, // W. Central Africa Standard Time / Tunisia - { 132, 5, 6632 }, // W. Europe Standard Time / Andorra - { 132, 14, 6647 }, // W. Europe Standard Time / Austria - { 132, 82, 6661 }, // W. Europe Standard Time / Germany - { 132, 84, 6691 }, // W. Europe Standard Time / Gibraltar - { 132, 106, 6708 }, // W. Europe Standard Time / Italy - { 132, 123, 6720 }, // W. Europe Standard Time / Liechtenstein - { 132, 125, 6733 }, // W. Europe Standard Time / Luxembourg - { 132, 133, 6751 }, // W. Europe Standard Time / Malta - { 132, 142, 6764 }, // W. Europe Standard Time / Monaco - { 132, 151, 6778 }, // W. Europe Standard Time / Netherlands - { 132, 161, 6795 }, // W. Europe Standard Time / Norway - { 132, 184, 6807 }, // W. Europe Standard Time / San Marino - { 132, 203, 6825 }, // W. Europe Standard Time / Svalbard And Jan Mayen Islands - { 132, 205, 6845 }, // W. Europe Standard Time / Sweden - { 132, 206, 6862 }, // W. Europe Standard Time / Switzerland - { 132, 230, 6876 }, // W. Europe Standard Time / Vatican City State - { 133, 143, 6891 }, // W. Mongolia Standard Time / Mongolia - { 134, 0, 6901 }, // West Asia Standard Time / AnyCountry - { 134, 8, 6911 }, // West Asia Standard Time / Antarctica - { 134, 78, 6929 }, // West Asia Standard Time / French Southern Territories - { 134, 110, 6946 }, // West Asia Standard Time / Kazakhstan - { 134, 131, 6991 }, // West Asia Standard Time / Maldives - { 134, 209, 7007 }, // West Asia Standard Time / Tajikistan - { 134, 218, 7021 }, // West Asia Standard Time / Turkmenistan - { 134, 228, 7035 }, // West Asia Standard Time / Uzbekistan - { 135, 165, 7064 }, // West Bank Standard Time / Palestinian Territories - { 136, 0, 7086 }, // West Pacific Standard Time / AnyCountry - { 136, 8, 7097 }, // West Pacific Standard Time / Antarctica - { 136, 89, 7123 }, // West Pacific Standard Time / Guam - { 136, 140, 7136 }, // West Pacific Standard Time / Micronesia - { 136, 160, 7149 }, // West Pacific Standard Time / Northern Mariana Islands - { 136, 167, 7164 }, // West Pacific Standard Time / Papua New Guinea - { 137, 178, 7185 }, // Yakutsk Standard Time / Russia - { 138, 38, 7212 }, // Yukon Standard Time / Canada + { 37, 13, 2114 }, // E. Australia Standard Time / Australia + { 38, 141, 2152 }, // E. Europe Standard Time / Moldova + { 39, 30, 2168 }, // E. South America Standard Time / Brazil + { 40, 43, 2186 }, // Easter Island Standard Time / Chile + { 41, 0, 2201 }, // Eastern Standard Time / AnyCountry + { 41, 16, 2209 }, // Eastern Standard Time / Bahamas + { 41, 38, 2224 }, // Eastern Standard Time / Canada + { 41, 225, 2329 }, // Eastern Standard Time / United States + { 42, 139, 2486 }, // Eastern Standard Time (Mexico) / Mexico + { 43, 64, 2501 }, // Egypt Standard Time / Egypt + { 44, 178, 2514 }, // Ekaterinburg Standard Time / Russia + { 45, 72, 2533 }, // Fiji Standard Time / Fiji + { 46, 33, 2546 }, // FLE Standard Time / Bulgaria + { 46, 68, 2559 }, // FLE Standard Time / Estonia + { 46, 73, 2574 }, // FLE Standard Time / Finland + { 46, 118, 2590 }, // FLE Standard Time / Latvia + { 46, 124, 2602 }, // FLE Standard Time / Lithuania + { 46, 222, 2617 }, // FLE Standard Time / Ukraine + { 46, 248, 2663 }, // FLE Standard Time / Aland Islands + { 47, 81, 2680 }, // Georgian Standard Time / Georgia + { 48, 71, 2693 }, // GMT Standard Time / Faroe Islands + { 48, 75, 2709 }, // GMT Standard Time / Guernsey + { 48, 104, 2725 }, // GMT Standard Time / Ireland + { 48, 173, 2739 }, // GMT Standard Time / Portugal + { 48, 197, 2770 }, // GMT Standard Time / Spain + { 48, 224, 2786 }, // GMT Standard Time / United Kingdom + { 48, 251, 2800 }, // GMT Standard Time / Isle Of Man + { 48, 252, 2819 }, // GMT Standard Time / Jersey + { 49, 86, 2833 }, // Greenland Standard Time / Greenland + { 50, 34, 2849 }, // Greenwich Standard Time / Burkina Faso + { 50, 53, 2868 }, // Greenwich Standard Time / Ivory Coast + { 50, 80, 2883 }, // Greenwich Standard Time / Gambia + { 50, 83, 2897 }, // Greenwich Standard Time / Ghana + { 50, 86, 2910 }, // Greenwich Standard Time / Greenland + { 50, 91, 2931 }, // Greenwich Standard Time / Guinea + { 50, 92, 2946 }, // Greenwich Standard Time / Guinea Bissau + { 50, 99, 2960 }, // Greenwich Standard Time / Iceland + { 50, 121, 2979 }, // Greenwich Standard Time / Liberia + { 50, 132, 2995 }, // Greenwich Standard Time / Mali + { 50, 136, 3009 }, // Greenwich Standard Time / Mauritania + { 50, 187, 3027 }, // Greenwich Standard Time / Senegal + { 50, 189, 3040 }, // Greenwich Standard Time / Sierra Leone + { 50, 199, 3056 }, // Greenwich Standard Time / Saint Helena + { 50, 212, 3075 }, // Greenwich Standard Time / Togo + { 51, 56, 3087 }, // GTB Standard Time / Cyprus + { 51, 85, 3115 }, // GTB Standard Time / Greece + { 51, 177, 3129 }, // GTB Standard Time / Romania + { 52, 94, 3146 }, // Haiti Standard Time / Haiti + { 53, 0, 3169 }, // Hawaiian Standard Time / AnyCountry + { 53, 51, 3180 }, // Hawaiian Standard Time / Cook Islands + { 53, 77, 3198 }, // Hawaiian Standard Time / French Polynesia + { 53, 225, 3213 }, // Hawaiian Standard Time / United States + { 53, 226, 3230 }, // Hawaiian Standard Time / United States Minor Outlying Islands + { 54, 100, 3247 }, // India Standard Time / India + { 55, 102, 3261 }, // Iran Standard Time / Iran + { 56, 105, 3273 }, // Israel Standard Time / Israel + { 57, 109, 3288 }, // Jordan Standard Time / Jordan + { 58, 178, 3299 }, // Kaliningrad Standard Time / Russia + { 59, 114, 3318 }, // Korea Standard Time / South Korea + { 60, 122, 3329 }, // Libya Standard Time / Libya + { 61, 0, 3344 }, // Line Islands Standard Time / AnyCountry + { 61, 112, 3355 }, // Line Islands Standard Time / Kiribati + { 62, 13, 3374 }, // Lord Howe Standard Time / Australia + { 63, 178, 3394 }, // Magadan Standard Time / Russia + { 64, 43, 3407 }, // Magallanes Standard Time / Chile + { 65, 77, 3428 }, // Marquesas Standard Time / French Polynesia + { 66, 137, 3446 }, // Mauritius Standard Time / Mauritius + { 66, 176, 3463 }, // Mauritius Standard Time / Reunion + { 66, 188, 3478 }, // Mauritius Standard Time / Seychelles + { 67, 119, 3490 }, // Middle East Standard Time / Lebanon + { 68, 227, 3502 }, // Montevideo Standard Time / Uruguay + { 69, 145, 3521 }, // Morocco Standard Time / Morocco + { 69, 236, 3539 }, // Morocco Standard Time / Western Sahara + { 70, 139, 3555 }, // Mountain Standard Time (Mexico) / Mexico + { 71, 0, 3590 }, // Mountain Standard Time / AnyCountry + { 71, 38, 3598 }, // Mountain Standard Time / Canada + { 71, 139, 3672 }, // Mountain Standard Time / Mexico + { 71, 225, 3688 }, // Mountain Standard Time / United States + { 72, 46, 3717 }, // Myanmar Standard Time / Cocos Islands + { 72, 147, 3730 }, // Myanmar Standard Time / Myanmar + { 73, 178, 3743 }, // N. Central Asia Standard Time / Russia + { 74, 148, 3760 }, // Namibia Standard Time / Namibia + { 75, 150, 3776 }, // Nepal Standard Time / Nepal + { 76, 8, 3790 }, // New Zealand Standard Time / Antarctica + { 76, 154, 3809 }, // New Zealand Standard Time / New Zealand + { 77, 38, 3826 }, // Newfoundland Standard Time / Canada + { 78, 159, 3843 }, // Norfolk Standard Time / Norfolk Island + { 79, 178, 3859 }, // North Asia East Standard Time / Russia + { 80, 178, 3872 }, // North Asia Standard Time / Russia + { 81, 113, 3907 }, // North Korea Standard Time / North Korea + { 82, 178, 3922 }, // Omsk Standard Time / Russia + { 83, 43, 3932 }, // Pacific SA Standard Time / Chile + { 84, 0, 3949 }, // Pacific Standard Time / AnyCountry + { 84, 38, 3957 }, // Pacific Standard Time / Canada + { 84, 225, 3975 }, // Pacific Standard Time / United States + { 85, 139, 3995 }, // Pacific Standard Time (Mexico) / Mexico + { 86, 163, 4032 }, // Pakistan Standard Time / Pakistan + { 87, 168, 4045 }, // Paraguay Standard Time / Paraguay + { 88, 110, 4062 }, // Qyzylorda Standard Time / Kazakhstan + { 89, 21, 4077 }, // Romance Standard Time / Belgium + { 89, 58, 4093 }, // Romance Standard Time / Denmark + { 89, 74, 4111 }, // Romance Standard Time / France + { 89, 197, 4124 }, // Romance Standard Time / Spain + { 90, 178, 4151 }, // Russia Time Zone 3 / Russia + { 91, 178, 4165 }, // Russia Time Zone 10 / Russia + { 92, 178, 4184 }, // Russia Time Zone 11 / Russia + { 93, 178, 4211 }, // Russian Standard Time / Russia + { 93, 222, 4238 }, // Russian Standard Time / Ukraine + { 94, 0, 4256 }, // SA Eastern Standard Time / AnyCountry + { 94, 8, 4266 }, // SA Eastern Standard Time / Antarctica + { 94, 30, 4303 }, // SA Eastern Standard Time / Brazil + { 94, 70, 4382 }, // SA Eastern Standard Time / Falkland Islands + { 94, 76, 4399 }, // SA Eastern Standard Time / French Guiana + { 94, 202, 4415 }, // SA Eastern Standard Time / Suriname + { 95, 0, 4434 }, // SA Pacific Standard Time / AnyCountry + { 95, 30, 4444 }, // SA Pacific Standard Time / Brazil + { 95, 38, 4480 }, // SA Pacific Standard Time / Canada + { 95, 40, 4502 }, // SA Pacific Standard Time / Cayman Islands + { 95, 47, 4517 }, // SA Pacific Standard Time / Colombia + { 95, 63, 4532 }, // SA Pacific Standard Time / Ecuador + { 95, 107, 4550 }, // SA Pacific Standard Time / Jamaica + { 95, 166, 4566 }, // SA Pacific Standard Time / Panama + { 95, 169, 4581 }, // SA Pacific Standard Time / Peru + { 96, 0, 4594 }, // SA Western Standard Time / AnyCountry + { 96, 7, 4604 }, // SA Western Standard Time / Anguilla + { 96, 9, 4621 }, // SA Western Standard Time / Antigua And Barbuda + { 96, 12, 4637 }, // SA Western Standard Time / Aruba + { 96, 19, 4651 }, // SA Western Standard Time / Barbados + { 96, 26, 4668 }, // SA Western Standard Time / Bolivia + { 96, 30, 4683 }, // SA Western Standard Time / Brazil + { 96, 38, 4736 }, // SA Western Standard Time / Canada + { 96, 60, 4757 }, // SA Western Standard Time / Dominica + { 96, 61, 4774 }, // SA Western Standard Time / Dominican Republic + { 96, 87, 4796 }, // SA Western Standard Time / Grenada + { 96, 88, 4812 }, // SA Western Standard Time / Guadeloupe + { 96, 93, 4831 }, // SA Western Standard Time / Guyana + { 96, 135, 4846 }, // SA Western Standard Time / Martinique + { 96, 144, 4865 }, // SA Western Standard Time / Montserrat + { 96, 152, 4884 }, // SA Western Standard Time / Cura Sao + { 96, 174, 4900 }, // SA Western Standard Time / Puerto Rico + { 96, 180, 4920 }, // SA Western Standard Time / Saint Kitts And Nevis + { 96, 181, 4937 }, // SA Western Standard Time / Saint Lucia + { 96, 182, 4954 }, // SA Western Standard Time / Saint Vincent And The Grenadines + { 96, 215, 4973 }, // SA Western Standard Time / Trinidad And Tobago + { 96, 233, 4995 }, // SA Western Standard Time / British Virgin Islands + { 96, 234, 5011 }, // SA Western Standard Time / United States Virgin Islands + { 96, 244, 5029 }, // SA Western Standard Time / Saint Barthelemy + { 96, 245, 5051 }, // SA Western Standard Time / Saint Martin + { 96, 255, 5067 }, // SA Western Standard Time / Bonaire + { 96, 256, 5086 }, // SA Western Standard Time / Sint Maarten + { 97, 200, 5108 }, // Saint Pierre Standard Time / Saint Pierre And Miquelon + { 98, 178, 5125 }, // Sakhalin Standard Time / Russia + { 99, 183, 5139 }, // Samoa Standard Time / Samoa + { 100, 185, 5152 }, // Sao Tome Standard Time / Sao Tome And Principe + { 101, 178, 5168 }, // Saratov Standard Time / Russia + { 102, 0, 5183 }, // SE Asia Standard Time / AnyCountry + { 102, 8, 5193 }, // SE Asia Standard Time / Antarctica + { 102, 36, 5210 }, // SE Asia Standard Time / Cambodia + { 102, 45, 5226 }, // SE Asia Standard Time / Christmas Island + { 102, 101, 5243 }, // SE Asia Standard Time / Indonesia + { 102, 117, 5271 }, // SE Asia Standard Time / Laos + { 102, 211, 5286 }, // SE Asia Standard Time / Thailand + { 102, 232, 5299 }, // SE Asia Standard Time / Vietnam + { 103, 0, 5311 }, // Singapore Standard Time / AnyCountry + { 103, 32, 5321 }, // Singapore Standard Time / Brunei + { 103, 101, 5333 }, // Singapore Standard Time / Indonesia + { 103, 130, 5347 }, // Singapore Standard Time / Malaysia + { 103, 170, 5378 }, // Singapore Standard Time / Philippines + { 103, 190, 5390 }, // Singapore Standard Time / Singapore + { 104, 0, 5405 }, // South Africa Standard Time / AnyCountry + { 104, 28, 5415 }, // South Africa Standard Time / Botswana + { 104, 35, 5431 }, // South Africa Standard Time / Burundi + { 104, 49, 5448 }, // South Africa Standard Time / Congo Kinshasa + { 104, 120, 5466 }, // South Africa Standard Time / Lesotho + { 104, 129, 5480 }, // South Africa Standard Time / Malawi + { 104, 146, 5496 }, // South Africa Standard Time / Mozambique + { 104, 179, 5510 }, // South Africa Standard Time / Rwanda + { 104, 195, 5524 }, // South Africa Standard Time / South Africa + { 104, 204, 5544 }, // South Africa Standard Time / Swaziland + { 104, 239, 5559 }, // South Africa Standard Time / Zambia + { 104, 240, 5573 }, // South Africa Standard Time / Zimbabwe + { 104, 254, 5587 }, // South Africa Standard Time / South Sudan + { 105, 198, 5599 }, // Sri Lanka Standard Time / Sri Lanka + { 106, 201, 5612 }, // Sudan Standard Time / Sudan + { 107, 207, 5628 }, // Syria Standard Time / Syria + { 108, 208, 5642 }, // Taipei Standard Time / Taiwan + { 109, 13, 5654 }, // Tasmania Standard Time / Australia + { 110, 30, 5709 }, // Tocantins Standard Time / Brazil + { 111, 0, 5727 }, // Tokyo Standard Time / AnyCountry + { 111, 62, 5737 }, // Tokyo Standard Time / East Timor + { 111, 101, 5747 }, // Tokyo Standard Time / Indonesia + { 111, 108, 5761 }, // Tokyo Standard Time / Japan + { 111, 164, 5772 }, // Tokyo Standard Time / Palau + { 112, 178, 5786 }, // Tomsk Standard Time / Russia + { 113, 214, 5797 }, // Tonga Standard Time / Tonga + { 114, 178, 5815 }, // Transbaikal Standard Time / Russia + { 115, 217, 5826 }, // Turkey Standard Time / Turkey + { 116, 219, 5842 }, // Turks And Caicos Standard Time / Turks And Caicos Islands + { 117, 143, 5861 }, // Ulaanbaatar Standard Time / Mongolia + { 118, 225, 5894 }, // US Eastern Standard Time / United States + { 119, 0, 5961 }, // US Mountain Standard Time / AnyCountry + { 119, 38, 5971 }, // US Mountain Standard Time / Canada + { 119, 139, 6028 }, // US Mountain Standard Time / Mexico + { 119, 225, 6047 }, // US Mountain Standard Time / United States + { 120, 0, 6063 }, // UTC-11 / AnyCountry + { 120, 4, 6074 }, // UTC-11 / American Samoa + { 120, 158, 6092 }, // UTC-11 / Niue + { 120, 226, 6105 }, // UTC-11 / United States Minor Outlying Islands + { 121, 0, 6120 }, // UTC-09 / AnyCountry + { 121, 77, 6130 }, // UTC-09 / French Polynesia + { 122, 0, 6146 }, // UTC-08 / AnyCountry + { 122, 171, 6156 }, // UTC-08 / Pitcairn + { 123, 0, 6173 }, // UTC-02 / AnyCountry + { 123, 30, 6183 }, // UTC-02 / Brazil + { 123, 196, 6199 }, // UTC-02 / South Georgia And The South Sandwich Islands + { 124, 0, 6222 }, // UTC / AnyCountry + { 125, 0, 6238 }, // UTC+12 / AnyCountry + { 125, 112, 6249 }, // UTC+12 / Kiribati + { 125, 134, 6264 }, // UTC+12 / Marshall Islands + { 125, 149, 6297 }, // UTC+12 / Nauru + { 125, 220, 6311 }, // UTC+12 / Tuvalu + { 125, 226, 6328 }, // UTC+12 / United States Minor Outlying Islands + { 125, 235, 6341 }, // UTC+12 / Wallis And Futuna Islands + { 126, 0, 6356 }, // UTC+13 / AnyCountry + { 126, 112, 6367 }, // UTC+13 / Kiribati + { 126, 213, 6385 }, // UTC+13 / Tokelau + { 127, 231, 6401 }, // Venezuela Standard Time / Venezuela + { 128, 178, 6417 }, // Vladivostok Standard Time / Russia + { 129, 178, 6448 }, // Volgograd Standard Time / Russia + { 130, 13, 6465 }, // W. Australia Standard Time / Australia + { 131, 0, 6481 }, // W. Central Africa Standard Time / AnyCountry + { 131, 3, 6491 }, // W. Central Africa Standard Time / Algeria + { 131, 6, 6506 }, // W. Central Africa Standard Time / Angola + { 131, 23, 6520 }, // W. Central Africa Standard Time / Benin + { 131, 37, 6538 }, // W. Central Africa Standard Time / Cameroon + { 131, 41, 6552 }, // W. Central Africa Standard Time / Central African Republic + { 131, 42, 6566 }, // W. Central Africa Standard Time / Chad + { 131, 49, 6582 }, // W. Central Africa Standard Time / Congo Kinshasa + { 131, 50, 6598 }, // W. Central Africa Standard Time / Congo Brazzaville + { 131, 66, 6617 }, // W. Central Africa Standard Time / Equatorial Guinea + { 131, 79, 6631 }, // W. Central Africa Standard Time / Gabon + { 131, 156, 6649 }, // W. Central Africa Standard Time / Niger + { 131, 157, 6663 }, // W. Central Africa Standard Time / Nigeria + { 131, 216, 6676 }, // W. Central Africa Standard Time / Tunisia + { 132, 5, 6689 }, // W. Europe Standard Time / Andorra + { 132, 14, 6704 }, // W. Europe Standard Time / Austria + { 132, 82, 6718 }, // W. Europe Standard Time / Germany + { 132, 84, 6748 }, // W. Europe Standard Time / Gibraltar + { 132, 106, 6765 }, // W. Europe Standard Time / Italy + { 132, 123, 6777 }, // W. Europe Standard Time / Liechtenstein + { 132, 125, 6790 }, // W. Europe Standard Time / Luxembourg + { 132, 133, 6808 }, // W. Europe Standard Time / Malta + { 132, 142, 6821 }, // W. Europe Standard Time / Monaco + { 132, 151, 6835 }, // W. Europe Standard Time / Netherlands + { 132, 161, 6852 }, // W. Europe Standard Time / Norway + { 132, 184, 6864 }, // W. Europe Standard Time / San Marino + { 132, 203, 6882 }, // W. Europe Standard Time / Svalbard And Jan Mayen Islands + { 132, 205, 6902 }, // W. Europe Standard Time / Sweden + { 132, 206, 6919 }, // W. Europe Standard Time / Switzerland + { 132, 230, 6933 }, // W. Europe Standard Time / Vatican City State + { 133, 143, 6948 }, // W. Mongolia Standard Time / Mongolia + { 134, 0, 6958 }, // West Asia Standard Time / AnyCountry + { 134, 8, 6968 }, // West Asia Standard Time / Antarctica + { 134, 78, 6986 }, // West Asia Standard Time / French Southern Territories + { 134, 110, 7003 }, // West Asia Standard Time / Kazakhstan + { 134, 131, 7048 }, // West Asia Standard Time / Maldives + { 134, 209, 7064 }, // West Asia Standard Time / Tajikistan + { 134, 218, 7078 }, // West Asia Standard Time / Turkmenistan + { 134, 228, 7092 }, // West Asia Standard Time / Uzbekistan + { 135, 165, 7121 }, // West Bank Standard Time / Palestinian Territories + { 136, 0, 7143 }, // West Pacific Standard Time / AnyCountry + { 136, 8, 7154 }, // West Pacific Standard Time / Antarctica + { 136, 89, 7180 }, // West Pacific Standard Time / Guam + { 136, 140, 7193 }, // West Pacific Standard Time / Micronesia + { 136, 160, 7206 }, // West Pacific Standard Time / Northern Mariana Islands + { 136, 167, 7221 }, // West Pacific Standard Time / Papua New Guinea + { 137, 178, 7242 }, // Yakutsk Standard Time / Russia + { 138, 38, 7269 }, // Yukon Standard Time / Canada { 0, 0, 0 } // Trailing zeroes }; @@ -534,105 +535,105 @@ static const QWindowsData windowsDataTable[] = { { 35, 852, 1910,-43200 }, // Dateline Standard Time { 36, 875, 2011, 10800 }, // E. Africa Standard Time { 37, 899, 7489, 36000 }, // E. Australia Standard Time - { 38, 926, 2164, 7200 }, // E. Europe Standard Time - { 39, 950, 2180,-10800 }, // E. South America Standard Time - { 40, 981, 2198,-21600 }, // Easter Island Standard Time + { 38, 926, 2152, 7200 }, // E. Europe Standard Time + { 39, 950, 2168,-10800 }, // E. South America Standard Time + { 40, 981, 2186,-21600 }, // Easter Island Standard Time { 41, 1009, 7508,-18000 }, // Eastern Standard Time - { 42, 1031, 2498,-18000 }, // Eastern Standard Time (Mexico) - { 43, 1062, 2513, 7200 }, // Egypt Standard Time - { 44, 1082, 2526, 18000 }, // Ekaterinburg Standard Time - { 45, 1109, 2545, 43200 }, // Fiji Standard Time + { 42, 1031, 2486,-18000 }, // Eastern Standard Time (Mexico) + { 43, 1062, 2501, 7200 }, // Egypt Standard Time + { 44, 1082, 2514, 18000 }, // Ekaterinburg Standard Time + { 45, 1109, 2533, 43200 }, // Fiji Standard Time { 46, 1128, 7525, 7200 }, // FLE Standard Time - { 47, 1146, 2692, 14400 }, // Georgian Standard Time - { 48, 1169, 2798, 0 }, // GMT Standard Time - { 49, 1187, 2845,-10800 }, // Greenland Standard Time - { 50, 1211, 2951, 0 }, // Greenwich Standard Time - { 51, 1235, 3120, 7200 }, // GTB Standard Time - { 52, 1253, 3137,-18000 }, // Haiti Standard Time - { 53, 1273, 3204,-36000 }, // Hawaiian Standard Time - { 54, 1296, 3238, 19800 }, // India Standard Time - { 55, 1316, 3252, 12600 }, // Iran Standard Time - { 56, 1335, 3264, 7200 }, // Israel Standard Time - { 57, 1356, 3279, 7200 }, // Jordan Standard Time - { 58, 1377, 3290, 7200 }, // Kaliningrad Standard Time - { 59, 1403, 3309, 32400 }, // Korea Standard Time - { 60, 1423, 3320, 7200 }, // Libya Standard Time - { 61, 1443, 3346, 50400 }, // Line Islands Standard Time - { 62, 1470, 3365, 37800 }, // Lord Howe Standard Time - { 63, 1494, 3385, 36000 }, // Magadan Standard Time - { 64, 1516, 3398,-10800 }, // Magallanes Standard Time - { 65, 1541, 3419,-34200 }, // Marquesas Standard Time - { 66, 1565, 3437, 14400 }, // Mauritius Standard Time - { 67, 1589, 3481, 7200 }, // Middle East Standard Time - { 68, 1615, 3493,-10800 }, // Montevideo Standard Time - { 69, 1640, 3512, 0 }, // Morocco Standard Time + { 47, 1146, 2680, 14400 }, // Georgian Standard Time + { 48, 1169, 2786, 0 }, // GMT Standard Time + { 49, 1187, 2833,-10800 }, // Greenland Standard Time + { 50, 1211, 2960, 0 }, // Greenwich Standard Time + { 51, 1235, 3129, 7200 }, // GTB Standard Time + { 52, 1253, 3146,-18000 }, // Haiti Standard Time + { 53, 1273, 3213,-36000 }, // Hawaiian Standard Time + { 54, 1296, 3247, 19800 }, // India Standard Time + { 55, 1316, 3261, 12600 }, // Iran Standard Time + { 56, 1335, 3273, 7200 }, // Israel Standard Time + { 57, 1356, 3288, 7200 }, // Jordan Standard Time + { 58, 1377, 3299, 7200 }, // Kaliningrad Standard Time + { 59, 1403, 3318, 32400 }, // Korea Standard Time + { 60, 1423, 3329, 7200 }, // Libya Standard Time + { 61, 1443, 3355, 50400 }, // Line Islands Standard Time + { 62, 1470, 3374, 37800 }, // Lord Howe Standard Time + { 63, 1494, 3394, 36000 }, // Magadan Standard Time + { 64, 1516, 3407,-10800 }, // Magallanes Standard Time + { 65, 1541, 3428,-34200 }, // Marquesas Standard Time + { 66, 1565, 3446, 14400 }, // Mauritius Standard Time + { 67, 1589, 3490, 7200 }, // Middle East Standard Time + { 68, 1615, 3502,-10800 }, // Montevideo Standard Time + { 69, 1640, 3521, 0 }, // Morocco Standard Time { 70, 1662, 7537,-25200 }, // Mountain Standard Time (Mexico) { 71, 1694, 7555,-25200 }, // Mountain Standard Time - { 72, 1717, 3721, 23400 }, // Myanmar Standard Time - { 73, 1739, 3734, 21600 }, // N. Central Asia Standard Time - { 74, 1769, 3751, 3600 }, // Namibia Standard Time - { 75, 1791, 3767, 20700 }, // Nepal Standard Time - { 76, 1811, 3800, 43200 }, // New Zealand Standard Time - { 77, 1837, 3817,-12600 }, // Newfoundland Standard Time - { 78, 1864, 3834, 39600 }, // Norfolk Standard Time - { 79, 1886, 3850, 28800 }, // North Asia East Standard Time + { 72, 1717, 3730, 23400 }, // Myanmar Standard Time + { 73, 1739, 3743, 21600 }, // N. Central Asia Standard Time + { 74, 1769, 3760, 3600 }, // Namibia Standard Time + { 75, 1791, 3776, 20700 }, // Nepal Standard Time + { 76, 1811, 3809, 43200 }, // New Zealand Standard Time + { 77, 1837, 3826,-12600 }, // Newfoundland Standard Time + { 78, 1864, 3843, 39600 }, // Norfolk Standard Time + { 79, 1886, 3859, 28800 }, // North Asia East Standard Time { 80, 1916, 7570, 25200 }, // North Asia Standard Time - { 81, 1941, 3898, 30600 }, // North Korea Standard Time - { 82, 1967, 3913, 21600 }, // Omsk Standard Time - { 83, 1986, 3923,-10800 }, // Pacific SA Standard Time - { 84, 2011, 3966,-28800 }, // Pacific Standard Time + { 81, 1941, 3907, 30600 }, // North Korea Standard Time + { 82, 1967, 3922, 21600 }, // Omsk Standard Time + { 83, 1986, 3932,-10800 }, // Pacific SA Standard Time + { 84, 2011, 3975,-28800 }, // Pacific Standard Time { 85, 2033, 7587,-28800 }, // Pacific Standard Time (Mexico) - { 86, 2064, 4023, 18000 }, // Pakistan Standard Time - { 87, 2087, 4036,-14400 }, // Paraguay Standard Time - { 88, 2110, 4053, 18000 }, // Qyzylorda Standard Time - { 89, 2134, 4102, 3600 }, // Romance Standard Time - { 90, 2156, 4142, 14400 }, // Russia Time Zone 3 - { 91, 2175, 4156, 39600 }, // Russia Time Zone 10 + { 86, 2064, 4032, 18000 }, // Pakistan Standard Time + { 87, 2087, 4045,-14400 }, // Paraguay Standard Time + { 88, 2110, 4062, 18000 }, // Qyzylorda Standard Time + { 89, 2134, 4111, 3600 }, // Romance Standard Time + { 90, 2156, 4151, 14400 }, // Russia Time Zone 3 + { 91, 2175, 4165, 39600 }, // Russia Time Zone 10 { 92, 2195, 7603, 43200 }, // Russia Time Zone 11 { 93, 2215, 7618, 10800 }, // Russian Standard Time - { 94, 2237, 4390,-10800 }, // SA Eastern Standard Time - { 95, 2262, 4508,-18000 }, // SA Pacific Standard Time - { 96, 2287, 4659,-14400 }, // SA Western Standard Time - { 97, 2312, 5099,-10800 }, // Saint Pierre Standard Time - { 98, 2339, 5116, 39600 }, // Sakhalin Standard Time - { 99, 2362, 5130, 46800 }, // Samoa Standard Time - { 100, 2382, 5143, 0 }, // Sao Tome Standard Time - { 101, 2405, 5159, 14400 }, // Saratov Standard Time - { 102, 2427, 5277, 25200 }, // SE Asia Standard Time - { 103, 2449, 5381, 28800 }, // Singapore Standard Time - { 104, 2473, 5515, 7200 }, // South Africa Standard Time - { 105, 2500, 5578, 19800 }, // Sri Lanka Standard Time - { 106, 2524, 5591, 7200 }, // Sudan Standard Time - { 107, 2544, 5607, 7200 }, // Syria Standard Time - { 108, 2564, 5621, 28800 }, // Taipei Standard Time + { 94, 2237, 4399,-10800 }, // SA Eastern Standard Time + { 95, 2262, 4517,-18000 }, // SA Pacific Standard Time + { 96, 2287, 4668,-14400 }, // SA Western Standard Time + { 97, 2312, 5108,-10800 }, // Saint Pierre Standard Time + { 98, 2339, 5125, 39600 }, // Sakhalin Standard Time + { 99, 2362, 5139, 46800 }, // Samoa Standard Time + { 100, 2382, 5152, 0 }, // Sao Tome Standard Time + { 101, 2405, 5168, 14400 }, // Saratov Standard Time + { 102, 2427, 5286, 25200 }, // SE Asia Standard Time + { 103, 2449, 5390, 28800 }, // Singapore Standard Time + { 104, 2473, 5524, 7200 }, // South Africa Standard Time + { 105, 2500, 5599, 19800 }, // Sri Lanka Standard Time + { 106, 2524, 5612, 7200 }, // Sudan Standard Time + { 107, 2544, 5628, 7200 }, // Syria Standard Time + { 108, 2564, 5642, 28800 }, // Taipei Standard Time { 109, 2585, 7632, 36000 }, // Tasmania Standard Time - { 110, 2608, 5688,-10800 }, // Tocantins Standard Time - { 111, 2632, 5740, 32400 }, // Tokyo Standard Time - { 112, 2652, 5765, 25200 }, // Tomsk Standard Time - { 113, 2672, 5776, 46800 }, // Tonga Standard Time - { 114, 2692, 5794, 32400 }, // Transbaikal Standard Time - { 115, 2718, 5805, 7200 }, // Turkey Standard Time - { 116, 2739, 5821,-14400 }, // Turks And Caicos Standard Time + { 110, 2608, 5709,-10800 }, // Tocantins Standard Time + { 111, 2632, 5761, 32400 }, // Tokyo Standard Time + { 112, 2652, 5786, 25200 }, // Tomsk Standard Time + { 113, 2672, 5797, 46800 }, // Tonga Standard Time + { 114, 2692, 5815, 32400 }, // Transbaikal Standard Time + { 115, 2718, 5826, 7200 }, // Turkey Standard Time + { 116, 2739, 5842,-14400 }, // Turks And Caicos Standard Time { 117, 2770, 7649, 28800 }, // Ulaanbaatar Standard Time { 118, 2796, 7666,-18000 }, // US Eastern Standard Time - { 119, 2821, 5969,-25200 }, // US Mountain Standard Time - { 120, 2847, 5985,-39600 }, // UTC-11 - { 121, 2854, 6042,-32400 }, // UTC-09 - { 122, 2861, 6068,-28800 }, // UTC-08 - { 123, 2868, 6095, -7200 }, // UTC-02 + { 119, 2821, 6047,-25200 }, // US Mountain Standard Time + { 120, 2847, 6063,-39600 }, // UTC-11 + { 121, 2854, 6120,-32400 }, // UTC-09 + { 122, 2861, 6146,-28800 }, // UTC-08 + { 123, 2868, 6173, -7200 }, // UTC-02 { 124, 2875, 7687, 0 }, // UTC - { 125, 2879, 6181, 43200 }, // UTC+12 - { 126, 2886, 6299, 46800 }, // UTC+13 - { 127, 2893, 6344,-16200 }, // Venezuela Standard Time + { 125, 2879, 6238, 43200 }, // UTC+12 + { 126, 2886, 6356, 46800 }, // UTC+13 + { 127, 2893, 6401,-16200 }, // Venezuela Standard Time { 128, 2917, 7695, 36000 }, // Vladivostok Standard Time - { 129, 2943, 6391, 14400 }, // Volgograd Standard Time - { 130, 2967, 6408, 28800 }, // W. Australia Standard Time - { 131, 2994, 6606, 3600 }, // W. Central Africa Standard Time + { 129, 2943, 6448, 14400 }, // Volgograd Standard Time + { 130, 2967, 6465, 28800 }, // W. Australia Standard Time + { 131, 2994, 6663, 3600 }, // W. Central Africa Standard Time { 132, 3026, 7712, 3600 }, // W. Europe Standard Time - { 133, 3050, 6891, 25200 }, // W. Mongolia Standard Time + { 133, 3050, 6948, 25200 }, // W. Mongolia Standard Time { 134, 3076, 7726, 18000 }, // West Asia Standard Time { 135, 3100, 7740, 7200 }, // West Bank Standard Time - { 136, 3124, 7164, 36000 }, // West Pacific Standard Time + { 136, 3124, 7221, 36000 }, // West Pacific Standard Time { 137, 3151, 7752, 32400 }, // Yakutsk Standard Time { 138, 3173, 7765,-25200 }, // Yukon Standard Time { 0, 0, 0, 0 } // Trailing zeroes @@ -952,266 +953,266 @@ static const char ianaIdData[] = { 0x61, 0x72, 0x69, 0x76, 0x6f, 0x0, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x2f, 0x4d, 0x61, 0x79, 0x6f, 0x74, 0x74, 0x65, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x6f, 0x67, 0x61, 0x64, 0x69, 0x73, 0x68, 0x75, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x44, 0x61, 0x72, 0x5f, 0x65, 0x73, 0x5f, 0x53, 0x61, 0x6c, 0x61, 0x61, 0x6d, 0x0, 0x41, -0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4b, 0x61, 0x6d, 0x70, 0x61, 0x6c, 0x61, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, -0x2f, 0x4a, 0x75, 0x62, 0x61, 0x0, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, 0x2f, 0x42, 0x72, 0x69, 0x73, -0x62, 0x61, 0x6e, 0x65, 0x20, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, 0x2f, 0x4c, 0x69, 0x6e, 0x64, 0x65, -0x6d, 0x61, 0x6e, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x43, 0x68, 0x69, 0x73, 0x69, 0x6e, 0x61, 0x75, 0x0, -0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x53, 0x61, 0x6f, 0x5f, 0x50, 0x61, 0x75, 0x6c, 0x6f, 0x0, 0x50, 0x61, -0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x45, 0x61, 0x73, 0x74, 0x65, 0x72, 0x0, 0x45, 0x53, 0x54, 0x35, 0x45, 0x44, 0x54, -0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4e, 0x61, 0x73, 0x73, 0x61, 0x75, 0x0, 0x41, 0x6d, 0x65, 0x72, -0x69, 0x63, 0x61, 0x2f, 0x54, 0x6f, 0x72, 0x6f, 0x6e, 0x74, 0x6f, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, -0x49, 0x71, 0x61, 0x6c, 0x75, 0x69, 0x74, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x6f, 0x6e, 0x74, -0x72, 0x65, 0x61, 0x6c, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4e, 0x69, 0x70, 0x69, 0x67, 0x6f, 0x6e, -0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x50, 0x61, 0x6e, 0x67, 0x6e, 0x69, 0x72, 0x74, 0x75, 0x6e, 0x67, -0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x54, 0x68, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x5f, 0x42, 0x61, 0x79, -0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4e, 0x65, 0x77, 0x5f, 0x59, 0x6f, 0x72, 0x6b, 0x20, 0x41, 0x6d, -0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x44, 0x65, 0x74, 0x72, 0x6f, 0x69, 0x74, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, -0x61, 0x2f, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x61, 0x2f, 0x50, 0x65, 0x74, 0x65, 0x72, 0x73, 0x62, 0x75, 0x72, 0x67, -0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x61, 0x2f, 0x56, 0x69, 0x6e, -0x63, 0x65, 0x6e, 0x6e, 0x65, 0x73, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x49, 0x6e, 0x64, 0x69, 0x61, -0x6e, 0x61, 0x2f, 0x57, 0x69, 0x6e, 0x61, 0x6d, 0x61, 0x63, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4b, -0x65, 0x6e, 0x74, 0x75, 0x63, 0x6b, 0x79, 0x2f, 0x4d, 0x6f, 0x6e, 0x74, 0x69, 0x63, 0x65, 0x6c, 0x6c, 0x6f, 0x20, 0x41, -0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4c, 0x6f, 0x75, 0x69, 0x73, 0x76, 0x69, 0x6c, 0x6c, 0x65, 0x0, 0x41, 0x6d, -0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x61, 0x6e, 0x63, 0x75, 0x6e, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, -0x43, 0x61, 0x69, 0x72, 0x6f, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x59, 0x65, 0x6b, 0x61, 0x74, 0x65, 0x72, 0x69, 0x6e, -0x62, 0x75, 0x72, 0x67, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x46, 0x69, 0x6a, 0x69, 0x0, 0x45, 0x75, -0x72, 0x6f, 0x70, 0x65, 0x2f, 0x53, 0x6f, 0x66, 0x69, 0x61, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x54, 0x61, -0x6c, 0x6c, 0x69, 0x6e, 0x6e, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x48, 0x65, 0x6c, 0x73, 0x69, 0x6e, 0x6b, -0x69, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x52, 0x69, 0x67, 0x61, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, -0x2f, 0x56, 0x69, 0x6c, 0x6e, 0x69, 0x75, 0x73, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4b, 0x69, 0x65, 0x76, -0x20, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x55, 0x7a, 0x68, 0x67, 0x6f, 0x72, 0x6f, 0x64, 0x20, 0x45, 0x75, 0x72, -0x6f, 0x70, 0x65, 0x2f, 0x5a, 0x61, 0x70, 0x6f, 0x72, 0x6f, 0x7a, 0x68, 0x79, 0x65, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, -0x65, 0x2f, 0x4d, 0x61, 0x72, 0x69, 0x65, 0x68, 0x61, 0x6d, 0x6e, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x54, 0x62, 0x69, -0x6c, 0x69, 0x73, 0x69, 0x0, 0x41, 0x74, 0x6c, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x2f, 0x46, 0x61, 0x65, 0x72, 0x6f, 0x65, -0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x47, 0x75, 0x65, 0x72, 0x6e, 0x73, 0x65, 0x79, 0x0, 0x45, 0x75, 0x72, -0x6f, 0x70, 0x65, 0x2f, 0x44, 0x75, 0x62, 0x6c, 0x69, 0x6e, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4c, 0x69, -0x73, 0x62, 0x6f, 0x6e, 0x20, 0x41, 0x74, 0x6c, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x2f, 0x4d, 0x61, 0x64, 0x65, 0x69, 0x72, -0x61, 0x0, 0x41, 0x74, 0x6c, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x2f, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x79, 0x0, 0x45, 0x75, -0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4c, 0x6f, 0x6e, 0x64, 0x6f, 0x6e, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x49, -0x73, 0x6c, 0x65, 0x5f, 0x6f, 0x66, 0x5f, 0x4d, 0x61, 0x6e, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4a, 0x65, -0x72, 0x73, 0x65, 0x79, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x47, 0x6f, 0x64, 0x74, 0x68, 0x61, 0x62, -0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4f, 0x75, 0x61, 0x67, 0x61, 0x64, 0x6f, 0x75, 0x67, 0x6f, 0x75, 0x0, -0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x62, 0x69, 0x64, 0x6a, 0x61, 0x6e, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, -0x61, 0x2f, 0x42, 0x61, 0x6e, 0x6a, 0x75, 0x6c, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x63, 0x63, 0x72, -0x61, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x6f, 0x6e, 0x61, 0x6b, 0x72, 0x79, 0x0, 0x41, 0x66, 0x72, -0x69, 0x63, 0x61, 0x2f, 0x42, 0x69, 0x73, 0x73, 0x61, 0x75, 0x0, 0x41, 0x74, 0x6c, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x2f, -0x52, 0x65, 0x79, 0x6b, 0x6a, 0x61, 0x76, 0x69, 0x6b, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x6f, 0x6e, -0x72, 0x6f, 0x76, 0x69, 0x61, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x42, 0x61, 0x6d, 0x61, 0x6b, 0x6f, 0x0, -0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4e, 0x6f, 0x75, 0x61, 0x6b, 0x63, 0x68, 0x6f, 0x74, 0x74, 0x0, 0x41, 0x66, -0x72, 0x69, 0x63, 0x61, 0x2f, 0x44, 0x61, 0x6b, 0x61, 0x72, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x46, 0x72, -0x65, 0x65, 0x74, 0x6f, 0x77, 0x6e, 0x0, 0x41, 0x74, 0x6c, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x2f, 0x53, 0x74, 0x5f, 0x48, -0x65, 0x6c, 0x65, 0x6e, 0x61, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4c, 0x6f, 0x6d, 0x65, 0x0, 0x41, 0x73, -0x69, 0x61, 0x2f, 0x4e, 0x69, 0x63, 0x6f, 0x73, 0x69, 0x61, 0x20, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x46, 0x61, 0x6d, 0x61, -0x67, 0x75, 0x73, 0x74, 0x61, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x41, 0x74, 0x68, 0x65, 0x6e, 0x73, 0x0, -0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x42, 0x75, 0x63, 0x68, 0x61, 0x72, 0x65, 0x73, 0x74, 0x0, 0x41, 0x6d, 0x65, -0x72, 0x69, 0x63, 0x61, 0x2f, 0x50, 0x6f, 0x72, 0x74, 0x2d, 0x61, 0x75, 0x2d, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x65, 0x0, -0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2b, 0x31, 0x30, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x52, -0x61, 0x72, 0x6f, 0x74, 0x6f, 0x6e, 0x67, 0x61, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x54, 0x61, 0x68, -0x69, 0x74, 0x69, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x48, 0x6f, 0x6e, 0x6f, 0x6c, 0x75, 0x6c, 0x75, -0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x4a, 0x6f, 0x68, 0x6e, 0x73, 0x74, 0x6f, 0x6e, 0x0, 0x41, 0x73, -0x69, 0x61, 0x2f, 0x43, 0x61, 0x6c, 0x63, 0x75, 0x74, 0x74, 0x61, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x54, 0x65, 0x68, -0x72, 0x61, 0x6e, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4a, 0x65, 0x72, 0x75, 0x73, 0x61, 0x6c, 0x65, 0x6d, 0x0, 0x41, -0x73, 0x69, 0x61, 0x2f, 0x41, 0x6d, 0x6d, 0x61, 0x6e, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4b, 0x61, 0x6c, -0x69, 0x6e, 0x69, 0x6e, 0x67, 0x72, 0x61, 0x64, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x53, 0x65, 0x6f, 0x75, 0x6c, 0x0, -0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x54, 0x72, 0x69, 0x70, 0x6f, 0x6c, 0x69, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, -0x4d, 0x54, 0x2d, 0x31, 0x34, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x4b, 0x69, 0x72, 0x69, 0x74, 0x69, -0x6d, 0x61, 0x74, 0x69, 0x0, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, 0x2f, 0x4c, 0x6f, 0x72, 0x64, 0x5f, -0x48, 0x6f, 0x77, 0x65, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4d, 0x61, 0x67, 0x61, 0x64, 0x61, 0x6e, 0x0, 0x41, 0x6d, -0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x50, 0x75, 0x6e, 0x74, 0x61, 0x5f, 0x41, 0x72, 0x65, 0x6e, 0x61, 0x73, 0x0, 0x50, -0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x4d, 0x61, 0x72, 0x71, 0x75, 0x65, 0x73, 0x61, 0x73, 0x0, 0x49, 0x6e, 0x64, -0x69, 0x61, 0x6e, 0x2f, 0x4d, 0x61, 0x75, 0x72, 0x69, 0x74, 0x69, 0x75, 0x73, 0x0, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, -0x2f, 0x52, 0x65, 0x75, 0x6e, 0x69, 0x6f, 0x6e, 0x0, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x2f, 0x4d, 0x61, 0x68, 0x65, -0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x42, 0x65, 0x69, 0x72, 0x75, 0x74, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, -0x2f, 0x4d, 0x6f, 0x6e, 0x74, 0x65, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, -0x61, 0x73, 0x61, 0x62, 0x6c, 0x61, 0x6e, 0x63, 0x61, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x45, 0x6c, 0x5f, -0x41, 0x61, 0x69, 0x75, 0x6e, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x68, 0x69, 0x68, 0x75, 0x61, -0x68, 0x75, 0x61, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x61, 0x7a, 0x61, 0x74, 0x6c, 0x61, 0x6e, -0x0, 0x4d, 0x53, 0x54, 0x37, 0x4d, 0x44, 0x54, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x45, 0x64, 0x6d, -0x6f, 0x6e, 0x74, 0x6f, 0x6e, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x61, 0x6d, 0x62, 0x72, 0x69, -0x64, 0x67, 0x65, 0x5f, 0x42, 0x61, 0x79, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x49, 0x6e, 0x75, 0x76, -0x69, 0x6b, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x59, 0x65, 0x6c, 0x6c, 0x6f, 0x77, 0x6b, 0x6e, 0x69, -0x66, 0x65, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4f, 0x6a, 0x69, 0x6e, 0x61, 0x67, 0x61, 0x0, 0x41, -0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x44, 0x65, 0x6e, 0x76, 0x65, 0x72, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, -0x61, 0x2f, 0x42, 0x6f, 0x69, 0x73, 0x65, 0x0, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x2f, 0x43, 0x6f, 0x63, 0x6f, 0x73, -0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x52, 0x61, 0x6e, 0x67, 0x6f, 0x6f, 0x6e, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4e, -0x6f, 0x76, 0x6f, 0x73, 0x69, 0x62, 0x69, 0x72, 0x73, 0x6b, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x57, 0x69, -0x6e, 0x64, 0x68, 0x6f, 0x65, 0x6b, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4b, 0x61, 0x74, 0x6d, 0x61, 0x6e, 0x64, 0x75, -0x0, 0x41, 0x6e, 0x74, 0x61, 0x72, 0x63, 0x74, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x63, 0x4d, 0x75, 0x72, 0x64, 0x6f, 0x0, -0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x41, 0x75, 0x63, 0x6b, 0x6c, 0x61, 0x6e, 0x64, 0x0, 0x41, 0x6d, 0x65, -0x72, 0x69, 0x63, 0x61, 0x2f, 0x53, 0x74, 0x5f, 0x4a, 0x6f, 0x68, 0x6e, 0x73, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, -0x63, 0x2f, 0x4e, 0x6f, 0x72, 0x66, 0x6f, 0x6c, 0x6b, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x49, 0x72, 0x6b, 0x75, 0x74, -0x73, 0x6b, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4b, 0x72, 0x61, 0x73, 0x6e, 0x6f, 0x79, 0x61, 0x72, 0x73, 0x6b, 0x20, -0x41, 0x73, 0x69, 0x61, 0x2f, 0x4e, 0x6f, 0x76, 0x6f, 0x6b, 0x75, 0x7a, 0x6e, 0x65, 0x74, 0x73, 0x6b, 0x0, 0x41, 0x73, -0x69, 0x61, 0x2f, 0x50, 0x79, 0x6f, 0x6e, 0x67, 0x79, 0x61, 0x6e, 0x67, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4f, 0x6d, -0x73, 0x6b, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x53, 0x61, 0x6e, 0x74, 0x69, 0x61, 0x67, 0x6f, 0x0, -0x50, 0x53, 0x54, 0x38, 0x50, 0x44, 0x54, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x56, 0x61, 0x6e, 0x63, -0x6f, 0x75, 0x76, 0x65, 0x72, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4c, 0x6f, 0x73, 0x5f, 0x41, 0x6e, -0x67, 0x65, 0x6c, 0x65, 0x73, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x54, 0x69, 0x6a, 0x75, 0x61, 0x6e, -0x61, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x53, 0x61, 0x6e, 0x74, 0x61, 0x5f, 0x49, 0x73, 0x61, 0x62, -0x65, 0x6c, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4b, 0x61, 0x72, 0x61, 0x63, 0x68, 0x69, 0x0, 0x41, 0x6d, 0x65, 0x72, -0x69, 0x63, 0x61, 0x2f, 0x41, 0x73, 0x75, 0x6e, 0x63, 0x69, 0x6f, 0x6e, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x51, 0x79, -0x7a, 0x79, 0x6c, 0x6f, 0x72, 0x64, 0x61, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x42, 0x72, 0x75, 0x73, 0x73, -0x65, 0x6c, 0x73, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x43, 0x6f, 0x70, 0x65, 0x6e, 0x68, 0x61, 0x67, 0x65, -0x6e, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x50, 0x61, 0x72, 0x69, 0x73, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, -0x65, 0x2f, 0x4d, 0x61, 0x64, 0x72, 0x69, 0x64, 0x20, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x65, 0x75, 0x74, -0x61, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x53, 0x61, 0x6d, 0x61, 0x72, 0x61, 0x0, 0x41, 0x73, 0x69, 0x61, -0x2f, 0x53, 0x72, 0x65, 0x64, 0x6e, 0x65, 0x6b, 0x6f, 0x6c, 0x79, 0x6d, 0x73, 0x6b, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, -0x4b, 0x61, 0x6d, 0x63, 0x68, 0x61, 0x74, 0x6b, 0x61, 0x20, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x41, 0x6e, 0x61, 0x64, 0x79, -0x72, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4d, 0x6f, 0x73, 0x63, 0x6f, 0x77, 0x20, 0x45, 0x75, 0x72, 0x6f, -0x70, 0x65, 0x2f, 0x4b, 0x69, 0x72, 0x6f, 0x76, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x53, 0x69, 0x6d, 0x66, -0x65, 0x72, 0x6f, 0x70, 0x6f, 0x6c, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2b, 0x33, 0x0, 0x41, 0x6e, 0x74, -0x61, 0x72, 0x63, 0x74, 0x69, 0x63, 0x61, 0x2f, 0x52, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x61, 0x20, 0x41, 0x6e, 0x74, 0x61, -0x72, 0x63, 0x74, 0x69, 0x63, 0x61, 0x2f, 0x50, 0x61, 0x6c, 0x6d, 0x65, 0x72, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, -0x61, 0x2f, 0x46, 0x6f, 0x72, 0x74, 0x61, 0x6c, 0x65, 0x7a, 0x61, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, -0x42, 0x65, 0x6c, 0x65, 0x6d, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x61, 0x63, 0x65, 0x69, 0x6f, -0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x52, 0x65, 0x63, 0x69, 0x66, 0x65, 0x20, 0x41, 0x6d, 0x65, 0x72, -0x69, 0x63, 0x61, 0x2f, 0x53, 0x61, 0x6e, 0x74, 0x61, 0x72, 0x65, 0x6d, 0x0, 0x41, 0x74, 0x6c, 0x61, 0x6e, 0x74, 0x69, -0x63, 0x2f, 0x53, 0x74, 0x61, 0x6e, 0x6c, 0x65, 0x79, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x61, -0x79, 0x65, 0x6e, 0x6e, 0x65, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x61, -0x72, 0x69, 0x62, 0x6f, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2b, 0x35, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, -0x63, 0x61, 0x2f, 0x52, 0x69, 0x6f, 0x5f, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x6f, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, -0x61, 0x2f, 0x45, 0x69, 0x72, 0x75, 0x6e, 0x65, 0x70, 0x65, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, -0x6f, 0x72, 0x61, 0x6c, 0x5f, 0x48, 0x61, 0x72, 0x62, 0x6f, 0x75, 0x72, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, -0x2f, 0x43, 0x61, 0x79, 0x6d, 0x61, 0x6e, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x42, 0x6f, 0x67, 0x6f, -0x74, 0x61, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x47, 0x75, 0x61, 0x79, 0x61, 0x71, 0x75, 0x69, 0x6c, -0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4a, 0x61, 0x6d, 0x61, 0x69, 0x63, 0x61, 0x0, 0x41, 0x6d, 0x65, -0x72, 0x69, 0x63, 0x61, 0x2f, 0x50, 0x61, 0x6e, 0x61, 0x6d, 0x61, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, -0x4c, 0x69, 0x6d, 0x61, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2b, 0x34, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, -0x63, 0x61, 0x2f, 0x41, 0x6e, 0x67, 0x75, 0x69, 0x6c, 0x6c, 0x61, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, -0x41, 0x6e, 0x74, 0x69, 0x67, 0x75, 0x61, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x72, 0x75, 0x62, -0x61, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x42, 0x61, 0x72, 0x62, 0x61, 0x64, 0x6f, 0x73, 0x0, 0x41, -0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4c, 0x61, 0x5f, 0x50, 0x61, 0x7a, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, -0x61, 0x2f, 0x4d, 0x61, 0x6e, 0x61, 0x75, 0x73, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x42, 0x6f, 0x61, -0x5f, 0x56, 0x69, 0x73, 0x74, 0x61, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x50, 0x6f, 0x72, 0x74, 0x6f, -0x5f, 0x56, 0x65, 0x6c, 0x68, 0x6f, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x42, 0x6c, 0x61, 0x6e, 0x63, -0x2d, 0x53, 0x61, 0x62, 0x6c, 0x6f, 0x6e, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x44, 0x6f, 0x6d, 0x69, -0x6e, 0x69, 0x63, 0x61, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x53, 0x61, 0x6e, 0x74, 0x6f, 0x5f, 0x44, -0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x6f, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x47, 0x72, 0x65, 0x6e, 0x61, -0x64, 0x61, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x47, 0x75, 0x61, 0x64, 0x65, 0x6c, 0x6f, 0x75, 0x70, -0x65, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x47, 0x75, 0x79, 0x61, 0x6e, 0x61, 0x0, 0x41, 0x6d, 0x65, -0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x61, 0x72, 0x74, 0x69, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x0, 0x41, 0x6d, 0x65, 0x72, -0x69, 0x63, 0x61, 0x2f, 0x4d, 0x6f, 0x6e, 0x74, 0x73, 0x65, 0x72, 0x72, 0x61, 0x74, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, -0x63, 0x61, 0x2f, 0x43, 0x75, 0x72, 0x61, 0x63, 0x61, 0x6f, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x50, -0x75, 0x65, 0x72, 0x74, 0x6f, 0x5f, 0x52, 0x69, 0x63, 0x6f, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x53, -0x74, 0x5f, 0x4b, 0x69, 0x74, 0x74, 0x73, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x53, 0x74, 0x5f, 0x4c, -0x75, 0x63, 0x69, 0x61, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x53, 0x74, 0x5f, 0x56, 0x69, 0x6e, 0x63, -0x65, 0x6e, 0x74, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x50, 0x6f, 0x72, 0x74, 0x5f, 0x6f, 0x66, 0x5f, -0x53, 0x70, 0x61, 0x69, 0x6e, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x54, 0x6f, 0x72, 0x74, 0x6f, 0x6c, -0x61, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x53, 0x74, 0x5f, 0x54, 0x68, 0x6f, 0x6d, 0x61, 0x73, 0x0, -0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x53, 0x74, 0x5f, 0x42, 0x61, 0x72, 0x74, 0x68, 0x65, 0x6c, 0x65, 0x6d, -0x79, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x61, 0x72, 0x69, 0x67, 0x6f, 0x74, 0x0, 0x41, 0x6d, -0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4b, 0x72, 0x61, 0x6c, 0x65, 0x6e, 0x64, 0x69, 0x6a, 0x6b, 0x0, 0x41, 0x6d, 0x65, -0x72, 0x69, 0x63, 0x61, 0x2f, 0x4c, 0x6f, 0x77, 0x65, 0x72, 0x5f, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x65, 0x73, 0x0, 0x41, -0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x69, 0x71, 0x75, 0x65, 0x6c, 0x6f, 0x6e, 0x0, 0x41, 0x73, 0x69, 0x61, -0x2f, 0x53, 0x61, 0x6b, 0x68, 0x61, 0x6c, 0x69, 0x6e, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x41, 0x70, -0x69, 0x61, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x53, 0x61, 0x6f, 0x5f, 0x54, 0x6f, 0x6d, 0x65, 0x0, 0x45, -0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x53, 0x61, 0x72, 0x61, 0x74, 0x6f, 0x76, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, -0x54, 0x2d, 0x37, 0x0, 0x41, 0x6e, 0x74, 0x61, 0x72, 0x63, 0x74, 0x69, 0x63, 0x61, 0x2f, 0x44, 0x61, 0x76, 0x69, 0x73, -0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x50, 0x68, 0x6e, 0x6f, 0x6d, 0x5f, 0x50, 0x65, 0x6e, 0x68, 0x0, 0x49, 0x6e, 0x64, -0x69, 0x61, 0x6e, 0x2f, 0x43, 0x68, 0x72, 0x69, 0x73, 0x74, 0x6d, 0x61, 0x73, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4a, -0x61, 0x6b, 0x61, 0x72, 0x74, 0x61, 0x20, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x50, 0x6f, 0x6e, 0x74, 0x69, 0x61, 0x6e, 0x61, -0x6b, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x56, 0x69, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6e, 0x65, 0x0, 0x41, 0x73, 0x69, -0x61, 0x2f, 0x42, 0x61, 0x6e, 0x67, 0x6b, 0x6f, 0x6b, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x53, 0x61, 0x69, 0x67, 0x6f, -0x6e, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2d, 0x38, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x42, 0x72, 0x75, -0x6e, 0x65, 0x69, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4d, 0x61, 0x6b, 0x61, 0x73, 0x73, 0x61, 0x72, 0x0, 0x41, 0x73, -0x69, 0x61, 0x2f, 0x4b, 0x75, 0x61, 0x6c, 0x61, 0x5f, 0x4c, 0x75, 0x6d, 0x70, 0x75, 0x72, 0x20, 0x41, 0x73, 0x69, 0x61, -0x2f, 0x4b, 0x75, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4d, 0x61, 0x6e, 0x69, 0x6c, 0x61, -0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x53, 0x69, 0x6e, 0x67, 0x61, 0x70, 0x6f, 0x72, 0x65, 0x0, 0x45, 0x74, 0x63, 0x2f, -0x47, 0x4d, 0x54, 0x2d, 0x32, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x47, 0x61, 0x62, 0x6f, 0x72, 0x6f, 0x6e, -0x65, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x42, 0x75, 0x6a, 0x75, 0x6d, 0x62, 0x75, 0x72, 0x61, 0x0, 0x41, -0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4c, 0x75, 0x62, 0x75, 0x6d, 0x62, 0x61, 0x73, 0x68, 0x69, 0x0, 0x41, 0x66, 0x72, -0x69, 0x63, 0x61, 0x2f, 0x4d, 0x61, 0x73, 0x65, 0x72, 0x75, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x42, 0x6c, -0x61, 0x6e, 0x74, 0x79, 0x72, 0x65, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x61, 0x70, 0x75, 0x74, 0x6f, -0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4b, 0x69, 0x67, 0x61, 0x6c, 0x69, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, -0x61, 0x2f, 0x4a, 0x6f, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x73, 0x62, 0x75, 0x72, 0x67, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, -0x61, 0x2f, 0x4d, 0x62, 0x61, 0x62, 0x61, 0x6e, 0x65, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4c, 0x75, 0x73, -0x61, 0x6b, 0x61, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x48, 0x61, 0x72, 0x61, 0x72, 0x65, 0x0, 0x41, 0x73, -0x69, 0x61, 0x2f, 0x43, 0x6f, 0x6c, 0x6f, 0x6d, 0x62, 0x6f, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4b, 0x68, -0x61, 0x72, 0x74, 0x6f, 0x75, 0x6d, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x44, 0x61, 0x6d, 0x61, 0x73, 0x63, 0x75, 0x73, -0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x54, 0x61, 0x69, 0x70, 0x65, 0x69, 0x0, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, -0x69, 0x61, 0x2f, 0x48, 0x6f, 0x62, 0x61, 0x72, 0x74, 0x20, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, 0x2f, -0x43, 0x75, 0x72, 0x72, 0x69, 0x65, 0x20, 0x41, 0x6e, 0x74, 0x61, 0x72, 0x63, 0x74, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x61, -0x63, 0x71, 0x75, 0x61, 0x72, 0x69, 0x65, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x72, 0x61, 0x67, -0x75, 0x61, 0x69, 0x6e, 0x61, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2d, 0x39, 0x0, 0x41, 0x73, 0x69, 0x61, -0x2f, 0x44, 0x69, 0x6c, 0x69, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4a, 0x61, 0x79, 0x61, 0x70, 0x75, 0x72, 0x61, 0x0, -0x41, 0x73, 0x69, 0x61, 0x2f, 0x54, 0x6f, 0x6b, 0x79, 0x6f, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x50, -0x61, 0x6c, 0x61, 0x75, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x54, 0x6f, 0x6d, 0x73, 0x6b, 0x0, 0x50, 0x61, 0x63, 0x69, -0x66, 0x69, 0x63, 0x2f, 0x54, 0x6f, 0x6e, 0x67, 0x61, 0x74, 0x61, 0x70, 0x75, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x43, -0x68, 0x69, 0x74, 0x61, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x49, 0x73, 0x74, 0x61, 0x6e, 0x62, 0x75, 0x6c, -0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x47, 0x72, 0x61, 0x6e, 0x64, 0x5f, 0x54, 0x75, 0x72, 0x6b, 0x0, -0x41, 0x73, 0x69, 0x61, 0x2f, 0x55, 0x6c, 0x61, 0x61, 0x6e, 0x62, 0x61, 0x61, 0x74, 0x61, 0x72, 0x20, 0x41, 0x73, 0x69, -0x61, 0x2f, 0x43, 0x68, 0x6f, 0x69, 0x62, 0x61, 0x6c, 0x73, 0x61, 0x6e, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, -0x2f, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x61, 0x70, 0x6f, 0x6c, 0x69, 0x73, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, -0x61, 0x2f, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x61, 0x2f, 0x4d, 0x61, 0x72, 0x65, 0x6e, 0x67, 0x6f, 0x20, 0x41, 0x6d, -0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x61, 0x2f, 0x56, 0x65, 0x76, 0x61, 0x79, 0x0, -0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2b, 0x37, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x48, 0x65, -0x72, 0x6d, 0x6f, 0x73, 0x69, 0x6c, 0x6c, 0x6f, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x50, 0x68, 0x6f, -0x65, 0x6e, 0x69, 0x78, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2b, 0x31, 0x31, 0x0, 0x50, 0x61, 0x63, 0x69, -0x66, 0x69, 0x63, 0x2f, 0x50, 0x61, 0x67, 0x6f, 0x5f, 0x50, 0x61, 0x67, 0x6f, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, -0x63, 0x2f, 0x4e, 0x69, 0x75, 0x65, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x4d, 0x69, 0x64, 0x77, 0x61, -0x79, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2b, 0x39, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, -0x47, 0x61, 0x6d, 0x62, 0x69, 0x65, 0x72, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2b, 0x38, 0x0, 0x50, 0x61, -0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x50, 0x69, 0x74, 0x63, 0x61, 0x69, 0x72, 0x6e, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, -0x4d, 0x54, 0x2b, 0x32, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4e, 0x6f, 0x72, 0x6f, 0x6e, 0x68, 0x61, -0x0, 0x41, 0x74, 0x6c, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x2f, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x5f, 0x47, 0x65, 0x6f, 0x72, -0x67, 0x69, 0x61, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x20, 0x45, 0x74, 0x63, 0x2f, 0x55, 0x54, 0x43, 0x0, -0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x44, 0x61, 0x6e, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x68, 0x61, 0x76, 0x6e, -0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2d, 0x31, 0x32, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, -0x54, 0x61, 0x72, 0x61, 0x77, 0x61, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x4d, 0x61, 0x6a, 0x75, 0x72, -0x6f, 0x20, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x4b, 0x77, 0x61, 0x6a, 0x61, 0x6c, 0x65, 0x69, 0x6e, 0x0, -0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x4e, 0x61, 0x75, 0x72, 0x75, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, -0x63, 0x2f, 0x46, 0x75, 0x6e, 0x61, 0x66, 0x75, 0x74, 0x69, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x57, -0x61, 0x6b, 0x65, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x57, 0x61, 0x6c, 0x6c, 0x69, 0x73, 0x0, 0x45, -0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2d, 0x31, 0x33, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x45, 0x6e, -0x64, 0x65, 0x72, 0x62, 0x75, 0x72, 0x79, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x46, 0x61, 0x6b, 0x61, -0x6f, 0x66, 0x6f, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x61, 0x72, 0x61, 0x63, 0x61, 0x73, 0x0, -0x41, 0x73, 0x69, 0x61, 0x2f, 0x56, 0x6c, 0x61, 0x64, 0x69, 0x76, 0x6f, 0x73, 0x74, 0x6f, 0x6b, 0x20, 0x41, 0x73, 0x69, -0x61, 0x2f, 0x55, 0x73, 0x74, 0x2d, 0x4e, 0x65, 0x72, 0x61, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x56, 0x6f, -0x6c, 0x67, 0x6f, 0x67, 0x72, 0x61, 0x64, 0x0, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, 0x2f, 0x50, 0x65, -0x72, 0x74, 0x68, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2d, 0x31, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, -0x2f, 0x41, 0x6c, 0x67, 0x69, 0x65, 0x72, 0x73, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4c, 0x75, 0x61, 0x6e, -0x64, 0x61, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x50, 0x6f, 0x72, 0x74, 0x6f, 0x2d, 0x4e, 0x6f, 0x76, 0x6f, -0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x44, 0x6f, 0x75, 0x61, 0x6c, 0x61, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, -0x61, 0x2f, 0x42, 0x61, 0x6e, 0x67, 0x75, 0x69, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4e, 0x64, 0x6a, 0x61, -0x6d, 0x65, 0x6e, 0x61, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4b, 0x69, 0x6e, 0x73, 0x68, 0x61, 0x73, 0x61, -0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x42, 0x72, 0x61, 0x7a, 0x7a, 0x61, 0x76, 0x69, 0x6c, 0x6c, 0x65, 0x0, -0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x61, 0x6c, 0x61, 0x62, 0x6f, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, -0x2f, 0x4c, 0x69, 0x62, 0x72, 0x65, 0x76, 0x69, 0x6c, 0x6c, 0x65, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4e, -0x69, 0x61, 0x6d, 0x65, 0x79, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4c, 0x61, 0x67, 0x6f, 0x73, 0x0, 0x41, -0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x54, 0x75, 0x6e, 0x69, 0x73, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x41, -0x6e, 0x64, 0x6f, 0x72, 0x72, 0x61, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x56, 0x69, 0x65, 0x6e, 0x6e, 0x61, -0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x42, 0x65, 0x72, 0x6c, 0x69, 0x6e, 0x20, 0x45, 0x75, 0x72, 0x6f, 0x70, -0x65, 0x2f, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x65, 0x6e, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x47, 0x69, -0x62, 0x72, 0x61, 0x6c, 0x74, 0x61, 0x72, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x52, 0x6f, 0x6d, 0x65, 0x0, -0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x56, 0x61, 0x64, 0x75, 0x7a, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, -0x4c, 0x75, 0x78, 0x65, 0x6d, 0x62, 0x6f, 0x75, 0x72, 0x67, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4d, 0x61, -0x6c, 0x74, 0x61, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4d, 0x6f, 0x6e, 0x61, 0x63, 0x6f, 0x0, 0x45, 0x75, -0x72, 0x6f, 0x70, 0x65, 0x2f, 0x41, 0x6d, 0x73, 0x74, 0x65, 0x72, 0x64, 0x61, 0x6d, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, -0x65, 0x2f, 0x4f, 0x73, 0x6c, 0x6f, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x53, 0x61, 0x6e, 0x5f, 0x4d, 0x61, -0x72, 0x69, 0x6e, 0x6f, 0x0, 0x41, 0x72, 0x63, 0x74, 0x69, 0x63, 0x2f, 0x4c, 0x6f, 0x6e, 0x67, 0x79, 0x65, 0x61, 0x72, -0x62, 0x79, 0x65, 0x6e, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x53, 0x74, 0x6f, 0x63, 0x6b, 0x68, 0x6f, 0x6c, -0x6d, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x5a, 0x75, 0x72, 0x69, 0x63, 0x68, 0x0, 0x45, 0x75, 0x72, 0x6f, -0x70, 0x65, 0x2f, 0x56, 0x61, 0x74, 0x69, 0x63, 0x61, 0x6e, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x48, 0x6f, 0x76, 0x64, -0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2d, 0x35, 0x0, 0x41, 0x6e, 0x74, 0x61, 0x72, 0x63, 0x74, 0x69, 0x63, -0x61, 0x2f, 0x4d, 0x61, 0x77, 0x73, 0x6f, 0x6e, 0x0, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x2f, 0x4b, 0x65, 0x72, 0x67, -0x75, 0x65, 0x6c, 0x65, 0x6e, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4f, 0x72, 0x61, 0x6c, 0x20, 0x41, 0x73, 0x69, 0x61, -0x2f, 0x41, 0x71, 0x74, 0x61, 0x75, 0x20, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x41, 0x71, 0x74, 0x6f, 0x62, 0x65, 0x20, 0x41, -0x73, 0x69, 0x61, 0x2f, 0x41, 0x74, 0x79, 0x72, 0x61, 0x75, 0x0, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x2f, 0x4d, 0x61, -0x6c, 0x64, 0x69, 0x76, 0x65, 0x73, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x44, 0x75, 0x73, 0x68, 0x61, 0x6e, 0x62, 0x65, -0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x41, 0x73, 0x68, 0x67, 0x61, 0x62, 0x61, 0x74, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, -0x54, 0x61, 0x73, 0x68, 0x6b, 0x65, 0x6e, 0x74, 0x20, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x53, 0x61, 0x6d, 0x61, 0x72, 0x6b, -0x61, 0x6e, 0x64, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x48, 0x65, 0x62, 0x72, 0x6f, 0x6e, 0x20, 0x41, 0x73, 0x69, 0x61, -0x2f, 0x47, 0x61, 0x7a, 0x61, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2d, 0x31, 0x30, 0x0, 0x41, 0x6e, 0x74, -0x61, 0x72, 0x63, 0x74, 0x69, 0x63, 0x61, 0x2f, 0x44, 0x75, 0x6d, 0x6f, 0x6e, 0x74, 0x44, 0x55, 0x72, 0x76, 0x69, 0x6c, -0x6c, 0x65, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x47, 0x75, 0x61, 0x6d, 0x0, 0x50, 0x61, 0x63, 0x69, -0x66, 0x69, 0x63, 0x2f, 0x54, 0x72, 0x75, 0x6b, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x53, 0x61, 0x69, -0x70, 0x61, 0x6e, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x50, 0x6f, 0x72, 0x74, 0x5f, 0x4d, 0x6f, 0x72, -0x65, 0x73, 0x62, 0x79, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x59, 0x61, 0x6b, 0x75, 0x74, 0x73, 0x6b, 0x20, 0x41, 0x73, -0x69, 0x61, 0x2f, 0x4b, 0x68, 0x61, 0x6e, 0x64, 0x79, 0x67, 0x61, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, -0x57, 0x68, 0x69, 0x74, 0x65, 0x68, 0x6f, 0x72, 0x73, 0x65, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, +0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4b, 0x61, 0x6d, 0x70, 0x61, 0x6c, 0x61, 0x0, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, +0x6c, 0x69, 0x61, 0x2f, 0x42, 0x72, 0x69, 0x73, 0x62, 0x61, 0x6e, 0x65, 0x20, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, +0x69, 0x61, 0x2f, 0x4c, 0x69, 0x6e, 0x64, 0x65, 0x6d, 0x61, 0x6e, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x43, +0x68, 0x69, 0x73, 0x69, 0x6e, 0x61, 0x75, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x53, 0x61, 0x6f, 0x5f, +0x50, 0x61, 0x75, 0x6c, 0x6f, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x45, 0x61, 0x73, 0x74, 0x65, 0x72, +0x0, 0x45, 0x53, 0x54, 0x35, 0x45, 0x44, 0x54, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4e, 0x61, 0x73, +0x73, 0x61, 0x75, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x54, 0x6f, 0x72, 0x6f, 0x6e, 0x74, 0x6f, 0x20, +0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x49, 0x71, 0x61, 0x6c, 0x75, 0x69, 0x74, 0x20, 0x41, 0x6d, 0x65, 0x72, +0x69, 0x63, 0x61, 0x2f, 0x4d, 0x6f, 0x6e, 0x74, 0x72, 0x65, 0x61, 0x6c, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, +0x2f, 0x4e, 0x69, 0x70, 0x69, 0x67, 0x6f, 0x6e, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x50, 0x61, 0x6e, +0x67, 0x6e, 0x69, 0x72, 0x74, 0x75, 0x6e, 0x67, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x54, 0x68, 0x75, +0x6e, 0x64, 0x65, 0x72, 0x5f, 0x42, 0x61, 0x79, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4e, 0x65, 0x77, +0x5f, 0x59, 0x6f, 0x72, 0x6b, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x44, 0x65, 0x74, 0x72, 0x6f, 0x69, +0x74, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x61, 0x2f, 0x50, 0x65, +0x74, 0x65, 0x72, 0x73, 0x62, 0x75, 0x72, 0x67, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x49, 0x6e, 0x64, +0x69, 0x61, 0x6e, 0x61, 0x2f, 0x56, 0x69, 0x6e, 0x63, 0x65, 0x6e, 0x6e, 0x65, 0x73, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, +0x63, 0x61, 0x2f, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x61, 0x2f, 0x57, 0x69, 0x6e, 0x61, 0x6d, 0x61, 0x63, 0x20, 0x41, +0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4b, 0x65, 0x6e, 0x74, 0x75, 0x63, 0x6b, 0x79, 0x2f, 0x4d, 0x6f, 0x6e, 0x74, +0x69, 0x63, 0x65, 0x6c, 0x6c, 0x6f, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4c, 0x6f, 0x75, 0x69, 0x73, +0x76, 0x69, 0x6c, 0x6c, 0x65, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x61, 0x6e, 0x63, 0x75, 0x6e, +0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x61, 0x69, 0x72, 0x6f, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x59, +0x65, 0x6b, 0x61, 0x74, 0x65, 0x72, 0x69, 0x6e, 0x62, 0x75, 0x72, 0x67, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, +0x2f, 0x46, 0x69, 0x6a, 0x69, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x53, 0x6f, 0x66, 0x69, 0x61, 0x0, 0x45, +0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x54, 0x61, 0x6c, 0x6c, 0x69, 0x6e, 0x6e, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, +0x2f, 0x48, 0x65, 0x6c, 0x73, 0x69, 0x6e, 0x6b, 0x69, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x52, 0x69, 0x67, +0x61, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x56, 0x69, 0x6c, 0x6e, 0x69, 0x75, 0x73, 0x0, 0x45, 0x75, 0x72, +0x6f, 0x70, 0x65, 0x2f, 0x4b, 0x69, 0x65, 0x76, 0x20, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x55, 0x7a, 0x68, 0x67, +0x6f, 0x72, 0x6f, 0x64, 0x20, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x5a, 0x61, 0x70, 0x6f, 0x72, 0x6f, 0x7a, 0x68, +0x79, 0x65, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4d, 0x61, 0x72, 0x69, 0x65, 0x68, 0x61, 0x6d, 0x6e, 0x0, +0x41, 0x73, 0x69, 0x61, 0x2f, 0x54, 0x62, 0x69, 0x6c, 0x69, 0x73, 0x69, 0x0, 0x41, 0x74, 0x6c, 0x61, 0x6e, 0x74, 0x69, +0x63, 0x2f, 0x46, 0x61, 0x65, 0x72, 0x6f, 0x65, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x47, 0x75, 0x65, 0x72, +0x6e, 0x73, 0x65, 0x79, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x44, 0x75, 0x62, 0x6c, 0x69, 0x6e, 0x0, 0x45, +0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4c, 0x69, 0x73, 0x62, 0x6f, 0x6e, 0x20, 0x41, 0x74, 0x6c, 0x61, 0x6e, 0x74, 0x69, +0x63, 0x2f, 0x4d, 0x61, 0x64, 0x65, 0x69, 0x72, 0x61, 0x0, 0x41, 0x74, 0x6c, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x2f, 0x43, +0x61, 0x6e, 0x61, 0x72, 0x79, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4c, 0x6f, 0x6e, 0x64, 0x6f, 0x6e, 0x0, +0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x49, 0x73, 0x6c, 0x65, 0x5f, 0x6f, 0x66, 0x5f, 0x4d, 0x61, 0x6e, 0x0, 0x45, +0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4a, 0x65, 0x72, 0x73, 0x65, 0x79, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, +0x2f, 0x47, 0x6f, 0x64, 0x74, 0x68, 0x61, 0x62, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4f, 0x75, 0x61, 0x67, +0x61, 0x64, 0x6f, 0x75, 0x67, 0x6f, 0x75, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x62, 0x69, 0x64, 0x6a, +0x61, 0x6e, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x42, 0x61, 0x6e, 0x6a, 0x75, 0x6c, 0x0, 0x41, 0x66, 0x72, +0x69, 0x63, 0x61, 0x2f, 0x41, 0x63, 0x63, 0x72, 0x61, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x44, 0x61, +0x6e, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x68, 0x61, 0x76, 0x6e, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x6f, +0x6e, 0x61, 0x6b, 0x72, 0x79, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x42, 0x69, 0x73, 0x73, 0x61, 0x75, 0x0, +0x41, 0x74, 0x6c, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x2f, 0x52, 0x65, 0x79, 0x6b, 0x6a, 0x61, 0x76, 0x69, 0x6b, 0x0, 0x41, +0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x6f, 0x6e, 0x72, 0x6f, 0x76, 0x69, 0x61, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, +0x61, 0x2f, 0x42, 0x61, 0x6d, 0x61, 0x6b, 0x6f, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4e, 0x6f, 0x75, 0x61, +0x6b, 0x63, 0x68, 0x6f, 0x74, 0x74, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x44, 0x61, 0x6b, 0x61, 0x72, 0x0, +0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x46, 0x72, 0x65, 0x65, 0x74, 0x6f, 0x77, 0x6e, 0x0, 0x41, 0x74, 0x6c, 0x61, +0x6e, 0x74, 0x69, 0x63, 0x2f, 0x53, 0x74, 0x5f, 0x48, 0x65, 0x6c, 0x65, 0x6e, 0x61, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, +0x61, 0x2f, 0x4c, 0x6f, 0x6d, 0x65, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4e, 0x69, 0x63, 0x6f, 0x73, 0x69, 0x61, 0x20, +0x41, 0x73, 0x69, 0x61, 0x2f, 0x46, 0x61, 0x6d, 0x61, 0x67, 0x75, 0x73, 0x74, 0x61, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, +0x65, 0x2f, 0x41, 0x74, 0x68, 0x65, 0x6e, 0x73, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x42, 0x75, 0x63, 0x68, +0x61, 0x72, 0x65, 0x73, 0x74, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x50, 0x6f, 0x72, 0x74, 0x2d, 0x61, +0x75, 0x2d, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x65, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2b, 0x31, 0x30, 0x0, +0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x52, 0x61, 0x72, 0x6f, 0x74, 0x6f, 0x6e, 0x67, 0x61, 0x0, 0x50, 0x61, +0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x54, 0x61, 0x68, 0x69, 0x74, 0x69, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, +0x2f, 0x48, 0x6f, 0x6e, 0x6f, 0x6c, 0x75, 0x6c, 0x75, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x4a, 0x6f, +0x68, 0x6e, 0x73, 0x74, 0x6f, 0x6e, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x43, 0x61, 0x6c, 0x63, 0x75, 0x74, 0x74, 0x61, +0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x54, 0x65, 0x68, 0x72, 0x61, 0x6e, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4a, 0x65, +0x72, 0x75, 0x73, 0x61, 0x6c, 0x65, 0x6d, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x41, 0x6d, 0x6d, 0x61, 0x6e, 0x0, 0x45, +0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4b, 0x61, 0x6c, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x72, 0x61, 0x64, 0x0, 0x41, 0x73, +0x69, 0x61, 0x2f, 0x53, 0x65, 0x6f, 0x75, 0x6c, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x54, 0x72, 0x69, 0x70, +0x6f, 0x6c, 0x69, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2d, 0x31, 0x34, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, +0x69, 0x63, 0x2f, 0x4b, 0x69, 0x72, 0x69, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x69, 0x0, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, +0x6c, 0x69, 0x61, 0x2f, 0x4c, 0x6f, 0x72, 0x64, 0x5f, 0x48, 0x6f, 0x77, 0x65, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4d, +0x61, 0x67, 0x61, 0x64, 0x61, 0x6e, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x50, 0x75, 0x6e, 0x74, 0x61, +0x5f, 0x41, 0x72, 0x65, 0x6e, 0x61, 0x73, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x4d, 0x61, 0x72, 0x71, +0x75, 0x65, 0x73, 0x61, 0x73, 0x0, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x2f, 0x4d, 0x61, 0x75, 0x72, 0x69, 0x74, 0x69, +0x75, 0x73, 0x0, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x2f, 0x52, 0x65, 0x75, 0x6e, 0x69, 0x6f, 0x6e, 0x0, 0x49, 0x6e, +0x64, 0x69, 0x61, 0x6e, 0x2f, 0x4d, 0x61, 0x68, 0x65, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x42, 0x65, 0x69, 0x72, 0x75, +0x74, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x6f, 0x6e, 0x74, 0x65, 0x76, 0x69, 0x64, 0x65, 0x6f, +0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x61, 0x73, 0x61, 0x62, 0x6c, 0x61, 0x6e, 0x63, 0x61, 0x0, 0x41, +0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x45, 0x6c, 0x5f, 0x41, 0x61, 0x69, 0x75, 0x6e, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, +0x63, 0x61, 0x2f, 0x43, 0x68, 0x69, 0x68, 0x75, 0x61, 0x68, 0x75, 0x61, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, +0x2f, 0x4d, 0x61, 0x7a, 0x61, 0x74, 0x6c, 0x61, 0x6e, 0x0, 0x4d, 0x53, 0x54, 0x37, 0x4d, 0x44, 0x54, 0x0, 0x41, 0x6d, +0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x45, 0x64, 0x6d, 0x6f, 0x6e, 0x74, 0x6f, 0x6e, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, +0x63, 0x61, 0x2f, 0x43, 0x61, 0x6d, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x5f, 0x42, 0x61, 0x79, 0x20, 0x41, 0x6d, 0x65, +0x72, 0x69, 0x63, 0x61, 0x2f, 0x49, 0x6e, 0x75, 0x76, 0x69, 0x6b, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, +0x59, 0x65, 0x6c, 0x6c, 0x6f, 0x77, 0x6b, 0x6e, 0x69, 0x66, 0x65, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, +0x4f, 0x6a, 0x69, 0x6e, 0x61, 0x67, 0x61, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x44, 0x65, 0x6e, 0x76, +0x65, 0x72, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x42, 0x6f, 0x69, 0x73, 0x65, 0x0, 0x49, 0x6e, 0x64, +0x69, 0x61, 0x6e, 0x2f, 0x43, 0x6f, 0x63, 0x6f, 0x73, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x52, 0x61, 0x6e, 0x67, 0x6f, +0x6f, 0x6e, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4e, 0x6f, 0x76, 0x6f, 0x73, 0x69, 0x62, 0x69, 0x72, 0x73, 0x6b, 0x0, +0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x57, 0x69, 0x6e, 0x64, 0x68, 0x6f, 0x65, 0x6b, 0x0, 0x41, 0x73, 0x69, 0x61, +0x2f, 0x4b, 0x61, 0x74, 0x6d, 0x61, 0x6e, 0x64, 0x75, 0x0, 0x41, 0x6e, 0x74, 0x61, 0x72, 0x63, 0x74, 0x69, 0x63, 0x61, +0x2f, 0x4d, 0x63, 0x4d, 0x75, 0x72, 0x64, 0x6f, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x41, 0x75, 0x63, +0x6b, 0x6c, 0x61, 0x6e, 0x64, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x53, 0x74, 0x5f, 0x4a, 0x6f, 0x68, +0x6e, 0x73, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x4e, 0x6f, 0x72, 0x66, 0x6f, 0x6c, 0x6b, 0x0, 0x41, +0x73, 0x69, 0x61, 0x2f, 0x49, 0x72, 0x6b, 0x75, 0x74, 0x73, 0x6b, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4b, 0x72, 0x61, +0x73, 0x6e, 0x6f, 0x79, 0x61, 0x72, 0x73, 0x6b, 0x20, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4e, 0x6f, 0x76, 0x6f, 0x6b, 0x75, +0x7a, 0x6e, 0x65, 0x74, 0x73, 0x6b, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x50, 0x79, 0x6f, 0x6e, 0x67, 0x79, 0x61, 0x6e, +0x67, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4f, 0x6d, 0x73, 0x6b, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, +0x53, 0x61, 0x6e, 0x74, 0x69, 0x61, 0x67, 0x6f, 0x0, 0x50, 0x53, 0x54, 0x38, 0x50, 0x44, 0x54, 0x0, 0x41, 0x6d, 0x65, +0x72, 0x69, 0x63, 0x61, 0x2f, 0x56, 0x61, 0x6e, 0x63, 0x6f, 0x75, 0x76, 0x65, 0x72, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, +0x63, 0x61, 0x2f, 0x4c, 0x6f, 0x73, 0x5f, 0x41, 0x6e, 0x67, 0x65, 0x6c, 0x65, 0x73, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, +0x63, 0x61, 0x2f, 0x54, 0x69, 0x6a, 0x75, 0x61, 0x6e, 0x61, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x53, +0x61, 0x6e, 0x74, 0x61, 0x5f, 0x49, 0x73, 0x61, 0x62, 0x65, 0x6c, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4b, 0x61, 0x72, +0x61, 0x63, 0x68, 0x69, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x73, 0x75, 0x6e, 0x63, 0x69, 0x6f, +0x6e, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x51, 0x79, 0x7a, 0x79, 0x6c, 0x6f, 0x72, 0x64, 0x61, 0x0, 0x45, 0x75, 0x72, +0x6f, 0x70, 0x65, 0x2f, 0x42, 0x72, 0x75, 0x73, 0x73, 0x65, 0x6c, 0x73, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, +0x43, 0x6f, 0x70, 0x65, 0x6e, 0x68, 0x61, 0x67, 0x65, 0x6e, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x50, 0x61, +0x72, 0x69, 0x73, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4d, 0x61, 0x64, 0x72, 0x69, 0x64, 0x20, 0x41, 0x66, +0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x65, 0x75, 0x74, 0x61, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x53, 0x61, +0x6d, 0x61, 0x72, 0x61, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x53, 0x72, 0x65, 0x64, 0x6e, 0x65, 0x6b, 0x6f, 0x6c, 0x79, +0x6d, 0x73, 0x6b, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4b, 0x61, 0x6d, 0x63, 0x68, 0x61, 0x74, 0x6b, 0x61, 0x20, 0x41, +0x73, 0x69, 0x61, 0x2f, 0x41, 0x6e, 0x61, 0x64, 0x79, 0x72, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4d, 0x6f, +0x73, 0x63, 0x6f, 0x77, 0x20, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4b, 0x69, 0x72, 0x6f, 0x76, 0x0, 0x45, 0x75, +0x72, 0x6f, 0x70, 0x65, 0x2f, 0x53, 0x69, 0x6d, 0x66, 0x65, 0x72, 0x6f, 0x70, 0x6f, 0x6c, 0x0, 0x45, 0x74, 0x63, 0x2f, +0x47, 0x4d, 0x54, 0x2b, 0x33, 0x0, 0x41, 0x6e, 0x74, 0x61, 0x72, 0x63, 0x74, 0x69, 0x63, 0x61, 0x2f, 0x52, 0x6f, 0x74, +0x68, 0x65, 0x72, 0x61, 0x20, 0x41, 0x6e, 0x74, 0x61, 0x72, 0x63, 0x74, 0x69, 0x63, 0x61, 0x2f, 0x50, 0x61, 0x6c, 0x6d, +0x65, 0x72, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x46, 0x6f, 0x72, 0x74, 0x61, 0x6c, 0x65, 0x7a, 0x61, +0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x42, 0x65, 0x6c, 0x65, 0x6d, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, +0x63, 0x61, 0x2f, 0x4d, 0x61, 0x63, 0x65, 0x69, 0x6f, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x52, 0x65, +0x63, 0x69, 0x66, 0x65, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x53, 0x61, 0x6e, 0x74, 0x61, 0x72, 0x65, +0x6d, 0x0, 0x41, 0x74, 0x6c, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x2f, 0x53, 0x74, 0x61, 0x6e, 0x6c, 0x65, 0x79, 0x0, 0x41, +0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x61, 0x79, 0x65, 0x6e, 0x6e, 0x65, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, +0x63, 0x61, 0x2f, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x61, 0x72, 0x69, 0x62, 0x6f, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, +0x54, 0x2b, 0x35, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x52, 0x69, 0x6f, 0x5f, 0x42, 0x72, 0x61, 0x6e, +0x63, 0x6f, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x45, 0x69, 0x72, 0x75, 0x6e, 0x65, 0x70, 0x65, 0x0, +0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x6f, 0x72, 0x61, 0x6c, 0x5f, 0x48, 0x61, 0x72, 0x62, 0x6f, 0x75, +0x72, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x61, 0x79, 0x6d, 0x61, 0x6e, 0x0, 0x41, 0x6d, 0x65, +0x72, 0x69, 0x63, 0x61, 0x2f, 0x42, 0x6f, 0x67, 0x6f, 0x74, 0x61, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, +0x47, 0x75, 0x61, 0x79, 0x61, 0x71, 0x75, 0x69, 0x6c, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4a, 0x61, +0x6d, 0x61, 0x69, 0x63, 0x61, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x50, 0x61, 0x6e, 0x61, 0x6d, 0x61, +0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4c, 0x69, 0x6d, 0x61, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, +0x54, 0x2b, 0x34, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x6e, 0x67, 0x75, 0x69, 0x6c, 0x6c, 0x61, +0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x6e, 0x74, 0x69, 0x67, 0x75, 0x61, 0x0, 0x41, 0x6d, 0x65, +0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x72, 0x75, 0x62, 0x61, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x42, +0x61, 0x72, 0x62, 0x61, 0x64, 0x6f, 0x73, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4c, 0x61, 0x5f, 0x50, +0x61, 0x7a, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x61, 0x6e, 0x61, 0x75, 0x73, 0x20, 0x41, 0x6d, +0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x42, 0x6f, 0x61, 0x5f, 0x56, 0x69, 0x73, 0x74, 0x61, 0x20, 0x41, 0x6d, 0x65, 0x72, +0x69, 0x63, 0x61, 0x2f, 0x50, 0x6f, 0x72, 0x74, 0x6f, 0x5f, 0x56, 0x65, 0x6c, 0x68, 0x6f, 0x0, 0x41, 0x6d, 0x65, 0x72, +0x69, 0x63, 0x61, 0x2f, 0x42, 0x6c, 0x61, 0x6e, 0x63, 0x2d, 0x53, 0x61, 0x62, 0x6c, 0x6f, 0x6e, 0x0, 0x41, 0x6d, 0x65, +0x72, 0x69, 0x63, 0x61, 0x2f, 0x44, 0x6f, 0x6d, 0x69, 0x6e, 0x69, 0x63, 0x61, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, +0x61, 0x2f, 0x53, 0x61, 0x6e, 0x74, 0x6f, 0x5f, 0x44, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x6f, 0x0, 0x41, 0x6d, 0x65, 0x72, +0x69, 0x63, 0x61, 0x2f, 0x47, 0x72, 0x65, 0x6e, 0x61, 0x64, 0x61, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, +0x47, 0x75, 0x61, 0x64, 0x65, 0x6c, 0x6f, 0x75, 0x70, 0x65, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x47, +0x75, 0x79, 0x61, 0x6e, 0x61, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x61, 0x72, 0x74, 0x69, 0x6e, +0x69, 0x71, 0x75, 0x65, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x6f, 0x6e, 0x74, 0x73, 0x65, 0x72, +0x72, 0x61, 0x74, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x75, 0x72, 0x61, 0x63, 0x61, 0x6f, 0x0, +0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x50, 0x75, 0x65, 0x72, 0x74, 0x6f, 0x5f, 0x52, 0x69, 0x63, 0x6f, 0x0, +0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x53, 0x74, 0x5f, 0x4b, 0x69, 0x74, 0x74, 0x73, 0x0, 0x41, 0x6d, 0x65, +0x72, 0x69, 0x63, 0x61, 0x2f, 0x53, 0x74, 0x5f, 0x4c, 0x75, 0x63, 0x69, 0x61, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, +0x61, 0x2f, 0x53, 0x74, 0x5f, 0x56, 0x69, 0x6e, 0x63, 0x65, 0x6e, 0x74, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, +0x2f, 0x50, 0x6f, 0x72, 0x74, 0x5f, 0x6f, 0x66, 0x5f, 0x53, 0x70, 0x61, 0x69, 0x6e, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, +0x63, 0x61, 0x2f, 0x54, 0x6f, 0x72, 0x74, 0x6f, 0x6c, 0x61, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x53, +0x74, 0x5f, 0x54, 0x68, 0x6f, 0x6d, 0x61, 0x73, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x53, 0x74, 0x5f, +0x42, 0x61, 0x72, 0x74, 0x68, 0x65, 0x6c, 0x65, 0x6d, 0x79, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, +0x61, 0x72, 0x69, 0x67, 0x6f, 0x74, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4b, 0x72, 0x61, 0x6c, 0x65, +0x6e, 0x64, 0x69, 0x6a, 0x6b, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4c, 0x6f, 0x77, 0x65, 0x72, 0x5f, +0x50, 0x72, 0x69, 0x6e, 0x63, 0x65, 0x73, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x69, 0x71, 0x75, +0x65, 0x6c, 0x6f, 0x6e, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x53, 0x61, 0x6b, 0x68, 0x61, 0x6c, 0x69, 0x6e, 0x0, 0x50, +0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x41, 0x70, 0x69, 0x61, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x53, +0x61, 0x6f, 0x5f, 0x54, 0x6f, 0x6d, 0x65, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x53, 0x61, 0x72, 0x61, 0x74, +0x6f, 0x76, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2d, 0x37, 0x0, 0x41, 0x6e, 0x74, 0x61, 0x72, 0x63, 0x74, +0x69, 0x63, 0x61, 0x2f, 0x44, 0x61, 0x76, 0x69, 0x73, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x50, 0x68, 0x6e, 0x6f, 0x6d, +0x5f, 0x50, 0x65, 0x6e, 0x68, 0x0, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x2f, 0x43, 0x68, 0x72, 0x69, 0x73, 0x74, 0x6d, +0x61, 0x73, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4a, 0x61, 0x6b, 0x61, 0x72, 0x74, 0x61, 0x20, 0x41, 0x73, 0x69, 0x61, +0x2f, 0x50, 0x6f, 0x6e, 0x74, 0x69, 0x61, 0x6e, 0x61, 0x6b, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x56, 0x69, 0x65, 0x6e, +0x74, 0x69, 0x61, 0x6e, 0x65, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x42, 0x61, 0x6e, 0x67, 0x6b, 0x6f, 0x6b, 0x0, 0x41, +0x73, 0x69, 0x61, 0x2f, 0x53, 0x61, 0x69, 0x67, 0x6f, 0x6e, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2d, 0x38, +0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x42, 0x72, 0x75, 0x6e, 0x65, 0x69, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4d, 0x61, +0x6b, 0x61, 0x73, 0x73, 0x61, 0x72, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4b, 0x75, 0x61, 0x6c, 0x61, 0x5f, 0x4c, 0x75, +0x6d, 0x70, 0x75, 0x72, 0x20, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4b, 0x75, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x0, 0x41, 0x73, +0x69, 0x61, 0x2f, 0x4d, 0x61, 0x6e, 0x69, 0x6c, 0x61, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x53, 0x69, 0x6e, 0x67, 0x61, +0x70, 0x6f, 0x72, 0x65, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2d, 0x32, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, +0x61, 0x2f, 0x47, 0x61, 0x62, 0x6f, 0x72, 0x6f, 0x6e, 0x65, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x42, 0x75, +0x6a, 0x75, 0x6d, 0x62, 0x75, 0x72, 0x61, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4c, 0x75, 0x62, 0x75, 0x6d, +0x62, 0x61, 0x73, 0x68, 0x69, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x61, 0x73, 0x65, 0x72, 0x75, 0x0, +0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x42, 0x6c, 0x61, 0x6e, 0x74, 0x79, 0x72, 0x65, 0x0, 0x41, 0x66, 0x72, 0x69, +0x63, 0x61, 0x2f, 0x4d, 0x61, 0x70, 0x75, 0x74, 0x6f, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4b, 0x69, 0x67, +0x61, 0x6c, 0x69, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4a, 0x6f, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x73, 0x62, +0x75, 0x72, 0x67, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x62, 0x61, 0x62, 0x61, 0x6e, 0x65, 0x0, 0x41, +0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4c, 0x75, 0x73, 0x61, 0x6b, 0x61, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, +0x48, 0x61, 0x72, 0x61, 0x72, 0x65, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4a, 0x75, 0x62, 0x61, 0x0, 0x41, +0x73, 0x69, 0x61, 0x2f, 0x43, 0x6f, 0x6c, 0x6f, 0x6d, 0x62, 0x6f, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4b, +0x68, 0x61, 0x72, 0x74, 0x6f, 0x75, 0x6d, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x44, 0x61, 0x6d, 0x61, 0x73, 0x63, 0x75, +0x73, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x54, 0x61, 0x69, 0x70, 0x65, 0x69, 0x0, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, +0x6c, 0x69, 0x61, 0x2f, 0x48, 0x6f, 0x62, 0x61, 0x72, 0x74, 0x20, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, +0x2f, 0x43, 0x75, 0x72, 0x72, 0x69, 0x65, 0x20, 0x41, 0x6e, 0x74, 0x61, 0x72, 0x63, 0x74, 0x69, 0x63, 0x61, 0x2f, 0x4d, +0x61, 0x63, 0x71, 0x75, 0x61, 0x72, 0x69, 0x65, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x72, 0x61, +0x67, 0x75, 0x61, 0x69, 0x6e, 0x61, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2d, 0x39, 0x0, 0x41, 0x73, 0x69, +0x61, 0x2f, 0x44, 0x69, 0x6c, 0x69, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4a, 0x61, 0x79, 0x61, 0x70, 0x75, 0x72, 0x61, +0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x54, 0x6f, 0x6b, 0x79, 0x6f, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, +0x50, 0x61, 0x6c, 0x61, 0x75, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x54, 0x6f, 0x6d, 0x73, 0x6b, 0x0, 0x50, 0x61, 0x63, +0x69, 0x66, 0x69, 0x63, 0x2f, 0x54, 0x6f, 0x6e, 0x67, 0x61, 0x74, 0x61, 0x70, 0x75, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, +0x43, 0x68, 0x69, 0x74, 0x61, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x49, 0x73, 0x74, 0x61, 0x6e, 0x62, 0x75, +0x6c, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x47, 0x72, 0x61, 0x6e, 0x64, 0x5f, 0x54, 0x75, 0x72, 0x6b, +0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x55, 0x6c, 0x61, 0x61, 0x6e, 0x62, 0x61, 0x61, 0x74, 0x61, 0x72, 0x20, 0x41, 0x73, +0x69, 0x61, 0x2f, 0x43, 0x68, 0x6f, 0x69, 0x62, 0x61, 0x6c, 0x73, 0x61, 0x6e, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, +0x61, 0x2f, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x61, 0x70, 0x6f, 0x6c, 0x69, 0x73, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, +0x63, 0x61, 0x2f, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x61, 0x2f, 0x4d, 0x61, 0x72, 0x65, 0x6e, 0x67, 0x6f, 0x20, 0x41, +0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x61, 0x2f, 0x56, 0x65, 0x76, 0x61, 0x79, +0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2b, 0x37, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x6e, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x44, 0x61, 0x77, 0x73, 0x6f, -0x6e, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x44, 0x61, 0x77, 0x73, 0x6f, 0x6e, 0x5f, 0x43, 0x72, 0x65, -0x65, 0x6b, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x46, 0x6f, 0x72, 0x74, 0x5f, 0x4e, 0x65, 0x6c, 0x73, +0x6e, 0x5f, 0x43, 0x72, 0x65, 0x65, 0x6b, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x46, 0x6f, 0x72, 0x74, +0x5f, 0x4e, 0x65, 0x6c, 0x73, 0x6f, 0x6e, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x48, 0x65, 0x72, 0x6d, +0x6f, 0x73, 0x69, 0x6c, 0x6c, 0x6f, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x50, 0x68, 0x6f, 0x65, 0x6e, +0x69, 0x78, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2b, 0x31, 0x31, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, +0x63, 0x2f, 0x50, 0x61, 0x67, 0x6f, 0x5f, 0x50, 0x61, 0x67, 0x6f, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, +0x4e, 0x69, 0x75, 0x65, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x4d, 0x69, 0x64, 0x77, 0x61, 0x79, 0x0, +0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2b, 0x39, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x47, 0x61, +0x6d, 0x62, 0x69, 0x65, 0x72, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2b, 0x38, 0x0, 0x50, 0x61, 0x63, 0x69, +0x66, 0x69, 0x63, 0x2f, 0x50, 0x69, 0x74, 0x63, 0x61, 0x69, 0x72, 0x6e, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, +0x2b, 0x32, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4e, 0x6f, 0x72, 0x6f, 0x6e, 0x68, 0x61, 0x0, 0x41, +0x74, 0x6c, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x2f, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x5f, 0x47, 0x65, 0x6f, 0x72, 0x67, 0x69, +0x61, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x55, 0x54, 0x43, 0x20, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x0, 0x45, 0x74, +0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2d, 0x31, 0x32, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x54, 0x61, 0x72, +0x61, 0x77, 0x61, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x4d, 0x61, 0x6a, 0x75, 0x72, 0x6f, 0x20, 0x50, +0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x4b, 0x77, 0x61, 0x6a, 0x61, 0x6c, 0x65, 0x69, 0x6e, 0x0, 0x50, 0x61, 0x63, +0x69, 0x66, 0x69, 0x63, 0x2f, 0x4e, 0x61, 0x75, 0x72, 0x75, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x46, +0x75, 0x6e, 0x61, 0x66, 0x75, 0x74, 0x69, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x57, 0x61, 0x6b, 0x65, +0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x57, 0x61, 0x6c, 0x6c, 0x69, 0x73, 0x0, 0x45, 0x74, 0x63, 0x2f, +0x47, 0x4d, 0x54, 0x2d, 0x31, 0x33, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x45, 0x6e, 0x64, 0x65, 0x72, +0x62, 0x75, 0x72, 0x79, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x46, 0x61, 0x6b, 0x61, 0x6f, 0x66, 0x6f, +0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x61, 0x72, 0x61, 0x63, 0x61, 0x73, 0x0, 0x41, 0x73, 0x69, +0x61, 0x2f, 0x56, 0x6c, 0x61, 0x64, 0x69, 0x76, 0x6f, 0x73, 0x74, 0x6f, 0x6b, 0x20, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x55, +0x73, 0x74, 0x2d, 0x4e, 0x65, 0x72, 0x61, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x56, 0x6f, 0x6c, 0x67, 0x6f, +0x67, 0x72, 0x61, 0x64, 0x0, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, 0x2f, 0x50, 0x65, 0x72, 0x74, 0x68, +0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2d, 0x31, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x6c, +0x67, 0x69, 0x65, 0x72, 0x73, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4c, 0x75, 0x61, 0x6e, 0x64, 0x61, 0x0, +0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x50, 0x6f, 0x72, 0x74, 0x6f, 0x2d, 0x4e, 0x6f, 0x76, 0x6f, 0x0, 0x41, 0x66, +0x72, 0x69, 0x63, 0x61, 0x2f, 0x44, 0x6f, 0x75, 0x61, 0x6c, 0x61, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x42, +0x61, 0x6e, 0x67, 0x75, 0x69, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4e, 0x64, 0x6a, 0x61, 0x6d, 0x65, 0x6e, +0x61, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4b, 0x69, 0x6e, 0x73, 0x68, 0x61, 0x73, 0x61, 0x0, 0x41, 0x66, +0x72, 0x69, 0x63, 0x61, 0x2f, 0x42, 0x72, 0x61, 0x7a, 0x7a, 0x61, 0x76, 0x69, 0x6c, 0x6c, 0x65, 0x0, 0x41, 0x66, 0x72, +0x69, 0x63, 0x61, 0x2f, 0x4d, 0x61, 0x6c, 0x61, 0x62, 0x6f, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4c, 0x69, +0x62, 0x72, 0x65, 0x76, 0x69, 0x6c, 0x6c, 0x65, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4e, 0x69, 0x61, 0x6d, +0x65, 0x79, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4c, 0x61, 0x67, 0x6f, 0x73, 0x0, 0x41, 0x66, 0x72, 0x69, +0x63, 0x61, 0x2f, 0x54, 0x75, 0x6e, 0x69, 0x73, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x41, 0x6e, 0x64, 0x6f, +0x72, 0x72, 0x61, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x56, 0x69, 0x65, 0x6e, 0x6e, 0x61, 0x0, 0x45, 0x75, +0x72, 0x6f, 0x70, 0x65, 0x2f, 0x42, 0x65, 0x72, 0x6c, 0x69, 0x6e, 0x20, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x42, +0x75, 0x73, 0x69, 0x6e, 0x67, 0x65, 0x6e, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x47, 0x69, 0x62, 0x72, 0x61, +0x6c, 0x74, 0x61, 0x72, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x52, 0x6f, 0x6d, 0x65, 0x0, 0x45, 0x75, 0x72, +0x6f, 0x70, 0x65, 0x2f, 0x56, 0x61, 0x64, 0x75, 0x7a, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4c, 0x75, 0x78, +0x65, 0x6d, 0x62, 0x6f, 0x75, 0x72, 0x67, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4d, 0x61, 0x6c, 0x74, 0x61, +0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4d, 0x6f, 0x6e, 0x61, 0x63, 0x6f, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, +0x65, 0x2f, 0x41, 0x6d, 0x73, 0x74, 0x65, 0x72, 0x64, 0x61, 0x6d, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4f, +0x73, 0x6c, 0x6f, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x53, 0x61, 0x6e, 0x5f, 0x4d, 0x61, 0x72, 0x69, 0x6e, +0x6f, 0x0, 0x41, 0x72, 0x63, 0x74, 0x69, 0x63, 0x2f, 0x4c, 0x6f, 0x6e, 0x67, 0x79, 0x65, 0x61, 0x72, 0x62, 0x79, 0x65, +0x6e, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x53, 0x74, 0x6f, 0x63, 0x6b, 0x68, 0x6f, 0x6c, 0x6d, 0x0, 0x45, +0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x5a, 0x75, 0x72, 0x69, 0x63, 0x68, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, +0x56, 0x61, 0x74, 0x69, 0x63, 0x61, 0x6e, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x48, 0x6f, 0x76, 0x64, 0x0, 0x45, 0x74, +0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2d, 0x35, 0x0, 0x41, 0x6e, 0x74, 0x61, 0x72, 0x63, 0x74, 0x69, 0x63, 0x61, 0x2f, 0x4d, +0x61, 0x77, 0x73, 0x6f, 0x6e, 0x0, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x2f, 0x4b, 0x65, 0x72, 0x67, 0x75, 0x65, 0x6c, +0x65, 0x6e, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4f, 0x72, 0x61, 0x6c, 0x20, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x41, 0x71, +0x74, 0x61, 0x75, 0x20, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x41, 0x71, 0x74, 0x6f, 0x62, 0x65, 0x20, 0x41, 0x73, 0x69, 0x61, +0x2f, 0x41, 0x74, 0x79, 0x72, 0x61, 0x75, 0x0, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x2f, 0x4d, 0x61, 0x6c, 0x64, 0x69, +0x76, 0x65, 0x73, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x44, 0x75, 0x73, 0x68, 0x61, 0x6e, 0x62, 0x65, 0x0, 0x41, 0x73, +0x69, 0x61, 0x2f, 0x41, 0x73, 0x68, 0x67, 0x61, 0x62, 0x61, 0x74, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x54, 0x61, 0x73, +0x68, 0x6b, 0x65, 0x6e, 0x74, 0x20, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x53, 0x61, 0x6d, 0x61, 0x72, 0x6b, 0x61, 0x6e, 0x64, +0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x48, 0x65, 0x62, 0x72, 0x6f, 0x6e, 0x20, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x47, 0x61, +0x7a, 0x61, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2d, 0x31, 0x30, 0x0, 0x41, 0x6e, 0x74, 0x61, 0x72, 0x63, +0x74, 0x69, 0x63, 0x61, 0x2f, 0x44, 0x75, 0x6d, 0x6f, 0x6e, 0x74, 0x44, 0x55, 0x72, 0x76, 0x69, 0x6c, 0x6c, 0x65, 0x0, +0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x47, 0x75, 0x61, 0x6d, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, +0x2f, 0x54, 0x72, 0x75, 0x6b, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x53, 0x61, 0x69, 0x70, 0x61, 0x6e, +0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x50, 0x6f, 0x72, 0x74, 0x5f, 0x4d, 0x6f, 0x72, 0x65, 0x73, 0x62, +0x79, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x59, 0x61, 0x6b, 0x75, 0x74, 0x73, 0x6b, 0x20, 0x41, 0x73, 0x69, 0x61, 0x2f, +0x4b, 0x68, 0x61, 0x6e, 0x64, 0x79, 0x67, 0x61, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x57, 0x68, 0x69, +0x74, 0x65, 0x68, 0x6f, 0x72, 0x73, 0x65, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x44, 0x61, 0x77, 0x73, 0x6f, 0x6e, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x42, 0x75, 0x65, 0x6e, 0x6f, 0x73, 0x5f, 0x41, 0x69, 0x72, 0x65, 0x73, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x41, 0x73, 0x74, 0x72, 0x61, 0x6b, 0x68, 0x61, 0x6e, 0x0, 0x41, @@ -1231,7 +1232,7 @@ static const char ianaIdData[] = { 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4d, 0x6f, 0x73, 0x63, 0x6f, 0x77, 0x0, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, 0x2f, 0x48, 0x6f, 0x62, 0x61, 0x72, 0x74, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x55, 0x6c, 0x61, 0x61, 0x6e, 0x62, 0x61, 0x61, 0x74, 0x61, 0x72, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, -0x61, 0x70, 0x6f, 0x6c, 0x69, 0x73, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, +0x61, 0x70, 0x6f, 0x6c, 0x69, 0x73, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x55, 0x54, 0x43, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x56, 0x6c, 0x61, 0x64, 0x69, 0x76, 0x6f, 0x73, 0x74, 0x6f, 0x6b, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x42, 0x65, 0x72, 0x6c, 0x69, 0x6e, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x54, 0x61, 0x73, 0x68, 0x6b, 0x65, 0x6e, 0x74, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x48, 0x65, 0x62, 0x72, 0x6f, 0x6e, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x59, 0x61, 0x6b, diff --git a/src/corelib/time/qtimezoneprivate_tz.cpp b/src/corelib/time/qtimezoneprivate_tz.cpp index a21b7ab5..b1611d7d 100644 --- a/src/corelib/time/qtimezoneprivate_tz.cpp +++ b/src/corelib/time/qtimezoneprivate_tz.cpp @@ -350,6 +350,11 @@ static QByteArray parseTzPosixRule(QDataStream &ds) static QDate calculateDowDate(int year, int month, int dayOfWeek, int week) { + if (dayOfWeek == 0) // Sunday; we represent it as 7, POSIX uses 0 + dayOfWeek = 7; + else if (dayOfWeek & ~7 || month < 1 || month > 12 || week < 1 || week > 5) + return QDate(); + QDate date(year, month, 1); int startDow = date.dayOfWeek(); if (startDow <= dayOfWeek) @@ -364,28 +369,34 @@ static QDate calculateDowDate(int year, int month, int dayOfWeek, int week) static QDate calculatePosixDate(const QByteArray &dateRule, int year) { + bool ok; // Can start with M, J, or a digit if (dateRule.at(0) == 'M') { // nth week in month format "Mmonth.week.dow" QList dateParts = dateRule.split('.'); - int month = dateParts.at(0).mid(1).toInt(); - int week = dateParts.at(1).toInt(); - int dow = dateParts.at(2).toInt(); - if (dow == 0) // Sunday; we represent it as 7 - dow = 7; - return calculateDowDate(year, month, dow, week); + if (dateParts.count() > 2) { + int month = dateParts.at(0).mid(1).toInt(&ok); + int week = ok ? dateParts.at(1).toInt(&ok) : 0; + int dow = ok ? dateParts.at(2).toInt(&ok) : 0; + if (ok) + return calculateDowDate(year, month, dow, week); + } } else if (dateRule.at(0) == 'J') { // Day of Year ignores Feb 29 - int doy = dateRule.mid(1).toInt(); - QDate date = QDate(year, 1, 1).addDays(doy - 1); - if (QDate::isLeapYear(date.year())) - date = date.addDays(-1); - return date; + int doy = dateRule.mid(1).toInt(&ok); + if (ok && doy > 0 && doy < 366) { + QDate date = QDate(year, 1, 1).addDays(doy - 1); + if (QDate::isLeapYear(date.year()) && date.month() > 2) + date = date.addDays(-1); + return date; + } } else { // Day of Year includes Feb 29 - int doy = dateRule.toInt(); - return QDate(year, 1, 1).addDays(doy - 1); + int doy = dateRule.toInt(&ok); + if (ok && doy > 0 && doy <= 366) + return QDate(year, 1, 1).addDays(doy - 1); } + return QDate(); } // returns the time in seconds, INT_MIN if we failed to parse @@ -576,7 +587,8 @@ static QVector calculatePosixTransitions(const QByteArra result << data; return result; } - + if (parts.count() < 3 || parts.at(1).isEmpty() || parts.at(2).isEmpty()) + return result; // Malformed. // Get the std to dst transtion details QList dstParts = parts.at(1).split('/'); @@ -596,6 +608,9 @@ static QVector calculatePosixTransitions(const QByteArra else stdTime = QTime(2, 0, 0); + if (dstDateRule.isEmpty() || stdDateRule.isEmpty() || !dstTime.isValid() || !stdTime.isValid()) + return result; // Malformed. + // Limit year to the range QDateTime can represent: const int minYear = int(QDateTime::YearRange::First); const int maxYear = int(QDateTime::YearRange::Last); @@ -860,7 +875,7 @@ QTzTimeZoneCacheEntry QTzTimeZoneCache::fetchEntry(const QByteArray &ianaId) void QTzTimeZonePrivate::init(const QByteArray &ianaId) { static QTzTimeZoneCache tzCache; - const auto &entry = tzCache.fetchEntry(ianaId); + auto entry = tzCache.fetchEntry(ianaId); if (entry.m_tranTimes.isEmpty() && entry.m_posixRule.isEmpty()) return; // Invalid after all ! @@ -1169,8 +1184,11 @@ public: */ const StatIdent local = identify("/etc/localtime"); const StatIdent tz = identify("/etc/TZ"); - if (!m_name.isEmpty() && m_last.isValid() && (m_last == local || m_last == tz)) + const StatIdent timezone = identify("/etc/timezone"); + if (!m_name.isEmpty() && m_last.isValid() + && (m_last == local || m_last == tz || m_last == timezone)) { return m_name; + } m_name = etcLocalTime(); if (!m_name.isEmpty()) { @@ -1178,12 +1196,19 @@ public: return m_name; } - m_name = etcTZ(); - m_last = m_name.isEmpty() ? StatIdent() : tz; + // Some systems (e.g. uClibc) have a default value for $TZ in /etc/TZ: + m_name = etcContent(QStringLiteral("/etc/TZ")); + if (!m_name.isEmpty()) { + m_last = tz; + return m_name; + } + + // Gentoo still (2020, QTBUG-87326) uses this: + m_name = etcContent(QStringLiteral("/etc/timezone")); + m_last = m_name.isEmpty() ? StatIdent() : timezone; return m_name; } - private: QByteArray m_name; struct StatIdent @@ -1224,10 +1249,8 @@ private: return QByteArray(); } - static QByteArray etcTZ() + static QByteArray etcContent(const QString &path) { - // Some systems (e.g. uClibc) have a default value for $TZ in /etc/TZ: - const QString path = QStringLiteral("/etc/TZ"); QFile zone(path); if (zone.open(QIODevice::ReadOnly)) return zone.readAll().trimmed(); diff --git a/src/corelib/tools/qduplicatetracker_p.h b/src/corelib/tools/qduplicatetracker_p.h index 99068c01..68284fb9 100644 --- a/src/corelib/tools/qduplicatetracker_p.h +++ b/src/corelib/tools/qduplicatetracker_p.h @@ -64,11 +64,18 @@ QT_BEGIN_NAMESPACE template class QDuplicateTracker { #ifdef __cpp_lib_memory_resource - char buffer[Prealloc * sizeof(T)]; + struct node_guesstimate { void *next; size_t hash; T value; }; + static constexpr size_t bufferSize(size_t N) { + return N * sizeof(void*) // bucket list + + N * sizeof(node_guesstimate); // nodes + } + + char buffer[bufferSize(Prealloc)]; std::pmr::monotonic_buffer_resource res{buffer, sizeof buffer}; - std::pmr::unordered_set set{&res}; + std::pmr::unordered_set set{Prealloc, &res}; #else - QSet set; + static QSet makeQSet() { QSet r; r.reserve(Prealloc); return r; } + QSet set = makeQSet(); int setSize = 0; #endif Q_DISABLE_COPY_MOVE(QDuplicateTracker); diff --git a/src/corelib/tools/qlist.cpp b/src/corelib/tools/qlist.cpp index 5d5da207..f0b92b52 100644 --- a/src/corelib/tools/qlist.cpp +++ b/src/corelib/tools/qlist.cpp @@ -2017,7 +2017,7 @@ void **QListData::erase(void **xi) \include containers-range-constructor.qdocinc - \sa fromSet(), toVector(), QVector::toList() + \sa toVector(), QVector::toList() */ /*! \fn template QVector QList::toVector() const @@ -2030,61 +2030,91 @@ void **QListData::erase(void **xi) \include containers-range-constructor.qdocinc - \sa toSet(), fromVector(), QVector::fromList() + \sa fromVector(), QVector::fromList() */ /*! \fn template QList QList::fromSet(const QSet &set) + \obsolete Returns a QList object with the data contained in \a set. The order of the elements in the QList is undefined. - Example: - - \snippet code/src_corelib_tools_qlistdata.cpp 23 - \include containers-range-constructor.qdocinc - \sa fromVector(), toSet(), QSet::toList() + \oldcode + QSet set; + // ... + QList list = QList::fromSet(set); + \newcode + QSet set; + // ... + QList list(set.begin(), set.end()); + \endcode + + \sa QList(InputIterator, InputIterator), fromVector(), toSet(), QSet::toList() */ /*! \fn template QSet QList::toSet() const + \obsolete Returns a QSet object with the data contained in this QList. Since QSet doesn't allow duplicates, the resulting QSet might be smaller than the original list was. - Example: - - \snippet code/src_corelib_tools_qlistdata.cpp 24 - \include containers-range-constructor.qdocinc - \sa toVector(), fromSet(), QSet::fromList() + \oldcode + QStringList list; + // ... + QSet set = list.toSet(); + \newcode + QStringList list; + // ... + QSet set(list.begin(), list.end()); + \endcode + + \sa QSet::QSet(InputIterator, InputIterator), toVector(), fromSet(), QSet::fromList() */ /*! \fn template QList QList::fromStdList(const std::list &list) + \obsolete Returns a QList object with the data contained in \a list. The order of the elements in the QList is the same as in \a list. - Example: - - \snippet code/src_corelib_tools_qlistdata.cpp 25 - \include containers-range-constructor.qdocinc - \sa toStdList(), QVector::fromStdVector() + \oldcode + std::list stdlist; + // ... + QList list = QList::fromStdList(stdlist); + \newcode + std::list stdlist; + // ... + QList list(stdlist.begin(), stdlist.end()); + \endcode + + \sa QList(InputIterator, InputIterator), toStdList(), QVector::fromStdVector() */ /*! \fn template std::list QList::toStdList() const + \obsolete Returns a std::list object with the data contained in this QList. Example: - \snippet code/src_corelib_tools_qlistdata.cpp 26 - \include containers-range-constructor.qdocinc + \oldcode + QList list; + // ... + std::list stdlist = list.toStdList(); + \newcode + QList list; + // ... + std::list stdlist(list.begin(), list.end()); + \endcode + \sa fromStdList(), QVector::toStdVector() */ diff --git a/src/corelib/tools/qoffsetstringarray_p.h b/src/corelib/tools/qoffsetstringarray_p.h index 4dd9e960..e26a57ff 100644 --- a/src/corelib/tools/qoffsetstringarray_p.h +++ b/src/corelib/tools/qoffsetstringarray_p.h @@ -55,6 +55,7 @@ #include #include +#include QT_BEGIN_NAMESPACE diff --git a/src/corelib/tools/qset.qdoc b/src/corelib/tools/qset.qdoc index 42dd1288..dcd6de3d 100644 --- a/src/corelib/tools/qset.qdoc +++ b/src/corelib/tools/qset.qdoc @@ -1071,17 +1071,32 @@ */ /*! \fn template QList QSet::toList() const + \obsolete Returns a new QList containing the elements in the set. The order of the elements in the QList is undefined. - Example: - - \snippet code/doc_src_qset.cpp 13 - \include containers-range-constructor.qdocinc - \sa fromList(), QList::fromSet() + \oldcode + QSet set; + // ... + QList list = set.toList(); + \newcode + QSet set; + // ... + QList list(set.begin(), set.end()); + \endcode + + or + + \code + QSet set; + // ... + QList list = set.values(); + \endcode + + \sa QList::QList(InputIterator, InputIterator), values(), fromList(), QList::fromSet() */ /*! \fn template QList QSet::values() const @@ -1089,28 +1104,44 @@ Returns a new QList containing the elements in the set. The order of the elements in the QList is undefined. - This is the same as toList(). - \include containers-range-constructor.qdocinc - \sa fromList(), QList::fromSet() + \oldcode + QSet set; + // ... + QList list = set.values(); + \newcode + QSet set; + // ... + QList list(set.begin(), set.end()); + \endcode + + + \sa QList::QList(InputIterator, InputIterator) */ /*! \fn template QSet QSet::fromList(const QList &list) + \obsolete Returns a new QSet object containing the data contained in \a list. Since QSet doesn't allow duplicates, the resulting QSet might be smaller than the \a list, because QList can contain duplicates. - Example: - - \snippet code/doc_src_qset.cpp 14 - \include containers-range-constructor.qdocinc - \sa toList(), QList::toSet() + \oldcode + QStringList list; + // ... + QSet set = QSet::fromList(list); + \newcode + QStringList list; + // ... + QSet set(list.begin(), list.end()); + \endcode + + \sa QSet(InputIterator, InputIterator), values(), QList::toSet() */ /*! diff --git a/src/corelib/tools/qsharedpointer_impl.h b/src/corelib/tools/qsharedpointer_impl.h index 790c187c..618b31e3 100644 --- a/src/corelib/tools/qsharedpointer_impl.h +++ b/src/corelib/tools/qsharedpointer_impl.h @@ -881,7 +881,7 @@ Q_INLINE_TEMPLATE bool operator<(T *ptr1, const QSharedPointer &ptr2) template Q_INLINE_TEMPLATE uint qHash(const QSharedPointer &ptr, uint seed = 0) { - return QT_PREPEND_NAMESPACE(qHash)(ptr.data(), seed); + return qHash(ptr.data(), seed); } @@ -1012,15 +1012,11 @@ std::shared_ptr qobject_pointer_cast(std::shared_ptr &&src) using element_type = typename std::shared_ptr::element_type; auto castResult = qobject_cast(src.get()); if (castResult) { - auto result = std::shared_ptr(std::move(src), castResult); -#if __cplusplus <= 201703L // C++2a's move aliasing constructor will leave src empty. // Before C++2a we don't really know if the compiler has support for it. // The move aliasing constructor is the resolution for LWG2996, // which does not impose a feature-testing macro. So: clear src. - src.reset(); -#endif - return result; + return std::shared_ptr(qExchange(src, nullptr), castResult); } return std::shared_ptr(); } diff --git a/src/corelib/tools/qsimd.cpp b/src/corelib/tools/qsimd.cpp index 6ad6795f..798ac93a 100644 --- a/src/corelib/tools/qsimd.cpp +++ b/src/corelib/tools/qsimd.cpp @@ -132,7 +132,7 @@ static inline quint64 detectProcessorFeatures() #if defined(Q_OS_LINUX) # if defined(Q_PROCESSOR_ARM_V8) && defined(Q_PROCESSOR_ARM_64) - features |= Q_UINT64_C(1) << CpuFeatureNEON; // NEON is always available on ARMv8 64bit. + features |= CpuFeatureNEON; // NEON is always available on ARMv8 64bit. # endif int auxv = qt_safe_open("/proc/self/auxv", O_RDONLY); if (auxv != -1) { @@ -151,17 +151,17 @@ static inline quint64 detectProcessorFeatures() # if defined(Q_PROCESSOR_ARM_V8) && defined(Q_PROCESSOR_ARM_64) // For Aarch64: if (vector[i+1] & HWCAP_CRC32) - features |= Q_UINT64_C(1) << CpuFeatureCRC32; + features |= CpuFeatureCRC32; # endif // Aarch32, or ARMv7 or before: if (vector[i+1] & HWCAP_NEON) - features |= Q_UINT64_C(1) << CpuFeatureNEON; + features |= CpuFeatureNEON; } # if defined(Q_PROCESSOR_ARM_32) // For Aarch32: if (vector[i] == AT_HWCAP2) { if (vector[i+1] & HWCAP2_CRC32) - features |= Q_UINT64_C(1) << CpuFeatureCRC32; + features |= CpuFeatureCRC32; } # endif } @@ -174,10 +174,10 @@ static inline quint64 detectProcessorFeatures() #endif #if defined(__ARM_NEON__) - features |= Q_UINT64_C(1) << CpuFeatureNEON; + features |= CpuFeatureNEON; #endif #if defined(__ARM_FEATURE_CRC32) - features |= Q_UINT64_C(1) << CpuFeatureCRC32; + features |= CpuFeatureCRC32; #endif return features; @@ -505,18 +505,18 @@ static inline quint64 detectProcessorFeatures() quint64 flags = 0; #if defined __mips_dsp - flags |= Q_UINT64_C(1) << CpuFeatureDSP; + flags |= CpuFeatureDSP; # if defined __mips_dsp_rev && __mips_dsp_rev >= 2 - flags |= Q_UINT64_C(1) << CpuFeatureDSPR2; + flags |= CpuFeatureDSPR2; # elif defined(Q_OS_LINUX) if (procCpuinfoContains("cpu model", "MIPS 74Kc") || procCpuinfoContains("cpu model", "MIPS 74Kf")) - flags |= Q_UINT64_C(1) << CpuFeatureDSPR2; + flags |= CpuFeatureDSPR2; # endif #elif defined(Q_OS_LINUX) if (procCpuinfoContains("ASEs implemented", "dsp")) { - flags |= Q_UINT64_C(1) << CpuFeatureDSP; + flags |= CpuFeatureDSP; if (procCpuinfoContains("cpu model", "MIPS 74Kc") || procCpuinfoContains("cpu model", "MIPS 74Kf")) - flags |= Q_UINT64_C(1) << CpuFeatureDSPR2; + flags |= CpuFeatureDSPR2; } #endif diff --git a/src/corelib/tools/qvarlengtharray.h b/src/corelib/tools/qvarlengtharray.h index fd0c99c0..d8c229de 100644 --- a/src/corelib/tools/qvarlengtharray.h +++ b/src/corelib/tools/qvarlengtharray.h @@ -152,19 +152,18 @@ public: if (s == a) { // i.e. s != 0 T copy(t); realloc(s, s<<1); - const int idx = s++; - new (ptr + idx) T(std::move(copy)); + new (end()) T(std::move(copy)); } else { - const int idx = s++; - new (ptr + idx) T(t); + new (end()) T(t); } + ++s; } void append(T &&t) { if (s == a) realloc(s, s << 1); - const int idx = s++; - new (ptr + idx) T(std::move(t)); + new (end()) T(std::move(t)); + ++s; } void append(const T *buf, int size); @@ -501,14 +500,14 @@ Q_OUTOFLINE_TEMPLATE typename QVarLengthArray::iterator QVarLengthA } template -Q_OUTOFLINE_TEMPLATE typename QVarLengthArray::iterator QVarLengthArray::insert(const_iterator before, size_type n, const T &t) +Q_OUTOFLINE_TEMPLATE typename QVarLengthArray::iterator QVarLengthArray::insert(const_iterator before, int n, const T &t) { Q_ASSERT_X(isValidIterator(before), "QVarLengthArray::insert", "The specified const_iterator argument 'before' is invalid"); int offset = int(before - ptr); if (n != 0) { + const T copy(t); // `t` could alias an element in [begin(), end()[ resize(s + n); - const T copy(t); if (!QTypeInfoQuery::isRelocatable) { T *b = ptr + offset; T *j = ptr + s; @@ -538,6 +537,12 @@ Q_OUTOFLINE_TEMPLATE typename QVarLengthArray::iterator QVarLengthA int f = int(abegin - ptr); int l = int(aend - ptr); int n = l - f; + + if (n == 0) // avoid UB in std::copy() below + return data() + f; + + Q_ASSERT(n > 0); // aend must be reachable from abegin + if (QTypeInfo::isComplex) { std::copy(ptr + l, ptr + s, QT_MAKE_CHECKED_ARRAY_ITERATOR(ptr + f, s - f)); T *i = ptr + s; diff --git a/src/corelib/tools/qvarlengtharray.qdoc b/src/corelib/tools/qvarlengtharray.qdoc index 3dab41dd..30f12478 100644 --- a/src/corelib/tools/qvarlengtharray.qdoc +++ b/src/corelib/tools/qvarlengtharray.qdoc @@ -90,6 +90,11 @@ \sa QVector, QList, QLinkedList */ +/*! \fn template QVarLengthArray::QVarLengthArray() + + Constructs an array with an initial size of zero. +*/ + /*! \fn template QVarLengthArray::QVarLengthArray(int size) Constructs an array with an initial size of \a size elements. diff --git a/src/corelib/tools/qvector.h b/src/corelib/tools/qvector.h index d61c26dc..85393a35 100644 --- a/src/corelib/tools/qvector.h +++ b/src/corelib/tools/qvector.h @@ -523,7 +523,7 @@ QVector::QVector(int asize, const T &t) d = Data::allocate(asize); Q_CHECK_PTR(d); d->size = asize; - T* i = d->end(); + auto i = d->end(); while (i != d->begin()) new (--i) T(t); } else { @@ -835,18 +835,25 @@ typename QVector::iterator QVector::insert(iterator before, size_type n, c if (!isDetached() || d->size + n > int(d->alloc)) realloc(d->size + n, QArrayData::Grow); if (!QTypeInfoQuery::isRelocatable) { - T *b = d->end(); - T *i = d->end() + n; - while (i != b) - new (--i) T; - i = d->end(); + T *const e = d->end(); + T *const b = d->begin() + offset; + + T *i = e; T *j = i + n; - b = d->begin() + offset; + + // move old elements into the uninitialized space + while (i != b && j > e) + new (--j) T(std::move(*--i)); + // move the rest of old elements into the tail using assignment while (i != b) - *--j = *--i; - i = b+n; - while (i != b) - *--i = copy; + *--j = std::move(*--i); + + // construct copies of t inside the uninitialized space + while (j != b && j > e) + new (--j) T(copy); + // use assignment to fill the recently-moved-from space + while (j != b) + *--j = copy; } else { T *b = d->begin() + offset; T *i = b + n; diff --git a/src/gui/doc/snippets/code/src_gui_painting_qtransform.cpp b/src/gui/doc/snippets/code/src_gui_painting_qtransform.cpp index 4acc2f12..149265c0 100644 --- a/src/gui/doc/snippets/code/src_gui_painting_qtransform.cpp +++ b/src/gui/doc/snippets/code/src_gui_painting_qtransform.cpp @@ -51,7 +51,7 @@ //! [0] x' = m11*x + m21*y + dx y' = m22*y + m12*x + dy -if (is not affine) { +if (!isAffine()) { w' = m13*x + m23*y + m33 x' /= w' y' /= w' @@ -62,7 +62,7 @@ if (is not affine) { //! [1] x' = m11*x + m21*y + dx y' = m22*y + m12*x + dy -if (is not affine) { +if (!isAffine()) { w' = m13*x + m23*y + m33 x' /= w' y' /= w' @@ -73,7 +73,7 @@ if (is not affine) { //! [2] x' = m11*x + m21*y + dx y' = m22*y + m12*x + dy -if (is not affine) { +if (!isAffine()) { w' = m13*x + m23*y + m33 x' /= w' y' /= w' @@ -84,7 +84,7 @@ if (is not affine) { //! [3] x' = m11*x + m21*y + dx y' = m22*y + m12*x + dy -if (is not affine) { +if (!isAffine()) { w' = m13*x + m23*y + m33 x' /= w' y' /= w' diff --git a/src/gui/doc/snippets/transform/main.cpp b/src/gui/doc/snippets/transform/main.cpp index e30a3b63..5120709a 100644 --- a/src/gui/doc/snippets/transform/main.cpp +++ b/src/gui/doc/snippets/transform/main.cpp @@ -47,8 +47,12 @@ ** $QT_END_LICENSE$ ** ****************************************************************************/ +#include +#include +#include +#include +#include -#include #include class SimpleTransformation : public QWidget @@ -103,18 +107,15 @@ class BasicOperations : public QWidget //! [2] void BasicOperations::paintEvent(QPaintEvent *) { - double pi = 3.14; - - double a = pi/180 * 45.0; + const double a = qDegreesToRadians(45.0); double sina = sin(a); double cosa = cos(a); - QTransform translationTransform(1, 0, 0, 1, 50.0, 50.0); - QTransform rotationTransform(cosa, sina, -sina, cosa, 0, 0); - QTransform scalingTransform(0.5, 0, 0, 1.0, 0, 0); + QTransform scale(0.5, 0, 0, 1.0, 0, 0); + QTransform rotate(cosa, sina, -sina, cosa, 0, 0); + QTransform translate(1, 0, 0, 1, 50.0, 50.0); - QTransform transform; - transform = scalingTransform * rotationTransform * translationTransform; + QTransform transform = scale * rotate * translate; QPainter painter(this); painter.setPen(QPen(Qt::blue, 1, Qt::DashLine)); diff --git a/src/gui/image/qimage.cpp b/src/gui/image/qimage.cpp index a6026d1b..7152ac16 100644 --- a/src/gui/image/qimage.cpp +++ b/src/gui/image/qimage.cpp @@ -1749,10 +1749,14 @@ void QImage::fill(uint pixel) w, d->height, d->bytes_per_line); return; } else if (d->depth == 16) { + if (d->format == Format_RGB444) + pixel |= 0xf000; qt_rectfill(reinterpret_cast(d->data), pixel, 0, 0, d->width, d->height, d->bytes_per_line); return; } else if (d->depth == 24) { + if (d->format == Format_RGB666) + pixel |= 0xfc0000; qt_rectfill(reinterpret_cast(d->data), pixel, 0, 0, d->width, d->height, d->bytes_per_line); return; @@ -2153,7 +2157,7 @@ static QImage convertWithPalette(const QImage &src, QImage::Format format, QImage dest(src.size(), format); dest.setColorTable(clut); - QImageData::get(dest)->text = QImageData::get(src)->text; + copyMetadata(QImageData::get(dest), QImageData::get(src)); int h = src.height(); int w = src.width(); @@ -2254,6 +2258,7 @@ bool QImage::reinterpretAsFormat(Format format) // In case detach() ran out of memory if (!d) { d = oldD; + d->ref.ref(); return false; } } @@ -2493,7 +2498,7 @@ void QImage::setPixel(int x, int y, uint index_or_rgb) ((uint *)s)[x] = index_or_rgb; return; case Format_RGB16: - ((quint16 *)s)[x] = qConvertRgb32To16(qUnpremultiply(index_or_rgb)); + ((quint16 *)s)[x] = qConvertRgb32To16(index_or_rgb); return; case Format_RGBX8888: ((uint *)s)[x] = ARGB2RGBA(0xff000000 | index_or_rgb); @@ -2514,6 +2519,10 @@ void QImage::setPixel(int x, int y, uint index_or_rgb) case Format_A2RGB30_Premultiplied: ((uint *)s)[x] = qConvertArgb32ToA2rgb30(index_or_rgb); return; + case Format_RGBA64: + case Format_RGBA64_Premultiplied: + ((QRgba64 *)s)[x] = QRgba64::fromArgb32(index_or_rgb); + return; case Format_Invalid: case NImageFormats: Q_ASSERT(false); @@ -2523,7 +2532,10 @@ void QImage::setPixel(int x, int y, uint index_or_rgb) } const QPixelLayout *layout = &qPixelLayouts[d->format]; - layout->storeFromARGB32PM(s, &index_or_rgb, x, 1, nullptr, nullptr); + if (!hasAlphaChannel()) + layout->storeFromRGB32(s, &index_or_rgb, x, 1, nullptr, nullptr); + else + layout->storeFromARGB32PM(s, &index_or_rgb, x, 1, nullptr, nullptr); } /*! diff --git a/src/gui/image/qpixmap.cpp b/src/gui/image/qpixmap.cpp index 9ea1e18c..a9cc4042 100644 --- a/src/gui/image/qpixmap.cpp +++ b/src/gui/image/qpixmap.cpp @@ -926,6 +926,7 @@ void QPixmap::fill(const QColor &color) // it will be filled with new pixel data anyway. QPlatformPixmap *d = data->createCompatiblePlatformPixmap(); d->resize(data->width(), data->height()); + d->setDevicePixelRatio(data->devicePixelRatio()); data = d; } data->fill(color); diff --git a/src/gui/image/qpixmapcache.cpp b/src/gui/image/qpixmapcache.cpp index 9709df9e..b6e5e70f 100644 --- a/src/gui/image/qpixmapcache.cpp +++ b/src/gui/image/qpixmapcache.cpp @@ -461,6 +461,11 @@ void QPMCache::clear() for (int i = 0; i < keys.size(); ++i) keys.at(i).d->isValid = false; QCache::clear(); + // Nothing left to flush; stop the timer + if (theid) { + killTimer(theid); + theid = 0; + } } QPixmapCache::KeyData* QPMCache::getKeyData(QPixmapCache::Key *key) diff --git a/src/gui/image/qpnghandler.cpp b/src/gui/image/qpnghandler.cpp index 6807ce93..2811d2e0 100644 --- a/src/gui/image/qpnghandler.cpp +++ b/src/gui/image/qpnghandler.cpp @@ -612,7 +612,7 @@ bool QPngHandlerPrivate::readPngHeader() png_get_iCCP(png_ptr, info_ptr, &name, &compressionType, &profileData, &profLen); colorSpace = QColorSpace::fromIccProfile(QByteArray((const char *)profileData, profLen)); if (!colorSpace.isValid()) { - qWarning() << "QPngHandler: Failed to parse ICC profile"; + qDebug() << "QPngHandler: Failed to parse ICC profile"; } else { QColorSpacePrivate *csD = QColorSpacePrivate::getWritable(colorSpace); if (csD->description.isEmpty()) @@ -649,10 +649,10 @@ bool QPngHandlerPrivate::readPngHeader() } if (primaries.areValid()) { colorSpace = QColorSpace(primaries.whitePoint, primaries.redPoint, primaries.greenPoint, primaries.bluePoint, - QColorSpace::TransferFunction::Gamma, fileGamma); + QColorSpace::TransferFunction::Gamma, 1.0f / fileGamma); } else { colorSpace = QColorSpace(QColorSpace::Primaries::SRgb, - QColorSpace::TransferFunction::Gamma, fileGamma); + QColorSpace::TransferFunction::Gamma, 1.0f / fileGamma); } colorSpaceState = GammaChrm; } diff --git a/src/gui/image/qppmhandler.cpp b/src/gui/image/qppmhandler.cpp index 728259ba..b03458bd 100644 --- a/src/gui/image/qppmhandler.cpp +++ b/src/gui/image/qppmhandler.cpp @@ -63,7 +63,7 @@ static void discard_pbm_line(QIODevice *d) } while (res > 0 && buf[res-1] != '\n'); } -static int read_pbm_int(QIODevice *d) +static int read_pbm_int(QIODevice *d, bool *ok) { char c; int val = -1; @@ -97,6 +97,8 @@ static int read_pbm_int(QIODevice *d) else break; } + if (val < 0) + *ok = false; return hasOverflow ? -1 : val; } @@ -113,16 +115,17 @@ static bool read_pbm_header(QIODevice *device, char& type, int& w, int& h, int& if (type < '1' || type > '6') return false; - w = read_pbm_int(device); // get image width - h = read_pbm_int(device); // get image height + bool ok = true; + w = read_pbm_int(device, &ok); // get image width + h = read_pbm_int(device, &ok); // get image height if (type == '1' || type == '4') mcc = 1; // ignore max color component else - mcc = read_pbm_int(device); // get max color component + mcc = read_pbm_int(device, &ok); // get max color component - if (w <= 0 || w > 32767 || h <= 0 || h > 32767 || mcc <= 0 || mcc > 0xffff) - return false; // weird P.M image + if (!ok || w <= 0 || w > 32767 || h <= 0 || h > 32767 || mcc <= 0 || mcc > 0xffff) + return false; // weird P.M image return true; } @@ -233,18 +236,18 @@ static bool read_pbm_body(QIODevice *device, char type, int w, int h, int mcc, Q } else { // read ascii data uchar *p; int n; - char buf; - for (y = 0; (y < h) && (device->peek(&buf, 1) == 1); y++) { + bool ok = true; + for (y = 0; y < h && ok; y++) { p = outImage->scanLine(y); n = pbm_bpl; if (nbits == 1) { int b; int bitsLeft = w; - while (n--) { + while (n-- && ok) { b = 0; for (int i=0; i<8; i++) { if (i < bitsLeft) - b = (b << 1) | (read_pbm_int(device) & 1); + b = (b << 1) | (read_pbm_int(device, &ok) & 1); else b = (b << 1) | (0 & 1); // pad it our self if we need to } @@ -253,36 +256,38 @@ static bool read_pbm_body(QIODevice *device, char type, int w, int h, int mcc, Q } } else if (nbits == 8) { if (mcc == 255) { - while (n--) { - *p++ = read_pbm_int(device); + while (n-- && ok) { + *p++ = read_pbm_int(device, &ok); } } else { - while (n--) { - *p++ = (read_pbm_int(device) & 0xffff) * 255 / mcc; + while (n-- && ok) { + *p++ = (read_pbm_int(device, &ok) & 0xffff) * 255 / mcc; } } } else { // 32 bits n /= 4; int r, g, b; if (mcc == 255) { - while (n--) { - r = read_pbm_int(device); - g = read_pbm_int(device); - b = read_pbm_int(device); + while (n-- && ok) { + r = read_pbm_int(device, &ok); + g = read_pbm_int(device, &ok); + b = read_pbm_int(device, &ok); *((QRgb*)p) = qRgb(r, g, b); p += 4; } } else { - while (n--) { - r = read_pbm_int(device); - g = read_pbm_int(device); - b = read_pbm_int(device); + while (n-- && ok) { + r = read_pbm_int(device, &ok); + g = read_pbm_int(device, &ok); + b = read_pbm_int(device, &ok); *((QRgb*)p) = scale_pbm_color(mcc, r, g, b); p += 4; } } } } + if (!ok) + return false; } if (format == QImage::Format_Mono) { diff --git a/src/gui/image/qxpmhandler.cpp b/src/gui/image/qxpmhandler.cpp index 8acc8077..f78a7fee 100644 --- a/src/gui/image/qxpmhandler.cpp +++ b/src/gui/image/qxpmhandler.cpp @@ -50,6 +50,7 @@ #include #include +#include QT_BEGIN_NAMESPACE @@ -924,7 +925,7 @@ static bool read_xpm_body( colorMap.insert(xpmHash(QLatin1String(index.constData())), 0); } } else { - QRgb c_rgb; + QRgb c_rgb = 0; if (((buf.length()-1) % 3) && (buf[0] == '#')) { buf.truncate(((buf.length()-1) / 4 * 3) + 1); // remove alpha channel left by imagemagick } @@ -1056,15 +1057,23 @@ bool qt_read_xpm_image_or_array(QIODevice *device, const char * const * source, return read_xpm_body(device, source, index, state, cpp, ncols, w, h, image); } -static const char* xpm_color_name(int cpp, int index) +namespace { +template +struct CharBuffer : std::array +{ + CharBuffer() {} // avoid value-initializing the whole array +}; +} + +static const char* xpm_color_name(int cpp, int index, CharBuffer<5> && returnable = {}) { - static char returnable[5]; static const char code[] = ".#abcdefghijklmnopqrstuvwxyzABCD" "EFGHIJKLMNOPQRSTUVWXYZ0123456789"; // cpp is limited to 4 and index is limited to 64^cpp if (cpp > 1) { if (cpp > 2) { if (cpp > 3) { + returnable[4] = '\0'; returnable[3] = code[index % 64]; index /= 64; } else @@ -1084,7 +1093,7 @@ static const char* xpm_color_name(int cpp, int index) returnable[1] = '\0'; returnable[0] = code[index]; - return returnable; + return returnable.data(); } @@ -1121,8 +1130,11 @@ static bool write_xpm_image(const QImage &sourceImage, QIODevice *device, const ++cpp; // limit to 4 characters per pixel // 64^4 colors is enough for a 4096x4096 image - if (cpp > 4) - break; + if (cpp > 4) { + qWarning("Qt does not support writing XPM images with more than " + "64^4 colors (requested: %d colors).", ncolors); + return false; + } } // write header @@ -1150,16 +1162,7 @@ static bool write_xpm_image(const QImage &sourceImage, QIODevice *device, const const QRgb *yp = reinterpret_cast(image.constScanLine(y)); for(x=0; x 1) { - line.append(chars[1]); - if (cpp > 2) { - line.append(chars[2]); - if (cpp > 3) - line.append(chars[3]); - } - } + line.append(xpm_color_name(cpp, colorMap[color])); } s << ',' << Qt::endl << '\"' << line << '\"'; } diff --git a/src/gui/kernel/qcursor.cpp b/src/gui/kernel/qcursor.cpp index 1efa28a5..d6ccaff8 100644 --- a/src/gui/kernel/qcursor.cpp +++ b/src/gui/kernel/qcursor.cpp @@ -529,8 +529,7 @@ bool operator==(const QCursor &lhs, const QCursor &rhs) noexcept */ /*! - Returns the cursor shape identifier. The return value is one of - the \l Qt::CursorShape enum values (cast to an int). + Returns the cursor shape identifier. \sa setShape() */ diff --git a/src/gui/kernel/qguiapplication.cpp b/src/gui/kernel/qguiapplication.cpp index bbdf9cea..aee9b8dc 100644 --- a/src/gui/kernel/qguiapplication.cpp +++ b/src/gui/kernel/qguiapplication.cpp @@ -1316,7 +1316,10 @@ static void init_platform(const QString &pluginNamesWithArguments, const QString } #endif - fontSmoothingGamma = QGuiApplicationPrivate::platformIntegration()->styleHint(QPlatformIntegration::FontSmoothingGamma).toReal(); + const auto platformIntegration = QGuiApplicationPrivate::platformIntegration(); + fontSmoothingGamma = platformIntegration->styleHint(QPlatformIntegration::FontSmoothingGamma).toReal(); + QCoreApplication::setAttribute(Qt::AA_DontShowShortcutsInContextMenus, + !platformIntegration->styleHint(QPlatformIntegration::ShowShortcutsInContextMenus).toBool()); } static void init_plugins(const QList &pluginList) @@ -1382,11 +1385,11 @@ void QGuiApplicationPrivate::addQtOptions(QList *options) QGuiApplication::tr("ID of the X11 Visual to use."), QStringLiteral("id"))); // Not using the "QStringList names" solution for those aliases, because it makes the first column too wide options->append(QCommandLineOption(QStringLiteral("geometry"), - QGuiApplication::tr("Alias for --windowgeometry."), QStringLiteral("geometry"))); + QGuiApplication::tr("Alias for --qwindowgeometry."), QStringLiteral("geometry"))); options->append(QCommandLineOption(QStringLiteral("icon"), - QGuiApplication::tr("Alias for --windowicon."), QStringLiteral("icon"))); + QGuiApplication::tr("Alias for --qwindowicon."), QStringLiteral("icon"))); options->append(QCommandLineOption(QStringLiteral("title"), - QGuiApplication::tr("Alias for --windowtitle."), QStringLiteral("title"))); + QGuiApplication::tr("Alias for --qwindowtitle."), QStringLiteral("title"))); } } #endif // QT_CONFIG(commandlineparser) @@ -2156,7 +2159,7 @@ void QGuiApplicationPrivate::processMouseEvent(QWindowSystemInterfacePrivate::Mo processMouseEvent(e); // the original mouse event return; } - if (mouseMove && !positionChanged) { + if (type == QEvent::MouseMove && !positionChanged) { // On Windows, and possibly other platforms, a touchpad can send a mouse move // that does not change position, between a press and a release. This may // confuse applications, so we always filter out these mouse events for diff --git a/src/gui/kernel/qopenglcontext.cpp b/src/gui/kernel/qopenglcontext.cpp index 927e9cb9..2291bfe7 100644 --- a/src/gui/kernel/qopenglcontext.cpp +++ b/src/gui/kernel/qopenglcontext.cpp @@ -1031,7 +1031,8 @@ bool QOpenGLContext::makeCurrent(QSurface *surface) || qstrcmp(rendererString, "GC800 core") == 0 || qstrcmp(rendererString, "GC1000 core") == 0 || strstr(rendererString, "GC2000") != nullptr - || qstrcmp(rendererString, "Immersion.16") == 0; + || qstrcmp(rendererString, "Immersion.16") == 0 + || qstrncmp(rendererString, "Apple Mx", 7) == 0; } needsWorkaroundSet = true; } diff --git a/src/gui/kernel/qplatformwindow.cpp b/src/gui/kernel/qplatformwindow.cpp index e7522932..7207ff4d 100644 --- a/src/gui/kernel/qplatformwindow.cpp +++ b/src/gui/kernel/qplatformwindow.cpp @@ -229,7 +229,7 @@ bool QPlatformWindow::isActive() const */ bool QPlatformWindow::isAncestorOf(const QPlatformWindow *child) const { - for (const QPlatformWindow *parent = child->parent(); parent; parent = child->parent()) { + for (const QPlatformWindow *parent = child->parent(); parent; parent = parent->parent()) { if (parent == this) return true; } diff --git a/src/gui/kernel/qwindow.cpp b/src/gui/kernel/qwindow.cpp index e248a043..c1c79a74 100644 --- a/src/gui/kernel/qwindow.cpp +++ b/src/gui/kernel/qwindow.cpp @@ -614,6 +614,13 @@ QWindow::SurfaceType QWindow::surfaceType() const By default, the window is not visible, you must call setVisible(true), or show() or similar to make it visible. + \note Hiding a window does not remove the window from the windowing system, + it only hides it. On windowing systems that give full screen applications a + dedicated desktop (such as macOS), hiding a full screen window will not remove + that desktop, but leave it blank. Another window from the same application + might be shown full screen, and will fill that desktop. Use QWindow::close to + completely remove a window from the windowing system. + \sa show() */ void QWindow::setVisible(bool visible) @@ -1224,11 +1231,13 @@ bool QWindow::isExposed() const */ /*! - Returns \c true if the window should appear active from a style perspective. + Returns \c true if the window is active. This is the case for the window that has input focus as well as windows that are in the same parent / transient parent chain as the focus window. + Typically active windows should appear active from a style perspective. + To get the window that currently has focus, use QGuiApplication::focusWindow(). */ bool QWindow::isActive() const @@ -1926,7 +1935,12 @@ void QWindow::resize(const QSize &newSize) Q_D(QWindow); d->positionPolicy = QWindowPrivate::WindowFrameExclusive; if (d->platformWindow) { - d->platformWindow->setGeometry(QHighDpi::toNativePixels(QRect(position(), newSize), this)); + if (isTopLevel()) { + d->platformWindow->setGeometry(QHighDpi::toNativePixels(QRect(position(), newSize), this)); + } else { + d->platformWindow->setGeometry(QRect(QHighDpi::toNativeLocalPosition(position(), this), + QHighDpi::toNativePixels(newSize, this))); + } } else { const QSize oldSize = d->geometry.size(); d->geometry.setSize(newSize); @@ -2201,6 +2215,9 @@ void QWindow::showMaximized() Equivalent to calling setWindowStates(Qt::WindowFullScreen) and then setVisible(true). + See the \l{QWidget::showFullScreen()} documentation for platform-specific + considerations and limitations. + \sa setWindowStates(), setVisible() */ void QWindow::showFullScreen() diff --git a/src/gui/math3d/qquaternion.cpp b/src/gui/math3d/qquaternion.cpp index 5f15949c..67f013c8 100644 --- a/src/gui/math3d/qquaternion.cpp +++ b/src/gui/math3d/qquaternion.cpp @@ -534,7 +534,11 @@ void QQuaternion::getEulerAngles(float *pitch, float *yaw, float *roll) const zw /= lengthSquared; } - *pitch = std::asin(-2.0f * (yz - xw)); + const float sinp = -2.0f * (yz - xw); + if (std::abs(sinp) >= 1.0f) + *pitch = std::copysign(M_PI_2, sinp); + else + *pitch = std::asin(sinp); if (*pitch < M_PI_2) { if (*pitch > -M_PI_2) { *yaw = std::atan2(2.0f * (xz + yw), 1.0f - 2.0f * (xx + yy)); diff --git a/src/gui/opengl/qopenglpaintdevice.cpp b/src/gui/opengl/qopenglpaintdevice.cpp index 3920a104..9e7d2861 100644 --- a/src/gui/opengl/qopenglpaintdevice.cpp +++ b/src/gui/opengl/qopenglpaintdevice.cpp @@ -331,7 +331,7 @@ void QOpenGLPaintDevice::setDotsPerMeterX(qreal dpmx) void QOpenGLPaintDevice::setDotsPerMeterY(qreal dpmy) { - d_ptr->dpmx = dpmy; + d_ptr->dpmy = dpmy; } /*! diff --git a/src/gui/opengl/qopenglprogrambinarycache.cpp b/src/gui/opengl/qopenglprogrambinarycache.cpp index 72bdacf4..dd146201 100644 --- a/src/gui/opengl/qopenglprogrambinarycache.cpp +++ b/src/gui/opengl/qopenglprogrambinarycache.cpp @@ -120,20 +120,24 @@ QOpenGLProgramBinaryCache::QOpenGLProgramBinaryCache() { const QString subPath = QLatin1String("/qtshadercache-") + QSysInfo::buildAbi() + QLatin1Char('/'); const QString sharedCachePath = QStandardPaths::writableLocation(QStandardPaths::GenericCacheLocation); + m_globalCacheDir = sharedCachePath + subPath; + m_localCacheDir = QStandardPaths::writableLocation(QStandardPaths::CacheLocation) + subPath; + if (!sharedCachePath.isEmpty()) { - m_cacheDir = sharedCachePath + subPath; - m_cacheWritable = qt_ensureWritableDir(m_cacheDir); + m_currentCacheDir = m_globalCacheDir; + m_cacheWritable = qt_ensureWritableDir(m_currentCacheDir); } if (!m_cacheWritable) { - m_cacheDir = QStandardPaths::writableLocation(QStandardPaths::CacheLocation) + subPath; - m_cacheWritable = qt_ensureWritableDir(m_cacheDir); + m_currentCacheDir = m_localCacheDir; + m_cacheWritable = qt_ensureWritableDir(m_currentCacheDir); } - qCDebug(lcOpenGLProgramDiskCache, "Cache location '%s' writable = %d", qPrintable(m_cacheDir), m_cacheWritable); + + qCDebug(lcOpenGLProgramDiskCache, "Cache location '%s' writable = %d", qPrintable(m_currentCacheDir), m_cacheWritable); } QString QOpenGLProgramBinaryCache::cacheFileName(const QByteArray &cacheKey) const { - return m_cacheDir + QString::fromUtf8(cacheKey); + return m_currentCacheDir + QString::fromUtf8(cacheKey); } #define BASE_HEADER_SIZE (int(4 * sizeof(quint32))) @@ -362,6 +366,25 @@ static inline void writeStr(uchar **p, const QByteArray &str) *p += str.size(); } +static inline bool writeFile(const QString &filename, const QByteArray &data) +{ +#if QT_CONFIG(temporaryfile) + QSaveFile f(filename); + if (f.open(QIODevice::WriteOnly | QIODevice::Truncate)) { + f.write(data); + if (f.commit()) + return true; + } +#else + QFile f(filename); + if (f.open(QIODevice::WriteOnly | QIODevice::Truncate)) { + if (f.write(data) == data.length()) + return true; + } +#endif + return false; +} + void QOpenGLProgramBinaryCache::save(const QByteArray &cacheKey, uint programId) { if (!m_cacheWritable) @@ -428,20 +451,20 @@ void QOpenGLProgramBinaryCache::save(const QByteArray &cacheKey, uint programId) writeUInt(&blobFormatPtr, blobFormat); -#if QT_CONFIG(temporaryfile) - QSaveFile f(cacheFileName(cacheKey)); - if (f.open(QIODevice::WriteOnly | QIODevice::Truncate)) { - f.write(blob); - if (!f.commit()) -#else - QFile f(cacheFileName(cacheKey)); - if (f.open(QIODevice::WriteOnly | QIODevice::Truncate)) { - if (f.write(blob) < blob.length()) -#endif - qCDebug(lcOpenGLProgramDiskCache, "Failed to write %s to shader cache", qPrintable(f.fileName())); - } else { - qCDebug(lcOpenGLProgramDiskCache, "Failed to create %s in shader cache", qPrintable(f.fileName())); + QString filename = cacheFileName(cacheKey); + bool ok = writeFile(filename, blob); + if (!ok && m_currentCacheDir == m_globalCacheDir) { + m_currentCacheDir = m_localCacheDir; + m_cacheWritable = qt_ensureWritableDir(m_currentCacheDir); + qCDebug(lcOpenGLProgramDiskCache, "Cache location changed to '%s' writable = %d", + qPrintable(m_currentCacheDir), m_cacheWritable); + if (m_cacheWritable) { + filename = cacheFileName(cacheKey); + ok = writeFile(filename, blob); + } } + if (!ok) + qCDebug(lcOpenGLProgramDiskCache, "Failed to write %s to shader cache", qPrintable(filename)); } #if defined(QT_OPENGL_ES_2) diff --git a/src/gui/opengl/qopenglprogrambinarycache_p.h b/src/gui/opengl/qopenglprogrambinarycache_p.h index f1cf24cd..55685f36 100644 --- a/src/gui/opengl/qopenglprogrambinarycache_p.h +++ b/src/gui/opengl/qopenglprogrambinarycache_p.h @@ -89,7 +89,9 @@ private: bool verifyHeader(const QByteArray &buf) const; bool setProgramBinary(uint programId, uint blobFormat, const void *p, uint blobSize); - QString m_cacheDir; + QString m_globalCacheDir; + QString m_localCacheDir; + QString m_currentCacheDir; bool m_cacheWritable; struct MemCacheEntry { MemCacheEntry(const void *p, int size, uint format) diff --git a/src/gui/opengl/qopengltextureblitter.cpp b/src/gui/opengl/qopengltextureblitter.cpp index b709f2f6..9ec9d67d 100644 --- a/src/gui/opengl/qopengltextureblitter.cpp +++ b/src/gui/opengl/qopengltextureblitter.cpp @@ -44,10 +44,20 @@ #include #include #include +#include #ifndef GL_TEXTURE_EXTERNAL_OES #define GL_TEXTURE_EXTERNAL_OES 0x8D65 #endif +#ifndef GL_TEXTURE_RECTANGLE +#define GL_TEXTURE_RECTANGLE 0x84F5 +#endif +#ifndef GL_TEXTURE_WIDTH +#define GL_TEXTURE_WIDTH 0x1000 +#endif +#ifndef GL_TEXTURE_HEIGHT +#define GL_TEXTURE_HEIGHT 0x1001 +#endif QT_BEGIN_NAMESPACE @@ -153,6 +163,30 @@ static const char fragment_shader_external_oes[] = " gl_FragColor = swizzle ? tmpFragColor.bgra : tmpFragColor;" "}"; +static const char fragment_shader_rectangle[] = + "varying highp vec2 uv;" + "uniform sampler2DRect textureSampler;" + "uniform bool swizzle;" + "uniform highp float opacity;" + "void main() {" + " highp vec4 tmpFragColor = texture2DRect(textureSampler,uv);" + " tmpFragColor.a *= opacity;" + " gl_FragColor = swizzle ? tmpFragColor.bgra : tmpFragColor;" + "}"; + +static const char fragment_shader150_rectangle[] = + "#version 150 core\n" + "in vec2 uv;" + "out vec4 fragcolor;" + "uniform sampler2DRect textureSampler;" + "uniform bool swizzle;" + "uniform float opacity;" + "void main() {" + " vec4 tmpFragColor = texture(textureSampler, uv);" + " tmpFragColor.a *= opacity;" + " fragcolor = swizzle ? tmpFragColor.bgra : tmpFragColor;" + "}"; + static const GLfloat vertex_buffer_data[] = { -1,-1, 0, -1, 1, 0, @@ -198,7 +232,8 @@ public: enum ProgramIndex { TEXTURE_2D, - TEXTURE_EXTERNAL_OES + TEXTURE_EXTERNAL_OES, + TEXTURE_RECTANGLE }; QOpenGLTextureBlitterPrivate() : @@ -210,11 +245,15 @@ public: bool buildProgram(ProgramIndex idx, const char *vs, const char *fs); - void blit(GLuint texture, const QMatrix4x4 &vertexTransform, const QMatrix3x3 &textureTransform); - void blit(GLuint texture, const QMatrix4x4 &vertexTransform, QOpenGLTextureBlitter::Origin origin); + void blit(GLuint texture, const QMatrix4x4 &targetTransform, const QMatrix3x3 &sourceTransform); + void blit(GLuint texture, const QMatrix4x4 &targetTransform, QOpenGLTextureBlitter::Origin origin); + + QMatrix3x3 toTextureCoordinates(const QMatrix3x3 &sourceTransform) const; void prepareProgram(const QMatrix4x4 &vertexTransform); + bool supportsRectangleTarget() const; + QOpenGLBuffer vertexBuffer; QOpenGLBuffer textureBuffer; struct Program { @@ -239,7 +278,7 @@ public: bool swizzle; float opacity; TextureMatrixUniform textureMatrixUniformState; - } programs[2]; + } programs[3]; bool swizzle; float opacity; QScopedPointer vao; @@ -253,6 +292,8 @@ static inline QOpenGLTextureBlitterPrivate::ProgramIndex targetToProgramIndex(GL return QOpenGLTextureBlitterPrivate::TEXTURE_2D; case GL_TEXTURE_EXTERNAL_OES: return QOpenGLTextureBlitterPrivate::TEXTURE_EXTERNAL_OES; + case GL_TEXTURE_RECTANGLE: + return QOpenGLTextureBlitterPrivate::TEXTURE_RECTANGLE; default: qWarning("Unsupported texture target 0x%x", target); return QOpenGLTextureBlitterPrivate::TEXTURE_2D; @@ -286,14 +327,33 @@ void QOpenGLTextureBlitterPrivate::prepareProgram(const QMatrix4x4 &vertexTransf } } +QMatrix3x3 QOpenGLTextureBlitterPrivate::toTextureCoordinates(const QMatrix3x3 &sourceTransform) const +{ + if (currentTarget == GL_TEXTURE_RECTANGLE) { + // Non-normalized coordinates + QMatrix4x4 textureTransform(sourceTransform); + if (auto *glFunctions = QOpenGLContext::currentContext()->extraFunctions()) { + int width, height; + glFunctions->glGetTexLevelParameteriv(currentTarget, 0, GL_TEXTURE_WIDTH, &width); + glFunctions->glGetTexLevelParameteriv(currentTarget, 0, GL_TEXTURE_HEIGHT, &height); + textureTransform.scale(width, height); + } + return textureTransform.toGenericMatrix<3, 3>(); + } + + return sourceTransform; // Normalized coordinates +} + void QOpenGLTextureBlitterPrivate::blit(GLuint texture, - const QMatrix4x4 &vertexTransform, - const QMatrix3x3 &textureTransform) + const QMatrix4x4 &targetTransform, + const QMatrix3x3 &sourceTransform) { TextureBinder binder(currentTarget, texture); - prepareProgram(vertexTransform); + prepareProgram(targetTransform); Program *program = &programs[targetToProgramIndex(currentTarget)]; + + const QMatrix3x3 textureTransform = toTextureCoordinates(sourceTransform); program->glProgram->setUniformValue(program->textureTransformUniformPos, textureTransform); program->textureMatrixUniformState = User; @@ -301,23 +361,26 @@ void QOpenGLTextureBlitterPrivate::blit(GLuint texture, } void QOpenGLTextureBlitterPrivate::blit(GLuint texture, - const QMatrix4x4 &vertexTransform, + const QMatrix4x4 &targetTransform, QOpenGLTextureBlitter::Origin origin) { TextureBinder binder(currentTarget, texture); - prepareProgram(vertexTransform); + prepareProgram(targetTransform); Program *program = &programs[targetToProgramIndex(currentTarget)]; + if (origin == QOpenGLTextureBlitter::OriginTopLeft) { if (program->textureMatrixUniformState != IdentityFlipped) { - QMatrix3x3 flipped; - flipped(1,1) = -1; - flipped(1,2) = 1; - program->glProgram->setUniformValue(program->textureTransformUniformPos, flipped); + QMatrix3x3 sourceTransform; + sourceTransform(1,1) = -1; + sourceTransform(1,2) = 1; + const QMatrix3x3 textureTransform = toTextureCoordinates(sourceTransform); + program->glProgram->setUniformValue(program->textureTransformUniformPos, textureTransform); program->textureMatrixUniformState = IdentityFlipped; } } else if (program->textureMatrixUniformState != Identity) { - program->glProgram->setUniformValue(program->textureTransformUniformPos, QMatrix3x3()); + const QMatrix3x3 textureTransform = toTextureCoordinates(QMatrix3x3()); + program->glProgram->setUniformValue(program->textureTransformUniformPos, textureTransform); program->textureMatrixUniformState = Identity; } @@ -408,12 +471,18 @@ bool QOpenGLTextureBlitter::create() if (format.profile() == QSurfaceFormat::CoreProfile && format.version() >= qMakePair(3,2)) { if (!d->buildProgram(QOpenGLTextureBlitterPrivate::TEXTURE_2D, vertex_shader150, fragment_shader150)) return false; + if (d->supportsRectangleTarget()) + if (!d->buildProgram(QOpenGLTextureBlitterPrivate::TEXTURE_RECTANGLE, vertex_shader150, fragment_shader150_rectangle)) + return false; } else { if (!d->buildProgram(QOpenGLTextureBlitterPrivate::TEXTURE_2D, vertex_shader, fragment_shader)) return false; if (supportsExternalOESTarget()) if (!d->buildProgram(QOpenGLTextureBlitterPrivate::TEXTURE_EXTERNAL_OES, vertex_shader, fragment_shader_external_oes)) return false; + if (d->supportsRectangleTarget()) + if (!d->buildProgram(QOpenGLTextureBlitterPrivate::TEXTURE_RECTANGLE, vertex_shader, fragment_shader_rectangle)) + return false; } // Create and bind the VAO, if supported. @@ -459,6 +528,7 @@ void QOpenGLTextureBlitter::destroy() Q_D(QOpenGLTextureBlitter); d->programs[QOpenGLTextureBlitterPrivate::TEXTURE_2D].glProgram.reset(); d->programs[QOpenGLTextureBlitterPrivate::TEXTURE_EXTERNAL_OES].glProgram.reset(); + d->programs[QOpenGLTextureBlitterPrivate::TEXTURE_RECTANGLE].glProgram.reset(); d->vertexBuffer.destroy(); d->textureBuffer.destroy(); d->vao.reset(); @@ -476,6 +546,32 @@ bool QOpenGLTextureBlitter::supportsExternalOESTarget() const return ctx && ctx->isOpenGLES() && ctx->hasExtension("GL_OES_EGL_image_external"); } +/*! + \return \c true when bind() accepts \c GL_TEXTURE_RECTANGLE as + its target argument. + + \sa bind(), blit() + */ +bool QOpenGLTextureBlitterPrivate::supportsRectangleTarget() const +{ + QOpenGLContext *ctx = QOpenGLContext::currentContext(); + if (!ctx || ctx->isOpenGLES()) + return false; + + if (ctx->hasExtension("GL_ARB_texture_rectangle")) + return true; + + if (ctx->hasExtension("GL_EXT_texture_rectangle")) + return true; + + QSurfaceFormat f = ctx->format(); + const auto version = qMakePair(f.majorVersion(), f.minorVersion()); + if (version >= qMakePair(3, 1)) + return true; + + return false; +} + /*! Binds the graphics resources used by the blitter. This must be called before calling blit(). Code modifying the OpenGL state @@ -483,7 +579,7 @@ bool QOpenGLTextureBlitter::supportsExternalOESTarget() const otherwise conflicts may arise. \a target is the texture target for the source texture and must be - either \c GL_TEXTURE_2D or \c GL_OES_EGL_image_external. + either \c GL_TEXTURE_2D, \c GL_TEXTURE_RECTANGLE, or \c GL_OES_EGL_image_external. \sa release(), blit() */ @@ -586,7 +682,7 @@ void QOpenGLTextureBlitter::blit(GLuint texture, Origin sourceOrigin) { Q_D(QOpenGLTextureBlitter); - d->blit(texture,targetTransform, sourceOrigin); + d->blit(texture, targetTransform, sourceOrigin); } /*! diff --git a/src/gui/painting/painting.pri b/src/gui/painting/painting.pri index c68e8d6e..bb0fc0ff 100644 --- a/src/gui/painting/painting.pri +++ b/src/gui/painting/painting.pri @@ -146,7 +146,7 @@ gcc:equals(QT_GCC_MAJOR_VERSION, 5) { NEON_HEADERS += painting/qdrawhelper_neon_p.h } !uikit:!win32:contains(QT_ARCH, "arm"): CONFIG += no_clang_integrated_as -!android:!uikit:!win32:!integrity:!contains(QT_ARCH, "arm64") { +!macos:!android:!uikit:!win32:!integrity:!contains(QT_ARCH, "arm64") { NEON_ASM += ../3rdparty/pixman/pixman-arm-neon-asm.S painting/qdrawhelper_neon_asm.S DEFINES += ENABLE_PIXMAN_DRAWHELPERS } diff --git a/src/gui/painting/qcolorspace.cpp b/src/gui/painting/qcolorspace.cpp index bce66ca3..5977f8f8 100644 --- a/src/gui/painting/qcolorspace.cpp +++ b/src/gui/painting/qcolorspace.cpp @@ -146,13 +146,17 @@ QColorMatrix QColorSpacePrimaries::toXyzMatrix() const QColorVector srcCone = abrad.map(wXyz); QColorVector dstCone = abrad.map(wXyzD50); - QColorMatrix wToD50 = { { dstCone.x / srcCone.x, 0, 0 }, - { 0, dstCone.y / srcCone.y, 0 }, - { 0, 0, dstCone.z / srcCone.z } }; + if (srcCone.x && srcCone.y && srcCone.z) { + QColorMatrix wToD50 = { { dstCone.x / srcCone.x, 0, 0 }, + { 0, dstCone.y / srcCone.y, 0 }, + { 0, 0, dstCone.z / srcCone.z } }; - QColorMatrix chromaticAdaptation = abradinv * (wToD50 * abrad); - toXyz = chromaticAdaptation * toXyz; + QColorMatrix chromaticAdaptation = abradinv * (wToD50 * abrad); + toXyz = chromaticAdaptation * toXyz; + } else { + toXyz.r = {0, 0, 0}; // set to invalid value + } } return toXyz; @@ -331,6 +335,7 @@ void QColorSpacePrivate::setTransferFunction() } trc[1] = trc[0]; trc[2] = trc[0]; + lut.generated.storeRelease(0); } QColorTransform QColorSpacePrivate::transformationToColorSpace(const QColorSpacePrivate *out) const diff --git a/src/gui/painting/qcolortransfertable_p.h b/src/gui/painting/qcolortransfertable_p.h index 75a2e902..d6b51419 100644 --- a/src/gui/painting/qcolortransfertable_p.h +++ b/src/gui/painting/qcolortransfertable_p.h @@ -138,7 +138,7 @@ public: return 1.0f; if (!m_table16.isEmpty()) { float v = x * 65535.0f; - uint32_t i = std::floor(resultLargerThan * (m_tableSize - 1)) + 1; + uint32_t i = std::floor(resultLargerThan * (m_tableSize - 1)); for ( ; i < m_tableSize; ++i) { if (m_table16[i] > v) break; @@ -147,14 +147,14 @@ public: return 1.0f; float y1 = m_table16[i - 1]; float y2 = m_table16[i]; - Q_ASSERT(x >= y1 && x < y2); + Q_ASSERT(v >= y1 && v <= y2); float fr = (v - y1) / (y2 - y1); return (i + fr) * (1.0f / (m_tableSize - 1)); } if (!m_table8.isEmpty()) { float v = x * 255.0f; - uint32_t i = std::floor(resultLargerThan * (m_tableSize - 1)) + 1; + uint32_t i = std::floor(resultLargerThan * (m_tableSize - 1)); for ( ; i < m_tableSize; ++i) { if (m_table8[i] > v) break; @@ -163,7 +163,7 @@ public: return 1.0f; float y1 = m_table8[i - 1]; float y2 = m_table8[i]; - Q_ASSERT(x >= y1 && x < y2); + Q_ASSERT(v >= y1 && v <= y2); float fr = (v - y1) / (y2 - y1); return (i + fr) * (1.0f / (m_tableSize - 1)); } diff --git a/src/gui/painting/qcolortrc_p.h b/src/gui/painting/qcolortrc_p.h index 3ef9d442..058be3c7 100644 --- a/src/gui/painting/qcolortrc_p.h +++ b/src/gui/painting/qcolortrc_p.h @@ -114,7 +114,7 @@ public: if (x >= 0.0f && x <= 1.0f) return applyInverse(x); if (m_type == Type::Function) - return std::copysign(applyInverse(x), x); + return std::copysign(applyInverse(std::abs(x)), x); if (m_type == Type::Table) return x < 0.0f ? 0.0f : 1.0f; return x; diff --git a/src/gui/painting/qdrawhelper.cpp b/src/gui/painting/qdrawhelper.cpp index 1409c70a..a6179350 100644 --- a/src/gui/painting/qdrawhelper.cpp +++ b/src/gui/painting/qdrawhelper.cpp @@ -1419,7 +1419,7 @@ static void QT_FASTCALL storeRGB64FromRGB32(uchar *dest, const uint *src, int in { QRgba64 *d = reinterpret_cast(dest) + index; for (int i = 0; i < count; ++i) - d[i] = QRgba64::fromArgb32(src[i]); + d[i] = QRgba64::fromArgb32(src[i] | 0xff000000); } static const uint *QT_FASTCALL fetchRGBA64ToARGB32PM(uint *buffer, const uchar *src, int index, int count, @@ -1431,12 +1431,24 @@ static const uint *QT_FASTCALL fetchRGBA64ToARGB32PM(uint *buffer, const uchar * return buffer; } +template static void QT_FASTCALL storeRGBA64FromARGB32PM(uchar *dest, const uint *src, int index, int count, const QVector *, QDitherInfo *) { QRgba64 *d = reinterpret_cast(dest) + index; - for (int i = 0; i < count; ++i) + for (int i = 0; i < count; ++i) { d[i] = QRgba64::fromArgb32(src[i]).unpremultiplied(); + if (Mask) + d[i].setAlpha(65535); + } +} + +static void QT_FASTCALL storeRGBA64FromARGB32(uchar *dest, const uint *src, int index, int count, + const QVector *, QDitherInfo *) +{ + QRgba64 *d = reinterpret_cast(dest) + index; + for (int i = 0; i < count; ++i) + d[i] = QRgba64::fromArgb32(src[i]); } // Note: @@ -1523,15 +1535,15 @@ QPixelLayout qPixelLayouts[QImage::NImageFormats] = { { false, false, QPixelLayout::BPP64, nullptr, convertPassThrough, nullptr, fetchRGB64ToRGB32, fetchPassThrough64, - storeRGB64FromRGB32, storeRGB64FromRGB32 }, // Format_RGBX64 + storeRGBA64FromARGB32PM, storeRGB64FromRGB32 }, // Format_RGBX64 { true, false, QPixelLayout::BPP64, nullptr, convertARGB32ToARGB32PM, nullptr, fetchRGBA64ToARGB32PM, fetchRGBA64ToRGBA64PM, - storeRGBA64FromARGB32PM, storeRGB64FromRGB32 }, // Format_RGBA64 + storeRGBA64FromARGB32PM, storeRGB64FromRGB32 }, // Format_RGBA64 { true, true, QPixelLayout::BPP64, nullptr, convertPassThrough, nullptr, fetchRGB64ToRGB32, fetchPassThrough64, - storeRGB64FromRGB32, storeRGB64FromRGB32 }, // Format_RGBA64_Premultiplied + storeRGBA64FromARGB32, storeRGB64FromRGB32 }, // Format_RGBA64_Premultiplied { false, false, QPixelLayout::BPP16, nullptr, convertGrayscale16ToRGB32, convertGrayscale16ToRGBA64, fetchGrayscale16ToRGB32, fetchGrayscale16ToRGBA64, diff --git a/src/gui/painting/qicc.cpp b/src/gui/painting/qicc.cpp index 9209f7ec..4651adbd 100644 --- a/src/gui/painting/qicc.cpp +++ b/src/gui/painting/qicc.cpp @@ -52,7 +52,7 @@ #include QT_BEGIN_NAMESPACE -Q_LOGGING_CATEGORY(lcIcc, "qt.gui.icc") +Q_LOGGING_CATEGORY(lcIcc, "qt.gui.icc", QtWarningMsg) struct ICCProfileHeader { @@ -165,7 +165,7 @@ struct XYZTagData : GenericTagData { struct CurvTagData : GenericTagData { quint32_be valueCount; - quint16_be value[1]; + // followed by curv values: quint16_be[] }; struct ParaTagData : GenericTagData { @@ -237,18 +237,20 @@ static bool isValidIccProfile(const ICCProfileHeader &header) } if (header.profileClass != uint(ProfileClass::Input) - && header.profileClass != uint(ProfileClass::Display)) { - qCWarning(lcIcc, "Unsupported ICC profile class %x", quint32(header.profileClass)); + && header.profileClass != uint(ProfileClass::Display) + && (header.profileClass != uint(ProfileClass::Output) + || header.inputColorSpace != uint(ColorSpaceType::Gray))) { + qCInfo(lcIcc, "Unsupported ICC profile class 0x%x", quint32(header.profileClass)); return false; } if (header.inputColorSpace != uint(ColorSpaceType::Rgb) && header.inputColorSpace != uint(ColorSpaceType::Gray)) { - qCWarning(lcIcc, "Unsupported ICC input color space %x", quint32(header.inputColorSpace)); + qCInfo(lcIcc, "Unsupported ICC input color space 0x%x", quint32(header.inputColorSpace)); return false; } if (header.pcs != 0x58595a20 /* 'XYZ '*/) { // ### support PCSLAB - qCWarning(lcIcc, "Unsupported ICC profile connection space %x", quint32(header.pcs)); + qCInfo(lcIcc, "Unsupported ICC profile connection space 0x%x", quint32(header.pcs)); return false; } @@ -468,25 +470,26 @@ bool parseTRC(const QByteArray &data, const TagEntry &tagEntry, QColorTrc &gamma const GenericTagData trcData = qFromUnaligned(data.constData() + tagEntry.offset); if (trcData.type == quint32(Tag::curv)) { + Q_STATIC_ASSERT(sizeof(CurvTagData) == 12); const CurvTagData curv = qFromUnaligned(data.constData() + tagEntry.offset); if (curv.valueCount > (1 << 16)) return false; if (tagEntry.size - 12 < 2 * curv.valueCount) return false; + const auto valueOffset = tagEntry.offset + sizeof(CurvTagData); if (curv.valueCount == 0) { gamma.m_type = QColorTrc::Type::Function; gamma.m_fun = QColorTransferFunction(); // Linear } else if (curv.valueCount == 1) { - float g = curv.value[0] * (1.0f / 256.0f); + const quint16 v = qFromBigEndian(data.constData() + valueOffset); gamma.m_type = QColorTrc::Type::Function; - gamma.m_fun = QColorTransferFunction::fromGamma(g); + gamma.m_fun = QColorTransferFunction::fromGamma(v * (1.0f / 256.0f)); } else { QVector tabl; tabl.resize(curv.valueCount); static_assert(sizeof(GenericTagData) == 2 * sizeof(quint32_be), "GenericTagData has padding. The following code is a subject to UB."); - const auto offset = tagEntry.offset + sizeof(GenericTagData) + sizeof(quint32_be); - qFromBigEndian(data.constData() + offset, curv.valueCount, tabl.data()); + qFromBigEndian(data.constData() + valueOffset, curv.valueCount, tabl.data()); QColorTransferTable table = QColorTransferTable(curv.valueCount, std::move(tabl)); QColorTransferFunction curve; if (!table.checkValidity()) { @@ -702,7 +705,7 @@ bool fromIccProfile(const QByteArray &data, QColorSpace *colorSpace) if (!tagIndex.contains(Tag::rXYZ) || !tagIndex.contains(Tag::gXYZ) || !tagIndex.contains(Tag::bXYZ) || !tagIndex.contains(Tag::rTRC) || !tagIndex.contains(Tag::gTRC) || !tagIndex.contains(Tag::bTRC) || !tagIndex.contains(Tag::wtpt)) { - qCWarning(lcIcc) << "fromIccProfile: Unsupported ICC profile - not three component matrix based"; + qCInfo(lcIcc) << "fromIccProfile: Unsupported ICC profile - not three component matrix based"; return false; } } else { @@ -747,7 +750,7 @@ bool fromIccProfile(const QByteArray &data, QColorSpace *colorSpace) QColorVector whitePoint; if (!parseXyzData(data, tagIndex[Tag::wtpt], whitePoint)) return false; - if (!qFuzzyCompare(whitePoint.y, 1.0f) || (1.0f + whitePoint.z - whitePoint.x) == 0.0f) { + if (!qFuzzyCompare(whitePoint.y, 1.0f) || (1.0f + whitePoint.z + whitePoint.x) == 0.0f) { qCWarning(lcIcc) << "fromIccProfile: Invalid ICC profile - gray white-point not normalized"; return false; } @@ -756,12 +759,12 @@ bool fromIccProfile(const QByteArray &data, QColorSpace *colorSpace) } else { colorspaceDPtr->primaries = QColorSpace::Primaries::Custom; // Calculate chromaticity from xyz (assuming y == 1.0f). - float y = 1.0f / (1.0f + whitePoint.z - whitePoint.x); + float y = 1.0f / (1.0f + whitePoint.z + whitePoint.x); float x = whitePoint.x * y; QColorSpacePrimaries primaries(QColorSpace::Primaries::SRgb); primaries.whitePoint = QPointF(x,y); if (!primaries.areValid()) { - qCWarning(lcIcc) << "fromIccProfile: Invalid ICC profile - invalid white-point"; + qCWarning(lcIcc, "fromIccProfile: Invalid ICC profile - invalid white-point(%f, %f)", x, y); return false; } colorspaceDPtr->toXyz = primaries.toXyzMatrix(); diff --git a/src/gui/painting/qmemrotate.cpp b/src/gui/painting/qmemrotate.cpp index 685fbbb3..b82adb5d 100644 --- a/src/gui/painting/qmemrotate.cpp +++ b/src/gui/painting/qmemrotate.cpp @@ -43,12 +43,11 @@ QT_BEGIN_NAMESPACE static const int tileSize = 32; -template -static -inline void qt_memrotate90_tiled(const T *src, int w, int h, int sstride, T *dest, int dstride) +template +static inline void qt_memrotate90_tiled(const T *src, int w, int h, int isstride, T *dest, int idstride) { - sstride /= sizeof(T); - dstride /= sizeof(T); + const qsizetype sstride = isstride / sizeof(T); + const qsizetype dstride = idstride / sizeof(T); const int pack = sizeof(quint32) / sizeof(T); const int unaligned = @@ -102,11 +101,11 @@ inline void qt_memrotate90_tiled(const T *src, int w, int h, int sstride, T *des } } -template -static -inline void qt_memrotate90_tiled_unpacked(const T *src, int w, int h, int sstride, T *dest, - int dstride) +template +static inline void qt_memrotate90_tiled_unpacked(const T *src, int w, int h, int isstride, T *dest, int idstride) { + const qsizetype sstride = isstride; + const qsizetype dstride = idstride; const int numTilesX = (w + tileSize - 1) / tileSize; const int numTilesY = (h + tileSize - 1) / tileSize; @@ -130,12 +129,11 @@ inline void qt_memrotate90_tiled_unpacked(const T *src, int w, int h, int sstrid } } -template -static -inline void qt_memrotate270_tiled(const T *src, int w, int h, int sstride, T *dest, int dstride) +template +static inline void qt_memrotate270_tiled(const T *src, int w, int h, int isstride, T *dest, int idstride) { - sstride /= sizeof(T); - dstride /= sizeof(T); + const qsizetype sstride = isstride / sizeof(T); + const qsizetype dstride = idstride / sizeof(T); const int pack = sizeof(quint32) / sizeof(T); const int unaligned = @@ -189,11 +187,11 @@ inline void qt_memrotate270_tiled(const T *src, int w, int h, int sstride, T *de } } -template -static -inline void qt_memrotate270_tiled_unpacked(const T *src, int w, int h, int sstride, T *dest, - int dstride) +template +static inline void qt_memrotate270_tiled_unpacked(const T *src, int w, int h, int isstride, T *dest, int idstride) { + const qsizetype sstride = isstride; + const qsizetype dstride = idstride; const int numTilesX = (w + tileSize - 1) / tileSize; const int numTilesY = (h + tileSize - 1) / tileSize; @@ -245,10 +243,12 @@ inline void qt_memrotate90_template(const quint64 *src, int w, int h, i qt_memrotate90_tiled_unpacked(src, w, h, sstride, dest, dstride); } -template -static -inline void qt_memrotate180_template(const T *src, int w, int h, int sstride, T *dest, int dstride) +template +static inline void qt_memrotate180_template(const T *src, int w, int h, int isstride, T *dest, int idstride) { + const qsizetype sstride = isstride; + const qsizetype dstride = idstride; + const char *s = (const char*)(src) + (h - 1) * sstride; for (int dy = 0; dy < h; ++dy) { T *d = reinterpret_cast((char *)(dest) + dy * dstride); diff --git a/src/gui/painting/qpagesize.h b/src/gui/painting/qpagesize.h index 13327476..5b53eae4 100644 --- a/src/gui/painting/qpagesize.h +++ b/src/gui/painting/qpagesize.h @@ -228,7 +228,7 @@ public: }; QPageSize(); - explicit QPageSize(PageSizeId pageSizeId); + /*implicit*/ QPageSize(PageSizeId pageSizeId); explicit QPageSize(const QSize &pointSize, const QString &name = QString(), SizeMatchPolicy matchPolicy = FuzzyMatch); diff --git a/src/gui/painting/qpaintengine_raster.cpp b/src/gui/painting/qpaintengine_raster.cpp index a3e199ce..283923de 100644 --- a/src/gui/painting/qpaintengine_raster.cpp +++ b/src/gui/painting/qpaintengine_raster.cpp @@ -2414,15 +2414,20 @@ void QRasterPaintEngine::drawImage(const QRectF &r, const QImage &img, const QRe QRectF targetBounds = s->matrix.mapRect(r); bool exceedsPrecision = r.width() > 0x7fff || r.height() > 0x7fff + || targetBounds.left() < -0x7fff + || targetBounds.top() < -0x7fff + || targetBounds.right() > 0x7fff + || targetBounds.bottom() > 0x7fff || targetBounds.width() > 0x7fff || targetBounds.height() > 0x7fff || s->matrix.m11() >= 512 || s->matrix.m22() >= 512; - if (!exceedsPrecision && d->canUseFastImageBlending(d->rasterBuffer->compositionMode, img)) { if (s->matrix.type() > QTransform::TxScale) { SrcOverTransformFunc func = qTransformFunctions[d->rasterBuffer->format][img.format()]; - if (func && (!clip || clip->hasRectClip)) { + // The fast transform methods doesn't really work on small targets, see QTBUG-93475 + // And it can't antialias the edges + if (func && (!clip || clip->hasRectClip) && !s->flags.antialiased && targetBounds.width() >= 16 && targetBounds.height() >= 16) { func(d->rasterBuffer->buffer(), d->rasterBuffer->bytesPerLine(), img.bits(), img.bytesPerLine(), r, sr, !clip ? d->deviceRect : clip->clipRect, s->matrix, s->intOpacity); @@ -3309,6 +3314,11 @@ void QRasterPaintEnginePrivate::rasterizeLine_dashed(QLineF line, qreal length = line.length(); Q_ASSERT(length > 0); + if (length / (patternLength * width) > QDashStroker::repetitionLimit()) { + rasterizer->rasterizeLine(line.p1(), line.p2(), width / length, squareCap); + return; + } + while (length > 0) { const bool rasterize = *inDash; qreal dash = (pattern.at(*dashIndex) - *dashOffset) * width; diff --git a/src/gui/painting/qpaintengineex.cpp b/src/gui/painting/qpaintengineex.cpp index a7d2e7a9..9d8e068a 100644 --- a/src/gui/painting/qpaintengineex.cpp +++ b/src/gui/painting/qpaintengineex.cpp @@ -388,7 +388,7 @@ Q_GUI_EXPORT extern bool qt_scaleForTransform(const QTransform &transform, qreal void QPaintEngineEx::stroke(const QVectorPath &path, const QPen &inPen) { #ifdef QT_DEBUG_DRAW - qDebug() << "QPaintEngineEx::stroke()" << inPen; + qDebug() << "QPaintEngineEx::stroke()" << pen; #endif Q_D(QPaintEngineEx); @@ -426,7 +426,7 @@ void QPaintEngineEx::stroke(const QVectorPath &path, const QPen &inPen) patternLength *= pw; if (qFuzzyIsNull(patternLength)) { pen.setStyle(Qt::NoPen); - } else if (extent / patternLength > 10000) { + } else if (extent / patternLength > QDashStroker::repetitionLimit()) { // approximate stream of tiny dashes with semi-transparent solid line pen.setStyle(Qt::SolidLine); QColor color(pen.color()); diff --git a/src/gui/painting/qpainter.cpp b/src/gui/painting/qpainter.cpp index aaeb0e86..826a7ab2 100644 --- a/src/gui/painting/qpainter.cpp +++ b/src/gui/painting/qpainter.cpp @@ -175,6 +175,23 @@ static bool qt_painter_thread_test(int devType, int engineType, const char *what } #endif +static bool needsEmulation(const QBrush &brush) +{ + bool res = false; + + const QGradient *bg = brush.gradient(); + if (bg) { + res = (bg->coordinateMode() > QGradient::LogicalMode); + } else if (brush.style() == Qt::TexturePattern) { + if (qHasPixmapTexture(brush)) + res = !qFuzzyCompare(brush.texture().devicePixelRatio(), qreal(1.0)); + else + res = !qFuzzyCompare(brush.textureImage().devicePixelRatio(), qreal(1.0)); + } + + return res; +} + void QPainterPrivate::checkEmulation() { Q_ASSERT(extended); @@ -182,21 +199,12 @@ void QPainterPrivate::checkEmulation() if (state->bgMode == Qt::OpaqueMode) doEmulation = true; - const QGradient *bg = state->brush.gradient(); - if (bg && bg->coordinateMode() > QGradient::LogicalMode) + if (needsEmulation(state->brush)) doEmulation = true; - const QGradient *pg = qpen_brush(state->pen).gradient(); - if (pg && pg->coordinateMode() > QGradient::LogicalMode) + if (needsEmulation(qpen_brush(state->pen))) doEmulation = true; - if (state->brush.style() == Qt::TexturePattern) { - if (qHasPixmapTexture(state->brush)) - doEmulation |= !qFuzzyCompare(state->brush.texture().devicePixelRatioF(), 1.0); - else - doEmulation |= !qFuzzyCompare(state->brush.textureImage().devicePixelRatioF(), 1.0); - } - if (doEmulation && extended->flags() & QPaintEngineEx::DoNotEmulate) return; @@ -3319,12 +3327,9 @@ void QPainter::strokePath(const QPainterPath &path, const QPen &pen) if (path.isEmpty()) return; - if (d->extended) { - const QGradient *g = qpen_brush(pen).gradient(); - if (!g || g->coordinateMode() == QGradient::LogicalMode) { - d->extended->stroke(qtVectorPathForPath(path), pen); - return; - } + if (d->extended && !needsEmulation(pen.brush())) { + d->extended->stroke(qtVectorPathForPath(path), pen); + return; } QBrush oldBrush = d->state->brush; @@ -3362,12 +3367,9 @@ void QPainter::fillPath(const QPainterPath &path, const QBrush &brush) if (path.isEmpty()) return; - if (d->extended) { - const QGradient *g = brush.gradient(); - if (!g || g->coordinateMode() == QGradient::LogicalMode) { - d->extended->fill(qtVectorPathForPath(path), brush); - return; - } + if (d->extended && !needsEmulation(brush)) { + d->extended->fill(qtVectorPathForPath(path), brush); + return; } QBrush oldBrush = d->state->brush; @@ -6956,12 +6958,9 @@ void QPainter::fillRect(const QRectF &r, const QBrush &brush) if (!d->engine) return; - if (d->extended) { - const QGradient *g = brush.gradient(); - if (!g || g->coordinateMode() == QGradient::LogicalMode) { - d->extended->fillRect(r, brush); - return; - } + if (d->extended && !needsEmulation(brush)) { + d->extended->fillRect(r, brush); + return; } QPen oldPen = pen(); @@ -6994,12 +6993,9 @@ void QPainter::fillRect(const QRect &r, const QBrush &brush) if (!d->engine) return; - if (d->extended) { - const QGradient *g = brush.gradient(); - if (!g || g->coordinateMode() == QGradient::LogicalMode) { - d->extended->fillRect(r, brush); - return; - } + if (d->extended && !needsEmulation(brush)) { + d->extended->fillRect(r, brush); + return; } QPen oldPen = pen(); diff --git a/src/gui/painting/qpainterpath.cpp b/src/gui/painting/qpainterpath.cpp index c61b62fc..f9544a32 100644 --- a/src/gui/painting/qpainterpath.cpp +++ b/src/gui/painting/qpainterpath.cpp @@ -1372,7 +1372,7 @@ void QPainterPath::addRegion(const QRegion ®ion) */ Qt::FillRule QPainterPath::fillRule() const { - return isEmpty() ? Qt::OddEvenFill : d_func()->fillRule; + return !d_func() ? Qt::OddEvenFill : d_func()->fillRule; } /*! diff --git a/src/gui/painting/qpainterpath_p.h b/src/gui/painting/qpainterpath_p.h index a420e0b3..28726565 100644 --- a/src/gui/painting/qpainterpath_p.h +++ b/src/gui/painting/qpainterpath_p.h @@ -313,7 +313,6 @@ inline void QPainterPathData::clear() elements.clear(); cStart = 0; - fillRule = Qt::OddEvenFill; bounds = {}; controlBounds = {}; diff --git a/src/gui/painting/qpdf.cpp b/src/gui/painting/qpdf.cpp index de9fc133..3066744f 100644 --- a/src/gui/painting/qpdf.cpp +++ b/src/gui/painting/qpdf.cpp @@ -856,14 +856,14 @@ void QPdfEngine::drawRects (const QRectF *rects, int rectCount) if (!d->hasPen && !d->hasBrush) return; - if (d->simplePen || !d->hasPen) { - // draw strokes natively in this case for better output - if(!d->simplePen && !d->stroker.matrix.isIdentity()) + if ((d->simplePen && !d->needsTransform) || !d->hasPen) { + // draw natively in this case for better output + if (!d->hasPen && d->needsTransform) // i.e. this is just a fillrect *d->currentPage << "q\n" << QPdf::generateMatrix(d->stroker.matrix); for (int i = 0; i < rectCount; ++i) *d->currentPage << rects[i].x() << rects[i].y() << rects[i].width() << rects[i].height() << "re\n"; *d->currentPage << (d->hasPen ? (d->hasBrush ? "B\n" : "S\n") : "f\n"); - if(!d->simplePen && !d->stroker.matrix.isIdentity()) + if (!d->hasPen && d->needsTransform) *d->currentPage << "Q\n"; } else { QPainterPath p; @@ -920,7 +920,8 @@ void QPdfEngine::drawPath (const QPainterPath &p) if (d->simplePen) { // draw strokes natively in this case for better output - *d->currentPage << QPdf::generatePath(p, QTransform(), d->hasBrush ? QPdf::FillAndStrokePath : QPdf::StrokePath); + *d->currentPage << QPdf::generatePath(p, d->needsTransform ? d->stroker.matrix : QTransform(), + d->hasBrush ? QPdf::FillAndStrokePath : QPdf::StrokePath); } else { if (d->hasBrush) *d->currentPage << QPdf::generatePath(p, d->stroker.matrix, QPdf::FillPath); @@ -967,7 +968,7 @@ void QPdfEngine::drawPixmap (const QRectF &rectangle, const QPixmap &pixmap, con *d->currentPage << QPdf::generateMatrix(QTransform(rectangle.width() / sr.width(), 0, 0, rectangle.height() / sr.height(), - rectangle.x(), rectangle.y()) * (d->simplePen ? QTransform() : d->stroker.matrix)); + rectangle.x(), rectangle.y()) * (!d->needsTransform ? QTransform() : d->stroker.matrix)); if (bitmap) { // set current pen as d->brush d->brush = d->pen.brush(); @@ -1007,7 +1008,7 @@ void QPdfEngine::drawImage(const QRectF &rectangle, const QImage &image, const Q *d->currentPage << QPdf::generateMatrix(QTransform(rectangle.width() / sr.width(), 0, 0, rectangle.height() / sr.height(), - rectangle.x(), rectangle.y()) * (d->simplePen ? QTransform() : d->stroker.matrix)); + rectangle.x(), rectangle.y()) * (!d->needsTransform ? QTransform() : d->stroker.matrix)); setBrush(); d->currentPage->streamImage(im.width(), im.height(), object); *d->currentPage << "Q\n"; @@ -1056,7 +1057,7 @@ void QPdfEngine::drawTextItem(const QPointF &p, const QTextItem &textItem) } *d->currentPage << "q\n"; - if(!d->simplePen) + if (d->needsTransform) *d->currentPage << QPdf::generateMatrix(d->stroker.matrix); bool hp = d->hasPen; @@ -1135,12 +1136,12 @@ void QPdfEngine::updateState(const QPaintEngineState &state) d->pen = state.pen(); } d->hasPen = d->pen.style() != Qt::NoPen; + bool oldCosmetic = d->stroker.cosmeticPen; d->stroker.setPen(d->pen, state.renderHints()); QBrush penBrush = d->pen.brush(); - bool cosmeticPen = qt_pen_is_cosmetic(d->pen, state.renderHints()); bool oldSimple = d->simplePen; - d->simplePen = (d->hasPen && !cosmeticPen && (penBrush.style() == Qt::SolidPattern) && penBrush.isOpaque() && d->opacity == 1.0); - if (oldSimple != d->simplePen) + d->simplePen = (d->hasPen && (penBrush.style() == Qt::SolidPattern) && penBrush.isOpaque() && d->opacity == 1.0); + if (oldSimple != d->simplePen || oldCosmetic != d->stroker.cosmeticPen) flags |= DirtyTransform; } else if (flags & DirtyHints) { d->stroker.setPen(d->pen, state.renderHints()); @@ -1224,8 +1225,13 @@ void QPdfEngine::setupGraphicsState(QPaintEngine::DirtyFlags flags) if (flags & DirtyTransform) { *d->currentPage << "q\n"; - if (d->simplePen && !d->stroker.matrix.isIdentity()) - *d->currentPage << QPdf::generateMatrix(d->stroker.matrix); + d->needsTransform = false; + if (!d->stroker.matrix.isIdentity()) { + if (d->simplePen && !d->stroker.cosmeticPen) + *d->currentPage << QPdf::generateMatrix(d->stroker.matrix); + else + d->needsTransform = true; // I.e. page-wide xf not set, local xf needed + } } if (flags & DirtyBrush) setBrush(); @@ -1480,7 +1486,7 @@ int QPdfEngine::metric(QPaintDevice::PaintDeviceMetric metricType) const QPdfEnginePrivate::QPdfEnginePrivate() : clipEnabled(false), allClipped(false), hasPen(true), hasBrush(false), simplePen(false), - pdfVersion(QPdfEngine::Version_1_4), + needsTransform(false), pdfVersion(QPdfEngine::Version_1_4), outDevice(nullptr), ownsDevice(false), embedFonts(true), grayscale(false), @@ -1539,6 +1545,7 @@ bool QPdfEngine::begin(QPaintDevice *pdev) d->graphicsState = 0; d->patternColorSpace = 0; d->simplePen = false; + d->needsTransform = false; d->pages.clear(); d->imageCache.clear(); diff --git a/src/gui/painting/qpdf_p.h b/src/gui/painting/qpdf_p.h index 4ff540e6..6964c67d 100644 --- a/src/gui/painting/qpdf_p.h +++ b/src/gui/painting/qpdf_p.h @@ -271,6 +271,7 @@ public: bool hasPen; bool hasBrush; bool simplePen; + bool needsTransform; qreal opacity; QPdfEngine::PdfVersion pdfVersion; diff --git a/src/gui/painting/qstroker.cpp b/src/gui/painting/qstroker.cpp index 22302f97..cb5d395e 100644 --- a/src/gui/painting/qstroker.cpp +++ b/src/gui/painting/qstroker.cpp @@ -1179,32 +1179,41 @@ void QDashStroker::processCurrentSubpath() bool done = pos >= estop; - if (clipping) { - // Check if the entire line can be clipped away. - if (!lineIntersectsRect(prev, e, clip_tl, clip_br)) { - // Cut away full dash sequences. - elen -= qFloor(elen * invSumLength) * sumLength; - // Update dash offset. - while (!done) { - qreal dpos = pos + dashes[idash] - doffset - estart; + // Check if the entire line should be clipped away or simplified + bool clipIt = clipping && !lineIntersectsRect(prev, e, clip_tl, clip_br); + bool skipDashing = elen * invSumLength > repetitionLimit(); + if (skipDashing || clipIt) { + // Cut away full dash sequences. + elen -= std::floor(elen * invSumLength) * sumLength; + // Update dash offset. + while (!done) { + qreal dpos = pos + dashes[idash] - doffset - estart; - Q_ASSERT(dpos >= 0); + Q_ASSERT(dpos >= 0); - if (dpos > elen) { // dash extends this line - doffset = dashes[idash] - (dpos - elen); // subtract the part already used - pos = estop; // move pos to next path element - done = true; - } else { // Dash is on this line - pos = dpos + estart; - done = pos >= estop; - if (++idash >= dashCount) - idash = 0; - doffset = 0; // full segment so no offset on next. - } + if (dpos > elen) { // dash extends this line + doffset = dashes[idash] - (dpos - elen); // subtract the part already used + pos = estop; // move pos to next path element + done = true; + } else { // Dash is on this line + pos = dpos + estart; + done = pos >= estop; + if (++idash >= dashCount) + idash = 0; + doffset = 0; // full segment so no offset on next. } - hasMoveTo = false; - move_to_pos = e; } + if (clipIt) { + hasMoveTo = false; + } else { + // skip costly dashing, just draw solid line + if (!hasMoveTo) { + emitMoveTo(move_to_pos.x, move_to_pos.y); + hasMoveTo = true; + } + emitLineTo(e.x, e.y); + } + move_to_pos = e; } // Dash away... diff --git a/src/gui/painting/qstroker_p.h b/src/gui/painting/qstroker_p.h index 06446ae3..72e211d0 100644 --- a/src/gui/painting/qstroker_p.h +++ b/src/gui/painting/qstroker_p.h @@ -268,6 +268,7 @@ public: QStroker *stroker() const { return m_stroker; } static QVector patternForStyle(Qt::PenStyle style); + static int repetitionLimit() { return 10000; } void setDashPattern(const QVector &dashPattern) { m_dashPattern = dashPattern; } QVector dashPattern() const { return m_dashPattern; } diff --git a/src/gui/painting/qtransform.cpp b/src/gui/painting/qtransform.cpp index 0952bd22..e86aff1c 100644 --- a/src/gui/painting/qtransform.cpp +++ b/src/gui/painting/qtransform.cpp @@ -222,6 +222,7 @@ static void nanWarning(const char *func) transformation is achieved by setting both the projection factors and the scaling factors. + \section2 Combining Transforms Here's the combined transformations example using basic matrix operations: @@ -232,6 +233,26 @@ static void nanWarning(const char *func) \snippet transform/main.cpp 2 \endtable + The combined transform first scales each operand, then rotates it, and + finally translates it, just as in the order in which the product of its + factors is written. This means the point to which the transforms are + applied is implicitly multiplied on the left with the transform + to its right. + + \section2 Relation to Matrix Notation + The matrix notation in QTransform is the transpose of a commonly-taught + convention which represents transforms and points as matrices and vectors. + That convention multiplies its matrix on the left and column vector to the + right. In other words, when several transforms are applied to a point, the + right-most matrix acts directly on the vector first. Then the next matrix + to the left acts on the result of the first operation - and so on. As a + result, that convention multiplies the matrices that make up a composite + transform in the reverse of the order in QTransform, as you can see in + \l {Combining Transforms}. Transposing the matrices, and combining them to + the right of a row vector that represents the point, lets the matrices of + transforms appear, in their product, in the order in which we think of the + transforms being applied to the point. + \sa QPainter, {Coordinate System}, {painting/affine}{Affine Transformations Example}, {Transformations Example} */ diff --git a/src/gui/painting/qtriangulatingstroker.cpp b/src/gui/painting/qtriangulatingstroker.cpp index 9490e11d..bdcf49d6 100644 --- a/src/gui/painting/qtriangulatingstroker.cpp +++ b/src/gui/painting/qtriangulatingstroker.cpp @@ -50,6 +50,7 @@ QT_BEGIN_NAMESPACE void QTriangulatingStroker::endCapOrJoinClosed(const qreal *start, const qreal *cur, bool implicitClose, bool endsAtStart) { + Q_ASSERT(start); if (endsAtStart) { join(start + 2); } else if (implicitClose) { diff --git a/src/gui/qtgui.tracepoints b/src/gui/qtgui.tracepoints index 932115fd..a85f9054 100644 --- a/src/gui/qtgui.tracepoints +++ b/src/gui/qtgui.tracepoints @@ -1,6 +1,9 @@ { QT_BEGIN_NAMESPACE class QImageReader; +#include +#include +#include QT_END_NAMESPACE } @@ -39,3 +42,10 @@ QPixmap_scaledToHeight_exit() QImageReader_read_before_reading(QImageReader *reader, const QString &filename) QImageReader_read_after_reading(QImageReader *reader, bool result) + +QOpenGLFramebufferObjectPrivate_init_entry(QOpenGLFramebufferObject *qfbo, const QSize &size, QOpenGLFramebufferObject::Attachment attachment, GLenum texture_target, GLenum internal_format, GLint samples, bool mipmap) +QOpenGLFramebufferObjectPrivate_init_exit() +QOpenGL2PaintEngineExPrivate_drawTexture_entry(const QOpenGLRect& dest, const QOpenGLRect& src, const QSize &textureSize, bool opaque, bool pattern) +QOpenGL2PaintEngineExPrivate_drawTexture_exit() +QOpenGLTextureCache_bindTexture_entry(QOpenGLContext *context, qint64 key, const QImage &image, QOpenGLTextureUploader::BindOptions options) +QOpenGLTextureCache_bindTexture_exit() diff --git a/src/gui/rhi/qrhimetal.mm b/src/gui/rhi/qrhimetal.mm index 5fe18c98..acd53b3d 100644 --- a/src/gui/rhi/qrhimetal.mm +++ b/src/gui/rhi/qrhimetal.mm @@ -3738,10 +3738,42 @@ QRhiRenderTarget *QMetalSwapChain::currentFrameRenderTarget() return &rtWrapper; } +#ifdef TARGET_IPHONE_SIMULATOR +API_AVAILABLE(ios(13.0)) +#endif +static inline CAMetalLayer *layerForWindow(QWindow *window) +{ + Q_ASSERT(window); +#ifdef Q_OS_MACOS + NSView *view = reinterpret_cast(window->winId()); +#else + UIView *view = reinterpret_cast(window->winId()); +#endif + Q_ASSERT(view); + return static_cast(view.layer); +} + QSize QMetalSwapChain::surfacePixelSize() { +#ifdef TARGET_IPHONE_SIMULATOR + if (@available(ios 13.0, *)) { +#endif + Q_ASSERT(m_window); - return m_window->size() * m_window->devicePixelRatio(); + CAMetalLayer *layer = d->layer; + if (!layer) + layer = layerForWindow(m_window); + + CGSize layerSize = layer.bounds.size; + layerSize.width *= layer.contentsScale; + layerSize.height *= layer.contentsScale; + return QSizeF::fromCGSize(layerSize).toSize(); + +#ifdef TARGET_IPHONE_SIMULATOR + } else { + return QSize(); + } +#endif } QRhiRenderPassDescriptor *QMetalSwapChain::newCompatibleRenderPassDescriptor() @@ -3800,13 +3832,7 @@ bool QMetalSwapChain::buildOrResize() return false; } -#ifdef Q_OS_MACOS - NSView *view = reinterpret_cast(window->winId()); -#else - UIView *view = reinterpret_cast(window->winId()); -#endif - Q_ASSERT(view); - d->layer = static_cast(view.layer); + d->layer = layerForWindow(window); Q_ASSERT(d->layer); chooseFormats(); diff --git a/src/gui/text/qcssparser.cpp b/src/gui/text/qcssparser.cpp index 7f2c01d4..bcdeafdb 100644 --- a/src/gui/text/qcssparser.cpp +++ b/src/gui/text/qcssparser.cpp @@ -1140,14 +1140,14 @@ static bool setFontSizeFromValue(QCss::Value value, QFont *font, int *fontSizeAd s.chop(2); value.variant = s; if (value.variant.convert((QVariant::Type)qMetaTypeId())) { - font->setPointSizeF(value.variant.toReal()); + font->setPointSizeF(qBound(qreal(0), value.variant.toReal(), qreal(1 << 24) - 1)); valid = true; } } else if (s.endsWith(QLatin1String("px"), Qt::CaseInsensitive)) { s.chop(2); value.variant = s; if (value.variant.convert(QMetaType::Int)) { - font->setPixelSize(value.variant.toInt()); + font->setPixelSize(qBound(0, value.variant.toInt(), (1 << 24) - 1)); valid = true; } } diff --git a/src/gui/text/qfont.cpp b/src/gui/text/qfont.cpp index 5a1fa36e..3d044edd 100644 --- a/src/gui/text/qfont.cpp +++ b/src/gui/text/qfont.cpp @@ -220,8 +220,10 @@ QFontPrivate::~QFontPrivate() if (engineData && !engineData->ref.deref()) delete engineData; engineData = nullptr; - if (scFont && scFont != this) - scFont->ref.deref(); + if (scFont && scFont != this) { + if (!scFont->ref.deref()) + delete scFont; + } scFont = nullptr; } @@ -630,8 +632,10 @@ void QFont::detach() if (d->engineData && !d->engineData->ref.deref()) delete d->engineData; d->engineData = nullptr; - if (d->scFont && d->scFont != d.data()) - d->scFont->ref.deref(); + if (d->scFont && d->scFont != d.data()) { + if (!d->scFont->ref.deref()) + delete d->scFont; + } d->scFont = nullptr; return; } diff --git a/src/gui/text/qfontdatabase.cpp b/src/gui/text/qfontdatabase.cpp index 0f521941..a657a8c5 100644 --- a/src/gui/text/qfontdatabase.cpp +++ b/src/gui/text/qfontdatabase.cpp @@ -414,6 +414,25 @@ void QtFontFamily::ensurePopulated() Q_ASSERT_X(populated, Q_FUNC_INFO, qPrintable(name)); } +/*! + \internal + + Tests if the given family \a family supports writing system \a writingSystem, + including the special case for Han script mapping to several subsequent writing systems +*/ +static bool familySupportsWritingSystem(QtFontFamily *family, size_t writingSystem) +{ + Q_ASSERT(family != nullptr); + Q_ASSERT(writingSystem != QFontDatabase::Any && writingSystem < QFontDatabase::WritingSystemsCount); + + size_t ws = writingSystem; + do { + if ((family->writingSystems[ws] & QtFontFamily::Supported) != 0) + return true; + } while (writingSystem >= QFontDatabase::SimplifiedChinese && writingSystem <= QFontDatabase::Japanese && ++ws <= QFontDatabase::Japanese); + + return false; +} struct FallbacksCacheKey { QString family; @@ -826,7 +845,7 @@ QStringList QPlatformFontDatabase::fallbacksForFamily(const QString &family, QFo f->ensurePopulated(); - if (writingSystem > QFontDatabase::Any && f->writingSystems[writingSystem] != QtFontFamily::Supported) + if (writingSystem > QFontDatabase::Any && !familySupportsWritingSystem(f, writingSystem)) continue; for (int j = 0; j < f->count; ++j) { @@ -1219,9 +1238,13 @@ static bool matchFamilyName(const QString &familyName, QtFontFamily *f) Tries to find the best match for a given request and family/foundry */ -static int match(int script, const QFontDef &request, - const QString &family_name, const QString &foundry_name, - QtFontDesc *desc, const QList &blacklistedFamilies) +static int match(int script, + const QFontDef &request, + const QString &family_name, + const QString &foundry_name, + QtFontDesc *desc, + const QList &blacklistedFamilies, + unsigned int *resultingScore = nullptr) { int result = -1; @@ -1271,8 +1294,10 @@ static int match(int script, const QFontDef &request, test.family->ensurePopulated(); // Check if family is supported in the script we want - if (writingSystem != QFontDatabase::Any && !(test.family->writingSystems[writingSystem] & QtFontFamily::Supported)) + if (writingSystem != QFontDatabase::Any + && !familySupportsWritingSystem(test.family, writingSystem)) { continue; + } // as we know the script is supported, we can be sure // to find a matching font here. @@ -1296,6 +1321,10 @@ static int match(int script, const QFontDef &request, if (newscore < 10) // xlfd instead of FT... just accept it break; } + + if (resultingScore != nullptr) + *resultingScore = score; + return result; } @@ -1729,13 +1758,19 @@ bool QFontDatabase::isSmoothlyScalable(const QString &family, const QString &sty for (int j = 0; j < f->count; j++) { QtFontFoundry *foundry = f->foundries[j]; if (foundryName.isEmpty() || foundry->name.compare(foundryName, Qt::CaseInsensitive) == 0) { - for (int k = 0; k < foundry->count; k++) - if ((style.isEmpty() || - foundry->styles[k]->styleName == style || - foundry->styles[k]->key == styleKey) && foundry->styles[k]->smoothScalable) { - smoothScalable = true; + for (int k = 0; k < foundry->count; k++) { + QtFontStyle *fontStyle = foundry->styles[k]; + smoothScalable = + fontStyle->smoothScalable + && ((style.isEmpty() + || fontStyle->styleName == style + || fontStyle->key == styleKey) + || (fontStyle->styleName.isEmpty() + && style == styleStringHelper(fontStyle->key.weight, + QFont::Style(fontStyle->key.style)))); + if (smoothScalable) goto end; - } + } } } end: @@ -2474,13 +2509,12 @@ bool QFontDatabasePrivate::isApplicationFont(const QString &fileName) with removeApplicationFont() or to retrieve the list of family names contained in the font. +//! [add-application-font-doc] The function returns -1 if the font could not be loaded. Currently only TrueType fonts, TrueType font collections, and OpenType fonts are supported. - - \note Adding application fonts on Unix/X11 platforms without fontconfig is - currently not supported. +//! [add-application-font-doc] \sa addApplicationFontFromData(), applicationFontFamilies(), removeApplicationFont() */ @@ -2508,12 +2542,7 @@ int QFontDatabase::addApplicationFont(const QString &fileName) with removeApplicationFont() or to retrieve the list of family names contained in the font. - The function returns -1 if the font could not be loaded. - - Currently only TrueType fonts and TrueType font collections are supported. - - \b{Note:} Adding application fonts on Unix/X11 platforms without fontconfig is - currently not supported. + \include qfontdatabase.cpp add-application-font-doc \sa addApplicationFont(), applicationFontFamilies(), removeApplicationFont() */ @@ -2648,7 +2677,9 @@ bool QFontDatabase::supportsThreadedFontRendering() /*! \internal */ -QFontEngine *QFontDatabase::findFont(const QFontDef &request, int script) +QFontEngine *QFontDatabase::findFont(const QFontDef &request, + int script, + bool preferScriptOverFamily) { QMutexLocker locker(fontDatabaseMutex()); @@ -2690,11 +2721,20 @@ QFontEngine *QFontDatabase::findFont(const QFontDef &request, int script) parseFontName(requestFamily, foundry_name, family_name); QtFontDesc desc; QList blackListed; - int index = match(multi ? QChar::Script_Common : script, request, family_name, foundry_name, &desc, blackListed); - if (index < 0 && QGuiApplicationPrivate::platformIntegration()->fontDatabase()->populateFamilyAliases(family_name)) { + unsigned int score = UINT_MAX; + int index = match(multi ? QChar::Script_Common : script, request, family_name, foundry_name, &desc, blackListed, &score); + if (score > 0 && QGuiApplicationPrivate::platformIntegration()->fontDatabase()->populateFamilyAliases(family_name)) { // We populated familiy aliases (e.g. localized families), so try again index = match(multi ? QChar::Script_Common : script, request, family_name, foundry_name, &desc, blackListed); } + + // If we do not find a match and NoFontMerging is set, use the requested font even if it does + // not support the script. + // + // (we do this at the end to prefer foundries that support the script if they exist) + if (index < 0 && !multi && !preferScriptOverFamily) + index = match(QChar::Script_Common, request, family_name, foundry_name, &desc, blackListed); + if (index >= 0) { QFontDef fontDef = request; @@ -2887,10 +2927,8 @@ Q_GUI_EXPORT QStringList qt_sort_families_by_writing_system(QChar::Script script } uint order = i; - if (testFamily == nullptr - || (testFamily->writingSystems[writingSystem] & QtFontFamily::Supported) == 0) { + if (testFamily == nullptr || !familySupportsWritingSystem(testFamily, writingSystem)) order |= 1u << 31; - } supported.insert(order, family); } diff --git a/src/gui/text/qfontdatabase.h b/src/gui/text/qfontdatabase.h index 80b092f1..b581f30a 100644 --- a/src/gui/text/qfontdatabase.h +++ b/src/gui/text/qfontdatabase.h @@ -160,7 +160,7 @@ private: static void createDatabase(); static void parseFontName(const QString &name, QString &foundry, QString &family); static QString resolveFontFamilyAlias(const QString &family); - static QFontEngine *findFont(const QFontDef &request, int script /* QChar::Script */); + static QFontEngine *findFont(const QFontDef &request, int script /* QChar::Script */, bool preferScriptOverFamily = false); static void load(const QFontPrivate *d, int script /* QChar::Script */); friend struct QFontDef; diff --git a/src/gui/text/qfontmetrics.cpp b/src/gui/text/qfontmetrics.cpp index 6c63d945..72e39694 100644 --- a/src/gui/text/qfontmetrics.cpp +++ b/src/gui/text/qfontmetrics.cpp @@ -273,9 +273,8 @@ bool QFontMetrics::operator ==(const QFontMetrics &other) const The ascent of a font is the distance from the baseline to the highest position characters extend to. In practice, some font designers break this rule, e.g. when they put more than one accent - on top of a character, or to accommodate an unusual character in - an exotic language, so it is possible (though rare) that this - value will be too small. + on top of a character, or to accommodate a certain character, so it + is possible (though rare) that this value will be too small. \sa descent() */ @@ -310,8 +309,8 @@ int QFontMetrics::capHeight() const The descent is the distance from the base line to the lowest point characters extend to. In practice, some font designers break this rule, - e.g. to accommodate an unusual character in an exotic language, so - it is possible (though rare) that this value will be too small. + e.g. to accommodate a certain character, so it is possible (though + rare) that this value will be too small. \sa ascent() */ @@ -1242,9 +1241,8 @@ bool QFontMetricsF::operator ==(const QFontMetricsF &other) const The ascent of a font is the distance from the baseline to the highest position characters extend to. In practice, some font designers break this rule, e.g. when they put more than one accent - on top of a character, or to accommodate an unusual character in - an exotic language, so it is possible (though rare) that this - value will be too small. + on top of a character, or to accommodate a certain character, so + it is possible (though rare) that this value will be too small. \sa descent() */ @@ -1280,8 +1278,8 @@ qreal QFontMetricsF::capHeight() const The descent is the distance from the base line to the lowest point characters extend to. (Note that this is different from X, which adds 1 pixel.) In practice, some font designers break this rule, - e.g. to accommodate an unusual character in an exotic language, so - it is possible (though rare) that this value will be too small. + e.g. to accommodate a certain character, so it is possible (though + rare) that this value will be too small. \sa ascent() */ diff --git a/src/gui/text/qrawfont.cpp b/src/gui/text/qrawfont.cpp index b4b60cba..3d6b70a9 100644 --- a/src/gui/text/qrawfont.cpp +++ b/src/gui/text/qrawfont.cpp @@ -760,7 +760,7 @@ QRawFont QRawFont::fromFont(const QFont &font, QFontDatabase::WritingSystem writ QFontDef request(multiEngine->fontDef); request.styleStrategy |= QFont::NoFontMerging; - if (QFontEngine *engine = QFontDatabase::findFont(request, script)) { + if (QFontEngine *engine = QFontDatabase::findFont(request, script, true)) { if (request.weight > QFont::Normal) engine->fontDef.weight = request.weight; if (request.style > QFont::StyleNormal) diff --git a/src/gui/text/qtextdocument.cpp b/src/gui/text/qtextdocument.cpp index 7ee98985..bb4390bc 100644 --- a/src/gui/text/qtextdocument.cpp +++ b/src/gui/text/qtextdocument.cpp @@ -3032,10 +3032,12 @@ void QTextHtmlExporter::emitBlock(const QTextBlock &block) if (fragmentMarkers && block.position() + block.length() == doc->docHandle()->length()) html += QLatin1String(""); + QString closeTags; + if (pre) html += QLatin1String(""); else if (list) - html += QLatin1String(""); + closeTags += QLatin1String(""); else { int headingLevel = blockFormat.headingLevel(); if (headingLevel > 0 && headingLevel <= 6) @@ -3047,9 +3049,30 @@ void QTextHtmlExporter::emitBlock(const QTextBlock &block) if (list) { if (list->itemNumber(block) == list->count() - 1) { // last item? close list if (isOrderedList(list->format().style())) - html += QLatin1String(""); + closeTags += QLatin1String(""); else - html += QLatin1String(""); + closeTags += QLatin1String(""); + } + const QTextBlock nextBlock = block.next(); + // If the next block is the beginning of a new deeper nested list, then we don't + // want to close the current list item just yet. This should be closed when this + // item is fully finished + if (nextBlock.isValid() && nextBlock.textList() && + nextBlock.textList()->itemNumber(nextBlock) == 0 && + nextBlock.textList()->format().indent() > list->format().indent()) { + QString lastTag; + if (!closingTags.isEmpty() && list->itemNumber(block) == list->count() - 1) + lastTag = closingTags.takeLast(); + lastTag.prepend(closeTags); + closingTags << lastTag; + } else if (list->itemNumber(block) == list->count() - 1) { + // If we are at the end of the list now then we can add in the closing tags for that + // current block + html += closeTags; + if (!closingTags.isEmpty()) + html += closingTags.takeLast(); + } else { + html += closeTags; } } diff --git a/src/gui/text/qtextdocument_p.cpp b/src/gui/text/qtextdocument_p.cpp index 524931eb..c22dd95d 100644 --- a/src/gui/text/qtextdocument_p.cpp +++ b/src/gui/text/qtextdocument_p.cpp @@ -381,8 +381,11 @@ int QTextDocumentPrivate::insert_block(int pos, uint strPos, int format, int blo Q_ASSERT(blocks.length() == fragments.length()); QTextBlockGroup *group = qobject_cast(objectForFormat(blockFormat)); - if (group) + if (group) { group->blockInserted(QTextBlock(this, b)); + docChangeOldLength--; + docChangeLength--; + } QTextFrame *frame = qobject_cast(objectForFormat(formats.format(format))); if (frame) { diff --git a/src/gui/text/qtextdocument_p.h b/src/gui/text/qtextdocument_p.h index 7f85d27b..9908f14b 100644 --- a/src/gui/text/qtextdocument_p.h +++ b/src/gui/text/qtextdocument_p.h @@ -405,6 +405,7 @@ private: QTextCharFormat defaultCharFormat; const QTextDocument *doc; bool fragmentMarkers; + QStringList closingTags; }; QT_END_NAMESPACE diff --git a/src/gui/text/qtextdocumentfragment.cpp b/src/gui/text/qtextdocumentfragment.cpp index d7bc7074..2fdfcaa2 100644 --- a/src/gui/text/qtextdocumentfragment.cpp +++ b/src/gui/text/qtextdocumentfragment.cpp @@ -1296,5 +1296,6 @@ QTextDocumentFragment QTextDocumentFragment::fromHtml(const QString &html, const return res; } -QT_END_NAMESPACE #endif // QT_NO_TEXTHTMLPARSER + +QT_END_NAMESPACE diff --git a/src/gui/text/qtextdocumentlayout.cpp b/src/gui/text/qtextdocumentlayout.cpp index 9d708735..f3e6ea21 100644 --- a/src/gui/text/qtextdocumentlayout.cpp +++ b/src/gui/text/qtextdocumentlayout.cpp @@ -2186,9 +2186,11 @@ void QTextDocumentLayoutPrivate::drawListItem(const QPointF &offset, QPainter *p painter->setRenderHint(QPainter::Antialiasing); + const bool marker = bl.blockFormat().marker() != QTextBlockFormat::MarkerType::NoMarker; if (selectionFormat) { painter->setPen(QPen(selectionFormat->foreground(), 0)); - painter->fillRect(r, selectionFormat->background()); + if (!marker) + painter->fillRect(r, selectionFormat->background()); } else { QBrush fg = charFormat.foreground(); if (fg == Qt::NoBrush) @@ -2198,19 +2200,21 @@ void QTextDocumentLayoutPrivate::drawListItem(const QPointF &offset, QPainter *p QBrush brush = context.palette.brush(QPalette::Text); - bool marker = bl.blockFormat().marker() != QTextBlockFormat::MarkerType::NoMarker; if (marker) { int adj = fontMetrics.lineSpacing() / 6; r.adjust(-adj, 0, -adj, 0); + const QRectF outer = r.adjusted(-adj, -adj, adj, adj); + if (selectionFormat) + painter->fillRect(outer, selectionFormat->background()); if (bl.blockFormat().marker() == QTextBlockFormat::MarkerType::Checked) { - // ### Qt6: render with QStyle / PE_IndicatorCheckBox. We don't currently + // ### Qt7: render with QStyle / PE_IndicatorCheckBox. We don't currently // have access to that here, because it would be a widget dependency. painter->setPen(QPen(painter->pen().color(), 2)); painter->drawLine(r.topLeft(), r.bottomRight()); painter->drawLine(r.topRight(), r.bottomLeft()); painter->setPen(QPen(painter->pen().color(), 0)); } - painter->drawRect(r.adjusted(-adj, -adj, adj, adj)); + painter->drawRect(outer); } switch (style) { @@ -2357,9 +2361,10 @@ QTextLayoutStruct QTextDocumentLayoutPrivate::layoutCell(QTextTable *t, const QT floatMinWidth = qMax(floatMinWidth, cd->minimumWidth); } - // constraint the maximumWidth by the minimum width of the fixed size floats, to - // keep them visible + // constraint the maximum/minimumWidth by the minimum width of the fixed size floats, + // to keep them visible layoutStruct.maximumWidth = qMax(layoutStruct.maximumWidth, floatMinWidth); + layoutStruct.minimumWidth = qMax(layoutStruct.minimumWidth, floatMinWidth); // as floats in cells get added to the table's float list but must not affect // floats in other cells we must clear the list here. @@ -2536,6 +2541,8 @@ recalc_minmax_widths: for (int n = 0; n < cspan; ++n) { const int col = i + n; QFixed w = widthToDistribute / (cspan - n); + if (td->maxWidths[col] != QFIXED_MAX) + w = qMax(td->maxWidths[col], w); td->maxWidths[col] = qMax(td->minWidths.at(col), w); widthToDistribute -= td->maxWidths.at(col); if (widthToDistribute <= 0) diff --git a/src/gui/text/qtextdocumentwriter.cpp b/src/gui/text/qtextdocumentwriter.cpp index 0bafa5d9..312396fb 100644 --- a/src/gui/text/qtextdocumentwriter.cpp +++ b/src/gui/text/qtextdocumentwriter.cpp @@ -249,9 +249,11 @@ QString QTextDocumentWriter::fileName () const */ bool QTextDocumentWriter::write(const QTextDocument *document) { - QByteArray suffix; + if (!d->device) + return false; - if (d->device && d->format.isEmpty()) { + QByteArray suffix; + if (d->format.isEmpty()) { // if there's no format, see if device is a file, and if so, find // the file suffix if (QFile *file = qobject_cast(d->device)) diff --git a/src/gui/text/qtextengine.cpp b/src/gui/text/qtextengine.cpp index 8af64f9c..ce4abac4 100644 --- a/src/gui/text/qtextengine.cpp +++ b/src/gui/text/qtextengine.cpp @@ -258,7 +258,7 @@ struct QBidiAlgorithm { for (int i = 0; i < length; ++i) { int pos = i; uint uc = text[i].unicode(); - if (QChar::isHighSurrogate(uc) && i < length - 1) { + if (QChar::isHighSurrogate(uc) && i < length - 1 && text[i + 1].isLowSurrogate()) { ++i; analysis[i].bidiDirection = QChar::DirNSM; uc = QChar::surrogateToUcs4(ushort(uc), text[i].unicode()); @@ -1373,9 +1373,15 @@ static void applyVisibilityRules(ushort ucs, QGlyphLayout *glyphs, uint glyphPos if (!fontEngine->symbol) { // U+00AD [SOFT HYPHEN] is a default ignorable codepoint, // so we replace its glyph and metrics with ones for - // U+002D [HYPHEN-MINUS] and make it visible if it appears at line-break + // U+002D [HYPHEN-MINUS] or U+2010 [HYPHEN] and make + // it visible if it appears at line-break const uint engineIndex = glyphs->glyphs[glyphPosition] & 0xff000000; - glyphs->glyphs[glyphPosition] = fontEngine->glyphIndex('-'); + glyph_t glyph = fontEngine->glyphIndex(0x002d); + if (glyph == 0) + glyph = fontEngine->glyphIndex(0x2010); + if (glyph == 0) + glyph = fontEngine->glyphIndex(0x00ad); + glyphs->glyphs[glyphPosition] = glyph; if (Q_LIKELY(glyphs->glyphs[glyphPosition] != 0)) { glyphs->glyphs[glyphPosition] |= engineIndex; QGlyphLayout tmp = glyphs->mid(glyphPosition, 1); @@ -2173,20 +2179,35 @@ void QTextEngine::itemize() const QTextDocumentPrivate::FragmentIterator end = p->find(block.position() + block.length() - 1); // -1 to omit the block separator char int format = it.value()->format; + int preeditPosition = s ? s->preeditPosition : INT_MAX; int prevPosition = 0; int position = prevPosition; while (1) { const QTextFragmentData * const frag = it.value(); if (it == end || format != frag->format) { - if (s && position >= s->preeditPosition) { + if (s && position >= preeditPosition) { position += s->preeditText.length(); - s = nullptr; + preeditPosition = INT_MAX; } Q_ASSERT(position <= length); QFont::Capitalization capitalization = formatCollection()->charFormat(format).hasProperty(QTextFormat::FontCapitalization) ? formatCollection()->charFormat(format).fontCapitalization() : formatCollection()->defaultFont().capitalization(); + if (s) { + for (const auto &range : qAsConst(s->formats)) { + if (range.start + range.length <= prevPosition || range.start >= position) + continue; + if (range.format.hasProperty(QTextFormat::FontCapitalization)) { + if (range.start > prevPosition) + itemizer.generate(prevPosition, range.start - prevPosition, capitalization); + int newStart = std::max(prevPosition, range.start); + int newEnd = std::min(position, range.start + range.length); + itemizer.generate(newStart, newEnd - newStart, range.format.fontCapitalization()); + prevPosition = newEnd; + } + } + } itemizer.generate(prevPosition, position - prevPosition, capitalization); if (it == end) { if (position < length) diff --git a/src/gui/text/qtexthtmlparser.cpp b/src/gui/text/qtexthtmlparser.cpp index 8b58f697..124c530c 100644 --- a/src/gui/text/qtexthtmlparser.cpp +++ b/src/gui/text/qtexthtmlparser.cpp @@ -1677,7 +1677,7 @@ void QTextHtmlParser::applyAttributes(const QStringList &attributes) node->tableCellRowSpan = qMax(1, node->tableCellRowSpan); } else if (key == QLatin1String("colspan")) { if (setIntAttribute(&node->tableCellColSpan, value)) - node->tableCellColSpan = qMax(1, node->tableCellColSpan); + node->tableCellColSpan = qBound(1, node->tableCellColSpan, 20480); } break; case Html_table: diff --git a/src/gui/text/qtextlayout.cpp b/src/gui/text/qtextlayout.cpp index a82d0615..26ac37b0 100644 --- a/src/gui/text/qtextlayout.cpp +++ b/src/gui/text/qtextlayout.cpp @@ -1987,7 +1987,8 @@ void QTextLine::layout_helper(int maxGlyphs) if (lbh.currentPosition >= eng->layoutData->string.length() || isBreakableSpace - || attributes[lbh.currentPosition].lineBreak) { + || attributes[lbh.currentPosition].lineBreak + || lbh.tmpData.textWidth >= QFIXED_MAX) { sb_or_ws = true; break; } else if (attributes[lbh.currentPosition].graphemeBoundary) { diff --git a/src/gui/text/qtextodfwriter.cpp b/src/gui/text/qtextodfwriter.cpp index 155ec43c..b3ec4370 100644 --- a/src/gui/text/qtextodfwriter.cpp +++ b/src/gui/text/qtextodfwriter.cpp @@ -455,7 +455,7 @@ void QTextOdfWriter::writeInlineCharacter(QXmlStreamWriter &writer, const QTextF name.prepend(QLatin1String("qrc")); QUrl url = QUrl(name); const QVariant variant = m_document->resource(QTextDocument::ImageResource, url); - if (variant.userType() == QMetaType::QImage) { + if (variant.userType() == QMetaType::QPixmap || variant.userType() == QMetaType::QImage) { image = qvariant_cast(variant); } else if (variant.userType() == QMetaType::QByteArray) { data = variant.toByteArray(); @@ -476,7 +476,7 @@ void QTextOdfWriter::writeInlineCharacter(QXmlStreamWriter &writer, const QTextF QBuffer imageBytes; int imgQuality = imageFormat.quality(); - if (imgQuality >= 100 || imgQuality < 0 || image.hasAlphaChannel()) { + if (imgQuality >= 100 || imgQuality <= 0 || image.hasAlphaChannel()) { QImageWriter imageWriter(&imageBytes, "png"); imageWriter.write(image); diff --git a/src/gui/util/qvalidator.cpp b/src/gui/util/qvalidator.cpp index 86f4db5d..70ed6cca 100644 --- a/src/gui/util/qvalidator.cpp +++ b/src/gui/util/qvalidator.cpp @@ -84,8 +84,8 @@ QT_BEGIN_NAMESPACE \list \li For a line edit that accepts integers from 10 to 1000 inclusive, - 42 and 123 are \l Acceptable, the empty string and 5 are \l - Intermediate, and "asdf" and 1114 is \l Invalid. + 42 and 123 are \l Acceptable, the empty string, 5, or 1234 are \l + Intermediate, and "asdf" and 10114 is \l Invalid. \li For an editable combobox that accepts URLs, any well-formed URL is \l Acceptable, "http://example.com/," is \l Intermediate diff --git a/src/network/access/http2/http2frames.cpp b/src/network/access/http2/http2frames.cpp index ce335056..f1f2cdf8 100644 --- a/src/network/access/http2/http2frames.cpp +++ b/src/network/access/http2/http2frames.cpp @@ -233,7 +233,8 @@ quint32 Frame::dataSize() const Q_ASSERT(validatePayload() == FrameStatus::goodFrame); quint32 size = payloadSize(); - if (const uchar pad = padding()) { + if (flags().testFlag(FrameFlag::PADDED)) { + const uchar pad = padding(); // + 1 one for a byte with padding number itself: size -= pad + 1; } @@ -269,7 +270,7 @@ const uchar *Frame::dataBegin() const return nullptr; const uchar *src = &buffer[0] + frameHeaderSize; - if (padding()) + if (flags().testFlag(FrameFlag::PADDED)) ++src; if (priority()) diff --git a/src/network/access/http2/http2protocol_p.h b/src/network/access/http2/http2protocol_p.h index b0af5aa9..ed5f2bf5 100644 --- a/src/network/access/http2/http2protocol_p.h +++ b/src/network/access/http2/http2protocol_p.h @@ -133,9 +133,6 @@ enum Http2PredefinedParameters maxPayloadSize = (1 << 24) - 1, // HTTP/2 6.5.2 defaultSessionWindowSize = 65535, // HTTP/2 6.5.2 - // Using 1000 (rather arbitrarily), just to - // impose *some* upper limit: - maxPeerConcurrentStreams = 1000, maxConcurrentStreams = 100 // HTTP/2, 6.5.2 }; diff --git a/src/network/access/qhttp2protocolhandler.cpp b/src/network/access/qhttp2protocolhandler.cpp index 91c41d82..ddd661cc 100644 --- a/src/network/access/qhttp2protocolhandler.cpp +++ b/src/network/access/qhttp2protocolhandler.cpp @@ -393,7 +393,8 @@ bool QHttp2ProtocolHandler::sendRequest() initReplyFromPushPromise(message, key); } - const auto streamsToUse = std::min(maxConcurrentStreams - activeStreams.size(), + const auto streamsToUse = std::min(maxConcurrentStreams > quint32(activeStreams.size()) + ? maxConcurrentStreams - quint32(activeStreams.size()) : 0, requests.size()); auto it = requests.begin(); for (quint32 i = 0; i < streamsToUse; ++i) { @@ -495,6 +496,10 @@ bool QHttp2ProtocolHandler::sendHEADERS(Stream &stream) #ifndef QT_NO_NETWORKPROXY useProxy = m_connection->d_func()->networkProxy.type() != QNetworkProxy::NoProxy; #endif + if (stream.request().withCredentials()) { + m_connection->d_func()->createAuthorization(m_socket, stream.request()); + stream.request().d->needResendWithCredentials = false; + } const auto headers = build_headers(stream.request(), maxHeaderListSize, useProxy); if (!headers.size()) // nothing fits into maxHeaderListSize return false; @@ -520,7 +525,7 @@ bool QHttp2ProtocolHandler::sendDATA(Stream &stream) Q_ASSERT(replyPrivate); auto slot = std::min(sessionSendWindowSize, stream.sendWindow); - while (!stream.data()->atEnd() && slot) { + while (replyPrivate->totallyUploadedData < request.contentLength() && slot) { qint64 chunkSize = 0; const uchar *src = reinterpret_cast(stream.data()->readPointer(slot, chunkSize)); @@ -1019,8 +1024,10 @@ void QHttp2ProtocolHandler::handleContinuedHEADERS() if (activeStreams.contains(streamID)) { Stream &stream = activeStreams[streamID]; updateStream(stream, decoder.decodedHeader()); - // No DATA frames. - if (continuedFrames[0].flags() & FrameFlag::END_STREAM) { + // Needs to resend the request; we should finish and delete the current stream + const bool needResend = stream.request().d->needResendWithCredentials; + // No DATA frames. Or needs to resend. + if (continuedFrames[0].flags() & FrameFlag::END_STREAM || needResend) { finishStream(stream); deleteActiveStream(stream.streamID); } @@ -1078,17 +1085,12 @@ bool QHttp2ProtocolHandler::acceptSetting(Http2::Settings identifier, quint32 ne QMetaObject::invokeMethod(this, "resumeSuspendedStreams", Qt::QueuedConnection); } - if (identifier == Settings::MAX_CONCURRENT_STREAMS_ID) { - if (newValue > maxPeerConcurrentStreams) { - connectionError(PROTOCOL_ERROR, "SETTINGS invalid number of concurrent streams"); - return false; - } + if (identifier == Settings::MAX_CONCURRENT_STREAMS_ID) maxConcurrentStreams = newValue; - } if (identifier == Settings::MAX_FRAME_SIZE_ID) { if (newValue < Http2::minPayloadLimit || newValue > Http2::maxPayloadSize) { - connectionError(PROTOCOL_ERROR, "SETTGINGS max frame size is out of range"); + connectionError(PROTOCOL_ERROR, "SETTINGS max frame size is out of range"); return false; } maxFrameSize = newValue; @@ -1108,7 +1110,7 @@ void QHttp2ProtocolHandler::updateStream(Stream &stream, const HPack::HttpHeader Qt::ConnectionType connectionType) { const auto httpReply = stream.reply(); - const auto &httpRequest = stream.request(); + auto &httpRequest = stream.request(); Q_ASSERT(httpReply || stream.state == Stream::remoteReserved); if (!httpReply) { @@ -1146,6 +1148,7 @@ void QHttp2ProtocolHandler::updateStream(Stream &stream, const HPack::HttpHeader if (name == ":status") { statusCode = value.left(3).toInt(); httpReply->setStatusCode(statusCode); + m_channel->lastStatus = statusCode; // Mostly useless for http/2, needed for auth httpReplyPrivate->reasonPhrase = QString::fromLatin1(value.mid(4)); } else if (name == ":version") { httpReplyPrivate->majorVersion = value.at(5) - '0'; @@ -1165,21 +1168,79 @@ void QHttp2ProtocolHandler::updateStream(Stream &stream, const HPack::HttpHeader } } + const auto handleAuth = [&, this](const QByteArray &authField, bool isProxy) -> bool { + Q_ASSERT(httpReply); + const auto auth = authField.trimmed(); + if (auth.startsWith("Negotiate") || auth.startsWith("NTLM")) { + // @todo: We're supposed to fall back to http/1.1: + // https://docs.microsoft.com/en-us/iis/get-started/whats-new-in-iis-10/http2-on-iis#when-is-http2-not-supported + // "Windows authentication (NTLM/Kerberos/Negotiate) is not supported with HTTP/2. + // In this case IIS will fall back to HTTP/1.1." + // Though it might be OK to ignore this. The server shouldn't let us connect with + // HTTP/2 if it doesn't support us using it. + } else if (!auth.isEmpty()) { + // Somewhat mimics parts of QHttpNetworkConnectionChannel::handleStatus + bool resend = false; + const bool authenticateHandled = m_connection->d_func()->handleAuthenticateChallenge( + m_socket, httpReply, isProxy, resend); + if (authenticateHandled && resend) { + httpReply->d_func()->eraseData(); + // Add the request back in queue, we'll retry later now that + // we've gotten some username/password set on it: + httpRequest.d->needResendWithCredentials = true; + m_channel->spdyRequestsToSend.insert(httpRequest.priority(), stream.httpPair); + httpReply->d_func()->clearHeaders(); + // If we have data we were uploading we need to reset it: + if (stream.data()) { + stream.data()->reset(); + httpReplyPrivate->totallyUploadedData = 0; + } + return true; + } // else: Authentication failed or was cancelled + } + return false; + }; + + if (httpReply) { + // See Note further down. These statuses would in HTTP/1.1 be handled + // by QHttpNetworkConnectionChannel::handleStatus. But because h2 has + // multiple streams/requests in a single channel this structure does not + // map properly to that function. + if (httpReply->statusCode() == 401) { + const auto wwwAuth = httpReply->headerField("www-authenticate"); + if (handleAuth(wwwAuth, false)) { + sendRST_STREAM(stream.streamID, CANCEL); + markAsReset(stream.streamID); + // The stream is finalized and deleted after returning + return; + } // else: errors handled later + } else if (httpReply->statusCode() == 407) { + const auto proxyAuth = httpReply->headerField("proxy-authenticate"); + if (handleAuth(proxyAuth, true)) { + sendRST_STREAM(stream.streamID, CANCEL); + markAsReset(stream.streamID); + // The stream is finalized and deleted after returning + return; + } // else: errors handled later + } + } + if (QHttpNetworkReply::isHttpRedirect(statusCode) && redirectUrl.isValid()) httpReply->setRedirectUrl(redirectUrl); if (httpReplyPrivate->isCompressed() && httpRequest.d->autoDecompress) httpReplyPrivate->removeAutoDecompressHeader(); - if (QHttpNetworkReply::isHttpRedirect(statusCode) - || statusCode == 401 || statusCode == 407) { - // These are the status codes that can trigger uploadByteDevice->reset() - // in QHttpNetworkConnectionChannel::handleStatus. Alas, we have no - // single request/reply, we multiplex several requests and thus we never - // simply call 'handleStatus'. If we have byte-device - we try to reset - // it here, we don't (and can't) handle any error during reset operation. - if (stream.data()) + if (QHttpNetworkReply::isHttpRedirect(statusCode)) { + // Note: This status code can trigger uploadByteDevice->reset() in + // QHttpNetworkConnectionChannel::handleStatus. Alas, we have no single + // request/reply, we multiplex several requests and thus we never simply + // call 'handleStatus'. If we have a byte-device - we try to reset it + // here, we don't (and can't) handle any error during reset operation. + if (stream.data()) { stream.data()->reset(); + httpReplyPrivate->totallyUploadedData = 0; + } } if (connectionType == Qt::DirectConnection) @@ -1248,10 +1309,12 @@ void QHttp2ProtocolHandler::finishStream(Stream &stream, Qt::ConnectionType conn if (stream.data()) stream.data()->disconnect(this); - if (connectionType == Qt::DirectConnection) - emit httpReply->finished(); - else - QMetaObject::invokeMethod(httpReply, "finished", connectionType); + if (!stream.request().d->needResendWithCredentials) { + if (connectionType == Qt::DirectConnection) + emit httpReply->finished(); + else + QMetaObject::invokeMethod(httpReply, "finished", connectionType); + } } qCDebug(QT_HTTP2) << "stream" << stream.streamID << "closed"; diff --git a/src/network/access/qhttpnetworkconnection.cpp b/src/network/access/qhttpnetworkconnection.cpp index 9745f3b3..1bef9157 100644 --- a/src/network/access/qhttpnetworkconnection.cpp +++ b/src/network/access/qhttpnetworkconnection.cpp @@ -510,8 +510,8 @@ bool QHttpNetworkConnectionPrivate::handleAuthenticateChallenge(QAbstractSocket channels[i].authenticator = QAuthenticator(); // authentication is cancelled, send the current contents to the user. - emit channels[i].reply->headerChanged(); - emit channels[i].reply->readyRead(); + emit reply->headerChanged(); + emit reply->readyRead(); QNetworkReply::NetworkError errorCode = isProxy ? QNetworkReply::ProxyAuthenticationRequiredError @@ -1120,31 +1120,50 @@ void QHttpNetworkConnectionPrivate::_q_startNextRequest() int normalRequests = queuedRequests - preConnectRequests; neededOpenChannels = qMax(normalRequests, preConnectRequests); } - for (int i = 0; i < activeChannelCount && neededOpenChannels > 0; ++i) { - bool connectChannel = false; - if (channels[i].socket) { - if ((channels[i].socket->state() == QAbstractSocket::ConnectingState) - || (channels[i].socket->state() == QAbstractSocket::HostLookupState) - || channels[i].pendingEncrypt) // pendingEncrypt == "EncryptingState" - neededOpenChannels--; - if (neededOpenChannels <= 0) - break; - if (!channels[i].reply && !channels[i].isSocketBusy() && (channels[i].socket->state() == QAbstractSocket::UnconnectedState)) - connectChannel = true; - } else { // not previously used channel - connectChannel = true; + if (neededOpenChannels <= 0) + return; + + QQueue channelsToConnect; + + // use previously used channels first + for (int i = 0; i < activeChannelCount && neededOpenChannels > 0; ++i) { + if (!channels[i].socket) + continue; + + if ((channels[i].socket->state() == QAbstractSocket::ConnectingState) + || (channels[i].socket->state() == QAbstractSocket::HostLookupState) + || channels[i].pendingEncrypt) { // pendingEncrypt == "EncryptingState" + neededOpenChannels--; + continue; } - if (connectChannel) { - if (networkLayerState == IPv4) - channels[i].networkLayerPreference = QAbstractSocket::IPv4Protocol; - else if (networkLayerState == IPv6) - channels[i].networkLayerPreference = QAbstractSocket::IPv6Protocol; - channels[i].ensureConnection(); + if (!channels[i].reply && !channels[i].isSocketBusy() + && (channels[i].socket->state() == QAbstractSocket::UnconnectedState)) { + channelsToConnect.enqueue(i); neededOpenChannels--; } } + + // use other channels + for (int i = 0; i < activeChannelCount && neededOpenChannels > 0; ++i) { + if (channels[i].socket) + continue; + + channelsToConnect.enqueue(i); + neededOpenChannels--; + } + + while (!channelsToConnect.isEmpty()) { + const int channel = channelsToConnect.dequeue(); + + if (networkLayerState == IPv4) + channels[channel].networkLayerPreference = QAbstractSocket::IPv4Protocol; + else if (networkLayerState == IPv6) + channels[channel].networkLayerPreference = QAbstractSocket::IPv6Protocol; + + channels[channel].ensureConnection(); + } } diff --git a/src/network/access/qhttpnetworkconnectionchannel.cpp b/src/network/access/qhttpnetworkconnectionchannel.cpp index f1db2744..7620ca16 100644 --- a/src/network/access/qhttpnetworkconnectionchannel.cpp +++ b/src/network/access/qhttpnetworkconnectionchannel.cpp @@ -697,17 +697,19 @@ bool QHttpNetworkConnectionChannel::resetUploadData() //this happens if server closes connection while QHttpNetworkConnectionPrivate::_q_startNextRequest is pending return false; } - QNonContiguousByteDevice* uploadByteDevice = request.uploadByteDevice(); - if (!uploadByteDevice) - return true; - - if (uploadByteDevice->reset()) { + if (connection->connectionType() == QHttpNetworkConnection::ConnectionTypeHTTP2Direct + || switchedToHttp2) { + // The else branch doesn't make any sense for HTTP/2, since 1 channel is multiplexed into + // many streams. And having one stream fail to reset upload data should not completely close + // the channel. Handled in the http2 protocol handler. + } else if (QNonContiguousByteDevice *uploadByteDevice = request.uploadByteDevice()) { + if (!uploadByteDevice->reset()) { + connection->d_func()->emitReplyError(socket, reply, QNetworkReply::ContentReSendError); + return false; + } written = 0; - return true; - } else { - connection->d_func()->emitReplyError(socket, reply, QNetworkReply::ContentReSendError); - return false; } + return true; } #ifndef QT_NO_NETWORKPROXY @@ -1284,6 +1286,10 @@ void QHttpNetworkConnectionChannel::_q_encrypted() connection->connectionType() == QHttpNetworkConnection::ConnectionTypeHTTP2Direct) { // we call setSpdyWasUsed(true) on the replies in the SPDY handler when the request is sent if (spdyRequestsToSend.count() > 0) { + // Similar to HTTP/1.1 counterpart below: + const auto &pairs = spdyRequestsToSend.values(); // (request, reply) + const auto &pair = pairs.first(); + emit pair.second->encrypted(); // In case our peer has sent us its settings (window size, max concurrent streams etc.) // let's give _q_receiveReply a chance to read them first ('invokeMethod', QueuedConnection). QMetaObject::invokeMethod(connection, "_q_startNextRequest", Qt::QueuedConnection); diff --git a/src/network/access/qhttpnetworkrequest.cpp b/src/network/access/qhttpnetworkrequest.cpp index 0ae2498b..a4e4c673 100644 --- a/src/network/access/qhttpnetworkrequest.cpp +++ b/src/network/access/qhttpnetworkrequest.cpp @@ -65,6 +65,7 @@ QHttpNetworkRequestPrivate::QHttpNetworkRequestPrivate(const QHttpNetworkRequest withCredentials(other.withCredentials), ssl(other.ssl), preConnect(other.preConnect), + needResendWithCredentials(other.needResendWithCredentials), redirectCount(other.redirectCount), redirectPolicy(other.redirectPolicy), peerVerifyName(other.peerVerifyName) @@ -92,7 +93,8 @@ bool QHttpNetworkRequestPrivate::operator==(const QHttpNetworkRequestPrivate &ot && (ssl == other.ssl) && (preConnect == other.preConnect) && (redirectPolicy == other.redirectPolicy) - && (peerVerifyName == other.peerVerifyName); + && (peerVerifyName == other.peerVerifyName) + && (needResendWithCredentials == other.needResendWithCredentials); } QByteArray QHttpNetworkRequest::methodName() const diff --git a/src/network/access/qhttpnetworkrequest_p.h b/src/network/access/qhttpnetworkrequest_p.h index 038cb97b..e23d874f 100644 --- a/src/network/access/qhttpnetworkrequest_p.h +++ b/src/network/access/qhttpnetworkrequest_p.h @@ -183,6 +183,7 @@ public: bool withCredentials; bool ssl; bool preConnect; + bool needResendWithCredentials = false; int redirectCount; QNetworkRequest::RedirectPolicy redirectPolicy; QString peerVerifyName; diff --git a/src/network/access/qnetworkaccessmanager.cpp b/src/network/access/qnetworkaccessmanager.cpp index fece765d..517c4608 100644 --- a/src/network/access/qnetworkaccessmanager.cpp +++ b/src/network/access/qnetworkaccessmanager.cpp @@ -1411,7 +1411,6 @@ QNetworkReply *QNetworkAccessManager::createRequest(QNetworkAccessManager::Opera bool isLocalFile = req.url().isLocalFile(); QString scheme = req.url().scheme(); -#ifndef Q_OS_WASM // fast path for GET on file:// URLs // The QNetworkAccessFileBackend will right now only be used for PUT @@ -1446,7 +1445,6 @@ QNetworkReply *QNetworkAccessManager::createRequest(QNetworkAccessManager::Opera return reply; } } -#endif QNetworkRequest request = req; if (!request.header(QNetworkRequest::ContentLengthHeader).isValid() && outgoingData && !outgoingData->isSequential()) { diff --git a/src/network/access/qnetworkdiskcache.cpp b/src/network/access/qnetworkdiskcache.cpp index b30d1c96..2a7f1663 100644 --- a/src/network/access/qnetworkdiskcache.cpp +++ b/src/network/access/qnetworkdiskcache.cpp @@ -271,14 +271,12 @@ void QNetworkDiskCachePrivate::storeItem(QCacheItem *cacheItem) Q_ASSERT(!fileName.isEmpty()); if (QFile::exists(fileName)) { - if (!QFile::remove(fileName)) { + if (!removeFile(fileName)) { qWarning() << "QNetworkDiskCache: couldn't remove the cache file " << fileName; return; } } - if (currentCacheSize > 0) - currentCacheSize += 1024 + cacheItem->size(); currentCacheSize = q->expire(); if (!cacheItem->file) { QString templateName = tmpCacheFileName(); @@ -417,18 +415,7 @@ QIODevice *QNetworkDiskCache::data(const QUrl &url) buffer->setData(d->lastItem.data.data()); } else { buffer.reset(new QBuffer); - // ### verify that QFile uses the fd size and not the file name - qint64 size = file->size() - file->pos(); - const uchar *p = nullptr; -#if !defined(Q_OS_INTEGRITY) - p = file->map(file->pos(), size); -#endif - if (p) { - buffer->setData((const char *)p, size); - file.take()->setParent(buffer.data()); - } else { - buffer->setData(file->readAll()); - } + buffer->setData(file->readAll()); } } buffer->open(QBuffer::ReadOnly); diff --git a/src/network/access/qnetworkreplywasmimpl.cpp b/src/network/access/qnetworkreplywasmimpl.cpp index 0fc5bbf5..2ee57a08 100644 --- a/src/network/access/qnetworkreplywasmimpl.cpp +++ b/src/network/access/qnetworkreplywasmimpl.cpp @@ -67,10 +67,6 @@ QNetworkReplyWasmImplPrivate::QNetworkReplyWasmImplPrivate() QNetworkReplyWasmImplPrivate::~QNetworkReplyWasmImplPrivate() { - if (m_fetch) { - emscripten_fetch_close(m_fetch); - m_fetch = 0; - } } QNetworkReplyWasmImpl::QNetworkReplyWasmImpl(QObject *parent) @@ -115,12 +111,14 @@ void QNetworkReplyWasmImpl::close() void QNetworkReplyWasmImpl::abort() { - Q_D( QNetworkReplyWasmImpl); + Q_D(QNetworkReplyWasmImpl); if (d->state == QNetworkReplyPrivate::Finished || d->state == QNetworkReplyPrivate::Aborted) return; d->state = QNetworkReplyPrivate::Aborted; - d->doAbort(); + d->m_fetch->userData = nullptr; + + d->emitReplyError(QNetworkReply::OperationCanceledError, QStringLiteral("Operation canceled")); close(); } @@ -198,11 +196,6 @@ void QNetworkReplyWasmImplPrivate::setReplyAttributes(quintptr data, int statusC handler->q_func()->setAttribute(QNetworkRequest::HttpReasonPhraseAttribute, statusReason); } -void QNetworkReplyWasmImplPrivate::doAbort() const -{ - emscripten_fetch_close(m_fetch); -} - constexpr int getArraySize (int factor) { return 2 * factor + 1; } @@ -283,7 +276,6 @@ void QNetworkReplyWasmImplPrivate::emitReplyError(QNetworkReply::NetworkError er q->setError(errorCode, errorString); emit q->errorOccurred(errorCode); - emit q->finished(); } void QNetworkReplyWasmImplPrivate::emitDataReadProgress(qint64 bytesReceived, qint64 bytesTotal) @@ -447,23 +439,18 @@ void QNetworkReplyWasmImplPrivate::_q_bufferOutgoingData() void QNetworkReplyWasmImplPrivate::downloadSucceeded(emscripten_fetch_t *fetch) { - QNetworkReplyWasmImplPrivate *reply = - reinterpret_cast(fetch->userData); + auto reply = reinterpret_cast(fetch->userData); if (reply) { - QByteArray buffer(fetch->data, fetch->numBytes); - reply->dataReceived(buffer, buffer.size()); - - QByteArray statusText(fetch->statusText); - reply->setStatusCode(fetch->status, statusText); - reply->setReplyFinished(); + if (reply->state != QNetworkReplyPrivate::Aborted) { + QByteArray buffer(fetch->data, fetch->numBytes); + reply->dataReceived(buffer, buffer.size()); + QByteArray statusText(fetch->statusText); + reply->setStatusCode(fetch->status, statusText); + reply->setReplyFinished(); + } + reply->m_fetch = nullptr; } -} - -void QNetworkReplyWasmImplPrivate::setStatusCode(int status, const QByteArray &statusText) -{ - Q_Q(QNetworkReplyWasmImpl); - q->setAttribute(QNetworkRequest::HttpStatusCodeAttribute, status); - q->setAttribute(QNetworkRequest::HttpReasonPhraseAttribute, statusText); + emscripten_fetch_close(fetch); } void QNetworkReplyWasmImplPrivate::setReplyFinished() @@ -474,24 +461,36 @@ void QNetworkReplyWasmImplPrivate::setReplyFinished() emit q->finished(); } +void QNetworkReplyWasmImplPrivate::setStatusCode(int status, const QByteArray &statusText) +{ + Q_Q(QNetworkReplyWasmImpl); + q->setAttribute(QNetworkRequest::HttpStatusCodeAttribute, status); + q->setAttribute(QNetworkRequest::HttpReasonPhraseAttribute, statusText); +} + void QNetworkReplyWasmImplPrivate::stateChange(emscripten_fetch_t *fetch) { - if (fetch->readyState == /*HEADERS_RECEIVED*/ 2) { - size_t headerLength = emscripten_fetch_get_response_headers_length(fetch); - QByteArray str(headerLength, Qt::Uninitialized); - emscripten_fetch_get_response_headers(fetch, str.data(), str.size()); - QNetworkReplyWasmImplPrivate *reply = - reinterpret_cast(fetch->userData); - reply->headersReceived(str); + if (fetch) { + if (!quintptr(fetch->userData)) + return; + auto reply = reinterpret_cast(fetch->userData); + if (reply->state != QNetworkReplyPrivate::Aborted) { + if (fetch->readyState == /*HEADERS_RECEIVED*/ 2) { + size_t headerLength = emscripten_fetch_get_response_headers_length(fetch); + QByteArray str(headerLength, Qt::Uninitialized); + emscripten_fetch_get_response_headers(fetch, str.data(), str.size()); + + reply->headersReceived(str); + } + } } } void QNetworkReplyWasmImplPrivate::downloadProgress(emscripten_fetch_t *fetch) { - QNetworkReplyWasmImplPrivate *reply = - reinterpret_cast(fetch->userData); - Q_ASSERT(reply); - + auto reply = reinterpret_cast(fetch->userData); + if (!reply || reply->state == QNetworkReplyPrivate::Aborted) + return; if (fetch->status < 400) { uint64_t bytes = fetch->dataOffset + fetch->numBytes; uint64_t tBytes = fetch->totalBytes; // totalBytes can be 0 if server not reporting content length @@ -503,10 +502,13 @@ void QNetworkReplyWasmImplPrivate::downloadProgress(emscripten_fetch_t *fetch) void QNetworkReplyWasmImplPrivate::downloadFailed(emscripten_fetch_t *fetch) { - QNetworkReplyWasmImplPrivate *reply = reinterpret_cast(fetch->userData); + + auto reply = reinterpret_cast(fetch->userData); + if (reply) { + QString reasonStr; - if (fetch->status > 600 || reply->state == QNetworkReplyPrivate::Aborted) + if (fetch->status > 600) reasonStr = QStringLiteral("Operation canceled"); else reasonStr = QString::fromUtf8(fetch->statusText); @@ -514,10 +516,10 @@ void QNetworkReplyWasmImplPrivate::downloadFailed(emscripten_fetch_t *fetch) QByteArray statusText(fetch->statusText); reply->setStatusCode(fetch->status, statusText); reply->emitReplyError(reply->statusCodeFromHttp(fetch->status, reply->request.url()), reasonStr); + reply->m_fetch = nullptr; } - if (fetch->status >= 400) - emscripten_fetch_close(fetch); // Also free data on failure. + emscripten_fetch_close(fetch); } //taken from qhttpthreaddelegate.cpp diff --git a/src/network/access/qnetworkreplywasmimpl_p.h b/src/network/access/qnetworkreplywasmimpl_p.h index 53e9bc33..db9fd565 100644 --- a/src/network/access/qnetworkreplywasmimpl_p.h +++ b/src/network/access/qnetworkreplywasmimpl_p.h @@ -137,8 +137,6 @@ public: QSharedPointer outgoingDataBuffer; QByteArray requestData; - void doAbort() const; - static void downloadProgress(emscripten_fetch_t *fetch); static void downloadFailed(emscripten_fetch_t *fetch); static void downloadSucceeded(emscripten_fetch_t *fetch); diff --git a/src/network/access/qspdyprotocolhandler.cpp b/src/network/access/qspdyprotocolhandler.cpp index eef8df28..c327494e 100644 --- a/src/network/access/qspdyprotocolhandler.cpp +++ b/src/network/access/qspdyprotocolhandler.cpp @@ -762,7 +762,8 @@ bool QSpdyProtocolHandler::uploadData(qint32 streamID) void QSpdyProtocolHandler::_q_uploadDataReadyRead() { QNonContiguousByteDevice *device = qobject_cast(sender()); - Q_ASSERT(device); + if (!device) + return; qint32 streamID = m_streamIDs.value(device); Q_ASSERT(streamID > 0); uploadData(streamID); diff --git a/src/network/doc/src/qtnetwork.qdoc b/src/network/doc/src/qtnetwork.qdoc index 57b0210b..3bdfaf00 100644 --- a/src/network/doc/src/qtnetwork.qdoc +++ b/src/network/doc/src/qtnetwork.qdoc @@ -43,7 +43,9 @@ Add \c network to the \c QT variable: - \snippet snippets.pro 0 + \code + QT += network + \endcode \section1 Articles and Guides diff --git a/src/network/doc/src/ssl.qdoc b/src/network/doc/src/ssl.qdoc index e485a1b3..efe4111c 100644 --- a/src/network/doc/src/ssl.qdoc +++ b/src/network/doc/src/ssl.qdoc @@ -36,8 +36,8 @@ the Secure Sockets Layer (SSL) protocol, using the \l{OpenSSL Toolkit} to perform encryption and protocol handling. - From Qt version 5.6 onwards, the officially supported version for OpenSSL - is 1.0.0 or later. + From Qt version 5.15 onwards, the officially supported version for OpenSSL + is 1.1.1 or later. \annotatedlist ssl diff --git a/src/network/kernel/qauthenticator.cpp b/src/network/kernel/qauthenticator.cpp index 86242b01..d9fe7bc4 100644 --- a/src/network/kernel/qauthenticator.cpp +++ b/src/network/kernel/qauthenticator.cpp @@ -423,6 +423,22 @@ void QAuthenticatorPrivate::updateCredentials() } } +static bool verifyDigestMD5(const QByteArray &value) +{ + auto opts = QAuthenticatorPrivate::parseDigestAuthenticationChallenge(value); + auto it = opts.constFind("algorithm"); + if (it != opts.cend()) { + QByteArray alg = it.value(); + if (alg.size() < 3) + return false; + // Just compare the first 3 characters, that way we match other subvariants as well, such as + // "MD5-sess" + auto view = QByteArray::fromRawData(alg.data(), 3); + return view.compare("MD5", Qt::CaseInsensitive) == 0; + } + return true; // assume it's ok if algorithm is not specified +} + void QAuthenticatorPrivate::parseHttpResponse(const QList > &values, bool isProxy, const QString &host) { #if !QT_CONFIG(gssapi) @@ -454,8 +470,13 @@ void QAuthenticatorPrivate::parseHttpResponse(const QListsocket->readAll(); //We're done with the reply and need to reset it for the next connection delete d->reply; - d->reply = new QHttpNetworkReply; + d->reply = new QHttpNetworkReply(QUrl(), this); } if (priv->phase == QAuthenticatorPrivate::Done) diff --git a/src/network/socket/qlocalsocket.h b/src/network/socket/qlocalsocket.h index 200d59a3..4034329d 100644 --- a/src/network/socket/qlocalsocket.h +++ b/src/network/socket/qlocalsocket.h @@ -44,6 +44,10 @@ #include #include +#ifndef QT_NO_DEBUG_STREAM +#include +#endif + QT_REQUIRE_CONFIG(localserver); QT_BEGIN_NAMESPACE @@ -146,7 +150,6 @@ private: }; #ifndef QT_NO_DEBUG_STREAM -#include Q_NETWORK_EXPORT QDebug operator<<(QDebug, QLocalSocket::LocalSocketError); Q_NETWORK_EXPORT QDebug operator<<(QDebug, QLocalSocket::LocalSocketState); #endif diff --git a/src/network/socket/qlocalsocket_win.cpp b/src/network/socket/qlocalsocket_win.cpp index 6d826565..2599a38a 100644 --- a/src/network/socket/qlocalsocket_win.cpp +++ b/src/network/socket/qlocalsocket_win.cpp @@ -255,13 +255,10 @@ void QLocalSocketPrivate::_q_pipeClosed() emit q->disconnected(); pipeReader->stop(); + delete pipeWriter; + pipeWriter = nullptr; destroyPipeHandles(); handle = INVALID_HANDLE_VALUE; - - if (pipeWriter) { - delete pipeWriter; - pipeWriter = 0; - } } qint64 QLocalSocket::bytesAvailable() const diff --git a/src/network/ssl/qasn1element.cpp b/src/network/ssl/qasn1element.cpp index d7b6aa8b..e8b70a14 100644 --- a/src/network/ssl/qasn1element.cpp +++ b/src/network/ssl/qasn1element.cpp @@ -318,8 +318,9 @@ qint64 QAsn1Element::toInteger(bool *ok) const return 0; } - // NOTE: negative numbers are not handled - if (mValue.at(0) & 0x80) { + // NOTE: - negative numbers are not handled + // - greater sizes would overflow + if (mValue.at(0) & 0x80 || mValue.size() > 8) { if (ok) *ok = false; return 0; diff --git a/src/network/ssl/qsslcertificate_openssl.cpp b/src/network/ssl/qsslcertificate_openssl.cpp index 5022b899..d1794d4d 100644 --- a/src/network/ssl/qsslcertificate_openssl.cpp +++ b/src/network/ssl/qsslcertificate_openssl.cpp @@ -44,6 +44,7 @@ #include "qsslkey_p.h" #include "qsslcertificateextension_p.h" +#include #include #include @@ -330,12 +331,11 @@ QSslKey QSslCertificate::publicKey() const */ static QVariant x509UnknownExtensionToValue(X509_EXTENSION *ext) { - // Get the extension specific method object if available + Q_ASSERT(ext); + // Get the extension specific method object if available, // we cast away the const-ness here because some versions of openssl // don't use const for the parameters in the functions pointers stored // in the object. - Q_ASSERT(ext); - X509V3_EXT_METHOD *meth = const_cast(q_X509V3_EXT_get(ext)); if (!meth) { ASN1_OCTET_STRING *value = q_X509_EXTENSION_get_data(ext); @@ -345,18 +345,34 @@ static QVariant x509UnknownExtensionToValue(X509_EXTENSION *ext) return result; } - //const unsigned char *data = ext->value->data; void *ext_internal = q_X509V3_EXT_d2i(ext); + if (!ext_internal) + return {}; + + const auto extCleaner = qScopeGuard([meth, ext_internal]{ + Q_ASSERT(ext_internal && meth); + + if (meth->it) + q_ASN1_item_free(static_cast(ext_internal), ASN1_ITEM_ptr(meth->it)); + else if (meth->ext_free) + meth->ext_free(ext_internal); + else + qCWarning(lcSsl, "No method to free an unknown extension, a potential memory leak?"); + }); // If this extension can be converted - if (meth->i2v && ext_internal) { + if (meth->i2v) { STACK_OF(CONF_VALUE) *val = meth->i2v(meth, ext_internal, nullptr); + const auto stackCleaner = qScopeGuard([val]{ + if (val) + q_OPENSSL_sk_pop_free((OPENSSL_STACK *)val, (void(*)(void*))q_X509V3_conf_free); + }); QVariantMap map; QVariantList list; bool isMap = false; - for (int j = 0; j < q_SKM_sk_num(CONF_VALUE, val); j++) { + for (int j = 0; j < q_SKM_sk_num(val); j++) { CONF_VALUE *nval = q_SKM_sk_value(CONF_VALUE, val, j); if (nval->name && nval->value) { isMap = true; @@ -372,10 +388,12 @@ static QVariant x509UnknownExtensionToValue(X509_EXTENSION *ext) return map; else return list; - } else if (meth->i2s && ext_internal) { - QVariant result(QString::fromUtf8(meth->i2s(meth, ext_internal))); + } else if (meth->i2s) { + const char *hexString = meth->i2s(meth, ext_internal); + QVariant result(hexString ? QString::fromUtf8(hexString) : QString{}); + q_OPENSSL_free((void *)hexString); return result; - } else if (meth->i2r && ext_internal) { + } else if (meth->i2r) { QByteArray result; BIO *bio = q_BIO_new(q_BIO_s_mem()); @@ -405,13 +423,36 @@ static QVariant x509ExtensionToValue(X509_EXTENSION *ext) ASN1_OBJECT *obj = q_X509_EXTENSION_get_object(ext); int nid = q_OBJ_obj2nid(obj); + // We cast away the const-ness here because some versions of openssl + // don't use const for the parameters in the functions pointers stored + // in the object. + X509V3_EXT_METHOD *meth = const_cast(q_X509V3_EXT_get(ext)); + + void *ext_internal = nullptr; // The value, returned by X509V3_EXT_d2i. + const auto extCleaner = qScopeGuard([meth, &ext_internal]() { + if (!meth || !ext_internal) + return; + + if (meth->it) + q_ASN1_item_free(static_cast(ext_internal), ASN1_ITEM_ptr(meth->it)); + else if (meth->ext_free) + meth->ext_free(ext_internal); + else + qWarning(lcSsl, "Cannot free an extension, a potential memory leak?"); + }); + + const char * hexString = nullptr; // The value returned by meth->i2s. + const auto hexStringCleaner = qScopeGuard([&hexString](){ + if (hexString) + q_OPENSSL_free((void*)hexString); + }); + switch (nid) { case NID_basic_constraints: { BASIC_CONSTRAINTS *basic = reinterpret_cast(q_X509V3_EXT_d2i(ext)); if (!basic) - return QVariant(); - + return {}; QVariantMap result; result[QLatin1String("ca")] = basic->ca ? true : false; if (basic->pathlen) @@ -425,10 +466,9 @@ static QVariant x509ExtensionToValue(X509_EXTENSION *ext) { AUTHORITY_INFO_ACCESS *info = reinterpret_cast(q_X509V3_EXT_d2i(ext)); if (!info) - return QVariant(); - + return {}; QVariantMap result; - for (int i=0; i < q_SKM_sk_num(ACCESS_DESCRIPTION, info); i++) { + for (int i=0; i < q_SKM_sk_num(info); i++) { ACCESS_DESCRIPTION *ad = q_SKM_sk_value(ACCESS_DESCRIPTION, info, i); GENERAL_NAME *name = ad->location; @@ -448,29 +488,25 @@ static QVariant x509ExtensionToValue(X509_EXTENSION *ext) } } - q_OPENSSL_sk_pop_free((OPENSSL_STACK*)info, reinterpret_cast(q_OPENSSL_sk_free)); + q_AUTHORITY_INFO_ACCESS_free(info); return result; } break; case NID_subject_key_identifier: { - void *ext_internal = q_X509V3_EXT_d2i(ext); + ext_internal = q_X509V3_EXT_d2i(ext); if (!ext_internal) - return QVariant(); - // we cast away the const-ness here because some versions of openssl - // don't use const for the parameters in the functions pointers stored - // in the object. - X509V3_EXT_METHOD *meth = const_cast(q_X509V3_EXT_get(ext)); + return {}; - return QVariant(QString::fromUtf8(meth->i2s(meth, ext_internal))); + hexString = meth->i2s(meth, ext_internal); + return QVariant(QString::fromUtf8(hexString)); } break; - case NID_authority_key_identifier: + case NID_authority_key_identifier: { AUTHORITY_KEYID *auth_key = reinterpret_cast(q_X509V3_EXT_d2i(ext)); if (!auth_key) - return QVariant(); - + return {}; QVariantMap result; // keyid @@ -493,7 +529,7 @@ static QVariant x509ExtensionToValue(X509_EXTENSION *ext) break; } - return QVariant(); + return {}; } QSslCertificateExtension QSslCertificatePrivate::convertExtension(X509_EXTENSION *ext) diff --git a/src/network/ssl/qsslkey_openssl.cpp b/src/network/ssl/qsslkey_openssl.cpp index 43cb8c6d..df54b6a0 100644 --- a/src/network/ssl/qsslkey_openssl.cpp +++ b/src/network/ssl/qsslkey_openssl.cpp @@ -348,7 +348,10 @@ static QByteArray doCrypt(QSslKeyPrivate::Cipher cipher, const QByteArray &data, EVP_CIPHER_CTX *ctx = q_EVP_CIPHER_CTX_new(); q_EVP_CIPHER_CTX_reset(ctx); - q_EVP_CipherInit(ctx, type, nullptr, nullptr, enc); + if (q_EVP_CipherInit(ctx, type, nullptr, nullptr, enc) != 1) { + QSslSocketBackendPrivate::logAndClearErrorQueue(); + return QByteArray(); + } q_EVP_CIPHER_CTX_set_key_length(ctx, key.size()); if (cipher == QSslKeyPrivate::Rc2Cbc) q_EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_SET_RC2_KEY_BITS, 8 * key.size(), nullptr); diff --git a/src/network/ssl/qsslsocket_openssl.cpp b/src/network/ssl/qsslsocket_openssl.cpp index af47dbf9..37fad2a6 100644 --- a/src/network/ssl/qsslsocket_openssl.cpp +++ b/src/network/ssl/qsslsocket_openssl.cpp @@ -213,15 +213,22 @@ static unsigned int q_ssl_psk_restore_client(SSL *ssl, Q_ASSERT(d); Q_ASSERT(d->mode == QSslSocket::SslClientMode); #endif + unsigned retVal = 0; + + // Let developers opt-in to having the normal PSK callback get called for TLS 1.3 + // PSK (which works differently in a few ways, and is called at the start of every connection). + // When they do opt-in we just call the old callback from here. + if (qEnvironmentVariableIsSet("QT_USE_TLS_1_3_PSK")) + retVal = q_ssl_psk_client_callback(ssl, hint, identity, max_identity_len, psk, max_psk_len); + q_SSL_set_psk_client_callback(ssl, &q_ssl_psk_client_callback); - return 0; + return retVal; } static int q_ssl_psk_use_session_callback(SSL *ssl, const EVP_MD *md, const unsigned char **id, size_t *idlen, SSL_SESSION **sess) { - Q_UNUSED(ssl); Q_UNUSED(md); Q_UNUSED(id); Q_UNUSED(idlen); @@ -455,7 +462,7 @@ bool qt_OCSP_certificate_match(OCSP_SINGLERESP *singleResponse, X509 *peerCert, const QSharedPointer guard(recreatedId, q_OCSP_CERTID_free); if (q_OCSP_id_cmp(const_cast(certId), recreatedId)) { - qDebug(lcSsl, "Certificate ID mismatch"); + qCDebug(lcSsl, "Certificate ID mismatch"); return false; } // Bingo! @@ -484,8 +491,23 @@ int q_X509Callback(int ok, X509_STORE_CTX *ctx) // during a handshake, a pointer to the SSL object is stored into the X509_STORE_CTX object // to identify the connection affected. To retrieve this pointer the X509_STORE_CTX_get_ex_data() // function can be used with the correct index." - if (SSL *ssl = static_cast(q_X509_STORE_CTX_get_ex_data(ctx, q_SSL_get_ex_data_X509_STORE_CTX_idx()))) + if (SSL *ssl = static_cast(q_X509_STORE_CTX_get_ex_data( + ctx, q_SSL_get_ex_data_X509_STORE_CTX_idx()))) { + + // We may be in a renegotiation, check if we are inside a call to SSL_read: + const auto tlsOffset = QSslSocketBackendPrivate::s_indexForSSLExtraData; + auto tls = static_cast(q_SSL_get_ex_data(ssl, tlsOffset)); + Q_ASSERT(tls); + if (tls->isInSslRead()) { + // We are in a renegotiation, make a note of this for later. + // We'll check that the certificate is the same as the one we got during + // the initial handshake + tls->setRenegotiated(true); + return 1; + } + errors = ErrorListPtr(q_SSL_get_ex_data(ssl, QSslSocketBackendPrivate::s_indexForSSLExtraData + 1)); + } } if (!errors) { @@ -1149,7 +1171,25 @@ void QSslSocketBackendPrivate::transmit() break; } // Don't use SSL_pending(). It's very unreliable. + inSslRead = true; readBytes = q_SSL_read(ssl, buffer.reserve(bytesToRead), bytesToRead); + inSslRead = false; + if (renegotiated) { + renegotiated = false; + X509 *x509 = q_SSL_get_peer_certificate(ssl); + const auto peerCertificate = + QSslCertificatePrivate::QSslCertificate_from_X509(x509); + // Fail the renegotiate if the certificate has changed, else: continue. + if (peerCertificate != q->peerCertificate()) { + const ScopedBool bg(inSetAndEmitError, true); + setErrorAndEmit( + QAbstractSocket::RemoteHostClosedError, + QSslSocket::tr( + "TLS certificate unexpectedly changed during renegotiation!")); + q->abort(); + return; + } + } if (readBytes > 0) { #ifdef QSSLSOCKET_DEBUG qCDebug(lcSsl) << "QSslSocketBackendPrivate::transmit: decrypted" << readBytes << "bytes"; @@ -1593,6 +1633,16 @@ unsigned int QSslSocketBackendPrivate::tlsPskServerCallback(const char *identity return pskLength; } +bool QSslSocketBackendPrivate::isInSslRead() const +{ + return inSslRead; +} + +void QSslSocketBackendPrivate::setRenegotiated(bool renegotiated) +{ + this->renegotiated = renegotiated; +} + #ifdef Q_OS_WIN void QSslSocketBackendPrivate::fetchCaRootForCert(const QSslCertificate &cert) diff --git a/src/network/ssl/qsslsocket_openssl_p.h b/src/network/ssl/qsslsocket_openssl_p.h index 67f267ae..4103de23 100644 --- a/src/network/ssl/qsslsocket_openssl_p.h +++ b/src/network/ssl/qsslsocket_openssl_p.h @@ -134,6 +134,9 @@ public: bool inSetAndEmitError = false; + bool inSslRead = false; + bool renegotiated = false; + // Platform specific functions void startClientEncryption() override; void startServerEncryption() override; @@ -149,6 +152,10 @@ public: int handleNewSessionTicket(SSL *context); unsigned int tlsPskClientCallback(const char *hint, char *identity, unsigned int max_identity_len, unsigned char *psk, unsigned int max_psk_len); unsigned int tlsPskServerCallback(const char *identity, unsigned char *psk, unsigned int max_psk_len); + + bool isInSslRead() const; + void setRenegotiated(bool renegotiated); + #ifdef Q_OS_WIN void fetchCaRootForCert(const QSslCertificate &cert); void _q_caRootLoaded(QSslCertificate,QSslCertificate) override; diff --git a/src/network/ssl/qsslsocket_openssl_symbols.cpp b/src/network/ssl/qsslsocket_openssl_symbols.cpp index f89f5206..68a766c0 100644 --- a/src/network/ssl/qsslsocket_openssl_symbols.cpp +++ b/src/network/ssl/qsslsocket_openssl_symbols.cpp @@ -177,6 +177,8 @@ DEFINEFUNC(const SSL_METHOD *, TLS_server_method, DUMMYARG, DUMMYARG, return nul DEFINEFUNC(void, X509_up_ref, X509 *a, a, return, DUMMYARG) DEFINEFUNC(ASN1_TIME *, X509_getm_notBefore, X509 *a, a, return nullptr, return) DEFINEFUNC(ASN1_TIME *, X509_getm_notAfter, X509 *a, a, return nullptr, return) +DEFINEFUNC2(void, ASN1_item_free, ASN1_VALUE *val, val, const ASN1_ITEM *it, it, return, return) +DEFINEFUNC(void, X509V3_conf_free, CONF_VALUE *val, val, return, return) DEFINEFUNC(long, X509_get_version, X509 *a, a, return -1, return) DEFINEFUNC(EVP_PKEY *, X509_get_pubkey, X509 *a, a, return nullptr, return) DEFINEFUNC2(void, X509_STORE_set_verify_cb, X509_STORE *a, a, X509_STORE_CTX_verify_cb verify_cb, verify_cb, return, DUMMYARG) @@ -233,6 +235,7 @@ DEFINEFUNC6(int, OCSP_basic_sign, OCSP_BASICRESP *br, br, X509 *signer, signer, const EVP_MD *dg, dg, STACK_OF(X509) *cs, cs, unsigned long flags, flags, return 0, return) #endif // ocsp +DEFINEFUNC(void, AUTHORITY_INFO_ACCESS_free, AUTHORITY_INFO_ACCESS *p, p, return, return) DEFINEFUNC2(void, BIO_set_data, BIO *a, a, void *ptr, ptr, return, DUMMYARG) DEFINEFUNC(void *, BIO_get_data, BIO *a, a, return nullptr, return) DEFINEFUNC2(void, BIO_set_init, BIO *a, a, int init, init, return, DUMMYARG) @@ -677,7 +680,14 @@ static LoadedOpenSsl loadOpenSsl() LoadedOpenSsl result; // With OpenSSL 1.1 the names have changed to libssl-1_1 and libcrypto-1_1 for builds using - // MSVC and GCC, with architecture suffixes for non-x86 builds. + // MSVC and GCC. For 3.0 the version suffix changed again, to just '3'. + // For non-x86 builds, an architecture suffix is also appended. + +#if (OPENSSL_VERSION_NUMBER >> 28) < 3 +#define QT_OPENSSL_VERSION "1_1" +#elif OPENSSL_VERSION_MAJOR == 3 // Starting with 3.0 this define is available +#define QT_OPENSSL_VERSION "3" +#endif // > 3 intentionally left undefined #if defined(Q_PROCESSOR_X86_64) #define QT_SSL_SUFFIX "-x64" @@ -689,8 +699,8 @@ static LoadedOpenSsl loadOpenSsl() #define QT_SSL_SUFFIX #endif - tryToLoadOpenSslWin32Library(QLatin1String("libssl-1_1" QT_SSL_SUFFIX), - QLatin1String("libcrypto-1_1" QT_SSL_SUFFIX), result); + tryToLoadOpenSslWin32Library(QLatin1String("libssl-" QT_OPENSSL_VERSION QT_SSL_SUFFIX), + QLatin1String("libcrypto-" QT_OPENSSL_VERSION QT_SSL_SUFFIX), result); #undef QT_SSL_SUFFIX return result; @@ -796,6 +806,11 @@ static LoadedOpenSsl loadOpenSsl() const QStringList cryptoList = findAllLibCrypto(); for (const QString &crypto : cryptoList) { +#ifdef Q_OS_DARWIN + // Clients should not load the unversioned libcrypto dylib as it does not have a stable ABI + if (crypto.endsWith("libcrypto.dylib")) + continue; +#endif libcrypto->setFileNameAndVersion(crypto, -1); if (libcrypto->load()) { QFileInfo fi(crypto); @@ -853,6 +868,7 @@ bool q_resolveOpenSslSymbols() RESOLVEFUNC(OPENSSL_init_crypto) RESOLVEFUNC(ASN1_STRING_get0_data) RESOLVEFUNC(EVP_CIPHER_CTX_reset) + RESOLVEFUNC(AUTHORITY_INFO_ACCESS_free) RESOLVEFUNC(EVP_PKEY_up_ref) RESOLVEFUNC(EVP_PKEY_CTX_new) RESOLVEFUNC(EVP_PKEY_param_check) @@ -888,6 +904,8 @@ bool q_resolveOpenSslSymbols() RESOLVEFUNC(X509_STORE_CTX_get0_chain) RESOLVEFUNC(X509_getm_notBefore) RESOLVEFUNC(X509_getm_notAfter) + RESOLVEFUNC(ASN1_item_free) + RESOLVEFUNC(X509V3_conf_free) RESOLVEFUNC(X509_get_version) RESOLVEFUNC(X509_get_pubkey) RESOLVEFUNC(X509_STORE_set_verify_cb) @@ -897,13 +915,25 @@ bool q_resolveOpenSslSymbols() RESOLVEFUNC(OpenSSL_version_num) RESOLVEFUNC(OpenSSL_version) - if (!_q_OpenSSL_version) { + if (!_q_OpenSSL_version || !_q_OpenSSL_version_num) { // Apparently, we were built with OpenSSL 1.1 enabled but are now using // a wrong library. qCWarning(lcSsl, "Incompatible version of OpenSSL"); return false; } +#if OPENSSL_VERSION_NUMBER >= 0x30000000 + if (q_OpenSSL_version_num() < 0x30000000) { + qCWarning(lcSsl, "Incompatible version of OpenSSL (built with OpenSSL >= 3.x, runtime version is < 3.x)"); + return false; + } +#else + if (q_OpenSSL_version_num() >= 0x30000000) { + qCWarning(lcSsl, "Incompatible version of OpenSSL (built with OpenSSL 1.x, runtime version is >= 3.x)"); + return false; + } +#endif // OPENSSL_VERSION_NUMBER + RESOLVEFUNC(SSL_SESSION_get_ticket_lifetime_hint) RESOLVEFUNC(DH_bits) RESOLVEFUNC(DSA_bits) diff --git a/src/network/ssl/qsslsocket_openssl_symbols_p.h b/src/network/ssl/qsslsocket_openssl_symbols_p.h index b36d0bc1..71961775 100644 --- a/src/network/ssl/qsslsocket_openssl_symbols_p.h +++ b/src/network/ssl/qsslsocket_openssl_symbols_p.h @@ -231,6 +231,7 @@ Q_AUTOTEST_EXPORT BIO *q_BIO_new(const BIO_METHOD *a); Q_AUTOTEST_EXPORT const BIO_METHOD *q_BIO_s_mem(); int q_DSA_bits(DSA *a); +void q_AUTHORITY_INFO_ACCESS_free(AUTHORITY_INFO_ACCESS *a); int q_EVP_CIPHER_CTX_reset(EVP_CIPHER_CTX *c); Q_AUTOTEST_EXPORT int q_EVP_PKEY_up_ref(EVP_PKEY *a); EVP_PKEY_CTX *q_EVP_PKEY_CTX_new(EVP_PKEY *pkey, ENGINE *e); @@ -254,6 +255,8 @@ const SSL_METHOD *q_TLS_client_method(); const SSL_METHOD *q_TLS_server_method(); ASN1_TIME *q_X509_getm_notBefore(X509 *a); ASN1_TIME *q_X509_getm_notAfter(X509 *a); +void q_ASN1_item_free(ASN1_VALUE *val, const ASN1_ITEM *it); +void q_X509V3_conf_free(CONF_VALUE *val); Q_AUTOTEST_EXPORT void q_X509_up_ref(X509 *a); long q_X509_get_version(X509 *a); @@ -268,8 +271,8 @@ int q_DH_bits(DH *dh); # define q_SSL_load_error_strings() q_OPENSSL_init_ssl(OPENSSL_INIT_LOAD_SSL_STRINGS \ | OPENSSL_INIT_LOAD_CRYPTO_STRINGS, NULL) -#define q_SKM_sk_num(type, st) ((int (*)(const STACK_OF(type) *))q_OPENSSL_sk_num)(st) -#define q_SKM_sk_value(type, st,i) ((type * (*)(const STACK_OF(type) *, int))q_OPENSSL_sk_value)(st, i) +#define q_SKM_sk_num(st) q_OPENSSL_sk_num((OPENSSL_STACK *)st) +#define q_SKM_sk_value(type, st,i) (type *)q_OPENSSL_sk_value((OPENSSL_STACK *)st, i) #define q_OPENSSL_add_all_algorithms_conf() q_OPENSSL_init_crypto(OPENSSL_INIT_ADD_ALL_CIPHERS \ | OPENSSL_INIT_ADD_ALL_DIGESTS \ @@ -278,8 +281,6 @@ int q_DH_bits(DH *dh); | OPENSSL_INIT_ADD_ALL_DIGESTS, NULL) int q_OPENSSL_init_crypto(uint64_t opts, const OPENSSL_INIT_SETTINGS *settings); -void q_CRYPTO_free(void *str, const char *file, int line); - long q_OpenSSL_version_num(); const char *q_OpenSSL_version(int type); @@ -606,14 +607,14 @@ void q_PKCS12_free(PKCS12 *pkcs12); #define q_BIO_get_mem_data(b, pp) (int)q_BIO_ctrl(b,BIO_CTRL_INFO,0,(char *)pp) #define q_BIO_pending(b) (int)q_BIO_ctrl(b,BIO_CTRL_PENDING,0,NULL) #define q_SSL_CTX_set_mode(ctx,op) q_SSL_CTX_ctrl((ctx),SSL_CTRL_MODE,(op),NULL) -#define q_sk_GENERAL_NAME_num(st) q_SKM_sk_num(GENERAL_NAME, (st)) +#define q_sk_GENERAL_NAME_num(st) q_SKM_sk_num((st)) #define q_sk_GENERAL_NAME_value(st, i) q_SKM_sk_value(GENERAL_NAME, (st), (i)) void q_GENERAL_NAME_free(GENERAL_NAME *a); -#define q_sk_X509_num(st) q_SKM_sk_num(X509, (st)) +#define q_sk_X509_num(st) q_SKM_sk_num((st)) #define q_sk_X509_value(st, i) q_SKM_sk_value(X509, (st), (i)) -#define q_sk_SSL_CIPHER_num(st) q_SKM_sk_num(SSL_CIPHER, (st)) +#define q_sk_SSL_CIPHER_num(st) q_SKM_sk_num((st)) #define q_sk_SSL_CIPHER_value(st, i) q_SKM_sk_value(SSL_CIPHER, (st), (i)) #define q_SSL_CTX_add_extra_chain_cert(ctx,x509) \ q_SSL_CTX_ctrl(ctx,SSL_CTRL_EXTRA_CHAIN_CERT,0,(char *)x509) @@ -742,6 +743,8 @@ int q_OCSP_id_cmp(OCSP_CERTID *a, OCSP_CERTID *b); void *q_CRYPTO_malloc(size_t num, const char *file, int line); #define q_OPENSSL_malloc(num) q_CRYPTO_malloc(num, "", 0) +void q_CRYPTO_free(void *str, const char *file, int line); +#define q_OPENSSL_free(addr) q_CRYPTO_free(addr, "", 0) int q_SSL_CTX_get_security_level(const SSL_CTX *ctx); void q_SSL_CTX_set_security_level(SSL_CTX *ctx, int level); diff --git a/src/opengl/opengl.pro b/src/opengl/opengl.pro index 48753873..8b2349ff 100644 --- a/src/opengl/opengl.pro +++ b/src/opengl/opengl.pro @@ -55,6 +55,3 @@ qtConfig(graphicseffect) { } load(qt_module) - -TRACEPOINT_PROVIDER = $$PWD/qtopengl.tracepoints -CONFIG += qt_tracepoints diff --git a/src/opengl/qgl.cpp b/src/opengl/qgl.cpp index 4108b700..0d4e9fc1 100644 --- a/src/opengl/qgl.cpp +++ b/src/opengl/qgl.cpp @@ -493,7 +493,8 @@ QSurfaceFormat QGLFormat::toSurfaceFormat(const QGLFormat &format) retFormat.setSamples(format.samples() == -1 ? 4 : format.samples()); if (format.stencil()) retFormat.setStencilBufferSize(format.stencilBufferSize() == -1 ? 1 : format.stencilBufferSize()); - retFormat.setSwapInterval(format.swapInterval()); + if (format.swapInterval() >= 0) + retFormat.setSwapInterval(format.swapInterval()); retFormat.setStereo(format.stereo()); retFormat.setMajorVersion(format.majorVersion()); retFormat.setMinorVersion(format.minorVersion()); diff --git a/src/opengl/qtopengl.tracepoints b/src/opengl/qtopengl.tracepoints deleted file mode 100644 index 3c3043d3..00000000 --- a/src/opengl/qtopengl.tracepoints +++ /dev/null @@ -1,3 +0,0 @@ -QOpenGLFramebufferObjectPrivate_init(QOpenGLFramebufferObject *qfbo, const QSize &size, QOpenGLFramebufferObject::Attachment attachment, GLenum texture_target, GLenum internal_format, GLint samples, bool mipmap) -QOpenGL2PaintEngineExPrivate_drawTexture(const QOpenGLRect& dest, const QOpenGLRect& src, const QSize &textureSize, bool opaque, bool pattern) -QOpenGLTextureCache_bindTexture(QOpenGLContext *context, qint64 key, const QImage &image, QOpenGLTextureUploader::BindOptions options) diff --git a/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp b/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp index 0d4bc288..159b490c 100644 --- a/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp +++ b/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp @@ -536,6 +536,11 @@ static void populateFromPattern(FcPattern *pattern) } +QFontconfigDatabase::~QFontconfigDatabase() +{ + FcConfigDestroy(FcConfigGetCurrent()); +} + void QFontconfigDatabase::populateFontDatabase() { FcInit(); diff --git a/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase_p.h b/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase_p.h index a7257c2f..78d6eb93 100644 --- a/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase_p.h +++ b/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase_p.h @@ -61,6 +61,7 @@ class QFontEngineFT; class QFontconfigDatabase : public QFreeTypeFontDatabase { public: + ~QFontconfigDatabase() override; void populateFontDatabase() override; void invalidate() override; QFontEngineMulti *fontEngineMulti(QFontEngine *fontEngine, QChar::Script script) override; diff --git a/src/platformsupport/fontdatabases/freetype/qfontengine_ft.cpp b/src/platformsupport/fontdatabases/freetype/qfontengine_ft.cpp index be1b0216..92d6eef8 100644 --- a/src/platformsupport/fontdatabases/freetype/qfontengine_ft.cpp +++ b/src/platformsupport/fontdatabases/freetype/qfontengine_ft.cpp @@ -756,7 +756,8 @@ bool QFontEngineFT::init(FaceId faceId, bool antialias, GlyphFormat format, } // underline metrics line_thickness = QFixed::fromFixed(FT_MulFix(face->underline_thickness, face->size->metrics.y_scale)); - underline_position = QFixed::fromFixed(-FT_MulFix(face->underline_position, face->size->metrics.y_scale)); + QFixed center_position = QFixed::fromFixed(-FT_MulFix(face->underline_position, face->size->metrics.y_scale)); + underline_position = center_position - line_thickness / 2; } else { // ad hoc algorithm int score = fontDef.weight * fontDef.pixelSize; @@ -903,7 +904,7 @@ int QFontEngineFT::loadFlags(QGlyphSet *set, GlyphFormat format, int flags, static inline bool areMetricsTooLarge(const QFontEngineFT::GlyphInfo &info) { // false if exceeds QFontEngineFT::Glyph metrics - return info.width > 0xFF || info.height > 0xFF; + return info.width > 0xFF || info.height > 0xFF || info.linearAdvance > 0x7FFF; } static inline void transformBoundingBox(int *left, int *top, int *right, int *bottom, FT_Matrix *matrix) @@ -1051,6 +1052,7 @@ QFontEngineFT::Glyph *QFontEngineFT::loadGlyph(QGlyphSet *set, uint glyph, info.height = TRUNC(top - bottom); // If any of the metrics are too large to fit, don't cache them + // Also, avoid integer overflow when linearAdvance is to large to fit in a signed short if (areMetricsTooLarge(info)) return nullptr; @@ -1781,7 +1783,10 @@ glyph_metrics_t QFontEngineFT::boundingBox(glyph_t glyph, const QTransform &matr glyph_metrics_t QFontEngineFT::alphaMapBoundingBox(glyph_t glyph, QFixed subPixelPosition, const QTransform &matrix, QFontEngine::GlyphFormat format) { - Glyph *g = loadGlyphFor(glyph, subPixelPosition, format, matrix, true); + // When rendering glyphs into a cache via the alphaMap* functions, we disable + // outline drawing. To ensure the bounding box matches the rendered glyph, we + // need to do the same here. + Glyph *g = loadGlyphFor(glyph, subPixelPosition, format, matrix, true, true); glyph_metrics_t overall; if (g) { diff --git a/src/platformsupport/fontdatabases/freetype/qfreetypefontdatabase.cpp b/src/platformsupport/fontdatabases/freetype/qfreetypefontdatabase.cpp index 25c10fbd..56dcc616 100644 --- a/src/platformsupport/fontdatabases/freetype/qfreetypefontdatabase.cpp +++ b/src/platformsupport/fontdatabases/freetype/qfreetypefontdatabase.cpp @@ -153,6 +153,7 @@ QStringList QFreeTypeFontDatabase::addTTFile(const QByteArray &fontData, const Q } } + QFont::Stretch stretch = QFont::Unstretched; TT_OS2 *os2 = (TT_OS2 *)FT_Get_Sfnt_Table(face, ft_sfnt_os2); if (os2) { quint32 unicodeRange[4] = { @@ -191,6 +192,36 @@ QStringList QFreeTypeFontDatabase::addTTFile(const QByteArray &fontData, const Q else if (w <= 10) weight = QFont::Black; } + + switch (os2->usWidthClass) { + case 1: + stretch = QFont::UltraCondensed; + break; + case 2: + stretch = QFont::ExtraCondensed; + break; + case 3: + stretch = QFont::Condensed; + break; + case 4: + stretch = QFont::SemiCondensed; + break; + case 5: + stretch = QFont::Unstretched; + break; + case 6: + stretch = QFont::SemiExpanded; + break; + case 7: + stretch = QFont::Expanded; + break; + case 8: + stretch = QFont::ExtraExpanded; + break; + case 9: + stretch = QFont::UltraExpanded; + break; + } } QString family = QString::fromLatin1(face->family_name); @@ -198,7 +229,6 @@ QStringList QFreeTypeFontDatabase::addTTFile(const QByteArray &fontData, const Q fontFile->fileName = QFile::decodeName(file); fontFile->indexValue = index; - QFont::Stretch stretch = QFont::Unstretched; registerFont(family,QString::fromLatin1(face->style_name),QString(),weight,style,stretch,true,true,0,fixedPitch,writingSystems,fontFile); diff --git a/src/platformsupport/fontdatabases/mac/qfontengine_coretext.mm b/src/platformsupport/fontdatabases/mac/qfontengine_coretext.mm index 83870726..87afe67c 100644 --- a/src/platformsupport/fontdatabases/mac/qfontengine_coretext.mm +++ b/src/platformsupport/fontdatabases/mac/qfontengine_coretext.mm @@ -255,13 +255,15 @@ void QCoreTextFontEngine::init() }; QCFType allTraits = CTFontCopyTraits(ctfont); - fontDef.weight = QCoreTextFontEngine::qtWeightFromCFWeight(getTraitValue(allTraits, kCTFontWeightTrait)); int slant = static_cast(getTraitValue(allTraits, kCTFontSlantTrait) * 500 + 500); if (slant > 500 && !(traits & kCTFontItalicTrait)) fontDef.style = QFont::StyleOblique; if (fontDef.weight >= QFont::Bold && !(traits & kCTFontBoldTrait) && !qEnvironmentVariableIsSet("QT_NO_SYNTHESIZED_BOLD")) synthesisFlags |= SynthesizedBold; + else + fontDef.weight = QCoreTextFontEngine::qtWeightFromCFWeight(getTraitValue(allTraits, kCTFontWeightTrait)); + // XXX: we probably don't need to synthesis italic for oblique font if (fontDef.style != QFont::StyleNormal && !(traits & kCTFontItalicTrait) && !qEnvironmentVariableIsSet("QT_NO_SYNTHESIZED_ITALIC")) synthesisFlags |= SynthesizedItalic; diff --git a/src/platformsupport/fontdatabases/windows/qwindowsfontdatabase.cpp b/src/platformsupport/fontdatabases/windows/qwindowsfontdatabase.cpp index c09d7823..09d2d916 100644 --- a/src/platformsupport/fontdatabases/windows/qwindowsfontdatabase.cpp +++ b/src/platformsupport/fontdatabases/windows/qwindowsfontdatabase.cpp @@ -1038,7 +1038,9 @@ static bool addFontToDatabase(QString familyName, const QString foundryName; // No such concept. const bool fixed = !(textmetric->tmPitchAndFamily & TMPF_FIXED_PITCH); const bool ttf = (textmetric->tmPitchAndFamily & TMPF_TRUETYPE); - const bool scalable = textmetric->tmPitchAndFamily & (TMPF_VECTOR|TMPF_TRUETYPE); + const bool unreliableTextMetrics = type == 0; + const bool scalable = (textmetric->tmPitchAndFamily & (TMPF_VECTOR|TMPF_TRUETYPE)) + && !unreliableTextMetrics; const int size = scalable ? SMOOTH_SCALABLE : textmetric->tmHeight; const QFont::Style style = textmetric->tmItalic ? QFont::StyleItalic : QFont::StyleNormal; const bool antialias = false; @@ -1717,6 +1719,7 @@ static const char *other_tryFonts[] = { }; static const char *jp_tryFonts [] = { + "Yu Gothic UI", "MS UI Gothic", "Arial", "Gulim", diff --git a/src/platformsupport/fontdatabases/windows/qwindowsfontenginedirectwrite.cpp b/src/platformsupport/fontdatabases/windows/qwindowsfontenginedirectwrite.cpp index 7cf62022..c2cba014 100644 --- a/src/platformsupport/fontdatabases/windows/qwindowsfontenginedirectwrite.cpp +++ b/src/platformsupport/fontdatabases/windows/qwindowsfontenginedirectwrite.cpp @@ -502,6 +502,7 @@ QT_WARNING_POP void QWindowsFontEngineDirectWrite::addGlyphsToPath(glyph_t *glyphs, QFixedPoint *positions, int nglyphs, QPainterPath *path, QTextItem::RenderFlags flags) { + Q_UNUSED(flags); QVarLengthArray glyphIndices(nglyphs); QVarLengthArray glyphOffsets(nglyphs); QVarLengthArray glyphAdvances(nglyphs); @@ -521,7 +522,7 @@ void QWindowsFontEngineDirectWrite::addGlyphsToPath(glyph_t *glyphs, QFixedPoint glyphOffsets.data(), nglyphs, false, - flags & QTextItem::RightToLeft, + false, &geometrySink ); diff --git a/src/platformsupport/input/evdevkeyboard/qevdevkeyboardhandler.cpp b/src/platformsupport/input/evdevkeyboard/qevdevkeyboardhandler.cpp index de37f5e2..24b2821f 100644 --- a/src/platformsupport/input/evdevkeyboard/qevdevkeyboardhandler.cpp +++ b/src/platformsupport/input/evdevkeyboard/qevdevkeyboardhandler.cpp @@ -138,7 +138,11 @@ std::unique_ptr QEvdevKeyboardHandler::create(const QStri qCDebug(qLcEvdevKey, "Opening keyboard at %ls", qUtf16Printable(device)); - QFdContainer fd(qt_safe_open(device.toLocal8Bit().constData(), O_RDONLY | O_NDELAY, 0)); + QFdContainer fd(qt_safe_open(device.toLocal8Bit().constData(), O_RDWR | O_NDELAY, 0)); + if (fd.get() < 0) { + qCDebug(qLcEvdevKey, "Keyboard device could not be opened as read-write, trying read-only"); + fd.reset(qt_safe_open(device.toLocal8Bit().constData(), O_RDONLY | O_NDELAY, 0)); + } if (fd.get() >= 0) { ::ioctl(fd.get(), EVIOCGRAB, grab); if (repeatDelay > 0 && repeatRate > 0) { diff --git a/src/platformsupport/input/evdevkeyboard/qevdevkeyboardhandler_p.h b/src/platformsupport/input/evdevkeyboard/qevdevkeyboardhandler_p.h index f92a2bf7..24ed1b64 100644 --- a/src/platformsupport/input/evdevkeyboard/qevdevkeyboardhandler_p.h +++ b/src/platformsupport/input/evdevkeyboard/qevdevkeyboardhandler_p.h @@ -143,6 +143,7 @@ public: int release() noexcept { int result = m_fd; m_fd = -1; return result; } void reset() noexcept; + void reset(int fd) { reset(); m_fd = fd; } }; class QEvdevKeyboardHandler : public QObject diff --git a/src/platformsupport/input/evdevtouch/qevdevtouchhandler.cpp b/src/platformsupport/input/evdevtouch/qevdevtouchhandler.cpp index f57e1540..80a911a2 100644 --- a/src/platformsupport/input/evdevtouch/qevdevtouchhandler.cpp +++ b/src/platformsupport/input/evdevtouch/qevdevtouchhandler.cpp @@ -756,7 +756,7 @@ QRect QEvdevTouchScreenData::screenGeometry() const if (m_screen) screen = m_screen; } - return QHighDpi::toNativePixels(screen->geometry(), screen); + return screen ? QHighDpi::toNativePixels(screen->geometry(), screen) : QRect(); } void QEvdevTouchScreenData::reportPoints() diff --git a/src/platformsupport/input/libinput/qlibinputtouch.cpp b/src/platformsupport/input/libinput/qlibinputtouch.cpp index 446218e4..6eb3a8a3 100644 --- a/src/platformsupport/input/libinput/qlibinputtouch.cpp +++ b/src/platformsupport/input/libinput/qlibinputtouch.cpp @@ -82,7 +82,7 @@ QPointF QLibInputTouch::getPos(libinput_event_touch *e) if (m_screen) screen = m_screen; } - const QRect geom = QHighDpi::toNativePixels(screen->geometry(), screen); + const QRect geom = screen ? QHighDpi::toNativePixels(screen->geometry(), screen) : QRect(); const double x = libinput_event_touch_get_x_transformed(e, geom.width()); const double y = libinput_event_touch_get_y_transformed(e, geom.height()); return geom.topLeft() + QPointF(x, y); diff --git a/src/platformsupport/input/xkbcommon/qxkbcommon.cpp b/src/platformsupport/input/xkbcommon/qxkbcommon.cpp index 877c5d84..b713c194 100644 --- a/src/platformsupport/input/xkbcommon/qxkbcommon.cpp +++ b/src/platformsupport/input/xkbcommon/qxkbcommon.cpp @@ -41,7 +41,9 @@ #include +#include #include + #include #include @@ -574,7 +576,9 @@ static int keysymToQtKey_internal(xkb_keysym_t keysym, Qt::KeyboardModifiers mod // e.g CTRL + ۲ (arabic two), is mapped to CTRL + Qt::Key_2. qtKey = Qt::Key_0 + text.unicode()->digitValue(); } else { - qtKey = text.unicode()->toUpper().unicode(); + text = text.toUpper(); + QStringIterator i(text); + qtKey = i.next(0); } } diff --git a/src/platformsupport/linuxaccessibility/application.cpp b/src/platformsupport/linuxaccessibility/application.cpp index 7852e407..ac616d6f 100644 --- a/src/platformsupport/linuxaccessibility/application.cpp +++ b/src/platformsupport/linuxaccessibility/application.cpp @@ -48,6 +48,8 @@ #include "deviceeventcontroller_adaptor.h" #include "atspi/atspi-constants.h" +#include + //#define KEYBOARD_DEBUG QT_BEGIN_NAMESPACE @@ -62,7 +64,7 @@ QT_BEGIN_NAMESPACE */ QSpiApplicationAdaptor::QSpiApplicationAdaptor(const QDBusConnection &connection, QObject *parent) - : QObject(parent), dbusConnection(connection), inCapsLock(false) + : QObject(parent), dbusConnection(connection) { } @@ -143,13 +145,9 @@ bool QSpiApplicationAdaptor::eventFilter(QObject *target, QEvent *event) de.text = QStringLiteral("Escape"); else if (keyEvent->key() == Qt::Key_Space) de.text = QStringLiteral("space"); - else if (keyEvent->key() == Qt::Key_CapsLock) { + else if (keyEvent->key() == Qt::Key_CapsLock) de.text = QStringLiteral("Caps_Lock"); - if (event->type() == QEvent::KeyPress) - inCapsLock = true; - else - inCapsLock = false; - } else if (keyEvent->key() == Qt::Key_NumLock) + else if (keyEvent->key() == Qt::Key_NumLock) de.text = QStringLiteral("Num_Lock"); else if (keyEvent->key() == Qt::Key_Insert) de.text = QStringLiteral("Insert"); @@ -161,9 +159,10 @@ bool QSpiApplicationAdaptor::eventFilter(QObject *target, QEvent *event) de.isText = !de.text.isEmpty(); de.modifiers = 0; - if (!inCapsLock && keyEvent->modifiers() & Qt::ShiftModifier) + if ((keyEvent->modifiers() & Qt::ShiftModifier) && (keyEvent->key() != Qt::Key_Shift)) de.modifiers |= 1 << ATSPI_MODIFIER_SHIFT; - if (inCapsLock && (keyEvent->key() != Qt::Key_CapsLock)) + // TODO rather introduce Qt::CapslockModifier into KeyboardModifier + if (keyEvent->nativeModifiers() & XCB_MOD_MASK_LOCK ) de.modifiers |= 1 << ATSPI_MODIFIER_SHIFTLOCK; if ((keyEvent->modifiers() & Qt::ControlModifier) && (keyEvent->key() != Qt::Key_Control)) de.modifiers |= 1 << ATSPI_MODIFIER_CONTROL; diff --git a/src/platformsupport/linuxaccessibility/application_p.h b/src/platformsupport/linuxaccessibility/application_p.h index 9c053b25..a5bcce48 100644 --- a/src/platformsupport/linuxaccessibility/application_p.h +++ b/src/platformsupport/linuxaccessibility/application_p.h @@ -90,7 +90,6 @@ private: QQueue, QKeyEvent*> > keyEvents; QDBusConnection dbusConnection; - bool inCapsLock; }; QT_END_NAMESPACE diff --git a/src/plugins/platforminputcontexts/compose/qcomposeplatforminputcontext.cpp b/src/plugins/platforminputcontexts/compose/qcomposeplatforminputcontext.cpp index 4e982866..da5235e4 100644 --- a/src/plugins/platforminputcontexts/compose/qcomposeplatforminputcontext.cpp +++ b/src/plugins/platforminputcontexts/compose/qcomposeplatforminputcontext.cpp @@ -71,10 +71,16 @@ void QComposeInputContext::ensureInitialized() } m_initialized = true; - const char *locale = setlocale(LC_CTYPE, ""); - if (!locale) - locale = setlocale(LC_CTYPE, nullptr); - qCDebug(lcXkbCompose) << "detected locale (LC_CTYPE):" << locale; + // Get locale from user env settings, see also + // https://xkbcommon.org/doc/current/group__compose.html#compose-locale + const char *locale = getenv("LC_ALL"); + if (!locale || !*locale) + locale = getenv("LC_CTYPE"); + if (!locale || !*locale) + locale = getenv("LANG"); + if (!locale || !*locale) + locale = "C"; + qCDebug(lcXkbCompose) << "detected locale:" << locale; m_composeTable = xkb_compose_table_new_from_locale(m_XkbContext, locale, XKB_COMPOSE_COMPILE_NO_FLAGS); if (m_composeTable) diff --git a/src/plugins/platforms/android/androidjniinput.cpp b/src/plugins/platforms/android/androidjniinput.cpp index 1a8c8216..05516929 100644 --- a/src/plugins/platforms/android/androidjniinput.cpp +++ b/src/plugins/platforms/android/androidjniinput.cpp @@ -59,7 +59,6 @@ using namespace QtAndroid; namespace QtAndroidInput { static bool m_ignoreMouseEvents = false; - static bool m_softwareKeyboardVisible = false; static QRect m_softwareKeyboardRect; static QList m_touchPoints; @@ -90,8 +89,7 @@ namespace QtAndroidInput width, height, inputHints, - enterKeyType - ); + enterKeyType); #ifdef QT_DEBUG_ANDROID_IM_PROTOCOL qDebug() << "@@@ SHOWSOFTWAREKEYBOARD" << left << top << width << height << inputHints << enterKeyType; #endif @@ -115,7 +113,7 @@ namespace QtAndroidInput bool isSoftwareKeyboardVisible() { - return m_softwareKeyboardVisible; + return QJNIObjectPrivate::callStaticMethod(applicationClass(), "isSoftwareKeyboardVisible"); } QRect softwareKeyboardRect() @@ -516,7 +514,7 @@ namespace QtAndroidInput return Qt::Key_Search; case 0x00000055: // KEYCODE_MEDIA_PLAY_PAUSE - return Qt::Key_MediaPlay; + return Qt::Key_MediaTogglePlayPause; case 0x00000056: // KEYCODE_MEDIA_STOP return Qt::Key_MediaStop; @@ -795,7 +793,6 @@ namespace QtAndroidInput static void keyboardVisibilityChanged(JNIEnv */*env*/, jobject /*thiz*/, jboolean visibility) { - m_softwareKeyboardVisible = visibility; if (!visibility) m_softwareKeyboardRect = QRect(); diff --git a/src/plugins/platforms/android/androidjnimain.cpp b/src/plugins/platforms/android/androidjnimain.cpp index 1ba2ea3b..8c6d9d9b 100644 --- a/src/plugins/platforms/android/androidjnimain.cpp +++ b/src/plugins/platforms/android/androidjnimain.cpp @@ -60,10 +60,11 @@ #include "qandroideventdispatcher.h" #include -#include -#include #include #include +#include +#include +#include #include #include @@ -125,6 +126,8 @@ static const char m_qtTag[] = "Qt"; static const char m_classErrorMsg[] = "Can't find class \"%s\""; static const char m_methodErrorMsg[] = "Can't find method \"%s%s\""; +static QBasicAtomicInt startQtAndroidPluginCalled = Q_BASIC_ATOMIC_INITIALIZER(0); + namespace QtAndroid { QBasicMutex *platformInterfaceMutex() @@ -238,6 +241,11 @@ namespace QtAndroid QJNIObjectPrivate::callStaticMethod(m_applicationClass, "notifyObjectFocus","(I)V", accessibilityObjectId); } + void notifyQtAndroidPluginRunning(bool running) + { + QJNIObjectPrivate::callStaticMethod(m_applicationClass, "notifyQtAndroidPluginRunning","(Z)V", running); + } + jobject createBitmap(QImage img, JNIEnv *env) { if (!m_bitmapClass) @@ -533,7 +541,7 @@ static void waitForServiceSetup(JNIEnv *env, jclass /*clazz*/) QtAndroidPrivate::waitForServiceSetup(); } -static jboolean startQtApplication(JNIEnv */*env*/, jclass /*clazz*/) +static void startQtApplication(JNIEnv */*env*/, jclass /*clazz*/) { { JNIEnv* env = nullptr; @@ -554,6 +562,7 @@ static jboolean startQtApplication(JNIEnv */*env*/, jclass /*clazz*/) for (int i = 0; i < m_applicationParams.size(); i++) params[i] = static_cast(m_applicationParams[i].constData()); + startQtAndroidPluginCalled.fetchAndAddRelease(1); int ret = m_main(m_applicationParams.length(), const_cast(params.data())); if (m_mainLibraryHnd) { @@ -572,7 +581,8 @@ static jboolean startQtApplication(JNIEnv */*env*/, jclass /*clazz*/) sem_destroy(&m_exitSemaphore); // We must call exit() to ensure that all global objects will be destructed - exit(ret); + if (!qEnvironmentVariableIsSet("QT_ANDROID_NO_EXIT_CALL")) + exit(ret); } static void quitQtCoreApplication(JNIEnv *env, jclass /*clazz*/) @@ -600,7 +610,9 @@ static void terminateQt(JNIEnv *env, jclass /*clazz*/) QAndroidEventDispatcherStopper::instance()->goingToStop(false); } - sem_wait(&m_terminateSemaphore); + if (startQtAndroidPluginCalled.loadAcquire()) + sem_wait(&m_terminateSemaphore); + sem_destroy(&m_terminateSemaphore); env->DeleteGlobalRef(m_applicationClass); @@ -643,11 +655,12 @@ static void setDisplayMetrics(JNIEnv */*env*/, jclass /*clazz*/, jint widthPixels, jint heightPixels, jint desktopWidthPixels, jint desktopHeightPixels, jdouble xdpi, jdouble ydpi, - jdouble scaledDensity, jdouble density) + jdouble scaledDensity, jdouble density, bool forceUpdate) { // Android does not give us the correct screen size for immersive mode, but // the surface does have the right size + bool updateDesktopSize = m_desktopWidthPixels != desktopWidthPixels; widthPixels = qMax(widthPixels, desktopWidthPixels); heightPixels = qMax(heightPixels, desktopHeightPixels); @@ -668,7 +681,9 @@ static void setDisplayMetrics(JNIEnv */*env*/, jclass /*clazz*/, m_androidPlatformIntegration->setDisplayMetrics(qRound(double(widthPixels) / xdpi * 25.4), qRound(double(heightPixels) / ydpi * 25.4)); m_androidPlatformIntegration->setScreenSize(widthPixels, heightPixels); - m_androidPlatformIntegration->setDesktopSize(desktopWidthPixels, desktopHeightPixels); + if (updateDesktopSize || forceUpdate) { + m_androidPlatformIntegration->setDesktopSize(desktopWidthPixels, desktopHeightPixels); + } } } @@ -794,7 +809,7 @@ static JNINativeMethod methods[] = { {"quitQtCoreApplication", "()V", (void *)quitQtCoreApplication}, {"terminateQt", "()V", (void *)terminateQt}, {"waitForServiceSetup", "()V", (void *)waitForServiceSetup}, - {"setDisplayMetrics", "(IIIIDDDD)V", (void *)setDisplayMetrics}, + {"setDisplayMetrics", "(IIIIDDDDZ)V", (void *)setDisplayMetrics}, {"setSurface", "(ILjava/lang/Object;II)V", (void *)setSurface}, {"updateWindow", "()V", (void *)updateWindow}, {"updateApplicationState", "(I)V", (void *)updateApplicationState}, diff --git a/src/plugins/platforms/android/androidjnimain.h b/src/plugins/platforms/android/androidjnimain.h index 72b864de..641b2dbd 100644 --- a/src/plugins/platforms/android/androidjnimain.h +++ b/src/plugins/platforms/android/androidjnimain.h @@ -98,6 +98,7 @@ namespace QtAndroid void notifyAccessibilityLocationChange(); void notifyObjectHide(uint accessibilityObjectId); void notifyObjectFocus(uint accessibilityObjectId); + void notifyQtAndroidPluginRunning(bool running); const char *classErrorMsgFmt(); const char *methodErrorMsgFmt(); diff --git a/src/plugins/platforms/android/extract-dummy.cpp b/src/plugins/platforms/android/extract-dummy.cpp index fdce8ec6..8cd317be 100644 --- a/src/plugins/platforms/android/extract-dummy.cpp +++ b/src/plugins/platforms/android/extract-dummy.cpp @@ -44,8 +44,3 @@ extern "C" JNIEXPORT jintArray JNICALL Java_org_qtproject_qt5_android_ExtractSty { return 0; } - -extern "C" JNIEXPORT jintArray JNICALL Java_org_qtproject_qt5_android_ExtractStyle_extractChunkInfo20(JNIEnv *, jobject, jbyteArray) -{ - return 0; -} diff --git a/src/plugins/platforms/android/extract.cpp b/src/plugins/platforms/android/extract.cpp index acffa353..6ce61539 100644 --- a/src/plugins/platforms/android/extract.cpp +++ b/src/plugins/platforms/android/extract.cpp @@ -1,5 +1,6 @@ /**************************************************************************** ** +** Copyright (C) 2021 The Qt Company Ltd. ** Copyright (C) 2014 BogDan Vatra ** Contact: https://www.qt.io/licensing/ ** @@ -123,20 +124,6 @@ extern "C" JNIEXPORT jintArray JNICALL Java_org_qtproject_qt5_android_ExtractSty return result; } -extern "C" JNIEXPORT jintArray JNICALL Java_org_qtproject_qt5_android_ExtractStyle_extractChunkInfo20(JNIEnv * env, jobject obj, jbyteArray chunkObj) -{ - size_t chunkSize = env->GetArrayLength(chunkObj); - void* storage = alloca(chunkSize); - env->GetByteArrayRegion(chunkObj, 0, chunkSize, - reinterpret_cast(storage)); - - if (!env->ExceptionCheck()) - return Java_org_qtproject_qt5_android_ExtractStyle_extractNativeChunkInfo20(env, obj, long(storage)); - else - env->ExceptionClear(); - return 0; -} - static inline void fill9patchOffsets(Res_png_9patch20* patch) { patch->xDivsOffset = sizeof(Res_png_9patch20); patch->yDivsOffset = patch->xDivsOffset + (patch->numXDivs * sizeof(int32_t)); diff --git a/src/plugins/platforms/android/qandroidinputcontext.cpp b/src/plugins/platforms/android/qandroidinputcontext.cpp index 5b8cdcba..3b7f29ec 100644 --- a/src/plugins/platforms/android/qandroidinputcontext.cpp +++ b/src/plugins/platforms/android/qandroidinputcontext.cpp @@ -47,6 +47,7 @@ #include "qandroideventdispatcher.h" #include "androiddeadlockprotector.h" #include "qandroidplatformintegration.h" +#include #include #include #include @@ -94,6 +95,7 @@ private: static QAndroidInputContext *m_androidInputContext = 0; static char const *const QtNativeInputConnectionClassName = "org/qtproject/qt5/android/QtNativeInputConnection"; static char const *const QtExtractedTextClassName = "org/qtproject/qt5/android/QtExtractedText"; +static char const *const QtObjectType = "QDialog"; static jclass m_extractedTextClass = 0; static jmethodID m_classConstructorMethodID = 0; static jfieldID m_partialEndOffsetFieldID = 0; @@ -645,7 +647,7 @@ void QAndroidInputContext::updateSelectionHandles() } auto curRect = im->cursorRectangle(); - QPoint cursorPoint = qGuiApp->focusWindow()->mapToGlobal(QPoint(curRect.x() + (curRect.width() / 2), curRect.y() + curRect.height())); + QPoint cursorPoint(window->mapToGlobal(QPoint(curRect.x() + (curRect.width() / 2), curRect.y() + curRect.height()))); QPoint editMenuPoint(cursorPoint.x(), cursorPoint.y()); m_handleMode &= ShowEditPopup; m_handleMode |= ShowCursor; @@ -665,10 +667,12 @@ void QAndroidInputContext::updateSelectionHandles() if (cpos > anchor) std::swap(leftRect, rightRect); - QPoint leftPoint(leftRect.bottomLeft().toPoint() * pixelDensity); - QPoint righPoint(rightRect.bottomRight().toPoint() * pixelDensity); - QPoint editPoint(leftRect.united(rightRect).topLeft().toPoint() * pixelDensity); - QtAndroidInput::updateHandles(m_handleMode, editPoint, EditContext::AllButtons, leftPoint, righPoint, + QPoint leftPoint(window->mapToGlobal(leftRect.bottomLeft().toPoint())); + QPoint righPoint(window->mapToGlobal(rightRect.bottomRight().toPoint())); + QPoint editPoint(window->mapToGlobal(leftRect.united(rightRect) + .topLeft().toPoint())); + QtAndroidInput::updateHandles(m_handleMode, editPoint * pixelDensity, EditContext::AllButtons, + leftPoint * pixelDensity, righPoint * pixelDensity, query.value(Qt::ImCurrentSelection).toString().isRightToLeft()); m_hideCursorHandleTimer.stop(); } @@ -692,7 +696,17 @@ void QAndroidInputContext::handleLocationChanged(int handleId, int x, int y) double pixelDensity = window ? QHighDpiScaling::factor(window) : QHighDpiScaling::factor(QtAndroid::androidPlatformIntegration()->screen()); - QPointF point(x / pixelDensity, y / pixelDensity); + auto object = m_focusObject->parent(); + int dialogMoveX = 0; + while (object) { + if (QString::compare(object->metaObject()->className(), + QtObjectType, Qt::CaseInsensitive) == 0) { + dialogMoveX += object->property("x").toInt(); + } + object = object->parent(); + }; + + QPointF point((x / pixelDensity) - dialogMoveX, y / pixelDensity); point.setY(point.y() - leftRect.width() / 2); QInputMethodQueryEvent query(Qt::ImCursorPosition | Qt::ImAnchorPosition @@ -1195,13 +1209,21 @@ bool QAndroidInputContext::focusObjectStopComposing() m_composingCursor = -1; - // Moving Qt's cursor to where the preedit cursor used to be - QList attributes; - attributes.append(QInputMethodEvent::Attribute(QInputMethodEvent::Selection, localCursorPos, 0)); - - QInputMethodEvent event(QString(), attributes); - event.setCommitString(m_composingText); - sendInputMethodEvent(&event); + { + // commit the composing test + QList attributes; + QInputMethodEvent event(QString(), attributes); + event.setCommitString(m_composingText); + sendInputMethodEvent(&event); + } + { + // Moving Qt's cursor to where the preedit cursor used to be + QList attributes; + attributes.append( + QInputMethodEvent::Attribute(QInputMethodEvent::Selection, localCursorPos, 0)); + QInputMethodEvent event(QString(), attributes); + sendInputMethodEvent(&event); + } return true; } diff --git a/src/plugins/platforms/android/qandroidplatformfiledialoghelper.cpp b/src/plugins/platforms/android/qandroidplatformfiledialoghelper.cpp index 6bb33723..8a8ecc44 100644 --- a/src/plugins/platforms/android/qandroidplatformfiledialoghelper.cpp +++ b/src/plugins/platforms/android/qandroidplatformfiledialoghelper.cpp @@ -45,6 +45,7 @@ #include #include #include +#include QT_BEGIN_NAMESPACE @@ -118,7 +119,7 @@ void QAndroidPlatformFileDialogHelper::takePersistableUriPermission(const QJNIOb uri.object(), modeFlags); } -void QAndroidPlatformFileDialogHelper::setIntentTitle(const QString &title) +void QAndroidPlatformFileDialogHelper::setInitialFileName(const QString &title) { const QJNIObjectPrivate extraTitle = QJNIObjectPrivate::getStaticObjectField( JniIntentClass, "EXTRA_TITLE", "Ljava/lang/String;"); @@ -147,10 +148,10 @@ QStringList nameFilterExtensions(const QString nameFilters) { QStringList ret; #if QT_CONFIG(regularexpression) - QRegularExpression re("(\\*\\.?\\w*)"); + QRegularExpression re("(\\*\\.[a-z .]+)"); QRegularExpressionMatchIterator i = re.globalMatch(nameFilters); while (i.hasNext()) - ret << i.next().captured(1); + ret << i.next().captured(1).trimmed(); #endif // QT_CONFIG(regularexpression) ret.removeAll("*"); return ret; @@ -159,23 +160,24 @@ QStringList nameFilterExtensions(const QString nameFilters) void QAndroidPlatformFileDialogHelper::setMimeTypes() { QStringList mimeTypes = options()->mimeTypeFilters(); - const QString nameFilter = options()->initiallySelectedNameFilter(); + const QStringList nameFilters = options()->nameFilters(); + const QString nameFilter = nameFilters.isEmpty() ? QString() : nameFilters.first(); - if (mimeTypes.isEmpty() && !nameFilter.isEmpty()) { + if (!nameFilter.isEmpty()) { QMimeDatabase db; for (const QString &filter : nameFilterExtensions(nameFilter)) - mimeTypes.append(db.mimeTypeForFile(filter).name()); + mimeTypes.append(db.mimeTypeForFile(filter, QMimeDatabase::MatchExtension).name()); } - QString type = !mimeTypes.isEmpty() ? mimeTypes.at(0) : QLatin1String("*/*"); + const QString initialType = mimeTypes.size() == 1 ? mimeTypes.at(0) : QLatin1String("*/*"); m_intent.callObjectMethod("setType", "(Ljava/lang/String;)Landroid/content/Intent;", - QJNIObjectPrivate::fromString(type).object()); + QJNIObjectPrivate::fromString(initialType).object()); if (!mimeTypes.isEmpty()) { const QJNIObjectPrivate extraMimeType = QJNIObjectPrivate::getStaticObjectField( JniIntentClass, "EXTRA_MIME_TYPES", "Ljava/lang/String;"); - QJNIObjectPrivate mimeTypesArray = QJNIObjectPrivate::callStaticObjectMethod( + const QJNIObjectPrivate mimeTypesArray = QJNIObjectPrivate::callStaticObjectMethod( "org/qtproject/qt5/android/QtNative", "getStringArray", "(Ljava/lang/String;)[Ljava/lang/String;", @@ -207,6 +209,12 @@ bool QAndroidPlatformFileDialogHelper::show(Qt::WindowFlags windowFlags, Qt::Win if (options()->acceptMode() == QFileDialogOptions::AcceptSave) { m_intent = getFileDialogIntent("ACTION_CREATE_DOCUMENT"); + const QList selectedFiles = options()->initiallySelectedFiles(); + if (selectedFiles.size() > 0) { + // TODO: The initial folder to show at the start should be handled by EXTRA_INITIAL_URI + // Take only the file name. + setInitialFileName(selectedFiles.first().fileName()); + } } else if (options()->acceptMode() == QFileDialogOptions::AcceptOpen) { switch (options()->fileMode()) { case QFileDialogOptions::FileMode::DirectoryOnly: @@ -230,8 +238,6 @@ bool QAndroidPlatformFileDialogHelper::show(Qt::WindowFlags windowFlags, Qt::Win setMimeTypes(); } - setIntentTitle(options()->windowTitle()); - QtAndroidPrivate::registerActivityResultListener(this); m_activity.callMethod("startActivityForResult", "(Landroid/content/Intent;I)V", m_intent.object(), REQUEST_CODE); diff --git a/src/plugins/platforms/android/qandroidplatformfiledialoghelper.h b/src/plugins/platforms/android/qandroidplatformfiledialoghelper.h index 5a7a28a8..1442c845 100644 --- a/src/plugins/platforms/android/qandroidplatformfiledialoghelper.h +++ b/src/plugins/platforms/android/qandroidplatformfiledialoghelper.h @@ -75,7 +75,7 @@ public: private: QJNIObjectPrivate getFileDialogIntent(const QString &intentType); void takePersistableUriPermission(const QJNIObjectPrivate &uri); - void setIntentTitle(const QString &title); + void setInitialFileName(const QString &title); void setOpenableCategory(); void setAllowMultipleSelections(bool allowMultiple); void setMimeTypes(); diff --git a/src/plugins/platforms/android/qandroidplatformintegration.cpp b/src/plugins/platforms/android/qandroidplatformintegration.cpp index aaeb9199..3074dee2 100644 --- a/src/plugins/platforms/android/qandroidplatformintegration.cpp +++ b/src/plugins/platforms/android/qandroidplatformintegration.cpp @@ -90,6 +90,7 @@ Qt::ScreenOrientation QAndroidPlatformIntegration::m_orientation = Qt::PrimaryOr Qt::ScreenOrientation QAndroidPlatformIntegration::m_nativeOrientation = Qt::PrimaryOrientation; bool QAndroidPlatformIntegration::m_showPasswordEnabled = false; +static bool m_running = false; void *QAndroidPlatformNativeInterface::nativeResourceForIntegration(const QByteArray &resource) { @@ -158,6 +159,10 @@ void QAndroidPlatformNativeInterface::customEvent(QEvent *event) api->accessibility()->setActive(QtAndroidAccessibility::isActive()); #endif // QT_NO_ACCESSIBILITY + if (!m_running) { + m_running = true; + QtAndroid::notifyQtAndroidPluginRunning(m_running); + } api->flushPendingUpdates(); } diff --git a/src/plugins/platforms/android/qandroidplatformscreen.cpp b/src/plugins/platforms/android/qandroidplatformscreen.cpp index 80757c21..7e036868 100644 --- a/src/plugins/platforms/android/qandroidplatformscreen.cpp +++ b/src/plugins/platforms/android/qandroidplatformscreen.cpp @@ -303,7 +303,7 @@ int QAndroidPlatformScreen::rasterSurfaces() return m_rasterSurfaces; } -void QAndroidPlatformScreen::doRedraw() +void QAndroidPlatformScreen::doRedraw(QImage* screenGrabImage) { PROFILE_SCOPE; if (!QtAndroid::activity()) @@ -358,15 +358,14 @@ void QAndroidPlatformScreen::doRedraw() } int bpp = 4; - QImage::Format format = QImage::Format_RGBA8888_Premultiplied; if (nativeWindowBuffer.format == WINDOW_FORMAT_RGB_565) { bpp = 2; - format = QImage::Format_RGB16; + m_pixelFormat = QImage::Format_RGB16; } QImage screenImage(reinterpret_cast(nativeWindowBuffer.bits) , nativeWindowBuffer.width, nativeWindowBuffer.height - , nativeWindowBuffer.stride * bpp , format); + , nativeWindowBuffer.stride * bpp , m_pixelFormat); QPainter compositePainter(&screenImage); compositePainter.setCompositionMode(QPainter::CompositionMode_Source); @@ -399,6 +398,31 @@ void QAndroidPlatformScreen::doRedraw() ret = ANativeWindow_unlockAndPost(m_nativeSurface); if (ret >= 0) m_dirtyRect = QRect(); + + if (screenGrabImage) { + if (screenGrabImage->size() != screenImage.size()) { + uchar* bytes = static_cast(malloc(screenImage.height() * screenImage.bytesPerLine())); + *screenGrabImage = QImage(bytes, screenImage.width(), screenImage.height(), + screenImage.bytesPerLine(), m_pixelFormat, + [](void* ptr){ if (ptr) free (ptr);}); + } + memcpy(screenGrabImage->bits(), + screenImage.bits(), + screenImage.bytesPerLine() * screenImage.height()); + } + m_repaintOccurred = true; +} + +QPixmap QAndroidPlatformScreen::doScreenShot(QRect grabRect) +{ + if (!m_repaintOccurred) + return QPixmap::fromImage(m_lastScreenshot.copy(grabRect)); + QRect tmp = m_dirtyRect; + m_dirtyRect = geometry(); + doRedraw(&m_lastScreenshot); + m_dirtyRect = tmp; + m_repaintOccurred = false; + return QPixmap::fromImage(m_lastScreenshot.copy(grabRect)); } static const int androidLogicalDpi = 72; @@ -446,4 +470,44 @@ void QAndroidPlatformScreen::releaseSurface() } } +/*! + This function is called when Qt needs to be able to grab the content of a window. + + Returns the content of the window specified with the WId handle within the boundaries of + QRect(x, y, width, height). +*/ +QPixmap QAndroidPlatformScreen::grabWindow(WId window, int x, int y, int width, int height) const +{ + QRectF screenshotRect(x, y, width, height); + QWindow* wnd = 0; + if (window) + { + const auto windowList = qApp->allWindows(); + for (QWindow *w : windowList) + if (w->winId() == window) { + wnd = w; + break; + } + } + if (wnd) { + const qreal factor = logicalDpi().first / androidLogicalDpi; //HighDPI factor; + QRectF wndRect = wnd->geometry(); + if (wnd->parent()) + wndRect.moveTopLeft(wnd->parent()->mapToGlobal(wndRect.topLeft().toPoint())); + if (!qFuzzyCompare(factor, 1)) + wndRect = QRectF(wndRect.left() * factor, wndRect.top() * factor, + wndRect.width() * factor, wndRect.height() * factor); + + if (!screenshotRect.isEmpty()) { + screenshotRect.moveTopLeft(wndRect.topLeft() + screenshotRect.topLeft()); + screenshotRect = screenshotRect.intersected(wndRect); + } else { + screenshotRect = wndRect; + } + } else { + screenshotRect = screenshotRect.isValid() ? screenshotRect : geometry(); + } + return const_cast(this)->doScreenShot(screenshotRect.toRect()); +} + QT_END_NAMESPACE diff --git a/src/plugins/platforms/android/qandroidplatformscreen.h b/src/plugins/platforms/android/qandroidplatformscreen.h index 5dc158e3..54b3c5b8 100644 --- a/src/plugins/platforms/android/qandroidplatformscreen.h +++ b/src/plugins/platforms/android/qandroidplatformscreen.h @@ -106,12 +106,14 @@ private: QDpi logicalBaseDpi() const override; Qt::ScreenOrientation orientation() const override; Qt::ScreenOrientation nativeOrientation() const override; + QPixmap grabWindow(WId window, int x, int y, int width, int height) const override; void surfaceChanged(JNIEnv *env, jobject surface, int w, int h) override; void releaseSurface(); void applicationStateChanged(Qt::ApplicationState); + QPixmap doScreenShot(QRect grabRect = QRect()); private slots: - void doRedraw(); + void doRedraw(QImage *screenGrabImage = nullptr); private: int m_id = -1; @@ -119,6 +121,10 @@ private: ANativeWindow* m_nativeSurface = nullptr; QWaitCondition m_surfaceWaitCondition; QSize m_size; + + QImage m_lastScreenshot; + QImage::Format m_pixelFormat = QImage::Format_RGBA8888_Premultiplied; + bool m_repaintOccurred = false; }; QT_END_NAMESPACE diff --git a/src/plugins/platforms/cocoa/qcocoaaccessibilityelement.mm b/src/plugins/platforms/cocoa/qcocoaaccessibilityelement.mm index ad40c6b0..e1f664c9 100644 --- a/src/plugins/platforms/cocoa/qcocoaaccessibilityelement.mm +++ b/src/plugins/platforms/cocoa/qcocoaaccessibilityelement.mm @@ -246,7 +246,7 @@ static void convertLineOffset(QAccessibleTextInterface *text, int *line, int *of return iface->text(QAccessible::Name).toNSString(); } -- (BOOL) accessibilityEnabledAttribute { +- (BOOL) isAccessibilityEnabled { QAccessibleInterface *iface = QAccessible::accessibleInterface(axid); if (!iface || !iface->isValid()) return false; diff --git a/src/plugins/platforms/cocoa/qcocoacolordialoghelper.mm b/src/plugins/platforms/cocoa/qcocoacolordialoghelper.mm index 5ad1f9d7..a57a3877 100644 --- a/src/plugins/platforms/cocoa/qcocoacolordialoghelper.mm +++ b/src/plugins/platforms/cocoa/qcocoacolordialoghelper.mm @@ -324,9 +324,9 @@ public: bool show(Qt::WindowModality windowModality, QWindow *parent) { Q_UNUSED(parent); - if (windowModality != Qt::WindowModal) + if (windowModality != Qt::ApplicationModal) [mDelegate showModelessPanel]; - // no need to show a Qt::WindowModal dialog here, because it's necessary to call exec() in that case + // no need to show a Qt::ApplicationModal dialog here, because it will be shown in runApplicationModalPanel return true; } @@ -390,9 +390,8 @@ void QCocoaColorDialogHelper::exec() bool QCocoaColorDialogHelper::show(Qt::WindowFlags, Qt::WindowModality windowModality, QWindow *parent) { - if (windowModality == Qt::WindowModal) - windowModality = Qt::ApplicationModal; - + if (windowModality == Qt::ApplicationModal) + windowModality = Qt::WindowModal; // Workaround for Apple rdar://25792119: If you invoke // -setShowsAlpha: multiple times before showing the color // picker, its height grows irrevocably. Instead, only diff --git a/src/plugins/platforms/cocoa/qcocoafontdialoghelper.mm b/src/plugins/platforms/cocoa/qcocoafontdialoghelper.mm index 7748c304..7b13259d 100644 --- a/src/plugins/platforms/cocoa/qcocoafontdialoghelper.mm +++ b/src/plugins/platforms/cocoa/qcocoafontdialoghelper.mm @@ -314,9 +314,9 @@ public: bool show(Qt::WindowModality windowModality, QWindow *parent) { Q_UNUSED(parent); - if (windowModality != Qt::WindowModal) + if (windowModality != Qt::ApplicationModal) [mDelegate showModelessPanel]; - // no need to show a Qt::WindowModal dialog here, because it's necessary to call exec() in that case + // no need to show a Qt::ApplicationModal dialog here, because it will be shown in runApplicationModalPanel return true; } @@ -380,8 +380,8 @@ void QCocoaFontDialogHelper::exec() bool QCocoaFontDialogHelper::show(Qt::WindowFlags, Qt::WindowModality windowModality, QWindow *parent) { - if (windowModality == Qt::WindowModal) - windowModality = Qt::ApplicationModal; + if (windowModality == Qt::ApplicationModal) + windowModality = Qt::WindowModal; sharedFontPanel()->init(this); return sharedFontPanel()->show(windowModality, parent); } diff --git a/src/plugins/platforms/cocoa/qcocoamenu.mm b/src/plugins/platforms/cocoa/qcocoamenu.mm index 3e2a62a0..68af82b5 100644 --- a/src/plugins/platforms/cocoa/qcocoamenu.mm +++ b/src/plugins/platforms/cocoa/qcocoamenu.mm @@ -290,27 +290,26 @@ void QCocoaMenu::syncSeparatorsCollapsible(bool enable) QMacAutoReleasePool pool; if (enable) { bool previousIsSeparator = true; // setting to true kills all the separators placed at the top. - NSMenuItem *previousItem = nil; + NSMenuItem *lastVisibleItem = nil; for (NSMenuItem *item in m_nativeMenu.itemArray) { if (item.separatorItem) { + // hide item if previous was a separator, or if it's explicitly hidden + bool hideItem = previousIsSeparator; if (auto *cocoaItem = qt_objc_cast(item).platformMenuItem) - cocoaItem->setVisible(!previousIsSeparator); - item.hidden = previousIsSeparator; + hideItem = previousIsSeparator || !cocoaItem->isVisible(); + item.hidden = hideItem; } if (!item.hidden) { - previousItem = item; - previousIsSeparator = previousItem.separatorItem; + lastVisibleItem = item; + previousIsSeparator = lastVisibleItem.separatorItem; } } // We now need to check the final item since we don't want any separators at the end of the list. - if (previousItem && previousIsSeparator) { - if (auto *cocoaItem = qt_objc_cast(previousItem).platformMenuItem) - cocoaItem->setVisible(false); - previousItem.hidden = YES; - } + if (lastVisibleItem && lastVisibleItem.separatorItem) + lastVisibleItem.hidden = YES; } else { for (auto *item : qAsConst(m_menuItems)) { if (!item->isSeparator()) @@ -351,6 +350,17 @@ void QCocoaMenu::showPopup(const QWindow *parentWindow, const QRect &targetRect, NSView *view = cocoaWindow ? cocoaWindow->view() : nil; NSMenuItem *nsItem = item ? ((QCocoaMenuItem *)item)->nsItem() : nil; + // store the window that this popup belongs to so that we can evaluate whether we are modally blocked + bool resetMenuParent = false; + if (!menuParent()) { + setMenuParent(cocoaWindow); + resetMenuParent = true; + } + auto menuParentGuard = qScopeGuard([&]{ + if (resetMenuParent) + setMenuParent(nullptr); + }); + QScreen *screen = nullptr; if (parentWindow) screen = parentWindow->screen(); diff --git a/src/plugins/platforms/cocoa/qcocoamenuitem.h b/src/plugins/platforms/cocoa/qcocoamenuitem.h index 029d29be..e6bbf143 100644 --- a/src/plugins/platforms/cocoa/qcocoamenuitem.h +++ b/src/plugins/platforms/cocoa/qcocoamenuitem.h @@ -117,6 +117,7 @@ public: inline bool isMerged() const { return m_merged; } inline bool isEnabled() const { return m_enabled && m_parentEnabled; } inline bool isSeparator() const { return m_isSeparator; } + inline bool isVisible() const { return m_isVisible; } QCocoaMenu *menu() const { return m_menu; } MenuRole effectiveRole() const; diff --git a/src/plugins/platforms/cocoa/qcocoamenuitem.mm b/src/plugins/platforms/cocoa/qcocoamenuitem.mm index 3b37e7c9..258aee82 100644 --- a/src/plugins/platforms/cocoa/qcocoamenuitem.mm +++ b/src/plugins/platforms/cocoa/qcocoamenuitem.mm @@ -300,8 +300,7 @@ NSMenuItem *QCocoaMenuItem::sync() while (depth < 3 && p && !(menubar = qobject_cast(p))) { ++depth; QCocoaMenuObject *menuObject = dynamic_cast(p); - Q_ASSERT(menuObject); - p = menuObject->menuParent(); + p = menuObject ? menuObject->menuParent() : nullptr; } if (menubar && depth < 3) diff --git a/src/plugins/platforms/cocoa/qcocoascreen.h b/src/plugins/platforms/cocoa/qcocoascreen.h index dcf6f1c7..93dff027 100644 --- a/src/plugins/platforms/cocoa/qcocoascreen.h +++ b/src/plugins/platforms/cocoa/qcocoascreen.h @@ -45,6 +45,7 @@ #include "qcocoacursor.h" #include +#include QT_BEGIN_NAMESPACE @@ -96,8 +97,8 @@ private: static void updateScreens(); static void cleanupScreens(); - static bool updateScreensIfNeeded(); - static NSArray *s_screenConfigurationBeforeUpdate; + static QMacNotificationObserver s_screenParameterObserver; + static CGDisplayReconfigurationCallBack s_displayReconfigurationCallBack; static void add(CGDirectDisplayID displayId); QCocoaScreen(CGDirectDisplayID displayId); diff --git a/src/plugins/platforms/cocoa/qcocoascreen.mm b/src/plugins/platforms/cocoa/qcocoascreen.mm index 6a3172fb..581ea01f 100644 --- a/src/plugins/platforms/cocoa/qcocoascreen.mm +++ b/src/plugins/platforms/cocoa/qcocoascreen.mm @@ -72,91 +72,33 @@ namespace CoreGraphics { Q_ENUM_NS(DisplayChange) } -NSArray *QCocoaScreen::s_screenConfigurationBeforeUpdate = nil; +QMacNotificationObserver QCocoaScreen::s_screenParameterObserver; +CGDisplayReconfigurationCallBack QCocoaScreen::s_displayReconfigurationCallBack = nullptr; void QCocoaScreen::initializeScreens() { updateScreens(); - CGDisplayRegisterReconfigurationCallback([](CGDirectDisplayID displayId, CGDisplayChangeSummaryFlags flags, void *userInfo) { + s_displayReconfigurationCallBack = [](CGDirectDisplayID displayId, CGDisplayChangeSummaryFlags flags, void *userInfo) { Q_UNUSED(userInfo); - // Displays are reconfigured in batches, and we want to update our screens - // once a batch ends, so that all the states of the displays are up to date. - static int displayReconfigurationsInProgress = 0; - const bool beforeReconfigure = flags & kCGDisplayBeginConfigurationFlag; - qCDebug(lcQpaScreen).verbosity(0).nospace() << "Display " << displayId - << (beforeReconfigure ? " about to reconfigure" : " was ") - << QFlags(flags) - << " with " << displayReconfigurationsInProgress - << " display configuration(s) in progress"; + qCDebug(lcQpaScreen).verbosity(0) << "Display" << displayId + << (beforeReconfigure ? "beginning" : "finished") << "reconfigure" + << QFlags(flags); - if (!flags) { - // CGDisplayRegisterReconfigurationCallback has been observed to be called - // with flags unset. This seems like a bug. The callback is not paired with - // a matching "completion" callback either, so we don't know whether to treat - // it as a begin or end of reconfigure. - return; - } + if (!beforeReconfigure) + updateScreens(); + }; + CGDisplayRegisterReconfigurationCallback(s_displayReconfigurationCallBack, nullptr); - if (beforeReconfigure) { - if (!displayReconfigurationsInProgress++) { - // There might have been a screen reconfigure before this that - // we didn't process yet, so do that now if that's the case. - updateScreensIfNeeded(); - - Q_ASSERT(!s_screenConfigurationBeforeUpdate); - s_screenConfigurationBeforeUpdate = NSScreen.screens; - qCDebug(lcQpaScreen, "Display reconfigure transaction started" - " with screen configuration %p", s_screenConfigurationBeforeUpdate); - - static void (^tryScreenUpdate)(); - tryScreenUpdate = ^void () { - qCDebug(lcQpaScreen) << "Attempting screen update from runloop block"; - if (!updateScreensIfNeeded()) - CFRunLoopPerformBlock(CFRunLoopGetMain(), kCFRunLoopCommonModes, tryScreenUpdate); - }; - CFRunLoopPerformBlock(CFRunLoopGetMain(), kCFRunLoopCommonModes, tryScreenUpdate); - } - } else { - Q_ASSERT_X(displayReconfigurationsInProgress, "QCococaScreen", - "Display configuration transactions are expected to be balanced"); - - if (!--displayReconfigurationsInProgress) { - qCDebug(lcQpaScreen) << "Display reconfigure transaction completed"; - // We optimistically update now, in case the NSScreens have changed - updateScreensIfNeeded(); - } - } - }, nullptr); - - static QMacNotificationObserver screenParameterObserver(NSApplication.sharedApplication, + s_screenParameterObserver = QMacNotificationObserver(NSApplication.sharedApplication, NSApplicationDidChangeScreenParametersNotification, [&]() { qCDebug(lcQpaScreen) << "Received screen parameter change notification"; - updateScreensIfNeeded(); // As a last resort we update screens here + updateScreens(); }); } -bool QCocoaScreen::updateScreensIfNeeded() -{ - if (!s_screenConfigurationBeforeUpdate) { - qCDebug(lcQpaScreen) << "QScreens have already been updated, all good"; - return true; - } - - if (s_screenConfigurationBeforeUpdate == NSScreen.screens) { - qCDebug(lcQpaScreen) << "Still waiting for NSScreen configuration change"; - return false; - } - - qCDebug(lcQpaScreen, "NSScreen configuration changed to %p", NSScreen.screens); - updateScreens(); - - s_screenConfigurationBeforeUpdate = nil; - return true; -} - /* Update the list of available QScreens, and the properties of existing screens. @@ -239,6 +181,12 @@ void QCocoaScreen::cleanupScreens() // Remove screens in reverse order to avoid crash in case of multiple screens for (QScreen *screen : backwards(QGuiApplication::screens())) static_cast(screen->handle())->remove(); + + Q_ASSERT(s_displayReconfigurationCallBack); + CGDisplayRemoveReconfigurationCallback(s_displayReconfigurationCallBack, nullptr); + s_displayReconfigurationCallBack = nullptr; + + s_screenParameterObserver.remove(); } void QCocoaScreen::remove() @@ -310,15 +258,18 @@ void QCocoaScreen::update(CGDirectDisplayID displayId) Q_ASSERT(isOnline()); + // Some properties are only available via NSScreen + NSScreen *nsScreen = nativeScreen(); + if (!nsScreen) { + qCDebug(lcQpaScreen) << "Corresponding NSScreen not yet available. Deferring update"; + return; + } + const QRect previousGeometry = m_geometry; const QRect previousAvailableGeometry = m_availableGeometry; const QDpi previousLogicalDpi = m_logicalDpi; const qreal previousRefreshRate = m_refreshRate; - // Some properties are only available via NSScreen - NSScreen *nsScreen = nativeScreen(); - Q_ASSERT(nsScreen); - // The reference screen for the geometry is always the primary screen QRectF primaryScreenGeometry = QRectF::fromCGRect(CGDisplayBounds(CGMainDisplayID())); m_geometry = qt_mac_flip(QRectF::fromCGRect(nsScreen.frame), primaryScreenGeometry).toRect(); @@ -714,13 +665,17 @@ QList QCocoaScreen::virtualSiblings() const QCocoaScreen *QCocoaScreen::get(NSScreen *nsScreen) { - if (s_screenConfigurationBeforeUpdate) { - qCWarning(lcQpaScreen) << "Trying to resolve screen while waiting for screen reconfigure!"; - if (!updateScreensIfNeeded()) - qCWarning(lcQpaScreen) << "Failed to do last minute screen update. Expect crashes."; + auto displayId = nsScreen.qt_displayId; + auto *cocoaScreen = get(displayId); + if (!cocoaScreen) { + qCWarning(lcQpaScreen) << "Failed to map" << nsScreen + << "to QCocoaScreen. Doing last minute update."; + updateScreens(); + cocoaScreen = get(displayId); + if (!cocoaScreen) + qCWarning(lcQpaScreen) << "Last minute update failed!"; } - - return get(nsScreen.qt_displayId); + return cocoaScreen; } QCocoaScreen *QCocoaScreen::get(CGDirectDisplayID displayId) diff --git a/src/plugins/platforms/cocoa/qcocoawindow.h b/src/plugins/platforms/cocoa/qcocoawindow.h index 4688598d..1d0948a0 100644 --- a/src/plugins/platforms/cocoa/qcocoawindow.h +++ b/src/plugins/platforms/cocoa/qcocoawindow.h @@ -56,6 +56,8 @@ #include #endif +#include + QT_BEGIN_NAMESPACE #ifndef QT_NO_DEBUG_STREAM diff --git a/src/plugins/platforms/cocoa/qcocoawindow.mm b/src/plugins/platforms/cocoa/qcocoawindow.mm index ab06bb49..2be08314 100644 --- a/src/plugins/platforms/cocoa/qcocoawindow.mm +++ b/src/plugins/platforms/cocoa/qcocoawindow.mm @@ -367,12 +367,18 @@ void QCocoaWindow::setVisible(bool visible) if (window()->windowState() != Qt::WindowMinimized) { if (parentCocoaWindow && (window()->modality() == Qt::WindowModal || window()->type() == Qt::Sheet)) { // Show the window as a sheet - [parentCocoaWindow->nativeWindow() beginSheet:m_view.window completionHandler:nil]; + NSWindow *nativeParentWindow = parentCocoaWindow->nativeWindow(); + if (!nativeParentWindow.attachedSheet) + [nativeParentWindow beginSheet:m_view.window completionHandler:nil]; + else + [nativeParentWindow beginCriticalSheet:m_view.window completionHandler:nil]; } else if (window()->modality() == Qt::ApplicationModal) { // Show the window as application modal eventDispatcher()->beginModalSession(window()); } else if (m_view.window.canBecomeKeyWindow) { - bool shouldBecomeKeyNow = !NSApp.modalWindow || m_view.window.worksWhenModal; + bool shouldBecomeKeyNow = !NSApp.modalWindow + || m_view.window.worksWhenModal + || !NSApp.modalWindow.visible; // Panels with becomesKeyOnlyIfNeeded set should not activate until a view // with needsPanelToBecomeKey, for example a line edit, is clicked. @@ -522,7 +528,10 @@ NSUInteger QCocoaWindow::windowStyleMask(Qt::WindowFlags flags) NSUInteger styleMask = (frameless || !resizable) ? NSWindowStyleMaskBorderless : NSWindowStyleMaskResizable; if (frameless) { - // No further customizations for frameless since there are no window decorations. + // Frameless windows do not display the traffic lights buttons for + // e.g. minimize, however StyleMaskMiniaturizable is required to allow + // programmatic minimize. + styleMask |= NSWindowStyleMaskMiniaturizable; } else if (flags & Qt::CustomizeWindowHint) { if (flags & Qt::WindowTitleHint) styleMask |= NSWindowStyleMaskTitled; @@ -545,9 +554,11 @@ NSUInteger QCocoaWindow::windowStyleMask(Qt::WindowFlags flags) if (m_drawContentBorderGradient) styleMask |= NSWindowStyleMaskTexturedBackground; - // Don't wipe fullscreen state + // Don't wipe existing states if (m_view.window.styleMask & NSWindowStyleMaskFullScreen) styleMask |= NSWindowStyleMaskFullScreen; + if (m_view.window.styleMask & NSWindowStyleMaskFullSizeContentView) + styleMask |= NSWindowStyleMaskFullSizeContentView; return styleMask; } @@ -1265,11 +1276,15 @@ void QCocoaWindow::windowDidChangeScreen() return; // Note: When a window is resized to 0x0 Cocoa will report the window's screen as nil - auto *currentScreen = QCocoaScreen::get(m_view.window.screen); - auto *previousScreen = static_cast(screen()); + NSScreen *nsScreen = m_view.window.screen; - Q_ASSERT_X(!m_view.window.screen || currentScreen, - "QCocoaWindow", "Failed to get QCocoaScreen for NSScreen"); + qCDebug(lcQpaWindow) << window() << "did change" << nsScreen; + QCocoaScreen::updateScreens(); + + auto *previousScreen = static_cast(screen()); + auto *currentScreen = QCocoaScreen::get(nsScreen); + + qCDebug(lcQpaWindow) << "Screen changed for" << window() << "from" << previousScreen << "to" << currentScreen; // Note: The previous screen may be the same as the current screen, either because // a) the screen was just reconfigured, which still results in AppKit sending an @@ -1282,7 +1297,6 @@ void QCocoaWindow::windowDidChangeScreen() // device-pixel ratio may have changed, and needs to be delivered to all // windows, both top level and child windows. - qCDebug(lcQpaWindow) << "Screen changed for" << window() << "from" << previousScreen << "to" << currentScreen; QWindowSystemInterface::handleWindowScreenChanged( window(), currentScreen ? currentScreen->screen() : nullptr); @@ -1307,10 +1321,19 @@ void QCocoaWindow::windowWillClose() bool QCocoaWindow::windowShouldClose() { qCDebug(lcQpaWindow) << "QCocoaWindow::windowShouldClose" << window(); + // This callback should technically only determine if the window // should (be allowed to) close, but since our QPA API to determine // that also involves actually closing the window we do both at the // same time, instead of doing the latter in windowWillClose. + + // If the window is closed, we will release and deallocate the NSWindow. + // But frames higher up in the stack might still expect the window to + // be alive, since the windowShouldClose: callback is technically only + // supposed to answer YES or NO. To ensure the window is still alive + // we put an autorelease in the closest pool (typically the runloop). + [[m_view.window retain] autorelease]; + return QWindowSystemInterface::handleCloseEvent(window()); } @@ -1714,6 +1737,20 @@ void QCocoaWindow::setWindowCursor(NSCursor *cursor) view.cursor = cursor; [m_view.window invalidateCursorRectsForView:m_view]; + + // There's a bug in AppKit where calling invalidateCursorRectsForView when + // there's an override cursor active (for example when hovering over the + // window frame), will not result in a cursorUpdate: callback. To work around + // this we synthesize a cursor update event and call the callback ourselves, + // if we detect that the mouse is currently over the view. + auto locationInWindow = m_view.window.mouseLocationOutsideOfEventStream; + auto locationInSuperview = [m_view.superview convertPoint:locationInWindow fromView:nil]; + if ([m_view hitTest:locationInSuperview] == m_view) { + [m_view cursorUpdate:[NSEvent enterExitEventWithType:NSEventTypeCursorUpdate + location:locationInWindow modifierFlags:0 timestamp:0 + windowNumber:m_view.window.windowNumber context:nil + eventNumber:0 trackingNumber:0 userData:0]]; + } } void QCocoaWindow::registerTouch(bool enable) @@ -1866,7 +1903,7 @@ bool QCocoaWindow::shouldRefuseKeyWindowAndFirstResponder() // This function speaks up if there's any reason // to refuse key window or first responder state. - if (window()->flags() & Qt::WindowDoesNotAcceptFocus) + if (window()->flags() & (Qt::WindowDoesNotAcceptFocus | Qt::WindowTransparentForInput)) return true; if (m_inSetVisible) { diff --git a/src/plugins/platforms/cocoa/qiosurfacegraphicsbuffer.h b/src/plugins/platforms/cocoa/qiosurfacegraphicsbuffer.h index e070ba97..08969173 100644 --- a/src/plugins/platforms/cocoa/qiosurfacegraphicsbuffer.h +++ b/src/plugins/platforms/cocoa/qiosurfacegraphicsbuffer.h @@ -43,6 +43,8 @@ #include #include +#include + QT_BEGIN_NAMESPACE class QIOSurfaceGraphicsBuffer : public QPlatformGraphicsBuffer diff --git a/src/plugins/platforms/cocoa/qnsview.h b/src/plugins/platforms/cocoa/qnsview.h index 0a18afe3..1aa400af 100644 --- a/src/plugins/platforms/cocoa/qnsview.h +++ b/src/plugins/platforms/cocoa/qnsview.h @@ -61,6 +61,7 @@ QT_NAMESPACE_ALIAS_OBJC_CLASS(QNSView); @interface QNSView (MouseAPI) - (void)handleFrameStrutMouseEvent:(NSEvent *)theEvent; +- (bool)closePopups:(NSEvent *)theEvent; - (void)resetMouseButtons; @end diff --git a/src/plugins/platforms/cocoa/qnsview_dragging.mm b/src/plugins/platforms/cocoa/qnsview_dragging.mm index 978d73f7..a4e4ad2f 100644 --- a/src/plugins/platforms/cocoa/qnsview_dragging.mm +++ b/src/plugins/platforms/cocoa/qnsview_dragging.mm @@ -297,7 +297,9 @@ static QPoint mapWindowCoordinates(QWindow *source, QWindow *target, QPoint poin QCocoaDrag* nativeDrag = QCocoaIntegration::instance()->drag(); Q_ASSERT(nativeDrag); nativeDrag->exitDragLoop(); - nativeDrag->setAcceptedAction(qt_mac_mapNSDragOperation(operation)); + // for internal drag'n'drop, don't override the action the drop event accepted + if (!nativeDrag->currentDrag()) + nativeDrag->setAcceptedAction(qt_mac_mapNSDragOperation(operation)); // Qt starts drag-and-drop on a mouse button press event. Cococa in // this case won't send the matching release event, so we have to diff --git a/src/plugins/platforms/cocoa/qnsview_menus.mm b/src/plugins/platforms/cocoa/qnsview_menus.mm index 7e9654b6..8cfac555 100644 --- a/src/plugins/platforms/cocoa/qnsview_menus.mm +++ b/src/plugins/platforms/cocoa/qnsview_menus.mm @@ -74,17 +74,20 @@ static bool selectorIsCutCopyPaste(SEL selector) return YES; // Check if a modal dialog is active. If so, enable only menu - // items explicitly belonging to this window's own menu bar. + // items explicitly belonging to this window's own menu bar, or to the window. if (QGuiApplication::modalWindow() && QGuiApplication::modalWindow()->isActive()) { QCocoaMenuBar *menubar = nullptr; + QCocoaWindow *menuWindow = nullptr; QObject *menuParent = platformItem->menuParent(); while (menuParent && !(menubar = qobject_cast(menuParent))) { + menuWindow = qobject_cast(menuParent); auto *menuObject = dynamic_cast(menuParent); - menuParent = menuObject->menuParent(); + menuParent = menuObject ? menuObject->menuParent() : nullptr; } - if (!menubar || menubar->cocoaWindow() != self.platformWindow) + if ((!menuWindow || menuWindow->window() != QGuiApplication::modalWindow()) + && (!menubar || menubar->cocoaWindow() != self.platformWindow)) return NO; } diff --git a/src/plugins/platforms/cocoa/qnsview_mouse.mm b/src/plugins/platforms/cocoa/qnsview_mouse.mm index b42f2d0e..ef80a47e 100644 --- a/src/plugins/platforms/cocoa/qnsview_mouse.mm +++ b/src/plugins/platforms/cocoa/qnsview_mouse.mm @@ -103,21 +103,14 @@ if (!m_platformWindow) return; - // get m_buttons in sync - // Don't send frme strut events if we are in the middle of a mouse drag. - if (m_buttons != Qt::NoButton) - return; - switch (theEvent.type) { case NSEventTypeLeftMouseDown: - case NSEventTypeLeftMouseDragged: m_frameStrutButtons |= Qt::LeftButton; break; case NSEventTypeLeftMouseUp: m_frameStrutButtons &= ~Qt::LeftButton; break; case NSEventTypeRightMouseDown: - case NSEventTypeRightMouseDragged: m_frameStrutButtons |= Qt::RightButton; break; case NSEventTypeRightMouseUp: @@ -132,6 +125,22 @@ break; } + // m_buttons can sometimes get out of sync with the button state in AppKit + // E.g if the QNSView where a drag starts is reparented to another window + // while the drag is ongoing, it will not get the corresponding mouseUp + // call. This will result in m_buttons to be stuck on Qt::LeftButton. + // Since we know which buttons was pressed/released directly on the frame + // strut, we can rectify m_buttons here so that we at least don't return early + // from the drag test underneath because of the faulty m_buttons state. + // FIXME: get m_buttons in sync with AppKit/NSEvent all over in QNSView. + m_buttons &= ~m_frameStrutButtons; + + if (m_buttons != Qt::NoButton) { + // Don't send frame strut events if we are in the middle of + // a mouse drag that didn't start on the frame strut. + return; + } + NSWindow *window = [self window]; NSPoint windowPoint = [theEvent locationInWindow]; @@ -176,6 +185,39 @@ QWindowSystemInterface::handleFrameStrutMouseEvent(m_platformWindow->window(), timestamp, qtWindowPoint, qtScreenPoint, m_frameStrutButtons, button, eventType); } + +- (bool)closePopups:(NSEvent *)theEvent +{ + QList *popups = QCocoaIntegration::instance()->popupWindowStack(); + if (!popups->isEmpty()) { + // Check if the click is outside all popups. + bool inside = false; + QPointF qtScreenPoint = QCocoaScreen::mapFromNative([self screenMousePoint:theEvent]); + for (QList::const_iterator it = popups->begin(); it != popups->end(); ++it) { + if ((*it)->geometry().contains(qtScreenPoint.toPoint())) { + inside = true; + break; + } + } + // Close the popups if the click was outside. + if (!inside) { + bool selfClosed = false; + Qt::WindowType type = QCocoaIntegration::instance()->activePopupWindow()->window()->type(); + while (QCocoaWindow *popup = QCocoaIntegration::instance()->popPopupWindow()) { + selfClosed = self == popup->view(); + QWindowSystemInterface::handleCloseEvent(popup->window()); + QWindowSystemInterface::flushWindowSystemEvents(); + if (!m_platformWindow) + return true; // Bail out if window was destroyed + } + // Consume the mouse event when closing the popup, except for tool tips + // were it's expected that the event is processed normally. + if (type != Qt::ToolTip || selfClosed) + return true; + } + } + return false; +} @end @implementation QNSView (Mouse) @@ -381,34 +423,8 @@ // that particular poup type (for example context menus). However, Qt expects // that plain popup QWindows will also be closed, so we implement the logic // here as well. - QList *popups = QCocoaIntegration::instance()->popupWindowStack(); - if (!popups->isEmpty()) { - // Check if the click is outside all popups. - bool inside = false; - QPointF qtScreenPoint = QCocoaScreen::mapFromNative([self screenMousePoint:theEvent]); - for (QList::const_iterator it = popups->begin(); it != popups->end(); ++it) { - if ((*it)->geometry().contains(qtScreenPoint.toPoint())) { - inside = true; - break; - } - } - // Close the popups if the click was outside. - if (!inside) { - bool selfClosed = false; - Qt::WindowType type = QCocoaIntegration::instance()->activePopupWindow()->window()->type(); - while (QCocoaWindow *popup = QCocoaIntegration::instance()->popPopupWindow()) { - selfClosed = self == popup->view(); - QWindowSystemInterface::handleCloseEvent(popup->window()); - QWindowSystemInterface::flushWindowSystemEvents(); - if (!m_platformWindow) - return; // Bail out if window was destroyed - } - // Consume the mouse event when closing the popup, except for tool tips - // were it's expected that the event is processed normally. - if (type != Qt::ToolTip || selfClosed) - return; - } - } + if ([self closePopups:theEvent]) + return; QPointF qtWindowPoint; QPointF qtScreenPoint; @@ -655,11 +671,11 @@ // had time to emit a momentum phase event. if ([NSApp nextEventMatchingMask:NSEventMaskScrollWheel untilDate:[NSDate distantPast] inMode:@"QtMomementumEventSearchMode" dequeue:NO].momentumPhase == NSEventPhaseBegan) { - Q_ASSERT(pixelDelta.isNull() && angleDelta.isNull()); - return; // Ignore this event, as it has a delta of 0,0 + return; // Ignore, even if it has delta + } else { + phase = Qt::ScrollEnd; + m_scrolling = false; } - phase = Qt::ScrollEnd; - m_scrolling = false; } else if (theEvent.momentumPhase == NSEventPhaseBegan) { Q_ASSERT(!pixelDelta.isNull() && !angleDelta.isNull()); phase = Qt::ScrollUpdate; // Send as update, it has a delta diff --git a/src/plugins/platforms/cocoa/qnswindow.mm b/src/plugins/platforms/cocoa/qnswindow.mm index 8967636f..75235a98 100644 --- a/src/plugins/platforms/cocoa/qnswindow.mm +++ b/src/plugins/platforms/cocoa/qnswindow.mm @@ -104,7 +104,7 @@ static bool isMouseEvent(NSEvent *ev) // Unfortunately there's no NSWindowListOrderedBackToFront, // so we have to manually reverse the order using an array. - NSMutableArray *windows = [NSMutableArray new]; + NSMutableArray *windows = [[NSMutableArray new] autorelease]; [application enumerateWindowsWithOptions:NSWindowListOrderedFrontToBack usingBlock:^(NSWindow *window, BOOL *) { // For some reason AppKit will give us nil-windows, skip those @@ -321,8 +321,18 @@ OSStatus CGSClearWindowTags(const CGSConnectionID, const CGSWindowID, int *, int - (NSColor *)backgroundColor { - return self.styleMask == NSWindowStyleMaskBorderless ? - [NSColor clearColor] : [super backgroundColor]; + // FIXME: Plumb to a WA_NoSystemBackground-like window flag, + // or a QWindow::backgroundColor() property. In the meantime + // we assume that if you have translucent content, without a + // frame then you intend to do all background drawing yourself. + const QWindow *window = m_platformWindow ? m_platformWindow->window() : nullptr; + if (!self.opaque && window && window->flags().testFlag(Qt::FramelessWindowHint)) + return [NSColor clearColor]; + + // This still allows you to have translucent content with a frame, + // where the system background (or color set via NSWindow) will + // shine through. + return [super backgroundColor]; } - (void)sendEvent:(NSEvent*)theEvent @@ -347,18 +357,29 @@ OSStatus CGSClearWindowTags(const CGSConnectionID, const CGSWindowID, int *, int return; } + const bool mouseEventInFrameStrut = [theEvent, self]{ + if (isMouseEvent(theEvent)) { + const NSPoint loc = theEvent.locationInWindow; + const NSRect windowFrame = [self convertRectFromScreen:self.frame]; + const NSRect contentFrame = self.contentView.frame; + if (NSMouseInRect(loc, windowFrame, NO) && !NSMouseInRect(loc, contentFrame, NO)) + return true; + } + return false; + }(); + // Any mouse-press in the frame of the window, including the title bar buttons, should + // close open popups. Presses within the window's content are handled to do that in the + // NSView::mouseDown implementation. + if (theEvent.type == NSEventTypeLeftMouseDown && mouseEventInFrameStrut) + [qnsview_cast(m_platformWindow->view()) closePopups:theEvent]; + [super sendEvent:theEvent]; if (!m_platformWindow) return; // Platform window went away while processing event - if (m_platformWindow->frameStrutEventsEnabled() && isMouseEvent(theEvent)) { - NSPoint loc = [theEvent locationInWindow]; - NSRect windowFrame = [self convertRectFromScreen:self.frame]; - NSRect contentFrame = self.contentView.frame; - if (NSMouseInRect(loc, windowFrame, NO) && !NSMouseInRect(loc, contentFrame, NO)) - [qnsview_cast(m_platformWindow->view()) handleFrameStrutMouseEvent:theEvent]; - } + if (m_platformWindow->frameStrutEventsEnabled() && mouseEventInFrameStrut) + [qnsview_cast(m_platformWindow->view()) handleFrameStrutMouseEvent:theEvent]; } - (void)closeAndRelease diff --git a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_egldevice/qeglfskmsegldevice.cpp b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_egldevice/qeglfskmsegldevice.cpp index 81ce7e1d..74975004 100644 --- a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_egldevice/qeglfskmsegldevice.cpp +++ b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_egldevice/qeglfskmsegldevice.cpp @@ -58,7 +58,12 @@ bool QEglFSKmsEglDevice::open() { Q_ASSERT(fd() == -1); - int fd = drmOpen(devicePath().toLocal8Bit().constData(), nullptr); + int fd = -1; + + if (devicePath().compare("drm-nvdc") == 0) + fd = drmOpen(devicePath().toLocal8Bit().constData(), nullptr); + else + fd = qt_safe_open(devicePath().toLocal8Bit().constData(), O_RDWR); if (Q_UNLIKELY(fd < 0)) qFatal("Could not open DRM (NV) device"); diff --git a/src/plugins/platforms/ios/qiosinputcontext.mm b/src/plugins/platforms/ios/qiosinputcontext.mm index d2229df1..985eecdb 100644 --- a/src/plugins/platforms/ios/qiosinputcontext.mm +++ b/src/plugins/platforms/ios/qiosinputcontext.mm @@ -667,7 +667,8 @@ void QIOSInputContext::update(Qt::InputMethodQueries updatedProperties) // focus object. We try to detect code paths that fail this assertion and smooth // over the situation by doing a manual update of the focus object. if (qApp->focusObject() != m_imeState.focusObject && updatedProperties != Qt::ImQueryAll) { - qWarning() << "stale focus object" << m_imeState.focusObject << ", doing manual update"; + qWarning() << "stale focus object" << static_cast(m_imeState.focusObject) + << ", doing manual update"; setFocusObject(qApp->focusObject()); return; } diff --git a/src/plugins/platforms/ios/qiostextresponder.mm b/src/plugins/platforms/ios/qiostextresponder.mm index 19e476a0..a4f033c5 100644 --- a/src/plugins/platforms/ios/qiostextresponder.mm +++ b/src/plugins/platforms/ios/qiostextresponder.mm @@ -227,13 +227,11 @@ self.keyboardType = UIKeyboardTypeEmailAddress; else if (hints & Qt::ImhDigitsOnly) self.keyboardType = UIKeyboardTypeNumberPad; - else if (hints & Qt::ImhFormattedNumbersOnly) - self.keyboardType = UIKeyboardTypeDecimalPad; else if (hints & Qt::ImhDialableCharactersOnly) self.keyboardType = UIKeyboardTypePhonePad; else if (hints & Qt::ImhLatinOnly) self.keyboardType = UIKeyboardTypeASCIICapable; - else if (hints & Qt::ImhPreferNumbers) + else if (hints & (Qt::ImhPreferNumbers | Qt::ImhFormattedNumbersOnly)) self.keyboardType = UIKeyboardTypeNumbersAndPunctuation; else self.keyboardType = UIKeyboardTypeDefault; @@ -516,14 +514,22 @@ // from within a undo callback. NSUndoManager *undoMgr = self.undoManager; [undoMgr removeAllActions]; + + [undoMgr beginUndoGrouping]; + [undoMgr registerUndoWithTarget:self selector:@selector(undo) object:nil]; + [undoMgr endUndoGrouping]; [undoMgr beginUndoGrouping]; [undoMgr registerUndoWithTarget:self selector:@selector(undo) object:nil]; [undoMgr endUndoGrouping]; - // Schedule an operation that we immediately pop off to be able to schedule a redo + // Schedule operations that we immediately pop off to be able to schedule redos [undoMgr beginUndoGrouping]; [undoMgr registerUndoWithTarget:self selector:@selector(registerRedo) object:nil]; [undoMgr endUndoGrouping]; + [undoMgr beginUndoGrouping]; + [undoMgr registerUndoWithTarget:self selector:@selector(registerRedo) object:nil]; + [undoMgr endUndoGrouping]; + [undoMgr undo]; [undoMgr undo]; // Note that, perhaps because of a bug in UIKit, the buttons on the shortcuts bar ends up @@ -532,6 +538,11 @@ // become disabled when there is nothing more to undo (Qt didn't change anything upon receiving // an undo request). This seems to be OK behavior, so we let it stay like that unless it shows // to cause problems. + + // QTBUG-63393: Having two operations on the rebuilt undo stack keeps the undo/redo widgets + // always enabled on the shortcut bar. This workaround was found by experimenting with + // removing the removeAllActions call, and is related to the unknown internal implementation + // details of how the shortcut bar updates the dimming of its buttons. }); } diff --git a/src/plugins/platforms/ios/qiosviewcontroller.mm b/src/plugins/platforms/ios/qiosviewcontroller.mm index cd4af46e..cf832450 100644 --- a/src/plugins/platforms/ios/qiosviewcontroller.mm +++ b/src/plugins/platforms/ios/qiosviewcontroller.mm @@ -145,9 +145,13 @@ UIWindow *uiWindow = self.window; if (uiWindow.screen != [UIScreen mainScreen] && self.subviews.count == 1) { - // Removing the last view of an external screen, go back to mirror mode - uiWindow.screen = [UIScreen mainScreen]; - uiWindow.hidden = YES; + // We're about to remove the last view of an external screen, so go back + // to mirror mode, but defer it until after the view has been removed, + // to ensure that we don't try to layout the view that's being removed. + dispatch_async(dispatch_get_main_queue(), ^{ + uiWindow.hidden = YES; + uiWindow.screen = [UIScreen mainScreen]; + }); } } @@ -246,6 +250,7 @@ @implementation QIOSViewController { BOOL m_updatingProperties; QMetaObject::Connection m_focusWindowChangeConnection; + QMetaObject::Connection m_appStateChangedConnection; } #ifndef Q_OS_TVOS @@ -274,7 +279,7 @@ }); QIOSApplicationState *applicationState = &QIOSIntegration::instance()->applicationState; - QObject::connect(applicationState, &QIOSApplicationState::applicationStateDidChange, + m_appStateChangedConnection = QObject::connect(applicationState, &QIOSApplicationState::applicationStateDidChange, [self](Qt::ApplicationState oldState, Qt::ApplicationState newState) { if (oldState == Qt::ApplicationSuspended && newState != Qt::ApplicationSuspended) { // We may have ignored an earlier layout because the application was suspended, @@ -294,6 +299,7 @@ - (void)dealloc { QObject::disconnect(m_focusWindowChangeConnection); + QObject::disconnect(m_appStateChangedConnection); [super dealloc]; } diff --git a/src/plugins/platforms/ios/qioswindow.mm b/src/plugins/platforms/ios/qioswindow.mm index 1b6a802c..864eef36 100644 --- a/src/plugins/platforms/ios/qioswindow.mm +++ b/src/plugins/platforms/ios/qioswindow.mm @@ -46,6 +46,7 @@ #include "qiosscreen.h" #include "qiosviewcontroller.h" #include "quiview.h" +#include "qiosinputcontext.h" #include #include diff --git a/src/plugins/platforms/ios/quiaccessibilityelement.mm b/src/plugins/platforms/ios/quiaccessibilityelement.mm index 3154536a..4dd1f9f0 100644 --- a/src/plugins/platforms/ios/quiaccessibilityelement.mm +++ b/src/plugins/platforms/ios/quiaccessibilityelement.mm @@ -123,8 +123,7 @@ QT_NAMESPACE_ALIAS_OBJC_CLASS(QMacAccessibilityElement); if (val) { return val->currentValue().toString().toNSString(); } else if (QAccessibleTextInterface *text = iface->textInterface()) { - // FIXME doesn't work? - return text->text(0, text->characterCount() - 1).toNSString(); + return text->text(0, text->characterCount()).toNSString(); } return [super accessibilityHint]; @@ -158,8 +157,16 @@ QT_NAMESPACE_ALIAS_OBJC_CLASS(QMacAccessibilityElement); if (state.searchEdit) traits |= UIAccessibilityTraitSearchField; - if (iface->role() == QAccessible::Button) + const auto accessibleRole = iface->role(); + if (accessibleRole == QAccessible::Button) { traits |= UIAccessibilityTraitButton; + } else if (accessibleRole == QAccessible::EditableText) { + static auto defaultTextFieldTraits = []{ + auto *textField = [[[UITextField alloc] initWithFrame:CGRectZero] autorelease]; + return textField.accessibilityTraits; + }(); + traits |= defaultTextFieldTraits; + } if (iface->valueInterface()) traits |= UIAccessibilityTraitAdjustable; diff --git a/src/plugins/platforms/ios/quiview.mm b/src/plugins/platforms/ios/quiview.mm index a4cdedaf..6ff495ab 100644 --- a/src/plugins/platforms/ios/quiview.mm +++ b/src/plugins/platforms/ios/quiview.mm @@ -45,6 +45,7 @@ #include "qiostextresponder.h" #include "qiosscreen.h" #include "qioswindow.h" +#include "qiosinputcontext.h" #ifndef Q_OS_TVOS #include "qiosmenu.h" #endif @@ -263,7 +264,8 @@ Q_LOGGING_CATEGORY(lcQpaTablet, "qt.qpa.input.tablet") - (BOOL)canBecomeFirstResponder { - return !(self.platformWindow->window()->flags() & Qt::WindowDoesNotAcceptFocus); + return !(self.platformWindow->window()->flags() & (Qt::WindowDoesNotAcceptFocus + | Qt::WindowTransparentForInput)); } - (BOOL)becomeFirstResponder @@ -652,6 +654,18 @@ Q_LOGGING_CATEGORY(lcQpaTablet, "qt.qpa.input.tablet") [super addInteraction:interaction]; } +- (UIEditingInteractionConfiguration)editingInteractionConfiguration +{ + // We only want the three-finger-tap edit menu to be available when there's + // actually something to edit. Otherwise the OS will cause a slight delay + // before delivering the release of three finger touch input. Note that we + // do not do any hit testing here to check that the focus object is the one + // being tapped, as the behavior of native iOS apps is to trigger the menu + // regardless of where the gesture is being made. + return QIOSInputContext::instance()->inputMethodAccepted() ? + UIEditingInteractionConfigurationDefault : UIEditingInteractionConfigurationNone; +} + @end @implementation UIView (QtHelpers) diff --git a/src/plugins/platforms/ios/quiview_accessibility.mm b/src/plugins/platforms/ios/quiview_accessibility.mm index 6612dc13..9a103509 100644 --- a/src/plugins/platforms/ios/quiview_accessibility.mm +++ b/src/plugins/platforms/ios/quiview_accessibility.mm @@ -66,6 +66,11 @@ - (void)initAccessibility { + // The window may have gone away, but with the view + // temporarily caught in the a11y subsystem. + if (!self.platformWindow) + return; + static bool init = false; if (!init) QGuiApplicationPrivate::platformIntegration()->accessibility()->setActive(true); diff --git a/src/plugins/platforms/vnc/qvnc.cpp b/src/plugins/platforms/vnc/qvnc.cpp index d21e50c2..a518cb31 100644 --- a/src/plugins/platforms/vnc/qvnc.cpp +++ b/src/plugins/platforms/vnc/qvnc.cpp @@ -477,6 +477,9 @@ void QRfbRawEncoder::write() // server->screen()->geometry().height()); // } + const QImage screenImage = client->server()->screenImage(); + rgn &= screenImage.rect(); + const auto rectsInRegion = rgn.rectCount(); { @@ -492,8 +495,6 @@ void QRfbRawEncoder::write() if (rectsInRegion <= 0) return; - const QImage screenImage = client->server()->screenImage(); - for (const QRect &tileRect: rgn) { const QRfbRect rect(tileRect.x(), tileRect.y(), tileRect.width(), tileRect.height()); diff --git a/src/plugins/platforms/wasm/qwasmcompositor.cpp b/src/plugins/platforms/wasm/qwasmcompositor.cpp index 0ece8129..103f3201 100644 --- a/src/plugins/platforms/wasm/qwasmcompositor.cpp +++ b/src/plugins/platforms/wasm/qwasmcompositor.cpp @@ -126,7 +126,11 @@ void QWasmCompositor::removeWindow(QWasmWindow *window) m_windowStack.removeAll(window); m_compositedWindows.remove(window); - notifyTopWindowChanged(window); + if (!m_windowStack.isEmpty() && !QGuiApplication::focusWindow()) { + auto lastWindow = m_windowStack.last(); + lastWindow->requestActivateWindow(); + notifyTopWindowChanged(lastWindow); + } } void QWasmCompositor::setVisible(QWasmWindow *window, bool visible) diff --git a/src/plugins/platforms/wasm/qwasmcursor.cpp b/src/plugins/platforms/wasm/qwasmcursor.cpp index 61204517..4b4bb610 100644 --- a/src/plugins/platforms/wasm/qwasmcursor.cpp +++ b/src/plugins/platforms/wasm/qwasmcursor.cpp @@ -41,20 +41,24 @@ using namespace emscripten; void QWasmCursor::changeCursor(QCursor *windowCursor, QWindow *window) { - if (!windowCursor || !window) + if (!window) return; QScreen *screen = window->screen(); if (!screen) return; - // Bitmap and custom cursors are not implemented (will fall back to "auto") - if (windowCursor->shape() == Qt::BitmapCursor || windowCursor->shape() >= Qt::CustomCursor) - qWarning() << "QWasmCursor: bitmap and custom cursors are not supported"; + QByteArray htmlCursorName; + if (windowCursor) { - QByteArray htmlCursorName = cursorShapeToHtml(windowCursor->shape()); + // Bitmap and custom cursors are not implemented (will fall back to "auto") + if (windowCursor->shape() == Qt::BitmapCursor || windowCursor->shape() >= Qt::CustomCursor) + qWarning() << "QWasmCursor: bitmap and custom cursors are not supported"; + + htmlCursorName = cursorShapeToHtml(windowCursor->shape()); + } if (htmlCursorName.isEmpty()) - htmlCursorName = "auto"; + htmlCursorName = "default"; // Set cursor on the canvas val canvas = QWasmScreen::get(screen)->canvas(); diff --git a/src/plugins/platforms/wasm/qwasmeventtranslator.cpp b/src/plugins/platforms/wasm/qwasmeventtranslator.cpp index 41ece2cc..a76b02ce 100644 --- a/src/plugins/platforms/wasm/qwasmeventtranslator.cpp +++ b/src/plugins/platforms/wasm/qwasmeventtranslator.cpp @@ -136,139 +136,11 @@ static constexpr const auto KeyTbl = qMakeArray( Emkb2Qt< Qt::Key_F21, 'F','2','1' >, Emkb2Qt< Qt::Key_F22, 'F','2','2' >, Emkb2Qt< Qt::Key_F23, 'F','2','3' >, - Emkb2Qt< Qt::Key_Space, ' ' >, - Emkb2Qt< Qt::Key_Comma, ',' >, - Emkb2Qt< Qt::Key_Minus, '-' >, - Emkb2Qt< Qt::Key_Period, '.' >, - Emkb2Qt< Qt::Key_Slash, '/' >, - Emkb2Qt< Qt::Key_0, 'D','i','g','i','t','0' >, - Emkb2Qt< Qt::Key_1, 'D','i','g','i','t','1' >, - Emkb2Qt< Qt::Key_2, 'D','i','g','i','t','2' >, - Emkb2Qt< Qt::Key_3, 'D','i','g','i','t','3' >, - Emkb2Qt< Qt::Key_4, 'D','i','g','i','t','4' >, - Emkb2Qt< Qt::Key_5, 'D','i','g','i','t','5' >, - Emkb2Qt< Qt::Key_6, 'D','i','g','i','t','6' >, - Emkb2Qt< Qt::Key_7, 'D','i','g','i','t','7' >, - Emkb2Qt< Qt::Key_8, 'D','i','g','i','t','8' >, - Emkb2Qt< Qt::Key_9, 'D','i','g','i','t','9' >, - Emkb2Qt< Qt::Key_Semicolon, ';' >, - Emkb2Qt< Qt::Key_Equal, '=' >, - Emkb2Qt< Qt::Key_A, 'K','e','y','A' >, - Emkb2Qt< Qt::Key_B, 'K','e','y','B' >, - Emkb2Qt< Qt::Key_C, 'K','e','y','C' >, - Emkb2Qt< Qt::Key_D, 'K','e','y','D' >, - Emkb2Qt< Qt::Key_E, 'K','e','y','E' >, - Emkb2Qt< Qt::Key_F, 'K','e','y','F' >, - Emkb2Qt< Qt::Key_G, 'K','e','y','G' >, - Emkb2Qt< Qt::Key_H, 'K','e','y','H' >, - Emkb2Qt< Qt::Key_I, 'K','e','y','I' >, - Emkb2Qt< Qt::Key_J, 'K','e','y','J' >, - Emkb2Qt< Qt::Key_K, 'K','e','y','K' >, - Emkb2Qt< Qt::Key_L, 'K','e','y','L' >, - Emkb2Qt< Qt::Key_M, 'K','e','y','M' >, - Emkb2Qt< Qt::Key_N, 'K','e','y','N' >, - Emkb2Qt< Qt::Key_O, 'K','e','y','O' >, - Emkb2Qt< Qt::Key_P, 'K','e','y','P' >, - Emkb2Qt< Qt::Key_Q, 'K','e','y','Q' >, - Emkb2Qt< Qt::Key_R, 'K','e','y','R' >, - Emkb2Qt< Qt::Key_S, 'K','e','y','S' >, - Emkb2Qt< Qt::Key_T, 'K','e','y','T' >, - Emkb2Qt< Qt::Key_U, 'K','e','y','U' >, - Emkb2Qt< Qt::Key_V, 'K','e','y','V' >, - Emkb2Qt< Qt::Key_W, 'K','e','y','W' >, - Emkb2Qt< Qt::Key_X, 'K','e','y','X' >, - Emkb2Qt< Qt::Key_Y, 'K','e','y','Y' >, - Emkb2Qt< Qt::Key_Z, 'K','e','y','Z' >, - Emkb2Qt< Qt::Key_BracketLeft, '[' >, - Emkb2Qt< Qt::Key_Backslash, '\\' >, - Emkb2Qt< Qt::Key_BracketRight, ']' >, - Emkb2Qt< Qt::Key_Apostrophe, '\'' >, - Emkb2Qt< Qt::Key_QuoteLeft, 'B','a','c','k','q','u','o','t','e' >, - Emkb2Qt< Qt::Key_multiply, 'N','u','m','p','a','d','M','u','l','t','i','p','l','y' >, - Emkb2Qt< Qt::Key_Minus, 'N','u','m','p','a','d','S','u','b','t','r','a','c','t' >, - Emkb2Qt< Qt::Key_Period, 'N','u','m','p','a','d','D','e','c','i','m','a','l' >, - Emkb2Qt< Qt::Key_Plus, 'N','u','m','p','a','d','A','d','d' >, - Emkb2Qt< Qt::Key_division, 'N','u','m','p','a','d','D','i','v','i','d','e' >, - Emkb2Qt< Qt::Key_Equal, 'N','u','m','p','a','d','E','q','u','a','l' >, - Emkb2Qt< Qt::Key_0, 'N','u','m','p','a','d','0' >, - Emkb2Qt< Qt::Key_1, 'N','u','m','p','a','d','1' >, - Emkb2Qt< Qt::Key_2, 'N','u','m','p','a','d','2' >, - Emkb2Qt< Qt::Key_3, 'N','u','m','p','a','d','3' >, - Emkb2Qt< Qt::Key_4, 'N','u','m','p','a','d','4' >, - Emkb2Qt< Qt::Key_5, 'N','u','m','p','a','d','5' >, - Emkb2Qt< Qt::Key_6, 'N','u','m','p','a','d','6' >, - Emkb2Qt< Qt::Key_7, 'N','u','m','p','a','d','7' >, - Emkb2Qt< Qt::Key_8, 'N','u','m','p','a','d','8' >, - Emkb2Qt< Qt::Key_9, 'N','u','m','p','a','d','9' >, - Emkb2Qt< Qt::Key_Comma, 'N','u','m','p','a','d','C','o','m','m','a' >, - Emkb2Qt< Qt::Key_Enter, 'N','u','m','p','a','d','E','n','t','e','r' >, Emkb2Qt< Qt::Key_Paste, 'P','a','s','t','e' >, Emkb2Qt< Qt::Key_AltGr, 'A','l','t','R','i','g','h','t' >, Emkb2Qt< Qt::Key_Help, 'H','e','l','p' >, - Emkb2Qt< Qt::Key_Equal, '=' >, Emkb2Qt< Qt::Key_yen, 'I','n','t','l','Y','e','n' >, - - Emkb2Qt< Qt::Key_Exclam, '\x21' >, - Emkb2Qt< Qt::Key_QuoteDbl, '\x22' >, - Emkb2Qt< Qt::Key_NumberSign, '\x23' >, - Emkb2Qt< Qt::Key_Dollar, '\x24' >, - Emkb2Qt< Qt::Key_Percent, '\x25' >, - Emkb2Qt< Qt::Key_Ampersand, '\x26' >, - Emkb2Qt< Qt::Key_ParenLeft, '\x28' >, - Emkb2Qt< Qt::Key_ParenRight, '\x29' >, - Emkb2Qt< Qt::Key_Asterisk, '\x2a' >, - Emkb2Qt< Qt::Key_Plus, '\x2b' >, - Emkb2Qt< Qt::Key_Colon, '\x3a' >, - Emkb2Qt< Qt::Key_Semicolon, '\x3b' >, - Emkb2Qt< Qt::Key_Less, '\x3c' >, - Emkb2Qt< Qt::Key_Equal, '\x3d' >, - Emkb2Qt< Qt::Key_Greater, '\x3e' >, - Emkb2Qt< Qt::Key_Question, '\x3f' >, - Emkb2Qt< Qt::Key_At, '\x40' >, - Emkb2Qt< Qt::Key_BracketLeft, '\x5b' >, - Emkb2Qt< Qt::Key_Backslash, '\x5c' >, - Emkb2Qt< Qt::Key_BracketRight, '\x5d' >, - Emkb2Qt< Qt::Key_AsciiCircum, '\x5e' >, - Emkb2Qt< Qt::Key_Underscore, '\x5f' >, - Emkb2Qt< Qt::Key_QuoteLeft, '\x60'>, - Emkb2Qt< Qt::Key_BraceLeft, '\x7b'>, - Emkb2Qt< Qt::Key_Bar, '\x7c'>, - Emkb2Qt< Qt::Key_BraceRight, '\x7d'>, - Emkb2Qt< Qt::Key_AsciiTilde, '\x7e'>, - Emkb2Qt< Qt::Key_Space, '\x20' >, - Emkb2Qt< Qt::Key_Comma, '\x2c' >, - Emkb2Qt< Qt::Key_Minus, '\x2d' >, - Emkb2Qt< Qt::Key_Period, '\x2e' >, - Emkb2Qt< Qt::Key_Slash, '\x2f' >, - Emkb2Qt< Qt::Key_Apostrophe, '\x27' >, - Emkb2Qt< Qt::Key_Menu, 'C','o','n','t','e','x','t','M','e','n','u' >, - - Emkb2Qt< Qt::Key_Agrave, '\xc3','\xa0' >, - Emkb2Qt< Qt::Key_Aacute, '\xc3','\xa1' >, - Emkb2Qt< Qt::Key_Acircumflex, '\xc3','\xa2' >, - Emkb2Qt< Qt::Key_Adiaeresis, '\xc3','\xa4' >, - Emkb2Qt< Qt::Key_AE, '\xc3','\xa6' >, - Emkb2Qt< Qt::Key_Atilde, '\xc3','\xa3' >, - Emkb2Qt< Qt::Key_Aring, '\xc3','\xa5' >, - Emkb2Qt< Qt::Key_Ccedilla, '\xc3','\xa7' >, - Emkb2Qt< Qt::Key_Egrave, '\xc3','\xa8' >, - Emkb2Qt< Qt::Key_Eacute, '\xc3','\xa9' >, - Emkb2Qt< Qt::Key_Ecircumflex, '\xc3','\xaa' >, - Emkb2Qt< Qt::Key_Ediaeresis, '\xc3','\xab' >, - Emkb2Qt< Qt::Key_Icircumflex, '\xc3','\xae' >, - Emkb2Qt< Qt::Key_Idiaeresis, '\xc3','\xaf' >, - Emkb2Qt< Qt::Key_Ocircumflex, '\xc3','\xb4' >, - Emkb2Qt< Qt::Key_Odiaeresis, '\xc3','\xb6' >, - Emkb2Qt< Qt::Key_Ograve, '\xc3','\xb2' >, - Emkb2Qt< Qt::Key_Oacute, '\xc3','\xb3' >, - Emkb2Qt< Qt::Key_Ooblique, '\xc3','\xb8' >, - Emkb2Qt< Qt::Key_Otilde, '\xc3','\xb5' >, - Emkb2Qt< Qt::Key_Ucircumflex, '\xc3','\xbb' >, - Emkb2Qt< Qt::Key_Udiaeresis, '\xc3','\xbc' >, - Emkb2Qt< Qt::Key_Ugrave, '\xc3','\xb9' >, - Emkb2Qt< Qt::Key_Uacute, '\xc3','\xba' >, - Emkb2Qt< Qt::Key_Ntilde, '\xc3','\xb1' >, - Emkb2Qt< Qt::Key_ydiaeresis, '\xc3','\xbf' > + Emkb2Qt< Qt::Key_Menu, 'C','o','n','t','e','x','t','M','e','n','u' > >::Data{} ); @@ -469,10 +341,10 @@ Qt::Key QWasmEventTranslator::translateEmscriptKey(const EmscriptenKeyboardEvent if (it1 != KeyTbl.end() && (qstrcmp(searchKey1.em, it1->em) == 0)) { qtKey = static_cast(it1->qt); } - - } else if (qstrncmp(emscriptKey->code, "Key", 3) == 0 || qstrncmp(emscriptKey->code, "Numpad", 6) == 0 || - qstrncmp(emscriptKey->code, "Digit", 5) == 0) { - emkb2qt_t searchKey{emscriptKey->code, 0}; // search emcsripten code + } + if (qtKey == Qt::Key_unknown) { + emkb2qt_t searchKey{emscriptKey->key, 0}; + // search key auto it1 = std::lower_bound(KeyTbl.cbegin(), KeyTbl.cend(), searchKey); if (it1 != KeyTbl.end() && !(searchKey < *it1)) { qtKey = static_cast(it1->qt); @@ -480,18 +352,10 @@ Qt::Key QWasmEventTranslator::translateEmscriptKey(const EmscriptenKeyboardEvent } if (qtKey == Qt::Key_unknown) { - emkb2qt_t searchKey{emscriptKey->key, 0}; // search unicode key - auto it1 = std::lower_bound(KeyTbl.cbegin(), KeyTbl.cend(), searchKey); - if (it1 != KeyTbl.end() && !(searchKey < *it1)) { - qtKey = static_cast(it1->qt); - } - } - if (qtKey == Qt::Key_unknown) {//try harder with shifted number keys - emkb2qt_t searchKey1{emscriptKey->key, 0}; - for (auto it1 = KeyTbl.cbegin(); it1 != KeyTbl.end(); ++it1) - if (it1 != KeyTbl.end() && (qstrcmp(searchKey1.em, it1->em) == 0)) { - qtKey = static_cast(it1->qt); - } + // cast to unicode key + QString str = QString::fromUtf8(emscriptKey->key); + ushort c = str.unicode()->toUpper().unicode(); // uppercase + qtKey = static_cast(c); } return qtKey; @@ -586,9 +450,6 @@ void QWasmEventTranslator::processMouse(int eventType, const EmscriptenMouseEven if (resizeMode == QWasmWindow::ResizeNone) window2 = screen()->compositor()->windowAt(globalPoint, 5); - if (lastWindow && lastWindow->cursor() != Qt::ArrowCursor) { - lastWindow->setCursor(Qt::ArrowCursor); - } if (window2 == nullptr) { window2 = lastWindow; } else { @@ -817,7 +678,7 @@ int QWasmEventTranslator::handleTouch(int eventType, const EmscriptenTouchEvent quint64 QWasmEventTranslator::getTimestamp() { - return QDeadlineTimer::current().deadlineNSecs() / 1000; + return static_cast(emscripten_performance_now()); } struct KeyMapping { Qt::Key from, to; }; diff --git a/src/plugins/platforms/wasm/qwasmeventtranslator.h b/src/plugins/platforms/wasm/qwasmeventtranslator.h index 93a074a5..c91fee02 100644 --- a/src/plugins/platforms/wasm/qwasmeventtranslator.h +++ b/src/plugins/platforms/wasm/qwasmeventtranslator.h @@ -42,6 +42,7 @@ #endif #include #include +#include QT_BEGIN_NAMESPACE @@ -86,9 +87,9 @@ private: QMap pressedTouchIds; private: - QWindow *draggedWindow; - QWindow *pressedWindow; - QWindow *lastWindow; + QPointer draggedWindow; + QPointer pressedWindow; + QPointer lastWindow; Qt::MouseButtons pressedButtons; QWasmWindow::ResizeMode resizeMode; diff --git a/src/plugins/platforms/wasm/qwasmopenglcontext.cpp b/src/plugins/platforms/wasm/qwasmopenglcontext.cpp index c122335a..895c55c9 100644 --- a/src/plugins/platforms/wasm/qwasmopenglcontext.cpp +++ b/src/plugins/platforms/wasm/qwasmopenglcontext.cpp @@ -38,14 +38,6 @@ QWasmOpenGLContext::QWasmOpenGLContext(const QSurfaceFormat &format) : m_requestedFormat(format) { m_requestedFormat.setRenderableType(QSurfaceFormat::OpenGLES); - - // if we set one, we need to set the other as well since in webgl, these are tied together - if (format.depthBufferSize() < 0 && format.stencilBufferSize() > 0) - m_requestedFormat.setDepthBufferSize(16); - - if (format.stencilBufferSize() < 0 && format.depthBufferSize() > 0) - m_requestedFormat.setStencilBufferSize(8); - } QWasmOpenGLContext::~QWasmOpenGLContext() @@ -105,14 +97,10 @@ EMSCRIPTEN_WEBGL_CONTEXT_HANDLE QWasmOpenGLContext::createEmscriptenContext(cons attributes.majorVersion = format.majorVersion() - 1; attributes.minorVersion = format.minorVersion(); - // WebGL doesn't allow separate attach buffers to STENCIL_ATTACHMENT and DEPTH_ATTACHMENT - // we need both or none - bool useDepthStencil = (format.depthBufferSize() > 0 || format.stencilBufferSize() > 0); - // WebGL offers enable/disable control but not size control for these attributes.alpha = format.alphaBufferSize() > 0; - attributes.depth = useDepthStencil; - attributes.stencil = useDepthStencil; + attributes.depth = format.depthBufferSize() > 0; + attributes.stencil = format.stencilBufferSize() > 0; QByteArray convasSelector = "#" + canvasId.toUtf8(); EMSCRIPTEN_WEBGL_CONTEXT_HANDLE context = emscripten_webgl_create_context(convasSelector.constData(), &attributes); diff --git a/src/plugins/platforms/wasm/qwasmscreen.cpp b/src/plugins/platforms/wasm/qwasmscreen.cpp index 0f9e9a50..099ab546 100644 --- a/src/plugins/platforms/wasm/qwasmscreen.cpp +++ b/src/plugins/platforms/wasm/qwasmscreen.cpp @@ -57,7 +57,6 @@ QWasmScreen::QWasmScreen(const emscripten::val &canvas) { m_compositor = new QWasmCompositor(this); m_eventTranslator = new QWasmEventTranslator(this); - installCanvasResizeObserver(); updateQScreenAndCanvasRenderSize(); m_canvas.call("focus"); } @@ -210,8 +209,8 @@ void QWasmScreen::updateQScreenAndCanvasRenderSize() m_canvas.set("height", canvasSize.height()); QPoint offset; - offset.setX(m_canvas["offsetTop"].as()); - offset.setY(m_canvas["offsetLeft"].as()); + offset.setX(m_canvas["offsetLeft"].as()); + offset.setY(m_canvas["offsetTop"].as()); emscripten::val rect = m_canvas.call("getBoundingClientRect"); QPoint position(rect["left"].as() - offset.x(), rect["top"].as() - offset.y()); diff --git a/src/plugins/platforms/wasm/qwasmwindow.cpp b/src/plugins/platforms/wasm/qwasmwindow.cpp index f95335f8..7c724111 100644 --- a/src/plugins/platforms/wasm/qwasmwindow.cpp +++ b/src/plugins/platforms/wasm/qwasmwindow.cpp @@ -171,7 +171,12 @@ WId QWasmWindow::winId() const void QWasmWindow::propagateSizeHints() { -// get rid of base class warning + QRect rect = windowGeometry(); + if (rect.size().width() < windowMinimumSize().width() + && rect.size().height() < windowMinimumSize().height()) { + rect.setSize(windowMinimumSize()); + setGeometry(rect); + } } void QWasmWindow::injectMousePressed(const QPoint &local, const QPoint &global, @@ -408,4 +413,11 @@ bool QWasmWindow::hasTitleBar() const && !window()->flags().testFlag(Qt::Popup); } +void QWasmWindow::requestActivateWindow() +{ + if (window()->isTopLevel()) + raise(); + QPlatformWindow::requestActivateWindow(); +} + QT_END_NAMESPACE diff --git a/src/plugins/platforms/wasm/qwasmwindow.h b/src/plugins/platforms/wasm/qwasmwindow.h index a0981726..2a3eaed8 100644 --- a/src/plugins/platforms/wasm/qwasmwindow.h +++ b/src/plugins/platforms/wasm/qwasmwindow.h @@ -74,6 +74,7 @@ public: QRect normalGeometry() const override; qreal devicePixelRatio() const override; void requestUpdate() override; + void requestActivateWindow() override; QWasmScreen *platformScreen() const; void setBackingStore(QWasmBackingStore *store) { m_backingStore = store; } diff --git a/src/plugins/platforms/windows/qwindowscontext.cpp b/src/plugins/platforms/windows/qwindowscontext.cpp index fa757b0e..58d29884 100644 --- a/src/plugins/platforms/windows/qwindowscontext.cpp +++ b/src/plugins/platforms/windows/qwindowscontext.cpp @@ -252,14 +252,12 @@ QWindowsContext *QWindowsContext::m_instance = nullptr; \internal */ -typedef QHash HandleBaseWindowHash; - struct QWindowsContextPrivate { QWindowsContextPrivate(); unsigned m_systemInfo = 0; QSet m_registeredWindowClassNames; - HandleBaseWindowHash m_windows; + QWindowsContext::HandleBaseWindowHash m_windows; HDC m_displayContext = nullptr; int m_defaultDPI = 96; QWindowsKeyMapper m_keyMapper; @@ -513,6 +511,11 @@ QList QWindowsContext::possibleKeys(const QKeyEvent *e) const return d->m_keyMapper.possibleKeys(e); } +QWindowsContext::HandleBaseWindowHash &QWindowsContext::windows() +{ + return d->m_windows; +} + QSharedPointer QWindowsContext::setWindowCreationContext(const QSharedPointer &ctx) { const QSharedPointer old = d->m_creationContext; diff --git a/src/plugins/platforms/windows/qwindowscontext.h b/src/plugins/platforms/windows/qwindowscontext.h index c89b8b91..8eca31e8 100644 --- a/src/plugins/platforms/windows/qwindowscontext.h +++ b/src/plugins/platforms/windows/qwindowscontext.h @@ -157,6 +157,7 @@ class QWindowsContext { Q_DISABLE_COPY_MOVE(QWindowsContext) public: + using HandleBaseWindowHash = QHash; enum SystemInfoFlags { @@ -236,6 +237,8 @@ public: bool useRTLExtensions() const; QList possibleKeys(const QKeyEvent *e) const; + HandleBaseWindowHash &windows(); + static bool isSessionLocked(); QWindowsMimeConverter &mimeConverter() const; diff --git a/src/plugins/platforms/windows/qwindowscursor.cpp b/src/plugins/platforms/windows/qwindowscursor.cpp index 338bb9ff..be0f2bad 100644 --- a/src/plugins/platforms/windows/qwindowscursor.cpp +++ b/src/plugins/platforms/windows/qwindowscursor.cpp @@ -652,6 +652,11 @@ void QWindowsCursor::clearOverrideCursor() SetCursor(m_overriddenCursor); m_overriddenCursor = m_overrideCursor = nullptr; } + auto &windows = QWindowsContext::instance()->windows(); + for (auto it = windows.cbegin(), end = windows.cend(); it != end; ++it) { + if (it.value()->screen() == m_screen) + it.value()->setFlag(QWindowsWindow::RestoreOverrideCursor); + } } QPoint QWindowsCursor::mousePosition() diff --git a/src/plugins/platforms/windows/qwindowsmousehandler.cpp b/src/plugins/platforms/windows/qwindowsmousehandler.cpp index 09a99ffd..e82b2a51 100644 --- a/src/plugins/platforms/windows/qwindowsmousehandler.cpp +++ b/src/plugins/platforms/windows/qwindowsmousehandler.cpp @@ -280,8 +280,13 @@ bool QWindowsMouseHandler::translateMouseEvent(QWindow *window, HWND hwnd, globalPosition = winEventPosition; clientPosition = QWindowsGeometryHint::mapFromGlobal(hwnd, globalPosition); } else { - clientPosition = winEventPosition; globalPosition = QWindowsGeometryHint::mapToGlobal(hwnd, winEventPosition); + auto targetHwnd = hwnd; + if (auto *pw = window->handle()) + targetHwnd = HWND(pw->winId()); + clientPosition = targetHwnd == hwnd + ? winEventPosition + : QWindowsGeometryHint::mapFromGlobal(targetHwnd, globalPosition); } // Windows sends a mouse move with no buttons pressed to signal "Enter" @@ -494,7 +499,7 @@ bool QWindowsMouseHandler::translateMouseEvent(QWindow *window, HWND hwnd, } if (!discardEvent && mouseEvent.type != QEvent::None) { - QWindowSystemInterface::handleMouseEvent(window, winEventPosition, globalPosition, buttons, + QWindowSystemInterface::handleMouseEvent(window,clientPosition, globalPosition, buttons, mouseEvent.button, mouseEvent.type, keyModifiers, source); } diff --git a/src/plugins/platforms/windows/qwindowspointerhandler.cpp b/src/plugins/platforms/windows/qwindowspointerhandler.cpp index 85cf310b..c1a2c363 100644 --- a/src/plugins/platforms/windows/qwindowspointerhandler.cpp +++ b/src/plugins/platforms/windows/qwindowspointerhandler.cpp @@ -447,6 +447,8 @@ bool QWindowsPointerHandler::translateTouchEvent(QWindow *window, HWND hwnd, { Q_UNUSED(hwnd); + auto *touchInfo = static_cast(vTouchInfo); + if (et & QtWindows::NonClientEventFlag) return false; // Let DefWindowProc() handle Non Client messages. @@ -456,10 +458,19 @@ bool QWindowsPointerHandler::translateTouchEvent(QWindow *window, HWND hwnd, if (msg.message == WM_POINTERCAPTURECHANGED) { QWindowSystemInterface::handleTouchCancelEvent(window, m_touchDevice, QWindowsKeyMapper::queryKeyboardModifiers()); - m_lastTouchPositions.clear(); + m_lastTouchPoints.clear(); return true; } + if (msg.message == WM_POINTERLEAVE) { + for (quint32 i = 0; i < count; ++i) { + const quint32 pointerId = touchInfo[i].pointerInfo.pointerId; + int id = m_touchInputIDToTouchPointID.value(pointerId, -1); + if (id != -1) + m_lastTouchPoints.remove(id); + } + } + // Only handle down/up/update, ignore others like WM_POINTERENTER, WM_POINTERLEAVE, etc. if (msg.message > WM_POINTERUP) return false; @@ -470,8 +481,6 @@ bool QWindowsPointerHandler::translateTouchEvent(QWindow *window, HWND hwnd, if (!screen) return false; - auto *touchInfo = static_cast(vTouchInfo); - const QRect screenGeometry = screen->geometry(); QList touchPoints; @@ -483,6 +492,7 @@ bool QWindowsPointerHandler::translateTouchEvent(QWindow *window, HWND hwnd, << " count=" << Qt::dec << count; Qt::TouchPointStates allStates; + QSet inputIds; for (quint32 i = 0; i < count; ++i) { if (QWindowsContext::verbose > 1) @@ -495,14 +505,17 @@ bool QWindowsPointerHandler::translateTouchEvent(QWindow *window, HWND hwnd, const quint32 pointerId = touchInfo[i].pointerInfo.pointerId; int id = m_touchInputIDToTouchPointID.value(pointerId, -1); if (id == -1) { + // Start tracking after fingers touch the screen. Ignore bogus updates after touch is released. + if ((touchInfo[i].pointerInfo.pointerFlags & POINTER_FLAG_DOWN) == 0) + continue; id = m_touchInputIDToTouchPointID.size(); m_touchInputIDToTouchPointID.insert(pointerId, id); } touchPoint.id = id; touchPoint.pressure = (touchInfo[i].touchMask & TOUCH_MASK_PRESSURE) ? touchInfo[i].pressure / 1024.0 : 1.0; - if (m_lastTouchPositions.contains(touchPoint.id)) - touchPoint.normalPosition = m_lastTouchPositions.value(touchPoint.id); + if (m_lastTouchPoints.contains(touchPoint.id)) + touchPoint.normalPosition = m_lastTouchPoints.value(touchPoint.id).normalPosition; const QPointF screenPos = QPointF(touchInfo[i].pointerInfo.ptPixelLocation.x, touchInfo[i].pointerInfo.ptPixelLocation.y); @@ -518,22 +531,36 @@ bool QWindowsPointerHandler::translateTouchEvent(QWindow *window, HWND hwnd, if (touchInfo[i].pointerInfo.pointerFlags & POINTER_FLAG_DOWN) { touchPoint.state = Qt::TouchPointPressed; - m_lastTouchPositions.insert(touchPoint.id, touchPoint.normalPosition); + m_lastTouchPoints.insert(touchPoint.id, touchPoint); } else if (touchInfo[i].pointerInfo.pointerFlags & POINTER_FLAG_UP) { touchPoint.state = Qt::TouchPointReleased; - m_lastTouchPositions.remove(touchPoint.id); + m_lastTouchPoints.remove(touchPoint.id); } else { touchPoint.state = stationaryTouchPoint ? Qt::TouchPointStationary : Qt::TouchPointMoved; - m_lastTouchPositions.insert(touchPoint.id, touchPoint.normalPosition); + m_lastTouchPoints.insert(touchPoint.id, touchPoint); } allStates |= touchPoint.state; touchPoints.append(touchPoint); + inputIds.insert(touchPoint.id); // Avoid getting repeated messages for this frame if there are multiple pointerIds QWindowsContext::user32dll.skipPointerFrameMessages(touchInfo[i].pointerInfo.pointerId); } + // Some devices send touches for each finger in a different message/frame, instead of consolidating + // them in the same frame as we were expecting. We account for missing unreleased touches here. + for (auto tp : qAsConst(m_lastTouchPoints)) { + if (!inputIds.contains(tp.id)) { + tp.state = Qt::TouchPointStationary; + allStates |= tp.state; + touchPoints.append(tp); + } + } + + if (touchPoints.count() == 0) + return false; + // all touch points released, forget the ids we've seen. if (allStates == Qt::TouchPointReleased) m_touchInputIDToTouchPointID.clear(); @@ -712,8 +739,13 @@ bool QWindowsPointerHandler::translateMouseEvent(QWindow *window, globalPos = eventPos; localPos = QWindowsGeometryHint::mapFromGlobal(hwnd, eventPos); } else { - localPos = eventPos; globalPos = QWindowsGeometryHint::mapToGlobal(hwnd, eventPos); + auto targetHwnd = hwnd; + if (auto *pw = window->handle()) + targetHwnd = HWND(pw->winId()); + localPos = targetHwnd == hwnd + ? eventPos + : QWindowsGeometryHint::mapFromGlobal(targetHwnd, globalPos); } const Qt::KeyboardModifiers keyModifiers = QWindowsKeyMapper::queryKeyboardModifiers(); diff --git a/src/plugins/platforms/windows/qwindowspointerhandler.h b/src/plugins/platforms/windows/qwindowspointerhandler.h index 8874db27..73fd418c 100644 --- a/src/plugins/platforms/windows/qwindowspointerhandler.h +++ b/src/plugins/platforms/windows/qwindowspointerhandler.h @@ -47,6 +47,7 @@ #include #include #include +#include QT_BEGIN_NAMESPACE @@ -74,7 +75,7 @@ private: void handleEnterLeave(QWindow *window, QWindow *currentWindowUnderPointer, QPoint globalPos); QTouchDevice *m_touchDevice = nullptr; - QHash m_lastTouchPositions; + QHash m_lastTouchPoints; QHash m_touchInputIDToTouchPointID; QPointer m_windowUnderPointer; QPointer m_currentWindow; diff --git a/src/plugins/platforms/windows/qwindowswindow.cpp b/src/plugins/platforms/windows/qwindowswindow.cpp index d2c22f41..3f7f9258 100644 --- a/src/plugins/platforms/windows/qwindowswindow.cpp +++ b/src/plugins/platforms/windows/qwindowswindow.cpp @@ -2156,6 +2156,7 @@ QWindowsWindowData QWindowsWindow::setWindowFlags_sys(Qt::WindowFlags wt, QWindowsWindowData result = m_data; result.flags = creationData.flags; result.embedded = creationData.embedded; + result.hasFrame = (creationData.style & (WS_DLGFRAME | WS_THICKFRAME)); return result; } @@ -2819,7 +2820,14 @@ void QWindowsWindow::applyCursor() void QWindowsWindow::setCursor(const CursorHandlePtr &c) { #ifndef QT_NO_CURSOR - if (c->handle() != m_cursor->handle()) { + bool changed = c->handle() != m_cursor->handle(); + // QTBUG-98856: Cursors can get out of sync after restoring override + // cursors on native windows. Force an update. + if (testFlag(RestoreOverrideCursor)) { + clearFlag(RestoreOverrideCursor); + changed = true; + } + if (changed) { const bool apply = applyNewCursor(window()); qCDebug(lcQpaWindows) << window() << __FUNCTION__ << c->handle() << " doApply=" << apply; diff --git a/src/plugins/platforms/windows/qwindowswindow.h b/src/plugins/platforms/windows/qwindowswindow.h index 6cd3cd97..ac207aa4 100644 --- a/src/plugins/platforms/windows/qwindowswindow.h +++ b/src/plugins/platforms/windows/qwindowswindow.h @@ -225,7 +225,8 @@ public: WithinDpiChanged = 0x400000, VulkanSurface = 0x800000, ResizeMoveActive = 0x1000000, - DisableNonClientScaling = 0x2000000 + DisableNonClientScaling = 0x2000000, + RestoreOverrideCursor = 0x4000000 }; QWindowsWindow(QWindow *window, const QWindowsWindowData &data); diff --git a/src/plugins/platforms/windows/uiautomation/qwindowsuiamainprovider.cpp b/src/plugins/platforms/windows/uiautomation/qwindowsuiamainprovider.cpp index 9808d548..3bb0d08d 100644 --- a/src/plugins/platforms/windows/uiautomation/qwindowsuiamainprovider.cpp +++ b/src/plugins/platforms/windows/uiautomation/qwindowsuiamainprovider.cpp @@ -107,6 +107,17 @@ QWindowsUiaMainProvider::~QWindowsUiaMainProvider() void QWindowsUiaMainProvider::notifyFocusChange(QAccessibleEvent *event) { if (QAccessibleInterface *accessible = event->accessibleInterface()) { + // If this is a table/tree/list, raise event for the focused cell/item instead. + if (accessible->tableInterface()) { + int count = accessible->childCount(); + for (int i = 0; i < count; ++i) { + QAccessibleInterface *item = accessible->child(i); + if (item && item->isValid() && item->state().focused) { + accessible = item; + break; + } + } + } if (QWindowsUiaMainProvider *provider = providerForAccessible(accessible)) { QWindowsUiaWrapper::instance()->raiseAutomationEvent(provider, UIA_AutomationFocusChangedEventId); } @@ -513,7 +524,7 @@ QString QWindowsUiaMainProvider::automationIdForAccessible(const QAccessibleInte while (obj) { QString name = obj->objectName(); if (name.isEmpty()) - return QString(); + return result; if (!result.isEmpty()) result.prepend(u'.'); result.prepend(name); diff --git a/src/plugins/platforms/windows/uiautomation/qwindowsuiautils.cpp b/src/plugins/platforms/windows/uiautomation/qwindowsuiautils.cpp index 682b8c19..12bdc9e6 100644 --- a/src/plugins/platforms/windows/uiautomation/qwindowsuiautils.cpp +++ b/src/plugins/platforms/windows/uiautomation/qwindowsuiautils.cpp @@ -132,22 +132,19 @@ void setVariantString(const QString &value, VARIANT *variant) void rectToNativeUiaRect(const QRect &rect, const QWindow *w, UiaRect *uiaRect) { if (w && uiaRect) { - const qreal factor = QHighDpiScaling::factor(w); - uiaRect->left = qreal(rect.x()) * factor; - uiaRect->top = qreal(rect.y()) * factor; - uiaRect->width = qreal(rect.width()) * factor; - uiaRect->height = qreal(rect.height()) * factor; + QRectF r = QHighDpi::toNativePixels(QRectF(rect), w); + uiaRect->left =r.x(); + uiaRect->top = r.y(); + uiaRect->width = r.width(); + uiaRect->height = r.height(); } } // Scales a point from native coordinates, according to high dpi settings. void nativeUiaPointToPoint(const UiaPoint &uiaPoint, const QWindow *w, QPoint *point) { - if (w && point) { - const qreal factor = QHighDpiScaling::factor(w); - point->setX(int(std::lround(uiaPoint.x / factor))); - point->setY(int(std::lround(uiaPoint.y / factor))); - } + if (w && point) + *point = QHighDpi::fromNativePixels(QPoint(uiaPoint.x, uiaPoint.y), w); } // Maps an accessibility role ID to an UI Automation control type ID. diff --git a/src/plugins/platforms/xcb/qxcbclipboard.cpp b/src/plugins/platforms/xcb/qxcbclipboard.cpp index dabdfcb6..b9ae5879 100644 --- a/src/plugins/platforms/xcb/qxcbclipboard.cpp +++ b/src/plugins/platforms/xcb/qxcbclipboard.cpp @@ -71,7 +71,7 @@ public: break; default: - qWarning("QXcbClipboardMime: Internal error: Unsupported clipboard mode"); + qCWarning(lcQpaClipboard, "QXcbClipboardMime: Internal error: Unsupported clipboard mode"); break; } } @@ -265,7 +265,7 @@ QXcbClipboard::~QXcbClipboard() if (auto event = waitForClipboardEvent(m_owner, XCB_SELECTION_NOTIFY, true)) { free(event); } else { - qWarning("QXcbClipboard: Unable to receive an event from the " + qCWarning(lcQpaClipboard, "QXcbClipboard: Unable to receive an event from the " "clipboard manager in a reasonable time"); } } @@ -371,7 +371,7 @@ void QXcbClipboard::setMimeData(QMimeData *data, QClipboard::Mode mode) xcb_set_selection_owner(xcb_connection(), newOwner, modeAtom, connection()->time()); if (getSelectionOwner(modeAtom) != newOwner) { - qWarning("QXcbClipboard::setMimeData: Cannot set X11 selection owner"); + qCWarning(lcQpaClipboard, "QXcbClipboard::setMimeData: Cannot set X11 selection owner"); } emitChanged(mode); @@ -538,7 +538,7 @@ void QXcbClipboard::handleSelectionClearRequest(xcb_selection_clear_event_t *eve void QXcbClipboard::handleSelectionRequest(xcb_selection_request_event_t *req) { if (requestor() && req->requestor == requestor()) { - qWarning("QXcbClipboard: Selection request should be caught before"); + qCWarning(lcQpaClipboard, "QXcbClipboard: Selection request should be caught before"); return; } @@ -553,7 +553,8 @@ void QXcbClipboard::handleSelectionRequest(xcb_selection_request_event_t *req) QMimeData *d; QClipboard::Mode mode = modeForAtom(req->selection); if (mode > QClipboard::Selection) { - qWarning() << "QXcbClipboard: Unknown selection" << connection()->atomName(req->selection); + qCWarning(lcQpaClipboard, "QXcbClipboard: Unknown selection %s", + connection()->atomName(req->selection).constData()); xcb_send_event(xcb_connection(), false, req->requestor, XCB_EVENT_MASK_NO_EVENT, (const char *)&event); return; } @@ -561,14 +562,14 @@ void QXcbClipboard::handleSelectionRequest(xcb_selection_request_event_t *req) d = m_clientClipboard[mode]; if (!d) { - qWarning("QXcbClipboard: Cannot transfer data, no data available"); + qCWarning(lcQpaClipboard, "QXcbClipboard: Cannot transfer data, no data available"); xcb_send_event(xcb_connection(), false, req->requestor, XCB_EVENT_MASK_NO_EVENT, (const char *)&event); return; } if (m_timestamp[mode] == XCB_CURRENT_TIME // we don't own the selection anymore || (req->time != XCB_CURRENT_TIME && req->time < m_timestamp[mode])) { - qWarning("QXcbClipboard: SelectionRequest too old"); + qCDebug(lcQpaClipboard, "QXcbClipboard: SelectionRequest too old"); xcb_send_event(xcb_connection(), false, req->requestor, XCB_EVENT_MASK_NO_EVENT, (const char *)&event); return; } @@ -623,7 +624,7 @@ void QXcbClipboard::handleSelectionRequest(xcb_selection_request_event_t *req) property, XCB_ATOM_INTEGER, 32, 1, &m_timestamp[mode]); ret = property; } else { - qWarning("QXcbClipboard: Invalid data timestamp"); + qCWarning(lcQpaClipboard, "QXcbClipboard: Invalid data timestamp"); } } else if (target == targetsAtom) { ret = sendTargetsSelection(d, req->requestor, property); @@ -728,7 +729,7 @@ bool QXcbClipboard::clipboardReadProperty(xcb_window_t win, xcb_atom_t property, // recover -- this shouldn't normally happen, but it doesn't // hurt to be defensive if ((int)(buffer_offset + length) > buffer->size()) { - qWarning("QXcbClipboard: buffer overflow"); + qCWarning(lcQpaClipboard, "QXcbClipboard: buffer overflow"); length = buffer->size() - buffer_offset; // escape loop diff --git a/src/plugins/platforms/xcb/qxcbconnection.cpp b/src/plugins/platforms/xcb/qxcbconnection.cpp index 9abdae6a..9e2a37a6 100644 --- a/src/plugins/platforms/xcb/qxcbconnection.cpp +++ b/src/plugins/platforms/xcb/qxcbconnection.cpp @@ -221,6 +221,12 @@ void QXcbConnection::printXcbEvent(const QLoggingCategory &log, const char *mess } #define CASE_PRINT_AND_RETURN(name) case name : PRINT_AND_RETURN(#name); +#define XI_PRINT_AND_RETURN(name) { \ + qCDebug(log, "%s | XInput Event(%s) | sequence: %d", message, name, sequence); \ + return; \ +} +#define XI_CASE_PRINT_AND_RETURN(name) case name : XI_PRINT_AND_RETURN(#name); + switch (response_type) { CASE_PRINT_AND_RETURN( XCB_KEY_PRESS ); CASE_PRINT_AND_RETURN( XCB_KEY_RELEASE ); @@ -255,7 +261,44 @@ void QXcbConnection::printXcbEvent(const QLoggingCategory &log, const char *mess CASE_PRINT_AND_RETURN( XCB_COLORMAP_NOTIFY ); CASE_PRINT_AND_RETURN( XCB_CLIENT_MESSAGE ); CASE_PRINT_AND_RETURN( XCB_MAPPING_NOTIFY ); - CASE_PRINT_AND_RETURN( XCB_GE_GENERIC ); + case XCB_GE_GENERIC: { + if (hasXInput2() && isXIEvent(event)) { + auto *xiDeviceEvent = reinterpret_cast(event); // qt_xcb_input_device_event_t + switch (xiDeviceEvent->event_type) { + XI_CASE_PRINT_AND_RETURN( XCB_INPUT_KEY_PRESS ); + XI_CASE_PRINT_AND_RETURN( XCB_INPUT_KEY_RELEASE ); + XI_CASE_PRINT_AND_RETURN( XCB_INPUT_BUTTON_PRESS ); + XI_CASE_PRINT_AND_RETURN( XCB_INPUT_BUTTON_RELEASE ); + XI_CASE_PRINT_AND_RETURN( XCB_INPUT_MOTION ); + XI_CASE_PRINT_AND_RETURN( XCB_INPUT_ENTER ); + XI_CASE_PRINT_AND_RETURN( XCB_INPUT_LEAVE ); + XI_CASE_PRINT_AND_RETURN( XCB_INPUT_FOCUS_IN ); + XI_CASE_PRINT_AND_RETURN( XCB_INPUT_FOCUS_OUT ); + XI_CASE_PRINT_AND_RETURN( XCB_INPUT_HIERARCHY ); + XI_CASE_PRINT_AND_RETURN( XCB_INPUT_PROPERTY ); + XI_CASE_PRINT_AND_RETURN( XCB_INPUT_RAW_KEY_PRESS ); + XI_CASE_PRINT_AND_RETURN( XCB_INPUT_RAW_KEY_RELEASE ); + XI_CASE_PRINT_AND_RETURN( XCB_INPUT_RAW_BUTTON_PRESS ); + XI_CASE_PRINT_AND_RETURN( XCB_INPUT_RAW_BUTTON_RELEASE ); + XI_CASE_PRINT_AND_RETURN( XCB_INPUT_RAW_MOTION ); + XI_CASE_PRINT_AND_RETURN( XCB_INPUT_TOUCH_BEGIN ); + XI_CASE_PRINT_AND_RETURN( XCB_INPUT_TOUCH_UPDATE ); + XI_CASE_PRINT_AND_RETURN( XCB_INPUT_TOUCH_END ); + XI_CASE_PRINT_AND_RETURN( XCB_INPUT_TOUCH_OWNERSHIP ); + XI_CASE_PRINT_AND_RETURN( XCB_INPUT_RAW_TOUCH_BEGIN ); + XI_CASE_PRINT_AND_RETURN( XCB_INPUT_RAW_TOUCH_UPDATE ); + XI_CASE_PRINT_AND_RETURN( XCB_INPUT_RAW_TOUCH_END ); + XI_CASE_PRINT_AND_RETURN( XCB_INPUT_BARRIER_HIT ); + XI_CASE_PRINT_AND_RETURN( XCB_INPUT_BARRIER_LEAVE ); + default: + qCDebug(log, "%s | XInput Event(other type) | sequence: %d", message, sequence); + return; + } + } else { + qCDebug(log, "%s | %s(%d) | sequence: %d", message, "XCB_GE_GENERIC", response_type, sequence); + return; + } + } } // XFixes if (isXFixesType(response_type, XCB_XFIXES_SELECTION_NOTIFY)) @@ -707,7 +750,7 @@ void QXcbConnection::handleXcbEvent(xcb_generic_event_t *event) case XCB_XKB_NEW_KEYBOARD_NOTIFY: { xcb_xkb_new_keyboard_notify_event_t *ev = &xkb_event->new_keyboard_notify; if (ev->changed & XCB_XKB_NKN_DETAIL_KEYCODES) - m_keyboard->updateKeymap(); + m_keyboard->updateKeymap(ev); break; } default: @@ -795,7 +838,13 @@ xcb_timestamp_t QXcbConnection::getTimestamp() xcb_window_t QXcbConnection::getSelectionOwner(xcb_atom_t atom) const { - return Q_XCB_REPLY(xcb_get_selection_owner, xcb_connection(), atom)->owner; + auto reply = Q_XCB_REPLY(xcb_get_selection_owner, xcb_connection(), atom); + if (!reply) { + qCDebug(lcQpaXcb) << "failed to query selection owner"; + return XCB_NONE; + } + + return reply->owner; } xcb_window_t QXcbConnection::getQtSelectionOwner() diff --git a/src/plugins/platforms/xcb/qxcbconnection_basic.cpp b/src/plugins/platforms/xcb/qxcbconnection_basic.cpp index 18dee89a..9dd608cd 100644 --- a/src/plugins/platforms/xcb/qxcbconnection_basic.cpp +++ b/src/plugins/platforms/xcb/qxcbconnection_basic.cpp @@ -179,7 +179,13 @@ xcb_atom_t QXcbBasicConnection::internAtom(const char *name) if (!name || *name == 0) return XCB_NONE; - return Q_XCB_REPLY(xcb_intern_atom, m_xcbConnection, false, strlen(name), name)->atom; + auto reply = Q_XCB_REPLY(xcb_intern_atom, m_xcbConnection, false, strlen(name), name); + if (!reply) { + qCDebug(lcQpaXcb) << "failed to query intern atom: " << name; + return XCB_NONE; + } + + return reply->atom; } QByteArray QXcbBasicConnection::atomName(xcb_atom_t atom) diff --git a/src/plugins/platforms/xcb/qxcbcursor.cpp b/src/plugins/platforms/xcb/qxcbcursor.cpp index 42c7a52b..4210bf42 100644 --- a/src/plugins/platforms/xcb/qxcbcursor.cpp +++ b/src/plugins/platforms/xcb/qxcbcursor.cpp @@ -534,6 +534,8 @@ bool updateCursorTheme(void *dpy, const QByteArray &theme) { Q_UNUSED(screen); Q_UNUSED(name); QXcbCursor *self = static_cast(handle); + self->m_cursorHash.clear(); + updateCursorTheme(self->connection()->xlib_display(),property.toByteArray()); } @@ -559,14 +561,16 @@ xcb_cursor_t QXcbCursor::createFontCursor(int cshape) int cursorId = cursorIdForShape(cshape); xcb_cursor_t cursor = XCB_NONE; - // Try Xcursor first #if QT_CONFIG(xcb_xlib) && QT_CONFIG(library) + if (m_screen->xSettings()->initialized()) + m_screen->xSettings()->registerCallbackForProperty("Gtk/CursorThemeName",cursorThemePropertyChanged,this); + + // Try Xcursor first if (cshape >= 0 && cshape <= Qt::LastCursor) { void *dpy = connection()->xlib_display(); cursor = loadCursor(dpy, cshape); if (!cursor && !m_gtkCursorThemeInitialized && m_screen->xSettings()->initialized()) { QByteArray gtkCursorTheme = m_screen->xSettings()->setting("Gtk/CursorThemeName").toByteArray(); - m_screen->xSettings()->registerCallbackForProperty("Gtk/CursorThemeName",cursorThemePropertyChanged,this); if (updateCursorTheme(dpy,gtkCursorTheme)) { cursor = loadCursor(dpy, cshape); } @@ -668,7 +672,8 @@ void QXcbCursor::setPos(const QPoint &pos) { QXcbVirtualDesktop *virtualDesktop = nullptr; queryPointer(connection(), &virtualDesktop, nullptr); - xcb_warp_pointer(xcb_connection(), XCB_NONE, virtualDesktop->root(), 0, 0, 0, 0, pos.x(), pos.y()); + if (virtualDesktop) + xcb_warp_pointer(xcb_connection(), XCB_NONE, virtualDesktop->root(), 0, 0, 0, 0, pos.x(), pos.y()); xcb_flush(xcb_connection()); } diff --git a/src/plugins/platforms/xcb/qxcbkeyboard.cpp b/src/plugins/platforms/xcb/qxcbkeyboard.cpp index e8286381..efecd7e2 100644 --- a/src/plugins/platforms/xcb/qxcbkeyboard.cpp +++ b/src/plugins/platforms/xcb/qxcbkeyboard.cpp @@ -365,6 +365,17 @@ void QXcbKeyboard::updateKeymap(xcb_mapping_notify_event_t *event) updateKeymap(); } +void QXcbKeyboard::updateKeymap(xcb_xkb_new_keyboard_notify_event_t *event) +{ + if (!event) + return; + + if (event->deviceID != event->oldDeviceID) + m_config = false; + + updateKeymap(); +} + void QXcbKeyboard::updateKeymap() { KeysymModifierMap keysymMods; @@ -372,8 +383,6 @@ void QXcbKeyboard::updateKeymap() keysymMods = keysymsToModifiers(); updateModifiers(keysymMods); - m_config = true; - if (!m_xkbContext) { m_xkbContext.reset(xkb_context_new(XKB_CONTEXT_NO_DEFAULT_INCLUDES)); if (!m_xkbContext) { @@ -389,8 +398,13 @@ void QXcbKeyboard::updateKeymap() if (connection()->hasXKB()) { m_xkbKeymap.reset(xkb_x11_keymap_new_from_device(m_xkbContext.get(), xcb_connection(), core_device_id, XKB_KEYMAP_COMPILE_NO_FLAGS)); - if (m_xkbKeymap) - m_xkbState.reset(xkb_x11_state_new_from_device(m_xkbKeymap.get(), xcb_connection(), core_device_id)); + if (m_xkbKeymap) { + if (m_config) + m_xkbState.reset(xkb_state_new(m_xkbKeymap.get())); + else + m_xkbState.reset(xkb_x11_state_new_from_device(m_xkbKeymap.get(), xcb_connection(), core_device_id)); + + } } else { m_xkbKeymap.reset(keymapFromCore(keysymMods)); if (m_xkbKeymap) @@ -411,6 +425,8 @@ void QXcbKeyboard::updateKeymap() updateXKBMods(); QXkbCommon::verifyHasLatinLayout(m_xkbKeymap.get()); + + m_config = true; } QList QXcbKeyboard::possibleKeys(const QKeyEvent *event) const diff --git a/src/plugins/platforms/xcb/qxcbkeyboard.h b/src/plugins/platforms/xcb/qxcbkeyboard.h index 0ee08aef..b652c85f 100644 --- a/src/plugins/platforms/xcb/qxcbkeyboard.h +++ b/src/plugins/platforms/xcb/qxcbkeyboard.h @@ -69,6 +69,7 @@ public: Qt::KeyboardModifiers translateModifiers(int s) const; void updateKeymap(xcb_mapping_notify_event_t *event); + void updateKeymap(xcb_xkb_new_keyboard_notify_event_t *event); void updateKeymap(); QList possibleKeys(const QKeyEvent *event) const; diff --git a/src/plugins/platforms/xcb/qxcbscreen.cpp b/src/plugins/platforms/xcb/qxcbscreen.cpp index 707896b4..464d0386 100644 --- a/src/plugins/platforms/xcb/qxcbscreen.cpp +++ b/src/plugins/platforms/xcb/qxcbscreen.cpp @@ -114,17 +114,13 @@ QXcbVirtualDesktop::QXcbVirtualDesktop(QXcbConnection *connection, xcb_screen_t } auto dpiChangedCallback = [](QXcbVirtualDesktop *desktop, const QByteArray &, const QVariant &property, void *) { - bool ok; - int dpiTimes1k = property.toInt(&ok); - if (!ok) + if (!desktop->setDpiFromXSettings(property)) return; - int dpi = dpiTimes1k / 1024; - if (desktop->m_forcedDpi == dpi) - return; - desktop->m_forcedDpi = dpi; + const auto dpi = desktop->forcedDpi(); for (QXcbScreen *screen : desktop->connection()->screens()) QWindowSystemInterface::handleScreenLogicalDotsPerInchChange(screen->QPlatformScreen::screen(), dpi, dpi); }; + setDpiFromXSettings(xSettings()->setting("Xft/DPI")); xSettings()->registerCallbackForProperty("Xft/DPI", dpiChangedCallback, nullptr); } @@ -425,6 +421,19 @@ void QXcbVirtualDesktop::readXResources() } } +bool QXcbVirtualDesktop::setDpiFromXSettings(const QVariant &property) +{ + bool ok; + int dpiTimes1k = property.toInt(&ok); + if (!ok) + return false; + int dpi = dpiTimes1k / 1024; + if (m_forcedDpi == dpi) + return false; + m_forcedDpi = dpi; + return true; +} + QSurfaceFormat QXcbVirtualDesktop::surfaceFormatFor(const QSurfaceFormat &format) const { const xcb_visualid_t xcb_visualid = connection()->hasDefaultVisualId() ? connection()->defaultVisualId() diff --git a/src/plugins/platforms/xcb/qxcbscreen.h b/src/plugins/platforms/xcb/qxcbscreen.h index bf48dd5d..c3a59dc9 100644 --- a/src/plugins/platforms/xcb/qxcbscreen.h +++ b/src/plugins/platforms/xcb/qxcbscreen.h @@ -118,6 +118,8 @@ private: QByteArray &stringValue); void readXResources(); + bool setDpiFromXSettings(const QVariant &property); + xcb_screen_t *m_screen; const int m_number; QList m_screens; diff --git a/src/plugins/platforms/xcb/qxcbwindow.cpp b/src/plugins/platforms/xcb/qxcbwindow.cpp index 9e7e1a55..ffda7b6a 100644 --- a/src/plugins/platforms/xcb/qxcbwindow.cpp +++ b/src/plugins/platforms/xcb/qxcbwindow.cpp @@ -258,7 +258,7 @@ enum : quint32 { | XCB_EVENT_MASK_POINTER_MOTION, transparentForInputEventMask = baseEventMask - | XCB_EVENT_MASK_VISIBILITY_CHANGE | XCB_EVENT_MASK_RESIZE_REDIRECT + | XCB_EVENT_MASK_VISIBILITY_CHANGE | XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT | XCB_EVENT_MASK_COLOR_MAP_CHANGE | XCB_EVENT_MASK_OWNER_GRAB_BUTTON }; @@ -564,6 +564,11 @@ void QXcbWindow::setGeometry(const QRect &rect) { QPlatformWindow::setGeometry(rect); + if (shouldDeferTask(Task::SetGeometry)) { + m_deferredGeometry = rect; + return; + } + propagateSizeHints(); QXcbScreen *currentScreen = xcbScreen(); @@ -688,6 +693,9 @@ void QXcbWindow::setVisible(bool visible) void QXcbWindow::show() { + if (shouldDeferTask(Task::Map)) + return; + if (window()->isTopLevel()) { // update WM_NORMAL_HINTS @@ -738,6 +746,10 @@ void QXcbWindow::show() void QXcbWindow::hide() { + if (shouldDeferTask(Task::Unmap)) + return; + + m_wmStateValid = false; xcb_unmap_window(xcb_connection(), m_window); // send synthetic UnmapNotify event according to icccm 4.1.4 @@ -897,6 +909,9 @@ QXcbWindow::NetWmStates QXcbWindow::netWmStates() void QXcbWindow::setWindowFlags(Qt::WindowFlags flags) { + if (shouldDeferTask(Task::SetWindowFlags)) + return; + Qt::WindowType type = static_cast(int(flags & Qt::WindowType_Mask)); if (type == Qt::ToolTip) @@ -926,6 +941,8 @@ void QXcbWindow::setWindowFlags(Qt::WindowFlags flags) setTransparentForMouseEvents(flags & Qt::WindowTransparentForInput); updateDoesNotAcceptFocus(flags & Qt::WindowDoesNotAcceptFocus); + + m_isWmManagedWindow = !(flags & Qt::X11BypassWindowManagerHint); } void QXcbWindow::setMotifWmHints(Qt::WindowFlags flags) @@ -1125,27 +1142,47 @@ void QXcbWindow::setWindowState(Qt::WindowStates state) if (state == m_windowState) return; - if ((m_windowState & Qt::WindowMinimized) && !(state & Qt::WindowMinimized)) { + if (shouldDeferTask(Task::SetWindowState)) + return; + + // unset old state + if (m_windowState & Qt::WindowMinimized) xcb_map_window(xcb_connection(), m_window); - } else if (!(m_windowState & Qt::WindowMinimized) && (state & Qt::WindowMinimized)) { - xcb_client_message_event_t event; + if (m_windowState & Qt::WindowMaximized) + setNetWmState(false, + atom(QXcbAtom::_NET_WM_STATE_MAXIMIZED_HORZ), + atom(QXcbAtom::_NET_WM_STATE_MAXIMIZED_VERT)); + if (m_windowState & Qt::WindowFullScreen) + setNetWmState(false, atom(QXcbAtom::_NET_WM_STATE_FULLSCREEN)); - event.response_type = XCB_CLIENT_MESSAGE; - event.format = 32; - event.sequence = 0; - event.window = m_window; - event.type = atom(QXcbAtom::WM_CHANGE_STATE); - event.data.data32[0] = XCB_ICCCM_WM_STATE_ICONIC; - event.data.data32[1] = 0; - event.data.data32[2] = 0; - event.data.data32[3] = 0; - event.data.data32[4] = 0; + // set new state + if (state & Qt::WindowMinimized) { + { + xcb_client_message_event_t event; - xcb_send_event(xcb_connection(), 0, xcbScreen()->root(), - XCB_EVENT_MASK_STRUCTURE_NOTIFY | XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT, - (const char *)&event); + event.response_type = XCB_CLIENT_MESSAGE; + event.format = 32; + event.sequence = 0; + event.window = m_window; + event.type = atom(QXcbAtom::WM_CHANGE_STATE); + event.data.data32[0] = XCB_ICCCM_WM_STATE_ICONIC; + event.data.data32[1] = 0; + event.data.data32[2] = 0; + event.data.data32[3] = 0; + event.data.data32[4] = 0; + + xcb_send_event(xcb_connection(), 0, xcbScreen()->root(), + XCB_EVENT_MASK_STRUCTURE_NOTIFY | XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT, + (const char *)&event); + } m_minimized = true; } + if (state & Qt::WindowMaximized) + setNetWmState(true, + atom(QXcbAtom::_NET_WM_STATE_MAXIMIZED_HORZ), + atom(QXcbAtom::_NET_WM_STATE_MAXIMIZED_VERT)); + if (state & Qt::WindowFullScreen) + setNetWmState(true, atom(QXcbAtom::_NET_WM_STATE_FULLSCREEN)); setNetWmState(state); @@ -1857,6 +1894,10 @@ void QXcbWindow::handleUnmapNotifyEvent(const xcb_unmap_notify_event_t *event) if (event->window == m_window) { m_mapped = false; QWindowSystemInterface::handleExposeEvent(window(), QRegion()); + if (!m_isWmManagedWindow || parent()) { + m_wmStateValid = true; + handleDeferredTasks(); + } } } @@ -2171,30 +2212,98 @@ void QXcbWindow::handleLeaveNotifyEvent(const xcb_leave_notify_event_t *event) handleLeaveNotifyEvent(event->root_x, event->root_y, event->mode, event->detail, event->time); } +bool QXcbWindow::shouldDeferTask(Task task) +{ + if (m_wmStateValid) + return false; + + m_deferredTasks.append(task); + return true; +} + +void QXcbWindow::handleDeferredTasks() +{ + Q_ASSERT(m_wmStateValid == true); + if (m_deferredTasks.isEmpty()) + return; + + bool map = false; + bool unmap = false; + + QVector tasks; + for (auto taskIt = m_deferredTasks.rbegin(); taskIt != m_deferredTasks.rend(); ++taskIt) { + if (!tasks.contains(*taskIt)) + tasks.prepend(*taskIt); + } + + for (Task task : tasks) { + switch (task) { + case Task::Map: + map = true; + unmap = false; + break; + case Task::Unmap: + unmap = true; + map = false; + break; + case Task::SetGeometry: + setGeometry(m_deferredGeometry); + break; + case Task::SetWindowFlags: + setWindowFlags(window()->flags()); + break; + case Task::SetWindowState: + setWindowState(window()->windowState()); + break; + } + } + m_deferredTasks.clear(); + + if (map) { + Q_ASSERT(unmap == false); + show(); + } + if (unmap) { + Q_ASSERT(map == false); + hide(); + } +} + void QXcbWindow::handlePropertyNotifyEvent(const xcb_property_notify_event_t *event) { connection()->setTime(event->time); - const bool propertyDeleted = event->state == XCB_PROPERTY_DELETE; - - if (event->atom == atom(QXcbAtom::_NET_WM_STATE) || event->atom == atom(QXcbAtom::WM_STATE)) { - if (propertyDeleted) + const bool wmStateChanged = event->atom == atom(QXcbAtom::WM_STATE); + const bool netWmStateChanged = event->atom == atom(QXcbAtom::_NET_WM_STATE); + if (netWmStateChanged || wmStateChanged) { + if (wmStateChanged && !m_wmStateValid && m_isWmManagedWindow) { + // ICCCM 4.1.4 + // Clients that want to re-use a client window (e.g. by mapping it again) + // after withdrawing it must wait for the withdrawal to be complete before + // proceeding. The preferred method for doing this is for clients to wait for + // a window manager to update or remove the WM_STATE property. + m_wmStateValid = true; + handleDeferredTasks(); + } + if (event->state == XCB_PROPERTY_DELETE) return; - Qt::WindowStates newState = Qt::WindowNoState; - - if (event->atom == atom(QXcbAtom::WM_STATE)) { // WM_STATE: Quick check for 'Minimize'. + if (wmStateChanged) { auto reply = Q_XCB_REPLY(xcb_get_property, xcb_connection(), 0, m_window, atom(QXcbAtom::WM_STATE), XCB_ATOM_ANY, 0, 1024); if (reply && reply->format == 32 && reply->type == atom(QXcbAtom::WM_STATE)) { - const quint32 *data = (const quint32 *)xcb_get_property_value(reply.get()); - if (reply->length != 0) - m_minimized = (data[0] == XCB_ICCCM_WM_STATE_ICONIC - || (data[0] == XCB_ICCCM_WM_STATE_WITHDRAWN && m_minimized)); + auto data = static_cast(xcb_get_property_value(reply.get())); + if (reply->length != 0) { + const bool changedToWithdrawn = data[0] == XCB_ICCCM_WM_STATE_WITHDRAWN; + const bool changedToIconic = data[0] == XCB_ICCCM_WM_STATE_ICONIC; + m_minimized = changedToIconic || (changedToWithdrawn && m_minimized); + } } } + // _NET_WM_STATE handling + Qt::WindowStates newState = Qt::WindowNoState; const NetWmStates states = netWmStates(); // _NET_WM_STATE_HIDDEN should be set by the Window Manager to indicate that a window would // not be visible on the screen if its desktop/viewport were active and its coordinates were @@ -2216,7 +2325,6 @@ void QXcbWindow::handlePropertyNotifyEvent(const xcb_property_notify_event_t *ev if ((m_windowState & Qt::WindowMinimized) && connection()->mouseGrabber() == this) connection()->setMouseGrabber(nullptr); } - return; } else if (event->atom == atom(QXcbAtom::_NET_FRAME_EXTENTS)) { m_dirtyFrameMargins = true; } diff --git a/src/plugins/platforms/xcb/qxcbwindow.h b/src/plugins/platforms/xcb/qxcbwindow.h index 6f5c1f5e..55af9279 100644 --- a/src/plugins/platforms/xcb/qxcbwindow.h +++ b/src/plugins/platforms/xcb/qxcbwindow.h @@ -74,6 +74,14 @@ public: Q_DECLARE_FLAGS(NetWmStates, NetWmState) + enum Task { + Map, + Unmap, + SetGeometry, + SetWindowFlags, + SetWindowState + }; + QXcbWindow(QWindow *window); ~QXcbWindow(); @@ -143,6 +151,9 @@ public: QXcbWindow *toWindow() override; + bool shouldDeferTask(Task task); + void handleDeferredTasks(); + void handleMouseEvent(xcb_timestamp_t time, const QPoint &local, const QPoint &global, Qt::KeyboardModifiers modifiers, QEvent::Type type, Qt::MouseEventSource source); @@ -281,6 +292,11 @@ protected: int m_swapInterval = -1; qreal m_sizeHintsScaleFactor = 1.0; + + bool m_wmStateValid = true; + QVector m_deferredTasks; + bool m_isWmManagedWindow = true; + QRect m_deferredGeometry; }; class QXcbForeignWindow : public QXcbWindow diff --git a/src/plugins/platformthemes/xdgdesktopportal/qxdgdesktopportalfiledialog.cpp b/src/plugins/platformthemes/xdgdesktopportal/qxdgdesktopportalfiledialog.cpp index c4dc2da6..0048bbc1 100644 --- a/src/plugins/platformthemes/xdgdesktopportal/qxdgdesktopportalfiledialog.cpp +++ b/src/plugins/platformthemes/xdgdesktopportal/qxdgdesktopportalfiledialog.cpp @@ -185,7 +185,7 @@ void QXdgDesktopPortalFileDialog::openPortal() QLatin1String("/org/freedesktop/portal/desktop"), QLatin1String("org.freedesktop.portal.FileChooser"), d->saveFile ? QLatin1String("SaveFile") : QLatin1String("OpenFile")); - QString parentWindowId = QLatin1String("x11:") + QString::number(d->winId); + QString parentWindowId = QLatin1String("x11:") + QString::number(d->winId, 16); QVariantMap options; if (!d->acceptLabel.isEmpty()) diff --git a/src/plugins/sqldrivers/oci/qsql_oci.cpp b/src/plugins/sqldrivers/oci/qsql_oci.cpp index 8da9837a..c6383de3 100644 --- a/src/plugins/sqldrivers/oci/qsql_oci.cpp +++ b/src/plugins/sqldrivers/oci/qsql_oci.cpp @@ -224,6 +224,7 @@ public: OCISvcCtx *svc; OCIServer *srvhp; OCISession *authp; + OCITrans *trans = nullptr; OCIError *err; bool transaction; int serverVersion; @@ -1483,6 +1484,7 @@ bool QOCICols::execBatch(QOCIResultPrivate *d, QVector &boundValues, b columns[i].lengths[row] = columns[i].maxLen; QOCIDateTime *date = new QOCIDateTime(d->env, d->err, val.toDateTime()); *reinterpret_cast(dataPtr) = date->dateTime; + tmpStorage.dateTimes.append(date); break; } case QVariant::Int: @@ -2296,11 +2298,12 @@ bool QOCIDriver::open(const QString & db, r = OCIAttrSet(d->authp, OCI_HTYPE_SESSION, const_cast(password.utf16()), password.length() * sizeof(QChar), OCI_ATTR_PASSWORD, d->err); - OCITrans* trans; + if (r == OCI_SUCCESS) { + r = OCIHandleAlloc(d->env, reinterpret_cast(&d->trans), OCI_HTYPE_TRANS, + 0, nullptr); + } if (r == OCI_SUCCESS) - r = OCIHandleAlloc(d->env, reinterpret_cast(&trans), OCI_HTYPE_TRANS, 0, 0); - if (r == OCI_SUCCESS) - r = OCIAttrSet(d->svc, OCI_HTYPE_SVCCTX, trans, 0, OCI_ATTR_TRANS, d->err); + r = OCIAttrSet(d->svc, OCI_HTYPE_SVCCTX, d->trans, 0, OCI_ATTR_TRANS, d->err); if (r == OCI_SUCCESS) { if (user.isEmpty() && password.isEmpty()) @@ -2314,12 +2317,18 @@ bool QOCIDriver::open(const QString & db, if (r != OCI_SUCCESS) { setLastError(qMakeError(tr("Unable to logon"), QSqlError::ConnectionError, d->err)); setOpenError(true); + if (d->trans) + OCIHandleFree(d->trans, OCI_HTYPE_TRANS); + d->trans = nullptr; if (d->authp) OCIHandleFree(d->authp, OCI_HTYPE_SESSION); - d->authp = 0; + d->authp = nullptr; + if (d->svc) + OCIHandleFree(d->svc, OCI_HTYPE_SVCCTX); + d->svc = nullptr; if (d->srvhp) OCIHandleFree(d->srvhp, OCI_HTYPE_SERVER); - d->srvhp = 0; + d->srvhp = nullptr; return false; } @@ -2357,12 +2366,14 @@ void QOCIDriver::close() OCISessionEnd(d->svc, d->err, d->authp, OCI_DEFAULT); OCIServerDetach(d->srvhp, d->err, OCI_DEFAULT); + OCIHandleFree(d->trans, OCI_HTYPE_TRANS); + d->trans = nullptr; OCIHandleFree(d->authp, OCI_HTYPE_SESSION); - d->authp = 0; - OCIHandleFree(d->srvhp, OCI_HTYPE_SERVER); - d->srvhp = 0; + d->authp = nullptr; OCIHandleFree(d->svc, OCI_HTYPE_SVCCTX); - d->svc = 0; + d->svc = nullptr; + OCIHandleFree(d->srvhp, OCI_HTYPE_SERVER); + d->srvhp = nullptr; setOpen(false); setOpenError(false); } diff --git a/src/plugins/sqldrivers/sqlite/qsql_sqlite.cpp b/src/plugins/sqldrivers/sqlite/qsql_sqlite.cpp index abaeac3b..36cb7e1a 100644 --- a/src/plugins/sqldrivers/sqlite/qsql_sqlite.cpp +++ b/src/plugins/sqldrivers/sqlite/qsql_sqlite.cpp @@ -74,13 +74,18 @@ Q_DECLARE_METATYPE(sqlite3_stmt*) QT_BEGIN_NAMESPACE -static QString _q_escapeIdentifier(const QString &identifier) +static QString _q_escapeIdentifier(const QString &identifier, QSqlDriver::IdentifierType type) { QString res = identifier; + // If it contains [ and ] then we assume it to be escaped properly already as this indicates + // the syntax is exactly how it should be + if (identifier.contains(QLatin1Char('[')) && identifier.contains(QLatin1Char(']'))) + return res; if (!identifier.isEmpty() && !identifier.startsWith(QLatin1Char('"')) && !identifier.endsWith(QLatin1Char('"'))) { res.replace(QLatin1Char('"'), QLatin1String("\"\"")); res.prepend(QLatin1Char('"')).append(QLatin1Char('"')); - res.replace(QLatin1Char('.'), QLatin1String("\".\"")); + if (type == QSqlDriver::TableName) + res.replace(QLatin1Char('.'), QLatin1String("\".\"")); } return res; } @@ -496,7 +501,7 @@ bool QSQLiteResult::exec() if (paramCountIsValid) { for (int i = 0; i < paramCount; ++i) { res = SQLITE_OK; - const QVariant value = values.at(i); + const QVariant &value = values.at(i); if (value.isNull()) { res = sqlite3_bind_null(d->stmt, i + 1); @@ -905,13 +910,24 @@ static QSqlIndex qGetTableInfo(QSqlQuery &q, const QString &tableName, bool only { QString schema; QString table(tableName); - int indexOfSeparator = tableName.indexOf(QLatin1Char('.')); + const int indexOfSeparator = tableName.indexOf(QLatin1Char('.')); if (indexOfSeparator > -1) { - schema = tableName.left(indexOfSeparator).append(QLatin1Char('.')); - table = tableName.mid(indexOfSeparator + 1); + const int indexOfCloseBracket = tableName.indexOf(QLatin1Char(']')); + if (indexOfCloseBracket != tableName.size() - 1) { + // Handles a case like databaseName.tableName + schema = tableName.left(indexOfSeparator + 1); + table = tableName.mid(indexOfSeparator + 1); + } else { + const int indexOfOpenBracket = tableName.lastIndexOf(QLatin1Char('['), indexOfCloseBracket); + if (indexOfOpenBracket > 0) { + // Handles a case like databaseName.[tableName] + schema = tableName.left(indexOfOpenBracket); + table = tableName.mid(indexOfOpenBracket); + } + } } - q.exec(QLatin1String("PRAGMA ") + schema + QLatin1String("table_info (") + _q_escapeIdentifier(table) + QLatin1Char(')')); - + q.exec(QLatin1String("PRAGMA ") + schema + QLatin1String("table_info (") + + _q_escapeIdentifier(table, QSqlDriver::TableName) + QLatin1Char(')')); QSqlIndex ind; while (q.next()) { bool isPk = q.value(5).toInt(); @@ -973,8 +989,7 @@ QVariant QSQLiteDriver::handle() const QString QSQLiteDriver::escapeIdentifier(const QString &identifier, IdentifierType type) const { - Q_UNUSED(type); - return _q_escapeIdentifier(identifier); + return _q_escapeIdentifier(identifier, type); } static void handle_sqlite_callback(void *qobj,int aoperation, char const *adbname, char const *atablename, diff --git a/src/plugins/styles/mac/qmacstyle_mac.mm b/src/plugins/styles/mac/qmacstyle_mac.mm index 5ff63fc8..2a37a951 100644 --- a/src/plugins/styles/mac/qmacstyle_mac.mm +++ b/src/plugins/styles/mac/qmacstyle_mac.mm @@ -195,10 +195,6 @@ const int QMacStylePrivate::PushButtonLeftOffset = 6; const int QMacStylePrivate::PushButtonRightOffset = 12; const int QMacStylePrivate::PushButtonContentPadding = 6; -const int pushButtonBevelRectOffsets[3] = { - QMacStylePrivate::PushButtonLeftOffset, 5, 5 -}; - QVector > QMacStylePrivate::scrollBars; // Title bar gradient colors for Lion were determined by inspecting PSDs exported @@ -1167,6 +1163,8 @@ static QStyleHelper::WidgetSizePolicy qt_aqua_guess_size(const QWidget *widg, QS void QMacStylePrivate::drawFocusRing(QPainter *p, const QRectF &targetRect, int hMargin, int vMargin, const CocoaControl &cw) const { + const bool isBigSurOrAbove = QOperatingSystemVersion::current() >= QOperatingSystemVersion::MacOSBigSur; + QPainterPath focusRingPath; focusRingPath.setFillRule(Qt::OddEvenFill); @@ -1216,7 +1214,6 @@ void QMacStylePrivate::drawFocusRing(QPainter *p, const QRectF &targetRect, int } case Button_PullDown: case Button_PushButton: { - const bool isBigSurOrAbove = QOperatingSystemVersion::current() >= QOperatingSystemVersion::MacOSBigSur; QRectF focusRect; auto *pb = static_cast(cocoaControl(cw)); const QRectF frameRect = cw.adjustedControlFrame(targetRect.adjusted(hMargin, vMargin, -hMargin, -vMargin)); @@ -1247,11 +1244,16 @@ void QMacStylePrivate::drawFocusRing(QPainter *p, const QRectF &targetRect, int } case Button_PopupButton: case SegmentedControl_Single: { - const qreal innerRadius = cw.type == Button_PushButton ? 3 : 4; + QRectF focusRect = targetRect; + if (isBigSurOrAbove) + focusRect.translate(0, -1.5); + else if (QOperatingSystemVersion::current() >= QOperatingSystemVersion::MacOSCatalina) + focusRect.adjust(0, 0, 0, -1); + const qreal innerRadius = 4; const qreal outerRadius = innerRadius + focusRingWidth; - hOffset = targetRect.left(); - vOffset = targetRect.top(); - const auto innerRect = targetRect.translated(-targetRect.topLeft()); + hOffset = focusRect.left(); + vOffset = focusRect.top(); + const auto innerRect = focusRect.translated(-focusRect.topLeft()); const auto outerRect = innerRect.adjusted(-hMargin, -vMargin, hMargin, vMargin); focusRingPath.addRoundedRect(innerRect, innerRadius, innerRadius); focusRingPath.addRoundedRect(outerRect, outerRadius, outerRadius); @@ -1603,8 +1605,7 @@ QRectF QMacStylePrivate::CocoaControl::adjustedControlFrame(const QRectF &rect) const auto frameSize = defaultFrameSize(); if (type == QMacStylePrivate::Button_SquareButton) { frameRect = rect.adjusted(3, 1, -3, -1) - .adjusted(focusRingWidth, focusRingWidth, -focusRingWidth, -focusRingWidth) - .adjusted(-6.5, 0, 6.5, 0); + .adjusted(focusRingWidth, focusRingWidth, -focusRingWidth, -focusRingWidth); } else if (type == QMacStylePrivate::Button_PushButton) { // Start from the style option's top-left corner. frameRect = QRectF(rect.topLeft(), @@ -1613,8 +1614,6 @@ QRectF QMacStylePrivate::CocoaControl::adjustedControlFrame(const QRectF &rect) frameRect = frameRect.translated(0, 1.5); else if (size == QStyleHelper::SizeMini) frameRect = frameRect.adjusted(0, 0, -8, 0).translated(4, 4); - frameRect = frameRect.adjusted(-pushButtonBevelRectOffsets[size], 0, - pushButtonBevelRectOffsets[size], 0); } else { // Center in the style option's rect. frameRect = QRectF(QPointF(0, (rect.height() - frameSize.height()) / 2.0), @@ -1627,9 +1626,6 @@ QRectF QMacStylePrivate::CocoaControl::adjustedControlFrame(const QRectF &rect) frameRect = frameRect.adjusted(0, 0, -4, 0).translated(2, 1); else if (size == QStyleHelper::SizeMini) frameRect = frameRect.adjusted(0, 0, -9, 0).translated(5, 0); - if (type == QMacStylePrivate::Button_PullDown) - frameRect = frameRect.adjusted(-pushButtonBevelRectOffsets[size], 0, - pushButtonBevelRectOffsets[size], 0); } else if (type == QMacStylePrivate::ComboBox) { frameRect = frameRect.adjusted(0, 0, -6, 0).translated(4, 0); } @@ -3791,11 +3787,7 @@ void QMacStyle::drawControl(ControlElement ce, const QStyleOption *opt, QPainter QRect textRect = itemTextRect( btn.fontMetrics, freeContentRect, Qt::AlignCenter, isEnabled, btn.text); if (hasMenu) { - if (ct == QMacStylePrivate::Button_SquareButton) - textRect.moveTo(w ? 8 : 11, textRect.top()); - else - textRect.moveTo(w ? (15 - pushButtonBevelRectOffsets[d->effectiveAquaSizeConstrain(b, w)]) - : 11, textRect.top()); // Supports Qt Quick Controls + textRect.moveTo(w ? 15 : 11, textRect.top()); // Supports Qt Quick Controls } // Draw the icon: if (hasIcon) { @@ -4394,8 +4386,10 @@ void QMacStyle::drawControl(ControlElement ce, const QStyleOption *opt, QPainter // line-break the string if it doesn't fit the given rect. It's better to draw outside // the rect and possibly overlap something than to have part of the text disappear. [s.toNSString() drawAtPoint:CGPointMake(xpos, yPos) - withAttributes:@{ NSFontAttributeName:f, NSForegroundColorAttributeName:c, - NSObliquenessAttributeName: [NSNumber numberWithDouble: myFont.italic() ? 0.3 : 0.0]}]; + withAttributes:@{ NSFontAttributeName:f, NSForegroundColorAttributeName:c, + NSObliquenessAttributeName: [NSNumber numberWithDouble: myFont.italic() ? 0.3 : 0.0], + NSUnderlineStyleAttributeName: [NSNumber numberWithInt: myFont.underline() ? NSUnderlineStyleSingle + : NSUnderlineStyleNone]}]; d->restoreNSGraphicsContext(cgCtx); } else { @@ -4943,24 +4937,14 @@ QRect QMacStyle::subElementRect(SubElement sr, const QStyleOption *opt, = qstyleoption_cast(opt)) { if ((buttonOpt->features & QStyleOptionButton::Flat)) break; // leave rect alone - if ((buttonOpt->features & QStyleOptionButton::CommandLinkButton)) { - rect = opt->rect; - if (controlSize == QStyleHelper::SizeLarge) - rect.adjust(+6, +4, -6, -8); - else if (controlSize == QStyleHelper::SizeSmall) - rect.adjust(+5, +4, -5, -6); - else - rect.adjust(+1, 0, -1, -2); - break; - } } rect = opt->rect; if (controlSize == QStyleHelper::SizeLarge) { - rect.adjust(0, +4, 0, -8); + rect.adjust(+6, +4, -6, -8); } else if (controlSize == QStyleHelper::SizeSmall) { - rect.adjust(0, +4, 0, -6); + rect.adjust(+5, +4, -5, -6); } else { - rect.adjust(0, 0, 0, -2); + rect.adjust(+1, 0, -1, -2); } break; case SE_RadioButtonLayoutItem: @@ -5199,7 +5183,7 @@ void QMacStyle::drawComplexControl(ComplexControl cc, const QStyleOptionComplex if (const QStyleOptionSlider *sb = qstyleoption_cast(opt)) { const bool drawTrack = sb->subControls & SC_ScrollBarGroove; - const bool drawKnob = sb->subControls & SC_ScrollBarSlider; + const bool drawKnob = sb->subControls & SC_ScrollBarSlider && sb->minimum != sb->maximum; if (!drawTrack && !drawKnob) break; @@ -6389,12 +6373,9 @@ QSize QMacStyle::sizeFromContents(ContentsType ct, const QStyleOption *opt, break; #endif case QStyle::CT_PushButton: { - bool isFlat = false; - if (const QStyleOptionButton *btn = qstyleoption_cast(opt)) { +if (const QStyleOptionButton *btn = qstyleoption_cast(opt)) if (btn->features & QStyleOptionButton::CommandLinkButton) return QCommonStyle::sizeFromContents(ct, opt, sz, widget); - isFlat = btn->features & QStyleOptionButton::Flat; - } // By default, we fit the contents inside a normal rounded push button. // Do this by add enough space around the contents so that rounded @@ -6409,24 +6390,12 @@ QSize QMacStyle::sizeFromContents(ContentsType ct, const QStyleOption *opt, // All values as measured from HIThemeGetButtonBackgroundBounds() if (controlSize != QStyleHelper::SizeMini) sz.rwidth() += 12; // We like 12 over here. - - if (controlSize == QStyleHelper::SizeLarge) { - if (!isFlat) - sz.rwidth() -= 12; - if (sz.height() > 16) - sz.rheight() += pushButtonDefaultHeight[QStyleHelper::SizeLarge] - 16; - else - sz.setHeight(pushButtonDefaultHeight[QStyleHelper::SizeLarge]); - } else { - if (!isFlat) - sz.rwidth() -= 10; - if (controlSize == QStyleHelper::SizeMini) - sz.setHeight(24); - else - sz.setHeight(pushButtonDefaultHeight[QStyleHelper::SizeSmall]); - } - if (isFlat) - sz.rwidth() -= 13; + if (controlSize == QStyleHelper::SizeLarge && sz.height() > 16) + sz.rheight() += pushButtonDefaultHeight[QStyleHelper::SizeLarge] - 16; + else if (controlSize == QStyleHelper::SizeMini) + sz.setHeight(24); // FIXME Our previous HITheme-based logic returned this. + else + sz.setHeight(pushButtonDefaultHeight[controlSize]); break; } case QStyle::CT_MenuItem: diff --git a/src/plugins/styles/windowsvista/qwindowsxpstyle.cpp b/src/plugins/styles/windowsvista/qwindowsxpstyle.cpp index 23ea4f65..11cffd8c 100644 --- a/src/plugins/styles/windowsvista/qwindowsxpstyle.cpp +++ b/src/plugins/styles/windowsvista/qwindowsxpstyle.cpp @@ -999,7 +999,7 @@ bool QWindowsXPStylePrivate::drawBackgroundThruNativeBuffer(XPThemeData &themeDa #endif img = QImage(bufferPixels, bufferW, bufferH, format); if (hasCorrectionFactor) - img = img.scaled(w, h, Qt::KeepAspectRatio, Qt::SmoothTransformation); + img = img.scaled(img.size() * correctionFactor, Qt::KeepAspectRatio, Qt::SmoothTransformation); img.setDevicePixelRatio(additionalDevicePixelRatio); } @@ -2498,7 +2498,7 @@ static void populateMdiButtonTheme(const QStyle *proxy, const QWidget *widget, // Calculate an small (max 2), empirical correction factor for scaling up // WP_MDICLOSEBUTTON, WP_MDIRESTOREBUTTON, WP_MDIMINBUTTON, which are too // small on High DPI screens (QTBUG-75927). -qreal mdiButtonCorrectionFactor(XPThemeData &theme, const QPaintDevice *pd = nullptr) +static qreal mdiButtonCorrectionFactor(XPThemeData &theme, const QPaintDevice *pd = nullptr) { const auto dpr = pd ? pd->devicePixelRatioF() : qApp->devicePixelRatio(); const QSizeF nativeSize = QSizeF(theme.size()) / dpr; diff --git a/src/printsupport/dialogs/qpagesetupdialog_win.cpp b/src/printsupport/dialogs/qpagesetupdialog_win.cpp index 464381bb..d1a377d2 100644 --- a/src/printsupport/dialogs/qpagesetupdialog_win.cpp +++ b/src/printsupport/dialogs/qpagesetupdialog_win.cpp @@ -134,10 +134,35 @@ int QPageSetupDialog::exec() QDialog::setVisible(false); if (result) { engine->setGlobalDevMode(psd.hDevNames, psd.hDevMode); - d->printer->setPageSize(QPageSize(QSizeF(psd.ptPaperSize.x / multiplier, psd.ptPaperSize.y / multiplier), - layout.units() == QPageLayout::Inch ? QPageSize::Inch : QPageSize::Millimeter)); + QPageSize pageSize; + // try to read orientation and paper size ID from the dialog's devmode struct + if (psd.hDevMode) { + DEVMODE *rDevmode = reinterpret_cast(GlobalLock(psd.hDevMode)); + if (rDevmode->dmFields & DM_ORIENTATION) { + layout.setOrientation(rDevmode->dmOrientation == DMORIENT_PORTRAIT + ? QPageLayout::Portrait : QPageLayout::Landscape); + } + if (rDevmode->dmFields & DM_PAPERSIZE) + pageSize = QPageSize::id(rDevmode->dmPaperSize); + GlobalUnlock(rDevmode); + } + // fall back to use our own matching, and assume that paper that's wider than long means landscape + if (!pageSize.isValid() || pageSize.id() == QPageSize::Custom) { + QSizeF unitSize(psd.ptPaperSize.x / multiplier, psd.ptPaperSize.y / multiplier); + if (unitSize.width() > unitSize.height()) { + layout.setOrientation(QPageLayout::Landscape); + unitSize.transpose(); + } else { + layout.setOrientation(QPageLayout::Portrait); + } + pageSize = QPageSize(unitSize, layout.units() == QPageLayout::Inch + ? QPageSize::Inch : QPageSize::Millimeter); + } + layout.setPageSize(pageSize); + const QMarginsF margins(psd.rtMargin.left, psd.rtMargin.top, psd.rtMargin.right, psd.rtMargin.bottom); - d->printer->setPageMargins(margins / multiplier, layout.units()); + layout.setMargins(margins / multiplier); + d->printer->setPageLayout(layout); // copy from our temp DEVMODE struct if (!engine->globalDevMode() && hDevMode) { diff --git a/src/printsupport/dialogs/qprintdialog_unix.cpp b/src/printsupport/dialogs/qprintdialog_unix.cpp index bf77666c..c5b845f4 100644 --- a/src/printsupport/dialogs/qprintdialog_unix.cpp +++ b/src/printsupport/dialogs/qprintdialog_unix.cpp @@ -1184,6 +1184,8 @@ void QUnixPrintWidgetPrivate::updateWidget() widget.printers->insertSeparator(widget.printers->count()); widget.printers->addItem(QPrintDialog::tr("Print to File (PDF)")); filePrintersAdded = true; + if (widget.printers->count() == 1) + _q_printerChanged(0); } if (!printToFile && filePrintersAdded) { widget.printers->removeItem(widget.printers->count()-1); diff --git a/src/sql/models/qsqltablemodel.cpp b/src/sql/models/qsqltablemodel.cpp index 4ce99e29..e1b95e46 100644 --- a/src/sql/models/qsqltablemodel.cpp +++ b/src/sql/models/qsqltablemodel.cpp @@ -1003,7 +1003,8 @@ QString QSqlTableModel::orderByClause() const //we can safely escape the field because it would have been obtained from the database //and have the correct case - QString field = d->tableName + QLatin1Char('.') + QString field = d->db.driver()->escapeIdentifier(d->tableName, QSqlDriver::TableName) + + QLatin1Char('.') + d->db.driver()->escapeIdentifier(f.name(), QSqlDriver::FieldName); field = d->sortOrder == Qt::AscendingOrder ? Sql::asc(field) : Sql::desc(field); return Sql::orderBy(field); diff --git a/src/testlib/doc/src/qttestlib-manual.qdoc b/src/testlib/doc/src/qttestlib-manual.qdoc index 8ff82ba2..84781a67 100644 --- a/src/testlib/doc/src/qttestlib-manual.qdoc +++ b/src/testlib/doc/src/qttestlib-manual.qdoc @@ -154,6 +154,12 @@ All labeled targets will be run when \c {test} target is called on the command line. + \note On Android, if you have one connected device or emulator, tests will + run on that device. If you have more than one device connected, set the + environment variable \c {ANDROID_DEVICE_SERIAL} to the + \l {Android: Query for devices}{ADB serial number} of the device that + you want to run tests on. + There are several other advantages with CMake. For example, the result of a test run can be published on a web server using CDash with virtually no effort. diff --git a/src/testlib/qabstractitemmodeltester.cpp b/src/testlib/qabstractitemmodeltester.cpp index 2348f8fd..8efb9c53 100644 --- a/src/testlib/qabstractitemmodeltester.cpp +++ b/src/testlib/qabstractitemmodeltester.cpp @@ -438,7 +438,7 @@ void QAbstractItemModelTesterPrivate::parent() // when asked for the parent of an invalid index. MODELTESTER_VERIFY(!model->parent(QModelIndex()).isValid()); - if (model->rowCount() == 0) + if (model->rowCount() == 0 || model->columnCount() == 0) return; // Column 0 | Column 1 | @@ -570,7 +570,7 @@ void QAbstractItemModelTesterPrivate::checkChildren(const QModelIndex &parent, i // recursively go down the children if (model->hasChildren(index) && currentDepth < 10) - checkChildren(index, ++currentDepth); + checkChildren(index, currentDepth + 1); // make sure that after testing the children that the index doesn't change. QModelIndex newerIndex = model->index(r, c, parent); @@ -720,12 +720,12 @@ void QAbstractItemModelTesterPrivate::rowsAboutToBeRemoved(const QModelIndex &pa Changing c; c.parent = parent; c.oldSize = model->rowCount(parent); - if (start > 0) { + if (start > 0 && model->columnCount(parent) > 0) { const QModelIndex startIndex = model->index(start - 1, 0, parent); MODELTESTER_VERIFY(startIndex.isValid()); c.last = model->data(startIndex); } - if (end < c.oldSize - 1) { + if (end < c.oldSize - 1 && model->columnCount(parent) > 0) { const QModelIndex endIndex = model->index(end + 1, 0, parent); MODELTESTER_VERIFY(endIndex.isValid()); c.next = model->data(endIndex); diff --git a/src/testlib/qtestcase.cpp b/src/testlib/qtestcase.cpp index 74507c11..c98bcbec 100644 --- a/src/testlib/qtestcase.cpp +++ b/src/testlib/qtestcase.cpp @@ -212,13 +212,13 @@ static void stackTrace() if (debuggerPresent() || hasSystemCrashReporter()) return; -#if defined(Q_OS_LINUX) || defined(Q_OS_MACOS) +#if defined(Q_OS_LINUX) || (defined(Q_OS_MACOS) && !defined(Q_PROCESSOR_ARM_64)) const int msecsFunctionTime = qRound(QTestLog::msecsFunctionTime()); const int msecsTotalTime = qRound(QTestLog::msecsTotalTime()); fprintf(stderr, "\n=== Received signal at function time: %dms, total time: %dms, dumping stack ===\n", msecsFunctionTime, msecsTotalTime); -#endif -#ifdef Q_OS_LINUX + +# ifdef Q_OS_LINUX char cmd[512]; qsnprintf(cmd, 512, "gdb --pid %d 2>/dev/null </dev/null <(p)); +} + char *QTest::toString(const void *p) { char *msg = new char[128]; diff --git a/src/testlib/qtestcase.h b/src/testlib/qtestcase.h index e1518708..6c9d23f6 100644 --- a/src/testlib/qtestcase.h +++ b/src/testlib/qtestcase.h @@ -101,6 +101,7 @@ do {\ " but no exception caught", __FILE__, __LINE__);\ return;\ } QT_CATCH (const exceptiontype &) {\ + /* success */\ }\ } QT_CATCH (const std::exception &e) {\ QByteArray msg = QByteArray() + "Expected exception of type " #exceptiontype \ @@ -110,7 +111,7 @@ do {\ } QT_CATCH (...) {\ QTest::qFail("Expected exception of type " #exceptiontype " to be thrown" \ " but unknown exception caught", __FILE__, __LINE__);\ - return;\ + QT_RETHROW;\ }\ } while (false) @@ -283,7 +284,8 @@ namespace QTest Q_TESTLIB_EXPORT char *toPrettyCString(const char *unicode, int length); Q_TESTLIB_EXPORT char *toPrettyUnicode(QStringView string); Q_TESTLIB_EXPORT char *toString(const char *); - Q_TESTLIB_EXPORT char *toString(const void *); + Q_TESTLIB_EXPORT char *toString(const volatile void *); + Q_TESTLIB_EXPORT char *toString(const void *); // ### FIXME: Qt 7: Remove Q_TESTLIB_EXPORT void qInit(QObject *testObject, int argc = 0, char **argv = nullptr); Q_TESTLIB_EXPORT int qRun(); diff --git a/src/testlib/qtestcase.qdoc b/src/testlib/qtestcase.qdoc index e39b4702..dd5ec762 100644 --- a/src/testlib/qtestcase.qdoc +++ b/src/testlib/qtestcase.qdoc @@ -149,15 +149,24 @@ \relates QTest - The QVERIFY_EXCEPTION_THROWN macro executes an \a expression and tries - to catch an exception thrown from the \a expression. If the \a expression - throws an exception and its type is the same as \a exceptiontype - or \a exceptiontype is substitutable with the type of thrown exception - (i.e. usually the type of thrown exception is publicly derived - from \a exceptiontype) then execution will be continued. If not-substitutable - type of exception is thrown or the \a expression doesn't throw an exception - at all, then a failure will be recorded in the test log and - the test won't be executed further. + The QVERIFY_EXCEPTION_THROWN macro executes \a expression + and tries to catch an exception thrown from \a expression. + + There are several possible outcomes: + + \list + \li If \a expression throws an exception that is either the same as + \a exceptiontype or derived from \a exceptiontype, then execution will continue. + + \li Otherwise, if \a expression throws no exception, or the + exception thrown derives from \c{std::exception}, then a failure + will be recorded in the test log and the macro returns early + (from enclosing function). + + \li If the thrown exception derives neither from \c{std::exception} nor from + \a exceptiontype, a failure will be recorded in the test log, and the exception is + re-thrown. This avoids problems with e.g. pthread cancellation exceptions. + \endlist \note This macro can only be used in a test function that is invoked by the test framework. diff --git a/src/testlib/qtestlog.cpp b/src/testlib/qtestlog.cpp index da9626a5..8917f0dc 100644 --- a/src/testlib/qtestlog.cpp +++ b/src/testlib/qtestlog.cpp @@ -338,6 +338,8 @@ void QTestLog::addXFail(const char *msg, const char *file, int line) QTEST_ASSERT(msg); QTEST_ASSERT(file); + // Will be counted in addPass() if we get there. + FOREACH_TEST_LOGGER logger->addIncident(QAbstractTestLogger::XFail, msg, file, line); } @@ -390,7 +392,7 @@ void QTestLog::addBXFail(const char *msg, const char *file, int line) QTEST_ASSERT(msg); QTEST_ASSERT(file); - ++QTest::blacklists; + // Will be counted in addBPass() if we get there. FOREACH_TEST_LOGGER logger->addIncident(QAbstractTestLogger::BlacklistedXFail, msg, file, line); diff --git a/src/tools/androiddeployqt/main.cpp b/src/tools/androiddeployqt/main.cpp index abd015b2..de746d2e 100644 --- a/src/tools/androiddeployqt/main.cpp +++ b/src/tools/androiddeployqt/main.cpp @@ -174,7 +174,7 @@ struct Options QString versionName; QString versionCode; QByteArray minSdkVersion{"21"}; - QByteArray targetSdkVersion{"29"}; + QByteArray targetSdkVersion{"30"}; // lib c++ path QString stdCppPath; @@ -2260,9 +2260,9 @@ static GradleProperties readGradleProperties(const QString &path) if (line.trimmed().startsWith('#')) continue; - QList prop(line.split('=')); - if (prop.size() > 1) - properties[prop.at(0).trimmed()] = prop.at(1).trimmed(); + const int idx = line.indexOf('='); + if (idx > -1) + properties[line.left(idx).trimmed()] = line.mid(idx + 1).trimmed(); } file.close(); return properties; @@ -2465,7 +2465,7 @@ QString packagePath(const Options &options, PackageType pt) path += QLatin1String(".aab"); } } - return shellQuote(path); + return path; } bool installApk(const Options &options) @@ -2592,9 +2592,10 @@ bool jarSignerSignPackage(const Options &options) auto signPackage = [&](const QString &file) { fprintf(stdout, "Signing file %s\n", qPrintable(file)); fflush(stdout); - auto command = jarSignerTool + QLatin1String(" %1 %2") - .arg(file) - .arg(shellQuote(options.keyStoreAlias)); + QString command = jarSignerTool + + QLatin1String(" %1 %2") + .arg(shellQuote(file)) + .arg(shellQuote(options.keyStoreAlias)); FILE *jarSignerCommand = openProcess(command); if (jarSignerCommand == 0) { @@ -2640,10 +2641,10 @@ bool jarSignerSignPackage(const Options &options) } zipAlignTool = QLatin1String("%1%2 -f 4 %3 %4") - .arg(shellQuote(zipAlignTool), - options.verbose ? QLatin1String(" -v") : QLatin1String(), - packagePath(options, UnsignedAPK), - packagePath(options, SignedAPK)); + .arg(shellQuote(zipAlignTool), + options.verbose ? QLatin1String(" -v") : QLatin1String(), + shellQuote(packagePath(options, UnsignedAPK)), + shellQuote(packagePath(options, SignedAPK))); FILE *zipAlignCommand = openProcess(zipAlignTool); if (zipAlignCommand == 0) { @@ -2694,28 +2695,54 @@ bool signPackage(const Options &options) } } - zipAlignTool = QLatin1String("%1%2 -f 4 %3 %4") - .arg(shellQuote(zipAlignTool), - options.verbose ? QLatin1String(" -v") : QLatin1String(), - packagePath(options, UnsignedAPK), - packagePath(options, SignedAPK)); + auto zipalignRunner = [](const QString &zipAlignCommandLine) { + FILE *zipAlignCommand = openProcess(zipAlignCommandLine); + if (zipAlignCommand == 0) { + fprintf(stderr, "Couldn't run zipalign.\n"); + return false; + } - FILE *zipAlignCommand = openProcess(zipAlignTool); - if (zipAlignCommand == 0) { - fprintf(stderr, "Couldn't run zipalign.\n"); - return false; - } + char buffer[512]; + while (fgets(buffer, sizeof(buffer), zipAlignCommand) != 0) + fprintf(stdout, "%s", buffer); - char buffer[512]; - while (fgets(buffer, sizeof(buffer), zipAlignCommand) != 0) - fprintf(stdout, "%s", buffer); + return pclose(zipAlignCommand) == 0; + }; - int errorCode = pclose(zipAlignCommand); - if (errorCode != 0) { - fprintf(stderr, "zipalign command failed.\n"); - if (!options.verbose) - fprintf(stderr, " -- Run with --verbose for more information.\n"); - return false; + const QString verifyZipAlignCommandLine = + QLatin1String("%1%2 -c 4 %3") + .arg(shellQuote(zipAlignTool), + options.verbose ? QLatin1String(" -v") : QLatin1String(), + shellQuote(packagePath(options, UnsignedAPK))); + + if (zipalignRunner(verifyZipAlignCommandLine)) { + if (options.verbose) + fprintf(stdout, "APK already aligned, copying it for signing.\n"); + + if (QFile::exists(packagePath(options, SignedAPK))) + QFile::remove(packagePath(options, SignedAPK)); + + if (!QFile::copy(packagePath(options, UnsignedAPK), packagePath(options, SignedAPK))) { + fprintf(stderr, "Could not copy unsigned APK.\n"); + return false; + } + } else { + if (options.verbose) + fprintf(stdout, "APK not aligned, aligning it for signing.\n"); + + const QString zipAlignCommandLine = + QLatin1String("%1%2 -f 4 %3 %4") + .arg(shellQuote(zipAlignTool), + options.verbose ? QLatin1String(" -v") : QLatin1String(), + shellQuote(packagePath(options, UnsignedAPK)), + shellQuote(packagePath(options, SignedAPK))); + + if (!zipalignRunner(zipAlignCommandLine)) { + fprintf(stderr, "zipalign command failed.\n"); + if (!options.verbose) + fprintf(stderr, " -- Run with --verbose for more information.\n"); + return false; + } } QString apkSignerCommandLine = QLatin1String("%1 sign --ks %2") @@ -2733,8 +2760,7 @@ bool signPackage(const Options &options) if (options.verbose) apkSignerCommandLine += QLatin1String(" --verbose"); - apkSignerCommandLine += QLatin1String(" %1") - .arg(packagePath(options, SignedAPK)); + apkSignerCommandLine += QLatin1String(" %1").arg(shellQuote(packagePath(options, SignedAPK))); auto apkSignerRunner = [&] { FILE *apkSignerCommand = openProcess(apkSignerCommandLine); @@ -2747,7 +2773,7 @@ bool signPackage(const Options &options) while (fgets(buffer, sizeof(buffer), apkSignerCommand) != 0) fprintf(stdout, "%s", buffer); - errorCode = pclose(apkSignerCommand); + int errorCode = pclose(apkSignerCommand); if (errorCode != 0) { fprintf(stderr, "apksigner command failed.\n"); if (!options.verbose) @@ -2761,8 +2787,9 @@ bool signPackage(const Options &options) if (!apkSignerRunner()) return false; - apkSignerCommandLine = QLatin1String("%1 verify --verbose %2") - .arg(shellQuote(apksignerTool), packagePath(options, SignedAPK)); + apkSignerCommandLine = + QLatin1String("%1 verify --verbose %2") + .arg(shellQuote(apksignerTool), shellQuote(packagePath(options, SignedAPK))); // Verify the package and remove the unsigned apk return apkSignerRunner() && QFile::remove(packagePath(options, UnsignedAPK)); diff --git a/src/tools/moc/moc.cpp b/src/tools/moc/moc.cpp index 28c7a43c..27a68fe9 100644 --- a/src/tools/moc/moc.cpp +++ b/src/tools/moc/moc.cpp @@ -219,6 +219,7 @@ Type Moc::parseType() case DOUBLE: case VOID: case BOOL: + case AUTO: type.name += lexem(); isVoid |= (lookup(0) == VOID); break; @@ -457,15 +458,6 @@ bool Moc::parseFunction(FunctionDef *def, bool inMacro) scopedFunctionName = tempType.isScoped; } - // we don't support references as return types, it's too dangerous - if (def->type.referenceType == Type::Reference) { - QByteArray rawName = def->type.rawName; - def->type = Type("void"); - def->type.rawName = rawName; - } - - def->normalizedType = normalizeType(def->type.name); - if (!test(RPAREN)) { parseFunctionArguments(def); next(RPAREN); @@ -488,6 +480,10 @@ bool Moc::parseFunction(FunctionDef *def, bool inMacro) next(LPAREN); until(RPAREN); } + + if (def->type.name == "auto" && test(ARROW)) + def->type = parseType(); // Parse trailing return-type + if (test(SEMIC)) ; else if ((def->inlineCode = test(LBRACE))) @@ -505,6 +501,22 @@ bool Moc::parseFunction(FunctionDef *def, bool inMacro) warning(msg.constData()); return false; } + + QList typeNameParts = normalizeType(def->type.name).split(' '); + if (typeNameParts.contains("auto")) { + // We expected a trailing return type but we haven't seen one + error("Function declared with auto as return type but missing trailing return type. " + "Return type deduction is not supported."); + } + + // we don't support references as return types, it's too dangerous + if (def->type.referenceType == Type::Reference) { + QByteArray rawName = def->type.rawName; + def->type = Type("void"); + def->type.rawName = rawName; + } + + def->normalizedType = normalizeType(def->type.name); return true; } diff --git a/src/tools/uic/python/pythonwriteimports.cpp b/src/tools/uic/python/pythonwriteimports.cpp index f8d5e967..b1652874 100644 --- a/src/tools/uic/python/pythonwriteimports.cpp +++ b/src/tools/uic/python/pythonwriteimports.cpp @@ -39,9 +39,9 @@ QT_BEGIN_NAMESPACE static const char *standardImports = -R"I(from PySide2.QtCore import * -from PySide2.QtGui import * -from PySide2.QtWidgets import * +R"I(from PySide2.QtCore import * # type: ignore +from PySide2.QtGui import * # type: ignore +from PySide2.QtWidgets import * # type: ignore )I"; // Change the name of a qrc file "dir/foo.qrc" file to the Python diff --git a/src/widgets/dialogs/qfilesystemmodel.cpp b/src/widgets/dialogs/qfilesystemmodel.cpp index 0db06e9b..68768b66 100644 --- a/src/widgets/dialogs/qfilesystemmodel.cpp +++ b/src/widgets/dialogs/qfilesystemmodel.cpp @@ -397,8 +397,11 @@ QFileSystemModelPrivate::QFileSystemNode *QFileSystemModelPrivate::node(const QS if (absolutePath.endsWith(QLatin1Char('/'))) trailingSeparator = QLatin1String("\\"); int r = 0; - QFileSystemModelPrivate::QFileSystemNode *rootNode = const_cast(&root); - if (!root.children.contains(host.toLower())) { + auto rootNode = const_cast(&root); + auto it = root.children.constFind(host); + if (it != root.children.cend()) { + host = it.key(); // Normalize case for lookup in visibleLocation() + } else { if (pathElements.count() == 1 && !absolutePath.endsWith(QLatin1Char('/'))) return rootNode; QFileInfo info(host); @@ -723,6 +726,9 @@ QVariant QFileSystemModel::data(const QModelIndex &index, int role) const switch (role) { case Qt::EditRole: + if (index.column() == 0) + return d->name(index); + Q_FALLTHROUGH(); case Qt::DisplayRole: switch (index.column()) { case 0: return d->displayName(index); diff --git a/src/widgets/dialogs/qfontdialog.cpp b/src/widgets/dialogs/qfontdialog.cpp index 8e428049..5dd40eaa 100644 --- a/src/widgets/dialogs/qfontdialog.cpp +++ b/src/widgets/dialogs/qfontdialog.cpp @@ -593,6 +593,14 @@ void QFontDialogPrivate::updateStyles() cstyle.replace(QLatin1String("Oblique"), QLatin1String("Italic")); first = false; goto redo; + } else if (cstyle.contains(QLatin1String("Regular"))) { + cstyle.replace(QLatin1String("Regular"), QLatin1String("Normal")); + first = false; + goto redo; + } else if (cstyle.contains(QLatin1String("Normal"))) { + cstyle.replace(QLatin1String("Normal"), QLatin1String("Regular")); + first = false; + goto redo; } } if (!found) diff --git a/src/widgets/dialogs/qmessagebox.cpp b/src/widgets/dialogs/qmessagebox.cpp index 4e7a4a65..be6b4a23 100644 --- a/src/widgets/dialogs/qmessagebox.cpp +++ b/src/widgets/dialogs/qmessagebox.cpp @@ -2046,7 +2046,7 @@ int QMessageBoxPrivate::showOldMessageBox(QWidget *parent, QMessageBox::Icon ico void QMessageBoxPrivate::retranslateStrings() { #if QT_CONFIG(textedit) - if (detailsButton) + if (detailsButton && detailsText) detailsButton->setLabel(detailsText->isHidden() ? ShowLabel : HideLabel); #endif } diff --git a/src/widgets/doc/src/guibooks.qdoc b/src/widgets/doc/src/guibooks.qdoc index 30ffd0b5..b245e09b 100644 --- a/src/widgets/doc/src/guibooks.qdoc +++ b/src/widgets/doc/src/guibooks.qdoc @@ -88,17 +88,4 @@ recognize, find and activate them. This book explains these goals from scratch and how to reach them, both with single icons and icon families. Some 500 examples are scattered throughout the text. - - - \section1 Buying these Books from Amazon.com - - These books are made available in association with Amazon.com, our - favorite online bookstore. Here is more information about - \link http://www.amazon.com/exec/obidos/subst/help/shipping-policy.html/t - Amazon.com's shipping options\endlink and its - \link http://www.amazon.com/exec/obidos/subst/help/desk.html/t - customer service.\endlink When you buy a book by following one of these - links, Amazon.com gives about 15% of the purchase price to - \link http://www.amnesty.org/ Amnesty International.\endlink - */ diff --git a/src/widgets/doc/src/widgets-and-layouts/stylesheet.qdoc b/src/widgets/doc/src/widgets-and-layouts/stylesheet.qdoc index 3319b032..8dc68117 100644 --- a/src/widgets/doc/src/widgets-and-layouts/stylesheet.qdoc +++ b/src/widgets/doc/src/widgets-and-layouts/stylesheet.qdoc @@ -2167,7 +2167,7 @@ subclasses, QAbstractSpinBox subclasses, QCheckBox, QComboBox, QFrame, QGroupBox, QLabel, QLineEdit, QMenu, QMenuBar, QPushButton, QRadioButton, QSizeGrip, QSpinBox, - QSplitter, QStatusBar, QTextEdit, and QToolTip. + QSplitter, QStatusBar, QTextEdit, QToolButton, and QToolTip. If this property is not specified, the minimum height is derived based on the widget's contents and the style. @@ -2179,6 +2179,9 @@ \snippet code/doc_src_stylesheet.qdoc 66 + \note Setting this property might allow widgets to shrink + smaller than the space required for the contents. + See also \l{#min-width-prop}{min-width}. \row @@ -2190,7 +2193,7 @@ subclasses, QAbstractSpinBox subclasses, QCheckBox, QComboBox, QFrame, QGroupBox, QLabel, QLineEdit, QMenu, QMenuBar, QPushButton, QRadioButton, QSizeGrip, QSpinBox, - QSplitter, QStatusBar, QTextEdit, and QToolTip. + QSplitter, QStatusBar, QTextEdit, QToolButton, and QToolTip. If this property is not specified, the minimum width is derived based on the widget's contents and the style. @@ -2202,6 +2205,9 @@ \snippet code/doc_src_stylesheet.qdoc 67 + \note Setting this property might allow widgets to shrink + smaller than the space required for the contents. + See also \l{#min-height-prop}{min-height}. \row diff --git a/src/widgets/graphicsview/qgraphicsitem.cpp b/src/widgets/graphicsview/qgraphicsitem.cpp index 38cab60f..944bd95c 100644 --- a/src/widgets/graphicsview/qgraphicsitem.cpp +++ b/src/widgets/graphicsview/qgraphicsitem.cpp @@ -2297,7 +2297,7 @@ void QGraphicsItem::setToolTip(const QString &toolTip) If no cursor has been set, the cursor of the item beneath is used. \sa setCursor(), hasCursor(), unsetCursor(), QWidget::cursor, - QApplication::overrideCursor() + QGuiApplication::overrideCursor() */ QCursor QGraphicsItem::cursor() const { @@ -2317,7 +2317,7 @@ QCursor QGraphicsItem::cursor() const If no cursor has been set, the cursor of the item beneath is used. \sa cursor(), hasCursor(), unsetCursor(), QWidget::cursor, - QApplication::overrideCursor() + QGuiApplication::overrideCursor() */ void QGraphicsItem::setCursor(const QCursor &cursor) { @@ -10297,6 +10297,7 @@ bool QGraphicsTextItem::sceneEvent(QEvent *event) case QEvent::GraphicsSceneMouseRelease: case QEvent::KeyPress: case QEvent::KeyRelease: + case QEvent::InputMethod: // Reset the focus widget's input context, regardless // of how this item gained or lost focus. if (event->type() == QEvent::FocusIn || event->type() == QEvent::FocusOut) { @@ -10516,14 +10517,16 @@ QVariant QGraphicsTextItem::inputMethodQuery(Qt::InputMethodQuery query) const v = int(inputMethodHints()); else if (dd->control) v = dd->control->inputMethodQuery(query, QVariant()); - if (v.userType() == QMetaType::QRectF) - v = v.toRectF().translated(-dd->controlOffset()); - else if (v.userType() == QMetaType::QPointF) - v = v.toPointF() - dd->controlOffset(); - else if (v.userType() == QMetaType::QRect) - v = v.toRect().translated(-dd->controlOffset().toPoint()); - else if (v.userType() == QMetaType::QPoint) - v = v.toPoint() - dd->controlOffset().toPoint(); + if (dd->control) { + if (v.userType() == QMetaType::QRectF) + v = v.toRectF().translated(-dd->controlOffset()); + else if (v.userType() == QMetaType::QPointF) + v = v.toPointF() - dd->controlOffset(); + else if (v.userType() == QMetaType::QRect) + v = v.toRect().translated(-dd->controlOffset().toPoint()); + else if (v.userType() == QMetaType::QPoint) + v = v.toPoint() - dd->controlOffset().toPoint(); + } return v; } diff --git a/src/widgets/graphicsview/qgraphicsproxywidget.cpp b/src/widgets/graphicsview/qgraphicsproxywidget.cpp index 36c65920..e4253e92 100644 --- a/src/widgets/graphicsview/qgraphicsproxywidget.cpp +++ b/src/widgets/graphicsview/qgraphicsproxywidget.cpp @@ -832,6 +832,10 @@ bool QGraphicsProxyWidget::event(QEvent *event) return QGraphicsWidget::event(event); switch (event->type()) { + case QEvent::WindowActivate: + case QEvent::WindowDeactivate: + QCoreApplication::sendEvent(d->widget, event); + break; case QEvent::StyleChange: // Propagate style changes to the embedded widget. if (!d->styleChangeMode) { @@ -1551,6 +1555,10 @@ void QGraphicsProxyWidget::paint(QPainter *painter, const QStyleOptionGraphicsIt if (exposedWidgetRect.isEmpty()) return; + // When rendering to pdf etc. painting may go outside widget boundaries unless clipped + if (painter->device()->devType() != QInternal::Widget && (flags() & ItemClipsChildrenToShape)) + painter->setClipRect(d->widget->geometry(), Qt::IntersectClip); + d->widget->render(painter, exposedWidgetRect.topLeft(), exposedWidgetRect); } diff --git a/src/widgets/itemviews/qabstractitemdelegate.cpp b/src/widgets/itemviews/qabstractitemdelegate.cpp index c5b22b56..e120817e 100644 --- a/src/widgets/itemviews/qabstractitemdelegate.cpp +++ b/src/widgets/itemviews/qabstractitemdelegate.cpp @@ -389,10 +389,12 @@ bool QAbstractItemDelegate::helpEvent(QHelpEvent *event, { if (!event || !view) return false; - Q_D(QAbstractItemDelegate); + Q_UNUSED(index); + Q_UNUSED(option); switch (event->type()) { #ifndef QT_NO_TOOLTIP case QEvent::ToolTip: { + Q_D(QAbstractItemDelegate); QHelpEvent *he = static_cast(event); const int precision = inherits("QItemDelegate") ? 10 : 6; // keep in sync with DBL_DIG in qitemdelegate.cpp const QString tooltip = index.isValid() ? @@ -413,6 +415,7 @@ bool QAbstractItemDelegate::helpEvent(QHelpEvent *event, event->setAccepted(index.data(Qt::WhatsThisRole).isValid()); break; case QEvent::WhatsThis: { + Q_D(QAbstractItemDelegate); QHelpEvent *he = static_cast(event); const int precision = inherits("QItemDelegate") ? 10 : 6; // keep in sync with DBL_DIG in qitemdelegate.cpp const QString whatsthis = index.isValid() ? @@ -423,6 +426,7 @@ bool QAbstractItemDelegate::helpEvent(QHelpEvent *event, break; } #endif + case QEvent::None: default: break; } diff --git a/src/widgets/itemviews/qabstractitemview.cpp b/src/widgets/itemviews/qabstractitemview.cpp index b8cc5621..5e65c597 100644 --- a/src/widgets/itemviews/qabstractitemview.cpp +++ b/src/widgets/itemviews/qabstractitemview.cpp @@ -87,6 +87,7 @@ QAbstractItemViewPrivate::QAbstractItemViewPrivate() pressedModifiers(Qt::NoModifier), pressedPosition(QPoint(-1, -1)), pressedAlreadySelected(false), + releaseFromDoubleClick(false), viewportEnteredNeeded(false), state(QAbstractItemView::NoState), stateBeforeAnimation(QAbstractItemView::NoState), @@ -1754,6 +1755,7 @@ bool QAbstractItemView::viewportEvent(QEvent *event) void QAbstractItemView::mousePressEvent(QMouseEvent *event) { Q_D(QAbstractItemView); + d->releaseFromDoubleClick = false; d->delayedAutoScroll.stop(); //any interaction with the view cancel the auto scrolling QPoint pos = event->pos(); QPersistentModelIndex index = indexAt(pos); @@ -1899,6 +1901,8 @@ void QAbstractItemView::mouseMoveEvent(QMouseEvent *event) void QAbstractItemView::mouseReleaseEvent(QMouseEvent *event) { Q_D(QAbstractItemView); + const bool releaseFromDoubleClick = d->releaseFromDoubleClick; + d->releaseFromDoubleClick = false; QPoint pos = event->pos(); QPersistentModelIndex index = indexAt(pos); @@ -1911,7 +1915,7 @@ void QAbstractItemView::mouseReleaseEvent(QMouseEvent *event) return; } - bool click = (index == d->pressedIndex && index.isValid()); + bool click = (index == d->pressedIndex && index.isValid() && !releaseFromDoubleClick); bool selectedClicked = click && (event->button() == Qt::LeftButton) && d->pressedAlreadySelected; EditTrigger trigger = (selectedClicked ? SelectedClicked : NoEditTriggers); const bool edited = click ? edit(index, trigger, event) : false; @@ -1964,7 +1968,7 @@ void QAbstractItemView::mouseDoubleClickEvent(QMouseEvent *event) if ((event->button() == Qt::LeftButton) && !edit(persistent, DoubleClicked, event) && !style()->styleHint(QStyle::SH_ItemView_ActivateItemOnSingleClick, nullptr, this)) emit activated(persistent); - d->pressedIndex = QModelIndex(); + d->releaseFromDoubleClick = true; } #if QT_CONFIG(draganddrop) diff --git a/src/widgets/itemviews/qabstractitemview_p.h b/src/widgets/itemviews/qabstractitemview_p.h index 33924799..7532cf57 100644 --- a/src/widgets/itemviews/qabstractitemview_p.h +++ b/src/widgets/itemviews/qabstractitemview_p.h @@ -385,6 +385,7 @@ public: Qt::KeyboardModifiers pressedModifiers; QPoint pressedPosition; bool pressedAlreadySelected; + bool releaseFromDoubleClick; //forces the next mouseMoveEvent to send the viewportEntered signal //if the mouse is over the viewport and not over an item diff --git a/src/widgets/itemviews/qlistview.cpp b/src/widgets/itemviews/qlistview.cpp index 2d33759d..2b344766 100644 --- a/src/widgets/itemviews/qlistview.cpp +++ b/src/widgets/itemviews/qlistview.cpp @@ -572,6 +572,8 @@ void QListView::scrollTo(const QModelIndex &index, ScrollHint hint) return; const QRect rect = visualRect(index); + if (!rect.isValid()) + return; if (hint == EnsureVisible && d->viewport->rect().contains(rect)) { d->viewport->update(rect); return; @@ -2930,6 +2932,8 @@ bool QIconModeViewBase::filterDropEvent(QDropEvent *e) dd->stopAutoScroll(); draggedItems.clear(); dd->emitIndexesMoved(indexes); + // do not delete item on internal move, see filterStartDrag() + dd->dropEventMoved = true; e->accept(); // we have handled the event // if the size has not grown, we need to check if it has shrinked if (contentsSize != contents) { diff --git a/src/widgets/itemviews/qtreeview.cpp b/src/widgets/itemviews/qtreeview.cpp index b778ef9a..6ab6576c 100644 --- a/src/widgets/itemviews/qtreeview.cpp +++ b/src/widgets/itemviews/qtreeview.cpp @@ -1448,7 +1448,8 @@ void QTreeViewPrivate::adjustViewOptionsForIndex(QStyleOptionViewItem *option, c void QTreeView::drawTree(QPainter *painter, const QRegion ®ion) const { Q_D(const QTreeView); - const QVector viewItems = d->viewItems; + // d->viewItems changes when posted layouts are executed in itemDecorationAt, so don't copy + const QVector &viewItems = d->viewItems; QStyleOptionViewItem option = d->viewOptionsV1(); const QStyle::State state = option.state; @@ -1947,7 +1948,7 @@ void QTreeView::mouseDoubleClickEvent(QMouseEvent *event) if (!style()->styleHint(QStyle::SH_ItemView_ActivateItemOnSingleClick, nullptr, this)) emit activated(persistent); - d->pressedIndex = QModelIndex(); + d->releaseFromDoubleClick = true; d->executePostedLayout(); // we need to make sure viewItems is updated if (d->itemsExpandable && d->expandsOnDoubleClick @@ -2664,7 +2665,10 @@ QSize QTreeView::viewportSizeHint() const \since 4.2 Expands all expandable items. - \warning: if the model contains a large number of items, + \note This function will not try to \l{QAbstractItemModel::fetchMore}{fetch more} + data. + + \warning If the model contains a large number of items, this function will take some time to execute. \sa collapseAll(), expand(), collapse(), setExpanded() @@ -2686,7 +2690,10 @@ void QTreeView::expandAll() A \a depth of -1 will expand all children, a \a depth of 0 will only expand the given \a index. - \warning: if the model contains a large number of items, + \note This function will not try to \l{QAbstractItemModel::fetchMore}{fetch more} + data. + + \warning If the model contains a large number of items, this function will take some time to execute. \sa expandAll() @@ -2751,6 +2758,9 @@ void QTreeView::collapseAll() \since 4.3 Expands all expandable items to the given \a depth. + \note This function will not try to \l{QAbstractItemModel::fetchMore}{fetch more} + data. + \sa expandAll(), collapseAll(), expand(), collapse(), setExpanded() */ void QTreeView::expandToDepth(int depth) @@ -3459,6 +3469,7 @@ int QTreeViewPrivate::indentationForItem(int item) const int QTreeViewPrivate::itemHeight(int item) const { + Q_ASSERT(item < viewItems.count()); if (uniformRowHeights) return defaultItemHeight; if (viewItems.isEmpty()) diff --git a/src/widgets/itemviews/qtreewidget.cpp b/src/widgets/itemviews/qtreewidget.cpp index b795b79c..94756049 100644 --- a/src/widgets/itemviews/qtreewidget.cpp +++ b/src/widgets/itemviews/qtreewidget.cpp @@ -508,22 +508,18 @@ bool QTreeModel::insertColumns(int column, int count, const QModelIndex &parent) bool QTreeModel::removeRows(int row, int count, const QModelIndex &parent) { if (count < 1 || row < 0 || (row + count) > rowCount(parent)) return false; - - beginRemoveRows(parent, row, row + count - 1); - - QSignalBlocker blocker(this); - - QTreeWidgetItem *itm = item(parent); + QTreeWidgetItem *parentItem = item(parent); + // if parentItem is valid, begin/end RemoveRows is handled by takeChild below + if (!parentItem) + beginRemoveRows(parent, row, row + count - 1); for (int i = row + count - 1; i >= row; --i) { - QTreeWidgetItem *child = itm ? itm->takeChild(i) : rootItem->children.takeAt(i); + QTreeWidgetItem *child = parentItem ? parentItem->takeChild(i) : rootItem->children.takeAt(i); Q_ASSERT(child); child->view = nullptr; delete child; - child = nullptr; } - blocker.unblock(); - - endRemoveRows(); + if (!parentItem) + endRemoveRows(); return true; } @@ -2601,9 +2597,6 @@ void QTreeWidgetPrivate::_q_dataChanged(const QModelIndex &topLeft, This signal is emitted when the specified \a item is expanded so that all of its children are displayed. - \note This signal will not be emitted if an item changes its state when - expandAll() is invoked. - \sa QTreeWidgetItem::isExpanded(), itemCollapsed(), expandItem() */ diff --git a/src/widgets/kernel/qaction.cpp b/src/widgets/kernel/qaction.cpp index 64b0d69f..715a7443 100644 --- a/src/widgets/kernel/qaction.cpp +++ b/src/widgets/kernel/qaction.cpp @@ -1304,8 +1304,7 @@ bool QAction::isIconVisibleInMenu() const shown via a context menu, when it is false, it is not shown. The default is to follow whether the Qt::AA_DontShowShortcutsInContextMenus attribute - is set for the application, falling back to the widget style hint. - Explicitly setting this property overrides the presence (or abscence) of the attribute. + is set for the application. Explicitly setting this property overrides the attribute. \sa QAction::shortcut, QCoreApplication::setAttribute() */ @@ -1327,8 +1326,7 @@ bool QAction::isShortcutVisibleInContextMenu() const { Q_D(const QAction); if (d->shortcutVisibleInContextMenu == -1) { - return !QCoreApplication::testAttribute(Qt::AA_DontShowShortcutsInContextMenus) - && QGuiApplication::styleHints()->showShortcutsInContextMenus(); + return !QCoreApplication::testAttribute(Qt::AA_DontShowShortcutsInContextMenus); } return d->shortcutVisibleInContextMenu; } diff --git a/src/widgets/kernel/qapplication.cpp b/src/widgets/kernel/qapplication.cpp index 62e18816..619f2e73 100644 --- a/src/widgets/kernel/qapplication.cpp +++ b/src/widgets/kernel/qapplication.cpp @@ -2135,7 +2135,10 @@ QWidget *QApplicationPrivate::focusNextPrevChild_helper(QWidget *toplevel, bool // \a next). This is to ensure that we can tab in and out of compound widgets // without getting stuck in a tab-loop between parent and child. QWidget *focusProxy = test->d_func()->deepestFocusProxy(); - const bool canTakeFocus = ((focusProxy ? focusProxy->focusPolicy() : test->focusPolicy()) + auto effectiveFocusPolicy = [](QWidget *widget) { + return widget->isEnabled() ? widget->focusPolicy() : Qt::NoFocus; + }; + const bool canTakeFocus = (effectiveFocusPolicy(focusProxy ? focusProxy : test) & focus_flag) == focus_flag; const bool composites = focusProxy ? (next ? focusProxy->isAncestorOf(test) : test->isAncestorOf(focusProxy)) diff --git a/src/widgets/kernel/qlayout.cpp b/src/widgets/kernel/qlayout.cpp index d4ff9083..09bc15da 100644 --- a/src/widgets/kernel/qlayout.cpp +++ b/src/widgets/kernel/qlayout.cpp @@ -1386,6 +1386,11 @@ QRect QLayout::alignmentRect(const QRect &r) const */ void QLayout::removeWidget(QWidget *widget) { + if (Q_UNLIKELY(!widget)) { + qWarning("QLayout::removeWidget: Cannot remove a null widget."); + return; + } + int i = 0; QLayoutItem *child; while ((child = itemAt(i))) { diff --git a/src/widgets/kernel/qsizepolicy.h b/src/widgets/kernel/qsizepolicy.h index f26923ee..f275add9 100644 --- a/src/widgets/kernel/qsizepolicy.h +++ b/src/widgets/kernel/qsizepolicy.h @@ -133,9 +133,10 @@ public: Q_DECL_RELAXED_CONSTEXPR void setVerticalPolicy(Policy d) noexcept { bits.verPolicy = d; } void setControlType(ControlType type) noexcept; + // ### Qt 7: consider making Policy a QFlags and removing these casts QT_SIZEPOLICY_CONSTEXPR Qt::Orientations expandingDirections() const noexcept { - return ( (verticalPolicy() & ExpandFlag) ? Qt::Vertical : Qt::Orientations() ) - | ( (horizontalPolicy() & ExpandFlag) ? Qt::Horizontal : Qt::Orientations() ) ; + return ( (verticalPolicy() & static_cast(ExpandFlag)) ? Qt::Vertical : Qt::Orientations() ) + | ( (horizontalPolicy() & static_cast(ExpandFlag)) ? Qt::Horizontal : Qt::Orientations() ) ; } Q_DECL_RELAXED_CONSTEXPR void setHeightForWidth(bool b) noexcept { bits.hfw = b; } diff --git a/src/widgets/kernel/qwidget.cpp b/src/widgets/kernel/qwidget.cpp index dbdd67fa..9eba1e00 100644 --- a/src/widgets/kernel/qwidget.cpp +++ b/src/widgets/kernel/qwidget.cpp @@ -783,6 +783,8 @@ void QWidget::setAutoFillBackground(bool enabled) and a compositing window manager. \li Windows: The widget needs to have the Qt::FramelessWindowHint window flag set for the translucency to work. + \li \macos: The widget needs to have the Qt::FramelessWindowHint window flag set + for the translucency to work. \endlist @@ -2958,9 +2960,9 @@ bool QWidget::isFullScreen() const Calling this function only affects \l{isWindow()}{windows}. - To return from full-screen mode, call showNormal(). + To return from full-screen mode, call showNormal() or close(). - Full-screen mode works fine under Windows, but has certain + \note Full-screen mode works fine under Windows, but has certain problems under X. These problems are due to limitations of the ICCCM protocol that specifies the communication between X11 clients and the window manager. ICCCM simply does not understand @@ -2980,7 +2982,14 @@ bool QWidget::isFullScreen() const X11 window managers that follow modern post-ICCCM specifications support full-screen mode properly. - \sa showNormal(), showMaximized(), show(), hide(), isVisible() + On macOS, showing a window full screen puts the entire application in + full-screen mode, providing it with a dedicated desktop. Showing another + window while the application runs in full-screen mode might automatically + make that window full screen as well. To prevent that, exit full-screen + mode by calling showNormal() or by close() on the full screen window + before showing another window. + + \sa showNormal(), showMaximized(), show(), isVisible(), close() */ void QWidget::showFullScreen() { @@ -4682,7 +4691,9 @@ void QWidgetPrivate::resolveLayoutDirection() /*! \property QWidget::layoutDirection - \brief the layout direction for this widget + \brief the layout direction for this widget. + + \note This method no longer affects text layout direction since Qt 4.7. By default, this property is set to Qt::LeftToRight. @@ -4693,7 +4704,6 @@ void QWidgetPrivate::resolveLayoutDirection() has been called for the parent do not inherit the parent's layout direction. - This method no longer affects text layout direction since Qt 4.7. \sa QApplication::layoutDirection */ @@ -5286,10 +5296,11 @@ void QWidgetPrivate::drawWidget(QPaintDevice *pdev, const QRegion &rgn, const QP QWidgetEffectSourcePrivate *sourced = static_cast (source->d_func()); if (!sourced->context) { - QWidgetPaintContext context(pdev, rgn, offset, flags, sharedPainter, repaintManager); + const QRegion effectRgn(rgn.boundingRect()); + QWidgetPaintContext context(pdev, effectRgn, offset, flags, sharedPainter, repaintManager); sourced->context = &context; if (!sharedPainter) { - setSystemClip(pdev->paintEngine(), pdev->devicePixelRatioF(), rgn.translated(offset)); + setSystemClip(pdev->paintEngine(), pdev->devicePixelRatioF(), effectRgn.translated(offset)); QPainter p(pdev); p.translate(offset); context.painter = &p; @@ -5303,7 +5314,7 @@ void QWidgetPrivate::drawWidget(QPaintDevice *pdev, const QRegion &rgn, const QP } sharedPainter->save(); sharedPainter->translate(offset); - setSystemClip(sharedPainter->paintEngine(), sharedPainter->device()->devicePixelRatioF(), rgn.translated(offset)); + setSystemClip(sharedPainter->paintEngine(), sharedPainter->device()->devicePixelRatioF(), effectRgn.translated(offset)); graphicsEffect->draw(sharedPainter); setSystemClip(sharedPainter->paintEngine(), 1, QRegion()); sharedPainter->restore(); @@ -5311,7 +5322,7 @@ void QWidgetPrivate::drawWidget(QPaintDevice *pdev, const QRegion &rgn, const QP sourced->context = nullptr; if (repaintManager) - repaintManager->markNeedsFlush(q, rgn, offset); + repaintManager->markNeedsFlush(q, effectRgn, offset); return; } diff --git a/src/widgets/kernel/qwidgetrepaintmanager.cpp b/src/widgets/kernel/qwidgetrepaintmanager.cpp index e7e85c39..02880b34 100644 --- a/src/widgets/kernel/qwidgetrepaintmanager.cpp +++ b/src/widgets/kernel/qwidgetrepaintmanager.cpp @@ -801,6 +801,18 @@ bool QWidgetRepaintManager::syncAllowed() return true; } +static bool isDrawnInEffect(const QWidget *w) +{ +#if QT_CONFIG(graphicseffect) + do { + if (w->graphicsEffect()) + return true; + w = w->parentWidget(); + } while (w); +#endif + return false; +} + void QWidgetRepaintManager::paintAndFlush() { qCInfo(lcWidgetPainting) << "Painting and flushing dirty" @@ -888,7 +900,8 @@ void QWidgetRepaintManager::paintAndFlush() } #endif - if (!hasDirtySiblingsAbove && wd->isOpaque && !dirty.intersects(widgetDirty.boundingRect())) { + if (!isDrawnInEffect(w) && !hasDirtySiblingsAbove && wd->isOpaque + && !dirty.intersects(widgetDirty.boundingRect())) { opaqueNonOverlappedWidgets.append(w); } else { resetWidget(w); diff --git a/src/widgets/styles/qstylesheetstyle.cpp b/src/widgets/styles/qstylesheetstyle.cpp index f9ab5589..da88f0b9 100644 --- a/src/widgets/styles/qstylesheetstyle.cpp +++ b/src/widgets/styles/qstylesheetstyle.cpp @@ -60,6 +60,7 @@ #if QT_CONFIG(textedit) #include #endif +#include #include #if QT_CONFIG(combobox) #include @@ -120,6 +121,9 @@ #if QT_CONFIG(toolbar) #include #endif +#if QT_CONFIG(pushbutton) +#include +#endif #include #include @@ -2089,6 +2093,9 @@ QRenderRule QStyleSheetStyle::renderRule(const QObject *obj, const QStyleOption } #endif + else if (const QPlainTextEdit *edit = qobject_cast(obj)) { + extraClass |= (edit->isReadOnly() ? PseudoClass_ReadOnly : PseudoClass_Editable); + } #if QT_CONFIG(textedit) else if (const QTextEdit *edit = qobject_cast(obj)) { extraClass |= (edit->isReadOnly() ? PseudoClass_ReadOnly : PseudoClass_Editable); @@ -2525,7 +2532,9 @@ static quint64 extendedPseudoClass(const QWidget *w) pc |= (edit->isReadOnly() ? PseudoClass_ReadOnly : PseudoClass_Editable); } else #endif - { } // required for the above ifdef'ery to work + if (const QPlainTextEdit *edit = qobject_cast(w)) { + pc |= (edit->isReadOnly() ? PseudoClass_ReadOnly : PseudoClass_Editable); + } return pc; } @@ -2925,6 +2934,12 @@ void QStyleSheetStyle::polish(QWidget *w) if (!rule.hasBackground() || rule.background()->isTransparent() || rule.hasBox() || (!rule.hasNativeBorder() && !rule.border()->isOpaque())) w->setAttribute(Qt::WA_OpaquePaintEvent, false); + if (rule.hasBox() || !rule.hasNativeBorder() +#if QT_CONFIG(pushbutton) + || (qobject_cast(w)) +#endif + ) + w->setAttribute(Qt::WA_MacShowFocusRect, false); } } @@ -3530,7 +3545,8 @@ void QStyleSheetStyle::drawControl(ControlElement ce, const QStyleOption *opt, Q if (btn->features & QStyleOptionButton::HasMenu) { QRenderRule subRule = renderRule(w, opt, PseudoElement_PushButtonMenuIndicator); - QRect ir = positionRect(w, rule, subRule, PseudoElement_PushButtonMenuIndicator, opt->rect, opt->direction); + QRect ir = positionRect(w, rule, subRule, PseudoElement_PushButtonMenuIndicator, + baseStyle()->subElementRect(SE_PushButtonBevel, btn, w), opt->direction); if (subRule.hasDrawable()) { subRule.drawRule(p, ir); } else { @@ -3555,10 +3571,10 @@ void QStyleSheetStyle::drawControl(ControlElement ce, const QStyleOption *opt, Q QRect textRect = button->rect; const uint horizontalAlignMask = Qt::AlignHCenter | Qt::AlignLeft | Qt::AlignRight; - const uint verticalAlignMask = Qt::AlignVCenter | Qt::AlignTop | Qt::AlignLeft; + const uint verticalAlignMask = Qt::AlignVCenter | Qt::AlignTop | Qt::AlignBottom; - const Qt::Alignment textAlignment = rule.position()->textAlignment; - if (rule.hasPosition() && textAlignment != 0) { + if (rule.hasPosition() && rule.position()->textAlignment != 0) { + Qt::Alignment textAlignment = rule.position()->textAlignment; tf |= (textAlignment & verticalAlignMask) ? (textAlignment & verticalAlignMask) : Qt::AlignVCenter; tf |= (textAlignment & horizontalAlignMask) ? (textAlignment & horizontalAlignMask) : Qt::AlignHCenter; if (!styleHint(SH_UnderlineShortcut, button, w)) @@ -3617,8 +3633,6 @@ void QStyleSheetStyle::drawControl(ControlElement ce, const QStyleOption *opt, Q iconRect.translate(pixelMetric(PM_ButtonShiftHorizontal, opt, w), pixelMetric(PM_ButtonShiftVertical, opt, w)); p->drawPixmap(iconRect, pixmap); - }else { - tf |= textAlignment; } if (button->state & (State_On | State_Sunken)) @@ -4438,14 +4452,14 @@ void QStyleSheetStyle::drawPrimitive(PrimitiveElement pe, const QStyleOption *op case PE_PanelLineEdit: if (const QStyleOptionFrame *frm = qstyleoption_cast(opt)) { -#if QT_CONFIG(spinbox) - if (w && qobject_cast(w->parentWidget())) { - QRenderRule spinboxRule = renderRule(w->parentWidget(), opt); - if (!spinboxRule.hasNativeBorder() || !spinboxRule.baseStyleCanDraw()) + QWidget *container = containerWidget(w); + if (container != w) { + QRenderRule containerRule = renderRule(container, opt); + if (!containerRule.hasNativeBorder() || !containerRule.baseStyleCanDraw()) return; - rule = spinboxRule; + rule = containerRule; } -#endif + if (rule.hasNativeBorder()) { QStyleOptionFrame frmOpt(*frm); rule.configurePalette(&frmOpt.palette, QPalette::Text, QPalette::Base); @@ -5160,18 +5174,19 @@ QSize QStyleSheetStyle::sizeFromContents(ContentsType ct, const QStyleOption *op QSize sz(csz); if (mi->text.contains(QLatin1Char('\t'))) sz.rwidth() += 12; //as in QCommonStyle - bool checkable = mi->checkType != QStyleOptionMenuItem::NotCheckable; if (!mi->icon.isNull()) { const int pmSmall = pixelMetric(PM_SmallIconSize); const QSize pmSize = mi->icon.actualSize(QSize(pmSmall, pmSmall)); - sz.rwidth() += pmSize.width() + 4; - } else if (checkable) { + sz.rwidth() += std::max(mi->maxIconWidth, pmSize.width()) + 4; + } else if (mi->menuHasCheckableItems) { QRenderRule subSubRule = renderRule(w, opt, PseudoElement_MenuCheckMark); QRect checkmarkRect = positionRect(w, subRule, subSubRule, PseudoElement_MenuCheckMark, opt->rect, opt->direction); sz.rwidth() += std::max(mi->maxIconWidth, checkmarkRect.width()) + 4; + } else { + sz.rwidth() += mi->maxIconWidth; } if (subRule.hasFont) { - QFontMetrics fm(subRule.font); + QFontMetrics fm(subRule.font.resolve(mi->font)); const QRect r = fm.boundingRect(QRect(), Qt::TextSingleLine | Qt::TextShowMnemonic, mi->text); sz = sz.expandedTo(r.size()); } @@ -5844,6 +5859,13 @@ QRect QStyleSheetStyle::subElementRect(SubElement se, const QStyleOption *opt, c case SE_PushButtonBevel: case SE_PushButtonFocusRect: if (const QStyleOptionButton *btn = qstyleoption_cast(opt)) { + if (btn->features & QStyleOptionButton::HasMenu + && hasStyleRule(w, PseudoElement_PushButtonMenuIndicator)) { + QStyleOptionButton btnOpt(*btn); + btnOpt.features &= ~QStyleOptionButton::HasMenu; + return rule.baseStyleCanDraw() ? baseStyle()->subElementRect(se, &btnOpt, w) + : QWindowsStyle::subElementRect(se, &btnOpt, w); + } if (rule.hasBox() || !rule.hasNativeBorder()) { return visualRect(opt->direction, opt->rect, se == SE_PushButtonBevel ? rule.borderRect(opt->rect) diff --git a/src/widgets/util/qcompleter.cpp b/src/widgets/util/qcompleter.cpp index 47fee685..18b24063 100644 --- a/src/widgets/util/qcompleter.cpp +++ b/src/widgets/util/qcompleter.cpp @@ -1208,7 +1208,7 @@ QCompleter::CompletionMode QCompleter::completionMode() const /*! \property QCompleter::filterMode - \brief how the filtering is performed + \brief This property controls how filtering is performed. \since 5.2 If filterMode is set to Qt::MatchStartsWith, only those entries that start @@ -1216,11 +1216,14 @@ QCompleter::CompletionMode QCompleter::completionMode() const the entries that contain the typed characters, and Qt::MatchEndsWith the ones that end with the typed characters. - Currently, only these three modes are implemented. Setting filterMode to - any other Qt::MatchFlag will issue a warning, and no action will be - performed. + Setting filterMode to any other Qt::MatchFlag will issue a warning, and no + action will be performed. Because of this, the \c Qt::MatchCaseSensitive + flag has no effect. Use the \l caseSensitivity property to control case + sensitivity. The default mode is Qt::MatchStartsWith. + + \sa caseSensitivity */ void QCompleter::setFilterMode(Qt::MatchFlags filterMode) @@ -1747,9 +1750,9 @@ void QCompleter::setMaxVisibleItems(int maxItems) \property QCompleter::caseSensitivity \brief the case sensitivity of the matching - The default is Qt::CaseSensitive. + The default value is \c Qt::CaseSensitive. - \sa completionColumn, completionRole, modelSorting + \sa completionColumn, completionRole, modelSorting, filterMode */ void QCompleter::setCaseSensitivity(Qt::CaseSensitivity cs) { diff --git a/src/widgets/widgets/qabstractscrollarea.cpp b/src/widgets/widgets/qabstractscrollarea.cpp index 720a9f90..04cd3fd1 100644 --- a/src/widgets/widgets/qabstractscrollarea.cpp +++ b/src/widgets/widgets/qabstractscrollarea.cpp @@ -442,8 +442,10 @@ void QAbstractScrollAreaPrivate::layoutChildren_helper(bool *needHorizontalScrol viewportRect.adjust(right, top, -left, -bottom); else viewportRect.adjust(left, top, -right, -bottom); + viewportRect = QStyle::visualRect(opt.direction, opt.rect, viewportRect); + viewportRect.translate(-overshoot); + viewport->setGeometry(viewportRect); // resize the viewport last - viewport->setGeometry(QStyle::visualRect(opt.direction, opt.rect, viewportRect)); // resize the viewport last *needHorizontalScrollbar = needh; *needVerticalScrollbar = needv; } diff --git a/src/widgets/widgets/qcombobox.cpp b/src/widgets/widgets/qcombobox.cpp index 9bc34670..7a496c27 100644 --- a/src/widgets/widgets/qcombobox.cpp +++ b/src/widgets/widgets/qcombobox.cpp @@ -547,8 +547,6 @@ QComboBoxPrivateContainer::QComboBoxPrivateContainer(QAbstractItemView *itemView setLineWidth(1); } - setFrameStyle(combo->style()->styleHint(QStyle::SH_ComboBox_PopupFrameStyle, &opt, combo)); - if (top) { layout->insertWidget(0, top); connect(top, SIGNAL(doScroll(int)), this, SLOT(scrollItemView(int))); @@ -561,7 +559,7 @@ QComboBoxPrivateContainer::QComboBoxPrivateContainer(QAbstractItemView *itemView // Some styles (Mac) have a margin at the top and bottom of the popup. layout->insertSpacing(0, 0); layout->addSpacing(0); - updateTopBottomMargin(); + updateStyleSettings(); } void QComboBoxPrivateContainer::scrollItemView(int action) @@ -744,14 +742,20 @@ void QComboBoxPrivateContainer::updateTopBottomMargin() boxLayout->invalidate(); } +void QComboBoxPrivateContainer::updateStyleSettings() +{ + // add scroller arrows if style needs them + QStyleOptionComboBox opt = comboStyleOption(); + view->setMouseTracking(combo->style()->styleHint(QStyle::SH_ComboBox_ListMouseTracking, &opt, combo) || + combo->style()->styleHint(QStyle::SH_ComboBox_Popup, &opt, combo)); + setFrameStyle(combo->style()->styleHint(QStyle::SH_ComboBox_PopupFrameStyle, &opt, combo)); + updateTopBottomMargin(); +} + void QComboBoxPrivateContainer::changeEvent(QEvent *e) { - if (e->type() == QEvent::StyleChange) { - QStyleOptionComboBox opt = comboStyleOption(); - view->setMouseTracking(combo->style()->styleHint(QStyle::SH_ComboBox_ListMouseTracking, &opt, combo) || - combo->style()->styleHint(QStyle::SH_ComboBox_Popup, &opt, combo)); - setFrameStyle(combo->style()->styleHint(QStyle::SH_ComboBox_PopupFrameStyle, &opt, combo)); - } + if (e->type() == QEvent::StyleChange) + updateStyleSettings(); QFrame::changeEvent(e); } @@ -2896,13 +2900,15 @@ void QComboBox::showPopup() QGuiApplication::inputMethod()->reset(); } - QScrollBar *sb = view()->horizontalScrollBar(); - Qt::ScrollBarPolicy policy = view()->horizontalScrollBarPolicy(); - bool needHorizontalScrollBar = (policy == Qt::ScrollBarAsNeeded || policy == Qt::ScrollBarAlwaysOn) - && sb->minimum() < sb->maximum(); - if (needHorizontalScrollBar) { + const QScrollBar *sb = view()->horizontalScrollBar(); + const auto needHorizontalScrollBar = [this, sb]{ + const Qt::ScrollBarPolicy policy = view()->horizontalScrollBarPolicy(); + return (policy == Qt::ScrollBarAsNeeded || policy == Qt::ScrollBarAlwaysOn) + && sb->minimum() < sb->maximum(); + }; + const bool neededHorizontalScrollBar = needHorizontalScrollBar(); + if (neededHorizontalScrollBar) listRect.adjust(0, 0, 0, sb->height()); - } // Hide the scrollers here, so that the listrect gets the full height of the container // If the scrollers are truly needed, the later call to container->updateScrollers() @@ -2945,6 +2951,11 @@ void QComboBox::showPopup() } } container->show(); + if (!neededHorizontalScrollBar && needHorizontalScrollBar()) { + listRect.adjust(0, 0, 0, sb->height()); + container->setGeometry(listRect); + } + container->updateScrollers(); view()->setFocus(); @@ -3114,6 +3125,8 @@ void QComboBox::changeEvent(QEvent *e) Q_D(QComboBox); switch (e->type()) { case QEvent::StyleChange: + if (d->container) + d->container->updateStyleSettings(); d->updateDelegate(); #ifdef Q_OS_MAC case QEvent::MacSizeChange: diff --git a/src/widgets/widgets/qcombobox_p.h b/src/widgets/widgets/qcombobox_p.h index d7b2457c..45580ba9 100644 --- a/src/widgets/widgets/qcombobox_p.h +++ b/src/widgets/widgets/qcombobox_p.h @@ -223,6 +223,7 @@ public: int topMargin() const; int bottomMargin() const { return topMargin(); } void updateTopBottomMargin(); + void updateStyleSettings(); QTimer blockMouseReleaseTimer; QBasicTimer adjustSizeTimer; diff --git a/src/widgets/widgets/qdatetimeedit_p.h b/src/widgets/widgets/qdatetimeedit_p.h index 7df2b597..d36b6f8f 100644 --- a/src/widgets/widgets/qdatetimeedit_p.h +++ b/src/widgets/widgets/qdatetimeedit_p.h @@ -107,7 +107,7 @@ public: if (keyboardTracking) return maximum.toDateTime(); if (spec != Qt::LocalTime) - return QDateTime(QDATETIMEEDIT_DATE_MIN.startOfDay(spec)); + return QDateTime(QDATETIMEEDIT_DATE_MAX.endOfDay(spec)); return QDateTimeParser::getMaximum(); } QLocale locale() const override { return q_func()->locale(); } diff --git a/src/widgets/widgets/qdockwidget.cpp b/src/widgets/widgets/qdockwidget.cpp index 4663eda9..93362f42 100644 --- a/src/widgets/widgets/qdockwidget.cpp +++ b/src/widgets/widgets/qdockwidget.cpp @@ -973,13 +973,27 @@ bool QDockWidgetPrivate::mouseMoveEvent(QMouseEvent *event) && mwlayout->pluggingWidget == nullptr && (event->pos() - state->pressPos).manhattanLength() > QApplication::startDragDistance()) { - startDrag(); - q->grabMouse(); - ret = true; + +#ifdef Q_OS_MACOS + if (windowHandle() && !q->isFloating()) { + // When using native widgets on mac, we have not yet been successful in + // starting a drag on an NSView that belongs to one window (QMainWindow), + // but continue the drag on another (QDockWidget). This is what happens if + // we try to make this widget floating during a drag. So as a fall back + // solution, we simply make this widget floating instead, when we would + // otherwise start a drag. + q->setFloating(true); + } else +#endif + { + startDrag(); + q->grabMouse(); + ret = true; + } } } - if (state->dragging && !state->nca) { + if (state && state->dragging && !state->nca) { QMargins windowMargins = q->window()->windowHandle()->frameMargins(); QPoint windowMarginOffset = QPoint(windowMargins.left(), windowMargins.top()); QPoint pos = event->globalPos() - state->pressPos - windowMarginOffset; @@ -1222,6 +1236,11 @@ void QDockWidgetPrivate::setWindowState(bool floating, bool unplug, const QRect on whether it is docked; a docked QDockWidget has no frame and a smaller title bar. + \note On macOS, if the QDockWidget has a native window handle (for example, + if winId() is called on it or the child widget), then due to a limitation it will not be + possible to drag the dock widget when undocking. Starting the drag will undock + the dock widget, but a second drag will be needed to move the dock widget itself. + \sa QMainWindow, {Dock Widgets Example} */ diff --git a/src/widgets/widgets/qfontcombobox.cpp b/src/widgets/widgets/qfontcombobox.cpp index 4a99b0f9..289e2bc2 100644 --- a/src/widgets/widgets/qfontcombobox.cpp +++ b/src/widgets/widgets/qfontcombobox.cpp @@ -313,6 +313,10 @@ public: void QFontComboBoxPrivate::_q_updateModel() { Q_Q(QFontComboBox); + + if (QCoreApplication::closingDown()) + return; + const int scalableMask = (QFontComboBox::ScalableFonts | QFontComboBox::NonScalableFonts); const int spacingMask = (QFontComboBox::ProportionalFonts | QFontComboBox::MonospacedFonts); diff --git a/src/widgets/widgets/qlineedit.cpp b/src/widgets/widgets/qlineedit.cpp index a437d45c..11367879 100644 --- a/src/widgets/widgets/qlineedit.cpp +++ b/src/widgets/widgets/qlineedit.cpp @@ -82,8 +82,7 @@ #include "private/qapplication_p.h" #include "private/qshortcutmap_p.h" #include "qkeysequence.h" -#define ACCEL_KEY(k) ((!QCoreApplication::testAttribute(Qt::AA_DontShowIconsInMenus) \ - && QGuiApplication::styleHints()->showShortcutsInContextMenus()) \ +#define ACCEL_KEY(k) (!QCoreApplication::testAttribute(Qt::AA_DontShowShortcutsInContextMenus) \ && !QGuiApplicationPrivate::instance()->shortcutMap.hasShortcutForKeySequence(k) ? \ QLatin1Char('\t') + QKeySequence(k).toString(QKeySequence::NativeText) : QString()) #else @@ -1901,8 +1900,11 @@ void QLineEdit::focusInEvent(QFocusEvent *e) d->control->moveCursor(d->control->nextMaskBlank(0)); else if (!d->control->hasSelectedText()) selectAll(); + else + updateMicroFocus(); } else if (e->reason() == Qt::MouseFocusReason) { d->clickCausedFocus = 1; + updateMicroFocus(); } #ifdef QT_KEYPAD_NAVIGATION if (!QApplicationPrivate::keypadNavigationEnabled() || (hasEditFocus() && ( e->reason() == Qt::PopupFocusReason))) { diff --git a/src/widgets/widgets/qlineedit_p.cpp b/src/widgets/widgets/qlineedit_p.cpp index bad36fd2..80c9258d 100644 --- a/src/widgets/widgets/qlineedit_p.cpp +++ b/src/widgets/widgets/qlineedit_p.cpp @@ -481,7 +481,7 @@ void QLineEditPrivate::_q_clearButtonClicked() Q_Q(QLineEdit); if (!q->text().isEmpty()) { q->clear(); - emit q->textEdited(QString()); + _q_textEdited(QString()); } } diff --git a/src/widgets/widgets/qmaccocoaviewcontainer_mac.mm b/src/widgets/widgets/qmaccocoaviewcontainer_mac.mm index d56c6ab6..fb49efc7 100644 --- a/src/widgets/widgets/qmaccocoaviewcontainer_mac.mm +++ b/src/widgets/widgets/qmaccocoaviewcontainer_mac.mm @@ -48,6 +48,7 @@ /*! \class QMacCocoaViewContainer + \obsolete Use QWidget::createWindowContainer() and QWindow::fromWinId() instead. \since 4.5 \brief The QMacCocoaViewContainer class provides a widget for \macos that can be used to wrap arbitrary diff --git a/src/widgets/widgets/qmacnativewidget_mac.mm b/src/widgets/widgets/qmacnativewidget_mac.mm index 874ca84b..3566f4ed 100644 --- a/src/widgets/widgets/qmacnativewidget_mac.mm +++ b/src/widgets/widgets/qmacnativewidget_mac.mm @@ -47,6 +47,7 @@ /*! \class QMacNativeWidget + \obsolete Use QWidget::winId() instead. \since 4.5 \brief The QMacNativeWidget class provides a widget for \macos that provides a way to put Qt widgets into Cocoa hierarchies. diff --git a/src/widgets/widgets/qmdisubwindow.cpp b/src/widgets/widgets/qmdisubwindow.cpp index a5f81d65..15ef120d 100644 --- a/src/widgets/widgets/qmdisubwindow.cpp +++ b/src/widgets/widgets/qmdisubwindow.cpp @@ -259,11 +259,28 @@ static inline ControlElement *ptr(QWidget *widget) return nullptr; } +QString QMdiSubWindowPrivate::originalWindowTitleHelper() const +{ + Q_Q(const QMdiSubWindow); + // QTBUG-92240: When DontMaximizeSubWindowOnActivation is set and + // there is another subwindow maximized, use its original title. + if (auto *mdiArea = q->mdiArea()) { + const auto &subWindows = mdiArea->subWindowList(); + for (auto *subWindow : subWindows) { + if (subWindow != q && subWindow->isMaximized()) { + auto *subWindowD = static_cast(qt_widget_private(subWindow)); + if (!subWindowD->originalTitle.isNull()) + return subWindowD->originalTitle; + } + } + } + return q->window()->windowTitle(); +} + QString QMdiSubWindowPrivate::originalWindowTitle() { - Q_Q(QMdiSubWindow); if (originalTitle.isNull()) { - originalTitle = q->window()->windowTitle(); + originalTitle = originalWindowTitleHelper(); if (originalTitle.isNull()) originalTitle = QLatin1String(""); } @@ -278,11 +295,17 @@ void QMdiSubWindowPrivate::setNewWindowTitle() return; QString original = originalWindowTitle(); if (!original.isEmpty()) { - if (!original.contains(QMdiSubWindow::tr("- [%1]").arg(childTitle))) - q->window()->setWindowTitle(QMdiSubWindow::tr("%1 - [%2]").arg(original, childTitle)); + if (!original.contains(QMdiSubWindow::tr("- [%1]").arg(childTitle))) { + auto title = QMdiSubWindow::tr("%1 - [%2]").arg(original, childTitle); + ignoreWindowTitleChange = true; + q->window()->setWindowTitle(title); + ignoreWindowTitleChange = false; + } } else { + ignoreWindowTitleChange = true; q->window()->setWindowTitle(childTitle); + ignoreWindowTitleChange = false; } } @@ -395,7 +418,7 @@ ControlLabel::ControlLabel(QMdiSubWindow *subWindow, QWidget *parent) Q_UNUSED(subWindow); setFocusPolicy(Qt::NoFocus); updateWindowIcon(); - setFixedSize(label.size()); + setFixedSize(label.size() / label.devicePixelRatio()); } /* @@ -403,7 +426,7 @@ ControlLabel::ControlLabel(QMdiSubWindow *subWindow, QWidget *parent) */ QSize ControlLabel::sizeHint() const { - return label.size(); + return label.size() / label.devicePixelRatio(); } /* diff --git a/src/widgets/widgets/qmdisubwindow_p.h b/src/widgets/widgets/qmdisubwindow_p.h index d3513b67..043cf922 100644 --- a/src/widgets/widgets/qmdisubwindow_p.h +++ b/src/widgets/widgets/qmdisubwindow_p.h @@ -286,6 +286,7 @@ public: #endif void updateInternalWindowTitle(); QString originalWindowTitle(); + QString originalWindowTitleHelper() const; void setNewWindowTitle(); inline int titleBarHeight() const diff --git a/src/widgets/widgets/qplaintextedit.cpp b/src/widgets/widgets/qplaintextedit.cpp index 6694b79d..144517ee 100644 --- a/src/widgets/widgets/qplaintextedit.cpp +++ b/src/widgets/widgets/qplaintextedit.cpp @@ -1942,7 +1942,7 @@ void QPlainTextEdit::paintEvent(QPaintEvent *e) // keep right margin clean from full-width selection int maxX = offset.x() + qMax((qreal)viewportRect.width(), maximumWidth) - - document()->documentMargin(); + - document()->documentMargin() + cursorWidth(); er.setRight(qMin(er.right(), maxX)); painter.setClipRect(er); diff --git a/src/widgets/widgets/qscrollarea.cpp b/src/widgets/widgets/qscrollarea.cpp index f7a4f8e4..e8fdadb6 100644 --- a/src/widgets/widgets/qscrollarea.cpp +++ b/src/widgets/widgets/qscrollarea.cpp @@ -196,7 +196,23 @@ void QScrollAreaPrivate::updateScrollBars() if (resizable) { if ((widget->layout() ? widget->layout()->hasHeightForWidth() : widget->sizePolicy().hasHeightForWidth())) { QSize p_hfw = p.expandedTo(min).boundedTo(max); - int h = widget->heightForWidth( p_hfw.width() ); + int h = widget->heightForWidth(p_hfw.width()); + // If the height we calculated requires a vertical scrollbar, + // then we need to constrain the width and calculate the height again, + // otherwise we end up flipping the scrollbar on and off all the time. + if (vbarpolicy == Qt::ScrollBarAsNeeded) { + int vbarWidth = vbar->sizeHint().width(); + QSize m_hfw = m.expandedTo(min).boundedTo(max); + // is there any point in searching? + if (widget->heightForWidth(m_hfw.width() - vbarWidth) <= m.height()) { + while (h > m.height() && vbarWidth) { + --vbarWidth; + --m_hfw.rwidth(); + h = widget->heightForWidth(m_hfw.width()); + } + } + max = QSize(m_hfw.width(), qMax(m_hfw.height(), h)); + } min = QSize(p_hfw.width(), qMax(p_hfw.height(), h)); } } diff --git a/src/widgets/widgets/qtabbar.cpp b/src/widgets/widgets/qtabbar.cpp index 579df64d..ee7445f5 100644 --- a/src/widgets/widgets/qtabbar.cpp +++ b/src/widgets/widgets/qtabbar.cpp @@ -407,10 +407,12 @@ void QTabBarPrivate::init() { Q_Q(QTabBar); leftB = new QToolButton(q); + leftB->setObjectName(QStringLiteral("ScrollLeftButton")); leftB->setAutoRepeat(true); QObject::connect(leftB, SIGNAL(clicked()), q, SLOT(_q_scrollTabs())); leftB->hide(); rightB = new QToolButton(q); + rightB->setObjectName(QStringLiteral("ScrollRightButton")); rightB->setAutoRepeat(true); QObject::connect(rightB, SIGNAL(clicked()), q, SLOT(_q_scrollTabs())); rightB->hide(); @@ -831,21 +833,24 @@ void QTabBarPrivate::_q_scrollTabs() Q_Q(QTabBar); const QObject *sender = q->sender(); const bool horizontal = !verticalTabs(shape); - const QRect scrollRect = normalizedScrollRect(); + const QRect scrollRect = normalizedScrollRect().translated(scrollOffset, 0); + int i = -1; if (sender == leftB) { for (i = tabList.count() - 1; i >= 0; --i) { int start = horizontal ? tabList.at(i).rect.left() : tabList.at(i).rect.top(); - if (start < scrollRect.left() + scrollOffset) { + if (start < scrollRect.left()) { makeVisible(i); return; } } } else if (sender == rightB) { for (i = 0; i < tabList.count(); ++i) { - int end = horizontal ? tabList.at(i).rect.right() : tabList.at(i).rect.bottom(); - if (end > scrollRect.right() + scrollOffset) { + const auto tabRect = tabList.at(i).rect; + int start = horizontal ? tabRect.left() : tabRect.top(); + int end = horizontal ? tabRect.right() : tabRect.bottom(); + if (end > scrollRect.right() && start > scrollOffset) { makeVisible(i); return; } diff --git a/src/widgets/widgets/qwidgettextcontrol.cpp b/src/widgets/widgets/qwidgettextcontrol.cpp index f4eac623..6a5a77dd 100644 --- a/src/widgets/widgets/qwidgettextcontrol.cpp +++ b/src/widgets/widgets/qwidgettextcontrol.cpp @@ -97,8 +97,7 @@ #include "private/qapplication_p.h" #include "private/qshortcutmap_p.h" #include -#define ACCEL_KEY(k) ((!QCoreApplication::testAttribute(Qt::AA_DontShowShortcutsInContextMenus) \ - && QGuiApplication::styleHints()->showShortcutsInContextMenus()) \ +#define ACCEL_KEY(k) (!QCoreApplication::testAttribute(Qt::AA_DontShowShortcutsInContextMenus) \ && !QGuiApplicationPrivate::instance()->shortcutMap.hasShortcutForKeySequence(k) ? \ QLatin1Char('\t') + QKeySequence(k).toString(QKeySequence::NativeText) : QString()) @@ -1281,7 +1280,7 @@ void QWidgetTextControlPrivate::keyPressEvent(QKeyEvent *e) // example) repaintSelection(); - if (e->key() == Qt::Key_Backspace && !(e->modifiers() & ~Qt::ShiftModifier)) { + if (e->key() == Qt::Key_Backspace && !(e->modifiers() & ~(Qt::ShiftModifier | Qt::GroupSwitchModifier))) { QTextBlockFormat blockFmt = cursor.blockFormat(); QTextList *list = cursor.currentList(); if (list && cursor.atBlockStart() && !cursor.hasSelection()) { diff --git a/tests/auto/concurrent/qtconcurrentiteratekernel/tst_qtconcurrentiteratekernel.cpp b/tests/auto/concurrent/qtconcurrentiteratekernel/tst_qtconcurrentiteratekernel.cpp index 3c77b1ba..212c0a2e 100644 --- a/tests/auto/concurrent/qtconcurrentiteratekernel/tst_qtconcurrentiteratekernel.cpp +++ b/tests/auto/concurrent/qtconcurrentiteratekernel/tst_qtconcurrentiteratekernel.cpp @@ -126,7 +126,8 @@ public: void tst_QtConcurrentIterateKernel::instantiate() { - startThreadEngine(new PrintFor(0, 40)).startBlocking(); + auto future = startThreadEngine(new PrintFor(0, 40)).startAsynchronously(); + future.waitForFinished(); QCOMPARE(iterations.loadRelaxed(), 40); } @@ -165,8 +166,10 @@ void tst_QtConcurrentIterateKernel::stresstest() const int times = 50; for (int i = 0; i < times; ++i) { counter.storeRelaxed(0); - CountFor f(0, iterations); - f.startBlocking(); + // ThreadEngine will delete f when it finishes + auto f = new CountFor(0, iterations); + auto future = f->startAsynchronously(); + future.waitForFinished(); QCOMPARE(counter.loadRelaxed(), iterations); } } @@ -174,8 +177,11 @@ void tst_QtConcurrentIterateKernel::stresstest() void tst_QtConcurrentIterateKernel::noIterations() { const int times = 20000; - for (int i = 0; i < times; ++i) - startThreadEngine(new IterateKernel(0, 0)).startBlocking(); + for (int i = 0; i < times; ++i) { + auto future = startThreadEngine(new IterateKernel(0, 0)) + .startAsynchronously(); + future.waitForFinished(); + } } QMutex threadsMutex; @@ -230,8 +236,10 @@ void tst_QtConcurrentIterateKernel::throttling() threads.clear(); - ThrottleFor f(0, totalIterations); - f.startBlocking(); + // ThreadEngine will delete f when it finishes + auto f = new ThrottleFor(0, totalIterations); + auto future = f->startAsynchronously(); + future.waitForFinished(); QCOMPARE(iterations.loadRelaxed(), totalIterations); diff --git a/tests/auto/concurrent/qtconcurrentthreadengine/tst_qtconcurrentthreadengine.cpp b/tests/auto/concurrent/qtconcurrentthreadengine/tst_qtconcurrentthreadengine.cpp index d4c669cd..ac7be7ac 100644 --- a/tests/auto/concurrent/qtconcurrentthreadengine/tst_qtconcurrentthreadengine.cpp +++ b/tests/auto/concurrent/qtconcurrentthreadengine/tst_qtconcurrentthreadengine.cpp @@ -65,16 +65,9 @@ public: void tst_QtConcurrentThreadEngine::runDirectly() { - { - PrintUser engine; - engine.startSingleThreaded(); - engine.startBlocking(); - } - { - PrintUser *engine = new PrintUser(); - QFuture f = engine->startAsynchronously(); - f.waitForFinished(); - } + PrintUser *engine = new PrintUser(); + QFuture f = engine->startAsynchronously(); + f.waitForFinished(); } class StringResultUser : public ThreadEngine @@ -106,8 +99,10 @@ public: void tst_QtConcurrentThreadEngine::result() { - StringResultUser engine; - QCOMPARE(*engine.startBlocking(), QString("Foo")); + // ThreadEngine will delete 'engine' when it finishes + auto engine = new StringResultUser(); + auto future = engine->startAsynchronously(); + QCOMPARE(future.result(), QString("Foo")); } class VoidResultUser : public ThreadEngine @@ -133,17 +128,9 @@ public: void tst_QtConcurrentThreadEngine::runThroughStarter() { - { - ThreadEngineStarter starter = startThreadEngine(new StringResultUser()); - QFuture f = starter.startAsynchronously(); - QCOMPARE(f.result(), QString("Foo")); - } - - { - ThreadEngineStarter starter = startThreadEngine(new StringResultUser()); - QString str = starter.startBlocking(); - QCOMPARE(str, QString("Foo")); - } + ThreadEngineStarter starter = startThreadEngine(new StringResultUser()); + QFuture f = starter.startAsynchronously(); + QCOMPARE(f.result(), QString("Foo")); } class CancelUser : public ThreadEngine @@ -226,12 +213,6 @@ void tst_QtConcurrentThreadEngine::throttle() f.waitForFinished(); QCOMPARE(count.loadRelaxed(), 0); } - - for (int i = 0; i < repeats; ++i) { - ThrottleAlwaysUser t; - t.startBlocking(); - QCOMPARE(count.loadRelaxed(), 0); - } } QSet threads; @@ -266,40 +247,21 @@ public: void tst_QtConcurrentThreadEngine::threadCount() { - //QTBUG-23333: This test is unstable - const int repeats = 10; for (int i = 0; i < repeats; ++i) { - ThreadCountUser t; - t.startBlocking(); - int count = threads.count(); - int count_expected = QThreadPool::globalInstance()->maxThreadCount() + 1; // +1 for the main thread. - if (count != count_expected) - QEXPECT_FAIL("", "QTBUG-23333", Abort); - QCOMPARE(count, count_expected); - (new ThreadCountUser())->startAsynchronously().waitForFinished(); - count = threads.count(); - count_expected = QThreadPool::globalInstance()->maxThreadCount(); - if (count != count_expected) - QEXPECT_FAIL("", "QTBUG-23333", Abort); - QCOMPARE(count, count_expected); + const auto count = threads.count(); + const auto maxThreadCount = QThreadPool::globalInstance()->maxThreadCount(); + QVERIFY(count <= maxThreadCount); + QVERIFY(!threads.contains(QThread::currentThread())); } // Set the finish flag immediately, this should give us one thread only. for (int i = 0; i < repeats; ++i) { - ThreadCountUser t(true /*finishImmediately*/); - t.startBlocking(); - int count = threads.count(); - if (count != 1) - QEXPECT_FAIL("", "QTBUG-23333", Abort); - QCOMPARE(count, 1); - (new ThreadCountUser(true /*finishImmediately*/))->startAsynchronously().waitForFinished(); - count = threads.count(); - if (count != 1) - QEXPECT_FAIL("", "QTBUG-23333", Abort); + const auto count = threads.count(); QCOMPARE(count, 1); + QVERIFY(!threads.contains(QThread::currentThread())); } } @@ -438,7 +400,6 @@ public: void tst_QtConcurrentThreadEngine::exceptions() { - // Asynchronous mode: { bool caught = false; try { @@ -451,32 +412,6 @@ void tst_QtConcurrentThreadEngine::exceptions() QVERIFY2(caught, "did not get exception"); } - // Blocking mode: - // test throwing the exception from a worker thread. - { - bool caught = false; - try { - QtConcurrentExceptionThrower e(QThread::currentThread()); - e.startBlocking(); - } catch (const QException &) { - caught = true; - } - QVERIFY2(caught, "did not get exception"); - } - - // test throwing the exception from the main thread (different code path) - { - bool caught = false; - try { - QtConcurrentExceptionThrower e(0); - e.startBlocking(); - } catch (const QException &) { - caught = true; - } - QVERIFY2(caught, "did not get exception"); - } - - // Asynchronous mode: { bool caught = false; try { @@ -488,31 +423,6 @@ void tst_QtConcurrentThreadEngine::exceptions() } QVERIFY2(caught, "did not get exception"); } - - // Blocking mode: - // test throwing the exception from a worker thread. - { - bool caught = false; - try { - UnrelatedExceptionThrower e(QThread::currentThread()); - e.startBlocking(); - } catch (const QUnhandledException &) { - caught = true; - } - QVERIFY2(caught, "did not get exception"); - } - - // test throwing the exception from the main thread (different code path) - { - bool caught = false; - try { - UnrelatedExceptionThrower e(0); - e.startBlocking(); - } catch (const QUnhandledException &) { - caught = true; - } - QVERIFY2(caught, "did not get exception"); - } } #endif diff --git a/tests/auto/corelib/codecs/qtextcodec/test.pro b/tests/auto/corelib/codecs/qtextcodec/test.pro index 7505c5ad..07c1e4e2 100644 --- a/tests/auto/corelib/codecs/qtextcodec/test.pro +++ b/tests/auto/corelib/codecs/qtextcodec/test.pro @@ -1,5 +1,5 @@ CONFIG += testcase -QT = core testlib +QT = core-private testlib SOURCES = tst_qtextcodec.cpp TARGET = tst_qtextcodec diff --git a/tests/auto/corelib/codecs/qtextcodec/tst_qtextcodec.cpp b/tests/auto/corelib/codecs/qtextcodec/tst_qtextcodec.cpp index 78b6449a..62a83218 100644 --- a/tests/auto/corelib/codecs/qtextcodec/tst_qtextcodec.cpp +++ b/tests/auto/corelib/codecs/qtextcodec/tst_qtextcodec.cpp @@ -38,6 +38,11 @@ #endif #include +#include // for the icu feature test +#if QT_CONFIG(icu) +# include +#endif + class tst_QTextCodec : public QObject { Q_OBJECT @@ -96,6 +101,9 @@ private slots: void shiftJis(); void userCodec(); + + void canEncode(); + void canEncode_data(); }; void tst_QTextCodec::toUnicode_data() @@ -2455,6 +2463,67 @@ void tst_QTextCodec::userCodec() QCOMPARE(pcodec, nullptr); } +void tst_QTextCodec::canEncode() +{ + QFETCH(QString, codecName); + QFETCH(QString, inputString); + QFETCH(QByteArray, expectedData); + QFETCH(bool, canEncode); + + QTextCodec *codec = QTextCodec::codecForName(codecName.toLatin1()); + QVERIFY(codec != nullptr); + + QCOMPARE(codec->canEncode(inputString), canEncode); + QByteArray encoded = codec->fromUnicode(inputString); + QCOMPARE(encoded, expectedData); +} + +void tst_QTextCodec::canEncode_data() +{ + QTest::addColumn("codecName"); + QTest::addColumn("inputString"); + QTest::addColumn("expectedData"); + QTest::addColumn("canEncode"); + + QTest::newRow("English ISO-8859-1") << "ISO-8859-1" << "Hello World" + << QByteArray("Hello World") << true; + QTest::newRow("English big5") << "Big5" << "Hello World" << QByteArray("Hello World") << true; + + QTest::newRow("Greek win1252") + << "Windows-1252" + << QString("\u03c0\u03bf\u03bb\u03cd\u03c4\u03c1\u03bf\u03c0\u03bf\u03bd") + << QByteArray("??????????") << false; + QTest::newRow("Greek win1253") + << "Windows-1253" + << QString("\u03c0\u03bf\u03bb\u03cd\u03c4\u03c1\u03bf\u03c0\u03bf\u03bd") + << QByteArray("\xF0\xEF\xEB\xFD\xF4\xF1\xEF\xF0\xEF\xED") << true; + + QTest::newRow("Russian win1252") + << "Windows-1252" << QString("\u041f\u0440\u0438\u0432\u0435\u0442 \u043c\u0438\u0440") + << QByteArray("?????? ???") << false; + QTest::newRow("Russian win1251") + << "Windows-1251" << QString("\u041f\u0440\u0438\u0432\u0435\u0442 \u043c\u0438\u0440") + << QByteArray("\xCF\xF0\xE8\xE2\xE5\xF2 \xEC\xE8\xF0") << true; + + QTest::newRow("English from ucs4") + << "ISO-8859-1" << QString("\u0048\u0065\u006c\u006c\u006f\u0021") + << QByteArray("Hello!") << true; + + // ICU on Linux RHEL 7.6 seems to be old, and does not handle NULL + // characters properly. It returns 0x01 instead of 0x00 for it, so + // we just skip the test. +#if !QT_CONFIG(icu) || (U_ICU_VERSION_MAJOR_NUM > 56) + QTest::newRow("With null") << "ISO-8859-1" << QString::fromUcs4(U"Hello\u0000World", 11) + << QByteArray("Hello\x00World", 11) << true; +#endif + + QTest::newRow("With special chars") + << "ISO-8859-1" << QString("\u0001\u0002\u0003\u0008\u0009\u000a\u000b\u000d") + << QByteArray("\x01\x02\x03\b\t\n\x0B\r") << true; + + QTest::newRow("Pencil icon") << "ISO-8859-1" << QString("\u270f") << QByteArray("?") << false; +} + struct DontCrashAtExit { ~DontCrashAtExit() { QTextCodec *c = QTextCodec::codecForName("utf8"); diff --git a/tests/auto/corelib/io/qprocess/tst_qprocess.cpp b/tests/auto/corelib/io/qprocess/tst_qprocess.cpp index bc9df3f1..db60bead 100644 --- a/tests/auto/corelib/io/qprocess/tst_qprocess.cpp +++ b/tests/auto/corelib/io/qprocess/tst_qprocess.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2020 The Qt Company Ltd. +** Copyright (C) 2021 The Qt Company Ltd. ** Copyright (C) 2020 Intel Corporation. ** Contact: https://www.qt.io/licensing/ ** @@ -39,6 +39,7 @@ #include #include #include +#include #include #include @@ -1271,17 +1272,15 @@ void tst_QProcess::processesInMultipleThreads() threadCount = qMax(threadCount, QThread::idealThreadCount() + 2); QVector threads(threadCount); + auto cleanup = qScopeGuard([&threads]() { qDeleteAll(threads); }); for (int j = 0; j < threadCount; ++j) threads[j] = new TestThread; for (int j = 0; j < threadCount; ++j) threads[j]->start(); - for (int j = 0; j < threadCount; ++j) { + for (int j = 0; j < threadCount; ++j) QVERIFY(threads[j]->wait(10000)); - } - for (int j = 0; j < threadCount; ++j) { + for (int j = 0; j < threadCount; ++j) QCOMPARE(threads[j]->code(), 0); - } - qDeleteAll(threads); } } diff --git a/tests/auto/corelib/io/qsettings/tst_qsettings.cpp b/tests/auto/corelib/io/qsettings/tst_qsettings.cpp index 84f4a475..7c69f5f4 100644 --- a/tests/auto/corelib/io/qsettings/tst_qsettings.cpp +++ b/tests/auto/corelib/io/qsettings/tst_qsettings.cpp @@ -742,6 +742,10 @@ void tst_QSettings::embeddedZeroByte_data() QTest::newRow("@bytearray\\0") << QVariant(bytes); QTest::newRow("@string\\0") << QVariant(QString::fromLatin1(bytes.data(), bytes.size())); + + bytes = QByteArray("@\xdd\x7d", 3); + QTest::newRow("@-prefixed data") << QVariant(bytes); + QTest::newRow("@-prefixed data as string") << QVariant(QString::fromLatin1(bytes.data(), bytes.size())); } void tst_QSettings::embeddedZeroByte() diff --git a/tests/auto/corelib/io/qurl/tst_qurl.cpp b/tests/auto/corelib/io/qurl/tst_qurl.cpp index b3ae547d..5687a633 100644 --- a/tests/auto/corelib/io/qurl/tst_qurl.cpp +++ b/tests/auto/corelib/io/qurl/tst_qurl.cpp @@ -1334,6 +1334,10 @@ void tst_QUrl::fromLocalFile_data() << QString(QString("//somehost") + suffix).replace('/', '\\') << QString("file://somehost") + suffix << QString(suffix); + QTest::addRow("windows-backslash-extlen-%s", pathDescription) + << QString(QString("//?") + suffix).replace('/', '\\') + << QString("file:////%3F") + suffix + << QString("//?") + suffix; #endif QTest::addRow("windows-extlen-%s", pathDescription) << QString("//?") + suffix diff --git a/tests/auto/corelib/itemmodels/qconcatenatetablesproxymodel/tst_qconcatenatetablesproxymodel.cpp b/tests/auto/corelib/itemmodels/qconcatenatetablesproxymodel/tst_qconcatenatetablesproxymodel.cpp index 40617c1f..e1ea7a45 100644 --- a/tests/auto/corelib/itemmodels/qconcatenatetablesproxymodel/tst_qconcatenatetablesproxymodel.cpp +++ b/tests/auto/corelib/itemmodels/qconcatenatetablesproxymodel/tst_qconcatenatetablesproxymodel.cpp @@ -116,6 +116,7 @@ private Q_SLOTS: void shouldPropagateDropBetweenItemsAtModelBoundary(); void shouldPropagateDropAfterLastRow_data(); void shouldPropagateDropAfterLastRow(); + void qtbug91788(); private: QStandardItemModel mod; @@ -453,6 +454,17 @@ void tst_QConcatenateTablesProxyModel::shouldUseSmallestColumnCount() const QModelIndex indexD = pm.mapFromSource(mod2.index(0, 0)); QVERIFY(indexD.isValid()); QCOMPARE(indexD, pm.index(1, 0)); + + // Test setData in an ignored column (QTBUG-91253) + QSignalSpy dataChangedSpy(&pm, SIGNAL(dataChanged(QModelIndex,QModelIndex))); + mod.setData(mod.index(0, 1), "b"); + QCOMPARE(dataChangedSpy.count(), 0); + + // Test dataChanged across all columns, some visible, some ignored + mod.dataChanged(mod.index(0, 0), mod.index(0, 2)); + QCOMPARE(dataChangedSpy.count(), 1); + QCOMPARE(dataChangedSpy.at(0).at(0).toModelIndex(), pm.index(0, 0)); + QCOMPARE(dataChangedSpy.at(0).at(1).toModelIndex(), pm.index(0, 0)); } void tst_QConcatenateTablesProxyModel::shouldIncreaseColumnCountWhenRemovingFirstModel() @@ -818,6 +830,19 @@ void tst_QConcatenateTablesProxyModel::shouldPropagateDropAfterLastRow() } +void tst_QConcatenateTablesProxyModel::qtbug91788() +{ + QConcatenateTablesProxyModel proxyConcat; + QStringList strList{QString("one"),QString("two")}; + QStringListModel strListModelA(strList); + QSortFilterProxyModel proxyFilter; + proxyFilter.setSourceModel(&proxyConcat); + + proxyConcat.addSourceModel(&strListModelA); + proxyConcat.removeSourceModel(&strListModelA); // This should not assert + QCOMPARE(proxyConcat.columnCount(), 0); +} + QTEST_GUILESS_MAIN(tst_QConcatenateTablesProxyModel) #include "tst_qconcatenatetablesproxymodel.moc" diff --git a/tests/auto/corelib/itemmodels/qsortfilterproxymodel_common/tst_qsortfilterproxymodel.cpp b/tests/auto/corelib/itemmodels/qsortfilterproxymodel_common/tst_qsortfilterproxymodel.cpp index 6f608854..a6e1f49b 100644 --- a/tests/auto/corelib/itemmodels/qsortfilterproxymodel_common/tst_qsortfilterproxymodel.cpp +++ b/tests/auto/corelib/itemmodels/qsortfilterproxymodel_common/tst_qsortfilterproxymodel.cpp @@ -2220,6 +2220,40 @@ void tst_QSortFilterProxyModel::changeSourceDataProxySendDataChanged_qtbug87781( QCOMPARE(afterDataChangedSpy.size(), 1); } +void tst_QSortFilterProxyModel::changeSourceDataTreeModel() +{ + QStandardItemModel treeModel; + QSortFilterProxyModel treeProxyModelBefore; + QSortFilterProxyModel treeProxyModelAfter; + + QSignalSpy treeBaseDataChangedSpy(&treeModel, &QStandardItemModel::dataChanged); + QSignalSpy treeBeforeDataChangedSpy(&treeProxyModelBefore, &QSortFilterProxyModel::dataChanged); + QSignalSpy treeAfterDataChangedSpy(&treeProxyModelAfter, &QSortFilterProxyModel::dataChanged); + + QVERIFY(treeBaseDataChangedSpy.isValid()); + QVERIFY(treeBeforeDataChangedSpy.isValid()); + QVERIFY(treeAfterDataChangedSpy.isValid()); + + treeProxyModelBefore.setSourceModel(&treeModel); + QStandardItem treeNode1("data1"); + QStandardItem treeNode11("data11"); + QStandardItem treeNode111("data111"); + + treeNode1.appendRow(&treeNode11); + treeNode11.appendRow(&treeNode111); + treeModel.appendRow(&treeNode1); + treeProxyModelAfter.setSourceModel(&treeModel); + + QCOMPARE(treeBaseDataChangedSpy.size(), 0); + QCOMPARE(treeBeforeDataChangedSpy.size(), 0); + QCOMPARE(treeAfterDataChangedSpy.size(), 0); + + treeNode111.setData(QStringLiteral("new data"), Qt::DisplayRole); + QCOMPARE(treeBaseDataChangedSpy.size(), 1); + QCOMPARE(treeBeforeDataChangedSpy.size(), 1); + QCOMPARE(treeAfterDataChangedSpy.size(), 1); +} + void tst_QSortFilterProxyModel::changeSourceDataProxyFilterSingleColumn() { enum modelRow { Row0, Row1, RowCount }; diff --git a/tests/auto/corelib/itemmodels/qsortfilterproxymodel_common/tst_qsortfilterproxymodel.h b/tests/auto/corelib/itemmodels/qsortfilterproxymodel_common/tst_qsortfilterproxymodel.h index 7bf87a86..97862e80 100644 --- a/tests/auto/corelib/itemmodels/qsortfilterproxymodel_common/tst_qsortfilterproxymodel.h +++ b/tests/auto/corelib/itemmodels/qsortfilterproxymodel_common/tst_qsortfilterproxymodel.h @@ -91,6 +91,7 @@ private slots: void changeSourceDataKeepsStableSorting_qtbug1548(); void changeSourceDataForwardsRoles_qtbug35440(); void changeSourceDataProxySendDataChanged_qtbug87781(); + void changeSourceDataTreeModel(); void changeSourceDataProxyFilterSingleColumn(); void changeSourceDataProxyFilterMultipleColumns(); void resortingDoesNotBreakTreeModels(); diff --git a/tests/auto/corelib/kernel/qeventdispatcher/tst_qeventdispatcher.cpp b/tests/auto/corelib/kernel/qeventdispatcher/tst_qeventdispatcher.cpp index 7aadd144..ce034874 100644 --- a/tests/auto/corelib/kernel/qeventdispatcher/tst_qeventdispatcher.cpp +++ b/tests/auto/corelib/kernel/qeventdispatcher/tst_qeventdispatcher.cpp @@ -69,6 +69,7 @@ private slots: void processEventsOnlySendsQueuedEvents(); void postedEventsPingPong(); void eventLoopExit(); + void interruptTrampling(); }; bool tst_QEventDispatcher::event(QEvent *e) @@ -419,5 +420,31 @@ void tst_QEventDispatcher::eventLoopExit() QVERIFY(!timeoutObserved); } +// Based on QTBUG-91539: In the event dispatcher on Windows we overwrite the +// interrupt once we start processing events (this pattern is also in the 'unix' dispatcher) +// which would lead the dispatcher to accidentally ignore certain interrupts and, +// as in the bug report, would not quit, leaving the thread alive and running. +void tst_QEventDispatcher::interruptTrampling() +{ + class WorkerThread : public QThread + { + void run() override { + auto dispatcher = eventDispatcher(); + QVERIFY(dispatcher); + dispatcher->processEvents(QEventLoop::AllEvents); + QTimer::singleShot(0, [dispatcher]() { + dispatcher->wakeUp(); + }); + dispatcher->processEvents(QEventLoop::WaitForMoreEvents); + dispatcher->interrupt(); + dispatcher->processEvents(QEventLoop::WaitForMoreEvents); + } + }; + WorkerThread thread; + thread.start(); + QVERIFY(thread.wait(1000)); + QVERIFY(thread.isFinished()); +} + QTEST_MAIN(tst_QEventDispatcher) #include "tst_qeventdispatcher.moc" diff --git a/tests/auto/corelib/kernel/qtimer/BLACKLIST b/tests/auto/corelib/kernel/qtimer/BLACKLIST new file mode 100644 index 00000000..2af0df94 --- /dev/null +++ b/tests/auto/corelib/kernel/qtimer/BLACKLIST @@ -0,0 +1,3 @@ +[zeroTimer] +ubuntu-20.04 + diff --git a/tests/auto/corelib/kernel/qtimer/tst_qtimer.cpp b/tests/auto/corelib/kernel/qtimer/tst_qtimer.cpp index 1bd27cd0..3c0adda5 100644 --- a/tests/auto/corelib/kernel/qtimer/tst_qtimer.cpp +++ b/tests/auto/corelib/kernel/qtimer/tst_qtimer.cpp @@ -135,24 +135,53 @@ void tst_QTimer::timeout() void tst_QTimer::remainingTime() { - QTimer timer; - QSignalSpy timeoutSpy(&timer, &QTimer::timeout); - timer.setTimerType(Qt::PreciseTimer); - timer.start(200); + QTimer tested; + tested.setTimerType(Qt::PreciseTimer); - QCOMPARE(timeoutSpy.count(), 0); - QTest::qWait(50); - QCOMPARE(timeoutSpy.count(), 0); + QTimer tester; + tester.setTimerType(Qt::PreciseTimer); + tester.setSingleShot(true); - int remainingTime = timer.remainingTime(); - QVERIFY2(remainingTime >= 50 && remainingTime <= 200, qPrintable(QString::number(remainingTime))); + const int testedInterval = 200; + const int testerInterval = 50; + const int expectedRemainingTime = testedInterval - testerInterval; - QVERIFY(timeoutSpy.wait()); - QCOMPARE(timeoutSpy.count(), 1); + int testIteration = 0; + const int desiredTestCount = 2; - // the timer is still active, so it should have a non-zero remaining time - remainingTime = timer.remainingTime(); - QVERIFY2(remainingTime >= 50, qPrintable(QString::number(remainingTime))); + auto connection = QObject::connect(&tested, &QTimer::timeout, [&tester]() { + // We let tested (which isn't a single-shot) run repeatedly, to verify + // it *does* repeat, and check that the single-shot tester, starting + // at the same time, does finish first each time, by about the right duration. + tester.start(); // Start tester again. + }); + + QObject::connect(&tester, &QTimer::timeout, [&]() { + const int remainingTime = tested.remainingTime(); + // We expect that remainingTime is at most 150 and not overdue. + const bool remainingTimeInRange = remainingTime > 0 + && remainingTime <= expectedRemainingTime; + if (remainingTimeInRange) + ++testIteration; + else + testIteration = desiredTestCount; // We are going to fail on QVERIFY2() + // below, so we don't want to iterate + // anymore and quickly exit the QTRY_...() + // with this failure. + if (testIteration == desiredTestCount) + QObject::disconnect(connection); // Last iteration, don't start tester again. + QVERIFY2(remainingTimeInRange, qPrintable("Remaining time " + + QByteArray::number(remainingTime) + "ms outside expected range (0ms, " + + QByteArray::number(expectedRemainingTime) + "ms]")); + }); + + tested.start(testedInterval); + tester.start(testerInterval); // Start tester for the 1st time. + + // Test it desiredTestCount times, give it reasonable amount of time + // (twice as much as needed). + QTRY_COMPARE_WITH_TIMEOUT(testIteration, desiredTestCount, + testedInterval * desiredTestCount * 2); } void tst_QTimer::remainingTimeInitial_data() diff --git a/tests/auto/corelib/kernel/qtranslator/android_testdata.qrc b/tests/auto/corelib/kernel/qtranslator/android_testdata.qrc deleted file mode 100644 index 39b85db6..00000000 --- a/tests/auto/corelib/kernel/qtranslator/android_testdata.qrc +++ /dev/null @@ -1,8 +0,0 @@ - - - hellotr_la.qm - hellotr_empty.qm - msgfmt_from_po.qm - dependencies_la.qm - - diff --git a/tests/auto/corelib/kernel/qtranslator/qtranslator.qrc b/tests/auto/corelib/kernel/qtranslator/qtranslator.qrc index cb82c6cc..6c993352 100644 --- a/tests/auto/corelib/kernel/qtranslator/qtranslator.qrc +++ b/tests/auto/corelib/kernel/qtranslator/qtranslator.qrc @@ -1,6 +1,8 @@ + dependencies_la.qm hellotr_la.qm hellotr_empty.qm + msgfmt_from_po.qm diff --git a/tests/auto/corelib/kernel/qtranslator/tst_qtranslator.cpp b/tests/auto/corelib/kernel/qtranslator/tst_qtranslator.cpp index 9fde7da8..c47b25ea 100644 --- a/tests/auto/corelib/kernel/qtranslator/tst_qtranslator.cpp +++ b/tests/auto/corelib/kernel/qtranslator/tst_qtranslator.cpp @@ -29,6 +29,7 @@ #include #include #include +#include class tst_QTranslator : public QObject { @@ -40,9 +41,11 @@ protected: bool eventFilter(QObject *obj, QEvent *event); private slots: void initTestCase(); + void init(); void load_data(); void load(); + void loadLocale(); void threadLoad(); void testLanguageChange(); void plural(); @@ -64,38 +67,14 @@ tst_QTranslator::tst_QTranslator() void tst_QTranslator::initTestCase() { -#if defined(Q_OS_ANDROID) && !defined(Q_OS_ANDROID_EMBEDDED) - QString sourceDir(":/android_testdata/"); - QDirIterator it(sourceDir, QDirIterator::Subdirectories); - while (it.hasNext()) { - it.next(); - - QFileInfo sourceFileInfo = it.fileInfo(); - if (!sourceFileInfo.isDir()) { - QFileInfo destinationFileInfo(QStandardPaths::writableLocation(QStandardPaths::CacheLocation) + QLatin1Char('/') + sourceFileInfo.filePath().mid(sourceDir.length())); - - if (!destinationFileInfo.exists()) { - QVERIFY(QDir().mkpath(destinationFileInfo.path())); - QVERIFY(QFile::copy(sourceFileInfo.filePath(), destinationFileInfo.filePath())); - } - } - } - - QDir::setCurrent(QStandardPaths::writableLocation(QStandardPaths::CacheLocation)); -#endif - - // chdir into the directory containing our testdata, - // to make the code simpler (load testdata via relative paths) -#ifdef Q_OS_WINRT - // ### TODO: Use this for all platforms in 5.7 - dataDir = QEXTRACTTESTDATA(QStringLiteral("/")); + dataDir = QEXTRACTTESTDATA(QStringLiteral("/tst_qtranslator")); QVERIFY2(!dataDir.isNull(), qPrintable("Could not extract test data")); - QVERIFY2(QDir::setCurrent(dataDir->path()), qPrintable("Could not chdir to " + dataDir->path())); -#else // !Q_OS_WINRT - QString testdata_dir = QFileInfo(QFINDTESTDATA("hellotr_la.qm")).absolutePath(); - QVERIFY2(QDir::setCurrent(testdata_dir), qPrintable("Could not chdir to " + testdata_dir)); -#endif // !Q_OS_WINRT +} +void tst_QTranslator::init() +{ + QVERIFY2(QDir::setCurrent(dataDir->path()), + qPrintable("Could not chdir to " + dataDir->path())); } bool tst_QTranslator::eventFilter(QObject *, QEvent *event) @@ -155,6 +134,73 @@ void tst_QTranslator::load() } } +void tst_QTranslator::loadLocale() +{ + QLocale locale; + auto localeName = locale.uiLanguages().value(0).replace('-', '_'); + if (localeName.isEmpty()) + QSKIP("This test requires at least one available UI language."); + + QByteArray ba; + { + QFile file(":/tst_qtranslator/hellotr_la.qm"); + QVERIFY2(file.open(QFile::ReadOnly), qPrintable(file.errorString())); + ba = file.readAll(); + QVERIFY(!ba.isEmpty()); + } + + QTemporaryDir dir; + QVERIFY(dir.isValid()); + + auto path = dir.path(); + QFile file(path + "/dummy"); + QVERIFY2(file.open(QFile::WriteOnly), qPrintable(file.errorString())); + QCOMPARE(file.write(ba), ba.size()); + file.close(); + + /* + Test the following order: + + /tmp/tmpDir/foo-en_US.qm + /tmp/tmpDir/foo-en_US + /tmp/tmpDir/foo-en.qm + /tmp/tmpDir/foo-en + /tmp/tmpDir/foo.qm + /tmp/tmpDir/foo- + /tmp/tmpDir/foo + */ + + QStringList files; + while (true) { + files.append(path + "/foo-" + localeName + ".qm"); + QVERIFY2(file.copy(files.last()), qPrintable(file.errorString())); + + files.append(path + "/foo-" + localeName); + QVERIFY2(file.copy(files.last()), qPrintable(file.errorString())); + + int rightmost = localeName.lastIndexOf(QLatin1Char('_')); + if (rightmost <= 0) + break; + localeName.truncate(rightmost); + } + + files.append(path + "/foo.qm"); + QVERIFY2(file.copy(files.last()), qPrintable(file.errorString())); + + files.append(path + "/foo-"); + QVERIFY2(file.copy(files.last()), qPrintable(file.errorString())); + + files.append(path + "/foo"); + QVERIFY2(file.rename(files.last()), qPrintable(file.errorString())); + + QTranslator tor; + for (const auto &filePath : files) { + QVERIFY(tor.load(locale, "foo", "-", path, ".qm")); + QCOMPARE(tor.filePath(), filePath); + QVERIFY2(file.remove(filePath), qPrintable(file.errorString())); + } +} + class TranslatorThread : public QThread { void run() { @@ -307,6 +353,15 @@ void tst_QTranslator::dependencies() QVERIFY(!tor.isEmpty()); QCOMPARE(tor.translate("QPushButton", "Hello world!"), QLatin1String("Hallo Welt!")); } + + { + // Test resolution of paths relative to main file + const QString absoluteFile = QFileInfo("dependencies_la").absoluteFilePath(); + QDir::setCurrent(QDir::tempPath()); + QTranslator tor; + QVERIFY(tor.load(absoluteFile)); + QVERIFY(!tor.isEmpty()); + } } struct TranslateThread : public QThread diff --git a/tests/auto/corelib/plugin/qplugin/tst_qplugin.cpp b/tests/auto/corelib/plugin/qplugin/tst_qplugin.cpp index aa85a7c3..0ad0fc70 100644 --- a/tests/auto/corelib/plugin/qplugin/tst_qplugin.cpp +++ b/tests/auto/corelib/plugin/qplugin/tst_qplugin.cpp @@ -228,6 +228,9 @@ static qsizetype locateMetadata(const uchar *data, qsizetype len) void tst_QPlugin::scanInvalidPlugin() { +#if defined(Q_OS_MACOS) && defined(Q_PROCESSOR_ARM) + QSKIP("This test crashes on ARM macOS"); +#endif const auto fileNames = dir.entryList({"*invalid*"}, QDir::Files); QString invalidPluginName; if (fileNames.isEmpty()) diff --git a/tests/auto/corelib/plugin/qpluginloader/machtest/machtest.pro b/tests/auto/corelib/plugin/qpluginloader/machtest/machtest.pro index 795dd898..7cfb7920 100644 --- a/tests/auto/corelib/plugin/qpluginloader/machtest/machtest.pro +++ b/tests/auto/corelib/plugin/qpluginloader/machtest/machtest.pro @@ -1,15 +1,11 @@ TEMPLATE = subdirs SUBDIRS = \ - machtest_i386.pro \ + machtest_arm64.pro \ machtest_x86_64.pro \ - machtest_ppc64.pro \ machtest_fat.pro machtest_fat-pro.depends = \ - machtest_i386.pro \ - machtest_x86_64.pro \ - machtest_ppc64.pro - -machtest_ppc64-pro.depends = \ + machtest_arm64.pro \ machtest_x86_64.pro + diff --git a/tests/auto/corelib/plugin/qpluginloader/machtest/machtest_arm64.pro b/tests/auto/corelib/plugin/qpluginloader/machtest/machtest_arm64.pro new file mode 100644 index 00000000..c2856a8a --- /dev/null +++ b/tests/auto/corelib/plugin/qpluginloader/machtest/machtest_arm64.pro @@ -0,0 +1,3 @@ +QMAKE_APPLE_DEVICE_ARCHS = arm64 +include(machtest.pri) + diff --git a/tests/auto/corelib/plugin/qpluginloader/machtest/machtest_fat.pro b/tests/auto/corelib/plugin/qpluginloader/machtest/machtest_fat.pro index 9c34a873..57c66549 100644 --- a/tests/auto/corelib/plugin/qpluginloader/machtest/machtest_fat.pro +++ b/tests/auto/corelib/plugin/qpluginloader/machtest/machtest_fat.pro @@ -7,41 +7,42 @@ load(qt) # Generate a fat binary with three architectures fat_all.target = good.fat.all.dylib fat_all.commands = lipo -create -output $@ \ - -arch ppc64 good.ppc64.dylib \ - -arch i386 good.i386.dylib \ + -arch arm64 good.arm64.dylib \ -arch x86_64 good.x86_64.dylib -fat_all.depends += good.i386.dylib good.x86_64.dylib good.ppc64.dylib +fat_all.depends += good.arm64.dylib good.x86_64.dylib -fat_no_i386.target = good.fat.no-i386.dylib -fat_no_i386.commands = lipo -create -output $@ -arch x86_64 good.x86_64.dylib -arch ppc64 good.ppc64.dylib -fat_no_i386.depends += good.x86_64.dylib good.ppc64.dylib +fat_no_arm64.target = good.fat.no-arm64.dylib +fat_no_arm64.commands = lipo -create -output $@ -arch x86_64 good.x86_64.dylib +fat_no_arm64.depends += good.x86_64.dylib fat_no_x86_64.target = good.fat.no-x86_64.dylib -fat_no_x86_64.commands = lipo -create -output $@ -arch i386 good.i386.dylib -arch ppc64 good.ppc64.dylib -fat_no_x86_64.depends += good.i386.dylib good.ppc64.dylib +fat_no_x86_64.commands = lipo -create -output $@ -arch arm64 good.arm64.dylib +fat_no_x86_64.depends += good.arm64.dylib -stub_i386.commands = $$QMAKE_CXX -shared -arch i386 -o stub.i386.dylib $$PWD/stub.cpp -stub_i386.depends += $$PWD/stub.cpp +stub_flags = -L$$system(xcrun --show-sdk-path)/usr/lib/ -stdlib=libc++ -stub_x86_64.commands = $$QMAKE_CXX -shared -arch x86_64 -o stub.x86_64.dylib $$PWD/stub.cpp +stub_arm64.commands = $$QMAKE_CXX $$stub_flags -shared -arch arm64 -o stub.arm64.dylib $$PWD/stub.cpp +stub_arm64.depends += $$PWD/stub.cpp + +stub_x86_64.commands = $$QMAKE_CXX $$stub_flags -shared -arch x86_64 -o stub.x86_64.dylib $$PWD/stub.cpp stub_x86_64.depends += $$PWD/stub.cpp -fat_stub_i386.target = good.fat.stub-i386.dylib -fat_stub_i386.commands = lipo -create -output $@ -arch ppc64 good.ppc64.dylib -arch i386 stub.i386.dylib -fat_stub_i386.depends += stub_i386 good.x86_64.dylib good.ppc64.dylib +fat_stub_arm64.target = good.fat.stub-arm64.dylib +fat_stub_arm64.commands = lipo -create -output $@ -arch arm64 stub.arm64.dylib +fat_stub_arm64.depends += stub_arm64 good.x86_64.dylib fat_stub_x86_64.target = good.fat.stub-x86_64.dylib -fat_stub_x86_64.commands = lipo -create -output $@ -arch ppc64 good.ppc64.dylib -arch x86_64 stub.x86_64.dylib -fat_stub_x86_64.depends += stub_x86_64 good.i386.dylib good.ppc64.dylib +fat_stub_x86_64.commands = lipo -create -output $@ -arch x86_64 stub.x86_64.dylib +fat_stub_x86_64.depends += stub_x86_64 good.arm64.dylib bad.commands = $$PWD/generate-bad.pl bad.depends += $$PWD/generate-bad.pl -MYTARGETS = $$fat_all.depends fat_all fat_no_x86_64 fat_no_i386 \ - fat_stub_i386 fat_stub_x86_64 bad stub_i386 stub_x86_64 +MYTARGETS = $$fat_all.depends fat_all fat_no_x86_64 fat_no_arm64 \ + fat_stub_arm64 fat_stub_x86_64 bad stub_arm64 stub_x86_64 all.depends += $$MYTARGETS QMAKE_EXTRA_TARGETS += $$MYTARGETS all -QMAKE_CLEAN += $$fat_all.target $$fat_no_i386.target $$fat_no_x86_64.target \ - $$fat_stub_i386.target $$fat_stub_x86_64.target \ +QMAKE_CLEAN += $$fat_all.target $$fat_no_arm64.target $$fat_no_x86_64.target \ + $$fat_stub_arm64.target $$fat_stub_x86_64.target \ "bad*.dylib" diff --git a/tests/auto/corelib/plugin/qpluginloader/machtest/machtest_i386.pro b/tests/auto/corelib/plugin/qpluginloader/machtest/machtest_i386.pro deleted file mode 100644 index bfb2e093..00000000 --- a/tests/auto/corelib/plugin/qpluginloader/machtest/machtest_i386.pro +++ /dev/null @@ -1,3 +0,0 @@ -QMAKE_APPLE_DEVICE_ARCHS = i386 -include(machtest.pri) - diff --git a/tests/auto/corelib/plugin/qpluginloader/machtest/machtest_ppc64.pro b/tests/auto/corelib/plugin/qpluginloader/machtest/machtest_ppc64.pro deleted file mode 100644 index a73f97cc..00000000 --- a/tests/auto/corelib/plugin/qpluginloader/machtest/machtest_ppc64.pro +++ /dev/null @@ -1,9 +0,0 @@ -QMAKE_APPLE_DEVICE_ARCHS = ppc64 -include(machtest.pri) - -OTHER_FILES += ppcconverter.pl - -# Current macOS toolchains have no compiler for PPC anymore -# So we fake it by converting an x86-64 binary to (little-endian!) PPC64 -goodlib.commands = $$PWD/ppcconverter.pl $< $@ -goodlib.depends = good.x86_64.dylib $$PWD/ppcconverter.pl diff --git a/tests/auto/corelib/plugin/qpluginloader/tst_qpluginloader.cpp b/tests/auto/corelib/plugin/qpluginloader/tst_qpluginloader.cpp index 8d548f52..ce805737 100644 --- a/tests/auto/corelib/plugin/qpluginloader/tst_qpluginloader.cpp +++ b/tests/auto/corelib/plugin/qpluginloader/tst_qpluginloader.cpp @@ -341,22 +341,19 @@ void tst_QPluginLoader::loadMachO_data() # ifdef Q_PROCESSOR_X86_64 QTest::newRow("machtest/good.x86_64.dylib") << int(QMachOParser::QtMetaDataSection); - QTest::newRow("machtest/good.i386.dylib") << int(QMachOParser::NotSuitable); + QTest::newRow("machtest/good.arm64.dylib") << int(QMachOParser::NotSuitable); QTest::newRow("machtest/good.fat.no-x86_64.dylib") << int(QMachOParser::NotSuitable); - QTest::newRow("machtest/good.fat.no-i386.dylib") << int(QMachOParser::QtMetaDataSection); -# elif defined(Q_PROCESSOR_X86_32) - QTest::newRow("machtest/good.i386.dylib") << int(QMachOParser::QtMetaDataSection); + QTest::newRow("machtest/good.fat.no-arm64.dylib") << int(QMachOParser::QtMetaDataSection); +# elif defined(Q_PROCESSOR_ARM) + QTest::newRow("machtest/good.arm64.dylib") << int(QMachOParser::QtMetaDataSection); QTest::newRow("machtest/good.x86_64.dylib") << int(QMachOParser::NotSuitable); - QTest::newRow("machtest/good.fat.no-i386.dylib") << int(QMachOParser::NotSuitable); + QTest::newRow("machtest/good.fat.no-arm64.dylib") << int(QMachOParser::NotSuitable); QTest::newRow("machtest/good.fat.no-x86_64.dylib") << int(QMachOParser::QtMetaDataSection); # endif -# ifndef Q_PROCESSOR_POWER_64 - QTest::newRow("machtest/good.ppc64.dylib") << int(QMachOParser::NotSuitable); -# endif QTest::newRow("machtest/good.fat.all.dylib") << int(QMachOParser::QtMetaDataSection); QTest::newRow("machtest/good.fat.stub-x86_64.dylib") << int(QMachOParser::NotSuitable); - QTest::newRow("machtest/good.fat.stub-i386.dylib") << int(QMachOParser::NotSuitable); + QTest::newRow("machtest/good.fat.stub-arm64.dylib") << int(QMachOParser::NotSuitable); QDir d(QFINDTESTDATA("machtest")); QStringList badlist = d.entryList(QStringList() << "bad*.dylib"); diff --git a/tests/auto/corelib/text/qchar/tst_qchar.cpp b/tests/auto/corelib/text/qchar/tst_qchar.cpp index cf4f6d21..1f6f36e9 100644 --- a/tests/auto/corelib/text/qchar/tst_qchar.cpp +++ b/tests/auto/corelib/text/qchar/tst_qchar.cpp @@ -980,6 +980,25 @@ void tst_QChar::normalization_manual() QVERIFY(decomposed.normalized(QString::NormalizationForm_KD) == decomposed); QVERIFY(decomposed.normalized(QString::NormalizationForm_KC) == composed); } + // QTBUG-71894 - erratum fixed in Unicode 4.1.0; SCount bounds are < not <= + { + // Hangul compose, test 0x11a7: + const QChar c[] = { QChar(0xae30), QChar(0x11a7), {} }; + const QChar d[] = { QChar(0x1100), QChar(0x1175), QChar(0x11a7), {} }; + const QString composed(c, 2); + const QString decomposed(d, 3); + + QCOMPARE(decomposed.normalized(QString::NormalizationForm_C), composed); + } + { + // Hangul compose, test 0x11c3: + const QChar c[] = { QChar(0xae30), QChar(0x11c3), {} }; + const QChar d[] = { QChar(0x1100), QChar(0x1175), QChar(0x11c3), {} }; + const QString composed(c, 2); + const QString decomposed(d, 3); + + QCOMPARE(decomposed.normalized(QString::NormalizationForm_C), composed); + } } void tst_QChar::normalizationCorrections() diff --git a/tests/auto/corelib/text/qlocale/tst_qlocale.cpp b/tests/auto/corelib/text/qlocale/tst_qlocale.cpp index 6ff69954..33fcb156 100644 --- a/tests/auto/corelib/text/qlocale/tst_qlocale.cpp +++ b/tests/auto/corelib/text/qlocale/tst_qlocale.cpp @@ -2477,6 +2477,10 @@ void tst_QLocale::dateFormat() const QLocale ir("ga_IE"); QCOMPARE(ir.dateFormat(QLocale::ShortFormat), QLatin1String("dd/MM/yyyy")); + + const auto sys = QLocale::system(); // QTBUG-92018, ru_RU on MS + const QDate date(2021, 3, 17); + QCOMPARE(sys.toString(date, sys.dateFormat(QLocale::LongFormat)), sys.toString(date)); } void tst_QLocale::timeFormat() @@ -2535,18 +2539,21 @@ void tst_QLocale::monthName() // 'de' locale doesn't have narrow month name QCOMPARE(de.monthName(12, QLocale::NarrowFormat), QLatin1String("D")); - QLocale ru("ru_RU"); + const QLocale ru("ru_RU"); QCOMPARE(ru.monthName(1, QLocale::LongFormat), QString::fromUtf8("\321\217\320\275\320\262\320\260\321\200\321\217")); QCOMPARE(ru.monthName(1, QLocale::ShortFormat), QString::fromUtf8("\321\217\320\275\320\262\56")); QCOMPARE(ru.monthName(1, QLocale::NarrowFormat), QString::fromUtf8("\320\257")); + const auto sys = QLocale::system(); + if (sys.language() == QLocale::Russian) // QTBUG-92018 + QVERIFY(sys.monthName(3) != sys.standaloneMonthName(3)); - QLocale ir("ga_IE"); + const QLocale ir("ga_IE"); QCOMPARE(ir.monthName(1, QLocale::ShortFormat), QLatin1String("Ean")); QCOMPARE(ir.monthName(12, QLocale::ShortFormat), QLatin1String("Noll")); - QLocale cz("cs_CZ"); + const QLocale cz("cs_CZ"); QCOMPARE(cz.monthName(1, QLocale::ShortFormat), QLatin1String("led")); QCOMPARE(cz.monthName(12, QLocale::ShortFormat), QLatin1String("pro")); } @@ -2630,6 +2637,8 @@ void tst_QLocale::currency() const QLocale es_CR(QLocale::Spanish, QLocale::CostaRica); QCOMPARE(es_CR.toCurrencyString(double(1565.25)), QString::fromUtf8("\xE2\x82\xA1" "1\xC2\xA0" "565,25")); + QCOMPARE(es_CR.toCurrencyString(double(12565.25)), + QString::fromUtf8("\xE2\x82\xA1" "12\xC2\xA0" "565,25")); const QLocale system = QLocale::system(); QVERIFY(system.toCurrencyString(1, QLatin1String("FOO")).contains(QLatin1String("FOO"))); @@ -2981,13 +2990,13 @@ void tst_QLocale::bcp47Name() class MySystemLocale : public QSystemLocale { public: - MySystemLocale(const QLocale &locale) : m_locale(locale) + MySystemLocale(const QString &locale) : m_name(locale), m_locale(locale) { } - QVariant query(QueryType /*type*/, QVariant /*in*/) const override + QVariant query(QueryType type, QVariant /*in*/) const override { - return QVariant(); + return type == UILanguages ? QVariant(QStringList{m_name}) : QVariant(); } QLocale fallbackUiLocale() const override @@ -2996,16 +3005,32 @@ public: } private: + const QString m_name; const QLocale m_locale; }; void tst_QLocale::systemLocale_data() { + // Test uses MySystemLocale, so is platform-independent. QTest::addColumn("name"); QTest::addColumn("language"); - QTest::addRow("catalan") << QString("ca") << QLocale::Catalan; - QTest::addRow("ukrainian") << QString("uk") << QLocale::Ukrainian; - QTest::addRow("german") << QString("de") << QLocale::German; + QTest::addColumn("uiLanguages"); + + QTest::addRow("catalan") + << QString("ca") << QLocale::Catalan + << QStringList{QStringLiteral("ca"), QStringLiteral("ca-ES"), QStringLiteral("ca-Latn-ES")}; + QTest::addRow("ukrainian") + << QString("uk") << QLocale::Ukrainian + << QStringList{QStringLiteral("uk"), QStringLiteral("uk-UA"), QStringLiteral("uk-Cyrl-UA")}; + QTest::addRow("german") + << QString("de") << QLocale::German + << QStringList{QStringLiteral("de"), QStringLiteral("de-DE"), QStringLiteral("de-Latn-DE")}; + QTest::addRow("chinese-min") + << QString("zh") << QLocale::Chinese + << QStringList{QStringLiteral("zh"), QStringLiteral("zh-CN"), QStringLiteral("zh-Hans-CN")}; + QTest::addRow("chinese-full") + << QString("zh-Hans-CN") << QLocale::Chinese + << QStringList{QStringLiteral("zh-Hans-CN"), QStringLiteral("zh"), QStringLiteral("zh-CN")}; } void tst_QLocale::systemLocale() @@ -3015,11 +3040,13 @@ void tst_QLocale::systemLocale() QFETCH(QString, name); QFETCH(QLocale::Language, language); + QFETCH(QStringList, uiLanguages); { MySystemLocale sLocale(name); QCOMPARE(QLocale().language(), language); QCOMPARE(QLocale::system().language(), language); + QCOMPARE(QLocale::system().uiLanguages(), uiLanguages); } QCOMPARE(QLocale(), originalLocale); diff --git a/tests/auto/corelib/text/qregularexpression/tst_qregularexpression.cpp b/tests/auto/corelib/text/qregularexpression/tst_qregularexpression.cpp index 88f8ea0b..b24243b9 100644 --- a/tests/auto/corelib/text/qregularexpression/tst_qregularexpression.cpp +++ b/tests/auto/corelib/text/qregularexpression/tst_qregularexpression.cpp @@ -80,6 +80,7 @@ private slots: void threadSafety_data(); void threadSafety(); + void returnsViewsIntoOriginalString(); void wildcard_data(); void wildcard(); void testInvalidWildcard_data(); @@ -2188,6 +2189,31 @@ void tst_QRegularExpression::threadSafety() } } +void tst_QRegularExpression::returnsViewsIntoOriginalString() +{ + // https://bugreports.qt.io/browse/QTBUG-98653 + + auto to_void = [](const QChar *p) -> const void* { return p; }; + + // GIVEN + // a QString with dynamically-allocated data: + const QString string = QLatin1String("A\nA\nB\nB\n\nC\nC"); // NOT QStringLiteral! + const auto stringDataAddress = to_void(string.data()); + + // and a view over said QString: + QStringView view(string); + const auto viewDataAddress = to_void(view.data()); + QCOMPARE(stringDataAddress, viewDataAddress); + + // WHEN + // we call view.split() with a temporary QRegularExpression object + const auto split = view.split(QRegularExpression( "(\r\n|\n|\r)" ), Qt::KeepEmptyParts); + + // THEN + // the returned views should point into the underlying string: + QCOMPARE(to_void(split.front().data()), stringDataAddress); +} + void tst_QRegularExpression::wildcard_data() { QTest::addColumn("pattern"); diff --git a/tests/auto/corelib/text/qstring/tst_qstring.cpp b/tests/auto/corelib/text/qstring/tst_qstring.cpp index 8f538240..696b8159 100644 --- a/tests/auto/corelib/text/qstring/tst_qstring.cpp +++ b/tests/auto/corelib/text/qstring/tst_qstring.cpp @@ -600,6 +600,7 @@ private slots: void isValidUtf16_data(); void isValidUtf16(); void unicodeStrings(); + void vasprintfWithPrecision(); }; template const T &verifyZeroTermination(const T &t) { return t; } @@ -1674,7 +1675,7 @@ void tst_QString::lastIndexOf() QCOMPARE(haystack.lastIndexOf(needle.toLatin1(), from, cs), expected); QCOMPARE(haystack.lastIndexOf(needle.toLatin1().data(), from, cs), expected); - if (from >= -1 && from < haystack.size() && needle.size() > 0) { + if (from >= -1 && from < haystack.size()) { // unfortunately, QString and QRegExp don't have the same out of bound semantics // I think QString is wrong -- See file log for contact information. { @@ -7148,6 +7149,35 @@ void tst_QString::isValidUtf16() QTEST(string.isValidUtf16(), "valid"); } +static QString doVasprintf(const char *msg, ...) { + va_list args; + va_start(args, msg); + const QString result = QString::vasprintf(msg, args); + va_end(args); + return result; +} + +void tst_QString::vasprintfWithPrecision() +{ + { + const char *msg = "Endpoint %.*s with"; + static const char arg0[3] = { 'a', 'b', 'c' }; + static const char arg1[4] = { 'a', 'b', 'c', '\0' }; + QCOMPARE(doVasprintf(msg, 3, arg0), QStringLiteral("Endpoint abc with")); + QCOMPARE(doVasprintf(msg, 9, arg1), QStringLiteral("Endpoint abc with")); + QCOMPARE(doVasprintf(msg, 0, nullptr), QStringLiteral("Endpoint with")); + } + + { + const char *msg = "Endpoint %.*ls with"; + static const ushort arg0[3] = { 'a', 'b', 'c' }; + static const ushort arg1[4] = { 'a', 'b', 'c', '\0' }; + QCOMPARE(doVasprintf(msg, 3, arg0), QStringLiteral("Endpoint abc with")); + QCOMPARE(doVasprintf(msg, 9, arg1), QStringLiteral("Endpoint abc with")); + QCOMPARE(doVasprintf(msg, 0, nullptr), QStringLiteral("Endpoint with")); + } +} + QTEST_APPLESS_MAIN(tst_QString) #include "tst_qstring.moc" diff --git a/tests/auto/corelib/text/qtextboundaryfinder/data/GraphemeBreakTest.txt b/tests/auto/corelib/text/qtextboundaryfinder/data/GraphemeBreakTest.txt index a4eb3bf3..5baf292a 100644 --- a/tests/auto/corelib/text/qtextboundaryfinder/data/GraphemeBreakTest.txt +++ b/tests/auto/corelib/text/qtextboundaryfinder/data/GraphemeBreakTest.txt @@ -618,11 +618,11 @@ ÷ 0061 ÷ 0600 × 0062 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Other) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) × [9.2] LATIN SMALL LETTER B (Other) ÷ [0.3] ÷ 1F476 × 1F3FF ÷ 1F476 ÷ # ÷ [0.2] BABY (ExtPict) × [9.0] EMOJI MODIFIER FITZPATRICK TYPE-6 (Extend) ÷ [999.0] BABY (ExtPict) ÷ [0.3] ÷ 0061 × 1F3FF ÷ 1F476 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Other) × [9.0] EMOJI MODIFIER FITZPATRICK TYPE-6 (Extend) ÷ [999.0] BABY (ExtPict) ÷ [0.3] -# ÷ 0061 × 1F3FF ÷ 1F476 × 200D × 1F6D1 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Other) × [9.0] EMOJI MODIFIER FITZPATRICK TYPE-6 (Extend) ÷ [999.0] BABY (ExtPict) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [11.0] OCTAGONAL SIGN (ExtPict) ÷ [0.3] -# ÷ 1F476 × 1F3FF × 0308 × 200D × 1F476 × 1F3FF ÷ # ÷ [0.2] BABY (ExtPict) × [9.0] EMOJI MODIFIER FITZPATRICK TYPE-6 (Extend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [11.0] BABY (ExtPict) × [9.0] EMOJI MODIFIER FITZPATRICK TYPE-6 (Extend) ÷ [0.3] -# ÷ 1F6D1 × 200D × 1F6D1 ÷ # ÷ [0.2] OCTAGONAL SIGN (ExtPict) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [11.0] OCTAGONAL SIGN (ExtPict) ÷ [0.3] +÷ 0061 × 1F3FF ÷ 1F476 × 200D × 1F6D1 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Other) × [9.0] EMOJI MODIFIER FITZPATRICK TYPE-6 (Extend) ÷ [999.0] BABY (ExtPict) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [11.0] OCTAGONAL SIGN (ExtPict) ÷ [0.3] +÷ 1F476 × 1F3FF × 0308 × 200D × 1F476 × 1F3FF ÷ # ÷ [0.2] BABY (ExtPict) × [9.0] EMOJI MODIFIER FITZPATRICK TYPE-6 (Extend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [11.0] BABY (ExtPict) × [9.0] EMOJI MODIFIER FITZPATRICK TYPE-6 (Extend) ÷ [0.3] +÷ 1F6D1 × 200D × 1F6D1 ÷ # ÷ [0.2] OCTAGONAL SIGN (ExtPict) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [11.0] OCTAGONAL SIGN (ExtPict) ÷ [0.3] ÷ 0061 × 200D ÷ 1F6D1 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Other) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [999.0] OCTAGONAL SIGN (ExtPict) ÷ [0.3] -# ÷ 2701 × 200D × 2701 ÷ # ÷ [0.2] UPPER BLADE SCISSORS (Other) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [11.0] UPPER BLADE SCISSORS (Other) ÷ [0.3] +÷ 2701 × 200D × 2701 ÷ # ÷ [0.2] UPPER BLADE SCISSORS (Other) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [11.0] UPPER BLADE SCISSORS (Other) ÷ [0.3] ÷ 0061 × 200D ÷ 2701 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Other) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [999.0] UPPER BLADE SCISSORS (Other) ÷ [0.3] # # Lines: 602 diff --git a/tests/auto/corelib/text/qtextboundaryfinder/data/GraphemeBreakTest.txt.full b/tests/auto/corelib/text/qtextboundaryfinder/data/GraphemeBreakTest.txt.full deleted file mode 100644 index 5baf292a..00000000 --- a/tests/auto/corelib/text/qtextboundaryfinder/data/GraphemeBreakTest.txt.full +++ /dev/null @@ -1,630 +0,0 @@ -# GraphemeBreakTest-13.0.0.txt -# Date: 2019-11-15, 19:49:10 GMT -# © 2019 Unicode®, Inc. -# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. -# For terms of use, see http://www.unicode.org/terms_of_use.html -# -# Unicode Character Database -# For documentation, see http://www.unicode.org/reports/tr44/ -# -# Default Grapheme_Cluster_Break Test -# -# Format: -# (# )? -# contains hex Unicode code points, with -# ÷ wherever there is a break opportunity, and -# × wherever there is not. -# the format can change, but currently it shows: -# - the sample character name -# - (x) the Grapheme_Cluster_Break property value for the sample character -# - [x] the rule that determines whether there is a break or not, -# as listed in the Rules section of GraphemeBreakTest.html -# -# These samples may be extended or changed in the future. -# -÷ 0020 ÷ 0020 ÷ # ÷ [0.2] SPACE (Other) ÷ [999.0] SPACE (Other) ÷ [0.3] -÷ 0020 × 0308 ÷ 0020 ÷ # ÷ [0.2] SPACE (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] SPACE (Other) ÷ [0.3] -÷ 0020 ÷ 000D ÷ # ÷ [0.2] SPACE (Other) ÷ [5.0] (CR) ÷ [0.3] -÷ 0020 × 0308 ÷ 000D ÷ # ÷ [0.2] SPACE (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (CR) ÷ [0.3] -÷ 0020 ÷ 000A ÷ # ÷ [0.2] SPACE (Other) ÷ [5.0] (LF) ÷ [0.3] -÷ 0020 × 0308 ÷ 000A ÷ # ÷ [0.2] SPACE (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (LF) ÷ [0.3] -÷ 0020 ÷ 0001 ÷ # ÷ [0.2] SPACE (Other) ÷ [5.0] (Control) ÷ [0.3] -÷ 0020 × 0308 ÷ 0001 ÷ # ÷ [0.2] SPACE (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (Control) ÷ [0.3] -÷ 0020 × 034F ÷ # ÷ [0.2] SPACE (Other) × [9.0] COMBINING GRAPHEME JOINER (Extend) ÷ [0.3] -÷ 0020 × 0308 × 034F ÷ # ÷ [0.2] SPACE (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAPHEME JOINER (Extend) ÷ [0.3] -÷ 0020 ÷ 1F1E6 ÷ # ÷ [0.2] SPACE (Other) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -÷ 0020 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] SPACE (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -÷ 0020 ÷ 0600 ÷ # ÷ [0.2] SPACE (Other) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] -÷ 0020 × 0308 ÷ 0600 ÷ # ÷ [0.2] SPACE (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] -÷ 0020 × 0903 ÷ # ÷ [0.2] SPACE (Other) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] -÷ 0020 × 0308 × 0903 ÷ # ÷ [0.2] SPACE (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] -÷ 0020 ÷ 1100 ÷ # ÷ [0.2] SPACE (Other) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] -÷ 0020 × 0308 ÷ 1100 ÷ # ÷ [0.2] SPACE (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] -÷ 0020 ÷ 1160 ÷ # ÷ [0.2] SPACE (Other) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] -÷ 0020 × 0308 ÷ 1160 ÷ # ÷ [0.2] SPACE (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] -÷ 0020 ÷ 11A8 ÷ # ÷ [0.2] SPACE (Other) ÷ [999.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] -÷ 0020 × 0308 ÷ 11A8 ÷ # ÷ [0.2] SPACE (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] -÷ 0020 ÷ AC00 ÷ # ÷ [0.2] SPACE (Other) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] -÷ 0020 × 0308 ÷ AC00 ÷ # ÷ [0.2] SPACE (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] -÷ 0020 ÷ AC01 ÷ # ÷ [0.2] SPACE (Other) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] -÷ 0020 × 0308 ÷ AC01 ÷ # ÷ [0.2] SPACE (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] -÷ 0020 ÷ 231A ÷ # ÷ [0.2] SPACE (Other) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] -÷ 0020 × 0308 ÷ 231A ÷ # ÷ [0.2] SPACE (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] -÷ 0020 × 0300 ÷ # ÷ [0.2] SPACE (Other) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] -÷ 0020 × 0308 × 0300 ÷ # ÷ [0.2] SPACE (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] -÷ 0020 × 200D ÷ # ÷ [0.2] SPACE (Other) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] -÷ 0020 × 0308 × 200D ÷ # ÷ [0.2] SPACE (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] -÷ 0020 ÷ 0378 ÷ # ÷ [0.2] SPACE (Other) ÷ [999.0] (Other) ÷ [0.3] -÷ 0020 × 0308 ÷ 0378 ÷ # ÷ [0.2] SPACE (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] (Other) ÷ [0.3] -÷ 000D ÷ 0020 ÷ # ÷ [0.2] (CR) ÷ [4.0] SPACE (Other) ÷ [0.3] -÷ 000D ÷ 0308 ÷ 0020 ÷ # ÷ [0.2] (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] SPACE (Other) ÷ [0.3] -÷ 000D ÷ 000D ÷ # ÷ [0.2] (CR) ÷ [4.0] (CR) ÷ [0.3] -÷ 000D ÷ 0308 ÷ 000D ÷ # ÷ [0.2] (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (CR) ÷ [0.3] -÷ 000D × 000A ÷ # ÷ [0.2] (CR) × [3.0] (LF) ÷ [0.3] -÷ 000D ÷ 0308 ÷ 000A ÷ # ÷ [0.2] (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (LF) ÷ [0.3] -÷ 000D ÷ 0001 ÷ # ÷ [0.2] (CR) ÷ [4.0] (Control) ÷ [0.3] -÷ 000D ÷ 0308 ÷ 0001 ÷ # ÷ [0.2] (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (Control) ÷ [0.3] -÷ 000D ÷ 034F ÷ # ÷ [0.2] (CR) ÷ [4.0] COMBINING GRAPHEME JOINER (Extend) ÷ [0.3] -÷ 000D ÷ 0308 × 034F ÷ # ÷ [0.2] (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAPHEME JOINER (Extend) ÷ [0.3] -÷ 000D ÷ 1F1E6 ÷ # ÷ [0.2] (CR) ÷ [4.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -÷ 000D ÷ 0308 ÷ 1F1E6 ÷ # ÷ [0.2] (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -÷ 000D ÷ 0600 ÷ # ÷ [0.2] (CR) ÷ [4.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] -÷ 000D ÷ 0308 ÷ 0600 ÷ # ÷ [0.2] (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] -÷ 000D ÷ 0903 ÷ # ÷ [0.2] (CR) ÷ [4.0] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] -÷ 000D ÷ 0308 × 0903 ÷ # ÷ [0.2] (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] -÷ 000D ÷ 1100 ÷ # ÷ [0.2] (CR) ÷ [4.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] -÷ 000D ÷ 0308 ÷ 1100 ÷ # ÷ [0.2] (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] -÷ 000D ÷ 1160 ÷ # ÷ [0.2] (CR) ÷ [4.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] -÷ 000D ÷ 0308 ÷ 1160 ÷ # ÷ [0.2] (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] -÷ 000D ÷ 11A8 ÷ # ÷ [0.2] (CR) ÷ [4.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] -÷ 000D ÷ 0308 ÷ 11A8 ÷ # ÷ [0.2] (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] -÷ 000D ÷ AC00 ÷ # ÷ [0.2] (CR) ÷ [4.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] -÷ 000D ÷ 0308 ÷ AC00 ÷ # ÷ [0.2] (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] -÷ 000D ÷ AC01 ÷ # ÷ [0.2] (CR) ÷ [4.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] -÷ 000D ÷ 0308 ÷ AC01 ÷ # ÷ [0.2] (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] -÷ 000D ÷ 231A ÷ # ÷ [0.2] (CR) ÷ [4.0] WATCH (ExtPict) ÷ [0.3] -÷ 000D ÷ 0308 ÷ 231A ÷ # ÷ [0.2] (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] -÷ 000D ÷ 0300 ÷ # ÷ [0.2] (CR) ÷ [4.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] -÷ 000D ÷ 0308 × 0300 ÷ # ÷ [0.2] (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] -÷ 000D ÷ 200D ÷ # ÷ [0.2] (CR) ÷ [4.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] -÷ 000D ÷ 0308 × 200D ÷ # ÷ [0.2] (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] -÷ 000D ÷ 0378 ÷ # ÷ [0.2] (CR) ÷ [4.0] (Other) ÷ [0.3] -÷ 000D ÷ 0308 ÷ 0378 ÷ # ÷ [0.2] (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] (Other) ÷ [0.3] -÷ 000A ÷ 0020 ÷ # ÷ [0.2] (LF) ÷ [4.0] SPACE (Other) ÷ [0.3] -÷ 000A ÷ 0308 ÷ 0020 ÷ # ÷ [0.2] (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] SPACE (Other) ÷ [0.3] -÷ 000A ÷ 000D ÷ # ÷ [0.2] (LF) ÷ [4.0] (CR) ÷ [0.3] -÷ 000A ÷ 0308 ÷ 000D ÷ # ÷ [0.2] (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (CR) ÷ [0.3] -÷ 000A ÷ 000A ÷ # ÷ [0.2] (LF) ÷ [4.0] (LF) ÷ [0.3] -÷ 000A ÷ 0308 ÷ 000A ÷ # ÷ [0.2] (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (LF) ÷ [0.3] -÷ 000A ÷ 0001 ÷ # ÷ [0.2] (LF) ÷ [4.0] (Control) ÷ [0.3] -÷ 000A ÷ 0308 ÷ 0001 ÷ # ÷ [0.2] (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (Control) ÷ [0.3] -÷ 000A ÷ 034F ÷ # ÷ [0.2] (LF) ÷ [4.0] COMBINING GRAPHEME JOINER (Extend) ÷ [0.3] -÷ 000A ÷ 0308 × 034F ÷ # ÷ [0.2] (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAPHEME JOINER (Extend) ÷ [0.3] -÷ 000A ÷ 1F1E6 ÷ # ÷ [0.2] (LF) ÷ [4.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -÷ 000A ÷ 0308 ÷ 1F1E6 ÷ # ÷ [0.2] (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -÷ 000A ÷ 0600 ÷ # ÷ [0.2] (LF) ÷ [4.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] -÷ 000A ÷ 0308 ÷ 0600 ÷ # ÷ [0.2] (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] -÷ 000A ÷ 0903 ÷ # ÷ [0.2] (LF) ÷ [4.0] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] -÷ 000A ÷ 0308 × 0903 ÷ # ÷ [0.2] (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] -÷ 000A ÷ 1100 ÷ # ÷ [0.2] (LF) ÷ [4.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] -÷ 000A ÷ 0308 ÷ 1100 ÷ # ÷ [0.2] (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] -÷ 000A ÷ 1160 ÷ # ÷ [0.2] (LF) ÷ [4.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] -÷ 000A ÷ 0308 ÷ 1160 ÷ # ÷ [0.2] (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] -÷ 000A ÷ 11A8 ÷ # ÷ [0.2] (LF) ÷ [4.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] -÷ 000A ÷ 0308 ÷ 11A8 ÷ # ÷ [0.2] (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] -÷ 000A ÷ AC00 ÷ # ÷ [0.2] (LF) ÷ [4.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] -÷ 000A ÷ 0308 ÷ AC00 ÷ # ÷ [0.2] (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] -÷ 000A ÷ AC01 ÷ # ÷ [0.2] (LF) ÷ [4.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] -÷ 000A ÷ 0308 ÷ AC01 ÷ # ÷ [0.2] (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] -÷ 000A ÷ 231A ÷ # ÷ [0.2] (LF) ÷ [4.0] WATCH (ExtPict) ÷ [0.3] -÷ 000A ÷ 0308 ÷ 231A ÷ # ÷ [0.2] (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] -÷ 000A ÷ 0300 ÷ # ÷ [0.2] (LF) ÷ [4.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] -÷ 000A ÷ 0308 × 0300 ÷ # ÷ [0.2] (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] -÷ 000A ÷ 200D ÷ # ÷ [0.2] (LF) ÷ [4.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] -÷ 000A ÷ 0308 × 200D ÷ # ÷ [0.2] (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] -÷ 000A ÷ 0378 ÷ # ÷ [0.2] (LF) ÷ [4.0] (Other) ÷ [0.3] -÷ 000A ÷ 0308 ÷ 0378 ÷ # ÷ [0.2] (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] (Other) ÷ [0.3] -÷ 0001 ÷ 0020 ÷ # ÷ [0.2] (Control) ÷ [4.0] SPACE (Other) ÷ [0.3] -÷ 0001 ÷ 0308 ÷ 0020 ÷ # ÷ [0.2] (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] SPACE (Other) ÷ [0.3] -÷ 0001 ÷ 000D ÷ # ÷ [0.2] (Control) ÷ [4.0] (CR) ÷ [0.3] -÷ 0001 ÷ 0308 ÷ 000D ÷ # ÷ [0.2] (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (CR) ÷ [0.3] -÷ 0001 ÷ 000A ÷ # ÷ [0.2] (Control) ÷ [4.0] (LF) ÷ [0.3] -÷ 0001 ÷ 0308 ÷ 000A ÷ # ÷ [0.2] (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (LF) ÷ [0.3] -÷ 0001 ÷ 0001 ÷ # ÷ [0.2] (Control) ÷ [4.0] (Control) ÷ [0.3] -÷ 0001 ÷ 0308 ÷ 0001 ÷ # ÷ [0.2] (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (Control) ÷ [0.3] -÷ 0001 ÷ 034F ÷ # ÷ [0.2] (Control) ÷ [4.0] COMBINING GRAPHEME JOINER (Extend) ÷ [0.3] -÷ 0001 ÷ 0308 × 034F ÷ # ÷ [0.2] (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAPHEME JOINER (Extend) ÷ [0.3] -÷ 0001 ÷ 1F1E6 ÷ # ÷ [0.2] (Control) ÷ [4.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -÷ 0001 ÷ 0308 ÷ 1F1E6 ÷ # ÷ [0.2] (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -÷ 0001 ÷ 0600 ÷ # ÷ [0.2] (Control) ÷ [4.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] -÷ 0001 ÷ 0308 ÷ 0600 ÷ # ÷ [0.2] (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] -÷ 0001 ÷ 0903 ÷ # ÷ [0.2] (Control) ÷ [4.0] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] -÷ 0001 ÷ 0308 × 0903 ÷ # ÷ [0.2] (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] -÷ 0001 ÷ 1100 ÷ # ÷ [0.2] (Control) ÷ [4.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] -÷ 0001 ÷ 0308 ÷ 1100 ÷ # ÷ [0.2] (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] -÷ 0001 ÷ 1160 ÷ # ÷ [0.2] (Control) ÷ [4.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] -÷ 0001 ÷ 0308 ÷ 1160 ÷ # ÷ [0.2] (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] -÷ 0001 ÷ 11A8 ÷ # ÷ [0.2] (Control) ÷ [4.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] -÷ 0001 ÷ 0308 ÷ 11A8 ÷ # ÷ [0.2] (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] -÷ 0001 ÷ AC00 ÷ # ÷ [0.2] (Control) ÷ [4.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] -÷ 0001 ÷ 0308 ÷ AC00 ÷ # ÷ [0.2] (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] -÷ 0001 ÷ AC01 ÷ # ÷ [0.2] (Control) ÷ [4.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] -÷ 0001 ÷ 0308 ÷ AC01 ÷ # ÷ [0.2] (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] -÷ 0001 ÷ 231A ÷ # ÷ [0.2] (Control) ÷ [4.0] WATCH (ExtPict) ÷ [0.3] -÷ 0001 ÷ 0308 ÷ 231A ÷ # ÷ [0.2] (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] -÷ 0001 ÷ 0300 ÷ # ÷ [0.2] (Control) ÷ [4.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] -÷ 0001 ÷ 0308 × 0300 ÷ # ÷ [0.2] (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] -÷ 0001 ÷ 200D ÷ # ÷ [0.2] (Control) ÷ [4.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] -÷ 0001 ÷ 0308 × 200D ÷ # ÷ [0.2] (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] -÷ 0001 ÷ 0378 ÷ # ÷ [0.2] (Control) ÷ [4.0] (Other) ÷ [0.3] -÷ 0001 ÷ 0308 ÷ 0378 ÷ # ÷ [0.2] (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] (Other) ÷ [0.3] -÷ 034F ÷ 0020 ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) ÷ [999.0] SPACE (Other) ÷ [0.3] -÷ 034F × 0308 ÷ 0020 ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] SPACE (Other) ÷ [0.3] -÷ 034F ÷ 000D ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) ÷ [5.0] (CR) ÷ [0.3] -÷ 034F × 0308 ÷ 000D ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (CR) ÷ [0.3] -÷ 034F ÷ 000A ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) ÷ [5.0] (LF) ÷ [0.3] -÷ 034F × 0308 ÷ 000A ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (LF) ÷ [0.3] -÷ 034F ÷ 0001 ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) ÷ [5.0] (Control) ÷ [0.3] -÷ 034F × 0308 ÷ 0001 ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (Control) ÷ [0.3] -÷ 034F × 034F ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) × [9.0] COMBINING GRAPHEME JOINER (Extend) ÷ [0.3] -÷ 034F × 0308 × 034F ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAPHEME JOINER (Extend) ÷ [0.3] -÷ 034F ÷ 1F1E6 ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -÷ 034F × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -÷ 034F ÷ 0600 ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] -÷ 034F × 0308 ÷ 0600 ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] -÷ 034F × 0903 ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] -÷ 034F × 0308 × 0903 ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] -÷ 034F ÷ 1100 ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] -÷ 034F × 0308 ÷ 1100 ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] -÷ 034F ÷ 1160 ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] -÷ 034F × 0308 ÷ 1160 ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] -÷ 034F ÷ 11A8 ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) ÷ [999.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] -÷ 034F × 0308 ÷ 11A8 ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] -÷ 034F ÷ AC00 ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] -÷ 034F × 0308 ÷ AC00 ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] -÷ 034F ÷ AC01 ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] -÷ 034F × 0308 ÷ AC01 ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] -÷ 034F ÷ 231A ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] -÷ 034F × 0308 ÷ 231A ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] -÷ 034F × 0300 ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] -÷ 034F × 0308 × 0300 ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] -÷ 034F × 200D ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] -÷ 034F × 0308 × 200D ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] -÷ 034F ÷ 0378 ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) ÷ [999.0] (Other) ÷ [0.3] -÷ 034F × 0308 ÷ 0378 ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] (Other) ÷ [0.3] -÷ 1F1E6 ÷ 0020 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] SPACE (Other) ÷ [0.3] -÷ 1F1E6 × 0308 ÷ 0020 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] SPACE (Other) ÷ [0.3] -÷ 1F1E6 ÷ 000D ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [5.0] (CR) ÷ [0.3] -÷ 1F1E6 × 0308 ÷ 000D ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (CR) ÷ [0.3] -÷ 1F1E6 ÷ 000A ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [5.0] (LF) ÷ [0.3] -÷ 1F1E6 × 0308 ÷ 000A ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (LF) ÷ [0.3] -÷ 1F1E6 ÷ 0001 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [5.0] (Control) ÷ [0.3] -÷ 1F1E6 × 0308 ÷ 0001 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (Control) ÷ [0.3] -÷ 1F1E6 × 034F ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING GRAPHEME JOINER (Extend) ÷ [0.3] -÷ 1F1E6 × 0308 × 034F ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAPHEME JOINER (Extend) ÷ [0.3] -÷ 1F1E6 × 1F1E6 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [12.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -÷ 1F1E6 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -÷ 1F1E6 ÷ 0600 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] -÷ 1F1E6 × 0308 ÷ 0600 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] -÷ 1F1E6 × 0903 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] -÷ 1F1E6 × 0308 × 0903 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] -÷ 1F1E6 ÷ 1100 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] -÷ 1F1E6 × 0308 ÷ 1100 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] -÷ 1F1E6 ÷ 1160 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] -÷ 1F1E6 × 0308 ÷ 1160 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] -÷ 1F1E6 ÷ 11A8 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] -÷ 1F1E6 × 0308 ÷ 11A8 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] -÷ 1F1E6 ÷ AC00 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] -÷ 1F1E6 × 0308 ÷ AC00 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] -÷ 1F1E6 ÷ AC01 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] -÷ 1F1E6 × 0308 ÷ AC01 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] -÷ 1F1E6 ÷ 231A ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] -÷ 1F1E6 × 0308 ÷ 231A ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] -÷ 1F1E6 × 0300 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] -÷ 1F1E6 × 0308 × 0300 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] -÷ 1F1E6 × 200D ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] -÷ 1F1E6 × 0308 × 200D ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] -÷ 1F1E6 ÷ 0378 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] (Other) ÷ [0.3] -÷ 1F1E6 × 0308 ÷ 0378 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] (Other) ÷ [0.3] -÷ 0600 × 0020 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.2] SPACE (Other) ÷ [0.3] -÷ 0600 × 0308 ÷ 0020 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] SPACE (Other) ÷ [0.3] -÷ 0600 ÷ 000D ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) ÷ [5.0] (CR) ÷ [0.3] -÷ 0600 × 0308 ÷ 000D ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (CR) ÷ [0.3] -÷ 0600 ÷ 000A ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) ÷ [5.0] (LF) ÷ [0.3] -÷ 0600 × 0308 ÷ 000A ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (LF) ÷ [0.3] -÷ 0600 ÷ 0001 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) ÷ [5.0] (Control) ÷ [0.3] -÷ 0600 × 0308 ÷ 0001 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (Control) ÷ [0.3] -÷ 0600 × 034F ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.0] COMBINING GRAPHEME JOINER (Extend) ÷ [0.3] -÷ 0600 × 0308 × 034F ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAPHEME JOINER (Extend) ÷ [0.3] -÷ 0600 × 1F1E6 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -÷ 0600 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -÷ 0600 × 0600 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.2] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] -÷ 0600 × 0308 ÷ 0600 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] -÷ 0600 × 0903 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] -÷ 0600 × 0308 × 0903 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] -÷ 0600 × 1100 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.2] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] -÷ 0600 × 0308 ÷ 1100 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] -÷ 0600 × 1160 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.2] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] -÷ 0600 × 0308 ÷ 1160 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] -÷ 0600 × 11A8 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.2] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] -÷ 0600 × 0308 ÷ 11A8 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] -÷ 0600 × AC00 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.2] HANGUL SYLLABLE GA (LV) ÷ [0.3] -÷ 0600 × 0308 ÷ AC00 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] -÷ 0600 × AC01 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.2] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] -÷ 0600 × 0308 ÷ AC01 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] -÷ 0600 × 231A ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.2] WATCH (ExtPict) ÷ [0.3] -÷ 0600 × 0308 ÷ 231A ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] -÷ 0600 × 0300 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] -÷ 0600 × 0308 × 0300 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] -÷ 0600 × 200D ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] -÷ 0600 × 0308 × 200D ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] -÷ 0600 × 0378 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.2] (Other) ÷ [0.3] -÷ 0600 × 0308 ÷ 0378 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] (Other) ÷ [0.3] -÷ 0903 ÷ 0020 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [999.0] SPACE (Other) ÷ [0.3] -÷ 0903 × 0308 ÷ 0020 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] SPACE (Other) ÷ [0.3] -÷ 0903 ÷ 000D ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [5.0] (CR) ÷ [0.3] -÷ 0903 × 0308 ÷ 000D ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (CR) ÷ [0.3] -÷ 0903 ÷ 000A ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [5.0] (LF) ÷ [0.3] -÷ 0903 × 0308 ÷ 000A ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (LF) ÷ [0.3] -÷ 0903 ÷ 0001 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [5.0] (Control) ÷ [0.3] -÷ 0903 × 0308 ÷ 0001 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (Control) ÷ [0.3] -÷ 0903 × 034F ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × [9.0] COMBINING GRAPHEME JOINER (Extend) ÷ [0.3] -÷ 0903 × 0308 × 034F ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAPHEME JOINER (Extend) ÷ [0.3] -÷ 0903 ÷ 1F1E6 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -÷ 0903 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -÷ 0903 ÷ 0600 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] -÷ 0903 × 0308 ÷ 0600 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] -÷ 0903 × 0903 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] -÷ 0903 × 0308 × 0903 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] -÷ 0903 ÷ 1100 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] -÷ 0903 × 0308 ÷ 1100 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] -÷ 0903 ÷ 1160 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] -÷ 0903 × 0308 ÷ 1160 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] -÷ 0903 ÷ 11A8 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [999.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] -÷ 0903 × 0308 ÷ 11A8 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] -÷ 0903 ÷ AC00 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] -÷ 0903 × 0308 ÷ AC00 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] -÷ 0903 ÷ AC01 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] -÷ 0903 × 0308 ÷ AC01 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] -÷ 0903 ÷ 231A ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] -÷ 0903 × 0308 ÷ 231A ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] -÷ 0903 × 0300 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] -÷ 0903 × 0308 × 0300 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] -÷ 0903 × 200D ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] -÷ 0903 × 0308 × 200D ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] -÷ 0903 ÷ 0378 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [999.0] (Other) ÷ [0.3] -÷ 0903 × 0308 ÷ 0378 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] (Other) ÷ [0.3] -÷ 1100 ÷ 0020 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) ÷ [999.0] SPACE (Other) ÷ [0.3] -÷ 1100 × 0308 ÷ 0020 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] SPACE (Other) ÷ [0.3] -÷ 1100 ÷ 000D ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) ÷ [5.0] (CR) ÷ [0.3] -÷ 1100 × 0308 ÷ 000D ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (CR) ÷ [0.3] -÷ 1100 ÷ 000A ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) ÷ [5.0] (LF) ÷ [0.3] -÷ 1100 × 0308 ÷ 000A ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (LF) ÷ [0.3] -÷ 1100 ÷ 0001 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) ÷ [5.0] (Control) ÷ [0.3] -÷ 1100 × 0308 ÷ 0001 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (Control) ÷ [0.3] -÷ 1100 × 034F ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] COMBINING GRAPHEME JOINER (Extend) ÷ [0.3] -÷ 1100 × 0308 × 034F ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAPHEME JOINER (Extend) ÷ [0.3] -÷ 1100 ÷ 1F1E6 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -÷ 1100 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -÷ 1100 ÷ 0600 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] -÷ 1100 × 0308 ÷ 0600 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] -÷ 1100 × 0903 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] -÷ 1100 × 0308 × 0903 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] -÷ 1100 × 1100 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [6.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] -÷ 1100 × 0308 ÷ 1100 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] -÷ 1100 × 1160 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [6.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] -÷ 1100 × 0308 ÷ 1160 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] -÷ 1100 ÷ 11A8 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) ÷ [999.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] -÷ 1100 × 0308 ÷ 11A8 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] -÷ 1100 × AC00 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [6.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] -÷ 1100 × 0308 ÷ AC00 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] -÷ 1100 × AC01 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [6.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] -÷ 1100 × 0308 ÷ AC01 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] -÷ 1100 ÷ 231A ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] -÷ 1100 × 0308 ÷ 231A ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] -÷ 1100 × 0300 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] -÷ 1100 × 0308 × 0300 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] -÷ 1100 × 200D ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] -÷ 1100 × 0308 × 200D ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] -÷ 1100 ÷ 0378 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) ÷ [999.0] (Other) ÷ [0.3] -÷ 1100 × 0308 ÷ 0378 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] (Other) ÷ [0.3] -÷ 1160 ÷ 0020 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) ÷ [999.0] SPACE (Other) ÷ [0.3] -÷ 1160 × 0308 ÷ 0020 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] SPACE (Other) ÷ [0.3] -÷ 1160 ÷ 000D ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) ÷ [5.0] (CR) ÷ [0.3] -÷ 1160 × 0308 ÷ 000D ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (CR) ÷ [0.3] -÷ 1160 ÷ 000A ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) ÷ [5.0] (LF) ÷ [0.3] -÷ 1160 × 0308 ÷ 000A ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (LF) ÷ [0.3] -÷ 1160 ÷ 0001 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) ÷ [5.0] (Control) ÷ [0.3] -÷ 1160 × 0308 ÷ 0001 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (Control) ÷ [0.3] -÷ 1160 × 034F ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] COMBINING GRAPHEME JOINER (Extend) ÷ [0.3] -÷ 1160 × 0308 × 034F ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAPHEME JOINER (Extend) ÷ [0.3] -÷ 1160 ÷ 1F1E6 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -÷ 1160 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -÷ 1160 ÷ 0600 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] -÷ 1160 × 0308 ÷ 0600 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] -÷ 1160 × 0903 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] -÷ 1160 × 0308 × 0903 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] -÷ 1160 ÷ 1100 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] -÷ 1160 × 0308 ÷ 1100 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] -÷ 1160 × 1160 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [7.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] -÷ 1160 × 0308 ÷ 1160 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] -÷ 1160 × 11A8 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [7.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] -÷ 1160 × 0308 ÷ 11A8 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] -÷ 1160 ÷ AC00 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] -÷ 1160 × 0308 ÷ AC00 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] -÷ 1160 ÷ AC01 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] -÷ 1160 × 0308 ÷ AC01 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] -÷ 1160 ÷ 231A ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] -÷ 1160 × 0308 ÷ 231A ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] -÷ 1160 × 0300 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] -÷ 1160 × 0308 × 0300 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] -÷ 1160 × 200D ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] -÷ 1160 × 0308 × 200D ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] -÷ 1160 ÷ 0378 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) ÷ [999.0] (Other) ÷ [0.3] -÷ 1160 × 0308 ÷ 0378 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] (Other) ÷ [0.3] -÷ 11A8 ÷ 0020 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) ÷ [999.0] SPACE (Other) ÷ [0.3] -÷ 11A8 × 0308 ÷ 0020 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] SPACE (Other) ÷ [0.3] -÷ 11A8 ÷ 000D ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) ÷ [5.0] (CR) ÷ [0.3] -÷ 11A8 × 0308 ÷ 000D ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (CR) ÷ [0.3] -÷ 11A8 ÷ 000A ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) ÷ [5.0] (LF) ÷ [0.3] -÷ 11A8 × 0308 ÷ 000A ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (LF) ÷ [0.3] -÷ 11A8 ÷ 0001 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) ÷ [5.0] (Control) ÷ [0.3] -÷ 11A8 × 0308 ÷ 0001 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (Control) ÷ [0.3] -÷ 11A8 × 034F ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] COMBINING GRAPHEME JOINER (Extend) ÷ [0.3] -÷ 11A8 × 0308 × 034F ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAPHEME JOINER (Extend) ÷ [0.3] -÷ 11A8 ÷ 1F1E6 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -÷ 11A8 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -÷ 11A8 ÷ 0600 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] -÷ 11A8 × 0308 ÷ 0600 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] -÷ 11A8 × 0903 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] -÷ 11A8 × 0308 × 0903 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] -÷ 11A8 ÷ 1100 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] -÷ 11A8 × 0308 ÷ 1100 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] -÷ 11A8 ÷ 1160 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] -÷ 11A8 × 0308 ÷ 1160 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] -÷ 11A8 × 11A8 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [8.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] -÷ 11A8 × 0308 ÷ 11A8 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] -÷ 11A8 ÷ AC00 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] -÷ 11A8 × 0308 ÷ AC00 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] -÷ 11A8 ÷ AC01 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] -÷ 11A8 × 0308 ÷ AC01 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] -÷ 11A8 ÷ 231A ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] -÷ 11A8 × 0308 ÷ 231A ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] -÷ 11A8 × 0300 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] -÷ 11A8 × 0308 × 0300 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] -÷ 11A8 × 200D ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] -÷ 11A8 × 0308 × 200D ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] -÷ 11A8 ÷ 0378 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) ÷ [999.0] (Other) ÷ [0.3] -÷ 11A8 × 0308 ÷ 0378 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] (Other) ÷ [0.3] -÷ AC00 ÷ 0020 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) ÷ [999.0] SPACE (Other) ÷ [0.3] -÷ AC00 × 0308 ÷ 0020 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] SPACE (Other) ÷ [0.3] -÷ AC00 ÷ 000D ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) ÷ [5.0] (CR) ÷ [0.3] -÷ AC00 × 0308 ÷ 000D ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (CR) ÷ [0.3] -÷ AC00 ÷ 000A ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) ÷ [5.0] (LF) ÷ [0.3] -÷ AC00 × 0308 ÷ 000A ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (LF) ÷ [0.3] -÷ AC00 ÷ 0001 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) ÷ [5.0] (Control) ÷ [0.3] -÷ AC00 × 0308 ÷ 0001 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (Control) ÷ [0.3] -÷ AC00 × 034F ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] COMBINING GRAPHEME JOINER (Extend) ÷ [0.3] -÷ AC00 × 0308 × 034F ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAPHEME JOINER (Extend) ÷ [0.3] -÷ AC00 ÷ 1F1E6 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -÷ AC00 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -÷ AC00 ÷ 0600 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] -÷ AC00 × 0308 ÷ 0600 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] -÷ AC00 × 0903 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] -÷ AC00 × 0308 × 0903 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] -÷ AC00 ÷ 1100 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] -÷ AC00 × 0308 ÷ 1100 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] -÷ AC00 × 1160 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [7.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] -÷ AC00 × 0308 ÷ 1160 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] -÷ AC00 × 11A8 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [7.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] -÷ AC00 × 0308 ÷ 11A8 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] -÷ AC00 ÷ AC00 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] -÷ AC00 × 0308 ÷ AC00 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] -÷ AC00 ÷ AC01 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] -÷ AC00 × 0308 ÷ AC01 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] -÷ AC00 ÷ 231A ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] -÷ AC00 × 0308 ÷ 231A ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] -÷ AC00 × 0300 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] -÷ AC00 × 0308 × 0300 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] -÷ AC00 × 200D ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] -÷ AC00 × 0308 × 200D ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] -÷ AC00 ÷ 0378 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) ÷ [999.0] (Other) ÷ [0.3] -÷ AC00 × 0308 ÷ 0378 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] (Other) ÷ [0.3] -÷ AC01 ÷ 0020 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) ÷ [999.0] SPACE (Other) ÷ [0.3] -÷ AC01 × 0308 ÷ 0020 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] SPACE (Other) ÷ [0.3] -÷ AC01 ÷ 000D ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) ÷ [5.0] (CR) ÷ [0.3] -÷ AC01 × 0308 ÷ 000D ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (CR) ÷ [0.3] -÷ AC01 ÷ 000A ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) ÷ [5.0] (LF) ÷ [0.3] -÷ AC01 × 0308 ÷ 000A ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (LF) ÷ [0.3] -÷ AC01 ÷ 0001 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) ÷ [5.0] (Control) ÷ [0.3] -÷ AC01 × 0308 ÷ 0001 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (Control) ÷ [0.3] -÷ AC01 × 034F ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] COMBINING GRAPHEME JOINER (Extend) ÷ [0.3] -÷ AC01 × 0308 × 034F ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAPHEME JOINER (Extend) ÷ [0.3] -÷ AC01 ÷ 1F1E6 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -÷ AC01 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -÷ AC01 ÷ 0600 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] -÷ AC01 × 0308 ÷ 0600 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] -÷ AC01 × 0903 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] -÷ AC01 × 0308 × 0903 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] -÷ AC01 ÷ 1100 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] -÷ AC01 × 0308 ÷ 1100 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] -÷ AC01 ÷ 1160 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] -÷ AC01 × 0308 ÷ 1160 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] -÷ AC01 × 11A8 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [8.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] -÷ AC01 × 0308 ÷ 11A8 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] -÷ AC01 ÷ AC00 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] -÷ AC01 × 0308 ÷ AC00 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] -÷ AC01 ÷ AC01 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] -÷ AC01 × 0308 ÷ AC01 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] -÷ AC01 ÷ 231A ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] -÷ AC01 × 0308 ÷ 231A ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] -÷ AC01 × 0300 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] -÷ AC01 × 0308 × 0300 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] -÷ AC01 × 200D ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] -÷ AC01 × 0308 × 200D ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] -÷ AC01 ÷ 0378 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) ÷ [999.0] (Other) ÷ [0.3] -÷ AC01 × 0308 ÷ 0378 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] (Other) ÷ [0.3] -÷ 231A ÷ 0020 ÷ # ÷ [0.2] WATCH (ExtPict) ÷ [999.0] SPACE (Other) ÷ [0.3] -÷ 231A × 0308 ÷ 0020 ÷ # ÷ [0.2] WATCH (ExtPict) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] SPACE (Other) ÷ [0.3] -÷ 231A ÷ 000D ÷ # ÷ [0.2] WATCH (ExtPict) ÷ [5.0] (CR) ÷ [0.3] -÷ 231A × 0308 ÷ 000D ÷ # ÷ [0.2] WATCH (ExtPict) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (CR) ÷ [0.3] -÷ 231A ÷ 000A ÷ # ÷ [0.2] WATCH (ExtPict) ÷ [5.0] (LF) ÷ [0.3] -÷ 231A × 0308 ÷ 000A ÷ # ÷ [0.2] WATCH (ExtPict) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (LF) ÷ [0.3] -÷ 231A ÷ 0001 ÷ # ÷ [0.2] WATCH (ExtPict) ÷ [5.0] (Control) ÷ [0.3] -÷ 231A × 0308 ÷ 0001 ÷ # ÷ [0.2] WATCH (ExtPict) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (Control) ÷ [0.3] -÷ 231A × 034F ÷ # ÷ [0.2] WATCH (ExtPict) × [9.0] COMBINING GRAPHEME JOINER (Extend) ÷ [0.3] -÷ 231A × 0308 × 034F ÷ # ÷ [0.2] WATCH (ExtPict) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAPHEME JOINER (Extend) ÷ [0.3] -÷ 231A ÷ 1F1E6 ÷ # ÷ [0.2] WATCH (ExtPict) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -÷ 231A × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] WATCH (ExtPict) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -÷ 231A ÷ 0600 ÷ # ÷ [0.2] WATCH (ExtPict) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] -÷ 231A × 0308 ÷ 0600 ÷ # ÷ [0.2] WATCH (ExtPict) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] -÷ 231A × 0903 ÷ # ÷ [0.2] WATCH (ExtPict) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] -÷ 231A × 0308 × 0903 ÷ # ÷ [0.2] WATCH (ExtPict) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] -÷ 231A ÷ 1100 ÷ # ÷ [0.2] WATCH (ExtPict) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] -÷ 231A × 0308 ÷ 1100 ÷ # ÷ [0.2] WATCH (ExtPict) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] -÷ 231A ÷ 1160 ÷ # ÷ [0.2] WATCH (ExtPict) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] -÷ 231A × 0308 ÷ 1160 ÷ # ÷ [0.2] WATCH (ExtPict) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] -÷ 231A ÷ 11A8 ÷ # ÷ [0.2] WATCH (ExtPict) ÷ [999.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] -÷ 231A × 0308 ÷ 11A8 ÷ # ÷ [0.2] WATCH (ExtPict) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] -÷ 231A ÷ AC00 ÷ # ÷ [0.2] WATCH (ExtPict) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] -÷ 231A × 0308 ÷ AC00 ÷ # ÷ [0.2] WATCH (ExtPict) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] -÷ 231A ÷ AC01 ÷ # ÷ [0.2] WATCH (ExtPict) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] -÷ 231A × 0308 ÷ AC01 ÷ # ÷ [0.2] WATCH (ExtPict) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] -÷ 231A ÷ 231A ÷ # ÷ [0.2] WATCH (ExtPict) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] -÷ 231A × 0308 ÷ 231A ÷ # ÷ [0.2] WATCH (ExtPict) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] -÷ 231A × 0300 ÷ # ÷ [0.2] WATCH (ExtPict) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] -÷ 231A × 0308 × 0300 ÷ # ÷ [0.2] WATCH (ExtPict) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] -÷ 231A × 200D ÷ # ÷ [0.2] WATCH (ExtPict) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] -÷ 231A × 0308 × 200D ÷ # ÷ [0.2] WATCH (ExtPict) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] -÷ 231A ÷ 0378 ÷ # ÷ [0.2] WATCH (ExtPict) ÷ [999.0] (Other) ÷ [0.3] -÷ 231A × 0308 ÷ 0378 ÷ # ÷ [0.2] WATCH (ExtPict) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] (Other) ÷ [0.3] -÷ 0300 ÷ 0020 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [999.0] SPACE (Other) ÷ [0.3] -÷ 0300 × 0308 ÷ 0020 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] SPACE (Other) ÷ [0.3] -÷ 0300 ÷ 000D ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [5.0] (CR) ÷ [0.3] -÷ 0300 × 0308 ÷ 000D ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (CR) ÷ [0.3] -÷ 0300 ÷ 000A ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [5.0] (LF) ÷ [0.3] -÷ 0300 × 0308 ÷ 000A ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (LF) ÷ [0.3] -÷ 0300 ÷ 0001 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [5.0] (Control) ÷ [0.3] -÷ 0300 × 0308 ÷ 0001 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (Control) ÷ [0.3] -÷ 0300 × 034F ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) × [9.0] COMBINING GRAPHEME JOINER (Extend) ÷ [0.3] -÷ 0300 × 0308 × 034F ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAPHEME JOINER (Extend) ÷ [0.3] -÷ 0300 ÷ 1F1E6 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -÷ 0300 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -÷ 0300 ÷ 0600 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] -÷ 0300 × 0308 ÷ 0600 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] -÷ 0300 × 0903 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] -÷ 0300 × 0308 × 0903 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] -÷ 0300 ÷ 1100 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] -÷ 0300 × 0308 ÷ 1100 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] -÷ 0300 ÷ 1160 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] -÷ 0300 × 0308 ÷ 1160 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] -÷ 0300 ÷ 11A8 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [999.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] -÷ 0300 × 0308 ÷ 11A8 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] -÷ 0300 ÷ AC00 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] -÷ 0300 × 0308 ÷ AC00 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] -÷ 0300 ÷ AC01 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] -÷ 0300 × 0308 ÷ AC01 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] -÷ 0300 ÷ 231A ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] -÷ 0300 × 0308 ÷ 231A ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] -÷ 0300 × 0300 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] -÷ 0300 × 0308 × 0300 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] -÷ 0300 × 200D ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] -÷ 0300 × 0308 × 200D ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] -÷ 0300 ÷ 0378 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [999.0] (Other) ÷ [0.3] -÷ 0300 × 0308 ÷ 0378 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] (Other) ÷ [0.3] -÷ 200D ÷ 0020 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [999.0] SPACE (Other) ÷ [0.3] -÷ 200D × 0308 ÷ 0020 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] SPACE (Other) ÷ [0.3] -÷ 200D ÷ 000D ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [5.0] (CR) ÷ [0.3] -÷ 200D × 0308 ÷ 000D ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (CR) ÷ [0.3] -÷ 200D ÷ 000A ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [5.0] (LF) ÷ [0.3] -÷ 200D × 0308 ÷ 000A ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (LF) ÷ [0.3] -÷ 200D ÷ 0001 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [5.0] (Control) ÷ [0.3] -÷ 200D × 0308 ÷ 0001 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (Control) ÷ [0.3] -÷ 200D × 034F ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [9.0] COMBINING GRAPHEME JOINER (Extend) ÷ [0.3] -÷ 200D × 0308 × 034F ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAPHEME JOINER (Extend) ÷ [0.3] -÷ 200D ÷ 1F1E6 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -÷ 200D × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -÷ 200D ÷ 0600 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] -÷ 200D × 0308 ÷ 0600 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] -÷ 200D × 0903 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] -÷ 200D × 0308 × 0903 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] -÷ 200D ÷ 1100 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] -÷ 200D × 0308 ÷ 1100 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] -÷ 200D ÷ 1160 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] -÷ 200D × 0308 ÷ 1160 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] -÷ 200D ÷ 11A8 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [999.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] -÷ 200D × 0308 ÷ 11A8 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] -÷ 200D ÷ AC00 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] -÷ 200D × 0308 ÷ AC00 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] -÷ 200D ÷ AC01 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] -÷ 200D × 0308 ÷ AC01 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] -÷ 200D ÷ 231A ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] -÷ 200D × 0308 ÷ 231A ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] -÷ 200D × 0300 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] -÷ 200D × 0308 × 0300 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] -÷ 200D × 200D ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] -÷ 200D × 0308 × 200D ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] -÷ 200D ÷ 0378 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [999.0] (Other) ÷ [0.3] -÷ 200D × 0308 ÷ 0378 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] (Other) ÷ [0.3] -÷ 0378 ÷ 0020 ÷ # ÷ [0.2] (Other) ÷ [999.0] SPACE (Other) ÷ [0.3] -÷ 0378 × 0308 ÷ 0020 ÷ # ÷ [0.2] (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] SPACE (Other) ÷ [0.3] -÷ 0378 ÷ 000D ÷ # ÷ [0.2] (Other) ÷ [5.0] (CR) ÷ [0.3] -÷ 0378 × 0308 ÷ 000D ÷ # ÷ [0.2] (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (CR) ÷ [0.3] -÷ 0378 ÷ 000A ÷ # ÷ [0.2] (Other) ÷ [5.0] (LF) ÷ [0.3] -÷ 0378 × 0308 ÷ 000A ÷ # ÷ [0.2] (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (LF) ÷ [0.3] -÷ 0378 ÷ 0001 ÷ # ÷ [0.2] (Other) ÷ [5.0] (Control) ÷ [0.3] -÷ 0378 × 0308 ÷ 0001 ÷ # ÷ [0.2] (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (Control) ÷ [0.3] -÷ 0378 × 034F ÷ # ÷ [0.2] (Other) × [9.0] COMBINING GRAPHEME JOINER (Extend) ÷ [0.3] -÷ 0378 × 0308 × 034F ÷ # ÷ [0.2] (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAPHEME JOINER (Extend) ÷ [0.3] -÷ 0378 ÷ 1F1E6 ÷ # ÷ [0.2] (Other) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -÷ 0378 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -÷ 0378 ÷ 0600 ÷ # ÷ [0.2] (Other) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] -÷ 0378 × 0308 ÷ 0600 ÷ # ÷ [0.2] (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] -÷ 0378 × 0903 ÷ # ÷ [0.2] (Other) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] -÷ 0378 × 0308 × 0903 ÷ # ÷ [0.2] (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] -÷ 0378 ÷ 1100 ÷ # ÷ [0.2] (Other) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] -÷ 0378 × 0308 ÷ 1100 ÷ # ÷ [0.2] (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] -÷ 0378 ÷ 1160 ÷ # ÷ [0.2] (Other) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] -÷ 0378 × 0308 ÷ 1160 ÷ # ÷ [0.2] (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] -÷ 0378 ÷ 11A8 ÷ # ÷ [0.2] (Other) ÷ [999.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] -÷ 0378 × 0308 ÷ 11A8 ÷ # ÷ [0.2] (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] -÷ 0378 ÷ AC00 ÷ # ÷ [0.2] (Other) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] -÷ 0378 × 0308 ÷ AC00 ÷ # ÷ [0.2] (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] -÷ 0378 ÷ AC01 ÷ # ÷ [0.2] (Other) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] -÷ 0378 × 0308 ÷ AC01 ÷ # ÷ [0.2] (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] -÷ 0378 ÷ 231A ÷ # ÷ [0.2] (Other) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] -÷ 0378 × 0308 ÷ 231A ÷ # ÷ [0.2] (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] -÷ 0378 × 0300 ÷ # ÷ [0.2] (Other) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] -÷ 0378 × 0308 × 0300 ÷ # ÷ [0.2] (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] -÷ 0378 × 200D ÷ # ÷ [0.2] (Other) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] -÷ 0378 × 0308 × 200D ÷ # ÷ [0.2] (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] -÷ 0378 ÷ 0378 ÷ # ÷ [0.2] (Other) ÷ [999.0] (Other) ÷ [0.3] -÷ 0378 × 0308 ÷ 0378 ÷ # ÷ [0.2] (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] (Other) ÷ [0.3] -÷ 000D × 000A ÷ 0061 ÷ 000A ÷ 0308 ÷ # ÷ [0.2] (CR) × [3.0] (LF) ÷ [4.0] LATIN SMALL LETTER A (Other) ÷ [5.0] (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [0.3] -÷ 0061 × 0308 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [0.3] -÷ 0020 × 200D ÷ 0646 ÷ # ÷ [0.2] SPACE (Other) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [999.0] ARABIC LETTER NOON (Other) ÷ [0.3] -÷ 0646 × 200D ÷ 0020 ÷ # ÷ [0.2] ARABIC LETTER NOON (Other) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [999.0] SPACE (Other) ÷ [0.3] -÷ 1100 × 1100 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [6.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] -÷ AC00 × 11A8 ÷ 1100 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [7.0] HANGUL JONGSEONG KIYEOK (T) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] -÷ AC01 × 11A8 ÷ 1100 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [8.0] HANGUL JONGSEONG KIYEOK (T) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] -÷ 1F1E6 × 1F1E7 ÷ 1F1E8 ÷ 0062 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [12.0] REGIONAL INDICATOR SYMBOL LETTER B (RI) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER C (RI) ÷ [999.0] LATIN SMALL LETTER B (Other) ÷ [0.3] -÷ 0061 ÷ 1F1E6 × 1F1E7 ÷ 1F1E8 ÷ 0062 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Other) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [13.0] REGIONAL INDICATOR SYMBOL LETTER B (RI) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER C (RI) ÷ [999.0] LATIN SMALL LETTER B (Other) ÷ [0.3] -÷ 0061 ÷ 1F1E6 × 1F1E7 × 200D ÷ 1F1E8 ÷ 0062 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Other) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [13.0] REGIONAL INDICATOR SYMBOL LETTER B (RI) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER C (RI) ÷ [999.0] LATIN SMALL LETTER B (Other) ÷ [0.3] -÷ 0061 ÷ 1F1E6 × 200D ÷ 1F1E7 × 1F1E8 ÷ 0062 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Other) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER B (RI) × [13.0] REGIONAL INDICATOR SYMBOL LETTER C (RI) ÷ [999.0] LATIN SMALL LETTER B (Other) ÷ [0.3] -÷ 0061 ÷ 1F1E6 × 1F1E7 ÷ 1F1E8 × 1F1E9 ÷ 0062 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Other) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [13.0] REGIONAL INDICATOR SYMBOL LETTER B (RI) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER C (RI) × [13.0] REGIONAL INDICATOR SYMBOL LETTER D (RI) ÷ [999.0] LATIN SMALL LETTER B (Other) ÷ [0.3] -÷ 0061 × 200D ÷ # ÷ [0.2] LATIN SMALL LETTER A (Other) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] -÷ 0061 × 0308 ÷ 0062 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] LATIN SMALL LETTER B (Other) ÷ [0.3] -÷ 0061 × 0903 ÷ 0062 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Other) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [999.0] LATIN SMALL LETTER B (Other) ÷ [0.3] -÷ 0061 ÷ 0600 × 0062 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Other) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) × [9.2] LATIN SMALL LETTER B (Other) ÷ [0.3] -÷ 1F476 × 1F3FF ÷ 1F476 ÷ # ÷ [0.2] BABY (ExtPict) × [9.0] EMOJI MODIFIER FITZPATRICK TYPE-6 (Extend) ÷ [999.0] BABY (ExtPict) ÷ [0.3] -÷ 0061 × 1F3FF ÷ 1F476 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Other) × [9.0] EMOJI MODIFIER FITZPATRICK TYPE-6 (Extend) ÷ [999.0] BABY (ExtPict) ÷ [0.3] -÷ 0061 × 1F3FF ÷ 1F476 × 200D × 1F6D1 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Other) × [9.0] EMOJI MODIFIER FITZPATRICK TYPE-6 (Extend) ÷ [999.0] BABY (ExtPict) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [11.0] OCTAGONAL SIGN (ExtPict) ÷ [0.3] -÷ 1F476 × 1F3FF × 0308 × 200D × 1F476 × 1F3FF ÷ # ÷ [0.2] BABY (ExtPict) × [9.0] EMOJI MODIFIER FITZPATRICK TYPE-6 (Extend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [11.0] BABY (ExtPict) × [9.0] EMOJI MODIFIER FITZPATRICK TYPE-6 (Extend) ÷ [0.3] -÷ 1F6D1 × 200D × 1F6D1 ÷ # ÷ [0.2] OCTAGONAL SIGN (ExtPict) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [11.0] OCTAGONAL SIGN (ExtPict) ÷ [0.3] -÷ 0061 × 200D ÷ 1F6D1 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Other) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [999.0] OCTAGONAL SIGN (ExtPict) ÷ [0.3] -÷ 2701 × 200D × 2701 ÷ # ÷ [0.2] UPPER BLADE SCISSORS (Other) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [11.0] UPPER BLADE SCISSORS (Other) ÷ [0.3] -÷ 0061 × 200D ÷ 2701 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Other) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [999.0] UPPER BLADE SCISSORS (Other) ÷ [0.3] -# -# Lines: 602 -# -# EOF diff --git a/tests/auto/corelib/text/qtextboundaryfinder/tst_qtextboundaryfinder.cpp b/tests/auto/corelib/text/qtextboundaryfinder/tst_qtextboundaryfinder.cpp index b4c2657c..f2d07c0f 100644 --- a/tests/auto/corelib/text/qtextboundaryfinder/tst_qtextboundaryfinder.cpp +++ b/tests/auto/corelib/text/qtextboundaryfinder/tst_qtextboundaryfinder.cpp @@ -51,6 +51,9 @@ private slots: void lineBoundariesDefault(); #endif + void graphemeBoundaries_manual_data(); + void graphemeBoundaries_manual(); + void wordBoundaries_manual_data(); void wordBoundaries_manual(); void sentenceBoundaries_manual_data(); @@ -286,6 +289,104 @@ void tst_QTextBoundaryFinder::lineBoundariesDefault() } #endif // QT_BUILD_INTERNAL +void tst_QTextBoundaryFinder::graphemeBoundaries_manual_data() +{ + QTest::addColumn("testString"); + QTest::addColumn>("expectedBreakPositions"); + + { + // QTBUG-94951 + QChar s[] = { QChar(0x2764), // U+2764 HEAVY BLACK HEART + QChar(0xFE0F), // U+FE0F VARIATION SELECTOR-16 + QChar(0xD83D), QChar(0xDCF2), // U+1F4F2 MOBILE PHONE WITH RIGHTWARDS ARROW AT LEFT + QChar(0xD83D), QChar(0xDCE9), // U+1F4E9 ENVELOPE WITH DOWNWARDS ARROW ABOVE + }; + QString testString(s, sizeof(s)/sizeof(s[0])); + + QList expectedBreakPositions{0, 2, 4, 6}; + QTest::newRow("+EXTPICxEXT+EXTPIC+EXTPIC+") << testString << expectedBreakPositions; + } + + { + QChar s[] = { QChar(0x2764), // U+2764 HEAVY BLACK HEART + QChar(0xFE0F), // U+FE0F VARIATION SELECTOR-16 + QChar(0x2764), // U+2764 HEAVY BLACK HEART + QChar(0xFE0F), // U+FE0F VARIATION SELECTOR-16 + }; + QString testString(s, sizeof(s)/sizeof(s[0])); + + QList expectedBreakPositions{0, 2, 4}; + QTest::newRow("+EXTPICxEXT+EXTPICxEXT+") << testString << expectedBreakPositions; + } + + { + QChar s[] = { QChar(0x2764), // U+2764 HEAVY BLACK HEART + QChar(0xFE0F), // U+FE0F VARIATION SELECTOR-16 + QChar(0xFE0F), // U+FE0F VARIATION SELECTOR-16 + QChar(0xFE0F), // U+FE0F VARIATION SELECTOR-16 + QChar(0x2764), // U+2764 HEAVY BLACK HEART + QChar(0xFE0F), // U+FE0F VARIATION SELECTOR-16 + QChar(0xFE0F), // U+FE0F VARIATION SELECTOR-16 + }; + QString testString(s, sizeof(s)/sizeof(s[0])); + + QList expectedBreakPositions{0, 4, 7}; + QTest::newRow("+EXTPICxEXTxEXTxEXT+EXTPICxEXTxEXT+") << testString << expectedBreakPositions; + } + + { + QChar s[] = { QChar(0x2764), // U+2764 HEAVY BLACK HEART + QChar(0xFE0F), // U+FE0F VARIATION SELECTOR-16 + QChar(0xFE0F), // U+FE0F VARIATION SELECTOR-16 + QChar(0x200D), // U+200D ZERO WIDTH JOINER + QChar(0xD83D), QChar(0xDCF2), // U+1F4F2 MOBILE PHONE WITH RIGHTWARDS ARROW AT LEFT + QChar(0xFE0F), // U+FE0F VARIATION SELECTOR-16 + }; + QString testString(s, sizeof(s)/sizeof(s[0])); + + QList expectedBreakPositions{0, 7}; + QTest::newRow("+EXTPICxEXTxEXTxZWJxEXTPICxEXTxEXT+") << testString << expectedBreakPositions; + } + + { + QChar s[] = { QChar(0x2764), // U+2764 HEAVY BLACK HEART + QChar(0xFE0F), // U+FE0F VARIATION SELECTOR-16 + QChar(0xFE0F), // U+FE0F VARIATION SELECTOR-16 + QChar(0x200D), // U+200D ZERO WIDTH JOINER + QChar(0x0041), // U+0041 LATIN CAPITAL LETTER A + QChar(0xD83D), QChar(0xDCF2), // U+1F4F2 MOBILE PHONE WITH RIGHTWARDS ARROW AT LEFT + }; + QString testString(s, sizeof(s)/sizeof(s[0])); + + QList expectedBreakPositions{0, 4, 5, 7}; + QTest::newRow("+EXTPICxEXTxEXTxZWJ+Any+EXTPIC+") << testString << expectedBreakPositions; + } + + { + QChar s[] = { QChar(0x2764), // U+2764 HEAVY BLACK HEART + QChar(0xFE0F), // U+FE0F VARIATION SELECTOR-16 + QChar(0xD83C), QChar(0xDDEA), // U+1F1EA REGIONAL INDICATOR SYMBOL LETTER E + QChar(0xD83C), QChar(0xDDFA), // U+1F1FA REGIONAL INDICATOR SYMBOL LETTER U + QChar(0xD83C), QChar(0xDDEA), // U+1F1EA REGIONAL INDICATOR SYMBOL LETTER E + QChar(0xD83C), QChar(0xDDFA), // U+1F1FA REGIONAL INDICATOR SYMBOL LETTER U + QChar(0xD83C), QChar(0xDDEA), // U+1F1EA REGIONAL INDICATOR SYMBOL LETTER E + QChar(0x0041), // U+0041 LATIN CAPITAL LETTER A + }; + QString testString(s, sizeof(s)/sizeof(s[0])); + + QList expectedBreakPositions{0, 2, 6, 10, 12, 13}; + QTest::newRow("+EXTPICxEXT+RIxRI+RIxRI+RI+ANY+") << testString << expectedBreakPositions; + } +} + +void tst_QTextBoundaryFinder::graphemeBoundaries_manual() +{ + QFETCH(QString, testString); + QFETCH(QList, expectedBreakPositions); + + doTestData(testString, expectedBreakPositions, QTextBoundaryFinder::Grapheme); +} + void tst_QTextBoundaryFinder::wordBoundaries_manual_data() { QTest::addColumn("testString"); diff --git a/tests/auto/corelib/thread/qfuture/tst_qfuture.cpp b/tests/auto/corelib/thread/qfuture/tst_qfuture.cpp index 0bdadedf..49c8ec21 100644 --- a/tests/auto/corelib/thread/qfuture/tst_qfuture.cpp +++ b/tests/auto/corelib/thread/qfuture/tst_qfuture.cpp @@ -94,6 +94,7 @@ private slots: void nestedExceptions(); #endif void nonGlobalThreadPool(); + void resultsReadyAt(); }; void tst_QFuture::resultStore() @@ -627,6 +628,26 @@ void tst_QFuture::futureInterface() VoidResult a; a.run().waitForFinished(); } + + { + QFutureInterface fi; + fi.reportStarted(); + fi.reportResults(QVector {}); + fi.reportFinished(); + + QVERIFY(fi.results().empty()); + } + + { + QFutureInterface fi; + fi.reportStarted(); + QVector values = { 1, 2, 3 }; + fi.reportResults(values); + fi.reportResults(QVector {}); + fi.reportFinished(); + + QCOMPARE(fi.results(), values.toList()); + } } template @@ -1557,5 +1578,63 @@ void tst_QFuture::nonGlobalThreadPool() } } +void tst_QFuture::resultsReadyAt() +{ + QFutureInterface iface; + QFutureWatcher watcher; + watcher.setFuture(iface.future()); + + QTestEventLoop eventProcessor; + connect(&watcher, &QFutureWatcher::finished, &eventProcessor, &QTestEventLoop::exitLoop); + + const int nExpectedResults = 4; + int reported = 0; + int taken = 0; + connect(&watcher, &QFutureWatcher::resultsReadyAt, + [&iface, &reported, &taken](int begin, int end) + { + auto future = iface.future(); + QVERIFY(end - begin > 0); + for (int i = begin; i < end; ++i, ++reported) { + QVERIFY(future.isResultReadyAt(i)); + taken |= 1 << i; + } + }); + + auto report = [&iface](int index) + { + int dummyResult = 0b101010; + iface.reportResult(&dummyResult, index); + }; + + const QSignalSpy readyCounter(&watcher, &QFutureWatcher::resultsReadyAt); + QTimer::singleShot(0, [&iface, &report]{ + // With filter mode == true, the result may go into the pending results. + // Reporting it as ready will allow an application to try and access the + // result, crashing on invalid (store.end()) iterator dereferenced. + iface.setFilterMode(true); + iface.reportStarted(); + report(0); + report(1); + // This one - should not be reported (it goes into pending): + report(3); + // Let's close the 'gap' and make them all ready: + report(-1); + iface.reportFinished(); + }); + + // Run event loop, QCoreApplication::postEvent is in use + // in QFutureInterface: + eventProcessor.enterLoopMSecs(2000); + QVERIFY(!eventProcessor.timeout()); + if (QTest::currentTestFailed()) // Failed in our lambda observing 'ready at' + return; + + QCOMPARE(reported, nExpectedResults); + QCOMPARE(nExpectedResults, iface.future().resultCount()); + QCOMPARE(readyCounter.count(), 3); + QCOMPARE(taken, 0b1111); +} + QTEST_MAIN(tst_QFuture) #include "tst_qfuture.moc" diff --git a/tests/auto/corelib/thread/qresultstore/tst_qresultstore.cpp b/tests/auto/corelib/thread/qresultstore/tst_qresultstore.cpp index fba617e3..a1742b31 100644 --- a/tests/auto/corelib/thread/qresultstore/tst_qresultstore.cpp +++ b/tests/auto/corelib/thread/qresultstore/tst_qresultstore.cpp @@ -175,6 +175,14 @@ void tst_QtConcurrentResultStore::addResults() ++it; QCOMPARE(it, store.end()); + + QVector empty; + const auto countBefore = store.count(); + QCOMPARE(store.addResults(countBefore, &empty), -1); + QCOMPARE(store.count(), countBefore); + + QCOMPARE(store.addResults(countBefore, &vec1), countBefore); + QCOMPARE(store.count(), countBefore + vec1.size()); } void tst_QtConcurrentResultStore::resultIndex() @@ -338,6 +346,14 @@ void tst_QtConcurrentResultStore::filterMode() QCOMPARE(store.contains(6), true); QCOMPARE(store.contains(7), true); QCOMPARE(store.contains(8), false); + + QVector empty; + const auto countBefore = store.count(); + QCOMPARE(store.addResults(countBefore, &empty), -1); + QCOMPARE(store.count(), countBefore); + + QCOMPARE(store.addResult(countBefore, &int2), countBefore); + QCOMPARE(store.count(), countBefore + 1); } void tst_QtConcurrentResultStore::addCanceledResult() diff --git a/tests/auto/corelib/thread/qthread/tst_qthread.cpp b/tests/auto/corelib/thread/qthread/tst_qthread.cpp index 7be2f487..b868f652 100644 --- a/tests/auto/corelib/thread/qthread/tst_qthread.cpp +++ b/tests/auto/corelib/thread/qthread/tst_qthread.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2016 The Qt Company Ltd. +** Copyright (C) 2021 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the test suite of the Qt Toolkit. @@ -36,6 +36,7 @@ #include #include #include +#include #ifdef Q_OS_UNIX #include @@ -106,6 +107,7 @@ private slots: void quitLock(); void create(); + void threadIdReuse(); }; enum { one_minute = 60 * 1000, five_minutes = 5 * one_minute }; @@ -1082,8 +1084,8 @@ void tst_QThread::wait2() qPrintable(msgElapsed(elapsed))); } - -class SlowSlotObject : public QObject { +class SlowSlotObject : public QObject +{ Q_OBJECT public: QMutex mutex; @@ -1099,22 +1101,23 @@ void tst_QThread::wait3_slowDestructor() { SlowSlotObject slow; QThread thread; - QObject::connect(&thread, SIGNAL(finished()), &slow, SLOT(slowSlot()), Qt::DirectConnection); - - enum { WaitTime = 1800 }; + QObject::connect(&thread, &QThread::finished, + &slow, &SlowSlotObject::slowSlot, Qt::DirectConnection); QElapsedTimer timer; thread.start(); thread.quit(); - //the quit function will cause the thread to finish and enter the slowSlot that is blocking + // Calling quit() will cause the thread to finish and enter the blocking slowSlot(). timer.start(); - QVERIFY(!thread.wait(Waiting_Thread::WaitTime)); - qint64 elapsed = timer.elapsed(); - QVERIFY2(elapsed >= Waiting_Thread::WaitTime - 1, qPrintable(QString::fromLatin1("elapsed: %1").arg(elapsed))); - - slow.cond.wakeOne(); - //now the thread should finish quickly + { + // Ensure thread finishes quickly after the checks - regardless of success: + const auto wakeSlow = qScopeGuard([&slow]() -> void { slow.cond.wakeOne(); }); + QVERIFY(!thread.wait(Waiting_Thread::WaitTime)); + const qint64 elapsed = timer.elapsed(); + QVERIFY2(elapsed >= Waiting_Thread::WaitTime - 1, + qPrintable(QString::fromLatin1("elapsed: %1").arg(elapsed))); + } QVERIFY(thread.wait(one_minute)); } @@ -1631,5 +1634,71 @@ void tst_QThread::requestTermination() QVERIFY(!thread.isInterruptionRequested()); } +/* + This is a regression test for QTBUG-96846. + + Incorrect system thread ID cleanup can cause QThread::wait() to report that + a thread is trying to wait for itself. +*/ +void tst_QThread::threadIdReuse() +{ + class Thread1 : public QThread { + public: + // It's important that those thread ID's are not accessed concurrently + Qt::HANDLE savedThreadId; + + void run() override { savedThreadId = QThread::currentThreadId(); } + }; + + class Thread2 : public Thread1 { + public: + bool waitOk; + Thread2(QThread *otherThread) : Thread1(), waitOk(false), otherThread(otherThread) {} + + void run() override { + Thread1::run(); + waitOk = otherThread->wait(); + } + + private: + QThread *const otherThread; + }; + + Thread1 thread1; + thread1.start(); + QVERIFY(thread1.wait()); + + // If the system thread allocated for thread1 is destroyed before thread2 is + // started, at least on some versions of Linux the system thread ID for + // thread2 would be the same as one that was used for thread1. + + // The system thread may be alive for some time after returning from + // QThread::wait() because the implementation is using detachable threads, so + // some additional time is required for the system thread to terminate. Not + // waiting long enough here would result in a new system thread ID being + // allocated for thread2 and this test passing even without a fix for + // QTBUG-96846. + bool threadIdReused = false; + + for (int i = 0; i < 42; i++) { + QThread::msleep(1); + + Thread2 thread2(&thread1); + thread2.start(); + QVERIFY(thread2.wait()); + QVERIFY(thread2.waitOk); + + if (thread1.savedThreadId == thread2.savedThreadId) { + qDebug("Thread ID reused at iteration %d", i); + threadIdReused = true; + break; + } + } + + if (!threadIdReused) { + QSKIP("Thread ID was not reused"); + } +} + QTEST_MAIN(tst_QThread) #include "tst_qthread.moc" diff --git a/tests/auto/corelib/thread/qthreadpool/tst_qthreadpool.cpp b/tests/auto/corelib/thread/qthreadpool/tst_qthreadpool.cpp index cd245030..e85fb5ea 100644 --- a/tests/auto/corelib/thread/qthreadpool/tst_qthreadpool.cpp +++ b/tests/auto/corelib/thread/qthreadpool/tst_qthreadpool.cpp @@ -104,6 +104,7 @@ private slots: void stressTest(); void takeAllAndIncreaseMaxThreadCount(); void waitForDoneAfterTake(); + void threadReuse(); private: QMutex m_functionTestMutex; @@ -803,7 +804,7 @@ void tst_QThreadPool::tryStartPeakThreadCount() CounterTask task; QThreadPool threadPool; - for (int i = 0; i < 20; ++i) { + for (int i = 0; i < 4*QThread::idealThreadCount(); ++i) { if (threadPool.tryStart(&task) == false) QTest::qWait(10); } @@ -1385,5 +1386,29 @@ void tst_QThreadPool::waitForDoneAfterTake() } +/* + Try trigger reuse of expired threads and check that all tasks execute. + + This is a regression test for QTBUG-72872. +*/ +void tst_QThreadPool::threadReuse() +{ + QThreadPool manager; + manager.setExpiryTimeout(-1); + manager.setMaxThreadCount(1); + + constexpr int repeatCount = 10000; + constexpr int timeoutMs = 1000; + QSemaphore sem; + + for (int i = 0; i < repeatCount; i++) { + manager.start([&sem]() { sem.release(); }); + manager.start([&sem]() { sem.release(); }); + manager.releaseThread(); + QVERIFY(sem.tryAcquire(2, timeoutMs)); + manager.reserveThread(); + } +} + QTEST_MAIN(tst_QThreadPool); #include "tst_qthreadpool.moc" diff --git a/tests/auto/corelib/time/qdate/tst_qdate.cpp b/tests/auto/corelib/time/qdate/tst_qdate.cpp index 274bf4f6..f94f1c5f 100644 --- a/tests/auto/corelib/time/qdate/tst_qdate.cpp +++ b/tests/auto/corelib/time/qdate/tst_qdate.cpp @@ -90,7 +90,6 @@ private slots: void yearsZeroToNinetyNine(); void printNegativeYear_data() const; void printNegativeYear() const; - void roundtripGermanLocale() const; #if QT_CONFIG(textdate) && QT_DEPRECATED_SINCE(5, 10) void shortDayName() const; void standaloneShortDayName() const; @@ -100,6 +99,7 @@ private slots: void standaloneShortMonthName() const; void longMonthName() const; void standaloneLongMonthName() const; + void roundtripString() const; #endif // textdate void roundtrip() const; void qdebug() const; @@ -1484,16 +1484,6 @@ void tst_QDate::printNegativeYear() const QCOMPARE(date.toString(QLatin1String("yyyy")), expect); } -void tst_QDate::roundtripGermanLocale() const -{ - /* This code path should not result in warnings. */ - const QDate theDate(QDate::currentDate()); - theDate.fromString(theDate.toString(Qt::TextDate), Qt::TextDate); - - const QDateTime theDateTime(QDateTime::currentDateTime()); - theDateTime.fromString(theDateTime.toString(Qt::TextDate), Qt::TextDate); -} - #if QT_CONFIG(textdate) && QT_DEPRECATED_SINCE(5, 10) QT_WARNING_PUSH // the methods tested here are all deprecated QT_WARNING_DISABLE_GCC("-Wdeprecated-declarations") @@ -1626,6 +1616,17 @@ void tst_QDate::standaloneLongMonthName() const } } QT_WARNING_POP + +void tst_QDate::roundtripString() const +{ + /* This code path should not result in warnings, no matter what locale is set. */ + const QDate date(QDate::currentDate()); + QCOMPARE(date.fromString(date.toString(Qt::TextDate), Qt::TextDate), date); + + const QDateTime now(QDateTime::currentDateTime()); + const QDateTime when = now.addMSecs(-now.time().msec()); // TextDate rounds to whole seconds. + QCOMPARE(when.fromString(when.toString(Qt::TextDate), Qt::TextDate), when); +} #endif // textdate void tst_QDate::roundtrip() const diff --git a/tests/auto/corelib/time/qdatetime/tst_qdatetime.cpp b/tests/auto/corelib/time/qdatetime/tst_qdatetime.cpp index 2a8c47a5..d3afee96 100644 --- a/tests/auto/corelib/time/qdatetime/tst_qdatetime.cpp +++ b/tests/auto/corelib/time/qdatetime/tst_qdatetime.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2020 The Qt Company Ltd. +** Copyright (C) 2021 The Qt Company Ltd. ** Copyright (C) 2016 Intel Corporation. ** Contact: https://www.qt.io/licensing/ ** @@ -152,6 +152,7 @@ private slots: void isDaylightTime() const; void daylightTransitions() const; void timeZones() const; + void systemTimeZoneChange_data() const; void systemTimeZoneChange() const; void invalid_data() const; @@ -825,7 +826,7 @@ void tst_QDateTime::toString_isoDate_data() QTest::newRow("negative non-integral OffsetFromUTC") << dt << Qt::ISODate << QString("1978-11-09T13:28:34-00:15"); - QTest::newRow("invalid") + QTest::newRow("invalid") // ISODate < 2019 doesn't allow -ve year numbers; QTBUG-91070 << QDateTime(QDate(-1, 11, 9), QTime(13, 28, 34), Qt::UTC) << Qt::ISODate << QString(); QTest::newRow("without-ms") @@ -838,30 +839,31 @@ void tst_QDateTime::toString_isoDate_data() void tst_QDateTime::toString_isoDate() { - QFETCH(QDateTime, datetime); - QFETCH(Qt::DateFormat, format); - QFETCH(QString, expected); + QFETCH(const QDateTime, datetime); + QFETCH(const Qt::DateFormat, format); + QFETCH(const QString, expected); #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) QLocale oldLocale; QLocale::setDefault(QLocale("en_US")); #endif // ### Qt 6: remove - QString result = datetime.toString(format); + const QString result = datetime.toString(format); QCOMPARE(result, expected); - QDateTime resultDatetime = QDateTime::fromString(result, format); - // If expecting invalid result the datetime may still be valid, i.e. year < 0 or > 9999 - if (!expected.isEmpty()) { - QEXPECT_FAIL("without-ms", "Qt::ISODate truncates milliseconds (QTBUG-56552)", Abort); - - QCOMPARE(resultDatetime, datetime); - QCOMPARE(resultDatetime.date(), datetime.date()); - QCOMPARE(resultDatetime.time(), datetime.time()); - QCOMPARE(resultDatetime.timeSpec(), datetime.timeSpec()); - QCOMPARE(resultDatetime.offsetFromUtc(), datetime.offsetFromUtc()); - } else { + const QDateTime resultDatetime = QDateTime::fromString(result, format); + if (QByteArray(QTest::currentDataTag()) == "invalid") { QCOMPARE(resultDatetime, QDateTime()); + } else { + const QDateTime when = + QByteArray(QTest::currentDataTag()) == "without-ms" + ? datetime.addMSecs(-datetime.time().msec()) : datetime; + QCOMPARE(resultDatetime.toMSecsSinceEpoch(), when.toMSecsSinceEpoch()); + QCOMPARE(resultDatetime, when); + QCOMPARE(resultDatetime.date(), when.date()); + QCOMPARE(resultDatetime.time(), when.time()); + QCOMPARE(resultDatetime.timeSpec(), when.timeSpec()); + QCOMPARE(resultDatetime.offsetFromUtc(), when.offsetFromUtc()); } #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) @@ -3721,38 +3723,63 @@ void tst_QDateTime::timeZones() const #endif } -void tst_QDateTime::systemTimeZoneChange() const +void tst_QDateTime::systemTimeZoneChange_data() const { #ifdef Q_OS_WINRT QSKIP("UWP applications cannot change the system`s time zone (sandboxing)"); #endif - // Set the timezone to Brisbane time + QTest::addColumn("date"); + QTest::newRow("short") << QDate(1970, 1, 1); + QTest::newRow("2012") << QDate(2012, 6, 1); // short on 64-bit, pimpled on 32-bit + QTest::newRow("pimpled") << QDate(1150000, 6, 1); +} + +void tst_QDateTime::systemTimeZoneChange() const +{ + QFETCH(const QDate, date); + const QTime early(2, 15, 30); + + // Start out in Brisbane time: TimeZoneRollback useZone(QByteArray("AEST-10:00")); - - QDateTime localDate = QDateTime(QDate(2012, 6, 1), QTime(2, 15, 30), Qt::LocalTime); - QDateTime utcDate = QDateTime(QDate(2012, 6, 1), QTime(2, 15, 30), Qt::UTC); + if (QDateTime(date, early, Qt::LocalTime).offsetFromUtc() != 600 * 60) + QSKIP("Test depends on system support for changing zone to AEST-10:00"); #if QT_CONFIG(timezone) - QDateTime tzDate = QDateTime(QDate(2012, 6, 1), QTime(2, 15, 30), QTimeZone("Australia/Brisbane")); + QVERIFY(QTimeZone::systemTimeZone().isValid()); #endif - qint64 localMsecs = localDate.toMSecsSinceEpoch(); - qint64 utcMsecs = utcDate.toMSecsSinceEpoch(); -#if QT_CONFIG(timezone) - qint64 tzMsecs = tzDate.toMSecsSinceEpoch(); - // check that Australia/Brisbane is known + const QDateTime localDate = QDateTime(date, early, Qt::LocalTime); + const QDateTime utcDate = QDateTime(date, early, Qt::UTC); + const qint64 localMsecs = localDate.toMSecsSinceEpoch(); + const qint64 utcMsecs = utcDate.toMSecsSinceEpoch(); +#if QT_CONFIG(timezone) + const QTimeZone aest("Australia/Brisbane"); // no transitions since 1992 + // Check that Australia/Brisbane is known: + QVERIFY(aest.isValid()); + const QDateTime tzDate = QDateTime(date, early, aest); + + // Check we got the right zone ! QVERIFY(tzDate.timeZone().isValid()); + QCOMPARE(tzDate.timeZone(), aest); + const qint64 tzMsecs = tzDate.toMSecsSinceEpoch(); #endif // Change to Indian time useZone.reset(QByteArray("IST-05:30")); + if (QDateTime(date, early, Qt::LocalTime).offsetFromUtc() != 330 * 60) + QSKIP("Test depends on system support for changing zone to IST-05:30"); +#if QT_CONFIG(timezone) + QVERIFY(QTimeZone::systemTimeZone().isValid()); +#endif - QCOMPARE(localDate, QDateTime(QDate(2012, 6, 1), QTime(2, 15, 30), Qt::LocalTime)); - QVERIFY(localMsecs != localDate.toMSecsSinceEpoch()); - QCOMPARE(utcDate, QDateTime(QDate(2012, 6, 1), QTime(2, 15, 30), Qt::UTC)); + QCOMPARE(localDate, QDateTime(date, early, Qt::LocalTime)); + // Note: localDate.toMSecsSinceEpoch == localMsecs, unchanged, iff localDate is pimpled. + QVERIFY(localMsecs != QDateTime(date, early, Qt::LocalTime).toMSecsSinceEpoch()); + QCOMPARE(utcDate, QDateTime(date, early, Qt::UTC)); QCOMPARE(utcDate.toMSecsSinceEpoch(), utcMsecs); #if QT_CONFIG(timezone) - QCOMPARE(tzDate, QDateTime(QDate(2012, 6, 1), QTime(2, 15, 30), QTimeZone("Australia/Brisbane"))); QCOMPARE(tzDate.toMSecsSinceEpoch(), tzMsecs); + QCOMPARE(tzDate.timeZone(), aest); + QCOMPARE(tzDate, QDateTime(date, early, aest)); #endif } diff --git a/tests/auto/corelib/time/qtimezone/tst_qtimezone.cpp b/tests/auto/corelib/time/qtimezone/tst_qtimezone.cpp index 66f6b516..a59b58d5 100644 --- a/tests/auto/corelib/time/qtimezone/tst_qtimezone.cpp +++ b/tests/auto/corelib/time/qtimezone/tst_qtimezone.cpp @@ -62,6 +62,7 @@ private slots: void windowsId(); void isValidId_data(); void isValidId(); + void malformed(); // Backend tests void utcTest(); void icuTest(); @@ -931,6 +932,21 @@ void tst_QTimeZone::isValidId() #endif } +void tst_QTimeZone::malformed() +{ + // Regression test for QTBUG-92808 + // Strings that look enough like a POSIX zone specifier that the constructor + // accepts them, but the specifier is invalid. + // Must not crash or trigger assertions when calling offsetFromUtc() + const QDateTime now = QDateTime::currentDateTime(); + QTimeZone barf("QUT4tCZ0 , /"); + if (barf.isValid()) + barf.offsetFromUtc(now); + barf = QTimeZone("QtC+09,,MA"); + if (barf.isValid()) + barf.offsetFromUtc(now); +} + void tst_QTimeZone::utcTest() { #ifdef QT_BUILD_INTERNAL diff --git a/tests/auto/corelib/tools/containerapisymmetry/tst_containerapisymmetry.cpp b/tests/auto/corelib/tools/containerapisymmetry/tst_containerapisymmetry.cpp index 2c7c8f65..11f181a9 100644 --- a/tests/auto/corelib/tools/containerapisymmetry/tst_containerapisymmetry.cpp +++ b/tests/auto/corelib/tools/containerapisymmetry/tst_containerapisymmetry.cpp @@ -40,8 +40,10 @@ #include #include #include // for reference +#include #include #include +#include #include // MSVC has these containers from the Standard Library, but it lacks @@ -64,6 +66,28 @@ #include #endif +QT_BEGIN_NAMESPACE +std::ostream &operator<<(std::ostream &os, const QChar &c) +{ + Q_ASSERT(c == QLatin1Char{c.toLatin1()}); + return os << c.toLatin1(); +} +std::istream &operator>>(std::istream &os, QChar &c) +{ + char cL1; + os >> cL1; + c = QLatin1Char{cL1}; + return os; +} +QT_END_NAMESPACE + +namespace { +template +struct is_qlist : std::false_type {}; +template +struct is_qlist> : std::true_type {}; +} + struct Movable { explicit Movable(int i = 0) Q_DECL_NOTHROW @@ -85,6 +109,11 @@ struct Movable int i; static int instanceCount; + + friend std::ostream &operator<<(std::ostream &os, const Movable &m) + { return os << m.i; } + friend std::istream &operator>>(std::istream &os, Movable &m) + { return os >> m.i; } }; int Movable::instanceCount = 0; @@ -124,6 +153,11 @@ struct Complex int i; static int instanceCount; + + friend std::ostream &operator<<(std::ostream &os, const Complex &c) + { return os << c.i; } + friend std::istream &operator>>(std::istream &os, Complex &c) + { return os >> c.i; } }; int Complex::instanceCount = 0; @@ -550,12 +584,30 @@ void tst_ContainerApiSymmetry::ranged_ctor_non_associative_impl() const // from itself const Container c4(reference.begin(), reference.end()); + // from stringsteam (= pure input_iterator) + const Container c5 = [&] { +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) // QTBUG-99036 + if constexpr (is_qlist::value) { + return c4; + } else +#endif + { + std::stringstream ss; + for (auto &v : values1) + ss << v << ' '; + ss.seekg(0); + return Container(std::istream_iterator{ss}, + std::istream_iterator{}); + } + }(); + QCOMPARE(c1, reference); QCOMPARE(c2a, reference); QCOMPARE(c2b, reference); QCOMPARE(c3a, reference); QCOMPARE(c3b, reference); QCOMPARE(c4, reference); + QCOMPARE(c5, reference); } diff --git a/tests/auto/corelib/tools/qhashfunctions/tst_qhashfunctions.cpp b/tests/auto/corelib/tools/qhashfunctions/tst_qhashfunctions.cpp index f76f3aa0..4eb8a970 100644 --- a/tests/auto/corelib/tools/qhashfunctions/tst_qhashfunctions.cpp +++ b/tests/auto/corelib/tools/qhashfunctions/tst_qhashfunctions.cpp @@ -230,8 +230,14 @@ namespace SomeNamespace { struct Hashable { int i; }; inline uint qHash(Hashable h, uint seed = 0) { return QT_PREPEND_NAMESPACE(qHash)(h.i, seed); } -} + struct AdlHashable { + int i; + private: + friend size_t qHash(AdlHashable h, size_t seed = 0) + { return QT_PREPEND_NAMESPACE(qHash)(h.i, seed); } + }; +} void tst_QHashFunctions::range() { static const int ints[] = {0, 1, 2, 3, 4, 5}; @@ -253,10 +259,16 @@ void tst_QHashFunctions::range() QCOMPARE(qHashRange(ints, ints + numInts, seed), qHashRange(it, end, seed)); } - SomeNamespace::Hashable hashables[] = {{0}, {1}, {2}, {3}, {4}, {5}}; - static const size_t numHashables = sizeof hashables / sizeof *hashables; - // compile check: is qHash() found using ADL? - (void)qHashRange(hashables, hashables + numHashables, seed); + { + SomeNamespace::Hashable hashables[] = {{0}, {1}, {2}, {3}, {4}, {5}}; + // compile check: is qHash() found using ADL? + [[maybe_unused]] auto r = qHashRange(std::begin(hashables), std::end(hashables), seed); + } + { + SomeNamespace::AdlHashable hashables[] = {{0}, {1}, {2}, {3}, {4}, {5}}; + // compile check: is qHash() found as a hidden friend? + [[maybe_unused]] auto r = qHashRange(std::begin(hashables), std::end(hashables), seed); + } } void tst_QHashFunctions::rangeCommutative() @@ -279,10 +291,16 @@ void tst_QHashFunctions::rangeCommutative() QCOMPARE(qHashRangeCommutative(ints, ints + numInts, seed), qHashRangeCommutative(it, end, seed)); } - SomeNamespace::Hashable hashables[] = {{0}, {1}, {2}, {3}, {4}, {5}}; - static const size_t numHashables = sizeof hashables / sizeof *hashables; - // compile check: is qHash() found using ADL? - (void)qHashRangeCommutative(hashables, hashables + numHashables, seed); + { + SomeNamespace::Hashable hashables[] = {{0}, {1}, {2}, {3}, {4}, {5}}; + // compile check: is qHash() found using ADL? + [[maybe_unused]] auto r = qHashRangeCommutative(std::begin(hashables), std::end(hashables), seed); + } + { + SomeNamespace::AdlHashable hashables[] = {{0}, {1}, {2}, {3}, {4}, {5}}; + // compile check: is qHash() found as a hidden friend? + [[maybe_unused]] auto r = qHashRangeCommutative(std::begin(hashables), std::end(hashables), seed); + } } void tst_QHashFunctions::stdHash() diff --git a/tests/auto/corelib/tools/qtimeline/BLACKLIST b/tests/auto/corelib/tools/qtimeline/BLACKLIST index 961147a3..8040a529 100644 --- a/tests/auto/corelib/tools/qtimeline/BLACKLIST +++ b/tests/auto/corelib/tools/qtimeline/BLACKLIST @@ -1,5 +1,5 @@ [interpolation] -windows-10 msvc-2015 +windows osx [frameRate] macos diff --git a/tests/auto/corelib/tools/qvarlengtharray/tst_qvarlengtharray.cpp b/tests/auto/corelib/tools/qvarlengtharray/tst_qvarlengtharray.cpp index 5443cf12..0174885c 100644 --- a/tests/auto/corelib/tools/qvarlengtharray/tst_qvarlengtharray.cpp +++ b/tests/auto/corelib/tools/qvarlengtharray/tst_qvarlengtharray.cpp @@ -29,6 +29,7 @@ #include #include #include +#include #include @@ -36,10 +37,13 @@ class tst_QVarLengthArray : public QObject { Q_OBJECT private slots: + void defaultConstructor_int() { defaultConstructor(); } + void defaultConstructor_QString() { defaultConstructor(); } void append(); void removeLast(); void oldTests(); void appendCausingRealloc(); + void appendIsStronglyExceptionSafe(); void resize(); void realloc(); void reverseIterators(); @@ -61,6 +65,8 @@ private slots: void implicitDefaultCtor(); private: + template + void defaultConstructor(); template void initializeList(); }; @@ -80,6 +86,23 @@ struct Tracker int Tracker::count = 0; +template +void tst_QVarLengthArray::defaultConstructor() +{ + { + QVarLengthArray vla; + QCOMPARE(vla.size(), 0); + QVERIFY(vla.empty()); + QVERIFY(vla.isEmpty()); + QCOMPARE(vla.begin(), vla.end()); + QCOMPARE(vla.capacity(), 123); + } + { + QVarLengthArray vla; + QCOMPARE(vla.capacity(), 256); // notice, should we change the default + } +} + void tst_QVarLengthArray::append() { QVarLengthArray v; @@ -245,6 +268,49 @@ void tst_QVarLengthArray::appendCausingRealloc() d.append(i); } +void tst_QVarLengthArray::appendIsStronglyExceptionSafe() +{ +#ifdef QT_NO_EXCEPTIONS + QSKIP("This test requires exception support enabled in the compiler."); +#else + static bool throwOnCopyNow = false; + static bool throwOnMoveNow = false; + struct Thrower { + Thrower() = default; + Thrower(const Thrower &) + { + if (throwOnCopyNow) + throw 1; + } + Thrower &operator=(const Thrower &) = default; + Thrower(Thrower &&) + { + if (throwOnMoveNow) + throw 1; + } + Thrower &operator=(Thrower &&) = default; + ~Thrower() = default; + }; + + { + // ### TODO: QVLA isn't exception-safe when throwing during reallocation, + // ### so check with size() < capacity() for now + QVarLengthArray vla(1); + { + Thrower t; + const QScopedValueRollback rb(throwOnCopyNow, true); + QVERIFY_EXCEPTION_THROWN(vla.push_back(t), int); + QCOMPARE(vla.size(), 1); + } + { + const QScopedValueRollback rb(throwOnMoveNow, true); + QVERIFY_EXCEPTION_THROWN(vla.push_back({}), int); + QCOMPARE(vla.size(), 1); + } + } +#endif +} + void tst_QVarLengthArray::resize() { //MOVABLE diff --git a/tests/auto/corelib/tools/qvector/tst_qvector.cpp b/tests/auto/corelib/tools/qvector/tst_qvector.cpp index 08d5a8cd..01409bd1 100644 --- a/tests/auto/corelib/tools/qvector/tst_qvector.cpp +++ b/tests/auto/corelib/tools/qvector/tst_qvector.cpp @@ -183,6 +183,94 @@ inline uint qHash(const Custom &key, uint seed = 0) { return qHash(key.i, seed); Q_DECLARE_METATYPE(Custom); +// Similar to Custom but not default-constructible and has move constructor and assignment +struct NonDefaultConstructible { + NonDefaultConstructible() = delete; + NonDefaultConstructible(char input) + : i(input) + , that(this) + , state(Constructed) + { + counter.fetchAndAddRelaxed(1); + } + NonDefaultConstructible(const NonDefaultConstructible &other) + : i(other.i) + , that(this) + , state(Constructed) + { + check(&other); + counter.fetchAndAddRelaxed(1); + } + NonDefaultConstructible(NonDefaultConstructible &&other) + : i(other.i) + , that(this) + , state(Constructed) + { + check(&other); + other.state = MovedFrom; + counter.fetchAndAddRelaxed(1); + } + ~NonDefaultConstructible() + { + check(this, true); + i = 0; + counter.fetchAndAddRelaxed(-1); + state = Destructed; + } + + bool operator==(const NonDefaultConstructible &other) const + { + check(&other); + check(this); + return i == other.i; + } + + bool operator<(const NonDefaultConstructible &other) const + { + check(&other); + check(this); + return i < other.i; + } + + NonDefaultConstructible &operator=(const NonDefaultConstructible &other) + { + check(&other); + check(this, true); + i = other.i; + state = Constructed; + return *this; + } + + NonDefaultConstructible &operator=(NonDefaultConstructible &&other) + { + check(&other); + check(this, true); + i = other.i; + state = Constructed; + other.state = MovedFrom; + return *this; + } + static QAtomicInt counter; + + char i; // used to identify origin of an instance +private: + NonDefaultConstructible *that; // used to catch copying using mem{cpy,move}() + + enum State { Constructed = 106, Destructed = 110, MovedFrom = 120 }; + State state; + + static void check(const NonDefaultConstructible *c, bool movedOk = false) + { + // check if c object has been moved incorrectly + QCOMPARE(c, c->that); + if (!movedOk || c->state != MovedFrom) + QCOMPARE(c->state, Constructed); + } +}; +QAtomicInt NonDefaultConstructible::counter = 0; + +inline uint qHash(const NonDefaultConstructible &key, uint seed = 0) { return qHash(key.i, seed); } + // tests depends on the fact that: Q_STATIC_ASSERT(!QTypeInfo::isStatic); Q_STATIC_ASSERT(!QTypeInfo::isComplex); @@ -190,6 +278,8 @@ Q_STATIC_ASSERT(!QTypeInfo::isStatic); Q_STATIC_ASSERT(QTypeInfo::isComplex); Q_STATIC_ASSERT(QTypeInfo::isStatic); Q_STATIC_ASSERT(QTypeInfo::isComplex); +Q_STATIC_ASSERT(QTypeInfo::isStatic); +Q_STATIC_ASSERT(QTypeInfo::isComplex); class tst_QVector : public QObject @@ -263,6 +353,7 @@ private slots: void insertInt() const; void insertMovable() const; void insertCustom() const; + void insertNonDefaultConstructible() const; void isEmpty() const; void last() const; void lastIndexOf() const; @@ -273,6 +364,7 @@ private slots: void prependInt() const; void prependMovable() const; void prependCustom() const; + void prependNonDefaultConstructible() const; void qhashInt() const { qhash(); } void qhashMovable() const { qhash(); } void qhashCustom() const { qhash(); } @@ -390,6 +482,10 @@ template<> const Movable SimpleValue::Values[] = { 110, 105, 101, 114, 111, 98 }; template<> const Custom SimpleValue::Values[] = { 110, 105, 101, 114, 111, 98 }; +template<> +const NonDefaultConstructible SimpleValue::Values[] = + { 110, 105, 101, 114, 111, 98 }; + // Make some macros for the tests to use in order to be slightly more readable... #define T_FOO SimpleValue::at(0) @@ -1592,6 +1688,11 @@ void tst_QVector::insertCustom() const insert(); } +void tst_QVector::insertNonDefaultConstructible() const +{ + insert(); +} + void tst_QVector::isEmpty() const { QVector myvec; @@ -1831,6 +1932,13 @@ void tst_QVector::prependCustom() const QCOMPARE(instancesCount, Custom::counter.loadAcquire()); } +void tst_QVector::prependNonDefaultConstructible() const +{ + const int instancesCount = NonDefaultConstructible::counter.loadAcquire(); + prepend(); + QCOMPARE(instancesCount, NonDefaultConstructible::counter.loadAcquire()); +} + void tst_QVector::removeAllWithAlias() const { QVector strings; diff --git a/tests/auto/gui/image/qimage/tst_qimage.cpp b/tests/auto/gui/image/qimage/tst_qimage.cpp index 4a408e9b..01971ee3 100644 --- a/tests/auto/gui/image/qimage/tst_qimage.cpp +++ b/tests/auto/gui/image/qimage/tst_qimage.cpp @@ -103,6 +103,10 @@ private slots: void setPixel_data(); void setPixel(); + void setPixelWithAlpha_data(); + void setPixelWithAlpha(); + void setPixelColorWithAlpha_data(); + void setPixelColorWithAlpha(); void defaultColorTable_data(); void defaultColorTable(); @@ -1478,6 +1482,62 @@ void tst_QImage::setPixel() } } +void tst_QImage::setPixelWithAlpha_data() +{ + QTest::addColumn("format"); + + for (int c = QImage::Format_RGB32; c < QImage::NImageFormats; ++c) { + if (c == QImage::Format_Grayscale8) + continue; + if (c == QImage::Format_Grayscale16) + continue; + if (c == QImage::Format_Alpha8) + continue; + QTest::newRow(qPrintable(formatToString(QImage::Format(c)))) << QImage::Format(c); + } +} + +void tst_QImage::setPixelWithAlpha() +{ + QFETCH(QImage::Format, format); + QImage image(1, 1, format); + QRgb referenceColor = qRgba(0, 170, 85, 170); + image.setPixel(0, 0, referenceColor); + + if (!image.hasAlphaChannel()) + referenceColor = 0xff000000 | referenceColor; + + QRgb color = image.pixel(0, 0); + QCOMPARE(qRed(color) & 0xf0, qRed(referenceColor) & 0xf0); + QCOMPARE(qGreen(color) & 0xf0, qGreen(referenceColor) & 0xf0); + QCOMPARE(qBlue(color) & 0xf0, qBlue(referenceColor) & 0xf0); + QCOMPARE(qAlpha(color) & 0xf0, qAlpha(referenceColor) & 0xf0); +} + +void tst_QImage::setPixelColorWithAlpha_data() +{ + setPixelWithAlpha_data(); +} + +void tst_QImage::setPixelColorWithAlpha() +{ + QFETCH(QImage::Format, format); + QImage image(1, 1, format); + image.setPixelColor(0, 0, QColor(170, 85, 255, 170)); + QRgb referenceColor = qRgba(170, 85, 255, 170); + + if (!image.hasAlphaChannel()) + referenceColor = 0xff000000 | referenceColor; + else if (image.pixelFormat().premultiplied() == QPixelFormat::Premultiplied) + referenceColor = qPremultiply(referenceColor); + + QRgb color = image.pixel(0, 0); + QCOMPARE(qRed(color) & 0xf0, qRed(referenceColor) & 0xf0); + QCOMPARE(qGreen(color) & 0xf0, qGreen(referenceColor) & 0xf0); + QCOMPARE(qBlue(color) & 0xf0, qBlue(referenceColor) & 0xf0); + QCOMPARE(qAlpha(color) & 0xf0, qAlpha(referenceColor) & 0xf0); +} + void tst_QImage::convertToFormatPreserveDotsPrMeter() { QImage img(100, 100, QImage::Format_ARGB32_Premultiplied); @@ -2345,17 +2405,7 @@ void tst_QImage::fillColor() void tst_QImage::fillColorWithAlpha_data() { - QTest::addColumn("format"); - - for (int c = QImage::Format_RGB32; c < QImage::NImageFormats; ++c) { - if (c == QImage::Format_Grayscale8) - continue; - if (c == QImage::Format_Grayscale16) - continue; - if (c == QImage::Format_Alpha8) - continue; - QTest::newRow(qPrintable(formatToString(QImage::Format(c)))) << QImage::Format(c); - } + setPixelWithAlpha_data(); } void tst_QImage::fillColorWithAlpha() @@ -2400,10 +2450,13 @@ void tst_QImage::fillPixel_data() QTest::newRow("RGB16, transparent") << QImage::Format_RGB16 << 0x0u << 0xff000000u; QTest::newRow("RGB32, transparent") << QImage::Format_RGB32 << 0x0u << 0xff000000u; + QTest::newRow("RGB444, transparent") << QImage::Format_RGB444 << 0x0u << 0xff000000u; + QTest::newRow("RGB666, transparent") << QImage::Format_RGB666 << 0x0u << 0xff000000u; QTest::newRow("RGBx8888, transparent") << QImage::Format_RGBX8888 << 0x0u << 0xff000000u; QTest::newRow("ARGB32, transparent") << QImage::Format_ARGB32 << 0x0u << 0x00000000u; QTest::newRow("ARGB32pm, transparent") << QImage::Format_ARGB32_Premultiplied << 0x0u << 0x00000000u; QTest::newRow("RGBA8888pm, transparent") << QImage::Format_RGBA8888_Premultiplied << 0x0u << 0x00000000u; + QTest::newRow("Grayscale8, transparent") << QImage::Format_Grayscale8 << 0x0u << 0xff000000u; QTest::newRow("Alpha8, transparent") << QImage::Format_Alpha8 << 0x0u << 0x00000000u; QTest::newRow("RGB16, red") << QImage::Format_RGB16 << (uint)qConvertRgb32To16(0xffff0000) << 0xffff0000u; @@ -2411,13 +2464,14 @@ void tst_QImage::fillPixel_data() QTest::newRow("ARGB32, red") << QImage::Format_ARGB32 << 0xffff0000u << 0xffff0000u; QTest::newRow("RGBA8888, red") << QImage::Format_RGBA8888 << 0xff0000ffu << 0xffff0000u; - QTest::newRow("Grayscale8, grey") << QImage::Format_Grayscale8 << 0xff808080u << 0xff808080u; + QTest::newRow("Grayscale8, grey") << QImage::Format_Grayscale8 << 0x80u << 0xff808080u; QTest::newRow("RGB32, semi-red") << QImage::Format_RGB32 << 0x80ff0000u << 0xffff0000u; QTest::newRow("ARGB32, semi-red") << QImage::Format_ARGB32 << 0x80ff0000u << 0x80ff0000u; QTest::newRow("ARGB32pm, semi-red") << QImage::Format_ARGB32 << 0x80800000u << 0x80800000u; QTest::newRow("RGBA8888pm, semi-red") << QImage::Format_RGBA8888_Premultiplied << 0x80000080u << 0x80800000u; - QTest::newRow("Alpha8, semi-red") << QImage::Format_Alpha8 << 0x80000080u << 0x80000000u; + + QTest::newRow("Alpha8, semi-transparent") << QImage::Format_Alpha8 << 0x80u << 0x80000000u; } void tst_QImage::fillPixel() @@ -2430,6 +2484,8 @@ void tst_QImage::fillPixel() image.fill(color); QCOMPARE(image.pixel(0, 0), pixelValue); + if (image.depth() == 8) + QCOMPARE(*(const uchar *)image.constBits(), color); } void tst_QImage::rgbSwapped_data() @@ -3516,6 +3572,13 @@ void tst_QImage::metadataPassthrough() QCOMPARE(converted.dotsPerMeterY(), a.dotsPerMeterY()); QCOMPARE(converted.devicePixelRatio(), a.devicePixelRatio()); + QVector clut({ 0xFFFF0000, 0xFF00FF00, 0xFF0000FF }); + QImage convertedWithClut = a.convertToFormat(QImage::Format_Indexed8, clut); + QCOMPARE(convertedWithClut.text(QStringLiteral("Test")), a.text(QStringLiteral("Test"))); + QCOMPARE(convertedWithClut.dotsPerMeterX(), a.dotsPerMeterX()); + QCOMPARE(convertedWithClut.dotsPerMeterY(), a.dotsPerMeterY()); + QCOMPARE(convertedWithClut.devicePixelRatio(), a.devicePixelRatio()); + QImage copied = a.copy(0, 0, a.width() / 2, a.height() / 2); QCOMPARE(copied.text(QStringLiteral("Test")), a.text(QStringLiteral("Test"))); QCOMPARE(copied.dotsPerMeterX(), a.dotsPerMeterX()); diff --git a/tests/auto/gui/image/qpixmap/tst_qpixmap.cpp b/tests/auto/gui/image/qpixmap/tst_qpixmap.cpp index 1d77f709..41751460 100644 --- a/tests/auto/gui/image/qpixmap/tst_qpixmap.cpp +++ b/tests/auto/gui/image/qpixmap/tst_qpixmap.cpp @@ -120,6 +120,7 @@ private slots: void copy(); void deepCopyPreservesDpr(); + void fillPreservesDpr(); void dprPassthrough(); void depthOfNullObjects(); @@ -1156,6 +1157,19 @@ void tst_QPixmap::deepCopyPreservesDpr() QCOMPARE(dest.devicePixelRatio(), dpr); } +// Check that the DPR is preserved after doing a fill after an +// assigned copy of the QPixmap +void tst_QPixmap::fillPreservesDpr() +{ + const qreal dpr = 2; + QPixmap src(32, 32); + src.setDevicePixelRatio(dpr); + src.fill(Qt::red); + QPixmap dest = src; + dest.fill(Qt::blue); + QCOMPARE(dest.devicePixelRatio(), dpr); +} + void tst_QPixmap::dprPassthrough() { const qreal dpr = 2; diff --git a/tests/auto/gui/math3d/qquaternion/tst_qquaternion.cpp b/tests/auto/gui/math3d/qquaternion/tst_qquaternion.cpp index 8041fb54..7dbd5874 100644 --- a/tests/auto/gui/math3d/qquaternion/tst_qquaternion.cpp +++ b/tests/auto/gui/math3d/qquaternion/tst_qquaternion.cpp @@ -1088,35 +1088,38 @@ void tst_QQuaternion::fromEulerAngles_data() QTest::addColumn("yaw"); QTest::addColumn("roll"); + QTest::addColumn("quaternion"); + QTest::newRow("null") - << 0.0f << 0.0f << 0.0f; + << 0.0f << 0.0f << 0.0f << QQuaternion(1.0f, 0.0f, 0.0f, 0.0f); QTest::newRow("xonly") - << 90.0f << 0.0f << 0.0f; + << 90.0f << 0.0f << 0.0f << QQuaternion(0.707107f, 0.707107f, 0.0f, 0.0f); QTest::newRow("yonly") - << 0.0f << 180.0f << 0.0f; + << 0.0f << 180.0f << 0.0f << QQuaternion(0.0f, 0.0f, 1.0f, 0.0f); QTest::newRow("zonly") - << 0.0f << 0.0f << 270.0f; + << 0.0f << 0.0f << 270.0f << QQuaternion(-0.707107f, 0.0f, 0.0f, 0.707107f); QTest::newRow("x+z") - << 30.0f << 0.0f << 45.0f; + << 30.0f << 0.0f << 45.0f << QQuaternion(0.892399f, 0.239118f, -0.099046f, 0.369644f); QTest::newRow("x+y") - << 30.0f << 90.0f << 0.0f; + << 30.0f << 90.0f << 0.0f << QQuaternion(0.683013f, 0.183013f, 0.683013f, -0.183013f); QTest::newRow("y+z") - << 0.0f << 45.0f << 30.0f; + << 0.0f << 45.0f << 30.0f << QQuaternion(0.892399f, 0.099046f, 0.369644f, 0.239118f); QTest::newRow("complex") - << 30.0f << 240.0f << -45.0f; + << 30.0f << 240.0f << -45.0f << QQuaternion(-0.531976f, -0.43968f, 0.723317f, -0.02226f); } void tst_QQuaternion::fromEulerAngles() { QFETCH(float, pitch); QFETCH(float, yaw); QFETCH(float, roll); + QFETCH(QQuaternion, quaternion); // Use a straight-forward implementation of the algorithm at: // http://www.j3d.org/matrix_faq/matrfaq_latest.html#Q60 @@ -1132,11 +1135,22 @@ void tst_QQuaternion::fromEulerAngles() QVERIFY(myFuzzyCompare(answer.z(), result.z())); QVERIFY(myFuzzyCompare(answer.scalar(), result.scalar())); + // quaternion should be the same as the result + QVERIFY(myFuzzyCompare(answer.x(), quaternion.x())); + QVERIFY(myFuzzyCompare(answer.y(), quaternion.y())); + QVERIFY(myFuzzyCompare(answer.z(), quaternion.z())); + QVERIFY(myFuzzyCompare(answer.scalar(), quaternion.scalar())); + { QVector3D answerEulerAngles = answer.toEulerAngles(); QVERIFY(myFuzzyCompareDegrees(answerEulerAngles.x(), pitch)); QVERIFY(myFuzzyCompareDegrees(answerEulerAngles.y(), yaw)); QVERIFY(myFuzzyCompareDegrees(answerEulerAngles.z(), roll)); + + QVector3D quaternionEulerAngles = quaternion.toEulerAngles(); + QVERIFY(myFuzzyCompareDegrees(quaternionEulerAngles.x(), pitch)); + QVERIFY(myFuzzyCompareDegrees(quaternionEulerAngles.y(), yaw)); + QVERIFY(myFuzzyCompareDegrees(quaternionEulerAngles.z(), roll)); } answer = QQuaternion::fromEulerAngles(pitch, yaw, roll); @@ -1151,6 +1165,12 @@ void tst_QQuaternion::fromEulerAngles() QVERIFY(myFuzzyCompareDegrees(answerPitch, pitch)); QVERIFY(myFuzzyCompareDegrees(answerYaw, yaw)); QVERIFY(myFuzzyCompareDegrees(answerRoll, roll)); + + float quaternionPitch, quaternionYaw, quaternionRoll; + quaternion.getEulerAngles(&quaternionPitch, &quaternionYaw, &quaternionRoll); + QVERIFY(myFuzzyCompareDegrees(quaternionPitch, pitch)); + QVERIFY(myFuzzyCompareDegrees(quaternionYaw, yaw)); + QVERIFY(myFuzzyCompareDegrees(quaternionRoll, roll)); } } diff --git a/tests/auto/gui/painting/qcolorspace/tst_qcolorspace.cpp b/tests/auto/gui/painting/qcolorspace/tst_qcolorspace.cpp index 99fb3d3e..7bfd2f74 100644 --- a/tests/auto/gui/painting/qcolorspace/tst_qcolorspace.cpp +++ b/tests/auto/gui/painting/qcolorspace/tst_qcolorspace.cpp @@ -59,6 +59,10 @@ private slots: void imageConversion_data(); void imageConversion(); + void imageConversion64_data(); + void imageConversion64(); + void imageConversionOverLargerGamut_data(); + void imageConversionOverLargerGamut(); void loadImage(); @@ -234,6 +238,7 @@ void tst_QColorSpace::imageConversion_data() QTest::newRow("Adobe RGB -> sRGB") << QColorSpace::AdobeRgb << QColorSpace::SRgb << 2; QTest::newRow("Display-P3 -> Adobe RGB") << QColorSpace::DisplayP3 << QColorSpace::AdobeRgb << 2; QTest::newRow("sRGB -> sRGB Linear") << QColorSpace::SRgb << QColorSpace::SRgbLinear << 0; + QTest::newRow("sRGB Linear -> sRGB") << QColorSpace::SRgbLinear << QColorSpace::SRgb << 0; } void tst_QColorSpace::imageConversion() @@ -284,6 +289,120 @@ void tst_QColorSpace::imageConversion() } } +void tst_QColorSpace::imageConversion64_data() +{ + QTest::addColumn("fromColorSpace"); + QTest::addColumn("toColorSpace"); + + QTest::newRow("sRGB -> Display-P3") << QColorSpace::SRgb << QColorSpace::DisplayP3; + QTest::newRow("sRGB -> Adobe RGB") << QColorSpace::SRgb << QColorSpace::AdobeRgb; + QTest::newRow("Display-P3 -> sRGB") << QColorSpace::DisplayP3 << QColorSpace::SRgb; + QTest::newRow("Display-P3 -> Adobe RGB") << QColorSpace::DisplayP3 << QColorSpace::AdobeRgb; + QTest::newRow("sRGB -> sRGB Linear") << QColorSpace::SRgb << QColorSpace::SRgbLinear; + QTest::newRow("sRGB Linear -> sRGB") << QColorSpace::SRgbLinear << QColorSpace::SRgb; +} + +void tst_QColorSpace::imageConversion64() +{ + QFETCH(QColorSpace::NamedColorSpace, fromColorSpace); + QFETCH(QColorSpace::NamedColorSpace, toColorSpace); + + QImage testImage(256, 1, QImage::Format_RGBX64); + + for (int i = 0; i < 256; ++i) + testImage.setPixel(i, 0, qRgb(i, i, i)); + + testImage.setColorSpace(fromColorSpace); + QCOMPARE(testImage.colorSpace(), QColorSpace(fromColorSpace)); + + testImage.convertToColorSpace(toColorSpace); + QCOMPARE(testImage.colorSpace(), QColorSpace(toColorSpace)); + + int lastRed = 0; + int lastGreen = 0; + int lastBlue = 0; + for (int i = 0; i < 256; ++i) { + QRgb p = testImage.pixel(i, 0); + QVERIFY(qRed(p) >= lastRed); + QVERIFY(qGreen(p) >= lastGreen); + QVERIFY(qBlue(p) >= lastBlue); + lastRed = qRed(p); + lastGreen = qGreen(p); + lastBlue = qBlue(p); + } + + lastRed = 0; + lastGreen = 0; + lastBlue = 0; + testImage.convertToColorSpace(fromColorSpace); + QCOMPARE(testImage.colorSpace(), QColorSpace(fromColorSpace)); + for (int i = 0; i < 256; ++i) { + QRgb p = testImage.pixel(i, 0); + QCOMPARE(qRed(p), qGreen(p)); + QCOMPARE(qRed(p), qBlue(p)); + QVERIFY((lastRed - qRed(p)) <= 0); + QVERIFY((lastGreen - qGreen(p)) <= 0); + QVERIFY((lastBlue - qBlue(p)) <= 0); + lastRed = qRed(p); + lastGreen = qGreen(p); + lastBlue = qBlue(p); + } +} + +void tst_QColorSpace::imageConversionOverLargerGamut_data() +{ + QTest::addColumn("fromColorSpace"); + QTest::addColumn("toColorSpace"); + + QTest::newRow("sRGB -> Display-P3") << QColorSpace::SRgb << QColorSpace::DisplayP3; + QTest::newRow("sRGB -> Adobe RGB") << QColorSpace::SRgb << QColorSpace::AdobeRgb; + QTest::newRow("sRGB -> ProPhoto RGB") << QColorSpace::SRgb << QColorSpace::ProPhotoRgb; + QTest::newRow("Display-P3 -> ProPhoto RGB") << QColorSpace::DisplayP3 << QColorSpace::ProPhotoRgb; + QTest::newRow("Adobe RGB -> ProPhoto RGB") << QColorSpace::AdobeRgb << QColorSpace::ProPhotoRgb; +} + +void tst_QColorSpace::imageConversionOverLargerGamut() +{ + QFETCH(QColorSpace::NamedColorSpace, fromColorSpace); + QFETCH(QColorSpace::NamedColorSpace, toColorSpace); + + QColorSpace csfrom(fromColorSpace); + QColorSpace csto(toColorSpace); + csfrom.setTransferFunction(QColorSpace::TransferFunction::Linear); + csto.setTransferFunction(QColorSpace::TransferFunction::Linear); + + QImage testImage(256, 256, QImage::Format_RGBX64); + testImage.setColorSpace(csfrom); + for (int y = 0; y < 256; ++y) + for (int x = 0; x < 256; ++x) + testImage.setPixel(x, y, qRgb(x, y, 0)); + + QImage resultImage = testImage.convertedToColorSpace(csto); + for (int y = 0; y < 256; ++y) { + int lastRed = 0; + for (int x = 0; x < 256; ++x) { + QRgb p = resultImage.pixel(x, y); + QVERIFY(qRed(p) >= lastRed); + lastRed = qRed(p); + } + } + for (int x = 0; x < 256; ++x) { + int lastGreen = 0; + for (int y = 0; y < 256; ++y) { + QRgb p = resultImage.pixel(x, y); + QVERIFY(qGreen(p) >= lastGreen); + lastGreen = qGreen(p); + } + } + + resultImage.convertToColorSpace(csfrom); + // The images are not exactly identical at 4x16bit, but they preserve 4x8bit accuracy. + for (int y = 0; y < 256; ++y) { + for (int x = 0; x < 256; ++x) { + QCOMPARE(resultImage.pixel(x, y), testImage.pixel(x, y)); + } + } +} void tst_QColorSpace::loadImage() { diff --git a/tests/auto/gui/painting/qpainter/tst_qpainter.cpp b/tests/auto/gui/painting/qpainter/tst_qpainter.cpp index 42e98ce3..d7c3f95f 100644 --- a/tests/auto/gui/painting/qpainter/tst_qpainter.cpp +++ b/tests/auto/gui/painting/qpainter/tst_qpainter.cpp @@ -308,6 +308,7 @@ private slots: void fillPolygon(); void drawImageAtPointF(); + void scaledDashes(); private: void fillData(); @@ -5468,6 +5469,36 @@ void tst_QPainter::drawImageAtPointF() paint.end(); } +void tst_QPainter::scaledDashes() +{ + // Test that we do not hit the limit-huge-number-of-dashes path + QRgb fore = qRgb(0, 0, 0xff); + QRgb back = qRgb(0xff, 0xff, 0); + QImage image(5, 32, QImage::Format_RGB32); + image.fill(back); + QPainter p(&image); + QPen pen(QColor(fore), 3, Qt::DotLine); + p.setPen(pen); + p.scale(1, 2); + p.drawLine(2, 0, 2, 16); + p.end(); + + bool foreFound = false; + bool backFound = false; + int i = 0; + while (i < 32 && (!foreFound || !backFound)) { + QRgb pix = image.pixel(3, i); + if (pix == fore) + foreFound = true; + else if (pix == back) + backFound = true; + i++; + } + + QVERIFY(foreFound); + QVERIFY(backFound); +} + QTEST_MAIN(tst_QPainter) #include "tst_qpainter.moc" diff --git a/tests/auto/gui/painting/qpainterpath/tst_qpainterpath.cpp b/tests/auto/gui/painting/qpainterpath/tst_qpainterpath.cpp index 86a8965c..b34a63cc 100644 --- a/tests/auto/gui/painting/qpainterpath/tst_qpainterpath.cpp +++ b/tests/auto/gui/painting/qpainterpath/tst_qpainterpath.cpp @@ -173,8 +173,18 @@ void tst_QPainterPath::clear() p1.setFillRule(Qt::WindingFill); QVERIFY(p1 != p3); p1.clear(); - QCOMPARE(p1.fillRule(), Qt::OddEvenFill); + QVERIFY(p1 != p3); + p1.setFillRule(Qt::OddEvenFill); QCOMPARE(p1, p2); + + QPainterPath p4; + QCOMPARE(p4.fillRule(), Qt::OddEvenFill); + p4.setFillRule(Qt::WindingFill); + QCOMPARE(p4.fillRule(), Qt::WindingFill); + p4.clear(); + QCOMPARE(p4.fillRule(), Qt::WindingFill); + p4 = QPainterPath(); + QCOMPARE(p4.fillRule(), Qt::OddEvenFill); } void tst_QPainterPath::reserveAndCapacity() diff --git a/tests/auto/gui/text/qfontdatabase/tst_qfontdatabase.cpp b/tests/auto/gui/text/qfontdatabase/tst_qfontdatabase.cpp index bbb7276b..15e0ecad 100644 --- a/tests/auto/gui/text/qfontdatabase/tst_qfontdatabase.cpp +++ b/tests/auto/gui/text/qfontdatabase/tst_qfontdatabase.cpp @@ -33,6 +33,8 @@ #include #include #include +#include +#include #include Q_LOGGING_CATEGORY(lcTests, "qt.text.tests") @@ -277,7 +279,7 @@ void tst_QFontDatabase::addAppFont() QVERIFY(QFontDatabase::removeApplicationFont(id)); QCOMPARE(fontDbChangedSpy.count(), 2); - QCOMPARE(db.families(), oldFamilies); + QVERIFY(db.families().count() <= oldFamilies.count()); } void tst_QFontDatabase::addTwoAppFontsFromFamily() @@ -411,7 +413,11 @@ void tst_QFontDatabase::condensedFontMatching() tfcByStyleName.setStyleName("Condensed"); #ifdef Q_OS_WIN - QEXPECT_FAIL("","No matching of sub-family by stretch on Windows", Continue); + QFont f; + f.setStyleStrategy(QFont::NoFontMerging); + QFontPrivate *font_d = QFontPrivate::get(f); + if (font_d->engineForScript(QChar::Script_Common)->type() != QFontEngine::Freetype) + QEXPECT_FAIL("","No matching of sub-family by stretch on Windows", Continue); #endif #ifdef Q_OS_ANDROID diff --git a/tests/auto/gui/text/qrawfont/tst_qrawfont.cpp b/tests/auto/gui/text/qrawfont/tst_qrawfont.cpp index a32fb1d2..704215a2 100644 --- a/tests/auto/gui/text/qrawfont/tst_qrawfont.cpp +++ b/tests/auto/gui/text/qrawfont/tst_qrawfont.cpp @@ -654,6 +654,7 @@ void tst_QRawFont::fromFont_data() QTest::addColumn("hintingPreference"); QTest::addColumn("familyName"); QTest::addColumn("writingSystem"); + QTest::addColumn("styleStrategy"); for (int i=QFont::PreferDefaultHinting; i<=QFont::PreferFullHinting; ++i) { QString titleBase = QString::fromLatin1("%2, hintingPreference=%1, writingSystem=%3") @@ -667,7 +668,8 @@ void tst_QRawFont::fromFont_data() << fileName << QFont::HintingPreference(i) << "QtBidiTestFont" - << writingSystem; + << writingSystem + << QFont::PreferDefault; } { @@ -679,7 +681,8 @@ void tst_QRawFont::fromFont_data() << fileName << QFont::HintingPreference(i) << "QtBidiTestFont" - << writingSystem; + << writingSystem + << QFont::PreferDefault; } { @@ -691,9 +694,24 @@ void tst_QRawFont::fromFont_data() << fileName << QFont::HintingPreference(i) << "QtBidiTestFont" - << writingSystem; + << writingSystem + << QFont::PreferDefault; } } + + { + QString fileName = testFont; + QFontDatabase::WritingSystem writingSystem = QFontDatabase::Arabic; + + QString title = QStringLiteral("No font merging + unsupported script"); + QTest::newRow(qPrintable(title)) + << fileName + << QFont::PreferDefaultHinting + << "QtBidiTestFont" + << writingSystem + << QFont::NoFontMerging; + } + } void tst_QRawFont::fromFont() @@ -702,6 +720,7 @@ void tst_QRawFont::fromFont() QFETCH(QFont::HintingPreference, hintingPreference); QFETCH(QString, familyName); QFETCH(QFontDatabase::WritingSystem, writingSystem); + QFETCH(QFont::StyleStrategy, styleStrategy); QFontDatabase fontDatabase; int id = fontDatabase.addApplicationFont(fileName); @@ -710,6 +729,8 @@ void tst_QRawFont::fromFont() QFont font(familyName); font.setHintingPreference(hintingPreference); font.setPixelSize(26.0); + if (styleStrategy != QFont::PreferDefault) + font.setStyleStrategy(styleStrategy); QRawFont rawFont = QRawFont::fromFont(font, writingSystem); QVERIFY(rawFont.isValid()); diff --git a/tests/auto/gui/text/qtextdocument/tst_qtextdocument.cpp b/tests/auto/gui/text/qtextdocument/tst_qtextdocument.cpp index fdc7997d..a61824b5 100644 --- a/tests/auto/gui/text/qtextdocument/tst_qtextdocument.cpp +++ b/tests/auto/gui/text/qtextdocument/tst_qtextdocument.cpp @@ -197,6 +197,9 @@ private slots: void clearUndoRedoStacks(); void mergeFontFamilies(); + void contentsChangeIndices_data(); + void contentsChangeIndices(); + private: void backgroundImage_checkExpectedHtml(const QTextDocument &doc); void buildRegExpData(); @@ -1772,6 +1775,59 @@ void tst_QTextDocument::toHtml_data() << QString("EMPTYBLOCK") + QString("
  • Blah
"); } + { + CREATE_DOC_AND_CURSOR(); + const QString listHtml = "
  • item-1
  • item-2
    • item-2.1
    • item-2.2" + "
      • item-2.2.1
    • item-2.3
      • item-2.3.1" + "
  • item-3
"; + cursor.insertHtml(listHtml); + + QTest::newRow("nested-lists-one") << QTextDocumentFragment(&doc) + << QString("
  • " + "item-1
  • \n
  • item-2\n
    • item-2.1
    • \n
    • item-2.2\n
      • item-2.2.1
    • \n" + "
    • item-2.3\n
      • " + "item-2.3.1
  • \n
  • item-3
"); + } + { + CREATE_DOC_AND_CURSOR(); + const QString listHtml = "
  • item-1
  • item-2
    • item-2.1
"; + cursor.insertHtml(listHtml); + + QTest::newRow("nested-lists-two") << QTextDocumentFragment(&doc) + << QString("
  • " + "item-1
  • \n
  • item-2\n
    • item-2.1
"); + } + { + CREATE_DOC_AND_CURSOR(); + const QString listHtml = "
  • item-1
  • item-2
    • item-2.1
    • item-2.2" + "
"; + cursor.insertHtml(listHtml); + + QTest::newRow("nested-lists-three") << QTextDocumentFragment(&doc) + << QString("
  • " + "item-1
  • \n
  • item-2\n
    • item-2.1
    • \n
    • item-2.2
    " + "
"); + } + { + CREATE_DOC_AND_CURSOR(); + const QString listHtml = "
  • item-1.1
  • item-1.2
" + "
  • item-2.1
"; + cursor.insertHtml(listHtml); + + QTest::newRow("not-nested-list") << QTextDocumentFragment(&doc) + << QString("
  • " + "item-1.1
  • \n
  • item-1.2
\n
    " + "
  • item-2.1
"); + } } void tst_QTextDocument::toHtml() @@ -1786,6 +1842,11 @@ void tst_QTextDocument::toHtml() expectedOutput.replace("OPENDEFAULTBLOCKSTYLE", "style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"); expectedOutput.replace("DEFAULTBLOCKSTYLE", "style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\""); expectedOutput.replace("EMPTYBLOCK", "


\n"); + expectedOutput.replace("DEFAULTULSTYLE", "style=\"margin-top: 0px; margin-bottom: 0px; " + "margin-left: 0px; margin-right: 0px; -qt-list-indent:"); + expectedOutput.replace("DEFAULTLASTLISTYLE", "style=\" margin-top:0px; margin-bottom:12px; " + "margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\""); + if (expectedOutput.endsWith(QLatin1Char('\n'))) expectedOutput.chop(1); expectedOutput.append(htmlTail); @@ -3658,5 +3719,62 @@ void tst_QTextDocument::clearUndoRedoStacks() } +void tst_QTextDocument::contentsChangeIndices_data() +{ + QTest::addColumn("html"); + // adding list entries change the entire block, so change position is + // not the same as the cursor position if this value is >= 0 + QTest::addColumn("expectedBegin"); + + QTest::addRow("text") << "Test" << -1; + QTest::addRow("unnumbered list") << "
  • Test
" << 0; + QTest::addRow("numbered list") << "
  1. Test
" << 0; + QTest::addRow("table") << "
Test
" << -1; +} + +void tst_QTextDocument::contentsChangeIndices() +{ + QFETCH(QString, html); + QFETCH(int, expectedBegin); + + QTextDocument doc; + QTestDocumentLayout *layout = new QTestDocumentLayout(&doc); + doc.setDocumentLayout(layout); + doc.setHtml(QString("%1").arg(html)); + + int documentLength = 0; + int cursorLength = 0; + int changeBegin = 0; + int changeRemoved = 0; + int changeAdded = 0; + connect(&doc, &QTextDocument::contentsChange, this, [&](int pos, int removed, int added){ + documentLength = doc.characterCount(); + + QTextCursor cursor(&doc); + cursor.movePosition(QTextCursor::End); + // includes end-of-paragraph character + cursorLength = cursor.position() + 1; + + changeBegin = pos; + changeRemoved = removed; + changeAdded = added; + }); + + QTextCursor cursor(&doc); + cursor.movePosition(QTextCursor::End); + if (expectedBegin < 0) + expectedBegin = cursor.position(); + cursor.insertBlock(); + + const int changeEnd = changeBegin + changeAdded; + + QVERIFY(documentLength > 0); + QCOMPARE(documentLength, cursorLength); + QVERIFY(documentLength >= changeEnd); + QCOMPARE(changeBegin, expectedBegin); + QCOMPARE(changeAdded - changeRemoved, 1); +} + + QTEST_MAIN(tst_QTextDocument) #include "tst_qtextdocument.moc" diff --git a/tests/auto/gui/text/qtextlayout/BLACKLIST b/tests/auto/gui/text/qtextlayout/BLACKLIST new file mode 100644 index 00000000..c05b0de4 --- /dev/null +++ b/tests/auto/gui/text/qtextlayout/BLACKLIST @@ -0,0 +1,3 @@ +[softHyphens] +winrt + diff --git a/tests/auto/gui/text/qtextlayout/tst_qtextlayout.cpp b/tests/auto/gui/text/qtextlayout/tst_qtextlayout.cpp index c1dd2d97..f3bb5eaf 100644 --- a/tests/auto/gui/text/qtextlayout/tst_qtextlayout.cpp +++ b/tests/auto/gui/text/qtextlayout/tst_qtextlayout.cpp @@ -141,6 +141,7 @@ private slots: void showLineAndParagraphSeparatorsCrash(); void koreanWordWrap(); void tooManyDirectionalCharctersCrash_qtbug77819(); + void softHyphens_data(); void softHyphens(); void min_maximumWidth(); @@ -1909,6 +1910,20 @@ void tst_QTextLayout::longText() QFontMetricsF fm(layout.font()); QVERIFY(layout.maximumWidth() - fm.horizontalAdvance(' ') <= QFIXED_MAX); } + + { + QTextLayout layout(QString("AAAAAAAA").repeated(200000)); + layout.setCacheEnabled(true); + layout.beginLayout(); + forever { + QTextLine line = layout.createLine(); + if (!line.isValid()) + break; + } + layout.endLayout(); + QFontMetricsF fm(layout.font()); + QVERIFY(layout.maximumWidth() - fm.horizontalAdvance('A') <= QFIXED_MAX); + } } void tst_QTextLayout::widthOfTabs() @@ -2415,22 +2430,45 @@ void tst_QTextLayout::tooManyDirectionalCharctersCrash_qtbug77819() tl.endLayout(); } +void tst_QTextLayout::softHyphens_data() +{ + QTest::addColumn("fontSize"); + + QTest::newRow("12") << 12; + QTest::newRow("14") << 14; + QTest::newRow("16") << 16; +} + void tst_QTextLayout::softHyphens() { + QFETCH(int, fontSize); QString text = QStringLiteral("xxxx\u00ad") + QStringLiteral("xxxx\u00ad"); QFont font; - font.setPixelSize(14); + font.setPixelSize(fontSize); font.setHintingPreference(QFont::PreferNoHinting); - const float xAdvance = QFontMetricsF(font).horizontalAdvance(QChar('x')); - const float shyAdvance = QFontMetricsF(font).horizontalAdvance(QChar::SoftHyphen); - if (xAdvance < (shyAdvance + 1.0f)) - QSKIP("Default font not suitable for this test."); + const float xAdvance = QFontMetricsF(font).horizontalAdvance(QChar::fromLatin1('x')); + float shyWidth = 0.0f; QTextLayout layout(text, font); QTextOption option; option.setWrapMode(QTextOption::WrapAtWordBoundaryOrAnywhere); layout.setTextOption(option); - + { + // Calculate the effective width of a line-ending hyphen + // This calculation is currently done to work-around odditities on + // macOS 11 (see QTBUG-90698). + QTextLayout test(QStringLiteral("x\u00ad"), font); + // Note: This only works because Qt show the soft-hyphen when ending a text. + // This _could_ be considered a bug and the test would need to be changed + // if we stop doing that. + test.beginLayout(); + QTextLine line = test.createLine(); + line.setLineWidth(10 * xAdvance); + line.setPosition(QPoint(0, 0)); + shyWidth = line.naturalTextWidth() - xAdvance; + test.endLayout(); + } + qreal linefit; // Loose fit // xxxx- | // xxxx- | @@ -2439,21 +2477,22 @@ void tst_QTextLayout::softHyphens() int y = 0; layout.beginLayout(); QTextLine line = layout.createLine(); - line.setLineWidth(qCeil(5 * xAdvance) + 1); + line.setLineWidth(qCeil(5 * xAdvance + shyWidth) + 1); line.setPosition(QPoint(0, y)); QCOMPARE(line.textStart(), pos); QCOMPARE(line.textLength(), 5); - QVERIFY(qAbs(line.naturalTextWidth() - (4 * xAdvance + shyAdvance)) <= 1); + linefit = line.naturalTextWidth(); + QVERIFY(qAbs(linefit - qCeil(4 * xAdvance + shyWidth)) <= 1.0); pos += line.textLength(); y += qRound(line.ascent() + line.descent()); line = layout.createLine(); - line.setLineWidth(qCeil(5 * xAdvance) + 1); + line.setLineWidth(qCeil(5 * xAdvance + shyWidth) + 1); line.setPosition(QPoint(0, y)); QCOMPARE(line.textStart(), pos); QCOMPARE(line.textLength(), 5); - QVERIFY(qAbs(line.naturalTextWidth() - (4 * xAdvance + shyAdvance)) <= 1); + QVERIFY(qAbs(line.naturalTextWidth() - linefit) <= 1.0); layout.endLayout(); } @@ -2465,21 +2504,21 @@ void tst_QTextLayout::softHyphens() int y = 0; layout.beginLayout(); QTextLine line = layout.createLine(); - line.setLineWidth(qCeil(4 * xAdvance + shyAdvance) + 1); + line.setLineWidth(qCeil(linefit) + 1); line.setPosition(QPoint(0, y)); QCOMPARE(line.textStart(), pos); QCOMPARE(line.textLength(), 5); - QVERIFY(qAbs(line.naturalTextWidth() - (4 * xAdvance + shyAdvance)) <= 1); + QVERIFY(qAbs(line.naturalTextWidth() - linefit) <= 1.0); pos += line.textLength(); y += qRound(line.ascent() + line.descent()); line = layout.createLine(); - line.setLineWidth(qCeil(4 * xAdvance + shyAdvance) + 1); + line.setLineWidth(qCeil(linefit) + 1); line.setPosition(QPoint(0, y)); QCOMPARE(line.textStart(), pos); QCOMPARE(line.textLength(), 5); - QVERIFY(qAbs(line.naturalTextWidth() - (4 * xAdvance + shyAdvance)) <= 1); + QVERIFY(qAbs(line.naturalTextWidth() - linefit) <= 1.0); layout.endLayout(); } @@ -2496,7 +2535,7 @@ void tst_QTextLayout::softHyphens() line.setPosition(QPoint(0, y)); QCOMPARE(line.textStart(), pos); QCOMPARE(line.textLength(), 4); - QVERIFY(qAbs(line.naturalTextWidth() - 4 * xAdvance) <= 1); + QVERIFY(qAbs(line.naturalTextWidth() - qCeil(4 * xAdvance)) <= 1.0); pos += line.textLength(); y += qRound(line.ascent() + line.descent()); @@ -2506,7 +2545,7 @@ void tst_QTextLayout::softHyphens() line.setPosition(QPoint(0, y)); QCOMPARE(line.textStart(), pos); QCOMPARE(line.textLength(), 5); - QVERIFY(qAbs(line.naturalTextWidth() - 4 * xAdvance) <= 1); + QVERIFY(qAbs(line.naturalTextWidth() - qCeil(4 * xAdvance)) <= 1.0); pos += line.textLength(); y += qRound(line.ascent() + line.descent()); @@ -2516,7 +2555,7 @@ void tst_QTextLayout::softHyphens() line.setPosition(QPoint(0, y)); QCOMPARE(line.textStart(), pos); QCOMPARE(line.textLength(), 1); - QVERIFY(qAbs(line.naturalTextWidth() - shyAdvance) <= 1); + QVERIFY(qAbs(line.naturalTextWidth() - shyWidth) <= 1.0); layout.endLayout(); } } diff --git a/tests/auto/gui/text/qtexttable/tst_qtexttable.cpp b/tests/auto/gui/text/qtexttable/tst_qtexttable.cpp index 47407903..7d492120 100644 --- a/tests/auto/gui/text/qtexttable/tst_qtexttable.cpp +++ b/tests/auto/gui/text/qtexttable/tst_qtexttable.cpp @@ -29,7 +29,7 @@ #include - +#include #include #include #include @@ -44,6 +44,7 @@ #include #include #endif +#include #include typedef QList IntList; @@ -100,6 +101,13 @@ private slots: void checkBorderAttributes_data(); void checkBorderAttributes(); +#ifndef QT_NO_WIDGETS + void columnWidthWithSpans(); + + void columnWidthWithImage_data(); + void columnWidthWithImage(); +#endif + private: QTextTable *create2x2Table(); QTextTable *create4x4Table(); @@ -1278,5 +1286,84 @@ void tst_QTextTable::checkBorderAttributes() } } +#ifndef QT_NO_WIDGETS +void tst_QTextTable::columnWidthWithSpans() +{ + cleanup(); + init(); + QTextTable *table = cursor.insertTable(4, 4); + QTextEdit textEdit; + textEdit.setDocument(doc); + textEdit.show(); + QVERIFY(QTest::qWaitForWindowExposed(&textEdit)); + + for (int i = 0; i < table->columns(); ++i) + table->cellAt(0, i).firstCursorPosition().insertText(QString("Header %1").arg(i)); + + QTextBlock block = table->cellAt(0, 0).firstCursorPosition().block(); + const QRectF beforeRect = table->document()->documentLayout()->blockBoundingRect(block); + table->mergeCells(1, 0, 1, table->columns()); + block = table->cellAt(0, 0).firstCursorPosition().block(); + const QRectF afterRect = table->document()->documentLayout()->blockBoundingRect(block); + QCOMPARE(afterRect, beforeRect); +} + +void tst_QTextTable::columnWidthWithImage_data() +{ + const auto imageHtml = [](int width, int height) { + QImage image(width, height, QImage::Format_RGB32); + image.fill(Qt::red); + QByteArray imageBytes; + QBuffer buffer(&imageBytes); + buffer.open(QIODevice::WriteOnly); + image.save(&buffer, "png"); + return QString("") + .arg(QString::fromLatin1(imageBytes.toBase64())); + }; + + QTest::addColumn("leftHtml"); + QTest::addColumn("rightHtml"); + QTest::addColumn("imageSize"); + QTest::addRow("image") + << imageHtml(500, 32) << "" << QSize(500, 32); + QTest::addRow("image, text") + << imageHtml(32, 32) << "abc" << QSize(32, 32); + QTest::addRow("image, 100%% text") + << imageHtml(32, 32) << "abc" + << QSize(32, 32); + QTest::addRow("image, image") + << imageHtml(256, 32) << imageHtml(256, 32) << QSize(256, 32); +} + +void tst_QTextTable::columnWidthWithImage() +{ + const QString tableTemplate = "%1 %2
"; + + QFETCH(QString, leftHtml); + QFETCH(QString, rightHtml); + QFETCH(QSize, imageSize); + + QTextDocument doc; + doc.setHtml(tableTemplate.arg(leftHtml).arg(rightHtml)); + QTextEdit textEdit; + textEdit.setDocument(&doc); + textEdit.show(); + QVERIFY(QTest::qWaitForWindowExposed(&textEdit)); + + QTextCursor cursor(doc.firstBlock()); + cursor.movePosition(QTextCursor::Right); + + QTextTable *currentTable = cursor.currentTable(); + QVERIFY(currentTable); + + QTextBlock block = currentTable->cellAt(0, 0).firstCursorPosition().block(); + const QRectF leftRect = currentTable->document()->documentLayout()->blockBoundingRect(block); + block = currentTable->cellAt(0, 1).firstCursorPosition().block(); + const QRectF rightRect = currentTable->document()->documentLayout()->blockBoundingRect(block); + QCOMPARE(leftRect.size().toSize(), imageSize); + QVERIFY(rightRect.left() > leftRect.right()); +} +#endif + QTEST_MAIN(tst_QTextTable) #include "tst_qtexttable.moc" diff --git a/tests/auto/network/access/http2/http2srv.cpp b/tests/auto/network/access/http2/http2srv.cpp index a8eebf5a..e2f039e2 100644 --- a/tests/auto/network/access/http2/http2srv.cpp +++ b/tests/auto/network/access/http2/http2srv.cpp @@ -120,6 +120,11 @@ void Http2Server::setResponseBody(const QByteArray &body) responseBody = body; } +void Http2Server::setAuthenticationHeader(const QByteArray &authentication) +{ + authenticationHeader = authentication; +} + void Http2Server::emulateGOAWAY(int timeout) { Q_ASSERT(timeout >= 0); @@ -138,6 +143,17 @@ bool Http2Server::isClearText() const return connectionType == H2Type::h2c || connectionType == H2Type::h2cDirect; } +QByteArray Http2Server::requestAuthorizationHeader() +{ + const auto isAuthHeader = [](const HeaderField &field) { + return field.name == "authorization"; + }; + const auto requestHeaders = decoder.decodedHeader(); + const auto authentication = + std::find_if(requestHeaders.cbegin(), requestHeaders.cend(), isAuthHeader); + return authentication == requestHeaders.cend() ? QByteArray() : authentication->value; +} + void Http2Server::startServer() { if (listen()) { @@ -732,10 +748,15 @@ void Http2Server::handleDATA() } if (inboundFrame.flags().testFlag(FrameFlag::END_STREAM)) { - closedStreams.insert(streamID); // Enter "half-closed remote" state. - streamWindows.erase(it); + if (responseBody.isEmpty()) { + closedStreams.insert(streamID); // Enter "half-closed remote" state. + streamWindows.erase(it); + } emit receivedData(streamID); } + emit receivedDATAFrame(streamID, + QByteArray(reinterpret_cast(inboundFrame.dataBegin()), + inboundFrame.dataSize())); } void Http2Server::handleWINDOW_UPDATE() @@ -816,6 +837,9 @@ void Http2Server::sendResponse(quint32 streamID, bool emptyBody) if (emptyBody) writer.addFlag(FrameFlag::END_STREAM); + // We assume any auth is correct. Leaves the checking to the test itself + const bool hasAuth = !requestAuthorizationHeader().isEmpty(); + HttpHeader header; if (redirectWhileReading) { if (redirectSent) { @@ -832,6 +856,10 @@ void Http2Server::sendResponse(quint32 streamID, bool emptyBody) header.push_back({"location", url.arg(isClearText() ? QStringLiteral("http") : QStringLiteral("https"), QString::number(targetPort)).toLatin1()}); + } else if (!authenticationHeader.isEmpty() && !hasAuth) { + header.push_back({ ":status", "401" }); + header.push_back(HPack::HeaderField("www-authenticate", authenticationHeader)); + authenticationHeader.clear(); } else { header.push_back({":status", "200"}); } diff --git a/tests/auto/network/access/http2/http2srv.h b/tests/auto/network/access/http2/http2srv.h index 3105684d..013af86c 100644 --- a/tests/auto/network/access/http2/http2srv.h +++ b/tests/auto/network/access/http2/http2srv.h @@ -86,11 +86,15 @@ public: // To be called before server started: void enablePushPromise(bool enabled, const QByteArray &path = QByteArray()); void setResponseBody(const QByteArray &body); + // No authentication data is generated for the method, the full header value must be set + void setAuthenticationHeader(const QByteArray &authentication); void emulateGOAWAY(int timeout); void redirectOpenStream(quint16 targetPort); bool isClearText() const; + QByteArray requestAuthorizationHeader(); + // Invokables, since we can call them from the main thread, // but server (can) work on its own thread. Q_INVOKABLE void startServer(); @@ -127,6 +131,8 @@ Q_SIGNALS: void decompressionFailed(quint32 streamID); void receivedRequest(quint32 streamID); void receivedData(quint32 streamID); + // Emitted for every DATA frame. Includes the content of the frame as \a body. + void receivedDATAFrame(quint32 streamID, const QByteArray &body); void windowUpdate(quint32 streamID); void sendingData(); @@ -211,6 +217,8 @@ private: bool redirectSent = false; quint16 targetPort = 0; QAtomicInt interrupted; + + QByteArray authenticationHeader; protected slots: void ignoreErrorSlot(); }; diff --git a/tests/auto/network/access/http2/tst_http2.cpp b/tests/auto/network/access/http2/tst_http2.cpp index 6702f25b..0610d0a3 100644 --- a/tests/auto/network/access/http2/tst_http2.cpp +++ b/tests/auto/network/access/http2/tst_http2.cpp @@ -110,6 +110,10 @@ private slots: void connectToHost_data(); void connectToHost(); void maxFrameSize(); + void http2DATAFrames(); + + void authenticationRequired_data(); + void authenticationRequired(); protected slots: // Slots to listen to our in-process server: @@ -154,6 +158,7 @@ private: int windowUpdates = 0; bool prefaceOK = false; bool serverGotSettingsACK = false; + bool POSTResponseHEADOnly = true; static const RawSettings defaultServerSettings; }; @@ -267,6 +272,10 @@ void tst_Http2::singleRequest() request.setAttribute(h2Attribute, QVariant(true)); auto reply = manager->get(request); +#if QT_CONFIG(ssl) + QSignalSpy encSpy(reply, &QNetworkReply::encrypted); +#endif // QT_CONFIG(ssl) + connect(reply, &QNetworkReply::finished, this, &tst_Http2::replyFinished); // Since we're using self-signed certificates, // ignore SSL errors: @@ -281,6 +290,11 @@ void tst_Http2::singleRequest() QCOMPARE(reply->error(), QNetworkReply::NoError); QVERIFY(reply->isFinished()); + +#if QT_CONFIG(ssl) + if (connectionType == H2Type::h2Alpn || connectionType == H2Type::h2Direct) + QCOMPARE(encSpy.count(), 1); +#endif // QT_CONFIG(ssl) } void tst_Http2::multipleRequests() @@ -767,6 +781,180 @@ void tst_Http2::maxFrameSize() QVERIFY(serverGotSettingsACK); } +void tst_Http2::http2DATAFrames() +{ + using namespace Http2; + + { + // 0. DATA frame with payload, no padding. + + FrameWriter writer(FrameType::DATA, FrameFlag::EMPTY, 1); + writer.append(uchar(1)); + writer.append(uchar(2)); + writer.append(uchar(3)); + + const Frame frame = writer.outboundFrame(); + const auto &buffer = frame.buffer; + // Frame's header is 9 bytes + 3 bytes of payload + // (+ 0 bytes of padding and no padding length): + QCOMPARE(int(buffer.size()), 12); + + QVERIFY(!frame.padding()); + QCOMPARE(int(frame.payloadSize()), 3); + QCOMPARE(int(frame.dataSize()), 3); + QCOMPARE(frame.dataBegin() - buffer.data(), 9); + QCOMPARE(char(*frame.dataBegin()), uchar(1)); + } + + { + // 1. DATA with padding. + + const int padLength = 10; + FrameWriter writer(FrameType::DATA, FrameFlag::END_STREAM | FrameFlag::PADDED, 1); + writer.append(uchar(padLength)); // The length of padding is 1 byte long. + writer.append(uchar(1)); + for (int i = 0; i < padLength; ++i) + writer.append(uchar(0)); + + const Frame frame = writer.outboundFrame(); + const auto &buffer = frame.buffer; + // Frame's header is 9 bytes + 1 byte for padding length + // + 1 byte of data + 10 bytes of padding: + QCOMPARE(int(buffer.size()), 21); + + QCOMPARE(frame.padding(), padLength); + QCOMPARE(int(frame.payloadSize()), 12); // Includes padding, its length + data. + QCOMPARE(int(frame.dataSize()), 1); + + // Skipping 9 bytes long header and padding length: + QCOMPARE(frame.dataBegin() - buffer.data(), 10); + + QCOMPARE(char(frame.dataBegin()[0]), uchar(1)); + QCOMPARE(char(frame.dataBegin()[1]), uchar(0)); + + QVERIFY(frame.flags().testFlag(FrameFlag::END_STREAM)); + QVERIFY(frame.flags().testFlag(FrameFlag::PADDED)); + } + { + // 2. DATA with PADDED flag, but 0 as padding length. + + FrameWriter writer(FrameType::DATA, FrameFlag::END_STREAM | FrameFlag::PADDED, 1); + + writer.append(uchar(0)); // Number of padding bytes is 1 byte long. + writer.append(uchar(1)); + + const Frame frame = writer.outboundFrame(); + const auto &buffer = frame.buffer; + + // Frame's header is 9 bytes + 1 byte for padding length + 1 byte of data + // + 0 bytes of padding: + QCOMPARE(int(buffer.size()), 11); + + QCOMPARE(frame.padding(), 0); + QCOMPARE(int(frame.payloadSize()), 2); // Includes padding (0 bytes), its length + data. + QCOMPARE(int(frame.dataSize()), 1); + + // Skipping 9 bytes long header and padding length: + QCOMPARE(frame.dataBegin() - buffer.data(), 10); + + QCOMPARE(char(*frame.dataBegin()), uchar(1)); + + QVERIFY(frame.flags().testFlag(FrameFlag::END_STREAM)); + QVERIFY(frame.flags().testFlag(FrameFlag::PADDED)); + } +} + +void tst_Http2::authenticationRequired_data() +{ + QTest::addColumn("success"); + QTest::addColumn("responseHEADOnly"); + + QTest::addRow("failed-auth") << false << true; + QTest::addRow("successful-auth") << true << true; + // Include a DATA frame in the response from the remote server. An example would be receiving a + // JSON response on a request along with the 401 error. + QTest::addRow("failed-auth-with-response") << false << false; + QTest::addRow("successful-auth-with-response") << true << false; +} + +void tst_Http2::authenticationRequired() +{ + clearHTTP2State(); + serverPort = 0; + QFETCH(const bool, responseHEADOnly); + POSTResponseHEADOnly = responseHEADOnly; + + QFETCH(const bool, success); + + ServerPtr targetServer(newServer(defaultServerSettings, defaultConnectionType())); + targetServer->setResponseBody("Hello"); + targetServer->setAuthenticationHeader("Basic realm=\"Shadow\""); + + QMetaObject::invokeMethod(targetServer.data(), "startServer", Qt::QueuedConnection); + runEventLoop(); + + QVERIFY(serverPort != 0); + + nRequests = 1; + + auto url = requestUrl(defaultConnectionType()); + url.setPath("/index.html"); + QNetworkRequest request(url); + + QByteArray expectedBody = "Hello, World!"; + request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded"); + request.setAttribute(QNetworkRequest::Http2AllowedAttribute, QVariant(true)); + QScopedPointer reply; + reply.reset(manager->post(request, expectedBody)); + + bool authenticationRequested = false; + connect(manager.get(), &QNetworkAccessManager::authenticationRequired, reply.get(), + [&](QNetworkReply *, QAuthenticator *auth) { + authenticationRequested = true; + if (success) { + auth->setUser("admin"); + auth->setPassword("admin"); + } + }); + + QByteArray receivedBody; + connect(targetServer.get(), &Http2Server::receivedDATAFrame, reply.get(), + [&receivedBody](quint32 streamID, const QByteArray &body) { + if (streamID == 3) // The expected body is on the retry, so streamID == 3 + receivedBody += body; + }); + + if (success) + connect(reply.get(), &QNetworkReply::finished, this, &tst_Http2::replyFinished); + else + connect(reply.get(), &QNetworkReply::errorOccurred, this, &tst_Http2::replyFinishedWithError); + // Since we're using self-signed certificates, + // ignore SSL errors: + reply->ignoreSslErrors(); + + runEventLoop(); + STOP_ON_FAILURE + + if (!success) + QCOMPARE(reply->error(), QNetworkReply::AuthenticationRequiredError); + // else: no error (is checked in tst_Http2::replyFinished) + + QVERIFY(authenticationRequested); + + const auto isAuthenticated = [](QByteArray bv) { + return bv == "Basic YWRtaW46YWRtaW4="; // admin:admin + }; + // Get the "authorization" header out from the server and make sure it's as expected: + auto reqAuthHeader = targetServer->requestAuthorizationHeader(); + QCOMPARE(isAuthenticated(reqAuthHeader), success); + if (success) + QCOMPARE(receivedBody, expectedBody); + // In the `!success` case we need to wait for the server to emit this or it might cause issues + // in the next test running after this. In the `success` case we anyway expect it to have been + // received. + QTRY_VERIFY(serverGotSettingsACK); +} + void tst_Http2::serverStarted(quint16 port) { serverPort = port; @@ -778,6 +966,7 @@ void tst_Http2::clearHTTP2State() windowUpdates = 0; prefaceOK = false; serverGotSettingsACK = false; + POSTResponseHEADOnly = true; } void tst_Http2::runEventLoop(int ms) @@ -910,7 +1099,7 @@ void tst_Http2::receivedData(quint32 streamID) Q_ASSERT(srv); QMetaObject::invokeMethod(srv, "sendResponse", Qt::QueuedConnection, Q_ARG(quint32, streamID), - Q_ARG(bool, true /*HEADERS only*/)); + Q_ARG(bool, POSTResponseHEADOnly /*true = HEADERS only*/)); } void tst_Http2::windowUpdated(quint32 streamID) diff --git a/tests/auto/network/access/qdecompresshelper/BLACKLIST b/tests/auto/network/access/qdecompresshelper/BLACKLIST new file mode 100644 index 00000000..d189fd9e --- /dev/null +++ b/tests/auto/network/access/qdecompresshelper/BLACKLIST @@ -0,0 +1,2 @@ +[bigZlib] +macos arm diff --git a/tests/auto/network/access/qnetworkdiskcache/tst_qnetworkdiskcache.cpp b/tests/auto/network/access/qnetworkdiskcache/tst_qnetworkdiskcache.cpp index 856033fb..98b2a0d2 100644 --- a/tests/auto/network/access/qnetworkdiskcache/tst_qnetworkdiskcache.cpp +++ b/tests/auto/network/access/qnetworkdiskcache/tst_qnetworkdiskcache.cpp @@ -35,6 +35,7 @@ #include #define EXAMPLE_URL "http://user:pass@localhost:4/#foo" +#define EXAMPLE_URL2 "http://user:pass@localhost:4/bar" //cached objects are organized into these many subdirs #define NUM_SUBDIRECTORIES 16 @@ -141,7 +142,7 @@ class SubQNetworkDiskCache : public QNetworkDiskCache public: ~SubQNetworkDiskCache() { - if (!cacheDirectory().isEmpty()) + if (!cacheDirectory().isEmpty() && clearOnDestruction) clear(); } @@ -170,6 +171,11 @@ public: d->write("Hello World!"); insert(d); } + + void setClearCacheOnDestruction(bool value) { clearOnDestruction = value; } + +private: + bool clearOnDestruction = true; }; tst_QNetworkDiskCache::tst_QNetworkDiskCache() @@ -241,17 +247,39 @@ void tst_QNetworkDiskCache::prepare() // public qint64 cacheSize() const void tst_QNetworkDiskCache::cacheSize() { + qint64 cacheSize = 0; + { + SubQNetworkDiskCache cache; + cache.setCacheDirectory(tempDir.path()); + QCOMPARE(cache.cacheSize(), qint64(0)); + + { + QUrl url(EXAMPLE_URL); + QNetworkCacheMetaData metaData; + metaData.setUrl(url); + QIODevice *d = cache.prepare(metaData); + cache.insert(d); + cacheSize = cache.cacheSize(); + QVERIFY(cacheSize > qint64(0)); + } + // Add a second item, some difference in behavior when the cache is not empty + { + QUrl url(EXAMPLE_URL2); + QNetworkCacheMetaData metaData; + metaData.setUrl(url); + QIODevice *d = cache.prepare(metaData); + cache.insert(d); + QVERIFY(cache.cacheSize() > cacheSize); + cacheSize = cache.cacheSize(); + } + + // Don't clear the cache on destruction so we can re-open the cache and test its size. + cache.setClearCacheOnDestruction(false); + } + SubQNetworkDiskCache cache; cache.setCacheDirectory(tempDir.path()); - QCOMPARE(cache.cacheSize(), qint64(0)); - - QUrl url(EXAMPLE_URL); - QNetworkCacheMetaData metaData; - metaData.setUrl(url); - QIODevice *d = cache.prepare(metaData); - cache.insert(d); - QVERIFY(cache.cacheSize() > qint64(0)); - + QCOMPARE(cache.cacheSize(), cacheSize); cache.clear(); QCOMPARE(cache.cacheSize(), qint64(0)); } diff --git a/tests/auto/network/access/qnetworkreply/BLACKLIST b/tests/auto/network/access/qnetworkreply/BLACKLIST index 2bc1c85c..52857010 100644 --- a/tests/auto/network/access/qnetworkreply/BLACKLIST +++ b/tests/auto/network/access/qnetworkreply/BLACKLIST @@ -32,13 +32,14 @@ windows-10 # QTBUG-66247 b2qt windows-10 msvc-2015 -ubuntu -rhel +linux [ioHttpRedirectPolicy] opensuse-leap b2qt ubuntu windows-10 +sles-15 +opensuse-15.1 [putToFtp] windows-10 [putWithServerClosingConnectionImmediately] diff --git a/tests/auto/network/access/qnetworkreply/certs/qt-test-server-cacert.pem b/tests/auto/network/access/qnetworkreply/certs/qt-test-server-cacert.pem index c5aea0d7..29fd755d 100644 --- a/tests/auto/network/access/qnetworkreply/certs/qt-test-server-cacert.pem +++ b/tests/auto/network/access/qnetworkreply/certs/qt-test-server-cacert.pem @@ -1,17 +1,17 @@ -----BEGIN CERTIFICATE----- -MIICpzCCAhACCQCzAF1hyRVzAjANBgkqhkiG9w0BAQUFADCBlzELMAkGA1UEBhMC -Tk8xDTALBgNVBAgTBE9zbG8xDTALBgNVBAcTBE9zbG8xDjAMBgNVBAoTBU5va2lh -MTUwMwYDVQQLFCxRdCBTb2Z0d2FyZS9lbWFpbEFkZHJlc3M9bm9ib2R5QG5vZG9t -YWluLm9yZzEjMCEGA1UEAxMacXQtdGVzdC1zZXJ2ZXIucXQtdGVzdC1uZXQwHhcN -MTkwNjI0MTI0OTIxWhcNMjIwNjIzMTI0OTIxWjCBlzELMAkGA1UEBhMCTk8xDTAL -BgNVBAgTBE9zbG8xDTALBgNVBAcTBE9zbG8xDjAMBgNVBAoTBU5va2lhMTUwMwYD -VQQLFCxRdCBTb2Z0d2FyZS9lbWFpbEFkZHJlc3M9bm9ib2R5QG5vZG9tYWluLm9y -ZzEjMCEGA1UEAxMacXQtdGVzdC1zZXJ2ZXIucXQtdGVzdC1uZXQwgZ8wDQYJKoZI -hvcNAQEBBQADgY0AMIGJAoGBAM2q22/WNMmn8cC+5EEYGeICySLmp9W6Ay6eKHr0 -Xxp3X3epETuPfvAuxp7rOtkS18EMUegkUj8jw0IMEcbyHKFC/rTCaYOt93CxGBXM -IChiMPAsFeYzGa/D6xzAkfcRaJRQ+Ek3CDLXPnXfo7xpABXezYcPXAJrgsgBfWrw -HdxzAgMBAAEwDQYJKoZIhvcNAQEFBQADgYEASCKbqEX5ysC549mq90ydk4jyDW3m -PUyet01fKpcRqVs+OJxdExFBTra3gho6WzzpTSPsuX2ZKOLF5k6KkCvdCGvhC1Kv -HHPIExurfzvdlSRzj6HbKyPuSfxyOloH0bBp7/Gg5RIuBPKlbmfbnTLtwEjhhbMU -SoYI8HZd3HfY87c= +MIICyjCCAjMCFHPGDqJR+klHni4XbETMk6GLn/UEMA0GCSqGSIb3DQEBDQUAMIGj +MRcwFQYDVQQKEw5UaGUgUXQgQ29tcGFueTEUMBIGA1UECxMLUXQgU29mdHdhcmUx +IjAgBgkqhkiG9w0BCQEWE25vYm9keUBub2RvbWFpbi5vcmcxDTALBgNVBAcTBE9z +bG8xDTALBgNVBAgTBE9zbG8xCzAJBgNVBAYTAk5PMSMwIQYDVQQDExpxdC10ZXN0 +LXNlcnZlci5xdC10ZXN0LW5ldDAeFw0yMjA2MjQxMTU4NDlaFw0zMjA2MjExMTU4 +NDlaMIGjMRcwFQYDVQQKEw5UaGUgUXQgQ29tcGFueTEUMBIGA1UECxMLUXQgU29m +dHdhcmUxIjAgBgkqhkiG9w0BCQEWE25vYm9keUBub2RvbWFpbi5vcmcxDTALBgNV +BAcTBE9zbG8xDTALBgNVBAgTBE9zbG8xCzAJBgNVBAYTAk5PMSMwIQYDVQQDExpx +dC10ZXN0LXNlcnZlci5xdC10ZXN0LW5ldDCBnzANBgkqhkiG9w0BAQEFAAOBjQAw +gYkCgYEAzarbb9Y0yafxwL7kQRgZ4gLJIuan1boDLp4oevRfGndfd6kRO49+8C7G +nus62RLXwQxR6CRSPyPDQgwRxvIcoUL+tMJpg633cLEYFcwgKGIw8CwV5jMZr8Pr +HMCR9xFolFD4STcIMtc+dd+jvGkAFd7Nhw9cAmuCyAF9avAd3HMCAwEAATANBgkq +hkiG9w0BAQ0FAAOBgQCZyRe25WqOjrNS6BKPs7ep7eyCON3NKdWnfABZrSjGJQ87 +PoFKl6+9YBSlSpl8qk7c29ic+wA4qFQzPJkrbYIXjwVMAr+cC1kVrlUVqcwmvnKo +5vj57/v8S0Uc4/GesIsxZR7QM+3diPDyk7Bsc3IkpINb31Dl0mlg25nztg8NxA== -----END CERTIFICATE----- diff --git a/tests/auto/network/kernel/qauthenticator/tst_qauthenticator.cpp b/tests/auto/network/kernel/qauthenticator/tst_qauthenticator.cpp index cec05f88..6ae53e2c 100644 --- a/tests/auto/network/kernel/qauthenticator/tst_qauthenticator.cpp +++ b/tests/auto/network/kernel/qauthenticator/tst_qauthenticator.cpp @@ -48,6 +48,8 @@ private Q_SLOTS: void ntlmAuth_data(); void ntlmAuth(); + void sha256AndMd5Digest(); + void equalityOperators(); }; @@ -149,6 +151,34 @@ void tst_QAuthenticator::ntlmAuth() QVERIFY(priv->calculateResponse("GET", "/", "").startsWith("NTLM ")); } +// We don't (currently) support SHA256. So, when presented with the option of MD5 or SHA256, +// we should always pick MD5. +void tst_QAuthenticator::sha256AndMd5Digest() +{ + QByteArray md5 = "Digest realm=\"\", nonce=\"\", algorithm=MD5, qop=\"auth\""; + QByteArray sha256 = "Digest realm=\"\", nonce=\"\", algorithm=SHA-256, qop=\"auth\""; + + QAuthenticator auth; + auth.setUser("unimportant"); + auth.setPassword("unimportant"); + + QAuthenticatorPrivate *priv = QAuthenticatorPrivate::getPrivate(auth); + + QCOMPARE(priv->phase, QAuthenticatorPrivate::Start); + QList> headers; + // Put sha256 first, so that its parsed first... + headers.push_back({"WWW-Authenticate", sha256}); + headers.push_back({"WWW-Authenticate", md5}); + priv->parseHttpResponse(headers, false, QString()); + + QByteArray response = priv->calculateResponse("GET", "/index", {}); + QCOMPARE(priv->phase, QAuthenticatorPrivate::Done); + + QVERIFY(!response.isEmpty()); + QVERIFY(!response.contains("algorithm=SHA-256")); + QVERIFY(response.contains("algorithm=MD5")); +} + void tst_QAuthenticator::equalityOperators() { QAuthenticator s1, s2; diff --git a/tests/auto/network/socket/qsocks5socketengine/BLACKLIST b/tests/auto/network/socket/qsocks5socketengine/BLACKLIST index 61fff6ee..930d4b1a 100644 --- a/tests/auto/network/socket/qsocks5socketengine/BLACKLIST +++ b/tests/auto/network/socket/qsocks5socketengine/BLACKLIST @@ -9,3 +9,6 @@ ubuntu windows-10 msvc-2015 windows-7sp1 +# QTBUG-96345 +[simpleConnectToIMAP] +ubuntu diff --git a/tests/auto/network/socket/qtcpserver/BLACKLIST b/tests/auto/network/socket/qtcpserver/BLACKLIST index e268468b..c6d4d499 100644 --- a/tests/auto/network/socket/qtcpserver/BLACKLIST +++ b/tests/auto/network/socket/qtcpserver/BLACKLIST @@ -14,3 +14,6 @@ windows-10 windows-7sp1 windows-10 +[linkLocal] +macos arm + diff --git a/tests/auto/network/socket/qtcpsocket/BLACKLIST b/tests/auto/network/socket/qtcpsocket/BLACKLIST index 129e9f0b..fb57715a 100644 --- a/tests/auto/network/socket/qtcpsocket/BLACKLIST +++ b/tests/auto/network/socket/qtcpsocket/BLACKLIST @@ -2,3 +2,5 @@ windows # QTBUG-66247 +[bind] +macos arm diff --git a/tests/auto/network/socket/qudpsocket/BLACKLIST b/tests/auto/network/socket/qudpsocket/BLACKLIST index 40e06ca1..690d814a 100644 --- a/tests/auto/network/socket/qudpsocket/BLACKLIST +++ b/tests/auto/network/socket/qudpsocket/BLACKLIST @@ -7,3 +7,7 @@ opensuse-leap opensuse-42.3 [readyReadForEmptyDatagram] linux +[multicast] +macos arm +[linkLocalIPv6] +macos arm diff --git a/tests/auto/network/ssl/qdtlscookie/tst_qdtlscookie.cpp b/tests/auto/network/ssl/qdtlscookie/tst_qdtlscookie.cpp index 00e4cfbe..9dab3727 100644 --- a/tests/auto/network/ssl/qdtlscookie/tst_qdtlscookie.cpp +++ b/tests/auto/network/ssl/qdtlscookie/tst_qdtlscookie.cpp @@ -343,7 +343,7 @@ void tst_QDtlsCookie::verifyMultipleClients() clientsToAdd = clientsToWait = 100; - testLoop.enterLoop(handshakeTimeoutMS * clientsToWait); + testLoop.enterLoopMSecs(handshakeTimeoutMS * clientsToWait); QVERIFY(!testLoop.timeout()); QVERIFY(clientsToWait == 0); } diff --git a/tests/auto/network/ssl/qsslcertificate/tst_qsslcertificate.cpp b/tests/auto/network/ssl/qsslcertificate/tst_qsslcertificate.cpp index 115d1119..445e6a2d 100644 --- a/tests/auto/network/ssl/qsslcertificate/tst_qsslcertificate.cpp +++ b/tests/auto/network/ssl/qsslcertificate/tst_qsslcertificate.cpp @@ -1128,6 +1128,7 @@ void tst_QSslCertificate::verify() #if QT_CONFIG(securetransport) QSKIP("Not implemented in SecureTransport"); #endif + QList errors; QList toVerify; diff --git a/tests/auto/network/ssl/qsslcertificate/verify-certs/README b/tests/auto/network/ssl/qsslcertificate/verify-certs/README index 87cb293e..f4317331 100644 --- a/tests/auto/network/ssl/qsslcertificate/verify-certs/README +++ b/tests/auto/network/ssl/qsslcertificate/verify-certs/README @@ -1,2 +1,9 @@ openssl verify -CAfile cacert.pem -untrusted test-intermediate-ca-cert.pem test-intermediate-is-ca-cert.pem openssl verify -CAfile cacert.pem -untrusted test-ocsp-good-cert.pem test-intermediate-not-ca-cert.pem + +1. cacert.pem is, obviously, a root CA certificate. +2. test-intermediate-ca-cert.pem is a certificate, signed by the root CA, an intermediate CA. +3. test-intermediate-is-ca-cert.pem is a certificate, signed by test-intermediate-ca-cert.pem. +4. test-ocsp-good-cert.pem is signed by root CA, it has CA:FALSE but keyUsage allowing to sign + CSRs - this is how OpenSSL would report us 'invalid CA certificate' instead of 'No issuer found'. +5. test-intermediate-not-ca-cert.pem is signed by test-ocsp-good-cert.pem. diff --git a/tests/auto/network/ssl/qsslcertificate/verify-certs/cacert.pem b/tests/auto/network/ssl/qsslcertificate/verify-certs/cacert.pem index 8c75c54b..5b9b5704 100644 --- a/tests/auto/network/ssl/qsslcertificate/verify-certs/cacert.pem +++ b/tests/auto/network/ssl/qsslcertificate/verify-certs/cacert.pem @@ -1,23 +1,25 @@ -----BEGIN CERTIFICATE----- -MIID6zCCAtOgAwIBAgIJAP4bjANFSx0BMA0GCSqGSIb3DQEBBQUAMIGrMSYwJAYD -VQQDEx1XZXN0cG9pbnQgQ2VydGlmaWNhdGUgVGVzdCBDQTETMBEGA1UECBMKTGFu -Y2FzaGlyZTELMAkGA1UEBhMCVUsxHTAbBgkqhkiG9w0BCQEWDmNhQGV4YW1wbGUu -Y29tMUAwPgYDVQQKEzdXZXN0cG9pbnQgQ2VydGlmaWNhdGUgVGVzdCBSb290IENl -cnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTExMDczMTIxMDExNloXDTIxMDcyODIx -MDExNlowgasxJjAkBgNVBAMTHVdlc3Rwb2ludCBDZXJ0aWZpY2F0ZSBUZXN0IENB -MRMwEQYDVQQIEwpMYW5jYXNoaXJlMQswCQYDVQQGEwJVSzEdMBsGCSqGSIb3DQEJ -ARYOY2FAZXhhbXBsZS5jb20xQDA+BgNVBAoTN1dlc3Rwb2ludCBDZXJ0aWZpY2F0 -ZSBUZXN0IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3 -DQEBAQUAA4IBDwAwggEKAoIBAQC5xMKXviXuxFO67WzFIImO5RY3Y+dqt7maTB+p -JiHkn98rJoBB4J1cDnEUIs5ErO+kqOjW7JwF50fePNJ5K+I6SbRVn9gxAI59ZA6O -9UvOPZOw4/6GM24UY4B4mUcp8oXg9fhwgtjVhfXiMD2GvKQq3RazIiCoSW4aJWEq -L58Q+sIo+jL72qwk648xIwIhuC3XzcOOE/+rCOtZmu812/NN08UfsL2qup0aaaGv -aL36n6OIx5AYFcCD5uOxXAmUy14mhwQyDHAl6K42ghSm5b43VMMSQ+N9AQpentWl -RH6Vt1eY52YTxjNxpRlj88GBnYxdr8WgjKOV7v8OPGXP6zWlAgMBAAGjEDAOMAwG -A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADptDEfvsh8aq/tTc7ciGkHG -jh7WFELVTcdWBTyveZ24298Hl9UOfsAfLqjMGMs3delAaZocchba9Og2xSZyRstH -GUtlJXd4PnSJSx/TksPf2DCANo5sxBWBITs1Iprm3Nlm3/xPZM2QLIamRYi2J6Ed -JTfWvMpoaW1umJX49jKqk1gfdcS6eUSaXetgYP2FQV7DstqPLYfQ731nEXZ1LXFM -PO7IoPccqk4YJ0KOV7hFb7NCq4a6cz/Gf0S0qJ44vqHz6iRZpmWIo5UFivwtLw9r -iMbdJ1mCCMR0oN5om3muKc7Sz+l2ItxdYMcLkZ1/3ouvQqOX+qIOrYEUN1RZCzI= +MIIENzCCAx+gAwIBAgIUdn+WSglXIMBvW46H1+kauM81p1UwDQYJKoZIhvcNAQEL +BQAwgaIxCzAJBgNVBAYTAk5PMQ8wDQYDVQQIDAZOb3J3YXkxDTALBgNVBAcMBE9z +bG8xDTALBgNVBAoMBFRRdEMxLzAtBgNVBAsMJlRRdEMgVGVzdCBSb290IEF1dGhv +cml6YXRpb24gQXV0aG9yaXR5MRowGAYDVQQDDBFUUXRDIHRlc3Qgcm9vdCBDQTEX +MBUGCSqGSIb3DQEJARYIY2FAcXQuaW8wHhcNMjEwNzI5MTIzNDM5WhcNMzEwNzI3 +MTIzNDM5WjCBojELMAkGA1UEBhMCTk8xDzANBgNVBAgMBk5vcndheTENMAsGA1UE +BwwET3NsbzENMAsGA1UECgwEVFF0QzEvMC0GA1UECwwmVFF0QyBUZXN0IFJvb3Qg +QXV0aG9yaXphdGlvbiBBdXRob3JpdHkxGjAYBgNVBAMMEVRRdEMgdGVzdCByb290 +IENBMRcwFQYJKoZIhvcNAQkBFghjYUBxdC5pbzCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBAOXrt0DU0NCmvB/vsw3d5Ztn3Ab77AmnVSNSkWKOyei7bQ55 +Qx2FR+ihcPL3+HRQ+UAZsV/ryurkrCdFOOpkBC8a1Kq1ErXM9RbBdX9kyX7IG1KD +iwnFuci/2cDgounfxNDLPCWImukKfWGUfWlpnbbF4nYdaeP/S+LvsCklgphGdtLE +uO+bNLUNFT61X3d0eg/NQ0tMFFgjTQkKYueYpoAtS8zsHfJxLKzNVjdkUaqEsN1x +AmE6LLVhMwf7EHwlgCMb3H59R9N+kz8bjCNQrErctF0crvdZjlX9AudZGz6e6xso +Mmw6epkGSGF6eMjK62mQX4Y/15ruNIvuLla1dzcCAwEAAaNjMGEwHQYDVR0OBBYE +FFpvgro1qjV/QzO+gq/hScIGw7CpMB8GA1UdIwQYMBaAFFpvgro1qjV/QzO+gq/h +ScIGw7CpMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3 +DQEBCwUAA4IBAQC+Xbv1f2r2YBXTM7/Uc48DFjdCb4dOKOF8anIGmsG5IfcG77DW +PkyVvPVBVQYw11GtyEwdl5nYyM5VMUT2Jv0kL3sRjQASaQLQCJa3KpYKUV6/7+0W +h8oUSb6FyP8Ks/GTVgHGlSSWU6TixG2k85kKSDNinUDHqrjyS+EYXR4FZHY68lu1 +JSSDBrdEEMmBcChj7Yze9LcdcEUbsALori4363rJCsDmfE6M5nZCFGSn1oUAB8LS +XJ62DI16XbKjwSSFsvJA87n3Ujivytjgdq0e1EgpeNjFvcq5lJ83pQHK/G6+hIna +toLOSqYHUzZv5+NalkbfTUOLSuecUMDTz+KG -----END CERTIFICATE----- diff --git a/tests/auto/network/ssl/qsslcertificate/verify-certs/test-intermediate-ca-cert.pem b/tests/auto/network/ssl/qsslcertificate/verify-certs/test-intermediate-ca-cert.pem index d00490ca..4e850907 100644 --- a/tests/auto/network/ssl/qsslcertificate/verify-certs/test-intermediate-ca-cert.pem +++ b/tests/auto/network/ssl/qsslcertificate/verify-certs/test-intermediate-ca-cert.pem @@ -1,66 +1,26 @@ -Certificate: - Data: - Version: 3 (0x2) - Serial Number: 28 (0x1c) - Signature Algorithm: sha1WithRSAEncryption - Issuer: CN=Westpoint Certificate Test CA, ST=Lancashire, C=UK/emailAddress=ca@example.com, O=Westpoint Certificate Test Root Certification Authority - Validity - Not Before: Jul 31 21:01:18 2011 GMT - Not After : Jul 28 21:01:18 2021 GMT - Subject: ST=Lancashire, C=UK/emailAddress=test@example.com, O=Test intermediate CA - Subject Public Key Info: - Public Key Algorithm: rsaEncryption - Public-Key: (1024 bit) - Modulus: - 00:bc:bd:83:c1:bc:36:d8:9c:74:68:5a:46:48:25: - 83:59:f8:35:1e:8f:dc:2c:52:3b:7c:2e:ea:40:c4: - 93:b6:39:31:df:f5:a6:f8:01:17:67:93:21:59:9b: - 89:7f:ed:2a:19:7b:25:a5:e1:71:12:99:e5:14:28: - df:75:b5:17:1c:3b:1d:3d:74:48:4f:b7:42:f4:3a: - ab:56:05:2b:fc:d3:27:97:01:08:5b:ad:26:9b:f2: - 87:51:9c:7e:e1:f1:ef:1c:bf:ad:7e:38:d9:76:89: - 30:a6:8c:2f:6f:87:9f:9e:57:13:14:b4:45:30:f3: - be:58:df:8a:d2:ee:7b:1d:89 - Exponent: 65537 (0x10001) - X509v3 extensions: - Authority Information Access: - OCSP - URI:http://ocsp.example.com:8888/ - - X509v3 Basic Constraints: - CA:TRUE - Signature Algorithm: sha1WithRSAEncryption - 33:84:9d:0e:b2:59:04:dc:ef:e3:04:8b:00:6c:64:ea:58:9e: - 36:59:76:27:59:a0:b8:ee:0d:86:83:ff:db:65:eb:6c:1f:16: - 47:e7:f5:e6:c3:88:81:73:7e:ed:12:8d:7e:fd:5e:b1:5c:68: - 47:f8:f9:ca:e3:e0:c0:f3:12:b2:24:3b:77:2c:98:de:05:6d: - a8:ec:27:b8:af:ab:84:25:26:73:b4:58:4c:7c:c1:74:97:98: - ab:0e:e6:99:70:bc:38:b0:9a:e3:d9:5c:75:fa:46:d2:87:55: - 09:86:8f:ef:4a:e4:ef:3e:32:c6:ac:9d:27:86:29:b8:78:38: - 7b:87:6c:57:72:bd:57:99:73:36:db:fa:52:bd:7b:a7:05:cd: - 28:b8:85:fc:11:47:5e:c6:77:72:6a:fb:73:3e:8b:a4:6d:f8: - 17:f4:12:d5:36:e0:ef:5c:f8:b2:a1:69:3e:4c:cf:86:5f:63: - f6:02:60:95:7f:61:e8:cb:7f:14:66:da:36:2e:78:13:3e:68: - ae:3f:13:c1:79:88:18:18:3f:23:f3:9a:e1:e7:7e:ae:50:e4: - b7:80:76:31:92:74:79:2c:de:d0:74:fe:81:7c:f6:01:14:6a: - 1f:5f:88:85:6a:11:1d:50:af:f1:97:4d:67:40:c3:e9:ae:6f: - 60:e2:bc:e2 -----BEGIN CERTIFICATE----- -MIIDUDCCAjigAwIBAgIBHDANBgkqhkiG9w0BAQUFADCBqzEmMCQGA1UEAxMdV2Vz -dHBvaW50IENlcnRpZmljYXRlIFRlc3QgQ0ExEzARBgNVBAgTCkxhbmNhc2hpcmUx -CzAJBgNVBAYTAlVLMR0wGwYJKoZIhvcNAQkBFg5jYUBleGFtcGxlLmNvbTFAMD4G -A1UEChM3V2VzdHBvaW50IENlcnRpZmljYXRlIFRlc3QgUm9vdCBDZXJ0aWZpY2F0 -aW9uIEF1dGhvcml0eTAeFw0xMTA3MzEyMTAxMThaFw0yMTA3MjgyMTAxMThaMGIx -EzARBgNVBAgTCkxhbmNhc2hpcmUxCzAJBgNVBAYTAlVLMR8wHQYJKoZIhvcNAQkB -FhB0ZXN0QGV4YW1wbGUuY29tMR0wGwYDVQQKExRUZXN0IGludGVybWVkaWF0ZSBD -QTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAvL2Dwbw22Jx0aFpGSCWDWfg1 -Ho/cLFI7fC7qQMSTtjkx3/Wm+AEXZ5MhWZuJf+0qGXslpeFxEpnlFCjfdbUXHDsd -PXRIT7dC9DqrVgUr/NMnlwEIW60mm/KHUZx+4fHvHL+tfjjZdokwpowvb4efnlcT -FLRFMPO+WN+K0u57HYkCAwEAAaNLMEkwOQYIKwYBBQUHAQEELTArMCkGCCsGAQUF -BzABhh1odHRwOi8vb2NzcC5leGFtcGxlLmNvbTo4ODg4LzAMBgNVHRMEBTADAQH/ -MA0GCSqGSIb3DQEBBQUAA4IBAQAzhJ0OslkE3O/jBIsAbGTqWJ42WXYnWaC47g2G -g//bZetsHxZH5/Xmw4iBc37tEo1+/V6xXGhH+PnK4+DA8xKyJDt3LJjeBW2o7Ce4 -r6uEJSZztFhMfMF0l5irDuaZcLw4sJrj2Vx1+kbSh1UJho/vSuTvPjLGrJ0nhim4 -eDh7h2xXcr1XmXM22/pSvXunBc0ouIX8EUdexndyavtzPoukbfgX9BLVNuDvXPiy -oWk+TM+GX2P2AmCVf2Hoy38UZto2LngTPmiuPxPBeYgYGD8j85rh536uUOS3gHYx -knR5LN7QdP6BfPYBFGofX4iFahEdUK/xl01nQMPprm9g4rzi +MIIEbTCCA1WgAwIBAgICEAcwDQYJKoZIhvcNAQELBQAwgaIxCzAJBgNVBAYTAk5P +MQ8wDQYDVQQIDAZOb3J3YXkxDTALBgNVBAcMBE9zbG8xDTALBgNVBAoMBFRRdEMx +LzAtBgNVBAsMJlRRdEMgVGVzdCBSb290IEF1dGhvcml6YXRpb24gQXV0aG9yaXR5 +MRowGAYDVQQDDBFUUXRDIHRlc3Qgcm9vdCBDQTEXMBUGCSqGSIb3DQEJARYIY2FA +cXQuaW8wHhcNMjEwNzI5MTcxNjA3WhcNMzEwNjA3MTcxNjA3WjCBqzELMAkGA1UE +BhMCTk8xDzANBgNVBAgMBk5vcndheTENMAsGA1UECgwEVFF0QzEwMC4GA1UECwwn +VFF0QyBJbnRlcm1lZGlhdGUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MTAwLgYDVQQD +DCdUUXRDIEludGVybWVkaWF0ZSBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxGDAWBgkq +hkiG9w0BCQEWCWljYUBxdC5pbzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAK1zsW+VafypIPdVrDavxgPJ8LIdYyIJtijHNvWmGDl9fgK8EZWm6uIsvHOL +D2ZtHmBRXCGXOuXFonZh2vpuPUzBdD8E4CQVE31QHHb2eoalpNgiIRODJEfOwMJZ +V5FP/iE5g5TJmbiqMwui2v4g4AWoQpsiSYnlgLd/XbZePpSSAqyZYsxGmzbcf2Vq +v5Tv8SbjLjuRZdwHsrXi/7S4qyybiPHLLoLD7+woDRo8wy+z0wQ8v2XsRzjqvBUn +QvuOvk5MXKHQzXheClMizcDDOcjaK0AKzVopQa6s0+Pmg+DW162DOrK4SGqpeBlp +OujEtiQk9+1hycAadbntYQ+/kHcCAwEAAaOBoTCBnjAdBgNVHQ4EFgQUemD1HaWM +WxNLlSONkvAiFhlmtVowHwYDVR0jBBgwFoAUWm+CujWqNX9DM76Cr+FJwgbDsKkw +EgYDVR0TAQH/BAgwBgEB/wIBADAOBgNVHQ8BAf8EBAMCAYYwOAYIKwYBBQUHAQEE +LDAqMCgGCCsGAQUFBzABhhxodHRwOi8vb2NzcC5leGFtcGxlLmNvbTo4ODg4MA0G +CSqGSIb3DQEBCwUAA4IBAQBxfeQrh/xnjL8vLLQB0PrPawCUB4X0RHheNAB8BZh/ +5t96StDZspB1p14iW1b9ziiN+w8hghdLO+UbEmbnfK9m0sxXPxGdO/dK5PeKkEZA +1Clbu1qPEwmbCeuPDHpcXMzYUEm/vHTJFNxfvLgiLYwZpxhYZiHeMMEUYxQRrmI1 +DJbcpZT4nYyaVKinvMmw5KG85cLsyjIgzhUwLGSAfB+p4pIX+R8GQZtdn26+FN9c +U+ZDfAUJ0hrPmd89KuSXm96tarx/EYnGzwletTL2IJWS1zxpGFlpyFgWq3m054iD +UAWX8IPCQRMwhoKmSqNbhtYIKLXyDe3Xg6yD0ySDKjlB -----END CERTIFICATE----- diff --git a/tests/auto/network/ssl/qsslcertificate/verify-certs/test-intermediate-is-ca-cert.pem b/tests/auto/network/ssl/qsslcertificate/verify-certs/test-intermediate-is-ca-cert.pem index 396cad86..3f13c934 100644 --- a/tests/auto/network/ssl/qsslcertificate/verify-certs/test-intermediate-is-ca-cert.pem +++ b/tests/auto/network/ssl/qsslcertificate/verify-certs/test-intermediate-is-ca-cert.pem @@ -1,53 +1,25 @@ -Certificate: - Data: - Version: 3 (0x2) - Serial Number: 29 (0x1d) - Signature Algorithm: sha1WithRSAEncryption - Issuer: ST=Lancashire, C=UK/emailAddress=test@example.com, O=Test intermediate CA - Validity - Not Before: Jul 31 21:01:18 2011 GMT - Not After : Jul 28 21:01:18 2021 GMT - Subject: CN=example.com - Subject Public Key Info: - Public Key Algorithm: rsaEncryption - Public-Key: (1024 bit) - Modulus: - 00:c9:bb:98:5b:27:cd:b1:8a:a9:38:fc:aa:bb:ad: - a1:ed:cb:94:94:3e:79:90:ae:35:f3:87:b1:2a:4e: - d5:ff:55:93:e0:1a:68:2a:36:94:05:38:a7:72:64: - a3:31:0f:61:5c:ec:76:41:f1:35:4a:5e:bc:ef:51: - 90:9e:33:b4:08:7a:3f:f0:04:a8:46:99:96:25:b3: - 03:c8:cd:8c:33:42:76:82:b9:db:61:c6:91:ed:76: - 86:ae:04:38:d7:e5:5c:a9:a9:f9:b6:13:f4:90:40: - 6d:ec:2f:ba:ed:bc:ff:88:05:f0:7b:c8:ac:bd:d0: - 72:3a:91:64:86:06:89:66:0d - Exponent: 65537 (0x10001) - X509v3 extensions: - X509v3 Basic Constraints: - CA:FALSE - Authority Information Access: - OCSP - URI:http://ocsp.example.com:8888/ - - Signature Algorithm: sha1WithRSAEncryption - 22:30:97:01:ea:d0:a8:d8:b5:32:97:c8:c9:8b:7d:01:02:53: - 74:f8:0a:10:dc:fc:73:b2:50:bb:59:47:f3:e4:9f:44:94:d5: - ca:c0:64:da:83:00:95:43:15:a5:e3:30:ce:66:ca:55:8c:16: - 03:1e:55:02:8b:c7:ad:ed:2e:ae:ee:31:59:53:37:ff:26:86: - 93:9d:e2:69:2e:c0:2a:66:38:a5:b5:54:a1:02:0a:83:67:e0: - 91:cf:fc:09:c3:70:71:b6:cf:fc:d3:e9:9f:f5:1c:4d:55:ec: - 66:f7:07:71:fc:d6:17:de:e1:ab:e6:f2:7b:83:46:1e:b9:96: - 95:8f -----BEGIN CERTIFICATE----- -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 +qLirP+moVzEWJKJP0HWT/jo7Ze53FA== -----END CERTIFICATE----- diff --git a/tests/auto/network/ssl/qsslcertificate/verify-certs/test-intermediate-not-ca-cert.pem b/tests/auto/network/ssl/qsslcertificate/verify-certs/test-intermediate-not-ca-cert.pem index 34ad2b10..836afd85 100644 --- a/tests/auto/network/ssl/qsslcertificate/verify-certs/test-intermediate-not-ca-cert.pem +++ b/tests/auto/network/ssl/qsslcertificate/verify-certs/test-intermediate-not-ca-cert.pem @@ -1,54 +1,24 @@ -Certificate: - Data: - Version: 3 (0x2) - Serial Number: 27 (0x1b) - Signature Algorithm: sha1WithRSAEncryption - Issuer: CN=example.com, ST=Lancashire, C=UK/emailAddress=test@example.com, O=Some organisation - Validity - Not Before: Jul 31 21:01:18 2011 GMT - Not After : Jul 28 21:01:18 2021 GMT - Subject: CN=example.com - Subject Public Key Info: - Public Key Algorithm: rsaEncryption - Public-Key: (1024 bit) - Modulus: - 00:ea:d6:97:b5:3c:f4:37:8a:58:b4:7a:49:31:55: - dd:c8:84:ee:36:f6:72:3a:31:99:d1:df:af:bb:f9: - 17:e9:d8:47:d2:20:4b:94:ce:ea:c1:6b:23:9a:da: - 02:41:29:51:34:05:13:c0:98:4d:87:f8:91:a8:85: - 81:e4:ab:26:3d:26:59:29:16:7d:04:db:57:7b:f0: - b6:2b:5d:cf:e7:82:ba:83:a7:bc:63:43:03:2a:2b: - 18:40:89:4c:1e:90:bc:bf:10:24:81:50:0d:2e:e8: - 8e:a9:0a:fc:f8:cd:97:98:3c:cc:55:b7:f2:b2:0d: - 0e:36:53:3a:b2:d0:45:90:8b - Exponent: 65537 (0x10001) - X509v3 extensions: - X509v3 Basic Constraints: - CA:FALSE - Authority Information Access: - OCSP - URI:http://ocsp.example.com:8888/ - - Signature Algorithm: sha1WithRSAEncryption - 82:d8:53:9c:d8:0b:0a:b3:9d:b4:0a:9f:93:ec:96:a6:31:6b: - 79:c9:d2:1c:76:0b:b7:f3:9f:b9:7a:dd:d7:b7:7b:26:ba:0a: - 54:2a:a3:ad:89:8e:3c:b8:8e:ea:09:53:58:73:9a:b3:a0:40: - 90:02:f2:60:04:b8:f0:2a:61:bd:91:9b:5e:81:5f:bf:cc:f2: - 33:33:8a:70:07:f5:ea:c0:05:38:34:f7:dc:ea:0c:74:01:5d: - dd:92:ab:f2:87:64:1b:7c:be:ae:37:c1:6c:ae:99:73:a5:aa: - 45:20:32:57:19:cb:30:45:61:2c:3b:23:52:ee:f0:cc:12:80: - 97:34 -----BEGIN CERTIFICATE----- -MIICSTCCAbKgAwIBAgIBGzANBgkqhkiG9w0BAQUFADB1MRQwEgYDVQQDEwtleGFt -cGxlLmNvbTETMBEGA1UECBMKTGFuY2FzaGlyZTELMAkGA1UEBhMCVUsxHzAdBgkq -hkiG9w0BCQEWEHRlc3RAZXhhbXBsZS5jb20xGjAYBgNVBAoTEVNvbWUgb3JnYW5p -c2F0aW9uMB4XDTExMDczMTIxMDExOFoXDTIxMDcyODIxMDExOFowFjEUMBIGA1UE -AxMLZXhhbXBsZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAOrWl7U8 -9DeKWLR6STFV3ciE7jb2cjoxmdHfr7v5F+nYR9IgS5TO6sFrI5raAkEpUTQFE8CY -TYf4kaiFgeSrJj0mWSkWfQTbV3vwtitdz+eCuoOnvGNDAyorGECJTB6QvL8QJIFQ -DS7ojqkK/PjNl5g8zFW38rINDjZTOrLQRZCLAgMBAAGjSDBGMAkGA1UdEwQCMAAw -OQYIKwYBBQUHAQEELTArMCkGCCsGAQUFBzABhh1odHRwOi8vb2NzcC5leGFtcGxl -LmNvbTo4ODg4LzANBgkqhkiG9w0BAQUFAAOBgQCC2FOc2AsKs520Cp+T7JamMWt5 -ydIcdgu385+5et3Xt3smugpUKqOtiY48uI7qCVNYc5qzoECQAvJgBLjwKmG9kZte -gV+/zPIzM4pwB/XqwAU4NPfc6gx0AV3dkqvyh2QbfL6uN8FsrplzpapFIDJXGcsw -RWEsOyNS7vDMEoCXNA== +MIID+jCCAuKgAwIBAgIUM3pG/f45Mn2QOCxAjTxuzXfIYj4wDQYJKoZIhvcNAQEL +BQAwgYcxCzAJBgNVBAYTAk5PMQ8wDQYDVQQIDAZOb3J3YXkxDTALBgNVBAcMBE9z +bG8xDTALBgNVBAoMBFRRdEMxEjAQBgNVBAsMCVNvbWUgVW5pdDEUMBIGA1UEAwwL +ZXhhbXBsZS5jb20xHzAdBgkqhkiG9w0BCQEWEHRlc3RAZXhhbXBsZS5jb20wHhcN +MjEwODA2MDQ0MjE1WhcNMzEwNjE1MDQ0MjE1WjCBjDELMAkGA1UEBhMCTk8xDzAN +BgNVBAgMBk5vcndheTENMAsGA1UEBwwET3NsbzENMAsGA1UECgwEVFF0QzEUMBIG +A1UECwwLRm91bmRhdGlvbnMxFDASBgNVBAMMC2V4YW1wbGUuY29tMSIwIAYJKoZI +hvcNAQkBFhNzaWduZWRieW5vbmNhQHF0LmlvMIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEApXDPgUmyVw89XB1o+9yPepTyXOUnY4/4JHu333l3IQcEsK17 +tmOftWOa2TGzScrN0sbi73IhCx48/hYI3skHNiocXhHlrNI8tHkwHKWf5k957tMN +xeSIgddRXMegMc4Xxo9IMxFmvAi1q7gnIkEpBg+6NWRGhB3N2Iw8nUtyOc+wx6Us +EzRi/HpITzNsmeuwHPzlKe8HQsL5VeM9oo7HdH7Bb2M7t4+oizZe8jbvhbUWbylb +HDkD1ZoxDRyYAPYkYyvsIodDBSFOQmon7kZtshrmZO+VGPEDisaDJFYppyZNOmmA +g65IUf+0oJW73uuG5dZWwmjEhHlKhkmvqXBoUQIDAQABo1cwVTAOBgNVHQ8BAf8E +BAMCBeAwOAYIKwYBBQUHAQEELDAqMCgGCCsGAQUFBzABhhxodHRwOi8vb2NzcC5l +eGFtcGxlLmNvbTo4ODg4MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBACBb +ERwLEJ9zGMk4lpnSK4hr2v8JZdVRbozKHUo0Vky3yyVoaFfKZqha9JpP0Ig71lSv +h8tmM41uFmIWCBc+JEu3PIGvZcs45/Py7NHHY5bua3/szRhkz0FbsEYbrCCE/Fom +rYxOd21q9+Aj0/ZGFccpc5v47SW8UFFjn5rhDKXqX7IZjFY/O6ILD/MnDePK963C +pGltAzKw1RRTQoXQWWWOQZx6jT+JFRQ1cc+QlY106461/qg1m1AhBG6/S6tjkcdI +h1jq4yMhfPP9BhxquZB4/mrBUY2rvUO40973m50trszjXSsdRgyScmEJKWco4MAZ +ZccSsplcBjL5ksfejH4= -----END CERTIFICATE----- diff --git a/tests/auto/network/ssl/qsslcertificate/verify-certs/test-ocsp-good-cert.pem b/tests/auto/network/ssl/qsslcertificate/verify-certs/test-ocsp-good-cert.pem index 34b26c6d..d4cd3e1f 100644 --- a/tests/auto/network/ssl/qsslcertificate/verify-certs/test-ocsp-good-cert.pem +++ b/tests/auto/network/ssl/qsslcertificate/verify-certs/test-ocsp-good-cert.pem @@ -1,67 +1,24 @@ -Certificate: - Data: - Version: 3 (0x2) - Serial Number: 1 (0x1) - Signature Algorithm: sha1WithRSAEncryption - Issuer: CN=Westpoint Certificate Test CA, ST=Lancashire, C=UK/emailAddress=ca@example.com, O=Westpoint Certificate Test Root Certification Authority - Validity - Not Before: Jul 31 21:01:16 2011 GMT - Not After : Jul 28 21:01:16 2021 GMT - Subject: CN=example.com, ST=Lancashire, C=UK/emailAddress=test@example.com, O=Some organisation - Subject Public Key Info: - Public Key Algorithm: rsaEncryption - Public-Key: (1024 bit) - Modulus: - 00:97:c9:92:27:81:a7:4c:64:82:a2:30:d6:07:b7: - 57:e0:9c:ea:cd:eb:53:be:ea:b6:b5:47:66:d0:68: - 54:25:a7:ed:21:5c:dc:fd:da:41:f6:c7:c0:35:ae: - 97:72:fd:8b:af:29:3d:38:5a:67:8b:39:8a:ce:86: - 25:0f:38:a7:b5:38:b3:8e:81:f0:ea:79:99:cb:f5: - 23:64:55:f3:4b:a4:b6:23:64:29:ea:ba:f3:29:52: - a7:7f:32:dc:0d:b6:d9:d4:e6:13:de:01:41:86:9a: - 2d:8f:bb:0c:18:88:09:ac:d4:6a:e9:cb:8a:17:8a: - 85:09:a6:ae:a6:1c:05:e9:55 - Exponent: 65537 (0x10001) - X509v3 extensions: - X509v3 Basic Constraints: - CA:FALSE - Authority Information Access: - OCSP - URI:http://ocsp.example.com:8888/ - - Signature Algorithm: sha1WithRSAEncryption - 8b:9b:96:fb:8e:1b:77:f5:70:39:fe:76:51:ac:a9:6b:80:a5: - b7:95:8b:c3:1a:9c:1f:bb:d1:d1:68:43:40:96:62:d6:a6:da: - d9:fd:9d:9a:9e:8a:84:fa:f5:54:ce:a8:d7:37:c7:0c:95:fc: - 11:8b:e9:32:53:e5:59:61:0a:53:70:f3:d6:ed:3f:b1:f4:49: - bf:86:c1:77:0d:b1:ac:65:7e:62:d2:f2:5a:31:50:a7:ed:28: - bb:63:d5:f3:4f:43:3a:3f:bf:3b:d0:94:aa:a1:74:95:be:a4: - 0f:8b:e0:6f:d8:33:84:76:71:b2:da:f4:0e:1e:d2:eb:f0:c3: - 1e:33:79:21:35:93:18:05:38:db:63:85:1a:e4:84:41:0a:c3: - fb:fd:5c:69:3d:18:0a:38:b8:16:18:d3:23:b9:51:47:2e:54: - 08:d1:fc:2e:b6:63:62:78:9c:26:59:c2:5e:5a:38:76:47:e7: - f0:f8:7b:b7:00:46:34:b0:44:28:a9:33:d7:e5:1d:52:c8:fb: - 32:a5:25:86:21:0c:80:f0:4b:37:60:a0:45:69:9f:6b:b0:34: - 91:5e:4c:62:45:99:83:1d:80:48:78:bb:ee:d4:83:39:76:c3: - e6:fb:31:e9:20:f0:64:90:24:4e:c6:07:75:40:1f:7e:97:77: - 1f:bf:a2:ef -----BEGIN CERTIFICATE----- -MIIDYDCCAkigAwIBAgIBATANBgkqhkiG9w0BAQUFADCBqzEmMCQGA1UEAxMdV2Vz -dHBvaW50IENlcnRpZmljYXRlIFRlc3QgQ0ExEzARBgNVBAgTCkxhbmNhc2hpcmUx -CzAJBgNVBAYTAlVLMR0wGwYJKoZIhvcNAQkBFg5jYUBleGFtcGxlLmNvbTFAMD4G -A1UEChM3V2VzdHBvaW50IENlcnRpZmljYXRlIFRlc3QgUm9vdCBDZXJ0aWZpY2F0 -aW9uIEF1dGhvcml0eTAeFw0xMTA3MzEyMTAxMTZaFw0yMTA3MjgyMTAxMTZaMHUx -FDASBgNVBAMTC2V4YW1wbGUuY29tMRMwEQYDVQQIEwpMYW5jYXNoaXJlMQswCQYD -VQQGEwJVSzEfMB0GCSqGSIb3DQEJARYQdGVzdEBleGFtcGxlLmNvbTEaMBgGA1UE -ChMRU29tZSBvcmdhbmlzYXRpb24wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGB -AJfJkieBp0xkgqIw1ge3V+Cc6s3rU77qtrVHZtBoVCWn7SFc3P3aQfbHwDWul3L9 -i68pPThaZ4s5is6GJQ84p7U4s46B8Op5mcv1I2RV80uktiNkKeq68ylSp38y3A22 -2dTmE94BQYaaLY+7DBiICazUaunLiheKhQmmrqYcBelVAgMBAAGjSDBGMAkGA1Ud -EwQCMAAwOQYIKwYBBQUHAQEELTArMCkGCCsGAQUFBzABhh1odHRwOi8vb2NzcC5l -eGFtcGxlLmNvbTo4ODg4LzANBgkqhkiG9w0BAQUFAAOCAQEAi5uW+44bd/VwOf52 -Uaypa4Clt5WLwxqcH7vR0WhDQJZi1qba2f2dmp6KhPr1VM6o1zfHDJX8EYvpMlPl -WWEKU3Dz1u0/sfRJv4bBdw2xrGV+YtLyWjFQp+0ou2PV809DOj+/O9CUqqF0lb6k -D4vgb9gzhHZxstr0Dh7S6/DDHjN5ITWTGAU422OFGuSEQQrD+/1caT0YCji4FhjT -I7lRRy5UCNH8LrZjYnicJlnCXlo4dkfn8Ph7twBGNLBEKKkz1+UdUsj7MqUlhiEM -gPBLN2CgRWmfa7A0kV5MYkWZgx2ASHi77tSDOXbD5vsx6SDwZJAkTsYHdUAffpd3 -H7+i7w== +MIIEEDCCAvigAwIBAgIUQrpDlYwLae3IBtw7fjH/oCSCWMYwDQYJKoZIhvcNAQEL +BQAwgaIxCzAJBgNVBAYTAk5PMQ8wDQYDVQQIDAZOb3J3YXkxDTALBgNVBAcMBE9z +bG8xDTALBgNVBAoMBFRRdEMxLzAtBgNVBAsMJlRRdEMgVGVzdCBSb290IEF1dGhv +cml6YXRpb24gQXV0aG9yaXR5MRowGAYDVQQDDBFUUXRDIHRlc3Qgcm9vdCBDQTEX +MBUGCSqGSIb3DQEJARYIY2FAcXQuaW8wHhcNMjEwODA2MDQzNzIyWhcNMzEwNjE1 +MDQzNzIyWjCBhzELMAkGA1UEBhMCTk8xDzANBgNVBAgMBk5vcndheTENMAsGA1UE +BwwET3NsbzENMAsGA1UECgwEVFF0QzESMBAGA1UECwwJU29tZSBVbml0MRQwEgYD +VQQDDAtleGFtcGxlLmNvbTEfMB0GCSqGSIb3DQEJARYQdGVzdEBleGFtcGxlLmNv +bTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMEmu/GCuiQwbQf8qluK +5UovaQ4L3MHScVFbHlHu1Nyc12wmhhpzC3jC+OikxdCPpvxdNmdsOHonhNkO55sL +YygX4c4sCNM4B6VbJTfdOKHRBV6ySxFVS4jjBwB88Ouz9KieGiOAA6Lf6nqIBitU +eYQtBPye1lSqX4dAFHx7Il6Ad8Z3U9hUkqEpcW3AGSxFS6GebfTNleN85lXyLhHm +v66vEcHOGM7YSjWjUDto4C5LpYQHMvKe4/oZylQkRwevy8pZ+dK6ZiJuxzKVu2M2 ++LuYFeCRnFry5NBUBhpeLSOgJO2BYJZroRWygjBNUD6yToZFOX77ctL0+lXIgqZ8 +vT0CAwEAAaNXMFUwDgYDVR0PAQH/BAQDAgLkMDgGCCsGAQUFBwEBBCwwKjAoBggr +BgEFBQcwAYYcaHR0cDovL29jc3AuZXhhbXBsZS5jb206ODg4ODAJBgNVHRMEAjAA +MA0GCSqGSIb3DQEBCwUAA4IBAQAReaLhTl0k8+pmVNvnqkPg7UvwmZ1EStWyz0hn +Ar+NZSIdHUWqGqvoQVzcH5ODW3yfkNadhwfm8BJcFuy0ioTqhGuho3cI8Qr9MRQl +s0NNIjeENYbBElBXmJup4OdgCSy0GL3DeCoe3xR+IwHYeER/oH6VDBZrpVovHAk9 +6FlL6eBXgWu1YzXhKU4/enVIJ0A4LRF9WnyhQSucLwo3+bOvPxLBtmP+lWtXyKap +wMMNPu6EULAQ2IYcTgafCW9BWR1UWDXHBRO5ytBV4KFrhXiPoPmA4x0ACxnclH41 +b3Pj0pBur9cQuvap/FSz1uEfJdsYISw6srTfD4zNUuXXhSbz -----END CERTIFICATE----- diff --git a/tests/auto/network/ssl/qsslsocket/certs/qt-test-server-cacert.pem b/tests/auto/network/ssl/qsslsocket/certs/qt-test-server-cacert.pem index c5aea0d7..29fd755d 100644 --- a/tests/auto/network/ssl/qsslsocket/certs/qt-test-server-cacert.pem +++ b/tests/auto/network/ssl/qsslsocket/certs/qt-test-server-cacert.pem @@ -1,17 +1,17 @@ -----BEGIN CERTIFICATE----- -MIICpzCCAhACCQCzAF1hyRVzAjANBgkqhkiG9w0BAQUFADCBlzELMAkGA1UEBhMC -Tk8xDTALBgNVBAgTBE9zbG8xDTALBgNVBAcTBE9zbG8xDjAMBgNVBAoTBU5va2lh -MTUwMwYDVQQLFCxRdCBTb2Z0d2FyZS9lbWFpbEFkZHJlc3M9bm9ib2R5QG5vZG9t -YWluLm9yZzEjMCEGA1UEAxMacXQtdGVzdC1zZXJ2ZXIucXQtdGVzdC1uZXQwHhcN -MTkwNjI0MTI0OTIxWhcNMjIwNjIzMTI0OTIxWjCBlzELMAkGA1UEBhMCTk8xDTAL -BgNVBAgTBE9zbG8xDTALBgNVBAcTBE9zbG8xDjAMBgNVBAoTBU5va2lhMTUwMwYD -VQQLFCxRdCBTb2Z0d2FyZS9lbWFpbEFkZHJlc3M9bm9ib2R5QG5vZG9tYWluLm9y -ZzEjMCEGA1UEAxMacXQtdGVzdC1zZXJ2ZXIucXQtdGVzdC1uZXQwgZ8wDQYJKoZI -hvcNAQEBBQADgY0AMIGJAoGBAM2q22/WNMmn8cC+5EEYGeICySLmp9W6Ay6eKHr0 -Xxp3X3epETuPfvAuxp7rOtkS18EMUegkUj8jw0IMEcbyHKFC/rTCaYOt93CxGBXM -IChiMPAsFeYzGa/D6xzAkfcRaJRQ+Ek3CDLXPnXfo7xpABXezYcPXAJrgsgBfWrw -HdxzAgMBAAEwDQYJKoZIhvcNAQEFBQADgYEASCKbqEX5ysC549mq90ydk4jyDW3m -PUyet01fKpcRqVs+OJxdExFBTra3gho6WzzpTSPsuX2ZKOLF5k6KkCvdCGvhC1Kv -HHPIExurfzvdlSRzj6HbKyPuSfxyOloH0bBp7/Gg5RIuBPKlbmfbnTLtwEjhhbMU -SoYI8HZd3HfY87c= +MIICyjCCAjMCFHPGDqJR+klHni4XbETMk6GLn/UEMA0GCSqGSIb3DQEBDQUAMIGj +MRcwFQYDVQQKEw5UaGUgUXQgQ29tcGFueTEUMBIGA1UECxMLUXQgU29mdHdhcmUx +IjAgBgkqhkiG9w0BCQEWE25vYm9keUBub2RvbWFpbi5vcmcxDTALBgNVBAcTBE9z +bG8xDTALBgNVBAgTBE9zbG8xCzAJBgNVBAYTAk5PMSMwIQYDVQQDExpxdC10ZXN0 +LXNlcnZlci5xdC10ZXN0LW5ldDAeFw0yMjA2MjQxMTU4NDlaFw0zMjA2MjExMTU4 +NDlaMIGjMRcwFQYDVQQKEw5UaGUgUXQgQ29tcGFueTEUMBIGA1UECxMLUXQgU29m +dHdhcmUxIjAgBgkqhkiG9w0BCQEWE25vYm9keUBub2RvbWFpbi5vcmcxDTALBgNV +BAcTBE9zbG8xDTALBgNVBAgTBE9zbG8xCzAJBgNVBAYTAk5PMSMwIQYDVQQDExpx +dC10ZXN0LXNlcnZlci5xdC10ZXN0LW5ldDCBnzANBgkqhkiG9w0BAQEFAAOBjQAw +gYkCgYEAzarbb9Y0yafxwL7kQRgZ4gLJIuan1boDLp4oevRfGndfd6kRO49+8C7G +nus62RLXwQxR6CRSPyPDQgwRxvIcoUL+tMJpg633cLEYFcwgKGIw8CwV5jMZr8Pr +HMCR9xFolFD4STcIMtc+dd+jvGkAFd7Nhw9cAmuCyAF9avAd3HMCAwEAATANBgkq +hkiG9w0BAQ0FAAOBgQCZyRe25WqOjrNS6BKPs7ep7eyCON3NKdWnfABZrSjGJQ87 +PoFKl6+9YBSlSpl8qk7c29ic+wA4qFQzPJkrbYIXjwVMAr+cC1kVrlUVqcwmvnKo +5vj57/v8S0Uc4/GesIsxZR7QM+3diPDyk7Bsc3IkpINb31Dl0mlg25nztg8NxA== -----END CERTIFICATE----- diff --git a/tests/auto/network/ssl/qsslsocket/tst_qsslsocket.cpp b/tests/auto/network/ssl/qsslsocket/tst_qsslsocket.cpp index a40ec306..0dc211dc 100644 --- a/tests/auto/network/ssl/qsslsocket/tst_qsslsocket.cpp +++ b/tests/auto/network/ssl/qsslsocket/tst_qsslsocket.cpp @@ -1623,6 +1623,9 @@ void tst_QSslSocket::setSocketDescriptor() void tst_QSslSocket::setSslConfiguration_data() { +#if QT_CONFIG(securetransport) + QSKIP("Skipping the cases with certificate, SecureTransport does not like old certificate on the test server"); +#endif // securetransport QTest::addColumn("configuration"); QTest::addColumn("works"); diff --git a/tests/auto/opengl/qgl/BLACKLIST b/tests/auto/opengl/qgl/BLACKLIST index ec75ea16..6ad3dba4 100644 --- a/tests/auto/opengl/qgl/BLACKLIST +++ b/tests/auto/opengl/qgl/BLACKLIST @@ -5,4 +5,8 @@ opensuse-leap ubuntu-18.04 rhel-7.4 opensuse-42.3 +sles +# QTBUG-96271 +[closeAndThenShow] +macos-11 diff --git a/tests/auto/opengl/qgl/tst_qgl.cpp b/tests/auto/opengl/qgl/tst_qgl.cpp index 7c43c522..c5441770 100644 --- a/tests/auto/opengl/qgl/tst_qgl.cpp +++ b/tests/auto/opengl/qgl/tst_qgl.cpp @@ -44,6 +44,7 @@ #include #include #include +#include #ifdef QT_BUILD_INTERNAL #include @@ -2537,6 +2538,10 @@ public: void tst_QGL::closeAndThenShow() { +#ifdef Q_OS_MACOS + if (QOperatingSystemVersion::current() >= QOperatingSystemVersion::MacOSBigSur) + QSKIP("Test is crashing flaky on macos-11.0 - QTBUG-96271"); +#endif QWidget *w = new QWidget; w->resize(640, 480); QVBoxLayout *layout = new QVBoxLayout(w); diff --git a/tests/auto/other/gestures/BLACKLIST b/tests/auto/other/gestures/BLACKLIST index 2af5d403..480b5a3a 100644 --- a/tests/auto/other/gestures/BLACKLIST +++ b/tests/auto/other/gestures/BLACKLIST @@ -2,6 +2,7 @@ rhel-7.4 rhel-7.6 ubuntu-18.04 +sles-15 [customGesture] opensuse-leap # QTBUG-67254 @@ -10,18 +11,22 @@ opensuse-42.3 ubuntu-18.04 rhel-7.4 rhel-7.6 +sles-15 [graphicsItemTreeGesture] ubuntu-18.04 [graphicsView] ubuntu-18.04 rhel-7.4 rhel-7.6 +sles-15 [explicitGraphicsObjectTarget] ubuntu-18.04 rhel-7.4 rhel-7.6 +sles-15 [autoCancelGestures2] ubuntu-18.04 rhel-7.4 rhel-7.6 +sles-15 diff --git a/tests/auto/other/lancelot/paintcommands.cpp b/tests/auto/other/lancelot/paintcommands.cpp index e98df378..0dab5376 100644 --- a/tests/auto/other/lancelot/paintcommands.cpp +++ b/tests/auto/other/lancelot/paintcommands.cpp @@ -376,6 +376,10 @@ void PaintCommands::staticInit() "^drawLine\\s+(-?[\\w.]*)\\s+(-?[\\w.]*)\\s+(-?[\\w.]*)\\s+(-?[\\w.]*)$", "drawLine ", "drawLine 10.0 10.0 20.0 20.0"); + DECL_PAINTCOMMAND("drawLines", command_drawLines, + "^drawLines\\s+\\[([\\w\\s\\-.]*)\\]$", + "drawLines <[ ... ]>", + "drawLines [ 10 10 50 10 50 20 10 20 ]"); DECL_PAINTCOMMAND("drawRect", command_drawRect, "^drawRect\\s+(-?[\\w.]*)\\s+(-?[\\w.]*)\\s+(-?[\\w.]*)\\s+(-?[\\w.]*)$", "drawRect ", @@ -433,7 +437,7 @@ void PaintCommands::staticInit() "drawConvexPolygon <[ ... ]>", "drawConvexPolygon [ 1 4 6 8 5 3 ]"); DECL_PAINTCOMMAND("drawPolyline", command_drawPolyline, - "^drawPolyline\\s+\\[([\\w\\s]*)\\]$", + "^drawPolyline\\s+\\[([\\w\\s\\-.]*)\\]$", "drawPolyline <[ ... ]>", "drawPolyline [ 1 4 6 8 5 3 ]"); DECL_PAINTCOMMAND("drawText", command_drawText, @@ -974,6 +978,25 @@ void PaintCommands::command_drawLine(QRegularExpressionMatch re) m_painter->drawLine(QLineF(x1, y1, x2, y2)); } +/***************************************************************************************************/ +void PaintCommands::command_drawLines(QRegularExpressionMatch re) +{ + static QRegularExpression separators("\\s"); + QStringList numbers = re.captured(1).split(separators, Qt::SkipEmptyParts); + + QVector array; + for (int i = 0; i + 3 < numbers.size(); i += 4) { + QPointF pt1(numbers.at(i).toFloat(), numbers.at(i + 1).toFloat()); + QPointF pt2(numbers.at(i + 2).toFloat(), numbers.at(i + 3).toFloat()); + array.append(QLineF(pt1, pt2)); + } + + if (m_verboseMode) + printf(" -(lance) drawLines(size=%zd)\n", size_t(array.size())); + + m_painter->drawLines(array); +} + /***************************************************************************************************/ void PaintCommands::command_drawPath(QRegularExpressionMatch re) { diff --git a/tests/auto/other/lancelot/paintcommands.h b/tests/auto/other/lancelot/paintcommands.h index 816ecd6f..4a1a8955 100644 --- a/tests/auto/other/lancelot/paintcommands.h +++ b/tests/auto/other/lancelot/paintcommands.h @@ -187,6 +187,7 @@ private: void command_drawEllipse(QRegularExpressionMatch re); void command_drawImage(QRegularExpressionMatch re); void command_drawLine(QRegularExpressionMatch re); + void command_drawLines(QRegularExpressionMatch re); void command_drawPath(QRegularExpressionMatch re); void command_drawPie(QRegularExpressionMatch re); void command_drawPixmap(QRegularExpressionMatch re); diff --git a/tests/auto/other/lancelot/scripts/cosmetic.qps b/tests/auto/other/lancelot/scripts/cosmetic.qps new file mode 100644 index 00000000..3c730cf2 --- /dev/null +++ b/tests/auto/other/lancelot/scripts/cosmetic.qps @@ -0,0 +1,55 @@ +drawRect 0 0 800 800 + +setRenderHint Antialiasing true +image_load dome_argb32.png img + +save +setBrush springgreen SolidPattern + +begin_block primitives + +setPen black 2 DashLine +pen_setCosmetic true +drawLine 10 60 60 10 +drawRect 80 10.0 30 50 +drawText 130 50 "Foo" +drawImage img 160 10 50 50 + +pen_setCosmetic false +drawLine 10 160 60 110 +drawRect 80 110.0 30 50 +drawText 130 150 "Foo" +drawImage img 160 110 50 50 + +setPen NoPen +drawLine 10 260 60 210 +drawRect 80 210.0 30 50 +drawText 130 250 "Foo" +drawImage img 160 210 50 50 + +end_block primitives + + +translate 250 0 +rotate 10 +scale 2.5 1 +repeat_block primitives + +resetMatrix +# Force non-simple pen in Pdf +setOpacity 0.5 +translate 0 400 +repeat_block primitives + +translate 250 0 +rotate 10 +scale 2.5 1 +repeat_block primitives + +restore +setPen blue 4 DotLine +setBrush olive SolidPattern +pen_setCosmetic true +translate 50 720 +scale 2 2 +drawRect 0 0 30 30 diff --git a/tests/auto/other/lancelot/scripts/linedashes2.qps b/tests/auto/other/lancelot/scripts/linedashes2.qps index 1dc4fd31..b9a4cb95 100644 --- a/tests/auto/other/lancelot/scripts/linedashes2.qps +++ b/tests/auto/other/lancelot/scripts/linedashes2.qps @@ -111,8 +111,9 @@ translate 0 780 repeat_block vertical resetMatrix -translate 40 400 -setPen 0xffff0000 5 dashdotline flatcap +translate 20 380 +setPen 0xffff00ff 5 dashdotline flatcap +begin_block offset pen_setDashPattern [1 1 4 1 1 4] pen_setDashOffset -4 drawLine 0 0 300 0 @@ -146,9 +147,50 @@ drawLine 0 0 300 0 translate 0 8 pen_setDashOffset 16 drawLine 0 0 300 0 +end_block offset + +resetMatrix +translate 420 380 +setPen 0xffff00ff 5 dashdotline roundcap +repeat_block offset resetMatrix setPen black 3 dashdotline pen_setCosmetic true translate 0 -150 -drawLine 500 160 500 410 \ No newline at end of file +drawLine 500 160 500 410 + +resetMatrix +translate 300 480 +setPen blue 0 + +begin_block clip_lines +pen_setDashPattern [ 20 4 5 4 1 4 ] +pen_setDashOffset 26.0 +drawLines [0 0 1000000 10 1000000 10 -1000000 20 -1000000 20 0 30] +end_block clip_lines + +translate 0 45 +setPen blue 5 +repeat_block clip_lines + +translate 0 45 +setPen blue 5 SolidLine RoundCap +repeat_block clip_lines + +translate 0 45 +setPen green 0 + +begin_block clip_poly +pen_setDashPattern [ 20 4 5 4 1 4 ] +pen_setDashOffset 26.0 +drawPolyline [0 0 1000000 10 -1000000 20 0 30] +end_block clip_poly + +translate 0 45 +setPen green 5 +repeat_block clip_poly + +translate 0 45 +setPen green 5 SolidLine RoundCap +repeat_block clip_poly diff --git a/tests/auto/other/lancelot/scripts/tinydashes.qps b/tests/auto/other/lancelot/scripts/tinydashes.qps new file mode 100644 index 00000000..d41ced7f --- /dev/null +++ b/tests/auto/other/lancelot/scripts/tinydashes.qps @@ -0,0 +1,34 @@ +# Version: 1 +# CheckVsReference: 5% + +path_addEllipse mypath 20.0 20.0 200.0 200.0 + +save +setPen blue 20 SolidLine FlatCap +pen_setCosmetic true +pen_setDashPattern [ 0.0004 0.0004 ] +setBrush yellow + +drawPath mypath +translate 300 0 +setRenderHint Antialiasing true +drawPath mypath +restore + +path_addEllipse bigpath 200000.0 200000.0 2000000.0 2000000.0 + +setPen blue 20 DotLine FlatCap +setBrush yellow + +save +translate 0 300 +scale 0.0001 0.00011 +drawPath bigpath +restore + +save +translate 300 300 +setRenderHint Antialiasing true +scale 0.0001 0.00011 +drawPath bigpath +restore diff --git a/tests/auto/other/lancelot/tst_lancelot.cpp b/tests/auto/other/lancelot/tst_lancelot.cpp index 7c0d809c..516cf09f 100644 --- a/tests/auto/other/lancelot/tst_lancelot.cpp +++ b/tests/auto/other/lancelot/tst_lancelot.cpp @@ -30,6 +30,9 @@ #include #include #include +#include +#include +#include #ifndef QT_NO_OPENGL #include @@ -53,7 +56,8 @@ public: private: enum GraphicsEngine { Raster = 0, - OpenGL = 1 + OpenGL = 1, + Pdf = 2 }; void setupTestSuite(const QStringList& blacklist = QStringList()); @@ -88,6 +92,9 @@ private slots: void testRasterRGBA64PM_data(); void testRasterRGBA64PM(); + void testPdf_data(); + void testPdf(); + #ifndef QT_NO_OPENGL void testOpenGL_data(); void testOpenGL(); @@ -239,6 +246,21 @@ void tst_Lancelot::testRasterRGBA64PM() } +void tst_Lancelot::testPdf_data() +{ +#ifdef Q_OS_MACOS + setupTestSuite(); +#else + QSKIP("Pdf testing only implemented for macOS"); +#endif +} + +void tst_Lancelot::testPdf() +{ + runTestSuite(Pdf, QImage::Format_RGB32); +} + + #ifndef QT_NO_OPENGL bool tst_Lancelot::checkSystemGLSupport() { @@ -370,6 +392,28 @@ void tst_Lancelot::runTestSuite(GraphicsEngine engine, QImage::Format format, co paint(&pdv, engine, format, script, QFileInfo(filePath).absoluteFilePath()); rendered = fbo.toImage().convertToFormat(format); #endif + } else if (engine == Pdf) { + QString tempStem(QDir::tempPath() + QLatin1String("/lancelot_XXXXXX_") + qpsFile.chopped(4)); + + QTemporaryFile pdfFile(tempStem + QLatin1String(".pdf")); + pdfFile.open(); + QPdfWriter writer(&pdfFile); + writer.setPdfVersion(QPdfWriter::PdfVersion_1_6); + writer.setResolution(150); + paint(&writer, engine, format, script, QFileInfo(filePath).absoluteFilePath()); + pdfFile.close(); + + // Convert pdf to something we can read into a QImage, using macOS' sips utility + QTemporaryFile pngFile(tempStem + QLatin1String(".png")); + pngFile.open(); // Just create the file name + pngFile.close(); + QProcess proc; + const char *rawArgs = "-s format png --cropOffset 20 20 -c 800 800 -o"; + QStringList argList = QString::fromLatin1(rawArgs).split(QLatin1Char(' ')); + proc.start(QLatin1String("sips"), argList << pngFile.fileName() << pdfFile.fileName()); + proc.waitForFinished(2 * 60 * 1000); // May need some time + + rendered = QImage(pngFile.fileName()); } QBASELINE_TEST(rendered); @@ -384,6 +428,9 @@ void tst_Lancelot::paint(QPaintDevice *device, GraphicsEngine engine, QImage::Fo case OpenGL: pcmd.setType(OpenGLBufferType); // version/profile is communicated through the context's format() break; + case Pdf: + pcmd.setType(PdfType); + break; case Raster: // fallthrough default: pcmd.setType(ImageType); diff --git a/tests/auto/other/qaccessibilitymac/BLACKLIST b/tests/auto/other/qaccessibilitymac/BLACKLIST new file mode 100644 index 00000000..916342e9 --- /dev/null +++ b/tests/auto/other/qaccessibilitymac/BLACKLIST @@ -0,0 +1,4 @@ +# See qtbase/src/testlib/qtestblacklist.cpp for format +[notificationsTest] +macos-10.15 + diff --git a/tests/auto/other/qaccessibilitymac/tst_qaccessibilitymac_helpers.mm b/tests/auto/other/qaccessibilitymac/tst_qaccessibilitymac_helpers.mm index d97a0db9..174d86a9 100644 --- a/tests/auto/other/qaccessibilitymac/tst_qaccessibilitymac_helpers.mm +++ b/tests/auto/other/qaccessibilitymac/tst_qaccessibilitymac_helpers.mm @@ -86,6 +86,7 @@ QDebug operator<<(QDebug dbg, AXErrorTag err) return false; \ } \ +#define TRY_EXPECT(cond) EXPECT(QTest::qWaitFor([&]{ return (cond); })) @interface TestAXObject : NSObject { @@ -546,21 +547,17 @@ bool notifications(QWidget *w) EXPECT(notificationList.length() == 0); le2->setFocus(); - QCoreApplication::processEvents(); - EXPECT(notificationList.length() == 1); - EXPECT(notificationList.at(0) == QAccessible::Focus); + TRY_EXPECT(notificationList.length() == 1); + TRY_EXPECT(notificationList.at(0) == QAccessible::Focus); le1->setFocus(); - QCoreApplication::processEvents(); - EXPECT(notificationList.length() == 2); - EXPECT(notificationList.at(1) == QAccessible::Focus); + TRY_EXPECT(notificationList.length() == 2); + TRY_EXPECT(notificationList.at(1) == QAccessible::Focus); le1->setText("hello"); - QCoreApplication::processEvents(); - EXPECT(notificationList.length() == 3); - EXPECT(notificationList.at(2) == QAccessible::ValueChanged); + TRY_EXPECT(notificationList.length() == 3); + TRY_EXPECT(notificationList.at(2) == QAccessible::ValueChanged); le1->setText("foo"); - QCoreApplication::processEvents(); - EXPECT(notificationList.length() == 4); - EXPECT(notificationList.at(3) == QAccessible::ValueChanged); + TRY_EXPECT(notificationList.length() == 4); + TRY_EXPECT(notificationList.at(3) == QAccessible::ValueChanged); return true; } diff --git a/tests/auto/sql/models/qsqltablemodel/tst_qsqltablemodel.cpp b/tests/auto/sql/models/qsqltablemodel/tst_qsqltablemodel.cpp index 44dd4a74..935734c0 100644 --- a/tests/auto/sql/models/qsqltablemodel/tst_qsqltablemodel.cpp +++ b/tests/auto/sql/models/qsqltablemodel/tst_qsqltablemodel.cpp @@ -157,6 +157,9 @@ private slots: void invalidFilterAndHeaderData_data() { generic_data(); } void invalidFilterAndHeaderData(); //QTBUG-23879 + + void sqlite_selectFromIdentifierWithDot_data() { generic_data("QSQLITE"); } + void sqlite_selectFromIdentifierWithDot(); private: void generic_data(const QString& engine=QString()); void generic_data_with_strategies(const QString& engine=QString()); @@ -308,33 +311,37 @@ void tst_QSqlTableModel::select() QSqlDatabase db = QSqlDatabase::database(dbName); CHECK_DATABASE(db); - QSqlTableModel model(0, db); - model.setTable(test); - model.setSort(0, Qt::AscendingOrder); - QVERIFY_SQL(model, select()); + QString withoutQuotes = test; + const QStringList tables = {test, withoutQuotes.remove(QLatin1Char('"'))}; + for (const QString &tbl : tables) { + QSqlTableModel model(0, db); + model.setTable(tbl); + model.setSort(0, Qt::AscendingOrder); + QVERIFY_SQL(model, select()); - QCOMPARE(model.rowCount(), 3); - QCOMPARE(model.columnCount(), 3); + QCOMPARE(model.rowCount(), 3); + QCOMPARE(model.columnCount(), 3); - QCOMPARE(model.data(model.index(0, 0)).toInt(), 1); - QCOMPARE(model.data(model.index(0, 1)).toString(), QString("harry")); - QCOMPARE(model.data(model.index(0, 2)).toInt(), 1); - QCOMPARE(model.data(model.index(0, 3)), QVariant()); + QCOMPARE(model.data(model.index(0, 0)).toInt(), 1); + QCOMPARE(model.data(model.index(0, 1)).toString(), QString("harry")); + QCOMPARE(model.data(model.index(0, 2)).toInt(), 1); + QCOMPARE(model.data(model.index(0, 3)), QVariant()); - QCOMPARE(model.data(model.index(1, 0)).toInt(), 2); - QCOMPARE(model.data(model.index(1, 1)).toString(), QString("trond")); - QCOMPARE(model.data(model.index(1, 2)).toInt(), 2); - QCOMPARE(model.data(model.index(1, 3)), QVariant()); + QCOMPARE(model.data(model.index(1, 0)).toInt(), 2); + QCOMPARE(model.data(model.index(1, 1)).toString(), QString("trond")); + QCOMPARE(model.data(model.index(1, 2)).toInt(), 2); + QCOMPARE(model.data(model.index(1, 3)), QVariant()); - QCOMPARE(model.data(model.index(2, 0)).toInt(), 3); - QCOMPARE(model.data(model.index(2, 1)).toString(), QString("vohi")); - QCOMPARE(model.data(model.index(2, 2)).toInt(), 3); - QCOMPARE(model.data(model.index(2, 3)), QVariant()); + QCOMPARE(model.data(model.index(2, 0)).toInt(), 3); + QCOMPARE(model.data(model.index(2, 1)).toString(), QString("vohi")); + QCOMPARE(model.data(model.index(2, 2)).toInt(), 3); + QCOMPARE(model.data(model.index(2, 3)), QVariant()); - QCOMPARE(model.data(model.index(3, 0)), QVariant()); - QCOMPARE(model.data(model.index(3, 1)), QVariant()); - QCOMPARE(model.data(model.index(3, 2)), QVariant()); - QCOMPARE(model.data(model.index(3, 3)), QVariant()); + QCOMPARE(model.data(model.index(3, 0)), QVariant()); + QCOMPARE(model.data(model.index(3, 1)), QVariant()); + QCOMPARE(model.data(model.index(3, 2)), QVariant()); + QCOMPARE(model.data(model.index(3, 3)), QVariant()); + } } class SelectRowModel: public QSqlTableModel @@ -2138,5 +2145,50 @@ void tst_QSqlTableModel::modelInAnotherThread() QVERIFY(t.isFinished()); } +void tst_QSqlTableModel::sqlite_selectFromIdentifierWithDot() +{ + QFETCH(QString, dbName); + QSqlDatabase db = QSqlDatabase::database(dbName); + CHECK_DATABASE(db); + { + const auto fieldDot = qTableName("fieldDot", __FILE__, db); + tst_Databases::safeDropTable(db, fieldDot); + QSqlQuery qry(db); + QVERIFY_SQL(qry, exec("create table " + fieldDot + " (id int primary key, " + "\"person.firstname\" varchar(20))")); + QVERIFY_SQL(qry, exec("insert into " + fieldDot + " values(1, 'Andy')")); + QSqlTableModel model(0, db); + model.setTable(fieldDot); + QVERIFY_SQL(model, select()); + QCOMPARE(model.data(model.index(0, 0)).toInt(), 1); + QCOMPARE(model.data(model.index(0, 1)).toString(), QString("Andy")); + } + const auto tableDot = QLatin1Char('[') + qTableName("table.dot", __FILE__, db) + QLatin1Char(']'); + { + tst_Databases::safeDropTable(db, tableDot); + QSqlQuery qry(db); + QVERIFY_SQL(qry, exec("create table " + tableDot + " (id int primary key, " + "\"person.firstname\" varchar(20))")); + QVERIFY_SQL(qry, exec("insert into " + tableDot + " values(1, 'Andy')")); + QSqlTableModel model(0, db); + model.setTable(tableDot); + QVERIFY_SQL(model, select()); + QCOMPARE(model.data(model.index(0, 0)).toInt(), 1); + QCOMPARE(model.data(model.index(0, 1)).toString(), QString("Andy")); + } + { + QSqlDatabase attachedDb = QSqlDatabase::addDatabase("QSQLITE", "attachedDb"); + attachedDb.setDatabaseName(db.databaseName().replace("foo.db", "attached.db")); + QVERIFY(attachedDb.open()); + QSqlQuery qry(attachedDb); + QVERIFY_SQL(qry, exec(QString("attach '%1' AS 'attached'").arg(db.databaseName()))); + QSqlTableModel model(0, attachedDb); + model.setTable(QString("attached.%1").arg(tableDot)); + QVERIFY_SQL(model, select()); + QCOMPARE(model.data(model.index(0, 0)).toInt(), 1); + QCOMPARE(model.data(model.index(0, 1)).toString(), QString("Andy")); + } +} + QTEST_MAIN(tst_QSqlTableModel) #include "tst_qsqltablemodel.moc" diff --git a/tests/auto/testlib/qabstractitemmodeltester/tst_qabstractitemmodeltester.cpp b/tests/auto/testlib/qabstractitemmodeltester/tst_qabstractitemmodeltester.cpp index b305eee0..4aa3f8d6 100644 --- a/tests/auto/testlib/qabstractitemmodeltester/tst_qabstractitemmodeltester.cpp +++ b/tests/auto/testlib/qabstractitemmodeltester/tst_qabstractitemmodeltester.cpp @@ -40,6 +40,7 @@ private slots: void stringListModel(); void treeWidgetModel(); void standardItemModel(); + void standardItemModelZeroColumns(); void testInsertThroughProxy(); void moveSourceItems(); void testResetThroughProxy(); @@ -104,6 +105,18 @@ void tst_QAbstractItemModelTester::standardItemModel() model.insertColumns(0, 5, model.index(1, 3)); } +void tst_QAbstractItemModelTester::standardItemModelZeroColumns() +{ + QStandardItemModel model; + QAbstractItemModelTester t1(&model); + // QTBUG-92220 + model.insertRows(0, 5); + model.removeRows(0, 5); + // QTBUG-92886 + model.insertRows(0, 5); + model.removeRows(1, 2); +} + void tst_QAbstractItemModelTester::testInsertThroughProxy() { DynamicTreeModel *model = new DynamicTreeModel(this); diff --git a/tests/auto/testlib/selftests/verifyexceptionthrown/tst_verifyexceptionthrown.cpp b/tests/auto/testlib/selftests/verifyexceptionthrown/tst_verifyexceptionthrown.cpp index 9fc49041..fc127386 100644 --- a/tests/auto/testlib/selftests/verifyexceptionthrown/tst_verifyexceptionthrown.cpp +++ b/tests/auto/testlib/selftests/verifyexceptionthrown/tst_verifyexceptionthrown.cpp @@ -112,12 +112,16 @@ void tst_VerifyExceptionThrown::testCorrectMyExceptions() const void tst_VerifyExceptionThrown::testFailInt() const { - QVERIFY_EXCEPTION_THROWN(throw int(5), double); + try { + QVERIFY_EXCEPTION_THROWN(throw int(5), double); + } catch (int) {} } void tst_VerifyExceptionThrown::testFailStdString() const { - QVERIFY_EXCEPTION_THROWN(throw std::string("some string"), char*); + try { + QVERIFY_EXCEPTION_THROWN(throw std::string("some string"), char*); + } catch (const std::string &) {} } void tst_VerifyExceptionThrown::testFailStdRuntimeError() const diff --git a/tests/auto/tools/moc/allmocs_baseline_in.json b/tests/auto/tools/moc/allmocs_baseline_in.json index 6d17bebb..12a4a22a 100644 --- a/tests/auto/tools/moc/allmocs_baseline_in.json +++ b/tests/auto/tools/moc/allmocs_baseline_in.json @@ -1533,6 +1533,79 @@ "inputFile": "cxx11-explicit-override-control.h", "outputRevision": 67 }, + { + "classes": [ + { + "className": "CXX11TrailingReturn", + "object": true, + "qualifiedClassName": "CXX11TrailingReturn", + "signals": [ + { + "access": "public", + "arguments": [ + { + "name": "i", + "type": "int" + } + ], + "name": "trailingSignalReturn", + "returnType": "void" + } + ], + "slots": [ + { + "access": "public", + "name": "fun", + "returnType": "void" + }, + { + "access": "public", + "arguments": [ + { + "name": "i", + "type": "int" + }, + { + "name": "b", + "type": "char" + } + ], + "name": "arguments", + "returnType": "int" + }, + { + "access": "public", + "arguments": [ + { + "name": "i", + "type": "int" + } + ], + "name": "inlineFunc", + "returnType": "int" + }, + { + "access": "public", + "name": "constRefReturn", + "returnType": "void" + }, + { + "access": "public", + "name": "constConstRefReturn", + "returnType": "void" + } + ], + "superClasses": [ + { + "access": "public", + "name": "QObject" + } + ] + } + ], + "inputFile": "cxx11-trailing-return.h", + "outputRevision": 67 + }, { "classes": [ { diff --git a/tests/auto/tools/moc/cxx11-trailing-return.h b/tests/auto/tools/moc/cxx11-trailing-return.h new file mode 100644 index 00000000..50f341e1 --- /dev/null +++ b/tests/auto/tools/moc/cxx11-trailing-return.h @@ -0,0 +1,68 @@ +/**************************************************************************** +** +** Copyright (C) 2020 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:GPL-EXCEPT$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef CXX11_TRAILING_RETURN_H +#define CXX11_TRAILING_RETURN_H +#include + +class CXX11TrailingReturn : public QObject +{ + Q_OBJECT +public slots: + inline auto fun() -> void; + inline auto arguments(int i, char b) -> int; + inline auto inlineFunc(int i) -> int + { + return i + 1; + } + + inline auto constRefReturn() -> const CXX11TrailingReturn & + { + return *this; + } + + inline auto constConstRefReturn() const -> const CXX11TrailingReturn & + { + return *this; + } + +signals: + auto trailingSignalReturn(int i) -> void; +}; + +auto CXX11TrailingReturn::fun() -> void +{ + return; +} + +auto CXX11TrailingReturn::arguments(int i, char b) -> int +{ + return i + int(b); +} + +#endif // CXX11_TRAILING_RETURN_H diff --git a/tests/auto/tools/moc/moc.pro b/tests/auto/tools/moc/moc.pro index cafc7bc1..c324b3a8 100644 --- a/tests/auto/tools/moc/moc.pro +++ b/tests/auto/tools/moc/moc.pro @@ -19,6 +19,7 @@ HEADERS += using-namespaces.h no-keywords.h task87883.h c-comments.h backslash-n task234909.h task240368.h pure-virtual-signals.h cxx11-enums.h \ cxx11-final-classes.h \ cxx11-explicit-override-control.h \ + cxx11-trailing-return.h \ forward-declared-param.h \ parse-defines.h \ function-with-attributes.h \ diff --git a/tests/auto/tools/moc/tst_moc.cpp b/tests/auto/tools/moc/tst_moc.cpp index 0f801fe9..c716aead 100644 --- a/tests/auto/tools/moc/tst_moc.cpp +++ b/tests/auto/tools/moc/tst_moc.cpp @@ -62,6 +62,7 @@ #include "cxx11-enums.h" #include "cxx11-final-classes.h" #include "cxx11-explicit-override-control.h" +#include "cxx11-trailing-return.h" #include "parse-defines.h" #include "related-metaobjects-in-namespaces.h" @@ -687,6 +688,7 @@ private slots: void privateClass(); void cxx11Enums_data(); void cxx11Enums(); + void cxx11TrailingReturn(); void returnRefs(); void memberProperties_data(); void memberProperties(); @@ -2200,6 +2202,30 @@ void tst_Moc::warnings_data() << QString() << QString("standard input:2: Error: Plugin Metadata file \"does.not.exists\" does not exist. Declaration will be ignored"); + QTest::newRow("Auto-declared, missing trailing return") + << QByteArray("class X { \n public slots: \n auto fun() { return 1; } };") + << QStringList() + << 1 + << QString() + << QString("standard input:3: Error: Function declared with auto as return type but missing trailing return type. Return type deduction is not supported."); + + QTest::newRow("Auto-declared, volatile auto as trailing return type") + << QByteArray("class X { \n public slots: \n auto fun() -> volatile auto { return 1; } };") + << QStringList() + << 1 + << QString() + << QString("standard input:3: Error: Function declared with auto as return type but missing trailing return type. Return type deduction is not supported."); + + // We don't currently support the decltype keyword, so it's not the same error as above. + // The test is just here to make sure this keeps generating an error until return type deduction + // is supported. + QTest::newRow("Auto-declared, decltype in trailing return type") + << QByteArray("class X { \n public slots: \n auto fun() -> decltype(0+1) { return 1; } };") + << QStringList() + << 1 + << QString() + << QString("standard input:3: Parse error at \"decltype\""); + #ifdef Q_OS_LINUX // Limit to Linux because the error message is platform-dependent QTest::newRow("Q_PLUGIN_METADATA: unreadable file") << QByteArray("class X { \n Q_PLUGIN_METADATA(FILE \".\") \n };") @@ -2329,6 +2355,18 @@ void tst_Moc::cxx11Enums() QCOMPARE(meta->enumerator(idx).isScoped(), isScoped); } +void tst_Moc::cxx11TrailingReturn() +{ + CXX11TrailingReturn retClass; + const QMetaObject *mobj = retClass.metaObject(); + QVERIFY(mobj->indexOfSlot("fun()") != -1); + QVERIFY(mobj->indexOfSlot("arguments(int,char)") != -1); + QVERIFY(mobj->indexOfSlot("inlineFunc(int)") != -1); + QVERIFY(mobj->indexOfSlot("constRefReturn()") != -1); + QVERIFY(mobj->indexOfSlot("constConstRefReturn()") != -1); + QVERIFY(mobj->indexOfSignal("trailingSignalReturn(int)") != -1); +} + void tst_Moc::returnRefs() { TestClass tst; diff --git a/tests/auto/tools/uic/baseline/config.ui.py b/tests/auto/tools/uic/baseline/config.ui.py index 8cf1600b..d8f1dec3 100644 --- a/tests/auto/tools/uic/baseline/config.ui.py +++ b/tests/auto/tools/uic/baseline/config.ui.py @@ -36,9 +36,9 @@ ## WARNING! All changes made in this file will be lost when recompiling UI file! ################################################################################ -from PySide2.QtCore import * -from PySide2.QtGui import * -from PySide2.QtWidgets import * +from PySide2.QtCore import * # type: ignore +from PySide2.QtGui import * # type: ignore +from PySide2.QtWidgets import * # type: ignore from gammaview import GammaView diff --git a/tests/auto/widgets/dialogs/qfilesystemmodel/tst_qfilesystemmodel.cpp b/tests/auto/widgets/dialogs/qfilesystemmodel/tst_qfilesystemmodel.cpp index 2c0b3f2b..51bed6dd 100644 --- a/tests/auto/widgets/dialogs/qfilesystemmodel/tst_qfilesystemmodel.cpp +++ b/tests/auto/widgets/dialogs/qfilesystemmodel/tst_qfilesystemmodel.cpp @@ -226,6 +226,21 @@ void tst_QFileSystemModel::rootPath() QCOMPARE(rootChanged.count(), oldCount + 1); QCOMPARE(model->rootDirectory().absolutePath(), newdir.path()); } + +#ifdef Q_OS_WIN + // check case insensitive root node on windows, tests QTBUG-71701 + QModelIndex index = model->setRootPath(QString("\\\\localhost\\c$")); + QVERIFY(index.isValid()); + QCOMPARE(model->rootPath(), QString("//localhost/c$")); + + index = model->setRootPath(QString("\\\\localhost\\C$")); + QVERIFY(index.isValid()); + QCOMPARE(model->rootPath(), QString("//localhost/C$")); + + index = model->setRootPath(QString("\\\\LOCALHOST\\C$")); + QVERIFY(index.isValid()); + QCOMPARE(model->rootPath(), QString("//LOCALHOST/C$")); +#endif } void tst_QFileSystemModel::readOnly() diff --git a/tests/auto/widgets/graphicsview/qgraphicsview/tst_qgraphicsview.cpp b/tests/auto/widgets/graphicsview/qgraphicsview/tst_qgraphicsview.cpp index db7d1449..eaa00d91 100644 --- a/tests/auto/widgets/graphicsview/qgraphicsview/tst_qgraphicsview.cpp +++ b/tests/auto/widgets/graphicsview/qgraphicsview/tst_qgraphicsview.cpp @@ -223,6 +223,7 @@ private slots: void replayMouseMove(); void itemsUnderMouse(); void embeddedViews(); + void embeddedViewsWithFocus(); void scrollAfterResize_data(); void scrollAfterResize(); void moveItemWhileScrolling_data(); @@ -3519,6 +3520,60 @@ void tst_QGraphicsView::embeddedViews() delete v1; } +/*! + Verify that a nested graphics view and embedded widgets receive window + activation and focus correctly. + + See QTBUG-94091. +*/ +void tst_QGraphicsView::embeddedViewsWithFocus() +{ + class FocusWidget : public QWidget + { + public: + FocusWidget() { setFocusPolicy(Qt::StrongFocus); } + QSize sizeHint() const override { return QSize(100, 100); } + + int focusCount = 0; + protected: + void mousePressEvent(QMouseEvent *) override {} // accept event to avoid warning + void focusInEvent(QFocusEvent *) override { ++focusCount; } + void focusOutEvent(QFocusEvent *) override { --focusCount; } + }; + + QGraphicsScene *innerScene = new QGraphicsScene; + FocusWidget *innerWidget = new FocusWidget; + innerScene->addWidget(innerWidget); + QGraphicsView *innerView = new QGraphicsView(innerScene); + + QGraphicsScene outerScene; + FocusWidget *outerWidget = new FocusWidget; + QGraphicsProxyWidget *outerProxy = outerScene.addWidget(outerWidget); + QGraphicsProxyWidget *nestedProxy = outerScene.addWidget(innerView); + outerProxy->setPos(0, 0); + nestedProxy->setPos(0, outerWidget->sizeHint().height()); + QGraphicsView outerView(&outerScene); + outerView.show(); + outerView.activateWindow(); + QVERIFY(QTest::qWaitForWindowActive(&outerView)); + const QPoint outerCenter(QPoint(innerWidget->sizeHint().width() / 2, + innerWidget->sizeHint().height() / 2)); + const QPoint innerCenter(outerCenter + QPoint(0, innerWidget->sizeHint().height())); + QCOMPARE(outerView.itemAt(outerCenter), outerProxy); + QCOMPARE(outerView.itemAt(innerCenter), nestedProxy); + QVERIFY(outerScene.isActive()); + QVERIFY(innerScene->isActive()); + + QCOMPARE(outerWidget->focusCount, 0); + QCOMPARE(innerWidget->focusCount, 0); + QTest::mouseClick(outerView.viewport(), Qt::LeftButton, {}, outerCenter); + QCOMPARE(outerWidget->focusCount, 1); + QCOMPARE(innerWidget->focusCount, 0); + QTest::mouseClick(outerView.viewport(), Qt::LeftButton, {}, innerCenter); + QCOMPARE(outerWidget->focusCount, 0); + QCOMPARE(innerWidget->focusCount, 1); +} + void tst_QGraphicsView::scrollAfterResize_data() { QTest::addColumn("reverse"); diff --git a/tests/auto/widgets/itemviews/qabstractitemview/tst_qabstractitemview.cpp b/tests/auto/widgets/itemviews/qabstractitemview/tst_qabstractitemview.cpp index 0bdf61e1..56448c17 100644 --- a/tests/auto/widgets/itemviews/qabstractitemview/tst_qabstractitemview.cpp +++ b/tests/auto/widgets/itemviews/qabstractitemview/tst_qabstractitemview.cpp @@ -47,6 +47,7 @@ #include #include #include +#include #include #include #include @@ -150,6 +151,10 @@ private slots: void checkFocusAfterActivationChanges_data(); void checkFocusAfterActivationChanges(); void dragSelectAfterNewPress(); + void dragWithSecondClick_data(); + void dragWithSecondClick(); + void clickAfterDoubleClick(); + private: static QAbstractItemView *viewFromString(const QByteArray &viewType, QWidget *parent = nullptr) { @@ -2511,5 +2516,134 @@ void tst_QAbstractItemView::dragSelectAfterNewPress() QVERIFY(selected.contains(model.index(i, 0))); } +void tst_QAbstractItemView::dragWithSecondClick_data() +{ + QTest::addColumn("viewClass"); + QTest::addColumn("doubleClick"); + for (QString viewClass : {"QListView", "QTreeView"}) { + QTest::addRow("DoubleClick") << viewClass << true; + QTest::addRow("Two Single Clicks") << viewClass << false; + } +} + +// inject the ability to record which indexes get dragged into any QAbstractItemView class +struct DragRecorder +{ + virtual ~DragRecorder() = default; + bool dragStarted = false; + QModelIndexList draggedIndexes; + QAbstractItemView *view; +}; + +template +class DragRecorderView : public ViewClass, public DragRecorder +{ +public: + DragRecorderView() + { view = this; } +protected: + void startDrag(Qt::DropActions) override + { + draggedIndexes = ViewClass::selectedIndexes(); + dragStarted = true; + } +}; + +void tst_QAbstractItemView::dragWithSecondClick() +{ + QFETCH(QString, viewClass); + QFETCH(bool, doubleClick); + + QStandardItemModel model; + QStandardItem *parentItem = model.invisibleRootItem(); + for (int i = 0; i < 10; ++i) { + QStandardItem *item = new QStandardItem(QString("item %0").arg(i)); + item->setDragEnabled(true); + item->setEditable(false); + parentItem->appendRow(item); + } + + std::unique_ptr dragRecorder; + if (viewClass == "QTreeView") + dragRecorder.reset(new DragRecorderView); + else if (viewClass == "QListView") + dragRecorder.reset(new DragRecorderView); + + QAbstractItemView *view = dragRecorder->view; + view->setModel(&model); + view->setFixedSize(160, 650); // Minimum width for windows with frame on Windows 8 + view->setSelectionMode(QAbstractItemView::MultiSelection); + view->setDragDropMode(QAbstractItemView::InternalMove); + centerOnScreen(view); + moveCursorAway(view); + view->show(); + QVERIFY(QTest::qWaitForWindowExposed(view)); + + QModelIndex index0 = model.index(0, 0); + QModelIndex index1 = model.index(1, 0); + // Select item 0 using a single click + QTest::mouseClick(view->viewport(), Qt::LeftButton, Qt::NoModifier, + view->visualRect(index0).center()); + QCOMPARE(view->currentIndex(), index0); + + if (doubleClick) { + // press on same item within the double click interval + QTest::mouseDClick(view->viewport(), Qt::LeftButton, Qt::NoModifier, + view->visualRect(index0).center()); + } else { + // or on different item with a slow second press + QTest::mousePress(view->viewport(), Qt::LeftButton, Qt::NoModifier, + view->visualRect(index1).center()); + } + // then drag far enough with left button held + const QPoint dragTo = view->visualRect(index1).center() + + QPoint(2 * QApplication::startDragDistance(), + 2 * QApplication::startDragDistance()); + QMouseEvent mouseMoveEvent(QEvent::MouseMove, dragTo, + Qt::NoButton, Qt::LeftButton, Qt::NoModifier); + QVERIFY(QApplication::sendEvent(view->viewport(), &mouseMoveEvent)); + // twice since the view will first enter dragging state, then start the drag + // (not necessary to actually move the mouse) + QVERIFY(QApplication::sendEvent(view->viewport(), &mouseMoveEvent)); + QVERIFY(dragRecorder->dragStarted); + QTest::mouseRelease(view->viewport(), Qt::LeftButton, Qt::NoModifier, dragTo); +} + +void tst_QAbstractItemView::clickAfterDoubleClick() +{ + QTableWidget view(5, 5); + view.horizontalHeader()->hide(); + view.verticalHeader()->hide(); + view.setEditTriggers(QAbstractItemView::NoEditTriggers); + view.show(); + QVERIFY(QTest::qWaitForWindowExposed(&view)); + const QModelIndex index = view.model()->index(1, 1); + QVERIFY(index.isValid()); + const QPoint clickPoint = view.visualRect(index).center(); + + // must use the QWindow overloads so that modality is respected + QWindow *window = view.window()->windowHandle(); + int clickCount = 0; + + connect(&view, &QAbstractItemView::doubleClicked, [&]{ + QDialog dialog(&view); + dialog.setModal(true); + QTimer::singleShot(0, [&]{ dialog.close(); }); + dialog.exec(); + }); + connect(&view, &QAbstractItemView::clicked, [&]{ + ++clickCount; + }); + + QTest::mouseClick(window, Qt::LeftButton, {}, clickPoint); + QCOMPARE(clickCount, 1); + // generates a click followed by a double click; double click opens + // dialog that eats second release + QTest::mouseDClick(window, Qt::LeftButton, {}, clickPoint); + QCOMPARE(clickCount, 2); + QTest::mouseClick(window, Qt::LeftButton, {}, clickPoint); + QCOMPARE(clickCount, 3); +} + QTEST_MAIN(tst_QAbstractItemView) #include "tst_qabstractitemview.moc" diff --git a/tests/auto/widgets/itemviews/qlistview/tst_qlistview.cpp b/tests/auto/widgets/itemviews/qlistview/tst_qlistview.cpp index dadb9f83..875b2c08 100644 --- a/tests/auto/widgets/itemviews/qlistview/tst_qlistview.cpp +++ b/tests/auto/widgets/itemviews/qlistview/tst_qlistview.cpp @@ -169,6 +169,8 @@ private slots: void itemAlignment(); void internalDragDropMove_data(); void internalDragDropMove(); + void scrollOnRemove_data(); + void scrollOnRemove(); }; // Testing get/set functions @@ -2550,6 +2552,7 @@ void tst_QListView::internalDragDropMove_data() | Qt::ItemIsEditable | Qt::ItemIsDragEnabled; + const QStringList unchanged = QStringList{"0", "1", "2", "3", "4", "5", "6", "7", "8", "9"}; const QStringList reordered = QStringList{"0", "2", "3", "4", "5", "6", "7", "8", "9", "1"}; const QStringList replaced = QStringList{"0", "2", "3", "4", "1", "6", "7", "8", "9"}; @@ -2564,7 +2567,8 @@ void tst_QListView::internalDragDropMove_data() << Qt::MoveAction << defaultFlags << modelMoves - << reordered; + // listview in IconMode doesn't change the model + << ((viewMode == QListView::IconMode && !modelMoves) ? unchanged : reordered); QTest::newRow((rowName + ", only move").constData()) << viewMode @@ -2573,7 +2577,8 @@ void tst_QListView::internalDragDropMove_data() << Qt::MoveAction << defaultFlags << modelMoves - << reordered; + // listview in IconMode doesn't change the model + << ((viewMode == QListView::IconMode && !modelMoves) ? unchanged : reordered); QTest::newRow((rowName + ", replace item").constData()) << viewMode @@ -2719,5 +2724,72 @@ void tst_QListView::internalDragDropMove() } +void tst_QListView::scrollOnRemove_data() +{ + QTest::addColumn("viewMode"); + QTest::addColumn("selectionMode"); + + const QMetaObject &mo = QListView::staticMetaObject; + const auto viewModeEnum = mo.enumerator(mo.indexOfEnumerator("ViewMode")); + const auto selectionModeEnum = mo.enumerator(mo.indexOfEnumerator("SelectionMode")); + for (auto viewMode : { QListView::ListMode, QListView::IconMode }) { + const char *viewModeName = viewModeEnum.valueToKey(viewMode); + for (int index = 0; index < selectionModeEnum.keyCount(); ++index) { + const auto selectionMode = QAbstractItemView::SelectionMode(selectionModeEnum.value(index)); + const char *selectionModeName = selectionModeEnum.valueToKey(selectionMode); + QTest::addRow("%s, %s", viewModeName, selectionModeName) << viewMode << selectionMode; + } + } +} + +void tst_QListView::scrollOnRemove() +{ + QFETCH(QListView::ViewMode, viewMode); + QFETCH(QAbstractItemView::SelectionMode, selectionMode); + + QPixmap pixmap; + if (viewMode == QListView::IconMode) { + pixmap = QPixmap(25, 25); + pixmap.fill(Qt::red); + } + + QStandardItemModel model; + for (int i = 0; i < 50; ++i) { + QStandardItem *item = new QStandardItem(QString::number(i)); + item->setIcon(pixmap); + model.appendRow(item); + } + + QWidget widget; + QListView view(&widget); + view.setFixedSize(100, 100); + view.setAutoScroll(true); + if (viewMode == QListView::IconMode) + view.setWrapping(true); + view.setModel(&model); + view.setSelectionMode(selectionMode); + view.setViewMode(viewMode); + + widget.show(); + QVERIFY(QTest::qWaitForWindowExposed(&widget)); + + QCOMPARE(view.verticalScrollBar()->value(), 0); + const QModelIndex item25 = model.index(25, 0); + view.scrollTo(item25); + QTRY_VERIFY(view.verticalScrollBar()->value() > 0); // layout and scrolling are delayed + const int item25Position = view.verticalScrollBar()->value(); + // selecting a fully visible item shouldn't scroll + view.selectionModel()->setCurrentIndex(item25, QItemSelectionModel::SelectCurrent); + QTRY_COMPARE(view.verticalScrollBar()->value(), item25Position); + + // removing the selected item might scroll if another item is selected + model.removeRow(25); + + // if nothing is selected now, then the view should not have scrolled + if (!view.selectionModel()->selectedIndexes().count()) + QTRY_COMPARE(view.verticalScrollBar()->value(), item25Position); +} + + QTEST_MAIN(tst_QListView) #include "tst_qlistview.moc" diff --git a/tests/auto/widgets/itemviews/qtreeview/tst_qtreeview.cpp b/tests/auto/widgets/itemviews/qtreeview/tst_qtreeview.cpp index 52fac891..b75defe1 100644 --- a/tests/auto/widgets/itemviews/qtreeview/tst_qtreeview.cpp +++ b/tests/auto/widgets/itemviews/qtreeview/tst_qtreeview.cpp @@ -241,6 +241,7 @@ private slots: void taskQTBUG_7232_AllowUserToControlSingleStep(); void taskQTBUG_8376(); void taskQTBUG_61476(); + void taskQTBUG_42469_crash(); void testInitialFocus(); void fetchUntilScreenFull(); }; @@ -4966,6 +4967,29 @@ void tst_QTreeView::taskQTBUG_61476() QCOMPARE(lastTopLevel->checkState(), Qt::Checked); } +void tst_QTreeView::taskQTBUG_42469_crash() +{ + QTreeWidget treeWidget; + QTreeWidgetItem *itemOne = new QTreeWidgetItem(QStringList("item1")); + QTreeWidgetItem *itemTwo = new QTreeWidgetItem(QStringList("item2")); + treeWidget.addTopLevelItem(itemOne); + treeWidget.addTopLevelItem(itemTwo); + treeWidget.topLevelItem(1)->addChild(new QTreeWidgetItem(QStringList("child1"))); + + treeWidget.setAnimated(true); + QObject::connect(&treeWidget, &QTreeWidget::itemExpanded, [&](QTreeWidgetItem* p_item) { + auto tempCount = treeWidget.topLevelItemCount(); + for (int j = 0; j < tempCount; ++j) + if (treeWidget.topLevelItem(j) != p_item) { + auto temp = treeWidget.topLevelItem(j); + temp->setHidden(true); + } + }); + + treeWidget.show(); + itemTwo->setExpanded(true); +} + void tst_QTreeView::fetchUntilScreenFull() { class TreeModel : public QAbstractItemModel diff --git a/tests/auto/widgets/itemviews/qtreewidget/tst_qtreewidget.cpp b/tests/auto/widgets/itemviews/qtreewidget/tst_qtreewidget.cpp index 7da56ab7..b129868b 100644 --- a/tests/auto/widgets/itemviews/qtreewidget/tst_qtreewidget.cpp +++ b/tests/auto/widgets/itemviews/qtreewidget/tst_qtreewidget.cpp @@ -151,6 +151,7 @@ private slots: void getMimeDataWithInvalidItem(); void testVisualItemRect(); void reparentHiddenItem(); + void persistentChildIndex(); #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) void clearItemData(); #endif @@ -3597,6 +3598,21 @@ void tst_QTreeWidget::reparentHiddenItem() QVERIFY(grandChild->isHidden()); } +void tst_QTreeWidget::persistentChildIndex() // QTBUG-90030 +{ + QTreeWidget tree; + QTreeWidgetItem *toplevel = new QTreeWidgetItem(QStringList{QStringLiteral("toplevel")}); + tree.addTopLevelItem(toplevel); + QModelIndex firstIndex = tree.model()->index(0, 0); + QTreeWidgetItem *child1 = new QTreeWidgetItem(QStringList{QStringLiteral("child1")}); + QTreeWidgetItem *child2 = new QTreeWidgetItem(QStringList{QStringLiteral("child2")}); + toplevel->addChildren({child1, child2}); + QPersistentModelIndex persistentIdx = tree.model()->index(1, 0, firstIndex); + QCOMPARE(persistentIdx.data().toString(), QStringLiteral("child2")); + tree.model()->removeRows(0, 1, firstIndex); + QCOMPARE(persistentIdx.data().toString(), QStringLiteral("child2")); +} + #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) void tst_QTreeWidget::clearItemData() { diff --git a/tests/auto/widgets/kernel/qapplication/tst_qapplication.cpp b/tests/auto/widgets/kernel/qapplication/tst_qapplication.cpp index 8e814255..a3b8ef78 100644 --- a/tests/auto/widgets/kernel/qapplication/tst_qapplication.cpp +++ b/tests/auto/widgets/kernel/qapplication/tst_qapplication.cpp @@ -1493,7 +1493,12 @@ void tst_QApplication::desktopSettingsAware() { #if QT_CONFIG(process) QProcess testProcess; - testProcess.start("./desktopsettingsaware_helper"); +#ifdef Q_OS_MACOS + QStringList environment = QProcess::systemEnvironment(); + environment += QLatin1String("QT_MAC_DISABLE_FOREGROUND_APPLICATION_TRANSFORM=1"); + testProcess.setEnvironment(environment); +#endif + testProcess.start("desktopsettingsaware_helper"); QVERIFY2(testProcess.waitForStarted(), qPrintable(QString::fromLatin1("Cannot start 'desktopsettingsaware_helper': %1").arg(testProcess.errorString()))); QVERIFY(testProcess.waitForFinished(10000)); @@ -2447,7 +2452,7 @@ void tst_QApplication::qtbug_12673() #if QT_CONFIG(process) QProcess testProcess; QStringList arguments; - testProcess.start("./modal_helper", arguments); + testProcess.start("modal_helper", arguments); QVERIFY2(testProcess.waitForStarted(), qPrintable(QString::fromLatin1("Cannot start 'modal_helper': %1").arg(testProcess.errorString()))); QVERIFY(testProcess.waitForFinished(20000)); diff --git a/tests/auto/widgets/kernel/qgesturerecognizer/BLACKLIST b/tests/auto/widgets/kernel/qgesturerecognizer/BLACKLIST new file mode 100644 index 00000000..f9104cc3 --- /dev/null +++ b/tests/auto/widgets/kernel/qgesturerecognizer/BLACKLIST @@ -0,0 +1,3 @@ +# See qtbase/src/testlib/qtestblacklist.cpp for format +[panGesture] +linux diff --git a/tests/auto/widgets/kernel/qlayout/tst_qlayout.cpp b/tests/auto/widgets/kernel/qlayout/tst_qlayout.cpp index c8fe1841..c38ddbf4 100644 --- a/tests/auto/widgets/kernel/qlayout/tst_qlayout.cpp +++ b/tests/auto/widgets/kernel/qlayout/tst_qlayout.cpp @@ -69,6 +69,7 @@ private slots: void controlTypes2(); void adjustSizeShouldMakeSureLayoutIsActivated(); void testRetainSizeWhenHidden(); + void removeWidget(); }; tst_QLayout::tst_QLayout() @@ -381,5 +382,28 @@ void tst_QLayout::testRetainSizeWhenHidden() QCOMPARE(widget.sizeHint().height(), normalHeight); } +void tst_QLayout::removeWidget() +{ + QHBoxLayout layout; + QCOMPARE(layout.count(), 0); + QWidget w; + layout.addWidget(&w); + QCOMPARE(layout.count(), 1); + layout.removeWidget(&w); + QCOMPARE(layout.count(), 0); + + QPointer childLayout(new QHBoxLayout); + layout.addLayout(childLayout); + QCOMPARE(layout.count(), 1); + + layout.removeWidget(nullptr); + QCOMPARE(layout.count(), 1); + + layout.removeItem(childLayout); + QCOMPARE(layout.count(), 0); + + QVERIFY(!childLayout.isNull()); +} + QTEST_MAIN(tst_QLayout) #include "tst_qlayout.moc" diff --git a/tests/auto/widgets/kernel/qwidget/BLACKLIST b/tests/auto/widgets/kernel/qwidget/BLACKLIST index 70ea8433..1f1e3804 100644 --- a/tests/auto/widgets/kernel/qwidget/BLACKLIST +++ b/tests/auto/widgets/kernel/qwidget/BLACKLIST @@ -12,6 +12,7 @@ ubuntu-16.04 rhel-7.6 opensuse-leap ubuntu +sles [raise] opensuse-leap # QTBUG-68175 @@ -24,6 +25,8 @@ macos osx [optimizedResize_topLevel] osx +[render_windowOpacity] +macos arm [render_systemClip] osx [showMinimizedKeepsFocus] @@ -37,6 +40,7 @@ ubuntu-16.04 rhel-7.6 opensuse-leap ubuntu +sles-15 [windowState] # QTBUG-75270 winrt diff --git a/tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp b/tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp index 431433c7..2b11aec9 100644 --- a/tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp +++ b/tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp @@ -186,6 +186,7 @@ private slots: void defaultTabOrder(); void reverseTabOrder(); void tabOrderWithProxy(); + void tabOrderWithProxyDisabled(); void tabOrderWithCompoundWidgets(); void tabOrderWithCompoundWidgetsNoFocusPolicy(); void tabOrderNoChange(); @@ -366,6 +367,8 @@ private slots: void focusWidget_task254563(); void rectOutsideCoordinatesLimit_task144779(); void setGraphicsEffect(); + void render_graphicsEffect_data(); + void render_graphicsEffect(); #ifdef QT_BUILD_INTERNAL void destroyBackingStore(); @@ -421,6 +424,8 @@ private slots: void receivesLanguageChangeEvent(); void deleteWindowInCloseEvent(); + void activateWhileModalHidden(); + private: bool ensureScreenSize(int width, int height); @@ -2004,6 +2009,57 @@ void tst_QWidget::tabOrderWithProxy() QVERIFY(firstEdit->hasFocus()); } +void tst_QWidget::tabOrderWithProxyDisabled() +{ + Container container; + container.setWindowTitle(QLatin1String(QTest::currentTestFunction())); + + QLineEdit lineEdit1; + lineEdit1.setObjectName("lineEdit1"); + + QWidget containingWidget; + containingWidget.setFocusPolicy(Qt::StrongFocus); + auto *containingLayout = new QVBoxLayout; + QLineEdit lineEdit2; + lineEdit2.setObjectName("lineEdit2"); + QLineEdit lineEdit3; + lineEdit3.setObjectName("lineEdit3"); + containingLayout->addWidget(&lineEdit2); + containingLayout->addWidget(&lineEdit3); + containingWidget.setLayout(containingLayout); + containingWidget.setFocusProxy(&lineEdit2); + lineEdit2.setEnabled(false); + + container.box->addWidget(&lineEdit1); + container.box->addWidget(&containingWidget); + + container.show(); + container.activateWindow(); + + QApplication::setActiveWindow(&container); + if (!QTest::qWaitForWindowActive(&container)) + QSKIP("Window failed to activate, skipping test"); + + QVERIFY2(lineEdit1.hasFocus(), + qPrintable(QApplication::focusWidget()->objectName())); + container.tab(); + QVERIFY2(!lineEdit2.hasFocus(), + qPrintable(QApplication::focusWidget()->objectName())); + QVERIFY2(lineEdit3.hasFocus(), + qPrintable(QApplication::focusWidget()->objectName())); + container.tab(); + QVERIFY2(lineEdit1.hasFocus(), + qPrintable(QApplication::focusWidget()->objectName())); + container.backTab(); + QVERIFY2(lineEdit3.hasFocus(), + qPrintable(QApplication::focusWidget()->objectName())); + container.backTab(); + QVERIFY2(!lineEdit2.hasFocus(), + qPrintable(QApplication::focusWidget()->objectName())); + QVERIFY2(lineEdit1.hasFocus(), + qPrintable(QApplication::focusWidget()->objectName())); +} + void tst_QWidget::tabOrderWithCompoundWidgets() { if (QGuiApplication::platformName().startsWith(QLatin1String("wayland"), Qt::CaseInsensitive)) @@ -10094,6 +10150,157 @@ void tst_QWidget::setGraphicsEffect() QVERIFY(!blurEffect); } + +class TestGraphicsEffect : public QGraphicsEffect +{ +public: + TestGraphicsEffect(QObject *parent = nullptr) + : QGraphicsEffect(parent) + { + m_pattern = QPixmap(10, 10); + m_pattern.fill(Qt::lightGray); + QPainter p(&m_pattern); + p.fillRect(QRectF(0, 0, 5, 5), QBrush(Qt::darkGray)); + p.fillRect(QRectF(5, 5, 5, 5), QBrush(Qt::darkGray)); + } + void setExtent(int extent) + { + m_extent = extent; + } + QRectF boundingRectFor(const QRectF &sr) const override + { + return QRectF(sr.x() - m_extent, sr.y() - m_extent, + sr.width() + 2 * m_extent, sr.height() + 2 * m_extent); + } +protected: + void draw(QPainter *painter) override + { + QBrush brush; + brush.setTexture(m_pattern); + brush.setStyle(Qt::TexturePattern); + QPaintDevice *p = painter->device(); + painter->fillRect(QRect(-m_extent, -m_extent, + p->width() + m_extent, p->height() + m_extent), brush); + } + QPixmap m_pattern; + int m_extent = 0; +}; + +static QImage fillExpected1() +{ + QImage expected(QSize(40, 40), QImage::Format_RGB32); + QPainter p(&expected); + p.fillRect(QRect{{0, 0}, expected.size()}, QBrush(Qt::gray)); + p.fillRect(QRect(10, 10, 10, 10), QBrush(Qt::red)); + p.fillRect(QRect(20, 20, 10, 10), QBrush(Qt::blue)); + return expected; +} +static QImage fillExpected2() +{ + QImage expected = fillExpected1(); + QPainter p(&expected); + p.fillRect(QRect(10, 10, 5, 5), QBrush(Qt::darkGray)); + p.fillRect(QRect(15, 15, 5, 5), QBrush(Qt::darkGray)); + p.fillRect(QRect(15, 10, 5, 5), QBrush(Qt::lightGray)); + p.fillRect(QRect(10, 15, 5, 5), QBrush(Qt::lightGray)); + return expected; +} +static QImage fillExpected3() +{ + QImage expected(QSize(40, 40), QImage::Format_RGB32); + QPixmap pattern; + pattern = QPixmap(10, 10); + pattern.fill(Qt::lightGray); + QPainter p(&pattern); + p.fillRect(QRectF(0, 0, 5, 5), QBrush(Qt::darkGray)); + p.fillRect(QRectF(5, 5, 5, 5), QBrush(Qt::darkGray)); + QBrush brush; + brush.setTexture(pattern); + brush.setStyle(Qt::TexturePattern); + QPainter p2(&expected); + p2.fillRect(QRect{{0, 0}, expected.size()}, brush); + return expected; +} +static QImage fillExpected4() +{ + QImage expected = fillExpected1(); + QPixmap pattern; + pattern = QPixmap(10, 10); + pattern.fill(Qt::lightGray); + QPainter p(&pattern); + p.fillRect(QRectF(0, 0, 5, 5), QBrush(Qt::darkGray)); + p.fillRect(QRectF(5, 5, 5, 5), QBrush(Qt::darkGray)); + QBrush brush; + brush.setTexture(pattern); + brush.setStyle(Qt::TexturePattern); + QPainter p2(&expected); + p2.fillRect(QRect{{15, 15}, QSize{20, 20}}, brush); + return expected; +} + +void tst_QWidget::render_graphicsEffect_data() +{ + QTest::addColumn("expected"); + QTest::addColumn("topLevelEffect"); + QTest::addColumn("child1Effect"); + QTest::addColumn("child2Effect"); + QTest::addColumn("extent"); + + QTest::addRow("no_effect") << fillExpected1() << false << false << false << 0; + QTest::addRow("first_child_effect") << fillExpected2() << false << true << false << 0; + QTest::addRow("top_level_effect") << fillExpected3() << true << false << false << 0; + QTest::addRow("effect_with_extent") << fillExpected4() << false << false << true << 5; +} + +void tst_QWidget::render_graphicsEffect() +{ + QFETCH(QImage, expected); + QFETCH(bool, topLevelEffect); + QFETCH(bool, child1Effect); + QFETCH(bool, child2Effect); + QFETCH(int, extent); + + QScopedPointer topLevel(new QWidget); + topLevel->setPalette(Qt::gray); + topLevel->resize(40, 40); + topLevel->setWindowTitle(QLatin1String(QTest::currentTestFunction()) + QLatin1String("::") + + QLatin1String(QTest::currentDataTag())); + + // Render widget with 2 child widgets + QImage image(topLevel->size(), QImage::Format_RGB32); + image.fill(QColor(Qt::gray).rgb()); + + QPainter painter(&image); + + QWidget *childWidget1(new QWidget(topLevel.data())); + childWidget1->setAutoFillBackground(true); + childWidget1->setPalette(Qt::red); + childWidget1->resize(10, 10); + childWidget1->move(10, 10); + QWidget *childWidget2(new QWidget(topLevel.data())); + childWidget2->setAutoFillBackground(true); + childWidget2->setPalette(Qt::blue); + childWidget2->resize(10, 10); + childWidget2->move(20, 20); + + TestGraphicsEffect *graphicsEffect(new TestGraphicsEffect(topLevel.data())); + if (topLevelEffect) + topLevel->setGraphicsEffect(graphicsEffect); + if (child1Effect) + childWidget1->setGraphicsEffect(graphicsEffect); + if (child2Effect) + childWidget2->setGraphicsEffect(graphicsEffect); + graphicsEffect->setExtent(extent); + + // Render without effect + topLevel->render(&painter); +#ifdef RENDER_DEBUG + image.save("render_GraphicsEffect" + QTest::currentDataTag() + ".png"); + expected.save("render_GraphicsEffect_expected" + QTest::currentDataTag() + ".png"); +#endif + QCOMPARE(image, expected); +} + void tst_QWidget::activateWindow() { if (!QGuiApplicationPrivate::platformIntegration()->hasCapability(QPlatformIntegration::WindowActivation)) @@ -11803,5 +12010,24 @@ void tst_QWidget::deleteWindowInCloseEvent() QVERIFY(true); } +void tst_QWidget::activateWhileModalHidden() +{ + QDialog dialog; + dialog.setWindowModality(Qt::ApplicationModal); + dialog.show(); + QVERIFY(QTest::qWaitForWindowActive(&dialog)); + QVERIFY(dialog.isActiveWindow()); + QCOMPARE(QApplication::activeWindow(), &dialog); + + dialog.hide(); + QTRY_VERIFY(!dialog.isVisible()); + + QMainWindow window; + window.show(); + QVERIFY(QTest::qWaitForWindowActive(&window)); + QVERIFY(window.isActiveWindow()); + QCOMPARE(QApplication::activeWindow(), &window); +} + QTEST_MAIN(tst_QWidget) #include "tst_qwidget.moc" diff --git a/tests/auto/widgets/kernel/qwidget_window/BLACKLIST b/tests/auto/widgets/kernel/qwidget_window/BLACKLIST index 70a78892..b4d938d6 100644 --- a/tests/auto/widgets/kernel/qwidget_window/BLACKLIST +++ b/tests/auto/widgets/kernel/qwidget_window/BLACKLIST @@ -5,3 +5,7 @@ ubuntu-16.04 [mouseMoveWithPopup] winrt + +# QTBUG-96270 +[tst_paintEventOnSecondShow] +opensuse diff --git a/tests/auto/widgets/kernel/qwidget_window/tst_qwidget_window.cpp b/tests/auto/widgets/kernel/qwidget_window/tst_qwidget_window.cpp index b11faef3..586b4293 100644 --- a/tests/auto/widgets/kernel/qwidget_window/tst_qwidget_window.cpp +++ b/tests/auto/widgets/kernel/qwidget_window/tst_qwidget_window.cpp @@ -405,6 +405,7 @@ void tst_QWidget_window::tst_paintEventOnSecondShow() { PaintTestWidget w; w.show(); + QVERIFY(QTest::qWaitForWindowExposed(&w)); w.hide(); w.paintEventCount = 0; diff --git a/tests/auto/widgets/util/qcompleter/tst_qcompleter.cpp b/tests/auto/widgets/util/qcompleter/tst_qcompleter.cpp index 89c4a747..364bc36d 100644 --- a/tests/auto/widgets/util/qcompleter/tst_qcompleter.cpp +++ b/tests/auto/widgets/util/qcompleter/tst_qcompleter.cpp @@ -113,6 +113,8 @@ private slots: #endif void fileSystemModel_data(); void fileSystemModel(); + void fileDialog_data(); + void fileDialog(); void changingModel_data(); void changingModel(); @@ -695,7 +697,26 @@ void tst_QCompleter::fileSystemModel() #ifdef Q_OS_WINRT QSKIP("WinRT cannot access directories outside of the application's sandbox"); #endif - //QFileSystemModel is assync. + //QFileSystemModel is async. + filter(true); +} + +/*! + In the file dialog, the completer uses the EditRole. + See QTBUG-94799 +*/ +void tst_QCompleter::fileDialog_data() +{ + fileSystemModel_data(); + completer->setCompletionRole(Qt::EditRole); +} + +void tst_QCompleter::fileDialog() +{ +#ifdef Q_OS_WINRT + QSKIP("WinRT cannot access directories outside of the application's sandbox"); +#endif + //QFileSystemModel is async. filter(true); } diff --git a/tests/auto/widgets/widgets/qabstractscrollarea/tst_qabstractscrollarea.cpp b/tests/auto/widgets/widgets/qabstractscrollarea/tst_qabstractscrollarea.cpp index 01ecfb2c..ec1013a0 100644 --- a/tests/auto/widgets/widgets/qabstractscrollarea/tst_qabstractscrollarea.cpp +++ b/tests/auto/widgets/widgets/qabstractscrollarea/tst_qabstractscrollarea.cpp @@ -37,6 +37,7 @@ #include #include #include +#include class tst_QAbstractScrollArea : public QObject { @@ -57,6 +58,7 @@ private slots: void task214488_layoutDirection(); void margins(); + void resizeWithOvershoot(); }; tst_QAbstractScrollArea::tst_QAbstractScrollArea() @@ -398,5 +400,42 @@ void tst_QAbstractScrollArea::margins() QCOMPARE(area.viewportMargins(), margins); } +void tst_QAbstractScrollArea::resizeWithOvershoot() +{ + QWidget window; + + QScrollArea scrollArea(&window); + scrollArea.setWidget([]{ + QWidget *widget = new QWidget; + widget->setFixedSize(QSize(0, 200)); + return widget; + }()); + scrollArea.setGeometry(0, 20, 100, 100); + + QScroller::grabGesture(&scrollArea, QScroller::LeftMouseButtonGesture); + + window.show(); + QVERIFY(QTest::qWaitForWindowExposed(&window)); + + const QPoint originAtRest = scrollArea.viewport()->pos(); + + QPoint center = scrollArea.viewport()->mapToGlobal(scrollArea.viewport()->rect().center()); + center = window.windowHandle()->mapFromGlobal(center); + QTest::mousePress(window.windowHandle(), Qt::LeftButton, {}, center); + QTest::mouseMove(window.windowHandle(), center + QPoint(0, 50)); + QTRY_COMPARE(scrollArea.viewport()->pos(), originAtRest + QPoint(0, 25)); + QPoint overshootPosition = scrollArea.viewport()->pos(); + + // trigger a layout of the scroll area while there's overshoot + scrollArea.setGeometry(0, 0, 100, 120); + QCOMPARE(scrollArea.viewport()->pos(), overshootPosition); + QTest::mouseRelease(window.windowHandle(), Qt::LeftButton, {}, center + QPoint(0, 50)); + QTRY_COMPARE(scrollArea.viewport()->pos(), originAtRest); + // Process a few more events and verify that the scroll area + // doesn't overcompensate for the overshoot. + QApplication::processEvents(); + QTRY_COMPARE(scrollArea.viewport()->pos(), originAtRest); +} + QTEST_MAIN(tst_QAbstractScrollArea) #include "tst_qabstractscrollarea.moc" diff --git a/tests/auto/widgets/widgets/qcombobox/tst_qcombobox.cpp b/tests/auto/widgets/widgets/qcombobox/tst_qcombobox.cpp index d8bb3493..32437050 100644 --- a/tests/auto/widgets/widgets/qcombobox/tst_qcombobox.cpp +++ b/tests/auto/widgets/widgets/qcombobox/tst_qcombobox.cpp @@ -167,6 +167,7 @@ private slots: void task_QTBUG_52027_mapCompleterIndex(); void checkMenuItemPosWhenStyleSheetIsSet(); void checkEmbeddedLineEditWhenStyleSheetIsSet(); + void propagateStyleChanges(); private: PlatformInputContext m_platformInputContext; @@ -3586,5 +3587,50 @@ void tst_QComboBox::checkEmbeddedLineEditWhenStyleSheetIsSet() qApp->setStyleSheet(oldCss); } +/*! + Tests that the style-based frame style propagates to the internal container + widget of QComboBox when the style changes by verifying that the respective + styleHint is asked for when the style changes. + + See QTBUG-92488 +*/ +void tst_QComboBox::propagateStyleChanges() +{ + class FrameStyle : public QProxyStyle + { + public: + FrameStyle(int frameStyle, QStyle *style = nullptr) + : QProxyStyle(style), frameStyle(frameStyle) + {} + + int styleHint(QStyle::StyleHint hint, const QStyleOption *opt, + const QWidget *widget, QStyleHintReturn *returnData) const + { + if (hint == QStyle::SH_ComboBox_PopupFrameStyle) { + inquired = true; + return frameStyle; + } + return QProxyStyle::styleHint(hint, opt, widget, returnData); + } + + int frameStyle; + mutable bool inquired = false; + }; + + FrameStyle framelessStyle(QFrame::NoFrame); + FrameStyle frameStyle(QFrame::Plain | QFrame::Sunken); + + QComboBox combo; + // container will be created and take settings from this style + combo.setStyle(&framelessStyle); + QVERIFY(framelessStyle.inquired); + combo.addItem(QLatin1String("Open")); + combo.addItem(QLatin1String("Close")); + // needed because of QComboBox's adjustSizeTimer not doing anything otherwise + combo.setSizeAdjustPolicy(QComboBox::AdjustToContents); + combo.setStyle(&frameStyle); + QVERIFY(frameStyle.inquired); +} + QTEST_MAIN(tst_QComboBox) #include "tst_qcombobox.moc" diff --git a/tests/auto/widgets/widgets/qdatetimeedit/tst_qdatetimeedit.cpp b/tests/auto/widgets/widgets/qdatetimeedit/tst_qdatetimeedit.cpp index 456d0d55..c6701479 100644 --- a/tests/auto/widgets/widgets/qdatetimeedit/tst_qdatetimeedit.cpp +++ b/tests/auto/widgets/widgets/qdatetimeedit/tst_qdatetimeedit.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2016 The Qt Company Ltd. +** Copyright (C) 2021 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the test suite of the Qt Toolkit. @@ -1370,19 +1370,19 @@ void tst_QDateTimeEdit::editingRanged() QFETCH(QString, userInput); QFETCH(QDateTime, expected); - QDateTimeEdit *edit; + QScopedPointer edit; if (minTime.isValid()) { - edit = new QDateTimeEdit; + edit.reset(new QDateTimeEdit); edit->setDisplayFormat("dd.MM.yyyy hh:mm"); edit->setDateTimeRange(QDateTime(minDate, minTime), QDateTime(maxDate, maxTime)); } else { - edit = new QDateEdit; + edit.reset(new QDateEdit); edit->setDisplayFormat("dd.MM.yyyy"); edit->setDateRange(minDate, maxDate); } int callCount = 0; - connect(edit, &QDateTimeEdit::dateTimeChanged, [&](const QDateTime &dateTime) { + connect(edit.get(), &QDateTimeEdit::dateTimeChanged, [&](const QDateTime &dateTime) { ++callCount; if (minTime.isValid()) { QVERIFY(dateTime >= QDateTime(minDate, minTime)); @@ -1394,15 +1394,15 @@ void tst_QDateTimeEdit::editingRanged() }); edit->show(); - QApplication::setActiveWindow(edit); - if (!QTest::qWaitForWindowActive(edit)) + QApplication::setActiveWindow(edit.get()); + if (!QTest::qWaitForWindowActive(edit.get())) QSKIP("Failed to make window active, aborting"); edit->setFocus(); // with keyboard tracking, never get a signal with an out-of-range value edit->setKeyboardTracking(true); - QTest::keyClicks(edit, userInput); - QTest::keyClick(edit, Qt::Key_Return); + QTest::keyClicks(edit.get(), userInput); + QTest::keyClick(edit.get(), Qt::Key_Return); QVERIFY(callCount > 0); // QDateTimeEdit blocks these dates from being entered - see QTBUG-65 @@ -1418,12 +1418,10 @@ void tst_QDateTimeEdit::editingRanged() callCount = 0; edit->setKeyboardTracking(false); - QTest::keyClicks(edit, userInput); - QTest::keyClick(edit, Qt::Key_Return); + QTest::keyClicks(edit.get(), userInput); + QTest::keyClick(edit.get(), Qt::Key_Return); QCOMPARE(edit->dateTime(), expected); QCOMPARE(callCount, 1); - - delete edit; } void tst_QDateTimeEdit::wrappingTime_data() @@ -3807,7 +3805,6 @@ void tst_QDateTimeEdit::deleteCalendarWidget() { { // setup - QCalendarWidget *cw = 0; QDateEdit edit; QVERIFY(!edit.calendarWidget()); edit.setCalendarPopup(true); @@ -3815,8 +3812,7 @@ void tst_QDateTimeEdit::deleteCalendarWidget() edit.calendarWidget()->setObjectName("cw1");; // delete - cw = edit.calendarWidget(); - delete cw; + delete edit.calendarWidget(); // it should create a new widget QVERIFY(edit.calendarWidget()); diff --git a/tests/auto/widgets/widgets/qfontcombobox/tst_qfontcombobox.cpp b/tests/auto/widgets/widgets/qfontcombobox/tst_qfontcombobox.cpp index bd3ea568..75f595e9 100644 --- a/tests/auto/widgets/widgets/qfontcombobox/tst_qfontcombobox.cpp +++ b/tests/auto/widgets/widgets/qfontcombobox/tst_qfontcombobox.cpp @@ -261,15 +261,18 @@ void tst_QFontComboBox::writingSystem() // protected void currentFontChanged(QFont const& f) void tst_QFontComboBox::currentFontChanged() { - SubQFontComboBox box; - QSignalSpy spy0(&box, SIGNAL(currentFontChanged(QFont))); + // The absence of this file does not affect the test results + QFontDatabase::addApplicationFont("ArianaVioleta-dz2K.ttf"); - if (box.model()->rowCount() > 2) { - QTest::keyPress(&box, Qt::Key_Down); + SubQFontComboBox *box = new SubQFontComboBox; + QSignalSpy spy0(box, SIGNAL(currentFontChanged(QFont))); + + if (box->model()->rowCount() > 2) { + QTest::keyPress(box, Qt::Key_Down); QCOMPARE(spy0.count(), 1); QFont f( "Sans Serif" ); - box.setCurrentFont(f); + box->setCurrentFont(f); QCOMPARE(spy0.count(), 2); } else qWarning("Not enough fonts installed on test system. Consider adding some"); diff --git a/tests/auto/widgets/widgets/qmdiarea/tst_qmdiarea.cpp b/tests/auto/widgets/widgets/qmdiarea/tst_qmdiarea.cpp index e3b046e4..91bc6382 100644 --- a/tests/auto/widgets/widgets/qmdiarea/tst_qmdiarea.cpp +++ b/tests/auto/widgets/widgets/qmdiarea/tst_qmdiarea.cpp @@ -1,4 +1,4 @@ -/**************************************************************************** +/**************************************************************************** ** ** Copyright (C) 2016 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ @@ -282,6 +282,8 @@ private slots: void nativeSubWindows(); void task_209615(); void task_236750(); + void qtbug92240_title_data(); + void qtbug92240_title(); private: QMdiSubWindow *activeWindow; @@ -2749,6 +2751,45 @@ void tst_QMdiArea::task_236750() subWindow->showMinimized(); } +// QTBUG-92240: When subwindows are maximized, their title is supposed to +// appear on the main window. When DontMaximizeSubWindowOnActivation was set, +// titles of previously created maximized windows interfered, resulting in +// "QTBUG-92240 - [1] - [2]". +void tst_QMdiArea::qtbug92240_title_data() +{ + QTest::addColumn("dontMaximize"); + QTest::newRow("default") << false; + QTest::newRow("dontMaximize") << true; +} + +void tst_QMdiArea::qtbug92240_title() +{ + QFETCH(bool, dontMaximize); + +#ifdef Q_OS_MACOS + QSKIP("Not supported on macOS"); +#endif + + QMainWindow w; + const QString title = QStringLiteral("QTBUG-92240"); + w.setWindowTitle(title); + w.menuBar()->addMenu(QStringLiteral("File")); + w.show(); + + auto *mdiArea = new QMdiArea; + w.setCentralWidget(mdiArea); + if (dontMaximize) + mdiArea->setOption(QMdiArea::DontMaximizeSubWindowOnActivation); + auto *sw1 = mdiArea->addSubWindow(new QWidget); + sw1->setWindowTitle(QStringLiteral("1")); + sw1->showMaximized(); + QTRY_COMPARE(w.windowTitle(), QLatin1String("QTBUG-92240 - [1]")); + auto *sw2 = mdiArea->addSubWindow(new QWidget); + sw2->setWindowTitle(QStringLiteral("2")); + sw2->showMaximized(); + QTRY_COMPARE(w.windowTitle(), QLatin1String("QTBUG-92240 - [2]")); +} + QTEST_MAIN(tst_QMdiArea) #include "tst_qmdiarea.moc" diff --git a/tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp b/tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp index 5a24995c..48b171f2 100644 --- a/tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp +++ b/tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp @@ -174,7 +174,9 @@ void tst_QMenu::getSetCheck() tst_QMenu::tst_QMenu() : m_onStatusTipTimerExecuted(false) { + QApplication::setEffectEnabled(Qt::UI_FadeTooltip, false); QApplication::setEffectEnabled(Qt::UI_AnimateMenu, false); + QApplication::setEffectEnabled(Qt::UI_AnimateTooltip, false); } void tst_QMenu::initTestCase() diff --git a/tests/auto/widgets/widgets/qpushbutton/tst_qpushbutton.cpp b/tests/auto/widgets/widgets/qpushbutton/tst_qpushbutton.cpp index 94cb42cc..e818514a 100644 --- a/tests/auto/widgets/widgets/qpushbutton/tst_qpushbutton.cpp +++ b/tests/auto/widgets/widgets/qpushbutton/tst_qpushbutton.cpp @@ -68,6 +68,7 @@ private slots: void taskQTBUG_20191_shortcutWithKeypadModifer(); void emitReleasedAfterChange(); void hitButton(); + void iconOnlyStyleSheet(); protected slots: void resetCounters(); @@ -695,5 +696,22 @@ void tst_QPushButton::hitButton() QVERIFY(!button2->hitButton(QPoint(2, 2))); } +/* + Test that a style sheet with only icon doesn't crash. + QTBUG-91735 +*/ +void tst_QPushButton::iconOnlyStyleSheet() +{ + QIcon icon(":/qt-project.org/styles/commonstyle/images/dvd-32.png"); + QVERIFY(!icon.isNull()); + QPushButton pb; + pb.setStyleSheet("QPushButton {" + "icon: url(:/qt-project.org/styles/commonstyle/images/dvd-32.png);" + "border: red;" + "}"); + pb.show(); + QVERIFY(QTest::qWaitForWindowExposed(&pb)); +} + QTEST_MAIN(tst_QPushButton) #include "tst_qpushbutton.moc" diff --git a/tests/auto/widgets/widgets/qscrollarea/tst_qscrollarea.cpp b/tests/auto/widgets/widgets/qscrollarea/tst_qscrollarea.cpp index 9f08bd33..d817d847 100644 --- a/tests/auto/widgets/widgets/qscrollarea/tst_qscrollarea.cpp +++ b/tests/auto/widgets/widgets/qscrollarea/tst_qscrollarea.cpp @@ -33,6 +33,7 @@ #include #include #include +#include class tst_QScrollArea : public QObject { @@ -46,6 +47,7 @@ private slots: void getSetCheck(); void ensureMicroFocusVisible_Task_167838(); void checkHFW_Task_197736(); + void stableHeightForWidth(); }; tst_QScrollArea::tst_QScrollArea() @@ -165,5 +167,61 @@ void tst_QScrollArea::checkHFW_Task_197736() QCOMPARE(w->height(), 200); } + +/* + If the scroll area rides the size where, due to the height-for-width + implementation of the widget, the vertical scrollbar is needed only + if the vertical scrollbar is visible, then we don't want it to flip + back and forth, but rather constrain the width of the widget. + See QTBUG-92958. +*/ +void tst_QScrollArea::stableHeightForWidth() +{ + struct HeightForWidthWidget : public QWidget + { + HeightForWidthWidget() + { + QSizePolicy policy = sizePolicy(); + policy.setHeightForWidth(true); + setSizePolicy(policy); + } + // Aspect ratio 1:1 + int heightForWidth(int width) const override { return width; } + }; + + class HeightForWidthArea : public QScrollArea + { + public: + HeightForWidthArea() + { + this->verticalScrollBar()->installEventFilter(this); + } + protected: + bool eventFilter(QObject *obj, QEvent *e) override + { + if (obj == verticalScrollBar() && e->type() == QEvent::Hide) + ++m_hideCount; + return QScrollArea::eventFilter(obj,e); + } + public: + int m_hideCount = 0; + }; + + HeightForWidthArea area; + HeightForWidthWidget equalWHWidget; + area.setWidget(&equalWHWidget); + area.setWidgetResizable(true); + // at this size, the widget wants to be 501 pixels high, + // requiring a vertical scrollbar in a 499 pixel high area. + // but the width resulting from showing the scrollbar would + // be less than 499, so no scrollbars would be needed anymore. + area.resize(501, 499); + area.show(); + QTest::qWait(500); + // if the scrollbar got hidden more than once, then the layout + // isn't stable. + QVERIFY(area.m_hideCount <= 1); +} + QTEST_MAIN(tst_QScrollArea) #include "tst_qscrollarea.moc" diff --git a/tests/auto/widgets/widgets/qtabbar/tst_qtabbar.cpp b/tests/auto/widgets/widgets/qtabbar/tst_qtabbar.cpp index 79a963f5..f04f803e 100644 --- a/tests/auto/widgets/widgets/qtabbar/tst_qtabbar.cpp +++ b/tests/auto/widgets/widgets/qtabbar/tst_qtabbar.cpp @@ -98,6 +98,9 @@ private slots: void mouseReleaseOutsideTabBar(); + void scrollButtons_data(); + void scrollButtons(); + private: void checkPositions(const TabBar &tabbar, const QList &positions); }; @@ -869,5 +872,71 @@ void tst_QTabBar::checkPositions(const TabBar &tabbar, const QList &positio } } +void tst_QTabBar::scrollButtons_data() +{ + QTest::addColumn("tabPosition"); + QTest::addColumn("layoutDirection"); + + for (auto ld : {Qt::LeftToRight, Qt::RightToLeft}) { + const char *ldStr = ld == Qt::LeftToRight ? "LTR" : "RTL"; + QTest::addRow("North, %s", ldStr) << QTabWidget::North << ld; + QTest::addRow("South, %s", ldStr) << QTabWidget::South << ld; + QTest::addRow("West, %s", ldStr) << QTabWidget::West << ld; + QTest::addRow("East, %s", ldStr) << QTabWidget::East << ld; + } +} + +void tst_QTabBar::scrollButtons() +{ + QFETCH(QTabWidget::TabPosition, tabPosition); + QFETCH(Qt::LayoutDirection, layoutDirection); + + QWidget window; + QTabWidget tabWidget(&window); + tabWidget.setLayoutDirection(layoutDirection); + tabWidget.setTabPosition(tabPosition); + tabWidget.setElideMode(Qt::ElideNone); + tabWidget.setUsesScrollButtons(true); + + const int tabCount = 5; + for (int i = 0; i < tabCount; ++i) + { + const QString num = QString::number(i); + tabWidget.addTab(new QPushButton(num), num + " - Really long tab name to force arrows"); + } + tabWidget.move(0, 0); + tabWidget.resize(tabWidget.minimumSizeHint()); + window.show(); + QVERIFY(QTest::qWaitForWindowActive(&window)); + + auto *leftB = tabWidget.tabBar()->findChild(QStringLiteral("ScrollLeftButton")); + auto *rightB = tabWidget.tabBar()->findChild(QStringLiteral("ScrollRightButton")); + + QVERIFY(leftB->isVisible()); + QVERIFY(!leftB->isEnabled()); + QVERIFY(rightB->isVisible()); + QVERIFY(rightB->isEnabled()); + QVERIFY(!tabWidget.tabBar()->tabRect(1).intersects(tabWidget.tabBar()->rect())); + + int index = 0; + for (; index < tabWidget.count(); ++index) { + QCOMPARE(leftB->isEnabled(), index > 0); + QCOMPARE(rightB->isEnabled(), index < tabWidget.count() - 1); + QVERIFY(tabWidget.tabBar()->tabRect(index).intersects(tabWidget.tabBar()->rect())); + QCOMPARE(tabWidget.tabBar()->tabAt(tabWidget.tabBar()->rect().center()), index); + if (rightB->isEnabled()) + rightB->click(); + } + for (--index; index >= 0; --index) { + QCOMPARE(leftB->isEnabled(), index >= 0); + QCOMPARE(rightB->isEnabled(), index < tabWidget.count() - 1); + + QVERIFY(tabWidget.tabBar()->tabRect(index).intersects(tabWidget.tabBar()->rect())); + if (leftB->isEnabled()) + leftB->click(); + } + QVERIFY(!leftB->isEnabled()); +} + QTEST_MAIN(tst_QTabBar) #include "tst_qtabbar.moc" diff --git a/tests/benchmarks/corelib/io/qdiriterator/main.cpp b/tests/benchmarks/corelib/io/qdiriterator/main.cpp index eae752d9..0bbe755f 100644 --- a/tests/benchmarks/corelib/io/qdiriterator/main.cpp +++ b/tests/benchmarks/corelib/io/qdiriterator/main.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2016 The Qt Company Ltd. +** Copyright (C) 2021 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the test suite of the Qt Toolkit. @@ -57,24 +57,23 @@ private slots: void data(); }; - void tst_qdiriterator::data() { -#if defined(Q_OS_WIN) - const char *qtdir = "C:\\depot\\qt\\main"; -#else - const char *qtdir = ::getenv("QTDIR"); -#endif - if (!qtdir) { - fprintf(stderr, "QTDIR not set\n"); - exit(1); - } + const char hereRelative[] = "tests/benchmarks/corelib/io/qdiriterator/qdiriterator.pro"; + QString proname = QTest::qFindTestData(QStringLiteral("qdiriterator.pro")); + // qDebug("Source pro: %s", proname.toLocal8Bit().constData()); + // Size chopped counts the '\0', making up for the omitted leading '/': + QByteArray dir(QStringRef(&proname).chopped(sizeof(hereRelative)).toLocal8Bit()); + // qDebug("Root dir: %s", dir.constData()); QTest::addColumn("dirpath"); - QByteArray ba = QByteArray(qtdir) + "/src/corelib"; - QByteArray ba1 = ba + "/io"; - QTest::newRow(ba) << ba; - //QTest::newRow(ba1) << ba1; + const QByteArray ba = dir + "/src/corelib"; + + if (!QFileInfo(QString::fromLocal8Bit(ba)).isDir()) + QSKIP("Missing Qt directory"); + + QTest::newRow("corelib") << ba; + QTest::newRow("corelib/io") << (ba + "/io"); } #ifdef Q_OS_WIN diff --git a/tests/benchmarks/corelib/io/qfile/main.cpp b/tests/benchmarks/corelib/io/qfile/main.cpp index 1966b307..eca2f642 100644 --- a/tests/benchmarks/corelib/io/qfile/main.cpp +++ b/tests/benchmarks/corelib/io/qfile/main.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2016 The Qt Company Ltd. +** Copyright (C) 2021 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the test suite of the Qt Toolkit. @@ -108,72 +108,110 @@ private slots: void readBigFile_Win32(); private: - void readBigFile_data(BenchmarkType type, QIODevice::OpenModeFlag t, QIODevice::OpenModeFlag b); + void readFile_data(BenchmarkType type, QIODevice::OpenModeFlag t, QIODevice::OpenModeFlag b); void readBigFile(); - void readSmallFiles_data(BenchmarkType type, QIODevice::OpenModeFlag t, QIODevice::OpenModeFlag b); void readSmallFiles(); - void createFile(); - void fillFile(int factor=FACTOR); - void removeFile(); - void createSmallFiles(); - void removeSmallFiles(); - QString filename; - QString tmpDirName; + + class TestDataDir : public QTemporaryDir + { + void createFile(); + void createSmallFiles(); + public: + TestDataDir() : QTemporaryDir(), fail(errorString().toLocal8Bit()) + { + if (fail.isEmpty() && !QTemporaryDir::isValid()) + fail = "Failed to create temporary directory for data"; + if (isValid()) + createSmallFiles(); + if (isValid()) + createFile(); + if (isValid()) + QTest::qSleep(2000); // let IO settle + } + bool isValid() { return QTemporaryDir::isValid() && fail.isEmpty(); } + QByteArray fail; + QString filename; + } tempDir; }; Q_DECLARE_METATYPE(tst_qfile::BenchmarkType) Q_DECLARE_METATYPE(QIODevice::OpenMode) Q_DECLARE_METATYPE(QIODevice::OpenModeFlag) -void tst_qfile::createFile() +/* None of the tests modify the test data in tempDir, so it's OK to only create + * and tear down the directory once. + */ +void tst_qfile::TestDataDir::createFile() { - removeFile(); // Cleanup in case previous test case aborted before cleaning up - - QTemporaryFile tmpFile; - tmpFile.setAutoRemove(false); - if (!tmpFile.open()) - ::exit(1); + QFile tmpFile(filePath("testFile")); + if (!tmpFile.open(QIODevice::WriteOnly)) { + fail = "Unable to prepare files for test"; + return; + } +#if 0 // Varied data, rather than filling with '\0' bytes: + for (int row = 0; row < FACTOR; ++row) { + tmpFile.write(QByteArray().fill('0' + row % ('0' - 'z'), 80)); + tmpFile.write("\n"); + } +#else + tmpFile.seek(FACTOR * 80); + tmpFile.putChar('\n'); +#endif filename = tmpFile.fileName(); tmpFile.close(); } -void tst_qfile::removeFile() +void tst_qfile::TestDataDir::createSmallFiles() { - if (!filename.isEmpty()) - QFile::remove(filename); -} - -void tst_qfile::fillFile(int factor) -{ - QFile tmpFile(filename); - tmpFile.open(QIODevice::WriteOnly); - //for (int row=0; row("testType"); + QTest::addColumn("blockSize"); + QTest::addColumn("textMode"); + QTest::addColumn("bufferedMode"); + + QByteArray flagstring; + if (t & QIODevice::Text) + flagstring += "textMode "; + if (b & QIODevice::Unbuffered) + flagstring += "unbuffered "; + if (flagstring.isEmpty()) + flagstring = "none"; + + const int kbs[] = {1, 2, 8, 16, 32, 512}; + for (int kb : kbs) { + const int size = 1024 * kb; + QTest::addRow("BS: %d, Flags: %s", size, flagstring.constData()) + << type << size << t << b; + } +} + void tst_qfile::readBigFile_QFile() { readBigFile(); } void tst_qfile::readBigFile_QFSFileEngine() { -#ifdef QT_BUILD_INTERNAL readBigFile(); -#else - QSKIP("This test requires -developer-build."); -#endif } void tst_qfile::readBigFile_posix() { @@ -183,54 +221,36 @@ void tst_qfile::readBigFile_Win32() { readBigFile(); } void tst_qfile::readBigFile_QFile_data() { - readBigFile_data(QFileBenchmark, QIODevice::NotOpen, QIODevice::NotOpen); - readBigFile_data(QFileBenchmark, QIODevice::NotOpen, QIODevice::Unbuffered); - readBigFile_data(QFileBenchmark, QIODevice::Text, QIODevice::NotOpen); - readBigFile_data(QFileBenchmark, QIODevice::Text, QIODevice::Unbuffered); + readFile_data(QFileBenchmark, QIODevice::NotOpen, QIODevice::NotOpen); + readFile_data(QFileBenchmark, QIODevice::NotOpen, QIODevice::Unbuffered); + readFile_data(QFileBenchmark, QIODevice::Text, QIODevice::NotOpen); + readFile_data(QFileBenchmark, QIODevice::Text, QIODevice::Unbuffered); } void tst_qfile::readBigFile_QFSFileEngine_data() { #ifdef QT_BUILD_INTERNAL - readBigFile_data(QFSFileEngineBenchmark, QIODevice::NotOpen, QIODevice::NotOpen); - readBigFile_data(QFSFileEngineBenchmark, QIODevice::NotOpen, QIODevice::Unbuffered); - readBigFile_data(QFSFileEngineBenchmark, QIODevice::Text, QIODevice::NotOpen); - readBigFile_data(QFSFileEngineBenchmark, QIODevice::Text, QIODevice::Unbuffered); + // Support for buffering dropped at 5.10, so only test Unbuffered + readFile_data(QFSFileEngineBenchmark, QIODevice::NotOpen, QIODevice::Unbuffered); + readFile_data(QFSFileEngineBenchmark, QIODevice::Text, QIODevice::Unbuffered); #else - QTest::addColumn("dummy"); - QTest::newRow("Test will be skipped") << -1; + QSKIP("This test requires -developer-build."); #endif } void tst_qfile::readBigFile_posix_data() { - readBigFile_data(PosixBenchmark, QIODevice::NotOpen, QIODevice::NotOpen); + readFile_data(PosixBenchmark, QIODevice::NotOpen, QIODevice::NotOpen); } void tst_qfile::readBigFile_Win32_data() { - readBigFile_data(Win32Benchmark, QIODevice::NotOpen, QIODevice::NotOpen); -} - - -void tst_qfile::readBigFile_data(BenchmarkType type, QIODevice::OpenModeFlag t, QIODevice::OpenModeFlag b) -{ - QTest::addColumn("testType"); - QTest::addColumn("blockSize"); - QTest::addColumn("textMode"); - QTest::addColumn("bufferedMode"); - - const int bs[] = {1024, 1024*2, 1024*8, 1024*16, 1024*32,1024*512}; - int bs_entries = sizeof(bs)/sizeof(const int); - - QString flagstring; - if (t & QIODevice::Text) flagstring += "textMode "; - if (b & QIODevice::Unbuffered) flagstring += "unbuffered "; - if (flagstring.isEmpty()) flagstring = "none"; - - for (int i=0; i(tempDir.filename.utf16()); #ifndef Q_OS_WINRT hndl = CreateFile(cfilename, GENERIC_READ, 0, 0, OPEN_EXISTING, 0, 0); @@ -325,9 +337,6 @@ void tst_qfile::readBigFile() } break; } - - removeFile(); - delete[] buffer; } void tst_qfile::seek_data() @@ -348,12 +357,9 @@ void tst_qfile::seek() QFETCH(tst_qfile::BenchmarkType, testType); int i = 0; - createFile(); - fillFile(); - switch (testType) { case(QFileBenchmark): { - QFile file(filename); + QFile file(tempDir.filename); file.open(QIODevice::ReadOnly); QBENCHMARK { i=(i+1)%sp_size; @@ -364,8 +370,8 @@ void tst_qfile::seek() break; #ifdef QT_BUILD_INTERNAL case(QFSFileEngineBenchmark): { - QFSFileEngine fse(filename); - fse.open(QIODevice::ReadOnly); + QFSFileEngine fse(tempDir.filename); + fse.open(QIODevice::ReadOnly | QIODevice::Unbuffered); QBENCHMARK { i=(i+1)%sp_size; fse.seek(seekpos[i]); @@ -375,7 +381,7 @@ void tst_qfile::seek() break; #endif case(PosixBenchmark): { - QByteArray data = filename.toLocal8Bit(); + QByteArray data = tempDir.filename.toLocal8Bit(); const char* cfilename = data.constData(); FILE* cfile = ::fopen(cfilename, "rb"); QBENCHMARK { @@ -394,7 +400,7 @@ void tst_qfile::seek() HANDLE hndl; // ensure we don't account string conversion - wchar_t* cfilename = (wchar_t*)filename.utf16(); + const wchar_t *cfilename = reinterpret_cast(tempDir.filename.utf16()); #ifndef Q_OS_WINRT hndl = CreateFile(cfilename, GENERIC_READ, 0, 0, OPEN_EXISTING, 0, 0); @@ -413,13 +419,11 @@ void tst_qfile::seek() } CloseHandle(hndl); #else - QFAIL("Not running on a Windows plattform!"); + QFAIL("Not running on a Windows platform!"); #endif } break; } - - removeFile(); } void tst_qfile::open_data() @@ -440,13 +444,11 @@ void tst_qfile::open() { QFETCH(tst_qfile::BenchmarkType, testType); - createFile(); - switch (testType) { case(QFileBenchmark): { QBENCHMARK { - QFile file( filename ); - file.open( QIODevice::ReadOnly ); + QFile file(tempDir.filename); + file.open(QIODevice::ReadOnly); file.close(); } } @@ -454,8 +456,8 @@ void tst_qfile::open() #ifdef QT_BUILD_INTERNAL case(QFSFileEngineBenchmark): { QBENCHMARK { - QFSFileEngine fse(filename); - fse.open(QIODevice::ReadOnly); + QFSFileEngine fse(tempDir.filename); + fse.open(QIODevice::ReadOnly | QIODevice::Unbuffered); fse.close(); } } @@ -463,7 +465,7 @@ void tst_qfile::open() #endif case(PosixBenchmark): { // ensure we don't account toLocal8Bit() - QByteArray data = filename.toLocal8Bit(); + QByteArray data = tempDir.filename.toLocal8Bit(); const char* cfilename = data.constData(); QBENCHMARK { @@ -474,7 +476,7 @@ void tst_qfile::open() break; case(QFileFromPosixBenchmark): { // ensure we don't account toLocal8Bit() - QByteArray data = filename.toLocal8Bit(); + QByteArray data = tempDir.filename.toLocal8Bit(); const char* cfilename = data.constData(); FILE* cfile = ::fopen(cfilename, "rb"); @@ -491,7 +493,7 @@ void tst_qfile::open() HANDLE hndl; // ensure we don't account string conversion - wchar_t* cfilename = (wchar_t*)filename.utf16(); + const wchar_t *cfilename = reinterpret_cast(tempDir.filename.utf16()); QBENCHMARK { #ifndef Q_OS_WINRT @@ -508,19 +510,13 @@ void tst_qfile::open() } break; } - - removeFile(); } void tst_qfile::readSmallFiles_QFile() { readSmallFiles(); } void tst_qfile::readSmallFiles_QFSFileEngine() { -#ifdef QT_BUILD_INTERNAL readSmallFiles(); -#else - QSKIP("This test requires -developer-build."); -#endif } void tst_qfile::readSmallFiles_posix() { @@ -533,82 +529,39 @@ void tst_qfile::readSmallFiles_Win32() void tst_qfile::readSmallFiles_QFile_data() { - readSmallFiles_data(QFileBenchmark, QIODevice::NotOpen, QIODevice::NotOpen); - readSmallFiles_data(QFileBenchmark, QIODevice::NotOpen, QIODevice::Unbuffered); - readSmallFiles_data(QFileBenchmark, QIODevice::Text, QIODevice::NotOpen); - readSmallFiles_data(QFileBenchmark, QIODevice::Text, QIODevice::Unbuffered); + readFile_data(QFileBenchmark, QIODevice::NotOpen, QIODevice::NotOpen); + readFile_data(QFileBenchmark, QIODevice::NotOpen, QIODevice::Unbuffered); + readFile_data(QFileBenchmark, QIODevice::Text, QIODevice::NotOpen); + readFile_data(QFileBenchmark, QIODevice::Text, QIODevice::Unbuffered); } void tst_qfile::readSmallFiles_QFSFileEngine_data() { #ifdef QT_BUILD_INTERNAL - readSmallFiles_data(QFSFileEngineBenchmark, QIODevice::NotOpen, QIODevice::NotOpen); - readSmallFiles_data(QFSFileEngineBenchmark, QIODevice::NotOpen, QIODevice::Unbuffered); - readSmallFiles_data(QFSFileEngineBenchmark, QIODevice::Text, QIODevice::NotOpen); - readSmallFiles_data(QFSFileEngineBenchmark, QIODevice::Text, QIODevice::Unbuffered); + // Support for buffering dropped at 5.10, so only test Unbuffered + readFile_data(QFSFileEngineBenchmark, QIODevice::NotOpen, QIODevice::Unbuffered); + readFile_data(QFSFileEngineBenchmark, QIODevice::Text, QIODevice::Unbuffered); #else - QTest::addColumn("dummy"); - QTest::newRow("Test will be skipped") << -1; + QSKIP("This test requires -developer-build."); #endif } void tst_qfile::readSmallFiles_posix_data() { - readSmallFiles_data(PosixBenchmark, QIODevice::NotOpen, QIODevice::NotOpen); + readFile_data(PosixBenchmark, QIODevice::NotOpen, QIODevice::NotOpen); } void tst_qfile::readSmallFiles_Win32_data() { - readSmallFiles_data(Win32Benchmark, QIODevice::NotOpen, QIODevice::NotOpen); + +#ifdef Q_OS_WIN + readFile_data(Win32Benchmark, QIODevice::NotOpen, QIODevice::NotOpen); +#else + QSKIP("This is Windows only benchmark."); +#endif } - -void tst_qfile::readSmallFiles_data(BenchmarkType type, QIODevice::OpenModeFlag t, QIODevice::OpenModeFlag b) -{ - QTest::addColumn("testType"); - QTest::addColumn("blockSize"); - QTest::addColumn("textMode"); - QTest::addColumn("bufferedMode"); - - const int bs[] = {1024, 1024*2, 1024*8, 1024*16, 1024*32,1024*512}; - int bs_entries = sizeof(bs)/sizeof(const int); - - QString flagstring; - if (t & QIODevice::Text) flagstring += "textMode "; - if (b & QIODevice::Unbuffered) flagstring += "unbuffered "; - if (flagstring.isEmpty()) flagstring = "none"; - - for (int i=0; i fileList; Q_FOREACH(QString file, files) { - QFile *f = new QFile(tmpDirName + QLatin1Char('/') + file); + QFile *f = new QFile(tempDir.filePath(file)); f->open(QIODevice::ReadOnly|textMode|bufferedMode); fileList.append(f); } @@ -654,7 +600,7 @@ void tst_qfile::readSmallFiles() case(QFSFileEngineBenchmark): { QList fileList; Q_FOREACH(QString file, files) { - QFSFileEngine *fse = new QFSFileEngine(tmpDirName + QLatin1Char('/') + file); + QFSFileEngine *fse = new QFSFileEngine(tempDir.filePath(file)); fse->open(QIODevice::ReadOnly|textMode|bufferedMode); fileList.append(fse); } @@ -675,7 +621,7 @@ void tst_qfile::readSmallFiles() case(PosixBenchmark): { QList fileList; Q_FOREACH(QString file, files) { - fileList.append(::fopen(QFile::encodeName(tmpDirName + QLatin1Char('/') + file).constData(), "rb")); + fileList.append(::fopen(QFile::encodeName(tempDir.filePath(file)).constData(), "rb")); } QBENCHMARK { @@ -700,7 +646,7 @@ void tst_qfile::readSmallFiles() HANDLE hndl; // ensure we don't account string conversion - wchar_t* cfilename = (wchar_t*)filename.utf16(); + const wchar_t *cfilename = reinterpret_cast(tempDir.filename.utf16()); #ifndef Q_OS_WINRT hndl = CreateFile(cfilename, GENERIC_READ, 0, 0, OPEN_EXISTING, 0, 0); @@ -723,9 +669,6 @@ void tst_qfile::readSmallFiles() } break; } - - removeSmallFiles(); - delete[] buffer; } QTEST_MAIN(tst_qfile) diff --git a/tests/benchmarks/corelib/io/qprocess/testProcessLoopback/testProcessLoopback.pro b/tests/benchmarks/corelib/io/qprocess/testProcessLoopback/testProcessLoopback.pro index 1f56ad6e..89fea90d 100644 --- a/tests/benchmarks/corelib/io/qprocess/testProcessLoopback/testProcessLoopback.pro +++ b/tests/benchmarks/corelib/io/qprocess/testProcessLoopback/testProcessLoopback.pro @@ -1,4 +1,3 @@ -CONFIG += benchmark CONFIG -= qt CONFIG += cmdline winrt: QMAKE_LFLAGS += /ENTRY:mainCRTStartup diff --git a/tests/benchmarks/corelib/io/qprocess/tst_bench_qprocess.cpp b/tests/benchmarks/corelib/io/qprocess/tst_bench_qprocess.cpp index 1fd3b9d5..6cf7529d 100644 --- a/tests/benchmarks/corelib/io/qprocess/tst_bench_qprocess.cpp +++ b/tests/benchmarks/corelib/io/qprocess/tst_bench_qprocess.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2020 The Qt Company Ltd. +** Copyright (C) 2021 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the test suite of the Qt Toolkit. @@ -39,10 +39,16 @@ private slots: void echoTest_performance(); }; +#ifdef Q_OS_WIN +# define EXE ".exe" +#else +# define EXE "" +#endif + void tst_QProcess::echoTest_performance() { QProcess process; - process.start("testProcessLoopback/testProcessLoopback"); + process.start(QFINDTESTDATA("testProcessLoopback/testProcessLoopback" EXE), QStringList()); QByteArray array; array.resize(1024 * 1024); diff --git a/tests/benchmarks/corelib/kernel/qmetaobject/main.cpp b/tests/benchmarks/corelib/kernel/qmetaobject/main.cpp index 80bad797..262dca7d 100644 --- a/tests/benchmarks/corelib/kernel/qmetaobject/main.cpp +++ b/tests/benchmarks/corelib/kernel/qmetaobject/main.cpp @@ -237,11 +237,12 @@ void tst_qmetaobject::unconnected() { LotsOfSignals *obj = new LotsOfSignals; QFETCH(int, signal_index); - QVERIFY(obj->metaObject()->methodCount() == 73); + // 74: 70 signals in LotsOfSignals, 2 signals, 1 slot + 1 invokable in QObject + QCOMPARE(obj->metaObject()->methodCount(), 74); void *v; QBENCHMARK { - //+1 because QObject has one slot - QMetaObject::metacall(obj, QMetaObject::InvokeMetaMethod, signal_index+1, &v); + // Add two because QObject has one slot and one invokable + QMetaObject::metacall(obj, QMetaObject::InvokeMetaMethod, signal_index + 2, &v); } delete obj; } diff --git a/tests/benchmarks/dbus/qdbusperformance/test/test.pro b/tests/benchmarks/dbus/qdbusperformance/test/test.pro index ddc54107..faa2fe81 100644 --- a/tests/benchmarks/dbus/qdbusperformance/test/test.pro +++ b/tests/benchmarks/dbus/qdbusperformance/test/test.pro @@ -1,3 +1,4 @@ +CONFIG += benchmark SOURCES += ../tst_qdbusperformance.cpp HEADERS += ../serverobject.h TARGET = ../tst_qdbusperformance diff --git a/tests/benchmarks/dbus/qdbusperformance/tst_qdbusperformance.cpp b/tests/benchmarks/dbus/qdbusperformance/tst_qdbusperformance.cpp index 39c91294..4bb71c47 100644 --- a/tests/benchmarks/dbus/qdbusperformance/tst_qdbusperformance.cpp +++ b/tests/benchmarks/dbus/qdbusperformance/tst_qdbusperformance.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2016 The Qt Company Ltd. +** Copyright (C) 2021 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the test suite of the Qt Toolkit. @@ -79,7 +79,7 @@ void tst_QDBusPerformance::initTestCase() #else # define EXE "" #endif - proc.start(QFINDTESTDATA("server/server" EXE)); + proc.start(QFINDTESTDATA("server/server" EXE), QStringList()); QVERIFY2(proc.waitForStarted(), qPrintable(proc.errorString())); QVERIFY(proc.waitForReadyRead()); diff --git a/tests/benchmarks/gui/kernel/qguimetatype/tst_qguimetatype.cpp b/tests/benchmarks/gui/kernel/qguimetatype/tst_qguimetatype.cpp index 7d6c1ef8..7b50b3e5 100644 --- a/tests/benchmarks/gui/kernel/qguimetatype/tst_qguimetatype.cpp +++ b/tests/benchmarks/gui/kernel/qguimetatype/tst_qguimetatype.cpp @@ -28,6 +28,7 @@ #include #include +#include class tst_QGuiMetaType : public QObject { @@ -59,17 +60,20 @@ void tst_QGuiMetaType::constructInPlace_data() void tst_QGuiMetaType::constructInPlace() { QFETCH(int, typeId); - int size = QMetaType::sizeOf(typeId); + QMetaType type(typeId); + int size = type.sizeOf(); void *storage = qMallocAligned(size, 2 * sizeof(qlonglong)); - QCOMPARE(QMetaType::construct(typeId, storage, /*copy=*/0), storage); - QMetaType::destruct(typeId, storage); + auto cleanUp = qScopeGuard([&]() { + qFreeAligned(storage); + }); + QCOMPARE(type.construct(storage, /*copy=*/0), storage); + type.destruct(storage); QBENCHMARK { for (int i = 0; i < 100000; ++i) { - QMetaType::construct(typeId, storage, /*copy=*/0); - QMetaType::destruct(typeId, storage); + type.construct(storage, /*copy=*/0); + type.destruct(storage); } } - qFreeAligned(storage); } void tst_QGuiMetaType::constructInPlaceCopy_data() @@ -80,19 +84,22 @@ void tst_QGuiMetaType::constructInPlaceCopy_data() void tst_QGuiMetaType::constructInPlaceCopy() { QFETCH(int, typeId); - int size = QMetaType::sizeOf(typeId); + QMetaType type(typeId); + int size = type.sizeOf(); void *storage = qMallocAligned(size, 2 * sizeof(qlonglong)); - void *other = QMetaType::create(typeId); - QCOMPARE(QMetaType::construct(typeId, storage, other), storage); - QMetaType::destruct(typeId, storage); + void *other = type.create(); + auto cleanUp = qScopeGuard([&]() { + type.destroy(other); + qFreeAligned(storage); + }); + QCOMPARE(type.construct(storage, other), storage); + type.destruct(storage); QBENCHMARK { for (int i = 0; i < 100000; ++i) { - QMetaType::construct(typeId, storage, other); - QMetaType::destruct(typeId, storage); + type.construct(storage, other); + type.destruct(storage); } } - QMetaType::destroy(typeId, other); - qFreeAligned(storage); } QTEST_MAIN(tst_QGuiMetaType) diff --git a/tests/benchmarks/sql/kernel/qsqlrecord/tst_qsqlrecord.cpp b/tests/benchmarks/sql/kernel/qsqlrecord/tst_qsqlrecord.cpp index 8d7e70f8..6a5d3533 100644 --- a/tests/benchmarks/sql/kernel/qsqlrecord/tst_qsqlrecord.cpp +++ b/tests/benchmarks/sql/kernel/qsqlrecord/tst_qsqlrecord.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** - ** Copyright (C) 2018 The Qt Company Ltd. + ** Copyright (C) 2021 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the test suite of the Qt Toolkit. @@ -178,15 +178,18 @@ void tst_QSqlRecord::benchmarkRecord() const auto tableName = qTableName("record", __FILE__, db); { QSqlQuery qry(db); - QVERIFY_SQL(qry, exec("create table " + tableName + " (id int NOT NULL, t_varchar varchar(20), " + QVERIFY_SQL(qry, exec("create table " + tableName + + " (id int NOT NULL, t_varchar varchar(20), " "t_char char(20), primary key(id))")); - for (int i = 0; i < 1000; i++) + // Limit to 500: at 600, the set-up takes nearly 5 minutes + for (int i = 0; i < 500; i++) QVERIFY_SQL(qry, exec(QString("INSERT INTO " + tableName + " VALUES (%1, 'VarChar%1', 'Char%1')").arg(i))); QVERIFY_SQL(qry, exec(QString("SELECT * from ") + tableName)); QBENCHMARK { while (qry.next()) qry.record(); + QVERIFY(qry.seek(0)); } } tst_Databases::safeDropTables(db, QStringList() << tableName); @@ -202,6 +205,7 @@ void tst_QSqlRecord::benchFieldName() QBENCHMARK { while (qry.next()) qry.value("r"); + QVERIFY(qry.seek(0)); } } } @@ -217,6 +221,7 @@ void tst_QSqlRecord::benchFieldIndex() QBENCHMARK { while (qry.next()) qry.value(0); + QVERIFY(qry.seek(0)); } } } diff --git a/tests/benchmarks/widgets/graphicsview/qgraphicsview/benchapps/chipTest/chip.debug b/tests/benchmarks/widgets/graphicsview/qgraphicsview/benchapps/chipTest/chip.debug deleted file mode 100644 index 8fe1e5b0f1c58f40ad8d69a7102495359e43ac8a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 863805 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%0A=(QfroL>%;?tdLA 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

c*{e$1pRVC>sV`ai2D+$az8Li(MEJDnPvHf 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%0Dx^T{EK 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

=n{aknO$#Hi~8;K1Q^_#M5 z|fmq0f}jJYx;~XTe;C&FIk-zs(c@BXH_0BwEU=40H_KaFKXMx{^Mf&2uF#wv^l9Y z@vs5q>~wN=vO%7Bv4{*_kHO77ih^>ZYXEFy_3LD{qOAEaewv7v;F6p2pKUPo5`^d@ z@|1^em&M4dTFVmSL*7s%iA&0|a*P3hp0k%JK(|tr@D>Djn<1qMU^c=Cz4FoV>mHK{ z(c#&|BqmX^>llhFXXc;Uet`2X(1(JL?c(Z|-a+_w+%#VVS{WlojQEH3Ny2xMifBva zY@}^89@#d$0*__2g9IEGBi`1|GOkmM&W(!XhI-4{40aCOkSFA>U%CmCC8`$TLS!`v zwaUHKztRrz`TbNcRZ!n=3owCTFY1eS9fCLb&^vLoU_rgr+%^PS)1cAZc<~WmqgBy( z@`mAwC5OjUr-P3)$=VsKmTb@oARr`x&@@A|%E;f>A_HD;i&)mLH*yI{{*=zUf!NVd z2;UJm9@$y|4>hiBx2nXr@LuF102(Os`;$V@Bv-Y4~lWu#qg{lr)fLj%avYrE9_> z0@znJwFILNE!d5+daO!6039v}psnyXa=E!*0p1i!$D zVaIGx@a@{>-Wn?c8UwN&OlTrSU)<7q1fu0jb^3rlwFp0D4Ot4TqlYGEsfbDn)8KhBe^6?L zPV5pz8n78a1!@O_*9)8Vo^=?!5E%;jX^$Kn5WxxV-Oy$oR}vX<0VdRE3!%!%UpRQ2 z0N?%A^+t6%d}cgVBqsXewo7}^?i?k2(KwX|fmt;pQe4G^h=`hS-huoW)x26ZEnlv> zQslB6-mNscn$M1%mpB`lC2m&_sn`*z2Q9T!S$_>Cfa)5e%0r4*1t2xg9W#SOr9lW$ zyVa%*gnDXZ1KCg&pbvw4Xi6#aJiIu*AK!f4K>xZl%v=gAfOZ~2N3i#iO9d$p1~j9o zjljeY(!h=yr8h4eH|E#L;_e=>F=*JZ3nHtNxd*(y4$o$&D}UH^qxT<&FVYPj2)SCI z8v6Q$m$NW__4OUrLgq{B;pF2)YTVXiW;_5hZH5(+R22QqQ!t5rV6aDyI|VkMJRc_J z^GJX_VZ3tn$7JM|KsG*lqhV=ng?Xj9(^!UUmmDyxP~q@oxvxprWm0gJ1cN&ImXS!C zf`sK#msaZlhlB z{8`UHp6Ie2Zt(bimU{fqT9h2!X$M$XE}__lLyRPo&soW)+D^s&s88MWDb$UN z5sL8r1c4ur7q*zD^&!7Tm%c#&qkq#1X9VjFu}hQmvj244^%hcD_{^C<;Yj>#X8A-4 zI52Ovy1D{fgoHPwLje}cgNaG87p@rWSdD!|^i0wi8FJ^bJ4jIoD9uTQl%jQbvh~PO z%E!aU@o(b=x}fUN1k46oqW+N25Nkmy@T75qJlKew8xH-vbu%7L&OXWF67SI6H;-JW z4e7-)Z$a&+9rzoI7hY3IssiWb0l~JnN4;X+3BX(sedd-JgX`JL4dX#IE07y)a85IH z+6fM&z9AI`H9eyYdpP^>f_U8WYsHM^Y^pD!AoNW_$ohaZJFuGfpD7#N#x8E7g{9=o ze{3f`XglP z$~T?j^#uI(8cB&qi{bU(P!4lHSxjEq??lUZU>_km*ijz>g<7NmJ=xB@L~b_Bmfc6T zN9a!^n$dnZ8qW4O3N;2@8BANk@FZ_eMV(7mCZ)L8$!>u$cKVeRnh9Wxp2B#&WCyCF&5Z*9){~P{jSme(XR&9`)@)0hw_D z7zgeQsu#{M9uiK?jTVL&!zICDwn)}GA44(_YSZ>)N}fEs1;_6K)0I8`g!DNm0pubr zyKF})uU3YS2*FDwHml04M1+XCC zE*tP|a=5MVxkP(S>?l$C`z1}L*1%8g)S zYITF~V95kTBvmTygyZ7s`cc#afT^^iaq(hJobx)`xx#9)_0IHxS+r?V98KtOr=ch zsw!svq~3K#b4sLND$#XE+N0Y9BZP<~k`hA#4T3EJ=1|jR+NgnrUQQq`*r0S*1%OC`Nwj**Nf=0={f#Zy(S8+YFQ5~r>}eT$_0#?QVf@n&$*;@h zc=prXWc3rWR>p|v{?GX%d_z=)aZk&iMo7C_{&aIcdHm@C5vpe-ZOxzm*Uh8kWSfK5 zG9t>Ds<6X@uap1?3$FkcVJhik2_U=t4<%E-1YW0WOy7D@Y9=yBklUv66R{i8@rPVN zd*c>kqI`=>@!D(1j;ido&>~GWWJ3rQNh27kKJ3`Xk8BVy6-vBbRj4!86P?;Qr5X$P{dcFaou{6MshC=}1$e zV{N@HY%3L8Tuhh1yG)`m~tD7}nmaGh8{nEn6$L^}CULY+CMJKpIGF&1E!U zQVx^bw^QKB{ef7bcl9QPmPGx>woiKdR3Lx)kE zaFZm|2&7GM7fm$icv_qIsC6yGI2du4BpACXb>iam;~Rw2J?Ww3w`>wFQpu3OJekc^ zc>WEcvB|BLIW(@Yc#Om|Go!#GRivhJ7?rMN9w)a;?sFj*J>$tD*zg1E#kP8Ws%L2} zFuWsAR1ZFYYH5$4I<~i6%nZeeTPkX^%x{U0mh|WjWfNkFvSB>geJ@ES(xatL4LPYX^zXi2O+Uc;b4=sf0PE`;nst(f z7U9iDYuKEqM}5g`9pw=V_PH>uo5mJr;I(Fk`E0e(RT2jil7I7;wk77{jmbMNH02{f zh(FHWkaxLU-4GpJ)6J22(geX2;N7=mXo%O>XvD0(e8_C;!sKaPKR^o{$r0{3#?$~S zp8(Y}h8N@f#d4Vwph|1bOiaBLWCL5fWTu~LR&d%JQ<)N<;JA#ptvio{hcLypGY?_` zOuAl-e;=Zx1EWJxan?c7x^|QvNuoUCEkM)yTuYlc4F*RZzVsYK$BD&=Q2)&vByvqh zp7xF3C+w-&e>y!r;TyTAhJmw$aq5lYoHMsxsh*yUmxxb#!d)L0`$7B*m!5?`2gtW> z_l~vyykmDFVe`eLKD1hEQN5nPY+&*uj0m0PJC0GK+-{w;jb5dWQj)O9dLNlPwvYbK z!|D94?Zh}Ov5Kid!DmGVJQ#QYhAQmFLRAb-hKKM9S4p($_mdNKTS;w`W= zV?la|n%t7(qUhW=>lvEibhdt+48QWfzpf@Lp!{uz8s_^4_Bu;$&l{LCuyb@^)?Y7H zKmV*23!~b%Pv=eph`3!`O?_C7^0HJyIY$LC)eABO5*u~krFxF@#fL%z`67J<2oM;WCoWY+J#tc>M=*=OHM$& z-Prlb6DlaJfbtwBn((TxzPI1V=+XTd8Pn<2Xn3LdUMTRGq4NVxcRB!kHnauq6N*Vu z+Bo~#ogR{^0p(Zw(H)A}8iW_x1QyvhPC|APXw$WHaPWFJ&G+XwF!lgtOwD89Ju*T==&BIoJY?B!Y9i@XATUt_jM=^#w$5j+g0_p2_s>!0`vtSD}8G$SE3|oEBpPa3?A$E%Xy0CRm9JX)%(l? zic3&?w0X>Z_>hGC(Hu)IJR}N=qi0K$13h@;gzZ=c1a7s}TO2{})d(}{&nMp=Bqfd= z<-x7;uj1d~bh%O3gQqffjI_?y$dfp!U4infaEgo5k=?q!Yn*daGWoN_o$6lDUBlA#r+}g`BP5lG@F|)7=>^_u_8|lG^n*mw(i+q38Mbm6Un6^;o&{f;T7m zh%$k|RM%)Bo+#kF7{3EQ|}y)C_BD(w3GW+gz!x4wuRMFbk_ z5mo&f4xS01gp~vhdav~65)$e6C25Iw8kPnqfL*yZGriF3L8eVnb;MIto`c;@CBS5y zebAExw+~E=dzX{q$buMxsp&`h)H2iV_r>rLy_lY%-So!gln)OqZA?cniE(2)BOW01 z`x4HI+dn`5tefXo1Vqa&ze)z5x8*jS$rRTCwG?1%Bc3qo$8RUq<+s5-j)D9TUob2n zN$J2&w=5Z^xaue=x@K$vESc)^GTKAT;s}$ek<)2+$+x$(wd5ut9&voomF#n1yeJ|n zSHB;i4#%^b31;x#-r^bw7bGE0d4drAu$C9s!J}VXzW>(dWhEc*a_7hiftpx4p7m2ruVd=$^5F7h8q}Rw0?Ma zL3Y~=qi!A;!nC+Dlq<;*(v+}p`@0MlCG#qCx1IYdF`60dmHQ!_n@H5S#JEqmMceYV zA6x?XL(CmXhpUdEZeVIaFEhAY*JRXTQ=N3cFH(7N(b?I`ooNsY4Yj1;n0l8o%t?5K=P5bBOXoDdnwz{t;q{smpM&wP$YM$1?!|m%Q?a^_{C0#)0fdESFy(oO8sW$_3F`%bcB6KYCNN&FR`FGTa79RB zKD$EJE^qTy@9Gt|D3Xg>Nz9T~XQ(GmMwk@%H#h`gAII zDy4VfwkD?RsT(FOc7;N++LKRYer>#q(AW!7pu^3qUIXgAbJOSv;|4`ct^!=!P{aVi_(eYp^T02*d!$Oo+U#BYrwhT$CgmZoSelJX2AJeIW~UTxXn4DQ}Xpc*Td1}e1QL2 zP=p`)==YOP8vTrC`k@tm?T@WD8i?oH@7$ftlgSb%&e*{F7?B|$lgCv4(z=Em(BQ#h zIj%t+Gm}$kY^O8Wk$sb*=_GI16Q2c-dV_ziAoO3G9XQsh!^9*<6F9Ktsyd01WqilW z{X|;HJL-27cE``t+Sv!-2_RS)fi6&+vM3X%j;fdn3~p354{4Ld&9xmukS7CF_Vo(e z_0>Dc)~3)p5WMIw1}sgJ6LRi#xyQtJTDH~6<<-gXW(-nvLJ%t?%7dIM~2`UKguU#s`GM4Grz1{j> zD}>f;IRzmT_F4d|&9x>@A$KTtE?%b6wv?h4kAUjAc2RCP`iXFF+5z3RumJ%lzZnLJIfvP5biZl%uZghL3J-pA?d$7 zOheE9*y>g4XX<57f*u?d5rI>ALpr41Ztec!yGVVj7Ufbd{o4FE$EkT>vs4snMQI`?Pmc~dp1-st}FP^M@Q4?`}s2} zrs%YgFU_9bK{-nvFDkJj34$FhZg4s#FszJHa5V4rW{Ht`B#S2Sj;y6@;6O-08D>nD03PVBMHij)E5(2R7ApV6k z2x|FrZYK-Re6PLUqt;4K=mKn#s2|#MNH5heRNDM2^BVBRv{#xbd_XJuEr~|k{1{3^ z;m5ulT1~3$K=!fAiN%#v^u;?wL5k1-oXi81|IPSXthU?Gtp0xVO&g#o;b}38Y;*aV znQvCyfH)smKt)iUw84iULb(YC-h)jP_$gyRodyzA(vtlL(97m(h0LN#Q3C`#NiV@< z&_)`xrb*bbw%qd2#%fVD>7vgo+mSVCjMvfti*Eu&uUV6Y`4CU+mHc%c zLQ*`rAKInyR(!Wr0qYbuVOcXc--DSI*hx7Po+~EbtC?CE;4h~W@5{tZn;Tp{;xc-ACjYSrS@$Zn|=XOO2EO!}KyfW*-^tex%x}W=C|Y#e@&k zW96FlB_U1hw$yi7v29SH?Ggvv#{;D=@jW-qvjv%StnRkim}HC*K{!itR5VR_DrLCW zFQa;Dd7J)3-L~~6xHPuaaR^CRrzd8|(I!^Xx&6q)O-9D+p|cnSuh|Z@b8(la-*-aR zPc@5He?-Yj{bNh@!zUSZSz4; z{0Mi@J@{Ccn<%X@xAMUT-v`eW-m<~`&Gg2OZ+&6i&RkMGn8zjNb8apc8*BT|g`Uctls&X)Lso5nM2~uh9&Py1nUBYwc_20u ziyXtCOwI_b#+)l@ON#)qBPs8&M01|?J2Yl-n@g2$v-%Aik&EyNj*ZEx2qT4X7BRj=_>KYF1PC9;+2`1`^ z0b0qPl6olIfd>cBQlg&qYx!5f34#1d_TpkZSIr_KJm~BL3Bf96QspA<)?y6DZff@*K8HlDtTHs+3Wx{`qNKq zq~!29iCkN+%o{ZfUJ*w<%JgIgc@r2e_Drs@g+bU4H(`o=3$BI;nf;a4Dl{3S=A3Q~ zeJD&&-z7y24vEi^ywCCh8PWJueR~&S#q1jy&jSJ+5pA>ONtVlLMvh*GTGJR#NT@`= zt{+It^;kpVp}d88aC(*n#g396=8<2Jq)VGJcY`Y4(~xK3=_P+x5KF&0I9IEDK_~|u zD45|z+Qbu`{+Xvyhl=1Q82Q_NxS{+wv;UtwHY)aw5{B`M*C;wtLodk{7iCfO3d_qg z=Y)&xTE=O$k**Q4?)Z|NV|sUk!24OV5KqgFd$XshUdH#Of%&}{NtDpEab!!VMB-(X zNKH`B?_qDtE~3J(>T1PF1Ek52=J<1C$8Dem4n8)WFGN*9!BD`)hAyZHOsxN+$?@d@?oB~#0bu=h z%bMabesiMeBqvf9CZ=*Qx85kg=LGY9Pt<&{=uNH~Om}#H3KYZMt}f?V*^6hV7j|2+ zY&{9Sm7u0a-*F$`!oZznQXYR2LsLM*kGQKSjP=o3*|utOUZoGRX|S01mQyhdd-+h$ z-!Tv`CO0$5%QN_PG2zP-YR#JT%TQ)_6jX_ogoL48PavN;Q*z27x*1sYBB{E5OV7#B z&&0EZy3Rn%nz~*#vZ*qb*e*WB0w^=UOfg?zb{EQr?@-jN zV0ZNnh8YYpj0SpP3rhCEV7G?iz#5VPlZQjivyKWVl`MHy|@e&qe?W!HBR9$ikWqUtn-hU9-q?Wqu~Fktslbi_B=SzaHEfXs%Dn2&&E-=(&VVYwZC3J##EOhGOvto*Hkf*GqlK@Q=oRY8uj( z-xwDc#B~-@I~G?l{BV#t-C8E0ptmnnweBM}yFbsHIA)Kf3Ohm3F~uz)f~-+mut0iz zt4T^4w6j8(h!zZ>jSxvY#l;)3q!~H)NZOKx$GQ<186zE18&KAqk~)?iCpgMV2t|jW z4>hb~yOb&owqz6xuc_ws+;HBeomP-1#4LS;yiUymcb>@Fmg+8@dssKevqjGpMB}%S zJ*7=|;tdT+XQ8&bORLxtS_h#Aa;mpiw%T1%Rp{EgADp==ALg1+v;an13f|ao$8iL{ zfKeaN1h=<1ow}@3j#5U&$)UNJ*NDX8;x(BiR7s&=`@>YLYj$077Tdp@OVOIrF6*i6 zO371FOk{`62#gQXUr}6yLCRyGe)dsf(B3Ur!`cw&hv_qPCUM9F62@2aM!?8(V^_XE z2-9GP-geOxgIaL4_XOZ(zBnb4glXc@$SK2Bb|nWumy=yz#t*Di&Af3uPi&>8vNA@z z&Q!kiuwbN&YcAxSTT#4EiE2oN_QFu_(&{wODrbjW^?WTbAH;z7XSO09Yi1F_B!FfH z3yG|V?>C57GI92VFf55T92Wo9+m?R~!wc<%fT4PQX}rtjafiziXRZ4z#D}KE3u=UY z8Ia*oRa$7hSE9FM9d-YqX6`0z7LRH!?v(_Rz(Ft>aME=Go7Rcj#nX$2&}p+V?Zw~I z-7Q+z@HxYyJ-#2oU*?f%6w zV>#grncX0-3?0^;_+ycU<24@tK=_UFtNd}n>V_KAPp)abSjxsr`${e?JVQC!1XT2P z%ED%B6uj;Qrd*JcH@j*9#6z>2L=#9h zqglbdx6}FcaH@Z)(Any?p|F%0Yk^Dhb0)|cMb_GPoQnh;wV^{MT>0Xf6ANR8+%#M` z4_C))*f=Q4L@>_KvDC8x5SfPfa$EP1Lz3VmAyJ_{K<7pl>ov{JVnp@-@9j^iDD z;VZih0)&u_4Q2_EF^d6P?$?_ne!$PMxZ{_r7j9-}lY? z_3gT~+*(eZI(6#QsZ)#d)GG|b$Xk-=$faz!>B_N#9I3jl;Jt@T<^xqU8Jef|wTprP zF7o%%WUrqnV2-rG2Fj0F`T~wezr#5s07H)+S_;=*u$_xIad>-tczO+(c|^kjPUH&Y zC>!lgH^L=5B~lODK(oYB+kyqz4eQT>ds#R|wHaIZGly|fs=8;8XfWgxWn+Na(WIs= zRafTmqY2sN*}x4F(f3sND|<@~Z+%PEsvH*Br>~kBD(!(lC60S2skWH322&&1MrA_8 zcn-HiIGw!I;z?^U@dip@sWkP5mhoVDkP?$~~ie9CzEm?B5ZOCkkTR>&D^%8^(%4idm z)^R7Bd8Rp$+Z_-hWAh6ncfL|wzH$i*Iu@nN5t5C5%(78rhBoIa&aMSoIbRGlAP6 z2I}I8SbpW3T~UuvS&pn-p$6I=CU5ojbS2g4mS#gOP5DP+w92#~6qjtOaOBGr%xx{3 zvdW2NHzR0SJ`g7ud~t0P)|+ZLS+FFb$9<{VI{Ko_Yv7XE4i1h+`;Mf)%p|SJ!~s>H z@Wxd{6Ut;@0qI%Iw~s<|rxwbXL{f8)aiZKnmNmVKkhm_a(>}9?CKeGLFP0=e0keH5 zcISNsXx=!ddR=bT%NaXLn!(t~DbgStg;_v$m6sfu^04cnN}+*2M}OHum3*#>XDG@U zveyiXK&(_XB9_vogbazyfHqc(#kuQ=%CKGP(?tWB4Meixw*oS zf63TH_tx^nm{Jk1MZ%)t4Bm8l&WGK53LuQf&^YNE!ZZfPXQ8P>qeHrC%K7C$*p}ba zFRzw*TQrY0VUt9d8-yq7m%v~>&1{|Jqk?kH&2CULYh3wuR~ag0@Y8rX&Y1XtGzX)J zaot*Pi6utzNI`*Tu}#H%ot+gG=v+4Gc~@oq zX+lDwS6gOhaNrhK_o!$s;jrU8+?BdCO6;b|7&B4#1=(?p?gr&H$VO5RFeN@q2+t!9=lHjInim6Bh@GtnyT{PV_HqCowEu z1x9gcmw`SJ&qM){%++ynZ$M!|Or2V%Nc9s=MU>bw%}Cul^`X%fsp=&h5gsPkukb#j zvxlIWO5-YHQ*)DJdE2~L&qs@?Vbn^3ymYuOQ)iX98xd*X8sn%uqm-v4jhk-!0&&TK z8mEesjf=WrX%*u_7Ha@m$3{Hywu`b{upZ+h4#&UL8egzs+tP6gMH!QUnPGI5r#1Rg zLz`$|2ih+47~Z1LT-t+fG}X+fih|Z-JY~=wUgE zcCB34hLf@8rN;hCRg;G+b!>1&UL2 zPL`z#P9=(Y7!Au|?Z#pJ;6n}S!!%Ik%(Rk!LH~BXxHdUi#>^@0Y`}z4=`a$p5fn9? zt9yaiiVz(O@=t06X9um&3x`#jgkZ%s6IP*4f$3x`yhpNLw(c=Xw|cN@8)OBK3CDyTAXQi~8QAdfvgC`o82kY-nDbNu6V;*?$hbZknq=6x*Eu#9awSdc`Zi1Gw$Z*4Dxp?sB6Z zlNpzT{U_YAFjb^{eEwzEs_Tpbim56CoN2Qj!Ziid&dnwIiN#3{SwSZ3O7NzbOdTMj z{}|=havDUnbvpz4RutHx5L!u}QWyF1flUK|uA5IMt%_H$h zh9@p?*HcmnVdBnqVlB~gtq4xbyE?#2i2SLPCZ>ru; z>`?GX9N3{~fG;@nOmf|=IQq0RB7n=%K^LT~A zwBjZX@*x`t0!mUbsx}UU!_*#hm!QJNo8A)?8+@-k9C1NbUV5dk1S}>dgF&~j1;$Zb zvT8`USmPUhj@2%qFwG34h+rW1ro`zKWO_*jNgy-HNYEzP0_E8DHM@ zRcb7|cU!VCqVuh9If}8~xk=otCj4#Q7tA#9gkpv&QhAn=EDA!Z(D}MbkHY>)Tq+|X zD2AW|Mf_K!rn6Yg65l4~szC7*_HCnEK@b*K$BR(DQ>wH{pYmBGObX*i9ZR@$1;bGS zMi|t!``Yy;G3w#xnrD$bZgiU;AW;NPx~!%_++d%E{FQH0M-YbLSC;1_Lnj4hGC%)L&O#m_<-)9qyEw$JLIm`Ar@PeG<8I16{yP21+Jq zF5hSaL17AQ>>r5kyDsj8Rm@QK#XyM(+?qu zVo~J-J%*>tFA-MAM&#lg)KL6RuH++OEE3}e()FYPogE2n&tz(mHh4Z0!>J(Ig99wI zP7ow23A?PlVAQTeeH(-0i}Ul)zYHR@nvsHyraldJXmI|#S}&NOPEzbTTJa?!7^@%% zY#IyL&aS9V%BYMBI@!=7*wca9=u0K8$T6xhczqhwDB~q1(HckPXo;0&wQ+?Yiss~^ zpFM|=H`RrG33K_bOD;(*!pca9WtPs9#?i^`&D{QjieAH1#};~z1;k8r3Oz1Nzxh^u z3LHPM<<-i>^Etu^7>5&IQ}$ z($oETj|;Hz(U++Vva>5m%jfyR>1JG&EhqG`C&}GnXq@YUmHiYU*iik>xW9ujvHzGz zW^)-@UNchzQtmWd{EVC(5@Nf%1URwyF<1^{qck6mKQ$pIBP_DG&IH>EkNm1iB^??S zrlNAuNU*EW{S)sI)PvJ8^f}7It8^wOOoaGAHrpc@p)T8A*oI4vnS(<`R%2>6!KIsg zksz>o&YElRL;{FlRxn5Mw{p^UlGqf=vak1In45rL1sx z>Pk<@g2(ijGy5>1DT#&^_ym{hl5m-3icUK5L?U3Clqc(#pmmp=jXZxyxO29{p@JDUzx-6o7Dl0uYG2qF!v5ak!U8S@%Qv-6 zu(>T08-}(L^m*$VR5ywzEaH453+7aKpLJWK=8oISc35egBzeb9YxG9Mutw5YH@7eK z)Sk?X2&p;47tpK*H&K95wO&2-$)TB&J>2Dq{i2)(2PnDFkjUbX-8j zKFql>9C9nFjDMk1xN(j#cGLeX2L5F=R6d@^Z#FqLfEy}077 zQ4Q*^1`Sk$28k09E+y0o%Q@a$U3ZaC_vDe^Hjw!+3an}ne#J3PjFCyAI&}#Ft8NMe z^h`#I?E`xc)k*`7wiW80s{3rBYaS&9rE!-_Ontg)%kCJbM_BEHW{3*<{mkE~06XZM zWPLM{$QolNj`4ne6i|eCI_#r5+$+Q`HR#2HQvR|ZcN7_7=E0aQL2M>C9pIZJ^U4(C zqs|j~RqIE4S`bcxi0wWRMB+l+k_kVP%;qGfa#A<~snT{3XAXSS5k0GGC8&|m42z71 zh?9+hgSl3b?C{ZC7Dr`ve7q{ZiuXA(adIs}xT3JS5|>q?EI1rDvkmBQ8`B=AMGoGs zgHhKXrP(YD!_XI)x4U#|d2>Z@B~#5wH-wC$6O2Z_2gkYnHp)9PU}$jM4lOU+yi$D~ zdDhQG%>~86lvxkQSR$WUgT~=dHjZi{GrKI=;Ru0gs>kNxUEv!jS;V&h+%mtM+57Oh zBcWd0*|76hCRQ2N2J zlY6xyX6e)%!A>AjF@enjz*RJ$2SOMO{Z)`7h~S2^QD?BrG2FO6SetPvRFoLWo1n!q zBQYFGVOp;yE+gG+p7zw60OV)s0QQ~b)tmZ_m$UQ zN{BPb+Lrt<7tR1S21;SYf{JakVUma!q5h7AKzVUj66*Szfr|#EC@BGL^rfo#$S=w^ zf*Hy*xoNEh8j^uNP;~C|m_adVT0d4TB zG%5r{jU|@0;gY2Ysj+R2de`O^HjtF}*+FnNrwfsEOi$BjerX@8DW|1Wp~s7~yb~oA zk1F9sltqR;r3&i!i^q6eu_cGr|QdsJRXPQr`p;@1skbm)uTo+q1w3S+ZfQ z$r^fe0bE+^ut>>D!*+UB?nzYnYs@%TR+Cwly@QN6hi%27@Yec7!O$TG<$YH(L`Qpg zSNN25VNLFwwj3G_{W{(~J4bm}`c=VWSo(XyuH|Nvp$ogifDS4Yo=>3VOB(7)tka?G zByq}$LNT9Wv~eilkL@|gL!ZO2H`eGUs^;B6W(#1QRN9A?@Ig@339VHz7v`mHg&f=P zl@RmsnmTCe%sNgt`=r!}ik>`5l8{@BuW(Ui^{SW@N-lCGFy=$O`dhSzMrpVJ>Vh&| zMY1o;Qm8nH@tT7GN5538oItF5cW@|FP;MwextLNmAjFuHtN|T~W$wX&VHp%U?KqT- zfQ8WsqDa(M7I=SqTJNdy)a72Xqbt~7sTDaoO!G_1BBVTl3Wf-9pNqZv`FdlC<7<^J ziW8L)QE!MBytJxwCC4yYc=J!>9?_sMU}QgDftq1sC8xw3Y7IPsb(0bblDAJ~Yx$sQ z^hO&MB|6c)6s&zv$+9*aPBQLrV+|LEp&IC-TwkLkk~(_@zrK2& z#>7f6k@i&1<|REJbzYHuMSK$0;nfL{X1y+3G_#{6DD|ZWb&Y>Y$!w!PyJ^)@I9}H6 zX9O)y$1fXJbt|pvJrbqm$r9!&xJnZOFc=8Hf>~cFI#aWA@%$p;9MQ^&cF6#N+05dt z<0ZbPE51aXE*>#v|8)_|vgbrI=~!~mNmaS>%K1=Cc~;ONRn(KTigl?qXYY;fJD+|| zvD_&&0x`!pVJs=*;VCHpFf7rfGEqT#NKG~XK@5;_*M@=wyA51E^7_WF16fl&>Ubxf z*QF$gR(4HTL*Z$Rr1|DaS+FB&xuUbc8hBd*W+vAmWw=6?tTSx8<$`Mi0oQOS4}$xG zijuh2D!JJz$-IQiwd6GdHr@$DC0l`1Y<>d@o;XNEF_Ue&#SbgwG({e^#{nMm%S5`O zHUT~6@1G2IZe9&iL!OKAK21$cZLsLDM5w*vALl^#yvO7mQq)2&6`?o zy6-tC=TGDKF{0~@3=}LqpH6v$?tPmDm8{>F=^>%mpfWmdhYf9Qd6>&ZhX85(jE78x z?5~*lM!z~ys~me$OnSHlHZkhTUL3mYa(QPq1~DEY#BAAu`M>gw3E3`#NZjHSAI*({ zQ4X>s!!L0%HpVUQk?ZIcx+lkg(bUvW|k=2iOIok*N|SgcCQd1GkV}1 z2Wde#IZy2)$22zI6IDiYc5=v*dG+eK&90bQCqGUs5={%UE}(GGRTq>#h9U))H?Bp* zn3q@6C~VkPFNdd<4_g70wmHLvnI|1E8GVrXDeM*mc(7^`=5=&B)qQ$owvkG9PiF>2 zQoLGbVp2PjyJ6A-o7PyznQ79j9Z~7h>zr&ViV?<#Q9qU8mI0le>s%V$Qk!y~jh$5x z8JEwps)bwH^UOAfI7+*13`M#j>eFJ*DIt24Qc%~uxDFQcDPI6u(422jhRP_WUPhtk zxT#u*YYiKABaQT}x1;O0NG5tgpInigndCG>MbWu%J-gSzi?kt7JNt*V(x9x}m1_Ej z-06rrba6QL$wB}p<|$pp0Er@b%8aA$bqmCU4#s zkl}VGo)YzfQW_NM$j0izl_JB|LO2d3U6+HXF~n{9^iqQ=(;}PT!(k>U?OHYlOGe~N zMrT5uDm(a#GXRB(-tz(4=$jWS?~wkIA`I?@rHJ_=-g(GY_|(vC7ZkH}UR{!jsx zd$NVz!Mq^{3tN;f|0txOATXg1kKe9}~u znrML-y|10^1v~p3JH?2Iaz=imK-?UInr^;Q$U&TOeO9P5eME`ax(b++NnWpWQH7n- z`P%M)FYWOfV#t6(&nIUlaWI#{zWPffU`9o42g#=C*2U>**@Ka6>ez~aM7ePewA3(? zLtA7UAl9;@BS+85*F9yB>Dt5u5hEN8%IQ2B4*3KHQ_vM?8i>RcD@1lf7%r&XwrE8) zSI7$J7q<)}dZpT8WFzBJ14s5`M&#LPoI}>D*zmH0NBSDKnoukz3s6o-pMD^M?=8<~v$rC#vlj0B2?64y-NFTFm}qiOGGRLb3xZIpZ-jC0EW^ezD)o zo|P1DxH_cWgrpoViP=|H(E%=uP^Q>cY~%f137!P-*ySjd>#jwRUlz`wj0)8)o!Us^ zl~=N1(H6W0lf(12sE62Jh!yrzxM2q%;)uh3L)G#=;J|f6vLLOLpC6%9nVOfI(cvJE zeb|RPh3M%~bTQ{G9DB^Tlc2J$d)U*xROzz-7<72)oC9TlRJaTG>mw@0a8A2 zxa2RJqlU`WfJ&-Hn}a;^&=Re%lA?|pg-X`zrUYE2p2_Y$=F*ZD5pIFzQm#D7%IQMU zaLr_MT@F=cv$!`l(YDcU(v?t|0q^a!r{|{HhuUIYt$Lb;ORjqPR<)^FMRfG{#=Us$ zO~*C}+2ay%qNrJY%Pz5v;zU;GEvyqz1&qYx>5A&YbqlWKL?o!A;7T&P#;iNS*_0)@ zWazW8rsBiH*vinJKDD&D?I4pJlopc?xC(ny-pt|nmi?O=Ga)2W%J<~3*k~Jqn-@@V zD(2%>2#}H3$5yF?QHcG($x2zm!&Lu`tL0j*kl8Bl)Jxt;FI^3g&!qC$X{L-mEaFhg zRWoK*&CFLqKEY}xun{WU#df-LRGGnO@1nY0O%wg0Xq>XnMIMoFs9Q$nd-Q%Zfs;^B zA7#xQh(cFcd9`82w{3z#c|S>C^FFqHJPTd3l5|jbV^ax7UYsBa)TE6*6snIB4qJ%C zO*k%`Gr>uf8VTHbJBd*l+6kIO6bfu#d7sLwT*2(1ypTak7h5CkaoR3`d`IqsSD&G5 z*t{^q00K*i%3+x-3!DNlnIlBxD@q%cSL*0Km4q_1bFc?_K%$%JAP78n`8d2Mh{Pdi z)23JyZF9IxIkE*Z9YX&Ao8&W>@3L(@-ReUg$x3VxrW|J%q-dqlDjT_!rn~f zV0axluq|qp#Bx(sU|}o>Op-#}UrWhKhlseaso@=fp2?o%`eWOZtGl#}2CejfG4Rbr zsA%d9oTi4v`Z%@;Q!50KNZ`Z3VNw}yN*AF6LwxXL5TYIf!taJw^Vn3lS}$Swq0vT( zy*1oFtK{yxK63ait7(H%NVH>7u>hnt0FnW-GwYoVK?NiLKiS&CW~*roqD6r+$o?zQ zNVgmlyFt1nyW|qp7)}O>Afz`gjMIFkamY(QiT1%BjGQ*Ofm{q7#zCS1<=;k;U2;Cf zmP~bWf-0QDJ;$(0o#B+Rlze?rGZ)3$|oI~T#IGBz$8h}2%^(W7xh^Qd0T-} z{)8K8Cz2}*N?+>wi^~r?sX)NR7H+5tCJo_qbY{1z=hCcFK~_aoA(J_bO91E~sX=7f zOij=g6ImjQizCyhV$F%&L=N4MO`HxCdcfibwc&gwtg{?jQP)T;LQyxrASKu=#7H=X zvH9bB<~PqAzaA!$1>@3XTXH_SM3=)r%2b6Rb*MQU>L{6weLGH{^IKsqQKFX*-L5l1 zjbsFqf~@`=yPT^^7x5q@QC1^tl9_%l^}3>0(4WKvz)mOOvqK)(FrfW>e&tA)?$8*l z;s%WjndD#yK3uY6ohh)jV3<^rBTVGCReX}?6c$S`Z9?S5>5gSm>28yya`=_%7jhjQ z&eo2eJa9X4rD#j#AP+-zR1l~I`G;o2yS%W*g(X-V5n?pikI~@zl#$mf$jZ!iaIA86 zCh)wTZ}LZ*nY()^W;bHHMF2 zAAly&bgh(e$R=Z}P94b^yGUjn>HSzb>7v6VOlCg6muoUQj(cs?0&?<^wjZRRM#3vgC0xt6?nRiU1pLV&c1T{v`kfI zK|hJF+=3Gu5atp`M8HLiwI;cnS_x_q2w8Qa!{ywV!)C^%S`N{G=1b@%n_hE-kM3p= zC8$h`aJ%q;70PC@!9z47s_@Gqp7EcC?3iSSak8l7z`=5m~;=aoeq} z@mXvW1#Zw=)fG7_wgv6N6@Xj0=!6eb0RnVA6XowC*Un=5okM65@2638B z7j~M9f-75=Mx3pX;3_lcg(NZ}k{To80WXs=(&*1FAOTvHY{g1ibVRb;Yz*PFGfa!L zs4$@_UNXabIXKQ0SZaQ5E0Sbii*?erGQO_XQJI&Q97N>wyNhs77j?d7>6#%YFW+aO z3T6he`jQMHH}OiHR&PHK6%W^vgiD?E2vAvcUcCkAIO;7nxiSf>C7 zT;zhnYLD_ElV_KVK#`35m1dqpM!bwSH~TsV=NCJZ#VFQbqpkV27$@>31SAfELoN~J z1Qyh>1zA01Wx(h`GYBofbc1^){s3N{KDD{#fnBK{W*@)b$H1H{0M}ROs#0vnbw6en zR0fBPUUO}JAY8f)?aG&SqNZrCb>Uo&l2EZ^rpDMOoU<+VD zjN#=4c>>?8-x@<@MKf(Dgg$|HZrITTkssQ;l^M4{r^^hE;^R~xDxWeJL|MA+lz6p$ zoY(A}m2xWCqt%>{#ukriTyAzQJIGSOpJmW1x&FngXz-5*fzU|rSD6a9UyJtVa~(_a zWVskSS&1M;`BnMHLThO7bntwx!|Wh~o#;!-~mkPkT7I?Q9%7b{&2@cQ4rr z(OGX|A?;+(r2@xH*BGd^n}^+YwWr%9rB5H~l#rChPf1Sdyg(u>mF{wK6Tz7sZP9~I z+c#gibyr|=b!JM9P1y`K*b#W@0AzkLcW!|4D2~Rv&H}p}suGTzxS?QlVM6pM^viOB z4QxKma~+l)UQ9hWQ-lkdWO?5;F(j~UT)&20=jI+=F_n}08Vr<9Z*?uF@RH}al!r*o zET@&zh2_VUAawo>2Q8LiT7_-17w?-Ioex$T@iQO+|%f|~eH zrU^f^n60zd&mc$K>a#FAJGH+(MBL* zc(`Ao1CKPpN;gG%P19{S4^DsA@Uo zJREOiFfuDHUD4=f7^O-kx_%ed;Ym;Q9u&*Z)@Oj517%3Z+(yA}W1wg@g*{m=AtaZ*bXp970Hr8ns06=T2NjAVS3$L-`%2OETO8;%BG!Ju_ z$f)9GVQ0%^dujsf`~9;p2{+d&4$9_cSDK@$C#Ll2LpGU6%3azJYu7Gy@fj0zwZv{y z|7d7u>-fRhvH1ze8mWdeKRoOr*oV_(`DjijuVSndgeqQPaMtrS-Igm{IeqTs)?jjC zEOV)3awC@Zcz`$V%z+hIG?(4)^&)R0%Lwu|8-=Wqf?^)B`PuMhAFRCYnSm88d^~_G z=NbdkvtUyxXC6KZay&fJH{kStbi6f#D8x%#j`Ur?ZkxM0c-7QWI)M~Nc8?vq6pXfR zO?%@{0Ud2f0o^9_>N@|pOI2#7sU=ckY}JiG6=ELigD|@`zD8GZnMou&lUT;0^&)P> z&CWb)Fp7gMr;P79T4(1dahIApax{A5HX5j%;?usdHqU-+o}x;M44L}o1=4;vSc&e6 zc8%U-I_-vrH>8MB2<~Bt-vXU-6f1*dqfVTgr-CgMcGEI24lCd>F)oCg>A^_n>xk;uaQBCO?%aP}U!5@Ex%)=`J}zAk2@Hyvad*9>tk5Ju;Ew+tC) zmTqGVq9ddK%MM(XG97D#LFdH}DZrJ1S_TJnn;%6^>1hJlQ>fY()#F5V+}LY&3O#a) zG+d?>WkzKsAnd5k;)jGe@Ya!v%NVMm;u2opQ9-)FT^~89Rok7}QdR~Y#AzK!%R%*v z(aH9qoDeJnTrKh8xh(KGo$?M;euUhwSU!Rg6%@l zlS7=#G*bB0GH0=StaF`JKSW8t0`fCzgrUNos&EaM2sI-r0ZKP|uLG1YGE?gEI$+lF z@RC;<$4H(Y1n#a8DIyJU5mVm z;_0e-`&dW7Ufe)7rVd;~3uD){L>0HD{$P7lttDLwShtQY&hWm?D`m)$jnbLFro)z) z@`{!WENG(`H(A#%?Q_`_f*v@7Gp1@tK)Sgx=X0g|y>Gja-e6T|xpYb~ZP<9? zQy_(*fO7vg24vciMPhm0(au~ND&#rpp@KzCx)81mIahj}LO)FHIkXj);@ToLigOt+ zm=O#A6xYZk=v^$TbkhGS9RNF%^|kZWm_2L%q+gc7cp)!36NpVW2)WhRdZjgq+`+r0 zhUf*pqTCG|ITE(D=UwtpPLLfEav%&4$U4=QKXAmIgHn}^6oFJnmYXtQ%HO0a)Ugx5 zochX9%UZI9qwFhSsDf?#?0oyB*l4Vm2WHz45XTYMbkUO=W2_fFnk)sXjK=Pq(ooAa zs8HfEIN(+ajytnchFgsUKZ0*a=U+gMw*<3_<6uy(oHfVDo^5#Z_ zo(gEV5XL6OE*_nMQjZ)&@GdgQ$|{;5^MaF;WtEzimD6`s4zNxF;a$KgX z`>>FYN*J1F{H%@}n2}_ig+*Ov#>A(9;8D?|T<=t87hqn73USOQYT%X3+P1$Z2vpDN zT|7BE-MV-T%d1YOHFNRd_QJ*20Xv~dcM+vs)9sgvIknEk6VO%fTs)5Dfc#rGJ~vlv z4>BB;j^Hp~w)=LeBKn1E`-epOqX<<#@;b5;LQ#-R#>$F9fl@sO?LGtRLp z7!x*A(8pYJkJ15cuyr-jdN5^s#YG#wIbqq3=mK-*aDlF5T>8Uec9@V10&n^%# zm3D<2{h2%t(MJ}VGqba@iio;Yr8tCAJI?pWFu$_P!G89_W zch#Kkl7@v@FnH&fBF*uhq;655(v_Ozorw$HomUiQc=Y-HeV zJv@VskD7Q&j*7UmshB4-YmhysQ|={~q&}5I&$O;DNgW0jbYENRA51-zQ6Go6u4~yI zGxouzCS3VlS3c`2BKPHXe3tCyJz*yDRHrbvXm|S}Zu24xLUK2vmX0Lse~^yK*pkE# zr_{>ItUC@VH{%t=@kp2LIX3_QwiKv^LP^6B^KQB0sY*tfR=Ui0@YKvF4+9*s^;18j zYAUkPL_TxJOS=qM=CEz$im#u`?yz7uviGkkA$B zEh1$ArCV9$xClJz0BN(51E1yOnGmZS>3Koy4rRa+>siq`veI^QgPjV4f?mtwXsuC< z8vO^+9YD`iU<`XUrdCnn15Sl>S4uy%k3?;!JGiD5Z_5eX99@_-7cRM^EH)6fz5YWm z6x>3GAu-wdD{b$_xjthqODtWA{bIbSvhb@gg)*pncf;164v(RQ`KuNVZ7`klcCiJh zigTY}SVrbK(x9Rb{uf7s#^eAJF31jF3PLoJtQx&cW;dQl?`5$K%V&HHTp?84i(HeV zm~4#B;cjOvxyp5nI`M75%oB}I&G6nV&lVNmyV#mP9x6Tz&RQf0o&uLNz?2v))(fR+ zElkb|1DaMdhez?RS>COio*ln#$yWH ztR-p?RN9h-k3#oUxx};yB76!aJwZ0IPp-m(x0vj6D8??sX$J5x0eJ9@O}Hn^0%!f& za|&4?U|zC=8u}1dLgAc%R*V=RW(~JTMxd8K&7I-~8c7Mgr^qECdq=0*)J5gmd_e_g zM2OPq2*^I5Wp+7i)M6@}Ddqsfkod4Eh)Qn%Uv}V8RJdE$Nnv^l-ReIU?s&2)PK_OG z0YfRJvXH&o=83?2cS#JXp)|5Ij;Nb$Sq3nakhDHnCR@$0GW5b1jTp03hyAO7I6qz) z1xMz`o9$^FKU&J0LOuB1&M#5;vO^Bs7o0-YdsI6Kc8(P5)Ae zzzs)u8yN27tA0zhlIA!Bk{x`gS?O)6&ABWej=-XM`K~>eZQj*v?r1h&*w?774oDlS zi**zlgL+A3vZ`vrI*4nrK+&n$i;sXEE?q+$E?yYJfkdg~L}#|Cwnn;shB47M z&@IoS1%EwwPAe9A=sp_HiefLF$5=4k$Ljk^x?h#|#g%aUcNN}FD~|Ngy#~*UVw8?1 zJ;IFTcgGidR=yh#OQZW9eHZtYUuJmBmT4dHC5D|S=+0O?T}^u;WLrFhv1&$M3cTI(F204#@UV4sPuF*G z&zJYuI;K5K!cG))84tMADJNa+(fdO2Z2zn9uq3*_s_){y?`t_6nf4D+;bAg6n;2GjYB1=D4234oH!dYG9NwklNYabM|K`5&|bBkzD~@gpJr2E@NpN;<$o z@6lHl^lB;SK=^1yaUgutKy1Gx9Jv6Ao-YYUuZ8nceU0CYhHw55=~=*vV&9!`KB=!E z_8zRl)G37Xz??huucEU*E-jzP!hAy$Sx!8s9^Ai@u9H zE$=by9Q;Q#zK3o{-^KlXd5>vN!hf5__t1TtzKi>5d5>xDf&X5O@1gq{eHZuV@*dL` z{~N8wBQy){>H042Bfg!ZB-1`$;!hNG%kgWF{!IC1p@;6{^m~j~LAM+~hxA9}n}r^_9eo$~x8yyRdlUR8G`@%KoAh1Wi@%eX+Y5g~ z!qD$<`}JMicguUs_x~R4zY`_jr8ViHd$+!e`@Vn9TfnrB`Yyvx6m&oI6XN*QbUuuS zM1(FsOQ{9ETKOaSs)w#6T}AgE`Rqgw-E)2_S*)V_QF%YnL-%7APWKBIPWO8jPWPh^ zX#R9RC+~}^=>EdO>7K5wSw;7;@_wR+?l~4t_eB;?_Z1dSS0Qo2IgbPq0uha0Toa~* z-vM-P$FrhvqW3O%Pa-Su4>#WMcFR*d;iGr`odO4eufKs1S*OWge?zE_#3bLo{)X`F zxqt89-X!0?7*Ij-n{HS%P>JXHfP>|FQ=02dX^n33Tt5(Vy*bVGX36zWw1}H;U@x&3 zP{hqQBt_hu7IAZ0#LZsB_22i3-y%f}Yeu(75x*BaNfEb55u4bf#o{eD9F0x7B`xok zw7grqy#M+GFYi_#~z+;V09=PkQ0E{kUi42Y@?Znc4F<;KA#!!XYg28io{J118}$ z;L*#0gSXfh?CAjf`FIdZkUu|< zJqeh72oGWjt@HEPYe6<%g9oucM~xnn$Nm&CXZ?f3ehaZb&g*I|W20X9tgs0W466m&oIh%->5tLc0gkB~pO{46DZ_-f?}MxQ_x zJ?Scba*uol@(1^vM@kl}=zdh*LH^)=%);q@!NTc&&%)_`bfxA`_jB?N@(1@97Ebqc zZOtmWkCk_jKe*>uINcXnINeuRI9-KALjEEo1R@%rkUv1@c04KhgZCt|0#1YcS)Sqv z;CVAuc<2n6}V%Q{UC@`o2zLt>I|6Y}?S{}$vA-@X`7L2{5k1C@B54>(w^Ab&Ae zkUx0X3P~1f^nsWw$Y0DAPr?7_TgrLkX`T1H6VFe>rgQRy-gyM8!`^PEO!n{xihlK`im> zI?2XkhtZWSJcu1e%xE5aIskt@9>fyl&(C8|0%jk=gIGfA{5iLF~^_qsQd2 zKSj)0r%CL$5c}i2&UYi`CmPGX_);EwCt!FN9wC2l@78y5zaj6DCq4PpGgjV)hiU1) zP2a`+fxPEw|GR{p=%M=+JfMkmzAC|stLT15gXvffzJ`1s!oDQYqfGg2eGUEeLwJ9L zhjpR*V|^EQ?JqGr)`e*wlK2w^-KQZQvJpDvq-P-PEQxlujY-bK!;kUEKG`dn|!zZ<4SR1>N7ngRJP> zCc%s1^0TCbAEGCJq&?e1_s9A!?uC!eq16k2L&C61f!nX|;!eqXtj+($RSFt(moyNf z4!C#gySO($EpNe{i2IhrpD5^Fgm?^bI)j#!?t%u>IcC9hnOi~-lFWLT*~JolH66=r z72Ts6Ovf@?6*F^rV3L{C@Y~1`-9*PSTSIrRWOjg#WwwUyt2LO8HQARN4?; z69wHj;{i13yj6l1#pP!Skonc+5`ChFt|eVX_uUpw*Gh95k$flL+jnb{@8o;?&cT(` zausX&7CfL%bS#Ur>1r*#_bx_IpQLm!GR0kZgnYuiTi?Y!xhe+@)BZx@A%TOthJWEAn%K-=>C?4(|xCwvx=^j(?j>*lcoGsbQk6QL=Rmn z-+|0}e@N>s?srfwfJMiuvWD)}C=~zY9go+?F>oFj0UtB}?BTtgl zbUud%6WkiQU({eaXK1b0(0wExWJ2dr7EJfa8cfI9xQ6b82Gh~zF0P^bQVpi_Dm*Nb z?yqVvoi|x9-8XA6owr*s-FIj(oex_u-9Oi0I$yD1y5H7dI;Sa;tfAY32hE}LXbYyh zN`vW~Wx;gM)?hkMwqUxytig1wBOU8+LwEd%^pfN6^MDio84t$dw+*;>CFF*sj-#QW z2z?(y*r;UO9zR=q6+G-W=R>E7C*&rcke_%$j^YV;C-7J}oGN;Gm zLCfhpQC>&r5N8n@^B;}**8%J)XP&W=8RMJRAn&he{;ah10yBK!Qklj|*X959H6WxY zBUzI6qPQiCWN|Z3T%sLI7ugF;Yv3UXq}#9W;+_zOG)}Tid#l8sDCpM3@7MSqx`*)q zRCKPB;KfyRZ`5EqmV*FPw~*+o>DX7R;#bZa@T+g&!6Yv3&+!g0 zGv&FG!3dov%j+ne3pA9@b2XIC1`VZiiH6eIuAy|U&`>(pXegZ*YABsa4W)CfhSE8v zp>+PehSIrFL+QLhL+RY2p>%#z~rE=@=Pwu%5_G`ivJfHrr)|85C`{sP?h z>ASdRmAe;le?^CTHqib0 zcVb7I+xq9?;eI>!vAKU9(tQbjrVIP(A^dp=yA%(<&of{};B;zk!G4vW$=q)p%Ghy3`(_2!a|ed?!4qn!xyw{(5XIAII|%Ja^%FE1o~V z^J+Y=!SixFufP-1|7UFAej3j`cs_$Cgufb_n6Jh2Iy`T}6T<%)@9)Ew!dtN=!A-zB z@y^Yb5Z}RG%CF&JIJX}>9J?sLhUXaP?L7Iz)b(A>!fXWzb7hNh} zY{Emu3Mx}jY2qXvDnw8Tg31n5TA-o=l@q9hKxG0d5Kw7=$^lde;Kn~U`?;wf@RJ+H zf**t@$_w@V0Qg)oxm;9m{lx_V8Rf8K2j5q_ zHsA^QT!nBhZbJCek%sB!5Ox&LVLasRLwe@30}ta~j)!qf%RHEtt8nHS(ueqvK7@yS zx_#G&B?i|OtSgrf;k#Q9{uMk7za|N1`b~HWe8caq!#mR+z|+FB8_x)ykk41KjNww| zr+A*2gg^RmfCZinc=q54=~;(KJWs_kW(3b~;{6UhNAbJ{&orJnJRv>f{s|A$&f^K; zd?)U3nakC42p>b(9G(uITkxdehv7et=QVh)#lv(VemCCJZ$tQMg#QwrwRnc{q~T}7 z|13Oxc%F!d=|cR2=bo`L{WgUE7lgkX&wKHF6;C<*PK15R;y;+g&*MG)Hhf1o{5qc3 z<9Q>V5dI3lsGE+xh9>%!}TWDm|RP8O~`cq9p1?hpM=X58&_#ujd2CWl@?if zvhQTsnJ#=srkRW>T{6jJjL86#=_PYZhL-Umec)Foz^hK;={X;ZP&^^NSl2l|jZ+SA z7v|NS3~xAV(3+ns*3HZ=wAO9DY{x|lFiWAn(Z$i>V%_1H#dR>ZK3S}rI6i}X)P*q) zi3z66Qcn|cI5WcZ`Z71QP^_bVd9jXXYm0S<;6c=^=&7%3O*Rkl^gwfR0$&Cn@*f{> zwvLVCE|#Vq(OAdZfI6svI@gXPISRpD+T%z)i;VGaos_0IAM7ACZb6{^Yb0$QTs+(y zo2U6W<|5v?#e>wkcYk~4&}@hsJ9u!ubu{>3Dx?+OrM|%fP=?p3S=2-`wqm>wmU(#! z;@M%R;o1MHo|XGo6vg9{Z{U^R`S|}xJWMx=7{`)A6}9Nq6gwn(pN3)pXmEbeFzf)4lR>nhse@UTff9nWX!( zw`jVFXJ|V9XIlQKVjb$Y_D)Ur!w`u$!hz3tl5WkPTm2BmUuXm0=kbL6?yz*57-2uA zW&F#`W!^uublV9~`-ODB20zmiWLz&2e!Z544%6{R4g8RfW0dJmu9hhI$8>yNhbN?4 z^Vgd0%R3~A{3Go6y9rN7$Mq@md#c3fzfdmMr%cCotOZSAy6=8V)A0XVd;O1aL%LOu zdW57q8)?HYD|jI~giv=@|dbB;5}$*7}7!5GDE1 z|D7b=KU%swYR1PuB(v7t#iqC#$Rq+xK=nD{j1s=A8 zW1SF9^BXwrvBjegSm*zytJ9{Yp4V_tdWw z4C$Ntl}eJ1sh_=46r@+`KTG_iOX}B|mh?ycDorJwQU5uTp7cchPY^%phWeir6{Jp#CRGJjc8GpDcckYxQ&XkH6D1O3wcKr5K5~(~GB-{J&iCuPyn{EBO-yN6hKP z`K9=0l>E>1amt9E;ztij#Vr;6DX&65YZ&0UqBy%C$_99@D9$M^fj_`=Me&5KN$z@`81OMU|Mre|Th8R081($9zg zB>aRE{hQcu`|R0(68i{#y9I2LC^r|5c^*H!=N%XRQ3hmo@z#!T-wVow4%$ zmj2I}9{z*o|1A7mSFD4d?SBydxdh(N0?7#YzT&he78k=G`nNdk>|#^NKMH@q{}rb_ zsc6H04CDDA^5^J#Bm6hQ&-T;*VfgubJ0AM)f&X^IbEMFJ8c5Xp;U^`czYl({)5cKG zvryl|@N<25zQnICUIqWhk)D)^=|2Mheee&O{~`GAPx9*pVm$!=5sTjgKgTC2$(g{n z8Tcum)9+UoZ(uyud)l7W#k=6=?+_lA_gVArH~%-_zu=Rxy{plX4e)bIi|L;Q|Mnz) z5B%4_AL_pV|0MiyB>h|PLiyoE;$L07lM(pckB9kv4*naH^gp$D@)e9f6D0hPjsC0w zex0i%z4&(m&!V`<{GUKSF#Q$gCm%uo5%}**@_#e@_b2}U2LA)_hyML8{DJTwDJbwzu;4`{S)w0UVo4E|7+mifcQ|}AKUlq zkq7ht5d4&TJe2osOaDeo|2!iAA2a_p_$j{)@P0A;UwaPreG$*^ z4_o?6fLAQ<2KaAG>hpH^Z%OL^NlVZ1$n;-@|NTk&Ct=F`c#?j*u~zq3`s?AR{DJi1 z>1fYyT0Cbe=J%)O|1{(5%?X#!}M$6-|$xv|2JFw>6U&1e#)5$HsbfoE&en1{R#LdlkeXHKjmdx z5YP7AY3W0Mf5ZH5v+pki%XJIBzt{Zxl?9V?>8#(3`N=uaf2;Y=H~;PCr^EP<;N^bg z7wE|fuy8yJ^G|SD|Fv)*Nb0)-e)41nl8PS~W`6G+}w8eh_ z{tNzRgx^=-r#!78@vDmmEd4f1{|F8Y{GM;{eXjYh2AyDed*Gi;@;hqr0bgGaKjnI1 ze)uE!Z%opE4E~p(zesji->=#C7g~7_!vAI97dc6erza>2TWp4(i^bP1Y_RpHf1D;6F`ZH+* z{sQBFEgX)AU!fnrTktUc0Q}pL{;`ix{~Y|+B;UW@(*MBbn-9W&EUC|z;OG9=t0ceG z#Sh`X5%C;0%zr%_hF@skLA>;$f5Z5lh5wt+jr9JwrT=gEhTq?2{%4#2edZ@$#Q4ve z|12OF{VPCdDM!}vyt;Ti2`_#hu=Ks==Vwg675=b(A^dj2zw+J)?@3F4nSK8o@Lzy< z(l37h9{4E_Zis(%aWDKElK2PV|MIhO3JdX^j~;_1%67ynJphiue@#-}i**T8g!aA~ z{$q$AwDSJK;$MPs!Sa7%{)?@CPktikA=3Z0rN0z@{w~JD^keXU(D>=IPFr0ZgP;58 zgED`tE^dbZ<4Jwq1OI*SAGPnl2><;_{0a<&2NM4#_`i(#8|WnMy@CS;zl-p&{BiTo zgYTjLwdQ}X;n&^f=gNxlpMie_@D1bfTkvz=^{o=Wy7)Q#+y7VWujc}>Hh^E8mHbu} zy+kzpF2lq8j=mKTKv!8za8J-Wd3u32;2|) zn)p{27sJne__L&btBdVK6#PDchviM0f3NwE@_Ve`eg;3`|5}S5wfMK0|BL4T68+rw zxBS0n@qb|W*=tMuO_u%&__<&7bMdb(j>CWMXM3!^ST|Yve`o3cyZK*j{!hUl`0q8~ zzyBKk?f5>>&qtaFLFr3TJPH0?fFGwN&OhtnUw|K8wC+a_T?+psz9$+H9PvLzXkpWkbl6J&%^&p;Jf0-n&O|~U-|i-l^age^3HpP=Km`DeyjP3WMi^=Ko8JKkM0e!S6ym%-F&Wf*y03L-_ta{F8{k!oL3t_(y<`XIT7a;pgwMR{l5OzY*y*9(#)yX#7=h zSbi`3)N2a#ehd5;Kt2`lqse%z|2SSbzJHV7BR$cK{hQsuI@ZXR0Yt8>6_`e5!i1DqUYZLxs z#q+eh-+{ySody4ms87I`K8q*(7{3+%+Yuk|`QKW6m~UQc{wpl~@0fqH`Tq<2_v8C8 zzW>JJUuW?J_wUz@i^J`EypGQ=$ejmxZ8o>;-?Oi|Ysct*G5WSO^IfqeiJF*g9-f*# zI5yRkZT#lg;;{l-^mDKa-kMl9xW2bhFrwL>I7VMT?qZ~Fz{KM8G;UMXa)z(mD#dKu zw|Vz)Gx%6cc#oxs&VZCcqm^Q;uVlT_Z6WeT15HphaoK#~uD*>++qq1d~=X zy`U^5)CYpmOtHL($j16C8woBM9Av7Y)OMiS{40lwMM0+BkfueExSaA-Ed;)BSO11u z>w#5chRv-nxN`IE9b3>*#1|-A%#R&!wq{_PG!1}x!1-AGo^9Jkhxa%4Z@z5Tuvo5! zXCRk#?WRqa@7i(MmTRtQ_OBaA zGw5rGHRY|di?GOu`}oFj7gs1U%cOFbbKfCeIlp5jrkAVo#4CnA|5Z2ts)^_7)mi%| zXErpi+!@+E1be6R?Qz&9?Ni8XZ5?fow;JmOOzMHnQYK+t%Jzf%C+5cvyTxr7kY1k~ zvE7R3t+1Qxjj3cHjo-7FbWq-UuW4goveiC3xqvIa#7e#zAr9?m45Q=EgLMaP$ip=bgM0bH zY=-vA?HXGedf~a(sd8I$8KGi7Y~aN;+XYdXqi4|&r6q?>-`@SS_^EzPsMcf~jTX^u zTbq|Y4UddAM~3z~(AV#^M7nYJ0EV zv9WL*cHQ&pb{M7x_=oqIA$z76+`A3869Gc|(4nJ3tlI5^MYClT2QA(`hTvmEYBP3N z3=wM$BWpQ!QX{p|&@G#`pc>$Z{h_CwQqF|f_2X$(L^6YUN< zbq04WT{*kZJ_M`yJ25dO9WsPy>Ywdy%`Ar8)}#OPz(OduQK;nWDvs^g1KX(+?U^Rb ziffwZb^qM#+~O2&Qec6@emVdL0@y$$06 z9t~@^Gu!F?n{gS|3{~uSqXsTSVKe&nZk~g6>v1tAOWc9Ar?yGVq#uvA$Lm*19J(U9kktxiUCRN zj;Atx8*0zYEdp6+T04}se(#P_U|MEF`gm7sEMlwnaSUSeje9TO1yVRY#zEzvM5}i- z`ZQc`KN?m#nWDtjUhPlblN9bU5#)&T6b6f4GmaaFwW%_hZs}tO>J3U>rVs=hf5&mP zm-O96w@cpO@Z2-sM%M}ihp*%ZjWmQM$W1~*Yx-fwnx!6^Yfj3A1_=>XyU(~1uC>71 zh^H6L7JaDHMnounMNBKmsdY6Q+!O=F;47lFVei?k4Q+kdV0{R8^2k|%^i5_3zOY3g z_S-L;J*L$`CkY@q&C)dYR#-`%Jv`7l)*9Cc&ub%w`1QQdtpl`T$uljWd{dZVV@v_9 z(BMXjU}BYA;X9O|m-GCV`~6N9uXIka|0gz_%NEf&qCySa?+gV(i=r#Hk8k8IqF zI{*apS%E<12Rq}qXm@x*C|-t}0;gtT?-|2-2Pz?!!I6W*i5Gg%+`EF$;jvr|k{XjE zmWyHbfwyeU%j_HTZ}cX?GTy!DI2-!SvTR(8=gpb>FoyuFLwotMElX(4NsNt0j>8+$ zivi|57Z*Uuah(xLpDOkZ+`QERR>wy=XR z#$D?|B-bC=E%%bh^%sF3Zq1L3EldVrm21=hJ1|A_{GF@Y3zMuPI$^XaByK&udUF+Q zpYNWXP+m!E!^5u#(V(E!hh@4}>kxiI=c96|kZoFmy_RgrOCcP7KyYiVoi zW)D74HlVGrw7BMb{<@sg-Z+WohFbOR-5z`>rn`OkzyMnQNVu%LA`*^g*$D}FCOp)TuI+4&j4dRImLbcRx!L)JtLDI2 zw`4H!qQMO{;ffYv6k(RY$|~S%AE>eW1)9BkeU2uZs-MMNu!Eh7s?_Q@w<; zv>b0VG^3frnDzx4`*(yHfz^#Tw0;6NiHuJgYaY@FXLO+5X=9NnOlm2Ae06j`nKWfa zazHn5iFRjkz7@Xr$qRQgqU>14A#gZhjRzJbFg!AxaH%i`D!Zjp2I(QOEng}PkM#HE zY-nXM#Q_|r9VO%qPQsCpZ*5JD9almn)vzIs6$z^%J)Lo09GvJZvSOg{p=n4rF*S0u zBINOIz zBV_RU_5_GK`ps9BrOZ+4QC^s#Q1Hf~${Z;TYpc&gq0No{WkfJb-KvqI#WHfN{i7+l zl%|C$bj3=+m_Bs$@UaEpCZ|K*_!NEnux!8`v2ENfBRO_o(O?;DYnc+*s_U&~g;=59 z2?Mv(Z81b&AfHN7NMMI3ir7D!ka$);<~pv6Ocm3_NvCEI5H?#TTjSSJD#QWbY!7W1 zT89g6n{(sMg~`R4>((7S#@tijr^`4k*(T9`49=?Tqe9~Q+MPWIJGddOHE|gwB%>m5 z_4@ZJ4Ra}zv|K2#R3s7|>E3}!0At?8G1W`xwlh9_zJFBctz?vm2a=^!se^|WWzGP! zjTf(}1&Ij-51qJ_#+Vrjt7BF)$|b@g1|y4PR7tE-9b*E-Q@(a8?c%cBv@sxJ9EU<7 zf^MlOIkEXxA_!@)(>E_bSaxu6p(V?`zTPB0Msd|r!>I&LK6V6Yk{V_<+I9ojJVk<6_>4Nd-lEXXnO_EVee|sy~|tN;Hy`G%P*X&VW4|jx|s}tbGvO zye4#eMesb-;hk9$T`%+Gy~?@hc4NCEL!|{l3;}Z>#iV3(l6vQhH?7}D``Gl@9O@nU zF)X;U_3=g(2+hveiPnHKR~&5yes>EmUcyOH8IqCrX!N2~EbLmif>;T-EfNP?6*3T6 z%sP&RIs1Gy&=KwxVS`7u&9_>(Yz)zco+>@tN1?j*k$;vi&o??Canl)=JM2_J?!bIS zc1fC*jmwPJ4x$IhXXQ?_#vo96KlVz%*yG|TCGU;CEJU)5s46sLP-w<*vOq2q{)}kU z5YB#%Azo!G%Rpt74uD8R2UA$0Gpk2=T6h(Ma*FoIx#qBo9D3v$V;p!;}fumSzBMy+K5HKvZO-{&@ zmbhULEe;)3vtS}D(tW;|mV(A0;T9Q?$Tk$JdPQG1ZmiJ{QP>EWVQ?Kn%`!pQh9kRM z(_3cej*lE2*?Ck14nZhXw~-}#pP0k*VbFEUu{;>^#+7oZ-T7QPhd{U28@nJZfXcuj z+L2je08BhN35;o3ZwNXhyKPGTb+yGflN1GN0pbm|ZdYsO@WLc6fFC;!5g;X@+jh14 zhlYnsH^_R|VgW-&Xu=jJ(qjRx9PuJWRQZxDY0&WpeEEkeDb_|PlfVh3;~q;`bZ&4D zEAC})5H|WsEZx!TM|Ee73>nM^BrH1w6Mo-e83uw|9L4|(SbeEssC^VtEQ97z_@-Q$ z(g7hXkSE9#CVdebnNZZY#jp$;X8U>Ab!{yOJTY})U4HnutTp=cpcG7%=}ebDm4x$+FxkJOgu&9DNVDQbt;Ik@3;v%12!iA*DK zZZf1xS*c8Sd>l4DI&t3b$a3iLv13h$#yhh!W4KHAc=Kp)c>>R>eyYO^%MkWCJ9cNI zmOt7!iCZpT3R%b4lyXg%jbRa!qF3CL)Cs&y4$3_B0GSZY!l^>Hm7SfZU;abrRSXPdq`$Pjrfyp^)F3G$^ ziY=QEbFQvPR#*C}3>TxPjs!Ycq@J#heEY-=I>O$0$W1G-`!M%Jb{tvI? BIw=4E diff --git a/tests/testserver/apache2/testdata/www/htdocs/protected/rfc3252.txt b/tests/testserver/apache2/testdata/www/htdocs/protected/rfc3252.txt deleted file mode 100644 index b80c61bf..00000000 --- a/tests/testserver/apache2/testdata/www/htdocs/protected/rfc3252.txt +++ /dev/null @@ -1,899 +0,0 @@ - - - - - - -Network Working Group H. Kennedy -Request for Comments: 3252 Mimezine -Category: Informational 1 April 2002 - - - Binary Lexical Octet Ad-hoc Transport - -Status of this Memo - - This memo provides information for the Internet community. It does - not specify an Internet standard of any kind. Distribution of this - memo is unlimited. - -Copyright Notice - - Copyright (C) The Internet Society (2002). All Rights Reserved. - -Abstract - - This document defines a reformulation of IP and two transport layer - protocols (TCP and UDP) as XML applications. - -1. Introduction - -1.1. Overview - - This document describes the Binary Lexical Octet Ad-hoc Transport - (BLOAT): a reformulation of a widely-deployed network-layer protocol - (IP [RFC791]), and two associated transport layer protocols (TCP - [RFC793] and UDP [RFC768]) as XML [XML] applications. It also - describes methods for transporting BLOAT over Ethernet and IEEE 802 - networks as well as encapsulating BLOAT in IP for gatewaying BLOAT - across the public Internet. - -1.2. Motivation - - The wild popularity of XML as a basis for application-level protocols - such as the Blocks Extensible Exchange Protocol [RFC3080], the Simple - Object Access Protocol [SOAP], and Jabber [JABBER] prompted - investigation into the possibility of extending the use of XML in the - protocol stack. Using XML at both the transport and network layer in - addition to the application layer would provide for an amazing amount - of power and flexibility while removing dependencies on proprietary - and hard-to-understand binary protocols. This protocol unification - would also allow applications to use a single XML parser for all - aspects of their operation, eliminating developer time spent figuring - out the intricacies of each new protocol, and moving the hard work of - - - - -Kennedy Informational [Page 1] - -RFC 3252 Binary Lexical Octet Ad-hoc Transport 1 April 2002 - - - parsing to the XML toolset. The use of XML also mitigates concerns - over "network vs. host" byte ordering which is at the root of many - network application bugs. - -1.3. Relation to Existing Protocols - - The reformulations specified in this RFC follow as closely as - possible the spirit of the RFCs on which they are based, and so MAY - contain elements or attributes that would not be needed in a pure - reworking (e.g. length attributes, which are implicit in XML.) - - The layering of network and transport protocols are maintained in - this RFC despite the optimizations that could be made if the line - were somewhat blurred (i.e. merging TCP and IP into a single, larger - element in the DTD) in order to foster future use of this protocol as - a basis for reformulating other protocols (such as ICMP.) - - Other than the encoding, the behavioral aspects of each of the - existing protocols remain unchanged. Routing, address spaces, TCP - congestion control, etc. behave as specified in the extant standards. - Adapting to new standards and experimental algorithm heuristics for - improving performance will become much easier once the move to BLOAT - has been completed. - -1.4. Requirement Levels - - The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", - "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this - document are to be interpreted as described in BCP 14, RFC 2119 - [RFC2119]. - -2. IPoXML - - This protocol MUST be implemented to be compliant with this RFC. - IPoXML is the root protocol REQUIRED for effective use of TCPoXML - (section 3.) and higher-level application protocols. - - The DTD for this document type can be found in section 7.1. - - The routing of IPoXML can be easily implemented on hosts with an XML - parser, as the regular structure lends itself handily to parsing and - validation of the document/datagram and then processing the - destination address, TTL, and checksum before sending it on to its - next-hop. - - The reformulation of IPv4 was chosen over IPv6 [RFC2460] due to the - wider deployment of IPv4 and the fact that implementing IPv6 as XML - would have exceeded the 1500 byte Ethernet MTU. - - - -Kennedy Informational [Page 2] - -RFC 3252 Binary Lexical Octet Ad-hoc Transport 1 April 2002 - - - All BLOAT implementations MUST use - and specify - the UTF-8 encoding - of RFC 2279 [RFC2279]. All BLOAT document/datagrams MUST be well- - formed and include the XMLDecl. - -2.1. IP Description - - A number of items have changed (for the better) from the original IP - specification. Bit-masks, where present have been converted into - human-readable values. IP addresses are listed in their dotted- - decimal notation [RFC1123]. Length and checksum values are present - as decimal integers. - - To calculate the length and checksum fields of the IP element, a - canonicalized form of the element MUST be used. The canonical form - SHALL have no whitespace (including newline characters) between - elements and only one space character between attributes. There - SHALL NOT be a space following the last attribute in an element. - - An iterative method SHOULD be used to calculate checksums, as the - length field will vary based on the size of the checksum. - - The payload element bears special attention. Due to the character - set restrictions of XML, the payload of IP datagrams (which MAY - contain arbitrary data) MUST be encoded for transport. This RFC - REQUIRES the contents of the payload to be encoded in the base-64 - encoding of RFC 2045 [RFC2045], but removes the requirement that the - encoded output MUST be wrapped on 76-character lines. - - - - - - - - - - - - - - - - - - - - - - - - -Kennedy Informational [Page 3] - -RFC 3252 Binary Lexical Octet Ad-hoc Transport 1 April 2002 - - -2.2. Example Datagram - - The following is an example IPoXML datagram with an empty payload: - - - - -

- - - - - - - - - - - - - - - -
- - - - -3. TCPoXML - - This protocol MUST be implemented to be compliant with this RFC. The - DTD for this document type can be found in section 7.2. - -3.1. TCP Description - - A number of items have changed from the original TCP specification. - Bit-masks, where present have been converted into human-readable - values. Length and checksum and port values are present as decimal - integers. - - To calculate the length and checksum fields of the TCP element, a - canonicalized form of the element MUST be used as in section 2.1. - - An iterative method SHOULD be used to calculate checksums as in - section 2.1. - - The payload element MUST be encoded as in section 2.1. - - - -Kennedy Informational [Page 4] - -RFC 3252 Binary Lexical Octet Ad-hoc Transport 1 April 2002 - - - The TCP offset element was expanded to a maximum of 255 from 16 to - allow for the increased size of the header in XML. - - TCPoXML datagrams encapsulated by IPoXML MAY omit the header - as well as the declaration. - -3.2. Example Datagram - - The following is an example TCPoXML datagram with an empty payload: - - - - - - - - - - - - - - - - - - - - - - - - -4. UDPoXML - - This protocol MUST be implemented to be compliant with this RFC. The - DTD for this document type can be found in section 7.3. - -4.1. UDP Description - - A number of items have changed from the original UDP specification. - Bit-masks, where present have been converted into human-readable - values. Length and checksum and port values are present as decimal - integers. - - - - - - - -Kennedy Informational [Page 5] - -RFC 3252 Binary Lexical Octet Ad-hoc Transport 1 April 2002 - - - To calculate the length and checksum fields of the UDP element, a - canonicalized form of the element MUST be used as in section 2.1. An - iterative method SHOULD be used to calculate checksums as in section - 2.1. - - The payload element MUST be encoded as in section 2.1. - - UDPoXML datagrams encapsulated by IPoXML MAY omit the header - as well as the declaration. - -4.2. Example Datagram - - The following is an example UDPoXML datagram with an empty payload: - - - - - - - - - - - - - - -5. Network Transport - - This document provides for the transmission of BLOAT datagrams over - two common families of physical layer transport. Future RFCs will - address additional transports as routing vendors catch up to the - specification, and we begin to see BLOAT routed across the Internet - backbone. - -5.1. Ethernet - - BLOAT is encapsulated in Ethernet datagrams as in [RFC894] with the - exception that the type field of the Ethernet frame MUST contain the - value 0xBEEF. The first 5 octets of the Ethernet frame payload will - be 0x3c 3f 78 6d 6c (" - --> - - - - -Kennedy Informational [Page 7] - -RFC 3252 Binary Lexical Octet Ad-hoc Transport 1 April 2002 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Kennedy Informational [Page 9] - -RFC 3252 Binary Lexical Octet Ad-hoc Transport 1 April 2002 - - - - - - - - - - - - - - - - - - - - - - - - -Kennedy Informational [Page 10] - -RFC 3252 Binary Lexical Octet Ad-hoc Transport 1 April 2002 - - - - - - - - - - - - - -7.2. TCPoXML DTD - - - - - - - - - - - - - - - - - -Kennedy Informational [Page 11] - -RFC 3252 Binary Lexical Octet Ad-hoc Transport 1 April 2002 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Kennedy Informational [Page 12] - -RFC 3252 Binary Lexical Octet Ad-hoc Transport 1 April 2002 - - - - - - - - - - - - - - - - - - - - -7.3. UDPoXML DTD - - - - - - - - - - - - - - - -Kennedy Informational [Page 13] - -RFC 3252 Binary Lexical Octet Ad-hoc Transport 1 April 2002 - - -8. Security Considerations - - XML, as a subset of SGML, has the same security considerations as - specified in SGML Media Types [RFC1874]. Security considerations - that apply to IP, TCP and UDP also likely apply to BLOAT as it does - not attempt to correct for issues not related to message format. - -9. References - - [JABBER] Miller, J., "Jabber", draft-miller-jabber-00.txt, - February 2002. (Work in Progress) - - [RFC768] Postel, J., "User Datagram Protocol", STD 6, RFC 768, - August 1980. - - [RFC791] Postel, J., "Internet Protocol", STD 5, RFC 791, - September 1981. - - [RFC793] Postel, J., "Transmission Control Protocol", STD 7, RFC - 793, September 1981. - - [RFC894] Hornig, C., "Standard for the Transmission of IP - Datagrams over Ethernet Networks.", RFC 894, April 1984. - - [RFC1042] Postel, J. and J. Reynolds, "Standard for the - Transmission of IP Datagrams Over IEEE 802 Networks", STD - 43, RFC 1042, February 1988. - - [RFC1123] Braden, R., "Requirements for Internet Hosts - - Application and Support", RFC 1123, October 1989. - - [RFC1874] Levinson, E., "SGML Media Types", RFC 1874, December - 1995. - - [RFC2003] Perkins, C., "IP Encapsulation within IP", RFC 2003, - October 1996. - - [RFC2045] Freed, N. and N. Borenstein, "Multipurpose Internet Mail - Extensions (MIME) Part One: Format of Internet Message - Bodies", RFC 2045, November 1996. - - [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate - Requirement Levels", BCP 14, RFC 2119, March 1997. - - [RFC2279] Yergeau, F., "UTF-8, a transformation format of ISO - 10646", RFC 2279, January 1998. - - - - - -Kennedy Informational [Page 14] - -RFC 3252 Binary Lexical Octet Ad-hoc Transport 1 April 2002 - - - [RFC2460] Deering, S. and R. Hinden, "Internet Protocol, Version 6 - (IPv6) Specification", RFC 2460, December 1998. - - [RFC3080] Rose, M., "The Blocks Extensible Exchange Protocol Core", - RFC 3080, March 2001. - - [SOAP] Box, D., Ehnebuske, D., Kakivaya, G., Layman, A., - Mendelsohn, N., Nielsen, H. F., Thatte, S. Winer, D., - "Simple Object Access Protocol (SOAP) 1.1" World Wide Web - Consortium Note, May 2000 http://www.w3.org/TR/SOAP/ - - [XML] Bray, T., Paoli, J., Sperberg-McQueen, C. M., "Extensible - Markup Language (XML)" World Wide Web Consortium - Recommendation REC- xml-19980210. - http://www.w3.org/TR/1998/REC-xml-19980210 - -10. Author's Address - - Hugh Kennedy - Mimezine - 1060 West Addison - Chicago, IL 60613 - USA - - EMail: kennedyh@engin.umich.edu - - - - - - - - - - - - - - - - - - - - - - - - - - -Kennedy Informational [Page 15] - -RFC 3252 Binary Lexical Octet Ad-hoc Transport 1 April 2002 - - -11. Full Copyright Statement - - Copyright (C) The Internet Society (2002). All Rights Reserved. - - This document and translations of it may be copied and furnished to - others, and derivative works that comment on or otherwise explain it - or assist in its implementation may be prepared, copied, published - and distributed, in whole or in part, without restriction of any - kind, provided that the above copyright notice and this paragraph are - included on all such copies and derivative works. However, this - document itself may not be modified in any way, such as by removing - the copyright notice or references to the Internet Society or other - Internet organizations, except as needed for the purpose of - developing Internet standards in which case the procedures for - copyrights defined in the Internet Standards process must be - followed, or as required to translate it into languages other than - English. - - The limited permissions granted above are perpetual and will not be - revoked by the Internet Society or its successors or assigns. - - This document and the information contained herein is provided on an - "AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING - TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING - BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION - HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF - MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. - -Acknowledgement - - Funding for the RFC Editor function is currently provided by the - Internet Society. - - - - - - - - - - - - - - - - - - - -Kennedy Informational [Page 16] - diff --git a/util/unicode/README b/util/unicode/README index 2ff81760..1b6efb23 100644 --- a/util/unicode/README +++ b/util/unicode/README @@ -4,8 +4,8 @@ To update: * Find the data (UAX #44, UCD; not the XML version) at ftp://www.unicode.org/Public/zipped/$Version/ * Unpack the zip file; for each file in data/, replace with the new - version; find the *BreakProperty.txt in auxiliary/. (These last are - only in the zip, not in the web-space's unpacked versions.) + version; find the *BreakProperty.txt in auxiliary/ and emoji-data.txt + in emoji/. * In tst_QTextBoundaryFinder's data/ sub-directory, update its files from the auxiliary/ sub-directory of the UCD data. * If needed, add an entry to enum QChar::UnicodeVersion for the new diff --git a/util/unicode/data/emoji-data.txt b/util/unicode/data/emoji-data.txt new file mode 100644 index 00000000..5d7dc1b1 --- /dev/null +++ b/util/unicode/data/emoji-data.txt @@ -0,0 +1,1261 @@ +# emoji-data.txt +# Date: 2020-01-28, 20:52:38 GMT +# © 2020 Unicode®, Inc. +# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. +# For terms of use, see http://www.unicode.org/terms_of_use.html +# +# Emoji Data for UTS #51 +# Version: 13.0 +# +# For documentation and usage, see http://www.unicode.org/reports/tr51 +# +# Format: +# ; # +# Note: there is no guarantee as to the structure of whitespace or comments +# +# Characters and sequences are listed in code point order. Users should be shown a more natural order. +# See the CLDR collation order for Emoji. + + +# ================================================ + +# All omitted code points have Emoji=No +# @missing: 0000..10FFFF ; Emoji ; No + +0023 ; Emoji # E0.0 [1] (#️) number sign +002A ; Emoji # E0.0 [1] (*️) asterisk +0030..0039 ; Emoji # E0.0 [10] (0️..9️) digit zero..digit nine +00A9 ; Emoji # E0.6 [1] (©️) copyright +00AE ; Emoji # E0.6 [1] (®️) registered +203C ; Emoji # E0.6 [1] (‼️) double exclamation mark +2049 ; Emoji # E0.6 [1] (⁉️) exclamation question mark +2122 ; Emoji # E0.6 [1] (™️) trade mark +2139 ; Emoji # E0.6 [1] (ℹ️) information +2194..2199 ; Emoji # E0.6 [6] (↔️..↙️) left-right arrow..down-left arrow +21A9..21AA ; Emoji # E0.6 [2] (↩️..↪️) right arrow curving left..left arrow curving right +231A..231B ; Emoji # E0.6 [2] (⌚..⌛) watch..hourglass done +2328 ; Emoji # E1.0 [1] (⌨️) keyboard +23CF ; Emoji # E1.0 [1] (⏏️) eject button +23E9..23EC ; Emoji # E0.6 [4] (⏩..⏬) fast-forward button..fast down button +23ED..23EE ; Emoji # E0.7 [2] (⏭️..⏮️) next track button..last track button +23EF ; Emoji # E1.0 [1] (⏯️) play or pause button +23F0 ; Emoji # E0.6 [1] (⏰) alarm clock +23F1..23F2 ; Emoji # E1.0 [2] (⏱️..⏲️) stopwatch..timer clock +23F3 ; Emoji # E0.6 [1] (⏳) hourglass not done +23F8..23FA ; Emoji # E0.7 [3] (⏸️..⏺️) pause button..record button +24C2 ; Emoji # E0.6 [1] (Ⓜ️) circled M +25AA..25AB ; Emoji # E0.6 [2] (▪️..▫️) black small square..white small square +25B6 ; Emoji # E0.6 [1] (▶️) play button +25C0 ; Emoji # E0.6 [1] (◀️) reverse button +25FB..25FE ; Emoji # E0.6 [4] (◻️..◾) white medium square..black medium-small square +2600..2601 ; Emoji # E0.6 [2] (☀️..☁️) sun..cloud +2602..2603 ; Emoji # E0.7 [2] (☂️..☃️) umbrella..snowman +2604 ; Emoji # E1.0 [1] (☄️) comet +260E ; Emoji # E0.6 [1] (☎️) telephone +2611 ; Emoji # E0.6 [1] (☑️) check box with check +2614..2615 ; Emoji # E0.6 [2] (☔..☕) umbrella with rain drops..hot beverage +2618 ; Emoji # E1.0 [1] (☘️) shamrock +261D ; Emoji # E0.6 [1] (☝️) index pointing up +2620 ; Emoji # E1.0 [1] (☠️) skull and crossbones +2622..2623 ; Emoji # E1.0 [2] (☢️..☣️) radioactive..biohazard +2626 ; Emoji # E1.0 [1] (☦️) orthodox cross +262A ; Emoji # E0.7 [1] (☪️) star and crescent +262E ; Emoji # E1.0 [1] (☮️) peace symbol +262F ; Emoji # E0.7 [1] (☯️) yin yang +2638..2639 ; Emoji # E0.7 [2] (☸️..☹️) wheel of dharma..frowning face +263A ; Emoji # E0.6 [1] (☺️) smiling face +2640 ; Emoji # E4.0 [1] (♀️) female sign +2642 ; Emoji # E4.0 [1] (♂️) male sign +2648..2653 ; Emoji # E0.6 [12] (♈..♓) Aries..Pisces +265F ; Emoji # E11.0 [1] (♟️) chess pawn +2660 ; Emoji # E0.6 [1] (♠️) spade suit +2663 ; Emoji # E0.6 [1] (♣️) club suit +2665..2666 ; Emoji # E0.6 [2] (♥️..♦️) heart suit..diamond suit +2668 ; Emoji # E0.6 [1] (♨️) hot springs +267B ; Emoji # E0.6 [1] (♻️) recycling symbol +267E ; Emoji # E11.0 [1] (♾️) infinity +267F ; Emoji # E0.6 [1] (♿) wheelchair symbol +2692 ; Emoji # E1.0 [1] (⚒️) hammer and pick +2693 ; Emoji # E0.6 [1] (⚓) anchor +2694 ; Emoji # E1.0 [1] (⚔️) crossed swords +2695 ; Emoji # E4.0 [1] (⚕️) medical symbol +2696..2697 ; Emoji # E1.0 [2] (⚖️..⚗️) balance scale..alembic +2699 ; Emoji # E1.0 [1] (⚙️) gear +269B..269C ; Emoji # E1.0 [2] (⚛️..⚜️) atom symbol..fleur-de-lis +26A0..26A1 ; Emoji # E0.6 [2] (⚠️..⚡) warning..high voltage +26A7 ; Emoji # E13.0 [1] (⚧️) transgender symbol +26AA..26AB ; Emoji # E0.6 [2] (⚪..⚫) white circle..black circle +26B0..26B1 ; Emoji # E1.0 [2] (⚰️..⚱️) coffin..funeral urn +26BD..26BE ; Emoji # E0.6 [2] (⚽..⚾) soccer ball..baseball +26C4..26C5 ; Emoji # E0.6 [2] (⛄..⛅) snowman without snow..sun behind cloud +26C8 ; Emoji # E0.7 [1] (⛈️) cloud with lightning and rain +26CE ; Emoji # E0.6 [1] (⛎) Ophiuchus +26CF ; Emoji # E0.7 [1] (⛏️) pick +26D1 ; Emoji # E0.7 [1] (⛑️) rescue worker’s helmet +26D3 ; Emoji # E0.7 [1] (⛓️) chains +26D4 ; Emoji # E0.6 [1] (⛔) no entry +26E9 ; Emoji # E0.7 [1] (⛩️) shinto shrine +26EA ; Emoji # E0.6 [1] (⛪) church +26F0..26F1 ; Emoji # E0.7 [2] (⛰️..⛱️) mountain..umbrella on ground +26F2..26F3 ; Emoji # E0.6 [2] (⛲..⛳) fountain..flag in hole +26F4 ; Emoji # E0.7 [1] (⛴️) ferry +26F5 ; Emoji # E0.6 [1] (⛵) sailboat +26F7..26F9 ; Emoji # E0.7 [3] (⛷️..⛹️) skier..person bouncing ball +26FA ; Emoji # E0.6 [1] (⛺) tent +26FD ; Emoji # E0.6 [1] (⛽) fuel pump +2702 ; Emoji # E0.6 [1] (✂️) scissors +2705 ; Emoji # E0.6 [1] (✅) check mark button +2708..270C ; Emoji # E0.6 [5] (✈️..✌️) airplane..victory hand +270D ; Emoji # E0.7 [1] (✍️) writing hand +270F ; Emoji # E0.6 [1] (✏️) pencil +2712 ; Emoji # E0.6 [1] (✒️) black nib +2714 ; Emoji # E0.6 [1] (✔️) check mark +2716 ; Emoji # E0.6 [1] (✖️) multiply +271D ; Emoji # E0.7 [1] (✝️) latin cross +2721 ; Emoji # E0.7 [1] (✡️) star of David +2728 ; Emoji # E0.6 [1] (✨) sparkles +2733..2734 ; Emoji # E0.6 [2] (✳️..✴️) eight-spoked asterisk..eight-pointed star +2744 ; Emoji # E0.6 [1] (❄️) snowflake +2747 ; Emoji # E0.6 [1] (❇️) sparkle +274C ; Emoji # E0.6 [1] (❌) cross mark +274E ; Emoji # E0.6 [1] (❎) cross mark button +2753..2755 ; Emoji # E0.6 [3] (❓..❕) question mark..white exclamation mark +2757 ; Emoji # E0.6 [1] (❗) exclamation mark +2763 ; Emoji # E1.0 [1] (❣️) heart exclamation +2764 ; Emoji # E0.6 [1] (❤️) red heart +2795..2797 ; Emoji # E0.6 [3] (➕..➗) plus..divide +27A1 ; Emoji # E0.6 [1] (➡️) right arrow +27B0 ; Emoji # E0.6 [1] (➰) curly loop +27BF ; Emoji # E1.0 [1] (➿) double curly loop +2934..2935 ; Emoji # E0.6 [2] (⤴️..⤵️) right arrow curving up..right arrow curving down +2B05..2B07 ; Emoji # E0.6 [3] (⬅️..⬇️) left arrow..down arrow +2B1B..2B1C ; Emoji # E0.6 [2] (⬛..⬜) black large square..white large square +2B50 ; Emoji # E0.6 [1] (⭐) star +2B55 ; Emoji # E0.6 [1] (⭕) hollow red circle +3030 ; Emoji # E0.6 [1] (〰️) wavy dash +303D ; Emoji # E0.6 [1] (〽️) part alternation mark +3297 ; Emoji # E0.6 [1] (㊗️) Japanese “congratulations” button +3299 ; Emoji # E0.6 [1] (㊙️) Japanese “secret” button +1F004 ; Emoji # E0.6 [1] (🀄) mahjong red dragon +1F0CF ; Emoji # E0.6 [1] (🃏) joker +1F170..1F171 ; Emoji # E0.6 [2] (🅰️..🅱️) A button (blood type)..B button (blood type) +1F17E..1F17F ; Emoji # E0.6 [2] (🅾️..🅿️) O button (blood type)..P button +1F18E ; Emoji # E0.6 [1] (🆎) AB button (blood type) +1F191..1F19A ; Emoji # E0.6 [10] (🆑..🆚) CL button..VS button +1F1E6..1F1FF ; Emoji # E0.0 [26] (🇦..🇿) regional indicator symbol letter a..regional indicator symbol letter z +1F201..1F202 ; Emoji # E0.6 [2] (🈁..🈂️) Japanese “here” button..Japanese “service charge” button +1F21A ; Emoji # E0.6 [1] (🈚) Japanese “free of charge” button +1F22F ; Emoji # E0.6 [1] (🈯) Japanese “reserved” button +1F232..1F23A ; Emoji # E0.6 [9] (🈲..🈺) Japanese “prohibited” button..Japanese “open for business” button +1F250..1F251 ; Emoji # E0.6 [2] (🉐..🉑) Japanese “bargain” button..Japanese “acceptable” button +1F300..1F30C ; Emoji # E0.6 [13] (🌀..🌌) cyclone..milky way +1F30D..1F30E ; Emoji # E0.7 [2] (🌍..🌎) globe showing Europe-Africa..globe showing Americas +1F30F ; Emoji # E0.6 [1] (🌏) globe showing Asia-Australia +1F310 ; Emoji # E1.0 [1] (🌐) globe with meridians +1F311 ; Emoji # E0.6 [1] (🌑) new moon +1F312 ; Emoji # E1.0 [1] (🌒) waxing crescent moon +1F313..1F315 ; Emoji # E0.6 [3] (🌓..🌕) first quarter moon..full moon +1F316..1F318 ; Emoji # E1.0 [3] (🌖..🌘) waning gibbous moon..waning crescent moon +1F319 ; Emoji # E0.6 [1] (🌙) crescent moon +1F31A ; Emoji # E1.0 [1] (🌚) new moon face +1F31B ; Emoji # E0.6 [1] (🌛) first quarter moon face +1F31C ; Emoji # E0.7 [1] (🌜) last quarter moon face +1F31D..1F31E ; Emoji # E1.0 [2] (🌝..🌞) full moon face..sun with face +1F31F..1F320 ; Emoji # E0.6 [2] (🌟..🌠) glowing star..shooting star +1F321 ; Emoji # E0.7 [1] (🌡️) thermometer +1F324..1F32C ; Emoji # E0.7 [9] (🌤️..🌬️) sun behind small cloud..wind face +1F32D..1F32F ; Emoji # E1.0 [3] (🌭..🌯) hot dog..burrito +1F330..1F331 ; Emoji # E0.6 [2] (🌰..🌱) chestnut..seedling +1F332..1F333 ; Emoji # E1.0 [2] (🌲..🌳) evergreen tree..deciduous tree +1F334..1F335 ; Emoji # E0.6 [2] (🌴..🌵) palm tree..cactus +1F336 ; Emoji # E0.7 [1] (🌶️) hot pepper +1F337..1F34A ; Emoji # E0.6 [20] (🌷..🍊) tulip..tangerine +1F34B ; Emoji # E1.0 [1] (🍋) lemon +1F34C..1F34F ; Emoji # E0.6 [4] (🍌..🍏) banana..green apple +1F350 ; Emoji # E1.0 [1] (🍐) pear +1F351..1F37B ; Emoji # E0.6 [43] (🍑..🍻) peach..clinking beer mugs +1F37C ; Emoji # E1.0 [1] (🍼) baby bottle +1F37D ; Emoji # E0.7 [1] (🍽️) fork and knife with plate +1F37E..1F37F ; Emoji # E1.0 [2] (🍾..🍿) bottle with popping cork..popcorn +1F380..1F393 ; Emoji # E0.6 [20] (🎀..🎓) ribbon..graduation cap +1F396..1F397 ; Emoji # E0.7 [2] (🎖️..🎗️) military medal..reminder ribbon +1F399..1F39B ; Emoji # E0.7 [3] (🎙️..🎛️) studio microphone..control knobs +1F39E..1F39F ; Emoji # E0.7 [2] (🎞️..🎟️) film frames..admission tickets +1F3A0..1F3C4 ; Emoji # E0.6 [37] (🎠..🏄) carousel horse..person surfing +1F3C5 ; Emoji # E1.0 [1] (🏅) sports medal +1F3C6 ; Emoji # E0.6 [1] (🏆) trophy +1F3C7 ; Emoji # E1.0 [1] (🏇) horse racing +1F3C8 ; Emoji # E0.6 [1] (🏈) american football +1F3C9 ; Emoji # E1.0 [1] (🏉) rugby football +1F3CA ; Emoji # E0.6 [1] (🏊) person swimming +1F3CB..1F3CE ; Emoji # E0.7 [4] (🏋️..🏎️) person lifting weights..racing car +1F3CF..1F3D3 ; Emoji # E1.0 [5] (🏏..🏓) cricket game..ping pong +1F3D4..1F3DF ; Emoji # E0.7 [12] (🏔️..🏟️) snow-capped mountain..stadium +1F3E0..1F3E3 ; Emoji # E0.6 [4] (🏠..🏣) house..Japanese post office +1F3E4 ; Emoji # E1.0 [1] (🏤) post office +1F3E5..1F3F0 ; Emoji # E0.6 [12] (🏥..🏰) hospital..castle +1F3F3 ; Emoji # E0.7 [1] (🏳️) white flag +1F3F4 ; Emoji # E1.0 [1] (🏴) black flag +1F3F5 ; Emoji # E0.7 [1] (🏵️) rosette +1F3F7 ; Emoji # E0.7 [1] (🏷️) label +1F3F8..1F407 ; Emoji # E1.0 [16] (🏸..🐇) badminton..rabbit +1F408 ; Emoji # E0.7 [1] (🐈) cat +1F409..1F40B ; Emoji # E1.0 [3] (🐉..🐋) dragon..whale +1F40C..1F40E ; Emoji # E0.6 [3] (🐌..🐎) snail..horse +1F40F..1F410 ; Emoji # E1.0 [2] (🐏..🐐) ram..goat +1F411..1F412 ; Emoji # E0.6 [2] (🐑..🐒) ewe..monkey +1F413 ; Emoji # E1.0 [1] (🐓) rooster +1F414 ; Emoji # E0.6 [1] (🐔) chicken +1F415 ; Emoji # E0.7 [1] (🐕) dog +1F416 ; Emoji # E1.0 [1] (🐖) pig +1F417..1F429 ; Emoji # E0.6 [19] (🐗..🐩) boar..poodle +1F42A ; Emoji # E1.0 [1] (🐪) camel +1F42B..1F43E ; Emoji # E0.6 [20] (🐫..🐾) two-hump camel..paw prints +1F43F ; Emoji # E0.7 [1] (🐿️) chipmunk +1F440 ; Emoji # E0.6 [1] (👀) eyes +1F441 ; Emoji # E0.7 [1] (👁️) eye +1F442..1F464 ; Emoji # E0.6 [35] (👂..👤) ear..bust in silhouette +1F465 ; Emoji # E1.0 [1] (👥) busts in silhouette +1F466..1F46B ; Emoji # E0.6 [6] (👦..👫) boy..woman and man holding hands +1F46C..1F46D ; Emoji # E1.0 [2] (👬..👭) men holding hands..women holding hands +1F46E..1F4AC ; Emoji # E0.6 [63] (👮..💬) police officer..speech balloon +1F4AD ; Emoji # E1.0 [1] (💭) thought balloon +1F4AE..1F4B5 ; Emoji # E0.6 [8] (💮..💵) white flower..dollar banknote +1F4B6..1F4B7 ; Emoji # E1.0 [2] (💶..💷) euro banknote..pound banknote +1F4B8..1F4EB ; Emoji # E0.6 [52] (💸..📫) money with wings..closed mailbox with raised flag +1F4EC..1F4ED ; Emoji # E0.7 [2] (📬..📭) open mailbox with raised flag..open mailbox with lowered flag +1F4EE ; Emoji # E0.6 [1] (📮) postbox +1F4EF ; Emoji # E1.0 [1] (📯) postal horn +1F4F0..1F4F4 ; Emoji # E0.6 [5] (📰..📴) newspaper..mobile phone off +1F4F5 ; Emoji # E1.0 [1] (📵) no mobile phones +1F4F6..1F4F7 ; Emoji # E0.6 [2] (📶..📷) antenna bars..camera +1F4F8 ; Emoji # E1.0 [1] (📸) camera with flash +1F4F9..1F4FC ; Emoji # E0.6 [4] (📹..📼) video camera..videocassette +1F4FD ; Emoji # E0.7 [1] (📽️) film projector +1F4FF..1F502 ; Emoji # E1.0 [4] (📿..🔂) prayer beads..repeat single button +1F503 ; Emoji # E0.6 [1] (🔃) clockwise vertical arrows +1F504..1F507 ; Emoji # E1.0 [4] (🔄..🔇) counterclockwise arrows button..muted speaker +1F508 ; Emoji # E0.7 [1] (🔈) speaker low volume +1F509 ; Emoji # E1.0 [1] (🔉) speaker medium volume +1F50A..1F514 ; Emoji # E0.6 [11] (🔊..🔔) speaker high volume..bell +1F515 ; Emoji # E1.0 [1] (🔕) bell with slash +1F516..1F52B ; Emoji # E0.6 [22] (🔖..🔫) bookmark..pistol +1F52C..1F52D ; Emoji # E1.0 [2] (🔬..🔭) microscope..telescope +1F52E..1F53D ; Emoji # E0.6 [16] (🔮..🔽) crystal ball..downwards button +1F549..1F54A ; Emoji # E0.7 [2] (🕉️..🕊️) om..dove +1F54B..1F54E ; Emoji # E1.0 [4] (🕋..🕎) kaaba..menorah +1F550..1F55B ; Emoji # E0.6 [12] (🕐..🕛) one o’clock..twelve o’clock +1F55C..1F567 ; Emoji # E0.7 [12] (🕜..🕧) one-thirty..twelve-thirty +1F56F..1F570 ; Emoji # E0.7 [2] (🕯️..🕰️) candle..mantelpiece clock +1F573..1F579 ; Emoji # E0.7 [7] (🕳️..🕹️) hole..joystick +1F57A ; Emoji # E3.0 [1] (🕺) man dancing +1F587 ; Emoji # E0.7 [1] (🖇️) linked paperclips +1F58A..1F58D ; Emoji # E0.7 [4] (🖊️..🖍️) pen..crayon +1F590 ; Emoji # E0.7 [1] (🖐️) hand with fingers splayed +1F595..1F596 ; Emoji # E1.0 [2] (🖕..🖖) middle finger..vulcan salute +1F5A4 ; Emoji # E3.0 [1] (🖤) black heart +1F5A5 ; Emoji # E0.7 [1] (🖥️) desktop computer +1F5A8 ; Emoji # E0.7 [1] (🖨️) printer +1F5B1..1F5B2 ; Emoji # E0.7 [2] (🖱️..🖲️) computer mouse..trackball +1F5BC ; Emoji # E0.7 [1] (🖼️) framed picture +1F5C2..1F5C4 ; Emoji # E0.7 [3] (🗂️..🗄️) card index dividers..file cabinet +1F5D1..1F5D3 ; Emoji # E0.7 [3] (🗑️..🗓️) wastebasket..spiral calendar +1F5DC..1F5DE ; Emoji # E0.7 [3] (🗜️..🗞️) clamp..rolled-up newspaper +1F5E1 ; Emoji # E0.7 [1] (🗡️) dagger +1F5E3 ; Emoji # E0.7 [1] (🗣️) speaking head +1F5E8 ; Emoji # E2.0 [1] (🗨️) left speech bubble +1F5EF ; Emoji # E0.7 [1] (🗯️) right anger bubble +1F5F3 ; Emoji # E0.7 [1] (🗳️) ballot box with ballot +1F5FA ; Emoji # E0.7 [1] (🗺️) world map +1F5FB..1F5FF ; Emoji # E0.6 [5] (🗻..🗿) mount fuji..moai +1F600 ; Emoji # E1.0 [1] (😀) grinning face +1F601..1F606 ; Emoji # E0.6 [6] (😁..😆) beaming face with smiling eyes..grinning squinting face +1F607..1F608 ; Emoji # E1.0 [2] (😇..😈) smiling face with halo..smiling face with horns +1F609..1F60D ; Emoji # E0.6 [5] (😉..😍) winking face..smiling face with heart-eyes +1F60E ; Emoji # E1.0 [1] (😎) smiling face with sunglasses +1F60F ; Emoji # E0.6 [1] (😏) smirking face +1F610 ; Emoji # E0.7 [1] (😐) neutral face +1F611 ; Emoji # E1.0 [1] (😑) expressionless face +1F612..1F614 ; Emoji # E0.6 [3] (😒..😔) unamused face..pensive face +1F615 ; Emoji # E1.0 [1] (😕) confused face +1F616 ; Emoji # E0.6 [1] (😖) confounded face +1F617 ; Emoji # E1.0 [1] (😗) kissing face +1F618 ; Emoji # E0.6 [1] (😘) face blowing a kiss +1F619 ; Emoji # E1.0 [1] (😙) kissing face with smiling eyes +1F61A ; Emoji # E0.6 [1] (😚) kissing face with closed eyes +1F61B ; Emoji # E1.0 [1] (😛) face with tongue +1F61C..1F61E ; Emoji # E0.6 [3] (😜..😞) winking face with tongue..disappointed face +1F61F ; Emoji # E1.0 [1] (😟) worried face +1F620..1F625 ; Emoji # E0.6 [6] (😠..😥) angry face..sad but relieved face +1F626..1F627 ; Emoji # E1.0 [2] (😦..😧) frowning face with open mouth..anguished face +1F628..1F62B ; Emoji # E0.6 [4] (😨..😫) fearful face..tired face +1F62C ; Emoji # E1.0 [1] (😬) grimacing face +1F62D ; Emoji # E0.6 [1] (😭) loudly crying face +1F62E..1F62F ; Emoji # E1.0 [2] (😮..😯) face with open mouth..hushed face +1F630..1F633 ; Emoji # E0.6 [4] (😰..😳) anxious face with sweat..flushed face +1F634 ; Emoji # E1.0 [1] (😴) sleeping face +1F635 ; Emoji # E0.6 [1] (😵) dizzy face +1F636 ; Emoji # E1.0 [1] (😶) face without mouth +1F637..1F640 ; Emoji # E0.6 [10] (😷..🙀) face with medical mask..weary cat +1F641..1F644 ; Emoji # E1.0 [4] (🙁..🙄) slightly frowning face..face with rolling eyes +1F645..1F64F ; Emoji # E0.6 [11] (🙅..🙏) person gesturing NO..folded hands +1F680 ; Emoji # E0.6 [1] (🚀) rocket +1F681..1F682 ; Emoji # E1.0 [2] (🚁..🚂) helicopter..locomotive +1F683..1F685 ; Emoji # E0.6 [3] (🚃..🚅) railway car..bullet train +1F686 ; Emoji # E1.0 [1] (🚆) train +1F687 ; Emoji # E0.6 [1] (🚇) metro +1F688 ; Emoji # E1.0 [1] (🚈) light rail +1F689 ; Emoji # E0.6 [1] (🚉) station +1F68A..1F68B ; Emoji # E1.0 [2] (🚊..🚋) tram..tram car +1F68C ; Emoji # E0.6 [1] (🚌) bus +1F68D ; Emoji # E0.7 [1] (🚍) oncoming bus +1F68E ; Emoji # E1.0 [1] (🚎) trolleybus +1F68F ; Emoji # E0.6 [1] (🚏) bus stop +1F690 ; Emoji # E1.0 [1] (🚐) minibus +1F691..1F693 ; Emoji # E0.6 [3] (🚑..🚓) ambulance..police car +1F694 ; Emoji # E0.7 [1] (🚔) oncoming police car +1F695 ; Emoji # E0.6 [1] (🚕) taxi +1F696 ; Emoji # E1.0 [1] (🚖) oncoming taxi +1F697 ; Emoji # E0.6 [1] (🚗) automobile +1F698 ; Emoji # E0.7 [1] (🚘) oncoming automobile +1F699..1F69A ; Emoji # E0.6 [2] (🚙..🚚) sport utility vehicle..delivery truck +1F69B..1F6A1 ; Emoji # E1.0 [7] (🚛..🚡) articulated lorry..aerial tramway +1F6A2 ; Emoji # E0.6 [1] (🚢) ship +1F6A3 ; Emoji # E1.0 [1] (🚣) person rowing boat +1F6A4..1F6A5 ; Emoji # E0.6 [2] (🚤..🚥) speedboat..horizontal traffic light +1F6A6 ; Emoji # E1.0 [1] (🚦) vertical traffic light +1F6A7..1F6AD ; Emoji # E0.6 [7] (🚧..🚭) construction..no smoking +1F6AE..1F6B1 ; Emoji # E1.0 [4] (🚮..🚱) litter in bin sign..non-potable water +1F6B2 ; Emoji # E0.6 [1] (🚲) bicycle +1F6B3..1F6B5 ; Emoji # E1.0 [3] (🚳..🚵) no bicycles..person mountain biking +1F6B6 ; Emoji # E0.6 [1] (🚶) person walking +1F6B7..1F6B8 ; Emoji # E1.0 [2] (🚷..🚸) no pedestrians..children crossing +1F6B9..1F6BE ; Emoji # E0.6 [6] (🚹..🚾) men’s room..water closet +1F6BF ; Emoji # E1.0 [1] (🚿) shower +1F6C0 ; Emoji # E0.6 [1] (🛀) person taking bath +1F6C1..1F6C5 ; Emoji # E1.0 [5] (🛁..🛅) bathtub..left luggage +1F6CB ; Emoji # E0.7 [1] (🛋️) couch and lamp +1F6CC ; Emoji # E1.0 [1] (🛌) person in bed +1F6CD..1F6CF ; Emoji # E0.7 [3] (🛍️..🛏️) shopping bags..bed +1F6D0 ; Emoji # E1.0 [1] (🛐) place of worship +1F6D1..1F6D2 ; Emoji # E3.0 [2] (🛑..🛒) stop sign..shopping cart +1F6D5 ; Emoji # E12.0 [1] (🛕) hindu temple +1F6D6..1F6D7 ; Emoji # E13.0 [2] (🛖..🛗) hut..elevator +1F6E0..1F6E5 ; Emoji # E0.7 [6] (🛠️..🛥️) hammer and wrench..motor boat +1F6E9 ; Emoji # E0.7 [1] (🛩️) small airplane +1F6EB..1F6EC ; Emoji # E1.0 [2] (🛫..🛬) airplane departure..airplane arrival +1F6F0 ; Emoji # E0.7 [1] (🛰️) satellite +1F6F3 ; Emoji # E0.7 [1] (🛳️) passenger ship +1F6F4..1F6F6 ; Emoji # E3.0 [3] (🛴..🛶) kick scooter..canoe +1F6F7..1F6F8 ; Emoji # E5.0 [2] (🛷..🛸) sled..flying saucer +1F6F9 ; Emoji # E11.0 [1] (🛹) skateboard +1F6FA ; Emoji # E12.0 [1] (🛺) auto rickshaw +1F6FB..1F6FC ; Emoji # E13.0 [2] (🛻..🛼) pickup truck..roller skate +1F7E0..1F7EB ; Emoji # E12.0 [12] (🟠..🟫) orange circle..brown square +1F90C ; Emoji # E13.0 [1] (🤌) pinched fingers +1F90D..1F90F ; Emoji # E12.0 [3] (🤍..🤏) white heart..pinching hand +1F910..1F918 ; Emoji # E1.0 [9] (🤐..🤘) zipper-mouth face..sign of the horns +1F919..1F91E ; Emoji # E3.0 [6] (🤙..🤞) call me hand..crossed fingers +1F91F ; Emoji # E5.0 [1] (🤟) love-you gesture +1F920..1F927 ; Emoji # E3.0 [8] (🤠..🤧) cowboy hat face..sneezing face +1F928..1F92F ; Emoji # E5.0 [8] (🤨..🤯) face with raised eyebrow..exploding head +1F930 ; Emoji # E3.0 [1] (🤰) pregnant woman +1F931..1F932 ; Emoji # E5.0 [2] (🤱..🤲) breast-feeding..palms up together +1F933..1F93A ; Emoji # E3.0 [8] (🤳..🤺) selfie..person fencing +1F93C..1F93E ; Emoji # E3.0 [3] (🤼..🤾) people wrestling..person playing handball +1F93F ; Emoji # E12.0 [1] (🤿) diving mask +1F940..1F945 ; Emoji # E3.0 [6] (🥀..🥅) wilted flower..goal net +1F947..1F94B ; Emoji # E3.0 [5] (🥇..🥋) 1st place medal..martial arts uniform +1F94C ; Emoji # E5.0 [1] (🥌) curling stone +1F94D..1F94F ; Emoji # E11.0 [3] (🥍..🥏) lacrosse..flying disc +1F950..1F95E ; Emoji # E3.0 [15] (🥐..🥞) croissant..pancakes +1F95F..1F96B ; Emoji # E5.0 [13] (🥟..🥫) dumpling..canned food +1F96C..1F970 ; Emoji # E11.0 [5] (🥬..🥰) leafy green..smiling face with hearts +1F971 ; Emoji # E12.0 [1] (🥱) yawning face +1F972 ; Emoji # E13.0 [1] (🥲) smiling face with tear +1F973..1F976 ; Emoji # E11.0 [4] (🥳..🥶) partying face..cold face +1F977..1F978 ; Emoji # E13.0 [2] (🥷..🥸) ninja..disguised face +1F97A ; Emoji # E11.0 [1] (🥺) pleading face +1F97B ; Emoji # E12.0 [1] (🥻) sari +1F97C..1F97F ; Emoji # E11.0 [4] (🥼..🥿) lab coat..flat shoe +1F980..1F984 ; Emoji # E1.0 [5] (🦀..🦄) crab..unicorn +1F985..1F991 ; Emoji # E3.0 [13] (🦅..🦑) eagle..squid +1F992..1F997 ; Emoji # E5.0 [6] (🦒..🦗) giraffe..cricket +1F998..1F9A2 ; Emoji # E11.0 [11] (🦘..🦢) kangaroo..swan +1F9A3..1F9A4 ; Emoji # E13.0 [2] (🦣..🦤) mammoth..dodo +1F9A5..1F9AA ; Emoji # E12.0 [6] (🦥..🦪) sloth..oyster +1F9AB..1F9AD ; Emoji # E13.0 [3] (🦫..🦭) beaver..seal +1F9AE..1F9AF ; Emoji # E12.0 [2] (🦮..🦯) guide dog..white cane +1F9B0..1F9B9 ; Emoji # E11.0 [10] (🦰..🦹) red hair..supervillain +1F9BA..1F9BF ; Emoji # E12.0 [6] (🦺..🦿) safety vest..mechanical leg +1F9C0 ; Emoji # E1.0 [1] (🧀) cheese wedge +1F9C1..1F9C2 ; Emoji # E11.0 [2] (🧁..🧂) cupcake..salt +1F9C3..1F9CA ; Emoji # E12.0 [8] (🧃..🧊) beverage box..ice +1F9CB ; Emoji # E13.0 [1] (🧋) bubble tea +1F9CD..1F9CF ; Emoji # E12.0 [3] (🧍..🧏) person standing..deaf person +1F9D0..1F9E6 ; Emoji # E5.0 [23] (🧐..🧦) face with monocle..socks +1F9E7..1F9FF ; Emoji # E11.0 [25] (🧧..🧿) red envelope..nazar amulet +1FA70..1FA73 ; Emoji # E12.0 [4] (🩰..🩳) ballet shoes..shorts +1FA74 ; Emoji # E13.0 [1] (🩴) thong sandal +1FA78..1FA7A ; Emoji # E12.0 [3] (🩸..🩺) drop of blood..stethoscope +1FA80..1FA82 ; Emoji # E12.0 [3] (🪀..🪂) yo-yo..parachute +1FA83..1FA86 ; Emoji # E13.0 [4] (🪃..🪆) boomerang..nesting dolls +1FA90..1FA95 ; Emoji # E12.0 [6] (🪐..🪕) ringed planet..banjo +1FA96..1FAA8 ; Emoji # E13.0 [19] (🪖..🪨) military helmet..rock +1FAB0..1FAB6 ; Emoji # E13.0 [7] (🪰..🪶) fly..feather +1FAC0..1FAC2 ; Emoji # E13.0 [3] (🫀..🫂) anatomical heart..people hugging +1FAD0..1FAD6 ; Emoji # E13.0 [7] (🫐..🫖) blueberries..teapot + +# Total elements: 1367 + +# ================================================ + +# All omitted code points have Emoji_Presentation=No +# @missing: 0000..10FFFF ; Emoji_Presentation ; No + +231A..231B ; Emoji_Presentation # E0.6 [2] (⌚..⌛) watch..hourglass done +23E9..23EC ; Emoji_Presentation # E0.6 [4] (⏩..⏬) fast-forward button..fast down button +23F0 ; Emoji_Presentation # E0.6 [1] (⏰) alarm clock +23F3 ; Emoji_Presentation # E0.6 [1] (⏳) hourglass not done +25FD..25FE ; Emoji_Presentation # E0.6 [2] (◽..◾) white medium-small square..black medium-small square +2614..2615 ; Emoji_Presentation # E0.6 [2] (☔..☕) umbrella with rain drops..hot beverage +2648..2653 ; Emoji_Presentation # E0.6 [12] (♈..♓) Aries..Pisces +267F ; Emoji_Presentation # E0.6 [1] (♿) wheelchair symbol +2693 ; Emoji_Presentation # E0.6 [1] (⚓) anchor +26A1 ; Emoji_Presentation # E0.6 [1] (⚡) high voltage +26AA..26AB ; Emoji_Presentation # E0.6 [2] (⚪..⚫) white circle..black circle +26BD..26BE ; Emoji_Presentation # E0.6 [2] (⚽..⚾) soccer ball..baseball +26C4..26C5 ; Emoji_Presentation # E0.6 [2] (⛄..⛅) snowman without snow..sun behind cloud +26CE ; Emoji_Presentation # E0.6 [1] (⛎) Ophiuchus +26D4 ; Emoji_Presentation # E0.6 [1] (⛔) no entry +26EA ; Emoji_Presentation # E0.6 [1] (⛪) church +26F2..26F3 ; Emoji_Presentation # E0.6 [2] (⛲..⛳) fountain..flag in hole +26F5 ; Emoji_Presentation # E0.6 [1] (⛵) sailboat +26FA ; Emoji_Presentation # E0.6 [1] (⛺) tent +26FD ; Emoji_Presentation # E0.6 [1] (⛽) fuel pump +2705 ; Emoji_Presentation # E0.6 [1] (✅) check mark button +270A..270B ; Emoji_Presentation # E0.6 [2] (✊..✋) raised fist..raised hand +2728 ; Emoji_Presentation # E0.6 [1] (✨) sparkles +274C ; Emoji_Presentation # E0.6 [1] (❌) cross mark +274E ; Emoji_Presentation # E0.6 [1] (❎) cross mark button +2753..2755 ; Emoji_Presentation # E0.6 [3] (❓..❕) question mark..white exclamation mark +2757 ; Emoji_Presentation # E0.6 [1] (❗) exclamation mark +2795..2797 ; Emoji_Presentation # E0.6 [3] (➕..➗) plus..divide +27B0 ; Emoji_Presentation # E0.6 [1] (➰) curly loop +27BF ; Emoji_Presentation # E1.0 [1] (➿) double curly loop +2B1B..2B1C ; Emoji_Presentation # E0.6 [2] (⬛..⬜) black large square..white large square +2B50 ; Emoji_Presentation # E0.6 [1] (⭐) star +2B55 ; Emoji_Presentation # E0.6 [1] (⭕) hollow red circle +1F004 ; Emoji_Presentation # E0.6 [1] (🀄) mahjong red dragon +1F0CF ; Emoji_Presentation # E0.6 [1] (🃏) joker +1F18E ; Emoji_Presentation # E0.6 [1] (🆎) AB button (blood type) +1F191..1F19A ; Emoji_Presentation # E0.6 [10] (🆑..🆚) CL button..VS button +1F1E6..1F1FF ; Emoji_Presentation # E0.0 [26] (🇦..🇿) regional indicator symbol letter a..regional indicator symbol letter z +1F201 ; Emoji_Presentation # E0.6 [1] (🈁) Japanese “here” button +1F21A ; Emoji_Presentation # E0.6 [1] (🈚) Japanese “free of charge” button +1F22F ; Emoji_Presentation # E0.6 [1] (🈯) Japanese “reserved” button +1F232..1F236 ; Emoji_Presentation # E0.6 [5] (🈲..🈶) Japanese “prohibited” button..Japanese “not free of charge” button +1F238..1F23A ; Emoji_Presentation # E0.6 [3] (🈸..🈺) Japanese “application” button..Japanese “open for business” button +1F250..1F251 ; Emoji_Presentation # E0.6 [2] (🉐..🉑) Japanese “bargain” button..Japanese “acceptable” button +1F300..1F30C ; Emoji_Presentation # E0.6 [13] (🌀..🌌) cyclone..milky way +1F30D..1F30E ; Emoji_Presentation # E0.7 [2] (🌍..🌎) globe showing Europe-Africa..globe showing Americas +1F30F ; Emoji_Presentation # E0.6 [1] (🌏) globe showing Asia-Australia +1F310 ; Emoji_Presentation # E1.0 [1] (🌐) globe with meridians +1F311 ; Emoji_Presentation # E0.6 [1] (🌑) new moon +1F312 ; Emoji_Presentation # E1.0 [1] (🌒) waxing crescent moon +1F313..1F315 ; Emoji_Presentation # E0.6 [3] (🌓..🌕) first quarter moon..full moon +1F316..1F318 ; Emoji_Presentation # E1.0 [3] (🌖..🌘) waning gibbous moon..waning crescent moon +1F319 ; Emoji_Presentation # E0.6 [1] (🌙) crescent moon +1F31A ; Emoji_Presentation # E1.0 [1] (🌚) new moon face +1F31B ; Emoji_Presentation # E0.6 [1] (🌛) first quarter moon face +1F31C ; Emoji_Presentation # E0.7 [1] (🌜) last quarter moon face +1F31D..1F31E ; Emoji_Presentation # E1.0 [2] (🌝..🌞) full moon face..sun with face +1F31F..1F320 ; Emoji_Presentation # E0.6 [2] (🌟..🌠) glowing star..shooting star +1F32D..1F32F ; Emoji_Presentation # E1.0 [3] (🌭..🌯) hot dog..burrito +1F330..1F331 ; Emoji_Presentation # E0.6 [2] (🌰..🌱) chestnut..seedling +1F332..1F333 ; Emoji_Presentation # E1.0 [2] (🌲..🌳) evergreen tree..deciduous tree +1F334..1F335 ; Emoji_Presentation # E0.6 [2] (🌴..🌵) palm tree..cactus +1F337..1F34A ; Emoji_Presentation # E0.6 [20] (🌷..🍊) tulip..tangerine +1F34B ; Emoji_Presentation # E1.0 [1] (🍋) lemon +1F34C..1F34F ; Emoji_Presentation # E0.6 [4] (🍌..🍏) banana..green apple +1F350 ; Emoji_Presentation # E1.0 [1] (🍐) pear +1F351..1F37B ; Emoji_Presentation # E0.6 [43] (🍑..🍻) peach..clinking beer mugs +1F37C ; Emoji_Presentation # E1.0 [1] (🍼) baby bottle +1F37E..1F37F ; Emoji_Presentation # E1.0 [2] (🍾..🍿) bottle with popping cork..popcorn +1F380..1F393 ; Emoji_Presentation # E0.6 [20] (🎀..🎓) ribbon..graduation cap +1F3A0..1F3C4 ; Emoji_Presentation # E0.6 [37] (🎠..🏄) carousel horse..person surfing +1F3C5 ; Emoji_Presentation # E1.0 [1] (🏅) sports medal +1F3C6 ; Emoji_Presentation # E0.6 [1] (🏆) trophy +1F3C7 ; Emoji_Presentation # E1.0 [1] (🏇) horse racing +1F3C8 ; Emoji_Presentation # E0.6 [1] (🏈) american football +1F3C9 ; Emoji_Presentation # E1.0 [1] (🏉) rugby football +1F3CA ; Emoji_Presentation # E0.6 [1] (🏊) person swimming +1F3CF..1F3D3 ; Emoji_Presentation # E1.0 [5] (🏏..🏓) cricket game..ping pong +1F3E0..1F3E3 ; Emoji_Presentation # E0.6 [4] (🏠..🏣) house..Japanese post office +1F3E4 ; Emoji_Presentation # E1.0 [1] (🏤) post office +1F3E5..1F3F0 ; Emoji_Presentation # E0.6 [12] (🏥..🏰) hospital..castle +1F3F4 ; Emoji_Presentation # E1.0 [1] (🏴) black flag +1F3F8..1F407 ; Emoji_Presentation # E1.0 [16] (🏸..🐇) badminton..rabbit +1F408 ; Emoji_Presentation # E0.7 [1] (🐈) cat +1F409..1F40B ; Emoji_Presentation # E1.0 [3] (🐉..🐋) dragon..whale +1F40C..1F40E ; Emoji_Presentation # E0.6 [3] (🐌..🐎) snail..horse +1F40F..1F410 ; Emoji_Presentation # E1.0 [2] (🐏..🐐) ram..goat +1F411..1F412 ; Emoji_Presentation # E0.6 [2] (🐑..🐒) ewe..monkey +1F413 ; Emoji_Presentation # E1.0 [1] (🐓) rooster +1F414 ; Emoji_Presentation # E0.6 [1] (🐔) chicken +1F415 ; Emoji_Presentation # E0.7 [1] (🐕) dog +1F416 ; Emoji_Presentation # E1.0 [1] (🐖) pig +1F417..1F429 ; Emoji_Presentation # E0.6 [19] (🐗..🐩) boar..poodle +1F42A ; Emoji_Presentation # E1.0 [1] (🐪) camel +1F42B..1F43E ; Emoji_Presentation # E0.6 [20] (🐫..🐾) two-hump camel..paw prints +1F440 ; Emoji_Presentation # E0.6 [1] (👀) eyes +1F442..1F464 ; Emoji_Presentation # E0.6 [35] (👂..👤) ear..bust in silhouette +1F465 ; Emoji_Presentation # E1.0 [1] (👥) busts in silhouette +1F466..1F46B ; Emoji_Presentation # E0.6 [6] (👦..👫) boy..woman and man holding hands +1F46C..1F46D ; Emoji_Presentation # E1.0 [2] (👬..👭) men holding hands..women holding hands +1F46E..1F4AC ; Emoji_Presentation # E0.6 [63] (👮..💬) police officer..speech balloon +1F4AD ; Emoji_Presentation # E1.0 [1] (💭) thought balloon +1F4AE..1F4B5 ; Emoji_Presentation # E0.6 [8] (💮..💵) white flower..dollar banknote +1F4B6..1F4B7 ; Emoji_Presentation # E1.0 [2] (💶..💷) euro banknote..pound banknote +1F4B8..1F4EB ; Emoji_Presentation # E0.6 [52] (💸..📫) money with wings..closed mailbox with raised flag +1F4EC..1F4ED ; Emoji_Presentation # E0.7 [2] (📬..📭) open mailbox with raised flag..open mailbox with lowered flag +1F4EE ; Emoji_Presentation # E0.6 [1] (📮) postbox +1F4EF ; Emoji_Presentation # E1.0 [1] (📯) postal horn +1F4F0..1F4F4 ; Emoji_Presentation # E0.6 [5] (📰..📴) newspaper..mobile phone off +1F4F5 ; Emoji_Presentation # E1.0 [1] (📵) no mobile phones +1F4F6..1F4F7 ; Emoji_Presentation # E0.6 [2] (📶..📷) antenna bars..camera +1F4F8 ; Emoji_Presentation # E1.0 [1] (📸) camera with flash +1F4F9..1F4FC ; Emoji_Presentation # E0.6 [4] (📹..📼) video camera..videocassette +1F4FF..1F502 ; Emoji_Presentation # E1.0 [4] (📿..🔂) prayer beads..repeat single button +1F503 ; Emoji_Presentation # E0.6 [1] (🔃) clockwise vertical arrows +1F504..1F507 ; Emoji_Presentation # E1.0 [4] (🔄..🔇) counterclockwise arrows button..muted speaker +1F508 ; Emoji_Presentation # E0.7 [1] (🔈) speaker low volume +1F509 ; Emoji_Presentation # E1.0 [1] (🔉) speaker medium volume +1F50A..1F514 ; Emoji_Presentation # E0.6 [11] (🔊..🔔) speaker high volume..bell +1F515 ; Emoji_Presentation # E1.0 [1] (🔕) bell with slash +1F516..1F52B ; Emoji_Presentation # E0.6 [22] (🔖..🔫) bookmark..pistol +1F52C..1F52D ; Emoji_Presentation # E1.0 [2] (🔬..🔭) microscope..telescope +1F52E..1F53D ; Emoji_Presentation # E0.6 [16] (🔮..🔽) crystal ball..downwards button +1F54B..1F54E ; Emoji_Presentation # E1.0 [4] (🕋..🕎) kaaba..menorah +1F550..1F55B ; Emoji_Presentation # E0.6 [12] (🕐..🕛) one o’clock..twelve o’clock +1F55C..1F567 ; Emoji_Presentation # E0.7 [12] (🕜..🕧) one-thirty..twelve-thirty +1F57A ; Emoji_Presentation # E3.0 [1] (🕺) man dancing +1F595..1F596 ; Emoji_Presentation # E1.0 [2] (🖕..🖖) middle finger..vulcan salute +1F5A4 ; Emoji_Presentation # E3.0 [1] (🖤) black heart +1F5FB..1F5FF ; Emoji_Presentation # E0.6 [5] (🗻..🗿) mount fuji..moai +1F600 ; Emoji_Presentation # E1.0 [1] (😀) grinning face +1F601..1F606 ; Emoji_Presentation # E0.6 [6] (😁..😆) beaming face with smiling eyes..grinning squinting face +1F607..1F608 ; Emoji_Presentation # E1.0 [2] (😇..😈) smiling face with halo..smiling face with horns +1F609..1F60D ; Emoji_Presentation # E0.6 [5] (😉..😍) winking face..smiling face with heart-eyes +1F60E ; Emoji_Presentation # E1.0 [1] (😎) smiling face with sunglasses +1F60F ; Emoji_Presentation # E0.6 [1] (😏) smirking face +1F610 ; Emoji_Presentation # E0.7 [1] (😐) neutral face +1F611 ; Emoji_Presentation # E1.0 [1] (😑) expressionless face +1F612..1F614 ; Emoji_Presentation # E0.6 [3] (😒..😔) unamused face..pensive face +1F615 ; Emoji_Presentation # E1.0 [1] (😕) confused face +1F616 ; Emoji_Presentation # E0.6 [1] (😖) confounded face +1F617 ; Emoji_Presentation # E1.0 [1] (😗) kissing face +1F618 ; Emoji_Presentation # E0.6 [1] (😘) face blowing a kiss +1F619 ; Emoji_Presentation # E1.0 [1] (😙) kissing face with smiling eyes +1F61A ; Emoji_Presentation # E0.6 [1] (😚) kissing face with closed eyes +1F61B ; Emoji_Presentation # E1.0 [1] (😛) face with tongue +1F61C..1F61E ; Emoji_Presentation # E0.6 [3] (😜..😞) winking face with tongue..disappointed face +1F61F ; Emoji_Presentation # E1.0 [1] (😟) worried face +1F620..1F625 ; Emoji_Presentation # E0.6 [6] (😠..😥) angry face..sad but relieved face +1F626..1F627 ; Emoji_Presentation # E1.0 [2] (😦..😧) frowning face with open mouth..anguished face +1F628..1F62B ; Emoji_Presentation # E0.6 [4] (😨..😫) fearful face..tired face +1F62C ; Emoji_Presentation # E1.0 [1] (😬) grimacing face +1F62D ; Emoji_Presentation # E0.6 [1] (😭) loudly crying face +1F62E..1F62F ; Emoji_Presentation # E1.0 [2] (😮..😯) face with open mouth..hushed face +1F630..1F633 ; Emoji_Presentation # E0.6 [4] (😰..😳) anxious face with sweat..flushed face +1F634 ; Emoji_Presentation # E1.0 [1] (😴) sleeping face +1F635 ; Emoji_Presentation # E0.6 [1] (😵) dizzy face +1F636 ; Emoji_Presentation # E1.0 [1] (😶) face without mouth +1F637..1F640 ; Emoji_Presentation # E0.6 [10] (😷..🙀) face with medical mask..weary cat +1F641..1F644 ; Emoji_Presentation # E1.0 [4] (🙁..🙄) slightly frowning face..face with rolling eyes +1F645..1F64F ; Emoji_Presentation # E0.6 [11] (🙅..🙏) person gesturing NO..folded hands +1F680 ; Emoji_Presentation # E0.6 [1] (🚀) rocket +1F681..1F682 ; Emoji_Presentation # E1.0 [2] (🚁..🚂) helicopter..locomotive +1F683..1F685 ; Emoji_Presentation # E0.6 [3] (🚃..🚅) railway car..bullet train +1F686 ; Emoji_Presentation # E1.0 [1] (🚆) train +1F687 ; Emoji_Presentation # E0.6 [1] (🚇) metro +1F688 ; Emoji_Presentation # E1.0 [1] (🚈) light rail +1F689 ; Emoji_Presentation # E0.6 [1] (🚉) station +1F68A..1F68B ; Emoji_Presentation # E1.0 [2] (🚊..🚋) tram..tram car +1F68C ; Emoji_Presentation # E0.6 [1] (🚌) bus +1F68D ; Emoji_Presentation # E0.7 [1] (🚍) oncoming bus +1F68E ; Emoji_Presentation # E1.0 [1] (🚎) trolleybus +1F68F ; Emoji_Presentation # E0.6 [1] (🚏) bus stop +1F690 ; Emoji_Presentation # E1.0 [1] (🚐) minibus +1F691..1F693 ; Emoji_Presentation # E0.6 [3] (🚑..🚓) ambulance..police car +1F694 ; Emoji_Presentation # E0.7 [1] (🚔) oncoming police car +1F695 ; Emoji_Presentation # E0.6 [1] (🚕) taxi +1F696 ; Emoji_Presentation # E1.0 [1] (🚖) oncoming taxi +1F697 ; Emoji_Presentation # E0.6 [1] (🚗) automobile +1F698 ; Emoji_Presentation # E0.7 [1] (🚘) oncoming automobile +1F699..1F69A ; Emoji_Presentation # E0.6 [2] (🚙..🚚) sport utility vehicle..delivery truck +1F69B..1F6A1 ; Emoji_Presentation # E1.0 [7] (🚛..🚡) articulated lorry..aerial tramway +1F6A2 ; Emoji_Presentation # E0.6 [1] (🚢) ship +1F6A3 ; Emoji_Presentation # E1.0 [1] (🚣) person rowing boat +1F6A4..1F6A5 ; Emoji_Presentation # E0.6 [2] (🚤..🚥) speedboat..horizontal traffic light +1F6A6 ; Emoji_Presentation # E1.0 [1] (🚦) vertical traffic light +1F6A7..1F6AD ; Emoji_Presentation # E0.6 [7] (🚧..🚭) construction..no smoking +1F6AE..1F6B1 ; Emoji_Presentation # E1.0 [4] (🚮..🚱) litter in bin sign..non-potable water +1F6B2 ; Emoji_Presentation # E0.6 [1] (🚲) bicycle +1F6B3..1F6B5 ; Emoji_Presentation # E1.0 [3] (🚳..🚵) no bicycles..person mountain biking +1F6B6 ; Emoji_Presentation # E0.6 [1] (🚶) person walking +1F6B7..1F6B8 ; Emoji_Presentation # E1.0 [2] (🚷..🚸) no pedestrians..children crossing +1F6B9..1F6BE ; Emoji_Presentation # E0.6 [6] (🚹..🚾) men’s room..water closet +1F6BF ; Emoji_Presentation # E1.0 [1] (🚿) shower +1F6C0 ; Emoji_Presentation # E0.6 [1] (🛀) person taking bath +1F6C1..1F6C5 ; Emoji_Presentation # E1.0 [5] (🛁..🛅) bathtub..left luggage +1F6CC ; Emoji_Presentation # E1.0 [1] (🛌) person in bed +1F6D0 ; Emoji_Presentation # E1.0 [1] (🛐) place of worship +1F6D1..1F6D2 ; Emoji_Presentation # E3.0 [2] (🛑..🛒) stop sign..shopping cart +1F6D5 ; Emoji_Presentation # E12.0 [1] (🛕) hindu temple +1F6D6..1F6D7 ; Emoji_Presentation # E13.0 [2] (🛖..🛗) hut..elevator +1F6EB..1F6EC ; Emoji_Presentation # E1.0 [2] (🛫..🛬) airplane departure..airplane arrival +1F6F4..1F6F6 ; Emoji_Presentation # E3.0 [3] (🛴..🛶) kick scooter..canoe +1F6F7..1F6F8 ; Emoji_Presentation # E5.0 [2] (🛷..🛸) sled..flying saucer +1F6F9 ; Emoji_Presentation # E11.0 [1] (🛹) skateboard +1F6FA ; Emoji_Presentation # E12.0 [1] (🛺) auto rickshaw +1F6FB..1F6FC ; Emoji_Presentation # E13.0 [2] (🛻..🛼) pickup truck..roller skate +1F7E0..1F7EB ; Emoji_Presentation # E12.0 [12] (🟠..🟫) orange circle..brown square +1F90C ; Emoji_Presentation # E13.0 [1] (🤌) pinched fingers +1F90D..1F90F ; Emoji_Presentation # E12.0 [3] (🤍..🤏) white heart..pinching hand +1F910..1F918 ; Emoji_Presentation # E1.0 [9] (🤐..🤘) zipper-mouth face..sign of the horns +1F919..1F91E ; Emoji_Presentation # E3.0 [6] (🤙..🤞) call me hand..crossed fingers +1F91F ; Emoji_Presentation # E5.0 [1] (🤟) love-you gesture +1F920..1F927 ; Emoji_Presentation # E3.0 [8] (🤠..🤧) cowboy hat face..sneezing face +1F928..1F92F ; Emoji_Presentation # E5.0 [8] (🤨..🤯) face with raised eyebrow..exploding head +1F930 ; Emoji_Presentation # E3.0 [1] (🤰) pregnant woman +1F931..1F932 ; Emoji_Presentation # E5.0 [2] (🤱..🤲) breast-feeding..palms up together +1F933..1F93A ; Emoji_Presentation # E3.0 [8] (🤳..🤺) selfie..person fencing +1F93C..1F93E ; Emoji_Presentation # E3.0 [3] (🤼..🤾) people wrestling..person playing handball +1F93F ; Emoji_Presentation # E12.0 [1] (🤿) diving mask +1F940..1F945 ; Emoji_Presentation # E3.0 [6] (🥀..🥅) wilted flower..goal net +1F947..1F94B ; Emoji_Presentation # E3.0 [5] (🥇..🥋) 1st place medal..martial arts uniform +1F94C ; Emoji_Presentation # E5.0 [1] (🥌) curling stone +1F94D..1F94F ; Emoji_Presentation # E11.0 [3] (🥍..🥏) lacrosse..flying disc +1F950..1F95E ; Emoji_Presentation # E3.0 [15] (🥐..🥞) croissant..pancakes +1F95F..1F96B ; Emoji_Presentation # E5.0 [13] (🥟..🥫) dumpling..canned food +1F96C..1F970 ; Emoji_Presentation # E11.0 [5] (🥬..🥰) leafy green..smiling face with hearts +1F971 ; Emoji_Presentation # E12.0 [1] (🥱) yawning face +1F972 ; Emoji_Presentation # E13.0 [1] (🥲) smiling face with tear +1F973..1F976 ; Emoji_Presentation # E11.0 [4] (🥳..🥶) partying face..cold face +1F977..1F978 ; Emoji_Presentation # E13.0 [2] (🥷..🥸) ninja..disguised face +1F97A ; Emoji_Presentation # E11.0 [1] (🥺) pleading face +1F97B ; Emoji_Presentation # E12.0 [1] (🥻) sari +1F97C..1F97F ; Emoji_Presentation # E11.0 [4] (🥼..🥿) lab coat..flat shoe +1F980..1F984 ; Emoji_Presentation # E1.0 [5] (🦀..🦄) crab..unicorn +1F985..1F991 ; Emoji_Presentation # E3.0 [13] (🦅..🦑) eagle..squid +1F992..1F997 ; Emoji_Presentation # E5.0 [6] (🦒..🦗) giraffe..cricket +1F998..1F9A2 ; Emoji_Presentation # E11.0 [11] (🦘..🦢) kangaroo..swan +1F9A3..1F9A4 ; Emoji_Presentation # E13.0 [2] (🦣..🦤) mammoth..dodo +1F9A5..1F9AA ; Emoji_Presentation # E12.0 [6] (🦥..🦪) sloth..oyster +1F9AB..1F9AD ; Emoji_Presentation # E13.0 [3] (🦫..🦭) beaver..seal +1F9AE..1F9AF ; Emoji_Presentation # E12.0 [2] (🦮..🦯) guide dog..white cane +1F9B0..1F9B9 ; Emoji_Presentation # E11.0 [10] (🦰..🦹) red hair..supervillain +1F9BA..1F9BF ; Emoji_Presentation # E12.0 [6] (🦺..🦿) safety vest..mechanical leg +1F9C0 ; Emoji_Presentation # E1.0 [1] (🧀) cheese wedge +1F9C1..1F9C2 ; Emoji_Presentation # E11.0 [2] (🧁..🧂) cupcake..salt +1F9C3..1F9CA ; Emoji_Presentation # E12.0 [8] (🧃..🧊) beverage box..ice +1F9CB ; Emoji_Presentation # E13.0 [1] (🧋) bubble tea +1F9CD..1F9CF ; Emoji_Presentation # E12.0 [3] (🧍..🧏) person standing..deaf person +1F9D0..1F9E6 ; Emoji_Presentation # E5.0 [23] (🧐..🧦) face with monocle..socks +1F9E7..1F9FF ; Emoji_Presentation # E11.0 [25] (🧧..🧿) red envelope..nazar amulet +1FA70..1FA73 ; Emoji_Presentation # E12.0 [4] (🩰..🩳) ballet shoes..shorts +1FA74 ; Emoji_Presentation # E13.0 [1] (🩴) thong sandal +1FA78..1FA7A ; Emoji_Presentation # E12.0 [3] (🩸..🩺) drop of blood..stethoscope +1FA80..1FA82 ; Emoji_Presentation # E12.0 [3] (🪀..🪂) yo-yo..parachute +1FA83..1FA86 ; Emoji_Presentation # E13.0 [4] (🪃..🪆) boomerang..nesting dolls +1FA90..1FA95 ; Emoji_Presentation # E12.0 [6] (🪐..🪕) ringed planet..banjo +1FA96..1FAA8 ; Emoji_Presentation # E13.0 [19] (🪖..🪨) military helmet..rock +1FAB0..1FAB6 ; Emoji_Presentation # E13.0 [7] (🪰..🪶) fly..feather +1FAC0..1FAC2 ; Emoji_Presentation # E13.0 [3] (🫀..🫂) anatomical heart..people hugging +1FAD0..1FAD6 ; Emoji_Presentation # E13.0 [7] (🫐..🫖) blueberries..teapot + +# Total elements: 1148 + +# ================================================ + +# All omitted code points have Emoji_Modifier=No +# @missing: 0000..10FFFF ; Emoji_Modifier ; No + +1F3FB..1F3FF ; Emoji_Modifier # E1.0 [5] (🏻..🏿) light skin tone..dark skin tone + +# Total elements: 5 + +# ================================================ + +# All omitted code points have Emoji_Modifier_Base=No +# @missing: 0000..10FFFF ; Emoji_Modifier_Base ; No + +261D ; Emoji_Modifier_Base # E0.6 [1] (☝️) index pointing up +26F9 ; Emoji_Modifier_Base # E0.7 [1] (⛹️) person bouncing ball +270A..270C ; Emoji_Modifier_Base # E0.6 [3] (✊..✌️) raised fist..victory hand +270D ; Emoji_Modifier_Base # E0.7 [1] (✍️) writing hand +1F385 ; Emoji_Modifier_Base # E0.6 [1] (🎅) Santa Claus +1F3C2..1F3C4 ; Emoji_Modifier_Base # E0.6 [3] (🏂..🏄) snowboarder..person surfing +1F3C7 ; Emoji_Modifier_Base # E1.0 [1] (🏇) horse racing +1F3CA ; Emoji_Modifier_Base # E0.6 [1] (🏊) person swimming +1F3CB..1F3CC ; Emoji_Modifier_Base # E0.7 [2] (🏋️..🏌️) person lifting weights..person golfing +1F442..1F443 ; Emoji_Modifier_Base # E0.6 [2] (👂..👃) ear..nose +1F446..1F450 ; Emoji_Modifier_Base # E0.6 [11] (👆..👐) backhand index pointing up..open hands +1F466..1F46B ; Emoji_Modifier_Base # E0.6 [6] (👦..👫) boy..woman and man holding hands +1F46C..1F46D ; Emoji_Modifier_Base # E1.0 [2] (👬..👭) men holding hands..women holding hands +1F46E..1F478 ; Emoji_Modifier_Base # E0.6 [11] (👮..👸) police officer..princess +1F47C ; Emoji_Modifier_Base # E0.6 [1] (👼) baby angel +1F481..1F483 ; Emoji_Modifier_Base # E0.6 [3] (💁..💃) person tipping hand..woman dancing +1F485..1F487 ; Emoji_Modifier_Base # E0.6 [3] (💅..💇) nail polish..person getting haircut +1F48F ; Emoji_Modifier_Base # E0.6 [1] (💏) kiss +1F491 ; Emoji_Modifier_Base # E0.6 [1] (💑) couple with heart +1F4AA ; Emoji_Modifier_Base # E0.6 [1] (💪) flexed biceps +1F574..1F575 ; Emoji_Modifier_Base # E0.7 [2] (🕴️..🕵️) person in suit levitating..detective +1F57A ; Emoji_Modifier_Base # E3.0 [1] (🕺) man dancing +1F590 ; Emoji_Modifier_Base # E0.7 [1] (🖐️) hand with fingers splayed +1F595..1F596 ; Emoji_Modifier_Base # E1.0 [2] (🖕..🖖) middle finger..vulcan salute +1F645..1F647 ; Emoji_Modifier_Base # E0.6 [3] (🙅..🙇) person gesturing NO..person bowing +1F64B..1F64F ; Emoji_Modifier_Base # E0.6 [5] (🙋..🙏) person raising hand..folded hands +1F6A3 ; Emoji_Modifier_Base # E1.0 [1] (🚣) person rowing boat +1F6B4..1F6B5 ; Emoji_Modifier_Base # E1.0 [2] (🚴..🚵) person biking..person mountain biking +1F6B6 ; Emoji_Modifier_Base # E0.6 [1] (🚶) person walking +1F6C0 ; Emoji_Modifier_Base # E0.6 [1] (🛀) person taking bath +1F6CC ; Emoji_Modifier_Base # E1.0 [1] (🛌) person in bed +1F90C ; Emoji_Modifier_Base # E13.0 [1] (🤌) pinched fingers +1F90F ; Emoji_Modifier_Base # E12.0 [1] (🤏) pinching hand +1F918 ; Emoji_Modifier_Base # E1.0 [1] (🤘) sign of the horns +1F919..1F91E ; Emoji_Modifier_Base # E3.0 [6] (🤙..🤞) call me hand..crossed fingers +1F91F ; Emoji_Modifier_Base # E5.0 [1] (🤟) love-you gesture +1F926 ; Emoji_Modifier_Base # E3.0 [1] (🤦) person facepalming +1F930 ; Emoji_Modifier_Base # E3.0 [1] (🤰) pregnant woman +1F931..1F932 ; Emoji_Modifier_Base # E5.0 [2] (🤱..🤲) breast-feeding..palms up together +1F933..1F939 ; Emoji_Modifier_Base # E3.0 [7] (🤳..🤹) selfie..person juggling +1F93C..1F93E ; Emoji_Modifier_Base # E3.0 [3] (🤼..🤾) people wrestling..person playing handball +1F977 ; Emoji_Modifier_Base # E13.0 [1] (🥷) ninja +1F9B5..1F9B6 ; Emoji_Modifier_Base # E11.0 [2] (🦵..🦶) leg..foot +1F9B8..1F9B9 ; Emoji_Modifier_Base # E11.0 [2] (🦸..🦹) superhero..supervillain +1F9BB ; Emoji_Modifier_Base # E12.0 [1] (🦻) ear with hearing aid +1F9CD..1F9CF ; Emoji_Modifier_Base # E12.0 [3] (🧍..🧏) person standing..deaf person +1F9D1..1F9DD ; Emoji_Modifier_Base # E5.0 [13] (🧑..🧝) person..elf + +# Total elements: 122 + +# ================================================ + +# All omitted code points have Emoji_Component=No +# @missing: 0000..10FFFF ; Emoji_Component ; No + +0023 ; Emoji_Component # E0.0 [1] (#️) number sign +002A ; Emoji_Component # E0.0 [1] (*️) asterisk +0030..0039 ; Emoji_Component # E0.0 [10] (0️..9️) digit zero..digit nine +200D ; Emoji_Component # E0.0 [1] (‍) zero width joiner +20E3 ; Emoji_Component # E0.0 [1] (⃣) combining enclosing keycap +FE0F ; Emoji_Component # E0.0 [1] () VARIATION SELECTOR-16 +1F1E6..1F1FF ; Emoji_Component # E0.0 [26] (🇦..🇿) regional indicator symbol letter a..regional indicator symbol letter z +1F3FB..1F3FF ; Emoji_Component # E1.0 [5] (🏻..🏿) light skin tone..dark skin tone +1F9B0..1F9B3 ; Emoji_Component # E11.0 [4] (🦰..🦳) red hair..white hair +E0020..E007F ; Emoji_Component # E0.0 [96] (󠀠..󠁿) tag space..cancel tag + +# Total elements: 146 + +# ================================================ + +# All omitted code points have Extended_Pictographic=No +# @missing: 0000..10FFFF ; Extended_Pictographic ; No + +00A9 ; Extended_Pictographic# E0.6 [1] (©️) copyright +00AE ; Extended_Pictographic# E0.6 [1] (®️) registered +203C ; Extended_Pictographic# E0.6 [1] (‼️) double exclamation mark +2049 ; Extended_Pictographic# E0.6 [1] (⁉️) exclamation question mark +2122 ; Extended_Pictographic# E0.6 [1] (™️) trade mark +2139 ; Extended_Pictographic# E0.6 [1] (ℹ️) information +2194..2199 ; Extended_Pictographic# E0.6 [6] (↔️..↙️) left-right arrow..down-left arrow +21A9..21AA ; Extended_Pictographic# E0.6 [2] (↩️..↪️) right arrow curving left..left arrow curving right +231A..231B ; Extended_Pictographic# E0.6 [2] (⌚..⌛) watch..hourglass done +2328 ; Extended_Pictographic# E1.0 [1] (⌨️) keyboard +2388 ; Extended_Pictographic# E0.0 [1] (⎈) HELM SYMBOL +23CF ; Extended_Pictographic# E1.0 [1] (⏏️) eject button +23E9..23EC ; Extended_Pictographic# E0.6 [4] (⏩..⏬) fast-forward button..fast down button +23ED..23EE ; Extended_Pictographic# E0.7 [2] (⏭️..⏮️) next track button..last track button +23EF ; Extended_Pictographic# E1.0 [1] (⏯️) play or pause button +23F0 ; Extended_Pictographic# E0.6 [1] (⏰) alarm clock +23F1..23F2 ; Extended_Pictographic# E1.0 [2] (⏱️..⏲️) stopwatch..timer clock +23F3 ; Extended_Pictographic# E0.6 [1] (⏳) hourglass not done +23F8..23FA ; Extended_Pictographic# E0.7 [3] (⏸️..⏺️) pause button..record button +24C2 ; Extended_Pictographic# E0.6 [1] (Ⓜ️) circled M +25AA..25AB ; Extended_Pictographic# E0.6 [2] (▪️..▫️) black small square..white small square +25B6 ; Extended_Pictographic# E0.6 [1] (▶️) play button +25C0 ; Extended_Pictographic# E0.6 [1] (◀️) reverse button +25FB..25FE ; Extended_Pictographic# E0.6 [4] (◻️..◾) white medium square..black medium-small square +2600..2601 ; Extended_Pictographic# E0.6 [2] (☀️..☁️) sun..cloud +2602..2603 ; Extended_Pictographic# E0.7 [2] (☂️..☃️) umbrella..snowman +2604 ; Extended_Pictographic# E1.0 [1] (☄️) comet +2605 ; Extended_Pictographic# E0.0 [1] (★) BLACK STAR +2607..260D ; Extended_Pictographic# E0.0 [7] (☇..☍) LIGHTNING..OPPOSITION +260E ; Extended_Pictographic# E0.6 [1] (☎️) telephone +260F..2610 ; Extended_Pictographic# E0.0 [2] (☏..☐) WHITE TELEPHONE..BALLOT BOX +2611 ; Extended_Pictographic# E0.6 [1] (☑️) check box with check +2612 ; Extended_Pictographic# E0.0 [1] (☒) BALLOT BOX WITH X +2614..2615 ; Extended_Pictographic# E0.6 [2] (☔..☕) umbrella with rain drops..hot beverage +2616..2617 ; Extended_Pictographic# E0.0 [2] (☖..☗) WHITE SHOGI PIECE..BLACK SHOGI PIECE +2618 ; Extended_Pictographic# E1.0 [1] (☘️) shamrock +2619..261C ; Extended_Pictographic# E0.0 [4] (☙..☜) REVERSED ROTATED FLORAL HEART BULLET..WHITE LEFT POINTING INDEX +261D ; Extended_Pictographic# E0.6 [1] (☝️) index pointing up +261E..261F ; Extended_Pictographic# E0.0 [2] (☞..☟) WHITE RIGHT POINTING INDEX..WHITE DOWN POINTING INDEX +2620 ; Extended_Pictographic# E1.0 [1] (☠️) skull and crossbones +2621 ; Extended_Pictographic# E0.0 [1] (☡) CAUTION SIGN +2622..2623 ; Extended_Pictographic# E1.0 [2] (☢️..☣️) radioactive..biohazard +2624..2625 ; Extended_Pictographic# E0.0 [2] (☤..☥) CADUCEUS..ANKH +2626 ; Extended_Pictographic# E1.0 [1] (☦️) orthodox cross +2627..2629 ; Extended_Pictographic# E0.0 [3] (☧..☩) CHI RHO..CROSS OF JERUSALEM +262A ; Extended_Pictographic# E0.7 [1] (☪️) star and crescent +262B..262D ; Extended_Pictographic# E0.0 [3] (☫..☭) FARSI SYMBOL..HAMMER AND SICKLE +262E ; Extended_Pictographic# E1.0 [1] (☮️) peace symbol +262F ; Extended_Pictographic# E0.7 [1] (☯️) yin yang +2630..2637 ; Extended_Pictographic# E0.0 [8] (☰..☷) TRIGRAM FOR HEAVEN..TRIGRAM FOR EARTH +2638..2639 ; Extended_Pictographic# E0.7 [2] (☸️..☹️) wheel of dharma..frowning face +263A ; Extended_Pictographic# E0.6 [1] (☺️) smiling face +263B..263F ; Extended_Pictographic# E0.0 [5] (☻..☿) BLACK SMILING FACE..MERCURY +2640 ; Extended_Pictographic# E4.0 [1] (♀️) female sign +2641 ; Extended_Pictographic# E0.0 [1] (♁) EARTH +2642 ; Extended_Pictographic# E4.0 [1] (♂️) male sign +2643..2647 ; Extended_Pictographic# E0.0 [5] (♃..♇) JUPITER..PLUTO +2648..2653 ; Extended_Pictographic# E0.6 [12] (♈..♓) Aries..Pisces +2654..265E ; Extended_Pictographic# E0.0 [11] (♔..♞) WHITE CHESS KING..BLACK CHESS KNIGHT +265F ; Extended_Pictographic# E11.0 [1] (♟️) chess pawn +2660 ; Extended_Pictographic# E0.6 [1] (♠️) spade suit +2661..2662 ; Extended_Pictographic# E0.0 [2] (♡..♢) WHITE HEART SUIT..WHITE DIAMOND SUIT +2663 ; Extended_Pictographic# E0.6 [1] (♣️) club suit +2664 ; Extended_Pictographic# E0.0 [1] (♤) WHITE SPADE SUIT +2665..2666 ; Extended_Pictographic# E0.6 [2] (♥️..♦️) heart suit..diamond suit +2667 ; Extended_Pictographic# E0.0 [1] (♧) WHITE CLUB SUIT +2668 ; Extended_Pictographic# E0.6 [1] (♨️) hot springs +2669..267A ; Extended_Pictographic# E0.0 [18] (♩..♺) QUARTER NOTE..RECYCLING SYMBOL FOR GENERIC MATERIALS +267B ; Extended_Pictographic# E0.6 [1] (♻️) recycling symbol +267C..267D ; Extended_Pictographic# E0.0 [2] (♼..♽) RECYCLED PAPER SYMBOL..PARTIALLY-RECYCLED PAPER SYMBOL +267E ; Extended_Pictographic# E11.0 [1] (♾️) infinity +267F ; Extended_Pictographic# E0.6 [1] (♿) wheelchair symbol +2680..2685 ; Extended_Pictographic# E0.0 [6] (⚀..⚅) DIE FACE-1..DIE FACE-6 +2690..2691 ; Extended_Pictographic# E0.0 [2] (⚐..⚑) WHITE FLAG..BLACK FLAG +2692 ; Extended_Pictographic# E1.0 [1] (⚒️) hammer and pick +2693 ; Extended_Pictographic# E0.6 [1] (⚓) anchor +2694 ; Extended_Pictographic# E1.0 [1] (⚔️) crossed swords +2695 ; Extended_Pictographic# E4.0 [1] (⚕️) medical symbol +2696..2697 ; Extended_Pictographic# E1.0 [2] (⚖️..⚗️) balance scale..alembic +2698 ; Extended_Pictographic# E0.0 [1] (⚘) FLOWER +2699 ; Extended_Pictographic# E1.0 [1] (⚙️) gear +269A ; Extended_Pictographic# E0.0 [1] (⚚) STAFF OF HERMES +269B..269C ; Extended_Pictographic# E1.0 [2] (⚛️..⚜️) atom symbol..fleur-de-lis +269D..269F ; Extended_Pictographic# E0.0 [3] (⚝..⚟) OUTLINED WHITE STAR..THREE LINES CONVERGING LEFT +26A0..26A1 ; Extended_Pictographic# E0.6 [2] (⚠️..⚡) warning..high voltage +26A2..26A6 ; Extended_Pictographic# E0.0 [5] (⚢..⚦) DOUBLED FEMALE SIGN..MALE WITH STROKE SIGN +26A7 ; Extended_Pictographic# E13.0 [1] (⚧️) transgender symbol +26A8..26A9 ; Extended_Pictographic# E0.0 [2] (⚨..⚩) VERTICAL MALE WITH STROKE SIGN..HORIZONTAL MALE WITH STROKE SIGN +26AA..26AB ; Extended_Pictographic# E0.6 [2] (⚪..⚫) white circle..black circle +26AC..26AF ; Extended_Pictographic# E0.0 [4] (⚬..⚯) MEDIUM SMALL WHITE CIRCLE..UNMARRIED PARTNERSHIP SYMBOL +26B0..26B1 ; Extended_Pictographic# E1.0 [2] (⚰️..⚱️) coffin..funeral urn +26B2..26BC ; Extended_Pictographic# E0.0 [11] (⚲..⚼) NEUTER..SESQUIQUADRATE +26BD..26BE ; Extended_Pictographic# E0.6 [2] (⚽..⚾) soccer ball..baseball +26BF..26C3 ; Extended_Pictographic# E0.0 [5] (⚿..⛃) SQUARED KEY..BLACK DRAUGHTS KING +26C4..26C5 ; Extended_Pictographic# E0.6 [2] (⛄..⛅) snowman without snow..sun behind cloud +26C6..26C7 ; Extended_Pictographic# E0.0 [2] (⛆..⛇) RAIN..BLACK SNOWMAN +26C8 ; Extended_Pictographic# E0.7 [1] (⛈️) cloud with lightning and rain +26C9..26CD ; Extended_Pictographic# E0.0 [5] (⛉..⛍) TURNED WHITE SHOGI PIECE..DISABLED CAR +26CE ; Extended_Pictographic# E0.6 [1] (⛎) Ophiuchus +26CF ; Extended_Pictographic# E0.7 [1] (⛏️) pick +26D0 ; Extended_Pictographic# E0.0 [1] (⛐) CAR SLIDING +26D1 ; Extended_Pictographic# E0.7 [1] (⛑️) rescue worker’s helmet +26D2 ; Extended_Pictographic# E0.0 [1] (⛒) CIRCLED CROSSING LANES +26D3 ; Extended_Pictographic# E0.7 [1] (⛓️) chains +26D4 ; Extended_Pictographic# E0.6 [1] (⛔) no entry +26D5..26E8 ; Extended_Pictographic# E0.0 [20] (⛕..⛨) ALTERNATE ONE-WAY LEFT WAY TRAFFIC..BLACK CROSS ON SHIELD +26E9 ; Extended_Pictographic# E0.7 [1] (⛩️) shinto shrine +26EA ; Extended_Pictographic# E0.6 [1] (⛪) church +26EB..26EF ; Extended_Pictographic# E0.0 [5] (⛫..⛯) CASTLE..MAP SYMBOL FOR LIGHTHOUSE +26F0..26F1 ; Extended_Pictographic# E0.7 [2] (⛰️..⛱️) mountain..umbrella on ground +26F2..26F3 ; Extended_Pictographic# E0.6 [2] (⛲..⛳) fountain..flag in hole +26F4 ; Extended_Pictographic# E0.7 [1] (⛴️) ferry +26F5 ; Extended_Pictographic# E0.6 [1] (⛵) sailboat +26F6 ; Extended_Pictographic# E0.0 [1] (⛶) SQUARE FOUR CORNERS +26F7..26F9 ; Extended_Pictographic# E0.7 [3] (⛷️..⛹️) skier..person bouncing ball +26FA ; Extended_Pictographic# E0.6 [1] (⛺) tent +26FB..26FC ; Extended_Pictographic# E0.0 [2] (⛻..⛼) JAPANESE BANK SYMBOL..HEADSTONE GRAVEYARD SYMBOL +26FD ; Extended_Pictographic# E0.6 [1] (⛽) fuel pump +26FE..2701 ; Extended_Pictographic# E0.0 [4] (⛾..✁) CUP ON BLACK SQUARE..UPPER BLADE SCISSORS +2702 ; Extended_Pictographic# E0.6 [1] (✂️) scissors +2703..2704 ; Extended_Pictographic# E0.0 [2] (✃..✄) LOWER BLADE SCISSORS..WHITE SCISSORS +2705 ; Extended_Pictographic# E0.6 [1] (✅) check mark button +2708..270C ; Extended_Pictographic# E0.6 [5] (✈️..✌️) airplane..victory hand +270D ; Extended_Pictographic# E0.7 [1] (✍️) writing hand +270E ; Extended_Pictographic# E0.0 [1] (✎) LOWER RIGHT PENCIL +270F ; Extended_Pictographic# E0.6 [1] (✏️) pencil +2710..2711 ; Extended_Pictographic# E0.0 [2] (✐..✑) UPPER RIGHT PENCIL..WHITE NIB +2712 ; Extended_Pictographic# E0.6 [1] (✒️) black nib +2714 ; Extended_Pictographic# E0.6 [1] (✔️) check mark +2716 ; Extended_Pictographic# E0.6 [1] (✖️) multiply +271D ; Extended_Pictographic# E0.7 [1] (✝️) latin cross +2721 ; Extended_Pictographic# E0.7 [1] (✡️) star of David +2728 ; Extended_Pictographic# E0.6 [1] (✨) sparkles +2733..2734 ; Extended_Pictographic# E0.6 [2] (✳️..✴️) eight-spoked asterisk..eight-pointed star +2744 ; Extended_Pictographic# E0.6 [1] (❄️) snowflake +2747 ; Extended_Pictographic# E0.6 [1] (❇️) sparkle +274C ; Extended_Pictographic# E0.6 [1] (❌) cross mark +274E ; Extended_Pictographic# E0.6 [1] (❎) cross mark button +2753..2755 ; Extended_Pictographic# E0.6 [3] (❓..❕) question mark..white exclamation mark +2757 ; Extended_Pictographic# E0.6 [1] (❗) exclamation mark +2763 ; Extended_Pictographic# E1.0 [1] (❣️) heart exclamation +2764 ; Extended_Pictographic# E0.6 [1] (❤️) red heart +2765..2767 ; Extended_Pictographic# E0.0 [3] (❥..❧) ROTATED HEAVY BLACK HEART BULLET..ROTATED FLORAL HEART BULLET +2795..2797 ; Extended_Pictographic# E0.6 [3] (➕..➗) plus..divide +27A1 ; Extended_Pictographic# E0.6 [1] (➡️) right arrow +27B0 ; Extended_Pictographic# E0.6 [1] (➰) curly loop +27BF ; Extended_Pictographic# E1.0 [1] (➿) double curly loop +2934..2935 ; Extended_Pictographic# E0.6 [2] (⤴️..⤵️) right arrow curving up..right arrow curving down +2B05..2B07 ; Extended_Pictographic# E0.6 [3] (⬅️..⬇️) left arrow..down arrow +2B1B..2B1C ; Extended_Pictographic# E0.6 [2] (⬛..⬜) black large square..white large square +2B50 ; Extended_Pictographic# E0.6 [1] (⭐) star +2B55 ; Extended_Pictographic# E0.6 [1] (⭕) hollow red circle +3030 ; Extended_Pictographic# E0.6 [1] (〰️) wavy dash +303D ; Extended_Pictographic# E0.6 [1] (〽️) part alternation mark +3297 ; Extended_Pictographic# E0.6 [1] (㊗️) Japanese “congratulations” button +3299 ; Extended_Pictographic# E0.6 [1] (㊙️) Japanese “secret” button +1F000..1F003 ; Extended_Pictographic# E0.0 [4] (🀀..🀃) MAHJONG TILE EAST WIND..MAHJONG TILE NORTH WIND +1F004 ; Extended_Pictographic# E0.6 [1] (🀄) mahjong red dragon +1F005..1F0CE ; Extended_Pictographic# E0.0 [202] (🀅..🃎) MAHJONG TILE GREEN DRAGON..PLAYING CARD KING OF DIAMONDS +1F0CF ; Extended_Pictographic# E0.6 [1] (🃏) joker +1F0D0..1F0FF ; Extended_Pictographic# E0.0 [48] (🃐..🃿) .. +1F10D..1F10F ; Extended_Pictographic# E0.0 [3] (🄍..🄏) CIRCLED ZERO WITH SLASH..CIRCLED DOLLAR SIGN WITH OVERLAID BACKSLASH +1F12F ; Extended_Pictographic# E0.0 [1] (🄯) COPYLEFT SYMBOL +1F16C..1F16F ; Extended_Pictographic# E0.0 [4] (🅬..🅯) RAISED MR SIGN..CIRCLED HUMAN FIGURE +1F170..1F171 ; Extended_Pictographic# E0.6 [2] (🅰️..🅱️) A button (blood type)..B button (blood type) +1F17E..1F17F ; Extended_Pictographic# E0.6 [2] (🅾️..🅿️) O button (blood type)..P button +1F18E ; Extended_Pictographic# E0.6 [1] (🆎) AB button (blood type) +1F191..1F19A ; Extended_Pictographic# E0.6 [10] (🆑..🆚) CL button..VS button +1F1AD..1F1E5 ; Extended_Pictographic# E0.0 [57] (🆭..🇥) MASK WORK SYMBOL.. +1F201..1F202 ; Extended_Pictographic# E0.6 [2] (🈁..🈂️) Japanese “here” button..Japanese “service charge” button +1F203..1F20F ; Extended_Pictographic# E0.0 [13] (🈃..🈏) .. +1F21A ; Extended_Pictographic# E0.6 [1] (🈚) Japanese “free of charge” button +1F22F ; Extended_Pictographic# E0.6 [1] (🈯) Japanese “reserved” button +1F232..1F23A ; Extended_Pictographic# E0.6 [9] (🈲..🈺) Japanese “prohibited” button..Japanese “open for business” button +1F23C..1F23F ; Extended_Pictographic# E0.0 [4] (🈼..🈿) .. +1F249..1F24F ; Extended_Pictographic# E0.0 [7] (🉉..🉏) .. +1F250..1F251 ; Extended_Pictographic# E0.6 [2] (🉐..🉑) Japanese “bargain” button..Japanese “acceptable” button +1F252..1F2FF ; Extended_Pictographic# E0.0 [174] (🉒..🋿) .. +1F300..1F30C ; Extended_Pictographic# E0.6 [13] (🌀..🌌) cyclone..milky way +1F30D..1F30E ; Extended_Pictographic# E0.7 [2] (🌍..🌎) globe showing Europe-Africa..globe showing Americas +1F30F ; Extended_Pictographic# E0.6 [1] (🌏) globe showing Asia-Australia +1F310 ; Extended_Pictographic# E1.0 [1] (🌐) globe with meridians +1F311 ; Extended_Pictographic# E0.6 [1] (🌑) new moon +1F312 ; Extended_Pictographic# E1.0 [1] (🌒) waxing crescent moon +1F313..1F315 ; Extended_Pictographic# E0.6 [3] (🌓..🌕) first quarter moon..full moon +1F316..1F318 ; Extended_Pictographic# E1.0 [3] (🌖..🌘) waning gibbous moon..waning crescent moon +1F319 ; Extended_Pictographic# E0.6 [1] (🌙) crescent moon +1F31A ; Extended_Pictographic# E1.0 [1] (🌚) new moon face +1F31B ; Extended_Pictographic# E0.6 [1] (🌛) first quarter moon face +1F31C ; Extended_Pictographic# E0.7 [1] (🌜) last quarter moon face +1F31D..1F31E ; Extended_Pictographic# E1.0 [2] (🌝..🌞) full moon face..sun with face +1F31F..1F320 ; Extended_Pictographic# E0.6 [2] (🌟..🌠) glowing star..shooting star +1F321 ; Extended_Pictographic# E0.7 [1] (🌡️) thermometer +1F322..1F323 ; Extended_Pictographic# E0.0 [2] (🌢..🌣) BLACK DROPLET..WHITE SUN +1F324..1F32C ; Extended_Pictographic# E0.7 [9] (🌤️..🌬️) sun behind small cloud..wind face +1F32D..1F32F ; Extended_Pictographic# E1.0 [3] (🌭..🌯) hot dog..burrito +1F330..1F331 ; Extended_Pictographic# E0.6 [2] (🌰..🌱) chestnut..seedling +1F332..1F333 ; Extended_Pictographic# E1.0 [2] (🌲..🌳) evergreen tree..deciduous tree +1F334..1F335 ; Extended_Pictographic# E0.6 [2] (🌴..🌵) palm tree..cactus +1F336 ; Extended_Pictographic# E0.7 [1] (🌶️) hot pepper +1F337..1F34A ; Extended_Pictographic# E0.6 [20] (🌷..🍊) tulip..tangerine +1F34B ; Extended_Pictographic# E1.0 [1] (🍋) lemon +1F34C..1F34F ; Extended_Pictographic# E0.6 [4] (🍌..🍏) banana..green apple +1F350 ; Extended_Pictographic# E1.0 [1] (🍐) pear +1F351..1F37B ; Extended_Pictographic# E0.6 [43] (🍑..🍻) peach..clinking beer mugs +1F37C ; Extended_Pictographic# E1.0 [1] (🍼) baby bottle +1F37D ; Extended_Pictographic# E0.7 [1] (🍽️) fork and knife with plate +1F37E..1F37F ; Extended_Pictographic# E1.0 [2] (🍾..🍿) bottle with popping cork..popcorn +1F380..1F393 ; Extended_Pictographic# E0.6 [20] (🎀..🎓) ribbon..graduation cap +1F394..1F395 ; Extended_Pictographic# E0.0 [2] (🎔..🎕) HEART WITH TIP ON THE LEFT..BOUQUET OF FLOWERS +1F396..1F397 ; Extended_Pictographic# E0.7 [2] (🎖️..🎗️) military medal..reminder ribbon +1F398 ; Extended_Pictographic# E0.0 [1] (🎘) MUSICAL KEYBOARD WITH JACKS +1F399..1F39B ; Extended_Pictographic# E0.7 [3] (🎙️..🎛️) studio microphone..control knobs +1F39C..1F39D ; Extended_Pictographic# E0.0 [2] (🎜..🎝) BEAMED ASCENDING MUSICAL NOTES..BEAMED DESCENDING MUSICAL NOTES +1F39E..1F39F ; Extended_Pictographic# E0.7 [2] (🎞️..🎟️) film frames..admission tickets +1F3A0..1F3C4 ; Extended_Pictographic# E0.6 [37] (🎠..🏄) carousel horse..person surfing +1F3C5 ; Extended_Pictographic# E1.0 [1] (🏅) sports medal +1F3C6 ; Extended_Pictographic# E0.6 [1] (🏆) trophy +1F3C7 ; Extended_Pictographic# E1.0 [1] (🏇) horse racing +1F3C8 ; Extended_Pictographic# E0.6 [1] (🏈) american football +1F3C9 ; Extended_Pictographic# E1.0 [1] (🏉) rugby football +1F3CA ; Extended_Pictographic# E0.6 [1] (🏊) person swimming +1F3CB..1F3CE ; Extended_Pictographic# E0.7 [4] (🏋️..🏎️) person lifting weights..racing car +1F3CF..1F3D3 ; Extended_Pictographic# E1.0 [5] (🏏..🏓) cricket game..ping pong +1F3D4..1F3DF ; Extended_Pictographic# E0.7 [12] (🏔️..🏟️) snow-capped mountain..stadium +1F3E0..1F3E3 ; Extended_Pictographic# E0.6 [4] (🏠..🏣) house..Japanese post office +1F3E4 ; Extended_Pictographic# E1.0 [1] (🏤) post office +1F3E5..1F3F0 ; Extended_Pictographic# E0.6 [12] (🏥..🏰) hospital..castle +1F3F1..1F3F2 ; Extended_Pictographic# E0.0 [2] (🏱..🏲) WHITE PENNANT..BLACK PENNANT +1F3F3 ; Extended_Pictographic# E0.7 [1] (🏳️) white flag +1F3F4 ; Extended_Pictographic# E1.0 [1] (🏴) black flag +1F3F5 ; Extended_Pictographic# E0.7 [1] (🏵️) rosette +1F3F6 ; Extended_Pictographic# E0.0 [1] (🏶) BLACK ROSETTE +1F3F7 ; Extended_Pictographic# E0.7 [1] (🏷️) label +1F3F8..1F3FA ; Extended_Pictographic# E1.0 [3] (🏸..🏺) badminton..amphora +1F400..1F407 ; Extended_Pictographic# E1.0 [8] (🐀..🐇) rat..rabbit +1F408 ; Extended_Pictographic# E0.7 [1] (🐈) cat +1F409..1F40B ; Extended_Pictographic# E1.0 [3] (🐉..🐋) dragon..whale +1F40C..1F40E ; Extended_Pictographic# E0.6 [3] (🐌..🐎) snail..horse +1F40F..1F410 ; Extended_Pictographic# E1.0 [2] (🐏..🐐) ram..goat +1F411..1F412 ; Extended_Pictographic# E0.6 [2] (🐑..🐒) ewe..monkey +1F413 ; Extended_Pictographic# E1.0 [1] (🐓) rooster +1F414 ; Extended_Pictographic# E0.6 [1] (🐔) chicken +1F415 ; Extended_Pictographic# E0.7 [1] (🐕) dog +1F416 ; Extended_Pictographic# E1.0 [1] (🐖) pig +1F417..1F429 ; Extended_Pictographic# E0.6 [19] (🐗..🐩) boar..poodle +1F42A ; Extended_Pictographic# E1.0 [1] (🐪) camel +1F42B..1F43E ; Extended_Pictographic# E0.6 [20] (🐫..🐾) two-hump camel..paw prints +1F43F ; Extended_Pictographic# E0.7 [1] (🐿️) chipmunk +1F440 ; Extended_Pictographic# E0.6 [1] (👀) eyes +1F441 ; Extended_Pictographic# E0.7 [1] (👁️) eye +1F442..1F464 ; Extended_Pictographic# E0.6 [35] (👂..👤) ear..bust in silhouette +1F465 ; Extended_Pictographic# E1.0 [1] (👥) busts in silhouette +1F466..1F46B ; Extended_Pictographic# E0.6 [6] (👦..👫) boy..woman and man holding hands +1F46C..1F46D ; Extended_Pictographic# E1.0 [2] (👬..👭) men holding hands..women holding hands +1F46E..1F4AC ; Extended_Pictographic# E0.6 [63] (👮..💬) police officer..speech balloon +1F4AD ; Extended_Pictographic# E1.0 [1] (💭) thought balloon +1F4AE..1F4B5 ; Extended_Pictographic# E0.6 [8] (💮..💵) white flower..dollar banknote +1F4B6..1F4B7 ; Extended_Pictographic# E1.0 [2] (💶..💷) euro banknote..pound banknote +1F4B8..1F4EB ; Extended_Pictographic# E0.6 [52] (💸..📫) money with wings..closed mailbox with raised flag +1F4EC..1F4ED ; Extended_Pictographic# E0.7 [2] (📬..📭) open mailbox with raised flag..open mailbox with lowered flag +1F4EE ; Extended_Pictographic# E0.6 [1] (📮) postbox +1F4EF ; Extended_Pictographic# E1.0 [1] (📯) postal horn +1F4F0..1F4F4 ; Extended_Pictographic# E0.6 [5] (📰..📴) newspaper..mobile phone off +1F4F5 ; Extended_Pictographic# E1.0 [1] (📵) no mobile phones +1F4F6..1F4F7 ; Extended_Pictographic# E0.6 [2] (📶..📷) antenna bars..camera +1F4F8 ; Extended_Pictographic# E1.0 [1] (📸) camera with flash +1F4F9..1F4FC ; Extended_Pictographic# E0.6 [4] (📹..📼) video camera..videocassette +1F4FD ; Extended_Pictographic# E0.7 [1] (📽️) film projector +1F4FE ; Extended_Pictographic# E0.0 [1] (📾) PORTABLE STEREO +1F4FF..1F502 ; Extended_Pictographic# E1.0 [4] (📿..🔂) prayer beads..repeat single button +1F503 ; Extended_Pictographic# E0.6 [1] (🔃) clockwise vertical arrows +1F504..1F507 ; Extended_Pictographic# E1.0 [4] (🔄..🔇) counterclockwise arrows button..muted speaker +1F508 ; Extended_Pictographic# E0.7 [1] (🔈) speaker low volume +1F509 ; Extended_Pictographic# E1.0 [1] (🔉) speaker medium volume +1F50A..1F514 ; Extended_Pictographic# E0.6 [11] (🔊..🔔) speaker high volume..bell +1F515 ; Extended_Pictographic# E1.0 [1] (🔕) bell with slash +1F516..1F52B ; Extended_Pictographic# E0.6 [22] (🔖..🔫) bookmark..pistol +1F52C..1F52D ; Extended_Pictographic# E1.0 [2] (🔬..🔭) microscope..telescope +1F52E..1F53D ; Extended_Pictographic# E0.6 [16] (🔮..🔽) crystal ball..downwards button +1F546..1F548 ; Extended_Pictographic# E0.0 [3] (🕆..🕈) WHITE LATIN CROSS..CELTIC CROSS +1F549..1F54A ; Extended_Pictographic# E0.7 [2] (🕉️..🕊️) om..dove +1F54B..1F54E ; Extended_Pictographic# E1.0 [4] (🕋..🕎) kaaba..menorah +1F54F ; Extended_Pictographic# E0.0 [1] (🕏) BOWL OF HYGIEIA +1F550..1F55B ; Extended_Pictographic# E0.6 [12] (🕐..🕛) one o’clock..twelve o’clock +1F55C..1F567 ; Extended_Pictographic# E0.7 [12] (🕜..🕧) one-thirty..twelve-thirty +1F568..1F56E ; Extended_Pictographic# E0.0 [7] (🕨..🕮) RIGHT SPEAKER..BOOK +1F56F..1F570 ; Extended_Pictographic# E0.7 [2] (🕯️..🕰️) candle..mantelpiece clock +1F571..1F572 ; Extended_Pictographic# E0.0 [2] (🕱..🕲) BLACK SKULL AND CROSSBONES..NO PIRACY +1F573..1F579 ; Extended_Pictographic# E0.7 [7] (🕳️..🕹️) hole..joystick +1F57A ; Extended_Pictographic# E3.0 [1] (🕺) man dancing +1F57B..1F586 ; Extended_Pictographic# E0.0 [12] (🕻..🖆) LEFT HAND TELEPHONE RECEIVER..PEN OVER STAMPED ENVELOPE +1F587 ; Extended_Pictographic# E0.7 [1] (🖇️) linked paperclips +1F588..1F589 ; Extended_Pictographic# E0.0 [2] (🖈..🖉) BLACK PUSHPIN..LOWER LEFT PENCIL +1F58A..1F58D ; Extended_Pictographic# E0.7 [4] (🖊️..🖍️) pen..crayon +1F58E..1F58F ; Extended_Pictographic# E0.0 [2] (🖎..🖏) LEFT WRITING HAND..TURNED OK HAND SIGN +1F590 ; Extended_Pictographic# E0.7 [1] (🖐️) hand with fingers splayed +1F591..1F594 ; Extended_Pictographic# E0.0 [4] (🖑..🖔) REVERSED RAISED HAND WITH FINGERS SPLAYED..REVERSED VICTORY HAND +1F595..1F596 ; Extended_Pictographic# E1.0 [2] (🖕..🖖) middle finger..vulcan salute +1F597..1F5A3 ; Extended_Pictographic# E0.0 [13] (🖗..🖣) WHITE DOWN POINTING LEFT HAND INDEX..BLACK DOWN POINTING BACKHAND INDEX +1F5A4 ; Extended_Pictographic# E3.0 [1] (🖤) black heart +1F5A5 ; Extended_Pictographic# E0.7 [1] (🖥️) desktop computer +1F5A6..1F5A7 ; Extended_Pictographic# E0.0 [2] (🖦..🖧) KEYBOARD AND MOUSE..THREE NETWORKED COMPUTERS +1F5A8 ; Extended_Pictographic# E0.7 [1] (🖨️) printer +1F5A9..1F5B0 ; Extended_Pictographic# E0.0 [8] (🖩..🖰) POCKET CALCULATOR..TWO BUTTON MOUSE +1F5B1..1F5B2 ; Extended_Pictographic# E0.7 [2] (🖱️..🖲️) computer mouse..trackball +1F5B3..1F5BB ; Extended_Pictographic# E0.0 [9] (🖳..🖻) OLD PERSONAL COMPUTER..DOCUMENT WITH PICTURE +1F5BC ; Extended_Pictographic# E0.7 [1] (🖼️) framed picture +1F5BD..1F5C1 ; Extended_Pictographic# E0.0 [5] (🖽..🗁) FRAME WITH TILES..OPEN FOLDER +1F5C2..1F5C4 ; Extended_Pictographic# E0.7 [3] (🗂️..🗄️) card index dividers..file cabinet +1F5C5..1F5D0 ; Extended_Pictographic# E0.0 [12] (🗅..🗐) EMPTY NOTE..PAGES +1F5D1..1F5D3 ; Extended_Pictographic# E0.7 [3] (🗑️..🗓️) wastebasket..spiral calendar +1F5D4..1F5DB ; Extended_Pictographic# E0.0 [8] (🗔..🗛) DESKTOP WINDOW..DECREASE FONT SIZE SYMBOL +1F5DC..1F5DE ; Extended_Pictographic# E0.7 [3] (🗜️..🗞️) clamp..rolled-up newspaper +1F5DF..1F5E0 ; Extended_Pictographic# E0.0 [2] (🗟..🗠) PAGE WITH CIRCLED TEXT..STOCK CHART +1F5E1 ; Extended_Pictographic# E0.7 [1] (🗡️) dagger +1F5E2 ; Extended_Pictographic# E0.0 [1] (🗢) LIPS +1F5E3 ; Extended_Pictographic# E0.7 [1] (🗣️) speaking head +1F5E4..1F5E7 ; Extended_Pictographic# E0.0 [4] (🗤..🗧) THREE RAYS ABOVE..THREE RAYS RIGHT +1F5E8 ; Extended_Pictographic# E2.0 [1] (🗨️) left speech bubble +1F5E9..1F5EE ; Extended_Pictographic# E0.0 [6] (🗩..🗮) RIGHT SPEECH BUBBLE..LEFT ANGER BUBBLE +1F5EF ; Extended_Pictographic# E0.7 [1] (🗯️) right anger bubble +1F5F0..1F5F2 ; Extended_Pictographic# E0.0 [3] (🗰..🗲) MOOD BUBBLE..LIGHTNING MOOD +1F5F3 ; Extended_Pictographic# E0.7 [1] (🗳️) ballot box with ballot +1F5F4..1F5F9 ; Extended_Pictographic# E0.0 [6] (🗴..🗹) BALLOT SCRIPT X..BALLOT BOX WITH BOLD CHECK +1F5FA ; Extended_Pictographic# E0.7 [1] (🗺️) world map +1F5FB..1F5FF ; Extended_Pictographic# E0.6 [5] (🗻..🗿) mount fuji..moai +1F600 ; Extended_Pictographic# E1.0 [1] (😀) grinning face +1F601..1F606 ; Extended_Pictographic# E0.6 [6] (😁..😆) beaming face with smiling eyes..grinning squinting face +1F607..1F608 ; Extended_Pictographic# E1.0 [2] (😇..😈) smiling face with halo..smiling face with horns +1F609..1F60D ; Extended_Pictographic# E0.6 [5] (😉..😍) winking face..smiling face with heart-eyes +1F60E ; Extended_Pictographic# E1.0 [1] (😎) smiling face with sunglasses +1F60F ; Extended_Pictographic# E0.6 [1] (😏) smirking face +1F610 ; Extended_Pictographic# E0.7 [1] (😐) neutral face +1F611 ; Extended_Pictographic# E1.0 [1] (😑) expressionless face +1F612..1F614 ; Extended_Pictographic# E0.6 [3] (😒..😔) unamused face..pensive face +1F615 ; Extended_Pictographic# E1.0 [1] (😕) confused face +1F616 ; Extended_Pictographic# E0.6 [1] (😖) confounded face +1F617 ; Extended_Pictographic# E1.0 [1] (😗) kissing face +1F618 ; Extended_Pictographic# E0.6 [1] (😘) face blowing a kiss +1F619 ; Extended_Pictographic# E1.0 [1] (😙) kissing face with smiling eyes +1F61A ; Extended_Pictographic# E0.6 [1] (😚) kissing face with closed eyes +1F61B ; Extended_Pictographic# E1.0 [1] (😛) face with tongue +1F61C..1F61E ; Extended_Pictographic# E0.6 [3] (😜..😞) winking face with tongue..disappointed face +1F61F ; Extended_Pictographic# E1.0 [1] (😟) worried face +1F620..1F625 ; Extended_Pictographic# E0.6 [6] (😠..😥) angry face..sad but relieved face +1F626..1F627 ; Extended_Pictographic# E1.0 [2] (😦..😧) frowning face with open mouth..anguished face +1F628..1F62B ; Extended_Pictographic# E0.6 [4] (😨..😫) fearful face..tired face +1F62C ; Extended_Pictographic# E1.0 [1] (😬) grimacing face +1F62D ; Extended_Pictographic# E0.6 [1] (😭) loudly crying face +1F62E..1F62F ; Extended_Pictographic# E1.0 [2] (😮..😯) face with open mouth..hushed face +1F630..1F633 ; Extended_Pictographic# E0.6 [4] (😰..😳) anxious face with sweat..flushed face +1F634 ; Extended_Pictographic# E1.0 [1] (😴) sleeping face +1F635 ; Extended_Pictographic# E0.6 [1] (😵) dizzy face +1F636 ; Extended_Pictographic# E1.0 [1] (😶) face without mouth +1F637..1F640 ; Extended_Pictographic# E0.6 [10] (😷..🙀) face with medical mask..weary cat +1F641..1F644 ; Extended_Pictographic# E1.0 [4] (🙁..🙄) slightly frowning face..face with rolling eyes +1F645..1F64F ; Extended_Pictographic# E0.6 [11] (🙅..🙏) person gesturing NO..folded hands +1F680 ; Extended_Pictographic# E0.6 [1] (🚀) rocket +1F681..1F682 ; Extended_Pictographic# E1.0 [2] (🚁..🚂) helicopter..locomotive +1F683..1F685 ; Extended_Pictographic# E0.6 [3] (🚃..🚅) railway car..bullet train +1F686 ; Extended_Pictographic# E1.0 [1] (🚆) train +1F687 ; Extended_Pictographic# E0.6 [1] (🚇) metro +1F688 ; Extended_Pictographic# E1.0 [1] (🚈) light rail +1F689 ; Extended_Pictographic# E0.6 [1] (🚉) station +1F68A..1F68B ; Extended_Pictographic# E1.0 [2] (🚊..🚋) tram..tram car +1F68C ; Extended_Pictographic# E0.6 [1] (🚌) bus +1F68D ; Extended_Pictographic# E0.7 [1] (🚍) oncoming bus +1F68E ; Extended_Pictographic# E1.0 [1] (🚎) trolleybus +1F68F ; Extended_Pictographic# E0.6 [1] (🚏) bus stop +1F690 ; Extended_Pictographic# E1.0 [1] (🚐) minibus +1F691..1F693 ; Extended_Pictographic# E0.6 [3] (🚑..🚓) ambulance..police car +1F694 ; Extended_Pictographic# E0.7 [1] (🚔) oncoming police car +1F695 ; Extended_Pictographic# E0.6 [1] (🚕) taxi +1F696 ; Extended_Pictographic# E1.0 [1] (🚖) oncoming taxi +1F697 ; Extended_Pictographic# E0.6 [1] (🚗) automobile +1F698 ; Extended_Pictographic# E0.7 [1] (🚘) oncoming automobile +1F699..1F69A ; Extended_Pictographic# E0.6 [2] (🚙..🚚) sport utility vehicle..delivery truck +1F69B..1F6A1 ; Extended_Pictographic# E1.0 [7] (🚛..🚡) articulated lorry..aerial tramway +1F6A2 ; Extended_Pictographic# E0.6 [1] (🚢) ship +1F6A3 ; Extended_Pictographic# E1.0 [1] (🚣) person rowing boat +1F6A4..1F6A5 ; Extended_Pictographic# E0.6 [2] (🚤..🚥) speedboat..horizontal traffic light +1F6A6 ; Extended_Pictographic# E1.0 [1] (🚦) vertical traffic light +1F6A7..1F6AD ; Extended_Pictographic# E0.6 [7] (🚧..🚭) construction..no smoking +1F6AE..1F6B1 ; Extended_Pictographic# E1.0 [4] (🚮..🚱) litter in bin sign..non-potable water +1F6B2 ; Extended_Pictographic# E0.6 [1] (🚲) bicycle +1F6B3..1F6B5 ; Extended_Pictographic# E1.0 [3] (🚳..🚵) no bicycles..person mountain biking +1F6B6 ; Extended_Pictographic# E0.6 [1] (🚶) person walking +1F6B7..1F6B8 ; Extended_Pictographic# E1.0 [2] (🚷..🚸) no pedestrians..children crossing +1F6B9..1F6BE ; Extended_Pictographic# E0.6 [6] (🚹..🚾) men’s room..water closet +1F6BF ; Extended_Pictographic# E1.0 [1] (🚿) shower +1F6C0 ; Extended_Pictographic# E0.6 [1] (🛀) person taking bath +1F6C1..1F6C5 ; Extended_Pictographic# E1.0 [5] (🛁..🛅) bathtub..left luggage +1F6C6..1F6CA ; Extended_Pictographic# E0.0 [5] (🛆..🛊) TRIANGLE WITH ROUNDED CORNERS..GIRLS SYMBOL +1F6CB ; Extended_Pictographic# E0.7 [1] (🛋️) couch and lamp +1F6CC ; Extended_Pictographic# E1.0 [1] (🛌) person in bed +1F6CD..1F6CF ; Extended_Pictographic# E0.7 [3] (🛍️..🛏️) shopping bags..bed +1F6D0 ; Extended_Pictographic# E1.0 [1] (🛐) place of worship +1F6D1..1F6D2 ; Extended_Pictographic# E3.0 [2] (🛑..🛒) stop sign..shopping cart +1F6D3..1F6D4 ; Extended_Pictographic# E0.0 [2] (🛓..🛔) STUPA..PAGODA +1F6D5 ; Extended_Pictographic# E12.0 [1] (🛕) hindu temple +1F6D6..1F6D7 ; Extended_Pictographic# E13.0 [2] (🛖..🛗) hut..elevator +1F6D8..1F6DF ; Extended_Pictographic# E0.0 [8] (🛘..🛟) .. +1F6E0..1F6E5 ; Extended_Pictographic# E0.7 [6] (🛠️..🛥️) hammer and wrench..motor boat +1F6E6..1F6E8 ; Extended_Pictographic# E0.0 [3] (🛦..🛨) UP-POINTING MILITARY AIRPLANE..UP-POINTING SMALL AIRPLANE +1F6E9 ; Extended_Pictographic# E0.7 [1] (🛩️) small airplane +1F6EA ; Extended_Pictographic# E0.0 [1] (🛪) NORTHEAST-POINTING AIRPLANE +1F6EB..1F6EC ; Extended_Pictographic# E1.0 [2] (🛫..🛬) airplane departure..airplane arrival +1F6ED..1F6EF ; Extended_Pictographic# E0.0 [3] (🛭..🛯) .. +1F6F0 ; Extended_Pictographic# E0.7 [1] (🛰️) satellite +1F6F1..1F6F2 ; Extended_Pictographic# E0.0 [2] (🛱..🛲) ONCOMING FIRE ENGINE..DIESEL LOCOMOTIVE +1F6F3 ; Extended_Pictographic# E0.7 [1] (🛳️) passenger ship +1F6F4..1F6F6 ; Extended_Pictographic# E3.0 [3] (🛴..🛶) kick scooter..canoe +1F6F7..1F6F8 ; Extended_Pictographic# E5.0 [2] (🛷..🛸) sled..flying saucer +1F6F9 ; Extended_Pictographic# E11.0 [1] (🛹) skateboard +1F6FA ; Extended_Pictographic# E12.0 [1] (🛺) auto rickshaw +1F6FB..1F6FC ; Extended_Pictographic# E13.0 [2] (🛻..🛼) pickup truck..roller skate +1F6FD..1F6FF ; Extended_Pictographic# E0.0 [3] (🛽..🛿) .. +1F774..1F77F ; Extended_Pictographic# E0.0 [12] (🝴..🝿) .. +1F7D5..1F7DF ; Extended_Pictographic# E0.0 [11] (🟕..🟟) CIRCLED TRIANGLE.. +1F7E0..1F7EB ; Extended_Pictographic# E12.0 [12] (🟠..🟫) orange circle..brown square +1F7EC..1F7FF ; Extended_Pictographic# E0.0 [20] (🟬..🟿) .. +1F80C..1F80F ; Extended_Pictographic# E0.0 [4] (🠌..🠏) .. +1F848..1F84F ; Extended_Pictographic# E0.0 [8] (🡈..🡏) .. +1F85A..1F85F ; Extended_Pictographic# E0.0 [6] (🡚..🡟) .. +1F888..1F88F ; Extended_Pictographic# E0.0 [8] (🢈..🢏) .. +1F8AE..1F8FF ; Extended_Pictographic# E0.0 [82] (🢮..🣿) .. +1F90C ; Extended_Pictographic# E13.0 [1] (🤌) pinched fingers +1F90D..1F90F ; Extended_Pictographic# E12.0 [3] (🤍..🤏) white heart..pinching hand +1F910..1F918 ; Extended_Pictographic# E1.0 [9] (🤐..🤘) zipper-mouth face..sign of the horns +1F919..1F91E ; Extended_Pictographic# E3.0 [6] (🤙..🤞) call me hand..crossed fingers +1F91F ; Extended_Pictographic# E5.0 [1] (🤟) love-you gesture +1F920..1F927 ; Extended_Pictographic# E3.0 [8] (🤠..🤧) cowboy hat face..sneezing face +1F928..1F92F ; Extended_Pictographic# E5.0 [8] (🤨..🤯) face with raised eyebrow..exploding head +1F930 ; Extended_Pictographic# E3.0 [1] (🤰) pregnant woman +1F931..1F932 ; Extended_Pictographic# E5.0 [2] (🤱..🤲) breast-feeding..palms up together +1F933..1F93A ; Extended_Pictographic# E3.0 [8] (🤳..🤺) selfie..person fencing +1F93C..1F93E ; Extended_Pictographic# E3.0 [3] (🤼..🤾) people wrestling..person playing handball +1F93F ; Extended_Pictographic# E12.0 [1] (🤿) diving mask +1F940..1F945 ; Extended_Pictographic# E3.0 [6] (🥀..🥅) wilted flower..goal net +1F947..1F94B ; Extended_Pictographic# E3.0 [5] (🥇..🥋) 1st place medal..martial arts uniform +1F94C ; Extended_Pictographic# E5.0 [1] (🥌) curling stone +1F94D..1F94F ; Extended_Pictographic# E11.0 [3] (🥍..🥏) lacrosse..flying disc +1F950..1F95E ; Extended_Pictographic# E3.0 [15] (🥐..🥞) croissant..pancakes +1F95F..1F96B ; Extended_Pictographic# E5.0 [13] (🥟..🥫) dumpling..canned food +1F96C..1F970 ; Extended_Pictographic# E11.0 [5] (🥬..🥰) leafy green..smiling face with hearts +1F971 ; Extended_Pictographic# E12.0 [1] (🥱) yawning face +1F972 ; Extended_Pictographic# E13.0 [1] (🥲) smiling face with tear +1F973..1F976 ; Extended_Pictographic# E11.0 [4] (🥳..🥶) partying face..cold face +1F977..1F978 ; Extended_Pictographic# E13.0 [2] (🥷..🥸) ninja..disguised face +1F979 ; Extended_Pictographic# E0.0 [1] (🥹) +1F97A ; Extended_Pictographic# E11.0 [1] (🥺) pleading face +1F97B ; Extended_Pictographic# E12.0 [1] (🥻) sari +1F97C..1F97F ; Extended_Pictographic# E11.0 [4] (🥼..🥿) lab coat..flat shoe +1F980..1F984 ; Extended_Pictographic# E1.0 [5] (🦀..🦄) crab..unicorn +1F985..1F991 ; Extended_Pictographic# E3.0 [13] (🦅..🦑) eagle..squid +1F992..1F997 ; Extended_Pictographic# E5.0 [6] (🦒..🦗) giraffe..cricket +1F998..1F9A2 ; Extended_Pictographic# E11.0 [11] (🦘..🦢) kangaroo..swan +1F9A3..1F9A4 ; Extended_Pictographic# E13.0 [2] (🦣..🦤) mammoth..dodo +1F9A5..1F9AA ; Extended_Pictographic# E12.0 [6] (🦥..🦪) sloth..oyster +1F9AB..1F9AD ; Extended_Pictographic# E13.0 [3] (🦫..🦭) beaver..seal +1F9AE..1F9AF ; Extended_Pictographic# E12.0 [2] (🦮..🦯) guide dog..white cane +1F9B0..1F9B9 ; Extended_Pictographic# E11.0 [10] (🦰..🦹) red hair..supervillain +1F9BA..1F9BF ; Extended_Pictographic# E12.0 [6] (🦺..🦿) safety vest..mechanical leg +1F9C0 ; Extended_Pictographic# E1.0 [1] (🧀) cheese wedge +1F9C1..1F9C2 ; Extended_Pictographic# E11.0 [2] (🧁..🧂) cupcake..salt +1F9C3..1F9CA ; Extended_Pictographic# E12.0 [8] (🧃..🧊) beverage box..ice +1F9CB ; Extended_Pictographic# E13.0 [1] (🧋) bubble tea +1F9CC ; Extended_Pictographic# E0.0 [1] (🧌) +1F9CD..1F9CF ; Extended_Pictographic# E12.0 [3] (🧍..🧏) person standing..deaf person +1F9D0..1F9E6 ; Extended_Pictographic# E5.0 [23] (🧐..🧦) face with monocle..socks +1F9E7..1F9FF ; Extended_Pictographic# E11.0 [25] (🧧..🧿) red envelope..nazar amulet +1FA00..1FA6F ; Extended_Pictographic# E0.0 [112] (🨀..🩯) NEUTRAL CHESS KING.. +1FA70..1FA73 ; Extended_Pictographic# E12.0 [4] (🩰..🩳) ballet shoes..shorts +1FA74 ; Extended_Pictographic# E13.0 [1] (🩴) thong sandal +1FA75..1FA77 ; Extended_Pictographic# E0.0 [3] (🩵..🩷) .. +1FA78..1FA7A ; Extended_Pictographic# E12.0 [3] (🩸..🩺) drop of blood..stethoscope +1FA7B..1FA7F ; Extended_Pictographic# E0.0 [5] (🩻..🩿) .. +1FA80..1FA82 ; Extended_Pictographic# E12.0 [3] (🪀..🪂) yo-yo..parachute +1FA83..1FA86 ; Extended_Pictographic# E13.0 [4] (🪃..🪆) boomerang..nesting dolls +1FA87..1FA8F ; Extended_Pictographic# E0.0 [9] (🪇..🪏) .. +1FA90..1FA95 ; Extended_Pictographic# E12.0 [6] (🪐..🪕) ringed planet..banjo +1FA96..1FAA8 ; Extended_Pictographic# E13.0 [19] (🪖..🪨) military helmet..rock +1FAA9..1FAAF ; Extended_Pictographic# E0.0 [7] (🪩..🪯) .. +1FAB0..1FAB6 ; Extended_Pictographic# E13.0 [7] (🪰..🪶) fly..feather +1FAB7..1FABF ; Extended_Pictographic# E0.0 [9] (🪷..🪿) .. +1FAC0..1FAC2 ; Extended_Pictographic# E13.0 [3] (🫀..🫂) anatomical heart..people hugging +1FAC3..1FACF ; Extended_Pictographic# E0.0 [13] (🫃..🫏) .. +1FAD0..1FAD6 ; Extended_Pictographic# E13.0 [7] (🫐..🫖) blueberries..teapot +1FAD7..1FAFF ; Extended_Pictographic# E0.0 [41] (🫗..🫿) .. +1FC00..1FFFD ; Extended_Pictographic# E0.0[1022] (🰀..🿽) .. + +# Total elements: 3537 + +#EOF diff --git a/util/unicode/main.cpp b/util/unicode/main.cpp index cde9f40a..f22876c3 100644 --- a/util/unicode/main.cpp +++ b/util/unicode/main.cpp @@ -291,10 +291,7 @@ static const char *grapheme_break_class_string = " GraphemeBreak_T,\n" " GraphemeBreak_LV,\n" " GraphemeBreak_LVT,\n" - " Graphemebreak_E_Base,\n" - " Graphemebreak_E_Modifier,\n" - " Graphemebreak_Glue_After_Zwj,\n" - " Graphemebreak_E_Base_GAZ,\n" + " GraphemeBreak_Extended_Pictographic,\n" "\n" " NumGraphemeBreakClasses\n" "};\n\n"; @@ -314,10 +311,7 @@ enum GraphemeBreakClass { GraphemeBreak_T, GraphemeBreak_LV, GraphemeBreak_LVT, - Graphemebreak_E_Base, - Graphemebreak_E_Modifier, - Graphemebreak_Glue_After_Zwj, - Graphemebreak_E_Base_GAZ, + GraphemeBreak_Extended_Pictographic, GraphemeBreak_Unassigned }; @@ -344,11 +338,8 @@ static void initGraphemeBreak() { GraphemeBreak_T, "T" }, { GraphemeBreak_LV, "LV" }, { GraphemeBreak_LVT, "LVT" }, - { Graphemebreak_E_Base, "E_Base" }, - { Graphemebreak_E_Modifier, "E_Modifier" }, - { Graphemebreak_Glue_After_Zwj, "Glue_After_Zwj" }, - { Graphemebreak_E_Base_GAZ, "E_Base_GAZ" }, - { GraphemeBreak_Unassigned, 0 } + { GraphemeBreak_Extended_Pictographic, "Extended_Pictographic" }, + { GraphemeBreak_Unassigned, nullptr } }; GraphemeBreakList *d = breaks; while (d->name) { @@ -1915,6 +1906,59 @@ static void readGraphemeBreak() } } +static void readEmojiData() +{ + qDebug("Reading emoji-data.txt"); + + QFile f("data/emoji-data.txt"); + if (!f.open(QFile::ReadOnly)) + qFatal("Couldn't find emoji-data.txt"); + + while (!f.atEnd()) { + QByteArray line; + line.resize(1024); + int len = f.readLine(line.data(), 1024); + line.resize(len-1); + + int comment = line.indexOf('#'); + if (comment >= 0) + line = line.left(comment); + line.replace(" ", ""); + + if (line.isEmpty()) + continue; + + QList l = line.split(';'); + Q_ASSERT(l.size() == 2); + + // NOTE: for the moment we process emoji_data only to extract + // the code points with Extended_Pictographic. This is needed by + // extended grapheme clustering (cf. the GB11 rule in UAX #29). + if (l[1] != "Extended_Pictographic") + continue; + + QByteArray codes = l[0]; + codes.replace("..", "."); + QList cl = codes.split('.'); + + bool ok; + int from = cl[0].toInt(&ok, 16); + Q_ASSERT(ok); + int to = from; + if (cl.size() == 2) { + to = cl[1].toInt(&ok, 16); + Q_ASSERT(ok); + } + + for (int codepoint = from; codepoint <= to; ++codepoint) { + UnicodeData &ud = UnicodeData::valueRef(codepoint); + // Check we're not overwriting the data from GraphemeBreakProperty.txt... + Q_ASSERT(ud.p.graphemeBreakClass == GraphemeBreak_Any); + ud.p.graphemeBreakClass = GraphemeBreak_Extended_Pictographic; + } + } +} + static void readWordBreak() { qDebug("Reading WordBreakProperty.txt"); @@ -3037,6 +3081,7 @@ int main(int, char **) // readBlocks(); readScripts(); readGraphemeBreak(); + readEmojiData(); readWordBreak(); readSentenceBreak(); readLineBreak();