<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[163655] trunk</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/163655">163655</a></dd>
<dt>Author</dt> <dd>rniwa@webkit.org</dd>
<dt>Date</dt> <dd>2014-02-07 15:07:29 -0800 (Fri, 07 Feb 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>Revert <a href="http://trac.webkit.org/projects/webkit/changeset/154384">r154384</a> and <a href="http://trac.webkit.org/projects/webkit/changeset/154674">r154674</a> as they broke selection rect computations for text with ligatures.

Source/WebCore: 

* platform/graphics/Font.cpp:
(WebCore::Font::drawText):
(WebCore::Font::drawEmphasisMarks):
(WebCore::Font::selectionRectForText):
(WebCore::Font::offsetForPosition):
* platform/graphics/FontFastPath.cpp:
(WebCore::Font::getGlyphsAndAdvancesForSimpleText):
(WebCore::Font::selectionRectForSimpleText):
(WebCore::Font::offsetForPositionForSimpleText):
* platform/graphics/GlyphBuffer.h:
* platform/graphics/WidthIterator.cpp:
(WebCore::WidthIterator::WidthIterator):
(WebCore::WidthIterator::advanceInternal):
(WebCore::WidthIterator::advanceOneCharacter):
* platform/graphics/WidthIterator.h:

LayoutTests: 

* fast/text/partial-textruns-expected.html: Removed.
* fast/text/partial-textruns.html: Removed.
* fast/text/resources/PTS55F-webfont.ttf: Removed.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsFontcpp">trunk/Source/WebCore/platform/graphics/Font.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsFontFastPathcpp">trunk/Source/WebCore/platform/graphics/FontFastPath.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsGlyphBufferh">trunk/Source/WebCore/platform/graphics/GlyphBuffer.h</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsWidthIteratorcpp">trunk/Source/WebCore/platform/graphics/WidthIterator.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsWidthIteratorh">trunk/Source/WebCore/platform/graphics/WidthIterator.h</a></li>
</ul>

<h3>Removed Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsfasttextpartialtextrunsexpectedhtml">trunk/LayoutTests/fast/text/partial-textruns-expected.html</a></li>
<li><a href="#trunkLayoutTestsfasttextpartialtextrunshtml">trunk/LayoutTests/fast/text/partial-textruns.html</a></li>
<li><a href="#trunkLayoutTestsfasttextresourcesPTS55Fwebfontttf">trunk/LayoutTests/fast/text/resources/PTS55F-webfont.ttf</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (163654 => 163655)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2014-02-07 23:03:03 UTC (rev 163654)
+++ trunk/LayoutTests/ChangeLog        2014-02-07 23:07:29 UTC (rev 163655)
</span><span class="lines">@@ -1,3 +1,11 @@
</span><ins>+2014-02-07  Ryosuke Niwa  &lt;rniwa@webkit.org&gt;
+
+        Revert r154384 and r154674 as they broke selection rect computations for text with ligatures.
+
+        * fast/text/partial-textruns-expected.html: Removed.
+        * fast/text/partial-textruns.html: Removed.
+        * fast/text/resources/PTS55F-webfont.ttf: Removed.
+
</ins><span class="cx"> 2014-02-07  Brendan Long  &lt;b.long@cablelabs.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Update TextTrack API to current spec
</span></span></pre></div>
<a id="trunkLayoutTestsfasttextpartialtextrunsexpectedhtml"></a>
<div class="delfile"><h4>Deleted: trunk/LayoutTests/fast/text/partial-textruns-expected.html (163654 => 163655)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/text/partial-textruns-expected.html        2014-02-07 23:03:03 UTC (rev 163654)
+++ trunk/LayoutTests/fast/text/partial-textruns-expected.html        2014-02-07 23:07:29 UTC (rev 163655)
</span><span class="lines">@@ -1,37 +0,0 @@
</span><del>-&lt;html&gt;
-&lt;head&gt;
-&lt;style&gt;
-    @font-face {
-        font-family: PTSans;
-        src: url('resources/PTS55F-webfont.ttf') format(&quot;truetype&quot;);
-        font-weight: normal;
-        font-style: normal;
-    }
-    #sandbox { position: absolute; width: 400px; }
-    article { 
-        width: 400px;
-        font-family: PTSans;
-        font-size: 24px;
-        -webkit-font-kerning: normal;
-    }
-&lt;/style&gt;
-&lt;/head&gt;
-&lt;body&gt;
-&lt;div id=sandbox&gt;
-&lt;article&gt;
-This test is meant &lt;span id=selection&gt;to test if font metrics change when partially rendered. To test select multiple lines with the begin&lt;/span&gt; or end line being only partially selected. The test succedes if none of the letters in the partially selected lines shift compared to when they are not selected or the line fully selected.
-&lt;/article&gt;
-&lt;/div&gt;
-
-&lt;script&gt;
-    var selection = window.getSelection();
-    if (selection.rangeCount &gt; 0)
-        selection.removeAllRanges();
-    var selectionNode = document.getElementById(&quot;selection&quot;);
-    var range = document.createRange();
-    range.selectNode(selectionNode);
-    selection.addRange(range);
-&lt;/script&gt;
-
-&lt;/body&gt;
-&lt;/html&gt;
</del><span class="cx">\ No newline at end of file
</span></span></pre></div>
<a id="trunkLayoutTestsfasttextpartialtextrunshtml"></a>
<div class="delfile"><h4>Deleted: trunk/LayoutTests/fast/text/partial-textruns.html (163654 => 163655)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/text/partial-textruns.html        2014-02-07 23:03:03 UTC (rev 163654)
+++ trunk/LayoutTests/fast/text/partial-textruns.html        2014-02-07 23:07:29 UTC (rev 163655)
</span><span class="lines">@@ -1,35 +0,0 @@
</span><del>-&lt;html&gt;
-&lt;head&gt;
-&lt;style&gt;
-    @font-face {
-        font-family: PTSans;
-        src: url('resources/PTS55F-webfont.ttf') format(&quot;truetype&quot;);
-        font-weight: normal;
-        font-style: normal;
-    }
-    #sandbox { position: absolute; width: 400px; }
-    article { 
-        width: 400px;
-        font-family: PTSans;
-        font-size: 24px;
-        -webkit-font-kerning: normal;
-    }
-&lt;/style&gt;
-&lt;/head&gt;
-&lt;body&gt;
-&lt;div id=sandbox&gt;
-&lt;article id=article&gt;This test is meant to test if font metrics change when partially rendered. To test select multiple lines with the begin or end line being only partially selected. The test succedes if none of the letters in the partially selected lines shift compared to when they are not selected or the line fully selected.&lt;/article&gt;
-&lt;/div&gt;
-&lt;script&gt;
-    var selection = window.getSelection();
-    if (selection.rangeCount &gt; 0)
-        selection.removeAllRanges();
-    var article = document.getElementById(&quot;article&quot;);
-    var range = document.createRange();
-    range.setStart(article.firstChild, 19);
-    range.setEnd(article.firstChild, 119);
-    selection.addRange(range);
-&lt;/script&gt;
-
-&lt;/body&gt;
-&lt;/html&gt;
</del><span class="cx">\ No newline at end of file
</span></span></pre></div>
<a id="trunkLayoutTestsfasttextresourcesPTS55Fwebfontttf"></a>
<div class="delfile"><h4>Deleted: trunk/LayoutTests/fast/text/resources/PTS55F-webfont.ttf (163654 => 163655)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/text/resources/PTS55F-webfont.ttf        2014-02-07 23:03:03 UTC (rev 163654)
+++ trunk/LayoutTests/fast/text/resources/PTS55F-webfont.ttf        2014-02-07 23:07:29 UTC (rev 163655)
</span><span class="lines">@@ -1,403 +0,0 @@
</span><del>- FFTMZp\xB8\xDB,GDEF\xF2&amp;H8GPOS;\xB9[8\x80\xEEGSUB5\xCEN\xB0p@OS/2\x9Cg\x84Y\xB0`cmap\xDB:\xF6\xDAcvt 
-I\xEC(fpgm\xB4/\xA7egasp| glyf\xF1\xB5X\x88Y0head\xF7\xF2R -`\xB86hheavV`\xF0$hmtx\xF41xa,loca\xEB\xC7&quot;c@maxp\xC5\xD8dX name#\x82@Jdx\xB8post\xBF\x9A\xE9 f0prep]ʻyh8@\xC7\xFE\xB0\xDF\xC99\xFC\xC99\xFF0        \x85\x86\x87\x88\x8A
-`zcyrlgrek.latn&lt;BSH CHU \xFF\xFF\xFF\xFFMOL ROM \xFF\xFFcasecpsp&quot;0&gt;N
-R\xA4#=h#\x8D\xA4yz\xCD &gt;@^`
-&lt;&gt;cyrlgreklatn(\xFF\xFF\xFF\xFF\xFF\xFF\xD4\x903\xCD\x9A3\xCD\xCDf \xA0\xEFP KPARA@ \xFB\xFE\x9A'5 \x97\x9A \xD4\xB8* 
-~\xA0\xA3\xA5\xA9\xAE\xB4\xBA 
-    &quot; &amp; / _ \xAC!&quot;\xE0\xFB\xFF\xFF \xA0\xA2\xA5\xA9\xAD\xB4\xBA     &quot; &amp; / _ \xAC!&quot;\xE0\xFB\xFF\xFF\xFF\xE3\xFF\xC2\xFF\xC1\xFF\xC0\xFF\xBD\xFF\xBA\xFF\xB5\xFF\xB0\xE0k\xE0f\xE0c\xE0a\xE0]\xE0Z\xE0R\xE0#\xDF\xD7\xDFb \x85\x85        
- - !&quot;#$%&amp;'()*+,-./0123456789:;&lt;=&gt;?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`acdhf\x84iej\x80byz}~{|\x83\x86\x87\xFEf\x9A\x8F\xAA\x8A\xAE\x80\x87\x98\x95\x93\x91\x9D\x9F\xA5\xA2\xACi\xB0,\xB0K\xB0*PX\xB0JvY\xB0#?\xB0+X=YK\xB0*PX}Y ԰.-\xB0, ڰ +-\xB0,KRXE#Y!-\xB0,i \xB0@PX!\xB0@Y-\xB0,\xB0+X!#!zX\xDD\xCDYKRXX\xFD\xEDY#!\xB0+X\xB0FvYX\xDD\xCDYYY-\xB0, -\Z-\xB0,\xB1&quot;\x88PX\xB0 \x88\\\xB0Y-\xB0,\xB1$\x88PX\xB0@\x88\\\xB0Y-\xB0, 9/-\xB0        , }\xB0+X\xC4\xCDY \xB0%I# \xB0&amp;J\xB0PX\x8Ae\x8Aa \xB0PX8!!Y\x8A\x8Aa \xB0RX8!!YY-\xB0
-,\xB0+X!!Y-\xB0 , Ұ +-\xB0 , /\xB0+\X  G#Faj X db8!!Y!Y-\xB0 -,  9/ \x8A G\x8AFa#\x8A \x8A#J\xB0PX#\xB0RX\xB0@8!Y#\xB0PX\xB0@e8!YY-\xB0,\xB0+X=\xD6!! ֊KRX \x8A#I \xB0UX8!!Y!!YY-\xB0,# \xD6 /\xB0+\X# XKS!\xB0YX\x8A\xB0&amp;I#\x8A# \x8AI\x8A#a8!!!!Y!!!!!Y-\xB0, ڰ+-\xB0, Ұ+-\xB0, /\xB0+\X  G#Faj\x8A G#F#aj` X db8!!Y!!Y-\xB0, \x8A \x8A\x87 \xB0%Jd#\x8A\xB0 PX&lt;\xC0Y-\xB0,\xB3@@BBK\xB8cK\xB8c \x8A \x8AUX \x8A \x8ARX#b \xB0#Bb \xB0#BY \xB0@RX\xB2 CcB\xB2 CcB\xB0 c\xB0e!Y!!Y-\xB0,\xB0Cc#\xB0Cc#-\xFF\xFFf\x9A\x9A&quot;*E^hx\x94\x9D\xA5\xB6\xC1\xC9\xE2\xEC\xFD!):HQbg!!                        7        3532654&amp;+2+57#3353#&quot;'23254&amp;54327&amp;#&quot;7632&quot;&amp;#&quot;273&amp;=4'&quot;&quot;5432354#&quot;'#35632732'4&amp;'&amp;54327&amp;#&quot;2#&quot;'73254#&quot;432#&quot;7#&quot;54;7&amp;#&quot;3273532654&amp;+2+5632&quot;&amp;#&quot;273&amp;=4'&quot;&quot;543237&amp;#&quot;#'#354;2;632&quot;&amp;#&quot;2733&amp;=4'&quot;&quot;'43237#3353##'32?##'3532'4#&quot;#'#2#&quot;'54#&quot;'354&amp;#&quot;3267'2#4f4\xFA\xCC)\xFEq\xFEqg\x94\xFElg\x8F\x8Fg\xFEj\x96\xFC  
-j?D
-%
-          -
-  
-X
-
- -
-
- 
-
-        P))) -(
-E  
-3
-
-  
-F  - 
-  - N@
-
- %
-        
-
-\ '  - \x9A\xFAf\xF6\xFEC\xBDg\xFE&gt;\xFE=f\xBC\xFEDf\xC3\xC2\xFB\xA8
-        
- &gt;&gt;) 
-        
- ( !         8# 
- -
-++)
- -
-        
-
- (-         8#
- (? &gt;&gt;8
- 4
-
-/         
- ) \xE1\xFF\xE7\xCF\x9A Q\xB2        +\xB4+\xB2 -+\xB0/\xB0ִ+\xB4+\xB3+\xB1 \xE9\xB0 /\xB1\xE9\xB1+\xB1 \xB1        99\xB1 -\xB090174632#&quot;&amp;3#\xE1@57BB75@#\xAA#d^7@?85BB\xAA\xC7\xFD9\xFE\x97\xFF\xFF\xB8H\x9A'
-\xF0
-9w\xE5#O\xB0/\xB3$3\xB1\xE9\xB3$2\xB2
-+\xB3@        +\xB2222\xB0/\xB3$3\xB1\xE9\xB3        
- -$2\xB2
-+\xB3@        +\xB2 222\xB0 /\xB1!+\xB06\xBA&gt;H\xF1C+
-\xB0.\xB0.\xB0\xB1\xF9\xB0\xB1\xF9\xBA&gt;H\xF1C+
-\xB0.\xB0 .\xB0\xB1\xF9\xB0 \xB1 \xF9\xB0\xB3+\xB3+\xB3+\xB0\xB3        +\xB0\xB3
- +\xB0\xB3 - +\xB3 +\xB3 +\xB3 +\xB0\xB3 +\xB0\xB3+\xB0\xB3+\xB0\xB3+\xB0\xB3 +\xB3 +\xB0\xB3+@        
- -........................\xB0@0173#733333#3####73#9\xA2?\x97\x9AN\x8DN\xD7N\x8EN\x9D \x9C@\x96!\x93P\x8DO\xD7O\x8EP\xAC\xD7@\xD7̓ \x83D\xFE\xBCD\xFE\xBC\x83\xFE\xF4\x83\xFE\xAAV\xFE\xAAV\x83 \x9C\xFF3\xDBf%,5\xF2\xB06/\xB0
-ְ2\xB1&amp;\xE9\xB0&amp;\xB1+\xB1 -&quot;22\xB45+\xB0) \xD6\xB4+\xB1 22\xB05\xB10+\xB1\xE9\xB17+\xB06\xBA\xE1\x9Bǭ+
-\xB0).\xB0\xC0\xB1\xF9\xB03\xC0\xB33+\xBA\xE1\x89Ƿ+ \xB33+\xB0)\xB3)+\xBA\xE1\xC7\xF9+ \xB3)+\xB0\xB343+\xB353+\xB2) \x8A \x8A#9\xB239\xB049@
-)534..........\xB534......\xB0@\xB1&amp;
-\xB09\xB10\xB19901?.546753.'#5.&gt;54.'\x9C7)\x8Dg=z^9\xA6\xA8\x8Bh\x8561)sV?e=\xB2\xAE\x8Bq\xAE{pTmW^y#9N-)\x95()E`\x84Z\x93\xBD\xBA\xB4\x90 \xFE!Lb\x83X\xA0\xCF\xBD\xB4#DXo-\xC1 w\xFB\xE5uk1N=1\xFF\xFF\x8F\xFF\xE7\xE5\xB4&amp;j5'j\xFD\x8A\x81\xF2\xFF\xE7\xE5\xB27LX\xB23+\xB0,3\xB1=\xE9\xB2 -+\xB1V\xE9\xB3 3 -+\xB0Y/\xB0ֱ8\xE9\xB08\xB1+\xB1M\xE9\xB0M\xB1S+\xB4C+\xB0\xB1!+\xB1Z+\xB06\xBA\xCBUۤ+
-\xB0\xB0F\xC0\xB1P\xF9\xB0\xC0\xBÀد+
-\xB0E\xB0D\xC0\xB1\xF9\xB0\xC0\xBA7;ߪ+
-\xB0\xB0\xC0\xB1%\xF9\xB0#\xC0\xB0&amp;\xB1 !.\xC9\xB1! .ɰ6\xBA;\xE0\xE9f+
-\xB1\xB0 \xB0\xC0\xB0!\xB0#\xC0\xB1\xB0P\xB3P+\xB1P\xB0\xB3+\xBA\xCD\\xD8\xDE+ \xB3+\xBA7\xFF\xE1+ \xB0\xB3+\xBA;\xF2\xE9\x94+ \xB0\xB3 +\xBA:\xAF\xE6w+ \xB0#\xB3&quot;#!+\xBA7;ߪ+ \xB0%\xB3$%#+\xBA\xCB\ۚ+ \xB0\xB3GF+\xB3HF+\xB2HF \x8A \x8A#9\xB0G9\xB2 \x8A \x8A#9\xB2 \x8A \x8A#9\xB2$%#9\xB2  \x8A \x8A#9\xB2&quot;#! \x8A \x8A#9@DEHP&quot;#$%FG...................@DEHP&quot;#$%FG...................\xB0@\xB1SM\xB3 -3=$9\xB0\xB0B9\xB1=3\xB0+9\xB0 \xB4&amp;.8$9\xB0V\xB199014&gt;7.54&gt;32&gt;7&amp;'#&quot;.732&gt;7&amp;/.'&gt;54&amp;#&quot;\xF29b}D1H!GqPTsE\x85\x90!X1e33-+# -89+F;8fm\x8B%Xn\x85P`\xABK\xA45\wA3aVG;:m4Y7_H&amp;\xDF3)mS?NJER\x95k)J\x93V1^J-+EV.V\xB6T;}&gt;y&lt;4KTZ);#`d])&lt;+&quot;s5\x8A%D5!6h\x98f?eC%)6;F\x8CF\x801)V`o\xEA=y&lt;Fs+BQJ\xB8X\x9A*\xB2+\xB4 +\xB0/\xB0ֱ\xE9\xB1\xE9\xB4+\xB1+013\xB8\xA0?\x8C\xFEt{\xFE=9\xB2\xB2+\xB0/\xB0ֱ \xE9\xB1+014&gt;7.{%R\x85`bRlBDmKh^\x83P%\xF2q\xF9\xFC\xF2hHh\xDF\xE6\xE3hb\xE8\xE7\xDEZLb\xEC\xF8\xFC\xFE=\xC3\xB2\xB2 +\xB0/\xB0ֱ\xE9\xB1+01&gt;54.'7Ro?!DjLi^\x83P%%R\x85a\xFE\x85h\xE2\xE5\xE2hb\xE6\xE9\xDDZLb\xEC\xF7\xFCsq\xFA\xFB\xF2iR\x9A{\xB8P\xB0/\xB03\xB0/\xB133\xB4$+\xB02\xB0/\xB0
-3\xB0/\xB0ִ+\xB0\xB1+\xB02\xB1 +\xB02\xB1+\xB06\xB0&amp;\xB1.\xC9\xB1.\xC9\xB1
- .\xC9\xB1
-.ɰ6\xB0&amp;\xB1.\xC9\xB1.\xC9\xB1.\xC9\xB1.ɰ6\xBA\xC8\xD2ߓ+ \xB0\xB3+\xBA7C߷+ \xB0\xB3  +\xBA\xC8\xD2ߓ+ \xB0\xB3+\xB0\xB3+\xBA7C߷+ \xB0\xB3 +\xB0\xB3
-+\xB2
- \x8A \x8A#9\xB2 9\xB0 9\xB2 \x8A \x8A#9\xB09\xB29\xB5 ......\xB5 ......\xB0@\xB1\xB3 -$9\xB1\xB3 -$9\xB0\xB1990153/7?73#'/'?Rf\5d3%+1c5_\x8Cb^\x83^/`6/'3f7VwmrZ^9VrtR5XbrbP9V}wV9VVR\xFA\xB6o U\xB0/\xB03\xB1\xE9\xB02\xB2
-+\xB3@
-        +\xB2
-+\xB3@        +\xB0 /\xB0
-ְ2\xB4        7+\xB02\xB2        
-
-+\xB3@                +\xB2
-        
-+\xB3@
-        +\xB1 -+015!3!!#Rh\x94h\xFE\x98\x94j\x94q\xFE\x8F\x94\xFE\x90pV\xFE\xCFh\xC75\xB2+\xB4 +\xB0/\xB0ִ+\xB2
-+\xB3        +\xB1+\xB1 \xB0901&gt;5#&quot;&amp;54632VJG)8B3?P)AN'\xE1x&gt;751&gt;ZVJoP3 yh\x9A&quot;\xB0/\xB1\xE9\xB1\xE9\xB0/\xB1+\xB4        +\xB1+015!y\xEF\x98\x98d\xFF\xE7R\xD5 5\xB2        +\xB4+\xB2        +\xB4+\xB0 /\xB0ִ+\xB4+\xB1 -+0174632#&quot;&amp;d@57BB75@^7@?85BB\xFF\xB4\xFE\xE1!\xB2B\xB2+\xB0/\xB0/\xB0ֱ+\xB1+\xB06\xB0&amp;\xB1.\xC9\xB1.\xC9\xB1.\xC9\xB1.ɰ6\xB0@01L\xEC\x81\xFD\xE5\x979\xF9hX\xFF\xE7\xB2 D\xB2        +\xB1\xE9\xB2+\xB1\xE9\xB0/\xB0ֱ \xE9\xB0 \xB1+\xB1\xE9\xB1+\xB1 \xB1        99\xB1\xB1990132#&quot;324.#&quot;X\xF0\xE5\xF8\xDF\xF0\xE7\xF4\xE1\xAA#JpN\x9C\x91GsT\x9A\x91\xCDqt\xFE\x92\xFE\x89\xFE\x8F\xFE\x8B\x86`\x85۞X!5\x83ݠV\xFE\xDD\x8F\xB4\xB2 D\xB2+\xB1\xE9\xB02\xB2+\xB0 -/\xB0ֱ\xE9\xB2
-+\xB3@        +\xB2
-+\xB3@        +\xB1+\xB1\xB1
-99013!!5!7\x8F\xC3J\xFD)R\xE1V\\xFA昘\xDFya\xA1\xAE\xB2!L\xB2+\xB1\xE9\xB2+\xB1 \xE9\xB0&quot;/\xB0ֱ\xE9\xB2
-+\xB3@        +\xB1#+\xB1\xB2999\xB0 \xB2999\xB0\xB0901357&gt;54&amp;#&quot;'&gt;327!m?\x89\x85mAruN\x936CH\xC4qX\x87^1O\x81\xA0Pd\x83\xBE;uF\xAA\xBE\xC5\xC0Vd\x86@)u=F3^\x81Lm\xE3\xE5\xDBcX\x98\xB4\xFF\xE7\xC7\x9A%\x8A\xB2#+\xB1\xE9\xB2+\xB1\xE9\xB4 # -+\xB1\xE9\xB0&amp;/\xB0        ֱ\xE9\xB1'+\xB06\xBA5Mܓ+
-\xB0\xB0\xC0\xB1\xF9\xB0\xC0\xB3....\xB3....\xB0@\xB1        \xB09\xB1#\xB09\xB0 \xB199\xB0\xB199\xB1\xB0901?32&gt;54&amp;+57!5!7#&quot;&amp;\xB4+/\x81PFwV1\xAA\x96\x97'^\x85\xFEj\xDB\xFE\xBBHFR\x8Bf:N\x85\xB5d\\x94\x91)PnB\x8F\x8B&lt;\xC6[\x98&lt;\xFE&lt;8h\x92\o\xABu&gt;)1\xB0
-h\xB2        +\xB2+\xB4
-          -+\xB03\xB1
-\xE9\xB02\xB0/\xB0        ְ -2\xB1\xE9\xB02\xB2        
-+\xB3@        +\xB2        
-+\xB3@                +\xB1+\xB1        \xB2999\xB1
-\xB1 99\xB0\xB19901533##%7!7#)\xA8n\xF2\xF2\x9F\xFEC\x90-H\xFE\xE0\xB8D\xB4\xFC\x98\x90\xFEH\xB8\xBE\xA8\x8B\xFEy\x9E\xFF\xE7\x9E\x9Ae\xB2+\xB1\xE9\xB2 +\xB1\xE9\xB4
- -+\xB1\xE9\xB0/\xB0 ִC+\xB2
-+\xB3@        +\xB0\xB1+\xB1\xE9\xB1+\xB1\xB2
-999\xB1\xB09\xB0
-\xB19901?32654&amp;#!!7#&quot;&amp;\x9E+/lP\x8D\xB9\xB6\xA0\xAC\xFEX\xCB\xEAN\x85\xB4g\\x8C\xA4\x9B\x96\x93
-Ř\xFEh\xDE\xCEs\xB2w&gt;{\xFF\xE7\xF0\xB2-Z\xB2+\xB1 \xE9\xB2+\xB1\xE9\xB4( -+\xB1\xE9\xB0./\xB0ֱ\xE9\xB0\xB1%+\xB1\xE9\xB1/+\xB1%\xB3 $9\xB0\xB09\xB1( \xB2 999014&gt;7&gt;32#&quot;.732&gt;54&amp;#&quot;{h\xB9\xFC\x93#s\xBC\x8EZ!\x9Bq\xC1\xDB:n\xA4if\xA4w?\xA0&quot;JmI;aF'\x88\x8Dd\x92\xE1\xCBV\xFE\x9E\x83s\xA8\xD1n7\\xDD\xC7^\xA6}HB\x81\xBCg?|`;-Nn@\x91\x94c=}\xD5\x9AU\xB2+\xB03\xB2+\xB1\xE9\xB0        /\xB1
-+\xB06\xBA:\xD6\xE6\xCF+
-\xB0.\xB0\xC0\xB1
-\xF9\xB0\xC0\xB1..\xB3....\xB0@\xB1\xB09015!#7}X\xFD\xB2\xA6Zx\x988\xFA\x9E\xB0d\x8B\xFF\xE7\xD1\xB2#5E`\xB2+\xB1)\xE9\xB2 -+\xB1A\xE9\xB0F/\xB0ֱ$\xE9\xB0 \xD6\xB16\xE9\xB0$\xB1&gt;+\xB1\xE9\xB0. \xD6\xB1\xE9\xB1G+\xB1&gt;6\xB5 -)3$9\xB1A)\xB53;$901467.54&gt;32#&quot;.732&gt;54.'&gt;54&amp;#&quot;\x8B\x87\x903XD'7i\x91\V\x8C`5j{5`H)9o\xA0fb\x98h6\xA0!Aa?3^H+1Pf8}j!-Lb5\X\x81Z7V&gt;V\x81\xBFMDVjFP\x83^51VwGu\xB2VJZqGX\x92h&lt;:b\x85b1ZA';\==]L=F\xAC\x989YE&lt;H\x8BThq%9Lj\xFF\xE7\xE1\xB2+^\xB2 -+\xB1\xE9\xB2+\xB1)\xE9\xB4 - -+\xB1\xE9\xB0,/\xB0ֱ\xE9\xB0\xB1#+\xB1\xE9\xB1-+\xB1\xB09\xB0#\xB3 -$9\xB1\xB09\xB0)\xB199014&gt;32'&gt;7#&quot;.732676754.#&quot;j:n\xA6o\xD1\xE9h\xB8\xFC\x94%w\xBF\x89V7\x85mT\x95sB\xAA\x9A}d\x90#FqK}\x8C\xE7b\xA9{E\xFE\xF2\xF6\xE7\xFE\xA6\xEE\x85\x83g\x9C\xC7tB27j\x9Cu\x91\x92B5+J\x89l&gt;\x9E\xBA\xFF\xE7\xA8 ;\xB2        +\xB4+\xB2+\xB4+\xB0/\xB0ְ 2\xB4+\xB02\xB4+\xB1+0174632#&quot;&amp;4632#&quot;&amp;\xBA@57BB75@@57BB75@^7@?85BBo7??75BB\xA8\xFE\xCF\xBA[\xB2+\xB4 +\xB2+\xB4+\xB0 /\xB0ִ+\xB02\xB0\xB4+\xB0/\xB2
-+\xB3        +\xB1!+\xB1\xB199\xB1 \xB0901&gt;5#&quot;&amp;546324632#&quot;&amp;\xA8JG)8B3?P)AN'?57BA85?\xE1x&gt;751&gt;ZVJoP3 \xC97??75BBV\xAC\xB4\x85M\xB0/\xB0        /\xB0ֱ
-+\xB06\xB0&amp;\xB1.\xC9\xB1.ɰ6\xBA!_\xC9d+
-\xB0\xB0\xC0\xB0\xB0\xC0\xB1..\xB1..\xB0@015VN\xFE\xBB\xB9\xF1Nq;\xD9\xFE\xD7NA\xFE\xD9{R\xC1\xB6\xA8\xB0/\xB1\xE9\xB0/\xB1\xE9\xB0/\xB1        +015!5!Rd\xFC\x9Cd\xC1\x93\x93S\x94\x94V\xAC\xB4\x85\x83\xB0/\xB0/\xB0        /\xB0ְ2\xB1
-+\xB06\xB0&amp;\xB1.\xC9\xB1.ɰ6\xBA!_\xC9d+
-\xB0\xB0\xC0\xB0\xB0\xC0\xB0&amp;\xB1.\xC9\xB1.ɰ6\xBA\xE0        Ȏ+
-\xB0\xB0\xC0\xB0\xB0\xC0\xB3....\xB3....\xB0@017'7'VN\xFC\xFAN溸}\xFE&lt;&lt;\xFE'})NAL\xFF\xE71\xB2 ,\xD2\xB2*+\xB4$+\xB2+\xB1\xE9\xB0-/\xB0ִ++\xB3!+\xB4'+\xB0\xB1+\xB1\xE9\xB1.+\xB06\xBA2&gt;\xD8[+
-\xB0\xB0\xC0\xB1 - -\xF9\xB0
-\xC0\xB3
-+\xB0\xB3+\xB3+\xB2 \x8A \x8A#9\xB09\xB2
-9\xB6
- -.......\xB6
- -.......\xB0@\xB1\xB2$*999\xB0'\xB09\xB1$\xB2 999\xB0\xB0901&gt;32#&amp;=4&gt;54&amp;#&quot;4632#&quot;&amp;LN\xACZ\x89\-7T`T8\x873LXL3lJ\x987\x87@57BB75@L/73Z{F\\x89qbm~W
- -V\x83l^alF^w3#\xFB\x917@?85BB\xB2\xFEf\xD1\xB2Pa\xBF\xB2L+\xB1E\xE9\xB2+\xB1;\xE9\xB4TL -+\xB013\xB1\xE9\xB02\xB4%]L -+\xB1%\xE9\xB0b/\xB0ִ@C+\xB0@\xB1 +\xB1Q\xE9\xB0Q\xB1+\xB4.7+\xB0.\xB16+\xB4
-C+\xB1c+\xB1Q@        %;ELT]$9\xB0.\xB3(HYZ$9\xB06\xB3)*I$9\xB1EL\xB0I9\xB0\xB0H9\xB1]T@        
- .6@$9\xB0%\xB2()*999014,32#&quot;&amp;5467##&quot;.54&gt;327332&gt;54.$#&quot;3267#&quot;$&amp;%32&gt;7.#&quot;\xB2\x9A\ø;\xE8\x85Z\x9A\xCDrVgM`m;1[A'V\x91\xC3lLZ+FFi
-
-&quot;+F\x89kCj\xC1\xFE\xF6\xA0\xA6\xFE\xDC\xD7}p\xD1#\xB2;\x98&gt;)\\x9CZ\xBE\xFE\xB1\xF7\x90iAV)XVN=#E5P\x8Cd;\xE3\xDFi\xFE\x89l\xCB\xFEۺ\x83\xF0\xB4mJd,/\J/+RqG\x83\xFE\xC5y-!@\xFD\xB45T!3/I\x87\xBFw\x9E\xF1\xA6V{\xD9\xFEѲ\xB6\xFE\xE1\xC5f\x83's\xE1NPPp5\s;N)a\x99\xBF\x9E\xB0 -\xB1\xB2+\xB2333\xB2+\xB03\xB4 -+\xB0        3\xB1\xE9\xB02\xB0/\xB1+\xB06\xBA;\xF7\xE9\xA3+
-\xB0.\xB0.\xB0\xB1\xF9\xB0\xB1\xF9\xBA\xC4\xE9\x90+
-\xB0.\xB0.\xB0\xB1\xF9\xB0\xB1
-\xF9\xB3
-+\xB0\xB3+\xB0
-\xB3        
-+\xB0
-.@         
-...........\xB0@\xB1\xB0 90133#!!'#N!\xB2\x94\xFD\xF0\x90\xC7\xA6\xA033\xB0\xFAP\x8D\xFEs!\xB4\xD9\xDD\xAE\xFF\xF09\xAA.@v\xB2+\xB1#\xE9\xB2+\xB1=\xE9\xB4/. -+\xB1/\xE9\xB0A/\xB0ֱ\xE9\xB0/2\xB0\xB1(+\xB1\xE9\xB08 \xD6\xB1        \xE9\xB1B+\xB18\xB3#$9\xB1#\xB09\xB0.\xB09\xB0/\xB199\xB0=\xB0        9\xB0\xB09017&gt;32+&quot;.732&gt;54.+53267&gt;54.#&quot;\xAEL\xC9vP\xA6\x87X BfF=qV5\\x95\xC1dR/gf\x836=BB{^7Cm\x87D\xB2k#b 1WC'3Vo9Dp
-\x83 K\x88j3k\F
-2VzTo\xA2f1
-\x91CcCTg9\x90/@T1DX5s\xFF\xE7D\xB2 =\xB2+\xB1\xE9\xB2+\xB1 \xE9\xB0!/\xB0ֱ\xE9\xB1&quot;+\xB1\xB09\xB0 \xB2        999\xB0\xB09014&gt;32&amp;#&quot;3267#&quot;.sl\xB2\xDEr{\x9C7)b\xB6T\xA4\x81NJ\x81\xAEf\\x8A/)=\xBDk\x81\xE1\xA8b\xCD\xC9\xB2R\x95/&gt;\x8BᤓޓJ%\x86/%X\xB5\xAE\xFF\xEE\xC9\xAA+\xB0\xB2+\xB1\xE9\xB2+\xB2+\xB2+\xB2+\xB0,/\xB0ֱ+\xE9\xB0+\xB1!+\xB1 \xE9\xB1-+\xB06\xBA\xA8\xC0v+
-\xB0\xB0\xC0\xB1+\xF9\xB0)\xC0\xB0\xB3+\xBA\xCB\xC0C+ \xB0+\xB3*+)+\xB2*+) \x8A \x8A#9\xB2+)*...\xB3)*....\xB0@\xB1+\xB09\xB0!\xB199\xB1\xB1 &amp;9901&gt;?632#&quot;.732&gt;54.+&quot;\xAE'`4g2+\xAC\xFC\xA4PL\xA4\xFE\xFA\xBA!in_\x96
-;&lt;
-\x8F\xC3t1-n\xBB\x8D: =4\x9Ck\xBE\xFE\xF6\xA0\x91\xFE\xF3\xCF|\x93b\xA6\xD7sdˤh\xAE\xC5\x9A G\xB2+\xB1        \xE9\xB2+\xB1\xE9\xB4 -+\xB1\xE9\xB0 /\xB0ֱ        \xE9\xB02\xB2        
-+\xB3@                 +\xB02\xB3@                +\xB1 -+013!!!!!\xAE \xFD\x9E/\xFD\xD1m\x9A\x98\xFE+\x97\xFE\x98\xAE\xBA\x9A        @\xB2+\xB2+\xB1\xE9\xB4 -+\xB1\xE9\xB0
-/\xB0ֱ        \xE9\xB02\xB2        
-+\xB3@                +\xB3@                +\xB1 +013!!!!\xAE \xFD\x9E9\xFD\xC7\x9A\x98\xFE\x98\xFDs\xFF\xE7s\xB2%z\xB2!+\xB1\xE9\xB2+\xB1 \xE9\xB4! -+\xB4$+\xB0&amp;/\xB0ֱ\xE9\xB0\xB1+\xB47+\xB2
-+\xB3@        +\xB1'+\xB1\xB2 !999\xB0\xB1        99\xB1!\xB09\xB1 \xB2        999\xB0\xB09014&gt;32&amp;#&quot;327%5!#&quot;.sr\xB9\xE5s{\x9F8+b\xB7V\xAA\x87VF|\xB1h\x83\\xFE\xB0\xE2!\ip6\x89\xE5\xA8^\xCD\xC7\xB2R\x95/&lt;\x8BᦘݑH3\x90(a\xFD\x89)X\xB7\xAE\xB2\x9A ?\xB2+\xB03\xB2+\xB03\xB4
- -+\xB1\xE9\xB0 /\xB0ֱ \xE9\xB02\xB0 \xB1+\xB02\xB1\xE9\xB1 -+0133!3#!\xAE\xAA\xB0\xAA\xAA\xFDP\x9A\xFD\x8Fq\xFAf\x91\xFDo\xD5\x9A!\xB2+\xB2+\xB0/\xB0ֱ\xE9\xB1\xE9\xB1+0133ժ\x9A\xFAf\xFF\xBA\xFF\xEC\x8F\x9A/\xB2 +\xB1\xE9\xB2+\xB0/\xB0ֱ        \xE9\xB1+\xB1 \xB09\xB0\xB0901'732653#&quot;.F!9DV7\xAA\x91\x94110 \x92yh6\xFB\xA1\xA4\xAB \xAE\x9A\x9A\xB2+\xB0
-3\xB2+\xB133\xB0/\xB0ֱ\xE9\xB02\xB0\xB1+\xB4*+\xB0  \xD6\xB4
-+\xB1+\xB06\xBA3\xD9v+
-\xB0\xB0\xC0\xB0\xB0\xC0\xB1..\xB1..\xB0@\xB1\xB1 99\xB1\xB1 99013373##\xAE\xAA\\xE2\xC4\xFE!Vh -\xD7\xFD\xF5`\x9A\xFDd\xFD\x97CR\xFDd\x98\xFDh\xAE\xFE\x9A,\xB2+\xB1\xE9\xB2+\xB0/\xB0ֱ\xE9\xB2
-+\xB3@        +\xB1+0133!\xAE\xAA\xA6\x9A\xFA\xFE\x98\xAE\xA6\x9A\x87\xB2+\xB0        3\xB2+\xB03\xB0/\xB0ֱ\xE9\xB0\xB1
-+\xB1        \xE9\xB1+\xB06\xBA\xC9hޚ+
-\xB0.\xB0\xC0\xB1\xF9\xB0\xC0\xB2...\xB3....\xB0@\xB1\xB199\xB0
-\xB199\xB0        \xB2 -999\xB1\xB3 $90133373#7##'#\xAE\xC1C@\xAC\x85\xAA
-N\xFE\x8C4\xFEuJ
-\x9A\xFD&quot;\x9F\xA4\xD9\xFAf\xC3\xD7\xC5\xFDy\x89\xC3\xD5\xFC;\xAE\xFF\xE9\xB4\xB0{\xB2+\xB0
-3\xB2+\xB03\xB0/\xB0ֱ\xE9\xB0\xB1+\xB1        \xE9\xB1+\xB06\xBA\xCB\xCF\xDA\xF6+
-\xB0
-.\xB0 \xC0\xB1\xF9\xB0\xC0\xB1 ..\xB3
- ....\xB0@\xB1\xB1 -99\xB1        \xB199\xB1\xB1 9901333'3#'#\xAEZ\xAEk
-\xA0Z\xFDVn        \xB0\xFCD\xC5\xC5\xA6\xFAO\xC1\xCF\xCF\xFCVs\xFF\xE7\xB2D\xB2 +\xB1\xE9\xB2+\xB1\xE9\xB0 /\xB0ֱ\xE9\xB0\xB1+\xB1\xE9\xB1!+\xB1\xB1 99\xB1\xB19901!2!&quot;.7324.#&quot;s/\x98ݒE\xFE\xCF\xFE\xE5\x96ڒE\xB4/b\x9Ah\xBE\xDA/e\x99k\xBC\xD7\xCDfj\xC3\xFE\xF0\xA8\xFE\x9A\xFE\x80k\xC2\xA8wբ`!-uסa\xFE\xDF\xAE-\xAA(P\xB2+\xB2+\xB1%\xE9\xB4 -+\xB1\xE9\xB0)/\xB0ֱ\xE9\xB02\xB0\xB1 +\xB1        \xE9\xB1*+\xB1 \xB09\xB1%\xB0        9\xB0\xB09013&gt;32+&quot;.';2&gt;54.#&quot;\xAEN\xB4X^àd^\x9C\xC9j&quot;31
-
-/!F\x89nD@h\x83B5b\x8B -%b\xAC\x85\x83\xB5p1\xFD\xDF\xB8EcTpDs\xFE\x89\xA2\xB26\xF1\xB2 +\xB1\xE9\xB2+\xB1\xE9\xB04/\xB1#\xE9\xB0 2\xB3(#4+\xB0'3\xB1.\xE9\xB0/2\xB07/\xB0ֱ\xE9\xB0\xB1+\xB1\xE9\xB18+\xB06\xBA\xEF\xE6\xC2+
-\xB0/.\xB02\xC0\xB1'
-\xF9\xB0$\xC0\xB0$\xB3%$'+\xB3&amp;$'+\xB02\xB302/+\xB312/+\xB2%$' \x8A \x8A#9\xB0&amp;9\xB212/9\xB009\xB512$%&amp;0......\xB712$%&amp;'/0........\xB0@\xB1\xB2  999\xB0\xB1(.99\xB14.\xB0+9\xB1#(\xB0*9\xB1\xB19901!2!&quot;.7324.#&quot;&gt;32327#&quot;&amp;/&amp;&quot;s/\x98ݒE\xFE\xCF\xFE\xE5\x96ڒE\xB4/b\x9Ah\xBE\xDA/e\x99k\xBC׋5V\xAA\xB0\xB8gZX1_/f\xC3[\xAFTL1-\xCDfj\xC3\xFE\xF0\xA8\xFE\x9A\xFE\x80k\xC2\xA8wբ`!-uסa\xFE\xDF\xFB\xA2+3+\x93 +/ \xAEs\xAA\x98\xB2+\xB133\xB2+\xB1\xE9\xB4 -+\xB4$+\xB0 /\xB0ֱ\xE9\xB02\xB0\xB1+\xB1        \xE9\xB3        +\xB4*+\xB1!+\xB06\xBA\xCA݈+
-\xB0\xB0\xC0\xB0\xB0 -\xC0\xB1 -..\xB1 -..\xB0@\xB1\xB1 99\xB1\xB0 9\xB1\xB0        9\xB0\xB09013&gt;32#'32654&amp;+&quot;\xAEN\xCBT^\xAA\x81N\xB9\x8Dbe\xC7\xFEuɠ\x8D\xB8\x97\x87840\x8B)^\x98l\xA8\xD1#L\xFD\xC9j\xFDw\xFA\x8B\x94o\x8F^\xFF\xE7\xDF\xB2+\xAF\xB2)+\xB1\xE9\xB2+\xB1\xE9\xB0,/\xB0ֱ\xE9\xB0\xB1        +\xB1$\xE9\xB1-+\xB06\xBA\xE2\xCE\xC7 +
-\xB0 \xB0 \xC0\xB1\xF9\xB0!\xC0\xB3 !+\xB2 ! \x8A \x8A#9\xB4  !.....\xB4  !.....\xB0@\xB1\xB09\xB0        \xB4 -)$9\xB0$\xB199\xB1)\xB09\xB0\xB3$$9\xB0\xB0901?32&gt;54.54632.#&quot;#&quot;&amp;^:/\xB8sDvV3f\x9A\xB4\x9Af\xE9\xD8}\xCC:4/\xB6s\x87\x87f\x9A\xB4\x9AfA\xB5r\x9A\xC93\x9A3;Z&gt;VlTJh\x9Aw\xA8\xC4%\x96)yRPjTRm\x97q\\x94j:/%L\x9A:\xB2+\xB2+\xB1\xE9\xB02\xB0/\xB0ֱ\xE9\xB2
-+\xB3@        +\xB2
-+\xB3@        +\xB1        +015!!#%'\xFEA\xAA\x98\x98\xFA\xFE\xAE\xFF\xEE\x89\x9A7\xB2+\xB1\xE9\xB2+\xB0 3\xB0/\xB0ֱ\xE9\xB0\xB1 +\xB1\xE9\xB1+\xB1 \xB0901332653#&quot;$\xAE\xAA+V\x81V\xA6\x8F\xA4C}\xB0k\xFE\xFE\xFE\xBC\xDE\xFCrm\x95\)\xB6\xD1\x8E\xFCC\x81\xBCy9\xE5\xFF\xFC\xFF\xE9\x8F\x9A        W\xB2        +\xB2+\xB133\xB0
-/\xB1 +\xB06\xBA\xC4*\xE9J+
-\xB0.\xB0\xB0\xB1\xF9\xB0\xB1        \xF9\xB0.\xB3        ....\xB0@\xB1        \xB09013373#\xBAm15Z\xAA\xFD\xE2L\x9A\xFC'\xDA\xDE\xD5\xFAO\xFF\xE9\x8F\x9A\x8B\xB2+\xB03\xB2+\xB2 333\xB0/\xB0 ֱ -\xE9\xB1+\xB06\xBA\xC2e\xEE\xAA+
-\xB0.\xB0\xB0\xB1\xF9\xB0\xB1\xF9\xBA\xC2\xDB\xED+
-\xB0.\xB0\xC0\xB1
-\xF9\xB0\xC0\xB2...\xB7........\xB0@\xB1\xB2        999013373373#'##\xB5 #'R)#%\xF1\xA6\xFEq^\xFE\xDD%
-%\xFE\xDD^\x9A\xFC?\xED\xF1\xBD\xFC?\xED\xF1\xBD\xFAO\xC1\xD9\xDB\xFCA5\xB6\x9A8\xB2+\xB2
- 333\xB2+\xB2333\xB0/\xB0ִ+\xB0 \xD6\xB46+\xB0\xB1+\xB0 2\xB4A+\xB4
-*+\xB1+\xB06\xBA5u\xDC\xCF+
-\xBA\xCAݚ+
-\xBA5u\xDC\xCF+ \xB0\xB3+\xB1\xB0\xB3 +\xBA\xC9\xE9\xDD\xCA+ \xB0\xB3
-+\xBA5u\xDC\xCF+ \xB0\xB3+\xB0\xB3        +\xB1\xB0\xB3        
-+\xBA\xCAݚ+ \xB0\xB3  +\xBA5~\xDC\xDD+ \xB0\xB3+\xB2 \x8A \x8A#9\xB29\xB2
- \x8A \x8A#9\xB2  9\xB5         ......\xB5         ......\xB0@\xB1\xB1 -99013        373        #'5\xDD\xFEL\xCD#313\xBD\xFE=\xD7\xC6\xFE\xBC76\xFE\xB5\xD9\xC1\xFEuu\xE6\xFDM\xFD{{\xFD\xFEh\x9A `\xB2
-+\xB2+\xB133\xB0 /\xB0 ֱ\xE9\xB1 -+\xB06\xBA\xC7\xD9\xE1K+
-\xB0.\xB0 \xC0\xB1\xF9\xB0\xC0\xB1 ..\xB2...\xB0@\xB1 \xB09\xB1
-\xB09013373#\xC7P#%A\xB6\xFE+\xAA\x9A\xFD\x8D}\x81o\xFC\xA1\xFD\xC59N\x9A P\xB2+\xB1        \xE9\xB2+\xB1\xE9\xB0 /\xB1 -+\xB06\xBA4\xABۣ+
-\xB0\xB0\xC0\xB1
-\xF9\xB0\xC0\xB3....\xB3....\xB0@01357!5!!N\xD3V\xFC\xD7\xC2\xFD)V-\x9AR\x98\x9A\xFB\xE3K\x98\xAE\xFE)!\x9A7\xB2+\xB1\xE9\xB0/\xB1\xE9\xB0/\xB0ִ +\xB02\xB1\xE9\xB4 +\xB02\xB1        +01!#3\xAEs\xD3\xD3\xFE)q\x90\xF9\xAE\x8F\xFF\xB4\xFE\xE11\xB2B\xB2+\xB0/\xB0/\xB0ֱ+\xB1+\xB06\xB0&amp;\xB1.\xC9\xB1.\xC9\xB1.\xC9\xB1.ɰ6\xB0@017L\x89\xF4\x87y9\xF9k&lt;N\xFE)\xC3\x9A@\xB2+\xB1\xE9\xB0/\xB1\xE9\xB0/\xB0ְ2\xB4 +\xB0\xB1\xE9\xB0/\xB0\xB4 +\xB0/\xB1        +013#5!!N\xD5\xD5u\xFE\x8B\xFE\xB8R\x90\xF8\x8Fb{u\xB0g\xB2+\xB4+\xB122\xB0        /\xB0ֱ\xE9\xB0\xB1+\xB1\xE9\xB1
-+\xB06\xBA\xC9lޔ+
-\xB0\xB0\xC0\xB0\xB0\xC0\xB0.\xB1..\xB0@\xB1\xB09\xB1\xB09013#'b}&lt;Z\xA8\xA4/@\xBC{5\xFD\xCB\x8E\x90\xFE\xEE\xFE\D\xFE\xEC\xB2+\xB1\xE9\xB2+\xB1\xE9\xB0/\xB1+01!!D\xFC\xBC\xFE\xEC\x90{\x91\xC3\xC3)\xB0/\xB4+\xB0/\xB1+\xB4 -+\xB1+\xB1\xB090153#{†]\x98+\xFE\xCEP\xFF\xF0q-&gt;\x80\xB2)+\xB0!3\xB11\xE9\xB2+\xB1 -\xE9\xB4:) -+\xB4A+\xB0?/\xB0ֱ.\xE9\xB0.\xB16+\xB02\xB1\xE9\xB02\xB1@+\xB1.\xB199\xB06\xB2 -)999\xB0\xB1&quot;$99\xB1:1\xB3$#$9\xB1 -\xB199\xB0\xB09014&gt;;2674&amp;#&quot;'&gt;32#'##&quot;.732&gt;75.#&quot;PJ\x85\xBAq8[v#PTL4N\xCFqj\x81D y+
-8NfBBpR/\xAAfP9[A+
-;?z\7ZyH=1qZ
-{/-9\o7{\xE9iL\x879\x8F7+)KjUH\/9\xAA'D\x9E\xFF\xEE\xEE\x9AV\xB2 -+\xB1\xE9\xB2+\xB2+\xB1\xE9\xB0/\xB0ֱ\xE9\xB02\xB0\xB1+\xB1
-\xE9\xB1 +\xB1\xB1 -99\xB1 -\xB09\xB0\xB0
-9\xB0\xB0901733&gt;32#&quot;&amp;732654.#&quot;\x9E\xA4/\x91V\xC7\xC7\xFE\xF9\xEDs\xBAu'n;\x8B\xA7&gt;`Ef\x80;_\xFE;B\xFE\xFE\xF5\xFE\xF4\xFE\xEA0\x8C\xC5\xD0P\x8Cb9rid\xFF\xE7X=\xB2+\xB1\xE9\xB2+\xB1
-\xE9\xB0/\xB0ֱ \xE9\xB1+\xB1\xB09\xB0
-\xB2999\xB0\xB090132.# 3267#&quot;.d\xE6\xD7b\x8980/rB\xFE\xDDHtVJu%5=\xA8\w\xA4i/\x8D\xFEwN\x8DmA-}-0L\x8E\xC6d\xFF\xE7\xC5\x9A#x\xB2 -+\xB2+\xB1\xE9\xB2+\xB2+\xB1!\xE9\xB0$/\xB0ֱ\xE9\xB0\xB1+\xB02\xB1        \xE9\xB0        \xB0  \xD6\xB4 -+\xB0 -/\xB4 +\xB1%+\xB1\xB199\xB0 -\xB09\xB1!\xB2999\xB0\xB0901323#'##&quot;3267.#&quot;d\xF8\xD9LX3\xA4o))\x9Ch\xCDǪ=eGh|%^N\x8D\xA0\xFC\xAA\xFB\xC6h\xAAR\x91H^T\x8Fg;lo\xFC\xBAd\xFF\xE7\xAC&quot;n\xB2+\xB1\xE9\xB2+\xB1 \xE9\xB4  -+\xB1\xE9\xB0#/\xB0ֱ \xE9\xB02\xB0 \xB1+\xB1\xE9\xB1$+\xB1 \xB2999\xB0\xB2
-999\xB1\xB09\xB0 \xB09\xB0\xB09\xB0 \xB090132!3267#&quot;.7!4&amp;#&quot;d\xEA\xD9F\x8BnF \xFDn%N}ZF\x8B#==\xBBhu\xACn6\xAC\xFCvmy\x92V\x9E\x81DQZ\x8C`31!w1:L\x8E\xC4\xEC\x9C|~-\xCF\xA6Z\xB2+\xB2+\xB1\xE9\xB2+\xB03\xB1\xE9\xB02\xB0/\xB0ְ2\xB1\xE9\xB02\xB2
-+\xB3@        +\xB2
-+\xB3@        +\xB1+\xB1\xB0 9\xB0\xB0 9015354&gt;32.#&quot;!!#-\xA0EoRBd7%/T%5&lt;\xFE\xF0\xA4q\x8F9^\x8CX+\x89 -!@\=\x8F\xFC\x8Fqd\xFEN\xAE+p\xB2+\xB1#\xE9\xB2+\xB1)\xE9\xB0
-/\xB1\xE9\xB0,/\xB0ֱ\xE9\xB0\xB1&amp;+\xB02\xB1\xE9\xB1-+\xB1\xB1 -99\xB0&amp;\xB4
-$9\xB1
-\xB0 -9\xB0\xB09\xB0#\xB09\xB0)\xB09\xB0\xB090132#&quot;&amp;'732&gt;=##&quot;3267&amp;#&quot;d\xFA\xF4u\xA6A\xD3\xCF{\x955+/r]VlB)f\xCFê=cGhxR\x8B\xA0\xFC$\xFB\xFCǼ\x8B!HpNb;@V\x8Fg9ho '\xBC\x9E\xD3\x9AG\xB2+\xB0 -3\xB2+\xB2+\xB1\xE9\xB0/\xB0ֱ\xE9\xB02\xB0\xB1+\xB1 -\xE9\xB1+\xB1\xB09\xB1\xB0901333&gt;32#4.#&quot;\x9E\xA45\x95oVT'\xA41TD`\x9C\x9A\xFD\xF3?M'c\xA6\xFD\x96HPxP)}b\xFDV\x9E\x85\xAA N\xB2 +\xB2+\xB4        +\xB2 -+\xB0/\xB0ִ+\xB4+\xB3+\xB1 \xE9\xB0 /\xB1\xE9\xB1+\xB1 \xB1        99014632#&quot;&amp;3\x9E?11FF11?#\xA37/DD//==\xFA\xF8\xFC\xFEN\x83\xAAZ\xB2+\xB4+\xB2+\xB0/\xB1\xE9\xB0/\xB0ֱ\xE9\xB2
-+\xB3@        +\xB0\xB3+\xB4+\xB0/\xB4+\xB1+\xB1\xB199012&gt;53#&quot;&amp;'4632#&quot;&amp;9D%
-\xA4\x83\x8F\x8A?11FF11?\xFE\xDD#JpL\xFA\xFBɾ\xBD\xE5/DD//==\x9E\xC1\x9A\x82\xB2+\xB0
-3\xB2+\xB2+\xB03\xB0/\xB0ֱ\xE9\xB02\xB0\xB1+\xB46+\xB0  \xD6\xB4
-)+\xB1+\xB06\xBA3\xAF\xDA@+
-\xB0\xB0\xC0\xB0\xB0\xC0\xB1..\xB1..\xB0@\xB1\xB1 99\xB1\xB1 99013373##\x9E\xA4T=\xBE\xFE\xC7TfW\xCB\xFE\xAA^\x9A\xFC\x97\xB2\xFEdCR\xFE1\xCD\xFE3\xB0\xFF\xE7D\x9A/\xB2 -+\xB1\xE9\xB2+\xB0/\xB0ֱ\xE9\xB1+\xB1 -\xB0
-9\xB0\xB0        901733267#&quot;&amp;\xB0\xA41-='!u+\w\xCD\xCD\xFBbH=\x81i\x9E\xF2)t\xB2+\xB133\xB2+\xB2+\xB0 -3\xB1%\xE9\xB02\xB0*/\xB0ֱ)\xE9\xB4+\xB0)\xB1+\xB1\xE9\xB0\xB1+\xB1\xE9\xB1++\xB1)\xB09\xB0\xB09\xB0\xB0
-9\xB0\xB0 -9\xB1%\xB2
-99901333&gt;32&gt;32#4.#&quot;#4.#&quot;\x9Er7\x92ub}#/\xA6hVwN#\xA4+K&gt;fs\xA4)K&gt;^}}BTL^PZ'c\xA8\x81\xFD\x9AhJmG#rk\xFDTDRxR)rV\xFD?\x9E\xD3S\xB2+\xB0 -3\xB2+\xB2+\xB1\xE9\xB0/\xB0ֱ\xE9\xB4+\xB0\xB1+\xB1 -\xE9\xB1+\xB1\xB09\xB0\xB09\xB1\xB19901333&gt;32#4&amp;#&quot;\x9Er1\xA6sTT+\xA4\{m\x8D}BT'c\xA6\xFD\x96H\xA0\xA1uX\xFDDd\xFF\xE7\xE5!F\xB2 +\xB1\xE9\xB2+\xB1 \xE9\xB0&quot;/\xB0ֱ\xE9\xB0\xB1+\xB1\xE9\xB1#+\xB1\xB2 999\xB1 \xB1990132#&quot;.7323 4.#&quot;# d\xE8\xD9s\xAAn5\xE7\xD9s\xAAn6\xAABjLBjL\xFE\xECL\x8E\xC6y\xFE\xFC\xFE\xEBL\x8E\xC6yN\x8FkA\x89P\x8Fk?\x9E\xFEf\xF0&quot;f\xB2+\xB1\xE9\xB2+\xB2+\xB2+\xB1\xE9\xB0#/\xB0ֱ\xE9\xB02\xB4+\xB0\xB1+\xB1
-\xE9\xB1$+\xB1\xB09\xB0\xB199\xB1\xB09\xB0\xB2
-9990133&gt;32#&quot;&amp;'32654.#&quot;\x9Ep/\x96`\xCD\xC9D{\xAEjLX3%^M\x8D\xA7@dJhy\xFEf\x9A{HL\xF2\xFE\xED\x81ΐN\xFEVL\xD3\xCDT\x89`5lod\xFEf\xAEV\xB2 -+\xB1\xE9\xB2+\xB2+\xB1\xE9\xB0/\xB0ֱ\xE9\xB0\xB1+\xB02\xB1\xE9\xB1+\xB1\xB1 -99\xB1 -\xB0        9\xB0\xB09\xB0\xB090132###&quot;3267&amp;#&quot;d\xFE\xF4m\xBE-\xA4)}f\xCDŪ=cGhxL\x85\x8D\x9E\xFC)\xFA\x93=BV\x91g9jo '\xBE\x9E\xA4K\xB2+\xB2+\xB0        3\xB2+\xB1
-\xE9\xB2+\xB1 \xE9\xB0/\xB0ֱ\xE9\xB4+\xB1+\xB1\xB09\xB1 \xB19901333&gt;32&amp;'&quot;\x9Er'mT;J#=8Xf }FK\x9E`J\xFD3P\xFF\xE7)\xC5\xB2'+\xB1\xE9\xB2+\xB1\xE9\xB0*/\xB0ֱ\xE9\xB0\xB1+\xB1&quot;\xE9\xB1++\xB06\xBA\xE7\xDFĹ+
-\xB0 \xB0        \xC0\xB1\xF9\xB0\xC0\xB0 \xB3
-         +\xB0\xB3+\xB2 \x8A \x8A#9\xB2
-         9\xB5        
- ......\xB5        
- ......\xB0@\xB1\xB09\xB0\xB3'$9\xB0&quot;\xB199\xB1'\xB09\xB0\xB3&quot;$9\xB0\xB0901?32654.54632.#&quot;#&quot;&amp;P1/\x98NXrIm\x81mI\xA8\x95o\x958'/\x86KZTIm\x81lJ+Z\x85Zu\xA43\x8B,E[=F/+CkZ\x93\x8A'\x87&quot;=L5&lt;/-Jp\BsQ0-\xFF\xE7\xA0\xFAU\xB2+\xB1 \xE9\xB2+\xB03\xB1\xE9\xB02\xB0/\xB0ְ2\xB1        \xE9\xB02\xB2        
-+\xB3@                +\xB2        
-+\xB3@        +\xB1+\xB1 \xB09\xB0\xB09015357!!3267#&quot;&amp;5\x9F\xA4\xFE\xE95@5J-%7\x84K}gq\x8F\xCB/\xFA\x8F\xFD\xC8jX}!\x8E\xA6V\x8D\xFF\xE7\xC9e\xB2+\xB2+\xB1\xE9\xB2+\xB03\xB0/\xB0ֱ\xE9\xB0\xB1 -+\xB1\xE9\xB0\xB0 \xD6\xB4+\xB0/\xB4+\xB1+\xB1 -\xB09\xB0\xB09\xB1\xB19901332&gt;73#'##&quot;.\x8D\xA4-M&lt;7VD3\xA4
- -q)
-/\xA0{R}T+\x96j\xFD\xB8PxP)#=P-\xAC\xFD#J\x9E;\xA2Pk'c\xA6\xFF\xE9\xC9        W\xB2        +\xB2+\xB133\xB0
-/\xB1 +\xB06\xBA\xC5\xE6\xF7+
-\xB0.\xB0\xB0\xB1\xF9\xB0\xB1        \xF9\xB0.\xB3        ....\xB0@\xB1        \xB09013373#\xBD\xF693\xE6\xB0\xFEKE\xFD\xA8\xC3\xC7T\xFB\xE9\xFF\xE9\xD1\x8B\xB2+\xB03\xB2+\xB2 333\xB0/\xB0 ֱ -\xE9\xB1+\xB06\xBA\xC3m\xEBX+
-\xB0.\xB0\xB0\xB1\xF9\xB0\xB1\xF9\xBAā\xE8j+
-\xB0.\xB0\xC0\xB1\xF9\xB0\xC0\xB2...\xB7........\xB0@\xB1\xB2        999013373373#'##\xB3\xCA#1\xDBw\xEC3'\xB6\x9C\xFE\xA8P\xFE\xF4')\xFE\xFEP\xFD\xAC\xC7\xCBP\xFD\xAA\xC5\xC9R\xFB\xE9\xA4\xA8\xAA\xFD^9\xE52\xB2+\xB2
- 333\xB2+\xB2333\xB0/\xB0ִ)+\xB0 \xD6\xB1\xE9\xB0\xB1+\xB0 2\xB1\xE9\xB4
-5+\xB1+\xB06\xBA3\xF2ڝ+
-\xBAˬ\xDB(+
-\xBA3\xF8ڦ+ \xB0\xB3+\xB1\xB0\xB3 +\xBAˀ\xDBe+ \xB0\xB3
-+\xBA3\xF8ڦ+ \xB0\xB3+\xB0\xB3        +\xB1\xB0\xB3        
-+\xBAˬ\xDB(+ \xB0\xB3  +\xBA3\xF2ڝ+ \xB0\xB3+\xB2 \x8A \x8A#9\xB29\xB2
- \x8A \x8A#9\xB2  9\xB5         ......\xB5         ......\xB0@\xB1\xB1 -99013        373        #'9q\xFE\xA8\xC9\xC2:;Ǹ\xFE\xA6n\xC2\xD9&gt;?\xDD \xF4\xFE\xE5tt\xFE\xFD\xEC7{{\xFE\xC9\xFE\\xA8\xA1\xB2 -+\xB1\xE9\xB2+\xB2333\xB0/\xB0ֱ\xE9\xB1+\xB06\xBAě\xE8)+
-\xB0.\xB0\xC0\xB1\xF9\xB0\xC0\xBA&lt;\xB4\xEB\xBB+
-\xB1\xB0\xB0\xC0\xB0\xB0        \xC0\xB0        \xB3        +\xB2         \x8A \x8A#9\xB3        ....\xB5        ......\xB0@\xB1 -\xB09\xB0\xB199013373#&quot;'73267\xBC\xF69
--Ǧ\xFE\xD1E&quot;QgCJ/9j#\xFDh\xC4\xC6\x96\xFCh\xC2^\x94X\x8D
-y\x93V/ P\xB2+\xB1        \xE9\xB2+\xB1\xE9\xB0 /\xB1 -+\xB06\xBA3\xD1\xDAp+
-\xB0\xB0\xC0\xB1\xF9\xB0\xC0\xB3....\xB3....\xB0@01357!5!!V\xD9V\xFD\xD1\xD9\xFE#T1\x8F\x8CV\x8F\x8F\xFDnP\x8Fu\xFE)\x89\x9C#k\xB2+\xB1 \xE9\xB0/\xB1\xE9\xB0/\xB1\xE9\xB0$/\xB0 ְ2\xB1\xE9\xB02\xB2 
-+\xB3@
-        +\xB02\xB2 
-+\xB3@         +\xB1%+\xB1 \xB09\xB1\xB1 99\xB0\xB199\xB0 \xB19901526546;#&quot;;#&quot;&amp;54&amp;uNV`b\xAEf74V97X1&lt;d\xAE\fV\x9A\x8FRZ\xF0`w\x907B\xFEZ^
- -mV\xFE?:\x8Fmh\xE7hM\xAE\xFE\xF69\x9A&quot;\xB2+\xB0/\xB0ִ++\xB4++\xB1+013\xAE\x8B\xFE\xF6\xA4\xF9\q\xFE)\x85\x9C#k\xB2+\xB1\xE9\xB0#/\xB1\xE9\xB0/\xB1\xE9\xB0$/\xB0ְ 2\xB1\xE9\xB02\xB2
-+\xB3@        +\xB2
-+\xB3@        +\xB02\xB1%+\xB1\xB09\xB1\xB199\xB0\xB1        99\xB0\xB1 990132654675.54&amp;+5323&quot;+qf74T97V29f\xB0ZfVNNV`b\xAE\xFE\xB88A\xE6Z^
- mV\xE3?:\x90mh\xFEhL\x8FRZ\xFE`w?X\xCB\\xB4\xB0/\xB1\xE9\xB02\xB3+\xB03\xB1\xE9\xB02\xB0/\xB1+\xB06\xBA\xE9X\xC4%+
-\xB0.\xB0.\xB0\xB1\xF9\xB0\xB1\xF9\xB0\xB3+\xB3+\xBA\xE61\xC5o+ \xB0\xB3+\xB2 \x8A \x8A#9\xB09\xB29\xB3....\xB6.......\xB0@\xB1\xB1 99\xB0\xB09\xB0\xB0 901&gt;323267#&quot;.#&quot;?X\x90;9cZV/'R/FN}37]TT1/jB\xE3D5#+&quot; )}5+#+#+6\xB2\xFF3\xB0\xCD$l\xB2+\xB03\xB1&quot;\xE9\xB02\xB2+\xB03\xB1#\xE9\xB0 -2\xB0%/\xB0ֱ\xE9\xB0\xB1&quot;+\xB4+\xB122\xB0\xB47+\xB0/\xB03\xB1&amp;+\xB1&quot;\xB09\xB0#\xB2
-999\xB0\xB0        9014753.'&gt;7#5.7\xB2ô\x91Ho-/)e5Bj#51}H\x91f\x8EZ)\xAA5V?\xE1\xEC\xBB\xB6\x8B\xFC\xF0+}#+\xBB\xB9
-T\x89\xBCqD}hJ+V\xE7\xB2-\x86\xB2+\xB1+\xE9\xB02\xB2+\xB1\xE9\xB4&quot; -+\xB0 3\xB1&quot;\xE9\xB0        2\xB0./\xB0ֱ\xE9\xB2
-+\xB3@%        +\xB3@!        +\xB2
-+\xB3@        +\xB0
-2\xB1/+\xB1\xB2         999\xB1+\xB1)*99\xB0&quot;\xB1%99\xB1\xB199\xB0\xB0901352&gt;54&amp;'#53.54632.#&quot;!!7!VB\;LJ \xE5\xC7}\xB8&lt;6/\x9Ep{\x85)J\xFE\xF4%%P \x930Ka1Dl1\x8F5\x80V\xC9\xCE%\x92%\x85qV\x83&lt;\x8F/f&gt;=\x81)D\x98\\x9A\xB0\xB2+\xB2+\xB133\xB4 -+\xB0 3\xB4A+\xB02\xB4 -+\xB03\xB4A+\xB0
-2\xB0/\xB0ְ2\xB1\xE9\xB0 2\xB2
-+\xB3@        +\xB0        2\xB2
-+\xB3@        +\xB02\xB1+\xB06\xBA\xC7\xD3\xE1U+
-\xB0.\xB0\xB0\xB1\xF9\xB0\xB1\xF9\xB0.\xB3....\xB0@\xB1\xB09\xB1\xB090133733#3###535#53\xC7P&quot;%B\xB6\xFE`\xC1\xF8\xF8\xF8\xAA\xF8\xF8\xF8\xC1\x9A\xFD\x8D}\x81o\xFD{\x81{\xFE\xD7){\x81{h\xFF\x81
-#'Bx\xB0/\xB1\xE9\xB0@/\xB1:\xE9\xB04/\xB1+\xE9\xB0#/\xB1\xE9\xB0C/\xB0ִ7+\xB0\xB1(+\xB17\xE9\xB07\xB1+\xB4
-++\xB1D+\xB17\xB7#+0=@$9\xB1:@\xB0=9\xB04\xB6
-(1&lt;$9\xB0+\xB0090146$32#&quot;$&amp;732&gt;54.#&quot;4632.#&quot;27#&quot;&amp;hs\xC5\x93\x93\xC5rr\xC5\xFE\xFA\x94\xA4\xFE\xF6\xBCg\x90Z\x9C\xD3xyӜZZ\x9C\xD3yyҜZ黙%&lt;386-RVmkh`D+/uN\xA6\xAER\xAA \xB9bb\xB9\xFE\xF4\xAA\xAA\xFE\xF4\xB9bb\xB9 \xAA\x8DܓNN\x93܍\x8D۔NN\x94ۍ\xBA\xCB }k\x8Dw\x81%y\xD1yh\x9A&quot;\xB0/\xB1\xE9\xB1\xE9\xB0/\xB1+\xB4        +\xB1+015!y\xEF\x98\x98\xAE}\xEC\xBA'8B\xC6\xB0/\xB4A+\xB0A/\xB4,+\xB0#/\xB43+\xB0C/\xB0ִ+\xB0\xB1(+\xB48+\xB092\xB08\xB1=+\xB4/+\xB05 \xD6\xB44+\xB0/\xB1+\xB4
-+\xB1D+\xB06\xBA\xCB \xDC+
-\xB05.\xB06\xC0\xB14\xF9\xB03\xC0\xB33456....\xB136..\xB0@\xB1=8\xB5#,2$9\xB1A@        
-(/79=$9\xB0,\xB0)9014&gt;32#&quot;.732&gt;54.#&quot;&gt;32#/32654&quot;\xAEV\x96\xC4oqƔTV\x96\xC5nsĔT\x81Bp\x98TX\x97o?Aq\x95VZ\x98n&gt;\xCB!v6V{T&gt;9\x98}\x93cF;Bw( -\x9C\x83ʊGG\x8Aʃ\x83ˉHH\x89˃j\x9Fh53h\x9Emj\x9Eh66h\x9E\xFE\x8D
-
-GXBF\xE0\xD5\xF42$.H{\x91\xAA\xC3!\xB0/\xB4+\xB0/\xB1+\xB4+\xB1+013{y\xB6\xCF\x912+\xFE\xF9Z\xFA\xD5\xB2#N\xB2+\xB4!3+\xB0/\xB43+\xB0$/\xB0ִC+\xB0\xB1+\xB4
-C+\xB1%+\xB1\xB199\xB1!\xB1
-99014&gt;32#&quot;.732&gt;54.#&quot;Z1TuDDtT11TuCDuT1\x98XN'=++&gt;&amp;NXV\\x83V'%R\x85``\x85R%%R\x85`{j3XDDX3`yh\x9A&quot;\xB0/\xB1\xE9\xB1\xE9\xB0/\xB1+\xB4        +\xB1+015!y\xEF\x98\x98yh\x9A&quot;\xB0/\xB1\xE9\xB1\xE9\xB0/\xB1+\xB4        +\xB1+015!y\xEF\x98\x98yh\x9A&quot;\xB0/\xB1\xE9\xB1\xE9\xB0/\xB1+\xB4        +\xB1+015!y\xEF\x98\x98\xF2V\x9A\xB0/\xB1\xE9\xB1\xE9\xB0/\xB1+015!\xF2d\x98\x98\xF2\x9E\x9A\xB0/\xB1\xE9\xB1\xE9\xB0/\xB1+015!\xF2\xAC\x98\x98R\x8F=93\xB0/\xB4 +\xB0/\xB0ִ        +\xB2        
-+\xB3                +\xB1+\xB1 \xB09014&gt;7632#&quot;&amp;R'7&lt;3-7)-=/7H!D`C)GL99)/8JR=\xAA&gt;\xB2+\xB4+\xB0 /\xB0/\xB0ִ+\xB2
-+\xB3        +\xB1+\xB1 \xB0 9\xB0\xB09014632'&gt;5#&quot;&amp;R;/9H&amp;8=3/5'-F/5HGDbD)FI;8\xFF\xFFR\x8Fh9'{+{\xFF\xFFRh\xAA'|+|\xB2`\xEC\x9A.\xB0/\xB4+\xB4+\xB0/\xB0ִ
-+\xB4
-+\xB1+014&gt;32#&quot;.\xB2-Lh&lt;;iK..Ki;;iL-}?iL)'JhDDhJ''Jh\x91\xFF\xE7\x8F\xD5 #T\xB2        +\xB1!33\xB4+\xB122\xB2        +\xB4+\xB0$/\xB0ִ+\xB0\xB1 +\xB4+\xB0\xB1+\xB4+\xB1%+0174632#&quot;&amp;%4632#&quot;&amp;%4632#&quot;&amp;\x91@57BB75@        ?57BA85??67AA75@^7@?85BB57@?85BB57@?85BB\xFF\xE7=\xB23m\xB20+\xB1)\xE9\xB2+\xB1\xE9\xB40 -+\xB0#3\xB1\xE9\xB0%2\xB40 -+\xB03\xB1\xE9\xB02\xB04/\xB0ֱ!\xE9\xB15+\xB1!\xB1        399\xB1)0\xB0-9\xB0\xB0,9\xB1\xB09\xB0\xB090173=47#73&gt;32.#&quot;!!!!3267#&quot;%o\x96%j\x96\xBAih\x987-/ZFhLB#\xFD\xD3#\xFE-#װP\x85/)=\xB6\\xEC\xFE\xDB)\x87D'\x87\x8Dǁ;\x91)Z\x92h\x87(#\x87\xC7\xC0%\x81/%N\xB8\xC5\x9A\xD0\xB2+\xB1
-33\xB1\xE9\xB02\xB2
-+\xB3@        +\xB122\xB0/\xB0ֱ\xE9\xB2
-+\xB3@        +\xB2
-+\xB3@        +\xB0\xB1+\xB47+\xB0\xB1+\xB1\xE9\xB1+\xB06\xBAɺ\xDE+
-\xB0
-.\xB0 \xC0\xB1
-\xF9\xB0\xC0\xBA:&amp;\xE5D+
-\xB0 -\xB0\xC0\xB1        \xF9\xB0\xC0\xB6 -.......\xB7
- -........\xB0@\xB1\xB199\xB0\xB09\xB0\xB09015!!#3373#7##'#N\xCD\xFE\xE9\xA0        \x9F\xD7:=Ǣ\x9CP\xB2C\xB7I        \x8C\x8C\xFD\xAAV\xFD\xAA\xE2\xFE\xA8w{T\xFDVӮ\xFE\xE1\xB0\xD1\xFE\xA8!!\xFB\xFF\xFB\xFF-\xB2\xA8p\xB2+\xB03\xB2+\xB1 -\xE9\xB2+\xB03\xB1\xE9\xB02\xB0/\xB0ְ2\xB1\xE9\xB02\xB2
-+\xB3@        +\xB0\xB1+\xB1\xE9\xB0        2\xB1+\xB1\xB1 -99\xB0\xB0
-9\xB1 -\xB0
-9\xB0\xB0        9015354632.#&quot;!#!#-\xA0\xBE\xB9y\xBC577\x98VLX/A\xA4\xFEc\xA4q\x8F9\xC1\xAE/!\x83#!#HjD\xFCq\xFC\x8Fq-\xFF\xE7\x96\xB2*\x87\xB2)+\xB03\xB2+\xB1\xE9\xB2+\xB1\xE9\xB2+\xB0$3\xB1\xE9\xB0&amp;2\xB0+/\xB0)ְ2\xB1(\xE9\xB0$2\xB2()
-+\xB3@(&amp;        +\xB2)(
-+\xB3@)        +\xB0(\xB1+\xB1 \xE9\xB1,+\xB1(\xB09\xB1)\xB09\xB0\xB09\xB1\xB09\xB0\xB0 90153546323267#&quot;&amp;5.#&quot;3##-\xA0\xA6\xC2)gh\3+='055\yr8FO)
-\xD3Ӥq\x8F9\xC1\xB8
-         \xFBoH=\x81i}E 'LlD\x8F\xFC\x8Fq\xFF\xFF-\xA0\xAA'L'I\x8DI\xFF\xFF-\xFF\xE7_\xA6'O'I\x8DI\xFE{\xFF\xE7\xFC\xB4B\xB2+\xB0/\xB0/\xB0ֱ+\xB1+\xB06\xB0&amp;\xB1.\xC9\xB1.\xC9\xB1.\xC9\xB1.ɰ6\xB0@01'\x98d\xFB\xE5f\xB4N\xFA\x81P\x83{\xB8&amp;_&lt;\xF5\xC99\xFF\xC99\xFF\xFE{\xFE)\xD1f3\xFD\xCB\xF4\x83\xFE{\xFE|\xD1\x8Bf\xAA&quot;p\xE1\xAE\xB8\9\\x9C/\x8F\x83\xF2\xBE\xB8={=\xCER
-R\x8FV\xE1y\xB6d\xD4\xFF\xB4\X\\x8F\\\xB4\)\\x9E\{\}\\x8B\j\xC0\xBA \xA8
-V
-R
-V|L\x83\xB2\xAE\xAC\xAE\x91s;\xAEI\xAE&quot;\xAE\xE5s`\xAES\xD5S\xFF\xBA\xE1\xAE&quot;\xAES\xAEb\xAExsx\xAExs\xC2\xAE?^p%7\xAE\x8B\xFF\xFC\x9F\xF15v\Nn\xAE
-\xFF\xB4nNbC={\xF7PQ\x9E\x9BdMdd\x8D-Kd`\x9E$\x9E&quot;\xD4\x9EV\xB0~\x9E`\x9EIdS\x9EKd\xB8\x9E^P\xB6O\x8D\xDB\xE19\xBA\x93V\xC4u\xE7\xAE\xC4q
-?&quot;\\xB2\V\rh\xE1y\x99\xAE${/Z3f3f \x99\xCCGZ\xE1y\xE1y\xE1yG\xF2\x8F\xF2\x8DR\x8DR\xB8R\xB8R\x9D\xB2\x91G\x99\NQ-\xA9-?-p-x\xFE{\xD6\xD6\xD6\xD6*\xD4\xE4t\x98\xC8\xF8\xD2Pn\x9E\xCE ^\xB6        4        \x8C        \xEA
-\
-\x9C . \xA0 \xE4 B \x80 \xA2 \xFC -\xA4\x92
-\x9E\xF0\x8C\xC8\xFEv\xAE\xCC`\x86\xF2N\xA8 \xDC\\xF2&quot;b\xA6\xDA&amp;h\x96\xC6\xF8D`\x84x\xC6&lt;\xAA~\xC8 d\xC4\xF8p\xBE\x80\xDC   \xBE!!r!\xB4&quot;$&quot;\xE0#X#\x9A$$&quot;$\x8C%%%\x80&amp;&amp;\x86'&amp;'D((&amp;(\x82(\x82(\x82(\x82(\x82(\x82(\x82(\x82(\x82(\x82(\x82(\x82(\xA0(\xBE(\xDC(\xF4) )H)\x88)\x94)\xA0)\xD8*8*8*8*\xBC+X+f+\xC8,H,X,h,\x98\x8BhLf        f        f        t        \x82        \x90        \xAE        \xC8        \xC8n\xE4Copyright \xA9 2009 ParaType Ltd. All rights reserved.PT SansRegularwebfontPT Sans RegularVersion 2.003PTSans-RegularThis font was generated by the Font Squirrel Generator.\xFFgf\x8B        
- - !&quot;#$%&amp;'()*+,-./0123456789:;&lt;=&gt;?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`a\x84\x85\x96\x8B\x8A\x8D\x9E        
-   -\xB2\xB3\xB6\xB7\xB4\xB5\x87\xAB\x8Cuni00A0uni00ADuni2000uni2001uni2002uni2003uni2004uni2005uni2006uni2007uni2008uni2009uni200Auni2010uni2011
-figuredashuni202Funi205FEurouniE000uniFB01uniFB02uniFB03uniFB04 fraction.alt\xB8\xFF\x85\xB0\x8DK\xB0PX\xB1\x8EY\xB1F+X!\xB0YK\xB0RX!\xB0\x80Y\xB0+\X\xB0 E\xB0+D\xB0 E\xB0+DY\xB0+
</del><span class="cx">\ No newline at end of file
</span></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (163654 => 163655)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2014-02-07 23:03:03 UTC (rev 163654)
+++ trunk/Source/WebCore/ChangeLog        2014-02-07 23:07:29 UTC (rev 163655)
</span><span class="lines">@@ -1,3 +1,23 @@
</span><ins>+2014-02-07  Ryosuke Niwa  &lt;rniwa@webkit.org&gt;
+
+        Revert r154384 and r154674 as they broke selection rect computations for text with ligatures.
+
+        * platform/graphics/Font.cpp:
+        (WebCore::Font::drawText):
+        (WebCore::Font::drawEmphasisMarks):
+        (WebCore::Font::selectionRectForText):
+        (WebCore::Font::offsetForPosition):
+        * platform/graphics/FontFastPath.cpp:
+        (WebCore::Font::getGlyphsAndAdvancesForSimpleText):
+        (WebCore::Font::selectionRectForSimpleText):
+        (WebCore::Font::offsetForPositionForSimpleText):
+        * platform/graphics/GlyphBuffer.h:
+        * platform/graphics/WidthIterator.cpp:
+        (WebCore::WidthIterator::WidthIterator):
+        (WebCore::WidthIterator::advanceInternal):
+        (WebCore::WidthIterator::advanceOneCharacter):
+        * platform/graphics/WidthIterator.h:
+
</ins><span class="cx"> 2014-02-07  Benjamin Poulain  &lt;bpoulain@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [WK2] Add support for text document viewport configuration
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsFontcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/Font.cpp (163654 => 163655)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/Font.cpp        2014-02-07 23:03:03 UTC (rev 163654)
+++ trunk/Source/WebCore/platform/graphics/Font.cpp        2014-02-07 23:07:29 UTC (rev 163655)
</span><span class="lines">@@ -334,7 +334,12 @@
</span><span class="cx"> 
</span><span class="cx">     to = (to == -1 ? run.length() : to);
</span><span class="cx"> 
</span><del>-    if (codePath(run) != Complex)
</del><ins>+    CodePath codePathToUse = codePath(run);
+    // FIXME: Use the fast code path once it handles partial runs with kerning and ligatures. See http://webkit.org/b/100050
+    if (codePathToUse != Complex &amp;&amp; typesettingFeatures() &amp;&amp; (from || to != run.length()) &amp;&amp; !run.renderingContext())
+        codePathToUse = Complex;
+
+    if (codePathToUse != Complex)
</ins><span class="cx">         return drawSimpleText(context, run, point, from, to);
</span><span class="cx"> 
</span><span class="cx">     return drawComplexText(context, run, point, from, to);
</span><span class="lines">@@ -348,7 +353,12 @@
</span><span class="cx">     if (to &lt; 0)
</span><span class="cx">         to = run.length();
</span><span class="cx"> 
</span><del>-    if (codePath(run) != Complex)
</del><ins>+    CodePath codePathToUse = codePath(run);
+    // FIXME: Use the fast code path once it handles partial runs with kerning and ligatures. See http://webkit.org/b/100050
+    if (codePathToUse != Complex &amp;&amp; typesettingFeatures() &amp;&amp; (from || to != run.length()) &amp;&amp; !run.renderingContext())
+        codePathToUse = Complex;
+
+    if (codePathToUse != Complex)
</ins><span class="cx">         drawEmphasisMarksForSimpleText(context, run, mark, point, from, to);
</span><span class="cx">     else
</span><span class="cx">         drawEmphasisMarksForComplexText(context, run, mark, point, from, to);
</span><span class="lines">@@ -420,7 +430,12 @@
</span><span class="cx"> {
</span><span class="cx">     to = (to == -1 ? run.length() : to);
</span><span class="cx"> 
</span><del>-    if (codePath(run) != Complex)
</del><ins>+    CodePath codePathToUse = codePath(run);
+    // FIXME: Use the fast code path once it handles partial runs with kerning and ligatures. See http://webkit.org/b/100050
+    if (codePathToUse != Complex &amp;&amp; typesettingFeatures() &amp;&amp; (from || to != run.length()) &amp;&amp; !run.renderingContext())
+        codePathToUse = Complex;
+
+    if (codePathToUse != Complex)
</ins><span class="cx">         return selectionRectForSimpleText(run, point, h, from, to);
</span><span class="cx"> 
</span><span class="cx">     return selectionRectForComplexText(run, point, h, from, to);
</span><span class="lines">@@ -428,7 +443,8 @@
</span><span class="cx"> 
</span><span class="cx"> int Font::offsetForPosition(const TextRun&amp; run, float x, bool includePartialGlyphs) const
</span><span class="cx"> {
</span><del>-    if (codePath(run) != Complex)
</del><ins>+    // FIXME: Use the fast code path once it handles partial runs with kerning and ligatures. See http://webkit.org/b/100050
+    if (codePath(run) != Complex &amp;&amp; !typesettingFeatures())
</ins><span class="cx">         return offsetForPositionForSimpleText(run, x, includePartialGlyphs);
</span><span class="cx"> 
</span><span class="cx">     return offsetForPositionForComplexText(run, x, includePartialGlyphs);
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsFontFastPathcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/FontFastPath.cpp (163654 => 163655)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/FontFastPath.cpp        2014-02-07 23:03:03 UTC (rev 163654)
+++ trunk/Source/WebCore/platform/graphics/FontFastPath.cpp        2014-02-07 23:07:29 UTC (rev 163655)
</span><span class="lines">@@ -127,34 +127,32 @@
</span><span class="cx"> 
</span><span class="cx"> float Font::getGlyphsAndAdvancesForSimpleText(const TextRun&amp; run, int from, int to, GlyphBuffer&amp; glyphBuffer, ForTextEmphasisOrNot forTextEmphasis) const
</span><span class="cx"> {
</span><ins>+    float initialAdvance;
+
</ins><span class="cx">     WidthIterator it(this, run, 0, false, forTextEmphasis);
</span><ins>+    // FIXME: Using separate glyph buffers for the prefix and the suffix is incorrect when kerning or
+    // ligatures are enabled.
</ins><span class="cx">     GlyphBuffer localGlyphBuffer;
</span><del>-    it.advance(run.length(), &amp;localGlyphBuffer);
</del><ins>+    it.advance(from, &amp;localGlyphBuffer);
+    float beforeWidth = it.m_runWidthSoFar;
+    it.advance(to, &amp;glyphBuffer);
</ins><span class="cx"> 
</span><del>-    if (localGlyphBuffer.isEmpty())
</del><ins>+    if (glyphBuffer.isEmpty())
</ins><span class="cx">         return 0;
</span><span class="cx"> 
</span><del>-    float totalWidth = it.m_runWidthSoFar;
-    float beforeWidth = 0;
-    int glyphPos = 0;
-    for (; glyphPos &lt; localGlyphBuffer.size() &amp;&amp; it.m_characterIndexOfGlyph[glyphPos] &lt; from; ++glyphPos)
-        beforeWidth += localGlyphBuffer.advanceAt(glyphPos).width();
-    int glyphFrom = glyphPos;
</del><ins>+    float afterWidth = it.m_runWidthSoFar;
</ins><span class="cx"> 
</span><del>-    float afterWidth = totalWidth;
-    glyphPos = localGlyphBuffer.size() - 1;
-    for (; glyphPos &gt;= glyphFrom &amp;&amp; it.m_characterIndexOfGlyph[glyphPos] &gt;= to; --glyphPos)
-        afterWidth -= localGlyphBuffer.advanceAt(glyphPos).width();
-    int glyphTo = glyphPos + 1;
-
-    glyphBuffer.add(&amp;localGlyphBuffer, glyphFrom, glyphTo - glyphFrom);
-
</del><span class="cx">     if (run.rtl()) {
</span><ins>+        float finalRoundingWidth = it.m_finalRoundingWidth;
+        it.advance(run.length(), &amp;localGlyphBuffer);
+        initialAdvance = finalRoundingWidth + it.m_runWidthSoFar - afterWidth;
+    } else
+        initialAdvance = beforeWidth;
+
+    if (run.rtl())
</ins><span class="cx">         glyphBuffer.reverse(0, glyphBuffer.size());
</span><del>-        return totalWidth - afterWidth;
-    }
</del><span class="cx"> 
</span><del>-    return beforeWidth;
</del><ins>+    return initialAdvance;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> float Font::drawSimpleText(GraphicsContext* context, const TextRun&amp; run, const FloatPoint&amp; point, int from, int to) const
</span><span class="lines">@@ -301,22 +299,15 @@
</span><span class="cx"> {
</span><span class="cx">     GlyphBuffer glyphBuffer;
</span><span class="cx">     WidthIterator it(this, run);
</span><del>-    it.advance(run.length(), &amp;glyphBuffer);
</del><ins>+    it.advance(from, &amp;glyphBuffer);
+    float beforeWidth = it.m_runWidthSoFar;
+    it.advance(to, &amp;glyphBuffer);
+    float afterWidth = it.m_runWidthSoFar;
</ins><span class="cx"> 
</span><del>-    float totalWidth = it.m_runWidthSoFar;
-    float beforeWidth = 0;
-    int glyphPos = 0;
-    for (; glyphPos &lt; glyphBuffer.size() &amp;&amp; it.m_characterIndexOfGlyph[glyphPos] &lt; from; ++glyphPos)
-        beforeWidth += glyphBuffer.advanceAt(glyphPos).width();
-    int glyphFrom = glyphPos;
-
-    float afterWidth = totalWidth;
-    glyphPos = glyphBuffer.size() - 1;
-    for (; glyphPos &gt;= glyphFrom &amp;&amp; it.m_characterIndexOfGlyph[glyphPos] &gt;= to; --glyphPos)
-        afterWidth -= glyphBuffer.advanceAt(glyphPos).width();
-
</del><span class="cx">     // Using roundf() rather than ceilf() for the right edge as a compromise to ensure correct caret positioning.
</span><span class="cx">     if (run.rtl()) {
</span><ins>+        it.advance(run.length(), &amp;glyphBuffer);
+        float totalWidth = it.m_runWidthSoFar;
</ins><span class="cx">         return FloatRect(floorf(point.x() + totalWidth - afterWidth), point.y(), roundf(point.x() + totalWidth - beforeWidth) - floorf(point.x() + totalWidth - afterWidth), h);
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -325,50 +316,45 @@
</span><span class="cx"> 
</span><span class="cx"> int Font::offsetForPositionForSimpleText(const TextRun&amp; run, float x, bool includePartialGlyphs) const
</span><span class="cx"> {
</span><del>-    GlyphBuffer glyphBuffer;
-    WidthIterator it(this, run);
-    it.advance(run.length(), &amp;glyphBuffer);
</del><ins>+    float delta = x;
</ins><span class="cx"> 
</span><del>-    int characterOffset = 0;
</del><ins>+    WidthIterator it(this, run);
+    GlyphBuffer localGlyphBuffer;
+    unsigned offset;
</ins><span class="cx">     if (run.rtl()) {
</span><del>-        float currentX = it.m_runWidthSoFar;
-        for (int glyphPosition = 0; glyphPosition &lt;= glyphBuffer.size(); ++glyphPosition) {
-            if (glyphPosition == glyphBuffer.size()) {
-                characterOffset = run.length();
</del><ins>+        delta -= floatWidthForSimpleText(run);
+        while (1) {
+            offset = it.m_currentCharacter;
+            float w;
+            if (!it.advanceOneCharacter(w, localGlyphBuffer))
</ins><span class="cx">                 break;
</span><del>-            }
-            characterOffset = it.m_characterIndexOfGlyph[glyphPosition];
-            float glyphWidth = glyphBuffer.advanceAt(glyphPosition).width();
</del><ins>+            delta += w;
</ins><span class="cx">             if (includePartialGlyphs) {
</span><del>-                if (currentX - glyphWidth / 2.0f &lt;= x)
</del><ins>+                if (delta - w / 2 &gt;= 0)
</ins><span class="cx">                     break;
</span><span class="cx">             } else {
</span><del>-                if (currentX - glyphWidth &lt;= x)
</del><ins>+                if (delta &gt;= 0)
</ins><span class="cx">                     break;
</span><span class="cx">             }
</span><del>-            currentX -= glyphWidth;
</del><span class="cx">         }
</span><span class="cx">     } else {
</span><del>-        float currentX = 0;
-        for (int glyphPosition = 0; glyphPosition &lt;= glyphBuffer.size(); ++glyphPosition) {
-            if (glyphPosition == glyphBuffer.size()) {
-                characterOffset = run.length();
</del><ins>+        while (1) {
+            offset = it.m_currentCharacter;
+            float w;
+            if (!it.advanceOneCharacter(w, localGlyphBuffer))
</ins><span class="cx">                 break;
</span><del>-            }
-            characterOffset = it.m_characterIndexOfGlyph[glyphPosition];
-            float glyphWidth = glyphBuffer.advanceAt(glyphPosition).width();
</del><ins>+            delta -= w;
</ins><span class="cx">             if (includePartialGlyphs) {
</span><del>-                if (currentX + glyphWidth / 2.0f &gt;= x)
</del><ins>+                if (delta + w / 2 &lt;= 0)
</ins><span class="cx">                     break;
</span><span class="cx">             } else {
</span><del>-                if (currentX + glyphWidth &gt;= x)
</del><ins>+                if (delta &lt;= 0)
</ins><span class="cx">                     break;
</span><span class="cx">             }
</span><del>-            currentX += glyphWidth;
</del><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    return characterOffset;
</del><ins>+    return offset;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-} // namespace WebCore
</del><ins>+}
</ins></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsGlyphBufferh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/GlyphBuffer.h (163654 => 163655)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/GlyphBuffer.h        2014-02-07 23:03:03 UTC (rev 163654)
+++ trunk/Source/WebCore/platform/graphics/GlyphBuffer.h        2014-02-07 23:07:29 UTC (rev 163655)
</span><span class="lines">@@ -122,16 +122,6 @@
</span><span class="cx"> #endif
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    void add(const GlyphBuffer* glyphBuffer, int from, int len)
-    {
-        m_glyphs.append(glyphBuffer-&gt;glyphs(from), len);
-        m_advances.append(glyphBuffer-&gt;advances(from), len);
-        m_fontData.append(glyphBuffer-&gt;m_fontData.data() + from, len);
-#if PLATFORM(WIN)
-        m_offsets.append(glyphBuffer-&gt;m_offsets.data() + from, len);
-#endif
-    }
-
</del><span class="cx">     void add(Glyph glyph, const SimpleFontData* font, float width, const FloatSize* offset = 0)
</span><span class="cx">     {
</span><span class="cx">         m_fontData.append(font);
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsWidthIteratorcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/WidthIterator.cpp (163654 => 163655)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/WidthIterator.cpp        2014-02-07 23:03:03 UTC (rev 163654)
+++ trunk/Source/WebCore/platform/graphics/WidthIterator.cpp        2014-02-07 23:07:29 UTC (rev 163655)
</span><span class="lines">@@ -66,8 +66,6 @@
</span><span class="cx">         else
</span><span class="cx">             m_expansionPerOpportunity = m_expansion / expansionOpportunityCount;
</span><span class="cx">     }
</span><del>-    // Character-index will end up the same or slightly shorter than m_run, so if we reserve that much it will never need to resize.
-    m_characterIndexOfGlyph.reserveInitialCapacity(m_run.length());
</del><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> GlyphData WidthIterator::glyphDataForCharacter(UChar32 character, bool mirror, int currentCharacter, unsigned&amp; advanceLength)
</span><span class="lines">@@ -174,8 +172,7 @@
</span><span class="cx">     CharactersTreatedAsSpace charactersTreatedAsSpace;
</span><span class="cx">     while (textIterator.consume(character, clusterLength)) {
</span><span class="cx">         unsigned advanceLength = clusterLength;
</span><del>-        int currentCharacterIndex = textIterator.currentCharacter();
-        const GlyphData&amp; glyphData = glyphDataForCharacter(character, rtl, currentCharacterIndex, advanceLength);
</del><ins>+        const GlyphData&amp; glyphData = glyphDataForCharacter(character, rtl, textIterator.currentCharacter(), advanceLength);
</ins><span class="cx">         Glyph glyph = glyphData.glyph;
</span><span class="cx">         const SimpleFontData* fontData = glyphData.fontData;
</span><span class="cx"> 
</span><span class="lines">@@ -241,7 +238,6 @@
</span><span class="cx">                                     glyphBuffer-&gt;add(fontData-&gt;zeroWidthSpaceGlyph(), fontData, m_expansionPerOpportunity);
</span><span class="cx">                                 else
</span><span class="cx">                                     glyphBuffer-&gt;add(fontData-&gt;spaceGlyph(), fontData, expansionAtThisOpportunity);
</span><del>-                                m_characterIndexOfGlyph.append(currentCharacterIndex);
</del><span class="cx">                             } else
</span><span class="cx">                                 glyphBuffer-&gt;expandLastAdvance(expansionAtThisOpportunity);
</span><span class="cx">                         }
</span><span class="lines">@@ -308,10 +304,8 @@
</span><span class="cx">                 widthSinceLastRounding += width;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        if (glyphBuffer) {
</del><ins>+        if (glyphBuffer)
</ins><span class="cx">             glyphBuffer-&gt;add(glyph, fontData, (rtl ? oldWidth + lastRoundingWidth : width));
</span><del>-            m_characterIndexOfGlyph.append(currentCharacterIndex);
-        }
</del><span class="cx"> 
</span><span class="cx">         lastRoundingWidth = width - oldWidth;
</span><span class="cx"> 
</span><span class="lines">@@ -351,4 +345,15 @@
</span><span class="cx">     return advanceInternal(textIterator, glyphBuffer);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+bool WidthIterator::advanceOneCharacter(float&amp; width, GlyphBuffer&amp; glyphBuffer)
+{
+    int oldSize = glyphBuffer.size();
+    advance(m_currentCharacter + 1, &amp;glyphBuffer);
+    float w = 0;
+    for (int i = oldSize; i &lt; glyphBuffer.size(); ++i)
+        w += glyphBuffer.advanceAt(i).width();
+    width = w;
+    return glyphBuffer.size() &gt; oldSize;
</ins><span class="cx"> }
</span><ins>+
+}
</ins></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsWidthIteratorh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/WidthIterator.h (163654 => 163655)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/WidthIterator.h        2014-02-07 23:03:03 UTC (rev 163654)
+++ trunk/Source/WebCore/platform/graphics/WidthIterator.h        2014-02-07 23:07:29 UTC (rev 163655)
</span><span class="lines">@@ -42,6 +42,7 @@
</span><span class="cx">     WidthIterator(const Font*, const TextRun&amp;, HashSet&lt;const SimpleFontData*&gt;* fallbackFonts = 0, bool accountForGlyphBounds = false, bool forTextEmphasis = false);
</span><span class="cx"> 
</span><span class="cx">     unsigned advance(int to, GlyphBuffer*);
</span><ins>+    bool advanceOneCharacter(float&amp; width, GlyphBuffer&amp;);
</ins><span class="cx"> 
</span><span class="cx">     float maxGlyphBoundingBoxY() const { ASSERT(m_accountForGlyphBounds); return m_maxGlyphBoundingBoxY; }
</span><span class="cx">     float minGlyphBoundingBoxY() const { ASSERT(m_accountForGlyphBounds); return m_minGlyphBoundingBoxY; }
</span><span class="lines">@@ -79,8 +80,6 @@
</span><span class="cx">     float m_expansionPerOpportunity;
</span><span class="cx">     bool m_isAfterExpansion;
</span><span class="cx">     float m_finalRoundingWidth;
</span><del>-    // An inline capacity of 10 catches around 2/3 of the cases. To catch 90% we would need 32.
-    Vector&lt;int, 10&gt; m_characterIndexOfGlyph;
</del><span class="cx"> 
</span><span class="cx"> #if ENABLE(SVG_FONTS)
</span><span class="cx">     String m_lastGlyphName;
</span></span></pre>
</div>
</div>

</body>
</html>