<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE bugzilla SYSTEM "https://bugs.webkit.org/page.cgi?id=bugzilla.dtd">

<bugzilla version="5.0.4.1"
          urlbase="https://bugs.webkit.org/"
          
          maintainer="admin@webkit.org"
>

    <bug>
          <bug_id>18031</bug_id>
          
          <creation_ts>2008-03-23 19:10:23 -0700</creation_ts>
          <short_desc>SVGTextElement.getStartPositionOfChar is wrong in various cases (affects Acid3 test 79)</short_desc>
          <delta_ts>2008-03-26 19:47:52 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>SVG</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Mac</rep_platform>
          <op_sys>OS X 10.5</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          <dependson>18046</dependson>
          <blocked>17064</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Maciej Stachowiak">mjs</reporter>
          <assigned_to name="Maciej Stachowiak">mjs</assigned_to>
          <cc>eric</cc>
    
    <cc>ian</cc>
    
    <cc>webkit</cc>
    
    <cc>zimmermann</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>74901</commentid>
    <comment_count>0</comment_count>
    <who name="Maciej Stachowiak">mjs</who>
    <bug_when>2008-03-23 19:10:23 -0700</bug_when>
    <thetext>With my fix for 17062, Acid3 test 79 continues to fail because it gets the wrong start position for nearly every character in the string. I modified Acid3 to print all errors in each test, and to look at the position delta for each character, to learn more about the errors. It appears that the most common error is counting the glyph advance instead of 0 for positions between characters of a multi-character glyph, another likely one is failing to take kerning into account, as well as failing to render altGlyph properly:

Test 79 failed: character advance + kerning 2, which is between the first character of a two-character glyph and the second character of a two-character glyph, is 300 but should be 0.
character advance + kerning 3, which is between the second character of a two-character glyph and a normal character, which shouldn&apos;t be the first character of a two-character glyph, is 500 but should be 200.
character advance + kerning 6, which is between a normal character, which has some kerning after it and the first character of a two-character glyph, which has some kerning before it, is 10000 but should be 10200.
character advance + kerning 7, which is between the first character of a two-character glyph, which has some kerning before it and the second character of a two-character glyph, which has some kerning before it, is 10000 but should be 0.
character advance + kerning 8, which is between the second character of a two-character glyph, which has some kerning before it and the first character of a six-character glyph, which happens to look like a Unicode range, where the range-specified glyph has kerning after it, but this glyph does not, is 10000 but should be 1300.
character advance + kerning 9, which is between the first character of a six-character glyph, which happens to look like a Unicode range, where the range-specified glyph has kerning after it, but this glyph does not and the second character of a six-character glyph, which happens to look like a Unicode range, where the range-specified glyph has kerning after it, but this glyph does not, is 10000 but should be 0.
character advance + kerning 10, which is between the second character of a six-character glyph, which happens to look like a Unicode range, where the range-specified glyph has kerning after it, but this glyph does not and the third character of a six-character glyph, which happens to look like a Unicode range, where the range-specified glyph has kerning after it, but this glyph does not, is 10000 but should be 0.
character advance + kerning 11, which is between the third character of a six-character glyph, which happens to look like a Unicode range, where the range-specified glyph has kerning after it, but this glyph does not and the fourth character of a six-character glyph, which happens to look like a Unicode range, where the range-specified glyph has kerning after it, but this glyph does not, is 10000 but should be 0.
character advance + kerning 12, which is between the fourth character of a six-character glyph, which happens to look like a Unicode range, where the range-specified glyph has kerning after it, but this glyph does not and the fifth character of a six-character glyph, which happens to look like a Unicode range, where the range-specified glyph has kerning after it, but this glyph does not, is 10000 but should be 0.
character advance + kerning 13, which is between the fifth character of a six-character glyph, which happens to look like a Unicode range, where the range-specified glyph has kerning after it, but this glyph does not and the sixth character of a six-character glyph, which happens to look like a Unicode range, where the range-specified glyph has kerning after it, but this glyph does not, is 10000 but should be 0.
character advance + kerning 14, which is between the sixth character of a six-character glyph, which happens to look like a Unicode range, where the range-specified glyph has kerning after it, but this glyph does not and the first character of a six-character glyph, which happens to look like a Unicode range, where the range-specified glyph has kerning before it, but this glyph does not, is 10000 but should be 1700.
character advance + kerning 15, which is between the first character of a six-character glyph, which happens to look like a Unicode range, where the range-specified glyph has kerning before it, but this glyph does not and the second character of a six-character glyph, which happens to look like a Unicode range, where the range-specified glyph has kerning before it, but this glyph does not, is 10000 but should be 0.
character advance + kerning 16, which is between the second character of a six-character glyph, which happens to look like a Unicode range, where the range-specified glyph has kerning before it, but this glyph does not and the third character of a six-character glyph, which happens to look like a Unicode range, where the range-specified glyph has kerning before it, but this glyph does not, is 10000 but should be 0.
character advance + kerning 17, which is between the third character of a six-character glyph, which happens to look like a Unicode range, where the range-specified glyph has kerning before it, but this glyph does not and the fourth character of a six-character glyph, which happens to look like a Unicode range, where the range-specified glyph has kerning before it, but this glyph does not, is 10000 but should be 0.
character advance + kerning 18, which is between the fourth character of a six-character glyph, which happens to look like a Unicode range, where the range-specified glyph has kerning before it, but this glyph does not and the fifth character of a six-character glyph, which happens to look like a Unicode range, where the range-specified glyph has kerning before it, but this glyph does not, is 10000 but should be 0.
character advance + kerning 19, which is between the fifth character of a six-character glyph, which happens to look like a Unicode range, where the range-specified glyph has kerning before it, but this glyph does not and the sixth character of a six-character glyph, which happens to look like a Unicode range, where the range-specified glyph has kerning before it, but this glyph does not, is 10000 but should be 0.
character advance + kerning 20, which is between the sixth character of a six-character glyph, which happens to look like a Unicode range, where the range-specified glyph has kerning before it, but this glyph does not and a normal character, which has some kerning after it that is specified by glyph name, is 10000 but should be 1700.
character advance + kerning 21, which is between a normal character, which has some kerning after it that is specified by glyph name and a normal character, which has some kerning before it that is specified by glyph name, is 2300 but should be 2500.
character advance + kerning 25, which is between a normal character, whose glyph should match the one with a lang=&quot;&quot; attribute on it and a normal character, which has some kerning after it that is equal to the advance of the character, is 4300 but should be 4100.
character advance + kerning 26, which is between a normal character, which has some kerning after it that is equal to the advance of the character and a normal character, which has some kerning before it that is equal to the advance of the previous character, is 4700 but should be 0.
character advance + kerning 31, which is between a normal character, whose glyph is chosen to be another by using &lt;altGlyph&gt; and a character not in Plane 0 (high surrogate pair), is 10000 but should be 2900.
character advance + kerning 32, which is between a character not in Plane 0 (high surrogate pair) and a character not in Plane 0 (low surrogate pair), is 10000 but should be 2900.
character advance + kerning 33, which is between a character not in Plane 0 (low surrogate pair) and a normal character, is 10000 but should be 0.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>74957</commentid>
    <comment_count>1</comment_count>
      <attachid>20004</attachid>
    <who name="Maciej Stachowiak">mjs</who>
    <bug_when>2008-03-24 02:20:46 -0700</bug_when>
    <thetext>Created attachment 20004
preliminary patch

With this patch we get much fewer of the advances wrong. It fixes measurement of start position for multichar glyphs, making sure to count the glyph&apos;s advance only after its last char. Still needs test case (and probably code cleanup).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>74958</commentid>
    <comment_count>2</comment_count>
    <who name="Maciej Stachowiak">mjs</who>
    <bug_when>2008-03-24 02:23:21 -0700</bug_when>
    <thetext>The following 9 incorrect advances remain after the patch above (down from 23):

character advance + kerning 4, which is between a normal character, which shouldn&apos;t be the first character of a two-character glyph and a normal character, which shouldn&apos;t be the second character of a two-character glyph, is 0 but should be 300.
character advance + kerning 5, which is between a normal character, which shouldn&apos;t be the second character of a two-character glyph and a normal character, which has some kerning after it, is 700 but should be 1100.
character advance + kerning 6, which is between a normal character, which has some kerning after it and the first character of a two-character glyph, which has some kerning before it, is 10000 but should be 10200.
character advance + kerning 21, which is between a normal character, which has some kerning after it that is specified by glyph name and a normal character, which has some kerning before it that is specified by glyph name, is 2300 but should be 2500.
character advance + kerning 25, which is between a normal character, whose glyph should match the one with a lang=&quot;&quot; attribute on it and a normal character, which has some kerning after it that is equal to the advance of the character, is 4300 but should be 4100.
character advance + kerning 26, which is between a normal character, which has some kerning after it that is equal to the advance of the character and a normal character, which has some kerning before it that is equal to the advance of the previous character, is 4700 but should be 0.
character advance + kerning 31, which is between a normal character, whose glyph is chosen to be another by using &lt;altGlyph&gt; and a character not in Plane 0 (high surrogate pair), is 10000 but should be 2900.
character advance + kerning 32, which is between a character not in Plane 0 (high surrogate pair) and a character not in Plane 0 (low surrogate pair), is 0 but should be 2900.
character advance + kerning 33, which is between a character not in Plane 0 (low surrogate pair) and a normal character, is 2900 but should be 0.
</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>74960</commentid>
    <comment_count>3</comment_count>
    <who name="Maciej Stachowiak">mjs</who>
    <bug_when>2008-03-24 02:41:13 -0700</bug_when>
    <thetext>Yeah, I am pretty sure the test is wrong. These advances are given:

        2900,        // &amp;#x10085; high surrogate pair
        0,           // &amp;#x10085; low surrogate pair

But &lt;http://www.w3.org/TR/SVG/text.html#InterfaceSVGTextContentElement&gt; says:
&quot;If multiple consecutive characters are rendered inseparably (e.g., as a single glyph or a sequence of glyphs), then each of the inseparable characters will return the start position for the first glyph.&quot;

The two halves of a surrogate pair are certainly rendered inseparably, so they must have the same start position and so there cannot be an advance between them.  
</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>74961</commentid>
    <comment_count>4</comment_count>
    <who name="Maciej Stachowiak">mjs</who>
    <bug_when>2008-03-24 02:48:24 -0700</bug_when>
    <thetext>That light comment might seem a little confusing out of context of my analaysis of remaining failures, which I meant to paste in but somehow lost:

Advances 4 &amp; 5: SVG font glyph matching is incorrectly picking the longest match instead of the first, when selecting glyphs.

Advances 6, 21 &amp; 26: missing support for kerning pairs and hkern element.

Advance 25: we don&apos;t consider language during glyph selection

Advance 31: altGlyph renders the contents instead of the substitute glyph

Advances 32 &amp; 33: apparent bug in the test; it seems to expect the advance of a surrogate pair to happen on the first code point instead of the second (this doesn&apos;t seem to match the SVG spec).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>74999</commentid>
    <comment_count>5</comment_count>
    <who name="Ian &apos;Hixie&apos; Hickson">ian</who>
    <bug_when>2008-03-24 12:45:17 -0700</bug_when>
    <thetext>Fixed the surrogate thing. Sorry. That was my bad, when I split out the surrogate into two as per the recent WG decision, I assumed the advance would go on the first codepoint and not the second. I see now that that is inconsistent with the rest of the test. :-)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>75002</commentid>
    <comment_count>6</comment_count>
    <who name="Maciej Stachowiak">mjs</who>
    <bug_when>2008-03-24 13:31:00 -0700</bug_when>
    <thetext>Results with Hixie&apos;s fix to the test:

character advance + kerning 4, which is between a normal character, which shouldn&apos;t be the first character of a two-character glyph and a normal character, which shouldn&apos;t be the second character of a two-character glyph, is 0 but should be 300.
character advance + kerning 5, which is between a normal character, which shouldn&apos;t be the second character of a two-character glyph and a normal character, which has some kerning after it, is 700 but should be 1100.
character advance + kerning 6, which is between a normal character, which has some kerning after it and the first character of a two-character glyph, which has some kerning before it, is 10000 but should be 10200.
character advance + kerning 21, which is between a normal character, which has some kerning after it that is specified by glyph name and a normal character, which has some kerning before it that is specified by glyph name, is 2300 but should be 2500.
character advance + kerning 25, which is between a normal character, whose glyph should match the one with a lang=&quot;&quot; attribute on it and a normal character, which has some kerning after it that is equal to the advance of the character, is 4300 but should be 4100.
character advance + kerning 26, which is between a normal character, which has some kerning after it that is equal to the advance of the character and a normal character, which has some kerning before it that is equal to the advance of the previous character, is 4700 but should be 0.
character advance + kerning 31, which is between a normal character, whose glyph is chosen to be another by using &lt;altGlyph&gt; and a character not in Plane 0 (high surrogate pair), is 10000 but should be 2900.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>75397</commentid>
    <comment_count>7</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2008-03-26 19:47:52 -0700</bug_when>
    <thetext>Maciej and Hyatt finished the last bits of this in r31342.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>20004</attachid>
            <date>2008-03-24 02:20:46 -0700</date>
            <delta_ts>2008-03-24 02:20:46 -0700</delta_ts>
            <desc>preliminary patch</desc>
            <filename>multichar-glyph-measurement.patch.txt</filename>
            <type>text/plain</type>
            <size>16114</size>
            <attacher name="Maciej Stachowiak">mjs</attacher>
            
              <data encoding="base64">SW5kZXg6IHBsYXRmb3JtL2dyYXBoaWNzL0ZvbnQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIHBsYXRmb3Jt
L2dyYXBoaWNzL0ZvbnQuY3BwCShyZXZpc2lvbiAzMTIzOSkKKysrIHBsYXRmb3JtL2dyYXBoaWNz
L0ZvbnQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC03MDgsNiArNzA4LDE5IEBAIGZsb2F0IEZvbnQ6
OmZsb2F0V2lkdGgoY29uc3QgVGV4dFJ1biYgcnUKICAgICByZXR1cm4gZmxvYXRXaWR0aEZvckNv
bXBsZXhUZXh0KHJ1bik7CiB9CiAKK2Zsb2F0IEZvbnQ6OmZsb2F0V2lkdGgoY29uc3QgVGV4dFJ1
biYgcnVuLCBpbnQgZXh0cmFDaGFyc0F2YWlsYWJsZSwgaW50JiBjaGFyc0NvbnN1bWVkKSBjb25z
dAoreworI2lmIEVOQUJMRShTVkdfRk9OVFMpCisgICAgaWYgKHByaW1hcnlGb250KCktPmlzU1ZH
Rm9udCgpKQorICAgICAgICByZXR1cm4gZmxvYXRXaWR0aFVzaW5nU1ZHRm9udChydW4sIGV4dHJh
Q2hhcnNBdmFpbGFibGUsIGNoYXJzQ29uc3VtZWQpOworI2VuZGlmCisKKyAgICBjaGFyc0NvbnN1
bWVkID0gcnVuLmxlbmd0aCgpOworICAgIGlmIChjYW5Vc2VHbHlwaENhY2hlKHJ1bikpCisgICAg
ICAgIHJldHVybiBmbG9hdFdpZHRoRm9yU2ltcGxlVGV4dChydW4sIDApOworICAgIHJldHVybiBm
bG9hdFdpZHRoRm9yQ29tcGxleFRleHQocnVuKTsKK30KKwogZmxvYXQgRm9udDo6ZmxvYXRXaWR0
aEZvclNpbXBsZVRleHQoY29uc3QgVGV4dFJ1biYgcnVuLCBHbHlwaEJ1ZmZlciogZ2x5cGhCdWZm
ZXIpIGNvbnN0CiB7CiAgICAgV2lkdGhJdGVyYXRvciBpdCh0aGlzLCBydW4pOwpJbmRleDogcGxh
dGZvcm0vZ3JhcGhpY3MvRm9udC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIHBsYXRmb3JtL2dyYXBoaWNzL0Zv
bnQuaAkocmV2aXNpb24gMzEyMzkpCisrKyBwbGF0Zm9ybS9ncmFwaGljcy9Gb250LmgJKHdvcmtp
bmcgY29weSkKQEAgLTE3MCw2ICsxNzAsNyBAQCBwdWJsaWM6CiAKICAgICBpbnQgd2lkdGgoY29u
c3QgVGV4dFJ1biYpIGNvbnN0OwogICAgIGZsb2F0IGZsb2F0V2lkdGgoY29uc3QgVGV4dFJ1biYp
IGNvbnN0OworICAgIGZsb2F0IGZsb2F0V2lkdGgoY29uc3QgVGV4dFJ1biYgcnVuLCBpbnQgZXh0
cmFDaGFyc0F2YWlsYWJsZSwgaW50JiBjaGFyc0NvbnN1bWVkKSBjb25zdDsKIAogICAgIGludCBv
ZmZzZXRGb3JQb3NpdGlvbihjb25zdCBUZXh0UnVuJiwgaW50IHBvc2l0aW9uLCBib29sIGluY2x1
ZGVQYXJ0aWFsR2x5cGhzKSBjb25zdDsKICAgICBGbG9hdFJlY3Qgc2VsZWN0aW9uUmVjdEZvclRl
eHQoY29uc3QgVGV4dFJ1biYsIGNvbnN0IEludFBvaW50JiwgaW50IGgsIGludCBmcm9tID0gMCwg
aW50IHRvID0gLTEpIGNvbnN0OwpAQCAtMjM0LDYgKzIzNSw3IEBAIHByaXZhdGU6CiAjaWYgRU5B
QkxFKFNWR19GT05UUykKICAgICB2b2lkIGRyYXdUZXh0VXNpbmdTVkdGb250KEdyYXBoaWNzQ29u
dGV4dCosIGNvbnN0IFRleHRSdW4mLCBjb25zdCBGbG9hdFBvaW50JiwgaW50IGZyb20sIGludCB0
bykgY29uc3Q7CiAgICAgZmxvYXQgZmxvYXRXaWR0aFVzaW5nU1ZHRm9udChjb25zdCBUZXh0UnVu
JikgY29uc3Q7CisgICAgZmxvYXQgZmxvYXRXaWR0aFVzaW5nU1ZHRm9udChjb25zdCBUZXh0UnVu
JiwgaW50IGV4dHJhQ2hhcnNBdmFpbGFibGUsIGludCYgY2hhcnNDb25zdW1lZCkgY29uc3Q7CiAg
ICAgRmxvYXRSZWN0IHNlbGVjdGlvblJlY3RGb3JUZXh0VXNpbmdTVkdGb250KGNvbnN0IFRleHRS
dW4mLCBjb25zdCBJbnRQb2ludCYsIGludCBoLCBpbnQgZnJvbSwgaW50IHRvKSBjb25zdDsKICAg
ICBpbnQgb2Zmc2V0Rm9yUG9zaXRpb25Gb3JUZXh0VXNpbmdTVkdGb250KGNvbnN0IFRleHRSdW4m
LCBpbnQgcG9zaXRpb24sIGJvb2wgaW5jbHVkZVBhcnRpYWxHbHlwaHMpIGNvbnN0OwogI2VuZGlm
CkluZGV4OiByZW5kZXJpbmcvU1ZHSW5saW5lVGV4dEJveC5jcHAKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gcmVu
ZGVyaW5nL1NWR0lubGluZVRleHRCb3guY3BwCShyZXZpc2lvbiAzMTIzOSkKKysrIHJlbmRlcmlu
Zy9TVkdJbmxpbmVUZXh0Qm94LmNwcAkod29ya2luZyBjb3B5KQpAQCAtNzQsMTMgKzc0LDEzIEBA
IFNWR1Jvb3RJbmxpbmVCb3gqIFNWR0lubGluZVRleHRCb3g6OnN2Z1IKICAgICByZXR1cm4gc3Rh
dGljX2Nhc3Q8U1ZHUm9vdElubGluZUJveCo+KHBhcmVudEJveCk7CiB9CiAKLWZsb2F0IFNWR0lu
bGluZVRleHRCb3g6OmNhbGN1bGF0ZUdseXBoV2lkdGgoUmVuZGVyU3R5bGUqIHN0eWxlLCBpbnQg
b2Zmc2V0KSBjb25zdAorZmxvYXQgU1ZHSW5saW5lVGV4dEJveDo6Y2FsY3VsYXRlR2x5cGhXaWR0
aChSZW5kZXJTdHlsZSogc3R5bGUsIGludCBvZmZzZXQsIGludCBleHRyYUNoYXJzQXZhaWxhYmxl
LCBpbnQmIGNoYXJzQ29uc3VtZWQpIGNvbnN0CiB7CiAgICAgQVNTRVJUKHN0eWxlKTsKLSAgICBy
ZXR1cm4gc3R5bGUtPmZvbnQoKS5mbG9hdFdpZHRoKHN2Z1RleHRSdW5Gb3JJbmxpbmVUZXh0Qm94
KHRleHRPYmplY3QoKS0+dGV4dCgpLT5jaGFyYWN0ZXJzKCkgKyBvZmZzZXQsIDEsIHN0eWxlLCB0
aGlzLCAwKSk7CisgICAgcmV0dXJuIHN0eWxlLT5mb250KCkuZmxvYXRXaWR0aChzdmdUZXh0UnVu
Rm9ySW5saW5lVGV4dEJveCh0ZXh0T2JqZWN0KCktPnRleHQoKS0+Y2hhcmFjdGVycygpICsgb2Zm
c2V0LCAxLCBzdHlsZSwgdGhpcywgMCksIGV4dHJhQ2hhcnNBdmFpbGFibGUsIGNoYXJzQ29uc3Vt
ZWQpOwogfQogCi1mbG9hdCBTVkdJbmxpbmVUZXh0Qm94OjpjYWxjdWxhdGVHbHlwaEhlaWdodChS
ZW5kZXJTdHlsZSogc3R5bGUsIGludCBvZmZzZXQpIGNvbnN0CitmbG9hdCBTVkdJbmxpbmVUZXh0
Qm94OjpjYWxjdWxhdGVHbHlwaEhlaWdodChSZW5kZXJTdHlsZSogc3R5bGUsIGludCBvZmZzZXQs
IGludCBleHRyYUNoYXJzQXZhaWxhYmxlKSBjb25zdAogewogICAgIEFTU0VSVChzdHlsZSk7CiAK
QEAgLTk2LDEwICs5NiwxMiBAQCBGbG9hdFJlY3QgU1ZHSW5saW5lVGV4dEJveDo6Y2FsY3VsYXRl
R2x5CiAgICAgLy8gVGFrZSBSVEwgdGV4dCBpbnRvIGFjY291bnQgYW5kIHBpY2sgcmlnaHQgZ2x5
cGggd2lkdGgvaGVpZ2h0LgogICAgIGZsb2F0IGdseXBoV2lkdGggPSAwLjBmOwogCisgICAgLy8g
RklYTUU6IGFjY291bnQgZm9yIG11bHRpLWNoYXJhY3RlciBnbHlwaHMKKyAgICBpbnQgY2hhcnND
b25zdW1lZDsKICAgICBpZiAoIW1fcmV2ZXJzZWQpCi0gICAgICAgIGdseXBoV2lkdGggPSBjYWxj
dWxhdGVHbHlwaFdpZHRoKHN0eWxlLCBvZmZzZXQpOworICAgICAgICBnbHlwaFdpZHRoID0gY2Fs
Y3VsYXRlR2x5cGhXaWR0aChzdHlsZSwgb2Zmc2V0LCAwLCBjaGFyc0NvbnN1bWVkKTsKICAgICBl
bHNlCi0gICAgICAgIGdseXBoV2lkdGggPSBjYWxjdWxhdGVHbHlwaFdpZHRoKHN0eWxlLCBzdGFy
dCgpICsgZW5kKCkgLSBvZmZzZXQpOworICAgICAgICBnbHlwaFdpZHRoID0gY2FsY3VsYXRlR2x5
cGhXaWR0aChzdHlsZSwgc3RhcnQoKSArIGVuZCgpIC0gb2Zmc2V0LCAwLCBjaGFyc0NvbnN1bWVk
KTsKIAogICAgIGZsb2F0IHgxID0gc3ZnQ2hhci54OwogICAgIGZsb2F0IHgyID0gc3ZnQ2hhci54
ICsgZ2x5cGhXaWR0aDsKSW5kZXg6IHJlbmRlcmluZy9TVkdJbmxpbmVUZXh0Qm94LmgKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gcmVuZGVyaW5nL1NWR0lubGluZVRleHRCb3guaAkocmV2aXNpb24gMzEyMzkpCisr
KyByZW5kZXJpbmcvU1ZHSW5saW5lVGV4dEJveC5oCSh3b3JraW5nIGNvcHkpCkBAIC01OCw4ICs1
OCw4IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKICAgICAgICAgU1ZHUm9vdElubGluZUJveCogc3Zn
Um9vdElubGluZUJveCgpIGNvbnN0OwogCiAgICAgICAgIC8vIEhlbHBlciBmdW5jdGlvbnMgc2hh
cmVkIHdpdGggU1ZHUm9vdElubGluZUJveCAgICAgCi0gICAgICAgIGZsb2F0IGNhbGN1bGF0ZUds
eXBoV2lkdGgoUmVuZGVyU3R5bGUqLCBpbnQgb2Zmc2V0KSBjb25zdDsKLSAgICAgICAgZmxvYXQg
Y2FsY3VsYXRlR2x5cGhIZWlnaHQoUmVuZGVyU3R5bGUqLCBpbnQgb2Zmc2V0KSBjb25zdDsKKyAg
ICAgICAgZmxvYXQgY2FsY3VsYXRlR2x5cGhXaWR0aChSZW5kZXJTdHlsZSogc3R5bGUsIGludCBv
ZmZzZXQsIGludCBleHRyYUNoYXJzQXZhaWxhYmxlLCBpbnQmIGNoYXJzQ29uc3VtZWQpIGNvbnN0
OworICAgICAgICBmbG9hdCBjYWxjdWxhdGVHbHlwaEhlaWdodChSZW5kZXJTdHlsZSosIGludCBv
ZmZzZXQsIGludCBleHRyYUNoYXJzQXZhaWxhYmxlKSBjb25zdDsKIAogICAgICAgICBGbG9hdFJl
Y3QgY2FsY3VsYXRlR2x5cGhCb3VuZGFyaWVzKFJlbmRlclN0eWxlKiwgaW50IG9mZnNldCwgY29u
c3QgU1ZHQ2hhciYpIGNvbnN0OwogICAgICAgICBTVkdDaGFyKiBjbG9zZXN0Q2hhcmFjdGVyVG9Q
b3NpdGlvbihpbnQgeCwgaW50IHksIGludCYgb2Zmc2V0KSBjb25zdDsKSW5kZXg6IHJlbmRlcmlu
Zy9TVkdSb290SW5saW5lQm94LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSByZW5kZXJpbmcvU1ZHUm9vdElu
bGluZUJveC5jcHAJKHJldmlzaW9uIDMxMjM5KQorKysgcmVuZGVyaW5nL1NWR1Jvb3RJbmxpbmVC
b3guY3BwCSh3b3JraW5nIGNvcHkpCkBAIC03MTAsMTEgKzcxMCwxMyBAQCBzdGF0aWMgZmxvYXQg
Y3VtbXVsYXRlZFdpZHRoT3JIZWlnaHRPZlRlCiAKICAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0
ID0gYm94LT5tX3JldmVyc2VkID8gYm94LT5lbmQoKSAtIGkgLSBwb3NpdGlvbk9mZnNldCArIDEg
OiBib3gtPnN0YXJ0KCkgKyBpICsgcG9zaXRpb25PZmZzZXQgLSAxOwogCisgICAgICAgICAgICAg
ICAgLy8gRklYTUU6IGRvZXMgdGhpcyBuZWVkIHRvIGNoYW5nZSB0byBoYW5kbGUgbXVsdGljaGFy
IGdseXBocz8KKyAgICAgICAgICAgICAgICBpbnQgY2hhcnNDb25zdW1lZCA9IDE7CiAgICAgICAg
ICAgICAgICAgaWYgKGNhbGNXaWR0aE9ubHkpIHsKLSAgICAgICAgICAgICAgICAgICAgZmxvYXQg
bGFzdEdseXBoV2lkdGggPSBib3gtPmNhbGN1bGF0ZUdseXBoV2lkdGgoc3R5bGUsIG9mZnNldCk7
CisgICAgICAgICAgICAgICAgICAgIGZsb2F0IGxhc3RHbHlwaFdpZHRoID0gYm94LT5jYWxjdWxh
dGVHbHlwaFdpZHRoKHN0eWxlLCBvZmZzZXQsIDAsIGNoYXJzQ29uc3VtZWQpOwogICAgICAgICAg
ICAgICAgICAgICBsZW5ndGggKz0gY3VycmVudENoYXJhY3Rlci54IC0gbGFzdENoYXJhY3Rlci54
IC0gbGFzdEdseXBoV2lkdGg7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAg
ICAgICAgICAgZmxvYXQgbGFzdEdseXBoSGVpZ2h0ID0gYm94LT5jYWxjdWxhdGVHbHlwaEhlaWdo
dChzdHlsZSwgb2Zmc2V0KTsKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgbGFzdEdseXBoSGVp
Z2h0ID0gYm94LT5jYWxjdWxhdGVHbHlwaEhlaWdodChzdHlsZSwgb2Zmc2V0LCAwKTsKICAgICAg
ICAgICAgICAgICAgICAgbGVuZ3RoICs9IGN1cnJlbnRDaGFyYWN0ZXIueSAtIGxhc3RDaGFyYWN0
ZXIueSAtIGxhc3RHbHlwaEhlaWdodDsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9
CkBAIC0xMTEwLDcgKzExMTIsOCBAQCB2b2lkIFNWR1Jvb3RJbmxpbmVCb3g6OmJ1aWxkTGF5b3V0
SW5mb3JtCiAgICAgY29uc3QgU1ZHUmVuZGVyU3R5bGUqIHN2Z1N0eWxlID0gc3R5bGUtPnN2Z1N0
eWxlKCk7CiAgICAgYm9vbCBpc1ZlcnRpY2FsVGV4dCA9IGlzVmVydGljYWxXcml0aW5nTW9kZShz
dmdTdHlsZSk7CiAKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsK
KyAgICBpbnQgY2hhcnNDb25zdW1lZCA9IDA7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8
IGxlbmd0aDsgaSArPSBjaGFyc0NvbnN1bWVkKSB7CiAgICAgICAgIFNWR0NoYXIgc3ZnQ2hhcjsK
IAogICAgICAgICBpZiAoaW5mby5pblBhdGhMYXlvdXQoKSkKQEAgLTExMTksMTIgKzExMjIsMTQg
QEAgdm9pZCBTVkdSb290SW5saW5lQm94OjpidWlsZExheW91dEluZm9ybQogICAgICAgICBmbG9h
dCBnbHlwaFdpZHRoID0gMC4wZjsKICAgICAgICAgZmxvYXQgZ2x5cGhIZWlnaHQgPSAwLjBmOwog
CisgICAgICAgIGludCBleHRyYUNoYXJzQXZhaWxhYmxlID0gbGVuZ3RoIC0gaSAtIDE7CisKICAg
ICAgICAgaWYgKHRleHRCb3gtPm1fcmV2ZXJzZWQpIHsKLSAgICAgICAgICAgIGdseXBoV2lkdGgg
PSBzdmdUZXh0Qm94LT5jYWxjdWxhdGVHbHlwaFdpZHRoKHN0eWxlLCB0ZXh0Qm94LT5lbmQoKSAt
IGkpOwotICAgICAgICAgICAgZ2x5cGhIZWlnaHQgPSBzdmdUZXh0Qm94LT5jYWxjdWxhdGVHbHlw
aEhlaWdodChzdHlsZSwgdGV4dEJveC0+ZW5kKCkgLSBpKTsKKyAgICAgICAgICAgIGdseXBoV2lk
dGggPSBzdmdUZXh0Qm94LT5jYWxjdWxhdGVHbHlwaFdpZHRoKHN0eWxlLCB0ZXh0Qm94LT5lbmQo
KSAtIGksIGV4dHJhQ2hhcnNBdmFpbGFibGUsIGNoYXJzQ29uc3VtZWQpOworICAgICAgICAgICAg
Z2x5cGhIZWlnaHQgPSBzdmdUZXh0Qm94LT5jYWxjdWxhdGVHbHlwaEhlaWdodChzdHlsZSwgdGV4
dEJveC0+ZW5kKCkgLSBpLCBleHRyYUNoYXJzQXZhaWxhYmxlKTsKICAgICAgICAgfSBlbHNlIHsK
LSAgICAgICAgICAgIGdseXBoV2lkdGggPSBzdmdUZXh0Qm94LT5jYWxjdWxhdGVHbHlwaFdpZHRo
KHN0eWxlLCB0ZXh0Qm94LT5zdGFydCgpICsgaSk7Ci0gICAgICAgICAgICBnbHlwaEhlaWdodCA9
IHN2Z1RleHRCb3gtPmNhbGN1bGF0ZUdseXBoSGVpZ2h0KHN0eWxlLCB0ZXh0Qm94LT5zdGFydCgp
ICsgaSk7CisgICAgICAgICAgICBnbHlwaFdpZHRoID0gc3ZnVGV4dEJveC0+Y2FsY3VsYXRlR2x5
cGhXaWR0aChzdHlsZSwgdGV4dEJveC0+c3RhcnQoKSArIGksIGV4dHJhQ2hhcnNBdmFpbGFibGUs
IGNoYXJzQ29uc3VtZWQpOworICAgICAgICAgICAgZ2x5cGhIZWlnaHQgPSBzdmdUZXh0Qm94LT5j
YWxjdWxhdGVHbHlwaEhlaWdodChzdHlsZSwgdGV4dEJveC0+c3RhcnQoKSArIGksIGV4dHJhQ2hh
cnNBdmFpbGFibGUpOwogICAgICAgICB9CiAKICAgICAgICAgYm9vbCBhc3NpZ25lZFggPSBmYWxz
ZTsKQEAgLTEzMDAsOCArMTMwNSwxMCBAQCB2b2lkIFNWR1Jvb3RJbmxpbmVCb3g6OmJ1aWxkTGF5
b3V0SW5mb3JtCiAgICAgICAgICAgICBpbmZvLmN1cnggKz0gZ2x5cGhBZHZhbmNlICsgc3BhY2lu
ZzsKIAogICAgICAgICAvLyBBZHZhbmNlIHRvIG5leHQgY2hhcmFjdGVyCi0gICAgICAgIGluZm8u
c3ZnQ2hhcnMuYXBwZW5kKHN2Z0NoYXIpOwotICAgICAgICBpbmZvLnByb2Nlc3NlZFNpbmdsZUNo
YXJhY3RlcigpOworICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IGNoYXJzQ29uc3VtZWQ7ICsr
aykgeworICAgICAgICAgICAgaW5mby5zdmdDaGFycy5hcHBlbmQoc3ZnQ2hhcik7CisgICAgICAg
ICAgICBpbmZvLnByb2Nlc3NlZFNpbmdsZUNoYXJhY3RlcigpOworICAgICAgICB9CiAgICAgfQog
fQogCkluZGV4OiByZW5kZXJpbmcvU1ZHUm9vdElubGluZUJveC5oCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIHJl
bmRlcmluZy9TVkdSb290SW5saW5lQm94LmgJKHJldmlzaW9uIDMxMjM5KQorKysgcmVuZGVyaW5n
L1NWR1Jvb3RJbmxpbmVCb3guaAkod29ya2luZyBjb3B5KQpAQCAtNzcsNyArNzcsNyBAQCBwcml2
YXRlOgogfTsKIAogLy8gU2hhcmVkIHdpdGggU1ZHUmVuZGVyVHJlZUFzVGV4dCAvIFNWR0lubGlu
ZVRleHRCb3gKLVRleHRSdW4gc3ZnVGV4dFJ1bkZvcklubGluZVRleHRCb3goY29uc3QgVUNoYXIq
LCBpbnQgbGVuLCBSZW5kZXJTdHlsZSogc3R5bGUsIGNvbnN0IElubGluZVRleHRCb3gqIHRleHRC
b3gsIGZsb2F0IHhQb3MpOworIFRleHRSdW4gc3ZnVGV4dFJ1bkZvcklubGluZVRleHRCb3goY29u
c3QgVUNoYXIqLCBpbnQgbGVuLCBSZW5kZXJTdHlsZSogc3R5bGUsIGNvbnN0IElubGluZVRleHRC
b3gqIHRleHRCb3gsIGZsb2F0IHhQb3MpOwogRmxvYXRQb2ludCB0b3BMZWZ0UG9zaXRpb25PZkNo
YXJhY3RlclJhbmdlKFZlY3RvcjxTVkdDaGFyPjo6aXRlcmF0b3Igc3RhcnQsIFZlY3RvcjxTVkdD
aGFyPjo6aXRlcmF0b3IgZW5kKTsKIGZsb2F0IGN1bW11bGF0ZWRXaWR0aE9mSW5saW5lQm94Q2hh
cmFjdGVyUmFuZ2UoU1ZHSW5saW5lQm94Q2hhcmFjdGVyUmFuZ2UmIHJhbmdlKTsKIGZsb2F0IGN1
bW11bGF0ZWRIZWlnaHRPZklubGluZUJveENoYXJhY3RlclJhbmdlKFNWR0lubGluZUJveENoYXJh
Y3RlclJhbmdlJiByYW5nZSk7CkluZGV4OiBzdmcvU1ZHRm9udC5jcHAKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
c3ZnL1NWR0ZvbnQuY3BwCShyZXZpc2lvbiAzMTIzOSkKKysrIHN2Zy9TVkdGb250LmNwcAkod29y
a2luZyBjb3B5KQpAQCAtMjQ5LDEzICsyNDksMTYgQEAgc3RydWN0IFNWR1RleHRSdW5XYWxrZXIg
ewogICAgICAgICBTVkdHbHlwaElkZW50aWZpZXIgaWRlbnRpZmllcjsKICAgICAgICAgYm9vbCBm
b3VuZEdseXBoID0gZmFsc2U7CiAgICAgICAgIGludCBjaGFyYWN0ZXJMb29rdXBSYW5nZTsKKyAg
ICAgICAgaW50IGVuZE9mU2NhblJhbmdlID0gdG8gKyBtX3dhbGtlckRhdGEuZXh0cmFDaGFyc0F2
YWlsYWJsZTsKIAogICAgICAgICBmb3IgKGludCBpID0gZnJvbTsgaSA8IHRvOyArK2kpIHsKICAg
ICAgICAgICAgIC8vIElmIGNoYXJhY3Rlckxvb2t1cFJhbmdlIGlzID4gMCwgdGhlbiB0aGUgZm9u
dCBkZWZpbmVkIGxpZ2F0dXJlcyAobGVuZ3RoIG9mIHVuaWNvZGUgcHJvcGVydHkgdmFsdWUgPiAx
KS4KICAgICAgICAgICAgIC8vIFdlIGhhdmUgdG8gY2hlY2sgd2hldGVyIHRoZSBjdXJyZW50IGNo
YXJhY3RlciAmIHRoZSBuZXh0IGNoYXJhY3RlciBkZWZpbmUgYSBsaWdhdHVyZS4gVGhpcyBuZWVk
cyB0byBiZQogICAgICAgICAgICAgLy8gZXh0ZW5kZWQgdG8gdGhlIG4tdGggbmV4dCBjaGFyYWN0
ZXIgKHdoZXJlIG4gaXMgJ2NoYXJhY3Rlckxvb2t1cFJhbmdlJyksIHRvIGNoZWNrIGZvciBhbnkg
cG9zc2libGUgbGlnYXR1cmUuCi0gICAgICAgICAgICBjaGFyYWN0ZXJMb29rdXBSYW5nZSA9IG1h
eGltdW1IYXNoS2V5TGVuZ3RoICsgaSA+PSB0byA/IHRvIC0gaSA6IG1heGltdW1IYXNoS2V5TGVu
Z3RoOworICAgICAgICAgICAgY2hhcmFjdGVyTG9va3VwUmFuZ2UgPSBtYXhpbXVtSGFzaEtleUxl
bmd0aCArIGkgPj0gZW5kT2ZTY2FuUmFuZ2UgPyBlbmRPZlNjYW5SYW5nZSAtIGkgOiBtYXhpbXVt
SGFzaEtleUxlbmd0aDsKIAorICAgICAgICAgICAgLy8gRklYTUU6IGluc3RlYWQgb2YgY2hlY2tp
bmcgZnJvbSBsb25nZXN0IHN0cmluZyB0byBzaG9ydGVzdCwgdGhpcyBzaG91bGQgcmVhbGx5IHNj
YW4gaW4gb3JkZXIKKyAgICAgICAgICAgIC8vIG9mIHRoZSBnbHlwaHMgYW5kIHBpY2sgdGhlIGZp
cnN0IG1hdGNoCiAgICAgICAgICAgICB3aGlsZSAoY2hhcmFjdGVyTG9va3VwUmFuZ2UgPiAwICYm
ICFmb3VuZEdseXBoKSB7CiAgICAgICAgICAgICAgICAgU3RyaW5nIGxvb2t1cFN0cmluZyhydW4u
ZGF0YShydW4ucnRsKCkgPyBydW4ubGVuZ3RoKCkgLSAoaSArIGNoYXJhY3Rlckxvb2t1cFJhbmdl
KSA6IGkpLCBjaGFyYWN0ZXJMb29rdXBSYW5nZSk7CiAKQEAgLTI3Miw2ICsyNzUsNyBAQCBzdHJ1
Y3QgU1ZHVGV4dFJ1bldhbGtlciB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChpZGVudGlmaWVy
LmlzVmFsaWQgJiYgaXNDb21wYXRpYmxlR2x5cGgoaWRlbnRpZmllciwgaXNWZXJ0aWNhbFRleHQs
IGxhbmd1YWdlLCBjaGFycywgc3RhcnRQb3NpdGlvbiwgZW5kUG9zaXRpb24pKSB7CiAgICAgICAg
ICAgICAgICAgICAgICAgICBBU1NFUlQoY2hhcmFjdGVyTG9va3VwUmFuZ2UgPiAwKTsKICAgICAg
ICAgICAgICAgICAgICAgICAgIGkgKz0gY2hhcmFjdGVyTG9va3VwUmFuZ2UgLSAxOworICAgICAg
ICAgICAgICAgICAgICAgICAgbV93YWxrZXJEYXRhLmNoYXJzQ29uc3VtZWQgKz0gY2hhcmFjdGVy
TG9va3VwUmFuZ2U7CiAKICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kR2x5cGggPSB0cnVl
OwogICAgICAgICAgICAgICAgICAgICAgICAgU1ZHR2x5cGhFbGVtZW50Ojppbmhlcml0VW5zcGVj
aWZpZWRBdHRyaWJ1dGVzKGlkZW50aWZpZXIsIG1fZm9udERhdGEpOwpAQCAtMzE3LDYgKzMyMSw4
IEBAIHN0cnVjdCBTVkdUZXh0UnVuV2Fsa2VyTWVhc3VyZWRMZW5ndGhEYXQKICAgICBpbnQgYXQ7
CiAgICAgaW50IGZyb207CiAgICAgaW50IHRvOworICAgIGludCBleHRyYUNoYXJzQXZhaWxhYmxl
OworICAgIGludCBjaGFyc0NvbnN1bWVkOwogCiAgICAgZmxvYXQgc2NhbGU7CiAgICAgZmxvYXQg
bGVuZ3RoOwpAQCAtMzQzLDcgKzM0OSw3IEBAIHZvaWQgZmxvYXRXaWR0aE1pc3NpbmdHbHlwaENh
bGxiYWNrKGNvbnMKICAgICBkYXRhLmxlbmd0aCArPSBmb250LmZsb2F0V2lkdGgocnVuKTsKIH0K
IAotc3RhdGljIGZsb2F0IGZsb2F0V2lkdGhPZlN1YlN0cmluZ1VzaW5nU1ZHRm9udChjb25zdCBG
b250KiBmb250LCBjb25zdCBUZXh0UnVuJiBydW4sIGludCBmcm9tLCBpbnQgdG8pCitzdGF0aWMg
ZmxvYXQgZmxvYXRXaWR0aE9mU3ViU3RyaW5nVXNpbmdTVkdGb250KGNvbnN0IEZvbnQqIGZvbnQs
IGNvbnN0IFRleHRSdW4mIHJ1biwgaW50IGV4dHJhQ2hhcnNBdmFpbGFibGUsIGludCBmcm9tLCBp
bnQgdG8sIGludCYgY2hhcnNDb25zdW1lZCkKIHsKICAgICBpbnQgbmV3RnJvbSA9IHRvID4gZnJv
bSA/IGZyb20gOiB0bzsKICAgICBpbnQgbmV3VG8gPSB0byA+IGZyb20gPyB0byA6IGZyb207CkBA
IC0zNjQsNiArMzcwLDggQEAgc3RhdGljIGZsb2F0IGZsb2F0V2lkdGhPZlN1YlN0cmluZ1VzaW5n
UwogICAgICAgICBkYXRhLmF0ID0gZnJvbTsKICAgICAgICAgZGF0YS5mcm9tID0gZnJvbTsKICAg
ICAgICAgZGF0YS50byA9IHRvOworICAgICAgICBkYXRhLmV4dHJhQ2hhcnNBdmFpbGFibGUgPSBl
eHRyYUNoYXJzQXZhaWxhYmxlOworICAgICAgICBkYXRhLmNoYXJzQ29uc3VtZWQgPSAwOwogICAg
ICAgICBkYXRhLnNjYWxlID0gY29udmVydEVtVW5pdFRvUGl4ZWwoZm9udC0+c2l6ZSgpLCBmb250
RmFjZUVsZW1lbnQtPnVuaXRzUGVyRW0oKSwgMS4wZik7CiAgICAgICAgIGRhdGEubGVuZ3RoID0g
MC4wZjsKIApAQCAtMzgwLDYgKzM4OCw3IEBAIHN0YXRpYyBmbG9hdCBmbG9hdFdpZHRoT2ZTdWJT
dHJpbmdVc2luZ1MKIAogICAgICAgICBTVkdUZXh0UnVuV2Fsa2VyPFNWR1RleHRSdW5XYWxrZXJN
ZWFzdXJlZExlbmd0aERhdGE+IHJ1bldhbGtlcihmb250RGF0YSwgZm9udEVsZW1lbnQsIGRhdGEs
IGZsb2F0V2lkdGhVc2luZ1NWR0ZvbnRDYWxsYmFjaywgZmxvYXRXaWR0aE1pc3NpbmdHbHlwaENh
bGxiYWNrKTsKICAgICAgICAgcnVuV2Fsa2VyLndhbGsocnVuLCBpc1ZlcnRpY2FsVGV4dCwgbGFu
Z3VhZ2UsIDAsIHJ1bi5sZW5ndGgoKSk7CisgICAgICAgIGNoYXJzQ29uc3VtZWQgPSBkYXRhLmNo
YXJzQ29uc3VtZWQ7CiAgICAgICAgIHJldHVybiBkYXRhLmxlbmd0aDsKICAgICB9CiAKQEAgLTM4
OCwxMyArMzk3LDIxIEBAIHN0YXRpYyBmbG9hdCBmbG9hdFdpZHRoT2ZTdWJTdHJpbmdVc2luZ1MK
IAogZmxvYXQgRm9udDo6ZmxvYXRXaWR0aFVzaW5nU1ZHRm9udChjb25zdCBUZXh0UnVuJiBydW4p
IGNvbnN0CiB7Ci0gICAgcmV0dXJuIGZsb2F0V2lkdGhPZlN1YlN0cmluZ1VzaW5nU1ZHRm9udCh0
aGlzLCBydW4sIDAsIHJ1bi5sZW5ndGgoKSk7CisgICAgaW50IGNoYXJzQ29uc3VtZWQ7CisgICAg
cmV0dXJuIGZsb2F0V2lkdGhPZlN1YlN0cmluZ1VzaW5nU1ZHRm9udCh0aGlzLCBydW4sIDAsIDAs
IHJ1bi5sZW5ndGgoKSwgY2hhcnNDb25zdW1lZCk7Cit9CisKK2Zsb2F0IEZvbnQ6OmZsb2F0V2lk
dGhVc2luZ1NWR0ZvbnQoY29uc3QgVGV4dFJ1biYgcnVuLCBpbnQgZXh0cmFDaGFyc0F2YWlsYWJs
ZSwgaW50JiBjaGFyc0NvbnN1bWVkKSBjb25zdAoreworICAgIHJldHVybiBmbG9hdFdpZHRoT2ZT
dWJTdHJpbmdVc2luZ1NWR0ZvbnQodGhpcywgcnVuLCBleHRyYUNoYXJzQXZhaWxhYmxlLCAwLCBy
dW4ubGVuZ3RoKCksIGNoYXJzQ29uc3VtZWQpOwogfQogCiAvLyBDYWxsYmFjayAmIGRhdGEgc3Ry
dWN0dXJlcyB0byBkcmF3IHRleHQgdXNpbmcgU1ZHIEZvbnRzCiBzdHJ1Y3QgU1ZHVGV4dFJ1bldh
bGtlckRyYXdUZXh0RGF0YSB7CiAgICAgZmxvYXQgc2NhbGU7CiAgICAgYm9vbCBpc1ZlcnRpY2Fs
VGV4dDsKKyAgICBpbnQgZXh0cmFDaGFyc0F2YWlsYWJsZTsKKyAgICBpbnQgY2hhcnNDb25zdW1l
ZDsKIAogICAgIGZsb2F0IHhTdGFydE9mZnNldDsKICAgICBGbG9hdFBvaW50IGN1cnJlbnRQb2lu
dDsKQEAgLTQ5Myw4ICs1MTAsOSBAQCB2b2lkIEZvbnQ6OmRyYXdUZXh0VXNpbmdTVkdGb250KEdy
YXBoaWNzCiAKICAgICAgICAgQVNTRVJUKGRhdGEuYWN0aXZlUGFpbnRTZXJ2ZXIpOwogCisgICAg
ICAgIGludCBjaGFyc0NvbnN1bWVkOwogICAgICAgICBkYXRhLmlzVmVydGljYWxUZXh0ID0gZmFs
c2U7Ci0gICAgICAgIGRhdGEueFN0YXJ0T2Zmc2V0ID0gZmxvYXRXaWR0aE9mU3ViU3RyaW5nVXNp
bmdTVkdGb250KHRoaXMsIHJ1biwgcnVuLnJ0bCgpID8gdG8gOiAwLCBydW4ucnRsKCkgPyBydW4u
bGVuZ3RoKCkgOiBmcm9tKTsKKyAgICAgICAgZGF0YS54U3RhcnRPZmZzZXQgPSBmbG9hdFdpZHRo
T2ZTdWJTdHJpbmdVc2luZ1NWR0ZvbnQodGhpcywgcnVuLCAwLCBydW4ucnRsKCkgPyB0byA6IDAs
IHJ1bi5ydGwoKSA/IHJ1bi5sZW5ndGgoKSA6IGZyb20sIGNoYXJzQ29uc3VtZWQpOwogICAgICAg
ICBkYXRhLmdseXBoT3JpZ2luID0gRmxvYXRQb2ludCgpOwogICAgICAgICBkYXRhLmNvbnRleHQg
PSBjb250ZXh0OwogCkBAIC01MTMsNiArNTMxLDggQEAgdm9pZCBGb250OjpkcmF3VGV4dFVzaW5n
U1ZHRm9udChHcmFwaGljcwogICAgICAgICAgICAgZGF0YS5nbHlwaE9yaWdpbi5zZXRZKGZvbnRE
YXRhLT5ob3Jpem9udGFsT3JpZ2luWSgpICogZGF0YS5zY2FsZSk7CiAgICAgICAgIH0KIAorICAg
ICAgICBkYXRhLmV4dHJhQ2hhcnNBdmFpbGFibGUgPSAwOworCiAgICAgICAgIFNWR1RleHRSdW5X
YWxrZXI8U1ZHVGV4dFJ1bldhbGtlckRyYXdUZXh0RGF0YT4gcnVuV2Fsa2VyKGZvbnREYXRhLCBm
b250RWxlbWVudCwgZGF0YSwgZHJhd1RleHRVc2luZ1NWR0ZvbnRDYWxsYmFjaywgZHJhd1RleHRN
aXNzaW5nR2x5cGhDYWxsYmFjayk7CiAgICAgICAgIHJ1bldhbGtlci53YWxrKHJ1biwgZGF0YS5p
c1ZlcnRpY2FsVGV4dCwgbGFuZ3VhZ2UsIGZyb20sIHRvKTsKICAgICB9CkBAIC01MjAsOCArNTQw
LDkgQEAgdm9pZCBGb250OjpkcmF3VGV4dFVzaW5nU1ZHRm9udChHcmFwaGljcwogCiBGbG9hdFJl
Y3QgRm9udDo6c2VsZWN0aW9uUmVjdEZvclRleHRVc2luZ1NWR0ZvbnQoY29uc3QgVGV4dFJ1biYg
cnVuLCBjb25zdCBJbnRQb2ludCYgcG9pbnQsIGludCBoZWlnaHQsIGludCBmcm9tLCBpbnQgdG8p
IGNvbnN0CiB7Ci0gICAgcmV0dXJuIEZsb2F0UmVjdChwb2ludC54KCkgKyBmbG9hdFdpZHRoT2ZT
dWJTdHJpbmdVc2luZ1NWR0ZvbnQodGhpcywgcnVuLCBydW4ucnRsKCkgPyB0byA6IDAsIHJ1bi5y
dGwoKSA/IHJ1bi5sZW5ndGgoKSA6IGZyb20pLAotICAgICAgICAgICAgICAgICAgICAgcG9pbnQu
eSgpLCBmbG9hdFdpZHRoT2ZTdWJTdHJpbmdVc2luZ1NWR0ZvbnQodGhpcywgcnVuLCBmcm9tLCB0
byksIGhlaWdodCk7CisgICAgaW50IGNoYXJzQ29uc3VtZWQ7CisgICAgcmV0dXJuIEZsb2F0UmVj
dChwb2ludC54KCkgKyBmbG9hdFdpZHRoT2ZTdWJTdHJpbmdVc2luZ1NWR0ZvbnQodGhpcywgcnVu
LCAwLCBydW4ucnRsKCkgPyB0byA6IDAsIHJ1bi5ydGwoKSA/IHJ1bi5sZW5ndGgoKSA6IGZyb20s
IGNoYXJzQ29uc3VtZWQpLAorICAgICAgICAgICAgICAgICAgICAgcG9pbnQueSgpLCBmbG9hdFdp
ZHRoT2ZTdWJTdHJpbmdVc2luZ1NWR0ZvbnQodGhpcywgcnVuLCAwLCBmcm9tLCB0bywgY2hhcnND
b25zdW1lZCksIGhlaWdodCk7CiB9CiAKIGludCBGb250OjpvZmZzZXRGb3JQb3NpdGlvbkZvclRl
eHRVc2luZ1NWR0ZvbnQoY29uc3QgVGV4dFJ1biYsIGludCBwb3NpdGlvbiwgYm9vbCBpbmNsdWRl
UGFydGlhbEdseXBocykgY29uc3QKSW5kZXg6IHN2Zy9TVkdUZXh0Q29udGVudEVsZW1lbnQuY3Bw
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIHN2Zy9TVkdUZXh0Q29udGVudEVsZW1lbnQuY3BwCShyZXZpc2lvbiAz
MTIzOSkKKysrIHN2Zy9TVkdUZXh0Q29udGVudEVsZW1lbnQuY3BwCSh3b3JraW5nIGNvcHkpCkBA
IC03OSwxMCArNzksMTIgQEAgc3RhdGljIGlubGluZSBmbG9hdCBjdW1tdWxhdGVkQ2hhcmFjdGVy
UgogICAgICAgICAgICAgaWYgKHRleHRCb3gtPm1fcmV2ZXJzZWQpCiAgICAgICAgICAgICAgICAg
bmV3T2Zmc2V0ID0gdGV4dEJveC0+c3RhcnQoKSArIHRleHRCb3gtPmVuZCgpIC0gbmV3T2Zmc2V0
OwogCisgICAgICAgICAgICAvLyBGSVhNRTogZG9lcyB0aGlzIGhhbmRsZSBtdWx0aWNoYXIgZ2x5
cGhzIG9rPyBub3Qgc3VyZQorICAgICAgICAgICAgaW50IGNoYXJzQ29uc3VtZWQgPSAwOwogICAg
ICAgICAgICAgaWYgKGlzVmVydGljYWxUZXh0KQotICAgICAgICAgICAgICAgIHRleHRMZW5ndGgg
Kz0gdGV4dEJveC0+Y2FsY3VsYXRlR2x5cGhIZWlnaHQoc3R5bGUsIG5ld09mZnNldCk7CisgICAg
ICAgICAgICAgICAgdGV4dExlbmd0aCArPSB0ZXh0Qm94LT5jYWxjdWxhdGVHbHlwaEhlaWdodChz
dHlsZSwgbmV3T2Zmc2V0LCAwKTsKICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB0
ZXh0TGVuZ3RoICs9IHRleHRCb3gtPmNhbGN1bGF0ZUdseXBoV2lkdGgoc3R5bGUsIG5ld09mZnNl
dCk7CisgICAgICAgICAgICAgICAgdGV4dExlbmd0aCArPSB0ZXh0Qm94LT5jYWxjdWxhdGVHbHlw
aFdpZHRoKHN0eWxlLCBuZXdPZmZzZXQsIDAsIGNoYXJzQ29uc3VtZWQpOwogICAgICAgICB9CiAK
ICAgICAgICAgaWYgKCF1c2VzRnVsbFJhbmdlKSB7CkBAIC0xOTMsMTAgKzE5NSwxMSBAQCBzdHJ1
Y3QgU1ZHSW5saW5lVGV4dEJveFF1ZXJ5V2Fsa2VyIHsKICAgICAgICAgICAgICAgICAgICAgaWYg
KHRleHRCb3gtPm1fcmV2ZXJzZWQpCiAgICAgICAgICAgICAgICAgICAgICAgICBuZXdPZmZzZXQg
PSB0ZXh0Qm94LT5zdGFydCgpICsgdGV4dEJveC0+ZW5kKCkgLSBuZXdPZmZzZXQ7CiAKKyAgICAg
ICAgICAgICAgICAgICAgaW50IGNoYXJzQ29uc3VtZWQ7CiAgICAgICAgICAgICAgICAgICAgIGlm
IChpc1ZlcnRpY2FsVGV4dCkKLSAgICAgICAgICAgICAgICAgICAgICAgIG1fcXVlcnlQb2ludFJl
c3VsdC5tb3ZlKGl0LT54LCBpdC0+eSArIHRleHRCb3gtPmNhbGN1bGF0ZUdseXBoSGVpZ2h0KHN0
eWxlLCBuZXdPZmZzZXQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fcXVlcnlQb2ludFJl
c3VsdC5tb3ZlKGl0LT54LCBpdC0+eSArIHRleHRCb3gtPmNhbGN1bGF0ZUdseXBoSGVpZ2h0KHN0
eWxlLCBuZXdPZmZzZXQsIGVuZCAtIGl0KSk7CiAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAg
ICAgICAgICAgICAgICAgICAgICAgIG1fcXVlcnlQb2ludFJlc3VsdC5tb3ZlKGl0LT54ICsgdGV4
dEJveC0+Y2FsY3VsYXRlR2x5cGhXaWR0aChzdHlsZSwgbmV3T2Zmc2V0KSwgaXQtPnkpOworICAg
ICAgICAgICAgICAgICAgICAgICAgbV9xdWVyeVBvaW50UmVzdWx0Lm1vdmUoaXQtPnggKyB0ZXh0
Qm94LT5jYWxjdWxhdGVHbHlwaFdpZHRoKHN0eWxlLCBuZXdPZmZzZXQsIGVuZCAtIGl0LCBjaGFy
c0NvbnN1bWVkKSwgaXQtPnkpOwogCiAgICAgICAgICAgICAgICAgICAgIG1fc3RvcFByb2Nlc3Np
bmcgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICByZXR1cm47Cg==
</data>

          </attachment>
      

    </bug>

</bugzilla>