<?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>171384</bug_id>
          
          <creation_ts>2017-04-27 11:37:44 -0700</creation_ts>
          <short_desc>bmalloc scavenger should know what page classes are allocating</short_desc>
          <delta_ts>2017-04-27 17:37:52 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>bmalloc</component>
          <version>WebKit 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>InRadar</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Michael Saboff">msaboff</reporter>
          <assigned_to name="Michael Saboff">msaboff</assigned_to>
          <cc>ggaren</cc>
    
    <cc>webkit-bug-importer</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1302199</commentid>
    <comment_count>0</comment_count>
    <who name="Michael Saboff">msaboff</who>
    <bug_when>2017-04-27 11:37:44 -0700</bug_when>
    <thetext>The scavenging process has one flag to indicate that bmalloc is allocating VM heap memory for any class.  When we scavenge, we check this flag and wait for any allocations to complete.  Instead we should keep a flag for every page size class and skip classes that are currently allocating and come back to them later.

&lt;rdar://problem/31868122&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1302202</commentid>
    <comment_count>1</comment_count>
      <attachid>308418</attachid>
    <who name="Michael Saboff">msaboff</who>
    <bug_when>2017-04-27 11:45:58 -0700</bug_when>
    <thetext>Created attachment 308418
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1302223</commentid>
    <comment_count>2</comment_count>
      <attachid>308418</attachid>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2017-04-27 12:20:14 -0700</bug_when>
    <thetext>Comment on attachment 308418
Patch

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

We need to measure MallocBench with this change.

&gt; Source/bmalloc/bmalloc/Heap.cpp:119
&gt; +    m_isPageClassAllocating.fill(false);

The default constructor does this for us. You can remove this.

&gt; Source/bmalloc/bmalloc/Heap.cpp:-136
&gt; -    waitUntilFalse(lock, sleepDuration, m_isAllocatingPages);

I think we still want this initial wait. Otherwise, we&apos;ll reclaim everything before we have time to learn that we&apos;re still allocating pages.

&gt; Source/bmalloc/bmalloc/Heap.cpp:159
&gt; +                allocationInProgress = true;
&gt; +                break;

Instead of taking an out parameter, we should just reschedule ourselves here when we learn that we have more work to do.

&gt; Source/bmalloc/bmalloc/Heap.cpp:163
&gt;              m_vmHeap.deallocateSmallPage(lock, pageClass, page);

I think it&apos;s a pre-existing bug that we don&apos;t drop the lock around the system call, like we do in scavengeLargeObjects. We should probably fix that too.

&gt; Source/bmalloc/bmalloc/Heap.cpp:183
&gt; +            allocationInProgress = true;
&gt; +            break;

Ditto.

Also, I would put this check at the top of the loop. Otherwise, you always deallocate one.

&gt; Source/bmalloc/bmalloc/Heap.h:120
&gt; +    std::array&lt;bool, pageClassCount + 1&gt; m_isPageClassAllocating; // Extra class is for large objects.

Let&apos;s call this m_isAllocatingPages and only use pageClassCount items.

&gt; Source/bmalloc/bmalloc/Heap.h:121
&gt; +#define isAllocatingLargePages m_isPageClassAllocating[pageClassCount]

Let&apos;s make this a data member instead of a #define: m_largeIsAllocatingPages.

&gt; Source/bmalloc/bmalloc/bmalloc.h:79
&gt; -    PerProcess&lt;Heap&gt;::get()-&gt;scavenge(lock, std::chrono::milliseconds(0));
&gt; +    PerProcess&lt;Heap&gt;::get()-&gt;scavenge(lock);

I think we&apos;ve lost the behavior where this function should synchronously guarantee (or nearly guarantee) a complete scavenge before any new allocations took place. That&apos;s an important thing to do in memory measurement and also in our critical memory warning handler.

One option, which is a little gross, is to pass a fake mutex to our callee, so the lock never actually unlocks. Another option is to pass a bool/enum parameter that says whether to unlock or not. Or maybe pass some kind of helper lambda or object for unlocking.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1302277</commentid>
    <comment_count>3</comment_count>
      <attachid>308418</attachid>
    <who name="Michael Saboff">msaboff</who>
    <bug_when>2017-04-27 14:06:44 -0700</bug_when>
    <thetext>Comment on attachment 308418
Patch

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

&gt;&gt; Source/bmalloc/bmalloc/Heap.cpp:163
&gt;&gt;              m_vmHeap.deallocateSmallPage(lock, pageClass, page);
&gt; 
&gt; I think it&apos;s a pre-existing bug that we don&apos;t drop the lock around the system call, like we do in scavengeLargeObjects. We should probably fix that too.

We do drop the lock in VMHeap::deallocateSmallPage().</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1302279</commentid>
    <comment_count>4</comment_count>
      <attachid>308441</attachid>
    <who name="Michael Saboff">msaboff</who>
    <bug_when>2017-04-27 14:07:18 -0700</bug_when>
    <thetext>Created attachment 308441
Updated patch addressing review comments</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1302280</commentid>
    <comment_count>5</comment_count>
    <who name="Michael Saboff">msaboff</who>
    <bug_when>2017-04-27 14:07:52 -0700</bug_when>
    <thetext>I&apos;ll run MallocBench shortly and post the results before/after.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1302305</commentid>
    <comment_count>6</comment_count>
      <attachid>308441</attachid>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2017-04-27 14:40:29 -0700</bug_when>
    <thetext>Comment on attachment 308441
Updated patch addressing review comments

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

r=me

&gt; Source/bmalloc/bmalloc/VMHeap.h:44
&gt; +typedef enum { DeallocateSynchronously, DeallocateAsynchronously } DeallocationMode;

This should be an enum class. Then you get better type safety and you don&apos;t need to put the class name in the value names.

I&apos;d call this &quot;enum class { Sync, Async } ScavengeMode&quot;.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1302393</commentid>
    <comment_count>7</comment_count>
    <who name="Michael Saboff">msaboff</who>
    <bug_when>2017-04-27 16:44:51 -0700</bug_when>
    <thetext>Here are the MallocBench results running on an iOS device:
                                                Baseline	 WithPatch
Execution Time:	
    message_one                                    155ms	     164ms
    message_many                                   162ms	     143ms
    churn --parallel                                41ms	      38ms
    list_allocate --parallel                        76ms	      81ms
    tree_allocate --parallel                        96ms	     115ms
    tree_churn --parallel                           76ms	      75ms
    facebook --parallel                            732ms	     775ms
    reddit --parallel                              422ms	     465ms
    flickr --parallel                              456ms	     486ms
    theverge --parallel                            604ms	     651ms
	
    &lt;geometric mean&gt;                               186ms	     193ms
    &lt;arithmetic mean&gt;                              282ms	     299ms
    &lt;harmonic mean&gt;                                123ms	     124ms
	
Peak Memory:	
    message_one                                  6,176kB	   5,872kB
    message_many                                18,672kB	  10,992kB
    churn --parallel                             2,032kB	   2,112kB
    list_allocate --parallel                     3,680kB	   3,696kB
    tree_allocate --parallel                     5,856kB	   5,456kB
    tree_churn --parallel                        5,296kB	   5,168kB
    facebook --parallel                        399,568kB	 406,000kB
    reddit --parallel                           77,552kB	  80,576kB
    flickr --parallel                          147,904kB	 148,944kB
    theverge --parallel                        159,408kB	 160,112kB
	
    &lt;geometric mean&gt;                            21,335kB	  20,159kB
    &lt;arithmetic mean&gt;                           82,614kB	  82,893kB
    &lt;harmonic mean&gt;                              7,313kB	   7,093kB
	
Memory at End:	
    message_one                                  1,120kB	   1,056kB
    message_many                                 1,824kB	   1,760kB
    churn --parallel                             1,152kB	   1,232kB
    list_allocate --parallel                     1,520kB	   1,456kB
    tree_allocate --parallel                     1,792kB	   1,744kB
    tree_churn --parallel                        2,240kB	   2,336kB
    facebook --parallel                         15,872kB	  16,560kB
    reddit --parallel                            9,872kB	  10,720kB
    flickr --parallel                           14,000kB	  14,464kB
    theverge --parallel                         11,568kB	  11,424kB
	
    &lt;geometric mean&gt;                             3,599kB	   3,631kB
    &lt;arithmetic mean&gt;                            6,096kB	   6,275kB
    &lt;harmonic mean&gt;                              2,329kB	   2,312kB</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1302412</commentid>
    <comment_count>8</comment_count>
    <who name="Michael Saboff">msaboff</who>
    <bug_when>2017-04-27 17:04:17 -0700</bug_when>
    <thetext>Here are the full set of MallocBench tests:
                                                      Baseline	       WithPatch
Execution Time:	
    churn                                                 56ms	            56ms
    list_allocate                                         46ms	            46ms
    tree_allocate                                         53ms	            53ms
    tree_churn                                            51ms	            51ms
    fragment                                              41ms	            42ms
    fragment_iterate                                      40ms	            40ms
    medium                                               191ms	           190ms
    big                                                   53ms	            64ms
    facebook                                             139ms	           137ms
    reddit                                                86ms	            86ms
    flickr                                                89ms	            89ms
    theverge                                             109ms	           108ms
    nimlang                                               81ms	            81ms
    message_one                                          165ms	           165ms
    message_many                                         211ms	           212ms
    churn --parallel                                      39ms	            42ms
    list_allocate --parallel                              82ms	            82ms
    tree_allocate --parallel                             106ms	            98ms
    tree_churn --parallel                                 80ms	            69ms
    fragment --parallel                                   46ms	            39ms
    fragment_iterate --parallel                           19ms	            17ms
    medium --parallel                                    112ms	           114ms
    big --parallel                                        90ms	            84ms
    facebook --parallel                                  824ms	           860ms
    reddit --parallel                                    480ms	           470ms
    flickr --parallel                                    484ms	           497ms
    theverge --parallel                                  641ms	           669ms
	
    &lt;geometric mean&gt;                                     100ms	           100ms
    &lt;arithmetic mean&gt;                                    163ms	           165ms
    &lt;harmonic mean&gt;                                       72ms	            71ms
	
Peak Memory:	
    churn                                              1,760kB	         1,760kB
    list_allocate                                      3,024kB	         3,024kB
    tree_allocate                                      6,384kB	         6,496kB
    tree_churn                                         5,824kB	         5,824kB
    fragment                                           7,904kB	         7,952kB
    fragment_iterate                                  26,672kB	        26,640kB
    medium                                         1,194,560kB	     1,193,968kB
    big                                            1,088,224kB	     1,088,192kB
    facebook                                          74,496kB	        74,592kB
    reddit                                            15,648kB	        15,712kB
    flickr                                            28,000kB	        28,000kB
    theverge                                          28,656kB	        28,656kB
    nimlang                                          178,016kB	       178,096kB
    message_one                                        6,336kB	         6,256kB
    message_many                                      23,776kB	        22,720kB
    churn --parallel                                   2,128kB	         2,048kB
    list_allocate --parallel                           3,728kB	         3,664kB
    tree_allocate --parallel                           5,632kB	         5,504kB
    tree_churn --parallel                              5,216kB	         5,280kB
    fragment --parallel                                8,096kB	         8,144kB
    fragment_iterate --parallel                       26,960kB	        27,056kB
    medium --parallel                              1,159,216kB	     1,162,448kB
    big --parallel                                 1,046,768kB	     1,064,368kB
    facebook --parallel                              407,200kB	       407,456kB
    reddit --parallel                                 79,888kB	        80,064kB
    flickr --parallel                                147,472kB	       148,336kB
    theverge --parallel                              157,200kB	       159,744kB
	
    &lt;geometric mean&gt;                                  32,446kB	        32,394kB
    &lt;arithmetic mean&gt;                                212,548kB	       213,407kB
    &lt;harmonic mean&gt;                                    8,869kB	         8,799kB
	
Memory at End:	
    churn                                                864kB	           864kB
    list_allocate                                        864kB	           864kB
    tree_allocate                                        816kB	           928kB
    tree_churn                                           928kB	           928kB
    fragment                                             880kB	           928kB
    fragment_iterate                                   1,216kB	         1,184kB
    medium                                            19,824kB	        19,712kB
    big                                                2,112kB	         2,080kB
    facebook                                           1,328kB	         1,360kB
    reddit                                             1,024kB	         1,088kB
    flickr                                             1,152kB	         1,152kB
    theverge                                           1,264kB	         1,264kB
    nimlang                                           59,712kB	        59,792kB
    message_one                                        1,264kB	         1,168kB
    message_many                                       1,888kB	         2,000kB
    churn --parallel                                   1,248kB	         1,168kB
    list_allocate --parallel                           1,504kB	         1,440kB
    tree_allocate --parallel                           1,680kB	         1,760kB
    tree_churn --parallel                              2,304kB	         2,192kB
    fragment --parallel                                2,464kB	         2,160kB
    fragment_iterate --parallel                        1,680kB	         1,696kB
    medium --parallel                                 25,328kB	        27,472kB
    big --parallel                                    24,800kB	        22,784kB
    facebook --parallel                               15,392kB	        16,016kB
    reddit --parallel                                 10,512kB	        10,656kB
    flickr --parallel                                 14,144kB	        13,840kB
    theverge --parallel                               11,152kB	        11,424kB
	
    &lt;geometric mean&gt;                                   2,913kB	         2,915kB
    &lt;arithmetic mean&gt;                                  7,679kB	         7,701kB
    &lt;harmonic mean&gt;                                    1,717kB	         1,727kB</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1302420</commentid>
    <comment_count>9</comment_count>
    <who name="Michael Saboff">msaboff</who>
    <bug_when>2017-04-27 17:37:52 -0700</bug_when>
    <thetext>Committed r215909: &lt;http://trac.webkit.org/changeset/215909&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>308418</attachid>
            <date>2017-04-27 11:45:58 -0700</date>
            <delta_ts>2017-04-27 14:07:18 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>171384.patch</filename>
            <type>text/plain</type>
            <size>8435</size>
            <attacher name="Michael Saboff">msaboff</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9ibWFsbG9jL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvYm1h
bGxvYy9DaGFuZ2VMb2cJKHJldmlzaW9uIDIxNTg4MikKKysrIFNvdXJjZS9ibWFsbG9jL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDMxIEBACisyMDE3LTA0LTI3ICBNaWNoYWVs
IFNhYm9mZiAgPG1zYWJvZmZAYXBwbGUuY29tPgorCisgICAgICAgIGJtYWxsb2Mgc2NhdmVuZ2Vy
IHNob3VsZCBrbm93IHdoYXQgcGFnZSBjbGFzc2VzIGFyZSBhbGxvY2F0aW5nCisgICAgICAgIGh0
dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNzEzODQKKworICAgICAgICBS
ZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBUaGlzIGNoYW5nZSByZXBsYWNl
cyBtX2lzQWxsb2NhdGluZ1BhZ2VzIHdpdGggYSBwZXIgcGFnZSBjbGFzcyBmbGFnIHRvIHRyYWNr
IHdoaWNoIHBhZ2UKKyAgICAgICAgY2xhc3NlcyBhcmUgY3VycmVudGx5IGFsbG9jYXRpbmcuICBX
aGVuIHNjYXZlbmdpbmcsIHdlIHNraXAgcGFnZSBjbGFzc2VzIHRoYXQgYXJlIGFjdGl2ZWx5Cisg
ICAgICAgIGFsbG9jYXRpbmcgYW5kIGNvbWUgYmFjayB0byB0aGVtIG9uIGEgc3Vic2VxdWVudCBw
YXNzLiAgVGhpcyByZWR1Y2VzIHRoZSBhbW91bnQgb2YgdGltZSBpdAorICAgICAgICB0YWtlcyBm
b3Igc2NhdmVuZ2VyIHRvIGZyZWUgdXAgcGFnZXMgYXMgd2VsbCBhcyB0aGUgdG90YWwgdGltZSBp
dCB0YWtlcyB0byBoYW5kbGUgYWxsCisgICAgICAgIHBhZ2UgY2xhc3Nlcy4KKworICAgICAgICAq
IGJtYWxsb2MvSGVhcC5jcHA6CisgICAgICAgIChibWFsbG9jOjpIZWFwOjpIZWFwKToKKyAgICAg
ICAgKGJtYWxsb2M6OkhlYXA6OmluaXRpYWxpemVQYWdlTWV0YWRhdGEpOgorICAgICAgICAoYm1h
bGxvYzo6SGVhcDo6Y29uY3VycmVudFNjYXZlbmdlKToKKyAgICAgICAgKGJtYWxsb2M6OkhlYXA6
OnNjYXZlbmdlKToKKyAgICAgICAgKGJtYWxsb2M6OkhlYXA6OnNjYXZlbmdlU21hbGxQYWdlcyk6
CisgICAgICAgIChibWFsbG9jOjpIZWFwOjpzY2F2ZW5nZUxhcmdlT2JqZWN0cyk6CisgICAgICAg
IChibWFsbG9jOjpIZWFwOjphbGxvY2F0ZVNtYWxsUGFnZSk6CisgICAgICAgIChibWFsbG9jOjpI
ZWFwOjpzcGxpdEFuZEFsbG9jYXRlKToKKyAgICAgICAgKGJtYWxsb2M6OkhlYXA6OmRlYWxsb2Nh
dGVMYXJnZSk6CisgICAgICAgICogYm1hbGxvYy9IZWFwLmg6CisgICAgICAgIChibWFsbG9jOjpI
ZWFwOjp0YWtlUmVxdWVzdGVkU2NhdmVuZ2VyVGhyZWFkUU9TQ2xhc3MpOiBEZWxldGVkLgorICAg
ICAgICAqIGJtYWxsb2MvYm1hbGxvYy5oOgorICAgICAgICAoYm1hbGxvYzo6YXBpOjpzY2F2ZW5n
ZSk6CisKIDIwMTctMDQtMjUgIE1pY2hhZWwgU2Fib2ZmICA8bXNhYm9mZkBhcHBsZS5jb20+CiAK
ICAgICAgICAgQ2FsbCBibWFsbG9jIHNjYXZlbmdlciBmaXJzdCB3aGVuIGhhbmRsaW5nIGEgbWVt
b3J5IHByZXNzdXJlIGV2ZW50CkluZGV4OiBTb3VyY2UvYm1hbGxvYy9ibWFsbG9jL0hlYXAuY3Bw
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9ibWFsbG9jL2JtYWxsb2MvSGVhcC5jcHAJKHJldmlzaW9u
IDIxNTg1MSkKKysrIFNvdXJjZS9ibWFsbG9jL2JtYWxsb2MvSGVhcC5jcHAJKHdvcmtpbmcgY29w
eSkKQEAgLTM4LDkgKzM4LDEwIEBACiAKIG5hbWVzcGFjZSBibWFsbG9jIHsKIAorYm9vbCBIZWFw
OjpkZWZhdWx0Qm9vbFBhcmFtID0gZmFsc2U7CisgICAgCiBIZWFwOjpIZWFwKHN0ZDo6bG9ja19n
dWFyZDxTdGF0aWNNdXRleD4mKQogICAgIDogbV92bVBhZ2VTaXplUGh5c2ljYWwodm1QYWdlU2l6
ZVBoeXNpY2FsKCkpCi0gICAgLCBtX2lzQWxsb2NhdGluZ1BhZ2VzKGZhbHNlKQogICAgICwgbV9z
Y2F2ZW5nZXIoKnRoaXMsICZIZWFwOjpjb25jdXJyZW50U2NhdmVuZ2UpCiAgICAgLCBtX2RlYnVn
SGVhcChudWxscHRyKQogewpAQCAtMTE1LDQ1ICsxMTYsNTYgQEAgdm9pZCBIZWFwOjppbml0aWFs
aXplUGFnZU1ldGFkYXRhKCkKICAgICAgICAgcmV0dXJuIHBhZ2VTaXplTWF4OwogICAgIH07CiAK
KyAgICBtX2lzUGFnZUNsYXNzQWxsb2NhdGluZy5maWxsKGZhbHNlKTsKKwogICAgIGZvciAoc2l6
ZV90IGkgPSAwOyBpIDwgc2l6ZUNsYXNzQ291bnQ7ICsraSkKICAgICAgICAgbV9wYWdlQ2xhc3Nl
c1tpXSA9IChjb21wdXRlUGFnZVNpemUoaSkgLSAxKSAvIHNtYWxsUGFnZVNpemU7CiB9CiAKIHZv
aWQgSGVhcDo6Y29uY3VycmVudFNjYXZlbmdlKCkKIHsKLSAgICBzdGQ6OnVuaXF1ZV9sb2NrPFN0
YXRpY011dGV4PiBsb2NrKFBlclByb2Nlc3M8SGVhcD46Om11dGV4KCkpOwotCiAjaWYgQk9TKERB
UldJTikKLSAgICBpZiAoYXV0byByZXF1ZXN0ZWRRT1NDbGFzcyA9IFBlclByb2Nlc3M8SGVhcD46
OmdldEZhc3RDYXNlKCktPnRha2VSZXF1ZXN0ZWRTY2F2ZW5nZXJUaHJlYWRRT1NDbGFzcygpKQot
ICAgICAgICBwdGhyZWFkX3NldF9xb3NfY2xhc3Nfc2VsZl9ucChyZXF1ZXN0ZWRRT1NDbGFzcywg
MCk7CisgICAgcHRocmVhZF9zZXRfcW9zX2NsYXNzX3NlbGZfbnAobV9yZXF1ZXN0ZWRTY2F2ZW5n
ZXJUaHJlYWRRT1NDbGFzcywgMCk7CiAjZW5kaWYKIAotICAgIHNjYXZlbmdlKGxvY2ssIHNjYXZl
bmdlU2xlZXBEdXJhdGlvbik7CisgICAgc3RkOjp1bmlxdWVfbG9jazxTdGF0aWNNdXRleD4gbG9j
ayhQZXJQcm9jZXNzPEhlYXA+OjptdXRleCgpKTsKKworICAgIGJvb2wgYWxsb2NhdGlvbnNJblBy
b2dyZXNzID0gZmFsc2U7CisKKyAgICBzY2F2ZW5nZShsb2NrLCBhbGxvY2F0aW9uc0luUHJvZ3Jl
c3MpOworCisgICAgaWYgKGFsbG9jYXRpb25zSW5Qcm9ncmVzcykKKyAgICAgICAgbV9zY2F2ZW5n
ZXIucnVuKCk7CisgICAgZWxzZQorICAgICAgICBzbGVlcChsb2NrLCBzY2F2ZW5nZVNsZWVwRHVy
YXRpb24pOwogfQogCi12b2lkIEhlYXA6OnNjYXZlbmdlKHN0ZDo6dW5pcXVlX2xvY2s8U3RhdGlj
TXV0ZXg+JiBsb2NrLCBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzIHNsZWVwRHVyYXRpb24pCit2
b2lkIEhlYXA6OnNjYXZlbmdlKHN0ZDo6dW5pcXVlX2xvY2s8U3RhdGljTXV0ZXg+JiBsb2NrLCBi
b29sJiBhbGxvY2F0aW9uSW5Qcm9ncmVzcykKIHsKLSAgICB3YWl0VW50aWxGYWxzZShsb2NrLCBz
bGVlcER1cmF0aW9uLCBtX2lzQWxsb2NhdGluZ1BhZ2VzKTsKKyAgICBtX2lzUGFnZUNsYXNzQWxs
b2NhdGluZy5maWxsKGZhbHNlKTsKIAotICAgIHNjYXZlbmdlU21hbGxQYWdlcyhsb2NrLCBzbGVl
cER1cmF0aW9uKTsKLSAgICBzY2F2ZW5nZUxhcmdlT2JqZWN0cyhsb2NrLCBzbGVlcER1cmF0aW9u
KTsKLQotICAgIHNsZWVwKGxvY2ssIHNsZWVwRHVyYXRpb24pOworICAgIHNjYXZlbmdlU21hbGxQ
YWdlcyhsb2NrLCBhbGxvY2F0aW9uSW5Qcm9ncmVzcyk7CisgICAgc2NhdmVuZ2VMYXJnZU9iamVj
dHMobG9jaywgYWxsb2NhdGlvbkluUHJvZ3Jlc3MpOwogfQogCi12b2lkIEhlYXA6OnNjYXZlbmdl
U21hbGxQYWdlcyhzdGQ6OnVuaXF1ZV9sb2NrPFN0YXRpY011dGV4PiYgbG9jaywgc3RkOjpjaHJv
bm86Om1pbGxpc2Vjb25kcyBzbGVlcER1cmF0aW9uKQordm9pZCBIZWFwOjpzY2F2ZW5nZVNtYWxs
UGFnZXMoc3RkOjp1bmlxdWVfbG9jazxTdGF0aWNNdXRleD4mIGxvY2ssIGJvb2wmIGFsbG9jYXRp
b25JblByb2dyZXNzKQogewotICAgIGZvciAoYXV0byYgc21hbGxQYWdlcyA6IG1fc21hbGxQYWdl
cykgeworICAgIGZvciAoc2l6ZV90IHBhZ2VDbGFzcyA9IDA7IHBhZ2VDbGFzcyA8IHBhZ2VDbGFz
c0NvdW50OyBwYWdlQ2xhc3MrKykgeworICAgICAgICBhdXRvJiBzbWFsbFBhZ2VzID0gbV9zbWFs
bFBhZ2VzW3BhZ2VDbGFzc107CisKICAgICAgICAgd2hpbGUgKCFzbWFsbFBhZ2VzLmlzRW1wdHko
KSkgeworICAgICAgICAgICAgaWYgKG1faXNQYWdlQ2xhc3NBbGxvY2F0aW5nW3BhZ2VDbGFzc10p
IHsKKyAgICAgICAgICAgICAgICBhbGxvY2F0aW9uSW5Qcm9ncmVzcyA9IHRydWU7CisgICAgICAg
ICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIFNtYWxsUGFnZSog
cGFnZSA9IHNtYWxsUGFnZXMucG9wKCk7Ci0gICAgICAgICAgICBzaXplX3QgcGFnZUNsYXNzID0g
bV9wYWdlQ2xhc3Nlc1twYWdlLT5zaXplQ2xhc3MoKV07CiAgICAgICAgICAgICBtX3ZtSGVhcC5k
ZWFsbG9jYXRlU21hbGxQYWdlKGxvY2ssIHBhZ2VDbGFzcywgcGFnZSk7Ci0gICAgICAgICAgICB3
YWl0VW50aWxGYWxzZShsb2NrLCBzbGVlcER1cmF0aW9uLCBtX2lzQWxsb2NhdGluZ1BhZ2VzKTsK
ICAgICAgICAgfQogICAgIH0KIH0KIAotdm9pZCBIZWFwOjpzY2F2ZW5nZUxhcmdlT2JqZWN0cyhz
dGQ6OnVuaXF1ZV9sb2NrPFN0YXRpY011dGV4PiYgbG9jaywgc3RkOjpjaHJvbm86Om1pbGxpc2Vj
b25kcyBzbGVlcER1cmF0aW9uKQordm9pZCBIZWFwOjpzY2F2ZW5nZUxhcmdlT2JqZWN0cyhzdGQ6
OnVuaXF1ZV9sb2NrPFN0YXRpY011dGV4PiYgbG9jaywgYm9vbCYgYWxsb2NhdGlvbkluUHJvZ3Jl
c3MpCiB7CiAgICAgYXV0byYgcmFuZ2VzID0gbV9sYXJnZUZyZWUucmFuZ2VzKCk7CiAgICAgZm9y
IChzaXplX3QgaSA9IHJhbmdlcy5zaXplKCk7IGktLSA+IDA7IGkgPSBzdGQ6Om1pbihpLCByYW5n
ZXMuc2l6ZSgpKSkgewpAQCAtMTY2LDcgKzE3OCwxMCBAQCB2b2lkIEhlYXA6OnNjYXZlbmdlTGFy
Z2VPYmplY3RzKHN0ZDo6dW5pCiAgICAgICAgIHJhbmdlLnNldFBoeXNpY2FsU2l6ZSgwKTsKICAg
ICAgICAgcmFuZ2VzLnB1c2gocmFuZ2UpOwogCi0gICAgICAgIHdhaXRVbnRpbEZhbHNlKGxvY2ss
IHNsZWVwRHVyYXRpb24sIG1faXNBbGxvY2F0aW5nUGFnZXMpOworICAgICAgICBpZiAoaXNBbGxv
Y2F0aW5nTGFyZ2VQYWdlcykgeworICAgICAgICAgICAgYWxsb2NhdGlvbkluUHJvZ3Jlc3MgPSB0
cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KICAgICB9CiB9CiAKQEAgLTE4MCw3
ICsxOTUsNyBAQCBTbWFsbFBhZ2UqIEhlYXA6OmFsbG9jYXRlU21hbGxQYWdlKHN0ZDo6CiAgICAg
ICAgIGlmICghbV9zbWFsbFBhZ2VzW3BhZ2VDbGFzc10uaXNFbXB0eSgpKQogICAgICAgICAgICAg
cmV0dXJuIG1fc21hbGxQYWdlc1twYWdlQ2xhc3NdLnBvcCgpOwogCi0gICAgICAgIG1faXNBbGxv
Y2F0aW5nUGFnZXMgPSB0cnVlOworICAgICAgICBtX2lzUGFnZUNsYXNzQWxsb2NhdGluZ1twYWdl
Q2xhc3NdID0gdHJ1ZTsKIAogICAgICAgICBTbWFsbFBhZ2UqIHBhZ2UgPSBtX3ZtSGVhcC5hbGxv
Y2F0ZVNtYWxsUGFnZShsb2NrLCBwYWdlQ2xhc3MpOwogICAgICAgICBtX29iamVjdFR5cGVzLnNl
dChDaHVuazo6Z2V0KHBhZ2UpLCBPYmplY3RUeXBlOjpTbWFsbCk7CkBAIC0zNDksNyArMzY0LDcg
QEAgTGFyZ2VSYW5nZSBIZWFwOjpzcGxpdEFuZEFsbG9jYXRlKExhcmdlUgogICAgIH0KICAgICAK
ICAgICBpZiAocmFuZ2UucGh5c2ljYWxTaXplKCkgPCByYW5nZS5zaXplKCkpIHsKLSAgICAgICAg
bV9pc0FsbG9jYXRpbmdQYWdlcyA9IHRydWU7CisgICAgICAgIGlzQWxsb2NhdGluZ0xhcmdlUGFn
ZXMgPSB0cnVlOwogCiAgICAgICAgIHZtQWxsb2NhdGVQaHlzaWNhbFBhZ2VzU2xvcHB5KHJhbmdl
LmJlZ2luKCkgKyByYW5nZS5waHlzaWNhbFNpemUoKSwgcmFuZ2Uuc2l6ZSgpIC0gcmFuZ2UucGh5
c2ljYWxTaXplKCkpOwogICAgICAgICByYW5nZS5zZXRQaHlzaWNhbFNpemUocmFuZ2Uuc2l6ZSgp
KTsKQEAgLTQyNiw3ICs0NDEsNyBAQCB2b2lkIEhlYXA6OmRlYWxsb2NhdGVMYXJnZShzdGQ6Omxv
Y2tfZ3VhCiB7CiAgICAgc2l6ZV90IHNpemUgPSBtX2xhcmdlQWxsb2NhdGVkLnJlbW92ZShvYmpl
Y3QpOwogICAgIG1fbGFyZ2VGcmVlLmFkZChMYXJnZVJhbmdlKG9iamVjdCwgc2l6ZSwgc2l6ZSkp
OwotICAgIAorCiAgICAgbV9zY2F2ZW5nZXIucnVuKCk7CiB9CiAKSW5kZXg6IFNvdXJjZS9ibWFs
bG9jL2JtYWxsb2MvSGVhcC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9ibWFsbG9jL2JtYWxsb2Mv
SGVhcC5oCShyZXZpc2lvbiAyMTU4NTEpCisrKyBTb3VyY2UvYm1hbGxvYy9ibWFsbG9jL0hlYXAu
aAkod29ya2luZyBjb3B5KQpAQCAtNjYsMTAgKzY2LDkgQEAgcHVibGljOgogICAgIHNpemVfdCBs
YXJnZVNpemUoc3RkOjpsb2NrX2d1YXJkPFN0YXRpY011dGV4PiYsIHZvaWQqKTsKICAgICB2b2lk
IHNocmlua0xhcmdlKHN0ZDo6bG9ja19ndWFyZDxTdGF0aWNNdXRleD4mLCBjb25zdCBSYW5nZSYs
IHNpemVfdCk7CiAKLSAgICB2b2lkIHNjYXZlbmdlKHN0ZDo6dW5pcXVlX2xvY2s8U3RhdGljTXV0
ZXg+Jiwgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyBzbGVlcER1cmF0aW9uKTsKKyAgICB2b2lk
IHNjYXZlbmdlKHN0ZDo6dW5pcXVlX2xvY2s8U3RhdGljTXV0ZXg+JiwgYm9vbCYgYWxsb2NhdGlv
bkluUHJvZ3Jlc3MgPSBkZWZhdWx0Qm9vbFBhcmFtKTsKIAogI2lmIEJPUyhEQVJXSU4pCi0gICAg
cW9zX2NsYXNzX3QgdGFrZVJlcXVlc3RlZFNjYXZlbmdlclRocmVhZFFPU0NsYXNzKCkgeyByZXR1
cm4gc3RkOjpleGNoYW5nZShtX3JlcXVlc3RlZFNjYXZlbmdlclRocmVhZFFPU0NsYXNzLCBRT1Nf
Q0xBU1NfVU5TUEVDSUZJRUQpOyB9CiAgICAgdm9pZCBzZXRTY2F2ZW5nZXJUaHJlYWRRT1NDbGFz
cyhxb3NfY2xhc3NfdCBvdmVycmlkZUNsYXNzKSB7IG1fcmVxdWVzdGVkU2NhdmVuZ2VyVGhyZWFk
UU9TQ2xhc3MgPSBvdmVycmlkZUNsYXNzOyB9CiAjZW5kaWYKIApAQCAtMTAzLDggKzEwMiw4IEBA
IHByaXZhdGU6CiAgICAgTGFyZ2VSYW5nZSBzcGxpdEFuZEFsbG9jYXRlKExhcmdlUmFuZ2UmLCBz
aXplX3QgYWxpZ25tZW50LCBzaXplX3QpOwogCiAgICAgdm9pZCBjb25jdXJyZW50U2NhdmVuZ2Uo
KTsKLSAgICB2b2lkIHNjYXZlbmdlU21hbGxQYWdlcyhzdGQ6OnVuaXF1ZV9sb2NrPFN0YXRpY011
dGV4PiYsIHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMpOwotICAgIHZvaWQgc2NhdmVuZ2VMYXJn
ZU9iamVjdHMoc3RkOjp1bmlxdWVfbG9jazxTdGF0aWNNdXRleD4mLCBzdGQ6OmNocm9ubzo6bWls
bGlzZWNvbmRzKTsKKyAgICB2b2lkIHNjYXZlbmdlU21hbGxQYWdlcyhzdGQ6OnVuaXF1ZV9sb2Nr
PFN0YXRpY011dGV4PiYsIGJvb2wmIGFsbG9jYXRpb25JblByb2dyZXNzKTsKKyAgICB2b2lkIHNj
YXZlbmdlTGFyZ2VPYmplY3RzKHN0ZDo6dW5pcXVlX2xvY2s8U3RhdGljTXV0ZXg+JiwgYm9vbCYg
YWxsb2NhdGlvbkluUHJvZ3Jlc3MpOwogCiAgICAgc2l6ZV90IG1fdm1QYWdlU2l6ZVBoeXNpY2Fs
OwogICAgIFZlY3RvcjxMaW5lTWV0YWRhdGE+IG1fc21hbGxMaW5lTWV0YWRhdGE7CkBAIC0xMTgs
OSArMTE3LDEzIEBAIHByaXZhdGU6CiAKICAgICBNYXA8Q2h1bmsqLCBPYmplY3RUeXBlLCBDaHVu
a0hhc2g+IG1fb2JqZWN0VHlwZXM7CiAKLSAgICBib29sIG1faXNBbGxvY2F0aW5nUGFnZXM7Cisg
ICAgc3RkOjphcnJheTxib29sLCBwYWdlQ2xhc3NDb3VudCArIDE+IG1faXNQYWdlQ2xhc3NBbGxv
Y2F0aW5nOyAvLyBFeHRyYSBjbGFzcyBpcyBmb3IgbGFyZ2Ugb2JqZWN0cy4KKyNkZWZpbmUgaXNB
bGxvY2F0aW5nTGFyZ2VQYWdlcyBtX2lzUGFnZUNsYXNzQWxsb2NhdGluZ1twYWdlQ2xhc3NDb3Vu
dF0KKwogICAgIEFzeW5jVGFzazxIZWFwLCBkZWNsdHlwZSgmSGVhcDo6Y29uY3VycmVudFNjYXZl
bmdlKT4gbV9zY2F2ZW5nZXI7CiAKKyAgICBzdGF0aWMgYm9vbCBkZWZhdWx0Qm9vbFBhcmFtOwor
CiAgICAgRW52aXJvbm1lbnQgbV9lbnZpcm9ubWVudDsKICAgICBEZWJ1Z0hlYXAqIG1fZGVidWdI
ZWFwOwogCkluZGV4OiBTb3VyY2UvYm1hbGxvYy9ibWFsbG9jL2JtYWxsb2MuaAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBTb3VyY2UvYm1hbGxvYy9ibWFsbG9jL2JtYWxsb2MuaAkocmV2aXNpb24gMjE1ODUxKQor
KysgU291cmNlL2JtYWxsb2MvYm1hbGxvYy9ibWFsbG9jLmgJKHdvcmtpbmcgY29weSkKQEAgLTc2
LDcgKzc2LDcgQEAgaW5saW5lIHZvaWQgc2NhdmVuZ2UoKQogICAgIHNjYXZlbmdlVGhpc1RocmVh
ZCgpOwogCiAgICAgc3RkOjp1bmlxdWVfbG9jazxTdGF0aWNNdXRleD4gbG9jayhQZXJQcm9jZXNz
PEhlYXA+OjptdXRleCgpKTsKLSAgICBQZXJQcm9jZXNzPEhlYXA+OjpnZXQoKS0+c2NhdmVuZ2Uo
bG9jaywgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcygwKSk7CisgICAgUGVyUHJvY2VzczxIZWFw
Pjo6Z2V0KCktPnNjYXZlbmdlKGxvY2spOwogfQogCiBpbmxpbmUgYm9vbCBpc0VuYWJsZWQoKQo=
</data>
<flag name="review"
          id="329587"
          type_id="1"
          status="-"
          setter="ggaren"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>308441</attachid>
            <date>2017-04-27 14:07:18 -0700</date>
            <delta_ts>2017-04-27 14:40:29 -0700</delta_ts>
            <desc>Updated patch addressing review comments</desc>
            <filename>171384-2.patch</filename>
            <type>text/plain</type>
            <size>9578</size>
            <attacher name="Michael Saboff">msaboff</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9ibWFsbG9jL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvYm1h
bGxvYy9DaGFuZ2VMb2cJKHJldmlzaW9uIDIxNTg5MSkKKysrIFNvdXJjZS9ibWFsbG9jL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDMyIEBACisyMDE3LTA0LTI3ICBNaWNoYWVs
IFNhYm9mZiAgPG1zYWJvZmZAYXBwbGUuY29tPgorCisgICAgICAgIGJtYWxsb2Mgc2NhdmVuZ2Vy
IHNob3VsZCBrbm93IHdoYXQgcGFnZSBjbGFzc2VzIGFyZSBhbGxvY2F0aW5nCisgICAgICAgIGh0
dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNzEzODQKKworICAgICAgICBS
ZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBUaGlzIGNoYW5nZSByZXBsYWNl
cyBtX2lzQWxsb2NhdGluZ1BhZ2VzIHdpdGggYSBwZXIgcGFnZSBjbGFzcyBmbGFnIHRvIHRyYWNr
IHdoaWNoIHBhZ2UKKyAgICAgICAgY2xhc3NlcyBhcmUgY3VycmVudGx5IGFsbG9jYXRpbmcuICBX
aGVuIHNjYXZlbmdpbmcsIHdlIHNraXAgcGFnZSBjbGFzc2VzIHRoYXQgYXJlIGFjdGl2ZWx5Cisg
ICAgICAgIGFsbG9jYXRpbmcgYW5kIGNvbWUgYmFjayB0byB0aGVtIG9uIGEgc3Vic2VxdWVudCBw
YXNzLiAgVGhpcyByZWR1Y2VzIHRoZSBhbW91bnQgb2YgdGltZSBpdAorICAgICAgICB0YWtlcyBm
b3Igc2NhdmVuZ2VyIHRvIGZyZWUgdXAgcGFnZXMgYXMgd2VsbCBhcyB0aGUgdG90YWwgdGltZSBp
dCB0YWtlcyB0byBoYW5kbGUgYWxsCisgICAgICAgIHBhZ2UgY2xhc3Nlcy4KKworICAgICAgICAq
IGJtYWxsb2MvSGVhcC5jcHA6CisgICAgICAgIChibWFsbG9jOjpIZWFwOjpIZWFwKToKKyAgICAg
ICAgKGJtYWxsb2M6OkhlYXA6OmNvbmN1cnJlbnRTY2F2ZW5nZSk6CisgICAgICAgIChibWFsbG9j
OjpIZWFwOjpzY2F2ZW5nZSk6CisgICAgICAgIChibWFsbG9jOjpIZWFwOjpzY2F2ZW5nZVNtYWxs
UGFnZXMpOgorICAgICAgICAoYm1hbGxvYzo6SGVhcDo6c2NhdmVuZ2VMYXJnZU9iamVjdHMpOgor
ICAgICAgICAoYm1hbGxvYzo6SGVhcDo6YWxsb2NhdGVTbWFsbFBhZ2UpOgorICAgICAgICAoYm1h
bGxvYzo6SGVhcDo6c3BsaXRBbmRBbGxvY2F0ZSk6CisgICAgICAgIChibWFsbG9jOjpIZWFwOjpk
ZWFsbG9jYXRlTGFyZ2UpOgorICAgICAgICAqIGJtYWxsb2MvSGVhcC5oOgorICAgICAgICAoYm1h
bGxvYzo6SGVhcDo6dGFrZVJlcXVlc3RlZFNjYXZlbmdlclRocmVhZFFPU0NsYXNzKTogRGVsZXRl
ZC4KKyAgICAgICAgKiBibWFsbG9jL1ZNSGVhcC5oOgorICAgICAgICAoYm1hbGxvYzo6Vk1IZWFw
OjpkZWFsbG9jYXRlU21hbGxQYWdlKToKKyAgICAgICAgKiBibWFsbG9jL2JtYWxsb2MuaDoKKyAg
ICAgICAgKGJtYWxsb2M6OmFwaTo6c2NhdmVuZ2UpOgorCiAyMDE3LTA0LTI1ICBNaWNoYWVsIFNh
Ym9mZiAgPG1zYWJvZmZAYXBwbGUuY29tPgogCiAgICAgICAgIENhbGwgYm1hbGxvYyBzY2F2ZW5n
ZXIgZmlyc3Qgd2hlbiBoYW5kbGluZyBhIG1lbW9yeSBwcmVzc3VyZSBldmVudApJbmRleDogU291
cmNlL2JtYWxsb2MvYm1hbGxvYy9IZWFwLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvYm1hbGxv
Yy9ibWFsbG9jL0hlYXAuY3BwCShyZXZpc2lvbiAyMTU4NTEpCisrKyBTb3VyY2UvYm1hbGxvYy9i
bWFsbG9jL0hlYXAuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00MCw3ICs0MCw2IEBAIG5hbWVzcGFj
ZSBibWFsbG9jIHsKIAogSGVhcDo6SGVhcChzdGQ6OmxvY2tfZ3VhcmQ8U3RhdGljTXV0ZXg+JikK
ICAgICA6IG1fdm1QYWdlU2l6ZVBoeXNpY2FsKHZtUGFnZVNpemVQaHlzaWNhbCgpKQotICAgICwg
bV9pc0FsbG9jYXRpbmdQYWdlcyhmYWxzZSkKICAgICAsIG1fc2NhdmVuZ2VyKCp0aGlzLCAmSGVh
cDo6Y29uY3VycmVudFNjYXZlbmdlKQogICAgICwgbV9kZWJ1Z0hlYXAobnVsbHB0cikKIHsKQEAg
LTEyMSw1MiArMTIwLDYzIEBAIHZvaWQgSGVhcDo6aW5pdGlhbGl6ZVBhZ2VNZXRhZGF0YSgpCiAK
IHZvaWQgSGVhcDo6Y29uY3VycmVudFNjYXZlbmdlKCkKIHsKLSAgICBzdGQ6OnVuaXF1ZV9sb2Nr
PFN0YXRpY011dGV4PiBsb2NrKFBlclByb2Nlc3M8SGVhcD46Om11dGV4KCkpOwotCiAjaWYgQk9T
KERBUldJTikKLSAgICBpZiAoYXV0byByZXF1ZXN0ZWRRT1NDbGFzcyA9IFBlclByb2Nlc3M8SGVh
cD46OmdldEZhc3RDYXNlKCktPnRha2VSZXF1ZXN0ZWRTY2F2ZW5nZXJUaHJlYWRRT1NDbGFzcygp
KQotICAgICAgICBwdGhyZWFkX3NldF9xb3NfY2xhc3Nfc2VsZl9ucChyZXF1ZXN0ZWRRT1NDbGFz
cywgMCk7CisgICAgcHRocmVhZF9zZXRfcW9zX2NsYXNzX3NlbGZfbnAobV9yZXF1ZXN0ZWRTY2F2
ZW5nZXJUaHJlYWRRT1NDbGFzcywgMCk7CiAjZW5kaWYKIAotICAgIHNjYXZlbmdlKGxvY2ssIHNj
YXZlbmdlU2xlZXBEdXJhdGlvbik7CisgICAgc3RkOjp1bmlxdWVfbG9jazxTdGF0aWNNdXRleD4g
bG9jayhQZXJQcm9jZXNzPEhlYXA+OjptdXRleCgpKTsKKworICAgIHNjYXZlbmdlKGxvY2ssIERl
YWxsb2NhdGVBc3luY2hyb25vdXNseSk7CiB9CiAKLXZvaWQgSGVhcDo6c2NhdmVuZ2Uoc3RkOjp1
bmlxdWVfbG9jazxTdGF0aWNNdXRleD4mIGxvY2ssIHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMg
c2xlZXBEdXJhdGlvbikKK3ZvaWQgSGVhcDo6c2NhdmVuZ2Uoc3RkOjp1bmlxdWVfbG9jazxTdGF0
aWNNdXRleD4mIGxvY2ssIERlYWxsb2NhdGlvbk1vZGUgZGVhbGxvY2F0aW9uTW9kZSkKIHsKLSAg
ICB3YWl0VW50aWxGYWxzZShsb2NrLCBzbGVlcER1cmF0aW9uLCBtX2lzQWxsb2NhdGluZ1BhZ2Vz
KTsKKyAgICBtX2lzQWxsb2NhdGluZ1BhZ2VzLmZpbGwoZmFsc2UpOworICAgIG1faXNBbGxvY2F0
aW5nTGFyZ2VQYWdlcyA9IGZhbHNlOwogCi0gICAgc2NhdmVuZ2VTbWFsbFBhZ2VzKGxvY2ssIHNs
ZWVwRHVyYXRpb24pOwotICAgIHNjYXZlbmdlTGFyZ2VPYmplY3RzKGxvY2ssIHNsZWVwRHVyYXRp
b24pOworICAgIGlmIChkZWFsbG9jYXRpb25Nb2RlID09IERlYWxsb2NhdGVBc3luY2hyb25vdXNs
eSkKKyAgICAgICAgc2xlZXAobG9jaywgc2NhdmVuZ2VTbGVlcER1cmF0aW9uKTsKIAotICAgIHNs
ZWVwKGxvY2ssIHNsZWVwRHVyYXRpb24pOworICAgIHNjYXZlbmdlU21hbGxQYWdlcyhsb2NrLCBk
ZWFsbG9jYXRpb25Nb2RlKTsKKyAgICBzY2F2ZW5nZUxhcmdlT2JqZWN0cyhsb2NrLCBkZWFsbG9j
YXRpb25Nb2RlKTsKIH0KIAotdm9pZCBIZWFwOjpzY2F2ZW5nZVNtYWxsUGFnZXMoc3RkOjp1bmlx
dWVfbG9jazxTdGF0aWNNdXRleD4mIGxvY2ssIHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMgc2xl
ZXBEdXJhdGlvbikKK3ZvaWQgSGVhcDo6c2NhdmVuZ2VTbWFsbFBhZ2VzKHN0ZDo6dW5pcXVlX2xv
Y2s8U3RhdGljTXV0ZXg+JiBsb2NrLCBEZWFsbG9jYXRpb25Nb2RlIGRlYWxsb2NhdGlvbk1vZGUp
CiB7Ci0gICAgZm9yIChhdXRvJiBzbWFsbFBhZ2VzIDogbV9zbWFsbFBhZ2VzKSB7CisgICAgZm9y
IChzaXplX3QgcGFnZUNsYXNzID0gMDsgcGFnZUNsYXNzIDwgcGFnZUNsYXNzQ291bnQ7IHBhZ2VD
bGFzcysrKSB7CisgICAgICAgIGF1dG8mIHNtYWxsUGFnZXMgPSBtX3NtYWxsUGFnZXNbcGFnZUNs
YXNzXTsKKwogICAgICAgICB3aGlsZSAoIXNtYWxsUGFnZXMuaXNFbXB0eSgpKSB7CisgICAgICAg
ICAgICBpZiAobV9pc0FsbG9jYXRpbmdQYWdlc1twYWdlQ2xhc3NdKSB7CisgICAgICAgICAgICAg
ICAgbV9zY2F2ZW5nZXIucnVuKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAg
ICB9CisKICAgICAgICAgICAgIFNtYWxsUGFnZSogcGFnZSA9IHNtYWxsUGFnZXMucG9wKCk7Ci0g
ICAgICAgICAgICBzaXplX3QgcGFnZUNsYXNzID0gbV9wYWdlQ2xhc3Nlc1twYWdlLT5zaXplQ2xh
c3MoKV07Ci0gICAgICAgICAgICBtX3ZtSGVhcC5kZWFsbG9jYXRlU21hbGxQYWdlKGxvY2ssIHBh
Z2VDbGFzcywgcGFnZSk7Ci0gICAgICAgICAgICB3YWl0VW50aWxGYWxzZShsb2NrLCBzbGVlcER1
cmF0aW9uLCBtX2lzQWxsb2NhdGluZ1BhZ2VzKTsKKyAgICAgICAgICAgIG1fdm1IZWFwLmRlYWxs
b2NhdGVTbWFsbFBhZ2UobG9jaywgcGFnZUNsYXNzLCBwYWdlLCBkZWFsbG9jYXRpb25Nb2RlKTsK
ICAgICAgICAgfQogICAgIH0KIH0KIAotdm9pZCBIZWFwOjpzY2F2ZW5nZUxhcmdlT2JqZWN0cyhz
dGQ6OnVuaXF1ZV9sb2NrPFN0YXRpY011dGV4PiYgbG9jaywgc3RkOjpjaHJvbm86Om1pbGxpc2Vj
b25kcyBzbGVlcER1cmF0aW9uKQordm9pZCBIZWFwOjpzY2F2ZW5nZUxhcmdlT2JqZWN0cyhzdGQ6
OnVuaXF1ZV9sb2NrPFN0YXRpY011dGV4PiYgbG9jaywgRGVhbGxvY2F0aW9uTW9kZSBkZWFsbG9j
YXRpb25Nb2RlKQogewogICAgIGF1dG8mIHJhbmdlcyA9IG1fbGFyZ2VGcmVlLnJhbmdlcygpOwog
ICAgIGZvciAoc2l6ZV90IGkgPSByYW5nZXMuc2l6ZSgpOyBpLS0gPiAwOyBpID0gc3RkOjptaW4o
aSwgcmFuZ2VzLnNpemUoKSkpIHsKKyAgICAgICAgaWYgKG1faXNBbGxvY2F0aW5nTGFyZ2VQYWdl
cykgeworICAgICAgICAgICAgbV9zY2F2ZW5nZXIucnVuKCk7CisgICAgICAgICAgICBicmVhazsK
KyAgICAgICAgfQorCiAgICAgICAgIGF1dG8gcmFuZ2UgPSByYW5nZXMucG9wKGkpOwogCi0gICAg
ICAgIGxvY2sudW5sb2NrKCk7CisgICAgICAgIGlmIChkZWFsbG9jYXRpb25Nb2RlID09IERlYWxs
b2NhdGVBc3luY2hyb25vdXNseSkKKyAgICAgICAgICAgIGxvY2sudW5sb2NrKCk7CiAgICAgICAg
IHZtRGVhbGxvY2F0ZVBoeXNpY2FsUGFnZXNTbG9wcHkocmFuZ2UuYmVnaW4oKSwgcmFuZ2Uuc2l6
ZSgpKTsKLSAgICAgICAgbG9jay5sb2NrKCk7CisgICAgICAgIGlmIChkZWFsbG9jYXRpb25Nb2Rl
ID09IERlYWxsb2NhdGVBc3luY2hyb25vdXNseSkKKyAgICAgICAgICAgIGxvY2subG9jaygpOwog
CiAgICAgICAgIHJhbmdlLnNldFBoeXNpY2FsU2l6ZSgwKTsKICAgICAgICAgcmFuZ2VzLnB1c2go
cmFuZ2UpOwotCi0gICAgICAgIHdhaXRVbnRpbEZhbHNlKGxvY2ssIHNsZWVwRHVyYXRpb24sIG1f
aXNBbGxvY2F0aW5nUGFnZXMpOwogICAgIH0KIH0KIApAQCAtMTgwLDcgKzE5MCw3IEBAIFNtYWxs
UGFnZSogSGVhcDo6YWxsb2NhdGVTbWFsbFBhZ2Uoc3RkOjoKICAgICAgICAgaWYgKCFtX3NtYWxs
UGFnZXNbcGFnZUNsYXNzXS5pc0VtcHR5KCkpCiAgICAgICAgICAgICByZXR1cm4gbV9zbWFsbFBh
Z2VzW3BhZ2VDbGFzc10ucG9wKCk7CiAKLSAgICAgICAgbV9pc0FsbG9jYXRpbmdQYWdlcyA9IHRy
dWU7CisgICAgICAgIG1faXNBbGxvY2F0aW5nUGFnZXNbcGFnZUNsYXNzXSA9IHRydWU7CiAKICAg
ICAgICAgU21hbGxQYWdlKiBwYWdlID0gbV92bUhlYXAuYWxsb2NhdGVTbWFsbFBhZ2UobG9jaywg
cGFnZUNsYXNzKTsKICAgICAgICAgbV9vYmplY3RUeXBlcy5zZXQoQ2h1bms6OmdldChwYWdlKSwg
T2JqZWN0VHlwZTo6U21hbGwpOwpAQCAtMzQ5LDcgKzM1OSw3IEBAIExhcmdlUmFuZ2UgSGVhcDo6
c3BsaXRBbmRBbGxvY2F0ZShMYXJnZVIKICAgICB9CiAgICAgCiAgICAgaWYgKHJhbmdlLnBoeXNp
Y2FsU2l6ZSgpIDwgcmFuZ2Uuc2l6ZSgpKSB7Ci0gICAgICAgIG1faXNBbGxvY2F0aW5nUGFnZXMg
PSB0cnVlOworICAgICAgICBtX2lzQWxsb2NhdGluZ0xhcmdlUGFnZXMgPSB0cnVlOwogCiAgICAg
ICAgIHZtQWxsb2NhdGVQaHlzaWNhbFBhZ2VzU2xvcHB5KHJhbmdlLmJlZ2luKCkgKyByYW5nZS5w
aHlzaWNhbFNpemUoKSwgcmFuZ2Uuc2l6ZSgpIC0gcmFuZ2UucGh5c2ljYWxTaXplKCkpOwogICAg
ICAgICByYW5nZS5zZXRQaHlzaWNhbFNpemUocmFuZ2Uuc2l6ZSgpKTsKSW5kZXg6IFNvdXJjZS9i
bWFsbG9jL2JtYWxsb2MvSGVhcC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9ibWFsbG9jL2JtYWxs
b2MvSGVhcC5oCShyZXZpc2lvbiAyMTU4NTEpCisrKyBTb3VyY2UvYm1hbGxvYy9ibWFsbG9jL0hl
YXAuaAkod29ya2luZyBjb3B5KQpAQCAtNjYsMTAgKzY2LDkgQEAgcHVibGljOgogICAgIHNpemVf
dCBsYXJnZVNpemUoc3RkOjpsb2NrX2d1YXJkPFN0YXRpY011dGV4PiYsIHZvaWQqKTsKICAgICB2
b2lkIHNocmlua0xhcmdlKHN0ZDo6bG9ja19ndWFyZDxTdGF0aWNNdXRleD4mLCBjb25zdCBSYW5n
ZSYsIHNpemVfdCk7CiAKLSAgICB2b2lkIHNjYXZlbmdlKHN0ZDo6dW5pcXVlX2xvY2s8U3RhdGlj
TXV0ZXg+Jiwgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyBzbGVlcER1cmF0aW9uKTsKKyAgICB2
b2lkIHNjYXZlbmdlKHN0ZDo6dW5pcXVlX2xvY2s8U3RhdGljTXV0ZXg+JiwgRGVhbGxvY2F0aW9u
TW9kZSk7CiAKICNpZiBCT1MoREFSV0lOKQotICAgIHFvc19jbGFzc190IHRha2VSZXF1ZXN0ZWRT
Y2F2ZW5nZXJUaHJlYWRRT1NDbGFzcygpIHsgcmV0dXJuIHN0ZDo6ZXhjaGFuZ2UobV9yZXF1ZXN0
ZWRTY2F2ZW5nZXJUaHJlYWRRT1NDbGFzcywgUU9TX0NMQVNTX1VOU1BFQ0lGSUVEKTsgfQogICAg
IHZvaWQgc2V0U2NhdmVuZ2VyVGhyZWFkUU9TQ2xhc3MocW9zX2NsYXNzX3Qgb3ZlcnJpZGVDbGFz
cykgeyBtX3JlcXVlc3RlZFNjYXZlbmdlclRocmVhZFFPU0NsYXNzID0gb3ZlcnJpZGVDbGFzczsg
fQogI2VuZGlmCiAKQEAgLTEwMyw4ICsxMDIsOCBAQCBwcml2YXRlOgogICAgIExhcmdlUmFuZ2Ug
c3BsaXRBbmRBbGxvY2F0ZShMYXJnZVJhbmdlJiwgc2l6ZV90IGFsaWdubWVudCwgc2l6ZV90KTsK
IAogICAgIHZvaWQgY29uY3VycmVudFNjYXZlbmdlKCk7Ci0gICAgdm9pZCBzY2F2ZW5nZVNtYWxs
UGFnZXMoc3RkOjp1bmlxdWVfbG9jazxTdGF0aWNNdXRleD4mLCBzdGQ6OmNocm9ubzo6bWlsbGlz
ZWNvbmRzKTsKLSAgICB2b2lkIHNjYXZlbmdlTGFyZ2VPYmplY3RzKHN0ZDo6dW5pcXVlX2xvY2s8
U3RhdGljTXV0ZXg+Jiwgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyk7CisgICAgdm9pZCBzY2F2
ZW5nZVNtYWxsUGFnZXMoc3RkOjp1bmlxdWVfbG9jazxTdGF0aWNNdXRleD4mLCBEZWFsbG9jYXRp
b25Nb2RlKTsKKyAgICB2b2lkIHNjYXZlbmdlTGFyZ2VPYmplY3RzKHN0ZDo6dW5pcXVlX2xvY2s8
U3RhdGljTXV0ZXg+JiwgRGVhbGxvY2F0aW9uTW9kZSk7CiAKICAgICBzaXplX3QgbV92bVBhZ2VT
aXplUGh5c2ljYWw7CiAgICAgVmVjdG9yPExpbmVNZXRhZGF0YT4gbV9zbWFsbExpbmVNZXRhZGF0
YTsKQEAgLTExOCw3ICsxMTcsOSBAQCBwcml2YXRlOgogCiAgICAgTWFwPENodW5rKiwgT2JqZWN0
VHlwZSwgQ2h1bmtIYXNoPiBtX29iamVjdFR5cGVzOwogCi0gICAgYm9vbCBtX2lzQWxsb2NhdGlu
Z1BhZ2VzOworICAgIHN0ZDo6YXJyYXk8Ym9vbCwgcGFnZUNsYXNzQ291bnQ+IG1faXNBbGxvY2F0
aW5nUGFnZXM7CisgICAgYm9vbCBtX2lzQWxsb2NhdGluZ0xhcmdlUGFnZXM7CisKICAgICBBc3lu
Y1Rhc2s8SGVhcCwgZGVjbHR5cGUoJkhlYXA6OmNvbmN1cnJlbnRTY2F2ZW5nZSk+IG1fc2NhdmVu
Z2VyOwogCiAgICAgRW52aXJvbm1lbnQgbV9lbnZpcm9ubWVudDsKSW5kZXg6IFNvdXJjZS9ibWFs
bG9jL2JtYWxsb2MvVk1IZWFwLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL2JtYWxsb2MvYm1hbGxv
Yy9WTUhlYXAuaAkocmV2aXNpb24gMjE1ODUxKQorKysgU291cmNlL2JtYWxsb2MvYm1hbGxvYy9W
TUhlYXAuaAkod29ya2luZyBjb3B5KQpAQCAtNDEsMTAgKzQxLDEyIEBAIGNsYXNzIEJlZ2luVGFn
OwogY2xhc3MgRW5kVGFnOwogY2xhc3MgSGVhcDsKIAordHlwZWRlZiBlbnVtIHsgRGVhbGxvY2F0
ZVN5bmNocm9ub3VzbHksIERlYWxsb2NhdGVBc3luY2hyb25vdXNseSB9IERlYWxsb2NhdGlvbk1v
ZGU7CisKIGNsYXNzIFZNSGVhcCB7CiBwdWJsaWM6CiAgICAgU21hbGxQYWdlKiBhbGxvY2F0ZVNt
YWxsUGFnZShzdGQ6OmxvY2tfZ3VhcmQ8U3RhdGljTXV0ZXg+Jiwgc2l6ZV90KTsKLSAgICB2b2lk
IGRlYWxsb2NhdGVTbWFsbFBhZ2Uoc3RkOjp1bmlxdWVfbG9jazxTdGF0aWNNdXRleD4mLCBzaXpl
X3QsIFNtYWxsUGFnZSopOworICAgIHZvaWQgZGVhbGxvY2F0ZVNtYWxsUGFnZShzdGQ6OnVuaXF1
ZV9sb2NrPFN0YXRpY011dGV4PiYsIHNpemVfdCwgU21hbGxQYWdlKiwgRGVhbGxvY2F0aW9uTW9k
ZSk7CiAKICAgICBMYXJnZVJhbmdlIHRyeUFsbG9jYXRlTGFyZ2VDaHVuayhzdGQ6OmxvY2tfZ3Vh
cmQ8U3RhdGljTXV0ZXg+Jiwgc2l6ZV90IGFsaWdubWVudCwgc2l6ZV90KTsKICAgICAKQEAgLTY4
LDExICs3MCwxMyBAQCBpbmxpbmUgU21hbGxQYWdlKiBWTUhlYXA6OmFsbG9jYXRlU21hbGxQCiAg
ICAgcmV0dXJuIHBhZ2U7CiB9CiAKLWlubGluZSB2b2lkIFZNSGVhcDo6ZGVhbGxvY2F0ZVNtYWxs
UGFnZShzdGQ6OnVuaXF1ZV9sb2NrPFN0YXRpY011dGV4PiYgbG9jaywgc2l6ZV90IHBhZ2VDbGFz
cywgU21hbGxQYWdlKiBwYWdlKQoraW5saW5lIHZvaWQgVk1IZWFwOjpkZWFsbG9jYXRlU21hbGxQ
YWdlKHN0ZDo6dW5pcXVlX2xvY2s8U3RhdGljTXV0ZXg+JiBsb2NrLCBzaXplX3QgcGFnZUNsYXNz
LCBTbWFsbFBhZ2UqIHBhZ2UsIERlYWxsb2NhdGlvbk1vZGUgZGVhbGxvY2F0aW9uTW9kZSkKIHsK
LSAgICBsb2NrLnVubG9jaygpOworICAgIGlmIChkZWFsbG9jYXRpb25Nb2RlID09IERlYWxsb2Nh
dGVBc3luY2hyb25vdXNseSkKKyAgICAgICAgbG9jay51bmxvY2soKTsKICAgICB2bURlYWxsb2Nh
dGVQaHlzaWNhbFBhZ2VzU2xvcHB5KHBhZ2UtPmJlZ2luKCktPmJlZ2luKCksIHBhZ2VTaXplKHBh
Z2VDbGFzcykpOwotICAgIGxvY2subG9jaygpOworICAgIGlmIChkZWFsbG9jYXRpb25Nb2RlID09
IERlYWxsb2NhdGVBc3luY2hyb25vdXNseSkKKyAgICAgICAgbG9jay5sb2NrKCk7CiAgICAgCiAg
ICAgbV9zbWFsbFBhZ2VzW3BhZ2VDbGFzc10ucHVzaChwYWdlKTsKIH0KSW5kZXg6IFNvdXJjZS9i
bWFsbG9jL2JtYWxsb2MvYm1hbGxvYy5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9ibWFsbG9jL2Jt
YWxsb2MvYm1hbGxvYy5oCShyZXZpc2lvbiAyMTU4NTEpCisrKyBTb3VyY2UvYm1hbGxvYy9ibWFs
bG9jL2JtYWxsb2MuaAkod29ya2luZyBjb3B5KQpAQCAtNzYsNyArNzYsNyBAQCBpbmxpbmUgdm9p
ZCBzY2F2ZW5nZSgpCiAgICAgc2NhdmVuZ2VUaGlzVGhyZWFkKCk7CiAKICAgICBzdGQ6OnVuaXF1
ZV9sb2NrPFN0YXRpY011dGV4PiBsb2NrKFBlclByb2Nlc3M8SGVhcD46Om11dGV4KCkpOwotICAg
IFBlclByb2Nlc3M8SGVhcD46OmdldCgpLT5zY2F2ZW5nZShsb2NrLCBzdGQ6OmNocm9ubzo6bWls
bGlzZWNvbmRzKDApKTsKKyAgICBQZXJQcm9jZXNzPEhlYXA+OjpnZXQoKS0+c2NhdmVuZ2UobG9j
aywgRGVhbGxvY2F0ZVN5bmNocm9ub3VzbHkpOwogfQogCiBpbmxpbmUgYm9vbCBpc0VuYWJsZWQo
KQo=
</data>
<flag name="review"
          id="329605"
          type_id="1"
          status="+"
          setter="ggaren"
    />
          </attachment>
      

    </bug>

</bugzilla>