<?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>110025</bug_id>
          
          <creation_ts>2013-02-16 13:03:05 -0800</creation_ts>
          <short_desc>Element: Avoid unrelated attribute synchronization on other attribute access.</short_desc>
          <delta_ts>2013-02-17 01:31:47 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>DOM</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>109505</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Andreas Kling">kling</reporter>
          <assigned_to name="Andreas Kling">kling</assigned_to>
          <cc>cmarcelo</cc>
    
    <cc>kling</cc>
    
    <cc>ojan.autocc</cc>
    
    <cc>ossy</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>834787</commentid>
    <comment_count>0</comment_count>
    <who name="Andreas Kling">kling</who>
    <bug_when>2013-02-16 13:03:05 -0800</bug_when>
    <thetext>Element: Avoid unrelated attribute synchronization on other attribute access.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>834788</commentid>
    <comment_count>1</comment_count>
      <attachid>188725</attachid>
    <who name="Andreas Kling">kling</who>
    <bug_when>2013-02-16 13:03:49 -0800</bug_when>
    <thetext>Created attachment 188725
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>834791</commentid>
    <comment_count>2</comment_count>
      <attachid>188725</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2013-02-16 13:21:52 -0800</bug_when>
    <thetext>Comment on attachment 188725
Patch

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

I like the basic idea here, although I’m not sure that all the changes here are improvements.

&gt; Source/WebCore/dom/Element.cpp:351
&gt; +void Element::synchronizeAttributeIfNeeded(const QualifiedName&amp; name) const

I don’t think “if needed” is needed in this name.

&gt; Source/WebCore/dom/Element.cpp:367
&gt; +void Element::synchronizeAttributeIfNeeded(const AtomicString&amp; localName) const

The whole point of this function is to do the synchronizeAttribute operation without creating a QualifiedName. I think it needs a comment to explain that.

Do we want part of this inlined for getAttribute?

&gt; Source/WebCore/dom/Element.cpp:769
&gt; +    const AtomicString&amp; caseAdjustedLocalName = shouldIgnoreAttributeCase(this) ? localName.lower() : localName;

This does a lot of unneeded work when the name is already all lowercase.

I looked at AtomicString::lower and it’s super-funny! It has a comment saying that it’s a hot function, but does not have either of the two obvious optimizations:

1) Fast case for when the string is already all lower case.
2) Avoid allocating and deleting an extra StringImpl in the common case where the lower case version of the string is already in the atomic string table.

&gt; Source/WebCore/dom/Element.cpp:1853
&gt; +    if (const Attribute* attribute = elementData()-&gt;getAttributeItem(localName, shouldIgnoreAttributeCase(this)))
&gt; +        return ensureAttr(attribute-&gt;name());
&gt; +    return 0;

I like the old style with early return for the error case better than this, even though this scopes the local variable more tightly.

&gt; Source/WebCore/dom/Element.cpp:1864
&gt; +    if (const Attribute* attribute = elementData()-&gt;getAttributeItem(qName))
&gt; +        return ensureAttr(attribute-&gt;name());
&gt; +    return 0;

Same here.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>834793</commentid>
    <comment_count>3</comment_count>
      <attachid>188725</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2013-02-16 13:22:37 -0800</bug_when>
    <thetext>Comment on attachment 188725
Patch

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

&gt;&gt; Source/WebCore/dom/Element.cpp:769
&gt;&gt; +    const AtomicString&amp; caseAdjustedLocalName = shouldIgnoreAttributeCase(this) ? localName.lower() : localName;
&gt; 
&gt; This does a lot of unneeded work when the name is already all lowercase.
&gt; 
&gt; I looked at AtomicString::lower and it’s super-funny! It has a comment saying that it’s a hot function, but does not have either of the two obvious optimizations:
&gt; 
&gt; 1) Fast case for when the string is already all lower case.
&gt; 2) Avoid allocating and deleting an extra StringImpl in the common case where the lower case version of the string is already in the atomic string table.

Oops, I am wrong, it does have optimization (1), just not optimization (2). Sorry, my mistake.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>834811</commentid>
    <comment_count>4</comment_count>
    <who name="Andreas Kling">kling</who>
    <bug_when>2013-02-16 13:42:01 -0800</bug_when>
    <thetext>(In reply to comment #2)
&gt; (From update of attachment 188725 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=188725&amp;action=review
&gt; 
&gt; I like the basic idea here, although I’m not sure that all the changes here are improvements.
&gt; 
&gt; &gt; Source/WebCore/dom/Element.cpp:351
&gt; &gt; +void Element::synchronizeAttributeIfNeeded(const QualifiedName&amp; name) const
&gt; 
&gt; I don’t think “if needed” is needed in this name.

Sure, I&apos;ll drop it.

&gt; &gt; Source/WebCore/dom/Element.cpp:367
&gt; &gt; +void Element::synchronizeAttributeIfNeeded(const AtomicString&amp; localName) const
&gt; 
&gt; The whole point of this function is to do the synchronizeAttribute operation without creating a QualifiedName. I think it needs a comment to explain that.

Will add.

&gt; Do we want part of this inlined for getAttribute?

Sounds like the right thing to do, even though fastGetAttribute() is ideally already used wherever attribute retrieval speed really matters. Regardless, I&apos;ll mark these methods inline.

&gt; I like the old style with early return for the error case better than this, even though this scopes the local variable more tightly.

Yeah okay. I was on the fence.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>834833</commentid>
    <comment_count>5</comment_count>
    <who name="Andreas Kling">kling</who>
    <bug_when>2013-02-16 14:58:54 -0800</bug_when>
    <thetext>Committed r143112: &lt;http://trac.webkit.org/changeset/143112&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>834960</commentid>
    <comment_count>6</comment_count>
    <who name="Csaba Osztrogonác">ossy</who>
    <bug_when>2013-02-17 01:31:47 -0800</bug_when>
    <thetext>(In reply to comment #5)
&gt; Committed r143112: &lt;http://trac.webkit.org/changeset/143112&gt;

... and a buildfix landed in https://trac.webkit.org/changeset/143127

( But unfortunately I can&apos;t ensure if it builds everywhere, 
because build.webkit.org is out of order now. :-/ )</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>188725</attachid>
            <date>2013-02-16 13:03:49 -0800</date>
            <delta_ts>2013-02-16 13:22:37 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-110025.diff</filename>
            <type>text/plain</type>
            <size>17171</size>
            <attacher name="Andreas Kling">kling</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZyBiL1NvdXJjZS9XZWJDb3JlL0No
YW5nZUxvZwppbmRleCA4MjM5NmRhLi40Yjg2NGNiIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29y
ZS9DaGFuZ2VMb2cKKysrIGIvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsNTcg
QEAKKzIwMTMtMDItMTYgIEFuZHJlYXMgS2xpbmcgIDxha2xpbmdAYXBwbGUuY29tPgorCisgICAg
ICAgIEVsZW1lbnQ6IEF2b2lkIHVucmVsYXRlZCBhdHRyaWJ1dGUgc3luY2hyb25pemF0aW9uIG9u
IG90aGVyIGF0dHJpYnV0ZSBhY2Nlc3MuCisgICAgICAgIDxodHRwOi8vd2Via2l0Lm9yZy9iLzEx
MDAyNT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBX
ZSd2ZSBiZWVuIGV4dHJlbWVseSB0cmlnZ2VyIGhhcHB5IHdpdGggcmUtc2VyaWFsaXppbmcgdGhl
IHN0eWxlIGF0dHJpYnV0ZSAoYW5kIFNWRyBhbmltYXRhYmxlcykKKyAgICAgICAgd2hlbmV2ZXIg
YW55IEVsZW1lbnQgYXR0cmlidXRlIEFQSSB3YXMgdXNlZC4gVGhpcyBwYXRjaCBuYXJyb3dzIHRo
aXMgZG93biB0byAoYWxtb3N0IGFsd2F5cykKKyAgICAgICAgb25seSBzeW5jaHJvbml6aW5nIGFu
IGF0dHJpYnV0ZSB3aGVuIHNvbWVvbmUgc3BlY2lmaWNhbGx5IHdhbnRzIHRvIHJlYWQvdXBkYXRl
IGl0LgorCisgICAgICAgIEFsc28gcmVtb3ZlZCB0d28gbW9yZSBjb25mdXNpbmcgRWxlbWVudERh
dGEgYWNjZXNzb3JzOgorCisgICAgICAgICAgICAtIEVsZW1lbnQ6OmVsZW1lbnREYXRhV2l0aFN5
bmNocm9uaXplZEF0dHJpYnV0ZXMoKQorICAgICAgICAgICAgLSBFbGVtZW50OjplbnN1cmVFbGVt
ZW50RGF0YVdpdGhTeW5jaHJvbml6ZWRBdHRyaWJ1dGVzKCkKKworICAgICAgICAqIGRvbS9FbGVt
ZW50Lmg6CisgICAgICAgICogZG9tL0VsZW1lbnQuY3BwOgorICAgICAgICAoV2ViQ29yZTo6RWxl
bWVudDo6aGFzQXR0cmlidXRlcyk6CisgICAgICAgIChXZWJDb3JlOjpFbGVtZW50OjpoYXNFcXVp
dmFsZW50QXR0cmlidXRlcyk6CisgICAgICAgIChXZWJDb3JlOjpFbGVtZW50OjpjbG9uZUF0dHJp
YnV0ZXNGcm9tRWxlbWVudCk6CisgICAgICAgIChXZWJDb3JlOjpFbGVtZW50OjpzeW5jaHJvbml6
ZUFsbEF0dHJpYnV0ZXMpOgorCisgICAgICAgICAgICBSZW5hbWVkIHVwZGF0ZUludmFsaWRBdHRy
aWJ1dGVzKCkgdG8gc3luY2hyb25pemVBbGxBdHRyaWJ1dGVzKCkuCisgICAgICAgICAgICBUaGlz
IGZ1bmN0aW9uIHNob3VsZCBvbmx5IGJlIHVzZWQgd2hlbiB3ZSBuZWVkIGV2ZXJ5IHNpbmdsZSBh
dHRyaWJ1dGUgdG8gYmUgdXAtdG8tZGF0ZS4KKworICAgICAgICAoV2ViQ29yZTo6RWxlbWVudDo6
c3luY2hyb25pemVBdHRyaWJ1dGVJZk5lZWRlZCk6CisKKyAgICAgICAgICAgIEJyb2tlIG91dCBs
b2dpYyBmb3Igc3luY2hyb25pemluZyBhIHNwZWNpZmljIGF0dHJpYnV0ZSwgZ2l2ZW4gZWl0aGVy
IGEgZnVsbCBRdWFsaWZpZWROYW1lCisgICAgICAgICAgICBvciBhIGxvY2FsTmFtZS4KKworICAg
ICAgICAoV2ViQ29yZTo6RWxlbWVudDo6c2V0U3luY2hyb25pemVkTGF6eUF0dHJpYnV0ZSk6CisK
KyAgICAgICAgICAgIERvbid0IGNhbGwgZW5zdXJlVW5pcXVlRWxlbWVudERhdGEoKSBpbmRpc2Np
bWluYXRlbHkgaGVyZS4gVGhpcyBhdm9pZHMgY29udmVydGluZyB0aGUgYXR0cmlidXRlCisgICAg
ICAgICAgICBzdG9yYWdlIHdoZW4gcmUtc2VyaWFsaXppbmcgdGhlIGlubGluZSBzdHlsZSB5aWVs
ZHMgdGhlIHNhbWUgQ1NTIHRleHQgdGhhdCB3YXMgYWxyZWFkeSBpbiB0aGUKKyAgICAgICAgICAg
IHN0eWxlIGF0dHJpYnV0ZS4KKworICAgICAgICAoV2ViQ29yZTo6RWxlbWVudDo6aGFzQXR0cmli
dXRlKToKKyAgICAgICAgKFdlYkNvcmU6OkVsZW1lbnQ6Omhhc0F0dHJpYnV0ZU5TKToKKyAgICAg
ICAgKFdlYkNvcmU6OkVsZW1lbnQ6OmdldEF0dHJpYnV0ZSk6CisgICAgICAgIChXZWJDb3JlOjpF
bGVtZW50OjpnZXRBdHRyaWJ1dGVOb2RlKToKKyAgICAgICAgKFdlYkNvcmU6OkVsZW1lbnQ6Omdl
dEF0dHJpYnV0ZU5vZGVOUyk6CisgICAgICAgIChXZWJDb3JlOjpFbGVtZW50OjpzZXRBdHRyaWJ1
dGUpOgorICAgICAgICAoV2ViQ29yZTo6RWxlbWVudDo6c2V0QXR0cmlidXRlTm9kZSk6CisgICAg
ICAgIChXZWJDb3JlOjpFbGVtZW50OjpyZW1vdmVBdHRyaWJ1dGVOb2RlKToKKworICAgICAgICAg
ICAgT25seSBzeW5jaHJvbml6ZSB0aGUgYXR0cmlidXRlIGluIHF1ZXN0aW9uLgorCisgICAgICAg
ICogZG9tL05vZGUuY3BwOgorICAgICAgICAoV2ViQ29yZTo6Tm9kZTo6Y29tcGFyZURvY3VtZW50
UG9zaXRpb24pOgorCisgICAgICAgICAgICBDYWxsIHN5bmNocm9uaXplQWxsQXR0cmlidXRlcygp
IHdoZW4gY29tcGFyaW5nIHR3byBBdHRyIG5vZGVzIG9uIHRoZSBzYW1lIEVsZW1lbnQgaW5zdGVh
ZAorICAgICAgICAgICAgb2YgcmVseWluZyBvbiB0aGUgc2lkZS1lZmZlY3RzIG9mIGFub3RoZXIg
ZnVuY3Rpb24gZG9pbmcgdGhpcy4KKwogMjAxMy0wMi0xNSAgQW5kcmVhcyBLbGluZyAgPGFrbGlu
Z0BhcHBsZS5jb20+CiAKICAgICAgICAgQ2FsbGluZyBET00gRWxlbWVudC5hdHRyaWJ1dGVzIHNo
b3VsZG4ndCBmb3JjZSBjcmVhdGlvbiBvZiBFbGVtZW50RGF0YS4KZGlmZiAtLWdpdCBhL1NvdXJj
ZS9XZWJDb3JlL2RvbS9FbGVtZW50LmNwcCBiL1NvdXJjZS9XZWJDb3JlL2RvbS9FbGVtZW50LmNw
cAppbmRleCA2ZWNkNTk2Li5iMDkzZjY3IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9kb20v
RWxlbWVudC5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvZG9tL0VsZW1lbnQuY3BwCkBAIC05NCw2
ICs5NCwxMSBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKIHVzaW5nIG5hbWVzcGFjZSBIVE1MTmFt
ZXM7CiB1c2luZyBuYW1lc3BhY2UgWE1MTmFtZXM7CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBzaG91
bGRJZ25vcmVBdHRyaWJ1dGVDYXNlKGNvbnN0IEVsZW1lbnQqIGUpCit7CisgICAgcmV0dXJuIGUg
JiYgZS0+ZG9jdW1lbnQoKS0+aXNIVE1MRG9jdW1lbnQoKSAmJiBlLT5pc0hUTUxFbGVtZW50KCk7
Cit9CiAgICAgCiBjbGFzcyBTdHlsZVJlc29sdmVyUGFyZW50UHVzaGVyIHsKIHB1YmxpYzoKQEAg
LTMzMSwxOCArMzM2LDU4IEBAIGJvb2wgRWxlbWVudDo6aGFzQXR0cmlidXRlKGNvbnN0IFF1YWxp
ZmllZE5hbWUmIG5hbWUpIGNvbnN0CiAgICAgcmV0dXJuIGhhc0F0dHJpYnV0ZU5TKG5hbWUubmFt
ZXNwYWNlVVJJKCksIG5hbWUubG9jYWxOYW1lKCkpOwogfQogCi1jb25zdCBBdG9taWNTdHJpbmcm
IEVsZW1lbnQ6OmdldEF0dHJpYnV0ZShjb25zdCBRdWFsaWZpZWROYW1lJiBuYW1lKSBjb25zdAor
dm9pZCBFbGVtZW50OjpzeW5jaHJvbml6ZUFsbEF0dHJpYnV0ZXMoKSBjb25zdAogewogICAgIGlm
ICghZWxlbWVudERhdGEoKSkKLSAgICAgICAgcmV0dXJuIG51bGxBdG9tOworICAgICAgICByZXR1
cm47CisgICAgaWYgKGVsZW1lbnREYXRhKCktPm1fc3R5bGVBdHRyaWJ1dGVJc0RpcnR5KQorICAg
ICAgICB1cGRhdGVTdHlsZUF0dHJpYnV0ZSgpOworI2lmIEVOQUJMRShTVkcpCisgICAgaWYgKGVs
ZW1lbnREYXRhKCktPm1fYW5pbWF0ZWRTVkdBdHRyaWJ1dGVzQXJlRGlydHkpCisgICAgICAgIHVw
ZGF0ZUFuaW1hdGVkU1ZHQXR0cmlidXRlKGFueVFOYW1lKCkpOworI2VuZGlmCit9CisKK3ZvaWQg
RWxlbWVudDo6c3luY2hyb25pemVBdHRyaWJ1dGVJZk5lZWRlZChjb25zdCBRdWFsaWZpZWROYW1l
JiBuYW1lKSBjb25zdAoreworICAgIGlmICghZWxlbWVudERhdGEoKSkKKyAgICAgICAgcmV0dXJu
OwogCi0gICAgaWYgKFVOTElLRUxZKG5hbWUgPT0gc3R5bGVBdHRyICYmIGVsZW1lbnREYXRhKCkt
Pm1fc3R5bGVBdHRyaWJ1dGVJc0RpcnR5KSkKKyAgICBpZiAoVU5MSUtFTFkobmFtZSA9PSBzdHls
ZUF0dHIgJiYgZWxlbWVudERhdGEoKS0+bV9zdHlsZUF0dHJpYnV0ZUlzRGlydHkpKSB7CiAgICAg
ICAgIHVwZGF0ZVN0eWxlQXR0cmlidXRlKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CiAKICNp
ZiBFTkFCTEUoU1ZHKQogICAgIGlmIChVTkxJS0VMWShlbGVtZW50RGF0YSgpLT5tX2FuaW1hdGVk
U1ZHQXR0cmlidXRlc0FyZURpcnR5KSkKICAgICAgICAgdXBkYXRlQW5pbWF0ZWRTVkdBdHRyaWJ1
dGUobmFtZSk7CiAjZW5kaWYKK30KKwordm9pZCBFbGVtZW50OjpzeW5jaHJvbml6ZUF0dHJpYnV0
ZUlmTmVlZGVkKGNvbnN0IEF0b21pY1N0cmluZyYgbG9jYWxOYW1lKSBjb25zdAoreworICAgIGlm
ICghZWxlbWVudERhdGEoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKGVsZW1lbnREYXRh
KCktPm1fc3R5bGVBdHRyaWJ1dGVJc0RpcnR5ICYmIGVxdWFsUG9zc2libHlJZ25vcmluZ0Nhc2Uo
bG9jYWxOYW1lLCBzdHlsZUF0dHIubG9jYWxOYW1lKCksIHNob3VsZElnbm9yZUF0dHJpYnV0ZUNh
c2UodGhpcykpKSB7CisgICAgICAgIHVwZGF0ZVN0eWxlQXR0cmlidXRlKCk7CisgICAgICAgIHJl
dHVybjsKKyAgICB9CisKKyNpZiBFTkFCTEUoU1ZHKQorICAgIGlmIChlbGVtZW50RGF0YSgpLT5t
X2FuaW1hdGVkU1ZHQXR0cmlidXRlc0FyZURpcnR5KSB7CisgICAgICAgIC8vIFdlJ3JlIG5vdCBw
YXNzaW5nIGEgbmFtZXNwYWNlIGFyZ3VtZW50IG9uIHB1cnBvc2UuIFNWR05hbWVzOjoqQXR0ciBh
cmUgZGVmaW5lZCB3L28gbmFtZXNwYWNlcyBhcyB3ZWxsLgorICAgICAgICB1cGRhdGVBbmltYXRl
ZFNWR0F0dHJpYnV0ZShRdWFsaWZpZWROYW1lKG51bGxBdG9tLCBsb2NhbE5hbWUsIG51bGxBdG9t
KSk7CisgICAgfQorI2VuZGlmCit9CisKK2NvbnN0IEF0b21pY1N0cmluZyYgRWxlbWVudDo6Z2V0
QXR0cmlidXRlKGNvbnN0IFF1YWxpZmllZE5hbWUmIG5hbWUpIGNvbnN0Cit7CisgICAgaWYgKCFl
bGVtZW50RGF0YSgpKQorICAgICAgICByZXR1cm4gbnVsbEF0b207CisKKyAgICBzeW5jaHJvbml6
ZUF0dHJpYnV0ZUlmTmVlZGVkKG5hbWUpOwogCiAgICAgaWYgKGNvbnN0IEF0dHJpYnV0ZSogYXR0
cmlidXRlID0gZ2V0QXR0cmlidXRlSXRlbShuYW1lKSkKICAgICAgICAgcmV0dXJuIGF0dHJpYnV0
ZS0+dmFsdWUoKTsKQEAgLTY5OCwzMCArNzQzLDEyIEBAIEludFJlY3QgRWxlbWVudDo6c2NyZWVu
UmVjdCgpIGNvbnN0CiAgICAgcmV0dXJuIGRvY3VtZW50KCktPnZpZXcoKS0+Y29udGVudHNUb1Nj
cmVlbihyZW5kZXJlcigpLT5hYnNvbHV0ZUJvdW5kaW5nQm94UmVjdElnbm9yaW5nVHJhbnNmb3Jt
cygpKTsKIH0KIAotc3RhdGljIGlubGluZSBib29sIHNob3VsZElnbm9yZUF0dHJpYnV0ZUNhc2Uo
Y29uc3QgRWxlbWVudCogZSkKLXsKLSAgICByZXR1cm4gZSAmJiBlLT5kb2N1bWVudCgpLT5pc0hU
TUxEb2N1bWVudCgpICYmIGUtPmlzSFRNTEVsZW1lbnQoKTsKLX0KLQotY29uc3QgQXRvbWljU3Ry
aW5nJiBFbGVtZW50OjpnZXRBdHRyaWJ1dGUoY29uc3QgQXRvbWljU3RyaW5nJiBuYW1lKSBjb25z
dAorY29uc3QgQXRvbWljU3RyaW5nJiBFbGVtZW50OjpnZXRBdHRyaWJ1dGUoY29uc3QgQXRvbWlj
U3RyaW5nJiBsb2NhbE5hbWUpIGNvbnN0CiB7CiAgICAgaWYgKCFlbGVtZW50RGF0YSgpKQogICAg
ICAgICByZXR1cm4gbnVsbEF0b207Ci0KLSAgICBib29sIGlnbm9yZUNhc2UgPSBzaG91bGRJZ25v
cmVBdHRyaWJ1dGVDYXNlKHRoaXMpOwotCi0gICAgLy8gVXBkYXRlIHRoZSAnc3R5bGUnIGF0dHJp
YnV0ZSBpZiBpdCdzIGludmFsaWQgYW5kIGJlaW5nIHJlcXVlc3RlZDoKLSAgICBpZiAoZWxlbWVu
dERhdGEoKS0+bV9zdHlsZUF0dHJpYnV0ZUlzRGlydHkgJiYgZXF1YWxQb3NzaWJseUlnbm9yaW5n
Q2FzZShuYW1lLCBzdHlsZUF0dHIubG9jYWxOYW1lKCksIGlnbm9yZUNhc2UpKQotICAgICAgICB1
cGRhdGVTdHlsZUF0dHJpYnV0ZSgpOwotCi0jaWYgRU5BQkxFKFNWRykKLSAgICBpZiAoZWxlbWVu
dERhdGEoKS0+bV9hbmltYXRlZFNWR0F0dHJpYnV0ZXNBcmVEaXJ0eSkgewotICAgICAgICAvLyBX
ZSdyZSBub3QgcGFzc2luZyBhIG5hbWVzcGFjZSBhcmd1bWVudCBvbiBwdXJwb3NlLiBTVkdOYW1l
czo6KkF0dHIgYXJlIGRlZmluZWQgdy9vIG5hbWVzcGFjZXMgYXMgd2VsbC4KLSAgICAgICAgdXBk
YXRlQW5pbWF0ZWRTVkdBdHRyaWJ1dGUoUXVhbGlmaWVkTmFtZShudWxsQXRvbSwgbmFtZSwgbnVs
bEF0b20pKTsKLSAgICB9Ci0jZW5kaWYKLQotICAgIGlmIChjb25zdCBBdHRyaWJ1dGUqIGF0dHJp
YnV0ZSA9IGVsZW1lbnREYXRhKCktPmdldEF0dHJpYnV0ZUl0ZW0obmFtZSwgaWdub3JlQ2FzZSkp
CisgICAgc3luY2hyb25pemVBdHRyaWJ1dGVJZk5lZWRlZChsb2NhbE5hbWUpOworICAgIGlmIChj
b25zdCBBdHRyaWJ1dGUqIGF0dHJpYnV0ZSA9IGVsZW1lbnREYXRhKCktPmdldEF0dHJpYnV0ZUl0
ZW0obG9jYWxOYW1lLCBzaG91bGRJZ25vcmVBdHRyaWJ1dGVDYXNlKHRoaXMpKSkKICAgICAgICAg
cmV0dXJuIGF0dHJpYnV0ZS0+dmFsdWUoKTsKICAgICByZXR1cm4gbnVsbEF0b207CiB9CkBAIC03
MzEsMjggKzc1OCwzMiBAQCBjb25zdCBBdG9taWNTdHJpbmcmIEVsZW1lbnQ6OmdldEF0dHJpYnV0
ZU5TKGNvbnN0IEF0b21pY1N0cmluZyYgbmFtZXNwYWNlVVJJLCBjbwogICAgIHJldHVybiBnZXRB
dHRyaWJ1dGUoUXVhbGlmaWVkTmFtZShudWxsQXRvbSwgbG9jYWxOYW1lLCBuYW1lc3BhY2VVUkkp
KTsKIH0KIAotdm9pZCBFbGVtZW50OjpzZXRBdHRyaWJ1dGUoY29uc3QgQXRvbWljU3RyaW5nJiBu
YW1lLCBjb25zdCBBdG9taWNTdHJpbmcmIHZhbHVlLCBFeGNlcHRpb25Db2RlJiBlYykKK3ZvaWQg
RWxlbWVudDo6c2V0QXR0cmlidXRlKGNvbnN0IEF0b21pY1N0cmluZyYgbG9jYWxOYW1lLCBjb25z
dCBBdG9taWNTdHJpbmcmIHZhbHVlLCBFeGNlcHRpb25Db2RlJiBlYykKIHsKLSAgICBpZiAoIURv
Y3VtZW50Ojppc1ZhbGlkTmFtZShuYW1lKSkgeworICAgIGlmICghRG9jdW1lbnQ6OmlzVmFsaWRO
YW1lKGxvY2FsTmFtZSkpIHsKICAgICAgICAgZWMgPSBJTlZBTElEX0NIQVJBQ1RFUl9FUlI7CiAg
ICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBjb25zdCBBdG9taWNTdHJpbmcmIGxvY2FsTmFt
ZSA9IHNob3VsZElnbm9yZUF0dHJpYnV0ZUNhc2UodGhpcykgPyBuYW1lLmxvd2VyKCkgOiBuYW1l
OworICAgIHN5bmNocm9uaXplQXR0cmlidXRlSWZOZWVkZWQobG9jYWxOYW1lKTsKKyAgICBjb25z
dCBBdG9taWNTdHJpbmcmIGNhc2VBZGp1c3RlZExvY2FsTmFtZSA9IHNob3VsZElnbm9yZUF0dHJp
YnV0ZUNhc2UodGhpcykgPyBsb2NhbE5hbWUubG93ZXIoKSA6IGxvY2FsTmFtZTsKIAotICAgIHNp
emVfdCBpbmRleCA9IGVuc3VyZUVsZW1lbnREYXRhV2l0aFN5bmNocm9uaXplZEF0dHJpYnV0ZXMo
KS0+Z2V0QXR0cmlidXRlSXRlbUluZGV4KGxvY2FsTmFtZSwgZmFsc2UpOwotICAgIGNvbnN0IFF1
YWxpZmllZE5hbWUmIHFOYW1lID0gaW5kZXggIT0gbm90Rm91bmQgPyBhdHRyaWJ1dGVJdGVtKGlu
ZGV4KS0+bmFtZSgpIDogUXVhbGlmaWVkTmFtZShudWxsQXRvbSwgbG9jYWxOYW1lLCBudWxsQXRv
bSk7CisgICAgc2l6ZV90IGluZGV4ID0gZWxlbWVudERhdGEoKSA/IGVsZW1lbnREYXRhKCktPmdl
dEF0dHJpYnV0ZUl0ZW1JbmRleChjYXNlQWRqdXN0ZWRMb2NhbE5hbWUsIGZhbHNlKSA6IG5vdEZv
dW5kOworICAgIGNvbnN0IFF1YWxpZmllZE5hbWUmIHFOYW1lID0gaW5kZXggIT0gbm90Rm91bmQg
PyBhdHRyaWJ1dGVJdGVtKGluZGV4KS0+bmFtZSgpIDogUXVhbGlmaWVkTmFtZShudWxsQXRvbSwg
Y2FzZUFkanVzdGVkTG9jYWxOYW1lLCBudWxsQXRvbSk7CiAgICAgc2V0QXR0cmlidXRlSW50ZXJu
YWwoaW5kZXgsIHFOYW1lLCB2YWx1ZSwgTm90SW5TeW5jaHJvbml6YXRpb25PZkxhenlBdHRyaWJ1
dGUpOwogfQogCiB2b2lkIEVsZW1lbnQ6OnNldEF0dHJpYnV0ZShjb25zdCBRdWFsaWZpZWROYW1l
JiBuYW1lLCBjb25zdCBBdG9taWNTdHJpbmcmIHZhbHVlKQogewotICAgIHNldEF0dHJpYnV0ZUlu
dGVybmFsKGVuc3VyZUVsZW1lbnREYXRhV2l0aFN5bmNocm9uaXplZEF0dHJpYnV0ZXMoKS0+Z2V0
QXR0cmlidXRlSXRlbUluZGV4KG5hbWUpLCBuYW1lLCB2YWx1ZSwgTm90SW5TeW5jaHJvbml6YXRp
b25PZkxhenlBdHRyaWJ1dGUpOworICAgIHN5bmNocm9uaXplQXR0cmlidXRlSWZOZWVkZWQobmFt
ZSk7CisgICAgc2l6ZV90IGluZGV4ID0gZWxlbWVudERhdGEoKSA/IGVsZW1lbnREYXRhKCktPmdl
dEF0dHJpYnV0ZUl0ZW1JbmRleChuYW1lKSA6IG5vdEZvdW5kOworICAgIHNldEF0dHJpYnV0ZUlu
dGVybmFsKGluZGV4LCBuYW1lLCB2YWx1ZSwgTm90SW5TeW5jaHJvbml6YXRpb25PZkxhenlBdHRy
aWJ1dGUpOwogfQogCiB2b2lkIEVsZW1lbnQ6OnNldFN5bmNocm9uaXplZExhenlBdHRyaWJ1dGUo
Y29uc3QgUXVhbGlmaWVkTmFtZSYgbmFtZSwgY29uc3QgQXRvbWljU3RyaW5nJiB2YWx1ZSkKIHsK
LSAgICBzZXRBdHRyaWJ1dGVJbnRlcm5hbChlbnN1cmVVbmlxdWVFbGVtZW50RGF0YSgpLT5nZXRB
dHRyaWJ1dGVJdGVtSW5kZXgobmFtZSksIG5hbWUsIHZhbHVlLCBJblN5bmNocm9uaXphdGlvbk9m
TGF6eUF0dHJpYnV0ZSk7CisgICAgc2l6ZV90IGluZGV4ID0gZWxlbWVudERhdGEoKSA/IGVsZW1l
bnREYXRhKCktPmdldEF0dHJpYnV0ZUl0ZW1JbmRleChuYW1lKSA6IG5vdEZvdW5kOworICAgIHNl
dEF0dHJpYnV0ZUludGVybmFsKGluZGV4LCBuYW1lLCB2YWx1ZSwgSW5TeW5jaHJvbml6YXRpb25P
ZkxhenlBdHRyaWJ1dGUpOwogfQogCiBpbmxpbmUgdm9pZCBFbGVtZW50OjpzZXRBdHRyaWJ1dGVJ
bnRlcm5hbChzaXplX3QgaW5kZXgsIGNvbnN0IFF1YWxpZmllZE5hbWUmIG5hbWUsIGNvbnN0IEF0
b21pY1N0cmluZyYgbmV3VmFsdWUsIFN5bmNocm9uaXphdGlvbk9mTGF6eUF0dHJpYnV0ZSBpblN5
bmNocm9uaXphdGlvbk9mTGF6eUF0dHJpYnV0ZSkKQEAgLTEwMzIsMjAgKzEwNjMsMjAgQEAgdm9p
ZCBFbGVtZW50OjpwYXJzZXJTZXRBdHRyaWJ1dGVzKGNvbnN0IFZlY3RvcjxBdHRyaWJ1dGU+JiBh
dHRyaWJ1dGVWZWN0b3IsIEZyYWcKIAogYm9vbCBFbGVtZW50OjpoYXNBdHRyaWJ1dGVzKCkgY29u
c3QKIHsKLSAgICB1cGRhdGVJbnZhbGlkQXR0cmlidXRlcygpOworICAgIHN5bmNocm9uaXplQWxs
QXR0cmlidXRlcygpOwogICAgIHJldHVybiBlbGVtZW50RGF0YSgpICYmIGVsZW1lbnREYXRhKCkt
Pmxlbmd0aCgpOwogfQogCiBib29sIEVsZW1lbnQ6Omhhc0VxdWl2YWxlbnRBdHRyaWJ1dGVzKGNv
bnN0IEVsZW1lbnQqIG90aGVyKSBjb25zdAogewotICAgIGNvbnN0IEVsZW1lbnREYXRhKiBlbGVt
ZW50RGF0YSA9IGVsZW1lbnREYXRhV2l0aFN5bmNocm9uaXplZEF0dHJpYnV0ZXMoKTsKLSAgICBj
b25zdCBFbGVtZW50RGF0YSogb3RoZXJFbGVtZW50RGF0YSA9IG90aGVyLT5lbGVtZW50RGF0YVdp
dGhTeW5jaHJvbml6ZWRBdHRyaWJ1dGVzKCk7Ci0gICAgaWYgKGVsZW1lbnREYXRhID09IG90aGVy
RWxlbWVudERhdGEpCisgICAgc3luY2hyb25pemVBbGxBdHRyaWJ1dGVzKCk7CisgICAgb3RoZXIt
PnN5bmNocm9uaXplQWxsQXR0cmlidXRlcygpOworICAgIGlmIChlbGVtZW50RGF0YSgpID09IG90
aGVyLT5lbGVtZW50RGF0YSgpKQogICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoZWxlbWVu
dERhdGEpCi0gICAgICAgIHJldHVybiBlbGVtZW50RGF0YS0+aXNFcXVpdmFsZW50KG90aGVyRWxl
bWVudERhdGEpOwotICAgIGlmIChvdGhlckVsZW1lbnREYXRhKQotICAgICAgICByZXR1cm4gb3Ro
ZXJFbGVtZW50RGF0YS0+aXNFcXVpdmFsZW50KGVsZW1lbnREYXRhKTsKKyAgICBpZiAoZWxlbWVu
dERhdGEoKSkKKyAgICAgICAgcmV0dXJuIGVsZW1lbnREYXRhKCktPmlzRXF1aXZhbGVudChvdGhl
ci0+ZWxlbWVudERhdGEoKSk7CisgICAgaWYgKG90aGVyLT5lbGVtZW50RGF0YSgpKQorICAgICAg
ICByZXR1cm4gb3RoZXItPmVsZW1lbnREYXRhKCktPmlzRXF1aXZhbGVudChlbGVtZW50RGF0YSgp
KTsKICAgICByZXR1cm4gdHJ1ZTsKIH0KIApAQCAtMTY4NSw3ICsxNzE2LDcgQEAgUGFzc1JlZlB0
cjxBdHRyPiBFbGVtZW50OjpzZXRBdHRyaWJ1dGVOb2RlKEF0dHIqIGF0dHJOb2RlLCBFeGNlcHRp
b25Db2RlJiBlYykKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogCi0gICAgdXBkYXRlSW52YWxp
ZEF0dHJpYnV0ZXMoKTsKKyAgICBzeW5jaHJvbml6ZUFsbEF0dHJpYnV0ZXMoKTsKICAgICBVbmlx
dWVFbGVtZW50RGF0YSogZWxlbWVudERhdGEgPSBlbnN1cmVVbmlxdWVFbGVtZW50RGF0YSgpOwog
CiAgICAgc2l6ZV90IGluZGV4ID0gZWxlbWVudERhdGEtPmdldEF0dHJpYnV0ZUl0ZW1JbmRleChh
dHRyTm9kZS0+cXVhbGlmaWVkTmFtZSgpKTsKQEAgLTE3MjIsMTAgKzE3NTMsOSBAQCBQYXNzUmVm
UHRyPEF0dHI+IEVsZW1lbnQ6OnJlbW92ZUF0dHJpYnV0ZU5vZGUoQXR0ciogYXR0ciwgRXhjZXB0
aW9uQ29kZSYgZWMpCiAKICAgICBBU1NFUlQoZG9jdW1lbnQoKSA9PSBhdHRyLT5kb2N1bWVudCgp
KTsKIAotICAgIGNvbnN0IEVsZW1lbnREYXRhKiBlbGVtZW50RGF0YSA9IGVsZW1lbnREYXRhV2l0
aFN5bmNocm9uaXplZEF0dHJpYnV0ZXMoKTsKLSAgICBBU1NFUlQoZWxlbWVudERhdGEpOworICAg
IHN5bmNocm9uaXplQXR0cmlidXRlSWZOZWVkZWQoYXR0ci0+cXVhbGlmaWVkTmFtZSgpKTsKIAot
ICAgIHNpemVfdCBpbmRleCA9IGVsZW1lbnREYXRhLT5nZXRBdHRyaWJ1dGVJdGVtSW5kZXgoYXR0
ci0+cXVhbGlmaWVkTmFtZSgpKTsKKyAgICBzaXplX3QgaW5kZXggPSBlbGVtZW50RGF0YSgpLT5n
ZXRBdHRyaWJ1dGVJdGVtSW5kZXgoYXR0ci0+cXVhbGlmaWVkTmFtZSgpKTsKICAgICBpZiAoaW5k
ZXggPT0gbm90Rm91bmQpIHsKICAgICAgICAgZWMgPSBOT1RfRk9VTkRfRVJSOwogICAgICAgICBy
ZXR1cm4gMDsKQEAgLTE4MTMsNDUgKzE4NDMsNDIgQEAgdm9pZCBFbGVtZW50OjpyZW1vdmVBdHRy
aWJ1dGVOUyhjb25zdCBBdG9taWNTdHJpbmcmIG5hbWVzcGFjZVVSSSwgY29uc3QgQXRvbWljU3QK
ICAgICByZW1vdmVBdHRyaWJ1dGUoUXVhbGlmaWVkTmFtZShudWxsQXRvbSwgbG9jYWxOYW1lLCBu
YW1lc3BhY2VVUkkpKTsKIH0KIAotUGFzc1JlZlB0cjxBdHRyPiBFbGVtZW50OjpnZXRBdHRyaWJ1
dGVOb2RlKGNvbnN0IEF0b21pY1N0cmluZyYgbmFtZSkKK1Bhc3NSZWZQdHI8QXR0cj4gRWxlbWVu
dDo6Z2V0QXR0cmlidXRlTm9kZShjb25zdCBBdG9taWNTdHJpbmcmIGxvY2FsTmFtZSkKIHsKLSAg
ICBjb25zdCBFbGVtZW50RGF0YSogZWxlbWVudERhdGEgPSBlbGVtZW50RGF0YVdpdGhTeW5jaHJv
bml6ZWRBdHRyaWJ1dGVzKCk7Ci0gICAgaWYgKCFlbGVtZW50RGF0YSkKLSAgICAgICAgcmV0dXJu
IDA7Ci0gICAgY29uc3QgQXR0cmlidXRlKiBhdHRyaWJ1dGUgPSBlbGVtZW50RGF0YS0+Z2V0QXR0
cmlidXRlSXRlbShuYW1lLCBzaG91bGRJZ25vcmVBdHRyaWJ1dGVDYXNlKHRoaXMpKTsKLSAgICBp
ZiAoIWF0dHJpYnV0ZSkKKyAgICBpZiAoIWVsZW1lbnREYXRhKCkpCiAgICAgICAgIHJldHVybiAw
OwotICAgIHJldHVybiBlbnN1cmVBdHRyKGF0dHJpYnV0ZS0+bmFtZSgpKTsKKyAgICBzeW5jaHJv
bml6ZUF0dHJpYnV0ZUlmTmVlZGVkKGxvY2FsTmFtZSk7CisgICAgaWYgKGNvbnN0IEF0dHJpYnV0
ZSogYXR0cmlidXRlID0gZWxlbWVudERhdGEoKS0+Z2V0QXR0cmlidXRlSXRlbShsb2NhbE5hbWUs
IHNob3VsZElnbm9yZUF0dHJpYnV0ZUNhc2UodGhpcykpKQorICAgICAgICByZXR1cm4gZW5zdXJl
QXR0cihhdHRyaWJ1dGUtPm5hbWUoKSk7CisgICAgcmV0dXJuIDA7CiB9CiAKIFBhc3NSZWZQdHI8
QXR0cj4gRWxlbWVudDo6Z2V0QXR0cmlidXRlTm9kZU5TKGNvbnN0IEF0b21pY1N0cmluZyYgbmFt
ZXNwYWNlVVJJLCBjb25zdCBBdG9taWNTdHJpbmcmIGxvY2FsTmFtZSkKIHsKLSAgICBjb25zdCBF
bGVtZW50RGF0YSogZWxlbWVudERhdGEgPSBlbGVtZW50RGF0YVdpdGhTeW5jaHJvbml6ZWRBdHRy
aWJ1dGVzKCk7Ci0gICAgaWYgKCFlbGVtZW50RGF0YSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAg
Y29uc3QgQXR0cmlidXRlKiBhdHRyaWJ1dGUgPSBlbGVtZW50RGF0YS0+Z2V0QXR0cmlidXRlSXRl
bShRdWFsaWZpZWROYW1lKG51bGxBdG9tLCBsb2NhbE5hbWUsIG5hbWVzcGFjZVVSSSkpOwotICAg
IGlmICghYXR0cmlidXRlKQorICAgIGlmICghZWxlbWVudERhdGEoKSkKICAgICAgICAgcmV0dXJu
IDA7Ci0gICAgcmV0dXJuIGVuc3VyZUF0dHIoYXR0cmlidXRlLT5uYW1lKCkpOworICAgIFF1YWxp
ZmllZE5hbWUgcU5hbWUobnVsbEF0b20sIGxvY2FsTmFtZSwgbmFtZXNwYWNlVVJJKTsKKyAgICBz
eW5jaHJvbml6ZUF0dHJpYnV0ZUlmTmVlZGVkKHFOYW1lKTsKKyAgICBpZiAoY29uc3QgQXR0cmli
dXRlKiBhdHRyaWJ1dGUgPSBlbGVtZW50RGF0YSgpLT5nZXRBdHRyaWJ1dGVJdGVtKHFOYW1lKSkK
KyAgICAgICAgcmV0dXJuIGVuc3VyZUF0dHIoYXR0cmlidXRlLT5uYW1lKCkpOworICAgIHJldHVy
biAwOwogfQogCi1ib29sIEVsZW1lbnQ6Omhhc0F0dHJpYnV0ZShjb25zdCBBdG9taWNTdHJpbmcm
IG5hbWUpIGNvbnN0Citib29sIEVsZW1lbnQ6Omhhc0F0dHJpYnV0ZShjb25zdCBBdG9taWNTdHJp
bmcmIGxvY2FsTmFtZSkgY29uc3QKIHsKICAgICBpZiAoIWVsZW1lbnREYXRhKCkpCiAgICAgICAg
IHJldHVybiBmYWxzZTsKLQotICAgIC8vIFRoaXMgY2FsbCB0byBTdHJpbmc6Omxvd2VyKCkgc2Vl
bXMgdG8gYmUgcmVxdWlyZWQgYnV0Ci0gICAgLy8gdGhlcmUgbWF5IGJlIGEgd2F5IHRvIHJlbW92
ZSBpdC4KLSAgICBBdG9taWNTdHJpbmcgbG9jYWxOYW1lID0gc2hvdWxkSWdub3JlQXR0cmlidXRl
Q2FzZSh0aGlzKSA/IG5hbWUubG93ZXIoKSA6IG5hbWU7Ci0gICAgcmV0dXJuIGVsZW1lbnREYXRh
V2l0aFN5bmNocm9uaXplZEF0dHJpYnV0ZXMoKS0+Z2V0QXR0cmlidXRlSXRlbShsb2NhbE5hbWUs
IGZhbHNlKTsKKyAgICBzeW5jaHJvbml6ZUF0dHJpYnV0ZUlmTmVlZGVkKGxvY2FsTmFtZSk7Cisg
ICAgcmV0dXJuIGVsZW1lbnREYXRhKCktPmdldEF0dHJpYnV0ZUl0ZW0oc2hvdWxkSWdub3JlQXR0
cmlidXRlQ2FzZSh0aGlzKSA/IGxvY2FsTmFtZS5sb3dlcigpIDogbG9jYWxOYW1lLCBmYWxzZSk7
CiB9CiAKIGJvb2wgRWxlbWVudDo6aGFzQXR0cmlidXRlTlMoY29uc3QgQXRvbWljU3RyaW5nJiBu
YW1lc3BhY2VVUkksIGNvbnN0IEF0b21pY1N0cmluZyYgbG9jYWxOYW1lKSBjb25zdAogewotICAg
IGNvbnN0IEVsZW1lbnREYXRhKiBlbGVtZW50RGF0YSA9IGVsZW1lbnREYXRhV2l0aFN5bmNocm9u
aXplZEF0dHJpYnV0ZXMoKTsKLSAgICBpZiAoIWVsZW1lbnREYXRhKQorICAgIGlmICghZWxlbWVu
dERhdGEoKSkKICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIHJldHVybiBlbGVtZW50RGF0YS0+
Z2V0QXR0cmlidXRlSXRlbShRdWFsaWZpZWROYW1lKG51bGxBdG9tLCBsb2NhbE5hbWUsIG5hbWVz
cGFjZVVSSSkpOworICAgIFF1YWxpZmllZE5hbWUgcU5hbWUobnVsbEF0b20sIGxvY2FsTmFtZSwg
bmFtZXNwYWNlVVJJKTsKKyAgICBzeW5jaHJvbml6ZUF0dHJpYnV0ZUlmTmVlZGVkKHFOYW1lKTsK
KyAgICByZXR1cm4gZWxlbWVudERhdGEoKS0+Z2V0QXR0cmlidXRlSXRlbShxTmFtZSk7CiB9CiAK
IENTU1N0eWxlRGVjbGFyYXRpb24gKkVsZW1lbnQ6OnN0eWxlKCkKQEAgLTI3NDMsNyArMjc3MCw3
IEBAIHZvaWQgRWxlbWVudDo6Y2xvbmVBdHRyaWJ1dGVzRnJvbUVsZW1lbnQoY29uc3QgRWxlbWVu
dCYgb3RoZXIpCiAgICAgaWYgKGhhc1N5bnRoZXRpY0F0dHJDaGlsZE5vZGVzKCkpCiAgICAgICAg
IGRldGFjaEFsbEF0dHJOb2Rlc0Zyb21FbGVtZW50KCk7CiAKLSAgICBvdGhlci51cGRhdGVJbnZh
bGlkQXR0cmlidXRlcygpOworICAgIG90aGVyLnN5bmNocm9uaXplQWxsQXR0cmlidXRlcygpOwog
ICAgIGlmICghb3RoZXIubV9lbGVtZW50RGF0YSkgewogICAgICAgICBtX2VsZW1lbnREYXRhLmNs
ZWFyKCk7CiAgICAgICAgIHJldHVybjsKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2RvbS9F
bGVtZW50LmggYi9Tb3VyY2UvV2ViQ29yZS9kb20vRWxlbWVudC5oCmluZGV4IGRmMDEyNWMuLmQz
YWM0ODMgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL2RvbS9FbGVtZW50LmgKKysrIGIvU291
cmNlL1dlYkNvcmUvZG9tL0VsZW1lbnQuaApAQCAtMzc2LDEwICszNzYsMTAgQEAgcHVibGljOgog
ICAgIHZvaWQgcGFyc2VyU2V0QXR0cmlidXRlcyhjb25zdCBWZWN0b3I8QXR0cmlidXRlPiYsIEZy
YWdtZW50U2NyaXB0aW5nUGVybWlzc2lvbik7CiAKICAgICBjb25zdCBFbGVtZW50RGF0YSogZWxl
bWVudERhdGEoKSBjb25zdCB7IHJldHVybiBtX2VsZW1lbnREYXRhLmdldCgpOyB9Ci0gICAgY29u
c3QgRWxlbWVudERhdGEqIGVsZW1lbnREYXRhV2l0aFN5bmNocm9uaXplZEF0dHJpYnV0ZXMoKSBj
b25zdDsKLSAgICBjb25zdCBFbGVtZW50RGF0YSogZW5zdXJlRWxlbWVudERhdGFXaXRoU3luY2hy
b25pemVkQXR0cmlidXRlcygpIGNvbnN0OwogICAgIFVuaXF1ZUVsZW1lbnREYXRhKiBlbnN1cmVV
bmlxdWVFbGVtZW50RGF0YSgpOwogCisgICAgdm9pZCBzeW5jaHJvbml6ZUFsbEF0dHJpYnV0ZXMo
KSBjb25zdDsKKwogICAgIC8vIENsb25lcyBhdHRyaWJ1dGVzIG9ubHkuCiAgICAgdm9pZCBjbG9u
ZUF0dHJpYnV0ZXNGcm9tRWxlbWVudChjb25zdCBFbGVtZW50Jik7CiAKQEAgLTY1NCw3ICs2NTQs
OCBAQCBwcml2YXRlOgogICAgIHZvaWQgZGlkTW9kaWZ5QXR0cmlidXRlKGNvbnN0IFF1YWxpZmll
ZE5hbWUmLCBjb25zdCBBdG9taWNTdHJpbmcmKTsKICAgICB2b2lkIGRpZFJlbW92ZUF0dHJpYnV0
ZShjb25zdCBRdWFsaWZpZWROYW1lJik7CiAKLSAgICB2b2lkIHVwZGF0ZUludmFsaWRBdHRyaWJ1
dGVzKCkgY29uc3Q7CisgICAgdm9pZCBzeW5jaHJvbml6ZUF0dHJpYnV0ZUlmTmVlZGVkKGNvbnN0
IFF1YWxpZmllZE5hbWUmKSBjb25zdDsKKyAgICB2b2lkIHN5bmNocm9uaXplQXR0cmlidXRlSWZO
ZWVkZWQoY29uc3QgQXRvbWljU3RyaW5nJiBsb2NhbE5hbWUpIGNvbnN0OwogCiAgICAgdm9pZCBz
Y3JvbGxCeVVuaXRzKGludCB1bml0cywgU2Nyb2xsR3JhbnVsYXJpdHkpOwogCkBAIC03ODEsMjAg
Kzc4Miw2IEBAIGlubGluZSBFbGVtZW50KiBFbGVtZW50OjpuZXh0RWxlbWVudFNpYmxpbmcoKSBj
b25zdAogICAgIHJldHVybiBzdGF0aWNfY2FzdDxFbGVtZW50Kj4obik7CiB9CiAKLWlubGluZSBj
b25zdCBFbGVtZW50RGF0YSogRWxlbWVudDo6ZWxlbWVudERhdGFXaXRoU3luY2hyb25pemVkQXR0
cmlidXRlcygpIGNvbnN0Ci17Ci0gICAgdXBkYXRlSW52YWxpZEF0dHJpYnV0ZXMoKTsKLSAgICBy
ZXR1cm4gZWxlbWVudERhdGEoKTsKLX0KLQotaW5saW5lIGNvbnN0IEVsZW1lbnREYXRhKiBFbGVt
ZW50OjplbnN1cmVFbGVtZW50RGF0YVdpdGhTeW5jaHJvbml6ZWRBdHRyaWJ1dGVzKCkgY29uc3QK
LXsKLSAgICB1cGRhdGVJbnZhbGlkQXR0cmlidXRlcygpOwotICAgIGlmIChlbGVtZW50RGF0YSgp
KQotICAgICAgICByZXR1cm4gZWxlbWVudERhdGEoKTsKLSAgICByZXR1cm4gY29uc3RfY2FzdDxF
bGVtZW50Kj4odGhpcyktPmVuc3VyZVVuaXF1ZUVsZW1lbnREYXRhKCk7Ci19Ci0KIGlubGluZSB2
b2lkIEVsZW1lbnQ6OnVwZGF0ZU5hbWUoY29uc3QgQXRvbWljU3RyaW5nJiBvbGROYW1lLCBjb25z
dCBBdG9taWNTdHJpbmcmIG5ld05hbWUpCiB7CiAgICAgaWYgKCFpbkRvY3VtZW50KCkgfHwgaXNJ
blNoYWRvd1RyZWUoKSkKQEAgLTkwOCwyMCArODk1LDYgQEAgaW5saW5lIGNvbnN0IEF0dHJpYnV0
ZSogRWxlbWVudDo6Z2V0QXR0cmlidXRlSXRlbShjb25zdCBRdWFsaWZpZWROYW1lJiBuYW1lKSBj
b24KICAgICByZXR1cm4gZWxlbWVudERhdGEoKS0+Z2V0QXR0cmlidXRlSXRlbShuYW1lKTsKIH0K
IAotaW5saW5lIHZvaWQgRWxlbWVudDo6dXBkYXRlSW52YWxpZEF0dHJpYnV0ZXMoKSBjb25zdAot
ewotICAgIGlmICghZWxlbWVudERhdGEoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgaWYgKGVs
ZW1lbnREYXRhKCktPm1fc3R5bGVBdHRyaWJ1dGVJc0RpcnR5KQotICAgICAgICB1cGRhdGVTdHls
ZUF0dHJpYnV0ZSgpOwotCi0jaWYgRU5BQkxFKFNWRykKLSAgICBpZiAoZWxlbWVudERhdGEoKS0+
bV9hbmltYXRlZFNWR0F0dHJpYnV0ZXNBcmVEaXJ0eSkKLSAgICAgICAgdXBkYXRlQW5pbWF0ZWRT
VkdBdHRyaWJ1dGUoYW55UU5hbWUoKSk7Ci0jZW5kaWYKLX0KLQogaW5saW5lIGJvb2wgRWxlbWVu
dDo6aGFzSUQoKSBjb25zdAogewogICAgIHJldHVybiBlbGVtZW50RGF0YSgpICYmIGVsZW1lbnRE
YXRhKCktPmhhc0lEKCk7CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9kb20vTm9kZS5jcHAg
Yi9Tb3VyY2UvV2ViQ29yZS9kb20vTm9kZS5jcHAKaW5kZXggM2ZkNjQzYi4uZTg4Y2RlNyAxMDA2
NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvZG9tL05vZGUuY3BwCisrKyBiL1NvdXJjZS9XZWJDb3Jl
L2RvbS9Ob2RlLmNwcApAQCAtMTc1Myw3ICsxNzUzLDcgQEAgdW5zaWduZWQgc2hvcnQgTm9kZTo6
Y29tcGFyZURvY3VtZW50UG9zaXRpb24oTm9kZSogb3RoZXJOb2RlKQogICAgIGlmIChhdHRyMSAm
JiBhdHRyMiAmJiBzdGFydDEgPT0gc3RhcnQyICYmIHN0YXJ0MSkgewogICAgICAgICAvLyBXZSBh
cmUgY29tcGFyaW5nIHR3byBhdHRyaWJ1dGVzIG9uIHRoZSBzYW1lIG5vZGUuIENyYXdsIG91ciBh
dHRyaWJ1dGUgbWFwIGFuZCBzZWUgd2hpY2ggb25lIHdlIGhpdCBmaXJzdC4KICAgICAgICAgRWxl
bWVudCogb3duZXIxID0gYXR0cjEtPm93bmVyRWxlbWVudCgpOwotICAgICAgICBvd25lcjEtPmVs
ZW1lbnREYXRhV2l0aFN5bmNocm9uaXplZEF0dHJpYnV0ZXMoKTsgLy8gRm9yY2UgdXBkYXRlIGlu
dmFsaWQgYXR0cmlidXRlcy4KKyAgICAgICAgb3duZXIxLT5zeW5jaHJvbml6ZUFsbEF0dHJpYnV0
ZXMoKTsKICAgICAgICAgdW5zaWduZWQgbGVuZ3RoID0gb3duZXIxLT5hdHRyaWJ1dGVDb3VudCgp
OwogICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKICAgICAg
ICAgICAgIC8vIElmIG5laXRoZXIgb2YgdGhlIHR3byBkZXRlcm1pbmluZyBub2RlcyBpcyBhIGNo
aWxkIG5vZGUgYW5kIG5vZGVUeXBlIGlzIHRoZSBzYW1lIGZvciBib3RoIGRldGVybWluaW5nIG5v
ZGVzLCB0aGVuIGFuIAo=
</data>
<flag name="review"
          id="208929"
          type_id="1"
          status="+"
          setter="darin"
    />
          </attachment>
      

    </bug>

</bugzilla>