<?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>100872</bug_id>
          
          <creation_ts>2012-10-31 11:36:23 -0700</creation_ts>
          <short_desc>[v8] r132913 caused a bunch of performance regressions and progressions</short_desc>
          <delta_ts>2012-12-03 16:07:07 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>Text</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>PerfRegression</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Ojan Vafai">ojan</reporter>
          <assigned_to name="Ojan Vafai">ojan</assigned_to>
          <cc>abarth</cc>
    
    <cc>dcarney</cc>
    
    <cc>eric</cc>
    
    <cc>haraken</cc>
    
    <cc>japhet</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>755497</commentid>
    <comment_count>0</comment_count>
    <who name="Ojan Vafai">ojan</who>
    <bug_when>2012-10-31 11:36:23 -0700</bug_when>
    <thetext>http://trac.webkit.org/changeset/132913/ caused a bunch of performance regressions and progressions. Typically, we have a no perf regression policy in the tree. I think we should rollout for now and see if there is a fix that only improves performance. This will also help to verify that the other perf regressions I&apos;m seeing are not from this patch. Sound OK?

Regressions:
http://build.chromium.org/f/chromium/perf/mac-release-10.6-webkit-latest/dom_perf/report.html?rev=165183&amp;graph=Events&amp;trace=score&amp;history=150
http://build.chromium.org/f/chromium/perf/mac-release-10.6-webkit-latest/dromaeo_domcorequery/report.html?rev=164983&amp;graph=dom_query_getElementById&amp;trace=score&amp;history=150


Progressions:
http://build.chromium.org/f/chromium/perf/chromium-rel-win7-webkit/dromaeo_jslibattrjquery/report.html?rev=165203&amp;graph=jslib_attr_jquery_jQuery___addClass&amp;trace=score&amp;history=150
http://build.chromium.org/f/chromium/perf/chromium-rel-win7-webkit/dromaeo_jslibattrjquery/report.html?rev=165139&amp;graph=jslib_attr_jquery_jQuery___hasClass_x10&amp;trace=score&amp;history=150
http://build.chromium.org/f/chromium/perf/chromium-rel-win7-webkit/dom_perf/report.html?rev=165231&amp;graph=Total&amp;trace=score&amp;history=150
http://build.chromium.org/f/chromium/perf/chromium-rel-win7-webkit/dom_perf/report.html?rev=165213&amp;graph=Get%20Elements&amp;trace=score&amp;history=150
http://build.chromium.org/f/chromium/perf/chromium-rel-win7-webkit/dom_perf/report.html?rev=165231&amp;graph=DOMDivWalk&amp;trace=score&amp;history=150</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>755508</commentid>
    <comment_count>1</comment_count>
    <who name="Ojan Vafai">ojan</who>
    <bug_when>2012-10-31 11:49:09 -0700</bug_when>
    <thetext>Another progression: http://build.chromium.org/f/chromium/perf/linux-release-webkit-latest/dromaeo_jslibattrjquery/report.html?rev=164991&amp;graph=jslib_attr_jquery_jQuery___hasClass_x10&amp;trace=score&amp;history=150</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>755539</commentid>
    <comment_count>2</comment_count>
    <who name="Dan Carney">dcarney</who>
    <bug_when>2012-10-31 12:28:18 -0700</bug_when>
    <thetext>This patch was expected to improve performance in many benchmarks, but regress a few. There is no patch that will only progress. I really need this patch to get tested in Canary for a while, since it&apos;s the first of a series of patches that should eventually regression free. If you could hold off on a rollback for a while, that would be optimal.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>755554</commentid>
    <comment_count>3</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2012-10-31 12:41:29 -0700</bug_when>
    <thetext>I think it makes sense to keep the patch in.  Mostly it&apos;s important to be aware of these issues and to make sure we&apos;re making the right trade-offs here.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>755558</commentid>
    <comment_count>4</comment_count>
    <who name="Ojan Vafai">ojan</who>
    <bug_when>2012-10-31 12:45:30 -0700</bug_when>
    <thetext>(In reply to comment #3)
&gt; I think it makes sense to keep the patch in.  Mostly it&apos;s important to be aware of these issues and to make sure we&apos;re making the right trade-offs here.

Is a 33% regression on getElementById OK? In general, we have this policy of not leaving regressions in because it&apos;s hard to see when (if!) the regression gets fixed due to other patches going in that affect the performance.

Can we understand why this test case regressed so much? Not sure what having this patch on the Canary helps with in terms of addressing this benchmark.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>756393</commentid>
    <comment_count>5</comment_count>
    <who name="Ojan Vafai">ojan</who>
    <bug_when>2012-11-01 10:09:29 -0700</bug_when>
    <thetext>It&apos;s hard to be sure, but I think this patch greatly increase the variance of http://build.chromium.org/f/chromium/perf/linux-release-webkit-latest/dom_perf/report.html?rev=165238&amp;graph=Get%20Elements&amp;history=150. When it performs poorly it&apos;s a 60% regression.

I really think we need to rollout until this is better understood. Having high variance like this makes it impossible to identify future regressions.

It&apos;s hard to know for sure it was this patch, but this was the most likely candidate and a rollout would confirm.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>757348</commentid>
    <comment_count>6</comment_count>
      <attachid>172088</attachid>
    <who name="Ojan Vafai">ojan</who>
    <bug_when>2012-11-02 11:02:12 -0700</bug_when>
    <thetext>Created attachment 172088
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>757357</commentid>
    <comment_count>7</comment_count>
      <attachid>172088</attachid>
    <who name="Kentaro Hara">haraken</who>
    <bug_when>2012-11-02 11:08:32 -0700</bug_when>
    <thetext>Comment on attachment 172088
Patch

I am a big fan of the patch, but it looks like we need to investigate performance issues before landing.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>757362</commentid>
    <comment_count>8</comment_count>
    <who name="Ojan Vafai">ojan</who>
    <bug_when>2012-11-02 11:16:55 -0700</bug_when>
    <thetext>Completely agree. If we believe we can make a patch that is regression free, then we should do so. Otherwise, we risk masking other performance regressions.

When we&apos;re sure that the regressions really are fundamental and it&apos;s just a trade-off of which scenarios we care more about, *then* we can evaluate whether we&apos;re making the right trade-offs. I think in this case, we&apos;d still want to move forward with this change even if there are some unavoidable regressions, but lets try to get it so that it&apos;s strictly an improvement first.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>757393</commentid>
    <comment_count>9</comment_count>
      <attachid>172088</attachid>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-11-02 11:34:22 -0700</bug_when>
    <thetext>Comment on attachment 172088
Patch

Clearing flags on attachment: 172088

Committed r133319: &lt;http://trac.webkit.org/changeset/133319&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>757394</commentid>
    <comment_count>10</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-11-02 11:34:26 -0700</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>757427</commentid>
    <comment_count>11</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2012-11-02 11:59:53 -0700</bug_when>
    <thetext>I&apos;m very interested in seeing this patch come back.  I&apos;m happy to help with the regressions next week Dan, if you like!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>762731</commentid>
    <comment_count>12</comment_count>
    <who name="Dan Carney">dcarney</who>
    <bug_when>2012-11-09 02:01:16 -0800</bug_when>
    <thetext>(In reply to comment #11)
&gt; I&apos;m very interested in seeing this patch come back.  I&apos;m happy to help with the regressions next week Dan, if you like!

Eric, if you have time to figure out where the regression is coming in, that would be  really great. I can think of only 2 possible places that could cause slowdown.  You&apos;ll see in one spot I added the following:

// FIXME: There is no inline fast path for 8 bit atomic strings.

It could be that the stack assigned array in fromV8String for 16 bit strings is significantly faster than the malloc&apos;d version used in the 8 bit call. If that&apos;s the case (and I assume it is), the fix is easy -just implement the 8 bit version. Also, might want to experiment with this value.

static const int inlineBufferSize = 16;

if the benchmarks uses a lot of length 18 strings, for instance, we could maybe get some speedup here.


The second thing could be the invocation of containsOnlyASCII here:

    if (string.is8Bit() &amp;&amp; string.containsOnlyASCII()) {

it doesn&apos;t look like much, but it scans the entire string and won&apos;t return early. For larger strings, this could be costly as it could blow all the cpu cache lines. Once I&apos;m done the V8 side of this patch, I will remove the call completely, so if this is causing a big regression, the solution is to either leave the patch out until the V8 side changes are in or to perform the check only for small strings.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>769243</commentid>
    <comment_count>13</comment_count>
    <who name="Dan Carney">dcarney</who>
    <bug_when>2012-11-16 07:18:33 -0800</bug_when>
    <thetext>(In reply to comment #12)
&gt; (In reply to comment #11)
&gt; &gt; I&apos;m very interested in seeing this patch come back.  I&apos;m happy to help with the regressions next week Dan, if you like!
&gt; 
&gt; Eric, if you have time to figure out where the regression is coming in, that would be  really great. I can think of only 2 possible places that could cause slowdown.  You&apos;ll see in one spot I added the following:
&gt; 
&gt; // FIXME: There is no inline fast path for 8 bit atomic strings.
&gt; 
&gt; It could be that the stack assigned array in fromV8String for 16 bit strings is significantly faster than the malloc&apos;d version used in the 8 bit call. If that&apos;s the case (and I assume it is), the fix is easy -just implement the 8 bit version. Also, might want to experiment with this value.


It turned out that the 8 fast path for atomic string creation actually had been implemented since I first created that patch. Once I changed the code to use it, performance shot up across the board.  I tested all benchmarks carefully and got no regressions in dromeao/dom-query or anywhere in dom_perf, with the possible exception of a couple of the benchmarks in dom_perf/accessors. I couldn&apos;t tell if variations there were caused by major gcs or something more fundamental. I&apos;ll keep an eye on it after the patch is committed. Test variance generally dropped across the board as well, but I&apos;m not sure if that holds in all cases.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>172088</attachid>
            <date>2012-11-02 11:02:12 -0700</date>
            <delta_ts>2012-11-02 11:34:21 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-100872-20121102110032.patch</filename>
            <type>text/plain</type>
            <size>16226</size>
            <attacher name="Ojan Vafai">ojan</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTMzMzE1CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggZmU5MjQ5ZmZkYWVkMTZk
OTBkZGYxYzZlZjNhZGVkMDc4OTFlMWE4OC4uYmQ3MzIwZGIxYWZmOGI3YmI2NDk3NGRhNTQ0NDM0
OTcwNDdhNjg1ZCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDI5IEBACisyMDEyLTExLTAyICBPamFu
IFZhZmFpICA8b2phbkBjaHJvbWl1bS5vcmc+CisKKyAgICAgICAgVW5yZXZpZXdlZCwgcm9sbGlu
ZyBvdXQgcjEzMjkxMy4KKyAgICAgICAgaHR0cDovL3RyYWMud2Via2l0Lm9yZy9jaGFuZ2VzZXQv
MTMyOTEzCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD05
MTg1MAorCisgICAgICAgIENhdXNlZCBwZXJmb3JtYW5jZSByZWdyZXNzaW9ucy4KKyAgICAgICAg
U2VlIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMDA4NzIgZm9yIGRl
dGFpbHMuCisKKyAgICAgICAgKiBiaW5kaW5ncy92OC9WOFBlcklzb2xhdGVEYXRhLmNwcDoKKyAg
ICAgICAgKFdlYkNvcmU6OlY4UGVySXNvbGF0ZURhdGE6OnZpc2l0RXh0ZXJuYWxTdHJpbmdzKToK
KyAgICAgICAgKiBiaW5kaW5ncy92OC9WOFN0cmluZ1Jlc291cmNlLmNwcDoKKyAgICAgICAgKFN0
cmluZ1RyYWl0cyk6CisgICAgICAgIChXZWJDb3JlOjp2OFN0cmluZ1RvV2ViQ29yZVN0cmluZyk6
CisgICAgICAgICogYmluZGluZ3MvdjgvVjhWYWx1ZUNhY2hlLmNwcDoKKyAgICAgICAgKFdlYkNv
cmU6Om1ha2VFeHRlcm5hbFN0cmluZyk6CisgICAgICAgIChXZWJDb3JlOjpXZWJDb3JlU3RyaW5n
UmVzb3VyY2U6OnZpc2l0U3RyaW5ncyk6CisgICAgICAgICogYmluZGluZ3MvdjgvVjhWYWx1ZUNh
Y2hlLmg6CisgICAgICAgIChXZWJDb3JlOjpXZWJDb3JlU3RyaW5nUmVzb3VyY2U6OldlYkNvcmVT
dHJpbmdSZXNvdXJjZSk6CisgICAgICAgIChXZWJDb3JlOjpXZWJDb3JlU3RyaW5nUmVzb3VyY2U6
On5XZWJDb3JlU3RyaW5nUmVzb3VyY2UpOgorICAgICAgICAoV2ViQ29yZTo6V2ViQ29yZVN0cmlu
Z1Jlc291cmNlOjpkYXRhKToKKyAgICAgICAgKFdlYkNvcmVTdHJpbmdSZXNvdXJjZSk6CisgICAg
ICAgIChXZWJDb3JlOjpXZWJDb3JlU3RyaW5nUmVzb3VyY2U6Omxlbmd0aCk6CisgICAgICAgIChX
ZWJDb3JlOjpXZWJDb3JlU3RyaW5nUmVzb3VyY2U6OmF0b21pY1N0cmluZyk6CisgICAgICAgIChX
ZWJDb3JlOjpXZWJDb3JlU3RyaW5nUmVzb3VyY2U6OnRvU3RyaW5nUmVzb3VyY2UpOgorCiAyMDEy
LTExLTAyICBKaW53b28gU29uZyAgPGppbndvbzcuc29uZ0BzYW1zdW5nLmNvbT4KIAogICAgICAg
ICBGaXggYnVpbGQgd2FybmluZyBbLVdzd2l0Y2hdCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29y
ZS9iaW5kaW5ncy92OC9WOFBlcklzb2xhdGVEYXRhLmNwcCBiL1NvdXJjZS9XZWJDb3JlL2JpbmRp
bmdzL3Y4L1Y4UGVySXNvbGF0ZURhdGEuY3BwCmluZGV4IDRkOGUwZDE2YzcxOTM3MzQwOGNjNjY2
ODAzODY3MmViNzE4ZDIxYjUuLjM3MzA2NmMyYjQ1MjQ4YTYxYzI1NGMwZGYxMTAyNGVhM2M2NzQw
OTIgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL2JpbmRpbmdzL3Y4L1Y4UGVySXNvbGF0ZURh
dGEuY3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL2JpbmRpbmdzL3Y4L1Y4UGVySXNvbGF0ZURhdGEu
Y3BwCkBAIC0xMjEsNyArMTIxLDcgQEAgdm9pZCBWOFBlcklzb2xhdGVEYXRhOjp2aXNpdEV4dGVy
bmFsU3RyaW5ncyhFeHRlcm5hbFN0cmluZ1Zpc2l0b3IqIHZpc2l0b3IpCiAgICAgICAgIHZpcnR1
YWwgflZpc2l0b3JJbXBsKCkgeyB9CiAgICAgICAgIHZpcnR1YWwgdm9pZCBWaXNpdEV4dGVybmFs
U3RyaW5nKHY4OjpIYW5kbGU8djg6OlN0cmluZz4gc3RyaW5nKQogICAgICAgICB7Ci0gICAgICAg
ICAgICBXZWJDb3JlU3RyaW5nUmVzb3VyY2VCYXNlKiByZXNvdXJjZSA9IFdlYkNvcmVTdHJpbmdS
ZXNvdXJjZUJhc2U6OnRvV2ViQ29yZVN0cmluZ1Jlc291cmNlQmFzZShzdHJpbmcpOworICAgICAg
ICAgICAgV2ViQ29yZVN0cmluZ1Jlc291cmNlKiByZXNvdXJjZSA9IHN0YXRpY19jYXN0PFdlYkNv
cmVTdHJpbmdSZXNvdXJjZSo+KHN0cmluZy0+R2V0RXh0ZXJuYWxTdHJpbmdSZXNvdXJjZSgpKTsK
ICAgICAgICAgICAgIGlmIChyZXNvdXJjZSkKICAgICAgICAgICAgICAgICByZXNvdXJjZS0+dmlz
aXRTdHJpbmdzKG1fdmlzaXRvcik7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJD
b3JlL2JpbmRpbmdzL3Y4L1Y4U3RyaW5nUmVzb3VyY2UuY3BwIGIvU291cmNlL1dlYkNvcmUvYmlu
ZGluZ3MvdjgvVjhTdHJpbmdSZXNvdXJjZS5jcHAKaW5kZXggNDMwODI1YmExMDBlNWY4OGI4MDk0
YWY3YzFhMmFmZjc0OTk2OWFmMC4uNTk4NTUzZmZmY2QwYjMwMzYxNTA2YmUxY2UzOWEzYzI3Njdm
ZTU2NCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvYmluZGluZ3MvdjgvVjhTdHJpbmdSZXNv
dXJjZS5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvYmluZGluZ3MvdjgvVjhTdHJpbmdSZXNvdXJj
ZS5jcHAKQEAgLTMwLDEyMSArMzAsNzIgQEAKIAogbmFtZXNwYWNlIFdlYkNvcmUgewogCi10ZW1w
bGF0ZTxjbGFzcyBTdHJpbmdDbGFzcz4gc3RydWN0IFN0cmluZ1RyYWl0cyB7Ci0gICAgc3RhdGlj
IGNvbnN0IFN0cmluZ0NsYXNzJiBmcm9tU3RyaW5nUmVzb3VyY2UoV2ViQ29yZVN0cmluZ1Jlc291
cmNlQmFzZSopOwotICAgIHN0YXRpYyBib29sIGlzMTZCaXRBdG9taWNTdHJpbmcoU3RyaW5nQ2xh
c3MmKTsKLSAgICB0ZW1wbGF0ZTxib29sIGFzY2lpPgordGVtcGxhdGUgPGNsYXNzIFN0cmluZ0Ns
YXNzPiBzdHJ1Y3QgU3RyaW5nVHJhaXRzIHsKKyAgICBzdGF0aWMgY29uc3QgU3RyaW5nQ2xhc3Mm
IGZyb21TdHJpbmdSZXNvdXJjZShXZWJDb3JlU3RyaW5nUmVzb3VyY2UqKTsKICAgICBzdGF0aWMg
U3RyaW5nQ2xhc3MgZnJvbVY4U3RyaW5nKHY4OjpIYW5kbGU8djg6OlN0cmluZz4sIGludCk7CiB9
OwogCiB0ZW1wbGF0ZTw+CiBzdHJ1Y3QgU3RyaW5nVHJhaXRzPFN0cmluZz4gewotICAgIHN0YXRp
YyBjb25zdCBTdHJpbmcmIGZyb21TdHJpbmdSZXNvdXJjZShXZWJDb3JlU3RyaW5nUmVzb3VyY2VC
YXNlKiByZXNvdXJjZSkKKyAgICBzdGF0aWMgY29uc3QgU3RyaW5nJiBmcm9tU3RyaW5nUmVzb3Vy
Y2UoV2ViQ29yZVN0cmluZ1Jlc291cmNlKiByZXNvdXJjZSkKICAgICB7CiAgICAgICAgIHJldHVy
biByZXNvdXJjZS0+d2ViY29yZVN0cmluZygpOwogICAgIH0KLSAgICBzdGF0aWMgYm9vbCBpczE2
Qml0QXRvbWljU3RyaW5nKFN0cmluZyYgc3RyaW5nKQorCisgICAgc3RhdGljIFN0cmluZyBmcm9t
VjhTdHJpbmcodjg6OkhhbmRsZTx2ODo6U3RyaW5nPiB2OFN0cmluZywgaW50IGxlbmd0aCkKICAg
ICB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgQVNTRVJUKHY4U3RyaW5nLT5MZW5n
dGgoKSA9PSBsZW5ndGgpOworICAgICAgICAvLyBOT1RFOiBhcyBvZiBub3csIFN0cmluZyhjb25z
dCBVQ2hhciosIGludCkgcGVyZm9ybXMgU3RyaW5nOjpjcmVhdGVVbmluaXRpYWxpemVkCisgICAg
ICAgIC8vIGFueXdheSwgc28gbm8gbmVlZCB0byBvcHRpbWl6ZSBsaWtlIHdlIGRvIGZvciBBdG9t
aWNTdHJpbmcgYmVsb3cuCisgICAgICAgIFVDaGFyKiBidWZmZXI7CisgICAgICAgIFN0cmluZyBy
ZXN1bHQgPSBTdHJpbmc6OmNyZWF0ZVVuaW5pdGlhbGl6ZWQobGVuZ3RoLCBidWZmZXIpOworICAg
ICAgICB2OFN0cmluZy0+V3JpdGUocmVpbnRlcnByZXRfY2FzdDx1aW50MTZfdCo+KGJ1ZmZlciks
IDAsIGxlbmd0aCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQotICAgIHRlbXBsYXRl
PGJvb2wgYXNjaWk+Ci0gICAgc3RhdGljIFN0cmluZyBmcm9tVjhTdHJpbmcodjg6OkhhbmRsZTx2
ODo6U3RyaW5nPiwgaW50KTsKIH07CiAKIHRlbXBsYXRlPD4KIHN0cnVjdCBTdHJpbmdUcmFpdHM8
QXRvbWljU3RyaW5nPiB7Ci0gICAgc3RhdGljIGNvbnN0IEF0b21pY1N0cmluZyYgZnJvbVN0cmlu
Z1Jlc291cmNlKFdlYkNvcmVTdHJpbmdSZXNvdXJjZUJhc2UqIHJlc291cmNlKQorICAgIHN0YXRp
YyBjb25zdCBBdG9taWNTdHJpbmcmIGZyb21TdHJpbmdSZXNvdXJjZShXZWJDb3JlU3RyaW5nUmVz
b3VyY2UqIHJlc291cmNlKQogICAgIHsKICAgICAgICAgcmV0dXJuIHJlc291cmNlLT5hdG9taWNT
dHJpbmcoKTsKICAgICB9Ci0gICAgc3RhdGljIGJvb2wgaXMxNkJpdEF0b21pY1N0cmluZyhBdG9t
aWNTdHJpbmcmIHN0cmluZykKKworICAgIHN0YXRpYyBBdG9taWNTdHJpbmcgZnJvbVY4U3RyaW5n
KHY4OjpIYW5kbGU8djg6OlN0cmluZz4gdjhTdHJpbmcsIGludCBsZW5ndGgpCiAgICAgewotICAg
ICAgICByZXR1cm4gIXN0cmluZy5zdHJpbmcoKS5pczhCaXQoKTsKKyAgICAgICAgQVNTRVJUKHY4
U3RyaW5nLT5MZW5ndGgoKSA9PSBsZW5ndGgpOworICAgICAgICBzdGF0aWMgY29uc3QgaW50IGlu
bGluZUJ1ZmZlclNpemUgPSAxNjsKKyAgICAgICAgaWYgKGxlbmd0aCA8PSBpbmxpbmVCdWZmZXJT
aXplKSB7CisgICAgICAgICAgICBVQ2hhciBpbmxpbmVCdWZmZXJbaW5saW5lQnVmZmVyU2l6ZV07
CisgICAgICAgICAgICB2OFN0cmluZy0+V3JpdGUocmVpbnRlcnByZXRfY2FzdDx1aW50MTZfdCo+
KGlubGluZUJ1ZmZlciksIDAsIGxlbmd0aCk7CisgICAgICAgICAgICByZXR1cm4gQXRvbWljU3Ry
aW5nKGlubGluZUJ1ZmZlciwgbGVuZ3RoKTsKKyAgICAgICAgfQorICAgICAgICBVQ2hhciogYnVm
ZmVyOworICAgICAgICBTdHJpbmcgc3RyaW5nID0gU3RyaW5nOjpjcmVhdGVVbmluaXRpYWxpemVk
KGxlbmd0aCwgYnVmZmVyKTsKKyAgICAgICAgdjhTdHJpbmctPldyaXRlKHJlaW50ZXJwcmV0X2Nh
c3Q8dWludDE2X3QqPihidWZmZXIpLCAwLCBsZW5ndGgpOworICAgICAgICByZXR1cm4gQXRvbWlj
U3RyaW5nKHN0cmluZyk7CiAgICAgfQotICAgIHRlbXBsYXRlPGJvb2wgYXNjaWk+Ci0gICAgc3Rh
dGljIEF0b21pY1N0cmluZyBmcm9tVjhTdHJpbmcodjg6OkhhbmRsZTx2ODo6U3RyaW5nPiwgaW50
KTsKIH07CiAKLXRlbXBsYXRlPD4KLVN0cmluZyBTdHJpbmdUcmFpdHM8U3RyaW5nPjo6ZnJvbVY4
U3RyaW5nPGZhbHNlPih2ODo6SGFuZGxlPHY4OjpTdHJpbmc+IHY4U3RyaW5nLCBpbnQgbGVuZ3Ro
KQotewotICAgIEFTU0VSVCh2OFN0cmluZy0+TGVuZ3RoKCkgPT0gbGVuZ3RoKTsKLSAgICBVQ2hh
ciogYnVmZmVyOwotICAgIFN0cmluZyByZXN1bHQgPSBTdHJpbmc6OmNyZWF0ZVVuaW5pdGlhbGl6
ZWQobGVuZ3RoLCBidWZmZXIpOwotICAgIHY4U3RyaW5nLT5Xcml0ZShyZWludGVycHJldF9jYXN0
PHVpbnQxNl90Kj4oYnVmZmVyKSwgMCwgbGVuZ3RoKTsKLSAgICByZXR1cm4gcmVzdWx0OwotfQot
Ci10ZW1wbGF0ZTw+Ci1BdG9taWNTdHJpbmcgU3RyaW5nVHJhaXRzPEF0b21pY1N0cmluZz46OmZy
b21WOFN0cmluZzxmYWxzZT4odjg6OkhhbmRsZTx2ODo6U3RyaW5nPiB2OFN0cmluZywgaW50IGxl
bmd0aCkKLXsKLSAgICBBU1NFUlQodjhTdHJpbmctPkxlbmd0aCgpID09IGxlbmd0aCk7Ci0gICAg
c3RhdGljIGNvbnN0IGludCBpbmxpbmVCdWZmZXJTaXplID0gMTY7Ci0gICAgaWYgKGxlbmd0aCA8
PSBpbmxpbmVCdWZmZXJTaXplKSB7Ci0gICAgICAgIFVDaGFyIGlubGluZUJ1ZmZlcltpbmxpbmVC
dWZmZXJTaXplXTsKLSAgICAgICAgdjhTdHJpbmctPldyaXRlKHJlaW50ZXJwcmV0X2Nhc3Q8dWlu
dDE2X3QqPihpbmxpbmVCdWZmZXIpLCAwLCBsZW5ndGgpOwotICAgICAgICByZXR1cm4gQXRvbWlj
U3RyaW5nKGlubGluZUJ1ZmZlciwgbGVuZ3RoKTsKLSAgICB9Ci0gICAgVUNoYXIqIGJ1ZmZlcjsK
LSAgICBTdHJpbmcgc3RyaW5nID0gU3RyaW5nOjpjcmVhdGVVbmluaXRpYWxpemVkKGxlbmd0aCwg
YnVmZmVyKTsKLSAgICB2OFN0cmluZy0+V3JpdGUocmVpbnRlcnByZXRfY2FzdDx1aW50MTZfdCo+
KGJ1ZmZlciksIDAsIGxlbmd0aCk7Ci0gICAgcmV0dXJuIEF0b21pY1N0cmluZyhzdHJpbmcpOwot
fQotCi10ZW1wbGF0ZTw+Ci1TdHJpbmcgU3RyaW5nVHJhaXRzPFN0cmluZz46OmZyb21WOFN0cmlu
Zzx0cnVlPih2ODo6SGFuZGxlPHY4OjpTdHJpbmc+IHY4U3RyaW5nLCBpbnQgbGVuZ3RoKQotewot
ICAgIEFTU0VSVCh2OFN0cmluZy0+TGVuZ3RoKCkgPT0gbGVuZ3RoKTsKLSAgICBMQ2hhciogYnVm
ZmVyOwotICAgIFN0cmluZyByZXN1bHQgPSBTdHJpbmc6OmNyZWF0ZVVuaW5pdGlhbGl6ZWQobGVu
Z3RoLCBidWZmZXIpOwotICAgIHY4U3RyaW5nLT5Xcml0ZUFzY2lpKHJlaW50ZXJwcmV0X2Nhc3Q8
Y2hhcio+KGJ1ZmZlciksIDAsIGxlbmd0aCwgdjg6OlN0cmluZzo6UFJFU0VSVkVfQVNDSUlfTlVM
TCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotdGVtcGxhdGU8PgotaW5saW5lIEF0b21pY1N0
cmluZyBTdHJpbmdUcmFpdHM8QXRvbWljU3RyaW5nPjo6ZnJvbVY4U3RyaW5nPHRydWU+KHY4OjpI
YW5kbGU8djg6OlN0cmluZz4gdjhTdHJpbmcsIGludCBsZW5ndGgpCi17Ci0gICAgLy8gRklYTUU6
IFRoZXJlIGlzIG5vIGlubGluZSBmYXN0IHBhdGggZm9yIDggYml0IGF0b21pYyBzdHJpbmdzLgot
ICAgIFN0cmluZyByZXN1bHQgPSBTdHJpbmdUcmFpdHM8U3RyaW5nPjo6ZnJvbVY4U3RyaW5nPHRy
dWU+KHY4U3RyaW5nLCBsZW5ndGgpOwotICAgIHJldHVybiBBdG9taWNTdHJpbmcocmVzdWx0KTsK
LX0KLQotdGVtcGxhdGU8dHlwZW5hbWUgU3RyaW5nVHlwZT4KK3RlbXBsYXRlIDx0eXBlbmFtZSBT
dHJpbmdUeXBlPgogU3RyaW5nVHlwZSB2OFN0cmluZ1RvV2ViQ29yZVN0cmluZyh2ODo6SGFuZGxl
PHY4OjpTdHJpbmc+IHY4U3RyaW5nLCBFeHRlcm5hbE1vZGUgZXh0ZXJuYWwpCiB7Ci0gICAgewot
ICAgICAgICAvLyBBIGxvdCBvZiBXZWJDb3JlU3RyaW5nUmVzb3VyY2VCYXNlOjp0b1dlYkNvcmVT
dHJpbmdSZXNvdXJjZUJhc2UgaXMgY29waWVkIGhlcmUgYnkgaGFuZCBmb3IgcGVyZm9ybWFuY2Ug
cmVhc29ucy4KLSAgICAgICAgLy8gVGhpcyBwb3J0aW9uIG9mIHRoaXMgZnVuY3Rpb24gaXMgdmVy
eSBob3QgaW4gY2VydGFpbiBEcm9tZWFvIGJlbmNobWFya3MuCi0gICAgICAgIHY4OjpTdHJpbmc6
OkVuY29kaW5nIGVuY29kaW5nOwotICAgICAgICB2ODo6U3RyaW5nOjpFeHRlcm5hbFN0cmluZ1Jl
c291cmNlQmFzZSogcmVzb3VyY2UgPSB2OFN0cmluZy0+R2V0RXh0ZXJuYWxTdHJpbmdSZXNvdXJj
ZUJhc2UoJmVuY29kaW5nKTsKLSAgICAgICAgaWYgKExJS0VMWSghIXJlc291cmNlKSkgewotICAg
ICAgICAgICAgV2ViQ29yZVN0cmluZ1Jlc291cmNlQmFzZSogYmFzZTsKLSAgICAgICAgICAgIGlm
IChlbmNvZGluZyA9PSB2ODo6U3RyaW5nOjpBU0NJSV9FTkNPRElORykKLSAgICAgICAgICAgICAg
ICBiYXNlID0gc3RhdGljX2Nhc3Q8V2ViQ29yZVN0cmluZ1Jlc291cmNlOCo+KHJlc291cmNlKTsK
LSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBiYXNlID0gc3RhdGljX2Nhc3Q8V2Vi
Q29yZVN0cmluZ1Jlc291cmNlMTYqPihyZXNvdXJjZSk7Ci0gICAgICAgICAgICByZXR1cm4gU3Ry
aW5nVHJhaXRzPFN0cmluZ1R5cGU+Ojpmcm9tU3RyaW5nUmVzb3VyY2UoYmFzZSk7Ci0gICAgICAg
IH0KLSAgICB9CisgICAgV2ViQ29yZVN0cmluZ1Jlc291cmNlKiBzdHJpbmdSZXNvdXJjZSA9IFdl
YkNvcmVTdHJpbmdSZXNvdXJjZTo6dG9TdHJpbmdSZXNvdXJjZSh2OFN0cmluZyk7CisgICAgaWYg
KHN0cmluZ1Jlc291cmNlKQorICAgICAgICByZXR1cm4gU3RyaW5nVHJhaXRzPFN0cmluZ1R5cGU+
Ojpmcm9tU3RyaW5nUmVzb3VyY2Uoc3RyaW5nUmVzb3VyY2UpOwogCiAgICAgaW50IGxlbmd0aCA9
IHY4U3RyaW5nLT5MZW5ndGgoKTsKLSAgICBpZiAoVU5MSUtFTFkoIWxlbmd0aCkpCisgICAgaWYg
KCFsZW5ndGgpCiAgICAgICAgIHJldHVybiBTdHJpbmcoIiIpOwogCi0gICAgYm9vbCBub25Bc2Np
aSA9IHY4U3RyaW5nLT5NYXlDb250YWluTm9uQXNjaWkoKTsKLSAgICBTdHJpbmdUeXBlIHJlc3Vs
dChub25Bc2NpaSA/IFN0cmluZ1RyYWl0czxTdHJpbmdUeXBlPjo6dGVtcGxhdGUgZnJvbVY4U3Ry
aW5nPGZhbHNlPih2OFN0cmluZywgbGVuZ3RoKSA6IFN0cmluZ1RyYWl0czxTdHJpbmdUeXBlPjo6
dGVtcGxhdGUgZnJvbVY4U3RyaW5nPHRydWU+KHY4U3RyaW5nLCBsZW5ndGgpKTsKKyAgICBTdHJp
bmdUeXBlIHJlc3VsdChTdHJpbmdUcmFpdHM8U3RyaW5nVHlwZT46OmZyb21WOFN0cmluZyh2OFN0
cmluZywgbGVuZ3RoKSk7CiAKLSAgICBpZiAoZXh0ZXJuYWwgIT0gRXh0ZXJuYWxpemUgfHwgIXY4
U3RyaW5nLT5DYW5NYWtlRXh0ZXJuYWwoKSkKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLQotICAg
IGlmICghbm9uQXNjaWkgJiYgIVN0cmluZ1RyYWl0czxTdHJpbmdUeXBlPjo6aXMxNkJpdEF0b21p
Y1N0cmluZyhyZXN1bHQpKSB7Ci0gICAgICAgIFdlYkNvcmVTdHJpbmdSZXNvdXJjZTgqIHN0cmlu
Z1Jlc291cmNlID0gbmV3IFdlYkNvcmVTdHJpbmdSZXNvdXJjZTgocmVzdWx0KTsKLSAgICAgICAg
aWYgKFVOTElLRUxZKCF2OFN0cmluZy0+TWFrZUV4dGVybmFsKHN0cmluZ1Jlc291cmNlKSkpCi0g
ICAgICAgICAgICBkZWxldGUgc3RyaW5nUmVzb3VyY2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAg
V2ViQ29yZVN0cmluZ1Jlc291cmNlMTYqIHN0cmluZ1Jlc291cmNlID0gbmV3IFdlYkNvcmVTdHJp
bmdSZXNvdXJjZTE2KHJlc3VsdCk7Ci0gICAgICAgIGlmIChVTkxJS0VMWSghdjhTdHJpbmctPk1h
a2VFeHRlcm5hbChzdHJpbmdSZXNvdXJjZSkpKQorICAgIGlmIChleHRlcm5hbCA9PSBFeHRlcm5h
bGl6ZSAmJiB2OFN0cmluZy0+Q2FuTWFrZUV4dGVybmFsKCkpIHsKKyAgICAgICAgc3RyaW5nUmVz
b3VyY2UgPSBuZXcgV2ViQ29yZVN0cmluZ1Jlc291cmNlKHJlc3VsdCk7CisgICAgICAgIGlmICgh
djhTdHJpbmctPk1ha2VFeHRlcm5hbChzdHJpbmdSZXNvdXJjZSkpIHsKKyAgICAgICAgICAgIC8v
IEluIGNhc2Ugb2YgYSBmYWlsdXJlIGRlbGV0ZSB0aGUgZXh0ZXJuYWwgcmVzb3VyY2UgYXMgaXQg
d2FzIG5vdCB1c2VkLgogICAgICAgICAgICAgZGVsZXRlIHN0cmluZ1Jlc291cmNlOworICAgICAg
ICB9CiAgICAgfQogICAgIHJldHVybiByZXN1bHQ7CiB9CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2Vi
Q29yZS9iaW5kaW5ncy92OC9WOFZhbHVlQ2FjaGUuY3BwIGIvU291cmNlL1dlYkNvcmUvYmluZGlu
Z3MvdjgvVjhWYWx1ZUNhY2hlLmNwcAppbmRleCBkMTgwMTFkYWRiZDkyNzgwYjc1Y2E5OGM2Yzhh
NDhmOWJkZTViMTkyLi4zOWNmZmM1YTI4Y2VjNTBkYWVkMWRhNzg5OTM1NjU2ZDU5ZTgxNjFhIDEw
MDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9iaW5kaW5ncy92OC9WOFZhbHVlQ2FjaGUuY3BwCisr
KyBiL1NvdXJjZS9XZWJDb3JlL2JpbmRpbmdzL3Y4L1Y4VmFsdWVDYWNoZS5jcHAKQEAgLTMzLDE1
ICszMyw3IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAogc3RhdGljIHY4OjpMb2NhbDx2ODo6U3Ry
aW5nPiBtYWtlRXh0ZXJuYWxTdHJpbmcoY29uc3QgU3RyaW5nJiBzdHJpbmcpCiB7Ci0gICAgaWYg
KHN0cmluZy5pczhCaXQoKSAmJiBzdHJpbmcuY29udGFpbnNPbmx5QVNDSUkoKSkgewotICAgICAg
ICBXZWJDb3JlU3RyaW5nUmVzb3VyY2U4KiBzdHJpbmdSZXNvdXJjZSA9IG5ldyBXZWJDb3JlU3Ry
aW5nUmVzb3VyY2U4KHN0cmluZyk7Ci0gICAgICAgIHY4OjpMb2NhbDx2ODo6U3RyaW5nPiBuZXdT
dHJpbmcgPSB2ODo6U3RyaW5nOjpOZXdFeHRlcm5hbChzdHJpbmdSZXNvdXJjZSk7Ci0gICAgICAg
IGlmIChuZXdTdHJpbmcuSXNFbXB0eSgpKQotICAgICAgICAgICAgZGVsZXRlIHN0cmluZ1Jlc291
cmNlOwotICAgICAgICByZXR1cm4gbmV3U3RyaW5nOwotICAgIH0KLQotICAgIFdlYkNvcmVTdHJp
bmdSZXNvdXJjZTE2KiBzdHJpbmdSZXNvdXJjZSA9IG5ldyBXZWJDb3JlU3RyaW5nUmVzb3VyY2Ux
NihzdHJpbmcpOworICAgIFdlYkNvcmVTdHJpbmdSZXNvdXJjZSogc3RyaW5nUmVzb3VyY2UgPSBu
ZXcgV2ViQ29yZVN0cmluZ1Jlc291cmNlKHN0cmluZyk7CiAgICAgdjg6OkxvY2FsPHY4OjpTdHJp
bmc+IG5ld1N0cmluZyA9IHY4OjpTdHJpbmc6Ok5ld0V4dGVybmFsKHN0cmluZ1Jlc291cmNlKTsK
ICAgICBpZiAobmV3U3RyaW5nLklzRW1wdHkoKSkKICAgICAgICAgZGVsZXRlIHN0cmluZ1Jlc291
cmNlOwpAQCAtMTAwLDE4ICs5Miw3IEBAIHY4OjpMb2NhbDx2ODo6U3RyaW5nPiBTdHJpbmdDYWNo
ZTo6djhFeHRlcm5hbFN0cmluZ1Nsb3coU3RyaW5nSW1wbCogc3RyaW5nSW1wbCwKICAgICByZXR1
cm4gbmV3U3RyaW5nOwogfQogCi1XZWJDb3JlU3RyaW5nUmVzb3VyY2VCYXNlKiBXZWJDb3JlU3Ry
aW5nUmVzb3VyY2VCYXNlOjp0b1dlYkNvcmVTdHJpbmdSZXNvdXJjZUJhc2Uodjg6OkhhbmRsZTx2
ODo6U3RyaW5nPiBzdHJpbmcpCi17Ci0gICAgdjg6OlN0cmluZzo6RW5jb2RpbmcgZW5jb2Rpbmc7
Ci0gICAgdjg6OlN0cmluZzo6RXh0ZXJuYWxTdHJpbmdSZXNvdXJjZUJhc2UqIHJlc291cmNlID0g
c3RyaW5nLT5HZXRFeHRlcm5hbFN0cmluZ1Jlc291cmNlQmFzZSgmZW5jb2RpbmcpOwotICAgIGlm
ICghcmVzb3VyY2UpCi0gICAgICAgIHJldHVybiAwOwotICAgIGlmIChlbmNvZGluZyA9PSB2ODo6
U3RyaW5nOjpBU0NJSV9FTkNPRElORykKLSAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PFdlYkNv
cmVTdHJpbmdSZXNvdXJjZTgqPihyZXNvdXJjZSk7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PFdl
YkNvcmVTdHJpbmdSZXNvdXJjZTE2Kj4ocmVzb3VyY2UpOwotfQotCi12b2lkIFdlYkNvcmVTdHJp
bmdSZXNvdXJjZUJhc2U6OnZpc2l0U3RyaW5ncyhFeHRlcm5hbFN0cmluZ1Zpc2l0b3IqIHZpc2l0
b3IpCit2b2lkIFdlYkNvcmVTdHJpbmdSZXNvdXJjZTo6dmlzaXRTdHJpbmdzKEV4dGVybmFsU3Ry
aW5nVmlzaXRvciogdmlzaXRvcikKIHsKICAgICB2aXNpdG9yLT52aXNpdEpTRXh0ZXJuYWxTdHJp
bmcobV9wbGFpblN0cmluZy5pbXBsKCkpOwogICAgIGlmIChtX3BsYWluU3RyaW5nLmltcGwoKSAh
PSBtX2F0b21pY1N0cmluZy5pbXBsKCkgJiYgIW1fYXRvbWljU3RyaW5nLmlzTnVsbCgpKQpkaWZm
IC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvYmluZGluZ3MvdjgvVjhWYWx1ZUNhY2hlLmggYi9Tb3Vy
Y2UvV2ViQ29yZS9iaW5kaW5ncy92OC9WOFZhbHVlQ2FjaGUuaAppbmRleCBjMjhkNTQyM2EyMGE4
N2U5ODU3NDJkNjIyMTkwZmZkYTQ2NDViMzJhLi42NzFmNjhkZDQyY2E0MDMxZWNjYWVkY2ZkMzM4
ZDM3YjcwOTkzNTZiIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9iaW5kaW5ncy92OC9WOFZh
bHVlQ2FjaGUuaAorKysgYi9Tb3VyY2UvV2ViQ29yZS9iaW5kaW5ncy92OC9WOFZhbHVlQ2FjaGUu
aApAQCAtNzIsMjEgKzcyLDE5IEBAIGNvbnN0IGludCBudW1iZXJPZkNhY2hlZFNtYWxsSW50ZWdl
cnMgPSA2NDsKIAogLy8gV2ViQ29yZVN0cmluZ1Jlc291cmNlIGlzIGEgaGVscGVyIGNsYXNzIGZv
ciB2OEV4dGVybmFsU3RyaW5nLiBJdCBpcyB1c2VkCiAvLyB0byBtYW5hZ2UgdGhlIGxpZmUtY3lj
bGUgb2YgdGhlIHVuZGVybHlpbmcgYnVmZmVyIG9mIHRoZSBleHRlcm5hbCBzdHJpbmcuCi1jbGFz
cyBXZWJDb3JlU3RyaW5nUmVzb3VyY2VCYXNlIHsKK2NsYXNzIFdlYkNvcmVTdHJpbmdSZXNvdXJj
ZSA6IHB1YmxpYyB2ODo6U3RyaW5nOjpFeHRlcm5hbFN0cmluZ1Jlc291cmNlIHsKIHB1YmxpYzoK
LSAgICBzdGF0aWMgV2ViQ29yZVN0cmluZ1Jlc291cmNlQmFzZSogdG9XZWJDb3JlU3RyaW5nUmVz
b3VyY2VCYXNlKHY4OjpIYW5kbGU8djg6OlN0cmluZz4pOwotCi0gICAgZXhwbGljaXQgV2ViQ29y
ZVN0cmluZ1Jlc291cmNlQmFzZShjb25zdCBTdHJpbmcmIHN0cmluZykKKyAgICBleHBsaWNpdCBX
ZWJDb3JlU3RyaW5nUmVzb3VyY2UoY29uc3QgU3RyaW5nJiBzdHJpbmcpCiAgICAgICAgIDogbV9w
bGFpblN0cmluZyhzdHJpbmcpCiAgICAgewogI2lmbmRlZiBOREVCVUcKICAgICAgICAgbV90aHJl
YWRJZCA9IFdURjo6Y3VycmVudFRocmVhZCgpOwogI2VuZGlmCiAgICAgICAgIEFTU0VSVCghc3Ry
aW5nLmlzTnVsbCgpKTsKLSAgICAgICAgdjg6OlY4OjpBZGp1c3RBbW91bnRPZkV4dGVybmFsQWxs
b2NhdGVkTWVtb3J5KG1lbW9yeUNvbnN1bXB0aW9uKHN0cmluZykpOworICAgICAgICB2ODo6Vjg6
OkFkanVzdEFtb3VudE9mRXh0ZXJuYWxBbGxvY2F0ZWRNZW1vcnkoMiAqIHN0cmluZy5sZW5ndGgo
KSk7CiAgICAgfQogCi0gICAgZXhwbGljaXQgV2ViQ29yZVN0cmluZ1Jlc291cmNlQmFzZShjb25z
dCBBdG9taWNTdHJpbmcmIHN0cmluZykKKyAgICBleHBsaWNpdCBXZWJDb3JlU3RyaW5nUmVzb3Vy
Y2UoY29uc3QgQXRvbWljU3RyaW5nJiBzdHJpbmcpCiAgICAgICAgIDogbV9wbGFpblN0cmluZyhz
dHJpbmcuc3RyaW5nKCkpCiAgICAgICAgICwgbV9hdG9taWNTdHJpbmcoc3RyaW5nKQogICAgIHsK
QEAgLTk0LDIwICs5MiwyNyBAQCBwdWJsaWM6CiAgICAgICAgIG1fdGhyZWFkSWQgPSBXVEY6OmN1
cnJlbnRUaHJlYWQoKTsKICNlbmRpZgogICAgICAgICBBU1NFUlQoIXN0cmluZy5pc051bGwoKSk7
Ci0gICAgICAgIHY4OjpWODo6QWRqdXN0QW1vdW50T2ZFeHRlcm5hbEFsbG9jYXRlZE1lbW9yeSht
ZW1vcnlDb25zdW1wdGlvbihzdHJpbmcpKTsKKyAgICAgICAgdjg6OlY4OjpBZGp1c3RBbW91bnRP
ZkV4dGVybmFsQWxsb2NhdGVkTWVtb3J5KDIgKiBzdHJpbmcubGVuZ3RoKCkpOwogICAgIH0KIAot
ICAgIHZpcnR1YWwgfldlYkNvcmVTdHJpbmdSZXNvdXJjZUJhc2UoKQorICAgIHZpcnR1YWwgfldl
YkNvcmVTdHJpbmdSZXNvdXJjZSgpCiAgICAgewogI2lmbmRlZiBOREVCVUcKICAgICAgICAgQVNT
RVJUKG1fdGhyZWFkSWQgPT0gV1RGOjpjdXJyZW50VGhyZWFkKCkpOwogI2VuZGlmCi0gICAgICAg
IGludCByZWR1Y2VkRXh0ZXJuYWxNZW1vcnkgPSAtbWVtb3J5Q29uc3VtcHRpb24obV9wbGFpblN0
cmluZyk7CisgICAgICAgIGludCByZWR1Y2VkRXh0ZXJuYWxNZW1vcnkgPSAtMiAqIG1fcGxhaW5T
dHJpbmcubGVuZ3RoKCk7CiAgICAgICAgIGlmIChtX3BsYWluU3RyaW5nLmltcGwoKSAhPSBtX2F0
b21pY1N0cmluZy5pbXBsKCkgJiYgIW1fYXRvbWljU3RyaW5nLmlzTnVsbCgpKQotICAgICAgICAg
ICAgcmVkdWNlZEV4dGVybmFsTWVtb3J5IC09IG1lbW9yeUNvbnN1bXB0aW9uKG1fYXRvbWljU3Ry
aW5nLnN0cmluZygpKTsKKyAgICAgICAgICAgIHJlZHVjZWRFeHRlcm5hbE1lbW9yeSAqPSAyOwog
ICAgICAgICB2ODo6Vjg6OkFkanVzdEFtb3VudE9mRXh0ZXJuYWxBbGxvY2F0ZWRNZW1vcnkocmVk
dWNlZEV4dGVybmFsTWVtb3J5KTsKICAgICB9CiAKKyAgICB2aXJ0dWFsIGNvbnN0IHVpbnQxNl90
KiBkYXRhKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGNv
bnN0IHVpbnQxNl90Kj4obV9wbGFpblN0cmluZy5pbXBsKCktPmNoYXJhY3RlcnMoKSk7CisgICAg
fQorCisgICAgdmlydHVhbCBzaXplX3QgbGVuZ3RoKCkgY29uc3QgeyByZXR1cm4gbV9wbGFpblN0
cmluZy5pbXBsKCktPmxlbmd0aCgpOyB9CisKICAgICBjb25zdCBTdHJpbmcmIHdlYmNvcmVTdHJp
bmcoKSB7IHJldHVybiBtX3BsYWluU3RyaW5nOyB9CiAKICAgICBjb25zdCBBdG9taWNTdHJpbmcm
IGF0b21pY1N0cmluZygpCkBAIC0xMTksMTQgKzEyNCwxOSBAQCBwdWJsaWM6CiAgICAgICAgICAg
ICBtX2F0b21pY1N0cmluZyA9IEF0b21pY1N0cmluZyhtX3BsYWluU3RyaW5nKTsKICAgICAgICAg
ICAgIEFTU0VSVCghbV9hdG9taWNTdHJpbmcuaXNOdWxsKCkpOwogICAgICAgICAgICAgaWYgKG1f
cGxhaW5TdHJpbmcuaW1wbCgpICE9IG1fYXRvbWljU3RyaW5nLmltcGwoKSkKLSAgICAgICAgICAg
ICAgICB2ODo6Vjg6OkFkanVzdEFtb3VudE9mRXh0ZXJuYWxBbGxvY2F0ZWRNZW1vcnkobWVtb3J5
Q29uc3VtcHRpb24obV9hdG9taWNTdHJpbmcuc3RyaW5nKCkpKTsKKyAgICAgICAgICAgICAgICB2
ODo6Vjg6OkFkanVzdEFtb3VudE9mRXh0ZXJuYWxBbGxvY2F0ZWRNZW1vcnkoMiAqIG1fYXRvbWlj
U3RyaW5nLmxlbmd0aCgpKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gbV9hdG9taWNTdHJp
bmc7CiAgICAgfQogCiAgICAgdm9pZCB2aXNpdFN0cmluZ3MoRXh0ZXJuYWxTdHJpbmdWaXNpdG9y
Kik7CiAKLXByb3RlY3RlZDoKKyAgICBzdGF0aWMgV2ViQ29yZVN0cmluZ1Jlc291cmNlKiB0b1N0
cmluZ1Jlc291cmNlKHY4OjpIYW5kbGU8djg6OlN0cmluZz4gdjhTdHJpbmcpCisgICAgeworICAg
ICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8V2ViQ29yZVN0cmluZ1Jlc291cmNlKj4odjhTdHJpbmct
PkdldEV4dGVybmFsU3RyaW5nUmVzb3VyY2UoKSk7CisgICAgfQorCitwcml2YXRlOgogICAgIC8v
IEEgc2hhbGxvdyBjb3B5IG9mIHRoZSBzdHJpbmcuIEtlZXBzIHRoZSBzdHJpbmcgYnVmZmVyIGFs
aXZlIHVudGlsIHRoZSBWOCBlbmdpbmUgZ2FyYmFnZSBjb2xsZWN0cyBpdC4KICAgICBTdHJpbmcg
bV9wbGFpblN0cmluZzsKICAgICAvLyBJZiB0aGlzIHN0cmluZyBpcyBhdG9taWMgb3IgaGFzIGJl
ZW4gbWFkZSBhdG9taWMgZWFybGllciB0aGUKQEAgLTEzNiw0MCArMTQ2LDExIEBAIHByb3RlY3Rl
ZDoKICAgICAvLyBpbnRvIHRoYXQgc3RyaW5nLgogICAgIEF0b21pY1N0cmluZyBtX2F0b21pY1N0
cmluZzsKIAotcHJpdmF0ZToKLSAgICBzdGF0aWMgaW50IG1lbW9yeUNvbnN1bXB0aW9uKGNvbnN0
IFN0cmluZyYgc3RyaW5nKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHN0cmluZy5sZW5ndGgoKSAq
IChzdHJpbmcuaXM4Qml0KCkgPyBzaXplb2YoTENoYXIpIDogc2l6ZW9mKFVDaGFyKSk7Ci0gICAg
fQogI2lmbmRlZiBOREVCVUcKICAgICBXVEY6OlRocmVhZElkZW50aWZpZXIgbV90aHJlYWRJZDsK
ICNlbmRpZgogfTsKIAotY2xhc3MgV2ViQ29yZVN0cmluZ1Jlc291cmNlMTYgOiBwdWJsaWMgV2Vi
Q29yZVN0cmluZ1Jlc291cmNlQmFzZSwgcHVibGljIHY4OjpTdHJpbmc6OkV4dGVybmFsU3RyaW5n
UmVzb3VyY2UgewotcHVibGljOgotICAgIGV4cGxpY2l0IFdlYkNvcmVTdHJpbmdSZXNvdXJjZTE2
KGNvbnN0IFN0cmluZyYgc3RyaW5nKSA6IFdlYkNvcmVTdHJpbmdSZXNvdXJjZUJhc2Uoc3RyaW5n
KSB7IH0KLSAgICBleHBsaWNpdCBXZWJDb3JlU3RyaW5nUmVzb3VyY2UxNihjb25zdCBBdG9taWNT
dHJpbmcmIHN0cmluZykgOiBXZWJDb3JlU3RyaW5nUmVzb3VyY2VCYXNlKHN0cmluZykgeyB9Ci0K
LSAgICB2aXJ0dWFsIHNpemVfdCBsZW5ndGgoKSBjb25zdCBPVkVSUklERSB7IHJldHVybiBtX3Bs
YWluU3RyaW5nLmltcGwoKS0+bGVuZ3RoKCk7IH0KLSAgICB2aXJ0dWFsIGNvbnN0IHVpbnQxNl90
KiBkYXRhKCkgY29uc3QgT1ZFUlJJREUKLSAgICB7Ci0gICAgICAgIHJldHVybiByZWludGVycHJl
dF9jYXN0PGNvbnN0IHVpbnQxNl90Kj4obV9wbGFpblN0cmluZy5pbXBsKCktPmNoYXJhY3RlcnMo
KSk7Ci0gICAgfQotfTsKLQotY2xhc3MgV2ViQ29yZVN0cmluZ1Jlc291cmNlOCA6IHB1YmxpYyBX
ZWJDb3JlU3RyaW5nUmVzb3VyY2VCYXNlLCBwdWJsaWMgdjg6OlN0cmluZzo6RXh0ZXJuYWxBc2Np
aVN0cmluZ1Jlc291cmNlIHsKLXB1YmxpYzoKLSAgICBleHBsaWNpdCBXZWJDb3JlU3RyaW5nUmVz
b3VyY2U4KGNvbnN0IFN0cmluZyYgc3RyaW5nKSA6IFdlYkNvcmVTdHJpbmdSZXNvdXJjZUJhc2Uo
c3RyaW5nKSB7IH0KLSAgICBleHBsaWNpdCBXZWJDb3JlU3RyaW5nUmVzb3VyY2U4KGNvbnN0IEF0
b21pY1N0cmluZyYgc3RyaW5nKSA6IFdlYkNvcmVTdHJpbmdSZXNvdXJjZUJhc2Uoc3RyaW5nKSB7
IH0KLQotICAgIHZpcnR1YWwgc2l6ZV90IGxlbmd0aCgpIGNvbnN0IE9WRVJSSURFIHsgcmV0dXJu
IG1fcGxhaW5TdHJpbmcuaW1wbCgpLT5sZW5ndGgoKTsgfQotICAgIHZpcnR1YWwgY29uc3QgY2hh
ciogZGF0YSgpIGNvbnN0IE9WRVJSSURFCi0gICAgewotICAgICAgICByZXR1cm4gcmVpbnRlcnBy
ZXRfY2FzdDxjb25zdCBjaGFyKj4obV9wbGFpblN0cmluZy5pbXBsKCktPmNoYXJhY3RlcnM4KCkp
OwotICAgIH0KLX07Ci0KIGNsYXNzIEludGVnZXJDYWNoZSB7CiBwdWJsaWM6CiAgICAgIEludGVn
ZXJDYWNoZSgpIDogbV9pbml0aWFsaXplZChmYWxzZSkgeyB9Owo=
</data>

          </attachment>
      

    </bug>

</bugzilla>