<?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>49876</bug_id>
          
          <creation_ts>2010-11-20 21:20:46 -0800</creation_ts>
          <short_desc>Optimize matching of descendant selectors</short_desc>
          <delta_ts>2011-06-22 19:21: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>CSS</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>PC</rep_platform>
          <op_sys>OS X 10.5</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>InRadar</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Simon Fraser (smfr)">simon.fraser</reporter>
          <assigned_to name="Antti Koivisto">koivisto</assigned_to>
          <cc>alex</cc>
    
    <cc>hyatt</cc>
    
    <cc>jamesr</cc>
    
    <cc>koivisto</cc>
    
    <cc>mihaip</cc>
    
    <cc>peter</cc>
    
    <cc>psolanki</cc>
    
    <cc>sam</cc>
    
    <cc>simon.fraser</cc>
    
    <cc>tonikitoo</cc>
    
    <cc>tonyg</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>312037</commentid>
    <comment_count>0</comment_count>
    <who name="Simon Fraser (smfr)">simon.fraser</who>
    <bug_when>2010-11-20 21:20:46 -0800</bug_when>
    <thetext>Pages with selectors like:
.foo .bar *
can spend a lot of time in style resolution, because these types of selectors require walking back up the tree when matching every node.

A possible optimization here would be to keep track of which parts of the selectors have been matched while walking down the tree in recalcStyle.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>322671</commentid>
    <comment_count>1</comment_count>
    <who name="Simon Fraser (smfr)">simon.fraser</who>
    <bug_when>2010-12-15 10:28:06 -0800</bug_when>
    <thetext>&lt;rdar://problem/8772822&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>345096</commentid>
    <comment_count>2</comment_count>
      <attachid>81133</attachid>
    <who name="Antti Koivisto">koivisto</who>
    <bug_when>2011-02-03 16:07:02 -0800</bug_when>
    <thetext>Created attachment 81133
patch

During style recalculation, maintain a hash of tags, ids and classes seen in ancestor elements. Use the hash to quickly reject descendant and child selectors when doing style matching.

This speeds up style recalculations 3-6x on major web sites.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>345128</commentid>
    <comment_count>3</comment_count>
    <who name="James Robinson">jamesr</who>
    <bug_when>2011-02-03 16:32:51 -0800</bug_when>
    <thetext>Does this have overhead when the page isn&apos;t using descendant selectors?  I don&apos;t want to penalize pages who write good selectors just to optimize bad ones.  What&apos;s the hit/miss rate like on this cache?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>345163</commentid>
    <comment_count>4</comment_count>
    <who name="Antti Koivisto">koivisto</who>
    <bug_when>2011-02-03 16:56:10 -0800</bug_when>
    <thetext>Third rule on google.com stylesheet: .gac_m td{line-height:17px}

Also check out our default stylesheets.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>345165</commentid>
    <comment_count>5</comment_count>
    <who name="Simon Fraser (smfr)">simon.fraser</who>
    <bug_when>2011-02-03 16:57:37 -0800</bug_when>
    <thetext>Do we have good selector test coverage for this this may break? I&apos;m thinking of selectors like:
.foo div .foo .bar
where greediness may trip you up.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>345168</commentid>
    <comment_count>6</comment_count>
    <who name="Dave Hyatt">hyatt</who>
    <bug_when>2011-02-03 16:58:29 -0800</bug_when>
    <thetext>Dibs.  Will review later tonight.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>345171</commentid>
    <comment_count>7</comment_count>
    <who name="Antti Koivisto">koivisto</who>
    <bug_when>2011-02-03 17:00:44 -0800</bug_when>
    <thetext>(In reply to comment #5)
&gt; Do we have good selector test coverage for this this may break? I&apos;m thinking of selectors like:
&gt; .foo div .foo .bar
&gt; where greediness may trip you up.

Judging from the number of failure case it picked up, we have pretty good coverage. Modulo bugs, this shouldn&apos;t be tripped by anything.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>345173</commentid>
    <comment_count>8</comment_count>
    <who name="James Robinson">jamesr</who>
    <bug_when>2011-02-03 17:01:06 -0800</bug_when>
    <thetext>(In reply to comment #4)
&gt; Third rule on google.com stylesheet: .gac_m td{line-height:17px}
&gt; 
&gt; Also check out our default stylesheets.

I know descendant selectors are common, but that doesn&apos;t really answer my question.  Consider the size of the DOM for google.com - it&apos;s tiny.  Pages with significantly larger DOMs also tend to more aggressively avoid bad selectors (assuming the authors are savvy), and we definitely don&apos;t want to penalize those pages.  On google.com the overhead from this is probably pretty tiny.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>345175</commentid>
    <comment_count>9</comment_count>
      <attachid>81133</attachid>
    <who name="Simon Fraser (smfr)">simon.fraser</who>
    <bug_when>2011-02-03 17:03:19 -0800</bug_when>
    <thetext>Comment on attachment 81133
patch

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

&gt; Source/WebCore/css/CSSStyleSelector.cpp:364
&gt; +    void collectIdentifiersInDescendantSelectors();

collectDescendantSelectorIdentifiers()?

&gt; Source/WebCore/css/CSSStyleSelector.cpp:370
&gt; +    static const unsigned maximumIdentifierCount = 4;
&gt; +    const unsigned* identifiersInDescendantSelectors() const { return m_identifiersInDescendantSelectors; }

How do you know that &apos;4&apos; is a good number? Maybe use a Vector would be clearer, and a typedef for the unsigned (which I guess is really a hash) would be even clearer.

&gt; Source/WebCore/css/CSSStyleSelector.cpp:652
&gt; +static inline void addContextIdentifiersToVector(Element* element, Vector&lt;unsigned, 4&gt;&amp; contextIdentifiers)

Do you really need the , 4 here?

&gt; Source/WebCore/css/CSSStyleSelector.cpp:654
&gt; +    // Mix tags, class names and ids into sort of tasty bouillabaisse.

This comment, though amusing, doesn&apos;t really help me to understand the code.

&gt; Source/WebCore/css/CSSStyleSelector.cpp:671
&gt; +    // There are all kinds of vacky special cases where the style recalc may temporarily branch to some random elements.

s/vacky/wacky

&gt; Source/WebCore/css/CSSStyleSelector.cpp:672
&gt; +    // We could fix up the stack but that seems like a hassle.

Maybe use a FIXME: make this work in more unusual cases (e.g. when....)

&gt; Source/WebCore/css/CSSStyleSelector.cpp:680
&gt; +    m_parentStack.append(ParentStackFrame(parent));

I&apos;d like a blank line above this one.

&gt; Source/WebCore/css/CSSStyleSelector.cpp:683
&gt; +    size_t size = contextFrame.identifiers.size();

I&apos;d prefer count to size.

&gt; Source/WebCore/dom/Element.cpp:81
&gt; +    ~StyleSelectorParentPusher() { if (m_didPush) m_styleSelector-&gt;popParent(m_parent); }

Please unwrap this.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>345183</commentid>
    <comment_count>10</comment_count>
    <who name="Mihai Parparita">mihaip</who>
    <bug_when>2011-02-03 17:07:49 -0800</bug_when>
    <thetext>(In reply to comment #8)
&gt; I know descendant selectors are common, but that doesn&apos;t really answer my question.  Consider the size of the DOM for google.com - it&apos;s tiny.  Pages with significantly larger DOMs also tend to more aggressively avoid bad selectors (assuming the authors are savvy), and we definitely don&apos;t want to penalize those pages.  On google.com the overhead from this is probably pretty tiny.

Anecdotally, on Google Reader we knew that descendant selectors were bad and we had tooling to calculate their approximate cost and warn if they were out of hand, but we never removed them entirely (i.e. the only thing we outright forbade was *). I believe Gmail and Spreadsheets are the same. So I don&apos;t think it&apos;s safe to assume that savvy web developers will not have descendant selectors.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>345195</commentid>
    <comment_count>11</comment_count>
    <who name="Antti Koivisto">koivisto</who>
    <bug_when>2011-02-03 17:17:29 -0800</bug_when>
    <thetext>&gt; &gt; Source/WebCore/css/CSSStyleSelector.cpp:370
&gt; &gt; +    static const unsigned maximumIdentifierCount = 4;
&gt; &gt; +    const unsigned* identifiersInDescendantSelectors() const { return m_identifiersInDescendantSelectors; }
&gt; 
&gt; How do you know that &apos;4&apos; is a good number? Maybe use a Vector would be clearer, and a typedef for the unsigned (which I guess is really a hash) would be even clearer.

It was based on looking through a number of stylesheets on popular web sites. 2 or 3 might still give good enough coverage but this can be adjusted later. Much more (or a Vector!) is a bad idea as these data structures are significant portion of our memory usage. 

We consistently use &quot;unsigned&quot; for hash through the codebase.

&gt; &gt; Source/WebCore/css/CSSStyleSelector.cpp:652
&gt; &gt; +static inline void addContextIdentifiersToVector(Element* element, Vector&lt;unsigned, 4&gt;&amp; contextIdentifiers)
&gt; 
&gt; Do you really need the , 4 here?

That avoids most of the unnecessary mallocs. 4 is enough to fit the tag name and some classes. This is not an important structure in terms of for memory usage, it could be more too.

&gt; This comment, though amusing, doesn&apos;t really help me to understand the code.

It is my contribution to the recent important webkit-dev discussions.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>345204</commentid>
    <comment_count>12</comment_count>
    <who name="Simon Fraser (smfr)">simon.fraser</who>
    <bug_when>2011-02-03 17:22:29 -0800</bug_when>
    <thetext>(In reply to comment #11)
&gt; &gt; &gt; Source/WebCore/css/CSSStyleSelector.cpp:370
&gt; &gt; &gt; +    static const unsigned maximumIdentifierCount = 4;
&gt; &gt; &gt; +    const unsigned* identifiersInDescendantSelectors() const { return m_identifiersInDescendantSelectors; }
&gt; &gt; 
&gt; &gt; How do you know that &apos;4&apos; is a good number? Maybe use a Vector would be clearer, and a typedef for the unsigned (which I guess is really a hash) would be even clearer.
&gt; 
&gt; It was based on looking through a number of stylesheets on popular web sites. 2 or 3 might still give good enough coverage but this can be adjusted later. Much more (or a Vector!) is a bad idea as these data structures are significant portion of our memory usage. 

A Vector of fixed capacity shouldn&apos;t have any additional overhead.

&gt; We consistently use &quot;unsigned&quot; for hash through the codebase.
&gt; 
&gt; &gt; &gt; Source/WebCore/css/CSSStyleSelector.cpp:652
&gt; &gt; &gt; +static inline void addContextIdentifiersToVector(Element* element, Vector&lt;unsigned, 4&gt;&amp; contextIdentifiers)
&gt; &gt; 
&gt; &gt; Do you really need the , 4 here?
&gt; 
&gt; That avoids most of the unnecessary mallocs. 4 is enough to fit the tag name and some classes. This is not an important structure in terms of for memory usage, it could be more too.

But here you&apos;re just passing a reference to a Vector.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>345208</commentid>
    <comment_count>13</comment_count>
    <who name="Antti Koivisto">koivisto</who>
    <bug_when>2011-02-03 17:25:40 -0800</bug_when>
    <thetext>&gt; A Vector of fixed capacity shouldn&apos;t have any additional overhead.

size_t m_size; &lt;-----
Buffer m_buffer;

&gt; But here you&apos;re just passing a reference to a Vector.

I prefer my code to compile.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>345230</commentid>
    <comment_count>14</comment_count>
    <who name="Pratik Solanki">psolanki</who>
    <bug_when>2011-02-03 18:03:15 -0800</bug_when>
    <thetext>(In reply to comment #3)
&gt; What&apos;s the hit/miss rate like on this cache?

Using this simple dtrace script with a debug build

sudo dtrace -n &apos;pid$target:WebCore:WebCore??CSSStyleSelector??fastRejectSelector*:return { @[arg1] = count(); }&apos; -p &lt;pid&gt;

I see

nytimes.com
                0            91425
                1           533836

google.com (not logged in)
                0             8589
                1             2447

reader.google.com (logged into my account)
                0            12810
                1            31293
engadget.com
                0            15017
                1           326230

csszengarden.com
                0              412
                1              279</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>345295</commentid>
    <comment_count>15</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2011-02-03 20:34:26 -0800</bug_when>
    <thetext>Attachment 81133 did not pass style-queue:

Failed to run &quot;[&apos;Tools/Scripts/check-webkit-style&apos;, &apos;--diff-files&apos;, u&apos;Source/WebCore/ChangeLog&apos;, u&apos;Source/WebCor...&quot; exit_code: 1

Source/WebCore/dom/Element.cpp:81:  More than one command on the same line in if  [whitespace/parens] [4]
Source/WebCore/css/CSSStyleSelector.h:194:  The parameter name &quot;ruleData&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Total errors found: 2 in 4 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>345538</commentid>
    <comment_count>16</comment_count>
      <attachid>81133</attachid>
    <who name="Dave Hyatt">hyatt</who>
    <bug_when>2011-02-04 09:38:40 -0800</bug_when>
    <thetext>Comment on attachment 81133
patch

This looks great to me.  Address Simon&apos;s comments/feedback and r=me.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>346106</commentid>
    <comment_count>17</comment_count>
    <who name="Antti Koivisto">koivisto</who>
    <bug_when>2011-02-05 03:25:21 -0800</bug_when>
    <thetext>http://trac.webkit.org/changeset/77740

(with Simon&apos;s comments implemented and some additional cleanups)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>346150</commentid>
    <comment_count>18</comment_count>
    <who name="Antti Koivisto">koivisto</who>
    <bug_when>2011-02-05 08:54:33 -0800</bug_when>
    <thetext>(In reply to comment #10)
&gt; Anecdotally, on Google Reader we knew that descendant selectors were bad

Note that the reason descendant selectors are considered &quot;bad&quot; is that browser implementations have sucked. There is nothing inherently wrong with them.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>81133</attachid>
            <date>2011-02-03 16:07:02 -0800</date>
            <delta_ts>2011-02-04 09:38:40 -0800</delta_ts>
            <desc>patch</desc>
            <filename>styleselector-bouillabaisse-7.patch</filename>
            <type>text/plain</type>
            <size>14421</size>
            <attacher name="Antti Koivisto">koivisto</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDc3NTM3KQorKysgU291cmNlL1dlYkNvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMzQgQEAKKzIwMTEtMDItMDMgIEFudHRpIEtv
aXZpc3RvICA8YW50dGlAYXBwbGUuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAo
T09QUyEpLgorCisgICAgICAgIE9wdGltaXplIG1hdGNoaW5nIG9mIGRlc2NlbmRhbnQgc2VsZWN0
b3JzCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD00OTg3
NgorICAgICAgICA8cmRhcjovL3Byb2JsZW0vODc3MjgyMj4KKyAgICAgICAgCisgICAgICAgIER1
cmluZyBzdHlsZSByZWNhbGN1bGF0aW9uLCBtYWludGFpbiBhIGhhc2ggb2YgdGFncywgaWRzIGFu
ZCBjbGFzc2VzIHNlZW4gaW4gYW5jZXN0b3IgZWxlbWVudHMuCisgICAgICAgIFVzZSB0aGUgaGFz
aCB0byBxdWlja2x5IHJlamVjdCBkZXNjZW5kYW50IGFuZCBjaGlsZCBzZWxlY3RvcnMgd2hlbiBk
b2luZyBzdHlsZSBtYXRjaGluZy4KKworICAgICAgICBUaGlzIHNwZWVkcyB1cCBzdHlsZSByZWNh
bGN1bGF0aW9ucyAzLTZ4IG9uIG1ham9yIHdlYiBzaXRlcy4KKworICAgICAgICAqIGNzcy9DU1NT
dHlsZVNlbGVjdG9yLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlJ1bGVEYXRhOjpSdWxlRGF0YSk6
CisgICAgICAgIChXZWJDb3JlOjpSdWxlRGF0YTo6aWRlbnRpZmllcnNJbkRlc2NlbmRhbnRTZWxl
Y3RvcnMpOgorICAgICAgICAoV2ViQ29yZTo6YWRkQ29udGV4dElkZW50aWZpZXJzVG9WZWN0b3Ip
OgorICAgICAgICAoV2ViQ29yZTo6Q1NTU3R5bGVTZWxlY3Rvcjo6cHVzaFBhcmVudCk6CisgICAg
ICAgIChXZWJDb3JlOjpDU1NTdHlsZVNlbGVjdG9yOjpwb3BQYXJlbnQpOgorICAgICAgICAoV2Vi
Q29yZTo6Q1NTU3R5bGVTZWxlY3Rvcjo6ZmFzdFJlamVjdFNlbGVjdG9yKToKKyAgICAgICAgKFdl
YkNvcmU6OkNTU1N0eWxlU2VsZWN0b3I6Om1hdGNoUnVsZXNGb3JMaXN0KToKKyAgICAgICAgKFdl
YkNvcmU6OlJ1bGVEYXRhOjpjb2xsZWN0SWRlbnRpZmllcnNJbkRlc2NlbmRhbnRTZWxlY3RvcnMp
OgorICAgICAgICAqIGNzcy9DU1NTdHlsZVNlbGVjdG9yLmg6CisgICAgICAgIChXZWJDb3JlOjpD
U1NTdHlsZVNlbGVjdG9yOjpQYXJlbnRTdGFja0ZyYW1lOjpQYXJlbnRTdGFja0ZyYW1lKToKKyAg
ICAgICAgKiBkb20vRWxlbWVudC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpTdHlsZVNlbGVjdG9y
UGFyZW50UHVzaGVyOjpTdHlsZVNlbGVjdG9yUGFyZW50UHVzaGVyKToKKyAgICAgICAgKFdlYkNv
cmU6OlN0eWxlU2VsZWN0b3JQYXJlbnRQdXNoZXI6OnB1c2gpOgorICAgICAgICAoV2ViQ29yZTo6
U3R5bGVTZWxlY3RvclBhcmVudFB1c2hlcjo6flN0eWxlU2VsZWN0b3JQYXJlbnRQdXNoZXIpOgor
ICAgICAgICAoV2ViQ29yZTo6RWxlbWVudDo6YXR0YWNoKToKKyAgICAgICAgKFdlYkNvcmU6OkVs
ZW1lbnQ6OnJlY2FsY1N0eWxlKToKKwogMjAxMS0wMi0wMyAgVmFuZ2VsaXMgS29ra2V2aXMgIDx2
YW5nZWxpc0BjaHJvbWl1bS5vcmc+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgS2VubmV0aCBSdXNz
ZWxsLgpJbmRleDogU291cmNlL1dlYkNvcmUvY3NzL0NTU1N0eWxlU2VsZWN0b3IuY3BwCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2Nzcy9DU1NTdHlsZVNlbGVjdG9yLmNwcAkocmV2aXNp
b24gNzc1MTcpCisrKyBTb3VyY2UvV2ViQ29yZS9jc3MvQ1NTU3R5bGVTZWxlY3Rvci5jcHAJKHdv
cmtpbmcgY29weSkKQEAgLTM1OSwxNSArMzU5LDIxIEBAIHB1YmxpYzoKICAgICAgICAgLCBtX3Nl
bGVjdG9yKHNlbGVjdG9yKQogICAgICAgICAsIG1fcG9zaXRpb24ocG9zaXRpb24pCiAgICAgewor
ICAgICAgICBjb2xsZWN0SWRlbnRpZmllcnNJbkRlc2NlbmRhbnRTZWxlY3RvcnMoKTsKICAgICB9
CisgICAgdm9pZCBjb2xsZWN0SWRlbnRpZmllcnNJbkRlc2NlbmRhbnRTZWxlY3RvcnMoKTsKICAg
ICB1bnNpZ25lZCBwb3NpdGlvbigpIGNvbnN0IHsgcmV0dXJuIG1fcG9zaXRpb247IH0KICAgICBD
U1NTdHlsZVJ1bGUqIHJ1bGUoKSBjb25zdCB7IHJldHVybiBtX3J1bGU7IH0KICAgICBDU1NTZWxl
Y3Rvciogc2VsZWN0b3IoKSBjb25zdCB7IHJldHVybiBtX3NlbGVjdG9yOyB9CisgICAgCisgICAg
c3RhdGljIGNvbnN0IHVuc2lnbmVkIG1heGltdW1JZGVudGlmaWVyQ291bnQgPSA0OworICAgIGNv
bnN0IHVuc2lnbmVkKiBpZGVudGlmaWVyc0luRGVzY2VuZGFudFNlbGVjdG9ycygpIGNvbnN0IHsg
cmV0dXJuIG1faWRlbnRpZmllcnNJbkRlc2NlbmRhbnRTZWxlY3RvcnM7IH0KIAogcHJpdmF0ZToK
ICAgICBDU1NTdHlsZVJ1bGUqIG1fcnVsZTsKICAgICBDU1NTZWxlY3RvciogbV9zZWxlY3RvcjsK
ICAgICB1bnNpZ25lZCBtX3Bvc2l0aW9uOworICAgIHVuc2lnbmVkIG1faWRlbnRpZmllcnNJbkRl
c2NlbmRhbnRTZWxlY3RvcnNbbWF4aW11bUlkZW50aWZpZXJDb3VudF07CiB9OwogCiBjbGFzcyBS
dWxlU2V0IHsKQEAgLTY0Miw2ICs2NDgsNTQgQEAgc3RhdGljIHZvaWQgbG9hZFZpZXdTb3VyY2VT
dHlsZSgpCiAgICAgZGVmYXVsdFZpZXdTb3VyY2VTdHlsZSA9IG5ldyBSdWxlU2V0OwogICAgIGRl
ZmF1bHRWaWV3U291cmNlU3R5bGUtPmFkZFJ1bGVzRnJvbVNoZWV0KHBhcnNlVUFTaGVldChzb3Vy
Y2VVc2VyQWdlbnRTdHlsZVNoZWV0LCBzaXplb2Yoc291cmNlVXNlckFnZW50U3R5bGVTaGVldCkp
LCBzY3JlZW5FdmFsKCkpOwogfQorICAgIAorc3RhdGljIGlubGluZSB2b2lkIGFkZENvbnRleHRJ
ZGVudGlmaWVyc1RvVmVjdG9yKEVsZW1lbnQqIGVsZW1lbnQsIFZlY3Rvcjx1bnNpZ25lZCwgND4m
IGNvbnRleHRJZGVudGlmaWVycykKK3sKKyAgICAvLyBNaXggdGFncywgY2xhc3MgbmFtZXMgYW5k
IGlkcyBpbnRvIHNvcnQgb2YgdGFzdHkgYm91aWxsYWJhaXNzZS4KKyAgICAvLyBJdCBpcyB1c2Vk
IGZvciBmYXN0IHJlamVjdGlvbiBvZiBjb21wbGV4IHNlbGVjdG9ycy4KKyAgICBjb250ZXh0SWRl
bnRpZmllcnMuYXBwZW5kKGVsZW1lbnQtPmxvY2FsTmFtZSgpLmltcGwoKS0+ZXhpc3RpbmdIYXNo
KCkpOworICAgIGlmIChlbGVtZW50LT5oYXNJRCgpKQorICAgICAgICBjb250ZXh0SWRlbnRpZmll
cnMuYXBwZW5kKGVsZW1lbnQtPmlkRm9yU3R5bGVSZXNvbHV0aW9uKCkuaW1wbCgpLT5leGlzdGlu
Z0hhc2goKSk7CisgICAgU3R5bGVkRWxlbWVudCogc3R5bGVkRWxlbWVudCA9IGVsZW1lbnQtPmlz
U3R5bGVkRWxlbWVudCgpID8gc3RhdGljX2Nhc3Q8U3R5bGVkRWxlbWVudCo+KGVsZW1lbnQpIDog
MDsKKyAgICBpZiAoc3R5bGVkRWxlbWVudCAmJiBzdHlsZWRFbGVtZW50LT5oYXNDbGFzcygpKSB7
CisgICAgICAgIGNvbnN0IFNwYWNlU3BsaXRTdHJpbmcmIGNsYXNzTmFtZXMgPSBzdGF0aWNfY2Fz
dDxTdHlsZWRFbGVtZW50Kj4oZWxlbWVudCktPmNsYXNzTmFtZXMoKTsKKyAgICAgICAgc2l6ZV90
IHNpemUgPSBjbGFzc05hbWVzLnNpemUoKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkg
PCBzaXplOyArK2kpCisgICAgICAgICAgICBjb250ZXh0SWRlbnRpZmllcnMuYXBwZW5kKGNsYXNz
TmFtZXNbaV0uaW1wbCgpLT5leGlzdGluZ0hhc2goKSk7CisgICAgfQorfQorICAgIAordm9pZCBD
U1NTdHlsZVNlbGVjdG9yOjpwdXNoUGFyZW50KEVsZW1lbnQqIHBhcmVudCkKK3sKKyAgICAvLyBJ
ZiB3ZSBhcmUgbm90IGludm9rZWQgY29uc2lzdGVudGx5IGZvciBlYWNoIHBhcmVudCwganVzdCBw
YXVzZSBtYWludGFpbmluZyB0aGUgc3RhY2suCisgICAgLy8gVGhlcmUgYXJlIGFsbCBraW5kcyBv
ZiB2YWNreSBzcGVjaWFsIGNhc2VzIHdoZXJlIHRoZSBzdHlsZSByZWNhbGMgbWF5IHRlbXBvcmFy
aWx5IGJyYW5jaCB0byBzb21lIHJhbmRvbSBlbGVtZW50cy4KKyAgICAvLyBXZSBjb3VsZCBmaXgg
dXAgdGhlIHN0YWNrIGJ1dCB0aGF0IHNlZW1zIGxpa2UgYSBoYXNzbGUuCisgICAgaWYgKG1fcGFy
ZW50U3RhY2suaXNFbXB0eSgpKSB7CisgICAgICAgIEFTU0VSVChtX2N1bXVsYXRpdmVBbmNlc3Rv
cklkZW50aWZpZXJzLmlzRW1wdHkoKSk7CisgICAgICAgIC8vIFdlIG11c3Qgc3RhcnQgZnJvbSBy
b290LgorICAgICAgICBpZiAocGFyZW50LT5wYXJlbnRFbGVtZW50KCkpCisgICAgICAgICAgICBy
ZXR1cm47CisgICAgfSBlbHNlIGlmIChtX3BhcmVudFN0YWNrLmxhc3QoKS5lbGVtZW50ICE9IHBh
cmVudC0+cGFyZW50RWxlbWVudCgpKQorICAgICAgICByZXR1cm47CisgICAgbV9wYXJlbnRTdGFj
ay5hcHBlbmQoUGFyZW50U3RhY2tGcmFtZShwYXJlbnQpKTsKKyAgICBQYXJlbnRTdGFja0ZyYW1l
JiBjb250ZXh0RnJhbWUgPSBtX3BhcmVudFN0YWNrLmxhc3QoKTsKKyAgICBhZGRDb250ZXh0SWRl
bnRpZmllcnNUb1ZlY3RvcihwYXJlbnQsIGNvbnRleHRGcmFtZS5pZGVudGlmaWVycyk7CisgICAg
c2l6ZV90IHNpemUgPSBjb250ZXh0RnJhbWUuaWRlbnRpZmllcnMuc2l6ZSgpOworICAgIGZvciAo
c2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgKytpKQorICAgICAgICBtX2N1bXVsYXRpdmVBbmNlc3Rv
cklkZW50aWZpZXJzLmFkZChjb250ZXh0RnJhbWUuaWRlbnRpZmllcnNbaV0pOworfQorCit2b2lk
IENTU1N0eWxlU2VsZWN0b3I6OnBvcFBhcmVudChFbGVtZW50KiBwYXJlbnQpCit7CisgICAgaWYg
KG1fcGFyZW50U3RhY2suaXNFbXB0eSgpIHx8IG1fcGFyZW50U3RhY2subGFzdCgpLmVsZW1lbnQg
IT0gcGFyZW50KQorICAgICAgICByZXR1cm47CisgICAgY29uc3QgUGFyZW50U3RhY2tGcmFtZSYg
Y29udGV4dEZyYW1lID0gbV9wYXJlbnRTdGFjay5sYXN0KCk7CisgICAgc2l6ZV90IHNpemUgPSBj
b250ZXh0RnJhbWUuaWRlbnRpZmllcnMuc2l6ZSgpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBp
IDwgc2l6ZTsgKytpKQorICAgICAgICBtX2N1bXVsYXRpdmVBbmNlc3RvcklkZW50aWZpZXJzLnJl
bW92ZShjb250ZXh0RnJhbWUuaWRlbnRpZmllcnNbaV0pOworICAgIG1fcGFyZW50U3RhY2sucmVt
b3ZlTGFzdCgpOworICAgIEFTU0VSVCghbV9wYXJlbnRTdGFjay5pc0VtcHR5KCkgfHwgbV9jdW11
bGF0aXZlQW5jZXN0b3JJZGVudGlmaWVycy5pc0VtcHR5KCkpOworfQogCiB2b2lkIENTU1N0eWxl
U2VsZWN0b3I6OmFkZE1hdGNoZWREZWNsYXJhdGlvbihDU1NNdXRhYmxlU3R5bGVEZWNsYXJhdGlv
biogZGVjbCkKIHsKQEAgLTY5MywyMiArNzQ3LDM3IEBAIHZvaWQgQ1NTU3R5bGVTZWxlY3Rvcjo6
bWF0Y2hSdWxlcyhSdWxlU2UKICAgICB9CiB9CiAKK2lubGluZSBib29sIENTU1N0eWxlU2VsZWN0
b3I6OmZhc3RSZWplY3RTZWxlY3Rvcihjb25zdCBSdWxlRGF0YSYgcnVsZURhdGEpIGNvbnN0Cit7
CisgICAgY29uc3QgdW5zaWduZWQqIGlkZW50aWZpZXJzSW5EZXNjZW5kYW50U2VsZWN0b3JzID0g
cnVsZURhdGEuaWRlbnRpZmllcnNJbkRlc2NlbmRhbnRTZWxlY3RvcnMoKTsKKyAgICBmb3IgKHVu
c2lnbmVkIG4gPSAwOyBuIDwgUnVsZURhdGE6Om1heGltdW1JZGVudGlmaWVyQ291bnQgJiYgaWRl
bnRpZmllcnNJbkRlc2NlbmRhbnRTZWxlY3RvcnNbbl07ICsrbikgeworICAgICAgICBpZiAoIW1f
Y3VtdWxhdGl2ZUFuY2VzdG9ySWRlbnRpZmllcnMuY29udGFpbnMoaWRlbnRpZmllcnNJbkRlc2Nl
bmRhbnRTZWxlY3RvcnNbbl0pKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAg
IHJldHVybiBmYWxzZTsKK30KKwogdm9pZCBDU1NTdHlsZVNlbGVjdG9yOjptYXRjaFJ1bGVzRm9y
TGlzdChjb25zdCBWZWN0b3I8UnVsZURhdGE+KiBydWxlcywgaW50JiBmaXJzdFJ1bGVJbmRleCwg
aW50JiBsYXN0UnVsZUluZGV4LCBib29sIGluY2x1ZGVFbXB0eVJ1bGVzKQogewogICAgIGlmICgh
cnVsZXMpCiAgICAgICAgIHJldHVybjsKKyAgICAvLyBJbiBzb21lIGNhc2VzIHdlIG1heSBlbmQg
dXAgbG9va2luZyB1cCBzdHlsZSBmb3IgcmFuZG9tIGVsZW1lbnRzIGluIHRoZSBtaWRkbGUgb2Yg
cmVjdXJzaXZlIHRyZWUgcmVzb2x2ZS4KKyAgICAvLyBBbmNlc3RvciBpZGVudGlmaWVyIGhhc2gg
d29uJ3QgYmUgdXAtdG8tZGF0ZSBpbiB0aGF0IGNhc2UgYW5kIHdlIGNhbid0IHVzZSB0aGUgZmFz
dCBwYXRoLgorICAgIGJvb2wgY2FuVXNlRmFzdFJlamVjdCA9ICFtX3BhcmVudFN0YWNrLmlzRW1w
dHkoKSAmJiBtX3BhcmVudFN0YWNrLmxhc3QoKS5lbGVtZW50ID09IG1fcGFyZW50Tm9kZTsKKwog
ICAgIHVuc2lnbmVkIHNpemUgPSBydWxlcy0+c2l6ZSgpOwogICAgIGZvciAodW5zaWduZWQgaSA9
IDA7IGkgPCBzaXplOyArK2kpIHsKICAgICAgICAgY29uc3QgUnVsZURhdGEmIHJ1bGVEYXRhID0g
cnVsZXMtPmF0KGkpOwogICAgICAgICBDU1NTdHlsZVJ1bGUqIHJ1bGUgPSBydWxlRGF0YS5ydWxl
KCk7Ci0gICAgICAgIGlmIChtX2NoZWNrZXIubV9zYW1lT3JpZ2luT25seSAmJiAhbV9jaGVja2Vy
Lm1fZG9jdW1lbnQtPnNlY3VyaXR5T3JpZ2luKCktPmNhblJlcXVlc3QocnVsZS0+YmFzZVVSTCgp
KSkKLSAgICAgICAgICAgIGNvbnRpbnVlOyAKKyAgICAgICAgaWYgKGNhblVzZUZhc3RSZWplY3Qg
JiYgZmFzdFJlamVjdFNlbGVjdG9yKHJ1bGVEYXRhKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOwog
ICAgICAgICBpZiAoY2hlY2tTZWxlY3RvcihydWxlRGF0YS5zZWxlY3RvcigpKSkgewogICAgICAg
ICAgICAgLy8gSWYgdGhlIHJ1bGUgaGFzIG5vIHByb3BlcnRpZXMgdG8gYXBwbHksIHRoZW4gaWdu
b3JlIGl0IGluIHRoZSBub24tZGVidWcgbW9kZS4KICAgICAgICAgICAgIENTU011dGFibGVTdHls
ZURlY2xhcmF0aW9uKiBkZWNsID0gcnVsZS0+ZGVjbGFyYXRpb24oKTsKICAgICAgICAgICAgIGlm
ICghZGVjbCB8fCAoIWRlY2wtPmxlbmd0aCgpICYmICFpbmNsdWRlRW1wdHlSdWxlcykpCiAgICAg
ICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIChtX2No
ZWNrZXIubV9zYW1lT3JpZ2luT25seSAmJiAhbV9jaGVja2VyLm1fZG9jdW1lbnQtPnNlY3VyaXR5
T3JpZ2luKCktPmNhblJlcXVlc3QocnVsZS0+YmFzZVVSTCgpKSkKKyAgICAgICAgICAgICAgICBj
b250aW51ZTsgCiAgICAgICAgICAgICAvLyBJZiB3ZSdyZSBtYXRjaGluZyBub3JtYWwgcnVsZXMs
IHNldCBhIHBzZXVkbyBiaXQgaWYgCiAgICAgICAgICAgICAvLyB3ZSByZWFsbHkganVzdCBtYXRj
aGVkIGEgcHNldWRvLWVsZW1lbnQuCiAgICAgICAgICAgICBpZiAobV9keW5hbWljUHNldWRvICE9
IE5PUFNFVURPICYmIG1fY2hlY2tlci5tX3BzZXVkb1N0eWxlID09IE5PUFNFVURPKSB7CkBAIC0y
ODQxLDYgKzI5MTAsMzUgQEAgYm9vbCBDU1NTdHlsZVNlbGVjdG9yOjpTZWxlY3RvckNoZWNrZXI6
OgogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLQogCitpbmxpbmUgdm9pZCBSdWxlRGF0YTo6Y29sbGVjdElkZW50aWZp
ZXJzSW5EZXNjZW5kYW50U2VsZWN0b3JzKCkKK3sKKyAgICB1bnNpZ25lZCBpZGVudGlmaWVyQ291
bnQgPSAwOworICAgIENTU1NlbGVjdG9yOjpSZWxhdGlvbiByZWxhdGlvbiA9IG1fc2VsZWN0b3It
PnJlbGF0aW9uKCk7CisgICAgQ1NTU2VsZWN0b3IqIHNlbGVjdG9yID0gbV9zZWxlY3Rvci0+dGFn
SGlzdG9yeSgpOworICAgIC8vIFNraXAgdGhlIHRvcG1vc3Qgc2VsZWN0b3IuIEl0IGlzIGhhbmRs
ZWQgcXVpY2tseSBieSB0aGUgcnVsZSBoYXNoZXMuCisgICAgZm9yICg7IHNlbGVjdG9yOyBzZWxl
Y3RvciA9IHNlbGVjdG9yLT50YWdIaXN0b3J5KCkpIHsKKyAgICAgICAgaWYgKHJlbGF0aW9uICE9
IENTU1NlbGVjdG9yOjpTdWJTZWxlY3RvcikKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBy
ZWxhdGlvbiA9IHNlbGVjdG9yLT5yZWxhdGlvbigpOworICAgIH0KKyAgICBmb3IgKDsgc2VsZWN0
b3I7IHNlbGVjdG9yID0gc2VsZWN0b3ItPnRhZ0hpc3RvcnkoKSkgeworICAgICAgICAvLyBPbmx5
IGNvbGxlY3QgaWRlbnRpZmllcnMgdGhhdCBtYXRjaCBkaXJlY3QgYW5jZXN0b3JzLgorICAgICAg
ICBpZiAocmVsYXRpb24gIT0gQ1NTU2VsZWN0b3I6OkRlc2NlbmRhbnQgJiYgcmVsYXRpb24gIT0g
Q1NTU2VsZWN0b3I6OkNoaWxkICYmIHJlbGF0aW9uICE9IENTU1NlbGVjdG9yOjpTdWJTZWxlY3Rv
cikKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBpZiAoKHNlbGVjdG9yLT5tX21hdGNoID09
IENTU1NlbGVjdG9yOjpJZCB8fCBzZWxlY3Rvci0+bV9tYXRjaCA9PSBDU1NTZWxlY3Rvcjo6Q2xh
c3MpICYmICFzZWxlY3Rvci0+dmFsdWUoKS5pc0VtcHR5KCkpCisgICAgICAgICAgICBtX2lkZW50
aWZpZXJzSW5EZXNjZW5kYW50U2VsZWN0b3JzW2lkZW50aWZpZXJDb3VudCsrXSA9IHNlbGVjdG9y
LT52YWx1ZSgpLmltcGwoKS0+ZXhpc3RpbmdIYXNoKCk7CisgICAgICAgIGlmIChpZGVudGlmaWVy
Q291bnQgPT0gbWF4aW11bUlkZW50aWZpZXJDb3VudCkKKyAgICAgICAgICAgIHJldHVybjsKKyAg
ICAgICAgY29uc3QgQXRvbWljU3RyaW5nJiBsb2NhbE5hbWUgPSBzZWxlY3Rvci0+dGFnKCkubG9j
YWxOYW1lKCk7CisgICAgICAgIGlmIChsb2NhbE5hbWUgIT0gc3RhckF0b20pCisgICAgICAgICAg
ICBtX2lkZW50aWZpZXJzSW5EZXNjZW5kYW50U2VsZWN0b3JzW2lkZW50aWZpZXJDb3VudCsrXSA9
IGxvY2FsTmFtZS5pbXBsKCktPmV4aXN0aW5nSGFzaCgpOworICAgICAgICBpZiAoaWRlbnRpZmll
ckNvdW50ID09IG1heGltdW1JZGVudGlmaWVyQ291bnQpCisgICAgICAgICAgICByZXR1cm47Cisg
ICAgICAgIHJlbGF0aW9uID0gc2VsZWN0b3ItPnJlbGF0aW9uKCk7CisgICAgfQorICAgIG1faWRl
bnRpZmllcnNJbkRlc2NlbmRhbnRTZWxlY3RvcnNbaWRlbnRpZmllckNvdW50XSA9IDA7Cit9CisK
IFJ1bGVTZXQ6OlJ1bGVTZXQoKQogICAgIDogbV9ydWxlQ291bnQoMCkKICAgICAsIG1fYXV0b1No
cmlua1RvRml0RW5hYmxlZCh0cnVlKQpJbmRleDogU291cmNlL1dlYkNvcmUvY3NzL0NTU1N0eWxl
U2VsZWN0b3IuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9jc3MvQ1NTU3R5bGVTZWxl
Y3Rvci5oCShyZXZpc2lvbiA3NzUxNykKKysrIFNvdXJjZS9XZWJDb3JlL2Nzcy9DU1NTdHlsZVNl
bGVjdG9yLmgJKHdvcmtpbmcgY29weSkKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlICJMaW5r
SGFzaC5oIgogI2luY2x1ZGUgIk1lZGlhUXVlcnlFeHAuaCIKICNpbmNsdWRlICJSZW5kZXJTdHls
ZS5oIgorI2luY2x1ZGUgPHd0Zi9IYXNoQ291bnRlZFNldC5oPgogI2luY2x1ZGUgPHd0Zi9IYXNo
TWFwLmg+CiAjaW5jbHVkZSA8d3RmL0hhc2hTZXQuaD4KICNpbmNsdWRlIDx3dGYvUmVmUHRyLmg+
CkBAIC04OSw2ICs5MCwxMCBAQCBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgQ1NT
U3R5bGVTaGVldCogcGFnZVVzZXJTaGVldCwgY29uc3QgVmVjdG9yPFJlZlB0cjxDU1NTdHlsZVNo
ZWV0PiA+KiBwYWdlR3JvdXBVc2VyU2hlZXRzLAogICAgICAgICAgICAgICAgICAgICAgICAgIGJv
b2wgc3RyaWN0UGFyc2luZywgYm9vbCBtYXRjaEF1dGhvckFuZFVzZXJTdHlsZXMpOwogICAgICAg
ICB+Q1NTU3R5bGVTZWxlY3RvcigpOworICAgICAgICAKKyAgICAgICAgLy8gVXNpbmcgdGhlc2Ug
ZHVyaW5nIHRyZWUgd2FsayB3aWxsIGFsbG93IHN0eWxlIHNlbGVjdG9yIHRvIG9wdGltaXplIGNo
aWxkIGFuZCBkZXNjZW5kYW50IHNlbGVjdG9yIGxvb3B1cHMuCisgICAgICAgIHZvaWQgcHVzaFBh
cmVudChFbGVtZW50KiBwYXJlbnQpOworICAgICAgICB2b2lkIHBvcFBhcmVudChFbGVtZW50KiBw
YXJlbnQpOwogCiAgICAgICAgIFBhc3NSZWZQdHI8UmVuZGVyU3R5bGU+IHN0eWxlRm9yRWxlbWVu
dChFbGVtZW50KiBlLCBSZW5kZXJTdHlsZSogcGFyZW50U3R5bGUgPSAwLCBib29sIGFsbG93U2hh
cmluZyA9IHRydWUsIGJvb2wgcmVzb2x2ZUZvclJvb3REZWZhdWx0ID0gZmFsc2UsIGJvb2wgbWF0
Y2hWaXNpdGVkUHNldWRvQ2xhc3MgPSBmYWxzZSk7CiAgICAgICAgIApAQCAtMTg2LDYgKzE5MSw3
IEBAIHB1YmxpYzoKIAogICAgICAgICB2b2lkIG1hdGNoUnVsZXMoUnVsZVNldCosIGludCYgZmly
c3RSdWxlSW5kZXgsIGludCYgbGFzdFJ1bGVJbmRleCwgYm9vbCBpbmNsdWRlRW1wdHlSdWxlcyk7
CiAgICAgICAgIHZvaWQgbWF0Y2hSdWxlc0Zvckxpc3QoY29uc3QgVmVjdG9yPFJ1bGVEYXRhPios
IGludCYgZmlyc3RSdWxlSW5kZXgsIGludCYgbGFzdFJ1bGVJbmRleCwgYm9vbCBpbmNsdWRlRW1w
dHlSdWxlcyk7CisgICAgICAgIGJvb2wgZmFzdFJlamVjdFNlbGVjdG9yKGNvbnN0IFJ1bGVEYXRh
JiBydWxlRGF0YSkgY29uc3Q7CiAgICAgICAgIHZvaWQgc29ydE1hdGNoZWRSdWxlcyh1bnNpZ25l
ZCBzdGFydCwgdW5zaWduZWQgZW5kKTsKIAogICAgICAgICB0ZW1wbGF0ZSA8Ym9vbCBmaXJzdFBh
c3M+CkBAIC0yMDMsNiArMjA5LDE0IEBAIHB1YmxpYzoKICAgICAgICAgCiAgICAgICAgIE93blB0
cjxSdWxlU2V0PiBtX3NpYmxpbmdSdWxlczsKICAgICAgICAgSGFzaFNldDxBdG9taWNTdHJpbmdJ
bXBsKj4gbV9pZHNJblJ1bGVzOworICAgICAgICAKKyAgICAgICAgc3RydWN0IFBhcmVudFN0YWNr
RnJhbWUgeworICAgICAgICAgICAgUGFyZW50U3RhY2tGcmFtZShFbGVtZW50KiBlbGVtZW50KSA6
IGVsZW1lbnQoZWxlbWVudCkge30KKyAgICAgICAgICAgIEVsZW1lbnQqIGVsZW1lbnQ7CisgICAg
ICAgICAgICBWZWN0b3I8dW5zaWduZWQsIDQ+IGlkZW50aWZpZXJzOworICAgICAgICB9OworICAg
ICAgICBWZWN0b3I8UGFyZW50U3RhY2tGcmFtZT4gbV9wYXJlbnRTdGFjazsKKyAgICAgICAgSGFz
aENvdW50ZWRTZXQ8dW5zaWduZWQsIEFscmVhZHlIYXNoZWQ+IG1fY3VtdWxhdGl2ZUFuY2VzdG9y
SWRlbnRpZmllcnM7CiAKICAgICAgICAgYm9vbCBtX2hhc1VBQXBwZWFyYW5jZTsKICAgICAgICAg
Qm9yZGVyRGF0YSBtX2JvcmRlckRhdGE7CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9kb20vRWxlbWVu
dC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvZG9tL0VsZW1lbnQuY3BwCShyZXZp
c2lvbiA3NzUxNykKKysrIFNvdXJjZS9XZWJDb3JlL2RvbS9FbGVtZW50LmNwcAkod29ya2luZyBj
b3B5KQpAQCAtNjgsNiArNjgsMjQgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogdXNpbmcgbmFtZXNw
YWNlIEhUTUxOYW1lczsKIHVzaW5nIG5hbWVzcGFjZSBYTUxOYW1lczsKICAgICAKK2NsYXNzIFN0
eWxlU2VsZWN0b3JQYXJlbnRQdXNoZXIgeworcHVibGljOgorICAgIFN0eWxlU2VsZWN0b3JQYXJl
bnRQdXNoZXIoQ1NTU3R5bGVTZWxlY3Rvciogc3R5bGVTZWxlY3RvciwgRWxlbWVudCogcGFyZW50
KSA6IG1fc3R5bGVTZWxlY3RvcihzdHlsZVNlbGVjdG9yKSwgbV9wYXJlbnQocGFyZW50KSwgbV9k
aWRQdXNoKGZhbHNlKSB7fQorICAgIHZvaWQgcHVzaCgpCisgICAgeworICAgICAgICBpZiAobV9k
aWRQdXNoKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBtX3N0eWxlU2VsZWN0b3ItPnB1
c2hQYXJlbnQobV9wYXJlbnQpOworICAgICAgICBtX2RpZFB1c2ggPSB0cnVlOworICAgIH0KKyAg
ICB+U3R5bGVTZWxlY3RvclBhcmVudFB1c2hlcigpIHsgaWYgKG1fZGlkUHVzaCkgbV9zdHlsZVNl
bGVjdG9yLT5wb3BQYXJlbnQobV9wYXJlbnQpOyB9CisKK3ByaXZhdGU6CisgICAgQ1NTU3R5bGVT
ZWxlY3RvciogbV9zdHlsZVNlbGVjdG9yOworICAgIEVsZW1lbnQqIG1fcGFyZW50OworICAgIGJv
b2wgbV9kaWRQdXNoOworfTsKKyAgICAKIFBhc3NSZWZQdHI8RWxlbWVudD4gRWxlbWVudDo6Y3Jl
YXRlKGNvbnN0IFF1YWxpZmllZE5hbWUmIHRhZ05hbWUsIERvY3VtZW50KiBkb2N1bWVudCkKIHsK
ICAgICByZXR1cm4gYWRvcHRSZWYobmV3IEVsZW1lbnQodGFnTmFtZSwgZG9jdW1lbnQsIENyZWF0
ZUVsZW1lbnQpKTsKQEAgLTkxNyw5ICs5MzUsMTUgQEAgdm9pZCBFbGVtZW50OjphdHRhY2goKQog
ICAgIFJlbmRlcldpZGdldDo6c3VzcGVuZFdpZGdldEhpZXJhcmNoeVVwZGF0ZXMoKTsKIAogICAg
IGNyZWF0ZVJlbmRlcmVySWZOZWVkZWQoKTsKKyAgICAKKyAgICBTdHlsZVNlbGVjdG9yUGFyZW50
UHVzaGVyIHB1c2hlcihkb2N1bWVudCgpLT5zdHlsZVNlbGVjdG9yKCksIHRoaXMpOworICAgIGlm
IChmaXJzdENoaWxkKCkpCisgICAgICAgIHB1c2hlci5wdXNoKCk7CiAgICAgQ29udGFpbmVyTm9k
ZTo6YXR0YWNoKCk7Ci0gICAgaWYgKE5vZGUqIHNoYWRvdyA9IHNoYWRvd1Jvb3QoKSkKKyAgICBp
ZiAoTm9kZSogc2hhZG93ID0gc2hhZG93Um9vdCgpKSB7CisgICAgICAgIHB1c2hlci5wdXNoKCk7
CiAgICAgICAgIHNoYWRvdy0+YXR0YWNoKCk7CisgICAgfQogICAgIGlmIChoYXNSYXJlRGF0YSgp
KSB7ICAgCiAgICAgICAgIEVsZW1lbnRSYXJlRGF0YSogZGF0YSA9IHJhcmVEYXRhKCk7CiAgICAg
ICAgIGlmIChkYXRhLT5uZWVkc0ZvY3VzQXBwZWFyYW5jZVVwZGF0ZVNvb25BZnRlckF0dGFjaCgp
KSB7CkBAIC0xMDU5LDcgKzEwODMsNyBAQCB2b2lkIEVsZW1lbnQ6OnJlY2FsY1N0eWxlKFN0eWxl
Q2hhbmdlIGNoCiAgICAgICAgICAgICAgICAgY2hhbmdlID0gY2g7CiAgICAgICAgIH0KICAgICB9
Ci0KKyAgICBTdHlsZVNlbGVjdG9yUGFyZW50UHVzaGVyIHB1c2hlcihkb2N1bWVudCgpLT5zdHls
ZVNlbGVjdG9yKCksIHRoaXMpOwogICAgIC8vIEZJWE1FOiBUaGlzIGNoZWNrIGlzIGdvb2QgZW5v
dWdoIGZvciA6aG92ZXIgKyBmb28sIGJ1dCBpdCBpcyBub3QgZ29vZCBlbm91Z2ggZm9yIDpob3Zl
ciArIGZvbyArIGJhci4KICAgICAvLyBGb3Igbm93IHdlIHdpbGwganVzdCB3b3JyeSBhYm91dCB0
aGUgY29tbW9uIGNhc2UsIHNpbmNlIGl0J3MgYSBsb3QgdHJpY2tpZXIgdG8gZ2V0IHRoZSBzZWNv
bmQgY2FzZSByaWdodAogICAgIC8vIHdpdGhvdXQgZG9pbmcgd2F5IHRvbyBtdWNoIHJlLXJlc29s
dXRpb24uCkBAIC0xMDY4LDE1ICsxMDkyLDE5IEBAIHZvaWQgRWxlbWVudDo6cmVjYWxjU3R5bGUo
U3R5bGVDaGFuZ2UgY2gKICAgICAgICAgYm9vbCBjaGlsZFJ1bGVzQ2hhbmdlZCA9IG4tPm5lZWRz
U3R5bGVSZWNhbGMoKSAmJiBuLT5zdHlsZUNoYW5nZVR5cGUoKSA9PSBGdWxsU3R5bGVDaGFuZ2U7
CiAgICAgICAgIGlmIChmb3JjZUNoZWNrT2ZOZXh0RWxlbWVudFNpYmxpbmcgJiYgbi0+aXNFbGVt
ZW50Tm9kZSgpKQogICAgICAgICAgICAgbi0+c2V0TmVlZHNTdHlsZVJlY2FsYygpOwotICAgICAg
ICBpZiAoY2hhbmdlID49IEluaGVyaXQgfHwgbi0+aXNUZXh0Tm9kZSgpIHx8IG4tPmNoaWxkTmVl
ZHNTdHlsZVJlY2FsYygpIHx8IG4tPm5lZWRzU3R5bGVSZWNhbGMoKSkKKyAgICAgICAgaWYgKGNo
YW5nZSA+PSBJbmhlcml0IHx8IG4tPmlzVGV4dE5vZGUoKSB8fCBuLT5jaGlsZE5lZWRzU3R5bGVS
ZWNhbGMoKSB8fCBuLT5uZWVkc1N0eWxlUmVjYWxjKCkpIHsKKyAgICAgICAgICAgIHB1c2hlci5w
dXNoKCk7CiAgICAgICAgICAgICBuLT5yZWNhbGNTdHlsZShjaGFuZ2UpOworICAgICAgICB9CiAg
ICAgICAgIGlmIChuLT5pc0VsZW1lbnROb2RlKCkpCiAgICAgICAgICAgICBmb3JjZUNoZWNrT2ZO
ZXh0RWxlbWVudFNpYmxpbmcgPSBjaGlsZFJ1bGVzQ2hhbmdlZCAmJiBoYXNEaXJlY3RBZGphY2Vu
dFJ1bGVzOwogICAgIH0KICAgICAvLyBGSVhNRTogVGhpcyBkb2VzIG5vdCBjYXJlIGFib3V0IHNp
YmxpbmcgY29tYmluYXRvcnMuIFdpbGwgYmUgbmVjZXNzYXJ5IGluIFhCTDIgd29ybGQuCiAgICAg
aWYgKE5vZGUqIHNoYWRvdyA9IHNoYWRvd1Jvb3QoKSkgewotICAgICAgICBpZiAoY2hhbmdlID49
IEluaGVyaXQgfHwgc2hhZG93LT5pc1RleHROb2RlKCkgfHwgc2hhZG93LT5jaGlsZE5lZWRzU3R5
bGVSZWNhbGMoKSB8fCBzaGFkb3ctPm5lZWRzU3R5bGVSZWNhbGMoKSkKKyAgICAgICAgaWYgKGNo
YW5nZSA+PSBJbmhlcml0IHx8IHNoYWRvdy0+aXNUZXh0Tm9kZSgpIHx8IHNoYWRvdy0+Y2hpbGRO
ZWVkc1N0eWxlUmVjYWxjKCkgfHwgc2hhZG93LT5uZWVkc1N0eWxlUmVjYWxjKCkpIHsKKyAgICAg
ICAgICAgIHB1c2hlci5wdXNoKCk7CiAgICAgICAgICAgICBzaGFkb3ctPnJlY2FsY1N0eWxlKGNo
YW5nZSk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBjbGVhck5lZWRzU3R5bGVSZWNhbGMoKTsK
</data>
<flag name="review"
          id="72682"
          type_id="1"
          status="+"
          setter="hyatt"
    />
          </attachment>
      

    </bug>

</bugzilla>