<?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>162315</bug_id>
          
          <creation_ts>2016-09-20 13:55:06 -0700</creation_ts>
          <short_desc>Optimize StringView::CodePoints::Iterator</short_desc>
          <delta_ts>2021-03-23 08:57:00 -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>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></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Alex Christensen">achristensen</reporter>
          <assigned_to name="Alex Christensen">achristensen</assigned_to>
          <cc>benjamin</cc>
    
    <cc>cdumez</cc>
    
    <cc>cmarcelo</cc>
    
    <cc>commit-queue</cc>
    
    <cc>darin</cc>
    
    <cc>dbates</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1231847</commentid>
    <comment_count>0</comment_count>
    <who name="Alex Christensen">achristensen</who>
    <bug_when>2016-09-20 13:55:06 -0700</bug_when>
    <thetext>Optimize StringView::CodePoints::Iterator</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1231849</commentid>
    <comment_count>1</comment_count>
      <attachid>289396</attachid>
    <who name="Alex Christensen">achristensen</who>
    <bug_when>2016-09-20 13:56:51 -0700</bug_when>
    <thetext>Created attachment 289396
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1258559</commentid>
    <comment_count>2</comment_count>
      <attachid>289396</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2016-12-09 20:32:40 -0800</bug_when>
    <thetext>Comment on attachment 289396
Patch

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

&gt; Source/WTF/wtf/text/StringView.h:626
&gt; -    StringView m_stringView;
&gt; +    const StringView&amp; m_stringView;

This change is not good. If the StringView that was passed in to this iterator is destroyed, we will access the memory location the StringView was once stored at. The old implementation did not require that the StringView still be around, just that the underlying string data still be around. This is especially dangerous if the StringView was a temporary, perhaps the result of a call to StringView::substring.

So if you want to optimize this, please do it a safer way.

&gt; Source/WTF/wtf/text/StringView.h:678
&gt; +    const void* m_current;
&gt; +    const void* m_end;
&gt; +    bool m_is8Bit;

Doing this gets rid of all the ASSERT(underlyingStringIsValid()) checks that would have been done each time the string view is used when StringView::length, StringView::characters8, and StringView::characters16 was called; this is what catches us if we use a stale iterator after the string is destroyed. To preserve those checks we need to add additional code inside #if CHECK_STRINGVIEW_LIFETIME and presumably the easiest approach is to keep a copy of the StringView around in a separate data member only when those checks are enabled.

To avoid all the type casting, I suggest we do things one of these two ways. Something like this:

    union {
        const LChar* m_current8;
        const UChar* m_current16;
    };
    union {
        const LChar* m_end8;
        const UChar* m_end16;
    };
    bool m_is8Bit;

Or we something different, like this; is8Bit could be based on the variant.

    Variant&lt;std::pair&lt;const LChar*, const LChar*&gt;, std::pair&lt;const UChar*, const UChar*&gt;&gt; m_characters;

The use of pair is a bit ugly, so maybe if you like that separate style, something more elegant.

&gt; Source/WTF/wtf/text/StringView.h:733
&gt;  {

Should ASSERT(index &lt;= stringView.length()).

&gt; Source/WTF/wtf/text/StringView.h:735
&gt; +        const LChar* begin = stringView.characters8();

I suggest auto or auto* here.

&gt; Source/WTF/wtf/text/StringView.h:737
&gt; +        m_current = reinterpret_cast&lt;const void*&gt;(begin + index);
&gt; +        m_end = reinterpret_cast&lt;const void*&gt;(begin + stringView.length());

Even if we continue to use const void*, there is no need for these type casts. It is legal to assign const LChar* to const void*. But if we use unions we won’t need type casts here.

&gt; Source/WTF/wtf/text/StringView.h:739
&gt; +        const UChar* begin = stringView.characters16();

Ditto.

&gt; Source/WTF/wtf/text/StringView.h:741
&gt; +        m_current = reinterpret_cast&lt;const void*&gt;(begin + index);
&gt; +        m_end = reinterpret_cast&lt;const void*&gt;(begin + stringView.length());

Ditto.

&gt; Source/WTF/wtf/text/StringView.h:749
&gt; +        m_current = reinterpret_cast&lt;const void*&gt;(reinterpret_cast&lt;const LChar*&gt;(m_current) + 1);

No need for all the reinterpret_cast, because static_cast has the power to cast from const void* because of idioms like this one, and there is no need to cast *to* const void*. Just:

    m_current = static_cast&lt;const LChar*&gt;(m_current) + 1;

Or:

    ++m_current8;

Depending on whether you take my advice above.

&gt; Source/WTF/wtf/text/StringView.h:752
&gt; +        size_t length = reinterpret_cast&lt;const UChar*&gt;(m_end) - reinterpret_cast&lt;const UChar*&gt;(m_current);

These should be static_cast, or no cast at all if we use union.

&gt; Source/WTF/wtf/text/StringView.h:753
&gt; +        U16_FWD_1(reinterpret_cast&lt;const UChar*&gt;(m_current), i, length);

Ditto.

&gt; Source/WTF/wtf/text/StringView.h:754
&gt; +        m_current = reinterpret_cast&lt;const void*&gt;(reinterpret_cast&lt;const UChar*&gt;(m_current) + i);

Ditto.

&gt; Source/WTF/wtf/text/StringView.h:765
&gt;  inline auto StringView::CodePoints::Iterator::operator=(const Iterator&amp; other) -&gt; Iterator&amp;
&gt;  {
&gt; -    m_stringView = other.m_stringView;
&gt; -    m_nextCodePointOffset = other.m_nextCodePointOffset;
&gt; -    m_codePoint = other.m_codePoint;
&gt; +    m_current = other.m_current;
&gt; +    m_end = other.m_end;
&gt; +    m_is8Bit = other.m_is8Bit;
&gt;      return *this;
&gt;  }

We don’t need to write this out. This is what would be generated if we just didn’t define an explicit operator= function. So I suggest not defining one and letting the compiler take care of generating a correct function.

&gt; Source/WTF/wtf/text/StringView.h:771
&gt; +        return *reinterpret_cast&lt;const LChar*&gt;(m_current);

Should be static_cast or no cast at all if we use the union.

&gt; Source/WTF/wtf/text/StringView.h:772
&gt; +    UChar32 c;

I would prefer to use a word or phrase, rather than a single letter, for this local variable. I think &quot;codePoint&quot; would do nicely.

&gt; Source/WTF/wtf/text/StringView.h:773
&gt; +    U16_GET(reinterpret_cast&lt;const UChar*&gt;(m_current), 0, 0, reinterpret_cast&lt;const UChar*&gt;(m_end) - reinterpret_cast&lt;const UChar*&gt;(m_current), c);

Ditto. I am also slightly concerned that doing this work separately from U16_FWD_1 might result in code that checks for surrogate pairs twice, so is always unnecessarily inefficient, but I am not sure.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1742425</commentid>
    <comment_count>3</comment_count>
      <attachid>423927</attachid>
    <who name="Alex Christensen">achristensen</who>
    <bug_when>2021-03-22 13:25:59 -0700</bug_when>
    <thetext>Created attachment 423927
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1742461</commentid>
    <comment_count>4</comment_count>
      <attachid>423934</attachid>
    <who name="Alex Christensen">achristensen</who>
    <bug_when>2021-03-22 14:07:22 -0700</bug_when>
    <thetext>Created attachment 423934
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1742525</commentid>
    <comment_count>5</comment_count>
      <attachid>423934</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2021-03-22 15:45:49 -0700</bug_when>
    <thetext>Comment on attachment 423934
Patch

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

&gt; Source/WTF/wtf/text/StringView.h:847
&gt; +    union {
&gt; +        const LChar* m_current8;
&gt; +        const UChar* m_current16;
&gt; +    };
&gt; +    union {
&gt; +        const LChar* m_end8;
&gt; +        const UChar* m_end16;
&gt; +    };

We could consider using const void* for both of these. This would help us understand the code is in operator== without relying on properties of unions that aren’t deeply guaranteed.

We would use static_cast to pull values out: there would be only 4 places we’d need them.

&gt; Source/WTF/wtf/text/StringView.h:933
&gt; +        size_t length = m_end16 - m_current16;

Why local variable here?

&gt; Source/WTF/wtf/text/StringView.h:951
&gt; +    U16_GET(m_current16, 0, 0, m_end16 - m_current16, codePoint);

But not here for the same kind of argument?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1742575</commentid>
    <comment_count>6</comment_count>
      <attachid>423965</attachid>
    <who name="Alex Christensen">achristensen</who>
    <bug_when>2021-03-22 17:04:34 -0700</bug_when>
    <thetext>Created attachment 423965
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1742623</commentid>
    <comment_count>7</comment_count>
      <attachid>423965</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2021-03-22 18:06:21 -0700</bug_when>
    <thetext>Comment on attachment 423965
Patch

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

&gt; Source/WTF/ChangeLog:10
&gt; +        In order to make const members, I need to remove the ability to reassign an iterator to a different iterator.
&gt; +        This ability was only used in tests, so I modified the test to still compile successfully after this const addition.

Why did you need to make const members?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1742624</commentid>
    <comment_count>8</comment_count>
    <who name="Alex Christensen">achristensen</who>
    <bug_when>2021-03-22 18:07:20 -0700</bug_when>
    <thetext>Because I can?  I think it&apos;s good to have iterators being unable to switch between 8 and 16 bit at least.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1742630</commentid>
    <comment_count>9</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2021-03-22 18:26:56 -0700</bug_when>
    <thetext>(In reply to Alex Christensen from comment #8)
&gt; Because I can?  I think it&apos;s good to have iterators being unable to switch
&gt; between 8 and 16 bit at least.

That doesn’t seem like a worthwhile thing.

Iterators can’t &quot;switch&quot;; part of the benefit of them being objects is that they stay consistent, for example &quot;current&quot; and &quot;end&quot; will stay consistent and not get mixed up. But like any other typical value-type object, they can be overwritten by a completely different iterator using the assignment operator. I don’t think it is valuable to make a value object like this intrinsically const; if a client wants one they can’t modify by accident they can make it const. It’s like making an int const so it can’t change from an even number to an odd number.

Iterators in the standard library are like this. For example, you can take an iterator pointing to the beginning of a std::set and overwrite it with an iterator pointing to the beginning of another set::set, or whatever, as long as the sets are of the same type.

I suggest we drop this const.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1742636</commentid>
    <comment_count>10</comment_count>
      <attachid>423976</attachid>
    <who name="Alex Christensen">achristensen</who>
    <bug_when>2021-03-22 18:48:32 -0700</bug_when>
    <thetext>Created attachment 423976
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1742643</commentid>
    <comment_count>11</comment_count>
      <attachid>423976</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2021-03-22 19:09:34 -0700</bug_when>
    <thetext>Comment on attachment 423976
Patch

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

&gt; Source/WTF/wtf/text/StringView.h:922
&gt; +        ASSERT(m_current &lt; m_end);

Seems like we can hoist this assertion out of the if statement.

&gt; Source/WTF/wtf/text/StringView.h:940
&gt; +        ASSERT(m_current &lt; m_end);

Ditto.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1742819</commentid>
    <comment_count>12</comment_count>
    <who name="Alex Christensen">achristensen</who>
    <bug_when>2021-03-23 08:57:00 -0700</bug_when>
    <thetext>r274872</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>289396</attachid>
            <date>2016-09-20 13:56:51 -0700</date>
            <delta_ts>2021-03-22 13:25:56 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-162315-20160920135404.patch</filename>
            <type>text/plain</type>
            <size>4757</size>
            <attacher name="Alex Christensen">achristensen</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XVEYvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XVEYvQ2hh
bmdlTG9nCShyZXZpc2lvbiAyMDYxNzApCisrKyBTb3VyY2UvV1RGL0NoYW5nZUxvZwkod29ya2lu
ZyBjb3B5KQpAQCAtMSwzICsxLDE5IEBACisyMDE2LTA5LTIwICBBbGV4IENocmlzdGVuc2VuICA8
YWNocmlzdGVuc2VuQHdlYmtpdC5vcmc+CisKKyAgICAgICAgT3B0aW1pemUgU3RyaW5nVmlldzo6
Q29kZVBvaW50czo6SXRlcmF0b3IKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hv
d19idWcuY2dpP2lkPTE2MjMxNQorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEp
LgorCisgICAgICAgIFRoZXJlIGlzIGEgbG90IG9mIHVubmVjZXNzYXJ5IHBvaW50ZXIgZGVyZWZl
cmVuY2luZyB3aXRoIHRoZSBjdXJyZW50IGl0ZXJhdG9ycy4KKyAgICAgICAgV2l0aCB0aGUgZXhh
Y3Qgc2FtZSBhc3N1bXB0aW9ucyB0aGF0IHdlIGN1cnJlbnRseSB1c2UsIG11Y2ggb2YgdGhlIHVu
bmVlZGVkCisgICAgICAgIGRlcmVmZXJlbmNpbmcgY2FuIGJlIGVsaW1pbmF0ZWQgd2l0aG91dCBj
aGFuZ2luZyBiZWhhdmlvci4KKworICAgICAgICAqIHd0Zi90ZXh0L1N0cmluZ1ZpZXcuaDoKKyAg
ICAgICAgKFdURjo6U3RyaW5nVmlldzo6Q29kZVBvaW50czo6SXRlcmF0b3I6Okl0ZXJhdG9yKToK
KyAgICAgICAgKFdURjo6U3RyaW5nVmlldzo6Q29kZVBvaW50czo6SXRlcmF0b3I6Om9wZXJhdG9y
Kik6CisgICAgICAgIChXVEY6OlN0cmluZ1ZpZXc6OkNvZGVQb2ludHM6Okl0ZXJhdG9yOjpvcGVy
YXRvcj09KToKKwogMjAxNi0wOS0yMCAgRmlsaXAgUGl6bG8gIDxmcGl6bG9AYXBwbGUuY29tPgog
CiAgICAgICAgIE1ha2UgTWFya2VkQmxvY2sgc3RhdGUgdHJhY2tpbmcgc3VwcG9ydCBvdmVybGFw
cGVkIGFsbG9jYXRpb24gYW5kIG1hcmtpbmcgc3RhdGUKSW5kZXg6IFNvdXJjZS9XVEYvd3RmL3Rl
eHQvU3RyaW5nVmlldy5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XVEYvd3RmL3RleHQvU3RyaW5n
Vmlldy5oCShyZXZpc2lvbiAyMDYwOTYpCisrKyBTb3VyY2UvV1RGL3d0Zi90ZXh0L1N0cmluZ1Zp
ZXcuaAkod29ya2luZyBjb3B5KQpAQCAtNjIzLDcgKzYyMyw3IEBAIHB1YmxpYzoKICAgICBJdGVy
YXRvciBlbmQoKSBjb25zdDsKIAogcHJpdmF0ZToKLSAgICBTdHJpbmdWaWV3IG1fc3RyaW5nVmll
dzsKKyAgICBjb25zdCBTdHJpbmdWaWV3JiBtX3N0cmluZ1ZpZXc7CiB9OwogCiBjbGFzcyBTdHJp
bmdWaWV3OjpDb2RlVW5pdHMgewpAQCAtNjczLDkgKzY3Myw5IEBAIHB1YmxpYzoKICAgICBJdGVy
YXRvciYgb3BlcmF0b3I9KGNvbnN0IEl0ZXJhdG9yJik7CiAKIHByaXZhdGU6Ci0gICAgc3RkOjpy
ZWZlcmVuY2Vfd3JhcHBlcjxjb25zdCBTdHJpbmdWaWV3PiBtX3N0cmluZ1ZpZXc7Ci0gICAgT3B0
aW9uYWw8dW5zaWduZWQ+IG1fbmV4dENvZGVQb2ludE9mZnNldDsKLSAgICBVQ2hhcjMyIG1fY29k
ZVBvaW50OworICAgIGNvbnN0IHZvaWQqIG1fY3VycmVudDsKKyAgICBjb25zdCB2b2lkKiBtX2Vu
ZDsKKyAgICBib29sIG1faXM4Qml0OwogfTsKIAogY2xhc3MgU3RyaW5nVmlldzo6Q29kZVVuaXRz
OjpJdGVyYXRvciB7CkBAIC03MjksNDUgKzcyOSw1NiBAQCBpbmxpbmUgU3RyaW5nVmlldzo6Q29k
ZVBvaW50czo6Q29kZVBvaW50CiB9CiAKIGlubGluZSBTdHJpbmdWaWV3OjpDb2RlUG9pbnRzOjpJ
dGVyYXRvcjo6SXRlcmF0b3IoY29uc3QgU3RyaW5nVmlldyYgc3RyaW5nVmlldywgdW5zaWduZWQg
aW5kZXgpCi0gICAgOiBtX3N0cmluZ1ZpZXcoc3RyaW5nVmlldykKLSAgICAsIG1fbmV4dENvZGVQ
b2ludE9mZnNldChpbmRleCkKKyAgICA6IG1faXM4Qml0KHN0cmluZ1ZpZXcuaXM4Qml0KCkpCiB7
Ci0gICAgb3BlcmF0b3IrKygpOworICAgIGlmIChtX2lzOEJpdCkgeworICAgICAgICBjb25zdCBM
Q2hhciogYmVnaW4gPSBzdHJpbmdWaWV3LmNoYXJhY3RlcnM4KCk7CisgICAgICAgIG1fY3VycmVu
dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KGJlZ2luICsgaW5kZXgpOworICAgICAg
ICBtX2VuZCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KGJlZ2luICsgc3RyaW5nVmll
dy5sZW5ndGgoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY29uc3QgVUNoYXIqIGJlZ2luID0g
c3RyaW5nVmlldy5jaGFyYWN0ZXJzMTYoKTsKKyAgICAgICAgbV9jdXJyZW50ID0gcmVpbnRlcnBy
ZXRfY2FzdDxjb25zdCB2b2lkKj4oYmVnaW4gKyBpbmRleCk7CisgICAgICAgIG1fZW5kID0gcmVp
bnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4oYmVnaW4gKyBzdHJpbmdWaWV3Lmxlbmd0aCgpKTsK
KyAgICB9CiB9CiAKIGlubGluZSBhdXRvIFN0cmluZ1ZpZXc6OkNvZGVQb2ludHM6Okl0ZXJhdG9y
OjpvcGVyYXRvcisrKCkgLT4gSXRlcmF0b3ImCiB7Ci0gICAgQVNTRVJUKG1fbmV4dENvZGVQb2lu
dE9mZnNldCk7Ci0gICAgaWYgKG1fbmV4dENvZGVQb2ludE9mZnNldC52YWx1ZSgpID09IG1fc3Ry
aW5nVmlldy5nZXQoKS5sZW5ndGgoKSkgewotICAgICAgICBtX25leHRDb2RlUG9pbnRPZmZzZXQg
PSBOdWxsb3B0OwotICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgQVNTRVJUKG1fY3VycmVudCA8
IG1fZW5kKTsKKyAgICBpZiAobV9pczhCaXQpCisgICAgICAgIG1fY3VycmVudCA9IHJlaW50ZXJw
cmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgTENoYXIqPihtX2N1
cnJlbnQpICsgMSk7CisgICAgZWxzZSB7CisgICAgICAgIHVuc2lnbmVkIGkgPSAwOworICAgICAg
ICBzaXplX3QgbGVuZ3RoID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBVQ2hhcio+KG1fZW5kKSAt
IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVUNoYXIqPihtX2N1cnJlbnQpOworICAgICAgICBVMTZf
RldEXzEocmVpbnRlcnByZXRfY2FzdDxjb25zdCBVQ2hhcio+KG1fY3VycmVudCksIGksIGxlbmd0
aCk7CisgICAgICAgIG1fY3VycmVudCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHJl
aW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVUNoYXIqPihtX2N1cnJlbnQpICsgaSk7CiAgICAgfQotICAg
IGlmIChtX3N0cmluZ1ZpZXcuZ2V0KCkuaXM4Qml0KCkpCi0gICAgICAgIG1fY29kZVBvaW50ID0g
bV9zdHJpbmdWaWV3LmdldCgpLmNoYXJhY3RlcnM4KClbbV9uZXh0Q29kZVBvaW50T2Zmc2V0LnZh
bHVlKCkrK107Ci0gICAgZWxzZQotICAgICAgICBVMTZfTkVYVChtX3N0cmluZ1ZpZXcuZ2V0KCku
Y2hhcmFjdGVyczE2KCksIG1fbmV4dENvZGVQb2ludE9mZnNldC52YWx1ZSgpLCBtX3N0cmluZ1Zp
ZXcuZ2V0KCkubGVuZ3RoKCksIG1fY29kZVBvaW50KTsKLSAgICBBU1NFUlQobV9uZXh0Q29kZVBv
aW50T2Zmc2V0LnZhbHVlKCkgPD0gbV9zdHJpbmdWaWV3LmdldCgpLmxlbmd0aCgpKTsKICAgICBy
ZXR1cm4gKnRoaXM7CiB9CiAKIGlubGluZSBhdXRvIFN0cmluZ1ZpZXc6OkNvZGVQb2ludHM6Okl0
ZXJhdG9yOjpvcGVyYXRvcj0oY29uc3QgSXRlcmF0b3ImIG90aGVyKSAtPiBJdGVyYXRvciYKIHsK
LSAgICBtX3N0cmluZ1ZpZXcgPSBvdGhlci5tX3N0cmluZ1ZpZXc7Ci0gICAgbV9uZXh0Q29kZVBv
aW50T2Zmc2V0ID0gb3RoZXIubV9uZXh0Q29kZVBvaW50T2Zmc2V0OwotICAgIG1fY29kZVBvaW50
ID0gb3RoZXIubV9jb2RlUG9pbnQ7CisgICAgbV9jdXJyZW50ID0gb3RoZXIubV9jdXJyZW50Owor
ICAgIG1fZW5kID0gb3RoZXIubV9lbmQ7CisgICAgbV9pczhCaXQgPSBvdGhlci5tX2lzOEJpdDsK
ICAgICByZXR1cm4gKnRoaXM7CiB9CiAKIGlubGluZSBVQ2hhcjMyIFN0cmluZ1ZpZXc6OkNvZGVQ
b2ludHM6Okl0ZXJhdG9yOjpvcGVyYXRvciooKSBjb25zdAogewotICAgIEFTU0VSVChtX25leHRD
b2RlUG9pbnRPZmZzZXQpOwotICAgIHJldHVybiBtX2NvZGVQb2ludDsKKyAgICBBU1NFUlQobV9j
dXJyZW50IDwgbV9lbmQpOworICAgIGlmIChtX2lzOEJpdCkKKyAgICAgICAgcmV0dXJuICpyZWlu
dGVycHJldF9jYXN0PGNvbnN0IExDaGFyKj4obV9jdXJyZW50KTsKKyAgICBVQ2hhcjMyIGM7Cisg
ICAgVTE2X0dFVChyZWludGVycHJldF9jYXN0PGNvbnN0IFVDaGFyKj4obV9jdXJyZW50KSwgMCwg
MCwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBVQ2hhcio+KG1fZW5kKSAtIHJlaW50ZXJwcmV0X2Nh
c3Q8Y29uc3QgVUNoYXIqPihtX2N1cnJlbnQpLCBjKTsKKyAgICByZXR1cm4gYzsKIH0KIAogaW5s
aW5lIGJvb2wgU3RyaW5nVmlldzo6Q29kZVBvaW50czo6SXRlcmF0b3I6Om9wZXJhdG9yPT0oY29u
c3QgSXRlcmF0b3ImIG90aGVyKSBjb25zdAogewotICAgIEFTU0VSVCgmbV9zdHJpbmdWaWV3Lmdl
dCgpID09ICZvdGhlci5tX3N0cmluZ1ZpZXcuZ2V0KCkpOwotICAgIHJldHVybiBtX25leHRDb2Rl
UG9pbnRPZmZzZXQgPT0gb3RoZXIubV9uZXh0Q29kZVBvaW50T2Zmc2V0OworICAgIEFTU0VSVCht
X2lzOEJpdCA9PSBvdGhlci5tX2lzOEJpdCk7CisgICAgQVNTRVJUKG1fZW5kID09IG90aGVyLm1f
ZW5kKTsKKyAgICByZXR1cm4gbV9jdXJyZW50ID09IG90aGVyLm1fY3VycmVudDsKIH0KIAogaW5s
aW5lIGJvb2wgU3RyaW5nVmlldzo6Q29kZVBvaW50czo6SXRlcmF0b3I6Om9wZXJhdG9yIT0oY29u
c3QgSXRlcmF0b3ImIG90aGVyKSBjb25zdAo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>423927</attachid>
            <date>2021-03-22 13:25:59 -0700</date>
            <delta_ts>2021-03-22 14:29:49 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-162315-20210322132558.patch</filename>
            <type>text/plain</type>
            <size>4587</size>
            <attacher name="Alex Christensen">achristensen</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjc0Njg4CmRpZmYgLS1naXQgYS9Tb3VyY2UvV1RGL0NoYW5n
ZUxvZyBiL1NvdXJjZS9XVEYvQ2hhbmdlTG9nCmluZGV4IDMwOGRjYzdjZDA1ODU1NzhlZmJiOWE3
NWViZGNhOGYwOTZmZjY4NDUuLmUxZTVmMzNmOTEzOGYwMWU1ODY4ODQwZjM1NWFiNWMyYzQxNDQ1
MWEgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XVEYvQ2hhbmdlTG9nCisrKyBiL1NvdXJjZS9XVEYvQ2hh
bmdlTG9nCkBAIC0xLDMgKzEsMTggQEAKKzIwMjEtMDMtMjIgIEFsZXggQ2hyaXN0ZW5zZW4gIDxh
Y2hyaXN0ZW5zZW5Ad2Via2l0Lm9yZz4KKworICAgICAgICBPcHRpbWl6ZSBTdHJpbmdWaWV3OjpD
b2RlUG9pbnRzOjpJdGVyYXRvcgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93
X2J1Zy5jZ2k/aWQ9MTYyMzE1CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISku
CisKKyAgICAgICAgVGhpcyBzdG9yZXMgcmFuZ2UgcG9pbnRlcnMgaW4gdGhlIGl0ZXJhdG9yIGlu
c3RlYWQgb2YgYSBwb2ludGVyIHRvIGEgcG9pbnRlci4KKworICAgICAgICAqIHd0Zi90ZXh0L1N0
cmluZ1ZpZXcuaDoKKyAgICAgICAgKFdURjo6U3RyaW5nVmlldzo6Q29kZVBvaW50czo6SXRlcmF0
b3I6Okl0ZXJhdG9yKToKKyAgICAgICAgKFdURjo6U3RyaW5nVmlldzo6Q29kZVBvaW50czo6SXRl
cmF0b3I6Om9wZXJhdG9yKyspOgorICAgICAgICAoV1RGOjpTdHJpbmdWaWV3OjpDb2RlUG9pbnRz
OjpJdGVyYXRvcjo6b3BlcmF0b3IqIGNvbnN0KToKKyAgICAgICAgKFdURjo6U3RyaW5nVmlldzo6
Q29kZVBvaW50czo6SXRlcmF0b3I6Om9wZXJhdG9yPT0gY29uc3QpOgorCiAyMDIxLTAzLTE4ICBZ
b3Vlbm4gRmFibGV0ICA8eW91ZW5uQGFwcGxlLmNvbT4KIAogICAgICAgICBNb3ZlIGNhbWVyYSBH
UFUgUHJvY2VzcyBmbGFnIHRvIGV4cGVyaW1lbnRhbApkaWZmIC0tZ2l0IGEvU291cmNlL1dURi93
dGYvdGV4dC9TdHJpbmdWaWV3LmggYi9Tb3VyY2UvV1RGL3d0Zi90ZXh0L1N0cmluZ1ZpZXcuaApp
bmRleCA3YmQxYzc1OTA1Mzg3OTNmZjIzNThhNTRhYjBlYjk5ZjZlMTAyOWQ1Li4wZGMwNmMwNzJk
ZDFlMjI0M2Q5YTJjZGZjNjYwZTQzMDA1YjMyOTlhIDEwMDY0NAotLS0gYS9Tb3VyY2UvV1RGL3d0
Zi90ZXh0L1N0cmluZ1ZpZXcuaAorKysgYi9Tb3VyY2UvV1RGL3d0Zi90ZXh0L1N0cmluZ1ZpZXcu
aApAQCAtODM3LDkgKzgzNywxOCBAQCBwdWJsaWM6CiAgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0
IEl0ZXJhdG9yJikgY29uc3Q7CiAKIHByaXZhdGU6Ci0gICAgc3RkOjpyZWZlcmVuY2Vfd3JhcHBl
cjxjb25zdCBTdHJpbmdWaWV3PiBtX3N0cmluZ1ZpZXc7Ci0gICAgT3B0aW9uYWw8dW5zaWduZWQ+
IG1fbmV4dENvZGVQb2ludE9mZnNldDsKLSAgICBVQ2hhcjMyIG1fY29kZVBvaW50OworICAgIHVu
aW9uIHsKKyAgICAgICAgY29uc3QgTENoYXIqIG1fY3VycmVudDg7CisgICAgICAgIGNvbnN0IFVD
aGFyKiBtX2N1cnJlbnQxNjsKKyAgICB9OworICAgIHVuaW9uIHsKKyAgICAgICAgY29uc3QgTENo
YXIqIG1fZW5kODsKKyAgICAgICAgY29uc3QgVUNoYXIqIG1fZW5kMTY7CisgICAgfTsKKyAgICBj
b25zdCBib29sIG1faXM4Qml0OworI2lmIENIRUNLX1NUUklOR1ZJRVdfTElGRVRJTUUKKyAgICBT
dHJpbmdWaWV3IG1fc3RyaW5nVmlldzsKKyNlbmRpZgogfTsKIAogY2xhc3MgU3RyaW5nVmlldzo6
Q29kZVVuaXRzOjpJdGVyYXRvciB7CkBAIC04OTQsMzcgKzkwMyw2NCBAQCBpbmxpbmUgU3RyaW5n
Vmlldzo6Q29kZVBvaW50czo6Q29kZVBvaW50cyhjb25zdCBTdHJpbmdWaWV3JiBzdHJpbmdWaWV3
KQogfQogCiBpbmxpbmUgU3RyaW5nVmlldzo6Q29kZVBvaW50czo6SXRlcmF0b3I6Okl0ZXJhdG9y
KGNvbnN0IFN0cmluZ1ZpZXcmIHN0cmluZ1ZpZXcsIHVuc2lnbmVkIGluZGV4KQotICAgIDogbV9z
dHJpbmdWaWV3KHN0cmluZ1ZpZXcpCi0gICAgLCBtX25leHRDb2RlUG9pbnRPZmZzZXQoaW5kZXgp
CisgICAgOiBtX2lzOEJpdChzdHJpbmdWaWV3LmlzOEJpdCgpKQorI2lmIENIRUNLX1NUUklOR1ZJ
RVdfTElGRVRJTUUKKyAgICAsIG1fc3RyaW5nVmlldyhzdHJpbmdWaWV3KQorI2VuZGlmCiB7Ci0g
ICAgb3BlcmF0b3IrKygpOworICAgIGlmIChtX2lzOEJpdCkgeworICAgICAgICBjb25zdCBMQ2hh
ciogYmVnaW4gPSBzdHJpbmdWaWV3LmNoYXJhY3RlcnM4KCk7CisgICAgICAgIG1fY3VycmVudDgg
PSBiZWdpbiArIGluZGV4OworICAgICAgICBtX2VuZDggPSBiZWdpbiArIHN0cmluZ1ZpZXcubGVu
Z3RoKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY29uc3QgVUNoYXIqIGJlZ2luID0gc3RyaW5n
Vmlldy5jaGFyYWN0ZXJzMTYoKTsKKyAgICAgICAgbV9jdXJyZW50MTYgPSBiZWdpbiArIGluZGV4
OworICAgICAgICBtX2VuZDE2ID0gYmVnaW4gKyBzdHJpbmdWaWV3Lmxlbmd0aCgpOworICAgIH0K
IH0KIAogaW5saW5lIGF1dG8gU3RyaW5nVmlldzo6Q29kZVBvaW50czo6SXRlcmF0b3I6Om9wZXJh
dG9yKysoKSAtPiBJdGVyYXRvciYKIHsKLSAgICBBU1NFUlQobV9uZXh0Q29kZVBvaW50T2Zmc2V0
KTsKLSAgICBpZiAobV9uZXh0Q29kZVBvaW50T2Zmc2V0LnZhbHVlKCkgPT0gbV9zdHJpbmdWaWV3
LmdldCgpLmxlbmd0aCgpKSB7Ci0gICAgICAgIG1fbmV4dENvZGVQb2ludE9mZnNldCA9IFdURjo6
bnVsbG9wdDsKLSAgICAgICAgcmV0dXJuICp0aGlzOworI2lmIENIRUNLX1NUUklOR1ZJRVdfTElG
RVRJTUUKKyAgICBBU1NFUlQobV9zdHJpbmdWaWV3LnVuZGVybHlpbmdTdHJpbmdJc1ZhbGlkKCkp
OworI2VuZGlmCisgICAgaWYgKG1faXM4Qml0KSB7CisgICAgICAgIEFTU0VSVChtX2N1cnJlbnQ4
IDwgbV9lbmQ4KTsKKyAgICAgICAgKyttX2N1cnJlbnQ4OworICAgIH0gZWxzZSB7CisgICAgICAg
IEFTU0VSVChtX2N1cnJlbnQxNiA8IG1fZW5kMTYpOworICAgICAgICB1bnNpZ25lZCBpID0gMDsK
KyAgICAgICAgc2l6ZV90IGxlbmd0aCA9IG1fZW5kMTYgLSBtX2N1cnJlbnQxNjsKKyAgICAgICAg
VTE2X0ZXRF8xKG1fY3VycmVudDE2LCBpLCBsZW5ndGgpOworICAgICAgICBtX2N1cnJlbnQxNiA9
IG1fY3VycmVudDE2ICsgaTsKICAgICB9Ci0gICAgaWYgKG1fc3RyaW5nVmlldy5nZXQoKS5pczhC
aXQoKSkKLSAgICAgICAgbV9jb2RlUG9pbnQgPSBtX3N0cmluZ1ZpZXcuZ2V0KCkuY2hhcmFjdGVy
czgoKVttX25leHRDb2RlUG9pbnRPZmZzZXQudmFsdWUoKSsrXTsKLSAgICBlbHNlCi0gICAgICAg
IFUxNl9ORVhUKG1fc3RyaW5nVmlldy5nZXQoKS5jaGFyYWN0ZXJzMTYoKSwgbV9uZXh0Q29kZVBv
aW50T2Zmc2V0LnZhbHVlKCksIG1fc3RyaW5nVmlldy5nZXQoKS5sZW5ndGgoKSwgbV9jb2RlUG9p
bnQpOwotICAgIEFTU0VSVChtX25leHRDb2RlUG9pbnRPZmZzZXQudmFsdWUoKSA8PSBtX3N0cmlu
Z1ZpZXcuZ2V0KCkubGVuZ3RoKCkpOwogICAgIHJldHVybiAqdGhpczsKIH0KIAogaW5saW5lIFVD
aGFyMzIgU3RyaW5nVmlldzo6Q29kZVBvaW50czo6SXRlcmF0b3I6Om9wZXJhdG9yKigpIGNvbnN0
CiB7Ci0gICAgQVNTRVJUKG1fbmV4dENvZGVQb2ludE9mZnNldCk7Ci0gICAgcmV0dXJuIG1fY29k
ZVBvaW50OworI2lmIENIRUNLX1NUUklOR1ZJRVdfTElGRVRJTUUKKyAgICBBU1NFUlQobV9zdHJp
bmdWaWV3LnVuZGVybHlpbmdTdHJpbmdJc1ZhbGlkKCkpOworI2VuZGlmCisgICAgaWYgKG1faXM4
Qml0KSB7CisgICAgICAgIEFTU0VSVChtX2N1cnJlbnQ4IDwgbV9lbmQ4KTsKKyAgICAgICAgcmV0
dXJuICptX2N1cnJlbnQ4OworICAgIH0KKyAgICBBU1NFUlQobV9jdXJyZW50MTYgPCBtX2VuZDE2
KTsKKyAgICBVQ2hhcjMyIGNvZGVQb2ludDsKKyAgICBVMTZfR0VUKG1fY3VycmVudDE2LCAwLCAw
LCBtX2VuZDE2IC0gbV9jdXJyZW50MTYsIGNvZGVQb2ludCk7CisgICAgcmV0dXJuIGNvZGVQb2lu
dDsKIH0KIAogaW5saW5lIGJvb2wgU3RyaW5nVmlldzo6Q29kZVBvaW50czo6SXRlcmF0b3I6Om9w
ZXJhdG9yPT0oY29uc3QgSXRlcmF0b3ImIG90aGVyKSBjb25zdAogewotICAgIEFTU0VSVCgmbV9z
dHJpbmdWaWV3LmdldCgpID09ICZvdGhlci5tX3N0cmluZ1ZpZXcuZ2V0KCkpOwotICAgIHJldHVy
biBtX25leHRDb2RlUG9pbnRPZmZzZXQgPT0gb3RoZXIubV9uZXh0Q29kZVBvaW50T2Zmc2V0Owor
I2lmIENIRUNLX1NUUklOR1ZJRVdfTElGRVRJTUUKKyAgICBBU1NFUlQobV9zdHJpbmdWaWV3LnVu
ZGVybHlpbmdTdHJpbmdJc1ZhbGlkKCkpOworI2VuZGlmCisgICAgQVNTRVJUKG1faXM4Qml0ID09
IG90aGVyLm1faXM4Qml0KTsKKyAgICBBU1NFUlQobV9lbmQ4ID09IG90aGVyLm1fZW5kOCk7Cisg
ICAgLy8gVGhpcyBpcyBvayBldmVuIGlmIG1faXM4Qml0IGlzIGZhbHNlIGJlY2F1c2UgZWl0aGVy
IHdheSB3ZSBhcmUganVzdCBjb21wYXJpbmcgYSBwb2ludGVyIHNhdmVkIGluIHRoZSBzYW1lIHVu
aW9uLgorICAgIHJldHVybiBtX2N1cnJlbnQ4ID09IG90aGVyLm1fY3VycmVudDg7CiB9CiAKIGlu
bGluZSBib29sIFN0cmluZ1ZpZXc6OkNvZGVQb2ludHM6Okl0ZXJhdG9yOjpvcGVyYXRvciE9KGNv
bnN0IEl0ZXJhdG9yJiBvdGhlcikgY29uc3QK
</data>
<flag name="commit-queue"
          id="443445"
          type_id="3"
          status="-"
          setter="ews-feeder"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>423934</attachid>
            <date>2021-03-22 14:07:22 -0700</date>
            <delta_ts>2021-03-22 17:04:32 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-162315-20210322140721.patch</filename>
            <type>text/plain</type>
            <size>4572</size>
            <attacher name="Alex Christensen">achristensen</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjc0Nzk2CmRpZmYgLS1naXQgYS9Tb3VyY2UvV1RGL0NoYW5n
ZUxvZyBiL1NvdXJjZS9XVEYvQ2hhbmdlTG9nCmluZGV4IDllMTVjYjQxOTc0ZGU5YjBlMDg4OGMy
NjI3YTk2NDlmNzIwNDdjMGUuLjk0ODA3MGNlNzdhOGNmMDhiOWUwMGIzNjRlMmJjNTgwZTg5MDYx
NDYgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XVEYvQ2hhbmdlTG9nCisrKyBiL1NvdXJjZS9XVEYvQ2hh
bmdlTG9nCkBAIC0xLDMgKzEsMTggQEAKKzIwMjEtMDMtMjIgIEFsZXggQ2hyaXN0ZW5zZW4gIDxh
Y2hyaXN0ZW5zZW5Ad2Via2l0Lm9yZz4KKworICAgICAgICBPcHRpbWl6ZSBTdHJpbmdWaWV3OjpD
b2RlUG9pbnRzOjpJdGVyYXRvcgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93
X2J1Zy5jZ2k/aWQ9MTYyMzE1CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISku
CisKKyAgICAgICAgVGhpcyBzdG9yZXMgcmFuZ2UgcG9pbnRlcnMgaW4gdGhlIGl0ZXJhdG9yIGlu
c3RlYWQgb2YgYSBwb2ludGVyIHRvIGEgcG9pbnRlci4KKworICAgICAgICAqIHd0Zi90ZXh0L1N0
cmluZ1ZpZXcuaDoKKyAgICAgICAgKFdURjo6U3RyaW5nVmlldzo6Q29kZVBvaW50czo6SXRlcmF0
b3I6Okl0ZXJhdG9yKToKKyAgICAgICAgKFdURjo6U3RyaW5nVmlldzo6Q29kZVBvaW50czo6SXRl
cmF0b3I6Om9wZXJhdG9yKyspOgorICAgICAgICAoV1RGOjpTdHJpbmdWaWV3OjpDb2RlUG9pbnRz
OjpJdGVyYXRvcjo6b3BlcmF0b3IqIGNvbnN0KToKKyAgICAgICAgKFdURjo6U3RyaW5nVmlldzo6
Q29kZVBvaW50czo6SXRlcmF0b3I6Om9wZXJhdG9yPT0gY29uc3QpOgorCiAyMDIxLTAzLTIyICBS
b2IgQnVpcyAgPHJidWlzQGlnYWxpYS5jb20+CiAKICAgICAgICAgW2Nzcy1jb250YWluXSBQYXJz
ZSBDU1MgY29udGFpbiBwcm9wZXJ0eQpkaWZmIC0tZ2l0IGEvU291cmNlL1dURi93dGYvdGV4dC9T
dHJpbmdWaWV3LmggYi9Tb3VyY2UvV1RGL3d0Zi90ZXh0L1N0cmluZ1ZpZXcuaAppbmRleCA3YmQx
Yzc1OTA1Mzg3OTNmZjIzNThhNTRhYjBlYjk5ZjZlMTAyOWQ1Li5iZTg2ZjRiY2QzNjBkZWUyYzIx
OTE2ZmNmN2E2OTYyNmE4MjMzNzk0IDEwMDY0NAotLS0gYS9Tb3VyY2UvV1RGL3d0Zi90ZXh0L1N0
cmluZ1ZpZXcuaAorKysgYi9Tb3VyY2UvV1RGL3d0Zi90ZXh0L1N0cmluZ1ZpZXcuaApAQCAtODM3
LDkgKzgzNywxOCBAQCBwdWJsaWM6CiAgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEl0ZXJhdG9y
JikgY29uc3Q7CiAKIHByaXZhdGU6Ci0gICAgc3RkOjpyZWZlcmVuY2Vfd3JhcHBlcjxjb25zdCBT
dHJpbmdWaWV3PiBtX3N0cmluZ1ZpZXc7Ci0gICAgT3B0aW9uYWw8dW5zaWduZWQ+IG1fbmV4dENv
ZGVQb2ludE9mZnNldDsKLSAgICBVQ2hhcjMyIG1fY29kZVBvaW50OworICAgIHVuaW9uIHsKKyAg
ICAgICAgY29uc3QgTENoYXIqIG1fY3VycmVudDg7CisgICAgICAgIGNvbnN0IFVDaGFyKiBtX2N1
cnJlbnQxNjsKKyAgICB9OworICAgIHVuaW9uIHsKKyAgICAgICAgY29uc3QgTENoYXIqIG1fZW5k
ODsKKyAgICAgICAgY29uc3QgVUNoYXIqIG1fZW5kMTY7CisgICAgfTsKKyAgICBib29sIG1faXM4
Qml0OworI2lmIENIRUNLX1NUUklOR1ZJRVdfTElGRVRJTUUKKyAgICBTdHJpbmdWaWV3IG1fc3Ry
aW5nVmlldzsKKyNlbmRpZgogfTsKIAogY2xhc3MgU3RyaW5nVmlldzo6Q29kZVVuaXRzOjpJdGVy
YXRvciB7CkBAIC04OTQsMzcgKzkwMyw2NCBAQCBpbmxpbmUgU3RyaW5nVmlldzo6Q29kZVBvaW50
czo6Q29kZVBvaW50cyhjb25zdCBTdHJpbmdWaWV3JiBzdHJpbmdWaWV3KQogfQogCiBpbmxpbmUg
U3RyaW5nVmlldzo6Q29kZVBvaW50czo6SXRlcmF0b3I6Okl0ZXJhdG9yKGNvbnN0IFN0cmluZ1Zp
ZXcmIHN0cmluZ1ZpZXcsIHVuc2lnbmVkIGluZGV4KQotICAgIDogbV9zdHJpbmdWaWV3KHN0cmlu
Z1ZpZXcpCi0gICAgLCBtX25leHRDb2RlUG9pbnRPZmZzZXQoaW5kZXgpCisgICAgOiBtX2lzOEJp
dChzdHJpbmdWaWV3LmlzOEJpdCgpKQorI2lmIENIRUNLX1NUUklOR1ZJRVdfTElGRVRJTUUKKyAg
ICAsIG1fc3RyaW5nVmlldyhzdHJpbmdWaWV3KQorI2VuZGlmCiB7Ci0gICAgb3BlcmF0b3IrKygp
OworICAgIGlmIChtX2lzOEJpdCkgeworICAgICAgICBjb25zdCBMQ2hhciogYmVnaW4gPSBzdHJp
bmdWaWV3LmNoYXJhY3RlcnM4KCk7CisgICAgICAgIG1fY3VycmVudDggPSBiZWdpbiArIGluZGV4
OworICAgICAgICBtX2VuZDggPSBiZWdpbiArIHN0cmluZ1ZpZXcubGVuZ3RoKCk7CisgICAgfSBl
bHNlIHsKKyAgICAgICAgY29uc3QgVUNoYXIqIGJlZ2luID0gc3RyaW5nVmlldy5jaGFyYWN0ZXJz
MTYoKTsKKyAgICAgICAgbV9jdXJyZW50MTYgPSBiZWdpbiArIGluZGV4OworICAgICAgICBtX2Vu
ZDE2ID0gYmVnaW4gKyBzdHJpbmdWaWV3Lmxlbmd0aCgpOworICAgIH0KIH0KIAogaW5saW5lIGF1
dG8gU3RyaW5nVmlldzo6Q29kZVBvaW50czo6SXRlcmF0b3I6Om9wZXJhdG9yKysoKSAtPiBJdGVy
YXRvciYKIHsKLSAgICBBU1NFUlQobV9uZXh0Q29kZVBvaW50T2Zmc2V0KTsKLSAgICBpZiAobV9u
ZXh0Q29kZVBvaW50T2Zmc2V0LnZhbHVlKCkgPT0gbV9zdHJpbmdWaWV3LmdldCgpLmxlbmd0aCgp
KSB7Ci0gICAgICAgIG1fbmV4dENvZGVQb2ludE9mZnNldCA9IFdURjo6bnVsbG9wdDsKLSAgICAg
ICAgcmV0dXJuICp0aGlzOworI2lmIENIRUNLX1NUUklOR1ZJRVdfTElGRVRJTUUKKyAgICBBU1NF
UlQobV9zdHJpbmdWaWV3LnVuZGVybHlpbmdTdHJpbmdJc1ZhbGlkKCkpOworI2VuZGlmCisgICAg
aWYgKG1faXM4Qml0KSB7CisgICAgICAgIEFTU0VSVChtX2N1cnJlbnQ4IDwgbV9lbmQ4KTsKKyAg
ICAgICAgKyttX2N1cnJlbnQ4OworICAgIH0gZWxzZSB7CisgICAgICAgIEFTU0VSVChtX2N1cnJl
bnQxNiA8IG1fZW5kMTYpOworICAgICAgICB1bnNpZ25lZCBpID0gMDsKKyAgICAgICAgc2l6ZV90
IGxlbmd0aCA9IG1fZW5kMTYgLSBtX2N1cnJlbnQxNjsKKyAgICAgICAgVTE2X0ZXRF8xKG1fY3Vy
cmVudDE2LCBpLCBsZW5ndGgpOworICAgICAgICBtX2N1cnJlbnQxNiA9IG1fY3VycmVudDE2ICsg
aTsKICAgICB9Ci0gICAgaWYgKG1fc3RyaW5nVmlldy5nZXQoKS5pczhCaXQoKSkKLSAgICAgICAg
bV9jb2RlUG9pbnQgPSBtX3N0cmluZ1ZpZXcuZ2V0KCkuY2hhcmFjdGVyczgoKVttX25leHRDb2Rl
UG9pbnRPZmZzZXQudmFsdWUoKSsrXTsKLSAgICBlbHNlCi0gICAgICAgIFUxNl9ORVhUKG1fc3Ry
aW5nVmlldy5nZXQoKS5jaGFyYWN0ZXJzMTYoKSwgbV9uZXh0Q29kZVBvaW50T2Zmc2V0LnZhbHVl
KCksIG1fc3RyaW5nVmlldy5nZXQoKS5sZW5ndGgoKSwgbV9jb2RlUG9pbnQpOwotICAgIEFTU0VS
VChtX25leHRDb2RlUG9pbnRPZmZzZXQudmFsdWUoKSA8PSBtX3N0cmluZ1ZpZXcuZ2V0KCkubGVu
Z3RoKCkpOwogICAgIHJldHVybiAqdGhpczsKIH0KIAogaW5saW5lIFVDaGFyMzIgU3RyaW5nVmll
dzo6Q29kZVBvaW50czo6SXRlcmF0b3I6Om9wZXJhdG9yKigpIGNvbnN0CiB7Ci0gICAgQVNTRVJU
KG1fbmV4dENvZGVQb2ludE9mZnNldCk7Ci0gICAgcmV0dXJuIG1fY29kZVBvaW50OworI2lmIENI
RUNLX1NUUklOR1ZJRVdfTElGRVRJTUUKKyAgICBBU1NFUlQobV9zdHJpbmdWaWV3LnVuZGVybHlp
bmdTdHJpbmdJc1ZhbGlkKCkpOworI2VuZGlmCisgICAgaWYgKG1faXM4Qml0KSB7CisgICAgICAg
IEFTU0VSVChtX2N1cnJlbnQ4IDwgbV9lbmQ4KTsKKyAgICAgICAgcmV0dXJuICptX2N1cnJlbnQ4
OworICAgIH0KKyAgICBBU1NFUlQobV9jdXJyZW50MTYgPCBtX2VuZDE2KTsKKyAgICBVQ2hhcjMy
IGNvZGVQb2ludDsKKyAgICBVMTZfR0VUKG1fY3VycmVudDE2LCAwLCAwLCBtX2VuZDE2IC0gbV9j
dXJyZW50MTYsIGNvZGVQb2ludCk7CisgICAgcmV0dXJuIGNvZGVQb2ludDsKIH0KIAogaW5saW5l
IGJvb2wgU3RyaW5nVmlldzo6Q29kZVBvaW50czo6SXRlcmF0b3I6Om9wZXJhdG9yPT0oY29uc3Qg
SXRlcmF0b3ImIG90aGVyKSBjb25zdAogewotICAgIEFTU0VSVCgmbV9zdHJpbmdWaWV3LmdldCgp
ID09ICZvdGhlci5tX3N0cmluZ1ZpZXcuZ2V0KCkpOwotICAgIHJldHVybiBtX25leHRDb2RlUG9p
bnRPZmZzZXQgPT0gb3RoZXIubV9uZXh0Q29kZVBvaW50T2Zmc2V0OworI2lmIENIRUNLX1NUUklO
R1ZJRVdfTElGRVRJTUUKKyAgICBBU1NFUlQobV9zdHJpbmdWaWV3LnVuZGVybHlpbmdTdHJpbmdJ
c1ZhbGlkKCkpOworI2VuZGlmCisgICAgQVNTRVJUKG1faXM4Qml0ID09IG90aGVyLm1faXM4Qml0
KTsKKyAgICBBU1NFUlQobV9lbmQ4ID09IG90aGVyLm1fZW5kOCk7CisgICAgLy8gVGhpcyBpcyBv
ayBldmVuIGlmIG1faXM4Qml0IGlzIGZhbHNlIGJlY2F1c2UgZWl0aGVyIHdheSB3ZSBhcmUganVz
dCBjb21wYXJpbmcgYSBwb2ludGVyIHNhdmVkIGluIHRoZSBzYW1lIHVuaW9uLgorICAgIHJldHVy
biBtX2N1cnJlbnQ4ID09IG90aGVyLm1fY3VycmVudDg7CiB9CiAKIGlubGluZSBib29sIFN0cmlu
Z1ZpZXc6OkNvZGVQb2ludHM6Okl0ZXJhdG9yOjpvcGVyYXRvciE9KGNvbnN0IEl0ZXJhdG9yJiBv
dGhlcikgY29uc3QK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>423965</attachid>
            <date>2021-03-22 17:04:34 -0700</date>
            <delta_ts>2021-03-22 18:48:30 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-162315-20210322170433.patch</filename>
            <type>text/plain</type>
            <size>7590</size>
            <attacher name="Alex Christensen">achristensen</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjc0ODE2CmRpZmYgLS1naXQgYS9Tb3VyY2UvV1RGL0NoYW5n
ZUxvZyBiL1NvdXJjZS9XVEYvQ2hhbmdlTG9nCmluZGV4IGMwODM3MGY4OTY0MzQ4NDA4OGNkZDIy
ZGM2MDllYmFjZDAzODQ0MTYuLjZiMzI3YTBmNDEwMDlkNmY0ZmUwODA1MDEyMDY1OTQ1MmZmYWNl
ODQgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XVEYvQ2hhbmdlTG9nCisrKyBiL1NvdXJjZS9XVEYvQ2hh
bmdlTG9nCkBAIC0xLDMgKzEsMjAgQEAKKzIwMjEtMDMtMjIgIEFsZXggQ2hyaXN0ZW5zZW4gIDxh
Y2hyaXN0ZW5zZW5Ad2Via2l0Lm9yZz4KKworICAgICAgICBPcHRpbWl6ZSBTdHJpbmdWaWV3OjpD
b2RlUG9pbnRzOjpJdGVyYXRvcgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93
X2J1Zy5jZ2k/aWQ9MTYyMzE1CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgRGFyaW4gQWRsZXIuCisK
KyAgICAgICAgVGhpcyBzdG9yZXMgcmFuZ2UgcG9pbnRlcnMgaW4gdGhlIGl0ZXJhdG9yIGluc3Rl
YWQgb2YgYSBwb2ludGVyIHRvIGEgcG9pbnRlci4KKyAgICAgICAgSW4gb3JkZXIgdG8gbWFrZSBj
b25zdCBtZW1iZXJzLCBJIG5lZWQgdG8gcmVtb3ZlIHRoZSBhYmlsaXR5IHRvIHJlYXNzaWduIGFu
IGl0ZXJhdG9yIHRvIGEgZGlmZmVyZW50IGl0ZXJhdG9yLgorICAgICAgICBUaGlzIGFiaWxpdHkg
d2FzIG9ubHkgdXNlZCBpbiB0ZXN0cywgc28gSSBtb2RpZmllZCB0aGUgdGVzdCB0byBzdGlsbCBj
b21waWxlIHN1Y2Nlc3NmdWxseSBhZnRlciB0aGlzIGNvbnN0IGFkZGl0aW9uLgorCisgICAgICAg
ICogd3RmL3RleHQvU3RyaW5nVmlldy5oOgorICAgICAgICAoV1RGOjpTdHJpbmdWaWV3OjpDb2Rl
UG9pbnRzOjpJdGVyYXRvcjo6SXRlcmF0b3IpOgorICAgICAgICAoV1RGOjpTdHJpbmdWaWV3OjpD
b2RlUG9pbnRzOjpJdGVyYXRvcjo6b3BlcmF0b3IrKyk6CisgICAgICAgIChXVEY6OlN0cmluZ1Zp
ZXc6OkNvZGVQb2ludHM6Okl0ZXJhdG9yOjpvcGVyYXRvciogY29uc3QpOgorICAgICAgICAoV1RG
OjpTdHJpbmdWaWV3OjpDb2RlUG9pbnRzOjpJdGVyYXRvcjo6b3BlcmF0b3I9PSBjb25zdCk6CisK
IDIwMjEtMDMtMjIgIERldmluIFJvdXNzbyAgPGRyb3Vzc29AYXBwbGUuY29tPgogCiAgICAgICAg
IFJlbW92ZSB1bnVzZWQgSlMgYW5kIENTUyBmaWxlcyBvZiBtZWRpYSBjb250cm9scwpkaWZmIC0t
Z2l0IGEvU291cmNlL1dURi93dGYvdGV4dC9TdHJpbmdWaWV3LmggYi9Tb3VyY2UvV1RGL3d0Zi90
ZXh0L1N0cmluZ1ZpZXcuaAppbmRleCA3YmQxYzc1OTA1Mzg3OTNmZjIzNThhNTRhYjBlYjk5ZjZl
MTAyOWQ1Li4wODE3ODhjMzgyY2JlMDRjODk5ZmMzNTE2YzU2YTYyNWFhMWQwZDQyIDEwMDY0NAot
LS0gYS9Tb3VyY2UvV1RGL3d0Zi90ZXh0L1N0cmluZ1ZpZXcuaAorKysgYi9Tb3VyY2UvV1RGL3d0
Zi90ZXh0L1N0cmluZ1ZpZXcuaApAQCAtODM3LDkgKzgzNywxMiBAQCBwdWJsaWM6CiAgICAgYm9v
bCBvcGVyYXRvciE9KGNvbnN0IEl0ZXJhdG9yJikgY29uc3Q7CiAKIHByaXZhdGU6Ci0gICAgc3Rk
OjpyZWZlcmVuY2Vfd3JhcHBlcjxjb25zdCBTdHJpbmdWaWV3PiBtX3N0cmluZ1ZpZXc7Ci0gICAg
T3B0aW9uYWw8dW5zaWduZWQ+IG1fbmV4dENvZGVQb2ludE9mZnNldDsKLSAgICBVQ2hhcjMyIG1f
Y29kZVBvaW50OworICAgIGNvbnN0IHZvaWQqIG1fY3VycmVudDsKKyAgICBjb25zdCB2b2lkKiBj
b25zdCBtX2VuZDsKKyAgICBjb25zdCBib29sIG1faXM4Qml0OworI2lmIENIRUNLX1NUUklOR1ZJ
RVdfTElGRVRJTUUKKyAgICBTdHJpbmdWaWV3IG1fc3RyaW5nVmlldzsKKyNlbmRpZgogfTsKIAog
Y2xhc3MgU3RyaW5nVmlldzo6Q29kZVVuaXRzOjpJdGVyYXRvciB7CkBAIC04OTQsMzcgKzg5Nyw1
NyBAQCBpbmxpbmUgU3RyaW5nVmlldzo6Q29kZVBvaW50czo6Q29kZVBvaW50cyhjb25zdCBTdHJp
bmdWaWV3JiBzdHJpbmdWaWV3KQogfQogCiBpbmxpbmUgU3RyaW5nVmlldzo6Q29kZVBvaW50czo6
SXRlcmF0b3I6Okl0ZXJhdG9yKGNvbnN0IFN0cmluZ1ZpZXcmIHN0cmluZ1ZpZXcsIHVuc2lnbmVk
IGluZGV4KQotICAgIDogbV9zdHJpbmdWaWV3KHN0cmluZ1ZpZXcpCi0gICAgLCBtX25leHRDb2Rl
UG9pbnRPZmZzZXQoaW5kZXgpCisgICAgOiBtX2N1cnJlbnQoc3RyaW5nVmlldy5pczhCaXQoKSA/
IHN0YXRpY19jYXN0PGNvbnN0IHZvaWQqPihzdHJpbmdWaWV3LmNoYXJhY3RlcnM4KCkgKyBpbmRl
eCkgOiBzdGF0aWNfY2FzdDxjb25zdCB2b2lkKj4oc3RyaW5nVmlldy5jaGFyYWN0ZXJzMTYoKSAr
IGluZGV4KSkKKyAgICAsIG1fZW5kKHN0cmluZ1ZpZXcuaXM4Qml0KCkgPyBzdGF0aWNfY2FzdDxj
b25zdCB2b2lkKj4oc3RyaW5nVmlldy5jaGFyYWN0ZXJzOCgpICsgc3RyaW5nVmlldy5sZW5ndGgo
KSkgOiBzdGF0aWNfY2FzdDxjb25zdCB2b2lkKj4oc3RyaW5nVmlldy5jaGFyYWN0ZXJzMTYoKSAr
IHN0cmluZ1ZpZXcubGVuZ3RoKCkpKQorICAgICwgbV9pczhCaXQoc3RyaW5nVmlldy5pczhCaXQo
KSkKKyNpZiBDSEVDS19TVFJJTkdWSUVXX0xJRkVUSU1FCisgICAgLCBtX3N0cmluZ1ZpZXcoc3Ry
aW5nVmlldykKKyNlbmRpZgogewotICAgIG9wZXJhdG9yKysoKTsKIH0KIAogaW5saW5lIGF1dG8g
U3RyaW5nVmlldzo6Q29kZVBvaW50czo6SXRlcmF0b3I6Om9wZXJhdG9yKysoKSAtPiBJdGVyYXRv
ciYKIHsKLSAgICBBU1NFUlQobV9uZXh0Q29kZVBvaW50T2Zmc2V0KTsKLSAgICBpZiAobV9uZXh0
Q29kZVBvaW50T2Zmc2V0LnZhbHVlKCkgPT0gbV9zdHJpbmdWaWV3LmdldCgpLmxlbmd0aCgpKSB7
Ci0gICAgICAgIG1fbmV4dENvZGVQb2ludE9mZnNldCA9IFdURjo6bnVsbG9wdDsKLSAgICAgICAg
cmV0dXJuICp0aGlzOworI2lmIENIRUNLX1NUUklOR1ZJRVdfTElGRVRJTUUKKyAgICBBU1NFUlQo
bV9zdHJpbmdWaWV3LnVuZGVybHlpbmdTdHJpbmdJc1ZhbGlkKCkpOworI2VuZGlmCisgICAgaWYg
KG1faXM4Qml0KSB7CisgICAgICAgIEFTU0VSVChtX2N1cnJlbnQgPCBtX2VuZCk7CisgICAgICAg
IG1fY3VycmVudCA9IHN0YXRpY19jYXN0PGNvbnN0IExDaGFyKj4obV9jdXJyZW50KSArIDE7Cisg
ICAgfSBlbHNlIHsKKyAgICAgICAgQVNTRVJUKG1fY3VycmVudCA8IG1fZW5kKTsKKyAgICAgICAg
dW5zaWduZWQgaSA9IDA7CisgICAgICAgIHNpemVfdCBsZW5ndGggPSBzdGF0aWNfY2FzdDxjb25z
dCBVQ2hhcio+KG1fZW5kKSAtIHN0YXRpY19jYXN0PGNvbnN0IFVDaGFyKj4obV9jdXJyZW50KTsK
KyAgICAgICAgVTE2X0ZXRF8xKHN0YXRpY19jYXN0PGNvbnN0IFVDaGFyKj4obV9jdXJyZW50KSwg
aSwgbGVuZ3RoKTsKKyAgICAgICAgbV9jdXJyZW50ID0gc3RhdGljX2Nhc3Q8Y29uc3QgVUNoYXIq
PihtX2N1cnJlbnQpICsgaTsKICAgICB9Ci0gICAgaWYgKG1fc3RyaW5nVmlldy5nZXQoKS5pczhC
aXQoKSkKLSAgICAgICAgbV9jb2RlUG9pbnQgPSBtX3N0cmluZ1ZpZXcuZ2V0KCkuY2hhcmFjdGVy
czgoKVttX25leHRDb2RlUG9pbnRPZmZzZXQudmFsdWUoKSsrXTsKLSAgICBlbHNlCi0gICAgICAg
IFUxNl9ORVhUKG1fc3RyaW5nVmlldy5nZXQoKS5jaGFyYWN0ZXJzMTYoKSwgbV9uZXh0Q29kZVBv
aW50T2Zmc2V0LnZhbHVlKCksIG1fc3RyaW5nVmlldy5nZXQoKS5sZW5ndGgoKSwgbV9jb2RlUG9p
bnQpOwotICAgIEFTU0VSVChtX25leHRDb2RlUG9pbnRPZmZzZXQudmFsdWUoKSA8PSBtX3N0cmlu
Z1ZpZXcuZ2V0KCkubGVuZ3RoKCkpOwogICAgIHJldHVybiAqdGhpczsKIH0KIAogaW5saW5lIFVD
aGFyMzIgU3RyaW5nVmlldzo6Q29kZVBvaW50czo6SXRlcmF0b3I6Om9wZXJhdG9yKigpIGNvbnN0
CiB7Ci0gICAgQVNTRVJUKG1fbmV4dENvZGVQb2ludE9mZnNldCk7Ci0gICAgcmV0dXJuIG1fY29k
ZVBvaW50OworI2lmIENIRUNLX1NUUklOR1ZJRVdfTElGRVRJTUUKKyAgICBBU1NFUlQobV9zdHJp
bmdWaWV3LnVuZGVybHlpbmdTdHJpbmdJc1ZhbGlkKCkpOworI2VuZGlmCisgICAgaWYgKG1faXM4
Qml0KSB7CisgICAgICAgIEFTU0VSVChtX2N1cnJlbnQgPCBtX2VuZCk7CisgICAgICAgIHJldHVy
biAqc3RhdGljX2Nhc3Q8Y29uc3QgTENoYXIqPihtX2N1cnJlbnQpOworICAgIH0KKyAgICBBU1NF
UlQobV9jdXJyZW50IDwgbV9lbmQpOworICAgIFVDaGFyMzIgY29kZVBvaW50OworICAgIHNpemVf
dCBsZW5ndGggPSBzdGF0aWNfY2FzdDxjb25zdCBVQ2hhcio+KG1fZW5kKSAtIHN0YXRpY19jYXN0
PGNvbnN0IFVDaGFyKj4obV9jdXJyZW50KTsKKyAgICBVMTZfR0VUKHN0YXRpY19jYXN0PGNvbnN0
IFVDaGFyKj4obV9jdXJyZW50KSwgMCwgMCwgbGVuZ3RoLCBjb2RlUG9pbnQpOworICAgIHJldHVy
biBjb2RlUG9pbnQ7CiB9CiAKIGlubGluZSBib29sIFN0cmluZ1ZpZXc6OkNvZGVQb2ludHM6Okl0
ZXJhdG9yOjpvcGVyYXRvcj09KGNvbnN0IEl0ZXJhdG9yJiBvdGhlcikgY29uc3QKIHsKLSAgICBB
U1NFUlQoJm1fc3RyaW5nVmlldy5nZXQoKSA9PSAmb3RoZXIubV9zdHJpbmdWaWV3LmdldCgpKTsK
LSAgICByZXR1cm4gbV9uZXh0Q29kZVBvaW50T2Zmc2V0ID09IG90aGVyLm1fbmV4dENvZGVQb2lu
dE9mZnNldDsKKyNpZiBDSEVDS19TVFJJTkdWSUVXX0xJRkVUSU1FCisgICAgQVNTRVJUKG1fc3Ry
aW5nVmlldy51bmRlcmx5aW5nU3RyaW5nSXNWYWxpZCgpKTsKKyNlbmRpZgorICAgIEFTU0VSVCht
X2lzOEJpdCA9PSBvdGhlci5tX2lzOEJpdCk7CisgICAgQVNTRVJUKG1fZW5kID09IG90aGVyLm1f
ZW5kKTsKKyAgICByZXR1cm4gbV9jdXJyZW50ID09IG90aGVyLm1fY3VycmVudDsKIH0KIAogaW5s
aW5lIGJvb2wgU3RyaW5nVmlldzo6Q29kZVBvaW50czo6SXRlcmF0b3I6Om9wZXJhdG9yIT0oY29u
c3QgSXRlcmF0b3ImIG90aGVyKSBjb25zdApkaWZmIC0tZ2l0IGEvVG9vbHMvQ2hhbmdlTG9nIGIv
VG9vbHMvQ2hhbmdlTG9nCmluZGV4IGRjOGJlNzNhMGMzYjNlMTRlY2UxMDgwN2ViYmM5MTk4M2U4
ZTNkZmMuLjM2NGIzMTZmMmYyOTI4MjMwNzA3OTk0YmVlMzVhYjU0YmYxZjJmNTEgMTAwNjQ0Ci0t
LSBhL1Rvb2xzL0NoYW5nZUxvZworKysgYi9Ub29scy9DaGFuZ2VMb2cKQEAgLTEsMyArMSwxMyBA
QAorMjAyMS0wMy0yMiAgQWxleCBDaHJpc3RlbnNlbiAgPGFjaHJpc3RlbnNlbkB3ZWJraXQub3Jn
PgorCisgICAgICAgIE9wdGltaXplIFN0cmluZ1ZpZXc6OkNvZGVQb2ludHM6Okl0ZXJhdG9yCisg
ICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNjIzMTUKKwor
ICAgICAgICBSZXZpZXdlZCBieSBEYXJpbiBBZGxlci4KKworICAgICAgICAqIFRlc3RXZWJLaXRB
UEkvVGVzdHMvV1RGL1N0cmluZ1ZpZXcuY3BwOgorICAgICAgICAoVGVzdFdlYktpdEFQSTo6VEVT
VCk6CisKIDIwMjEtMDMtMjIgIERldmluIFJvdXNzbyAgPGRyb3Vzc29AYXBwbGUuY29tPgogCiAg
ICAgICAgIFJlbW92ZSB1bnVzZWQgSlMgYW5kIENTUyBmaWxlcyBvZiBtZWRpYSBjb250cm9scwpk
aWZmIC0tZ2l0IGEvVG9vbHMvVGVzdFdlYktpdEFQSS9UZXN0cy9XVEYvU3RyaW5nVmlldy5jcHAg
Yi9Ub29scy9UZXN0V2ViS2l0QVBJL1Rlc3RzL1dURi9TdHJpbmdWaWV3LmNwcAppbmRleCA4NGVj
NWRhZjJlNDNiZWE5YzQ4NTI3Y2EyNWNkZmQ4MjlhZjA3ZjQzLi41Yjc3YzVjOTAwOWE1N2JlMTA1
NzVjMWZmNWQ4YTI4ZDZlMzUyODUzIDEwMDY0NAotLS0gYS9Ub29scy9UZXN0V2ViS2l0QVBJL1Rl
c3RzL1dURi9TdHJpbmdWaWV3LmNwcAorKysgYi9Ub29scy9UZXN0V2ViS2l0QVBJL1Rlc3RzL1dU
Ri9TdHJpbmdWaWV3LmNwcApAQCAtMTQ1LDI1ICsxNDUsMjggQEAgVEVTVChXVEYsIFN0cmluZ1Zp
ZXdJdGVyYXRvcnMpCiAgICAgU3RyaW5nVmlldyBoZWxvVmlldyhoZWxvKTsKIAogICAgIGF1dG8g
Y29kZVBvaW50cyA9IGhlbG9WaWV3LmNvZGVQb2ludHMoKTsKLSAgICBhdXRvIGNvZGVQb2ludHNJ
dGVyYXRvciA9IGNvZGVQb2ludHMuYmVnaW4oKTsKLSAgICBFWFBFQ1RfRVEoKmNvZGVQb2ludHNJ
dGVyYXRvciwgJ2gnKTsKLSAgICBFWFBFQ1RfRVEoKmNvZGVQb2ludHNJdGVyYXRvciwgJ2gnKTsK
LSAgICArK2NvZGVQb2ludHNJdGVyYXRvcjsKLSAgICArK2NvZGVQb2ludHNJdGVyYXRvcjsKLSAg
ICBFWFBFQ1RfRVEoKmNvZGVQb2ludHNJdGVyYXRvciwgJ2wnKTsKLSAgICBhdXRvIHNhdmVkSXRl
cmF0b3IgPSBjb2RlUG9pbnRzSXRlcmF0b3I7Ci0gICAgY29kZVBvaW50c0l0ZXJhdG9yID0gY29k
ZVBvaW50cy5iZWdpbigpOwotICAgIEVYUEVDVF9FUSgqY29kZVBvaW50c0l0ZXJhdG9yLCAnaCcp
OwotICAgIGNvZGVQb2ludHNJdGVyYXRvciA9IHNhdmVkSXRlcmF0b3I7Ci0gICAgRVhQRUNUX0VR
KCpjb2RlUG9pbnRzSXRlcmF0b3IsICdsJyk7Ci0gICAgU3RyaW5nIHdlYmtpdCgid2Via2l0Iik7
Ci0gICAgYXV0byB3ZWJraXRDb2RlUG9pbnRzID0gU3RyaW5nVmlldyh3ZWJraXQpLmNvZGVQb2lu
dHMoKTsKLSAgICBjb2RlUG9pbnRzSXRlcmF0b3IgPSB3ZWJraXRDb2RlUG9pbnRzLmJlZ2luKCk7
Ci0gICAgKytjb2RlUG9pbnRzSXRlcmF0b3I7Ci0gICAgKytjb2RlUG9pbnRzSXRlcmF0b3I7Ci0g
ICAgRVhQRUNUX0VRKCpjb2RlUG9pbnRzSXRlcmF0b3IsICdiJyk7Ci0gICAgd2hpbGUgKGNvZGVQ
b2ludHNJdGVyYXRvciAhPSB3ZWJraXRDb2RlUG9pbnRzLmVuZCgpKQorICAgIHsKKyAgICAgICAg
YXV0byBjb2RlUG9pbnRzSXRlcmF0b3IgPSBjb2RlUG9pbnRzLmJlZ2luKCk7CisgICAgICAgIEVY
UEVDVF9FUSgqY29kZVBvaW50c0l0ZXJhdG9yLCAnaCcpOworICAgICAgICBFWFBFQ1RfRVEoKmNv
ZGVQb2ludHNJdGVyYXRvciwgJ2gnKTsKICAgICAgICAgKytjb2RlUG9pbnRzSXRlcmF0b3I7Cisg
ICAgICAgICsrY29kZVBvaW50c0l0ZXJhdG9yOworICAgICAgICBFWFBFQ1RfRVEoKmNvZGVQb2lu
dHNJdGVyYXRvciwgJ2wnKTsKKyAgICB9CisgICAgeworICAgICAgICBhdXRvIGNvZGVQb2ludHNJ
dGVyYXRvciA9IGNvZGVQb2ludHMuYmVnaW4oKTsKKyAgICAgICAgRVhQRUNUX0VRKCpjb2RlUG9p
bnRzSXRlcmF0b3IsICdoJyk7CisgICAgfQorICAgIHsKKyAgICAgICAgU3RyaW5nIHdlYmtpdCgi
d2Via2l0Iik7CisgICAgICAgIGF1dG8gd2Via2l0Q29kZVBvaW50cyA9IFN0cmluZ1ZpZXcod2Vi
a2l0KS5jb2RlUG9pbnRzKCk7CisgICAgICAgIGF1dG8gY29kZVBvaW50c0l0ZXJhdG9yID0gd2Vi
a2l0Q29kZVBvaW50cy5iZWdpbigpOworICAgICAgICArK2NvZGVQb2ludHNJdGVyYXRvcjsKKyAg
ICAgICAgKytjb2RlUG9pbnRzSXRlcmF0b3I7CisgICAgICAgIEVYUEVDVF9FUSgqY29kZVBvaW50
c0l0ZXJhdG9yLCAnYicpOworICAgICAgICB3aGlsZSAoY29kZVBvaW50c0l0ZXJhdG9yICE9IHdl
YmtpdENvZGVQb2ludHMuZW5kKCkpCisgICAgICAgICAgICArK2NvZGVQb2ludHNJdGVyYXRvcjsK
KyAgICB9CiAKICAgICBFWFBFQ1RfVFJVRShjb21wYXJlTG9vcEl0ZXJhdGlvbnMoaGVsb1ZpZXcu
Y29kZVBvaW50cygpLCB7J2gnLCAnZScsICdsJywgJ28nfSkpOwogICAgIEVYUEVDVF9UUlVFKGNv
bXBhcmVMb29wSXRlcmF0aW9ucyhoZWxvVmlldy5jb2RlVW5pdHMoKSwgeydoJywgJ2UnLCAnbCcs
ICdvJ30pKTsK
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>423976</attachid>
            <date>2021-03-22 18:48:32 -0700</date>
            <delta_ts>2021-03-22 19:09:34 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-162315-20210322184831.patch</filename>
            <type>text/plain</type>
            <size>4587</size>
            <attacher name="Alex Christensen">achristensen</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjc0ODE2CmRpZmYgLS1naXQgYS9Tb3VyY2UvV1RGL0NoYW5n
ZUxvZyBiL1NvdXJjZS9XVEYvQ2hhbmdlTG9nCmluZGV4IGMwODM3MGY4OTY0MzQ4NDA4OGNkZDIy
ZGM2MDllYmFjZDAzODQ0MTYuLmEwZWY0MGMxMjMzYTA2MTQxNzVlM2RhZWFmNTc0NzE1Y2MzOTlk
YjYgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XVEYvQ2hhbmdlTG9nCisrKyBiL1NvdXJjZS9XVEYvQ2hh
bmdlTG9nCkBAIC0xLDMgKzEsMTggQEAKKzIwMjEtMDMtMjIgIEFsZXggQ2hyaXN0ZW5zZW4gIDxh
Y2hyaXN0ZW5zZW5Ad2Via2l0Lm9yZz4KKworICAgICAgICBPcHRpbWl6ZSBTdHJpbmdWaWV3OjpD
b2RlUG9pbnRzOjpJdGVyYXRvcgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93
X2J1Zy5jZ2k/aWQ9MTYyMzE1CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgRGFyaW4gQWRsZXIuCisK
KyAgICAgICAgVGhpcyBzdG9yZXMgcmFuZ2UgcG9pbnRlcnMgaW4gdGhlIGl0ZXJhdG9yIGluc3Rl
YWQgb2YgYSBwb2ludGVyIHRvIGEgcG9pbnRlci4KKworICAgICAgICAqIHd0Zi90ZXh0L1N0cmlu
Z1ZpZXcuaDoKKyAgICAgICAgKFdURjo6U3RyaW5nVmlldzo6Q29kZVBvaW50czo6SXRlcmF0b3I6
Okl0ZXJhdG9yKToKKyAgICAgICAgKFdURjo6U3RyaW5nVmlldzo6Q29kZVBvaW50czo6SXRlcmF0
b3I6Om9wZXJhdG9yKyspOgorICAgICAgICAoV1RGOjpTdHJpbmdWaWV3OjpDb2RlUG9pbnRzOjpJ
dGVyYXRvcjo6b3BlcmF0b3IqIGNvbnN0KToKKyAgICAgICAgKFdURjo6U3RyaW5nVmlldzo6Q29k
ZVBvaW50czo6SXRlcmF0b3I6Om9wZXJhdG9yPT0gY29uc3QpOgorCiAyMDIxLTAzLTIyICBEZXZp
biBSb3Vzc28gIDxkcm91c3NvQGFwcGxlLmNvbT4KIAogICAgICAgICBSZW1vdmUgdW51c2VkIEpT
IGFuZCBDU1MgZmlsZXMgb2YgbWVkaWEgY29udHJvbHMKZGlmZiAtLWdpdCBhL1NvdXJjZS9XVEYv
d3RmL3RleHQvU3RyaW5nVmlldy5oIGIvU291cmNlL1dURi93dGYvdGV4dC9TdHJpbmdWaWV3LmgK
aW5kZXggN2JkMWM3NTkwNTM4NzkzZmYyMzU4YTU0YWIwZWI5OWY2ZTEwMjlkNS4uNDVjZDdhZTJi
MTg2MGQwZDlmMGY0N2NlMzFhMWQ0MTc1ZjJjMzZhZiAxMDA2NDQKLS0tIGEvU291cmNlL1dURi93
dGYvdGV4dC9TdHJpbmdWaWV3LmgKKysrIGIvU291cmNlL1dURi93dGYvdGV4dC9TdHJpbmdWaWV3
LmgKQEAgLTgzNyw5ICs4MzcsMTIgQEAgcHVibGljOgogICAgIGJvb2wgb3BlcmF0b3IhPShjb25z
dCBJdGVyYXRvciYpIGNvbnN0OwogCiBwcml2YXRlOgotICAgIHN0ZDo6cmVmZXJlbmNlX3dyYXBw
ZXI8Y29uc3QgU3RyaW5nVmlldz4gbV9zdHJpbmdWaWV3OwotICAgIE9wdGlvbmFsPHVuc2lnbmVk
PiBtX25leHRDb2RlUG9pbnRPZmZzZXQ7Ci0gICAgVUNoYXIzMiBtX2NvZGVQb2ludDsKKyAgICBj
b25zdCB2b2lkKiBtX2N1cnJlbnQ7CisgICAgY29uc3Qgdm9pZCogbV9lbmQ7CisgICAgYm9vbCBt
X2lzOEJpdDsKKyNpZiBDSEVDS19TVFJJTkdWSUVXX0xJRkVUSU1FCisgICAgU3RyaW5nVmlldyBt
X3N0cmluZ1ZpZXc7CisjZW5kaWYKIH07CiAKIGNsYXNzIFN0cmluZ1ZpZXc6OkNvZGVVbml0czo6
SXRlcmF0b3IgewpAQCAtODk0LDM3ICs4OTcsNjQgQEAgaW5saW5lIFN0cmluZ1ZpZXc6OkNvZGVQ
b2ludHM6OkNvZGVQb2ludHMoY29uc3QgU3RyaW5nVmlldyYgc3RyaW5nVmlldykKIH0KIAogaW5s
aW5lIFN0cmluZ1ZpZXc6OkNvZGVQb2ludHM6Okl0ZXJhdG9yOjpJdGVyYXRvcihjb25zdCBTdHJp
bmdWaWV3JiBzdHJpbmdWaWV3LCB1bnNpZ25lZCBpbmRleCkKLSAgICA6IG1fc3RyaW5nVmlldyhz
dHJpbmdWaWV3KQotICAgICwgbV9uZXh0Q29kZVBvaW50T2Zmc2V0KGluZGV4KQorICAgIDogbV9p
czhCaXQoc3RyaW5nVmlldy5pczhCaXQoKSkKKyNpZiBDSEVDS19TVFJJTkdWSUVXX0xJRkVUSU1F
CisgICAgLCBtX3N0cmluZ1ZpZXcoc3RyaW5nVmlldykKKyNlbmRpZgogewotICAgIG9wZXJhdG9y
KysoKTsKKyAgICBpZiAobV9pczhCaXQpIHsKKyAgICAgICAgY29uc3QgTENoYXIqIGJlZ2luID0g
c3RyaW5nVmlldy5jaGFyYWN0ZXJzOCgpOworICAgICAgICBtX2N1cnJlbnQgPSBiZWdpbiArIGlu
ZGV4OworICAgICAgICBtX2VuZCA9IGJlZ2luICsgc3RyaW5nVmlldy5sZW5ndGgoKTsKKyAgICB9
IGVsc2UgeworICAgICAgICBjb25zdCBVQ2hhciogYmVnaW4gPSBzdHJpbmdWaWV3LmNoYXJhY3Rl
cnMxNigpOworICAgICAgICBtX2N1cnJlbnQgPSBiZWdpbiArIGluZGV4OworICAgICAgICBtX2Vu
ZCA9IGJlZ2luICsgc3RyaW5nVmlldy5sZW5ndGgoKTsKKyAgICB9CiB9CiAKIGlubGluZSBhdXRv
IFN0cmluZ1ZpZXc6OkNvZGVQb2ludHM6Okl0ZXJhdG9yOjpvcGVyYXRvcisrKCkgLT4gSXRlcmF0
b3ImCiB7Ci0gICAgQVNTRVJUKG1fbmV4dENvZGVQb2ludE9mZnNldCk7Ci0gICAgaWYgKG1fbmV4
dENvZGVQb2ludE9mZnNldC52YWx1ZSgpID09IG1fc3RyaW5nVmlldy5nZXQoKS5sZW5ndGgoKSkg
ewotICAgICAgICBtX25leHRDb2RlUG9pbnRPZmZzZXQgPSBXVEY6Om51bGxvcHQ7Ci0gICAgICAg
IHJldHVybiAqdGhpczsKKyNpZiBDSEVDS19TVFJJTkdWSUVXX0xJRkVUSU1FCisgICAgQVNTRVJU
KG1fc3RyaW5nVmlldy51bmRlcmx5aW5nU3RyaW5nSXNWYWxpZCgpKTsKKyNlbmRpZgorICAgIGlm
IChtX2lzOEJpdCkgeworICAgICAgICBBU1NFUlQobV9jdXJyZW50IDwgbV9lbmQpOworICAgICAg
ICBtX2N1cnJlbnQgPSBzdGF0aWNfY2FzdDxjb25zdCBMQ2hhcio+KG1fY3VycmVudCkgKyAxOwor
ICAgIH0gZWxzZSB7CisgICAgICAgIEFTU0VSVChtX2N1cnJlbnQgPCBtX2VuZCk7CisgICAgICAg
IHVuc2lnbmVkIGkgPSAwOworICAgICAgICBzaXplX3QgbGVuZ3RoID0gc3RhdGljX2Nhc3Q8Y29u
c3QgVUNoYXIqPihtX2VuZCkgLSBzdGF0aWNfY2FzdDxjb25zdCBVQ2hhcio+KG1fY3VycmVudCk7
CisgICAgICAgIFUxNl9GV0RfMShzdGF0aWNfY2FzdDxjb25zdCBVQ2hhcio+KG1fY3VycmVudCks
IGksIGxlbmd0aCk7CisgICAgICAgIG1fY3VycmVudCA9IHN0YXRpY19jYXN0PGNvbnN0IFVDaGFy
Kj4obV9jdXJyZW50KSArIGk7CiAgICAgfQotICAgIGlmIChtX3N0cmluZ1ZpZXcuZ2V0KCkuaXM4
Qml0KCkpCi0gICAgICAgIG1fY29kZVBvaW50ID0gbV9zdHJpbmdWaWV3LmdldCgpLmNoYXJhY3Rl
cnM4KClbbV9uZXh0Q29kZVBvaW50T2Zmc2V0LnZhbHVlKCkrK107Ci0gICAgZWxzZQotICAgICAg
ICBVMTZfTkVYVChtX3N0cmluZ1ZpZXcuZ2V0KCkuY2hhcmFjdGVyczE2KCksIG1fbmV4dENvZGVQ
b2ludE9mZnNldC52YWx1ZSgpLCBtX3N0cmluZ1ZpZXcuZ2V0KCkubGVuZ3RoKCksIG1fY29kZVBv
aW50KTsKLSAgICBBU1NFUlQobV9uZXh0Q29kZVBvaW50T2Zmc2V0LnZhbHVlKCkgPD0gbV9zdHJp
bmdWaWV3LmdldCgpLmxlbmd0aCgpKTsKICAgICByZXR1cm4gKnRoaXM7CiB9CiAKIGlubGluZSBV
Q2hhcjMyIFN0cmluZ1ZpZXc6OkNvZGVQb2ludHM6Okl0ZXJhdG9yOjpvcGVyYXRvciooKSBjb25z
dAogewotICAgIEFTU0VSVChtX25leHRDb2RlUG9pbnRPZmZzZXQpOwotICAgIHJldHVybiBtX2Nv
ZGVQb2ludDsKKyNpZiBDSEVDS19TVFJJTkdWSUVXX0xJRkVUSU1FCisgICAgQVNTRVJUKG1fc3Ry
aW5nVmlldy51bmRlcmx5aW5nU3RyaW5nSXNWYWxpZCgpKTsKKyNlbmRpZgorICAgIGlmIChtX2lz
OEJpdCkgeworICAgICAgICBBU1NFUlQobV9jdXJyZW50IDwgbV9lbmQpOworICAgICAgICByZXR1
cm4gKnN0YXRpY19jYXN0PGNvbnN0IExDaGFyKj4obV9jdXJyZW50KTsKKyAgICB9CisgICAgQVNT
RVJUKG1fY3VycmVudCA8IG1fZW5kKTsKKyAgICBVQ2hhcjMyIGNvZGVQb2ludDsKKyAgICBzaXpl
X3QgbGVuZ3RoID0gc3RhdGljX2Nhc3Q8Y29uc3QgVUNoYXIqPihtX2VuZCkgLSBzdGF0aWNfY2Fz
dDxjb25zdCBVQ2hhcio+KG1fY3VycmVudCk7CisgICAgVTE2X0dFVChzdGF0aWNfY2FzdDxjb25z
dCBVQ2hhcio+KG1fY3VycmVudCksIDAsIDAsIGxlbmd0aCwgY29kZVBvaW50KTsKKyAgICByZXR1
cm4gY29kZVBvaW50OwogfQogCiBpbmxpbmUgYm9vbCBTdHJpbmdWaWV3OjpDb2RlUG9pbnRzOjpJ
dGVyYXRvcjo6b3BlcmF0b3I9PShjb25zdCBJdGVyYXRvciYgb3RoZXIpIGNvbnN0CiB7Ci0gICAg
QVNTRVJUKCZtX3N0cmluZ1ZpZXcuZ2V0KCkgPT0gJm90aGVyLm1fc3RyaW5nVmlldy5nZXQoKSk7
Ci0gICAgcmV0dXJuIG1fbmV4dENvZGVQb2ludE9mZnNldCA9PSBvdGhlci5tX25leHRDb2RlUG9p
bnRPZmZzZXQ7CisjaWYgQ0hFQ0tfU1RSSU5HVklFV19MSUZFVElNRQorICAgIEFTU0VSVChtX3N0
cmluZ1ZpZXcudW5kZXJseWluZ1N0cmluZ0lzVmFsaWQoKSk7CisjZW5kaWYKKyAgICBBU1NFUlQo
bV9pczhCaXQgPT0gb3RoZXIubV9pczhCaXQpOworICAgIEFTU0VSVChtX2VuZCA9PSBvdGhlci5t
X2VuZCk7CisgICAgcmV0dXJuIG1fY3VycmVudCA9PSBvdGhlci5tX2N1cnJlbnQ7CiB9CiAKIGlu
bGluZSBib29sIFN0cmluZ1ZpZXc6OkNvZGVQb2ludHM6Okl0ZXJhdG9yOjpvcGVyYXRvciE9KGNv
bnN0IEl0ZXJhdG9yJiBvdGhlcikgY29uc3QK
</data>
<flag name="review"
          id="443500"
          type_id="1"
          status="+"
          setter="darin"
    />
          </attachment>
      

    </bug>

</bugzilla>