Diff
Modified: trunk/Source/WebCore/ChangeLog (263526 => 263527)
--- trunk/Source/WebCore/ChangeLog 2020-06-25 20:28:09 UTC (rev 263526)
+++ trunk/Source/WebCore/ChangeLog 2020-06-25 20:37:34 UTC (rev 263527)
@@ -1,3 +1,51 @@
+2020-06-25 Wenson Hsieh <[email protected]>
+
+ Text manipulation should exclude text rendered using icon-only fonts
+ https://bugs.webkit.org/show_bug.cgi?id=213446
+ <rdar://problem/63734298>
+
+ Reviewed by Myles Maxfield.
+
+ See below for more details.
+
+ Test: TextManipulation.StartTextManipulationExcludesTextRenderedAsIcons
+
+ * editing/TextManipulationController.cpp:
+ (WebCore::TextManipulationController::shouldExcludeNodeBasedOnStyle):
+ (WebCore::TextManipulationController::parse):
+
+ Augment token exclusion rules so that we're able to exclude certain text nodes from text manipulation, based on
+ their style (more specifically, based on their font family). Ask the text node's primary font if it is likely to
+ be used only for rendering icons, and cache the result in TextManipulationController to avoid running the
+ heuristic an excessive number of times for each font that appears in the document. We currently only run this
+ for the node's primary font when initiating translation, though we may want to change this in the future so that
+ node exclusion is recomputed when the primary font of a node changes.
+
+ Note that in the case where an icon font fails to load, we won't exclude the text node from translation,
+ since the primary font will be a fallback. This is intentional, since the node would appear in the document as
+ normally rendered text (rather than icons), which should be translated.
+
+ * editing/TextManipulationController.h:
+ * platform/graphics/Font.cpp:
+ (WebCore::Font::isProbablyOnlyUsedToRenderIcons const):
+ * platform/graphics/Font.h:
+ * platform/graphics/FontPlatformData.cpp:
+ (WebCore::FontPlatformData::familyName const):
+ * platform/graphics/FontPlatformData.h:
+ * platform/graphics/cocoa/FontCocoa.mm:
+ (WebCore::Font::isProbablyOnlyUsedToRenderIcons const):
+
+ Add a heuristic to detect whether a platform font should be excluded from text manipulation. For now, we only
+ return true if we suspect that this font is an "icon-only" font (for instance, the "Material Icons" font). We
+ guess that a font is *probably* an icon-only font if the font supports only characters from the basic or PUA
+ unicode planes, and the glyph bounds for the set of supported non-control basic latin characters are all empty.
+
+ * platform/graphics/cocoa/FontPlatformDataCocoa.mm:
+ (WebCore::FontPlatformData::familyName const):
+
+ Add a platform `familyName()` helper method on `FontPlatformData`. On Cocoa platforms, this wraps a call to
+ `CTFontCopyFamilyName`.
+
2020-06-25 Kate Cheney <[email protected]>
App-bound domain service worker registrations should be limited
Modified: trunk/Source/WebCore/PAL/pal/spi/cocoa/CoreTextSPI.h (263526 => 263527)
--- trunk/Source/WebCore/PAL/pal/spi/cocoa/CoreTextSPI.h 2020-06-25 20:28:09 UTC (rev 263526)
+++ trunk/Source/WebCore/PAL/pal/spi/cocoa/CoreTextSPI.h 2020-06-25 20:37:34 UTC (rev 263527)
@@ -101,6 +101,7 @@
bool CTFontGetVerticalGlyphsForCharacters(CTFontRef, const UniChar characters[], CGGlyph glyphs[], CFIndex count);
void CTFontGetUnsummedAdvancesForGlyphsAndStyle(CTFontRef, CTFontOrientation, CGFontRenderingStyle, const CGGlyph[], CGSize advances[], CFIndex count);
CTFontDescriptorRef CTFontDescriptorCreateForCSSFamily(CFStringRef cssFamily, CFStringRef language);
+bool CTFontGetGlyphsForCharacterRange(CTFontRef, CGGlyph glyphs[], CFRange);
CTFontDescriptorRef CTFontDescriptorCreateForUIType(CTFontUIFontType, CGFloat size, CFStringRef language);
CTFontDescriptorRef CTFontDescriptorCreateWithTextStyle(CFStringRef style, CFStringRef size, CFStringRef language);
Modified: trunk/Source/WebCore/editing/TextManipulationController.cpp (263526 => 263527)
--- trunk/Source/WebCore/editing/TextManipulationController.cpp 2020-06-25 20:28:09 UTC (rev 263526)
+++ trunk/Source/WebCore/editing/TextManipulationController.cpp 2020-06-25 20:37:34 UTC (rev 263527)
@@ -37,6 +37,7 @@
#include "HTMLNames.h"
#include "HTMLParserIdioms.h"
#include "InputTypeNames.h"
+#include "NodeRenderStyle.h"
#include "NodeTraversal.h"
#include "PseudoElement.h"
#include "Range.h"
@@ -330,10 +331,33 @@
return unit;
}
+bool TextManipulationController::shouldExcludeNodeBasedOnStyle(const Node& node)
+{
+ auto* style = node.renderStyle();
+ if (!style)
+ return false;
+
+ auto& font = style->fontCascade().primaryFont();
+ auto familyName = font.platformData().familyName();
+ if (familyName.isEmpty())
+ return false;
+
+ auto iter = m_cachedFontFamilyExclusionResults.find(familyName);
+ if (iter != m_cachedFontFamilyExclusionResults.end())
+ return iter->value;
+
+ // FIXME: We should reconsider whether a node should be excluded if the primary font
+ // used to render the node changes, since this "icon font" heuristic may return a
+ // different result.
+ bool result = font.isProbablyOnlyUsedToRenderIcons();
+ m_cachedFontFamilyExclusionResults.set(familyName, result);
+ return result;
+}
+
void TextManipulationController::parse(ManipulationUnit& unit, const String& text, Node& textNode)
{
ExclusionRuleMatcher exclusionRuleMatcher(m_exclusionRules);
- bool isNodeExcluded = exclusionRuleMatcher.isExcluded(&textNode);
+ bool isNodeExcluded = exclusionRuleMatcher.isExcluded(&textNode) || shouldExcludeNodeBasedOnStyle(textNode);
size_t positionOfLastNonHTMLSpace = WTF::notFound;
size_t startPositionOfCurrentToken = 0;
size_t index = 0;
Modified: trunk/Source/WebCore/editing/TextManipulationController.h (263526 => 263527)
--- trunk/Source/WebCore/editing/TextManipulationController.h 2020-06-25 20:28:09 UTC (rev 263526)
+++ trunk/Source/WebCore/editing/TextManipulationController.h 2020-06-25 20:37:34 UTC (rev 263527)
@@ -159,6 +159,8 @@
ManipulationUnit createUnit(const Vector<String>&, Node&);
void parse(ManipulationUnit&, const String&, Node&);
+ bool shouldExcludeNodeBasedOnStyle(const Node&);
+
void addItem(ManipulationItemData&&);
void addItemIfPossible(Vector<ManipulationUnit>&&);
void flushPendingItemsForCallback();
@@ -178,6 +180,8 @@
WeakHashSet<Element> m_elementsWithNewRenderer;
WeakHashSet<Element> m_manipulatedElements;
+ HashMap<String, bool> m_cachedFontFamilyExclusionResults;
+
ManipulationItemCallback m_callback;
Vector<ManipulationItem> m_pendingItemsForCallback;
Modified: trunk/Source/WebCore/platform/graphics/Font.cpp (263526 => 263527)
--- trunk/Source/WebCore/platform/graphics/Font.cpp 2020-06-25 20:28:09 UTC (rev 263526)
+++ trunk/Source/WebCore/platform/graphics/Font.cpp 2020-06-25 20:37:34 UTC (rev 263527)
@@ -475,6 +475,16 @@
return *derivedFontData.brokenIdeographFont;
}
+#if !PLATFORM(COCOA)
+
+bool Font::isProbablyOnlyUsedToRenderIcons() const
+{
+ // FIXME: Not implemented yet.
+ return false;
+}
+
+#endif
+
#if !LOG_DISABLED
String Font::description() const
{
Modified: trunk/Source/WebCore/platform/graphics/Font.h (263526 => 263527)
--- trunk/Source/WebCore/platform/graphics/Font.h 2020-06-25 20:28:09 UTC (rev 263526)
+++ trunk/Source/WebCore/platform/graphics/Font.h 2020-06-25 20:37:34 UTC (rev 263527)
@@ -106,6 +106,8 @@
const Font* emphasisMarkFont(const FontDescription&) const;
const Font& brokenIdeographFont() const;
+ bool isProbablyOnlyUsedToRenderIcons() const;
+
const Font* variantFont(const FontDescription& description, FontVariant variant) const
{
#if PLATFORM(COCOA)
Modified: trunk/Source/WebCore/platform/graphics/FontPlatformData.cpp (263526 => 263527)
--- trunk/Source/WebCore/platform/graphics/FontPlatformData.cpp 2020-06-25 20:28:09 UTC (rev 263526)
+++ trunk/Source/WebCore/platform/graphics/FontPlatformData.cpp 2020-06-25 20:37:34 UTC (rev 263527)
@@ -84,4 +84,14 @@
}
#endif
+#if !PLATFORM(COCOA)
+
+String FontPlatformData::familyName() const
+{
+ // FIXME: Not implemented yet.
+ return { };
}
+
+#endif
+
+}
Modified: trunk/Source/WebCore/platform/graphics/FontPlatformData.h (263526 => 263527)
--- trunk/Source/WebCore/platform/graphics/FontPlatformData.h 2020-06-25 20:28:09 UTC (rev 263526)
+++ trunk/Source/WebCore/platform/graphics/FontPlatformData.h 2020-06-25 20:37:34 UTC (rev 263527)
@@ -155,6 +155,8 @@
TextRenderingMode textRenderingMode() const { return m_textRenderingMode; }
bool isForTextCombine() const { return widthVariant() != FontWidthVariant::RegularWidth; } // Keep in sync with callers of FontDescription::setWidthVariant().
+ String familyName() const;
+
#if USE(CAIRO)
cairo_scaled_font_t* scaledFont() const { return m_scaledFont.get(); }
#endif
Modified: trunk/Source/WebCore/platform/graphics/cocoa/FontCocoa.mm (263526 => 263527)
--- trunk/Source/WebCore/platform/graphics/cocoa/FontCocoa.mm 2020-06-25 20:28:09 UTC (rev 263526)
+++ trunk/Source/WebCore/platform/graphics/cocoa/FontCocoa.mm 2020-06-25 20:37:34 UTC (rev 263527)
@@ -659,4 +659,43 @@
return CTFontGetGlyphsForCharacters(platformData().ctFont(), codeUnits, glyphs, count);
}
+bool Font::isProbablyOnlyUsedToRenderIcons() const
+{
+ auto platformFont = platformData().font();
+ if (!platformFont)
+ return false;
+
+ // Allow most non-icon fonts to bail early here by testing a single character 'a', without iterating over all basic latin characters.
+ UniChar lowercaseACharacter = 'a';
+ CGGlyph lowercaseAGlyph;
+ if (CTFontGetGlyphsForCharacters(platformFont, &lowercaseACharacter, &lowercaseAGlyph, 1)) {
+ if (!CGRectIsEmpty(CTFontGetBoundingRectsForGlyphs(platformFont, kCTFontOrientationDefault, &lowercaseAGlyph, nullptr, 1)))
+ return false;
+ }
+
+ auto supportedCharacters = adoptCF(CTFontCopyCharacterSet(platformFont));
+ if (CFCharacterSetHasMemberInPlane(supportedCharacters.get(), 1) || CFCharacterSetHasMemberInPlane(supportedCharacters.get(), 2))
+ return false;
+
+ // This encompasses all basic Latin non-control characters.
+ constexpr UniChar firstCharacterToTest = ' ';
+ constexpr UniChar lastCharacterToTest = '~';
+ constexpr auto numberOfCharactersToTest = lastCharacterToTest - firstCharacterToTest + 1;
+
+ Vector<CGGlyph> glyphs;
+ glyphs.fill(0, numberOfCharactersToTest);
+ CTFontGetGlyphsForCharacterRange(platformFont, glyphs.begin(), CFRangeMake(firstCharacterToTest, numberOfCharactersToTest));
+ glyphs.removeAll(0);
+
+ if (glyphs.isEmpty())
+ return false;
+
+ Vector<CGRect> boundingRects;
+ boundingRects.fill(CGRectZero, glyphs.size());
+ CTFontGetBoundingRectsForGlyphs(platformFont, kCTFontOrientationDefault, glyphs.begin(), boundingRects.begin(), glyphs.size());
+ return notFound == boundingRects.findMatching([](auto& rect) {
+ return !CGRectIsEmpty(rect);
+ });
+}
+
} // namespace WebCore
Modified: trunk/Source/WebCore/platform/graphics/cocoa/FontPlatformDataCocoa.mm (263526 => 263527)
--- trunk/Source/WebCore/platform/graphics/cocoa/FontPlatformDataCocoa.mm 2020-06-25 20:28:09 UTC (rev 263526)
+++ trunk/Source/WebCore/platform/graphics/cocoa/FontPlatformDataCocoa.mm 2020-06-25 20:37:34 UTC (rev 263527)
@@ -181,4 +181,11 @@
#endif
+String FontPlatformData::familyName() const
+{
+ if (auto platformFont = font())
+ return adoptCF(CTFontCopyFamilyName(platformFont)).get();
+ return { };
+}
+
} // namespace WebCore
Modified: trunk/Tools/ChangeLog (263526 => 263527)
--- trunk/Tools/ChangeLog 2020-06-25 20:28:09 UTC (rev 263526)
+++ trunk/Tools/ChangeLog 2020-06-25 20:37:34 UTC (rev 263527)
@@ -1,3 +1,19 @@
+2020-06-25 Wenson Hsieh <[email protected]>
+
+ Text manipulation should exclude text rendered using icon-only fonts
+ https://bugs.webkit.org/show_bug.cgi?id=213446
+ <rdar://problem/63734298>
+
+ Reviewed by Myles Maxfield.
+
+ Add a new API test.
+
+ * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
+ * TestWebKitAPI/Tests/WebKitCocoa/Ahem.ttf: Added.
+ * TestWebKitAPI/Tests/WebKitCocoa/SpaceOnly.otf: Added.
+ * TestWebKitAPI/Tests/WebKitCocoa/TextManipulation.mm:
+ (TestWebKitAPI::TEST):
+
2020-06-25 Aakash Jain <[email protected]>
[ews] Share more bots between EWS builder and testers
Modified: trunk/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj (263526 => 263527)
--- trunk/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj 2020-06-25 20:28:09 UTC (rev 263526)
+++ trunk/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj 2020-06-25 20:37:34 UTC (rev 263527)
@@ -1130,6 +1130,8 @@
F4CD74C620FDACFA00DE3794 /* text-with-async-script.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = F4CD74C520FDACF500DE3794 /* text-with-async-script.html */; };
F4CD74C920FDB49600DE3794 /* TestURLSchemeHandler.mm in Sources */ = {isa = PBXBuildFile; fileRef = F4CD74C820FDB49600DE3794 /* TestURLSchemeHandler.mm */; };
F4CF32802366552200D3AD07 /* EnterKeyHintTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = F4CF327F2366552200D3AD07 /* EnterKeyHintTests.mm */; };
+ F4CFCDDA249FC9E400527482 /* SpaceOnly.otf in Copy Resources */ = {isa = PBXBuildFile; fileRef = F4CFCDD8249FC9D900527482 /* SpaceOnly.otf */; };
+ F4CFCDDB249FC9E900527482 /* Ahem.ttf in Copy Resources */ = {isa = PBXBuildFile; fileRef = F4CFCDD9249FC9D900527482 /* Ahem.ttf */; };
F4D2986E20FEE7370092D636 /* RunScriptAfterDocumentLoad.mm in Sources */ = {isa = PBXBuildFile; fileRef = F4D2986D20FEE7370092D636 /* RunScriptAfterDocumentLoad.mm */; };
F4D4F3B61E4E2BCB00BB2767 /* DragAndDropSimulatorIOS.mm in Sources */ = {isa = PBXBuildFile; fileRef = F4D4F3B41E4E2BCB00BB2767 /* DragAndDropSimulatorIOS.mm */; };
F4D4F3B91E4E36E400BB2767 /* DragAndDropTestsIOS.mm in Sources */ = {isa = PBXBuildFile; fileRef = F4D4F3B71E4E36E400BB2767 /* DragAndDropTestsIOS.mm */; };
@@ -1234,6 +1236,7 @@
55A81800218102210004A39A /* 400x400-green.png in Copy Resources */,
379028B914FAC24C007E6B43 /* acceptsFirstMouse.html in Copy Resources */,
725C3EF322058A5B007C36FC /* AdditionalSupportedImageTypes.html in Copy Resources */,
+ F4CFCDDB249FC9E900527482 /* Ahem.ttf in Copy Resources */,
1C2B81871C8925A000A5529F /* Ahem.ttf in Copy Resources */,
1A63479F183D72A4005B1707 /* all-content-in-one-iframe.html in Copy Resources */,
C25CCA0D1E5141840026CB8A /* AllAhem.svg in Copy Resources */,
@@ -1547,6 +1550,7 @@
46AE5A3720F9066D00E0873E /* SimpleServiceWorkerRegistrations-4.sqlite3 in Copy Resources */,
F4F405BD1D4C0D1C007A9707 /* skinny-autoplaying-video-with-audio.html in Copy Resources */,
C01A23F21266156700C9ED55 /* spacebar-scrolling.html in Copy Resources */,
+ F4CFCDDA249FC9E400527482 /* SpaceOnly.otf in Copy Resources */,
E194E1BD177E53C7009C4D4E /* StopLoadingFromDidReceiveResponse.html in Copy Resources */,
515BE16F1D428BB100DD7C68 /* StoreBlobToBeDeleted.html in Copy Resources */,
9BD6D3A21F7B218300BD4962 /* sunset-in-cupertino-100px.tiff in Copy Resources */,
@@ -2815,6 +2819,8 @@
F4CD74C820FDB49600DE3794 /* TestURLSchemeHandler.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = TestURLSchemeHandler.mm; sourceTree = "<group>"; };
F4CDAB3322489FE10057A2D9 /* UserInterfaceSwizzler.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = UserInterfaceSwizzler.h; sourceTree = "<group>"; };
F4CF327F2366552200D3AD07 /* EnterKeyHintTests.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = EnterKeyHintTests.mm; sourceTree = "<group>"; };
+ F4CFCDD8249FC9D900527482 /* SpaceOnly.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = SpaceOnly.otf; sourceTree = "<group>"; };
+ F4CFCDD9249FC9D900527482 /* Ahem.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = Ahem.ttf; sourceTree = "<group>"; };
F4D2986D20FEE7370092D636 /* RunScriptAfterDocumentLoad.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = RunScriptAfterDocumentLoad.mm; sourceTree = "<group>"; };
F4D4F3B41E4E2BCB00BB2767 /* DragAndDropSimulatorIOS.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = DragAndDropSimulatorIOS.mm; sourceTree = "<group>"; };
F4D4F3B71E4E36E400BB2767 /* DragAndDropTestsIOS.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = DragAndDropTestsIOS.mm; sourceTree = "<group>"; };
@@ -3533,6 +3539,7 @@
children = (
55A817FE218101DF0004A39A /* 100x100-red.tga */,
55A817FD218101DF0004A39A /* 400x400-green.png */,
+ F4CFCDD9249FC9D900527482 /* Ahem.ttf */,
C25CCA0C1E5140E50026CB8A /* AllAhem.svg */,
F4A9202E1FEE34C800F59590 /* apple-data-url.html */,
A1798B8A2243611A000764BD /* apple-pay-active-session.html */,
@@ -3723,6 +3730,7 @@
C9B4AD291ECA6EA500F5FEA0 /* silence-long.m4a */,
4656A75720F9054F0002E21F /* SimpleServiceWorkerRegistrations-4.sqlite3 */,
F4F405BB1D4C0CF8007A9707 /* skinny-autoplaying-video-with-audio.html */,
+ F4CFCDD8249FC9D900527482 /* SpaceOnly.otf */,
515BE16E1D4288FF00DD7C68 /* StoreBlobToBeDeleted.html */,
9BD6D3A11F7B202100BD4962 /* sunset-in-cupertino-100px.tiff */,
9BD6D3A01F7B202000BD4962 /* sunset-in-cupertino-200px.png */,
Added: trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/Ahem.ttf (0 => 263527)
--- trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/Ahem.ttf (rev 0)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/Ahem.ttf 2020-06-25 20:37:34 UTC (rev 263527)
@@ -0,0 +1,29 @@
+����������\x80����0OS/2xPJ\x8D����8������`cmap\xD6F����l����rgasp���� ����0\xB0������glyfI\xB3t\xDA����\xE0����dhead֢N������\xBC������6hhea
+������\xF4������$hmtx\xB9 ��}����\x98����\xD4loca u'"����&D����\xECmaxp��\xF8�� ���������� name~\x8C\xB8����(0����hpost\x8D\xD0\x8A����.\x98��������������BQg_<\xF5�� \xE8��������\xB3o_Y��������\xC0-\xABI����\xFF8\xE8 �������������������������� \xFF8����\xE8��������\xE8��������������������������������\xF5��������\xF5������������������������������������������������\xE8\x90������\xBC\x8A������\x8F\xBC\x8A����\xC5��2������ ������������\x80����\xAF�� H����������������W3C����@�� \xF0 \xFF8���� ��\xC8 ��@������ ������ ����\xE8��}��������\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8���
�\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����
\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8��
��\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\x
E8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8��������������������L��������������������&��
+���������������������������������������������������������������������������������������������������������������������������������������������� ������
+������+�������������������������������������� ��!��"��#��$��%��&��'��(��)��*��+��,��-��.��/��0��1��2��3��4��5��6��7��8��9��:��;��<��=��>��?��@��A��B��C��D��E��F��G��H��I��J��K��L��M��N��O��P��Q��R��S��T��U��V��W��X��Y��Z��[��\��]��^��_��`������a��b��c��d��e��f��g��h��i��j��k��l��m��n��o��p��q��r��s��t��u��v��w��x��y��z��{��|��}��~����\x80��\xDB��\x81��\x82��\x83��\x84��\xDD��\x85��\x86��\x87��\x88��\xE3��\x89��\x8A��\xEA��\x8B��\x8C��\xE8��\x8D��\xEB��\xEC��\x8E��\x8F��\xE4��\xE6��\xE5��\xD4��\xE9��\x90��\x91��\xD3��\x92��\x93��\x94��\x95��\x96��\xE7��\xD1��\xED��\xD2��\x97��\x98��\xDE����\x9A��\x9B��\x9C��\xCE��\xCF��\xD5��\xD6��\xD8��\xD9��\x9D��\x9E��\x9F��\xEE��\xA0��\xD0��\xE2��\xA1��\xE0��\xE1����������\xDC��\xA2��\xD7��\xDA��\xDF��\xA3��\xA4��\xA5��\xA6��\xA7��\xA8��\xA9��\xAA��\xAB��\xAC��\xAD������\xAE��\xAF��\xB0��\xB1��\xB2��\xB3��\xB4��\xB5��\xB6��\xB7��\xB8��\xB9��\xBA��\xBB��\xBC��&������N��@������&��~��\xFF1Sx\x92\
xC7\xC9\xDD\x94\xA9\xBC\xC0 " & 0 : D!"!&"""""""+"H"`"e"\xF2%\xCA\xF0\xFF\xFF������ ��(��\xA01Rx\x92\xC6\xC9\xD8\x94\xA9\xBC\xC0
& 0 9 D!"!&"""""""+"H"`"d"\xF2%\xCA\xF0��\xFF\xFF\xFF\xE3\xFF\xE2����\xFF\x81\xFF|\xFFX\xFF?����\xFD\xEC����\xFD>\xFD*\xFC\xD3\xFD\xDF\xFF\xE0\xC2����\xE0\xBC\xE0\xBB\xE0\xB8\xE0\xAF\xE0\xA7\xE0\x9E\xDF\xC1߭\xDE\xE2\xDE\xCC\xDE\xD6��������\xDE\xCAޥފއ\xDD\xFB\xDB$\xEF������������J��������������������������������������������������\xFE����������������������������������������������\xEC��\xEE��������������������������������������\x99��\x95��\x82��\x83��\xA1��\x8E��\xBD��\x84��\x8A��\x88��\x90��\x97��\x96��\xC4��\x87��\xB5��\x81��\x8D��\xC7��\xC8��\x89��\x8F��\x85��\xA2��\xB9��\xC6��\x91��\x98��\xCA��\xC9��\xCB��\x94��\x9A��\xA5��\xA3��\x9B��a��b��\x8B��c��\xA7��d��\xA4��\xA6��\xAB��\xA8��\xA9��\xAA��\xBE��e��\xAE��\xAC��\xAD��\x9C��f��\xC5��\x8C��\xB1��\xAF��\xB0��g��\xC0��\xC2��\x86��i��h��j��l��k��m��\x92��n��p��o��q��r��t��s��u��v��\xBF��w��y��x��z��|��{��\x9F��\x93��~��}����\x80��\xC1�
�\xC3��\xA0��\xB3��\xBC��\xB6��\xB7��\xB8��\xBB��\xB4��\xBA��\x9D��\x9E��\xD7��\xE6��\xC4��\xA2��\xE7��&������N��@������&��~��\xFF1Sx\x92\xC7\xC9\xDD\x94\xA9\xBC\xC0 " &am
p; 0 : D!"!&"""""""+"H"`"e"\xF2%\xCA\xF0\xFF\xFF������ ��(��\xA01Rx\x92\xC6\xC9\xD8\x94\xA9\xBC\xC0 & 0 9 D!"!&"""""""+"H"`"d"\xF2%\xCA\xF0��\xFF\xFF\xFF\xE3\xFF\xE2����\xFF\x81\xFF|\xFFX\xFF?����\xFD\xEC����\xFD>\xFD*\xFC\xD3\xFD\xDF\xFF\xE0\xC2����\xE0\xBC\xE0\xBB\xE0\xB8\xE0\xAF\xE0\xA7\xE0\x9E\xDF\xC1߭\xDE\xE2\xDE\xCC\xDE\xD6��������\xDE\xCAޥފއ\xDD\xFB\xDB$\xEF������������J��������������������������������������������������\xFE����������������������������������������������\xEC��\xEE��������������������������������������\x99��\x95��\x82��\x83��\xA1��\x8E��\xBD��\x84��\x8A��\x88��\x90��\x97��\x96��\xC4��\x87��\xB5��\x81��\x8D��\xC7��\xC8��\x89��\x8F��\x85��\xA2��\xB9��\xC6��\x91��\x98��\xCA��\xC9��\xCB��\x94��\x9A��\xA5��\xA3��\x9B��a��b��\x8B��c��\xA7��d��\xA4��\xA6��\xAB��\xA8��\xA9��\xAA��\xBE��e��\xAE
��\xAC��\xAD��\x9C��f��\xC5��\x8C��\xB1��\xAF��\xB0��g��\xC0��\xC2��\x86��i��h��j��l��k��m��\x92��n��p��o��q��r��t��s��u��v��\xBF��w��y��x��z��|��{��\x9F��\x93��~��}����\x80��\xC1��\xC3
��\xA0��\xB3��\xBC��\xB6��\xB7��\xB8��\xBB��\xB4��\xBA��\x9D��\x9E��\xD7��\xE6��\xC4��\xA2��\xE7��������}����k ��������3!%!!}\xEE\xFD\x8F\xF4\xFE \xFC\xE0}&������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\
xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC
\xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE
8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC
����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ����
��!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\x
FF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8����������1!!\xE8\xFC\xC8��������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC
\xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ��
����!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC��������������\xE8 ������!!\xE8\xFC \xFC\xE0����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC�
���������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\
xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\x
FF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC
\xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8
������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC��
��������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������
!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xF
F8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xF
C \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8
������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC
����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!
!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xFF8\xE8 ������!!\xE8\xFC \xFC������������������"��0��>��L��Z��h��v��\x84��\x92��\xA0��\xAE��\xBC��\xCA��\xD8��\xE6��\xF4,:HVdr\x80\x8E\x9C\xAA\xB8\xC6\xD4\xE2\xF0\xFE(6DR`n|\x8A\x98\xA6\xB4\xC2\xD0\xDE\xEC\xFA$2@N\jx\x86\x94\xA2\xB0\xBE\xCC\xDA\xE8\xF6 .<JXdr\x80\x8E\x9C\xAA\xB8\xC6\xD4\xE2\xF0\xFE(6DR`n|\x8A\x98\xA6\xB4\xC2\xD0\
xDE\xEC\xFA$2@N\jx\x86\x94\xA2\xB0\xBE\xCC\xDA\xE8\xF6 .<JXft\x82\x90\x9E
\xAC\xBA\xC8\xD6\xE4\xF2��*88FTbp~\x8C\x9A\xA8\xB6\xC4\xD2\xE0\xEE\xFC
+ & 4 B P ^ l z \x88 \x96 \xA4 \xB2 \xC0 \xCE \xDC \xEA \xF8
+
+
+"
+0
+>
+L
+Z
+h
+v
+\x84
+\x92
+\xA0
+\xAE
+\xBC
+\xCA
+\xD8
+\xE6
+\xF4,:HVdr\x80\x8E\x9C\xAA\xB8\xC6\xD4\xE2\xF0\xFE(6DR`n|\x8A\x98\xA6\xB4\xC2\xD0\xDE\xEC\xFA+++$+2������J����������������\x9E��������������������\x9E����������������\xA6���������������� \xB4����������������\xD4����������������\xDC����������������\xF2����������������\xCF\xFA��������������\xC9��������������\xCD��������������\xD4��������������\xE4��������������\xE8��������������\xF3��������������\xF7��������������\xFB������������������ ����\x9E���� ����\xA4���� ����\xAC���� ���� \xBA���� ����\xDA���� ����\xE2���� ����\xF8���� ���������� �������� ������M��o��s��t�� ��c��h��a��r��a��c��t��e��r��s�� ��a��r��e�� ��t��h��e�� ��e��m�� ��s��q��u��a��r��e��,�� ��e��x��c��e��p��t�� ��&��E��A��c��u��t��e�� ��a��n��d�� ��"��p��"��,�� ��w��h��i��c��h�� ��s��h��o��w�� ��a��s��c��e��n��t��/��d��e��s��c��e��n��t�� ��f��r��o�
�m�� ��t��h��e�� ��b��a��s��e��l��i��n��e��.�� ��U��s��e��f��u��l�� ��f��o��r�� ��t��e��s��t��i��n��g�� ��c��o��m��p��o��s��i��t��i��o��n�� ��s��y��s��t��e��m��s��.�� ��P��r��o��d��u��c��e��d�� ��b��y�� ��T��o��d��d�� ��F��a��h��r��n��e��r�� ��f��o��r�� ��t��h��e�� ��C��S��S�� ��S��a��m��u��r��a��i��'��s�� ��b��r��o��w��s��e��r�� ��t��e��s��t��i��n��g��.��A��h��e��m��R��e��g��u��l��a
��r��V��e��r��s��i��o��n�� ��1��.��1�� ��A��h��e��m��A��h��e��m��V��e��r��s��i��o��n�� ��1��.��1��A��h��e��mMost characters are the em square, except &EAcute and "p", which show ascent/descent from the baseline. Useful for testing composition systems. Produced by Todd Fahrner for the CSS Samurai's browser testing.AhemRegularVersion 1.1 AhemAhemVersion 1.1AhemAhemRegularAhem��M��o��s��t�� ��c��h��a��r��a��c��t��e��r��s�� ��a��r��e�� ��t��h��e�� ��e��m�� ��s��q��u��a��r��e��,�� ��e��x��c��e��p��t�� ��&��E��A��c��u��t��e�� ��a��n��d�� ��"��p��"��,�� ��w��h��i��c��h�� ��s��h��o��w�� ��a��s��c��e��n��t��/��d��e��s��c��e��n��t�� ��f��r��o��m�� ��t��h��e�� ��b��a��s��e��l��i��n��e��.�� ��U��s��e��f��u��l�� ��f��o��r�� ��t��e��s��t��i��n��g�� ��c��o��m��p��o��s��i��t��i��o��n�� ��s��y��s��t��e��m��s��.�� ��P��r��o��d��u��c��e��d�� ��b��y�� ��T��o��d��d�� ��F��a��h��r��n��e��r�� ��f��o��r�� ��t��h��e�� ��C��S��S�� ��S��a��m��u��r��a��i��'��s�� ��b��r��o��w��s��e��
r�� ��t��e��s��t��i��n��g��.��A��h��e��m��R��e��g��u��l��a��r��V��e��r��s��i��o��n�� ��1��.��1�� ��A��h��e��m��A��h��e��m��V��e��r��s��i��o��n�� ��1��.��1��A��h��e��m��A��h��e��m��R��e��g��u��l��a��r��A��h��e��m��������������\xFF{������������������������������������������\xF5�������������������� ������+��������������������������
������������ ��!��"��#��$��%��&��'��(��)��*��+��,��-��.��/��0��1��2��3��4��5��6��7��8��9��:��;��<��=��>��?��@��A��B��C��D��E��F��G��H��I��J��K��L��M��N��O��P��Q��R��S��T��U��V��W��X��Y��Z��[��\��]��^��_��`��a��b��c��d��e��f��g��h��i��j��k��l��m��n��o��p��q��r��s��t��u��v��w��x��y��z��{��|��}��~����\x80��\x81��\x83��\x84��\x85��\x86��\x88��\x89��\x8A��\x8B��\x8D��\x8E��\x90��\x91��\x93��\x96��\x97��\x9D��\x9E��\xA0��\xA1��\xA2��\xA3��\xA4��\xA9��\xAA��\xAC��\xAD��\xAE��\xAF��\xB6��\xB7��\xB8��\xBA��\xBD��\xC3��\xC7��\xC8��\xC9��\xCA��\xCB��\xCC��\xCD��\xCE��\xCF��\xD0��\xD1��\xD3��\xD4��\xD5��\xD6��\xD7��\xD8��\xD9��\xDA��\xDB��\xDC��\xDD��\xDE��\xDF��\xE0��\xE1��\xE8��\xE9��\xEA��\xEB��\xEC��\xED��\xEE��\xEF��\xF0��\xF1��\xF2��\xF3��\xF4��\xF5��\xF6����������\xB0��\xB1��\xBB��\xA6��\xA8��\x9F��\x9B��\xB2��\xB3��\xC4��\xB4��\xB5��\xC5��\x82��\xC2��\x87��\xAB��\xC6��\xBE��\xBF��\xBC��\x8C��\x98��\x9A��\x99��\xA5��\x92��\x9C��\x8F��\x94��\x95��\xA7��\xB9��\xD2��\xC
0��\xC1��NULLHTDEL��������������\xFF\xFF��
\ No newline at end of file
Added: trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/SpaceOnly.otf (0 => 263527)
--- trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/SpaceOnly.otf (rev 0)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/SpaceOnly.otf 2020-06-25 20:37:34 UTC (rev 263527)
@@ -0,0 +1,5 @@
+OTTO����\x80����@CFF \xBCP\x8D����\x88������\xE9DSIG����������t������FFTMdYDN����|������OS/2U\xFF_\xDA����0������`PfEd\xD1\xCC{\xB3����\x98������,cmap��+\xC6����$����Bhead\xF9\xEE}������\xCC������6hhea|#����������$hmtx\xD0��������\xC4������maxp��P������(������name\xB0\xCB
+ ����\x90����\x91post\xFF\x86��3����h������ ������������\xB9\x9DI_<\xF5��\xE8��������\xCDg\xECL��������\xCDg\xECL������������������������������������������ \xFF8��Z\xE8������������������������������������������������P����������\xE8\xF4������\x8A\xBC������\x8C\x8A\xBC����\xE0��1������ ������������������������������������������PfEd��\xC0�� �� \xFF8��Z�������������������������������� �� ����������\xAE����������������D��\x8A�������������� ��\xE3����������������\xFB��������������%N�������������� \x88��������������\xB4�������������� \xD9���� ������\x88�������� ������\xCF���� ������\xED���� ����J���� ����t���� ���� \x92���� ����\xC5��C��r��e��a��t��e��d�� ��b��y�� ��X��i��a��n��z��h��u�� ��W��a��n��g�� ��w��i��t��h�� ��F��o��n��t��F��o��r��g��e�� ��2��.��0�� ��(��h��t��t��p��:��/��/��f��o��n��t��f��o��r��g��e��.��s��f��.��n��e��t��)����Created by Xianzhu Wang with FontForge 2.0 (http://fontforge.s
f.net)����U��n��t��i��t��l��e��d��1����Untitled1����M��e��d��i��u��m����Medium����F��o��n��t��F��o��r��g��e�� ��2��.��0�� ��:�� ��U��n��t��i��t��l��e��d��1�� ��:�� ��1��4��-��3��-��2��0��1��3����FontForge 2.0 : Untitled1 : 14-3-2013����U��n��t��i��t��l��e��d��1����Untitled1����V��e��r��s��i��o��n�� ��0��0��1��.��0��0��0�� ����Version 001.000 ����U��n��t��i��t��l��e��d��1����Untitled1����������������
����������������������<�������������� ���������������� \xFF\xFF������ \xFF\xFF\xFF\xE1����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������\xFF\x83��2������������������������������������������
+Untitled1������+\xF8��\xF8\xF8\xF8\xF8\x8C\x8B\x8B\x8B\x8B��\xA6������\xA9����\xE1������E��N��WCreated by Xianzhu Wang with FontForge 2.0 (http://fontforge.sf.net)Untitled1Untitled1����������"3\x8B\xBD\xF8E\xBD\xBD\xBD\xF9\xB4\xBD\xBD\xFA\xF8\xA9\xFE\xBD\xFCw\xF8E\xF9\xB4\xFCE\xFFt\xFF\xFC\xF9a\xFF\xFEt��\xFC\xFE\xFA|\x8B\x8B
+����������������������������������ɉo1��������\xCDg\xE91��������\xCDg\xEB\xEB������������fcmt����������2013-3-14: Created.����������\xE8����\xE8����
\ No newline at end of file
Modified: trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/TextManipulation.mm (263526 => 263527)
--- trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/TextManipulation.mm 2020-06-25 20:28:09 UTC (rev 263526)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/TextManipulation.mm 2020-06-25 20:37:34 UTC (rev 263527)
@@ -1002,6 +1002,52 @@
EXPECT_STREQ("five", items[1].tokens[1].content.UTF8String);
}
+TEST(TextManipulation, StartTextManipulationExcludesTextRenderedAsIcons)
+{
+ auto delegate = adoptNS([[TextManipulationDelegate alloc] init]);
+ auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:NSMakeRect(0, 0, 400, 400)]);
+ [webView _setTextManipulationDelegate:delegate.get()];
+ [webView synchronouslyLoadHTMLString:@"<!DOCTYPE html>"
+ "<head>"
+ "<style>"
+ "@font-face {"
+ " font-family: Ahem;"
+ " src: url(Ahem.ttf);"
+ "}"
+ "@font-face {"
+ " font-family: SpaceOnly;"
+ " src: url(SpaceOnly.otf);"
+ "}"
+ ".Ahem { font-family: Ahem; }"
+ ".SpaceOnly { font-family: SpaceOnly; }"
+ ".Missing { font-family: Missing; }"
+ ".SystemUI { font-family: system-ui; }"
+ "</style>"
+ "</head>"
+ "<body>"
+ "<span class='Ahem'>one</span><span class='SpaceOnly'>two</span><span class='Missing'>three</span><span class='SystemUI'>four</span>"
+ "</body>"];
+
+ done = false;
+ [webView _startTextManipulationsWithConfiguration:nil completion:^{
+ done = true;
+ }];
+ TestWebKitAPI::Util::run(&done);
+
+ auto items = [delegate items];
+ EXPECT_EQ(items.count, 1UL);
+ auto item = items.firstObject;
+ EXPECT_EQ(item.tokens.count, 4UL);
+ EXPECT_WK_STREQ(item.tokens[0].content, "one");
+ EXPECT_FALSE(item.tokens[0].isExcluded);
+ EXPECT_WK_STREQ(item.tokens[1].content, "two");
+ EXPECT_TRUE(item.tokens[1].isExcluded);
+ EXPECT_WK_STREQ(item.tokens[2].content, "three");
+ EXPECT_FALSE(item.tokens[2].isExcluded);
+ EXPECT_WK_STREQ(item.tokens[3].content, "four");
+ EXPECT_FALSE(item.tokens[3].isExcluded);
+}
+
struct Token {
NSString *identifier;
NSString *content;