<?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>158891</bug_id>
          
          <creation_ts>2016-06-17 15:57:25 -0700</creation_ts>
          <short_desc>Optimize parseCacheHeader() by using StringView</short_desc>
          <delta_ts>2016-06-20 09:11:21 -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>WebCore Misc.</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="Chris Dumez">cdumez</reporter>
          <assigned_to name="Chris Dumez">cdumez</assigned_to>
          <cc>benjamin</cc>
    
    <cc>cmarcelo</cc>
    
    <cc>commit-queue</cc>
    
    <cc>darin</cc>
    
    <cc>koivisto</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1203461</commentid>
    <comment_count>0</comment_count>
    <who name="Chris Dumez">cdumez</who>
    <bug_when>2016-06-17 15:57:25 -0700</bug_when>
    <thetext>Optimize parseCacheHeader() and avoid some temporary String allocations by using StringView.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1203465</commentid>
    <comment_count>1</comment_count>
      <attachid>281596</attachid>
    <who name="Chris Dumez">cdumez</who>
    <bug_when>2016-06-17 16:06:11 -0700</bug_when>
    <thetext>Created attachment 281596
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1203466</commentid>
    <comment_count>2</comment_count>
      <attachid>281596</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2016-06-17 16:17:40 -0700</bug_when>
    <thetext>Comment on attachment 281596
Patch

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

&gt; Source/WTF/wtf/text/StringView.h:48
&gt; +typedef bool (*CharacterMatchFunctionPtr)(UChar);

Not sure this type needs Ptr in its name.

In new code, we like to use using instead of typedef. Could we do that here?

&gt; Source/WebCore/platform/network/CacheValidation.cpp:206
&gt; +inline bool isControlCharacterOrWhitespace(UChar c)

I’d rename the argument to a word instead of a letter when touching this function.

&gt; Source/WebCore/platform/network/CacheValidation.cpp:208
&gt; +    return c &lt; &apos; &apos; || c == 127 || isSpaceOrNewline(c);

If this really is about just the actual character space and the actual character newline, then I suggest just changing the &quot;&lt;&quot; to &quot;&lt;=&quot; instead of using a helper function. If this allows non-ASCII spaces, I have no idea why!

&gt; Source/WebCore/platform/network/CacheValidation.cpp:211
&gt; -inline String trimToNextSeparator(const String&amp; str)
&gt; +inline String trimToNextSeparator(const StringView&amp; str)

Should be just StringView, not const StringView&amp;. Might also rename it since we are touching this to be a word instead of a fragment &quot;str&quot;.

Should return a StringView. I understand a conversion to string may eventually be necessary, but doing the trim operation alone does not require it.

&gt; Source/WebCore/platform/network/CacheValidation.cpp:213
&gt; -    return str.substring(0, str.find(isCacheHeaderSeparator));
&gt; +    return str.substring(0, str.find(isCacheHeaderSeparator)).toString();

We lose the optimization here of reusing the string if there is no separator character. Which is a shame. Going over to StringView more completely makes that not an issue.

&gt; Source/WebCore/platform/network/CacheValidation.cpp:216
&gt;  static Vector&lt;std::pair&lt;String, String&gt;&gt; parseCacheHeader(const String&amp; header)

This could be changed to just return a vector of pair&lt;StringView, StringView&gt;, since everything is within the header, right? That would be better.

&gt; Source/WebCore/platform/network/CacheValidation.cpp:221
&gt; +    const StringView safeHeader = safeHeaderString;

OK to use const, but a little strange. We don’t always use const on local variables just because we are not planning to change them.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1203470</commentid>
    <comment_count>3</comment_count>
      <attachid>281596</attachid>
    <who name="Chris Dumez">cdumez</who>
    <bug_when>2016-06-17 16:29:34 -0700</bug_when>
    <thetext>Comment on attachment 281596
Patch

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

&gt;&gt; Source/WebCore/platform/network/CacheValidation.cpp:208
&gt;&gt; +    return c &lt; &apos; &apos; || c == 127 || isSpaceOrNewline(c);
&gt; 
&gt; If this really is about just the actual character space and the actual character newline, then I suggest just changing the &quot;&lt;&quot; to &quot;&lt;=&quot; instead of using a helper function. If this allows non-ASCII spaces, I have no idea why!

I checked the RFC, we should indeed only consider &apos; &apos;:
https://tools.ietf.org/html/rfc7234#appendix-B
https://tools.ietf.org/html/rfc5234#appendix-B.1</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1203473</commentid>
    <comment_count>4</comment_count>
      <attachid>281596</attachid>
    <who name="Chris Dumez">cdumez</who>
    <bug_when>2016-06-17 16:34:04 -0700</bug_when>
    <thetext>Comment on attachment 281596
Patch

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

&gt;&gt; Source/WebCore/platform/network/CacheValidation.cpp:216
&gt;&gt;  static Vector&lt;std::pair&lt;String, String&gt;&gt; parseCacheHeader(const String&amp; header)
&gt; 
&gt; This could be changed to just return a vector of pair&lt;StringView, StringView&gt;, since everything is within the header, right? That would be better.

Actually, our StringViews point to the characters of &apos;safeHeaderString&apos; internally, not &apos;header&apos;. &apos;safeHeaderString&apos; being a local variable, I don&apos;t think we can do this unfortunately.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1203474</commentid>
    <comment_count>5</comment_count>
      <attachid>281597</attachid>
    <who name="Chris Dumez">cdumez</who>
    <bug_when>2016-06-17 16:48:27 -0700</bug_when>
    <thetext>Created attachment 281597
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1203484</commentid>
    <comment_count>6</comment_count>
      <attachid>281597</attachid>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2016-06-17 17:25:46 -0700</bug_when>
    <thetext>Comment on attachment 281597
Patch

Clearing flags on attachment: 281597

Committed r202188: &lt;http://trac.webkit.org/changeset/202188&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1203485</commentid>
    <comment_count>7</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2016-06-17 17:25:51 -0700</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1203619</commentid>
    <comment_count>8</comment_count>
      <attachid>281597</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2016-06-19 11:31:25 -0700</bug_when>
    <thetext>Comment on attachment 281597
Patch

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

&gt; Source/WebCore/platform/network/CacheValidation.cpp:248
&gt; +                result.append({ directive, trimToNextSeparator(value.substring(1, value.length() - 1)).toString() });

This could be written without the length() - 1, since that’s always implied in any call to substring.

    result.append({ directive, trimToNextSeparator(value.substring(1)).toString() });</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1203759</commentid>
    <comment_count>9</comment_count>
    <who name="Chris Dumez">cdumez</who>
    <bug_when>2016-06-20 09:11:21 -0700</bug_when>
    <thetext>(In reply to comment #8)
&gt; Comment on attachment 281597 [details]
&gt; Patch
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=281597&amp;action=review
&gt; 
&gt; &gt; Source/WebCore/platform/network/CacheValidation.cpp:248
&gt; &gt; +                result.append({ directive, trimToNextSeparator(value.substring(1, value.length() - 1)).toString() });
&gt; 
&gt; This could be written without the length() - 1, since that’s always implied
&gt; in any call to substring.
&gt; 
&gt;     result.append({ directive,
&gt; trimToNextSeparator(value.substring(1)).toString() });

Indeed, fixed in &lt;http://trac.webkit.org/changeset/202228&gt;, thanks.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>281596</attachid>
            <date>2016-06-17 16:06:11 -0700</date>
            <delta_ts>2016-06-17 16:48:23 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-158891-20160617160608.patch</filename>
            <type>text/plain</type>
            <size>8423</size>
            <attacher name="Chris Dumez">cdumez</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjAyMTgyCmRpZmYgLS1naXQgYS9Tb3VyY2UvV1RGL0NoYW5n
ZUxvZyBiL1NvdXJjZS9XVEYvQ2hhbmdlTG9nCmluZGV4IGYwMWIzOWRjMDkyMmJiYThkMTk4Zjlk
YzczMWQyNWRhMjMxMjczOTkuLjM1OTk5OWQ4Y2Y2NGU1YWMxNjk2ODFkMzc1MzQ4ZWNmZmI4ZWE5
YmUgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XVEYvQ2hhbmdlTG9nCisrKyBiL1NvdXJjZS9XVEYvQ2hh
bmdlTG9nCkBAIC0xLDMgKzEsMTYgQEAKKzIwMTYtMDYtMTcgIENocmlzIER1bWV6ICA8Y2R1bWV6
QGFwcGxlLmNvbT4KKworICAgICAgICBPcHRpbWl6ZSBwYXJzZUNhY2hlSGVhZGVyKCkgYnkgdXNp
bmcgU3RyaW5nVmlldworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5j
Z2k/aWQ9MTU4ODkxCisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAg
ICAgICAgQWRkIGEgU3RyaW5nVmlldzo6ZmluZCgpIG92ZXJsb2FkIHdoaWNoIHRha2VzIGEgQ2hh
cmFjdGVyTWF0Y2hGdW5jdGlvblB0cgorICAgICAgICB0byBtYXRjaCB0aGUgb25lIG9uIFN0cmlu
Zy4KKworICAgICAgICAqIHd0Zi90ZXh0L1N0cmluZ1ZpZXcuaDoKKyAgICAgICAgKFdURjo6U3Ry
aW5nVmlldzo6ZmluZCk6CisKIDIwMTYtMDYtMTcgIE1hcmsgTGFtICA8bWFyay5sYW1AYXBwbGUu
Y29tPgogCiAgICAgICAgIE9PTSBBc3NlcnRpb24gZmFpbHVyZSBpbiBKU09OLnN0cmluZ2lmeS4K
ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZyBiL1NvdXJjZS9XZWJDb3JlL0No
YW5nZUxvZwppbmRleCAxOWIzM2YxNWYwMDdlMjNjNzMzMzViMzk4MDBjZGVjMGVjOGI3M2JhLi4y
MjFmNjJlZjljZTQwYTg1OWFmNTlkN2MyZmNhN2ZiMDgwODU3YmE2IDEwMDY0NAotLS0gYS9Tb3Vy
Y2UvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCkBAIC0x
LDUgKzEsMjQgQEAKIDIwMTYtMDYtMTcgIENocmlzIER1bWV6ICA8Y2R1bWV6QGFwcGxlLmNvbT4K
IAorICAgICAgICBPcHRpbWl6ZSBwYXJzZUNhY2hlSGVhZGVyKCkgYnkgdXNpbmcgU3RyaW5nVmll
dworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTU4ODkx
CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgT3B0aW1p
emUgcGFyc2VDYWNoZUhlYWRlcigpIGFuZCBhdm9pZCBzb21lIHRlbXBvcmFyeSBTdHJpbmcgYWxs
b2NhdGlvbnMKKyAgICAgICAgYnkgdXNpbmcgU3RyaW5nVmlldy4gV2Ugbm93IHN0cmlwIHRoZSB3
aGl0ZXNwYWNlcyBpbiB0aGUgaW5wdXQgc3RyaW5nCisgICAgICAgIGF0IHRoZSBiZWdpbm5pbmcg
b2YgdGhlIGZ1bmN0aW9uLCBhdCB0aGUgc2FtZSBhcyBhcyB3ZSBzdHJpcCB0aGUKKyAgICAgICAg
Y29udHJvbCBjaGFyYWN0ZXJzLiBXZSBhcmUgdGhlbiBhYmxlIHRvIGxldmVyYWdlIFN0cmluZ1Zp
ZXcgaW4gdGhlCisgICAgICAgIHJlc3Qgb2YgdGhlIGZ1bmN0aW9uIHRvIGdldCBzdWJzdHJpbmdz
IHdpdGhvdXQgdGhlIG5lZWQgZm9yIGV4dHJhCisgICAgICAgIFN0cmluZyBhbGxvY2F0aW9ucy4K
KworICAgICAgICAqIHBsYXRmb3JtL25ldHdvcmsvQ2FjaGVWYWxpZGF0aW9uLmNwcDoKKyAgICAg
ICAgKFdlYkNvcmU6OmlzQ29udHJvbENoYXJhY3Rlck9yV2hpdGVzcGFjZSk6CisgICAgICAgIChX
ZWJDb3JlOjp0cmltVG9OZXh0U2VwYXJhdG9yKToKKyAgICAgICAgKFdlYkNvcmU6OnBhcnNlQ2Fj
aGVIZWFkZXIpOgorCisyMDE2LTA2LTE3ICBDaHJpcyBEdW1leiAgPGNkdW1lekBhcHBsZS5jb20+
CisKICAgICAgICAgVG91Y2hFdmVudCBzaG91bGQgaGF2ZSBhIGNvbnN0cnVjdG9yCiAgICAgICAg
IGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNTg4ODMKICAgICAgICAg
PHJkYXI6Ly9wcm9ibGVtLzI2MDYzNTg1PgpkaWZmIC0tZ2l0IGEvU291cmNlL1dURi93dGYvdGV4
dC9TdHJpbmdWaWV3LmggYi9Tb3VyY2UvV1RGL3d0Zi90ZXh0L1N0cmluZ1ZpZXcuaAppbmRleCBk
OGI4MzAzMWM2NGE1MzdmMmFjNjQ0ZDBiNmVmYzBiNmFlNjlkZDEwLi5lYzQyNGY0ODI5ZGIwMmM5
ODZmYTc0MTBlMDQ3OTRiOWM5MDQzZDc4IDEwMDY0NAotLS0gYS9Tb3VyY2UvV1RGL3d0Zi90ZXh0
L1N0cmluZ1ZpZXcuaAorKysgYi9Tb3VyY2UvV1RGL3d0Zi90ZXh0L1N0cmluZ1ZpZXcuaApAQCAt
NDUsNiArNDUsOCBAQAogCiBuYW1lc3BhY2UgV1RGIHsKIAordHlwZWRlZiBib29sICgqQ2hhcmFj
dGVyTWF0Y2hGdW5jdGlvblB0cikoVUNoYXIpOworCiAvLyBTdHJpbmdWaWV3IGlzIGEgbm9uLW93
bmluZyByZWZlcmVuY2UgdG8gYSBzdHJpbmcsIHNpbWlsYXIgdG8gdGhlIHByb3Bvc2VkIHN0ZDo6
c3RyaW5nX3ZpZXcuCiAvLyBXaGV0aGVyIHRoZSBzdHJpbmcgaXMgOC1iaXQgb3IgMTYtYml0IGlz
IGVuY29kZWQgaW4gdGhlIHVwcGVyIGJpdCBvZiB0aGUgbGVuZ3RoIG1lbWJlci4KIC8vIFRoaXMg
bWVhbnMgdGhhdCBzdHJpbmdzIGxvbmdlciB0aGFuIDIgZ2lnYWNoYXJhY3RlcnMgY2Fubm90IGJl
IHJlcHJlc2VudGVkLgpAQCAtMTEwLDYgKzExMiw3IEBAIHB1YmxpYzoKICAgICBTdHJpbmdWaWV3
IHN1YnN0cmluZyh1bnNpZ25lZCBzdGFydCwgdW5zaWduZWQgbGVuZ3RoID0gc3RkOjpudW1lcmlj
X2xpbWl0czx1bnNpZ25lZD46Om1heCgpKSBjb25zdDsKIAogICAgIHNpemVfdCBmaW5kKFVDaGFy
LCB1bnNpZ25lZCBzdGFydCA9IDApIGNvbnN0OworICAgIHNpemVfdCBmaW5kKENoYXJhY3Rlck1h
dGNoRnVuY3Rpb25QdHIsIHVuc2lnbmVkIHN0YXJ0ID0gMCkgY29uc3Q7CiAKICAgICBXVEZfRVhQ
T1JUX1NUUklOR19BUEkgc2l6ZV90IGZpbmQoU3RyaW5nVmlldywgdW5zaWduZWQgc3RhcnQpIGNv
bnN0OwogCkBAIC01MDAsNiArNTAzLDEzIEBAIGlubGluZSBzaXplX3QgU3RyaW5nVmlldzo6Zmlu
ZChVQ2hhciBjaGFyYWN0ZXIsIHVuc2lnbmVkIHN0YXJ0KSBjb25zdAogICAgIHJldHVybiBXVEY6
OmZpbmQoY2hhcmFjdGVyczE2KCksIGxlbmd0aCgpLCBjaGFyYWN0ZXIsIHN0YXJ0KTsKIH0KIAor
aW5saW5lIHNpemVfdCBTdHJpbmdWaWV3OjpmaW5kKENoYXJhY3Rlck1hdGNoRnVuY3Rpb25QdHIg
bWF0Y2hGdW5jdGlvbiwgdW5zaWduZWQgc3RhcnQpIGNvbnN0Cit7CisgICAgaWYgKGlzOEJpdCgp
KQorICAgICAgICByZXR1cm4gV1RGOjpmaW5kKGNoYXJhY3RlcnM4KCksIG1fbGVuZ3RoLCBtYXRj
aEZ1bmN0aW9uLCBzdGFydCk7CisgICAgcmV0dXJuIFdURjo6ZmluZChjaGFyYWN0ZXJzMTYoKSwg
bGVuZ3RoKCksIG1hdGNoRnVuY3Rpb24sIHN0YXJ0KTsKK30KKwogI2lmICFDSEVDS19TVFJJTkdW
SUVXX0xJRkVUSU1FCiBpbmxpbmUgdm9pZCBTdHJpbmdWaWV3OjppbnZhbGlkYXRlKGNvbnN0IFN0
cmluZ0ltcGwmKQogewpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29y
ay9DYWNoZVZhbGlkYXRpb24uY3BwIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9D
YWNoZVZhbGlkYXRpb24uY3BwCmluZGV4IDA3MTBlNDI4NGIzYTIyNGJmMjk0ZDg1MmJjNzc5MzU0
NTMwZDI1NWUuLjJhOTYyODQxMzJmNjgzM2FiZGU3MDg4MTRlZGVjNjZlN2Y1MmY5NDkgMTAwNjQ0
Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvQ2FjaGVWYWxpZGF0aW9uLmNw
cAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL0NhY2hlVmFsaWRhdGlvbi5j
cHAKQEAgLTM0LDYgKzM0LDcgQEAKICNpbmNsdWRlICJSZXNvdXJjZVJlcXVlc3QuaCIKICNpbmNs
dWRlICJSZXNvdXJjZVJlc3BvbnNlLmgiCiAjaW5jbHVkZSA8d3RmL0N1cnJlbnRUaW1lLmg+Cisj
aW5jbHVkZSA8d3RmL3RleHQvU3RyaW5nVmlldy5oPgogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAK
QEAgLTIwMiwyMSArMjAzLDIyIEBAIGlubGluZSBib29sIGlzQ2FjaGVIZWFkZXJTZXBhcmF0b3Io
VUNoYXIgYykKICAgICB9CiB9CiAKLWlubGluZSBib29sIGlzQ29udHJvbENoYXJhY3RlcihVQ2hh
ciBjKQoraW5saW5lIGJvb2wgaXNDb250cm9sQ2hhcmFjdGVyT3JXaGl0ZXNwYWNlKFVDaGFyIGMp
CiB7Ci0gICAgcmV0dXJuIGMgPCAnICcgfHwgYyA9PSAxMjc7CisgICAgcmV0dXJuIGMgPCAnICcg
fHwgYyA9PSAxMjcgfHwgaXNTcGFjZU9yTmV3bGluZShjKTsKIH0KIAotaW5saW5lIFN0cmluZyB0
cmltVG9OZXh0U2VwYXJhdG9yKGNvbnN0IFN0cmluZyYgc3RyKQoraW5saW5lIFN0cmluZyB0cmlt
VG9OZXh0U2VwYXJhdG9yKGNvbnN0IFN0cmluZ1ZpZXcmIHN0cikKIHsKLSAgICByZXR1cm4gc3Ry
LnN1YnN0cmluZygwLCBzdHIuZmluZChpc0NhY2hlSGVhZGVyU2VwYXJhdG9yKSk7CisgICAgcmV0
dXJuIHN0ci5zdWJzdHJpbmcoMCwgc3RyLmZpbmQoaXNDYWNoZUhlYWRlclNlcGFyYXRvcikpLnRv
U3RyaW5nKCk7CiB9CiAKIHN0YXRpYyBWZWN0b3I8c3RkOjpwYWlyPFN0cmluZywgU3RyaW5nPj4g
cGFyc2VDYWNoZUhlYWRlcihjb25zdCBTdHJpbmcmIGhlYWRlcikKIHsKICAgICBWZWN0b3I8c3Rk
OjpwYWlyPFN0cmluZywgU3RyaW5nPj4gcmVzdWx0OwogCi0gICAgY29uc3QgU3RyaW5nIHNhZmVI
ZWFkZXIgPSBoZWFkZXIucmVtb3ZlQ2hhcmFjdGVycyhpc0NvbnRyb2xDaGFyYWN0ZXIpOworICAg
IGNvbnN0IFN0cmluZyBzYWZlSGVhZGVyU3RyaW5nID0gaGVhZGVyLnJlbW92ZUNoYXJhY3RlcnMo
aXNDb250cm9sQ2hhcmFjdGVyT3JXaGl0ZXNwYWNlKTsKKyAgICBjb25zdCBTdHJpbmdWaWV3IHNh
ZmVIZWFkZXIgPSBzYWZlSGVhZGVyU3RyaW5nOwogICAgIHVuc2lnbmVkIG1heCA9IHNhZmVIZWFk
ZXIubGVuZ3RoKCk7CiAgICAgdW5zaWduZWQgcG9zID0gMDsKICAgICB3aGlsZSAocG9zIDwgbWF4
KSB7CkBAIC0yMjQsMzAgKzIyNiwzMCBAQCBzdGF0aWMgVmVjdG9yPHN0ZDo6cGFpcjxTdHJpbmcs
IFN0cmluZz4+IHBhcnNlQ2FjaGVIZWFkZXIoY29uc3QgU3RyaW5nJiBoZWFkZXIpCiAgICAgICAg
IHNpemVfdCBuZXh0RXF1YWxTaWduUG9zaXRpb24gPSBzYWZlSGVhZGVyLmZpbmQoJz0nLCBwb3Mp
OwogICAgICAgICBpZiAobmV4dEVxdWFsU2lnblBvc2l0aW9uID09IG5vdEZvdW5kICYmIG5leHRD
b21tYVBvc2l0aW9uID09IG5vdEZvdW5kKSB7CiAgICAgICAgICAgICAvLyBBZGQgbGFzdCBkaXJl
Y3RpdmUgdG8gbWFwIHdpdGggZW1wdHkgc3RyaW5nIGFzIHZhbHVlCi0gICAgICAgICAgICByZXN1
bHQuYXBwZW5kKHN0ZDo6bWFrZV9wYWlyKHRyaW1Ub05leHRTZXBhcmF0b3Ioc2FmZUhlYWRlci5z
dWJzdHJpbmcocG9zLCBtYXggLSBwb3MpLnN0cmlwV2hpdGVTcGFjZSgpKSwgIiIpKTsKKyAgICAg
ICAgICAgIHJlc3VsdC5hcHBlbmQoeyB0cmltVG9OZXh0U2VwYXJhdG9yKHNhZmVIZWFkZXIuc3Vi
c3RyaW5nKHBvcywgbWF4IC0gcG9zKSksIGVtcHR5U3RyaW5nKCkgfSk7CiAgICAgICAgICAgICBy
ZXR1cm4gcmVzdWx0OwogICAgICAgICB9CiAgICAgICAgIGlmIChuZXh0Q29tbWFQb3NpdGlvbiAh
PSBub3RGb3VuZCAmJiAobmV4dENvbW1hUG9zaXRpb24gPCBuZXh0RXF1YWxTaWduUG9zaXRpb24g
fHwgbmV4dEVxdWFsU2lnblBvc2l0aW9uID09IG5vdEZvdW5kKSkgewogICAgICAgICAgICAgLy8g
QWRkIGRpcmVjdGl2ZSB0byBtYXAgd2l0aCBlbXB0eSBzdHJpbmcgYXMgdmFsdWUKLSAgICAgICAg
ICAgIHJlc3VsdC5hcHBlbmQoc3RkOjptYWtlX3BhaXIodHJpbVRvTmV4dFNlcGFyYXRvcihzYWZl
SGVhZGVyLnN1YnN0cmluZyhwb3MsIG5leHRDb21tYVBvc2l0aW9uIC0gcG9zKS5zdHJpcFdoaXRl
U3BhY2UoKSksICIiKSk7CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKHsgdHJpbVRvTmV4dFNl
cGFyYXRvcihzYWZlSGVhZGVyLnN1YnN0cmluZyhwb3MsIG5leHRDb21tYVBvc2l0aW9uIC0gcG9z
KSksIGVtcHR5U3RyaW5nKCkgfSk7CiAgICAgICAgICAgICBwb3MgKz0gbmV4dENvbW1hUG9zaXRp
b24gLSBwb3MgKyAxOwogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KICAgICAgICAg
Ly8gR2V0IGRpcmVjdGl2ZSBuYW1lLCBwYXJzZSByaWdodCBoYW5kIHNpZGUgb2YgZXF1YWwgc2ln
biwgdGhlbiBhZGQgdG8gbWFwCi0gICAgICAgIFN0cmluZyBkaXJlY3RpdmUgPSB0cmltVG9OZXh0
U2VwYXJhdG9yKHNhZmVIZWFkZXIuc3Vic3RyaW5nKHBvcywgbmV4dEVxdWFsU2lnblBvc2l0aW9u
IC0gcG9zKS5zdHJpcFdoaXRlU3BhY2UoKSk7CisgICAgICAgIFN0cmluZyBkaXJlY3RpdmUgPSB0
cmltVG9OZXh0U2VwYXJhdG9yKHNhZmVIZWFkZXIuc3Vic3RyaW5nKHBvcywgbmV4dEVxdWFsU2ln
blBvc2l0aW9uIC0gcG9zKSk7CiAgICAgICAgIHBvcyArPSBuZXh0RXF1YWxTaWduUG9zaXRpb24g
LSBwb3MgKyAxOwogCi0gICAgICAgIFN0cmluZyB2YWx1ZSA9IHNhZmVIZWFkZXIuc3Vic3RyaW5n
KHBvcywgbWF4IC0gcG9zKS5zdHJpcFdoaXRlU3BhY2UoKTsKKyAgICAgICAgU3RyaW5nVmlldyB2
YWx1ZSA9IHNhZmVIZWFkZXIuc3Vic3RyaW5nKHBvcywgbWF4IC0gcG9zKTsKICAgICAgICAgaWYg
KHZhbHVlWzBdID09ICciJykgewogICAgICAgICAgICAgLy8gVGhlIHZhbHVlIGlzIGEgcXVvdGVk
IHN0cmluZwogICAgICAgICAgICAgc2l6ZV90IG5leHREb3VibGVRdW90ZVBvc2l0aW9uID0gdmFs
dWUuZmluZCgnIicsIDEpOwogICAgICAgICAgICAgaWYgKG5leHREb3VibGVRdW90ZVBvc2l0aW9u
ID09IG5vdEZvdW5kKSB7CiAgICAgICAgICAgICAgICAgLy8gUGFyc2UgZXJyb3I7IGp1c3QgdXNl
IHRoZSByZXN0IGFzIHRoZSB2YWx1ZQotICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoc3Rk
OjptYWtlX3BhaXIoZGlyZWN0aXZlLCB0cmltVG9OZXh0U2VwYXJhdG9yKHZhbHVlLnN1YnN0cmlu
ZygxLCB2YWx1ZS5sZW5ndGgoKSAtIDEpLnN0cmlwV2hpdGVTcGFjZSgpKSkpOworICAgICAgICAg
ICAgICAgIHJlc3VsdC5hcHBlbmQoeyBkaXJlY3RpdmUsIHRyaW1Ub05leHRTZXBhcmF0b3IodmFs
dWUuc3Vic3RyaW5nKDEsIHZhbHVlLmxlbmd0aCgpIC0gMSkpIH0pOwogICAgICAgICAgICAgICAg
IHJldHVybiByZXN1bHQ7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBTdG9yZSB0aGUg
dmFsdWUgYXMgYSBxdW90ZWQgc3RyaW5nIHdpdGhvdXQgcXVvdGVzCi0gICAgICAgICAgICByZXN1
bHQuYXBwZW5kKHN0ZDo6bWFrZV9wYWlyKGRpcmVjdGl2ZSwgdmFsdWUuc3Vic3RyaW5nKDEsIG5l
eHREb3VibGVRdW90ZVBvc2l0aW9uIC0gMSkuc3RyaXBXaGl0ZVNwYWNlKCkpKTsKKyAgICAgICAg
ICAgIHJlc3VsdC5hcHBlbmQoeyBkaXJlY3RpdmUsIHZhbHVlLnN1YnN0cmluZygxLCBuZXh0RG91
YmxlUXVvdGVQb3NpdGlvbiAtIDEpLnRvU3RyaW5nKCkgfSk7CiAgICAgICAgICAgICBwb3MgKz0g
KHNhZmVIZWFkZXIuZmluZCgnIicsIHBvcykgLSBwb3MpICsgbmV4dERvdWJsZVF1b3RlUG9zaXRp
b24gKyAxOwogICAgICAgICAgICAgLy8gTW92ZSBwYXN0IG5leHQgY29tbWEsIGlmIHRoZXJlIGlz
IG9uZQogICAgICAgICAgICAgc2l6ZV90IG5leHRDb21tYVBvc2l0aW9uMiA9IHNhZmVIZWFkZXIu
ZmluZCgnLCcsIHBvcyk7CkBAIC0yNjAsMTEgKzI2MiwxMSBAQCBzdGF0aWMgVmVjdG9yPHN0ZDo6
cGFpcjxTdHJpbmcsIFN0cmluZz4+IHBhcnNlQ2FjaGVIZWFkZXIoY29uc3QgU3RyaW5nJiBoZWFk
ZXIpCiAgICAgICAgIHNpemVfdCBuZXh0Q29tbWFQb3NpdGlvbjIgPSB2YWx1ZS5maW5kKCcsJyk7
CiAgICAgICAgIGlmIChuZXh0Q29tbWFQb3NpdGlvbjIgPT0gbm90Rm91bmQpIHsKICAgICAgICAg
ICAgIC8vIFRoZSByZXN0IGlzIHRoZSB2YWx1ZTsgbm8gY2hhbmdlIHRvIHZhbHVlIG5lZWRlZAot
ICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChzdGQ6Om1ha2VfcGFpcihkaXJlY3RpdmUsIHRyaW1U
b05leHRTZXBhcmF0b3IodmFsdWUpKSk7CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKHsgZGly
ZWN0aXZlLCB0cmltVG9OZXh0U2VwYXJhdG9yKHZhbHVlKSB9KTsKICAgICAgICAgICAgIHJldHVy
biByZXN1bHQ7CiAgICAgICAgIH0KICAgICAgICAgLy8gVGhlIHZhbHVlIGlzIGRlbGltaXRlZCBi
eSB0aGUgbmV4dCBjb21tYQotICAgICAgICByZXN1bHQuYXBwZW5kKHN0ZDo6bWFrZV9wYWlyKGRp
cmVjdGl2ZSwgdHJpbVRvTmV4dFNlcGFyYXRvcih2YWx1ZS5zdWJzdHJpbmcoMCwgbmV4dENvbW1h
UG9zaXRpb24yKS5zdHJpcFdoaXRlU3BhY2UoKSkpKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZCh7
IGRpcmVjdGl2ZSwgdHJpbVRvTmV4dFNlcGFyYXRvcih2YWx1ZS5zdWJzdHJpbmcoMCwgbmV4dENv
bW1hUG9zaXRpb24yKSkgfSk7CiAgICAgICAgIHBvcyArPSAoc2FmZUhlYWRlci5maW5kKCcsJywg
cG9zKSAtIHBvcykgKyAxOwogICAgIH0KICAgICByZXR1cm4gcmVzdWx0Owo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>281597</attachid>
            <date>2016-06-17 16:48:27 -0700</date>
            <delta_ts>2016-06-17 17:25:46 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-158891-20160617164824.patch</filename>
            <type>text/plain</type>
            <size>8442</size>
            <attacher name="Chris Dumez">cdumez</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjAyMTgyCmRpZmYgLS1naXQgYS9Tb3VyY2UvV1RGL0NoYW5n
ZUxvZyBiL1NvdXJjZS9XVEYvQ2hhbmdlTG9nCmluZGV4IGYwMWIzOWRjMDkyMmJiYThkMTk4Zjlk
YzczMWQyNWRhMjMxMjczOTkuLjE3YjQxZjNlODkzOWI5ODRhMDMwOTZlZDI3NGM5Mzg1MmEyYmY2
MTggMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XVEYvQ2hhbmdlTG9nCisrKyBiL1NvdXJjZS9XVEYvQ2hh
bmdlTG9nCkBAIC0xLDMgKzEsMTYgQEAKKzIwMTYtMDYtMTcgIENocmlzIER1bWV6ICA8Y2R1bWV6
QGFwcGxlLmNvbT4KKworICAgICAgICBPcHRpbWl6ZSBwYXJzZUNhY2hlSGVhZGVyKCkgYnkgdXNp
bmcgU3RyaW5nVmlldworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5j
Z2k/aWQ9MTU4ODkxCisKKyAgICAgICAgUmV2aWV3ZWQgYnkgRGFyaW4gQWRsZXIuCisKKyAgICAg
ICAgQWRkIGEgU3RyaW5nVmlldzo6ZmluZCgpIG92ZXJsb2FkIHdoaWNoIHRha2VzIGEgQ2hhcmFj
dGVyTWF0Y2hGdW5jdGlvbgorICAgICAgICB0byBtYXRjaCB0aGUgb25lIG9uIFN0cmluZy4KKwor
ICAgICAgICAqIHd0Zi90ZXh0L1N0cmluZ1ZpZXcuaDoKKyAgICAgICAgKFdURjo6U3RyaW5nVmll
dzo6ZmluZCk6CisKIDIwMTYtMDYtMTcgIE1hcmsgTGFtICA8bWFyay5sYW1AYXBwbGUuY29tPgog
CiAgICAgICAgIE9PTSBBc3NlcnRpb24gZmFpbHVyZSBpbiBKU09OLnN0cmluZ2lmeS4KZGlmZiAt
LWdpdCBhL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZyBiL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxv
ZwppbmRleCAxOWIzM2YxNWYwMDdlMjNjNzMzMzViMzk4MDBjZGVjMGVjOGI3M2JhLi4wYmE2ODFi
NWI4MDZlN2I5MWI3MmNiODM0YWM4NjJiYzcyODkzMTBlIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cKKysrIGIvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCkBAIC0xLDUgKzEs
MjQgQEAKIDIwMTYtMDYtMTcgIENocmlzIER1bWV6ICA8Y2R1bWV6QGFwcGxlLmNvbT4KIAorICAg
ICAgICBPcHRpbWl6ZSBwYXJzZUNhY2hlSGVhZGVyKCkgYnkgdXNpbmcgU3RyaW5nVmlldworICAg
ICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTU4ODkxCisKKyAg
ICAgICAgUmV2aWV3ZWQgYnkgRGFyaW4gQWRsZXIuCisKKyAgICAgICAgT3B0aW1pemUgcGFyc2VD
YWNoZUhlYWRlcigpIGFuZCBhdm9pZCBzb21lIHRlbXBvcmFyeSBTdHJpbmcgYWxsb2NhdGlvbnMK
KyAgICAgICAgYnkgdXNpbmcgU3RyaW5nVmlldy4gV2Ugbm93IHN0cmlwIHRoZSB3aGl0ZXNwYWNl
cyBpbiB0aGUgaW5wdXQgc3RyaW5nCisgICAgICAgIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZ1
bmN0aW9uLCBhdCB0aGUgc2FtZSBhcyBhcyB3ZSBzdHJpcCB0aGUKKyAgICAgICAgY29udHJvbCBj
aGFyYWN0ZXJzLiBXZSBhcmUgdGhlbiBhYmxlIHRvIGxldmVyYWdlIFN0cmluZ1ZpZXcgaW4gdGhl
CisgICAgICAgIHJlc3Qgb2YgdGhlIGZ1bmN0aW9uIHRvIGdldCBzdWJzdHJpbmdzIHdpdGhvdXQg
dGhlIG5lZWQgZm9yIGV4dHJhCisgICAgICAgIFN0cmluZyBhbGxvY2F0aW9ucy4KKworICAgICAg
ICAqIHBsYXRmb3JtL25ldHdvcmsvQ2FjaGVWYWxpZGF0aW9uLmNwcDoKKyAgICAgICAgKFdlYkNv
cmU6OmlzQ29udHJvbENoYXJhY3Rlck9yU3BhY2UpOgorICAgICAgICAoV2ViQ29yZTo6dHJpbVRv
TmV4dFNlcGFyYXRvcik6CisgICAgICAgIChXZWJDb3JlOjpwYXJzZUNhY2hlSGVhZGVyKToKKwor
MjAxNi0wNi0xNyAgQ2hyaXMgRHVtZXogIDxjZHVtZXpAYXBwbGUuY29tPgorCiAgICAgICAgIFRv
dWNoRXZlbnQgc2hvdWxkIGhhdmUgYSBjb25zdHJ1Y3RvcgogICAgICAgICBodHRwczovL2J1Z3Mu
d2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTU4ODgzCiAgICAgICAgIDxyZGFyOi8vcHJvYmxl
bS8yNjA2MzU4NT4KZGlmZiAtLWdpdCBhL1NvdXJjZS9XVEYvd3RmL3RleHQvU3RyaW5nVmlldy5o
IGIvU291cmNlL1dURi93dGYvdGV4dC9TdHJpbmdWaWV3LmgKaW5kZXggZDhiODMwMzFjNjRhNTM3
ZjJhYzY0NGQwYjZlZmMwYjZhZTY5ZGQxMC4uM2FlZjRkYmJmODk0N2ZkYWExODU3NDJmOGE5Mjdh
NzQ5MzllMDgyZSAxMDA2NDQKLS0tIGEvU291cmNlL1dURi93dGYvdGV4dC9TdHJpbmdWaWV3LmgK
KysrIGIvU291cmNlL1dURi93dGYvdGV4dC9TdHJpbmdWaWV3LmgKQEAgLTQ1LDYgKzQ1LDggQEAK
IAogbmFtZXNwYWNlIFdURiB7CiAKK3VzaW5nIENoYXJhY3Rlck1hdGNoRnVuY3Rpb24gPSBib29s
ICgqKShVQ2hhcik7CisKIC8vIFN0cmluZ1ZpZXcgaXMgYSBub24tb3duaW5nIHJlZmVyZW5jZSB0
byBhIHN0cmluZywgc2ltaWxhciB0byB0aGUgcHJvcG9zZWQgc3RkOjpzdHJpbmdfdmlldy4KIC8v
IFdoZXRoZXIgdGhlIHN0cmluZyBpcyA4LWJpdCBvciAxNi1iaXQgaXMgZW5jb2RlZCBpbiB0aGUg
dXBwZXIgYml0IG9mIHRoZSBsZW5ndGggbWVtYmVyLgogLy8gVGhpcyBtZWFucyB0aGF0IHN0cmlu
Z3MgbG9uZ2VyIHRoYW4gMiBnaWdhY2hhcmFjdGVycyBjYW5ub3QgYmUgcmVwcmVzZW50ZWQuCkBA
IC0xMTAsNiArMTEyLDcgQEAgcHVibGljOgogICAgIFN0cmluZ1ZpZXcgc3Vic3RyaW5nKHVuc2ln
bmVkIHN0YXJ0LCB1bnNpZ25lZCBsZW5ndGggPSBzdGQ6Om51bWVyaWNfbGltaXRzPHVuc2lnbmVk
Pjo6bWF4KCkpIGNvbnN0OwogCiAgICAgc2l6ZV90IGZpbmQoVUNoYXIsIHVuc2lnbmVkIHN0YXJ0
ID0gMCkgY29uc3Q7CisgICAgc2l6ZV90IGZpbmQoQ2hhcmFjdGVyTWF0Y2hGdW5jdGlvbiwgdW5z
aWduZWQgc3RhcnQgPSAwKSBjb25zdDsKIAogICAgIFdURl9FWFBPUlRfU1RSSU5HX0FQSSBzaXpl
X3QgZmluZChTdHJpbmdWaWV3LCB1bnNpZ25lZCBzdGFydCkgY29uc3Q7CiAKQEAgLTUwMCw2ICs1
MDMsMTMgQEAgaW5saW5lIHNpemVfdCBTdHJpbmdWaWV3OjpmaW5kKFVDaGFyIGNoYXJhY3Rlciwg
dW5zaWduZWQgc3RhcnQpIGNvbnN0CiAgICAgcmV0dXJuIFdURjo6ZmluZChjaGFyYWN0ZXJzMTYo
KSwgbGVuZ3RoKCksIGNoYXJhY3Rlciwgc3RhcnQpOwogfQogCitpbmxpbmUgc2l6ZV90IFN0cmlu
Z1ZpZXc6OmZpbmQoQ2hhcmFjdGVyTWF0Y2hGdW5jdGlvbiBtYXRjaEZ1bmN0aW9uLCB1bnNpZ25l
ZCBzdGFydCkgY29uc3QKK3sKKyAgICBpZiAoaXM4Qml0KCkpCisgICAgICAgIHJldHVybiBXVEY6
OmZpbmQoY2hhcmFjdGVyczgoKSwgbV9sZW5ndGgsIG1hdGNoRnVuY3Rpb24sIHN0YXJ0KTsKKyAg
ICByZXR1cm4gV1RGOjpmaW5kKGNoYXJhY3RlcnMxNigpLCBsZW5ndGgoKSwgbWF0Y2hGdW5jdGlv
biwgc3RhcnQpOworfQorCiAjaWYgIUNIRUNLX1NUUklOR1ZJRVdfTElGRVRJTUUKIGlubGluZSB2
b2lkIFN0cmluZ1ZpZXc6OmludmFsaWRhdGUoY29uc3QgU3RyaW5nSW1wbCYpCiB7CmRpZmYgLS1n
aXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL0NhY2hlVmFsaWRhdGlvbi5jcHAg
Yi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL0NhY2hlVmFsaWRhdGlvbi5jcHAKaW5k
ZXggMDcxMGU0Mjg0YjNhMjI0YmYyOTRkODUyYmM3NzkzNTQ1MzBkMjU1ZS4uOWI5ZjkwMDYxMDlk
ZjM1ZTY1MDljY2JhYTkwOTUzYmQ0ZjdkZDIzNCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUv
cGxhdGZvcm0vbmV0d29yay9DYWNoZVZhbGlkYXRpb24uY3BwCisrKyBiL1NvdXJjZS9XZWJDb3Jl
L3BsYXRmb3JtL25ldHdvcmsvQ2FjaGVWYWxpZGF0aW9uLmNwcApAQCAtMzQsNiArMzQsNyBAQAog
I2luY2x1ZGUgIlJlc291cmNlUmVxdWVzdC5oIgogI2luY2x1ZGUgIlJlc291cmNlUmVzcG9uc2Uu
aCIKICNpbmNsdWRlIDx3dGYvQ3VycmVudFRpbWUuaD4KKyNpbmNsdWRlIDx3dGYvdGV4dC9TdHJp
bmdWaWV3Lmg+CiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIApAQCAtMjAyLDIxICsyMDMsMjIgQEAg
aW5saW5lIGJvb2wgaXNDYWNoZUhlYWRlclNlcGFyYXRvcihVQ2hhciBjKQogICAgIH0KIH0KIAot
aW5saW5lIGJvb2wgaXNDb250cm9sQ2hhcmFjdGVyKFVDaGFyIGMpCitpbmxpbmUgYm9vbCBpc0Nv
bnRyb2xDaGFyYWN0ZXJPclNwYWNlKFVDaGFyIGNoYXJhY3RlcikKIHsKLSAgICByZXR1cm4gYyA8
ICcgJyB8fCBjID09IDEyNzsKKyAgICByZXR1cm4gY2hhcmFjdGVyIDw9ICcgJyB8fCBjaGFyYWN0
ZXIgPT0gMTI3OwogfQogCi1pbmxpbmUgU3RyaW5nIHRyaW1Ub05leHRTZXBhcmF0b3IoY29uc3Qg
U3RyaW5nJiBzdHIpCitpbmxpbmUgU3RyaW5nVmlldyB0cmltVG9OZXh0U2VwYXJhdG9yKFN0cmlu
Z1ZpZXcgc3RyaW5nKQogewotICAgIHJldHVybiBzdHIuc3Vic3RyaW5nKDAsIHN0ci5maW5kKGlz
Q2FjaGVIZWFkZXJTZXBhcmF0b3IpKTsKKyAgICByZXR1cm4gc3RyaW5nLnN1YnN0cmluZygwLCBz
dHJpbmcuZmluZChpc0NhY2hlSGVhZGVyU2VwYXJhdG9yKSk7CiB9CiAKIHN0YXRpYyBWZWN0b3I8
c3RkOjpwYWlyPFN0cmluZywgU3RyaW5nPj4gcGFyc2VDYWNoZUhlYWRlcihjb25zdCBTdHJpbmcm
IGhlYWRlcikKIHsKICAgICBWZWN0b3I8c3RkOjpwYWlyPFN0cmluZywgU3RyaW5nPj4gcmVzdWx0
OwogCi0gICAgY29uc3QgU3RyaW5nIHNhZmVIZWFkZXIgPSBoZWFkZXIucmVtb3ZlQ2hhcmFjdGVy
cyhpc0NvbnRyb2xDaGFyYWN0ZXIpOworICAgIFN0cmluZyBzYWZlSGVhZGVyU3RyaW5nID0gaGVh
ZGVyLnJlbW92ZUNoYXJhY3RlcnMoaXNDb250cm9sQ2hhcmFjdGVyT3JTcGFjZSk7CisgICAgU3Ry
aW5nVmlldyBzYWZlSGVhZGVyID0gc2FmZUhlYWRlclN0cmluZzsKICAgICB1bnNpZ25lZCBtYXgg
PSBzYWZlSGVhZGVyLmxlbmd0aCgpOwogICAgIHVuc2lnbmVkIHBvcyA9IDA7CiAgICAgd2hpbGUg
KHBvcyA8IG1heCkgewpAQCAtMjI0LDMwICsyMjYsMzAgQEAgc3RhdGljIFZlY3RvcjxzdGQ6OnBh
aXI8U3RyaW5nLCBTdHJpbmc+PiBwYXJzZUNhY2hlSGVhZGVyKGNvbnN0IFN0cmluZyYgaGVhZGVy
KQogICAgICAgICBzaXplX3QgbmV4dEVxdWFsU2lnblBvc2l0aW9uID0gc2FmZUhlYWRlci5maW5k
KCc9JywgcG9zKTsKICAgICAgICAgaWYgKG5leHRFcXVhbFNpZ25Qb3NpdGlvbiA9PSBub3RGb3Vu
ZCAmJiBuZXh0Q29tbWFQb3NpdGlvbiA9PSBub3RGb3VuZCkgewogICAgICAgICAgICAgLy8gQWRk
IGxhc3QgZGlyZWN0aXZlIHRvIG1hcCB3aXRoIGVtcHR5IHN0cmluZyBhcyB2YWx1ZQotICAgICAg
ICAgICAgcmVzdWx0LmFwcGVuZChzdGQ6Om1ha2VfcGFpcih0cmltVG9OZXh0U2VwYXJhdG9yKHNh
ZmVIZWFkZXIuc3Vic3RyaW5nKHBvcywgbWF4IC0gcG9zKS5zdHJpcFdoaXRlU3BhY2UoKSksICIi
KSk7CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKHsgdHJpbVRvTmV4dFNlcGFyYXRvcihzYWZl
SGVhZGVyLnN1YnN0cmluZyhwb3MsIG1heCAtIHBvcykpLnRvU3RyaW5nKCksIGVtcHR5U3RyaW5n
KCkgfSk7CiAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICB9CiAgICAgICAgIGlm
IChuZXh0Q29tbWFQb3NpdGlvbiAhPSBub3RGb3VuZCAmJiAobmV4dENvbW1hUG9zaXRpb24gPCBu
ZXh0RXF1YWxTaWduUG9zaXRpb24gfHwgbmV4dEVxdWFsU2lnblBvc2l0aW9uID09IG5vdEZvdW5k
KSkgewogICAgICAgICAgICAgLy8gQWRkIGRpcmVjdGl2ZSB0byBtYXAgd2l0aCBlbXB0eSBzdHJp
bmcgYXMgdmFsdWUKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoc3RkOjptYWtlX3BhaXIodHJp
bVRvTmV4dFNlcGFyYXRvcihzYWZlSGVhZGVyLnN1YnN0cmluZyhwb3MsIG5leHRDb21tYVBvc2l0
aW9uIC0gcG9zKS5zdHJpcFdoaXRlU3BhY2UoKSksICIiKSk7CisgICAgICAgICAgICByZXN1bHQu
YXBwZW5kKHsgdHJpbVRvTmV4dFNlcGFyYXRvcihzYWZlSGVhZGVyLnN1YnN0cmluZyhwb3MsIG5l
eHRDb21tYVBvc2l0aW9uIC0gcG9zKSkudG9TdHJpbmcoKSwgZW1wdHlTdHJpbmcoKSB9KTsKICAg
ICAgICAgICAgIHBvcyArPSBuZXh0Q29tbWFQb3NpdGlvbiAtIHBvcyArIDE7CiAgICAgICAgICAg
ICBjb250aW51ZTsKICAgICAgICAgfQogICAgICAgICAvLyBHZXQgZGlyZWN0aXZlIG5hbWUsIHBh
cnNlIHJpZ2h0IGhhbmQgc2lkZSBvZiBlcXVhbCBzaWduLCB0aGVuIGFkZCB0byBtYXAKLSAgICAg
ICAgU3RyaW5nIGRpcmVjdGl2ZSA9IHRyaW1Ub05leHRTZXBhcmF0b3Ioc2FmZUhlYWRlci5zdWJz
dHJpbmcocG9zLCBuZXh0RXF1YWxTaWduUG9zaXRpb24gLSBwb3MpLnN0cmlwV2hpdGVTcGFjZSgp
KTsKKyAgICAgICAgU3RyaW5nIGRpcmVjdGl2ZSA9IHRyaW1Ub05leHRTZXBhcmF0b3Ioc2FmZUhl
YWRlci5zdWJzdHJpbmcocG9zLCBuZXh0RXF1YWxTaWduUG9zaXRpb24gLSBwb3MpKS50b1N0cmlu
ZygpOwogICAgICAgICBwb3MgKz0gbmV4dEVxdWFsU2lnblBvc2l0aW9uIC0gcG9zICsgMTsKIAot
ICAgICAgICBTdHJpbmcgdmFsdWUgPSBzYWZlSGVhZGVyLnN1YnN0cmluZyhwb3MsIG1heCAtIHBv
cykuc3RyaXBXaGl0ZVNwYWNlKCk7CisgICAgICAgIFN0cmluZ1ZpZXcgdmFsdWUgPSBzYWZlSGVh
ZGVyLnN1YnN0cmluZyhwb3MsIG1heCAtIHBvcyk7CiAgICAgICAgIGlmICh2YWx1ZVswXSA9PSAn
IicpIHsKICAgICAgICAgICAgIC8vIFRoZSB2YWx1ZSBpcyBhIHF1b3RlZCBzdHJpbmcKICAgICAg
ICAgICAgIHNpemVfdCBuZXh0RG91YmxlUXVvdGVQb3NpdGlvbiA9IHZhbHVlLmZpbmQoJyInLCAx
KTsKICAgICAgICAgICAgIGlmIChuZXh0RG91YmxlUXVvdGVQb3NpdGlvbiA9PSBub3RGb3VuZCkg
ewogICAgICAgICAgICAgICAgIC8vIFBhcnNlIGVycm9yOyBqdXN0IHVzZSB0aGUgcmVzdCBhcyB0
aGUgdmFsdWUKLSAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKHN0ZDo6bWFrZV9wYWlyKGRp
cmVjdGl2ZSwgdHJpbVRvTmV4dFNlcGFyYXRvcih2YWx1ZS5zdWJzdHJpbmcoMSwgdmFsdWUubGVu
Z3RoKCkgLSAxKS5zdHJpcFdoaXRlU3BhY2UoKSkpKTsKKyAgICAgICAgICAgICAgICByZXN1bHQu
YXBwZW5kKHsgZGlyZWN0aXZlLCB0cmltVG9OZXh0U2VwYXJhdG9yKHZhbHVlLnN1YnN0cmluZygx
LCB2YWx1ZS5sZW5ndGgoKSAtIDEpKS50b1N0cmluZygpIH0pOwogICAgICAgICAgICAgICAgIHJl
dHVybiByZXN1bHQ7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBTdG9yZSB0aGUgdmFs
dWUgYXMgYSBxdW90ZWQgc3RyaW5nIHdpdGhvdXQgcXVvdGVzCi0gICAgICAgICAgICByZXN1bHQu
YXBwZW5kKHN0ZDo6bWFrZV9wYWlyKGRpcmVjdGl2ZSwgdmFsdWUuc3Vic3RyaW5nKDEsIG5leHRE
b3VibGVRdW90ZVBvc2l0aW9uIC0gMSkuc3RyaXBXaGl0ZVNwYWNlKCkpKTsKKyAgICAgICAgICAg
IHJlc3VsdC5hcHBlbmQoeyBkaXJlY3RpdmUsIHZhbHVlLnN1YnN0cmluZygxLCBuZXh0RG91Ymxl
UXVvdGVQb3NpdGlvbiAtIDEpLnRvU3RyaW5nKCkgfSk7CiAgICAgICAgICAgICBwb3MgKz0gKHNh
ZmVIZWFkZXIuZmluZCgnIicsIHBvcykgLSBwb3MpICsgbmV4dERvdWJsZVF1b3RlUG9zaXRpb24g
KyAxOwogICAgICAgICAgICAgLy8gTW92ZSBwYXN0IG5leHQgY29tbWEsIGlmIHRoZXJlIGlzIG9u
ZQogICAgICAgICAgICAgc2l6ZV90IG5leHRDb21tYVBvc2l0aW9uMiA9IHNhZmVIZWFkZXIuZmlu
ZCgnLCcsIHBvcyk7CkBAIC0yNjAsMTEgKzI2MiwxMSBAQCBzdGF0aWMgVmVjdG9yPHN0ZDo6cGFp
cjxTdHJpbmcsIFN0cmluZz4+IHBhcnNlQ2FjaGVIZWFkZXIoY29uc3QgU3RyaW5nJiBoZWFkZXIp
CiAgICAgICAgIHNpemVfdCBuZXh0Q29tbWFQb3NpdGlvbjIgPSB2YWx1ZS5maW5kKCcsJyk7CiAg
ICAgICAgIGlmIChuZXh0Q29tbWFQb3NpdGlvbjIgPT0gbm90Rm91bmQpIHsKICAgICAgICAgICAg
IC8vIFRoZSByZXN0IGlzIHRoZSB2YWx1ZTsgbm8gY2hhbmdlIHRvIHZhbHVlIG5lZWRlZAotICAg
ICAgICAgICAgcmVzdWx0LmFwcGVuZChzdGQ6Om1ha2VfcGFpcihkaXJlY3RpdmUsIHRyaW1Ub05l
eHRTZXBhcmF0b3IodmFsdWUpKSk7CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKHsgZGlyZWN0
aXZlLCB0cmltVG9OZXh0U2VwYXJhdG9yKHZhbHVlKS50b1N0cmluZygpIH0pOwogICAgICAgICAg
ICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgfQogICAgICAgICAvLyBUaGUgdmFsdWUgaXMgZGVs
aW1pdGVkIGJ5IHRoZSBuZXh0IGNvbW1hCi0gICAgICAgIHJlc3VsdC5hcHBlbmQoc3RkOjptYWtl
X3BhaXIoZGlyZWN0aXZlLCB0cmltVG9OZXh0U2VwYXJhdG9yKHZhbHVlLnN1YnN0cmluZygwLCBu
ZXh0Q29tbWFQb3NpdGlvbjIpLnN0cmlwV2hpdGVTcGFjZSgpKSkpOworICAgICAgICByZXN1bHQu
YXBwZW5kKHsgZGlyZWN0aXZlLCB0cmltVG9OZXh0U2VwYXJhdG9yKHZhbHVlLnN1YnN0cmluZygw
LCBuZXh0Q29tbWFQb3NpdGlvbjIpKS50b1N0cmluZygpIH0pOwogICAgICAgICBwb3MgKz0gKHNh
ZmVIZWFkZXIuZmluZCgnLCcsIHBvcykgLSBwb3MpICsgMTsKICAgICB9CiAgICAgcmV0dXJuIHJl
c3VsdDsK
</data>

          </attachment>
      

    </bug>

</bugzilla>