<?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>60273</bug_id>
          
          <creation_ts>2011-05-05 09:00:07 -0700</creation_ts>
          <short_desc>Extract a DragCaretController from FrameSelection</short_desc>
          <delta_ts>2011-05-10 22:47:17 -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>HTML Editing</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>60454</blocked>
    
    <blocked>60505</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Dimitri Glazkov (Google)">dglazkov</reporter>
          <assigned_to name="Ryosuke Niwa">rniwa</assigned_to>
          <cc>abarth</cc>
    
    <cc>ap</cc>
    
    <cc>darin</cc>
    
    <cc>dcheng</cc>
    
    <cc>eric</cc>
    
    <cc>leviw</cc>
    
    <cc>rniwa</cc>
    
    <cc>sam</cc>
    
    <cc>tony</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>398749</commentid>
    <comment_count>0</comment_count>
    <who name="Dimitri Glazkov (Google)">dglazkov</who>
    <bug_when>2011-05-05 09:00:07 -0700</bug_when>
    <thetext>Filing for future yak shaving opportunities.

In fixing bug 8931, an extra instance of SelectionController was added to Page, specifically to track the caret when dragging text into a subframe. The commit had this useful comment:

// FIXME: Replace this with a function on the selection controller or change it to Selection instead?

This comment was removed in future refactoring, which is sad. Over time, the relationship between this instance and the one on Frame grew complicated.

We should come back to this, untangle and remove the extra SelectionController instance on Page.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>398780</commentid>
    <comment_count>1</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-05-05 09:39:15 -0700</bug_when>
    <thetext>We should definitely do this.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>398881</commentid>
    <comment_count>2</comment_count>
    <who name="Levi Weintraub">leviw</who>
    <bug_when>2011-05-05 11:48:01 -0700</bug_when>
    <thetext>No one should have to see their FIXME&apos;s pop back up over 5 years from writing them... No one!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>399201</commentid>
    <comment_count>3</comment_count>
      <attachid>92503</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-05-05 17:04:23 -0700</bug_when>
    <thetext>Created attachment 92503
work in progress

Here&apos;s my work-in-progress patch.  I split FrameSelection into 3 classes: CaretBase, DragCaretController, and FrameSelection.  CaretBase is the base class for DragCaretController and FrameSelection, which is responsible for keeping the states for and painting the caret.

Ideally, DragCaretController and FrameSelection will have CaretBase internally rather than inheriting from it but that should probably be done in a separate patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>399205</commentid>
    <comment_count>4</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2011-05-05 17:06:43 -0700</bug_when>
    <thetext>Attachment 92503 did not pass style-queue:

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

Source/WebCore/editing/FrameSelection.h:58:  The parameter name &quot;type&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebCore/editing/FrameSelection.h:62:  The parameter name &quot;view&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebCore/editing/FrameSelection.h:65:  The parameter name &quot;context&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebCore/editing/FrameSelection.h:86:  The parameter name &quot;frame&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebCore/editing/FrameSelection.h:86:  The parameter name &quot;p&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Total errors found: 5 in 9 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>399257</commentid>
    <comment_count>5</comment_count>
      <attachid>92518</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-05-05 18:09:29 -0700</bug_when>
    <thetext>Created attachment 92518
cleanup</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>399601</commentid>
    <comment_count>6</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-05-06 10:18:24 -0700</bug_when>
    <thetext>Anyone interested in reviewing this?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>400240</commentid>
    <comment_count>7</comment_count>
      <attachid>92518</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2011-05-08 08:26:49 -0700</bug_when>
    <thetext>Comment on attachment 92518
cleanup

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

I’m going to say review- because of my concerns about DragCaretController::nodeWillBeRemoved.

&gt; Source/WebCore/editing/FrameSelection.cpp:241
&gt; +void DragCaretController::nodeWillBeRemoved(Node* node)

Where is the call to this function?

&gt; Source/WebCore/editing/FrameSelection.cpp:246
&gt; +    if (node &amp;&amp; highestAncestor(node)-&gt;nodeType() == Node::DOCUMENT_FRAGMENT_NODE)

Seems much better to check if the highest ancestor is the document rather than specifically checking that it&apos;s a document fragment. I’m also wondering how the result of this would differ from the much faster inDocument check, which is not O(height) of the DOM tree. On the other hand, the drag caret is almost always non-visible, so the performance of this code will probably rarely be important.

&gt; Source/WebCore/editing/FrameSelection.cpp:249
&gt; +    if (removingNodeRemovesPosition(node, m_position.deepEquivalent())) {

We use early return for the other two conditions in this function. I suggest using it for this one too.

&gt; Source/WebCore/editing/FrameSelection.cpp:253
&gt; +        RefPtr&lt;Document&gt; document = m_position.deepEquivalent().anchorNode()-&gt;document();
&gt; +        document-&gt;updateStyleIfNeeded();
&gt; +        if (RenderView* view = toRenderView(document-&gt;renderer()))
&gt; +            view-&gt;clearSelection();

I&apos;d like to see this sharing code with FrameSelection::respondToNodeModification instead of having a copied and pasted version of the sequence.

&gt; Source/WebCore/editing/FrameSelection.cpp:1120
&gt; +    if (!node)
&gt; +        return false;
&gt; +    return !isTableElement(node) &amp;&amp; !editingIgnoresContent(node);

I think it would read better as a single return; seems you just moved the code, but still I would like that better.

&gt; Source/WebCore/editing/FrameSelection.h:54
&gt; +protected:

Nothing private? That seems like a mistake. Can anything be private? I think we absolutely should be making the data members private instead of protected, even if that does mean more code changes. Maybe in a followup?

&gt; Source/WebCore/editing/FrameSelection.h:90
&gt; +    bool isNone() const { return m_position.isNull(); }

I think this is an awkward function name. In the case of a selection where it can be none, caret, or range, this is barely tolerable, but in a caret class where it’s either a caret or no caret, “none” is a curious way to talk about things.

&gt; Source/WebCore/editing/FrameSelection.h:93
&gt; +    const VisiblePosition&amp; caret() { return m_position; }
&gt; +    void setCaret(const VisiblePosition&amp;);

In CaretBase functions, this is called “the caret position”, but here you are calling it “the caret”. I think we should use consistent terminology.

&gt; Source/WebCore/editing/FrameSelection.h:97
&gt; +private:

Please put a blank line before private:</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>400290</commentid>
    <comment_count>8</comment_count>
      <attachid>92518</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-05-08 13:54:05 -0700</bug_when>
    <thetext>Comment on attachment 92518
cleanup

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

&gt;&gt; Source/WebCore/editing/FrameSelection.cpp:241
&gt;&gt; +void DragCaretController::nodeWillBeRemoved(Node* node)
&gt; 
&gt; Where is the call to this function?

It&apos;s called in Document::nodeChildrenWillBeRemoved and Document::nodeWillBeRemoved.

&gt;&gt; Source/WebCore/editing/FrameSelection.cpp:246
&gt;&gt; +    if (node &amp;&amp; highestAncestor(node)-&gt;nodeType() == Node::DOCUMENT_FRAGMENT_NODE)
&gt; 
&gt; Seems much better to check if the highest ancestor is the document rather than specifically checking that it&apos;s a document fragment. I’m also wondering how the result of this would differ from the much faster inDocument check, which is not O(height) of the DOM tree. On the other hand, the drag caret is almost always non-visible, so the performance of this code will probably rarely be important.

You&apos;re right. We can just call inDocument here.

&gt;&gt; Source/WebCore/editing/FrameSelection.cpp:249
&gt;&gt; +    if (removingNodeRemovesPosition(node, m_position.deepEquivalent())) {
&gt; 
&gt; We use early return for the other two conditions in this function. I suggest using it for this one too.

Done.

&gt;&gt; Source/WebCore/editing/FrameSelection.cpp:253
&gt;&gt; +            view-&gt;clearSelection();
&gt; 
&gt; I&apos;d like to see this sharing code with FrameSelection::respondToNodeModification instead of having a copied and pasted version of the sequence.

Extracted clearRenderViewSelection.

&gt;&gt; Source/WebCore/editing/FrameSelection.cpp:1120
&gt;&gt; +    return !isTableElement(node) &amp;&amp; !editingIgnoresContent(node);
&gt; 
&gt; I think it would read better as a single return; seems you just moved the code, but still I would like that better.

Done.

&gt;&gt; Source/WebCore/editing/FrameSelection.h:54
&gt;&gt; +protected:
&gt; 
&gt; Nothing private? That seems like a mistake. Can anything be private? I think we absolutely should be making the data members private instead of protected, even if that does mean more code changes. Maybe in a followup?

Absolutely.  I wanted to make this changeset small and do a cleanup in a followup but I can do that here if you&apos;d prefer that.

&gt;&gt; Source/WebCore/editing/FrameSelection.h:90
&gt;&gt; +    bool isNone() const { return m_position.isNull(); }
&gt; 
&gt; I think this is an awkward function name. In the case of a selection where it can be none, caret, or range, this is barely tolerable, but in a caret class where it’s either a caret or no caret, “none” is a curious way to talk about things.

Removed this function and added hasCaret.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>400292</commentid>
    <comment_count>9</comment_count>
      <attachid>92747</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-05-08 13:55:52 -0700</bug_when>
    <thetext>Created attachment 92747
Fixed per comments</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>400304</commentid>
    <comment_count>10</comment_count>
      <attachid>92747</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2011-05-08 15:54:47 -0700</bug_when>
    <thetext>Comment on attachment 92747
Fixed per comments

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

&gt; Source/WebCore/editing/FrameSelection.cpp:155
&gt; +void DragCaretController::setCaretPosition(const VisiblePosition&amp; position)
&gt; +{
&gt; +    if (Node* node = m_position.deepEquivalent().containerNode())
&gt; +        invalidateCaretRect(node);
&gt; +    m_position = position;
&gt; +    m_caretRectNeedsUpdate = true;
&gt; +    Document* document = 0;
&gt; +    if (Node* node = m_position.deepEquivalent().containerNode()) {
&gt; +        invalidateCaretRect(node);
&gt; +        document = node-&gt;document();
&gt; +    }
&gt; +    updateCaretRect(document, m_position, m_position.isNotNull() ? VisibleSelection::CaretSelection : VisibleSelection::NoSelection, m_position.isOrphan());
&gt; +}

Should this function have an early exit for the case where the position is not changing?

&gt; Source/WebCore/editing/FrameSelection.cpp:261
&gt; +void FrameSelection::nodeWillBeRemoved(Node *node)

Should be Node* rather than Node *.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>400307</commentid>
    <comment_count>11</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-05-08 17:22:48 -0700</bug_when>
    <thetext>Thanks for the review!

(In reply to comment #10)
&gt; Should this function have an early exit for the case where the position is not changing?

That&apos;s a good point. Added.

&gt; &gt; Source/WebCore/editing/FrameSelection.cpp:261
&gt; &gt; +void FrameSelection::nodeWillBeRemoved(Node *node)
&gt; 
&gt; Should be Node* rather than Node *.

Fixed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>400308</commentid>
    <comment_count>12</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-05-08 17:40:18 -0700</bug_when>
    <thetext>Committed r86039: &lt;http://trac.webkit.org/changeset/86039&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>400328</commentid>
    <comment_count>13</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2011-05-08 19:55:58 -0700</bug_when>
    <thetext>http://trac.webkit.org/changeset/86039 might have broken SnowLeopard Intel Release (WebKit2 Tests)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>400613</commentid>
    <comment_count>14</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-05-09 11:45:43 -0700</bug_when>
    <thetext>(In reply to comment #11)
&gt; Thanks for the review!
&gt; 
&gt; (In reply to comment #10)
&gt; &gt; Should this function have an early exit for the case where the position is not changing?
&gt; 
&gt; That&apos;s a good point. Added.

It turned out that this wasn&apos;t so great.  Caret isn&apos;t drawn by drag caret controller anymore :(  I&apos;ll remove it in the follow up patch for the bug 60454.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>401778</commentid>
    <comment_count>15</comment_count>
    <who name="David Kilzer (:ddkilzer)">ddkilzer</who>
    <bug_when>2011-05-10 22:37:06 -0700</bug_when>
    <thetext>Build fix for !ENABLE(TEXT_CARET) committed as r86214.
&lt;http://trac.webkit.org/changeset/86214&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>401782</commentid>
    <comment_count>16</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-05-10 22:47:17 -0700</bug_when>
    <thetext>(In reply to comment #15)
&gt; Build fix for !ENABLE(TEXT_CARET) committed as r86214.
&gt; &lt;http://trac.webkit.org/changeset/86214&gt;

Oops, sorry about breaking the build &amp; thanks for the fix!</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>92503</attachid>
            <date>2011-05-05 17:04:23 -0700</date>
            <delta_ts>2011-05-05 18:09:25 -0700</delta_ts>
            <desc>work in progress</desc>
            <filename>wip60273</filename>
            <type>text/plain</type>
            <size>27303</size>
            <attacher name="Ryosuke Niwa">rniwa</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL1dlYkNvcmUuZXhwLmluCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJj
ZS9XZWJDb3JlL1dlYkNvcmUuZXhwLmluCShyZXZpc2lvbiA4NTg2NCkKKysrIFNvdXJjZS9XZWJD
b3JlL1dlYkNvcmUuZXhwLmluCSh3b3JraW5nIGNvcHkpCkBAIC0zNTYsNyArMzU2LDcgQEAKIF9f
Wk43V2ViQ29yZTE0RnJhbWVTZWxlY3Rpb242bW9kaWZ5RU5TMF8xMUVBbHRlcmF0aW9uRU5TXzE4
U2VsZWN0aW9uRGlyZWN0aW9uRU5TXzE1VGV4dEdyYW51bGFyaXR5RWIKIF9fWk43V2ViQ29yZTE0
RnJhbWVTZWxlY3Rpb241Y2xlYXJFdgogX19aTjdXZWJDb3JlMTRGcmFtZVNlbGVjdGlvbjlzZWxl
Y3RBbGxFdgotX19aTjdXZWJDb3JlMTRGcmFtZVNlbGVjdGlvbkMxRVBOU181RnJhbWVFYgorX19a
TjdXZWJDb3JlMTRGcmFtZVNlbGVjdGlvbkMxRVBOU181RnJhbWVFCiBfX1pON1dlYkNvcmUxNFJl
c291cmNlSGFuZGxlMTJyZWxlYXNlUHJveHlFdgogX19aTjdXZWJDb3JlMTRSZXNvdXJjZUhhbmRs
ZTIwZm9yY2VDb250ZW50U25pZmZpbmdFdgogX19aTjdXZWJDb3JlMTRSZXNvdXJjZUxvYWRlcjE0
Y2FuY2VsbGVkRXJyb3JFdgpJbmRleDogU291cmNlL1dlYkNvcmUvZWRpdGluZy9GcmFtZVNlbGVj
dGlvbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvZWRpdGluZy9GcmFtZVNlbGVj
dGlvbi5jcHAJKHJldmlzaW9uIDg1ODY0KQorKysgU291cmNlL1dlYkNvcmUvZWRpdGluZy9GcmFt
ZVNlbGVjdGlvbi5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTcwLDE4ICs3MCwzMSBAQAogCiBjb25z
dCBpbnQgTm9YUG9zRm9yVmVydGljYWxBcnJvd05hdmlnYXRpb24gPSBJTlRfTUlOOwogCi1GcmFt
ZVNlbGVjdGlvbjo6RnJhbWVTZWxlY3Rpb24oRnJhbWUqIGZyYW1lLCBib29sIGlzRHJhZ0NhcmV0
Q29udHJvbGxlcikKK0NhcmV0QmFzZTo6Q2FyZXRCYXNlKCkKKyAgICA6IG1fY2FyZXRSZWN0TmVl
ZHNVcGRhdGUodHJ1ZSkKKyAgICAsIG1fYWJzQ2FyZXRCb3VuZHNEaXJ0eSh0cnVlKQorICAgICwg
bV9jYXJldFZpc2libGUoZmFsc2UpCisgICAgLCBtX2NhcmV0UGFpbnQodHJ1ZSkKK3sKK30KKwor
RHJhZ0NhcmV0Q29udHJvbGxlcjo6RHJhZ0NhcmV0Q29udHJvbGxlcigpCit7CisgICAgbV9jYXJl
dFZpc2libGUgPSB0cnVlOworfQorCitib29sIERyYWdDYXJldENvbnRyb2xsZXI6OmlzQ29udGVu
dFJpY2hseUVkaXRhYmxlKCkgY29uc3QKK3sKKyAgICByZXR1cm4gaXNSaWNobHlFZGl0YWJsZVBv
c2l0aW9uKG1fcG9zaXRpb24uZGVlcEVxdWl2YWxlbnQoKSk7Cit9CisKK0ZyYW1lU2VsZWN0aW9u
OjpGcmFtZVNlbGVjdGlvbihGcmFtZSogZnJhbWUpCiAgICAgOiBtX2ZyYW1lKGZyYW1lKQogICAg
ICwgbV94UG9zRm9yVmVydGljYWxBcnJvd05hdmlnYXRpb24oTm9YUG9zRm9yVmVydGljYWxBcnJv
d05hdmlnYXRpb24pCiAgICAgLCBtX2dyYW51bGFyaXR5KENoYXJhY3RlckdyYW51bGFyaXR5KQog
ICAgICwgbV9jYXJldEJsaW5rVGltZXIodGhpcywgJkZyYW1lU2VsZWN0aW9uOjpjYXJldEJsaW5r
VGltZXJGaXJlZCkKLSAgICAsIG1fY2FyZXRSZWN0TmVlZHNVcGRhdGUodHJ1ZSkKLSAgICAsIG1f
YWJzQ2FyZXRCb3VuZHNEaXJ0eSh0cnVlKQotICAgICwgbV9pc0RyYWdDYXJldENvbnRyb2xsZXIo
aXNEcmFnQ2FyZXRDb250cm9sbGVyKQogICAgICwgbV9pc0NhcmV0QmxpbmtpbmdTdXNwZW5kZWQo
ZmFsc2UpCiAgICAgLCBtX2ZvY3VzZWQoZnJhbWUgJiYgZnJhbWUtPnBhZ2UoKSAmJiBmcmFtZS0+
cGFnZSgpLT5mb2N1c0NvbnRyb2xsZXIoKS0+Zm9jdXNlZEZyYW1lKCkgPT0gZnJhbWUpCi0gICAg
LCBtX2NhcmV0VmlzaWJsZShpc0RyYWdDYXJldENvbnRyb2xsZXIpCi0gICAgLCBtX2NhcmV0UGFp
bnQodHJ1ZSkKIHsKICAgICBzZXRJc0RpcmVjdGlvbmFsKGZhbHNlKTsKIH0KQEAgLTEyNyw2ICsx
NDAsMjAgQEAKICAgICBzZXRTZWxlY3Rpb24oVmlzaWJsZVNlbGVjdGlvbihiYXNlLCBleHRlbnQs
IGFmZmluaXR5KSwgb3B0aW9ucyk7CiB9CiAKK3ZvaWQgRHJhZ0NhcmV0Q29udHJvbGxlcjo6c2V0
Q2FyZXQoY29uc3QgVmlzaWJsZVBvc2l0aW9uJiBwb3NpdGlvbikKK3sKKyAgICBpZiAoTm9kZSog
bm9kZSA9IG1fcG9zaXRpb24uZGVlcEVxdWl2YWxlbnQoKS5jb250YWluZXJOb2RlKCkpCisgICAg
ICAgIGludmFsaWRhdGVDYXJldFJlY3Qobm9kZSk7CisgICAgbV9wb3NpdGlvbiA9IHBvc2l0aW9u
OworICAgIG1fY2FyZXRSZWN0TmVlZHNVcGRhdGUgPSB0cnVlOworICAgIERvY3VtZW50KiBkb2N1
bWVudCA9IDA7CisgICAgaWYgKE5vZGUqIG5vZGUgPSBtX3Bvc2l0aW9uLmRlZXBFcXVpdmFsZW50
KCkuY29udGFpbmVyTm9kZSgpKSB7CisgICAgICAgIGludmFsaWRhdGVDYXJldFJlY3Qobm9kZSk7
CisgICAgICAgIGRvY3VtZW50ID0gbm9kZS0+ZG9jdW1lbnQoKTsKKyAgICB9CisgICAgdXBkYXRl
Q2FyZXRSZWN0KGRvY3VtZW50LCBtX3Bvc2l0aW9uLCBtX3Bvc2l0aW9uLmlzTm90TnVsbCgpID8g
VmlzaWJsZVNlbGVjdGlvbjo6Q2FyZXRTZWxlY3Rpb24gOiBWaXNpYmxlU2VsZWN0aW9uOjpOb1Nl
bGVjdGlvbiwgbV9wb3NpdGlvbi5pc09ycGhhbigpKTsKK30KKwogdm9pZCBGcmFtZVNlbGVjdGlv
bjo6c2V0U2VsZWN0aW9uKGNvbnN0IFZpc2libGVTZWxlY3Rpb24mIHMsIFNldFNlbGVjdGlvbk9w
dGlvbnMgb3B0aW9ucywgQ3Vyc29yQWxpZ25PblNjcm9sbCBhbGlnbiwgVGV4dEdyYW51bGFyaXR5
IGdyYW51bGFyaXR5LCBEaXJlY3Rpb25hbGl0eVBvbGljeSBkaXJlY3Rpb25hbGl0eVBvbGljeSkK
IHsKICAgICBtX2dyYW51bGFyaXR5ID0gZ3JhbnVsYXJpdHk7CkBAIC0xMzcsMTQgKzE2NCw2IEBA
CiAKICAgICBzZXRJc0RpcmVjdGlvbmFsKGRpcmVjdGlvbmFsaXR5UG9saWN5ID09IE1ha2VEaXJl
Y3Rpb25hbFNlbGVjdGlvbik7CiAKLSAgICBpZiAobV9pc0RyYWdDYXJldENvbnRyb2xsZXIpIHsK
LSAgICAgICAgaW52YWxpZGF0ZUNhcmV0UmVjdCgpOwotICAgICAgICBtX3NlbGVjdGlvbiA9IHM7
Ci0gICAgICAgIG1fY2FyZXRSZWN0TmVlZHNVcGRhdGUgPSB0cnVlOwotICAgICAgICBpbnZhbGlk
YXRlQ2FyZXRSZWN0KCk7Ci0gICAgICAgIHVwZGF0ZUNhcmV0UmVjdCgpOwotICAgICAgICByZXR1
cm47Ci0gICAgfQogICAgIGlmICghbV9mcmFtZSkgewogICAgICAgICBtX3NlbGVjdGlvbiA9IHM7
CiAgICAgICAgIHJldHVybjsKQEAgLTIxOSw2ICsyMzgsMjQgQEAKICAgICByZXR1cm4gZWxlbWVu
dC0+Y29udGFpbnMocG9zaXRpb24uYW5jaG9yTm9kZSgpKSB8fCBlbGVtZW50LT5jb250YWlucyhw
b3NpdGlvbi5hbmNob3JOb2RlKCktPnNoYWRvd0FuY2VzdG9yTm9kZSgpKTsKIH0KIAordm9pZCBE
cmFnQ2FyZXRDb250cm9sbGVyOjpub2RlV2lsbEJlUmVtb3ZlZChOb2RlKiBub2RlKQoreworICAg
IGlmIChpc05vbmUoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKG5vZGUgJiYgaGlnaGVz
dEFuY2VzdG9yKG5vZGUpLT5ub2RlVHlwZSgpID09IE5vZGU6OkRPQ1VNRU5UX0ZSQUdNRU5UX05P
REUpCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChyZW1vdmluZ05vZGVSZW1vdmVzUG9zaXRp
b24obm9kZSwgbV9wb3NpdGlvbi5kZWVwRXF1aXZhbGVudCgpKSkgeworICAgICAgICBSZWZQdHI8
RG9jdW1lbnQ+IGRvY3VtZW50ID0gbV9wb3NpdGlvbi5kZWVwRXF1aXZhbGVudCgpLmFuY2hvck5v
ZGUoKS0+ZG9jdW1lbnQoKTsKKyAgICAgICAgZG9jdW1lbnQtPnVwZGF0ZVN0eWxlSWZOZWVkZWQo
KTsKKyAgICAgICAgaWYgKFJlbmRlclZpZXcqIHZpZXcgPSB0b1JlbmRlclZpZXcoZG9jdW1lbnQt
PnJlbmRlcmVyKCkpKQorICAgICAgICAgICAgdmlldy0+Y2xlYXJTZWxlY3Rpb24oKTsKKworICAg
ICAgICBjbGVhcigpOworICAgIH0KK30KKwogdm9pZCBGcmFtZVNlbGVjdGlvbjo6bm9kZVdpbGxC
ZVJlbW92ZWQoTm9kZSAqbm9kZSkKIHsKICAgICBpZiAoaXNOb25lKCkpCkBAIC03NTIsNyArNzg5
LDcgQEAKIGJvb2wgRnJhbWVTZWxlY3Rpb246Om1vZGlmeShFQWx0ZXJhdGlvbiBhbHRlciwgU2Vs
ZWN0aW9uRGlyZWN0aW9uIGRpcmVjdGlvbiwgVGV4dEdyYW51bGFyaXR5IGdyYW51bGFyaXR5LCBi
b29sIHVzZXJUcmlnZ2VyZWQpCiB7CiAgICAgaWYgKHVzZXJUcmlnZ2VyZWQpIHsKLSAgICAgICAg
RnJhbWVTZWxlY3Rpb24gdHJpYWxGcmFtZVNlbGVjdGlvbjsKKyAgICAgICAgRnJhbWVTZWxlY3Rp
b24gdHJpYWxGcmFtZVNlbGVjdGlvbigwKTsKICAgICAgICAgdHJpYWxGcmFtZVNlbGVjdGlvbi5z
ZXRTZWxlY3Rpb24obV9zZWxlY3Rpb24pOwogICAgICAgICB0cmlhbEZyYW1lU2VsZWN0aW9uLnNl
dElzRGlyZWN0aW9uYWwobV9pc0RpcmVjdGlvbmFsKTsKICAgICAgICAgdHJpYWxGcmFtZVNlbGVj
dGlvbi5tb2RpZnkoYWx0ZXIsIGRpcmVjdGlvbiwgZ3JhbnVsYXJpdHksIGZhbHNlKTsKQEAgLTg1
Niw3ICs4OTMsNyBAQAogICAgICAgICByZXR1cm4gZmFsc2U7CiAKICAgICBpZiAodXNlclRyaWdn
ZXJlZCkgewotICAgICAgICBGcmFtZVNlbGVjdGlvbiB0cmlhbEZyYW1lU2VsZWN0aW9uOworICAg
ICAgICBGcmFtZVNlbGVjdGlvbiB0cmlhbEZyYW1lU2VsZWN0aW9uKDApOwogICAgICAgICB0cmlh
bEZyYW1lU2VsZWN0aW9uLnNldFNlbGVjdGlvbihtX3NlbGVjdGlvbik7CiAgICAgICAgIHRyaWFs
RnJhbWVTZWxlY3Rpb24uc2V0SXNEaXJlY3Rpb25hbChtX2lzRGlyZWN0aW9uYWwpOwogICAgICAg
ICB0cmlhbEZyYW1lU2VsZWN0aW9uLm1vZGlmeShhbHRlciwgdmVydGljYWxEaXN0YW5jZSwgZmFs
c2UpOwpAQCAtMTAzMSwyOSArMTA2OCwyOCBAQAogICAgIG1fY2FyZXRSZWN0TmVlZHNVcGRhdGUg
PSBmbGFnOwogfQogCi12b2lkIEZyYW1lU2VsZWN0aW9uOjp1cGRhdGVDYXJldFJlY3QoKQordm9p
ZCBDYXJldEJhc2U6OnVwZGF0ZUNhcmV0UmVjdChEb2N1bWVudCogZG9jdW1lbnQsIGNvbnN0IFZp
c2libGVQb3NpdGlvbiYgY2FyZXRQb3NpdGlvbiwgVmlzaWJsZVNlbGVjdGlvbjo6U2VsZWN0aW9u
VHlwZSB0eXBlLCBib29sIGlzT3JwaGFuZWQpCiB7Ci0gICAgaWYgKGlzTm9uZSgpIHx8ICFtX3Nl
bGVjdGlvbi5zdGFydCgpLmFuY2hvck5vZGUoKS0+aW5Eb2N1bWVudCgpIHx8ICFtX3NlbGVjdGlv
bi5lbmQoKS5hbmNob3JOb2RlKCktPmluRG9jdW1lbnQoKSkgeworICAgIGlmICh0eXBlID09IFZp
c2libGVTZWxlY3Rpb246Ok5vU2VsZWN0aW9uIHx8IGlzT3JwaGFuZWQpIHsKICAgICAgICAgbV9j
YXJldFJlY3QgPSBJbnRSZWN0KCk7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBtX3Nl
bGVjdGlvbi5zdGFydCgpLmFuY2hvck5vZGUoKS0+ZG9jdW1lbnQoKS0+dXBkYXRlU3R5bGVJZk5l
ZWRlZCgpOworICAgIGRvY3VtZW50LT51cGRhdGVTdHlsZUlmTmVlZGVkKCk7CisKKyAgICBtX2Nh
cmV0UmVjdCA9IEludFJlY3QoKTsKICAgICAKLSAgICBtX2NhcmV0UmVjdCA9IEludFJlY3QoKTsK
LSAgICAgICAgCi0gICAgaWYgKGlzQ2FyZXQoKSkgewotICAgICAgICBWaXNpYmxlUG9zaXRpb24g
cG9zKG1fc2VsZWN0aW9uLnN0YXJ0KCksIG1fc2VsZWN0aW9uLmFmZmluaXR5KCkpOwotICAgICAg
ICBpZiAocG9zLmlzTm90TnVsbCgpKSB7Ci0gICAgICAgICAgICBBU1NFUlQocG9zLmRlZXBFcXVp
dmFsZW50KCkuZGVwcmVjYXRlZE5vZGUoKS0+cmVuZGVyZXIoKSk7Ci0gICAgICAgICAgICAKKyAg
ICBpZiAodHlwZSA9PSBWaXNpYmxlU2VsZWN0aW9uOjpDYXJldFNlbGVjdGlvbikgeworICAgICAg
ICBpZiAoY2FyZXRQb3NpdGlvbi5pc05vdE51bGwoKSkgeworICAgICAgICAgICAgQVNTRVJUKGNh
cmV0UG9zaXRpb24uZGVlcEVxdWl2YWxlbnQoKS5kZXByZWNhdGVkTm9kZSgpLT5yZW5kZXJlcigp
KTsKKwogICAgICAgICAgICAgLy8gRmlyc3QgY29tcHV0ZSBhIHJlY3QgbG9jYWwgdG8gdGhlIHJl
bmRlcmVyIGF0IHRoZSBzZWxlY3Rpb24gc3RhcnQKICAgICAgICAgICAgIFJlbmRlck9iamVjdCog
cmVuZGVyZXI7Ci0gICAgICAgICAgICBJbnRSZWN0IGxvY2FsUmVjdCA9IHBvcy5sb2NhbENhcmV0
UmVjdChyZW5kZXJlcik7CisgICAgICAgICAgICBJbnRSZWN0IGxvY2FsUmVjdCA9IGNhcmV0UG9z
aXRpb24ubG9jYWxDYXJldFJlY3QocmVuZGVyZXIpOwogCiAgICAgICAgICAgICAvLyBHZXQgdGhl
IHJlbmRlcmVyIHRoYXQgd2lsbCBiZSByZXNwb25zaWJsZSBmb3IgcGFpbnRpbmcgdGhlIGNhcmV0
ICh3aGljaAogICAgICAgICAgICAgLy8gaXMgZWl0aGVyIHRoZSByZW5kZXJlciB3ZSBqdXN0IGZv
dW5kLCBvciBvbmUgb2YgaXRzIGNvbnRhaW5lcnMpCi0gICAgICAgICAgICBSZW5kZXJPYmplY3Qq
IGNhcmV0UGFpbnRlciA9IGNhcmV0UmVuZGVyZXIoKTsKKyAgICAgICAgICAgIFJlbmRlck9iamVj
dCogY2FyZXRQYWludGVyID0gY2FyZXRSZW5kZXJlcihjYXJldFBvc2l0aW9uLmRlZXBFcXVpdmFs
ZW50KCkuZGVwcmVjYXRlZE5vZGUoKSk7CiAKICAgICAgICAgICAgIC8vIENvbXB1dGUgYW4gb2Zm
c2V0IGJldHdlZW4gdGhlIHJlbmRlcmVyIGFuZCB0aGUgY2FyZXRQYWludGVyCiAgICAgICAgICAg
ICBib29sIHVucm9vdGVkID0gZmFsc2U7CkBAIC0xMDc3LDEwICsxMTEzLDE2IEBACiAgICAgbV9j
YXJldFJlY3ROZWVkc1VwZGF0ZSA9IGZhbHNlOwogfQogCi1SZW5kZXJPYmplY3QqIEZyYW1lU2Vs
ZWN0aW9uOjpjYXJldFJlbmRlcmVyKCkgY29uc3QKK3N0YXRpYyBib29sIGNhcmV0UmVuZGVyc0lu
c2lkZU5vZGUoTm9kZSogbm9kZSkKIHsKLSAgICBOb2RlKiBub2RlID0gbV9zZWxlY3Rpb24uc3Rh
cnQoKS5kZXByZWNhdGVkTm9kZSgpOwogICAgIGlmICghbm9kZSkKKyAgICAgICAgcmV0dXJuIGZh
bHNlOworICAgIHJldHVybiAhaXNUYWJsZUVsZW1lbnQobm9kZSkgJiYgIWVkaXRpbmdJZ25vcmVz
Q29udGVudChub2RlKTsKK30KKworUmVuZGVyT2JqZWN0KiBDYXJldEJhc2U6OmNhcmV0UmVuZGVy
ZXIoTm9kZSogbm9kZSkgY29uc3QKK3sKKyAgICBpZiAoIW5vZGUpCiAgICAgICAgIHJldHVybiAw
OwogCiAgICAgUmVuZGVyT2JqZWN0KiByZW5kZXJlciA9IG5vZGUtPnJlbmRlcmVyKCk7CkBAIC0x
MDkyLDE3ICsxMTM0LDI5IEBACiAgICAgcmV0dXJuIHBhaW50ZWRCeUJsb2NrID8gcmVuZGVyZXIg
OiByZW5kZXJlci0+Y29udGFpbmluZ0Jsb2NrKCk7CiB9CiAKK1JlbmRlck9iamVjdCogRnJhbWVT
ZWxlY3Rpb246OmNhcmV0UmVuZGVyZXIoKSBjb25zdAoreworICAgIHJldHVybiBDYXJldEJhc2U6
OmNhcmV0UmVuZGVyZXIobV9zZWxlY3Rpb24uc3RhcnQoKS5kZXByZWNhdGVkTm9kZSgpKTsKK30K
KworUmVuZGVyT2JqZWN0KiBEcmFnQ2FyZXRDb250cm9sbGVyOjpjYXJldFJlbmRlcmVyKCkgY29u
c3QKK3sKKyAgICByZXR1cm4gQ2FyZXRCYXNlOjpjYXJldFJlbmRlcmVyKG1fcG9zaXRpb24uZGVl
cEVxdWl2YWxlbnQoKS5kZXByZWNhdGVkTm9kZSgpKTsKK30KKwogSW50UmVjdCBGcmFtZVNlbGVj
dGlvbjo6bG9jYWxDYXJldFJlY3QoKQogewotICAgIGlmIChtX2NhcmV0UmVjdE5lZWRzVXBkYXRl
KQotICAgICAgICB1cGRhdGVDYXJldFJlY3QoKTsKLSAgICAKKyAgICBpZiAobV9jYXJldFJlY3RO
ZWVkc1VwZGF0ZSkgeworICAgICAgICBib29sIGlzT3JwaGFuZWQgPSAhaXNOb25lKCkgJiYgKCFt
X3NlbGVjdGlvbi5zdGFydCgpLmFuY2hvck5vZGUoKS0+aW5Eb2N1bWVudCgpIHx8ICFtX3NlbGVj
dGlvbi5lbmQoKS5hbmNob3JOb2RlKCktPmluRG9jdW1lbnQoKSk7CisgICAgICAgIHVwZGF0ZUNh
cmV0UmVjdChtX2ZyYW1lLT5kb2N1bWVudCgpLCBWaXNpYmxlUG9zaXRpb24obV9zZWxlY3Rpb24u
c3RhcnQoKSwgbV9zZWxlY3Rpb24uYWZmaW5pdHkoKSksIG1fc2VsZWN0aW9uLnNlbGVjdGlvblR5
cGUoKSwgaXNPcnBoYW5lZCk7CisgICAgfQorCiAgICAgcmV0dXJuIG1fY2FyZXRSZWN0OwogfQog
Ci1JbnRSZWN0IEZyYW1lU2VsZWN0aW9uOjphYnNvbHV0ZUJvdW5kc0ZvckxvY2FsUmVjdChjb25z
dCBJbnRSZWN0JiByZWN0KSBjb25zdAorSW50UmVjdCBDYXJldEJhc2U6OmFic29sdXRlQm91bmRz
Rm9yTG9jYWxSZWN0KE5vZGUqIG5vZGUsIGNvbnN0IEludFJlY3QmIHJlY3QpIGNvbnN0CiB7Ci0g
ICAgUmVuZGVyT2JqZWN0KiBjYXJldFBhaW50ZXIgPSBjYXJldFJlbmRlcmVyKCk7CisgICAgUmVu
ZGVyT2JqZWN0KiBjYXJldFBhaW50ZXIgPSBjYXJldFJlbmRlcmVyKG5vZGUpOwogICAgIGlmICgh
Y2FyZXRQYWludGVyKQogICAgICAgICByZXR1cm4gSW50UmVjdCgpOwogICAgIApAQCAtMTEyOCw5
ICsxMTgyLDkgQEAKICAgICByZXR1cm4gY2FyZXQ7CiB9CiAKLUludFJlY3QgRnJhbWVTZWxlY3Rp
b246OmNhcmV0UmVwYWludFJlY3QoKSBjb25zdAorSW50UmVjdCBDYXJldEJhc2U6OmNhcmV0UmVw
YWludFJlY3QoTm9kZSogbm9kZSkgY29uc3QKIHsKLSAgICByZXR1cm4gYWJzb2x1dGVCb3VuZHNG
b3JMb2NhbFJlY3QocmVwYWludFJlY3RGb3JDYXJldChsb2NhbENhcmV0UmVjdEZvclBhaW50aW5n
KCkpKTsKKyAgICByZXR1cm4gYWJzb2x1dGVCb3VuZHNGb3JMb2NhbFJlY3Qobm9kZSwgcmVwYWlu
dFJlY3RGb3JDYXJldChsb2NhbENhcmV0UmVjdEZvclBhaW50aW5nKCkpKTsKIH0KIAogYm9vbCBG
cmFtZVNlbGVjdGlvbjo6cmVjb21wdXRlQ2FyZXRSZWN0KCkKQEAgLTExNDAsNyArMTE5NCw3IEBA
CiAKICAgICBpZiAoIW1fZnJhbWUpCiAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgCisK
ICAgICBGcmFtZVZpZXcqIHYgPSBtX2ZyYW1lLT5kb2N1bWVudCgpLT52aWV3KCk7CiAgICAgaWYg
KCF2KQogICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC0xMTUyLDcgKzEyMDYsNyBAQAogCiAgICAg
SW50UmVjdCBvbGRBYnNDYXJldEJvdW5kcyA9IG1fYWJzQ2FyZXRCb3VuZHM7CiAgICAgLy8gRklY
TUU6IFJlbmFtZSBtX2NhcmV0UmVjdCB0byBtX2xvY2FsQ2FyZXRSZWN0LgotICAgIG1fYWJzQ2Fy
ZXRCb3VuZHMgPSBhYnNvbHV0ZUJvdW5kc0ZvckxvY2FsUmVjdChtX2NhcmV0UmVjdCk7CisgICAg
bV9hYnNDYXJldEJvdW5kcyA9IGFic29sdXRlQm91bmRzRm9yTG9jYWxSZWN0KG1fc2VsZWN0aW9u
LnN0YXJ0KCkuZGVwcmVjYXRlZE5vZGUoKSwgbV9jYXJldFJlY3QpOwogICAgIG1fYWJzQ2FyZXRC
b3VuZHNEaXJ0eSA9IGZhbHNlOwogICAgIAogICAgIGlmIChvbGRBYnNDYXJldEJvdW5kcyA9PSBt
X2Fic0NhcmV0Qm91bmRzKQpAQCAtMTE2MCwyNSArMTIxNCwyNSBAQAogICAgICAgICAKICAgICBJ
bnRSZWN0IG9sZEFic29sdXRlQ2FyZXRSZXBhaW50Qm91bmRzID0gbV9hYnNvbHV0ZUNhcmV0UmVw
YWludEJvdW5kczsKICAgICAvLyBXZSBiZWxpZXZlIHRoYXQgd2UgbmVlZCB0byBpbmZsYXRlIHRo
ZSBsb2NhbCByZWN0IGJlZm9yZSB0cmFuc2Zvcm1pbmcgaXQgdG8gb2J0YWluIHRoZSByZXBhaW50
IGJvdW5kcy4KLSAgICBtX2Fic29sdXRlQ2FyZXRSZXBhaW50Qm91bmRzID0gY2FyZXRSZXBhaW50
UmVjdCgpOworICAgIG1fYWJzb2x1dGVDYXJldFJlcGFpbnRCb3VuZHMgPSBjYXJldFJlcGFpbnRS
ZWN0KG1fc2VsZWN0aW9uLnN0YXJ0KCkuZGVwcmVjYXRlZE5vZGUoKSk7CiAKICNpZiBFTkFCTEUo
VEVYVF9DQVJFVCkgICAgCiAgICAgaWYgKFJlbmRlclZpZXcqIHZpZXcgPSB0b1JlbmRlclZpZXco
bV9mcmFtZS0+ZG9jdW1lbnQoKS0+cmVuZGVyZXIoKSkpIHsKICAgICAgICAgLy8gRklYTUU6IG1h
a2UgY2FyZXQgcmVwYWludGluZyBjb250YWluZXItYXdhcmUuCiAgICAgICAgIHZpZXctPnJlcGFp
bnRSZWN0YW5nbGVJblZpZXdBbmRDb21wb3NpdGVkTGF5ZXJzKG9sZEFic29sdXRlQ2FyZXRSZXBh
aW50Qm91bmRzLCBmYWxzZSk7Ci0gICAgICAgIGlmIChzaG91bGRSZXBhaW50Q2FyZXQodmlldykp
CisgICAgICAgIGlmIChzaG91bGRSZXBhaW50Q2FyZXQodmlldywgaXNDb250ZW50RWRpdGFibGUo
KSkpCiAgICAgICAgICAgICB2aWV3LT5yZXBhaW50UmVjdGFuZ2xlSW5WaWV3QW5kQ29tcG9zaXRl
ZExheWVycyhtX2Fic29sdXRlQ2FyZXRSZXBhaW50Qm91bmRzLCBmYWxzZSk7CiAgICAgfQogI2Vu
ZGlmCiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLWJvb2wgRnJhbWVTZWxlY3Rpb246OnNob3VsZFJl
cGFpbnRDYXJldChjb25zdCBSZW5kZXJWaWV3KiB2aWV3KSBjb25zdAorYm9vbCBDYXJldEJhc2U6
OnNob3VsZFJlcGFpbnRDYXJldChjb25zdCBSZW5kZXJWaWV3KiB2aWV3LCBib29sIGlzQ29udGVu
dEVkaXRhYmxlKSBjb25zdAogewogICAgIEFTU0VSVCh2aWV3KTsKICAgICBGcmFtZSogZnJhbWUg
PSB2aWV3LT5mcmFtZVZpZXcoKSA/IHZpZXctPmZyYW1lVmlldygpLT5mcmFtZSgpIDogMDsgLy8g
VGhlIGZyYW1lIHdoZXJlIHRoZSBzZWxlY3Rpb24gc3RhcnRlZC4KICAgICBib29sIGNhcmV0QnJv
d3NpbmcgPSBmcmFtZSAmJiBmcmFtZS0+c2V0dGluZ3MoKSAmJiBmcmFtZS0+c2V0dGluZ3MoKS0+
Y2FyZXRCcm93c2luZ0VuYWJsZWQoKTsKLSAgICByZXR1cm4gKGNhcmV0QnJvd3NpbmcgfHwgaXND
b250ZW50RWRpdGFibGUoKSk7CisgICAgcmV0dXJuIChjYXJldEJyb3dzaW5nIHx8IGlzQ29udGVu
dEVkaXRhYmxlKTsKIH0KIAogdm9pZCBGcmFtZVNlbGVjdGlvbjo6aW52YWxpZGF0ZUNhcmV0UmVj
dCgpCkBAIC0xMTg2LDEyICsxMjQwLDExIEBACiAgICAgaWYgKCFpc0NhcmV0KCkpCiAgICAgICAg
IHJldHVybjsKIAotICAgIERvY3VtZW50KiBkID0gbV9zZWxlY3Rpb24uc3RhcnQoKS5hbmNob3JO
b2RlKCktPmRvY3VtZW50KCk7CisgICAgQ2FyZXRCYXNlOjppbnZhbGlkYXRlQ2FyZXRSZWN0KG1f
c2VsZWN0aW9uLnN0YXJ0KCkuZGVwcmVjYXRlZE5vZGUoKSwgcmVjb21wdXRlQ2FyZXRSZWN0KCkp
OworfQogCi0gICAgLy8gcmVjb21wdXRlQ2FyZXRSZWN0IHdpbGwgYWx3YXlzIHJldHVybiBmYWxz
ZSBmb3IgdGhlIGRyYWcgY2FyZXQsCi0gICAgLy8gYmVjYXVzZSBpdHMgbV9mcmFtZSBpcyBhbHdh
eXMgMC4KLSAgICBib29sIGNhcmV0UmVjdENoYW5nZWQgPSByZWNvbXB1dGVDYXJldFJlY3QoKTsK
LQordm9pZCBDYXJldEJhc2U6OmludmFsaWRhdGVDYXJldFJlY3QoTm9kZSogbm9kZSwgYm9vbCBj
YXJldFJlY3RDaGFuZ2VkKQorewogICAgIC8vIEVESVQgRklYTUU6IFRoaXMgaXMgYW4gdW5mb3J0
dW5hdGUgaGFjay4KICAgICAvLyBCYXNpY2FsbHksIHdlIGNhbid0IHRydXN0IHRoaXMgbGF5b3V0
IHBvc2l0aW9uIHNpbmNlIHdlIAogICAgIC8vIGNhbid0IGd1YXJhbnRlZSB0aGF0IHRoZSBjaGVj
ayB0byBzZWUgaWYgd2UgYXJlIGluIHVucmVuZGVyZWQgCkBAIC0xMjA2LDI1ICsxMjU5LDMyIEBA
CiAgICAgbV9jYXJldFJlY3ROZWVkc1VwZGF0ZSA9IHRydWU7CiAKICAgICBpZiAoIWNhcmV0UmVj
dENoYW5nZWQpIHsKLSAgICAgICAgUmVuZGVyVmlldyogdmlldyA9IHRvUmVuZGVyVmlldyhkLT5y
ZW5kZXJlcigpKTsKLSAgICAgICAgaWYgKHZpZXcgJiYgc2hvdWxkUmVwYWludENhcmV0KHZpZXcp
KQotICAgICAgICAgICAgdmlldy0+cmVwYWludFJlY3RhbmdsZUluVmlld0FuZENvbXBvc2l0ZWRM
YXllcnMoY2FyZXRSZXBhaW50UmVjdCgpLCBmYWxzZSk7CisgICAgICAgIFJlbmRlclZpZXcqIHZp
ZXcgPSB0b1JlbmRlclZpZXcobm9kZS0+ZG9jdW1lbnQoKS0+cmVuZGVyZXIoKSk7CisgICAgICAg
IGlmICh2aWV3ICYmIHNob3VsZFJlcGFpbnRDYXJldCh2aWV3LCBub2RlLT5pc0NvbnRlbnRFZGl0
YWJsZSgpKSkKKyAgICAgICAgICAgIHZpZXctPnJlcGFpbnRSZWN0YW5nbGVJblZpZXdBbmRDb21w
b3NpdGVkTGF5ZXJzKGNhcmV0UmVwYWludFJlY3Qobm9kZSksIGZhbHNlKTsKICAgICB9CiB9CiAK
IHZvaWQgRnJhbWVTZWxlY3Rpb246OnBhaW50Q2FyZXQoR3JhcGhpY3NDb250ZXh0KiBjb250ZXh0
LCBpbnQgdHgsIGludCB0eSwgY29uc3QgSW50UmVjdCYgY2xpcFJlY3QpCiB7CisgICAgaWYgKCFt
X3NlbGVjdGlvbi5pc0NhcmV0KCkpCisgICAgICAgIHJldHVybjsKKworICAgIENhcmV0QmFzZTo6
cGFpbnRDYXJldChtX3NlbGVjdGlvbi5zdGFydCgpLmRlcHJlY2F0ZWROb2RlKCksIGNvbnRleHQs
IHR4LCB0eSwgY2xpcFJlY3QpOworfQorCit2b2lkIENhcmV0QmFzZTo6cGFpbnRDYXJldChOb2Rl
KiBub2RlLCBHcmFwaGljc0NvbnRleHQqIGNvbnRleHQsIGludCB0eCwgaW50IHR5LCBjb25zdCBJ
bnRSZWN0JiBjbGlwUmVjdCkgY29uc3QKK3sKICNpZiBFTkFCTEUoVEVYVF9DQVJFVCkKICAgICBp
ZiAoIW1fY2FyZXRWaXNpYmxlKQogICAgICAgICByZXR1cm47CiAgICAgaWYgKCFtX2NhcmV0UGFp
bnQpCiAgICAgICAgIHJldHVybjsKLSAgICBpZiAoIW1fc2VsZWN0aW9uLmlzQ2FyZXQoKSkKLSAg
ICAgICAgcmV0dXJuOwogCiAgICAgSW50UmVjdCBkcmF3aW5nUmVjdCA9IGxvY2FsQ2FyZXRSZWN0
Rm9yUGFpbnRpbmcoKTsKLSAgICBpZiAoY2FyZXRSZW5kZXJlcigpICYmIGNhcmV0UmVuZGVyZXIo
KS0+aXNCb3goKSkKLSAgICAgICAgdG9SZW5kZXJCb3goY2FyZXRSZW5kZXJlcigpKS0+ZmxpcEZv
cldyaXRpbmdNb2RlKGRyYXdpbmdSZWN0KTsKKyAgICBSZW5kZXJPYmplY3QqIHJlbmRlcmVyID0g
Y2FyZXRSZW5kZXJlcihub2RlKTsKKyAgICBpZiAocmVuZGVyZXIgJiYgcmVuZGVyZXItPmlzQm94
KCkpCisgICAgICAgIHRvUmVuZGVyQm94KHJlbmRlcmVyKS0+ZmxpcEZvcldyaXRpbmdNb2RlKGRy
YXdpbmdSZWN0KTsKICAgICBkcmF3aW5nUmVjdC5tb3ZlKHR4LCB0eSk7CiAgICAgSW50UmVjdCBj
YXJldCA9IGludGVyc2VjdGlvbihkcmF3aW5nUmVjdCwgY2xpcFJlY3QpOwogICAgIGlmIChjYXJl
dC5pc0VtcHR5KCkpCkBAIC0xMjMyLDcgKzEyOTIsNyBAQAogCiAgICAgQ29sb3IgY2FyZXRDb2xv
ciA9IENvbG9yOjpibGFjazsKICAgICBDb2xvclNwYWNlIGNvbG9yU3BhY2UgPSBDb2xvclNwYWNl
RGV2aWNlUkdCOwotICAgIEVsZW1lbnQqIGVsZW1lbnQgPSByb290RWRpdGFibGVFbGVtZW50KCk7
CisgICAgRWxlbWVudCogZWxlbWVudCA9IG5vZGUtPnJvb3RFZGl0YWJsZUVsZW1lbnQoKTsKICAg
ICBpZiAoZWxlbWVudCAmJiBlbGVtZW50LT5yZW5kZXJlcigpKSB7CiAgICAgICAgIGNhcmV0Q29s
b3IgPSBlbGVtZW50LT5yZW5kZXJlcigpLT5zdHlsZSgpLT52aXNpdGVkRGVwZW5kZW50Q29sb3Io
Q1NTUHJvcGVydHlDb2xvcik7CiAgICAgICAgIGNvbG9yU3BhY2UgPSBlbGVtZW50LT5yZW5kZXJl
cigpLT5zdHlsZSgpLT5jb2xvclNwYWNlKCk7CkBAIC0xNDgwLDEzICsxNTQwLDYgQEAKICAgICBy
ZXR1cm4gc3RhdGljX2Nhc3Q8SFRNTElucHV0RWxlbWVudCo+KHN0YXJ0Tm9kZSktPmlzUGFzc3dv
cmRGaWVsZCgpOwogfQogCi1ib29sIEZyYW1lU2VsZWN0aW9uOjpjYXJldFJlbmRlcnNJbnNpZGVO
b2RlKE5vZGUqIG5vZGUpIGNvbnN0Ci17Ci0gICAgaWYgKCFub2RlKQotICAgICAgICByZXR1cm4g
ZmFsc2U7Ci0gICAgcmV0dXJuICFpc1RhYmxlRWxlbWVudChub2RlKSAmJiAhZWRpdGluZ0lnbm9y
ZXNDb250ZW50KG5vZGUpOwotfQotCiB2b2lkIEZyYW1lU2VsZWN0aW9uOjpmb2N1c2VkT3JBY3Rp
dmVTdGF0ZUNoYW5nZWQoKQogewogICAgIGJvb2wgYWN0aXZlQW5kRm9jdXNlZCA9IGlzRm9jdXNl
ZEFuZEFjdGl2ZSgpOwpAQCAtMTU1NSw4ICsxNjA4LDYgQEAKIAogdm9pZCBGcmFtZVNlbGVjdGlv
bjo6dXBkYXRlQXBwZWFyYW5jZSgpCiB7Ci0gICAgQVNTRVJUKCFtX2lzRHJhZ0NhcmV0Q29udHJv
bGxlcik7Ci0KICNpZiBFTkFCTEUoVEVYVF9DQVJFVCkKICAgICBib29sIGNhcmV0UmVjdENoYW5n
ZWQgPSByZWNvbXB1dGVDYXJldFJlY3QoKTsKIApAQCAtMTcwOSwxMyArMTc2MCwxMSBAQAogICAg
ICAgICBtX2ZyYW1lLT5wYWdlKCktPmZvY3VzQ29udHJvbGxlcigpLT5zZXRGb2N1c2VkTm9kZSgw
LCBtX2ZyYW1lKTsKIH0KIAotdm9pZCBGcmFtZVNlbGVjdGlvbjo6cGFpbnREcmFnQ2FyZXQoR3Jh
cGhpY3NDb250ZXh0KiBwLCBpbnQgdHgsIGludCB0eSwgY29uc3QgSW50UmVjdCYgY2xpcFJlY3Qp
IGNvbnN0Cit2b2lkIERyYWdDYXJldENvbnRyb2xsZXI6OnBhaW50RHJhZ0NhcmV0KEZyYW1lKiBm
cmFtZSwgR3JhcGhpY3NDb250ZXh0KiBwLCBpbnQgdHgsIGludCB0eSwgY29uc3QgSW50UmVjdCYg
Y2xpcFJlY3QpIGNvbnN0CiB7CiAjaWYgRU5BQkxFKFRFWFRfQ0FSRVQpCi0gICAgRnJhbWVTZWxl
Y3Rpb24qIGRyYWdDYXJldENvbnRyb2xsZXIgPSBtX2ZyYW1lLT5wYWdlKCktPmRyYWdDYXJldENv
bnRyb2xsZXIoKTsKLSAgICBBU1NFUlQoZHJhZ0NhcmV0Q29udHJvbGxlci0+c2VsZWN0aW9uKCku
aXNDYXJldCgpKTsKLSAgICBpZiAoZHJhZ0NhcmV0Q29udHJvbGxlci0+c2VsZWN0aW9uKCkuc3Rh
cnQoKS5hbmNob3JOb2RlKCktPmRvY3VtZW50KCktPmZyYW1lKCkgPT0gbV9mcmFtZSkKLSAgICAg
ICAgZHJhZ0NhcmV0Q29udHJvbGxlci0+cGFpbnRDYXJldChwLCB0eCwgdHksIGNsaXBSZWN0KTsK
KyAgICBpZiAobV9wb3NpdGlvbi5kZWVwRXF1aXZhbGVudCgpLmRlcHJlY2F0ZWROb2RlKCktPmRv
Y3VtZW50KCktPmZyYW1lKCkgPT0gZnJhbWUpCisgICAgICAgIHBhaW50Q2FyZXQobV9wb3NpdGlv
bi5kZWVwRXF1aXZhbGVudCgpLmRlcHJlY2F0ZWROb2RlKCksIHAsIHR4LCB0eSwgY2xpcFJlY3Qp
OwogI2Vsc2UKICAgICBVTlVTRURfUEFSQU0ocCk7CiAgICAgVU5VU0VEX1BBUkFNKHR4KTsKSW5k
ZXg6IFNvdXJjZS9XZWJDb3JlL2VkaXRpbmcvVHlwaW5nQ29tbWFuZC5jcHAKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gU291cmNlL1dlYkNvcmUvZWRpdGluZy9UeXBpbmdDb21tYW5kLmNwcAkocmV2aXNpb24gODU4
NjQpCisrKyBTb3VyY2UvV2ViQ29yZS9lZGl0aW5nL1R5cGluZ0NvbW1hbmQuY3BwCSh3b3JraW5n
IGNvcHkpCkBAIC00ODUsNyArNDg1LDcgQEAKIAogICAgICAgICBtX3NtYXJ0RGVsZXRlID0gZmFs
c2U7CiAKLSAgICAgICAgRnJhbWVTZWxlY3Rpb24gc2VsZWN0aW9uOworICAgICAgICBGcmFtZVNl
bGVjdGlvbiBzZWxlY3Rpb24oMCk7CiAgICAgICAgIHNlbGVjdGlvbi5zZXRTZWxlY3Rpb24oZW5k
aW5nU2VsZWN0aW9uKCkpOwogICAgICAgICBzZWxlY3Rpb24ubW9kaWZ5KEZyYW1lU2VsZWN0aW9u
OjpBbHRlcmF0aW9uRXh0ZW5kLCBEaXJlY3Rpb25CYWNrd2FyZCwgZ3JhbnVsYXJpdHkpOwogICAg
ICAgICBpZiAoa2lsbFJpbmcgJiYgc2VsZWN0aW9uLmlzQ2FyZXQoKSAmJiBncmFudWxhcml0eSAh
PSBDaGFyYWN0ZXJHcmFudWxhcml0eSkKQEAgLTU4Miw3ICs1ODIsNyBAQAogICAgICAgICAvLyBI
YW5kbGUgZGVsZXRlIGF0IGJlZ2lubmluZy1vZi1ibG9jayBjYXNlLgogICAgICAgICAvLyBEbyBu
b3RoaW5nIGluIHRoZSBjYXNlIHRoYXQgdGhlIGNhcmV0IGlzIGF0IHRoZSBzdGFydCBvZiBhCiAg
ICAgICAgIC8vIHJvb3QgZWRpdGFibGUgZWxlbWVudCBvciBhdCB0aGUgc3RhcnQgb2YgYSBkb2N1
bWVudC4KLSAgICAgICAgRnJhbWVTZWxlY3Rpb24gc2VsZWN0aW9uOworICAgICAgICBGcmFtZVNl
bGVjdGlvbiBzZWxlY3Rpb24oMCk7CiAgICAgICAgIHNlbGVjdGlvbi5zZXRTZWxlY3Rpb24oZW5k
aW5nU2VsZWN0aW9uKCkpOwogICAgICAgICBzZWxlY3Rpb24ubW9kaWZ5KEZyYW1lU2VsZWN0aW9u
OjpBbHRlcmF0aW9uRXh0ZW5kLCBEaXJlY3Rpb25Gb3J3YXJkLCBncmFudWxhcml0eSk7CiAgICAg
ICAgIGlmIChraWxsUmluZyAmJiBzZWxlY3Rpb24uaXNDYXJldCgpICYmIGdyYW51bGFyaXR5ICE9
IENoYXJhY3RlckdyYW51bGFyaXR5KQpJbmRleDogU291cmNlL1dlYkNvcmUvZWRpdGluZy9GcmFt
ZVNlbGVjdGlvbi5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2VkaXRpbmcvRnJhbWVT
ZWxlY3Rpb24uaAkocmV2aXNpb24gODU4NjQpCisrKyBTb3VyY2UvV2ViQ29yZS9lZGl0aW5nL0Zy
YW1lU2VsZWN0aW9uLmgJKHdvcmtpbmcgY29weSkKQEAgLTQ4LDcgKzQ4LDU3IEBACiAKIGVudW0g
RGlyZWN0aW9uYWxpdHlQb2xpY3kgeyBNYWtlTm9uRGlyZWN0aW9uYWxTZWxlY3Rpb24sIE1ha2VE
aXJlY3Rpb25hbFNlbGVjdGlvbiB9OwogCi1jbGFzcyBGcmFtZVNlbGVjdGlvbiB7CitjbGFzcyBD
YXJldEJhc2UgeworICAgIFdURl9NQUtFX05PTkNPUFlBQkxFKENhcmV0QmFzZSk7CisgICAgV1RG
X01BS0VfRkFTVF9BTExPQ0FURUQ7Citwcm90ZWN0ZWQ6CisgICAgQ2FyZXRCYXNlKCk7CisKKyAg
ICB2b2lkIGludmFsaWRhdGVDYXJldFJlY3QoTm9kZSosIGJvb2wgY2FyZXRSZWN0Q2hhbmdlZCA9
IGZhbHNlKTsKKyAgICB2b2lkIHVwZGF0ZUNhcmV0UmVjdChEb2N1bWVudCosIGNvbnN0IFZpc2li
bGVQb3NpdGlvbiYgY2FyZXRQb3NpdGlvbiwgVmlzaWJsZVNlbGVjdGlvbjo6U2VsZWN0aW9uVHlw
ZSB0eXBlLCBib29sIGlzT3JwaGFuZWQpOworICAgIEludFJlY3QgYWJzb2x1dGVCb3VuZHNGb3JM
b2NhbFJlY3QoTm9kZSosIGNvbnN0IEludFJlY3QmKSBjb25zdDsKKyAgICBJbnRSZWN0IGFic29s
dXRlQ2FyZXRCb3VuZHMoYm9vbCBpc0NvbnRlbnRFZGl0YWJsZSk7CisgICAgSW50UmVjdCBjYXJl
dFJlcGFpbnRSZWN0KE5vZGUqKSBjb25zdDsKKyAgICBib29sIHNob3VsZFJlcGFpbnRDYXJldChj
b25zdCBSZW5kZXJWaWV3KiB2aWV3LCBib29sIGlzQ29udGVudEVkaXRhYmxlKSBjb25zdDsKKwor
ICAgIEludFJlY3QgbG9jYWxDYXJldFJlY3RGb3JQYWludGluZygpIGNvbnN0IHsgcmV0dXJuIG1f
Y2FyZXRSZWN0OyB9CisgICAgdm9pZCBwYWludENhcmV0KE5vZGUqLCBHcmFwaGljc0NvbnRleHQq
IGNvbnRleHQsIGludCB0eCwgaW50IHR5LCBjb25zdCBJbnRSZWN0JiBjbGlwUmVjdCkgY29uc3Q7
CisKKyAgICBSZW5kZXJPYmplY3QqIGNhcmV0UmVuZGVyZXIoTm9kZSopIGNvbnN0OworCisgICAg
SW50UmVjdCBtX2NhcmV0UmVjdDsgLy8gY2FyZXQgcmVjdCBpbiBjb29yZHMgbG9jYWwgdG8gdGhl
IHJlbmRlcmVyIHJlc3BvbnNpYmxlIGZvciBwYWludGluZyB0aGUgY2FyZXQKKyAgICBJbnRSZWN0
IG1fYWJzQ2FyZXRCb3VuZHM7IC8vIGFic29sdXRlIGJvdW5kaW5nIHJlY3QgZm9yIHRoZSBjYXJl
dAorICAgIEludFJlY3QgbV9hYnNvbHV0ZUNhcmV0UmVwYWludEJvdW5kczsKKworICAgIGJvb2wg
bV9jYXJldFJlY3ROZWVkc1VwZGF0ZTsgLy8gdHJ1ZSBpZiBtX2NhcmV0UmVjdCBhbmQgbV9hYnND
YXJldEJvdW5kcyBuZWVkIHRvIGJlIGNhbGN1bGF0ZWQKKyAgICBib29sIG1fYWJzQ2FyZXRCb3Vu
ZHNEaXJ0eTsKKyAgICBib29sIG1fY2FyZXRWaXNpYmxlOworICAgIGJvb2wgbV9jYXJldFBhaW50
OworfTsKKworY2xhc3MgRHJhZ0NhcmV0Q29udHJvbGxlciA6IHByaXZhdGUgQ2FyZXRCYXNlIHsK
KyAgICBXVEZfTUFLRV9OT05DT1BZQUJMRShEcmFnQ2FyZXRDb250cm9sbGVyKTsKKyAgICBXVEZf
TUFLRV9GQVNUX0FMTE9DQVRFRDsKK3B1YmxpYzoKKyAgICBEcmFnQ2FyZXRDb250cm9sbGVyKCk7
CisKKyAgICBSZW5kZXJPYmplY3QqIGNhcmV0UmVuZGVyZXIoKSBjb25zdDsKKyAgICB2b2lkIHBh
aW50RHJhZ0NhcmV0KEZyYW1lKiBmcmFtZSwgR3JhcGhpY3NDb250ZXh0KiBwLCBpbnQgdHgsIGlu
dCB0eSwgY29uc3QgSW50UmVjdCYgY2xpcFJlY3QpIGNvbnN0OworCisgICAgYm9vbCBpc0NvbnRl
bnRFZGl0YWJsZSgpIGNvbnN0IHsgcmV0dXJuIG1fcG9zaXRpb24ucm9vdEVkaXRhYmxlRWxlbWVu
dCgpOyB9CisgICAgYm9vbCBpc0NvbnRlbnRSaWNobHlFZGl0YWJsZSgpIGNvbnN0OworICAgIGJv
b2wgaXNOb25lKCkgY29uc3QgeyByZXR1cm4gbV9wb3NpdGlvbi5pc051bGwoKTsgfQorCisgICAg
Y29uc3QgVmlzaWJsZVBvc2l0aW9uJiBjYXJldCgpIHsgcmV0dXJuIG1fcG9zaXRpb247IH0KKyAg
ICB2b2lkIHNldENhcmV0KGNvbnN0IFZpc2libGVQb3NpdGlvbiYpOworICAgIHZvaWQgY2xlYXIo
KSB7IHNldENhcmV0KFZpc2libGVQb3NpdGlvbigpKTsgfQorCisgICAgdm9pZCBub2RlV2lsbEJl
UmVtb3ZlZChOb2RlKik7Citwcml2YXRlOgorICAgIFZpc2libGVQb3NpdGlvbiBtX3Bvc2l0aW9u
OworfTsKKworY2xhc3MgRnJhbWVTZWxlY3Rpb24gOiBwcml2YXRlIENhcmV0QmFzZSB7CiAgICAg
V1RGX01BS0VfTk9OQ09QWUFCTEUoRnJhbWVTZWxlY3Rpb24pOwogICAgIFdURl9NQUtFX0ZBU1Rf
QUxMT0NBVEVEOwogcHVibGljOgpAQCAtNjMsNyArMTEzLDcgQEAKICAgICB9OwogICAgIHR5cGVk
ZWYgdW5zaWduZWQgU2V0U2VsZWN0aW9uT3B0aW9uczsKIAotICAgIEZyYW1lU2VsZWN0aW9uKEZy
YW1lKiA9IDAsIGJvb2wgaXNEcmFnQ2FyZXRDb250cm9sbGVyID0gZmFsc2UpOworICAgIEZyYW1l
U2VsZWN0aW9uKEZyYW1lKiA9IDApOwogCiAgICAgRWxlbWVudCogcm9vdEVkaXRhYmxlRWxlbWVu
dCgpIGNvbnN0IHsgcmV0dXJuIG1fc2VsZWN0aW9uLnJvb3RFZGl0YWJsZUVsZW1lbnQoKTsgfQog
ICAgIGJvb2wgaXNDb250ZW50RWRpdGFibGUoKSBjb25zdCB7IHJldHVybiBtX3NlbGVjdGlvbi5p
c0NvbnRlbnRFZGl0YWJsZSgpOyB9CkBAIC0xMTQsNyArMTY0LDYgQEAKIAogICAgIC8vIENhcmV0
IHJlY3QgbG9jYWwgdG8gdGhlIGNhcmV0J3MgcmVuZGVyZXIKICAgICBJbnRSZWN0IGxvY2FsQ2Fy
ZXRSZWN0KCk7Ci0gICAgSW50UmVjdCBsb2NhbENhcmV0UmVjdEZvclBhaW50aW5nKCkgY29uc3Qg
eyByZXR1cm4gbV9jYXJldFJlY3Q7IH0KIAogICAgIC8vIEJvdW5kcyBvZiAocG9zc2libHkgdHJh
bnNmb3JtZWQpIGNhcmV0IGluIGFic29sdXRlIGNvb3JkcwogICAgIEludFJlY3QgYWJzb2x1dGVD
YXJldEJvdW5kcygpOwpAQCAtMTM5LDcgKzE4OCw3IEBACiAKICAgICB2b2lkIHNldENhcmV0Vmlz
aWJsZShib29sID0gdHJ1ZSk7CiAgICAgdm9pZCBjbGVhckNhcmV0UmVjdElmTmVlZGVkKCk7Ci0g
ICAgYm9vbCByZWNvbXB1dGVDYXJldFJlY3QoKTsgLy8gcmV0dXJucyB0cnVlIGlmIGNhcmV0IHJl
Y3QgbW92ZWQKKyAgICBib29sIHJlY29tcHV0ZUNhcmV0UmVjdCgpOwogICAgIHZvaWQgaW52YWxp
ZGF0ZUNhcmV0UmVjdCgpOwogICAgIHZvaWQgcGFpbnRDYXJldChHcmFwaGljc0NvbnRleHQqLCBp
bnQgdHgsIGludCB0eSwgY29uc3QgSW50UmVjdCYgY2xpcFJlY3QpOwogCkBAIC0yMDMsMTggKzI1
MiwxMSBAQAogICAgIFZpc2libGVQb3NpdGlvbiBtb2RpZnlNb3ZpbmdMZWZ0KFRleHRHcmFudWxh
cml0eSk7CiAgICAgVmlzaWJsZVBvc2l0aW9uIG1vZGlmeU1vdmluZ0JhY2t3YXJkKFRleHRHcmFu
dWxhcml0eSk7CiAKLSAgICB2b2lkIHVwZGF0ZUNhcmV0UmVjdCgpOwotICAgIEludFJlY3QgY2Fy
ZXRSZXBhaW50UmVjdCgpIGNvbnN0OwotICAgIGJvb2wgc2hvdWxkUmVwYWludENhcmV0KGNvbnN0
IFJlbmRlclZpZXcqIHZpZXcpIGNvbnN0OwotCiAgICAgaW50IHhQb3NGb3JWZXJ0aWNhbEFycm93
TmF2aWdhdGlvbihFUG9zaXRpb25UeXBlKTsKICAgICAKICAgICB2b2lkIG5vdGlmeUFjY2Vzc2li
aWxpdHlGb3JTZWxlY3Rpb25DaGFuZ2UoKTsKIAogICAgIHZvaWQgZm9jdXNlZE9yQWN0aXZlU3Rh
dGVDaGFuZ2VkKCk7Ci0gICAgYm9vbCBjYXJldFJlbmRlcnNJbnNpZGVOb2RlKE5vZGUqKSBjb25z
dDsKLSAgICAKLSAgICBJbnRSZWN0IGFic29sdXRlQm91bmRzRm9yTG9jYWxSZWN0KGNvbnN0IElu
dFJlY3QmKSBjb25zdDsKIAogICAgIHZvaWQgY2FyZXRCbGlua1RpbWVyRmlyZWQoVGltZXI8RnJh
bWVTZWxlY3Rpb24+Kik7CiAKQEAgLTIzMSwxOCArMjczLDkgQEAKIAogICAgIFRpbWVyPEZyYW1l
U2VsZWN0aW9uPiBtX2NhcmV0QmxpbmtUaW1lcjsKIAotICAgIEludFJlY3QgbV9jYXJldFJlY3Q7
IC8vIGNhcmV0IHJlY3QgaW4gY29vcmRzIGxvY2FsIHRvIHRoZSByZW5kZXJlciByZXNwb25zaWJs
ZSBmb3IgcGFpbnRpbmcgdGhlIGNhcmV0Ci0gICAgSW50UmVjdCBtX2Fic0NhcmV0Qm91bmRzOyAv
LyBhYnNvbHV0ZSBib3VuZGluZyByZWN0IGZvciB0aGUgY2FyZXQKLSAgICBJbnRSZWN0IG1fYWJz
b2x1dGVDYXJldFJlcGFpbnRCb3VuZHM7Ci0gICAgCi0gICAgYm9vbCBtX2NhcmV0UmVjdE5lZWRz
VXBkYXRlOyAvLyB0cnVlIGlmIG1fY2FyZXRSZWN0IGFuZCBtX2Fic0NhcmV0Qm91bmRzIG5lZWQg
dG8gYmUgY2FsY3VsYXRlZAotICAgIGJvb2wgbV9hYnNDYXJldEJvdW5kc0RpcnR5OwogICAgIGJv
b2wgbV9pc0RpcmVjdGlvbmFsOwotICAgIGJvb2wgbV9pc0RyYWdDYXJldENvbnRyb2xsZXI7CiAg
ICAgYm9vbCBtX2lzQ2FyZXRCbGlua2luZ1N1c3BlbmRlZDsKICAgICBib29sIG1fZm9jdXNlZDsK
LSAgICBib29sIG1fY2FyZXRWaXNpYmxlOwotICAgIGJvb2wgbV9jYXJldFBhaW50OwogfTsKIAog
aW5saW5lIEVkaXRpbmdTdHlsZSogRnJhbWVTZWxlY3Rpb246OnR5cGluZ1N0eWxlKCkgY29uc3QK
SW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BhZ2UvRHJhZ0NvbnRyb2xsZXIuY3BwCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFNvdXJjZS9XZWJDb3JlL3BhZ2UvRHJhZ0NvbnRyb2xsZXIuY3BwCShyZXZpc2lvbiA4NTg2
NCkKKysrIFNvdXJjZS9XZWJDb3JlL3BhZ2UvRHJhZ0NvbnRyb2xsZXIuY3BwCSh3b3JraW5nIGNv
cHkpCkBAIC0zMzAsMTAgKzMzMCw4IEBACiAgICAgICAgIEVsZW1lbnQqIGVsZW1lbnQgPSBlbGVt
ZW50VW5kZXJNb3VzZShtX2RvY3VtZW50VW5kZXJNb3VzZS5nZXQoKSwgcG9pbnQpOwogICAgICAg
ICBpZiAoIWVsZW1lbnQpCiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGlmICgh
YXNGaWxlSW5wdXQoZWxlbWVudCkpIHsKLSAgICAgICAgICAgIFZpc2libGVTZWxlY3Rpb24gZHJh
Z0NhcmV0ID0gbV9kb2N1bWVudFVuZGVyTW91c2UtPmZyYW1lKCktPnZpc2libGVQb3NpdGlvbkZv
clBvaW50KHBvaW50KTsKLSAgICAgICAgICAgIG1fcGFnZS0+ZHJhZ0NhcmV0Q29udHJvbGxlcigp
LT5zZXRTZWxlY3Rpb24oZHJhZ0NhcmV0KTsKLSAgICAgICAgfQorICAgICAgICBpZiAoIWFzRmls
ZUlucHV0KGVsZW1lbnQpKQorICAgICAgICAgICAgbV9wYWdlLT5kcmFnQ2FyZXRDb250cm9sbGVy
KCktPnNldENhcmV0KG1fZG9jdW1lbnRVbmRlck1vdXNlLT5mcmFtZSgpLT52aXNpYmxlUG9zaXRp
b25Gb3JQb2ludChwb2ludCkpOwogCiAgICAgICAgIEZyYW1lKiBpbm5lckZyYW1lID0gZWxlbWVu
dC0+ZG9jdW1lbnQoKS0+ZnJhbWUoKTsKICAgICAgICAgb3BlcmF0aW9uID0gZHJhZ0lzTW92ZShp
bm5lckZyYW1lLT5zZWxlY3Rpb24oKSwgZHJhZ0RhdGEpID8gRHJhZ09wZXJhdGlvbk1vdmUgOiBE
cmFnT3BlcmF0aW9uQ29weTsKQEAgLTM3Myw5ICszNzEsOCBAQAogYm9vbCBEcmFnQ29udHJvbGxl
cjo6ZGlzcGF0Y2hUZXh0SW5wdXRFdmVudEZvcihGcmFtZSogaW5uZXJGcmFtZSwgRHJhZ0RhdGEq
IGRyYWdEYXRhKQogewogICAgIEFTU0VSVCghbV9wYWdlLT5kcmFnQ2FyZXRDb250cm9sbGVyKCkt
PmlzTm9uZSgpKTsKLSAgICBWaXNpYmxlU2VsZWN0aW9uIGRyYWdDYXJldChtX3BhZ2UtPmRyYWdD
YXJldENvbnRyb2xsZXIoKS0+c2VsZWN0aW9uKCkpOwotICAgIFN0cmluZyB0ZXh0ID0gZHJhZ0Nh
cmV0LmlzQ29udGVudFJpY2hseUVkaXRhYmxlKCkgPyAiIiA6IGRyYWdEYXRhLT5hc1BsYWluVGV4
dChpbm5lckZyYW1lKTsKLSAgICBOb2RlKiB0YXJnZXQgPSBpbm5lckZyYW1lLT5lZGl0b3IoKS0+
ZmluZEV2ZW50VGFyZ2V0RnJvbShkcmFnQ2FyZXQpOworICAgIFN0cmluZyB0ZXh0ID0gbV9wYWdl
LT5kcmFnQ2FyZXRDb250cm9sbGVyKCktPmlzQ29udGVudFJpY2hseUVkaXRhYmxlKCkgPyAiIiA6
IGRyYWdEYXRhLT5hc1BsYWluVGV4dChpbm5lckZyYW1lKTsKKyAgICBOb2RlKiB0YXJnZXQgPSBp
bm5lckZyYW1lLT5lZGl0b3IoKS0+ZmluZEV2ZW50VGFyZ2V0RnJvbShtX3BhZ2UtPmRyYWdDYXJl
dENvbnRyb2xsZXIoKS0+Y2FyZXQoKSk7CiAgICAgRXhjZXB0aW9uQ29kZSBlYyA9IDA7CiAgICAg
cmV0dXJuIHRhcmdldC0+ZGlzcGF0Y2hFdmVudChUZXh0RXZlbnQ6OmNyZWF0ZUZvckRyb3AoaW5u
ZXJGcmFtZS0+ZG9tV2luZG93KCksIHRleHQpLCBlYyk7CiB9CkBAIC00NDEsNyArNDM4LDcgQEAK
ICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCi0gICAgVmlzaWJsZVNlbGVjdGlvbiBkcmFn
Q2FyZXQobV9wYWdlLT5kcmFnQ2FyZXRDb250cm9sbGVyKCktPnNlbGVjdGlvbigpKTsKKyAgICBW
aXNpYmxlU2VsZWN0aW9uIGRyYWdDYXJldChtX3BhZ2UtPmRyYWdDYXJldENvbnRyb2xsZXIoKS0+
Y2FyZXQoKSk7CiAgICAgbV9wYWdlLT5kcmFnQ2FyZXRDb250cm9sbGVyKCktPmNsZWFyKCk7CiAg
ICAgUmVmUHRyPFJhbmdlPiByYW5nZSA9IGRyYWdDYXJldC50b05vcm1hbGl6ZWRSYW5nZSgpOwog
CkBAIC04NTEsOCArODQ4LDggQEAKICAgICBpZiAoIWZyYW1lVmlldykKICAgICAgICAgcmV0dXJu
OwogICAgIEludFBvaW50IGZyYW1lUG9pbnQgPSBmcmFtZVZpZXctPndpbmRvd1RvQ29udGVudHMo
d2luZG93UG9pbnQpOwotICAgIFZpc2libGVTZWxlY3Rpb24gZHJhZ0NhcmV0KGZyYW1lLT52aXNp
YmxlUG9zaXRpb25Gb3JQb2ludChmcmFtZVBvaW50KSk7Ci0gICAgbV9wYWdlLT5kcmFnQ2FyZXRD
b250cm9sbGVyKCktPnNldFNlbGVjdGlvbihkcmFnQ2FyZXQpOworCisgICAgbV9wYWdlLT5kcmFn
Q2FyZXRDb250cm9sbGVyKCktPnNldENhcmV0KGZyYW1lLT52aXNpYmxlUG9zaXRpb25Gb3JQb2lu
dChmcmFtZVBvaW50KSk7CiB9CiAKIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFNvdXJj
ZS9XZWJDb3JlL3BhZ2UvUGFnZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BhZ2Uv
UGFnZS5oCShyZXZpc2lvbiA4NTg2NCkKKysrIFNvdXJjZS9XZWJDb3JlL3BhZ2UvUGFnZS5oCSh3
b3JraW5nIGNvcHkpCkBAIC01NCw2ICs1NCw3IEBACiAgICAgY2xhc3MgRGV2aWNlT3JpZW50YXRp
b25DbGllbnQ7CiAgICAgY2xhc3MgRGV2aWNlT3JpZW50YXRpb25Db250cm9sbGVyOwogICAgIGNs
YXNzIERvY3VtZW50OworICAgIGNsYXNzIERyYWdDYXJldENvbnRyb2xsZXI7CiAgICAgY2xhc3Mg
RHJhZ0NsaWVudDsKICAgICBjbGFzcyBEcmFnQ29udHJvbGxlcjsKICAgICBjbGFzcyBFZGl0b3JD
bGllbnQ7CkBAIC0xNjUsNyArMTY2LDcgQEAKICAgICAgICAgaW50IGZyYW1lQ291bnQoKSBjb25z
dCB7IGNoZWNrRnJhbWVDb3VudENvbnNpc3RlbmN5KCk7IHJldHVybiBtX2ZyYW1lQ291bnQ7IH0K
IAogICAgICAgICBDaHJvbWUqIGNocm9tZSgpIGNvbnN0IHsgcmV0dXJuIG1fY2hyb21lLmdldCgp
OyB9Ci0gICAgICAgIEZyYW1lU2VsZWN0aW9uKiBkcmFnQ2FyZXRDb250cm9sbGVyKCkgY29uc3Qg
eyByZXR1cm4gbV9kcmFnQ2FyZXRDb250cm9sbGVyLmdldCgpOyB9CisgICAgICAgIERyYWdDYXJl
dENvbnRyb2xsZXIqIGRyYWdDYXJldENvbnRyb2xsZXIoKSBjb25zdCB7IHJldHVybiBtX2RyYWdD
YXJldENvbnRyb2xsZXIuZ2V0KCk7IH0KICNpZiBFTkFCTEUoRFJBR19TVVBQT1JUKQogICAgICAg
ICBEcmFnQ29udHJvbGxlciogZHJhZ0NvbnRyb2xsZXIoKSBjb25zdCB7IHJldHVybiBtX2RyYWdD
b250cm9sbGVyLmdldCgpOyB9CiAjZW5kaWYKQEAgLTMxNSw3ICszMTYsNyBAQAogICAgICAgICBk
b3VibGUgbWluaW11bVRpbWVySW50ZXJ2YWwoKSBjb25zdDsKIAogICAgICAgICBPd25QdHI8Q2hy
b21lPiBtX2Nocm9tZTsKLSAgICAgICAgT3duUHRyPEZyYW1lU2VsZWN0aW9uPiBtX2RyYWdDYXJl
dENvbnRyb2xsZXI7CisgICAgICAgIE93blB0cjxEcmFnQ2FyZXRDb250cm9sbGVyPiBtX2RyYWdD
YXJldENvbnRyb2xsZXI7CiAKICNpZiBFTkFCTEUoQUNDRUxFUkFURURfMkRfQ0FOVkFTKQogICAg
ICAgICBSZWZQdHI8U2hhcmVkR3JhcGhpY3NDb250ZXh0M0Q+IG1fc2hhcmVkR3JhcGhpY3NDb250
ZXh0M0Q7CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wYWdlL1BhZ2UuY3BwCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFNvdXJjZS9XZWJDb3JlL3BhZ2UvUGFnZS5jcHAJKHJldmlzaW9uIDg1ODY0KQorKysgU291cmNl
L1dlYkNvcmUvcGFnZS9QYWdlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMTE1LDcgKzExNSw3IEBA
CiAKIFBhZ2U6OlBhZ2UoY29uc3QgUGFnZUNsaWVudHMmIHBhZ2VDbGllbnRzKQogICAgIDogbV9j
aHJvbWUoYWRvcHRQdHIobmV3IENocm9tZSh0aGlzLCBwYWdlQ2xpZW50cy5jaHJvbWVDbGllbnQp
KSkKLSAgICAsIG1fZHJhZ0NhcmV0Q29udHJvbGxlcihhZG9wdFB0cihuZXcgRnJhbWVTZWxlY3Rp
b24oMCwgdHJ1ZSkpKQorICAgICwgbV9kcmFnQ2FyZXRDb250cm9sbGVyKGFkb3B0UHRyKG5ldyBE
cmFnQ2FyZXRDb250cm9sbGVyKSkKICNpZiBFTkFCTEUoRFJBR19TVVBQT1JUKQogICAgICwgbV9k
cmFnQ29udHJvbGxlcihhZG9wdFB0cihuZXcgRHJhZ0NvbnRyb2xsZXIodGhpcywgcGFnZUNsaWVu
dHMuZHJhZ0NsaWVudCkpKQogI2VuZGlmCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9hY2Nlc3NpYmls
aXR5L0FjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3QuY3BwCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9X
ZWJDb3JlL2FjY2Vzc2liaWxpdHkvQWNjZXNzaWJpbGl0eVJlbmRlck9iamVjdC5jcHAJKHJldmlz
aW9uIDg1ODY0KQorKysgU291cmNlL1dlYkNvcmUvYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5
UmVuZGVyT2JqZWN0LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjQzOSw3ICsyNDM5LDcgQEAKICAg
ICAvLyBOT1RFOiBpZ25vcmVzIHJlc3VsdHMgb2Ygc2VsLm1vZGlmeSBiZWNhdXNlIGl0IHJldHVy
bnMgZmFsc2Ugd2hlbgogICAgIC8vIHN0YXJ0aW5nIGF0IGFuIGVtcHR5IGxpbmUuICBUaGUgcmVz
dWx0aW5nIHNlbGVjdGlvbiBpbiB0aGF0IGNhc2UKICAgICAvLyB3aWxsIGJlIGEgY2FyZXQgYXQg
dmlzaWJsZVBvcy4KLSAgICBGcmFtZVNlbGVjdGlvbiBzZWxlY3Rpb247CisgICAgRnJhbWVTZWxl
Y3Rpb24gc2VsZWN0aW9uKDApOwogICAgIHNlbGVjdGlvbi5zZXRTZWxlY3Rpb24oVmlzaWJsZVNl
bGVjdGlvbih2aXNpYmxlUG9zKSk7CiAgICAgc2VsZWN0aW9uLm1vZGlmeShGcmFtZVNlbGVjdGlv
bjo6QWx0ZXJhdGlvbkV4dGVuZCwgRGlyZWN0aW9uUmlnaHQsIExpbmVCb3VuZGFyeSk7CiAgICAg
CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQmxvY2suY3BwCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCbG9jay5jcHAJKHJldmlzaW9u
IDg1ODY0KQorKysgU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJsb2NrLmNwcAkod29y
a2luZyBjb3B5KQpAQCAtMjQxNywxMiArMjQxNywxOSBAQAogCiB2b2lkIFJlbmRlckJsb2NrOjpw
YWludENhcmV0KFBhaW50SW5mbyYgcGFpbnRJbmZvLCBpbnQgdHgsIGludCB0eSwgQ2FyZXRUeXBl
IHR5cGUpCiB7Ci0gICAgRnJhbWVTZWxlY3Rpb24qIHNlbGVjdGlvbiA9IHR5cGUgPT0gQ3Vyc29y
Q2FyZXQgPyBmcmFtZSgpLT5zZWxlY3Rpb24oKSA6IGZyYW1lKCktPnBhZ2UoKS0+ZHJhZ0NhcmV0
Q29udHJvbGxlcigpOwotCiAgICAgLy8gUGFpbnQgdGhlIGNhcmV0IGlmIHRoZSBGcmFtZVNlbGVj
dGlvbiBzYXlzIHNvIG9yIGlmIGNhcmV0IGJyb3dzaW5nIGlzIGVuYWJsZWQKICAgICBib29sIGNh
cmV0QnJvd3NpbmcgPSBmcmFtZSgpLT5zZXR0aW5ncygpICYmIGZyYW1lKCktPnNldHRpbmdzKCkt
PmNhcmV0QnJvd3NpbmdFbmFibGVkKCk7Ci0gICAgUmVuZGVyT2JqZWN0KiBjYXJldFBhaW50ZXIg
PSBzZWxlY3Rpb24tPmNhcmV0UmVuZGVyZXIoKTsKLSAgICBpZiAoY2FyZXRQYWludGVyID09IHRo
aXMgJiYgKHNlbGVjdGlvbi0+aXNDb250ZW50RWRpdGFibGUoKSB8fCBjYXJldEJyb3dzaW5nKSkg
eworICAgIFJlbmRlck9iamVjdCogY2FyZXRQYWludGVyOworICAgIGJvb2wgaXNDb250ZW50RWRp
dGFibGU7CisgICAgaWYgKHR5cGUgPT0gQ3Vyc29yQ2FyZXQpIHsKKyAgICAgICAgY2FyZXRQYWlu
dGVyID0gZnJhbWUoKS0+c2VsZWN0aW9uKCktPmNhcmV0UmVuZGVyZXIoKTsKKyAgICAgICAgaXND
b250ZW50RWRpdGFibGUgPSBmcmFtZSgpLT5zZWxlY3Rpb24oKS0+aXNDb250ZW50RWRpdGFibGUo
KTsKKyAgICB9IGVsc2UgeworICAgICAgICBjYXJldFBhaW50ZXIgPSBmcmFtZSgpLT5wYWdlKCkt
PmRyYWdDYXJldENvbnRyb2xsZXIoKS0+Y2FyZXRSZW5kZXJlcigpOworICAgICAgICBpc0NvbnRl
bnRFZGl0YWJsZSA9IGZyYW1lKCktPnBhZ2UoKS0+ZHJhZ0NhcmV0Q29udHJvbGxlcigpLT5pc0Nv
bnRlbnRFZGl0YWJsZSgpOworICAgIH0KKworICAgIGlmIChjYXJldFBhaW50ZXIgPT0gdGhpcyAm
JiAoaXNDb250ZW50RWRpdGFibGUgfHwgY2FyZXRCcm93c2luZykpIHsKICAgICAgICAgLy8gQ29u
dmVydCB0aGUgcGFpbnRpbmcgb2Zmc2V0IGludG8gdGhlIGxvY2FsIGNvb3JkaW5hdGUgc3lzdGVt
IG9mIHRoaXMgcmVuZGVyZXIsCiAgICAgICAgIC8vIHRvIG1hdGNoIHRoZSBsb2NhbENhcmV0UmVj
dCBjb21wdXRlZCBieSB0aGUgRnJhbWVTZWxlY3Rpb24KICAgICAgICAgb2Zmc2V0Rm9yQ29udGVu
dHModHgsIHR5KTsKQEAgLTI0MzAsNyArMjQzNyw3IEBACiAgICAgICAgIGlmICh0eXBlID09IEN1
cnNvckNhcmV0KQogICAgICAgICAgICAgZnJhbWUoKS0+c2VsZWN0aW9uKCktPnBhaW50Q2FyZXQo
cGFpbnRJbmZvLmNvbnRleHQsIHR4LCB0eSwgcGFpbnRJbmZvLnJlY3QpOwogICAgICAgICBlbHNl
Ci0gICAgICAgICAgICBmcmFtZSgpLT5zZWxlY3Rpb24oKS0+cGFpbnREcmFnQ2FyZXQocGFpbnRJ
bmZvLmNvbnRleHQsIHR4LCB0eSwgcGFpbnRJbmZvLnJlY3QpOworICAgICAgICAgICAgZnJhbWUo
KS0+cGFnZSgpLT5kcmFnQ2FyZXRDb250cm9sbGVyKCktPnBhaW50RHJhZ0NhcmV0KGZyYW1lKCks
IHBhaW50SW5mby5jb250ZXh0LCB0eCwgdHksIHBhaW50SW5mby5yZWN0KTsKICAgICB9CiB9CiAK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>92518</attachid>
            <date>2011-05-05 18:09:29 -0700</date>
            <delta_ts>2011-05-08 13:55:47 -0700</delta_ts>
            <desc>cleanup</desc>
            <filename>bug-60273-20110505180927.patch</filename>
            <type>text/plain</type>
            <size>30552</size>
            <attacher name="Ryosuke Niwa">rniwa</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDg1OTA1KQorKysgU291cmNlL1dlYkNvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsNjYgQEAKKzIwMTEtMDUtMDUgIFJ5b3N1a2Ug
Tml3YSAgPHJuaXdhQHdlYmtpdC5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChP
T1BTISkuCisKKyAgICAgICAgRXh0cmFjdCBhIERyYWdDYXJldENvbnRyb2xsZXIgZnJvbSBGcmFt
ZVNlbGVjdGlvbgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/
aWQ9NjAyNzMKKworICAgICAgICBFeHRyYWN0ZWQgQ2FyZXRCYXNlIGFuZCBEcmFnQ2FyZXRDb250
cm9sbGVyIGZyb20gRnJhbWVTZWxlY3Rpb24uIENhcmV0QmFzZSBpcyBhIGJhc2UgY2xhc3MgZm9y
CisgICAgICAgIERyYWdDYXJldENvbnRyb2xsZXIgYW5kIEZyYW1lU2VsZWN0aW9uIGFuZCBwcm92
aWRlcyBmdW5jdGlvbnMgdG8gcGFpbnQgY2FyZXQuCisKKyAgICAgICAgU2luY2UgRHJhZ0NhcmV0
Q29udHJvbGxlciBkb2Vzbid0IG5lZWQgdG8gc3RvcmUgc2VsZWN0aW9uLCBpdCBvbmx5IGhvbGRz
IG9uZSBWaXNpYmxlUG9zaXRpb24uCisKKyAgICAgICAgKiBXZWJDb3JlLmV4cC5pbjogVGhlIHNp
Z25hdHVyZSBvZiBGcmFtZVNlbGVjdGlvbidzIGNvbnN0cnVjdG9yIGhhcyBiZWVuIGNoYW5nZWQu
CisgICAgICAgICogZWRpdGluZy9GcmFtZVNlbGVjdGlvbi5jcHA6CisgICAgICAgIChXZWJDb3Jl
OjpDYXJldEJhc2U6OkNhcmV0QmFzZSk6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6RHJhZ0Nh
cmV0Q29udHJvbGxlcjo6RHJhZ0NhcmV0Q29udHJvbGxlcik6IEFkZGVkLiBTZXQgbV9jYXJldFZp
c2libGUgdHJ1ZS4KKyAgICAgICAgKFdlYkNvcmU6OkRyYWdDYXJldENvbnRyb2xsZXI6OmlzQ29u
dGVudFJpY2hseUVkaXRhYmxlKTogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpGcmFtZVNlbGVj
dGlvbjo6RnJhbWVTZWxlY3Rpb24pOiBTZXZlcmFsIG1lbWJlciB2YXJpYWJsZXMgYXJlIG1vdmVk
IHRvIENhcmV0QmFzZS4KKyAgICAgICAgKFdlYkNvcmU6OkRyYWdDYXJldENvbnRyb2xsZXI6OnNl
dENhcmV0KTogRXh0cmFjdGVkIGZyb20gRnJhbWVTZWxlY3Rpb246OnNldFNlbGVjdGlvbi4KKyAg
ICAgICAgKFdlYkNvcmU6OkZyYW1lU2VsZWN0aW9uOjpzZXRTZWxlY3Rpb24pOiBSZW1vdmVkIGFu
IGVhcmx5IGV4aXQgZm9yIERyYWdDYXJldENvbnRyb2xsZXIuCisgICAgICAgIChXZWJDb3JlOjpE
cmFnQ2FyZXRDb250cm9sbGVyOjpub2RlV2lsbEJlUmVtb3ZlZCk6IEV4dHJhY3RlZCBmcm9tIEZy
YW1lU2VsZWN0aW9uOjpub2RlV2lsbEJlUmVtb3ZlZAorICAgICAgICBhbmQgcmVzcG9uZFRvTm9k
ZU1vZGlmaWNhdGlvbi4gTm90ZSB0aGF0IHRoZSBwb3NpdGlvbiBEcmFnQ2FyZXRDb250cm9sbGVy
IGhvbGRzIGlzIGVxdWl2YWxlbnQgdG8KKyAgICAgICAgRnJhbWVTZWxlY3Rpb24ncyBiYXNlIG9y
IHN0YXJ0IHNvIHdoZW4gcmVtb3ZpbmdOb2RlUmVtb3Zlc1Bvc2l0aW9uIHJldHVybnMgdHJ1ZSBm
b3IgbV9wb3NpdGlvbiwKKyAgICAgICAgd2UgdXNlZCB0byBleGVjdXRlIHRoZSBmaXJzdCBpZiBj
bGF1c2UgYW5kIGNsZWFyZWQgcmVuZGVyIHRyZWUgc2VsZWN0aW9uIGFuZCBET00gdHJlZSBzZWxl
Y3Rpb24uCisgICAgICAgIFRoaXMgaXMgZXhhY3RseSB3aGF0IG5ldyBEcmFnQ2FyZXRDb250cm9s
bGVyOjpub2RlV2lsbEJlUmVtb3ZlZCBkb2VzLgorICAgICAgICAoV2ViQ29yZTo6Q2FyZXRCYXNl
Ojp1cGRhdGVDYXJldFJlY3QpOiBUYWtlcyBkb2N1bWVudCwgY2FyZXRQb3NpdGlvbiwgc2VsZWN0
aW9uIHR5cGUsIGFuZCBib29sZWFuIGlzT3JwaGFuZWQuCisgICAgICAgIE5vdGUgdGhhdCB3ZSBj
YW4ndCBvYnRhaW4gdGhlIGRvY3VtZW50IGZyb20gY2FyZXRQb3NpdGlvbiBiZWNhdXNlIFZpc2li
bGVQb3NpdGlvbiBjYW4gYmUgbnVsbCBldmVuIGlmCisgICAgICAgIEZyYW1lU2VsZWN0aW9uJ3Mg
c3RhcnQgd2FzIG5vdCBudWxsLgorICAgICAgICAoV2ViQ29yZTo6Y2FyZXRSZW5kZXJzSW5zaWRl
Tm9kZSk6IE1vdmVkOyBNYWRlIHN0YXRpYyBsb2NhbC4KKyAgICAgICAgKFdlYkNvcmU6OkNhcmV0
QmFzZTo6Y2FyZXRSZW5kZXJlcik6IEV4dHJhY3RlZCBmcm9tIEZyYW1lU2VsZWN0aW9uOjpjYXJl
dFJlbmRlcmVyLgorICAgICAgICAoV2ViQ29yZTo6RnJhbWVTZWxlY3Rpb246OmNhcmV0UmVuZGVy
ZXIpOiBDYWxscyBDYXJldEJhc2U6OmNhcmV0UmVuZGVyZXIuCisgICAgICAgIChXZWJDb3JlOjpE
cmFnQ2FyZXRDb250cm9sbGVyOjpjYXJldFJlbmRlcmVyKTogRGl0dG8uCisgICAgICAgIChXZWJD
b3JlOjpGcmFtZVNlbGVjdGlvbjo6bG9jYWxDYXJldFJlY3QpOiBDYWxscyB1cGRhdGVDYXJldFJl
Y3Qgd2l0aCBleHRyYSBhcmd1bWVudHMuCisgICAgICAgIChXZWJDb3JlOjpDYXJldEJhc2U6OmFi
c29sdXRlQm91bmRzRm9yTG9jYWxSZWN0KTogTW92ZWQgZnJvbSBGcmFtZVNlbGVjdGlvbjsgVGFr
ZXMgTm9kZSouCisgICAgICAgIChXZWJDb3JlOjpDYXJldEJhc2U6OmNhcmV0UmVwYWludFJlY3Qp
OiBEaXR0by4KKyAgICAgICAgKFdlYkNvcmU6OkZyYW1lU2VsZWN0aW9uOjpyZWNvbXB1dGVDYXJl
dFJlY3QpOiBDYWxscyBhYnNvbHV0ZUJvdW5kc0ZvckxvY2FsUmVjdCwgY2FyZXRSZXBhaW50UmVj
dCwKKyAgICAgICAgYW5kIHNob3VsZFJlcGFpbnRDYXJldCB3aXRoIGV4dHJhIGFyZ3VtZW50cy4K
KyAgICAgICAgKFdlYkNvcmU6OkNhcmV0QmFzZTo6c2hvdWxkUmVwYWludENhcmV0KTogVGFrZXMg
YSBib29sZWFuIGlzQ29udGVudEVkaXRhYmxlLgorICAgICAgICAoV2ViQ29yZTo6RnJhbWVTZWxl
Y3Rpb246OmludmFsaWRhdGVDYXJldFJlY3QpOiBDYWxscyBDYXJldEJhc2U6OmludmFsaWRhdGVD
YXJldFJlY3QuCisgICAgICAgIChXZWJDb3JlOjpDYXJldEJhc2U6OmludmFsaWRhdGVDYXJldFJl
Y3QpOiBFeHRyYWN0ZWQgZnJvbSBGcmFtZVNlbGVjdGlvbjo6aW52YWxpZGF0ZUNhcmV0UmVjdC4K
KyAgICAgICAgKFdlYkNvcmU6OkZyYW1lU2VsZWN0aW9uOjpwYWludENhcmV0KTogQ2FsbHMgQ2Fy
ZXRCYXNlOjpwYWludENhcmV0LgorICAgICAgICAoV2ViQ29yZTo6Q2FyZXRCYXNlOjpwYWludENh
cmV0KTogRXh0cmFjdGVkIGZyb20gRnJhbWVTZWxlY3Rpb246OnBhaW50Q2FyZXQuCisgICAgICAg
IChXZWJDb3JlOjpGcmFtZVNlbGVjdGlvbjo6dXBkYXRlQXBwZWFyYW5jZSk6IFJlbW92ZWQgYW4g
YXNzZXJ0aW9uIHRoYXQgdGhpcyBmdW5jdGlvbiBpcyBuZXZlciBjYWxsZWQgZm9yCisgICAgICAg
IERyYWdDYXJldENvbnRyb2xsZXIuCisgICAgICAgIChXZWJDb3JlOjpEcmFnQ2FyZXRDb250cm9s
bGVyOjpwYWludERyYWdDYXJldCk6IE1vdmVkIGZyb20gRnJhbWVTZWxlY3Rpb246OnBhaW50RHJh
Z0NhcmV0LgorICAgICAgICAqIGVkaXRpbmcvRnJhbWVTZWxlY3Rpb24uaDoKKyAgICAgICAgKFdl
YkNvcmU6OkNhcmV0QmFzZTo6bG9jYWxDYXJldFJlY3RGb3JQYWludGluZyk6IEFkZGVkLgorICAg
ICAgICAoV2ViQ29yZTo6RHJhZ0NhcmV0Q29udHJvbGxlcjo6aXNDb250ZW50RWRpdGFibGUpOiBB
ZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OkRyYWdDYXJldENvbnRyb2xsZXI6OmlzTm9uZSk6IEFk
ZGVkLgorICAgICAgICAoV2ViQ29yZTo6RHJhZ0NhcmV0Q29udHJvbGxlcjo6Y2FyZXQpOiBBZGRl
ZC4KKyAgICAgICAgKFdlYkNvcmU6OkRyYWdDYXJldENvbnRyb2xsZXI6OmNsZWFyKTogQWRkZWQu
CisgICAgICAgICogcGFnZS9EcmFnQ29udHJvbGxlci5jcHA6CisgICAgICAgIChXZWJDb3JlOjpE
cmFnQ29udHJvbGxlcjo6dHJ5RG9jdW1lbnREcmFnKTogVXNlcyBEcmFnQ2FyZXRDb250cm9sbGVy
LgorICAgICAgICAoV2ViQ29yZTo6RHJhZ0NvbnRyb2xsZXI6OmRpc3BhdGNoVGV4dElucHV0RXZl
bnRGb3IpOiBEaXR0by4KKyAgICAgICAgKFdlYkNvcmU6OkRyYWdDb250cm9sbGVyOjpjb25jbHVk
ZUVkaXREcmFnKTogRGl0dG8uCisgICAgICAgIChXZWJDb3JlOjpEcmFnQ29udHJvbGxlcjo6cGxh
Y2VEcmFnQ2FyZXQpOiBEaXR0by4KKyAgICAgICAgKiBwYWdlL1BhZ2UuY3BwOgorICAgICAgICAo
V2ViQ29yZTo6UGFnZTo6UGFnZSk6IEluc3RhbnRpYXRlcyBEcmFnQ2FyZXRDb250cm9sbGVyIGlu
c3RlYWQgb2YgRnJhbWVTZWxlY3Rpb24uCisgICAgICAgICogcGFnZS9QYWdlLmg6CisgICAgICAg
IChXZWJDb3JlOjpQYWdlOjpkcmFnQ2FyZXRDb250cm9sbGVyKTogUmV0dXJucyBEcmFnQ2FyZXRD
b250cm9sbGVyKiBpbnN0ZWFkIG9mIEZyYW1lU2VsZWN0aW9uKi4KKyAgICAgICAgKiByZW5kZXJp
bmcvUmVuZGVyQmxvY2suY3BwOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2s6OnBhaW50
Q2FyZXQpOiBVc2VzIEZyYW1lU2VsZWN0aW9uIGFuZCBEcmFnQ2FyZXRDb250cm9sbGVyLgorCiAy
MDExLTA1LTA1ICBBbmR5IEVzdGVzICA8YWVzdGVzQGFwcGxlLmNvbT4KIAogICAgICAgICBSZXZp
ZXdlZCBieSBFcmljIFNlaWRlbC4KSW5kZXg6IFNvdXJjZS9XZWJDb3JlL1dlYkNvcmUuZXhwLmlu
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL1dlYkNvcmUuZXhwLmluCShyZXZpc2lvbiA4
NTg2NCkKKysrIFNvdXJjZS9XZWJDb3JlL1dlYkNvcmUuZXhwLmluCSh3b3JraW5nIGNvcHkpCkBA
IC0zNTYsNyArMzU2LDcgQEAgX19aTjdXZWJDb3JlMTRGcmFtZVNlbGVjdGlvbjIwc2V0U2VsZWN0
aQogX19aTjdXZWJDb3JlMTRGcmFtZVNlbGVjdGlvbjZtb2RpZnlFTlMwXzExRUFsdGVyYXRpb25F
TlNfMThTZWxlY3Rpb25EaXJlY3Rpb25FTlNfMTVUZXh0R3JhbnVsYXJpdHlFYgogX19aTjdXZWJD
b3JlMTRGcmFtZVNlbGVjdGlvbjVjbGVhckV2CiBfX1pON1dlYkNvcmUxNEZyYW1lU2VsZWN0aW9u
OXNlbGVjdEFsbEV2Ci1fX1pON1dlYkNvcmUxNEZyYW1lU2VsZWN0aW9uQzFFUE5TXzVGcmFtZUVi
CitfX1pON1dlYkNvcmUxNEZyYW1lU2VsZWN0aW9uQzFFUE5TXzVGcmFtZUUKIF9fWk43V2ViQ29y
ZTE0UmVzb3VyY2VIYW5kbGUxMnJlbGVhc2VQcm94eUV2CiBfX1pON1dlYkNvcmUxNFJlc291cmNl
SGFuZGxlMjBmb3JjZUNvbnRlbnRTbmlmZmluZ0V2CiBfX1pON1dlYkNvcmUxNFJlc291cmNlTG9h
ZGVyMTRjYW5jZWxsZWRFcnJvckV2CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9lZGl0aW5nL0ZyYW1l
U2VsZWN0aW9uLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9lZGl0aW5nL0ZyYW1l
U2VsZWN0aW9uLmNwcAkocmV2aXNpb24gODU4NjQpCisrKyBTb3VyY2UvV2ViQ29yZS9lZGl0aW5n
L0ZyYW1lU2VsZWN0aW9uLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNzAsMTggKzcwLDMxIEBAIHVz
aW5nIG5hbWVzcGFjZSBIVE1MTmFtZXM7CiAKIGNvbnN0IGludCBOb1hQb3NGb3JWZXJ0aWNhbEFy
cm93TmF2aWdhdGlvbiA9IElOVF9NSU47CiAKLUZyYW1lU2VsZWN0aW9uOjpGcmFtZVNlbGVjdGlv
bihGcmFtZSogZnJhbWUsIGJvb2wgaXNEcmFnQ2FyZXRDb250cm9sbGVyKQorQ2FyZXRCYXNlOjpD
YXJldEJhc2UoKQorICAgIDogbV9jYXJldFJlY3ROZWVkc1VwZGF0ZSh0cnVlKQorICAgICwgbV9h
YnNDYXJldEJvdW5kc0RpcnR5KHRydWUpCisgICAgLCBtX2NhcmV0VmlzaWJsZShmYWxzZSkKKyAg
ICAsIG1fY2FyZXRQYWludCh0cnVlKQoreworfQorCitEcmFnQ2FyZXRDb250cm9sbGVyOjpEcmFn
Q2FyZXRDb250cm9sbGVyKCkKK3sKKyAgICBtX2NhcmV0VmlzaWJsZSA9IHRydWU7Cit9CisKK2Jv
b2wgRHJhZ0NhcmV0Q29udHJvbGxlcjo6aXNDb250ZW50UmljaGx5RWRpdGFibGUoKSBjb25zdAor
eworICAgIHJldHVybiBpc1JpY2hseUVkaXRhYmxlUG9zaXRpb24obV9wb3NpdGlvbi5kZWVwRXF1
aXZhbGVudCgpKTsKK30KKworRnJhbWVTZWxlY3Rpb246OkZyYW1lU2VsZWN0aW9uKEZyYW1lKiBm
cmFtZSkKICAgICA6IG1fZnJhbWUoZnJhbWUpCiAgICAgLCBtX3hQb3NGb3JWZXJ0aWNhbEFycm93
TmF2aWdhdGlvbihOb1hQb3NGb3JWZXJ0aWNhbEFycm93TmF2aWdhdGlvbikKICAgICAsIG1fZ3Jh
bnVsYXJpdHkoQ2hhcmFjdGVyR3JhbnVsYXJpdHkpCiAgICAgLCBtX2NhcmV0QmxpbmtUaW1lcih0
aGlzLCAmRnJhbWVTZWxlY3Rpb246OmNhcmV0QmxpbmtUaW1lckZpcmVkKQotICAgICwgbV9jYXJl
dFJlY3ROZWVkc1VwZGF0ZSh0cnVlKQotICAgICwgbV9hYnNDYXJldEJvdW5kc0RpcnR5KHRydWUp
Ci0gICAgLCBtX2lzRHJhZ0NhcmV0Q29udHJvbGxlcihpc0RyYWdDYXJldENvbnRyb2xsZXIpCiAg
ICAgLCBtX2lzQ2FyZXRCbGlua2luZ1N1c3BlbmRlZChmYWxzZSkKICAgICAsIG1fZm9jdXNlZChm
cmFtZSAmJiBmcmFtZS0+cGFnZSgpICYmIGZyYW1lLT5wYWdlKCktPmZvY3VzQ29udHJvbGxlcigp
LT5mb2N1c2VkRnJhbWUoKSA9PSBmcmFtZSkKLSAgICAsIG1fY2FyZXRWaXNpYmxlKGlzRHJhZ0Nh
cmV0Q29udHJvbGxlcikKLSAgICAsIG1fY2FyZXRQYWludCh0cnVlKQogewogICAgIHNldElzRGly
ZWN0aW9uYWwoZmFsc2UpOwogfQpAQCAtMTI3LDYgKzE0MCwyMCBAQCB2b2lkIEZyYW1lU2VsZWN0
aW9uOjptb3ZlVG8oY29uc3QgUG9zaXRpCiAgICAgc2V0U2VsZWN0aW9uKFZpc2libGVTZWxlY3Rp
b24oYmFzZSwgZXh0ZW50LCBhZmZpbml0eSksIG9wdGlvbnMpOwogfQogCit2b2lkIERyYWdDYXJl
dENvbnRyb2xsZXI6OnNldENhcmV0KGNvbnN0IFZpc2libGVQb3NpdGlvbiYgcG9zaXRpb24pCit7
CisgICAgaWYgKE5vZGUqIG5vZGUgPSBtX3Bvc2l0aW9uLmRlZXBFcXVpdmFsZW50KCkuY29udGFp
bmVyTm9kZSgpKQorICAgICAgICBpbnZhbGlkYXRlQ2FyZXRSZWN0KG5vZGUpOworICAgIG1fcG9z
aXRpb24gPSBwb3NpdGlvbjsKKyAgICBtX2NhcmV0UmVjdE5lZWRzVXBkYXRlID0gdHJ1ZTsKKyAg
ICBEb2N1bWVudCogZG9jdW1lbnQgPSAwOworICAgIGlmIChOb2RlKiBub2RlID0gbV9wb3NpdGlv
bi5kZWVwRXF1aXZhbGVudCgpLmNvbnRhaW5lck5vZGUoKSkgeworICAgICAgICBpbnZhbGlkYXRl
Q2FyZXRSZWN0KG5vZGUpOworICAgICAgICBkb2N1bWVudCA9IG5vZGUtPmRvY3VtZW50KCk7Cisg
ICAgfQorICAgIHVwZGF0ZUNhcmV0UmVjdChkb2N1bWVudCwgbV9wb3NpdGlvbiwgbV9wb3NpdGlv
bi5pc05vdE51bGwoKSA/IFZpc2libGVTZWxlY3Rpb246OkNhcmV0U2VsZWN0aW9uIDogVmlzaWJs
ZVNlbGVjdGlvbjo6Tm9TZWxlY3Rpb24sIG1fcG9zaXRpb24uaXNPcnBoYW4oKSk7Cit9CisKIHZv
aWQgRnJhbWVTZWxlY3Rpb246OnNldFNlbGVjdGlvbihjb25zdCBWaXNpYmxlU2VsZWN0aW9uJiBz
LCBTZXRTZWxlY3Rpb25PcHRpb25zIG9wdGlvbnMsIEN1cnNvckFsaWduT25TY3JvbGwgYWxpZ24s
IFRleHRHcmFudWxhcml0eSBncmFudWxhcml0eSwgRGlyZWN0aW9uYWxpdHlQb2xpY3kgZGlyZWN0
aW9uYWxpdHlQb2xpY3kpCiB7CiAgICAgbV9ncmFudWxhcml0eSA9IGdyYW51bGFyaXR5OwpAQCAt
MTM3LDE0ICsxNjQsNiBAQCB2b2lkIEZyYW1lU2VsZWN0aW9uOjpzZXRTZWxlY3Rpb24oY29uc3Qg
CiAKICAgICBzZXRJc0RpcmVjdGlvbmFsKGRpcmVjdGlvbmFsaXR5UG9saWN5ID09IE1ha2VEaXJl
Y3Rpb25hbFNlbGVjdGlvbik7CiAKLSAgICBpZiAobV9pc0RyYWdDYXJldENvbnRyb2xsZXIpIHsK
LSAgICAgICAgaW52YWxpZGF0ZUNhcmV0UmVjdCgpOwotICAgICAgICBtX3NlbGVjdGlvbiA9IHM7
Ci0gICAgICAgIG1fY2FyZXRSZWN0TmVlZHNVcGRhdGUgPSB0cnVlOwotICAgICAgICBpbnZhbGlk
YXRlQ2FyZXRSZWN0KCk7Ci0gICAgICAgIHVwZGF0ZUNhcmV0UmVjdCgpOwotICAgICAgICByZXR1
cm47Ci0gICAgfQogICAgIGlmICghbV9mcmFtZSkgewogICAgICAgICBtX3NlbGVjdGlvbiA9IHM7
CiAgICAgICAgIHJldHVybjsKQEAgLTIxOSw2ICsyMzgsMjQgQEAgc3RhdGljIGJvb2wgcmVtb3Zp
bmdOb2RlUmVtb3Zlc1Bvc2l0aW9uKAogICAgIHJldHVybiBlbGVtZW50LT5jb250YWlucyhwb3Np
dGlvbi5hbmNob3JOb2RlKCkpIHx8IGVsZW1lbnQtPmNvbnRhaW5zKHBvc2l0aW9uLmFuY2hvck5v
ZGUoKS0+c2hhZG93QW5jZXN0b3JOb2RlKCkpOwogfQogCit2b2lkIERyYWdDYXJldENvbnRyb2xs
ZXI6Om5vZGVXaWxsQmVSZW1vdmVkKE5vZGUqIG5vZGUpCit7CisgICAgaWYgKGlzTm9uZSgpKQor
ICAgICAgICByZXR1cm47CisKKyAgICBpZiAobm9kZSAmJiBoaWdoZXN0QW5jZXN0b3Iobm9kZSkt
Pm5vZGVUeXBlKCkgPT0gTm9kZTo6RE9DVU1FTlRfRlJBR01FTlRfTk9ERSkKKyAgICAgICAgcmV0
dXJuOworCisgICAgaWYgKHJlbW92aW5nTm9kZVJlbW92ZXNQb3NpdGlvbihub2RlLCBtX3Bvc2l0
aW9uLmRlZXBFcXVpdmFsZW50KCkpKSB7CisgICAgICAgIFJlZlB0cjxEb2N1bWVudD4gZG9jdW1l
bnQgPSBtX3Bvc2l0aW9uLmRlZXBFcXVpdmFsZW50KCkuYW5jaG9yTm9kZSgpLT5kb2N1bWVudCgp
OworICAgICAgICBkb2N1bWVudC0+dXBkYXRlU3R5bGVJZk5lZWRlZCgpOworICAgICAgICBpZiAo
UmVuZGVyVmlldyogdmlldyA9IHRvUmVuZGVyVmlldyhkb2N1bWVudC0+cmVuZGVyZXIoKSkpCisg
ICAgICAgICAgICB2aWV3LT5jbGVhclNlbGVjdGlvbigpOworCisgICAgICAgIGNsZWFyKCk7Cisg
ICAgfQorfQorCiB2b2lkIEZyYW1lU2VsZWN0aW9uOjpub2RlV2lsbEJlUmVtb3ZlZChOb2RlICpu
b2RlKQogewogICAgIGlmIChpc05vbmUoKSkKQEAgLTEwMzEsMjkgKzEwNjgsMjggQEAgdm9pZCBG
cmFtZVNlbGVjdGlvbjo6c2V0Q2FyZXRSZWN0TmVlZHNVcAogICAgIG1fY2FyZXRSZWN0TmVlZHNV
cGRhdGUgPSBmbGFnOwogfQogCi12b2lkIEZyYW1lU2VsZWN0aW9uOjp1cGRhdGVDYXJldFJlY3Qo
KQordm9pZCBDYXJldEJhc2U6OnVwZGF0ZUNhcmV0UmVjdChEb2N1bWVudCogZG9jdW1lbnQsIGNv
bnN0IFZpc2libGVQb3NpdGlvbiYgY2FyZXRQb3NpdGlvbiwgVmlzaWJsZVNlbGVjdGlvbjo6U2Vs
ZWN0aW9uVHlwZSB0eXBlLCBib29sIGlzT3JwaGFuZWQpCiB7Ci0gICAgaWYgKGlzTm9uZSgpIHx8
ICFtX3NlbGVjdGlvbi5zdGFydCgpLmFuY2hvck5vZGUoKS0+aW5Eb2N1bWVudCgpIHx8ICFtX3Nl
bGVjdGlvbi5lbmQoKS5hbmNob3JOb2RlKCktPmluRG9jdW1lbnQoKSkgeworICAgIGlmICh0eXBl
ID09IFZpc2libGVTZWxlY3Rpb246Ok5vU2VsZWN0aW9uIHx8IGlzT3JwaGFuZWQpIHsKICAgICAg
ICAgbV9jYXJldFJlY3QgPSBJbnRSZWN0KCk7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAg
ICBtX3NlbGVjdGlvbi5zdGFydCgpLmFuY2hvck5vZGUoKS0+ZG9jdW1lbnQoKS0+dXBkYXRlU3R5
bGVJZk5lZWRlZCgpOwotICAgIAorICAgIGRvY3VtZW50LT51cGRhdGVTdHlsZUlmTmVlZGVkKCk7
CisKICAgICBtX2NhcmV0UmVjdCA9IEludFJlY3QoKTsKLSAgICAgICAgCi0gICAgaWYgKGlzQ2Fy
ZXQoKSkgewotICAgICAgICBWaXNpYmxlUG9zaXRpb24gcG9zKG1fc2VsZWN0aW9uLnN0YXJ0KCks
IG1fc2VsZWN0aW9uLmFmZmluaXR5KCkpOwotICAgICAgICBpZiAocG9zLmlzTm90TnVsbCgpKSB7
Ci0gICAgICAgICAgICBBU1NFUlQocG9zLmRlZXBFcXVpdmFsZW50KCkuZGVwcmVjYXRlZE5vZGUo
KS0+cmVuZGVyZXIoKSk7Ci0gICAgICAgICAgICAKKyAgICAKKyAgICBpZiAodHlwZSA9PSBWaXNp
YmxlU2VsZWN0aW9uOjpDYXJldFNlbGVjdGlvbikgeworICAgICAgICBpZiAoY2FyZXRQb3NpdGlv
bi5pc05vdE51bGwoKSkgeworICAgICAgICAgICAgQVNTRVJUKGNhcmV0UG9zaXRpb24uZGVlcEVx
dWl2YWxlbnQoKS5kZXByZWNhdGVkTm9kZSgpLT5yZW5kZXJlcigpKTsKKwogICAgICAgICAgICAg
Ly8gRmlyc3QgY29tcHV0ZSBhIHJlY3QgbG9jYWwgdG8gdGhlIHJlbmRlcmVyIGF0IHRoZSBzZWxl
Y3Rpb24gc3RhcnQKICAgICAgICAgICAgIFJlbmRlck9iamVjdCogcmVuZGVyZXI7Ci0gICAgICAg
ICAgICBJbnRSZWN0IGxvY2FsUmVjdCA9IHBvcy5sb2NhbENhcmV0UmVjdChyZW5kZXJlcik7Cisg
ICAgICAgICAgICBJbnRSZWN0IGxvY2FsUmVjdCA9IGNhcmV0UG9zaXRpb24ubG9jYWxDYXJldFJl
Y3QocmVuZGVyZXIpOwogCiAgICAgICAgICAgICAvLyBHZXQgdGhlIHJlbmRlcmVyIHRoYXQgd2ls
bCBiZSByZXNwb25zaWJsZSBmb3IgcGFpbnRpbmcgdGhlIGNhcmV0ICh3aGljaAogICAgICAgICAg
ICAgLy8gaXMgZWl0aGVyIHRoZSByZW5kZXJlciB3ZSBqdXN0IGZvdW5kLCBvciBvbmUgb2YgaXRz
IGNvbnRhaW5lcnMpCi0gICAgICAgICAgICBSZW5kZXJPYmplY3QqIGNhcmV0UGFpbnRlciA9IGNh
cmV0UmVuZGVyZXIoKTsKKyAgICAgICAgICAgIFJlbmRlck9iamVjdCogY2FyZXRQYWludGVyID0g
Y2FyZXRSZW5kZXJlcihjYXJldFBvc2l0aW9uLmRlZXBFcXVpdmFsZW50KCkuZGVwcmVjYXRlZE5v
ZGUoKSk7CiAKICAgICAgICAgICAgIC8vIENvbXB1dGUgYW4gb2Zmc2V0IGJldHdlZW4gdGhlIHJl
bmRlcmVyIGFuZCB0aGUgY2FyZXRQYWludGVyCiAgICAgICAgICAgICBib29sIHVucm9vdGVkID0g
ZmFsc2U7CkBAIC0xMDc3LDkgKzExMTMsMTUgQEAgdm9pZCBGcmFtZVNlbGVjdGlvbjo6dXBkYXRl
Q2FyZXRSZWN0KCkKICAgICBtX2NhcmV0UmVjdE5lZWRzVXBkYXRlID0gZmFsc2U7CiB9CiAKLVJl
bmRlck9iamVjdCogRnJhbWVTZWxlY3Rpb246OmNhcmV0UmVuZGVyZXIoKSBjb25zdAorc3RhdGlj
IGJvb2wgY2FyZXRSZW5kZXJzSW5zaWRlTm9kZShOb2RlKiBub2RlKQoreworICAgIGlmICghbm9k
ZSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiAhaXNUYWJsZUVsZW1lbnQobm9k
ZSkgJiYgIWVkaXRpbmdJZ25vcmVzQ29udGVudChub2RlKTsKK30KKworUmVuZGVyT2JqZWN0KiBD
YXJldEJhc2U6OmNhcmV0UmVuZGVyZXIoTm9kZSogbm9kZSkgY29uc3QKIHsKLSAgICBOb2RlKiBu
b2RlID0gbV9zZWxlY3Rpb24uc3RhcnQoKS5kZXByZWNhdGVkTm9kZSgpOwogICAgIGlmICghbm9k
ZSkKICAgICAgICAgcmV0dXJuIDA7CiAKQEAgLTEwOTIsMTcgKzExMzQsMjkgQEAgUmVuZGVyT2Jq
ZWN0KiBGcmFtZVNlbGVjdGlvbjo6Y2FyZXRSZW5kZQogICAgIHJldHVybiBwYWludGVkQnlCbG9j
ayA/IHJlbmRlcmVyIDogcmVuZGVyZXItPmNvbnRhaW5pbmdCbG9jaygpOwogfQogCitSZW5kZXJP
YmplY3QqIEZyYW1lU2VsZWN0aW9uOjpjYXJldFJlbmRlcmVyKCkgY29uc3QKK3sKKyAgICByZXR1
cm4gQ2FyZXRCYXNlOjpjYXJldFJlbmRlcmVyKG1fc2VsZWN0aW9uLnN0YXJ0KCkuZGVwcmVjYXRl
ZE5vZGUoKSk7Cit9CisKK1JlbmRlck9iamVjdCogRHJhZ0NhcmV0Q29udHJvbGxlcjo6Y2FyZXRS
ZW5kZXJlcigpIGNvbnN0Cit7CisgICAgcmV0dXJuIENhcmV0QmFzZTo6Y2FyZXRSZW5kZXJlciht
X3Bvc2l0aW9uLmRlZXBFcXVpdmFsZW50KCkuZGVwcmVjYXRlZE5vZGUoKSk7Cit9CisKIEludFJl
Y3QgRnJhbWVTZWxlY3Rpb246OmxvY2FsQ2FyZXRSZWN0KCkKIHsKLSAgICBpZiAobV9jYXJldFJl
Y3ROZWVkc1VwZGF0ZSkKLSAgICAgICAgdXBkYXRlQ2FyZXRSZWN0KCk7Ci0gICAgCisgICAgaWYg
KG1fY2FyZXRSZWN0TmVlZHNVcGRhdGUpIHsKKyAgICAgICAgYm9vbCBpc09ycGhhbmVkID0gIWlz
Tm9uZSgpICYmICghbV9zZWxlY3Rpb24uc3RhcnQoKS5hbmNob3JOb2RlKCktPmluRG9jdW1lbnQo
KSB8fCAhbV9zZWxlY3Rpb24uZW5kKCkuYW5jaG9yTm9kZSgpLT5pbkRvY3VtZW50KCkpOworICAg
ICAgICB1cGRhdGVDYXJldFJlY3QobV9mcmFtZS0+ZG9jdW1lbnQoKSwgVmlzaWJsZVBvc2l0aW9u
KG1fc2VsZWN0aW9uLnN0YXJ0KCksIG1fc2VsZWN0aW9uLmFmZmluaXR5KCkpLCBtX3NlbGVjdGlv
bi5zZWxlY3Rpb25UeXBlKCksIGlzT3JwaGFuZWQpOworICAgIH0KKwogICAgIHJldHVybiBtX2Nh
cmV0UmVjdDsKIH0KIAotSW50UmVjdCBGcmFtZVNlbGVjdGlvbjo6YWJzb2x1dGVCb3VuZHNGb3JM
b2NhbFJlY3QoY29uc3QgSW50UmVjdCYgcmVjdCkgY29uc3QKK0ludFJlY3QgQ2FyZXRCYXNlOjph
YnNvbHV0ZUJvdW5kc0ZvckxvY2FsUmVjdChOb2RlKiBub2RlLCBjb25zdCBJbnRSZWN0JiByZWN0
KSBjb25zdAogewotICAgIFJlbmRlck9iamVjdCogY2FyZXRQYWludGVyID0gY2FyZXRSZW5kZXJl
cigpOworICAgIFJlbmRlck9iamVjdCogY2FyZXRQYWludGVyID0gY2FyZXRSZW5kZXJlcihub2Rl
KTsKICAgICBpZiAoIWNhcmV0UGFpbnRlcikKICAgICAgICAgcmV0dXJuIEludFJlY3QoKTsKICAg
ICAKQEAgLTExMjgsOSArMTE4Miw5IEBAIHN0YXRpYyBJbnRSZWN0IHJlcGFpbnRSZWN0Rm9yQ2Fy
ZXQoSW50UmUKICAgICByZXR1cm4gY2FyZXQ7CiB9CiAKLUludFJlY3QgRnJhbWVTZWxlY3Rpb246
OmNhcmV0UmVwYWludFJlY3QoKSBjb25zdAorSW50UmVjdCBDYXJldEJhc2U6OmNhcmV0UmVwYWlu
dFJlY3QoTm9kZSogbm9kZSkgY29uc3QKIHsKLSAgICByZXR1cm4gYWJzb2x1dGVCb3VuZHNGb3JM
b2NhbFJlY3QocmVwYWludFJlY3RGb3JDYXJldChsb2NhbENhcmV0UmVjdEZvclBhaW50aW5nKCkp
KTsKKyAgICByZXR1cm4gYWJzb2x1dGVCb3VuZHNGb3JMb2NhbFJlY3Qobm9kZSwgcmVwYWludFJl
Y3RGb3JDYXJldChsb2NhbENhcmV0UmVjdEZvclBhaW50aW5nKCkpKTsKIH0KIAogYm9vbCBGcmFt
ZVNlbGVjdGlvbjo6cmVjb21wdXRlQ2FyZXRSZWN0KCkKQEAgLTExNDAsNyArMTE5NCw3IEBAIGJv
b2wgRnJhbWVTZWxlY3Rpb246OnJlY29tcHV0ZUNhcmV0UmVjdCgKIAogICAgIGlmICghbV9mcmFt
ZSkKICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAKKwogICAgIEZyYW1lVmlldyogdiA9
IG1fZnJhbWUtPmRvY3VtZW50KCktPnZpZXcoKTsKICAgICBpZiAoIXYpCiAgICAgICAgIHJldHVy
biBmYWxzZTsKQEAgLTExNTIsNyArMTIwNiw3IEBAIGJvb2wgRnJhbWVTZWxlY3Rpb246OnJlY29t
cHV0ZUNhcmV0UmVjdCgKIAogICAgIEludFJlY3Qgb2xkQWJzQ2FyZXRCb3VuZHMgPSBtX2Fic0Nh
cmV0Qm91bmRzOwogICAgIC8vIEZJWE1FOiBSZW5hbWUgbV9jYXJldFJlY3QgdG8gbV9sb2NhbENh
cmV0UmVjdC4KLSAgICBtX2Fic0NhcmV0Qm91bmRzID0gYWJzb2x1dGVCb3VuZHNGb3JMb2NhbFJl
Y3QobV9jYXJldFJlY3QpOworICAgIG1fYWJzQ2FyZXRCb3VuZHMgPSBhYnNvbHV0ZUJvdW5kc0Zv
ckxvY2FsUmVjdChtX3NlbGVjdGlvbi5zdGFydCgpLmRlcHJlY2F0ZWROb2RlKCksIG1fY2FyZXRS
ZWN0KTsKICAgICBtX2Fic0NhcmV0Qm91bmRzRGlydHkgPSBmYWxzZTsKICAgICAKICAgICBpZiAo
b2xkQWJzQ2FyZXRCb3VuZHMgPT0gbV9hYnNDYXJldEJvdW5kcykKQEAgLTExNjAsMjUgKzEyMTQs
MjUgQEAgYm9vbCBGcmFtZVNlbGVjdGlvbjo6cmVjb21wdXRlQ2FyZXRSZWN0KAogICAgICAgICAK
ICAgICBJbnRSZWN0IG9sZEFic29sdXRlQ2FyZXRSZXBhaW50Qm91bmRzID0gbV9hYnNvbHV0ZUNh
cmV0UmVwYWludEJvdW5kczsKICAgICAvLyBXZSBiZWxpZXZlIHRoYXQgd2UgbmVlZCB0byBpbmZs
YXRlIHRoZSBsb2NhbCByZWN0IGJlZm9yZSB0cmFuc2Zvcm1pbmcgaXQgdG8gb2J0YWluIHRoZSBy
ZXBhaW50IGJvdW5kcy4KLSAgICBtX2Fic29sdXRlQ2FyZXRSZXBhaW50Qm91bmRzID0gY2FyZXRS
ZXBhaW50UmVjdCgpOworICAgIG1fYWJzb2x1dGVDYXJldFJlcGFpbnRCb3VuZHMgPSBjYXJldFJl
cGFpbnRSZWN0KG1fc2VsZWN0aW9uLnN0YXJ0KCkuZGVwcmVjYXRlZE5vZGUoKSk7CiAKICNpZiBF
TkFCTEUoVEVYVF9DQVJFVCkgICAgCiAgICAgaWYgKFJlbmRlclZpZXcqIHZpZXcgPSB0b1JlbmRl
clZpZXcobV9mcmFtZS0+ZG9jdW1lbnQoKS0+cmVuZGVyZXIoKSkpIHsKICAgICAgICAgLy8gRklY
TUU6IG1ha2UgY2FyZXQgcmVwYWludGluZyBjb250YWluZXItYXdhcmUuCiAgICAgICAgIHZpZXct
PnJlcGFpbnRSZWN0YW5nbGVJblZpZXdBbmRDb21wb3NpdGVkTGF5ZXJzKG9sZEFic29sdXRlQ2Fy
ZXRSZXBhaW50Qm91bmRzLCBmYWxzZSk7Ci0gICAgICAgIGlmIChzaG91bGRSZXBhaW50Q2FyZXQo
dmlldykpCisgICAgICAgIGlmIChzaG91bGRSZXBhaW50Q2FyZXQodmlldywgaXNDb250ZW50RWRp
dGFibGUoKSkpCiAgICAgICAgICAgICB2aWV3LT5yZXBhaW50UmVjdGFuZ2xlSW5WaWV3QW5kQ29t
cG9zaXRlZExheWVycyhtX2Fic29sdXRlQ2FyZXRSZXBhaW50Qm91bmRzLCBmYWxzZSk7CiAgICAg
fQogI2VuZGlmCiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLWJvb2wgRnJhbWVTZWxlY3Rpb246OnNo
b3VsZFJlcGFpbnRDYXJldChjb25zdCBSZW5kZXJWaWV3KiB2aWV3KSBjb25zdAorYm9vbCBDYXJl
dEJhc2U6OnNob3VsZFJlcGFpbnRDYXJldChjb25zdCBSZW5kZXJWaWV3KiB2aWV3LCBib29sIGlz
Q29udGVudEVkaXRhYmxlKSBjb25zdAogewogICAgIEFTU0VSVCh2aWV3KTsKICAgICBGcmFtZSog
ZnJhbWUgPSB2aWV3LT5mcmFtZVZpZXcoKSA/IHZpZXctPmZyYW1lVmlldygpLT5mcmFtZSgpIDog
MDsgLy8gVGhlIGZyYW1lIHdoZXJlIHRoZSBzZWxlY3Rpb24gc3RhcnRlZC4KICAgICBib29sIGNh
cmV0QnJvd3NpbmcgPSBmcmFtZSAmJiBmcmFtZS0+c2V0dGluZ3MoKSAmJiBmcmFtZS0+c2V0dGlu
Z3MoKS0+Y2FyZXRCcm93c2luZ0VuYWJsZWQoKTsKLSAgICByZXR1cm4gKGNhcmV0QnJvd3Npbmcg
fHwgaXNDb250ZW50RWRpdGFibGUoKSk7CisgICAgcmV0dXJuIChjYXJldEJyb3dzaW5nIHx8IGlz
Q29udGVudEVkaXRhYmxlKTsKIH0KIAogdm9pZCBGcmFtZVNlbGVjdGlvbjo6aW52YWxpZGF0ZUNh
cmV0UmVjdCgpCkBAIC0xMTg2LDEyICsxMjQwLDExIEBAIHZvaWQgRnJhbWVTZWxlY3Rpb246Omlu
dmFsaWRhdGVDYXJldFJlY3QKICAgICBpZiAoIWlzQ2FyZXQoKSkKICAgICAgICAgcmV0dXJuOwog
Ci0gICAgRG9jdW1lbnQqIGQgPSBtX3NlbGVjdGlvbi5zdGFydCgpLmFuY2hvck5vZGUoKS0+ZG9j
dW1lbnQoKTsKLQotICAgIC8vIHJlY29tcHV0ZUNhcmV0UmVjdCB3aWxsIGFsd2F5cyByZXR1cm4g
ZmFsc2UgZm9yIHRoZSBkcmFnIGNhcmV0LAotICAgIC8vIGJlY2F1c2UgaXRzIG1fZnJhbWUgaXMg
YWx3YXlzIDAuCi0gICAgYm9vbCBjYXJldFJlY3RDaGFuZ2VkID0gcmVjb21wdXRlQ2FyZXRSZWN0
KCk7CisgICAgQ2FyZXRCYXNlOjppbnZhbGlkYXRlQ2FyZXRSZWN0KG1fc2VsZWN0aW9uLnN0YXJ0
KCkuZGVwcmVjYXRlZE5vZGUoKSwgcmVjb21wdXRlQ2FyZXRSZWN0KCkpOworfQogCit2b2lkIENh
cmV0QmFzZTo6aW52YWxpZGF0ZUNhcmV0UmVjdChOb2RlKiBub2RlLCBib29sIGNhcmV0UmVjdENo
YW5nZWQpCit7CiAgICAgLy8gRURJVCBGSVhNRTogVGhpcyBpcyBhbiB1bmZvcnR1bmF0ZSBoYWNr
LgogICAgIC8vIEJhc2ljYWxseSwgd2UgY2FuJ3QgdHJ1c3QgdGhpcyBsYXlvdXQgcG9zaXRpb24g
c2luY2Ugd2UgCiAgICAgLy8gY2FuJ3QgZ3VhcmFudGVlIHRoYXQgdGhlIGNoZWNrIHRvIHNlZSBp
ZiB3ZSBhcmUgaW4gdW5yZW5kZXJlZCAKQEAgLTEyMDYsMjUgKzEyNTksMzIgQEAgdm9pZCBGcmFt
ZVNlbGVjdGlvbjo6aW52YWxpZGF0ZUNhcmV0UmVjdAogICAgIG1fY2FyZXRSZWN0TmVlZHNVcGRh
dGUgPSB0cnVlOwogCiAgICAgaWYgKCFjYXJldFJlY3RDaGFuZ2VkKSB7Ci0gICAgICAgIFJlbmRl
clZpZXcqIHZpZXcgPSB0b1JlbmRlclZpZXcoZC0+cmVuZGVyZXIoKSk7Ci0gICAgICAgIGlmICh2
aWV3ICYmIHNob3VsZFJlcGFpbnRDYXJldCh2aWV3KSkKLSAgICAgICAgICAgIHZpZXctPnJlcGFp
bnRSZWN0YW5nbGVJblZpZXdBbmRDb21wb3NpdGVkTGF5ZXJzKGNhcmV0UmVwYWludFJlY3QoKSwg
ZmFsc2UpOworICAgICAgICBSZW5kZXJWaWV3KiB2aWV3ID0gdG9SZW5kZXJWaWV3KG5vZGUtPmRv
Y3VtZW50KCktPnJlbmRlcmVyKCkpOworICAgICAgICBpZiAodmlldyAmJiBzaG91bGRSZXBhaW50
Q2FyZXQodmlldywgbm9kZS0+aXNDb250ZW50RWRpdGFibGUoKSkpCisgICAgICAgICAgICB2aWV3
LT5yZXBhaW50UmVjdGFuZ2xlSW5WaWV3QW5kQ29tcG9zaXRlZExheWVycyhjYXJldFJlcGFpbnRS
ZWN0KG5vZGUpLCBmYWxzZSk7CiAgICAgfQogfQogCiB2b2lkIEZyYW1lU2VsZWN0aW9uOjpwYWlu
dENhcmV0KEdyYXBoaWNzQ29udGV4dCogY29udGV4dCwgaW50IHR4LCBpbnQgdHksIGNvbnN0IElu
dFJlY3QmIGNsaXBSZWN0KQogeworICAgIGlmICghbV9zZWxlY3Rpb24uaXNDYXJldCgpKQorICAg
ICAgICByZXR1cm47CisKKyAgICBDYXJldEJhc2U6OnBhaW50Q2FyZXQobV9zZWxlY3Rpb24uc3Rh
cnQoKS5kZXByZWNhdGVkTm9kZSgpLCBjb250ZXh0LCB0eCwgdHksIGNsaXBSZWN0KTsKK30KKwor
dm9pZCBDYXJldEJhc2U6OnBhaW50Q2FyZXQoTm9kZSogbm9kZSwgR3JhcGhpY3NDb250ZXh0KiBj
b250ZXh0LCBpbnQgdHgsIGludCB0eSwgY29uc3QgSW50UmVjdCYgY2xpcFJlY3QpIGNvbnN0Cit7
CiAjaWYgRU5BQkxFKFRFWFRfQ0FSRVQpCiAgICAgaWYgKCFtX2NhcmV0VmlzaWJsZSkKICAgICAg
ICAgcmV0dXJuOwogICAgIGlmICghbV9jYXJldFBhaW50KQogICAgICAgICByZXR1cm47Ci0gICAg
aWYgKCFtX3NlbGVjdGlvbi5pc0NhcmV0KCkpCi0gICAgICAgIHJldHVybjsKIAogICAgIEludFJl
Y3QgZHJhd2luZ1JlY3QgPSBsb2NhbENhcmV0UmVjdEZvclBhaW50aW5nKCk7Ci0gICAgaWYgKGNh
cmV0UmVuZGVyZXIoKSAmJiBjYXJldFJlbmRlcmVyKCktPmlzQm94KCkpCi0gICAgICAgIHRvUmVu
ZGVyQm94KGNhcmV0UmVuZGVyZXIoKSktPmZsaXBGb3JXcml0aW5nTW9kZShkcmF3aW5nUmVjdCk7
CisgICAgUmVuZGVyT2JqZWN0KiByZW5kZXJlciA9IGNhcmV0UmVuZGVyZXIobm9kZSk7CisgICAg
aWYgKHJlbmRlcmVyICYmIHJlbmRlcmVyLT5pc0JveCgpKQorICAgICAgICB0b1JlbmRlckJveChy
ZW5kZXJlciktPmZsaXBGb3JXcml0aW5nTW9kZShkcmF3aW5nUmVjdCk7CiAgICAgZHJhd2luZ1Jl
Y3QubW92ZSh0eCwgdHkpOwogICAgIEludFJlY3QgY2FyZXQgPSBpbnRlcnNlY3Rpb24oZHJhd2lu
Z1JlY3QsIGNsaXBSZWN0KTsKICAgICBpZiAoY2FyZXQuaXNFbXB0eSgpKQpAQCAtMTIzMiw3ICsx
MjkyLDcgQEAgdm9pZCBGcmFtZVNlbGVjdGlvbjo6cGFpbnRDYXJldChHcmFwaGljcwogCiAgICAg
Q29sb3IgY2FyZXRDb2xvciA9IENvbG9yOjpibGFjazsKICAgICBDb2xvclNwYWNlIGNvbG9yU3Bh
Y2UgPSBDb2xvclNwYWNlRGV2aWNlUkdCOwotICAgIEVsZW1lbnQqIGVsZW1lbnQgPSByb290RWRp
dGFibGVFbGVtZW50KCk7CisgICAgRWxlbWVudCogZWxlbWVudCA9IG5vZGUtPnJvb3RFZGl0YWJs
ZUVsZW1lbnQoKTsKICAgICBpZiAoZWxlbWVudCAmJiBlbGVtZW50LT5yZW5kZXJlcigpKSB7CiAg
ICAgICAgIGNhcmV0Q29sb3IgPSBlbGVtZW50LT5yZW5kZXJlcigpLT5zdHlsZSgpLT52aXNpdGVk
RGVwZW5kZW50Q29sb3IoQ1NTUHJvcGVydHlDb2xvcik7CiAgICAgICAgIGNvbG9yU3BhY2UgPSBl
bGVtZW50LT5yZW5kZXJlcigpLT5zdHlsZSgpLT5jb2xvclNwYWNlKCk7CkBAIC0xMjQwLDYgKzEz
MDAsNyBAQCB2b2lkIEZyYW1lU2VsZWN0aW9uOjpwYWludENhcmV0KEdyYXBoaWNzCiAKICAgICBj
b250ZXh0LT5maWxsUmVjdChjYXJldCwgY2FyZXRDb2xvciwgY29sb3JTcGFjZSk7CiAjZWxzZQor
ICAgIFVOVVNFRF9QQVJBTShub2RlKTsKICAgICBVTlVTRURfUEFSQU0oY29udGV4dCk7CiAgICAg
VU5VU0VEX1BBUkFNKHR4KTsKICAgICBVTlVTRURfUEFSQU0odHkpOwpAQCAtMTQ4MCwxMyArMTU0
MSw2IEBAIGJvb2wgRnJhbWVTZWxlY3Rpb246OmlzSW5QYXNzd29yZEZpZWxkKCkKICAgICByZXR1
cm4gc3RhdGljX2Nhc3Q8SFRNTElucHV0RWxlbWVudCo+KHN0YXJ0Tm9kZSktPmlzUGFzc3dvcmRG
aWVsZCgpOwogfQogCi1ib29sIEZyYW1lU2VsZWN0aW9uOjpjYXJldFJlbmRlcnNJbnNpZGVOb2Rl
KE5vZGUqIG5vZGUpIGNvbnN0Ci17Ci0gICAgaWYgKCFub2RlKQotICAgICAgICByZXR1cm4gZmFs
c2U7Ci0gICAgcmV0dXJuICFpc1RhYmxlRWxlbWVudChub2RlKSAmJiAhZWRpdGluZ0lnbm9yZXND
b250ZW50KG5vZGUpOwotfQotCiB2b2lkIEZyYW1lU2VsZWN0aW9uOjpmb2N1c2VkT3JBY3RpdmVT
dGF0ZUNoYW5nZWQoKQogewogICAgIGJvb2wgYWN0aXZlQW5kRm9jdXNlZCA9IGlzRm9jdXNlZEFu
ZEFjdGl2ZSgpOwpAQCAtMTU1NSw4ICsxNjA5LDYgQEAgYm9vbCBGcmFtZVNlbGVjdGlvbjo6aXNG
b2N1c2VkQW5kQWN0aXZlKAogCiB2b2lkIEZyYW1lU2VsZWN0aW9uOjp1cGRhdGVBcHBlYXJhbmNl
KCkKIHsKLSAgICBBU1NFUlQoIW1faXNEcmFnQ2FyZXRDb250cm9sbGVyKTsKLQogI2lmIEVOQUJM
RShURVhUX0NBUkVUKQogICAgIGJvb2wgY2FyZXRSZWN0Q2hhbmdlZCA9IHJlY29tcHV0ZUNhcmV0
UmVjdCgpOwogCkBAIC0xNzA5LDEzICsxNzYxLDExIEBAIHZvaWQgRnJhbWVTZWxlY3Rpb246OnNl
dEZvY3VzZWROb2RlSWZOZWUKICAgICAgICAgbV9mcmFtZS0+cGFnZSgpLT5mb2N1c0NvbnRyb2xs
ZXIoKS0+c2V0Rm9jdXNlZE5vZGUoMCwgbV9mcmFtZSk7CiB9CiAKLXZvaWQgRnJhbWVTZWxlY3Rp
b246OnBhaW50RHJhZ0NhcmV0KEdyYXBoaWNzQ29udGV4dCogcCwgaW50IHR4LCBpbnQgdHksIGNv
bnN0IEludFJlY3QmIGNsaXBSZWN0KSBjb25zdAordm9pZCBEcmFnQ2FyZXRDb250cm9sbGVyOjpw
YWludERyYWdDYXJldChGcmFtZSogZnJhbWUsIEdyYXBoaWNzQ29udGV4dCogcCwgaW50IHR4LCBp
bnQgdHksIGNvbnN0IEludFJlY3QmIGNsaXBSZWN0KSBjb25zdAogewogI2lmIEVOQUJMRShURVhU
X0NBUkVUKQotICAgIEZyYW1lU2VsZWN0aW9uKiBkcmFnQ2FyZXRDb250cm9sbGVyID0gbV9mcmFt
ZS0+cGFnZSgpLT5kcmFnQ2FyZXRDb250cm9sbGVyKCk7Ci0gICAgQVNTRVJUKGRyYWdDYXJldENv
bnRyb2xsZXItPnNlbGVjdGlvbigpLmlzQ2FyZXQoKSk7Ci0gICAgaWYgKGRyYWdDYXJldENvbnRy
b2xsZXItPnNlbGVjdGlvbigpLnN0YXJ0KCkuYW5jaG9yTm9kZSgpLT5kb2N1bWVudCgpLT5mcmFt
ZSgpID09IG1fZnJhbWUpCi0gICAgICAgIGRyYWdDYXJldENvbnRyb2xsZXItPnBhaW50Q2FyZXQo
cCwgdHgsIHR5LCBjbGlwUmVjdCk7CisgICAgaWYgKG1fcG9zaXRpb24uZGVlcEVxdWl2YWxlbnQo
KS5kZXByZWNhdGVkTm9kZSgpLT5kb2N1bWVudCgpLT5mcmFtZSgpID09IGZyYW1lKQorICAgICAg
ICBwYWludENhcmV0KG1fcG9zaXRpb24uZGVlcEVxdWl2YWxlbnQoKS5kZXByZWNhdGVkTm9kZSgp
LCBwLCB0eCwgdHksIGNsaXBSZWN0KTsKICNlbHNlCiAgICAgVU5VU0VEX1BBUkFNKHApOwogICAg
IFVOVVNFRF9QQVJBTSh0eCk7CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9lZGl0aW5nL0ZyYW1lU2Vs
ZWN0aW9uLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvZWRpdGluZy9GcmFtZVNlbGVj
dGlvbi5oCShyZXZpc2lvbiA4NTg2NCkKKysrIFNvdXJjZS9XZWJDb3JlL2VkaXRpbmcvRnJhbWVT
ZWxlY3Rpb24uaAkod29ya2luZyBjb3B5KQpAQCAtNDgsNyArNDgsNTcgQEAgY2xhc3MgVmlzaWJs
ZVBvc2l0aW9uOwogCiBlbnVtIERpcmVjdGlvbmFsaXR5UG9saWN5IHsgTWFrZU5vbkRpcmVjdGlv
bmFsU2VsZWN0aW9uLCBNYWtlRGlyZWN0aW9uYWxTZWxlY3Rpb24gfTsKIAotY2xhc3MgRnJhbWVT
ZWxlY3Rpb24geworY2xhc3MgQ2FyZXRCYXNlIHsKKyAgICBXVEZfTUFLRV9OT05DT1BZQUJMRShD
YXJldEJhc2UpOworICAgIFdURl9NQUtFX0ZBU1RfQUxMT0NBVEVEOworcHJvdGVjdGVkOgorICAg
IENhcmV0QmFzZSgpOworCisgICAgdm9pZCBpbnZhbGlkYXRlQ2FyZXRSZWN0KE5vZGUqLCBib29s
IGNhcmV0UmVjdENoYW5nZWQgPSBmYWxzZSk7CisgICAgdm9pZCB1cGRhdGVDYXJldFJlY3QoRG9j
dW1lbnQqLCBjb25zdCBWaXNpYmxlUG9zaXRpb24mIGNhcmV0UG9zaXRpb24sIFZpc2libGVTZWxl
Y3Rpb246OlNlbGVjdGlvblR5cGUsIGJvb2wgaXNPcnBoYW5lZCk7CisgICAgSW50UmVjdCBhYnNv
bHV0ZUJvdW5kc0ZvckxvY2FsUmVjdChOb2RlKiwgY29uc3QgSW50UmVjdCYpIGNvbnN0OworICAg
IEludFJlY3QgYWJzb2x1dGVDYXJldEJvdW5kcyhib29sIGlzQ29udGVudEVkaXRhYmxlKTsKKyAg
ICBJbnRSZWN0IGNhcmV0UmVwYWludFJlY3QoTm9kZSopIGNvbnN0OworICAgIGJvb2wgc2hvdWxk
UmVwYWludENhcmV0KGNvbnN0IFJlbmRlclZpZXcqLCBib29sIGlzQ29udGVudEVkaXRhYmxlKSBj
b25zdDsKKworICAgIEludFJlY3QgbG9jYWxDYXJldFJlY3RGb3JQYWludGluZygpIGNvbnN0IHsg
cmV0dXJuIG1fY2FyZXRSZWN0OyB9CisgICAgdm9pZCBwYWludENhcmV0KE5vZGUqLCBHcmFwaGlj
c0NvbnRleHQqLCBpbnQgdHgsIGludCB0eSwgY29uc3QgSW50UmVjdCYgY2xpcFJlY3QpIGNvbnN0
OworCisgICAgUmVuZGVyT2JqZWN0KiBjYXJldFJlbmRlcmVyKE5vZGUqKSBjb25zdDsKKworICAg
IEludFJlY3QgbV9jYXJldFJlY3Q7IC8vIGNhcmV0IHJlY3QgaW4gY29vcmRzIGxvY2FsIHRvIHRo
ZSByZW5kZXJlciByZXNwb25zaWJsZSBmb3IgcGFpbnRpbmcgdGhlIGNhcmV0CisgICAgSW50UmVj
dCBtX2Fic0NhcmV0Qm91bmRzOyAvLyBhYnNvbHV0ZSBib3VuZGluZyByZWN0IGZvciB0aGUgY2Fy
ZXQKKyAgICBJbnRSZWN0IG1fYWJzb2x1dGVDYXJldFJlcGFpbnRCb3VuZHM7CisKKyAgICBib29s
IG1fY2FyZXRSZWN0TmVlZHNVcGRhdGU7IC8vIHRydWUgaWYgbV9jYXJldFJlY3QgYW5kIG1fYWJz
Q2FyZXRCb3VuZHMgbmVlZCB0byBiZSBjYWxjdWxhdGVkCisgICAgYm9vbCBtX2Fic0NhcmV0Qm91
bmRzRGlydHk7CisgICAgYm9vbCBtX2NhcmV0VmlzaWJsZTsKKyAgICBib29sIG1fY2FyZXRQYWlu
dDsKK307CisKK2NsYXNzIERyYWdDYXJldENvbnRyb2xsZXIgOiBwcml2YXRlIENhcmV0QmFzZSB7
CisgICAgV1RGX01BS0VfTk9OQ09QWUFCTEUoRHJhZ0NhcmV0Q29udHJvbGxlcik7CisgICAgV1RG
X01BS0VfRkFTVF9BTExPQ0FURUQ7CitwdWJsaWM6CisgICAgRHJhZ0NhcmV0Q29udHJvbGxlcigp
OworCisgICAgUmVuZGVyT2JqZWN0KiBjYXJldFJlbmRlcmVyKCkgY29uc3Q7CisgICAgdm9pZCBw
YWludERyYWdDYXJldChGcmFtZSosIEdyYXBoaWNzQ29udGV4dCosIGludCB0eCwgaW50IHR5LCBj
b25zdCBJbnRSZWN0JiBjbGlwUmVjdCkgY29uc3Q7CisKKyAgICBib29sIGlzQ29udGVudEVkaXRh
YmxlKCkgY29uc3QgeyByZXR1cm4gbV9wb3NpdGlvbi5yb290RWRpdGFibGVFbGVtZW50KCk7IH0K
KyAgICBib29sIGlzQ29udGVudFJpY2hseUVkaXRhYmxlKCkgY29uc3Q7CisgICAgYm9vbCBpc05v
bmUoKSBjb25zdCB7IHJldHVybiBtX3Bvc2l0aW9uLmlzTnVsbCgpOyB9CisKKyAgICBjb25zdCBW
aXNpYmxlUG9zaXRpb24mIGNhcmV0KCkgeyByZXR1cm4gbV9wb3NpdGlvbjsgfQorICAgIHZvaWQg
c2V0Q2FyZXQoY29uc3QgVmlzaWJsZVBvc2l0aW9uJik7CisgICAgdm9pZCBjbGVhcigpIHsgc2V0
Q2FyZXQoVmlzaWJsZVBvc2l0aW9uKCkpOyB9CisKKyAgICB2b2lkIG5vZGVXaWxsQmVSZW1vdmVk
KE5vZGUqKTsKK3ByaXZhdGU6CisgICAgVmlzaWJsZVBvc2l0aW9uIG1fcG9zaXRpb247Cit9Owor
CitjbGFzcyBGcmFtZVNlbGVjdGlvbiA6IHByaXZhdGUgQ2FyZXRCYXNlIHsKICAgICBXVEZfTUFL
RV9OT05DT1BZQUJMRShGcmFtZVNlbGVjdGlvbik7CiAgICAgV1RGX01BS0VfRkFTVF9BTExPQ0FU
RUQ7CiBwdWJsaWM6CkBAIC02Myw3ICsxMTMsNyBAQCBwdWJsaWM6CiAgICAgfTsKICAgICB0eXBl
ZGVmIHVuc2lnbmVkIFNldFNlbGVjdGlvbk9wdGlvbnM7CiAKLSAgICBGcmFtZVNlbGVjdGlvbihG
cmFtZSogPSAwLCBib29sIGlzRHJhZ0NhcmV0Q29udHJvbGxlciA9IGZhbHNlKTsKKyAgICBGcmFt
ZVNlbGVjdGlvbihGcmFtZSogPSAwKTsKIAogICAgIEVsZW1lbnQqIHJvb3RFZGl0YWJsZUVsZW1l
bnQoKSBjb25zdCB7IHJldHVybiBtX3NlbGVjdGlvbi5yb290RWRpdGFibGVFbGVtZW50KCk7IH0K
ICAgICBib29sIGlzQ29udGVudEVkaXRhYmxlKCkgY29uc3QgeyByZXR1cm4gbV9zZWxlY3Rpb24u
aXNDb250ZW50RWRpdGFibGUoKTsgfQpAQCAtMTE0LDcgKzE2NCw2IEBAIHB1YmxpYzoKIAogICAg
IC8vIENhcmV0IHJlY3QgbG9jYWwgdG8gdGhlIGNhcmV0J3MgcmVuZGVyZXIKICAgICBJbnRSZWN0
IGxvY2FsQ2FyZXRSZWN0KCk7Ci0gICAgSW50UmVjdCBsb2NhbENhcmV0UmVjdEZvclBhaW50aW5n
KCkgY29uc3QgeyByZXR1cm4gbV9jYXJldFJlY3Q7IH0KIAogICAgIC8vIEJvdW5kcyBvZiAocG9z
c2libHkgdHJhbnNmb3JtZWQpIGNhcmV0IGluIGFic29sdXRlIGNvb3JkcwogICAgIEludFJlY3Qg
YWJzb2x1dGVDYXJldEJvdW5kcygpOwpAQCAtMTM5LDcgKzE4OCw3IEBAIHB1YmxpYzoKIAogICAg
IHZvaWQgc2V0Q2FyZXRWaXNpYmxlKGJvb2wgPSB0cnVlKTsKICAgICB2b2lkIGNsZWFyQ2FyZXRS
ZWN0SWZOZWVkZWQoKTsKLSAgICBib29sIHJlY29tcHV0ZUNhcmV0UmVjdCgpOyAvLyByZXR1cm5z
IHRydWUgaWYgY2FyZXQgcmVjdCBtb3ZlZAorICAgIGJvb2wgcmVjb21wdXRlQ2FyZXRSZWN0KCk7
CiAgICAgdm9pZCBpbnZhbGlkYXRlQ2FyZXRSZWN0KCk7CiAgICAgdm9pZCBwYWludENhcmV0KEdy
YXBoaWNzQ29udGV4dCosIGludCB0eCwgaW50IHR5LCBjb25zdCBJbnRSZWN0JiBjbGlwUmVjdCk7
CiAKQEAgLTIwMywxOCArMjUyLDExIEBAIHByaXZhdGU6CiAgICAgVmlzaWJsZVBvc2l0aW9uIG1v
ZGlmeU1vdmluZ0xlZnQoVGV4dEdyYW51bGFyaXR5KTsKICAgICBWaXNpYmxlUG9zaXRpb24gbW9k
aWZ5TW92aW5nQmFja3dhcmQoVGV4dEdyYW51bGFyaXR5KTsKIAotICAgIHZvaWQgdXBkYXRlQ2Fy
ZXRSZWN0KCk7Ci0gICAgSW50UmVjdCBjYXJldFJlcGFpbnRSZWN0KCkgY29uc3Q7Ci0gICAgYm9v
bCBzaG91bGRSZXBhaW50Q2FyZXQoY29uc3QgUmVuZGVyVmlldyogdmlldykgY29uc3Q7Ci0KICAg
ICBpbnQgeFBvc0ZvclZlcnRpY2FsQXJyb3dOYXZpZ2F0aW9uKEVQb3NpdGlvblR5cGUpOwogICAg
IAogICAgIHZvaWQgbm90aWZ5QWNjZXNzaWJpbGl0eUZvclNlbGVjdGlvbkNoYW5nZSgpOwogCiAg
ICAgdm9pZCBmb2N1c2VkT3JBY3RpdmVTdGF0ZUNoYW5nZWQoKTsKLSAgICBib29sIGNhcmV0UmVu
ZGVyc0luc2lkZU5vZGUoTm9kZSopIGNvbnN0OwotICAgIAotICAgIEludFJlY3QgYWJzb2x1dGVC
b3VuZHNGb3JMb2NhbFJlY3QoY29uc3QgSW50UmVjdCYpIGNvbnN0OwogCiAgICAgdm9pZCBjYXJl
dEJsaW5rVGltZXJGaXJlZChUaW1lcjxGcmFtZVNlbGVjdGlvbj4qKTsKIApAQCAtMjMxLDE4ICsy
NzMsOSBAQCBwcml2YXRlOgogCiAgICAgVGltZXI8RnJhbWVTZWxlY3Rpb24+IG1fY2FyZXRCbGlu
a1RpbWVyOwogCi0gICAgSW50UmVjdCBtX2NhcmV0UmVjdDsgLy8gY2FyZXQgcmVjdCBpbiBjb29y
ZHMgbG9jYWwgdG8gdGhlIHJlbmRlcmVyIHJlc3BvbnNpYmxlIGZvciBwYWludGluZyB0aGUgY2Fy
ZXQKLSAgICBJbnRSZWN0IG1fYWJzQ2FyZXRCb3VuZHM7IC8vIGFic29sdXRlIGJvdW5kaW5nIHJl
Y3QgZm9yIHRoZSBjYXJldAotICAgIEludFJlY3QgbV9hYnNvbHV0ZUNhcmV0UmVwYWludEJvdW5k
czsKLSAgICAKLSAgICBib29sIG1fY2FyZXRSZWN0TmVlZHNVcGRhdGU7IC8vIHRydWUgaWYgbV9j
YXJldFJlY3QgYW5kIG1fYWJzQ2FyZXRCb3VuZHMgbmVlZCB0byBiZSBjYWxjdWxhdGVkCi0gICAg
Ym9vbCBtX2Fic0NhcmV0Qm91bmRzRGlydHk7CiAgICAgYm9vbCBtX2lzRGlyZWN0aW9uYWw7Ci0g
ICAgYm9vbCBtX2lzRHJhZ0NhcmV0Q29udHJvbGxlcjsKICAgICBib29sIG1faXNDYXJldEJsaW5r
aW5nU3VzcGVuZGVkOwogICAgIGJvb2wgbV9mb2N1c2VkOwotICAgIGJvb2wgbV9jYXJldFZpc2li
bGU7Ci0gICAgYm9vbCBtX2NhcmV0UGFpbnQ7CiB9OwogCiBpbmxpbmUgRWRpdGluZ1N0eWxlKiBG
cmFtZVNlbGVjdGlvbjo6dHlwaW5nU3R5bGUoKSBjb25zdApJbmRleDogU291cmNlL1dlYkNvcmUv
cGFnZS9EcmFnQ29udHJvbGxlci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGFn
ZS9EcmFnQ29udHJvbGxlci5jcHAJKHJldmlzaW9uIDg1ODY0KQorKysgU291cmNlL1dlYkNvcmUv
cGFnZS9EcmFnQ29udHJvbGxlci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTMzMCwxMCArMzMwLDgg
QEAgYm9vbCBEcmFnQ29udHJvbGxlcjo6dHJ5RG9jdW1lbnREcmFnKERyYQogICAgICAgICBFbGVt
ZW50KiBlbGVtZW50ID0gZWxlbWVudFVuZGVyTW91c2UobV9kb2N1bWVudFVuZGVyTW91c2UuZ2V0
KCksIHBvaW50KTsKICAgICAgICAgaWYgKCFlbGVtZW50KQogICAgICAgICAgICAgcmV0dXJuIGZh
bHNlOwotICAgICAgICBpZiAoIWFzRmlsZUlucHV0KGVsZW1lbnQpKSB7Ci0gICAgICAgICAgICBW
aXNpYmxlU2VsZWN0aW9uIGRyYWdDYXJldCA9IG1fZG9jdW1lbnRVbmRlck1vdXNlLT5mcmFtZSgp
LT52aXNpYmxlUG9zaXRpb25Gb3JQb2ludChwb2ludCk7Ci0gICAgICAgICAgICBtX3BhZ2UtPmRy
YWdDYXJldENvbnRyb2xsZXIoKS0+c2V0U2VsZWN0aW9uKGRyYWdDYXJldCk7Ci0gICAgICAgIH0K
KyAgICAgICAgaWYgKCFhc0ZpbGVJbnB1dChlbGVtZW50KSkKKyAgICAgICAgICAgIG1fcGFnZS0+
ZHJhZ0NhcmV0Q29udHJvbGxlcigpLT5zZXRDYXJldChtX2RvY3VtZW50VW5kZXJNb3VzZS0+ZnJh
bWUoKS0+dmlzaWJsZVBvc2l0aW9uRm9yUG9pbnQocG9pbnQpKTsKIAogICAgICAgICBGcmFtZSog
aW5uZXJGcmFtZSA9IGVsZW1lbnQtPmRvY3VtZW50KCktPmZyYW1lKCk7CiAgICAgICAgIG9wZXJh
dGlvbiA9IGRyYWdJc01vdmUoaW5uZXJGcmFtZS0+c2VsZWN0aW9uKCksIGRyYWdEYXRhKSA/IERy
YWdPcGVyYXRpb25Nb3ZlIDogRHJhZ09wZXJhdGlvbkNvcHk7CkBAIC0zNzMsOSArMzcxLDggQEAg
c3RhdGljIGJvb2wgc2V0U2VsZWN0aW9uVG9EcmFnQ2FyZXQoRnJhbQogYm9vbCBEcmFnQ29udHJv
bGxlcjo6ZGlzcGF0Y2hUZXh0SW5wdXRFdmVudEZvcihGcmFtZSogaW5uZXJGcmFtZSwgRHJhZ0Rh
dGEqIGRyYWdEYXRhKQogewogICAgIEFTU0VSVCghbV9wYWdlLT5kcmFnQ2FyZXRDb250cm9sbGVy
KCktPmlzTm9uZSgpKTsKLSAgICBWaXNpYmxlU2VsZWN0aW9uIGRyYWdDYXJldChtX3BhZ2UtPmRy
YWdDYXJldENvbnRyb2xsZXIoKS0+c2VsZWN0aW9uKCkpOwotICAgIFN0cmluZyB0ZXh0ID0gZHJh
Z0NhcmV0LmlzQ29udGVudFJpY2hseUVkaXRhYmxlKCkgPyAiIiA6IGRyYWdEYXRhLT5hc1BsYWlu
VGV4dChpbm5lckZyYW1lKTsKLSAgICBOb2RlKiB0YXJnZXQgPSBpbm5lckZyYW1lLT5lZGl0b3Io
KS0+ZmluZEV2ZW50VGFyZ2V0RnJvbShkcmFnQ2FyZXQpOworICAgIFN0cmluZyB0ZXh0ID0gbV9w
YWdlLT5kcmFnQ2FyZXRDb250cm9sbGVyKCktPmlzQ29udGVudFJpY2hseUVkaXRhYmxlKCkgPyAi
IiA6IGRyYWdEYXRhLT5hc1BsYWluVGV4dChpbm5lckZyYW1lKTsKKyAgICBOb2RlKiB0YXJnZXQg
PSBpbm5lckZyYW1lLT5lZGl0b3IoKS0+ZmluZEV2ZW50VGFyZ2V0RnJvbShtX3BhZ2UtPmRyYWdD
YXJldENvbnRyb2xsZXIoKS0+Y2FyZXQoKSk7CiAgICAgRXhjZXB0aW9uQ29kZSBlYyA9IDA7CiAg
ICAgcmV0dXJuIHRhcmdldC0+ZGlzcGF0Y2hFdmVudChUZXh0RXZlbnQ6OmNyZWF0ZUZvckRyb3Ao
aW5uZXJGcmFtZS0+ZG9tV2luZG93KCksIHRleHQpLCBlYyk7CiB9CkBAIC00NDEsNyArNDM4LDcg
QEAgYm9vbCBEcmFnQ29udHJvbGxlcjo6Y29uY2x1ZGVFZGl0RHJhZyhEcgogICAgICAgICByZXR1
cm4gdHJ1ZTsKICAgICB9CiAKLSAgICBWaXNpYmxlU2VsZWN0aW9uIGRyYWdDYXJldChtX3BhZ2Ut
PmRyYWdDYXJldENvbnRyb2xsZXIoKS0+c2VsZWN0aW9uKCkpOworICAgIFZpc2libGVTZWxlY3Rp
b24gZHJhZ0NhcmV0KG1fcGFnZS0+ZHJhZ0NhcmV0Q29udHJvbGxlcigpLT5jYXJldCgpKTsKICAg
ICBtX3BhZ2UtPmRyYWdDYXJldENvbnRyb2xsZXIoKS0+Y2xlYXIoKTsKICAgICBSZWZQdHI8UmFu
Z2U+IHJhbmdlID0gZHJhZ0NhcmV0LnRvTm9ybWFsaXplZFJhbmdlKCk7CiAKQEAgLTg1MSw4ICs4
NDgsOCBAQCB2b2lkIERyYWdDb250cm9sbGVyOjpwbGFjZURyYWdDYXJldChjb25zCiAgICAgaWYg
KCFmcmFtZVZpZXcpCiAgICAgICAgIHJldHVybjsKICAgICBJbnRQb2ludCBmcmFtZVBvaW50ID0g
ZnJhbWVWaWV3LT53aW5kb3dUb0NvbnRlbnRzKHdpbmRvd1BvaW50KTsKLSAgICBWaXNpYmxlU2Vs
ZWN0aW9uIGRyYWdDYXJldChmcmFtZS0+dmlzaWJsZVBvc2l0aW9uRm9yUG9pbnQoZnJhbWVQb2lu
dCkpOwotICAgIG1fcGFnZS0+ZHJhZ0NhcmV0Q29udHJvbGxlcigpLT5zZXRTZWxlY3Rpb24oZHJh
Z0NhcmV0KTsKKworICAgIG1fcGFnZS0+ZHJhZ0NhcmV0Q29udHJvbGxlcigpLT5zZXRDYXJldChm
cmFtZS0+dmlzaWJsZVBvc2l0aW9uRm9yUG9pbnQoZnJhbWVQb2ludCkpOwogfQogCiB9IC8vIG5h
bWVzcGFjZSBXZWJDb3JlCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wYWdlL1BhZ2UuY3BwCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BhZ2UvUGFnZS5jcHAJKHJldmlzaW9uIDg1ODY0KQor
KysgU291cmNlL1dlYkNvcmUvcGFnZS9QYWdlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMTE1LDcg
KzExNSw3IEBAIHN0YXRpYyB2b2lkIG5ldHdvcmtTdGF0ZUNoYW5nZWQoKQogCiBQYWdlOjpQYWdl
KGNvbnN0IFBhZ2VDbGllbnRzJiBwYWdlQ2xpZW50cykKICAgICA6IG1fY2hyb21lKGFkb3B0UHRy
KG5ldyBDaHJvbWUodGhpcywgcGFnZUNsaWVudHMuY2hyb21lQ2xpZW50KSkpCi0gICAgLCBtX2Ry
YWdDYXJldENvbnRyb2xsZXIoYWRvcHRQdHIobmV3IEZyYW1lU2VsZWN0aW9uKDAsIHRydWUpKSkK
KyAgICAsIG1fZHJhZ0NhcmV0Q29udHJvbGxlcihhZG9wdFB0cihuZXcgRHJhZ0NhcmV0Q29udHJv
bGxlcikpCiAjaWYgRU5BQkxFKERSQUdfU1VQUE9SVCkKICAgICAsIG1fZHJhZ0NvbnRyb2xsZXIo
YWRvcHRQdHIobmV3IERyYWdDb250cm9sbGVyKHRoaXMsIHBhZ2VDbGllbnRzLmRyYWdDbGllbnQp
KSkKICNlbmRpZgpJbmRleDogU291cmNlL1dlYkNvcmUvcGFnZS9QYWdlLmgKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gU291cmNlL1dlYkNvcmUvcGFnZS9QYWdlLmgJKHJldmlzaW9uIDg1ODY0KQorKysgU291cmNl
L1dlYkNvcmUvcGFnZS9QYWdlLmgJKHdvcmtpbmcgY29weSkKQEAgLTU0LDYgKzU0LDcgQEAgbmFt
ZXNwYWNlIFdlYkNvcmUgewogICAgIGNsYXNzIERldmljZU9yaWVudGF0aW9uQ2xpZW50OwogICAg
IGNsYXNzIERldmljZU9yaWVudGF0aW9uQ29udHJvbGxlcjsKICAgICBjbGFzcyBEb2N1bWVudDsK
KyAgICBjbGFzcyBEcmFnQ2FyZXRDb250cm9sbGVyOwogICAgIGNsYXNzIERyYWdDbGllbnQ7CiAg
ICAgY2xhc3MgRHJhZ0NvbnRyb2xsZXI7CiAgICAgY2xhc3MgRWRpdG9yQ2xpZW50OwpAQCAtMTY1
LDcgKzE2Niw3IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKICAgICAgICAgaW50IGZyYW1lQ291bnQo
KSBjb25zdCB7IGNoZWNrRnJhbWVDb3VudENvbnNpc3RlbmN5KCk7IHJldHVybiBtX2ZyYW1lQ291
bnQ7IH0KIAogICAgICAgICBDaHJvbWUqIGNocm9tZSgpIGNvbnN0IHsgcmV0dXJuIG1fY2hyb21l
LmdldCgpOyB9Ci0gICAgICAgIEZyYW1lU2VsZWN0aW9uKiBkcmFnQ2FyZXRDb250cm9sbGVyKCkg
Y29uc3QgeyByZXR1cm4gbV9kcmFnQ2FyZXRDb250cm9sbGVyLmdldCgpOyB9CisgICAgICAgIERy
YWdDYXJldENvbnRyb2xsZXIqIGRyYWdDYXJldENvbnRyb2xsZXIoKSBjb25zdCB7IHJldHVybiBt
X2RyYWdDYXJldENvbnRyb2xsZXIuZ2V0KCk7IH0KICNpZiBFTkFCTEUoRFJBR19TVVBQT1JUKQog
ICAgICAgICBEcmFnQ29udHJvbGxlciogZHJhZ0NvbnRyb2xsZXIoKSBjb25zdCB7IHJldHVybiBt
X2RyYWdDb250cm9sbGVyLmdldCgpOyB9CiAjZW5kaWYKQEAgLTMxNSw3ICszMTYsNyBAQCBuYW1l
c3BhY2UgV2ViQ29yZSB7CiAgICAgICAgIGRvdWJsZSBtaW5pbXVtVGltZXJJbnRlcnZhbCgpIGNv
bnN0OwogCiAgICAgICAgIE93blB0cjxDaHJvbWU+IG1fY2hyb21lOwotICAgICAgICBPd25QdHI8
RnJhbWVTZWxlY3Rpb24+IG1fZHJhZ0NhcmV0Q29udHJvbGxlcjsKKyAgICAgICAgT3duUHRyPERy
YWdDYXJldENvbnRyb2xsZXI+IG1fZHJhZ0NhcmV0Q29udHJvbGxlcjsKIAogI2lmIEVOQUJMRShB
Q0NFTEVSQVRFRF8yRF9DQU5WQVMpCiAgICAgICAgIFJlZlB0cjxTaGFyZWRHcmFwaGljc0NvbnRl
eHQzRD4gbV9zaGFyZWRHcmFwaGljc0NvbnRleHQzRDsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3Jl
bmRlcmluZy9SZW5kZXJCbG9jay5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcmVu
ZGVyaW5nL1JlbmRlckJsb2NrLmNwcAkocmV2aXNpb24gODU4NjQpCisrKyBTb3VyY2UvV2ViQ29y
ZS9yZW5kZXJpbmcvUmVuZGVyQmxvY2suY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yNDE3LDEyICsy
NDE3LDE5IEBAIHZvaWQgUmVuZGVyQmxvY2s6OnBhaW50Q2hpbGRyZW4oUGFpbnRJbmYKIAogdm9p
ZCBSZW5kZXJCbG9jazo6cGFpbnRDYXJldChQYWludEluZm8mIHBhaW50SW5mbywgaW50IHR4LCBp
bnQgdHksIENhcmV0VHlwZSB0eXBlKQogewotICAgIEZyYW1lU2VsZWN0aW9uKiBzZWxlY3Rpb24g
PSB0eXBlID09IEN1cnNvckNhcmV0ID8gZnJhbWUoKS0+c2VsZWN0aW9uKCkgOiBmcmFtZSgpLT5w
YWdlKCktPmRyYWdDYXJldENvbnRyb2xsZXIoKTsKLQogICAgIC8vIFBhaW50IHRoZSBjYXJldCBp
ZiB0aGUgRnJhbWVTZWxlY3Rpb24gc2F5cyBzbyBvciBpZiBjYXJldCBicm93c2luZyBpcyBlbmFi
bGVkCiAgICAgYm9vbCBjYXJldEJyb3dzaW5nID0gZnJhbWUoKS0+c2V0dGluZ3MoKSAmJiBmcmFt
ZSgpLT5zZXR0aW5ncygpLT5jYXJldEJyb3dzaW5nRW5hYmxlZCgpOwotICAgIFJlbmRlck9iamVj
dCogY2FyZXRQYWludGVyID0gc2VsZWN0aW9uLT5jYXJldFJlbmRlcmVyKCk7Ci0gICAgaWYgKGNh
cmV0UGFpbnRlciA9PSB0aGlzICYmIChzZWxlY3Rpb24tPmlzQ29udGVudEVkaXRhYmxlKCkgfHwg
Y2FyZXRCcm93c2luZykpIHsKKyAgICBSZW5kZXJPYmplY3QqIGNhcmV0UGFpbnRlcjsKKyAgICBi
b29sIGlzQ29udGVudEVkaXRhYmxlOworICAgIGlmICh0eXBlID09IEN1cnNvckNhcmV0KSB7Cisg
ICAgICAgIGNhcmV0UGFpbnRlciA9IGZyYW1lKCktPnNlbGVjdGlvbigpLT5jYXJldFJlbmRlcmVy
KCk7CisgICAgICAgIGlzQ29udGVudEVkaXRhYmxlID0gZnJhbWUoKS0+c2VsZWN0aW9uKCktPmlz
Q29udGVudEVkaXRhYmxlKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY2FyZXRQYWludGVyID0g
ZnJhbWUoKS0+cGFnZSgpLT5kcmFnQ2FyZXRDb250cm9sbGVyKCktPmNhcmV0UmVuZGVyZXIoKTsK
KyAgICAgICAgaXNDb250ZW50RWRpdGFibGUgPSBmcmFtZSgpLT5wYWdlKCktPmRyYWdDYXJldENv
bnRyb2xsZXIoKS0+aXNDb250ZW50RWRpdGFibGUoKTsKKyAgICB9CisKKyAgICBpZiAoY2FyZXRQ
YWludGVyID09IHRoaXMgJiYgKGlzQ29udGVudEVkaXRhYmxlIHx8IGNhcmV0QnJvd3NpbmcpKSB7
CiAgICAgICAgIC8vIENvbnZlcnQgdGhlIHBhaW50aW5nIG9mZnNldCBpbnRvIHRoZSBsb2NhbCBj
b29yZGluYXRlIHN5c3RlbSBvZiB0aGlzIHJlbmRlcmVyLAogICAgICAgICAvLyB0byBtYXRjaCB0
aGUgbG9jYWxDYXJldFJlY3QgY29tcHV0ZWQgYnkgdGhlIEZyYW1lU2VsZWN0aW9uCiAgICAgICAg
IG9mZnNldEZvckNvbnRlbnRzKHR4LCB0eSk7CkBAIC0yNDMwLDcgKzI0MzcsNyBAQCB2b2lkIFJl
bmRlckJsb2NrOjpwYWludENhcmV0KFBhaW50SW5mbyYgCiAgICAgICAgIGlmICh0eXBlID09IEN1
cnNvckNhcmV0KQogICAgICAgICAgICAgZnJhbWUoKS0+c2VsZWN0aW9uKCktPnBhaW50Q2FyZXQo
cGFpbnRJbmZvLmNvbnRleHQsIHR4LCB0eSwgcGFpbnRJbmZvLnJlY3QpOwogICAgICAgICBlbHNl
Ci0gICAgICAgICAgICBmcmFtZSgpLT5zZWxlY3Rpb24oKS0+cGFpbnREcmFnQ2FyZXQocGFpbnRJ
bmZvLmNvbnRleHQsIHR4LCB0eSwgcGFpbnRJbmZvLnJlY3QpOworICAgICAgICAgICAgZnJhbWUo
KS0+cGFnZSgpLT5kcmFnQ2FyZXRDb250cm9sbGVyKCktPnBhaW50RHJhZ0NhcmV0KGZyYW1lKCks
IHBhaW50SW5mby5jb250ZXh0LCB0eCwgdHksIHBhaW50SW5mby5yZWN0KTsKICAgICB9CiB9CiAK
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>92747</attachid>
            <date>2011-05-08 13:55:52 -0700</date>
            <delta_ts>2011-05-08 15:54:47 -0700</delta_ts>
            <desc>Fixed per comments</desc>
            <filename>bug-60273-20110508135550.patch</filename>
            <type>text/plain</type>
            <size>32419</size>
            <attacher name="Ryosuke Niwa">rniwa</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDg2MDM1KQorKysgU291cmNlL1dlYkNvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsNjkgQEAKKzIwMTEtMDUtMDggIFJ5b3N1a2Ug
Tml3YSAgPHJuaXdhQHdlYmtpdC5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChP
T1BTISkuCisKKyAgICAgICAgRXh0cmFjdCBhIERyYWdDYXJldENvbnRyb2xsZXIgZnJvbSBGcmFt
ZVNlbGVjdGlvbgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/
aWQ9NjAyNzMKKworICAgICAgICBFeHRyYWN0ZWQgQ2FyZXRCYXNlIGFuZCBEcmFnQ2FyZXRDb250
cm9sbGVyIGZyb20gRnJhbWVTZWxlY3Rpb24uIENhcmV0QmFzZSBpcyBhIGJhc2UgY2xhc3MgZm9y
CisgICAgICAgIERyYWdDYXJldENvbnRyb2xsZXIgYW5kIEZyYW1lU2VsZWN0aW9uIGFuZCBwcm92
aWRlcyBmdW5jdGlvbnMgdG8gcGFpbnQgY2FyZXQuCisKKyAgICAgICAgU2luY2UgRHJhZ0NhcmV0
Q29udHJvbGxlciBkb2Vzbid0IG5lZWQgdG8gc3RvcmUgc2VsZWN0aW9uLCBpdCBvbmx5IGhvbGRz
IG9uZSBWaXNpYmxlUG9zaXRpb24uCisKKyAgICAgICAgKiBXZWJDb3JlLmV4cC5pbjoKKyAgICAg
ICAgKiBlZGl0aW5nL0ZyYW1lU2VsZWN0aW9uLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkNhcmV0
QmFzZTo6Q2FyZXRCYXNlKTogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpEcmFnQ2FyZXRDb250
cm9sbGVyOjpEcmFnQ2FyZXRDb250cm9sbGVyKTogQWRkZWQ7IFNldCBtX2NhcmV0VmlzaWJsZSB0
cnVlLgorICAgICAgICAoV2ViQ29yZTo6RHJhZ0NhcmV0Q29udHJvbGxlcjo6aXNDb250ZW50Umlj
aGx5RWRpdGFibGUpOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OkZyYW1lU2VsZWN0aW9uOjpG
cmFtZVNlbGVjdGlvbik6IFNldmVyYWwgbWVtYmVyIHZhcmlhYmxlcyBhcmUgbW92ZSB0byBDYXJl
dEJhc2UuCisgICAgICAgIChXZWJDb3JlOjpEcmFnQ2FyZXRDb250cm9sbGVyOjpzZXRDYXJldFBv
c2l0aW9uKTogRXh0cmFjdGVkIGZyb20gRnJhbWVTZWxlY3Rpb246OnNldFNlbGVjdGlvbi4KKyAg
ICAgICAgKFdlYkNvcmU6OkZyYW1lU2VsZWN0aW9uOjpzZXRTZWxlY3Rpb24pOiBSZW1vdmVkIGFu
IGVhcmx5IGV4aXQgZm9yIERyYWdDYXJldENvbnRyb2xsZXIuCisgICAgICAgIChXZWJDb3JlOjpj
bGVhclJlbmRlclZpZXdTZWxlY3Rpb24pOiBFeHRyYWN0ZWQgZnJvbSBGcmFtZVNlbGVjdGlvbjo6
cmVzcG9uZFRvTm9kZU1vZGlmaWNhdGlvbi4KKyAgICAgICAgKFdlYkNvcmU6OkRyYWdDYXJldENv
bnRyb2xsZXI6Om5vZGVXaWxsQmVSZW1vdmVkKTogRXh0cmFjdGVkIGZyb20gRnJhbWVTZWxlY3Rp
b246Om5vZGVXaWxsQmVSZW1vdmVkCisgICAgICAgIGFuZCByZXNwb25kVG9Ob2RlTW9kaWZpY2F0
aW9uLiBOb3RlIHRoYXQgdGhlIHBvc2l0aW9uIERyYWdDYXJldENvbnRyb2xsZXIgaG9sZHMgaXMg
ZXF1aXZhbGVudCB0bworICAgICAgICBGcmFtZVNlbGVjdGlvbidzIGJhc2Ugb3Igc3RhcnQgc28g
d2hlbiByZW1vdmluZ05vZGVSZW1vdmVzUG9zaXRpb24gcmV0dXJucyB0cnVlIGZvciBtX3Bvc2l0
aW9uLAorICAgICAgICB3ZSB1c2VkIHRvIGV4ZWN1dGUgdGhlIGZpcnN0IGlmIGNsYXVzZSBhbmQg
Y2xlYXJlZCByZW5kZXIgdHJlZSBzZWxlY3Rpb24gYW5kIERPTSB0cmVlIHNlbGVjdGlvbi4KKyAg
ICAgICAgVGhpcyBpcyBleGFjdGx5IHdoYXQgbmV3IERyYWdDYXJldENvbnRyb2xsZXI6Om5vZGVX
aWxsQmVSZW1vdmVkIGRvZXMuCisgICAgICAgIChXZWJDb3JlOjpGcmFtZVNlbGVjdGlvbjo6bm9k
ZVdpbGxCZVJlbW92ZWQpOiBTaW1wbGlmaWVkIGVhcmx5IGV4aXN0IGNvbmRpdGlvbnMuCisgICAg
ICAgIChXZWJDb3JlOjpGcmFtZVNlbGVjdGlvbjo6cmVzcG9uZFRvTm9kZU1vZGlmaWNhdGlvbik6
IENhbGxzIGNsZWFyUmVuZGVyVmlld1NlbGVjdGlvbi4KKyAgICAgICAgKFdlYkNvcmU6OkNhcmV0
QmFzZTo6dXBkYXRlQ2FyZXRSZWN0KTogVGFrZXMgZG9jdW1lbnQsIGNhcmV0UG9zaXRpb24sIHNl
bGVjdGlvbiB0eXBlLCBhbmQgYm9vbGVhbiBpc09ycGhhbmVkLgorICAgICAgICBOb3RlIHRoYXQg
d2UgY2FuJ3Qgb2J0YWluIHRoZSBkb2N1bWVudCBmcm9tIGNhcmV0UG9zaXRpb24gYmVjYXVzZSBW
aXNpYmxlUG9zaXRpb24gY2FuIGJlIG51bGwgZXZlbiBpZgorICAgICAgICBGcmFtZVNlbGVjdGlv
bidzIHN0YXJ0IHdhcyBub3QgbnVsbC4KKyAgICAgICAgKFdlYkNvcmU6OmNhcmV0UmVuZGVyc0lu
c2lkZU5vZGUpOiBNb3ZlZDsgTWFkZSBzdGF0aWMgbG9jYWwuCisgICAgICAgIChXZWJDb3JlOjpD
YXJldEJhc2U6OmNhcmV0UmVuZGVyZXIpOiBFeHRyYWN0ZWQgZnJvbSBGcmFtZVNlbGVjdGlvbjo6
Y2FyZXRSZW5kZXJlci4KKyAgICAgICAgKFdlYkNvcmU6OkZyYW1lU2VsZWN0aW9uOjpjYXJldFJl
bmRlcmVyKTogQ2FsbHMgQ2FyZXRCYXNlOjpjYXJldFJlbmRlcmVyLgorICAgICAgICAoV2ViQ29y
ZTo6RHJhZ0NhcmV0Q29udHJvbGxlcjo6Y2FyZXRSZW5kZXJlcik6IERpdHRvLgorICAgICAgICAo
V2ViQ29yZTo6RnJhbWVTZWxlY3Rpb246OmxvY2FsQ2FyZXRSZWN0KTogQ2FsbHMgdXBkYXRlQ2Fy
ZXRSZWN0IHdpdGggZXh0cmEgYXJndW1lbnRzLgorICAgICAgICAoV2ViQ29yZTo6Q2FyZXRCYXNl
OjphYnNvbHV0ZUJvdW5kc0ZvckxvY2FsUmVjdCk6IE1vdmVkIGZyb20gRnJhbWVTZWxlY3Rpb247
IFRha2VzIE5vZGUqLgorICAgICAgICAoV2ViQ29yZTo6Q2FyZXRCYXNlOjpjYXJldFJlcGFpbnRS
ZWN0KTogRGl0dG8uCisgICAgICAgIChXZWJDb3JlOjpGcmFtZVNlbGVjdGlvbjo6cmVjb21wdXRl
Q2FyZXRSZWN0KTogQ2FsbHMgYWJzb2x1dGVCb3VuZHNGb3JMb2NhbFJlY3QsIGNhcmV0UmVwYWlu
dFJlY3QsCisgICAgICAgIGFuZCBzaG91bGRSZXBhaW50Q2FyZXQgd2l0aCBleHRyYSBhcmd1bWVu
dHMuCisgICAgICAgIChXZWJDb3JlOjpDYXJldEJhc2U6OnNob3VsZFJlcGFpbnRDYXJldCk6IFRh
a2VzIGEgYm9vbGVhbiBpc0NvbnRlbnRFZGl0YWJsZS4KKyAgICAgICAgKFdlYkNvcmU6OkZyYW1l
U2VsZWN0aW9uOjppbnZhbGlkYXRlQ2FyZXRSZWN0KTogQ2FsbHMgQ2FyZXRCYXNlOjppbnZhbGlk
YXRlQ2FyZXRSZWN0LgorICAgICAgICAoV2ViQ29yZTo6Q2FyZXRCYXNlOjppbnZhbGlkYXRlQ2Fy
ZXRSZWN0KTogRXh0cmFjdGVkIGZyb20gRnJhbWVTZWxlY3Rpb246OmludmFsaWRhdGVDYXJldFJl
Y3QuCisgICAgICAgIChXZWJDb3JlOjpGcmFtZVNlbGVjdGlvbjo6cGFpbnRDYXJldCk6IENhbGxz
IENhcmV0QmFzZTo6cGFpbnRDYXJldC4KKyAgICAgICAgKFdlYkNvcmU6OkNhcmV0QmFzZTo6cGFp
bnRDYXJldCk6IEV4dHJhY3RlZCBmcm9tIEZyYW1lU2VsZWN0aW9uOjpwYWludENhcmV0LgorICAg
ICAgICAoV2ViQ29yZTo6RnJhbWVTZWxlY3Rpb246OnVwZGF0ZUFwcGVhcmFuY2UpOiBSZW1vdmVk
IGFuIGFzc2VydGlvbiB0aGF0IHRoaXMgZnVuY3Rpb24gaXMgbmV2ZXIgY2FsbGVkIGZvcgorICAg
ICAgICBEcmFnQ2FyZXRDb250cm9sbGVyLgorICAgICAgICAoV2ViQ29yZTo6RHJhZ0NhcmV0Q29u
dHJvbGxlcjo6cGFpbnREcmFnQ2FyZXQpOiBNb3ZlZCBmcm9tIEZyYW1lU2VsZWN0aW9uOjpwYWlu
dERyYWdDYXJldC4KKyAgICAgICAgKiBlZGl0aW5nL0ZyYW1lU2VsZWN0aW9uLmg6CisgICAgICAg
IChXZWJDb3JlOjpDYXJldEJhc2U6OmxvY2FsQ2FyZXRSZWN0Rm9yUGFpbnRpbmcpOiBBZGRlZC4K
KyAgICAgICAgKFdlYkNvcmU6OkRyYWdDYXJldENvbnRyb2xsZXI6OmlzQ29udGVudEVkaXRhYmxl
KTogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpEcmFnQ2FyZXRDb250cm9sbGVyOjpoYXNDYXJl
dCk6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6RHJhZ0NhcmV0Q29udHJvbGxlcjo6Y2FyZXRQ
b3NpdGlvbik6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6RHJhZ0NhcmV0Q29udHJvbGxlcjo6
Y2xlYXIpOiBBZGRlZC4KKyAgICAgICAgKiBwYWdlL0RyYWdDb250cm9sbGVyLmNwcDoKKyAgICAg
ICAgKFdlYkNvcmU6OkRyYWdDb250cm9sbGVyOjp0cnlEb2N1bWVudERyYWcpOiBVc2VzIERyYWdD
YXJldENvbnRyb2xsZXIuCisgICAgICAgIChXZWJDb3JlOjpEcmFnQ29udHJvbGxlcjo6ZGlzcGF0
Y2hUZXh0SW5wdXRFdmVudEZvcik6IERpdHRvLgorICAgICAgICAoV2ViQ29yZTo6RHJhZ0NvbnRy
b2xsZXI6OmNvbmNsdWRlRWRpdERyYWcpOiBEaXR0by4KKyAgICAgICAgKFdlYkNvcmU6OkRyYWdD
b250cm9sbGVyOjpwbGFjZURyYWdDYXJldCk6IERpdHRvLgorICAgICAgICAqIHBhZ2UvUGFnZS5j
cHA6CisgICAgICAgIChXZWJDb3JlOjpQYWdlOjpQYWdlKTogSW5zdGFudGlhdGVzIERyYWdDYXJl
dENvbnRyb2xsZXIgaW5zdGVhZCBvZiBGcmFtZVNlbGVjdGlvbi4KKyAgICAgICAgKiBwYWdlL1Bh
Z2UuaDoKKyAgICAgICAgKFdlYkNvcmU6OlBhZ2U6OmRyYWdDYXJldENvbnRyb2xsZXIpOiBSZXR1
cm5zIERyYWdDYXJldENvbnRyb2xsZXIqIGluc3RlYWQgb2YgRnJhbWVTZWxlY3Rpb24qLgorICAg
ICAgICAqIHJlbmRlcmluZy9SZW5kZXJCbG9jay5jcHA6CisgICAgICAgIChXZWJDb3JlOjpSZW5k
ZXJCbG9jazo6cGFpbnRDYXJldCk6IFVzZXMgRnJhbWVTZWxlY3Rpb24gYW5kIERyYWdDYXJldENv
bnRyb2xsZXIuCisKIDIwMTEtMDUtMDggIERhbiBCZXJuc3RlaW4gIDxtaXR6QGFwcGxlLmNvbT4K
IAogICAgICAgICBSZXZpZXdlZCBieSBEYXJpbiBBZGxlci4KSW5kZXg6IFNvdXJjZS9XZWJDb3Jl
L1dlYkNvcmUuZXhwLmluCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL1dlYkNvcmUuZXhw
LmluCShyZXZpc2lvbiA4NjAyMikKKysrIFNvdXJjZS9XZWJDb3JlL1dlYkNvcmUuZXhwLmluCSh3
b3JraW5nIGNvcHkpCkBAIC0zNTYsNyArMzU2LDcgQEAgX19aTjdXZWJDb3JlMTRGcmFtZVNlbGVj
dGlvbjIwc2V0U2VsZWN0aQogX19aTjdXZWJDb3JlMTRGcmFtZVNlbGVjdGlvbjZtb2RpZnlFTlMw
XzExRUFsdGVyYXRpb25FTlNfMThTZWxlY3Rpb25EaXJlY3Rpb25FTlNfMTVUZXh0R3JhbnVsYXJp
dHlFYgogX19aTjdXZWJDb3JlMTRGcmFtZVNlbGVjdGlvbjVjbGVhckV2CiBfX1pON1dlYkNvcmUx
NEZyYW1lU2VsZWN0aW9uOXNlbGVjdEFsbEV2Ci1fX1pON1dlYkNvcmUxNEZyYW1lU2VsZWN0aW9u
QzFFUE5TXzVGcmFtZUViCitfX1pON1dlYkNvcmUxNEZyYW1lU2VsZWN0aW9uQzFFUE5TXzVGcmFt
ZUUKIF9fWk43V2ViQ29yZTE0UmVzb3VyY2VIYW5kbGUxMnJlbGVhc2VQcm94eUV2CiBfX1pON1dl
YkNvcmUxNFJlc291cmNlSGFuZGxlMjBmb3JjZUNvbnRlbnRTbmlmZmluZ0V2CiBfX1pON1dlYkNv
cmUxNFJlc291cmNlTG9hZGVyMTRjYW5jZWxsZWRFcnJvckV2CkluZGV4OiBTb3VyY2UvV2ViQ29y
ZS9lZGl0aW5nL0ZyYW1lU2VsZWN0aW9uLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29y
ZS9lZGl0aW5nL0ZyYW1lU2VsZWN0aW9uLmNwcAkocmV2aXNpb24gODYwMjIpCisrKyBTb3VyY2Uv
V2ViQ29yZS9lZGl0aW5nL0ZyYW1lU2VsZWN0aW9uLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNzAs
MTggKzcwLDMxIEBAIHVzaW5nIG5hbWVzcGFjZSBIVE1MTmFtZXM7CiAKIGNvbnN0IGludCBOb1hQ
b3NGb3JWZXJ0aWNhbEFycm93TmF2aWdhdGlvbiA9IElOVF9NSU47CiAKLUZyYW1lU2VsZWN0aW9u
OjpGcmFtZVNlbGVjdGlvbihGcmFtZSogZnJhbWUsIGJvb2wgaXNEcmFnQ2FyZXRDb250cm9sbGVy
KQorQ2FyZXRCYXNlOjpDYXJldEJhc2UoKQorICAgIDogbV9jYXJldFJlY3ROZWVkc1VwZGF0ZSh0
cnVlKQorICAgICwgbV9hYnNDYXJldEJvdW5kc0RpcnR5KHRydWUpCisgICAgLCBtX2NhcmV0Vmlz
aWJsZShmYWxzZSkKKyAgICAsIG1fY2FyZXRQYWludCh0cnVlKQoreworfQorCitEcmFnQ2FyZXRD
b250cm9sbGVyOjpEcmFnQ2FyZXRDb250cm9sbGVyKCkKK3sKKyAgICBtX2NhcmV0VmlzaWJsZSA9
IHRydWU7Cit9CisKK2Jvb2wgRHJhZ0NhcmV0Q29udHJvbGxlcjo6aXNDb250ZW50UmljaGx5RWRp
dGFibGUoKSBjb25zdAoreworICAgIHJldHVybiBpc1JpY2hseUVkaXRhYmxlUG9zaXRpb24obV9w
b3NpdGlvbi5kZWVwRXF1aXZhbGVudCgpKTsKK30KKworRnJhbWVTZWxlY3Rpb246OkZyYW1lU2Vs
ZWN0aW9uKEZyYW1lKiBmcmFtZSkKICAgICA6IG1fZnJhbWUoZnJhbWUpCiAgICAgLCBtX3hQb3NG
b3JWZXJ0aWNhbEFycm93TmF2aWdhdGlvbihOb1hQb3NGb3JWZXJ0aWNhbEFycm93TmF2aWdhdGlv
bikKICAgICAsIG1fZ3JhbnVsYXJpdHkoQ2hhcmFjdGVyR3JhbnVsYXJpdHkpCiAgICAgLCBtX2Nh
cmV0QmxpbmtUaW1lcih0aGlzLCAmRnJhbWVTZWxlY3Rpb246OmNhcmV0QmxpbmtUaW1lckZpcmVk
KQotICAgICwgbV9jYXJldFJlY3ROZWVkc1VwZGF0ZSh0cnVlKQotICAgICwgbV9hYnNDYXJldEJv
dW5kc0RpcnR5KHRydWUpCi0gICAgLCBtX2lzRHJhZ0NhcmV0Q29udHJvbGxlcihpc0RyYWdDYXJl
dENvbnRyb2xsZXIpCiAgICAgLCBtX2lzQ2FyZXRCbGlua2luZ1N1c3BlbmRlZChmYWxzZSkKICAg
ICAsIG1fZm9jdXNlZChmcmFtZSAmJiBmcmFtZS0+cGFnZSgpICYmIGZyYW1lLT5wYWdlKCktPmZv
Y3VzQ29udHJvbGxlcigpLT5mb2N1c2VkRnJhbWUoKSA9PSBmcmFtZSkKLSAgICAsIG1fY2FyZXRW
aXNpYmxlKGlzRHJhZ0NhcmV0Q29udHJvbGxlcikKLSAgICAsIG1fY2FyZXRQYWludCh0cnVlKQog
ewogICAgIHNldElzRGlyZWN0aW9uYWwoZmFsc2UpOwogfQpAQCAtMTI3LDYgKzE0MCwyMCBAQCB2
b2lkIEZyYW1lU2VsZWN0aW9uOjptb3ZlVG8oY29uc3QgUG9zaXRpCiAgICAgc2V0U2VsZWN0aW9u
KFZpc2libGVTZWxlY3Rpb24oYmFzZSwgZXh0ZW50LCBhZmZpbml0eSksIG9wdGlvbnMpOwogfQog
Cit2b2lkIERyYWdDYXJldENvbnRyb2xsZXI6OnNldENhcmV0UG9zaXRpb24oY29uc3QgVmlzaWJs
ZVBvc2l0aW9uJiBwb3NpdGlvbikKK3sKKyAgICBpZiAoTm9kZSogbm9kZSA9IG1fcG9zaXRpb24u
ZGVlcEVxdWl2YWxlbnQoKS5jb250YWluZXJOb2RlKCkpCisgICAgICAgIGludmFsaWRhdGVDYXJl
dFJlY3Qobm9kZSk7CisgICAgbV9wb3NpdGlvbiA9IHBvc2l0aW9uOworICAgIG1fY2FyZXRSZWN0
TmVlZHNVcGRhdGUgPSB0cnVlOworICAgIERvY3VtZW50KiBkb2N1bWVudCA9IDA7CisgICAgaWYg
KE5vZGUqIG5vZGUgPSBtX3Bvc2l0aW9uLmRlZXBFcXVpdmFsZW50KCkuY29udGFpbmVyTm9kZSgp
KSB7CisgICAgICAgIGludmFsaWRhdGVDYXJldFJlY3Qobm9kZSk7CisgICAgICAgIGRvY3VtZW50
ID0gbm9kZS0+ZG9jdW1lbnQoKTsKKyAgICB9CisgICAgdXBkYXRlQ2FyZXRSZWN0KGRvY3VtZW50
LCBtX3Bvc2l0aW9uLCBtX3Bvc2l0aW9uLmlzTm90TnVsbCgpID8gVmlzaWJsZVNlbGVjdGlvbjo6
Q2FyZXRTZWxlY3Rpb24gOiBWaXNpYmxlU2VsZWN0aW9uOjpOb1NlbGVjdGlvbiwgbV9wb3NpdGlv
bi5pc09ycGhhbigpKTsKK30KKwogdm9pZCBGcmFtZVNlbGVjdGlvbjo6c2V0U2VsZWN0aW9uKGNv
bnN0IFZpc2libGVTZWxlY3Rpb24mIHMsIFNldFNlbGVjdGlvbk9wdGlvbnMgb3B0aW9ucywgQ3Vy
c29yQWxpZ25PblNjcm9sbCBhbGlnbiwgVGV4dEdyYW51bGFyaXR5IGdyYW51bGFyaXR5LCBEaXJl
Y3Rpb25hbGl0eVBvbGljeSBkaXJlY3Rpb25hbGl0eVBvbGljeSkKIHsKICAgICBtX2dyYW51bGFy
aXR5ID0gZ3JhbnVsYXJpdHk7CkBAIC0xMzcsMTQgKzE2NCw2IEBAIHZvaWQgRnJhbWVTZWxlY3Rp
b246OnNldFNlbGVjdGlvbihjb25zdCAKIAogICAgIHNldElzRGlyZWN0aW9uYWwoZGlyZWN0aW9u
YWxpdHlQb2xpY3kgPT0gTWFrZURpcmVjdGlvbmFsU2VsZWN0aW9uKTsKIAotICAgIGlmIChtX2lz
RHJhZ0NhcmV0Q29udHJvbGxlcikgewotICAgICAgICBpbnZhbGlkYXRlQ2FyZXRSZWN0KCk7Ci0g
ICAgICAgIG1fc2VsZWN0aW9uID0gczsKLSAgICAgICAgbV9jYXJldFJlY3ROZWVkc1VwZGF0ZSA9
IHRydWU7Ci0gICAgICAgIGludmFsaWRhdGVDYXJldFJlY3QoKTsKLSAgICAgICAgdXBkYXRlQ2Fy
ZXRSZWN0KCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9CiAgICAgaWYgKCFtX2ZyYW1lKSB7CiAg
ICAgICAgIG1fc2VsZWN0aW9uID0gczsKICAgICAgICAgcmV0dXJuOwpAQCAtMjE5LDE0ICsyMzgs
MzEgQEAgc3RhdGljIGJvb2wgcmVtb3ZpbmdOb2RlUmVtb3Zlc1Bvc2l0aW9uKAogICAgIHJldHVy
biBlbGVtZW50LT5jb250YWlucyhwb3NpdGlvbi5hbmNob3JOb2RlKCkpIHx8IGVsZW1lbnQtPmNv
bnRhaW5zKHBvc2l0aW9uLmFuY2hvck5vZGUoKS0+c2hhZG93QW5jZXN0b3JOb2RlKCkpOwogfQog
Ci12b2lkIEZyYW1lU2VsZWN0aW9uOjpub2RlV2lsbEJlUmVtb3ZlZChOb2RlICpub2RlKQorc3Rh
dGljIHZvaWQgY2xlYXJSZW5kZXJWaWV3U2VsZWN0aW9uKGNvbnN0IFBvc2l0aW9uJiBwb3NpdGlv
bikKIHsKLSAgICBpZiAoaXNOb25lKCkpCisgICAgUmVmUHRyPERvY3VtZW50PiBkb2N1bWVudCA9
IHBvc2l0aW9uLmFuY2hvck5vZGUoKS0+ZG9jdW1lbnQoKTsKKyAgICBkb2N1bWVudC0+dXBkYXRl
U3R5bGVJZk5lZWRlZCgpOworICAgIGlmIChSZW5kZXJWaWV3KiB2aWV3ID0gdG9SZW5kZXJWaWV3
KGRvY3VtZW50LT5yZW5kZXJlcigpKSkKKyAgICAgICAgdmlldy0+Y2xlYXJTZWxlY3Rpb24oKTsK
K30KKwordm9pZCBEcmFnQ2FyZXRDb250cm9sbGVyOjpub2RlV2lsbEJlUmVtb3ZlZChOb2RlKiBu
b2RlKQoreworICAgIGlmICghaGFzQ2FyZXQoKSB8fCAobm9kZSAmJiAhbm9kZS0+aW5Eb2N1bWVu
dCgpKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKCFyZW1vdmluZ05vZGVSZW1vdmVzUG9z
aXRpb24obm9kZSwgbV9wb3NpdGlvbi5kZWVwRXF1aXZhbGVudCgpKSkKICAgICAgICAgcmV0dXJu
OwogCisgICAgY2xlYXJSZW5kZXJWaWV3U2VsZWN0aW9uKG1fcG9zaXRpb24uZGVlcEVxdWl2YWxl
bnQoKSk7CisgICAgY2xlYXIoKTsKK30KKwordm9pZCBGcmFtZVNlbGVjdGlvbjo6bm9kZVdpbGxC
ZVJlbW92ZWQoTm9kZSAqbm9kZSkKK3sKICAgICAvLyBUaGVyZSBjYW4ndCBiZSBhIHNlbGVjdGlv
biBpbnNpZGUgYSBmcmFnbWVudCwgc28gaWYgYSBmcmFnbWVudCdzIG5vZGUgaXMgYmVpbmcgcmVt
b3ZlZCwKICAgICAvLyB0aGUgc2VsZWN0aW9uIGluIHRoZSBkb2N1bWVudCB0aGF0IGNyZWF0ZWQg
dGhlIGZyYWdtZW50IG5lZWRzIG5vIGFkanVzdG1lbnQuCi0gICAgaWYgKG5vZGUgJiYgaGlnaGVz
dEFuY2VzdG9yKG5vZGUpLT5ub2RlVHlwZSgpID09IE5vZGU6OkRPQ1VNRU5UX0ZSQUdNRU5UX05P
REUpCisgICAgaWYgKGlzTm9uZSgpIHx8IChub2RlICYmICFub2RlLT5pbkRvY3VtZW50KCkpKQog
ICAgICAgICByZXR1cm47CiAKICAgICByZXNwb25kVG9Ob2RlTW9kaWZpY2F0aW9uKG5vZGUsIHJl
bW92aW5nTm9kZVJlbW92ZXNQb3NpdGlvbihub2RlLCBtX3NlbGVjdGlvbi5iYXNlKCkpLCByZW1v
dmluZ05vZGVSZW1vdmVzUG9zaXRpb24obm9kZSwgbV9zZWxlY3Rpb24uZXh0ZW50KCkpLApAQCAt
MjYzLDEyICsyOTksOCBAQCB2b2lkIEZyYW1lU2VsZWN0aW9uOjpyZXNwb25kVG9Ob2RlTW9kaWZp
CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAoY2xlYXJSZW5kZXJUcmVlU2VsZWN0aW9uKSB7
Ci0gICAgICAgIFJlZlB0cjxEb2N1bWVudD4gZG9jdW1lbnQgPSBtX3NlbGVjdGlvbi5zdGFydCgp
LmFuY2hvck5vZGUoKS0+ZG9jdW1lbnQoKTsKLSAgICAgICAgZG9jdW1lbnQtPnVwZGF0ZVN0eWxl
SWZOZWVkZWQoKTsKLSAgICAgICAgaWYgKFJlbmRlclZpZXcqIHZpZXcgPSB0b1JlbmRlclZpZXco
ZG9jdW1lbnQtPnJlbmRlcmVyKCkpKQotICAgICAgICAgICAgdmlldy0+Y2xlYXJTZWxlY3Rpb24o
KTsKLSAgICB9CisgICAgaWYgKGNsZWFyUmVuZGVyVHJlZVNlbGVjdGlvbikKKyAgICAgICAgY2xl
YXJSZW5kZXJWaWV3U2VsZWN0aW9uKG1fc2VsZWN0aW9uLnN0YXJ0KCkpOwogCiAgICAgaWYgKGNs
ZWFyRE9NVHJlZVNlbGVjdGlvbikKICAgICAgICAgc2V0U2VsZWN0aW9uKFZpc2libGVTZWxlY3Rp
b24oKSwgMCk7CkBAIC0xMDMxLDI5ICsxMDYzLDI4IEBAIHZvaWQgRnJhbWVTZWxlY3Rpb246OnNl
dENhcmV0UmVjdE5lZWRzVXAKICAgICBtX2NhcmV0UmVjdE5lZWRzVXBkYXRlID0gZmxhZzsKIH0K
IAotdm9pZCBGcmFtZVNlbGVjdGlvbjo6dXBkYXRlQ2FyZXRSZWN0KCkKK3ZvaWQgQ2FyZXRCYXNl
Ojp1cGRhdGVDYXJldFJlY3QoRG9jdW1lbnQqIGRvY3VtZW50LCBjb25zdCBWaXNpYmxlUG9zaXRp
b24mIGNhcmV0UG9zaXRpb24sIFZpc2libGVTZWxlY3Rpb246OlNlbGVjdGlvblR5cGUgdHlwZSwg
Ym9vbCBpc09ycGhhbmVkKQogewotICAgIGlmIChpc05vbmUoKSB8fCAhbV9zZWxlY3Rpb24uc3Rh
cnQoKS5hbmNob3JOb2RlKCktPmluRG9jdW1lbnQoKSB8fCAhbV9zZWxlY3Rpb24uZW5kKCkuYW5j
aG9yTm9kZSgpLT5pbkRvY3VtZW50KCkpIHsKKyAgICBpZiAodHlwZSA9PSBWaXNpYmxlU2VsZWN0
aW9uOjpOb1NlbGVjdGlvbiB8fCBpc09ycGhhbmVkKSB7CiAgICAgICAgIG1fY2FyZXRSZWN0ID0g
SW50UmVjdCgpOwogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgbV9zZWxlY3Rpb24uc3Rh
cnQoKS5hbmNob3JOb2RlKCktPmRvY3VtZW50KCktPnVwZGF0ZVN0eWxlSWZOZWVkZWQoKTsKLSAg
ICAKKyAgICBkb2N1bWVudC0+dXBkYXRlU3R5bGVJZk5lZWRlZCgpOworCiAgICAgbV9jYXJldFJl
Y3QgPSBJbnRSZWN0KCk7Ci0gICAgICAgIAotICAgIGlmIChpc0NhcmV0KCkpIHsKLSAgICAgICAg
VmlzaWJsZVBvc2l0aW9uIHBvcyhtX3NlbGVjdGlvbi5zdGFydCgpLCBtX3NlbGVjdGlvbi5hZmZp
bml0eSgpKTsKLSAgICAgICAgaWYgKHBvcy5pc05vdE51bGwoKSkgewotICAgICAgICAgICAgQVNT
RVJUKHBvcy5kZWVwRXF1aXZhbGVudCgpLmRlcHJlY2F0ZWROb2RlKCktPnJlbmRlcmVyKCkpOwot
ICAgICAgICAgICAgCisgICAgCisgICAgaWYgKHR5cGUgPT0gVmlzaWJsZVNlbGVjdGlvbjo6Q2Fy
ZXRTZWxlY3Rpb24pIHsKKyAgICAgICAgaWYgKGNhcmV0UG9zaXRpb24uaXNOb3ROdWxsKCkpIHsK
KyAgICAgICAgICAgIEFTU0VSVChjYXJldFBvc2l0aW9uLmRlZXBFcXVpdmFsZW50KCkuZGVwcmVj
YXRlZE5vZGUoKS0+cmVuZGVyZXIoKSk7CisKICAgICAgICAgICAgIC8vIEZpcnN0IGNvbXB1dGUg
YSByZWN0IGxvY2FsIHRvIHRoZSByZW5kZXJlciBhdCB0aGUgc2VsZWN0aW9uIHN0YXJ0CiAgICAg
ICAgICAgICBSZW5kZXJPYmplY3QqIHJlbmRlcmVyOwotICAgICAgICAgICAgSW50UmVjdCBsb2Nh
bFJlY3QgPSBwb3MubG9jYWxDYXJldFJlY3QocmVuZGVyZXIpOworICAgICAgICAgICAgSW50UmVj
dCBsb2NhbFJlY3QgPSBjYXJldFBvc2l0aW9uLmxvY2FsQ2FyZXRSZWN0KHJlbmRlcmVyKTsKIAog
ICAgICAgICAgICAgLy8gR2V0IHRoZSByZW5kZXJlciB0aGF0IHdpbGwgYmUgcmVzcG9uc2libGUg
Zm9yIHBhaW50aW5nIHRoZSBjYXJldCAod2hpY2gKICAgICAgICAgICAgIC8vIGlzIGVpdGhlciB0
aGUgcmVuZGVyZXIgd2UganVzdCBmb3VuZCwgb3Igb25lIG9mIGl0cyBjb250YWluZXJzKQotICAg
ICAgICAgICAgUmVuZGVyT2JqZWN0KiBjYXJldFBhaW50ZXIgPSBjYXJldFJlbmRlcmVyKCk7Cisg
ICAgICAgICAgICBSZW5kZXJPYmplY3QqIGNhcmV0UGFpbnRlciA9IGNhcmV0UmVuZGVyZXIoY2Fy
ZXRQb3NpdGlvbi5kZWVwRXF1aXZhbGVudCgpLmRlcHJlY2F0ZWROb2RlKCkpOwogCiAgICAgICAg
ICAgICAvLyBDb21wdXRlIGFuIG9mZnNldCBiZXR3ZWVuIHRoZSByZW5kZXJlciBhbmQgdGhlIGNh
cmV0UGFpbnRlcgogICAgICAgICAgICAgYm9vbCB1bnJvb3RlZCA9IGZhbHNlOwpAQCAtMTA3Nyw5
ICsxMTA4LDEzIEBAIHZvaWQgRnJhbWVTZWxlY3Rpb246OnVwZGF0ZUNhcmV0UmVjdCgpCiAgICAg
bV9jYXJldFJlY3ROZWVkc1VwZGF0ZSA9IGZhbHNlOwogfQogCi1SZW5kZXJPYmplY3QqIEZyYW1l
U2VsZWN0aW9uOjpjYXJldFJlbmRlcmVyKCkgY29uc3QKK3N0YXRpYyBpbmxpbmUgYm9vbCBjYXJl
dFJlbmRlcnNJbnNpZGVOb2RlKE5vZGUqIG5vZGUpCit7CisgICAgcmV0dXJuIG5vZGUgJiYgIWlz
VGFibGVFbGVtZW50KG5vZGUpICYmICFlZGl0aW5nSWdub3Jlc0NvbnRlbnQobm9kZSk7Cit9CisK
K1JlbmRlck9iamVjdCogQ2FyZXRCYXNlOjpjYXJldFJlbmRlcmVyKE5vZGUqIG5vZGUpIGNvbnN0
CiB7Ci0gICAgTm9kZSogbm9kZSA9IG1fc2VsZWN0aW9uLnN0YXJ0KCkuZGVwcmVjYXRlZE5vZGUo
KTsKICAgICBpZiAoIW5vZGUpCiAgICAgICAgIHJldHVybiAwOwogCkBAIC0xMDkyLDE3ICsxMTI3
LDI5IEBAIFJlbmRlck9iamVjdCogRnJhbWVTZWxlY3Rpb246OmNhcmV0UmVuZGUKICAgICByZXR1
cm4gcGFpbnRlZEJ5QmxvY2sgPyByZW5kZXJlciA6IHJlbmRlcmVyLT5jb250YWluaW5nQmxvY2so
KTsKIH0KIAorUmVuZGVyT2JqZWN0KiBGcmFtZVNlbGVjdGlvbjo6Y2FyZXRSZW5kZXJlcigpIGNv
bnN0Cit7CisgICAgcmV0dXJuIENhcmV0QmFzZTo6Y2FyZXRSZW5kZXJlcihtX3NlbGVjdGlvbi5z
dGFydCgpLmRlcHJlY2F0ZWROb2RlKCkpOworfQorCitSZW5kZXJPYmplY3QqIERyYWdDYXJldENv
bnRyb2xsZXI6OmNhcmV0UmVuZGVyZXIoKSBjb25zdAoreworICAgIHJldHVybiBDYXJldEJhc2U6
OmNhcmV0UmVuZGVyZXIobV9wb3NpdGlvbi5kZWVwRXF1aXZhbGVudCgpLmRlcHJlY2F0ZWROb2Rl
KCkpOworfQorCiBJbnRSZWN0IEZyYW1lU2VsZWN0aW9uOjpsb2NhbENhcmV0UmVjdCgpCiB7Ci0g
ICAgaWYgKG1fY2FyZXRSZWN0TmVlZHNVcGRhdGUpCi0gICAgICAgIHVwZGF0ZUNhcmV0UmVjdCgp
OwotICAgIAorICAgIGlmIChtX2NhcmV0UmVjdE5lZWRzVXBkYXRlKSB7CisgICAgICAgIGJvb2wg
aXNPcnBoYW5lZCA9ICFpc05vbmUoKSAmJiAoIW1fc2VsZWN0aW9uLnN0YXJ0KCkuYW5jaG9yTm9k
ZSgpLT5pbkRvY3VtZW50KCkgfHwgIW1fc2VsZWN0aW9uLmVuZCgpLmFuY2hvck5vZGUoKS0+aW5E
b2N1bWVudCgpKTsKKyAgICAgICAgdXBkYXRlQ2FyZXRSZWN0KG1fZnJhbWUtPmRvY3VtZW50KCks
IFZpc2libGVQb3NpdGlvbihtX3NlbGVjdGlvbi5zdGFydCgpLCBtX3NlbGVjdGlvbi5hZmZpbml0
eSgpKSwgbV9zZWxlY3Rpb24uc2VsZWN0aW9uVHlwZSgpLCBpc09ycGhhbmVkKTsKKyAgICB9CisK
ICAgICByZXR1cm4gbV9jYXJldFJlY3Q7CiB9CiAKLUludFJlY3QgRnJhbWVTZWxlY3Rpb246OmFi
c29sdXRlQm91bmRzRm9yTG9jYWxSZWN0KGNvbnN0IEludFJlY3QmIHJlY3QpIGNvbnN0CitJbnRS
ZWN0IENhcmV0QmFzZTo6YWJzb2x1dGVCb3VuZHNGb3JMb2NhbFJlY3QoTm9kZSogbm9kZSwgY29u
c3QgSW50UmVjdCYgcmVjdCkgY29uc3QKIHsKLSAgICBSZW5kZXJPYmplY3QqIGNhcmV0UGFpbnRl
ciA9IGNhcmV0UmVuZGVyZXIoKTsKKyAgICBSZW5kZXJPYmplY3QqIGNhcmV0UGFpbnRlciA9IGNh
cmV0UmVuZGVyZXIobm9kZSk7CiAgICAgaWYgKCFjYXJldFBhaW50ZXIpCiAgICAgICAgIHJldHVy
biBJbnRSZWN0KCk7CiAgICAgCkBAIC0xMTI4LDkgKzExNzUsOSBAQCBzdGF0aWMgSW50UmVjdCBy
ZXBhaW50UmVjdEZvckNhcmV0KEludFJlCiAgICAgcmV0dXJuIGNhcmV0OwogfQogCi1JbnRSZWN0
IEZyYW1lU2VsZWN0aW9uOjpjYXJldFJlcGFpbnRSZWN0KCkgY29uc3QKK0ludFJlY3QgQ2FyZXRC
YXNlOjpjYXJldFJlcGFpbnRSZWN0KE5vZGUqIG5vZGUpIGNvbnN0CiB7Ci0gICAgcmV0dXJuIGFi
c29sdXRlQm91bmRzRm9yTG9jYWxSZWN0KHJlcGFpbnRSZWN0Rm9yQ2FyZXQobG9jYWxDYXJldFJl
Y3RGb3JQYWludGluZygpKSk7CisgICAgcmV0dXJuIGFic29sdXRlQm91bmRzRm9yTG9jYWxSZWN0
KG5vZGUsIHJlcGFpbnRSZWN0Rm9yQ2FyZXQobG9jYWxDYXJldFJlY3RGb3JQYWludGluZygpKSk7
CiB9CiAKIGJvb2wgRnJhbWVTZWxlY3Rpb246OnJlY29tcHV0ZUNhcmV0UmVjdCgpCkBAIC0xMTQw
LDcgKzExODcsNyBAQCBib29sIEZyYW1lU2VsZWN0aW9uOjpyZWNvbXB1dGVDYXJldFJlY3QoCiAK
ICAgICBpZiAoIW1fZnJhbWUpCiAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgCisKICAg
ICBGcmFtZVZpZXcqIHYgPSBtX2ZyYW1lLT5kb2N1bWVudCgpLT52aWV3KCk7CiAgICAgaWYgKCF2
KQogICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC0xMTUyLDcgKzExOTksNyBAQCBib29sIEZyYW1l
U2VsZWN0aW9uOjpyZWNvbXB1dGVDYXJldFJlY3QoCiAKICAgICBJbnRSZWN0IG9sZEFic0NhcmV0
Qm91bmRzID0gbV9hYnNDYXJldEJvdW5kczsKICAgICAvLyBGSVhNRTogUmVuYW1lIG1fY2FyZXRS
ZWN0IHRvIG1fbG9jYWxDYXJldFJlY3QuCi0gICAgbV9hYnNDYXJldEJvdW5kcyA9IGFic29sdXRl
Qm91bmRzRm9yTG9jYWxSZWN0KG1fY2FyZXRSZWN0KTsKKyAgICBtX2Fic0NhcmV0Qm91bmRzID0g
YWJzb2x1dGVCb3VuZHNGb3JMb2NhbFJlY3QobV9zZWxlY3Rpb24uc3RhcnQoKS5kZXByZWNhdGVk
Tm9kZSgpLCBtX2NhcmV0UmVjdCk7CiAgICAgbV9hYnNDYXJldEJvdW5kc0RpcnR5ID0gZmFsc2U7
CiAgICAgCiAgICAgaWYgKG9sZEFic0NhcmV0Qm91bmRzID09IG1fYWJzQ2FyZXRCb3VuZHMpCkBA
IC0xMTYwLDI1ICsxMjA3LDI1IEBAIGJvb2wgRnJhbWVTZWxlY3Rpb246OnJlY29tcHV0ZUNhcmV0
UmVjdCgKICAgICAgICAgCiAgICAgSW50UmVjdCBvbGRBYnNvbHV0ZUNhcmV0UmVwYWludEJvdW5k
cyA9IG1fYWJzb2x1dGVDYXJldFJlcGFpbnRCb3VuZHM7CiAgICAgLy8gV2UgYmVsaWV2ZSB0aGF0
IHdlIG5lZWQgdG8gaW5mbGF0ZSB0aGUgbG9jYWwgcmVjdCBiZWZvcmUgdHJhbnNmb3JtaW5nIGl0
IHRvIG9idGFpbiB0aGUgcmVwYWludCBib3VuZHMuCi0gICAgbV9hYnNvbHV0ZUNhcmV0UmVwYWlu
dEJvdW5kcyA9IGNhcmV0UmVwYWludFJlY3QoKTsKKyAgICBtX2Fic29sdXRlQ2FyZXRSZXBhaW50
Qm91bmRzID0gY2FyZXRSZXBhaW50UmVjdChtX3NlbGVjdGlvbi5zdGFydCgpLmRlcHJlY2F0ZWRO
b2RlKCkpOwogCiAjaWYgRU5BQkxFKFRFWFRfQ0FSRVQpICAgIAogICAgIGlmIChSZW5kZXJWaWV3
KiB2aWV3ID0gdG9SZW5kZXJWaWV3KG1fZnJhbWUtPmRvY3VtZW50KCktPnJlbmRlcmVyKCkpKSB7
CiAgICAgICAgIC8vIEZJWE1FOiBtYWtlIGNhcmV0IHJlcGFpbnRpbmcgY29udGFpbmVyLWF3YXJl
LgogICAgICAgICB2aWV3LT5yZXBhaW50UmVjdGFuZ2xlSW5WaWV3QW5kQ29tcG9zaXRlZExheWVy
cyhvbGRBYnNvbHV0ZUNhcmV0UmVwYWludEJvdW5kcywgZmFsc2UpOwotICAgICAgICBpZiAoc2hv
dWxkUmVwYWludENhcmV0KHZpZXcpKQorICAgICAgICBpZiAoc2hvdWxkUmVwYWludENhcmV0KHZp
ZXcsIGlzQ29udGVudEVkaXRhYmxlKCkpKQogICAgICAgICAgICAgdmlldy0+cmVwYWludFJlY3Rh
bmdsZUluVmlld0FuZENvbXBvc2l0ZWRMYXllcnMobV9hYnNvbHV0ZUNhcmV0UmVwYWludEJvdW5k
cywgZmFsc2UpOwogICAgIH0KICNlbmRpZgogICAgIHJldHVybiB0cnVlOwogfQogCi1ib29sIEZy
YW1lU2VsZWN0aW9uOjpzaG91bGRSZXBhaW50Q2FyZXQoY29uc3QgUmVuZGVyVmlldyogdmlldykg
Y29uc3QKK2Jvb2wgQ2FyZXRCYXNlOjpzaG91bGRSZXBhaW50Q2FyZXQoY29uc3QgUmVuZGVyVmll
dyogdmlldywgYm9vbCBpc0NvbnRlbnRFZGl0YWJsZSkgY29uc3QKIHsKICAgICBBU1NFUlQodmll
dyk7CiAgICAgRnJhbWUqIGZyYW1lID0gdmlldy0+ZnJhbWVWaWV3KCkgPyB2aWV3LT5mcmFtZVZp
ZXcoKS0+ZnJhbWUoKSA6IDA7IC8vIFRoZSBmcmFtZSB3aGVyZSB0aGUgc2VsZWN0aW9uIHN0YXJ0
ZWQuCiAgICAgYm9vbCBjYXJldEJyb3dzaW5nID0gZnJhbWUgJiYgZnJhbWUtPnNldHRpbmdzKCkg
JiYgZnJhbWUtPnNldHRpbmdzKCktPmNhcmV0QnJvd3NpbmdFbmFibGVkKCk7Ci0gICAgcmV0dXJu
IChjYXJldEJyb3dzaW5nIHx8IGlzQ29udGVudEVkaXRhYmxlKCkpOworICAgIHJldHVybiAoY2Fy
ZXRCcm93c2luZyB8fCBpc0NvbnRlbnRFZGl0YWJsZSk7CiB9CiAKIHZvaWQgRnJhbWVTZWxlY3Rp
b246OmludmFsaWRhdGVDYXJldFJlY3QoKQpAQCAtMTE4NiwxMiArMTIzMywxMSBAQCB2b2lkIEZy
YW1lU2VsZWN0aW9uOjppbnZhbGlkYXRlQ2FyZXRSZWN0CiAgICAgaWYgKCFpc0NhcmV0KCkpCiAg
ICAgICAgIHJldHVybjsKIAotICAgIERvY3VtZW50KiBkID0gbV9zZWxlY3Rpb24uc3RhcnQoKS5h
bmNob3JOb2RlKCktPmRvY3VtZW50KCk7Ci0KLSAgICAvLyByZWNvbXB1dGVDYXJldFJlY3Qgd2ls
bCBhbHdheXMgcmV0dXJuIGZhbHNlIGZvciB0aGUgZHJhZyBjYXJldCwKLSAgICAvLyBiZWNhdXNl
IGl0cyBtX2ZyYW1lIGlzIGFsd2F5cyAwLgotICAgIGJvb2wgY2FyZXRSZWN0Q2hhbmdlZCA9IHJl
Y29tcHV0ZUNhcmV0UmVjdCgpOworICAgIENhcmV0QmFzZTo6aW52YWxpZGF0ZUNhcmV0UmVjdCht
X3NlbGVjdGlvbi5zdGFydCgpLmRlcHJlY2F0ZWROb2RlKCksIHJlY29tcHV0ZUNhcmV0UmVjdCgp
KTsKK30KIAordm9pZCBDYXJldEJhc2U6OmludmFsaWRhdGVDYXJldFJlY3QoTm9kZSogbm9kZSwg
Ym9vbCBjYXJldFJlY3RDaGFuZ2VkKQorewogICAgIC8vIEVESVQgRklYTUU6IFRoaXMgaXMgYW4g
dW5mb3J0dW5hdGUgaGFjay4KICAgICAvLyBCYXNpY2FsbHksIHdlIGNhbid0IHRydXN0IHRoaXMg
bGF5b3V0IHBvc2l0aW9uIHNpbmNlIHdlIAogICAgIC8vIGNhbid0IGd1YXJhbnRlZSB0aGF0IHRo
ZSBjaGVjayB0byBzZWUgaWYgd2UgYXJlIGluIHVucmVuZGVyZWQgCkBAIC0xMjA2LDI1ICsxMjUy
LDMyIEBAIHZvaWQgRnJhbWVTZWxlY3Rpb246OmludmFsaWRhdGVDYXJldFJlY3QKICAgICBtX2Nh
cmV0UmVjdE5lZWRzVXBkYXRlID0gdHJ1ZTsKIAogICAgIGlmICghY2FyZXRSZWN0Q2hhbmdlZCkg
ewotICAgICAgICBSZW5kZXJWaWV3KiB2aWV3ID0gdG9SZW5kZXJWaWV3KGQtPnJlbmRlcmVyKCkp
OwotICAgICAgICBpZiAodmlldyAmJiBzaG91bGRSZXBhaW50Q2FyZXQodmlldykpCi0gICAgICAg
ICAgICB2aWV3LT5yZXBhaW50UmVjdGFuZ2xlSW5WaWV3QW5kQ29tcG9zaXRlZExheWVycyhjYXJl
dFJlcGFpbnRSZWN0KCksIGZhbHNlKTsKKyAgICAgICAgUmVuZGVyVmlldyogdmlldyA9IHRvUmVu
ZGVyVmlldyhub2RlLT5kb2N1bWVudCgpLT5yZW5kZXJlcigpKTsKKyAgICAgICAgaWYgKHZpZXcg
JiYgc2hvdWxkUmVwYWludENhcmV0KHZpZXcsIG5vZGUtPmlzQ29udGVudEVkaXRhYmxlKCkpKQor
ICAgICAgICAgICAgdmlldy0+cmVwYWludFJlY3RhbmdsZUluVmlld0FuZENvbXBvc2l0ZWRMYXll
cnMoY2FyZXRSZXBhaW50UmVjdChub2RlKSwgZmFsc2UpOwogICAgIH0KIH0KIAogdm9pZCBGcmFt
ZVNlbGVjdGlvbjo6cGFpbnRDYXJldChHcmFwaGljc0NvbnRleHQqIGNvbnRleHQsIGludCB0eCwg
aW50IHR5LCBjb25zdCBJbnRSZWN0JiBjbGlwUmVjdCkKIHsKKyAgICBpZiAoIW1fc2VsZWN0aW9u
LmlzQ2FyZXQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgQ2FyZXRCYXNlOjpwYWludENhcmV0
KG1fc2VsZWN0aW9uLnN0YXJ0KCkuZGVwcmVjYXRlZE5vZGUoKSwgY29udGV4dCwgdHgsIHR5LCBj
bGlwUmVjdCk7Cit9CisKK3ZvaWQgQ2FyZXRCYXNlOjpwYWludENhcmV0KE5vZGUqIG5vZGUsIEdy
YXBoaWNzQ29udGV4dCogY29udGV4dCwgaW50IHR4LCBpbnQgdHksIGNvbnN0IEludFJlY3QmIGNs
aXBSZWN0KSBjb25zdAorewogI2lmIEVOQUJMRShURVhUX0NBUkVUKQogICAgIGlmICghbV9jYXJl
dFZpc2libGUpCiAgICAgICAgIHJldHVybjsKICAgICBpZiAoIW1fY2FyZXRQYWludCkKICAgICAg
ICAgcmV0dXJuOwotICAgIGlmICghbV9zZWxlY3Rpb24uaXNDYXJldCgpKQotICAgICAgICByZXR1
cm47CiAKICAgICBJbnRSZWN0IGRyYXdpbmdSZWN0ID0gbG9jYWxDYXJldFJlY3RGb3JQYWludGlu
ZygpOwotICAgIGlmIChjYXJldFJlbmRlcmVyKCkgJiYgY2FyZXRSZW5kZXJlcigpLT5pc0JveCgp
KQotICAgICAgICB0b1JlbmRlckJveChjYXJldFJlbmRlcmVyKCkpLT5mbGlwRm9yV3JpdGluZ01v
ZGUoZHJhd2luZ1JlY3QpOworICAgIFJlbmRlck9iamVjdCogcmVuZGVyZXIgPSBjYXJldFJlbmRl
cmVyKG5vZGUpOworICAgIGlmIChyZW5kZXJlciAmJiByZW5kZXJlci0+aXNCb3goKSkKKyAgICAg
ICAgdG9SZW5kZXJCb3gocmVuZGVyZXIpLT5mbGlwRm9yV3JpdGluZ01vZGUoZHJhd2luZ1JlY3Qp
OwogICAgIGRyYXdpbmdSZWN0Lm1vdmUodHgsIHR5KTsKICAgICBJbnRSZWN0IGNhcmV0ID0gaW50
ZXJzZWN0aW9uKGRyYXdpbmdSZWN0LCBjbGlwUmVjdCk7CiAgICAgaWYgKGNhcmV0LmlzRW1wdHko
KSkKQEAgLTEyMzIsNyArMTI4NSw3IEBAIHZvaWQgRnJhbWVTZWxlY3Rpb246OnBhaW50Q2FyZXQo
R3JhcGhpY3MKIAogICAgIENvbG9yIGNhcmV0Q29sb3IgPSBDb2xvcjo6YmxhY2s7CiAgICAgQ29s
b3JTcGFjZSBjb2xvclNwYWNlID0gQ29sb3JTcGFjZURldmljZVJHQjsKLSAgICBFbGVtZW50KiBl
bGVtZW50ID0gcm9vdEVkaXRhYmxlRWxlbWVudCgpOworICAgIEVsZW1lbnQqIGVsZW1lbnQgPSBu
b2RlLT5yb290RWRpdGFibGVFbGVtZW50KCk7CiAgICAgaWYgKGVsZW1lbnQgJiYgZWxlbWVudC0+
cmVuZGVyZXIoKSkgewogICAgICAgICBjYXJldENvbG9yID0gZWxlbWVudC0+cmVuZGVyZXIoKS0+
c3R5bGUoKS0+dmlzaXRlZERlcGVuZGVudENvbG9yKENTU1Byb3BlcnR5Q29sb3IpOwogICAgICAg
ICBjb2xvclNwYWNlID0gZWxlbWVudC0+cmVuZGVyZXIoKS0+c3R5bGUoKS0+Y29sb3JTcGFjZSgp
OwpAQCAtMTI0MCw2ICsxMjkzLDcgQEAgdm9pZCBGcmFtZVNlbGVjdGlvbjo6cGFpbnRDYXJldChH
cmFwaGljcwogCiAgICAgY29udGV4dC0+ZmlsbFJlY3QoY2FyZXQsIGNhcmV0Q29sb3IsIGNvbG9y
U3BhY2UpOwogI2Vsc2UKKyAgICBVTlVTRURfUEFSQU0obm9kZSk7CiAgICAgVU5VU0VEX1BBUkFN
KGNvbnRleHQpOwogICAgIFVOVVNFRF9QQVJBTSh0eCk7CiAgICAgVU5VU0VEX1BBUkFNKHR5KTsK
QEAgLTE0ODAsMTMgKzE1MzQsNiBAQCBib29sIEZyYW1lU2VsZWN0aW9uOjppc0luUGFzc3dvcmRG
aWVsZCgpCiAgICAgcmV0dXJuIHN0YXRpY19jYXN0PEhUTUxJbnB1dEVsZW1lbnQqPihzdGFydE5v
ZGUpLT5pc1Bhc3N3b3JkRmllbGQoKTsKIH0KIAotYm9vbCBGcmFtZVNlbGVjdGlvbjo6Y2FyZXRS
ZW5kZXJzSW5zaWRlTm9kZShOb2RlKiBub2RlKSBjb25zdAotewotICAgIGlmICghbm9kZSkKLSAg
ICAgICAgcmV0dXJuIGZhbHNlOwotICAgIHJldHVybiAhaXNUYWJsZUVsZW1lbnQobm9kZSkgJiYg
IWVkaXRpbmdJZ25vcmVzQ29udGVudChub2RlKTsKLX0KLQogdm9pZCBGcmFtZVNlbGVjdGlvbjo6
Zm9jdXNlZE9yQWN0aXZlU3RhdGVDaGFuZ2VkKCkKIHsKICAgICBib29sIGFjdGl2ZUFuZEZvY3Vz
ZWQgPSBpc0ZvY3VzZWRBbmRBY3RpdmUoKTsKQEAgLTE1NTUsOCArMTYwMiw2IEBAIGJvb2wgRnJh
bWVTZWxlY3Rpb246OmlzRm9jdXNlZEFuZEFjdGl2ZSgKIAogdm9pZCBGcmFtZVNlbGVjdGlvbjo6
dXBkYXRlQXBwZWFyYW5jZSgpCiB7Ci0gICAgQVNTRVJUKCFtX2lzRHJhZ0NhcmV0Q29udHJvbGxl
cik7Ci0KICNpZiBFTkFCTEUoVEVYVF9DQVJFVCkKICAgICBib29sIGNhcmV0UmVjdENoYW5nZWQg
PSByZWNvbXB1dGVDYXJldFJlY3QoKTsKIApAQCAtMTcwOSwxMyArMTc1NCwxMSBAQCB2b2lkIEZy
YW1lU2VsZWN0aW9uOjpzZXRGb2N1c2VkTm9kZUlmTmVlCiAgICAgICAgIG1fZnJhbWUtPnBhZ2Uo
KS0+Zm9jdXNDb250cm9sbGVyKCktPnNldEZvY3VzZWROb2RlKDAsIG1fZnJhbWUpOwogfQogCi12
b2lkIEZyYW1lU2VsZWN0aW9uOjpwYWludERyYWdDYXJldChHcmFwaGljc0NvbnRleHQqIHAsIGlu
dCB0eCwgaW50IHR5LCBjb25zdCBJbnRSZWN0JiBjbGlwUmVjdCkgY29uc3QKK3ZvaWQgRHJhZ0Nh
cmV0Q29udHJvbGxlcjo6cGFpbnREcmFnQ2FyZXQoRnJhbWUqIGZyYW1lLCBHcmFwaGljc0NvbnRl
eHQqIHAsIGludCB0eCwgaW50IHR5LCBjb25zdCBJbnRSZWN0JiBjbGlwUmVjdCkgY29uc3QKIHsK
ICNpZiBFTkFCTEUoVEVYVF9DQVJFVCkKLSAgICBGcmFtZVNlbGVjdGlvbiogZHJhZ0NhcmV0Q29u
dHJvbGxlciA9IG1fZnJhbWUtPnBhZ2UoKS0+ZHJhZ0NhcmV0Q29udHJvbGxlcigpOwotICAgIEFT
U0VSVChkcmFnQ2FyZXRDb250cm9sbGVyLT5zZWxlY3Rpb24oKS5pc0NhcmV0KCkpOwotICAgIGlm
IChkcmFnQ2FyZXRDb250cm9sbGVyLT5zZWxlY3Rpb24oKS5zdGFydCgpLmFuY2hvck5vZGUoKS0+
ZG9jdW1lbnQoKS0+ZnJhbWUoKSA9PSBtX2ZyYW1lKQotICAgICAgICBkcmFnQ2FyZXRDb250cm9s
bGVyLT5wYWludENhcmV0KHAsIHR4LCB0eSwgY2xpcFJlY3QpOworICAgIGlmIChtX3Bvc2l0aW9u
LmRlZXBFcXVpdmFsZW50KCkuZGVwcmVjYXRlZE5vZGUoKS0+ZG9jdW1lbnQoKS0+ZnJhbWUoKSA9
PSBmcmFtZSkKKyAgICAgICAgcGFpbnRDYXJldChtX3Bvc2l0aW9uLmRlZXBFcXVpdmFsZW50KCku
ZGVwcmVjYXRlZE5vZGUoKSwgcCwgdHgsIHR5LCBjbGlwUmVjdCk7CiAjZWxzZQogICAgIFVOVVNF
RF9QQVJBTShwKTsKICAgICBVTlVTRURfUEFSQU0odHgpOwpJbmRleDogU291cmNlL1dlYkNvcmUv
ZWRpdGluZy9GcmFtZVNlbGVjdGlvbi5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2Vk
aXRpbmcvRnJhbWVTZWxlY3Rpb24uaAkocmV2aXNpb24gODYwMjIpCisrKyBTb3VyY2UvV2ViQ29y
ZS9lZGl0aW5nL0ZyYW1lU2VsZWN0aW9uLmgJKHdvcmtpbmcgY29weSkKQEAgLTQ4LDcgKzQ4LDU4
IEBAIGNsYXNzIFZpc2libGVQb3NpdGlvbjsKIAogZW51bSBEaXJlY3Rpb25hbGl0eVBvbGljeSB7
IE1ha2VOb25EaXJlY3Rpb25hbFNlbGVjdGlvbiwgTWFrZURpcmVjdGlvbmFsU2VsZWN0aW9uIH07
CiAKLWNsYXNzIEZyYW1lU2VsZWN0aW9uIHsKK2NsYXNzIENhcmV0QmFzZSB7CisgICAgV1RGX01B
S0VfTk9OQ09QWUFCTEUoQ2FyZXRCYXNlKTsKKyAgICBXVEZfTUFLRV9GQVNUX0FMTE9DQVRFRDsK
K3Byb3RlY3RlZDoKKyAgICBDYXJldEJhc2UoKTsKKworICAgIHZvaWQgaW52YWxpZGF0ZUNhcmV0
UmVjdChOb2RlKiwgYm9vbCBjYXJldFJlY3RDaGFuZ2VkID0gZmFsc2UpOworICAgIHZvaWQgdXBk
YXRlQ2FyZXRSZWN0KERvY3VtZW50KiwgY29uc3QgVmlzaWJsZVBvc2l0aW9uJiBjYXJldFBvc2l0
aW9uLCBWaXNpYmxlU2VsZWN0aW9uOjpTZWxlY3Rpb25UeXBlLCBib29sIGlzT3JwaGFuZWQpOwor
ICAgIEludFJlY3QgYWJzb2x1dGVCb3VuZHNGb3JMb2NhbFJlY3QoTm9kZSosIGNvbnN0IEludFJl
Y3QmKSBjb25zdDsKKyAgICBJbnRSZWN0IGFic29sdXRlQ2FyZXRCb3VuZHMoYm9vbCBpc0NvbnRl
bnRFZGl0YWJsZSk7CisgICAgSW50UmVjdCBjYXJldFJlcGFpbnRSZWN0KE5vZGUqKSBjb25zdDsK
KyAgICBib29sIHNob3VsZFJlcGFpbnRDYXJldChjb25zdCBSZW5kZXJWaWV3KiwgYm9vbCBpc0Nv
bnRlbnRFZGl0YWJsZSkgY29uc3Q7CisKKyAgICBJbnRSZWN0IGxvY2FsQ2FyZXRSZWN0Rm9yUGFp
bnRpbmcoKSBjb25zdCB7IHJldHVybiBtX2NhcmV0UmVjdDsgfQorICAgIHZvaWQgcGFpbnRDYXJl
dChOb2RlKiwgR3JhcGhpY3NDb250ZXh0KiwgaW50IHR4LCBpbnQgdHksIGNvbnN0IEludFJlY3Qm
IGNsaXBSZWN0KSBjb25zdDsKKworICAgIFJlbmRlck9iamVjdCogY2FyZXRSZW5kZXJlcihOb2Rl
KikgY29uc3Q7CisKKyAgICBJbnRSZWN0IG1fY2FyZXRSZWN0OyAvLyBjYXJldCByZWN0IGluIGNv
b3JkcyBsb2NhbCB0byB0aGUgcmVuZGVyZXIgcmVzcG9uc2libGUgZm9yIHBhaW50aW5nIHRoZSBj
YXJldAorICAgIEludFJlY3QgbV9hYnNDYXJldEJvdW5kczsgLy8gYWJzb2x1dGUgYm91bmRpbmcg
cmVjdCBmb3IgdGhlIGNhcmV0CisgICAgSW50UmVjdCBtX2Fic29sdXRlQ2FyZXRSZXBhaW50Qm91
bmRzOworCisgICAgYm9vbCBtX2NhcmV0UmVjdE5lZWRzVXBkYXRlOyAvLyB0cnVlIGlmIG1fY2Fy
ZXRSZWN0IGFuZCBtX2Fic0NhcmV0Qm91bmRzIG5lZWQgdG8gYmUgY2FsY3VsYXRlZAorICAgIGJv
b2wgbV9hYnNDYXJldEJvdW5kc0RpcnR5OworICAgIGJvb2wgbV9jYXJldFZpc2libGU7CisgICAg
Ym9vbCBtX2NhcmV0UGFpbnQ7Cit9OworCitjbGFzcyBEcmFnQ2FyZXRDb250cm9sbGVyIDogcHJp
dmF0ZSBDYXJldEJhc2UgeworICAgIFdURl9NQUtFX05PTkNPUFlBQkxFKERyYWdDYXJldENvbnRy
b2xsZXIpOworICAgIFdURl9NQUtFX0ZBU1RfQUxMT0NBVEVEOworcHVibGljOgorICAgIERyYWdD
YXJldENvbnRyb2xsZXIoKTsKKworICAgIFJlbmRlck9iamVjdCogY2FyZXRSZW5kZXJlcigpIGNv
bnN0OworICAgIHZvaWQgcGFpbnREcmFnQ2FyZXQoRnJhbWUqLCBHcmFwaGljc0NvbnRleHQqLCBp
bnQgdHgsIGludCB0eSwgY29uc3QgSW50UmVjdCYgY2xpcFJlY3QpIGNvbnN0OworCisgICAgYm9v
bCBpc0NvbnRlbnRFZGl0YWJsZSgpIGNvbnN0IHsgcmV0dXJuIG1fcG9zaXRpb24ucm9vdEVkaXRh
YmxlRWxlbWVudCgpOyB9CisgICAgYm9vbCBpc0NvbnRlbnRSaWNobHlFZGl0YWJsZSgpIGNvbnN0
OworCisgICAgYm9vbCBoYXNDYXJldCgpIGNvbnN0IHsgcmV0dXJuIG1fcG9zaXRpb24uaXNOb3RO
dWxsKCk7IH0KKyAgICBjb25zdCBWaXNpYmxlUG9zaXRpb24mIGNhcmV0UG9zaXRpb24oKSB7IHJl
dHVybiBtX3Bvc2l0aW9uOyB9CisgICAgdm9pZCBzZXRDYXJldFBvc2l0aW9uKGNvbnN0IFZpc2li
bGVQb3NpdGlvbiYpOworICAgIHZvaWQgY2xlYXIoKSB7IHNldENhcmV0UG9zaXRpb24oVmlzaWJs
ZVBvc2l0aW9uKCkpOyB9CisKKyAgICB2b2lkIG5vZGVXaWxsQmVSZW1vdmVkKE5vZGUqKTsKKwor
cHJpdmF0ZToKKyAgICBWaXNpYmxlUG9zaXRpb24gbV9wb3NpdGlvbjsKK307CisKK2NsYXNzIEZy
YW1lU2VsZWN0aW9uIDogcHJpdmF0ZSBDYXJldEJhc2UgewogICAgIFdURl9NQUtFX05PTkNPUFlB
QkxFKEZyYW1lU2VsZWN0aW9uKTsKICAgICBXVEZfTUFLRV9GQVNUX0FMTE9DQVRFRDsKIHB1Ymxp
YzoKQEAgLTYzLDcgKzExNCw3IEBAIHB1YmxpYzoKICAgICB9OwogICAgIHR5cGVkZWYgdW5zaWdu
ZWQgU2V0U2VsZWN0aW9uT3B0aW9uczsKIAotICAgIEZyYW1lU2VsZWN0aW9uKEZyYW1lKiA9IDAs
IGJvb2wgaXNEcmFnQ2FyZXRDb250cm9sbGVyID0gZmFsc2UpOworICAgIEZyYW1lU2VsZWN0aW9u
KEZyYW1lKiA9IDApOwogCiAgICAgRWxlbWVudCogcm9vdEVkaXRhYmxlRWxlbWVudCgpIGNvbnN0
IHsgcmV0dXJuIG1fc2VsZWN0aW9uLnJvb3RFZGl0YWJsZUVsZW1lbnQoKTsgfQogICAgIGJvb2wg
aXNDb250ZW50RWRpdGFibGUoKSBjb25zdCB7IHJldHVybiBtX3NlbGVjdGlvbi5pc0NvbnRlbnRF
ZGl0YWJsZSgpOyB9CkBAIC0xMTQsNyArMTY1LDYgQEAgcHVibGljOgogCiAgICAgLy8gQ2FyZXQg
cmVjdCBsb2NhbCB0byB0aGUgY2FyZXQncyByZW5kZXJlcgogICAgIEludFJlY3QgbG9jYWxDYXJl
dFJlY3QoKTsKLSAgICBJbnRSZWN0IGxvY2FsQ2FyZXRSZWN0Rm9yUGFpbnRpbmcoKSBjb25zdCB7
IHJldHVybiBtX2NhcmV0UmVjdDsgfQogCiAgICAgLy8gQm91bmRzIG9mIChwb3NzaWJseSB0cmFu
c2Zvcm1lZCkgY2FyZXQgaW4gYWJzb2x1dGUgY29vcmRzCiAgICAgSW50UmVjdCBhYnNvbHV0ZUNh
cmV0Qm91bmRzKCk7CkBAIC0xMzksNyArMTg5LDcgQEAgcHVibGljOgogCiAgICAgdm9pZCBzZXRD
YXJldFZpc2libGUoYm9vbCA9IHRydWUpOwogICAgIHZvaWQgY2xlYXJDYXJldFJlY3RJZk5lZWRl
ZCgpOwotICAgIGJvb2wgcmVjb21wdXRlQ2FyZXRSZWN0KCk7IC8vIHJldHVybnMgdHJ1ZSBpZiBj
YXJldCByZWN0IG1vdmVkCisgICAgYm9vbCByZWNvbXB1dGVDYXJldFJlY3QoKTsKICAgICB2b2lk
IGludmFsaWRhdGVDYXJldFJlY3QoKTsKICAgICB2b2lkIHBhaW50Q2FyZXQoR3JhcGhpY3NDb250
ZXh0KiwgaW50IHR4LCBpbnQgdHksIGNvbnN0IEludFJlY3QmIGNsaXBSZWN0KTsKIApAQCAtMjAz
LDE4ICsyNTMsMTEgQEAgcHJpdmF0ZToKICAgICBWaXNpYmxlUG9zaXRpb24gbW9kaWZ5TW92aW5n
TGVmdChUZXh0R3JhbnVsYXJpdHkpOwogICAgIFZpc2libGVQb3NpdGlvbiBtb2RpZnlNb3ZpbmdC
YWNrd2FyZChUZXh0R3JhbnVsYXJpdHkpOwogCi0gICAgdm9pZCB1cGRhdGVDYXJldFJlY3QoKTsK
LSAgICBJbnRSZWN0IGNhcmV0UmVwYWludFJlY3QoKSBjb25zdDsKLSAgICBib29sIHNob3VsZFJl
cGFpbnRDYXJldChjb25zdCBSZW5kZXJWaWV3KiB2aWV3KSBjb25zdDsKLQogICAgIGludCB4UG9z
Rm9yVmVydGljYWxBcnJvd05hdmlnYXRpb24oRVBvc2l0aW9uVHlwZSk7CiAgICAgCiAgICAgdm9p
ZCBub3RpZnlBY2Nlc3NpYmlsaXR5Rm9yU2VsZWN0aW9uQ2hhbmdlKCk7CiAKICAgICB2b2lkIGZv
Y3VzZWRPckFjdGl2ZVN0YXRlQ2hhbmdlZCgpOwotICAgIGJvb2wgY2FyZXRSZW5kZXJzSW5zaWRl
Tm9kZShOb2RlKikgY29uc3Q7Ci0gICAgCi0gICAgSW50UmVjdCBhYnNvbHV0ZUJvdW5kc0Zvckxv
Y2FsUmVjdChjb25zdCBJbnRSZWN0JikgY29uc3Q7CiAKICAgICB2b2lkIGNhcmV0QmxpbmtUaW1l
ckZpcmVkKFRpbWVyPEZyYW1lU2VsZWN0aW9uPiopOwogCkBAIC0yMzEsMTggKzI3NCw5IEBAIHBy
aXZhdGU6CiAKICAgICBUaW1lcjxGcmFtZVNlbGVjdGlvbj4gbV9jYXJldEJsaW5rVGltZXI7CiAK
LSAgICBJbnRSZWN0IG1fY2FyZXRSZWN0OyAvLyBjYXJldCByZWN0IGluIGNvb3JkcyBsb2NhbCB0
byB0aGUgcmVuZGVyZXIgcmVzcG9uc2libGUgZm9yIHBhaW50aW5nIHRoZSBjYXJldAotICAgIElu
dFJlY3QgbV9hYnNDYXJldEJvdW5kczsgLy8gYWJzb2x1dGUgYm91bmRpbmcgcmVjdCBmb3IgdGhl
IGNhcmV0Ci0gICAgSW50UmVjdCBtX2Fic29sdXRlQ2FyZXRSZXBhaW50Qm91bmRzOwotICAgIAot
ICAgIGJvb2wgbV9jYXJldFJlY3ROZWVkc1VwZGF0ZTsgLy8gdHJ1ZSBpZiBtX2NhcmV0UmVjdCBh
bmQgbV9hYnNDYXJldEJvdW5kcyBuZWVkIHRvIGJlIGNhbGN1bGF0ZWQKLSAgICBib29sIG1fYWJz
Q2FyZXRCb3VuZHNEaXJ0eTsKICAgICBib29sIG1faXNEaXJlY3Rpb25hbDsKLSAgICBib29sIG1f
aXNEcmFnQ2FyZXRDb250cm9sbGVyOwogICAgIGJvb2wgbV9pc0NhcmV0QmxpbmtpbmdTdXNwZW5k
ZWQ7CiAgICAgYm9vbCBtX2ZvY3VzZWQ7Ci0gICAgYm9vbCBtX2NhcmV0VmlzaWJsZTsKLSAgICBi
b29sIG1fY2FyZXRQYWludDsKIH07CiAKIGlubGluZSBFZGl0aW5nU3R5bGUqIEZyYW1lU2VsZWN0
aW9uOjp0eXBpbmdTdHlsZSgpIGNvbnN0CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wYWdlL0RyYWdD
b250cm9sbGVyLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wYWdlL0RyYWdDb250
cm9sbGVyLmNwcAkocmV2aXNpb24gODYwMjIpCisrKyBTb3VyY2UvV2ViQ29yZS9wYWdlL0RyYWdD
b250cm9sbGVyLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzMwLDEwICszMzAsOCBAQCBib29sIERy
YWdDb250cm9sbGVyOjp0cnlEb2N1bWVudERyYWcoRHJhCiAgICAgICAgIEVsZW1lbnQqIGVsZW1l
bnQgPSBlbGVtZW50VW5kZXJNb3VzZShtX2RvY3VtZW50VW5kZXJNb3VzZS5nZXQoKSwgcG9pbnQp
OwogICAgICAgICBpZiAoIWVsZW1lbnQpCiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAg
ICAgIGlmICghYXNGaWxlSW5wdXQoZWxlbWVudCkpIHsKLSAgICAgICAgICAgIFZpc2libGVTZWxl
Y3Rpb24gZHJhZ0NhcmV0ID0gbV9kb2N1bWVudFVuZGVyTW91c2UtPmZyYW1lKCktPnZpc2libGVQ
b3NpdGlvbkZvclBvaW50KHBvaW50KTsKLSAgICAgICAgICAgIG1fcGFnZS0+ZHJhZ0NhcmV0Q29u
dHJvbGxlcigpLT5zZXRTZWxlY3Rpb24oZHJhZ0NhcmV0KTsKLSAgICAgICAgfQorICAgICAgICBp
ZiAoIWFzRmlsZUlucHV0KGVsZW1lbnQpKQorICAgICAgICAgICAgbV9wYWdlLT5kcmFnQ2FyZXRD
b250cm9sbGVyKCktPnNldENhcmV0UG9zaXRpb24obV9kb2N1bWVudFVuZGVyTW91c2UtPmZyYW1l
KCktPnZpc2libGVQb3NpdGlvbkZvclBvaW50KHBvaW50KSk7CiAKICAgICAgICAgRnJhbWUqIGlu
bmVyRnJhbWUgPSBlbGVtZW50LT5kb2N1bWVudCgpLT5mcmFtZSgpOwogICAgICAgICBvcGVyYXRp
b24gPSBkcmFnSXNNb3ZlKGlubmVyRnJhbWUtPnNlbGVjdGlvbigpLCBkcmFnRGF0YSkgPyBEcmFn
T3BlcmF0aW9uTW92ZSA6IERyYWdPcGVyYXRpb25Db3B5OwpAQCAtMzcyLDEwICszNzAsOSBAQCBz
dGF0aWMgYm9vbCBzZXRTZWxlY3Rpb25Ub0RyYWdDYXJldChGcmFtCiAKIGJvb2wgRHJhZ0NvbnRy
b2xsZXI6OmRpc3BhdGNoVGV4dElucHV0RXZlbnRGb3IoRnJhbWUqIGlubmVyRnJhbWUsIERyYWdE
YXRhKiBkcmFnRGF0YSkKIHsKLSAgICBBU1NFUlQoIW1fcGFnZS0+ZHJhZ0NhcmV0Q29udHJvbGxl
cigpLT5pc05vbmUoKSk7Ci0gICAgVmlzaWJsZVNlbGVjdGlvbiBkcmFnQ2FyZXQobV9wYWdlLT5k
cmFnQ2FyZXRDb250cm9sbGVyKCktPnNlbGVjdGlvbigpKTsKLSAgICBTdHJpbmcgdGV4dCA9IGRy
YWdDYXJldC5pc0NvbnRlbnRSaWNobHlFZGl0YWJsZSgpID8gIiIgOiBkcmFnRGF0YS0+YXNQbGFp
blRleHQoaW5uZXJGcmFtZSk7Ci0gICAgTm9kZSogdGFyZ2V0ID0gaW5uZXJGcmFtZS0+ZWRpdG9y
KCktPmZpbmRFdmVudFRhcmdldEZyb20oZHJhZ0NhcmV0KTsKKyAgICBBU1NFUlQobV9wYWdlLT5k
cmFnQ2FyZXRDb250cm9sbGVyKCktPmhhc0NhcmV0KCkpOworICAgIFN0cmluZyB0ZXh0ID0gbV9w
YWdlLT5kcmFnQ2FyZXRDb250cm9sbGVyKCktPmlzQ29udGVudFJpY2hseUVkaXRhYmxlKCkgPyAi
IiA6IGRyYWdEYXRhLT5hc1BsYWluVGV4dChpbm5lckZyYW1lKTsKKyAgICBOb2RlKiB0YXJnZXQg
PSBpbm5lckZyYW1lLT5lZGl0b3IoKS0+ZmluZEV2ZW50VGFyZ2V0RnJvbShtX3BhZ2UtPmRyYWdD
YXJldENvbnRyb2xsZXIoKS0+Y2FyZXRQb3NpdGlvbigpKTsKICAgICBFeGNlcHRpb25Db2RlIGVj
ID0gMDsKICAgICByZXR1cm4gdGFyZ2V0LT5kaXNwYXRjaEV2ZW50KFRleHRFdmVudDo6Y3JlYXRl
Rm9yRHJvcChpbm5lckZyYW1lLT5kb21XaW5kb3coKSwgdGV4dCksIGVjKTsKIH0KQEAgLTM5NSw3
ICszOTIsNyBAQCBib29sIERyYWdDb250cm9sbGVyOjpjb25jbHVkZUVkaXREcmFnKERyCiAgICAg
RnJhbWUqIGlubmVyRnJhbWUgPSBlbGVtZW50LT5vd25lckRvY3VtZW50KCktPmZyYW1lKCk7CiAg
ICAgQVNTRVJUKGlubmVyRnJhbWUpOwogCi0gICAgaWYgKCFtX3BhZ2UtPmRyYWdDYXJldENvbnRy
b2xsZXIoKS0+aXNOb25lKCkgJiYgIWRpc3BhdGNoVGV4dElucHV0RXZlbnRGb3IoaW5uZXJGcmFt
ZSwgZHJhZ0RhdGEpKQorICAgIGlmIChtX3BhZ2UtPmRyYWdDYXJldENvbnRyb2xsZXIoKS0+aGFz
Q2FyZXQoKSAmJiAhZGlzcGF0Y2hUZXh0SW5wdXRFdmVudEZvcihpbm5lckZyYW1lLCBkcmFnRGF0
YSkpCiAgICAgICAgIHJldHVybiB0cnVlOwogCiAgICAgaWYgKGRyYWdEYXRhLT5jb250YWluc0Nv
bG9yKCkpIHsKQEAgLTQ0MSw3ICs0MzgsNyBAQCBib29sIERyYWdDb250cm9sbGVyOjpjb25jbHVk
ZUVkaXREcmFnKERyCiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAotICAgIFZpc2libGVT
ZWxlY3Rpb24gZHJhZ0NhcmV0KG1fcGFnZS0+ZHJhZ0NhcmV0Q29udHJvbGxlcigpLT5zZWxlY3Rp
b24oKSk7CisgICAgVmlzaWJsZVNlbGVjdGlvbiBkcmFnQ2FyZXQgPSBtX3BhZ2UtPmRyYWdDYXJl
dENvbnRyb2xsZXIoKS0+Y2FyZXRQb3NpdGlvbigpOwogICAgIG1fcGFnZS0+ZHJhZ0NhcmV0Q29u
dHJvbGxlcigpLT5jbGVhcigpOwogICAgIFJlZlB0cjxSYW5nZT4gcmFuZ2UgPSBkcmFnQ2FyZXQu
dG9Ob3JtYWxpemVkUmFuZ2UoKTsKIApAQCAtODUxLDggKzg0OCw4IEBAIHZvaWQgRHJhZ0NvbnRy
b2xsZXI6OnBsYWNlRHJhZ0NhcmV0KGNvbnMKICAgICBpZiAoIWZyYW1lVmlldykKICAgICAgICAg
cmV0dXJuOwogICAgIEludFBvaW50IGZyYW1lUG9pbnQgPSBmcmFtZVZpZXctPndpbmRvd1RvQ29u
dGVudHMod2luZG93UG9pbnQpOwotICAgIFZpc2libGVTZWxlY3Rpb24gZHJhZ0NhcmV0KGZyYW1l
LT52aXNpYmxlUG9zaXRpb25Gb3JQb2ludChmcmFtZVBvaW50KSk7Ci0gICAgbV9wYWdlLT5kcmFn
Q2FyZXRDb250cm9sbGVyKCktPnNldFNlbGVjdGlvbihkcmFnQ2FyZXQpOworCisgICAgbV9wYWdl
LT5kcmFnQ2FyZXRDb250cm9sbGVyKCktPnNldENhcmV0UG9zaXRpb24oZnJhbWUtPnZpc2libGVQ
b3NpdGlvbkZvclBvaW50KGZyYW1lUG9pbnQpKTsKIH0KIAogfSAvLyBuYW1lc3BhY2UgV2ViQ29y
ZQpJbmRleDogU291cmNlL1dlYkNvcmUvcGFnZS9QYWdlLmNwcAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3Vy
Y2UvV2ViQ29yZS9wYWdlL1BhZ2UuY3BwCShyZXZpc2lvbiA4NjAyMikKKysrIFNvdXJjZS9XZWJD
b3JlL3BhZ2UvUGFnZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTExNSw3ICsxMTUsNyBAQCBzdGF0
aWMgdm9pZCBuZXR3b3JrU3RhdGVDaGFuZ2VkKCkKIAogUGFnZTo6UGFnZShjb25zdCBQYWdlQ2xp
ZW50cyYgcGFnZUNsaWVudHMpCiAgICAgOiBtX2Nocm9tZShhZG9wdFB0cihuZXcgQ2hyb21lKHRo
aXMsIHBhZ2VDbGllbnRzLmNocm9tZUNsaWVudCkpKQotICAgICwgbV9kcmFnQ2FyZXRDb250cm9s
bGVyKGFkb3B0UHRyKG5ldyBGcmFtZVNlbGVjdGlvbigwLCB0cnVlKSkpCisgICAgLCBtX2RyYWdD
YXJldENvbnRyb2xsZXIoYWRvcHRQdHIobmV3IERyYWdDYXJldENvbnRyb2xsZXIpKQogI2lmIEVO
QUJMRShEUkFHX1NVUFBPUlQpCiAgICAgLCBtX2RyYWdDb250cm9sbGVyKGFkb3B0UHRyKG5ldyBE
cmFnQ29udHJvbGxlcih0aGlzLCBwYWdlQ2xpZW50cy5kcmFnQ2xpZW50KSkpCiAjZW5kaWYKSW5k
ZXg6IFNvdXJjZS9XZWJDb3JlL3BhZ2UvUGFnZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJD
b3JlL3BhZ2UvUGFnZS5oCShyZXZpc2lvbiA4NjAyMikKKysrIFNvdXJjZS9XZWJDb3JlL3BhZ2Uv
UGFnZS5oCSh3b3JraW5nIGNvcHkpCkBAIC01NCw2ICs1NCw3IEBAIG5hbWVzcGFjZSBXZWJDb3Jl
IHsKICAgICBjbGFzcyBEZXZpY2VPcmllbnRhdGlvbkNsaWVudDsKICAgICBjbGFzcyBEZXZpY2VP
cmllbnRhdGlvbkNvbnRyb2xsZXI7CiAgICAgY2xhc3MgRG9jdW1lbnQ7CisgICAgY2xhc3MgRHJh
Z0NhcmV0Q29udHJvbGxlcjsKICAgICBjbGFzcyBEcmFnQ2xpZW50OwogICAgIGNsYXNzIERyYWdD
b250cm9sbGVyOwogICAgIGNsYXNzIEVkaXRvckNsaWVudDsKQEAgLTE2NSw3ICsxNjYsNyBAQCBu
YW1lc3BhY2UgV2ViQ29yZSB7CiAgICAgICAgIGludCBmcmFtZUNvdW50KCkgY29uc3QgeyBjaGVj
a0ZyYW1lQ291bnRDb25zaXN0ZW5jeSgpOyByZXR1cm4gbV9mcmFtZUNvdW50OyB9CiAKICAgICAg
ICAgQ2hyb21lKiBjaHJvbWUoKSBjb25zdCB7IHJldHVybiBtX2Nocm9tZS5nZXQoKTsgfQotICAg
ICAgICBGcmFtZVNlbGVjdGlvbiogZHJhZ0NhcmV0Q29udHJvbGxlcigpIGNvbnN0IHsgcmV0dXJu
IG1fZHJhZ0NhcmV0Q29udHJvbGxlci5nZXQoKTsgfQorICAgICAgICBEcmFnQ2FyZXRDb250cm9s
bGVyKiBkcmFnQ2FyZXRDb250cm9sbGVyKCkgY29uc3QgeyByZXR1cm4gbV9kcmFnQ2FyZXRDb250
cm9sbGVyLmdldCgpOyB9CiAjaWYgRU5BQkxFKERSQUdfU1VQUE9SVCkKICAgICAgICAgRHJhZ0Nv
bnRyb2xsZXIqIGRyYWdDb250cm9sbGVyKCkgY29uc3QgeyByZXR1cm4gbV9kcmFnQ29udHJvbGxl
ci5nZXQoKTsgfQogI2VuZGlmCkBAIC0zMTUsNyArMzE2LDcgQEAgbmFtZXNwYWNlIFdlYkNvcmUg
ewogICAgICAgICBkb3VibGUgbWluaW11bVRpbWVySW50ZXJ2YWwoKSBjb25zdDsKIAogICAgICAg
ICBPd25QdHI8Q2hyb21lPiBtX2Nocm9tZTsKLSAgICAgICAgT3duUHRyPEZyYW1lU2VsZWN0aW9u
PiBtX2RyYWdDYXJldENvbnRyb2xsZXI7CisgICAgICAgIE93blB0cjxEcmFnQ2FyZXRDb250cm9s
bGVyPiBtX2RyYWdDYXJldENvbnRyb2xsZXI7CiAKICNpZiBFTkFCTEUoQUNDRUxFUkFURURfMkRf
Q0FOVkFTKQogICAgICAgICBSZWZQdHI8U2hhcmVkR3JhcGhpY3NDb250ZXh0M0Q+IG1fc2hhcmVk
R3JhcGhpY3NDb250ZXh0M0Q7CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVy
QmxvY2suY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJC
bG9jay5jcHAJKHJldmlzaW9uIDg2MDIyKQorKysgU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1Jl
bmRlckJsb2NrLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjQyOSwxMiArMjQyOSwxOSBAQCB2b2lk
IFJlbmRlckJsb2NrOjpwYWludENoaWxkcmVuKFBhaW50SW5mCiAKIHZvaWQgUmVuZGVyQmxvY2s6
OnBhaW50Q2FyZXQoUGFpbnRJbmZvJiBwYWludEluZm8sIGludCB0eCwgaW50IHR5LCBDYXJldFR5
cGUgdHlwZSkKIHsKLSAgICBGcmFtZVNlbGVjdGlvbiogc2VsZWN0aW9uID0gdHlwZSA9PSBDdXJz
b3JDYXJldCA/IGZyYW1lKCktPnNlbGVjdGlvbigpIDogZnJhbWUoKS0+cGFnZSgpLT5kcmFnQ2Fy
ZXRDb250cm9sbGVyKCk7Ci0KICAgICAvLyBQYWludCB0aGUgY2FyZXQgaWYgdGhlIEZyYW1lU2Vs
ZWN0aW9uIHNheXMgc28gb3IgaWYgY2FyZXQgYnJvd3NpbmcgaXMgZW5hYmxlZAogICAgIGJvb2wg
Y2FyZXRCcm93c2luZyA9IGZyYW1lKCktPnNldHRpbmdzKCkgJiYgZnJhbWUoKS0+c2V0dGluZ3Mo
KS0+Y2FyZXRCcm93c2luZ0VuYWJsZWQoKTsKLSAgICBSZW5kZXJPYmplY3QqIGNhcmV0UGFpbnRl
ciA9IHNlbGVjdGlvbi0+Y2FyZXRSZW5kZXJlcigpOwotICAgIGlmIChjYXJldFBhaW50ZXIgPT0g
dGhpcyAmJiAoc2VsZWN0aW9uLT5pc0NvbnRlbnRFZGl0YWJsZSgpIHx8IGNhcmV0QnJvd3Npbmcp
KSB7CisgICAgUmVuZGVyT2JqZWN0KiBjYXJldFBhaW50ZXI7CisgICAgYm9vbCBpc0NvbnRlbnRF
ZGl0YWJsZTsKKyAgICBpZiAodHlwZSA9PSBDdXJzb3JDYXJldCkgeworICAgICAgICBjYXJldFBh
aW50ZXIgPSBmcmFtZSgpLT5zZWxlY3Rpb24oKS0+Y2FyZXRSZW5kZXJlcigpOworICAgICAgICBp
c0NvbnRlbnRFZGl0YWJsZSA9IGZyYW1lKCktPnNlbGVjdGlvbigpLT5pc0NvbnRlbnRFZGl0YWJs
ZSgpOworICAgIH0gZWxzZSB7CisgICAgICAgIGNhcmV0UGFpbnRlciA9IGZyYW1lKCktPnBhZ2Uo
KS0+ZHJhZ0NhcmV0Q29udHJvbGxlcigpLT5jYXJldFJlbmRlcmVyKCk7CisgICAgICAgIGlzQ29u
dGVudEVkaXRhYmxlID0gZnJhbWUoKS0+cGFnZSgpLT5kcmFnQ2FyZXRDb250cm9sbGVyKCktPmlz
Q29udGVudEVkaXRhYmxlKCk7CisgICAgfQorCisgICAgaWYgKGNhcmV0UGFpbnRlciA9PSB0aGlz
ICYmIChpc0NvbnRlbnRFZGl0YWJsZSB8fCBjYXJldEJyb3dzaW5nKSkgewogICAgICAgICAvLyBD
b252ZXJ0IHRoZSBwYWludGluZyBvZmZzZXQgaW50byB0aGUgbG9jYWwgY29vcmRpbmF0ZSBzeXN0
ZW0gb2YgdGhpcyByZW5kZXJlciwKICAgICAgICAgLy8gdG8gbWF0Y2ggdGhlIGxvY2FsQ2FyZXRS
ZWN0IGNvbXB1dGVkIGJ5IHRoZSBGcmFtZVNlbGVjdGlvbgogICAgICAgICBvZmZzZXRGb3JDb250
ZW50cyh0eCwgdHkpOwpAQCAtMjQ0Miw3ICsyNDQ5LDcgQEAgdm9pZCBSZW5kZXJCbG9jazo6cGFp
bnRDYXJldChQYWludEluZm8mIAogICAgICAgICBpZiAodHlwZSA9PSBDdXJzb3JDYXJldCkKICAg
ICAgICAgICAgIGZyYW1lKCktPnNlbGVjdGlvbigpLT5wYWludENhcmV0KHBhaW50SW5mby5jb250
ZXh0LCB0eCwgdHksIHBhaW50SW5mby5yZWN0KTsKICAgICAgICAgZWxzZQotICAgICAgICAgICAg
ZnJhbWUoKS0+c2VsZWN0aW9uKCktPnBhaW50RHJhZ0NhcmV0KHBhaW50SW5mby5jb250ZXh0LCB0
eCwgdHksIHBhaW50SW5mby5yZWN0KTsKKyAgICAgICAgICAgIGZyYW1lKCktPnBhZ2UoKS0+ZHJh
Z0NhcmV0Q29udHJvbGxlcigpLT5wYWludERyYWdDYXJldChmcmFtZSgpLCBwYWludEluZm8uY29u
dGV4dCwgdHgsIHR5LCBwYWludEluZm8ucmVjdCk7CiAgICAgfQogfQogCg==
</data>
<flag name="review"
          id="85766"
          type_id="1"
          status="+"
          setter="darin"
    />
          </attachment>
      

    </bug>

</bugzilla>