From 85891b7a57152973d66ebb8d38c4a543a2dda448 Mon Sep 17 00:00:00 2001 From: Duncaen Date: Wed, 4 May 2022 17:15:40 +0200 Subject: [PATCH 1/2] firefox: update to 100.0. --- srcpkgs/firefox/patches/fix-build-tier3.patch | 366 ------------------ srcpkgs/firefox/patches/sndio.patch | 52 --- srcpkgs/firefox/template | 8 +- 3 files changed, 4 insertions(+), 422 deletions(-) delete mode 100644 srcpkgs/firefox/patches/fix-build-tier3.patch delete mode 100644 srcpkgs/firefox/patches/sndio.patch diff --git a/srcpkgs/firefox/patches/fix-build-tier3.patch b/srcpkgs/firefox/patches/fix-build-tier3.patch deleted file mode 100644 index c7f5b7ea1f7b..000000000000 --- a/srcpkgs/firefox/patches/fix-build-tier3.patch +++ /dev/null @@ -1,366 +0,0 @@ -commit 8a0c895dee94b3c15e56557eb1dd0114477a6056 -Author: q66 -Date: Sun Apr 10 00:38:30 2022 +0200 - - fix build on tier 3 platforms - - https://bugzilla.mozilla.org/show_bug.cgi?id=1758610 - -diff --git a/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.cpp b/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.cpp -index 0fa127b..78c8961 100644 ---- a/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.cpp -+++ b/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.cpp -@@ -814,7 +814,7 @@ MediaResult FFmpegVideoDecoder::DoDecode( - # ifdef MOZ_WAYLAND_USE_VAAPI - // Create VideoFramePool in case we need it. - if (!mVideoFramePool && mEnableHardwareDecoding) { -- mVideoFramePool = MakeUnique(); -+ mVideoFramePool = MakeUnique>(); - } - - // Release unused VA-API surfaces before avcodec_receive_frame() as -diff --git a/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.h b/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.h -index b1a2f73..c77d76f 100644 ---- a/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.h -+++ b/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.h -@@ -16,6 +16,9 @@ - #if LIBAVCODEC_VERSION_MAJOR >= 57 && LIBAVUTIL_VERSION_MAJOR >= 56 - # include "mozilla/layers/TextureClient.h" - #endif -+#ifdef MOZ_WAYLAND_USE_VAAPI -+# include "FFmpegVideoFramePool.h" -+#endif - - struct _VADRMPRIMESurfaceDescriptor; - typedef struct _VADRMPRIMESurfaceDescriptor VADRMPRIMESurfaceDescriptor; -@@ -23,7 +26,6 @@ typedef struct _VADRMPRIMESurfaceDescriptor VADRMPRIMESurfaceDescriptor; - namespace mozilla { - - class ImageBufferWrapper; --class VideoFramePool; - - template - class FFmpegVideoDecoder : public FFmpegDataDecoder {}; -@@ -138,7 +140,7 @@ class FFmpegVideoDecoder - AVBufferRef* mVAAPIDeviceContext; - bool mEnableHardwareDecoding; - VADisplay mDisplay; -- UniquePtr mVideoFramePool; -+ UniquePtr> mVideoFramePool; - static nsTArray mAcceleratedFormats; - #endif - RefPtr mImageAllocator; -diff --git a/dom/media/platforms/ffmpeg/FFmpegVideoFramePool.cpp b/dom/media/platforms/ffmpeg/FFmpegVideoFramePool.cpp -index 7943e09..673b3fc 100644 ---- a/dom/media/platforms/ffmpeg/FFmpegVideoFramePool.cpp -+++ b/dom/media/platforms/ffmpeg/FFmpegVideoFramePool.cpp -@@ -5,6 +5,7 @@ - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - - #include "FFmpegVideoFramePool.h" -+#include "PlatformDecoderModule.h" - #include "FFmpegLog.h" - #include "mozilla/widget/DMABufLibWrapper.h" - #include "libavutil/pixfmt.h" -@@ -15,11 +16,11 @@ - - namespace mozilla { - --RefPtr VideoFrameSurfaceVAAPI::GetAsImage() { -+RefPtr VideoFrameSurface::GetAsImage() { - return new layers::DMABUFSurfaceImage(mSurface); - } - --VideoFrameSurfaceVAAPI::VideoFrameSurfaceVAAPI(DMABufSurface* aSurface) -+VideoFrameSurface::VideoFrameSurface(DMABufSurface* aSurface) - : mSurface(aSurface), - mLib(nullptr), - mAVHWFramesContext(nullptr), -@@ -30,22 +31,22 @@ VideoFrameSurfaceVAAPI::VideoFrameSurfaceVAAPI(DMABufSurface* aSurface) - MOZ_ASSERT(mSurface); - MOZ_RELEASE_ASSERT(mSurface->GetAsDMABufSurfaceYUV()); - mSurface->GlobalRefCountCreate(); -- FFMPEG_LOG("VideoFrameSurfaceVAAPI: creating surface UID = %d", -+ FFMPEG_LOG("VideoFrameSurface: creating surface UID = %d", - mSurface->GetUID()); - } - --void VideoFrameSurfaceVAAPI::LockVAAPIData(AVCodecContext* aAVCodecContext, -- AVFrame* aAVFrame, -- FFmpegLibWrapper* aLib) { -- FFMPEG_LOG("VideoFrameSurfaceVAAPI: VAAPI locking dmabuf surface UID = %d", -+void VideoFrameSurface::LockVAAPIData(AVCodecContext* aAVCodecContext, -+ AVFrame* aAVFrame, -+ FFmpegLibWrapper* aLib) { -+ FFMPEG_LOG("VideoFrameSurface: VAAPI locking dmabuf surface UID = %d", - mSurface->GetUID()); - mLib = aLib; - mAVHWFramesContext = aLib->av_buffer_ref(aAVCodecContext->hw_frames_ctx); - mHWAVBuffer = aLib->av_buffer_ref(aAVFrame->buf[0]); - } - --void VideoFrameSurfaceVAAPI::ReleaseVAAPIData(bool aForFrameRecycle) { -- FFMPEG_LOG("VideoFrameSurfaceVAAPI: VAAPI releasing dmabuf surface UID = %d", -+void VideoFrameSurface::ReleaseVAAPIData(bool aForFrameRecycle) { -+ FFMPEG_LOG("VideoFrameSurface: VAAPI releasing dmabuf surface UID = %d", - mSurface->GetUID()); - - // It's possible to unref GPU data while IsUsed() is still set. -@@ -67,43 +68,43 @@ void VideoFrameSurfaceVAAPI::ReleaseVAAPIData(bool aForFrameRecycle) { - } - } - --VideoFrameSurfaceVAAPI::~VideoFrameSurfaceVAAPI() { -- FFMPEG_LOG("VideoFrameSurfaceVAAPI: deleting dmabuf surface UID = %d", -+VideoFrameSurface::~VideoFrameSurface() { -+ FFMPEG_LOG("VideoFrameSurface: deleting dmabuf surface UID = %d", - mSurface->GetUID()); - // We're about to quit, no need to recycle the frames. - ReleaseVAAPIData(/* aForFrameRecycle */ false); - } - --VideoFramePool::VideoFramePool() : mSurfaceLock("VideoFramePoolSurfaceLock") {} -+VideoFramePool::VideoFramePool() : mSurfaceLock("VideoFramePoolSurfaceLock") {} - --VideoFramePool::~VideoFramePool() { -+VideoFramePool::~VideoFramePool() { - MutexAutoLock lock(mSurfaceLock); - mDMABufSurfaces.Clear(); - } - --void VideoFramePool::ReleaseUnusedVAAPIFrames() { -+void VideoFramePool::ReleaseUnusedVAAPIFrames() { - MutexAutoLock lock(mSurfaceLock); - for (const auto& surface : mDMABufSurfaces) { -- auto* vaapiSurface = surface->AsVideoFrameSurfaceVAAPI(); -- if (!vaapiSurface->IsUsed()) { -- vaapiSurface->ReleaseVAAPIData(); -+ if (!surface->IsUsed()) { -+ surface->ReleaseVAAPIData(); - } - } - } - --RefPtr VideoFramePool::GetFreeVideoFrameSurface() { -+RefPtr> -+VideoFramePool::GetFreeVideoFrameSurface() { - for (auto& surface : mDMABufSurfaces) { - if (surface->IsUsed()) { - continue; - } -- auto* vaapiSurface = surface->AsVideoFrameSurfaceVAAPI(); -- vaapiSurface->ReleaseVAAPIData(); -+ surface->ReleaseVAAPIData(); - return surface; - } - return nullptr; - } - --RefPtr VideoFramePool::GetVideoFrameSurface( -+RefPtr> -+VideoFramePool::GetVideoFrameSurface( - VADRMPRIMESurfaceDescriptor& aVaDesc, AVCodecContext* aAVCodecContext, - AVFrame* aAVFrame, FFmpegLibWrapper* aLib) { - if (aVaDesc.fourcc != VA_FOURCC_NV12 && aVaDesc.fourcc != VA_FOURCC_YV12 && -@@ -113,7 +114,7 @@ RefPtr VideoFramePool::GetVideoFrameSurface( - } - - MutexAutoLock lock(mSurfaceLock); -- RefPtr videoSurface = GetFreeVideoFrameSurface(); -+ RefPtr> videoSurface = GetFreeVideoFrameSurface(); - if (!videoSurface) { - RefPtr surface = - DMABufSurfaceYUV::CreateYUVSurface(aVaDesc); -@@ -121,7 +122,7 @@ RefPtr VideoFramePool::GetVideoFrameSurface( - return nullptr; - } - FFMPEG_LOG("Created new VA-API DMABufSurface UID = %d", surface->GetUID()); -- RefPtr surf = new VideoFrameSurfaceVAAPI(surface); -+ RefPtr> surf = new VideoFrameSurface(surface); - if (!mTextureCreationWorks) { - mTextureCreationWorks = Some(surface->VerifyTextureCreation()); - } -@@ -138,11 +139,8 @@ RefPtr VideoFramePool::GetVideoFrameSurface( - } - FFMPEG_LOG("Reusing VA-API DMABufSurface UID = %d", surface->GetUID()); - } -- -- auto* vaapiSurface = videoSurface->AsVideoFrameSurfaceVAAPI(); -- vaapiSurface->LockVAAPIData(aAVCodecContext, aAVFrame, aLib); -- vaapiSurface->MarkAsUsed(); -- -+ videoSurface->LockVAAPIData(aAVCodecContext, aAVFrame, aLib); -+ videoSurface->MarkAsUsed(); - return videoSurface; - } - -diff --git a/dom/media/platforms/ffmpeg/FFmpegVideoFramePool.h b/dom/media/platforms/ffmpeg/FFmpegVideoFramePool.h -index c506d22..c89b418 100644 ---- a/dom/media/platforms/ffmpeg/FFmpegVideoFramePool.h -+++ b/dom/media/platforms/ffmpeg/FFmpegVideoFramePool.h -@@ -7,8 +7,9 @@ - #ifndef __FFmpegVideoFramePool_h__ - #define __FFmpegVideoFramePool_h__ - --#include "FFmpegVideoDecoder.h" - #include "FFmpegLibWrapper.h" -+#include "FFmpegLibs.h" -+#include "FFmpegLog.h" - - #include "mozilla/layers/DMABUFSurfaceImage.h" - #include "mozilla/widget/DMABufLibWrapper.h" -@@ -16,43 +17,16 @@ - - namespace mozilla { - --class VideoFramePool; --class VideoFrameSurfaceVAAPI; -- --class VideoFrameSurface { -- public: -- NS_INLINE_DECL_THREADSAFE_REFCOUNTING(VideoFrameSurface) -- -- VideoFrameSurface() = default; -- -- virtual VideoFrameSurfaceVAAPI* AsVideoFrameSurfaceVAAPI() { return nullptr; } -- -- virtual void SetYUVColorSpace(gfx::YUVColorSpace aColorSpace) = 0; -- virtual void SetColorRange(gfx::ColorRange aColorRange) = 0; -- -- virtual RefPtr GetDMABufSurface() { return nullptr; }; -- virtual RefPtr GetAsImage() = 0; -- -- // Don't allow VideoFrameSurface plain copy as it leads to -- // unexpected DMABufSurface/HW buffer releases and we don't want to -- // deep copy them. -- VideoFrameSurface(const VideoFrameSurface&) = delete; -- const VideoFrameSurface& operator=(VideoFrameSurface const&) = delete; -- -- protected: -- virtual ~VideoFrameSurface(){}; --}; -- --// VideoFrameSurfaceVAAPI holds a reference to GPU data with a video frame. -+// VideoFrameSurface holds a reference to GPU data with a video frame. - // - // Actual GPU pixel data are stored at DMABufSurface and - // DMABufSurface is passed to gecko GL rendering pipeline via. - // DMABUFSurfaceImage. - // --// VideoFrameSurfaceVAAPI can optionally hold VA-API ffmpeg related data to keep -+// VideoFrameSurface can optionally hold VA-API ffmpeg related data to keep - // GPU data locked untill we need them. - // --// VideoFrameSurfaceVAAPI is used for both HW accelerated video decoding -+// VideoFrameSurface is used for both HW accelerated video decoding - // (VA-API) and ffmpeg SW decoding. - // - // VA-API scenario -@@ -72,13 +46,24 @@ class VideoFrameSurface { - // Unfortunately there isn't any obvious way how to mark particular VASurface - // as used. The best we can do is to hold a reference to particular AVBuffer - // from decoded AVFrame and AVHWFramesContext which owns the AVBuffer. --class VideoFrameSurfaceVAAPI final : public VideoFrameSurface { -- friend class VideoFramePool; -+template -+class VideoFrameSurface {}; -+template <> -+class VideoFrameSurface; -+ -+template -+class VideoFramePool {}; -+template <> -+class VideoFramePool; -+ -+template <> -+class VideoFrameSurface { -+ friend class VideoFramePool; - - public: -- explicit VideoFrameSurfaceVAAPI(DMABufSurface* aSurface); -+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(VideoFrameSurface) - -- VideoFrameSurfaceVAAPI* AsVideoFrameSurfaceVAAPI() final { return this; } -+ explicit VideoFrameSurface(DMABufSurface* aSurface); - - void SetYUVColorSpace(mozilla::gfx::YUVColorSpace aColorSpace) { - mSurface->GetAsDMABufSurfaceYUV()->SetYUVColorSpace(aColorSpace); -@@ -93,6 +78,12 @@ class VideoFrameSurfaceVAAPI final : public VideoFrameSurface { - - RefPtr GetAsImage(); - -+ // Don't allow VideoFrameSurface plain copy as it leads to -+ // unexpected DMABufSurface/HW buffer releases and we don't want to -+ // deep copy them. -+ VideoFrameSurface(const VideoFrameSurface&) = delete; -+ const VideoFrameSurface& operator=(VideoFrameSurface const&) = delete; -+ - protected: - // Lock VAAPI related data - void LockVAAPIData(AVCodecContext* aAVCodecContext, AVFrame* aAVFrame, -@@ -107,7 +98,7 @@ class VideoFrameSurfaceVAAPI final : public VideoFrameSurface { - void MarkAsUsed() { mSurface->GlobalRefAdd(); } - - private: -- virtual ~VideoFrameSurfaceVAAPI(); -+ virtual ~VideoFrameSurface(); - - const RefPtr mSurface; - const FFmpegLibWrapper* mLib; -@@ -116,23 +107,24 @@ class VideoFrameSurfaceVAAPI final : public VideoFrameSurface { - }; - - // VideoFramePool class is thread-safe. --class VideoFramePool final { -+template <> -+class VideoFramePool { - public: - VideoFramePool(); - ~VideoFramePool(); - -- RefPtr GetVideoFrameSurface( -+ RefPtr> GetVideoFrameSurface( - VADRMPRIMESurfaceDescriptor& aVaDesc, AVCodecContext* aAVCodecContext, - AVFrame* aAVFrame, FFmpegLibWrapper* aLib); - void ReleaseUnusedVAAPIFrames(); - - private: -- RefPtr GetFreeVideoFrameSurface(); -+ RefPtr> GetFreeVideoFrameSurface(); - - private: - // Protect mDMABufSurfaces pool access - Mutex mSurfaceLock; -- nsTArray> mDMABufSurfaces; -+ nsTArray>> mDMABufSurfaces; - // We may fail to create texture over DMABuf memory due to driver bugs so - // check that before we export first DMABuf video frame. - Maybe mTextureCreationWorks; -diff --git a/dom/media/platforms/ffmpeg/ffmpeg58/moz.build b/dom/media/platforms/ffmpeg/ffmpeg58/moz.build -index de2611e..8ffdaae 100644 ---- a/dom/media/platforms/ffmpeg/ffmpeg58/moz.build -+++ b/dom/media/platforms/ffmpeg/ffmpeg58/moz.build -@@ -30,6 +30,9 @@ if CONFIG['MOZ_WAYLAND']: - CXXFLAGS += CONFIG['MOZ_GTK3_CFLAGS'] - DEFINES['MOZ_WAYLAND_USE_VAAPI'] = 1 - USE_LIBS += ['mozva'] -+ UNIFIED_SOURCES += [ -+ '../FFmpegVideoFramePool.cpp', -+ ] - - include("/ipc/chromium/chromium-config.mozbuild") - -diff --git a/dom/media/platforms/ffmpeg/ffmpeg59/moz.build b/dom/media/platforms/ffmpeg/ffmpeg59/moz.build -index 7d28420..1da28a1 100644 ---- a/dom/media/platforms/ffmpeg/ffmpeg59/moz.build -+++ b/dom/media/platforms/ffmpeg/ffmpeg59/moz.build -@@ -30,6 +30,9 @@ if CONFIG["MOZ_WAYLAND"]: - CXXFLAGS += CONFIG["MOZ_GTK3_CFLAGS"] - DEFINES["MOZ_WAYLAND_USE_VAAPI"] = 1 - USE_LIBS += ["mozva"] -+ UNIFIED_SOURCES += [ -+ "../FFmpegVideoFramePool.cpp", -+ ] - - include("/ipc/chromium/chromium-config.mozbuild") - diff --git a/srcpkgs/firefox/patches/sndio.patch b/srcpkgs/firefox/patches/sndio.patch deleted file mode 100644 index fa3b6fa8ab6b..000000000000 --- a/srcpkgs/firefox/patches/sndio.patch +++ /dev/null @@ -1,52 +0,0 @@ ---- a/old-configure.in -+++ b/old-configure.in -@@ -2818,6 +2818,22 @@ - _NON_GLOBAL_ACDEFINES="$_NON_GLOBAL_ACDEFINES NECKO_COOKIES" - fi - -+dnl ================================== -+dnl = Check sndio availability -+dnl ================================== -+ -+MOZ_ARG_ENABLE_BOOL(sndio, -+[ --enable-sndio Enable sndio support], -+ MOZ_SNDIO=1, -+ MOZ_SNDIO=) -+ -+if test -n "$MOZ_SNDIO"; then -+ MOZ_SNDIO_LIBS="-lsndio" -+ AC_SUBST_LIST(MOZ_SNDIO_LIBS) -+fi -+ -+AC_SUBST(MOZ_SNDIO) -+ - dnl ======================================================== - dnl = - dnl = Maintainer debug option (no --enable equivalent) ---- a/media/libcubeb/src/moz.build -+++ b/media/libcubeb/src/moz.build -@@ -44,11 +44,13 @@ - ] - DEFINES['USE_JACK'] = True - --if CONFIG['OS_ARCH'] == 'OpenBSD': -+if CONFIG['MOZ_SNDIO']: - SOURCES += [ - 'cubeb_sndio.c', - ] - DEFINES['USE_SNDIO'] = True -+ -+if CONFIG['OS_ARCH'] == 'OpenBSD': - DEFINES['DISABLE_LIBSNDIO_DLOPEN'] = True - - if CONFIG['OS_TARGET'] == 'Darwin': ---- a/build/moz.configure/old.configure 2020-06-30 12:17:04.087609070 +0200 -+++ b/build/moz.configure/old.configure 2020-06-30 12:17:04.087609070 +0200 -@@ -88,6 +88,7 @@ - @old_configure_options( - "--cache-file", - "--datadir", -+ "--enable-sndio", - "--enable-official-branding", - "--includedir", - "--libdir", diff --git a/srcpkgs/firefox/template b/srcpkgs/firefox/template index 8ee3b78f809b..021bb6aee82b 100644 --- a/srcpkgs/firefox/template +++ b/srcpkgs/firefox/template @@ -3,7 +3,7 @@ # THIS PKG MUST BE SYNCHRONIZED WITH "srcpkgs/firefox-i18n". # pkgname=firefox -version=99.0 +version=100.0 revision=1 build_helper="rust" short_desc="Mozilla Firefox web browser" @@ -11,7 +11,7 @@ maintainer="Duncaen " license="MPL-2.0, GPL-2.0-or-later, LGPL-2.1-or-later" homepage="https://www.mozilla.org/firefox/" distfiles="${MOZILLA_SITE}/${pkgname}/releases/${version}/source/${pkgname}-${version}.source.tar.xz" -checksum=513f8d2cafa39a2d50f2c4a25cc48093e89f715a706b941170fa48e397976327 +checksum=664c0cc4e0fb70886aa4e652d144996045d533a18eebc7d61093103cbb2d5e7f lib32disabled=yes @@ -172,7 +172,7 @@ do_build() { export MOZ_MAKE_FLAGS="${makejobs}" export MOZ_NOSPAM=1 export MOZBUILD_STATE_PATH="${wrksrc}/mozbuild" - export MACH_USE_SYSTEM_PYTHON=1 + export MACH_BUILD_PYTHON_NATIVE_PACKAGE_SOURCE=system export AS=$CC @@ -191,7 +191,7 @@ ac_add_options --enable-default-toolkit=$(vopt_if wayland 'cairo-gtk3-wayland' ' ./mach build } do_install() { - export MACH_USE_SYSTEM_PYTHON=1 + export MACH_BUILD_PYTHON_NATIVE_PACKAGE_SOURCE=system export MOZBUILD_STATE_PATH="${wrksrc}/mozbuild" DESTDIR="$DESTDIR" ./mach install From 04de1d622ff29edcf92284876eeccc1e6d4e65db Mon Sep 17 00:00:00 2001 From: Duncaen Date: Wed, 4 May 2022 17:18:04 +0200 Subject: [PATCH 2/2] firefox-i18n: update to 100.0. --- srcpkgs/firefox-i18n/template | 194 +++++++++++++++++----------------- 1 file changed, 97 insertions(+), 97 deletions(-) diff --git a/srcpkgs/firefox-i18n/template b/srcpkgs/firefox-i18n/template index 0e98d438bd21..f13acdfd6d5d 100644 --- a/srcpkgs/firefox-i18n/template +++ b/srcpkgs/firefox-i18n/template @@ -1,6 +1,6 @@ # Template file for 'firefox-i18n' pkgname=firefox-i18n -version=99.0 +version=100.0 revision=1 build_style=meta short_desc="Firefox language packs" @@ -140,99 +140,99 @@ _pkgtmpl() { } } -checksum="e398f1b14ae79fcd74639a81b27c4cd38b09282ca625d1b72c69df09fc4ec1fc - a8cbef3ba5c35e33c0f1e02dcd2781cc362315d5b63e9e6065a22afbe460581f - 35b4f32eabd40875d518cb174858bb6d8ecff272f4ee677e0c108d8395707960 - 4f1a97c404347121c53799efd2a986860e030b7789e66e252d92b6a78012b681 - 580e9e9fde913ce410774d366bad95af3a67df52c688a6ad64ad59e8d33eab47 - 91236c6ecd7ee99927d5b69566cc30f4b1de6e7caca3336386f3e7bb995c96e2 - fa36e967b14e530993e3a50fcdc5f32e686f5b110f6cdee59b8c555c82294517 - c88a65b1f3c10085b0d5236a3e687b70cd9a620803393caf81b4ee0677330ef0 - c12d138948d4e5cebce1051f0cc750f8f9bfb23f733417e7e7b9596ee74a6980 - e4b9cdcb7c08beceecfef7d8b94d70a24e3f24404c73cd7cf5aed6572e293bf6 - 75d09dfb5c0b55b670c912feecd48bfdc7f936f31c41d8e4b2ede0e46d16f749 - 8780f97e115fbe8f156412757d1980517b85dc409fbbc8e0266bdcc7d0568c83 - 815c9a81efce33b19b9bcabd46093ea92bd062698575c83ea127f20a3495c984 - 76e9a327a69960f4ebd857b5b204d435d60461b7129aa70db90ebb28411ffaee - 8fdd5adfec75310172819a959a2b68ad3ecb614c94298be315804e730b43a160 - 8947c35c94f08bbb61a3beb8b106a776d0f0a3b2f247b9e49619ab9b9416bb19 - 7851a711a8de28c6e6c3c07814ef995263f4c3a48981742f1aa481389dab3897 - 8bb525f9045c91b3f539103eb398da1d1f71a580971a1adcc780198da36a2623 - 04cfc4a69fba8f3838d385179511954277cf1f6d8243663f338941c1e86a49ca - cd9f142ac06d16919b5f1102ae53f1241574057c75012198fe1dbdb7a8d63a8c - 8ff53385252becfbc2f15354ea57b873251584444129c137350e974dc488318c - 9a58559be92950e33051625e49dd3f5bae36c225b9a7030bec9a6aa78d45ba93 - 6e0f538d93f8b2d189c667c2aac37c6d1eb50fb802c4ee2ff310db15da57de56 - 2c051ea90460cda20296b1a69037e037b82258fe382c9031594974e75cbc10eb - 053dfbb9ad0feb3b54cab94bd8f5ac544ec598f9b819a7d163496f838104b8a5 - faa25b7302f249b9aaea768a7cf61f78f67e3637e9a62906361a1fae257d0161 - 54f02a1e948d2944b3889152b093200a0d31358df28f7309e5fb5d490616d317 - 7c104e3c70024163fc0fe7597df0a995b2e813319dc23268fe36e04f09f2ced7 - 2cf6b8e82042208407bfdbad01a3d5113c87f0bd37acb082452f1f6c22bf1485 - da05a0fe7a65ce243f0ec69ad60d93a3bc988383f983343a66b399a2de1a10a0 - 13da03264b7d522bcbb77cfb1fece6606f9efe742822325ced7627fe28add070 - 0d835b249070428d8d5e1c251ab46b19df71cc2858b69843a41eee897c27b396 - 5dbbe35e45b15dca15ba5de15aa55b4fce44d33fb456ca8184270c0f162567d7 - 9e6b2c13f0c2347fe27e189dea6dd8a3c5b23aaac668010213258bd26e0d3da7 - 1aa07979f8bb7d6039a11f64b3c93b3c70332def967af6fb426897b7c65fdba2 - c21b99ea6049d498bb446770801e3c9f8041bd11e0ae8164bd16a016f14f5578 - ed537abf79efa484fc920902d59ea1b840c6acf6fa540f435722f5c75a1bca90 - e9517bb3330ec5cb2a743dd56a69c912a35b6dafe6a7abeadfe1532a17963549 - cf97f81502f30c807fde8127c6f8ac1a9ea58508ba8d243ea0d6fbabe2ddc8b1 - 85b90f53e79bc2961b3f0c702ba5762ba7559c366d7682bc66b20514769c2a92 - bd31d635b44f039ad2f89e4ad1cd0f7fcbcec7e0d6d381f8bf89e17bb74aa952 - 10d597d44d8261cd0eebe024de51ba803c94792d13c5732d43ed9bec4db72783 - 33da29355095f9ae0383e21ae0c6d300d6a7f298c7e126e8747c71277b1175be - 84ff5d1b88c4205eba0f04e89daf4d91e9f25da4590367050917a6d34c629147 - 4de39e8b907391f197fe5d138f87985d74d3a34796c3963f2e33142164696f84 - 47e8c5ece6643d5c6cac713799c841e73c0bda691243ccd346b5e85b0a4810d1 - c196be8854dded19c2a85c5bb7f3ff3123da0d91852da7b16f844cb44e9d11fa - 7f97921badcf0c7ffeb92c6f1d1d2ada3afd0069e8e80a524ad3b7c0c1220f0a - 79d845fccaa1916f07dfd821c3ed95dd5647b70bd9a39e485caa66cc65a077f7 - 40ce23e0cc6e4fa5192e987bc835c1408d958a2fcfb8875370db517ff64c92a4 - 8f6f739077a383884d400c3062925e0e848be4942e3be0e378e589bfa3941c9c - 9f014d8807130a01ae008997393deb4c865c70482a4fe75f3cee0e9f8071246a - 240aa4b7091065ef0495c8f52eeb91b5a0cae03676c6ea4cedee9260e204dd6f - 788f7ab9bfbb7b692d4d28efad9ae3de964ef7bfa4e30f6f50a3bd178ac004ee - 04a7fbbc1b0769a5b66bb068385482e50c5f70298eba250235d259bc4aa3ea99 - 30a1707f4a57a2ba738eb27f5525daa12f0713e3bb7b1a3ebe2c710ac6e37a27 - bdc752daf3b4e8f8ea3980d98a01d7249f38dddf183909eb55a8c50ad30368e1 - 48332123774a79eed86d1e826021a05a3921ac5f95ca54e086f173c8e1e72fd1 - 31f2f1c2adabe35fd353d3720eb8458716f926e57c9d782518f943533cd1a72d - 4756150d141a8ce3e2bdca7fdb1b343466b19cb9a19adbfa25d86c39d0f7c933 - 024f3b186772c5381a458dda4a6b914fb2695f8c16e648c58d463072f10f5b57 - 8160d89f88b3c7d9e967377e513b8fc18e4a19faa55f95371db3553564db65bf - 6d2816247894f2e73ecb0258ee5a9b85b650542bac46a8587d547c8824e2d280 - d3e017f003c34a6768670ae2c8bbd5e3500f452647e36193614810ced595b2b3 - 7ceafc2a330620665c51e8b394d296ddb190d97f4cebcd0a247d0278d3a54274 - 6b6992a92df788fbd119446aabd9329b7edd1643a8dd1e3ca7b60dc7976b3b60 - 8dee92aa771ca1b0deb233b974f844b8025d4b25f2ff8be41d91c636565eb7f0 - b4fc00a30204c8c5b19c92bd3164b98955d9591366f89c194fe248bdbc0ce580 - 406335d53b11c42f34446adc68d6836a6841fc34af3c2f1fa621ddc2026017b4 - 7ac66cef872878f6e5568266d9c807da1cc4041ae51723cf387590954f73cf7d - 74c5306c711a4150cb6f89289067533a5438495a251d63cb06f586d27eafbeb4 - f3e67b76944280de1eb8df059bec0f0eafd06a4bc4e7c93e98c434a17192c084 - e13b87e04ee3fbf7ea0c02e4b176d6dc66dbd234b59cb245dfd225e65c5cdcd3 - bfab113c2dde187aaabfd89957c7dc840bbbb25c4f27b31fb422c9817035eaa8 - 7bde7feb01a40d3b89b78928154fcfc0eff8c77b086e360b940f61d45d7eadb0 - 18f2267d16b30aecfd2b6f9437cc79bca68084680b2770820323a968fd20c93e - 5bd5138456fae929520bbd821beddd1f934d156e3c99916e47df31b7bedaa32a - eb4db96ab4b78dede2d92db7c0c3dd4084971178f101a342655348a4b90a6487 - 07a06be606d6adacf1cb57cbf448ff18a7c13c90df9e11768ac3fe3e200569a2 - 090e6759314eb16b2169bd1f89387963ba81a0e565f1d77143f2da0e6d267e28 - 38cf5fa44116bc15f12db4506db386b147762838f25d991a0c39cdcd236533f6 - 448a4ab5be3d9f246f961705a02f31abcaa8c616351c4d05857c3db41ba83154 - 3fcfcc54f9ec4762b4b78ce0db9351ac59a717e4931d6267cacafa16d3d41057 - 7349863f4edfd79321be9b214384138596cbe16ecd2107cee58501e2511c438a - 4a50c82c68898c25dfdfcb95079750a455ba2e4d1397d5e51cc2991dce1be60b - 275ab1a945003153a10fd5bbebf8ce9af346e5ad2068c83eebdcd60ecf0ce99e - cce68831a20669468b108e3dd58dbc34cd981c874bdd299b715df838ba5ca0f9 - d6cdb55b0f8d7f3c9c4f3bc7906feb123f84243bfbd719eab75a6894cf455582 - 74012d5c8c22cc2f5780ae55020cdbe3c74f21671a2769fde907dbd63e0281bb - 14a02938f76ce51767746ecc104ff571f2da0429144ee981cd28af8b4eda3518 - dc05af8f59bdbf1c77d6d45dc1bf6bba634b782533e245993d852e39f145cfc9 - 557444ed827906476ec3385ffae1e1952acc5b3234840fc645ff892c9753b2f3 - 9925d116300b43f82061e1c04deae6c241cfb121d46364aa1f206e0d8bd9732a - aaf3249f295362530f04f23c00e309baa5a7a89c70bbf1a3a763b8ef66631ac8 - d289624c73955ff377057be150ff8d52118810a4adaf861fe51b7f0a0b80dbbf - 2f07d98e74625892478c321161f62db8c790d978dd4e5c3633c5cf5ef5d8d6b4" +checksum="05fc947ff479288182364d39a343fb33276f37266be02c17c6c2adb15c9209c4 + 8ffad9c79427474069ab2b5dc4cf772947a34b7988d68adb576e79b8a23ab67a + 523277c631901519063d41b63333aac3ac874b3e6a453566c0c1ea3fbb7a90aa + deb96111e07746d8ddc99e961dfc1e545cc9fd50e4eaade71fa40f5f575f9ac4 + dd1672b8e38ac2a29fe3be20b11a73c7935dae71ef2624fe92e755763a639d7c + 5e10c7080c772a441d3e3116cc964e162d6a5a2ced953bf5a6c59c303fdbcdf0 + edcb679e72e4ffd3b8fddcf231bcb07a5c0d44b2e1c32982b752f40cafaa625f + c4670cc9456a9c170b71b85a1a2486c10d9046f3fec7fd807555a32335d2fa9e + 57dcb0e6af8b0573a1188cbc4509e4a30fd1d027b686d73a6b793f6b21e86df2 + 5c385dede7eaa4e248a15f918c7f64e9125899ef742817bb39571ae0b37b34c4 + ff15f4844392d0cb50527bdf48d4873f55ba08d8500306ec9ca83405a704fbdc + eeefc55c1f80988ebf4c759e4f19092fae79b6335f450d24616c3b3db4985170 + ccb517a28a85c6aca804ae46bfeba7a0a3fa577111328ccb7bbfda2cb67cb055 + bb657cc31e3a2eaca1aa19df8532baa4c05d86c4eedb2dad41e1c85a977193fe + caea7efda0efd010947fef5260726cd1412d222faccab12a7017c6053e355fff + 1b2667186c51e750fdaf05efcf724a932d4b3e10f839396b36bf35c7b8fb58c9 + e079ce25240d5d286af227c19175446328174082e7f24db3da3366933b213327 + b534df3b5798fc73ec0989c7e2acadec5d96dc5c29f599ca34b6e3fc2d063ebe + 3b232b2de0b99a6d1cb4f0afa203edfb62896065de9aaf351860cca222f22327 + 520b578228ab2efb7880477276c2b9db430a77efacf590c75bd16cefb5a96d67 + 10ef072059fb1ed982d7e5a4e90f741f99213d15b94eeeb398d09d7f651aff3d + 9b882019ca6e4de58c8f229b344888814424b079e939dd362ea77cf50c9ed059 + f389a84de1dd7ff8375c66694168a1479697f9ce64e6d4c2824a585076b5aee0 + f4f3eedcbe27ee556a8e58cd0d07c9c530b0a83b68ada75e74a1d91977333b89 + 4d67fca1b1f12f4e5c8ac9e5f70140bda20e8c608ee77df4eb4dc97f9f984eaa + b73da525fa7ed072e2f2ef2d68eeba037de126942d1190d875d359de77f7006c + 4d2253d1d31a6740b24046c066a8342d240599a096585e848e7c065d0912d80e + 309eed3a6b60de8b338ae464d29db444320f55d31adf0a8b00885d0cca43ad93 + c92d925cd81c692f7180cc71fae28d77b3ff7466e365169d92e4288d40249a08 + 50b1fbc60bea33b12fc5d3fa676503c8417708db0451b9afaff604892612a23b + a42141c5c6c00be51e947f9a49ede93e2283050487200e28e71901480b845ff7 + fa552045ce9cd1b1ca47ef0a0aab50d1095ec9b2f46d3103efd957cdeeccb751 + 3974ecc24feab6d577d23bd27427136cb0389104011ff796d68d02a69d71789f + ca5eb3b04b1c4b32aeefbda17949a358257fe389d48dab1c886b9cec884fe0f9 + 846ad932823fd5764540e72d2e8854f87963f8caf4685eb60012bfb5923a75fd + f5a05fb9a4607f1589096e13b47f985d26253cb5bb5da1cb918865e9654e550e + 6717b235fa616b1b9d6684ef50863926d7ee3571811c215d226518916ad3e95f + a767439949302a6eb682c58c72c35920fb143deaac708ae72bad47bb42430945 + 985cd6fb46031859fb238c8b8ca3ae64f8583bab09e6719704c427d2589525c1 + 7c6b502db9cfa306bc214a3d17c5931b071072ab4326c6ce8bd7498ae126282a + e4d00cf895acdac207b1ed4f62280927850d3621ae6ed959bc0dd4adf377bfd7 + cc11c9b95bfb4e3ce0782c9f2c7e4c7fd92a3b0cc3f6f7bd1390921df1b59ac0 + 2951c4030c25c59407be23d4c8b203f68c302dee756b895a3ef1c21df1830146 + e659f2a38763062004fe34968fcdb805b00bf440e4b576ee7028c12a7d8493a4 + ed29465a92aeb657fa04c226fe3fac1edbe73f69f5001d18b379b21ceaf7f98f + b3c38d2d016017b6449bf73f55f63d67e0a9ebf8ba6df059e7d378f953b2a9f2 + 516d885123c351b24ed093ee1ac194d7297530852ef2bdc23b20903790d060a5 + 2744519881bda9cd1fc210629a4366886b55e840877e7fbcc11211c281d4668d + dff4045c796f34b4d31a55fb59aecae4b8dce24a12ed552d146707e9cc51187c + 3862311cc49c8e6d8e8f0f2f03303a0a137654f5cc6511f7f8931a50215f838c + d0cb5d6b31eaa479a903fcef3a9f014ba8939c446ef7a44e8d40b0a6760a17b6 + 7701f6381976c0f1c15c80f3661c6ef20a9953d5cefd64710da7814e875deccd + 9757690f40ea70ec1ed6ca4791cf7fafa4d7f9f58a4b1683cfe0be229c3c656a + 2d076430aea914ed0fe8c6cf3c9f61a2f7b5b6fefb87fa0631f3b1fca2274eec + a32477149c8bdf30590b7dfe931dba18bf9589271d01ffa58d47389dd6ecfe3d + 9da35b91db26edb8b8c48cbbd8b953fd7b7fbd74c2233a004c8a35de4fe473f3 + 5bee5ac2905748ba2ba0f0488f2ecfc409112e626b2e1580f21f1a6dfc685d6a + b362ca18cb856bec6aedd2a05b3dfcdfdc78ecdee19866f8aab6047c1603ae88 + 7a044e5236ba024e80065a8a159dc18c61fd938d39902e4f626615f927038783 + 26e198549ddf1df25f22801c74cba3c18440d17f1e9b90d96a83c38498213aba + 2ca078ccb32f81356f58db590a95ba27fda61dc2ce88d939bbb68d5392b4677b + 1b183032cf35b4c3ccc088ba63d83bbde55e1d1a14a0da756957345875a3a695 + 1dba115cf55edd6082e3e68366fa5aa679deae0262621f8ef574f6f6f7f3f5f0 + 915c75c205383edf6e31325b9717769dad24f6f457a390a80cf9063bd38fb29c + 055866db316ecf278f682a6389f9a42c422c3eda5fa3c5f4223adb18511c5c61 + f7ffd0af9d3f401e6fdb1425c19de890cfcf2077fadefb77aa9514d83701aefc + 9a518360c83589f326252c0096d0a7b766f271f40cf8ae99394cef5a46120306 + 2ed7c8a352d064d5813121238e385de73d02c70260a3622b774892c003d4fdcc + 4bce9dd4f8eac65f13f447976c61142aa9e227ebd79ef84e2205abbf383dc096 + 1f51826364ba69823a7c56c87523f5aadbf4e577c6d4934bc96021083efe2083 + d5b38929489bb0da1688c9f31d35051f5801a4111d60b49521bd736512a5812b + 31494871d4ee110921cca19eafd2ddc089ab51edb96e67de6d5e75b2293262b0 + 11166cc8dcbae00aaf39c58f23f1e357a942cf9fae1873e486aadefdd33bf933 + 9ff85ed3a21d63785e7c2475577097bd8a53cf4eaa7122bbf78225078abb7c96 + 82102671cd03006743333b73dae07f4cf0702ac96ecccdb86fa7b40e9ea85c74 + 8c9096f28cbce9b40d534cddab6ce9c3dd1003120b7201490d936743763af12d + c11653e2d1f845360c176a698f77b196230b7ad108f6e86033ba24b8fe7f8e1f + f728c9850b153bcd15d3fde9f134177d58db1cacd4ef42a9e9baccf5981c5195 + 2683e367a49ca9e3c9c278970a5b8a56f5718d948dc73c1fc26c5340cac4d005 + 96b0327b8766a6e3e40097cdcef6cdbb4498df256c9a0a43cb20bc7543fdf9fa + 9936f3f4a9a1c86ae0123c714f71b8652e7217f58c3e529d6f3e4737a930c044 + 5e6d54c42b0fc394142449727aea373cef5dec109c857d3f7de2576abc55394d + 7092c55e961b30bc42941730ed4ee831445c5d8682e51af8af1a134aa0a6be1b + 670723fe5f0d50cc59e1d4af1c8d3176ef6d2a4b61c56274a9a805c084bba72c + a04627bfb97a249b166c625630e4ba5875400e9fd6cd9f54e8d9c94dc43ec7e0 + c7c7bf41ad8a745da097fde5c9e06885f520cd8f2cb4bde06fee8b029ee85888 + 485d48e4c86c82c1812f603a7a02ac390134adccdfa25e86a6d0f75643bc5f2a + 55598530db9d7640fc73ee9881fb5c43b2a50b3b075454dc4e59baef93b4f70f + d4afee4357c8e49ac06d66b24606ed1265b8cb14979125e0e0d326335238779d + 28d511b6de7c0c92730c79523710624427e6cd320225827a49cc217c06e1d612 + 5c587ab32b4f5a835992f03ed47f875f962da36ecc48a6b4cd999de6f944e7e1 + 949ab674459d323cc04364ab6a8a141d1976d22c08c8705d434276405fada9fb + 1e7a6048da7b760b85301927b9a57ad7da041046df179126cd0126df97029927 + d3af2b83e1349e9db60b8caf47141f3e9ff339651823909f6ee98fdeb7b1134e + 53dd63b3de2a325b278084825883a19de8e7fdc8bc4fff88f24b052a64731094 + d4da572047b11729bc29c3f7f9c9afa68ea308b0f0d03515037c9bac77dfdb37"