<?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>47019</bug_id>
          
          <creation_ts>2010-10-01 14:31:12 -0700</creation_ts>
          <short_desc>[chromium] FontLinux performance improvement</short_desc>
          <delta_ts>2010-10-21 14:43:41 -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>Platform</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>PC</rep_platform>
          <op_sys>Linux</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>47732</dependson>
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Xiaomei Ji">xji</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>agl</cc>
    
    <cc>evan</cc>
    
    <cc>levin</cc>
    
    <cc>skyul</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>288489</commentid>
    <comment_count>0</comment_count>
    <who name="Xiaomei Ji">xji</who>
    <bug_when>2010-10-01 14:31:12 -0700</bug_when>
    <thetext>Reduce te number of calls for normalization function because converting  to NFC form is very expensive.
Combine space normalization and character mirroring into one text scan.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>288500</commentid>
    <comment_count>1</comment_count>
      <attachid>69524</attachid>
    <who name="Xiaomei Ji">xji</who>
    <bug_when>2010-10-01 14:49:40 -0700</bug_when>
    <thetext>Created attachment 69524
patch

Port Claire&apos;s work on Android.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>293983</commentid>
    <comment_count>2</comment_count>
      <attachid>69524</attachid>
    <who name="David Levin">levin</who>
    <bug_when>2010-10-13 23:49:54 -0700</bug_when>
    <thetext>Comment on attachment 69524
patch

View in context: https://bugs.webkit.org/attachment.cgi?id=69524&amp;action=review

This is looking pretty good.  Just a few changes and you&apos;ll get this in.

Thanks.

&gt; WebCore/ChangeLog:8
&gt; +        Reduce te number of calls for normalization function because converting

typo: te
s/for/for the/

&gt; WebCore/ChangeLog:13
&gt; +        No new tests since there is no functionality change.

Is there any test that currently verifies this functionality?

If not, please add one. (Hopefully that won&apos;t be hard.)

&gt; WebCore/platform/graphics/chromium/FontLinux.cpp:@
&gt;  public:

Please update the copyright year at the top of the file. (Add 2010. Don&apos;t delete the other years.)

Could you do a patch (without any other changes) to fix the layout of this code?

These methods shouldn&apos;t be in the class itself as they shouldn&apos;t be inlined.

This would also help the diff&apos;ing tool to pick up function names better.

&gt; WebCore/platform/graphics/chromium/FontLinux.cpp:386
&gt; +    const TextRun&amp; getNormalizedTextRun(const TextRun&amp; originalRun)

It would be nice it this function was static, since you are calling it from within the initialization of the member variables in the constructor.

As the moment it is way too easy to use a member variable in here and that shouldn&apos;t be done in this function or any that it calls (except for special cases).

It looks like it only uses m_normalizedBuffer and m_normalizedRun, so those could be passed in to it. (Or perhaps this method and these two member variables should be split off into a little class that is called at this point.)

&gt; WebCore/platform/graphics/chromium/FontLinux.cpp:402
&gt; +        // Convert to NFC form if text has diacritical marks

s/if /if the /
Please add a period to the end of the comment.

&gt; WebCore/platform/graphics/chromium/FontLinux.cpp:409
&gt; +                icu::Normalizer::normalize(icu::UnicodeString(originalRun.characters(),

Why do we only need to call icu::Normalizer::normalize when UBLOCK_COMBINING_DIACRITICAL_MARKS? 

Are there any other cases?

&gt; WebCore/platform/graphics/chromium/FontLinux.cpp:410
&gt; +                                 originalRun.length()), UNORM_NFC, 0 /* no options */,

alignment with ( of previous line.  (Note that you don&apos;t need to wrap the line.)

&gt; WebCore/platform/graphics/chromium/FontLinux.cpp:419
&gt; +        int normalizedBufferLen;

normalizedBufferLength

(Avoid abbreviations in WebKit code.)

&gt; WebCore/platform/graphics/chromium/FontLinux.cpp:420
&gt; +        const UChar* srcText;

Use sourceText.

(Avoid abbreviations in WebKit code.)

&gt; WebCore/platform/graphics/chromium/FontLinux.cpp:430
&gt; +        normSpaceAndMirrorChars(originalRun.rtl(), m_normalizedBuffer.get(), srcText, normalizedBufferLen);

The ordering of parameters seems odd. It almost follows a memcpy ordering but it also has a bool before them.
I would go with input/output ordering.

Like this
normSpaceAndMirrorChars(srcText, originalRun.rtl(), m_normalizedBuffer.get(), normalizedBufferLen);

&gt; WebCore/platform/graphics/chromium/FontLinux.cpp:586
&gt; +    void normSpaceAndMirrorChars(bool rtl, UChar* destination, const UChar* source, int length) const

&quot;norm&quot; avoid abbreviation.

s/Space/Spaces/

&gt; WebCore/platform/graphics/chromium/FontLinux.cpp:598
&gt; +                if (rtl)

Do &quot;else if&quot;

As opposed to

else {
    if</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>294107</commentid>
    <comment_count>3</comment_count>
    <who name="Adam Langley">agl</who>
    <bug_when>2010-10-14 07:33:00 -0700</bug_when>
    <thetext>Sorry. I could have sworn that I had already commented on this code but there&apos;s no record of it :(

I think David hit all the points, above.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>296544</commentid>
    <comment_count>4</comment_count>
    <who name="Xiaomei Ji">xji</who>
    <bug_when>2010-10-19 16:59:33 -0700</bug_when>
    <thetext>Thanks for the review. Please see my replies inline.

(In reply to comment #2)
&gt; (From update of attachment 69524 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=69524&amp;action=review
&gt; 
&gt; This is looking pretty good.  Just a few changes and you&apos;ll get this in.
&gt; 
&gt; Thanks.
&gt; 
&gt; &gt; WebCore/ChangeLog:8
&gt; &gt; +        Reduce te number of calls for normalization function because converting
&gt; 
&gt; typo: te
&gt; s/for/for the/

done.

&gt; 
&gt; &gt; WebCore/ChangeLog:13
&gt; &gt; +        No new tests since there is no functionality change.
&gt; 
&gt; Is there any test that currently verifies this functionality?
&gt; 
&gt; If not, please add one. (Hopefully that won&apos;t be hard.)

I added a simple one having \t (treated as space) and diacritical marks (will trigger normalization).
There is test for mirrored character in layout test.

convert from &apos;\t&apos; to &apos; &apos; is triggered in the code, but I do not know why dumpAsText() still shows &apos;\t&apos;.


&gt; 
&gt; &gt; WebCore/platform/graphics/chromium/FontLinux.cpp:@
&gt; &gt;  public:
&gt; 
&gt; Please update the copyright year at the top of the file. (Add 2010. Don&apos;t delete the other years.)

done.

&gt; 
&gt; Could you do a patch (without any other changes) to fix the layout of this code?
&gt; 
&gt; These methods shouldn&apos;t be in the class itself as they shouldn&apos;t be inlined.
&gt; 
&gt; This would also help the diff&apos;ing tool to pick up function names better.

done.

&gt; 
&gt; &gt; WebCore/platform/graphics/chromium/FontLinux.cpp:386
&gt; &gt; +    const TextRun&amp; getNormalizedTextRun(const TextRun&amp; originalRun)
&gt; 
&gt; It would be nice it this function was static, since you are calling it from within the initialization of the member variables in the constructor.
&gt; 
&gt; As the moment it is way too easy to use a member variable in here and that shouldn&apos;t be done in this function or any that it calls (except for special cases).
&gt; 
&gt; It looks like it only uses m_normalizedBuffer and m_normalizedRun, so those could be passed in to it. (Or perhaps this method and these two member variables should be split off into a little class that is called at this point.)

changed to static.

&gt; 
&gt; &gt; WebCore/platform/graphics/chromium/FontLinux.cpp:402
&gt; &gt; +        // Convert to NFC form if text has diacritical marks
&gt; 
&gt; s/if /if the /
&gt; Please add a period to the end of the comment.

done.

&gt; 
&gt; &gt; WebCore/platform/graphics/chromium/FontLinux.cpp:409
&gt; &gt; +                icu::Normalizer::normalize(icu::UnicodeString(originalRun.characters(),
&gt; 
&gt; Why do we only need to call icu::Normalizer::normalize when UBLOCK_COMBINING_DIACRITICAL_MARKS? 

that was in the previous logic and remained.
from my tests, looks like icu::..normalize() only do NFC to those with combining marks, for example:
a + \u308, not \u0915 + \u093c.
seems that other decomposition/composition in complex script, such as both \u0958  and \u0915 + \u093c (which are equivalent composed and de-composed forms), are rendered correctly too. My guess is harfbuzz does the normalization.


&gt; 
&gt; Are there any other cases?
&gt; 
&gt; &gt; WebCore/platform/graphics/chromium/FontLinux.cpp:410
&gt; &gt; +                                 originalRun.length()), UNORM_NFC, 0 /* no options */,
&gt; 
&gt; alignment with ( of previous line.  (Note that you don&apos;t need to wrap the line.)

done.

&gt; 
&gt; &gt; WebCore/platform/graphics/chromium/FontLinux.cpp:419
&gt; &gt; +        int normalizedBufferLen;
&gt; 
&gt; normalizedBufferLength
&gt; 
&gt; (Avoid abbreviations in WebKit code.)

done.

&gt; 
&gt; &gt; WebCore/platform/graphics/chromium/FontLinux.cpp:420
&gt; &gt; +        const UChar* srcText;
&gt; 
&gt; Use sourceText.

done.

&gt; 
&gt; (Avoid abbreviations in WebKit code.)
&gt; 
&gt; &gt; WebCore/platform/graphics/chromium/FontLinux.cpp:430
&gt; &gt; +        normSpaceAndMirrorChars(originalRun.rtl(), m_normalizedBuffer.get(), srcText, normalizedBufferLen);
&gt; 
&gt; The ordering of parameters seems odd. It almost follows a memcpy ordering but it also has a bool before them.
&gt; I would go with input/output ordering.
&gt; 
&gt; Like this
&gt; normSpaceAndMirrorChars(srcText, originalRun.rtl(), m_normalizedBuffer.get(), normalizedBufferLen);

done.

&gt; 
&gt; &gt; WebCore/platform/graphics/chromium/FontLinux.cpp:586
&gt; &gt; +    void normSpaceAndMirrorChars(bool rtl, UChar* destination, const UChar* source, int length) const
&gt; 
&gt; &quot;norm&quot; avoid abbreviation.

done.

&gt; 
&gt; s/Space/Spaces/

done.

&gt; 
&gt; &gt; WebCore/platform/graphics/chromium/FontLinux.cpp:598
&gt; &gt; +                if (rtl)
&gt; 
&gt; Do &quot;else if&quot;
&gt; 
&gt; As opposed to
&gt; 
&gt; else {
&gt;     if

done.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>296545</commentid>
    <comment_count>5</comment_count>
      <attachid>71229</attachid>
    <who name="Xiaomei Ji">xji</who>
    <bug_when>2010-10-19 17:00:20 -0700</bug_when>
    <thetext>Created attachment 71229
path</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>297207</commentid>
    <comment_count>6</comment_count>
      <attachid>71229</attachid>
    <who name="David Levin">levin</who>
    <bug_when>2010-10-20 19:41:26 -0700</bug_when>
    <thetext>Comment on attachment 71229
path

View in context: https://bugs.webkit.org/attachment.cgi?id=71229&amp;action=review

Please consider addressing the feedback when you land this.

Thanks.

&gt; WebCore/platform/graphics/chromium/FontLinux.cpp:231
&gt; +    static void normalizeSpacesAndMirrorChars(const UChar*, bool, UChar*, int);

Ideally there would be parameter names here that indicated what each of these parameters should be. (Use the parameter names from your function below.)

The WebKit rule for parameter names is remove them if they don&apos;t add any information.

&gt; WebCore/platform/graphics/chromium/FontLinux.cpp:232
&gt; +    static const TextRun&amp; getNormalizedTextRun(const TextRun&amp;, OwnPtr&lt;TextRun&gt;&amp;, OwnArrayPtr&lt;UChar&gt;&amp;);

Add parameter names here too.

&gt; WebCore/platform/graphics/chromium/FontLinux.cpp:444
&gt; +

Extra blank line.

&gt; WebCore/platform/graphics/chromium/FontLinux.cpp:449
&gt; + 

Extra blank line.

&gt; WebCore/platform/graphics/chromium/FontLinux.cpp:598
&gt; +void TextRunWalker::normalizeSpacesAndMirrorChars(const UChar* source, bool rtl, UChar* destination, int length)

It would be nice if the ordering of these functions followed the ordering in the class. (You could just swap them in the class.) This isn&apos;t required but it is nice.

&gt; WebCore/platform/graphics/chromium/FontLinux.cpp:610
&gt; +                character = u_charMirror(character);

The indentation is way off here. Perhaps there is a tab?

&gt; LayoutTests/platform/chromium/fast/text/font-linux-normalize.html:3
&gt; +&lt;script src=../editing.js language=&quot;JavaScript&quot; type=&quot;text/JavaScript&quot; &gt;&lt;/script&gt;

It doesn&apos;t look like you use anything from editing.js.

If you don&apos;t, then don&apos;t include it.

&gt; LayoutTests/platform/chromium/fast/text/font-linux-normalize.html:40
&gt; +    //assertEqual(&quot;devanagari + a with diaeresis&quot;, string, &quot;\u0958\u0909 \u00e4&quot;);

Why is this commented out? Maybe you should just remove it.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>297657</commentid>
    <comment_count>7</comment_count>
    <who name="Xiaomei Ji">xji</who>
    <bug_when>2010-10-21 14:43:41 -0700</bug_when>
    <thetext>Committed r70266: &lt;http://trac.webkit.org/changeset/70266&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>69524</attachid>
            <date>2010-10-01 14:49:40 -0700</date>
            <delta_ts>2010-10-13 23:49:54 -0700</delta_ts>
            <desc>patch</desc>
            <filename>47019.v1</filename>
            <type>text/plain</type>
            <size>7051</size>
            <attacher name="Xiaomei Ji">xji</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
ZjIwMjk0ZS4uOWQ2OGI2YSAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSwyMyBAQAorMjAxMC0xMC0wMSAgWGlhb21laSBKaSAg
PHhqaUBjaHJvbWl1bS5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISku
CisKKyAgICAgICAgUGVyZm9ybWFuY2UgaW1wcm92ZW1lbnQgZm9yIEZvbnRMaW51eC4KKyAgICAg
ICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTQ3MDE5CisgICAgICAg
IAorICAgICAgICBSZWR1Y2UgdGUgbnVtYmVyIG9mIGNhbGxzIGZvciBub3JtYWxpemF0aW9uIGZ1
bmN0aW9uIGJlY2F1c2UgY29udmVydGluZworICAgICAgICB0byBORkMgZm9ybSBpcyB2ZXJ5IGV4
cGVuc2l2ZS4KKyAgICAKKyAgICAgICAgQ29tYmluZSBzcGFjZSBub3JtYWxpemF0aW9uIGFuZCBj
aGFyYWN0ZXIgbWlycm9yaW5nIGludG8gb25lIHRleHQgc2Nhbi4KKworICAgICAgICBObyBuZXcg
dGVzdHMgc2luY2UgdGhlcmUgaXMgbm8gZnVuY3Rpb25hbGl0eSBjaGFuZ2UuCisKKyAgICAgICAg
KiBwbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9Gb250TGludXguY3BwOgorICAgICAgICAoV2Vi
Q29yZTo6VGV4dFJ1bldhbGtlcjo6VGV4dFJ1bldhbGtlcik6CisgICAgICAgIChXZWJDb3JlOjpU
ZXh0UnVuV2Fsa2VyOjp+VGV4dFJ1bldhbGtlcik6CisgICAgICAgIChXZWJDb3JlOjpUZXh0UnVu
V2Fsa2VyOjpnZXROb3JtYWxpemVkVGV4dFJ1bik6CisgICAgICAgIChXZWJDb3JlOjpUZXh0UnVu
V2Fsa2VyOjpub3JtU3BhY2VBbmRNaXJyb3JDaGFycyk6CisKIDIwMTAtMTAtMDEgIFJvYmVydCBI
b2dhbiAgPHJvYmVydEB3ZWJraXQub3JnPgogCiAgICAgICAgIFJldmlld2VkIGJ5IEFkYW0gQmFy
dGguCmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0ZvbnRM
aW51eC5jcHAgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0ZvbnRMaW51eC5j
cHAKaW5kZXggNGQ5ODRjNC4uZmE2MGJmZiAxMDA2NDQKLS0tIGEvV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy9jaHJvbWl1bS9Gb250TGludXguY3BwCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3MvY2hyb21pdW0vRm9udExpbnV4LmNwcApAQCAtMTY1LDExICsxNjUsMTMgQEAgcHVibGlj
OgogICAgICAgICA6IG1fZm9udChmb250KQogICAgICAgICAsIG1fc3RhcnRpbmdYKHN0YXJ0aW5n
WCkKICAgICAgICAgLCBtX29mZnNldFgobV9zdGFydGluZ1gpCi0gICAgICAgICwgbV9ydW4oZ2V0
VGV4dFJ1bihydW4pKQorICAgICAgICAsIG1fcnVuKGdldE5vcm1hbGl6ZWRUZXh0UnVuKHJ1bikp
CiAgICAgICAgICwgbV9pdGVyYXRlQmFja3dhcmRzKG1fcnVuLnJ0bCgpKQogICAgICAgICAsIG1f
d29yZFNwYWNpbmdBZGp1c3RtZW50KDApCiAgICAgICAgICwgbV9wYWRkaW5nKDApCisgICAgICAg
ICwgbV9wYWRQZXJXb3JkQnJlYWsoMCkKICAgICAgICAgLCBtX3BhZEVycm9yKDApCisgICAgICAg
ICwgbV9sZXR0ZXJTcGFjaW5nKDApCiAgICAgewogICAgICAgICAvLyBEbyBub3QgdXNlIHxydW58
IGluc2lkZSB0aGlzIGNvbnN0cnVjdG9yLiBVc2UgfG1fcnVufCBpbnN0ZWFkLgogCkBAIC0xODcs
MTcgKzE4OSw4IEBAIHB1YmxpYzoKIAogICAgICAgICBtX2l0ZW0uaXRlbS5iaWRpTGV2ZWwgPSBt
X3J1bi5ydGwoKTsKIAotICAgICAgICBpbnQgbGVuZ3RoID0gbV9ydW4ubGVuZ3RoKCk7Ci0gICAg
ICAgIG1faXRlbS5zdHJpbmdMZW5ndGggPSBsZW5ndGg7Ci0KLSAgICAgICAgaWYgKCFtX2l0ZW0u
aXRlbS5iaWRpTGV2ZWwpCi0gICAgICAgICAgICBtX2l0ZW0uc3RyaW5nID0gbV9ydW4uY2hhcmFj
dGVycygpOwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIC8vIEFzc3VtZSBtaXJyb3JlZCBj
aGFyYWN0ZXIgaXMgaW4gdGhlIHNhbWUgVW5pY29kZSBtdWx0aWxpbmd1YWwgcGxhbmUgYXMgdGhl
IG9yaWdpbmFsIG9uZS4KLSAgICAgICAgICAgIFVDaGFyKiBzdHJpbmcgPSBuZXcgVUNoYXJbbGVu
Z3RoXTsKLSAgICAgICAgICAgIG1pcnJvckNoYXJhY3RlcnMoc3RyaW5nLCBtX3J1bi5jaGFyYWN0
ZXJzKCksIGxlbmd0aCk7Ci0gICAgICAgICAgICBtX2l0ZW0uc3RyaW5nID0gc3RyaW5nOwotICAg
ICAgICB9CisgICAgICAgIG1faXRlbS5zdHJpbmcgPSBtX3J1bi5jaGFyYWN0ZXJzKCk7CisgICAg
ICAgIG1faXRlbS5zdHJpbmdMZW5ndGggPSBtX3J1bi5sZW5ndGgoKTsKIAogICAgICAgICByZXNl
dCgpOwogICAgIH0KQEAgLTIwNyw4ICsyMDAsNiBAQCBwdWJsaWM6CiAgICAgICAgIGZhc3RGcmVl
KG1faXRlbS5mb250KTsKICAgICAgICAgZGVsZXRlR2x5cGhBcnJheXMoKTsKICAgICAgICAgZGVs
ZXRlW10gbV9pdGVtLmxvZ19jbHVzdGVyczsKLSAgICAgICAgaWYgKG1faXRlbS5pdGVtLmJpZGlM
ZXZlbCkKLSAgICAgICAgICAgIGRlbGV0ZVtdIG1faXRlbS5zdHJpbmc7CiAgICAgfQogCiAgICAg
Ly8gc2V0V29yZFNwYWNpbmdBZGp1c3RtZW50IHNldHMgYSBkZWx0YSAoaW4gcGl4ZWxzKSB3aGlj
aCBpcyBhcHBsaWVkIGF0CkBAIC0zOTIsOSArMzgzLDkgQEAgcHVibGljOgogICAgIH0KIAogcHJp
dmF0ZToKLSAgICBjb25zdCBUZXh0UnVuJiBnZXRUZXh0UnVuKGNvbnN0IFRleHRSdW4mIG9yaWdp
bmFsUnVuKQorICAgIGNvbnN0IFRleHRSdW4mIGdldE5vcm1hbGl6ZWRUZXh0UnVuKGNvbnN0IFRl
eHRSdW4mIG9yaWdpbmFsUnVuKQogICAgIHsKLSAgICAgICAgLy8gTm9ybWFsaXplIHRoZSB0ZXh0
IHJ1biBpbiB0d28gd2F5czoKKyAgICAgICAgLy8gTm9ybWFsaXplIHRoZSB0ZXh0IHJ1biBpbiB0
aHJlZSB3YXlzOgogICAgICAgICAvLyAxKSBDb252ZXJ0IHRoZSB8b3JpZ2luYWxSdW58IHRvIE5G
QyBub3JtYWxpemVkIGZvcm0gaWYgY29tYmluaW5nIGRpYWNyaXRpY2FsIG1hcmtzCiAgICAgICAg
IC8vIChVKzAzMDAuLikgYXJlIHVzZWQgaW4gdGhlIHJ1bi4gVGhpcyBjb252ZXJzaW9uIGlzIG5l
Y2Vzc2FyeSBzaW5jZSBtb3N0IE9wZW5UeXBlCiAgICAgICAgIC8vIGZvbnRzIChlLmcuLCBBcmlh
bCkgZG9uJ3QgaGF2ZSBzdWJzdGl0dXRpb24gcnVsZXMgZm9yIHRoZSBkaWFjcml0aWNhbCBtYXJr
cyBpbgpAQCAtNDA2LDM1ICszOTcsNDEgQEAgcHJpdmF0ZToKICAgICAgICAgLy8gSGFyZmJ1enog
d2lsbCBkbyB0aGUgc2FtZSB0aGluZyBmb3IgdXMgdXNpbmcgdGhlIEdTVUIgdGFibGUuCiAgICAg
ICAgIC8vIDIpIENvbnZlcnQgc3BhY2luZyBjaGFyYWN0ZXJzIGludG8gcGxhaW4gc3BhY2VzLCBh
cyBzb21lIGZvbnRzIHdpbGwgcHJvdmlkZSBnbHlwaHMKICAgICAgICAgLy8gZm9yIGNoYXJhY3Rl
cnMgbGlrZSAnXG4nIG90aGVyd2lzZS4KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBvcmln
aW5hbFJ1bi5sZW5ndGgoKTsgKytpKSB7Ci0gICAgICAgICAgICBVQ2hhciBjaCA9IG9yaWdpbmFs
UnVuW2ldOwotICAgICAgICAgICAgVUJsb2NrQ29kZSBibG9jayA9IDo6dWJsb2NrX2dldENvZGUo
Y2gpOwotICAgICAgICAgICAgaWYgKGJsb2NrID09IFVCTE9DS19DT01CSU5JTkdfRElBQ1JJVElD
QUxfTUFSS1MgfHwgKEZvbnQ6OnRyZWF0QXNTcGFjZShjaCkgJiYgY2ggIT0gJyAnKSkgewotICAg
ICAgICAgICAgICAgIHJldHVybiBnZXROb3JtYWxpemVkVGV4dFJ1bihvcmlnaW5hbFJ1bik7Ci0g
ICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG9yaWdpbmFsUnVuOwotICAg
IH0KLQotICAgIGNvbnN0IFRleHRSdW4mIGdldE5vcm1hbGl6ZWRUZXh0UnVuKGNvbnN0IFRleHRS
dW4mIG9yaWdpbmFsUnVuKQotICAgIHsKKyAgICAgICAgLy8gMykgQ29udmVydCBtaXJyb3JlZCBj
aGFyYWN0ZXJzIHN1Y2ggYXMgcGFyZW50aGVzaXMgZm9yIHJ0bCB0ZXh0LgorIAorICAgICAgICAv
LyBDb252ZXJ0IHRvIE5GQyBmb3JtIGlmIHRleHQgaGFzIGRpYWNyaXRpY2FsIG1hcmtzCiAgICAg
ICAgIGljdTo6VW5pY29kZVN0cmluZyBub3JtYWxpemVkU3RyaW5nOwogICAgICAgICBVRXJyb3JD
b2RlIGVycm9yID0gVV9aRVJPX0VSUk9SOwotICAgICAgICBpY3U6Ok5vcm1hbGl6ZXI6Om5vcm1h
bGl6ZShpY3U6OlVuaWNvZGVTdHJpbmcob3JpZ2luYWxSdW4uY2hhcmFjdGVycygpLCBvcmlnaW5h
bFJ1bi5sZW5ndGgoKSksIFVOT1JNX05GQywgMCAvKiBubyBvcHRpb25zICovLCBub3JtYWxpemVk
U3RyaW5nLCBlcnJvcik7Ci0gICAgICAgIGlmIChVX0ZBSUxVUkUoZXJyb3IpKQotICAgICAgICAg
ICAgcmV0dXJuIG9yaWdpbmFsUnVuOwogCi0gICAgICAgIG1fbm9ybWFsaXplZEJ1ZmZlci5zZXQo
bmV3IFVDaGFyW25vcm1hbGl6ZWRTdHJpbmcubGVuZ3RoKCkgKyAxXSk7Ci0gICAgICAgIG5vcm1h
bGl6ZWRTdHJpbmcuZXh0cmFjdChtX25vcm1hbGl6ZWRCdWZmZXIuZ2V0KCksIG5vcm1hbGl6ZWRT
dHJpbmcubGVuZ3RoKCkgKyAxLCBlcnJvcik7Ci0gICAgICAgIEFTU0VSVChVX1NVQ0NFU1MoZXJy
b3IpKTsKKyAgICAgICAgZm9yIChpbnQxNl90IGkgPSAwOyBpIDwgb3JpZ2luYWxSdW4ubGVuZ3Ro
KCk7ICsraSkgeworICAgICAgICAgICAgVUNoYXIgY2ggPSBvcmlnaW5hbFJ1bltpXTsKKyAgICAg
ICAgICAgIGlmICg6OnVibG9ja19nZXRDb2RlKGNoKSA9PSBVQkxPQ0tfQ09NQklOSU5HX0RJQUNS
SVRJQ0FMX01BUktTKSB7CisgICAgICAgICAgICAgICAgaWN1OjpOb3JtYWxpemVyOjpub3JtYWxp
emUoaWN1OjpVbmljb2RlU3RyaW5nKG9yaWdpbmFsUnVuLmNoYXJhY3RlcnMoKSwKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsUnVuLmxlbmd0aCgpKSwgVU5PUk1fTkZD
LCAwIC8qIG5vIG9wdGlvbnMgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBu
b3JtYWxpemVkU3RyaW5nLCBlcnJvcik7CisgICAgICAgICAgICAgICAgaWYgKFVfRkFJTFVSRShl
cnJvcikpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbFJ1bjsKKyAgICAgICAg
ICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0gICAgICAgIGZvciAo
aW50IGkgPSAwOyBpIDwgbm9ybWFsaXplZFN0cmluZy5sZW5ndGgoKTsgKytpKSB7Ci0gICAgICAg
ICAgICBpZiAoRm9udDo6dHJlYXRBc1NwYWNlKG1fbm9ybWFsaXplZEJ1ZmZlcltpXSkpCi0gICAg
ICAgICAgICAgICAgbV9ub3JtYWxpemVkQnVmZmVyW2ldID0gJyAnOworICAgICAgICAvLyBOb3Jt
YWxpemUgc3BhY2UgYW5kIG1pcnJvciBwYXJlbnRoZXNpcyBmb3IgcnRsIHRleHQuCisgICAgICAg
IGludCBub3JtYWxpemVkQnVmZmVyTGVuOworICAgICAgICBjb25zdCBVQ2hhciogc3JjVGV4dDsK
KyAgICAgICAgaWYgKG5vcm1hbGl6ZWRTdHJpbmcuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBu
b3JtYWxpemVkQnVmZmVyTGVuID0gb3JpZ2luYWxSdW4ubGVuZ3RoKCk7CisgICAgICAgICAgICBz
cmNUZXh0ID0gb3JpZ2luYWxSdW4uY2hhcmFjdGVycygpOworICAgICAgICB9IGVsc2UgeworICAg
ICAgICAgICAgbm9ybWFsaXplZEJ1ZmZlckxlbiA9IG5vcm1hbGl6ZWRTdHJpbmcubGVuZ3RoKCk7
CisgICAgICAgICAgICBzcmNUZXh0ID0gbm9ybWFsaXplZFN0cmluZy5nZXRCdWZmZXIoKTsKICAg
ICAgICAgfQorICAgICAgICBtX25vcm1hbGl6ZWRCdWZmZXIuc2V0KG5ldyBVQ2hhcltub3JtYWxp
emVkQnVmZmVyTGVuICsgMV0pOworCisgICAgICAgIG5vcm1TcGFjZUFuZE1pcnJvckNoYXJzKG9y
aWdpbmFsUnVuLnJ0bCgpLCBtX25vcm1hbGl6ZWRCdWZmZXIuZ2V0KCksIHNyY1RleHQsIG5vcm1h
bGl6ZWRCdWZmZXJMZW4pOworIAogCiAgICAgICAgIG1fbm9ybWFsaXplZFJ1bi5zZXQobmV3IFRl
eHRSdW4ob3JpZ2luYWxSdW4pKTsKLSAgICAgICAgbV9ub3JtYWxpemVkUnVuLT5zZXRUZXh0KG1f
bm9ybWFsaXplZEJ1ZmZlci5nZXQoKSwgbm9ybWFsaXplZFN0cmluZy5sZW5ndGgoKSk7CisgICAg
ICAgIG1fbm9ybWFsaXplZFJ1bi0+c2V0VGV4dChtX25vcm1hbGl6ZWRCdWZmZXIuZ2V0KCksIG5v
cm1hbGl6ZWRCdWZmZXJMZW4pOwogICAgICAgICByZXR1cm4gKm1fbm9ybWFsaXplZFJ1bjsKICAg
ICB9CiAKQEAgLTU4Niw3ICs1ODMsNyBAQCBwcml2YXRlOgogICAgICAgICByZXR1cm4gYyA9PSAn
ICcgfHwgYyA9PSAnXHQnOwogICAgIH0KIAotICAgIHZvaWQgbWlycm9yQ2hhcmFjdGVycyhVQ2hh
ciogZGVzdGluYXRpb24sIGNvbnN0IFVDaGFyKiBzb3VyY2UsIGludCBsZW5ndGgpIGNvbnN0Cisg
ICAgdm9pZCBub3JtU3BhY2VBbmRNaXJyb3JDaGFycyhib29sIHJ0bCwgVUNoYXIqIGRlc3RpbmF0
aW9uLCBjb25zdCBVQ2hhciogc291cmNlLCBpbnQgbGVuZ3RoKSBjb25zdAogICAgIHsKICAgICAg
ICAgaW50IHBvc2l0aW9uID0gMDsKICAgICAgICAgYm9vbCBlcnJvciA9IGZhbHNlOwpAQCAtNTk1
LDcgKzU5MiwxMiBAQCBwcml2YXRlOgogICAgICAgICAgICAgVUNoYXIzMiBjaGFyYWN0ZXI7CiAg
ICAgICAgICAgICBpbnQgbmV4dFBvc2l0aW9uID0gcG9zaXRpb247CiAgICAgICAgICAgICBVMTZf
TkVYVChzb3VyY2UsIG5leHRQb3NpdGlvbiwgbGVuZ3RoLCBjaGFyYWN0ZXIpOwotICAgICAgICAg
ICAgY2hhcmFjdGVyID0gdV9jaGFyTWlycm9yKGNoYXJhY3Rlcik7CisgICAgICAgICAgICBpZiAo
Rm9udDo6dHJlYXRBc1NwYWNlKGNoYXJhY3RlcikpCisgICAgICAgICAgICAgICAgY2hhcmFjdGVy
ID0gJyAnOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKHJ0bCkKKyAg
ICAgICAgICAgICAgICAgICAgY2hhcmFjdGVyID0gdV9jaGFyTWlycm9yKGNoYXJhY3Rlcik7Cisg
ICAgICAgICAgICB9CiAgICAgICAgICAgICBVMTZfQVBQRU5EKGRlc3RpbmF0aW9uLCBwb3NpdGlv
biwgbGVuZ3RoLCBjaGFyYWN0ZXIsIGVycm9yKTsKICAgICAgICAgICAgIEFTU0VSVCghZXJyb3Ip
OwogICAgICAgICAgICAgcG9zaXRpb24gPSBuZXh0UG9zaXRpb247Cg==
</data>
<flag name="review"
          id="59232"
          type_id="1"
          status="-"
          setter="levin"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>71229</attachid>
            <date>2010-10-19 17:00:20 -0700</date>
            <delta_ts>2010-10-20 19:41:25 -0700</delta_ts>
            <desc>path</desc>
            <filename>47019.v2</filename>
            <type>text/plain</type>
            <size>11464</size>
            <attacher name="Xiaomei Ji">xji</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA3MDA5MCkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMjMgQEAKKzIwMTAtMTAtMTkgIFhpYW9tZWkgSmkgIDx4amlAY2hyb21pdW0ub3Jn
PgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFBlcmZv
cm1hbmNlIGltcHJvdmVtZW50IGZvciBGb250TGludXguCisgICAgICAgIGh0dHBzOi8vYnVncy53
ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD00NzAxOQorICAgICAgICAKKyAgICAgICAgUmVkdWNl
IHRoZSBudW1iZXIgb2YgY2FsbHMgZm9yIHRoZSBub3JtYWxpemF0aW9uIGZ1bmN0aW9uIGJlY2F1
c2UgY29udmVydGluZworICAgICAgICB0byBORkMgZm9ybSBpcyB2ZXJ5IGV4cGVuc2l2ZS4KKyAg
ICAKKyAgICAgICAgQ29tYmluZSBzcGFjZSBub3JtYWxpemF0aW9uIGFuZCBjaGFyYWN0ZXIgbWly
cm9yaW5nIGludG8gb25lIHRleHQgc2Nhbi4KKworICAgICAgICBUZXN0OiBwbGF0Zm9ybS9jaHJv
bWl1bS9mYXN0L3RleHQvZm9udC1saW51eC1ub3JtYWxpemUuaHRtbAorCisgICAgICAgICogcGxh
dGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vRm9udExpbnV4LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6
OlRleHRSdW5XYWxrZXI6OlRleHRSdW5XYWxrZXIpOgorICAgICAgICAoV2ViQ29yZTo6VGV4dFJ1
bldhbGtlcjo6flRleHRSdW5XYWxrZXIpOgorICAgICAgICAoV2ViQ29yZTo6VGV4dFJ1bldhbGtl
cjo6Z2V0Tm9ybWFsaXplZFRleHRSdW4pOgorICAgICAgICAoV2ViQ29yZTo6VGV4dFJ1bldhbGtl
cjo6bm9ybWFsaXplU3BhY2VzQW5kTWlycm9yQ2hhcnMpOgorCiAyMDEwLTEwLTE5ICBNYXJ0aW4g
Um9iaW5zb24gIDxtcm9iaW5zb25AaWdhbGlhLmNvbT4KIAogICAgICAgICBGaXggdGhlIEdUSysg
YnVpbGQgYWZ0ZXIgcjcwMDcyLiBUaGUgbG9naWMgbG9va3MgaW5jb3JyZWN0LCBidXQKSW5kZXg6
IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vRm9udExpbnV4LmNwcAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0ZvbnRMaW51eC5jcHAJ
KHJldmlzaW9uIDY5OTcyKQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9G
b250TGludXguY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHly
aWdodCAoYykgMjAwNywgMjAwOCwgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq
IENvcHlyaWdodCAoYykgMjAwNywgMjAwOCwgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgogICogCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu
YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKQEAgLTIyMCw4ICsy
MjAsNiBAQCBwdWJsaWM6CiAgICAgY29uc3QgRm9udFBsYXRmb3JtRGF0YSogZm9udFBsYXRmb3Jt
RGF0YUZvclNjcmlwdFJ1bigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Rm9udFBsYXRmb3Jt
RGF0YSo+KG1faXRlbS5mb250LT51c2VyRGF0YSk7IH0KIAogcHJpdmF0ZToKLSAgICBjb25zdCBU
ZXh0UnVuJiBnZXRUZXh0UnVuKGNvbnN0IFRleHRSdW4mKTsKLSAgICBjb25zdCBUZXh0UnVuJiBn
ZXROb3JtYWxpemVkVGV4dFJ1bihjb25zdCBUZXh0UnVuJik7CiAgICAgdm9pZCBzZXR1cEZvbnRG
b3JTY3JpcHRSdW4oKTsKICAgICBIQl9Gb250UmVjKiBhbGxvY0hhcmZidXp6Rm9udCgpOwogICAg
IHZvaWQgZGVsZXRlR2x5cGhBcnJheXMoKTsKQEAgLTIyOSw3ICsyMjcsOSBAQCBwcml2YXRlOgog
ICAgIHZvaWQgcmVzZXRHbHlwaEFycmF5cygpOwogICAgIHZvaWQgc2hhcGVHbHlwaHMoKTsKICAg
ICB2b2lkIHNldEdseXBoWFBvc2l0aW9ucyhib29sKTsKLSAgICB2b2lkIG1pcnJvckNoYXJhY3Rl
cnMoVUNoYXIqLCBjb25zdCBVQ2hhciosIGludCkgY29uc3Q7CisKKyAgICBzdGF0aWMgdm9pZCBu
b3JtYWxpemVTcGFjZXNBbmRNaXJyb3JDaGFycyhjb25zdCBVQ2hhciosIGJvb2wsIFVDaGFyKiwg
aW50KTsKKyAgICBzdGF0aWMgY29uc3QgVGV4dFJ1biYgZ2V0Tm9ybWFsaXplZFRleHRSdW4oY29u
c3QgVGV4dFJ1biYsIE93blB0cjxUZXh0UnVuPiYsIE93bkFycmF5UHRyPFVDaGFyPiYpOwogCiAg
ICAgLy8gVGhpcyBtYXRjaGVzIHRoZSBsb2dpYyBpbiBSZW5kZXJCbG9jazo6ZmluZE5leHRMaW5l
QnJlYWsKICAgICBzdGF0aWMgYm9vbCBpc0NvZGVwb2ludFNwYWNlKEhCX1VDaGFyMTYgYykgeyBy
ZXR1cm4gYyA9PSAnICcgfHwgYyA9PSAnXHQnOyB9CkBAIC0yNjQsMTEgKzI2NCwxMyBAQCBUZXh0
UnVuV2Fsa2VyOjpUZXh0UnVuV2Fsa2VyKGNvbnN0IFRleHRSCiAgICAgOiBtX2ZvbnQoZm9udCkK
ICAgICAsIG1fc3RhcnRpbmdYKHN0YXJ0aW5nWCkKICAgICAsIG1fb2Zmc2V0WChtX3N0YXJ0aW5n
WCkKLSAgICAsIG1fcnVuKGdldFRleHRSdW4ocnVuKSkKKyAgICAsIG1fcnVuKGdldE5vcm1hbGl6
ZWRUZXh0UnVuKHJ1biwgbV9ub3JtYWxpemVkUnVuLCBtX25vcm1hbGl6ZWRCdWZmZXIpKQogICAg
ICwgbV9pdGVyYXRlQmFja3dhcmRzKG1fcnVuLnJ0bCgpKQogICAgICwgbV93b3JkU3BhY2luZ0Fk
anVzdG1lbnQoMCkKICAgICAsIG1fcGFkZGluZygwKQorICAgICwgbV9wYWRQZXJXb3JkQnJlYWso
MCkKICAgICAsIG1fcGFkRXJyb3IoMCkKKyAgICAsIG1fbGV0dGVyU3BhY2luZygwKQogewogICAg
IC8vIERvIG5vdCB1c2UgfHJ1bnwgaW5zaWRlIHRoaXMgY29uc3RydWN0b3IuIFVzZSB8bV9ydW58
IGluc3RlYWQuCiAKQEAgLTI4NiwxNyArMjg4LDggQEAgVGV4dFJ1bldhbGtlcjo6VGV4dFJ1bldh
bGtlcihjb25zdCBUZXh0UgogCiAgICAgbV9pdGVtLml0ZW0uYmlkaUxldmVsID0gbV9ydW4ucnRs
KCk7CiAKLSAgICBpbnQgbGVuZ3RoID0gbV9ydW4ubGVuZ3RoKCk7Ci0gICAgbV9pdGVtLnN0cmlu
Z0xlbmd0aCA9IGxlbmd0aDsKLQotICAgIGlmICghbV9pdGVtLml0ZW0uYmlkaUxldmVsKQotICAg
ICAgICBtX2l0ZW0uc3RyaW5nID0gbV9ydW4uY2hhcmFjdGVycygpOwotICAgIGVsc2UgewotICAg
ICAgICAvLyBBc3N1bWUgbWlycm9yZWQgY2hhcmFjdGVyIGlzIGluIHRoZSBzYW1lIFVuaWNvZGUg
bXVsdGlsaW5ndWFsIHBsYW5lIGFzIHRoZSBvcmlnaW5hbCBvbmUuCi0gICAgICAgIFVDaGFyKiBz
dHJpbmcgPSBuZXcgVUNoYXJbbGVuZ3RoXTsKLSAgICAgICAgbWlycm9yQ2hhcmFjdGVycyhzdHJp
bmcsIG1fcnVuLmNoYXJhY3RlcnMoKSwgbGVuZ3RoKTsKLSAgICAgICAgbV9pdGVtLnN0cmluZyA9
IHN0cmluZzsKLSAgICB9CisgICAgbV9pdGVtLnN0cmluZyA9IG1fcnVuLmNoYXJhY3RlcnMoKTsK
KyAgICBtX2l0ZW0uc3RyaW5nTGVuZ3RoID0gbV9ydW4ubGVuZ3RoKCk7CiAKICAgICByZXNldCgp
OwogfQpAQCAtMzA2LDggKzI5OSw2IEBAIFRleHRSdW5XYWxrZXI6On5UZXh0UnVuV2Fsa2VyKCkK
ICAgICBmYXN0RnJlZShtX2l0ZW0uZm9udCk7CiAgICAgZGVsZXRlR2x5cGhBcnJheXMoKTsKICAg
ICBkZWxldGVbXSBtX2l0ZW0ubG9nX2NsdXN0ZXJzOwotICAgIGlmIChtX2l0ZW0uaXRlbS5iaWRp
TGV2ZWwpCi0gICAgICAgIGRlbGV0ZVtdIG1faXRlbS5zdHJpbmc7CiB9CiAKIGJvb2wgVGV4dFJ1
bldhbGtlcjo6aXNXb3JkQnJlYWsodW5zaWduZWQgaW5kZXgsIGJvb2wgaXNSVEwpCkBAIC00MDgs
OSArMzk5LDkgQEAgZmxvYXQgVGV4dFJ1bldhbGtlcjo6d2lkdGhPZkZ1bGxSdW4oKQogICAgIHJl
dHVybiB3aWR0aFN1bTsKIH0KIAotY29uc3QgVGV4dFJ1biYgVGV4dFJ1bldhbGtlcjo6Z2V0VGV4
dFJ1bihjb25zdCBUZXh0UnVuJiBvcmlnaW5hbFJ1bikKK2NvbnN0IFRleHRSdW4mIFRleHRSdW5X
YWxrZXI6OmdldE5vcm1hbGl6ZWRUZXh0UnVuKGNvbnN0IFRleHRSdW4mIG9yaWdpbmFsUnVuLCBP
d25QdHI8VGV4dFJ1bj4mIG5vcm1hbGl6ZWRSdW4sIE93bkFycmF5UHRyPFVDaGFyPiYgbm9ybWFs
aXplZEJ1ZmZlcikKIHsKLSAgICAvLyBOb3JtYWxpemUgdGhlIHRleHQgcnVuIGluIHR3byB3YXlz
OgorICAgIC8vIE5vcm1hbGl6ZSB0aGUgdGV4dCBydW4gaW4gdGhyZWUgd2F5czoKICAgICAvLyAx
KSBDb252ZXJ0IHRoZSB8b3JpZ2luYWxSdW58IHRvIE5GQyBub3JtYWxpemVkIGZvcm0gaWYgY29t
YmluaW5nIGRpYWNyaXRpY2FsIG1hcmtzCiAgICAgLy8gKFUrMDMwMC4uKSBhcmUgdXNlZCBpbiB0
aGUgcnVuLiBUaGlzIGNvbnZlcnNpb24gaXMgbmVjZXNzYXJ5IHNpbmNlIG1vc3QgT3BlblR5cGUK
ICAgICAvLyBmb250cyAoZS5nLiwgQXJpYWwpIGRvbid0IGhhdmUgc3Vic3RpdHV0aW9uIHJ1bGVz
IGZvciB0aGUgZGlhY3JpdGljYWwgbWFya3MgaW4KQEAgLTQyMiwzNSArNDEzLDQ0IEBAIGNvbnN0
IFRleHRSdW4mIFRleHRSdW5XYWxrZXI6OmdldFRleHRSdW4KICAgICAvLyBIYXJmYnV6eiB3aWxs
IGRvIHRoZSBzYW1lIHRoaW5nIGZvciB1cyB1c2luZyB0aGUgR1NVQiB0YWJsZS4KICAgICAvLyAy
KSBDb252ZXJ0IHNwYWNpbmcgY2hhcmFjdGVycyBpbnRvIHBsYWluIHNwYWNlcywgYXMgc29tZSBm
b250cyB3aWxsIHByb3ZpZGUgZ2x5cGhzCiAgICAgLy8gZm9yIGNoYXJhY3RlcnMgbGlrZSAnXG4n
IG90aGVyd2lzZS4KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG9yaWdpbmFsUnVuLmxlbmd0aCgp
OyArK2kpIHsKKyAgICAvLyAzKSBDb252ZXJ0IG1pcnJvcmVkIGNoYXJhY3RlcnMgc3VjaCBhcyBw
YXJlbnRoZXNpcyBmb3IgcnRsIHRleHQuCisgCisgICAgLy8gQ29udmVydCB0byBORkMgZm9ybSBp
ZiB0aGUgdGV4dCBoYXMgZGlhY3JpdGljYWwgbWFya3MuCisgICAgaWN1OjpVbmljb2RlU3RyaW5n
IG5vcm1hbGl6ZWRTdHJpbmc7CisgICAgVUVycm9yQ29kZSBlcnJvciA9IFVfWkVST19FUlJPUjsK
KworICAgIGZvciAoaW50MTZfdCBpID0gMDsgaSA8IG9yaWdpbmFsUnVuLmxlbmd0aCgpOyArK2kp
IHsKICAgICAgICAgVUNoYXIgY2ggPSBvcmlnaW5hbFJ1bltpXTsKLSAgICAgICAgVUJsb2NrQ29k
ZSBibG9jayA9IDo6dWJsb2NrX2dldENvZGUoY2gpOwotICAgICAgICBpZiAoYmxvY2sgPT0gVUJM
T0NLX0NPTUJJTklOR19ESUFDUklUSUNBTF9NQVJLUyB8fCAoRm9udDo6dHJlYXRBc1NwYWNlKGNo
KSAmJiBjaCAhPSAnICcpKQotICAgICAgICAgICAgcmV0dXJuIGdldE5vcm1hbGl6ZWRUZXh0UnVu
KG9yaWdpbmFsUnVuKTsKKyAgICAgICAgaWYgKDo6dWJsb2NrX2dldENvZGUoY2gpID09IFVCTE9D
S19DT01CSU5JTkdfRElBQ1JJVElDQUxfTUFSS1MpIHsKKyAgICAgICAgICAgIGljdTo6Tm9ybWFs
aXplcjo6bm9ybWFsaXplKGljdTo6VW5pY29kZVN0cmluZyhvcmlnaW5hbFJ1bi5jaGFyYWN0ZXJz
KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbFJ1bi5s
ZW5ndGgoKSksIFVOT1JNX05GQywgMCAvKiBubyBvcHRpb25zICovLAorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplZFN0cmluZywgZXJyb3IpOworICAgICAg
ICAgICAgaWYgKFVfRkFJTFVSRShlcnJvcikpCisgICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdp
bmFsUnVuOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJu
IG9yaWdpbmFsUnVuOwotfQogCi1jb25zdCBUZXh0UnVuJiBUZXh0UnVuV2Fsa2VyOjpnZXROb3Jt
YWxpemVkVGV4dFJ1bihjb25zdCBUZXh0UnVuJiBvcmlnaW5hbFJ1bikKLXsKLSAgICBpY3U6OlVu
aWNvZGVTdHJpbmcgbm9ybWFsaXplZFN0cmluZzsKLSAgICBVRXJyb3JDb2RlIGVycm9yID0gVV9a
RVJPX0VSUk9SOwotICAgIGljdTo6Tm9ybWFsaXplcjo6bm9ybWFsaXplKGljdTo6VW5pY29kZVN0
cmluZyhvcmlnaW5hbFJ1bi5jaGFyYWN0ZXJzKCksIG9yaWdpbmFsUnVuLmxlbmd0aCgpKSwgVU5P
Uk1fTkZDLCAwIC8qIG5vIG9wdGlvbnMgKi8sIG5vcm1hbGl6ZWRTdHJpbmcsIGVycm9yKTsKLSAg
ICBpZiAoVV9GQUlMVVJFKGVycm9yKSkKLSAgICAgICAgcmV0dXJuIG9yaWdpbmFsUnVuOwotCi0g
ICAgbV9ub3JtYWxpemVkQnVmZmVyLnNldChuZXcgVUNoYXJbbm9ybWFsaXplZFN0cmluZy5sZW5n
dGgoKSArIDFdKTsKLSAgICBub3JtYWxpemVkU3RyaW5nLmV4dHJhY3QobV9ub3JtYWxpemVkQnVm
ZmVyLmdldCgpLCBub3JtYWxpemVkU3RyaW5nLmxlbmd0aCgpICsgMSwgZXJyb3IpOwotICAgIEFT
U0VSVChVX1NVQ0NFU1MoZXJyb3IpKTsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbm9ybWFs
aXplZFN0cmluZy5sZW5ndGgoKTsgKytpKSB7Ci0gICAgICAgIGlmIChGb250Ojp0cmVhdEFzU3Bh
Y2UobV9ub3JtYWxpemVkQnVmZmVyW2ldKSkKLSAgICAgICAgICAgIG1fbm9ybWFsaXplZEJ1ZmZl
cltpXSA9ICcgJzsKLSAgICB9Ci0KLSAgICBtX25vcm1hbGl6ZWRSdW4uc2V0KG5ldyBUZXh0UnVu
KG9yaWdpbmFsUnVuKSk7Ci0gICAgbV9ub3JtYWxpemVkUnVuLT5zZXRUZXh0KG1fbm9ybWFsaXpl
ZEJ1ZmZlci5nZXQoKSwgbm9ybWFsaXplZFN0cmluZy5sZW5ndGgoKSk7Ci0gICAgcmV0dXJuICpt
X25vcm1hbGl6ZWRSdW47CisgICAgLy8gTm9ybWFsaXplIHNwYWNlIGFuZCBtaXJyb3IgcGFyZW50
aGVzaXMgZm9yIHJ0bCB0ZXh0LgorICAgIGludCBub3JtYWxpemVkQnVmZmVyTGVuZ3RoOworICAg
IGNvbnN0IFVDaGFyKiBzb3VyY2VUZXh0OworICAgIGlmIChub3JtYWxpemVkU3RyaW5nLmlzRW1w
dHkoKSkgeworICAgICAgICBub3JtYWxpemVkQnVmZmVyTGVuZ3RoID0gb3JpZ2luYWxSdW4ubGVu
Z3RoKCk7CisgICAgICAgIHNvdXJjZVRleHQgPSBvcmlnaW5hbFJ1bi5jaGFyYWN0ZXJzKCk7Cisg
ICAgfSBlbHNlIHsKKyAgICAgICAgbm9ybWFsaXplZEJ1ZmZlckxlbmd0aCA9IG5vcm1hbGl6ZWRT
dHJpbmcubGVuZ3RoKCk7CisgICAgICAgIHNvdXJjZVRleHQgPSBub3JtYWxpemVkU3RyaW5nLmdl
dEJ1ZmZlcigpOworICAgIH0KKworCisgICAgbm9ybWFsaXplZEJ1ZmZlci5zZXQobmV3IFVDaGFy
W25vcm1hbGl6ZWRCdWZmZXJMZW5ndGggKyAxXSk7CisKKyAgICBub3JtYWxpemVTcGFjZXNBbmRN
aXJyb3JDaGFycyhzb3VyY2VUZXh0LCBvcmlnaW5hbFJ1bi5ydGwoKSwgbm9ybWFsaXplZEJ1ZmZl
ci5nZXQoKSwgbm9ybWFsaXplZEJ1ZmZlckxlbmd0aCk7CisgCisKKyAgICBub3JtYWxpemVkUnVu
LnNldChuZXcgVGV4dFJ1bihvcmlnaW5hbFJ1bikpOworICAgIG5vcm1hbGl6ZWRSdW4tPnNldFRl
eHQobm9ybWFsaXplZEJ1ZmZlci5nZXQoKSwgbm9ybWFsaXplZEJ1ZmZlckxlbmd0aCk7CisgICAg
cmV0dXJuICpub3JtYWxpemVkUnVuOwogfQogCiB2b2lkIFRleHRSdW5XYWxrZXI6OnNldHVwRm9u
dEZvclNjcmlwdFJ1bigpCkBAIC01OTUsNyArNTk1LDcgQEAgdm9pZCBUZXh0UnVuV2Fsa2VyOjpz
ZXRHbHlwaFhQb3NpdGlvbnMoYgogICAgIG1fb2Zmc2V0WCArPSBtX3BpeGVsV2lkdGg7CiB9CiAK
LXZvaWQgVGV4dFJ1bldhbGtlcjo6bWlycm9yQ2hhcmFjdGVycyhVQ2hhciogZGVzdGluYXRpb24s
IGNvbnN0IFVDaGFyKiBzb3VyY2UsIGludCBsZW5ndGgpIGNvbnN0Cit2b2lkIFRleHRSdW5XYWxr
ZXI6Om5vcm1hbGl6ZVNwYWNlc0FuZE1pcnJvckNoYXJzKGNvbnN0IFVDaGFyKiBzb3VyY2UsIGJv
b2wgcnRsLCBVQ2hhciogZGVzdGluYXRpb24sIGludCBsZW5ndGgpCiB7CiAgICAgaW50IHBvc2l0
aW9uID0gMDsKICAgICBib29sIGVycm9yID0gZmFsc2U7CkBAIC02MDQsNyArNjA0LDEwIEBAIHZv
aWQgVGV4dFJ1bldhbGtlcjo6bWlycm9yQ2hhcmFjdGVycyhVQ2gKICAgICAgICAgVUNoYXIzMiBj
aGFyYWN0ZXI7CiAgICAgICAgIGludCBuZXh0UG9zaXRpb24gPSBwb3NpdGlvbjsKICAgICAgICAg
VTE2X05FWFQoc291cmNlLCBuZXh0UG9zaXRpb24sIGxlbmd0aCwgY2hhcmFjdGVyKTsKLSAgICAg
ICAgY2hhcmFjdGVyID0gdV9jaGFyTWlycm9yKGNoYXJhY3Rlcik7CisgICAgICAgIGlmIChGb250
Ojp0cmVhdEFzU3BhY2UoY2hhcmFjdGVyKSkKKyAgICAgICAgICAgIGNoYXJhY3RlciA9ICcgJzsK
KyAgICAgICAgZWxzZSBpZiAocnRsKQorICAgICAgICAgICAgICAgIGNoYXJhY3RlciA9IHVfY2hh
ck1pcnJvcihjaGFyYWN0ZXIpOwogICAgICAgICBVMTZfQVBQRU5EKGRlc3RpbmF0aW9uLCBwb3Np
dGlvbiwgbGVuZ3RoLCBjaGFyYWN0ZXIsIGVycm9yKTsKICAgICAgICAgQVNTRVJUKCFlcnJvcik7
CiAgICAgICAgIHBvc2l0aW9uID0gbmV4dFBvc2l0aW9uOwpJbmRleDogTGF5b3V0VGVzdHMvQ2hh
bmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIExheW91dFRlc3RzL0NoYW5nZUxvZwkocmV2aXNpb24gNzAw
OTApCisrKyBMYXlvdXRUZXN0cy9DaGFuZ2VMb2cJKHdvcmtpbmcgY29weSkKQEAgLTEsMyArMSwx
OCBAQAorMjAxMC0xMC0xOSAgWGlhb21laSBKaSAgPHhqaUBjaHJvbWl1bS5vcmc+CisKKyAgICAg
ICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgUGVyZm9ybWFuY2UgaW1w
cm92ZW1lbnQgZm9yIEZvbnRMaW51eC4KKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcv
c2hvd19idWcuY2dpP2lkPTQ3MDE5CisgICAgICAgIAorICAgICAgICBSZWR1Y2UgdGhlIG51bWJl
ciBvZiBjYWxscyBmb3IgdGhlIG5vcm1hbGl6YXRpb24gZnVuY3Rpb24gYmVjYXVzZSBjb252ZXJ0
aW5nCisgICAgICAgIHRvIE5GQyBmb3JtIGlzIHZlcnkgZXhwZW5zaXZlLgorICAgIAorICAgICAg
ICBDb21iaW5lIHNwYWNlIG5vcm1hbGl6YXRpb24gYW5kIGNoYXJhY3RlciBtaXJyb3JpbmcgaW50
byBvbmUgdGV4dCBzY2FuLgorCisgICAgICAgICogcGxhdGZvcm0vY2hyb21pdW0vZmFzdC90ZXh0
L2ZvbnQtbGludXgtbm9ybWFsaXplLWV4cGVjdGVkLnR4dDogQWRkZWQuCisgICAgICAgICogcGxh
dGZvcm0vY2hyb21pdW0vZmFzdC90ZXh0L2ZvbnQtbGludXgtbm9ybWFsaXplLmh0bWw6IEFkZGVk
LgorCiAyMDEwLTEwLTE5ICBKYW1lcyBSb2JpbnNvbiAgPGphbWVzckBjaHJvbWl1bS5vcmc+CiAK
ICAgICAgICAgVXBkYXRlIGNocm9taXVtIGV4cGVjdGF0aW9ucy4KSW5kZXg6IExheW91dFRlc3Rz
L3BsYXRmb3JtL2Nocm9taXVtL2Zhc3QvdGV4dC9mb250LWxpbnV4LW5vcm1hbGl6ZS1leHBlY3Rl
ZC50eHQKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMvcGxhdGZvcm0vY2hyb21pdW0vZmFzdC90
ZXh0L2ZvbnQtbGludXgtbm9ybWFsaXplLWV4cGVjdGVkLnR4dAkocmV2aXNpb24gMCkKKysrIExh
eW91dFRlc3RzL3BsYXRmb3JtL2Nocm9taXVtL2Zhc3QvdGV4dC9mb250LWxpbnV4LW5vcm1hbGl6
ZS1leHBlY3RlZC50eHQJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEgQEAKK+CkleCkvOCkiQlhzIgK
SW5kZXg6IExheW91dFRlc3RzL3BsYXRmb3JtL2Nocm9taXVtL2Zhc3QvdGV4dC9mb250LWxpbnV4
LW5vcm1hbGl6ZS5odG1sCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIExheW91dFRlc3RzL3BsYXRmb3JtL2Nocm9t
aXVtL2Zhc3QvdGV4dC9mb250LWxpbnV4LW5vcm1hbGl6ZS5odG1sCShyZXZpc2lvbiAwKQorKysg
TGF5b3V0VGVzdHMvcGxhdGZvcm0vY2hyb21pdW0vZmFzdC90ZXh0L2ZvbnQtbGludXgtbm9ybWFs
aXplLmh0bWwJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsNDkgQEAKKzxodG1sPgorPGhlYWQ+Cis8
c2NyaXB0IHNyYz0uLi9lZGl0aW5nLmpzIGxhbmd1YWdlPSJKYXZhU2NyaXB0IiB0eXBlPSJ0ZXh0
L0phdmFTY3JpcHQiID48L3NjcmlwdD4KKzxzY3JpcHQ+CitmdW5jdGlvbiBsb2coc3RyKSB7Cisg
ICAgdmFyIGxpID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgibGkiKTsKKyAgICBsaS5hcHBlbmRD
aGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShzdHIpKTsKKyAgICB2YXIgY29uc29sZSA9IGRv
Y3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb25zb2xlIik7CisgICAgY29uc29sZS5hcHBlbmRDaGls
ZChsaSk7Cit9CisKK2Z1bmN0aW9uIGNvbnZlcnRTdHJpbmdUb1VuaWNvZGUoc3RyaW5nKQorewor
ICAgIHZhciByZXR1cm5WYWx1ZSA9ICIgKGNoYXJhY3RlciBpbiBVbmljb2RlIHZhbHVlKTogIjsK
KyAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0cmluZy5sZW5ndGg7ICsraSkKKyAgICB7CisgICAg
ICAgIHJldHVyblZhbHVlICs9ICIgIiArIHN0cmluZy5jaGFyQ29kZUF0KGkpOworICAgIH0KKyAg
ICByZXR1cm4gcmV0dXJuVmFsdWU7Cit9CisKK2Z1bmN0aW9uIGFzc2VydEVxdWFsKHRlc3RfbmFt
ZSwgYWN0dWFsLCBleHBlY3RlZCkKK3sKKyAgICBpZiAoYWN0dWFsICE9IGV4cGVjdGVkKSB7Cisg
ICAgICAgIGxvZygiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpOworICAgICAg
ICBsb2coIkZBSUxFRDogIiArIHRlc3RfbmFtZSk7CisgICAgICAgIHZhciBhY3R1YWxfc3RyaW5n
ID0gImFjdHVhbCIgKyBjb252ZXJ0U3RyaW5nVG9Vbmljb2RlKGFjdHVhbCk7CisgICAgICAgIHZh
ciBleHBlY3RlZF9zdHJpbmcgPSAiZXhwZWN0ZWQiICsgY29udmVydFN0cmluZ1RvVW5pY29kZShl
eHBlY3RlZCk7CisgICAgICAgIGxvZyhhY3R1YWxfc3RyaW5nKTsKKyAgICAgICAgbG9nKGV4cGVj
dGVkX3N0cmluZyk7CisgICAgfQorfQorCitvbmxvYWQgPSBmdW5jdGlvbigpCit7CisgICAgaWYg
KHdpbmRvdy5sYXlvdXRUZXN0Q29udHJvbGxlcikKKyAgICAgICAgbGF5b3V0VGVzdENvbnRyb2xs
ZXIuZHVtcEFzVGV4dCgpOworICAgIHZhciBkaXYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgi
ZGl2Iik7CisgICAgdmFyIHN0cmluZyA9IGRpdi5pbm5lckhUTUw7CisgICAgLy9hc3NlcnRFcXVh
bCgiZGV2YW5hZ2FyaSArIGEgd2l0aCBkaWFlcmVzaXMiLCBzdHJpbmcsICJcdTA5NThcdTA5MDkg
XHUwMGU0Iik7CisgICAgYXNzZXJ0RXF1YWwoImRldmFuYWdhcmkgKyBhIHdpdGggZGlhZXJlc2lz
Iiwgc3RyaW5nLCAiXHUwOTE1XHUwOTNjXHUwOTA5XHUwMDA5YVx1MDMwOCIpOworfQorPC9zY3Jp
cHQ+Cis8L2hlYWQ+Cis8Ym9keT4KKzxkaXYgaWQ9ImRpdiI+JiN4OTE1OyYjeDA5M2M7JiN4MDkw
OTsmI3g5O2EmI3gzMDg7PC9kaXY+Cis8dWwgaWQ9ImNvbnNvbGUiPjwvdWw+Cis8L2JvZHk+Cis8
L2h0bWw+Cg==
</data>
<flag name="review"
          id="61241"
          type_id="1"
          status="+"
          setter="levin"
    />
    <flag name="commit-queue"
          id="61420"
          type_id="3"
          status="-"
          setter="levin"
    />
          </attachment>
      

    </bug>

</bugzilla>