WebKit Bugzilla
Attachment 372469 Details for
Bug 196772
: iOS 12.2 Drawing portrait video to canvas is sideways
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Patch for landing
bug-196772-20190619100354.patch (text/plain), 115.91 KB, created by
Jer Noble
on 2019-06-19 10:03:55 PDT
(
hide
)
Description:
Patch for landing
Filename:
MIME Type:
Creator:
Jer Noble
Created:
2019-06-19 10:03:55 PDT
Size:
115.91 KB
patch
obsolete
>Subversion Revision: 246438 >diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog >index cba539656f9a06d957afbb1f222c6a08d1b4ff09..0ddd528cef7d595db6d785cacc5e499bb008dd1c 100644 >--- a/Source/WebCore/ChangeLog >+++ b/Source/WebCore/ChangeLog >@@ -1,3 +1,46 @@ >+2019-06-17 Jer Noble <jer.noble@apple.com> >+ >+ iOS 12.2 Drawing portrait video to canvas is sideways >+ https://bugs.webkit.org/show_bug.cgi?id=196772 >+ <rdar://problem/49781802> >+ >+ Reviewed by Eric Carlson. >+ >+ Test: media/video-orientation-canvas.html >+ >+ Move rotation code into its own ImageRotationSessionVT class for re-use across >+ all existing classes with rotation operations. Should slightly increase performance >+ for painting rotated media files, as the rotation only occurs once per frame, rather >+ than once per drawing operation. >+ >+ * WebCore.xcodeproj/project.pbxproj: >+ * platform/graphics/avfoundation/objc/ImageDecoderAVFObjC.h: >+ (WebCore::ImageDecoderAVFObjC::RotationProperties::isIdentity const): Deleted. >+ * platform/graphics/avfoundation/objc/ImageDecoderAVFObjC.mm: >+ (WebCore::ImageDecoderAVFObjC::readTrackMetadata): >+ (WebCore::ImageDecoderAVFObjC::storeSampleBuffer): >+ (WebCore::ImageDecoderAVFObjC::setTrack): >+ (WebCore::transformToRotationProperties): Deleted. >+ * platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.h: >+ * platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm: >+ (WebCore::MediaPlayerPrivateAVFoundationObjC::tracksChanged): >+ (WebCore::MediaPlayerPrivateAVFoundationObjC::updateLastPixelBuffer): >+ (WebCore::MediaPlayerPrivateAVFoundationObjC::paintWithVideoOutput): >+ * platform/graphics/cv/ImageRotationSessionVT.h: Added. >+ (WebCore::ImageRotationSessionVT::RotationProperties::isIdentity const): >+ (WebCore::ImageRotationSessionVT::rotationProperties const): >+ (WebCore::ImageRotationSessionVT::rotatedSize): >+ * platform/graphics/cv/ImageRotationSessionVT.mm: Added. >+ (WebCore::transformToRotationProperties): >+ (WebCore::ImageRotationSessionVT::ImageRotationSessionVT): >+ (WebCore::ImageRotationSessionVT::rotate): >+ * platform/mediastream/mac/RealtimeOutgoingVideoSourceCocoa.cpp: >+ * platform/mediastream/mac/RealtimeOutgoingVideoSourceCocoa.h: >+ * platform/mediastream/mac/RealtimeOutgoingVideoSourceCocoa.mm: >+ (WebCore::rotationToAngle): >+ (WebCore::RealtimeOutgoingVideoSourceCocoa::rotatePixelBuffer): >+ (WebCore::computeRotatedWidthAndHeight): Deleted. >+ > 2019-06-06 Jer Noble <jer.noble@apple.com> > > REGRESSION(244439): platform/mac/media/encrypted-media/fps-* tests are crashing >diff --git a/Source/WebCore/WebCore.xcodeproj/project.pbxproj b/Source/WebCore/WebCore.xcodeproj/project.pbxproj >index aacba4c14b071add6cd196b1ea7925fe76e5fe72..b8e9c7c6d439d4d1ef41ee1e6e12d159d93a7cc5 100644 >--- a/Source/WebCore/WebCore.xcodeproj/project.pbxproj >+++ b/Source/WebCore/WebCore.xcodeproj/project.pbxproj >@@ -4021,6 +4021,8 @@ > CD1E7347167BC78E009A885D /* TextTrackRepresentation.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CD1E7346167BC78E009A885D /* TextTrackRepresentation.cpp */; }; > CD225C0B1C46FBF400140761 /* WebCoreNSURLSession.mm in Sources */ = {isa = PBXBuildFile; fileRef = CD225C091C46FBF400140761 /* WebCoreNSURLSession.mm */; }; > CD225C0C1C46FBF400140761 /* WebCoreNSURLSession.h in Headers */ = {isa = PBXBuildFile; fileRef = CD225C0A1C46FBF400140761 /* WebCoreNSURLSession.h */; settings = {ATTRIBUTES = (Private, ); }; }; >+ CD27AE5022A9868700947FF9 /* ImageRotationSessionVT.h in Headers */ = {isa = PBXBuildFile; fileRef = CD27AE4E22A9868700947FF9 /* ImageRotationSessionVT.h */; }; >+ CD27AE5122A9868700947FF9 /* ImageRotationSessionVT.mm in Sources */ = {isa = PBXBuildFile; fileRef = CD27AE4F22A9868700947FF9 /* ImageRotationSessionVT.mm */; }; > CD2F4A2418D89F700063746D /* AudioHardwareListener.h in Headers */ = {isa = PBXBuildFile; fileRef = CD2F4A2218D89F700063746D /* AudioHardwareListener.h */; settings = {ATTRIBUTES = (Private, ); }; }; > CD2F4A2818D8A3490063746D /* AudioHardwareListenerMac.h in Headers */ = {isa = PBXBuildFile; fileRef = CD2F4A2618D8A3490063746D /* AudioHardwareListenerMac.h */; }; > CD318622199F1E2A0030A0F7 /* CDMPrivateMediaSourceAVFObjC.mm in Sources */ = {isa = PBXBuildFile; fileRef = CD318620199F1E2A0030A0F7 /* CDMPrivateMediaSourceAVFObjC.mm */; }; >@@ -13500,6 +13502,8 @@ > CD1E7346167BC78E009A885D /* TextTrackRepresentation.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TextTrackRepresentation.cpp; sourceTree = "<group>"; }; > CD225C091C46FBF400140761 /* WebCoreNSURLSession.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WebCoreNSURLSession.mm; sourceTree = "<group>"; }; > CD225C0A1C46FBF400140761 /* WebCoreNSURLSession.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebCoreNSURLSession.h; sourceTree = "<group>"; }; >+ CD27AE4E22A9868700947FF9 /* ImageRotationSessionVT.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ImageRotationSessionVT.h; sourceTree = "<group>"; }; >+ CD27AE4F22A9868700947FF9 /* ImageRotationSessionVT.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = ImageRotationSessionVT.mm; sourceTree = "<group>"; }; > CD27F6E014575C1B0078207D /* MediaController.idl */ = {isa = PBXFileReference; lastKnownFileType = text; path = MediaController.idl; sourceTree = "<group>"; }; > CD27F6E2145767580078207D /* JSMediaController.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSMediaController.cpp; sourceTree = "<group>"; }; > CD27F6E3145767580078207D /* JSMediaController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSMediaController.h; sourceTree = "<group>"; }; >@@ -25644,6 +25648,8 @@ > CD9D827C1C7BB2ED006FF066 /* cv */ = { > isa = PBXGroup; > children = ( >+ CD27AE4E22A9868700947FF9 /* ImageRotationSessionVT.h */, >+ CD27AE4F22A9868700947FF9 /* ImageRotationSessionVT.mm */, > 0746D30C2146EA38003DDF84 /* ImageTransferSessionVT.h */, > 0746D30A2146EA37003DDF84 /* ImageTransferSessionVT.mm */, > CD7D33411C7A123F00041293 /* PixelBufferConformerCV.cpp */, >@@ -29482,6 +29488,7 @@ > 2D5A5931152525D00036EE51 /* ImageOrientation.h in Headers */, > B51A2F3F17D7D3AE0072517A /* ImageQualityController.h in Headers */, > 49291E4B134172C800E753DE /* ImageRenderingMode.h in Headers */, >+ CD27AE5022A9868700947FF9 /* ImageRotationSessionVT.h in Headers */, > 7C193BC11F5E0EED0088F3E6 /* ImageSmoothingQuality.h in Headers */, > 5546757B1FD212A9003B10B0 /* ImageSource.h in Headers */, > 4B3480940EEF50D400AC1B41 /* ImageSourceCG.h in Headers */, >@@ -32733,6 +32740,7 @@ > A8D06B3A0A265DCD005E7203 /* HTMLNames.cpp in Sources */, > 1AC900C31943C0FC008625B5 /* HTTPHeaderNames.cpp in Sources */, > CD19FEAF1F574B6D000C42FB /* ImageDecoderAVFObjC.mm in Sources */, >+ CD27AE5122A9868700947FF9 /* ImageRotationSessionVT.mm in Sources */, > BE961C5418AD338500D07DC5 /* InbandDataTextTrack.cpp in Sources */, > BE16C59217CFE17200852C04 /* InbandGenericTextTrack.cpp in Sources */, > 07E9E13018F62B370011A3A4 /* InbandMetadataTextTrackPrivateAVF.cpp in Sources */, >diff --git a/Source/WebCore/platform/graphics/avfoundation/objc/ImageDecoderAVFObjC.h b/Source/WebCore/platform/graphics/avfoundation/objc/ImageDecoderAVFObjC.h >index 4a2dc492a8adbeb09cd0746bbb64ab1ca990aa7a..b5d1b9adc6d1fe41ae3d7147b0a3c718f3a213d2 100644 >--- a/Source/WebCore/platform/graphics/avfoundation/objc/ImageDecoderAVFObjC.h >+++ b/Source/WebCore/platform/graphics/avfoundation/objc/ImageDecoderAVFObjC.h >@@ -38,8 +38,6 @@ OBJC_CLASS AVAssetReader; > OBJC_CLASS AVURLAsset; > OBJC_CLASS WebCoreSharedBufferResourceLoaderDelegate; > typedef struct opaqueCMSampleBuffer* CMSampleBufferRef; >-typedef struct OpaqueVTImageRotationSession* VTImageRotationSessionRef; >-typedef struct __CVPixelBufferPool* CVPixelBufferPoolRef; > > namespace WTF { > class MediaTime; >@@ -49,6 +47,7 @@ namespace WebCore { > > class ContentType; > class ImageDecoderAVFObjCSample; >+class ImageRotationSessionVT; > class PixelBufferConformerCV; > class WebCoreDecompressionSession; > >@@ -90,14 +89,6 @@ public: > bool isAllDataReceived() const final { return m_isAllDataReceived; } > void clearFrameBufferCache(size_t) final; > >- struct RotationProperties { >- bool flipX { false }; >- bool flipY { false }; >- unsigned angle { 0 }; >- >- bool isIdentity() const { return !flipX && !flipY && !angle; } >- }; >- > private: > ImageDecoderAVFObjC(SharedBuffer&, const String& mimeType, AlphaOption, GammaAndColorProfileOption); > >@@ -116,8 +107,7 @@ private: > RetainPtr<AVURLAsset> m_asset; > RetainPtr<AVAssetTrack> m_track; > RetainPtr<WebCoreSharedBufferResourceLoaderDelegate> m_loader; >- RetainPtr<VTImageRotationSessionRef> m_rotationSession; >- RetainPtr<CVPixelBufferPoolRef> m_rotationPool; >+ std::unique_ptr<ImageRotationSessionVT> m_imageRotationSession; > Ref<WebCoreDecompressionSession> m_decompressionSession; > WTF::Function<void(EncodedDataStatus)> m_encodedDataStatusChangedCallback; > >@@ -126,7 +116,6 @@ private: > Lock m_sampleGeneratorLock; > bool m_isAllDataReceived { false }; > Optional<IntSize> m_size; >- Optional<RotationProperties> m_rotation; > }; > > } >diff --git a/Source/WebCore/platform/graphics/avfoundation/objc/ImageDecoderAVFObjC.mm b/Source/WebCore/platform/graphics/avfoundation/objc/ImageDecoderAVFObjC.mm >index 5fbf505af7ce5a524eccdf83e8c3358b6ae2eac0..2fe2524994c3b194459ec333029abd9e985c75b4 100644 >--- a/Source/WebCore/platform/graphics/avfoundation/objc/ImageDecoderAVFObjC.mm >+++ b/Source/WebCore/platform/graphics/avfoundation/objc/ImageDecoderAVFObjC.mm >@@ -34,6 +34,7 @@ > #import "FloatQuad.h" > #import "FloatRect.h" > #import "FloatSize.h" >+#import "ImageRotationSessionVT.h" > #import "Logging.h" > #import "MIMETypeRegistry.h" > #import "MediaSampleAVFObjC.h" >@@ -233,29 +234,6 @@ static NSDictionary *imageDecoderAssetOptions() > return options; > } > >-static ImageDecoderAVFObjC::RotationProperties transformToRotationProperties(AffineTransform inTransform) >-{ >- ImageDecoderAVFObjC::RotationProperties rotation; >- if (inTransform.isIdentity()) >- return rotation; >- >- AffineTransform::DecomposedType decomposed { }; >- if (!inTransform.decompose(decomposed)) >- return rotation; >- >- rotation.flipY = WTF::areEssentiallyEqual(decomposed.scaleX, -1.); >- rotation.flipX = WTF::areEssentiallyEqual(decomposed.scaleY, -1.); >- auto degrees = rad2deg(decomposed.angle); >- while (degrees < 0) >- degrees += 360; >- >- // Only support rotation in multiples of 90º: >- if (WTF::areEssentiallyEqual(fmod(degrees, 90.), 0.)) >- rotation.angle = clampToUnsigned(degrees); >- >- return rotation; >-} >- > class ImageDecoderAVFObjCSample : public MediaSampleAVFObjC { > public: > static Ref<ImageDecoderAVFObjCSample> create(RetainPtr<CMSampleBufferRef>&& sampleBuffer) >@@ -422,17 +400,21 @@ void ImageDecoderAVFObjC::readSamples() > > void ImageDecoderAVFObjC::readTrackMetadata() > { >- if (!m_rotation) >- m_rotation = transformToRotationProperties(CGAffineTransformConcat(m_asset.get().preferredTransform, m_track.get().preferredTransform)); >+ AffineTransform finalTransform = CGAffineTransformConcat(m_asset.get().preferredTransform, m_track.get().preferredTransform); >+ auto size = expandedIntSize(FloatSize(m_track.get().naturalSize)); >+ if (finalTransform.isIdentity()) { >+ m_size = size; >+ m_imageRotationSession = nullptr; >+ return; >+ } > >- if (!m_size) { >- auto size = FloatSize(m_track.get().naturalSize); >- auto angle = m_rotation.value().angle; >- if (angle == 90 || angle == 270) >- size = size.transposedSize(); >+ if (!m_imageRotationSession >+ || !m_imageRotationSession->transform() >+ || m_imageRotationSession->transform().value() != finalTransform >+ || m_imageRotationSession->size() != size) >+ m_imageRotationSession = std::make_unique<ImageRotationSessionVT>(WTFMove(finalTransform), size, kCVPixelFormatType_32BGRA, ImageRotationSessionVT::IsCGImageCompatible::Yes); > >- m_size = expandedIntSize(size); >- } >+ m_size = expandedIntSize(m_imageRotationSession->rotatedSize()); > } > > bool ImageDecoderAVFObjC::storeSampleBuffer(CMSampleBufferRef sampleBuffer) >@@ -446,38 +428,8 @@ bool ImageDecoderAVFObjC::storeSampleBuffer(CMSampleBufferRef sampleBuffer) > auto presentationTime = PAL::toMediaTime(PAL::CMSampleBufferGetPresentationTimeStamp(sampleBuffer)); > auto iter = m_sampleData.presentationOrder().findSampleWithPresentationTime(presentationTime); > >- if (m_rotation && !m_rotation.value().isIdentity()) { >- auto& rotation = m_rotation.value(); >- if (!m_rotationSession) { >- VTImageRotationSessionRef rawRotationSession = nullptr; >- VTImageRotationSessionCreate(kCFAllocatorDefault, rotation.angle, &rawRotationSession); >- m_rotationSession = rawRotationSession; >- VTImageRotationSessionSetProperty(m_rotationSession.get(), kVTImageRotationPropertyKey_EnableHighSpeedTransfer, kCFBooleanTrue); >- >- if (rotation.flipY) >- VTImageRotationSessionSetProperty(m_rotationSession.get(), kVTImageRotationPropertyKey_FlipVerticalOrientation, kCFBooleanTrue); >- if (rotation.flipX) >- VTImageRotationSessionSetProperty(m_rotationSession.get(), kVTImageRotationPropertyKey_FlipHorizontalOrientation, kCFBooleanTrue); >- } >- >- if (!m_rotationPool) { >- auto pixelAttributes = @{ >- (__bridge NSString *)kCVPixelBufferWidthKey: @(m_size.value().width()), >- (__bridge NSString *)kCVPixelBufferHeightKey: @(m_size.value().height()), >- (__bridge NSString *)kCVPixelBufferPixelFormatTypeKey: @(kCVPixelFormatType_32BGRA), >- (__bridge NSString *)kCVPixelBufferCGImageCompatibilityKey: @YES, >- }; >- CVPixelBufferPoolRef rawPool = nullptr; >- CVPixelBufferPoolCreate(kCFAllocatorDefault, nullptr, (__bridge CFDictionaryRef)pixelAttributes, &rawPool); >- m_rotationPool = adoptCF(rawPool); >- } >- >- CVPixelBufferRef rawRotatedBuffer = nullptr; >- CVPixelBufferPoolCreatePixelBuffer(kCFAllocatorDefault, m_rotationPool.get(), &rawRotatedBuffer); >- auto status = VTImageRotationSessionTransferImage(m_rotationSession.get(), pixelBuffer.get(), rawRotatedBuffer); >- if (status == noErr) >- pixelBuffer = adoptCF(rawRotatedBuffer); >- } >+ if (m_imageRotationSession) >+ pixelBuffer = m_imageRotationSession->rotate(pixelBuffer.get()); > > CGImageRef rawImage = nullptr; > if (noErr != VTCreateCGImageFromCVPixelBuffer(pixelBuffer.get(), nullptr, &rawImage)) { >@@ -506,9 +458,8 @@ void ImageDecoderAVFObjC::setTrack(AVAssetTrack *track) > LockHolder holder { m_sampleGeneratorLock }; > m_sampleData.clear(); > m_size.reset(); >- m_rotation.reset(); > m_cursor = m_sampleData.decodeOrder().end(); >- m_rotationSession = nullptr; >+ m_imageRotationSession = nullptr; > > [track loadValuesAsynchronouslyForKeys:@[@"naturalSize", @"preferredTransform"] completionHandler:[protectedThis = makeRefPtr(this)] () mutable { > callOnMainThread([protectedThis = WTFMove(protectedThis)] { >diff --git a/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.h b/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.h >index 2a709ff92dda29a63b5e5bb2f821941822fb73b7..7e6220c2108632fc52aada461ac281245e1d64b7 100644 >--- a/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.h >+++ b/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.h >@@ -58,6 +58,7 @@ class AudioSourceProviderAVFObjC; > class AudioTrackPrivateAVFObjC; > class CDMInstanceFairPlayStreamingAVFObjC; > class CDMSessionAVFoundationObjC; >+class ImageRotationSessionVT; > class InbandMetadataTextTrackPrivateAVF; > class MediaSelectionGroupAVFObjC; > class PixelBufferConformerCV; >@@ -325,6 +326,7 @@ private: > Vector<String> preferredAudioCharacteristics() const; > > void setShouldDisableSleep(bool) override; >+ void updateRotationSession(); > > Optional<VideoPlaybackQualityMetrics> videoPlaybackQualityMetrics() final; > >@@ -360,6 +362,7 @@ private: > RetainPtr<CVPixelBufferRef> m_lastPixelBuffer; > RetainPtr<CGImageRef> m_lastImage; > BinarySemaphore m_videoOutputSemaphore; >+ std::unique_ptr<ImageRotationSessionVT> m_imageRotationSession; > std::unique_ptr<VideoTextureCopierCV> m_videoTextureCopier; > #endif > >diff --git a/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm b/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm >index 94365fe10e2f574075308eaa158aed890998d1aa..2d1838d8deba4a173309fddab5154a9658f0c098 100644 >--- a/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm >+++ b/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm >@@ -43,6 +43,7 @@ > #import "GraphicsContext.h" > #import "GraphicsContext3D.h" > #import "GraphicsContextCG.h" >+#import "ImageRotationSessionVT.h" > #import "InbandMetadataTextTrackPrivateAVF.h" > #import "InbandTextTrackPrivateAVFObjC.h" > #import "InbandTextTrackPrivateLegacyAVFObjC.h" >@@ -1863,6 +1864,29 @@ void MediaPlayerPrivateAVFoundationObjC::tracksChanged() > setDelayCharacteristicsChangedNotification(false); > } > >+void MediaPlayerPrivateAVFoundationObjC::updateRotationSession() >+{ >+ AffineTransform finalTransform = m_avAsset.get().preferredTransform; >+ FloatSize naturalSize; >+ if (auto* firstEnabledVideoTrack = firstEnabledTrack([m_avAsset.get() tracksWithMediaCharacteristic:AVMediaCharacteristicVisual])) { >+ naturalSize = FloatSize(firstEnabledVideoTrack.naturalSize); >+ finalTransform *= firstEnabledVideoTrack.preferredTransform; >+ } >+ >+ if (finalTransform.isIdentity()) { >+ m_imageRotationSession = nullptr; >+ return; >+ } >+ >+ if (m_imageRotationSession >+ && m_imageRotationSession->transform() >+ && m_imageRotationSession->transform().value() == finalTransform >+ && m_imageRotationSession->size() == naturalSize) >+ return; >+ >+ m_imageRotationSession = std::make_unique<ImageRotationSessionVT>(WTFMove(finalTransform), naturalSize, kCVPixelFormatType_32BGRA, ImageRotationSessionVT::IsCGImageCompatible::Yes); >+} >+ > #if ENABLE(VIDEO_TRACK) > > template <typename RefT, typename PassRefT> >@@ -2053,6 +2077,7 @@ void MediaPlayerPrivateAVFoundationObjC::sizeChanged() > if (!m_avAsset) > return; > >+ updateRotationSession(); > setNaturalSize(m_cachedPresentationSize); > } > >@@ -2140,6 +2165,10 @@ bool MediaPlayerPrivateAVFoundationObjC::updateLastPixelBuffer() > return false; > > m_lastPixelBuffer = adoptCF([m_videoOutput.get() copyPixelBufferForItemTime:currentTime itemTimeForDisplay:nil]); >+ >+ if (m_imageRotationSession) >+ m_lastPixelBuffer = m_imageRotationSession->rotate(m_lastPixelBuffer.get()); >+ > m_lastImage = nullptr; > return true; > } >@@ -2206,13 +2235,8 @@ void MediaPlayerPrivateAVFoundationObjC::paintWithVideoOutput(GraphicsContext& c > > INFO_LOG(LOGIDENTIFIER); > >- GraphicsContextStateSaver stateSaver(context); > FloatRect imageRect(0, 0, CGImageGetWidth(m_lastImage.get()), CGImageGetHeight(m_lastImage.get())); >- AffineTransform videoTransform = [firstEnabledVideoTrack preferredTransform]; >- FloatRect transformedOutputRect = videoTransform.inverse().valueOr(AffineTransform()).mapRect(outputRect); >- >- context.concatCTM(videoTransform); >- context.drawNativeImage(m_lastImage.get(), imageRect.size(), transformedOutputRect, imageRect); >+ context.drawNativeImage(m_lastImage.get(), imageRect.size(), outputRect, imageRect); > > // If we have created an AVAssetImageGenerator in the past due to m_videoOutput not having an available > // video frame, destroy it now that it is no longer needed. >diff --git a/Source/WebCore/platform/graphics/cv/ImageRotationSessionVT.h b/Source/WebCore/platform/graphics/cv/ImageRotationSessionVT.h >new file mode 100644 >index 0000000000000000000000000000000000000000..adc97adc1fa2458099003c3de9c0aa38d876187d >--- /dev/null >+++ b/Source/WebCore/platform/graphics/cv/ImageRotationSessionVT.h >@@ -0,0 +1,75 @@ >+/* >+ * Copyright (C) 2019 Apple Inc. All rights reserved. >+ * >+ * Redistribution and use in source and binary forms, with or without >+ * modification, are permitted provided that the following conditions >+ * are met: >+ * 1. Redistributions of source code must retain the above copyright >+ * notice, this list of conditions and the following disclaimer. >+ * 2. Redistributions in binary form must reproduce the above copyright >+ * notice, this list of conditions and the following disclaimer in the >+ * documentation and/or other materials provided with the distribution. >+ * >+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' >+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, >+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR >+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS >+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR >+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF >+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS >+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN >+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) >+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF >+ * THE POSSIBILITY OF SUCH DAMAGE. >+ */ >+ >+#pragma once >+ >+#if USE(VIDEOTOOLBOX) >+ >+#include "AffineTransform.h" >+#include "FloatSize.h" >+ >+typedef struct OpaqueVTImageRotationSession* VTImageRotationSessionRef; >+typedef struct __CVBuffer *CVPixelBufferRef; >+typedef struct __CVPixelBufferPool* CVPixelBufferPoolRef; >+ >+namespace WebCore { >+ >+class ImageRotationSessionVT { >+public: >+ struct RotationProperties { >+ bool flipX { false }; >+ bool flipY { false }; >+ unsigned angle { 0 }; >+ >+ bool isIdentity() const { return !flipX && !flipY && !angle; } >+ }; >+ >+ enum class IsCGImageCompatible { >+ No, >+ Yes, >+ }; >+ >+ ImageRotationSessionVT(AffineTransform&&, FloatSize, OSType pixelFormat, IsCGImageCompatible); >+ ImageRotationSessionVT(RotationProperties&&, FloatSize, OSType pixelFormat, IsCGImageCompatible); >+ >+ const Optional<AffineTransform>& transform() const { return m_transform; } >+ const RotationProperties& rotationProperties() const { return m_rotationProperties; } >+ const FloatSize& size() { return m_size; } >+ const FloatSize& rotatedSize() { return m_rotatedSize; } >+ >+ RetainPtr<CVPixelBufferRef> rotate(CVPixelBufferRef); >+ >+private: >+ Optional<AffineTransform> m_transform; >+ RotationProperties m_rotationProperties; >+ FloatSize m_size; >+ FloatSize m_rotatedSize; >+ RetainPtr<VTImageRotationSessionRef> m_rotationSession; >+ RetainPtr<CVPixelBufferPoolRef> m_rotationPool; >+}; >+ >+} >+ >+#endif >diff --git a/Source/WebCore/platform/graphics/cv/ImageRotationSessionVT.mm b/Source/WebCore/platform/graphics/cv/ImageRotationSessionVT.mm >new file mode 100644 >index 0000000000000000000000000000000000000000..88a5db5956ee8b95f108e4656fc57c1c7e0f9bd7 >--- /dev/null >+++ b/Source/WebCore/platform/graphics/cv/ImageRotationSessionVT.mm >@@ -0,0 +1,111 @@ >+/* >+ * Copyright (C) 2019 Apple Inc. All rights reserved. >+ * >+ * Redistribution and use in source and binary forms, with or without >+ * modification, are permitted provided that the following conditions >+ * are met: >+ * 1. Redistributions of source code must retain the above copyright >+ * notice, this list of conditions and the following disclaimer. >+ * 2. Redistributions in binary form must reproduce the above copyright >+ * notice, this list of conditions and the following disclaimer in the >+ * documentation and/or other materials provided with the distribution. >+ * >+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' >+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, >+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR >+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS >+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR >+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF >+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS >+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN >+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) >+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF >+ * THE POSSIBILITY OF SUCH DAMAGE. >+ */ >+ >+#include "config.h" >+#include "ImageRotationSessionVT.h" >+ >+#include "AffineTransform.h" >+ >+#include "CoreVideoSoftLink.h" >+#include "VideoToolboxSoftLink.h" >+ >+#if USE(VIDEOTOOLBOX) >+ >+namespace WebCore { >+ >+static ImageRotationSessionVT::RotationProperties transformToRotationProperties(const AffineTransform& inTransform) >+{ >+ ImageRotationSessionVT::RotationProperties rotation; >+ if (inTransform.isIdentity()) >+ return rotation; >+ >+ AffineTransform::DecomposedType decomposed { }; >+ if (!inTransform.decompose(decomposed)) >+ return rotation; >+ >+ rotation.flipY = WTF::areEssentiallyEqual(decomposed.scaleX, -1.); >+ rotation.flipX = WTF::areEssentiallyEqual(decomposed.scaleY, -1.); >+ auto degrees = rad2deg(decomposed.angle); >+ while (degrees < 0) >+ degrees += 360; >+ >+ // Only support rotation in multiples of 90º: >+ if (WTF::areEssentiallyEqual(fmod(degrees, 90.), 0.)) >+ rotation.angle = clampToUnsigned(degrees); >+ >+ return rotation; >+} >+ >+ImageRotationSessionVT::ImageRotationSessionVT(AffineTransform&& transform, FloatSize size, OSType pixelFormat, IsCGImageCompatible cvImageCompatibility) >+ : ImageRotationSessionVT(transformToRotationProperties(transform), size, pixelFormat, cvImageCompatibility) >+{ >+ m_transform = WTFMove(transform); >+} >+ >+ >+ImageRotationSessionVT::ImageRotationSessionVT(RotationProperties&& rotation, FloatSize size, OSType pixelFormat, IsCGImageCompatible cvImageCompatibility) >+ : m_rotationProperties(WTFMove(rotation)) >+ , m_size(size) >+{ >+ if (m_rotationProperties.angle == 90 || m_rotationProperties.angle == 270) >+ size = size.transposedSize(); >+ >+ m_rotatedSize = expandedIntSize(size); >+ >+ VTImageRotationSessionRef rawRotationSession = nullptr; >+ VTImageRotationSessionCreate(kCFAllocatorDefault, m_rotationProperties.angle, &rawRotationSession); >+ m_rotationSession = rawRotationSession; >+ VTImageRotationSessionSetProperty(m_rotationSession.get(), kVTImageRotationPropertyKey_EnableHighSpeedTransfer, kCFBooleanTrue); >+ >+ if (m_rotationProperties.flipY) >+ VTImageRotationSessionSetProperty(m_rotationSession.get(), kVTImageRotationPropertyKey_FlipVerticalOrientation, kCFBooleanTrue); >+ if (m_rotationProperties.flipX) >+ VTImageRotationSessionSetProperty(m_rotationSession.get(), kVTImageRotationPropertyKey_FlipHorizontalOrientation, kCFBooleanTrue); >+ >+ auto pixelAttributes = @{ >+ (__bridge NSString *)kCVPixelBufferWidthKey: @(m_rotatedSize.width()), >+ (__bridge NSString *)kCVPixelBufferHeightKey: @(m_rotatedSize.height()), >+ (__bridge NSString *)kCVPixelBufferPixelFormatTypeKey: @(pixelFormat), >+ (__bridge NSString *)kCVPixelBufferCGImageCompatibilityKey: (cvImageCompatibility == IsCGImageCompatible::Yes ? @YES : @NO), >+ }; >+ CVPixelBufferPoolRef rawPool = nullptr; >+ if (auto err = CVPixelBufferPoolCreate(kCFAllocatorDefault, nullptr, (__bridge CFDictionaryRef)pixelAttributes, &rawPool); err != noErr) >+ LOG_ERROR("CVPixelBufferPool create returned error code %d", err); >+ m_rotationPool = adoptCF(rawPool); >+} >+ >+RetainPtr<CVPixelBufferRef> ImageRotationSessionVT::rotate(CVPixelBufferRef pixelBuffer) >+{ >+ CVPixelBufferRef rawRotatedBuffer = nullptr; >+ CVPixelBufferPoolCreatePixelBuffer(kCFAllocatorDefault, m_rotationPool.get(), &rawRotatedBuffer); >+ auto status = VTImageRotationSessionTransferImage(m_rotationSession.get(), pixelBuffer, rawRotatedBuffer); >+ if (status == noErr) >+ return adoptCF(rawRotatedBuffer); >+ return nullptr; >+} >+ >+} >+ >+#endif >diff --git a/Source/WebCore/platform/mediastream/mac/RealtimeOutgoingVideoSourceCocoa.cpp b/Source/WebCore/platform/mediastream/mac/RealtimeOutgoingVideoSourceCocoa.cpp >index 7c2c8f310ed5845b5ebaf90074b8f4cda37fa9cd..1344127b8fbfbf1e47ba64d36e6b13d70e80604a 100644 >--- a/Source/WebCore/platform/mediastream/mac/RealtimeOutgoingVideoSourceCocoa.cpp >+++ b/Source/WebCore/platform/mediastream/mac/RealtimeOutgoingVideoSourceCocoa.cpp >@@ -28,6 +28,7 @@ > > #if USE(LIBWEBRTC) > >+#include "ImageRotationSessionVT.h" > #include "Logging.h" > #include "RealtimeIncomingVideoSourceCocoa.h" > #include "RealtimeVideoUtilities.h" >diff --git a/Source/WebCore/platform/mediastream/mac/RealtimeOutgoingVideoSourceCocoa.h b/Source/WebCore/platform/mediastream/mac/RealtimeOutgoingVideoSourceCocoa.h >index 486c9a5d3d69bc593db5e8db7433fb571971dd11..0484b1cd1302aea1ee3aba21b823e2b6efd447f3 100644 >--- a/Source/WebCore/platform/mediastream/mac/RealtimeOutgoingVideoSourceCocoa.h >+++ b/Source/WebCore/platform/mediastream/mac/RealtimeOutgoingVideoSourceCocoa.h >@@ -31,11 +31,10 @@ > #include "PixelBufferConformerCV.h" > #include <webrtc/api/video/video_rotation.h> > >-typedef struct OpaqueVTImageRotationSession* VTImageRotationSessionRef; >-typedef struct __CVPixelBufferPool* CVPixelBufferPoolRef; >- > namespace WebCore { > >+class ImageRotationSessionVT; >+ > class RealtimeOutgoingVideoSourceCocoa final : public RealtimeOutgoingVideoSource { > public: > static Ref<RealtimeOutgoingVideoSourceCocoa> create(Ref<MediaStreamTrackPrivate>&&); >@@ -52,8 +51,7 @@ private: > RetainPtr<CVPixelBufferRef> rotatePixelBuffer(CVPixelBufferRef, webrtc::VideoRotation); > > std::unique_ptr<PixelBufferConformerCV> m_pixelBufferConformer; >- RetainPtr<VTImageRotationSessionRef> m_rotationSession; >- RetainPtr<CVPixelBufferPoolRef> m_rotationPool; >+ std::unique_ptr<ImageRotationSessionVT> m_rotationSession; > webrtc::VideoRotation m_currentRotationSessionAngle { webrtc::kVideoRotation_0 }; > size_t m_rotatedWidth { 0 }; > size_t m_rotatedHeight { 0 }; >diff --git a/Source/WebCore/platform/mediastream/mac/RealtimeOutgoingVideoSourceCocoa.mm b/Source/WebCore/platform/mediastream/mac/RealtimeOutgoingVideoSourceCocoa.mm >index d33806da2e7480c5b6ea5215b4a428d0ecf32ccf..f9dc4a847f4a355d9ccff4cde0308d0d5c5c4456 100644 >--- a/Source/WebCore/platform/mediastream/mac/RealtimeOutgoingVideoSourceCocoa.mm >+++ b/Source/WebCore/platform/mediastream/mac/RealtimeOutgoingVideoSourceCocoa.mm >@@ -28,6 +28,8 @@ > > #if USE(LIBWEBRTC) > >+#import "AffineTransform.h" >+#import "ImageRotationSessionVT.h" > #import "Logging.h" > #import "MediaSample.h" > #import "PixelBufferConformerCV.h" >@@ -49,19 +51,17 @@ RetainPtr<CVPixelBufferRef> RealtimeOutgoingVideoSourceCocoa::convertToYUV(CVPix > return m_pixelBufferConformer->convert(pixelBuffer); > } > >-static inline void computeRotatedWidthAndHeight(CVPixelBufferRef pixelBuffer, webrtc::VideoRotation rotation, size_t& width, size_t& height) >+static inline unsigned rotationToAngle(webrtc::VideoRotation rotation) > { > switch (rotation) { > case webrtc::kVideoRotation_0: >- case webrtc::kVideoRotation_180: >- width = CVPixelBufferGetWidth(pixelBuffer); >- height = CVPixelBufferGetHeight(pixelBuffer); >- return; >+ return 0; > case webrtc::kVideoRotation_90: >+ return 90; >+ case webrtc::kVideoRotation_180: >+ return 180; > case webrtc::kVideoRotation_270: >- width = CVPixelBufferGetHeight(pixelBuffer); >- height = CVPixelBufferGetWidth(pixelBuffer); >- return; >+ return 270; > } > } > >@@ -72,60 +72,13 @@ RetainPtr<CVPixelBufferRef> RealtimeOutgoingVideoSourceCocoa::rotatePixelBuffer( > return pixelBuffer; > > if (!m_rotationSession || rotation != m_currentRotationSessionAngle) { >- VTImageRotationSessionRef rawRotationSession = nullptr; >- auto status = VTImageRotationSessionCreate(kCFAllocatorDefault, rotation, &rawRotationSession); >- if (status != noErr) { >- ERROR_LOG(LOGIDENTIFIER, "Failed creating a rotation session with error ", status); >- return nullptr; >- } >- >- m_rotationSession = adoptCF(rawRotationSession); >- m_currentRotationSessionAngle = rotation; >- >- VTImageRotationSessionSetProperty(rawRotationSession, kVTImageRotationPropertyKey_EnableHighSpeedTransfer, kCFBooleanTrue); >- } >- >- size_t rotatedWidth, rotatedHeight; >- computeRotatedWidthAndHeight(pixelBuffer, rotation, rotatedWidth, rotatedHeight); >- auto format = CVPixelBufferGetPixelFormatType(pixelBuffer); >- if (!m_rotationPool || rotatedWidth != m_rotatedWidth || rotatedHeight != m_rotatedHeight || format != m_rotatedFormat) { >- auto pixelAttributes = @{ >- (__bridge NSString *)kCVPixelBufferWidthKey: @(rotatedWidth), >- (__bridge NSString *)kCVPixelBufferHeightKey: @(rotatedHeight), >- (__bridge NSString *)kCVPixelBufferPixelFormatTypeKey: @(format), >- (__bridge NSString *)kCVPixelBufferCGImageCompatibilityKey: @NO, >- }; >- >- CVPixelBufferPoolRef pool = nullptr; >- auto status = CVPixelBufferPoolCreate(kCFAllocatorDefault, nullptr, (__bridge CFDictionaryRef)pixelAttributes, &pool); >- >- if (status != kCVReturnSuccess) { >- ERROR_LOG(LOGIDENTIFIER, "Failed creating a pixel buffer pool with error ", status); >- return nullptr; >- } >- m_rotationPool = adoptCF(pool); >- >- m_rotatedWidth = rotatedWidth; >- m_rotatedHeight = rotatedHeight; >- m_rotatedFormat = format; >- } >- >- CVPixelBufferRef rawRotatedBuffer = nullptr; >- auto status = CVPixelBufferPoolCreatePixelBuffer(kCFAllocatorDefault, m_rotationPool.get(), &rawRotatedBuffer); >- >- if (status != kCVReturnSuccess) { >- ERROR_LOG(LOGIDENTIFIER, "Failed creating a pixel buffer with error ", status); >- return nullptr; >+ IntSize size = { (int)CVPixelBufferGetWidth(pixelBuffer) , (int)CVPixelBufferGetHeight(pixelBuffer) }; >+ AffineTransform transform; >+ transform.rotate(rotationToAngle(rotation)); >+ m_rotationSession = std::make_unique<ImageRotationSessionVT>(WTFMove(transform), size, CVPixelBufferGetPixelFormatType(pixelBuffer), ImageRotationSessionVT::IsCGImageCompatible::No); > } >- RetainPtr<CVPixelBufferRef> rotatedBuffer = adoptCF(rawRotatedBuffer); >- >- status = VTImageRotationSessionTransferImage(m_rotationSession.get(), pixelBuffer, rotatedBuffer.get()); > >- if (status != noErr) { >- ERROR_LOG(LOGIDENTIFIER, "Failed rotating with error ", status, " for rotation ", m_currentRotation); >- return nullptr; >- } >- return rotatedBuffer; >+ return m_rotationSession->rotate(pixelBuffer); > } > > } // namespace WebCore >diff --git a/LayoutTests/ChangeLog b/LayoutTests/ChangeLog >index 2a772e8cc25266cfdbd0789078719476ce369f1c..7a894419bc9ed4b9bb74e480a7df410a67c5ee43 100644 >--- a/LayoutTests/ChangeLog >+++ b/LayoutTests/ChangeLog >@@ -1,3 +1,18 @@ >+2019-06-17 Jer Noble <jer.noble@apple.com> >+ >+ iOS 12.2 Drawing portrait video to canvas is sideways >+ https://bugs.webkit.org/show_bug.cgi?id=196772 >+ <rdar://problem/49781802> >+ >+ Reviewed by Eric Carlson. >+ >+ * media/content/no-rotation.mp4: >+ * media/media-source/only-bcp47-language-tags-accepted-as-valid-expected.txt: >+ * media/video-orientation-canvas-expected.html: Added. >+ * media/video-orientation-canvas.html: Added. >+ * media/video-test.js: >+ (waitFor): >+ > 2019-06-14 Saam Barati <sbarati@apple.com> > > [WHLSL] Implement out-of-bounds and nullptr behavior >diff --git a/LayoutTests/media/content/no-rotation.mp4 b/LayoutTests/media/content/no-rotation.mp4 >index f435352e97716a9f45be593bb68076ee68cb8163..6d2d82ef4ea66af50433d83b1cb9b2399c40e405 100644 >GIT binary patch >literal 23221 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 >SQZx6m77*m(72x9G=J^k{G3=E9 > >literal 34515 >zcmdqJcUV))`ahbGKtfGGs<co=kS0|?2uK&C7ZvGUI*5pr(4_Y+NJpsx7DNRJO+<=R >zr6>fDY9TbGue;E_&)H|6^F8<b{GNO7A9tQ-*34RK=ABvde&#JRlRzL4W=FqUUhZC! >zXCV*>^f(2hI0S-FclY%42cNmQ`#al%Dde>qe(g9yASC8sG=V_D3db-04F7TiKK$D~ >z_Rn(vIfa8Xcl~^9u7j^F{I36M6Z+3K|D*=C`}gp-cK$5+XE7|8fm(wR133=74)%V& >zV9Ms;=Ii(C$*-RNLH8Fe5^r~V7aQ;$#@+rue!DqC_ph3A&h~CTf6##VyVyJYnLkdI >zy}aBUFs9&BPmHbuND!lG<6-aSa9n`|<?iC)2xjR0-G6`Sag9F$ul?_LZ1z45$7PPg >zalfc;__$$y=b`U>{cPR9e6_Ei?=SBBeh$e4xp&O9<M8)!0Y?FffoOtnj^lCow-Ub} >z|K-XI0N|aPgRlMZm_cAN5C|t+6hjNW3EnLKili8jQ2i!&c}hdT;@|xy3&lVpv3mmM >zT$mD0GAIdHm)Y0v*T93>Uk!7BDgE!~zQ2fr`QviOoniqa7W_0jFg*?+IDS1R|06vv >zNA^b^2Bv>LKQ8y@^8~PdAb9_00Ndl%2FZZKL$VD<RxrN;rdPn!9ZapkC<{g*FoN_+ >zj>}Gi=`rAs-|K_%0vOA{$N<I|FuH&-4vYq13;?_R1Og$=0P_`KGzB9U7`?y_V0``T >zJpbqj*hj=22t=*`<O9gUYX@LEWB&#C$KMKu|1;qKuKVlyzW_c|_x}d?CVv25`LDnS >zu>p?HKf`a}>*}j%2uos&>>NBC{tf?-&wt>b%Hucwk8A%ga1W{Z1NWML!@Vqs`#(W+ >z3?PAjAoe792d5*U{)M08S5OEk2pQ~u1|?YF*FdxV1$@6N9asDv>Hh+(6aRen4+ewf >zH1)uu^Z$jZ$Djqn{})V!(EI(CBUJ8Qp7vm)VE>>R|4T+=|H^33|Hf!NRU_Sh=kv_} >zA)g=o!RHHq<Fmxy_{{SUK7&&d0;h(O{)0_W$p14eruaQ%5RmQv!eU$SIhPAKCSVFd >zp8%2p0Qd>e9E%{5U)N(EBOQGlj<v!cX{dv{z0I-KLEijBTl~I<HlktZ`j*#}lh=Xk >z(jIy}yQ1_>?fMvuxVi1^JxqJqIdMa1-_p4Yg(u2}Y@DK@!!eif^YNrwLdH|Kvl-qA >zs0oo4FN@cI7Y*ks@0=DrJK|9P_^Z_7IpxddX46h?J)-eS6~<0#m&>Z+=}j|ky~>h` >z&9y>rRjS<|^=rdQ_UMaSX;3~Xe>lCa)>>ubVlp_(#xIExB63R!rVWIpb}l+>B)PHG >zY3ZK`s4slV3!}0z9d#F1rKlHgjtJLosy?WHDc7CjqMNoxc{2X$dpBCRChONoK}iL+ >z5W|VSD*_vd28_9f!jDZ^qf>P)W=(@zQywqGZ-+AWp3{ElPaoTC>G{Fyd}q&HA=I-7 >zZ?ZL7ygh}7%PYSq%}*%S&Yozct;6acF-o6%0+NcK+AW9k@2cN+u=Z7YUhNrJuCq6H >zCTxlJ3?tFD$Ma>Cotlvd45NJ7{HEYSQJY!(d?;*N;%%LG-ChLrTA^V6WfHWFu^82> >z%6%=tNLe$$!*zK3*4S1DagT78`HA4X#hJ%9odoZ~{k>#m<I1lLo@J28bRLfSw&uD` >z2i2Q&8S1SSe*|R!wgeflpVLYM3jyUjUvJx3FAZ_*FyD8c9KFbuoZJvXs$C^pTGT<k >zd`s(64KmL->+!@<<-E2q4U^G@V%q65Lf>Vw`}gs7#+L{7tN7yNG@bf&n@zgnX07Ll >zRK6|wpBEaKa~YdUTdHol-fNya$a!KFuc`7-e0O8$U0}IpKoV3l(FQNp`XI>4N)X1e >zY4lcP#kJp?>M~O2zRXHbg20b`V64e3S3X}lLf@~F?Y2W5kblsFwmSVy*`QOC^m=&J >z=^xwlRodBy<7O>}Pg!`Be!8C>xkz&=-q8(x-qW$tKrn{AM?mMIcmm2N@Qh4;JcVV$ >z0h_?LDz94ArMo{uCF&df!!nn(#A^!Jcm}-I;<MLnvqCUB1_l)<*Zeizhb}BiZk3OQ >zIyBqnl(u(8<K&Eb^f?Oo*-XD*rZhlActFqAXDN0~vS;!vF_BoU81kt19B5|LN<G#6 >zaV^HpV)6amots~WbAp-X)DG*U+4m)-qCZ`qqW5rk6KCG=`arXxLoFh_?+gi>;7Rcg >zBgBbub2hI^KPT38p7lF-v(K;DS1j76r6>v7Bqg2v`6A&l|IL_~ymg*~TqDLWI#S;% >zz6V~^j}qZGDMZ^*tFPVOT`u>#o|f`#PJ<*@ES#)k5k|EB{D{UtfVEV$zIeq)??_@> >z=lZRI&|r}+rsr=HT~$AZt5tI_@jZH=S$VDPse27Tfm(3rq1-)DWpgF0KH@7NmmEE{ >z&Xdc5%4~?u)vSDKsc+sr*?*n#l(@P{Nz4<;MXI7;LzqvQF@=XFG9m%>Trh`>tk;!j >zIunZs$F7uR+?w5R<8*Nw&FL<wW~JF196wL1HEDzKQ@p+!AD_-|^U`zDCRys+Gy1E~ >z<1Ihy>wCYnpPyycri)k3K&7Fg1u3z^bz)a8k5L$_jrtRZj#9YDVeh{1b(DNgJoG#? >ztdly-Hr~8>%H_&j)*%EEMU#Rdq{z9P7bWiU^Nq<E&2uCS53aQ?X?Gg>Q^~R$7kwf% >z#2S^t4Pb46BO_L#i^sMkB8qcxiVmSY(OHw6CSCZJl4YOcJ@HZHM)JgXsac2KSp;^& >z`i@22WF>!jC5sLBQ+M5}XY1~HUFZ52ad*5fz^psMmIYr>co_-7)z}O<vkbcBo~g`a >zFm-$$x3I`PRXf9PJY4fars=&-*1AW{^SK|q{H3!30oNKm%0!H-J*aD4D!(|H&33Oh >z&WwzEAkPsmkW#_9-c8aWdP)pLq>No#59DkIXR-KILKTjP<_%lNuok*8Q^Td(bZTA# >zt%*YBSm5FGkL8zTfaSxcODO2!PFjsNZ5Xb-V|`zdgTJ_YLZe(luE<nQ6oCtqY1jXv >z+AwTfL{$2c?VwHJjZlsQqC$V{SMd%jD~+5Hg3d0Bh4Y}Ii|}f(ehkFw176{bjneuH >zNEHcTe$MQ9>PON8A+^&tjW3=j4}GICcV@gv5`K;-hwy?Sl$--{^|_O}neKiXTzMGH >zFr(Kyyo`d9Ad~o<_W?3AJgbdXPIqc|ahdVxTFbZMSlJ>D*g@))T`_l9k+n$Sk%+Et >z@ZE&_P60xDt=FQ-+Xxu7_Spr_>{FMhDEy`?+vt6ZdXLoPv*mlF(1uJTkOSr?nj)OV >z4i#m`Jtgr5XkT*R0up$oM_^kGb&sU;C!gJ#EHOc62h4^J?>Hm*ih^jKAYp}16kYUB >zciTlheHE?iCmRTefFp~E<+<NI<3SE<RMyGlKLRASC}pxejkm;4?fv``Ng#55PMTsz >z&Wz&m*Q^dw#l$bl++(>!G(Bg}K>`obQ7GN&8HpgdmuyUUz_!fdp(Z18GtKy#y5713 >zWl=yN)j2xK_)gPFlrD`IIHX1#7v>r}u$;n3OfU|ccv$k)n8JH}*8PAa(NDIRb7VcM >zdk`c`JHC>-G!?GDonv8{9vYgq>^FU_#b^kZuR~!l(^*X3T17@PHN$I6W!O(}n5H-| >z@!jzx1|U)E;j5WZE^T29H7Ib%F1-J2SgdjDZG4$68mB}iOqb4A8cMj`c_CjAfaJZB >z?pm97Z%u4GlAhX`@&vOd5@Q9on*5Y5u85BDI^^e#G46k`Z?+1LCS95JQC;!B8k@5( >zZ7Y91?v~tzxy#9Lv<VaRRam_wKBSyE{4(Y3t`}vw4fAsOK^ArPcWWi6zux=Yx;1sm >zj8J~y{%mf`@C*eyT7bbixXGYkeupcf9ji3U7~>*Mf4fR0qce3l*mUsgjptF{RC*QJ >z&klNR8=(+Y-8<*e-Dqk*YJQtghl-=nt}kKRVbQGW({$!9^!-F1J4zi^+;=Zk4mjjT >zjRcz(tLeH~8dU7vhgBU=IEGY-#jg@6fi9AlYD;*c0voI{PLe|uNEf2%bfld4xotk{ >zK*5NzuVBho7oxp=>hbxQM_TZXbt?5smW4B}0|GfMv$pdAlxvK!$aLd+vLu2}r4*iz >zrb#vBYtTUB;6d<Xx~KFEiFrgXAQS>gc=f1KIR$I|u|u1R+eo`FX!G{&j{sxoK8lOa >zW(SNogijkN4DK+?5&M`W0`T>%*7F_$7fOV^Ua8S(D$kjYl)d(M--{$kgPq+fblUa$ >zKtbx+wdBP{;olQv$5gUKM%{No*u9}K>xgnzYF>A3X^dFmp5s>7)f^HV=VDc$U7~2x >zs(u)(sje1r7!e;-%&-%GZEmEr$Xb}dPsP%lZE>bAH=SF+%UMZtN~!lwlm2tgxCs_( >z1<pg^w1)5GQDSi?8XD)%Sjx;hH=YP+O;(@2Gr?%HJW=JMRACe_qT~@Qha<XwRU7uH >z-IMvUdSR{|i7H@+A<W@z;i;9@KL}x-8QiroRiq@%JzsNaHE(x1KYunS)p(%ZI1}@J >zYW?I?2+vgyWw{TRFo?deSBQ>8bYP5k`>WWzOP!Z0Gq1Y6zOrxH>EkxneV`4`Na(E0 >zJeBsQHd%sC<J5+yDEgjS85%NNq)Ir+7NDpfgEgR()nrskY&@`ZI2~y7Gy3#YqP3#| >z_m)nvSDGUG7A;Gmev;1u+<k#i;~k7BDn9Ty?W}1$oKR}h%jX-Q*XdvEwWZ14Kz~h- >zGIQN_{Ox#I(OUdlZn?8~MZVw$*oiKIR5x6*Ev^=WdO>#AB%b7+yw)8P?^~Y@W3`{$ >zs%of-Qy`N~R-!ff5jUjYBfv=)J;NrXC$aeag}8wzeBOXX*bO77S3S75m4P)1C(^s2 >z>25EKh79OEIzI#4G%L@ljZe`OJ+*i+pttY1pk`6><STFcSZD#>2buU)6Bi@To?OHz >zcxjY|QeXZ%Nj}ZT1H-}fgvWwhz1QCc4w;tN?Aad0P*=|Clp?a`Th+9>yN>cpsElXe >zm$x*Ak<wu`cF<X+b+ZL*5_y53+Bl-K)(smwSFq0b26>>*a6iqP%QRWg?K*cdG{Sd7 >zIM8ipP*d+JZH{A|22)vS5<yHC(`;OGQAEr5?2P0GkpyE}v)07VKvjN)g*}(JR9yD@ >zMVFiYlh4ge+b(cmCC_taV}<+7mf3FD74WE?Q8`erfA}$6Jj(P)n(tV)BnV0WL(cpu >za+dtg+ddG{zI$0nFwgZ$9ODwrtMh1O;|yv)B~%_-Ho>Q)Vo5DjNN3czGV1bFg4AMp >z#n&G`ex_f8x^yg3O%`edU8-$`f>)wBUr&XIW>pZ-y&Dnjq0_l$2Pj&I1tl|Qd2Ngq >zW=7+cJ-MJ|6mN8i(S<Sgmy44vE`<n3dQPOJ<|n<{#>{K^Y}J-;T&6_{e$_n;MLJ40 >zEdtzU?&Z5kxD^#VDVycoXYK#F<m)69jfORwNXdm(^?uZS!n_nGVOM9)BlTIT7J;a8 >zqcB3U4*jrYlzX30z<*MjNB5|4MEHIyO*b-Or$tS9Im>D%UZRicQ&9ldGXXIMyARMi >z8c0Et&(mj!XWXT?Pn2~YtoeGmAF#gc`s&}J+0Jfu_bj6~pQjYjdRFPxHZ!OC6W^Pc >z_xO~sbGOqS-ZqEEru9D)PjrWOEFmoGwSTbwh=`aTr%zPIy%!cb^M&q*xHFReHUyHR >z_$Uhhrisn3>y}^bh#_-e-irq^!K1Foi~B>B-2sW*f6PqJ&g<?wiSDhmwSP|9IMeP} >zWfet}s#8Xz+=z3u1}%cqTdGfKhwuuh9k+;fJolhj=es!5-g?mXcm-<@T}=B~jrj05 >zvb>ohyj^)!`H1np6Ke!@{J7bw*}a7&+s|~!*Kffod*tsN*so)eX{mK1O7|I`ng?hH >zeITER%{=?C*N!^)CAZvVIo}2H`B^x959}y<c2fmqkaUsDGvJwCmfhm&qt9_av}&qc >zUUHufUGbE=0csb}h<ZI0%If~FS>9hSVqX8D-@t~+BY5epiJbEXw-0p`j&^Rze;a=) >zDx<|rLd(uN>dMBVOi+4ByG#tgh;LK$zKyF>N`!HZTo3aYxO}r=wsfAFy7f+Pndl`2 >zH)YLFcFQl(9alWq92JYqNFeM)PMrr)vE!dF4U@YH<BdZzRakms<kn@y+K^g9%opue >z-Awjm_3kZNxxT%@%-HN%v3q9aYTHF7`MGn=NB$!*&`peI7;#>eqlC??uEcSq;Y5{# >z>6CcZtFZ>QJlO^y>x2Yopj%|AU)l6A_IgHt&s_}1DMr@BNuz-AM$ckzwPPFp{QM9e >z*5gU{=S2HUcE!!(p1`;GCy#lwZ{-bSAd97Jy-^z;QrUt+_@K3;qb%at)O|?XWceLP >zn?UXT_58w4z1_)`kvUJsHP-{#drbG?R*a|hO&?VBN45&MAaF-t11Y?}7&`G#6zih3 >z*Yp{@!XBcaM<<IUxjtG(oT;eGU+pajW%WF8Z`n*thVxm+@uD&(#C)nhq|#$gh)?*Q >zse-k^Cf>hDe@a$kczP$2*@{D^=6?U^^|mMlvn79d6T@W65r?#DohiCeL*R^6By~~; >z(Ss@c6n6Ziy`nxSC9-_0{eZV4;wSixtA(37EUyb|I6bmoLtaZ}u0-^laL=mJ>0s<M >z-5-&c!~UBP`pek-${tw8q)|zevE*n5P?6phpt9^tv8fm9!?)oacoNvW>Q!0cN1_=A >zXr&RA4Oof(jp7Pjowh@o{dQGl1G=@nU3Fnw*%Oljnul5rXIN9H6sgW#7yY@JB1uMm >zg7-WbNq-o|x__7=)m#Cw<1Tbbk(1o7#{06)gdv~O_mFkxurkdrO(vSDVLOSHnX}ie >zYJ179U)Fc4UMx-KmuEjkcVbm_GmojCmUV;dfYl($u<B;lY*0{zrXKE1?TilFwvJ^& >z52q`l9m~{4dhMIOD@MKkJzk9C1Rxd=L(;aXw9k5KXW{B?{iFD#fYJoFAWIHY1Y?OR >z%K-byQzk~iD)3vn&kdNfII_jwqKRxAFNT8a#~hlk(;g8KLm6`VuY4r6P!xDEzanO; >z$MJ(U&kWu~2e8J(+!`gb4vZ&N<a2Ifc8?G%e`{^?EDF{6#qP&y$>*<2B2PL((@MTO >znJLW5i=Vx3GCkgL<x?t)@k$T8ngfZc5`hK7tX*)2+T!p>j6dUVXi3<;z9GBw+_FdN >ziX-cUd{5{~<E6T`i$5Wd8p8yxe_E{n0pK7LnF{HY@8CNm$Wc(-V>M{}dsF=O%g4{J >z7=4Ua38#1+S*Vrkqj?erFA&m3Y2b*Vn+NrBFdh<WBcyxnk0qGCH9MQIh)8G3^k^XE >zT8*lg7J{TQg_nk=k6koks-9L_XKpz)VSeCH|AMDz>vNyddwA>gt{;3b1XgeM5=X37 >zbclYPT%ty&)eV~SyJ5l=r6QU}xHc{m{g5)2;A~mV1PAsxV%IF|oI222_^#qiMWvyX >zY}m<<byTNELRo<GjW-|Xx{m7e(J80EsM@XXAQNY=)NMAKGnvK%(LJH^%wx3d<reS| >zQf1BOr(Qi<*K6UH@J8cL746DfTPb%VZ;y;5t;=DUALxD0vZ4t{$enEXvG#qJTq)MD >z=fu3Yb1^oCjzK>tt?Jv*tGgH<^7k+Fcc_KnmeAtvj%|TxHq`A-M4omv-F?%%AAP1D >zCZ}RPA1o}HDs4pmH>(V-z$u`L5kMVVWwiaz=EVOyo9O>(4=^P~W*u&y5cQ0Apok@G >z%U}Y-k$34RUDZqihmt7l@ojCf@JhDF_TzC6SBACDF(!qwo{#}0{=irNs&Wpd`@MXo >zxs7}k<wxeNNLKb}!bef~CD1K-6I9H+pmt`-bOp$~Z}(T>(4hK12#2iKIQ#=w33E1? >z@fyVyGdT+Hp_>LJhVuQ?68Z%e9EgK$wWtyp=1nA8Acg^3P55*&ylB*9>sc;jMhg3c >z^#Oh>kdMDbC-X^0rCh6f*3${wkLI2q&Y)mNmM{c0tP^;FfNq9<+q>!oy1)LB^nE5+ >z(5XzfCIs@GT0Gi(8J7t-(h*Y<MZ=@anw55NZ^VQUUN?$|tiH|VTeunCTyf_NJ9ypc >zFMihlh{x9bqpNOB*z<9W>UA!~Ah37W5K*{hSlfm*?M`BS0Oz_N2O|j)h3LVl3je7Y >z{!K^z)|@Pkp#J<rYusz#v&^Q6UJ2&gD@%Bs9#}FH_%%D8s84875YfCR((5h3>DZ^? >z)S!1tGvq!Wg76lBj~`Tnt10gloJL>7EHz)Px;^qPDJ`slu&XrcG*)Ij@FvdlP`YPo >zTE(R2n~n^b$a=sRWdiVJFd%eyS;1-_vx7cah=|0ga&SYvg5FSuM1+|Y5rNIYfYu+% >zM2v(rF$EdXi4{TRLOtVqWCFOyshYB=qFO<d<88hyU3^=F>`8RZRprEG1-&EJwoPl{ >zDJAux7hoawfSX0c!p#TZ!05D?QaKD84Hl<h@;Ue+gD6Blklgjfoy<a8=m`hqQ5K|b >zi&=t$pNwj`xSC9rE20B<hHJ}vwirEU=0s3nIy^&tpo9--Js5c$K|XBs$^0xA6$j^G >zGa1z<=jJrtq9BIibptOUg9<_T{Dpi(6riEJVNID+#$W?~eEx9urg;5oCOT7J9_)$* >zGovL0(lVS4Z48?Yt=v)2A+cdr<(7q`1I#Iu2^e_<EpRN_rgx@51E=y1p{xIR)b_5r >z+BAv#8d0~!zsj1-@u0F8?eMZ)D{s8d8o?wb_L2GJiu?atg}+=cN8yI+)j;nnNXan9 >z8~?Kzd+WHd(abtNom%NN@vBy@ADiy$4G0f&=IG(dVBrek*Noq3c+vl?oQi({6L=iJ >zU1WY&nP7bpg15$ugPam<H=t04Pz%B@L5o4uMyinDHY3Aql>|KKMkFniF6G9)&e==8 >zH2El@V)ZkBDy)bYx|Y-yW=TU5-u<;QAdWMpo|l)5CI``tV{=S>RMIXdaAsUXjfy>- >z8FXshGXezQsmyE?b@a=Iy(Kc3b=DknE*N!%PzM5;Yo~B>in<N%kyAP=rWAn>O=2&j >zW+fxfod{B0Tt5*_g7zPGAxXJ;_8qAab)}}xq|MXQ<Wcx#S$aHP$D9$4u@<2^dv+jv >zrPDr~L!ENtdtj22(kr34FtqWT`UD+nJG`~XplFz4s-_zU8GMk6jD$L(6PT;vvnGo1 >z<E+KdZXBlo2Ak84<fSB95qNwY0veGFmRNkF-A1rhgW=k`+vY+y?fE=EgEhFr@YeH$ >zb*0@$boBwuv{-_eH!+~_V1oSWF0%p^vdD{Bb_X0!x5yf>F@0GowjhwYw2JAGItoT2 >zz(z)+h&ln}aS0*9!suyW2u?&S(4Ugon)?64hVT5#7Yimt;IT<Org`Y|-f8`89@UPE >zp;4v}<IdmZh{058lfB@K?vG(pKWAX<Thf|&-&N4Kz2@8NlbeR4{<qJ`3HdA9-WSoV >z+IY_(Io81NYO5ppGeu>aYO1_&_4|>x)0NGy=1w!BNH4<h_;5us8pDJuh<+TK`T@5g >z3I=_lNfjmAjo+<@5dxU04PmU8#EFV-kZ%z>rhQjJ3b@j&x%hE!OcH{q=&%Y@q%OF4 >z9yT&^))yROaxJIG*c@6fIgT&tfP}6Talh$?hHH_*)v#)*NicX~^5P7*HXGK6jh|o^ >z;}#@2li<b7tI6y&=)3NvIe9=8?GVJR-j+@He14ASYr^m6T9A+HEllvlIQs%tHd3r4 >z9_`CdYL>X%#H)A0k?XcE!O?fYL-gd&I$zl>EjDEf9ffgWHC>0VTgh^Nt`GicZOuR+ >zy`~Ag;KGjdU%jq@e$?g4__XRCk^0KU&lR<Os|Rww?Y#*%o4RNA8W&Gp3My6z!i48y >zLI)2Not0O`d+deR7*{s>f<BpAq=M#Nrml>=n&_eM(xw08y!_o(|82~7+Wm{$_w7Fj >zswY(qf(|aNZe8xdwM|KS1C}@J06`a)SR+9_zSOH6j@n6jpQkOk<R<?VN8J$%$VgK3 >z<H#_(-)p0Pe*1s!!f(&vZ^JQ4XJoLm9Fl(K?mdY!7c0tvhoW8Yq<N!3g-N)-%pJ~y >zanYcU;mde@?`pAU@33HJECc`cGX}8{mK*Ge_C21AE8Vt+RTc`Iyi+3gH7nz7g|2K3 >z4AgZb|Cc`e#l1POls3({J-c)Ahv57TDcg^LD&#Enn8NNgn+uc!I<OGK5O};Yp>^Tz >zbYqd0<4soqS(AWA!%nw)+G5vj6O5GJJdl^r?`bxAd$DIYS~%i!LBcyhJMMb>psk34 >zEqNOCZ5E~Y$&d&?O_Zm|gY0(x2nP3+mu<L0CO_)fvqwPe;Xq8fp_H)}t)}ROPhWoA >zH+i}C#qz}<<5c=9YVt-wyD4C|&asjGyM4BP<}fF1$@}9)!rz1aUn~$#-b>jIO}WXB >z9eEy)mwTif>S&|dGEiYmMRCZuh;0Q!OqTMyfM>=(ALORs&?Cr|oTj(6m&kJVOqr)+ >zIFCg0HO{qkJYc5n)}9#cW2$nu%E)?Jn7wn^*wcpZGH}s@oTn;-HKj%W^aq@CBh77b >zT|wTiE|jYGhxE3ey<@i547jUz&OMvAE&3R-;$BVLt=2zJ-a95Xv+Fx^&_CfC`^M0h >zDb}uS7-v*&Bkr2khS;R9m@A<7_cPjhmY&qzHT`<zflYGArc_I=@LXo4@`v^D-Li43 >zt*^Ga2Htr^wpq~@gC8ThB-~ib@y-l3``DNSB||dCF__nw%|+*s)GR4^?a95m(}vTY >z!BOciC$*SDho^LuG?lW-OoyMxJI@;vjkF>gh=)3wnNhA}^U3{72Aq3W-O241+*a?? >zHT(!Fzj%4~CcO#kxR&YdaPz$fq{iBK?mF1q__-^m%T;qg8*@2JVWa6<rFraXEOTqr >zlP7M*+SsvJyU&HMGs|s~fousN-SgL%u6XjXCr7`9GRRZJ2NwBO(N`=57<_QB+loD( >z_`r08W9)Hg72nlrs-#2V7S6JbitN?N&dHM39?=<3+@7C?k*#>0BsC8i<mN$*hDANa >zev~pd+G?ESEOSV_G~D>A`mOP^ycrw&??2Mirbkf2sD(;~Cl75WWycig4~2(q&IBnL >z(eZ&>mQC}Uw?;LlRLpm;%2h_z1Q(t*d>?YHi$VPdok`(VBOyz%vdx699$AgwX{0fY >zb1~p&59CW$c*x{x${kpuE;{Qj%*sHQ0<M)2M$334bdoQohn_UOcfYlI(PLwJ`iz9^ >zNb<$_4CqsLv8!XGFG{P<P1E0)x#-gqs5+ron|1d`ZQkMMYCnNJ%e+3-y<YQbWAB&6 >z3x?7b86ZZ&?_o}o%7zS{B%?8ojyE~x<E8aL^($lUXFrT@WC}0-<c|IHjW@n^#l1>Y >z(@I#USEo<?a?5$`=<=?^*z_lFBOUHOh(5}ix-h(Wbxik^-Pir9;Ji<9qB8ZVUs=n? >z%ukp2<0gq%LylVd;gX2fi=G+|;}3a9zp35KcU=xNl{U`^dvsnz_rT?f|J|dy+?Tz# >z1M2&hhNmu_7ZK4X8++2`Y0S8q^ow&B`BqNY?=@bzKH2E`Gp%;8bj5Qe&{O=x7h&64 >zgV*1qGc_lC49O_`aL)9z`&eh@bA}wk#?&1qQA$^@$>KQAlI?KPNGh*#byMu|PmAjG >zUa7r*WuL>aym|VwfqY9@>dl8&EYKsTY@z~YT35TbO?$n3!wQit;K`mw{pc8W9kw&K >z-r;Z|IgpVKzqu5zm$*4G^QYxJXE~v0(r__y1p4ldY|TW6#AyU=^gP;2pJLM~gc1dw >zU;#E|-lr!~*W|uPS?1<!c1U~M(dYT`o9l(Wu*8UP(^N+ln9S+d>DSo_Nf*<(7C+<^ >zJg^oV&{TE$lF2Po{<H)xpnEpQ+Hv8eyyng4FW#GlpY4#Uukg~gZJGDiy*BsoR8GO% >zH&XRe7Cejgp1e1NoDH28&QNQ!a0`0zoL~tJNSUUOS5Z3dh`blQ)9w{Z8RTV`noh@E >zxl5ey-LD<L_!W-4mRf;>w<~RDM9BLs<YxzoLsPhUr&})vf0C_>uu;!CEPntFdcP!A >z+d9fJikjW;pI-eCFu8HJ+B+dtJkc^*plV*5O=Y-t_FT*0EV&fvi*fGoCfn}!(2j7a >zdT#*OecCGXqm!!xt3V4s8x9LSi<cdm*-~T*{i6f_Ou&6}XrlooX$H|Uq8~U?(++=Y >zY>Z6YS}Bad)O-;hfy7QHzNt`{0cMB#PlFC++qv$DWF1iiN0Ib24ds1Dnv*n_>hswQ >zbKa<5|AH@KXrIq6fi#)>%)PDWW;^F)=4X3uP~)u678Aa}XG=xcF=2Jtu>90H|7sV5 >z4(wd{h|vRS41I!g$HCz1Qu3$irF%haVhF0N_Aas8o<L7R@u4D(I^!4Xrz(3v9I(T| >z0Oawe@M%OCpo58kuEp}rLYh!QbQ*J-J1kGt+V#KsWmb_Ect=800+95e3&jIE8Tv4M >zXck%ne@BU~jZnlTa%igb;^9p4EO0P2LL$*8Dn^6J2?<`D2JSW~Aoh!hXu1e#-q#_} >zaEsVWA>_8^DrCzl1*HIT$UKoKQAQ>ShZY4ODNMja1owF(I`C&LP}#t^0vu7_1okih >z9fDRy!ZHqCpz3dLvxt-{&CM=v;zPNgqHinkoOU8t0;F5_PCq);mfK7&iyqs7wJxY! >zGXN%5;2~2vav!-2E1FvL1w`*>N760$&IuMAZAAb;UO>*5wdcV`%YCoIa8w8!&W{6j >zB+kqQ>j2*KQGz4F1McnPLKl7(aqxyUd`$>!h@~PY!Dg=isHE%dY$3ZAF1qO{Dni_P >zbt^77fh*QlpUX)X0QQ=)&`{iD5kHmj`WXxi`c$(muE5g<4qFyj_hh)Y_u>Jtw*~-; >zFpNV7G#k8z90@#V-Me3SeXpuy)w9?@Pq#*ku0>>pCmint{Dh>45qN2uL=a}Z-J43U >zlTe-Y(vpfWYlN2q#19(;i(WO(F62bDnuJZAB}w($W+jhVODu%qW`HIro{C`Y!A5oO >z0tsK&{KAFZ!dM}(STSoDIVjFAhoBV7A6uGK@z}RfY0_%KQ`hPkng-sSCqZ+tAFaOV >zbfr{b-ZqPLx~f+QB~p2bQHBCbcseKzr0t(T|7&jl7wD6t3-xqpEUe$$!6q!r+S@)2 >z^Du71y85vNd<PFQ)$_s<^O=pEf~ldlC>aO~&YKh=CJIu?lg;1_k5-@{SEP_VpG6RO >zQTFtLhAx_$420Wx5Mh{8B9K|0In4}9E5aSV08}{h7WI-_Ly=vHzKUq+I!0TxxvDo) >zsOS<Wu$kR%&F1|j%F&8G2eE>q`t$|!ytv_9au<n1`}3|>_FgO>BXKw+H}-%loYt?2 >z_o{NnLYH+#s&peZFP6coji5Aj%=S40e|!LvYzz__reaA&aT}`jxt)cF?ar&JaI^v( >z26~Rv$t?@o&-|g!&DJCnJ^c@Ed^>d7k$27pHl4=rJI>|a&2o(IBVy1fC}bi4oCE}% >z;?BBxwv;5$8_c<&ePFe+Z5ldOMF>D5R3IS95`C<QL6?8nBVb2ENEQW!nk&FbWl^Mn >zGY299r^@Oq0FCn&2Y@5*&-bS*nwtWzZG1C$j8LcA<|J2J#Y-}yJHvz`mKDjC51A7Q >zEDPGr*OsgMWzj_f3dQ=Xrc2MuLJA6utm8ib{j|xD!?`Fa2bD&Vvmj(Q1sK^dvE~$< >zM=^2NS3=uR+t(IKx%UrX>xI+zBfO&l;GX`C*TT_cXBz?FFmX?ZO;-9R0Bq%1XC>Vz >zIJ@+ixN9A5c=oSo_?LX^F*FQMAUJLi=0{|P$OT%MbG_f_(@^Mqn@{!PhGge_vuS9P >zl@&jGS3HEDT%|(^T7tWh{|gsciX6}}8AU_|$HXhxLBDEQ<j~S4^yQBUk~w~QmW6P6 >zw=g3mAh%@^q0xkVaGj;iP{mH>vlaTLbfOV|8uhuGhFlg;#UF}I8L6v>v~{-iO!hgS >zZed`*J<zgrN!9TO?ymdG;o<<YNQ~RNL-Q;pIue$fV?s#Mg%QUto-tm>TVY<|C@65A >z4x$i(K#WZ1R1bxX7!xl;WYJK9(gzVbsLJtcq;?Cgq&B&Cq~bb~yG|e{tGx9E0Q9rT >z-PrCGx^)BAcXTA+8Jinx2S4W^Nrkkb(loAV=E{!nVX7`UZ#45we~9@@N-I4H+Zg1E >z)WAY00Eh?B-0lx%3Ex;tX4qe)pGQdyBXGbSn01PxAp+j8*LW9b7CM$%!T12wZaZhu >z$yae-Z6TI1!0rt=pK!P2llZYWz+w_ZD*!Ayn=6gQ0NOy?X_KGbTlA(n+u_16W~bH8 >z(DG8cZHHB-7Py11==*OxAQ<W%H!Z%-9JBVhjd!UR%r|em4FF$llYyi6tnqYqXkQ-0 >zzcBZ&H=y?lGCKPXTd#F3bd-tSi?Xy3UYzlo@a#bz0ug!NKY_O_11~Em`|}?Ar4#v6 >z%eW@~flo`9KpOq|7@T)Nh9aE_Q=}C34xiwQTEjUSX|EwMV-6BnN&spD6a`9j;3ncH >z5y<+E0&0I2qAdb`e@Lu$I7DTp67=+&Ln;jdTbyYEXKtNiJ_td_w?jiaix2cIuNjAs >zEh<UNJd3!Ku7@}g(Znykab|uebP09ggc(R<6kIYE-$_$ECfCLt6v&%=z<Z_o1F%u< >z`}2op-dku4*zPR&HUSfhWkYwDXr>bGDDG8R)S8VKw$0$0ts~#TAl4itq+$W6ZBT?v >z(1jzxDP6jLT0aF^Rkyt3Z^<WMEGN3XwoR`}z(K>Pm;?Egch)caJ+&w>d$;te<SMh_ >z1Skrq!O9=#!ob!bfDn?zuo%Ol(qtjO_i}Dqac7&~?G79lrNYjMwONaA=G)d0dAYbV >zX%`AeuSdSaJmn+YG6R6QO6hbaa+S+oX%&HrRY7U5V~%*iRk#-xXuOm@*r{R&mtYYy >zuM=L$ap=(crFNHgeDvGsw>Ez7Ok9tOsN9`F-Pj*`Q}7OPzK<w?2!m=WAP!0}JDQ!q >zgJVg2JPhcKRh-K3k386FU>vguXI1&p8_SyD_hZtk&^9CnCNStxZ6*+V1q2`%A{7&Q >zZBASbEr<{I%==M$rK+kxlry=zvWyZmst(K1r-nHS-+&<dZvp(x1+>wK6~Wne=Z(eb >zPNAH$0ir7m2r4Ikjel0_&%fjll1`5#IiTqKMCDpmO>L?o&18)nK(oB6{E1L=ZydX0 >z(AW9xyEH|U=}m`n=SO{7pH#o!$TIC|HS$n-WVJY8J+xXVifzf=MO>)*I4xyf<?t^5 >z(cb&fo4amR!D~!R*;Ny=4|ogT6&SsmGG8P5m98rEn-1B8?^#&!wVD80KFPr*2JG0x >zgXfPk(^=|<pf6sj%cgEumfm^MDw#0d*7lvP_zem;vKgnQ9Gg*d{c0lUS!ELvUI4Hf >z%rYei-qBrK!DiY<i@l!t*fjR>{h_bMEho75Xre|aum~9DjKbd@tXir%hIQD*UU3a& >z1uDMZq#YX(@%ZF%sHNikgg1dhns@>Lo)v!R7T9^k>y{1|c87#dBm;*v7g+LVpyr|x >z{QmD>T#t{43H|5D{cG;`U>8Q^e{buuiM{v0f({$NosS^p|AC1ua0`NGJ=P)+wst~f >zRh#<7jo^H-?Hv?trx)3a;CS!!Y=qyqwcqShtjM{*NmcV)@zW|Eko0U9CRb@!>6nUf >z+QwP&-U<HN*K=df@dw{}niCoa-fIoGuX#d)Ywk?%Tj{-T>nBkeKgWFKK3llyT~CVl >z!_VE=&R!U%Z2xigBxn>Oi-?><5pDP+a4&pZjGhzL1x!;x)n(~-^|E6uK*brOfcWXf >zK|)3Z1tUQLP6lu!Bjz+g=({VQLEHFMsah*ijdpDjcQiSf;9MAOy2v6M<{*oTrk7RN >zrTYOlug(@8bT6q>7n}_c8dyh3Dsz##4Y|#?ul0lW@{t#)usg#9xME#N*nal5%&tb+ >z%B<C8xGJWQE7OomHZjv{&y^fb_xMATo~S#8;Z*og?U0O`7uf<E2{n@WI1UnMeE<>} >z8UpQ_Y%k>gxsE5IsUwvj&PU;NMG6**kF+hR`U&iFe%<lWUDI^&&DR!N-~iA^l%j*z >zhx3tha-fb%2}TPvbkXgaJ6eP1w`FI}Fh_FnHecMtva7yyeR^}t@6#nhBs%h`ipBHU >zg?!UWCvc{Hn2|x{q!^Px2^daJ(9nL19+gBimvM3epk0pyHxD@Rj*+RtX1LCP3_fy- >z$YcTIq{lAD*4a<y!LT;YmK(2(&aeT%7q=TdSOV8_q=N;AI->H{tcy>{n&72-OMbMd >zBfjiv2LvnlBeDM$ewm8KJfsD_bJle6CFpuKV^ta<#*>8?Qgn(>>ad+;x7R13QE;^r >zyQ$j6)nuwu7~Y;@T6)s!{As8fBql@T-0fJjWJ;{4WX8hKw*AywkBA1w3(+EJMHC{^ >z!#WF?bGH+;?g=Hl_LMiGyZpL|V*Taj%h3KlwtHzM*pIZR&Fi6(a+KEv&t2Mn(kCJd >zC3}C2BoHVVA}4W&gM<WBH$Smr=+N13BBewHi#G?M#7MrKpenw7>#KSv-8x%iAsxdT >z04P<#^BACfgu^i>l{f}%hKmKWQIRp-EpuO(-Lfeo!@m)+NNt>~_EZor>PbMg$H!r- >zqnqDwJyCOmH`SFSeHgujrHH@$FQu{aBM~IF$V}sHTbPPs#DrHs8EU5<XhXu_x$6QT >z?rvD^>~G3^IPKGbekGdGRv3wbI5o=~pC?6%ogN+fw!>7`+RBl%7SeB-zL8Cn8H65> >zJDL_%-Gv1T0SDvz>8A9#o2Hf(&DzAR=BCzZyNj)(xgW9x>BfYf&wg)|7cs41u6>`p >ze9)q=ymO(2E<QTqJ7K?fe7G=I)YNL@pw$#X`~X^lK|6^%j4V6gYy!PH^gC>nn8p<4 >z2cwdNp4Y4$6k|t1ho&XBtU5z?nBROZ1W~a2rFNthICPujimKkItEO!ZHvTywYNmPH >z>{fcXQaFQ|V9&T>X+sM)yTEMSe?tv$d=M1cX#60GKA0w4j7>~@7h|a>S6|lG%~yi9 >z!sX&W!`W)1x*2KcbMr{T@s}ram^6~k|FSMNoj94m?FuVUB5au8yui*kSQu9@qq0$* >zd4mD6u-*r4)c1Xe8Lz{~?~9_FKnQ?}oTyq%%mDezOopeXV~7Rq>3VHa=1k*du`i## >zo4B%puL3|9)dtCog5j~I(5SH&6=;C5<QiQ5v$kI7Zc=BTSBwHBRROaYy*~RQ6Yf3U >zVhq&py`TnNn#bSat!~jrlIV63Z>dA!FcMC@>_uW$brrLvgrFH~5$1TJYJesme*{YP >zSYRlFK01zA_%qh4`6413rw}wQ_L&)!CNOUSP^1j;gJ>*4gXHJwY>Un#@R87o!={!5 >zpF5$ut=l1*_GRgJk3O!5EeFcM6i((6w8Fv8BMxjJ!Co!bw#i7M2<><pIw(PD38_pr >zgUYOYbh@-|K(e<;07{9!Wf>l4EpvOl0`y2QAlJha&6ObsWNys?6)fDvRv;=u$B;+b >zqGyXzNWh_x2B*_b76pVxw2j?dpgDWqZWalP#uw2cx_Sd$jWBFzyc}F9)(m)rdUamE >zdrd;0>Nn#L_M{-hb3R2E$Q;ykX9u5Jg&|o|zmnWzWa&fo(szuHGU<hS;{+$DyO`Df >zJ5+wDFcTqoM&7BXMLxpnDih}CWbyCTUBim1q3y)BCri)A!si@s@CuQS6a3B~D0ZU! >zjRtkZz7C$sF(qFEiRa1gXn~_2Y!1%u`L*QUrzXcM9So#Y;AXlasx8vEKwm=gYSi0s >zx`qW~>bQ6y0Q3WtpebRIOO#{b6!oC)>5l7N%BUg=h#oFLg3ztOl=%GbxxnV>7P)ye >zv&(EWjjt!XYm+3l4uqy6IA*Ia36Tn0cX_j`==kf;)59^;NNmTDU^eoD@jk)E!e#L` >z$q_Mi+qYvu8?w*3T&f(?y3WgLY{Eg@fUYX!eiLE8a_iW_Tfh@JzYTpmq~k8$sG^dm >zRga6052Jj`9a85$rQQnUDSr2ECJerF3#1S#95oyY3*azSfGfZfT?D{y<<<v%)rGf3 >zM6IGCy5RO78l?>MEbie3p^eLNme0YFk=tEAIj#dLwri%S`2EytIN$y0*Rz=8s;Y4~ >z1uYR{s^QoJJ3J#a4liL+ZCVjxsmSr^z~t8T&SC*gV_uz2KaE58KiDU!th^XgS{z=l >z@DLf^Vak+k-hP1-IP&YX1glw)wc0w8Me~D0Q&j|t<b$EWY5_s{v4&=K+o>lYg?r{& >z|04{32@8|Dhz#PlbE~lo_TdrfIpg`|(owHN4G=+>zI1Auf1mZ#4B$K~!@BkEBz8o9 >zC~EFgRLltC{!sx1h&NOQ?|J+reLS>#NrZxMbizxKnXQF#_hdI)OXuV$HmA~QTD|Fo >z^y}KS$Kl)1AKp(dX1+>`2~vxyrIi{U&rf?#!|-J-BwnlhVGS%x+nO{ao&w73;T=Vw >z>8}Z?25??4REX4c$~e$Mfw?|}4pNKO-$J-e2y_k`oZ*5)j`6c_L<g@E5{0wF*sCVu >z<~c0-Ny)v^tGYk3ADVscf&`mzpq3iKzBcIs`L}mJG{O|dy5`cY=u~l_i9!Hp_szYB >zRYh#o1S01~b_h&_SCY!i!qNhX;Q-epR$Ixf*(@yh4yc7h=z!q0SSy(OS?70Ql^46? >zK!L%bW_f5@XPc1voYnA=FBFNUJW`@#V5%l_JhafMI!cD#!4lET5vXH{0htC@0|#mi >zyi!}};5bLaYPTQ0sSiSr-0hyS62+f5JN3Ps(=Ind1d_&QR+9<(U(2J46c=DsrVyf& >zt`eoyn7AP`byCQbg3m9gjw`rrFUhm?8fZcsTP%|K@2tJczl1|l9x_#P4il`UAWPMJ >zTWVCGC&G>h!?|lp*lK23LAoBCD%&#nuG!K03lIkr>yeM*&6%$XBUL@EfTI-hFnJ}w >zd1IktqSdxiM?~Af%Uaz+>FaBk0jbW2jL{1c|09k7;Fq~#Dgnz7iPDoGdgZWb5?d6B >z*ztP#hc*>7&TEXy(~0p~t~PDX#!f5B45c-OSFV0S;jHK=TWS{>BJPk~`gBbFpno7D >ziH5Yg#F{N7r+>>sZ7_#6%!-Dm&$UjK^zJE%eRfsMy>Rs%%6XYt1A~Ek<;^n6mK^CU >zhiuCzb-ln(=xlV_`IIdVPhiKZcQ$?s%I{f}vMFinIp;qvlaucwLFyrW0q+eT=+#s| >z*)AA%+WASP%gOE#*DbcZ2NhmiE-Y;kY4>uhRER!K%vLJOTCweTpE;tYBvI3XkzdH} >z$)IzNJv)Lw;UlBJAK}!AlObN<9s_GiL>fADcLcZTTlBe`Q-Y|$4cC9dk2ulaEYu%# >zt@Hxt`iU@m=1}kh^O{7-L9RW1m>RV&n=n-Rpk>jmYn(DEx0RJenB#%25&&pSyJA|^ >z+8lV?pFQhyyKEiLpY&KTN-4@!NIdh9e7sq^Je&370AGW$t{Tl~?Q1jD^hhgUcdXD; >zrw?n$$*#wmZXQ*Cw56x4ICURv5e&OCnXs)tvLmT7;crP68))$%?Xv+*mN{0O39Y~1 >zf!8B1>+~<y=}QRpxfeOIJtOfabgA^z=UyHg6{gR^>3`&P#<w>zHf8pl>v_L)vL~;? >zj?N|Fi?02Ey>18Vlz7ZzncLM%Tn3v;4sP}$%Ry&V&LJ@8ued%;CHrEt+i{8@yP|nU >z%`sH@4T_|b?V_@?`{Hq{ZpX6^JPjhR08Y9!P(ObvF+U2{rGtn4tYCZk!fI<awS@Tu >zXc7d0svHgKc@-omN<l5l2x<lC3a&TuVboVjwoSCWL&I=82maNIsyJ$J;RDEThD8&I >zVl;24pJMmBR#(Gke|G<*uij_-$Y&%1^tMqX_jbE}h5>{Vuhxx&%TG!H2VdUZiiH)a >z2Un#YiEKn^w|LA5ZauwyJ{p`%r$LIzU{_b)9seQ@9gD?TR_%rDp~rytrt}W^3Qpq( >zphvas2kJ!J2LkA^WRD5Pw?h!wdj_=NQiIivKBna8ZwK0<#4HP{?0%{s@F!|-R6wFS >zpfM%B9!%F+L<170j>JUrW|J`g+-g<LRC@EFcCw+uYPIgYYh3sH`&7H24U+~Q%U~uG >z+z|)?^{GH6kp^~al}g?Ws-tje@TEv`DW@_<3(|!xA~WP8L9MIO1%q1>OdC51nHtdr >z1>fFG35=uz2Ooa)$lL1$5CTv;;J0ydGNF3MhD1BYRP-}yF233kM3D6bj~Qk!Z&+32 >z-SWB)F1(Q8m5$Zsa;zH@bXLfOBvq{p&w=C{)P}6@-9NR>5T~|Sz*D)`8dK!V$pP`7 >zxJa-S1&*%&W-eBmC%Xzf>}Iy4SJ^iF;u`i{o_7Ho2}E2UJS@d+uAl(59>}ax1p%-u >zCLmHt#u0n_vcxIgyyvVnX}JV3*GwV9G6ss(;vx(a4PN2mKF7~YbR?+_N$9p!X0=Ew >z?I??ghzN22t-|TwXx`j;7YRbk29kj2-IGgTP}+QJ8_;g+8-x8R{x}pk8fEVO2kifr >z`L#D?CJ$$uoG!rov#zX@7Wq@|;MjU*AuENWmn>Xq(5j<y=O5g`v;>e#$O|P<wRMp9 >zrXKHO37_-w={=#Jv#>0CB^7Px<MQ?tBOBwnq7h}u#Z@@X8SJfmwl`W=%}+VaVK0xC >zoLG|HqkJhVq-~|#A5UjJhxHnj6c$t}?Ss8|p&HE3_Pw!>{5(g><xb@{i|n=0;j}V& >z*J$8k_jHH~h&>Qt$N0Aek9V3Qz}X{1yrTq}C9a!api^PapqlX7(PSSx*_3$Mz-2xG >zLj@LX1kG_-40v4V*!mP8OAez7;frX)YAc#u?0i`T0I^=6u;@<R<QaG7fbD|@HJxqB >z@yf1T1z9hM5g|B(c39fbqILfj(A3xk=jjrN^k@S94oH_XJ`?A>57{Ud8CNtLKOeUq >zHoM6|0vQBd#&SF{bS@Gd5P;Oc?}i?L9VtYBIQopIHbr8_k2$_=o;fRszp%5eQI+{q >z(*%Xv;V?$}4u+IKcPiB5i2lXWcfsQt@dfTcdMNh~(Dm2sjchp6#3i)u1*|e0RTMn> >zK9wNphuUwqD%yGF`qT#A)Y?TT=jc+ReP1>M9K4_AqB02G^h&^1zC)6CF5~gYU(y72 >zM9Yi;H?szKVaK~!e8;<4(F<Gt&=O5njyK)a%qe&k(7cG%HjZ_evy2dFWBLu1!j2~V >z3;=u}#fu!8a~{@g=yQ>so1IxDHqy^_ynLS&3hcgl?(^02)2ytrC^D2Y%qjG582iWV >z3?5Bq1Lwqp{}BU5RRQksLL3xHOGe6xBKh^N6OCrAk(?6s+XdmLKNs&;d5zGKo}qz; >zIJuu;dtMBs{WhvR$jzaGiEf{Ec!FecNQ!=N7eP--n7s_Tl)%Bn@!SSQ40t~GNMC^u >z3tBxFGnppQy+s$+1DmQ~&;<(op<&*9Z^6uwn}Qv-iDe_FSp}Tz0?GuX8Ssa@`QREp >zMhYC4vSU-<;<wwki<jgA?U^c&@5oFdHMlLBJ&Pg`t$q$|aa4<#Dh_>yD;TV>KL2vO >z8p;J$egZQA<<{F{{QZ*LoSWIZD)lHh1cx5m^-S)bHnU{{`VPu$_h=~VoMmZ~eJS6y >z<}@QDV2^Gtwtn<X#S_sqAcX;5R6CLj^<b2o@qk4;K5i58Irixz*!j-*<CTUN$LgcI >zYYGb0N9>?`+i?Bir_z!33EpESa10e0DP&Jg`<VmI!{q(w!z<u!l=OR#8zoji-zo51 >znnR*ny{l6g1PjtQ-itcGFe~nC&RL9(0Azy6KU)`kf=!H8$BzAC8zksVHV9yt1m<31 >zCtLs6iaK86XacvQ0*<$$6n<?*c|`+2?IYT|x85;jLpRp4J?C=c>}=D|YqaYhnv+G4 >zL~7E>Dn<}IVx2oZAzj*;0WXKl?ot))kwm<u#4T0(ejHX(Gy3pDy6z9Be{&pM4&GOl >zmk+Lf-beD`lK}?+{7^=3-T1CsE8xNp?s1ClS&cPw%l`vif6E*lD{}J-u!5TeLPg&s >zf-+)=%As?y38wQs^Ay5og&RU7)dyGqSq`x}0ZODjeQ*5OR4z%$d7boMlMAFQO}{-c >zjxu<7@dEBBVdC2tAB*0PEr}T0dbOSwwZ{!l-%m=MdlvciU~pL+!7TqsNPa*je-y7A >zm#b}e4gX2*W=S6lf<y{qR3w;?(r|0_URT6WJEDHjPka$vT>?Oz4lC-w2Z-)Fr&-O- >z?LZ@l*7_!{nV{N$OYwDdDVjVh$KNU4jp~~3a->$8(Jx}Aciq-qnyhc8kE4CWliLH( >zWQIL|*YN&QD9{&rCE8im{4N<wH6Zoy0|<`S&_RrVX-%^hoeHRug*eHraY`Z^IS)F9 >zzM8&TRq<88H(`!3RD&TwrcrS5yp3;(i*I>L7U{XjdMTq51hF5;_T$x&&LSMud2llL >z<7|9t$k;>uwCM0no9T3#8gmQU{HK6#meqTC`mMkw<;<?n+XAYDqw(Tb{A}qCnMD`L >zVBijI<(2w7HLR&uUVJjj-Zz$1m-{T*1&NlzGFr!jfN7rU?R}+Sw)S~1?8G-i32?_( >zC$2MSFLmY;C^^;9WyVM@s-`BEa*n+_3RFZYPTUPstBZs*C6V_K0c|>Xl!|JXP7F|c >zC-fKdkK97jZ2}m#>RC`lt>DTen(|d1Lzs(z;Af^6B%p#EApu44MmP!1;JYX5<+KlH >zsW`JGe}YEp{}6ty8kl!Sunn|}c@xxR-IZuz3DjZz%l}tn=N;Enu<iSVgd|8wK#(d4 >zO_5%tDZPm_>0PRbAl(K?2~B#FF46@dfFM#7DWQoJK@pUqGz9@sLX#qpH|Rb0bIyI| >zp7;2JPYBt2_MTaL*34SJ_05OM=*r`rVGW)b{g$Pr6CL>0dk>c$&Y&v8n>ds8p5%F* >z2suh&!N82bj*Z~L!FoDLXc0<O@@10>EHuyePS#__Rl)e{l)5k=ngu0&S@Q5>4sf7t >zpa<S=pIaOFoXvJvH<$@n-r)jK5LVH-8Z;P&_~wfuA`GVG^ffQcmrHbvq@33Ho4Evc >z(v;T2)@MH+nBVzf->{Js@}_yp4fxEHV32R~g3T3}%B(5i=B6<`WVoPCi)n?4O?BUL >zTkmlJ19&fRZbv!pM=*7~G71-nix7p=3(ikt1x+pT+b62%ullflkuLxqI7XR-or{3@ >zu~6?H5eMXHU`4tp7|9)_HjVe@qFc-$B$+0S{3<`4VwE4`S8i2Sc9G%2RQREwfud;1 >z`(I+EdhJ>J;3jL_@xkE6HThs?@?%>S5!0c|HcHz)<q~$9BWtP4aZxjDyhJr{yLkek >z@D{7K%+T*4Kgqc*uC;dL1%Jw<3#7oyTOc|0@_lfFY#=XOoTMTG7Z+SMz3pi+Y)t4t >zffYmX3@tdp!=u=p!O?O~wh36&IgDsJ=#s(5lj=>}RNC6@k=jum20PlZ`--s&7rtyc >z5yeXDR6v5XP3eV+OeRBCliv^pqy{{!B{L+Y_1~L}u$jmp;<@TA?dGGzS2H+!vd2)l >z0m@3rwMLEejm9~@K;BG4VWVgzGsU0fBJR-`h%5{m^?>HQD9C{QYP@w3``6fVf(Fm1 >zCnh8Tzx9C<a?+^U@xif><x`X^-Z>z@8m8JjdN5KY38}a&R)+3c{I7%l9{Ml8|0L5b >zbzpfOF6`}HR5Ni}q3yC?IdsjTU9Pilm2@GlP=U1O@!X>oo7zY+Q)m=)VFso=ev+<Q >zN8d$+x)6e&AMg5XSCM#8D&ozl_KW>h54$$5SRj4Gg#AZbT2^MFPou`aE6=g@ap{Dh >z?%(7H4#Rn>S$_p$3iR1$t5q!?8{zg|BkB`Ej|3cHDV{=}!^3qQ;c?nx*5$@guMBtJ >zmxuPGms~S)u>5%VfxM7+(TeEP>ax&@ph)<xin=I$hkVY*=fz)HR^b4vUYj2s6HBwX >zn|KJ~6WTCW{5;gp4*yJ+q%MDJ=BfB|L1E>ycIF9`NwTENVD9^DZ$-O$JZ9`mxJr5c >zJmyu<F+2B<tgSUo1JxS8Zbs!!Ew9d5<oOVc-qAm9l=6+(eB%?>ev)6CLdDh#bmZ>) >zxB;(B3)ir$3s<f&mD5g4`(G?ArPFc@8*k=F9wKiYBxESHl#j7h&FS3#RWmw|V6*B5 >zj*0!9PtJ{&pA8*6<HEI?hv!I4&Eew1T=XqEBaat;O*_fqqrEcR%j%zV)ntJ&KG*mx >zG3Pr+m8T=z>g86|V7sqvVV5DZMtoyd4d3PWA%BK+f3^3|i`<ukpX3=Mo7W7*3;pVB >zb<cIwXeyrYuBO9DGvZsKlBhd&Z10dK7DaN}yYl}W30AUg;Dzj+2QA1`OUu;eN50Q; >z2y9|ClkN_zsM)D-3`5ji_e|n_L<QAt;3m{tMgEPgc@|XRd4;D{jaWWW+RwO3ua#$~ >zpSZV#3hngC2^92{a-0=Vui?u*kCUHYHq7<l9>YsNP8<wdAJXS=xjR1YRS@&4M2AoO >zDfXr`-^0oF9;sSqQr(vPPbX$ox9qcpDyqg>O=e7|q3ws;2C>0;4ooAtEE2}UL@gvk >zj^!(v(E%_CfQ-q0v^>W#uya~!pn048R$l4A0fk_hF=pKLiv$zk(Hv$~#z}#~fZZDi >zj-lL^Yvg&s5*vm5Mf3pAcz%b;UJ47QJ;D`l&cO$V@&{rlFv*w*y!}}|bUHe!^XVdg >z`d#_+Eo4?n@@`{z{026BlZe><lf46{p;CpYLP+=IAv+acRs~>RIu8BqMngJ#4HI8e >zK#)7Q{XjG&q&!dryHebCsh@S*YWRjcMQ9jg9~Kd|CXhs^zT_f@yf};byG=h{u?IF2 >zh@L(RqjHAoX_aKKDNs7v!pzx)Qdvl&TMh+9O-KD+<NX5p(9OKe0$2f8llB*A@`gOE >zD&{`4NLkqo8By=1SerEbn2N$c1q)Yzi<TRJoF3j@4I86)4Wr2W!|ci7x191%P$CCr >zluD5xFHe3VXle}%?bl1mtMxT|IGdw%0UuBfkf%{RukhQCKfw0P{J?bO?Z-l8a*Y$k >zeen*yCy$p3ih9l^U|^H+A>?AnA6wd={7IMg!RvUnCYDT=!240}+Ae6Wo>XAGxY(tz >zKcqdhi9$J{$>fJbe?bDid+coH+Vr0T|IM#Ip)xCDiW7S<niXzMI=&(ZaXdGyj?)t& >z0qt8#fYrFyGzQS&28HH=?4_Ba0~e3c9;YlMT0X8D*K9BzKK9YP>hU#cmW`^X+=$Ys >zTjfzNMs6e&RL%De=E~ho&5=5Ps{!_`@zk3HuJ{J0jm!&tKY!h@dieb^+e9OS%W<4g >zY4cn+({^}L)k7yMSUmUOXNyIiO;vrbktNcT1_pKuFfR6gO{@W!7>Kt3w+nnWu&Sg( >z*k;h05GHCMsjJ?egO`A1*4Vn7a7+F0r1;9_OzIkr1s&sbv=Yw)D}9jofzN~~aUQ}P >z3vp<47$ZHCzu_%wsqh^|l-dsx5>7Eg!;p5k!$oC<j7$4WVBDN0??!Ijn2)*l@FQpu >zD0j%3N&AW@Ms3mJd3%!5MvMWvKfHa#{D(SJ364`{aC~}{^fOwn)HYv9H#J<J_aI;g >zU@({xWR(J$PB&_5KS6WsmJ%m<ro6)ZaR07J<Mmqsmx%J`w%gHi^C9zHF(}_FXKb^N >za(}rNOZiHf1T#Lr0Nb**cX+wOM+wb=WjZEyH#$GN-?phT5Vvky6aBKb>y4~H$prHr >z#Xv5o%`0EsEm4xNt!%Lj39bwPO0jQtO4EVI3`6t7|70wn9GfU(cu-BtEs0o3+)^mV >zdM&wQ%jw-$lj=DIl6XqL=wBPza5-3y*Y9xd&Ij=@drt7Ua(&)m+pxE-6qdoi#hQ{e >zJfev+M&Y#g&fi=mlb;(Ha|Ptq)?#M=jfwqz>#w1G3}rm@wY|Lf(@RA9)s)WF`uj8D >z4UbP*insDQ$=z2k))DG;GJo3eJfXBi$|p~A&ENN@mt0j)oeRzWd2|F<F>bDQ*eM+E >zW8XDBMV8pPcI?X{v}0z5!|FO{B}Y~n1#E>s6AZbg5^(<U;AtYGXVMf4K$<uPN`o;S >z#gV*eV>q$l=qs()w@go3cgxvc4G%<)Li3?m>MOMmz)>rlupI+Bl=9zz28bpcMg#HE >z3<<*+1J2GAfu?}^@q=ggWDSfcMpr?JQD!J%XupuAQ_@$rC=aJDAYsmf-oBvnCq@?v >z)KC<pi0a7Y4vZLA=3dxQwfjD~5IIkLjo*QX475JyiNBPxKRI-D%Gb@Fgq;S*CO%<? >zTvIU*EKvql%Z1z^IxDZwqQHhgSsJ?B4&fp&nBM+<+bn%I-$*hL2?3u%f+Ls1q3?FU >zN(fvfhUj-`zh@>e7>$Nl-mvey5Aj1$Um&vZg%ioOd|{}J0)J{eNwvRTM7)zse()Q4 >zLHmNTOSrK-l^6{OJCNgXR5qgKK`Qt{Kd~BE1RexfIxs2+q_ir%6upzdKBbrW(@+Lz >z!MBFGl-S^eqs{>rr+Q2Z$Yx2bwQF+)S7IYUT<aqlbx2X;n1+Gi!ITS@vC|Cg%Fw<Q >z`q8ks-e4MOMP7*a4kLx~&I>O+9>~l+=v%IR?Y4vDpta?DO8yV<E`N<@;h|vqq2c)L >zwR`6!mgj)MNjNAMHB|=^C~^!8U-T7y^D|R{(rVWjM$e~3ufXu-|7FJi)*Am<qO~=Y >z$){js@aJ$lq&lUPYQ;72m-O4OHT6F}{M@!ujk)^tLBME^b%Ias<y%SF<Qt*YM&1WR >zUxUpB-R=k1>@2)s4%D;*2fl@J`mi@d1j%x2(qTp@1T=Wo38jojL63IjZzIZZ5br%I >z3Kid!**lH$$kAbPW6`;`=@LH#j2O}ZObZyy(Rdxl+h+iaC8u8q!(@h1WF7{xr-kgs >zju84P@>)5o_VisFXV<)uXyO(YhNg~MULk_)+Rm874kDGbm|+X{tE@*+0<q`Kt$qQQ >zXWR*+0-O{q{7R-OhaykzSjvzO?|j|=SO65;AdvE2lz<mQ2k4N(ltfVUItG|=1S`ZI >z9A3Z*g=-c6Fg%FuPY=s#mC{D({-PZ9!v%({QfYMdDK$SJpoI}yo#_=QT<0j0YBd_i >z&%e&URXjUdt9nZr+(uF;IDJ9X)=iwhLGoplP|ahu8$LeS-f4<qMrDN4O)UqLhF~k| >z^|?PGOLCGkEOvh6L_9Tdn@9r5^mil>Ob4kj^o~wCwEa{VCUtfgs0Sp|SUtk$gC{F9 >zp8(C-V4J_dh3px7X4A;N->JW#{Vgl@$)K;-xHXhH`7#Ay+Nal|q4q45uzI^u0yZ-# >zs%78Q`bZ$d$xyJAg57HTYZMzU&pytbReYpIQV2v4=NuSaC12L3g<tw(Td~tm18VJS >z#IYLwCW5N^esG|$``>^5Eby(TLz$kXp1<zT+JC?50?PmKL~7O)_bWGtj)3o@EA2fp >z&qF^7(yn;w2nN0!XcX9=_sK8t+<GpDc{y>T{_2N$>*rX8s~x!>vgoO)Xx4=Gn2&9s >z#SP7U8yg!%QzmAC^%4VhQ^vb3&2f`;8QU|TOwV3qXpd5X4eVbu<GD+;?Uo&&|7LTI >zAB-b-95LW=)CBgGrNW>S3j8HxZdT|hWM+1tftXpHpA*8qYF0Etkavep77*`Yz_5KI >zbk&3^tfF;#x|h@KpsR3tp3OjvgKr{q#^Cod59ZsUgJ0#)fZff48QF*D*lyUN9FJxv >zP`rQen{-~M3@5Myns%NhNz6hE9Gm9Wj`qm~AYcpG1BpvKfO~`>t_3Up$y{RJElX+! >z(%${DQ*OT8hUPA@+pFCY*9;J6H>x259Yw%XAuhk*O4gh$Z&tnoLg-QIk}VuM1EwJr >z#A{&f0=089ku3}q7)hL|wac@I3FpaMx51);j@VTXi{DL3kC2$RGrZ7rENpI_<oMXx >zc<en<UJGFiFSEro*(fciY>xCPT`lP_b!%6*Q!m;N{~cx(6KkrO#RfJU<>U@|?K#5p >z<{|qVd5b@HWE_Yr&~8$5^Tpzya8ZgF)2bx$xhjj1ziTyAPXW;#*1?iFV{G@8_3qSq >z^(BE=1-8V$_Ofsem40BmYaXimi0S73uQP`gFjfe+;O2oBi7GaMKW;P(bA~Ixij@HC >ztUp(U`u+$w+z3WC@?N3%kj^Mm&9ndA?8txOXBZgvsgJRL#y7L&xq9of#f&azthnR( >zpg-fkaYxu#7-D}di*AHAn$sB;;C>rRT{QcB8XxNNR<z5eE@g;)Tedj6*ge6GE9#h^ >z5B;l3gl4DbOz*9aR>RJ5N=TNZFo6i;hc@to;`G7>jWVCm86F~Ll_k<L`&|Z9%$NCt >zfT3X#@BC~<zzcyM!*Msk_WQ{dKLS?-6QtrYjGY_85tnOIhtsUtT=nOY9TGI&4(vHn >zKD@u(cXiw_XI0z4`%*i`V{(-GMi{P}#gi%M&6wQsz3Qu;23MrC`x&_?>vm|Sev13u >z6Mf-q$ujt2&J$HaX*2h$vW3olwm7D4loU7C)F+#`{V2q@SG2|6Q)XDRP~kE{X631B >zHir1IEaq|0O$|$$88K&-Gb$8M9v>LRS42{8s^flZBA;H^fb|o{8Pz31zMIf^j~hjX >zcgPOR3OCk6xw)i<ED0t#O9nh#^b~Dv6--wh6K|JWf1>jA)Ohx(Kc}8zU9~8U(X}n7 >zd0``(@uoP=gjO`O?A~|LhT^ipppR{<s947Jj)98)QTl5#@VQ~BW9wI#UjFD96urwl >zH=Zr6-z^wUzqBOw6v{mDytr+6&<A~N)kRxVtM{;Ki!TouPyVK+iqCYS%=~3x7F~`J >zYhGDRd-uZdi3q$dyer0cpt13^Uf!MY;=r_$-Zlo&pa(L&C1Qs!GJL<*yj$4US|2d5 >zDB`D+t$CN>!pI*>>-{B|*Jk^vdoLGH>)k2#s}Ab&(=p5mQu7<*Y4<su?v-W?IVOLL >zdm`x7m4sn4k`wB9JFjkZE#U*(XXBtuN8uOeYI&-5QbHW=bvCpdBIU5H@AX1MTy{7* >zf9#~}b=vj**ls*6m&unJoxvmyEoz56>%`-V_@&hW1eHl#UN#{>Du9zemRYl=YWE&n >zru@g2bdG`hMu<cG;Zl}G{Kp5&5(C*&+}y#s<rTL|*|y4lUdc#qT$jx@*;x=9@!W39 >zW_*(1V-3@e;zr@$er1`6wu%eCc`Z?9Q$e@lw^F54+rx!VnJ&z6u^HG*e?hxgHjYFY >z1@bo?VYLyTTZ58RI?C_4A<P_s&!YSNOqljtk~AM|7&5oy<z5(wiZ=2>9m{encCGfe >zpF}Hx>gLRz?t_zw?P+J8msiu7mR<O5=%6x>gb<@`vy|)T85Y0%upY(I3n^{J%0X!r >z3AzZ#%eyRV`eDRq$1%>>bmVgDn7~A2ar#+>GUu?i$Kq#h;5;O0LOE<on2!Ch_`&Tl >zB=PCZh*tN$`stmj`&j190EO@p8K%3P>2CC^nq&NX!6wQGxO#a7vkJXPBD>qvhPqx< >zcL!UGNiq%e_Al|dTvTiRJv-RDNR{8T4aeG4-}OD<9J%dn#)lPzxw2f5>+UqMV%pbS >zve@F*8<Lnv7}4s4tNMm$Jxhu@;7sz?Hui}ph2^R$(1{sT*|X3eFC8^kp;wHit@pZ8 >zbZRj9Kr}Am>|QosD+T#!X}B?uXz1(VLdw!f#A?A;6=Ur!ELsZ!iMEYq%znCFBb{Ap >z@Kc1XyH4=Tnzc)RKYkjT=`zl@+FbYU((uF#2O0@kF0em^W+p#xfJ+|^m$O+fPp((K >zovDjj+8GlQXvzMdIK>wi%~v197yW$g+L{ITBiE+Hgiaf)$Po4`f2-<u;{S`_wL2cs >zR(Z<#dCP{~_=t|$PgZy3>pw>H?grO*p!W+ei(d;Qex**7w;pjO9P6lK^ZGC<_W8oE >zmfxLsqmHO9qU<#w3P}9cTgmG1;Rw4a7=3Lk7S-i#o6<CW|52^rrr{g*kXL!d7w<RZ >zo#xDd;;-oWc?iSXnAiC1O-)#o+}>7N{~q!v6aSh@h?)36U_3=YCSIq|@k8W%DAuZf >ze)1>dv3*-_Er3Z1%@Vu171xtzHs#^|6bW@ZeT1AmgQmOS^vd*E&Ud*%9(IvLir-x` >zkFLFy$L_mcv~mjPzg3!UzPe^r!J}w-)B0Zi+&&*5w~qXvw7HF@f&{5hPt*w-4+#Di >zPb0vH-=_e7QhOqHV%mf&8yVNVS663pQyWQ<4Qkm~o84qN$#B|MA&p?}_Y{?>5?3_1 >zRvCUhe91cAxQscb(W$bhIezHLHmh8<)BFn-YSt?n86O-|M#CP*mC-OZsUs6kO;ye2 >zLe4iQl035F9vzByFFxQk6XI9C+@`rc&&6_rc}%vEk-Lrldb4S^2!h>y;EaGK;CCvE >zX;=LCX(QDUY8PvRukUZbhU4-|JEoZ*U|~pG)^LQ^y+FBbOmSE`llr0IPk)t*!}-E9 >z{(MDk$EAYPH8S6yxZGNK)}YD9jApT$B<q}f<@O~gn(KJ_Uux$6VDsrW^xA)!L!B_x >z35dBs*DzG<5k!dF^(CcG3)Qdn+q$C`g1o1&9!2dvQ4mYb6Fv-yOq7=ZHGnzQ*;@Ol >zPC(&@vKFJ@XsmI2I*a_30@~<+k`QL8htbr*FAkMnm&^Iu>EC(^+oyMVhh4L^Nn_}5 >z)ZvjV78{5WKlSdF6ck?}`*u`X=RtXeG4BF0B7I8G-s<%aZbD(huAcAP*U|PieJStt >zMx0{l(B~<fxFs2Cu!nb+e*UQUeMGkwboJZZ!<HoeNkzvqUM6yxDo_EFx92RI?}bg< >z2lH;2cTHtRGcKXyenhMYQcS+{HcF@!HDj!MF6$xDY@xv6Dm3hKbs?C4d`xfdk>%G) >z$wmc&Cl4}-ydR4e7$9X-OZXxOgl26M%GLI5FMQd2W6Hku>L!2X__G%QUntC*u_vnT >z90)&Z;buMcEpGH_=y3EjEH-kAM`OTXU-K!oFX{uc_0BlrYrN{@PFKPUo_~Sp(I+&z >z|9oGEBRH2OG_=ik`uW$D6u729s1p?}yPTT^jvboy6zlny#Z3+A7cZy{rur$Hbegj3 >z-R(z=`2zye+`+O1#<&knMb4r1gh6?-E)s&znIg7Cq$Q|hO0fQ-=Rc9dOG%y%>YbIQ >zdxPZV@rn}-iRZibF9>w&6*!2tt`9WI_e`otG-rH0v>Bb}VQZ&8@u2_Q2isS|P)`0g >zna&8q6-v!;>ffq2yJBfLwIZMF#pemI?B5by-Jc#ak`aQp0m)%zaP8FP^HT8S&N${p >z0bg%jyQu{Ib2*OE7aaxZUv}$gCnRxI_0gQ=u{BjNnG7i%nCg}r{KOX#EO5zQmdQPw >zks387P#u66UsCY#yoEd$VLZ1nbKQ5MlPAWo%hTW`>;rkKz4ifjPB5j6T7&ie*}%)Z >zsmXC&*UJAvmi%uV>>tAh^IXZ(32zmw!02%T;IVvF=N_)o<i2SZWWaCjoIUe<*pypj >ziz#GyERU}9A>2MbF+@@N@uBqlBbe1nhuw$c5}#~$t5=r!3b$z*a8kdPPqnmJNJkwS >zJjtq4wD+a#;S^q$7^QTuqLumXmgQOe+xB3#rE~Rvax}iitN)Kd_Z&L{BfoU=XbW@r >zss`K3zkabQCbM59Jk`FFNAq25Q~{e3I`za|zez!1^E~=%10JK#14A~Fdg(%mkFQaM >zBQCk$q@z5qtji)1(n)QY<GX$4TL^!OF*glg_#I|;g1gVoH4P*qeYB$V<nH8^8lN>d >zHUIEbkzofws06WI|6yYHYkp2@b~VFdC+uSm{&i5kjZD;}eT~m7g!+Vo3;hZ2GJ$_W >zdj0R*$G`VlxG0a@6)wkqdrtWvTw=7lCmR#Shy3z;tq;FJG%kyn^=47jqS2-iN3}L| >z6?mVSK(K~~Kd!Og#fkHab#dzz4wot^MYi1AoamYceZRouSblwEvc43-ewK!RXV_!^ >z=WxAgsacm*!^iz5?&tn>#mQ$Yl@Xe<J74}TLaLH9*<8z-ua7T{1itnkz8V4V%c}VB >zV7r>0$>G~y6xsiTc>bGr4^$0B5z}XDx|m^x!C&_c4HcC3>Ir8#mB?#$uO^bfy=L5C >z98W>XW<%}Q%prqBbI4kj=$%)SA?IDKD^HnCiGtu+uEwXRPqkx#o$jMwY^N*Z3E15L >z)wgHMR4C?<Q3{$?MQ0Xs>+&m0O+H&S^tAcKy*zTJ|J2w2*GoXW`}z+|%q-E)BmU|Q >z2Msk!T5Ph{+80@Av^~+yRWphWHAJs;U)=ay+=#?6jo2t-X0IGQR5F0%G9MA~b|=kb >zG3@9a+=*-7%Hm|r-$}Yn#Ey9+tR(yna=-BAq1<|3Y3DDttHSKRLeg1n6gOa@(1PD# >z(5rN^(a$1nj?3}<%Z&Ap>-jtU{{Z=bdF=n{)$>n(Go4dke$3~bR4=S<{_xz`z6zy; >z_wT|T{8(rgSXsPyXV*U}b%dvxOpwaUC|=M%dDCXpBt?SI;&AUl12<YiEosU93Jq?@ >zS5|08LL8#5iRe$g#U_%po^~}h13_s`8CiUfSo2jK5YW`=^`fX5V_P#e9FX#q+){pK >zwu&Y+(wDYOo!#ear*B)-<l6gTx9r8MVO```T(AZ57m)XE{P2kP=?WZ6XDVfdV1Ks2 >z<>0qwC%UW<FZoi;ER(2^<S*Jo8;%6=?RT}mz0NbUQwE>O(NWJ<RM>RLUtAY=-^|!o >z$&E}-j+l{0?=_*Rp)B{%sSvL&4-g})P?@#o!2oz3E#@Dvy#LqZ1cqxo<@YT^-`h7b >ztsL5V4ev-+<ay_2Wg82ux;s>PzK$o{{5Ha<6NQV;Qd$hdp2cmk%&QwuaVgryWn+v^ >zx%f*pupOi@zPvx;a{bAgpGyJJ7GUQl(5z$@ML6YYD84{modUO;Oy5L9xd?Jlb)2Gy >zVu2{C9Wh2^G+rGmL2+JVUg@GcjE5w+kBlH!S$Hez)3A1gF`2yOQJD+bzJiseP<ZBc >zW)E@Ui@WGsze{_gfZNNN8_zO$KQEFtl+vCU&lSEvem}R?@YXCTb5V@-+OePaocqGh >z@xKXm5aPrh%F}#SdVouMsR$-AwLl%{9C^#^6EpV5fB$!G-JX=c8*P6@*%HU9Spa7h >z#*^As-Uen-_*ig9FQ4*UlR5orq%5K~bVpu@!k#GERlzYMFS>UVdkT^<Lf1ZP&xC*^ >z%}F&j{{e+h&kG;E*m_^m_)!t??6!uU>{$oh_}-c^ZL_!f|Mh0WC}8PwkzsRh0AKuB >zWYBTNru5&vV;*Kxnn6{zmQ(JtLs=dWF)q5VoFCYi{KW36Sd$zW6;%8pp}jz@y^n+a >zA*7Agq-mFV<HWGu${hBgU22I;-pT7q{F}i&seESTCCwj4uB@7UE$dn^1O+YRc~Qg} >z1PzTGy^%OgCwx@-^#cSWP3@y$aq-*3;*v;uUXEiSp}2zM7nF(CMBOvaY+arj9n#EH >z%CF1B9$j2<my~7;-E?QXri)g-C!=df%FZpMmwO)5>8LzCTcA&O)$(fvs;s1ep6WHG >z9e>25wc>>#ffEv1tbDyBmdSH*{!^c|TqCnO-lVrKUYBN`*ghQ^c+3l=E@_ankiUSq >zsv|%gjD-ISh%@UjT478&g1`l1{?g}`$ByW8N+?MC5q)mUozK%(%#Q_B2L9pA9avLY >z{L9Iz_T&HMbY?&myQBP<Hdo;w7{c=}y$Li9|J=~@>wj$uzzVPtkUyBay#|KH_5axL >z&VBH4j%ejqtpIEXngR`dRYia*wR~`qf1r3sZj5+!co+HaEy-a*6ONd8W*vW+c+l4o >zG}mX=lt4o@ek^qAI43)R#2c;oi^TKgg0UUp^#1l%3X0|9-_H1h;`?74-2)`Pe`>TC >zM7U4JXykJQd~rMDT-n%LCd{iikeR4LZxQqku6*PVO_;ndfk~|=D~-Qq#Nl36_ZQov >zWuyK{?cuZ7QzqTEbv-Ta>ZU0}UpXouU;8G1%dBi~H)hJxFan?`l%VY7`bzPLH>Z05 >zD$eaCwP-vndWh|(Kwor=(VK~r#I(lh%syEKt@Mh)jw=gPI^o-SVHDX0^jE+u9;b7h >zK!w2c%DQ)8lA|{?RJROOD^9e(uY!LM?YHlku}`Uc^Sr^h4_gbjeck@wZ{nP3kxBp~ >zmras5nV!e)&eY72zDEB`lcuoX+uY23sOgsg5h`}~)J~^xl?{l>Ko;YaOwr7J?#hna >z3sKJ=yo`I*^8M4G0s|6bE{T>7bf|2}M#uHgKE3{*-TvS}W}_*u*`V)-Eb`Z~m)WC3 >zvSy!5{<`jQ`gAq2pq3m=JAyNs8>W_5ENsZQsXw9l{Y<)Kh1uBkU+R}XrA7Xk)W`Z> >zP5O0tG=M*NJsQHo{y=I^JpH%y@PBfV8x57p=xp>3_QbXD5sim}i`jKQG~BYC?uxg0 >zRYmVUi^J|Z8~a$(2<E0_G=ECx5Y9a}QAotU4Qhw@gdyqaWI4T)H~tkQ_dlq0e@Ny3 >zetj{x640%0lYX|=%v5@$o>6%4WMBX;tel^1F&Hb2^8t)o!@<}?v+S~R<73YnS+2j) >zF&tm{x>z-~8=LilyQ1I1<h|Ju{hID5%=3>W0QlYn&3~cy{Zrd<uL$pxNX?3yP6?x? >z6*p!qXu_%smn^=-i^_@7?q1wsXaXur?fmJolMSsSuzR8>taMl9WW^PQ40Ce;HI7e> >zaijUn*Tq725xv=gZoMmJG)Z~MH>RQ-`p(7YcmJ?cF*^sCaTS>zd<bhVy(t>_E?{|Q >zivC=)d-0CJ<c;a^=tp2fM{cYhHD+)9eEp*pT~+TiB4UV1{Kqt4#_gXUzkgZPT+4&L >zXyH?s)PLR6H^1A}Mri8ydpd+v=_$Qc;a}G0yN6`8pYZBdDfT;-wth}InU`xp9*qh^ >z3B=*20X^Ja$tYe$D6(blvytuqO7&c!u(3I-DWP*gF}L(AD>IpSkmuo4XXyk(Pv7{c >zE}zrNu6D+=^`HC%nVS2RWX3l&o|&fhr7;t*>+MjjfI4ICSh|*znU2p>jq91Fd@4Yf >zjXN5lOB!BpzK~ffah<rn*LrnT_{UtQWP<GG^B2nOX74Fm46F&~igRZ#T;6OH%6z1k >zx;*Y$?Ka*vrQN8SRI=3Eb*ZvGw*CUZLYne8_i8C-jGY;V78pnUfEL)#Yx&h1$k3WG >zt};Jzt}=Ts9F%m#h4balof_79d6+R#v>CZRGEg_r<(%_=q%6S3ZY=w}ZkeVf!7pUV >zqfSA@xy5Aow&GCJ<MEcUqK&&$ob64QO~W3XzD8ROr{r3GrzgOFezRfo_T|_)J^c}L >z|5s0<N}QZywAguuzfQkOf9zVlyqnY9*ceAMcozbhP6P0?i#;XXeUOQUEaBy_&xWHM >ztH;hQU1{NV&o}GWyKDC5aNV?tF-Z78RBwSh$hp##Ap804dO5p@wsO0EGA+eJrE9b> >zq<~sCA@sRh&Eq96zZM>0w}$NNEB@LU8+TLG|FGajnIDN}lscDQ<q?|7+p{iF8=gDt >z>YZ>_m3U*^`J-^@hVXJ}>eF9Aql#~Sb~ERUX@RjKnLZ-4W0bBbA?O&RDm0`V!=EG# >zJBdqIxCu6YF;^R|(>VqhYdo8=4gTpKQU~lu12touo;1vR#7OJND-)i&6TM^jF-Um9 >zsMIud<=MhBL(f${>q51W@}oi869>?@5>u^lAG_g6xJf&SJ6aJP8lKKICxz-WV{GHo >zowTYR_-!><zCT=6bm#8Hlba2re7c$S#)?-RCHlee1gD6q&3i}`vR>T=xVP!3B~~vB >zS8F@3bALu>{TG8mSQVccD)hI?j+pl&1*<a^j3@W3Zw9Bb#?)IIUjD|`#F<`XVK$C^ >zWcqBN!nJyFQpVrQiz2_IxiUC~8!uf|%DAQCxzT)~Bk`p~x<qBZbH3DrxI6v=pN}bK >zOqCoBh|9a!;)Krv1kL`~u`}<H#8})8z?zywMUU{Dk=v?I|N9*UYgeNc)GfjHw&dS0 >z^{6sm2&!^1IdnBSBD^J9)Z-G%t@Q+l7UrF{5;A5z5rN#>N4hVAD0~`_?rxdFh|2mv >zo1z6aqTC>v1_Me90H~*cO@OQ!$foTU5DVZy|AbP30N%-402=|C0+60RT!FO%+LZ~k >zfP|q3YESfT(Dzwk16%|SkK&o3gVXb4prEW+6b^|Z!^MTrN%&pAy}PR*{bzzpB7t;% >zB=nD<<p`j4U;vWB?GVst4IVl}!p?%kq2k}fG$oFN-3X@uDhg=LAE_qzG`Jdia1k;< >zXMij@QoqsyvBe;`hcP600VMBG{=XS*R{W9Th6|kds5pPCXNH513Q7Y?grF=qh)V~n >zHxTwX(6EpYNe<wHup$+Z5=TR4?8VKX;H)g5c8LPx$AZ#H2a;9{8Z4KTK(m4-z}Y_s >zs#d325x-y?D4rz76o!$AR3odB(Y1njhNFxpG6E{p3@S#zje(*=rBM_kI2Xu9!r?^* >zprryfkS;&E$|HEd3b<Qs8*o%~8Z;CRSTRTHV>p%oXCQ&h<q^;ccGO47&J@}Ocs>{f >z3wUFO6O7InI2{kDH8`qefE^g_D1%o(O$>)I!Df_gT{g825bd~|Hj2nFye>@r{`w5M >zczq^}77wZth;(=k3<Z^MiQ1N1DC+q|Y!Y?PoK-YmQU_SA%$u<q^6N10tF|)qr{A5X >zr0pxW^!LtW0@X3NB)p;kHW)4z75+|$J#x-MY?1EZax%+oP%Jt4Q8S~IDd|2Rx@S2Q >z1Y*iC!Ms5RY77@<DUF`;bk7vNJBV%O3jo-up3b#J@+`2KP;wT(DO?;E4Awz-Sl0s^ >zUS_;oHFJ#GOy~@ahzQE9{3b(asB)E6i340`2NaeRgeek2)2P&H+!?MdQVbkea4_KC >zCh4r{ieTRwRP2>tn^30ucZmhq!-{S@5<k<oeZLmFmPKTL)cyTnMJ#j7&87f!8Yt|V >z$*@%tp^u1`-}NQ*v@2JnShgPq3yO$tiI`lTTjUckQQV#{h+JhxM>SPh`r;K<b=SOi >zEwCnKA%t4uU}mP_&d&1}=KJM#5m|Q1<Yp8g=Wt>PMar2aU*-kUDoFdZ{Y**eoRZ`u >z-=L~78>C#3M7as!SICG)V|cf4=GOqc5>r3&{%RWeZ3s2_LYs&PjOe4aWmTf8n8f%j >z%6)jnK;Hc}51}AfFpbeJd{nm3;QKD2?&Sr0h9}*2qEl$zZd=hDMy+Ff+AIAe`AWK1 >zkqf~O2&w*7`_nEXHmx~pA3`0am_r)w2zlg(Fb3Z^G=6B!^3mq-4Y{>=T(a}Umbp%= >z!spbFx03ccu75r`jp{i4xN)ZZsdhT7O(2YSH&v-fh>TQ~Gz)#`tfMMLfB5cAKjV0j >z!Zzc$oa7-)=^aL6z0v)LV@PhS+ozSEs26v~u4k?!Mg?y6|Mq!`eb~)#Ri<<r0ts!s >zPWcfekgZM5mwb5v*%nJszI@YPNgmN!gr?8IQn~fSKA$uc9Q(r7+eSXDo_E{7EFG(k >zS14Xv3b_I^)<4zSO739w%dn-1Bic)>*E@By@lasXQcUkGAC^4XW@QWQnA;7sb5G00 >zz@d-`3=}^?;e??vz^uSN?5e4KxO53*1Dwd;-O_jU={7`4cs1$pTaj~8%u-o(uozvH >z<5jbxtF8-^wxH;9udQu|aK_)acJ@b1mRQcNNs&c5a(?ct8Ip;yO;4yW%%S}&(cyRB >z$l{3u(p#LsqMB%h7AqB&L3(oaz^tL5uSC1>W>3hUbopi_qdDI`J)IYfrGG58{Lz2N >zp&$M0kAB0D8kR5D_^#-#D$DtJ`tZ0D{NkJLI1bNurbv2L@?89@^?8#*U1MZ$x6s|x >zXSZ|^hvgcZhU2%)_{nfLr1OS$^*+y6<Et$D;{y4=q6u;#dGs&0U?mj7tGeWgH%6sf >zk%|ie(D>B=o&z0ZJb;<X^Q`h8CoSDxDHVzS6w_mC9emF1YfF(to?G_Lj~t6vJwcgs >zeDn-^(7ex`oz<Qs&3)Gp=a)qao^%m+y>8Cte|GGBA&PX}yMK4-e(uxTLX%fg6Mj|d >z$LM(Ue(&-hJskL{+mpW0G}s_6dD!@RlG^4+Ovk|>-@J3>*h}|q?w%B%BI1_ZWLksK >zqy2|DecVsH=YI@JX6IxKtn_8IyRb<NY4jG2KNxv+FTwxSizcgSDt(W0x4&4mKicVc >zCA~klWO?PG?`f|ikvW+xttgEue{Hxea;877M#@}@OW7Wyicu~IUz^#Uf6sVe7vaAu >zBqkeuRQG2K?JxlPIi*=F!FbD_WI(l7ZZ`Fnn!M0@tgF*d{X6ky&rId<@Qh<g96R>H >za%+@(`nSI6Jsi)81Jf(qcXLj)ks+8lGYP-Ar~O2#H2xY=j0Svh$$AAc3a>=$1RjdY >z1O}WE>SnM!Ljxf;A|T+di3Ydg9X2JvO0$oC^YM)!OTHWLQa@Z>&G;sRa-RuYP`=8p >z;p<7d-=3%hOjwLL(<NO|h9D1@yP8Vm-K5tP;@ORBzQ)J%JkVGdF(GlhJq!w5@}Uol >z7BY%l7YKYZ{+0#K^iCmMhkoQWLJ*YdrSYN5Z!aELkX7`ZfRTN}?v!7qFD8=@(<!t^ >z>f@=$-S@9ti=+>z*Jj(_7pCHld6|3qKO5>_N@-F={$M5I^yp5m7>&(?Vj)59!m`_1 >zd4SHycD7oGu0P=R_$|0lk6{yhDL~ofm-BaVDn}ET_Nc34s0N)Og*}bj&1Q^7!$M!5 >z2t7xO7qyIBbLmgsIqg@zyk8RSwyS>K2(LV8Dn@<dAfnB2&`ENfFP*oKvUhy+n`COk >z2BSxABYR`#qbQ~Y@i4K3$mdfY-AND0AFo^Xp8w$P)xxu%u&()|_teOe<!QMlt_&{S >z<oR!G4vKgD8f?4sZd~ufr-)xIkQh?A{18`Ad9Cid0>&Hp)|{HoT@|Ahx)(w&w0}q~ >zwO(tm*?lS0-V^(=JgS1>F<l(mtbNZOcD6>HM&%XD`zSSmF<N6JZBp1=!&DIlEgXSE >zBaDjQYHc1AlcBr6@t>BH9q+x2qQyxgz_Q`r0x8*&WpZm@g(k+Rpjwjv9;&sW@`X_o >z8~{<jclX%dkXa9RaOlCm_?UH`#NhD!Gy}U|G9O_#AX51e!r51ibGZTUmtqQF_I|<0 >zV1%)pG6zGbas@AILcvG!2Gw8+>x?}ELn}tT+J?}#*rB5&eXB#oJGt!T*aW#|3<2>L >zi!ER+P()G!gK$4IpBEq$vR~zp95wW9ix6|>ncZfB&KPDEyH0Hvl@-5{^@nVBtCbD1 >zrj8fbOam(!(30gZyxdoOzp%z~^+TcJ2u=pn#H<Kv!b>$7tCv^5S=(68^VB1*YHmDz >z{GYArkBZ3XI6QxN=0(AmM#{SN0v{$>Iyy>xvt(^)Jl!=ON5qh~v|3?;CY`dR+}#IU >z@Oq4u?~;I_1`>CIqeVBaB$~ndb8lppTpZQ-29I&fu`x$iCc67!bq^PI2Ev%2XKN^* >zP4cz$`;V*<GQ@s6o#oKKaR*ahUNyzD)Hg9&|Kz$~BOS*CEPk-gGE%kSW|+^A;fH0( >z3o<J0Yf_jvOPk!hC)g6^Xnv@LckfLOIpw_!1S5xQaCoZsfiT+pK+jiM9sbPv94?aD >z;Z;P%mF0kwk+Vx$X010lUPxk%a3ii%W_`&~PHNYorcWKSBF+GoC?_S$_Qo_NvR%c! >zjl`As%tvhd#3ABp=IR3M&W~qB{LuvkLqhajx0TED_usbzyX4IcQ03^K^+}|qX@yaK >zv8=AS!XYAi10f?p$IGA-m0Q<hvD0d~wmo{HPs?e5I>vzp4g9NitrR_5m_ag-tSLni >z1G(O9m(rD;30C3lm`Kbe?~hJxC^aS|h)cGsDv50EkiQhJ4*%NRhMPq_^AQKTe(5bY >zLQ;QDy!?<B#-0lumzEecPrjxRnv7)jhIO^6u&N&lv4-XZA{kT9c6EI{8fdY%-s(@7 >zM^6MSgjJn6UFCNCp_saYdA;6igi$Kcwyj{YQD!z=CXW^6s}k4bA&Gihh*SUBK>kcS >zMwt=VrTMTxK}BX{;Y_alBl<xWxV>)4qZ^L}7r3kCLNa>YI6S0#V`g7HanBGsDPw5d >zb6UI9Cy{bQ<=gSD>#XM+pMAJTD<*Zlpz>JucaJJ-5BU#L>C^6xgVG<*dgWg3kueHS >zQS};q=6}khH&smc#!W>Bh?6&m@|~-!T_+OXdjvvt{oXa@^6Mw~D4%C_ch`LUGGV@; >zDwj*OHC|7o{rNn76PB?)i;3ML*g-#Rr4vids_&l|UPIrTF$UkX9DSaAGNO*d^3lfi >zg%qBFns`Kn7@a5}vR(A?Qv<bWXG}+(`zt5eb1FH`W(k0`KiHK0DQZswdx&o)7@d6- >zx6zS^dFf6>p`d3{2e$uUKIB7`?F-6~-8=ndYj#RM%|iwQk+7rzC3cDdRaO^H>fN@~ >z$j7!K4`d4%5<sysz{sI@Oe;vL9Y01xIO$5q701mm5g5E}Szy)0fC8nJ*4nsuk{AN) >z&cq>aX-#Y~>6sd;HWL+Xrm6Y&E_4|BaS=GnT7P_-oNv!M+KGgf;gaUD0&Cu!g!7&u >z&WbjQurEZ<Ar1F3z>XNgwV26oHGGTTH4G@+=Oi>OE5Wf;j=GRp{vc=?x`}s#&~8{D >z;rFtyUd^0*D0JtDB6*P$R2>`O0$J_~a|&Sj+L}n9ibn;4p8v$@R&zx_jZ)*VWCPh| >z`k@mS!AAutK)8_O%%aJIoZ}8{!1&%pT2#ZY2*yUo2huW6mzzqp!I<Qy(=TiHw~_bP >R8Ab#{#*)kO|FgYq{~uF{Nech~ > >diff --git a/LayoutTests/media/media-source/only-bcp47-language-tags-accepted-as-valid-expected.txt b/LayoutTests/media/media-source/only-bcp47-language-tags-accepted-as-valid-expected.txt >index 54a6e483b89457ab2e2e3ce76a5003a821078181..aaa3a756433ddbc6502a9a19f3d6ec6234cfbfcc 100644 >--- a/LayoutTests/media/media-source/only-bcp47-language-tags-accepted-as-valid-expected.txt >+++ b/LayoutTests/media/media-source/only-bcp47-language-tags-accepted-as-valid-expected.txt >@@ -1,48 +1,48 @@ >-CONSOLE MESSAGE: line 221: The language 'a' is not a valid BCP 47 language tag. >+CONSOLE MESSAGE: line 222: The language 'a' is not a valid BCP 47 language tag. > CONSOLE MESSAGE: line 106: The language 'a' is not a valid BCP 47 language tag. >-CONSOLE MESSAGE: line 221: The language 'a' is not a valid BCP 47 language tag. >-CONSOLE MESSAGE: line 221: The language '1' is not a valid BCP 47 language tag. >+CONSOLE MESSAGE: line 222: The language 'a' is not a valid BCP 47 language tag. >+CONSOLE MESSAGE: line 222: The language '1' is not a valid BCP 47 language tag. > CONSOLE MESSAGE: line 106: The language '1' is not a valid BCP 47 language tag. >-CONSOLE MESSAGE: line 221: The language '1' is not a valid BCP 47 language tag. >-CONSOLE MESSAGE: line 221: The language 'ab-abcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghij' is not a valid BCP 47 language tag. >+CONSOLE MESSAGE: line 222: The language '1' is not a valid BCP 47 language tag. >+CONSOLE MESSAGE: line 222: The language 'ab-abcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghij' is not a valid BCP 47 language tag. > CONSOLE MESSAGE: line 106: The language 'ab-abcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghij' is not a valid BCP 47 language tag. >-CONSOLE MESSAGE: line 221: The language 'ab-abcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghij' is not a valid BCP 47 language tag. >-CONSOLE MESSAGE: line 221: The language '1a' is not a valid BCP 47 language tag. >+CONSOLE MESSAGE: line 222: The language 'ab-abcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghij' is not a valid BCP 47 language tag. >+CONSOLE MESSAGE: line 222: The language '1a' is not a valid BCP 47 language tag. > CONSOLE MESSAGE: line 106: The language '1a' is not a valid BCP 47 language tag. >-CONSOLE MESSAGE: line 221: The language '1a' is not a valid BCP 47 language tag. >-CONSOLE MESSAGE: line 221: The language '-a' is not a valid BCP 47 language tag. >+CONSOLE MESSAGE: line 222: The language '1a' is not a valid BCP 47 language tag. >+CONSOLE MESSAGE: line 222: The language '-a' is not a valid BCP 47 language tag. > CONSOLE MESSAGE: line 106: The language '-a' is not a valid BCP 47 language tag. >-CONSOLE MESSAGE: line 221: The language '-a' is not a valid BCP 47 language tag. >-CONSOLE MESSAGE: line 221: The language 'a-' is not a valid BCP 47 language tag. >+CONSOLE MESSAGE: line 222: The language '-a' is not a valid BCP 47 language tag. >+CONSOLE MESSAGE: line 222: The language 'a-' is not a valid BCP 47 language tag. > CONSOLE MESSAGE: line 106: The language 'a-' is not a valid BCP 47 language tag. >-CONSOLE MESSAGE: line 221: The language 'a-' is not a valid BCP 47 language tag. >-CONSOLE MESSAGE: line 221: The language 'a1' is not a valid BCP 47 language tag. >+CONSOLE MESSAGE: line 222: The language 'a-' is not a valid BCP 47 language tag. >+CONSOLE MESSAGE: line 222: The language 'a1' is not a valid BCP 47 language tag. > CONSOLE MESSAGE: line 106: The language 'a1' is not a valid BCP 47 language tag. >-CONSOLE MESSAGE: line 221: The language 'a1' is not a valid BCP 47 language tag. >-CONSOLE MESSAGE: line 221: The language 'aa1' is not a valid BCP 47 language tag. >+CONSOLE MESSAGE: line 222: The language 'a1' is not a valid BCP 47 language tag. >+CONSOLE MESSAGE: line 222: The language 'aa1' is not a valid BCP 47 language tag. > CONSOLE MESSAGE: line 106: The language 'aa1' is not a valid BCP 47 language tag. >-CONSOLE MESSAGE: line 221: The language 'aa1' is not a valid BCP 47 language tag. >-CONSOLE MESSAGE: line 221: The language 'aaaa' is not a valid BCP 47 language tag. >+CONSOLE MESSAGE: line 222: The language 'aa1' is not a valid BCP 47 language tag. >+CONSOLE MESSAGE: line 222: The language 'aaaa' is not a valid BCP 47 language tag. > CONSOLE MESSAGE: line 106: The language 'aaaa' is not a valid BCP 47 language tag. >-CONSOLE MESSAGE: line 221: The language 'aaaa' is not a valid BCP 47 language tag. >-CONSOLE MESSAGE: line 221: The language 'aaa1' is not a valid BCP 47 language tag. >+CONSOLE MESSAGE: line 222: The language 'aaaa' is not a valid BCP 47 language tag. >+CONSOLE MESSAGE: line 222: The language 'aaa1' is not a valid BCP 47 language tag. > CONSOLE MESSAGE: line 106: The language 'aaa1' is not a valid BCP 47 language tag. >-CONSOLE MESSAGE: line 221: The language 'aaa1' is not a valid BCP 47 language tag. >-CONSOLE MESSAGE: line 221: The language 'inv-alid-char space' is not a valid BCP 47 language tag. >+CONSOLE MESSAGE: line 222: The language 'aaa1' is not a valid BCP 47 language tag. >+CONSOLE MESSAGE: line 222: The language 'inv-alid-char space' is not a valid BCP 47 language tag. > CONSOLE MESSAGE: line 106: The language 'inv-alid-char space' is not a valid BCP 47 language tag. >-CONSOLE MESSAGE: line 221: The language 'inv-alid-char space' is not a valid BCP 47 language tag. >-CONSOLE MESSAGE: line 221: The language 'inv-alid-charââ¬âlongDash' is not a valid BCP 47 language tag. >+CONSOLE MESSAGE: line 222: The language 'inv-alid-char space' is not a valid BCP 47 language tag. >+CONSOLE MESSAGE: line 222: The language 'inv-alid-charââ¬âlongDash' is not a valid BCP 47 language tag. > CONSOLE MESSAGE: line 106: The language 'inv-alid-charââ¬âlongDash' is not a valid BCP 47 language tag. >-CONSOLE MESSAGE: line 221: The language 'inv-alid-charââ¬âlongDash' is not a valid BCP 47 language tag. >-CONSOLE MESSAGE: line 221: The language 'inv-alid-char-PÃÂ¥lska' is not a valid BCP 47 language tag. >+CONSOLE MESSAGE: line 222: The language 'inv-alid-charââ¬âlongDash' is not a valid BCP 47 language tag. >+CONSOLE MESSAGE: line 222: The language 'inv-alid-char-PÃÂ¥lska' is not a valid BCP 47 language tag. > CONSOLE MESSAGE: line 106: The language 'inv-alid-char-PÃÂ¥lska' is not a valid BCP 47 language tag. >-CONSOLE MESSAGE: line 221: The language 'inv-alid-char-PÃÂ¥lska' is not a valid BCP 47 language tag. >-CONSOLE MESSAGE: line 221: The language 'inv-alid-char-*' is not a valid BCP 47 language tag. >+CONSOLE MESSAGE: line 222: The language 'inv-alid-char-PÃÂ¥lska' is not a valid BCP 47 language tag. >+CONSOLE MESSAGE: line 222: The language 'inv-alid-char-*' is not a valid BCP 47 language tag. > CONSOLE MESSAGE: line 106: The language 'inv-alid-char-*' is not a valid BCP 47 language tag. >-CONSOLE MESSAGE: line 221: The language 'inv-alid-char-*' is not a valid BCP 47 language tag. >-CONSOLE MESSAGE: line 221: The language 'inv-alid-char-' is not a valid BCP 47 language tag. >+CONSOLE MESSAGE: line 222: The language 'inv-alid-char-*' is not a valid BCP 47 language tag. >+CONSOLE MESSAGE: line 222: The language 'inv-alid-char-' is not a valid BCP 47 language tag. > CONSOLE MESSAGE: line 106: The language 'inv-alid-char-' is not a valid BCP 47 language tag. >-CONSOLE MESSAGE: line 221: The language 'inv-alid-char-' is not a valid BCP 47 language tag. >+CONSOLE MESSAGE: line 222: The language 'inv-alid-char-' is not a valid BCP 47 language tag. > Test that only BCP47 language tags are accepted as valid but still reflected. > > >diff --git a/LayoutTests/media/video-orientation-canvas-expected.html b/LayoutTests/media/video-orientation-canvas-expected.html >new file mode 100644 >index 0000000000000000000000000000000000000000..ea912840eaca0d07e490d2506ea4adfd0abab976 >--- /dev/null >+++ b/LayoutTests/media/video-orientation-canvas-expected.html >@@ -0,0 +1,46 @@ >+<!DOCTYPE html> >+<html> >+<head> >+ <title>video-orientation-canvas</title> >+ <script>requirePixelDump = true;</script> >+ <script src="video-test.js"></script> >+ <script> >+ window.addEventListener('load', async event => { >+ video1 = document.createElement('video'); >+ video1.src = 'content/no-rotation.mp4'; >+ await waitFor(video1, 'canplay', true); >+ >+ var canvas1 = document.querySelector('#canvas1'); >+ canvas1.height = video1.videoWidth; >+ canvas1.width = video1.videoHeight; >+ let context1 = canvas1.getContext('2d'); >+ context1.translate(video1.videoHeight, 0); >+ context1.rotate(90 * Math.PI / 180); >+ context1.drawImage(video1, 0, 0); >+ >+ var canvas2 = document.querySelector('#canvas2'); >+ canvas2.height = video1.videoHeight; >+ canvas2.width = video1.videoWidth; >+ let context2 = canvas2.getContext('2d'); >+ context2.translate(video1.videoWidth, video1.videoHeight); >+ context2.rotate(180 * Math.PI / 180); >+ context2.drawImage(video1, 0, 0); >+ >+ var canvas3 = document.querySelector('#canvas3'); >+ canvas3.height = video1.videoWidth; >+ canvas3.width = video1.videoHeight; >+ let context3 = canvas3.getContext('2d'); >+ context3.translate(0, video1.videoWidth); >+ context3.rotate(270 * Math.PI / 180); >+ context3.drawImage(video1, 0, 0); >+ >+ endTest(); >+ }); >+ </script> >+</head> >+<body> >+ <canvas id=canvas1></canvas> >+ <canvas id=canvas2></canvas> >+ <canvas id=canvas3></canvas> >+</body> >+</html> >\ No newline at end of file >diff --git a/LayoutTests/media/video-orientation-canvas.html b/LayoutTests/media/video-orientation-canvas.html >new file mode 100644 >index 0000000000000000000000000000000000000000..a879c552db46c4dda9d221bf0a80c6f349af1f1d >--- /dev/null >+++ b/LayoutTests/media/video-orientation-canvas.html >@@ -0,0 +1,45 @@ >+<!DOCTYPE html> >+<html> >+<head> >+ <title>video-orientation-canvas</title> >+ <script>requirePixelDump = true;</script> >+ <script src="video-test.js"></script> >+ <script> >+ window.addEventListener('load', async event => { >+ video1 = document.createElement('video'); >+ video1.src = 'content/rotation-90.mp4'; >+ await waitFor(video1, 'canplay', true); >+ >+ video2 = document.createElement('video'); >+ video2.src = 'content/rotation-180.mp4'; >+ await waitFor(video2, 'canplay', true); >+ >+ video3 = document.createElement('video'); >+ video3.src = 'content/rotation-270.mp4'; >+ await waitFor(video3, 'canplay', true); >+ >+ var canvas1 = document.querySelector('#canvas1'); >+ canvas1.width = video1.videoWidth; >+ canvas1.height = video1.videoHeight; >+ canvas1.getContext('2d').drawImage(video1, 0, 0); >+ >+ var canvas2 = document.querySelector('#canvas2'); >+ canvas2.width = video2.videoWidth; >+ canvas2.height = video2.videoHeight; >+ canvas2.getContext('2d').drawImage(video2, 0, 0); >+ >+ var canvas3 = document.querySelector('#canvas3'); >+ canvas3.width = video3.videoWidth; >+ canvas3.height = video3.videoHeight; >+ canvas3.getContext('2d').drawImage(video3, 0, 0); >+ >+ endTest(); >+ }); >+ </script> >+</head> >+<body> >+ <canvas id=canvas1></canvas> >+ <canvas id=canvas2></canvas> >+ <canvas id=canvas3></canvas> >+</body> >+</html> >\ No newline at end of file >diff --git a/LayoutTests/media/video-test.js b/LayoutTests/media/video-test.js >index be0467f2174440d296f6c714779c8d04fc052519..f58320731174d4ec794adc9d664513d88fffa797 100644 >--- a/LayoutTests/media/video-test.js >+++ b/LayoutTests/media/video-test.js >@@ -186,10 +186,11 @@ function run(testFuncString) > } > } > >-function waitFor(element, type) { >+function waitFor(element, type, silent) { > return new Promise(resolve => { > element.addEventListener(type, event => { >- consoleWrite(`EVENT(${event.type})`); >+ if (!silent) >+ consoleWrite(`EVENT(${event.type})`); > resolve(event); > }, { once: true }); > });
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 196772
:
367130
|
367131
|
372278
|
372283
|
372291
|
372296
|
372301
|
372305
|
372372
|
372469
|
372786