<?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>147265</bug_id>
          
          <creation_ts>2015-07-24 09:57:18 -0700</creation_ts>
          <short_desc>SparseValueMap check is skipped when the butterfly&apos;s vectorLength is larger than the access-requested index</short_desc>
          <delta_ts>2015-07-27 16:56:42 -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>New Bugs</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></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Yusuke Suzuki">ysuzuki</reporter>
          <assigned_to name="Yusuke Suzuki">ysuzuki</assigned_to>
          <cc>darin</cc>
    
    <cc>fpizlo</cc>
    
    <cc>ggaren</cc>
    
    <cc>joepeck</cc>
    
    <cc>mark.lam</cc>
    
    <cc>oliver</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1111997</commentid>
    <comment_count>0</comment_count>
    <who name="Yusuke Suzuki">ysuzuki</who>
    <bug_when>2015-07-24 09:57:18 -0700</bug_when>
    <thetext>SparseValueMap check is skipped when the butterfly&apos;s vectorLength is larger than the access-requested index</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1112017</commentid>
    <comment_count>1</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-07-24 11:12:51 -0700</bug_when>
    <thetext>(In reply to comment #0)
&gt; SparseValueMap check is skipped when the butterfly&apos;s vectorLength is larger
&gt; than the access-requested index

That may be intentional.  We don&apos;t want to always check for the sparse value map.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1112066</commentid>
    <comment_count>2</comment_count>
    <who name="Yusuke Suzuki">ysuzuki</who>
    <bug_when>2015-07-24 13:07:47 -0700</bug_when>
    <thetext>(In reply to comment #1)
&gt; (In reply to comment #0)
&gt; &gt; SparseValueMap check is skipped when the butterfly&apos;s vectorLength is larger
&gt; &gt; than the access-requested index
&gt; 
&gt; That may be intentional.  We don&apos;t want to always check for the sparse value
&gt; map.

Ah, sorry for misleading my description.
Yes, but, when the accessed value is the array hole and there&apos;s a sparse map, we need to check it.

Following is the test to reproduce this issue.

function testing(object) {
    var value = object[1];
    if (value !== 1)
        throw new Error(&quot;OUT&quot;);
}
noInline(testing);

for (var i = 0; i &lt; 10000; ++i)
    testing({
        0: 0,
        1: 1,
        2: &quot;String&quot;
    });

// Now, object[1] (inside testing) will be return `undefined` for the following object.
testing({
    0: 0,
    get 1() {
        return 1;
    },
    set 1(value) {
        throw new Error(2);
    },
});</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1112067</commentid>
    <comment_count>3</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-07-24 13:10:13 -0700</bug_when>
    <thetext>(In reply to comment #2)
&gt; (In reply to comment #1)
&gt; &gt; (In reply to comment #0)
&gt; &gt; &gt; SparseValueMap check is skipped when the butterfly&apos;s vectorLength is larger
&gt; &gt; &gt; than the access-requested index
&gt; &gt; 
&gt; &gt; That may be intentional.  We don&apos;t want to always check for the sparse value
&gt; &gt; map.
&gt; 
&gt; Ah, sorry for misleading my description.
&gt; Yes, but, when the accessed value is the array hole and there&apos;s a sparse
&gt; map, we need to check it.
&gt; 
&gt; Following is the test to reproduce this issue.
&gt; 
&gt; function testing(object) {
&gt;     var value = object[1];
&gt;     if (value !== 1)
&gt;         throw new Error(&quot;OUT&quot;);
&gt; }
&gt; noInline(testing);
&gt; 
&gt; for (var i = 0; i &lt; 10000; ++i)
&gt;     testing({
&gt;         0: 0,
&gt;         1: 1,
&gt;         2: &quot;String&quot;
&gt;     });
&gt; 
&gt; // Now, object[1] (inside testing) will be return `undefined` for the
&gt; following object.
&gt; testing({
&gt;     0: 0,
&gt;     get 1() {
&gt;         return 1;
&gt;     },
&gt;     set 1(value) {
&gt;         throw new Error(2);
&gt;     },
&gt; });

I think that the bug here is that vectorLength is not zero.  That&apos;s the intent anyway.  It would probably be rather gross to change the array load/store algorithm to always check for sparse map even on indices in-bounds of vectorLength, since that means changing *a lot* of code.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1112075</commentid>
    <comment_count>4</comment_count>
    <who name="Yusuke Suzuki">ysuzuki</who>
    <bug_when>2015-07-24 13:48:28 -0700</bug_when>
    <thetext>(In reply to comment #3)
&gt; I think that the bug here is that vectorLength is not zero.  That&apos;s the
&gt; intent anyway.  It would probably be rather gross to change the array
&gt; load/store algorithm to always check for sparse map even on indices
&gt; in-bounds of vectorLength, since that means changing *a lot* of code.

In the current DFG, since it speculate the value is not the array hole when accessing the vector, when the speculation is not met, it causes exit.
After that, since runtime JSObject skips the sparse map check, this issue occurs.
So I think DFG/FTL changes are not necessary.

I think there&apos;s 2 solutions at least.

1. Just check the sparse map if the vector returns the array hole.
2. When indexed accessor is stored, throw away the vector and make the array DictionaryIndexingMode.

I think what solution is the better depends on how frequently we use indexed accessors.
I guess indexed accessors are not so much used, (2) seems nice.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1112098</commentid>
    <comment_count>5</comment_count>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2015-07-24 14:36:04 -0700</bug_when>
    <thetext>I agree that indexed accessors on arrays are rare, and should be treated specially.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1112141</commentid>
    <comment_count>6</comment_count>
      <attachid>257492</attachid>
    <who name="Yusuke Suzuki">ysuzuki</who>
    <bug_when>2015-07-24 16:47:00 -0700</bug_when>
    <thetext>Created attachment 257492
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1112501</commentid>
    <comment_count>7</comment_count>
      <attachid>257492</attachid>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2015-07-27 14:23:25 -0700</bug_when>
    <thetext>Comment on attachment 257492
Patch

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

r=me

&gt; Source/JavaScriptCore/ChangeLog:17
&gt; +        As a result, if the length of the vector overlaps the indice of the accessors stored in the SparseValueMap,

indice =&gt; indices

&gt; Source/JavaScriptCore/ChangeLog:18
&gt; +        we accidentally skip the phase looking up from the SparseValueMap. Instead, just looks the vector and if

just looks the vector =&gt; we just load from the vector</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1112503</commentid>
    <comment_count>8</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-07-27 14:28:29 -0700</bug_when>
    <thetext>(In reply to comment #4)
&gt; (In reply to comment #3)
&gt; &gt; I think that the bug here is that vectorLength is not zero.  That&apos;s the
&gt; &gt; intent anyway.  It would probably be rather gross to change the array
&gt; &gt; load/store algorithm to always check for sparse map even on indices
&gt; &gt; in-bounds of vectorLength, since that means changing *a lot* of code.
&gt; 
&gt; In the current DFG, since it speculate the value is not the array hole when
&gt; accessing the vector

This is not true.  The DFG has a path for storing to holes.  It also has optimizations for loading from holes.

&gt; , when the speculation is not met, it causes exit.
&gt; After that, since runtime JSObject skips the sparse map check, this issue
&gt; occurs.
&gt; So I think DFG/FTL changes are not necessary.
&gt; 
&gt; I think there&apos;s 2 solutions at least.
&gt; 
&gt; 1. Just check the sparse map if the vector returns the array hole.
&gt; 2. When indexed accessor is stored, throw away the vector and make the array
&gt; DictionaryIndexingMode.
&gt; 
&gt; I think what solution is the better depends on how frequently we use indexed
&gt; accessors.
&gt; I guess indexed accessors are not so much used, (2) seems nice.

Does your solution depend on your assumption that the DFG doesn&apos;t support hole accesses?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1112509</commentid>
    <comment_count>9</comment_count>
    <who name="Yusuke Suzuki">ysuzuki</who>
    <bug_when>2015-07-27 14:44:45 -0700</bug_when>
    <thetext>(In reply to comment #8)
&gt; (In reply to comment #4)
&gt; &gt; (In reply to comment #3)
&gt; &gt; &gt; I think that the bug here is that vectorLength is not zero.  That&apos;s the
&gt; &gt; &gt; intent anyway.  It would probably be rather gross to change the array
&gt; &gt; &gt; load/store algorithm to always check for sparse map even on indices
&gt; &gt; &gt; in-bounds of vectorLength, since that means changing *a lot* of code.
&gt; &gt; 
&gt; &gt; In the current DFG, since it speculate the value is not the array hole when
&gt; &gt; accessing the vector
&gt; 
&gt; This is not true.  The DFG has a path for storing to holes.  It also has
&gt; optimizations for loading from holes.

Ah, I missed StoreToHole.
I just checked ArrayStorage loading path because when there&apos;s a sparse value map, the array becomes storage indexing types.

&gt; 
&gt; &gt; , when the speculation is not met, it causes exit.
&gt; &gt; After that, since runtime JSObject skips the sparse map check, this issue
&gt; &gt; occurs.
&gt; &gt; So I think DFG/FTL changes are not necessary.
&gt; &gt; 
&gt; &gt; I think there&apos;s 2 solutions at least.
&gt; &gt; 
&gt; &gt; 1. Just check the sparse map if the vector returns the array hole.
&gt; &gt; 2. When indexed accessor is stored, throw away the vector and make the array
&gt; &gt; DictionaryIndexingMode.
&gt; &gt; 
&gt; &gt; I think what solution is the better depends on how frequently we use indexed
&gt; &gt; accessors.
&gt; &gt; I guess indexed accessors are not so much used, (2) seems nice.
&gt; 
&gt; Does your solution depend on your assumption that the DFG doesn&apos;t support
&gt; hole accesses?

No. In this patch, we maintain the invariant that the stored indices in the sparse value map is always larger than the vector length. Previously this invariant is broken when setting the indexed accessors.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1112593</commentid>
    <comment_count>10</comment_count>
    <who name="Yusuke Suzuki">ysuzuki</who>
    <bug_when>2015-07-27 16:52:52 -0700</bug_when>
    <thetext>Committed r187464: &lt;http://trac.webkit.org/changeset/187464&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1112601</commentid>
    <comment_count>11</comment_count>
      <attachid>257492</attachid>
    <who name="Yusuke Suzuki">ysuzuki</who>
    <bug_when>2015-07-27 16:56:42 -0700</bug_when>
    <thetext>Comment on attachment 257492
Patch

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

Thanks for your review!

&gt;&gt; Source/JavaScriptCore/ChangeLog:17
&gt;&gt; +        As a result, if the length of the vector overlaps the indice of the accessors stored in the SparseValueMap,
&gt; 
&gt; indice =&gt; indices

Fixed.

&gt;&gt; Source/JavaScriptCore/ChangeLog:18
&gt;&gt; +        we accidentally skip the phase looking up from the SparseValueMap. Instead, just looks the vector and if
&gt; 
&gt; just looks the vector =&gt; we just load from the vector

Fixed.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>257492</attachid>
            <date>2015-07-24 16:47:00 -0700</date>
            <delta_ts>2015-07-27 14:23:25 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-147265-20150724164543.patch</filename>
            <type>text/plain</type>
            <size>11829</size>
            <attacher name="Yusuke Suzuki">ysuzuki</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTg3MzYyCmRpZmYgLS1naXQgYS9Tb3VyY2UvSmF2YVNjcmlw
dENvcmUvQ2hhbmdlTG9nIGIvU291cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwppbmRleCAx
NGY4ODkzMDc0NWZiNzAwN2JkNDljOGRkMDdkNDQ0MWM4ODExZGU0Li45NTZhNmQ5ODM0ZDFhODRi
MDhlZTU4OTc2YjMxOWJjZmE0ZWY5NTU2IDEwMDY0NAotLS0gYS9Tb3VyY2UvSmF2YVNjcmlwdENv
cmUvQ2hhbmdlTG9nCisrKyBiL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKQEAgLTEs
NSArMSw0NyBAQAorMjAxNS0wNy0yNCAgWXVzdWtlIFN1enVraSAgPHV0YXRhbmUudGVhQGdtYWls
LmNvbT4KKworICAgICAgICBTcGFyc2VWYWx1ZU1hcCBjaGVjayBpcyBza2lwcGVkIHdoZW4gdGhl
IGJ1dHRlcmZseSdzIHZlY3Rvckxlbmd0aCBpcyBsYXJnZXIgdGhhbiB0aGUgYWNjZXNzLXJlcXVl
c3RlZCBpbmRleAorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/
aWQ9MTQ3MjY1CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAg
ICAgSlNPYmplY3QncyB2ZWN0b3IgaG9sZHMgdGhlIGluZGV4ZWQgdmFsdWVzIGFuZCB3ZSBsZXZl
cmFnZSBpdCB0byByZXByZXNlbnQgc3RvcmVkIHZhbHVlcyBhbmQgaG9sZXMuCisgICAgICAgIEJ5
IGNoZWNraW5nIHRoYXQgdGhlIGdpdmVuIGluZGV4IGlzIGluLWJvdW5kIG9mIHRoZSB2ZWN0b3In
cyBsZW5ndGgsIHdlIGNhbiBsb29rIHVwIHRoZSBwcm9wZXJ0eSBmYXN0LgorICAgICAgICBBbmQg
Zm9yIHRoZSBzcGFyc2UgYXJyYXksIHdlIGhhdmUgYWxzbyB0aGUgc2VwYXJhdGVkIFNwYXJzZVZh
bHVlTWFwIHRvIGhvbGQgdGhlIHBhaXJzLgorICAgICAgICBBbmQgd2UgbmVlZCB0byB0YWtlIGNh
cmUgdGhhdCB0aGUgbGVuZ3RoIG9mIHRoZSB2ZWN0b3Igc2hvdWxkIG5vdCBvdmVybGFwIHRoZSBp
bmRpY2Ugc3RvcmVkIGluIHRoZSBTcGFyc2VWYWx1ZU1hcC4KKworICAgICAgICBUaGUgdmVjdG9y
IG9ubHkgaG9sZHMgdGhlIHB1cmUgSlMgdmFsdWVzIHRvIGF2b2lkIGFkZGl0aW9uYWwgY2hlY2tp
bmcgZm9yIGFjY2Vzc29ycyB3aGVuIGxvb2tpbmcgdXAgdGhlIHZhbHVlCisgICAgICAgIGZyb20g
dGhlIHZlY3Rvci4gVG8gYWNoaWV2ZSB0aGlzLCB3ZSBhbHNvIHN0b3JlIHRoZSBhY2Nlc3NvcnMg
KGFuZCBhdHRyaWJ1dGVkIHByb3BlcnRpZXMpIHRvIFNwYXJzZVZhbHVlTWFwCisgICAgICAgIGV2
ZW4gdGhlIGluZGV4IGlzIGxlc3MgdGhhbiBNSU5fU1BBUlNFX0FSUkFZX0lOREVYLgorCisgICAg
ICAgIEFzIGEgcmVzdWx0LCBpZiB0aGUgbGVuZ3RoIG9mIHRoZSB2ZWN0b3Igb3ZlcmxhcHMgdGhl
IGluZGljZSBvZiB0aGUgYWNjZXNzb3JzIHN0b3JlZCBpbiB0aGUgU3BhcnNlVmFsdWVNYXAsCisg
ICAgICAgIHdlIGFjY2lkZW50YWxseSBza2lwIHRoZSBwaGFzZSBsb29raW5nIHVwIGZyb20gdGhl
IFNwYXJzZVZhbHVlTWFwLiBJbnN0ZWFkLCBqdXN0IGxvb2tzIHRoZSB2ZWN0b3IgYW5kIGlmCisg
ICAgICAgIHRoZXJlJ3MgYSBhcnJheSBob2xlLCB3ZSBkZWNpZGUgdGhlIGdpdmVuIG9iamVjdCBk
b2VzIG5vdCBoYXZlIHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGluZGV4LgorCisgICAgICAgIFRo
aXMgcGF0Y2ggZml4ZXMgdGhlIHByb2JsZW0uCisgICAgICAgIFdoZW4gZGVmaW5pbmcgdGhlIGF0
dHJpYnV0ZWQgdmFsdWUgdGhhdCBpbmRleCBpcyBzbWFsbGVyIHRoYW4gdGhlIGxlbmd0aCBvZiB0
aGUgdmVjdG9yLCB3ZSB0aHJvdyBhd2F5IHRoZSB2ZWN0b3IKKyAgICAgICAgYW5kIGNoYW5nZSB0
aGUgb2JqZWN0IHRvIERpY3Rpb25hcnlJbmRleGluZ01vZGUuIFNpbmNlIHdlIGNhbiBhc3N1bWUg
dGhhdCBpbmRleGVkIGFjY2Vzc29ycyByYXJlbHkgZXhpc3QgaW4KKyAgICAgICAgcHJhY3RpY2Us
IHdlIGV4cGVjdCB0aGlzIGRvZXMgbm90IGh1cnQgdGhlIHBlcmZvcm1hbmNlIHdoaWxlIGtlZXBp
bmcgdGhlIGZhc3QgcHJvcGVydHkgYWNjZXNzIHN5c3RlbSB3aXRob3V0CisgICAgICAgIGNoZWNr
aW5nIHRoZSBzcGFyc2UgbWFwLgorCisgICAgICAgICogcnVudGltZS9KU09iamVjdC5jcHA6Cisg
ICAgICAgIChKU0M6OkpTT2JqZWN0OjpwdXREaXJlY3RJbmRleEJleW9uZFZlY3Rvckxlbmd0aCk6
CisgICAgICAgICogdGVzdHMvc3RyZXNzL3NwYXJzZS1tYXAtbm9uLW92ZXJsYXBwaW5nLmpzOiBB
ZGRlZC4KKyAgICAgICAgKHNob3VsZEJlKToKKyAgICAgICAgKHRlc3RpbmcpOgorICAgICAgICAo
b2JqZWN0LmdldCAxMDAwKToKKyAgICAgICAgKiB0ZXN0cy9zdHJlc3Mvc3BhcnNlLW1hcC1ub24t
c2tpcC1nZXR0ZXItb3ZlcnJpZGluZy5qczogQWRkZWQuCisgICAgICAgIChzaG91bGRCZSk6Cisg
ICAgICAgIChvYmouZ2V0IDEpOgorICAgICAgICAodGVzdGluZyk6CisgICAgICAgICogdGVzdHMv
c3RyZXNzL3NwYXJzZS1tYXAtbm9uLXNraXAuanM6IEFkZGVkLgorICAgICAgICAoc2hvdWxkQmUp
OgorICAgICAgICAodGVzdGluZyk6CisgICAgICAgICh0ZXN0aW5nMik6CisgICAgICAgICguZ2V0
IGZvcik6CisKIDIwMTUtMDctMjQgIFl1c3VrZSBTdXp1a2kgIDx1dGF0YW5lLnRlYUBnbWFpbC5j
b20+CiAKICAgICAgICAgUmVtb3ZlIHJ1bnRpbWUgZmxhZ3MgZm9yIHN5bWJvbHMKICAgICAgICAg
aHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE0NzI0NgogCmRpZmYgLS1n
aXQgYS9Tb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9KU09iamVjdC5jcHAgYi9Tb3VyY2Uv
SmF2YVNjcmlwdENvcmUvcnVudGltZS9KU09iamVjdC5jcHAKaW5kZXggYTU0ZmFjYmRjMTMwZDNi
NDEzMjE5NmIyOTM2ZWE1OWQwZjA0MTc1Ny4uOWQ0OTg0OWVkMzBhZTgyMGQ5ODRiMTNjOWNhNTg5
MWJlOTBiMGQxMSAxMDA2NDQKLS0tIGEvU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvSlNP
YmplY3QuY3BwCisrKyBiL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0pTT2JqZWN0LmNw
cApAQCAtMjIxOCw5ICsyMjE4LDEwIEBAIGJvb2wgSlNPYmplY3Q6OnB1dERpcmVjdEluZGV4QmV5
b25kVmVjdG9yTGVuZ3RoKEV4ZWNTdGF0ZSogZXhlYywgdW5zaWduZWQgaSwgSlNWCiAgICAgfQog
ICAgICAgICAKICAgICBjYXNlIEFMTF9JTlQzMl9JTkRFWElOR19UWVBFUzogewotICAgICAgICBp
ZiAoYXR0cmlidXRlcyAmIChSZWFkT25seSB8IEFjY2Vzc29yKSkgewotICAgICAgICAgICAgcmV0
dXJuIHB1dERpcmVjdEluZGV4QmV5b25kVmVjdG9yTGVuZ3RoV2l0aEFycmF5U3RvcmFnZSgKLSAg
ICAgICAgICAgICAgICBleGVjLCBpLCB2YWx1ZSwgYXR0cmlidXRlcywgbW9kZSwgY29udmVydElu
dDMyVG9BcnJheVN0b3JhZ2Uodm0pKTsKKyAgICAgICAgaWYgKGF0dHJpYnV0ZXMpIHsKKyAgICAg
ICAgICAgIGlmIChpIDwgbV9idXR0ZXJmbHktPnZlY3Rvckxlbmd0aCgpKQorICAgICAgICAgICAg
ICAgIHJldHVybiBwdXREaXJlY3RJbmRleEJleW9uZFZlY3Rvckxlbmd0aFdpdGhBcnJheVN0b3Jh
Z2UoZXhlYywgaSwgdmFsdWUsIGF0dHJpYnV0ZXMsIG1vZGUsIGVuc3VyZUFycmF5U3RvcmFnZUV4
aXN0c0FuZEVudGVyRGljdGlvbmFyeUluZGV4aW5nTW9kZSh2bSkpOworICAgICAgICAgICAgcmV0
dXJuIHB1dERpcmVjdEluZGV4QmV5b25kVmVjdG9yTGVuZ3RoV2l0aEFycmF5U3RvcmFnZShleGVj
LCBpLCB2YWx1ZSwgYXR0cmlidXRlcywgbW9kZSwgY29udmVydEludDMyVG9BcnJheVN0b3JhZ2Uo
dm0pKTsKICAgICAgICAgfQogICAgICAgICBpZiAoIXZhbHVlLmlzSW50MzIoKSkgewogICAgICAg
ICAgICAgY29udmVydEludDMyRm9yVmFsdWUodm0sIHZhbHVlKTsKQEAgLTIyMzEsOSArMjIzMiwx
MCBAQCBib29sIEpTT2JqZWN0OjpwdXREaXJlY3RJbmRleEJleW9uZFZlY3Rvckxlbmd0aChFeGVj
U3RhdGUqIGV4ZWMsIHVuc2lnbmVkIGksIEpTVgogICAgIH0KICAgICAgICAgCiAgICAgY2FzZSBB
TExfRE9VQkxFX0lOREVYSU5HX1RZUEVTOiB7Ci0gICAgICAgIGlmIChhdHRyaWJ1dGVzICYgKFJl
YWRPbmx5IHwgQWNjZXNzb3IpKSB7Ci0gICAgICAgICAgICByZXR1cm4gcHV0RGlyZWN0SW5kZXhC
ZXlvbmRWZWN0b3JMZW5ndGhXaXRoQXJyYXlTdG9yYWdlKAotICAgICAgICAgICAgICAgIGV4ZWMs
IGksIHZhbHVlLCBhdHRyaWJ1dGVzLCBtb2RlLCBjb252ZXJ0RG91YmxlVG9BcnJheVN0b3JhZ2Uo
dm0pKTsKKyAgICAgICAgaWYgKGF0dHJpYnV0ZXMpIHsKKyAgICAgICAgICAgIGlmIChpIDwgbV9i
dXR0ZXJmbHktPnZlY3Rvckxlbmd0aCgpKQorICAgICAgICAgICAgICAgIHJldHVybiBwdXREaXJl
Y3RJbmRleEJleW9uZFZlY3Rvckxlbmd0aFdpdGhBcnJheVN0b3JhZ2UoZXhlYywgaSwgdmFsdWUs
IGF0dHJpYnV0ZXMsIG1vZGUsIGVuc3VyZUFycmF5U3RvcmFnZUV4aXN0c0FuZEVudGVyRGljdGlv
bmFyeUluZGV4aW5nTW9kZSh2bSkpOworICAgICAgICAgICAgcmV0dXJuIHB1dERpcmVjdEluZGV4
QmV5b25kVmVjdG9yTGVuZ3RoV2l0aEFycmF5U3RvcmFnZShleGVjLCBpLCB2YWx1ZSwgYXR0cmli
dXRlcywgbW9kZSwgY29udmVydERvdWJsZVRvQXJyYXlTdG9yYWdlKHZtKSk7CiAgICAgICAgIH0K
ICAgICAgICAgaWYgKCF2YWx1ZS5pc051bWJlcigpKSB7CiAgICAgICAgICAgICBjb252ZXJ0RG91
YmxlVG9Db250aWd1b3VzKHZtKTsKQEAgLTIyNDksMTUgKzIyNTEsMjAgQEAgYm9vbCBKU09iamVj
dDo6cHV0RGlyZWN0SW5kZXhCZXlvbmRWZWN0b3JMZW5ndGgoRXhlY1N0YXRlKiBleGVjLCB1bnNp
Z25lZCBpLCBKU1YKICAgICB9CiAgICAgICAgIAogICAgIGNhc2UgQUxMX0NPTlRJR1VPVVNfSU5E
RVhJTkdfVFlQRVM6IHsKLSAgICAgICAgaWYgKGF0dHJpYnV0ZXMgJiAoUmVhZE9ubHkgfCBBY2Nl
c3NvcikpIHsKLSAgICAgICAgICAgIHJldHVybiBwdXREaXJlY3RJbmRleEJleW9uZFZlY3Rvckxl
bmd0aFdpdGhBcnJheVN0b3JhZ2UoCi0gICAgICAgICAgICAgICAgZXhlYywgaSwgdmFsdWUsIGF0
dHJpYnV0ZXMsIG1vZGUsIGNvbnZlcnRDb250aWd1b3VzVG9BcnJheVN0b3JhZ2Uodm0pKTsKKyAg
ICAgICAgaWYgKGF0dHJpYnV0ZXMpIHsKKyAgICAgICAgICAgIGlmIChpIDwgbV9idXR0ZXJmbHkt
PnZlY3Rvckxlbmd0aCgpKQorICAgICAgICAgICAgICAgIHJldHVybiBwdXREaXJlY3RJbmRleEJl
eW9uZFZlY3Rvckxlbmd0aFdpdGhBcnJheVN0b3JhZ2UoZXhlYywgaSwgdmFsdWUsIGF0dHJpYnV0
ZXMsIG1vZGUsIGVuc3VyZUFycmF5U3RvcmFnZUV4aXN0c0FuZEVudGVyRGljdGlvbmFyeUluZGV4
aW5nTW9kZSh2bSkpOworICAgICAgICAgICAgcmV0dXJuIHB1dERpcmVjdEluZGV4QmV5b25kVmVj
dG9yTGVuZ3RoV2l0aEFycmF5U3RvcmFnZShleGVjLCBpLCB2YWx1ZSwgYXR0cmlidXRlcywgbW9k
ZSwgY29udmVydENvbnRpZ3VvdXNUb0FycmF5U3RvcmFnZSh2bSkpOwogICAgICAgICB9CiAgICAg
ICAgIHB1dEJ5SW5kZXhCZXlvbmRWZWN0b3JMZW5ndGhXaXRob3V0QXR0cmlidXRlczxDb250aWd1
b3VzU2hhcGU+KGV4ZWMsIGksIHZhbHVlKTsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQog
CiAgICAgY2FzZSBBTExfQVJSQVlfU1RPUkFHRV9JTkRFWElOR19UWVBFUzoKKyAgICAgICAgaWYg
KGF0dHJpYnV0ZXMpIHsKKyAgICAgICAgICAgIGlmIChpIDwgbV9idXR0ZXJmbHktPnZlY3Rvckxl
bmd0aCgpKQorICAgICAgICAgICAgICAgIHJldHVybiBwdXREaXJlY3RJbmRleEJleW9uZFZlY3Rv
ckxlbmd0aFdpdGhBcnJheVN0b3JhZ2UoZXhlYywgaSwgdmFsdWUsIGF0dHJpYnV0ZXMsIG1vZGUs
IGVuc3VyZUFycmF5U3RvcmFnZUV4aXN0c0FuZEVudGVyRGljdGlvbmFyeUluZGV4aW5nTW9kZSh2
bSkpOworICAgICAgICB9CiAgICAgICAgIHJldHVybiBwdXREaXJlY3RJbmRleEJleW9uZFZlY3Rv
ckxlbmd0aFdpdGhBcnJheVN0b3JhZ2UoZXhlYywgaSwgdmFsdWUsIGF0dHJpYnV0ZXMsIG1vZGUs
IGFycmF5U3RvcmFnZSgpKTsKICAgICAgICAgCiAgICAgZGVmYXVsdDoKZGlmZiAtLWdpdCBhL1Nv
dXJjZS9KYXZhU2NyaXB0Q29yZS90ZXN0cy9zdHJlc3Mvc3BhcnNlLW1hcC1ub24tb3ZlcmxhcHBp
bmcuanMgYi9Tb3VyY2UvSmF2YVNjcmlwdENvcmUvdGVzdHMvc3RyZXNzL3NwYXJzZS1tYXAtbm9u
LW92ZXJsYXBwaW5nLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjQ3MjMzNjVjODI5ODQxMjIwODYxYzIzYzhlY2M1
OWZjNjQ3ZWFlYzQKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvSmF2YVNjcmlwdENvcmUvdGVz
dHMvc3RyZXNzL3NwYXJzZS1tYXAtbm9uLW92ZXJsYXBwaW5nLmpzCkBAIC0wLDAgKzEsMjYgQEAK
K2Z1bmN0aW9uIHNob3VsZEJlKGFjdHVhbCwgZXhwZWN0ZWQpIHsKKyAgICBpZiAoYWN0dWFsICE9
PSBleHBlY3RlZCkKKyAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdiYWQgdmFsdWU6ICcgKyBhY3R1
YWwpOworfQorCitmdW5jdGlvbiB0ZXN0aW5nKG9iamVjdCkgeworICAgIHZhciB2YWx1ZSA9IG9i
amVjdFsxMDAwXTsKKyAgICBzaG91bGRCZShvYmplY3RbMTAwMF0sIDQyKTsKK30KKwordGVzdGlu
Zyh7CisgICAgMDogMCwKKyAgICAxOiAxLAorICAgIDEwMDA6IDQyCit9KTsKKwordmFyIG9iamVj
dCA9IHsKKyAgICAwOiAwLAorICAgIGdldCAxMDAwKCkgeworICAgICAgICByZXR1cm4gNDI7Cisg
ICAgfSwKKyAgICAxOiAxLAorfTsKK3Rlc3Rpbmcob2JqZWN0KTsKK3Nob3VsZEJlKG9iamVjdFsw
XSwgMCk7CitzaG91bGRCZShvYmplY3RbMV0sIDEpOwpkaWZmIC0tZ2l0IGEvU291cmNlL0phdmFT
Y3JpcHRDb3JlL3Rlc3RzL3N0cmVzcy9zcGFyc2UtbWFwLW5vbi1za2lwLWdldHRlci1vdmVycmlk
aW5nLmpzIGIvU291cmNlL0phdmFTY3JpcHRDb3JlL3Rlc3RzL3N0cmVzcy9zcGFyc2UtbWFwLW5v
bi1za2lwLWdldHRlci1vdmVycmlkaW5nLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjQ4YmY4MWM1YTQ2ZTllNmEw
YjljZTVhMDRiYzFlMDY4MGJiYzYxZmQKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvSmF2YVNj
cmlwdENvcmUvdGVzdHMvc3RyZXNzL3NwYXJzZS1tYXAtbm9uLXNraXAtZ2V0dGVyLW92ZXJyaWRp
bmcuanMKQEAgLTAsMCArMSwyMSBAQAorZnVuY3Rpb24gc2hvdWxkQmUoYWN0dWFsLCBleHBlY3Rl
ZCkgeworICAgIGlmIChhY3R1YWwgIT09IGV4cGVjdGVkKQorICAgICAgICB0aHJvdyBuZXcgRXJy
b3IoJ2JhZCB2YWx1ZTogJyArIGFjdHVhbCk7Cit9CisKK3ZhciBvYmogPSB7CisgICAgMDogMCwK
KyAgICAxOiAxLAorICAgIGdldCAxKCkgeworICAgICAgICByZXR1cm4gNDI7CisgICAgfQorfTsK
KworZnVuY3Rpb24gdGVzdGluZyhvYmplY3QpIHsKKyAgICBzaG91bGRCZShvYmplY3RbMV0sIDQy
KTsKKyAgICBzaG91bGRCZShvYmpbMF0sIDApOworfQorbm9JbmxpbmUodGVzdGluZyk7CisKK2Zv
ciAodmFyIGkgPSAwOyBpIDwgMTAwMDA7ICsraSkKKyAgICB0ZXN0aW5nKG9iaik7CmRpZmYgLS1n
aXQgYS9Tb3VyY2UvSmF2YVNjcmlwdENvcmUvdGVzdHMvc3RyZXNzL3NwYXJzZS1tYXAtbm9uLXNr
aXAuanMgYi9Tb3VyY2UvSmF2YVNjcmlwdENvcmUvdGVzdHMvc3RyZXNzL3NwYXJzZS1tYXAtbm9u
LXNraXAuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMC4uZmIzN2Q0NThjMGJhZDg5MTgxNGQwMDYzMWJkZDUzODU5MWYy
MzMxZgotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS90ZXN0cy9zdHJl
c3Mvc3BhcnNlLW1hcC1ub24tc2tpcC5qcwpAQCAtMCwwICsxLDQ0IEBACitmdW5jdGlvbiBzaG91
bGRCZShhY3R1YWwsIGV4cGVjdGVkKSB7CisgICAgaWYgKGFjdHVhbCAhPT0gZXhwZWN0ZWQpCisg
ICAgICAgIHRocm93IG5ldyBFcnJvcignYmFkIHZhbHVlOiAnICsgYWN0dWFsKTsKK30KKworZnVu
Y3Rpb24gdGVzdGluZyhvYmplY3QpIHsKKyAgICBzaG91bGRCZShvYmplY3RbMF0sIDApOworICAg
IHNob3VsZEJlKG9iamVjdFsxXSwgMSk7CisgICAgc2hvdWxkQmUob2JqZWN0WzJdLCAiU3RyaW5n
Iik7Cit9Citub0lubGluZSh0ZXN0aW5nKTsKKworZnVuY3Rpb24gdGVzdGluZzIob2JqZWN0KSB7
CisgICAgc2hvdWxkQmUob2JqZWN0WzBdLCAwKTsKKyAgICBzaG91bGRCZShvYmplY3RbMV0sIDEp
OworICAgIHNob3VsZEJlKG9iamVjdFsyXSwgIlN0cmluZyIpOworfQorbm9JbmxpbmUodGVzdGlu
ZzIpOworCitmb3IgKHZhciBpID0gMDsgaSA8IDEwMDAwOyArK2kpCisgICAgdGVzdGluZyh7Cisg
ICAgICAgIDA6IDAsCisgICAgICAgIDE6IDEsCisgICAgICAgIDI6ICJTdHJpbmciCisgICAgfSk7
CisKK3Rlc3RpbmcoeworICAgIDA6IDAsCisgICAgZ2V0IDEoKSB7CisgICAgICAgIHJldHVybiAx
OworICAgIH0sCisgICAgMjogIlN0cmluZyIKK30pOworCitmb3IgKHZhciBpID0gMDsgaSA8IDEw
MDAwOyArK2kpCisgICAgdGVzdGluZzIoeworICAgICAgICAwOiAwLAorICAgICAgICBnZXQgMSgp
IHsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9LAorICAgICAgICAyOiAiU3RyaW5n
IgorICAgIH0pOworCisvKiB2aW06IHNldCBzdz00IHRzPTQgZXQgdHc9ODAgOiAqLwpkaWZmIC0t
Z2l0IGEvTGF5b3V0VGVzdHMvQ2hhbmdlTG9nIGIvTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCmluZGV4
IGEzY2ViZjY3ZmY4NWNjOWJlZmQwMTU0ZjY1Y2MzMDZjYzEwMjQ5N2UuLjVhZDE4YjZmN2E2NGZk
ZTYyMjU3YTM5MmJhMzk3MTBlMDQ2Mjc3ZmIgMTAwNjQ0Ci0tLSBhL0xheW91dFRlc3RzL0NoYW5n
ZUxvZworKysgYi9MYXlvdXRUZXN0cy9DaGFuZ2VMb2cKQEAgLTEsNSArMSwyMCBAQAogMjAxNS0w
Ny0yNCAgWXVzdWtlIFN1enVraSAgPHV0YXRhbmUudGVhQGdtYWlsLmNvbT4KIAorICAgICAgICBT
cGFyc2VWYWx1ZU1hcCBjaGVjayBpcyBza2lwcGVkIHdoZW4gdGhlIGJ1dHRlcmZseSdzIHZlY3Rv
ckxlbmd0aCBpcyBsYXJnZXIgdGhhbiB0aGUgYWNjZXNzLXJlcXVlc3RlZCBpbmRleAorICAgICAg
ICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTQ3MjY1CisKKyAgICAg
ICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgVGhlIHByZXZpb3VzIHRl
c3QgImJhc2ljLWNvbXB1dGVkLXByb3BlcnR5LW5hbWUuanMiIGhhcyB0aGUgaXNzdWVbMV0gYW5k
CisgICAgICAgIHRoZSBpc3N1ZSBpcyBmaXhlZCBieSB0aGlzIHBhdGNoLgorCisgICAgICAgIFsx
XTogaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE0Mjk0MworCisgICAg
ICAgICoganMvYmFzaWMtY29tcHV0ZWQtcHJvcGVydHktbmFtZS1leHBlY3RlZC50eHQ6CisgICAg
ICAgICoganMvc2NyaXB0LXRlc3RzL2Jhc2ljLWNvbXB1dGVkLXByb3BlcnR5LW5hbWUuanM6CisK
KzIwMTUtMDctMjQgIFl1c3VrZSBTdXp1a2kgIDx1dGF0YW5lLnRlYUBnbWFpbC5jb20+CisKICAg
ICAgICAgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyBvbiBsYXJnZSBsaXN0IHRha2VzIHZl
cnkgbG9uZwogICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9
MTQ2MTM3CiAKZGlmZiAtLWdpdCBhL0xheW91dFRlc3RzL2pzL2Jhc2ljLWNvbXB1dGVkLXByb3Bl
cnR5LW5hbWUtZXhwZWN0ZWQudHh0IGIvTGF5b3V0VGVzdHMvanMvYmFzaWMtY29tcHV0ZWQtcHJv
cGVydHktbmFtZS1leHBlY3RlZC50eHQKaW5kZXggMTdhMWU2YmUzM2Y5YzU0NWIyMWExZDYwM2Ri
ODBiNzQ1NWM4ZmRjNS4uOTM4MzczYjkxOWRmZTFjY2FkNmViMmMzNmQxN2QxMWEyMTRkZTc4MyAx
MDA2NDQKLS0tIGEvTGF5b3V0VGVzdHMvanMvYmFzaWMtY29tcHV0ZWQtcHJvcGVydHktbmFtZS1l
eHBlY3RlZC50eHQKKysrIGIvTGF5b3V0VGVzdHMvanMvYmFzaWMtY29tcHV0ZWQtcHJvcGVydHkt
bmFtZS1leHBlY3RlZC50eHQKQEAgLTQ1LDkgKzQ1LDkgQEAgUEFTUyAoZnVuY3Rpb24oKXsndXNl
IHN0cmljdCc7cmV0dXJuICh7W2FdOiBmYWxzZSwgMDogdHJ1ZX1bMF0pfSkoKSBpcyB0cnVlCiBQ
QVNTICh7Z2V0ICcwJygpeyByZXR1cm4gZmFsc2U7IH0sIFthXTogdHJ1ZX1bMF0pIGlzIHRydWUK
IFBBU1MgJ3VzZSBzdHJpY3QnOyh7Z2V0ICcwJygpeyByZXR1cm4gZmFsc2U7IH0sIFthXTogdHJ1
ZX1bMF0pIGlzIHRydWUKIFBBU1MgKGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO3JldHVybiAoe2dl
dCAnMCcoKXsgcmV0dXJuIGZhbHNlOyB9LCBbYV06IHRydWV9WzBdKX0pKCkgaXMgdHJ1ZQotUEFT
UyAoe1thXTogdHJ1ZSwgZ2V0ICcwJygpeyByZXR1cm4gZmFsc2U7IH19WzBdKSBpcyB0cnVlCi1Q
QVNTICd1c2Ugc3RyaWN0Jzsoe1thXTogdHJ1ZSwgZ2V0ICcwJygpeyByZXR1cm4gZmFsc2U7IH19
WzBdKSBpcyB0cnVlCi1QQVNTIChmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztyZXR1cm4gKHtbYV06
IHRydWUsIGdldCAnMCcoKXsgcmV0dXJuIGZhbHNlOyB9fVswXSl9KSgpIGlzIHRydWUKK1BBU1Mg
KHtbYV06IGZhbHNlLCBnZXQgJzAnKCl7IHJldHVybiB0cnVlOyB9fVswXSkgaXMgdHJ1ZQorUEFT
UyAndXNlIHN0cmljdCc7KHtbYV06IGZhbHNlLCBnZXQgJzAnKCl7IHJldHVybiB0cnVlOyB9fVsw
XSkgaXMgdHJ1ZQorUEFTUyAoZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7cmV0dXJuICh7W2FdOiBm
YWxzZSwgZ2V0ICcwJygpeyByZXR1cm4gdHJ1ZTsgfX1bMF0pfSkoKSBpcyB0cnVlCiBQQVNTICh7
X19wcm90b19fOiB7Z2V0ICcwJygpeyByZXR1cm4gZmFsc2U7IH19LCBbYV06IHRydWV9WzBdKSBp
cyB0cnVlCiBQQVNTICd1c2Ugc3RyaWN0Jzsoe19fcHJvdG9fXzoge2dldCAnMCcoKXsgcmV0dXJu
IGZhbHNlOyB9fSwgW2FdOiB0cnVlfVswXSkgaXMgdHJ1ZQogUEFTUyAoZnVuY3Rpb24oKXsndXNl
IHN0cmljdCc7cmV0dXJuICh7X19wcm90b19fOiB7Z2V0ICcwJygpeyByZXR1cm4gZmFsc2U7IH19
LCBbYV06IHRydWV9WzBdKX0pKCkgaXMgdHJ1ZQpkaWZmIC0tZ2l0IGEvTGF5b3V0VGVzdHMvanMv
c2NyaXB0LXRlc3RzL2Jhc2ljLWNvbXB1dGVkLXByb3BlcnR5LW5hbWUuanMgYi9MYXlvdXRUZXN0
cy9qcy9zY3JpcHQtdGVzdHMvYmFzaWMtY29tcHV0ZWQtcHJvcGVydHktbmFtZS5qcwppbmRleCAz
YzA2YTFlZjhiODE3NWY3NmRlZWNkY2Y4YWU1NDIxYzJiODE0Y2NmLi44N2IzY2ZlY2QyOTU3MzY2
MjE2MjUzNzFmZGJjOTdkNWQyNjk3OGNhIDEwMDY0NAotLS0gYS9MYXlvdXRUZXN0cy9qcy9zY3Jp
cHQtdGVzdHMvYmFzaWMtY29tcHV0ZWQtcHJvcGVydHktbmFtZS5qcworKysgYi9MYXlvdXRUZXN0
cy9qcy9zY3JpcHQtdGVzdHMvYmFzaWMtY29tcHV0ZWQtcHJvcGVydHktbmFtZS5qcwpAQCAtMjUs
NyArMjUsNyBAQCBmdW5jdGlvbiBydW5UZXN0KHRlc3QpCiBydW5UZXN0KCJ7MDogZmFsc2UsIFth
XTogdHJ1ZX1bMF0iKQogcnVuVGVzdCgie1thXTogZmFsc2UsIDA6IHRydWV9WzBdIikKIHJ1blRl
c3QoIntnZXQgJzAnKCl7IHJldHVybiBmYWxzZTsgfSwgW2FdOiB0cnVlfVswXSIpCi1ydW5UZXN0
KCJ7W2FdOiB0cnVlLCBnZXQgJzAnKCl7IHJldHVybiBmYWxzZTsgfX1bMF0iKQorcnVuVGVzdCgi
e1thXTogZmFsc2UsIGdldCAnMCcoKXsgcmV0dXJuIHRydWU7IH19WzBdIikKIHJ1blRlc3QoIntf
X3Byb3RvX186IHtnZXQgJzAnKCl7IHJldHVybiBmYWxzZTsgfX0sIFthXTogdHJ1ZX1bMF0iKQog
CiBmdW5jdGlvbiBydW5UZXN0VGhyb3codGVzdCkK
</data>
<flag name="review"
          id="282654"
          type_id="1"
          status="+"
          setter="ggaren"
    />
          </attachment>
      

    </bug>

</bugzilla>