<?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>70788</bug_id>
          
          <creation_ts>2011-10-24 17:25:27 -0700</creation_ts>
          <short_desc>[MutationObservers] Implement subtree observation of transiently disconnected nodes</short_desc>
          <delta_ts>2011-10-27 16:38:30 -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>DOM</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>68729</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Rafael Weinstein">rafaelw</reporter>
          <assigned_to name="Rafael Weinstein">rafaelw</assigned_to>
          <cc>adamk</cc>
    
    <cc>darin</cc>
    
    <cc>ojan</cc>
    
    <cc>rniwa</cc>
    
    <cc>sam</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>489807</commentid>
    <comment_count>0</comment_count>
    <who name="Rafael Weinstein">rafaelw</who>
    <bug_when>2011-10-24 17:25:27 -0700</bug_when>
    <thetext>From the public-webapps webkit/mozilla proposal: 

Subtree Observation
If the subtree option is requested during registration, the observer
is delivered mutations which occur to a set of observed nodes which is
computed as follows:

- At the time of registration, the set includes |target| and all
descendant nodes
- At any point, if a node becomes a descendant of |target|, it is
synchronously added to the observed set
- Immediately before delivering all pending MutationRecords to the
observer, all nodes which are no longer descendants of |target| are
removed from the observed set.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>489817</commentid>
    <comment_count>1</comment_count>
      <attachid>112287</attachid>
    <who name="Rafael Weinstein">rafaelw</who>
    <bug_when>2011-10-24 18:06:31 -0700</bug_when>
    <thetext>Created attachment 112287
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>489825</commentid>
    <comment_count>2</comment_count>
      <attachid>112287</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-10-24 18:29:26 -0700</bug_when>
    <thetext>Comment on attachment 112287
Patch

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

&gt; Source/WebCore/dom/WebKitMutationObserver.cpp:67
&gt; +    TransientObservedNodesMap::iterator mapIter = m_transientObservedNodes.find(node);

Here, I can&apos;t easily tell what the types of mapIter-&gt;first and mapIter-&gt;second are.

&gt; Source/WebCore/dom/WebKitMutationObserver.h:88
&gt; +    typedef HashMap&lt;Node*, HashSet&lt;RefPtr&lt;Node&gt; &gt; &gt; TransientObservedNodesMap;
&gt; +    TransientObservedNodesMap m_transientObservedNodes;

I&apos;d prefer type-defing HashSet&lt;RefPtr&lt;Node&gt; &gt; (e.g. NodeHashSet) and leaving HashSet&lt;Node*, NodeHashSet&gt; so that the types of keys and values are self-evident wherever this type is used.

&gt; Source/WebCore/dom/WebKitMutationObserver.h:92
&gt; +typedef HashMap&lt;WebKitMutationObserver*, MutationObserverOptions&gt; MutationObserverOptionsMap;
&gt; +

I&apos;d prefer seeing this definition wherever MutationObserverOptionsMap is used. The definition makes the types of first and second clear whereas if we typedef-ed, I have to keep looking at this header file to know what types keys and values were.

&gt; LayoutTests/fast/mutation/observe-subtree.html:127
&gt; +    function finish() {

I definitely would like to see test cases where an iframe is observed and where an node is adopted from one frame to another. Of course, that could be done in a separate .html file.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>489829</commentid>
    <comment_count>3</comment_count>
      <attachid>112287</attachid>
    <who name="Adam Klein">adamk</who>
    <bug_when>2011-10-24 18:46:07 -0700</bug_when>
    <thetext>Comment on attachment 112287
Patch

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

&gt; Source/WebCore/dom/Node.cpp:2766
&gt; +            if (!entry.transientOfNode &amp;&amp; entry.hasAllOptions(WebKitMutationObserver::Subtree))

!entry.transientOfNode is incorrect here, you often do want to &quot;copy&quot; an already-transient observation.

&gt; Source/WebCore/dom/Node.cpp:2767
&gt; +                entry.observer-&gt;observedSubtreeWillDisconnect(node, entry.options, this);

I think this will need to do something slightly different in the already-transient case, since you want to make the new transient entry point back to the original node, not the &quot;new&quot; transient one.

&gt; Source/WebCore/dom/Node.h:598
&gt; +    MutationRegistrationResult registerMutationObserver(PassRefPtr&lt;WebKitMutationObserver&gt;, MutationObserverOptions, PassRefPtr&lt;Node&gt;);

Please name the third argument here (for documentation purposes).  And perhaps give it a default = 0 value?  Not clear to me if that&apos;s WebKit style.

&gt; Source/WebCore/dom/Node.h:600
&gt; +    void unregisterMutationObserver(PassRefPtr&lt;WebKitMutationObserver&gt;, PassRefPtr&lt;Node&gt;);

Similar here as above. At the least, the argument should be named.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>490309</commentid>
    <comment_count>4</comment_count>
      <attachid>112392</attachid>
    <who name="Rafael Weinstein">rafaelw</who>
    <bug_when>2011-10-25 13:37:41 -0700</bug_when>
    <thetext>Created attachment 112392
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>491127</commentid>
    <comment_count>5</comment_count>
      <attachid>112287</attachid>
    <who name="Rafael Weinstein">rafaelw</who>
    <bug_when>2011-10-26 13:13:45 -0700</bug_when>
    <thetext>Comment on attachment 112287
Patch

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

&gt;&gt; Source/WebCore/dom/Node.cpp:2766
&gt;&gt; +            if (!entry.transientOfNode &amp;&amp; entry.hasAllOptions(WebKitMutationObserver::Subtree))
&gt; 
&gt; !entry.transientOfNode is incorrect here, you often do want to &quot;copy&quot; an already-transient observation.

good catch. done.

&gt;&gt; Source/WebCore/dom/Node.cpp:2767
&gt;&gt; +                entry.observer-&gt;observedSubtreeWillDisconnect(node, entry.options, this);
&gt; 
&gt; I think this will need to do something slightly different in the already-transient case, since you want to make the new transient entry point back to the original node, not the &quot;new&quot; transient one.

done.

&gt;&gt; Source/WebCore/dom/Node.h:598
&gt;&gt; +    MutationRegistrationResult registerMutationObserver(PassRefPtr&lt;WebKitMutationObserver&gt;, MutationObserverOptions, PassRefPtr&lt;Node&gt;);
&gt; 
&gt; Please name the third argument here (for documentation purposes).  And perhaps give it a default = 0 value?  Not clear to me if that&apos;s WebKit style.

done.

&gt;&gt; Source/WebCore/dom/Node.h:600
&gt;&gt; +    void unregisterMutationObserver(PassRefPtr&lt;WebKitMutationObserver&gt;, PassRefPtr&lt;Node&gt;);
&gt; 
&gt; Similar here as above. At the least, the argument should be named.

done

&gt;&gt; Source/WebCore/dom/WebKitMutationObserver.cpp:67
&gt;&gt; +    TransientObservedNodesMap::iterator mapIter = m_transientObservedNodes.find(node);
&gt; 
&gt; Here, I can&apos;t easily tell what the types of mapIter-&gt;first and mapIter-&gt;second are.

done

&gt;&gt; Source/WebCore/dom/WebKitMutationObserver.h:88
&gt;&gt; +    TransientObservedNodesMap m_transientObservedNodes;
&gt; 
&gt; I&apos;d prefer type-defing HashSet&lt;RefPtr&lt;Node&gt; &gt; (e.g. NodeHashSet) and leaving HashSet&lt;Node*, NodeHashSet&gt; so that the types of keys and values are self-evident wherever this type is used.

done

&gt;&gt; Source/WebCore/dom/WebKitMutationObserver.h:92
&gt;&gt; +
&gt; 
&gt; I&apos;d prefer seeing this definition wherever MutationObserverOptionsMap is used. The definition makes the types of first and second clear whereas if we typedef-ed, I have to keep looking at this header file to know what types keys and values were.

done

&gt;&gt; LayoutTests/fast/mutation/observe-subtree.html:127
&gt;&gt; +    function finish() {
&gt; 
&gt; I definitely would like to see test cases where an iframe is observed and where an node is adopted from one frame to another. Of course, that could be done in a separate .html file.

Not sure what your concern is here. I&apos;m going to upload the patch without this and we can talk more about what case you&apos;re worried about.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>491192</commentid>
    <comment_count>6</comment_count>
      <attachid>112598</attachid>
    <who name="Rafael Weinstein">rafaelw</who>
    <bug_when>2011-10-26 14:40:54 -0700</bug_when>
    <thetext>Created attachment 112598
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>491236</commentid>
    <comment_count>7</comment_count>
      <attachid>112598</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-10-26 15:50:06 -0700</bug_when>
    <thetext>Comment on attachment 112598
Patch

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

&gt; Source/WebCore/ChangeLog:8
&gt; +        This patch adds support for observing &quot;transiently disconnected&quot; nodes from subtree

I think we normally call a node being attached or detached from a document or a subtree so it&apos;ll be nice to keep the terminology consistent here especially because we use disconnect() to stop all observations.

Also, it&apos;ll be nice to explain what &quot;transient&quot; means in the change log.

&gt; Source/WebCore/dom/ChildListMutationScope.cpp:76
&gt; -    Vector&lt;WebKitMutationObserver*&gt; m_observers;
&gt; +    HashMap&lt;WebKitMutationObserver*, MutationObserverOptions&gt; m_observers;

I&apos;m a bit confused as to why we need HashMap here. If I understand correctly, we can just have:
Vector&lt;WebKitMutationObserverEntry&gt; m_observers or HashSet&lt;WebKitMutationObserverEntry&gt; m_observers ?

The fact we&apos;re storing keys in HashMap confuses me. I think using WebKitMutationObserverEntry makes the semantics clearer.

&gt; Source/WebCore/dom/ContainerNode.cpp:1147
&gt;          mutation.willRemoveChild(c);
&gt; +        c-&gt;notifySubtreeObserversOfDisconnection();

It seems more natural for mutation.willRemoveChild to take care of things rather than adding another function call here.

&gt; Source/WebCore/dom/Node.cpp:2730
&gt; +Node::MutationRegistrationResult Node::registerMutationObserver(PassRefPtr&lt;WebKitMutationObserver&gt; observer, MutationObserverOptions options, Node* transientOfNode)

I don&apos;t quite understand what &quot;transientOfNode&quot; means. Is that a node in some transient state? Or is it some transient object attached to a node?

&gt; Source/WebCore/dom/Node.cpp:2761
&gt; +void Node::notifySubtreeObserversOfDisconnection()

Can we move this function to WebKitMutationObserver.cpp? or make this function static local since it&apos;s only called in Node.cpp?
In general, we try to avoid adding member functions to Node or even to Node.cpp to avoid making it a God class.

Also, detach is a better word to describe a node that has been removed from a container node.

&gt; Source/WebCore/dom/Node.cpp:2771
&gt; +            if (entry.hasAllOptions(WebKitMutationObserver::Subtree)) {

Can we do
if (!entry.hasAllOptions(WebKitMutationObserver::Subtree))
    continue;
instead?

&gt; Source/WebCore/dom/NodeRareData.h:96
&gt; +        , transientOfNode(node)

I think we really need to rename this variable.

&gt; Source/WebCore/dom/NodeRareData.h:112
&gt; +    Node* transientOfNode; // This doesn&apos;t need to be a RefPtr because the observer will be holding a RefPtr to the same node at least for the lifetime of this Entry in its m_transientObservedNodes map.

This is a really long line. I&apos;d prefer splitting it into two lines.

&gt; Source/WebCore/dom/WebKitMutationObserver.cpp:118
&gt; +void WebKitMutationObserver::observedSubtreeWillDisconnect(PassRefPtr&lt;Node&gt; prpObservedNode, MutationObserverOptions options, PassRefPtr&lt;Node&gt; prpDisconnectingNode)

To match function naming function, how about willRemoveNodeInObservedSubtree?

I think DisconnectingNode needs mode descriptive name here. How about ancestorToBeDetached or observedAncestorToBeDetached?

&gt; Source/WebCore/dom/WebKitMutationObserver.cpp:130
&gt; +    if (iter == m_transientObservedNodes.end()) {
&gt; +        OwnPtr&lt;NodeHashSet&gt; set = adoptPtr(new NodeHashSet());
&gt; +        set-&gt;add(disconnectingNode);
&gt; +        m_transientObservedNodes.set(observedNode, set.leakPtr());
&gt; +    } else
&gt; +        iter-&gt;second-&gt;add(disconnectingNode);

I&apos;d negate the condition in the if and exit early as in:
if (iter != m_transientObservedNodes.end()) {
    iter-&gt;second-&gt;add(disconnectingNode);
    return;
}

&gt; Source/WebCore/dom/WebKitMutationObserver.cpp:136
&gt; +    for (HashMap&lt;RefPtr&lt;Node&gt;, NodeHashSet*&gt;::iterator iter = m_transientObservedNodes.begin(); iter != m_transientObservedNodes.end(); ++iter)
&gt; +        unregisterTransientEntries(adoptPtr(iter-&gt;second), this, iter-&gt;first.get());

Might make sense to wrap HashMap&lt;RefPtr&lt;Node&gt;, NodeHashSet*&gt; in some class and put these logic in that class instead.

&gt; LayoutTests/fast/mutation/observe-subtree.html:143
&gt; +        debug(&apos;Testing that transiently disconnected nodes are still observed via subtree.&apos;);

Particularly, in this context, I initially thought &quot;disconnected nodes&quot; are those nodes observers stopped observing after a call to disconnect().

&gt; LayoutTests/fast/mutation/observe-subtree.html:157
&gt; +        observer.observe(div, {attributes: true, characterData: true, subtree: true});
&gt; +        subDiv.setAttribute(&apos;foo&apos;, &apos;bar&apos;);
&gt; +        div.removeChild(subDiv);
&gt; +        subDiv.setAttribute(&apos;test&apos;, &apos;test&apos;);
&gt; +        setTimeout(checkDeliveredAndChangeAgain, 0);

Can we also test that if we are observing div in &lt;div&gt;&lt;span&gt;&lt;b&gt;hello&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;, and &quot;hello&quot; was modified after b is detached after span is detached from div? (i.e. transient node&apos;s subtree was detached).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>491299</commentid>
    <comment_count>8</comment_count>
      <attachid>112598</attachid>
    <who name="Rafael Weinstein">rafaelw</who>
    <bug_when>2011-10-26 17:38:31 -0700</bug_when>
    <thetext>Comment on attachment 112598
Patch

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

&gt;&gt; Source/WebCore/ChangeLog:8
&gt;&gt; +        This patch adds support for observing &quot;transiently disconnected&quot; nodes from subtree
&gt; 
&gt; I think we normally call a node being attached or detached from a document or a subtree so it&apos;ll be nice to keep the terminology consistent here especially because we use disconnect() to stop all observations.
&gt; 
&gt; Also, it&apos;ll be nice to explain what &quot;transient&quot; means in the change log.

done

&gt;&gt; Source/WebCore/dom/ChildListMutationScope.cpp:76

&gt; 
&gt; I&apos;m a bit confused as to why we need HashMap here. If I understand correctly, we can just have:
&gt; Vector&lt;WebKitMutationObserverEntry&gt; m_observers or HashSet&lt;WebKitMutationObserverEntry&gt; m_observers ?
&gt; 
&gt; The fact we&apos;re storing keys in HashMap confuses me. I think using WebKitMutationObserverEntry makes the semantics clearer.

This is a refactor which is anticipating needing to support attributeOldValue, characterDataOldValue. The idea here is that this is not just a list of the interested observers, but also the *union* of options of their matching registrations. It says not only *who* the mutation record should get delivered to, but also what the mutation record needs to look like for that observer.

To be fair, this class doesn&apos;t care because childList doesn&apos;t have any options which affect it. It just seemed silly to pre-filter this to a Vector. If you feel strongly, I&apos;ll do that.

&gt;&gt; Source/WebCore/dom/ContainerNode.cpp:1147
&gt;&gt; +        c-&gt;notifySubtreeObserversOfDisconnection();
&gt; 
&gt; It seems more natural for mutation.willRemoveChild to take care of things rather than adding another function call here.

I&apos;d prefer not to do that. It violates a nice seperation of concerns. ChildLIstMutationScope doesn&apos;t play any part in maintaining observation registration. Doing so would give it such responsibility.

&gt;&gt; Source/WebCore/dom/Node.cpp:2730
&gt;&gt; +Node::MutationRegistrationResult Node::registerMutationObserver(PassRefPtr&lt;WebKitMutationObserver&gt; observer, MutationObserverOptions options, Node* transientOfNode)
&gt; 
&gt; I don&apos;t quite understand what &quot;transientOfNode&quot; means. Is that a node in some transient state? Or is it some transient object attached to a node?

per discussion: changed to registrationNode

&gt;&gt; Source/WebCore/dom/Node.cpp:2761
&gt;&gt; +void Node::notifySubtreeObserversOfDisconnection()
&gt; 
&gt; Can we move this function to WebKitMutationObserver.cpp? or make this function static local since it&apos;s only called in Node.cpp?
&gt; In general, we try to avoid adding member functions to Node or even to Node.cpp to avoid making it a God class.
&gt; 
&gt; Also, detach is a better word to describe a node that has been removed from a container node.

This method needs the node&apos;s registry, so it can&apos;t be handled externally (e.g. by WebKitMutationObserver). The ideal place to do this would be Node::willRemove() but that appears not to be safe because ContainerNode::willRemove calls willRemove on all of its children.

Maybe we can talk about this further. I&apos;ve changed the name.

&gt;&gt; Source/WebCore/dom/Node.cpp:2771
&gt;&gt; +            if (entry.hasAllOptions(WebKitMutationObserver::Subtree)) {
&gt; 
&gt; Can we do
&gt; if (!entry.hasAllOptions(WebKitMutationObserver::Subtree))
&gt;     continue;
&gt; instead?

done.

&gt;&gt; Source/WebCore/dom/NodeRareData.h:96
&gt;&gt; +        , transientOfNode(node)
&gt; 
&gt; I think we really need to rename this variable.

done. now registrationNode (per discussion)

&gt;&gt; Source/WebCore/dom/NodeRareData.h:112
&gt;&gt; +    Node* transientOfNode; // This doesn&apos;t need to be a RefPtr because the observer will be holding a RefPtr to the same node at least for the lifetime of this Entry in its m_transientObservedNodes map.
&gt; 
&gt; This is a really long line. I&apos;d prefer splitting it into two lines.

done

&gt;&gt; Source/WebCore/dom/WebKitMutationObserver.cpp:118
&gt;&gt; +void WebKitMutationObserver::observedSubtreeWillDisconnect(PassRefPtr&lt;Node&gt; prpObservedNode, MutationObserverOptions options, PassRefPtr&lt;Node&gt; prpDisconnectingNode)
&gt; 
&gt; To match function naming function, how about willRemoveNodeInObservedSubtree?
&gt; 
&gt; I think DisconnectingNode needs mode descriptive name here. How about ancestorToBeDetached or observedAncestorToBeDetached?

changed. let me know

&gt;&gt; Source/WebCore/dom/WebKitMutationObserver.cpp:130
&gt;&gt; +        iter-&gt;second-&gt;add(disconnectingNode);
&gt; 
&gt; I&apos;d negate the condition in the if and exit early as in:
&gt; if (iter != m_transientObservedNodes.end()) {
&gt;     iter-&gt;second-&gt;add(disconnectingNode);
&gt;     return;
&gt; }

done

&gt;&gt; Source/WebCore/dom/WebKitMutationObserver.cpp:136
&gt;&gt; +        unregisterTransientEntries(adoptPtr(iter-&gt;second), this, iter-&gt;first.get());
&gt; 
&gt; Might make sense to wrap HashMap&lt;RefPtr&lt;Node&gt;, NodeHashSet*&gt; in some class and put these logic in that class instead.

not done -- per discussion

&gt;&gt; LayoutTests/fast/mutation/observe-subtree.html:143
&gt;&gt; +        debug(&apos;Testing that transiently disconnected nodes are still observed via subtree.&apos;);
&gt; 
&gt; Particularly, in this context, I initially thought &quot;disconnected nodes&quot; are those nodes observers stopped observing after a call to disconnect().

done

&gt;&gt; LayoutTests/fast/mutation/observe-subtree.html:157
&gt;&gt; +        setTimeout(checkDeliveredAndChangeAgain, 0);
&gt; 
&gt; Can we also test that if we are observing div in &lt;div&gt;&lt;span&gt;&lt;b&gt;hello&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;, and &quot;hello&quot; was modified after b is detached after span is detached from div? (i.e. transient node&apos;s subtree was detached).

that case is covered below in the detailed version</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>491302</commentid>
    <comment_count>9</comment_count>
      <attachid>112626</attachid>
    <who name="Rafael Weinstein">rafaelw</who>
    <bug_when>2011-10-26 17:40:59 -0700</bug_when>
    <thetext>Created attachment 112626
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>491309</commentid>
    <comment_count>10</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2011-10-26 17:55:51 -0700</bug_when>
    <thetext>Attachment 112626 did not pass style-queue:

Failed to run &quot;[&apos;Tools/Scripts/update-webkit&apos;]&quot; exit_code: 9

Updating OpenSource
RA layer request failed: OPTIONS of &apos;http://svn.webkit.org/repository/webkit&apos;: could not connect to server (http://svn.webkit.org) at /usr/lib/git-core/git-svn line 2295

Died at Tools/Scripts/update-webkit line 157.


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>491331</commentid>
    <comment_count>11</comment_count>
      <attachid>112626</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-10-26 19:33:32 -0700</bug_when>
    <thetext>Comment on attachment 112626
Patch

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

I would have r+ed if you were a committer but sadly r- for now.

&gt; Source/WebCore/dom/Node.cpp:553
&gt; +    Vector&lt;MutationObserverRegistration&gt;* registry = mutationObserverRegistry();
&gt; +    if (registry) {

registry should be declared inside if as in:
if (Vector&lt;MutationObserverRegistration&gt;* registry = mutationObserverRegistry()) {

&gt; Source/WebCore/dom/Node.cpp:2718
&gt; +            pair&lt;HashMap&lt;WebKitMutationObserver*, MutationObserverOptions&gt;::iterator, bool&gt; result = observers.add(entry.observer.get(), entry.options);
&gt; +            if (!result.second)
&gt; +                result.first-&gt;second |= entry.options;

This code is unreadable to me. I&apos;d prefer approach like:
if (HashMap&lt;WebKitMutationObserver*, MutationObserverOptions&gt;::iterator it = observers.find(entry.observer.get()))
    it-&gt;options |= entry.options;
else
    observers.add(entry.observer.get(), entry.options);
This code shouldn&apos;t be much slower since we&apos;re using a hash map but it reads much better.

&gt; Source/WebCore/dom/Node.cpp:2732
&gt; +    Vector&lt;MutationObserverRegistration&gt;* registry = ensureRareData()-&gt;ensureMutationObserverRegistry();

Can we define a reference here instead?

&gt; Source/WebCore/dom/Node.cpp:2741
&gt; +    (*registry)[index].options = registration.options;

So that we can avoid these awkward de-referencing.

&gt; Source/WebCore/dom/Node.cpp:2761
&gt; +void Node::createTransientMutationObservers()

Hm... this function isn&apos;t really creating observers though. How about registerTransientMutationObservations or startTransientMutationObservations?

&gt; Source/WebCore/dom/Node.cpp:2774
&gt; +            RefPtr&lt;Node&gt; observedNode = registration.registrationNode;

We can use a raw pointer here, can&apos;t we?

&gt; Source/WebCore/dom/WebKitMutationObserver.cpp:59
&gt; +static void unregisterTransientRegistrations(PassOwnPtr&lt;NodeHashSet&gt; popTransientNodes, WebKitMutationObserver* observer, Node* registrationNode)

inline keyword?

&gt; Source/WebCore/dom/WebKitMutationObserver.cpp:61
&gt; +    OwnPtr&lt;NodeHashSet&gt; transientNodes = popTransientNodes;

We don&apos;t need this local variable. This is a two-line function and the correctness is clear without it.

&gt; Source/WebCore/dom/WebKitMutationObserver.cpp:141
&gt; +void WebKitMutationObserver::clearTransientEntries()
&gt; +{
&gt; +    for (HashMap&lt;RefPtr&lt;Node&gt;, NodeHashSet*&gt;::iterator iter = m_transientObservedNodes.begin(); iter != m_transientObservedNodes.end(); ++iter)
&gt; +        unregisterTransientRegistrations(adoptPtr(iter-&gt;second), this, iter-&gt;first.get());
&gt; +
&gt; +    m_transientObservedNodes.clear();
&gt; +}

There are bunch of different naming conventions used here. clearTransientEntries, m_transientObservedNodes, unregisterTransientRegistrations.
We should make them consistent. How about m_transientObservedNodes, clearAllTransientObservations, stopTransientObservations/unregisterTransientObservers?
I&apos;d like to avoid using the term &quot;registration&quot; for the third one since that term is associated with the rare data in Node and the function happens to destroy NodeHashSet as well.

&gt; LayoutTests/ChangeLog:7
&gt; +

Would you care to describe what kind of test cases you&apos;re adding here?

&gt; LayoutTests/fast/mutation/observe-subtree.html:161
&gt; +        debug(&apos;...both changes should be received. Change disconnected subDiv again.&apos;);

Can we s/disconnect/detach/g?

&gt; LayoutTests/fast/mutation/observe-subtree.html:190
&gt; +        debug(&apos;...reattached subtree should now be observable. Try disconnecting and re-observing.&apos;);

Ditto.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>491754</commentid>
    <comment_count>12</comment_count>
      <attachid>112626</attachid>
    <who name="Rafael Weinstein">rafaelw</who>
    <bug_when>2011-10-27 11:23:02 -0700</bug_when>
    <thetext>Comment on attachment 112626
Patch

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

&gt;&gt; Source/WebCore/dom/Node.cpp:553
&gt;&gt; +    if (registry) {
&gt; 
&gt; registry should be declared inside if as in:
&gt; if (Vector&lt;MutationObserverRegistration&gt;* registry = mutationObserverRegistry()) {

done

&gt;&gt; Source/WebCore/dom/Node.cpp:2718
&gt;&gt; +                result.first-&gt;second |= entry.options;
&gt; 
&gt; This code is unreadable to me. I&apos;d prefer approach like:
&gt; if (HashMap&lt;WebKitMutationObserver*, MutationObserverOptions&gt;::iterator it = observers.find(entry.observer.get()))
&gt;     it-&gt;options |= entry.options;
&gt; else
&gt;     observers.add(entry.observer.get(), entry.options);
&gt; This code shouldn&apos;t be much slower since we&apos;re using a hash map but it reads much better.

Note that this was more readable when HashMap&lt;WebKitMutationObserver*, MutationObserverOptions&gt; was typedef&apos;d -- partly for this reason -- because it gets unreadable. You wanted it untypedef&apos;d in the last review.

This code is in a critical path. I&apos;d prefer not to incur an unnecessary hash lookup.

Also, i&apos;ve inverted the if and *continue* early -- to make it a bit clearer.

&gt;&gt; Source/WebCore/dom/Node.cpp:2732
&gt;&gt; +    Vector&lt;MutationObserverRegistration&gt;* registry = ensureRareData()-&gt;ensureMutationObserverRegistry();
&gt; 
&gt; Can we define a reference here instead?

not done -- per discussion

&gt;&gt; Source/WebCore/dom/Node.cpp:2741
&gt;&gt; +    (*registry)[index].options = registration.options;
&gt; 
&gt; So that we can avoid these awkward de-referencing.

changed to registry-&gt;at(index)

&gt;&gt; Source/WebCore/dom/Node.cpp:2761
&gt;&gt; +void Node::createTransientMutationObservers()
&gt; 
&gt; Hm... this function isn&apos;t really creating observers though. How about registerTransientMutationObservations or startTransientMutationObservations?

changed to notifyMutationObserversNodeWillDetach

&gt;&gt; Source/WebCore/dom/Node.cpp:2774
&gt;&gt; +            RefPtr&lt;Node&gt; observedNode = registration.registrationNode;
&gt; 
&gt; We can use a raw pointer here, can&apos;t we?

done

&gt;&gt; Source/WebCore/dom/WebKitMutationObserver.cpp:59
&gt;&gt; +static void unregisterTransientRegistrations(PassOwnPtr&lt;NodeHashSet&gt; popTransientNodes, WebKitMutationObserver* observer, Node* registrationNode)
&gt; 
&gt; inline keyword?

done.

&gt;&gt; Source/WebCore/dom/WebKitMutationObserver.cpp:61
&gt;&gt; +    OwnPtr&lt;NodeHashSet&gt; transientNodes = popTransientNodes;
&gt; 
&gt; We don&apos;t need this local variable. This is a two-line function and the correctness is clear without it.

done

&gt;&gt; Source/WebCore/dom/WebKitMutationObserver.cpp:141
&gt;&gt; +}
&gt; 
&gt; There are bunch of different naming conventions used here. clearTransientEntries, m_transientObservedNodes, unregisterTransientRegistrations.
&gt; We should make them consistent. How about m_transientObservedNodes, clearAllTransientObservations, stopTransientObservations/unregisterTransientObservers?
&gt; I&apos;d like to avoid using the term &quot;registration&quot; for the third one since that term is associated with the rare data in Node and the function happens to destroy NodeHashSet as well.

I&apos;ve got clearAllTransientObservations, and clearTransientObservationsForRegistration (which takes a registrationNode as it&apos;s second arg).

how&apos;s that?

&gt;&gt; LayoutTests/ChangeLog:7
&gt;&gt; +
&gt; 
&gt; Would you care to describe what kind of test cases you&apos;re adding here?

done

&gt;&gt; LayoutTests/fast/mutation/observe-subtree.html:161
&gt;&gt; +        debug(&apos;...both changes should be received. Change disconnected subDiv again.&apos;);
&gt; 
&gt; Can we s/disconnect/detach/g?

done.

&gt;&gt; LayoutTests/fast/mutation/observe-subtree.html:190
&gt;&gt; +        debug(&apos;...reattached subtree should now be observable. Try disconnecting and re-observing.&apos;);
&gt; 
&gt; Ditto.

done</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>491758</commentid>
    <comment_count>13</comment_count>
      <attachid>112715</attachid>
    <who name="Rafael Weinstein">rafaelw</who>
    <bug_when>2011-10-27 11:24:24 -0700</bug_when>
    <thetext>Created attachment 112715
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>491894</commentid>
    <comment_count>14</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-10-27 13:46:50 -0700</bug_when>
    <thetext>(In reply to comment #12)
&gt; &gt;&gt; Source/WebCore/dom/Node.cpp:2718
&gt; &gt;&gt; +                result.first-&gt;second |= entry.options;
&gt; &gt; 
&gt; &gt; This code is unreadable to me. I&apos;d prefer approach like:
&gt; &gt; if (HashMap&lt;WebKitMutationObserver*, MutationObserverOptions&gt;::iterator it = observers.find(entry.observer.get()))
&gt; &gt;     it-&gt;options |= entry.options;
&gt; &gt; else
&gt; &gt;     observers.add(entry.observer.get(), entry.options);
&gt; &gt; This code shouldn&apos;t be much slower since we&apos;re using a hash map but it reads much better.
&gt; 
&gt; Note that this was more readable when HashMap&lt;WebKitMutationObserver*, MutationObserverOptions&gt; was typedef&apos;d -- partly for this reason -- because it gets unreadable. You wanted it untypedef&apos;d in the last review.

No, typedef&apos;ing HashMap doesn&apos;t help here at all. The problem is with:
if (!result.second)
    result.first-&gt;second |= entry.options;

I literally had to look up the definition of HashMap to know what the second value of the pair indicates whether a new value is added not. And it&apos;s impossible to tell what &quot;first-&gt;second&quot; means without looking up definitions of struct, etc...

&gt; This code is in a critical path. I&apos;d prefer not to incur an unnecessary hash lookup.

I&apos;d argue that we should do:
if (HashMap&lt;WebKitMutationObserver*, MutationObserverOptions&gt;::iterator it = observers.find(entry.observer.get()))
    it-&gt;options |= entry.options;
else
    observers.add(entry.observer.get(), entry.options); 

unless it shows up on a profiler result (Shark, Instruments, etc...). If it indeed DOES appear in the profiler, I&apos;d declare local variable to document the meaning of each variables as in:

pair&lt;HashMap&lt;WebKitMutationObserver*, MutationObserverOptions&gt;::iterator, bool&gt; result = observers.add(entry.observer.get(), entry.options);
const bool newItemAdded = result.second;
if (!newItemAdded) {
    MutationObserverOptions&amp; optionsInRecord = result.first-&gt;second;
    optionsInRecord |= entry.options;
}

And I&apos;d like see how much it&apos;s affecting the performance in seconds or percentage.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>491915</commentid>
    <comment_count>15</comment_count>
      <attachid>112715</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-10-27 13:58:56 -0700</bug_when>
    <thetext>Comment on attachment 112715
Patch

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

The rest of the patch looks great to me!

&gt; Source/WebCore/dom/NodeRareData.h:116
&gt; +    // least for the lifetime of this Entry in its m_transientObservedNodes map.

s/Entry/Registration/</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>491923</commentid>
    <comment_count>16</comment_count>
      <attachid>112715</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-10-27 14:05:17 -0700</bug_when>
    <thetext>Comment on attachment 112715
Patch

Alright, apparently, there are lots of instances of first-&gt;second so I guess we&apos;ll have to live with them.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>491935</commentid>
    <comment_count>17</comment_count>
      <attachid>112715</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-10-27 14:10:27 -0700</bug_when>
    <thetext>Comment on attachment 112715
Patch

Oops, we need to fix s/Entry/Registration/ first.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>491936</commentid>
    <comment_count>18</comment_count>
      <attachid>112748</attachid>
    <who name="Rafael Weinstein">rafaelw</who>
    <bug_when>2011-10-27 14:11:28 -0700</bug_when>
    <thetext>Created attachment 112748
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>491939</commentid>
    <comment_count>19</comment_count>
      <attachid>112715</attachid>
    <who name="Rafael Weinstein">rafaelw</who>
    <bug_when>2011-10-27 14:14:28 -0700</bug_when>
    <thetext>Comment on attachment 112715
Patch

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

&gt;&gt; Source/WebCore/dom/NodeRareData.h:116
&gt;&gt; +    // least for the lifetime of this Entry in its m_transientObservedNodes map.
&gt; 
&gt; s/Entry/Registration/

done</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>492092</commentid>
    <comment_count>20</comment_count>
      <attachid>112748</attachid>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2011-10-27 16:38:24 -0700</bug_when>
    <thetext>Comment on attachment 112748
Patch

Clearing flags on attachment: 112748

Committed r98659: &lt;http://trac.webkit.org/changeset/98659&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>492093</commentid>
    <comment_count>21</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2011-10-27 16:38:30 -0700</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>112287</attachid>
            <date>2011-10-24 18:06:31 -0700</date>
            <delta_ts>2011-10-26 13:13:45 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-70788-20111024180630.patch</filename>
            <type>text/plain</type>
            <size>25429</size>
            <attacher name="Rafael Weinstein">rafaelw</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogOTgyNjIKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0No
YW5nZUxvZyBiL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwppbmRleCA4MWE1NzJkZDcyMjNhMGY1
M2FlNWFmMzU1NDE4YjZmOWQzNWMwMGZkLi4xN2EyYTA3ZWQ0YmMwM2JjOGYwZjk0ZWM0MjMyNjYz
NjUzN2VhMTM3IDEwMDc1NQotLS0gYS9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvU291
cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCkBAIC0xLDUgKzEsNDkgQEAKIDIwMTEtMTAtMjQgIFJhZmFl
bCBXZWluc3RlaW4gIDxyYWZhZWx3QGNocm9taXVtLm9yZz4KIAorICAgICAgICBbTXV0YXRpb25P
YnNlcnZlcnNdIEltcGxlbWVudCBzdWJ0cmVlIG9ic2VydmF0aW9uIG9mIHRyYW5zaWVudGx5IGRp
c2Nvbm5lY3RlZCBub2RlcworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1
Zy5jZ2k/aWQ9NzA3ODgKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKwor
ICAgICAgICBUaGlzIHBhdGNoIGFkZHMgc3VwcG9ydCBmb3Igb2JzZXJ2aW5nICJ0cmFuc2llbnRs
eSBkaXNjb25uZWN0ZWQiIG5vZGVzIGZyb20gc3VidHJlZQorICAgICAgICBvYnNlcnZhdGlvbnMg
Ynkgc3luY2hyb25vdXNseSBhZGRpbmcgdHJhbnNpZW50IGVudHJpZXMgd2hlbiBub2RlcyBhcmUg
cmVtb3ZlZCBmcm9tCisgICAgICAgIHRoZWlyIHBhcmVudC4gV2ViS2l0TXV0YXRpb25PYnNlcnZl
ciBpcyBtYWRlIHJlc3BvbnNpYmxlIGZvciB0aGUgYWNjb3VudGluZyBvZgorICAgICAgICByZWNv
cmRpbmcgYW5kIGNsZWFyaW5nIHRoZXNlIHRyYW5zaWVudCBvYnNlcnZlcnMuCisKKyAgICAgICAg
TmV3IHRlc3RzIGFkZGVkIHRvIGZhc3QvbXV0YXRpb24vb2JzZXJ2ZS1zdWJ0cmVlLmh0bWwuCisK
KyAgICAgICAgKiBkb20vQ2hhcmFjdGVyRGF0YS5jcHA6CisgICAgICAgIChXZWJDb3JlOjpDaGFy
YWN0ZXJEYXRhOjpkaXNwYXRjaE1vZGlmaWVkRXZlbnQpOgorICAgICAgICAqIGRvbS9DaGlsZExp
c3RNdXRhdGlvblNjb3BlLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6Ok11dGF0aW9uQWNjdW11bGF0
aW9uUm91dGVyOjpDaGlsZExpc3RNdXRhdGlvbkFjY3VtdWxhdG9yOjpDaGlsZExpc3RNdXRhdGlv
bkFjY3VtdWxhdG9yKToKKyAgICAgICAgKFdlYkNvcmU6Ok11dGF0aW9uQWNjdW11bGF0aW9uUm91
dGVyOjpDaGlsZExpc3RNdXRhdGlvbkFjY3VtdWxhdG9yOjplbnF1ZXVlTXV0YXRpb25SZWNvcmQp
OgorICAgICAgICAoV2ViQ29yZTo6TXV0YXRpb25BY2N1bXVsYXRpb25Sb3V0ZXI6Ok11dGF0aW9u
QWNjdW11bGF0aW9uUm91dGVyOjppbmNyZW1lbnRTY29waW5nTGV2ZWwpOgorICAgICAgICAqIGRv
bS9Db250YWluZXJOb2RlLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OmRpc3BhdGNoQ2hpbGRSZW1v
dmFsRXZlbnRzKToKKyAgICAgICAgKiBkb20vRWxlbWVudC5jcHA6CisgICAgICAgIChXZWJDb3Jl
OjplbnF1ZXVlQXR0cmlidXRlc011dGF0aW9uUmVjb3JkKToKKyAgICAgICAgKiBkb20vTm9kZS5j
cHA6CisgICAgICAgIChXZWJDb3JlOjphZGRNYXRjaGluZ09ic2VydmVycyk6CisgICAgICAgIChX
ZWJDb3JlOjpOb2RlOjpnZXRSZWdpc3RlcmVkTXV0YXRpb25PYnNlcnZlcnNPZlR5cGUpOgorICAg
ICAgICAoV2ViQ29yZTo6Tm9kZTo6cmVnaXN0ZXJNdXRhdGlvbk9ic2VydmVyKToKKyAgICAgICAg
KFdlYkNvcmU6Ok5vZGU6OnVucmVnaXN0ZXJNdXRhdGlvbk9ic2VydmVyKToKKyAgICAgICAgKFdl
YkNvcmU6Ok5vZGU6Om5vdGlmeVN1YnRyZWVPYnNlcnZlcnNPZkRpc2Nvbm5lY3Rpb24pOgorICAg
ICAgICAqIGRvbS9Ob2RlLmg6CisgICAgICAgICogZG9tL05vZGVSYXJlRGF0YS5oOgorICAgICAg
ICAoV2ViQ29yZTo6TXV0YXRpb25PYnNlcnZlckVudHJ5OjpNdXRhdGlvbk9ic2VydmVyRW50cnkp
OgorICAgICAgICAoV2ViQ29yZTo6TXV0YXRpb25PYnNlcnZlckVudHJ5OjpvcGVyYXRvcj09KToK
KyAgICAgICAgKiBkb20vV2ViS2l0TXV0YXRpb25PYnNlcnZlci5jcHA6CisgICAgICAgIChXZWJD
b3JlOjpXZWJLaXRNdXRhdGlvbk9ic2VydmVyOjpvYnNlcnZlKToKKyAgICAgICAgKFdlYkNvcmU6
OnVucmVnaXN0ZXJUcmFuc2llbnRFbnRyaWVzKToKKyAgICAgICAgKFdlYkNvcmU6OldlYktpdE11
dGF0aW9uT2JzZXJ2ZXI6OmRpc2Nvbm5lY3QpOgorICAgICAgICAoV2ViQ29yZTo6V2ViS2l0TXV0
YXRpb25PYnNlcnZlcjo6b2JzZXJ2ZWROb2RlRGVzdHJ1Y3RlZCk6CisgICAgICAgIChXZWJDb3Jl
OjpXZWJLaXRNdXRhdGlvbk9ic2VydmVyOjpvYnNlcnZlZFN1YnRyZWVXaWxsRGlzY29ubmVjdCk6
CisgICAgICAgIChXZWJDb3JlOjpXZWJLaXRNdXRhdGlvbk9ic2VydmVyOjpjbGVhclRyYW5zaWVu
dEVudHJpZXMpOgorICAgICAgICAoV2ViQ29yZTo6V2ViS2l0TXV0YXRpb25PYnNlcnZlcjo6ZGVs
aXZlcik6CisgICAgICAgICogZG9tL1dlYktpdE11dGF0aW9uT2JzZXJ2ZXIuaDoKKworMjAxMS0x
MC0yNCAgUmFmYWVsIFdlaW5zdGVpbiAgPHJhZmFlbHdAY2hyb21pdW0ub3JnPgorCiAgICAgICAg
IE5vZGU6OnJlZ2lzdGVyZWRNdXRhdGlvbk9ic2VydmVyc09mVHlwZSBzaG91bGQgYmUgcHJlZml4
ZWQgYnkgImdldCIKICAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dp
P2lkPTcwMzU5CiAKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2RvbS9DaGFyYWN0ZXJEYXRh
LmNwcCBiL1NvdXJjZS9XZWJDb3JlL2RvbS9DaGFyYWN0ZXJEYXRhLmNwcAppbmRleCA1ZTg0MWVi
MzhmNzQ4YjY2YzRmNmNjZDI1MDJmYzRkYTU1ZGMxZjk1Li5kM2VhZWNlOGY4MmQ3ZTg2ZmU2OTcw
NDk5NzcwYjg5YTFlNzRhYTY3IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9kb20vQ2hhcmFj
dGVyRGF0YS5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvZG9tL0NoYXJhY3RlckRhdGEuY3BwCkBA
IC0xOTMsMTIgKzE5MywxMiBAQCB2b2lkIENoYXJhY3RlckRhdGE6OnVwZGF0ZVJlbmRlcmVyKHVu
c2lnbmVkIG9mZnNldE9mUmVwbGFjZWREYXRhLCB1bnNpZ25lZCBsZW5ndAogdm9pZCBDaGFyYWN0
ZXJEYXRhOjpkaXNwYXRjaE1vZGlmaWVkRXZlbnQoU3RyaW5nSW1wbCogb2xkRGF0YSkKIHsKICNp
ZiBFTkFCTEUoTVVUQVRJT05fT0JTRVJWRVJTKQotICAgIFZlY3RvcjxXZWJLaXRNdXRhdGlvbk9i
c2VydmVyKj4gb2JzZXJ2ZXJzOworICAgIE11dGF0aW9uT2JzZXJ2ZXJPcHRpb25zTWFwIG9ic2Vy
dmVyczsKICAgICBnZXRSZWdpc3RlcmVkTXV0YXRpb25PYnNlcnZlcnNPZlR5cGUob2JzZXJ2ZXJz
LCBXZWJLaXRNdXRhdGlvbk9ic2VydmVyOjpDaGFyYWN0ZXJEYXRhKTsKICAgICBpZiAoIW9ic2Vy
dmVycy5pc0VtcHR5KCkpIHsKICAgICAgICAgUmVmUHRyPE11dGF0aW9uUmVjb3JkPiBtdXRhdGlv
biA9IE11dGF0aW9uUmVjb3JkOjpjcmVhdGVDaGFyYWN0ZXJEYXRhKHRoaXMpOwotICAgICAgICBm
b3IgKHNpemVfdCBpID0gMDsgaSA8IG9ic2VydmVycy5zaXplKCk7ICsraSkKLSAgICAgICAgICAg
IG9ic2VydmVyc1tpXS0+ZW5xdWV1ZU11dGF0aW9uUmVjb3JkKG11dGF0aW9uKTsKKyAgICAgICAg
Zm9yIChNdXRhdGlvbk9ic2VydmVyT3B0aW9uc01hcDo6aXRlcmF0b3IgaXRlciA9IG9ic2VydmVy
cy5iZWdpbigpOyBpdGVyICE9IG9ic2VydmVycy5lbmQoKTsgKytpdGVyKQorICAgICAgICAgICAg
ICAgIGl0ZXItPmZpcnN0LT5lbnF1ZXVlTXV0YXRpb25SZWNvcmQobXV0YXRpb24pOwogICAgIH0K
ICNlbmRpZgogICAgIGlmIChwYXJlbnROb2RlKCkpCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29y
ZS9kb20vQ2hpbGRMaXN0TXV0YXRpb25TY29wZS5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9kb20vQ2hp
bGRMaXN0TXV0YXRpb25TY29wZS5jcHAKaW5kZXggNGU1ZjBhOTBkNzY1OTI3ZTc2NDdhNDA5MTZl
ODNmZDI0M2I0ZWZjMy4uZjMwMzFmMDM3YmMxNjRiMzA2NTRiNTc2OWIzMTVhNDQzYWM3ZDFkOCAx
MDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvZG9tL0NoaWxkTGlzdE11dGF0aW9uU2NvcGUuY3Bw
CisrKyBiL1NvdXJjZS9XZWJDb3JlL2RvbS9DaGlsZExpc3RNdXRhdGlvblNjb3BlLmNwcApAQCAt
NTMsNyArNTMsNyBAQCBuYW1lc3BhY2UgewogY2xhc3MgQ2hpbGRMaXN0TXV0YXRpb25BY2N1bXVs
YXRvciA6IHB1YmxpYyBSZWZDb3VudGVkPENoaWxkTGlzdE11dGF0aW9uQWNjdW11bGF0b3I+IHsK
ICAgICBXVEZfTUFLRV9OT05DT1BZQUJMRShDaGlsZExpc3RNdXRhdGlvbkFjY3VtdWxhdG9yKTsK
IHB1YmxpYzoKLSAgICBDaGlsZExpc3RNdXRhdGlvbkFjY3VtdWxhdG9yKFBhc3NSZWZQdHI8Tm9k
ZT4sIFZlY3RvcjxXZWJLaXRNdXRhdGlvbk9ic2VydmVyKj4mKTsKKyAgICBDaGlsZExpc3RNdXRh
dGlvbkFjY3VtdWxhdG9yKFBhc3NSZWZQdHI8Tm9kZT4sIE11dGF0aW9uT2JzZXJ2ZXJPcHRpb25z
TWFwJik7CiAgICAgfkNoaWxkTGlzdE11dGF0aW9uQWNjdW11bGF0b3IoKTsKIAogICAgIHZvaWQg
Y2hpbGRBZGRlZChQYXNzUmVmUHRyPE5vZGU+KTsKQEAgLTczLDcgKzczLDcgQEAgcHJpdmF0ZToK
ICAgICBSZWZQdHI8Tm9kZT4gbV9uZXh0U2libGluZzsKICAgICBSZWZQdHI8Tm9kZT4gbV9sYXN0
QWRkZWQ7CiAKLSAgICBWZWN0b3I8V2ViS2l0TXV0YXRpb25PYnNlcnZlcio+IG1fb2JzZXJ2ZXJz
OworICAgIE11dGF0aW9uT2JzZXJ2ZXJPcHRpb25zTWFwIG1fb2JzZXJ2ZXJzOwogfTsKIAogY2xh
c3MgTXV0YXRpb25BY2N1bXVsYXRpb25Sb3V0ZXIgewpAQCAtMTAwLDcgKzEwMCw3IEBAIHByaXZh
dGU6CiAgICAgc3RhdGljIE11dGF0aW9uQWNjdW11bGF0aW9uUm91dGVyKiBzX2luc3RhbmNlOwog
fTsKIAotQ2hpbGRMaXN0TXV0YXRpb25BY2N1bXVsYXRvcjo6Q2hpbGRMaXN0TXV0YXRpb25BY2N1
bXVsYXRvcihQYXNzUmVmUHRyPE5vZGU+IHRhcmdldCwgVmVjdG9yPFdlYktpdE11dGF0aW9uT2Jz
ZXJ2ZXIqPiYgb2JzZXJ2ZXJzKQorQ2hpbGRMaXN0TXV0YXRpb25BY2N1bXVsYXRvcjo6Q2hpbGRM
aXN0TXV0YXRpb25BY2N1bXVsYXRvcihQYXNzUmVmUHRyPE5vZGU+IHRhcmdldCwgTXV0YXRpb25P
YnNlcnZlck9wdGlvbnNNYXAmIG9ic2VydmVycykKICAgICA6IG1fdGFyZ2V0KHRhcmdldCkKIHsK
ICAgICBtX29ic2VydmVycy5zd2FwKG9ic2VydmVycyk7CkBAIC0xNjksOCArMTY5LDggQEAgdm9p
ZCBDaGlsZExpc3RNdXRhdGlvbkFjY3VtdWxhdG9yOjplbnF1ZXVlTXV0YXRpb25SZWNvcmQoKQog
ICAgIFJlZlB0cjxNdXRhdGlvblJlY29yZD4gbXV0YXRpb24gPSBNdXRhdGlvblJlY29yZDo6Y3Jl
YXRlQ2hpbGRMaXN0KAogICAgICAgICBtX3RhcmdldCwgU3RhdGljTm9kZUxpc3Q6OmFkb3B0KG1f
YWRkZWROb2RlcyksIFN0YXRpY05vZGVMaXN0OjphZG9wdChtX3JlbW92ZWROb2RlcyksIG1fcHJl
dmlvdXNTaWJsaW5nLCBtX25leHRTaWJsaW5nKTsKIAotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBp
IDwgbV9vYnNlcnZlcnMuc2l6ZSgpOyArK2kpCi0gICAgICAgIG1fb2JzZXJ2ZXJzW2ldLT5lbnF1
ZXVlTXV0YXRpb25SZWNvcmQobXV0YXRpb24pOworICAgIGZvciAoTXV0YXRpb25PYnNlcnZlck9w
dGlvbnNNYXA6Oml0ZXJhdG9yIGl0ZXIgPSBtX29ic2VydmVycy5iZWdpbigpOyBpdGVyICE9IG1f
b2JzZXJ2ZXJzLmVuZCgpOyArK2l0ZXIpCisgICAgICAgIGl0ZXItPmZpcnN0LT5lbnF1ZXVlTXV0
YXRpb25SZWNvcmQobXV0YXRpb24pOwogCiAgICAgY2xlYXIoKTsKIH0KQEAgLTI0NCw3ICsyNDQs
NyBAQCB2b2lkIE11dGF0aW9uQWNjdW11bGF0aW9uUm91dGVyOjppbmNyZW1lbnRTY29waW5nTGV2
ZWwoTm9kZSogdGFyZ2V0KQogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgVmVjdG9yPFdl
YktpdE11dGF0aW9uT2JzZXJ2ZXIqPiBvYnNlcnZlcnM7CisgICAgTXV0YXRpb25PYnNlcnZlck9w
dGlvbnNNYXAgb2JzZXJ2ZXJzOwogICAgIHRhcmdldC0+Z2V0UmVnaXN0ZXJlZE11dGF0aW9uT2Jz
ZXJ2ZXJzT2ZUeXBlKG9ic2VydmVycywgV2ViS2l0TXV0YXRpb25PYnNlcnZlcjo6Q2hpbGRMaXN0
KTsKICAgICBpZiAob2JzZXJ2ZXJzLmlzRW1wdHkoKSkKICAgICAgICAgbV9hY2N1bXVsYXRpb25z
LnNldCh0YXJnZXQsIDApOwpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvZG9tL0NvbnRhaW5l
ck5vZGUuY3BwIGIvU291cmNlL1dlYkNvcmUvZG9tL0NvbnRhaW5lck5vZGUuY3BwCmluZGV4IDc0
Yzc5ZDZmNzMxMWI1MDQxZGJmOTU3ZDQzZGUzYzY5ODY0MDZjZTUuLjc2YTcwMmU5YWNkMDE1NWZh
NWIyOTFmMDAyMzNjOTU4N2JkOWZkZTMgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL2RvbS9D
b250YWluZXJOb2RlLmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9kb20vQ29udGFpbmVyTm9kZS5j
cHAKQEAgLTExNDQsNiArMTE0NCw3IEBAIHN0YXRpYyB2b2lkIGRpc3BhdGNoQ2hpbGRSZW1vdmFs
RXZlbnRzKE5vZGUqIGNoaWxkKQogICAgIGlmIChjLT5wYXJlbnROb2RlKCkpIHsKICAgICAgICAg
Q2hpbGRMaXN0TXV0YXRpb25TY29wZSBtdXRhdGlvbihjLT5wYXJlbnROb2RlKCkpOwogICAgICAg
ICBtdXRhdGlvbi53aWxsUmVtb3ZlQ2hpbGQoYyk7CisgICAgICAgIGMtPm5vdGlmeVN1YnRyZWVP
YnNlcnZlcnNPZkRpc2Nvbm5lY3Rpb24oKTsKICAgICB9CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEv
U291cmNlL1dlYkNvcmUvZG9tL0VsZW1lbnQuY3BwIGIvU291cmNlL1dlYkNvcmUvZG9tL0VsZW1l
bnQuY3BwCmluZGV4IDNlYTc0YmVlYmYxZTlmYjA0OGYxMDQ5NDM5YzFhOWE2ZmYxMGY5YWUuLjll
ZDI4MzU2YTFiYjM2M2VjMjk2NTI3NTk4ZDI5M2Y1ODEzMzI1ZjcgMTAwNjQ0Ci0tLSBhL1NvdXJj
ZS9XZWJDb3JlL2RvbS9FbGVtZW50LmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9kb20vRWxlbWVu
dC5jcHAKQEAgLTYxOSwxNCArNjE5LDE0IEBAIGNvbnN0IEF0b21pY1N0cmluZyYgRWxlbWVudDo6
Z2V0QXR0cmlidXRlTlMoY29uc3QgU3RyaW5nJiBuYW1lc3BhY2VVUkksIGNvbnN0IFN0CiAjaWYg
RU5BQkxFKE1VVEFUSU9OX09CU0VSVkVSUykKIHN0YXRpYyB2b2lkIGVucXVldWVBdHRyaWJ1dGVz
TXV0YXRpb25SZWNvcmQoRWxlbWVudCogZWxlbWVudCwgY29uc3QgUXVhbGlmaWVkTmFtZSYgbmFt
ZSkKIHsKLSAgICBWZWN0b3I8V2ViS2l0TXV0YXRpb25PYnNlcnZlcio+IG9ic2VydmVyczsKKyAg
ICBNdXRhdGlvbk9ic2VydmVyT3B0aW9uc01hcCBvYnNlcnZlcnM7CiAgICAgZWxlbWVudC0+Z2V0
UmVnaXN0ZXJlZE11dGF0aW9uT2JzZXJ2ZXJzT2ZUeXBlKG9ic2VydmVycywgV2ViS2l0TXV0YXRp
b25PYnNlcnZlcjo6QXR0cmlidXRlcyk7CiAgICAgaWYgKG9ic2VydmVycy5pc0VtcHR5KCkpCiAg
ICAgICAgIHJldHVybjsKIAogICAgIFJlZlB0cjxNdXRhdGlvblJlY29yZD4gbXV0YXRpb24gPSBN
dXRhdGlvblJlY29yZDo6Y3JlYXRlQXR0cmlidXRlcyhlbGVtZW50LCBuYW1lKTsKLSAgICBmb3Ig
KHNpemVfdCBpID0gMDsgaSA8IG9ic2VydmVycy5zaXplKCk7ICsraSkKLSAgICAgICAgb2JzZXJ2
ZXJzW2ldLT5lbnF1ZXVlTXV0YXRpb25SZWNvcmQobXV0YXRpb24pOworICAgIGZvciAoTXV0YXRp
b25PYnNlcnZlck9wdGlvbnNNYXA6Oml0ZXJhdG9yIGl0ZXIgPSBvYnNlcnZlcnMuYmVnaW4oKTsg
aXRlciAhPSBvYnNlcnZlcnMuZW5kKCk7ICsraXRlcikKKyAgICAgICAgaXRlci0+Zmlyc3QtPmVu
cXVldWVNdXRhdGlvblJlY29yZChtdXRhdGlvbik7CiB9CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEv
U291cmNlL1dlYkNvcmUvZG9tL05vZGUuY3BwIGIvU291cmNlL1dlYkNvcmUvZG9tL05vZGUuY3Bw
CmluZGV4IDhmOTM2NGU1Y2I2YTYyNzkzOWMxNThhMzE3NTYxZDA4MzkzYTRhZDYuLmMwNTcxN2U3
YTQ3MjMwZjFkYTdhODdlODFiMDRmODVjZDc4YzI3NzEgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJD
b3JlL2RvbS9Ob2RlLmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9kb20vTm9kZS5jcHAKQEAgLTI2
OTgsNyArMjY5OCw3IEBAIFZlY3RvcjxNdXRhdGlvbk9ic2VydmVyRW50cnk+KiBOb2RlOjptdXRh
dGlvbk9ic2VydmVyRW50cmllcygpCiAgICAgcmV0dXJuIGhhc1JhcmVEYXRhKCkgPyByYXJlRGF0
YSgpLT5tdXRhdGlvbk9ic2VydmVyRW50cmllcygpIDogMDsKIH0KIAotc3RhdGljIHZvaWQgYWRk
TWF0Y2hpbmdPYnNlcnZlcnMoSGFzaFNldDxXZWJLaXRNdXRhdGlvbk9ic2VydmVyKj4mIG9ic2Vy
dmVyU2V0LCBWZWN0b3I8TXV0YXRpb25PYnNlcnZlckVudHJ5Piogb2JzZXJ2ZXJFbnRyaWVzLCBN
dXRhdGlvbk9ic2VydmVyT3B0aW9ucyBvcHRpb25zKQorc3RhdGljIHZvaWQgYWRkTWF0Y2hpbmdP
YnNlcnZlcnMoTXV0YXRpb25PYnNlcnZlck9wdGlvbnNNYXAmIG9ic2VydmVycywgVmVjdG9yPE11
dGF0aW9uT2JzZXJ2ZXJFbnRyeT4qIG9ic2VydmVyRW50cmllcywgTXV0YXRpb25PYnNlcnZlck9w
dGlvbnMgb3B0aW9ucykKIHsKICAgICBpZiAoIW9ic2VydmVyRW50cmllcykKICAgICAgICAgcmV0
dXJuOwpAQCAtMjcwNiwyNyArMjcwNiwyNiBAQCBzdGF0aWMgdm9pZCBhZGRNYXRjaGluZ09ic2Vy
dmVycyhIYXNoU2V0PFdlYktpdE11dGF0aW9uT2JzZXJ2ZXIqPiYgb2JzZXJ2ZXJTZXQsCiAgICAg
Y29uc3Qgc2l6ZV90IHNpemUgPSBvYnNlcnZlckVudHJpZXMtPnNpemUoKTsKICAgICBmb3IgKHNp
emVfdCBpID0gMDsgaSA8IHNpemU7ICsraSkgewogICAgICAgICBNdXRhdGlvbk9ic2VydmVyRW50
cnkmIGVudHJ5ID0gb2JzZXJ2ZXJFbnRyaWVzLT5hdChpKTsKLSAgICAgICAgaWYgKGVudHJ5Lmhh
c0FsbE9wdGlvbnMob3B0aW9ucykpCi0gICAgICAgICAgICBvYnNlcnZlclNldC5hZGQoZW50cnku
b2JzZXJ2ZXIuZ2V0KCkpOworCisgICAgICAgIGlmIChlbnRyeS5oYXNBbGxPcHRpb25zKG9wdGlv
bnMpKSB7CisgICAgICAgICAgICBwYWlyPE11dGF0aW9uT2JzZXJ2ZXJPcHRpb25zTWFwOjppdGVy
YXRvciwgYm9vbD4gcmVzdWx0ID0gb2JzZXJ2ZXJzLmFkZChlbnRyeS5vYnNlcnZlci5nZXQoKSwg
ZW50cnkub3B0aW9ucyk7CisgICAgICAgICAgICBpZiAoIXJlc3VsdC5zZWNvbmQpCisgICAgICAg
ICAgICAgICAgcmVzdWx0LmZpcnN0LT5zZWNvbmQgfD0gZW50cnkub3B0aW9uczsKKyAgICAgICAg
fQogICAgIH0KIH0KIAotdm9pZCBOb2RlOjpnZXRSZWdpc3RlcmVkTXV0YXRpb25PYnNlcnZlcnNP
ZlR5cGUoVmVjdG9yPFdlYktpdE11dGF0aW9uT2JzZXJ2ZXIqPiYgb2JzZXJ2ZXJzLCBXZWJLaXRN
dXRhdGlvbk9ic2VydmVyOjpNdXRhdGlvblR5cGUgdHlwZSkKK3ZvaWQgTm9kZTo6Z2V0UmVnaXN0
ZXJlZE11dGF0aW9uT2JzZXJ2ZXJzT2ZUeXBlKE11dGF0aW9uT2JzZXJ2ZXJPcHRpb25zTWFwJiBv
YnNlcnZlcnMsIFdlYktpdE11dGF0aW9uT2JzZXJ2ZXI6Ok11dGF0aW9uVHlwZSB0eXBlKQogewot
ICAgIEhhc2hTZXQ8V2ViS2l0TXV0YXRpb25PYnNlcnZlcio+IG9ic2VydmVyU2V0OwotICAgIGFk
ZE1hdGNoaW5nT2JzZXJ2ZXJzKG9ic2VydmVyU2V0LCBtdXRhdGlvbk9ic2VydmVyRW50cmllcygp
LCB0eXBlKTsKKyAgICBhZGRNYXRjaGluZ09ic2VydmVycyhvYnNlcnZlcnMsIG11dGF0aW9uT2Jz
ZXJ2ZXJFbnRyaWVzKCksIHR5cGUpOwogICAgIGZvciAoTm9kZSogbm9kZSA9IHBhcmVudE5vZGUo
KTsgbm9kZTsgbm9kZSA9IG5vZGUtPnBhcmVudE5vZGUoKSkKLSAgICAgICAgYWRkTWF0Y2hpbmdP
YnNlcnZlcnMob2JzZXJ2ZXJTZXQsIG5vZGUtPm11dGF0aW9uT2JzZXJ2ZXJFbnRyaWVzKCksIHR5
cGUgfCBXZWJLaXRNdXRhdGlvbk9ic2VydmVyOjpTdWJ0cmVlKTsKLQotICAgIC8vIEZJWE1FOiB0
aGlzIG1ldGhvZCBzaG91bGQgb3V0cHV0IGEgSGFzaFNldCBpbnN0ZWFkIG9mIGEgVmVjdG9yLgot
ICAgIGlmICghb2JzZXJ2ZXJTZXQuaXNFbXB0eSgpKQotICAgICAgICBjb3B5VG9WZWN0b3Iob2Jz
ZXJ2ZXJTZXQsIG9ic2VydmVycyk7CisgICAgICAgIGFkZE1hdGNoaW5nT2JzZXJ2ZXJzKG9ic2Vy
dmVycywgbm9kZS0+bXV0YXRpb25PYnNlcnZlckVudHJpZXMoKSwgdHlwZSB8IFdlYktpdE11dGF0
aW9uT2JzZXJ2ZXI6OlN1YnRyZWUpOwogfQogCi1Ob2RlOjpNdXRhdGlvblJlZ2lzdHJhdGlvblJl
c3VsdCBOb2RlOjpyZWdpc3Rlck11dGF0aW9uT2JzZXJ2ZXIoUGFzc1JlZlB0cjxXZWJLaXRNdXRh
dGlvbk9ic2VydmVyPiBvYnNlcnZlciwgTXV0YXRpb25PYnNlcnZlck9wdGlvbnMgb3B0aW9ucykK
K05vZGU6Ok11dGF0aW9uUmVnaXN0cmF0aW9uUmVzdWx0IE5vZGU6OnJlZ2lzdGVyTXV0YXRpb25P
YnNlcnZlcihQYXNzUmVmUHRyPFdlYktpdE11dGF0aW9uT2JzZXJ2ZXI+IG9ic2VydmVyLCBNdXRh
dGlvbk9ic2VydmVyT3B0aW9ucyBvcHRpb25zLCBQYXNzUmVmUHRyPE5vZGU+IHRyYW5zaWVudE9m
Tm9kZSkKIHsKICAgICBWZWN0b3I8TXV0YXRpb25PYnNlcnZlckVudHJ5Piogb2JzZXJ2ZXJFbnRy
aWVzID0gZW5zdXJlUmFyZURhdGEoKS0+ZW5zdXJlTXV0YXRpb25PYnNlcnZlckVudHJpZXMoKTsK
LSAgICBNdXRhdGlvbk9ic2VydmVyRW50cnkgZW50cnkob2JzZXJ2ZXIsIG9wdGlvbnMpOworICAg
IE11dGF0aW9uT2JzZXJ2ZXJFbnRyeSBlbnRyeShvYnNlcnZlciwgb3B0aW9ucywgdHJhbnNpZW50
T2ZOb2RlKTsKIAogICAgIHNpemVfdCBpbmRleCA9IG9ic2VydmVyRW50cmllcy0+ZmluZChlbnRy
eSk7CiAgICAgaWYgKGluZGV4ID09IG5vdEZvdW5kKSB7CkBAIC0yNzM4LDE0ICsyNzM3LDE0IEBA
IE5vZGU6Ok11dGF0aW9uUmVnaXN0cmF0aW9uUmVzdWx0IE5vZGU6OnJlZ2lzdGVyTXV0YXRpb25P
YnNlcnZlcihQYXNzUmVmUHRyPFdlYktpCiAgICAgcmV0dXJuIE11dGF0aW9uUmVnaXN0cmF0aW9u
T3B0aW9uc1Jlc2V0OwogfQogCi12b2lkIE5vZGU6OnVucmVnaXN0ZXJNdXRhdGlvbk9ic2VydmVy
KFBhc3NSZWZQdHI8V2ViS2l0TXV0YXRpb25PYnNlcnZlcj4gb2JzZXJ2ZXIpCit2b2lkIE5vZGU6
OnVucmVnaXN0ZXJNdXRhdGlvbk9ic2VydmVyKFBhc3NSZWZQdHI8V2ViS2l0TXV0YXRpb25PYnNl
cnZlcj4gb2JzZXJ2ZXIsIFBhc3NSZWZQdHI8Tm9kZT4gdHJhbnNpZW50T2ZOb2RlKQogewogICAg
IFZlY3RvcjxNdXRhdGlvbk9ic2VydmVyRW50cnk+KiBvYnNlcnZlckVudHJpZXMgPSBtdXRhdGlv
bk9ic2VydmVyRW50cmllcygpOwogICAgIEFTU0VSVChvYnNlcnZlckVudHJpZXMpOwogICAgIGlm
ICghb2JzZXJ2ZXJFbnRyaWVzKQogICAgICAgICByZXR1cm47CiAKLSAgICBNdXRhdGlvbk9ic2Vy
dmVyRW50cnkgZW50cnkob2JzZXJ2ZXIsIDApOworICAgIE11dGF0aW9uT2JzZXJ2ZXJFbnRyeSBl
bnRyeShvYnNlcnZlciwgMCwgdHJhbnNpZW50T2ZOb2RlKTsKICAgICBzaXplX3QgaW5kZXggPSBv
YnNlcnZlckVudHJpZXMtPmZpbmQoZW50cnkpOwogICAgIEFTU0VSVChpbmRleCAhPSBub3RGb3Vu
ZCk7CiAgICAgaWYgKGluZGV4ID09IG5vdEZvdW5kKQpAQCAtMjc1Myw2ICsyNzUyLDIyIEBAIHZv
aWQgTm9kZTo6dW5yZWdpc3Rlck11dGF0aW9uT2JzZXJ2ZXIoUGFzc1JlZlB0cjxXZWJLaXRNdXRh
dGlvbk9ic2VydmVyPiBvYnNlcnZlCiAKICAgICBvYnNlcnZlckVudHJpZXMtPnJlbW92ZShpbmRl
eCk7CiB9CisKK3ZvaWQgTm9kZTo6bm90aWZ5U3VidHJlZU9ic2VydmVyc09mRGlzY29ubmVjdGlv
bigpCit7CisgICAgZm9yIChOb2RlKiBub2RlID0gcGFyZW50Tm9kZSgpOyBub2RlOyBub2RlID0g
bm9kZS0+cGFyZW50Tm9kZSgpKSB7CisgICAgICAgIFZlY3RvcjxNdXRhdGlvbk9ic2VydmVyRW50
cnk+KiBvYnNlcnZlckVudHJpZXMgPSBub2RlLT5tdXRhdGlvbk9ic2VydmVyRW50cmllcygpOwor
ICAgICAgICBpZiAoIW9ic2VydmVyRW50cmllcykKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisg
ICAgICAgIGNvbnN0IHNpemVfdCBzaXplID0gb2JzZXJ2ZXJFbnRyaWVzLT5zaXplKCk7CisgICAg
ICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7CisgICAgICAgICAgICBNdXRh
dGlvbk9ic2VydmVyRW50cnkmIGVudHJ5ID0gb2JzZXJ2ZXJFbnRyaWVzLT5hdChpKTsKKyAgICAg
ICAgICAgIGlmICghZW50cnkudHJhbnNpZW50T2ZOb2RlICYmIGVudHJ5Lmhhc0FsbE9wdGlvbnMo
V2ViS2l0TXV0YXRpb25PYnNlcnZlcjo6U3VidHJlZSkpCisgICAgICAgICAgICAgICAgZW50cnku
b2JzZXJ2ZXItPm9ic2VydmVkU3VidHJlZVdpbGxEaXNjb25uZWN0KG5vZGUsIGVudHJ5Lm9wdGlv
bnMsIHRoaXMpOworICAgICAgICB9CisgICAgfQorfQogI2VuZGlmIC8vIEVOQUJMRShNVVRBVElP
Tl9PQlNFUlZFUlMpCiAKIApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvZG9tL05vZGUuaCBi
L1NvdXJjZS9XZWJDb3JlL2RvbS9Ob2RlLmgKaW5kZXggY2Y1NzY1MTBmZWE2NTE5MDc5YWMxMDYy
NDliOWEzZWJjMzgzYTMyZC4uNWQyNDVlNDgxYzRmNTg5Y2QyYmU3OTU3ZDRiNTIwZmFjMGI4NDg4
NCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvZG9tL05vZGUuaAorKysgYi9Tb3VyY2UvV2Vi
Q29yZS9kb20vTm9kZS5oCkBAIC01ODksMTUgKzU4OSwxNyBAQCBwdWJsaWM6CiAjZW5kaWYKIAog
I2lmIEVOQUJMRShNVVRBVElPTl9PQlNFUlZFUlMpCi0gICAgdm9pZCBnZXRSZWdpc3RlcmVkTXV0
YXRpb25PYnNlcnZlcnNPZlR5cGUoVmVjdG9yPFdlYktpdE11dGF0aW9uT2JzZXJ2ZXIqPiYsIFdl
YktpdE11dGF0aW9uT2JzZXJ2ZXI6Ok11dGF0aW9uVHlwZSk7CisgICAgdm9pZCBnZXRSZWdpc3Rl
cmVkTXV0YXRpb25PYnNlcnZlcnNPZlR5cGUoTXV0YXRpb25PYnNlcnZlck9wdGlvbnNNYXAmLCBX
ZWJLaXRNdXRhdGlvbk9ic2VydmVyOjpNdXRhdGlvblR5cGUpOwogCiAgICAgZW51bSBNdXRhdGlv
blJlZ2lzdHJhdGlvblJlc3VsdCB7CiAgICAgICAgIE11dGF0aW9uT2JzZXJ2ZXJSZWdpc3RlcmVk
LAogICAgICAgICBNdXRhdGlvblJlZ2lzdHJhdGlvbk9wdGlvbnNSZXNldAogICAgIH07Ci0gICAg
TXV0YXRpb25SZWdpc3RyYXRpb25SZXN1bHQgcmVnaXN0ZXJNdXRhdGlvbk9ic2VydmVyKFBhc3NS
ZWZQdHI8V2ViS2l0TXV0YXRpb25PYnNlcnZlcj4sIE11dGF0aW9uT2JzZXJ2ZXJPcHRpb25zKTsK
KyAgICBNdXRhdGlvblJlZ2lzdHJhdGlvblJlc3VsdCByZWdpc3Rlck11dGF0aW9uT2JzZXJ2ZXIo
UGFzc1JlZlB0cjxXZWJLaXRNdXRhdGlvbk9ic2VydmVyPiwgTXV0YXRpb25PYnNlcnZlck9wdGlv
bnMsIFBhc3NSZWZQdHI8Tm9kZT4pOwogCi0gICAgdm9pZCB1bnJlZ2lzdGVyTXV0YXRpb25PYnNl
cnZlcihQYXNzUmVmUHRyPFdlYktpdE11dGF0aW9uT2JzZXJ2ZXI+KTsKKyAgICB2b2lkIHVucmVn
aXN0ZXJNdXRhdGlvbk9ic2VydmVyKFBhc3NSZWZQdHI8V2ViS2l0TXV0YXRpb25PYnNlcnZlcj4s
IFBhc3NSZWZQdHI8Tm9kZT4pOworCisgICAgdm9pZCBub3RpZnlTdWJ0cmVlT2JzZXJ2ZXJzT2ZE
aXNjb25uZWN0aW9uKCk7CiAjZW5kaWYgLy8gRU5BQkxFKE1VVEFUSU9OX09CU0VSVkVSUykKIAog
cHJpdmF0ZToKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2RvbS9Ob2RlUmFyZURhdGEuaCBi
L1NvdXJjZS9XZWJDb3JlL2RvbS9Ob2RlUmFyZURhdGEuaAppbmRleCA1MDJiNjU4ZmMwNGJlYTY4
NzkxNzE3NTUwNWU4YzhhMTcwMjc0OThiLi5kMTI3OGYzMmJiNzFmNThmODc0YWQyN2JhN2Y3ZjY5
ZjczNzY5ZGI4IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9kb20vTm9kZVJhcmVEYXRhLmgK
KysrIGIvU291cmNlL1dlYkNvcmUvZG9tL05vZGVSYXJlRGF0YS5oCkBAIC05MCwxNSArOTAsMTYg
QEAgcHJpdmF0ZToKIAogI2lmIEVOQUJMRShNVVRBVElPTl9PQlNFUlZFUlMpCiBzdHJ1Y3QgTXV0
YXRpb25PYnNlcnZlckVudHJ5IHsKLSAgICBNdXRhdGlvbk9ic2VydmVyRW50cnkoUGFzc1JlZlB0
cjxXZWJLaXRNdXRhdGlvbk9ic2VydmVyPiBvYnNlcnZlciwgTXV0YXRpb25PYnNlcnZlck9wdGlv
bnMgb3B0aW9ucykKKyAgICBNdXRhdGlvbk9ic2VydmVyRW50cnkoUGFzc1JlZlB0cjxXZWJLaXRN
dXRhdGlvbk9ic2VydmVyPiBvYnNlcnZlciwgTXV0YXRpb25PYnNlcnZlck9wdGlvbnMgb3B0aW9u
cywgUGFzc1JlZlB0cjxOb2RlPiBub2RlKQogICAgICAgICA6IG9ic2VydmVyKG9ic2VydmVyKQog
ICAgICAgICAsIG9wdGlvbnMob3B0aW9ucykKKyAgICAgICAgLCB0cmFuc2llbnRPZk5vZGUobm9k
ZSkKICAgICB7CiAgICAgfQogCiAgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IE11dGF0aW9uT2Jz
ZXJ2ZXJFbnRyeSYgb3RoZXIpIGNvbnN0CiAgICAgewotICAgICAgICByZXR1cm4gb2JzZXJ2ZXIg
PT0gb3RoZXIub2JzZXJ2ZXI7CisgICAgICAgIHJldHVybiBvYnNlcnZlciA9PSBvdGhlci5vYnNl
cnZlciAmJiB0cmFuc2llbnRPZk5vZGUgPT0gb3RoZXIudHJhbnNpZW50T2ZOb2RlOwogICAgIH0K
IAogICAgIGJvb2wgaGFzQWxsT3B0aW9ucyhNdXRhdGlvbk9ic2VydmVyT3B0aW9ucyBvcHRpb25z
KSBjb25zdApAQCAtMTA4LDYgKzEwOSw3IEBAIHN0cnVjdCBNdXRhdGlvbk9ic2VydmVyRW50cnkg
ewogCiAgICAgUmVmUHRyPFdlYktpdE11dGF0aW9uT2JzZXJ2ZXI+IG9ic2VydmVyOwogICAgIE11
dGF0aW9uT2JzZXJ2ZXJPcHRpb25zIG9wdGlvbnM7CisgICAgUmVmUHRyPE5vZGU+IHRyYW5zaWVu
dE9mTm9kZTsKIH07CiAjZW5kaWYgLy8gRU5BQkxFKE1VVEFUSU9OX09CU0VSVkVSUykKIApkaWZm
IC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvZG9tL1dlYktpdE11dGF0aW9uT2JzZXJ2ZXIuY3BwIGIv
U291cmNlL1dlYkNvcmUvZG9tL1dlYktpdE11dGF0aW9uT2JzZXJ2ZXIuY3BwCmluZGV4IDgzZjE1
OTkwZWEyYmVjYTMzOWJiMGE3M2NjMjk2OWJhNGRmMjlmYTUuLjBjNWRlMTRjZmRhNmViNWFjZmQ5
Njc4OTEwNTU0YTVlMDIyNzM5ZWYgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL2RvbS9XZWJL
aXRNdXRhdGlvbk9ic2VydmVyLmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9kb20vV2ViS2l0TXV0
YXRpb25PYnNlcnZlci5jcHAKQEAgLTU5LDE2ICs1OSwzMiBAQCB2b2lkIFdlYktpdE11dGF0aW9u
T2JzZXJ2ZXI6Om9ic2VydmUoTm9kZSogbm9kZSwgTXV0YXRpb25PYnNlcnZlck9wdGlvbnMgb3B0
aW9ucwogewogICAgIC8vIEZJWE1FOiBNb3JlIG9wdGlvbnMgY29tcG9zaXRpb24gd29yayBuZWVk
cyB0byBiZSBkb25lIGhlcmUsIGUuZy4sIHZhbGlkYXRpb24uCiAKLSAgICBpZiAobm9kZS0+cmVn
aXN0ZXJNdXRhdGlvbk9ic2VydmVyKHRoaXMsIG9wdGlvbnMpID09IE5vZGU6Ok11dGF0aW9uT2Jz
ZXJ2ZXJSZWdpc3RlcmVkKQorICAgIGlmIChub2RlLT5yZWdpc3Rlck11dGF0aW9uT2JzZXJ2ZXIo
dGhpcywgb3B0aW9ucywgMCkgPT0gTm9kZTo6TXV0YXRpb25PYnNlcnZlclJlZ2lzdGVyZWQpIHsK
ICAgICAgICAgbV9vYnNlcnZlZE5vZGVzLmFwcGVuZChub2RlKTsKKyAgICAgICAgcmV0dXJuOwor
ICAgIH0KKworICAgIFRyYW5zaWVudE9ic2VydmVkTm9kZXNNYXA6Oml0ZXJhdG9yIG1hcEl0ZXIg
PSBtX3RyYW5zaWVudE9ic2VydmVkTm9kZXMuZmluZChub2RlKTsKKyAgICBpZiAobWFwSXRlciA9
PSBtX3RyYW5zaWVudE9ic2VydmVkTm9kZXMuZW5kKCkpCisgICAgICAgIHJldHVybjsKKworICAg
IGZvciAoSGFzaFNldDxSZWZQdHI8Tm9kZT4gPjo6aXRlcmF0b3Igc2V0SXRlciA9IG1hcEl0ZXIt
PnNlY29uZC5iZWdpbigpOyBzZXRJdGVyICE9IG1hcEl0ZXItPnNlY29uZC5lbmQoKTsgKytzZXRJ
dGVyKQorICAgICAgICAoKnNldEl0ZXIpLT51bnJlZ2lzdGVyTXV0YXRpb25PYnNlcnZlcih0aGlz
LCBub2RlKTsKK30KKworc3RhdGljIHZvaWQgdW5yZWdpc3RlclRyYW5zaWVudEVudHJpZXMoSGFz
aFNldDxSZWZQdHI8Tm9kZT4gPiYgdHJhbnNpZW50Tm9kZXMsIFdlYktpdE11dGF0aW9uT2JzZXJ2
ZXIqIG9ic2VydmVyLCBOb2RlKiBvYnNlcnZlZE5vZGUpCit7CisgICAgZm9yIChIYXNoU2V0PFJl
ZlB0cjxOb2RlPiA+OjppdGVyYXRvciBpdGVyID0gdHJhbnNpZW50Tm9kZXMuYmVnaW4oKTsgaXRl
ciAhPSB0cmFuc2llbnROb2Rlcy5lbmQoKTsgKytpdGVyKQorICAgICAgICAoKml0ZXIpLT51bnJl
Z2lzdGVyTXV0YXRpb25PYnNlcnZlcihvYnNlcnZlciwgb2JzZXJ2ZWROb2RlKTsKIH0KIAogdm9p
ZCBXZWJLaXRNdXRhdGlvbk9ic2VydmVyOjpkaXNjb25uZWN0KCkKIHsKICAgICBmb3IgKHNpemVf
dCBpID0gMDsgaSA8IG1fb2JzZXJ2ZWROb2Rlcy5zaXplKCk7ICsraSkKLSAgICAgICAgbV9vYnNl
cnZlZE5vZGVzW2ldLT51bnJlZ2lzdGVyTXV0YXRpb25PYnNlcnZlcih0aGlzKTsKKyAgICAgICAg
bV9vYnNlcnZlZE5vZGVzW2ldLT51bnJlZ2lzdGVyTXV0YXRpb25PYnNlcnZlcih0aGlzLCAwKTsK
IAogICAgIG1fb2JzZXJ2ZWROb2Rlcy5jbGVhcigpOworICAgIGNsZWFyVHJhbnNpZW50RW50cmll
cygpOwogfQogCiB2b2lkIFdlYktpdE11dGF0aW9uT2JzZXJ2ZXI6Om9ic2VydmVkTm9kZURlc3Ry
dWN0ZWQoTm9kZSogbm9kZSkKQEAgLTc5LDYgKzk1LDEyIEBAIHZvaWQgV2ViS2l0TXV0YXRpb25P
YnNlcnZlcjo6b2JzZXJ2ZWROb2RlRGVzdHJ1Y3RlZChOb2RlKiBub2RlKQogICAgICAgICByZXR1
cm47CiAKICAgICBtX29ic2VydmVkTm9kZXMucmVtb3ZlKGluZGV4KTsKKyAgICBUcmFuc2llbnRP
YnNlcnZlZE5vZGVzTWFwOjppdGVyYXRvciBpdGVyID0gbV90cmFuc2llbnRPYnNlcnZlZE5vZGVz
LmZpbmQobm9kZSk7CisgICAgaWYgKGl0ZXIgPT0gbV90cmFuc2llbnRPYnNlcnZlZE5vZGVzLmVu
ZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICB1bnJlZ2lzdGVyVHJhbnNpZW50RW50cmllcyhp
dGVyLT5zZWNvbmQsIHRoaXMsIG5vZGUpOworICAgIG1fdHJhbnNpZW50T2JzZXJ2ZWROb2Rlcy5y
ZW1vdmUobm9kZSk7CiB9CiAKIHR5cGVkZWYgTGlzdEhhc2hTZXQ8UmVmUHRyPFdlYktpdE11dGF0
aW9uT2JzZXJ2ZXI+ID4gTXV0YXRpb25PYnNlcnZlclNldDsKQEAgLTk1LDEwICsxMTcsMzQgQEAg
dm9pZCBXZWJLaXRNdXRhdGlvbk9ic2VydmVyOjplbnF1ZXVlTXV0YXRpb25SZWNvcmQoUGFzc1Jl
ZlB0cjxNdXRhdGlvblJlY29yZD4gbXUKICAgICBhY3RpdmVNdXRhdGlvbk9ic2VydmVycygpLmFk
ZCh0aGlzKTsKIH0KIAordm9pZCBXZWJLaXRNdXRhdGlvbk9ic2VydmVyOjpvYnNlcnZlZFN1YnRy
ZWVXaWxsRGlzY29ubmVjdChQYXNzUmVmUHRyPE5vZGU+IHBycE9ic2VydmVkTm9kZSwgTXV0YXRp
b25PYnNlcnZlck9wdGlvbnMgb3B0aW9ucywgUGFzc1JlZlB0cjxOb2RlPiBwcnBEaXNjb25uZWN0
aW5nTm9kZSkKK3sKKyAgICBSZWZQdHI8Tm9kZT4gb2JzZXJ2ZWROb2RlID0gcHJwT2JzZXJ2ZWRO
b2RlOworICAgIFJlZlB0cjxOb2RlPiBkaXNjb25uZWN0aW5nTm9kZSA9IHBycERpc2Nvbm5lY3Rp
bmdOb2RlOworCisgICAgZGlzY29ubmVjdGluZ05vZGUtPnJlZ2lzdGVyTXV0YXRpb25PYnNlcnZl
cih0aGlzLCBvcHRpb25zLCBvYnNlcnZlZE5vZGUpOworICAgIFRyYW5zaWVudE9ic2VydmVkTm9k
ZXNNYXA6Oml0ZXJhdG9yIGl0ZXIgPSBtX3RyYW5zaWVudE9ic2VydmVkTm9kZXMuZmluZChvYnNl
cnZlZE5vZGUuZ2V0KCkpOworICAgIGlmIChpdGVyID09IG1fdHJhbnNpZW50T2JzZXJ2ZWROb2Rl
cy5lbmQoKSkgeworICAgICAgICBIYXNoU2V0PFJlZlB0cjxOb2RlPiA+IHNldDsKKyAgICAgICAg
cGFpcjxUcmFuc2llbnRPYnNlcnZlZE5vZGVzTWFwOjppdGVyYXRvciwgYm9vbD4gcmVzdWx0ID0g
bV90cmFuc2llbnRPYnNlcnZlZE5vZGVzLnNldChvYnNlcnZlZE5vZGUuZ2V0KCksIHNldCk7Cisg
ICAgICAgIHJlc3VsdC5maXJzdC0+c2Vjb25kLmFkZChkaXNjb25uZWN0aW5nTm9kZSk7CisgICAg
fSBlbHNlCisgICAgICAgIGl0ZXItPnNlY29uZC5hZGQoZGlzY29ubmVjdGluZ05vZGUpOworfQor
Cit2b2lkIFdlYktpdE11dGF0aW9uT2JzZXJ2ZXI6OmNsZWFyVHJhbnNpZW50RW50cmllcygpCit7
CisgICAgZm9yIChUcmFuc2llbnRPYnNlcnZlZE5vZGVzTWFwOjppdGVyYXRvciBtYXBJdGVyID0g
bV90cmFuc2llbnRPYnNlcnZlZE5vZGVzLmJlZ2luKCk7IG1hcEl0ZXIgIT0gbV90cmFuc2llbnRP
YnNlcnZlZE5vZGVzLmVuZCgpOyArK21hcEl0ZXIpCisgICAgICAgIHVucmVnaXN0ZXJUcmFuc2ll
bnRFbnRyaWVzKG1hcEl0ZXItPnNlY29uZCwgdGhpcywgbWFwSXRlci0+Zmlyc3QpOworCisgICAg
bV90cmFuc2llbnRPYnNlcnZlZE5vZGVzLmNsZWFyKCk7Cit9CisKIHZvaWQgV2ViS2l0TXV0YXRp
b25PYnNlcnZlcjo6ZGVsaXZlcigpCiB7CiAgICAgTXV0YXRpb25SZWNvcmRBcnJheSByZWNvcmRz
OwogICAgIHJlY29yZHMuc3dhcChtX3JlY29yZHMpOworICAgIGNsZWFyVHJhbnNpZW50RW50cmll
cygpOwogICAgIG1fY2FsbGJhY2stPmhhbmRsZUV2ZW50KCZyZWNvcmRzLCB0aGlzKTsKIH0KIApk
aWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvZG9tL1dlYktpdE11dGF0aW9uT2JzZXJ2ZXIuaCBi
L1NvdXJjZS9XZWJDb3JlL2RvbS9XZWJLaXRNdXRhdGlvbk9ic2VydmVyLmgKaW5kZXggZmMzMjg2
MDk5ODRhYTEyMWEzY2JmODY5NDQwNDYxZWIyY2E2NTk4ZS4uMDI1YjZlYmQzMTUxOTNkYjA5MjJh
NmU1Nzc1OGE5ZmM4ZWNkMjkyZSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvZG9tL1dlYktp
dE11dGF0aW9uT2JzZXJ2ZXIuaAorKysgYi9Tb3VyY2UvV2ViQ29yZS9kb20vV2ViS2l0TXV0YXRp
b25PYnNlcnZlci5oCkBAIC0zMyw2ICszMyw4IEBACiAKICNpZiBFTkFCTEUoTVVUQVRJT05fT0JT
RVJWRVJTKQogCisjaW5jbHVkZSA8d3RmL0hhc2hNYXAuaD4KKyNpbmNsdWRlIDx3dGYvSGFzaFNl
dC5oPgogI2luY2x1ZGUgPHd0Zi9QYXNzT3duUHRyLmg+CiAjaW5jbHVkZSA8d3RmL1JlZkNvdW50
ZWQuaD4KICNpbmNsdWRlIDx3dGYvUmVmUHRyLmg+CkBAIC02OCwxOSArNzAsMjYgQEAgcHVibGlj
OgogCiAgICAgdm9pZCBvYnNlcnZlKE5vZGUqLCBNdXRhdGlvbk9ic2VydmVyT3B0aW9ucyk7CiAg
ICAgdm9pZCBkaXNjb25uZWN0KCk7CisgICAgdm9pZCBvYnNlcnZlZFN1YnRyZWVXaWxsRGlzY29u
bmVjdChQYXNzUmVmUHRyPE5vZGU+LCBNdXRhdGlvbk9ic2VydmVyT3B0aW9ucywgUGFzc1JlZlB0
cjxOb2RlPik7CiAgICAgdm9pZCBvYnNlcnZlZE5vZGVEZXN0cnVjdGVkKE5vZGUqKTsKICAgICB2
b2lkIGVucXVldWVNdXRhdGlvblJlY29yZChQYXNzUmVmUHRyPE11dGF0aW9uUmVjb3JkPik7CiAK
IHByaXZhdGU6CiAgICAgV2ViS2l0TXV0YXRpb25PYnNlcnZlcihQYXNzUmVmUHRyPE11dGF0aW9u
Q2FsbGJhY2s+KTsKIAorICAgIHZvaWQgY2xlYXJUcmFuc2llbnRFbnRyaWVzKCk7CiAgICAgdm9p
ZCBkZWxpdmVyKCk7CiAKICAgICBSZWZQdHI8TXV0YXRpb25DYWxsYmFjaz4gbV9jYWxsYmFjazsK
ICAgICBWZWN0b3I8UmVmUHRyPE11dGF0aW9uUmVjb3JkPiA+IG1fcmVjb3JkczsKICAgICBWZWN0
b3I8Tm9kZSo+IG1fb2JzZXJ2ZWROb2RlczsgLy8gTm9kZVJhcmVEYXRhIGhhcyBhIFJlZlB0ciB0
byB0aGlzLCBzbyB1c2UgYSB3ZWFrIHBvaW50ZXIgdG8gYXZvaWQgYSBjeWNsZS4KKworICAgIHR5
cGVkZWYgSGFzaE1hcDxOb2RlKiwgSGFzaFNldDxSZWZQdHI8Tm9kZT4gPiA+IFRyYW5zaWVudE9i
c2VydmVkTm9kZXNNYXA7CisgICAgVHJhbnNpZW50T2JzZXJ2ZWROb2Rlc01hcCBtX3RyYW5zaWVu
dE9ic2VydmVkTm9kZXM7CiB9OwogCit0eXBlZGVmIEhhc2hNYXA8V2ViS2l0TXV0YXRpb25PYnNl
cnZlciosIE11dGF0aW9uT2JzZXJ2ZXJPcHRpb25zPiBNdXRhdGlvbk9ic2VydmVyT3B0aW9uc01h
cDsKKwogfQogCiAjZW5kaWYgLy8gRU5BQkxFKE1VVEFUSU9OX09CU0VSVkVSUykKZGlmZiAtLWdp
dCBhL0xheW91dFRlc3RzL0NoYW5nZUxvZyBiL0xheW91dFRlc3RzL0NoYW5nZUxvZwppbmRleCBi
ZTU2NDY4M2IzNzA4YTAwYWYyNGUzMWE4YTY4OTU5ZmQwMTQ5NGFhLi43YjhhYjZkMmFhMWYwMWEz
M2VjMzJlNzhiZTk0OGZkYmE4MGEwNTk0IDEwMDY0NAotLS0gYS9MYXlvdXRUZXN0cy9DaGFuZ2VM
b2cKKysrIGIvTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTMgQEAKKzIwMTEtMTAt
MjQgIFJhZmFlbCBXZWluc3RlaW4gIDxyYWZhZWx3QGNocm9taXVtLm9yZz4KKworICAgICAgICBb
TXV0YXRpb25PYnNlcnZlcnNdIEltcGxlbWVudCBzdWJ0cmVlIG9ic2VydmF0aW9uIG9mIHRyYW5z
aWVudGx5IGRpc2Nvbm5lY3RlZCBub2RlcworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9y
Zy9zaG93X2J1Zy5jZ2k/aWQ9NzA3ODgKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9P
UFMhKS4KKworICAgICAgICAqIGZhc3QvbXV0YXRpb24vb2JzZXJ2ZS1zdWJ0cmVlLWV4cGVjdGVk
LnR4dDoKKyAgICAgICAgKiBmYXN0L211dGF0aW9uL29ic2VydmUtc3VidHJlZS5odG1sOgorCiAy
MDExLTEwLTI0ICBKdWxpZW4gQ2hhZmZyYWl4ICA8amNoYWZmcmFpeEB3ZWJraXQub3JnPgogCiAg
ICAgICAgIFVucmV2aWV3ZWQgZ2FyZGVuaW5nIHJlYmFzZWxpbmluZy4KZGlmZiAtLWdpdCBhL0xh
eW91dFRlc3RzL2Zhc3QvbXV0YXRpb24vb2JzZXJ2ZS1zdWJ0cmVlLWV4cGVjdGVkLnR4dCBiL0xh
eW91dFRlc3RzL2Zhc3QvbXV0YXRpb24vb2JzZXJ2ZS1zdWJ0cmVlLWV4cGVjdGVkLnR4dAppbmRl
eCA1NTI3ZWIxYWMzMGUwMjQxMjQ3ZGQxYTkxMjczMDczZWI0NmVhM2FmLi42N2M1YjA5MDQ1NThk
OWU3ZmFjZjYzNThlNTFjMGM5ODIyOTVkYmFjIDEwMDY0NAotLS0gYS9MYXlvdXRUZXN0cy9mYXN0
L211dGF0aW9uL29ic2VydmUtc3VidHJlZS1leHBlY3RlZC50eHQKKysrIGIvTGF5b3V0VGVzdHMv
ZmFzdC9tdXRhdGlvbi9vYnNlcnZlLXN1YnRyZWUtZXhwZWN0ZWQudHh0CkBAIC0xMyw2ICsxMywy
NyBAQCBQQVNTIG11dGF0aW9uc1swXS5hdHRyaWJ1dGVOYW1lc3BhY2UgaXMgbnVsbAogUEFTUyBt
dXRhdGlvbnNbMV0udHlwZSBpcyAiY2hhcmFjdGVyRGF0YSIKIFBBU1MgbXV0YXRpb25zWzFdLnRh
cmdldCBpcyBzdWJEaXYuZmlyc3RDaGlsZAogCitUZXN0aW5nIHRoYXQgdHJhbnNpZW50bHkgZGlz
Y29ubmVjdGVkIG5vZGVzIGFyZSBzdGlsbCBvYnNlcnZlZCB2aWEgc3VidHJlZS4KKy4uLmF0dHJp
YnV0ZSBjaGFuZ2UgaXMgdHJhbnNpZW50bHkgZGlzY29ubmVjdGVkIHN1YnRyZWUgaXMgb2JzZXJ2
ZWQKK1BBU1MgbXV0YXRpb25zLmxlbmd0aCBpcyAyCitQQVNTIG11dGF0aW9uc1swXS50eXBlIGlz
ICJhdHRyaWJ1dGVzIgorUEFTUyBtdXRhdGlvbnNbMF0udGFyZ2V0IGlzIHN1YkRpdgorUEFTUyBt
dXRhdGlvbnNbMF0uYXR0cmlidXRlTmFtZSBpcyAiZm9vIgorUEFTUyBtdXRhdGlvbnNbMV0udHlw
ZSBpcyAiYXR0cmlidXRlcyIKK1BBU1MgbXV0YXRpb25zWzFdLnRhcmdldCBpcyBzdWJEaXYKK1BB
U1MgbXV0YXRpb25zWzFdLmF0dHJpYnV0ZU5hbWUgaXMgInRlc3QiCisuLi50cmFuc2llbnQgc3Vi
dHJlZSBvYnNlcnZhdGlvbiB3YXMgc3RvcHBlZCBhZnRlciBkZWxpdmVyeQorUEFTUyBtdXRhdGlv
bnMgaXMgbnVsbAorLi4ucmVhdHRhY2hlZCBzdWJ0cmVlIGlzIHN5bmNocm9ub3VzbHkgb2JzZXJ2
YWJsZQorUEFTUyBtdXRhdGlvbnMubGVuZ3RoIGlzIDEKK1BBU1MgbXV0YXRpb25zWzBdLnR5cGUg
aXMgImF0dHJpYnV0ZXMiCitQQVNTIG11dGF0aW9uc1swXS50YXJnZXQgaXMgc3ViRGl2CitQQVNT
IG11dGF0aW9uc1swXS5hdHRyaWJ1dGVOYW1lIGlzICJmb28iCisuLi5yZS1vYnNlcnZhdGlvbiBj
bGVhcmVkIHRoZSB0cmFuc2llbnRseSBvYnNlcnZlZCBub2RlcworUEFTUyBtdXRhdGlvbnMubGVu
Z3RoIGlzIDEKK1BBU1MgbXV0YXRpb25zWzBdLnR5cGUgaXMgImNoYXJhY3RlckRhdGEiCitQQVNT
IG11dGF0aW9uc1swXS50YXJnZXQgaXMgc3ViRGl2LmZpcnN0Q2hpbGQKKwogVGVzdGluZyB0d28g
b2JzZXJ2ZXJzIGF0IGRpZmZlcmVudCBkZXB0aHMuCiBQQVNTIG11dGF0aW9ucy5sZW5ndGggaXMg
MQogUEFTUyBtdXRhdGlvbnNbMF0udHlwZSBpcyAiYXR0cmlidXRlcyIKZGlmZiAtLWdpdCBhL0xh
eW91dFRlc3RzL2Zhc3QvbXV0YXRpb24vb2JzZXJ2ZS1zdWJ0cmVlLmh0bWwgYi9MYXlvdXRUZXN0
cy9mYXN0L211dGF0aW9uL29ic2VydmUtc3VidHJlZS5odG1sCmluZGV4IGVlNjI5NjdhNTEyM2Jj
OWExNzI0NTBkNzdiODUwNmRjNDgyMDY3NzUuLmVjOTA2NWVlNzc3MGNlMzI3MzIxZDkxNGRhZTU4
NTdhYjJiNjU4NTUgMTAwNjQ0Ci0tLSBhL0xheW91dFRlc3RzL2Zhc3QvbXV0YXRpb24vb2JzZXJ2
ZS1zdWJ0cmVlLmh0bWwKKysrIGIvTGF5b3V0VGVzdHMvZmFzdC9tdXRhdGlvbi9vYnNlcnZlLXN1
YnRyZWUuaHRtbApAQCAtNTYsNiArNTYsODggQEAgZnVuY3Rpb24gdGVzdEJhc2ljKCkgewogICAg
IHN0YXJ0KCk7CiB9CiAKK2Z1bmN0aW9uIHRlc3RUcmFuc2llbnREaXNjb25uZWN0ZWRTdWJ0cmVl
KCkgeworICAgIHZhciBvYnNlcnZlcjsKKworICAgIGZ1bmN0aW9uIHN0YXJ0KCkgeworICAgICAg
ICBkZWJ1ZygnVGVzdGluZyB0aGF0IHRyYW5zaWVudGx5IGRpc2Nvbm5lY3RlZCBub2RlcyBhcmUg
c3RpbGwgb2JzZXJ2ZWQgdmlhIHN1YnRyZWUuJyk7CisKKyAgICAgICAgbXV0YXRpb25zID0gbnVs
bDsKKyAgICAgICAgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CisgICAgICAg
IHN1YkRpdiA9IGRpdi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSk7
CisgICAgICAgIHN1YkRpdi5pbm5lckhUTUwgPSAnaGVsbG8sIHdvcmxkJzsKKyAgICAgICAgb2Jz
ZXJ2ZXIgPSBuZXcgV2ViS2l0TXV0YXRpb25PYnNlcnZlcihmdW5jdGlvbihtdXRhdGlvbnMpIHsK
KyAgICAgICAgICAgIHdpbmRvdy5tdXRhdGlvbnMgPSBtdXRhdGlvbnM7CisgICAgICAgIH0pOwor
CisgICAgICAgIG9ic2VydmVyLm9ic2VydmUoZGl2LCB7YXR0cmlidXRlczogdHJ1ZSwgY2hhcmFj
dGVyRGF0YTogdHJ1ZSwgc3VidHJlZTogdHJ1ZX0pOworICAgICAgICBzdWJEaXYuc2V0QXR0cmli
dXRlKCdmb28nLCAnYmFyJyk7CisgICAgICAgIGRpdi5yZW1vdmVDaGlsZChzdWJEaXYpOworICAg
ICAgICBzdWJEaXYuc2V0QXR0cmlidXRlKCd0ZXN0JywgJ3Rlc3QnKTsKKyAgICAgICAgc2V0VGlt
ZW91dChjaGVja0RlbGl2ZXJlZEFuZENoYW5nZUFnYWluLCAwKTsKKyAgICB9CisKKyAgICBmdW5j
dGlvbiBjaGVja0RlbGl2ZXJlZEFuZENoYW5nZUFnYWluKCkgeworICAgICAgICBkZWJ1ZygnLi4u
YXR0cmlidXRlIGNoYW5nZSBpcyB0cmFuc2llbnRseSBkaXNjb25uZWN0ZWQgc3VidHJlZSBpcyBv
YnNlcnZlZCcpOworCisgICAgICAgIHNob3VsZEJlKCdtdXRhdGlvbnMubGVuZ3RoJywgJzInKTsK
KyAgICAgICAgc2hvdWxkQmUoJ211dGF0aW9uc1swXS50eXBlJywgJyJhdHRyaWJ1dGVzIicpOwor
ICAgICAgICBzaG91bGRCZSgnbXV0YXRpb25zWzBdLnRhcmdldCcsICdzdWJEaXYnKTsKKyAgICAg
ICAgc2hvdWxkQmUoJ211dGF0aW9uc1swXS5hdHRyaWJ1dGVOYW1lJywgJyJmb28iJyk7CisgICAg
ICAgIHNob3VsZEJlKCdtdXRhdGlvbnNbMV0udHlwZScsICciYXR0cmlidXRlcyInKTsKKyAgICAg
ICAgc2hvdWxkQmUoJ211dGF0aW9uc1sxXS50YXJnZXQnLCAnc3ViRGl2Jyk7CisgICAgICAgIHNo
b3VsZEJlKCdtdXRhdGlvbnNbMV0uYXR0cmlidXRlTmFtZScsICcidGVzdCInKTsKKworICAgICAg
ICBtdXRhdGlvbnMgPSBudWxsOworICAgICAgICBzdWJEaXYuc2V0QXR0cmlidXRlKCdmb28nLCAn
YmF6Jyk7CisKKyAgICAgICAgc2V0VGltZW91dChjaGVja05vdERlbGl2ZXJlZEFuZFJlYXR0YWNo
KTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiBjaGVja05vdERlbGl2ZXJlZEFuZFJlYXR0YWNoKCkg
eworICAgICAgICBkZWJ1ZygnLi4udHJhbnNpZW50IHN1YnRyZWUgb2JzZXJ2YXRpb24gd2FzIHN0
b3BwZWQgYWZ0ZXIgZGVsaXZlcnknKTsKKworICAgICAgICBzaG91bGRCZSgnbXV0YXRpb25zJywg
J251bGwnKTsKKworICAgICAgICBtdXRhdGlvbnMgPSBudWxsCisgICAgICAgIGRpdi5hcHBlbmRD
aGlsZChzdWJEaXYpOworICAgICAgICBzdWJEaXYuc2V0QXR0cmlidXRlKCdmb28nLCAnYmF0Jyk7
CisKKyAgICAgICAgc2V0VGltZW91dChjaGVja0RlbGl2ZXJlZEFuZFJlb2JzZXJ2ZSk7CisgICAg
fQorCisgICAgZnVuY3Rpb24gY2hlY2tEZWxpdmVyZWRBbmRSZW9ic2VydmUoKSB7CisgICAgICAg
IGRlYnVnKCcuLi5yZWF0dGFjaGVkIHN1YnRyZWUgaXMgc3luY2hyb25vdXNseSBvYnNlcnZhYmxl
Jyk7CisKKyAgICAgICAgc2hvdWxkQmUoJ211dGF0aW9ucy5sZW5ndGgnLCAnMScpOworICAgICAg
ICBzaG91bGRCZSgnbXV0YXRpb25zWzBdLnR5cGUnLCAnImF0dHJpYnV0ZXMiJyk7CisgICAgICAg
IHNob3VsZEJlKCdtdXRhdGlvbnNbMF0udGFyZ2V0JywgJ3N1YkRpdicpOworICAgICAgICBzaG91
bGRCZSgnbXV0YXRpb25zWzBdLmF0dHJpYnV0ZU5hbWUnLCAnImZvbyInKTsKKworICAgICAgICBt
dXRhdGlvbnMgPSBudWxsOworICAgICAgICBkaXYucmVtb3ZlQ2hpbGQoc3ViRGl2KTsKKyAgICAg
ICAgc3ViRGl2LmZpcnN0Q2hpbGQudGV4dENvbnRlbnQgPSAnYmFkYnllJzsKKyAgICAgICAgb2Jz
ZXJ2ZXIub2JzZXJ2ZShkaXYsIHthdHRyaWJ1dGVzOiB0cnVlLCBjaGFyYWN0ZXJEYXRhOiB0cnVl
LCBzdWJ0cmVlOiB0cnVlfSk7CisgICAgICAgIHN1YkRpdi5zZXRBdHRyaWJ1dGUoJ2ZvbycsICdi
b28nKTsKKworICAgICAgICBzZXRUaW1lb3V0KGZpbmlzaCk7CisgICAgfQorCisKKyAgICBmdW5j
dGlvbiBmaW5pc2goKSB7CisgICAgICAgIGRlYnVnKCcuLi5yZS1vYnNlcnZhdGlvbiBjbGVhcmVk
IHRoZSB0cmFuc2llbnRseSBvYnNlcnZlZCBub2RlcycpOworCisgICAgICAgIHNob3VsZEJlKCdt
dXRhdGlvbnMubGVuZ3RoJywgJzEnKTsKKyAgICAgICAgc2hvdWxkQmUoJ211dGF0aW9uc1swXS50
eXBlJywgJyJjaGFyYWN0ZXJEYXRhIicpOworICAgICAgICBzaG91bGRCZSgnbXV0YXRpb25zWzBd
LnRhcmdldCcsICdzdWJEaXYuZmlyc3RDaGlsZCcpOworCisgICAgICAgIG9ic2VydmVyLmRpc2Nv
bm5lY3QoKTsKKyAgICAgICAgZGVidWcoJycpOworICAgICAgICBydW5OZXh0VGVzdCgpOworICAg
IH0KKyAgICBzdGFydCgpOworfQorCiBmdW5jdGlvbiB0ZXN0TXVsdGlwbGVPYnNlcnZlcnMoKSB7
CiAgICAgdmFyIG9ic2VydmVyOwogICAgIHZhciBvYnNlcnZlcjI7CkBAIC0xMzUsNyArMjE3LDcg
QEAgZnVuY3Rpb24gdGVzdE11bHRpcGxlT2JzZXJ2YXRpb25zKCkgewogCiAgICAgc3RhcnQoKTsK
IH0KLXZhciB0ZXN0cyA9IFt0ZXN0QmFzaWMsIHRlc3RNdWx0aXBsZU9ic2VydmVycywgdGVzdE11
bHRpcGxlT2JzZXJ2YXRpb25zXTsKK3ZhciB0ZXN0cyA9IFt0ZXN0QmFzaWMsIHRlc3RUcmFuc2ll
bnREaXNjb25uZWN0ZWRTdWJ0cmVlLCB0ZXN0TXVsdGlwbGVPYnNlcnZlcnMsIHRlc3RNdWx0aXBs
ZU9ic2VydmF0aW9uc107CiB2YXIgdGVzdEluZGV4ID0gMDsKIAogZnVuY3Rpb24gcnVuTmV4dFRl
c3QoKSB7Cg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>112392</attachid>
            <date>2011-10-25 13:37:41 -0700</date>
            <delta_ts>2011-10-26 14:40:51 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-70788-20111025133740.patch</filename>
            <type>text/plain</type>
            <size>25689</size>
            <attacher name="Rafael Weinstein">rafaelw</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogOTgyNjIKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0No
YW5nZUxvZyBiL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwppbmRleCA4MWE1NzJkZDcyMjNhMGY1
M2FlNWFmMzU1NDE4YjZmOWQzNWMwMGZkLi4xN2EyYTA3ZWQ0YmMwM2JjOGYwZjk0ZWM0MjMyNjYz
NjUzN2VhMTM3IDEwMDc1NQotLS0gYS9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvU291
cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCkBAIC0xLDUgKzEsNDkgQEAKIDIwMTEtMTAtMjQgIFJhZmFl
bCBXZWluc3RlaW4gIDxyYWZhZWx3QGNocm9taXVtLm9yZz4KIAorICAgICAgICBbTXV0YXRpb25P
YnNlcnZlcnNdIEltcGxlbWVudCBzdWJ0cmVlIG9ic2VydmF0aW9uIG9mIHRyYW5zaWVudGx5IGRp
c2Nvbm5lY3RlZCBub2RlcworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1
Zy5jZ2k/aWQ9NzA3ODgKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKwor
ICAgICAgICBUaGlzIHBhdGNoIGFkZHMgc3VwcG9ydCBmb3Igb2JzZXJ2aW5nICJ0cmFuc2llbnRs
eSBkaXNjb25uZWN0ZWQiIG5vZGVzIGZyb20gc3VidHJlZQorICAgICAgICBvYnNlcnZhdGlvbnMg
Ynkgc3luY2hyb25vdXNseSBhZGRpbmcgdHJhbnNpZW50IGVudHJpZXMgd2hlbiBub2RlcyBhcmUg
cmVtb3ZlZCBmcm9tCisgICAgICAgIHRoZWlyIHBhcmVudC4gV2ViS2l0TXV0YXRpb25PYnNlcnZl
ciBpcyBtYWRlIHJlc3BvbnNpYmxlIGZvciB0aGUgYWNjb3VudGluZyBvZgorICAgICAgICByZWNv
cmRpbmcgYW5kIGNsZWFyaW5nIHRoZXNlIHRyYW5zaWVudCBvYnNlcnZlcnMuCisKKyAgICAgICAg
TmV3IHRlc3RzIGFkZGVkIHRvIGZhc3QvbXV0YXRpb24vb2JzZXJ2ZS1zdWJ0cmVlLmh0bWwuCisK
KyAgICAgICAgKiBkb20vQ2hhcmFjdGVyRGF0YS5jcHA6CisgICAgICAgIChXZWJDb3JlOjpDaGFy
YWN0ZXJEYXRhOjpkaXNwYXRjaE1vZGlmaWVkRXZlbnQpOgorICAgICAgICAqIGRvbS9DaGlsZExp
c3RNdXRhdGlvblNjb3BlLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6Ok11dGF0aW9uQWNjdW11bGF0
aW9uUm91dGVyOjpDaGlsZExpc3RNdXRhdGlvbkFjY3VtdWxhdG9yOjpDaGlsZExpc3RNdXRhdGlv
bkFjY3VtdWxhdG9yKToKKyAgICAgICAgKFdlYkNvcmU6Ok11dGF0aW9uQWNjdW11bGF0aW9uUm91
dGVyOjpDaGlsZExpc3RNdXRhdGlvbkFjY3VtdWxhdG9yOjplbnF1ZXVlTXV0YXRpb25SZWNvcmQp
OgorICAgICAgICAoV2ViQ29yZTo6TXV0YXRpb25BY2N1bXVsYXRpb25Sb3V0ZXI6Ok11dGF0aW9u
QWNjdW11bGF0aW9uUm91dGVyOjppbmNyZW1lbnRTY29waW5nTGV2ZWwpOgorICAgICAgICAqIGRv
bS9Db250YWluZXJOb2RlLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OmRpc3BhdGNoQ2hpbGRSZW1v
dmFsRXZlbnRzKToKKyAgICAgICAgKiBkb20vRWxlbWVudC5jcHA6CisgICAgICAgIChXZWJDb3Jl
OjplbnF1ZXVlQXR0cmlidXRlc011dGF0aW9uUmVjb3JkKToKKyAgICAgICAgKiBkb20vTm9kZS5j
cHA6CisgICAgICAgIChXZWJDb3JlOjphZGRNYXRjaGluZ09ic2VydmVycyk6CisgICAgICAgIChX
ZWJDb3JlOjpOb2RlOjpnZXRSZWdpc3RlcmVkTXV0YXRpb25PYnNlcnZlcnNPZlR5cGUpOgorICAg
ICAgICAoV2ViQ29yZTo6Tm9kZTo6cmVnaXN0ZXJNdXRhdGlvbk9ic2VydmVyKToKKyAgICAgICAg
KFdlYkNvcmU6Ok5vZGU6OnVucmVnaXN0ZXJNdXRhdGlvbk9ic2VydmVyKToKKyAgICAgICAgKFdl
YkNvcmU6Ok5vZGU6Om5vdGlmeVN1YnRyZWVPYnNlcnZlcnNPZkRpc2Nvbm5lY3Rpb24pOgorICAg
ICAgICAqIGRvbS9Ob2RlLmg6CisgICAgICAgICogZG9tL05vZGVSYXJlRGF0YS5oOgorICAgICAg
ICAoV2ViQ29yZTo6TXV0YXRpb25PYnNlcnZlckVudHJ5OjpNdXRhdGlvbk9ic2VydmVyRW50cnkp
OgorICAgICAgICAoV2ViQ29yZTo6TXV0YXRpb25PYnNlcnZlckVudHJ5OjpvcGVyYXRvcj09KToK
KyAgICAgICAgKiBkb20vV2ViS2l0TXV0YXRpb25PYnNlcnZlci5jcHA6CisgICAgICAgIChXZWJD
b3JlOjpXZWJLaXRNdXRhdGlvbk9ic2VydmVyOjpvYnNlcnZlKToKKyAgICAgICAgKFdlYkNvcmU6
OnVucmVnaXN0ZXJUcmFuc2llbnRFbnRyaWVzKToKKyAgICAgICAgKFdlYkNvcmU6OldlYktpdE11
dGF0aW9uT2JzZXJ2ZXI6OmRpc2Nvbm5lY3QpOgorICAgICAgICAoV2ViQ29yZTo6V2ViS2l0TXV0
YXRpb25PYnNlcnZlcjo6b2JzZXJ2ZWROb2RlRGVzdHJ1Y3RlZCk6CisgICAgICAgIChXZWJDb3Jl
OjpXZWJLaXRNdXRhdGlvbk9ic2VydmVyOjpvYnNlcnZlZFN1YnRyZWVXaWxsRGlzY29ubmVjdCk6
CisgICAgICAgIChXZWJDb3JlOjpXZWJLaXRNdXRhdGlvbk9ic2VydmVyOjpjbGVhclRyYW5zaWVu
dEVudHJpZXMpOgorICAgICAgICAoV2ViQ29yZTo6V2ViS2l0TXV0YXRpb25PYnNlcnZlcjo6ZGVs
aXZlcik6CisgICAgICAgICogZG9tL1dlYktpdE11dGF0aW9uT2JzZXJ2ZXIuaDoKKworMjAxMS0x
MC0yNCAgUmFmYWVsIFdlaW5zdGVpbiAgPHJhZmFlbHdAY2hyb21pdW0ub3JnPgorCiAgICAgICAg
IE5vZGU6OnJlZ2lzdGVyZWRNdXRhdGlvbk9ic2VydmVyc09mVHlwZSBzaG91bGQgYmUgcHJlZml4
ZWQgYnkgImdldCIKICAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dp
P2lkPTcwMzU5CiAKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2RvbS9DaGFyYWN0ZXJEYXRh
LmNwcCBiL1NvdXJjZS9XZWJDb3JlL2RvbS9DaGFyYWN0ZXJEYXRhLmNwcAppbmRleCA1ZTg0MWVi
MzhmNzQ4YjY2YzRmNmNjZDI1MDJmYzRkYTU1ZGMxZjk1Li5kM2VhZWNlOGY4MmQ3ZTg2ZmU2OTcw
NDk5NzcwYjg5YTFlNzRhYTY3IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9kb20vQ2hhcmFj
dGVyRGF0YS5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvZG9tL0NoYXJhY3RlckRhdGEuY3BwCkBA
IC0xOTMsMTIgKzE5MywxMiBAQCB2b2lkIENoYXJhY3RlckRhdGE6OnVwZGF0ZVJlbmRlcmVyKHVu
c2lnbmVkIG9mZnNldE9mUmVwbGFjZWREYXRhLCB1bnNpZ25lZCBsZW5ndAogdm9pZCBDaGFyYWN0
ZXJEYXRhOjpkaXNwYXRjaE1vZGlmaWVkRXZlbnQoU3RyaW5nSW1wbCogb2xkRGF0YSkKIHsKICNp
ZiBFTkFCTEUoTVVUQVRJT05fT0JTRVJWRVJTKQotICAgIFZlY3RvcjxXZWJLaXRNdXRhdGlvbk9i
c2VydmVyKj4gb2JzZXJ2ZXJzOworICAgIE11dGF0aW9uT2JzZXJ2ZXJPcHRpb25zTWFwIG9ic2Vy
dmVyczsKICAgICBnZXRSZWdpc3RlcmVkTXV0YXRpb25PYnNlcnZlcnNPZlR5cGUob2JzZXJ2ZXJz
LCBXZWJLaXRNdXRhdGlvbk9ic2VydmVyOjpDaGFyYWN0ZXJEYXRhKTsKICAgICBpZiAoIW9ic2Vy
dmVycy5pc0VtcHR5KCkpIHsKICAgICAgICAgUmVmUHRyPE11dGF0aW9uUmVjb3JkPiBtdXRhdGlv
biA9IE11dGF0aW9uUmVjb3JkOjpjcmVhdGVDaGFyYWN0ZXJEYXRhKHRoaXMpOwotICAgICAgICBm
b3IgKHNpemVfdCBpID0gMDsgaSA8IG9ic2VydmVycy5zaXplKCk7ICsraSkKLSAgICAgICAgICAg
IG9ic2VydmVyc1tpXS0+ZW5xdWV1ZU11dGF0aW9uUmVjb3JkKG11dGF0aW9uKTsKKyAgICAgICAg
Zm9yIChNdXRhdGlvbk9ic2VydmVyT3B0aW9uc01hcDo6aXRlcmF0b3IgaXRlciA9IG9ic2VydmVy
cy5iZWdpbigpOyBpdGVyICE9IG9ic2VydmVycy5lbmQoKTsgKytpdGVyKQorICAgICAgICAgICAg
ICAgIGl0ZXItPmZpcnN0LT5lbnF1ZXVlTXV0YXRpb25SZWNvcmQobXV0YXRpb24pOwogICAgIH0K
ICNlbmRpZgogICAgIGlmIChwYXJlbnROb2RlKCkpCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29y
ZS9kb20vQ2hpbGRMaXN0TXV0YXRpb25TY29wZS5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9kb20vQ2hp
bGRMaXN0TXV0YXRpb25TY29wZS5jcHAKaW5kZXggNGU1ZjBhOTBkNzY1OTI3ZTc2NDdhNDA5MTZl
ODNmZDI0M2I0ZWZjMy4uZjMwMzFmMDM3YmMxNjRiMzA2NTRiNTc2OWIzMTVhNDQzYWM3ZDFkOCAx
MDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvZG9tL0NoaWxkTGlzdE11dGF0aW9uU2NvcGUuY3Bw
CisrKyBiL1NvdXJjZS9XZWJDb3JlL2RvbS9DaGlsZExpc3RNdXRhdGlvblNjb3BlLmNwcApAQCAt
NTMsNyArNTMsNyBAQCBuYW1lc3BhY2UgewogY2xhc3MgQ2hpbGRMaXN0TXV0YXRpb25BY2N1bXVs
YXRvciA6IHB1YmxpYyBSZWZDb3VudGVkPENoaWxkTGlzdE11dGF0aW9uQWNjdW11bGF0b3I+IHsK
ICAgICBXVEZfTUFLRV9OT05DT1BZQUJMRShDaGlsZExpc3RNdXRhdGlvbkFjY3VtdWxhdG9yKTsK
IHB1YmxpYzoKLSAgICBDaGlsZExpc3RNdXRhdGlvbkFjY3VtdWxhdG9yKFBhc3NSZWZQdHI8Tm9k
ZT4sIFZlY3RvcjxXZWJLaXRNdXRhdGlvbk9ic2VydmVyKj4mKTsKKyAgICBDaGlsZExpc3RNdXRh
dGlvbkFjY3VtdWxhdG9yKFBhc3NSZWZQdHI8Tm9kZT4sIE11dGF0aW9uT2JzZXJ2ZXJPcHRpb25z
TWFwJik7CiAgICAgfkNoaWxkTGlzdE11dGF0aW9uQWNjdW11bGF0b3IoKTsKIAogICAgIHZvaWQg
Y2hpbGRBZGRlZChQYXNzUmVmUHRyPE5vZGU+KTsKQEAgLTczLDcgKzczLDcgQEAgcHJpdmF0ZToK
ICAgICBSZWZQdHI8Tm9kZT4gbV9uZXh0U2libGluZzsKICAgICBSZWZQdHI8Tm9kZT4gbV9sYXN0
QWRkZWQ7CiAKLSAgICBWZWN0b3I8V2ViS2l0TXV0YXRpb25PYnNlcnZlcio+IG1fb2JzZXJ2ZXJz
OworICAgIE11dGF0aW9uT2JzZXJ2ZXJPcHRpb25zTWFwIG1fb2JzZXJ2ZXJzOwogfTsKIAogY2xh
c3MgTXV0YXRpb25BY2N1bXVsYXRpb25Sb3V0ZXIgewpAQCAtMTAwLDcgKzEwMCw3IEBAIHByaXZh
dGU6CiAgICAgc3RhdGljIE11dGF0aW9uQWNjdW11bGF0aW9uUm91dGVyKiBzX2luc3RhbmNlOwog
fTsKIAotQ2hpbGRMaXN0TXV0YXRpb25BY2N1bXVsYXRvcjo6Q2hpbGRMaXN0TXV0YXRpb25BY2N1
bXVsYXRvcihQYXNzUmVmUHRyPE5vZGU+IHRhcmdldCwgVmVjdG9yPFdlYktpdE11dGF0aW9uT2Jz
ZXJ2ZXIqPiYgb2JzZXJ2ZXJzKQorQ2hpbGRMaXN0TXV0YXRpb25BY2N1bXVsYXRvcjo6Q2hpbGRM
aXN0TXV0YXRpb25BY2N1bXVsYXRvcihQYXNzUmVmUHRyPE5vZGU+IHRhcmdldCwgTXV0YXRpb25P
YnNlcnZlck9wdGlvbnNNYXAmIG9ic2VydmVycykKICAgICA6IG1fdGFyZ2V0KHRhcmdldCkKIHsK
ICAgICBtX29ic2VydmVycy5zd2FwKG9ic2VydmVycyk7CkBAIC0xNjksOCArMTY5LDggQEAgdm9p
ZCBDaGlsZExpc3RNdXRhdGlvbkFjY3VtdWxhdG9yOjplbnF1ZXVlTXV0YXRpb25SZWNvcmQoKQog
ICAgIFJlZlB0cjxNdXRhdGlvblJlY29yZD4gbXV0YXRpb24gPSBNdXRhdGlvblJlY29yZDo6Y3Jl
YXRlQ2hpbGRMaXN0KAogICAgICAgICBtX3RhcmdldCwgU3RhdGljTm9kZUxpc3Q6OmFkb3B0KG1f
YWRkZWROb2RlcyksIFN0YXRpY05vZGVMaXN0OjphZG9wdChtX3JlbW92ZWROb2RlcyksIG1fcHJl
dmlvdXNTaWJsaW5nLCBtX25leHRTaWJsaW5nKTsKIAotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBp
IDwgbV9vYnNlcnZlcnMuc2l6ZSgpOyArK2kpCi0gICAgICAgIG1fb2JzZXJ2ZXJzW2ldLT5lbnF1
ZXVlTXV0YXRpb25SZWNvcmQobXV0YXRpb24pOworICAgIGZvciAoTXV0YXRpb25PYnNlcnZlck9w
dGlvbnNNYXA6Oml0ZXJhdG9yIGl0ZXIgPSBtX29ic2VydmVycy5iZWdpbigpOyBpdGVyICE9IG1f
b2JzZXJ2ZXJzLmVuZCgpOyArK2l0ZXIpCisgICAgICAgIGl0ZXItPmZpcnN0LT5lbnF1ZXVlTXV0
YXRpb25SZWNvcmQobXV0YXRpb24pOwogCiAgICAgY2xlYXIoKTsKIH0KQEAgLTI0NCw3ICsyNDQs
NyBAQCB2b2lkIE11dGF0aW9uQWNjdW11bGF0aW9uUm91dGVyOjppbmNyZW1lbnRTY29waW5nTGV2
ZWwoTm9kZSogdGFyZ2V0KQogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgVmVjdG9yPFdl
YktpdE11dGF0aW9uT2JzZXJ2ZXIqPiBvYnNlcnZlcnM7CisgICAgTXV0YXRpb25PYnNlcnZlck9w
dGlvbnNNYXAgb2JzZXJ2ZXJzOwogICAgIHRhcmdldC0+Z2V0UmVnaXN0ZXJlZE11dGF0aW9uT2Jz
ZXJ2ZXJzT2ZUeXBlKG9ic2VydmVycywgV2ViS2l0TXV0YXRpb25PYnNlcnZlcjo6Q2hpbGRMaXN0
KTsKICAgICBpZiAob2JzZXJ2ZXJzLmlzRW1wdHkoKSkKICAgICAgICAgbV9hY2N1bXVsYXRpb25z
LnNldCh0YXJnZXQsIDApOwpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvZG9tL0NvbnRhaW5l
ck5vZGUuY3BwIGIvU291cmNlL1dlYkNvcmUvZG9tL0NvbnRhaW5lck5vZGUuY3BwCmluZGV4IDc0
Yzc5ZDZmNzMxMWI1MDQxZGJmOTU3ZDQzZGUzYzY5ODY0MDZjZTUuLjc2YTcwMmU5YWNkMDE1NWZh
NWIyOTFmMDAyMzNjOTU4N2JkOWZkZTMgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL2RvbS9D
b250YWluZXJOb2RlLmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9kb20vQ29udGFpbmVyTm9kZS5j
cHAKQEAgLTExNDQsNiArMTE0NCw3IEBAIHN0YXRpYyB2b2lkIGRpc3BhdGNoQ2hpbGRSZW1vdmFs
RXZlbnRzKE5vZGUqIGNoaWxkKQogICAgIGlmIChjLT5wYXJlbnROb2RlKCkpIHsKICAgICAgICAg
Q2hpbGRMaXN0TXV0YXRpb25TY29wZSBtdXRhdGlvbihjLT5wYXJlbnROb2RlKCkpOwogICAgICAg
ICBtdXRhdGlvbi53aWxsUmVtb3ZlQ2hpbGQoYyk7CisgICAgICAgIGMtPm5vdGlmeVN1YnRyZWVP
YnNlcnZlcnNPZkRpc2Nvbm5lY3Rpb24oKTsKICAgICB9CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEv
U291cmNlL1dlYkNvcmUvZG9tL0VsZW1lbnQuY3BwIGIvU291cmNlL1dlYkNvcmUvZG9tL0VsZW1l
bnQuY3BwCmluZGV4IDNlYTc0YmVlYmYxZTlmYjA0OGYxMDQ5NDM5YzFhOWE2ZmYxMGY5YWUuLjll
ZDI4MzU2YTFiYjM2M2VjMjk2NTI3NTk4ZDI5M2Y1ODEzMzI1ZjcgMTAwNjQ0Ci0tLSBhL1NvdXJj
ZS9XZWJDb3JlL2RvbS9FbGVtZW50LmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9kb20vRWxlbWVu
dC5jcHAKQEAgLTYxOSwxNCArNjE5LDE0IEBAIGNvbnN0IEF0b21pY1N0cmluZyYgRWxlbWVudDo6
Z2V0QXR0cmlidXRlTlMoY29uc3QgU3RyaW5nJiBuYW1lc3BhY2VVUkksIGNvbnN0IFN0CiAjaWYg
RU5BQkxFKE1VVEFUSU9OX09CU0VSVkVSUykKIHN0YXRpYyB2b2lkIGVucXVldWVBdHRyaWJ1dGVz
TXV0YXRpb25SZWNvcmQoRWxlbWVudCogZWxlbWVudCwgY29uc3QgUXVhbGlmaWVkTmFtZSYgbmFt
ZSkKIHsKLSAgICBWZWN0b3I8V2ViS2l0TXV0YXRpb25PYnNlcnZlcio+IG9ic2VydmVyczsKKyAg
ICBNdXRhdGlvbk9ic2VydmVyT3B0aW9uc01hcCBvYnNlcnZlcnM7CiAgICAgZWxlbWVudC0+Z2V0
UmVnaXN0ZXJlZE11dGF0aW9uT2JzZXJ2ZXJzT2ZUeXBlKG9ic2VydmVycywgV2ViS2l0TXV0YXRp
b25PYnNlcnZlcjo6QXR0cmlidXRlcyk7CiAgICAgaWYgKG9ic2VydmVycy5pc0VtcHR5KCkpCiAg
ICAgICAgIHJldHVybjsKIAogICAgIFJlZlB0cjxNdXRhdGlvblJlY29yZD4gbXV0YXRpb24gPSBN
dXRhdGlvblJlY29yZDo6Y3JlYXRlQXR0cmlidXRlcyhlbGVtZW50LCBuYW1lKTsKLSAgICBmb3Ig
KHNpemVfdCBpID0gMDsgaSA8IG9ic2VydmVycy5zaXplKCk7ICsraSkKLSAgICAgICAgb2JzZXJ2
ZXJzW2ldLT5lbnF1ZXVlTXV0YXRpb25SZWNvcmQobXV0YXRpb24pOworICAgIGZvciAoTXV0YXRp
b25PYnNlcnZlck9wdGlvbnNNYXA6Oml0ZXJhdG9yIGl0ZXIgPSBvYnNlcnZlcnMuYmVnaW4oKTsg
aXRlciAhPSBvYnNlcnZlcnMuZW5kKCk7ICsraXRlcikKKyAgICAgICAgaXRlci0+Zmlyc3QtPmVu
cXVldWVNdXRhdGlvblJlY29yZChtdXRhdGlvbik7CiB9CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEv
U291cmNlL1dlYkNvcmUvZG9tL05vZGUuY3BwIGIvU291cmNlL1dlYkNvcmUvZG9tL05vZGUuY3Bw
CmluZGV4IDhmOTM2NGU1Y2I2YTYyNzkzOWMxNThhMzE3NTYxZDA4MzkzYTRhZDYuLjJkNWVhZWRj
ZTliY2ZmYmY2MWY4MmJmZDMzZTMzYzQ2OGMzZjhiYjYgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJD
b3JlL2RvbS9Ob2RlLmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9kb20vTm9kZS5jcHAKQEAgLTI2
OTgsNyArMjY5OCw3IEBAIFZlY3RvcjxNdXRhdGlvbk9ic2VydmVyRW50cnk+KiBOb2RlOjptdXRh
dGlvbk9ic2VydmVyRW50cmllcygpCiAgICAgcmV0dXJuIGhhc1JhcmVEYXRhKCkgPyByYXJlRGF0
YSgpLT5tdXRhdGlvbk9ic2VydmVyRW50cmllcygpIDogMDsKIH0KIAotc3RhdGljIHZvaWQgYWRk
TWF0Y2hpbmdPYnNlcnZlcnMoSGFzaFNldDxXZWJLaXRNdXRhdGlvbk9ic2VydmVyKj4mIG9ic2Vy
dmVyU2V0LCBWZWN0b3I8TXV0YXRpb25PYnNlcnZlckVudHJ5Piogb2JzZXJ2ZXJFbnRyaWVzLCBN
dXRhdGlvbk9ic2VydmVyT3B0aW9ucyBvcHRpb25zKQorc3RhdGljIHZvaWQgYWRkTWF0Y2hpbmdP
YnNlcnZlcnMoTXV0YXRpb25PYnNlcnZlck9wdGlvbnNNYXAmIG9ic2VydmVycywgVmVjdG9yPE11
dGF0aW9uT2JzZXJ2ZXJFbnRyeT4qIG9ic2VydmVyRW50cmllcywgTXV0YXRpb25PYnNlcnZlck9w
dGlvbnMgb3B0aW9ucykKIHsKICAgICBpZiAoIW9ic2VydmVyRW50cmllcykKICAgICAgICAgcmV0
dXJuOwpAQCAtMjcwNiwyNyArMjcwNiwyNiBAQCBzdGF0aWMgdm9pZCBhZGRNYXRjaGluZ09ic2Vy
dmVycyhIYXNoU2V0PFdlYktpdE11dGF0aW9uT2JzZXJ2ZXIqPiYgb2JzZXJ2ZXJTZXQsCiAgICAg
Y29uc3Qgc2l6ZV90IHNpemUgPSBvYnNlcnZlckVudHJpZXMtPnNpemUoKTsKICAgICBmb3IgKHNp
emVfdCBpID0gMDsgaSA8IHNpemU7ICsraSkgewogICAgICAgICBNdXRhdGlvbk9ic2VydmVyRW50
cnkmIGVudHJ5ID0gb2JzZXJ2ZXJFbnRyaWVzLT5hdChpKTsKLSAgICAgICAgaWYgKGVudHJ5Lmhh
c0FsbE9wdGlvbnMob3B0aW9ucykpCi0gICAgICAgICAgICBvYnNlcnZlclNldC5hZGQoZW50cnku
b2JzZXJ2ZXIuZ2V0KCkpOworCisgICAgICAgIGlmIChlbnRyeS5oYXNBbGxPcHRpb25zKG9wdGlv
bnMpKSB7CisgICAgICAgICAgICBwYWlyPE11dGF0aW9uT2JzZXJ2ZXJPcHRpb25zTWFwOjppdGVy
YXRvciwgYm9vbD4gcmVzdWx0ID0gb2JzZXJ2ZXJzLmFkZChlbnRyeS5vYnNlcnZlci5nZXQoKSwg
ZW50cnkub3B0aW9ucyk7CisgICAgICAgICAgICBpZiAoIXJlc3VsdC5zZWNvbmQpCisgICAgICAg
ICAgICAgICAgcmVzdWx0LmZpcnN0LT5zZWNvbmQgfD0gZW50cnkub3B0aW9uczsKKyAgICAgICAg
fQogICAgIH0KIH0KIAotdm9pZCBOb2RlOjpnZXRSZWdpc3RlcmVkTXV0YXRpb25PYnNlcnZlcnNP
ZlR5cGUoVmVjdG9yPFdlYktpdE11dGF0aW9uT2JzZXJ2ZXIqPiYgb2JzZXJ2ZXJzLCBXZWJLaXRN
dXRhdGlvbk9ic2VydmVyOjpNdXRhdGlvblR5cGUgdHlwZSkKK3ZvaWQgTm9kZTo6Z2V0UmVnaXN0
ZXJlZE11dGF0aW9uT2JzZXJ2ZXJzT2ZUeXBlKE11dGF0aW9uT2JzZXJ2ZXJPcHRpb25zTWFwJiBv
YnNlcnZlcnMsIFdlYktpdE11dGF0aW9uT2JzZXJ2ZXI6Ok11dGF0aW9uVHlwZSB0eXBlKQogewot
ICAgIEhhc2hTZXQ8V2ViS2l0TXV0YXRpb25PYnNlcnZlcio+IG9ic2VydmVyU2V0OwotICAgIGFk
ZE1hdGNoaW5nT2JzZXJ2ZXJzKG9ic2VydmVyU2V0LCBtdXRhdGlvbk9ic2VydmVyRW50cmllcygp
LCB0eXBlKTsKKyAgICBhZGRNYXRjaGluZ09ic2VydmVycyhvYnNlcnZlcnMsIG11dGF0aW9uT2Jz
ZXJ2ZXJFbnRyaWVzKCksIHR5cGUpOwogICAgIGZvciAoTm9kZSogbm9kZSA9IHBhcmVudE5vZGUo
KTsgbm9kZTsgbm9kZSA9IG5vZGUtPnBhcmVudE5vZGUoKSkKLSAgICAgICAgYWRkTWF0Y2hpbmdP
YnNlcnZlcnMob2JzZXJ2ZXJTZXQsIG5vZGUtPm11dGF0aW9uT2JzZXJ2ZXJFbnRyaWVzKCksIHR5
cGUgfCBXZWJLaXRNdXRhdGlvbk9ic2VydmVyOjpTdWJ0cmVlKTsKLQotICAgIC8vIEZJWE1FOiB0
aGlzIG1ldGhvZCBzaG91bGQgb3V0cHV0IGEgSGFzaFNldCBpbnN0ZWFkIG9mIGEgVmVjdG9yLgot
ICAgIGlmICghb2JzZXJ2ZXJTZXQuaXNFbXB0eSgpKQotICAgICAgICBjb3B5VG9WZWN0b3Iob2Jz
ZXJ2ZXJTZXQsIG9ic2VydmVycyk7CisgICAgICAgIGFkZE1hdGNoaW5nT2JzZXJ2ZXJzKG9ic2Vy
dmVycywgbm9kZS0+bXV0YXRpb25PYnNlcnZlckVudHJpZXMoKSwgdHlwZSB8IFdlYktpdE11dGF0
aW9uT2JzZXJ2ZXI6OlN1YnRyZWUpOwogfQogCi1Ob2RlOjpNdXRhdGlvblJlZ2lzdHJhdGlvblJl
c3VsdCBOb2RlOjpyZWdpc3Rlck11dGF0aW9uT2JzZXJ2ZXIoUGFzc1JlZlB0cjxXZWJLaXRNdXRh
dGlvbk9ic2VydmVyPiBvYnNlcnZlciwgTXV0YXRpb25PYnNlcnZlck9wdGlvbnMgb3B0aW9ucykK
K05vZGU6Ok11dGF0aW9uUmVnaXN0cmF0aW9uUmVzdWx0IE5vZGU6OnJlZ2lzdGVyTXV0YXRpb25P
YnNlcnZlcihQYXNzUmVmUHRyPFdlYktpdE11dGF0aW9uT2JzZXJ2ZXI+IG9ic2VydmVyLCBNdXRh
dGlvbk9ic2VydmVyT3B0aW9ucyBvcHRpb25zLCBQYXNzUmVmUHRyPE5vZGU+IHRyYW5zaWVudE9m
Tm9kZSkKIHsKICAgICBWZWN0b3I8TXV0YXRpb25PYnNlcnZlckVudHJ5Piogb2JzZXJ2ZXJFbnRy
aWVzID0gZW5zdXJlUmFyZURhdGEoKS0+ZW5zdXJlTXV0YXRpb25PYnNlcnZlckVudHJpZXMoKTsK
LSAgICBNdXRhdGlvbk9ic2VydmVyRW50cnkgZW50cnkob2JzZXJ2ZXIsIG9wdGlvbnMpOworICAg
IE11dGF0aW9uT2JzZXJ2ZXJFbnRyeSBlbnRyeShvYnNlcnZlciwgb3B0aW9ucywgdHJhbnNpZW50
T2ZOb2RlKTsKIAogICAgIHNpemVfdCBpbmRleCA9IG9ic2VydmVyRW50cmllcy0+ZmluZChlbnRy
eSk7CiAgICAgaWYgKGluZGV4ID09IG5vdEZvdW5kKSB7CkBAIC0yNzM4LDE0ICsyNzM3LDE0IEBA
IE5vZGU6Ok11dGF0aW9uUmVnaXN0cmF0aW9uUmVzdWx0IE5vZGU6OnJlZ2lzdGVyTXV0YXRpb25P
YnNlcnZlcihQYXNzUmVmUHRyPFdlYktpCiAgICAgcmV0dXJuIE11dGF0aW9uUmVnaXN0cmF0aW9u
T3B0aW9uc1Jlc2V0OwogfQogCi12b2lkIE5vZGU6OnVucmVnaXN0ZXJNdXRhdGlvbk9ic2VydmVy
KFBhc3NSZWZQdHI8V2ViS2l0TXV0YXRpb25PYnNlcnZlcj4gb2JzZXJ2ZXIpCit2b2lkIE5vZGU6
OnVucmVnaXN0ZXJNdXRhdGlvbk9ic2VydmVyKFBhc3NSZWZQdHI8V2ViS2l0TXV0YXRpb25PYnNl
cnZlcj4gb2JzZXJ2ZXIsIFBhc3NSZWZQdHI8Tm9kZT4gdHJhbnNpZW50T2ZOb2RlKQogewogICAg
IFZlY3RvcjxNdXRhdGlvbk9ic2VydmVyRW50cnk+KiBvYnNlcnZlckVudHJpZXMgPSBtdXRhdGlv
bk9ic2VydmVyRW50cmllcygpOwogICAgIEFTU0VSVChvYnNlcnZlckVudHJpZXMpOwogICAgIGlm
ICghb2JzZXJ2ZXJFbnRyaWVzKQogICAgICAgICByZXR1cm47CiAKLSAgICBNdXRhdGlvbk9ic2Vy
dmVyRW50cnkgZW50cnkob2JzZXJ2ZXIsIDApOworICAgIE11dGF0aW9uT2JzZXJ2ZXJFbnRyeSBl
bnRyeShvYnNlcnZlciwgMCwgdHJhbnNpZW50T2ZOb2RlKTsKICAgICBzaXplX3QgaW5kZXggPSBv
YnNlcnZlckVudHJpZXMtPmZpbmQoZW50cnkpOwogICAgIEFTU0VSVChpbmRleCAhPSBub3RGb3Vu
ZCk7CiAgICAgaWYgKGluZGV4ID09IG5vdEZvdW5kKQpAQCAtMjc1Myw2ICsyNzUyLDI2IEBAIHZv
aWQgTm9kZTo6dW5yZWdpc3Rlck11dGF0aW9uT2JzZXJ2ZXIoUGFzc1JlZlB0cjxXZWJLaXRNdXRh
dGlvbk9ic2VydmVyPiBvYnNlcnZlCiAKICAgICBvYnNlcnZlckVudHJpZXMtPnJlbW92ZShpbmRl
eCk7CiB9CisKK3ZvaWQgTm9kZTo6bm90aWZ5U3VidHJlZU9ic2VydmVyc09mRGlzY29ubmVjdGlv
bigpCit7CisgICAgZm9yIChOb2RlKiBub2RlID0gcGFyZW50Tm9kZSgpOyBub2RlOyBub2RlID0g
bm9kZS0+cGFyZW50Tm9kZSgpKSB7CisgICAgICAgIFZlY3RvcjxNdXRhdGlvbk9ic2VydmVyRW50
cnk+KiBvYnNlcnZlckVudHJpZXMgPSBub2RlLT5tdXRhdGlvbk9ic2VydmVyRW50cmllcygpOwor
ICAgICAgICBpZiAoIW9ic2VydmVyRW50cmllcykKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisg
ICAgICAgIGNvbnN0IHNpemVfdCBzaXplID0gb2JzZXJ2ZXJFbnRyaWVzLT5zaXplKCk7CisgICAg
ICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7CisgICAgICAgICAgICBNdXRh
dGlvbk9ic2VydmVyRW50cnkmIGVudHJ5ID0gb2JzZXJ2ZXJFbnRyaWVzLT5hdChpKTsKKyAgICAg
ICAgICAgIGlmIChlbnRyeS5oYXNBbGxPcHRpb25zKFdlYktpdE11dGF0aW9uT2JzZXJ2ZXI6OlN1
YnRyZWUpKSB7CisgICAgICAgICAgICAgICAgUmVmUHRyPE5vZGU+IG9ic2VydmVkTm9kZSA9IGVu
dHJ5LnRyYW5zaWVudE9mTm9kZTsKKyAgICAgICAgICAgICAgICBpZiAoIW9ic2VydmVkTm9kZSkK
KyAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZWROb2RlID0gbm9kZTsKKyAgICAgICAgICAgICAg
ICBlbnRyeS5vYnNlcnZlci0+b2JzZXJ2ZWRTdWJ0cmVlV2lsbERpc2Nvbm5lY3Qob2JzZXJ2ZWRO
b2RlLCBlbnRyeS5vcHRpb25zLCB0aGlzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAg
IH0KK30KICNlbmRpZiAvLyBFTkFCTEUoTVVUQVRJT05fT0JTRVJWRVJTKQogCiAKZGlmZiAtLWdp
dCBhL1NvdXJjZS9XZWJDb3JlL2RvbS9Ob2RlLmggYi9Tb3VyY2UvV2ViQ29yZS9kb20vTm9kZS5o
CmluZGV4IGNmNTc2NTEwZmVhNjUxOTA3OWFjMTA2MjQ5YjlhM2ViYzM4M2EzMmQuLjhjYmMxZGI1
ZmU0OWU1NjRkZjQxMjQyNzQzMjY0OGI0MDRiNjI3Y2QgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJD
b3JlL2RvbS9Ob2RlLmgKKysrIGIvU291cmNlL1dlYkNvcmUvZG9tL05vZGUuaApAQCAtNTg5LDE1
ICs1ODksMTcgQEAgcHVibGljOgogI2VuZGlmCiAKICNpZiBFTkFCTEUoTVVUQVRJT05fT0JTRVJW
RVJTKQotICAgIHZvaWQgZ2V0UmVnaXN0ZXJlZE11dGF0aW9uT2JzZXJ2ZXJzT2ZUeXBlKFZlY3Rv
cjxXZWJLaXRNdXRhdGlvbk9ic2VydmVyKj4mLCBXZWJLaXRNdXRhdGlvbk9ic2VydmVyOjpNdXRh
dGlvblR5cGUpOworICAgIHZvaWQgZ2V0UmVnaXN0ZXJlZE11dGF0aW9uT2JzZXJ2ZXJzT2ZUeXBl
KE11dGF0aW9uT2JzZXJ2ZXJPcHRpb25zTWFwJiwgV2ViS2l0TXV0YXRpb25PYnNlcnZlcjo6TXV0
YXRpb25UeXBlKTsKIAogICAgIGVudW0gTXV0YXRpb25SZWdpc3RyYXRpb25SZXN1bHQgewogICAg
ICAgICBNdXRhdGlvbk9ic2VydmVyUmVnaXN0ZXJlZCwKICAgICAgICAgTXV0YXRpb25SZWdpc3Ry
YXRpb25PcHRpb25zUmVzZXQKICAgICB9OwotICAgIE11dGF0aW9uUmVnaXN0cmF0aW9uUmVzdWx0
IHJlZ2lzdGVyTXV0YXRpb25PYnNlcnZlcihQYXNzUmVmUHRyPFdlYktpdE11dGF0aW9uT2JzZXJ2
ZXI+LCBNdXRhdGlvbk9ic2VydmVyT3B0aW9ucyk7CisgICAgTXV0YXRpb25SZWdpc3RyYXRpb25S
ZXN1bHQgcmVnaXN0ZXJNdXRhdGlvbk9ic2VydmVyKFBhc3NSZWZQdHI8V2ViS2l0TXV0YXRpb25P
YnNlcnZlcj4sIE11dGF0aW9uT2JzZXJ2ZXJPcHRpb25zLCBQYXNzUmVmUHRyPE5vZGU+IHRyYW5z
aWVudE9mTm9kZSA9IDApOwogCi0gICAgdm9pZCB1bnJlZ2lzdGVyTXV0YXRpb25PYnNlcnZlcihQ
YXNzUmVmUHRyPFdlYktpdE11dGF0aW9uT2JzZXJ2ZXI+KTsKKyAgICB2b2lkIHVucmVnaXN0ZXJN
dXRhdGlvbk9ic2VydmVyKFBhc3NSZWZQdHI8V2ViS2l0TXV0YXRpb25PYnNlcnZlcj4sIFBhc3NS
ZWZQdHI8Tm9kZT4gdHJhbnNpZW50T2ZOb2RlID0gMCk7CisKKyAgICB2b2lkIG5vdGlmeVN1YnRy
ZWVPYnNlcnZlcnNPZkRpc2Nvbm5lY3Rpb24oKTsKICNlbmRpZiAvLyBFTkFCTEUoTVVUQVRJT05f
T0JTRVJWRVJTKQogCiBwcml2YXRlOgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvZG9tL05v
ZGVSYXJlRGF0YS5oIGIvU291cmNlL1dlYkNvcmUvZG9tL05vZGVSYXJlRGF0YS5oCmluZGV4IDUw
MmI2NThmYzA0YmVhNjg3OTE3MTc1NTA1ZThjOGExNzAyNzQ5OGIuLmQxMjc4ZjMyYmI3MWY1OGY4
NzRhZDI3YmE3ZjdmNjlmNzM3NjlkYjggMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL2RvbS9O
b2RlUmFyZURhdGEuaAorKysgYi9Tb3VyY2UvV2ViQ29yZS9kb20vTm9kZVJhcmVEYXRhLmgKQEAg
LTkwLDE1ICs5MCwxNiBAQCBwcml2YXRlOgogCiAjaWYgRU5BQkxFKE1VVEFUSU9OX09CU0VSVkVS
UykKIHN0cnVjdCBNdXRhdGlvbk9ic2VydmVyRW50cnkgewotICAgIE11dGF0aW9uT2JzZXJ2ZXJF
bnRyeShQYXNzUmVmUHRyPFdlYktpdE11dGF0aW9uT2JzZXJ2ZXI+IG9ic2VydmVyLCBNdXRhdGlv
bk9ic2VydmVyT3B0aW9ucyBvcHRpb25zKQorICAgIE11dGF0aW9uT2JzZXJ2ZXJFbnRyeShQYXNz
UmVmUHRyPFdlYktpdE11dGF0aW9uT2JzZXJ2ZXI+IG9ic2VydmVyLCBNdXRhdGlvbk9ic2VydmVy
T3B0aW9ucyBvcHRpb25zLCBQYXNzUmVmUHRyPE5vZGU+IG5vZGUpCiAgICAgICAgIDogb2JzZXJ2
ZXIob2JzZXJ2ZXIpCiAgICAgICAgICwgb3B0aW9ucyhvcHRpb25zKQorICAgICAgICAsIHRyYW5z
aWVudE9mTm9kZShub2RlKQogICAgIHsKICAgICB9CiAKICAgICBib29sIG9wZXJhdG9yPT0oY29u
c3QgTXV0YXRpb25PYnNlcnZlckVudHJ5JiBvdGhlcikgY29uc3QKICAgICB7Ci0gICAgICAgIHJl
dHVybiBvYnNlcnZlciA9PSBvdGhlci5vYnNlcnZlcjsKKyAgICAgICAgcmV0dXJuIG9ic2VydmVy
ID09IG90aGVyLm9ic2VydmVyICYmIHRyYW5zaWVudE9mTm9kZSA9PSBvdGhlci50cmFuc2llbnRP
Zk5vZGU7CiAgICAgfQogCiAgICAgYm9vbCBoYXNBbGxPcHRpb25zKE11dGF0aW9uT2JzZXJ2ZXJP
cHRpb25zIG9wdGlvbnMpIGNvbnN0CkBAIC0xMDgsNiArMTA5LDcgQEAgc3RydWN0IE11dGF0aW9u
T2JzZXJ2ZXJFbnRyeSB7CiAKICAgICBSZWZQdHI8V2ViS2l0TXV0YXRpb25PYnNlcnZlcj4gb2Jz
ZXJ2ZXI7CiAgICAgTXV0YXRpb25PYnNlcnZlck9wdGlvbnMgb3B0aW9uczsKKyAgICBSZWZQdHI8
Tm9kZT4gdHJhbnNpZW50T2ZOb2RlOwogfTsKICNlbmRpZiAvLyBFTkFCTEUoTVVUQVRJT05fT0JT
RVJWRVJTKQogCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9kb20vV2ViS2l0TXV0YXRpb25P
YnNlcnZlci5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9kb20vV2ViS2l0TXV0YXRpb25PYnNlcnZlci5j
cHAKaW5kZXggODNmMTU5OTBlYTJiZWNhMzM5YmIwYTczY2MyOTY5YmE0ZGYyOWZhNS4uOTdiZDk2
MmQyNWI5NTZmMTk5MDE2NThmOTU0OTg3ZGNjMzI0MzlhNCAxMDA2NDQKLS0tIGEvU291cmNlL1dl
YkNvcmUvZG9tL1dlYktpdE11dGF0aW9uT2JzZXJ2ZXIuY3BwCisrKyBiL1NvdXJjZS9XZWJDb3Jl
L2RvbS9XZWJLaXRNdXRhdGlvbk9ic2VydmVyLmNwcApAQCAtNTksOCArNTksMjMgQEAgdm9pZCBX
ZWJLaXRNdXRhdGlvbk9ic2VydmVyOjpvYnNlcnZlKE5vZGUqIG5vZGUsIE11dGF0aW9uT2JzZXJ2
ZXJPcHRpb25zIG9wdGlvbnMKIHsKICAgICAvLyBGSVhNRTogTW9yZSBvcHRpb25zIGNvbXBvc2l0
aW9uIHdvcmsgbmVlZHMgdG8gYmUgZG9uZSBoZXJlLCBlLmcuLCB2YWxpZGF0aW9uLgogCi0gICAg
aWYgKG5vZGUtPnJlZ2lzdGVyTXV0YXRpb25PYnNlcnZlcih0aGlzLCBvcHRpb25zKSA9PSBOb2Rl
OjpNdXRhdGlvbk9ic2VydmVyUmVnaXN0ZXJlZCkKKyAgICBpZiAobm9kZS0+cmVnaXN0ZXJNdXRh
dGlvbk9ic2VydmVyKHRoaXMsIG9wdGlvbnMpID09IE5vZGU6Ok11dGF0aW9uT2JzZXJ2ZXJSZWdp
c3RlcmVkKSB7CiAgICAgICAgIG1fb2JzZXJ2ZWROb2Rlcy5hcHBlbmQobm9kZSk7CisgICAgICAg
IHJldHVybjsKKyAgICB9CisKKyAgICBIYXNoTWFwPE5vZGUqLCBOb2RlSGFzaFNldD46Oml0ZXJh
dG9yIG1hcEl0ZXIgPSBtX3RyYW5zaWVudE9ic2VydmVkTm9kZXMuZmluZChub2RlKTsKKyAgICBp
ZiAobWFwSXRlciA9PSBtX3RyYW5zaWVudE9ic2VydmVkTm9kZXMuZW5kKCkpCisgICAgICAgIHJl
dHVybjsKKworICAgIGZvciAoTm9kZUhhc2hTZXQ6Oml0ZXJhdG9yIHNldEl0ZXIgPSBtYXBJdGVy
LT5zZWNvbmQuYmVnaW4oKTsgc2V0SXRlciAhPSBtYXBJdGVyLT5zZWNvbmQuZW5kKCk7ICsrc2V0
SXRlcikKKyAgICAgICAgKCpzZXRJdGVyKS0+dW5yZWdpc3Rlck11dGF0aW9uT2JzZXJ2ZXIodGhp
cywgbm9kZSk7Cit9CisKK3N0YXRpYyB2b2lkIHVucmVnaXN0ZXJUcmFuc2llbnRFbnRyaWVzKEhh
c2hTZXQ8UmVmUHRyPE5vZGU+ID4mIHRyYW5zaWVudE5vZGVzLCBXZWJLaXRNdXRhdGlvbk9ic2Vy
dmVyKiBvYnNlcnZlciwgTm9kZSogb2JzZXJ2ZWROb2RlKQoreworICAgIGZvciAoTm9kZUhhc2hT
ZXQ6Oml0ZXJhdG9yIGl0ZXIgPSB0cmFuc2llbnROb2Rlcy5iZWdpbigpOyBpdGVyICE9IHRyYW5z
aWVudE5vZGVzLmVuZCgpOyArK2l0ZXIpCisgICAgICAgICgqaXRlciktPnVucmVnaXN0ZXJNdXRh
dGlvbk9ic2VydmVyKG9ic2VydmVyLCBvYnNlcnZlZE5vZGUpOwogfQogCiB2b2lkIFdlYktpdE11
dGF0aW9uT2JzZXJ2ZXI6OmRpc2Nvbm5lY3QoKQpAQCAtNjksNiArODQsNyBAQCB2b2lkIFdlYktp
dE11dGF0aW9uT2JzZXJ2ZXI6OmRpc2Nvbm5lY3QoKQogICAgICAgICBtX29ic2VydmVkTm9kZXNb
aV0tPnVucmVnaXN0ZXJNdXRhdGlvbk9ic2VydmVyKHRoaXMpOwogCiAgICAgbV9vYnNlcnZlZE5v
ZGVzLmNsZWFyKCk7CisgICAgY2xlYXJUcmFuc2llbnRFbnRyaWVzKCk7CiB9CiAKIHZvaWQgV2Vi
S2l0TXV0YXRpb25PYnNlcnZlcjo6b2JzZXJ2ZWROb2RlRGVzdHJ1Y3RlZChOb2RlKiBub2RlKQpA
QCAtNzksNiArOTUsMTIgQEAgdm9pZCBXZWJLaXRNdXRhdGlvbk9ic2VydmVyOjpvYnNlcnZlZE5v
ZGVEZXN0cnVjdGVkKE5vZGUqIG5vZGUpCiAgICAgICAgIHJldHVybjsKIAogICAgIG1fb2JzZXJ2
ZWROb2Rlcy5yZW1vdmUoaW5kZXgpOworICAgIEhhc2hNYXA8Tm9kZSosIE5vZGVIYXNoU2V0Pjo6
aXRlcmF0b3IgaXRlciA9IG1fdHJhbnNpZW50T2JzZXJ2ZWROb2Rlcy5maW5kKG5vZGUpOworICAg
IGlmIChpdGVyID09IG1fdHJhbnNpZW50T2JzZXJ2ZWROb2Rlcy5lbmQoKSkKKyAgICAgICAgcmV0
dXJuOworCisgICAgdW5yZWdpc3RlclRyYW5zaWVudEVudHJpZXMoaXRlci0+c2Vjb25kLCB0aGlz
LCBub2RlKTsKKyAgICBtX3RyYW5zaWVudE9ic2VydmVkTm9kZXMucmVtb3ZlKG5vZGUpOwogfQog
CiB0eXBlZGVmIExpc3RIYXNoU2V0PFJlZlB0cjxXZWJLaXRNdXRhdGlvbk9ic2VydmVyPiA+IE11
dGF0aW9uT2JzZXJ2ZXJTZXQ7CkBAIC05NSwxMCArMTE3LDM0IEBAIHZvaWQgV2ViS2l0TXV0YXRp
b25PYnNlcnZlcjo6ZW5xdWV1ZU11dGF0aW9uUmVjb3JkKFBhc3NSZWZQdHI8TXV0YXRpb25SZWNv
cmQ+IG11CiAgICAgYWN0aXZlTXV0YXRpb25PYnNlcnZlcnMoKS5hZGQodGhpcyk7CiB9CiAKK3Zv
aWQgV2ViS2l0TXV0YXRpb25PYnNlcnZlcjo6b2JzZXJ2ZWRTdWJ0cmVlV2lsbERpc2Nvbm5lY3Qo
UGFzc1JlZlB0cjxOb2RlPiBwcnBPYnNlcnZlZE5vZGUsIE11dGF0aW9uT2JzZXJ2ZXJPcHRpb25z
IG9wdGlvbnMsIFBhc3NSZWZQdHI8Tm9kZT4gcHJwRGlzY29ubmVjdGluZ05vZGUpCit7CisgICAg
UmVmUHRyPE5vZGU+IG9ic2VydmVkTm9kZSA9IHBycE9ic2VydmVkTm9kZTsKKyAgICBSZWZQdHI8
Tm9kZT4gZGlzY29ubmVjdGluZ05vZGUgPSBwcnBEaXNjb25uZWN0aW5nTm9kZTsKKworICAgIGRp
c2Nvbm5lY3RpbmdOb2RlLT5yZWdpc3Rlck11dGF0aW9uT2JzZXJ2ZXIodGhpcywgb3B0aW9ucywg
b2JzZXJ2ZWROb2RlKTsKKyAgICBIYXNoTWFwPE5vZGUqLCBOb2RlSGFzaFNldD46Oml0ZXJhdG9y
IGl0ZXIgPSBtX3RyYW5zaWVudE9ic2VydmVkTm9kZXMuZmluZChvYnNlcnZlZE5vZGUuZ2V0KCkp
OworICAgIGlmIChpdGVyID09IG1fdHJhbnNpZW50T2JzZXJ2ZWROb2Rlcy5lbmQoKSkgeworICAg
ICAgICBIYXNoU2V0PFJlZlB0cjxOb2RlPiA+IHNldDsKKyAgICAgICAgcGFpcjxIYXNoTWFwPE5v
ZGUqLCBOb2RlSGFzaFNldD46Oml0ZXJhdG9yLCBib29sPiByZXN1bHQgPSBtX3RyYW5zaWVudE9i
c2VydmVkTm9kZXMuc2V0KG9ic2VydmVkTm9kZS5nZXQoKSwgc2V0KTsKKyAgICAgICAgcmVzdWx0
LmZpcnN0LT5zZWNvbmQuYWRkKGRpc2Nvbm5lY3RpbmdOb2RlKTsKKyAgICB9IGVsc2UKKyAgICAg
ICAgaXRlci0+c2Vjb25kLmFkZChkaXNjb25uZWN0aW5nTm9kZSk7Cit9CisKK3ZvaWQgV2ViS2l0
TXV0YXRpb25PYnNlcnZlcjo6Y2xlYXJUcmFuc2llbnRFbnRyaWVzKCkKK3sKKyAgICBmb3IgKEhh
c2hNYXA8Tm9kZSosIE5vZGVIYXNoU2V0Pjo6aXRlcmF0b3IgbWFwSXRlciA9IG1fdHJhbnNpZW50
T2JzZXJ2ZWROb2Rlcy5iZWdpbigpOyBtYXBJdGVyICE9IG1fdHJhbnNpZW50T2JzZXJ2ZWROb2Rl
cy5lbmQoKTsgKyttYXBJdGVyKQorICAgICAgICB1bnJlZ2lzdGVyVHJhbnNpZW50RW50cmllcyht
YXBJdGVyLT5zZWNvbmQsIHRoaXMsIG1hcEl0ZXItPmZpcnN0KTsKKworICAgIG1fdHJhbnNpZW50
T2JzZXJ2ZWROb2Rlcy5jbGVhcigpOworfQorCiB2b2lkIFdlYktpdE11dGF0aW9uT2JzZXJ2ZXI6
OmRlbGl2ZXIoKQogewogICAgIE11dGF0aW9uUmVjb3JkQXJyYXkgcmVjb3JkczsKICAgICByZWNv
cmRzLnN3YXAobV9yZWNvcmRzKTsKKyAgICBjbGVhclRyYW5zaWVudEVudHJpZXMoKTsKICAgICBt
X2NhbGxiYWNrLT5oYW5kbGVFdmVudCgmcmVjb3JkcywgdGhpcyk7CiB9CiAKZGlmZiAtLWdpdCBh
L1NvdXJjZS9XZWJDb3JlL2RvbS9XZWJLaXRNdXRhdGlvbk9ic2VydmVyLmggYi9Tb3VyY2UvV2Vi
Q29yZS9kb20vV2ViS2l0TXV0YXRpb25PYnNlcnZlci5oCmluZGV4IGZjMzI4NjA5OTg0YWExMjFh
M2NiZjg2OTQ0MDQ2MWViMmNhNjU5OGUuLjgxMmFjZGYyY2ZhMDVhNWViMTVkZGVmMjM1NjkxNTQz
MjdhNTBkYWEgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL2RvbS9XZWJLaXRNdXRhdGlvbk9i
c2VydmVyLmgKKysrIGIvU291cmNlL1dlYkNvcmUvZG9tL1dlYktpdE11dGF0aW9uT2JzZXJ2ZXIu
aApAQCAtMzMsNiArMzMsOCBAQAogCiAjaWYgRU5BQkxFKE1VVEFUSU9OX09CU0VSVkVSUykKIAor
I2luY2x1ZGUgPHd0Zi9IYXNoTWFwLmg+CisjaW5jbHVkZSA8d3RmL0hhc2hTZXQuaD4KICNpbmNs
dWRlIDx3dGYvUGFzc093blB0ci5oPgogI2luY2x1ZGUgPHd0Zi9SZWZDb3VudGVkLmg+CiAjaW5j
bHVkZSA8d3RmL1JlZlB0ci5oPgpAQCAtNDUsNiArNDcsNyBAQCBjbGFzcyBNdXRhdGlvblJlY29y
ZDsKIGNsYXNzIE5vZGU7CiAKIHR5cGVkZWYgdW5zaWduZWQgY2hhciBNdXRhdGlvbk9ic2VydmVy
T3B0aW9uczsKK3R5cGVkZWYgSGFzaFNldDxSZWZQdHI8Tm9kZT4gPiBOb2RlSGFzaFNldDsKIAog
Y2xhc3MgV2ViS2l0TXV0YXRpb25PYnNlcnZlciA6IHB1YmxpYyBSZWZDb3VudGVkPFdlYktpdE11
dGF0aW9uT2JzZXJ2ZXI+IHsKIHB1YmxpYzoKQEAgLTY4LDE5ICs3MSwyNSBAQCBwdWJsaWM6CiAK
ICAgICB2b2lkIG9ic2VydmUoTm9kZSosIE11dGF0aW9uT2JzZXJ2ZXJPcHRpb25zKTsKICAgICB2
b2lkIGRpc2Nvbm5lY3QoKTsKKyAgICB2b2lkIG9ic2VydmVkU3VidHJlZVdpbGxEaXNjb25uZWN0
KFBhc3NSZWZQdHI8Tm9kZT4sIE11dGF0aW9uT2JzZXJ2ZXJPcHRpb25zLCBQYXNzUmVmUHRyPE5v
ZGU+KTsKICAgICB2b2lkIG9ic2VydmVkTm9kZURlc3RydWN0ZWQoTm9kZSopOwogICAgIHZvaWQg
ZW5xdWV1ZU11dGF0aW9uUmVjb3JkKFBhc3NSZWZQdHI8TXV0YXRpb25SZWNvcmQ+KTsKIAogcHJp
dmF0ZToKICAgICBXZWJLaXRNdXRhdGlvbk9ic2VydmVyKFBhc3NSZWZQdHI8TXV0YXRpb25DYWxs
YmFjaz4pOwogCisgICAgdm9pZCBjbGVhclRyYW5zaWVudEVudHJpZXMoKTsKICAgICB2b2lkIGRl
bGl2ZXIoKTsKIAogICAgIFJlZlB0cjxNdXRhdGlvbkNhbGxiYWNrPiBtX2NhbGxiYWNrOwogICAg
IFZlY3RvcjxSZWZQdHI8TXV0YXRpb25SZWNvcmQ+ID4gbV9yZWNvcmRzOwogICAgIFZlY3RvcjxO
b2RlKj4gbV9vYnNlcnZlZE5vZGVzOyAvLyBOb2RlUmFyZURhdGEgaGFzIGEgUmVmUHRyIHRvIHRo
aXMsIHNvIHVzZSBhIHdlYWsgcG9pbnRlciB0byBhdm9pZCBhIGN5Y2xlLgorCisgICAgSGFzaE1h
cDxOb2RlKiwgTm9kZUhhc2hTZXQ+IG1fdHJhbnNpZW50T2JzZXJ2ZWROb2RlczsKIH07CiAKK3R5
cGVkZWYgSGFzaE1hcDxXZWJLaXRNdXRhdGlvbk9ic2VydmVyKiwgTXV0YXRpb25PYnNlcnZlck9w
dGlvbnM+IE11dGF0aW9uT2JzZXJ2ZXJPcHRpb25zTWFwOworCiB9CiAKICNlbmRpZiAvLyBFTkFC
TEUoTVVUQVRJT05fT0JTRVJWRVJTKQpkaWZmIC0tZ2l0IGEvTGF5b3V0VGVzdHMvQ2hhbmdlTG9n
IGIvTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCmluZGV4IGJlNTY0NjgzYjM3MDhhMDBhZjI0ZTMxYThh
Njg5NTlmZDAxNDk0YWEuLjdiOGFiNmQyYWExZjAxYTMzZWMzMmU3OGJlOTQ4ZmRiYTgwYTA1OTQg
MTAwNjQ0Ci0tLSBhL0xheW91dFRlc3RzL0NoYW5nZUxvZworKysgYi9MYXlvdXRUZXN0cy9DaGFu
Z2VMb2cKQEAgLTEsMyArMSwxMyBAQAorMjAxMS0xMC0yNCAgUmFmYWVsIFdlaW5zdGVpbiAgPHJh
ZmFlbHdAY2hyb21pdW0ub3JnPgorCisgICAgICAgIFtNdXRhdGlvbk9ic2VydmVyc10gSW1wbGVt
ZW50IHN1YnRyZWUgb2JzZXJ2YXRpb24gb2YgdHJhbnNpZW50bHkgZGlzY29ubmVjdGVkIG5vZGVz
CisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD03MDc4OAor
CisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgICogZmFzdC9t
dXRhdGlvbi9vYnNlcnZlLXN1YnRyZWUtZXhwZWN0ZWQudHh0OgorICAgICAgICAqIGZhc3QvbXV0
YXRpb24vb2JzZXJ2ZS1zdWJ0cmVlLmh0bWw6CisKIDIwMTEtMTAtMjQgIEp1bGllbiBDaGFmZnJh
aXggIDxqY2hhZmZyYWl4QHdlYmtpdC5vcmc+CiAKICAgICAgICAgVW5yZXZpZXdlZCBnYXJkZW5p
bmcgcmViYXNlbGluaW5nLgpkaWZmIC0tZ2l0IGEvTGF5b3V0VGVzdHMvZmFzdC9tdXRhdGlvbi9v
YnNlcnZlLXN1YnRyZWUtZXhwZWN0ZWQudHh0IGIvTGF5b3V0VGVzdHMvZmFzdC9tdXRhdGlvbi9v
YnNlcnZlLXN1YnRyZWUtZXhwZWN0ZWQudHh0CmluZGV4IDU1MjdlYjFhYzMwZTAyNDEyNDdkZDFh
OTEyNzMwNzNlYjQ2ZWEzYWYuLjY3YzViMDkwNDU1OGQ5ZTdmYWNmNjM1OGU1MWMwYzk4MjI5NWRi
YWMgMTAwNjQ0Ci0tLSBhL0xheW91dFRlc3RzL2Zhc3QvbXV0YXRpb24vb2JzZXJ2ZS1zdWJ0cmVl
LWV4cGVjdGVkLnR4dAorKysgYi9MYXlvdXRUZXN0cy9mYXN0L211dGF0aW9uL29ic2VydmUtc3Vi
dHJlZS1leHBlY3RlZC50eHQKQEAgLTEzLDYgKzEzLDI3IEBAIFBBU1MgbXV0YXRpb25zWzBdLmF0
dHJpYnV0ZU5hbWVzcGFjZSBpcyBudWxsCiBQQVNTIG11dGF0aW9uc1sxXS50eXBlIGlzICJjaGFy
YWN0ZXJEYXRhIgogUEFTUyBtdXRhdGlvbnNbMV0udGFyZ2V0IGlzIHN1YkRpdi5maXJzdENoaWxk
CiAKK1Rlc3RpbmcgdGhhdCB0cmFuc2llbnRseSBkaXNjb25uZWN0ZWQgbm9kZXMgYXJlIHN0aWxs
IG9ic2VydmVkIHZpYSBzdWJ0cmVlLgorLi4uYXR0cmlidXRlIGNoYW5nZSBpcyB0cmFuc2llbnRs
eSBkaXNjb25uZWN0ZWQgc3VidHJlZSBpcyBvYnNlcnZlZAorUEFTUyBtdXRhdGlvbnMubGVuZ3Ro
IGlzIDIKK1BBU1MgbXV0YXRpb25zWzBdLnR5cGUgaXMgImF0dHJpYnV0ZXMiCitQQVNTIG11dGF0
aW9uc1swXS50YXJnZXQgaXMgc3ViRGl2CitQQVNTIG11dGF0aW9uc1swXS5hdHRyaWJ1dGVOYW1l
IGlzICJmb28iCitQQVNTIG11dGF0aW9uc1sxXS50eXBlIGlzICJhdHRyaWJ1dGVzIgorUEFTUyBt
dXRhdGlvbnNbMV0udGFyZ2V0IGlzIHN1YkRpdgorUEFTUyBtdXRhdGlvbnNbMV0uYXR0cmlidXRl
TmFtZSBpcyAidGVzdCIKKy4uLnRyYW5zaWVudCBzdWJ0cmVlIG9ic2VydmF0aW9uIHdhcyBzdG9w
cGVkIGFmdGVyIGRlbGl2ZXJ5CitQQVNTIG11dGF0aW9ucyBpcyBudWxsCisuLi5yZWF0dGFjaGVk
IHN1YnRyZWUgaXMgc3luY2hyb25vdXNseSBvYnNlcnZhYmxlCitQQVNTIG11dGF0aW9ucy5sZW5n
dGggaXMgMQorUEFTUyBtdXRhdGlvbnNbMF0udHlwZSBpcyAiYXR0cmlidXRlcyIKK1BBU1MgbXV0
YXRpb25zWzBdLnRhcmdldCBpcyBzdWJEaXYKK1BBU1MgbXV0YXRpb25zWzBdLmF0dHJpYnV0ZU5h
bWUgaXMgImZvbyIKKy4uLnJlLW9ic2VydmF0aW9uIGNsZWFyZWQgdGhlIHRyYW5zaWVudGx5IG9i
c2VydmVkIG5vZGVzCitQQVNTIG11dGF0aW9ucy5sZW5ndGggaXMgMQorUEFTUyBtdXRhdGlvbnNb
MF0udHlwZSBpcyAiY2hhcmFjdGVyRGF0YSIKK1BBU1MgbXV0YXRpb25zWzBdLnRhcmdldCBpcyBz
dWJEaXYuZmlyc3RDaGlsZAorCiBUZXN0aW5nIHR3byBvYnNlcnZlcnMgYXQgZGlmZmVyZW50IGRl
cHRocy4KIFBBU1MgbXV0YXRpb25zLmxlbmd0aCBpcyAxCiBQQVNTIG11dGF0aW9uc1swXS50eXBl
IGlzICJhdHRyaWJ1dGVzIgpkaWZmIC0tZ2l0IGEvTGF5b3V0VGVzdHMvZmFzdC9tdXRhdGlvbi9v
YnNlcnZlLXN1YnRyZWUuaHRtbCBiL0xheW91dFRlc3RzL2Zhc3QvbXV0YXRpb24vb2JzZXJ2ZS1z
dWJ0cmVlLmh0bWwKaW5kZXggZWU2Mjk2N2E1MTIzYmM5YTE3MjQ1MGQ3N2I4NTA2ZGM0ODIwNjc3
NS4uZWM5MDY1ZWU3NzcwY2UzMjczMjFkOTE0ZGFlNTg1N2FiMmI2NTg1NSAxMDA2NDQKLS0tIGEv
TGF5b3V0VGVzdHMvZmFzdC9tdXRhdGlvbi9vYnNlcnZlLXN1YnRyZWUuaHRtbAorKysgYi9MYXlv
dXRUZXN0cy9mYXN0L211dGF0aW9uL29ic2VydmUtc3VidHJlZS5odG1sCkBAIC01Niw2ICs1Niw4
OCBAQCBmdW5jdGlvbiB0ZXN0QmFzaWMoKSB7CiAgICAgc3RhcnQoKTsKIH0KIAorZnVuY3Rpb24g
dGVzdFRyYW5zaWVudERpc2Nvbm5lY3RlZFN1YnRyZWUoKSB7CisgICAgdmFyIG9ic2VydmVyOwor
CisgICAgZnVuY3Rpb24gc3RhcnQoKSB7CisgICAgICAgIGRlYnVnKCdUZXN0aW5nIHRoYXQgdHJh
bnNpZW50bHkgZGlzY29ubmVjdGVkIG5vZGVzIGFyZSBzdGlsbCBvYnNlcnZlZCB2aWEgc3VidHJl
ZS4nKTsKKworICAgICAgICBtdXRhdGlvbnMgPSBudWxsOworICAgICAgICBkaXYgPSBkb2N1bWVu
dC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKKyAgICAgICAgc3ViRGl2ID0gZGl2LmFwcGVuZENoaWxk
KGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKTsKKyAgICAgICAgc3ViRGl2LmlubmVySFRN
TCA9ICdoZWxsbywgd29ybGQnOworICAgICAgICBvYnNlcnZlciA9IG5ldyBXZWJLaXRNdXRhdGlv
bk9ic2VydmVyKGZ1bmN0aW9uKG11dGF0aW9ucykgeworICAgICAgICAgICAgd2luZG93Lm11dGF0
aW9ucyA9IG11dGF0aW9uczsKKyAgICAgICAgfSk7CisKKyAgICAgICAgb2JzZXJ2ZXIub2JzZXJ2
ZShkaXYsIHthdHRyaWJ1dGVzOiB0cnVlLCBjaGFyYWN0ZXJEYXRhOiB0cnVlLCBzdWJ0cmVlOiB0
cnVlfSk7CisgICAgICAgIHN1YkRpdi5zZXRBdHRyaWJ1dGUoJ2ZvbycsICdiYXInKTsKKyAgICAg
ICAgZGl2LnJlbW92ZUNoaWxkKHN1YkRpdik7CisgICAgICAgIHN1YkRpdi5zZXRBdHRyaWJ1dGUo
J3Rlc3QnLCAndGVzdCcpOworICAgICAgICBzZXRUaW1lb3V0KGNoZWNrRGVsaXZlcmVkQW5kQ2hh
bmdlQWdhaW4sIDApOworICAgIH0KKworICAgIGZ1bmN0aW9uIGNoZWNrRGVsaXZlcmVkQW5kQ2hh
bmdlQWdhaW4oKSB7CisgICAgICAgIGRlYnVnKCcuLi5hdHRyaWJ1dGUgY2hhbmdlIGlzIHRyYW5z
aWVudGx5IGRpc2Nvbm5lY3RlZCBzdWJ0cmVlIGlzIG9ic2VydmVkJyk7CisKKyAgICAgICAgc2hv
dWxkQmUoJ211dGF0aW9ucy5sZW5ndGgnLCAnMicpOworICAgICAgICBzaG91bGRCZSgnbXV0YXRp
b25zWzBdLnR5cGUnLCAnImF0dHJpYnV0ZXMiJyk7CisgICAgICAgIHNob3VsZEJlKCdtdXRhdGlv
bnNbMF0udGFyZ2V0JywgJ3N1YkRpdicpOworICAgICAgICBzaG91bGRCZSgnbXV0YXRpb25zWzBd
LmF0dHJpYnV0ZU5hbWUnLCAnImZvbyInKTsKKyAgICAgICAgc2hvdWxkQmUoJ211dGF0aW9uc1sx
XS50eXBlJywgJyJhdHRyaWJ1dGVzIicpOworICAgICAgICBzaG91bGRCZSgnbXV0YXRpb25zWzFd
LnRhcmdldCcsICdzdWJEaXYnKTsKKyAgICAgICAgc2hvdWxkQmUoJ211dGF0aW9uc1sxXS5hdHRy
aWJ1dGVOYW1lJywgJyJ0ZXN0IicpOworCisgICAgICAgIG11dGF0aW9ucyA9IG51bGw7CisgICAg
ICAgIHN1YkRpdi5zZXRBdHRyaWJ1dGUoJ2ZvbycsICdiYXonKTsKKworICAgICAgICBzZXRUaW1l
b3V0KGNoZWNrTm90RGVsaXZlcmVkQW5kUmVhdHRhY2gpOworICAgIH0KKworICAgIGZ1bmN0aW9u
IGNoZWNrTm90RGVsaXZlcmVkQW5kUmVhdHRhY2goKSB7CisgICAgICAgIGRlYnVnKCcuLi50cmFu
c2llbnQgc3VidHJlZSBvYnNlcnZhdGlvbiB3YXMgc3RvcHBlZCBhZnRlciBkZWxpdmVyeScpOwor
CisgICAgICAgIHNob3VsZEJlKCdtdXRhdGlvbnMnLCAnbnVsbCcpOworCisgICAgICAgIG11dGF0
aW9ucyA9IG51bGwKKyAgICAgICAgZGl2LmFwcGVuZENoaWxkKHN1YkRpdik7CisgICAgICAgIHN1
YkRpdi5zZXRBdHRyaWJ1dGUoJ2ZvbycsICdiYXQnKTsKKworICAgICAgICBzZXRUaW1lb3V0KGNo
ZWNrRGVsaXZlcmVkQW5kUmVvYnNlcnZlKTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiBjaGVja0Rl
bGl2ZXJlZEFuZFJlb2JzZXJ2ZSgpIHsKKyAgICAgICAgZGVidWcoJy4uLnJlYXR0YWNoZWQgc3Vi
dHJlZSBpcyBzeW5jaHJvbm91c2x5IG9ic2VydmFibGUnKTsKKworICAgICAgICBzaG91bGRCZSgn
bXV0YXRpb25zLmxlbmd0aCcsICcxJyk7CisgICAgICAgIHNob3VsZEJlKCdtdXRhdGlvbnNbMF0u
dHlwZScsICciYXR0cmlidXRlcyInKTsKKyAgICAgICAgc2hvdWxkQmUoJ211dGF0aW9uc1swXS50
YXJnZXQnLCAnc3ViRGl2Jyk7CisgICAgICAgIHNob3VsZEJlKCdtdXRhdGlvbnNbMF0uYXR0cmli
dXRlTmFtZScsICciZm9vIicpOworCisgICAgICAgIG11dGF0aW9ucyA9IG51bGw7CisgICAgICAg
IGRpdi5yZW1vdmVDaGlsZChzdWJEaXYpOworICAgICAgICBzdWJEaXYuZmlyc3RDaGlsZC50ZXh0
Q29udGVudCA9ICdiYWRieWUnOworICAgICAgICBvYnNlcnZlci5vYnNlcnZlKGRpdiwge2F0dHJp
YnV0ZXM6IHRydWUsIGNoYXJhY3RlckRhdGE6IHRydWUsIHN1YnRyZWU6IHRydWV9KTsKKyAgICAg
ICAgc3ViRGl2LnNldEF0dHJpYnV0ZSgnZm9vJywgJ2JvbycpOworCisgICAgICAgIHNldFRpbWVv
dXQoZmluaXNoKTsKKyAgICB9CisKKworICAgIGZ1bmN0aW9uIGZpbmlzaCgpIHsKKyAgICAgICAg
ZGVidWcoJy4uLnJlLW9ic2VydmF0aW9uIGNsZWFyZWQgdGhlIHRyYW5zaWVudGx5IG9ic2VydmVk
IG5vZGVzJyk7CisKKyAgICAgICAgc2hvdWxkQmUoJ211dGF0aW9ucy5sZW5ndGgnLCAnMScpOwor
ICAgICAgICBzaG91bGRCZSgnbXV0YXRpb25zWzBdLnR5cGUnLCAnImNoYXJhY3RlckRhdGEiJyk7
CisgICAgICAgIHNob3VsZEJlKCdtdXRhdGlvbnNbMF0udGFyZ2V0JywgJ3N1YkRpdi5maXJzdENo
aWxkJyk7CisKKyAgICAgICAgb2JzZXJ2ZXIuZGlzY29ubmVjdCgpOworICAgICAgICBkZWJ1Zygn
Jyk7CisgICAgICAgIHJ1bk5leHRUZXN0KCk7CisgICAgfQorICAgIHN0YXJ0KCk7Cit9CisKIGZ1
bmN0aW9uIHRlc3RNdWx0aXBsZU9ic2VydmVycygpIHsKICAgICB2YXIgb2JzZXJ2ZXI7CiAgICAg
dmFyIG9ic2VydmVyMjsKQEAgLTEzNSw3ICsyMTcsNyBAQCBmdW5jdGlvbiB0ZXN0TXVsdGlwbGVP
YnNlcnZhdGlvbnMoKSB7CiAKICAgICBzdGFydCgpOwogfQotdmFyIHRlc3RzID0gW3Rlc3RCYXNp
YywgdGVzdE11bHRpcGxlT2JzZXJ2ZXJzLCB0ZXN0TXVsdGlwbGVPYnNlcnZhdGlvbnNdOwordmFy
IHRlc3RzID0gW3Rlc3RCYXNpYywgdGVzdFRyYW5zaWVudERpc2Nvbm5lY3RlZFN1YnRyZWUsIHRl
c3RNdWx0aXBsZU9ic2VydmVycywgdGVzdE11bHRpcGxlT2JzZXJ2YXRpb25zXTsKIHZhciB0ZXN0
SW5kZXggPSAwOwogCiBmdW5jdGlvbiBydW5OZXh0VGVzdCgpIHsK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>112598</attachid>
            <date>2011-10-26 14:40:54 -0700</date>
            <delta_ts>2011-10-26 17:40:56 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-70788-20111026144054.patch</filename>
            <type>text/plain</type>
            <size>29656</size>
            <attacher name="Rafael Weinstein">rafaelw</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogOTg0MDkKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0No
YW5nZUxvZyBiL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwppbmRleCBjN2EzZjNlOGVkMjFjMzA0
N2IwZTQ2YmYwZWNmMjQ1OTI4YjgxNjJiLi44N2Y3Y2E4MzcyYzEzNzAyNzRlMWQwMmE3NmUyNzJi
OTM3ZjA1MTE3IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvU291
cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsNDcgQEAKKzIwMTEtMTAtMjQgIFJhZmFl
bCBXZWluc3RlaW4gIDxyYWZhZWx3QGNocm9taXVtLm9yZz4KKworICAgICAgICBbTXV0YXRpb25P
YnNlcnZlcnNdIEltcGxlbWVudCBzdWJ0cmVlIG9ic2VydmF0aW9uIG9mIHRyYW5zaWVudGx5IGRp
c2Nvbm5lY3RlZCBub2RlcworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1
Zy5jZ2k/aWQ9NzA3ODgKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKwor
ICAgICAgICBUaGlzIHBhdGNoIGFkZHMgc3VwcG9ydCBmb3Igb2JzZXJ2aW5nICJ0cmFuc2llbnRs
eSBkaXNjb25uZWN0ZWQiIG5vZGVzIGZyb20gc3VidHJlZQorICAgICAgICBvYnNlcnZhdGlvbnMg
Ynkgc3luY2hyb25vdXNseSBhZGRpbmcgdHJhbnNpZW50IGVudHJpZXMgd2hlbiBub2RlcyBhcmUg
cmVtb3ZlZCBmcm9tCisgICAgICAgIHRoZWlyIHBhcmVudC4gV2ViS2l0TXV0YXRpb25PYnNlcnZl
ciBpcyBtYWRlIHJlc3BvbnNpYmxlIGZvciB0aGUgYWNjb3VudGluZyBvZgorICAgICAgICByZWNv
cmRpbmcgYW5kIGNsZWFyaW5nIHRoZXNlIHRyYW5zaWVudCBvYnNlcnZlcnMuCisKKyAgICAgICAg
TmV3IHRlc3RzIGFkZGVkIHRvIGZhc3QvbXV0YXRpb24vb2JzZXJ2ZS1zdWJ0cmVlLmh0bWwuCisK
KyAgICAgICAgKiBkb20vQ2hhcmFjdGVyRGF0YS5jcHA6CisgICAgICAgIChXZWJDb3JlOjpDaGFy
YWN0ZXJEYXRhOjpkaXNwYXRjaE1vZGlmaWVkRXZlbnQpOgorICAgICAgICAqIGRvbS9DaGlsZExp
c3RNdXRhdGlvblNjb3BlLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6Ok11dGF0aW9uQWNjdW11bGF0
aW9uUm91dGVyOjpDaGlsZExpc3RNdXRhdGlvbkFjY3VtdWxhdG9yOjpDaGlsZExpc3RNdXRhdGlv
bkFjY3VtdWxhdG9yKToKKyAgICAgICAgKFdlYkNvcmU6Ok11dGF0aW9uQWNjdW11bGF0aW9uUm91
dGVyOjpDaGlsZExpc3RNdXRhdGlvbkFjY3VtdWxhdG9yOjplbnF1ZXVlTXV0YXRpb25SZWNvcmQp
OgorICAgICAgICAoV2ViQ29yZTo6TXV0YXRpb25BY2N1bXVsYXRpb25Sb3V0ZXI6Ok11dGF0aW9u
QWNjdW11bGF0aW9uUm91dGVyOjppbmNyZW1lbnRTY29waW5nTGV2ZWwpOgorICAgICAgICAqIGRv
bS9Db250YWluZXJOb2RlLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OmRpc3BhdGNoQ2hpbGRSZW1v
dmFsRXZlbnRzKToKKyAgICAgICAgKiBkb20vRWxlbWVudC5jcHA6CisgICAgICAgIChXZWJDb3Jl
OjplbnF1ZXVlQXR0cmlidXRlc011dGF0aW9uUmVjb3JkKToKKyAgICAgICAgKiBkb20vTm9kZS5j
cHA6CisgICAgICAgIChXZWJDb3JlOjphZGRNYXRjaGluZ09ic2VydmVycyk6CisgICAgICAgIChX
ZWJDb3JlOjpOb2RlOjpnZXRSZWdpc3RlcmVkTXV0YXRpb25PYnNlcnZlcnNPZlR5cGUpOgorICAg
ICAgICAoV2ViQ29yZTo6Tm9kZTo6cmVnaXN0ZXJNdXRhdGlvbk9ic2VydmVyKToKKyAgICAgICAg
KFdlYkNvcmU6Ok5vZGU6OnVucmVnaXN0ZXJNdXRhdGlvbk9ic2VydmVyKToKKyAgICAgICAgKFdl
YkNvcmU6Ok5vZGU6Om5vdGlmeVN1YnRyZWVPYnNlcnZlcnNPZkRpc2Nvbm5lY3Rpb24pOgorICAg
ICAgICAqIGRvbS9Ob2RlLmg6CisgICAgICAgICogZG9tL05vZGVSYXJlRGF0YS5oOgorICAgICAg
ICAoV2ViQ29yZTo6TXV0YXRpb25PYnNlcnZlckVudHJ5OjpNdXRhdGlvbk9ic2VydmVyRW50cnkp
OgorICAgICAgICAoV2ViQ29yZTo6TXV0YXRpb25PYnNlcnZlckVudHJ5OjpvcGVyYXRvcj09KToK
KyAgICAgICAgKiBkb20vV2ViS2l0TXV0YXRpb25PYnNlcnZlci5jcHA6CisgICAgICAgIChXZWJD
b3JlOjpXZWJLaXRNdXRhdGlvbk9ic2VydmVyOjpvYnNlcnZlKToKKyAgICAgICAgKFdlYkNvcmU6
OnVucmVnaXN0ZXJUcmFuc2llbnRFbnRyaWVzKToKKyAgICAgICAgKFdlYkNvcmU6OldlYktpdE11
dGF0aW9uT2JzZXJ2ZXI6OmRpc2Nvbm5lY3QpOgorICAgICAgICAoV2ViQ29yZTo6V2ViS2l0TXV0
YXRpb25PYnNlcnZlcjo6b2JzZXJ2ZWROb2RlRGVzdHJ1Y3RlZCk6CisgICAgICAgIChXZWJDb3Jl
OjpXZWJLaXRNdXRhdGlvbk9ic2VydmVyOjpvYnNlcnZlZFN1YnRyZWVXaWxsRGlzY29ubmVjdCk6
CisgICAgICAgIChXZWJDb3JlOjpXZWJLaXRNdXRhdGlvbk9ic2VydmVyOjpjbGVhclRyYW5zaWVu
dEVudHJpZXMpOgorICAgICAgICAoV2ViQ29yZTo6V2ViS2l0TXV0YXRpb25PYnNlcnZlcjo6ZGVs
aXZlcik6CisgICAgICAgICogZG9tL1dlYktpdE11dGF0aW9uT2JzZXJ2ZXIuaDoKKwogMjAxMS0x
MC0yNSAgUnlvc3VrZSBOaXdhICA8cm5pd2FAd2Via2l0Lm9yZz4KIAogICAgICAgICBNb3Zpbmcg
dG8gdGhlIHN0YXJ0IG9mIGxpbmUgc2hvdWxkIG5vdCBwbGFjZSB0aGUgY2FyZXQgb3V0c2lkZSBv
ZiB0aGUgdGFibGUKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2RvbS9DaGFyYWN0ZXJEYXRh
LmNwcCBiL1NvdXJjZS9XZWJDb3JlL2RvbS9DaGFyYWN0ZXJEYXRhLmNwcAppbmRleCA1ZTg0MWVi
MzhmNzQ4YjY2YzRmNmNjZDI1MDJmYzRkYTU1ZGMxZjk1Li4zN2E3ZmJmZmJhMmFhOWYzMWU5NjY5
M2JiN2FjOTcyOGI1MjM0YjUzIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9kb20vQ2hhcmFj
dGVyRGF0YS5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvZG9tL0NoYXJhY3RlckRhdGEuY3BwCkBA
IC0xOTMsMTIgKzE5MywxMiBAQCB2b2lkIENoYXJhY3RlckRhdGE6OnVwZGF0ZVJlbmRlcmVyKHVu
c2lnbmVkIG9mZnNldE9mUmVwbGFjZWREYXRhLCB1bnNpZ25lZCBsZW5ndAogdm9pZCBDaGFyYWN0
ZXJEYXRhOjpkaXNwYXRjaE1vZGlmaWVkRXZlbnQoU3RyaW5nSW1wbCogb2xkRGF0YSkKIHsKICNp
ZiBFTkFCTEUoTVVUQVRJT05fT0JTRVJWRVJTKQotICAgIFZlY3RvcjxXZWJLaXRNdXRhdGlvbk9i
c2VydmVyKj4gb2JzZXJ2ZXJzOworICAgIEhhc2hNYXA8V2ViS2l0TXV0YXRpb25PYnNlcnZlcios
IE11dGF0aW9uT2JzZXJ2ZXJPcHRpb25zPiBvYnNlcnZlcnM7CiAgICAgZ2V0UmVnaXN0ZXJlZE11
dGF0aW9uT2JzZXJ2ZXJzT2ZUeXBlKG9ic2VydmVycywgV2ViS2l0TXV0YXRpb25PYnNlcnZlcjo6
Q2hhcmFjdGVyRGF0YSk7CiAgICAgaWYgKCFvYnNlcnZlcnMuaXNFbXB0eSgpKSB7CiAgICAgICAg
IFJlZlB0cjxNdXRhdGlvblJlY29yZD4gbXV0YXRpb24gPSBNdXRhdGlvblJlY29yZDo6Y3JlYXRl
Q2hhcmFjdGVyRGF0YSh0aGlzKTsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvYnNl
cnZlcnMuc2l6ZSgpOyArK2kpCi0gICAgICAgICAgICBvYnNlcnZlcnNbaV0tPmVucXVldWVNdXRh
dGlvblJlY29yZChtdXRhdGlvbik7CisgICAgICAgIGZvciAoSGFzaE1hcDxXZWJLaXRNdXRhdGlv
bk9ic2VydmVyKiwgTXV0YXRpb25PYnNlcnZlck9wdGlvbnM+OjppdGVyYXRvciBpdGVyID0gb2Jz
ZXJ2ZXJzLmJlZ2luKCk7IGl0ZXIgIT0gb2JzZXJ2ZXJzLmVuZCgpOyArK2l0ZXIpCisgICAgICAg
ICAgICAgICAgaXRlci0+Zmlyc3QtPmVucXVldWVNdXRhdGlvblJlY29yZChtdXRhdGlvbik7CiAg
ICAgfQogI2VuZGlmCiAgICAgaWYgKHBhcmVudE5vZGUoKSkKZGlmZiAtLWdpdCBhL1NvdXJjZS9X
ZWJDb3JlL2RvbS9DaGlsZExpc3RNdXRhdGlvblNjb3BlLmNwcCBiL1NvdXJjZS9XZWJDb3JlL2Rv
bS9DaGlsZExpc3RNdXRhdGlvblNjb3BlLmNwcAppbmRleCA0ZTVmMGE5MGQ3NjU5MjdlNzY0N2E0
MDkxNmU4M2ZkMjQzYjRlZmMzLi41ZGNiZGNmZjMwZGFhOThjYjkwMWI3YjZlZWEwZTRkMTY5OGZl
NjJiIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9kb20vQ2hpbGRMaXN0TXV0YXRpb25TY29w
ZS5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvZG9tL0NoaWxkTGlzdE11dGF0aW9uU2NvcGUuY3Bw
CkBAIC01Myw3ICs1Myw3IEBAIG5hbWVzcGFjZSB7CiBjbGFzcyBDaGlsZExpc3RNdXRhdGlvbkFj
Y3VtdWxhdG9yIDogcHVibGljIFJlZkNvdW50ZWQ8Q2hpbGRMaXN0TXV0YXRpb25BY2N1bXVsYXRv
cj4gewogICAgIFdURl9NQUtFX05PTkNPUFlBQkxFKENoaWxkTGlzdE11dGF0aW9uQWNjdW11bGF0
b3IpOwogcHVibGljOgotICAgIENoaWxkTGlzdE11dGF0aW9uQWNjdW11bGF0b3IoUGFzc1JlZlB0
cjxOb2RlPiwgVmVjdG9yPFdlYktpdE11dGF0aW9uT2JzZXJ2ZXIqPiYpOworICAgIENoaWxkTGlz
dE11dGF0aW9uQWNjdW11bGF0b3IoUGFzc1JlZlB0cjxOb2RlPiwgSGFzaE1hcDxXZWJLaXRNdXRh
dGlvbk9ic2VydmVyKiwgTXV0YXRpb25PYnNlcnZlck9wdGlvbnM+Jik7CiAgICAgfkNoaWxkTGlz
dE11dGF0aW9uQWNjdW11bGF0b3IoKTsKIAogICAgIHZvaWQgY2hpbGRBZGRlZChQYXNzUmVmUHRy
PE5vZGU+KTsKQEAgLTczLDcgKzczLDcgQEAgcHJpdmF0ZToKICAgICBSZWZQdHI8Tm9kZT4gbV9u
ZXh0U2libGluZzsKICAgICBSZWZQdHI8Tm9kZT4gbV9sYXN0QWRkZWQ7CiAKLSAgICBWZWN0b3I8
V2ViS2l0TXV0YXRpb25PYnNlcnZlcio+IG1fb2JzZXJ2ZXJzOworICAgIEhhc2hNYXA8V2ViS2l0
TXV0YXRpb25PYnNlcnZlciosIE11dGF0aW9uT2JzZXJ2ZXJPcHRpb25zPiBtX29ic2VydmVyczsK
IH07CiAKIGNsYXNzIE11dGF0aW9uQWNjdW11bGF0aW9uUm91dGVyIHsKQEAgLTEwMCw3ICsxMDAs
NyBAQCBwcml2YXRlOgogICAgIHN0YXRpYyBNdXRhdGlvbkFjY3VtdWxhdGlvblJvdXRlciogc19p
bnN0YW5jZTsKIH07CiAKLUNoaWxkTGlzdE11dGF0aW9uQWNjdW11bGF0b3I6OkNoaWxkTGlzdE11
dGF0aW9uQWNjdW11bGF0b3IoUGFzc1JlZlB0cjxOb2RlPiB0YXJnZXQsIFZlY3RvcjxXZWJLaXRN
dXRhdGlvbk9ic2VydmVyKj4mIG9ic2VydmVycykKK0NoaWxkTGlzdE11dGF0aW9uQWNjdW11bGF0
b3I6OkNoaWxkTGlzdE11dGF0aW9uQWNjdW11bGF0b3IoUGFzc1JlZlB0cjxOb2RlPiB0YXJnZXQs
IEhhc2hNYXA8V2ViS2l0TXV0YXRpb25PYnNlcnZlciosIE11dGF0aW9uT2JzZXJ2ZXJPcHRpb25z
PiYgb2JzZXJ2ZXJzKQogICAgIDogbV90YXJnZXQodGFyZ2V0KQogewogICAgIG1fb2JzZXJ2ZXJz
LnN3YXAob2JzZXJ2ZXJzKTsKQEAgLTE2OSw4ICsxNjksOCBAQCB2b2lkIENoaWxkTGlzdE11dGF0
aW9uQWNjdW11bGF0b3I6OmVucXVldWVNdXRhdGlvblJlY29yZCgpCiAgICAgUmVmUHRyPE11dGF0
aW9uUmVjb3JkPiBtdXRhdGlvbiA9IE11dGF0aW9uUmVjb3JkOjpjcmVhdGVDaGlsZExpc3QoCiAg
ICAgICAgIG1fdGFyZ2V0LCBTdGF0aWNOb2RlTGlzdDo6YWRvcHQobV9hZGRlZE5vZGVzKSwgU3Rh
dGljTm9kZUxpc3Q6OmFkb3B0KG1fcmVtb3ZlZE5vZGVzKSwgbV9wcmV2aW91c1NpYmxpbmcsIG1f
bmV4dFNpYmxpbmcpOwogCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtX29ic2VydmVycy5z
aXplKCk7ICsraSkKLSAgICAgICAgbV9vYnNlcnZlcnNbaV0tPmVucXVldWVNdXRhdGlvblJlY29y
ZChtdXRhdGlvbik7CisgICAgZm9yIChIYXNoTWFwPFdlYktpdE11dGF0aW9uT2JzZXJ2ZXIqLCBN
dXRhdGlvbk9ic2VydmVyT3B0aW9ucz46Oml0ZXJhdG9yIGl0ZXIgPSBtX29ic2VydmVycy5iZWdp
bigpOyBpdGVyICE9IG1fb2JzZXJ2ZXJzLmVuZCgpOyArK2l0ZXIpCisgICAgICAgIGl0ZXItPmZp
cnN0LT5lbnF1ZXVlTXV0YXRpb25SZWNvcmQobXV0YXRpb24pOwogCiAgICAgY2xlYXIoKTsKIH0K
QEAgLTI0NCw3ICsyNDQsNyBAQCB2b2lkIE11dGF0aW9uQWNjdW11bGF0aW9uUm91dGVyOjppbmNy
ZW1lbnRTY29waW5nTGV2ZWwoTm9kZSogdGFyZ2V0KQogICAgICAgICByZXR1cm47CiAgICAgfQog
Ci0gICAgVmVjdG9yPFdlYktpdE11dGF0aW9uT2JzZXJ2ZXIqPiBvYnNlcnZlcnM7CisgICAgSGFz
aE1hcDxXZWJLaXRNdXRhdGlvbk9ic2VydmVyKiwgTXV0YXRpb25PYnNlcnZlck9wdGlvbnM+IG9i
c2VydmVyczsKICAgICB0YXJnZXQtPmdldFJlZ2lzdGVyZWRNdXRhdGlvbk9ic2VydmVyc09mVHlw
ZShvYnNlcnZlcnMsIFdlYktpdE11dGF0aW9uT2JzZXJ2ZXI6OkNoaWxkTGlzdCk7CiAgICAgaWYg
KG9ic2VydmVycy5pc0VtcHR5KCkpCiAgICAgICAgIG1fYWNjdW11bGF0aW9ucy5zZXQodGFyZ2V0
LCAwKTsKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2RvbS9Db250YWluZXJOb2RlLmNwcCBi
L1NvdXJjZS9XZWJDb3JlL2RvbS9Db250YWluZXJOb2RlLmNwcAppbmRleCA3NGM3OWQ2ZjczMTFi
NTA0MWRiZjk1N2Q0M2RlM2M2OTg2NDA2Y2U1Li43NmE3MDJlOWFjZDAxNTVmYTViMjkxZjAwMjMz
Yzk1ODdiZDlmZGUzIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9kb20vQ29udGFpbmVyTm9k
ZS5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvZG9tL0NvbnRhaW5lck5vZGUuY3BwCkBAIC0xMTQ0
LDYgKzExNDQsNyBAQCBzdGF0aWMgdm9pZCBkaXNwYXRjaENoaWxkUmVtb3ZhbEV2ZW50cyhOb2Rl
KiBjaGlsZCkKICAgICBpZiAoYy0+cGFyZW50Tm9kZSgpKSB7CiAgICAgICAgIENoaWxkTGlzdE11
dGF0aW9uU2NvcGUgbXV0YXRpb24oYy0+cGFyZW50Tm9kZSgpKTsKICAgICAgICAgbXV0YXRpb24u
d2lsbFJlbW92ZUNoaWxkKGMpOworICAgICAgICBjLT5ub3RpZnlTdWJ0cmVlT2JzZXJ2ZXJzT2ZE
aXNjb25uZWN0aW9uKCk7CiAgICAgfQogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJD
b3JlL2RvbS9FbGVtZW50LmNwcCBiL1NvdXJjZS9XZWJDb3JlL2RvbS9FbGVtZW50LmNwcAppbmRl
eCAzZWE3NGJlZWJmMWU5ZmIwNDhmMTA0OTQzOWMxYTlhNmZmMTBmOWFlLi5kYjk4MTE2MTMzODVl
NjBhZTNkNDExOTVkMGM0ZmM0NjBiODQ5M2JjIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9k
b20vRWxlbWVudC5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvZG9tL0VsZW1lbnQuY3BwCkBAIC02
MTksMTQgKzYxOSwxNCBAQCBjb25zdCBBdG9taWNTdHJpbmcmIEVsZW1lbnQ6OmdldEF0dHJpYnV0
ZU5TKGNvbnN0IFN0cmluZyYgbmFtZXNwYWNlVVJJLCBjb25zdCBTdAogI2lmIEVOQUJMRShNVVRB
VElPTl9PQlNFUlZFUlMpCiBzdGF0aWMgdm9pZCBlbnF1ZXVlQXR0cmlidXRlc011dGF0aW9uUmVj
b3JkKEVsZW1lbnQqIGVsZW1lbnQsIGNvbnN0IFF1YWxpZmllZE5hbWUmIG5hbWUpCiB7Ci0gICAg
VmVjdG9yPFdlYktpdE11dGF0aW9uT2JzZXJ2ZXIqPiBvYnNlcnZlcnM7CisgICAgSGFzaE1hcDxX
ZWJLaXRNdXRhdGlvbk9ic2VydmVyKiwgTXV0YXRpb25PYnNlcnZlck9wdGlvbnM+IG9ic2VydmVy
czsKICAgICBlbGVtZW50LT5nZXRSZWdpc3RlcmVkTXV0YXRpb25PYnNlcnZlcnNPZlR5cGUob2Jz
ZXJ2ZXJzLCBXZWJLaXRNdXRhdGlvbk9ic2VydmVyOjpBdHRyaWJ1dGVzKTsKICAgICBpZiAob2Jz
ZXJ2ZXJzLmlzRW1wdHkoKSkKICAgICAgICAgcmV0dXJuOwogCiAgICAgUmVmUHRyPE11dGF0aW9u
UmVjb3JkPiBtdXRhdGlvbiA9IE11dGF0aW9uUmVjb3JkOjpjcmVhdGVBdHRyaWJ1dGVzKGVsZW1l
bnQsIG5hbWUpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgb2JzZXJ2ZXJzLnNpemUoKTsg
KytpKQotICAgICAgICBvYnNlcnZlcnNbaV0tPmVucXVldWVNdXRhdGlvblJlY29yZChtdXRhdGlv
bik7CisgICAgZm9yIChIYXNoTWFwPFdlYktpdE11dGF0aW9uT2JzZXJ2ZXIqLCBNdXRhdGlvbk9i
c2VydmVyT3B0aW9ucz46Oml0ZXJhdG9yIGl0ZXIgPSBvYnNlcnZlcnMuYmVnaW4oKTsgaXRlciAh
PSBvYnNlcnZlcnMuZW5kKCk7ICsraXRlcikKKyAgICAgICAgaXRlci0+Zmlyc3QtPmVucXVldWVN
dXRhdGlvblJlY29yZChtdXRhdGlvbik7CiB9CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvU291cmNl
L1dlYkNvcmUvZG9tL05vZGUuY3BwIGIvU291cmNlL1dlYkNvcmUvZG9tL05vZGUuY3BwCmluZGV4
IDkyOTRkZTY4NGI2Yjg1NjU1ZDA4MWIxMTJiZjNmN2Q0NjM0NDJjZDMuLjQ3ODQ4M2JlNDM1YjEy
ZTRlZDJkMGMzNTY0NTcyNTMxMzA2YjFjNmMgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL2Rv
bS9Ob2RlLmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9kb20vTm9kZS5jcHAKQEAgLTI3MDMsNyAr
MjcwMyw3IEBAIFZlY3RvcjxNdXRhdGlvbk9ic2VydmVyRW50cnk+KiBOb2RlOjptdXRhdGlvbk9i
c2VydmVyRW50cmllcygpCiAgICAgcmV0dXJuIGhhc1JhcmVEYXRhKCkgPyByYXJlRGF0YSgpLT5t
dXRhdGlvbk9ic2VydmVyRW50cmllcygpIDogMDsKIH0KIAotc3RhdGljIHZvaWQgYWRkTWF0Y2hp
bmdPYnNlcnZlcnMoSGFzaFNldDxXZWJLaXRNdXRhdGlvbk9ic2VydmVyKj4mIG9ic2VydmVyU2V0
LCBWZWN0b3I8TXV0YXRpb25PYnNlcnZlckVudHJ5Piogb2JzZXJ2ZXJFbnRyaWVzLCBNdXRhdGlv
bk9ic2VydmVyT3B0aW9ucyBvcHRpb25zKQorc3RhdGljIHZvaWQgYWRkTWF0Y2hpbmdPYnNlcnZl
cnMoSGFzaE1hcDxXZWJLaXRNdXRhdGlvbk9ic2VydmVyKiwgTXV0YXRpb25PYnNlcnZlck9wdGlv
bnM+JiBvYnNlcnZlcnMsIFZlY3RvcjxNdXRhdGlvbk9ic2VydmVyRW50cnk+KiBvYnNlcnZlckVu
dHJpZXMsIE11dGF0aW9uT2JzZXJ2ZXJPcHRpb25zIG9wdGlvbnMpCiB7CiAgICAgaWYgKCFvYnNl
cnZlckVudHJpZXMpCiAgICAgICAgIHJldHVybjsKQEAgLTI3MTEsMjcgKzI3MTEsMjYgQEAgc3Rh
dGljIHZvaWQgYWRkTWF0Y2hpbmdPYnNlcnZlcnMoSGFzaFNldDxXZWJLaXRNdXRhdGlvbk9ic2Vy
dmVyKj4mIG9ic2VydmVyU2V0LAogICAgIGNvbnN0IHNpemVfdCBzaXplID0gb2JzZXJ2ZXJFbnRy
aWVzLT5zaXplKCk7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKICAg
ICAgICAgTXV0YXRpb25PYnNlcnZlckVudHJ5JiBlbnRyeSA9IG9ic2VydmVyRW50cmllcy0+YXQo
aSk7Ci0gICAgICAgIGlmIChlbnRyeS5oYXNBbGxPcHRpb25zKG9wdGlvbnMpKQotICAgICAgICAg
ICAgb2JzZXJ2ZXJTZXQuYWRkKGVudHJ5Lm9ic2VydmVyLmdldCgpKTsKKworICAgICAgICBpZiAo
ZW50cnkuaGFzQWxsT3B0aW9ucyhvcHRpb25zKSkgeworICAgICAgICAgICAgcGFpcjxIYXNoTWFw
PFdlYktpdE11dGF0aW9uT2JzZXJ2ZXIqLCBNdXRhdGlvbk9ic2VydmVyT3B0aW9ucz46Oml0ZXJh
dG9yLCBib29sPiByZXN1bHQgPSBvYnNlcnZlcnMuYWRkKGVudHJ5Lm9ic2VydmVyLmdldCgpLCBl
bnRyeS5vcHRpb25zKTsKKyAgICAgICAgICAgIGlmICghcmVzdWx0LnNlY29uZCkKKyAgICAgICAg
ICAgICAgICByZXN1bHQuZmlyc3QtPnNlY29uZCB8PSBlbnRyeS5vcHRpb25zOworICAgICAgICB9
CiAgICAgfQogfQogCi12b2lkIE5vZGU6OmdldFJlZ2lzdGVyZWRNdXRhdGlvbk9ic2VydmVyc09m
VHlwZShWZWN0b3I8V2ViS2l0TXV0YXRpb25PYnNlcnZlcio+JiBvYnNlcnZlcnMsIFdlYktpdE11
dGF0aW9uT2JzZXJ2ZXI6Ok11dGF0aW9uVHlwZSB0eXBlKQordm9pZCBOb2RlOjpnZXRSZWdpc3Rl
cmVkTXV0YXRpb25PYnNlcnZlcnNPZlR5cGUoSGFzaE1hcDxXZWJLaXRNdXRhdGlvbk9ic2VydmVy
KiwgTXV0YXRpb25PYnNlcnZlck9wdGlvbnM+JiBvYnNlcnZlcnMsIFdlYktpdE11dGF0aW9uT2Jz
ZXJ2ZXI6Ok11dGF0aW9uVHlwZSB0eXBlKQogewotICAgIEhhc2hTZXQ8V2ViS2l0TXV0YXRpb25P
YnNlcnZlcio+IG9ic2VydmVyU2V0OwotICAgIGFkZE1hdGNoaW5nT2JzZXJ2ZXJzKG9ic2VydmVy
U2V0LCBtdXRhdGlvbk9ic2VydmVyRW50cmllcygpLCB0eXBlKTsKKyAgICBhZGRNYXRjaGluZ09i
c2VydmVycyhvYnNlcnZlcnMsIG11dGF0aW9uT2JzZXJ2ZXJFbnRyaWVzKCksIHR5cGUpOwogICAg
IGZvciAoTm9kZSogbm9kZSA9IHBhcmVudE5vZGUoKTsgbm9kZTsgbm9kZSA9IG5vZGUtPnBhcmVu
dE5vZGUoKSkKLSAgICAgICAgYWRkTWF0Y2hpbmdPYnNlcnZlcnMob2JzZXJ2ZXJTZXQsIG5vZGUt
Pm11dGF0aW9uT2JzZXJ2ZXJFbnRyaWVzKCksIHR5cGUgfCBXZWJLaXRNdXRhdGlvbk9ic2VydmVy
OjpTdWJ0cmVlKTsKLQotICAgIC8vIEZJWE1FOiB0aGlzIG1ldGhvZCBzaG91bGQgb3V0cHV0IGEg
SGFzaFNldCBpbnN0ZWFkIG9mIGEgVmVjdG9yLgotICAgIGlmICghb2JzZXJ2ZXJTZXQuaXNFbXB0
eSgpKQotICAgICAgICBjb3B5VG9WZWN0b3Iob2JzZXJ2ZXJTZXQsIG9ic2VydmVycyk7CisgICAg
ICAgIGFkZE1hdGNoaW5nT2JzZXJ2ZXJzKG9ic2VydmVycywgbm9kZS0+bXV0YXRpb25PYnNlcnZl
ckVudHJpZXMoKSwgdHlwZSB8IFdlYktpdE11dGF0aW9uT2JzZXJ2ZXI6OlN1YnRyZWUpOwogfQog
Ci1Ob2RlOjpNdXRhdGlvblJlZ2lzdHJhdGlvblJlc3VsdCBOb2RlOjpyZWdpc3Rlck11dGF0aW9u
T2JzZXJ2ZXIoUGFzc1JlZlB0cjxXZWJLaXRNdXRhdGlvbk9ic2VydmVyPiBvYnNlcnZlciwgTXV0
YXRpb25PYnNlcnZlck9wdGlvbnMgb3B0aW9ucykKK05vZGU6Ok11dGF0aW9uUmVnaXN0cmF0aW9u
UmVzdWx0IE5vZGU6OnJlZ2lzdGVyTXV0YXRpb25PYnNlcnZlcihQYXNzUmVmUHRyPFdlYktpdE11
dGF0aW9uT2JzZXJ2ZXI+IG9ic2VydmVyLCBNdXRhdGlvbk9ic2VydmVyT3B0aW9ucyBvcHRpb25z
LCBOb2RlKiB0cmFuc2llbnRPZk5vZGUpCiB7CiAgICAgVmVjdG9yPE11dGF0aW9uT2JzZXJ2ZXJF
bnRyeT4qIG9ic2VydmVyRW50cmllcyA9IGVuc3VyZVJhcmVEYXRhKCktPmVuc3VyZU11dGF0aW9u
T2JzZXJ2ZXJFbnRyaWVzKCk7Ci0gICAgTXV0YXRpb25PYnNlcnZlckVudHJ5IGVudHJ5KG9ic2Vy
dmVyLCBvcHRpb25zKTsKKyAgICBNdXRhdGlvbk9ic2VydmVyRW50cnkgZW50cnkob2JzZXJ2ZXIs
IG9wdGlvbnMsIHRyYW5zaWVudE9mTm9kZSk7CiAKICAgICBzaXplX3QgaW5kZXggPSBvYnNlcnZl
ckVudHJpZXMtPmZpbmQoZW50cnkpOwogICAgIGlmIChpbmRleCA9PSBub3RGb3VuZCkgewpAQCAt
Mjc0MywxNCArMjc0MiwxNCBAQCBOb2RlOjpNdXRhdGlvblJlZ2lzdHJhdGlvblJlc3VsdCBOb2Rl
OjpyZWdpc3Rlck11dGF0aW9uT2JzZXJ2ZXIoUGFzc1JlZlB0cjxXZWJLaQogICAgIHJldHVybiBN
dXRhdGlvblJlZ2lzdHJhdGlvbk9wdGlvbnNSZXNldDsKIH0KIAotdm9pZCBOb2RlOjp1bnJlZ2lz
dGVyTXV0YXRpb25PYnNlcnZlcihQYXNzUmVmUHRyPFdlYktpdE11dGF0aW9uT2JzZXJ2ZXI+IG9i
c2VydmVyKQordm9pZCBOb2RlOjp1bnJlZ2lzdGVyTXV0YXRpb25PYnNlcnZlcihQYXNzUmVmUHRy
PFdlYktpdE11dGF0aW9uT2JzZXJ2ZXI+IG9ic2VydmVyLCBOb2RlKiB0cmFuc2llbnRPZk5vZGUp
CiB7CiAgICAgVmVjdG9yPE11dGF0aW9uT2JzZXJ2ZXJFbnRyeT4qIG9ic2VydmVyRW50cmllcyA9
IG11dGF0aW9uT2JzZXJ2ZXJFbnRyaWVzKCk7CiAgICAgQVNTRVJUKG9ic2VydmVyRW50cmllcyk7
CiAgICAgaWYgKCFvYnNlcnZlckVudHJpZXMpCiAgICAgICAgIHJldHVybjsKIAotICAgIE11dGF0
aW9uT2JzZXJ2ZXJFbnRyeSBlbnRyeShvYnNlcnZlciwgMCk7CisgICAgTXV0YXRpb25PYnNlcnZl
ckVudHJ5IGVudHJ5KG9ic2VydmVyLCAwLCB0cmFuc2llbnRPZk5vZGUpOwogICAgIHNpemVfdCBp
bmRleCA9IG9ic2VydmVyRW50cmllcy0+ZmluZChlbnRyeSk7CiAgICAgQVNTRVJUKGluZGV4ICE9
IG5vdEZvdW5kKTsKICAgICBpZiAoaW5kZXggPT0gbm90Rm91bmQpCkBAIC0yNzU4LDYgKzI3NTcs
MjYgQEAgdm9pZCBOb2RlOjp1bnJlZ2lzdGVyTXV0YXRpb25PYnNlcnZlcihQYXNzUmVmUHRyPFdl
YktpdE11dGF0aW9uT2JzZXJ2ZXI+IG9ic2VydmUKIAogICAgIG9ic2VydmVyRW50cmllcy0+cmVt
b3ZlKGluZGV4KTsKIH0KKwordm9pZCBOb2RlOjpub3RpZnlTdWJ0cmVlT2JzZXJ2ZXJzT2ZEaXNj
b25uZWN0aW9uKCkKK3sKKyAgICBmb3IgKE5vZGUqIG5vZGUgPSBwYXJlbnROb2RlKCk7IG5vZGU7
IG5vZGUgPSBub2RlLT5wYXJlbnROb2RlKCkpIHsKKyAgICAgICAgVmVjdG9yPE11dGF0aW9uT2Jz
ZXJ2ZXJFbnRyeT4qIG9ic2VydmVyRW50cmllcyA9IG5vZGUtPm11dGF0aW9uT2JzZXJ2ZXJFbnRy
aWVzKCk7CisgICAgICAgIGlmICghb2JzZXJ2ZXJFbnRyaWVzKQorICAgICAgICAgICAgY29udGlu
dWU7CisKKyAgICAgICAgY29uc3Qgc2l6ZV90IHNpemUgPSBvYnNlcnZlckVudHJpZXMtPnNpemUo
KTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKKyAgICAgICAg
ICAgIE11dGF0aW9uT2JzZXJ2ZXJFbnRyeSYgZW50cnkgPSBvYnNlcnZlckVudHJpZXMtPmF0KGkp
OworICAgICAgICAgICAgaWYgKGVudHJ5Lmhhc0FsbE9wdGlvbnMoV2ViS2l0TXV0YXRpb25PYnNl
cnZlcjo6U3VidHJlZSkpIHsKKyAgICAgICAgICAgICAgICBSZWZQdHI8Tm9kZT4gb2JzZXJ2ZWRO
b2RlID0gZW50cnkudHJhbnNpZW50T2ZOb2RlOworICAgICAgICAgICAgICAgIGlmICghb2JzZXJ2
ZWROb2RlKQorICAgICAgICAgICAgICAgICAgICBvYnNlcnZlZE5vZGUgPSBub2RlOworICAgICAg
ICAgICAgICAgIGVudHJ5Lm9ic2VydmVyLT5vYnNlcnZlZFN1YnRyZWVXaWxsRGlzY29ubmVjdChv
YnNlcnZlZE5vZGUsIGVudHJ5Lm9wdGlvbnMsIHRoaXMpOworICAgICAgICAgICAgfQorICAgICAg
ICB9CisgICAgfQorfQogI2VuZGlmIC8vIEVOQUJMRShNVVRBVElPTl9PQlNFUlZFUlMpCiAKIApk
aWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvZG9tL05vZGUuaCBiL1NvdXJjZS9XZWJDb3JlL2Rv
bS9Ob2RlLmgKaW5kZXggNjQyZGEwYmNiZWIwMzdkM2I2YjdiNjU3YmQ4YWJmZTlkYzU4YmI4Yi4u
NDY4MmUwYzAyMWY2MjM2Zjg3MDQxMTUxYWNjZWY2NjJjNDYyY2I3ZiAxMDA2NDQKLS0tIGEvU291
cmNlL1dlYkNvcmUvZG9tL05vZGUuaAorKysgYi9Tb3VyY2UvV2ViQ29yZS9kb20vTm9kZS5oCkBA
IC01OTAsMTUgKzU5MCwxNyBAQCBwdWJsaWM6CiAjZW5kaWYKIAogI2lmIEVOQUJMRShNVVRBVElP
Tl9PQlNFUlZFUlMpCi0gICAgdm9pZCBnZXRSZWdpc3RlcmVkTXV0YXRpb25PYnNlcnZlcnNPZlR5
cGUoVmVjdG9yPFdlYktpdE11dGF0aW9uT2JzZXJ2ZXIqPiYsIFdlYktpdE11dGF0aW9uT2JzZXJ2
ZXI6Ok11dGF0aW9uVHlwZSk7CisgICAgdm9pZCBnZXRSZWdpc3RlcmVkTXV0YXRpb25PYnNlcnZl
cnNPZlR5cGUoSGFzaE1hcDxXZWJLaXRNdXRhdGlvbk9ic2VydmVyKiwgTXV0YXRpb25PYnNlcnZl
ck9wdGlvbnM+JiwgV2ViS2l0TXV0YXRpb25PYnNlcnZlcjo6TXV0YXRpb25UeXBlKTsKIAogICAg
IGVudW0gTXV0YXRpb25SZWdpc3RyYXRpb25SZXN1bHQgewogICAgICAgICBNdXRhdGlvbk9ic2Vy
dmVyUmVnaXN0ZXJlZCwKICAgICAgICAgTXV0YXRpb25SZWdpc3RyYXRpb25PcHRpb25zUmVzZXQK
ICAgICB9OwotICAgIE11dGF0aW9uUmVnaXN0cmF0aW9uUmVzdWx0IHJlZ2lzdGVyTXV0YXRpb25P
YnNlcnZlcihQYXNzUmVmUHRyPFdlYktpdE11dGF0aW9uT2JzZXJ2ZXI+LCBNdXRhdGlvbk9ic2Vy
dmVyT3B0aW9ucyk7CisgICAgTXV0YXRpb25SZWdpc3RyYXRpb25SZXN1bHQgcmVnaXN0ZXJNdXRh
dGlvbk9ic2VydmVyKFBhc3NSZWZQdHI8V2ViS2l0TXV0YXRpb25PYnNlcnZlcj4sIE11dGF0aW9u
T2JzZXJ2ZXJPcHRpb25zLCBOb2RlKiB0cmFuc2llbnRPZk5vZGUgPSAwKTsKIAotICAgIHZvaWQg
dW5yZWdpc3Rlck11dGF0aW9uT2JzZXJ2ZXIoUGFzc1JlZlB0cjxXZWJLaXRNdXRhdGlvbk9ic2Vy
dmVyPik7CisgICAgdm9pZCB1bnJlZ2lzdGVyTXV0YXRpb25PYnNlcnZlcihQYXNzUmVmUHRyPFdl
YktpdE11dGF0aW9uT2JzZXJ2ZXI+LCBOb2RlKiB0cmFuc2llbnRPZk5vZGUgPSAwKTsKKworICAg
IHZvaWQgbm90aWZ5U3VidHJlZU9ic2VydmVyc09mRGlzY29ubmVjdGlvbigpOwogI2VuZGlmIC8v
IEVOQUJMRShNVVRBVElPTl9PQlNFUlZFUlMpCiAKIHByaXZhdGU6CmRpZmYgLS1naXQgYS9Tb3Vy
Y2UvV2ViQ29yZS9kb20vTm9kZVJhcmVEYXRhLmggYi9Tb3VyY2UvV2ViQ29yZS9kb20vTm9kZVJh
cmVEYXRhLmgKaW5kZXggNTAyYjY1OGZjMDRiZWE2ODc5MTcxNzU1MDVlOGM4YTE3MDI3NDk4Yi4u
ZWRjNDQ2ZTdkOWUyMTQwN2FlYjVmYzk1Y2VlMDQ0Nzk0ZTZjNThkMSAxMDA2NDQKLS0tIGEvU291
cmNlL1dlYkNvcmUvZG9tL05vZGVSYXJlRGF0YS5oCisrKyBiL1NvdXJjZS9XZWJDb3JlL2RvbS9O
b2RlUmFyZURhdGEuaApAQCAtOTAsMTUgKzkwLDE2IEBAIHByaXZhdGU6CiAKICNpZiBFTkFCTEUo
TVVUQVRJT05fT0JTRVJWRVJTKQogc3RydWN0IE11dGF0aW9uT2JzZXJ2ZXJFbnRyeSB7Ci0gICAg
TXV0YXRpb25PYnNlcnZlckVudHJ5KFBhc3NSZWZQdHI8V2ViS2l0TXV0YXRpb25PYnNlcnZlcj4g
b2JzZXJ2ZXIsIE11dGF0aW9uT2JzZXJ2ZXJPcHRpb25zIG9wdGlvbnMpCisgICAgTXV0YXRpb25P
YnNlcnZlckVudHJ5KFBhc3NSZWZQdHI8V2ViS2l0TXV0YXRpb25PYnNlcnZlcj4gb2JzZXJ2ZXIs
IE11dGF0aW9uT2JzZXJ2ZXJPcHRpb25zIG9wdGlvbnMsIE5vZGUqIG5vZGUpCiAgICAgICAgIDog
b2JzZXJ2ZXIob2JzZXJ2ZXIpCiAgICAgICAgICwgb3B0aW9ucyhvcHRpb25zKQorICAgICAgICAs
IHRyYW5zaWVudE9mTm9kZShub2RlKQogICAgIHsKICAgICB9CiAKICAgICBib29sIG9wZXJhdG9y
PT0oY29uc3QgTXV0YXRpb25PYnNlcnZlckVudHJ5JiBvdGhlcikgY29uc3QKICAgICB7Ci0gICAg
ICAgIHJldHVybiBvYnNlcnZlciA9PSBvdGhlci5vYnNlcnZlcjsKKyAgICAgICAgcmV0dXJuIG9i
c2VydmVyID09IG90aGVyLm9ic2VydmVyICYmIHRyYW5zaWVudE9mTm9kZSA9PSBvdGhlci50cmFu
c2llbnRPZk5vZGU7CiAgICAgfQogCiAgICAgYm9vbCBoYXNBbGxPcHRpb25zKE11dGF0aW9uT2Jz
ZXJ2ZXJPcHRpb25zIG9wdGlvbnMpIGNvbnN0CkBAIC0xMDgsNiArMTA5LDcgQEAgc3RydWN0IE11
dGF0aW9uT2JzZXJ2ZXJFbnRyeSB7CiAKICAgICBSZWZQdHI8V2ViS2l0TXV0YXRpb25PYnNlcnZl
cj4gb2JzZXJ2ZXI7CiAgICAgTXV0YXRpb25PYnNlcnZlck9wdGlvbnMgb3B0aW9uczsKKyAgICBO
b2RlKiB0cmFuc2llbnRPZk5vZGU7IC8vIFRoaXMgZG9lc24ndCBuZWVkIHRvIGJlIGEgUmVmUHRy
IGJlY2F1c2UgdGhlIG9ic2VydmVyIHdpbGwgYmUgaG9sZGluZyBhIFJlZlB0ciB0byB0aGUgc2Ft
ZSBub2RlIGF0IGxlYXN0IGZvciB0aGUgbGlmZXRpbWUgb2YgdGhpcyBFbnRyeSBpbiBpdHMgbV90
cmFuc2llbnRPYnNlcnZlZE5vZGVzIG1hcC4KIH07CiAjZW5kaWYgLy8gRU5BQkxFKE1VVEFUSU9O
X09CU0VSVkVSUykKIApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvZG9tL1dlYktpdE11dGF0
aW9uT2JzZXJ2ZXIuY3BwIGIvU291cmNlL1dlYkNvcmUvZG9tL1dlYktpdE11dGF0aW9uT2JzZXJ2
ZXIuY3BwCmluZGV4IDgzZjE1OTkwZWEyYmVjYTMzOWJiMGE3M2NjMjk2OWJhNGRmMjlmYTUuLjYy
ZjNjOTg4OWExOWU3ODFmZTk0OWE1MGIyMWUzOWU0YzM2NDJkZTcgMTAwNjQ0Ci0tLSBhL1NvdXJj
ZS9XZWJDb3JlL2RvbS9XZWJLaXRNdXRhdGlvbk9ic2VydmVyLmNwcAorKysgYi9Tb3VyY2UvV2Vi
Q29yZS9kb20vV2ViS2l0TXV0YXRpb25PYnNlcnZlci5jcHAKQEAgLTUzLDE0ICs1MywzMSBAQCBX
ZWJLaXRNdXRhdGlvbk9ic2VydmVyOjpXZWJLaXRNdXRhdGlvbk9ic2VydmVyKFBhc3NSZWZQdHI8
TXV0YXRpb25DYWxsYmFjaz4gY2FsbAogCiBXZWJLaXRNdXRhdGlvbk9ic2VydmVyOjp+V2ViS2l0
TXV0YXRpb25PYnNlcnZlcigpCiB7CisgICAgY2xlYXJUcmFuc2llbnRFbnRyaWVzKCk7Cit9CisK
K3N0YXRpYyB2b2lkIHVucmVnaXN0ZXJUcmFuc2llbnRFbnRyaWVzKFBhc3NPd25QdHI8Tm9kZUhh
c2hTZXQ+IHBvcFRyYW5zaWVudE5vZGVzLCBXZWJLaXRNdXRhdGlvbk9ic2VydmVyKiBvYnNlcnZl
ciwgTm9kZSogb2JzZXJ2ZWROb2RlKQoreworICAgIE93blB0cjxOb2RlSGFzaFNldD4gdHJhbnNp
ZW50Tm9kZXMgPSBwb3BUcmFuc2llbnROb2RlczsKKyAgICBmb3IgKE5vZGVIYXNoU2V0OjppdGVy
YXRvciBpdGVyID0gdHJhbnNpZW50Tm9kZXMtPmJlZ2luKCk7IGl0ZXIgIT0gdHJhbnNpZW50Tm9k
ZXMtPmVuZCgpOyArK2l0ZXIpCisgICAgICAgICgqaXRlciktPnVucmVnaXN0ZXJNdXRhdGlvbk9i
c2VydmVyKG9ic2VydmVyLCBvYnNlcnZlZE5vZGUpOwogfQogCiB2b2lkIFdlYktpdE11dGF0aW9u
T2JzZXJ2ZXI6Om9ic2VydmUoTm9kZSogbm9kZSwgTXV0YXRpb25PYnNlcnZlck9wdGlvbnMgb3B0
aW9ucykKIHsKICAgICAvLyBGSVhNRTogTW9yZSBvcHRpb25zIGNvbXBvc2l0aW9uIHdvcmsgbmVl
ZHMgdG8gYmUgZG9uZSBoZXJlLCBlLmcuLCB2YWxpZGF0aW9uLgogCi0gICAgaWYgKG5vZGUtPnJl
Z2lzdGVyTXV0YXRpb25PYnNlcnZlcih0aGlzLCBvcHRpb25zKSA9PSBOb2RlOjpNdXRhdGlvbk9i
c2VydmVyUmVnaXN0ZXJlZCkKKyAgICBpZiAobm9kZS0+cmVnaXN0ZXJNdXRhdGlvbk9ic2VydmVy
KHRoaXMsIG9wdGlvbnMpID09IE5vZGU6Ok11dGF0aW9uT2JzZXJ2ZXJSZWdpc3RlcmVkKSB7CiAg
ICAgICAgIG1fb2JzZXJ2ZWROb2Rlcy5hcHBlbmQobm9kZSk7CisgICAgICAgIHJldHVybjsKKyAg
ICB9CisKKyAgICBIYXNoTWFwPFJlZlB0cjxOb2RlPiwgTm9kZUhhc2hTZXQqPjo6aXRlcmF0b3Ig
aXRlciA9IG1fdHJhbnNpZW50T2JzZXJ2ZWROb2Rlcy5maW5kKG5vZGUpOworICAgIGlmIChpdGVy
ID09IG1fdHJhbnNpZW50T2JzZXJ2ZWROb2Rlcy5lbmQoKSkKKyAgICAgICAgcmV0dXJuOworCisg
ICAgdW5yZWdpc3RlclRyYW5zaWVudEVudHJpZXMoYWRvcHRQdHIoaXRlci0+c2Vjb25kKSwgdGhp
cywgbm9kZSk7CisgICAgbV90cmFuc2llbnRPYnNlcnZlZE5vZGVzLnJlbW92ZShpdGVyKTsKIH0K
IAogdm9pZCBXZWJLaXRNdXRhdGlvbk9ic2VydmVyOjpkaXNjb25uZWN0KCkKQEAgLTY5LDEwICs4
NiwxMyBAQCB2b2lkIFdlYktpdE11dGF0aW9uT2JzZXJ2ZXI6OmRpc2Nvbm5lY3QoKQogICAgICAg
ICBtX29ic2VydmVkTm9kZXNbaV0tPnVucmVnaXN0ZXJNdXRhdGlvbk9ic2VydmVyKHRoaXMpOwog
CiAgICAgbV9vYnNlcnZlZE5vZGVzLmNsZWFyKCk7CisgICAgY2xlYXJUcmFuc2llbnRFbnRyaWVz
KCk7CiB9CiAKIHZvaWQgV2ViS2l0TXV0YXRpb25PYnNlcnZlcjo6b2JzZXJ2ZWROb2RlRGVzdHJ1
Y3RlZChOb2RlKiBub2RlKQogeworICAgIEFTU0VSVCghbV90cmFuc2llbnRPYnNlcnZlZE5vZGVz
LmNvbnRhaW5zKG5vZGUpKTsKKwogICAgIHNpemVfdCBpbmRleCA9IG1fb2JzZXJ2ZWROb2Rlcy5m
aW5kKG5vZGUpOwogICAgIEFTU0VSVChpbmRleCAhPSBub3RGb3VuZCk7CiAgICAgaWYgKGluZGV4
ID09IG5vdEZvdW5kKQpAQCAtOTUsMTAgKzExNSwzNCBAQCB2b2lkIFdlYktpdE11dGF0aW9uT2Jz
ZXJ2ZXI6OmVucXVldWVNdXRhdGlvblJlY29yZChQYXNzUmVmUHRyPE11dGF0aW9uUmVjb3JkPiBt
dQogICAgIGFjdGl2ZU11dGF0aW9uT2JzZXJ2ZXJzKCkuYWRkKHRoaXMpOwogfQogCit2b2lkIFdl
YktpdE11dGF0aW9uT2JzZXJ2ZXI6Om9ic2VydmVkU3VidHJlZVdpbGxEaXNjb25uZWN0KFBhc3NS
ZWZQdHI8Tm9kZT4gcHJwT2JzZXJ2ZWROb2RlLCBNdXRhdGlvbk9ic2VydmVyT3B0aW9ucyBvcHRp
b25zLCBQYXNzUmVmUHRyPE5vZGU+IHBycERpc2Nvbm5lY3RpbmdOb2RlKQoreworICAgIFJlZlB0
cjxOb2RlPiBvYnNlcnZlZE5vZGUgPSBwcnBPYnNlcnZlZE5vZGU7CisgICAgUmVmUHRyPE5vZGU+
IGRpc2Nvbm5lY3RpbmdOb2RlID0gcHJwRGlzY29ubmVjdGluZ05vZGU7CisKKyAgICBkaXNjb25u
ZWN0aW5nTm9kZS0+cmVnaXN0ZXJNdXRhdGlvbk9ic2VydmVyKHRoaXMsIG9wdGlvbnMsIG9ic2Vy
dmVkTm9kZS5nZXQoKSk7CisgICAgSGFzaE1hcDxSZWZQdHI8Tm9kZT4sIE5vZGVIYXNoU2V0Kj46
Oml0ZXJhdG9yIGl0ZXIgPSBtX3RyYW5zaWVudE9ic2VydmVkTm9kZXMuZmluZChvYnNlcnZlZE5v
ZGUpOworICAgIGlmIChpdGVyID09IG1fdHJhbnNpZW50T2JzZXJ2ZWROb2Rlcy5lbmQoKSkgewor
ICAgICAgICBPd25QdHI8Tm9kZUhhc2hTZXQ+IHNldCA9IGFkb3B0UHRyKG5ldyBOb2RlSGFzaFNl
dCgpKTsKKyAgICAgICAgc2V0LT5hZGQoZGlzY29ubmVjdGluZ05vZGUpOworICAgICAgICBtX3Ry
YW5zaWVudE9ic2VydmVkTm9kZXMuc2V0KG9ic2VydmVkTm9kZSwgc2V0LmxlYWtQdHIoKSk7Cisg
ICAgfSBlbHNlCisgICAgICAgIGl0ZXItPnNlY29uZC0+YWRkKGRpc2Nvbm5lY3RpbmdOb2RlKTsK
K30KKwordm9pZCBXZWJLaXRNdXRhdGlvbk9ic2VydmVyOjpjbGVhclRyYW5zaWVudEVudHJpZXMo
KQoreworICAgIGZvciAoSGFzaE1hcDxSZWZQdHI8Tm9kZT4sIE5vZGVIYXNoU2V0Kj46Oml0ZXJh
dG9yIGl0ZXIgPSBtX3RyYW5zaWVudE9ic2VydmVkTm9kZXMuYmVnaW4oKTsgaXRlciAhPSBtX3Ry
YW5zaWVudE9ic2VydmVkTm9kZXMuZW5kKCk7ICsraXRlcikKKyAgICAgICAgdW5yZWdpc3RlclRy
YW5zaWVudEVudHJpZXMoYWRvcHRQdHIoaXRlci0+c2Vjb25kKSwgdGhpcywgaXRlci0+Zmlyc3Qu
Z2V0KCkpOworCisgICAgbV90cmFuc2llbnRPYnNlcnZlZE5vZGVzLmNsZWFyKCk7Cit9CisKIHZv
aWQgV2ViS2l0TXV0YXRpb25PYnNlcnZlcjo6ZGVsaXZlcigpCiB7CiAgICAgTXV0YXRpb25SZWNv
cmRBcnJheSByZWNvcmRzOwogICAgIHJlY29yZHMuc3dhcChtX3JlY29yZHMpOworICAgIGNsZWFy
VHJhbnNpZW50RW50cmllcygpOwogICAgIG1fY2FsbGJhY2stPmhhbmRsZUV2ZW50KCZyZWNvcmRz
LCB0aGlzKTsKIH0KIApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvZG9tL1dlYktpdE11dGF0
aW9uT2JzZXJ2ZXIuaCBiL1NvdXJjZS9XZWJDb3JlL2RvbS9XZWJLaXRNdXRhdGlvbk9ic2VydmVy
LmgKaW5kZXggZmMzMjg2MDk5ODRhYTEyMWEzY2JmODY5NDQwNDYxZWIyY2E2NTk4ZS4uMzdkOTJk
NWQ4NjcyMDBmZmEyNGIxMzZkYTgzYmE5MjgzYTg5NmQ5OSAxMDA2NDQKLS0tIGEvU291cmNlL1dl
YkNvcmUvZG9tL1dlYktpdE11dGF0aW9uT2JzZXJ2ZXIuaAorKysgYi9Tb3VyY2UvV2ViQ29yZS9k
b20vV2ViS2l0TXV0YXRpb25PYnNlcnZlci5oCkBAIC0zMyw2ICszMyw4IEBACiAKICNpZiBFTkFC
TEUoTVVUQVRJT05fT0JTRVJWRVJTKQogCisjaW5jbHVkZSA8d3RmL0hhc2hNYXAuaD4KKyNpbmNs
dWRlIDx3dGYvSGFzaFNldC5oPgogI2luY2x1ZGUgPHd0Zi9QYXNzT3duUHRyLmg+CiAjaW5jbHVk
ZSA8d3RmL1JlZkNvdW50ZWQuaD4KICNpbmNsdWRlIDx3dGYvUmVmUHRyLmg+CkBAIC00NSw2ICs0
Nyw3IEBAIGNsYXNzIE11dGF0aW9uUmVjb3JkOwogY2xhc3MgTm9kZTsKIAogdHlwZWRlZiB1bnNp
Z25lZCBjaGFyIE11dGF0aW9uT2JzZXJ2ZXJPcHRpb25zOwordHlwZWRlZiBIYXNoU2V0PFJlZlB0
cjxOb2RlPiA+IE5vZGVIYXNoU2V0OwogCiBjbGFzcyBXZWJLaXRNdXRhdGlvbk9ic2VydmVyIDog
cHVibGljIFJlZkNvdW50ZWQ8V2ViS2l0TXV0YXRpb25PYnNlcnZlcj4gewogcHVibGljOgpAQCAt
NjgsMTcgKzcxLDIyIEBAIHB1YmxpYzoKIAogICAgIHZvaWQgb2JzZXJ2ZShOb2RlKiwgTXV0YXRp
b25PYnNlcnZlck9wdGlvbnMpOwogICAgIHZvaWQgZGlzY29ubmVjdCgpOworICAgIHZvaWQgb2Jz
ZXJ2ZWRTdWJ0cmVlV2lsbERpc2Nvbm5lY3QoUGFzc1JlZlB0cjxOb2RlPiBvYnNlcnZlZE5vZGUs
IE11dGF0aW9uT2JzZXJ2ZXJPcHRpb25zLCBQYXNzUmVmUHRyPE5vZGU+IHBycERpc2Nvbm5lY3Rp
bmdOb2RlKTsKICAgICB2b2lkIG9ic2VydmVkTm9kZURlc3RydWN0ZWQoTm9kZSopOwogICAgIHZv
aWQgZW5xdWV1ZU11dGF0aW9uUmVjb3JkKFBhc3NSZWZQdHI8TXV0YXRpb25SZWNvcmQ+KTsKIAog
cHJpdmF0ZToKICAgICBXZWJLaXRNdXRhdGlvbk9ic2VydmVyKFBhc3NSZWZQdHI8TXV0YXRpb25D
YWxsYmFjaz4pOwogCisgICAgdm9pZCBjbGVhclRyYW5zaWVudEVudHJpZXMoKTsKICAgICB2b2lk
IGRlbGl2ZXIoKTsKIAogICAgIFJlZlB0cjxNdXRhdGlvbkNhbGxiYWNrPiBtX2NhbGxiYWNrOwog
ICAgIFZlY3RvcjxSZWZQdHI8TXV0YXRpb25SZWNvcmQ+ID4gbV9yZWNvcmRzOwogICAgIFZlY3Rv
cjxOb2RlKj4gbV9vYnNlcnZlZE5vZGVzOyAvLyBOb2RlUmFyZURhdGEgaGFzIGEgUmVmUHRyIHRv
IHRoaXMsIHNvIHVzZSBhIHdlYWsgcG9pbnRlciB0byBhdm9pZCBhIGN5Y2xlLgorCisgICAgLy8g
RklYTUU6IENoYW5nZSB0aGlzIHRvIGJlIE93blB0cjxOb2RlSGFzaFNldD4gd2hlbiBPd25QdHIg
c3VwcG9ydHMgYmVpbmcgY29udGFpbmVkIGFzIG1hcCB2YWx1ZXMuCisgICAgSGFzaE1hcDxSZWZQ
dHI8Tm9kZT4sIE5vZGVIYXNoU2V0Kj4gbV90cmFuc2llbnRPYnNlcnZlZE5vZGVzOwogfTsKIAog
fQpkaWZmIC0tZ2l0IGEvTGF5b3V0VGVzdHMvQ2hhbmdlTG9nIGIvTGF5b3V0VGVzdHMvQ2hhbmdl
TG9nCmluZGV4IGYzNDAyNWE4YWIwMjI0ZjRiZmJmNjNhNWE2MDA5Njc1ZTNhMzQ0ZmUuLjgzYjhl
YTRmMzU3MzM0MjY1MDRhOWFiYjFjMmMxMDRmZjViOTEwZWYgMTAwNjQ0Ci0tLSBhL0xheW91dFRl
c3RzL0NoYW5nZUxvZworKysgYi9MYXlvdXRUZXN0cy9DaGFuZ2VMb2cKQEAgLTEsMyArMSwxMyBA
QAorMjAxMS0xMC0yNCAgUmFmYWVsIFdlaW5zdGVpbiAgPHJhZmFlbHdAY2hyb21pdW0ub3JnPgor
CisgICAgICAgIFtNdXRhdGlvbk9ic2VydmVyc10gSW1wbGVtZW50IHN1YnRyZWUgb2JzZXJ2YXRp
b24gb2YgdHJhbnNpZW50bHkgZGlzY29ubmVjdGVkIG5vZGVzCisgICAgICAgIGh0dHBzOi8vYnVn
cy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD03MDc4OAorCisgICAgICAgIFJldmlld2VkIGJ5
IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgICogZmFzdC9tdXRhdGlvbi9vYnNlcnZlLXN1YnRy
ZWUtZXhwZWN0ZWQudHh0OgorICAgICAgICAqIGZhc3QvbXV0YXRpb24vb2JzZXJ2ZS1zdWJ0cmVl
Lmh0bWw6CisKIDIwMTEtMTAtMjUgIFJ5b3N1a2UgTml3YSAgPHJuaXdhQHdlYmtpdC5vcmc+CiAK
ICAgICAgICAgTW92aW5nIHRvIHRoZSBzdGFydCBvZiBsaW5lIHNob3VsZCBub3QgcGxhY2UgdGhl
IGNhcmV0IG91dHNpZGUgb2YgdGhlIHRhYmxlCmRpZmYgLS1naXQgYS9MYXlvdXRUZXN0cy9mYXN0
L211dGF0aW9uL29ic2VydmUtc3VidHJlZS1leHBlY3RlZC50eHQgYi9MYXlvdXRUZXN0cy9mYXN0
L211dGF0aW9uL29ic2VydmUtc3VidHJlZS1leHBlY3RlZC50eHQKaW5kZXggNTUyN2ViMWFjMzBl
MDI0MTI0N2RkMWE5MTI3MzA3M2ViNDZlYTNhZi4uNWYwYmVmZGJiZTkyNjVhYjE2Y2VmYzk3N2E4
ZThkYjZiMTJmNTRiZiAxMDA2NDQKLS0tIGEvTGF5b3V0VGVzdHMvZmFzdC9tdXRhdGlvbi9vYnNl
cnZlLXN1YnRyZWUtZXhwZWN0ZWQudHh0CisrKyBiL0xheW91dFRlc3RzL2Zhc3QvbXV0YXRpb24v
b2JzZXJ2ZS1zdWJ0cmVlLWV4cGVjdGVkLnR4dApAQCAtMzMsNiArMzMsNDggQEAgUEFTUyBtdXRh
dGlvbnNbMF0udGFyZ2V0IGlzIHN1YkRpdgogUEFTUyBtdXRhdGlvbnNbMF0uYXR0cmlidXRlTmFt
ZSBpcyAiZm9vIgogUEFTUyBtdXRhdGlvbnNbMF0uYXR0cmlidXRlTmFtZXNwYWNlIGlzIG51bGwK
IAorVGVzdGluZyB0aGF0IHRyYW5zaWVudGx5IGRpc2Nvbm5lY3RlZCBub2RlcyBhcmUgc3RpbGwg
b2JzZXJ2ZWQgdmlhIHN1YnRyZWUuCisuLi5ib3RoIGNoYW5nZXMgc2hvdWxkIGJlIHJlY2VpdmVk
LiBDaGFuZ2UgZGlzY29ubmVjdGVkIHN1YkRpdiBhZ2Fpbi4KK1BBU1MgbXV0YXRpb25zLmxlbmd0
aCBpcyAyCitQQVNTIG11dGF0aW9uc1swXS50eXBlIGlzICJhdHRyaWJ1dGVzIgorUEFTUyBtdXRh
dGlvbnNbMF0udGFyZ2V0IGlzIHN1YkRpdgorUEFTUyBtdXRhdGlvbnNbMF0uYXR0cmlidXRlTmFt
ZSBpcyAiZm9vIgorUEFTUyBtdXRhdGlvbnNbMV0udHlwZSBpcyAiYXR0cmlidXRlcyIKK1BBU1Mg
bXV0YXRpb25zWzFdLnRhcmdldCBpcyBzdWJEaXYKK1BBU1MgbXV0YXRpb25zWzFdLmF0dHJpYnV0
ZU5hbWUgaXMgInRlc3QiCisuLi50cmFuc2llbnQgc3VidHJlZSBvYnNlcnZhdGlvbiB3YXMgc3Rv
cHBlZCBhZnRlciBkZWxpdmVyeSwgc28gc3ViRGl2IGNoYW5nZSBzaG91bGQgbm90IGJlIHJlY2Vp
dmVkLiBSZWF0dGFjaCBhbmQgY2hhbmdlIGFnYWluLgorUEFTUyBtdXRhdGlvbnMgaXMgbnVsbAor
Li4ucmVhdHRhY2hlZCBzdWJ0cmVlIHNob3VsZCBub3cgYmUgb2JzZXJ2YWJsZS4gVHJ5IGRpc2Nv
bm5lY3RpbmcgYW5kIHJlLW9ic2VydmluZy4KK1BBU1MgbXV0YXRpb25zLmxlbmd0aCBpcyAxCitQ
QVNTIG11dGF0aW9uc1swXS50eXBlIGlzICJhdHRyaWJ1dGVzIgorUEFTUyBtdXRhdGlvbnNbMF0u
dGFyZ2V0IGlzIHN1YkRpdgorUEFTUyBtdXRhdGlvbnNbMF0uYXR0cmlidXRlTmFtZSBpcyAiZm9v
IgorLi4uVGhlIGNoYW5nZSBtYWRlIGJlZm9yZSByZS1vYnNlcnZpbmcgc2hvdWxkIGJlIHJlY2Vp
dmVkLCBidXQgbm90IHRoZSBvbmUgYWZ0ZXIuCitQQVNTIG11dGF0aW9ucy5sZW5ndGggaXMgMQor
UEFTUyBtdXRhdGlvbnNbMF0udHlwZSBpcyAiY2hhcmFjdGVyRGF0YSIKK1BBU1MgbXV0YXRpb25z
WzBdLnRhcmdldCBpcyBzdWJEaXYuZmlyc3RDaGlsZAorCitUZXN0aW5nIGNvcnJlY3QgYmVoYXZp
b3Igb2YgdHJhbnNpZW50IG9ic2VydmF0aW9uIHdpdGggY29tcGxleCBtb3ZlbWVudCAuCisuLi5B
bGwgY2hhbmdlcyBzaG91bGQgYmUgcmVjZWl2ZWQgZXhjZXB0IGZvciBzZXR0aW5nIHRoZSAiZCIg
YXR0cmlidXRlIG9uIHN1YkRpdjMgYmVmb3JlIGl0IHdhcyByZWFjaGFibGUgZnJvbSBkaXYuCitQ
QVNTIG11dGF0aW9ucy5sZW5ndGggaXMgNgorUEFTUyBtdXRhdGlvbnNbMF0udHlwZSBpcyAiYXR0
cmlidXRlcyIKK1BBU1MgbXV0YXRpb25zWzBdLnRhcmdldCBpcyBzdWJEaXYKK1BBU1MgbXV0YXRp
b25zWzBdLmF0dHJpYnV0ZU5hbWUgaXMgImEiCitQQVNTIG11dGF0aW9uc1sxXS50eXBlIGlzICJh
dHRyaWJ1dGVzIgorUEFTUyBtdXRhdGlvbnNbMV0udGFyZ2V0IGlzIHN1YkRpdjIKK1BBU1MgbXV0
YXRpb25zWzFdLmF0dHJpYnV0ZU5hbWUgaXMgImIiCitQQVNTIG11dGF0aW9uc1syXS50eXBlIGlz
ICJjaGFyYWN0ZXJEYXRhIgorUEFTUyBtdXRhdGlvbnNbMl0udGFyZ2V0IGlzIHRleHQKK1BBU1Mg
bXV0YXRpb25zWzNdLnR5cGUgaXMgImF0dHJpYnV0ZXMiCitQQVNTIG11dGF0aW9uc1szXS50YXJn
ZXQgaXMgc3ViRGl2MgorUEFTUyBtdXRhdGlvbnNbM10uYXR0cmlidXRlTmFtZSBpcyAiZSIKK1BB
U1MgbXV0YXRpb25zWzRdLnR5cGUgaXMgImF0dHJpYnV0ZXMiCitQQVNTIG11dGF0aW9uc1s0XS50
YXJnZXQgaXMgc3ViRGl2MworUEFTUyBtdXRhdGlvbnNbNF0uYXR0cmlidXRlTmFtZSBpcyAiZiIK
K1BBU1MgbXV0YXRpb25zWzVdLnR5cGUgaXMgImF0dHJpYnV0ZXMiCitQQVNTIG11dGF0aW9uc1s1
XS50YXJnZXQgaXMgc3ViRGl2MgorUEFTUyBtdXRhdGlvbnNbNV0uYXR0cmlidXRlTmFtZSBpcyAi
ZyIKKwogUEFTUyBzdWNjZXNzZnVsbHlQYXJzZWQgaXMgdHJ1ZQogCiBURVNUIENPTVBMRVRFCmRp
ZmYgLS1naXQgYS9MYXlvdXRUZXN0cy9mYXN0L211dGF0aW9uL29ic2VydmUtc3VidHJlZS5odG1s
IGIvTGF5b3V0VGVzdHMvZmFzdC9tdXRhdGlvbi9vYnNlcnZlLXN1YnRyZWUuaHRtbAppbmRleCBi
NTJhMjgzOWIxMTUzZjQ3YjFlZThjMTM2OGU5MDc4NDIzMTk4NWMyLi4zYzgyZjY2ODEwNTM1OTAz
MDI1ZTljM2Y1MmI0NThkMzU3ODBkMGZmIDEwMDY0NAotLS0gYS9MYXlvdXRUZXN0cy9mYXN0L211
dGF0aW9uL29ic2VydmUtc3VidHJlZS5odG1sCisrKyBiL0xheW91dFRlc3RzL2Zhc3QvbXV0YXRp
b24vb2JzZXJ2ZS1zdWJ0cmVlLmh0bWwKQEAgLTE1LDcgKzE1LDcgQEAgd2luZG93LmpzVGVzdElz
QXN5bmMgPSB0cnVlOwogdmFyIG11dGF0aW9uczsKIHZhciBtdXRhdGlvbnMyOwogdmFyIGRpdjsK
LXZhciBzdWJEaXY7Cit2YXIgc3ViRGl2LCBzdWJEaXYyLCBzdWJEaXYzLCB0ZXh0OwogdmFyIGNh
bGxzOwogCiBmdW5jdGlvbiB0ZXN0QmFzaWMoKSB7CkBAIC0xMzUsNyArMTM1LDE1OSBAQCBmdW5j
dGlvbiB0ZXN0TXVsdGlwbGVPYnNlcnZhdGlvbnMoKSB7CiAKICAgICBzdGFydCgpOwogfQotdmFy
IHRlc3RzID0gW3Rlc3RCYXNpYywgdGVzdE11bHRpcGxlT2JzZXJ2ZXJzLCB0ZXN0TXVsdGlwbGVP
YnNlcnZhdGlvbnNdOworCitmdW5jdGlvbiB0ZXN0VHJhbnNpZW50U3VidHJlZUJhc2ljKCkgewor
ICAgIHZhciBvYnNlcnZlcjsKKworICAgIGZ1bmN0aW9uIHN0YXJ0KCkgeworICAgICAgICBkZWJ1
ZygnVGVzdGluZyB0aGF0IHRyYW5zaWVudGx5IGRpc2Nvbm5lY3RlZCBub2RlcyBhcmUgc3RpbGwg
b2JzZXJ2ZWQgdmlhIHN1YnRyZWUuJyk7CisKKyAgICAgICAgbXV0YXRpb25zID0gbnVsbDsKKyAg
ICAgICAgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CisgICAgICAgIHN1YkRp
diA9IGRpdi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSk7CisgICAg
ICAgIHN1YkRpdi5pbm5lckhUTUwgPSAnaGVsbG8sIHdvcmxkJzsKKyAgICAgICAgb2JzZXJ2ZXIg
PSBuZXcgV2ViS2l0TXV0YXRpb25PYnNlcnZlcihmdW5jdGlvbihtdXRhdGlvbnMpIHsKKyAgICAg
ICAgICAgIHdpbmRvdy5tdXRhdGlvbnMgPSBtdXRhdGlvbnM7CisgICAgICAgIH0pOworCisgICAg
ICAgIG9ic2VydmVyLm9ic2VydmUoZGl2LCB7YXR0cmlidXRlczogdHJ1ZSwgY2hhcmFjdGVyRGF0
YTogdHJ1ZSwgc3VidHJlZTogdHJ1ZX0pOworICAgICAgICBzdWJEaXYuc2V0QXR0cmlidXRlKCdm
b28nLCAnYmFyJyk7CisgICAgICAgIGRpdi5yZW1vdmVDaGlsZChzdWJEaXYpOworICAgICAgICBz
dWJEaXYuc2V0QXR0cmlidXRlKCd0ZXN0JywgJ3Rlc3QnKTsKKyAgICAgICAgc2V0VGltZW91dChj
aGVja0RlbGl2ZXJlZEFuZENoYW5nZUFnYWluLCAwKTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiBj
aGVja0RlbGl2ZXJlZEFuZENoYW5nZUFnYWluKCkgeworICAgICAgICBkZWJ1ZygnLi4uYm90aCBj
aGFuZ2VzIHNob3VsZCBiZSByZWNlaXZlZC4gQ2hhbmdlIGRpc2Nvbm5lY3RlZCBzdWJEaXYgYWdh
aW4uJyk7CisKKyAgICAgICAgc2hvdWxkQmUoJ211dGF0aW9ucy5sZW5ndGgnLCAnMicpOworICAg
ICAgICBzaG91bGRCZSgnbXV0YXRpb25zWzBdLnR5cGUnLCAnImF0dHJpYnV0ZXMiJyk7CisgICAg
ICAgIHNob3VsZEJlKCdtdXRhdGlvbnNbMF0udGFyZ2V0JywgJ3N1YkRpdicpOworICAgICAgICBz
aG91bGRCZSgnbXV0YXRpb25zWzBdLmF0dHJpYnV0ZU5hbWUnLCAnImZvbyInKTsKKyAgICAgICAg
c2hvdWxkQmUoJ211dGF0aW9uc1sxXS50eXBlJywgJyJhdHRyaWJ1dGVzIicpOworICAgICAgICBz
aG91bGRCZSgnbXV0YXRpb25zWzFdLnRhcmdldCcsICdzdWJEaXYnKTsKKyAgICAgICAgc2hvdWxk
QmUoJ211dGF0aW9uc1sxXS5hdHRyaWJ1dGVOYW1lJywgJyJ0ZXN0IicpOworCisgICAgICAgIG11
dGF0aW9ucyA9IG51bGw7CisgICAgICAgIHN1YkRpdi5zZXRBdHRyaWJ1dGUoJ2ZvbycsICdiYXon
KTsKKworICAgICAgICBzZXRUaW1lb3V0KGNoZWNrTm90RGVsaXZlcmVkQW5kUmVhdHRhY2gpOwor
ICAgIH0KKworICAgIGZ1bmN0aW9uIGNoZWNrTm90RGVsaXZlcmVkQW5kUmVhdHRhY2goKSB7Cisg
ICAgICAgIGRlYnVnKCcuLi50cmFuc2llbnQgc3VidHJlZSBvYnNlcnZhdGlvbiB3YXMgc3RvcHBl
ZCBhZnRlciBkZWxpdmVyeSwgc28gc3ViRGl2IGNoYW5nZSBzaG91bGQgbm90IGJlIHJlY2VpdmVk
LiBSZWF0dGFjaCBhbmQgY2hhbmdlIGFnYWluLicpOworCisgICAgICAgIHNob3VsZEJlKCdtdXRh
dGlvbnMnLCAnbnVsbCcpOworCisgICAgICAgIG11dGF0aW9ucyA9IG51bGwKKyAgICAgICAgZGl2
LmFwcGVuZENoaWxkKHN1YkRpdik7CisgICAgICAgIHN1YkRpdi5zZXRBdHRyaWJ1dGUoJ2Zvbycs
ICdiYXQnKTsKKworICAgICAgICBzZXRUaW1lb3V0KGNoZWNrRGVsaXZlcmVkQW5kUmVvYnNlcnZl
KTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiBjaGVja0RlbGl2ZXJlZEFuZFJlb2JzZXJ2ZSgpIHsK
KyAgICAgICAgZGVidWcoJy4uLnJlYXR0YWNoZWQgc3VidHJlZSBzaG91bGQgbm93IGJlIG9ic2Vy
dmFibGUuIFRyeSBkaXNjb25uZWN0aW5nIGFuZCByZS1vYnNlcnZpbmcuJyk7CisKKyAgICAgICAg
c2hvdWxkQmUoJ211dGF0aW9ucy5sZW5ndGgnLCAnMScpOworICAgICAgICBzaG91bGRCZSgnbXV0
YXRpb25zWzBdLnR5cGUnLCAnImF0dHJpYnV0ZXMiJyk7CisgICAgICAgIHNob3VsZEJlKCdtdXRh
dGlvbnNbMF0udGFyZ2V0JywgJ3N1YkRpdicpOworICAgICAgICBzaG91bGRCZSgnbXV0YXRpb25z
WzBdLmF0dHJpYnV0ZU5hbWUnLCAnImZvbyInKTsKKworICAgICAgICBtdXRhdGlvbnMgPSBudWxs
OworICAgICAgICBkaXYucmVtb3ZlQ2hpbGQoc3ViRGl2KTsKKyAgICAgICAgc3ViRGl2LmZpcnN0
Q2hpbGQudGV4dENvbnRlbnQgPSAnYmFkYnllJzsKKyAgICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZShk
aXYsIHthdHRyaWJ1dGVzOiB0cnVlLCBjaGFyYWN0ZXJEYXRhOiB0cnVlLCBzdWJ0cmVlOiB0cnVl
fSk7CisgICAgICAgIHN1YkRpdi5zZXRBdHRyaWJ1dGUoJ2ZvbycsICdib28nKTsKKworICAgICAg
ICBzZXRUaW1lb3V0KGZpbmlzaCk7CisgICAgfQorCisKKyAgICBmdW5jdGlvbiBmaW5pc2goKSB7
CisgICAgICAgIGRlYnVnKCcuLi5UaGUgY2hhbmdlIG1hZGUgYmVmb3JlIHJlLW9ic2VydmluZyBz
aG91bGQgYmUgcmVjZWl2ZWQsIGJ1dCBub3QgdGhlIG9uZSBhZnRlci4nKTsKKworICAgICAgICBz
aG91bGRCZSgnbXV0YXRpb25zLmxlbmd0aCcsICcxJyk7CisgICAgICAgIHNob3VsZEJlKCdtdXRh
dGlvbnNbMF0udHlwZScsICciY2hhcmFjdGVyRGF0YSInKTsKKyAgICAgICAgc2hvdWxkQmUoJ211
dGF0aW9uc1swXS50YXJnZXQnLCAnc3ViRGl2LmZpcnN0Q2hpbGQnKTsKKworICAgICAgICBvYnNl
cnZlci5kaXNjb25uZWN0KCk7CisgICAgICAgIGRlYnVnKCcnKTsKKyAgICAgICAgcnVuTmV4dFRl
c3QoKTsKKyAgICB9CisgICAgc3RhcnQoKTsKK30KKworZnVuY3Rpb24gdGVzdFRyYW5zaWVudFN1
YnRyZWVEZXRhaWxlZCgpIHsKKyAgICB2YXIgb2JzZXJ2ZXI7CisKKyAgICBmdW5jdGlvbiBzdGFy
dCgpIHsKKyAgICAgICAgZGVidWcoJ1Rlc3RpbmcgY29ycmVjdCBiZWhhdmlvciBvZiB0cmFuc2ll
bnQgb2JzZXJ2YXRpb24gd2l0aCBjb21wbGV4IG1vdmVtZW50IC4nKTsKKworICAgICAgICBtdXRh
dGlvbnMgPSBudWxsOworICAgICAgICBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYn
KTsKKyAgICAgICAgc3ViRGl2ID0gZGl2LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1l
bnQoJ2RpdicpKTsKKyAgICAgICAgc3ViRGl2MiA9IHN1YkRpdi5hcHBlbmRDaGlsZChkb2N1bWVu
dC5jcmVhdGVFbGVtZW50KCdkaXYnKSk7CisgICAgICAgIHN1YkRpdjIuaW5uZXJIVE1MID0gJ2hl
bGxvLCB3b3JsZCc7CisgICAgICAgIHN1YkRpdjMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdk
aXYnKTsKKworICAgICAgICBvYnNlcnZlciA9IG5ldyBXZWJLaXRNdXRhdGlvbk9ic2VydmVyKGZ1
bmN0aW9uKG11dGF0aW9ucykgeworICAgICAgICAgICAgd2luZG93Lm11dGF0aW9ucyA9IG11dGF0
aW9uczsKKyAgICAgICAgfSk7CisKKyAgICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZShkaXYsIHthdHRy
aWJ1dGVzOiB0cnVlLCBjaGFyYWN0ZXJEYXRhOiB0cnVlLCBzdWJ0cmVlOiB0cnVlfSk7CisgICAg
ICAgIGRpdi5yZW1vdmVDaGlsZChzdWJEaXYpOworICAgICAgICBzdWJEaXYucmVtb3ZlQ2hpbGQo
c3ViRGl2Mik7CisgICAgICAgIHRleHQgPSBzdWJEaXYyLnJlbW92ZUNoaWxkKHN1YkRpdjIuZmly
c3RDaGlsZCk7CisKKyAgICAgICAgc3ViRGl2LnNldEF0dHJpYnV0ZSgnYScsICdhJyk7CisgICAg
ICAgIHN1YkRpdjIuc2V0QXR0cmlidXRlKCdiJywgJ2InKTsKKyAgICAgICAgdGV4dC50ZXh0Q29u
dGVudCA9ICdjJzsKKyAgICAgICAgc3ViRGl2My5hcHBlbmRDaGlsZChzdWJEaXYyKTsKKyAgICAg
ICAgc3ViRGl2My5zZXRBdHRyaWJ1dGUoJ2QnLCAnZCcpOworICAgICAgICBzdWJEaXYyLnNldEF0
dHJpYnV0ZSgnZScsICdlJyk7CisgICAgICAgIGRpdi5hcHBlbmRDaGlsZChzdWJEaXYzKTsKKyAg
ICAgICAgc3ViRGl2My5zZXRBdHRyaWJ1dGUoJ2YnLCAnZicpOworICAgICAgICBzdWJEaXYyLnNl
dEF0dHJpYnV0ZSgnZycsICdnJyk7CisKKyAgICAgICAgc2V0VGltZW91dChmaW5pc2gsIDApOwor
ICAgIH0KKworICAgIGZ1bmN0aW9uIGZpbmlzaCgpIHsKKyAgICAgICAgZGVidWcoJy4uLkFsbCBj
aGFuZ2VzIHNob3VsZCBiZSByZWNlaXZlZCBleGNlcHQgZm9yIHNldHRpbmcgdGhlICJkIiBhdHRy
aWJ1dGUgb24gc3ViRGl2MyBiZWZvcmUgaXQgd2FzIHJlYWNoYWJsZSBmcm9tIGRpdi4nKTsKKwor
ICAgICAgICBzaG91bGRCZSgnbXV0YXRpb25zLmxlbmd0aCcsICc2Jyk7CisgICAgICAgIHNob3Vs
ZEJlKCdtdXRhdGlvbnNbMF0udHlwZScsICciYXR0cmlidXRlcyInKTsKKyAgICAgICAgc2hvdWxk
QmUoJ211dGF0aW9uc1swXS50YXJnZXQnLCAnc3ViRGl2Jyk7CisgICAgICAgIHNob3VsZEJlKCdt
dXRhdGlvbnNbMF0uYXR0cmlidXRlTmFtZScsICciYSInKTsKKworICAgICAgICBzaG91bGRCZSgn
bXV0YXRpb25zWzFdLnR5cGUnLCAnImF0dHJpYnV0ZXMiJyk7CisgICAgICAgIHNob3VsZEJlKCdt
dXRhdGlvbnNbMV0udGFyZ2V0JywgJ3N1YkRpdjInKTsKKyAgICAgICAgc2hvdWxkQmUoJ211dGF0
aW9uc1sxXS5hdHRyaWJ1dGVOYW1lJywgJyJiIicpOworCisgICAgICAgIHNob3VsZEJlKCdtdXRh
dGlvbnNbMl0udHlwZScsICciY2hhcmFjdGVyRGF0YSInKTsKKyAgICAgICAgc2hvdWxkQmUoJ211
dGF0aW9uc1syXS50YXJnZXQnLCAndGV4dCcpOworCisgICAgICAgIHNob3VsZEJlKCdtdXRhdGlv
bnNbM10udHlwZScsICciYXR0cmlidXRlcyInKTsKKyAgICAgICAgc2hvdWxkQmUoJ211dGF0aW9u
c1szXS50YXJnZXQnLCAnc3ViRGl2MicpOworICAgICAgICBzaG91bGRCZSgnbXV0YXRpb25zWzNd
LmF0dHJpYnV0ZU5hbWUnLCAnImUiJyk7CisKKyAgICAgICAgc2hvdWxkQmUoJ211dGF0aW9uc1s0
XS50eXBlJywgJyJhdHRyaWJ1dGVzIicpOworICAgICAgICBzaG91bGRCZSgnbXV0YXRpb25zWzRd
LnRhcmdldCcsICdzdWJEaXYzJyk7CisgICAgICAgIHNob3VsZEJlKCdtdXRhdGlvbnNbNF0uYXR0
cmlidXRlTmFtZScsICciZiInKTsKKworICAgICAgICBzaG91bGRCZSgnbXV0YXRpb25zWzVdLnR5
cGUnLCAnImF0dHJpYnV0ZXMiJyk7CisgICAgICAgIHNob3VsZEJlKCdtdXRhdGlvbnNbNV0udGFy
Z2V0JywgJ3N1YkRpdjInKTsKKyAgICAgICAgc2hvdWxkQmUoJ211dGF0aW9uc1s1XS5hdHRyaWJ1
dGVOYW1lJywgJyJnIicpOworCisgICAgICAgIG9ic2VydmVyLmRpc2Nvbm5lY3QoKTsKKyAgICAg
ICAgZGVidWcoJycpOworICAgICAgICBydW5OZXh0VGVzdCgpOworICAgIH0KKyAgICBzdGFydCgp
OworfQorCit2YXIgdGVzdHMgPSBbdGVzdEJhc2ljLCB0ZXN0TXVsdGlwbGVPYnNlcnZlcnMsIHRl
c3RNdWx0aXBsZU9ic2VydmF0aW9ucywgdGVzdFRyYW5zaWVudFN1YnRyZWVCYXNpYywgdGVzdFRy
YW5zaWVudFN1YnRyZWVEZXRhaWxlZF07CiB2YXIgdGVzdEluZGV4ID0gMDsKIAogZnVuY3Rpb24g
cnVuTmV4dFRlc3QoKSB7Cg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>112626</attachid>
            <date>2011-10-26 17:40:59 -0700</date>
            <delta_ts>2011-10-27 11:24:20 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-70788-20111026174058.patch</filename>
            <type>text/plain</type>
            <size>33175</size>
            <attacher name="Rafael Weinstein">rafaelw</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogOTg1MjAKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0No
YW5nZUxvZyBiL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwppbmRleCA0MmMzMDJjZjAyYjExMTJk
MzYyYmZlNTM3ZTgxYTI1ZmFjZjdiOTlmLi5jMDM3MGZjM2M1ZTY0NTRmNzI4NjNkMjk5NTU4MjAw
ZWJhMmRlNWM3IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvU291
cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsNTEgQEAKKzIwMTEtMTAtMjQgIFJhZmFl
bCBXZWluc3RlaW4gIDxyYWZhZWx3QGNocm9taXVtLm9yZz4KKworICAgICAgICBbTXV0YXRpb25P
YnNlcnZlcnNdIEltcGxlbWVudCBzdWJ0cmVlIG9ic2VydmF0aW9uIG9mIHRyYW5zaWVudGx5IGRp
c2Nvbm5lY3RlZCBub2RlcworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1
Zy5jZ2k/aWQ9NzA3ODgKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKwor
ICAgICAgICBUaGlzIHBhdGNoIGFkZHMgc3VwcG9ydCBmb3Igb2JzZXJ2aW5nIGFsbCBkZXNjZW5k
YW50IG5vZGVzIHJlYWNoYWJsZSBmcm9tIGEgc3VidHJlZQorICAgICAgICBvYnNlcnZhdGlvbiB1
bnRpbCBkZWxpdmVyeSBvZiBtdXRhdGlvbnMgLS0gZXZlbiBpZiB0aGV5IGJlY29tZSBkZXRhY2hl
ZC4gV2UgZG8gdGhpcyBieQorICAgICAgICBpbnRyb2R1Y2luZyBhICJ0cmFuc2llbnQgcmVnaXN0
cmF0aW9uIiB3aGljaCBjYW4gZXhpc3QgZm9yIGEgc2hvcnQgdGltZSBhbG9uZyBzaWRlCisgICAg
ICAgIG5vcm1hbCByZWdpc3RyYXRpb25zIG9uIE5vZGUuIFRyYW5zaWVudCByZWdpc3RyYXRpb25z
IGhhdmUgYSByZWZlcmVuY2UgdG8gdGhlIG5vZGUKKyAgICAgICAgd2hpY2ggIm93bnMiIHRoZSBz
dWJ0cmVlIG9ic2VydmF0aW9uIHJlZ2lzdHJhdGlvbiAodGhlICJyZWdpc3RyYXRpb25Ob2RlIiku
IFRyYW5zaWVudAorICAgICAgICByZWdpc3RyYXRpb25zIGFyZSBjbGVhcmVkIGltbWVkaWF0ZWx5
IGJlZm9yZSBtdXRhdGlvbnMgYXJlIGRlbGl2ZXJlZCB0byBhbiBvYnNlcnZlciwKKyAgICAgICAg
b3Igd2hlbiB0aGUgb2JzZXJ2ZXIgcmUtb2JzZXJ2ZXMgYXQgdGhlIHJlZ2lzdHJhdGlvbk5vZGUs
IGluLWVmZmVjdCByZXNldHRpbmcgdGhlCisgICAgICAgIG9ic2VydmF0aW9uLgorCisgICAgICAg
IE5ldyB0ZXN0cyBhZGRlZCB0byBmYXN0L211dGF0aW9uL29ic2VydmUtc3VidHJlZS5odG1sLgor
CisgICAgICAgICogZG9tL0NoYXJhY3RlckRhdGEuY3BwOgorICAgICAgICAoV2ViQ29yZTo6Q2hh
cmFjdGVyRGF0YTo6ZGlzcGF0Y2hNb2RpZmllZEV2ZW50KToKKyAgICAgICAgKiBkb20vQ2hpbGRM
aXN0TXV0YXRpb25TY29wZS5jcHA6CisgICAgICAgIChXZWJDb3JlOjpNdXRhdGlvbkFjY3VtdWxh
dGlvblJvdXRlcjo6Q2hpbGRMaXN0TXV0YXRpb25BY2N1bXVsYXRvcjo6Q2hpbGRMaXN0TXV0YXRp
b25BY2N1bXVsYXRvcik6CisgICAgICAgIChXZWJDb3JlOjpNdXRhdGlvbkFjY3VtdWxhdGlvblJv
dXRlcjo6Q2hpbGRMaXN0TXV0YXRpb25BY2N1bXVsYXRvcjo6ZW5xdWV1ZU11dGF0aW9uUmVjb3Jk
KToKKyAgICAgICAgKFdlYkNvcmU6Ok11dGF0aW9uQWNjdW11bGF0aW9uUm91dGVyOjpNdXRhdGlv
bkFjY3VtdWxhdGlvblJvdXRlcjo6aW5jcmVtZW50U2NvcGluZ0xldmVsKToKKyAgICAgICAgKiBk
b20vQ29udGFpbmVyTm9kZS5jcHA6CisgICAgICAgIChXZWJDb3JlOjpkaXNwYXRjaENoaWxkUmVt
b3ZhbEV2ZW50cyk6CisgICAgICAgICogZG9tL0VsZW1lbnQuY3BwOgorICAgICAgICAoV2ViQ29y
ZTo6ZW5xdWV1ZUF0dHJpYnV0ZXNNdXRhdGlvblJlY29yZCk6CisgICAgICAgICogZG9tL05vZGUu
Y3BwOgorICAgICAgICAoV2ViQ29yZTo6YWRkTWF0Y2hpbmdPYnNlcnZlcnMpOgorICAgICAgICAo
V2ViQ29yZTo6Tm9kZTo6Z2V0UmVnaXN0ZXJlZE11dGF0aW9uT2JzZXJ2ZXJzT2ZUeXBlKToKKyAg
ICAgICAgKFdlYkNvcmU6Ok5vZGU6OnJlZ2lzdGVyTXV0YXRpb25PYnNlcnZlcik6CisgICAgICAg
IChXZWJDb3JlOjpOb2RlOjp1bnJlZ2lzdGVyTXV0YXRpb25PYnNlcnZlcik6CisgICAgICAgIChX
ZWJDb3JlOjpOb2RlOjpub3RpZnlTdWJ0cmVlT2JzZXJ2ZXJzT2ZEaXNjb25uZWN0aW9uKToKKyAg
ICAgICAgKiBkb20vTm9kZS5oOgorICAgICAgICAqIGRvbS9Ob2RlUmFyZURhdGEuaDoKKyAgICAg
ICAgKFdlYkNvcmU6Ok11dGF0aW9uT2JzZXJ2ZXJFbnRyeTo6TXV0YXRpb25PYnNlcnZlckVudHJ5
KToKKyAgICAgICAgKFdlYkNvcmU6Ok11dGF0aW9uT2JzZXJ2ZXJFbnRyeTo6b3BlcmF0b3I9PSk6
CisgICAgICAgICogZG9tL1dlYktpdE11dGF0aW9uT2JzZXJ2ZXIuY3BwOgorICAgICAgICAoV2Vi
Q29yZTo6V2ViS2l0TXV0YXRpb25PYnNlcnZlcjo6b2JzZXJ2ZSk6CisgICAgICAgIChXZWJDb3Jl
Ojp1bnJlZ2lzdGVyVHJhbnNpZW50RW50cmllcyk6CisgICAgICAgIChXZWJDb3JlOjpXZWJLaXRN
dXRhdGlvbk9ic2VydmVyOjpkaXNjb25uZWN0KToKKyAgICAgICAgKFdlYkNvcmU6OldlYktpdE11
dGF0aW9uT2JzZXJ2ZXI6Om9ic2VydmVkTm9kZURlc3RydWN0ZWQpOgorICAgICAgICAoV2ViQ29y
ZTo6V2ViS2l0TXV0YXRpb25PYnNlcnZlcjo6b2JzZXJ2ZWRTdWJ0cmVlV2lsbERpc2Nvbm5lY3Qp
OgorICAgICAgICAoV2ViQ29yZTo6V2ViS2l0TXV0YXRpb25PYnNlcnZlcjo6Y2xlYXJUcmFuc2ll
bnRFbnRyaWVzKToKKyAgICAgICAgKFdlYkNvcmU6OldlYktpdE11dGF0aW9uT2JzZXJ2ZXI6OmRl
bGl2ZXIpOgorICAgICAgICAqIGRvbS9XZWJLaXRNdXRhdGlvbk9ic2VydmVyLmg6CisKIDIwMTEt
MTAtMjYgIERhbiBCZXJuc3RlaW4gIDxtaXR6QGFwcGxlLmNvbT4KIAogICAgICAgICA8cmRhcjov
L3Byb2JsZW0vMTAzNTA3NzU+IFJFR1JFU1NJT04gKHI5NzAzMik6IFNsaWRlciB0aHVtYiBpcyBu
b3QgZHJhd24KZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2RvbS9DaGFyYWN0ZXJEYXRhLmNw
cCBiL1NvdXJjZS9XZWJDb3JlL2RvbS9DaGFyYWN0ZXJEYXRhLmNwcAppbmRleCA1ZTg0MWViMzhm
NzQ4YjY2YzRmNmNjZDI1MDJmYzRkYTU1ZGMxZjk1Li4zN2E3ZmJmZmJhMmFhOWYzMWU5NjY5M2Ji
N2FjOTcyOGI1MjM0YjUzIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9kb20vQ2hhcmFjdGVy
RGF0YS5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvZG9tL0NoYXJhY3RlckRhdGEuY3BwCkBAIC0x
OTMsMTIgKzE5MywxMiBAQCB2b2lkIENoYXJhY3RlckRhdGE6OnVwZGF0ZVJlbmRlcmVyKHVuc2ln
bmVkIG9mZnNldE9mUmVwbGFjZWREYXRhLCB1bnNpZ25lZCBsZW5ndAogdm9pZCBDaGFyYWN0ZXJE
YXRhOjpkaXNwYXRjaE1vZGlmaWVkRXZlbnQoU3RyaW5nSW1wbCogb2xkRGF0YSkKIHsKICNpZiBF
TkFCTEUoTVVUQVRJT05fT0JTRVJWRVJTKQotICAgIFZlY3RvcjxXZWJLaXRNdXRhdGlvbk9ic2Vy
dmVyKj4gb2JzZXJ2ZXJzOworICAgIEhhc2hNYXA8V2ViS2l0TXV0YXRpb25PYnNlcnZlciosIE11
dGF0aW9uT2JzZXJ2ZXJPcHRpb25zPiBvYnNlcnZlcnM7CiAgICAgZ2V0UmVnaXN0ZXJlZE11dGF0
aW9uT2JzZXJ2ZXJzT2ZUeXBlKG9ic2VydmVycywgV2ViS2l0TXV0YXRpb25PYnNlcnZlcjo6Q2hh
cmFjdGVyRGF0YSk7CiAgICAgaWYgKCFvYnNlcnZlcnMuaXNFbXB0eSgpKSB7CiAgICAgICAgIFJl
ZlB0cjxNdXRhdGlvblJlY29yZD4gbXV0YXRpb24gPSBNdXRhdGlvblJlY29yZDo6Y3JlYXRlQ2hh
cmFjdGVyRGF0YSh0aGlzKTsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvYnNlcnZl
cnMuc2l6ZSgpOyArK2kpCi0gICAgICAgICAgICBvYnNlcnZlcnNbaV0tPmVucXVldWVNdXRhdGlv
blJlY29yZChtdXRhdGlvbik7CisgICAgICAgIGZvciAoSGFzaE1hcDxXZWJLaXRNdXRhdGlvbk9i
c2VydmVyKiwgTXV0YXRpb25PYnNlcnZlck9wdGlvbnM+OjppdGVyYXRvciBpdGVyID0gb2JzZXJ2
ZXJzLmJlZ2luKCk7IGl0ZXIgIT0gb2JzZXJ2ZXJzLmVuZCgpOyArK2l0ZXIpCisgICAgICAgICAg
ICAgICAgaXRlci0+Zmlyc3QtPmVucXVldWVNdXRhdGlvblJlY29yZChtdXRhdGlvbik7CiAgICAg
fQogI2VuZGlmCiAgICAgaWYgKHBhcmVudE5vZGUoKSkKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJD
b3JlL2RvbS9DaGlsZExpc3RNdXRhdGlvblNjb3BlLmNwcCBiL1NvdXJjZS9XZWJDb3JlL2RvbS9D
aGlsZExpc3RNdXRhdGlvblNjb3BlLmNwcAppbmRleCA0ZTVmMGE5MGQ3NjU5MjdlNzY0N2E0MDkx
NmU4M2ZkMjQzYjRlZmMzLi41ZGNiZGNmZjMwZGFhOThjYjkwMWI3YjZlZWEwZTRkMTY5OGZlNjJi
IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9kb20vQ2hpbGRMaXN0TXV0YXRpb25TY29wZS5j
cHAKKysrIGIvU291cmNlL1dlYkNvcmUvZG9tL0NoaWxkTGlzdE11dGF0aW9uU2NvcGUuY3BwCkBA
IC01Myw3ICs1Myw3IEBAIG5hbWVzcGFjZSB7CiBjbGFzcyBDaGlsZExpc3RNdXRhdGlvbkFjY3Vt
dWxhdG9yIDogcHVibGljIFJlZkNvdW50ZWQ8Q2hpbGRMaXN0TXV0YXRpb25BY2N1bXVsYXRvcj4g
ewogICAgIFdURl9NQUtFX05PTkNPUFlBQkxFKENoaWxkTGlzdE11dGF0aW9uQWNjdW11bGF0b3Ip
OwogcHVibGljOgotICAgIENoaWxkTGlzdE11dGF0aW9uQWNjdW11bGF0b3IoUGFzc1JlZlB0cjxO
b2RlPiwgVmVjdG9yPFdlYktpdE11dGF0aW9uT2JzZXJ2ZXIqPiYpOworICAgIENoaWxkTGlzdE11
dGF0aW9uQWNjdW11bGF0b3IoUGFzc1JlZlB0cjxOb2RlPiwgSGFzaE1hcDxXZWJLaXRNdXRhdGlv
bk9ic2VydmVyKiwgTXV0YXRpb25PYnNlcnZlck9wdGlvbnM+Jik7CiAgICAgfkNoaWxkTGlzdE11
dGF0aW9uQWNjdW11bGF0b3IoKTsKIAogICAgIHZvaWQgY2hpbGRBZGRlZChQYXNzUmVmUHRyPE5v
ZGU+KTsKQEAgLTczLDcgKzczLDcgQEAgcHJpdmF0ZToKICAgICBSZWZQdHI8Tm9kZT4gbV9uZXh0
U2libGluZzsKICAgICBSZWZQdHI8Tm9kZT4gbV9sYXN0QWRkZWQ7CiAKLSAgICBWZWN0b3I8V2Vi
S2l0TXV0YXRpb25PYnNlcnZlcio+IG1fb2JzZXJ2ZXJzOworICAgIEhhc2hNYXA8V2ViS2l0TXV0
YXRpb25PYnNlcnZlciosIE11dGF0aW9uT2JzZXJ2ZXJPcHRpb25zPiBtX29ic2VydmVyczsKIH07
CiAKIGNsYXNzIE11dGF0aW9uQWNjdW11bGF0aW9uUm91dGVyIHsKQEAgLTEwMCw3ICsxMDAsNyBA
QCBwcml2YXRlOgogICAgIHN0YXRpYyBNdXRhdGlvbkFjY3VtdWxhdGlvblJvdXRlciogc19pbnN0
YW5jZTsKIH07CiAKLUNoaWxkTGlzdE11dGF0aW9uQWNjdW11bGF0b3I6OkNoaWxkTGlzdE11dGF0
aW9uQWNjdW11bGF0b3IoUGFzc1JlZlB0cjxOb2RlPiB0YXJnZXQsIFZlY3RvcjxXZWJLaXRNdXRh
dGlvbk9ic2VydmVyKj4mIG9ic2VydmVycykKK0NoaWxkTGlzdE11dGF0aW9uQWNjdW11bGF0b3I6
OkNoaWxkTGlzdE11dGF0aW9uQWNjdW11bGF0b3IoUGFzc1JlZlB0cjxOb2RlPiB0YXJnZXQsIEhh
c2hNYXA8V2ViS2l0TXV0YXRpb25PYnNlcnZlciosIE11dGF0aW9uT2JzZXJ2ZXJPcHRpb25zPiYg
b2JzZXJ2ZXJzKQogICAgIDogbV90YXJnZXQodGFyZ2V0KQogewogICAgIG1fb2JzZXJ2ZXJzLnN3
YXAob2JzZXJ2ZXJzKTsKQEAgLTE2OSw4ICsxNjksOCBAQCB2b2lkIENoaWxkTGlzdE11dGF0aW9u
QWNjdW11bGF0b3I6OmVucXVldWVNdXRhdGlvblJlY29yZCgpCiAgICAgUmVmUHRyPE11dGF0aW9u
UmVjb3JkPiBtdXRhdGlvbiA9IE11dGF0aW9uUmVjb3JkOjpjcmVhdGVDaGlsZExpc3QoCiAgICAg
ICAgIG1fdGFyZ2V0LCBTdGF0aWNOb2RlTGlzdDo6YWRvcHQobV9hZGRlZE5vZGVzKSwgU3RhdGlj
Tm9kZUxpc3Q6OmFkb3B0KG1fcmVtb3ZlZE5vZGVzKSwgbV9wcmV2aW91c1NpYmxpbmcsIG1fbmV4
dFNpYmxpbmcpOwogCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtX29ic2VydmVycy5zaXpl
KCk7ICsraSkKLSAgICAgICAgbV9vYnNlcnZlcnNbaV0tPmVucXVldWVNdXRhdGlvblJlY29yZCht
dXRhdGlvbik7CisgICAgZm9yIChIYXNoTWFwPFdlYktpdE11dGF0aW9uT2JzZXJ2ZXIqLCBNdXRh
dGlvbk9ic2VydmVyT3B0aW9ucz46Oml0ZXJhdG9yIGl0ZXIgPSBtX29ic2VydmVycy5iZWdpbigp
OyBpdGVyICE9IG1fb2JzZXJ2ZXJzLmVuZCgpOyArK2l0ZXIpCisgICAgICAgIGl0ZXItPmZpcnN0
LT5lbnF1ZXVlTXV0YXRpb25SZWNvcmQobXV0YXRpb24pOwogCiAgICAgY2xlYXIoKTsKIH0KQEAg
LTI0NCw3ICsyNDQsNyBAQCB2b2lkIE11dGF0aW9uQWNjdW11bGF0aW9uUm91dGVyOjppbmNyZW1l
bnRTY29waW5nTGV2ZWwoTm9kZSogdGFyZ2V0KQogICAgICAgICByZXR1cm47CiAgICAgfQogCi0g
ICAgVmVjdG9yPFdlYktpdE11dGF0aW9uT2JzZXJ2ZXIqPiBvYnNlcnZlcnM7CisgICAgSGFzaE1h
cDxXZWJLaXRNdXRhdGlvbk9ic2VydmVyKiwgTXV0YXRpb25PYnNlcnZlck9wdGlvbnM+IG9ic2Vy
dmVyczsKICAgICB0YXJnZXQtPmdldFJlZ2lzdGVyZWRNdXRhdGlvbk9ic2VydmVyc09mVHlwZShv
YnNlcnZlcnMsIFdlYktpdE11dGF0aW9uT2JzZXJ2ZXI6OkNoaWxkTGlzdCk7CiAgICAgaWYgKG9i
c2VydmVycy5pc0VtcHR5KCkpCiAgICAgICAgIG1fYWNjdW11bGF0aW9ucy5zZXQodGFyZ2V0LCAw
KTsKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2RvbS9Db250YWluZXJOb2RlLmNwcCBiL1Nv
dXJjZS9XZWJDb3JlL2RvbS9Db250YWluZXJOb2RlLmNwcAppbmRleCA3NGM3OWQ2ZjczMTFiNTA0
MWRiZjk1N2Q0M2RlM2M2OTg2NDA2Y2U1Li40NTVjNzQxZTRlOTk5YWU0NDliMWM3MmM0ZTk0ODU3
ZTI3ZWJlMWVjIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9kb20vQ29udGFpbmVyTm9kZS5j
cHAKKysrIGIvU291cmNlL1dlYkNvcmUvZG9tL0NvbnRhaW5lck5vZGUuY3BwCkBAIC0xMTQ0LDYg
KzExNDQsNyBAQCBzdGF0aWMgdm9pZCBkaXNwYXRjaENoaWxkUmVtb3ZhbEV2ZW50cyhOb2RlKiBj
aGlsZCkKICAgICBpZiAoYy0+cGFyZW50Tm9kZSgpKSB7CiAgICAgICAgIENoaWxkTGlzdE11dGF0
aW9uU2NvcGUgbXV0YXRpb24oYy0+cGFyZW50Tm9kZSgpKTsKICAgICAgICAgbXV0YXRpb24ud2ls
bFJlbW92ZUNoaWxkKGMpOworICAgICAgICBjLT5jcmVhdGVUcmFuc2llbnRNdXRhdGlvbk9ic2Vy
dmVycygpOwogICAgIH0KICNlbmRpZgogCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9kb20v
RWxlbWVudC5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9kb20vRWxlbWVudC5jcHAKaW5kZXggZTg5NDk4
MjYzY2JkMzVkZjhlZmQ4NzIwNTM0NWRiNjdiMzljZWJlZi4uZWM0ODA1ODI1N2M0NGQ3Y2ZhYjcw
NTBkMTJmMjQxMTY2YzdkYzZkYiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvZG9tL0VsZW1l
bnQuY3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL2RvbS9FbGVtZW50LmNwcApAQCAtNjE5LDE0ICs2
MTksMTQgQEAgY29uc3QgQXRvbWljU3RyaW5nJiBFbGVtZW50OjpnZXRBdHRyaWJ1dGVOUyhjb25z
dCBTdHJpbmcmIG5hbWVzcGFjZVVSSSwgY29uc3QgU3QKICNpZiBFTkFCTEUoTVVUQVRJT05fT0JT
RVJWRVJTKQogc3RhdGljIHZvaWQgZW5xdWV1ZUF0dHJpYnV0ZXNNdXRhdGlvblJlY29yZChFbGVt
ZW50KiBlbGVtZW50LCBjb25zdCBRdWFsaWZpZWROYW1lJiBuYW1lKQogewotICAgIFZlY3RvcjxX
ZWJLaXRNdXRhdGlvbk9ic2VydmVyKj4gb2JzZXJ2ZXJzOworICAgIEhhc2hNYXA8V2ViS2l0TXV0
YXRpb25PYnNlcnZlciosIE11dGF0aW9uT2JzZXJ2ZXJPcHRpb25zPiBvYnNlcnZlcnM7CiAgICAg
ZWxlbWVudC0+Z2V0UmVnaXN0ZXJlZE11dGF0aW9uT2JzZXJ2ZXJzT2ZUeXBlKG9ic2VydmVycywg
V2ViS2l0TXV0YXRpb25PYnNlcnZlcjo6QXR0cmlidXRlcyk7CiAgICAgaWYgKG9ic2VydmVycy5p
c0VtcHR5KCkpCiAgICAgICAgIHJldHVybjsKIAogICAgIFJlZlB0cjxNdXRhdGlvblJlY29yZD4g
bXV0YXRpb24gPSBNdXRhdGlvblJlY29yZDo6Y3JlYXRlQXR0cmlidXRlcyhlbGVtZW50LCBuYW1l
KTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG9ic2VydmVycy5zaXplKCk7ICsraSkKLSAg
ICAgICAgb2JzZXJ2ZXJzW2ldLT5lbnF1ZXVlTXV0YXRpb25SZWNvcmQobXV0YXRpb24pOworICAg
IGZvciAoSGFzaE1hcDxXZWJLaXRNdXRhdGlvbk9ic2VydmVyKiwgTXV0YXRpb25PYnNlcnZlck9w
dGlvbnM+OjppdGVyYXRvciBpdGVyID0gb2JzZXJ2ZXJzLmJlZ2luKCk7IGl0ZXIgIT0gb2JzZXJ2
ZXJzLmVuZCgpOyArK2l0ZXIpCisgICAgICAgIGl0ZXItPmZpcnN0LT5lbnF1ZXVlTXV0YXRpb25S
ZWNvcmQobXV0YXRpb24pOwogfQogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3Jl
L2RvbS9Ob2RlLmNwcCBiL1NvdXJjZS9XZWJDb3JlL2RvbS9Ob2RlLmNwcAppbmRleCA5Mjk0ZGU2
ODRiNmI4NTY1NWQwODFiMTEyYmYzZjdkNDYzNDQyY2QzLi40ZGIzOGE4MTFlNWJhYThkYjIyN2Ri
MDY1YTc2NTBiMzU0MDJlOWEzIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9kb20vTm9kZS5j
cHAKKysrIGIvU291cmNlL1dlYkNvcmUvZG9tL05vZGUuY3BwCkBAIC01NDksMTAgKzU0OSwxMCBA
QCB2b2lkIE5vZGU6OmNsZWFyUmFyZURhdGEoKQogICAgICAgICB0cmVlU2NvcGUoKS0+cmVtb3Zl
Tm9kZUxpc3RDYWNoZSgpOwogCiAjaWYgRU5BQkxFKE1VVEFUSU9OX09CU0VSVkVSUykKLSAgICBW
ZWN0b3I8TXV0YXRpb25PYnNlcnZlckVudHJ5Piogb2JzZXJ2ZXJFbnRyaWVzID0gbXV0YXRpb25P
YnNlcnZlckVudHJpZXMoKTsKLSAgICBpZiAob2JzZXJ2ZXJFbnRyaWVzKSB7Ci0gICAgICAgIGZv
ciAoc2l6ZV90IGkgPSAwOyBpIDwgb2JzZXJ2ZXJFbnRyaWVzLT5zaXplKCk7ICsraSkKLSAgICAg
ICAgICAgIG9ic2VydmVyRW50cmllcy0+YXQoaSkub2JzZXJ2ZXItPm9ic2VydmVkTm9kZURlc3Ry
dWN0ZWQodGhpcyk7CisgICAgVmVjdG9yPE11dGF0aW9uT2JzZXJ2ZXJSZWdpc3RyYXRpb24+KiBy
ZWdpc3RyeSA9IG11dGF0aW9uT2JzZXJ2ZXJSZWdpc3RyeSgpOworICAgIGlmIChyZWdpc3RyeSkg
eworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJlZ2lzdHJ5LT5zaXplKCk7ICsraSkK
KyAgICAgICAgICAgIHJlZ2lzdHJ5LT5hdChpKS5vYnNlcnZlci0+b2JzZXJ2ZWROb2RlRGVzdHJ1
Y3RlZCh0aGlzKTsKICAgICB9CiAjZW5kaWYKIApAQCAtMjY5OCw2NSArMjY5OCw4NSBAQCBFdmVu
dFRhcmdldERhdGEqIE5vZGU6OmVuc3VyZUV2ZW50VGFyZ2V0RGF0YSgpCiB9CiAKICNpZiBFTkFC
TEUoTVVUQVRJT05fT0JTRVJWRVJTKQotVmVjdG9yPE11dGF0aW9uT2JzZXJ2ZXJFbnRyeT4qIE5v
ZGU6Om11dGF0aW9uT2JzZXJ2ZXJFbnRyaWVzKCkKK1ZlY3RvcjxNdXRhdGlvbk9ic2VydmVyUmVn
aXN0cmF0aW9uPiogTm9kZTo6bXV0YXRpb25PYnNlcnZlclJlZ2lzdHJ5KCkKIHsKLSAgICByZXR1
cm4gaGFzUmFyZURhdGEoKSA/IHJhcmVEYXRhKCktPm11dGF0aW9uT2JzZXJ2ZXJFbnRyaWVzKCkg
OiAwOworICAgIHJldHVybiBoYXNSYXJlRGF0YSgpID8gcmFyZURhdGEoKS0+bXV0YXRpb25PYnNl
cnZlclJlZ2lzdHJ5KCkgOiAwOwogfQogCi1zdGF0aWMgdm9pZCBhZGRNYXRjaGluZ09ic2VydmVy
cyhIYXNoU2V0PFdlYktpdE11dGF0aW9uT2JzZXJ2ZXIqPiYgb2JzZXJ2ZXJTZXQsIFZlY3RvcjxN
dXRhdGlvbk9ic2VydmVyRW50cnk+KiBvYnNlcnZlckVudHJpZXMsIE11dGF0aW9uT2JzZXJ2ZXJP
cHRpb25zIG9wdGlvbnMpCitzdGF0aWMgdm9pZCBhZGRNYXRjaGluZ09ic2VydmVycyhIYXNoTWFw
PFdlYktpdE11dGF0aW9uT2JzZXJ2ZXIqLCBNdXRhdGlvbk9ic2VydmVyT3B0aW9ucz4mIG9ic2Vy
dmVycywgVmVjdG9yPE11dGF0aW9uT2JzZXJ2ZXJSZWdpc3RyYXRpb24+KiByZWdpc3RyeSwgTXV0
YXRpb25PYnNlcnZlck9wdGlvbnMgb3B0aW9ucykKIHsKLSAgICBpZiAoIW9ic2VydmVyRW50cmll
cykKKyAgICBpZiAoIXJlZ2lzdHJ5KQogICAgICAgICByZXR1cm47CiAKLSAgICBjb25zdCBzaXpl
X3Qgc2l6ZSA9IG9ic2VydmVyRW50cmllcy0+c2l6ZSgpOworICAgIGNvbnN0IHNpemVfdCBzaXpl
ID0gcmVnaXN0cnktPnNpemUoKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7ICsr
aSkgewotICAgICAgICBNdXRhdGlvbk9ic2VydmVyRW50cnkmIGVudHJ5ID0gb2JzZXJ2ZXJFbnRy
aWVzLT5hdChpKTsKLSAgICAgICAgaWYgKGVudHJ5Lmhhc0FsbE9wdGlvbnMob3B0aW9ucykpCi0g
ICAgICAgICAgICBvYnNlcnZlclNldC5hZGQoZW50cnkub2JzZXJ2ZXIuZ2V0KCkpOworICAgICAg
ICBNdXRhdGlvbk9ic2VydmVyUmVnaXN0cmF0aW9uJiBlbnRyeSA9IHJlZ2lzdHJ5LT5hdChpKTsK
KworICAgICAgICBpZiAoZW50cnkuaGFzQWxsT3B0aW9ucyhvcHRpb25zKSkgeworICAgICAgICAg
ICAgcGFpcjxIYXNoTWFwPFdlYktpdE11dGF0aW9uT2JzZXJ2ZXIqLCBNdXRhdGlvbk9ic2VydmVy
T3B0aW9ucz46Oml0ZXJhdG9yLCBib29sPiByZXN1bHQgPSBvYnNlcnZlcnMuYWRkKGVudHJ5Lm9i
c2VydmVyLmdldCgpLCBlbnRyeS5vcHRpb25zKTsKKyAgICAgICAgICAgIGlmICghcmVzdWx0LnNl
Y29uZCkKKyAgICAgICAgICAgICAgICByZXN1bHQuZmlyc3QtPnNlY29uZCB8PSBlbnRyeS5vcHRp
b25zOworICAgICAgICB9CiAgICAgfQogfQogCi12b2lkIE5vZGU6OmdldFJlZ2lzdGVyZWRNdXRh
dGlvbk9ic2VydmVyc09mVHlwZShWZWN0b3I8V2ViS2l0TXV0YXRpb25PYnNlcnZlcio+JiBvYnNl
cnZlcnMsIFdlYktpdE11dGF0aW9uT2JzZXJ2ZXI6Ok11dGF0aW9uVHlwZSB0eXBlKQordm9pZCBO
b2RlOjpnZXRSZWdpc3RlcmVkTXV0YXRpb25PYnNlcnZlcnNPZlR5cGUoSGFzaE1hcDxXZWJLaXRN
dXRhdGlvbk9ic2VydmVyKiwgTXV0YXRpb25PYnNlcnZlck9wdGlvbnM+JiBvYnNlcnZlcnMsIFdl
YktpdE11dGF0aW9uT2JzZXJ2ZXI6Ok11dGF0aW9uVHlwZSB0eXBlKQogewotICAgIEhhc2hTZXQ8
V2ViS2l0TXV0YXRpb25PYnNlcnZlcio+IG9ic2VydmVyU2V0OwotICAgIGFkZE1hdGNoaW5nT2Jz
ZXJ2ZXJzKG9ic2VydmVyU2V0LCBtdXRhdGlvbk9ic2VydmVyRW50cmllcygpLCB0eXBlKTsKKyAg
ICBhZGRNYXRjaGluZ09ic2VydmVycyhvYnNlcnZlcnMsIG11dGF0aW9uT2JzZXJ2ZXJSZWdpc3Ry
eSgpLCB0eXBlKTsKICAgICBmb3IgKE5vZGUqIG5vZGUgPSBwYXJlbnROb2RlKCk7IG5vZGU7IG5v
ZGUgPSBub2RlLT5wYXJlbnROb2RlKCkpCi0gICAgICAgIGFkZE1hdGNoaW5nT2JzZXJ2ZXJzKG9i
c2VydmVyU2V0LCBub2RlLT5tdXRhdGlvbk9ic2VydmVyRW50cmllcygpLCB0eXBlIHwgV2ViS2l0
TXV0YXRpb25PYnNlcnZlcjo6U3VidHJlZSk7Ci0KLSAgICAvLyBGSVhNRTogdGhpcyBtZXRob2Qg
c2hvdWxkIG91dHB1dCBhIEhhc2hTZXQgaW5zdGVhZCBvZiBhIFZlY3Rvci4KLSAgICBpZiAoIW9i
c2VydmVyU2V0LmlzRW1wdHkoKSkKLSAgICAgICAgY29weVRvVmVjdG9yKG9ic2VydmVyU2V0LCBv
YnNlcnZlcnMpOworICAgICAgICBhZGRNYXRjaGluZ09ic2VydmVycyhvYnNlcnZlcnMsIG5vZGUt
Pm11dGF0aW9uT2JzZXJ2ZXJSZWdpc3RyeSgpLCB0eXBlIHwgV2ViS2l0TXV0YXRpb25PYnNlcnZl
cjo6U3VidHJlZSk7CiB9CiAKLU5vZGU6Ok11dGF0aW9uUmVnaXN0cmF0aW9uUmVzdWx0IE5vZGU6
OnJlZ2lzdGVyTXV0YXRpb25PYnNlcnZlcihQYXNzUmVmUHRyPFdlYktpdE11dGF0aW9uT2JzZXJ2
ZXI+IG9ic2VydmVyLCBNdXRhdGlvbk9ic2VydmVyT3B0aW9ucyBvcHRpb25zKQorTm9kZTo6TXV0
YXRpb25SZWdpc3RyYXRpb25SZXN1bHQgTm9kZTo6cmVnaXN0ZXJNdXRhdGlvbk9ic2VydmVyKFBh
c3NSZWZQdHI8V2ViS2l0TXV0YXRpb25PYnNlcnZlcj4gb2JzZXJ2ZXIsIE11dGF0aW9uT2JzZXJ2
ZXJPcHRpb25zIG9wdGlvbnMsIE5vZGUqIHJlZ2lzdHJhdGlvbk5vZGUpCiB7Ci0gICAgVmVjdG9y
PE11dGF0aW9uT2JzZXJ2ZXJFbnRyeT4qIG9ic2VydmVyRW50cmllcyA9IGVuc3VyZVJhcmVEYXRh
KCktPmVuc3VyZU11dGF0aW9uT2JzZXJ2ZXJFbnRyaWVzKCk7Ci0gICAgTXV0YXRpb25PYnNlcnZl
ckVudHJ5IGVudHJ5KG9ic2VydmVyLCBvcHRpb25zKTsKKyAgICBWZWN0b3I8TXV0YXRpb25PYnNl
cnZlclJlZ2lzdHJhdGlvbj4qIHJlZ2lzdHJ5ID0gZW5zdXJlUmFyZURhdGEoKS0+ZW5zdXJlTXV0
YXRpb25PYnNlcnZlclJlZ2lzdHJ5KCk7CisgICAgTXV0YXRpb25PYnNlcnZlclJlZ2lzdHJhdGlv
biByZWdpc3RyYXRpb24ob2JzZXJ2ZXIsIG9wdGlvbnMsIHJlZ2lzdHJhdGlvbk5vZGUpOwogCi0g
ICAgc2l6ZV90IGluZGV4ID0gb2JzZXJ2ZXJFbnRyaWVzLT5maW5kKGVudHJ5KTsKKyAgICBzaXpl
X3QgaW5kZXggPSByZWdpc3RyeS0+ZmluZChyZWdpc3RyYXRpb24pOwogICAgIGlmIChpbmRleCA9
PSBub3RGb3VuZCkgewotICAgICAgICBvYnNlcnZlckVudHJpZXMtPmFwcGVuZChlbnRyeSk7Cisg
ICAgICAgIHJlZ2lzdHJ5LT5hcHBlbmQocmVnaXN0cmF0aW9uKTsKICAgICAgICAgcmV0dXJuIE11
dGF0aW9uT2JzZXJ2ZXJSZWdpc3RlcmVkOwogICAgIH0KIAotICAgICgqb2JzZXJ2ZXJFbnRyaWVz
KVtpbmRleF0ub3B0aW9ucyA9IGVudHJ5Lm9wdGlvbnM7CisgICAgKCpyZWdpc3RyeSlbaW5kZXhd
Lm9wdGlvbnMgPSByZWdpc3RyYXRpb24ub3B0aW9uczsKICAgICByZXR1cm4gTXV0YXRpb25SZWdp
c3RyYXRpb25PcHRpb25zUmVzZXQ7CiB9CiAKLXZvaWQgTm9kZTo6dW5yZWdpc3Rlck11dGF0aW9u
T2JzZXJ2ZXIoUGFzc1JlZlB0cjxXZWJLaXRNdXRhdGlvbk9ic2VydmVyPiBvYnNlcnZlcikKK3Zv
aWQgTm9kZTo6dW5yZWdpc3Rlck11dGF0aW9uT2JzZXJ2ZXIoUGFzc1JlZlB0cjxXZWJLaXRNdXRh
dGlvbk9ic2VydmVyPiBvYnNlcnZlciwgTm9kZSogcmVnaXN0cmF0aW9uTm9kZSkKIHsKLSAgICBW
ZWN0b3I8TXV0YXRpb25PYnNlcnZlckVudHJ5Piogb2JzZXJ2ZXJFbnRyaWVzID0gbXV0YXRpb25P
YnNlcnZlckVudHJpZXMoKTsKLSAgICBBU1NFUlQob2JzZXJ2ZXJFbnRyaWVzKTsKLSAgICBpZiAo
IW9ic2VydmVyRW50cmllcykKKyAgICBWZWN0b3I8TXV0YXRpb25PYnNlcnZlclJlZ2lzdHJhdGlv
bj4qIHJlZ2lzdHJ5ID0gbXV0YXRpb25PYnNlcnZlclJlZ2lzdHJ5KCk7CisgICAgQVNTRVJUKHJl
Z2lzdHJ5KTsKKyAgICBpZiAoIXJlZ2lzdHJ5KQogICAgICAgICByZXR1cm47CiAKLSAgICBNdXRh
dGlvbk9ic2VydmVyRW50cnkgZW50cnkob2JzZXJ2ZXIsIDApOwotICAgIHNpemVfdCBpbmRleCA9
IG9ic2VydmVyRW50cmllcy0+ZmluZChlbnRyeSk7CisgICAgTXV0YXRpb25PYnNlcnZlclJlZ2lz
dHJhdGlvbiByZWdpc3RyYXRpb24ob2JzZXJ2ZXIsIDAsIHJlZ2lzdHJhdGlvbk5vZGUpOworICAg
IHNpemVfdCBpbmRleCA9IHJlZ2lzdHJ5LT5maW5kKHJlZ2lzdHJhdGlvbik7CiAgICAgQVNTRVJU
KGluZGV4ICE9IG5vdEZvdW5kKTsKICAgICBpZiAoaW5kZXggPT0gbm90Rm91bmQpCiAgICAgICAg
IHJldHVybjsKIAotICAgIG9ic2VydmVyRW50cmllcy0+cmVtb3ZlKGluZGV4KTsKKyAgICByZWdp
c3RyeS0+cmVtb3ZlKGluZGV4KTsKK30KKwordm9pZCBOb2RlOjpjcmVhdGVUcmFuc2llbnRNdXRh
dGlvbk9ic2VydmVycygpCit7CisgICAgZm9yIChOb2RlKiBub2RlID0gcGFyZW50Tm9kZSgpOyBu
b2RlOyBub2RlID0gbm9kZS0+cGFyZW50Tm9kZSgpKSB7CisgICAgICAgIFZlY3RvcjxNdXRhdGlv
bk9ic2VydmVyUmVnaXN0cmF0aW9uPiogcmVnaXN0cnkgPSBub2RlLT5tdXRhdGlvbk9ic2VydmVy
UmVnaXN0cnkoKTsKKyAgICAgICAgaWYgKCFyZWdpc3RyeSkKKyAgICAgICAgICAgIGNvbnRpbnVl
OworCisgICAgICAgIGNvbnN0IHNpemVfdCBzaXplID0gcmVnaXN0cnktPnNpemUoKTsKKyAgICAg
ICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKKyAgICAgICAgICAgIE11dGF0
aW9uT2JzZXJ2ZXJSZWdpc3RyYXRpb24mIHJlZ2lzdHJhdGlvbiA9IHJlZ2lzdHJ5LT5hdChpKTsK
KyAgICAgICAgICAgIGlmICghcmVnaXN0cmF0aW9uLmhhc0FsbE9wdGlvbnMoV2ViS2l0TXV0YXRp
b25PYnNlcnZlcjo6U3VidHJlZSkpCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAg
ICAgICAgIFJlZlB0cjxOb2RlPiBvYnNlcnZlZE5vZGUgPSByZWdpc3RyYXRpb24ucmVnaXN0cmF0
aW9uTm9kZTsKKyAgICAgICAgICAgIGlmICghb2JzZXJ2ZWROb2RlKQorICAgICAgICAgICAgICAg
IG9ic2VydmVkTm9kZSA9IG5vZGU7CisgICAgICAgICAgICByZWdpc3RyYXRpb24ub2JzZXJ2ZXIt
PndpbGxEZXRhY2hOb2RlSW5PYnNlcnZlZFN1YnRyZWUob2JzZXJ2ZWROb2RlLCByZWdpc3RyYXRp
b24ub3B0aW9ucywgdGhpcyk7CisgICAgICAgIH0KKyAgICB9CiB9CiAjZW5kaWYgLy8gRU5BQkxF
KE1VVEFUSU9OX09CU0VSVkVSUykKIApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvZG9tL05v
ZGUuaCBiL1NvdXJjZS9XZWJDb3JlL2RvbS9Ob2RlLmgKaW5kZXggNjQyZGEwYmNiZWIwMzdkM2I2
YjdiNjU3YmQ4YWJmZTlkYzU4YmI4Yi4uZjNkNTEzYWEwOWNlMzI0Y2EyOTQ0ZGU4YzVkNzllYTky
MzA3MWZmYSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvZG9tL05vZGUuaAorKysgYi9Tb3Vy
Y2UvV2ViQ29yZS9kb20vTm9kZS5oCkBAIC04MSw3ICs4MSw3IEBAIGNsYXNzIFNWR1VzZUVsZW1l
bnQ7CiBjbGFzcyBUYWdOb2RlTGlzdDsKIGNsYXNzIFRyZWVTY29wZTsKIAotc3RydWN0IE11dGF0
aW9uT2JzZXJ2ZXJFbnRyeTsKK3N0cnVjdCBNdXRhdGlvbk9ic2VydmVyUmVnaXN0cmF0aW9uOwog
CiB0eXBlZGVmIGludCBFeGNlcHRpb25Db2RlOwogCkBAIC01OTAsMTUgKzU5MCwxNyBAQCBwdWJs
aWM6CiAjZW5kaWYKIAogI2lmIEVOQUJMRShNVVRBVElPTl9PQlNFUlZFUlMpCi0gICAgdm9pZCBn
ZXRSZWdpc3RlcmVkTXV0YXRpb25PYnNlcnZlcnNPZlR5cGUoVmVjdG9yPFdlYktpdE11dGF0aW9u
T2JzZXJ2ZXIqPiYsIFdlYktpdE11dGF0aW9uT2JzZXJ2ZXI6Ok11dGF0aW9uVHlwZSk7CisgICAg
dm9pZCBnZXRSZWdpc3RlcmVkTXV0YXRpb25PYnNlcnZlcnNPZlR5cGUoSGFzaE1hcDxXZWJLaXRN
dXRhdGlvbk9ic2VydmVyKiwgTXV0YXRpb25PYnNlcnZlck9wdGlvbnM+JiwgV2ViS2l0TXV0YXRp
b25PYnNlcnZlcjo6TXV0YXRpb25UeXBlKTsKIAogICAgIGVudW0gTXV0YXRpb25SZWdpc3RyYXRp
b25SZXN1bHQgewogICAgICAgICBNdXRhdGlvbk9ic2VydmVyUmVnaXN0ZXJlZCwKICAgICAgICAg
TXV0YXRpb25SZWdpc3RyYXRpb25PcHRpb25zUmVzZXQKICAgICB9OwotICAgIE11dGF0aW9uUmVn
aXN0cmF0aW9uUmVzdWx0IHJlZ2lzdGVyTXV0YXRpb25PYnNlcnZlcihQYXNzUmVmUHRyPFdlYktp
dE11dGF0aW9uT2JzZXJ2ZXI+LCBNdXRhdGlvbk9ic2VydmVyT3B0aW9ucyk7CisgICAgTXV0YXRp
b25SZWdpc3RyYXRpb25SZXN1bHQgcmVnaXN0ZXJNdXRhdGlvbk9ic2VydmVyKFBhc3NSZWZQdHI8
V2ViS2l0TXV0YXRpb25PYnNlcnZlcj4sIE11dGF0aW9uT2JzZXJ2ZXJPcHRpb25zLCBOb2RlKiBy
ZWdpc3RyYXRpb25Ob2RlID0gMCk7CiAKLSAgICB2b2lkIHVucmVnaXN0ZXJNdXRhdGlvbk9ic2Vy
dmVyKFBhc3NSZWZQdHI8V2ViS2l0TXV0YXRpb25PYnNlcnZlcj4pOworICAgIHZvaWQgdW5yZWdp
c3Rlck11dGF0aW9uT2JzZXJ2ZXIoUGFzc1JlZlB0cjxXZWJLaXRNdXRhdGlvbk9ic2VydmVyPiwg
Tm9kZSogcmVnaXN0cmF0aW9uTm9kZSA9IDApOworCisgICAgdm9pZCBjcmVhdGVUcmFuc2llbnRN
dXRhdGlvbk9ic2VydmVycygpOwogI2VuZGlmIC8vIEVOQUJMRShNVVRBVElPTl9PQlNFUlZFUlMp
CiAKIHByaXZhdGU6CkBAIC03MjUsNyArNzI3LDcgQEAgcHJpdmF0ZToKICAgICB2b2lkIHRyYWNr
Rm9yRGVidWdnaW5nKCk7CiAKICNpZiBFTkFCTEUoTVVUQVRJT05fT0JTRVJWRVJTKQotICAgIFZl
Y3RvcjxNdXRhdGlvbk9ic2VydmVyRW50cnk+KiBtdXRhdGlvbk9ic2VydmVyRW50cmllcygpOwor
ICAgIFZlY3RvcjxNdXRhdGlvbk9ic2VydmVyUmVnaXN0cmF0aW9uPiogbXV0YXRpb25PYnNlcnZl
clJlZ2lzdHJ5KCk7CiAjZW5kaWYKIAogICAgIG11dGFibGUgdWludDMyX3QgbV9ub2RlRmxhZ3M7
CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9kb20vTm9kZVJhcmVEYXRhLmggYi9Tb3VyY2Uv
V2ViQ29yZS9kb20vTm9kZVJhcmVEYXRhLmgKaW5kZXggNTAyYjY1OGZjMDRiZWE2ODc5MTcxNzU1
MDVlOGM4YTE3MDI3NDk4Yi4uZTM1YWE3YzQ5OTMyODVhOTczNmNkNTZhNDQ1NDg3ZTRhOTJlMGI3
OSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvZG9tL05vZGVSYXJlRGF0YS5oCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL2RvbS9Ob2RlUmFyZURhdGEuaApAQCAtODksMTYgKzg5LDE3IEBAIHByaXZh
dGU6CiB9OwogCiAjaWYgRU5BQkxFKE1VVEFUSU9OX09CU0VSVkVSUykKLXN0cnVjdCBNdXRhdGlv
bk9ic2VydmVyRW50cnkgewotICAgIE11dGF0aW9uT2JzZXJ2ZXJFbnRyeShQYXNzUmVmUHRyPFdl
YktpdE11dGF0aW9uT2JzZXJ2ZXI+IG9ic2VydmVyLCBNdXRhdGlvbk9ic2VydmVyT3B0aW9ucyBv
cHRpb25zKQorc3RydWN0IE11dGF0aW9uT2JzZXJ2ZXJSZWdpc3RyYXRpb24geworICAgIE11dGF0
aW9uT2JzZXJ2ZXJSZWdpc3RyYXRpb24oUGFzc1JlZlB0cjxXZWJLaXRNdXRhdGlvbk9ic2VydmVy
PiBvYnNlcnZlciwgTXV0YXRpb25PYnNlcnZlck9wdGlvbnMgb3B0aW9ucywgTm9kZSogbm9kZSkK
ICAgICAgICAgOiBvYnNlcnZlcihvYnNlcnZlcikKICAgICAgICAgLCBvcHRpb25zKG9wdGlvbnMp
CisgICAgICAgICwgcmVnaXN0cmF0aW9uTm9kZShub2RlKQogICAgIHsKICAgICB9CiAKLSAgICBi
b29sIG9wZXJhdG9yPT0oY29uc3QgTXV0YXRpb25PYnNlcnZlckVudHJ5JiBvdGhlcikgY29uc3QK
KyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgTXV0YXRpb25PYnNlcnZlclJlZ2lzdHJhdGlvbiYg
b3RoZXIpIGNvbnN0CiAgICAgewotICAgICAgICByZXR1cm4gb2JzZXJ2ZXIgPT0gb3RoZXIub2Jz
ZXJ2ZXI7CisgICAgICAgIHJldHVybiBvYnNlcnZlciA9PSBvdGhlci5vYnNlcnZlciAmJiByZWdp
c3RyYXRpb25Ob2RlID09IG90aGVyLnJlZ2lzdHJhdGlvbk5vZGU7CiAgICAgfQogCiAgICAgYm9v
bCBoYXNBbGxPcHRpb25zKE11dGF0aW9uT2JzZXJ2ZXJPcHRpb25zIG9wdGlvbnMpIGNvbnN0CkBA
IC0xMDgsNiArMTA5LDEyIEBAIHN0cnVjdCBNdXRhdGlvbk9ic2VydmVyRW50cnkgewogCiAgICAg
UmVmUHRyPFdlYktpdE11dGF0aW9uT2JzZXJ2ZXI+IG9ic2VydmVyOwogICAgIE11dGF0aW9uT2Jz
ZXJ2ZXJPcHRpb25zIG9wdGlvbnM7CisKKyAgICAvLyByZWdpc3RyYXRpb25Ob2RlIHdpbGwgYmUg
MCBpZiB0aGUgcmVnaXN0cmF0aW9uIGlzIG5vbi10cmFuc2llbnQuIEkuZS4gVGhlIHJlZ2lzdHJh
dGlvbk5vZGUgaXMgdGhlIE5vZGUgaW4gd2hvc2UKKyAgICAvLyByZWdpc3RyeSBpdCBleGlzdHMu
CisgICAgLy8gTm90ZSB0aGF0IHRoaXMgZG9lc24ndCBuZWVkIHRvIGJlIGEgUmVmUHRyIGJlY2F1
c2UgdGhlIG9ic2VydmVyIHdpbGwgYmUgaG9sZGluZyBhIFJlZlB0ciB0byB0aGUgc2FtZSBub2Rl
IGF0CisgICAgLy8gbGVhc3QgZm9yIHRoZSBsaWZldGltZSBvZiB0aGlzIEVudHJ5IGluIGl0cyBt
X3RyYW5zaWVudE9ic2VydmVkTm9kZXMgbWFwLgorICAgIE5vZGUqIHJlZ2lzdHJhdGlvbk5vZGU7
CiB9OwogI2VuZGlmIC8vIEVOQUJMRShNVVRBVElPTl9PQlNFUlZFUlMpCiAKQEAgLTE2MSwxMiAr
MTY4LDEyIEBAIHB1YmxpYzoKICAgICB9CiAKICNpZiBFTkFCTEUoTVVUQVRJT05fT0JTRVJWRVJT
KQotICAgIFZlY3RvcjxNdXRhdGlvbk9ic2VydmVyRW50cnk+KiBtdXRhdGlvbk9ic2VydmVyRW50
cmllcygpIHsgcmV0dXJuIG1fbXV0YXRpb25PYnNlcnZlcnMuZ2V0KCk7IH0KLSAgICBWZWN0b3I8
TXV0YXRpb25PYnNlcnZlckVudHJ5PiogZW5zdXJlTXV0YXRpb25PYnNlcnZlckVudHJpZXMoKQor
ICAgIFZlY3RvcjxNdXRhdGlvbk9ic2VydmVyUmVnaXN0cmF0aW9uPiogbXV0YXRpb25PYnNlcnZl
clJlZ2lzdHJ5KCkgeyByZXR1cm4gbV9tdXRhdGlvbk9ic2VydmVyUmVnaXN0cnkuZ2V0KCk7IH0K
KyAgICBWZWN0b3I8TXV0YXRpb25PYnNlcnZlclJlZ2lzdHJhdGlvbj4qIGVuc3VyZU11dGF0aW9u
T2JzZXJ2ZXJSZWdpc3RyeSgpCiAgICAgewotICAgICAgICBpZiAoIW1fbXV0YXRpb25PYnNlcnZl
cnMpCi0gICAgICAgICAgICBtX211dGF0aW9uT2JzZXJ2ZXJzID0gYWRvcHRQdHIobmV3IFZlY3Rv
cjxNdXRhdGlvbk9ic2VydmVyRW50cnk+KTsKLSAgICAgICAgcmV0dXJuIG1fbXV0YXRpb25PYnNl
cnZlcnMuZ2V0KCk7CisgICAgICAgIGlmICghbV9tdXRhdGlvbk9ic2VydmVyUmVnaXN0cnkpCisg
ICAgICAgICAgICBtX211dGF0aW9uT2JzZXJ2ZXJSZWdpc3RyeSA9IGFkb3B0UHRyKG5ldyBWZWN0
b3I8TXV0YXRpb25PYnNlcnZlclJlZ2lzdHJhdGlvbj4pOworICAgICAgICByZXR1cm4gbV9tdXRh
dGlvbk9ic2VydmVyUmVnaXN0cnkuZ2V0KCk7CiAgICAgfQogI2VuZGlmCiAKQEAgLTE4OCw3ICsx
OTUsNyBAQCBwcml2YXRlOgogICAgIGJvb2wgbV9uZWVkc0ZvY3VzQXBwZWFyYW5jZVVwZGF0ZVNv
b25BZnRlckF0dGFjaCA6IDE7CiAKICNpZiBFTkFCTEUoTVVUQVRJT05fT0JTRVJWRVJTKQotICAg
IE93blB0cjxWZWN0b3I8TXV0YXRpb25PYnNlcnZlckVudHJ5PiA+IG1fbXV0YXRpb25PYnNlcnZl
cnM7CisgICAgT3duUHRyPFZlY3RvcjxNdXRhdGlvbk9ic2VydmVyUmVnaXN0cmF0aW9uPiA+IG1f
bXV0YXRpb25PYnNlcnZlclJlZ2lzdHJ5OwogI2VuZGlmCiB9OwogCmRpZmYgLS1naXQgYS9Tb3Vy
Y2UvV2ViQ29yZS9kb20vV2ViS2l0TXV0YXRpb25PYnNlcnZlci5jcHAgYi9Tb3VyY2UvV2ViQ29y
ZS9kb20vV2ViS2l0TXV0YXRpb25PYnNlcnZlci5jcHAKaW5kZXggODNmMTU5OTBlYTJiZWNhMzM5
YmIwYTczY2MyOTY5YmE0ZGYyOWZhNS4uYzc4YjYyNjY2ZDU1YzMwZmU3YjE3ZTIxOWIxNWQ2OGRl
NGMxODJkOSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvZG9tL1dlYktpdE11dGF0aW9uT2Jz
ZXJ2ZXIuY3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL2RvbS9XZWJLaXRNdXRhdGlvbk9ic2VydmVy
LmNwcApAQCAtNTMsMTQgKzUzLDMxIEBAIFdlYktpdE11dGF0aW9uT2JzZXJ2ZXI6OldlYktpdE11
dGF0aW9uT2JzZXJ2ZXIoUGFzc1JlZlB0cjxNdXRhdGlvbkNhbGxiYWNrPiBjYWxsCiAKIFdlYktp
dE11dGF0aW9uT2JzZXJ2ZXI6On5XZWJLaXRNdXRhdGlvbk9ic2VydmVyKCkKIHsKKyAgICBjbGVh
clRyYW5zaWVudEVudHJpZXMoKTsKK30KKworc3RhdGljIHZvaWQgdW5yZWdpc3RlclRyYW5zaWVu
dFJlZ2lzdHJhdGlvbnMoUGFzc093blB0cjxOb2RlSGFzaFNldD4gcG9wVHJhbnNpZW50Tm9kZXMs
IFdlYktpdE11dGF0aW9uT2JzZXJ2ZXIqIG9ic2VydmVyLCBOb2RlKiByZWdpc3RyYXRpb25Ob2Rl
KQoreworICAgIE93blB0cjxOb2RlSGFzaFNldD4gdHJhbnNpZW50Tm9kZXMgPSBwb3BUcmFuc2ll
bnROb2RlczsKKyAgICBmb3IgKE5vZGVIYXNoU2V0OjppdGVyYXRvciBpdGVyID0gdHJhbnNpZW50
Tm9kZXMtPmJlZ2luKCk7IGl0ZXIgIT0gdHJhbnNpZW50Tm9kZXMtPmVuZCgpOyArK2l0ZXIpCisg
ICAgICAgICgqaXRlciktPnVucmVnaXN0ZXJNdXRhdGlvbk9ic2VydmVyKG9ic2VydmVyLCByZWdp
c3RyYXRpb25Ob2RlKTsKIH0KIAogdm9pZCBXZWJLaXRNdXRhdGlvbk9ic2VydmVyOjpvYnNlcnZl
KE5vZGUqIG5vZGUsIE11dGF0aW9uT2JzZXJ2ZXJPcHRpb25zIG9wdGlvbnMpCiB7CiAgICAgLy8g
RklYTUU6IE1vcmUgb3B0aW9ucyBjb21wb3NpdGlvbiB3b3JrIG5lZWRzIHRvIGJlIGRvbmUgaGVy
ZSwgZS5nLiwgdmFsaWRhdGlvbi4KIAotICAgIGlmIChub2RlLT5yZWdpc3Rlck11dGF0aW9uT2Jz
ZXJ2ZXIodGhpcywgb3B0aW9ucykgPT0gTm9kZTo6TXV0YXRpb25PYnNlcnZlclJlZ2lzdGVyZWQp
CisgICAgaWYgKG5vZGUtPnJlZ2lzdGVyTXV0YXRpb25PYnNlcnZlcih0aGlzLCBvcHRpb25zKSA9
PSBOb2RlOjpNdXRhdGlvbk9ic2VydmVyUmVnaXN0ZXJlZCkgewogICAgICAgICBtX29ic2VydmVk
Tm9kZXMuYXBwZW5kKG5vZGUpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgSGFzaE1h
cDxSZWZQdHI8Tm9kZT4sIE5vZGVIYXNoU2V0Kj46Oml0ZXJhdG9yIGl0ZXIgPSBtX3RyYW5zaWVu
dE9ic2VydmVkTm9kZXMuZmluZChub2RlKTsKKyAgICBpZiAoaXRlciA9PSBtX3RyYW5zaWVudE9i
c2VydmVkTm9kZXMuZW5kKCkpCisgICAgICAgIHJldHVybjsKKworICAgIHVucmVnaXN0ZXJUcmFu
c2llbnRSZWdpc3RyYXRpb25zKGFkb3B0UHRyKGl0ZXItPnNlY29uZCksIHRoaXMsIG5vZGUpOwor
ICAgIG1fdHJhbnNpZW50T2JzZXJ2ZWROb2Rlcy5yZW1vdmUoaXRlcik7CiB9CiAKIHZvaWQgV2Vi
S2l0TXV0YXRpb25PYnNlcnZlcjo6ZGlzY29ubmVjdCgpCkBAIC02OSwxMCArODYsMTMgQEAgdm9p
ZCBXZWJLaXRNdXRhdGlvbk9ic2VydmVyOjpkaXNjb25uZWN0KCkKICAgICAgICAgbV9vYnNlcnZl
ZE5vZGVzW2ldLT51bnJlZ2lzdGVyTXV0YXRpb25PYnNlcnZlcih0aGlzKTsKIAogICAgIG1fb2Jz
ZXJ2ZWROb2Rlcy5jbGVhcigpOworICAgIGNsZWFyVHJhbnNpZW50RW50cmllcygpOwogfQogCiB2
b2lkIFdlYktpdE11dGF0aW9uT2JzZXJ2ZXI6Om9ic2VydmVkTm9kZURlc3RydWN0ZWQoTm9kZSog
bm9kZSkKIHsKKyAgICBBU1NFUlQoIW1fdHJhbnNpZW50T2JzZXJ2ZWROb2Rlcy5jb250YWlucyhu
b2RlKSk7CisKICAgICBzaXplX3QgaW5kZXggPSBtX29ic2VydmVkTm9kZXMuZmluZChub2RlKTsK
ICAgICBBU1NFUlQoaW5kZXggIT0gbm90Rm91bmQpOwogICAgIGlmIChpbmRleCA9PSBub3RGb3Vu
ZCkKQEAgLTk1LDEwICsxMTUsMzYgQEAgdm9pZCBXZWJLaXRNdXRhdGlvbk9ic2VydmVyOjplbnF1
ZXVlTXV0YXRpb25SZWNvcmQoUGFzc1JlZlB0cjxNdXRhdGlvblJlY29yZD4gbXUKICAgICBhY3Rp
dmVNdXRhdGlvbk9ic2VydmVycygpLmFkZCh0aGlzKTsKIH0KIAordm9pZCBXZWJLaXRNdXRhdGlv
bk9ic2VydmVyOjp3aWxsRGV0YWNoTm9kZUluT2JzZXJ2ZWRTdWJ0cmVlKFBhc3NSZWZQdHI8Tm9k
ZT4gcHJwUmVnaXN0cmF0aW9uTm9kZSwgTXV0YXRpb25PYnNlcnZlck9wdGlvbnMgb3B0aW9ucywg
UGFzc1JlZlB0cjxOb2RlPiBwcnBEZXRhY2hpbmdOb2RlKQoreworICAgIFJlZlB0cjxOb2RlPiBy
ZWdpc3RyYXRpb25Ob2RlID0gcHJwUmVnaXN0cmF0aW9uTm9kZTsKKyAgICBSZWZQdHI8Tm9kZT4g
ZGV0YWNoaW5nTm9kZSA9IHBycERldGFjaGluZ05vZGU7CisKKyAgICBkZXRhY2hpbmdOb2RlLT5y
ZWdpc3Rlck11dGF0aW9uT2JzZXJ2ZXIodGhpcywgb3B0aW9ucywgcmVnaXN0cmF0aW9uTm9kZS5n
ZXQoKSk7CisgICAgSGFzaE1hcDxSZWZQdHI8Tm9kZT4sIE5vZGVIYXNoU2V0Kj46Oml0ZXJhdG9y
IGl0ZXIgPSBtX3RyYW5zaWVudE9ic2VydmVkTm9kZXMuZmluZChyZWdpc3RyYXRpb25Ob2RlKTsK
KyAgICBpZiAoaXRlciAhPSBtX3RyYW5zaWVudE9ic2VydmVkTm9kZXMuZW5kKCkpIHsKKyAgICAg
ICAgaXRlci0+c2Vjb25kLT5hZGQoZGV0YWNoaW5nTm9kZSk7CisgICAgICAgIHJldHVybjsKKyAg
ICB9CisKKyAgICBPd25QdHI8Tm9kZUhhc2hTZXQ+IHNldCA9IGFkb3B0UHRyKG5ldyBOb2RlSGFz
aFNldCgpKTsKKyAgICBzZXQtPmFkZChkZXRhY2hpbmdOb2RlKTsKKyAgICBtX3RyYW5zaWVudE9i
c2VydmVkTm9kZXMuc2V0KHJlZ2lzdHJhdGlvbk5vZGUsIHNldC5sZWFrUHRyKCkpOworfQorCit2
b2lkIFdlYktpdE11dGF0aW9uT2JzZXJ2ZXI6OmNsZWFyVHJhbnNpZW50RW50cmllcygpCit7Cisg
ICAgZm9yIChIYXNoTWFwPFJlZlB0cjxOb2RlPiwgTm9kZUhhc2hTZXQqPjo6aXRlcmF0b3IgaXRl
ciA9IG1fdHJhbnNpZW50T2JzZXJ2ZWROb2Rlcy5iZWdpbigpOyBpdGVyICE9IG1fdHJhbnNpZW50
T2JzZXJ2ZWROb2Rlcy5lbmQoKTsgKytpdGVyKQorICAgICAgICB1bnJlZ2lzdGVyVHJhbnNpZW50
UmVnaXN0cmF0aW9ucyhhZG9wdFB0cihpdGVyLT5zZWNvbmQpLCB0aGlzLCBpdGVyLT5maXJzdC5n
ZXQoKSk7CisKKyAgICBtX3RyYW5zaWVudE9ic2VydmVkTm9kZXMuY2xlYXIoKTsKK30KKwogdm9p
ZCBXZWJLaXRNdXRhdGlvbk9ic2VydmVyOjpkZWxpdmVyKCkKIHsKICAgICBNdXRhdGlvblJlY29y
ZEFycmF5IHJlY29yZHM7CiAgICAgcmVjb3Jkcy5zd2FwKG1fcmVjb3Jkcyk7CisgICAgY2xlYXJU
cmFuc2llbnRFbnRyaWVzKCk7CiAgICAgbV9jYWxsYmFjay0+aGFuZGxlRXZlbnQoJnJlY29yZHMs
IHRoaXMpOwogfQogCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9kb20vV2ViS2l0TXV0YXRp
b25PYnNlcnZlci5oIGIvU291cmNlL1dlYkNvcmUvZG9tL1dlYktpdE11dGF0aW9uT2JzZXJ2ZXIu
aAppbmRleCBmYzMyODYwOTk4NGFhMTIxYTNjYmY4Njk0NDA0NjFlYjJjYTY1OThlLi45OTg3M2Uw
NTY3YTI3ZGY0NTAwYTA2N2QyMmRlMGFlYTZlYzM5NjQ0IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2Vi
Q29yZS9kb20vV2ViS2l0TXV0YXRpb25PYnNlcnZlci5oCisrKyBiL1NvdXJjZS9XZWJDb3JlL2Rv
bS9XZWJLaXRNdXRhdGlvbk9ic2VydmVyLmgKQEAgLTMzLDYgKzMzLDggQEAKIAogI2lmIEVOQUJM
RShNVVRBVElPTl9PQlNFUlZFUlMpCiAKKyNpbmNsdWRlIDx3dGYvSGFzaE1hcC5oPgorI2luY2x1
ZGUgPHd0Zi9IYXNoU2V0Lmg+CiAjaW5jbHVkZSA8d3RmL1Bhc3NPd25QdHIuaD4KICNpbmNsdWRl
IDx3dGYvUmVmQ291bnRlZC5oPgogI2luY2x1ZGUgPHd0Zi9SZWZQdHIuaD4KQEAgLTQ1LDYgKzQ3
LDcgQEAgY2xhc3MgTXV0YXRpb25SZWNvcmQ7CiBjbGFzcyBOb2RlOwogCiB0eXBlZGVmIHVuc2ln
bmVkIGNoYXIgTXV0YXRpb25PYnNlcnZlck9wdGlvbnM7Cit0eXBlZGVmIEhhc2hTZXQ8UmVmUHRy
PE5vZGU+ID4gTm9kZUhhc2hTZXQ7CiAKIGNsYXNzIFdlYktpdE11dGF0aW9uT2JzZXJ2ZXIgOiBw
dWJsaWMgUmVmQ291bnRlZDxXZWJLaXRNdXRhdGlvbk9ic2VydmVyPiB7CiBwdWJsaWM6CkBAIC02
OCwxNyArNzEsMjIgQEAgcHVibGljOgogCiAgICAgdm9pZCBvYnNlcnZlKE5vZGUqLCBNdXRhdGlv
bk9ic2VydmVyT3B0aW9ucyk7CiAgICAgdm9pZCBkaXNjb25uZWN0KCk7CisgICAgdm9pZCB3aWxs
RGV0YWNoTm9kZUluT2JzZXJ2ZWRTdWJ0cmVlKFBhc3NSZWZQdHI8Tm9kZT4gcmVnaXN0cmF0aW9u
Tm9kZSwgTXV0YXRpb25PYnNlcnZlck9wdGlvbnMsIFBhc3NSZWZQdHI8Tm9kZT4gZGV0YWNoaW5n
Tm9kZSk7CiAgICAgdm9pZCBvYnNlcnZlZE5vZGVEZXN0cnVjdGVkKE5vZGUqKTsKICAgICB2b2lk
IGVucXVldWVNdXRhdGlvblJlY29yZChQYXNzUmVmUHRyPE11dGF0aW9uUmVjb3JkPik7CiAKIHBy
aXZhdGU6CiAgICAgV2ViS2l0TXV0YXRpb25PYnNlcnZlcihQYXNzUmVmUHRyPE11dGF0aW9uQ2Fs
bGJhY2s+KTsKIAorICAgIHZvaWQgY2xlYXJUcmFuc2llbnRFbnRyaWVzKCk7CiAgICAgdm9pZCBk
ZWxpdmVyKCk7CiAKICAgICBSZWZQdHI8TXV0YXRpb25DYWxsYmFjaz4gbV9jYWxsYmFjazsKICAg
ICBWZWN0b3I8UmVmUHRyPE11dGF0aW9uUmVjb3JkPiA+IG1fcmVjb3JkczsKICAgICBWZWN0b3I8
Tm9kZSo+IG1fb2JzZXJ2ZWROb2RlczsgLy8gTm9kZVJhcmVEYXRhIGhhcyBhIFJlZlB0ciB0byB0
aGlzLCBzbyB1c2UgYSB3ZWFrIHBvaW50ZXIgdG8gYXZvaWQgYSBjeWNsZS4KKworICAgIC8vIEZJ
WE1FOiBDaGFuZ2UgdGhpcyB0byBiZSBPd25QdHI8Tm9kZUhhc2hTZXQ+IHdoZW4gT3duUHRyIHN1
cHBvcnRzIGJlaW5nIGNvbnRhaW5lZCBhcyBtYXAgdmFsdWVzLgorICAgIEhhc2hNYXA8UmVmUHRy
PE5vZGU+LCBOb2RlSGFzaFNldCo+IG1fdHJhbnNpZW50T2JzZXJ2ZWROb2RlczsKIH07CiAKIH0K
ZGlmZiAtLWdpdCBhL0xheW91dFRlc3RzL0NoYW5nZUxvZyBiL0xheW91dFRlc3RzL0NoYW5nZUxv
ZwppbmRleCA3ZjhkNGFjY2ZkZTRhM2Q1YTMzNzc4M2Q2YjE0ODc1YWNkZDg1N2I0Li45MGM2MWU3
YmRkN2Y5YWJjNTNmMzA4NGYzMTU1YWEwNTRiNWYyZTZjIDEwMDY0NAotLS0gYS9MYXlvdXRUZXN0
cy9DaGFuZ2VMb2cKKysrIGIvTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTMgQEAK
KzIwMTEtMTAtMjQgIFJhZmFlbCBXZWluc3RlaW4gIDxyYWZhZWx3QGNocm9taXVtLm9yZz4KKwor
ICAgICAgICBbTXV0YXRpb25PYnNlcnZlcnNdIEltcGxlbWVudCBzdWJ0cmVlIG9ic2VydmF0aW9u
IG9mIHRyYW5zaWVudGx5IGRpc2Nvbm5lY3RlZCBub2RlcworICAgICAgICBodHRwczovL2J1Z3Mu
d2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzA3ODgKKworICAgICAgICBSZXZpZXdlZCBieSBO
T0JPRFkgKE9PUFMhKS4KKworICAgICAgICAqIGZhc3QvbXV0YXRpb24vb2JzZXJ2ZS1zdWJ0cmVl
LWV4cGVjdGVkLnR4dDoKKyAgICAgICAgKiBmYXN0L211dGF0aW9uL29ic2VydmUtc3VidHJlZS5o
dG1sOgorCiAyMDExLTEwLTI2ICBDYXJ5IENsYXJrICA8Y2FyeWNsYXJrQGdvb2dsZS5jb20+CiAK
ICAgICAgICAgVW5yZXZpZXdlZCBnYXJkZW5pbmc6IHNpeHRoIGNodW5rIG9mIGJhc2VsaW5lcyBm
b3IgQ2hyb21pdW0tU2tpYQpkaWZmIC0tZ2l0IGEvTGF5b3V0VGVzdHMvZmFzdC9tdXRhdGlvbi9v
YnNlcnZlLXN1YnRyZWUtZXhwZWN0ZWQudHh0IGIvTGF5b3V0VGVzdHMvZmFzdC9tdXRhdGlvbi9v
YnNlcnZlLXN1YnRyZWUtZXhwZWN0ZWQudHh0CmluZGV4IDU1MjdlYjFhYzMwZTAyNDEyNDdkZDFh
OTEyNzMwNzNlYjQ2ZWEzYWYuLmI4NzI4YzUxMDQzYjE4Nzc3MjIzOTU3NWQzZmRmYTliNzhkZDBk
MmYgMTAwNjQ0Ci0tLSBhL0xheW91dFRlc3RzL2Zhc3QvbXV0YXRpb24vb2JzZXJ2ZS1zdWJ0cmVl
LWV4cGVjdGVkLnR4dAorKysgYi9MYXlvdXRUZXN0cy9mYXN0L211dGF0aW9uL29ic2VydmUtc3Vi
dHJlZS1leHBlY3RlZC50eHQKQEAgLTMzLDYgKzMzLDQ4IEBAIFBBU1MgbXV0YXRpb25zWzBdLnRh
cmdldCBpcyBzdWJEaXYKIFBBU1MgbXV0YXRpb25zWzBdLmF0dHJpYnV0ZU5hbWUgaXMgImZvbyIK
IFBBU1MgbXV0YXRpb25zWzBdLmF0dHJpYnV0ZU5hbWVzcGFjZSBpcyBudWxsCiAKK1Rlc3Rpbmcg
dGhhdCB0cmFuc2llbnRseSBkZXRhY2hlZCBub2RlcyBhcmUgc3RpbGwgb2JzZXJ2ZWQgdmlhIHN1
YnRyZWUuCisuLi5ib3RoIGNoYW5nZXMgc2hvdWxkIGJlIHJlY2VpdmVkLiBDaGFuZ2UgZGlzY29u
bmVjdGVkIHN1YkRpdiBhZ2Fpbi4KK1BBU1MgbXV0YXRpb25zLmxlbmd0aCBpcyAyCitQQVNTIG11
dGF0aW9uc1swXS50eXBlIGlzICJhdHRyaWJ1dGVzIgorUEFTUyBtdXRhdGlvbnNbMF0udGFyZ2V0
IGlzIHN1YkRpdgorUEFTUyBtdXRhdGlvbnNbMF0uYXR0cmlidXRlTmFtZSBpcyAiZm9vIgorUEFT
UyBtdXRhdGlvbnNbMV0udHlwZSBpcyAiYXR0cmlidXRlcyIKK1BBU1MgbXV0YXRpb25zWzFdLnRh
cmdldCBpcyBzdWJEaXYKK1BBU1MgbXV0YXRpb25zWzFdLmF0dHJpYnV0ZU5hbWUgaXMgInRlc3Qi
CisuLi50cmFuc2llbnQgc3VidHJlZSBvYnNlcnZhdGlvbiB3YXMgc3RvcHBlZCBhZnRlciBkZWxp
dmVyeSwgc28gc3ViRGl2IGNoYW5nZSBzaG91bGQgbm90IGJlIHJlY2VpdmVkLiBSZWF0dGFjaCBh
bmQgY2hhbmdlIGFnYWluLgorUEFTUyBtdXRhdGlvbnMgaXMgbnVsbAorLi4ucmVhdHRhY2hlZCBz
dWJ0cmVlIHNob3VsZCBub3cgYmUgb2JzZXJ2YWJsZS4gVHJ5IGRpc2Nvbm5lY3RpbmcgYW5kIHJl
LW9ic2VydmluZy4KK1BBU1MgbXV0YXRpb25zLmxlbmd0aCBpcyAxCitQQVNTIG11dGF0aW9uc1sw
XS50eXBlIGlzICJhdHRyaWJ1dGVzIgorUEFTUyBtdXRhdGlvbnNbMF0udGFyZ2V0IGlzIHN1YkRp
dgorUEFTUyBtdXRhdGlvbnNbMF0uYXR0cmlidXRlTmFtZSBpcyAiZm9vIgorLi4uVGhlIGNoYW5n
ZSBtYWRlIGJlZm9yZSByZS1vYnNlcnZpbmcgc2hvdWxkIGJlIHJlY2VpdmVkLCBidXQgbm90IHRo
ZSBvbmUgYWZ0ZXIuCitQQVNTIG11dGF0aW9ucy5sZW5ndGggaXMgMQorUEFTUyBtdXRhdGlvbnNb
MF0udHlwZSBpcyAiY2hhcmFjdGVyRGF0YSIKK1BBU1MgbXV0YXRpb25zWzBdLnRhcmdldCBpcyBz
dWJEaXYuZmlyc3RDaGlsZAorCitUZXN0aW5nIGNvcnJlY3QgYmVoYXZpb3Igb2YgdHJhbnNpZW50
IG9ic2VydmF0aW9uIHdpdGggY29tcGxleCBtb3ZlbWVudCAuCisuLi5BbGwgY2hhbmdlcyBzaG91
bGQgYmUgcmVjZWl2ZWQgZXhjZXB0IGZvciBzZXR0aW5nIHRoZSAiZCIgYXR0cmlidXRlIG9uIHN1
YkRpdjMgYmVmb3JlIGl0IHdhcyByZWFjaGFibGUgZnJvbSBkaXYuCitQQVNTIG11dGF0aW9ucy5s
ZW5ndGggaXMgNgorUEFTUyBtdXRhdGlvbnNbMF0udHlwZSBpcyAiYXR0cmlidXRlcyIKK1BBU1Mg
bXV0YXRpb25zWzBdLnRhcmdldCBpcyBzdWJEaXYKK1BBU1MgbXV0YXRpb25zWzBdLmF0dHJpYnV0
ZU5hbWUgaXMgImEiCitQQVNTIG11dGF0aW9uc1sxXS50eXBlIGlzICJhdHRyaWJ1dGVzIgorUEFT
UyBtdXRhdGlvbnNbMV0udGFyZ2V0IGlzIHN1YkRpdjIKK1BBU1MgbXV0YXRpb25zWzFdLmF0dHJp
YnV0ZU5hbWUgaXMgImIiCitQQVNTIG11dGF0aW9uc1syXS50eXBlIGlzICJjaGFyYWN0ZXJEYXRh
IgorUEFTUyBtdXRhdGlvbnNbMl0udGFyZ2V0IGlzIHRleHQKK1BBU1MgbXV0YXRpb25zWzNdLnR5
cGUgaXMgImF0dHJpYnV0ZXMiCitQQVNTIG11dGF0aW9uc1szXS50YXJnZXQgaXMgc3ViRGl2Mgor
UEFTUyBtdXRhdGlvbnNbM10uYXR0cmlidXRlTmFtZSBpcyAiZSIKK1BBU1MgbXV0YXRpb25zWzRd
LnR5cGUgaXMgImF0dHJpYnV0ZXMiCitQQVNTIG11dGF0aW9uc1s0XS50YXJnZXQgaXMgc3ViRGl2
MworUEFTUyBtdXRhdGlvbnNbNF0uYXR0cmlidXRlTmFtZSBpcyAiZiIKK1BBU1MgbXV0YXRpb25z
WzVdLnR5cGUgaXMgImF0dHJpYnV0ZXMiCitQQVNTIG11dGF0aW9uc1s1XS50YXJnZXQgaXMgc3Vi
RGl2MgorUEFTUyBtdXRhdGlvbnNbNV0uYXR0cmlidXRlTmFtZSBpcyAiZyIKKwogUEFTUyBzdWNj
ZXNzZnVsbHlQYXJzZWQgaXMgdHJ1ZQogCiBURVNUIENPTVBMRVRFCmRpZmYgLS1naXQgYS9MYXlv
dXRUZXN0cy9mYXN0L211dGF0aW9uL29ic2VydmUtc3VidHJlZS5odG1sIGIvTGF5b3V0VGVzdHMv
ZmFzdC9tdXRhdGlvbi9vYnNlcnZlLXN1YnRyZWUuaHRtbAppbmRleCBiNTJhMjgzOWIxMTUzZjQ3
YjFlZThjMTM2OGU5MDc4NDIzMTk4NWMyLi41Y2E2NDc2M2VkOGNmZDFmOWVkOTA0ZTNjY2ViZjI4
YmI1ZTRiZGU0IDEwMDY0NAotLS0gYS9MYXlvdXRUZXN0cy9mYXN0L211dGF0aW9uL29ic2VydmUt
c3VidHJlZS5odG1sCisrKyBiL0xheW91dFRlc3RzL2Zhc3QvbXV0YXRpb24vb2JzZXJ2ZS1zdWJ0
cmVlLmh0bWwKQEAgLTE1LDcgKzE1LDcgQEAgd2luZG93LmpzVGVzdElzQXN5bmMgPSB0cnVlOwog
dmFyIG11dGF0aW9uczsKIHZhciBtdXRhdGlvbnMyOwogdmFyIGRpdjsKLXZhciBzdWJEaXY7Cit2
YXIgc3ViRGl2LCBzdWJEaXYyLCBzdWJEaXYzLCB0ZXh0OwogdmFyIGNhbGxzOwogCiBmdW5jdGlv
biB0ZXN0QmFzaWMoKSB7CkBAIC0xMzUsNyArMTM1LDE1OSBAQCBmdW5jdGlvbiB0ZXN0TXVsdGlw
bGVPYnNlcnZhdGlvbnMoKSB7CiAKICAgICBzdGFydCgpOwogfQotdmFyIHRlc3RzID0gW3Rlc3RC
YXNpYywgdGVzdE11bHRpcGxlT2JzZXJ2ZXJzLCB0ZXN0TXVsdGlwbGVPYnNlcnZhdGlvbnNdOwor
CitmdW5jdGlvbiB0ZXN0VHJhbnNpZW50RGV0YWNoZWRCYXNpYygpIHsKKyAgICB2YXIgb2JzZXJ2
ZXI7CisKKyAgICBmdW5jdGlvbiBzdGFydCgpIHsKKyAgICAgICAgZGVidWcoJ1Rlc3RpbmcgdGhh
dCB0cmFuc2llbnRseSBkZXRhY2hlZCBub2RlcyBhcmUgc3RpbGwgb2JzZXJ2ZWQgdmlhIHN1YnRy
ZWUuJyk7CisKKyAgICAgICAgbXV0YXRpb25zID0gbnVsbDsKKyAgICAgICAgZGl2ID0gZG9jdW1l
bnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CisgICAgICAgIHN1YkRpdiA9IGRpdi5hcHBlbmRDaGls
ZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSk7CisgICAgICAgIHN1YkRpdi5pbm5lckhU
TUwgPSAnaGVsbG8sIHdvcmxkJzsKKyAgICAgICAgb2JzZXJ2ZXIgPSBuZXcgV2ViS2l0TXV0YXRp
b25PYnNlcnZlcihmdW5jdGlvbihtdXRhdGlvbnMpIHsKKyAgICAgICAgICAgIHdpbmRvdy5tdXRh
dGlvbnMgPSBtdXRhdGlvbnM7CisgICAgICAgIH0pOworCisgICAgICAgIG9ic2VydmVyLm9ic2Vy
dmUoZGl2LCB7YXR0cmlidXRlczogdHJ1ZSwgY2hhcmFjdGVyRGF0YTogdHJ1ZSwgc3VidHJlZTog
dHJ1ZX0pOworICAgICAgICBzdWJEaXYuc2V0QXR0cmlidXRlKCdmb28nLCAnYmFyJyk7CisgICAg
ICAgIGRpdi5yZW1vdmVDaGlsZChzdWJEaXYpOworICAgICAgICBzdWJEaXYuc2V0QXR0cmlidXRl
KCd0ZXN0JywgJ3Rlc3QnKTsKKyAgICAgICAgc2V0VGltZW91dChjaGVja0RlbGl2ZXJlZEFuZENo
YW5nZUFnYWluLCAwKTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiBjaGVja0RlbGl2ZXJlZEFuZENo
YW5nZUFnYWluKCkgeworICAgICAgICBkZWJ1ZygnLi4uYm90aCBjaGFuZ2VzIHNob3VsZCBiZSBy
ZWNlaXZlZC4gQ2hhbmdlIGRpc2Nvbm5lY3RlZCBzdWJEaXYgYWdhaW4uJyk7CisKKyAgICAgICAg
c2hvdWxkQmUoJ211dGF0aW9ucy5sZW5ndGgnLCAnMicpOworICAgICAgICBzaG91bGRCZSgnbXV0
YXRpb25zWzBdLnR5cGUnLCAnImF0dHJpYnV0ZXMiJyk7CisgICAgICAgIHNob3VsZEJlKCdtdXRh
dGlvbnNbMF0udGFyZ2V0JywgJ3N1YkRpdicpOworICAgICAgICBzaG91bGRCZSgnbXV0YXRpb25z
WzBdLmF0dHJpYnV0ZU5hbWUnLCAnImZvbyInKTsKKyAgICAgICAgc2hvdWxkQmUoJ211dGF0aW9u
c1sxXS50eXBlJywgJyJhdHRyaWJ1dGVzIicpOworICAgICAgICBzaG91bGRCZSgnbXV0YXRpb25z
WzFdLnRhcmdldCcsICdzdWJEaXYnKTsKKyAgICAgICAgc2hvdWxkQmUoJ211dGF0aW9uc1sxXS5h
dHRyaWJ1dGVOYW1lJywgJyJ0ZXN0IicpOworCisgICAgICAgIG11dGF0aW9ucyA9IG51bGw7Cisg
ICAgICAgIHN1YkRpdi5zZXRBdHRyaWJ1dGUoJ2ZvbycsICdiYXonKTsKKworICAgICAgICBzZXRU
aW1lb3V0KGNoZWNrTm90RGVsaXZlcmVkQW5kUmVhdHRhY2gpOworICAgIH0KKworICAgIGZ1bmN0
aW9uIGNoZWNrTm90RGVsaXZlcmVkQW5kUmVhdHRhY2goKSB7CisgICAgICAgIGRlYnVnKCcuLi50
cmFuc2llbnQgc3VidHJlZSBvYnNlcnZhdGlvbiB3YXMgc3RvcHBlZCBhZnRlciBkZWxpdmVyeSwg
c28gc3ViRGl2IGNoYW5nZSBzaG91bGQgbm90IGJlIHJlY2VpdmVkLiBSZWF0dGFjaCBhbmQgY2hh
bmdlIGFnYWluLicpOworCisgICAgICAgIHNob3VsZEJlKCdtdXRhdGlvbnMnLCAnbnVsbCcpOwor
CisgICAgICAgIG11dGF0aW9ucyA9IG51bGwKKyAgICAgICAgZGl2LmFwcGVuZENoaWxkKHN1YkRp
dik7CisgICAgICAgIHN1YkRpdi5zZXRBdHRyaWJ1dGUoJ2ZvbycsICdiYXQnKTsKKworICAgICAg
ICBzZXRUaW1lb3V0KGNoZWNrRGVsaXZlcmVkQW5kUmVvYnNlcnZlKTsKKyAgICB9CisKKyAgICBm
dW5jdGlvbiBjaGVja0RlbGl2ZXJlZEFuZFJlb2JzZXJ2ZSgpIHsKKyAgICAgICAgZGVidWcoJy4u
LnJlYXR0YWNoZWQgc3VidHJlZSBzaG91bGQgbm93IGJlIG9ic2VydmFibGUuIFRyeSBkaXNjb25u
ZWN0aW5nIGFuZCByZS1vYnNlcnZpbmcuJyk7CisKKyAgICAgICAgc2hvdWxkQmUoJ211dGF0aW9u
cy5sZW5ndGgnLCAnMScpOworICAgICAgICBzaG91bGRCZSgnbXV0YXRpb25zWzBdLnR5cGUnLCAn
ImF0dHJpYnV0ZXMiJyk7CisgICAgICAgIHNob3VsZEJlKCdtdXRhdGlvbnNbMF0udGFyZ2V0Jywg
J3N1YkRpdicpOworICAgICAgICBzaG91bGRCZSgnbXV0YXRpb25zWzBdLmF0dHJpYnV0ZU5hbWUn
LCAnImZvbyInKTsKKworICAgICAgICBtdXRhdGlvbnMgPSBudWxsOworICAgICAgICBkaXYucmVt
b3ZlQ2hpbGQoc3ViRGl2KTsKKyAgICAgICAgc3ViRGl2LmZpcnN0Q2hpbGQudGV4dENvbnRlbnQg
PSAnYmFkYnllJzsKKyAgICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZShkaXYsIHthdHRyaWJ1dGVzOiB0
cnVlLCBjaGFyYWN0ZXJEYXRhOiB0cnVlLCBzdWJ0cmVlOiB0cnVlfSk7CisgICAgICAgIHN1YkRp
di5zZXRBdHRyaWJ1dGUoJ2ZvbycsICdib28nKTsKKworICAgICAgICBzZXRUaW1lb3V0KGZpbmlz
aCk7CisgICAgfQorCisKKyAgICBmdW5jdGlvbiBmaW5pc2goKSB7CisgICAgICAgIGRlYnVnKCcu
Li5UaGUgY2hhbmdlIG1hZGUgYmVmb3JlIHJlLW9ic2VydmluZyBzaG91bGQgYmUgcmVjZWl2ZWQs
IGJ1dCBub3QgdGhlIG9uZSBhZnRlci4nKTsKKworICAgICAgICBzaG91bGRCZSgnbXV0YXRpb25z
Lmxlbmd0aCcsICcxJyk7CisgICAgICAgIHNob3VsZEJlKCdtdXRhdGlvbnNbMF0udHlwZScsICci
Y2hhcmFjdGVyRGF0YSInKTsKKyAgICAgICAgc2hvdWxkQmUoJ211dGF0aW9uc1swXS50YXJnZXQn
LCAnc3ViRGl2LmZpcnN0Q2hpbGQnKTsKKworICAgICAgICBvYnNlcnZlci5kaXNjb25uZWN0KCk7
CisgICAgICAgIGRlYnVnKCcnKTsKKyAgICAgICAgcnVuTmV4dFRlc3QoKTsKKyAgICB9CisgICAg
c3RhcnQoKTsKK30KKworZnVuY3Rpb24gdGVzdFRyYW5zaWVudERldGFjaGVkRGV0YWlsZWQoKSB7
CisgICAgdmFyIG9ic2VydmVyOworCisgICAgZnVuY3Rpb24gc3RhcnQoKSB7CisgICAgICAgIGRl
YnVnKCdUZXN0aW5nIGNvcnJlY3QgYmVoYXZpb3Igb2YgdHJhbnNpZW50IG9ic2VydmF0aW9uIHdp
dGggY29tcGxleCBtb3ZlbWVudCAuJyk7CisKKyAgICAgICAgbXV0YXRpb25zID0gbnVsbDsKKyAg
ICAgICAgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CisgICAgICAgIHN1YkRp
diA9IGRpdi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSk7CisgICAg
ICAgIHN1YkRpdjIgPSBzdWJEaXYuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgn
ZGl2JykpOworICAgICAgICBzdWJEaXYyLmlubmVySFRNTCA9ICdoZWxsbywgd29ybGQnOworICAg
ICAgICBzdWJEaXYzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CisKKyAgICAgICAg
b2JzZXJ2ZXIgPSBuZXcgV2ViS2l0TXV0YXRpb25PYnNlcnZlcihmdW5jdGlvbihtdXRhdGlvbnMp
IHsKKyAgICAgICAgICAgIHdpbmRvdy5tdXRhdGlvbnMgPSBtdXRhdGlvbnM7CisgICAgICAgIH0p
OworCisgICAgICAgIG9ic2VydmVyLm9ic2VydmUoZGl2LCB7YXR0cmlidXRlczogdHJ1ZSwgY2hh
cmFjdGVyRGF0YTogdHJ1ZSwgc3VidHJlZTogdHJ1ZX0pOworICAgICAgICBkaXYucmVtb3ZlQ2hp
bGQoc3ViRGl2KTsKKyAgICAgICAgc3ViRGl2LnJlbW92ZUNoaWxkKHN1YkRpdjIpOworICAgICAg
ICB0ZXh0ID0gc3ViRGl2Mi5yZW1vdmVDaGlsZChzdWJEaXYyLmZpcnN0Q2hpbGQpOworCisgICAg
ICAgIHN1YkRpdi5zZXRBdHRyaWJ1dGUoJ2EnLCAnYScpOworICAgICAgICBzdWJEaXYyLnNldEF0
dHJpYnV0ZSgnYicsICdiJyk7CisgICAgICAgIHRleHQudGV4dENvbnRlbnQgPSAnYyc7CisgICAg
ICAgIHN1YkRpdjMuYXBwZW5kQ2hpbGQoc3ViRGl2Mik7CisgICAgICAgIHN1YkRpdjMuc2V0QXR0
cmlidXRlKCdkJywgJ2QnKTsKKyAgICAgICAgc3ViRGl2Mi5zZXRBdHRyaWJ1dGUoJ2UnLCAnZScp
OworICAgICAgICBkaXYuYXBwZW5kQ2hpbGQoc3ViRGl2Myk7CisgICAgICAgIHN1YkRpdjMuc2V0
QXR0cmlidXRlKCdmJywgJ2YnKTsKKyAgICAgICAgc3ViRGl2Mi5zZXRBdHRyaWJ1dGUoJ2cnLCAn
ZycpOworCisgICAgICAgIHNldFRpbWVvdXQoZmluaXNoLCAwKTsKKyAgICB9CisKKyAgICBmdW5j
dGlvbiBmaW5pc2goKSB7CisgICAgICAgIGRlYnVnKCcuLi5BbGwgY2hhbmdlcyBzaG91bGQgYmUg
cmVjZWl2ZWQgZXhjZXB0IGZvciBzZXR0aW5nIHRoZSAiZCIgYXR0cmlidXRlIG9uIHN1YkRpdjMg
YmVmb3JlIGl0IHdhcyByZWFjaGFibGUgZnJvbSBkaXYuJyk7CisKKyAgICAgICAgc2hvdWxkQmUo
J211dGF0aW9ucy5sZW5ndGgnLCAnNicpOworICAgICAgICBzaG91bGRCZSgnbXV0YXRpb25zWzBd
LnR5cGUnLCAnImF0dHJpYnV0ZXMiJyk7CisgICAgICAgIHNob3VsZEJlKCdtdXRhdGlvbnNbMF0u
dGFyZ2V0JywgJ3N1YkRpdicpOworICAgICAgICBzaG91bGRCZSgnbXV0YXRpb25zWzBdLmF0dHJp
YnV0ZU5hbWUnLCAnImEiJyk7CisKKyAgICAgICAgc2hvdWxkQmUoJ211dGF0aW9uc1sxXS50eXBl
JywgJyJhdHRyaWJ1dGVzIicpOworICAgICAgICBzaG91bGRCZSgnbXV0YXRpb25zWzFdLnRhcmdl
dCcsICdzdWJEaXYyJyk7CisgICAgICAgIHNob3VsZEJlKCdtdXRhdGlvbnNbMV0uYXR0cmlidXRl
TmFtZScsICciYiInKTsKKworICAgICAgICBzaG91bGRCZSgnbXV0YXRpb25zWzJdLnR5cGUnLCAn
ImNoYXJhY3RlckRhdGEiJyk7CisgICAgICAgIHNob3VsZEJlKCdtdXRhdGlvbnNbMl0udGFyZ2V0
JywgJ3RleHQnKTsKKworICAgICAgICBzaG91bGRCZSgnbXV0YXRpb25zWzNdLnR5cGUnLCAnImF0
dHJpYnV0ZXMiJyk7CisgICAgICAgIHNob3VsZEJlKCdtdXRhdGlvbnNbM10udGFyZ2V0JywgJ3N1
YkRpdjInKTsKKyAgICAgICAgc2hvdWxkQmUoJ211dGF0aW9uc1szXS5hdHRyaWJ1dGVOYW1lJywg
JyJlIicpOworCisgICAgICAgIHNob3VsZEJlKCdtdXRhdGlvbnNbNF0udHlwZScsICciYXR0cmli
dXRlcyInKTsKKyAgICAgICAgc2hvdWxkQmUoJ211dGF0aW9uc1s0XS50YXJnZXQnLCAnc3ViRGl2
MycpOworICAgICAgICBzaG91bGRCZSgnbXV0YXRpb25zWzRdLmF0dHJpYnV0ZU5hbWUnLCAnImYi
Jyk7CisKKyAgICAgICAgc2hvdWxkQmUoJ211dGF0aW9uc1s1XS50eXBlJywgJyJhdHRyaWJ1dGVz
IicpOworICAgICAgICBzaG91bGRCZSgnbXV0YXRpb25zWzVdLnRhcmdldCcsICdzdWJEaXYyJyk7
CisgICAgICAgIHNob3VsZEJlKCdtdXRhdGlvbnNbNV0uYXR0cmlidXRlTmFtZScsICciZyInKTsK
KworICAgICAgICBvYnNlcnZlci5kaXNjb25uZWN0KCk7CisgICAgICAgIGRlYnVnKCcnKTsKKyAg
ICAgICAgcnVuTmV4dFRlc3QoKTsKKyAgICB9CisgICAgc3RhcnQoKTsKK30KKwordmFyIHRlc3Rz
ID0gW3Rlc3RCYXNpYywgdGVzdE11bHRpcGxlT2JzZXJ2ZXJzLCB0ZXN0TXVsdGlwbGVPYnNlcnZh
dGlvbnMsIHRlc3RUcmFuc2llbnREZXRhY2hlZEJhc2ljLCB0ZXN0VHJhbnNpZW50RGV0YWNoZWRE
ZXRhaWxlZF07CiB2YXIgdGVzdEluZGV4ID0gMDsKIAogZnVuY3Rpb24gcnVuTmV4dFRlc3QoKSB7
Cg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>112715</attachid>
            <date>2011-10-27 11:24:24 -0700</date>
            <delta_ts>2011-10-27 14:14:28 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-70788-20111027112423.patch</filename>
            <type>text/plain</type>
            <size>33394</size>
            <attacher name="Rafael Weinstein">rafaelw</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogOTg2MDgKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0No
YW5nZUxvZyBiL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwppbmRleCA2MGY1NDA4ZjRiYTFhMTc3
MWQ2ZjFlOGE3YzVjMjViMGQ2ZmIwNTIxLi44NWJkZDk3MTVhMzBhNjg1ZmU0OGU1NzIxNTA1M2Vh
NDBlZjk1NmEyIDEwMDc1NQotLS0gYS9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvU291
cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsNTEgQEAKKzIwMTEtMTAtMjQgIFJhZmFl
bCBXZWluc3RlaW4gIDxyYWZhZWx3QGNocm9taXVtLm9yZz4KKworICAgICAgICBbTXV0YXRpb25P
YnNlcnZlcnNdIEltcGxlbWVudCBzdWJ0cmVlIG9ic2VydmF0aW9uIG9mIHRyYW5zaWVudGx5IGRp
c2Nvbm5lY3RlZCBub2RlcworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1
Zy5jZ2k/aWQ9NzA3ODgKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKwor
ICAgICAgICBUaGlzIHBhdGNoIGFkZHMgc3VwcG9ydCBmb3Igb2JzZXJ2aW5nIGFsbCBkZXNjZW5k
YW50IG5vZGVzIHJlYWNoYWJsZSBmcm9tIGEgc3VidHJlZQorICAgICAgICBvYnNlcnZhdGlvbiB1
bnRpbCBkZWxpdmVyeSBvZiBtdXRhdGlvbnMgLS0gZXZlbiBpZiB0aGV5IGJlY29tZSBkZXRhY2hl
ZC4gV2UgZG8gdGhpcyBieQorICAgICAgICBpbnRyb2R1Y2luZyBhICJ0cmFuc2llbnQgcmVnaXN0
cmF0aW9uIiB3aGljaCBjYW4gZXhpc3QgZm9yIGEgc2hvcnQgdGltZSBhbG9uZyBzaWRlCisgICAg
ICAgIG5vcm1hbCByZWdpc3RyYXRpb25zIG9uIE5vZGUuIFRyYW5zaWVudCByZWdpc3RyYXRpb25z
IGhhdmUgYSByZWZlcmVuY2UgdG8gdGhlIG5vZGUKKyAgICAgICAgd2hpY2ggIm93bnMiIHRoZSBz
dWJ0cmVlIG9ic2VydmF0aW9uIHJlZ2lzdHJhdGlvbiAodGhlICJyZWdpc3RyYXRpb25Ob2RlIiku
IFRyYW5zaWVudAorICAgICAgICByZWdpc3RyYXRpb25zIGFyZSBjbGVhcmVkIGltbWVkaWF0ZWx5
IGJlZm9yZSBtdXRhdGlvbnMgYXJlIGRlbGl2ZXJlZCB0byBhbiBvYnNlcnZlciwKKyAgICAgICAg
b3Igd2hlbiB0aGUgb2JzZXJ2ZXIgcmUtb2JzZXJ2ZXMgYXQgdGhlIHJlZ2lzdHJhdGlvbk5vZGUs
IGluLWVmZmVjdCByZXNldHRpbmcgdGhlCisgICAgICAgIG9ic2VydmF0aW9uLgorCisgICAgICAg
IE5ldyB0ZXN0cyBhZGRlZCB0byBmYXN0L211dGF0aW9uL29ic2VydmUtc3VidHJlZS5odG1sLgor
CisgICAgICAgICogZG9tL0NoYXJhY3RlckRhdGEuY3BwOgorICAgICAgICAoV2ViQ29yZTo6Q2hh
cmFjdGVyRGF0YTo6ZGlzcGF0Y2hNb2RpZmllZEV2ZW50KToKKyAgICAgICAgKiBkb20vQ2hpbGRM
aXN0TXV0YXRpb25TY29wZS5jcHA6CisgICAgICAgIChXZWJDb3JlOjpNdXRhdGlvbkFjY3VtdWxh
dGlvblJvdXRlcjo6Q2hpbGRMaXN0TXV0YXRpb25BY2N1bXVsYXRvcjo6Q2hpbGRMaXN0TXV0YXRp
b25BY2N1bXVsYXRvcik6CisgICAgICAgIChXZWJDb3JlOjpNdXRhdGlvbkFjY3VtdWxhdGlvblJv
dXRlcjo6Q2hpbGRMaXN0TXV0YXRpb25BY2N1bXVsYXRvcjo6ZW5xdWV1ZU11dGF0aW9uUmVjb3Jk
KToKKyAgICAgICAgKFdlYkNvcmU6Ok11dGF0aW9uQWNjdW11bGF0aW9uUm91dGVyOjpNdXRhdGlv
bkFjY3VtdWxhdGlvblJvdXRlcjo6aW5jcmVtZW50U2NvcGluZ0xldmVsKToKKyAgICAgICAgKiBk
b20vQ29udGFpbmVyTm9kZS5jcHA6CisgICAgICAgIChXZWJDb3JlOjpkaXNwYXRjaENoaWxkUmVt
b3ZhbEV2ZW50cyk6CisgICAgICAgICogZG9tL0VsZW1lbnQuY3BwOgorICAgICAgICAoV2ViQ29y
ZTo6ZW5xdWV1ZUF0dHJpYnV0ZXNNdXRhdGlvblJlY29yZCk6CisgICAgICAgICogZG9tL05vZGUu
Y3BwOgorICAgICAgICAoV2ViQ29yZTo6YWRkTWF0Y2hpbmdPYnNlcnZlcnMpOgorICAgICAgICAo
V2ViQ29yZTo6Tm9kZTo6Z2V0UmVnaXN0ZXJlZE11dGF0aW9uT2JzZXJ2ZXJzT2ZUeXBlKToKKyAg
ICAgICAgKFdlYkNvcmU6Ok5vZGU6OnJlZ2lzdGVyTXV0YXRpb25PYnNlcnZlcik6CisgICAgICAg
IChXZWJDb3JlOjpOb2RlOjp1bnJlZ2lzdGVyTXV0YXRpb25PYnNlcnZlcik6CisgICAgICAgIChX
ZWJDb3JlOjpOb2RlOjpub3RpZnlTdWJ0cmVlT2JzZXJ2ZXJzT2ZEaXNjb25uZWN0aW9uKToKKyAg
ICAgICAgKiBkb20vTm9kZS5oOgorICAgICAgICAqIGRvbS9Ob2RlUmFyZURhdGEuaDoKKyAgICAg
ICAgKFdlYkNvcmU6Ok11dGF0aW9uT2JzZXJ2ZXJFbnRyeTo6TXV0YXRpb25PYnNlcnZlckVudHJ5
KToKKyAgICAgICAgKFdlYkNvcmU6Ok11dGF0aW9uT2JzZXJ2ZXJFbnRyeTo6b3BlcmF0b3I9PSk6
CisgICAgICAgICogZG9tL1dlYktpdE11dGF0aW9uT2JzZXJ2ZXIuY3BwOgorICAgICAgICAoV2Vi
Q29yZTo6V2ViS2l0TXV0YXRpb25PYnNlcnZlcjo6b2JzZXJ2ZSk6CisgICAgICAgIChXZWJDb3Jl
Ojp1bnJlZ2lzdGVyVHJhbnNpZW50RW50cmllcyk6CisgICAgICAgIChXZWJDb3JlOjpXZWJLaXRN
dXRhdGlvbk9ic2VydmVyOjpkaXNjb25uZWN0KToKKyAgICAgICAgKFdlYkNvcmU6OldlYktpdE11
dGF0aW9uT2JzZXJ2ZXI6Om9ic2VydmVkTm9kZURlc3RydWN0ZWQpOgorICAgICAgICAoV2ViQ29y
ZTo6V2ViS2l0TXV0YXRpb25PYnNlcnZlcjo6b2JzZXJ2ZWRTdWJ0cmVlV2lsbERpc2Nvbm5lY3Qp
OgorICAgICAgICAoV2ViQ29yZTo6V2ViS2l0TXV0YXRpb25PYnNlcnZlcjo6Y2xlYXJUcmFuc2ll
bnRFbnRyaWVzKToKKyAgICAgICAgKFdlYkNvcmU6OldlYktpdE11dGF0aW9uT2JzZXJ2ZXI6OmRl
bGl2ZXIpOgorICAgICAgICAqIGRvbS9XZWJLaXRNdXRhdGlvbk9ic2VydmVyLmg6CisKIDIwMTEt
MTAtMjcgIERhbiBCZXJuc3RlaW4gIDxtaXR6QGFwcGxlLmNvbT4KIAogICAgICAgICA8cmRhcjov
L3Byb2JsZW0vMTAyNjIyMDU+IEFsbG93IGNvbHVtbiBwcm9ncmVzc2lvbiB0byBiZSBpbmRlcGVu
ZGVudCBvZiB3cml0aW5nIG1vZGUKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2RvbS9DaGFy
YWN0ZXJEYXRhLmNwcCBiL1NvdXJjZS9XZWJDb3JlL2RvbS9DaGFyYWN0ZXJEYXRhLmNwcAppbmRl
eCA1ZTg0MWViMzhmNzQ4YjY2YzRmNmNjZDI1MDJmYzRkYTU1ZGMxZjk1Li4zN2E3ZmJmZmJhMmFh
OWYzMWU5NjY5M2JiN2FjOTcyOGI1MjM0YjUzIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9k
b20vQ2hhcmFjdGVyRGF0YS5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvZG9tL0NoYXJhY3RlckRh
dGEuY3BwCkBAIC0xOTMsMTIgKzE5MywxMiBAQCB2b2lkIENoYXJhY3RlckRhdGE6OnVwZGF0ZVJl
bmRlcmVyKHVuc2lnbmVkIG9mZnNldE9mUmVwbGFjZWREYXRhLCB1bnNpZ25lZCBsZW5ndAogdm9p
ZCBDaGFyYWN0ZXJEYXRhOjpkaXNwYXRjaE1vZGlmaWVkRXZlbnQoU3RyaW5nSW1wbCogb2xkRGF0
YSkKIHsKICNpZiBFTkFCTEUoTVVUQVRJT05fT0JTRVJWRVJTKQotICAgIFZlY3RvcjxXZWJLaXRN
dXRhdGlvbk9ic2VydmVyKj4gb2JzZXJ2ZXJzOworICAgIEhhc2hNYXA8V2ViS2l0TXV0YXRpb25P
YnNlcnZlciosIE11dGF0aW9uT2JzZXJ2ZXJPcHRpb25zPiBvYnNlcnZlcnM7CiAgICAgZ2V0UmVn
aXN0ZXJlZE11dGF0aW9uT2JzZXJ2ZXJzT2ZUeXBlKG9ic2VydmVycywgV2ViS2l0TXV0YXRpb25P
YnNlcnZlcjo6Q2hhcmFjdGVyRGF0YSk7CiAgICAgaWYgKCFvYnNlcnZlcnMuaXNFbXB0eSgpKSB7
CiAgICAgICAgIFJlZlB0cjxNdXRhdGlvblJlY29yZD4gbXV0YXRpb24gPSBNdXRhdGlvblJlY29y
ZDo6Y3JlYXRlQ2hhcmFjdGVyRGF0YSh0aGlzKTsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7
IGkgPCBvYnNlcnZlcnMuc2l6ZSgpOyArK2kpCi0gICAgICAgICAgICBvYnNlcnZlcnNbaV0tPmVu
cXVldWVNdXRhdGlvblJlY29yZChtdXRhdGlvbik7CisgICAgICAgIGZvciAoSGFzaE1hcDxXZWJL
aXRNdXRhdGlvbk9ic2VydmVyKiwgTXV0YXRpb25PYnNlcnZlck9wdGlvbnM+OjppdGVyYXRvciBp
dGVyID0gb2JzZXJ2ZXJzLmJlZ2luKCk7IGl0ZXIgIT0gb2JzZXJ2ZXJzLmVuZCgpOyArK2l0ZXIp
CisgICAgICAgICAgICAgICAgaXRlci0+Zmlyc3QtPmVucXVldWVNdXRhdGlvblJlY29yZChtdXRh
dGlvbik7CiAgICAgfQogI2VuZGlmCiAgICAgaWYgKHBhcmVudE5vZGUoKSkKZGlmZiAtLWdpdCBh
L1NvdXJjZS9XZWJDb3JlL2RvbS9DaGlsZExpc3RNdXRhdGlvblNjb3BlLmNwcCBiL1NvdXJjZS9X
ZWJDb3JlL2RvbS9DaGlsZExpc3RNdXRhdGlvblNjb3BlLmNwcAppbmRleCA0ZTVmMGE5MGQ3NjU5
MjdlNzY0N2E0MDkxNmU4M2ZkMjQzYjRlZmMzLi41ZGNiZGNmZjMwZGFhOThjYjkwMWI3YjZlZWEw
ZTRkMTY5OGZlNjJiIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9kb20vQ2hpbGRMaXN0TXV0
YXRpb25TY29wZS5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvZG9tL0NoaWxkTGlzdE11dGF0aW9u
U2NvcGUuY3BwCkBAIC01Myw3ICs1Myw3IEBAIG5hbWVzcGFjZSB7CiBjbGFzcyBDaGlsZExpc3RN
dXRhdGlvbkFjY3VtdWxhdG9yIDogcHVibGljIFJlZkNvdW50ZWQ8Q2hpbGRMaXN0TXV0YXRpb25B
Y2N1bXVsYXRvcj4gewogICAgIFdURl9NQUtFX05PTkNPUFlBQkxFKENoaWxkTGlzdE11dGF0aW9u
QWNjdW11bGF0b3IpOwogcHVibGljOgotICAgIENoaWxkTGlzdE11dGF0aW9uQWNjdW11bGF0b3Io
UGFzc1JlZlB0cjxOb2RlPiwgVmVjdG9yPFdlYktpdE11dGF0aW9uT2JzZXJ2ZXIqPiYpOworICAg
IENoaWxkTGlzdE11dGF0aW9uQWNjdW11bGF0b3IoUGFzc1JlZlB0cjxOb2RlPiwgSGFzaE1hcDxX
ZWJLaXRNdXRhdGlvbk9ic2VydmVyKiwgTXV0YXRpb25PYnNlcnZlck9wdGlvbnM+Jik7CiAgICAg
fkNoaWxkTGlzdE11dGF0aW9uQWNjdW11bGF0b3IoKTsKIAogICAgIHZvaWQgY2hpbGRBZGRlZChQ
YXNzUmVmUHRyPE5vZGU+KTsKQEAgLTczLDcgKzczLDcgQEAgcHJpdmF0ZToKICAgICBSZWZQdHI8
Tm9kZT4gbV9uZXh0U2libGluZzsKICAgICBSZWZQdHI8Tm9kZT4gbV9sYXN0QWRkZWQ7CiAKLSAg
ICBWZWN0b3I8V2ViS2l0TXV0YXRpb25PYnNlcnZlcio+IG1fb2JzZXJ2ZXJzOworICAgIEhhc2hN
YXA8V2ViS2l0TXV0YXRpb25PYnNlcnZlciosIE11dGF0aW9uT2JzZXJ2ZXJPcHRpb25zPiBtX29i
c2VydmVyczsKIH07CiAKIGNsYXNzIE11dGF0aW9uQWNjdW11bGF0aW9uUm91dGVyIHsKQEAgLTEw
MCw3ICsxMDAsNyBAQCBwcml2YXRlOgogICAgIHN0YXRpYyBNdXRhdGlvbkFjY3VtdWxhdGlvblJv
dXRlciogc19pbnN0YW5jZTsKIH07CiAKLUNoaWxkTGlzdE11dGF0aW9uQWNjdW11bGF0b3I6OkNo
aWxkTGlzdE11dGF0aW9uQWNjdW11bGF0b3IoUGFzc1JlZlB0cjxOb2RlPiB0YXJnZXQsIFZlY3Rv
cjxXZWJLaXRNdXRhdGlvbk9ic2VydmVyKj4mIG9ic2VydmVycykKK0NoaWxkTGlzdE11dGF0aW9u
QWNjdW11bGF0b3I6OkNoaWxkTGlzdE11dGF0aW9uQWNjdW11bGF0b3IoUGFzc1JlZlB0cjxOb2Rl
PiB0YXJnZXQsIEhhc2hNYXA8V2ViS2l0TXV0YXRpb25PYnNlcnZlciosIE11dGF0aW9uT2JzZXJ2
ZXJPcHRpb25zPiYgb2JzZXJ2ZXJzKQogICAgIDogbV90YXJnZXQodGFyZ2V0KQogewogICAgIG1f
b2JzZXJ2ZXJzLnN3YXAob2JzZXJ2ZXJzKTsKQEAgLTE2OSw4ICsxNjksOCBAQCB2b2lkIENoaWxk
TGlzdE11dGF0aW9uQWNjdW11bGF0b3I6OmVucXVldWVNdXRhdGlvblJlY29yZCgpCiAgICAgUmVm
UHRyPE11dGF0aW9uUmVjb3JkPiBtdXRhdGlvbiA9IE11dGF0aW9uUmVjb3JkOjpjcmVhdGVDaGls
ZExpc3QoCiAgICAgICAgIG1fdGFyZ2V0LCBTdGF0aWNOb2RlTGlzdDo6YWRvcHQobV9hZGRlZE5v
ZGVzKSwgU3RhdGljTm9kZUxpc3Q6OmFkb3B0KG1fcmVtb3ZlZE5vZGVzKSwgbV9wcmV2aW91c1Np
YmxpbmcsIG1fbmV4dFNpYmxpbmcpOwogCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtX29i
c2VydmVycy5zaXplKCk7ICsraSkKLSAgICAgICAgbV9vYnNlcnZlcnNbaV0tPmVucXVldWVNdXRh
dGlvblJlY29yZChtdXRhdGlvbik7CisgICAgZm9yIChIYXNoTWFwPFdlYktpdE11dGF0aW9uT2Jz
ZXJ2ZXIqLCBNdXRhdGlvbk9ic2VydmVyT3B0aW9ucz46Oml0ZXJhdG9yIGl0ZXIgPSBtX29ic2Vy
dmVycy5iZWdpbigpOyBpdGVyICE9IG1fb2JzZXJ2ZXJzLmVuZCgpOyArK2l0ZXIpCisgICAgICAg
IGl0ZXItPmZpcnN0LT5lbnF1ZXVlTXV0YXRpb25SZWNvcmQobXV0YXRpb24pOwogCiAgICAgY2xl
YXIoKTsKIH0KQEAgLTI0NCw3ICsyNDQsNyBAQCB2b2lkIE11dGF0aW9uQWNjdW11bGF0aW9uUm91
dGVyOjppbmNyZW1lbnRTY29waW5nTGV2ZWwoTm9kZSogdGFyZ2V0KQogICAgICAgICByZXR1cm47
CiAgICAgfQogCi0gICAgVmVjdG9yPFdlYktpdE11dGF0aW9uT2JzZXJ2ZXIqPiBvYnNlcnZlcnM7
CisgICAgSGFzaE1hcDxXZWJLaXRNdXRhdGlvbk9ic2VydmVyKiwgTXV0YXRpb25PYnNlcnZlck9w
dGlvbnM+IG9ic2VydmVyczsKICAgICB0YXJnZXQtPmdldFJlZ2lzdGVyZWRNdXRhdGlvbk9ic2Vy
dmVyc09mVHlwZShvYnNlcnZlcnMsIFdlYktpdE11dGF0aW9uT2JzZXJ2ZXI6OkNoaWxkTGlzdCk7
CiAgICAgaWYgKG9ic2VydmVycy5pc0VtcHR5KCkpCiAgICAgICAgIG1fYWNjdW11bGF0aW9ucy5z
ZXQodGFyZ2V0LCAwKTsKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2RvbS9Db250YWluZXJO
b2RlLmNwcCBiL1NvdXJjZS9XZWJDb3JlL2RvbS9Db250YWluZXJOb2RlLmNwcAppbmRleCA3NGM3
OWQ2ZjczMTFiNTA0MWRiZjk1N2Q0M2RlM2M2OTg2NDA2Y2U1Li5kYmQxMDc5NzkxYTgyZmM1MDRi
MDNiY2Q2MWQ2NWE2N2FlMmMxM2VjIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9kb20vQ29u
dGFpbmVyTm9kZS5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvZG9tL0NvbnRhaW5lck5vZGUuY3Bw
CkBAIC0xMTQ0LDYgKzExNDQsNyBAQCBzdGF0aWMgdm9pZCBkaXNwYXRjaENoaWxkUmVtb3ZhbEV2
ZW50cyhOb2RlKiBjaGlsZCkKICAgICBpZiAoYy0+cGFyZW50Tm9kZSgpKSB7CiAgICAgICAgIENo
aWxkTGlzdE11dGF0aW9uU2NvcGUgbXV0YXRpb24oYy0+cGFyZW50Tm9kZSgpKTsKICAgICAgICAg
bXV0YXRpb24ud2lsbFJlbW92ZUNoaWxkKGMpOworICAgICAgICBjLT5ub3RpZnlNdXRhdGlvbk9i
c2VydmVyc05vZGVXaWxsRGV0YWNoKCk7CiAgICAgfQogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL1Nv
dXJjZS9XZWJDb3JlL2RvbS9FbGVtZW50LmNwcCBiL1NvdXJjZS9XZWJDb3JlL2RvbS9FbGVtZW50
LmNwcAppbmRleCBlODk0OTgyNjNjYmQzNWRmOGVmZDg3MjA1MzQ1ZGI2N2IzOWNlYmVmLi5lYzQ4
MDU4MjU3YzQ0ZDdjZmFiNzA1MGQxMmYyNDExNjZjN2RjNmRiIDEwMDY0NAotLS0gYS9Tb3VyY2Uv
V2ViQ29yZS9kb20vRWxlbWVudC5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvZG9tL0VsZW1lbnQu
Y3BwCkBAIC02MTksMTQgKzYxOSwxNCBAQCBjb25zdCBBdG9taWNTdHJpbmcmIEVsZW1lbnQ6Omdl
dEF0dHJpYnV0ZU5TKGNvbnN0IFN0cmluZyYgbmFtZXNwYWNlVVJJLCBjb25zdCBTdAogI2lmIEVO
QUJMRShNVVRBVElPTl9PQlNFUlZFUlMpCiBzdGF0aWMgdm9pZCBlbnF1ZXVlQXR0cmlidXRlc011
dGF0aW9uUmVjb3JkKEVsZW1lbnQqIGVsZW1lbnQsIGNvbnN0IFF1YWxpZmllZE5hbWUmIG5hbWUp
CiB7Ci0gICAgVmVjdG9yPFdlYktpdE11dGF0aW9uT2JzZXJ2ZXIqPiBvYnNlcnZlcnM7CisgICAg
SGFzaE1hcDxXZWJLaXRNdXRhdGlvbk9ic2VydmVyKiwgTXV0YXRpb25PYnNlcnZlck9wdGlvbnM+
IG9ic2VydmVyczsKICAgICBlbGVtZW50LT5nZXRSZWdpc3RlcmVkTXV0YXRpb25PYnNlcnZlcnNP
ZlR5cGUob2JzZXJ2ZXJzLCBXZWJLaXRNdXRhdGlvbk9ic2VydmVyOjpBdHRyaWJ1dGVzKTsKICAg
ICBpZiAob2JzZXJ2ZXJzLmlzRW1wdHkoKSkKICAgICAgICAgcmV0dXJuOwogCiAgICAgUmVmUHRy
PE11dGF0aW9uUmVjb3JkPiBtdXRhdGlvbiA9IE11dGF0aW9uUmVjb3JkOjpjcmVhdGVBdHRyaWJ1
dGVzKGVsZW1lbnQsIG5hbWUpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgb2JzZXJ2ZXJz
LnNpemUoKTsgKytpKQotICAgICAgICBvYnNlcnZlcnNbaV0tPmVucXVldWVNdXRhdGlvblJlY29y
ZChtdXRhdGlvbik7CisgICAgZm9yIChIYXNoTWFwPFdlYktpdE11dGF0aW9uT2JzZXJ2ZXIqLCBN
dXRhdGlvbk9ic2VydmVyT3B0aW9ucz46Oml0ZXJhdG9yIGl0ZXIgPSBvYnNlcnZlcnMuYmVnaW4o
KTsgaXRlciAhPSBvYnNlcnZlcnMuZW5kKCk7ICsraXRlcikKKyAgICAgICAgaXRlci0+Zmlyc3Qt
PmVucXVldWVNdXRhdGlvblJlY29yZChtdXRhdGlvbik7CiB9CiAjZW5kaWYKIApkaWZmIC0tZ2l0
IGEvU291cmNlL1dlYkNvcmUvZG9tL05vZGUuY3BwIGIvU291cmNlL1dlYkNvcmUvZG9tL05vZGUu
Y3BwCmluZGV4IDkyOTRkZTY4NGI2Yjg1NjU1ZDA4MWIxMTJiZjNmN2Q0NjM0NDJjZDMuLjE4NDU2
ODc2OWVhMTMyYmMzZjE1MDY3YWJlYTM2YWVlZmI1NTlkMGYgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9X
ZWJDb3JlL2RvbS9Ob2RlLmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9kb20vTm9kZS5jcHAKQEAg
LTU0OSwxMCArNTQ5LDkgQEAgdm9pZCBOb2RlOjpjbGVhclJhcmVEYXRhKCkKICAgICAgICAgdHJl
ZVNjb3BlKCktPnJlbW92ZU5vZGVMaXN0Q2FjaGUoKTsKIAogI2lmIEVOQUJMRShNVVRBVElPTl9P
QlNFUlZFUlMpCi0gICAgVmVjdG9yPE11dGF0aW9uT2JzZXJ2ZXJFbnRyeT4qIG9ic2VydmVyRW50
cmllcyA9IG11dGF0aW9uT2JzZXJ2ZXJFbnRyaWVzKCk7Ci0gICAgaWYgKG9ic2VydmVyRW50cmll
cykgewotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG9ic2VydmVyRW50cmllcy0+c2l6
ZSgpOyArK2kpCi0gICAgICAgICAgICBvYnNlcnZlckVudHJpZXMtPmF0KGkpLm9ic2VydmVyLT5v
YnNlcnZlZE5vZGVEZXN0cnVjdGVkKHRoaXMpOworICAgIGlmIChWZWN0b3I8TXV0YXRpb25PYnNl
cnZlclJlZ2lzdHJhdGlvbj4qIHJlZ2lzdHJ5ID0gbXV0YXRpb25PYnNlcnZlclJlZ2lzdHJ5KCkp
IHsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByZWdpc3RyeS0+c2l6ZSgpOyArK2kp
CisgICAgICAgICAgICByZWdpc3RyeS0+YXQoaSkub2JzZXJ2ZXItPm9ic2VydmVkTm9kZURlc3Ry
dWN0ZWQodGhpcyk7CiAgICAgfQogI2VuZGlmCiAKQEAgLTI2OTgsNjUgKzI2OTcsODYgQEAgRXZl
bnRUYXJnZXREYXRhKiBOb2RlOjplbnN1cmVFdmVudFRhcmdldERhdGEoKQogfQogCiAjaWYgRU5B
QkxFKE1VVEFUSU9OX09CU0VSVkVSUykKLVZlY3RvcjxNdXRhdGlvbk9ic2VydmVyRW50cnk+KiBO
b2RlOjptdXRhdGlvbk9ic2VydmVyRW50cmllcygpCitWZWN0b3I8TXV0YXRpb25PYnNlcnZlclJl
Z2lzdHJhdGlvbj4qIE5vZGU6Om11dGF0aW9uT2JzZXJ2ZXJSZWdpc3RyeSgpCiB7Ci0gICAgcmV0
dXJuIGhhc1JhcmVEYXRhKCkgPyByYXJlRGF0YSgpLT5tdXRhdGlvbk9ic2VydmVyRW50cmllcygp
IDogMDsKKyAgICByZXR1cm4gaGFzUmFyZURhdGEoKSA/IHJhcmVEYXRhKCktPm11dGF0aW9uT2Jz
ZXJ2ZXJSZWdpc3RyeSgpIDogMDsKIH0KIAotc3RhdGljIHZvaWQgYWRkTWF0Y2hpbmdPYnNlcnZl
cnMoSGFzaFNldDxXZWJLaXRNdXRhdGlvbk9ic2VydmVyKj4mIG9ic2VydmVyU2V0LCBWZWN0b3I8
TXV0YXRpb25PYnNlcnZlckVudHJ5Piogb2JzZXJ2ZXJFbnRyaWVzLCBNdXRhdGlvbk9ic2VydmVy
T3B0aW9ucyBvcHRpb25zKQorc3RhdGljIHZvaWQgYWRkTWF0Y2hpbmdPYnNlcnZlcnMoSGFzaE1h
cDxXZWJLaXRNdXRhdGlvbk9ic2VydmVyKiwgTXV0YXRpb25PYnNlcnZlck9wdGlvbnM+JiBvYnNl
cnZlcnMsIFZlY3RvcjxNdXRhdGlvbk9ic2VydmVyUmVnaXN0cmF0aW9uPiogcmVnaXN0cnksIE11
dGF0aW9uT2JzZXJ2ZXJPcHRpb25zIG9wdGlvbnMpCiB7Ci0gICAgaWYgKCFvYnNlcnZlckVudHJp
ZXMpCisgICAgaWYgKCFyZWdpc3RyeSkKICAgICAgICAgcmV0dXJuOwogCi0gICAgY29uc3Qgc2l6
ZV90IHNpemUgPSBvYnNlcnZlckVudHJpZXMtPnNpemUoKTsKKyAgICBjb25zdCBzaXplX3Qgc2l6
ZSA9IHJlZ2lzdHJ5LT5zaXplKCk7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyAr
K2kpIHsKLSAgICAgICAgTXV0YXRpb25PYnNlcnZlckVudHJ5JiBlbnRyeSA9IG9ic2VydmVyRW50
cmllcy0+YXQoaSk7Ci0gICAgICAgIGlmIChlbnRyeS5oYXNBbGxPcHRpb25zKG9wdGlvbnMpKQot
ICAgICAgICAgICAgb2JzZXJ2ZXJTZXQuYWRkKGVudHJ5Lm9ic2VydmVyLmdldCgpKTsKKyAgICAg
ICAgTXV0YXRpb25PYnNlcnZlclJlZ2lzdHJhdGlvbiYgZW50cnkgPSByZWdpc3RyeS0+YXQoaSk7
CisKKyAgICAgICAgaWYgKCFlbnRyeS5oYXNBbGxPcHRpb25zKG9wdGlvbnMpKQorICAgICAgICAg
ICAgY29udGludWU7CisKKyAgICAgICAgcGFpcjxIYXNoTWFwPFdlYktpdE11dGF0aW9uT2JzZXJ2
ZXIqLCBNdXRhdGlvbk9ic2VydmVyT3B0aW9ucz46Oml0ZXJhdG9yLCBib29sPiByZXN1bHQgPSBv
YnNlcnZlcnMuYWRkKGVudHJ5Lm9ic2VydmVyLmdldCgpLCBlbnRyeS5vcHRpb25zKTsKKyAgICAg
ICAgaWYgKCFyZXN1bHQuc2Vjb25kKQorICAgICAgICAgICAgcmVzdWx0LmZpcnN0LT5zZWNvbmQg
fD0gZW50cnkub3B0aW9uczsKICAgICB9CiB9CiAKLXZvaWQgTm9kZTo6Z2V0UmVnaXN0ZXJlZE11
dGF0aW9uT2JzZXJ2ZXJzT2ZUeXBlKFZlY3RvcjxXZWJLaXRNdXRhdGlvbk9ic2VydmVyKj4mIG9i
c2VydmVycywgV2ViS2l0TXV0YXRpb25PYnNlcnZlcjo6TXV0YXRpb25UeXBlIHR5cGUpCit2b2lk
IE5vZGU6OmdldFJlZ2lzdGVyZWRNdXRhdGlvbk9ic2VydmVyc09mVHlwZShIYXNoTWFwPFdlYktp
dE11dGF0aW9uT2JzZXJ2ZXIqLCBNdXRhdGlvbk9ic2VydmVyT3B0aW9ucz4mIG9ic2VydmVycywg
V2ViS2l0TXV0YXRpb25PYnNlcnZlcjo6TXV0YXRpb25UeXBlIHR5cGUpCiB7Ci0gICAgSGFzaFNl
dDxXZWJLaXRNdXRhdGlvbk9ic2VydmVyKj4gb2JzZXJ2ZXJTZXQ7Ci0gICAgYWRkTWF0Y2hpbmdP
YnNlcnZlcnMob2JzZXJ2ZXJTZXQsIG11dGF0aW9uT2JzZXJ2ZXJFbnRyaWVzKCksIHR5cGUpOwor
ICAgIGFkZE1hdGNoaW5nT2JzZXJ2ZXJzKG9ic2VydmVycywgbXV0YXRpb25PYnNlcnZlclJlZ2lz
dHJ5KCksIHR5cGUpOwogICAgIGZvciAoTm9kZSogbm9kZSA9IHBhcmVudE5vZGUoKTsgbm9kZTsg
bm9kZSA9IG5vZGUtPnBhcmVudE5vZGUoKSkKLSAgICAgICAgYWRkTWF0Y2hpbmdPYnNlcnZlcnMo
b2JzZXJ2ZXJTZXQsIG5vZGUtPm11dGF0aW9uT2JzZXJ2ZXJFbnRyaWVzKCksIHR5cGUgfCBXZWJL
aXRNdXRhdGlvbk9ic2VydmVyOjpTdWJ0cmVlKTsKLQotICAgIC8vIEZJWE1FOiB0aGlzIG1ldGhv
ZCBzaG91bGQgb3V0cHV0IGEgSGFzaFNldCBpbnN0ZWFkIG9mIGEgVmVjdG9yLgotICAgIGlmICgh
b2JzZXJ2ZXJTZXQuaXNFbXB0eSgpKQotICAgICAgICBjb3B5VG9WZWN0b3Iob2JzZXJ2ZXJTZXQs
IG9ic2VydmVycyk7CisgICAgICAgIGFkZE1hdGNoaW5nT2JzZXJ2ZXJzKG9ic2VydmVycywgbm9k
ZS0+bXV0YXRpb25PYnNlcnZlclJlZ2lzdHJ5KCksIHR5cGUgfCBXZWJLaXRNdXRhdGlvbk9ic2Vy
dmVyOjpTdWJ0cmVlKTsKIH0KIAotTm9kZTo6TXV0YXRpb25SZWdpc3RyYXRpb25SZXN1bHQgTm9k
ZTo6cmVnaXN0ZXJNdXRhdGlvbk9ic2VydmVyKFBhc3NSZWZQdHI8V2ViS2l0TXV0YXRpb25PYnNl
cnZlcj4gb2JzZXJ2ZXIsIE11dGF0aW9uT2JzZXJ2ZXJPcHRpb25zIG9wdGlvbnMpCitOb2RlOjpN
dXRhdGlvblJlZ2lzdHJhdGlvblJlc3VsdCBOb2RlOjpyZWdpc3Rlck11dGF0aW9uT2JzZXJ2ZXIo
UGFzc1JlZlB0cjxXZWJLaXRNdXRhdGlvbk9ic2VydmVyPiBvYnNlcnZlciwgTXV0YXRpb25PYnNl
cnZlck9wdGlvbnMgb3B0aW9ucywgTm9kZSogcmVnaXN0cmF0aW9uTm9kZSkKIHsKLSAgICBWZWN0
b3I8TXV0YXRpb25PYnNlcnZlckVudHJ5Piogb2JzZXJ2ZXJFbnRyaWVzID0gZW5zdXJlUmFyZURh
dGEoKS0+ZW5zdXJlTXV0YXRpb25PYnNlcnZlckVudHJpZXMoKTsKLSAgICBNdXRhdGlvbk9ic2Vy
dmVyRW50cnkgZW50cnkob2JzZXJ2ZXIsIG9wdGlvbnMpOworICAgIFZlY3RvcjxNdXRhdGlvbk9i
c2VydmVyUmVnaXN0cmF0aW9uPiogcmVnaXN0cnkgPSBlbnN1cmVSYXJlRGF0YSgpLT5lbnN1cmVN
dXRhdGlvbk9ic2VydmVyUmVnaXN0cnkoKTsKKyAgICBNdXRhdGlvbk9ic2VydmVyUmVnaXN0cmF0
aW9uIHJlZ2lzdHJhdGlvbihvYnNlcnZlciwgb3B0aW9ucywgcmVnaXN0cmF0aW9uTm9kZSk7CiAK
LSAgICBzaXplX3QgaW5kZXggPSBvYnNlcnZlckVudHJpZXMtPmZpbmQoZW50cnkpOworICAgIHNp
emVfdCBpbmRleCA9IHJlZ2lzdHJ5LT5maW5kKHJlZ2lzdHJhdGlvbik7CiAgICAgaWYgKGluZGV4
ID09IG5vdEZvdW5kKSB7Ci0gICAgICAgIG9ic2VydmVyRW50cmllcy0+YXBwZW5kKGVudHJ5KTsK
KyAgICAgICAgcmVnaXN0cnktPmFwcGVuZChyZWdpc3RyYXRpb24pOwogICAgICAgICByZXR1cm4g
TXV0YXRpb25PYnNlcnZlclJlZ2lzdGVyZWQ7CiAgICAgfQogCi0gICAgKCpvYnNlcnZlckVudHJp
ZXMpW2luZGV4XS5vcHRpb25zID0gZW50cnkub3B0aW9uczsKKyAgICByZWdpc3RyeS0+YXQoaW5k
ZXgpLm9wdGlvbnMgPSByZWdpc3RyYXRpb24ub3B0aW9uczsKICAgICByZXR1cm4gTXV0YXRpb25S
ZWdpc3RyYXRpb25PcHRpb25zUmVzZXQ7CiB9CiAKLXZvaWQgTm9kZTo6dW5yZWdpc3Rlck11dGF0
aW9uT2JzZXJ2ZXIoUGFzc1JlZlB0cjxXZWJLaXRNdXRhdGlvbk9ic2VydmVyPiBvYnNlcnZlcikK
K3ZvaWQgTm9kZTo6dW5yZWdpc3Rlck11dGF0aW9uT2JzZXJ2ZXIoUGFzc1JlZlB0cjxXZWJLaXRN
dXRhdGlvbk9ic2VydmVyPiBvYnNlcnZlciwgTm9kZSogcmVnaXN0cmF0aW9uTm9kZSkKIHsKLSAg
ICBWZWN0b3I8TXV0YXRpb25PYnNlcnZlckVudHJ5Piogb2JzZXJ2ZXJFbnRyaWVzID0gbXV0YXRp
b25PYnNlcnZlckVudHJpZXMoKTsKLSAgICBBU1NFUlQob2JzZXJ2ZXJFbnRyaWVzKTsKLSAgICBp
ZiAoIW9ic2VydmVyRW50cmllcykKKyAgICBWZWN0b3I8TXV0YXRpb25PYnNlcnZlclJlZ2lzdHJh
dGlvbj4qIHJlZ2lzdHJ5ID0gbXV0YXRpb25PYnNlcnZlclJlZ2lzdHJ5KCk7CisgICAgQVNTRVJU
KHJlZ2lzdHJ5KTsKKyAgICBpZiAoIXJlZ2lzdHJ5KQogICAgICAgICByZXR1cm47CiAKLSAgICBN
dXRhdGlvbk9ic2VydmVyRW50cnkgZW50cnkob2JzZXJ2ZXIsIDApOwotICAgIHNpemVfdCBpbmRl
eCA9IG9ic2VydmVyRW50cmllcy0+ZmluZChlbnRyeSk7CisgICAgTXV0YXRpb25PYnNlcnZlclJl
Z2lzdHJhdGlvbiByZWdpc3RyYXRpb24ob2JzZXJ2ZXIsIDAsIHJlZ2lzdHJhdGlvbk5vZGUpOwor
ICAgIHNpemVfdCBpbmRleCA9IHJlZ2lzdHJ5LT5maW5kKHJlZ2lzdHJhdGlvbik7CiAgICAgQVNT
RVJUKGluZGV4ICE9IG5vdEZvdW5kKTsKICAgICBpZiAoaW5kZXggPT0gbm90Rm91bmQpCiAgICAg
ICAgIHJldHVybjsKIAotICAgIG9ic2VydmVyRW50cmllcy0+cmVtb3ZlKGluZGV4KTsKKyAgICBy
ZWdpc3RyeS0+cmVtb3ZlKGluZGV4KTsKK30KKwordm9pZCBOb2RlOjpub3RpZnlNdXRhdGlvbk9i
c2VydmVyc05vZGVXaWxsRGV0YWNoKCkKK3sKKyAgICBmb3IgKE5vZGUqIG5vZGUgPSBwYXJlbnRO
b2RlKCk7IG5vZGU7IG5vZGUgPSBub2RlLT5wYXJlbnROb2RlKCkpIHsKKyAgICAgICAgVmVjdG9y
PE11dGF0aW9uT2JzZXJ2ZXJSZWdpc3RyYXRpb24+KiByZWdpc3RyeSA9IG5vZGUtPm11dGF0aW9u
T2JzZXJ2ZXJSZWdpc3RyeSgpOworICAgICAgICBpZiAoIXJlZ2lzdHJ5KQorICAgICAgICAgICAg
Y29udGludWU7CisKKyAgICAgICAgY29uc3Qgc2l6ZV90IHNpemUgPSByZWdpc3RyeS0+c2l6ZSgp
OworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7ICsraSkgeworICAgICAgICAg
ICAgTXV0YXRpb25PYnNlcnZlclJlZ2lzdHJhdGlvbiYgcmVnaXN0cmF0aW9uID0gcmVnaXN0cnkt
PmF0KGkpOworICAgICAgICAgICAgaWYgKCFyZWdpc3RyYXRpb24uaGFzQWxsT3B0aW9ucyhXZWJL
aXRNdXRhdGlvbk9ic2VydmVyOjpTdWJ0cmVlKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsK
KworICAgICAgICAgICAgTm9kZSogcmVnaXN0cmF0aW9uTm9kZSA9IHJlZ2lzdHJhdGlvbi5yZWdp
c3RyYXRpb25Ob2RlOworICAgICAgICAgICAgaWYgKCFyZWdpc3RyYXRpb25Ob2RlKQorICAgICAg
ICAgICAgICAgIHJlZ2lzdHJhdGlvbk5vZGUgPSBub2RlOworICAgICAgICAgICAgcmVnaXN0cmF0
aW9uLm9ic2VydmVyLT53aWxsRGV0YWNoTm9kZUluT2JzZXJ2ZWRTdWJ0cmVlKHJlZ2lzdHJhdGlv
bk5vZGUsIHJlZ2lzdHJhdGlvbi5vcHRpb25zLCB0aGlzKTsKKyAgICAgICAgfQorICAgIH0KIH0K
ICNlbmRpZiAvLyBFTkFCTEUoTVVUQVRJT05fT0JTRVJWRVJTKQogCmRpZmYgLS1naXQgYS9Tb3Vy
Y2UvV2ViQ29yZS9kb20vTm9kZS5oIGIvU291cmNlL1dlYkNvcmUvZG9tL05vZGUuaAppbmRleCA2
NDJkYTBiY2JlYjAzN2QzYjZiN2I2NTdiZDhhYmZlOWRjNThiYjhiLi5jOGExMzE5NzBjY2MzMGQ1
NTczNTA0MjQzN2VjYWM2NTEwZDk0NTVkIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9kb20v
Tm9kZS5oCisrKyBiL1NvdXJjZS9XZWJDb3JlL2RvbS9Ob2RlLmgKQEAgLTgxLDcgKzgxLDcgQEAg
Y2xhc3MgU1ZHVXNlRWxlbWVudDsKIGNsYXNzIFRhZ05vZGVMaXN0OwogY2xhc3MgVHJlZVNjb3Bl
OwogCi1zdHJ1Y3QgTXV0YXRpb25PYnNlcnZlckVudHJ5Oworc3RydWN0IE11dGF0aW9uT2JzZXJ2
ZXJSZWdpc3RyYXRpb247CiAKIHR5cGVkZWYgaW50IEV4Y2VwdGlvbkNvZGU7CiAKQEAgLTU5MCwx
NSArNTkwLDE3IEBAIHB1YmxpYzoKICNlbmRpZgogCiAjaWYgRU5BQkxFKE1VVEFUSU9OX09CU0VS
VkVSUykKLSAgICB2b2lkIGdldFJlZ2lzdGVyZWRNdXRhdGlvbk9ic2VydmVyc09mVHlwZShWZWN0
b3I8V2ViS2l0TXV0YXRpb25PYnNlcnZlcio+JiwgV2ViS2l0TXV0YXRpb25PYnNlcnZlcjo6TXV0
YXRpb25UeXBlKTsKKyAgICB2b2lkIGdldFJlZ2lzdGVyZWRNdXRhdGlvbk9ic2VydmVyc09mVHlw
ZShIYXNoTWFwPFdlYktpdE11dGF0aW9uT2JzZXJ2ZXIqLCBNdXRhdGlvbk9ic2VydmVyT3B0aW9u
cz4mLCBXZWJLaXRNdXRhdGlvbk9ic2VydmVyOjpNdXRhdGlvblR5cGUpOwogCiAgICAgZW51bSBN
dXRhdGlvblJlZ2lzdHJhdGlvblJlc3VsdCB7CiAgICAgICAgIE11dGF0aW9uT2JzZXJ2ZXJSZWdp
c3RlcmVkLAogICAgICAgICBNdXRhdGlvblJlZ2lzdHJhdGlvbk9wdGlvbnNSZXNldAogICAgIH07
Ci0gICAgTXV0YXRpb25SZWdpc3RyYXRpb25SZXN1bHQgcmVnaXN0ZXJNdXRhdGlvbk9ic2VydmVy
KFBhc3NSZWZQdHI8V2ViS2l0TXV0YXRpb25PYnNlcnZlcj4sIE11dGF0aW9uT2JzZXJ2ZXJPcHRp
b25zKTsKKyAgICBNdXRhdGlvblJlZ2lzdHJhdGlvblJlc3VsdCByZWdpc3Rlck11dGF0aW9uT2Jz
ZXJ2ZXIoUGFzc1JlZlB0cjxXZWJLaXRNdXRhdGlvbk9ic2VydmVyPiwgTXV0YXRpb25PYnNlcnZl
ck9wdGlvbnMsIE5vZGUqIHJlZ2lzdHJhdGlvbk5vZGUgPSAwKTsKIAotICAgIHZvaWQgdW5yZWdp
c3Rlck11dGF0aW9uT2JzZXJ2ZXIoUGFzc1JlZlB0cjxXZWJLaXRNdXRhdGlvbk9ic2VydmVyPik7
CisgICAgdm9pZCB1bnJlZ2lzdGVyTXV0YXRpb25PYnNlcnZlcihQYXNzUmVmUHRyPFdlYktpdE11
dGF0aW9uT2JzZXJ2ZXI+LCBOb2RlKiByZWdpc3RyYXRpb25Ob2RlID0gMCk7CisKKyAgICB2b2lk
IG5vdGlmeU11dGF0aW9uT2JzZXJ2ZXJzTm9kZVdpbGxEZXRhY2goKTsKICNlbmRpZiAvLyBFTkFC
TEUoTVVUQVRJT05fT0JTRVJWRVJTKQogCiBwcml2YXRlOgpAQCAtNzI1LDcgKzcyNyw3IEBAIHBy
aXZhdGU6CiAgICAgdm9pZCB0cmFja0ZvckRlYnVnZ2luZygpOwogCiAjaWYgRU5BQkxFKE1VVEFU
SU9OX09CU0VSVkVSUykKLSAgICBWZWN0b3I8TXV0YXRpb25PYnNlcnZlckVudHJ5PiogbXV0YXRp
b25PYnNlcnZlckVudHJpZXMoKTsKKyAgICBWZWN0b3I8TXV0YXRpb25PYnNlcnZlclJlZ2lzdHJh
dGlvbj4qIG11dGF0aW9uT2JzZXJ2ZXJSZWdpc3RyeSgpOwogI2VuZGlmCiAKICAgICBtdXRhYmxl
IHVpbnQzMl90IG1fbm9kZUZsYWdzOwpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvZG9tL05v
ZGVSYXJlRGF0YS5oIGIvU291cmNlL1dlYkNvcmUvZG9tL05vZGVSYXJlRGF0YS5oCmluZGV4IDUw
MmI2NThmYzA0YmVhNjg3OTE3MTc1NTA1ZThjOGExNzAyNzQ5OGIuLmUzNWFhN2M0OTkzMjg1YTk3
MzZjZDU2YTQ0NTQ4N2U0YTkyZTBiNzkgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL2RvbS9O
b2RlUmFyZURhdGEuaAorKysgYi9Tb3VyY2UvV2ViQ29yZS9kb20vTm9kZVJhcmVEYXRhLmgKQEAg
LTg5LDE2ICs4OSwxNyBAQCBwcml2YXRlOgogfTsKIAogI2lmIEVOQUJMRShNVVRBVElPTl9PQlNF
UlZFUlMpCi1zdHJ1Y3QgTXV0YXRpb25PYnNlcnZlckVudHJ5IHsKLSAgICBNdXRhdGlvbk9ic2Vy
dmVyRW50cnkoUGFzc1JlZlB0cjxXZWJLaXRNdXRhdGlvbk9ic2VydmVyPiBvYnNlcnZlciwgTXV0
YXRpb25PYnNlcnZlck9wdGlvbnMgb3B0aW9ucykKK3N0cnVjdCBNdXRhdGlvbk9ic2VydmVyUmVn
aXN0cmF0aW9uIHsKKyAgICBNdXRhdGlvbk9ic2VydmVyUmVnaXN0cmF0aW9uKFBhc3NSZWZQdHI8
V2ViS2l0TXV0YXRpb25PYnNlcnZlcj4gb2JzZXJ2ZXIsIE11dGF0aW9uT2JzZXJ2ZXJPcHRpb25z
IG9wdGlvbnMsIE5vZGUqIG5vZGUpCiAgICAgICAgIDogb2JzZXJ2ZXIob2JzZXJ2ZXIpCiAgICAg
ICAgICwgb3B0aW9ucyhvcHRpb25zKQorICAgICAgICAsIHJlZ2lzdHJhdGlvbk5vZGUobm9kZSkK
ICAgICB7CiAgICAgfQogCi0gICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IE11dGF0aW9uT2JzZXJ2
ZXJFbnRyeSYgb3RoZXIpIGNvbnN0CisgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IE11dGF0aW9u
T2JzZXJ2ZXJSZWdpc3RyYXRpb24mIG90aGVyKSBjb25zdAogICAgIHsKLSAgICAgICAgcmV0dXJu
IG9ic2VydmVyID09IG90aGVyLm9ic2VydmVyOworICAgICAgICByZXR1cm4gb2JzZXJ2ZXIgPT0g
b3RoZXIub2JzZXJ2ZXIgJiYgcmVnaXN0cmF0aW9uTm9kZSA9PSBvdGhlci5yZWdpc3RyYXRpb25O
b2RlOwogICAgIH0KIAogICAgIGJvb2wgaGFzQWxsT3B0aW9ucyhNdXRhdGlvbk9ic2VydmVyT3B0
aW9ucyBvcHRpb25zKSBjb25zdApAQCAtMTA4LDYgKzEwOSwxMiBAQCBzdHJ1Y3QgTXV0YXRpb25P
YnNlcnZlckVudHJ5IHsKIAogICAgIFJlZlB0cjxXZWJLaXRNdXRhdGlvbk9ic2VydmVyPiBvYnNl
cnZlcjsKICAgICBNdXRhdGlvbk9ic2VydmVyT3B0aW9ucyBvcHRpb25zOworCisgICAgLy8gcmVn
aXN0cmF0aW9uTm9kZSB3aWxsIGJlIDAgaWYgdGhlIHJlZ2lzdHJhdGlvbiBpcyBub24tdHJhbnNp
ZW50LiBJLmUuIFRoZSByZWdpc3RyYXRpb25Ob2RlIGlzIHRoZSBOb2RlIGluIHdob3NlCisgICAg
Ly8gcmVnaXN0cnkgaXQgZXhpc3RzLgorICAgIC8vIE5vdGUgdGhhdCB0aGlzIGRvZXNuJ3QgbmVl
ZCB0byBiZSBhIFJlZlB0ciBiZWNhdXNlIHRoZSBvYnNlcnZlciB3aWxsIGJlIGhvbGRpbmcgYSBS
ZWZQdHIgdG8gdGhlIHNhbWUgbm9kZSBhdAorICAgIC8vIGxlYXN0IGZvciB0aGUgbGlmZXRpbWUg
b2YgdGhpcyBFbnRyeSBpbiBpdHMgbV90cmFuc2llbnRPYnNlcnZlZE5vZGVzIG1hcC4KKyAgICBO
b2RlKiByZWdpc3RyYXRpb25Ob2RlOwogfTsKICNlbmRpZiAvLyBFTkFCTEUoTVVUQVRJT05fT0JT
RVJWRVJTKQogCkBAIC0xNjEsMTIgKzE2OCwxMiBAQCBwdWJsaWM6CiAgICAgfQogCiAjaWYgRU5B
QkxFKE1VVEFUSU9OX09CU0VSVkVSUykKLSAgICBWZWN0b3I8TXV0YXRpb25PYnNlcnZlckVudHJ5
PiogbXV0YXRpb25PYnNlcnZlckVudHJpZXMoKSB7IHJldHVybiBtX211dGF0aW9uT2JzZXJ2ZXJz
LmdldCgpOyB9Ci0gICAgVmVjdG9yPE11dGF0aW9uT2JzZXJ2ZXJFbnRyeT4qIGVuc3VyZU11dGF0
aW9uT2JzZXJ2ZXJFbnRyaWVzKCkKKyAgICBWZWN0b3I8TXV0YXRpb25PYnNlcnZlclJlZ2lzdHJh
dGlvbj4qIG11dGF0aW9uT2JzZXJ2ZXJSZWdpc3RyeSgpIHsgcmV0dXJuIG1fbXV0YXRpb25PYnNl
cnZlclJlZ2lzdHJ5LmdldCgpOyB9CisgICAgVmVjdG9yPE11dGF0aW9uT2JzZXJ2ZXJSZWdpc3Ry
YXRpb24+KiBlbnN1cmVNdXRhdGlvbk9ic2VydmVyUmVnaXN0cnkoKQogICAgIHsKLSAgICAgICAg
aWYgKCFtX211dGF0aW9uT2JzZXJ2ZXJzKQotICAgICAgICAgICAgbV9tdXRhdGlvbk9ic2VydmVy
cyA9IGFkb3B0UHRyKG5ldyBWZWN0b3I8TXV0YXRpb25PYnNlcnZlckVudHJ5Pik7Ci0gICAgICAg
IHJldHVybiBtX211dGF0aW9uT2JzZXJ2ZXJzLmdldCgpOworICAgICAgICBpZiAoIW1fbXV0YXRp
b25PYnNlcnZlclJlZ2lzdHJ5KQorICAgICAgICAgICAgbV9tdXRhdGlvbk9ic2VydmVyUmVnaXN0
cnkgPSBhZG9wdFB0cihuZXcgVmVjdG9yPE11dGF0aW9uT2JzZXJ2ZXJSZWdpc3RyYXRpb24+KTsK
KyAgICAgICAgcmV0dXJuIG1fbXV0YXRpb25PYnNlcnZlclJlZ2lzdHJ5LmdldCgpOwogICAgIH0K
ICNlbmRpZgogCkBAIC0xODgsNyArMTk1LDcgQEAgcHJpdmF0ZToKICAgICBib29sIG1fbmVlZHNG
b2N1c0FwcGVhcmFuY2VVcGRhdGVTb29uQWZ0ZXJBdHRhY2ggOiAxOwogCiAjaWYgRU5BQkxFKE1V
VEFUSU9OX09CU0VSVkVSUykKLSAgICBPd25QdHI8VmVjdG9yPE11dGF0aW9uT2JzZXJ2ZXJFbnRy
eT4gPiBtX211dGF0aW9uT2JzZXJ2ZXJzOworICAgIE93blB0cjxWZWN0b3I8TXV0YXRpb25PYnNl
cnZlclJlZ2lzdHJhdGlvbj4gPiBtX211dGF0aW9uT2JzZXJ2ZXJSZWdpc3RyeTsKICNlbmRpZgog
fTsKIApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvZG9tL1dlYktpdE11dGF0aW9uT2JzZXJ2
ZXIuY3BwIGIvU291cmNlL1dlYkNvcmUvZG9tL1dlYktpdE11dGF0aW9uT2JzZXJ2ZXIuY3BwCmlu
ZGV4IDgzZjE1OTkwZWEyYmVjYTMzOWJiMGE3M2NjMjk2OWJhNGRmMjlmYTUuLmI2NmNhYTA4M2Vl
OTllNGU1MDM4YmM0NmIxMjU4YzhiNTA0NTYwYTkgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3Jl
L2RvbS9XZWJLaXRNdXRhdGlvbk9ic2VydmVyLmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9kb20v
V2ViS2l0TXV0YXRpb25PYnNlcnZlci5jcHAKQEAgLTUzLDE0ICs1MywzMCBAQCBXZWJLaXRNdXRh
dGlvbk9ic2VydmVyOjpXZWJLaXRNdXRhdGlvbk9ic2VydmVyKFBhc3NSZWZQdHI8TXV0YXRpb25D
YWxsYmFjaz4gY2FsbAogCiBXZWJLaXRNdXRhdGlvbk9ic2VydmVyOjp+V2ViS2l0TXV0YXRpb25P
YnNlcnZlcigpCiB7CisgICAgY2xlYXJBbGxUcmFuc2llbnRPYnNlcnZhdGlvbnMoKTsKK30KKwor
c3RhdGljIGlubGluZSB2b2lkIGNsZWFyVHJhbnNpZW50T2JzZXJ2YXRpb25zRm9yUmVnaXN0cmF0
aW9uKFdlYktpdE11dGF0aW9uT2JzZXJ2ZXIqIG9ic2VydmVyLCBOb2RlKiByZWdpc3RyYXRpb25O
b2RlLCBQYXNzT3duUHRyPE5vZGVIYXNoU2V0PiB0cmFuc2llbnROb2RlcykKK3sKKyAgICBmb3Ig
KE5vZGVIYXNoU2V0OjppdGVyYXRvciBpdGVyID0gdHJhbnNpZW50Tm9kZXMtPmJlZ2luKCk7IGl0
ZXIgIT0gdHJhbnNpZW50Tm9kZXMtPmVuZCgpOyArK2l0ZXIpCisgICAgICAgICgqaXRlciktPnVu
cmVnaXN0ZXJNdXRhdGlvbk9ic2VydmVyKG9ic2VydmVyLCByZWdpc3RyYXRpb25Ob2RlKTsKIH0K
IAogdm9pZCBXZWJLaXRNdXRhdGlvbk9ic2VydmVyOjpvYnNlcnZlKE5vZGUqIG5vZGUsIE11dGF0
aW9uT2JzZXJ2ZXJPcHRpb25zIG9wdGlvbnMpCiB7CiAgICAgLy8gRklYTUU6IE1vcmUgb3B0aW9u
cyBjb21wb3NpdGlvbiB3b3JrIG5lZWRzIHRvIGJlIGRvbmUgaGVyZSwgZS5nLiwgdmFsaWRhdGlv
bi4KIAotICAgIGlmIChub2RlLT5yZWdpc3Rlck11dGF0aW9uT2JzZXJ2ZXIodGhpcywgb3B0aW9u
cykgPT0gTm9kZTo6TXV0YXRpb25PYnNlcnZlclJlZ2lzdGVyZWQpCisgICAgaWYgKG5vZGUtPnJl
Z2lzdGVyTXV0YXRpb25PYnNlcnZlcih0aGlzLCBvcHRpb25zKSA9PSBOb2RlOjpNdXRhdGlvbk9i
c2VydmVyUmVnaXN0ZXJlZCkgewogICAgICAgICBtX29ic2VydmVkTm9kZXMuYXBwZW5kKG5vZGUp
OworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgSGFzaE1hcDxSZWZQdHI8Tm9kZT4sIE5v
ZGVIYXNoU2V0Kj46Oml0ZXJhdG9yIGl0ZXIgPSBtX3RyYW5zaWVudE9ic2VydmVkTm9kZXMuZmlu
ZChub2RlKTsKKyAgICBpZiAoaXRlciA9PSBtX3RyYW5zaWVudE9ic2VydmVkTm9kZXMuZW5kKCkp
CisgICAgICAgIHJldHVybjsKKworICAgIGNsZWFyVHJhbnNpZW50T2JzZXJ2YXRpb25zRm9yUmVn
aXN0cmF0aW9uKHRoaXMsIG5vZGUsIGFkb3B0UHRyKGl0ZXItPnNlY29uZCkpOworICAgIG1fdHJh
bnNpZW50T2JzZXJ2ZWROb2Rlcy5yZW1vdmUoaXRlcik7CiB9CiAKIHZvaWQgV2ViS2l0TXV0YXRp
b25PYnNlcnZlcjo6ZGlzY29ubmVjdCgpCkBAIC02OSwxMCArODUsMTMgQEAgdm9pZCBXZWJLaXRN
dXRhdGlvbk9ic2VydmVyOjpkaXNjb25uZWN0KCkKICAgICAgICAgbV9vYnNlcnZlZE5vZGVzW2ld
LT51bnJlZ2lzdGVyTXV0YXRpb25PYnNlcnZlcih0aGlzKTsKIAogICAgIG1fb2JzZXJ2ZWROb2Rl
cy5jbGVhcigpOworICAgIGNsZWFyQWxsVHJhbnNpZW50T2JzZXJ2YXRpb25zKCk7CiB9CiAKIHZv
aWQgV2ViS2l0TXV0YXRpb25PYnNlcnZlcjo6b2JzZXJ2ZWROb2RlRGVzdHJ1Y3RlZChOb2RlKiBu
b2RlKQogeworICAgIEFTU0VSVCghbV90cmFuc2llbnRPYnNlcnZlZE5vZGVzLmNvbnRhaW5zKG5v
ZGUpKTsKKwogICAgIHNpemVfdCBpbmRleCA9IG1fb2JzZXJ2ZWROb2Rlcy5maW5kKG5vZGUpOwog
ICAgIEFTU0VSVChpbmRleCAhPSBub3RGb3VuZCk7CiAgICAgaWYgKGluZGV4ID09IG5vdEZvdW5k
KQpAQCAtOTUsMTAgKzExNCwzNiBAQCB2b2lkIFdlYktpdE11dGF0aW9uT2JzZXJ2ZXI6OmVucXVl
dWVNdXRhdGlvblJlY29yZChQYXNzUmVmUHRyPE11dGF0aW9uUmVjb3JkPiBtdQogICAgIGFjdGl2
ZU11dGF0aW9uT2JzZXJ2ZXJzKCkuYWRkKHRoaXMpOwogfQogCit2b2lkIFdlYktpdE11dGF0aW9u
T2JzZXJ2ZXI6OndpbGxEZXRhY2hOb2RlSW5PYnNlcnZlZFN1YnRyZWUoUGFzc1JlZlB0cjxOb2Rl
PiBwcnBSZWdpc3RyYXRpb25Ob2RlLCBNdXRhdGlvbk9ic2VydmVyT3B0aW9ucyBvcHRpb25zLCBQ
YXNzUmVmUHRyPE5vZGU+IHBycERldGFjaGluZ05vZGUpCit7CisgICAgUmVmUHRyPE5vZGU+IHJl
Z2lzdHJhdGlvbk5vZGUgPSBwcnBSZWdpc3RyYXRpb25Ob2RlOworICAgIFJlZlB0cjxOb2RlPiBk
ZXRhY2hpbmdOb2RlID0gcHJwRGV0YWNoaW5nTm9kZTsKKworICAgIGRldGFjaGluZ05vZGUtPnJl
Z2lzdGVyTXV0YXRpb25PYnNlcnZlcih0aGlzLCBvcHRpb25zLCByZWdpc3RyYXRpb25Ob2RlLmdl
dCgpKTsKKyAgICBIYXNoTWFwPFJlZlB0cjxOb2RlPiwgTm9kZUhhc2hTZXQqPjo6aXRlcmF0b3Ig
aXRlciA9IG1fdHJhbnNpZW50T2JzZXJ2ZWROb2Rlcy5maW5kKHJlZ2lzdHJhdGlvbk5vZGUpOwor
ICAgIGlmIChpdGVyICE9IG1fdHJhbnNpZW50T2JzZXJ2ZWROb2Rlcy5lbmQoKSkgeworICAgICAg
ICBpdGVyLT5zZWNvbmQtPmFkZChkZXRhY2hpbmdOb2RlKTsKKyAgICAgICAgcmV0dXJuOworICAg
IH0KKworICAgIE93blB0cjxOb2RlSGFzaFNldD4gc2V0ID0gYWRvcHRQdHIobmV3IE5vZGVIYXNo
U2V0KCkpOworICAgIHNldC0+YWRkKGRldGFjaGluZ05vZGUpOworICAgIG1fdHJhbnNpZW50T2Jz
ZXJ2ZWROb2Rlcy5zZXQocmVnaXN0cmF0aW9uTm9kZSwgc2V0LmxlYWtQdHIoKSk7Cit9CisKK3Zv
aWQgV2ViS2l0TXV0YXRpb25PYnNlcnZlcjo6Y2xlYXJBbGxUcmFuc2llbnRPYnNlcnZhdGlvbnMo
KQoreworICAgIGZvciAoSGFzaE1hcDxSZWZQdHI8Tm9kZT4sIE5vZGVIYXNoU2V0Kj46Oml0ZXJh
dG9yIGl0ZXIgPSBtX3RyYW5zaWVudE9ic2VydmVkTm9kZXMuYmVnaW4oKTsgaXRlciAhPSBtX3Ry
YW5zaWVudE9ic2VydmVkTm9kZXMuZW5kKCk7ICsraXRlcikKKyAgICAgICAgY2xlYXJUcmFuc2ll
bnRPYnNlcnZhdGlvbnNGb3JSZWdpc3RyYXRpb24odGhpcywgaXRlci0+Zmlyc3QuZ2V0KCksIGFk
b3B0UHRyKGl0ZXItPnNlY29uZCkpOworCisgICAgbV90cmFuc2llbnRPYnNlcnZlZE5vZGVzLmNs
ZWFyKCk7Cit9CisKIHZvaWQgV2ViS2l0TXV0YXRpb25PYnNlcnZlcjo6ZGVsaXZlcigpCiB7CiAg
ICAgTXV0YXRpb25SZWNvcmRBcnJheSByZWNvcmRzOwogICAgIHJlY29yZHMuc3dhcChtX3JlY29y
ZHMpOworICAgIGNsZWFyQWxsVHJhbnNpZW50T2JzZXJ2YXRpb25zKCk7CiAgICAgbV9jYWxsYmFj
ay0+aGFuZGxlRXZlbnQoJnJlY29yZHMsIHRoaXMpOwogfQogCmRpZmYgLS1naXQgYS9Tb3VyY2Uv
V2ViQ29yZS9kb20vV2ViS2l0TXV0YXRpb25PYnNlcnZlci5oIGIvU291cmNlL1dlYkNvcmUvZG9t
L1dlYktpdE11dGF0aW9uT2JzZXJ2ZXIuaAppbmRleCBmYzMyODYwOTk4NGFhMTIxYTNjYmY4Njk0
NDA0NjFlYjJjYTY1OThlLi43NTMyMDRjMjQ3OTRkNGUzODJkYjAyNTUxZWE1NDgwMzU0ZGM0YTc1
IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9kb20vV2ViS2l0TXV0YXRpb25PYnNlcnZlci5o
CisrKyBiL1NvdXJjZS9XZWJDb3JlL2RvbS9XZWJLaXRNdXRhdGlvbk9ic2VydmVyLmgKQEAgLTMz
LDYgKzMzLDggQEAKIAogI2lmIEVOQUJMRShNVVRBVElPTl9PQlNFUlZFUlMpCiAKKyNpbmNsdWRl
IDx3dGYvSGFzaE1hcC5oPgorI2luY2x1ZGUgPHd0Zi9IYXNoU2V0Lmg+CiAjaW5jbHVkZSA8d3Rm
L1Bhc3NPd25QdHIuaD4KICNpbmNsdWRlIDx3dGYvUmVmQ291bnRlZC5oPgogI2luY2x1ZGUgPHd0
Zi9SZWZQdHIuaD4KQEAgLTQ1LDYgKzQ3LDcgQEAgY2xhc3MgTXV0YXRpb25SZWNvcmQ7CiBjbGFz
cyBOb2RlOwogCiB0eXBlZGVmIHVuc2lnbmVkIGNoYXIgTXV0YXRpb25PYnNlcnZlck9wdGlvbnM7
Cit0eXBlZGVmIEhhc2hTZXQ8UmVmUHRyPE5vZGU+ID4gTm9kZUhhc2hTZXQ7CiAKIGNsYXNzIFdl
YktpdE11dGF0aW9uT2JzZXJ2ZXIgOiBwdWJsaWMgUmVmQ291bnRlZDxXZWJLaXRNdXRhdGlvbk9i
c2VydmVyPiB7CiBwdWJsaWM6CkBAIC02OCwxNyArNzEsMjIgQEAgcHVibGljOgogCiAgICAgdm9p
ZCBvYnNlcnZlKE5vZGUqLCBNdXRhdGlvbk9ic2VydmVyT3B0aW9ucyk7CiAgICAgdm9pZCBkaXNj
b25uZWN0KCk7CisgICAgdm9pZCB3aWxsRGV0YWNoTm9kZUluT2JzZXJ2ZWRTdWJ0cmVlKFBhc3NS
ZWZQdHI8Tm9kZT4gcmVnaXN0cmF0aW9uTm9kZSwgTXV0YXRpb25PYnNlcnZlck9wdGlvbnMsIFBh
c3NSZWZQdHI8Tm9kZT4gZGV0YWNoaW5nTm9kZSk7CiAgICAgdm9pZCBvYnNlcnZlZE5vZGVEZXN0
cnVjdGVkKE5vZGUqKTsKICAgICB2b2lkIGVucXVldWVNdXRhdGlvblJlY29yZChQYXNzUmVmUHRy
PE11dGF0aW9uUmVjb3JkPik7CiAKIHByaXZhdGU6CiAgICAgV2ViS2l0TXV0YXRpb25PYnNlcnZl
cihQYXNzUmVmUHRyPE11dGF0aW9uQ2FsbGJhY2s+KTsKIAorICAgIHZvaWQgY2xlYXJBbGxUcmFu
c2llbnRPYnNlcnZhdGlvbnMoKTsKICAgICB2b2lkIGRlbGl2ZXIoKTsKIAogICAgIFJlZlB0cjxN
dXRhdGlvbkNhbGxiYWNrPiBtX2NhbGxiYWNrOwogICAgIFZlY3RvcjxSZWZQdHI8TXV0YXRpb25S
ZWNvcmQ+ID4gbV9yZWNvcmRzOwogICAgIFZlY3RvcjxOb2RlKj4gbV9vYnNlcnZlZE5vZGVzOyAv
LyBOb2RlUmFyZURhdGEgaGFzIGEgUmVmUHRyIHRvIHRoaXMsIHNvIHVzZSBhIHdlYWsgcG9pbnRl
ciB0byBhdm9pZCBhIGN5Y2xlLgorCisgICAgLy8gRklYTUU6IENoYW5nZSB0aGlzIHRvIGJlIE93
blB0cjxOb2RlSGFzaFNldD4gd2hlbiBPd25QdHIgc3VwcG9ydHMgYmVpbmcgY29udGFpbmVkIGFz
IG1hcCB2YWx1ZXMuCisgICAgSGFzaE1hcDxSZWZQdHI8Tm9kZT4sIE5vZGVIYXNoU2V0Kj4gbV90
cmFuc2llbnRPYnNlcnZlZE5vZGVzOwogfTsKIAogfQpkaWZmIC0tZ2l0IGEvTGF5b3V0VGVzdHMv
Q2hhbmdlTG9nIGIvTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCmluZGV4IGMwNWY2NDA3MGNhYjAwNWQ1
NDJmMTg2MmJjYzA2NTVmYzBjMTIyZGQuLmJmZGI0MzRjNzBjNDM3OTY1YTk3OGRkMTM0YzRkNmVh
ZWViY2ZmMjAgMTAwNzU1Ci0tLSBhL0xheW91dFRlc3RzL0NoYW5nZUxvZworKysgYi9MYXlvdXRU
ZXN0cy9DaGFuZ2VMb2cKQEAgLTEsMyArMSwxNiBAQAorMjAxMS0xMC0yNCAgUmFmYWVsIFdlaW5z
dGVpbiAgPHJhZmFlbHdAY2hyb21pdW0ub3JnPgorCisgICAgICAgIFtNdXRhdGlvbk9ic2VydmVy
c10gSW1wbGVtZW50IHN1YnRyZWUgb2JzZXJ2YXRpb24gb2YgdHJhbnNpZW50bHkgZGlzY29ubmVj
dGVkIG5vZGVzCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9p
ZD03MDc4OAorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAg
IEFkZGVkIHRlc3RzIHdoaWNoIGFzc2VydCB0aGF0IG5vZGVzIGNhbiBiZSBkZXRhY2hlZCBmcm9t
IGEgc3VidHJlZSB3aGVyZSBvYnNlcnZhdGlvbiBpcyByZWdpc3RlcmVkCisgICAgICAgIGFuZCBz
dGlsbCBiZSBvYnNlcnZlZCAtLSB1bnRpbCB0aGUgZW5kIG9mIHRoZSBjdXJyZW50ICJtaWNyb3Rh
c2siLgorCisgICAgICAgICogZmFzdC9tdXRhdGlvbi9vYnNlcnZlLXN1YnRyZWUtZXhwZWN0ZWQu
dHh0OgorICAgICAgICAqIGZhc3QvbXV0YXRpb24vb2JzZXJ2ZS1zdWJ0cmVlLmh0bWw6CisKIDIw
MTEtMTAtMjcgIERhbiBCZXJuc3RlaW4gIDxtaXR6QGFwcGxlLmNvbT4KIAogICAgICAgICA8cmRh
cjovL3Byb2JsZW0vMTAyNjIyMDU+IEFsbG93IGNvbHVtbiBwcm9ncmVzc2lvbiB0byBiZSBpbmRl
cGVuZGVudCBvZiB3cml0aW5nIG1vZGUKZGlmZiAtLWdpdCBhL0xheW91dFRlc3RzL2Zhc3QvbXV0
YXRpb24vb2JzZXJ2ZS1zdWJ0cmVlLWV4cGVjdGVkLnR4dCBiL0xheW91dFRlc3RzL2Zhc3QvbXV0
YXRpb24vb2JzZXJ2ZS1zdWJ0cmVlLWV4cGVjdGVkLnR4dAppbmRleCA1NTI3ZWIxYWMzMGUwMjQx
MjQ3ZGQxYTkxMjczMDczZWI0NmVhM2FmLi5iODk0ZGNkYTFiM2Y2ZDJkMzQ5YmQ3YzRhOWE0Y2Qw
NjlhNGU2OWVkIDEwMDY0NAotLS0gYS9MYXlvdXRUZXN0cy9mYXN0L211dGF0aW9uL29ic2VydmUt
c3VidHJlZS1leHBlY3RlZC50eHQKKysrIGIvTGF5b3V0VGVzdHMvZmFzdC9tdXRhdGlvbi9vYnNl
cnZlLXN1YnRyZWUtZXhwZWN0ZWQudHh0CkBAIC0zMyw2ICszMyw0OCBAQCBQQVNTIG11dGF0aW9u
c1swXS50YXJnZXQgaXMgc3ViRGl2CiBQQVNTIG11dGF0aW9uc1swXS5hdHRyaWJ1dGVOYW1lIGlz
ICJmb28iCiBQQVNTIG11dGF0aW9uc1swXS5hdHRyaWJ1dGVOYW1lc3BhY2UgaXMgbnVsbAogCitU
ZXN0aW5nIHRoYXQgdHJhbnNpZW50bHkgZGV0YWNoZWQgbm9kZXMgYXJlIHN0aWxsIG9ic2VydmVk
IHZpYSBzdWJ0cmVlLgorLi4uYm90aCBjaGFuZ2VzIHNob3VsZCBiZSByZWNlaXZlZC4gQ2hhbmdl
IGRldGFjaGVkIHN1YkRpdiBhZ2Fpbi4KK1BBU1MgbXV0YXRpb25zLmxlbmd0aCBpcyAyCitQQVNT
IG11dGF0aW9uc1swXS50eXBlIGlzICJhdHRyaWJ1dGVzIgorUEFTUyBtdXRhdGlvbnNbMF0udGFy
Z2V0IGlzIHN1YkRpdgorUEFTUyBtdXRhdGlvbnNbMF0uYXR0cmlidXRlTmFtZSBpcyAiZm9vIgor
UEFTUyBtdXRhdGlvbnNbMV0udHlwZSBpcyAiYXR0cmlidXRlcyIKK1BBU1MgbXV0YXRpb25zWzFd
LnRhcmdldCBpcyBzdWJEaXYKK1BBU1MgbXV0YXRpb25zWzFdLmF0dHJpYnV0ZU5hbWUgaXMgInRl
c3QiCisuLi50cmFuc2llbnQgc3VidHJlZSBvYnNlcnZhdGlvbiB3YXMgc3RvcHBlZCBhZnRlciBk
ZWxpdmVyeSwgc28gc3ViRGl2IGNoYW5nZSBzaG91bGQgbm90IGJlIHJlY2VpdmVkLiBSZWF0dGFj
aCBhbmQgY2hhbmdlIGFnYWluLgorUEFTUyBtdXRhdGlvbnMgaXMgbnVsbAorLi4ucmVhdHRhY2hl
ZCBzdWJ0cmVlIHNob3VsZCBub3cgYmUgb2JzZXJ2YWJsZS4gVHJ5IGRldGFjaGluZyBhbmQgcmUt
b2JzZXJ2aW5nLgorUEFTUyBtdXRhdGlvbnMubGVuZ3RoIGlzIDEKK1BBU1MgbXV0YXRpb25zWzBd
LnR5cGUgaXMgImF0dHJpYnV0ZXMiCitQQVNTIG11dGF0aW9uc1swXS50YXJnZXQgaXMgc3ViRGl2
CitQQVNTIG11dGF0aW9uc1swXS5hdHRyaWJ1dGVOYW1lIGlzICJmb28iCisuLi5UaGUgY2hhbmdl
IG1hZGUgYmVmb3JlIHJlLW9ic2VydmluZyBzaG91bGQgYmUgcmVjZWl2ZWQsIGJ1dCBub3QgdGhl
IG9uZSBhZnRlci4KK1BBU1MgbXV0YXRpb25zLmxlbmd0aCBpcyAxCitQQVNTIG11dGF0aW9uc1sw
XS50eXBlIGlzICJjaGFyYWN0ZXJEYXRhIgorUEFTUyBtdXRhdGlvbnNbMF0udGFyZ2V0IGlzIHN1
YkRpdi5maXJzdENoaWxkCisKK1Rlc3RpbmcgY29ycmVjdCBiZWhhdmlvciBvZiB0cmFuc2llbnQg
b2JzZXJ2YXRpb24gd2l0aCBjb21wbGV4IG1vdmVtZW50IC4KKy4uLkFsbCBjaGFuZ2VzIHNob3Vs
ZCBiZSByZWNlaXZlZCBleGNlcHQgZm9yIHNldHRpbmcgdGhlICJkIiBhdHRyaWJ1dGUgb24gc3Vi
RGl2MyBiZWZvcmUgaXQgd2FzIHJlYWNoYWJsZSBmcm9tIGRpdi4KK1BBU1MgbXV0YXRpb25zLmxl
bmd0aCBpcyA2CitQQVNTIG11dGF0aW9uc1swXS50eXBlIGlzICJhdHRyaWJ1dGVzIgorUEFTUyBt
dXRhdGlvbnNbMF0udGFyZ2V0IGlzIHN1YkRpdgorUEFTUyBtdXRhdGlvbnNbMF0uYXR0cmlidXRl
TmFtZSBpcyAiYSIKK1BBU1MgbXV0YXRpb25zWzFdLnR5cGUgaXMgImF0dHJpYnV0ZXMiCitQQVNT
IG11dGF0aW9uc1sxXS50YXJnZXQgaXMgc3ViRGl2MgorUEFTUyBtdXRhdGlvbnNbMV0uYXR0cmli
dXRlTmFtZSBpcyAiYiIKK1BBU1MgbXV0YXRpb25zWzJdLnR5cGUgaXMgImNoYXJhY3RlckRhdGEi
CitQQVNTIG11dGF0aW9uc1syXS50YXJnZXQgaXMgdGV4dAorUEFTUyBtdXRhdGlvbnNbM10udHlw
ZSBpcyAiYXR0cmlidXRlcyIKK1BBU1MgbXV0YXRpb25zWzNdLnRhcmdldCBpcyBzdWJEaXYyCitQ
QVNTIG11dGF0aW9uc1szXS5hdHRyaWJ1dGVOYW1lIGlzICJlIgorUEFTUyBtdXRhdGlvbnNbNF0u
dHlwZSBpcyAiYXR0cmlidXRlcyIKK1BBU1MgbXV0YXRpb25zWzRdLnRhcmdldCBpcyBzdWJEaXYz
CitQQVNTIG11dGF0aW9uc1s0XS5hdHRyaWJ1dGVOYW1lIGlzICJmIgorUEFTUyBtdXRhdGlvbnNb
NV0udHlwZSBpcyAiYXR0cmlidXRlcyIKK1BBU1MgbXV0YXRpb25zWzVdLnRhcmdldCBpcyBzdWJE
aXYyCitQQVNTIG11dGF0aW9uc1s1XS5hdHRyaWJ1dGVOYW1lIGlzICJnIgorCiBQQVNTIHN1Y2Nl
c3NmdWxseVBhcnNlZCBpcyB0cnVlCiAKIFRFU1QgQ09NUExFVEUKZGlmZiAtLWdpdCBhL0xheW91
dFRlc3RzL2Zhc3QvbXV0YXRpb24vb2JzZXJ2ZS1zdWJ0cmVlLmh0bWwgYi9MYXlvdXRUZXN0cy9m
YXN0L211dGF0aW9uL29ic2VydmUtc3VidHJlZS5odG1sCmluZGV4IGI1MmEyODM5YjExNTNmNDdi
MWVlOGMxMzY4ZTkwNzg0MjMxOTg1YzIuLjNmMjFkMzMzYTU3Y2ViMzY4ZTAwMTY1OTc3ODg0MDU5
OGM2NTdhNzggMTAwNjQ0Ci0tLSBhL0xheW91dFRlc3RzL2Zhc3QvbXV0YXRpb24vb2JzZXJ2ZS1z
dWJ0cmVlLmh0bWwKKysrIGIvTGF5b3V0VGVzdHMvZmFzdC9tdXRhdGlvbi9vYnNlcnZlLXN1YnRy
ZWUuaHRtbApAQCAtMTUsNyArMTUsNyBAQCB3aW5kb3cuanNUZXN0SXNBc3luYyA9IHRydWU7CiB2
YXIgbXV0YXRpb25zOwogdmFyIG11dGF0aW9uczI7CiB2YXIgZGl2OwotdmFyIHN1YkRpdjsKK3Zh
ciBzdWJEaXYsIHN1YkRpdjIsIHN1YkRpdjMsIHRleHQ7CiB2YXIgY2FsbHM7CiAKIGZ1bmN0aW9u
IHRlc3RCYXNpYygpIHsKQEAgLTEzNSw3ICsxMzUsMTU5IEBAIGZ1bmN0aW9uIHRlc3RNdWx0aXBs
ZU9ic2VydmF0aW9ucygpIHsKIAogICAgIHN0YXJ0KCk7CiB9Ci12YXIgdGVzdHMgPSBbdGVzdEJh
c2ljLCB0ZXN0TXVsdGlwbGVPYnNlcnZlcnMsIHRlc3RNdWx0aXBsZU9ic2VydmF0aW9uc107CisK
K2Z1bmN0aW9uIHRlc3RUcmFuc2llbnREZXRhY2hlZEJhc2ljKCkgeworICAgIHZhciBvYnNlcnZl
cjsKKworICAgIGZ1bmN0aW9uIHN0YXJ0KCkgeworICAgICAgICBkZWJ1ZygnVGVzdGluZyB0aGF0
IHRyYW5zaWVudGx5IGRldGFjaGVkIG5vZGVzIGFyZSBzdGlsbCBvYnNlcnZlZCB2aWEgc3VidHJl
ZS4nKTsKKworICAgICAgICBtdXRhdGlvbnMgPSBudWxsOworICAgICAgICBkaXYgPSBkb2N1bWVu
dC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKKyAgICAgICAgc3ViRGl2ID0gZGl2LmFwcGVuZENoaWxk
KGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKTsKKyAgICAgICAgc3ViRGl2LmlubmVySFRN
TCA9ICdoZWxsbywgd29ybGQnOworICAgICAgICBvYnNlcnZlciA9IG5ldyBXZWJLaXRNdXRhdGlv
bk9ic2VydmVyKGZ1bmN0aW9uKG11dGF0aW9ucykgeworICAgICAgICAgICAgd2luZG93Lm11dGF0
aW9ucyA9IG11dGF0aW9uczsKKyAgICAgICAgfSk7CisKKyAgICAgICAgb2JzZXJ2ZXIub2JzZXJ2
ZShkaXYsIHthdHRyaWJ1dGVzOiB0cnVlLCBjaGFyYWN0ZXJEYXRhOiB0cnVlLCBzdWJ0cmVlOiB0
cnVlfSk7CisgICAgICAgIHN1YkRpdi5zZXRBdHRyaWJ1dGUoJ2ZvbycsICdiYXInKTsKKyAgICAg
ICAgZGl2LnJlbW92ZUNoaWxkKHN1YkRpdik7CisgICAgICAgIHN1YkRpdi5zZXRBdHRyaWJ1dGUo
J3Rlc3QnLCAndGVzdCcpOworICAgICAgICBzZXRUaW1lb3V0KGNoZWNrRGVsaXZlcmVkQW5kQ2hh
bmdlQWdhaW4sIDApOworICAgIH0KKworICAgIGZ1bmN0aW9uIGNoZWNrRGVsaXZlcmVkQW5kQ2hh
bmdlQWdhaW4oKSB7CisgICAgICAgIGRlYnVnKCcuLi5ib3RoIGNoYW5nZXMgc2hvdWxkIGJlIHJl
Y2VpdmVkLiBDaGFuZ2UgZGV0YWNoZWQgc3ViRGl2IGFnYWluLicpOworCisgICAgICAgIHNob3Vs
ZEJlKCdtdXRhdGlvbnMubGVuZ3RoJywgJzInKTsKKyAgICAgICAgc2hvdWxkQmUoJ211dGF0aW9u
c1swXS50eXBlJywgJyJhdHRyaWJ1dGVzIicpOworICAgICAgICBzaG91bGRCZSgnbXV0YXRpb25z
WzBdLnRhcmdldCcsICdzdWJEaXYnKTsKKyAgICAgICAgc2hvdWxkQmUoJ211dGF0aW9uc1swXS5h
dHRyaWJ1dGVOYW1lJywgJyJmb28iJyk7CisgICAgICAgIHNob3VsZEJlKCdtdXRhdGlvbnNbMV0u
dHlwZScsICciYXR0cmlidXRlcyInKTsKKyAgICAgICAgc2hvdWxkQmUoJ211dGF0aW9uc1sxXS50
YXJnZXQnLCAnc3ViRGl2Jyk7CisgICAgICAgIHNob3VsZEJlKCdtdXRhdGlvbnNbMV0uYXR0cmli
dXRlTmFtZScsICcidGVzdCInKTsKKworICAgICAgICBtdXRhdGlvbnMgPSBudWxsOworICAgICAg
ICBzdWJEaXYuc2V0QXR0cmlidXRlKCdmb28nLCAnYmF6Jyk7CisKKyAgICAgICAgc2V0VGltZW91
dChjaGVja05vdERlbGl2ZXJlZEFuZFJlYXR0YWNoKTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiBj
aGVja05vdERlbGl2ZXJlZEFuZFJlYXR0YWNoKCkgeworICAgICAgICBkZWJ1ZygnLi4udHJhbnNp
ZW50IHN1YnRyZWUgb2JzZXJ2YXRpb24gd2FzIHN0b3BwZWQgYWZ0ZXIgZGVsaXZlcnksIHNvIHN1
YkRpdiBjaGFuZ2Ugc2hvdWxkIG5vdCBiZSByZWNlaXZlZC4gUmVhdHRhY2ggYW5kIGNoYW5nZSBh
Z2Fpbi4nKTsKKworICAgICAgICBzaG91bGRCZSgnbXV0YXRpb25zJywgJ251bGwnKTsKKworICAg
ICAgICBtdXRhdGlvbnMgPSBudWxsCisgICAgICAgIGRpdi5hcHBlbmRDaGlsZChzdWJEaXYpOwor
ICAgICAgICBzdWJEaXYuc2V0QXR0cmlidXRlKCdmb28nLCAnYmF0Jyk7CisKKyAgICAgICAgc2V0
VGltZW91dChjaGVja0RlbGl2ZXJlZEFuZFJlb2JzZXJ2ZSk7CisgICAgfQorCisgICAgZnVuY3Rp
b24gY2hlY2tEZWxpdmVyZWRBbmRSZW9ic2VydmUoKSB7CisgICAgICAgIGRlYnVnKCcuLi5yZWF0
dGFjaGVkIHN1YnRyZWUgc2hvdWxkIG5vdyBiZSBvYnNlcnZhYmxlLiBUcnkgZGV0YWNoaW5nIGFu
ZCByZS1vYnNlcnZpbmcuJyk7CisKKyAgICAgICAgc2hvdWxkQmUoJ211dGF0aW9ucy5sZW5ndGgn
LCAnMScpOworICAgICAgICBzaG91bGRCZSgnbXV0YXRpb25zWzBdLnR5cGUnLCAnImF0dHJpYnV0
ZXMiJyk7CisgICAgICAgIHNob3VsZEJlKCdtdXRhdGlvbnNbMF0udGFyZ2V0JywgJ3N1YkRpdicp
OworICAgICAgICBzaG91bGRCZSgnbXV0YXRpb25zWzBdLmF0dHJpYnV0ZU5hbWUnLCAnImZvbyIn
KTsKKworICAgICAgICBtdXRhdGlvbnMgPSBudWxsOworICAgICAgICBkaXYucmVtb3ZlQ2hpbGQo
c3ViRGl2KTsKKyAgICAgICAgc3ViRGl2LmZpcnN0Q2hpbGQudGV4dENvbnRlbnQgPSAnYmFkYnll
JzsKKyAgICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZShkaXYsIHthdHRyaWJ1dGVzOiB0cnVlLCBjaGFy
YWN0ZXJEYXRhOiB0cnVlLCBzdWJ0cmVlOiB0cnVlfSk7CisgICAgICAgIHN1YkRpdi5zZXRBdHRy
aWJ1dGUoJ2ZvbycsICdib28nKTsKKworICAgICAgICBzZXRUaW1lb3V0KGZpbmlzaCk7CisgICAg
fQorCisKKyAgICBmdW5jdGlvbiBmaW5pc2goKSB7CisgICAgICAgIGRlYnVnKCcuLi5UaGUgY2hh
bmdlIG1hZGUgYmVmb3JlIHJlLW9ic2VydmluZyBzaG91bGQgYmUgcmVjZWl2ZWQsIGJ1dCBub3Qg
dGhlIG9uZSBhZnRlci4nKTsKKworICAgICAgICBzaG91bGRCZSgnbXV0YXRpb25zLmxlbmd0aCcs
ICcxJyk7CisgICAgICAgIHNob3VsZEJlKCdtdXRhdGlvbnNbMF0udHlwZScsICciY2hhcmFjdGVy
RGF0YSInKTsKKyAgICAgICAgc2hvdWxkQmUoJ211dGF0aW9uc1swXS50YXJnZXQnLCAnc3ViRGl2
LmZpcnN0Q2hpbGQnKTsKKworICAgICAgICBvYnNlcnZlci5kaXNjb25uZWN0KCk7CisgICAgICAg
IGRlYnVnKCcnKTsKKyAgICAgICAgcnVuTmV4dFRlc3QoKTsKKyAgICB9CisgICAgc3RhcnQoKTsK
K30KKworZnVuY3Rpb24gdGVzdFRyYW5zaWVudERldGFjaGVkRGV0YWlsZWQoKSB7CisgICAgdmFy
IG9ic2VydmVyOworCisgICAgZnVuY3Rpb24gc3RhcnQoKSB7CisgICAgICAgIGRlYnVnKCdUZXN0
aW5nIGNvcnJlY3QgYmVoYXZpb3Igb2YgdHJhbnNpZW50IG9ic2VydmF0aW9uIHdpdGggY29tcGxl
eCBtb3ZlbWVudCAuJyk7CisKKyAgICAgICAgbXV0YXRpb25zID0gbnVsbDsKKyAgICAgICAgZGl2
ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CisgICAgICAgIHN1YkRpdiA9IGRpdi5h
cHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSk7CisgICAgICAgIHN1YkRp
djIgPSBzdWJEaXYuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykpOwor
ICAgICAgICBzdWJEaXYyLmlubmVySFRNTCA9ICdoZWxsbywgd29ybGQnOworICAgICAgICBzdWJE
aXYzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CisKKyAgICAgICAgb2JzZXJ2ZXIg
PSBuZXcgV2ViS2l0TXV0YXRpb25PYnNlcnZlcihmdW5jdGlvbihtdXRhdGlvbnMpIHsKKyAgICAg
ICAgICAgIHdpbmRvdy5tdXRhdGlvbnMgPSBtdXRhdGlvbnM7CisgICAgICAgIH0pOworCisgICAg
ICAgIG9ic2VydmVyLm9ic2VydmUoZGl2LCB7YXR0cmlidXRlczogdHJ1ZSwgY2hhcmFjdGVyRGF0
YTogdHJ1ZSwgc3VidHJlZTogdHJ1ZX0pOworICAgICAgICBkaXYucmVtb3ZlQ2hpbGQoc3ViRGl2
KTsKKyAgICAgICAgc3ViRGl2LnJlbW92ZUNoaWxkKHN1YkRpdjIpOworICAgICAgICB0ZXh0ID0g
c3ViRGl2Mi5yZW1vdmVDaGlsZChzdWJEaXYyLmZpcnN0Q2hpbGQpOworCisgICAgICAgIHN1YkRp
di5zZXRBdHRyaWJ1dGUoJ2EnLCAnYScpOworICAgICAgICBzdWJEaXYyLnNldEF0dHJpYnV0ZSgn
YicsICdiJyk7CisgICAgICAgIHRleHQudGV4dENvbnRlbnQgPSAnYyc7CisgICAgICAgIHN1YkRp
djMuYXBwZW5kQ2hpbGQoc3ViRGl2Mik7CisgICAgICAgIHN1YkRpdjMuc2V0QXR0cmlidXRlKCdk
JywgJ2QnKTsKKyAgICAgICAgc3ViRGl2Mi5zZXRBdHRyaWJ1dGUoJ2UnLCAnZScpOworICAgICAg
ICBkaXYuYXBwZW5kQ2hpbGQoc3ViRGl2Myk7CisgICAgICAgIHN1YkRpdjMuc2V0QXR0cmlidXRl
KCdmJywgJ2YnKTsKKyAgICAgICAgc3ViRGl2Mi5zZXRBdHRyaWJ1dGUoJ2cnLCAnZycpOworCisg
ICAgICAgIHNldFRpbWVvdXQoZmluaXNoLCAwKTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiBmaW5p
c2goKSB7CisgICAgICAgIGRlYnVnKCcuLi5BbGwgY2hhbmdlcyBzaG91bGQgYmUgcmVjZWl2ZWQg
ZXhjZXB0IGZvciBzZXR0aW5nIHRoZSAiZCIgYXR0cmlidXRlIG9uIHN1YkRpdjMgYmVmb3JlIGl0
IHdhcyByZWFjaGFibGUgZnJvbSBkaXYuJyk7CisKKyAgICAgICAgc2hvdWxkQmUoJ211dGF0aW9u
cy5sZW5ndGgnLCAnNicpOworICAgICAgICBzaG91bGRCZSgnbXV0YXRpb25zWzBdLnR5cGUnLCAn
ImF0dHJpYnV0ZXMiJyk7CisgICAgICAgIHNob3VsZEJlKCdtdXRhdGlvbnNbMF0udGFyZ2V0Jywg
J3N1YkRpdicpOworICAgICAgICBzaG91bGRCZSgnbXV0YXRpb25zWzBdLmF0dHJpYnV0ZU5hbWUn
LCAnImEiJyk7CisKKyAgICAgICAgc2hvdWxkQmUoJ211dGF0aW9uc1sxXS50eXBlJywgJyJhdHRy
aWJ1dGVzIicpOworICAgICAgICBzaG91bGRCZSgnbXV0YXRpb25zWzFdLnRhcmdldCcsICdzdWJE
aXYyJyk7CisgICAgICAgIHNob3VsZEJlKCdtdXRhdGlvbnNbMV0uYXR0cmlidXRlTmFtZScsICci
YiInKTsKKworICAgICAgICBzaG91bGRCZSgnbXV0YXRpb25zWzJdLnR5cGUnLCAnImNoYXJhY3Rl
ckRhdGEiJyk7CisgICAgICAgIHNob3VsZEJlKCdtdXRhdGlvbnNbMl0udGFyZ2V0JywgJ3RleHQn
KTsKKworICAgICAgICBzaG91bGRCZSgnbXV0YXRpb25zWzNdLnR5cGUnLCAnImF0dHJpYnV0ZXMi
Jyk7CisgICAgICAgIHNob3VsZEJlKCdtdXRhdGlvbnNbM10udGFyZ2V0JywgJ3N1YkRpdjInKTsK
KyAgICAgICAgc2hvdWxkQmUoJ211dGF0aW9uc1szXS5hdHRyaWJ1dGVOYW1lJywgJyJlIicpOwor
CisgICAgICAgIHNob3VsZEJlKCdtdXRhdGlvbnNbNF0udHlwZScsICciYXR0cmlidXRlcyInKTsK
KyAgICAgICAgc2hvdWxkQmUoJ211dGF0aW9uc1s0XS50YXJnZXQnLCAnc3ViRGl2MycpOworICAg
ICAgICBzaG91bGRCZSgnbXV0YXRpb25zWzRdLmF0dHJpYnV0ZU5hbWUnLCAnImYiJyk7CisKKyAg
ICAgICAgc2hvdWxkQmUoJ211dGF0aW9uc1s1XS50eXBlJywgJyJhdHRyaWJ1dGVzIicpOworICAg
ICAgICBzaG91bGRCZSgnbXV0YXRpb25zWzVdLnRhcmdldCcsICdzdWJEaXYyJyk7CisgICAgICAg
IHNob3VsZEJlKCdtdXRhdGlvbnNbNV0uYXR0cmlidXRlTmFtZScsICciZyInKTsKKworICAgICAg
ICBvYnNlcnZlci5kaXNjb25uZWN0KCk7CisgICAgICAgIGRlYnVnKCcnKTsKKyAgICAgICAgcnVu
TmV4dFRlc3QoKTsKKyAgICB9CisgICAgc3RhcnQoKTsKK30KKwordmFyIHRlc3RzID0gW3Rlc3RC
YXNpYywgdGVzdE11bHRpcGxlT2JzZXJ2ZXJzLCB0ZXN0TXVsdGlwbGVPYnNlcnZhdGlvbnMsIHRl
c3RUcmFuc2llbnREZXRhY2hlZEJhc2ljLCB0ZXN0VHJhbnNpZW50RGV0YWNoZWREZXRhaWxlZF07
CiB2YXIgdGVzdEluZGV4ID0gMDsKIAogZnVuY3Rpb24gcnVuTmV4dFRlc3QoKSB7Cg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>112748</attachid>
            <date>2011-10-27 14:11:28 -0700</date>
            <delta_ts>2011-10-27 16:38:24 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-70788-20111027141127.patch</filename>
            <type>text/plain</type>
            <size>33401</size>
            <attacher name="Rafael Weinstein">rafaelw</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogOTg2MDgKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0No
YW5nZUxvZyBiL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwppbmRleCA2MGY1NDA4ZjRiYTFhMTc3
MWQ2ZjFlOGE3YzVjMjViMGQ2ZmIwNTIxLi44NWJkZDk3MTVhMzBhNjg1ZmU0OGU1NzIxNTA1M2Vh
NDBlZjk1NmEyIDEwMDc1NQotLS0gYS9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvU291
cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsNTEgQEAKKzIwMTEtMTAtMjQgIFJhZmFl
bCBXZWluc3RlaW4gIDxyYWZhZWx3QGNocm9taXVtLm9yZz4KKworICAgICAgICBbTXV0YXRpb25P
YnNlcnZlcnNdIEltcGxlbWVudCBzdWJ0cmVlIG9ic2VydmF0aW9uIG9mIHRyYW5zaWVudGx5IGRp
c2Nvbm5lY3RlZCBub2RlcworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1
Zy5jZ2k/aWQ9NzA3ODgKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKwor
ICAgICAgICBUaGlzIHBhdGNoIGFkZHMgc3VwcG9ydCBmb3Igb2JzZXJ2aW5nIGFsbCBkZXNjZW5k
YW50IG5vZGVzIHJlYWNoYWJsZSBmcm9tIGEgc3VidHJlZQorICAgICAgICBvYnNlcnZhdGlvbiB1
bnRpbCBkZWxpdmVyeSBvZiBtdXRhdGlvbnMgLS0gZXZlbiBpZiB0aGV5IGJlY29tZSBkZXRhY2hl
ZC4gV2UgZG8gdGhpcyBieQorICAgICAgICBpbnRyb2R1Y2luZyBhICJ0cmFuc2llbnQgcmVnaXN0
cmF0aW9uIiB3aGljaCBjYW4gZXhpc3QgZm9yIGEgc2hvcnQgdGltZSBhbG9uZyBzaWRlCisgICAg
ICAgIG5vcm1hbCByZWdpc3RyYXRpb25zIG9uIE5vZGUuIFRyYW5zaWVudCByZWdpc3RyYXRpb25z
IGhhdmUgYSByZWZlcmVuY2UgdG8gdGhlIG5vZGUKKyAgICAgICAgd2hpY2ggIm93bnMiIHRoZSBz
dWJ0cmVlIG9ic2VydmF0aW9uIHJlZ2lzdHJhdGlvbiAodGhlICJyZWdpc3RyYXRpb25Ob2RlIiku
IFRyYW5zaWVudAorICAgICAgICByZWdpc3RyYXRpb25zIGFyZSBjbGVhcmVkIGltbWVkaWF0ZWx5
IGJlZm9yZSBtdXRhdGlvbnMgYXJlIGRlbGl2ZXJlZCB0byBhbiBvYnNlcnZlciwKKyAgICAgICAg
b3Igd2hlbiB0aGUgb2JzZXJ2ZXIgcmUtb2JzZXJ2ZXMgYXQgdGhlIHJlZ2lzdHJhdGlvbk5vZGUs
IGluLWVmZmVjdCByZXNldHRpbmcgdGhlCisgICAgICAgIG9ic2VydmF0aW9uLgorCisgICAgICAg
IE5ldyB0ZXN0cyBhZGRlZCB0byBmYXN0L211dGF0aW9uL29ic2VydmUtc3VidHJlZS5odG1sLgor
CisgICAgICAgICogZG9tL0NoYXJhY3RlckRhdGEuY3BwOgorICAgICAgICAoV2ViQ29yZTo6Q2hh
cmFjdGVyRGF0YTo6ZGlzcGF0Y2hNb2RpZmllZEV2ZW50KToKKyAgICAgICAgKiBkb20vQ2hpbGRM
aXN0TXV0YXRpb25TY29wZS5jcHA6CisgICAgICAgIChXZWJDb3JlOjpNdXRhdGlvbkFjY3VtdWxh
dGlvblJvdXRlcjo6Q2hpbGRMaXN0TXV0YXRpb25BY2N1bXVsYXRvcjo6Q2hpbGRMaXN0TXV0YXRp
b25BY2N1bXVsYXRvcik6CisgICAgICAgIChXZWJDb3JlOjpNdXRhdGlvbkFjY3VtdWxhdGlvblJv
dXRlcjo6Q2hpbGRMaXN0TXV0YXRpb25BY2N1bXVsYXRvcjo6ZW5xdWV1ZU11dGF0aW9uUmVjb3Jk
KToKKyAgICAgICAgKFdlYkNvcmU6Ok11dGF0aW9uQWNjdW11bGF0aW9uUm91dGVyOjpNdXRhdGlv
bkFjY3VtdWxhdGlvblJvdXRlcjo6aW5jcmVtZW50U2NvcGluZ0xldmVsKToKKyAgICAgICAgKiBk
b20vQ29udGFpbmVyTm9kZS5jcHA6CisgICAgICAgIChXZWJDb3JlOjpkaXNwYXRjaENoaWxkUmVt
b3ZhbEV2ZW50cyk6CisgICAgICAgICogZG9tL0VsZW1lbnQuY3BwOgorICAgICAgICAoV2ViQ29y
ZTo6ZW5xdWV1ZUF0dHJpYnV0ZXNNdXRhdGlvblJlY29yZCk6CisgICAgICAgICogZG9tL05vZGUu
Y3BwOgorICAgICAgICAoV2ViQ29yZTo6YWRkTWF0Y2hpbmdPYnNlcnZlcnMpOgorICAgICAgICAo
V2ViQ29yZTo6Tm9kZTo6Z2V0UmVnaXN0ZXJlZE11dGF0aW9uT2JzZXJ2ZXJzT2ZUeXBlKToKKyAg
ICAgICAgKFdlYkNvcmU6Ok5vZGU6OnJlZ2lzdGVyTXV0YXRpb25PYnNlcnZlcik6CisgICAgICAg
IChXZWJDb3JlOjpOb2RlOjp1bnJlZ2lzdGVyTXV0YXRpb25PYnNlcnZlcik6CisgICAgICAgIChX
ZWJDb3JlOjpOb2RlOjpub3RpZnlTdWJ0cmVlT2JzZXJ2ZXJzT2ZEaXNjb25uZWN0aW9uKToKKyAg
ICAgICAgKiBkb20vTm9kZS5oOgorICAgICAgICAqIGRvbS9Ob2RlUmFyZURhdGEuaDoKKyAgICAg
ICAgKFdlYkNvcmU6Ok11dGF0aW9uT2JzZXJ2ZXJFbnRyeTo6TXV0YXRpb25PYnNlcnZlckVudHJ5
KToKKyAgICAgICAgKFdlYkNvcmU6Ok11dGF0aW9uT2JzZXJ2ZXJFbnRyeTo6b3BlcmF0b3I9PSk6
CisgICAgICAgICogZG9tL1dlYktpdE11dGF0aW9uT2JzZXJ2ZXIuY3BwOgorICAgICAgICAoV2Vi
Q29yZTo6V2ViS2l0TXV0YXRpb25PYnNlcnZlcjo6b2JzZXJ2ZSk6CisgICAgICAgIChXZWJDb3Jl
Ojp1bnJlZ2lzdGVyVHJhbnNpZW50RW50cmllcyk6CisgICAgICAgIChXZWJDb3JlOjpXZWJLaXRN
dXRhdGlvbk9ic2VydmVyOjpkaXNjb25uZWN0KToKKyAgICAgICAgKFdlYkNvcmU6OldlYktpdE11
dGF0aW9uT2JzZXJ2ZXI6Om9ic2VydmVkTm9kZURlc3RydWN0ZWQpOgorICAgICAgICAoV2ViQ29y
ZTo6V2ViS2l0TXV0YXRpb25PYnNlcnZlcjo6b2JzZXJ2ZWRTdWJ0cmVlV2lsbERpc2Nvbm5lY3Qp
OgorICAgICAgICAoV2ViQ29yZTo6V2ViS2l0TXV0YXRpb25PYnNlcnZlcjo6Y2xlYXJUcmFuc2ll
bnRFbnRyaWVzKToKKyAgICAgICAgKFdlYkNvcmU6OldlYktpdE11dGF0aW9uT2JzZXJ2ZXI6OmRl
bGl2ZXIpOgorICAgICAgICAqIGRvbS9XZWJLaXRNdXRhdGlvbk9ic2VydmVyLmg6CisKIDIwMTEt
MTAtMjcgIERhbiBCZXJuc3RlaW4gIDxtaXR6QGFwcGxlLmNvbT4KIAogICAgICAgICA8cmRhcjov
L3Byb2JsZW0vMTAyNjIyMDU+IEFsbG93IGNvbHVtbiBwcm9ncmVzc2lvbiB0byBiZSBpbmRlcGVu
ZGVudCBvZiB3cml0aW5nIG1vZGUKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2RvbS9DaGFy
YWN0ZXJEYXRhLmNwcCBiL1NvdXJjZS9XZWJDb3JlL2RvbS9DaGFyYWN0ZXJEYXRhLmNwcAppbmRl
eCA1ZTg0MWViMzhmNzQ4YjY2YzRmNmNjZDI1MDJmYzRkYTU1ZGMxZjk1Li4zN2E3ZmJmZmJhMmFh
OWYzMWU5NjY5M2JiN2FjOTcyOGI1MjM0YjUzIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9k
b20vQ2hhcmFjdGVyRGF0YS5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvZG9tL0NoYXJhY3RlckRh
dGEuY3BwCkBAIC0xOTMsMTIgKzE5MywxMiBAQCB2b2lkIENoYXJhY3RlckRhdGE6OnVwZGF0ZVJl
bmRlcmVyKHVuc2lnbmVkIG9mZnNldE9mUmVwbGFjZWREYXRhLCB1bnNpZ25lZCBsZW5ndAogdm9p
ZCBDaGFyYWN0ZXJEYXRhOjpkaXNwYXRjaE1vZGlmaWVkRXZlbnQoU3RyaW5nSW1wbCogb2xkRGF0
YSkKIHsKICNpZiBFTkFCTEUoTVVUQVRJT05fT0JTRVJWRVJTKQotICAgIFZlY3RvcjxXZWJLaXRN
dXRhdGlvbk9ic2VydmVyKj4gb2JzZXJ2ZXJzOworICAgIEhhc2hNYXA8V2ViS2l0TXV0YXRpb25P
YnNlcnZlciosIE11dGF0aW9uT2JzZXJ2ZXJPcHRpb25zPiBvYnNlcnZlcnM7CiAgICAgZ2V0UmVn
aXN0ZXJlZE11dGF0aW9uT2JzZXJ2ZXJzT2ZUeXBlKG9ic2VydmVycywgV2ViS2l0TXV0YXRpb25P
YnNlcnZlcjo6Q2hhcmFjdGVyRGF0YSk7CiAgICAgaWYgKCFvYnNlcnZlcnMuaXNFbXB0eSgpKSB7
CiAgICAgICAgIFJlZlB0cjxNdXRhdGlvblJlY29yZD4gbXV0YXRpb24gPSBNdXRhdGlvblJlY29y
ZDo6Y3JlYXRlQ2hhcmFjdGVyRGF0YSh0aGlzKTsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7
IGkgPCBvYnNlcnZlcnMuc2l6ZSgpOyArK2kpCi0gICAgICAgICAgICBvYnNlcnZlcnNbaV0tPmVu
cXVldWVNdXRhdGlvblJlY29yZChtdXRhdGlvbik7CisgICAgICAgIGZvciAoSGFzaE1hcDxXZWJL
aXRNdXRhdGlvbk9ic2VydmVyKiwgTXV0YXRpb25PYnNlcnZlck9wdGlvbnM+OjppdGVyYXRvciBp
dGVyID0gb2JzZXJ2ZXJzLmJlZ2luKCk7IGl0ZXIgIT0gb2JzZXJ2ZXJzLmVuZCgpOyArK2l0ZXIp
CisgICAgICAgICAgICAgICAgaXRlci0+Zmlyc3QtPmVucXVldWVNdXRhdGlvblJlY29yZChtdXRh
dGlvbik7CiAgICAgfQogI2VuZGlmCiAgICAgaWYgKHBhcmVudE5vZGUoKSkKZGlmZiAtLWdpdCBh
L1NvdXJjZS9XZWJDb3JlL2RvbS9DaGlsZExpc3RNdXRhdGlvblNjb3BlLmNwcCBiL1NvdXJjZS9X
ZWJDb3JlL2RvbS9DaGlsZExpc3RNdXRhdGlvblNjb3BlLmNwcAppbmRleCA0ZTVmMGE5MGQ3NjU5
MjdlNzY0N2E0MDkxNmU4M2ZkMjQzYjRlZmMzLi41ZGNiZGNmZjMwZGFhOThjYjkwMWI3YjZlZWEw
ZTRkMTY5OGZlNjJiIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9kb20vQ2hpbGRMaXN0TXV0
YXRpb25TY29wZS5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvZG9tL0NoaWxkTGlzdE11dGF0aW9u
U2NvcGUuY3BwCkBAIC01Myw3ICs1Myw3IEBAIG5hbWVzcGFjZSB7CiBjbGFzcyBDaGlsZExpc3RN
dXRhdGlvbkFjY3VtdWxhdG9yIDogcHVibGljIFJlZkNvdW50ZWQ8Q2hpbGRMaXN0TXV0YXRpb25B
Y2N1bXVsYXRvcj4gewogICAgIFdURl9NQUtFX05PTkNPUFlBQkxFKENoaWxkTGlzdE11dGF0aW9u
QWNjdW11bGF0b3IpOwogcHVibGljOgotICAgIENoaWxkTGlzdE11dGF0aW9uQWNjdW11bGF0b3Io
UGFzc1JlZlB0cjxOb2RlPiwgVmVjdG9yPFdlYktpdE11dGF0aW9uT2JzZXJ2ZXIqPiYpOworICAg
IENoaWxkTGlzdE11dGF0aW9uQWNjdW11bGF0b3IoUGFzc1JlZlB0cjxOb2RlPiwgSGFzaE1hcDxX
ZWJLaXRNdXRhdGlvbk9ic2VydmVyKiwgTXV0YXRpb25PYnNlcnZlck9wdGlvbnM+Jik7CiAgICAg
fkNoaWxkTGlzdE11dGF0aW9uQWNjdW11bGF0b3IoKTsKIAogICAgIHZvaWQgY2hpbGRBZGRlZChQ
YXNzUmVmUHRyPE5vZGU+KTsKQEAgLTczLDcgKzczLDcgQEAgcHJpdmF0ZToKICAgICBSZWZQdHI8
Tm9kZT4gbV9uZXh0U2libGluZzsKICAgICBSZWZQdHI8Tm9kZT4gbV9sYXN0QWRkZWQ7CiAKLSAg
ICBWZWN0b3I8V2ViS2l0TXV0YXRpb25PYnNlcnZlcio+IG1fb2JzZXJ2ZXJzOworICAgIEhhc2hN
YXA8V2ViS2l0TXV0YXRpb25PYnNlcnZlciosIE11dGF0aW9uT2JzZXJ2ZXJPcHRpb25zPiBtX29i
c2VydmVyczsKIH07CiAKIGNsYXNzIE11dGF0aW9uQWNjdW11bGF0aW9uUm91dGVyIHsKQEAgLTEw
MCw3ICsxMDAsNyBAQCBwcml2YXRlOgogICAgIHN0YXRpYyBNdXRhdGlvbkFjY3VtdWxhdGlvblJv
dXRlciogc19pbnN0YW5jZTsKIH07CiAKLUNoaWxkTGlzdE11dGF0aW9uQWNjdW11bGF0b3I6OkNo
aWxkTGlzdE11dGF0aW9uQWNjdW11bGF0b3IoUGFzc1JlZlB0cjxOb2RlPiB0YXJnZXQsIFZlY3Rv
cjxXZWJLaXRNdXRhdGlvbk9ic2VydmVyKj4mIG9ic2VydmVycykKK0NoaWxkTGlzdE11dGF0aW9u
QWNjdW11bGF0b3I6OkNoaWxkTGlzdE11dGF0aW9uQWNjdW11bGF0b3IoUGFzc1JlZlB0cjxOb2Rl
PiB0YXJnZXQsIEhhc2hNYXA8V2ViS2l0TXV0YXRpb25PYnNlcnZlciosIE11dGF0aW9uT2JzZXJ2
ZXJPcHRpb25zPiYgb2JzZXJ2ZXJzKQogICAgIDogbV90YXJnZXQodGFyZ2V0KQogewogICAgIG1f
b2JzZXJ2ZXJzLnN3YXAob2JzZXJ2ZXJzKTsKQEAgLTE2OSw4ICsxNjksOCBAQCB2b2lkIENoaWxk
TGlzdE11dGF0aW9uQWNjdW11bGF0b3I6OmVucXVldWVNdXRhdGlvblJlY29yZCgpCiAgICAgUmVm
UHRyPE11dGF0aW9uUmVjb3JkPiBtdXRhdGlvbiA9IE11dGF0aW9uUmVjb3JkOjpjcmVhdGVDaGls
ZExpc3QoCiAgICAgICAgIG1fdGFyZ2V0LCBTdGF0aWNOb2RlTGlzdDo6YWRvcHQobV9hZGRlZE5v
ZGVzKSwgU3RhdGljTm9kZUxpc3Q6OmFkb3B0KG1fcmVtb3ZlZE5vZGVzKSwgbV9wcmV2aW91c1Np
YmxpbmcsIG1fbmV4dFNpYmxpbmcpOwogCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtX29i
c2VydmVycy5zaXplKCk7ICsraSkKLSAgICAgICAgbV9vYnNlcnZlcnNbaV0tPmVucXVldWVNdXRh
dGlvblJlY29yZChtdXRhdGlvbik7CisgICAgZm9yIChIYXNoTWFwPFdlYktpdE11dGF0aW9uT2Jz
ZXJ2ZXIqLCBNdXRhdGlvbk9ic2VydmVyT3B0aW9ucz46Oml0ZXJhdG9yIGl0ZXIgPSBtX29ic2Vy
dmVycy5iZWdpbigpOyBpdGVyICE9IG1fb2JzZXJ2ZXJzLmVuZCgpOyArK2l0ZXIpCisgICAgICAg
IGl0ZXItPmZpcnN0LT5lbnF1ZXVlTXV0YXRpb25SZWNvcmQobXV0YXRpb24pOwogCiAgICAgY2xl
YXIoKTsKIH0KQEAgLTI0NCw3ICsyNDQsNyBAQCB2b2lkIE11dGF0aW9uQWNjdW11bGF0aW9uUm91
dGVyOjppbmNyZW1lbnRTY29waW5nTGV2ZWwoTm9kZSogdGFyZ2V0KQogICAgICAgICByZXR1cm47
CiAgICAgfQogCi0gICAgVmVjdG9yPFdlYktpdE11dGF0aW9uT2JzZXJ2ZXIqPiBvYnNlcnZlcnM7
CisgICAgSGFzaE1hcDxXZWJLaXRNdXRhdGlvbk9ic2VydmVyKiwgTXV0YXRpb25PYnNlcnZlck9w
dGlvbnM+IG9ic2VydmVyczsKICAgICB0YXJnZXQtPmdldFJlZ2lzdGVyZWRNdXRhdGlvbk9ic2Vy
dmVyc09mVHlwZShvYnNlcnZlcnMsIFdlYktpdE11dGF0aW9uT2JzZXJ2ZXI6OkNoaWxkTGlzdCk7
CiAgICAgaWYgKG9ic2VydmVycy5pc0VtcHR5KCkpCiAgICAgICAgIG1fYWNjdW11bGF0aW9ucy5z
ZXQodGFyZ2V0LCAwKTsKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2RvbS9Db250YWluZXJO
b2RlLmNwcCBiL1NvdXJjZS9XZWJDb3JlL2RvbS9Db250YWluZXJOb2RlLmNwcAppbmRleCA3NGM3
OWQ2ZjczMTFiNTA0MWRiZjk1N2Q0M2RlM2M2OTg2NDA2Y2U1Li5kYmQxMDc5NzkxYTgyZmM1MDRi
MDNiY2Q2MWQ2NWE2N2FlMmMxM2VjIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9kb20vQ29u
dGFpbmVyTm9kZS5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvZG9tL0NvbnRhaW5lck5vZGUuY3Bw
CkBAIC0xMTQ0LDYgKzExNDQsNyBAQCBzdGF0aWMgdm9pZCBkaXNwYXRjaENoaWxkUmVtb3ZhbEV2
ZW50cyhOb2RlKiBjaGlsZCkKICAgICBpZiAoYy0+cGFyZW50Tm9kZSgpKSB7CiAgICAgICAgIENo
aWxkTGlzdE11dGF0aW9uU2NvcGUgbXV0YXRpb24oYy0+cGFyZW50Tm9kZSgpKTsKICAgICAgICAg
bXV0YXRpb24ud2lsbFJlbW92ZUNoaWxkKGMpOworICAgICAgICBjLT5ub3RpZnlNdXRhdGlvbk9i
c2VydmVyc05vZGVXaWxsRGV0YWNoKCk7CiAgICAgfQogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL1Nv
dXJjZS9XZWJDb3JlL2RvbS9FbGVtZW50LmNwcCBiL1NvdXJjZS9XZWJDb3JlL2RvbS9FbGVtZW50
LmNwcAppbmRleCBlODk0OTgyNjNjYmQzNWRmOGVmZDg3MjA1MzQ1ZGI2N2IzOWNlYmVmLi5lYzQ4
MDU4MjU3YzQ0ZDdjZmFiNzA1MGQxMmYyNDExNjZjN2RjNmRiIDEwMDY0NAotLS0gYS9Tb3VyY2Uv
V2ViQ29yZS9kb20vRWxlbWVudC5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvZG9tL0VsZW1lbnQu
Y3BwCkBAIC02MTksMTQgKzYxOSwxNCBAQCBjb25zdCBBdG9taWNTdHJpbmcmIEVsZW1lbnQ6Omdl
dEF0dHJpYnV0ZU5TKGNvbnN0IFN0cmluZyYgbmFtZXNwYWNlVVJJLCBjb25zdCBTdAogI2lmIEVO
QUJMRShNVVRBVElPTl9PQlNFUlZFUlMpCiBzdGF0aWMgdm9pZCBlbnF1ZXVlQXR0cmlidXRlc011
dGF0aW9uUmVjb3JkKEVsZW1lbnQqIGVsZW1lbnQsIGNvbnN0IFF1YWxpZmllZE5hbWUmIG5hbWUp
CiB7Ci0gICAgVmVjdG9yPFdlYktpdE11dGF0aW9uT2JzZXJ2ZXIqPiBvYnNlcnZlcnM7CisgICAg
SGFzaE1hcDxXZWJLaXRNdXRhdGlvbk9ic2VydmVyKiwgTXV0YXRpb25PYnNlcnZlck9wdGlvbnM+
IG9ic2VydmVyczsKICAgICBlbGVtZW50LT5nZXRSZWdpc3RlcmVkTXV0YXRpb25PYnNlcnZlcnNP
ZlR5cGUob2JzZXJ2ZXJzLCBXZWJLaXRNdXRhdGlvbk9ic2VydmVyOjpBdHRyaWJ1dGVzKTsKICAg
ICBpZiAob2JzZXJ2ZXJzLmlzRW1wdHkoKSkKICAgICAgICAgcmV0dXJuOwogCiAgICAgUmVmUHRy
PE11dGF0aW9uUmVjb3JkPiBtdXRhdGlvbiA9IE11dGF0aW9uUmVjb3JkOjpjcmVhdGVBdHRyaWJ1
dGVzKGVsZW1lbnQsIG5hbWUpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgb2JzZXJ2ZXJz
LnNpemUoKTsgKytpKQotICAgICAgICBvYnNlcnZlcnNbaV0tPmVucXVldWVNdXRhdGlvblJlY29y
ZChtdXRhdGlvbik7CisgICAgZm9yIChIYXNoTWFwPFdlYktpdE11dGF0aW9uT2JzZXJ2ZXIqLCBN
dXRhdGlvbk9ic2VydmVyT3B0aW9ucz46Oml0ZXJhdG9yIGl0ZXIgPSBvYnNlcnZlcnMuYmVnaW4o
KTsgaXRlciAhPSBvYnNlcnZlcnMuZW5kKCk7ICsraXRlcikKKyAgICAgICAgaXRlci0+Zmlyc3Qt
PmVucXVldWVNdXRhdGlvblJlY29yZChtdXRhdGlvbik7CiB9CiAjZW5kaWYKIApkaWZmIC0tZ2l0
IGEvU291cmNlL1dlYkNvcmUvZG9tL05vZGUuY3BwIGIvU291cmNlL1dlYkNvcmUvZG9tL05vZGUu
Y3BwCmluZGV4IDkyOTRkZTY4NGI2Yjg1NjU1ZDA4MWIxMTJiZjNmN2Q0NjM0NDJjZDMuLjE4NDU2
ODc2OWVhMTMyYmMzZjE1MDY3YWJlYTM2YWVlZmI1NTlkMGYgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9X
ZWJDb3JlL2RvbS9Ob2RlLmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9kb20vTm9kZS5jcHAKQEAg
LTU0OSwxMCArNTQ5LDkgQEAgdm9pZCBOb2RlOjpjbGVhclJhcmVEYXRhKCkKICAgICAgICAgdHJl
ZVNjb3BlKCktPnJlbW92ZU5vZGVMaXN0Q2FjaGUoKTsKIAogI2lmIEVOQUJMRShNVVRBVElPTl9P
QlNFUlZFUlMpCi0gICAgVmVjdG9yPE11dGF0aW9uT2JzZXJ2ZXJFbnRyeT4qIG9ic2VydmVyRW50
cmllcyA9IG11dGF0aW9uT2JzZXJ2ZXJFbnRyaWVzKCk7Ci0gICAgaWYgKG9ic2VydmVyRW50cmll
cykgewotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG9ic2VydmVyRW50cmllcy0+c2l6
ZSgpOyArK2kpCi0gICAgICAgICAgICBvYnNlcnZlckVudHJpZXMtPmF0KGkpLm9ic2VydmVyLT5v
YnNlcnZlZE5vZGVEZXN0cnVjdGVkKHRoaXMpOworICAgIGlmIChWZWN0b3I8TXV0YXRpb25PYnNl
cnZlclJlZ2lzdHJhdGlvbj4qIHJlZ2lzdHJ5ID0gbXV0YXRpb25PYnNlcnZlclJlZ2lzdHJ5KCkp
IHsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByZWdpc3RyeS0+c2l6ZSgpOyArK2kp
CisgICAgICAgICAgICByZWdpc3RyeS0+YXQoaSkub2JzZXJ2ZXItPm9ic2VydmVkTm9kZURlc3Ry
dWN0ZWQodGhpcyk7CiAgICAgfQogI2VuZGlmCiAKQEAgLTI2OTgsNjUgKzI2OTcsODYgQEAgRXZl
bnRUYXJnZXREYXRhKiBOb2RlOjplbnN1cmVFdmVudFRhcmdldERhdGEoKQogfQogCiAjaWYgRU5B
QkxFKE1VVEFUSU9OX09CU0VSVkVSUykKLVZlY3RvcjxNdXRhdGlvbk9ic2VydmVyRW50cnk+KiBO
b2RlOjptdXRhdGlvbk9ic2VydmVyRW50cmllcygpCitWZWN0b3I8TXV0YXRpb25PYnNlcnZlclJl
Z2lzdHJhdGlvbj4qIE5vZGU6Om11dGF0aW9uT2JzZXJ2ZXJSZWdpc3RyeSgpCiB7Ci0gICAgcmV0
dXJuIGhhc1JhcmVEYXRhKCkgPyByYXJlRGF0YSgpLT5tdXRhdGlvbk9ic2VydmVyRW50cmllcygp
IDogMDsKKyAgICByZXR1cm4gaGFzUmFyZURhdGEoKSA/IHJhcmVEYXRhKCktPm11dGF0aW9uT2Jz
ZXJ2ZXJSZWdpc3RyeSgpIDogMDsKIH0KIAotc3RhdGljIHZvaWQgYWRkTWF0Y2hpbmdPYnNlcnZl
cnMoSGFzaFNldDxXZWJLaXRNdXRhdGlvbk9ic2VydmVyKj4mIG9ic2VydmVyU2V0LCBWZWN0b3I8
TXV0YXRpb25PYnNlcnZlckVudHJ5Piogb2JzZXJ2ZXJFbnRyaWVzLCBNdXRhdGlvbk9ic2VydmVy
T3B0aW9ucyBvcHRpb25zKQorc3RhdGljIHZvaWQgYWRkTWF0Y2hpbmdPYnNlcnZlcnMoSGFzaE1h
cDxXZWJLaXRNdXRhdGlvbk9ic2VydmVyKiwgTXV0YXRpb25PYnNlcnZlck9wdGlvbnM+JiBvYnNl
cnZlcnMsIFZlY3RvcjxNdXRhdGlvbk9ic2VydmVyUmVnaXN0cmF0aW9uPiogcmVnaXN0cnksIE11
dGF0aW9uT2JzZXJ2ZXJPcHRpb25zIG9wdGlvbnMpCiB7Ci0gICAgaWYgKCFvYnNlcnZlckVudHJp
ZXMpCisgICAgaWYgKCFyZWdpc3RyeSkKICAgICAgICAgcmV0dXJuOwogCi0gICAgY29uc3Qgc2l6
ZV90IHNpemUgPSBvYnNlcnZlckVudHJpZXMtPnNpemUoKTsKKyAgICBjb25zdCBzaXplX3Qgc2l6
ZSA9IHJlZ2lzdHJ5LT5zaXplKCk7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyAr
K2kpIHsKLSAgICAgICAgTXV0YXRpb25PYnNlcnZlckVudHJ5JiBlbnRyeSA9IG9ic2VydmVyRW50
cmllcy0+YXQoaSk7Ci0gICAgICAgIGlmIChlbnRyeS5oYXNBbGxPcHRpb25zKG9wdGlvbnMpKQot
ICAgICAgICAgICAgb2JzZXJ2ZXJTZXQuYWRkKGVudHJ5Lm9ic2VydmVyLmdldCgpKTsKKyAgICAg
ICAgTXV0YXRpb25PYnNlcnZlclJlZ2lzdHJhdGlvbiYgZW50cnkgPSByZWdpc3RyeS0+YXQoaSk7
CisKKyAgICAgICAgaWYgKCFlbnRyeS5oYXNBbGxPcHRpb25zKG9wdGlvbnMpKQorICAgICAgICAg
ICAgY29udGludWU7CisKKyAgICAgICAgcGFpcjxIYXNoTWFwPFdlYktpdE11dGF0aW9uT2JzZXJ2
ZXIqLCBNdXRhdGlvbk9ic2VydmVyT3B0aW9ucz46Oml0ZXJhdG9yLCBib29sPiByZXN1bHQgPSBv
YnNlcnZlcnMuYWRkKGVudHJ5Lm9ic2VydmVyLmdldCgpLCBlbnRyeS5vcHRpb25zKTsKKyAgICAg
ICAgaWYgKCFyZXN1bHQuc2Vjb25kKQorICAgICAgICAgICAgcmVzdWx0LmZpcnN0LT5zZWNvbmQg
fD0gZW50cnkub3B0aW9uczsKICAgICB9CiB9CiAKLXZvaWQgTm9kZTo6Z2V0UmVnaXN0ZXJlZE11
dGF0aW9uT2JzZXJ2ZXJzT2ZUeXBlKFZlY3RvcjxXZWJLaXRNdXRhdGlvbk9ic2VydmVyKj4mIG9i
c2VydmVycywgV2ViS2l0TXV0YXRpb25PYnNlcnZlcjo6TXV0YXRpb25UeXBlIHR5cGUpCit2b2lk
IE5vZGU6OmdldFJlZ2lzdGVyZWRNdXRhdGlvbk9ic2VydmVyc09mVHlwZShIYXNoTWFwPFdlYktp
dE11dGF0aW9uT2JzZXJ2ZXIqLCBNdXRhdGlvbk9ic2VydmVyT3B0aW9ucz4mIG9ic2VydmVycywg
V2ViS2l0TXV0YXRpb25PYnNlcnZlcjo6TXV0YXRpb25UeXBlIHR5cGUpCiB7Ci0gICAgSGFzaFNl
dDxXZWJLaXRNdXRhdGlvbk9ic2VydmVyKj4gb2JzZXJ2ZXJTZXQ7Ci0gICAgYWRkTWF0Y2hpbmdP
YnNlcnZlcnMob2JzZXJ2ZXJTZXQsIG11dGF0aW9uT2JzZXJ2ZXJFbnRyaWVzKCksIHR5cGUpOwor
ICAgIGFkZE1hdGNoaW5nT2JzZXJ2ZXJzKG9ic2VydmVycywgbXV0YXRpb25PYnNlcnZlclJlZ2lz
dHJ5KCksIHR5cGUpOwogICAgIGZvciAoTm9kZSogbm9kZSA9IHBhcmVudE5vZGUoKTsgbm9kZTsg
bm9kZSA9IG5vZGUtPnBhcmVudE5vZGUoKSkKLSAgICAgICAgYWRkTWF0Y2hpbmdPYnNlcnZlcnMo
b2JzZXJ2ZXJTZXQsIG5vZGUtPm11dGF0aW9uT2JzZXJ2ZXJFbnRyaWVzKCksIHR5cGUgfCBXZWJL
aXRNdXRhdGlvbk9ic2VydmVyOjpTdWJ0cmVlKTsKLQotICAgIC8vIEZJWE1FOiB0aGlzIG1ldGhv
ZCBzaG91bGQgb3V0cHV0IGEgSGFzaFNldCBpbnN0ZWFkIG9mIGEgVmVjdG9yLgotICAgIGlmICgh
b2JzZXJ2ZXJTZXQuaXNFbXB0eSgpKQotICAgICAgICBjb3B5VG9WZWN0b3Iob2JzZXJ2ZXJTZXQs
IG9ic2VydmVycyk7CisgICAgICAgIGFkZE1hdGNoaW5nT2JzZXJ2ZXJzKG9ic2VydmVycywgbm9k
ZS0+bXV0YXRpb25PYnNlcnZlclJlZ2lzdHJ5KCksIHR5cGUgfCBXZWJLaXRNdXRhdGlvbk9ic2Vy
dmVyOjpTdWJ0cmVlKTsKIH0KIAotTm9kZTo6TXV0YXRpb25SZWdpc3RyYXRpb25SZXN1bHQgTm9k
ZTo6cmVnaXN0ZXJNdXRhdGlvbk9ic2VydmVyKFBhc3NSZWZQdHI8V2ViS2l0TXV0YXRpb25PYnNl
cnZlcj4gb2JzZXJ2ZXIsIE11dGF0aW9uT2JzZXJ2ZXJPcHRpb25zIG9wdGlvbnMpCitOb2RlOjpN
dXRhdGlvblJlZ2lzdHJhdGlvblJlc3VsdCBOb2RlOjpyZWdpc3Rlck11dGF0aW9uT2JzZXJ2ZXIo
UGFzc1JlZlB0cjxXZWJLaXRNdXRhdGlvbk9ic2VydmVyPiBvYnNlcnZlciwgTXV0YXRpb25PYnNl
cnZlck9wdGlvbnMgb3B0aW9ucywgTm9kZSogcmVnaXN0cmF0aW9uTm9kZSkKIHsKLSAgICBWZWN0
b3I8TXV0YXRpb25PYnNlcnZlckVudHJ5Piogb2JzZXJ2ZXJFbnRyaWVzID0gZW5zdXJlUmFyZURh
dGEoKS0+ZW5zdXJlTXV0YXRpb25PYnNlcnZlckVudHJpZXMoKTsKLSAgICBNdXRhdGlvbk9ic2Vy
dmVyRW50cnkgZW50cnkob2JzZXJ2ZXIsIG9wdGlvbnMpOworICAgIFZlY3RvcjxNdXRhdGlvbk9i
c2VydmVyUmVnaXN0cmF0aW9uPiogcmVnaXN0cnkgPSBlbnN1cmVSYXJlRGF0YSgpLT5lbnN1cmVN
dXRhdGlvbk9ic2VydmVyUmVnaXN0cnkoKTsKKyAgICBNdXRhdGlvbk9ic2VydmVyUmVnaXN0cmF0
aW9uIHJlZ2lzdHJhdGlvbihvYnNlcnZlciwgb3B0aW9ucywgcmVnaXN0cmF0aW9uTm9kZSk7CiAK
LSAgICBzaXplX3QgaW5kZXggPSBvYnNlcnZlckVudHJpZXMtPmZpbmQoZW50cnkpOworICAgIHNp
emVfdCBpbmRleCA9IHJlZ2lzdHJ5LT5maW5kKHJlZ2lzdHJhdGlvbik7CiAgICAgaWYgKGluZGV4
ID09IG5vdEZvdW5kKSB7Ci0gICAgICAgIG9ic2VydmVyRW50cmllcy0+YXBwZW5kKGVudHJ5KTsK
KyAgICAgICAgcmVnaXN0cnktPmFwcGVuZChyZWdpc3RyYXRpb24pOwogICAgICAgICByZXR1cm4g
TXV0YXRpb25PYnNlcnZlclJlZ2lzdGVyZWQ7CiAgICAgfQogCi0gICAgKCpvYnNlcnZlckVudHJp
ZXMpW2luZGV4XS5vcHRpb25zID0gZW50cnkub3B0aW9uczsKKyAgICByZWdpc3RyeS0+YXQoaW5k
ZXgpLm9wdGlvbnMgPSByZWdpc3RyYXRpb24ub3B0aW9uczsKICAgICByZXR1cm4gTXV0YXRpb25S
ZWdpc3RyYXRpb25PcHRpb25zUmVzZXQ7CiB9CiAKLXZvaWQgTm9kZTo6dW5yZWdpc3Rlck11dGF0
aW9uT2JzZXJ2ZXIoUGFzc1JlZlB0cjxXZWJLaXRNdXRhdGlvbk9ic2VydmVyPiBvYnNlcnZlcikK
K3ZvaWQgTm9kZTo6dW5yZWdpc3Rlck11dGF0aW9uT2JzZXJ2ZXIoUGFzc1JlZlB0cjxXZWJLaXRN
dXRhdGlvbk9ic2VydmVyPiBvYnNlcnZlciwgTm9kZSogcmVnaXN0cmF0aW9uTm9kZSkKIHsKLSAg
ICBWZWN0b3I8TXV0YXRpb25PYnNlcnZlckVudHJ5Piogb2JzZXJ2ZXJFbnRyaWVzID0gbXV0YXRp
b25PYnNlcnZlckVudHJpZXMoKTsKLSAgICBBU1NFUlQob2JzZXJ2ZXJFbnRyaWVzKTsKLSAgICBp
ZiAoIW9ic2VydmVyRW50cmllcykKKyAgICBWZWN0b3I8TXV0YXRpb25PYnNlcnZlclJlZ2lzdHJh
dGlvbj4qIHJlZ2lzdHJ5ID0gbXV0YXRpb25PYnNlcnZlclJlZ2lzdHJ5KCk7CisgICAgQVNTRVJU
KHJlZ2lzdHJ5KTsKKyAgICBpZiAoIXJlZ2lzdHJ5KQogICAgICAgICByZXR1cm47CiAKLSAgICBN
dXRhdGlvbk9ic2VydmVyRW50cnkgZW50cnkob2JzZXJ2ZXIsIDApOwotICAgIHNpemVfdCBpbmRl
eCA9IG9ic2VydmVyRW50cmllcy0+ZmluZChlbnRyeSk7CisgICAgTXV0YXRpb25PYnNlcnZlclJl
Z2lzdHJhdGlvbiByZWdpc3RyYXRpb24ob2JzZXJ2ZXIsIDAsIHJlZ2lzdHJhdGlvbk5vZGUpOwor
ICAgIHNpemVfdCBpbmRleCA9IHJlZ2lzdHJ5LT5maW5kKHJlZ2lzdHJhdGlvbik7CiAgICAgQVNT
RVJUKGluZGV4ICE9IG5vdEZvdW5kKTsKICAgICBpZiAoaW5kZXggPT0gbm90Rm91bmQpCiAgICAg
ICAgIHJldHVybjsKIAotICAgIG9ic2VydmVyRW50cmllcy0+cmVtb3ZlKGluZGV4KTsKKyAgICBy
ZWdpc3RyeS0+cmVtb3ZlKGluZGV4KTsKK30KKwordm9pZCBOb2RlOjpub3RpZnlNdXRhdGlvbk9i
c2VydmVyc05vZGVXaWxsRGV0YWNoKCkKK3sKKyAgICBmb3IgKE5vZGUqIG5vZGUgPSBwYXJlbnRO
b2RlKCk7IG5vZGU7IG5vZGUgPSBub2RlLT5wYXJlbnROb2RlKCkpIHsKKyAgICAgICAgVmVjdG9y
PE11dGF0aW9uT2JzZXJ2ZXJSZWdpc3RyYXRpb24+KiByZWdpc3RyeSA9IG5vZGUtPm11dGF0aW9u
T2JzZXJ2ZXJSZWdpc3RyeSgpOworICAgICAgICBpZiAoIXJlZ2lzdHJ5KQorICAgICAgICAgICAg
Y29udGludWU7CisKKyAgICAgICAgY29uc3Qgc2l6ZV90IHNpemUgPSByZWdpc3RyeS0+c2l6ZSgp
OworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7ICsraSkgeworICAgICAgICAg
ICAgTXV0YXRpb25PYnNlcnZlclJlZ2lzdHJhdGlvbiYgcmVnaXN0cmF0aW9uID0gcmVnaXN0cnkt
PmF0KGkpOworICAgICAgICAgICAgaWYgKCFyZWdpc3RyYXRpb24uaGFzQWxsT3B0aW9ucyhXZWJL
aXRNdXRhdGlvbk9ic2VydmVyOjpTdWJ0cmVlKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsK
KworICAgICAgICAgICAgTm9kZSogcmVnaXN0cmF0aW9uTm9kZSA9IHJlZ2lzdHJhdGlvbi5yZWdp
c3RyYXRpb25Ob2RlOworICAgICAgICAgICAgaWYgKCFyZWdpc3RyYXRpb25Ob2RlKQorICAgICAg
ICAgICAgICAgIHJlZ2lzdHJhdGlvbk5vZGUgPSBub2RlOworICAgICAgICAgICAgcmVnaXN0cmF0
aW9uLm9ic2VydmVyLT53aWxsRGV0YWNoTm9kZUluT2JzZXJ2ZWRTdWJ0cmVlKHJlZ2lzdHJhdGlv
bk5vZGUsIHJlZ2lzdHJhdGlvbi5vcHRpb25zLCB0aGlzKTsKKyAgICAgICAgfQorICAgIH0KIH0K
ICNlbmRpZiAvLyBFTkFCTEUoTVVUQVRJT05fT0JTRVJWRVJTKQogCmRpZmYgLS1naXQgYS9Tb3Vy
Y2UvV2ViQ29yZS9kb20vTm9kZS5oIGIvU291cmNlL1dlYkNvcmUvZG9tL05vZGUuaAppbmRleCA2
NDJkYTBiY2JlYjAzN2QzYjZiN2I2NTdiZDhhYmZlOWRjNThiYjhiLi5jOGExMzE5NzBjY2MzMGQ1
NTczNTA0MjQzN2VjYWM2NTEwZDk0NTVkIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9kb20v
Tm9kZS5oCisrKyBiL1NvdXJjZS9XZWJDb3JlL2RvbS9Ob2RlLmgKQEAgLTgxLDcgKzgxLDcgQEAg
Y2xhc3MgU1ZHVXNlRWxlbWVudDsKIGNsYXNzIFRhZ05vZGVMaXN0OwogY2xhc3MgVHJlZVNjb3Bl
OwogCi1zdHJ1Y3QgTXV0YXRpb25PYnNlcnZlckVudHJ5Oworc3RydWN0IE11dGF0aW9uT2JzZXJ2
ZXJSZWdpc3RyYXRpb247CiAKIHR5cGVkZWYgaW50IEV4Y2VwdGlvbkNvZGU7CiAKQEAgLTU5MCwx
NSArNTkwLDE3IEBAIHB1YmxpYzoKICNlbmRpZgogCiAjaWYgRU5BQkxFKE1VVEFUSU9OX09CU0VS
VkVSUykKLSAgICB2b2lkIGdldFJlZ2lzdGVyZWRNdXRhdGlvbk9ic2VydmVyc09mVHlwZShWZWN0
b3I8V2ViS2l0TXV0YXRpb25PYnNlcnZlcio+JiwgV2ViS2l0TXV0YXRpb25PYnNlcnZlcjo6TXV0
YXRpb25UeXBlKTsKKyAgICB2b2lkIGdldFJlZ2lzdGVyZWRNdXRhdGlvbk9ic2VydmVyc09mVHlw
ZShIYXNoTWFwPFdlYktpdE11dGF0aW9uT2JzZXJ2ZXIqLCBNdXRhdGlvbk9ic2VydmVyT3B0aW9u
cz4mLCBXZWJLaXRNdXRhdGlvbk9ic2VydmVyOjpNdXRhdGlvblR5cGUpOwogCiAgICAgZW51bSBN
dXRhdGlvblJlZ2lzdHJhdGlvblJlc3VsdCB7CiAgICAgICAgIE11dGF0aW9uT2JzZXJ2ZXJSZWdp
c3RlcmVkLAogICAgICAgICBNdXRhdGlvblJlZ2lzdHJhdGlvbk9wdGlvbnNSZXNldAogICAgIH07
Ci0gICAgTXV0YXRpb25SZWdpc3RyYXRpb25SZXN1bHQgcmVnaXN0ZXJNdXRhdGlvbk9ic2VydmVy
KFBhc3NSZWZQdHI8V2ViS2l0TXV0YXRpb25PYnNlcnZlcj4sIE11dGF0aW9uT2JzZXJ2ZXJPcHRp
b25zKTsKKyAgICBNdXRhdGlvblJlZ2lzdHJhdGlvblJlc3VsdCByZWdpc3Rlck11dGF0aW9uT2Jz
ZXJ2ZXIoUGFzc1JlZlB0cjxXZWJLaXRNdXRhdGlvbk9ic2VydmVyPiwgTXV0YXRpb25PYnNlcnZl
ck9wdGlvbnMsIE5vZGUqIHJlZ2lzdHJhdGlvbk5vZGUgPSAwKTsKIAotICAgIHZvaWQgdW5yZWdp
c3Rlck11dGF0aW9uT2JzZXJ2ZXIoUGFzc1JlZlB0cjxXZWJLaXRNdXRhdGlvbk9ic2VydmVyPik7
CisgICAgdm9pZCB1bnJlZ2lzdGVyTXV0YXRpb25PYnNlcnZlcihQYXNzUmVmUHRyPFdlYktpdE11
dGF0aW9uT2JzZXJ2ZXI+LCBOb2RlKiByZWdpc3RyYXRpb25Ob2RlID0gMCk7CisKKyAgICB2b2lk
IG5vdGlmeU11dGF0aW9uT2JzZXJ2ZXJzTm9kZVdpbGxEZXRhY2goKTsKICNlbmRpZiAvLyBFTkFC
TEUoTVVUQVRJT05fT0JTRVJWRVJTKQogCiBwcml2YXRlOgpAQCAtNzI1LDcgKzcyNyw3IEBAIHBy
aXZhdGU6CiAgICAgdm9pZCB0cmFja0ZvckRlYnVnZ2luZygpOwogCiAjaWYgRU5BQkxFKE1VVEFU
SU9OX09CU0VSVkVSUykKLSAgICBWZWN0b3I8TXV0YXRpb25PYnNlcnZlckVudHJ5PiogbXV0YXRp
b25PYnNlcnZlckVudHJpZXMoKTsKKyAgICBWZWN0b3I8TXV0YXRpb25PYnNlcnZlclJlZ2lzdHJh
dGlvbj4qIG11dGF0aW9uT2JzZXJ2ZXJSZWdpc3RyeSgpOwogI2VuZGlmCiAKICAgICBtdXRhYmxl
IHVpbnQzMl90IG1fbm9kZUZsYWdzOwpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvZG9tL05v
ZGVSYXJlRGF0YS5oIGIvU291cmNlL1dlYkNvcmUvZG9tL05vZGVSYXJlRGF0YS5oCmluZGV4IDUw
MmI2NThmYzA0YmVhNjg3OTE3MTc1NTA1ZThjOGExNzAyNzQ5OGIuLmVjYmQ1NTkyMmY0MjkwYmJi
MzhkYTMxMDk3MGYwNThhMGI1NjRmNGMgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL2RvbS9O
b2RlUmFyZURhdGEuaAorKysgYi9Tb3VyY2UvV2ViQ29yZS9kb20vTm9kZVJhcmVEYXRhLmgKQEAg
LTg5LDE2ICs4OSwxNyBAQCBwcml2YXRlOgogfTsKIAogI2lmIEVOQUJMRShNVVRBVElPTl9PQlNF
UlZFUlMpCi1zdHJ1Y3QgTXV0YXRpb25PYnNlcnZlckVudHJ5IHsKLSAgICBNdXRhdGlvbk9ic2Vy
dmVyRW50cnkoUGFzc1JlZlB0cjxXZWJLaXRNdXRhdGlvbk9ic2VydmVyPiBvYnNlcnZlciwgTXV0
YXRpb25PYnNlcnZlck9wdGlvbnMgb3B0aW9ucykKK3N0cnVjdCBNdXRhdGlvbk9ic2VydmVyUmVn
aXN0cmF0aW9uIHsKKyAgICBNdXRhdGlvbk9ic2VydmVyUmVnaXN0cmF0aW9uKFBhc3NSZWZQdHI8
V2ViS2l0TXV0YXRpb25PYnNlcnZlcj4gb2JzZXJ2ZXIsIE11dGF0aW9uT2JzZXJ2ZXJPcHRpb25z
IG9wdGlvbnMsIE5vZGUqIG5vZGUpCiAgICAgICAgIDogb2JzZXJ2ZXIob2JzZXJ2ZXIpCiAgICAg
ICAgICwgb3B0aW9ucyhvcHRpb25zKQorICAgICAgICAsIHJlZ2lzdHJhdGlvbk5vZGUobm9kZSkK
ICAgICB7CiAgICAgfQogCi0gICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IE11dGF0aW9uT2JzZXJ2
ZXJFbnRyeSYgb3RoZXIpIGNvbnN0CisgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IE11dGF0aW9u
T2JzZXJ2ZXJSZWdpc3RyYXRpb24mIG90aGVyKSBjb25zdAogICAgIHsKLSAgICAgICAgcmV0dXJu
IG9ic2VydmVyID09IG90aGVyLm9ic2VydmVyOworICAgICAgICByZXR1cm4gb2JzZXJ2ZXIgPT0g
b3RoZXIub2JzZXJ2ZXIgJiYgcmVnaXN0cmF0aW9uTm9kZSA9PSBvdGhlci5yZWdpc3RyYXRpb25O
b2RlOwogICAgIH0KIAogICAgIGJvb2wgaGFzQWxsT3B0aW9ucyhNdXRhdGlvbk9ic2VydmVyT3B0
aW9ucyBvcHRpb25zKSBjb25zdApAQCAtMTA4LDYgKzEwOSwxMiBAQCBzdHJ1Y3QgTXV0YXRpb25P
YnNlcnZlckVudHJ5IHsKIAogICAgIFJlZlB0cjxXZWJLaXRNdXRhdGlvbk9ic2VydmVyPiBvYnNl
cnZlcjsKICAgICBNdXRhdGlvbk9ic2VydmVyT3B0aW9ucyBvcHRpb25zOworCisgICAgLy8gcmVn
aXN0cmF0aW9uTm9kZSB3aWxsIGJlIDAgaWYgdGhlIHJlZ2lzdHJhdGlvbiBpcyBub24tdHJhbnNp
ZW50LiBJLmUuIFRoZSByZWdpc3RyYXRpb25Ob2RlIGlzIHRoZSBOb2RlIGluIHdob3NlCisgICAg
Ly8gcmVnaXN0cnkgaXQgZXhpc3RzLgorICAgIC8vIE5vdGUgdGhhdCB0aGlzIGRvZXNuJ3QgbmVl
ZCB0byBiZSBhIFJlZlB0ciBiZWNhdXNlIHRoZSBvYnNlcnZlciB3aWxsIGJlIGhvbGRpbmcgYSBS
ZWZQdHIgdG8gdGhlIHNhbWUgbm9kZSBhdAorICAgIC8vIGxlYXN0IGZvciB0aGUgbGlmZXRpbWUg
b2YgdGhpcyBSZWdpc3RyYXRpb24gaW4gaXRzIG1fdHJhbnNpZW50T2JzZXJ2ZWROb2RlcyBtYXAu
CisgICAgTm9kZSogcmVnaXN0cmF0aW9uTm9kZTsKIH07CiAjZW5kaWYgLy8gRU5BQkxFKE1VVEFU
SU9OX09CU0VSVkVSUykKIApAQCAtMTYxLDEyICsxNjgsMTIgQEAgcHVibGljOgogICAgIH0KIAog
I2lmIEVOQUJMRShNVVRBVElPTl9PQlNFUlZFUlMpCi0gICAgVmVjdG9yPE11dGF0aW9uT2JzZXJ2
ZXJFbnRyeT4qIG11dGF0aW9uT2JzZXJ2ZXJFbnRyaWVzKCkgeyByZXR1cm4gbV9tdXRhdGlvbk9i
c2VydmVycy5nZXQoKTsgfQotICAgIFZlY3RvcjxNdXRhdGlvbk9ic2VydmVyRW50cnk+KiBlbnN1
cmVNdXRhdGlvbk9ic2VydmVyRW50cmllcygpCisgICAgVmVjdG9yPE11dGF0aW9uT2JzZXJ2ZXJS
ZWdpc3RyYXRpb24+KiBtdXRhdGlvbk9ic2VydmVyUmVnaXN0cnkoKSB7IHJldHVybiBtX211dGF0
aW9uT2JzZXJ2ZXJSZWdpc3RyeS5nZXQoKTsgfQorICAgIFZlY3RvcjxNdXRhdGlvbk9ic2VydmVy
UmVnaXN0cmF0aW9uPiogZW5zdXJlTXV0YXRpb25PYnNlcnZlclJlZ2lzdHJ5KCkKICAgICB7Ci0g
ICAgICAgIGlmICghbV9tdXRhdGlvbk9ic2VydmVycykKLSAgICAgICAgICAgIG1fbXV0YXRpb25P
YnNlcnZlcnMgPSBhZG9wdFB0cihuZXcgVmVjdG9yPE11dGF0aW9uT2JzZXJ2ZXJFbnRyeT4pOwot
ICAgICAgICByZXR1cm4gbV9tdXRhdGlvbk9ic2VydmVycy5nZXQoKTsKKyAgICAgICAgaWYgKCFt
X211dGF0aW9uT2JzZXJ2ZXJSZWdpc3RyeSkKKyAgICAgICAgICAgIG1fbXV0YXRpb25PYnNlcnZl
clJlZ2lzdHJ5ID0gYWRvcHRQdHIobmV3IFZlY3RvcjxNdXRhdGlvbk9ic2VydmVyUmVnaXN0cmF0
aW9uPik7CisgICAgICAgIHJldHVybiBtX211dGF0aW9uT2JzZXJ2ZXJSZWdpc3RyeS5nZXQoKTsK
ICAgICB9CiAjZW5kaWYKIApAQCAtMTg4LDcgKzE5NSw3IEBAIHByaXZhdGU6CiAgICAgYm9vbCBt
X25lZWRzRm9jdXNBcHBlYXJhbmNlVXBkYXRlU29vbkFmdGVyQXR0YWNoIDogMTsKIAogI2lmIEVO
QUJMRShNVVRBVElPTl9PQlNFUlZFUlMpCi0gICAgT3duUHRyPFZlY3RvcjxNdXRhdGlvbk9ic2Vy
dmVyRW50cnk+ID4gbV9tdXRhdGlvbk9ic2VydmVyczsKKyAgICBPd25QdHI8VmVjdG9yPE11dGF0
aW9uT2JzZXJ2ZXJSZWdpc3RyYXRpb24+ID4gbV9tdXRhdGlvbk9ic2VydmVyUmVnaXN0cnk7CiAj
ZW5kaWYKIH07CiAKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2RvbS9XZWJLaXRNdXRhdGlv
bk9ic2VydmVyLmNwcCBiL1NvdXJjZS9XZWJDb3JlL2RvbS9XZWJLaXRNdXRhdGlvbk9ic2VydmVy
LmNwcAppbmRleCA4M2YxNTk5MGVhMmJlY2EzMzliYjBhNzNjYzI5NjliYTRkZjI5ZmE1Li5iNjZj
YWEwODNlZTk5ZTRlNTAzOGJjNDZiMTI1OGM4YjUwNDU2MGE5IDEwMDY0NAotLS0gYS9Tb3VyY2Uv
V2ViQ29yZS9kb20vV2ViS2l0TXV0YXRpb25PYnNlcnZlci5jcHAKKysrIGIvU291cmNlL1dlYkNv
cmUvZG9tL1dlYktpdE11dGF0aW9uT2JzZXJ2ZXIuY3BwCkBAIC01MywxNCArNTMsMzAgQEAgV2Vi
S2l0TXV0YXRpb25PYnNlcnZlcjo6V2ViS2l0TXV0YXRpb25PYnNlcnZlcihQYXNzUmVmUHRyPE11
dGF0aW9uQ2FsbGJhY2s+IGNhbGwKIAogV2ViS2l0TXV0YXRpb25PYnNlcnZlcjo6fldlYktpdE11
dGF0aW9uT2JzZXJ2ZXIoKQogeworICAgIGNsZWFyQWxsVHJhbnNpZW50T2JzZXJ2YXRpb25zKCk7
Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjbGVhclRyYW5zaWVudE9ic2VydmF0aW9uc0ZvclJl
Z2lzdHJhdGlvbihXZWJLaXRNdXRhdGlvbk9ic2VydmVyKiBvYnNlcnZlciwgTm9kZSogcmVnaXN0
cmF0aW9uTm9kZSwgUGFzc093blB0cjxOb2RlSGFzaFNldD4gdHJhbnNpZW50Tm9kZXMpCit7Cisg
ICAgZm9yIChOb2RlSGFzaFNldDo6aXRlcmF0b3IgaXRlciA9IHRyYW5zaWVudE5vZGVzLT5iZWdp
bigpOyBpdGVyICE9IHRyYW5zaWVudE5vZGVzLT5lbmQoKTsgKytpdGVyKQorICAgICAgICAoKml0
ZXIpLT51bnJlZ2lzdGVyTXV0YXRpb25PYnNlcnZlcihvYnNlcnZlciwgcmVnaXN0cmF0aW9uTm9k
ZSk7CiB9CiAKIHZvaWQgV2ViS2l0TXV0YXRpb25PYnNlcnZlcjo6b2JzZXJ2ZShOb2RlKiBub2Rl
LCBNdXRhdGlvbk9ic2VydmVyT3B0aW9ucyBvcHRpb25zKQogewogICAgIC8vIEZJWE1FOiBNb3Jl
IG9wdGlvbnMgY29tcG9zaXRpb24gd29yayBuZWVkcyB0byBiZSBkb25lIGhlcmUsIGUuZy4sIHZh
bGlkYXRpb24uCiAKLSAgICBpZiAobm9kZS0+cmVnaXN0ZXJNdXRhdGlvbk9ic2VydmVyKHRoaXMs
IG9wdGlvbnMpID09IE5vZGU6Ok11dGF0aW9uT2JzZXJ2ZXJSZWdpc3RlcmVkKQorICAgIGlmIChu
b2RlLT5yZWdpc3Rlck11dGF0aW9uT2JzZXJ2ZXIodGhpcywgb3B0aW9ucykgPT0gTm9kZTo6TXV0
YXRpb25PYnNlcnZlclJlZ2lzdGVyZWQpIHsKICAgICAgICAgbV9vYnNlcnZlZE5vZGVzLmFwcGVu
ZChub2RlKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEhhc2hNYXA8UmVmUHRyPE5v
ZGU+LCBOb2RlSGFzaFNldCo+OjppdGVyYXRvciBpdGVyID0gbV90cmFuc2llbnRPYnNlcnZlZE5v
ZGVzLmZpbmQobm9kZSk7CisgICAgaWYgKGl0ZXIgPT0gbV90cmFuc2llbnRPYnNlcnZlZE5vZGVz
LmVuZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBjbGVhclRyYW5zaWVudE9ic2VydmF0aW9u
c0ZvclJlZ2lzdHJhdGlvbih0aGlzLCBub2RlLCBhZG9wdFB0cihpdGVyLT5zZWNvbmQpKTsKKyAg
ICBtX3RyYW5zaWVudE9ic2VydmVkTm9kZXMucmVtb3ZlKGl0ZXIpOwogfQogCiB2b2lkIFdlYktp
dE11dGF0aW9uT2JzZXJ2ZXI6OmRpc2Nvbm5lY3QoKQpAQCAtNjksMTAgKzg1LDEzIEBAIHZvaWQg
V2ViS2l0TXV0YXRpb25PYnNlcnZlcjo6ZGlzY29ubmVjdCgpCiAgICAgICAgIG1fb2JzZXJ2ZWRO
b2Rlc1tpXS0+dW5yZWdpc3Rlck11dGF0aW9uT2JzZXJ2ZXIodGhpcyk7CiAKICAgICBtX29ic2Vy
dmVkTm9kZXMuY2xlYXIoKTsKKyAgICBjbGVhckFsbFRyYW5zaWVudE9ic2VydmF0aW9ucygpOwog
fQogCiB2b2lkIFdlYktpdE11dGF0aW9uT2JzZXJ2ZXI6Om9ic2VydmVkTm9kZURlc3RydWN0ZWQo
Tm9kZSogbm9kZSkKIHsKKyAgICBBU1NFUlQoIW1fdHJhbnNpZW50T2JzZXJ2ZWROb2Rlcy5jb250
YWlucyhub2RlKSk7CisKICAgICBzaXplX3QgaW5kZXggPSBtX29ic2VydmVkTm9kZXMuZmluZChu
b2RlKTsKICAgICBBU1NFUlQoaW5kZXggIT0gbm90Rm91bmQpOwogICAgIGlmIChpbmRleCA9PSBu
b3RGb3VuZCkKQEAgLTk1LDEwICsxMTQsMzYgQEAgdm9pZCBXZWJLaXRNdXRhdGlvbk9ic2VydmVy
OjplbnF1ZXVlTXV0YXRpb25SZWNvcmQoUGFzc1JlZlB0cjxNdXRhdGlvblJlY29yZD4gbXUKICAg
ICBhY3RpdmVNdXRhdGlvbk9ic2VydmVycygpLmFkZCh0aGlzKTsKIH0KIAordm9pZCBXZWJLaXRN
dXRhdGlvbk9ic2VydmVyOjp3aWxsRGV0YWNoTm9kZUluT2JzZXJ2ZWRTdWJ0cmVlKFBhc3NSZWZQ
dHI8Tm9kZT4gcHJwUmVnaXN0cmF0aW9uTm9kZSwgTXV0YXRpb25PYnNlcnZlck9wdGlvbnMgb3B0
aW9ucywgUGFzc1JlZlB0cjxOb2RlPiBwcnBEZXRhY2hpbmdOb2RlKQoreworICAgIFJlZlB0cjxO
b2RlPiByZWdpc3RyYXRpb25Ob2RlID0gcHJwUmVnaXN0cmF0aW9uTm9kZTsKKyAgICBSZWZQdHI8
Tm9kZT4gZGV0YWNoaW5nTm9kZSA9IHBycERldGFjaGluZ05vZGU7CisKKyAgICBkZXRhY2hpbmdO
b2RlLT5yZWdpc3Rlck11dGF0aW9uT2JzZXJ2ZXIodGhpcywgb3B0aW9ucywgcmVnaXN0cmF0aW9u
Tm9kZS5nZXQoKSk7CisgICAgSGFzaE1hcDxSZWZQdHI8Tm9kZT4sIE5vZGVIYXNoU2V0Kj46Oml0
ZXJhdG9yIGl0ZXIgPSBtX3RyYW5zaWVudE9ic2VydmVkTm9kZXMuZmluZChyZWdpc3RyYXRpb25O
b2RlKTsKKyAgICBpZiAoaXRlciAhPSBtX3RyYW5zaWVudE9ic2VydmVkTm9kZXMuZW5kKCkpIHsK
KyAgICAgICAgaXRlci0+c2Vjb25kLT5hZGQoZGV0YWNoaW5nTm9kZSk7CisgICAgICAgIHJldHVy
bjsKKyAgICB9CisKKyAgICBPd25QdHI8Tm9kZUhhc2hTZXQ+IHNldCA9IGFkb3B0UHRyKG5ldyBO
b2RlSGFzaFNldCgpKTsKKyAgICBzZXQtPmFkZChkZXRhY2hpbmdOb2RlKTsKKyAgICBtX3RyYW5z
aWVudE9ic2VydmVkTm9kZXMuc2V0KHJlZ2lzdHJhdGlvbk5vZGUsIHNldC5sZWFrUHRyKCkpOwor
fQorCit2b2lkIFdlYktpdE11dGF0aW9uT2JzZXJ2ZXI6OmNsZWFyQWxsVHJhbnNpZW50T2JzZXJ2
YXRpb25zKCkKK3sKKyAgICBmb3IgKEhhc2hNYXA8UmVmUHRyPE5vZGU+LCBOb2RlSGFzaFNldCo+
OjppdGVyYXRvciBpdGVyID0gbV90cmFuc2llbnRPYnNlcnZlZE5vZGVzLmJlZ2luKCk7IGl0ZXIg
IT0gbV90cmFuc2llbnRPYnNlcnZlZE5vZGVzLmVuZCgpOyArK2l0ZXIpCisgICAgICAgIGNsZWFy
VHJhbnNpZW50T2JzZXJ2YXRpb25zRm9yUmVnaXN0cmF0aW9uKHRoaXMsIGl0ZXItPmZpcnN0Lmdl
dCgpLCBhZG9wdFB0cihpdGVyLT5zZWNvbmQpKTsKKworICAgIG1fdHJhbnNpZW50T2JzZXJ2ZWRO
b2Rlcy5jbGVhcigpOworfQorCiB2b2lkIFdlYktpdE11dGF0aW9uT2JzZXJ2ZXI6OmRlbGl2ZXIo
KQogewogICAgIE11dGF0aW9uUmVjb3JkQXJyYXkgcmVjb3JkczsKICAgICByZWNvcmRzLnN3YXAo
bV9yZWNvcmRzKTsKKyAgICBjbGVhckFsbFRyYW5zaWVudE9ic2VydmF0aW9ucygpOwogICAgIG1f
Y2FsbGJhY2stPmhhbmRsZUV2ZW50KCZyZWNvcmRzLCB0aGlzKTsKIH0KIApkaWZmIC0tZ2l0IGEv
U291cmNlL1dlYkNvcmUvZG9tL1dlYktpdE11dGF0aW9uT2JzZXJ2ZXIuaCBiL1NvdXJjZS9XZWJD
b3JlL2RvbS9XZWJLaXRNdXRhdGlvbk9ic2VydmVyLmgKaW5kZXggZmMzMjg2MDk5ODRhYTEyMWEz
Y2JmODY5NDQwNDYxZWIyY2E2NTk4ZS4uNzUzMjA0YzI0Nzk0ZDRlMzgyZGIwMjU1MWVhNTQ4MDM1
NGRjNGE3NSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvZG9tL1dlYktpdE11dGF0aW9uT2Jz
ZXJ2ZXIuaAorKysgYi9Tb3VyY2UvV2ViQ29yZS9kb20vV2ViS2l0TXV0YXRpb25PYnNlcnZlci5o
CkBAIC0zMyw2ICszMyw4IEBACiAKICNpZiBFTkFCTEUoTVVUQVRJT05fT0JTRVJWRVJTKQogCisj
aW5jbHVkZSA8d3RmL0hhc2hNYXAuaD4KKyNpbmNsdWRlIDx3dGYvSGFzaFNldC5oPgogI2luY2x1
ZGUgPHd0Zi9QYXNzT3duUHRyLmg+CiAjaW5jbHVkZSA8d3RmL1JlZkNvdW50ZWQuaD4KICNpbmNs
dWRlIDx3dGYvUmVmUHRyLmg+CkBAIC00NSw2ICs0Nyw3IEBAIGNsYXNzIE11dGF0aW9uUmVjb3Jk
OwogY2xhc3MgTm9kZTsKIAogdHlwZWRlZiB1bnNpZ25lZCBjaGFyIE11dGF0aW9uT2JzZXJ2ZXJP
cHRpb25zOwordHlwZWRlZiBIYXNoU2V0PFJlZlB0cjxOb2RlPiA+IE5vZGVIYXNoU2V0OwogCiBj
bGFzcyBXZWJLaXRNdXRhdGlvbk9ic2VydmVyIDogcHVibGljIFJlZkNvdW50ZWQ8V2ViS2l0TXV0
YXRpb25PYnNlcnZlcj4gewogcHVibGljOgpAQCAtNjgsMTcgKzcxLDIyIEBAIHB1YmxpYzoKIAog
ICAgIHZvaWQgb2JzZXJ2ZShOb2RlKiwgTXV0YXRpb25PYnNlcnZlck9wdGlvbnMpOwogICAgIHZv
aWQgZGlzY29ubmVjdCgpOworICAgIHZvaWQgd2lsbERldGFjaE5vZGVJbk9ic2VydmVkU3VidHJl
ZShQYXNzUmVmUHRyPE5vZGU+IHJlZ2lzdHJhdGlvbk5vZGUsIE11dGF0aW9uT2JzZXJ2ZXJPcHRp
b25zLCBQYXNzUmVmUHRyPE5vZGU+IGRldGFjaGluZ05vZGUpOwogICAgIHZvaWQgb2JzZXJ2ZWRO
b2RlRGVzdHJ1Y3RlZChOb2RlKik7CiAgICAgdm9pZCBlbnF1ZXVlTXV0YXRpb25SZWNvcmQoUGFz
c1JlZlB0cjxNdXRhdGlvblJlY29yZD4pOwogCiBwcml2YXRlOgogICAgIFdlYktpdE11dGF0aW9u
T2JzZXJ2ZXIoUGFzc1JlZlB0cjxNdXRhdGlvbkNhbGxiYWNrPik7CiAKKyAgICB2b2lkIGNsZWFy
QWxsVHJhbnNpZW50T2JzZXJ2YXRpb25zKCk7CiAgICAgdm9pZCBkZWxpdmVyKCk7CiAKICAgICBS
ZWZQdHI8TXV0YXRpb25DYWxsYmFjaz4gbV9jYWxsYmFjazsKICAgICBWZWN0b3I8UmVmUHRyPE11
dGF0aW9uUmVjb3JkPiA+IG1fcmVjb3JkczsKICAgICBWZWN0b3I8Tm9kZSo+IG1fb2JzZXJ2ZWRO
b2RlczsgLy8gTm9kZVJhcmVEYXRhIGhhcyBhIFJlZlB0ciB0byB0aGlzLCBzbyB1c2UgYSB3ZWFr
IHBvaW50ZXIgdG8gYXZvaWQgYSBjeWNsZS4KKworICAgIC8vIEZJWE1FOiBDaGFuZ2UgdGhpcyB0
byBiZSBPd25QdHI8Tm9kZUhhc2hTZXQ+IHdoZW4gT3duUHRyIHN1cHBvcnRzIGJlaW5nIGNvbnRh
aW5lZCBhcyBtYXAgdmFsdWVzLgorICAgIEhhc2hNYXA8UmVmUHRyPE5vZGU+LCBOb2RlSGFzaFNl
dCo+IG1fdHJhbnNpZW50T2JzZXJ2ZWROb2RlczsKIH07CiAKIH0KZGlmZiAtLWdpdCBhL0xheW91
dFRlc3RzL0NoYW5nZUxvZyBiL0xheW91dFRlc3RzL0NoYW5nZUxvZwppbmRleCBjMDVmNjQwNzBj
YWIwMDVkNTQyZjE4NjJiY2MwNjU1ZmMwYzEyMmRkLi5iZmRiNDM0YzcwYzQzNzk2NWE5NzhkZDEz
NGM0ZDZlYWVlYmNmZjIwIDEwMDc1NQotLS0gYS9MYXlvdXRUZXN0cy9DaGFuZ2VMb2cKKysrIGIv
TGF5b3V0VGVzdHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTYgQEAKKzIwMTEtMTAtMjQgIFJhZmFl
bCBXZWluc3RlaW4gIDxyYWZhZWx3QGNocm9taXVtLm9yZz4KKworICAgICAgICBbTXV0YXRpb25P
YnNlcnZlcnNdIEltcGxlbWVudCBzdWJ0cmVlIG9ic2VydmF0aW9uIG9mIHRyYW5zaWVudGx5IGRp
c2Nvbm5lY3RlZCBub2RlcworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1
Zy5jZ2k/aWQ9NzA3ODgKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKwor
ICAgICAgICBBZGRlZCB0ZXN0cyB3aGljaCBhc3NlcnQgdGhhdCBub2RlcyBjYW4gYmUgZGV0YWNo
ZWQgZnJvbSBhIHN1YnRyZWUgd2hlcmUgb2JzZXJ2YXRpb24gaXMgcmVnaXN0ZXJlZAorICAgICAg
ICBhbmQgc3RpbGwgYmUgb2JzZXJ2ZWQgLS0gdW50aWwgdGhlIGVuZCBvZiB0aGUgY3VycmVudCAi
bWljcm90YXNrIi4KKworICAgICAgICAqIGZhc3QvbXV0YXRpb24vb2JzZXJ2ZS1zdWJ0cmVlLWV4
cGVjdGVkLnR4dDoKKyAgICAgICAgKiBmYXN0L211dGF0aW9uL29ic2VydmUtc3VidHJlZS5odG1s
OgorCiAyMDExLTEwLTI3ICBEYW4gQmVybnN0ZWluICA8bWl0ekBhcHBsZS5jb20+CiAKICAgICAg
ICAgPHJkYXI6Ly9wcm9ibGVtLzEwMjYyMjA1PiBBbGxvdyBjb2x1bW4gcHJvZ3Jlc3Npb24gdG8g
YmUgaW5kZXBlbmRlbnQgb2Ygd3JpdGluZyBtb2RlCmRpZmYgLS1naXQgYS9MYXlvdXRUZXN0cy9m
YXN0L211dGF0aW9uL29ic2VydmUtc3VidHJlZS1leHBlY3RlZC50eHQgYi9MYXlvdXRUZXN0cy9m
YXN0L211dGF0aW9uL29ic2VydmUtc3VidHJlZS1leHBlY3RlZC50eHQKaW5kZXggNTUyN2ViMWFj
MzBlMDI0MTI0N2RkMWE5MTI3MzA3M2ViNDZlYTNhZi4uYjg5NGRjZGExYjNmNmQyZDM0OWJkN2M0
YTlhNGNkMDY5YTRlNjllZCAxMDA2NDQKLS0tIGEvTGF5b3V0VGVzdHMvZmFzdC9tdXRhdGlvbi9v
YnNlcnZlLXN1YnRyZWUtZXhwZWN0ZWQudHh0CisrKyBiL0xheW91dFRlc3RzL2Zhc3QvbXV0YXRp
b24vb2JzZXJ2ZS1zdWJ0cmVlLWV4cGVjdGVkLnR4dApAQCAtMzMsNiArMzMsNDggQEAgUEFTUyBt
dXRhdGlvbnNbMF0udGFyZ2V0IGlzIHN1YkRpdgogUEFTUyBtdXRhdGlvbnNbMF0uYXR0cmlidXRl
TmFtZSBpcyAiZm9vIgogUEFTUyBtdXRhdGlvbnNbMF0uYXR0cmlidXRlTmFtZXNwYWNlIGlzIG51
bGwKIAorVGVzdGluZyB0aGF0IHRyYW5zaWVudGx5IGRldGFjaGVkIG5vZGVzIGFyZSBzdGlsbCBv
YnNlcnZlZCB2aWEgc3VidHJlZS4KKy4uLmJvdGggY2hhbmdlcyBzaG91bGQgYmUgcmVjZWl2ZWQu
IENoYW5nZSBkZXRhY2hlZCBzdWJEaXYgYWdhaW4uCitQQVNTIG11dGF0aW9ucy5sZW5ndGggaXMg
MgorUEFTUyBtdXRhdGlvbnNbMF0udHlwZSBpcyAiYXR0cmlidXRlcyIKK1BBU1MgbXV0YXRpb25z
WzBdLnRhcmdldCBpcyBzdWJEaXYKK1BBU1MgbXV0YXRpb25zWzBdLmF0dHJpYnV0ZU5hbWUgaXMg
ImZvbyIKK1BBU1MgbXV0YXRpb25zWzFdLnR5cGUgaXMgImF0dHJpYnV0ZXMiCitQQVNTIG11dGF0
aW9uc1sxXS50YXJnZXQgaXMgc3ViRGl2CitQQVNTIG11dGF0aW9uc1sxXS5hdHRyaWJ1dGVOYW1l
IGlzICJ0ZXN0IgorLi4udHJhbnNpZW50IHN1YnRyZWUgb2JzZXJ2YXRpb24gd2FzIHN0b3BwZWQg
YWZ0ZXIgZGVsaXZlcnksIHNvIHN1YkRpdiBjaGFuZ2Ugc2hvdWxkIG5vdCBiZSByZWNlaXZlZC4g
UmVhdHRhY2ggYW5kIGNoYW5nZSBhZ2Fpbi4KK1BBU1MgbXV0YXRpb25zIGlzIG51bGwKKy4uLnJl
YXR0YWNoZWQgc3VidHJlZSBzaG91bGQgbm93IGJlIG9ic2VydmFibGUuIFRyeSBkZXRhY2hpbmcg
YW5kIHJlLW9ic2VydmluZy4KK1BBU1MgbXV0YXRpb25zLmxlbmd0aCBpcyAxCitQQVNTIG11dGF0
aW9uc1swXS50eXBlIGlzICJhdHRyaWJ1dGVzIgorUEFTUyBtdXRhdGlvbnNbMF0udGFyZ2V0IGlz
IHN1YkRpdgorUEFTUyBtdXRhdGlvbnNbMF0uYXR0cmlidXRlTmFtZSBpcyAiZm9vIgorLi4uVGhl
IGNoYW5nZSBtYWRlIGJlZm9yZSByZS1vYnNlcnZpbmcgc2hvdWxkIGJlIHJlY2VpdmVkLCBidXQg
bm90IHRoZSBvbmUgYWZ0ZXIuCitQQVNTIG11dGF0aW9ucy5sZW5ndGggaXMgMQorUEFTUyBtdXRh
dGlvbnNbMF0udHlwZSBpcyAiY2hhcmFjdGVyRGF0YSIKK1BBU1MgbXV0YXRpb25zWzBdLnRhcmdl
dCBpcyBzdWJEaXYuZmlyc3RDaGlsZAorCitUZXN0aW5nIGNvcnJlY3QgYmVoYXZpb3Igb2YgdHJh
bnNpZW50IG9ic2VydmF0aW9uIHdpdGggY29tcGxleCBtb3ZlbWVudCAuCisuLi5BbGwgY2hhbmdl
cyBzaG91bGQgYmUgcmVjZWl2ZWQgZXhjZXB0IGZvciBzZXR0aW5nIHRoZSAiZCIgYXR0cmlidXRl
IG9uIHN1YkRpdjMgYmVmb3JlIGl0IHdhcyByZWFjaGFibGUgZnJvbSBkaXYuCitQQVNTIG11dGF0
aW9ucy5sZW5ndGggaXMgNgorUEFTUyBtdXRhdGlvbnNbMF0udHlwZSBpcyAiYXR0cmlidXRlcyIK
K1BBU1MgbXV0YXRpb25zWzBdLnRhcmdldCBpcyBzdWJEaXYKK1BBU1MgbXV0YXRpb25zWzBdLmF0
dHJpYnV0ZU5hbWUgaXMgImEiCitQQVNTIG11dGF0aW9uc1sxXS50eXBlIGlzICJhdHRyaWJ1dGVz
IgorUEFTUyBtdXRhdGlvbnNbMV0udGFyZ2V0IGlzIHN1YkRpdjIKK1BBU1MgbXV0YXRpb25zWzFd
LmF0dHJpYnV0ZU5hbWUgaXMgImIiCitQQVNTIG11dGF0aW9uc1syXS50eXBlIGlzICJjaGFyYWN0
ZXJEYXRhIgorUEFTUyBtdXRhdGlvbnNbMl0udGFyZ2V0IGlzIHRleHQKK1BBU1MgbXV0YXRpb25z
WzNdLnR5cGUgaXMgImF0dHJpYnV0ZXMiCitQQVNTIG11dGF0aW9uc1szXS50YXJnZXQgaXMgc3Vi
RGl2MgorUEFTUyBtdXRhdGlvbnNbM10uYXR0cmlidXRlTmFtZSBpcyAiZSIKK1BBU1MgbXV0YXRp
b25zWzRdLnR5cGUgaXMgImF0dHJpYnV0ZXMiCitQQVNTIG11dGF0aW9uc1s0XS50YXJnZXQgaXMg
c3ViRGl2MworUEFTUyBtdXRhdGlvbnNbNF0uYXR0cmlidXRlTmFtZSBpcyAiZiIKK1BBU1MgbXV0
YXRpb25zWzVdLnR5cGUgaXMgImF0dHJpYnV0ZXMiCitQQVNTIG11dGF0aW9uc1s1XS50YXJnZXQg
aXMgc3ViRGl2MgorUEFTUyBtdXRhdGlvbnNbNV0uYXR0cmlidXRlTmFtZSBpcyAiZyIKKwogUEFT
UyBzdWNjZXNzZnVsbHlQYXJzZWQgaXMgdHJ1ZQogCiBURVNUIENPTVBMRVRFCmRpZmYgLS1naXQg
YS9MYXlvdXRUZXN0cy9mYXN0L211dGF0aW9uL29ic2VydmUtc3VidHJlZS5odG1sIGIvTGF5b3V0
VGVzdHMvZmFzdC9tdXRhdGlvbi9vYnNlcnZlLXN1YnRyZWUuaHRtbAppbmRleCBiNTJhMjgzOWIx
MTUzZjQ3YjFlZThjMTM2OGU5MDc4NDIzMTk4NWMyLi4zZjIxZDMzM2E1N2NlYjM2OGUwMDE2NTk3
Nzg4NDA1OThjNjU3YTc4IDEwMDY0NAotLS0gYS9MYXlvdXRUZXN0cy9mYXN0L211dGF0aW9uL29i
c2VydmUtc3VidHJlZS5odG1sCisrKyBiL0xheW91dFRlc3RzL2Zhc3QvbXV0YXRpb24vb2JzZXJ2
ZS1zdWJ0cmVlLmh0bWwKQEAgLTE1LDcgKzE1LDcgQEAgd2luZG93LmpzVGVzdElzQXN5bmMgPSB0
cnVlOwogdmFyIG11dGF0aW9uczsKIHZhciBtdXRhdGlvbnMyOwogdmFyIGRpdjsKLXZhciBzdWJE
aXY7Cit2YXIgc3ViRGl2LCBzdWJEaXYyLCBzdWJEaXYzLCB0ZXh0OwogdmFyIGNhbGxzOwogCiBm
dW5jdGlvbiB0ZXN0QmFzaWMoKSB7CkBAIC0xMzUsNyArMTM1LDE1OSBAQCBmdW5jdGlvbiB0ZXN0
TXVsdGlwbGVPYnNlcnZhdGlvbnMoKSB7CiAKICAgICBzdGFydCgpOwogfQotdmFyIHRlc3RzID0g
W3Rlc3RCYXNpYywgdGVzdE11bHRpcGxlT2JzZXJ2ZXJzLCB0ZXN0TXVsdGlwbGVPYnNlcnZhdGlv
bnNdOworCitmdW5jdGlvbiB0ZXN0VHJhbnNpZW50RGV0YWNoZWRCYXNpYygpIHsKKyAgICB2YXIg
b2JzZXJ2ZXI7CisKKyAgICBmdW5jdGlvbiBzdGFydCgpIHsKKyAgICAgICAgZGVidWcoJ1Rlc3Rp
bmcgdGhhdCB0cmFuc2llbnRseSBkZXRhY2hlZCBub2RlcyBhcmUgc3RpbGwgb2JzZXJ2ZWQgdmlh
IHN1YnRyZWUuJyk7CisKKyAgICAgICAgbXV0YXRpb25zID0gbnVsbDsKKyAgICAgICAgZGl2ID0g
ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CisgICAgICAgIHN1YkRpdiA9IGRpdi5hcHBl
bmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSk7CisgICAgICAgIHN1YkRpdi5p
bm5lckhUTUwgPSAnaGVsbG8sIHdvcmxkJzsKKyAgICAgICAgb2JzZXJ2ZXIgPSBuZXcgV2ViS2l0
TXV0YXRpb25PYnNlcnZlcihmdW5jdGlvbihtdXRhdGlvbnMpIHsKKyAgICAgICAgICAgIHdpbmRv
dy5tdXRhdGlvbnMgPSBtdXRhdGlvbnM7CisgICAgICAgIH0pOworCisgICAgICAgIG9ic2VydmVy
Lm9ic2VydmUoZGl2LCB7YXR0cmlidXRlczogdHJ1ZSwgY2hhcmFjdGVyRGF0YTogdHJ1ZSwgc3Vi
dHJlZTogdHJ1ZX0pOworICAgICAgICBzdWJEaXYuc2V0QXR0cmlidXRlKCdmb28nLCAnYmFyJyk7
CisgICAgICAgIGRpdi5yZW1vdmVDaGlsZChzdWJEaXYpOworICAgICAgICBzdWJEaXYuc2V0QXR0
cmlidXRlKCd0ZXN0JywgJ3Rlc3QnKTsKKyAgICAgICAgc2V0VGltZW91dChjaGVja0RlbGl2ZXJl
ZEFuZENoYW5nZUFnYWluLCAwKTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiBjaGVja0RlbGl2ZXJl
ZEFuZENoYW5nZUFnYWluKCkgeworICAgICAgICBkZWJ1ZygnLi4uYm90aCBjaGFuZ2VzIHNob3Vs
ZCBiZSByZWNlaXZlZC4gQ2hhbmdlIGRldGFjaGVkIHN1YkRpdiBhZ2Fpbi4nKTsKKworICAgICAg
ICBzaG91bGRCZSgnbXV0YXRpb25zLmxlbmd0aCcsICcyJyk7CisgICAgICAgIHNob3VsZEJlKCdt
dXRhdGlvbnNbMF0udHlwZScsICciYXR0cmlidXRlcyInKTsKKyAgICAgICAgc2hvdWxkQmUoJ211
dGF0aW9uc1swXS50YXJnZXQnLCAnc3ViRGl2Jyk7CisgICAgICAgIHNob3VsZEJlKCdtdXRhdGlv
bnNbMF0uYXR0cmlidXRlTmFtZScsICciZm9vIicpOworICAgICAgICBzaG91bGRCZSgnbXV0YXRp
b25zWzFdLnR5cGUnLCAnImF0dHJpYnV0ZXMiJyk7CisgICAgICAgIHNob3VsZEJlKCdtdXRhdGlv
bnNbMV0udGFyZ2V0JywgJ3N1YkRpdicpOworICAgICAgICBzaG91bGRCZSgnbXV0YXRpb25zWzFd
LmF0dHJpYnV0ZU5hbWUnLCAnInRlc3QiJyk7CisKKyAgICAgICAgbXV0YXRpb25zID0gbnVsbDsK
KyAgICAgICAgc3ViRGl2LnNldEF0dHJpYnV0ZSgnZm9vJywgJ2JheicpOworCisgICAgICAgIHNl
dFRpbWVvdXQoY2hlY2tOb3REZWxpdmVyZWRBbmRSZWF0dGFjaCk7CisgICAgfQorCisgICAgZnVu
Y3Rpb24gY2hlY2tOb3REZWxpdmVyZWRBbmRSZWF0dGFjaCgpIHsKKyAgICAgICAgZGVidWcoJy4u
LnRyYW5zaWVudCBzdWJ0cmVlIG9ic2VydmF0aW9uIHdhcyBzdG9wcGVkIGFmdGVyIGRlbGl2ZXJ5
LCBzbyBzdWJEaXYgY2hhbmdlIHNob3VsZCBub3QgYmUgcmVjZWl2ZWQuIFJlYXR0YWNoIGFuZCBj
aGFuZ2UgYWdhaW4uJyk7CisKKyAgICAgICAgc2hvdWxkQmUoJ211dGF0aW9ucycsICdudWxsJyk7
CisKKyAgICAgICAgbXV0YXRpb25zID0gbnVsbAorICAgICAgICBkaXYuYXBwZW5kQ2hpbGQoc3Vi
RGl2KTsKKyAgICAgICAgc3ViRGl2LnNldEF0dHJpYnV0ZSgnZm9vJywgJ2JhdCcpOworCisgICAg
ICAgIHNldFRpbWVvdXQoY2hlY2tEZWxpdmVyZWRBbmRSZW9ic2VydmUpOworICAgIH0KKworICAg
IGZ1bmN0aW9uIGNoZWNrRGVsaXZlcmVkQW5kUmVvYnNlcnZlKCkgeworICAgICAgICBkZWJ1Zygn
Li4ucmVhdHRhY2hlZCBzdWJ0cmVlIHNob3VsZCBub3cgYmUgb2JzZXJ2YWJsZS4gVHJ5IGRldGFj
aGluZyBhbmQgcmUtb2JzZXJ2aW5nLicpOworCisgICAgICAgIHNob3VsZEJlKCdtdXRhdGlvbnMu
bGVuZ3RoJywgJzEnKTsKKyAgICAgICAgc2hvdWxkQmUoJ211dGF0aW9uc1swXS50eXBlJywgJyJh
dHRyaWJ1dGVzIicpOworICAgICAgICBzaG91bGRCZSgnbXV0YXRpb25zWzBdLnRhcmdldCcsICdz
dWJEaXYnKTsKKyAgICAgICAgc2hvdWxkQmUoJ211dGF0aW9uc1swXS5hdHRyaWJ1dGVOYW1lJywg
JyJmb28iJyk7CisKKyAgICAgICAgbXV0YXRpb25zID0gbnVsbDsKKyAgICAgICAgZGl2LnJlbW92
ZUNoaWxkKHN1YkRpdik7CisgICAgICAgIHN1YkRpdi5maXJzdENoaWxkLnRleHRDb250ZW50ID0g
J2JhZGJ5ZSc7CisgICAgICAgIG9ic2VydmVyLm9ic2VydmUoZGl2LCB7YXR0cmlidXRlczogdHJ1
ZSwgY2hhcmFjdGVyRGF0YTogdHJ1ZSwgc3VidHJlZTogdHJ1ZX0pOworICAgICAgICBzdWJEaXYu
c2V0QXR0cmlidXRlKCdmb28nLCAnYm9vJyk7CisKKyAgICAgICAgc2V0VGltZW91dChmaW5pc2gp
OworICAgIH0KKworCisgICAgZnVuY3Rpb24gZmluaXNoKCkgeworICAgICAgICBkZWJ1ZygnLi4u
VGhlIGNoYW5nZSBtYWRlIGJlZm9yZSByZS1vYnNlcnZpbmcgc2hvdWxkIGJlIHJlY2VpdmVkLCBi
dXQgbm90IHRoZSBvbmUgYWZ0ZXIuJyk7CisKKyAgICAgICAgc2hvdWxkQmUoJ211dGF0aW9ucy5s
ZW5ndGgnLCAnMScpOworICAgICAgICBzaG91bGRCZSgnbXV0YXRpb25zWzBdLnR5cGUnLCAnImNo
YXJhY3RlckRhdGEiJyk7CisgICAgICAgIHNob3VsZEJlKCdtdXRhdGlvbnNbMF0udGFyZ2V0Jywg
J3N1YkRpdi5maXJzdENoaWxkJyk7CisKKyAgICAgICAgb2JzZXJ2ZXIuZGlzY29ubmVjdCgpOwor
ICAgICAgICBkZWJ1ZygnJyk7CisgICAgICAgIHJ1bk5leHRUZXN0KCk7CisgICAgfQorICAgIHN0
YXJ0KCk7Cit9CisKK2Z1bmN0aW9uIHRlc3RUcmFuc2llbnREZXRhY2hlZERldGFpbGVkKCkgewor
ICAgIHZhciBvYnNlcnZlcjsKKworICAgIGZ1bmN0aW9uIHN0YXJ0KCkgeworICAgICAgICBkZWJ1
ZygnVGVzdGluZyBjb3JyZWN0IGJlaGF2aW9yIG9mIHRyYW5zaWVudCBvYnNlcnZhdGlvbiB3aXRo
IGNvbXBsZXggbW92ZW1lbnQgLicpOworCisgICAgICAgIG11dGF0aW9ucyA9IG51bGw7CisgICAg
ICAgIGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOworICAgICAgICBzdWJEaXYg
PSBkaXYuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykpOworICAgICAg
ICBzdWJEaXYyID0gc3ViRGl2LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2Rp
dicpKTsKKyAgICAgICAgc3ViRGl2Mi5pbm5lckhUTUwgPSAnaGVsbG8sIHdvcmxkJzsKKyAgICAg
ICAgc3ViRGl2MyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOworCisgICAgICAgIG9i
c2VydmVyID0gbmV3IFdlYktpdE11dGF0aW9uT2JzZXJ2ZXIoZnVuY3Rpb24obXV0YXRpb25zKSB7
CisgICAgICAgICAgICB3aW5kb3cubXV0YXRpb25zID0gbXV0YXRpb25zOworICAgICAgICB9KTsK
KworICAgICAgICBvYnNlcnZlci5vYnNlcnZlKGRpdiwge2F0dHJpYnV0ZXM6IHRydWUsIGNoYXJh
Y3RlckRhdGE6IHRydWUsIHN1YnRyZWU6IHRydWV9KTsKKyAgICAgICAgZGl2LnJlbW92ZUNoaWxk
KHN1YkRpdik7CisgICAgICAgIHN1YkRpdi5yZW1vdmVDaGlsZChzdWJEaXYyKTsKKyAgICAgICAg
dGV4dCA9IHN1YkRpdjIucmVtb3ZlQ2hpbGQoc3ViRGl2Mi5maXJzdENoaWxkKTsKKworICAgICAg
ICBzdWJEaXYuc2V0QXR0cmlidXRlKCdhJywgJ2EnKTsKKyAgICAgICAgc3ViRGl2Mi5zZXRBdHRy
aWJ1dGUoJ2InLCAnYicpOworICAgICAgICB0ZXh0LnRleHRDb250ZW50ID0gJ2MnOworICAgICAg
ICBzdWJEaXYzLmFwcGVuZENoaWxkKHN1YkRpdjIpOworICAgICAgICBzdWJEaXYzLnNldEF0dHJp
YnV0ZSgnZCcsICdkJyk7CisgICAgICAgIHN1YkRpdjIuc2V0QXR0cmlidXRlKCdlJywgJ2UnKTsK
KyAgICAgICAgZGl2LmFwcGVuZENoaWxkKHN1YkRpdjMpOworICAgICAgICBzdWJEaXYzLnNldEF0
dHJpYnV0ZSgnZicsICdmJyk7CisgICAgICAgIHN1YkRpdjIuc2V0QXR0cmlidXRlKCdnJywgJ2cn
KTsKKworICAgICAgICBzZXRUaW1lb3V0KGZpbmlzaCwgMCk7CisgICAgfQorCisgICAgZnVuY3Rp
b24gZmluaXNoKCkgeworICAgICAgICBkZWJ1ZygnLi4uQWxsIGNoYW5nZXMgc2hvdWxkIGJlIHJl
Y2VpdmVkIGV4Y2VwdCBmb3Igc2V0dGluZyB0aGUgImQiIGF0dHJpYnV0ZSBvbiBzdWJEaXYzIGJl
Zm9yZSBpdCB3YXMgcmVhY2hhYmxlIGZyb20gZGl2LicpOworCisgICAgICAgIHNob3VsZEJlKCdt
dXRhdGlvbnMubGVuZ3RoJywgJzYnKTsKKyAgICAgICAgc2hvdWxkQmUoJ211dGF0aW9uc1swXS50
eXBlJywgJyJhdHRyaWJ1dGVzIicpOworICAgICAgICBzaG91bGRCZSgnbXV0YXRpb25zWzBdLnRh
cmdldCcsICdzdWJEaXYnKTsKKyAgICAgICAgc2hvdWxkQmUoJ211dGF0aW9uc1swXS5hdHRyaWJ1
dGVOYW1lJywgJyJhIicpOworCisgICAgICAgIHNob3VsZEJlKCdtdXRhdGlvbnNbMV0udHlwZScs
ICciYXR0cmlidXRlcyInKTsKKyAgICAgICAgc2hvdWxkQmUoJ211dGF0aW9uc1sxXS50YXJnZXQn
LCAnc3ViRGl2MicpOworICAgICAgICBzaG91bGRCZSgnbXV0YXRpb25zWzFdLmF0dHJpYnV0ZU5h
bWUnLCAnImIiJyk7CisKKyAgICAgICAgc2hvdWxkQmUoJ211dGF0aW9uc1syXS50eXBlJywgJyJj
aGFyYWN0ZXJEYXRhIicpOworICAgICAgICBzaG91bGRCZSgnbXV0YXRpb25zWzJdLnRhcmdldCcs
ICd0ZXh0Jyk7CisKKyAgICAgICAgc2hvdWxkQmUoJ211dGF0aW9uc1szXS50eXBlJywgJyJhdHRy
aWJ1dGVzIicpOworICAgICAgICBzaG91bGRCZSgnbXV0YXRpb25zWzNdLnRhcmdldCcsICdzdWJE
aXYyJyk7CisgICAgICAgIHNob3VsZEJlKCdtdXRhdGlvbnNbM10uYXR0cmlidXRlTmFtZScsICci
ZSInKTsKKworICAgICAgICBzaG91bGRCZSgnbXV0YXRpb25zWzRdLnR5cGUnLCAnImF0dHJpYnV0
ZXMiJyk7CisgICAgICAgIHNob3VsZEJlKCdtdXRhdGlvbnNbNF0udGFyZ2V0JywgJ3N1YkRpdjMn
KTsKKyAgICAgICAgc2hvdWxkQmUoJ211dGF0aW9uc1s0XS5hdHRyaWJ1dGVOYW1lJywgJyJmIicp
OworCisgICAgICAgIHNob3VsZEJlKCdtdXRhdGlvbnNbNV0udHlwZScsICciYXR0cmlidXRlcyIn
KTsKKyAgICAgICAgc2hvdWxkQmUoJ211dGF0aW9uc1s1XS50YXJnZXQnLCAnc3ViRGl2MicpOwor
ICAgICAgICBzaG91bGRCZSgnbXV0YXRpb25zWzVdLmF0dHJpYnV0ZU5hbWUnLCAnImciJyk7CisK
KyAgICAgICAgb2JzZXJ2ZXIuZGlzY29ubmVjdCgpOworICAgICAgICBkZWJ1ZygnJyk7CisgICAg
ICAgIHJ1bk5leHRUZXN0KCk7CisgICAgfQorICAgIHN0YXJ0KCk7Cit9CisKK3ZhciB0ZXN0cyA9
IFt0ZXN0QmFzaWMsIHRlc3RNdWx0aXBsZU9ic2VydmVycywgdGVzdE11bHRpcGxlT2JzZXJ2YXRp
b25zLCB0ZXN0VHJhbnNpZW50RGV0YWNoZWRCYXNpYywgdGVzdFRyYW5zaWVudERldGFjaGVkRGV0
YWlsZWRdOwogdmFyIHRlc3RJbmRleCA9IDA7CiAKIGZ1bmN0aW9uIHJ1bk5leHRUZXN0KCkgewo=
</data>

          </attachment>
      

    </bug>

</bugzilla>