<?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>15585</bug_id>
          
          <creation_ts>2007-10-20 19:14:18 -0700</creation_ts>
          <short_desc>speed up sparse arrays by using a custom map</short_desc>
          <delta_ts>2007-10-21 13:26:51 -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>JavaScriptCore</component>
          <version>523.x (Safari 3)</version>
          <rep_platform>Mac</rep_platform>
          <op_sys>OS X 10.4</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>Enhancement</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Darin Adler">darin</reporter>
          <assigned_to name="Darin Adler">darin</assigned_to>
          <cc>mjs</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>58952</commentid>
    <comment_count>0</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2007-10-20 19:14:18 -0700</bug_when>
    <thetext>We can speed up SunSpider 10% by making our sparse array support use an integer-based map instead of converting everything to and from strings.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>58955</commentid>
    <comment_count>1</comment_count>
      <attachid>16754</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2007-10-20 19:29:34 -0700</bug_when>
    <thetext>Created attachment 16754
patch with change log</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>58996</commentid>
    <comment_count>2</comment_count>
      <attachid>16754</attachid>
    <who name="Maciej Stachowiak">mjs</who>
    <bug_when>2007-10-21 03:10:28 -0700</bug_when>
    <thetext>Comment on attachment 16754
patch with change log

The code looks good and the speed gain looks good so I&apos;m saying r=me.

However, I don&apos;t think any of the current SunSpider test cases create true sparse arrays. What&apos;s happening is that they are making dense arrays which are bigger than our arbitrary sparse array cutoff. I think we should pick the storage strategy based on some measure of the density ratio of the array. In particular, if the array has even a quarter of its slots filled, then the direct storage is more space-efficient than the overflow map. Indeed it is probably good to use the dense storage at even as low as 1/8 of slots filled. We should consider extending storage length so long as this density ratio is maintained, and perhaps even be able to switch from the overflow map back to direct array access (and maybe vice versa) at some thresholds of density change. Would you be interested in that as a follow-up? I bet it would help even more on the two sunspider tests that are definitely hitting the sparse array threshold, 3d-morph and access-nsieve.

(Eventually we might have test cases that really do call for a sparse array - at that point it might be worth doing a more space-efficient implementation like the sparsetable class from Google&apos;s sparse_hash implementation: http://google-sparsehash.googlecode.com/svn/trunk/doc/sparsetable.html</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>59001</commentid>
    <comment_count>3</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2007-10-21 08:21:57 -0700</bug_when>
    <thetext>(In reply to comment #2)
&gt; if the array has even a quarter of its slots filled, then the
&gt; direct storage is more space-efficient than the overflow map. Indeed it is
&gt; probably good to use the dense storage at even as low as 1/8 of slots filled.
&gt; We should consider extending storage length so long as this density ratio is
&gt; maintained, and perhaps even be able to switch from the overflow map back to
&gt; direct array access (and maybe vice versa) at some thresholds of density
&gt; change. Would you be interested in that as a follow-up?

Yes, I&apos;ll do that now.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>59002</commentid>
    <comment_count>4</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2007-10-21 08:25:32 -0700</bug_when>
    <thetext>Committed revision 26847.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>59010</commentid>
    <comment_count>5</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2007-10-21 10:09:02 -0700</bug_when>
    <thetext>(In reply to comment #2)
&gt; perhaps even be able to switch from the overflow map back to
&gt; direct array access (and maybe vice versa) at some thresholds of density
&gt; change

I started implementing, and I found that this part is quite difficult. Keeping enough information about the sparse attributes so that we can consider their density is extremely challenging.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>59026</commentid>
    <comment_count>6</comment_count>
    <who name="Maciej Stachowiak">mjs</who>
    <bug_when>2007-10-21 12:39:07 -0700</bug_when>
    <thetext>(In reply to comment #5)
&gt; (In reply to comment #2)
&gt; &gt; perhaps even be able to switch from the overflow map back to
&gt; &gt; direct array access (and maybe vice versa) at some thresholds of density
&gt; &gt; change
&gt; 
&gt; I started implementing, and I found that this part is quite difficult. Keeping
&gt; enough information about the sparse attributes so that we can consider their
&gt; density is extremely challenging.
&gt; 

If you do the relatively simple thing and only track density from 0, and not some subrange from current lowest element, the information you need to determine the density is the array length, and a count of attributes that are not currently undefined, which means increase the count each time an array slot is set when it wasn&apos;t already, and decrease the count when an existing array property is deleted or set to undefined. I think.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>59030</commentid>
    <comment_count>7</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2007-10-21 12:56:04 -0700</bug_when>
    <thetext>(In reply to comment #6)
&gt; If you do the relatively simple thing and only track density from 0, and not
&gt; some subrange from current lowest element, the information you need to
&gt; determine the density is the array length, and a count of attributes that are
&gt; not currently undefined, which means increase the count each time an array slot
&gt; is set when it wasn&apos;t already, and decrease the count when an existing array
&gt; property is deleted or set to undefined. I think.

Yes, I figured out that part.

(Although my reading of the spec indicates that having a value of &quot;undefined&quot; is distinct from not having a value at all.)

You can take a look at my attempt at this and critique the details soon.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>59032</commentid>
    <comment_count>8</comment_count>
    <who name="Maciej Stachowiak">mjs</who>
    <bug_when>2007-10-21 13:26:51 -0700</bug_when>
    <thetext>(In reply to comment #7)
&gt; (In reply to comment #6)
&gt; &gt; If you do the relatively simple thing and only track density from 0, and not
&gt; &gt; some subrange from current lowest element, the information you need to
&gt; &gt; determine the density is the array length, and a count of attributes that are
&gt; &gt; not currently undefined, which means increase the count each time an array slot
&gt; &gt; is set when it wasn&apos;t already, and decrease the count when an existing array
&gt; &gt; property is deleted or set to undefined. I think.
&gt; 
&gt; Yes, I figured out that part.
&gt; 
&gt; (Although my reading of the spec indicates that having a value of &quot;undefined&quot;
&gt; is distinct from not having a value at all.)
&gt; 
&gt; You can take a look at my attempt at this and critique the details soon.
&gt; 

In most cases that is true, but in the case of arrays I believe that every value less than the current array length is always considered to exist and is just undefined if deleted or never set. (I did not double check the spec though).
</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>16754</attachid>
            <date>2007-10-20 19:29:34 -0700</date>
            <delta_ts>2007-10-21 03:10:28 -0700</delta_ts>
            <desc>patch with change log</desc>
            <filename>BigArrayPatch.txt</filename>
            <type>text/plain</type>
            <size>16284</size>
            <attacher name="Darin Adler">darin</attacher>
            
              <data encoding="base64">SW5kZXg6IEphdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDI2ODM2KQorKysgSmF2YVNjcmlwdENvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMzkgQEAKKzIwMDctMTAtMjAgIERhcmluIEFk
bGVyICA8ZGFyaW5AYXBwbGUuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09Q
UyEpLgorCisgICAgICAgIC0gaHR0cDovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9
MTU1ODUKKyAgICAgICAgICBzcGVlZCB1cCBzcGFyc2UgYXJyYXlzIGJ5IHVzaW5nIGEgY3VzdG9t
IG1hcAorICAgIAorICAgICAgICBTcGVlZHMgdXAgU3VuU3BpZGVyIGJ5IDEwJS4KKworICAgICAg
ICAqIGtqcy9hcnJheV9vYmplY3QuY3BwOgorICAgICAgICAoYWxsb2NhdGVTdG9yYWdlKTogTGVh
dmUgcm9vbSBmb3IgYW4gYWRkaXRpb25hbCBwb2ludGVyLgorICAgICAgICAocmVhbGxvY2F0ZVN0
b3JhZ2UpOiBEaXR0by4KKyAgICAgICAgKGZyZWVTdG9yYWdlKTogRGl0dG8uCisgICAgICAgIChB
cnJheUluc3RhbmNlOjp+QXJyYXlJbnN0YW5jZSk6IERlbGV0ZSB0aGUgb3ZlcmZsb3cgbWFwIGlm
IHByZXNlbnQuCisgICAgICAgIChBcnJheUluc3RhbmNlOjpnZXRJdGVtKTogUmVhZCB2YWx1ZXMg
ZnJvbSB0aGUgb3ZlcmZsb3cgbWFwIGlmIHByZXNlbnQuCisgICAgICAgIFJlbW92ZWQgdGhlIGNo
ZWNrIG9mIGxlbmd0aCwgc2luY2UgaXQgc2xvd3MgZG93biB0aGUgY29tbW9uIGNhc2UuCisgICAg
ICAgIChBcnJheUluc3RhbmNlOjpnZXRPd25Qcm9wZXJ0eVNsb3QpOiBEaXR0by4gQWxzbyByZW1v
dmVkIHRoZSBmYWxsYmFjaworICAgICAgICB0byB0aGUgcHJvcGVydHkgbWFwLgorICAgICAgICAo
QXJyYXlJbnN0YW5jZTo6cHV0KTogV3JpdGUgdmFsdWVzIGludG8gdGhlIG92ZXJmbG93IG1hcCBh
cyBuZWVkZWQuCisgICAgICAgIEFsc28gY3JlYXRlIG92ZXJmbG93IG1hcCB3aGVuIG5lZWRlZC4K
KyAgICAgICAgKEFycmF5SW5zdGFuY2U6OmRlbGV0ZVByb3BlcnR5KTogUmVtb3ZlIHZhbHVlcyBm
cm9tIHRoZSBvdmVyZmxvdyBtYXAKKyAgICAgICAgYXMgYXBwcm9wcmlhdGUuCisgICAgICAgIChB
cnJheUluc3RhbmNlOjpnZXRQcm9wZXJ0eU5hbWVzKTogQWRkIGEgbmFtZSBmb3IgZWFjaCBpZGVu
dGlmaWVyIGluCisgICAgICAgIHRoZSBwcm9wZXJ0eSBtYXAuIFRoaXMgaXMgZXh0cmVtZWx5IGlu
ZWZmaWNpZW50LgorICAgICAgICAoQXJyYXlJbnN0YW5jZTo6c2V0TGVuZ3RoKTogUmVtb3ZlIGFu
eSB2YWx1ZXMgaW4gdGhlIG92ZXJmbG93IG1hcAorICAgICAgICB0aGF0IGFyZSBwYXN0IHRoZSBu
ZXcgbGVuZ3RoLCBhcyB3ZSBmb3JtZXJseSBkaWQgd2l0aCB0aGUgcHJvcGVydHkgbWFwLgorICAg
ICAgICAoQXJyYXlJbnN0YW5jZTo6bWFyayk6IE1hcmsgYW55IHZhbHVlcyBpbiB0aGUgb3ZlcmZs
b3cgbWFwLgorICAgICAgICAoY29tcGFyZUJ5U3RyaW5nRm9yUVNvcnQpOiBSZW1vdmVkIHVubmVl
ZGVkIHVuZGVmaW5lZCBjYXNlLCBzaW5jZQorICAgICAgICBjb21wYWN0Rm9yU29ydGluZyBndWFy
YW50ZWVzIHdlIHdpbGwgaGF2ZSBubyB1bmRlZmluZWQgdmFsdWVzLgorICAgICAgICAoY29tcGFy
ZVdpdGhDb21wYXJlRnVuY3Rpb25Gb3JRU29ydCk6IERpdHRvLgorICAgICAgICAoQXJyYXlJbnN0
YW5jZTo6Y29tcGFjdEZvclNvcnRpbmcpOiBDb3B5IGFsbCB0aGUgdmFsdWVzIG91dCBvZiB0aGUK
KyAgICAgICAgb3ZlcmZsb3cgbWFwIGFuZCBkZXN0cm95IGl0LgorCisgICAgICAgICoga2pzL3By
b3BlcnR5X21hcC5oOiBSZW1vdmVkIG5vdy11bnVzZWQgZ2V0U3BhcnNlQXJyYXlQcm9wZXJ0eU5h
bWVzLgorICAgICAgICAqIGtqcy9wcm9wZXJ0eV9tYXAuY3BwOiBEaXR0by4KKwogMjAwNy0xMC0y
MCAgRGFyaW4gQWRsZXIgIDxkYXJpbkBhcHBsZS5jb20+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkg
TWFjaWVqLgpJbmRleDogSmF2YVNjcmlwdENvcmUva2pzL2FycmF5X29iamVjdC5jcHAKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gSmF2YVNjcmlwdENvcmUva2pzL2FycmF5X29iamVjdC5jcHAJKHJldmlzaW9uIDI2
ODM2KQorKysgSmF2YVNjcmlwdENvcmUva2pzL2FycmF5X29iamVjdC5jcHAJKHdvcmtpbmcgY29w
eSkKQEAgLTM1LDcgKzM1LDE0IEBACiAjaW5jbHVkZSA8d3RmL0hhc2hTZXQuaD4KIAogCi11c2lu
ZyBuYW1lc3BhY2UgS0pTOworbmFtZXNwYWNlIEtKUyB7CisKK3R5cGVkZWYgSGFzaE1hcDx1bnNp
Z25lZCwgSlNWYWx1ZSo+IE92ZXJmbG93TWFwOworCitzdGF0aWMgaW5saW5lIE92ZXJmbG93TWFw
KiBvdmVyZmxvd01hcChKU1ZhbHVlKiogc3RvcmFnZSkKK3sKKyAgICByZXR1cm4gc3RvcmFnZSA/
IHJlaW50ZXJwcmV0X2Nhc3Q8T3ZlcmZsb3dNYXAqPihzdG9yYWdlWy0yXSkgOiAwOworfQogCiAv
LyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQXJyYXlJbnN0YW5jZSAtLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLQogCkBAIC00OCw4ICs1NSw4IEBAIHN0YXRpYyBpbmxpbmUgSlNW
YWx1ZSoqIGFsbG9jYXRlU3RvcmFnZSgKICAgaWYgKGNhcGFjaXR5ID09IDApCiAgICAgICByZXR1
cm4gMDsKIAotICAvLyBzdG9yZSBjYXBhY2l0eSBpbiBleHRyYSBzcGFjZSBiZWZvcmUgdGhlIGJl
Z2lubmluZyBvZiB0aGUgc3RvcmFnZSBhcnJheSB0byBzYXZlIHNwYWNlCi0gIEpTVmFsdWUqKiBz
dG9yYWdlID0gc3RhdGljX2Nhc3Q8SlNWYWx1ZSoqPihmYXN0Q2FsbG9jKGNhcGFjaXR5ICsgMSwg
c2l6ZW9mKEpTVmFsdWUgKikpKSArIDE7CisgIC8vIHN0b3JlIGNhcGFjaXR5IGFuZCBvdmVyZmxv
dyBtYXAgaW4gZXh0cmEgc3BhY2UgYmVmb3JlIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHN0b3JhZ2Ug
YXJyYXkgdG8gc2F2ZSBzcGFjZQorICBKU1ZhbHVlKiogc3RvcmFnZSA9IHN0YXRpY19jYXN0PEpT
VmFsdWUqKj4oZmFzdENhbGxvYyhjYXBhY2l0eSArIDIsIHNpemVvZihKU1ZhbHVlICopKSkgKyAy
OwogICBzdG9yYWdlWy0xXSA9IHJlaW50ZXJwcmV0X2Nhc3Q8SlNWYWx1ZSo+KGNhcGFjaXR5KTsK
ICAgcmV0dXJuIHN0b3JhZ2U7CiB9CkBAIC01NywxOSArNjQsMTggQEAgc3RhdGljIGlubGluZSBK
U1ZhbHVlKiogYWxsb2NhdGVTdG9yYWdlKAogc3RhdGljIGlubGluZSB2b2lkIHJlYWxsb2NhdGVT
dG9yYWdlKEpTVmFsdWUqKiYgc3RvcmFnZSwgc2l6ZV90IG5ld0NhcGFjaXR5KQogewogICBpZiAo
IXN0b3JhZ2UpIHsKLSAgICBzdG9yYWdlID0gIGFsbG9jYXRlU3RvcmFnZShuZXdDYXBhY2l0eSk7
CisgICAgc3RvcmFnZSA9IGFsbG9jYXRlU3RvcmFnZShuZXdDYXBhY2l0eSk7CiAgICAgcmV0dXJu
OwogICB9CiAKLSAgLy8gc3RvcmUgY2FwYWNpdHkgaW4gZXh0cmEgc3BhY2UgYmVmb3JlIHRoZSBi
ZWdpbm5pbmcgb2YgdGhlIHN0b3JhZ2UgYXJyYXkgdG8gc2F2ZSBzcGFjZQotICBzdG9yYWdlID0g
c3RhdGljX2Nhc3Q8SlNWYWx1ZSoqPihmYXN0UmVhbGxvYyhzdG9yYWdlIC0gMSwgKG5ld0NhcGFj
aXR5ICsgMSkgKiBzaXplb2YgKEpTVmFsdWUqKSkpICsgMTsKKyAgLy8gc3RvcmUgY2FwYWNpdHkg
YW5kIG92ZXJmbG93IG1hcCBpbiBleHRyYSBzcGFjZSBiZWZvcmUgdGhlIGJlZ2lubmluZyBvZiB0
aGUgc3RvcmFnZSBhcnJheSB0byBzYXZlIHNwYWNlCisgIHN0b3JhZ2UgPSBzdGF0aWNfY2FzdDxK
U1ZhbHVlKio+KGZhc3RSZWFsbG9jKHN0b3JhZ2UgLSAyLCAobmV3Q2FwYWNpdHkgKyAyKSAqIHNp
emVvZiAoSlNWYWx1ZSopKSkgKyAyOwogICBzdG9yYWdlWy0xXSA9IHJlaW50ZXJwcmV0X2Nhc3Q8
SlNWYWx1ZSo+KG5ld0NhcGFjaXR5KTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGZyZWVTdG9y
YWdlKEpTVmFsdWUqKiBzdG9yYWdlKQogewotICBpZiAoc3RvcmFnZSkKLSAgICBmYXN0RnJlZShz
dG9yYWdlIC0gMSk7CisgIGZhc3RGcmVlKHN0b3JhZ2UgLSAyKTsKIH0KIAogQXJyYXlJbnN0YW5j
ZTo6QXJyYXlJbnN0YW5jZShKU09iamVjdCAqcHJvdG8sIHVuc2lnbmVkIGluaXRpYWxMZW5ndGgp
CkBAIC04OSwyOCArOTUsMzMgQEAgQXJyYXlJbnN0YW5jZTo6QXJyYXlJbnN0YW5jZShKU09iamVj
dCAqcAogewogICBMaXN0SXRlcmF0b3IgaXQgPSBsaXN0LmJlZ2luKCk7CiAgIHVuc2lnbmVkIGwg
PSBsZW5ndGg7Ci0gIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBsOyArK2kpIHsKKyAgZm9yICh1
bnNpZ25lZCBpID0gMDsgaSA8IGw7ICsraSkKICAgICBzdG9yYWdlW2ldID0gaXQrKzsKLSAgfQot
ICAvLyBXaGVuIHRoZSBhcnJheSBpcyBjcmVhdGVkIG5vbi1lbXB0eSBpdHMgY2VsbHMgYXJlIGZp
bGxlZCBzbyBpdCdzIHJlYWxseSBubyB3b3JzZSB0aGFuCisgIC8vIFdoZW4gdGhlIGFycmF5IGlz
IGNyZWF0ZWQgbm9uLWVtcHR5LCBpdHMgY2VsbHMgYXJlIGZpbGxlZCBzbyBpdCdzIHJlYWxseSBu
byB3b3JzZSB0aGFuCiAgIC8vIGEgcHJvcGVydHkgbWFwLiBUaGVyZWZvcmUgZG9uJ3QgcmVwb3J0
IGV4dHJhIG1lbW9yeSBjb3N0LgogfQogCiBBcnJheUluc3RhbmNlOjp+QXJyYXlJbnN0YW5jZSgp
CiB7Ci0gIGZyZWVTdG9yYWdlKHN0b3JhZ2UpOworICBpZiAoc3RvcmFnZSkgeworICAgIGRlbGV0
ZSByZWludGVycHJldF9jYXN0PE92ZXJmbG93TWFwKj4oc3RvcmFnZVstMl0pOworICAgIGZyZWVT
dG9yYWdlKHN0b3JhZ2UpOworICB9CiB9CiAKIEpTVmFsdWUqIEFycmF5SW5zdGFuY2U6OmdldEl0
ZW0odW5zaWduZWQgaSkgY29uc3QKIHsKLSAgICBpZiAoaSA+PSBsZW5ndGgpCisgICAgaWYgKGkg
PCBzdG9yYWdlTGVuZ3RoKSB7CisgICAgICAgIEpTVmFsdWUqIHZhbHVlID0gc3RvcmFnZVtpXTsK
KyAgICAgICAgcmV0dXJuIHZhbHVlID8gdmFsdWUgOiBqc1VuZGVmaW5lZCgpOworICAgIH0KKwor
ICAgIGNvbnN0IE92ZXJmbG93TWFwKiBvdmVyZmxvdyA9IG92ZXJmbG93TWFwKHN0b3JhZ2UpOwor
ICAgIGlmICghb3ZlcmZsb3cpCiAgICAgICAgIHJldHVybiBqc1VuZGVmaW5lZCgpOwotICAgIAot
ICAgIEpTVmFsdWUqIHZhbCA9IChpIDwgc3RvcmFnZUxlbmd0aCkgPyAKLSAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBzdG9yYWdlW2ldIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBn
ZXREaXJlY3QoSWRlbnRpZmllcjo6ZnJvbShpKSk7CiAKLSAgICByZXR1cm4gdmFsID8gdmFsIDog
anNVbmRlZmluZWQoKTsKKyAgICBKU1ZhbHVlKiB2YWx1ZSA9IG92ZXJmbG93LT5nZXQoaSk7Cisg
ICAgcmV0dXJuIHZhbHVlID8gdmFsdWUgOiBqc1VuZGVmaW5lZCgpOwogfQogCiBKU1ZhbHVlICpB
cnJheUluc3RhbmNlOjpsZW5ndGhHZXR0ZXIoRXhlY1N0YXRlKiwgSlNPYmplY3QqLCBjb25zdCBJ
ZGVudGlmaWVyJiwgY29uc3QgUHJvcGVydHlTbG90JiBzbG90KQpAQCAtMTI3LDI4ICsxMzgsMzAg
QEAgYm9vbCBBcnJheUluc3RhbmNlOjpnZXRPd25Qcm9wZXJ0eVNsb3QoRQogCiAgIGJvb2wgb2s7
CiAgIHVuc2lnbmVkIGluZGV4ID0gcHJvcGVydHlOYW1lLnRvQXJyYXlJbmRleCgmb2spOwotICBp
ZiAob2spIHsKLSAgICBpZiAoaW5kZXggPj0gbGVuZ3RoKQotICAgICAgcmV0dXJuIGZhbHNlOwot
ICAgIGlmIChpbmRleCA8IHN0b3JhZ2VMZW5ndGgpIHsKLSAgICAgIEpTVmFsdWUgKnYgPSBzdG9y
YWdlW2luZGV4XTsKLSAgICAgIGlmICghdikKLSAgICAgICAgcmV0dXJuIGZhbHNlOyAgICAgIAot
ICAgICAgc2xvdC5zZXRWYWx1ZVNsb3QodGhpcywgJnN0b3JhZ2VbaW5kZXhdKTsKLSAgICAgIHJl
dHVybiB0cnVlOwotICAgIH0KLSAgfQorICBpZiAoIW9rKQorICAgIHJldHVybiBKU09iamVjdDo6
Z2V0T3duUHJvcGVydHlTbG90KGV4ZWMsIHByb3BlcnR5TmFtZSwgc2xvdCk7CiAKLSAgcmV0dXJu
IEpTT2JqZWN0OjpnZXRPd25Qcm9wZXJ0eVNsb3QoZXhlYywgcHJvcGVydHlOYW1lLCBzbG90KTsK
KyAgaWYgKGluZGV4IDwgc3RvcmFnZUxlbmd0aCkgeworICAgIEpTVmFsdWUgKnYgPSBzdG9yYWdl
W2luZGV4XTsKKyAgICBpZiAoIXYpCisgICAgICByZXR1cm4gZmFsc2U7ICAgICAgCisgICAgc2xv
dC5zZXRWYWx1ZVNsb3QodGhpcywgJnN0b3JhZ2VbaW5kZXhdKTsKKyAgICByZXR1cm4gdHJ1ZTsK
KyAgfQorICBpZiAoaW5kZXggPiBNQVhfQVJSQVlfSU5ERVgpCisgICAgcmV0dXJuIEpTT2JqZWN0
OjpnZXRPd25Qcm9wZXJ0eVNsb3QoZXhlYywgcHJvcGVydHlOYW1lLCBzbG90KTsKKyAgT3ZlcmZs
b3dNYXAqIG92ZXJmbG93ID0gb3ZlcmZsb3dNYXAoc3RvcmFnZSk7CisgIGlmICghb3ZlcmZsb3cp
CisgICAgcmV0dXJuIGZhbHNlOworICBPdmVyZmxvd01hcDo6aXRlcmF0b3IgaXQgPSBvdmVyZmxv
dy0+ZmluZChpbmRleCk7CisgIGlmIChpdCA9PSBvdmVyZmxvdy0+ZW5kKCkpCisgICAgcmV0dXJu
IGZhbHNlOworICBzbG90LnNldFZhbHVlU2xvdCh0aGlzLCAmaXQtPnNlY29uZCk7CisgIHJldHVy
biB0cnVlOwogfQogCiBib29sIEFycmF5SW5zdGFuY2U6OmdldE93blByb3BlcnR5U2xvdChFeGVj
U3RhdGUgKmV4ZWMsIHVuc2lnbmVkIGluZGV4LCBQcm9wZXJ0eVNsb3QmIHNsb3QpCiB7Ci0gIGlm
IChpbmRleCA+IE1BWF9BUlJBWV9JTkRFWCkKLSAgICByZXR1cm4gZ2V0T3duUHJvcGVydHlTbG90
KGV4ZWMsIElkZW50aWZpZXI6OmZyb20oaW5kZXgpLCBzbG90KTsKLQotICBpZiAoaW5kZXggPj0g
bGVuZ3RoKQotICAgIHJldHVybiBmYWxzZTsKICAgaWYgKGluZGV4IDwgc3RvcmFnZUxlbmd0aCkg
ewogICAgIEpTVmFsdWUgKnYgPSBzdG9yYWdlW2luZGV4XTsKICAgICBpZiAoIXYpCkBAIC0xNTYs
OCArMTY5LDE2IEBAIGJvb2wgQXJyYXlJbnN0YW5jZTo6Z2V0T3duUHJvcGVydHlTbG90KEUKICAg
ICBzbG90LnNldFZhbHVlU2xvdCh0aGlzLCAmc3RvcmFnZVtpbmRleF0pOwogICAgIHJldHVybiB0
cnVlOwogICB9Ci0KLSAgcmV0dXJuIEpTT2JqZWN0OjpnZXRPd25Qcm9wZXJ0eVNsb3QoZXhlYywg
aW5kZXgsIHNsb3QpOworICBpZiAoaW5kZXggPiBNQVhfQVJSQVlfSU5ERVgpCisgICAgcmV0dXJu
IGdldE93blByb3BlcnR5U2xvdChleGVjLCBJZGVudGlmaWVyOjpmcm9tKGluZGV4KSwgc2xvdCk7
CisgIE92ZXJmbG93TWFwKiBvdmVyZmxvdyA9IG92ZXJmbG93TWFwKHN0b3JhZ2UpOworICBpZiAo
IW92ZXJmbG93KQorICAgIHJldHVybiBmYWxzZTsKKyAgT3ZlcmZsb3dNYXA6Oml0ZXJhdG9yIGl0
ID0gb3ZlcmZsb3ctPmZpbmQoaW5kZXgpOworICBpZiAoaXQgPT0gb3ZlcmZsb3ctPmVuZCgpKQor
ICAgIHJldHVybiBmYWxzZTsKKyAgc2xvdC5zZXRWYWx1ZVNsb3QodGhpcywgJml0LT5zZWNvbmQp
OworICByZXR1cm4gdHJ1ZTsKIH0KIAogLy8gU3BlY2lhbCBpbXBsZW1lbnRhdGlvbiBvZiBbW1B1
dF1dIC0gc2VlIEVDTUEgMTUuNC41LjEKQEAgLTE3Miw0OCArMTkzLDUxIEBAIHZvaWQgQXJyYXlJ
bnN0YW5jZTo6cHV0KEV4ZWNTdGF0ZSogZXhlYywKICAgICBzZXRMZW5ndGgobmV3TGVuLCBleGVj
KTsKICAgICByZXR1cm47CiAgIH0KLSAgCisKICAgYm9vbCBvazsKICAgdW5zaWduZWQgaW5kZXgg
PSBwcm9wZXJ0eU5hbWUudG9BcnJheUluZGV4KCZvayk7CiAgIGlmIChvaykgewogICAgIHB1dChl
eGVjLCBpbmRleCwgdmFsdWUsIGF0dHIpOwogICAgIHJldHVybjsKICAgfQotICAKKwogICBKU09i
amVjdDo6cHV0KGV4ZWMsIHByb3BlcnR5TmFtZSwgdmFsdWUsIGF0dHIpOwogfQogCiB2b2lkIEFy
cmF5SW5zdGFuY2U6OnB1dChFeGVjU3RhdGUgKmV4ZWMsIHVuc2lnbmVkIGluZGV4LCBKU1ZhbHVl
ICp2YWx1ZSwgaW50IGF0dHIpCiB7Ci0gIC8vMHhGRkZGIEZGRkYgaXMgYSBiaXQgd2VpcmQgLS0t
IGl0IHNob3VsZCBiZSB0cmVhdGVkIGFzIGEgbm9uLWFycmF5IGluZGV4LCBldmVuIHdoZW4KLSAg
Ly9pdCdzIGEgc3RyaW5nIAorICAvLyAweEZGRkZGRkZGIGlzIGEgYml0IHdlaXJkIC0tLSBpdCBz
aG91bGQgYmUgdHJlYXRlZCBhcyBhIG5vbi1hcnJheSBpbmRleCwgZXZlbiB3aGVuIGl0J3MgYSBz
dHJpbmcgCiAgIGlmIChpbmRleCA+IE1BWF9BUlJBWV9JTkRFWCkgewogICAgIHB1dChleGVjLCBJ
ZGVudGlmaWVyOjpmcm9tKGluZGV4KSwgdmFsdWUsIGF0dHIpOwogICAgIHJldHVybjsKICAgfQog
Ci0gIGlmIChpbmRleCA8IHNwYXJzZUFycmF5Q3V0b2ZmICYmIGluZGV4ID49IHN0b3JhZ2VMZW5n
dGgpIHsKKyAgaWYgKGluZGV4IDwgc3BhcnNlQXJyYXlDdXRvZmYgJiYgaW5kZXggPj0gc3RvcmFn
ZUxlbmd0aCkKICAgICByZXNpemVTdG9yYWdlKGluZGV4ICsgMSk7Ci0gIH0KIAotICBpZiAoaW5k
ZXggPj0gbGVuZ3RoKSB7CisgIGlmIChpbmRleCA+PSBsZW5ndGgpCiAgICAgbGVuZ3RoID0gaW5k
ZXggKyAxOwotICB9CiAKICAgaWYgKGluZGV4IDwgc3RvcmFnZUxlbmd0aCkgewogICAgIHN0b3Jh
Z2VbaW5kZXhdID0gdmFsdWU7CiAgICAgcmV0dXJuOwogICB9Ci0gIAotICBBU1NFUlQoaW5kZXgg
Pj0gc3BhcnNlQXJyYXlDdXRvZmYpOwotICBKU09iamVjdDo6cHV0KGV4ZWMsIElkZW50aWZpZXI6
OmZyb20oaW5kZXgpLCB2YWx1ZSwgYXR0cik7CisKKyAgT3ZlcmZsb3dNYXAqIG92ZXJmbG93ID0g
b3ZlcmZsb3dNYXAoc3RvcmFnZSk7CisgIGlmICghb3ZlcmZsb3cpIHsKKyAgICBvdmVyZmxvdyA9
IG5ldyBPdmVyZmxvd01hcDsKKyAgICBpZiAoIXN0b3JhZ2UpCisgICAgICBhbGxvY2F0ZVN0b3Jh
Z2UoMSk7CisgICAgc3RvcmFnZVstMl0gPSByZWludGVycHJldF9jYXN0PEpTVmFsdWUqPihvdmVy
Zmxvdyk7CisgIH0KKyAgb3ZlcmZsb3ctPmFkZChpbmRleCwgdmFsdWUpOwogfQogCiBib29sIEFy
cmF5SW5zdGFuY2U6OmRlbGV0ZVByb3BlcnR5KEV4ZWNTdGF0ZSogZXhlYywgY29uc3QgSWRlbnRp
ZmllciAmcHJvcGVydHlOYW1lKQogewogICBpZiAocHJvcGVydHlOYW1lID09IGV4ZWMtPnByb3Bl
cnR5TmFtZXMoKS5sZW5ndGgpCiAgICAgcmV0dXJuIGZhbHNlOwotICAKKwogICBib29sIG9rOwog
ICB1aW50MzJfdCBpbmRleCA9IHByb3BlcnR5TmFtZS50b0FycmF5SW5kZXgoJm9rKTsKICAgaWYg
KG9rKSB7CkBAIC0yMjMsOCArMjQ3LDE2IEBAIGJvb2wgQXJyYXlJbnN0YW5jZTo6ZGVsZXRlUHJv
cGVydHkoRXhlY1MKICAgICAgIHN0b3JhZ2VbaW5kZXhdID0gMDsKICAgICAgIHJldHVybiB0cnVl
OwogICAgIH0KKyAgICBpZiAoT3ZlcmZsb3dNYXAqIG92ZXJmbG93ID0gb3ZlcmZsb3dNYXAoc3Rv
cmFnZSkpIHsKKyAgICAgIE92ZXJmbG93TWFwOjppdGVyYXRvciBpdCA9IG92ZXJmbG93LT5maW5k
KGluZGV4KTsKKyAgICAgIGlmIChpdCA9PSBvdmVyZmxvdy0+ZW5kKCkpCisgICAgICAgIHJldHVy
biBmYWxzZTsKKyAgICAgIG92ZXJmbG93LT5yZW1vdmUoaXQpOworICAgICAgcmV0dXJuIHRydWU7
CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKICAgfQotICAKKwogICByZXR1cm4gSlNPYmplY3Q6
OmRlbGV0ZVByb3BlcnR5KGV4ZWMsIHByb3BlcnR5TmFtZSk7CiB9CiAKQEAgLTIzOSw4ICsyNzEs
MTQgQEAgYm9vbCBBcnJheUluc3RhbmNlOjpkZWxldGVQcm9wZXJ0eShFeGVjUwogICAgIHN0b3Jh
Z2VbaW5kZXhdID0gMDsKICAgICByZXR1cm4gdHJ1ZTsKICAgfQotICAKLSAgcmV0dXJuIEpTT2Jq
ZWN0OjpkZWxldGVQcm9wZXJ0eShleGVjLCBJZGVudGlmaWVyOjpmcm9tKGluZGV4KSk7CisgIE92
ZXJmbG93TWFwKiBvdmVyZmxvdyA9IG92ZXJmbG93TWFwKHN0b3JhZ2UpOworICBpZiAoIW92ZXJm
bG93KQorICAgIHJldHVybiBmYWxzZTsKKyAgT3ZlcmZsb3dNYXA6Oml0ZXJhdG9yIGl0ID0gb3Zl
cmZsb3ctPmZpbmQoaW5kZXgpOworICBpZiAoaXQgPT0gb3ZlcmZsb3ctPmVuZCgpKQorICAgIHJl
dHVybiBmYWxzZTsKKyAgb3ZlcmZsb3ctPnJlbW92ZShpdCk7CisgIHJldHVybiB0cnVlOwogfQog
CiB2b2lkIEFycmF5SW5zdGFuY2U6OmdldFByb3BlcnR5TmFtZXMoRXhlY1N0YXRlKiBleGVjLCBQ
cm9wZXJ0eU5hbWVBcnJheSYgcHJvcGVydHlOYW1lcykKQEAgLTI1Myw2ICsyOTEsMTYgQEAgdm9p
ZCBBcnJheUluc3RhbmNlOjpnZXRQcm9wZXJ0eU5hbWVzKEV4ZQogICAgIGlmICh2YWx1ZSAmJiB2
YWx1ZSAhPSB1bmRlZmluZWQpCiAgICAgICBwcm9wZXJ0eU5hbWVzLmFkZChJZGVudGlmaWVyOjpm
cm9tKGkpKTsKICAgfQorCisgIE92ZXJmbG93TWFwKiBvdmVyZmxvdyA9IG92ZXJmbG93TWFwKHN0
b3JhZ2UpOworICBpZiAob3ZlcmZsb3cpIHsKKyAgICBPdmVyZmxvd01hcDo6aXRlcmF0b3IgZW5k
ID0gb3ZlcmZsb3ctPmVuZCgpOworICAgIGZvciAoT3ZlcmZsb3dNYXA6Oml0ZXJhdG9yIGl0ID0g
b3ZlcmZsb3ctPmJlZ2luKCk7IGl0ICE9IGVuZDsgKytpdCkgeworICAgICAgSlNWYWx1ZSogdmFs
dWUgPSBpdC0+c2Vjb25kOworICAgICAgaWYgKHZhbHVlICYmIHZhbHVlICE9IHVuZGVmaW5lZCkK
KyAgICAgICAgcHJvcGVydHlOYW1lcy5hZGQoSWRlbnRpZmllcjo6ZnJvbShpdC0+Zmlyc3QpKTsK
KyAgICB9CisgIH0KICAKICAgSlNPYmplY3Q6OmdldFByb3BlcnR5TmFtZXMoZXhlYywgcHJvcGVy
dHlOYW1lcyk7CiB9CkBAIC0yODIsMjMgKzMzMCwxNyBAQCB2b2lkIEFycmF5SW5zdGFuY2U6OnJl
c2l6ZVN0b3JhZ2UodW5zaWduCiAKIHZvaWQgQXJyYXlJbnN0YW5jZTo6c2V0TGVuZ3RoKHVuc2ln
bmVkIG5ld0xlbmd0aCwgRXhlY1N0YXRlICpleGVjKQogewotICBpZiAobmV3TGVuZ3RoIDw9IHN0
b3JhZ2VMZW5ndGgpIHsKKyAgaWYgKG5ld0xlbmd0aCA8PSBzdG9yYWdlTGVuZ3RoKQogICAgIHJl
c2l6ZVN0b3JhZ2UobmV3TGVuZ3RoKTsKLSAgfQogCiAgIGlmIChuZXdMZW5ndGggPCBsZW5ndGgp
IHsKLSAgICBQcm9wZXJ0eU5hbWVBcnJheSBzcGFyc2VQcm9wZXJ0aWVzOwotICAgIAotICAgIF9w
cm9wLmdldFNwYXJzZUFycmF5UHJvcGVydHlOYW1lcyhzcGFyc2VQcm9wZXJ0aWVzKTsKLSAgICAK
LSAgICBQcm9wZXJ0eU5hbWVBcnJheUl0ZXJhdG9yIGVuZCA9IHNwYXJzZVByb3BlcnRpZXMuZW5k
KCk7Ci0gICAgCi0gICAgZm9yIChQcm9wZXJ0eU5hbWVBcnJheUl0ZXJhdG9yIGl0ID0gc3BhcnNl
UHJvcGVydGllcy5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpIHsKLSAgICAgIElkZW50aWZpZXIg
bmFtZSA9ICppdDsKLSAgICAgIGJvb2wgb2s7Ci0gICAgICB1bnNpZ25lZCBpbmRleCA9IG5hbWUu
dG9BcnJheUluZGV4KCZvayk7Ci0gICAgICBpZiAob2sgJiYgaW5kZXggPiBuZXdMZW5ndGgpCi0g
ICAgICAgIGRlbGV0ZVByb3BlcnR5KGV4ZWMsIG5hbWUpOworICAgIGlmIChPdmVyZmxvd01hcCog
b3ZlcmZsb3cgPSBvdmVyZmxvd01hcChzdG9yYWdlKSkgeworICAgICAgT3ZlcmZsb3dNYXAgY29w
eSA9ICpvdmVyZmxvdzsKKyAgICAgIE92ZXJmbG93TWFwOjppdGVyYXRvciBlbmQgPSBjb3B5LmVu
ZCgpOworICAgICAgZm9yIChPdmVyZmxvd01hcDo6aXRlcmF0b3IgaXQgPSBjb3B5LmJlZ2luKCk7
IGl0ICE9IGVuZDsgKytpdCkgeworICAgICAgICBpZiAoaXQtPmZpcnN0ID49IG5ld0xlbmd0aCkK
KyAgICAgICAgICBvdmVyZmxvdy0+cmVtb3ZlKGl0LT5maXJzdCk7CisgICAgICB9CiAgICAgfQog
ICB9CiAgIApAQCAtMzEwLDEwICszNTIsMTggQEAgdm9pZCBBcnJheUluc3RhbmNlOjptYXJrKCkK
ICAgSlNPYmplY3Q6Om1hcmsoKTsKICAgdW5zaWduZWQgbCA9IHN0b3JhZ2VMZW5ndGg7CiAgIGZv
ciAodW5zaWduZWQgaSA9IDA7IGkgPCBsOyArK2kpIHsKLSAgICBKU1ZhbHVlICppbXAgPSBzdG9y
YWdlW2ldOworICAgIEpTVmFsdWUqIGltcCA9IHN0b3JhZ2VbaV07CiAgICAgaWYgKGltcCAmJiAh
aW1wLT5tYXJrZWQoKSkKICAgICAgIGltcC0+bWFyaygpOwogICB9CisgIGlmIChPdmVyZmxvd01h
cCogb3ZlcmZsb3cgPSBvdmVyZmxvd01hcChzdG9yYWdlKSkgeworICAgIE92ZXJmbG93TWFwOjpp
dGVyYXRvciBlbmQgPSBvdmVyZmxvdy0+ZW5kKCk7CisgICAgZm9yIChPdmVyZmxvd01hcDo6aXRl
cmF0b3IgaXQgPSBvdmVyZmxvdy0+YmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0KSB7CisgICAgICBK
U1ZhbHVlKiB2YWx1ZSA9IGl0LT5zZWNvbmQ7CisgICAgICBpZiAodmFsdWUgJiYgIXZhbHVlLT5t
YXJrZWQoKSkKKyAgICAgICAgdmFsdWUtPm1hcmsoKTsKKyAgICB9CisgIH0KIH0KIAogc3RhdGlj
IEV4ZWNTdGF0ZSogZXhlY0ZvckNvbXBhcmVCeVN0cmluZ0ZvclFTb3J0ID0gMDsKQEAgLTMyMywx
MiArMzczLDggQEAgc3RhdGljIGludCBjb21wYXJlQnlTdHJpbmdGb3JRU29ydChjb25zdAogICAg
IEV4ZWNTdGF0ZSAqZXhlYyA9IGV4ZWNGb3JDb21wYXJlQnlTdHJpbmdGb3JRU29ydDsKICAgICBK
U1ZhbHVlICp2YSA9ICooSlNWYWx1ZSAqKilhOwogICAgIEpTVmFsdWUgKnZiID0gKihKU1ZhbHVl
ICoqKWI7Ci0gICAgaWYgKHZhLT5pc1VuZGVmaW5lZCgpKSB7Ci0gICAgICAgIHJldHVybiB2Yi0+
aXNVbmRlZmluZWQoKSA/IDAgOiAxOwotICAgIH0KLSAgICBpZiAodmItPmlzVW5kZWZpbmVkKCkp
IHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KKyAgICBBU1NFUlQoIXZhLT5pc1VuZGVmaW5l
ZCgpKTsKKyAgICBBU1NFUlQoIXZiLT5pc1VuZGVmaW5lZCgpKTsKICAgICByZXR1cm4gY29tcGFy
ZSh2YS0+dG9TdHJpbmcoZXhlYyksIHZiLT50b1N0cmluZyhleGVjKSk7CiB9CiAKQEAgLTM4NCwx
MiArNDMwLDggQEAgc3RhdGljIGludCBjb21wYXJlV2l0aENvbXBhcmVGdW5jdGlvbkZvcgogCiAg
ICAgSlNWYWx1ZSAqdmEgPSAqKEpTVmFsdWUgKiopYTsKICAgICBKU1ZhbHVlICp2YiA9ICooSlNW
YWx1ZSAqKiliOwotICAgIGlmICh2YS0+aXNVbmRlZmluZWQoKSkgewotICAgICAgICByZXR1cm4g
dmItPmlzVW5kZWZpbmVkKCkgPyAwIDogMTsKLSAgICB9Ci0gICAgaWYgKHZiLT5pc1VuZGVmaW5l
ZCgpKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9CisgICAgQVNTRVJUKCF2YS0+aXNVbmRl
ZmluZWQoKSk7CisgICAgQVNTRVJUKCF2Yi0+aXNVbmRlZmluZWQoKSk7CiAKICAgICBhcmdzLT5h
cmd1bWVudHMuY2xlYXIoKTsKICAgICBhcmdzLT5hcmd1bWVudHMuYXBwZW5kKHZhKTsKQEAgLTQ0
MSwxOSArNDgzLDI1IEBAIHVuc2lnbmVkIEFycmF5SW5zdGFuY2U6OmNvbXBhY3RGb3JTb3J0aW4K
ICAgICAgICAgfQogICAgIH0KICAgIAotICAgIFByb3BlcnR5TmFtZUFycmF5IHNwYXJzZVByb3Bl
cnRpZXM7Ci0gICAgX3Byb3AuZ2V0U3BhcnNlQXJyYXlQcm9wZXJ0eU5hbWVzKHNwYXJzZVByb3Bl
cnRpZXMpOwotICAgIHVuc2lnbmVkIG5ld0xlbmd0aCA9IG8gKyBzcGFyc2VQcm9wZXJ0aWVzLnNp
emUoKTsKLSAgICAKLSAgICBpZiAobmV3TGVuZ3RoID4gc3RvcmFnZUxlbmd0aCkKLSAgICAgICAg
cmVzaXplU3RvcmFnZShuZXdMZW5ndGgpOwotICAgIAotICAgIFByb3BlcnR5TmFtZUFycmF5SXRl
cmF0b3IgZW5kID0gc3BhcnNlUHJvcGVydGllcy5lbmQoKTsKLSAgICBmb3IgKFByb3BlcnR5TmFt
ZUFycmF5SXRlcmF0b3IgaXQgPSBzcGFyc2VQcm9wZXJ0aWVzLmJlZ2luKCk7IGl0ICE9IGVuZDsg
KytpdCkgewotICAgICAgICBJZGVudGlmaWVyIG5hbWUgPSAqaXQ7Ci0gICAgICAgIHN0b3JhZ2Vb
b10gPSBnZXREaXJlY3QobmFtZSk7Ci0gICAgICAgIF9wcm9wLnJlbW92ZShuYW1lKTsKLSAgICAg
ICAgbysrOworICAgIHVuc2lnbmVkIG5ld0xlbmd0aCA9IG87CisKKyAgICBpZiAoT3ZlcmZsb3dN
YXAqIG92ZXJmbG93ID0gb3ZlcmZsb3dNYXAoc3RvcmFnZSkpIHsKKyAgICAgICAgT3ZlcmZsb3dN
YXA6Oml0ZXJhdG9yIGVuZCA9IG92ZXJmbG93LT5lbmQoKTsKKyAgICAgICAgZm9yIChPdmVyZmxv
d01hcDo6aXRlcmF0b3IgaXQgPSBvdmVyZmxvdy0+YmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0KQor
ICAgICAgICAgICAgbmV3TGVuZ3RoICs9IGl0LT5zZWNvbmQgIT0gdW5kZWZpbmVkOworICAgIAor
ICAgICAgICBpZiAobmV3TGVuZ3RoID4gc3RvcmFnZUxlbmd0aCkKKyAgICAgICAgICAgIHJlc2l6
ZVN0b3JhZ2UobmV3TGVuZ3RoKTsKKyAgICAKKyAgICAgICAgZm9yIChPdmVyZmxvd01hcDo6aXRl
cmF0b3IgaXQgPSBvdmVyZmxvdy0+YmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0KSB7CisgICAgICAg
ICAgICBKU1ZhbHVlKiB2ID0gaXQtPnNlY29uZDsKKyAgICAgICAgICAgIGlmICh2ICE9IHVuZGVm
aW5lZCkgeworICAgICAgICAgICAgICAgIHN0b3JhZ2Vbb10gPSB2OworICAgICAgICAgICAgICAg
IG8rKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBkZWxldGUgb3ZlcmZsb3c7
CisgICAgICAgIHN0b3JhZ2VbLTJdID0gMDsKICAgICB9CiAgICAgCiAgICAgaWYgKG5ld0xlbmd0
aCAhPSBzdG9yYWdlTGVuZ3RoKQpAQCAtMTA0NiwzICsxMDk0LDUgQEAgSlNWYWx1ZSAqQXJyYXlP
YmplY3RJbXA6OmNhbGxBc0Z1bmN0aW9uKAogICAvLyBlcXVpdmFsZW50IHRvICduZXcgQXJyYXko
Li4uLiknCiAgIHJldHVybiBjb25zdHJ1Y3QoZXhlYyxhcmdzKTsKIH0KKworfQpJbmRleDogSmF2
YVNjcmlwdENvcmUva2pzL3Byb3BlcnR5X21hcC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gSmF2YVNjcmlw
dENvcmUva2pzL3Byb3BlcnR5X21hcC5jcHAJKHJldmlzaW9uIDI2ODM2KQorKysgSmF2YVNjcmlw
dENvcmUva2pzL3Byb3BlcnR5X21hcC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTYyMCwzNiArNjIw
LDYgQEAgdm9pZCBQcm9wZXJ0eU1hcDo6Z2V0RW51bWVyYWJsZVByb3BlcnR5TgogICAgICAgICBw
cm9wZXJ0eU5hbWVzLmFkZChJZGVudGlmaWVyKHFbMF0tPmtleSkpOwogfQogCi12b2lkIFByb3Bl
cnR5TWFwOjpnZXRTcGFyc2VBcnJheVByb3BlcnR5TmFtZXMoUHJvcGVydHlOYW1lQXJyYXkmIHBy
b3BlcnR5TmFtZXMpIGNvbnN0Ci17Ci0gICAgaWYgKCFtX3VzaW5nVGFibGUpIHsKLSNpZiBVU0Vf
U0lOR0xFX0VOVFJZCi0gICAgICAgIFVTdHJpbmc6OlJlcCAqa2V5ID0gbV9zaW5nbGVFbnRyeUtl
eTsKLSAgICAgICAgaWYgKGtleSkgewotICAgICAgICAgICAgVVN0cmluZyBrKGtleSk7Ci0gICAg
ICAgICAgICBib29sIGZpdHNJblVJbnQzMjsKLSAgICAgICAgICAgIGsudG9VSW50MzIoJmZpdHNJ
blVJbnQzMik7Ci0gICAgICAgICAgICBpZiAoZml0c0luVUludDMyKQotICAgICAgICAgICAgICAg
IHByb3BlcnR5TmFtZXMuYWRkKElkZW50aWZpZXIoa2V5KSk7Ci0gICAgICAgIH0KLSNlbmRpZgot
ICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaW50IHNpemUgPSBtX3UudGFibGUtPnNpemU7
Ci0gICAgRW50cnkgKmVudHJpZXMgPSBtX3UudGFibGUtPmVudHJpZXM7Ci0gICAgZm9yIChpbnQg
aSA9IDA7IGkgIT0gc2l6ZTsgKytpKSB7Ci0gICAgICAgIFVTdHJpbmc6OlJlcCAqa2V5ID0gZW50
cmllc1tpXS5rZXk7Ci0gICAgICAgIGlmIChpc1ZhbGlkKGtleSkpIHsKLSAgICAgICAgICAgIFVT
dHJpbmcgayhrZXkpOwotICAgICAgICAgICAgYm9vbCBmaXRzSW5VSW50MzI7Ci0gICAgICAgICAg
ICBrLnRvVUludDMyKCZmaXRzSW5VSW50MzIpOwotICAgICAgICAgICAgaWYgKGZpdHNJblVJbnQz
MikKLSAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWVzLmFkZChJZGVudGlmaWVyKGtleSkpOwot
ICAgICAgICB9Ci0gICAgfQotfQotCiB2b2lkIFByb3BlcnR5TWFwOjpzYXZlKFNhdmVkUHJvcGVy
dGllcyAmcCkgY29uc3QKIHsKICAgICBpbnQgY291bnQgPSAwOwpJbmRleDogSmF2YVNjcmlwdENv
cmUva2pzL3Byb3BlcnR5X21hcC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIEphdmFTY3JpcHRDb3JlL2tqcy9w
cm9wZXJ0eV9tYXAuaAkocmV2aXNpb24gMjY4MzYpCisrKyBKYXZhU2NyaXB0Q29yZS9ranMvcHJv
cGVydHlfbWFwLmgJKHdvcmtpbmcgY29weSkKQEAgLTgwLDcgKzgwLDYgQEAgbmFtZXNwYWNlIEtK
UyB7CiAKICAgICAgICAgdm9pZCBtYXJrKCkgY29uc3Q7CiAgICAgICAgIHZvaWQgZ2V0RW51bWVy
YWJsZVByb3BlcnR5TmFtZXMoUHJvcGVydHlOYW1lQXJyYXkmKSBjb25zdDsKLSAgICAgICAgdm9p
ZCBnZXRTcGFyc2VBcnJheVByb3BlcnR5TmFtZXMoUHJvcGVydHlOYW1lQXJyYXkmKSBjb25zdDsK
IAogICAgICAgICB2b2lkIHNhdmUoU2F2ZWRQcm9wZXJ0aWVzICYpIGNvbnN0OwogICAgICAgICB2
b2lkIHJlc3RvcmUoY29uc3QgU2F2ZWRQcm9wZXJ0aWVzICZwKTsK
</data>
<flag name="review"
          id="7084"
          type_id="1"
          status="+"
          setter="mjs"
    />
          </attachment>
      

    </bug>

</bugzilla>