Skip to content

Commit

Permalink
Bump minimum Qt version to 5.12
Browse files Browse the repository at this point in the history
  • Loading branch information
nyalldawson committed Feb 23, 2021
1 parent 9532a5a commit f083876
Show file tree
Hide file tree
Showing 84 changed files with 4 additions and 572 deletions.
2 changes: 1 addition & 1 deletion CMakeLists.txt
Expand Up @@ -432,7 +432,7 @@ if(WITH_CORE)

#############################################################
# search for Qt5
set(QT_MIN_VERSION 5.9.0)
set(QT_MIN_VERSION 5.12.0)

# Use Qt5SerialPort optionally for GPS
set (WITH_QT5SERIALPORT TRUE CACHE BOOL "Determines whether Qt5SerialPort should be tried for GPS positioning")
Expand Down
4 changes: 0 additions & 4 deletions src/3d/chunks/qgschunkboundsentity_p.cpp
Expand Up @@ -26,11 +26,7 @@
LineMeshGeometry::LineMeshGeometry( Qt3DCore::QNode *parent )
: Qt3DRender::QGeometry( parent )
, mPositionAttribute( new Qt3DRender::QAttribute( this ) )
#if QT_VERSION < QT_VERSION_CHECK(5, 10, 0)
, mVertexBuffer( new Qt3DRender::QBuffer( Qt3DRender::QBuffer::VertexBuffer, this ) )
#else
, mVertexBuffer( new Qt3DRender::QBuffer( this ) )
#endif
{
mPositionAttribute->setAttributeType( Qt3DRender::QAttribute::VertexAttribute );
mPositionAttribute->setBuffer( mVertexBuffer );
Expand Down
4 changes: 0 additions & 4 deletions src/3d/materials/qgsgoochmaterialsettings.cpp
Expand Up @@ -170,11 +170,7 @@ int QgsGoochMaterialSettings::dataDefinedByteStride() const

void QgsGoochMaterialSettings::applyDataDefinedToGeometry( Qt3DRender::QGeometry *geometry, int vertexCount, const QByteArray &data ) const
{
#if QT_VERSION < QT_VERSION_CHECK(5, 10, 0)
Qt3DRender::QBuffer *dataBuffer = new Qt3DRender::QBuffer( Qt3DRender::QBuffer::VertexBuffer, geometry );
#else
Qt3DRender::QBuffer *dataBuffer = new Qt3DRender::QBuffer( geometry );
#endif

Qt3DRender::QAttribute *diffuseAttribute = new Qt3DRender::QAttribute( geometry );
diffuseAttribute->setName( QStringLiteral( "dataDefinedDiffuseColor" ) );
Expand Down
4 changes: 0 additions & 4 deletions src/3d/materials/qgsphongmaterialsettings.cpp
Expand Up @@ -176,11 +176,7 @@ int QgsPhongMaterialSettings::dataDefinedByteStride() const {return 9 * sizeof(

void QgsPhongMaterialSettings::applyDataDefinedToGeometry( Qt3DRender::QGeometry *geometry, int vertexCount, const QByteArray &data ) const
{
#if QT_VERSION < QT_VERSION_CHECK(5, 10, 0)
Qt3DRender::QBuffer *dataBuffer = new Qt3DRender::QBuffer( Qt3DRender::QBuffer::VertexBuffer, geometry );
#else
Qt3DRender::QBuffer *dataBuffer = new Qt3DRender::QBuffer( geometry );
#endif

Qt3DRender::QAttribute *diffuseAttribute = new Qt3DRender::QAttribute( geometry );
diffuseAttribute->setName( QStringLiteral( "dataDefinedDiffuseColor" ) );
Expand Down
13 changes: 0 additions & 13 deletions src/3d/materials/qgsphongtexturedmaterialsettings.cpp
Expand Up @@ -19,11 +19,7 @@
#include "qgsapplication.h"
#include "qgsimagecache.h"
#include "qgsimagetexture.h"
#if QT_VERSION < QT_VERSION_CHECK(5, 10, 0)
#include <Qt3DExtras/QDiffuseMapMaterial>
#else
#include <Qt3DExtras/QDiffuseSpecularMaterial>
#endif
#include <Qt3DExtras/QPhongMaterial>
#include <Qt3DRender/QPaintedTextureImage>
#include <Qt3DRender/QTexture>
Expand Down Expand Up @@ -113,14 +109,6 @@ Qt3DRender::QMaterial *QgsPhongTexturedMaterialSettings::toMaterial( QgsMaterial
if ( !textureSourceImage.isNull() )
{
QgsImageTexture *textureImage = new QgsImageTexture( textureSourceImage );
#if QT_VERSION < QT_VERSION_CHECK(5, 10, 0)
Qt3DExtras::QDiffuseMapMaterial *material = new Qt3DExtras::QDiffuseMapMaterial;
material->diffuse()->addTextureImage( textureImage );

material->diffuse()->wrapMode()->setX( Qt3DRender::QTextureWrapMode::Repeat );
material->diffuse()->wrapMode()->setY( Qt3DRender::QTextureWrapMode::Repeat );
material->diffuse()->wrapMode()->setZ( Qt3DRender::QTextureWrapMode::Repeat );
#else
Qt3DExtras::QDiffuseSpecularMaterial *material = new Qt3DExtras::QDiffuseSpecularMaterial;

Qt3DRender::QTexture2D *texture = new Qt3DRender::QTexture2D();
Expand All @@ -137,7 +125,6 @@ Qt3DRender::QMaterial *QgsPhongTexturedMaterialSettings::toMaterial( QgsMaterial
texture->setMinificationFilter( Qt3DRender::QTexture2D::Linear );

material->setDiffuse( QVariant::fromValue( texture ) );
#endif

material->setSpecular( mSpecular );
material->setAmbient( mAmbient );
Expand Down
10 changes: 0 additions & 10 deletions src/3d/mesh/qgsmesh3dgeometry_p.cpp
Expand Up @@ -348,13 +348,8 @@ void QgsMeshDataset3dGeometry::init()
scalarMagnitude.count() != mTriangulaMesh.vertices().count() )
return;

#if QT_VERSION < QT_VERSION_CHECK(5, 10, 0)
Qt3DRender::QBuffer *vertexBuffer = new Qt3DRender::QBuffer( Qt3DRender::QBuffer::VertexBuffer, this );
Qt3DRender::QBuffer *indexBuffer = new Qt3DRender::QBuffer( Qt3DRender::QBuffer::IndexBuffer, this );
#else
Qt3DRender::QBuffer *vertexBuffer = new Qt3DRender::QBuffer( this );
Qt3DRender::QBuffer *indexBuffer = new Qt3DRender::QBuffer( this );
#endif

const int stride = ( 3 /*position*/ +
3 /*normale*/ +
Expand Down Expand Up @@ -450,13 +445,8 @@ QgsMeshTerrain3dGeometry::QgsMeshTerrain3dGeometry(

void QgsMeshTerrain3dGeometry::init()
{
#if QT_VERSION < QT_VERSION_CHECK(5, 10, 0)
Qt3DRender::QBuffer *vertexBuffer = new Qt3DRender::QBuffer( Qt3DRender::QBuffer::VertexBuffer, this );
Qt3DRender::QBuffer *indexBuffer = new Qt3DRender::QBuffer( Qt3DRender::QBuffer::IndexBuffer, this );
#else
Qt3DRender::QBuffer *vertexBuffer = new Qt3DRender::QBuffer( this );
Qt3DRender::QBuffer *indexBuffer = new Qt3DRender::QBuffer( this );
#endif

const int stride = ( 3 /*position*/ +
3 /*normale*/ ) * sizeof( float );
Expand Down
13 changes: 0 additions & 13 deletions src/3d/qgs3dmapscene.cpp
Expand Up @@ -94,10 +94,8 @@ Qgs3DMapScene::Qgs3DMapScene( const Qgs3DMapSettings &map, QgsAbstract3DEngine *
// actually it is more busy than with the default "Always" policy although there are no changes in the scene.
//mRenderer->renderSettings()->setRenderPolicy( Qt3DRender::QRenderSettings::OnDemand );

#if QT_VERSION >= 0x050900
// we want precise picking of terrain (also bounding volume picking does not seem to work - not sure why)
mEngine->renderSettings()->pickingSettings()->setPickMethod( Qt3DRender::QPickingSettings::TrianglePicking );
#endif

QRect viewportRect( QPoint( 0, 0 ), mEngine->size() );

Expand Down Expand Up @@ -389,17 +387,6 @@ void Qgs3DMapScene::updateScene()
if ( entity->isEnabled() )
entity->update( _sceneState( mCameraController ) );
}
#if QT_VERSION < QT_VERSION_CHECK(5, 10, 0)
QgsWindow3DEngine *windowEngine = qobject_cast<QgsWindow3DEngine *>( mEngine );
if ( windowEngine != nullptr )
{
QVector<Qt3DRender::QLayer *> layers;
layers.push_back( windowEngine->shadowRenderingFrameGraph()->castShadowsLayer() );
layers.push_back( windowEngine->shadowRenderingFrameGraph()->forwardRenderLayer() );
removeQLayerComponentsFromHierarchy( this );
addQLayerComponentsToHierarchy( this, layers );
}
#endif
updateSceneState();
}

Expand Down
12 changes: 0 additions & 12 deletions src/3d/qgs3dsceneexporter.cpp
Expand Up @@ -26,11 +26,7 @@
#include <Qt3DExtras/QPlaneGeometry>
#include <Qt3DCore/QTransform>
#include <Qt3DRender/QMaterial>
#if QT_VERSION < QT_VERSION_CHECK(5, 10, 0)
#include <Qt3DExtras/QDiffuseMapMaterial>
#else
#include <Qt3DExtras/QDiffuseSpecularMaterial>
#endif
#include <Qt3DExtras/QTextureMaterial>
#include <Qt3DRender/QTextureImage>
#include <Qt3DRender/QTexture>
Expand Down Expand Up @@ -231,19 +227,11 @@ void Qgs3DSceneExporter::processEntityMaterial( Qt3DCore::QEntity *entity, Qgs3D
QgsPhongMaterialSettings material = Qgs3DUtils::phongMaterialFromQt3DComponent( phongMaterial );
object->setupMaterial( &material );
}
#if QT_VERSION < QT_VERSION_CHECK(5, 10, 0)
Qt3DExtras::QDiffuseMapMaterial *diffuseMapMaterial = findTypedComponent<Qt3DExtras::QDiffuseMapMaterial>( entity );
#else
Qt3DExtras::QDiffuseSpecularMaterial *diffuseMapMaterial = findTypedComponent<Qt3DExtras::QDiffuseSpecularMaterial>( entity );
#endif

if ( diffuseMapMaterial != nullptr )
{
#if QT_VERSION < QT_VERSION_CHECK(5, 10, 0)
QVector<Qt3DRender::QAbstractTextureImage *> textureImages = diffuseMapMaterial->diffuse()->textureImages();
#else
QVector<Qt3DRender::QAbstractTextureImage *> textureImages = diffuseMapMaterial->diffuse().value< Qt3DRender::QTexture2D * >()->textureImages();
#endif
QgsImageTexture *imageTexture = nullptr;
for ( Qt3DRender::QAbstractTextureImage *tex : textureImages )
{
Expand Down
4 changes: 0 additions & 4 deletions src/3d/qgspostprocessingentity.cpp
Expand Up @@ -35,11 +35,7 @@ QgsPostprocessingEntity::QgsPostprocessingEntity( QgsShadowRenderingFrameGraph *

QByteArray vertexArr( ( const char * ) vert.constData(), vert.size() * sizeof( float ) );
Qt3DRender::QBuffer *vertexBuffer = nullptr;
#if QT_VERSION < QT_VERSION_CHECK(5, 10, 0)
vertexBuffer = new Qt3DRender::QBuffer( Qt3DRender::QBuffer::VertexBuffer, this );
#else
vertexBuffer = new Qt3DRender::QBuffer( this );
#endif
vertexBuffer->setData( vertexArr );

positionAttribute->setName( Qt3DRender::QAttribute::defaultPositionAttributeName() );
Expand Down
4 changes: 0 additions & 4 deletions src/3d/qgspreviewquad.cpp
Expand Up @@ -38,11 +38,7 @@ QgsPreviewQuad::QgsPreviewQuad( Qt3DRender::QAbstractTexture *texture,

QByteArray vertexArr( ( const char * ) vert.constData(), vert.size() * sizeof( float ) );
Qt3DRender::QBuffer *vertexBuffer = nullptr;
#if QT_VERSION < QT_VERSION_CHECK(5, 10, 0)
vertexBuffer = new Qt3DRender::QBuffer( Qt3DRender::QBuffer::VertexBuffer, this );
#else
vertexBuffer = new Qt3DRender::QBuffer( this );
#endif
vertexBuffer->setData( vertexArr );

positionAttribute->setName( Qt3DRender::QAttribute::defaultPositionAttributeName() );
Expand Down
2 changes: 0 additions & 2 deletions src/3d/qgsshadowrenderingframegraph.cpp
Expand Up @@ -151,12 +151,10 @@ QgsShadowRenderingFrameGraph::QgsShadowRenderingFrameGraph( QWindow *window, QSi
mCastShadowsLayer = new Qt3DRender::QLayer;
mForwardRenderLayer = new Qt3DRender::QLayer;

#if QT_VERSION >= QT_VERSION_CHECK(5, 10, 0)
mPostprocessPassLayer->setRecursive( true );
mPreviewLayer->setRecursive( true );
mCastShadowsLayer->setRecursive( true );
mForwardRenderLayer->setRecursive( true );
#endif

mRenderSurfaceSelector = new Qt3DRender::QRenderSurfaceSelector;
mRenderSurfaceSelector->setSurface( window );
Expand Down
4 changes: 0 additions & 4 deletions src/3d/qgstessellatedpolygongeometry.cpp
Expand Up @@ -32,11 +32,7 @@ QgsTessellatedPolygonGeometry::QgsTessellatedPolygonGeometry( bool _withNormals,
mAddBackFaces( _addBackFaces ),
mAddTextureCoords( _addTextureCoords )
{
#if QT_VERSION < QT_VERSION_CHECK(5, 10, 0)
mVertexBuffer = new Qt3DRender::QBuffer( Qt3DRender::QBuffer::VertexBuffer, this );
#else
mVertexBuffer = new Qt3DRender::QBuffer( this );
#endif

QgsTessellator tmpTess( 0, 0, mWithNormals, false, false, false, mAddTextureCoords );
const int stride = tmpTess.stride();
Expand Down
4 changes: 0 additions & 4 deletions src/3d/symbols/qgsbillboardgeometry.cpp
Expand Up @@ -20,11 +20,7 @@
QgsBillboardGeometry::QgsBillboardGeometry( Qt3DCore::QNode *parent )
: Qt3DRender::QGeometry( parent )
, mPositionAttribute( new Qt3DRender::QAttribute( this ) )
#if QT_VERSION < QT_VERSION_CHECK(5, 10, 0)
, mVertexBuffer( new Qt3DRender::QBuffer( Qt3DRender::QBuffer::VertexBuffer, this ) )
#else
, mVertexBuffer( new Qt3DRender::QBuffer( this ) )
#endif
{

mPositionAttribute->setAttributeType( Qt3DRender::QAttribute::VertexAttribute );
Expand Down
8 changes: 0 additions & 8 deletions src/3d/symbols/qgslinevertexdata_p.cpp
Expand Up @@ -70,18 +70,10 @@ QByteArray QgsLineVertexData::createIndexBuffer()

Qt3DRender::QGeometry *QgsLineVertexData::createGeometry( Qt3DCore::QNode *parent )
{
#if QT_VERSION < QT_VERSION_CHECK(5, 10, 0)
Qt3DRender::QBuffer *vertexBuffer = new Qt3DRender::QBuffer( Qt3DRender::QBuffer::VertexBuffer, parent );
#else
Qt3DRender::QBuffer *vertexBuffer = new Qt3DRender::QBuffer( parent );
#endif
vertexBuffer->setData( createVertexBuffer() );

#if QT_VERSION < QT_VERSION_CHECK(5, 10, 0)
Qt3DRender::QBuffer *indexBuffer = new Qt3DRender::QBuffer( Qt3DRender::QBuffer::IndexBuffer, parent );
#else
Qt3DRender::QBuffer *indexBuffer = new Qt3DRender::QBuffer( parent );
#endif
indexBuffer->setData( createIndexBuffer() );

QgsDebugMsgLevel( QString( "vertex buffer %1 MB index buffer %2 MB " ).arg( vertexBuffer->data().count() / 1024. / 1024. ).arg( indexBuffer->data().count() / 1024. / 1024. ), 2 );
Expand Down
8 changes: 0 additions & 8 deletions src/3d/symbols/qgspoint3dsymbol_p.cpp
Expand Up @@ -34,9 +34,7 @@

#include <Qt3DRender/QMesh>

#if QT_VERSION >= 0x050900
#include <Qt3DExtras/QExtrudedTextGeometry>
#endif

#include <QUrl>
#include <QVector3D>
Expand Down Expand Up @@ -222,11 +220,7 @@ Qt3DRender::QGeometryRenderer *QgsInstancedPoint3DSymbolHandler::renderer( const
ba.resize( byteCount );
memcpy( ba.data(), positions.constData(), byteCount );

#if QT_VERSION < QT_VERSION_CHECK(5, 10, 0)
Qt3DRender::QBuffer *instanceBuffer = new Qt3DRender::QBuffer( Qt3DRender::QBuffer::VertexBuffer );
#else
Qt3DRender::QBuffer *instanceBuffer = new Qt3DRender::QBuffer();
#endif
instanceBuffer->setData( ba );

Qt3DRender::QAttribute *instanceDataAttribute = new Qt3DRender::QAttribute;
Expand Down Expand Up @@ -318,7 +312,6 @@ Qt3DRender::QGeometry *QgsInstancedPoint3DSymbolHandler::symbolGeometry( QgsPoin
return g;
}

#if QT_VERSION >= 0x050900
case QgsPoint3DSymbol::ExtrudedText:
{
float depth = shapeProperties[QStringLiteral( "depth" )].toFloat();
Expand All @@ -328,7 +321,6 @@ Qt3DRender::QGeometry *QgsInstancedPoint3DSymbolHandler::symbolGeometry( QgsPoin
g->setText( text );
return g;
}
#endif

default:
Q_ASSERT( false );
Expand Down
4 changes: 0 additions & 4 deletions src/3d/symbols/qgspointcloud3dsymbol_p.cpp
Expand Up @@ -39,11 +39,7 @@ QgsPointCloud3DGeometry::QgsPointCloud3DGeometry( Qt3DCore::QNode *parent, unsig
, mPositionAttribute( new Qt3DRender::QAttribute( this ) )
, mParameterAttribute( new Qt3DRender::QAttribute( this ) )
, mColorAttribute( new Qt3DRender::QAttribute( this ) )
#if QT_VERSION < QT_VERSION_CHECK(5, 10, 0)
, mVertexBuffer( new Qt3DRender::QBuffer( Qt3DRender::QBuffer::VertexBuffer, this ) )
#else
, mVertexBuffer( new Qt3DRender::QBuffer( this ) )
#endif
, mByteStride( byteStride )
{

Expand Down
6 changes: 0 additions & 6 deletions src/3d/terrain/qgsdemterraintilegeometry_p.cpp
Expand Up @@ -356,14 +356,8 @@ void DemTerrainTileGeometry::init()
mNormalAttribute = new QAttribute( this );
mTexCoordAttribute = new QAttribute( this );
mIndexAttribute = new QAttribute( this );
#if QT_VERSION < QT_VERSION_CHECK(5, 10, 0)
mVertexBuffer = new Qt3DRender::QBuffer( Qt3DRender::QBuffer::VertexBuffer, this );
mIndexBuffer = new Qt3DRender::QBuffer( Qt3DRender::QBuffer::IndexBuffer, this );
#else
mVertexBuffer = new Qt3DRender::QBuffer( this );
mIndexBuffer = new Qt3DRender::QBuffer( this );
#endif


int nVertsX = mResolution + 2;
int nVertsZ = mResolution + 2;
Expand Down
10 changes: 0 additions & 10 deletions src/3d/terrain/qgsterraintileloader_p.cpp
Expand Up @@ -26,11 +26,7 @@
#include <Qt3DRender/QTexture>

#include <Qt3DExtras/QTextureMaterial>
#if QT_VERSION < QT_VERSION_CHECK(5, 10, 0)
#include <Qt3DExtras/QDiffuseMapMaterial>
#else
#include <Qt3DExtras/QDiffuseSpecularMaterial>
#endif
#include <Qt3DExtras/QPhongMaterial>

#include "quantizedmeshterraingenerator.h"
Expand Down Expand Up @@ -73,15 +69,9 @@ void QgsTerrainTileLoader::createTextureComponent( QgsTerrainTileEntity *entity,
{
if ( isShadingEnabled )
{
#if QT_VERSION < QT_VERSION_CHECK(5, 10, 0)
Qt3DExtras::QDiffuseMapMaterial *diffuseMapMaterial;
diffuseMapMaterial = new Qt3DExtras::QDiffuseMapMaterial;
diffuseMapMaterial->setDiffuse( texture );
#else
Qt3DExtras::QDiffuseSpecularMaterial *diffuseMapMaterial = new Qt3DExtras::QDiffuseSpecularMaterial;
diffuseMapMaterial->setDiffuse( QVariant::fromValue( texture ) );
material = diffuseMapMaterial;
#endif
diffuseMapMaterial->setAmbient( shadingMaterial.ambient() );
diffuseMapMaterial->setSpecular( shadingMaterial.specular() );
diffuseMapMaterial->setShininess( shadingMaterial.shininess() );
Expand Down
4 changes: 0 additions & 4 deletions src/app/layout/qgslayoutdesignerdialog.cpp
Expand Up @@ -864,11 +864,7 @@ QgsLayoutDesignerDialog::QgsLayoutDesignerDialog( QWidget *parent, Qt::WindowFla
mMenuProvider = new QgsLayoutAppMenuProvider( this );
mView->setMenuProvider( mMenuProvider );

#if QT_VERSION < QT_VERSION_CHECK(5, 11, 0)
int minDockWidth( fontMetrics().width( QStringLiteral( "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" ) ) );
#else
int minDockWidth = fontMetrics().horizontalAdvance( 'X' ) * 38;
#endif

setTabPosition( Qt::AllDockWidgetAreas, QTabWidget::North );
mGeneralDock = new QgsDockWidget( tr( "Layout" ), this );
Expand Down
4 changes: 1 addition & 3 deletions src/app/main.cpp
Expand Up @@ -886,16 +886,14 @@ int main( int argc, char *argv[] )
QCoreApplication::setOrganizationDomain( QgsApplication::QGIS_ORGANIZATION_DOMAIN );
QCoreApplication::setApplicationName( QgsApplication::QGIS_APPLICATION_NAME );
QCoreApplication::setAttribute( Qt::AA_DontShowIconsInMenus, false );
#if QT_VERSION >= QT_VERSION_CHECK(5, 10, 0)
QCoreApplication::setAttribute( Qt::AA_DisableWindowContextHelpButton, true );
#endif

// Set up an OpenGL Context to be shared between threads beforehand
// for plugins that depend on Qt WebEngine module.
// As suggested by Qt documentation at:
// - https://doc.qt.io/qt-5/qtwebengine.html
// - https://code.qt.io/cgit/qt/qtwebengine.git/plain/src/webenginewidgets/api/qtwebenginewidgetsglobal.cpp
#if defined(QT_OS_WIN) && !defined(QT_NO_OPENGL) && (QT_VERSION >= QT_VERSION_CHECK(5, 4, 0) )
#if defined(QT_OS_WIN) && !defined(QT_NO_OPENGL)
QCoreApplication::setAttribute( Qt::AA_ShareOpenGLContexts, true );
#endif

Expand Down
6 changes: 0 additions & 6 deletions src/app/qgisapp.cpp
Expand Up @@ -2571,11 +2571,7 @@ int QgisApp::chooseReasonableDefaultIconSize() const
}
else
{
#if QT_VERSION < QT_VERSION_CHECK(5, 11, 0)
double size = fontMetrics().width( QStringLiteral( "XXX" ) );
#else
double size = fontMetrics().horizontalAdvance( 'X' ) * 3;
#endif
if ( size < 24 )
return 16;
else if ( size < 32 )
Expand Down Expand Up @@ -3094,13 +3090,11 @@ void QgisApp::createActionGroups()

void QgisApp::setAppStyleSheet( const QString &stylesheet )
{
#if QT_VERSION >= QT_VERSION_CHECK(5, 11, 0)
// avoid crash on stylesheet change -- see https://bugreports.qt.io/browse/QTBUG-69204
static bool sOnce = false;
if ( sOnce )
return;
sOnce = true;
#endif

setStyleSheet( stylesheet );

Expand Down

0 comments on commit f083876

Please sign in to comment.