From 7420fb409a36780d966c4e7e2b79b098e339fb4c Mon Sep 17 00:00:00 2001 From: Yoann Lopes Date: Wed, 11 Mar 2015 16:29:53 +0100 Subject: [PATCH 01/19] Use proper d_ptr for QPlaylistFileParser. Task-number: QTBUG-42473 Change-Id: Iff8f14ed6ab99c8e7844b9e43009b82b442f5238 Reviewed-by: Christian Stromme --- .../playback/playlistfileparser.cpp | 33 +++++++++---------- .../playback/playlistfileparser_p.h | 3 -- 2 files changed, 15 insertions(+), 21 deletions(-) diff --git a/src/multimedia/playback/playlistfileparser.cpp b/src/multimedia/playback/playlistfileparser.cpp index a3aba1ca..b3fc5756 100644 --- a/src/multimedia/playback/playlistfileparser.cpp +++ b/src/multimedia/playback/playlistfileparser.cpp @@ -34,7 +34,7 @@ #include "playlistfileparser_p.h" #include #include -#include "qmediaobject_p.h" +#include #include "qmediametadata.h" QT_BEGIN_NAMESPACE @@ -238,10 +238,9 @@ Version=2 ///////////////////////////////////////////////////////////////////////////////////////////////// -class QPlaylistFileParserPrivate : public QObject +class QPlaylistFileParserPrivate : public QObjectPrivate { - Q_OBJECT - Q_DECLARE_NON_CONST_PUBLIC(QPlaylistFileParser) + Q_DECLARE_PUBLIC(QPlaylistFileParser) public: QPlaylistFileParserPrivate() : m_source(0) @@ -268,8 +267,6 @@ public: ParserBase *m_currentParser; QNetworkAccessManager m_mgr; - QPlaylistFileParser *q_ptr; - private: void processLine(int startIndex, int length); }; @@ -290,25 +287,25 @@ void QPlaylistFileParserPrivate::processLine(int startIndex, int length) switch (m_type) { case QPlaylistFileParser::UNKNOWN: - emit q->error(QPlaylistFileParser::FormatError, QString(tr("%1 playlist type is unknown")).arg(m_root.toString())); + emit q->error(QPlaylistFileParser::FormatError, QString(QObject::tr("%1 playlist type is unknown")).arg(m_root.toString())); q->stop(); return; case QPlaylistFileParser::M3U: - m_currentParser = new M3UParser(this); + m_currentParser = new M3UParser(q); break; case QPlaylistFileParser::M3U8: - m_currentParser = new M3UParser(this); + m_currentParser = new M3UParser(q); m_utf8 = true; break; case QPlaylistFileParser::PLS: - m_currentParser = new PLSParser(this); + m_currentParser = new PLSParser(q); break; } Q_ASSERT(m_currentParser); - connect(m_currentParser, SIGNAL(newItem(QVariant)), q, SIGNAL(newItem(QVariant))); - connect(m_currentParser, SIGNAL(finished()), q, SLOT(_q_handleParserFinished())); - connect(m_currentParser, SIGNAL(error(QPlaylistFileParser::ParserError,QString)), - q, SLOT(_q_handleParserError(QPlaylistFileParser::ParserError,QString))); + QObject::connect(m_currentParser, SIGNAL(newItem(QVariant)), q, SIGNAL(newItem(QVariant))); + QObject::connect(m_currentParser, SIGNAL(finished()), q, SLOT(_q_handleParserFinished())); + QObject::connect(m_currentParser, SIGNAL(error(QPlaylistFileParser::ParserError,QString)), + q, SLOT(_q_handleParserError(QPlaylistFileParser::ParserError,QString))); } QString line; @@ -350,7 +347,7 @@ void QPlaylistFileParserPrivate::_q_handleData() if (m_buffer.length() - processedBytes >= LINE_LIMIT) { qWarning() << "error parsing playlist["<< m_root << "] with line content >= 4096 bytes."; - emit q->error(QPlaylistFileParser::FormatError, tr("invalid line in playlist file")); + emit q->error(QPlaylistFileParser::FormatError, QObject::tr("invalid line in playlist file")); q->stop(); return; } @@ -398,7 +395,7 @@ void QPlaylistFileParserPrivate::_q_handleParserFinished() Q_Q(QPlaylistFileParser); bool isParserValid = (m_currentParser != 0); if (!isParserValid) - emit q->error(QPlaylistFileParser::FormatNotSupportedError, tr("Empty file provided")); + emit q->error(QPlaylistFileParser::FormatNotSupportedError, QObject::tr("Empty file provided")); q->stop(); @@ -408,9 +405,9 @@ void QPlaylistFileParserPrivate::_q_handleParserFinished() QPlaylistFileParser::QPlaylistFileParser(QObject *parent) - :QObject(parent), d_ptr(new QPlaylistFileParserPrivate) + : QObject(*new QPlaylistFileParserPrivate, parent) { - d_func()->q_ptr = this; + } QPlaylistFileParser::FileType QPlaylistFileParser::findPlaylistType(const QString& uri, const QString& mime, const void *data, quint32 size) diff --git a/src/multimedia/playback/playlistfileparser_p.h b/src/multimedia/playback/playlistfileparser_p.h index 57c01ab9..3b4cee3b 100644 --- a/src/multimedia/playback/playlistfileparser_p.h +++ b/src/multimedia/playback/playlistfileparser_p.h @@ -84,9 +84,6 @@ Q_SIGNALS: void finished(); void error(QPlaylistFileParser::ParserError err, const QString& errorMsg); -protected: - QPlaylistFileParserPrivate *d_ptr; - private: Q_DISABLE_COPY(QPlaylistFileParser) Q_DECLARE_PRIVATE(QPlaylistFileParser) From 2d8fcc15604a62037570d8c4729d74d200433f01 Mon Sep 17 00:00:00 2001 From: Yoann Lopes Date: Thu, 12 Mar 2015 14:52:52 +0100 Subject: [PATCH 02/19] WMF: fix RGB24 format matching. MFVideoFormat_RGB24 has a BGR layout and should therefore be matched to QVideoFrame::Format_BGR24, not Format_RGB24. Task-number: QTBUG-42323 Change-Id: I1749b575b1738168e3d3c0d055dee10f6d870c0c Reviewed-by: Christian Stromme --- src/plugins/wmf/player/mfvideorenderercontrol.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/plugins/wmf/player/mfvideorenderercontrol.cpp b/src/plugins/wmf/player/mfvideorenderercontrol.cpp index b06bfbe1..b22db19b 100644 --- a/src/plugins/wmf/player/mfvideorenderercontrol.cpp +++ b/src/plugins/wmf/player/mfvideorenderercontrol.cpp @@ -813,7 +813,7 @@ namespace case QVideoFrame::Format_RGB32: mediaType->SetGUID(MF_MT_SUBTYPE, MFVideoFormat_RGB32); break; - case QVideoFrame::Format_RGB24: + case QVideoFrame::Format_BGR24: // MFVideoFormat_RGB24 has a BGR layout mediaType->SetGUID(MF_MT_SUBTYPE, MFVideoFormat_RGB24); break; case QVideoFrame::Format_RGB565: @@ -1082,6 +1082,7 @@ namespace return format.frameWidth() * 4; // 24 bpp packed formats. case QVideoFrame::Format_RGB24: + case QVideoFrame::Format_BGR24: return PAD_TO_DWORD(format.frameWidth() * 3); // 16 bpp packed formats. case QVideoFrame::Format_RGB565: From 7e9520e8d39f584b4405d7670fe6aa734e7b4fdb Mon Sep 17 00:00:00 2001 From: Yoann Lopes Date: Mon, 16 Mar 2015 15:43:30 +0100 Subject: [PATCH 03/19] Fix order of QSGVideoNode_RGB's supported formats. RGB565 should not be the first pick. As a matter of fact it should be the last pick. Change-Id: I4b96fb02093e70d9c642efd79c48358ec7a664b0 Reviewed-by: Christian Stromme --- src/qtmultimediaquicktools/qsgvideonode_rgb.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qtmultimediaquicktools/qsgvideonode_rgb.cpp b/src/qtmultimediaquicktools/qsgvideonode_rgb.cpp index 72cbc961..56257dab 100644 --- a/src/qtmultimediaquicktools/qsgvideonode_rgb.cpp +++ b/src/qtmultimediaquicktools/qsgvideonode_rgb.cpp @@ -46,11 +46,11 @@ QList QSGVideoNodeFactory_RGB::supportedPixelFormats( QList pixelFormats; if (handleType == QAbstractVideoBuffer::NoHandle) { - pixelFormats.append(QVideoFrame::Format_RGB565); pixelFormats.append(QVideoFrame::Format_RGB32); pixelFormats.append(QVideoFrame::Format_ARGB32); pixelFormats.append(QVideoFrame::Format_BGR32); pixelFormats.append(QVideoFrame::Format_BGRA32); + pixelFormats.append(QVideoFrame::Format_RGB565); } return pixelFormats; From 4f7e5bf169868dfd0428a7f966e51dcac5a50178 Mon Sep 17 00:00:00 2001 From: Yoann Lopes Date: Thu, 12 Mar 2015 15:56:01 +0100 Subject: [PATCH 04/19] WMF: report the surface's supported formats in the correct order. QAbstractVideoSurface::supportedFormats() returns the formats in descending order of preference while IMFMediaTypeHandler expects the list to be in ascending order. Change-Id: I0ecb5a3b228c0cad78c1a84091e3c3cf272f7ebc Reviewed-by: Christian Stromme --- src/plugins/wmf/player/mfvideorenderercontrol.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/plugins/wmf/player/mfvideorenderercontrol.cpp b/src/plugins/wmf/player/mfvideorenderercontrol.cpp index b22db19b..1172fe56 100644 --- a/src/plugins/wmf/player/mfvideorenderercontrol.cpp +++ b/src/plugins/wmf/player/mfvideorenderercontrol.cpp @@ -842,8 +842,11 @@ namespace mediaType->Release(); continue; } - m_pixelFormats.push_back(format); - m_mediaTypes.push_back(mediaType); + // QAbstractVideoSurface::supportedPixelFormats() returns formats in descending + // order of preference, while IMFMediaTypeHandler is supposed to return supported + // formats in ascending order of preference. We need to reverse the list. + m_pixelFormats.prepend(format); + m_mediaTypes.prepend(mediaType); } } From d046bc67c74fef252cb213b8b9d5a1ab55f862e2 Mon Sep 17 00:00:00 2001 From: Yoann Lopes Date: Wed, 18 Mar 2015 16:08:56 +0100 Subject: [PATCH 05/19] GStreamer: don't use ximagesink in QGstreamerVideoWidget. When xvimagesink is not available, we were falling back to ximagesink. That element doesn't provide some important features: it doesn't scale frames to the window size and doesn't support brightness, contrast, hue and saturation adjustments. That kind of makes it useless, at least on its own. We would need to use at least a 'videoscale' element together with it to have it working properly. We're better off letting QVideoWidget fall back to QVideoRendererControl when xvimagesink is not available. Change-Id: Ic8c62fbefa3227430e3bae24630c8b3944aabb47 Reviewed-by: Christian Stromme --- src/gsttools/qgstreamervideowidget.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/gsttools/qgstreamervideowidget.cpp b/src/gsttools/qgstreamervideowidget.cpp index 49601874..b26369a9 100644 --- a/src/gsttools/qgstreamervideowidget.cpp +++ b/src/gsttools/qgstreamervideowidget.cpp @@ -95,9 +95,6 @@ QGstreamerVideoWidgetControl::QGstreamerVideoWidgetControl(QObject *parent) { m_videoSink = gst_element_factory_make ("xvimagesink", NULL); - if (!m_videoSink) - m_videoSink = gst_element_factory_make ("ximagesink", NULL); - if (m_videoSink) { // Check if the xv sink is usable if (gst_element_set_state(m_videoSink, GST_STATE_READY) != GST_STATE_CHANGE_SUCCESS) { From 92ea7cb89b4a5c41ef66998817e81c2048046649 Mon Sep 17 00:00:00 2001 From: Yoann Lopes Date: Wed, 18 Mar 2015 18:12:30 +0100 Subject: [PATCH 06/19] Add missing documentation for AudioSample::source. Change-Id: Iabfb7749bf42413fc19b53b907027caad931092c Reviewed-by: Christian Stromme --- src/imports/audioengine/qdeclarative_audiosample_p.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/imports/audioengine/qdeclarative_audiosample_p.cpp b/src/imports/audioengine/qdeclarative_audiosample_p.cpp index 69ec8a2b..afea7de3 100644 --- a/src/imports/audioengine/qdeclarative_audiosample_p.cpp +++ b/src/imports/audioengine/qdeclarative_audiosample_p.cpp @@ -106,6 +106,11 @@ void QDeclarativeAudioSample::componentComplete() m_complete = true; } +/*! + \qmlproperty url QtAudioEngine::AudioSample::source + + This property holds the source URL of the audio sample. +*/ QUrl QDeclarativeAudioSample::source() const { return m_url; From 90fe52d086543fd26a700d85201e425fa49a3ec4 Mon Sep 17 00:00:00 2001 From: Andy Shaw Date: Wed, 25 Mar 2015 23:33:13 +0100 Subject: [PATCH 07/19] WMF: don't resume playback after doing a seek while paused. Task-number: QTBUG-32746 Change-Id: I5a9ee96324e0ddc65311f47dc887bcb91b036fd2 Reviewed-by: Andy Shaw Reviewed-by: Yoann Lopes --- src/plugins/wmf/player/mfplayersession.cpp | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/plugins/wmf/player/mfplayersession.cpp b/src/plugins/wmf/player/mfplayersession.cpp index 789d78b6..377f1e4a 100644 --- a/src/plugins/wmf/player/mfplayersession.cpp +++ b/src/plugins/wmf/player/mfplayersession.cpp @@ -1721,10 +1721,17 @@ void MFPlayerSession::updatePendingCommands(Command command) if (m_state.command != command || m_pendingState == NoPending) return; - // The current pending command has completed. + // Seek while paused completed if (m_pendingState == SeekPending && m_state.prevCmd == CmdPause) { m_pendingState = NoPending; - m_state.setCommand(CmdPause); + // A seek operation actually restarts playback. If scrubbing is possible, playback rate + // is set to 0.0 at this point and we just need to reset the current state to Pause. + // If scrubbing is not possible, the playback rate was not changed and we explicitly need + // to re-pause playback. + if (!canScrub()) + pause(); + else + m_state.setCommand(CmdPause); } m_pendingState = NoPending; From 197373b2d10daa6c5904ed9295a2d6c6ed2c8b1d Mon Sep 17 00:00:00 2001 From: Sergio Martins Date: Wed, 1 Apr 2015 17:09:16 +0100 Subject: [PATCH 08/19] Fix BlackBerry -qtnamespace build Change-Id: I717dad59a466cb7a7480bc772d8f6308ca669d54 Task-number: QTBUG-43569 Reviewed-by: Rafael Roquetto --- src/plugins/qnx/mediaplayer/mmrenderermetadatareadercontrol.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/plugins/qnx/mediaplayer/mmrenderermetadatareadercontrol.cpp b/src/plugins/qnx/mediaplayer/mmrenderermetadatareadercontrol.cpp index c549f342..7a229449 100644 --- a/src/plugins/qnx/mediaplayer/mmrenderermetadatareadercontrol.cpp +++ b/src/plugins/qnx/mediaplayer/mmrenderermetadatareadercontrol.cpp @@ -160,3 +160,5 @@ void MmRendererMetaDataReaderControl::setMetaData(const MmRendererMetaData &data if (metaDataAvailable != oldMetaDataAvailable) emit metaDataAvailableChanged(metaDataAvailable); } + +QT_END_NAMESPACE From 0cd222c9b4d9658feddf427fa0a58cfe5cdba504 Mon Sep 17 00:00:00 2001 From: Yoann Lopes Date: Wed, 18 Mar 2015 18:08:32 +0100 Subject: [PATCH 09/19] Fix audioengine example. - Add missing audio files - Fix 'Unable to assign double to QVector3D' warning - Don't show decimal part of the volume Task-number: QTBUG-41841 Task-number: QTBUG-44304 Change-Id: Ie24284242bbac0d10bd85841932c506d7634a514 Reviewed-by: Venugopal Shivashankar Reviewed-by: Christian Stromme --- .../audioengine/qml/audioengine.qml | 6 +-- .../audioengine/qml/content/MyAudioEngine.qml | 39 ++++++------------ .../audioengine/qml/content/engine-loop.wav | Bin 0 -> 104186 bytes .../audioengine/qml/content/horn.wav | Bin 0 -> 36060 bytes .../audioengine/qml/content/whistle.wav | Bin 0 -> 64132 bytes 5 files changed, 16 insertions(+), 29 deletions(-) create mode 100644 examples/multimedia/audioengine/qml/content/engine-loop.wav create mode 100644 examples/multimedia/audioengine/qml/content/horn.wav create mode 100644 examples/multimedia/audioengine/qml/content/whistle.wav diff --git a/examples/multimedia/audioengine/qml/audioengine.qml b/examples/multimedia/audioengine/qml/audioengine.qml index 3907f906..fb339424 100644 --- a/examples/multimedia/audioengine/qml/audioengine.qml +++ b/examples/multimedia/audioengine/qml/audioengine.qml @@ -65,7 +65,7 @@ Rectangle { loops: Animation.Infinite running: true NumberAnimation { - duration: 8000 + duration: 12000 from: 0 to: 1 } @@ -113,7 +113,7 @@ Rectangle { } velocity: { var speed = root.twoPi * root.radius / 4; - return shipSound.direction * speed; + return shipSound.direction.times(speed); } Component.onCompleted: shipSound.play() @@ -137,7 +137,7 @@ Rectangle { color: "lightgreen" } Text { - text: " volume:" + volumeBar.volumeCtrl.volume * 100 +"%"; + text: " volume:" + Math.round(volumeBar.volumeCtrl.volume * 100) +"%"; font.pointSize: 16; font.italic: true; color: "black" diff --git a/examples/multimedia/audioengine/qml/content/MyAudioEngine.qml b/examples/multimedia/audioengine/qml/content/MyAudioEngine.qml index dc6666c4..1cf92eb9 100644 --- a/examples/multimedia/audioengine/qml/content/MyAudioEngine.qml +++ b/examples/multimedia/audioengine/qml/content/MyAudioEngine.qml @@ -68,22 +68,18 @@ AudioEngine { } AudioSample { - name:"fire" - source: "fire-03-loop.wav" + name:"engine" + source: "engine-loop.wav" preloaded:true } AudioSample { - name:"explosion" - source: "explosion-02.wav" + name:"horn" + source: "horn.wav" } AudioSample { - name:"lava" - source: "lava-bubbling-01.wav" - } - AudioSample { - name:"water" - source: "running-water-01.wav" + name:"whistle" + source: "whistle.wav" } Sound { name:"shipengine" @@ -91,7 +87,7 @@ AudioEngine { category:"sfx" PlayVariation { looping:true - sample:"fire" + sample:"engine" maxGain:0.9 minGain:0.8 } @@ -101,23 +97,14 @@ AudioEngine { name:"effects" category:"sfx" PlayVariation { - sample:"lava" - maxGain:1.5 - minGain:1.2 - maxPitch:2.0 - minPitch:0.5 + sample:"horn" + maxGain:2.0 + minGain:0.9 } PlayVariation { - sample:"explosion" - maxGain:1.1 - minGain:0.7 - maxPitch:1.5 - minPitch:0.5 - } - PlayVariation { - sample:"water" - maxGain:1.5 - minGain:1.2 + sample:"whistle" + maxGain:1.0 + minGain:0.8 } } diff --git a/examples/multimedia/audioengine/qml/content/engine-loop.wav b/examples/multimedia/audioengine/qml/content/engine-loop.wav new file mode 100644 index 0000000000000000000000000000000000000000..923813694a1ad23c1bd710c186131be92f44c74c GIT binary patch literal 104186 zcmWJsWmr>f7~aN!(cK**Mt662Nht{CXLpO;t*96vVgV{P-Q77x=U~OUJ3g-S^PE5L zd!6gKpSx0HA|vTVKtN_lM#SF3r%Y7=0040Fp{4@>tKR_t5I_~Md&j9AqnqEPf-VT- znBBBkI*PJL+eeWn$I%~CQt(n69oUwo3rkMRXQveho%(ST;fQl^oiPYpZTi&wpQYgW z7pt+WnuvwbiSYyT9D$M0SEN zTm)we%Y&IqyT=G-HZvPI3Y>O&F-@0g!b=oSiAn_O941r1s}?zlpNVY%_odWi3m}ow zy`TW#3MfZLRfZ2v1gQc}0NQ|;!Pn)sDkdw9DX*z|X&u*?P+n6gP^eIvk>8NjmH8m` zPR>?|DX*`HlDz`H01``Tr9faL;J7$}C*&sbin#**53U;TrbtVG7E}qpu#Pf&8DR8Tvfh^ zKO)Wrv`ZF&%b-V~Jm4tk2XH|gA)$-Ff?$D)V0Hccxa+mnk3*RhId{(2oc3~Pcl#DCcM57UJ;#(mnjOi(72 zZd4GoX>N>Sb|t%?Wy1W(xW=~Oy8&*4Yh|#I9Hj|$4INp%Amc&fM<%xB`6jQ-!l9a0 zJEOUHz{NWgWRC{cEG+|UUVAHEJ z@N$4S>^a^9cYv1+ISg72<_{^31&k|B?wjtKQkfo@Enmu7DOxsMRz{_61mOLMO5_2` z5Z!=VDU<+}rCnqfl;Tv+s%_QiQ%lvlt~YB?Z76TVFsrjXXtm!a-`dmK%(~U4!5R+T zXDzhJfFYn_a}O&Z^qobr#dkA~#Tn=hGlibGZXH~WP{ z>BEa79>b?bd5B%JWAmiNv{gCWvyI#h3qlkTPFG_}v;FvEf_{-P@PqV8rPrDQJvYO4 z!zhzr^E=jwcG?a)b`^HlojpSJ2JSbKzgYyCaMvGoly~Jz+HwhSBus zE75K-yAvLyhG)8D=WmV4YtL)W*|L4d_S~EUTi<2|X6#6(q}OL2*>W$nF`*;!X2gMT zcvxLfjxWbc)!p00!P&uT)a1P0IrWb!)(R0)V3E9#%iY6eQaZ68(V?rBb8_>&aL+Ns z5Vj+!m)D`(T-Z2W-&B)d(^NB4GxR5`8d;5~()xbj>*uclpYy(Gd_ue@zEA&f=hL~e zoHAhfRMnYpbCv!TdF7xlL*<0>ALY4U6@I+=srVgUrT)|4PjQ`Pt6Ceasi0}FHM~8g z+hjy$!V7Lbr@b7#lz~Lxo)RY+0RC=43h=AUXJs=rh{iT;hAv;f)@aD$mH9_YKkIB; zGg!Jqkb9pe+V`hF!{0Xm5-=7}8{`uB&)3kuB>)n1F=RS|8>1cjHfB#uNc?2tr4+|h zg|q`%LED1!YVxG>VEHCH!Mo*l(zg%fCgtnyJAJ5rzve#s1CfWU{*&9Yp7$)PKO=uj zMB?d)@(@IzlkXmHw%2#}5Es0|Bb!oVC;e4jxTd9ArQ#)-RiFsaD8dVi_`xg~W0~eh zzetHBwh||CYuFQnbbJ|MnxapTLrd11)=HL7t(;o^G_^XlG^LNg!868_MxPIFOzfQC z3?YU)1`KTl}5x$5fb(%O)^&(-8=*za3kN4{?P z`J;NJo?rX8Zhzfk-S)cLdiACw4Mz2`^?w?Z8m~3x)QanQO&bkWjr*E}Ex{dLU7+so zUAXout$j_64O<&>>qYfnTC6(Pdhvr@BjoWblQmOP^V!QsRvTB;kn)%WVhmG_Zzhz8 zJV7e5pH*aaZH-=-4MF4V-CY{pt-SXII7V1T><*WSDvQa8+ZWv%Wf%#Gc2Dw7y_9%4 zel(E~dno>VQc*%dTxRUWxPOtS!cC%eV^t&R5jSF*!zsZHfpfl|?!8Vs9h_iYuv@kw zs1Ee7<*KCuGzuDHg|_@*e#j)vG}v^Tk%FYtlc#R16`{tGUzA;!?U2?7 zlEfa87eZ;iwy>IK#V)2{h!@F^sbe%Y469`d<1LsvV`5e27@S5sXp77~!XhV;dtI#^j%r1ln6#GDDMjm#x4v<_Ga^ zvc~A@j5KBovy7)NelFS~Lh*5&8a`I|Q`{^r1|EPsRm?4^^44O41?|@Y{(8h>o}d9Cc$W<`oLP zlDx#6flvQk@S3ZcjzyfC=p5g?)Zw(zyQAsjvIwmS!048->`~yvrD>m;-_twiUoOMe zk}#bc5*z^2jNeaLqMT&rZ~^QU28@Yd1#^G!t0W{)ItT(XlWLagm#UYYl6$CVpc0_^ zQKduGS2JH{R3By#W29?z+sMf{$|TgJ!?@dI&Gd(9u6d7Tw#8M;bSpQT6E%eS=-HJ!H?a8-&F;WWtWyd$~Bfn!1L%f?a)FQeE&ax12j1ZrHtsv2FjsOzr-I zdE4!_<-_Lf-a9xrMZuPB!t9*w{GmH&{s~UIqz) z$_pVY@+_qh)j<`wVu+H5f}3K3B30qCinMx+rj6z`t-U(Obn&_vZ8hy2&5Ih2+WWN* ztDn(q)Co5{Vc4QC&}-G3HgeM6rL#@vr3zwmbGjq@LJlc=RvIB!Aoon6TtPwhHFzE{ zFNp_+3NhUOn9=k?_AAa0mJP#=1){&F%+Yd57dBpE_h79FIARM)n<}C{qiN7`X%`ty zG*g-`-JUthv1bR<3z&19ZhjnJo1?@1!;j_5v5v4xIpKl{o-ShtQ-OV%(Zz^i-euw$ zzi2obh77}h!-o^^6V4MRh!07Nq=S?wVi!J{AWf>+h(+6=!I)E69ATdHlrT=D5DQ43 zh>^rp!ZVUNkwbWje}%WDz^JdOBE~GA$KT-V@&{N3j3hde-pbJwCV{UhpVio^<)w8% z$Ij@HVY&V>BLm~FMtcmQCajL%Yvbht2-#pVrqiaMg*|hv`deztR+`WGXMIFqC5;R$wiuW^tb6 znc$~zR1_?zre~9Vd@FnPyD~TnxBm3s*+)r^ja+W^xg~Cm&8$!eu9h#)u;=1NZt2dQ-bhdc^&lp}^7UkvGGU z15thB-DX|x-I2X3UEmJac2KKhvq9TNXHXZtcd?JusoW9K(b~1p*V0!%SU)5^s4*Bg zaDBvmQXg@5=F>v*dKSTjlFhQ>@g#myf52_BG`TXRJu1i53e=4?9%SFA9E5sV z584{pd&9J>3iLYZ^U`a(kFj^4Z?mtpr>Wa_r)E1>ScC11b%Yhn zD%fh5)v~3lslD-jBO9Z2Jy*?}8a?Vp>NiwwD2B_o%6tWP007({%uebS{20~*7r((m z>a0vIr!9i#OXq#(y=Pv}&CGku`_6t{R6tIwuB~mu_TY-pLmR}6Roo%c6^1l7hj&W& zPig~Fs$iiUqAbwV(e2ecZt7sAW_`!n%dXnF!cE5Wu6weppZgKlZ*D-(2R^&}zWYZ7 zD~55y=EF`$G{)SG{To{us~7t*&O6>WF+OQeA~4}uN_cW`;-#dt#QKzN$zk!m@rRSF zQlwM2C8)=KhGU#4FgP*&{4VQ0@r>)kFZt1HSx*DF>y{k2&^c0BUig>pL z4U9t+RXlKgbt!e`Eu1?@>)G2M+XL_X-09XhUVXM&xem~9xz7FH`)}MzyKjJU%!jlx zPHE}8<}au(2S0^=F8o~bMfy{0#o!m(d-9v1lAZ6j6x+P}ugu`XnezPazkeG35&peW zo%3t1O7Q(w)yh}9@7h1y1P4Yu>l3S; z0})e!*+7JJEu>g!L+ygTn^~e+it#VA&z6qREc=_z+D^XCY92*i2Hrtl2mM$5kNZ9L zLwI_+LtK=c&0MEF)OIgt8I{?A+bXg( zvVAfkX{S@JrA2Si%h1i-NZ*;>oq9HPOKN?Jc9MG1yTpIdUqXTc)I4uF?{MjYU9=uD zzh*e0e?%XqtEmN1v6EGiwg=u4Jrpc*P|WMhEV?)4DAAR`BW6=hP|wgGlN7L1Xcbia z>XFqN|N_t~CZ4Sm`(EYwgVGsA_L(d)!Iy zknO(OncUjhuGW&@=-sH+y4doq=}7bG=77fQ&Bt0bTMoAyb`5pMbe?UoYXP)eZvNQv zU)#5~gB>MZQk^Dk5pC}63$3o*vE6}PDIINXT0O@H5=Xv|wU3w%$qgqAuZ*@#48aHC zMpITZ@VSk}$W@26GTdjf4&8*OFH{CWWM*Y274K-I=|`EKxA3#7w<~dR^yu+n1^YzQ zhwq3eiTWMe5gQn(6`dE89#@*sml&C{H~Da4U%XtRNn%;zjpT>%@1r%NOCleIT?pw2 z%?SMwAnkL~>#6%L7lgwvSfTB(wYjaYHOm@k<7JJrY%qRn^vmd!;bDV(qceKNI?~z` zT6ffOO1>)fs-IOi6inr>$qzz`q>cg%1)h8jkv0E3XD_>lRzMMwXDQ*dTLd#47vqCD zjsLOHkI_X>A+6V5uFbDoA|qDJmkm}_R@|1@OG}HDbGSL)%HOqJYoC@IRxhl_t#Ob6 zo2+&_R){^1d4`1$w-AZAaDpLeg-jtUP=o1bDdCh~3|HnVL(D+2vUsuF2=)>7H_kae zNE9mi0!RTo6M6~#1qXSVJafL2=$ud@APa1H_XRdWK6@Y2jmc-UFdlQB2_5;jIjQtN z17vL@MoDF~U6XdQ1&=PFHaxQE+cac6LHHARjn_QhVoT`|7JNjTmeIjh) z;>7pK$?0cv-{;0=pmU&^=2^t@&83`0{bj<+-14^-btHCe6iXonG88y=EFIPw?JF&r zn=i?e!h?Wd3SdzD9QYr^5|SlzN6t@~tm>cv(CXK8*G<#=Xz;blv7I?Um^5?sL`;<~QU!?ZGSxrzY7-;S8Wz2Ki`1{Ql3YL`%J?l|v_ zAi^sKg8q>*j$>e`_&bEFq}QZR%+rEy(Orp|BnKELa~H_wU1mS#HLx!+%_w_`?lcE_ zFdak#G7Z@$IS8g9$D8$p?#C#ipQ6Q5La8eZ3r;ULh~LEv7U+p0_^q5|ZV<1EU&NE= zmNBW!X7&g#Ra7o91-=G#f;pgTz;)nu@O|lhpl_gZ*)B++B1Va(WUBU9D^UBS);aAL zI>&VEb$;u0>FvuKqK_UIQD$Vf|{|i+WKy=FluWtAM|40?&Q<4h({gB2+iH)5=H=zEk^D#d$Pte0_ok+R0 zV=I@JOPBwwL-B9$F8KX~y&LDSj7@YS;)*dAXa!6TCXuj7ifqjGhhTk9`!p%_iH_`g0X|>f8t9a`iSb}S>#}(&aZn0jU zy~ex(yx?A6{S^J(y|q2RxSP8KISkr4IN%)=>=hi3+3VXRTdP5>OpEjj4F2iw*7ei* zPis-bSoOG)v3$E63sNe7NUmHaT6P|ck)Dtt%1na)fTY3IKxr{TA}v)T1pqb(S~#wp z6a3$T5I0H5?jZI#Ru%ncO=+!g9kIG+X?3Y(b$$h~^lvd{ z0XTPgHf@eL3!loEc31!{woY457>#mAVnz>-W{wt(non56AHYw+mnJ^IPfaFHE6rY; z0#9~L_)GxD|4q;kb2CK?yH_?)3fN-w2C56oA)cj=a!Q3;B`rWp88l>6p;uW;V@c<$ zA=~7ziHhkN(?atis2Hkm_1E^7^AA_JYo+H$zXty?9~*Cox4riR&r*+c_Z~NOweKA=zOXdfqI-INxN>aIem^cAfSUt&3WT>gkF}@~32=GTC4qpaxHwN~5Te zEpQ<80CLZ&{j$gW)O7Pi+tA@&=U$smR?GI5gKZTZn9j_eqr>kf62_h3R){1-9Aa*w zc%p3T%i`clG_oCa3O7J9qnY#j#U^4eAQp@U<7F61_FB6QQVi9NubP)y{;)o5R|Uhs zZo~fAg*mi4yl~#-e%%}86YHxQ7#u2&$c&ne+!C7|_be_i&NntOt~S9X0iRHoSQsCZ zq?1BOp{M+ph)LR&{&|aa>Uc_f;=#DKc>9Fa=!z(-sC}VMesr&oJ_AlLYiApz*)2m4 zy+CcDnyZ{P}h)UK5NuCd^mg@u`y@WT5D0+K`W z!^}dThQ&o>g(`;`MOsG0MKYqyVy-9ZrvFXfnMU2RCxevzEVpmR@-9K%>UP8Y<{kI; ze)`X5m)lOqJ#l+>?Hk@N-n)Ajc-Miwdw1{Ot@Iyc?}^=%U2A!w?4>N_jPO)R;%X!? z%s9Zv%f|!fvdtj|hP7F=>@+Jdd8BQuaz%j%UICpHZ}1**y;#SYSJ^JCF1k0>h8#|S z5+V58sGaC@m`|uCR2~Yse1Exo_2Jr?75_E*`k|GP#cy*5r%{M}L>zo|EO%IHu&l4N zx1+nbdw)-0TSH@W>(Lf!%c~ak*2$)+YO8sd-mJu5+zBUQ<;w|0lBgSFK|W zsWzkTST$$!oqUZ!{qJT<6TY>*#lG3IC7|U|%gyG9mP0M$9mhK~+q>E?w(sbe=$h@^ z-ubfUd5=zi%ZTq-HGE;(bGl=ueL8*CVnJ%*;A-0@7kN+1V_{kE#CZ^^x|!iF(|Qv% zvjL0qHWwT=oZv1PxBP&+!DmAof(`{Ogq;pgiFzIB9vv9^%UjIcie?g0#+29GRPRc9kd512Kq2)fq_Yej_?L$fSgEN9GpEsbo2)-7h& zjkQcZ8`|jY) zLuM}d9?=%R2Y;9FaYL1yMR-p_P^~Cus12kaghSL*bZ6oYTn^R@cYshz=p%SgCzy83 zMQRVFfY3+?Co7N-QdFp&j9DH{(7%bn?jm>4USN_)S&%H&63z+qg**8`!G3{>NFo`K zy$U%iE0&d(hsZsV4^SF_XoFKW{f${ct?;opSwa%?1&>5d!bRqJc02DL-;iT-I26uzY>Kes)BNvfi`4>HgcjjeKVPw7e6%JUyw-5Enm>bnkh0y2sW4IUlCm zEss7I8qCG^wasTArQ_3M}r{1u8BL&ykWoA5SxznLi7H9C$NN|z%Ika{U0+%*Yb94pEc_ehK+{j4df zEbS)EpXtQ@!#u@k)iuake8cXrd0VRHq-7SVnoMo=cY0xFdH4s;fZ_yK?f zKmhn7I9;k3d`#*Zq*x_a?TJdB%9#43dZP+WX-#23QBlQH{kw*jMxna8`YE-)sz}vN zWrDn)^l51;sV9vS`2W?ud+|4b`wp-qS4cWbO z7_tknBfDmJ+;hL~73(AN-s`38aobhZ^_|NbhnM!JoNjOa7?Ny zT{mrJ(8k8aU`6_6=HUvPN3lEqZkFu+10j%dke+$7w5}nZ_h#IkaNZJcV~Fh zcc;^*Xoy+_Y_exOd~|lSV!RgKF=;-oIpR2|(08UkWKeP7Q~$^SU|^}Qy|n!dJ&?i>9+!)Oy%OFtX5jk`_IrmObA@`S}(%g@lCR+p_F zS}R)TLhoDexA_fyYN2L?A^EU9nZxAN&gJB_$`i zz=~$QU`tqbjLXy^%0YZ8MhSIx>E4`poHj%pe>2fDffy|syD~mKyno1dWbcIcgw6yR zad0|qmNIvIIb*GR4T1WA(IB*wROwS3KhbkgoHPM4qgt(XUhkSI)8Z+##^$=CjN6jy zxC_DkoOil+p0|=eGpHwA5Kav>2}=k+9}S2fOroYh)6Fxsrw3)6O#hxC-pb3C-TFE= zGymqESG)i0YTu)}D`JP)&Za!-wy~`bw})=e&pn^V*jAQhovM`RnotpQI{Ia#a&Vll zvioZ%Ux#!nIg>iw2=!|USHY12DV`!9%hV<^kn0PQIp;~*_>tsgw!-F;{J(f)hJchky&ZzsR=KX!kDej$|pev?;n@7?{6 z>`KjwqveT}oJv%AcKN=Fh;qZS+!EnCdYS)+-13eeet**cMAUq2ux(Z7DeS)4@u5Ab z`}k1$*oA5O!l(Ju%LP~g!HZ(e{UKzFQbmIRf&5v;j~cZ`e@)<~8YWLoeJpP|#(H7A zPxz?&%KKgN8u5+}_!ZFYXXnlJ!3C5C4h1X*S4K%k-;d6V`TJsUq}n)P z#GW7*f1#I*OM{)1L!rGAG|+^k@1x_P^;k_#{ywB$?mGCUfWbNHGoLmCn0z%60WXA)A++Y&XKzoo!b9Nw@PrAivHY>H z!IVL#!GM9bzNyaiPE_0Drr|n7U1aM-i*NlzT}vIWdgaf-->?2{seMt~-Egsn^6STM zz~9whYQKyA=KuAtHmHxQ`%ulUIb7@4=+`W6Vz)#!t<>$SzqP3`t+$7F@w>ivHFSOK zndwvOKh=A@=T8s5x35pq-!`-|?lS{h>_E+9({VIH3(b_%#y68drHmAZwFdOBnSQr? zZkuQS%aGA>AWmTUJhXM{d}jwS56Q@Y_ssdD|4SO4Hg> z#7XQ#{WzJZ_^@lCilLIwrU>oe=K*yA7~g+hPM$kFZQZ#p9d0Jh5A1Kl)U7{2r!8VE zLd?QU5)EVYcItjH5E!&-i&WAT#})b&eHGb|9gri^O5$;@4mXVZjHAbDWQX!px#^5T zQXqbmH1x5NoXu#>?t4W2MtW`qsp=6TXXoK`1ng*3e-oY~B)ib=PALt>RR%STk z8^@FNAIm{>STN45;_npoNtVDOSy@mUP+R7T^fR!E)E^m<%p<@xVFX_yz9wlF-v>qm z!o=wkj`*h_X49d(Ba1-&Ox;GtcGh~ys@XQpq1oY#!vV*m&NR17&s$!4LC=Dx{4V>0{Th7fzT16N zJ(JyRoGv)hTt2w5++TZ)di?ZA^cZw+^JsJX;{o?vaSV1;cid$+Yinh_1!iOW#risI z&BhZZWiPhXvS~6Cnm;rR*UvYNHT!8EWTs)FY$0!m(R-{vqI=8WnMR`~Ux@(H0z*Z! zoM~!5HI}`bWJd_2^$}m-de=AB-B+*7N6oGwlx9>AXEsgH8zZMi4Tl|uR1t!yHxpTt zjH#pZ^D7%`$2X4PALFM;Z#EudZ;*)0QK~x;LOIX0;;L}AvY3MZq`u3%6rW|c3DKe& zegI!vbVPVbw8V*HXtI8?Jo*3F9@H#K5krRimfytP;9e4x3ll_E0W%Wjan8KQ(04K5BGnSLtNyx$7R( ztW*rO445QD|eHap2Fa9_lKncXp zV4G3WsJczZDG!~7_CgAlla?))mzVjQn%(0~pZ+=W@oEyf1*48_LFr?>h&%8ycru>4 zk&X}CAmD>Z_lafXGxURW9m)f;Jo6>DP}l>^R4`OaQ_)pLsu}12^x4{%b)Ona3;_mP z%~N0%wmg`Mqpd@Q?FD;Xo2%Bh?Cb43>?n4}?2xuc?C#qR*f`l$+PYcgLBCiiLjx_d zP4$fS8A$8IYj&tTSMpZQQJ7XNR(K3K0GR=Q0cZ&1IWF9P`~mJL`!#2d-!GCCo@D=G zUgt>Ici5$jEXp3j3G5`!l7yxz(|xH|2*pG^WsnFUuHrvn-O(S{x|gpk`YZvKR9DX< z6_JEx#!~oF#^TXM{rP~|xykOyeUqo)>WGIkdh@DtuVlr53}Ctt4eLj9`xKJ6d_4I@qc2*a-y7i|tY2%Ws$3q5XlQGD$@j=A1) zvezx&^O|Rb56X+|8Rk*ye!%srlZn$y`}cMXn@<*&7TRXNO(u-L>s&P4(Em@fSXD{k zzTy>#vvi%boRl#iOfRI~qHM=KLu$;k7EUh~%-hZcjpL^tPTU(!8-tJNjOC1tjd~BO z_Y?XhLrs(GGasg4^PS5lP}uc0^q$S_kwGXYy`h9L?r_FMdqC%dtY^R*N^@}v88|yx*slnzVfxEGVmS0SoCK4#f?{QiXOgD zcz&ud=`H&0mDk%!Zoa!xT3eD(QdYd9m{xM>U38h!r~L9Sp9E#q6@K3Z-+15as;0gv zRB`?c*RM6TwQujcGW2pJ9v(UScP4wOZHIAocz-KH;fbHSf1B(0R_h}tWI$*vJ zuqP*1lvSOznjxD8PW~HT6MZHE8NAo;k>{YhjH`;%S-VcFQgcNUM}vnNNL7YHx2(U^ zF^RjtiEGbiZO+m`h746gF(vooPjB4BNigeZ4U7?bJL&*x56Ts-hN(qAUWYDcFZ#@N zz*FEp6Dwn!(G%luCrjWx@P*Ovfmee^Ix3rET2|^kYNc!C>LB&K4fTybTELyW_J!t` zO^@rl>Xn;9+irJ+w?(OYt>}cvY9BLZ++c(zv zy{)}9qlMYr-g>b;u#4IKyw{?4y7%P3o#D1I`dH@3!04;-@Ch@-m07=~lS`-8#3T#@ z&CL_WOI)Q36iU>cbr}ZtjVY$GP`uS8+i0gSw~OA9!Nw7S@NbcmQR^`U@pj4P>DC$7 z(wSQlx0Ix`B%e+gj0;XUo^&|zLG;IHtH|3SnSo}36#*W8dHz|xDc(oi)*YX?9CXoj zMmg2mjlit!y={3G&n%2Bjv3n<4H^lI`gJ-rk7^94hpO4Da@DkzhLv4ZekoQ%U^0GS zJa8O1BM#%YFfj}il|=f4U%+B8hWJ9VDW#qOz$Ftbr~@=C={dmy%i7E~{8;59FR!0j zKaT_;_19=C^~>_e3#j6?$@QaXP1Fe56dkvI7h{UG$AEB>&AqUZltaSe>+u1kmy|&& zns%7sOplL7QWYsFG!;e*9Zh{sucV2ouA6BNpH2OciU$%MiLbEJm=ov#Y&A9u-G4tCZd&T-ly-|@4fk>d;3?;d~M54pZ}?cC&Qp6;K#bbM?Ax&r0{ zrURyZ*Zq6~6az$ovmv)a@`7yrqr7K4&AdPOoba3Rz2tk`PtkA6uiFRjt>=sJ|1U^0 zAjR*K_ZzPmU&ny-fY*K!pL{Pz4|~^7&j0KkZJMq0EZd+ZP)}2T^P}c1W+yEln*q!d zjf-?D)W#Ldl^!eff)9Y-f&E1J6dSB9@fTLG`gYcL`pa_pQu_2Q_>sA`nU2A-9^3xl zt}|`RJtv0F_wn1N2lq{ejei)KoKTtniZJRU_TC>h8sU%JgpV)fVqCC|8&(t$Ar+mo zPC(y4nJk=~tH;z(pHNz8TiAx2d8!AQK&d1FH;!Yy$SkrM;TB1qDbJH<2Xop4#=shJ zGT)wajQfjc#=gWo#7W{D;`ajXfj$G|L@i<@;H*RuTqM0J1p}Lc$)KBn*OJ@dSCB1o zDv){bX_*}|4J*JXX=Y8AgKCM&QNTIBVWfg0`VG;M<3U%dg{W}QLZms&a+JsO$X zJRMtgu=Z;`Rh>~CC#`hdA+0xRdzA{6RW&Zl%PP#v*2un-{~}G1{w7@ncrJ3|;y6FK zyO^h0R(uUUkNJ~Dqef9469#bsBp`7g?lVpWcLlApj>ISt-fryPDA+hk&L!N($YQ&( ziTL1+Q$z%{fO>_TMl7QIN8LgyAbg<(u+Or_m`a>LK7^CUnq*$02ho$5DeOVkGiE2h zh|A)}2p%zu88QrgMhdHp702{pC9!Di-JDVS4l08tOWR2{C%vYfVjpH5r$3@h(DdjX zo7}OMl*TBhIWfZNcjz(9?Q{YILk7}|xoG|Y!5{WLzO=|%cve&(IwmdweU*79n<8hY z1W-5Eexr>sdS#wscFrQx(%;h6gkyZ$Jkknd1-1TeALUx^+2J+l9qO0rW8i((=c4CX zcWHNwtB1q1tuf5eM#=iPd5IaxtkjrlsISM>+OPRWV?gb_nv2??vVwA_5=Z5X+C>#} zrOWcBkY1@yU<$|_bXGDWFcbz0!^L{Q5~&Zs1L8W-GjXeAhgc}ODmum~p|?|0H`7`7 zna5dg8FCDLS|j;35r8X2?Lr5ky-;$fm9;l3WlMzReXDnt!HWqCyJxslwAt1<-)ZiY zWWsXf;4rLzU*GNi`$NDn+Gybja`5}0;rMPu9-?N_V%&4|-q_pGqa#^kci=r!^x3@& z12FuGS0P zw}#T@22d5NgI4OWiwzCJpmPvEXlgZ-^ zW3@xYovik~-G_R*I#0GocZT-F^pEzo_SFuZoj5*qeC*-)(v-~Hl?C=Wxpi@? zC}UsN_RQC5W*N8A=Tmf3X5z46A>q)7{Xv(5aza!5G8`wY{B2&Fj~nC|98uW^mXW~u z67~`D4g41L@zsiz{fpM~8k3ZMjlo|%y)AjIkLtaD*Zonc4*fUvJ@1p&CzCI;Upqeq zls$Ua^%_@XR+RnvX3@9j7vDCQ^?VwxJW{GwM1LVwV*RPQ+@iwq<9b=ur;^HZKLNi! zRGs-9{U`6|x5}dL+ouVB2^ z`&X|a?=Lwl`brzKvi(P|eHQ-nI&xl_g-@jHWmjC;tSz+_zLUnDubDdSqN^Q`;kH7Z(4gB-u zm)}3n8b)nZwfbx7Y>eXu=R~uIo>uxq`w=}o8c9eI0?Y`Ods*~CEs^>=E z&H<0XOG6do<5LEk8M*p-=t>&Oa3huYje3M-%G)O13C@SSRyERoqbF~+&pOJM3oCc8 z+su-@_Gt@w7YT{F6M+wD37iO4i{2IgFKIq?Jk>4*nNporlFm)dNQA}t#f(Q`BCR6s zhaU`+4)zI+4}BPVGZg7N1W$Y?Zae-S@jNMEV;m!gOCg@5mDAEFwUlq39UCEL23i|6TkwRO5#Le!ceh0P!o6qm?>dN zo{P^3^dvf>Tl|~cZng=BO${SQP+`Pxcpz$Ixno&8(?1nD*R;H{6uDS5hnP;9E=1g& z)YzPs?g-o@aE3N#H#;~JGxu@ca1pemG?%$RUH-8;g3LsABE#0|(2c|nY9RF%Z9Bt< zlft_sdIQJ;{*zLdS(9y+IVFpL)X6-M%~DR#=+#-*hZs2;)fr}+F)h8VQ(=vE^R^qd zL$EL#TWcTd+cq7r99WNSj;$-K*lEh;s!O`7o6A*avcq+!)2=L+3of-T{;p44C9YB~ z)vj%>fv!JYAGqYW+;jQlD&t<@!FQi<0XmJ@mYO@+esf5(ziEer^*A1O^tRV?1UTr! z_QK9V-N_34{e!wuxPT`?s*B1nzEjt4m=v^AKo_XKH4=%9DE6{ng+lF z7VOZniyF%{>yc;;Wc}(%%5ADN{vIKjb&@&6LT%>Lt;I#6G0t6f3F9fJnbSkQ!~9EE zqQ;P?=HOCtib@TLC6#5_=%R4QA0d&E2Qc^NW@&^^p$b?Bp%XmSC zA#U>LRkAegv@5i8baVBSjRy=%4gVO17(F#a>j&w1>Q?9k=>5={(AL+h)f?6~*JWyt zYsF{<=^fJ2Q|(k`s;y`wD!r5c1wqTGgG&J*nF`1?$b?J~kSq8j2o=>xmI1p&w?t>e zse*9fc>zsQ4pao31>FT*0NILF#Sp+Vz+>qs$eipvL>?Ro?gW(q88W%DWwNzWzEb?n zVKynINFt=?WU{4vq(KlC*a?7>Bm&(5xuP2aHa~{z$G*n`Fwat+P-Ph241dNosy%56 zcL;rZEdd#h{D@RsGe+vJE1+E0W{~;o<(Mff6n$$gdHvP8=9)p@?))d=Qc49k4>o->MHbm$?Q@VKw^s{-DN$F-gt=VLs(TrZ5-X|@6jYRcb zDy~Y86b?a_Wv3x>kW@&Mypx;=d=h+1+Ie%L?-67PcL=h1U%0DmSMDPoSnyX+!?{au zpj{%JCsq=#6DIHgTmdE%wHy5%*MonHzr3-4<)ST+oYjHl(Ak%>__+(SN2VL5I}vM> z74RUqC%kn$Vl;19YczEnKVdTIGa)zfbLc|fXy41h(*uSBNdq%IS31f%9lArhC%Wf) zvIcP@@xyxu%KNVl=?^~{*_aqd(5GwW92a&j$}R`4CZlP%y#yN7pB2Dc5Nm?INomTw zgxrxME68r*=6x-UE=GUcVA-(AA`6;f(PEA^qe1(v8*L_R$<`7ZsNFh@YM192Y0q_- zbSkqCatLu;bUb5!+p5+)&ph7(VU}*9W{l7`)e&m4RclpH>ctw1s#HaQ+&pAK_9&1l zxXNR2E;33fMI;!}5wUsqhAE^iHP8vF!l|!MhR_7phBacw;ivgwnH~i1~ zx%ry-_xk(zS_R~VJqmM(tcu>5=#=K3{yzOq#_6mp8ABPVnbsM*GKVrMGsj*7Y+{lLT^=l*l#qF0OiY|E1dNv+pL0Pru48G5m1$eShhN z(yhhtck~Y@D-6EjOq~c|j%Ma%t{l8TH-KtG*@@{f$%kA0K|8k^a+!wBb z*g11!r33v9=TF_n*w18e&jL=%E-MynW*9McfaJ^Z{v7}ho(Pr>Mg&dU*hE-<87V(zzTk$!I zTbr^)TkmhJ-?oxxo%?ue#WshWb6K7lf76MX&6!PGeACWsI*)Bp&0)}xDXS_jz@FTg2nY{&k_{6hO9 z{~{N#XEx+F^VcyO@6dr5Idt6Gm$mYBWfXG#!CLmp(fRmA!u;Fm9W#t6yNR=KZ-nYt z+c0_XL$_CVXwT;!qkewhRF7QuNT;Z^r&YDhpyOZ{sLQP_s%fg8Q+ua=N0WT(c)MQb zZ8P}QcF70+&XHtEFe?myYOiWsAf9%a@R9H}0 zQ0Q7Pd2mGU>g{$05)X? zqn*0dfY;GMumQGy7@KgT{tsU{rS>|ejwH0t0PTa4Lx-$mmuHu(SJXE-TE)Ek@_8g~)qC9)wTj%b?t*%OMxj2ecddU!cC7A2 z!jV6aCg_&66HAvCt}Q=akHCJ$s$<_04pJtlL-cs|04IbeS11O3XK>G666@MscDa9#2P!H1z(0!`+RYzMVMgN9Dz5Z^!PJ>?KOVHo2d51#h zmrkFZBV7`l3tTMS>|GAILN>K`cb`-re=ixY9e!ScTA_iV!9kY-y8^!lX#30i1O42+ z(mjcOEdi1KDggujg}zijdf+FYG2d+eHScp?JuYJ|1@5bEh92eKGu|m~znt&7y|d@q zJcIqTehv*c-)|mZxS(rfXk#RAn5*Zn_dpMzeOFVU@lBp48w)up&ylEdCk1x=g8~Ru zLO4cxLM)_45Wb=HuwzS?7cyrS=MSt6j57x;`UBwK#{c#k&F)7wulcSdp)#;ho2rNv zHXB_;dPa*t^&z+8sGFU`Lb{j*Wetf2MSV;~wuaO*C4Z@tTxa1i$su8Za87&)l%UWq zqbpL9d<7p7Lk0fAqriAjgm{Qs$hgHh!rH?>%)QOE7V-o*!C{`C04FvQ4|DPC5P_4( zlW!!p6R!%U_$mKWbe3UFzHJ;{(B0kL-QC>?f{2Knf4jT86KimS zD&LVEmHi~cksSi3g55#o{Bcebqm}uHYFdI0JS=3(hT}@a^$8IDYBqx!gFxyvdFTY;Xz~3cQ5HbiiXy0jHC>=CQ zpo>|}S*L4K_OO!KuUT})A4V5*j`f)<<|NY!$XMD_I+l(nQOMWG`$$9Nv*bL+eTIPH zOLt%xvE%7yNId*|oEm;{{nOeH%sF%_Mg!N3IluOBg|_|}zlXGusD=MY$fliSeW%_h z576Gz&oUa@wB+cDcE z&vnA3$n~PfKHpouJ-(pQI1khQPNXVQJj-2kegIcm+O}~EgK{E z2~rITl)eLdK%awbr5{Bg5ue}8v85%G%m_7vC*&CF2U;WLG5IZV9IJzsU~O^6~Dv|4_)RsdMdbM_Ms?;H!A#$C>O2L|*8I0sz{nhnwkNeVdS z1#>s|xak`2H0@I3y2VY^^N+_vfJMLKRO!%V^TV{tD8ks<@VMTv=6h9J&9Ca6iUYFu zWg}(U#KW9A%2h0XRdF?M$!VTE6EYjQP`7w)asqJ+ae4F}EVR$Kd#rP=b8FX1>(=&@ z{WHTGM|L6ZAtzAe+2%Rv;)R9sdD3G0+A^+~2&N`*=Y*Ql8mL&oLiLEctIlOTu2F^Q z62OQr+43A3UAuiR_~U%VKG6Z*VM!4!q0q3X@S(7Q@agcDsLr^&M0ucNmX~@pWh|vW z(=~HA`F46zR&AzQrfueWwoC5ojW=?OvM*#xvW+sIC$}c(#1|!=ixWrbg}?N<=yk_; z!4>BG+xfA5u4Smnf)PTCrkXDMMM7slsC23awqSkx+LuMtv;b)d?|`KbUK?5%c-{S_ zCAfZ~dgG6%3ebKS?z4K?)-O#T%s(rYUV9h*aqGJ~uf^{|z83uW zP?=P*zhd>1&1dKGzOUSGPrsX0Mf{@G$o>Xb#Z_fjlYiZ*`SJ(y*Sj&QWqUWh{|syg z96Gi#u?^Kc6*%v>1j2DC;Vfv_iA0wT7qe23>)^(74-N*Cx*~+-=U?-{YV6 zivRZDBVo!hC*pob>4tM7sv;XB6XPEyzE8+c_?vJbF*r>=tvlU5-5}LBJv04vYFvh4 z4m1b1(Y)YmQOXXh9p+m*ioCbg7Vj^v+a9?yvlvvU0L(=eh3GBxf(Emev99TbJ3<}Q}br>~AP?38lQ|9>dmzN#Zd+_y?Rz?W>9X|pJB8vCynh z&J*5{;J09iuOS5SzVHIX4@Hsu24R)-l6XmcQ?SNi@*70HpvQpmMHaFLpuqdYd&N?Y z6O%;;Gq_YWW(UoM@PfR7aG3(9ex|@FzLziiWD58J<5sAG`b+ZHGR-(zSec#eMAn`saG<`eUpYNn9I#D7TQ~E*u0MlA$a9R1H&quI{PjpeN98Fw_J3O&1L7Ohx8wliel+GnDyN zYZ?2i_IXaRu8-V}y#_tgybgG6_SEvs_R;n~>^~on?EfLqHEdVtWbmJmtHFnZjs>3y zJ{fq+-^t$_;Q2NLT@SB`_%D1W@_blKh<=cLV4x4o?XzpWvxj4^1JZTM1>-*DEA=*V zd*{C0>ykr&MU7>k?U?0xlS&JyX^T;jnT+|Q0aq2I?4a^ac@ua_`dH+~r7;|E7gj!? zvk2bncNW7}@2-{1&?Z-AZO6{RsDoF#Gy9ACSG&Krm36H5to5w*rVU>nR_q2Ic`q0S z=`QU2G2lC9HbtJ^zhJSjIM+KRw*X%LJ5OHWtR(7SCz|D zzpLeFpVpr>IHdnmZ%}ts`?AiGZj3>{_6~Krj#yVwt5xfU-l)EbexlAft<75Fn)X`1 z)h*S|ss2zwtF@>)t2inLD@CdDiuBm77{hzsLf=Uw3q zu{3CB$tgqz?ixlOw{PCHofp zF#os!Krwh0oIctJZIPKpXHuEe66!f%V(=!g$=)n3a~BOsw_%Z)hv{$W&zWc0d-;Dw zCeoAAddWRuo2W}tFZnI4g(NHNRW(t~R36gE*4kv4YxUVS$nKw&qUD_VWsAM$6!TFF z2g?msNj5IFV>Y^W|Jmoea$U-7&soKrwi@K>yBaPVP3m9OnbGRgW#}I_{Gwl@MbuDG zrpi|-49P0U`p8B?JVAaCTc|C>S8|mf&$}$xCfX>P7BU4-Mfb#cq5$C~$yrGVpU1l> zx-7WNfiYEp-eDPYp2KCj(tZ;U5jl7Pp`3IL`ybY4ZSSJx;`IE|eCd4G?5COHxv8nD z$+_tVsQHNl6INqP#1mxG*y;p!j5^u|J2n_Tba4+qd$ zAzT341M?n99@d1jCQPQIXA725YxK2`=uZT9ss%lg3Fmy{Lj<;<5*ZU&8wI42hRP|m zYAu*qZqXf{)3*NuD);TF%#+w{qLYWkP;Lo{p^w#w`R)krboL*i-SQ*Jf?t#Fc4NOi^N zEbFdOm(ES0#{`I$i8#dEVAAkASOUOAz3&a`#q=!p@9q!m!gnh7-Gbp@S70vz2LT#& zWtu%ZwxF{TwKlW%5|csjp?;;wvv&%E#q-hyIa!U(I^Kq_jrnFDZFe{%IJ!GOaZU25 z0|<>zKG{C>pxdG6!rh`x6WWuuq?V-;Q#~`IHg@KVbH8VYX6@e)nR_jVp5>C`wdq;0 za66$GQjFQsR=A@mxe%RSkb87vZvITp%ME98mNN#^KBfmHR40(*Mk2K%KLwk4mAW2u zL|ZMH!HtYe%nVXh;-NODNnR2DFf^y*}-lt;~CqK`Zy)Qdhy8J2T(_(4tr|PogPj5eMDvSQ8 zR%T!N=hOPvkKeIXIW^%`{*|2XAAVL=AN{TW`&RA7x)Y5~ojQFT1Bs(a@E9a#rfccM z>JJPYw~3Ta`Ay?+btF*PODbQr-s@d7I%8g7QEp{tC2y5!TWXi${LABw&t|`#VEYKS z2u_r9ly|sx_;PrB)N0hONVjmG@Y|8wVz{x?INPMS)B_oQ+2|ZXK4ud;Kfcg<^F+Qy zfl>i0FC)ifW6;Klyk}dAi#~2qEW~UQZj9QXlxCa6N-{_(PPv+}H@YyI5WW(E4T$s2 z^%c8mIRsj{nW`D+>qKcasMJ7LKnTfhk-j)h{EmBqzJ)@@s;z}%1~8Wac2Ew@Tlumu zw@|cndGW!*%>4WLxY^?qdq!U)LdNpOl*Y~@3P*_jbA1m6TKk*&b^1HIuXn=Qx?8kb zWn0IZOPVvAcGmmVCDjer-)pjN?Qe-|-qlpyq|{X2_~@VVzt8o-^(z0)wKjJYc1*Sp zbX;tAYW>{ywCzXh$JS3RRc(Tvoc_~;M}}Vxk_LT-JcmvVJQ&zK5HYya&l|ox+C2ccJhfR!6M2+i?Z=Up~PKElB0)sPIowBk@NPZ4;c5=28dK36c zbjGD6&|+31c~O>8>k)(qL1bO1VF1FX+WVXDlrP*cy-dwzFccFk~# zuwS;X0jxzZON@E9v93X!J_g8snFiPNj%$x5{StHQvLtH`G*3bcp7>D7+>j?_q^5kKLw2wB8P!f#wQ_UiiV+D>3g zwoDu&r_st8%8X{pInq_C9#cX;NGoRsu^!Wil%I4Y^CWYT)xnZ*8vw?X!EY96iuQ9c zY#LVy;3a-=A8<4{A%Mw9iOpy4;z#hFv1FNKI+MMN?ZCdqctq|Y2a&4Cv*cTN2JQ@w zvsSt4x0o;;jdC6D9N&jHHL5-4jX)tG2-pB(@ZQMHk(6Qh$ogP-uTgJMXK&lj&ZO@8 z?jt=~Jr4(BhIbE(Mlhq^!?UBPaotIunai{PpQ|q}on0-#-p1$Qr-^IiV*oRIigAm@ z;iU4@M3vIJ;Dg|Ya!!g26-RYb)twq}tqVFQ^j{f1HEuE4Zh|&r0!_bnb|v-=wqNZe zjt`vTft}V5M}afJ^`|@E!_*Vyh4r}}@I6F1v?AClP$qCkzz<(@?_QtVK4edKPj~NI z{z(4@AO~W22|TL3@_bzVQUh)WRQSqyPkX!hKM9Boyc@XPPsfYmK?U|{2V92i5^T0w zB$#JdmRfjP+_09~QLSDB8=)X$BjaD%Ia*uP$!bxG0I?(Ba<6bNk!hrxnA@1NW$&p` zRP+QNp)+nV!Jqm(aRn}gKOf;DO9woL{)|3{2f&XYtC3=)6YBSb5+Y*UedX|KAUbsg zH+y_KX#O6?9(`ubntY6B&il@~#(U1eabED&=>AkWb`a25Ok?QNS&TInoc)?R!Dh3a z_^)_Lyxk%j>1)Ah5nX63+|0WqkQes~QiN6jC9fp404>S1$sCrsE_YX!DetDZEN7)K zt5_}nMINNEOX;QB6;*Y0Kb>XmSGrgA-s$z~I~a`{GmOd&#Rebre`w8U)#_d`95MZ6 z8DS+cGcmto`P$mTcB5^XRf3tK`Eg@KeMduxL6XS}!!o_QdJSqbY71(wR3a5G$xX>M z%SM4S!ILr)=pM*fi7Svv7tk*dP4W5!cgi;^o_c{Mq#Pu*0EUMSLJYnFbAJ8Y@~`F0 zm9~{4%u|9U=@!|UhNewYV1#PI3;Z0;iC9kFLl58#a8K}G2w#Xmk|4h(}@&f87UJ- z#|4noh@E6z;O|&b1jJID1h=DsxKp!RZWL5L%8$&ue>GJcNUV4 zXTVqp&Nl%cl&vVM{z=1H(?$2O;Z-9WQx9`%(0Rd8>d^^oXD38Ry}5e#zceNI$Vt_YQbuuD&bBKA(0$$0-|L3=Rqr=mN4yfesh+Ja7o6N2 zQyqKkiMAi@=B$z}`%Hfr8<~2UxmkQN$uS^ld{e%w5TsZl_XYA@w8;I%o~Ilk-p0+~ zA7j(k|692{w{7;&bSmQV@Y>+F!Li}}1Lp<``&Rn@z_yGg!0Qmf6ZYe8$G1$HP3cZC zrsd~+XDz1B%|nURvIom!HhlXNb%B6T?JY$iCnbOS9X zFFz&T3MNSHXRQC3!@K~bzSbh-{#o7)&i^BUGu88{zrXz zUHQ=p@t1q$-%Fpr(|j*_r}jmqyuDmfuKAJh`piqEw^r}H-XAH=Dt+}f?d^+?#1Enm zdX+mX8!J}7Eq;eq-mNtKx#MT~&xGpX+AFn#zrNT0Yrr>s>lqn*IechD1Gx{SKMh&R z!1faZsJ6^IoFHKzc$adh<~dD&?bo_r^t%mROhuNewzupnoon5o9vMFG0yRRnM(V`` z#RSE5#&;(aCFmqtCH+ZQN*+w6CyEaCjhP`=f8_(rwZyGO9F8o$lTIg7; zzMZiB!;Yz4^Sc>4)pt5?`&xLVAb*Q^6EQC$M=ql?`DEgWq>y--7@H_;_)_p_;4h!u z?zt`>ZE)rPp?5FGugou-t*ou6p{=l|)-6_#%)OdMOud?%n*z;%rm?6ZRQ33Fay1#XtZ%1@!_7?Xa8}R6P*{0U?qb0AsyOY=L+jYGa^Y>(9Wi#s^sp)&W zYsW-~8n8>7ZAG+R=``*--sRsH-*x{VyJ=^OUx#m(uq&c_x%+S5*Zv*7a{Ye8=A#*7 zjg$8#&meQhcA&f$_N|7X$?F$zi^TtElk5e7JSYilFQ=vIpncdt!#LC2$f3u@#4Xsf z$veY`9GDfc9-bO;J|Z^qK-8J&A93(lxwvPEti-X{^+?4S{Y2NKir70bgK?}li>Qr3 zdV%J_?SUl$EB@MkZa_Nl)1%R4kKL-Bw`;f41-s`q+ij8dsX*&K&;G8HrgM+O3@~q= zG_KK4(7B~$t@=~WQMOKgSs_NjN6uGP9;ye*6-rt4Y;8dle~xjV`jk3Nfs+1WcC3-s zHm^f5%jmPK!xP@G0~Xo7<=q3+-+hs=`^{S{DSC6N+SOu zpP}lJ4T1iB8F`Mef$^Jqi&nur$aCVHWcG8vbI$-d%NbEP*hE$$vj-$E<$#tXA!2Ju zv7`zTE9Wgo1R*6CC8GfS*$yH=hQXbZH9nd>$b8Q|$NkH#7o-X+g{k~dmK^mC5d`#; zZ{kqv+n13`Ym4BOo+Z86sOjaYjkCt%s-w#AFC)WwE+zuRG}YlD-gjiGh4akGYnW|OX+?u5LnqLb2Q@jDKTwn8t)4=rC@3tjX; zbDY?ygC5;f90YoQ9^S@3$ecu3MO-tt8T=LW3otjPf_0#1rFHdG#TgkR`RB^%%0y*3^)mGt z^;_yH<_8b+0%>Zfv5WmrK`Nmb*W=920j#eHfQ)kR9~ z3PQzDh5ZU0iis+AN@S=7GzC;7suNrm`teM-rGWRU2-u{2VgKOVWa%^9>3&o(iA2i+ zyZ{ebw(PIGCczqah4YZd?>f^z{+;bY-T>0Jl|q#zRU*!(Ag6-g?EmI!j5QZDM3|KX4$d07@kJ z7mLroE#3ysP`aaAr|qS-OMOgd+Bnqcy1tBIy%EQ3yJ?SUk>#?Dqf5EloMWaRHd+h_>1t-|gS$0e% z<{DsNZe)E2EZs*ar>VOrM#N|9(6zCp<3QuSY|3}y`9#me`w9A_KT0|VM`Z&|`QGVW zC^B*iX)yK}>4C692$74UEZ{f&2gXG%BIgih$eZv?*iqQR(B{G6;l`0|a6jbinEm+g ziB~gc=1wfb*L$&-u-Di3Vc_@-q6P5AQl!k$0$F!>g}}GPg}#*Asc504sXL(Mp(8MG zHvMLC*3!l5z3ndhBnP-tt|Q%k+@ZmGr^Q7}8QTTBGY&TP4BH{QAo~k;Gd9+iSWA@k zW8)BmQ+gM)5;YHN_^K(W1S)nzvO&85yL>-rpHQAR2AmtTX??gt?9wV^_3;vG`sCy^ z@(=v`Nbiuv@Y$h^!LXsD{n-AAp6c!geeBL79Y8&Dz+?0*VhlcoU?9mT>#5ku6SME< z$CpiT#bhC1;C2V8%EUv5WG^d<)j7Hjx?KI!7XR74us>?&;*{dK&kq-16HE!24m}ci zE~YOwGCneXJ>h)H?bO#9dRgJQ;v7uYa277BHTO)OsNlv{w{6PX-|ckV@waGbb9lj} zLQ&D`meI}6b5G|!D+tW1+0c@4E^Sj#uKyfCWQNz;I- zZI&;SaRJ@r;wgC~&-I^+s#B%N`(x3F30PsDQpfEUZnH^;XP0K{@g}RfvTEA5wXcG* zzV~{cd@62L?EUiK+p({;pYdOi-E}dja3n~0l)A4 z3jB4hO1X+!iK;~Zh^&gMeb8Xuit4`6mD9%<-af*B|3mtXzCyH2zMQjL@xs`Vvl+p> zA&C*RS7uBBu9>B^PiNTZwV|2`%p%k-%aP-%=b`0g=KamP)E^%h7YYp-4E7F83+fKZ z3jPy(J=7(9Ibt;CYMfF6GZB*Hnp&G~xWOrZKJP}pBaKq#e!3U35Rg<*b00V&KLI&H%g=vgqTmb7x=#f z6`;}a8r`;he6?}?24FzDvvhg-<+#WAOVow&hZD6EXAw_EWnjB{uLG>l`5x`wj;^eZ z2lYC2cC|fK88tS4d5!fA59@B%Mc294aH`?I-v0je*RR2{F|Y~KkYBS>!>QMJO|;2 zGMPCr7q*nXT)di%O(ox^++?isH6#_%F}d^F>V_gSiJiVvgmbP(sc){gy?2klOvwJQ zl8DA=RIFXRbE0ihPC`fWiL|=puw;`Y+2mXC(CF>4t&#TO*^%X8%YdUs;$Q9);Jep% zv$w0~75ic3zAB`ZJcAlv6w3RXr|E;cPTp8yZPj%m4ZzUfB8 zow|G-oKCQ&P^BB_eZEx4kd;6v5)085kPhgp=sdTSy~O&-N@d@qrx6Ts%>)g63uYQu zk1N7#$L8WgvFP?qe3LKpw8D&n>fYp@rvwYV}|8vYyM8L61;N`6B;L{K4& zQIr{`bVW8;@ImA(F%rj0?|?{<^D=po+d?e=w~!$giDe=BU;-EdtrtIpFd>l;W4T7T zeex109TW&I6?=*|f`Y(8*++6;v0i0C)Np8Gygd639E#Dhm5CO zqUMn`2(s&!);=x#o%dgOJ@)JSM_%lwS>pv?=rH+Hl3-A?UJZ(I^x z!`v#|Pr7%wJaC12taxa7@AkI#OZ7+i?+9K9TMK_4eli3aq~yQZd(;!;b;>u_&m#a4 z@F}1-*gv>8cxzZ?cxRYF=!w8#KgB?XpGx4Jz`_7bfNEf8aHju|N0!SCr`wM6b_jse zzG`h|b;2&lIuCHn9Mk}*WGi(#bSR89SYN4XcmE;$_y#X6;a$Cvrz? z$95r;MmE77!XYEg9d`%iN9(&!bWxCl6Msfe!%3+2iCc)V5ykOCQ+<>A(+!i0b3RLl z7yd2AtP`e3ZgK#&<0uOcp)4u4p^`%83C1mz|w2rc{!xK9oR?YBCHZ_ zlQck<+dt5 z>BIHK+M3!Xn*Wq)6wH+R6g8AFa#2uM*(%Tx5rp3-fPgoFR74lJ?i@L0CQZsp=a#W{ z^Mb{EzKGw*c|;qdhqA_a>%u#LYez{07e9~^A-AAAAzx*^pzhLQVDpCLx(S6+d*~87$&@re1bWAo~1+4m5HB|k)x>#*c!ww+LCyXU#O6GFFbJ<}oHTEz$ zZkpJ#!`+ce@Z3~IsxKJzk>FQ*M$EG1;R98wqz414%7pxm0Cz@`Iq?l{4ao4 zs)bj;1F;~0cj_+JfLq7Pr904HlMdrzFimL1HKn!T)vRUElFIy{+1ly%z|9`MC?izb zBn=gZqK?gukr15W6GQu9_>nWP`-5Kx4-P91(}p^Sj}Jc`-Zat*|A{a~_yW!K7UYJB z?GueC^tHPC9+u{7w>f1x|5 z-)8pD%Gf&1PT(+nKIun zi=6hGxj%Lj5s9oFcS5~Kpiyz-gwd2?(x5-wc*FqdKmC15I(dF-%c>)egV}+_pbroV z0jyAkuE2N&?DX6h3Nmy$5;m8xwu;`?i>I7a2B~6gFC!Lq^E%SYrBs)BFH1lC5ICC;f zC+ll=(FXU-`sB|E+_>hL?Qz@~+tBMlCxRit<^ctMBKN~ickCQ2f1141-K&09rbj5` z?PIU9glruWW-WFpdMY1D9m*Xf4{d?XjyMhqIzBe|){a*NS2lk;{%zw|!Pm^nxzCTw z63YZ1N$*PD{r6$$HTjLnyB{wVUr1i5y)k~DP&)NK{(bTL5AUnqVc((|0wf))xZIP>}UuTNjHp%Xs^Bw+cUL@R#tZFlOk>&^5pPKE{EgK`Fs* z!5$&Kp_S3qG0$UC<3{5Ni3gG@k}A?)WSz-Q$UC?xa*NJZt8JmhDO;Pi+}<*?MO6HI z=f7RjoxH6_w*D?!+58~CHPJUO$Zp=M z$wbCrT_Z#7ms*pYIq0jDD>UTZ<|PP5xHtLwf`6QJ##!2SY5}o;_J(FhipSHjUkRrO z+wcK|ySPq(XgQB5L%&&*Lp!fd%p0L9$Bj`NCN`pCr%R`IP8~vBgzp=s!9s?^dOdq; zdv0{y>niBG)^n|+t&7yt*sIw8aWHpqXJ22Rb8lCBO((r4p}VhBuYF4!wIj2;V$goL zt5>0CXYWXV^bmCfesEssw66w#EbtEk^xc~#!Y5uQ`kf?S&4KWLtgm=wCao2X3=%4 z!7D*a$Q7N{U#kWy=NBF?eqPmF;VvSV1JJMVpE1*GQ|Mx>-n!muGa7|Gi3=f60Z*I? z&Tn0a_abj2ZXoO>V2S4`$&?A|X2x6Ec3K3+y_^|#7sDyx#V=E{h|)oyQM=JY@Gj)#Q8joG^2cZ)aPk_3sRAd3U?NPP50BcdbG#Io6@}noiDccAn8*XFO4!xn9SCw`YzI$t%m9 z}wYU2|pG2EIK2$E!I8;9{oK^KPoPEFv>9MPxO)K`tar8zY&EowXy%=Ps9vG zTnnoRJrKSWRugTjz zlRp-Z?b^-W8tWO{0M563l~I{s z!@5yAN3}lcjB0OCmsL5dd_wh@b|LUdn8sy=Uin7lNcBtVTa@t%o8;r={>VLoeua8~ zFG~%icZFAY7ufzR65EMm#eKt%V{c{cpbt{nbQzWbkmB@`&ynhhp(HL|Ost^9&}`X( ztVq^wP6=n8qre;I4G7|dY|d}MuSH=wjCc%p8(m%wOW46=d#<|6Yh`zzOu-N-WLHuLvM(j*)oS;Z ze=B#Wx~tw$p($3#(!gkNpbQ?YATbcPOKwQdNN$TL{6Cyaj7sKC<~CqA=tL`IcGIhA zOLQ1BkU3BOO%f9`uzN8-S1&E-EPMy(2#@)9^Zs*<)6$te)2}B=M*og@z)Rqjh)sxN zux8*5zBt$b`v+sg)`!l*6h^{_e)S#byWaPy@BDBU;`~_3cmv85RWUU(6*IMe>iM+k z!m-su>+#r+_~Qf+nM6@w&2ZZI`$XOnYpA^(NAb7HfZ9hbeZ6fa&6f8p2dxCwj&^yD zNV{;G&(^ZGQoFmhx2#>Q%B^48P1^0T4|6cFzu;)D-PP9P%IH&gk^W z^FF2a$d1fjm!6M}H)>t}wztgpKI?qcR^GibvUwsD9yDAvY(MF|WHwhlb8`{8?nM|O zXi$AwNBBgs3+N}*UFo34gaOX9%mQv%YA^Ea^dPy}x?8&Ux|MqhJkNX9`jv!zj+}^8 zi{{2bQi{{FGxf8!<-W^T$bXy_mFk~tnqj>`EB8&#)W$1?ySMBsvM$QrT3BqlJ%8Kb z&4zjVa+NY#Qy*o^Z@^`c)7c5xvC2{VBH>|%{ypBRt_>D{ji&YAsi~?JD979kQ(z%^^)Df38$t`=R|q;pg6;(w{%S7yVrP zG4cJt_n#FHD_Xu3e*E%Q^(Fi1WJ%Q<-22;QiRFb~s=wZ!ma2PCe(~A~p+wqR{4)YHGu9qGA+JW4zWm8*zTT^>=tEl-qU`j7)zTPBhiERV5pqgBp z%{s=r&-PgLn)UqG<<@ulUcKI#LAN2RKJ`Ac!Tp2zBT)$E=!?<6$cFLV zQws}9YZnL|&y zz>M#NuYu=2#~rRE&R}O{$8pDU#}=D->qv`X%U70@CmsZP`{)HTm)Hzc0zkWG15fv zO>h#(3hW53l+vVq5%lSukBw;Ulp$MR#PyxlyTM)tCFe1eZ>1K*duukk;;6Q z(+8Y$BMR+`0+k4jTAcu+K9hB`ILm3vLaQa~VF#FtwcD7>Hn-g#_dNI>mLBWg;l6Rc z2mROl#(X#XU-#1t$O{Yz)(pKL@+hJ)qAdJj#Pi5s5pLnT!nTA~1nmth1?~WJ2&xNt z8*soM=4I}~3jzgF{ZT$T-VeQky@Gw8`G4@W47eUN>|f!l;P*bD%lnOclj~Dwsbiac zgdNp33E-6i?ZGx8^A&S_y(?;w8d0h{722RHl49u`v=Zba-N~7!E0UveMJr|V-zU>Y zA0q^#_s9N>>x@!{Y)9n~X5+5#r@fhgS4+8HXGl8ycPIvN4Hb>-g})uoo||6UIe%cW zeJOtR4*J8oX#GC!5-FC_LbamGkYmZ4Db*x7iVbUmo6a(zIuK#l5o{o)0v)x!6JL*8 zUf09V;dMzvcqp-xvYYq~r;oS7f5C=g&*4ppjig4hDiMe0;V)A-bTBOkm^`j?0Z%9} zCHxR(N;Ck!!Y9ZxNGI48>>zFt^2Jo>4#m%EJ}NPa^D6erX==qf2KqQdKT{v`3M+Z* zB`cw2t(A%OikZFXPt(&DH5LprE9)HFRI48ryUff?&zf2N-^yk3)p(=v4&4mxMy*oa zINc)}eAO}eVA*T(FQIla#*k{TvP=f#HeBLkv~>M7 z;JBzHq?0@`$5x)KKE!aa%2+Fckf=_UkW)xJayE^F9l`7;5{W95-6R&Rg{LSYNk2k$ zlPS?6Xy;g{SksruC+)r_kdONLl3e$>US!CTqv@#=XZACekOf05)&|{sR68 z(LH7`2Fyewj-%zHg|HjLL$FIDv!j298v8)Kh^}2-oG#g3{J?+xGu_GkQG>k$;-SYQ zs1XFBcQRyQ^P=OTba@@vi3buIsP4=yY-@g*2qm=!k~67-vkC^d^Hp6_Qzs9&@ioEp zu;oANT>I?~2nT`VZAYfVF^2;VCXRY8>uwS54Zt&M_SoSy>#pNc>vYUH%K5nCPKR*2 z73*s2Cswa4KUpkUzOZaIcQjKnx~uQ5w^R3#_9pcOl`G1R6-H!dz%ddhK92z-YvPvC zzH1o^g30YD3`%SI(A2weXGG;#_4w+z4MGEEGk#~%b2?(?)7--Rg_Tf%8CxgVGs9S( zthYS2zyS=ExhhjDw@WcZ)7Ow_{KK@_qR{q~!&?_sk9p4<-ZH)~{5JcK2jGG{LO~HB zQKivY37nM03_|9StbN%78%DB+(!0`J(toF~XVzrz*_gPgtiYnkciWC_PqttS<~P+8 zyeVwnEWhdgCQ1Is{MLfTjeQ%qsk8Av;!45=Ve+A>p((yq&Npo#W@&~SbfR>3Xoywy z6dRydg`3z9>G$zR08;$TtQ1Zi{yltm@KbL>|CP=sjqHY!de7hYs||kXROD80zNJ-| zf4ci_tXQaxJH=AJ}WTNBfKft_BbKm-wp$Z1c19 zFZZ+dcL_M==jU4;B%AmeG85jMQqF4aoB!tT&f8lMzjeHL`_2u!;&;?aNpE8PA_!p)5mRCD zf&0BIT`L^2ESoI@OowzanobHZ;65R3(4=6Iy@9=hbAskcK7^Y=tKhVV=@pRzy&dKlNpMc4~aB6H~KkDG54)WQ^i;*h>y4~M<_V(=Q$>|I0`P@xu zd(lX$GyA)vF|heVYjj&^^Y;ehI^Dm`^*xRE+b*`Mw8%Cw>!<5v{@$z8X$bu1{m;0` z_22EL2Tf_suX@!7Pjw+%N7@YA-8xl=jt*H3!-lu?>vr*bFZF-x*Myl4WBQc4o_4wP zG!AGC{~J}ASePoF&s}Lozg=%8_|a6@yZP?IM$svdqpX$cVO^r(W%F+~`VJB&lv{<* z(EviouW($LT@*E1E50guJjFR}Z~BGo!yDe_#OJ=smCu!In9WhYz=1Os5++`Lp(wWzRyj7Q@&Gi8MHUGGltQuwpJDQ1N5E+e( zWx5(^GrkSaTKB@L;f0u;xV_jtxKs=Vn@qfgbHg*S{Pn5D>N)b#>O#jNZFPQ0dqDss zrzP{|i=`{5)v8qvIuLUSqlzsgq~W9RXq*I%!GH<32ra}aq6+CFL&E&c+01X`{^KBk zCj=4ON%g=#WtHUK%I7POsNK;j(R-~QZS>USk8zQSiFu%Twt1aNnMsg^oMo2{+IGw# z&*h~Y=WxL1vjou{Wa*t6W3 zekwG|d&$^?rZ{sn z82K^nGcA>I7ia^*2w3#f)o;sI%gOV5kjjXYBReOa&Q{I!13uuCrP|r{$>gc*rTNwI z71C_$xWP>FGI#Cm`V#p%9ZT6w3@8cZQxv z`;T5tcVyq>(D)yCM>sTQ0WXZVhda*6V>?qOu>>54GR+=g|K>#sMZ!&dUBM4Q3tvM} z%Xz>KW{OBzQze3Gl=>Nsdn!xH4Eb#`J&@yIsbrt$qUztFeaj8%=3|3c~QO(rAYn{`!)V9@S7-*PYvU0GO zci886&UwNC>G060%wfB8i|d#h%+t{0i7Uy~+fBw@+hf&L$9bQ_ZMzP;P@8N^m`RPH zpK*vW*09RthS6KVYxhI#huSMOdDSC|8j7l_kJM+>Xex@TMamGxZ;H3&e#qRByQ)wk zcLI7`W<_=jv>1$n?trR-&WnSEsa!IU&2eJx&d$bdFcu;NF8O}zuAr8Y?qjrNKm`Tm8&;p}~%=f1D2X!zpjbKp1Q(==!P-byFN564=MCC-p;Q|~buJh0GvgDko) zflJv#aWJ70M*W4hgdf`SkdapEt6u&7@RXB2|pyL4HjU%=Zb@2=7 zP~w?2`0DAUx_RatYteY-$9U7w@4@&X|9)nNRU5B6cCfOG-caAf1Z-xHnys5_Tf4eG zkI+Wp!~J82W-iWOS~kG!z!|P%*Uqn9U!S3N^DY4U=2$5f{Egxd6@f;x_KMb7y%R>e zO^eJG(M-z#8$Vlyt*wKB)3md(i-XH~_YYnrUN3#L{9A(CBL|}u6VdUe@qd$AQeGxU z#iJ7_aop(LF@F;RQ?Y4EnY%V`-3s4Ywdq;9T2g%CTtaH{P-0Q^+eo$0i~cBYfzNH9 zHphPsUFZWk>H1$aE-0NqD9c`u9TdOfD6qoF|8StS?eogxnInUMbKA40xGkjNcZFS< z_{W7(Qt79k7k^ckG! zu>CvutKd7Pc>Sk)vF$h5=VJwBMR7l$mihj^@H6tyY^_P1a_!yvbB!J?$nMYmSNn|n zj}O8}8z+g2)U_`Z3@bo{k?4Y*!4Dy^vc2-zK(`=LFHnETFvI+-<*LmCz)7#<@Y9~} zNOIA4)A9iMAiY(5y!|QuabX@&*J2A2-p1vJk-|q}p-G-8HK|&ex>>KXy0;qc(9g}^ z*1laPm%iirPOaSJ9p&2&<}~I6?mDr@ci+l>tAmog!Fzl6_U2NzW$y6UDokgkj>e;+ z?nJpokB7noFZeonWw;qSmRM_>p4XQ#-eeG`Hl$>wAdvBZkQ z!LXu12*GQ&aZ&(%_~R^cCUzok?D16g0V|-Kb5zuBq0y&bUUc zA-o<`r&+($7}Rv8?sK*2pQ@j(bH7}(f?cEBaIH?IHl+SQ^S0K{ttBmu?cuEoO`#13YvOB`>y#VBmA5N$YOdAb z>XTb3?IXY(iq(9v@pao&+uyFhKL5eg$@ux4rMBf?YrVuC@_R})?JUbwa6=pp-Uj{& zEmG?;Fhx09s{ot<;0<+r>Zs+^?ZkKe?v3$l2;2yB2=9r?i@Ol_U$P)oHwhc{J32JB zAgVp$dQ?*!DJmbBDD?(I19t^p4KVk0_wn+Y1$J))w_qovL!td6TaY!vI@j6(z0C|~ z7KwzK^co)2lh-Lz?^XGrl&ri{F&tiqxF{!4h=Jde(S`QFnX*4XKQ}_TUs(N2I?!n; zB&$+9D7%P0BrQ@K@eckx?m33I#9y#oELbd@cbZR`>t7sSIk%L$xV%DL{Q&69CAqZ`@&_uLqDL)YXmEyr;=4Wb1+$ZW zpL3G?lzkf5O33reH@=9nfYik)&>_${5EV#Q?}wZQ7{*DWd*Hnw8!<`J455McNq>gL z%7)0im%1eRx54Bc=P=naLUWKnaC#$G5YEb@ZKaOUWf?5SDCG(M2r(Z&yi8u)vQ)P8 zdxg7jdp2&iW#ZGQ{J7q@%b3)}_+0G9GoCUoH6A;-V+}m7Zt{(T*MuX&yOd;F|@fDT=dm>{fi;|O*$0M#P6szylI;FFu zGoig(@0Q_pqcvlp$psT5l!?W0t1s4@ZG7!H_HXTMt=X2}Y|8EbI-s0bu8-Zex???` zdY|%<_Pyud5a8w?>J9U3^OShldPR8$_@)GA`zv`ndusz!>rnr8UnlP?Zcqmchc+iy z=dBJ9ms6hZUQ9QUW3i*a;gO9a@{XA&`mZ_Pc#GZ<<96g((|*Givv9NbdYjZgD_X*p zVKstC&MzK?ewn3D;1DwLs8vs5HYQaFo8CJ!-itG{&*n$wQWgqU7>fk}1$=xZaYeA0yZULpiu99a$hyN+ zCW$DDv6M((!aZME}iNh&icMcOeYzQ|#dn@0N#E*pL_EHwCR zRHld0t<}A(B?0m=Hw`}+Ynl3+kPVo6O*(n1r3yO~%oM{EPs*3WJz&3O5s*WWAjn}L z9b+zv;!8O4Y+H65o5EGx&|wEMFEcCIPx&bBg zoq3pXmK*^*6*sax#hHAFa*u3BoWzHbK2nQFF6+&hUl?F!gi&4X#qPpVu=Z;~*nG^c zW#7fuOHUSGFaNhr#@`?m;QtVYDTjfnoc}tS@XBLk5ej1EN@XL> zdEE<|dfIojF&g=rU-S{C8K!y038v@FlTlC29-&+QCLb(CKysw!SpXj2GRf-4s)4=8lPF)}mIt8f(bw5+pC zt1KA$PRb30m3#*h@qeXGLQaYnxO=$CoG+{oyeYnbPH|xk+ltR5hzZhU z6~-?%h|dZn06#k1tJV4(kkoCKIP@CZnci7WM&&&YSC-Nt;;vMQxB5GI26C&`%1_ zRpxc?8bu@bo6A^r+qB!oI?cPjb8B=Sb3=J_dY=id3_lUo7zWT~3SS|4Wtp9%a{gKyS zUzxw{$@}_#EIZ&M4lesTL=TX^i-;UA0NpA=4i zYyXz~BjIOb*}3w_s^Lajn?o092sw3Wb~ENBo<({{J;2WAd29?yN~K#79x4pgF3o!V z7eLP}&D<5Bj)PE^Rt@%J_Lp7kyxoEz0quU<{TF-&0tWoE{GkEF03ZLaJ|rLgAXKDG z*z3^ikp}@=dtUhKh{G|Bv8?DnF|@dilt<~@lsv$4-34b+)2`+*O#gY#&4)A`3PV zEsOlc#p0+9ZH^nOkzq{pqZE@;sk1<4^9DVRkwp&zTvPkVZ-{up)3vWaCrWPp&zj0= z`{I?k;5o}B{4!~&VJ>MVX8OUT(Zq$J!~yWY)xLp&{62E8N?%?Nx2wLD)pWJxL@Tt- ztG%?Xv;7W`!4|jfYi?<7Y3ywfHjo-qTCcQ9HKjGaZ}`#hueq|#tCiF=QQuqptgf=D zxizu1xz(<@vH4VcR|lj+*k06pvN^qTUpK7(<>2n&qodvvlT&@uMvHGSnYc_s0(G7n zAqs`;hI-4lsD^J$cf?(FF7)C`S`z%1uY zt^mJjHtk`?{>_b>jMBqXE~l~5t&)mk{>74_FGRG2O$D|12KzqredM#>UCZ&NJ;P4h zuEA=|;v;a=qndY`em5OAd0-S{@I_BcS5rGvt5xlova_O^A|CvAwxJ`HQQzcu$^htEmRQ+U+KSt9@xsLHw)x$2A#*2YyT{i@ z&?5>1ux^zOc1LGhc-MM&UHf2bP*ZQ+(Yn1&x0;8WgdMDo>z(Xgc$ZVx?JlW)#K@&_ z`*A*C_rTA5TijT5o$FXw#Wdii@BxIUWOI5Z=cd3#tOs$GDS(86q0%CmE6|Vd4u#Xo zTQ#UUmkruG?Uk6Vdl0LEQ!F_hs!6IE;lvzbk7q$ z8~&#PF8h7*+3)WcL=On^sqpv<5YwKz6uMsVYVfxTk`6i=x+nOx{{`O!;KV!`2o7NR zDhK!lqI})}8M1di5rG#1`huQ>X!-7U4|JJw+;E9^+-1Md-p8iHvH&?~=!c|QZZ~D> zX6bIzd9G5Sd`|I=EJ5&2qOA*+({dil#ul1R=u({Hy=()?|odXAlHjTdNCbi4; ze(%2Daj5N4r+gc;%d>xdXv@g`;qXbRsmpU|i<)!e^Qh&m^JiwuX9MTZ^D~&awOCRt zMHzQ{J(qZa5KibIm{M@SiT4ZR(T0ZTG6&8)38brU(B$dv^lU~gdx{SgpWSd3i~}vL zU`dx~566;qhhE35;RXwLgAgDU5LVPIag~~dPeH-5P^djLM*1-r26`?E7gtIwrN2Xp zAY9o4@Lf_QHhZWm_mCbm{I!$9xHE8$AYP3DHeSncB zjd7lFih{?!TR~wmSDyfTGpps1rLQ=Ez_{{yamQTAoZiyjrTdE&i@rDbw$B#7UaKd1*J4hCC3*;bC7G32Z;Zu3H_$LKdcu7nlb&k47$!F9tajaz4 z6Z#oiH~AD%4&S-ni(6PNSi;Wb&OV!Vn3kIAn?O$)0c`ooiP?$tF+YI3k~WAO*xk+R zGV5vU4DZ=JxMwJHD0JlZKt`WWe`mkz;L1?zkir0{&$7F;^C{3Fcs_P_s%d6yAq)6I zA6Wl`UnEV?SJ)-o1pYQ*rR0z_9G0QbqbQ|nqobjZH~eT^gan}hdL{avWr)=e>t352 z+dBI<4w24A&M%z`9bJH%ZK6}Q1K4iBMrbLrdT4#d24>5)O0|+h(M+>|Zd#^Mn68J` z8I1}hS2#?X0ICCMYlXsn{GWUk4uUa2A0{`FtMU9*nZ^5)Bcncp*@KjUwCm#mE4irm=$INdnu^UB<{Ormtb%Oc+Ll@cSX$crvyrwhcb#>IdwTj>_%r>zf>T3| z1j2&BVdp}Ag;GMxLX*PJMU^DHOMRE|C|xh9EOA$CQ7k*| zYK(7OVq|(yhW}Z=w19Abo>!MkqJ6o=L9-TPr15#fBJJ@vup)xGIt%#OSEK_VNocdhaJumtk_WR+>^m*$)AMi0?liwacSpcM46kr`d4=D-@ zh`bz~6h(}*iHL}lL~V_^9}^z^EG8`RPU?lUkEs{ZA7|a&WSq0H<>;on*(IB7wzh1s z-qN!vIMX8eWb81I5!Q$+9^_Je1wf?I90*>b}8X%(;X zL(OOnuIWLmM`LAucb!aaPK9qZtXj9iq2_hnk%r1D=L)mx=z9CcvSwlPwWjfAaPzOm z{`!)dMxcx4|L;XjY4xX?osIm~^!64Yz1`Z>*|65aY?E$_Ywv6acmL}9Fd_$>IkXjhc4dVp16Kqw~6F02&jpWTZ} zj){m1jX53hBK%U+-Dv0NxR__L8L{spsiA2h!r-Q0ctEU=iKmXoFArmv(~g@RP3@_+ z&urh?BwFcPnOf{ZCYuDB@{C3LIl3V_OWNb=Le&-JZuua@L)kAfEzlh34p|G?WofRI zqjW#yG^iG`1^id^V8chy%44ysSqEq<^Z}+DeV)Q3RudS+mt=L4BB74(l#sa=wYs#L zMVuz(17tXBVlCN$u)O9?0Fly3A4wa;U&NavHsvL4iq=JGC5nNm1eYX5StD&>Aox^4 ztMH)&0-6-%N(w-y0pebnC_wDWSKu8GJl()RTBIRRtXzg13049X%F-adpd9fPE|QzU zpJ1~DH6kq$N;J$L6*REqSV;b5mM`lP=Lai{auY}s`K~6dp~X3LeXCiy@_oU9$?{R8_TrwIpwosI>??2DC?^&<-f{WN_kBf2(4KJNyAfPb%TcnwWdnu$`&8vBWRn6dN>a08enP1u2-(t;hhN9 ztDMzUvO8yk2ib)E(FOq>a==Yny8C*Ziq*MUAL@Q{|#kmVBU`JK_o45)vccD|Q!$ftMs2 zAa^Nqu)BD(Bm%?*4EKd%XDNczb+MzwQKBqd1PmKY{=kNcNKL#6Yyx^AOqJY{>43dP zkYVp+55o?_c~D*0CizOa6gV1a`Ts@W;cAE%@D}OK;C}D}u%l#g!;Sw&#D(0H@&OM5 z=C51A5NG#9cgu>y}FT)_veTM!1z0nM7m&xv z%J_Zj%cKjW<9Ho>$lBYr-t}z+1BxT*3CWVag?*3j0NgfUGP~psD;3DULwGB1*97at z>R9Lp7*8YX%{ok?R%B9nahDwRX4Gx0JVdZ{BPA z&je*sY4A$_hhCzNK%-R^1*EG>pfUBqD$9gz7 zT*b8ZG<5pplQ#A zJj;yt7U;u?L0||$S`mIjAys)wHB+r$O+mX^m#z0f-_xMQ*xxwOz{*%`_6iNqn9WhB zOBT&{foPyj##_(4F1u+bsnAWxT$| zzUsld19!V`bxd~c8_^po95J8qo6EtP6K&}an0pv@tO#ZiFHH1MoFEI6zo8baBV~fK zK4lwa+hF<0%FsU7DbJzN-r70Q)ydv=Y7vtCYhws9sZ>u+XM_Ci)es%#P> zb|IoGY$+Jzf7%P>I$>>Mwp~A2vr1z?nJ#|~@fQLWKj-pUV~ljNBIVEWyRn?nSHMys zyqDIsxpS@sQ*TneQIT7g@Z;D|%i?>V+6qp-H+k#$K_lPrQ~CE>MW|BcANWst@6A4* z{_OGfzaNAz-TBYnhkeTX{N~%+?;*w6zeg)t%N@#(|IRF)`avjKDfwB-{G(U>xAAD( zdiTx#&Ar{-E`6Vez@ww%ano}1*RU2uKBb&~n4<^^l)}TWD??QYDp1u|T1O2?#($A` z^A$_6?Uelo=N6Atj|*O*USB+}dnmhPIe&5yyOw&6dEN8|`O5@Pg-S;n#BRi8$4e$biI$e}KJ0-9<8> zXc41vlb9-uBIf+^%F21{(){yim~jo?6~l5m8=ScKq-4a;0*eiiqmZzimqQ z{i*#GRyO|I=I^HR@rtVI3su!stu^{hhnx4d+jp>9b~QLw!)ou;KdYZ>scX5|{Hya^ z$8xiz(Z79vyG3_zUs>0l7R8o3?a7^bU0ZuC22BSgW8G8w(`RP9Ru1Fw`aCB6^+{{$=tTh3FRudlQa@+ zA*ChlAoWP2hFX_?w#K$Iu_v4=`FW@-PlG6(V1m{55ehQ$i=0tDzIE_F324?6vc@vj@(s z^Y-^0uR6In((JtKO6;FHc{*1)Iy;xT(42O;)VjI4-FM>Im)Pq&cBV5$A!eLj!{s2h!#{7qD|ai=E5wfLwIYaw_J|I-m52{DoXY0@IyYYs?I$ z0hi6Y&Dq7o5V}a6+yf#C;AGMOye!tdVwM^(3u&QsQ|oCMrXD{~>;kcussnopcXLg- z$5>;uGP)Vlo-N?baB!Rsz6v-QArC8;U4Yg?(m_HA2(%7~geXYm!Vm~+xgq&EdAQ;O z`9AnE+*7GeWlE(+wMivbEna<21FaWg{LiS-KvU06f6?H&;bFsE!wuu3hIU5pO?`~q z4MGej4F5Aas5_up4iMQCG=kLB)GU=Tl)| zUL(th+05C`@&x!^hUAyzB`S>`%-YO3%N8^J*bt5tdmBrK?ZErO9%Z2EhO9&EYwRgz z3FSIv5@@xR5cROj@*ntxT?Air6q8C1@DAq(#vvkiZ9`|h!Xia`4jTN zN{3Z-RdqGcI`Mk1bW068Q7>$C?G~&CtXpl3?dxpcSu;>C%=l<))Qs5zDiSqq`WvZ< z{9xE^5O1KYFQWt3e5X>VvRBzi{)vL0LX09!(O>SXqP6l}#B*q;Ob574cvW;sbW>C) zxdmRAphfRC()qK3V?tffD@YqiS`@=?;ra7BIpf?HJXel{zDhn$2_VViH`Z_9=W(Fb z+Ev5VBP;J#f|i;Wzb$WBIXmr>7n#EJ|%jOTvrz}oeTU-CL zI`6REX%z4V`q;`?zqI;_E<|zB=@uB&CFEz*ou(CLrlx;QPntY1-Y`}%erm8qTT1tW zo{657_HMN}WxP^@ys6A1NtHNRh~`TexzyW~z3boB5^xnu_ZNcZ^kyNGPlj)f^^d|w zU-ol4#=8{zKtuk++lQ7%8m7)pktTM`bkFH8d|58S7_FTpCQ%M>bT;CIXT+aCJ7rVh zrxm2sxmwTl+e~($YOK}(!c?l`X;+v>irYWW>%ROzUhv+KzoEpiny}=sYY~hH%gD5t zv#}*{nQ@!r@)L>sONd%i*5zkPo&@5LMWH;_C@{&isPGoP6LSEau7ay+|5-adSX{Pg)-@Q=Em zp1&Ua+WdD*<=z@pi(}hhOLyn>p@UP$XQdX`R}SJrh|{zL_6zoF{yao19Su`ba#VYx zNz#+(|2D2Lm$AsQ33B}Bvf`HNe!*jpZ;D@wXT3+f#~HUr9$DUczGwY>1JnV2GA{}i zdof-uPAeXq{63wTS)ESEoXASv4BmP_8=0-JMS5HMHuYT7ebomY4{-L0c7EHrwzF_s z;EtW!&gPuoT%55x{dzJt;ckp5#5zFeJ>z-Nslax_@|f94lSd{;&5oHVpwbPYnkA}- zfKbx)XT~36Io+|0p5`Q(EeU(52^ERYf^JhgH_eX${RI(wPyh8Vk|&a zgf{H1?`~ME9csAOY|~6`dfXJ;&;c~hK((qZsx9`7ZOzB)&(_%21vT2XgtmNY6}EOZ zE;ik5No}zLTKlNBjFvxbl>m>3*%sJ4H{?D_pMXrNPbf_2P5hnMIRuYhwe$>r8;zMjO!k>dqaWIQc4=|(c7E-w;1UF+qVIVf@vZdj z_a*sX41)NJyia;#-I;E;Jg<4=dhPSx=3(s)bLnvKcYN*G>2%xC)cTdhS&NJ2*US-C z>QzvaiYX8-`qg9|DuL4z!PzqFF!ccHisFzG2 zcth+hA&3r&ECfjIF`l;Y4|F1wTp5b;90v+eMuZjJ^crB5AX|F#ggJ# za5wSH_`CVlf|?C;$*Sb1#9D&p-(wtR5ZSvnsvtXL6=mOnQ^X9>aWO)C6`U*;2k?vf zM31=V*{>OUnLOTQwjxW&cui8qHm|;4*TJP>S5}vRIZpV}t$Fgy+wuRK+fBz0PVq{PW6vj{rL*tIAAprJ<>jTeqMTE_wwFl=SA4;o%vEsBjzHO zu_|0ETkFC?)>{b%L=xo!<0f-})h~E0IU?1DXjI6Sy8+EX48fz|Qt}rRTa}-yCThBA z_iFFgiPI(OzW|b#p=Nd{2eZfKC6>w7v36H%ldY9)8*HE2Njqmde{c$Sws*Piw#~E3 z=am19_a%>TuOc6q-&Map??Smjpb49aoSDMJ=5ug?PD8T z`*r8tZY3U9T=QJa9bP%E*vX(bp^<2aHN~>htiY@Sc@rfvYcV}+q-QXtTcMHw-!DZH zbqUqPQ#?6f7Suy8!;4pxmd)lf7f;SfO;?ZljTDTjjkk_#O_L^jMwb9bxNg625Z(=H z3U9CK?&z9rg|rg~mqyYieq)x%LPEo8#L~9;^rf}seajJqo5bAZud}}w4JfNX$NsB8 znODx#0+KYt>~d-Y?JNBY`Qn-*X)n8u_lIlD`pQoOgT$ZNHyESLCi-S_9x0rXL|!0e z(F55hIV}Qh;BWpza6}*$d4j|uWkE9UG4C#4PcX^T=gA5$N@Yrm#Z4R98%5#>&^=H9 zSVh(p@eKA``jX5H9IdoRO`xi%>Y$2K@6!0FnytF5c3QPq^@~b|qO1H%g(@XE6*J{9 zb&k5P@(X1n0o?*wnk*h}im;Hak@5vM3oAF=Hnxc3H;!|@@ed1d zyilGxyBWy7i3C;xJANixpXNz5q(YhQyfEM${s$hAmXRr!`V92aY^6fMD;wX05OF-f z;I0kLdT2pf2{4pMGZ?IK zrZT0TTtkcJ{9vZgt7v&tA2M^Dg;xS*J$95I#B{>Q8VX0prmwPbYS?+K>-smscd{iJ zOX;G>&|r*7`hRp4#xW+5>B~xFNjU0)lOnp*Pxy%ZU-=|>C8Ax?UF$#nCB1IF2YL*n zVW4Y|GsBxNS>Lg_V0qE%xz#;8Kl@4tXGfM}q0<(d!xpNj+o*o?s}{bNd{n&Yb5j|U zHC?ctpRS?y3!Pc5Y|TxY*VJw)FDV5nH7c1a?^fu5MakGgfTAG86?6-by!c4xORE9x zt!px!QvQ%*0Q1a*$K^P)Rv2mQd(2>Z0@;B$O}s(5M$w}w(ef#;3FlUiF552jFPvQ< z09Fn6W!lo2rIfkVY3&L9iL+zWf&M|vP~MQ?AaelR|FRF%59{&iTn#eZja=R*-!tSl`Oo&Jj7hZYPVnOa`WBJ(%#R# z&wBAaUxxC>+{P0o-%Uu(9bNjmL|Wotwh}Gqv7AQ0g?vGB6gngyp>Rayx9*6c#E@kY zXJ%qGYjeg?-Tjw`jpr+`Jl}dhi$IN#?_sWy6Jfm}9bp=g*vPHX4sl6wehFqt@ku*U zPp3Np=F#ZwH+SsYd3;y;j{F?~xeGhK<~+eyg`D;hj~YUqoWg&60?)erSzv6WjJLO zXUAuEY>LbRWw&MNXXa+;q_1Wk&K7Kbl&i3tlT)+xR_?8B5n0pePZGb!MCTcdzEC3%_&VEY7f@b*9_G_Yk${>Yr89p%R{PdYjkRtn#(%xbo6$V zbslXCX&P;Uwmol0_oj|S4&NSDn{b+Jm~NbR!+pbZ2o2Po>;xWK;4RjYx{F9vKCAAa z+hYu~Ot+78DfG4phzW)TTSY*kiz06Tt@`|g!1&_{hRM%Tmoi>vjHOXi(5au3&&7u) zeoxwykQjG0K|bMggeVZ}-{Gt0nd&9*>~;O<_}rG`fU$jQbJEekafkh)WgPk?nr5zq zECp1hD%PIVanuAXu4)j~YGr@<9Jxk#4|E#FlZ}SpK$?)tVh4^Z z^EU&>&}D{Fweg?u(u8`P3hp76jJdsRi+QlRxN3ttwI*H#(wn##ob#%~>PNsMhg=I@ z+q=%kd0}c+ZSd2?!xSu8lQ>Gk0j!jR`2B=-vh@E?w2X8%k}Kl=4HOL&cZ68((oWTCgQrhNdC8ixe8pXS@(>7gnpa;Z^KsxJ_byn z=?Vjk*HI`%b4T@VEtnyZ*UhTY z_fd~bzL^>tIT~*=zll^eh}XZQtE8T%{7?Cia=(13Od~7|j)WeD#e#gH2Y@ZDE{)wuW7rP>oc9p z1FNI!$s`ZzcU}#b%X%nSMUu#1s{YoK5$xZRQJPlDQy8w%Z z)1=L1{*yT+Wh(U#A_1>ROT(I>*CC6Le87gV33^p3PwKdIKUgfz7YB*|6MdGLf`>pB z;0K^sa1|H{Y6QiCPJx;r2f$y%E|PQNK+#R{FvuFj0H1)4LE8XN%7j9znz`mgLK9 zlqJgUO3xLT3VMnMfBoI|u^vLm1NMe9Hd7a_1lf%R-W9L82>(7e3$yGvgTpKwom5 zahmSW{LTsDU1eQix$@zHLhfdkBI_sMS@oj-pl@cmv9y_n^p9lg^$N`CWv|uq%h0)) z+2q;7^G)-I=Y{}p>E@Z7xi<@!7gFXuXFI0kCsal)#?DP%o=%&soj<;~eR&dlcl{Rb z^x9)=-%1sbojZ!Tvf79}xIRg2rsV=D9rmgTr0j=V$xvuq42dy=s zh0ulS%j;(vVhvmL$VMWQaMK1P6lH3bZ~WLK#RO&Ahx~{fL=KsZm|7W=|KG~fxvq6t z`IRa{HAUH2@weinQmvdTVi0Bv+l+V&+XcN0>?-lVJnuXdBx4D=3Qhv)L;67(P;L2t za(5MODx8u>Lz|>>fwzMJw92#vI-F_d5umHr&v0dza0tvrnl!MzJxz2W%;6$&dD!hM zKbK0E*x^Y@G3 z()(p2;9~h#in^+KYG2h{H6wH;^qv^(G6G&n^EK23)J?NoATxBv$N#>gJ!AhIpC zO0q;*AF=hZG&8@7@%d^VOCtr&XgAygxk-zrzDeN}Q&`cGjSG+I_#>OWAE z0LR2Ie=($Km&v)5DX}`JCb6vCbi_OeUgJuMZ6%+iVX)J%c?GWWBXy=uKCsVIH6|eU zSWMb<+q3MxIjlN$x)D8+e6@r0LkdI2LNp@kLMdT;V_qjbN;s47E50=TbsR1>J<%iO zS9(UecgB1sEgh0olo^&T%=F9PW~yb}PajD2ObkpU$3SA&qfsF+U!$<~M zbda&VVYya|cB-bD(i>6~0k=ANu;>cOG(Gb9Hs~bKB?U?Ih}&DX=WYqu4&ME7pY)-Rht>8!+FqC2y~}CW%Uz?}61HXMoXJv69gja1 z`!nibbWBu>|9jVPhxcX{MpcF-I*VFHnmH=@ik1qG;b#%%Fn36-^fUx2kY*cF*pw6? zZ+Vvb9Y47ihnrnKu;8;4xp;1#4A^Wm#$(3KC#5IDXXa-L+SG)nIECs(Z_k|7QOxlt2FW@n1mgu?E>{-I|`Np~~qR#YTDq zzc!!|(EzUgTw~h^z($%_0MWX!&b`5_@l_M8p{xPb@UePl?L>oA)4tZ{t$NM>THZEM znj=~RfXOF=)2Rv|Bs z`2PyJoA0mp_u>KV5kHM{6Up2sP!g^w2G0v-C?DX0t z+zw3B@}rffxV-gz!Vyv`X%HY7>Eb@)_5ul#kTnp#l#)Y@W*p)^69fwp8;ALS`Jo#Z zgwTY{M&+k+yG9=hBE&P?HtSwnQR6l9EXYmy&?L42mh+hm`9$%7Q>Rh_KFgRJuaP@aqcYf|t>}2V(?3Czy+G)Ez&aTDU(Q4UB+rHk(#To2&%iYKA zn=94js;v_`*)qrekj-hE~ccA{Yp3d7^w8;y!dUJY4RmN}x)m+!3fh ze7njy^-7Hhy>&e${V-jqc8e}cKi@E1J4f@1W`Pz*H(B$fR<@3|{z0R0O>cFw`dc-Q zS~vU`?3>)OlqWPo`Y;#uw={XwJRLWvsp8Q_5e^9%$x1qPf?^i7m(>Q7*!xSc#q zlQ2fsk+^$nyKrdYNBohsVUiEshCV|2h2M(rT+=7S6P^&U6m@DpbvLb-ozG3P&n|93qVpW7f`Ne`4pBjWE^g6Kf-@!T1xDcVsPqE4YKYg-W87 zQWY2@tWPXEx;DdSxBx-N!_27&Y9 zQ&FfmRE*rP6kCcv@S2(DXyMco@ukV2$)pLJu|K0D!=nCyzPsHfoye}Pu3?}F5!F@I!|GP-2 zSH`bn!&XM;R~N3&T8x|=P8zc85AKd?A8)(SG1)=v*wmii%4!a5v1yKLp6tx-Jv>x5 zL>)Ocqqyk1>Vd=J+6Z?@N66pl?p%`%Hz5nG4wX~v(;#U7XE=$>Ln~RW+EmzB+C6j< zI8{5{c0f6v2Ka)_Zb?3ZkYka~kvk%fL?L2M#Wg3OlD8$sCV)~trf*HVlUkZ_e=|QP zCFkGfI>5K}e#_lW*EY>&XKof{U(Ae13rfh3-<{-<7#{T}_;m35;6wiV{4D*+a__E~nRNnKq!Fea%Er04RsQ&$Y`rXn^!~Kg%z>=w43G5k^x}-V)Z~PVG4~=l;rqj^0@%LG{;7WI z?j9}~j$Atf4KiqbXGxawOtrZ2n2$=LvVt-yL+KXi$jIFyL@$} z?xjjgp-v0M3&q_nxI^6ClmGm~3^!ab%$#uEckky}>liu^{c*!+ePd-}^~s9UO6a=o z#(x_Z*KW_hnsJ-Ci@c4Dn>3m*85a!WdWSl0cHHbd)#2Ec(Dkb0Pv@U@Mq5F9ODD2Z zsbfp$)%Js}o&SzEoowO&494&EZgmBXvdzi=vVoo1yMHE4z`*P8zWTs=rABsR(mzO3 z;XitdSIfuN=2oL7WP??c_@7Iwde@&`xBde|pN6$Zd&i@vil;|rUoG0LPNMe_q{#;u z1^h}eM&`R>h-$0aDGi>EhanO^VWsGl=k~{Y2ha*@@m~+}4$lqW6!kq$DlsFWH0D{< zp>W@@>L{Q1`*9cI-T=Atvgm{1mZ85Q2vJSpxnU-uOF+Io)c3KkmmlA&-{ZU+%=IK- zAlhs9+wQ2%Ia^J;6}wdXy>?>6A;3-TZmgl#tdpgCL}yZqrCFi1u3n^0QnymMt3p+l zRd!VR4r`EV6NHFzMKuB-Rl<7B+Q;mtZKmyE?+~64zF?iFjFaL?Z*kE;o(4^T6WN4h zTqQaPV~K0S?n7@!hpaoS{8%+zpI^U^Hpl)YG?Aaso0wU&M%o^lHa&(GKrv^evY_-# zY8Q0}vzz%JOTu~1?&sA2%tdSNeQp*nRv-`=0J98h!2&mnbCx5+2Jz2w6&O2dlcaj; zcKQ#Rh_!{eiFKOcLYJdnAnYK=W7*4B*G{edUY%ZV!#u@212{?7mcOiJFCLwT&i$Nq zTpnI}J9m5DbTw%`eBb4nN zG)gfpGbu7QF`cxa|KA5_KWb-a=U^x8*zDxs6z_1&w%GQDgRYaE>mRRbp9#Mg{@#8K zKB3-+e0n{NJ@VZ8oC{oTxz2g0dpiQYoO|U;evsjjI1N97V?SIN-Yw84aL zGG}Ry5Lnq*RhjQKKWyD@z13XFqQZu3t%P`ES7rOt>b+IF71FBQYR&w;`8zXxV<|&x zBZ#q_!DXHM+WzXAs%EMLWoN}#u*U#VKvQ~I`Vpj7ItMZ=xh_tXNJ;*Rmc=i?0-!N? zLO92t6J+x@bF$e}%#So_+BnUL0j9T-o5}OUM_7xErgi4()XI@nhs9g-_hyS`24=s^ z+?dXsRiFO|w8qpYiDQvd_^FOblkuFPo`JK2uwlPJ*kC6>oj->Ro8eC`kGvf+9{SMh z*t5Mirgx*~TCd}P(_l2fXgoZ!f1(C?4ai(ynnx}lSoOm=;35foC|4NeoK~K(FkRTq z+ao9eLBOU`UNTI%NM%p;M>?%1ZZ=o|%)w{1vvl;dPHV`jBq-&} z$${HIDWZKmJiVFHPeT)=QPL;_RQ>9?<%XHP6Fw82WB5K)=az2UuJ_%q09pXNSE2vG zz~9ln@s7#h#j1s(g@RT1#!GYw{y)I~x}W-rImPZ4dP8=|!~s-oMXjCsX#JB0G~+K; z5r{m5ot=$SnG4=c)ng|x=OBCS_R9#OhZcn{M%u@%N886fPJkz&QWO$V38{$-iMGjV z!1gCG&3Ws!Z1bGi+`c@e9Da6iPEYnE@IGg!KTSWfc zJ=1X(F>e`bqNHP~o~f8Ba|ygl2p04+o>BE^PH2Vsk4VChX5U)R{yut_Z|6qqoyKSN zx;5Ih^*>j>?fRBqCiju~KKT8%w{h>kmY94xRO<2N+-IdvCyTY;?|IF7=l-s+II;Np zhu%*g-wnLK`mylC+Q*)>PpQ&dw*&BZvH#7;(KLL<@lc$)&31(Ee7q* zZJZ9ve#szud|>YDqWo$lI*KSmi{kVM-%07oNh{W>bZVyQT{8M$veV=?oNE$mDY5)% zqiF}V!#G{^(DMrP+3u$cSVAucfkLl@9t?XE`94Yz^(@Xf;XzzvT;wKk(vP(I^qc9k z>B5XlS<6|lEMf*E`+L4#f%%@o{TlmS_YCif+iAJIYlq{`h;7famABfZjBoyy5Epwk zUNb&FYCUL^*Hfnx_S+B)i#d}V1Elt4^$#lFm5dcbq0Q0}Qs=l8Y%SIw;xuj+JArj2 zT*jP6XP~#O9oQ&aZ(X^x(!Vq|OP=yW=1<&15@ubOA{KEoOB2pxkH@%UCgZf>ErXc; zoIYkhv-?p;Q|FG@iFE8H|*dSG}T^CnNtKrra)+N+_sr6{gZhGCQ z)adi~V(Vb{&8~u0bW=$)zx`1A`40Qm`lbslE$xM!$d2UpvaVYlcAf5h>OB@+O5KP0 zY5nK>8~e0-OnNU3Dvw)C|3uEuIxh_`bgxXJe6bhs@f1}iLO>ADNM1{GU~L*XMmx>U zT0e0F60?py_W!xL`9*jq`0fZf7SuCG@Hiw7S}C&%Et3|3_K8zPG6IOONTA0R&=i1d#(COrI+*#A4kc^S z{v)d6(($rb2h0j_8_^r(y`F~3U4Mr8i+5R3ow+s9KD+{Wpx^av>ecGe9KiM~^xYab zI4lbg6;=lYqweE*12F?%h9HAihV{pfjJuA#8l%sE=3-Z>uteM?ya;y_?T%i+byG%w zHxh<@g7<*Gi&r2}65jz=Nt2}yNfBi@A0pJRTZ0ha??f{nsA!m$zS z;Z5Nm!dk+9husQBggy#Khn@&x2aN`p_&*NV6}l&+(y!ZF#dFPF-ktAR2~3r8d_H?C z`hM{1@M-g0a-MQ3c1f~5X{BZR#oEqd)@lgRZvD@~*9>I*OS@V7x#nTDQPrLDL`VTB zL;!s8YdM$MtK{AENNOy)WNmOBznHuP8e1Oon{J!Zod_O2hjd2{kK~T(kCjf|9jP6A zGqY{t+^pVG+M?A8Z3T+yKz~{Ny!vS|cC7>-N0Q)*F}JCM3}24Bs7f>-SY|z;myml1 zTPPzGZOU=Lyd}rk%QfR(WNHCyh2!KwoC^9oW)h=GOwbq4xSwo&%F0!ArIkt-Vr zRe~OsD^=P8q_dP;yC1BH@TnOFY2C;MbCHNellv?;hKQ(Z_fRFpN%6o5(JdCW!84*eXhfjNNrhpxt4+xWBoexnK9fIEbpMbBe=u{cy4 z27>3|A*3nl1*Sjm3V%D_ULursmfr$o+%U3pij(Rwy18%%(`A#7<{sAnSxO^hZ8B}# z?K~Wc9TJ?Boc939iCs=mS990DE+MY^E($K!ozmTIdAK+=IPA0!w7F}$*UsMRsM$f| z4#N+|Z3f@;ob}Q))HS+wy0yzSO4YPfkrRE{R#eYGwaq*Dz1h_feH8_7qR*ZZZ{D18`bTVM;dKH-gqR)+DR-D{9MC zi^=o5<`2*FXUwKDCJ&A(k2a1Wht~%_^b32YyH|Q{^$2?|_oVc^>pRtl>O=J9cirni zclz~Q?lb8t>=Aa~>+2Do6HNG_YY$kW!d0u(>_9|+<9E&D4(6+Plc;TV}@ro!9 zGypjUodT?Qc%=x{ed?dJ|LV6Go&dOE4VHseE{I!*0YtIQBb)08ErhzwPlP7omkr%! z$@+`Ml3A?@&!`xXF* z`=^p7UQGgIizUvgJz9W$MrflPX0W)y!cYkh43hSi->nE%tI&xy7y&5kml6AHH4q3y z5kkkR(41?z!&cqlF_5Bu>+>x@F1R_wE&Oi8si-3{YtgvqZP6zpr(y*0@8c8_rjs6} z25nK!#AM}WZprY=^vULAU(Kn^a?DB1@6KvS_fOMEYKRv^ZwnvrcMXIDWV-)!S#dgL z-*3GcaoD0p@18zS`xHzcQX<|$e@e>499){2Qkqzs+&vmKp+A0QaJ4I{UABey??%&j z9kr^w>Uyn1bzc3g>ZxC>pP#Yv`~&gzR*N|hm$##RNI~>7>`dNX(LE`5*V*&hprRT3h~p~7{{L&`5J zC@;t{;85_(Kxuz?pdctPXf?nmU?ey%Tr2WNG&XuLUS-p(>)S($w?={OZRk&7&v zs+_nqDjv2Q)f%23ZXGb}G3<%$Ug%QqDe5&EXzpHXt!^D|N@_5yORU@Shxq4eok5*# zjj&3;Cib_{uiy&wFR4ms<%eGp-{QZPer*P}jSCegY6Aa8HbhsSuJNk7Rek7>UtMl( zW#yw9QnmD-ZFLdNmCgTk?e2B&-qiWGv$$ir^<>Ap4zmt^JHG|=FSz+-lU`FsOJsXd z+iI&`M_QL>&uU-)Fly{Iz*L``bf3DmB)i(Vb{q2#f13V=8!Xi*gOt6ds-a_Me9ZEp zouSiZhfPka?!MlQe%@hqF|3#)39(7yq(ey#n|CE=Ct{O-Y|Y(@-Ga!_%iyONZ7xf^ znshXQ4s_}Fh1i4+2Jeq}7%~%3A5iV@5#Z+`5BNR~IXc+)+6o+D&T>vqooAd!Z7*9* zSwFT~H{WE!H`;4J(Lb+iqhX=itZbm1q0ED^pg$EZ$@xGXz}CVDK?UHCjO4~JI*AuB z$n_rlRpJNiR=h9JXW4}#;H=T2)jO*n7Lc>Ng^e|DVET3rBgW;TkD~1XMok*J6<3RM zMb$0GubjmGA?T6TNcNOq3Y2sMUxcm43NWSE!?+ln4Blzn97ZT@@vW z-T}jB5-$wcF1XPNSk4PaFjHs#m6+=6jd=m*I=)i?T~T^9J+a#mkG8tDDeu=+=#b4cf-=+HQ0a5kle6 z^V#otPXsR9E8Hl)gUCqg3#1Sn1Ns6`kw!t!rL1M!U{%WQnk-EV%`2KI+KZZ&+A8`* z`uc`5@IYf3V?`6DiKF!uvq`Ce4dy}nUC1MW}V zAGq9digJx}J?VPcHO}42v(L5EBg4DKYmcwBmzT>i`(ZmJhhvV99ZMW`yW-trJ?A|4 zd)#zKI-Rplv5c|4XC7yQHz_kKHM20kZ}HIF#)4?1ucfEvt!fNCDwqXPrO$v#!ZLn2 zZxbhyp-(u9id()izc^Ph9k$dt^?0HXsXV!RTz>#Q=sRXR&73+kUW;6q^PY5{TbK?Q zc{^S^b$dEyOm}Q%TC`ZSbZ6<;dM@P$qk}Sy)1m!jYLKIeSga3`LBY^n80AbC_H#Z~ zaFe^2DNh@uHc{-z>cmjWPU;ob3H|}m56P6&LvSf54dN!XQv?j;dE41YfIhuN@IkUD zv4K#eAHXu@Qxpy;!eHBg)}EX~n_NEZo&s9=rADf@lI~3%q4rm82dy_+9BqgmNjF%# zUZY=~s<~f32)@_25DtSonupnBS&f+Fj?6NnZ3|aNV1F;)J%3%fdfsF@I)g57v3ADC6GcsMlYgBk=!UEN*Luo z;yg|kPsGCsW_Wen2Xq=>vb{mxOFoT1NQeOFSrPQ#Y%9(g_D?c`97HRp|D_uPrlhm< z4*D}Xm0`ma(Ao4zASqgC*CgviBvYwCTpdjcg=m(g4xX)NkG-ury1;Zpa))(bd-t z)3Y+FHtDu9La181+b1{$+i|R?5%$(s5D;4s;*k}|+R%E*GRpE8JXfz%kEi!gr&^7t z6suGSvjwt;KcFkJ7iG(2K0~j;v}JF~Xh3#K<$-=l%*2(#_kv}igIH6vF1`rtK-&TT z4g_Qk(gObyzvlO|%~?aVdzAaMe#SK89TUTnFfkMu`4OoHpNb8@+(s>}KU(!(ez*8& zzI!fi;m{&;;q{{FvhuPrFxQMoe0hsXcxWFzvMsXAfN(IWulH&K_+WkC}Fy zDVXt{$(VXJd3h{*?7;XZByC1@Aratq|HUm3ZtCX+O zs$FN80QWM#ZTZjkrQJgtB|D*AuH75Q^Ul`+YGJ3hollC7qd(l=JJ8oR3}`oact*Mx zxW0Eez5-=SG^mxW#uENE8RMs6AAt@udsq$)_S-sm#G7TShbwLjr> z-=*B?h<&reDYuuNY;UgbjR1I1LCEEhQ;|LK37cv*e@Vt9_ipY?I0hUdCNlb<)q@2+7#C$WE?9pAruzi?5E&k@3HRs z%~8ur27cENq*JT$M!8t#q;!HLh}T6|!yH@VuKrli2Ks;0v5&)#2j{zX{xfPm|97U= zu(s#d>2i&4b{}cQY9DewRenwXJp119ed7D)#qpm$moApLzpH<><#qMzH?I<2XTJ4$ zU;9z})6|EfA6|Z_{Rk_&{4MBf@Mr%oUSHyF8u zu0A@x+5SfUuLF7m%>zF8_)q&GXKApSo=mG_D|KBDOTDGl~(t zJ1i|g&!6N;alC9lYEubNyB-=wX?UpoQrIltAeSPW4l|MAfG4EPMF`jmSoLi%m1D`AoC$ukJru)7`(5f8$zp z+GksRJEPjSwtZ>GcBr;SwmoYV{4;O!>Im=r(M9Pj?6}@l*mJO_sQY5~_6|{(XZMqi z^secyJ)Jha=lTZ*wZ;x0p8^ihOLM1|Bx^@8T=EZUIenJ5SriAp3(c2nQ*=`^(*0r_ z3b1i07L!)(wmMF5XRy1r*LCj(U!Q=LKtzy2Kw!v1q+xV^tVTRMRxb8T?CFRzVW5!R zA@!kCZ5*%!!+g^9(P`I?0Xb4d#&i{2}8m?t`B3nfxrF1W11!g)Pgu!geWA6p<=lRez{jsr^vRR6C}jt4Y+@slBN8*?8P! ziep>_ED!X1ssM{OQTYl#PD}%d&bb>-cNCC=z zPrP4vZuLm>T=e@Gyco0`fc7);?)KF8zU-Uf5A(5gIp%2ZKz6Eh_I4_Ay9RU*b==

d8mQ6!tm@MdcRrzN&HK)6@Jg=j+SA#;)$P(4ImrUzUl&gaVsDkL1B zy_5?vfo)bHs?;cbRqX}%vUs&JMX~%Tg?5;d!XZU@h209F@_q`L3Wkaf0DI6{4W{C% z9HVkYK^}^bS%EA;6=3#K(cnEGU5U52nC~PS6kOn4VVg2g^d$0b(k)scu*F&ip1o1V zSE@ZJk2*vRpu8c^k|yb$^j9<=DwRrN|HpmB$zwm{)(eY;EYUO=Ds>bzASnWYA#|A_ zsGpo2)Bti*DqUhPniC!s>Iu$?mPA5;Uv)_g6JF&!=bsc_3s|$b%n?w%8?HO zry>h94(m^9!H;3CVr?)-&`ld6z!9jkac|uW)rWqEp24z-TBI4w3k;f=O!r`@)2TE? z=4aLf&6D+900s3!=yDCpp2~MshBRFbKblmT-Lo>X)&%ZMwq^%Sbxm)YvMv5tAF`ge zRdUpG{ORz=dAG|K=STMH)^e5v%Rkn;EZ><#8SxAW2C4e*bxZVXb)r;dl|z&rl-UaY z3U&%m*cz-Jb^|Ievo3Q^x>ow8jHz@F#1ecPG!0r5NeRwz>C8KvVPG<(D#jfDr5_EYM2ew>Fy+}#xhOtXxCkDU6Ul3+{!zzh zWa_l&AoZ(^H^DWH!A6^nI^p3aN6a3Wqs=c`ezxcUZa6H93M(_~0~WgG$1TmR4Qp#vq3&;)e6Jdq0fp5t=PTfXI!@FT? zv78O+V))|Dg~ZwYqXt6`!?8n{A%nrD0n_2|!7n}M`bP$qhNg$5M@L2z$IC_)rf#nc zuk6BzHikFW$PZ~c^s}r@oS#B#>78;S#cS#}b?e}Gi?fzbtYi_Zi1W7JZ132rJKuIT zcUAZ5^7RRVhxtb=goQ_PBKYA`k&mLp@lO-Mo6-_rC7GtUreDoiOSjEJWbesI$x2Lr zzU5N#p3O&7uWWshVVu6c6`gL9?wFRixhwfqQd{if*qLydz~jMS{~zA%?uYHeZL2NU z;OoY_w67^=DsVvFd{?$9WgHug+Oqs;89E;~t}y{0g7?LB?`R}96gRZ}L01W@Sv3c0 z3#!V0-TQv|$I5q|Z{#njWyDhVvY#IW#pSR2Ua5b4@$vU3gUWG#RxVZwFd=1M~f7hOEZlAP>*fF2FaU za9NalYzslE=%192g1fS@xwmF*Hg*#*lT=$IZD%kmD z$J=~`ox!`?_I%n~y?bi`WG8dSP{GH7OFO>ht)zpuwx?hdyb~_P6Cy8!@qr-JbtxHI?}%r%S*=J49W;`RBux&9f` z1=pnqbJyl5(>hbjXrV($j4eo2^gK)LK;Mnfi z<8;LHtM7Z?3?Gr-i=bO!;3(R+U{KjH2uhMr>O=v%<_kqrD3i%p95{3fzSuCZ7=1bS7lE?{U7^$9giG;l|wz=LFCuvuBSn?lWl&Gj<}- zp*{l|lGqDd1ofO|P9e{fTgPqZpxE8Oq~WmWn8*Ok0c%U-fteDDCL$jqd$G1NPBXW$ z&XDqmRJ;pz0(BgP!5l{gZRBmtFT~8_miMiw11XoHrHVQKX*uNX$;}gT6XR2|vvt$9 z3#GFv$k6HkW_M4OPW_xG&YfJmznTRYNjG7y6Gb$6+EaQ8<1RgrK2BYrn$z|IR?=WT zTj&k4fh<9SWcR`T%9X;n3Q~%<6kC)(s5q-@YH_rj^>U0T@D0m(%PGryh!!hVOLxn& z*557L&BHC)&15&T-lKwau_NyqtAKrgzL~f}xH269sN$R8&9_%IgASAIf>7SV|xOGA~zA~qbJwcqJGhL-dFk*-G*|B@`6#$_Te&EW$by8y7V4tvE-{H z8Q8?-3xxo656Q}A__7SSWn4LyKTV%lO{5TtupEpXrVVR?c>(O9O|i20Ou{6Vxp506 zz|`VgFoOV%OKRi6%Fp$=jhCxFOD7hsSDn@m;Noyt{46P*)I;Wzoyd*k&wyFSiTs+P zK=q>?@Y2^FtO$OBwqI4k5PkHgsE_ z{cgKEHg6F-tU#9Utfy^7c2{h2&Ci%tnek0AMzY4aa9^Dk)g<+JH9GJK$W$y;L8u&1 zK*)v59)ld0!{7Ljcz zfjC$6QS1rKZnOkbPq;}Y5G&B!wXT)2d6St1g~tGY*#D}PO1L-w^)nn=u(;rMc9=n0g)L>Bfk z&Iz?+Qum?q=_a^%e#O zMo^<+aR+1UqWRH#W3uAT#$yta;+x_oV(sIK60#FcZMp~SahNIYDQLi2rj_cRygNxI zg_RPNnw-38^S$J~n-9hpM#@AEhZ*<_y-#|lxaGK9uyeA#VJ@ZrPmiLZrUa9H0Qtkm z(o`w_ggY1o)PV)bWY6f@#N&}OJ(Qll7HYFq^H9Tq22l;HQuOosZ=>?6pYB!SpJ|m7 zm9{_azO|R^_*nUVSIM!GoyE7_J$Nhgk@@jcS?-VaF9zR=zPv6Ke_s5``8M;7@*}Nc z?zi`M^KbusA1IHjI#BPDT8DvOehp~dXqq`Y}N@kk;kVP_gXb257%XJ^jlY@f`HjGpxA zt@kogGTbwn>51tVvyNvqWod84rxKIDC3VCWL|8`T2Y>ZH>ucgM>b&5nZrf#JZdGJz zXxyoLPF*bTB6A!(2u({qo@{Mw-e~#Uez9k^|6|{_eo=pVAGPO6x2Tiat3KF2R6U$Fs*L2!L@ySs zyhG{Y67g747rBoX2N2|fg|^aU*|SP}wD^XlfZw>xI@9i*{cGnCH@e3k-@*{RC}yN) zWLR{5%=V~%k;fy8BRiwMMY@F*gpy7LvM&`S_E#al$Ur zar`j?hGaVD$z?A46>k@Frxy`>QEauMx)~SOWSxK!{^|<&@lW<;$@ToV6GHm zx8t<&78van{*2P(jghk9JEMIgE68utDzh1LCy`^rT>xoBA2~B4nm3;NI*XZOPyaVp zw%EP$d-dje82ZkJWaZVe@@o7#9vy)XAf2Tvux&X_{6%5DXdkFprc@Rt_gZcZu)KX# zDpJqXApqp2TKE-<5a7%sW#(;q#4On2IznuJ-qFK};lgvb@cQWO>Qm$)b}4b&>+bBm z+c(uW#$PWmJ=iIn9pxE)II2A2Ww>cM1xlrO?JGaxuvF6eDAEM$A2jQ+@HGr=dtQiVPEd>&UV52zGbcH zwAnq=7w{;3p2{PbtQ-P*1nMQKVAl)3@lS9dR1Rtx!@|D7>7(lwzs^`pejVR5G}61T z57dhpLJgR;<+LYv-5dHa@n`(guw#En|NG&Ep}-OExr58IOIK#t0R0HA(u&9)vpX8?HLV&&|LwQnVMfI>so0`3*hDN;F zZq@HV!k48krPZY#q*0}!sTQNoRQaLmuAC}A0Sl2cfw5#4A%#7&m5@WIBxW18h;xNi$H-!eY34LPMmoKVLZ-fDZ{eNgq_Xq4 zhlQ6#0+An>0eU8h5s^g>p#9PWDU3K!;tB4PIV77Sw_71ffdG9bLj!{(h2mzBu}B~! z3%81eqI|#_dLGCi6|*R;2P_SGKhc2@NUo;VFsE2?%wLQ)fX@Atwud3jkfOdLydzW) zUr`Q_u42paIASX$itb5$L3%}rrGr^3z!q77o5_vmp5a~*!o*aFHLO~3uZl$Nr`AiI zMg4n5hNe98!=^io!{BMA%GM7MOEy!svWPRbO?KbyuG?!lEjhJ2?Q_}TTIV=va|NM~ zh(e552~9WPXABDgGljoVyIzZSvi1uNcMXQhu%e|R2&N)?4O%Jds{n!x$(TuBlzt)W zE*mIg3h@W5Iyc0F!f4@$00sP|1AG~ti2syt#f{?_v;SjxuujumY0rW7+ySzH>_&LL zadf?9nZC$d@?K^GHdFp=^8CLUG?F(pI~6hw1qdoFV-Y}ecl)U0m}qokD5{^;^QG6k z`&q}?c43=$hg|!`HtA0Fp7Y)R`lE(s2W>_QNAHfD9ts^A8v>1nOn|3%&F0M;FQ#qq z@Fyw7>_zrfo-O|lzXK=`$ANpG4CrbA9| zb*|NzRjCEiY`2B7#hCRGYeP$Ss~48~i2Vp8!paV7y9cpi9s_SS^f&ya^F{5L+KO6+ z+IwXtEJfy)OojAANjk_(V$0n{&n4O58aD_lkhS1dkCmfKKj-7;-p)8qg!NIoBYHNv zXSx%CF0@sr{Ls*N@x-;M*HZ@5JE#8xdLIhY+?hAiQS)clHWS=gpLlK(H>oX9p?s*4 zjp{*l9j))$>pCQTsxi$h5h1WGbqKN7v#WHF2f$}1T+X_tdsF?I{L2IO2P_3uhFlAO z8MPP{5>*p*C#EpwN{o8klT9a+my`52W0Mt9I?`^Y?MWF-kxBJW(@OD4aZ7dEf=}PE z1)jP;o*14KcF!-(eXoa-i;lxb%P5m&y%t@6y(D$M+)uzl_ngOJW9bKRqbqlocg|m* zs+*h{sO(H>2e~=e4D`qdR~1^b9SI=g#9d_(T)>QO-WDGCiIQZth=7Gj+2KY0x@N^)%cU{DXj&SQu!n(19VWRCro8OVb-z@ zSRITf^gd!CJ`tC){&J;%v2VeC>B8Lmh3!i=b1`%OrcKA8eqg+@~Qe!^SHsT z1=LdB=+_{st*E_IXY+5dF|z4;^NA+GKmI?vX5Du4_Vdk$n!Q^6Ti>@HY%6JV@AB<- z?tI*Ssjajnpw+ZPuS2IxvCFZ$rT^}T&V+Exd;Hy${d~#N>s11}5T8H}VrDS)*qQ=$ zFbo~qwu7>oGGgz>mn@tLvr zW1OQG!uEx!g*!)NgjWWt_@@La`cHWedvaV`oOd}lyS{hTb>TQ0JDjpFa8z;#0=SoSWJz@C2E^13O^yu-Z3Y{}%aUV(O`_G4f-##VDxGgm&Y)GSYvb&{Kw*$1)` zI|vN~HN1ap5xa+##Gd3S@z1l1Xj8O!E|PPO1*UWpE|Po*zQk3631uHJ%Z?`9Bv5e8 zz|w_Cy-6$~coLDscuE4jp0mhz7FYaz|GF@o50UN`0 z<_XR@{-j`r|AgnxLkJbb9Km&dxwsxA68NgTKY&CRqV0J)p zj5o#|Aq>?HS@m!3-#*R?#nYJf7t+(Bz% zF9IE%c)SN$fi=u(r=#fdEP0-z*hMN;+EB(^cAuPr0!>k(6s`umQ+0kB5DlH-D3c#% zH!R;EV(ir&v>e@?rksP^pdMNtFqfSUm+kuPN*&eRUVA?9y5vRmiS^?Im<7)V-w4hK zi1ruwNc)a@hkMC;-}M;qD)!Ov;rs6KJ?~@aY3!Eo!FL;Rx^4H~PS$?H=DcH>%V+l^ z?(rTZud^38(tm!ycEoUKty?@`Ied0VZ}jgZ9;rDlKWQ*N zH#Rkf8MPfhJ0_gbTlHQ`U-v^;neh?lN{ZTrUZv!lRKG-Cf&{i;heYkT5wi^rn<8;6Dii4+$59t6~L^x@1J8C7R}Ev-D~5WH)RaZk^1d>?fYZ zsS#d~?@~<3U=o=4j4Y&CkwdX**u(fmG<(e(^9LJ`GG7yHyaBQ_B*GK&F5)Uho8C!# z%*bF}dG^3(G){9=)5dj(-{a}dEm=sWDN zH*osnTIELc$aeeacGtt$UCGJa{)7YE(ZE*6#?_+5XwYoNl%VrNgP^UbyPzqf7OkeI zMpkH+F$avvr=)!#&p}3zZb%`d1e^*{lnNJ4@&eh`w4L+=96A1OPAm)9hjG!&av&A{ zi@KfVO^L+DVysZNmY&X6&SRIhZm6&K0j8U1RPkEs!sVHXsfIC^@yinp$oG@UW8>p{ z$KQ-y9DP1IGdwbKV?r=mI{2sGY9M`(G`KvZJa%-HH|jaT8mk`F9NjYVb|hqsG_fBk zK+>k;=Q#78i>6EG7k(@{uC}e8KpnuTkss2HX-t|5Z;#|GbhDhce3K$g?StlwMwB*E z-vKUTZew-SI^FiIW3#igYrIRP%b5EX&p3~L9vz;O9#_1sdcF4w^}X+P-gBQ%v6rWp zuBWY=zI%&1*~Q1Xz}3u!ZX0ZU#p<}_TljxQK_)OmhTeqM8TAb%A?yrH7m^J!7Syx< zagH*vq-E6ICGk9c>Dto7Y{!($g#D<`@R?z^;hKT_16%v{_oVlo8CD(H)&IC}c~Crc ze<^06cZ!BAo!_zgaix5v4Ld>?vJzM-A`PhpnFFv*a#Y2qTBgP$W`dZYJ)#y?^;c`0EDafin+0{BAUHQ-9+9OaBRZ#Ta`^ZxvM z-iJ+P+saBx-Iq z2It4J=h9ZLpo6e~aV*j`rnVpz>?})CbX0n-s-Sn(=$pxDvjU5A)~9W)9L_t0I@UNP zyU2M&_+&(2Ir?~;S$=SMTV~LVY{;|&@zegKKg2E$$ zC_aInC2lsZiVkes-GC=+zeS44TmA1^c`8NnveGQ^JMj|W=KRIYWWA=V(@B&ffJKVK zO`%?*x^Z8LugIR%P2@V_7V-`ZbN$WQ?DEX=-Idg}1%St%wBWI5y6|dRb$ajA_}G6# zH~T={2Rm!K{d+I=7xasJ_}!no=UXzpoqjv^8}H_x|o$0KCXP zeR2Oko(&od-UW8L3qu}5rsHtr;&lA-hmBW2t15+YU+5)nk^F{?Nb5i!Dm~C~Ga0ww zSO?nfwCi`$byIdb=9=kM7Z?(H4bU>9BSNFgH*HQdNjMV~99bKEHR@yNuiyhg zk%4aho4vg~YTN?c#$4XHbhym99(M6^EU?Y9(nk1OyISg*sloTdxkkzQZMxk65mp(n zE*(-&Q2nafp`0oI9R^k~k$Wz?EQ^KSgMO5DgZvOZ19nbSCWy7fQe@tyrjv;j9yy5E zLflLEg4e>e0r}w{XaV{dMCD4Q*89di8o0N*lPbC8PAPcwlya3sV3P za35nM@t?4{C?I!?QN#}uYf06Bo7IZ=fP9(iOa4od&=1fiNbm4TxMw&$qBI3g0p81W z0`UTVf|yIDQatF77JFrtYtaw2MqN=1Nt=q2spI(9?+$i6q-Mq+R*@9x8V{T;)xASwXa4L43 z13puME@0r6lctONKP5%M!Jsz4K zTRr}IzwrYHCi(n!({Zl@8ugmq%O1L3Q*J+8uDL>7L~c_a8D865p^n>}5}g$7&zM)k z{~8P6-DY$PJqt~9w5f&(297d{)NfHvl`~ctlGz0A{~tqV8P;U`hvAI{jIPn$-QC>? z5()xhi~U;IzSe7Z>t96ykyN_7q+xW|HU?wez5jFYZO6eU*nL0G?{{72$sOV>3vY3n zxFhrp(&{#9!*>1M((C2OCFyw=KyAB!0zJyL9RREMC@I+PiFnQQ9;j*l+vbf8yT|(&)cvU1WE{JzAvjlK2Sd8dsSU z#tY_O6Mp1f7MOB+DP)osC7%YRiK$P3=Y^k?SeidmkJ-WyGaVVPn1M_R^(?g>VCxmL zLRqD35Rj*@WZhzu+0sCB48}tOX1WvnD?)E^95@DiS!5x)FIEG6g+QU2Fi98@!i7O# zk0Jj-+n|b)NpM#<5-|YZ1-k~pN$!z8Cs{5X4zM9K<+c#dWwew|%9g<0A?_005<4I< zAY)((W5i!&zYwf|M#OBfoX}BtSD3|xbM7+E(B$d=QeQ9+viQu?%;)s?bUEfQt(yLu ziX^xZ(+EgH(^lJ-3dx2%LmH!fW1ZlxaQ)e2u0B8qnB+X<*l^Xk|6`qEeG%ou`@n3` zH6cl00ni~0B2kcvvTVZ?oeP(s7@3*wV4{mrV)O-uncW>XsfY3uUVFTnosmB^w-()KW0={UM0 zlfq(fwYaO?vw~^C15g*NUZzVaUfDtAvYNZLyFr#op}D(7pGmCYm?6f@$l|&Q)8vLl zorS)&yRDhce>M*sh8=*8n4OZ1n`Ma=#=6N8Wa(+uZk}w^paEk%O80k23TLXU$(Md=`%#5MSBxR-=1hy^+f>J$Iv?qQwfsB?T+ za?E-9F9w+v&wR@S(f$BDsVJI&))2NbB%N$VX2vRqO~)uxgxSS; z+N{xh=gJBiI@b-38wZ$cSX$U8Iq!9$x+pr) zozTuX&a>{*UaekhKH$LKprGKhp~ph6hZ#iQiSgcH7q_zGew;)6w*-Y&62h9WdUWCrH;jm zzqCu0O65zrW$#K3{t7CrFTPsv;%9R%CMV@v#TV2!p91&d{L-dB{67Yzb7k~D{E|mS zeZ}WXT1$HWkbW1I_WV9w;ajt__C%dt!{NHx7GC#Q|M%g}F{^38LKphcb|v*O1I785 ze~w4wi^ZzY!%{Sv1;uD}9o;^|d}9wYqGgtSh7;W-$Gy?>i5J;(r%!}Wmye@=Lf~3} zao~aAiJ;)13P57{I))H46+Ir4w9_mpF~uq4*4~>L6B&OpBM-J8{&P6%Fze9qtScwA zPIMiAcv9n($4Sxg>|@We;74cozfJQ53>%PST7p(=QiMeCoKLoAu}opp6kb#lF+d82W( z3Dg+d#AwOw80#(Uo$IUXE^2jbW487*D|Whes+s_S1)_ zUM+Ih6ERMk8QZ1AMp`z_pOxQ+Gbdeef$aLl7 ziVx+3Wjp2S6b+O@6z(hODUZv?NFS9Nk+O%{LH2-|LI-{f;7C5fOkoZ%_1Wi{X3UdZ zSMGk+UHTS%Km7-zko}6oVcD?)m^zFarYj?fwnCK#h|zQskr+ySPn)GfnQs^|3}0ph z*Ib~$cM%|k17f1+fPf{Czq9M;Q;ZJkZ%PF7Fg=huMo?|g< z_04j@5@VTW3AePiU|R&4kDBEIdwsf<$h^n&p7A~7e!c6OaT=Ox(<(WNRSFE{EaeoX zPx7}AHzh-)@&J2-8*C10FOXxbkhquvd=wsmx7ZwCQdqn`k6L-VvNq!l%uC;m}J;W(OCh-L!17Ecjx{1V3;AgjNw{LA#;E9AYM1U8$d3EzD zVK3F0`h{#vIYd)ujsmQ71GW_ZqCko>$tvc35fusL047#2vxg?f+RN2upJ7~KFqp;c zUKW}Dm~xF6L3pvHO_(9n6RvMVaX8!-HXN`?J;$j7EwDK3=dGKY^|+@P;raqv76ZjS z-ym-2Y!7e8l7fI8A(Z+9_sa}*@MA*TZ(0M6u1P3uA^$O8083n~i1c35HWrBaj*MZ!Wkl(=D z%iqEEXWeI8^Vs|XfFiZbe$1F+4KoX9dgLl%81)T=9u$!b8n`V zrglydrWrFGGo4d+CIl1uGp*BQvriXv7tbx-S-Q6DyXv)`fDPTevi*XrLfc?x3f+X2 z;x>39;(szd^5KfNRG%X0NP?!b&Y~7aQ(d!6i)~nHmTW09lQONh-mtN;{>O@MNwa=! z6=i|3cm$Ax)UAB1<*j|~pV}4Kcv$l-4q7OfA2yNJmDZ?L@6-&}$X59!@1Y>CT(0<0 zavMA|5DW)GAiuL?V|sMjoFW-3_SbG z8de-%9bFrV9!eWwqnu~b=Yr-Y=6@_5Uj?t3;35ewlxoHYb{8KDhsqsPoJ1yRVRVif z44OokJ~7XRL@ zR)^a5YJ)n_Z=d3ee|A^g{3Bb%s;a1X_~%c_?xKH+{{DLS)39)7-nSgDkA<)AzAOLV zkvxS$yAr*U4@L3?kMejwOMiJ3*8V#FtD{JCByqHd$6VEhF$e`o~J^p%hGTS?Q zFZY%8PIM_Z+Sk2k_*es}k*h1OJ6?0NuBh%}jcj#U!;ZES01t7o!K7BE-lj3P=1KjH z=9-3p>bh!CCA13MWY`LAZf+5^o@sv8n%h0sB?xGX$@%e>B#Jz8{`g4PKnoe_=jW-=4alzkO3Zm)WC5vQ}X{R?NC$K(AVLc z*jX>x+q)1vqY(nRVn1j9(&@9KJwPnJ3GgVN zSQ1V5ns5x(bmI)G^)rD!@JF>ozz&@!n}s+g83^xybbz0N1_2U#I>($*MN0zu%l6yj zTh>_ITE?2~s=)$(4hbZPv1^rU^~;3C`}4%PglW=5@zmht%y_}X&8f8MZ?jhOE(^bx z_0|klJyt@OBIiq%a+jYkZ!QhZhb-J#%vn}hOF`Rj_~K9E>j)popUD)0V0$ONm=H+w zU@Wn5Y!K%PYd5ot)xf#U{lVw(DmWjwjyw$K1;>py#(l{RWwY3QLM8Bfv5>FM&El?d z4za}yJ-RE^fb2-!PecG6nb%m4%{ct+>6LHzSGqq${N31Rvr(3W{397-#FT ztvNTi!5kbnM~stLhtEjM$~=}*kPMaK$X{28RI*jARpV)E>$d2C^iCUIG+i?PV7c3B z-fF=r%|`5S!1bhCjQbtu9}aM*C6{)$NjD;}$=dJ=@~!dn_mlGd$4@O#&i}E$y`PT% zVj$EX<7esz^PBSlFuXou&r@!@oiQ#(&i9>fxEi}jx}J8~;}q-AVt>=F&i06Pw#^ND zH>X?n`F7tOeQoQkj$8gRKWjdxm#1}7b06|G(oH#4eqBlv_8IX7p(&LHJ;W0+U(r%& z?KCd#;ClGlzLk7j$?A{k&dI8&%d>qG$5HX4#>2!B#R0_u1WIq%ZAhVSZtUk=&BXPw zH)D&FxP{C$#KvyCXv1Xn4w#TClK~6MxoL?YR6zK@&`0c=!o&s(W8;GoVsiG>lBJ3UXIrJ}FUA9C1jQly-CkO<5 z4hom~SE*U~n9`K;7xfSwx)wvjTOF<$r{%3tr6Ex6Q97(tF1L+1FC8t%lrfWr0&O2% zg>d;CgbgAZV1SFHL*aL!zLFHE0=OA;T9hUb@jmk(iiY?PS?3uI%+Cw~;~r~}lgB;7 zl4Bj_-V;Rf*16_A5BdQX0i+aJ&0apYa>JKlFmXo<6c@R?npV^$OjIv4>^KI!AY8NHQ){ z86*M8kLbI#d(&v6WZhvEykxa5!a&xH*7UHau}(PI%|&cJ)(>lddxxWL%HUpZT_-xz zG^rBX4~dVd9?V6C6#tooBw|cb8zv>ItB6r{Q1w;!(}Nnq^l)ltl~<9Wn#c5%jeN|$ zTYfQrYMyHGpM|se1v6XI4O3aOK%-Ck^7sGGwDZ& zgVN^G2N4iyE&_vCmcA{`lNy6bz%D~CO4vzELuOzk=n$+PCIc-6!$7x%9sDo68ZM6K z!_(!z=Tx&Y*{^8tDXMf4{Td~7y9Iw{`xM>)!(R-YPhQx+*tmRkMQSN-;eYeBiw73- z7pE4|=F+EMPd}NIM70l1^j8n550?)~4FvU_8fY7I9`+n99oZPUGo&zp89!x*Dj(;0I&^H{4FK%!vO_M!EEc60W~=*#*pe@bNh!TQp?9SulA=M8?Ba|<$YJX$9gP=p7;6p`48ep z;iCp)e&aGTmP__%&#iFcD)l+z8Do)iQ20>dfXseb6?uQv=i1*5#738l4gr?4IP-X` zGHV~ZMAr+R1TVawP0+89#Sr`Oib(sIrkICu#JJvQ@2K?X?j3t~?@0fY5u3iWrywIK zvop1R7h{)E(#s^nI)0uqE*iTyNbAw;{LxHlY-mw$b#17uYp-7TolxYL zU;6|3Q?~G4LCLp^U(0@E749qPEB#cq_VY(>Pd+SHEtgklRe0+cC+}4xcWP_XR2S;U8+6ZB-Jt2@~b(p?L})++tseL-k~AN_^Ih{^RmlX*t-N{ z(sc%nyPvlX^yK=b5eit9KWhFuw)*dk>&*1bfmW^SL$|l?bRX$}?4T3CJ?s{a3_Bhr z9rZEXIU+UWLC7{RaR`Z0PrR8ro8p9IsHBnvh4>rMKVu%m91R!vC3+Y+7u#6aI#|w{d^J+i z8`e-&J});Y^8oRWdwv3Z3p19 z>+2s@3|G~b)d2JG;F9SgX!gxa?}Fj#`Q^M7gViImA0`(kca2E_InKRZL!Bw@25qk! zM;f+T)!MjiyPKVADypfKtO{Cfbi<>j*`~H8`#Qg>{2FWx9!OF7)|of-);HB}SLK$I z>P=chn~hp~+oT&m)oC=a>$@8zTNT?+wuiJkbg6XlJ18AHx^;Tedd&Y;^#3zxGP-B# z))aK^-byvLY^#g#hIR;WKNtg6`8C*}%(~JcWR(ug?1K4Mlegx!2O_l^i411je6KwFl^I~|ayfm%{S6dJXv_f_zgVEf| z-kjXX#QnqpE9fQR;{JK??5`=|wE2|GwEg5M)c3JxqY9|`5&O}LsEx_Jlc#1L&TcH6 zS^c_t7`=$@-%QvH*v#AdzIA$gj&z5*gYu0UOb4;ga$Yj)8Aj}GUY%G6b_G5vwNo}u zu~wO*qO2aGc3R^OTzn(*J~eJUoXGozTw_Ao?N$5FE#H=igQ0zf> zp6!0!|79?6(l+RK-X&>NKjSpE-yanIDiIoER%!Ek~=a#bEzz76ByiO$-Fb zCx?>GZ@c4?Fm?FLBqZ68YQX4bcrzl|B!-Y;MgEtlLCC@DP_EK^SRWZoR+(7c+hr(H2vCtBH1lk~F zBO@#IPTEbeNa?oxK^aF`fxH&rNR3lbQdCxGQ~Xa!17IS~s~u45QA^Z$Y;f2p&*+80 zQyq}@mbRXjK<$E>tD2z-OyQl}1;ufsf>w-LlfpkrT}lrXg5)%%m!-c+-;ox`gd$?# zj*?KxTIha>3b2&~Tin2#Vv(7r`Ikhg!Wp5OK$4#%7~uPIN|*!m^NgLGY+i{V8>|Bz z0y&8Oh)O{v63@VOqE)_+$XsFu2qmjYv;!Ly6kI5MMDC-koXla#VF^9)Pw^D!g;0kZ z#WfMN3k&%FaMjs+*#x#1%ZR1K*~JQF`~mC{r9@|91~Bp7jjP5vZ++Q(vH`{115EPq zYnRYMAm^rqJ&EhVIb(lql;PfBRj_yrcjE#6E%6GelwwErCDKW3z{OF{(ieJzyd=(o z)uA;AgkrDa9VMFjq(+GvLQSaFrUTcbY7S{(^yPJfb&z^z^hkzeLp!6##xD%B3{CI}h$dIydU(@^(Ot|-cc!o2U2!IIMo7`=`b zW4~>$Qm!)o$Fksl<+gR<=d@*2h#O{P@ShelaOrp98UJNi9Z_3A7& zqUsGrH90>iZTJ!J4so*3nwP|6kudnn_)bDRo`U(l1e$$06+7Vqyup*k|Ddjp!iMKZ zqsOv_9EL|mt`FZEQX79e{d*R-uydtpeHoj)^_74i6_PVp%X}0#8|n&Img`WqRKK8Q zs;_UvGk$G$z#_uh-;QWoZCm4*;o9T&(=E=!!A~yuf1$oWyW(3!T_h_K8si@SBmt7_ zn0P+^P27W>waH1l`jb6&J>I>Y+Lh+H2fe2z4V*rnPS_KeMoGy|iBCyS%GntjJ00~Z zCNWYYXcBNgS2|&AD$L+UZu-mGzkrNNs!E39HAz>HGtZ6bKy$!fUH!c9Y+^TXdYl|^ z=^y9~>nUzuY*A||Zg8#1`cqh(T#)=zvZ$wIrabh|#?QY$?&K=}JojrVuj2c=Z+c(q zzLn)S|H%6OsX(g$o4Z_ap};DC@)x}DMaiv-T;NW=Q4w1HzJyu|`(s~zyy8gJV9j!U zZKGRr9We0`^y2!V!!L)YQ4uq(OCQjGHsPc(x-$;HN|u_6hL#q9wAbIz zzhHLJZq^Cr%5W)kIp#+2GVm&Q%W+rry6=hdBKrRmsuJC_BVea*qD_K(d{G=TE-LBl zZcOsN-RkLw_Iex$J9Ozl@2! zlZ28u#n@*NBcZ*4_x$925MG_G9~>sFolFM}%5;9K=_tp`nISyjYfvP}lat3TV#+ht zIpyRdTMESYINi;U8y{EtXA`G%=GUgfrVuj_fc{W}(w#<4YK)5~FOKksb5ZWYheumS z&J7SXF+>HM@ef~^FT*f=j{eU zb9Ki^yHa~nXGj;kjoq0sR4^JbR)so;@|>8T7q4ZnWuvu-Zd<5QE^u7 zjFypsud$-}58GCk8Ml93DeeNFNB&uU$AU`3UWR^*5XPTKo=yIpq?>#-;Xy1pS|MsI zyf$nhj2T)US{61Fnj8`nQWo^W-`sbX&walzpG41-ZuyR}PI``5+htpt?NduT^GIv9 zt+(y4?MZt}J3EU6vv|`{!*YWSt$FqP>RKAT>aSJCROQvbBhM+t$Sp`~z^DRSW*0Mx z-3{DN@#Os!8{h?@adT#ahfM`2Yf>9Xpm(vfB)4L{6uN+2xwN*j>b81zb!xeFxpwW# z+KpBBmCwtF^)+n7#>mzOLIA;-ptkjE+tmCFGF_pYdq!D_7X6a9gI<1f@ zppltF^u3H*e7fK(tA%OAOr&=*?KpF65%Unclhev(FwGcCK$kv{+C^<5z1CLhclUm2P|HW@JGjcT4$o*SBp zo!K=JH|{;vHx-168I>9RJ$Yo-X7Sqcf9v}&Ip}NX&b5wpi}lm!S~Pm&$Cmvzia;Uu zP(Lx*tOHy-t}KVi8xiIKeVxOQ4Crm?hYGeTOx0(q3o5e6r|M@kBegoTZ|P*~&l)9~ zk}aKpA0Mk2%exj*Rua~sz{&WZ4aN@b9OFLeb=H48U?9jluq)^kFfm31Hv1j$4fXlY zE86Rrr@DKV`$>-%-nRpygH(dhekHy!-i1EHz7<}4&pvl8xAX1=o-!U_fV>v(3U@y1 zpl|=xj$kP;Pd1-3H?iPb3|fYop4XGoD=`c-dZzVJb+3vMf(Vh9+9x@Pn1z@K;Y>ZC ziC2YrflgnGSh=?PX!$oVL5QD~TAZ4RpDaQ>A9ygF`S;4O>UccBUyGTXoZm5TJLf!C zJsm#_n?JPVzgB^zZai5-t=va{!S2Ixw=xO)X(^1u^ftpG2IN zT868V-2r`pc2Pc8^AuLd-a3|lNlgANqt~0fmH>szH1mX*#1$kx5Yx6m& zn7EU05BC>}1hZX1ut?ctLJ0#Tu$oS!A?7K;U0tZb$>!-@Kk$iS!K3${xLs@wawuMqyXwSsrUG$1P{CykAsX&Rn-&DOy0x?p%1b*fy`Q`fWXDHE>;JT?MJ$7t2eKrJl(*DR&^7)L(06Xwmegjc)3`)C&jh^<*HAn`Y5s zHSLh)TyB@|_|!ws-PWFfSvLwU7n29B>Sb0kr`!#8Z%c&;&@NgauRq<^*ko;33-*xu8|SF%Fou z&A3WuQevp3)LM!LT?-%q3~_3iFt#CUgA|Wf+=#;N#MZCJu4XK6EsV}>&$8$5FCSb{ zUYS`epY5FzOpZ;;PXwcyCe)@%P_v`&#u`RPhmVimLd5{KE$1xsAFp zac{zYa%}p{T-*X^MF;bH%anYYwno=xDzO83$9VO;3PA!GDVZ;&D-D(DmpzBf)*vFQ z)JL_?=>OJhHr#FekI6o>XJ+c=MrIey`hhd_yHSJT72|RfH`94jhS`MWLn~YJy{2oX z-%QF4xq82Jk7$h|Kgod<6E(cledR{rfifo$@)Gwscc^4?6B$de-nQCMTnqrDuYWJSCjO*z)QgCTO`(uyT99=tb zZNJmuz9YX6P3(W1nY{O7X3v2)`-K@3nNpcCX;*g3#a{`36nNOj+Y9MhZaZqdU>0rA ztUjo`S5;g7y`&sSn-xObAXMWZD}v>_lkCaz@%jr%fH0sy5xxR{7N={733YyH_lfnNG%yF z|L>3gpa04^rNw1OD)lNB%kbsNmCq|Ml@XN#H9MP@nhZO3^dA_`7|KH(oSt5Ofdy~M zkTOY`jC%qYhz1Lh*H8gz9@Yxf`Bx`O&(};~dBTQgjkRBQY4^_d69pU&J{9B;F%q>I z8yv@qJ-6d`JR|XI;{N0#iAUp|66i^Xl81IzWU%%g%lwlemB~K%=jfLc^sJ`+8~dSq zP4+ZqK0kQk(2gVHN5=LsGpqLT_MS`qCs93)9eFfLIXW-QF7SsB!lS`u$+6MF-zw7d zrjep{6tYMmO?FdGL1sX53$hI&3*U0@Gn`5O^mN(`{_n$4hN>O@uNYntk(n_}AUbkw)DwivWew^_8kX%A>mZ-3an(6PVU zzZ=m->$y2Nhys$$OZU+2IIHafGLl^&f`H0}e?aAMp6oPoQuC03$Q)wrZLjS3-G%DT z^px^7_2c-s`X3B24!;rM5)F-e8fOv@j~(2xBQY$ldB=JzA_f#a8+|q=D10!)Cy?N0 z>Ywe0^8Mho<#X5bm5a73(plsb;_}vI&0)~yfqk*VEt})E}bwdkpx;cWA$K1e%ZIuw0wr94&Hy>{-V{f2uVhcCU<3zY8 zILpn}O%uE{Nt4tMbl{r+SLShGUui^rLFpzAkns#8ONO2Z@=W3e=!}rcj}&SO@SIEzn?KH$Wqx4WGWRm?Fz(XVi5)l( z+&n;p<5QC;XkzxZ3GVM^23l+7;o{!Kp4lc;2daEnZ_swX{U{p|Nn8ir zEA<8P7gP%sNJzsjsjXK*Hp#Os>pPX*20_auB5m<+IAI$fG*{ zYQ<~DA;(lB0LHO`cBJOA_Pj1zJ3}WyeOyI|e5K^A^i;M`=BuKG96{Ph=B>;{`FZ&q z1+nT;Wf?hJ>34`;gfA=z{1ap?a^`r`CmGFbE6%^bPD`DqD`@0-^2<3|Y(K6yV6>a! zcCj`&bfBx4E$kQSNxXql!4VQ|R;HoZR?;22>{imHGtGlRCI@VDn#G2;Q8`V}^75 z`Ao17k`Cm*^AX48uE}RAy;Aqo3etM4c~R${{$&Hcp`x*dv5&zegS)0D&5xTmTZY)) zwDGZ$v4}GNZMkG#X#zG(*ZZa&uSEoY2d=s#-y+{B`xhaQnUj}M@RNtg{ZIO|l(u9u z%m=0j9fbA6{(%6zQVB97ANB}V2@RG=1)6(y!arOg>oF@DXtf(KJ%LRehn`Eypm-o~aBfIqEPwREXcme%a(qZ@baTvq%xx@ptN<{uXQ6(LZ%<9lD9)4T z_boN9Wv$h1{31_UZ^T@Qe<0tXj&N`3i}EVU>#7e_YmnY*-I`~0t8_mbNE@q| zIGMzm(9E>0X04A~x7m!_Jh0hmbH@6Gt(om-%M<3BR&a~&W~mklrUr(QdP0DwmaCqH z97nFJN-DpU!%F2yE=iq|jDhYG$MO_dc6Lk}xr!A)M&J`{`T`@pYaB2i6!Uu8{Esb%O`IY}x zj20<__rpS@Pbv1OmTCUhmo*MEE3=#gC`3k1LZ=$%Ou)ed^CpQiNf#_S$Qo=otK$qP#f0tZX`@!bwNelqtmNYoM{J(Lh~m*M9{FqRfIl`@V; z2=pXJm|iENWlBx zvf!WoBfiyvFGKaCP&;PhA0*sKc$D%n%_&VMBYJQ7KGpp#87dh^(q;B&q}K1@@7bAZ zvqzBnCN*jI$=%Gv$QZ*&V(6@Y4!|(E?R48(*DBAd)S}PS#_)jFV`QLGj=ZCE82mjr zPY^4F3)K0td<=)fhA=lN?i3ukh@=C!V(wsHtt+nQVF;UkK<6kC`+dC?`xz6DPQ;*A zgXVV6cul!YyDy|KpI^K-9Wh%tb9r1Jl{5OdzxS`+;I4i~XH{ED^T(!#t?jM1J1{L~ zEwx>z+xczSj;{6t9bej?b$sqjYT4a%wRunN(Yi>0?{m5}qVsNamol^cJFDu=E2$K7Q z$dkM)nFIMp{1a%NNs5QXTKw-UOZGVH0W+HVp8AFUfgQl_*0na<~TNg>k=Uw&);~5yT17XSBB+p1Z){>R&HT75dd+p5WTYYb=@Dkw!z(+ zCeBlSkO+i#q%TAQ;VwCgl22h%-Ki&u*NH78BVrDrAD_3q2mhULj*Q&yz^85_@dsqTxYZEKqW-rc#%q~tSO#N@> z&Q$pX7gaIrHg;+B@bG(7#(2Xhdl1~8)4i+vcHfZ!%up2S@Aw+Zd+N>{WOjBoYq@>V zYN>8b2IGRghI>g=qzh0_|7F@|I$~~Z8E#FsTXf(!ym0n*Kjkg!^TEsA{iLh3`v(t(=Oy2Y059J` zU)_LTff1pI@aJJ)g71eE2Dt=j2A%fJ^`7?vd8K+E@Xrfa_nz=N==0hu&l?R)dTL!C zI@vp4aoXd?a{b_X*sb0**0tPY0eId`akRI*XcBGOYUXTcr^V3xuIHi`pmR=*s}QI_ zmp>`{9C|@qCi)*gg6GM4LsllR@X~~>tx4=SR%Y$utnswzwC-fW=)WUXqqZZQVX1Na z*!dC7iL&Y4vtJhXFNTkMj%-a-%&tzy%n{J5xVPJ@L=@o-<6j`59>-XtK4r+WeSnP4 zA?{J`5kWIpO#~ApfxEF*pX1CgUi7Ub#l)Gcr}9R&7A#qY_iu9vKYG zhAiZR#kN z#a10~^&Yfub1HOhbu@F_a{S{g?{VLA$bHJQ*?Yj#+8yaEbgp)O;GE##2Dm>X&99i; z)+Opu^b)ihR4~egN?2J11r^17`S*%G%1)|3mCh(WQ(BSzE~l;FsaP#%gpiOvDaD2E z2CRd1;FI805Kb5%80NiVN3rJF*#LLQiX*|yqhygZh(F17M4K(=t>#TdoF;l^QER4g z?(@Rd+$&%cgqtdw4w^}wiI`HF6imrZJ)dAtVkUxt{gB&O!$|O$5T%b&7{Lwdk2Q^7 znMj$?K)H`COgx%=fNGiaoHm@kIqNw0&z#=e%*^yWeA#nddh_Y_07cB~;O!Iki1$PO z2fHX)A$?UYO@2x-LtS4dU*`uvg|O9oXrOC!!03+AY2#OhQ-(HXG_zFe>o!j;?^p;; z@0#DTY_kAa>a1&C~(REHE#vP$x^Q~}ID zqF12G`9nR9$8JuepRH9ds!#u%)SiAjYdijFsCL+4IKB_@H>)$S?PbeC)0>uCEefqJ zojL829c_KX0}n^KP|M>rQ-cc%OItu2Girr}PT71$+QBpuyGqK+*&;bQ1%`emk>*)8 zCblB0Yu0xytt_&vTkH_dk{)nxhEI~;sy`+qHZnKrY0Qu4#OStI-8k>~w1kwzo5{4) z>GZE@pgVvg2r(sWmAP<^d*9`PFD&bdwLA(GI2^U2d~qaS3qvp33zbY*%aw@!7 zTvei1lv}v{E23!k@7YRhg?kOBA+qjBJ-p#S9jf|xO>*_u>Kl!pTAsBYYIEou|7$rE z`uBVP^yr02gM}Mwb+|#iG^LN-C^#%0lmm$AR~J^N0V zaL*$i5RW~cBA-m(J^q^kPyDj|b3(3%&4x__`@!yrf^fIUl$f<07k1e0xD+3f_;&Zv zH0$)}J%=*hWuW$*-EVrJ>wwI@XPJ$ehxXO(MQ0kPSEN98TczYCJ&tRM)s2pe><>F1 z0uN>f%LX0r9&%Z1|Aha9h{UGiDPe)&mEZ_>gAqbm zC-oAG2-#ar8_&>p(QR1xW;YInm)?2~uvgqR{@ql^eZx3oEY?(4yaDc7&C2top81lQ z)`_`Eh4GBB?(y4$3VoV?TY6A^^M5%#GF@`5GR^lIDK*~Jr8Sf~je2CAW3^1>o65$j z-_^c#jGEKs#Il8wk>6RBM{6I}{jOE7-&t!~uiwDhy-JgRl8Lnkw8@8(Gq1-dPPeKcTX!TXHR5ndv zOxafLx}LeoB{NOy5~l|DFK!{8q5jE%rT#^JcLH-mA|tA!I-;E-zJ=;VJd2bIeI5`P z7!s80tM2*KOW2ZVI<7@UEMW@KeMFGM{{r zWJO*i{s++Z{fHTqMydtvF#QtQjXXs2p^<3IGy>y3%ZlU6TjO65Z1UHId1ACUPuMB0 z5Iq;k3Z8Q{L_=IOpD18+utHbiUcS9xLf9n2@)X2)VJN>|NaU-C61cMLY@q3WgqcBx zQO}b@HpN@UTcIcCDU1%>43@W;~kTG#*w3=ga7M) z`PUnmYoPj1j=?9g$7vH46VR#jnM-qj=M@*1795%LjHtJN=YV&nx)R+iJc>N`cq4o}y~yU^ znojB;HqbD%*M(|@YkbxqsDY4m8pUcds$+`Vka4iF$cO1`gZW92>oO2 z-s0M##H`#%`oP=Xh5ncQ>b=6g1HF&Cr8*CHT^al^v^oSG#QY5(93FW#qBnkVTx}Al zjLlG&bk|>EK47fTf!H$4QDEowZUeD>kg|uupbfER*wL*2k;?!k0S=%aH8CI3>lnSv zRq8#eGeeu_#39k8X#djx$MqEz@Qt|_d1@>+CsJS_EES4)4_GVgE&er;KZFm1!!jhs zBw8TxP+w>mqy{tvz94ZL@=OXLeO5MBSx?nk#ZB2$saF}L@(y`JOJy~5(1EH0# zzN&%LM(94%qw5;zUDoN*E!MfJKBp$Fm8jpY|3SaZ&`iG-*hh>hpHdVmyQ_37wo2cF zXGng5Uqkds{*^S6;Yf*LtKi$*1@1j=72Ap9%QXe&kH;89QYM8DczmzXkCALBN9bVS z+d-hX5sN8EfZSL>ZK8Z2eXol>7YWOMR)x!EK;x+j0|HXJ`^Y{FAwx)p(vC4+Q}N7G zEG}zGAO;-=$d58|=1SL<_aHAKe<}|tZYq1K=cygjc%UiNKCCZoqGuXoRAF`waDKfu z-!dz*%C{V`OtL&|VQY2KX5QM|RM)6l&kgxnX@~MHRWPtW98ugaZ=sZ>Vy*~Mc&s3$ z6d_BK)|YJq9G^zuUEl{0O_(G6833xh0i>Lm5)Z*w#cz0rxn10^oN?9yy@w%3|IR39 z@+svMI}(HViFl6KkB`C0;m%_U*PhMk&5X=u&F!D}oZqvgvm}`Ru@E{BTF97#PPHHYKn~PieQ9XIL;!7yl>Zo7AFAu)Rz^;ygPmP?in zR{y8yEc}{m+b}#9bT^}6!07JomTtlB?(S|B>opJo#X?jRk?!t}Z44M}th?F1=lcs7 z&wktP`?}8aIJ}X{R<7n(&898#tcJ`|4Nt+*@KD2t2HINo%1R3LGPz<7_cvFCnLw9g zv=EgkD})^@g{xtU@8{emoyRT==Jdq%Ao{)xdk^>Z9qLaQJ~=KP`P~@*$$wLb3K~1nwc>uJeyjkt5-Xmk41;Sbeso_}S?CW+2@ZqR< zL;zVIuD7}W=8!Lu({Y-K|0SGHe7vE2LtDIB;!<*ZazV0d;CeY(#n%;6H22Of=Ydly9K+hIiy?jEt=p( z`b;gM$}gp@kWOj1^bGeZc^+qjLQNWvo*3NU?a-Cp!Ea?W&DWJRoUb|gGxgh(k0m9k z@Atpcf7ALd_igTr4^KxPhZgO6-Skebw5+7CxckNJ=NbQ9e7#y?T)w@0q9o(>_Ls5G zqhD?>`)SGpI}$KQWTU`gn&u-wq_@Vk+IG3OFPlVwxyr>&(Gq<_v($tunb$k)wZ z-n_DT6`=Q6<$o>k*-qWQZOf-Er#F{x*}rWKAo?h5%+7k5HooC}bY|#&f0Fw#=X=h3 zoNn0l+uB+EFyC+a*0^22O6P^f7ImcZQRrEzzxW~0?J3}QvX3#x83MWjql_|6Fkd;i zG{2%qiUSgWokaT;?Ik>F7=3gh1yg{L02H6rnVMNg6lZp6q8muJMo!59pNhOeoi1Eg zLsvw%PB*%9zEc7;vi3IxG%h#HHLNx}HFh+}G?v!q)E%mOP+wgiQ+Kfb$iKY5sJ}(E zdW}aK78^e_aO$cW?zEokm}-CDcCO`d!&*aW%jYI+vsc?#yL`{B-VZ%7UEbY0`u_}w zhvmo5P9x^OqjP{~eu2oLIdh75eOzVHPtaXZG?*!ys^p}O(XTVzYUN~W0i4UDyhgkU zUfO=Q12n=G!ajwXhJT41i@qAeiP|46A9FLZIZ`glJJKV5DvDYrHZ6};3AV`sv=WDh&nI-Ik7g~sZv7m!3Tzb0_ zK`k`1ZH$@eLHsIzPT*4`7Z04e0hfXRA@_K5us_;%jPCvxeW4#piCg!+wCMDe4X z0Q&G(*nX^brXrWeYv;Q0?0~$F0b`j_$;bo9J-*AdW%FeQws9d6Lz{D7n8NBVyu-Yh zTbqGQ9h@*2e>|cx>N}P>t}|vjl0OtQ^laF4)N`V596tPSC~AZ~dTp$33_0#JH96Zf z-7!m@8=nQw_0OXhOqbGt_v;-|j<}EXoG45BNi$|BU@cb^N!XB?ID9<(-%OhaoGH*rLN6KWTLH_y}-W3@vXykmmQuSUJ&0h-+SJ2 zUdf(x4~*vr_Xw{m-bQ}rA*VuO!=PcU;QUq9r48SggM0I zIh>|@UT;MIj@~aFv8G7ANsjqpTI2+b(E^o(;;^`}p1-IFR>1&gx zh6g%D9UJ<>MlOxL8a_0BZtgE;X#s|6pSd@)XR?3z@!+R{%E8@}m1xnTCN6;Zo_Uk| zf|JXI^5NVDAmJiQ+ezL@zQ!Ek?c*7+L0t9q70J5DS#)tdR5;G@pq(N|FBn}xhd)r%<&PzGm>JN0>CWm4Z0y+ z0oTYm%H4%+gZ06-E3y>_febA~Zc5e}_6JIr{V0DODwHC@-N3nm36_PLDe9>r6yg

aM4J!tVWb|Mcl`gA9DsGbtkqea9m#>HBK_g); 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 literal 0 HcmV?d00001 diff --git a/examples/multimedia/audioengine/qml/content/whistle.wav b/examples/multimedia/audioengine/qml/content/whistle.wav new file mode 100644 index 0000000000000000000000000000000000000000..f890b791f68f0d694ae73f5b7e511d79d49f4d2a GIT binary patch literal 64132 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 NaOqq0C4Qt9{|{u9oy!0K literal 0 HcmV?d00001 From 72a43cee90b495b1e023a9dfe708a6d9105b994f Mon Sep 17 00:00:00 2001 From: Andy Shaw Date: Tue, 7 Apr 2015 09:55:16 +0200 Subject: [PATCH 10/19] Fix compile issue when building with -no-widgets Change-Id: I49a9aa684b0dfbe0e3d9e576aad06d65d6c3ecdd Reviewed-by: Yoann Lopes --- src/plugins/directshow/camera/dscamerasession.cpp | 1 - src/plugins/wmf/player/mfplayerservice.cpp | 4 ++-- src/plugins/wmf/player/mfplayersession.cpp | 8 ++++---- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/src/plugins/directshow/camera/dscamerasession.cpp b/src/plugins/directshow/camera/dscamerasession.cpp index bce60365..d09c6e08 100644 --- a/src/plugins/directshow/camera/dscamerasession.cpp +++ b/src/plugins/directshow/camera/dscamerasession.cpp @@ -32,7 +32,6 @@ ****************************************************************************/ #include -#include #include #include #include diff --git a/src/plugins/wmf/player/mfplayerservice.cpp b/src/plugins/wmf/player/mfplayerservice.cpp index 262e1a15..b4a94549 100644 --- a/src/plugins/wmf/player/mfplayerservice.cpp +++ b/src/plugins/wmf/player/mfplayerservice.cpp @@ -50,7 +50,7 @@ MFPlayerService::MFPlayerService(QObject *parent) : QMediaService(parent) , m_session(0) -#ifndef Q_WS_SIMULATOR +#if defined(HAVE_WIDGETS) && !defined(Q_WS_SIMULATOR) , m_videoWindowControl(0) #endif , m_videoRendererControl(0) @@ -65,7 +65,7 @@ MFPlayerService::~MFPlayerService() { m_session->close(); -#ifndef Q_WS_SIMULATOR +#if defined(HAVE_WIDGETS) && !defined(Q_WS_SIMULATOR) if (m_videoWindowControl) delete m_videoWindowControl; #endif diff --git a/src/plugins/wmf/player/mfplayersession.cpp b/src/plugins/wmf/player/mfplayersession.cpp index 377f1e4a..599fa90c 100644 --- a/src/plugins/wmf/player/mfplayersession.cpp +++ b/src/plugins/wmf/player/mfplayersession.cpp @@ -43,7 +43,7 @@ #include #include "mfplayercontrol.h" -#ifndef Q_WS_SIMULATOR +#if defined(HAVE_WIDGETS) && !defined(Q_WS_SIMULATOR) #include "evr9videowindowcontrol.h" #endif #include "mfvideorenderercontrol.h" @@ -140,7 +140,7 @@ void MFPlayerSession::close() if (m_playerService->videoRendererControl()) { m_playerService->videoRendererControl()->releaseActivate(); -#ifndef Q_WS_SIMULATOR +#if defined(HAVE_WIDGETS) && !defined(Q_WS_SIMULATOR) } else if (m_playerService->videoWindowControl()) { m_playerService->videoWindowControl()->releaseActivate(); #endif @@ -404,7 +404,7 @@ IMFTopologyNode* MFPlayerSession::addOutputNode(IMFStreamDescriptor *streamDesc, mediaType = Video; if (m_playerService->videoRendererControl()) { activate = m_playerService->videoRendererControl()->createActivate(); -#ifndef Q_WS_SIMULATOR +#if defined(HAVE_WIDGETS) && !defined(Q_WS_SIMULATOR) } else if (m_playerService->videoWindowControl()) { activate = m_playerService->videoWindowControl()->createActivate(); #endif @@ -1577,7 +1577,7 @@ void MFPlayerSession::handleSessionEvent(IMFMediaEvent *sessionEvent) } updatePendingCommands(CmdStart); -#ifndef Q_WS_SIMULATOR +#if defined(HAVE_WIDGETS) && !defined(Q_WS_SIMULATOR) // playback started, we can now set again the procAmpValues if they have been // changed previously (these are lost when loading a new media) if (m_playerService->videoWindowControl()) { From ddec92543f10d0d16455ba5ba4f450c3fe417644 Mon Sep 17 00:00:00 2001 From: Yoann Lopes Date: Tue, 7 Apr 2015 14:09:59 +0200 Subject: [PATCH 11/19] Fix type of Camera's errorCode property. It's supposed to be of type enumeration (Error) and not QString. Change-Id: Ia3ce112efa3e87614c79b89d05313b0faa557289 Reviewed-by: Andrew Knight --- src/imports/multimedia/qdeclarativecamerarecorder_p.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/imports/multimedia/qdeclarativecamerarecorder_p.h b/src/imports/multimedia/qdeclarativecamerarecorder_p.h index dde13b86..5edff487 100644 --- a/src/imports/multimedia/qdeclarativecamerarecorder_p.h +++ b/src/imports/multimedia/qdeclarativecamerarecorder_p.h @@ -83,7 +83,7 @@ class QDeclarativeCameraRecorder : public QObject Q_PROPERTY(QString actualLocation READ actualLocation NOTIFY actualLocationChanged) Q_PROPERTY(bool muted READ isMuted WRITE setMuted NOTIFY mutedChanged) Q_PROPERTY(QString errorString READ errorString NOTIFY error) - Q_PROPERTY(QString errorCode READ errorCode NOTIFY error) + Q_PROPERTY(Error errorCode READ errorCode NOTIFY error) public: enum RecorderState From a700ff9674f1e3ca86f279d3041c8e81433be7ca Mon Sep 17 00:00:00 2001 From: Yoann Lopes Date: Wed, 8 Apr 2015 15:10:00 +0200 Subject: [PATCH 12/19] Make the QtMultimedia singleton type a QObject. It was a QJSValue for the sake of being as lightweight as possible and because we don't actually need any of the QObject features for that type in its current state. However, this implies that type information is not available at runtime. This is a problem for qmlplugindump which currently crashes because it always expects every QML type to have an associated meta object. We can safely make that type a QObject since it doesn't affect source compatibility in any way. This type was bound to become a QObject at some point anyway. Task-number: QTBUG-44299 Change-Id: I2d9b874f15ffc94ed95ef74fadc3b1fd193fe1ef Reviewed-by: Alex Blasche --- src/imports/multimedia/multimedia.cpp | 8 ++- .../qdeclarativemultimediaglobal.cpp | 56 +++++-------------- .../qdeclarativemultimediaglobal_p.h | 26 ++++++++- 3 files changed, 45 insertions(+), 45 deletions(-) diff --git a/src/imports/multimedia/multimedia.cpp b/src/imports/multimedia/multimedia.cpp index 80dc4f82..a71c6f1c 100644 --- a/src/imports/multimedia/multimedia.cpp +++ b/src/imports/multimedia/multimedia.cpp @@ -57,6 +57,12 @@ QML_DECLARE_TYPE(QSoundEffect) QT_BEGIN_NAMESPACE +static QObject *multimedia_global_object(QQmlEngine *qmlEngine, QJSEngine *jsEngine) +{ + Q_UNUSED(qmlEngine) + return new QDeclarativeMultimediaGlobal(jsEngine); +} + class QMultimediaDeclarativeModule : public QQmlExtensionPlugin { Q_OBJECT @@ -98,7 +104,7 @@ public: qmlRegisterType(uri, 5, 3, "SoundEffect"); // 5.4 types - qmlRegisterSingletonType(uri, 5, 4, "QtMultimedia", QDeclarativeMultimedia::initGlobalObject); + qmlRegisterSingletonType(uri, 5, 4, "QtMultimedia", multimedia_global_object); qmlRegisterRevision(uri, 5, 4); qmlRegisterUncreatableType(uri, 5, 4, "CameraViewfinder", trUtf8("CameraViewfinder is provided by Camera")); diff --git a/src/imports/multimedia/qdeclarativemultimediaglobal.cpp b/src/imports/multimedia/qdeclarativemultimediaglobal.cpp index 37e42979..c6430427 100644 --- a/src/imports/multimedia/qdeclarativemultimediaglobal.cpp +++ b/src/imports/multimedia/qdeclarativemultimediaglobal.cpp @@ -153,27 +153,6 @@ Camera { \endqml */ -namespace QDeclarativeMultimedia { - -#define FREEZE_SOURCE "(function deepFreeze(o) { "\ - " var prop, propKey;" \ - " Object.freeze(o);" \ - " for (propKey in o) {" \ - " prop = o[propKey];" \ - " if (!o.hasOwnProperty(propKey) || !(typeof prop === \"object\") || " \ - " Object.isFrozen(prop)) {" \ - " continue;" \ - " }" \ - " deepFreeze(prop);" \ - " }" \ - "})" - -static void deepFreeze(QJSEngine *jsEngine, const QJSValue &obj) -{ - QJSValue freezeFunc = jsEngine->evaluate(QString::fromUtf8(FREEZE_SOURCE)); - freezeFunc.call(QJSValueList() << obj); -} - static QJSValue cameraInfoToJSValue(QJSEngine *jsEngine, const QCameraInfo &camera) { QJSValue o = jsEngine->newObject(); @@ -184,29 +163,24 @@ static QJSValue cameraInfoToJSValue(QJSEngine *jsEngine, const QCameraInfo &came return o; } -QJSValue initGlobalObject(QQmlEngine *qmlEngine, QJSEngine *jsEngine) +QDeclarativeMultimediaGlobal::QDeclarativeMultimediaGlobal(QJSEngine *engine, QObject *parent) + : QObject(parent) + , m_engine(engine) { - Q_UNUSED(qmlEngine) - - QJSValue globalObject = jsEngine->newObject(); - - // property object defaultCamera - globalObject.setProperty(QStringLiteral("defaultCamera"), - cameraInfoToJSValue(jsEngine, QCameraInfo::defaultCamera())); - - // property list availableCameras - QList cameras = QCameraInfo::availableCameras(); - QJSValue availableCameras = jsEngine->newArray(cameras.count()); - for (int i = 0; i < cameras.count(); ++i) - availableCameras.setProperty(i, cameraInfoToJSValue(jsEngine, cameras.at(i))); - globalObject.setProperty(QStringLiteral("availableCameras"), availableCameras); - - // freeze global object to prevent properties to be modified from QML - deepFreeze(jsEngine, globalObject); - - return globalObject; } +QJSValue QDeclarativeMultimediaGlobal::defaultCamera() const +{ + return cameraInfoToJSValue(m_engine, QCameraInfo::defaultCamera()); +} + +QJSValue QDeclarativeMultimediaGlobal::availableCameras() const +{ + QList cameras = QCameraInfo::availableCameras(); + QJSValue availableCameras = m_engine->newArray(cameras.count()); + for (int i = 0; i < cameras.count(); ++i) + availableCameras.setProperty(i, cameraInfoToJSValue(m_engine, cameras.at(i))); + return availableCameras; } QT_END_NAMESPACE diff --git a/src/imports/multimedia/qdeclarativemultimediaglobal_p.h b/src/imports/multimedia/qdeclarativemultimediaglobal_p.h index 6c4dba7f..192874c2 100644 --- a/src/imports/multimedia/qdeclarativemultimediaglobal_p.h +++ b/src/imports/multimedia/qdeclarativemultimediaglobal_p.h @@ -46,12 +46,32 @@ // #include +#include QT_BEGIN_NAMESPACE -namespace QDeclarativeMultimedia { - QJSValue initGlobalObject(QQmlEngine *, QJSEngine *); -} +class QDeclarativeMultimediaGlobal : public QObject +{ + Q_OBJECT + + Q_PROPERTY(QJSValue defaultCamera READ defaultCamera NOTIFY defaultCameraChanged) + Q_PROPERTY(QJSValue availableCameras READ availableCameras NOTIFY availableCamerasChanged) + +public: + explicit QDeclarativeMultimediaGlobal(QJSEngine *engine, QObject *parent = 0); + + QJSValue defaultCamera() const; + QJSValue availableCameras() const; + +Q_SIGNALS: + // Unused at the moment. QCameraInfo doesn't notify when cameras are added or removed, + // but it might change in the future. + void defaultCameraChanged(); + void availableCamerasChanged(); + +private: + QJSEngine *m_engine; +}; QT_END_NAMESPACE From fa9e829a60bf843c45241b4b99f933ec0532b3c2 Mon Sep 17 00:00:00 2001 From: Yoann Lopes Date: Wed, 8 Apr 2015 15:49:55 +0200 Subject: [PATCH 13/19] Updated plugins.qmltypes. Task-number: QTBUG-44300 Change-Id: Id6c8dce17e03c79f29581bd49be184a8d3e7f21b Reviewed-by: Kai Koehne Reviewed-by: Alex Blasche --- src/imports/multimedia/plugins.qmltypes | 260 ++++++++++++++++++++++-- 1 file changed, 241 insertions(+), 19 deletions(-) diff --git a/src/imports/multimedia/plugins.qmltypes b/src/imports/multimedia/plugins.qmltypes index 12d7ea85..6cd70d7a 100644 --- a/src/imports/multimedia/plugins.qmltypes +++ b/src/imports/multimedia/plugins.qmltypes @@ -3,7 +3,8 @@ import QtQuick.tooling 1.1 // This file describes the plugin-supplied types contained in the library. // It is used for QML tooling purposes only. // -// This file was auto-generated with the command 'qmlplugindump -notrelocatable QtMultimedia 5.0'. +// This file was auto-generated by: +// 'qmlplugindump -nonrelocatable QtMultimedia 5.4' Module { Component { @@ -76,6 +77,14 @@ Module { "LockFocus": 4 } } + Enum { + name: "Position" + values: { + "UnspecifiedPosition": 0, + "BackFace": 1, + "FrontFace": 2 + } + } Property { name: "state"; type: "QCamera::State"; isReadonly: true } Property { name: "status"; type: "QCamera::Status"; isReadonly: true } Property { name: "captureMode"; type: "QCamera::CaptureModes" } @@ -232,6 +241,14 @@ Module { prototype: "QObject" exports: ["QtMultimedia/Camera 5.0"] exportMetaObjectRevisions: [0] + Enum { + name: "Position" + values: { + "UnspecifiedPosition": 0, + "BackFace": 1, + "FrontFace": 2 + } + } Enum { name: "CaptureMode" values: { @@ -357,6 +374,10 @@ Module { "ResourceMissing": 3 } } + Property { name: "deviceId"; revision: 1; type: "string" } + Property { name: "position"; revision: 1; type: "Position" } + Property { name: "displayName"; revision: 1; type: "string"; isReadonly: true } + Property { name: "orientation"; revision: 1; type: "int"; isReadonly: true } Property { name: "captureMode"; type: "CaptureMode" } Property { name: "cameraState"; type: "State" } Property { name: "cameraStatus"; type: "Status"; isReadonly: true } @@ -395,12 +416,30 @@ Module { isReadonly: true isPointer: true } + Property { + name: "metaData" + revision: 1 + type: "QDeclarativeMediaMetaData" + isReadonly: true + isPointer: true + } + Property { + name: "viewfinder" + revision: 1 + type: "QDeclarativeCameraViewfinder" + isReadonly: true + isPointer: true + } Signal { name: "errorChanged" } Signal { name: "error" Parameter { name: "errorCode"; type: "QDeclarativeCamera::Error" } Parameter { name: "errorString"; type: "string" } } + Signal { name: "deviceIdChanged"; revision: 1 } + Signal { name: "positionChanged"; revision: 1 } + Signal { name: "displayNameChanged"; revision: 1 } + Signal { name: "orientationChanged"; revision: 1 } Signal { name: "cameraStateChanged" Parameter { type: "QDeclarativeCamera::State" } @@ -450,6 +489,7 @@ Module { name: "QDeclarativeCameraCapture" prototype: "QObject" exports: ["QtMultimedia/CameraCapture 5.0"] + isCreatable: false exportMetaObjectRevisions: [0] Property { name: "ready"; type: "bool"; isReadonly: true } Property { name: "capturedImagePath"; type: "string"; isReadonly: true } @@ -509,7 +549,33 @@ Module { name: "QDeclarativeCameraExposure" prototype: "QObject" exports: ["QtMultimedia/CameraExposure 5.0"] + isCreatable: false exportMetaObjectRevisions: [0] + Enum { + name: "ExposureMode" + values: { + "ExposureAuto": 0, + "ExposureManual": 1, + "ExposurePortrait": 2, + "ExposureNight": 3, + "ExposureBacklight": 4, + "ExposureSpotlight": 5, + "ExposureSports": 6, + "ExposureSnow": 7, + "ExposureBeach": 8, + "ExposureLargeAperture": 9, + "ExposureSmallAperture": 10, + "ExposureModeVendor": 1000 + } + } + Enum { + name: "MeteringMode" + values: { + "MeteringMatrix": 1, + "MeteringAverage": 2, + "MeteringSpot": 3 + } + } Property { name: "exposureCompensation"; type: "double" } Property { name: "iso"; type: "int"; isReadonly: true } Property { name: "shutterSpeed"; type: "double"; isReadonly: true } @@ -517,9 +583,9 @@ Module { Property { name: "manualShutterSpeed"; type: "double" } Property { name: "manualAperture"; type: "double" } Property { name: "manualIso"; type: "double" } - Property { name: "exposureMode"; type: "QDeclarativeCamera::ExposureMode" } + Property { name: "exposureMode"; type: "ExposureMode" } Property { name: "spotMeteringPoint"; type: "QPointF" } - Property { name: "meteringMode"; type: "QDeclarativeCamera::MeteringMode" } + Property { name: "meteringMode"; type: "MeteringMode" } Signal { name: "isoSensitivityChanged" Parameter { type: "int" } @@ -550,11 +616,11 @@ Module { } Signal { name: "exposureModeChanged" - Parameter { type: "QDeclarativeCamera::ExposureMode" } + Parameter { type: "ExposureMode" } } Signal { name: "meteringModeChanged" - Parameter { type: "QDeclarativeCamera::MeteringMode" } + Parameter { type: "MeteringMode" } } Signal { name: "spotMeteringPointChanged" @@ -562,7 +628,7 @@ Module { } Method { name: "setExposureMode" - Parameter { type: "QDeclarativeCamera::ExposureMode" } + Parameter { type: "ExposureMode" } } Method { name: "setExposureCompensation" @@ -588,38 +654,75 @@ Module { name: "QDeclarativeCameraFlash" prototype: "QObject" exports: ["QtMultimedia/CameraFlash 5.0"] + isCreatable: false exportMetaObjectRevisions: [0] + Enum { + name: "FlashMode" + values: { + "FlashAuto": 1, + "FlashOff": 2, + "FlashOn": 4, + "FlashRedEyeReduction": 8, + "FlashFill": 16, + "FlashTorch": 32, + "FlashVideoLight": 64, + "FlashSlowSyncFrontCurtain": 128, + "FlashSlowSyncRearCurtain": 256, + "FlashManual": 512 + } + } Property { name: "ready"; type: "bool"; isReadonly: true } - Property { name: "mode"; type: "int" } + Property { name: "mode"; type: "FlashMode" } Signal { name: "flashReady" Parameter { name: "status"; type: "bool" } } Signal { name: "flashModeChanged" - Parameter { type: "int" } + Parameter { type: "FlashMode" } } Method { name: "setFlashMode" - Parameter { type: "int" } + Parameter { type: "FlashMode" } } } Component { name: "QDeclarativeCameraFocus" prototype: "QObject" exports: ["QtMultimedia/CameraFocus 5.0"] + isCreatable: false exportMetaObjectRevisions: [0] - Property { name: "focusMode"; type: "QDeclarativeCamera::FocusMode" } - Property { name: "focusPointMode"; type: "QDeclarativeCamera::FocusPointMode" } + Enum { + name: "FocusMode" + values: { + "FocusManual": 1, + "FocusHyperfocal": 2, + "FocusInfinity": 4, + "FocusAuto": 8, + "FocusContinuous": 16, + "FocusMacro": 32 + } + } + Enum { + name: "FocusPointMode" + values: { + "FocusPointAuto": 0, + "FocusPointCenter": 1, + "FocusPointFaceDetection": 2, + "FocusPointCustom": 3 + } + } + Property { name: "focusMode"; type: "FocusMode" } + Property { name: "focusPointMode"; type: "FocusPointMode" } Property { name: "customFocusPoint"; type: "QPointF" } Property { name: "focusZones"; type: "QObject"; isReadonly: true; isPointer: true } Signal { name: "focusModeChanged" - Parameter { type: "QDeclarativeCamera::FocusMode" } + Parameter { type: "FocusMode" } } Signal { name: "focusPointModeChanged" - Parameter { type: "QDeclarativeCamera::FocusPointMode" } + Parameter { type: "FocusPointMode" } } Signal { name: "customFocusPointChanged" @@ -627,11 +730,11 @@ Module { } Method { name: "setFocusMode" - Parameter { type: "QDeclarativeCamera::FocusMode" } + Parameter { type: "FocusMode" } } Method { name: "setFocusPointMode" - Parameter { name: "mode"; type: "QDeclarativeCamera::FocusPointMode" } + Parameter { name: "mode"; type: "FocusPointMode" } } Method { name: "setCustomFocusPoint" @@ -640,18 +743,19 @@ Module { Method { name: "isFocusModeSupported" type: "bool" - Parameter { name: "mode"; type: "QDeclarativeCamera::FocusMode" } + Parameter { name: "mode"; type: "FocusMode" } } Method { name: "isFocusPointModeSupported" type: "bool" - Parameter { name: "mode"; type: "QDeclarativeCamera::FocusPointMode" } + Parameter { name: "mode"; type: "FocusPointMode" } } } Component { name: "QDeclarativeCameraImageProcessing" prototype: "QObject" exports: ["QtMultimedia/CameraImageProcessing 5.0"] + isCreatable: false exportMetaObjectRevisions: [0] Enum { name: "WhiteBalanceMode" @@ -727,6 +831,7 @@ Module { name: "QDeclarativeCameraRecorder" prototype: "QObject" exports: ["QtMultimedia/CameraRecorder 5.0"] + isCreatable: false exportMetaObjectRevisions: [0] Enum { name: "RecorderState" @@ -922,6 +1027,119 @@ Module { Parameter { name: "encodingMode"; type: "EncodingMode" } } } + Component { + name: "QDeclarativeCameraViewfinder" + prototype: "QObject" + exports: ["QtMultimedia/CameraViewfinder 5.4"] + isCreatable: false + exportMetaObjectRevisions: [0] + Property { name: "resolution"; type: "QSize" } + Property { name: "minimumFrameRate"; type: "double" } + Property { name: "maximumFrameRate"; type: "double" } + } + Component { + name: "QDeclarativeMediaMetaData" + prototype: "QObject" + Property { name: "title"; type: "QVariant" } + Property { name: "subTitle"; type: "QVariant" } + Property { name: "author"; type: "QVariant" } + Property { name: "comment"; type: "QVariant" } + Property { name: "description"; type: "QVariant" } + Property { name: "category"; type: "QVariant" } + Property { name: "genre"; type: "QVariant" } + Property { name: "year"; type: "QVariant" } + Property { name: "date"; type: "QVariant" } + Property { name: "userRating"; type: "QVariant" } + Property { name: "keywords"; type: "QVariant" } + Property { name: "language"; type: "QVariant" } + Property { name: "publisher"; type: "QVariant" } + Property { name: "copyright"; type: "QVariant" } + Property { name: "parentalRating"; type: "QVariant" } + Property { name: "ratingOrganization"; type: "QVariant" } + Property { name: "size"; type: "QVariant" } + Property { name: "mediaType"; type: "QVariant" } + Property { name: "duration"; type: "QVariant" } + Property { name: "audioBitRate"; type: "QVariant" } + Property { name: "audioCodec"; type: "QVariant" } + Property { name: "averageLevel"; type: "QVariant" } + Property { name: "channelCount"; type: "QVariant" } + Property { name: "peakValue"; type: "QVariant" } + Property { name: "sampleRate"; type: "QVariant" } + Property { name: "albumTitle"; type: "QVariant" } + Property { name: "albumArtist"; type: "QVariant" } + Property { name: "contributingArtist"; type: "QVariant" } + Property { name: "composer"; type: "QVariant" } + Property { name: "conductor"; type: "QVariant" } + Property { name: "lyrics"; type: "QVariant" } + Property { name: "mood"; type: "QVariant" } + Property { name: "trackNumber"; type: "QVariant" } + Property { name: "trackCount"; type: "QVariant" } + Property { name: "coverArtUrlSmall"; type: "QVariant" } + Property { name: "coverArtUrlLarge"; type: "QVariant" } + Property { name: "resolution"; type: "QVariant" } + Property { name: "pixelAspectRatio"; type: "QVariant" } + Property { name: "videoFrameRate"; type: "QVariant" } + Property { name: "videoBitRate"; type: "QVariant" } + Property { name: "videoCodec"; type: "QVariant" } + Property { name: "posterUrl"; type: "QVariant" } + Property { name: "chapterNumber"; type: "QVariant" } + Property { name: "director"; type: "QVariant" } + Property { name: "leadPerformer"; type: "QVariant" } + Property { name: "writer"; type: "QVariant" } + Property { name: "cameraManufacturer"; type: "QVariant" } + Property { name: "cameraModel"; type: "QVariant" } + Property { name: "event"; type: "QVariant" } + Property { name: "subject"; type: "QVariant" } + Property { name: "orientation"; type: "QVariant" } + Property { name: "exposureTime"; type: "QVariant" } + Property { name: "fNumber"; type: "QVariant" } + Property { name: "exposureProgram"; type: "QVariant" } + Property { name: "isoSpeedRatings"; type: "QVariant" } + Property { name: "exposureBiasValue"; type: "QVariant" } + Property { name: "dateTimeOriginal"; type: "QVariant" } + Property { name: "dateTimeDigitized"; type: "QVariant" } + Property { name: "subjectDistance"; type: "QVariant" } + Property { name: "meteringMode"; type: "QVariant" } + Property { name: "lightSource"; type: "QVariant" } + Property { name: "flash"; type: "QVariant" } + Property { name: "focalLength"; type: "QVariant" } + Property { name: "exposureMode"; type: "QVariant" } + Property { name: "whiteBalance"; type: "QVariant" } + Property { name: "digitalZoomRatio"; type: "QVariant" } + Property { name: "focalLengthIn35mmFilm"; type: "QVariant" } + Property { name: "sceneCaptureType"; type: "QVariant" } + Property { name: "gainControl"; type: "QVariant" } + Property { name: "contrast"; type: "QVariant" } + Property { name: "saturation"; type: "QVariant" } + Property { name: "sharpness"; type: "QVariant" } + Property { name: "deviceSettingDescription"; type: "QVariant" } + Property { name: "gpsLatitude"; type: "QVariant" } + Property { name: "gpsLongitude"; type: "QVariant" } + Property { name: "gpsAltitude"; type: "QVariant" } + Property { name: "gpsTimeStamp"; type: "QVariant" } + Property { name: "gpsSatellites"; type: "QVariant" } + Property { name: "gpsStatus"; type: "QVariant" } + Property { name: "gpsDOP"; type: "QVariant" } + Property { name: "gpsSpeed"; type: "QVariant" } + Property { name: "gpsTrack"; type: "QVariant" } + Property { name: "gpsTrackRef"; type: "QVariant" } + Property { name: "gpsImgDirection"; type: "QVariant" } + Property { name: "gpsImgDirectionRef"; type: "QVariant" } + Property { name: "gpsMapDatum"; type: "QVariant" } + Property { name: "gpsProcessingMethod"; type: "QVariant" } + Property { name: "gpsAreaInformation"; type: "QVariant" } + Signal { name: "metaDataChanged" } + } + Component { + name: "QDeclarativeMultimediaGlobal" + prototype: "QObject" + exports: ["QtMultimedia/QtMultimedia 5.4"] + isCreatable: false + isSingleton: true + exportMetaObjectRevisions: [0] + Property { name: "defaultCamera"; type: "QJSValue"; isReadonly: true } + Property { name: "availableCameras"; type: "QJSValue"; isReadonly: true } + } Component { name: "QDeclarativeRadio" prototype: "QObject" @@ -1223,6 +1441,7 @@ Module { Property { name: "source"; type: "QObject"; isPointer: true } Property { name: "fillMode"; type: "FillMode" } Property { name: "orientation"; type: "int" } + Property { name: "autoOrientation"; revision: 2; type: "bool" } Property { name: "sourceRect"; type: "QRectF"; isReadonly: true } Property { name: "contentRect"; type: "QRectF"; isReadonly: true } Signal { @@ -1300,8 +1519,11 @@ Module { Component { name: "QSoundEffect" prototype: "QObject" - exports: ["QtMultimedia/SoundEffect 5.0"] - exportMetaObjectRevisions: [0] + exports: [ + "QtMultimedia/SoundEffect 5.0", + "QtMultimedia/SoundEffect 5.3" + ] + exportMetaObjectRevisions: [0, 0] Enum { name: "Loop" values: { From def89d71716c7909351f6ccce512a0bff6492417 Mon Sep 17 00:00:00 2001 From: Yoann Lopes Date: Thu, 9 Apr 2015 15:14:36 +0200 Subject: [PATCH 14/19] AVFoundation: fix QCameraInfo::availableCameras() on OS X. Cameras can be dynamically added or removed on OS X. Make sure the cache is updated often enough so QCameraInfo::availableCameras() return an up to date list. Task-number: QTBUG-39708 Change-Id: Id806d52278e1a29163fcc6707da7f86c0f3e7c0d Reviewed-by: Timur Pocheptsov --- .../camera/avfcameraserviceplugin.mm | 18 ++++-- .../avfoundation/camera/avfcamerasession.h | 10 ++-- .../avfoundation/camera/avfcamerasession.mm | 59 +++++++++++-------- .../camera/avfvideodevicecontrol.mm | 10 ++-- 4 files changed, 59 insertions(+), 38 deletions(-) diff --git a/src/plugins/avfoundation/camera/avfcameraserviceplugin.mm b/src/plugins/avfoundation/camera/avfcameraserviceplugin.mm index 414a8475..99966f09 100644 --- a/src/plugins/avfoundation/camera/avfcameraserviceplugin.mm +++ b/src/plugins/avfoundation/camera/avfcameraserviceplugin.mm @@ -71,18 +71,26 @@ void AVFServicePlugin::release(QMediaService *service) QByteArray AVFServicePlugin::defaultDevice(const QByteArray &service) const { - if (service == Q_MEDIASERVICE_CAMERA) - return AVFCameraSession::defaultCameraDevice(); + if (service == Q_MEDIASERVICE_CAMERA) { + int i = AVFCameraSession::defaultCameraIndex(); + if (i != -1) + return AVFCameraSession::availableCameraDevices().at(i).deviceId; + } return QByteArray(); } QList AVFServicePlugin::devices(const QByteArray &service) const { - if (service == Q_MEDIASERVICE_CAMERA) - return AVFCameraSession::availableCameraDevices(); + QList devs; - return QList(); + if (service == Q_MEDIASERVICE_CAMERA) { + const QList &cameras = AVFCameraSession::availableCameraDevices(); + Q_FOREACH (const AVFCameraInfo &info, cameras) + devs.append(info.deviceId); + } + + return devs; } QString AVFServicePlugin::deviceDescription(const QByteArray &service, const QByteArray &device) diff --git a/src/plugins/avfoundation/camera/avfcamerasession.h b/src/plugins/avfoundation/camera/avfcamerasession.h index 75ca3f4c..8ce7461d 100644 --- a/src/plugins/avfoundation/camera/avfcamerasession.h +++ b/src/plugins/avfoundation/camera/avfcamerasession.h @@ -52,6 +52,7 @@ struct AVFCameraInfo AVFCameraInfo() : position(QCamera::UnspecifiedPosition), orientation(0) { } + QByteArray deviceId; QString description; QCamera::Position position; int orientation; @@ -64,8 +65,8 @@ public: AVFCameraSession(AVFCameraService *service, QObject *parent = 0); ~AVFCameraSession(); - static const QByteArray &defaultCameraDevice(); - static const QList &availableCameraDevices(); + static int defaultCameraIndex(); + static const QList &availableCameraDevices(); static AVFCameraInfo cameraDeviceInfo(const QByteArray &device); void setVideoOutput(AVFVideoRendererControl *output); @@ -93,9 +94,8 @@ private: static void updateCameraDevices(); void attachInputDevices(); - static QByteArray m_defaultCameraDevice; - static QList m_cameraDevices; - static QMap m_cameraInfo; + static int m_defaultCameraIndex; + static QList m_cameraDevices; AVFCameraService *m_service; AVFVideoRendererControl *m_videoOutput; diff --git a/src/plugins/avfoundation/camera/avfcamerasession.mm b/src/plugins/avfoundation/camera/avfcamerasession.mm index a72ef504..4d4b2f65 100644 --- a/src/plugins/avfoundation/camera/avfcamerasession.mm +++ b/src/plugins/avfoundation/camera/avfcamerasession.mm @@ -52,14 +52,14 @@ #include #include +#include #include QT_USE_NAMESPACE -QByteArray AVFCameraSession::m_defaultCameraDevice; -QList AVFCameraSession::m_cameraDevices; -QMap AVFCameraSession::m_cameraInfo; +int AVFCameraSession::m_defaultCameraIndex; +QList AVFCameraSession::m_cameraDevices; @interface AVFCameraSessionObserver : NSObject { @@ -172,45 +172,55 @@ AVFCameraSession::~AVFCameraSession() [m_captureSession release]; } -const QByteArray &AVFCameraSession::defaultCameraDevice() +int AVFCameraSession::defaultCameraIndex() { - if (m_cameraDevices.isEmpty()) - updateCameraDevices(); - - return m_defaultCameraDevice; + updateCameraDevices(); + return m_defaultCameraIndex; } -const QList &AVFCameraSession::availableCameraDevices() +const QList &AVFCameraSession::availableCameraDevices() { - if (m_cameraDevices.isEmpty()) - updateCameraDevices(); - + updateCameraDevices(); return m_cameraDevices; } AVFCameraInfo AVFCameraSession::cameraDeviceInfo(const QByteArray &device) { - if (m_cameraDevices.isEmpty()) - updateCameraDevices(); + updateCameraDevices(); - return m_cameraInfo.value(device); + Q_FOREACH (const AVFCameraInfo &info, m_cameraDevices) { + if (info.deviceId == device) + return info; + } + + return AVFCameraInfo(); } void AVFCameraSession::updateCameraDevices() { - m_defaultCameraDevice.clear(); +#ifdef Q_OS_IOS + // Cameras can't change dynamically on iOS. Update only once. + if (!m_cameraDevices.isEmpty()) + return; +#else + // On OS X, cameras can be added or removed. Update the list every time, but not more than + // once every 500 ms + static QElapsedTimer timer; + if (timer.isValid() && timer.elapsed() < 500) // ms + return; +#endif + + m_defaultCameraIndex = -1; m_cameraDevices.clear(); - m_cameraInfo.clear(); AVCaptureDevice *defaultDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; - if (defaultDevice) - m_defaultCameraDevice = QByteArray([[defaultDevice uniqueID] UTF8String]); - NSArray *videoDevices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo]; for (AVCaptureDevice *device in videoDevices) { - QByteArray deviceId([[device uniqueID] UTF8String]); + if (defaultDevice && [defaultDevice.uniqueID isEqualToString:device.uniqueID]) + m_defaultCameraIndex = m_cameraDevices.count(); AVFCameraInfo info; + info.deviceId = QByteArray([[device uniqueID] UTF8String]); info.description = QString::fromNSString([device localizedName]); // There is no API to get the camera sensor orientation, however, cameras are always @@ -235,9 +245,12 @@ void AVFCameraSession::updateCameraDevices() break; } - m_cameraDevices << deviceId; - m_cameraInfo.insert(deviceId, info); + m_cameraDevices.append(info); } + +#ifndef Q_OS_IOS + timer.restart(); +#endif } void AVFCameraSession::setVideoOutput(AVFVideoRendererControl *output) diff --git a/src/plugins/avfoundation/camera/avfvideodevicecontrol.mm b/src/plugins/avfoundation/camera/avfvideodevicecontrol.mm index 03736c39..1730437f 100644 --- a/src/plugins/avfoundation/camera/avfvideodevicecontrol.mm +++ b/src/plugins/avfoundation/camera/avfvideodevicecontrol.mm @@ -65,25 +65,25 @@ int AVFVideoDeviceControl::deviceCount() const QString AVFVideoDeviceControl::deviceName(int index) const { - const QList &devices = AVFCameraSession::availableCameraDevices(); + const QList &devices = AVFCameraSession::availableCameraDevices(); if (index < 0 || index >= devices.count()) return QString(); - return QString::fromUtf8(devices.at(index)); + return QString::fromUtf8(devices.at(index).deviceId); } QString AVFVideoDeviceControl::deviceDescription(int index) const { - const QList &devices = AVFCameraSession::availableCameraDevices(); + const QList &devices = AVFCameraSession::availableCameraDevices(); if (index < 0 || index >= devices.count()) return QString(); - return AVFCameraSession::cameraDeviceInfo(devices.at(index)).description; + return devices.at(index).description; } int AVFVideoDeviceControl::defaultDevice() const { - return AVFCameraSession::availableCameraDevices().indexOf(AVFCameraSession::defaultCameraDevice()); + return AVFCameraSession::defaultCameraIndex(); } int AVFVideoDeviceControl::selectedDevice() const From f3a07360dd5a7b8e8b13217b08a952a1584e8101 Mon Sep 17 00:00:00 2001 From: Yoann Lopes Date: Fri, 10 Apr 2015 17:38:23 +0200 Subject: [PATCH 15/19] CoreAudio: fix crash on iOS 5. The plugin was using some iOS 6 APIs, even though we're supposed to support iOS 5. Add version checks for all these APIs. Task-number: QTBUG-44790 Change-Id: I9268963b7d3601222451ce0c948c2d024d37c86f Reviewed-by: Christian Stromme --- .../coreaudio/coreaudiosessionmanager.mm | 115 +++++++++++++----- 1 file changed, 86 insertions(+), 29 deletions(-) diff --git a/src/plugins/coreaudio/coreaudiosessionmanager.mm b/src/plugins/coreaudio/coreaudiosessionmanager.mm index 6a8e97f4..42c1684c 100644 --- a/src/plugins/coreaudio/coreaudiosessionmanager.mm +++ b/src/plugins/coreaudio/coreaudiosessionmanager.mm @@ -44,6 +44,10 @@ #import #import +#if QT_IOS_DEPLOYMENT_TARGET_BELOW(__IPHONE_6_0) +#include +#endif + QT_BEGIN_NAMESPACE @interface CoreAudioSessionObserver : NSObject @@ -79,19 +83,24 @@ QT_BEGIN_NAMESPACE self->m_sessionManager = sessionManager; self->m_audioSession = [AVAudioSession sharedInstance]; - //Set up observers - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(audioSessionInterruption:) - name:AVAudioSessionInterruptionNotification - object:self->m_audioSession]; - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(audioSessionMediaServicesWereReset:) - name:AVAudioSessionMediaServicesWereResetNotification - object:self->m_audioSession]; - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(audioSessionRouteChange:) - name:AVAudioSessionRouteChangeNotification - object:self->m_audioSession]; +#if QT_IOS_DEPLOYMENT_TARGET_BELOW(__IPHONE_6_0) + if (QSysInfo::MacintoshVersion >= QSysInfo::MV_IOS_6_0) +#endif + { + //Set up observers + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(audioSessionInterruption:) + name:AVAudioSessionInterruptionNotification + object:self->m_audioSession]; + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(audioSessionMediaServicesWereReset:) + name:AVAudioSessionMediaServicesWereResetNotification + object:self->m_audioSession]; + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(audioSessionRouteChange:) + name:AVAudioSessionRouteChangeNotification + object:self->m_audioSession]; + } return self; } @@ -101,15 +110,22 @@ QT_BEGIN_NAMESPACE #ifdef QT_DEBUG_COREAUDIO qDebug() << Q_FUNC_INFO; #endif - [[NSNotificationCenter defaultCenter] removeObserver:self - name:AVAudioSessionInterruptionNotification - object:self->m_audioSession]; - [[NSNotificationCenter defaultCenter] removeObserver:self - name:AVAudioSessionMediaServicesWereResetNotification - object:self->m_audioSession]; - [[NSNotificationCenter defaultCenter] removeObserver:self - name:AVAudioSessionRouteChangeNotification - object:self->m_audioSession]; + +#if QT_IOS_DEPLOYMENT_TARGET_BELOW(__IPHONE_6_0) + if (QSysInfo::MacintoshVersion >= QSysInfo::MV_IOS_6_0) +#endif + { + [[NSNotificationCenter defaultCenter] removeObserver:self + name:AVAudioSessionInterruptionNotification + object:self->m_audioSession]; + [[NSNotificationCenter defaultCenter] removeObserver:self + name:AVAudioSessionMediaServicesWereResetNotification + object:self->m_audioSession]; + [[NSNotificationCenter defaultCenter] removeObserver:self + name:AVAudioSessionRouteChangeNotification + object:self->m_audioSession]; + } + [super dealloc]; } @@ -269,6 +285,9 @@ bool CoreAudioSessionManager::setCategory(CoreAudioSessionManager::AudioSessionC targetCategory = AVAudioSessionCategoryAudioProcessing; break; case CoreAudioSessionManager::MultiRoute: +#if QT_IOS_DEPLOYMENT_TARGET_BELOW(__IPHONE_6_0) + if (QSysInfo::MacintoshVersion >= QSysInfo::MV_IOS_6_0) +#endif targetCategory = AVAudioSessionCategoryMultiRoute; break; } @@ -276,9 +295,16 @@ bool CoreAudioSessionManager::setCategory(CoreAudioSessionManager::AudioSessionC if (targetCategory == nil) return false; - return [[m_sessionObserver audioSession] setCategory:targetCategory - withOptions:(AVAudioSessionCategoryOptions)options - error:nil]; +#if QT_IOS_DEPLOYMENT_TARGET_BELOW(__IPHONE_6_0) + if (QSysInfo::MacintoshVersion < QSysInfo::MV_IOS_6_0) { + return [[m_sessionObserver audioSession] setCategory:targetCategory error:nil]; + } else +#endif + { + return [[m_sessionObserver audioSession] setCategory:targetCategory + withOptions:(AVAudioSessionCategoryOptions)options + error:nil]; + } } bool CoreAudioSessionManager::setMode(CoreAudioSessionManager::AudioSessionModes mode) @@ -301,6 +327,9 @@ bool CoreAudioSessionManager::setMode(CoreAudioSessionManager::AudioSessionModes targetMode = AVAudioSessionModeMeasurement; break; case CoreAudioSessionManager::MoviePlayback: +#if QT_IOS_DEPLOYMENT_TARGET_BELOW(__IPHONE_6_0) + if (QSysInfo::MacintoshVersion >= QSysInfo::MV_IOS_6_0) +#endif targetMode = AVAudioSessionModeMoviePlayback; break; } @@ -329,7 +358,11 @@ CoreAudioSessionManager::AudioSessionCategorys CoreAudioSessionManager::category localCategory = PlayAndRecord; } else if (category == AVAudioSessionCategoryAudioProcessing) { localCategory = AudioProcessing; - } else if (category == AVAudioSessionCategoryMultiRoute) { + } else if ( +#if QT_IOS_DEPLOYMENT_TARGET_BELOW(__IPHONE_6_0) + QSysInfo::MacintoshVersion >= QSysInfo::MV_IOS_6_0 && +#endif + category == AVAudioSessionCategoryMultiRoute) { localCategory = MultiRoute; } @@ -351,7 +384,11 @@ CoreAudioSessionManager::AudioSessionModes CoreAudioSessionManager::mode() localMode = VideoRecording; } else if (mode == AVAudioSessionModeMeasurement) { localMode = Measurement; - } else if (mode == AVAudioSessionModeMoviePlayback) { + } else if ( +#if QT_IOS_DEPLOYMENT_TARGET_BELOW(__IPHONE_6_0) + QSysInfo::MacintoshVersion >= QSysInfo::MV_IOS_6_0 && +#endif + mode == AVAudioSessionModeMoviePlayback) { localMode = MoviePlayback; } @@ -380,12 +417,32 @@ QList CoreAudioSessionManager::outputDevices() float CoreAudioSessionManager::currentIOBufferDuration() { - return [[m_sessionObserver audioSession] IOBufferDuration]; +#if QT_IOS_DEPLOYMENT_TARGET_BELOW(__IPHONE_6_0) + if (QSysInfo::MacintoshVersion < QSysInfo::MV_IOS_6_0) { + Float32 duration; + UInt32 size = sizeof(duration); + AudioSessionGetProperty(kAudioSessionProperty_CurrentHardwareIOBufferDuration, &size, &duration); + return duration; + } else +#endif + { + return [[m_sessionObserver audioSession] IOBufferDuration]; + } } float CoreAudioSessionManager::preferredSampleRate() { - return [[m_sessionObserver audioSession] preferredSampleRate]; +#if QT_IOS_DEPLOYMENT_TARGET_BELOW(__IPHONE_6_0) + if (QSysInfo::MacintoshVersion < QSysInfo::MV_IOS_6_0) { + Float64 sampleRate; + UInt32 size = sizeof(sampleRate); + AudioSessionGetProperty(kAudioSessionProperty_PreferredHardwareSampleRate, &size, &sampleRate); + return sampleRate; + } else +#endif + { + return [[m_sessionObserver audioSession] preferredSampleRate]; + } } #ifdef QT_DEBUG_COREAUDIO From b109f093d9bad84d54d5114735f311762f0eb42a Mon Sep 17 00:00:00 2001 From: Yoann Lopes Date: Tue, 14 Apr 2015 13:42:46 +0200 Subject: [PATCH 16/19] WMF: fix reported sample type of 8-bit audio formats. Always report 8-bit PCM data as unsigned integer. Even though there's no API to actually know that, it's standard on Windows. 8-bit is unsigned and 16-bit is signed. Task-number: QTBUG-45540 Change-Id: I4a3c09084de688ea7afc3bc147508184fb582224 Reviewed-by: Christian Stromme --- .../wmf/decoder/mfaudiodecodercontrol.cpp | 25 +++++++++++-------- src/plugins/wmf/player/mfplayersession.cpp | 5 +++- 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/src/plugins/wmf/decoder/mfaudiodecodercontrol.cpp b/src/plugins/wmf/decoder/mfaudiodecodercontrol.cpp index da69f926..ff093e95 100644 --- a/src/plugins/wmf/decoder/mfaudiodecodercontrol.cpp +++ b/src/plugins/wmf/decoder/mfaudiodecodercontrol.cpp @@ -193,17 +193,6 @@ void MFAudioDecoderControl::handleMediaSourceReady() if (mediaType) { m_sourceOutputFormat = m_audioFormat; QAudioFormat af = m_audioFormat; - GUID subType; - if (SUCCEEDED(mediaType->GetGUID(MF_MT_SUBTYPE, &subType))) { - if (subType == MFAudioFormat_Float) { - m_sourceOutputFormat.setSampleType(QAudioFormat::Float); - } else { - m_sourceOutputFormat.setSampleType(QAudioFormat::SignedInt); - } - } - if (m_sourceOutputFormat.sampleType() != QAudioFormat::Float) { - m_sourceOutputFormat.setByteOrder(QAudioFormat::LittleEndian); - } UINT32 val = 0; if (SUCCEEDED(mediaType->GetUINT32(MF_MT_AUDIO_NUM_CHANNELS, &val))) { @@ -216,6 +205,20 @@ void MFAudioDecoderControl::handleMediaSourceReady() m_sourceOutputFormat.setSampleSize(int(val)); } + GUID subType; + if (SUCCEEDED(mediaType->GetGUID(MF_MT_SUBTYPE, &subType))) { + if (subType == MFAudioFormat_Float) { + m_sourceOutputFormat.setSampleType(QAudioFormat::Float); + } else if (m_sourceOutputFormat.sampleSize() == 8) { + m_sourceOutputFormat.setSampleType(QAudioFormat::UnSignedInt); + } else { + m_sourceOutputFormat.setSampleType(QAudioFormat::SignedInt); + } + } + if (m_sourceOutputFormat.sampleType() != QAudioFormat::Float) { + m_sourceOutputFormat.setByteOrder(QAudioFormat::LittleEndian); + } + if (m_audioFormat.sampleType() != QAudioFormat::Float && m_audioFormat.sampleType() != QAudioFormat::SignedInt) { af.setSampleType(m_sourceOutputFormat.sampleType()); diff --git a/src/plugins/wmf/player/mfplayersession.cpp b/src/plugins/wmf/player/mfplayersession.cpp index 599fa90c..d6cf07ef 100644 --- a/src/plugins/wmf/player/mfplayersession.cpp +++ b/src/plugins/wmf/player/mfplayersession.cpp @@ -556,7 +556,10 @@ QAudioFormat MFPlayerSession::audioFormatForMFMediaType(IMFMediaType *mediaType) format.setSampleSize(wfx->wBitsPerSample); format.setCodec("audio/pcm"); format.setByteOrder(QAudioFormat::LittleEndian); - format.setSampleType(QAudioFormat::SignedInt); + if (format.sampleSize() == 8) + format.setSampleType(QAudioFormat::UnSignedInt); + else + format.setSampleType(QAudioFormat::SignedInt); CoTaskMemFree(wfx); return format; From b529cf242a596b47ebb0fc659e63439fa6e7cb79 Mon Sep 17 00:00:00 2001 From: Yoann Lopes Date: Wed, 8 Apr 2015 15:08:53 +0200 Subject: [PATCH 17/19] Fix incorrect signal/slot connection in QDeclarativeTorch. Change-Id: Id8cb716e25a2c08111f99112fbf319fb8331d64d Reviewed-by: Christian Stromme --- src/imports/multimedia/qdeclarativetorch.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/imports/multimedia/qdeclarativetorch.cpp b/src/imports/multimedia/qdeclarativetorch.cpp index 28cb7ab7..da2cfae3 100644 --- a/src/imports/multimedia/qdeclarativetorch.cpp +++ b/src/imports/multimedia/qdeclarativetorch.cpp @@ -74,7 +74,7 @@ QDeclarativeTorch::QDeclarativeTorch(QObject *parent) m_flash = service ? service->requestControl() : 0; if (m_exposure) - connect(m_exposure, SIGNAL(valueChanged(int)), SLOT(parameterChanged(int))); + connect(m_exposure, SIGNAL(actualValueChanged(int)), SLOT(parameterChanged(int))); // XXX There's no signal for flash mode changed } From 07606dde9a1f6b89f582ff8f1fbc53e2d4eb2c22 Mon Sep 17 00:00:00 2001 From: Yoann Lopes Date: Fri, 13 Mar 2015 16:25:15 +0100 Subject: [PATCH 18/19] WindowsAudio: improve supported formats detection. QAudioDeviceInfo::isFormatSupported() now tries to open the device with that format to theck if it is supported. We were before simply checking that its parameters were included in the list of supported values, which might be incomplete. In addition, since the Windows API to check device capabilities is quite limited, we now test additional common formats and add them to the supported formats if the device can open them. Task-number: QTBUG-42648 Change-Id: Idd0affbd6d91d4fd027a6a4c86c2f3fe008a118f Reviewed-by: Christian Stromme --- .../windowsaudio/qwindowsaudiodeviceinfo.cpp | 200 ++++++++---------- .../windowsaudio/qwindowsaudiodeviceinfo.h | 6 +- .../windowsaudio/qwindowsaudioinput.cpp | 21 +- src/plugins/windowsaudio/qwindowsaudioinput.h | 5 +- .../windowsaudio/qwindowsaudiooutput.cpp | 119 +---------- .../windowsaudio/qwindowsaudiooutput.h | 5 +- .../windowsaudio/qwindowsaudioutils.cpp | 111 ++++++++++ src/plugins/windowsaudio/qwindowsaudioutils.h | 67 ++++++ src/plugins/windowsaudio/windowsaudio.pro | 6 +- 9 files changed, 293 insertions(+), 247 deletions(-) create mode 100644 src/plugins/windowsaudio/qwindowsaudioutils.cpp create mode 100644 src/plugins/windowsaudio/qwindowsaudioutils.h diff --git a/src/plugins/windowsaudio/qwindowsaudiodeviceinfo.cpp b/src/plugins/windowsaudio/qwindowsaudiodeviceinfo.cpp index 625cf682..24a577ed 100644 --- a/src/plugins/windowsaudio/qwindowsaudiodeviceinfo.cpp +++ b/src/plugins/windowsaudio/qwindowsaudiodeviceinfo.cpp @@ -44,8 +44,8 @@ #include -#include #include "qwindowsaudiodeviceinfo.h" +#include "qwindowsaudioutils.h" #if defined(Q_CC_MINGW) && !defined(__MINGW64_VERSION_MAJOR) struct IBaseFilter; // Needed for strmif.h from stock MinGW. @@ -166,8 +166,7 @@ QString QWindowsAudioDeviceInfo::deviceName() const QStringList QWindowsAudioDeviceInfo::supportedCodecs() { - updateLists(); - return codecz; + return QStringList() << QStringLiteral("audio/pcm"); } QList QWindowsAudioDeviceInfo::supportedSampleRates() @@ -190,8 +189,7 @@ QList QWindowsAudioDeviceInfo::supportedSampleSizes() QList QWindowsAudioDeviceInfo::supportedByteOrders() { - updateLists(); - return byteOrderz; + return QList() << QAudioFormat::LittleEndian; } QList QWindowsAudioDeviceInfo::supportedSampleTypes() @@ -212,118 +210,50 @@ void QWindowsAudioDeviceInfo::close() bool QWindowsAudioDeviceInfo::testSettings(const QAudioFormat& format) const { - // Set nearest to closest settings that do work. - // See if what is in settings will work (return value). - - bool failed = false; - bool match = false; - - // check codec - for( int i = 0; i < codecz.count(); i++) { - if (format.codec() == codecz.at(i)) - match = true; - } - if (!match) failed = true; - - // check channel - match = false; - if (!failed) { - for (int i = 0; i < channelz.count(); i++) { - if (format.channelCount() == channelz.at(i)) { - match = true; - break; - } + WAVEFORMATEXTENSIBLE wfx; + if (qt_convertFormat(format, &wfx)) { + // query only, do not open device + if (mode == QAudio::AudioOutput) { + return (waveOutOpen(NULL, UINT_PTR(devId), &wfx.Format, NULL, NULL, + WAVE_FORMAT_QUERY) == MMSYSERR_NOERROR); + } else { // AudioInput + return (waveInOpen(NULL, UINT_PTR(devId), &wfx.Format, NULL, NULL, + WAVE_FORMAT_QUERY) == MMSYSERR_NOERROR); } - if (!match) - failed = true; } - // check sampleRate - match = false; - if (!failed) { - for (int i = 0; i < sampleRatez.count(); i++) { - if (format.sampleRate() == sampleRatez.at(i)) { - match = true; - break; - } - } - if (!match) - failed = true; - } - - // check sample size - match = false; - if (!failed) { - for( int i = 0; i < sizez.count(); i++) { - if (format.sampleSize() == sizez.at(i)) { - match = true; - break; - } - } - if (!match) - failed = true; - } - - // check byte order - match = false; - if (!failed) { - for( int i = 0; i < byteOrderz.count(); i++) { - if (format.byteOrder() == byteOrderz.at(i)) { - match = true; - break; - } - } - if (!match) - failed = true; - } - - // check sample type - match = false; - if (!failed) { - for( int i = 0; i < typez.count(); i++) { - if (format.sampleType() == typez.at(i)) { - match = true; - break; - } - } - if (!match) - failed = true; - } - - if(!failed) { - // settings work - return true; - } return false; } void QWindowsAudioDeviceInfo::updateLists() { - // redo all lists based on current settings - bool match = false; + if (!sizez.isEmpty()) + return; + + bool hasCaps = false; DWORD fmt = 0; if(mode == QAudio::AudioOutput) { WAVEOUTCAPS woc; if (waveOutGetDevCaps(devId, &woc, sizeof(WAVEOUTCAPS)) == MMSYSERR_NOERROR) { - match = true; + hasCaps = true; fmt = woc.dwFormats; } } else { WAVEINCAPS woc; if (waveInGetDevCaps(devId, &woc, sizeof(WAVEINCAPS)) == MMSYSERR_NOERROR) { - match = true; + hasCaps = true; fmt = woc.dwFormats; } } + sizez.clear(); sampleRatez.clear(); channelz.clear(); - byteOrderz.clear(); typez.clear(); - codecz.clear(); - if(match) { + if (hasCaps) { + // Check sample size if ((fmt & WAVE_FORMAT_1M08) || (fmt & WAVE_FORMAT_1S08) || (fmt & WAVE_FORMAT_2M08) @@ -333,8 +263,7 @@ void QWindowsAudioDeviceInfo::updateLists() || (fmt & WAVE_FORMAT_48M08) || (fmt & WAVE_FORMAT_48S08) || (fmt & WAVE_FORMAT_96M08) - || (fmt & WAVE_FORMAT_96S08) - ) { + || (fmt & WAVE_FORMAT_96S08)) { sizez.append(8); } if ((fmt & WAVE_FORMAT_1M16) @@ -346,10 +275,11 @@ void QWindowsAudioDeviceInfo::updateLists() || (fmt & WAVE_FORMAT_48M16) || (fmt & WAVE_FORMAT_48S16) || (fmt & WAVE_FORMAT_96M16) - || (fmt & WAVE_FORMAT_96S16) - ) { + || (fmt & WAVE_FORMAT_96S16)) { sizez.append(16); } + + // Check sample rate if ((fmt & WAVE_FORMAT_1M08) || (fmt & WAVE_FORMAT_1S08) || (fmt & WAVE_FORMAT_1M16) @@ -380,23 +310,81 @@ void QWindowsAudioDeviceInfo::updateLists() || (fmt & WAVE_FORMAT_96S16)) { sampleRatez.append(96000); } - channelz.append(1); - channelz.append(2); - if (mode == QAudio::AudioOutput) { - channelz.append(4); - channelz.append(6); - channelz.append(8); - } - byteOrderz.append(QAudioFormat::LittleEndian); + // Check channel count + if (fmt & WAVE_FORMAT_1M08 + || fmt & WAVE_FORMAT_1M16 + || fmt & WAVE_FORMAT_2M08 + || fmt & WAVE_FORMAT_2M16 + || fmt & WAVE_FORMAT_4M08 + || fmt & WAVE_FORMAT_4M16 + || fmt & WAVE_FORMAT_48M08 + || fmt & WAVE_FORMAT_48M16 + || fmt & WAVE_FORMAT_96M08 + || fmt & WAVE_FORMAT_96M16) { + channelz.append(1); + } + if (fmt & WAVE_FORMAT_1S08 + || fmt & WAVE_FORMAT_1S16 + || fmt & WAVE_FORMAT_2S08 + || fmt & WAVE_FORMAT_2S16 + || fmt & WAVE_FORMAT_4S08 + || fmt & WAVE_FORMAT_4S16 + || fmt & WAVE_FORMAT_48S08 + || fmt & WAVE_FORMAT_48S16 + || fmt & WAVE_FORMAT_96S08 + || fmt & WAVE_FORMAT_96S16) { + channelz.append(2); + } typez.append(QAudioFormat::SignedInt); typez.append(QAudioFormat::UnSignedInt); - codecz.append(QLatin1String("audio/pcm")); + // WAVEOUTCAPS and WAVEINCAPS contains information only for the previously tested parameters. + // WaveOut and WaveInt might actually support more formats, the only way to know is to try + // opening the device with it. + QAudioFormat testFormat; + testFormat.setCodec(QStringLiteral("audio/pcm")); + testFormat.setByteOrder(QAudioFormat::LittleEndian); + testFormat.setSampleType(QAudioFormat::SignedInt); + testFormat.setChannelCount(channelz.first()); + testFormat.setSampleRate(sampleRatez.at(sampleRatez.size() / 2)); + testFormat.setSampleSize(sizez.last()); + const QAudioFormat defaultTestFormat(testFormat); + + // Check if float samples are supported + testFormat.setSampleType(QAudioFormat::Float); + testFormat.setSampleSize(32); + if (testSettings(testFormat)) + typez.append(QAudioFormat::Float); + + // Check channel counts > 2 + testFormat = defaultTestFormat; + for (int i = 3; i < 19; ++i) { // defines 18 different channels + testFormat.setChannelCount(i); + if (testSettings(testFormat)) + channelz.append(i); + } + + // Check more sample sizes + testFormat = defaultTestFormat; + QList testSampleSizes = QList() << 24 << 32 << 48 << 64; + Q_FOREACH (int s, testSampleSizes) { + testFormat.setSampleSize(s); + if (testSettings(testFormat)) + sizez.append(s); + } + + // Check more sample rates + testFormat = defaultTestFormat; + QList testSampleRates = QList() << 8000 << 16000 << 32000 << 88200 << 192000; + Q_FOREACH (int r, testSampleRates) { + testFormat.setSampleRate(r); + if (testSettings(testFormat)) + sampleRatez.append(r); + } + std::sort(sampleRatez.begin(), sampleRatez.end()); } - if (sampleRatez.count() > 0) - sampleRatez.prepend(8000); } QList QWindowsAudioDeviceInfo::availableDevices(QAudio::Mode mode) diff --git a/src/plugins/windowsaudio/qwindowsaudiodeviceinfo.h b/src/plugins/windowsaudio/qwindowsaudiodeviceinfo.h index 3b274fd8..4a2de555 100644 --- a/src/plugins/windowsaudio/qwindowsaudiodeviceinfo.h +++ b/src/plugins/windowsaudio/qwindowsaudiodeviceinfo.h @@ -57,7 +57,6 @@ QT_BEGIN_NAMESPACE - const unsigned int MAX_SAMPLE_RATES = 5; const unsigned int SAMPLE_RATES[] = { 8000, 11025, 22050, 44100, 48000 }; @@ -91,15 +90,14 @@ private: QAudio::Mode mode; QString device; quint32 devId; - QAudioFormat nearest; QList sampleRatez; QList channelz; QList sizez; - QList byteOrderz; - QStringList codecz; QList typez; }; + + QT_END_NAMESPACE diff --git a/src/plugins/windowsaudio/qwindowsaudioinput.cpp b/src/plugins/windowsaudio/qwindowsaudioinput.cpp index b44f206e..ac92cf58 100644 --- a/src/plugins/windowsaudio/qwindowsaudioinput.cpp +++ b/src/plugins/windowsaudio/qwindowsaudioinput.cpp @@ -296,18 +296,9 @@ bool QWindowsAudioInput::open() period_size = 0; - if (!settings.isValid()) { + if (!qt_convertFormat(settings, &wfx)) { qWarning("QAudioInput: open error, invalid format."); - } else if (settings.channelCount() <= 0) { - qWarning("QAudioInput: open error, invalid number of channels (%d).", - settings.channelCount()); - } else if (settings.sampleSize() <= 0) { - qWarning("QAudioInput: open error, invalid sample size (%d).", - settings.sampleSize()); - } else if (settings.sampleRate() < 8000 || settings.sampleRate() > 96000) { - qWarning("QAudioInput: open error, sample rate out of range (%d).", settings.sampleRate()); } else if (buffer_size == 0) { - buffer_size = (settings.sampleRate() * settings.channelCount() @@ -327,20 +318,12 @@ bool QWindowsAudioInput::open() timeStamp.restart(); elapsedTimeOffset = 0; - wfx.nSamplesPerSec = settings.sampleRate(); - wfx.wBitsPerSample = settings.sampleSize(); - wfx.nChannels = settings.channelCount(); - wfx.cbSize = 0; - - wfx.wFormatTag = WAVE_FORMAT_PCM; - wfx.nBlockAlign = (wfx.wBitsPerSample >> 3) * wfx.nChannels; - wfx.nAvgBytesPerSec = wfx.nBlockAlign * wfx.nSamplesPerSec; QDataStream ds(&m_device, QIODevice::ReadOnly); quint32 deviceId; ds >> deviceId; - if (waveInOpen(&hWaveIn, UINT_PTR(deviceId), &wfx, + if (waveInOpen(&hWaveIn, UINT_PTR(deviceId), &wfx.Format, (DWORD_PTR)&waveInProc, (DWORD_PTR) this, CALLBACK_FUNCTION) != MMSYSERR_NOERROR) { diff --git a/src/plugins/windowsaudio/qwindowsaudioinput.h b/src/plugins/windowsaudio/qwindowsaudioinput.h index 27edabf0..151996d7 100644 --- a/src/plugins/windowsaudio/qwindowsaudioinput.h +++ b/src/plugins/windowsaudio/qwindowsaudioinput.h @@ -45,8 +45,7 @@ #ifndef QWINDOWSAUDIOINPUT_H #define QWINDOWSAUDIOINPUT_H -#include -#include +#include "qwindowsaudioutils.h" #include #include @@ -121,7 +120,7 @@ private: qint64 totalTimeValue; bool pullMode; bool resuming; - WAVEFORMATEX wfx; + WAVEFORMATEXTENSIBLE wfx; HWAVEIN hWaveIn; MMRESULT result; WAVEHDR* waveBlocks; diff --git a/src/plugins/windowsaudio/qwindowsaudiooutput.cpp b/src/plugins/windowsaudio/qwindowsaudiooutput.cpp index a9230139..92348879 100644 --- a/src/plugins/windowsaudio/qwindowsaudiooutput.cpp +++ b/src/plugins/windowsaudio/qwindowsaudiooutput.cpp @@ -43,55 +43,10 @@ // #include "qwindowsaudiooutput.h" +#include "qwindowsaudiodeviceinfo.h" +#include "qwindowsaudioutils.h" #include -#ifndef SPEAKER_FRONT_LEFT - #define SPEAKER_FRONT_LEFT 0x00000001 - #define SPEAKER_FRONT_RIGHT 0x00000002 - #define SPEAKER_FRONT_CENTER 0x00000004 - #define SPEAKER_LOW_FREQUENCY 0x00000008 - #define SPEAKER_BACK_LEFT 0x00000010 - #define SPEAKER_BACK_RIGHT 0x00000020 - #define SPEAKER_FRONT_LEFT_OF_CENTER 0x00000040 - #define SPEAKER_FRONT_RIGHT_OF_CENTER 0x00000080 - #define SPEAKER_BACK_CENTER 0x00000100 - #define SPEAKER_SIDE_LEFT 0x00000200 - #define SPEAKER_SIDE_RIGHT 0x00000400 - #define SPEAKER_TOP_CENTER 0x00000800 - #define SPEAKER_TOP_FRONT_LEFT 0x00001000 - #define SPEAKER_TOP_FRONT_CENTER 0x00002000 - #define SPEAKER_TOP_FRONT_RIGHT 0x00004000 - #define SPEAKER_TOP_BACK_LEFT 0x00008000 - #define SPEAKER_TOP_BACK_CENTER 0x00010000 - #define SPEAKER_TOP_BACK_RIGHT 0x00020000 - #define SPEAKER_RESERVED 0x7FFC0000 - #define SPEAKER_ALL 0x80000000 -#endif - -#ifndef _WAVEFORMATEXTENSIBLE_ - - #define _WAVEFORMATEXTENSIBLE_ - typedef struct - { - WAVEFORMATEX Format; // Base WAVEFORMATEX data - union - { - WORD wValidBitsPerSample; // Valid bits in each sample container - WORD wSamplesPerBlock; // Samples per block of audio data; valid - // if wBitsPerSample=0 (but rarely used). - WORD wReserved; // Zero if neither case above applies. - } Samples; - DWORD dwChannelMask; // Positions of the audio channels - GUID SubFormat; // Format identifier GUID - } WAVEFORMATEXTENSIBLE, *PWAVEFORMATEXTENSIBLE, *LPPWAVEFORMATEXTENSIBLE; - typedef const WAVEFORMATEXTENSIBLE* LPCWAVEFORMATEXTENSIBLE; - -#endif - -#if !defined(WAVE_FORMAT_EXTENSIBLE) -#define WAVE_FORMAT_EXTENSIBLE 0xFFFE -#endif - //#define DEBUG_AUDIO 1 QT_BEGIN_NAMESPACE @@ -264,16 +219,8 @@ bool QWindowsAudioOutput::open() period_size = 0; - if (!settings.isValid()) { + if (!qt_convertFormat(settings, &wfx)) { qWarning("QAudioOutput: open error, invalid format."); - } else if (settings.channelCount() <= 0) { - qWarning("QAudioOutput: open error, invalid number of channels (%d).", - settings.channelCount()); - } else if (settings.sampleSize() <= 0) { - qWarning("QAudioOutput: open error, invalid sample size (%d).", - settings.sampleSize()); - } else if (settings.sampleRate() < 8000 || settings.sampleRate() > 96000) { - qWarning("QAudioOutput: open error, sample rate out of range (%d).", settings.sampleRate()); } else if (buffer_size == 0) { // Default buffer size, 200ms, default period size is 40ms buffer_size @@ -307,67 +254,19 @@ bool QWindowsAudioOutput::open() timeStamp.restart(); elapsedTimeOffset = 0; - wfx.nSamplesPerSec = settings.sampleRate(); - wfx.wBitsPerSample = settings.sampleSize(); - wfx.nChannels = settings.channelCount(); - wfx.cbSize = 0; - - bool surround = false; - - if (settings.channelCount() > 2) - surround = true; - - wfx.wFormatTag = WAVE_FORMAT_PCM; - wfx.nBlockAlign = (wfx.wBitsPerSample >> 3) * wfx.nChannels; - wfx.nAvgBytesPerSec = wfx.nBlockAlign * wfx.nSamplesPerSec; - QDataStream ds(&m_device, QIODevice::ReadOnly); quint32 deviceId; ds >> deviceId; - if (!surround) { - if (waveOutOpen(&hWaveOut, UINT_PTR(deviceId), &wfx, + if (waveOutOpen(&hWaveOut, UINT_PTR(deviceId), &wfx.Format, (DWORD_PTR)&waveOutProc, (DWORD_PTR) this, CALLBACK_FUNCTION) != MMSYSERR_NOERROR) { - errorState = QAudio::OpenError; - deviceState = QAudio::StoppedState; - emit stateChanged(deviceState); - qWarning("QAudioOutput: open error"); - return false; - } - } else { - WAVEFORMATEXTENSIBLE wfex; - wfex.Format.wFormatTag = WAVE_FORMAT_EXTENSIBLE; - wfex.Format.nChannels = settings.channelCount(); - wfex.Format.wBitsPerSample = settings.sampleSize(); - wfex.Format.nSamplesPerSec = settings.sampleRate(); - wfex.Format.nBlockAlign = wfex.Format.nChannels*wfex.Format.wBitsPerSample/8; - wfex.Format.nAvgBytesPerSec=wfex.Format.nSamplesPerSec*wfex.Format.nBlockAlign; - wfex.Samples.wValidBitsPerSample=wfex.Format.wBitsPerSample; - static const GUID _KSDATAFORMAT_SUBTYPE_PCM = { - 0x00000001, 0x0000, 0x0010, {0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}}; - wfex.SubFormat=_KSDATAFORMAT_SUBTYPE_PCM; - wfex.Format.cbSize=22; - - wfex.dwChannelMask = SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT; - if (settings.channelCount() >= 4) - wfex.dwChannelMask |= SPEAKER_BACK_LEFT | SPEAKER_BACK_RIGHT; - if (settings.channelCount() >= 6) - wfex.dwChannelMask |= SPEAKER_FRONT_CENTER | SPEAKER_LOW_FREQUENCY; - if (settings.channelCount() == 8) - wfex.dwChannelMask |= SPEAKER_SIDE_LEFT | SPEAKER_SIDE_RIGHT; - - if (waveOutOpen(&hWaveOut, UINT_PTR(deviceId), &wfex.Format, - (DWORD_PTR)&waveOutProc, - (DWORD_PTR) this, - CALLBACK_FUNCTION) != MMSYSERR_NOERROR) { - errorState = QAudio::OpenError; - deviceState = QAudio::StoppedState; - emit stateChanged(deviceState); - qWarning("QAudioOutput: open error"); - return false; - } + errorState = QAudio::OpenError; + deviceState = QAudio::StoppedState; + emit stateChanged(deviceState); + qWarning("QAudioOutput: open error"); + return false; } totalTimeValue = 0; diff --git a/src/plugins/windowsaudio/qwindowsaudiooutput.h b/src/plugins/windowsaudio/qwindowsaudiooutput.h index 479cc98c..afc73ba5 100644 --- a/src/plugins/windowsaudio/qwindowsaudiooutput.h +++ b/src/plugins/windowsaudio/qwindowsaudiooutput.h @@ -45,8 +45,7 @@ #ifndef QWINDOWSAUDIOOUTPUT_H #define QWINDOWSAUDIOOUTPUT_H -#include -#include +#include "qwindowsaudioutils.h" #include #include @@ -132,7 +131,7 @@ private: bool open(); void close(); - WAVEFORMATEX wfx; + WAVEFORMATEXTENSIBLE wfx; HWAVEOUT hWaveOut; MMRESULT result; WAVEHDR header; diff --git a/src/plugins/windowsaudio/qwindowsaudioutils.cpp b/src/plugins/windowsaudio/qwindowsaudioutils.cpp new file mode 100644 index 00000000..36a8d750 --- /dev/null +++ b/src/plugins/windowsaudio/qwindowsaudioutils.cpp @@ -0,0 +1,111 @@ +/**************************************************************************** +** +** Copyright (C) 2015 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL21$ +** 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 Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qwindowsaudioutils.h" + +#ifndef SPEAKER_FRONT_LEFT + #define SPEAKER_FRONT_LEFT 0x00000001 + #define SPEAKER_FRONT_RIGHT 0x00000002 + #define SPEAKER_FRONT_CENTER 0x00000004 + #define SPEAKER_LOW_FREQUENCY 0x00000008 + #define SPEAKER_BACK_LEFT 0x00000010 + #define SPEAKER_BACK_RIGHT 0x00000020 + #define SPEAKER_FRONT_LEFT_OF_CENTER 0x00000040 + #define SPEAKER_FRONT_RIGHT_OF_CENTER 0x00000080 + #define SPEAKER_BACK_CENTER 0x00000100 + #define SPEAKER_SIDE_LEFT 0x00000200 + #define SPEAKER_SIDE_RIGHT 0x00000400 + #define SPEAKER_TOP_CENTER 0x00000800 + #define SPEAKER_TOP_FRONT_LEFT 0x00001000 + #define SPEAKER_TOP_FRONT_CENTER 0x00002000 + #define SPEAKER_TOP_FRONT_RIGHT 0x00004000 + #define SPEAKER_TOP_BACK_LEFT 0x00008000 + #define SPEAKER_TOP_BACK_CENTER 0x00010000 + #define SPEAKER_TOP_BACK_RIGHT 0x00020000 + #define SPEAKER_RESERVED 0x7FFC0000 + #define SPEAKER_ALL 0x80000000 +#endif + +#ifndef WAVE_FORMAT_EXTENSIBLE + #define WAVE_FORMAT_EXTENSIBLE 0xFFFE +#endif + +#ifndef WAVE_FORMAT_IEEE_FLOAT + #define WAVE_FORMAT_IEEE_FLOAT 0x0003 +#endif + +static const GUID _KSDATAFORMAT_SUBTYPE_PCM = { + 0x00000001, 0x0000, 0x0010, {0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}}; + +static const GUID _KSDATAFORMAT_SUBTYPE_IEEE_FLOAT = { + 0x00000003, 0x0000, 0x0010, {0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}}; + +QT_BEGIN_NAMESPACE + +bool qt_convertFormat(const QAudioFormat &format, WAVEFORMATEXTENSIBLE *wfx) +{ + if (!wfx + || !format.isValid() + || format.codec() != QStringLiteral("audio/pcm") + || format.sampleRate() <= 0 + || format.channelCount() <= 0 + || format.sampleSize() <= 0 + || format.byteOrder() != QAudioFormat::LittleEndian) { + return false; + } + + wfx->Format.nSamplesPerSec = format.sampleRate(); + wfx->Format.wBitsPerSample = wfx->Samples.wValidBitsPerSample = format.sampleSize(); + wfx->Format.nChannels = format.channelCount(); + wfx->Format.nBlockAlign = (wfx->Format.wBitsPerSample / 8) * wfx->Format.nChannels; + wfx->Format.nAvgBytesPerSec = wfx->Format.nBlockAlign * wfx->Format.nSamplesPerSec; + wfx->Format.cbSize = 0; + + if (format.sampleType() == QAudioFormat::Float) { + wfx->Format.wFormatTag = WAVE_FORMAT_IEEE_FLOAT; + wfx->SubFormat = _KSDATAFORMAT_SUBTYPE_IEEE_FLOAT; + } else { + wfx->Format.wFormatTag = WAVE_FORMAT_PCM; + wfx->SubFormat = _KSDATAFORMAT_SUBTYPE_PCM; + } + + if (format.channelCount() > 2) { + wfx->Format.wFormatTag = WAVE_FORMAT_EXTENSIBLE; + wfx->Format.cbSize = 22; + wfx->dwChannelMask = 0xFFFFFFFF >> (32 - format.channelCount()); + } + + return true; +} + +QT_END_NAMESPACE diff --git a/src/plugins/windowsaudio/qwindowsaudioutils.h b/src/plugins/windowsaudio/qwindowsaudioutils.h new file mode 100644 index 00000000..1f282cea --- /dev/null +++ b/src/plugins/windowsaudio/qwindowsaudioutils.h @@ -0,0 +1,67 @@ +/**************************************************************************** +** +** Copyright (C) 2015 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL21$ +** 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 Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QWINDOWSAUDIOUTILS_H +#define QWINDOWSAUDIOUTILS_H + +#include +#include +#include + +#ifndef _WAVEFORMATEXTENSIBLE_ + + #define _WAVEFORMATEXTENSIBLE_ + typedef struct + { + WAVEFORMATEX Format; // Base WAVEFORMATEX data + union + { + WORD wValidBitsPerSample; // Valid bits in each sample container + WORD wSamplesPerBlock; // Samples per block of audio data; valid + // if wBitsPerSample=0 (but rarely used). + WORD wReserved; // Zero if neither case above applies. + } Samples; + DWORD dwChannelMask; // Positions of the audio channels + GUID SubFormat; // Format identifier GUID + } WAVEFORMATEXTENSIBLE, *PWAVEFORMATEXTENSIBLE, *LPPWAVEFORMATEXTENSIBLE; + typedef const WAVEFORMATEXTENSIBLE* LPCWAVEFORMATEXTENSIBLE; + +#endif + +QT_BEGIN_NAMESPACE + +bool qt_convertFormat(const QAudioFormat &format, WAVEFORMATEXTENSIBLE *wfx); + +QT_END_NAMESPACE + +#endif // QWINDOWSAUDIOUTILS_H diff --git a/src/plugins/windowsaudio/windowsaudio.pro b/src/plugins/windowsaudio/windowsaudio.pro index ead73251..7e8e4320 100644 --- a/src/plugins/windowsaudio/windowsaudio.pro +++ b/src/plugins/windowsaudio/windowsaudio.pro @@ -12,13 +12,15 @@ HEADERS += \ qwindowsaudioplugin.h \ qwindowsaudiodeviceinfo.h \ qwindowsaudioinput.h \ - qwindowsaudiooutput.h + qwindowsaudiooutput.h \ + qwindowsaudioutils.h SOURCES += \ qwindowsaudioplugin.cpp \ qwindowsaudiodeviceinfo.cpp \ qwindowsaudioinput.cpp \ - qwindowsaudiooutput.cpp + qwindowsaudiooutput.cpp \ + qwindowsaudioutils.cpp OTHER_FILES += \ windowsaudio.json From f9145aca166ad2ca1514524ce88ded7834eb207c Mon Sep 17 00:00:00 2001 From: Yoann Lopes Date: Thu, 9 Apr 2015 16:09:39 +0200 Subject: [PATCH 19/19] DirectShow: correctly update camera list. 8923c0ff fixed the list not being updated after plugging/unplugging a camera from the system. However, it was only a partial fix affecting only QCameraInfo::availableCameras(). DSVideoDeviceControl was still internally keeping a list of cameras that was never updated, causing the QCamera constructor to not take into account new or removed cameras. Change-Id: Ie5e79c46002017b1e85bfc53c6391a2a747361a0 Task-number: QTBUG-39708 Reviewed-by: Christian Stromme --- .../camera/dsvideodevicecontrol.cpp | 72 ++++++++++++------- .../directshow/camera/dsvideodevicecontrol.h | 10 +-- src/plugins/directshow/dsserviceplugin.cpp | 52 ++++---------- src/plugins/directshow/dsserviceplugin.h | 9 --- 4 files changed, 66 insertions(+), 77 deletions(-) diff --git a/src/plugins/directshow/camera/dsvideodevicecontrol.cpp b/src/plugins/directshow/camera/dsvideodevicecontrol.cpp index 86929945..c3d23e02 100644 --- a/src/plugins/directshow/camera/dsvideodevicecontrol.cpp +++ b/src/plugins/directshow/camera/dsvideodevicecontrol.cpp @@ -33,6 +33,7 @@ #include #include +#include #include "dsvideodevicecontrol.h" #include "dscamerasession.h" @@ -48,33 +49,37 @@ extern const CLSID CLSID_VideoInputDeviceCategory; QT_BEGIN_NAMESPACE +Q_GLOBAL_STATIC(QList, deviceList) + DSVideoDeviceControl::DSVideoDeviceControl(QObject *parent) : QVideoDeviceSelectorControl(parent) { m_session = qobject_cast(parent); - - enumerateDevices(&m_devices, &m_descriptions); - selected = 0; } int DSVideoDeviceControl::deviceCount() const { - return m_devices.count(); + updateDevices(); + return deviceList->count(); } QString DSVideoDeviceControl::deviceName(int index) const { - if (index >= 0 && index <= m_devices.count()) - return QString::fromUtf8(m_devices.at(index).constData()); + updateDevices(); + + if (index >= 0 && index <= deviceList->count()) + return QString::fromUtf8(deviceList->at(index).first.constData()); return QString(); } QString DSVideoDeviceControl::deviceDescription(int index) const { - if (index >= 0 && index <= m_descriptions.count()) - return m_descriptions.at(index); + updateDevices(); + + if (index >= 0 && index <= deviceList->count()) + return deviceList->at(index).second; return QString(); } @@ -89,10 +94,34 @@ int DSVideoDeviceControl::selectedDevice() const return selected; } -void DSVideoDeviceControl::enumerateDevices(QList *devices, QStringList *descriptions) +void DSVideoDeviceControl::setSelectedDevice(int index) { - devices->clear(); - descriptions->clear(); + updateDevices(); + + if (index >= 0 && index < deviceList->count()) { + if (m_session) { + QString device = deviceList->at(index).first; + if (device.startsWith("ds:")) + device.remove(0,3); + m_session->setDevice(device); + } + selected = index; + } +} + +const QList &DSVideoDeviceControl::availableDevices() +{ + updateDevices(); + return *deviceList; +} + +void DSVideoDeviceControl::updateDevices() +{ + static QElapsedTimer timer; + if (timer.isValid() && timer.elapsed() < 500) // ms + return; + + deviceList->clear(); ICreateDevEnum* pDevEnum = NULL; IEnumMoniker* pEnum = NULL; @@ -116,7 +145,9 @@ void DSVideoDeviceControl::enumerateDevices(QList *devices, QStringL if (SUCCEEDED(hr)) { QString output(QString::fromWCharArray(strName)); mallocInterface->Free(strName); - devices->append(output.toUtf8().constData()); + + DSVideoDeviceInfo devInfo; + devInfo.first = output.toUtf8(); IPropertyBag *pPropBag; hr = pMoniker->BindToStorage(0, 0, IID_IPropertyBag, (void**)(&pPropBag)); @@ -130,7 +161,9 @@ void DSVideoDeviceControl::enumerateDevices(QList *devices, QStringL } pPropBag->Release(); } - descriptions->append(output); + devInfo.second = output; + + deviceList->append(devInfo); } pMoniker->Release(); } @@ -139,19 +172,8 @@ void DSVideoDeviceControl::enumerateDevices(QList *devices, QStringL } pDevEnum->Release(); } -} -void DSVideoDeviceControl::setSelectedDevice(int index) -{ - if (index >= 0 && index < m_devices.count()) { - if (m_session) { - QString device = m_devices.at(index); - if (device.startsWith("ds:")) - device.remove(0,3); - m_session->setDevice(device); - } - selected = index; - } + timer.restart(); } QT_END_NAMESPACE diff --git a/src/plugins/directshow/camera/dsvideodevicecontrol.h b/src/plugins/directshow/camera/dsvideodevicecontrol.h index a6d47108..0ba7ce36 100644 --- a/src/plugins/directshow/camera/dsvideodevicecontrol.h +++ b/src/plugins/directshow/camera/dsvideodevicecontrol.h @@ -42,6 +42,8 @@ class DSCameraSession; //QTM_USE_NAMESPACE +typedef QPair DSVideoDeviceInfo; + class DSVideoDeviceControl : public QVideoDeviceSelectorControl { Q_OBJECT @@ -54,17 +56,15 @@ public: int defaultDevice() const; int selectedDevice() const; - static void enumerateDevices(QList *devices, QStringList *descriptions); + static const QList &availableDevices(); public Q_SLOTS: void setSelectedDevice(int index); private: + static void updateDevices(); + DSCameraSession* m_session; - - QList m_devices; - QStringList m_descriptions; - int selected; }; diff --git a/src/plugins/directshow/dsserviceplugin.cpp b/src/plugins/directshow/dsserviceplugin.cpp index f28f274e..f3713f12 100644 --- a/src/plugins/directshow/dsserviceplugin.cpp +++ b/src/plugins/directshow/dsserviceplugin.cpp @@ -39,7 +39,6 @@ #include "dsvideodevicecontrol.h" #ifdef QMEDIA_DIRECTSHOW_CAMERA -#include #include #include "dscameraservice.h" #endif @@ -122,9 +121,9 @@ QByteArray DSServicePlugin::defaultDevice(const QByteArray &service) const { #ifdef QMEDIA_DIRECTSHOW_CAMERA if (service == Q_MEDIASERVICE_CAMERA) { - updateDevices(); - - return m_defaultCameraDevice; + const QList &devs = DSVideoDeviceControl::availableDevices(); + if (!devs.isEmpty()) + return devs.first().first; } #endif @@ -133,52 +132,29 @@ QByteArray DSServicePlugin::defaultDevice(const QByteArray &service) const QList DSServicePlugin::devices(const QByteArray &service) const { + QList result; + #ifdef QMEDIA_DIRECTSHOW_CAMERA if (service == Q_MEDIASERVICE_CAMERA) { - updateDevices(); - - return m_cameraDevices; + const QList &devs = DSVideoDeviceControl::availableDevices(); + Q_FOREACH (const DSVideoDeviceInfo &info, devs) + result.append(info.first); } #endif - return QList(); + return result; } QString DSServicePlugin::deviceDescription(const QByteArray &service, const QByteArray &device) { #ifdef QMEDIA_DIRECTSHOW_CAMERA if (service == Q_MEDIASERVICE_CAMERA) { - updateDevices(); - - for (int i=0; i &devs = DSVideoDeviceControl::availableDevices(); + Q_FOREACH (const DSVideoDeviceInfo &info, devs) { + if (info.first == device) + return info.second; + } } #endif return QString(); } - -#ifdef QMEDIA_DIRECTSHOW_CAMERA - -void DSServicePlugin::updateDevices() const -{ - static QElapsedTimer timer; - if (timer.isValid() && timer.elapsed() < 500) // ms - return; - - addRefCount(); - - m_defaultCameraDevice.clear(); - DSVideoDeviceControl::enumerateDevices(&m_cameraDevices, &m_cameraDescriptions); - - if (m_cameraDevices.isEmpty()) { - qWarning() << "No camera devices found"; - } else { - m_defaultCameraDevice = m_cameraDevices.first(); - } - - releaseRefCount(); - timer.restart(); -} -#endif - diff --git a/src/plugins/directshow/dsserviceplugin.h b/src/plugins/directshow/dsserviceplugin.h index 56825349..5cc17881 100644 --- a/src/plugins/directshow/dsserviceplugin.h +++ b/src/plugins/directshow/dsserviceplugin.h @@ -65,15 +65,6 @@ public: QByteArray defaultDevice(const QByteArray &service) const; QList devices(const QByteArray &service) const; QString deviceDescription(const QByteArray &service, const QByteArray &device); - -private: -#ifdef QMEDIA_DIRECTSHOW_CAMERA - void updateDevices() const; - - mutable QByteArray m_defaultCameraDevice; - mutable QList m_cameraDevices; - mutable QStringList m_cameraDescriptions; -#endif }; #endif // DSSERVICEPLUGIN_H