<?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>34721</bug_id>
          
          <creation_ts>2010-02-08 13:09:27 -0800</creation_ts>
          <short_desc>[Chromium] Refactor AutocompletePopupMenuClient into a base class, SuggestionsPopupMenuClient, and two derived classes, AutocompletePopupMenuClient and AutoFillPopupMenuClient</short_desc>
          <delta_ts>2010-02-10 01:28:32 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>WebKit API</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>PC</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>0</everconfirmed>
          <reporter name="James Hawkins">jhawkins</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>commit-queue</cc>
    
    <cc>fishd</cc>
    
    <cc>tony</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>188742</commentid>
    <comment_count>0</comment_count>
    <who name="James Hawkins">jhawkins</who>
    <bug_when>2010-02-08 13:09:27 -0800</bug_when>
    <thetext>The Chromium AutoFill implementation needs to override the behavior of the suggestions popup.  This initial version just appends the profile label to the suggestion, but eventually we&apos;ll change this to add a right-justified, gray label.  Attachment will follow.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>188743</commentid>
    <comment_count>1</comment_count>
      <attachid>48358</attachid>
    <who name="James Hawkins">jhawkins</who>
    <bug_when>2010-02-08 13:11:44 -0800</bug_when>
    <thetext>Created attachment 48358
[Chromium] Refactor AutocompletePopupMenuClient</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>188744</commentid>
    <comment_count>2</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-02-08 13:12:42 -0800</bug_when>
    <thetext>Attachment 48358 did not pass style-queue:

Failed to run &quot;WebKitTools/Scripts/check-webkit-style&quot; exit_code: 1
WebKit/chromium/src/WebViewImpl.cpp:35:  Alphabetical sorting problem.  [build/include_order] [4]
WebKit/chromium/src/WebViewImpl.cpp:1596:  One line control clauses should not use braces.  [whitespace/braces] [4]
WebKit/chromium/src/SuggestionsPopupMenuClient.h:116:  One space before end of line comments  [whitespace/comments] [5]
WebKit/chromium/src/SuggestionsPopupMenuClient.cpp:48:  Use 0 instead of NULL.  [readability/null] [5]
WebKit/chromium/src/SuggestionsPopupMenuClient.cpp:241:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
WebKit/chromium/src/SuggestionsPopupMenuClient.cpp:242:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
WebKit/chromium/src/AutoFillPopupMenuClient.cpp:57:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
Total errors found: 7


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>188746</commentid>
    <comment_count>3</comment_count>
      <attachid>48359</attachid>
    <who name="James Hawkins">jhawkins</who>
    <bug_when>2010-02-08 13:19:01 -0800</bug_when>
    <thetext>Created attachment 48359
[Chromium] Refactor AutocompletePopupMenuClient [try2]

Style fixes.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>188764</commentid>
    <comment_count>4</comment_count>
      <attachid>48359</attachid>
    <who name="Darin Fisher (:fishd, Google)">fishd</who>
    <bug_when>2010-02-08 14:33:40 -0800</bug_when>
    <thetext>Comment on attachment 48359
[Chromium] Refactor AutocompletePopupMenuClient [try2]

&gt; Index: WebKit/chromium/ChangeLog
...
&gt; +        * src/AutoFillPopupMenuClient.cpp: Added.
&gt; +        (WebKit::AutoFillPopupMenuClient::AutoFillPopupMenuClient):
&gt; +        (WebKit::AutoFillPopupMenuClient::~AutoFillPopupMenuClient):
&gt; +        (WebKit::AutoFillPopupMenuClient::getSuggestionsSize):
&gt; +        (WebKit::AutoFillPopupMenuClient::getSuggestion):
&gt; +        (WebKit::AutoFillPopupMenuClient::removeSuggestionAtIndex):
&gt; +        (WebKit::selectionChanged):
&gt; +        (WebKit::AutoFillPopupMenuClient::initialize):
&gt; +        (WebKit::AutoFillPopupMenuClient::setSuggestions):

^^^ nit: when adding a new file, it is considered good form to hand edit
the ChangeLog to remove the list of functions being added.


&gt; Index: WebKit/chromium/public/WebView.h
&gt; ===================================================================
&gt; --- WebKit/chromium/public/WebView.h	(revision 54501)
&gt; +++ WebKit/chromium/public/WebView.h	(working copy)
&gt; @@ -225,12 +225,27 @@ public:
&gt;  
&gt;      // Autofill ------------------------------------------------------------

^^^ Autofill / autocomplete


&gt; Index: WebKit/chromium/src/AutoFillPopupMenuClient.cpp
...
&gt; +WebString AutoFillPopupMenuClient::getSuggestion(unsigned listIndex) const
&gt; +{
&gt; +    // TODO(jhawkins): Modify the PopupMenu to add the label in gray

nit: TODO(jhawkins) -&gt; FIXME


&gt; +    // right-justified.
&gt; +    ASSERT(listIndex &gt;= 0 &amp;&amp; listIndex &lt; m_names.size());
&gt; +    return m_names[listIndex] + WebString(&quot; (&quot;) + m_labels[listIndex] + WebString(&quot;)&quot;);

^^^ Please use String instead of WebString here.  Otherwise, code is being
wastefully generated to convert the WebString to a String in order to perform
the concatenation.


&gt; +void AutoFillPopupMenuClient::removeSuggestionAtIndex(unsigned listIndex)
&gt; +{
&gt; +    // TODO(jhawkins): Do we want to remove AutoFill suggestions?

same nit about TODO


&gt; Index: WebKit/chromium/src/AutoFillPopupMenuClient.h
...
&gt; +// 

^^^ errant comment, or did you intend to write something about this class?

&gt; +class AutoFillPopupMenuClient : public SuggestionsPopupMenuClient {
&gt; +public:
&gt; +    AutoFillPopupMenuClient(WebViewImpl* webView);

nit: please leave off the parameter name when it is just a variation
on the type name.  i.e., if it doesn&apos;t add any information, then just
leave it off.


&gt; Index: WebKit/chromium/src/AutocompletePopupMenuClient.h

&gt; +    // SuggestionsPopupMenuClient implementation:
&gt; +    virtual size_t getSuggestionsSize() const;
&gt; +    virtual WebString getSuggestion(unsigned listIndex) const;
&gt; +    virtual void removeSuggestionAtIndex(unsigned listIndex);
&gt;  
&gt;      void initialize(WebCore::HTMLInputElement*,
&gt;                      const WebVector&lt;WebString&gt;&amp; suggestions,
&gt;                      int defaultSuggestionIndex);
&gt;  
&gt; -    WebCore::HTMLInputElement* textField() const { return m_textField.get(); }
&gt; -
&gt;      void setSuggestions(const WebVector&lt;WebString&gt;&amp;);
&gt; -    void removeItemAtIndex(int index);
&gt; -
&gt; -    // WebCore::PopupMenuClient methods:
&gt; -    virtual void valueChanged(unsigned listIndex, bool fireEvents = true);
&gt; -    virtual WebCore::String itemText(unsigned listIndex) const;
&gt; -    virtual WebCore::String itemToolTip(unsigned lastIndex) const { return WebCore::String(); }
&gt; -    virtual bool itemIsEnabled(unsigned listIndex) const { return true; }
&gt; -    virtual WebCore::PopupMenuStyle itemStyle(unsigned listIndex) const;
&gt; -    virtual WebCore::PopupMenuStyle menuStyle() const;
&gt; -    virtual int clientInsetLeft() const { return 0; }
&gt; -    virtual int clientInsetRight() const { return 0; }
&gt; -    virtual int clientPaddingLeft() const;
&gt; -    virtual int clientPaddingRight() const;
&gt; -    virtual int listSize() const { return m_suggestions.size(); }
&gt; -    virtual int selectedIndex() const { return m_selectedIndex; }
&gt; -    virtual void popupDidHide();
&gt; -    virtual bool itemIsSeparator(unsigned listIndex) const { return false; }
&gt; -    virtual bool itemIsLabel(unsigned listIndex) const { return false; }
&gt; -    virtual bool itemIsSelected(unsigned listIndex) const { return false; }
&gt; -    virtual bool shouldPopOver() const { return false; }
&gt; -    virtual bool valueShouldChangeOnHotTrack() const { return false; }
&gt; -    virtual void setTextFromItem(unsigned listIndex);
&gt; -    virtual WebCore::FontSelector* fontSelector() const;
&gt; -    virtual WebCore::HostWindow* hostWindow() const;
&gt; -    virtual PassRefPtr&lt;WebCore::Scrollbar&gt; createScrollbar(
&gt; -        WebCore::ScrollbarClient* client,
&gt; -        WebCore::ScrollbarOrientation orientation,
&gt; -        WebCore::ScrollbarControlSize size);
&gt;  
&gt;  private:
&gt; -    WebCore::RenderStyle* textFieldStyle() const;
&gt; -
&gt; -    RefPtr&lt;WebCore::HTMLInputElement&gt; m_textField;
&gt;      Vector&lt;WebCore::String&gt; m_suggestions;
&gt; -    int m_selectedIndex;
&gt; -    WebViewImpl* m_webView;
&gt; -    OwnPtr&lt;WebCore::PopupMenuStyle&gt; m_style;
&gt;  };
&gt;  
&gt;  } // namespace WebKit
&gt; +
&gt; +#endif
&gt; Index: WebKit/chromium/src/SuggestionsPopupMenuClient.cpp
&gt; ===================================================================
&gt; --- WebKit/chromium/src/SuggestionsPopupMenuClient.cpp	(revision 0)
&gt; +++ WebKit/chromium/src/SuggestionsPopupMenuClient.cpp	(revision 0)
&gt; @@ -0,0 +1,246 @@
&gt; +/*
&gt; + * Copyright (C) 2010 Google Inc. All rights reserved.
&gt; + *
&gt; + * Redistribution and use in source and binary forms, with or without
&gt; + * modification, are permitted provided that the following conditions are
&gt; + * met:
&gt; + *
&gt; + *     * Redistributions of source code must retain the above copyright
&gt; + * notice, this list of conditions and the following disclaimer.
&gt; + *     * Redistributions in binary form must reproduce the above
&gt; + * copyright notice, this list of conditions and the following disclaimer
&gt; + * in the documentation and/or other materials provided with the
&gt; + * distribution.
&gt; + *     * Neither the name of Google Inc. nor the names of its
&gt; + * contributors may be used to endorse or promote products derived from
&gt; + * this software without specific prior written permission.
&gt; + *
&gt; + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
&gt; + * &quot;AS IS&quot; AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
&gt; + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
&gt; + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
&gt; + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
&gt; + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
&gt; + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
&gt; + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
&gt; + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
&gt; + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
&gt; + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
&gt; + */
&gt; +
&gt; +#include &quot;config.h&quot;
&gt; +#include &quot;SuggestionsPopupMenuClient.h&quot;
&gt; +
&gt; +// TODO(jhawkins): Make sure we need all of these includes.
&gt; +#include &quot;CSSStyleSelector.h&quot;
&gt; +#include &quot;CSSValueKeywords.h&quot;
&gt; +#include &quot;FrameView.h&quot;
&gt; +#include &quot;HTMLInputElement.h&quot;
&gt; +#include &quot;RenderTheme.h&quot;
&gt; +#include &quot;WebVector.h&quot;
&gt; +#include &quot;WebViewImpl.h&quot;
&gt; +
&gt; +using namespace WebCore;
&gt; +
&gt; +namespace WebKit {
&gt; +
&gt; +SuggestionsPopupMenuClient::SuggestionsPopupMenuClient(WebViewImpl* webView)
&gt; +    : m_textField(0)
&gt; +    , m_selectedIndex(0)
&gt; +    , m_webView(webView)
&gt; +{
&gt; +}
&gt; +
&gt; +SuggestionsPopupMenuClient::~SuggestionsPopupMenuClient()
&gt; +{
&gt; +}
&gt; +
&gt; +// TODO(jhawkins): Implement this per child class?
&gt; +void SuggestionsPopupMenuClient::valueChanged(unsigned listIndex, bool fireEvents)
&gt; +{
&gt; +    m_textField-&gt;setValue(getSuggestion(listIndex));
&gt; +
&gt; +    EditorClientImpl* editor =
&gt; +        static_cast&lt;EditorClientImpl*&gt;(m_webView-&gt;page()-&gt;editorClient());
&gt; +    ASSERT(editor);
&gt; +    editor-&gt;onAutofillSuggestionAccepted(
&gt; +        static_cast&lt;HTMLInputElement*&gt;(m_textField.get()));
&gt; +}
&gt; +
&gt; +void SuggestionsPopupMenuClient::selectionChanged(unsigned listIndex, bool fireEvents)
&gt; +{
&gt; +    printf(&quot;selectionChanged\n&quot;);
&gt; +    if (listIndex != static_cast&lt;unsigned&gt;(-1)) {
&gt; +        const WebString&amp; suggestion = getSuggestion(listIndex);
&gt; +        setSuggestedValue(suggestion);
&gt; +    } else {
&gt; +      m_textField-&gt;setValue(m_typedFieldValue);
&gt; +      if (m_lastFieldValues-&gt;contains(m_textField-&gt;name()))
&gt; +          m_lastFieldValues-&gt;set(m_textField-&gt;name(), m_typedFieldValue);
&gt; +      else
&gt; +          m_lastFieldValues-&gt;add(m_textField-&gt;name(), m_typedFieldValue);
&gt; +    }
&gt; +}
&gt; +
&gt; +String SuggestionsPopupMenuClient::itemText(unsigned listIndex) const
&gt; +{
&gt; +    return getSuggestion(listIndex);
&gt; +}
&gt; +
&gt; +PopupMenuStyle SuggestionsPopupMenuClient::itemStyle(unsigned listIndex) const
&gt; +{
&gt; +    return *m_style;
&gt; +}
&gt; +
&gt; +PopupMenuStyle SuggestionsPopupMenuClient::menuStyle() const
&gt; +{
&gt; +    return *m_style;
&gt; +}
&gt; +
&gt; +int SuggestionsPopupMenuClient::clientPaddingLeft() const
&gt; +{
&gt; +    // Bug http://crbug.com/7708 seems to indicate the style can be 0.
&gt; +    RenderStyle* style = textFieldStyle();
&gt; +    return style ? m_webView-&gt;theme()-&gt;popupInternalPaddingLeft(style) : 0;
&gt; +}
&gt; +
&gt; +int SuggestionsPopupMenuClient::clientPaddingRight() const
&gt; +{
&gt; +    // Bug http://crbug.com/7708 seems to indicate the style can be 0.
&gt; +    RenderStyle* style = textFieldStyle();
&gt; +    return style ? m_webView-&gt;theme()-&gt;popupInternalPaddingRight(style) : 0;
&gt; +}
&gt; +
&gt; +void SuggestionsPopupMenuClient::popupDidHide()
&gt; +{
&gt; +#if 0
&gt; +    if (acceptSuggestions) {
&gt; +        String suggestedValue = m_textField-&gt;suggestedValue();
&gt; +        if (!suggestedValue.isNull())
&gt; +            m_textField-&gt;setValue(suggestedValue);
&gt; +    } else
&gt; +#endif
&gt; +        m_textField-&gt;setValue(m_typedFieldValue);
&gt; +
&gt; +    resetLastSuggestion();
&gt; +    m_webView-&gt;suggestionsPopupDidHide();
&gt; +}
&gt; +
&gt; +void SuggestionsPopupMenuClient::setTextFromItem(unsigned listIndex)
&gt; +{
&gt; +    m_textField-&gt;setValue(getSuggestion(listIndex));
&gt; +    resetLastSuggestion();
&gt; +}
&gt; +
&gt; +void SuggestionsPopupMenuClient::resetLastSuggestion()
&gt; +{
&gt; +    if (m_lastFieldValues-&gt;contains(m_textField-&gt;name()))
&gt; +        m_lastFieldValues-&gt;set(m_textField-&gt;name(), m_textField-&gt;value());
&gt; +    else
&gt; +        m_lastFieldValues-&gt;add(m_textField-&gt;name(), m_textField-&gt;value());
&gt; +}
&gt; +
&gt; +FontSelector* SuggestionsPopupMenuClient::fontSelector() const
&gt; +{
&gt; +    return m_textField-&gt;document()-&gt;styleSelector()-&gt;fontSelector();
&gt; +}
&gt; +
&gt; +HostWindow* SuggestionsPopupMenuClient::hostWindow() const
&gt; +{
&gt; +    return m_textField-&gt;document()-&gt;view()-&gt;hostWindow();
&gt; +}
&gt; +
&gt; +PassRefPtr&lt;Scrollbar&gt; SuggestionsPopupMenuClient::createScrollbar(
&gt; +    ScrollbarClient* client,
&gt; +    ScrollbarOrientation orientation,
&gt; +    ScrollbarControlSize size)
&gt; +{
&gt; +    return Scrollbar::createNativeScrollbar(client, orientation, size);
&gt; +}
&gt; +
&gt; +RenderStyle* SuggestionsPopupMenuClient::textFieldStyle() const
&gt; +{
&gt; +    RenderStyle* style = m_textField-&gt;computedStyle();
&gt; +    if (!style) {
&gt; +        // It seems we can only have a 0 style in a TextField if the
&gt; +        // node is detached, in which case we the popup shoud not be
&gt; +        // showing.  Please report this in http://crbug.com/7708 and
&gt; +        // include the page you were visiting.
&gt; +        ASSERT_NOT_REACHED();
&gt; +    }
&gt; +    return style;
&gt; +}
&gt; +
&gt; +void SuggestionsPopupMenuClient::initialize(HTMLInputElement* textField,
&gt; +                                            int defaultSuggestionIndex)
&gt; +{
&gt; +    if (!m_lastFieldValues)
&gt; +        m_lastFieldValues.set(new FieldValuesMap);
&gt; +
&gt; +    m_textField = textField;
&gt; +    m_typedFieldValue = textField-&gt;value();
&gt; +    m_selectedIndex = defaultSuggestionIndex;
&gt; +
&gt; +    setInitialSuggestion();
&gt; +
&gt; +    FontDescription fontDescription;
&gt; +    m_webView-&gt;theme()-&gt;systemFont(CSSValueWebkitControl, fontDescription);
&gt; +    // Use a smaller font size to match IE/Firefox.
&gt; +    // FIXME: http://crbug.com/7376 use the system size instead of a
&gt; +    //        fixed font size value.
&gt; +    fontDescription.setComputedSize(12.0);
&gt; +    Font font(fontDescription, 0, 0);
&gt; +    font.update(textField-&gt;document()-&gt;styleSelector()-&gt;fontSelector());
&gt; +    // The direction of text in popup menu is set the same as the direction of
&gt; +    // the input element: textField.
&gt; +    m_style.set(new PopupMenuStyle(Color::black, Color::white, font, true,
&gt; +                                   Length(WebCore::Fixed),
&gt; +                                   textField-&gt;renderer()-&gt;style()-&gt;direction()));
&gt; +}
&gt; +
&gt; +void SuggestionsPopupMenuClient::setInitialSuggestion()
&gt; +{
&gt; +    if (!getSuggestionsSize() || !m_textField-&gt;name().length() || !m_typedFieldValue.length())
&gt; +        return;
&gt; +
&gt; +    int newIndex = m_selectedIndex &gt;= 0 ? m_selectedIndex : 0;
&gt; +    const String&amp; suggestion = getSuggestion(newIndex);
&gt; +    bool hasPreviousValue = m_lastFieldValues-&gt;contains(m_textField-&gt;name());
&gt; +
&gt; +    String prevValue;
&gt; +    if (hasPreviousValue)
&gt; +        prevValue = m_lastFieldValues-&gt;get(m_textField-&gt;name());
&gt; +
&gt; +    if (!hasPreviousValue || m_typedFieldValue.length() &gt; m_lastFieldValues-&gt;get(m_textField-&gt;name()).length()) {
&gt; +          if (suggestion.startsWith(m_typedFieldValue))
&gt; +              m_selectedIndex = newIndex;
&gt; +
&gt; +          int start = 0;
&gt; +          String newSuggestion = suggestion;
&gt; +          if (suggestion.startsWith(m_typedFieldValue, false)) {
&gt; +              newSuggestion = m_typedFieldValue;
&gt; +              if (suggestion.length() &gt; m_typedFieldValue.length()) {
&gt; +                  newSuggestion.append(suggestion.substring(m_typedFieldValue.length(),
&gt; +                      suggestion.length() - m_typedFieldValue.length()));
&gt; +              }
&gt; +              start = m_typedFieldValue.length();
&gt; +          }
&gt; +
&gt; +          m_textField-&gt;setSuggestedValue(newSuggestion);
&gt; +          m_textField-&gt;setSelectionRange(start, newSuggestion.length());
&gt; +    }
&gt; +
&gt; +    if (hasPreviousValue)
&gt; +        m_lastFieldValues-&gt;set(m_textField-&gt;name(), m_typedFieldValue);
&gt; +    else
&gt; +        m_lastFieldValues-&gt;add(m_textField-&gt;name(), m_typedFieldValue);
&gt; +}
&gt; +
&gt; +void SuggestionsPopupMenuClient::setSuggestedValue(const WebString&amp; suggestion)
&gt; +{
&gt; +    m_textField-&gt;setSuggestedValue(suggestion);
&gt; +    m_textField-&gt;setSelectionRange(m_typedFieldValue.length(),
&gt; +                                   suggestion.length());
&gt; +}
&gt; +
&gt; +} // namespace WebKit
&gt; Index: WebKit/chromium/src/SuggestionsPopupMenuClient.h
&gt; ===================================================================
&gt; --- WebKit/chromium/src/SuggestionsPopupMenuClient.h	(revision 0)
&gt; +++ WebKit/chromium/src/SuggestionsPopupMenuClient.h	(revision 0)
&gt; @@ -0,0 +1,118 @@
&gt; +/*
&gt; + * Copyright (C) 2010 Google Inc. All rights reserved.
&gt; + *
&gt; + * Redistribution and use in source and binary forms, with or without
&gt; + * modification, are permitted provided that the following conditions are
&gt; + * met:
&gt; + *
&gt; + *     * Redistributions of source code must retain the above copyright
&gt; + * notice, this list of conditions and the following disclaimer.
&gt; + *     * Redistributions in binary form must reproduce the above
&gt; + * copyright notice, this list of conditions and the following disclaimer
&gt; + * in the documentation and/or other materials provided with the
&gt; + * distribution.
&gt; + *     * Neither the name of Google Inc. nor the names of its
&gt; + * contributors may be used to endorse or promote products derived from
&gt; + * this software without specific prior written permission.
&gt; + *
&gt; + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
&gt; + * &quot;AS IS&quot; AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
&gt; + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
&gt; + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
&gt; + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
&gt; + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
&gt; + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
&gt; + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
&gt; + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
&gt; + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
&gt; + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
&gt; + */
&gt; +
&gt; +#include &quot;PopupMenuClient.h&quot;
&gt; +
&gt; +#ifndef SuggestionsPopupMenuClient_h
&gt; +#define SuggestionsPopupMenuClient_h
&gt; +
&gt; +namespace WebCore {
&gt; +class HTMLInputElement;
&gt; +class PopupMenuStyle;
&gt; +class RenderStyle;
&gt; +}
&gt; +
&gt; +namespace WebKit {
&gt; +class WebString;
&gt; +class WebViewImpl;
&gt; +template &lt;typename T&gt; class WebVector;
&gt; +
&gt; +// 
&gt; +class SuggestionsPopupMenuClient : public WebCore::PopupMenuClient {
&gt; +public:
&gt; +    SuggestionsPopupMenuClient(WebViewImpl* webview);
&gt; +    virtual ~SuggestionsPopupMenuClient();
&gt; +
&gt; +    // Returns the number of suggestions available.
&gt; +    virtual size_t getSuggestionsSize() const = 0;
&gt; +
&gt; +    // Returns the suggestion at |listIndex|.
&gt; +    virtual WebString getSuggestion(unsigned listIndex) const = 0;

getSuggestionsSize should probably be named getSuggestionsCount to
indicate that it is a count of available suggestions.  also,
getSuggestion should probably have its listIndex parameter type
changed to size_t to match, or change getSuggestionsCount to 
return unsigned instead of size_t.


&gt; +    RefPtr&lt;WebCore::HTMLInputElement&gt; m_textField;
&gt; +    int m_selectedIndex;
&gt; +    WebViewImpl* m_webView;

Do we have to worry about this weak pointer to the WebViewImpl becoming
invalid?  Maybe it would be better to access the WebViewImpl via the
m_textField member, which we have retained in a RefPtr.

  cast&lt;chromeclientimpl&gt;(element-&gt;document-&gt;frame-&gt;page-&gt;chrome-&gt;client)-&gt;webview


&gt; Index: WebKit/chromium/src/WebViewImpl.cpp
...
&gt; +#include &quot;AutoFillPopupMenuClient.h&quot;
&gt;  #include &quot;AutocompletePopupMenuClient.h&quot;
&gt;  #include &quot;AXObjectCache.h&quot;
&gt;  #include &quot;Chrome.h&quot;
&gt; @@ -81,6 +82,7 @@
&gt;  #include &quot;SecurityOrigin.h&quot;
&gt;  #include &quot;SelectionController.h&quot;
&gt;  #include &quot;Settings.h&quot;
&gt; +#include &quot;SuggestionsPopupMenuClient.h&quot;

^^^ this include is unnecessary given that we include the subclass headers, right?


&gt; +    if (!m_autoFillPopup.get())
&gt; +        m_autoFillPopup = PopupContainer::create(m_suggestionsPopupClient,
&gt; +                                                 suggestionsPopupSettings);

nit: multi-line, so it should have {}&apos;s


&gt; Index: WebKit/chromium/src/WebViewImpl.h
...
&gt; +    // A pointer to the current suggestions popup.  We do not own this pointer.
&gt; +    WebCore::PopupContainer* m_suggestionsPopup;

^^^ need to initialize this to 0 in the ctor.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>188805</commentid>
    <comment_count>5</comment_count>
      <attachid>48368</attachid>
    <who name="James Hawkins">jhawkins</who>
    <bug_when>2010-02-08 15:45:30 -0800</bug_when>
    <thetext>Created attachment 48368
[Chromium] Refactor AutocompletePopupMenuClient [try3]

All comments addressed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>188812</commentid>
    <comment_count>6</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-02-08 15:53:06 -0800</bug_when>
    <thetext>Attachment 48368 did not pass style-queue:

Failed to run &quot;WebKitTools/Scripts/check-webkit-style&quot; exit_code: 1
WebKit/chromium/src/SuggestionsPopupMenuClient.cpp:36:  Alphabetical sorting problem.  [build/include_order] [4]
Total errors found: 1


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>188813</commentid>
    <comment_count>7</comment_count>
      <attachid>48371</attachid>
    <who name="James Hawkins">jhawkins</who>
    <bug_when>2010-02-08 15:54:50 -0800</bug_when>
    <thetext>Created attachment 48371
[Chromium] Refactor AutocompletePopupMenuClient [try4]

Style fix.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>189149</commentid>
    <comment_count>8</comment_count>
      <attachid>48371</attachid>
    <who name="Darin Fisher (:fishd, Google)">fishd</who>
    <bug_when>2010-02-09 14:39:07 -0800</bug_when>
    <thetext>Comment on attachment 48371
[Chromium] Refactor AutocompletePopupMenuClient [try4]

&gt; Index: WebKit/chromium/src/AutocompletePopupMenuClient.h
&gt; Index: WebKit/chromium/src/SuggestionsPopupMenuClient.cpp
...
&gt; +// FIXME: Make sure we need all of these includes.
&gt; +#include &quot;CSSStyleSelector.h&quot;
&gt; +#include &quot;CSSValueKeywords.h&quot;
&gt; +#include &quot;Chrome.h&quot;
&gt; +#include &quot;FrameView.h&quot;
&gt; +#include &quot;HTMLInputElement.h&quot;
&gt; +#include &quot;RenderTheme.h&quot;
&gt; +#include &quot;WebVector.h&quot;
&gt; +#include &quot;WebViewImpl.h&quot;

How about processing that FIXME?


&gt; +void SuggestionsPopupMenuClient::selectionChanged(unsigned listIndex, bool fireEvents)
&gt; +{
&gt; +    if (listIndex != static_cast&lt;unsigned&gt;(-1)) {
&gt; +        const WebString&amp; suggestion = getSuggestion(listIndex);
&gt; +        setSuggestedValue(suggestion);
&gt; +    } else {
&gt; +      m_textField-&gt;setValue(m_typedFieldValue);
&gt; +      if (m_lastFieldValues-&gt;contains(m_textField-&gt;name()))
&gt; +          m_lastFieldValues-&gt;set(m_textField-&gt;name(), m_typedFieldValue);
&gt; +      else
&gt; +          m_lastFieldValues-&gt;add(m_textField-&gt;name(), m_typedFieldValue);
&gt; +    }
&gt; +}

^^^ bad indentation


&gt; +    if (!hasPreviousValue || m_typedFieldValue.length() &gt; m_lastFieldValues-&gt;get(m_textField-&gt;name()).length()) {
&gt; +          if (suggestion.startsWith(m_typedFieldValue))
&gt; +              m_selectedIndex = newIndex;

^^^ bad indentation


&gt; Index: WebKit/chromium/src/SuggestionsPopupMenuClient.h
...
&gt; +template &lt;typename T&gt; class WebVector;
&gt; +
&gt; +// 
&gt; +class SuggestionsPopupMenuClient : public WebCore::PopupMenuClient {

^^^ same nit as before about the spurious &apos;//&apos; without any comments.


What about my question re: &quot;WebViewImpl* m_webView&quot; from before?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>189154</commentid>
    <comment_count>9</comment_count>
      <attachid>48443</attachid>
    <who name="James Hawkins">jhawkins</who>
    <bug_when>2010-02-09 14:58:18 -0800</bug_when>
    <thetext>Created attachment 48443
[Chromium] Refactor AutocompletePopupMenuClient [try5]

Fixed indentation.  Removed spurious headers.  m_webView was replaced with getWebView method in my previous patch, but I forgot to remove the member variable.  Done in this patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>189157</commentid>
    <comment_count>10</comment_count>
      <attachid>48443</attachid>
    <who name="Darin Fisher (:fishd, Google)">fishd</who>
    <bug_when>2010-02-09 15:13:46 -0800</bug_when>
    <thetext>Comment on attachment 48443
[Chromium] Refactor AutocompletePopupMenuClient [try5]

&gt; Index: WebKit/chromium/src/SuggestionsPopupMenuClient.cpp
...
&gt; +int SuggestionsPopupMenuClient::clientPaddingLeft() const
&gt; +{
&gt; +    // Bug http://crbug.com/7708 seems to indicate the style can be 0.
&gt; +    RenderStyle* style = textFieldStyle();
&gt; +    if (!style)
&gt; +       return 0;
&gt; +
&gt; +    return getWebView()-&gt;theme()-&gt;popupInternalPaddingLeft(style);

Technically, there&apos;s no need to use WebViewImpl::theme().  I&apos;ve been
meaning to delete that function since we don&apos;t need it.  We only have
a single global RenderTheme implementation, which you can access via
RenderTheme::defaultTheme().  I suggest using that function instead.

I note, however, that you are just copying the existing code, so if
you prefer to leave this as-is for now that&apos;s fine.


&gt; +WebViewImpl* SuggestionsPopupMenuClient::getWebView() const
&gt; +{
&gt; +    return static_cast&lt;ChromeClientImpl*&gt;(
&gt; +        m_textField-&gt;document()-&gt;frame()-&gt;page()-&gt;chrome()-&gt;client())-&gt;webView();

Note: when a frame is being torn down, it is possible for Frame::page()
to return null.

Document::frame() also has a comment saying that the result can be null.

The point of not holding a direct reference to m_webView was to deal
well with these odd shutdown cases, so it is probably worth adding
some null checks.

I think you don&apos;t have to worry about m_textField-&gt;document() ever
being null, and a Page always has a Chrome object, which will have
a ChromeClient.  ChromeClientImpl is allocated as a member variable
of WebViewImpl, so you don&apos;t have to worry about the backpointer
from ChromeClientImpl to WebViewImpl ever being null.

R- because I think we should add some null checks in getWebView()
and at the callsites.

-Darin</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>189164</commentid>
    <comment_count>11</comment_count>
      <attachid>48446</attachid>
    <who name="James Hawkins">jhawkins</who>
    <bug_when>2010-02-09 15:24:43 -0800</bug_when>
    <thetext>Created attachment 48446
[Chromium] Refactor AutocompletePopupMenuClient [try6]

Added NULL checks in getWebView() and callers of the method.  Now using RenderTheme::defaultTheme().</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>189166</commentid>
    <comment_count>12</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-02-09 15:28:38 -0800</bug_when>
    <thetext>Attachment 48446 did not pass style-queue:

Failed to run &quot;WebKitTools/Scripts/check-webkit-style&quot; exit_code: 1
WebKit/chromium/src/SuggestionsPopupMenuClient.cpp:253:  Use 0 instead of NULL.  [readability/null] [5]
WebKit/chromium/src/SuggestionsPopupMenuClient.cpp:257:  Use 0 instead of NULL.  [readability/null] [5]
Total errors found: 2


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>189167</commentid>
    <comment_count>13</comment_count>
      <attachid>48448</attachid>
    <who name="James Hawkins">jhawkins</who>
    <bug_when>2010-02-09 15:30:29 -0800</bug_when>
    <thetext>Created attachment 48448
[Chromium] Refactor AutocompletePopupMenuClient [try7]

Fixes style nits.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>189169</commentid>
    <comment_count>14</comment_count>
      <attachid>48450</attachid>
    <who name="James Hawkins">jhawkins</who>
    <bug_when>2010-02-09 15:52:43 -0800</bug_when>
    <thetext>Created attachment 48450
[Chromium] Refactor AutocompletePopupMenuClient [try8]

Fixed indentation.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>189170</commentid>
    <comment_count>15</comment_count>
      <attachid>48451</attachid>
    <who name="James Hawkins">jhawkins</who>
    <bug_when>2010-02-09 15:54:26 -0800</bug_when>
    <thetext>Created attachment 48451
[Chromium] Refactor AutocompletePopupMenuClient [try9]

Another indentation fix.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>189229</commentid>
    <comment_count>16</comment_count>
      <attachid>48451</attachid>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2010-02-09 20:48:56 -0800</bug_when>
    <thetext>Comment on attachment 48451
[Chromium] Refactor AutocompletePopupMenuClient [try9]

Clearing flags on attachment: 48451

Committed r54586: &lt;http://trac.webkit.org/changeset/54586&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>189230</commentid>
    <comment_count>17</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2010-02-09 20:49:06 -0800</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>189282</commentid>
    <comment_count>18</comment_count>
    <who name="Tony Chang">tony</who>
    <bug_when>2010-02-10 01:28:32 -0800</bug_when>
    <thetext>(In reply to comment #16)
&gt; (From update of attachment 48451 [details])
&gt; Clearing flags on attachment: 48451
&gt; 
&gt; Committed r54586: &lt;http://trac.webkit.org/changeset/54586&gt;

The Chromium mac build appears to be broken with the following error:
cc1plus: warnings being treated as errors
/Users/cltbld/Desktop/BuildSlaveData/WebKit-BuildSlave/chromium-mac-release/build/WebKit/chromium/src/AutoFillPopupMenuClient.cpp: In member function â€˜virtual void WebKit::AutoFillPopupMenuClient::removeSuggestionAtIndex(unsigned int)â€™:
/Users/cltbld/Desktop/BuildSlaveData/WebKit-BuildSlave/chromium-mac-release/build/WebKit/chromium/src/AutoFillPopupMenuClient.cpp:57: warning: comparison between signed and unsigned integer expressions


However, the canary buildbot on build.chromium.org compiles just fine.  I think it&apos;s just different versions of gcc and 4.2 gives the warning and 4.2.1 doesn&apos;t.

Anyway, fixed in http://trac.webkit.org/changeset/54589 .</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>48358</attachid>
            <date>2010-02-08 13:11:44 -0800</date>
            <delta_ts>2010-02-08 13:19:01 -0800</delta_ts>
            <desc>[Chromium] Refactor AutocompletePopupMenuClient</desc>
            <filename>refactor.diff</filename>
            <type>text/plain</type>
            <size>49740</size>
            <attacher name="James Hawkins">jhawkins</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYktpdC9jaHJvbWl1bS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0L2No
cm9taXVtL0NoYW5nZUxvZwkocmV2aXNpb24gNTQ1MDUpCisrKyBXZWJLaXQvY2hyb21pdW0vQ2hh
bmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsNzggQEAKKzIwMTAtMDItMDggIEphbWVz
IEhhd2tpbnMgIDxqaGF3a2luc0BjaHJvbWl1bS5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkg
Tk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgW0Nocm9taXVtXSBSZWZhY3RvciBBdXRvY29tcGxl
dGVQb3B1cE1lbnVDbGllbnQgaW50byBhIGJhc2UgY2xhc3MsCisgICAgICAgIFN1Z2dlc3Rpb25z
UG9wdXBNZW51Q2xpZW50LCBhbmQgdHdvIGRlcml2ZWQgY2xhc3NlcywKKyAgICAgICAgQXV0b2Nv
bXBsZXRlUG9wdXBNZW51Q2xpZW50IGFuZCBBdXRvRmlsbFBvcHVwTWVudUNsaWVudC4gIEN1cnJl
bnRseQorICAgICAgICB0aGUgYmVoYXZpb3Igb2Ygc3VnZ2VzdGlvbnMgcG9wdXBzIGhhcyBub3Qg
Y2hhbmdlZC4KKworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/
aWQ9MzQ3MjEKKworICAgICAgICAqIFdlYktpdC5neXA6CisgICAgICAgICogcHVibGljL1dlYlZp
ZXcuaDoKKyAgICAgICAgKiBzcmMvQXV0b0ZpbGxQb3B1cE1lbnVDbGllbnQuY3BwOiBBZGRlZC4K
KyAgICAgICAgKFdlYktpdDo6QXV0b0ZpbGxQb3B1cE1lbnVDbGllbnQ6OkF1dG9GaWxsUG9wdXBN
ZW51Q2xpZW50KToKKyAgICAgICAgKFdlYktpdDo6QXV0b0ZpbGxQb3B1cE1lbnVDbGllbnQ6On5B
dXRvRmlsbFBvcHVwTWVudUNsaWVudCk6CisgICAgICAgIChXZWJLaXQ6OkF1dG9GaWxsUG9wdXBN
ZW51Q2xpZW50OjpnZXRTdWdnZXN0aW9uc1NpemUpOgorICAgICAgICAoV2ViS2l0OjpBdXRvRmls
bFBvcHVwTWVudUNsaWVudDo6Z2V0U3VnZ2VzdGlvbik6CisgICAgICAgIChXZWJLaXQ6OkF1dG9G
aWxsUG9wdXBNZW51Q2xpZW50OjpyZW1vdmVTdWdnZXN0aW9uQXRJbmRleCk6CisgICAgICAgIChX
ZWJLaXQ6OnNlbGVjdGlvbkNoYW5nZWQpOgorICAgICAgICAoV2ViS2l0OjpBdXRvRmlsbFBvcHVw
TWVudUNsaWVudDo6aW5pdGlhbGl6ZSk6CisgICAgICAgIChXZWJLaXQ6OkF1dG9GaWxsUG9wdXBN
ZW51Q2xpZW50OjpzZXRTdWdnZXN0aW9ucyk6CisgICAgICAgICogc3JjL0F1dG9GaWxsUG9wdXBN
ZW51Q2xpZW50Lmg6IEFkZGVkLgorICAgICAgICAqIHNyYy9BdXRvY29tcGxldGVQb3B1cE1lbnVD
bGllbnQuY3BwOgorICAgICAgICAoV2ViS2l0OjpBdXRvY29tcGxldGVQb3B1cE1lbnVDbGllbnQ6
OkF1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVudCk6CisgICAgICAgIChXZWJLaXQ6OkF1dG9jb21w
bGV0ZVBvcHVwTWVudUNsaWVudDo6Z2V0U3VnZ2VzdGlvbnNTaXplKToKKyAgICAgICAgKFdlYktp
dDo6QXV0b2NvbXBsZXRlUG9wdXBNZW51Q2xpZW50OjpnZXRTdWdnZXN0aW9uKToKKyAgICAgICAg
KFdlYktpdDo6QXV0b2NvbXBsZXRlUG9wdXBNZW51Q2xpZW50OjpyZW1vdmVTdWdnZXN0aW9uQXRJ
bmRleCk6CisgICAgICAgIChXZWJLaXQ6OkF1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVudDo6aW5p
dGlhbGl6ZSk6CisgICAgICAgIChXZWJLaXQ6OkF1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVudDo6
c2V0U3VnZ2VzdGlvbnMpOgorICAgICAgICAqIHNyYy9BdXRvY29tcGxldGVQb3B1cE1lbnVDbGll
bnQuaDoKKyAgICAgICAgKiBzcmMvU3VnZ2VzdGlvbnNQb3B1cE1lbnVDbGllbnQuY3BwOiBBZGRl
ZC4KKyAgICAgICAgKFdlYktpdDo6U3VnZ2VzdGlvbnNQb3B1cE1lbnVDbGllbnQ6OlN1Z2dlc3Rp
b25zUG9wdXBNZW51Q2xpZW50KToKKyAgICAgICAgKFdlYktpdDo6U3VnZ2VzdGlvbnNQb3B1cE1l
bnVDbGllbnQ6On5TdWdnZXN0aW9uc1BvcHVwTWVudUNsaWVudCk6CisgICAgICAgIChXZWJLaXQ6
OlN1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50Ojp2YWx1ZUNoYW5nZWQpOgorICAgICAgICAoV2Vi
S2l0OjpTdWdnZXN0aW9uc1BvcHVwTWVudUNsaWVudDo6c2VsZWN0aW9uQ2hhbmdlZCk6CisgICAg
ICAgIChXZWJLaXQ6OlN1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50OjppdGVtVGV4dCk6CisgICAg
ICAgIChXZWJLaXQ6OlN1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50OjppdGVtU3R5bGUpOgorICAg
ICAgICAoV2ViS2l0OjpTdWdnZXN0aW9uc1BvcHVwTWVudUNsaWVudDo6bWVudVN0eWxlKToKKyAg
ICAgICAgKFdlYktpdDo6U3VnZ2VzdGlvbnNQb3B1cE1lbnVDbGllbnQ6OmNsaWVudFBhZGRpbmdM
ZWZ0KToKKyAgICAgICAgKFdlYktpdDo6U3VnZ2VzdGlvbnNQb3B1cE1lbnVDbGllbnQ6OmNsaWVu
dFBhZGRpbmdSaWdodCk6CisgICAgICAgIChXZWJLaXQ6OlN1Z2dlc3Rpb25zUG9wdXBNZW51Q2xp
ZW50Ojpwb3B1cERpZEhpZGUpOgorICAgICAgICAoV2ViS2l0OjpTdWdnZXN0aW9uc1BvcHVwTWVu
dUNsaWVudDo6c2V0VGV4dEZyb21JdGVtKToKKyAgICAgICAgKFdlYktpdDo6U3VnZ2VzdGlvbnNQ
b3B1cE1lbnVDbGllbnQ6OnJlc2V0TGFzdFN1Z2dlc3Rpb24pOgorICAgICAgICAoV2ViS2l0OjpT
dWdnZXN0aW9uc1BvcHVwTWVudUNsaWVudDo6Zm9udFNlbGVjdG9yKToKKyAgICAgICAgKFdlYktp
dDo6U3VnZ2VzdGlvbnNQb3B1cE1lbnVDbGllbnQ6Omhvc3RXaW5kb3cpOgorICAgICAgICAoV2Vi
S2l0OjpTdWdnZXN0aW9uc1BvcHVwTWVudUNsaWVudDo6Y3JlYXRlU2Nyb2xsYmFyKToKKyAgICAg
ICAgKFdlYktpdDo6U3VnZ2VzdGlvbnNQb3B1cE1lbnVDbGllbnQ6OnRleHRGaWVsZFN0eWxlKToK
KyAgICAgICAgKFdlYktpdDo6U3VnZ2VzdGlvbnNQb3B1cE1lbnVDbGllbnQ6OmluaXRpYWxpemUp
OgorICAgICAgICAoV2ViS2l0OjpTdWdnZXN0aW9uc1BvcHVwTWVudUNsaWVudDo6c2V0SW5pdGlh
bFN1Z2dlc3Rpb24pOgorICAgICAgICAoV2ViS2l0OjpTdWdnZXN0aW9uc1BvcHVwTWVudUNsaWVu
dDo6c2V0U3VnZ2VzdGVkVmFsdWUpOgorICAgICAgICAqIHNyYy9TdWdnZXN0aW9uc1BvcHVwTWVu
dUNsaWVudC5oOiBBZGRlZC4KKyAgICAgICAgKFdlYktpdDo6U3VnZ2VzdGlvbnNQb3B1cE1lbnVD
bGllbnQ6Oml0ZW1Ub29sVGlwKToKKyAgICAgICAgKFdlYktpdDo6U3VnZ2VzdGlvbnNQb3B1cE1l
bnVDbGllbnQ6Oml0ZW1Jc0VuYWJsZWQpOgorICAgICAgICAoV2ViS2l0OjpTdWdnZXN0aW9uc1Bv
cHVwTWVudUNsaWVudDo6Y2xpZW50SW5zZXRMZWZ0KToKKyAgICAgICAgKFdlYktpdDo6U3VnZ2Vz
dGlvbnNQb3B1cE1lbnVDbGllbnQ6OmNsaWVudEluc2V0UmlnaHQpOgorICAgICAgICAoV2ViS2l0
OjpTdWdnZXN0aW9uc1BvcHVwTWVudUNsaWVudDo6bGlzdFNpemUpOgorICAgICAgICAoV2ViS2l0
OjpTdWdnZXN0aW9uc1BvcHVwTWVudUNsaWVudDo6c2VsZWN0ZWRJbmRleCk6CisgICAgICAgIChX
ZWJLaXQ6OlN1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50OjppdGVtSXNTZXBhcmF0b3IpOgorICAg
ICAgICAoV2ViS2l0OjpTdWdnZXN0aW9uc1BvcHVwTWVudUNsaWVudDo6aXRlbUlzTGFiZWwpOgor
ICAgICAgICAoV2ViS2l0OjpTdWdnZXN0aW9uc1BvcHVwTWVudUNsaWVudDo6aXRlbUlzU2VsZWN0
ZWQpOgorICAgICAgICAoV2ViS2l0OjpTdWdnZXN0aW9uc1BvcHVwTWVudUNsaWVudDo6c2hvdWxk
UG9wT3Zlcik6CisgICAgICAgIChXZWJLaXQ6OlN1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50Ojp2
YWx1ZVNob3VsZENoYW5nZU9uSG90VHJhY2spOgorICAgICAgICAoV2ViS2l0OjpTdWdnZXN0aW9u
c1BvcHVwTWVudUNsaWVudDo6Z2V0U2VsZWN0ZWRJbmRleCk6CisgICAgICAgIChXZWJLaXQ6OlN1
Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50OjpzZXRTZWxlY3RlZEluZGV4KToKKyAgICAgICAgKFdl
YktpdDo6U3VnZ2VzdGlvbnNQb3B1cE1lbnVDbGllbnQ6OmdldFdlYlZpZXcpOgorICAgICAgICAo
V2ViS2l0OjpTdWdnZXN0aW9uc1BvcHVwTWVudUNsaWVudDo6Z2V0VGV4dEZpZWxkKToKKyAgICAg
ICAgKiBzcmMvV2ViVmlld0ltcGwuY3BwOgorICAgICAgICAoV2ViS2l0OjpXZWJWaWV3SW1wbDo6
a2V5RXZlbnQpOgorICAgICAgICAoV2ViS2l0OjpXZWJWaWV3SW1wbDo6YXV0b2NvbXBsZXRlSGFu
ZGxlS2V5RXZlbnQpOgorICAgICAgICAoV2ViS2l0OjpXZWJWaWV3SW1wbDo6YXBwbHlBdXRvZmls
bFN1Z2dlc3Rpb25zKToKKyAgICAgICAgKFdlYktpdDo6V2ViVmlld0ltcGw6OmFwcGx5QXV0b0Zp
bGxTdWdnZXN0aW9ucyk6CisgICAgICAgIChXZWJLaXQ6OldlYlZpZXdJbXBsOjphcHBseUF1dG9j
b21wbGV0ZVN1Z2dlc3Rpb25zKToKKyAgICAgICAgKiBzcmMvV2ViVmlld0ltcGwuaDoKKwogMjAx
MC0wMi0wOCAgRGlyayBTY2h1bHplICA8a3JpdEB3ZWJraXQub3JnPgogCiAgICAgICAgIFJldmll
d2VkIGJ5IE5pa29sYXMgWmltbWVybWFubi4KSW5kZXg6IFdlYktpdC9jaHJvbWl1bS9XZWJLaXQu
Z3lwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFdlYktpdC9jaHJvbWl1bS9XZWJLaXQuZ3lwCShyZXZpc2lvbiA1
NDUwMSkKKysrIFdlYktpdC9jaHJvbWl1bS9XZWJLaXQuZ3lwCSh3b3JraW5nIGNvcHkpCkBAIC0x
OTksNiArMTk5LDggQEAKICAgICAgICAgICAgICAgICAnc3JjL0Fzc2VydE1hdGNoaW5nRW51bXMu
Y3BwJywKICAgICAgICAgICAgICAgICAnc3JjL0F1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVudC5j
cHAnLAogICAgICAgICAgICAgICAgICdzcmMvQXV0b2NvbXBsZXRlUG9wdXBNZW51Q2xpZW50Lmgn
LAorICAgICAgICAgICAgICAgICdzcmMvQXV0b0ZpbGxQb3B1cE1lbnVDbGllbnQuY3BwJywKKyAg
ICAgICAgICAgICAgICAnc3JjL0F1dG9GaWxsUG9wdXBNZW51Q2xpZW50LmgnLAogICAgICAgICAg
ICAgICAgICdzcmMvQmFja0ZvcndhcmRMaXN0Q2xpZW50SW1wbC5jcHAnLAogICAgICAgICAgICAg
ICAgICdzcmMvQmFja0ZvcndhcmRMaXN0Q2xpZW50SW1wbC5oJywKICAgICAgICAgICAgICAgICAn
c3JjL0JvdW5kT2JqZWN0LmNwcCcsCkBAIC0yNTcsNiArMjU5LDggQEAKICAgICAgICAgICAgICAg
ICAnc3JjL1N0b3JhZ2VFdmVudERpc3BhdGNoZXJJbXBsLmgnLAogICAgICAgICAgICAgICAgICdz
cmMvU3RvcmFnZU5hbWVzcGFjZVByb3h5LmNwcCcsCiAgICAgICAgICAgICAgICAgJ3NyYy9TdG9y
YWdlTmFtZXNwYWNlUHJveHkuaCcsCisgICAgICAgICAgICAgICAgJ3NyYy9TdWdnZXN0aW9uc1Bv
cHVwTWVudUNsaWVudC5jcHAnLAorICAgICAgICAgICAgICAgICdzcmMvU3VnZ2VzdGlvbnNQb3B1
cE1lbnVDbGllbnQuaCcsCiAgICAgICAgICAgICAgICAgJ3NyYy9UZW1wb3JhcnlHbHVlLmgnLAog
ICAgICAgICAgICAgICAgICdzcmMvVG9vbHNBZ2VudC5oJywKICAgICAgICAgICAgICAgICAnc3Jj
L1dlYkFjY2Vzc2liaWxpdHlDYWNoZS5jcHAnLApJbmRleDogV2ViS2l0L2Nocm9taXVtL3B1Ymxp
Yy9XZWJWaWV3LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0L2Nocm9taXVtL3B1YmxpYy9XZWJWaWV3
LmgJKHJldmlzaW9uIDU0NTAxKQorKysgV2ViS2l0L2Nocm9taXVtL3B1YmxpYy9XZWJWaWV3LmgJ
KHdvcmtpbmcgY29weSkKQEAgLTIyNSwxMiArMjI1LDI3IEBAIHB1YmxpYzoKIAogICAgIC8vIEF1
dG9maWxsIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLQogCi0gICAgLy8gTm90aWZpZXMgdGhlIFdlYlZpZXcgdGhhdCBhdXRvZmlsbCBz
dWdnZXN0aW9ucyBhcmUgYXZhaWxhYmxlIGZvciBhIG5vZGUuCisgICAgLy8gREVQUkVDQVRFRDog
V2ViVmlldzo6YXBwbHlBdXRvY29tcGxldGVTdWdnZXN0aW9ucyBpcyB0aGUgbmV3IHdheSB0bwor
ICAgIC8vIGFjY2VzcyB0aGlzLgogICAgIHZpcnR1YWwgdm9pZCBhcHBseUF1dG9maWxsU3VnZ2Vz
dGlvbnMoCiAgICAgICAgIGNvbnN0IFdlYk5vZGUmLAogICAgICAgICBjb25zdCBXZWJWZWN0b3I8
V2ViU3RyaW5nPiYgc3VnZ2VzdGlvbnMsCiAgICAgICAgIGludCBkZWZhdWx0U3VnZ2VzdGlvbklu
ZGV4KSA9IDA7CiAKKyAgICAvLyBOb3RpZmllcyB0aGUgV2ViVmlldyB0aGF0IEF1dG9GaWxsIHN1
Z2dlc3Rpb25zIGFyZSBhdmFpbGFibGUgZm9yIGEgbm9kZS4KKyAgICB2aXJ0dWFsIHZvaWQgYXBw
bHlBdXRvRmlsbFN1Z2dlc3Rpb25zKAorICAgICAgICBjb25zdCBXZWJOb2RlJiwKKyAgICAgICAg
Y29uc3QgV2ViVmVjdG9yPFdlYlN0cmluZz4mIG5hbWVzLAorICAgICAgICBjb25zdCBXZWJWZWN0
b3I8V2ViU3RyaW5nPiYgbGFiZWxzLAorICAgICAgICBpbnQgZGVmYXVsdFN1Z2dlc3Rpb25JbmRl
eCkgPSAwOworCisgICAgLy8gTm90aWZpZXMgdGhlIFdlYlZpZXcgdGhhdCBBdXRvY29tcGxldGUg
c3VnZ2VzdGlvbnMgYXJlIGF2YWlsYWJsZSBmb3IgYQorICAgIC8vIG5vZGUuCisgICAgdmlydHVh
bCB2b2lkIGFwcGx5QXV0b2NvbXBsZXRlU3VnZ2VzdGlvbnMoCisgICAgICAgIGNvbnN0IFdlYk5v
ZGUmLAorICAgICAgICBjb25zdCBXZWJWZWN0b3I8V2ViU3RyaW5nPiYgc3VnZ2VzdGlvbnMsCisg
ICAgICAgIGludCBkZWZhdWx0U3VnZ2VzdGlvbkluZGV4KSA9IDA7CisKICAgICAvLyBERVBSRUNB
VEVEOiBXZWJWaWV3OjpoaWRlU3VnZ2VzdGlvbnNQb3B1cCBpcyB0aGUgbmV3IHdheSB0byBhY2Nl
c3MgdGhpcy4KICAgICB2aXJ0dWFsIHZvaWQgaGlkZUF1dG9maWxsUG9wdXAoKSA9IDA7CiAKSW5k
ZXg6IFdlYktpdC9jaHJvbWl1bS9zcmMvQXV0b0ZpbGxQb3B1cE1lbnVDbGllbnQuY3BwCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFdlYktpdC9jaHJvbWl1bS9zcmMvQXV0b0ZpbGxQb3B1cE1lbnVDbGllbnQuY3Bw
CShyZXZpc2lvbiAwKQorKysgV2ViS2l0L2Nocm9taXVtL3NyYy9BdXRvRmlsbFBvcHVwTWVudUNs
aWVudC5jcHAJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMTIxIEBACisvKgorICogQ29weXJpZ2h0
IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0
cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRo
b3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9s
bG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVj
ZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFu
ZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4K
KyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBv
ZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUg
cHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMg
cHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklE
RUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIg
QU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9U
CisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElU
WSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVE
LiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRP
UlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQ
RUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJV
VCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1Ig
U0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1Mg
SU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElB
QklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisg
KiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkg
T1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBU
SEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5o
IgorI2luY2x1ZGUgIkF1dG9GaWxsUG9wdXBNZW51Q2xpZW50LmgiCisKKyNpbmNsdWRlICJDU1NT
dHlsZVNlbGVjdG9yLmgiCisjaW5jbHVkZSAiQ1NTVmFsdWVLZXl3b3Jkcy5oIgorI2luY2x1ZGUg
IkZyYW1lVmlldy5oIgorI2luY2x1ZGUgIkhUTUxJbnB1dEVsZW1lbnQuaCIKKyNpbmNsdWRlICJS
ZW5kZXJUaGVtZS5oIgorI2luY2x1ZGUgIldlYk5vZGUuaCIKKyNpbmNsdWRlICJXZWJWZWN0b3Iu
aCIKKyNpbmNsdWRlICJXZWJWaWV3Q2xpZW50LmgiCisjaW5jbHVkZSAiV2ViVmlld0ltcGwuaCIK
KwordXNpbmcgbmFtZXNwYWNlIFdlYkNvcmU7CisKK25hbWVzcGFjZSBXZWJLaXQgeworCitBdXRv
RmlsbFBvcHVwTWVudUNsaWVudDo6QXV0b0ZpbGxQb3B1cE1lbnVDbGllbnQoV2ViVmlld0ltcGwq
IHdlYlZpZXcpCisgICAgOiBTdWdnZXN0aW9uc1BvcHVwTWVudUNsaWVudCh3ZWJWaWV3KQorewor
fQorCitBdXRvRmlsbFBvcHVwTWVudUNsaWVudDo6fkF1dG9GaWxsUG9wdXBNZW51Q2xpZW50KCkK
K3sKK30KKworc2l6ZV90IEF1dG9GaWxsUG9wdXBNZW51Q2xpZW50OjpnZXRTdWdnZXN0aW9uc1Np
emUoKSBjb25zdCB7CisgICAgcmV0dXJuIG1fbmFtZXMuc2l6ZSgpOworfQorCitXZWJTdHJpbmcg
QXV0b0ZpbGxQb3B1cE1lbnVDbGllbnQ6OmdldFN1Z2dlc3Rpb24odW5zaWduZWQgbGlzdEluZGV4
KSBjb25zdAoreworICAgIC8vIFRPRE8oamhhd2tpbnMpOiBNb2RpZnkgdGhlIFBvcHVwTWVudSB0
byBhZGQgdGhlIGxhYmVsIGluIGdyYXkKKyAgICAvLyByaWdodC1qdXN0aWZpZWQuCisgICAgQVNT
RVJUKGxpc3RJbmRleCA+PSAwICYmIGxpc3RJbmRleCA8IG1fbmFtZXMuc2l6ZSgpKTsKKyAgICBy
ZXR1cm4gbV9uYW1lc1tsaXN0SW5kZXhdICsgV2ViU3RyaW5nKCIgKCIpICsgbV9sYWJlbHNbbGlz
dEluZGV4XSArIFdlYlN0cmluZygiKSIpOworfQorCit2b2lkIEF1dG9GaWxsUG9wdXBNZW51Q2xp
ZW50OjpyZW1vdmVTdWdnZXN0aW9uQXRJbmRleCh1bnNpZ25lZCBsaXN0SW5kZXgpCit7CisgICAg
Ly8gVE9ETyhqaGF3a2lucyk6IERvIHdlIHdhbnQgdG8gcmVtb3ZlIEF1dG9GaWxsIHN1Z2dlc3Rp
b25zPworICAgIEFTU0VSVChsaXN0SW5kZXggPj0gMCAmJiBsaXN0SW5kZXggPCBzdGF0aWNfY2Fz
dDxpbnQ+KG1fbmFtZXMuc2l6ZSgpKSk7CisgICAgbV9uYW1lcy5yZW1vdmUobGlzdEluZGV4KTsK
KyAgICBtX2xhYmVscy5yZW1vdmUobGlzdEluZGV4KTsKK30KKwordm9pZCBBdXRvRmlsbFBvcHVw
TWVudUNsaWVudDo6IHNlbGVjdGlvbkNoYW5nZWQodW5zaWduZWQgbGlzdEluZGV4LAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmaXJlRXZlbnRz
KSB7CisgICAgaWYgKGxpc3RJbmRleCA9PSBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oLTEpKSB7Cisg
ICAgICAgIFN1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50OjpzZWxlY3Rpb25DaGFuZ2VkKGxpc3RJ
bmRleCwgZmlyZUV2ZW50cyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBBU1NFUlQo
bGlzdEluZGV4ID49IDAgJiYgbGlzdEluZGV4IDwgbV9uYW1lcy5zaXplKCkpOworICAgIHNldFN1
Z2dlc3RlZFZhbHVlKG1fbmFtZXNbbGlzdEluZGV4XSk7Cit9CisKK3ZvaWQgQXV0b0ZpbGxQb3B1
cE1lbnVDbGllbnQ6OmluaXRpYWxpemUoCisgICAgSFRNTElucHV0RWxlbWVudCogdGV4dEZpZWxk
LAorICAgIGNvbnN0IFdlYlZlY3RvcjxXZWJTdHJpbmc+JiBuYW1lcywKKyAgICBjb25zdCBXZWJW
ZWN0b3I8V2ViU3RyaW5nPiYgbGFiZWxzLAorICAgIGludCBkZWZhdWx0U3VnZ2VzdGlvbkluZGV4
KQoreworICAgIEFTU0VSVChuYW1lcy5zaXplKCkgPT0gbGFiZWxzLnNpemUoKSk7CisgICAgQVNT
RVJUKGRlZmF1bHRTdWdnZXN0aW9uSW5kZXggPCBzdGF0aWNfY2FzdDxpbnQ+KG5hbWVzLnNpemUo
KSkpOworCisgICAgLy8gVGhlIHN1Z2dlc3Rpb25zIG11c3QgYmUgc2V0IGJlZm9yZSBpbml0aWFs
aXppbmcgdGhlCisgICAgLy8gU3VnZ2VzdGlvbnNQb3B1cE1lbnVDbGllbnQuCisgICAgc2V0U3Vn
Z2VzdGlvbnMobmFtZXMsIGxhYmVscyk7CisKKyAgICBTdWdnZXN0aW9uc1BvcHVwTWVudUNsaWVu
dDo6aW5pdGlhbGl6ZSh0ZXh0RmllbGQsIGRlZmF1bHRTdWdnZXN0aW9uSW5kZXgpOworfQorCit2
b2lkIEF1dG9GaWxsUG9wdXBNZW51Q2xpZW50OjpzZXRTdWdnZXN0aW9ucyhjb25zdCBXZWJWZWN0
b3I8V2ViU3RyaW5nPiYgbmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBjb25zdCBXZWJWZWN0b3I8V2ViU3RyaW5nPiYgbGFiZWxzKQoreworICAgIEFT
U0VSVChuYW1lcy5zaXplKCkgPT0gbGFiZWxzLnNpemUoKSk7CisKKyAgICBtX25hbWVzLmNsZWFy
KCk7CisgICAgbV9sYWJlbHMuY2xlYXIoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG5h
bWVzLnNpemUoKTsgKytpKSB7CisgICAgICAgIG1fbmFtZXMuYXBwZW5kKG5hbWVzW2ldKTsKKyAg
ICAgICAgbV9sYWJlbHMuYXBwZW5kKGxhYmVsc1tpXSk7CisgICAgfQorCisgICAgLy8gVHJ5IHRv
IHByZXNlcnZlIHNlbGVjdGlvbiBpZiBwb3NzaWJsZS4KKyAgICBpZiAoZ2V0U2VsZWN0ZWRJbmRl
eCgpID49IHN0YXRpY19jYXN0PGludD4obmFtZXMuc2l6ZSgpKSkKKyAgICAgICAgc2V0U2VsZWN0
ZWRJbmRleCgtMSk7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYktpdApJbmRleDogV2ViS2l0L2No
cm9taXVtL3NyYy9BdXRvRmlsbFBvcHVwTWVudUNsaWVudC5oCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktp
dC9jaHJvbWl1bS9zcmMvQXV0b0ZpbGxQb3B1cE1lbnVDbGllbnQuaAkocmV2aXNpb24gMCkKKysr
IFdlYktpdC9jaHJvbWl1bS9zcmMvQXV0b0ZpbGxQb3B1cE1lbnVDbGllbnQuaAkocmV2aXNpb24g
MCkKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5j
LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g
c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9u
LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFy
ZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBt
dXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5
cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
IHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRo
ZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRv
cnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJv
bQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlz
c2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQg
SE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJ
TVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhF
IElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisg
KiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwg
VEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5Z
IERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9S
IENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRP
LCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVT
RSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZF
UiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBD
T05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdF
TkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBP
RiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNV
Q0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgQXV0b0ZpbGxQb3B1cE1lbnVDbGllbnRfaAorI2Rl
ZmluZSBBdXRvRmlsbFBvcHVwTWVudUNsaWVudF9oCisKKyNpbmNsdWRlICJTdWdnZXN0aW9uc1Bv
cHVwTWVudUNsaWVudC5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CitjbGFzcyBIVE1MSW5wdXRF
bGVtZW50OworY2xhc3MgUG9wdXBNZW51U3R5bGU7CitjbGFzcyBSZW5kZXJTdHlsZTsKK30KKwor
bmFtZXNwYWNlIFdlYktpdCB7CitjbGFzcyBXZWJTdHJpbmc7CitjbGFzcyBXZWJWaWV3SW1wbDsK
K3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBjbGFzcyBXZWJWZWN0b3I7CisKKy8vIAorY2xhc3MgQXV0
b0ZpbGxQb3B1cE1lbnVDbGllbnQgOiBwdWJsaWMgU3VnZ2VzdGlvbnNQb3B1cE1lbnVDbGllbnQg
eworcHVibGljOgorICAgIEF1dG9GaWxsUG9wdXBNZW51Q2xpZW50KFdlYlZpZXdJbXBsKiB3ZWJW
aWV3KTsKKyAgICB2aXJ0dWFsIH5BdXRvRmlsbFBvcHVwTWVudUNsaWVudCgpOworCisgICAgLy8g
U3VnZ2VzdGlvbnNQb3B1cE1lbnVDbGllbnQgaW1wbGVtZW50YXRpb246CisgICAgdmlydHVhbCBz
aXplX3QgZ2V0U3VnZ2VzdGlvbnNTaXplKCkgY29uc3Q7CisgICAgdmlydHVhbCBXZWJTdHJpbmcg
Z2V0U3VnZ2VzdGlvbih1bnNpZ25lZCBsaXN0SW5kZXgpIGNvbnN0OworICAgIHZpcnR1YWwgdm9p
ZCByZW1vdmVTdWdnZXN0aW9uQXRJbmRleCh1bnNpZ25lZCBsaXN0SW5kZXgpOworCisgICAgLy8g
V2ViQ29yZTo6UG9wdXBNZW51Q2xpZW50IGltcGxlbWVudGF0aW9uOgorICAgIHZpcnR1YWwgdm9p
ZCBzZWxlY3Rpb25DaGFuZ2VkKHVuc2lnbmVkIGxpc3RJbmRleCwgYm9vbCBmaXJlRXZlbnRzKTsK
KworICAgIHZvaWQgaW5pdGlhbGl6ZShXZWJDb3JlOjpIVE1MSW5wdXRFbGVtZW50KiwKKyAgICAg
ICAgICAgICAgICAgICAgY29uc3QgV2ViVmVjdG9yPFdlYlN0cmluZz4mIG5hbWVzLAorICAgICAg
ICAgICAgICAgICAgICBjb25zdCBXZWJWZWN0b3I8V2ViU3RyaW5nPiYgbGFiZWxzLAorICAgICAg
ICAgICAgICAgICAgICBpbnQgZGVmYXVsdFN1Z2dlc3Rpb25JbmRleCk7CisKKyAgICB2b2lkIHNl
dFN1Z2dlc3Rpb25zKGNvbnN0IFdlYlZlY3RvcjxXZWJTdHJpbmc+JiBuYW1lcywKKyAgICAgICAg
ICAgICAgICAgICAgICAgIGNvbnN0IFdlYlZlY3RvcjxXZWJTdHJpbmc+JiBsYWJlbHMpOworCitw
cml2YXRlOgorICAgIFZlY3RvcjxXZWJDb3JlOjpTdHJpbmc+IG1fbmFtZXM7CisgICAgVmVjdG9y
PFdlYkNvcmU6OlN0cmluZz4gbV9sYWJlbHM7Cit9OworCit9IC8vIG5hbWVzcGFjZSBXZWJLaXQK
KworI2VuZGlmCgpQcm9wZXJ0eSBjaGFuZ2VzIG9uOiBXZWJLaXQvY2hyb21pdW0vc3JjL0F1dG9G
aWxsUG9wdXBNZW51Q2xpZW50LmgKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpBZGRlZDogc3ZuOmVvbC1zdHlsZQogICAr
IExGCgpJbmRleDogV2ViS2l0L2Nocm9taXVtL3NyYy9BdXRvY29tcGxldGVQb3B1cE1lbnVDbGll
bnQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdC9jaHJvbWl1bS9zcmMvQXV0b2NvbXBsZXRlUG9w
dXBNZW51Q2xpZW50LmNwcAkocmV2aXNpb24gNTQ1MDEpCisrKyBXZWJLaXQvY2hyb21pdW0vc3Jj
L0F1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVudC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTEsNSAr
MSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDA5IEdvb2dsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu
YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKQEAgLTQ0LDkgKzQ0
LDcgQEAgdXNpbmcgbmFtZXNwYWNlIFdlYkNvcmU7CiBuYW1lc3BhY2UgV2ViS2l0IHsKIAogQXV0
b2NvbXBsZXRlUG9wdXBNZW51Q2xpZW50OjpBdXRvY29tcGxldGVQb3B1cE1lbnVDbGllbnQoV2Vi
Vmlld0ltcGwqIHdlYlZpZXcpCi0gICAgOiBtX3RleHRGaWVsZCgwKQotICAgICwgbV9zZWxlY3Rl
ZEluZGV4KDApCi0gICAgLCBtX3dlYlZpZXcod2ViVmlldykKKyAgICA6IFN1Z2dlc3Rpb25zUG9w
dXBNZW51Q2xpZW50KHdlYlZpZXcpCiB7CiB9CiAKQEAgLTU0LDk2ICs1MiwzNSBAQCBBdXRvY29t
cGxldGVQb3B1cE1lbnVDbGllbnQ6On5BdXRvY29tcGxlCiB7CiB9CiAKLXZvaWQgQXV0b2NvbXBs
ZXRlUG9wdXBNZW51Q2xpZW50Ojppbml0aWFsaXplKAotICAgIEhUTUxJbnB1dEVsZW1lbnQqIHRl
eHRGaWVsZCwKLSAgICBjb25zdCBXZWJWZWN0b3I8V2ViU3RyaW5nPiYgc3VnZ2VzdGlvbnMsCi0g
ICAgaW50IGRlZmF1bHRTdWdnZXN0aW9uSW5kZXgpCitzaXplX3QgQXV0b2NvbXBsZXRlUG9wdXBN
ZW51Q2xpZW50OjpnZXRTdWdnZXN0aW9uc1NpemUoKSBjb25zdAogewotICAgIEFTU0VSVChkZWZh
dWx0U3VnZ2VzdGlvbkluZGV4IDwgc3RhdGljX2Nhc3Q8aW50PihzdWdnZXN0aW9ucy5zaXplKCkp
KTsKLSAgICBtX3RleHRGaWVsZCA9IHRleHRGaWVsZDsKLSAgICBtX3NlbGVjdGVkSW5kZXggPSBk
ZWZhdWx0U3VnZ2VzdGlvbkluZGV4OwotICAgIHNldFN1Z2dlc3Rpb25zKHN1Z2dlc3Rpb25zKTsK
LQotICAgIEZvbnREZXNjcmlwdGlvbiBmb250RGVzY3JpcHRpb247Ci0gICAgbV93ZWJWaWV3LT50
aGVtZSgpLT5zeXN0ZW1Gb250KENTU1ZhbHVlV2Via2l0Q29udHJvbCwgZm9udERlc2NyaXB0aW9u
KTsKLSAgICAvLyBVc2UgYSBzbWFsbGVyIGZvbnQgc2l6ZSB0byBtYXRjaCBJRS9GaXJlZm94Lgot
ICAgIC8vIEZJWE1FOiBodHRwOi8vY3JidWcuY29tLzczNzYgdXNlIHRoZSBzeXN0ZW0gc2l6ZSBp
bnN0ZWFkIG9mIGEKLSAgICAvLyAgICAgICAgZml4ZWQgZm9udCBzaXplIHZhbHVlLgotICAgIGZv
bnREZXNjcmlwdGlvbi5zZXRDb21wdXRlZFNpemUoMTIuMCk7Ci0gICAgRm9udCBmb250KGZvbnRE
ZXNjcmlwdGlvbiwgMCwgMCk7Ci0gICAgZm9udC51cGRhdGUodGV4dEZpZWxkLT5kb2N1bWVudCgp
LT5zdHlsZVNlbGVjdG9yKCktPmZvbnRTZWxlY3RvcigpKTsKLSAgICAvLyBUaGUgZGlyZWN0aW9u
IG9mIHRleHQgaW4gcG9wdXAgbWVudSBpcyBzZXQgdGhlIHNhbWUgYXMgdGhlIGRpcmVjdGlvbiBv
ZgotICAgIC8vIHRoZSBpbnB1dCBlbGVtZW50OiB0ZXh0RmllbGQuCi0gICAgbV9zdHlsZS5zZXQo
bmV3IFBvcHVwTWVudVN0eWxlKENvbG9yOjpibGFjaywgQ29sb3I6OndoaXRlLCBmb250LCB0cnVl
LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMZW5ndGgoV2ViQ29yZTo6Rml4
ZWQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0RmllbGQtPnJlbmRl
cmVyKCktPnN0eWxlKCktPmRpcmVjdGlvbigpKSk7Ci19Ci0KLXZvaWQgQXV0b2NvbXBsZXRlUG9w
dXBNZW51Q2xpZW50Ojp2YWx1ZUNoYW5nZWQodW5zaWduZWQgbGlzdEluZGV4LCBib29sIGZpcmVF
dmVudHMpCi17Ci0gICAgbV90ZXh0RmllbGQtPnNldFZhbHVlKG1fc3VnZ2VzdGlvbnNbbGlzdElu
ZGV4XSk7Ci0gICAgRWRpdG9yQ2xpZW50SW1wbCogZWRpdG9yID0KLSAgICAgICAgc3RhdGljX2Nh
c3Q8RWRpdG9yQ2xpZW50SW1wbCo+KG1fd2ViVmlldy0+cGFnZSgpLT5lZGl0b3JDbGllbnQoKSk7
Ci0gICAgQVNTRVJUKGVkaXRvcik7Ci0gICAgZWRpdG9yLT5vbkF1dG9maWxsU3VnZ2VzdGlvbkFj
Y2VwdGVkKAotICAgICAgICBzdGF0aWNfY2FzdDxIVE1MSW5wdXRFbGVtZW50Kj4obV90ZXh0Rmll
bGQuZ2V0KCkpKTsKKyAgICByZXR1cm4gbV9zdWdnZXN0aW9ucy5zaXplKCk7CiB9CiAKLVN0cmlu
ZyBBdXRvY29tcGxldGVQb3B1cE1lbnVDbGllbnQ6Oml0ZW1UZXh0KHVuc2lnbmVkIGxpc3RJbmRl
eCkgY29uc3QKK1dlYlN0cmluZyBBdXRvY29tcGxldGVQb3B1cE1lbnVDbGllbnQ6OmdldFN1Z2dl
c3Rpb24odW5zaWduZWQgbGlzdEluZGV4KSBjb25zdAogeworICAgIEFTU0VSVChsaXN0SW5kZXgg
Pj0gMCAmJiBsaXN0SW5kZXggPCBtX3N1Z2dlc3Rpb25zLnNpemUoKSk7CiAgICAgcmV0dXJuIG1f
c3VnZ2VzdGlvbnNbbGlzdEluZGV4XTsKIH0KIAotUG9wdXBNZW51U3R5bGUgQXV0b2NvbXBsZXRl
UG9wdXBNZW51Q2xpZW50OjppdGVtU3R5bGUodW5zaWduZWQgbGlzdEluZGV4KSBjb25zdAotewot
ICAgIHJldHVybiAqbV9zdHlsZTsKLX0KLQotUG9wdXBNZW51U3R5bGUgQXV0b2NvbXBsZXRlUG9w
dXBNZW51Q2xpZW50OjptZW51U3R5bGUoKSBjb25zdAordm9pZCBBdXRvY29tcGxldGVQb3B1cE1l
bnVDbGllbnQ6OnJlbW92ZVN1Z2dlc3Rpb25BdEluZGV4KHVuc2lnbmVkIGxpc3RJbmRleCkKIHsK
LSAgICByZXR1cm4gKm1fc3R5bGU7CisgICAgQVNTRVJUKGxpc3RJbmRleCA+PSAwICYmIGxpc3RJ
bmRleCA8IG1fc3VnZ2VzdGlvbnMuc2l6ZSgpKTsKKyAgICBtX3N1Z2dlc3Rpb25zLnJlbW92ZShs
aXN0SW5kZXgpOwogfQogCi1pbnQgQXV0b2NvbXBsZXRlUG9wdXBNZW51Q2xpZW50OjpjbGllbnRQ
YWRkaW5nTGVmdCgpIGNvbnN0Ci17Ci0gICAgLy8gQnVnIGh0dHA6Ly9jcmJ1Zy5jb20vNzcwOCBz
ZWVtcyB0byBpbmRpY2F0ZSB0aGUgc3R5bGUgY2FuIGJlIDAuCi0gICAgUmVuZGVyU3R5bGUqIHN0
eWxlID0gdGV4dEZpZWxkU3R5bGUoKTsKLSAgICByZXR1cm4gc3R5bGUgPyBtX3dlYlZpZXctPnRo
ZW1lKCktPnBvcHVwSW50ZXJuYWxQYWRkaW5nTGVmdChzdHlsZSkgOiAwOwotfQotCi1pbnQgQXV0
b2NvbXBsZXRlUG9wdXBNZW51Q2xpZW50OjpjbGllbnRQYWRkaW5nUmlnaHQoKSBjb25zdAotewot
ICAgIC8vIEJ1ZyBodHRwOi8vY3JidWcuY29tLzc3MDggc2VlbXMgdG8gaW5kaWNhdGUgdGhlIHN0
eWxlIGNhbiBiZSAwLgotICAgIFJlbmRlclN0eWxlKiBzdHlsZSA9IHRleHRGaWVsZFN0eWxlKCk7
Ci0gICAgcmV0dXJuIHN0eWxlID8gbV93ZWJWaWV3LT50aGVtZSgpLT5wb3B1cEludGVybmFsUGFk
ZGluZ1JpZ2h0KHN0eWxlKSA6IDA7Ci19Ci0KLXZvaWQgQXV0b2NvbXBsZXRlUG9wdXBNZW51Q2xp
ZW50Ojpwb3B1cERpZEhpZGUoKQotewotICAgIG1fd2ViVmlldy0+c3VnZ2VzdGlvbnNQb3B1cERp
ZEhpZGUoKTsKLX0KLQotdm9pZCBBdXRvY29tcGxldGVQb3B1cE1lbnVDbGllbnQ6OnNldFRleHRG
cm9tSXRlbSh1bnNpZ25lZCBsaXN0SW5kZXgpCi17Ci0gICAgbV90ZXh0RmllbGQtPnNldFZhbHVl
KG1fc3VnZ2VzdGlvbnNbbGlzdEluZGV4XSk7Ci19Ci0KLUZvbnRTZWxlY3RvciogQXV0b2NvbXBs
ZXRlUG9wdXBNZW51Q2xpZW50Ojpmb250U2VsZWN0b3IoKSBjb25zdAordm9pZCBBdXRvY29tcGxl
dGVQb3B1cE1lbnVDbGllbnQ6OmluaXRpYWxpemUoCisgICAgSFRNTElucHV0RWxlbWVudCogdGV4
dEZpZWxkLAorICAgIGNvbnN0IFdlYlZlY3RvcjxXZWJTdHJpbmc+JiBzdWdnZXN0aW9ucywKKyAg
ICBpbnQgZGVmYXVsdFN1Z2dlc3Rpb25JbmRleCkKIHsKLSAgICByZXR1cm4gbV90ZXh0RmllbGQt
PmRvY3VtZW50KCktPnN0eWxlU2VsZWN0b3IoKS0+Zm9udFNlbGVjdG9yKCk7Ci19CisgICAgQVNT
RVJUKGRlZmF1bHRTdWdnZXN0aW9uSW5kZXggPCBzdGF0aWNfY2FzdDxpbnQ+KHN1Z2dlc3Rpb25z
LnNpemUoKSkpOwogCi1Ib3N0V2luZG93KiBBdXRvY29tcGxldGVQb3B1cE1lbnVDbGllbnQ6Omhv
c3RXaW5kb3coKSBjb25zdAotewotICAgIHJldHVybiBtX3RleHRGaWVsZC0+ZG9jdW1lbnQoKS0+
dmlldygpLT5ob3N0V2luZG93KCk7Ci19CisgICAgLy8gVGhlIHN1Z2dlc3Rpb25zIG11c3QgYmUg
c2V0IGJlZm9yZSBpbml0aWFsaXppbmcgdGhlCisgICAgLy8gU3VnZ2VzdGlvbnNQb3B1cE1lbnVD
bGllbnQuCisgICAgc2V0U3VnZ2VzdGlvbnMoc3VnZ2VzdGlvbnMpOwogCi1QYXNzUmVmUHRyPFNj
cm9sbGJhcj4gQXV0b2NvbXBsZXRlUG9wdXBNZW51Q2xpZW50OjpjcmVhdGVTY3JvbGxiYXIoCi0g
ICAgU2Nyb2xsYmFyQ2xpZW50KiBjbGllbnQsCi0gICAgU2Nyb2xsYmFyT3JpZW50YXRpb24gb3Jp
ZW50YXRpb24sCi0gICAgU2Nyb2xsYmFyQ29udHJvbFNpemUgc2l6ZSkKLXsKLSAgICByZXR1cm4g
U2Nyb2xsYmFyOjpjcmVhdGVOYXRpdmVTY3JvbGxiYXIoY2xpZW50LCBvcmllbnRhdGlvbiwgc2l6
ZSk7CisgICAgU3VnZ2VzdGlvbnNQb3B1cE1lbnVDbGllbnQ6OmluaXRpYWxpemUodGV4dEZpZWxk
LCBkZWZhdWx0U3VnZ2VzdGlvbkluZGV4KTsKIH0KIAogdm9pZCBBdXRvY29tcGxldGVQb3B1cE1l
bnVDbGllbnQ6OnNldFN1Z2dlc3Rpb25zKGNvbnN0IFdlYlZlY3RvcjxXZWJTdHJpbmc+JiBzdWdn
ZXN0aW9ucykKQEAgLTE1MSwyOCArODgsMTAgQEAgdm9pZCBBdXRvY29tcGxldGVQb3B1cE1lbnVD
bGllbnQ6OnNldFN1ZwogICAgIG1fc3VnZ2VzdGlvbnMuY2xlYXIoKTsKICAgICBmb3IgKHNpemVf
dCBpID0gMDsgaSA8IHN1Z2dlc3Rpb25zLnNpemUoKTsgKytpKQogICAgICAgICBtX3N1Z2dlc3Rp
b25zLmFwcGVuZChzdWdnZXN0aW9uc1tpXSk7Ci0gICAgLy8gVHJ5IHRvIHByZXNlcnZlIHNlbGVj
dGlvbiBpZiBwb3NzaWJsZS4KLSAgICBpZiAobV9zZWxlY3RlZEluZGV4ID49IHN0YXRpY19jYXN0
PGludD4oc3VnZ2VzdGlvbnMuc2l6ZSgpKSkKLSAgICAgICAgbV9zZWxlY3RlZEluZGV4ID0gLTE7
Ci19CiAKLXZvaWQgQXV0b2NvbXBsZXRlUG9wdXBNZW51Q2xpZW50OjpyZW1vdmVJdGVtQXRJbmRl
eChpbnQgaW5kZXgpCi17Ci0gICAgQVNTRVJUKGluZGV4ID49IDAgJiYgaW5kZXggPCBzdGF0aWNf
Y2FzdDxpbnQ+KG1fc3VnZ2VzdGlvbnMuc2l6ZSgpKSk7Ci0gICAgbV9zdWdnZXN0aW9ucy5yZW1v
dmUoaW5kZXgpOwotfQotCi1SZW5kZXJTdHlsZSogQXV0b2NvbXBsZXRlUG9wdXBNZW51Q2xpZW50
Ojp0ZXh0RmllbGRTdHlsZSgpIGNvbnN0Ci17Ci0gICAgUmVuZGVyU3R5bGUqIHN0eWxlID0gbV90
ZXh0RmllbGQtPmNvbXB1dGVkU3R5bGUoKTsKLSAgICBpZiAoIXN0eWxlKSB7Ci0gICAgICAgIC8v
IEl0IHNlZW1zIHdlIGNhbiBvbmx5IGhhdmUgYSAwIHN0eWxlIGluIGEgVGV4dEZpZWxkIGlmIHRo
ZQotICAgICAgICAvLyBub2RlIGlzIGRldGFjaGVkLCBpbiB3aGljaCBjYXNlIHdlIHRoZSBwb3B1
cCBzaG91ZCBub3QgYmUKLSAgICAgICAgLy8gc2hvd2luZy4gIFBsZWFzZSByZXBvcnQgdGhpcyBp
biBodHRwOi8vY3JidWcuY29tLzc3MDggYW5kCi0gICAgICAgIC8vIGluY2x1ZGUgdGhlIHBhZ2Ug
eW91IHdlcmUgdmlzaXRpbmcuCi0gICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwotICAgIH0K
LSAgICByZXR1cm4gc3R5bGU7CisgICAgLy8gVHJ5IHRvIHByZXNlcnZlIHNlbGVjdGlvbiBpZiBw
b3NzaWJsZS4KKyAgICBpZiAoZ2V0U2VsZWN0ZWRJbmRleCgpID49IHN0YXRpY19jYXN0PGludD4o
c3VnZ2VzdGlvbnMuc2l6ZSgpKSkKKyAgICAgICAgc2V0U2VsZWN0ZWRJbmRleCgtMSk7CiB9CiAK
IH0gLy8gbmFtZXNwYWNlIFdlYktpdApJbmRleDogV2ViS2l0L2Nocm9taXVtL3NyYy9BdXRvY29t
cGxldGVQb3B1cE1lbnVDbGllbnQuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQvY2hyb21pdW0vc3Jj
L0F1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVudC5oCShyZXZpc2lvbiA1NDUwMSkKKysrIFdlYktp
dC9jaHJvbWl1bS9zcmMvQXV0b2NvbXBsZXRlUG9wdXBNZW51Q2xpZW50LmgJKHdvcmtpbmcgY29w
eSkKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDA5IEdvb2dsZSBJbmMu
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4g
QWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv
dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICAqIG1vZGlmaWNhdGlvbiwg
YXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUK
QEAgLTI4LDcgKzI4LDEwIEBACiAgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQg
T0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgogICovCiAKLSNpbmNsdWRlICJQb3B1
cE1lbnVDbGllbnQuaCIKKyNpZm5kZWYgQXV0b2NvbXBsZXRlUG9wdXBNZW51Q2xpZW50X2gKKyNk
ZWZpbmUgQXV0b2NvbXBsZXRlUG9wdXBNZW51Q2xpZW50X2gKKyAKKyNpbmNsdWRlICJTdWdnZXN0
aW9uc1BvcHVwTWVudUNsaWVudC5oIgogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiBjbGFzcyBIVE1M
SW5wdXRFbGVtZW50OwpAQCAtNDIsNTUgKzQ1LDI2IEBAIGNsYXNzIFdlYlZpZXdJbXBsOwogdGVt
cGxhdGUgPHR5cGVuYW1lIFQ+IGNsYXNzIFdlYlZlY3RvcjsKIAogLy8gQXV0b2NvbXBsZXRlUG9w
dXBNZW51Q2xpZW50Ci1jbGFzcyBBdXRvY29tcGxldGVQb3B1cE1lbnVDbGllbnQgOiBwdWJsaWMg
V2ViQ29yZTo6UG9wdXBNZW51Q2xpZW50IHsKK2NsYXNzIEF1dG9jb21wbGV0ZVBvcHVwTWVudUNs
aWVudCA6IHB1YmxpYyBTdWdnZXN0aW9uc1BvcHVwTWVudUNsaWVudCB7CiBwdWJsaWM6Ci0gICAg
QXV0b2NvbXBsZXRlUG9wdXBNZW51Q2xpZW50KFdlYlZpZXdJbXBsKiB3ZWJ2aWV3KTsKLSAgICB+
QXV0b2NvbXBsZXRlUG9wdXBNZW51Q2xpZW50KCk7CisgICAgQXV0b2NvbXBsZXRlUG9wdXBNZW51
Q2xpZW50KFdlYlZpZXdJbXBsKiB3ZWJWaWV3KTsKKyAgICB2aXJ0dWFsIH5BdXRvY29tcGxldGVQ
b3B1cE1lbnVDbGllbnQoKTsKKworICAgIC8vIFN1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50IGlt
cGxlbWVudGF0aW9uOgorICAgIHZpcnR1YWwgc2l6ZV90IGdldFN1Z2dlc3Rpb25zU2l6ZSgpIGNv
bnN0OworICAgIHZpcnR1YWwgV2ViU3RyaW5nIGdldFN1Z2dlc3Rpb24odW5zaWduZWQgbGlzdElu
ZGV4KSBjb25zdDsKKyAgICB2aXJ0dWFsIHZvaWQgcmVtb3ZlU3VnZ2VzdGlvbkF0SW5kZXgodW5z
aWduZWQgbGlzdEluZGV4KTsKIAogICAgIHZvaWQgaW5pdGlhbGl6ZShXZWJDb3JlOjpIVE1MSW5w
dXRFbGVtZW50KiwKICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2ViVmVjdG9yPFdlYlN0cmlu
Zz4mIHN1Z2dlc3Rpb25zLAogICAgICAgICAgICAgICAgICAgICBpbnQgZGVmYXVsdFN1Z2dlc3Rp
b25JbmRleCk7CiAKLSAgICBXZWJDb3JlOjpIVE1MSW5wdXRFbGVtZW50KiB0ZXh0RmllbGQoKSBj
b25zdCB7IHJldHVybiBtX3RleHRGaWVsZC5nZXQoKTsgfQotCiAgICAgdm9pZCBzZXRTdWdnZXN0
aW9ucyhjb25zdCBXZWJWZWN0b3I8V2ViU3RyaW5nPiYpOwotICAgIHZvaWQgcmVtb3ZlSXRlbUF0
SW5kZXgoaW50IGluZGV4KTsKLQotICAgIC8vIFdlYkNvcmU6OlBvcHVwTWVudUNsaWVudCBtZXRo
b2RzOgotICAgIHZpcnR1YWwgdm9pZCB2YWx1ZUNoYW5nZWQodW5zaWduZWQgbGlzdEluZGV4LCBi
b29sIGZpcmVFdmVudHMgPSB0cnVlKTsKLSAgICB2aXJ0dWFsIFdlYkNvcmU6OlN0cmluZyBpdGVt
VGV4dCh1bnNpZ25lZCBsaXN0SW5kZXgpIGNvbnN0OwotICAgIHZpcnR1YWwgV2ViQ29yZTo6U3Ry
aW5nIGl0ZW1Ub29sVGlwKHVuc2lnbmVkIGxhc3RJbmRleCkgY29uc3QgeyByZXR1cm4gV2ViQ29y
ZTo6U3RyaW5nKCk7IH0KLSAgICB2aXJ0dWFsIGJvb2wgaXRlbUlzRW5hYmxlZCh1bnNpZ25lZCBs
aXN0SW5kZXgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KLSAgICB2aXJ0dWFsIFdlYkNvcmU6OlBv
cHVwTWVudVN0eWxlIGl0ZW1TdHlsZSh1bnNpZ25lZCBsaXN0SW5kZXgpIGNvbnN0OwotICAgIHZp
cnR1YWwgV2ViQ29yZTo6UG9wdXBNZW51U3R5bGUgbWVudVN0eWxlKCkgY29uc3Q7Ci0gICAgdmly
dHVhbCBpbnQgY2xpZW50SW5zZXRMZWZ0KCkgY29uc3QgeyByZXR1cm4gMDsgfQotICAgIHZpcnR1
YWwgaW50IGNsaWVudEluc2V0UmlnaHQoKSBjb25zdCB7IHJldHVybiAwOyB9Ci0gICAgdmlydHVh
bCBpbnQgY2xpZW50UGFkZGluZ0xlZnQoKSBjb25zdDsKLSAgICB2aXJ0dWFsIGludCBjbGllbnRQ
YWRkaW5nUmlnaHQoKSBjb25zdDsKLSAgICB2aXJ0dWFsIGludCBsaXN0U2l6ZSgpIGNvbnN0IHsg
cmV0dXJuIG1fc3VnZ2VzdGlvbnMuc2l6ZSgpOyB9Ci0gICAgdmlydHVhbCBpbnQgc2VsZWN0ZWRJ
bmRleCgpIGNvbnN0IHsgcmV0dXJuIG1fc2VsZWN0ZWRJbmRleDsgfQotICAgIHZpcnR1YWwgdm9p
ZCBwb3B1cERpZEhpZGUoKTsKLSAgICB2aXJ0dWFsIGJvb2wgaXRlbUlzU2VwYXJhdG9yKHVuc2ln
bmVkIGxpc3RJbmRleCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLSAgICB2aXJ0dWFsIGJvb2wg
aXRlbUlzTGFiZWwodW5zaWduZWQgbGlzdEluZGV4KSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQot
ICAgIHZpcnR1YWwgYm9vbCBpdGVtSXNTZWxlY3RlZCh1bnNpZ25lZCBsaXN0SW5kZXgpIGNvbnN0
IHsgcmV0dXJuIGZhbHNlOyB9Ci0gICAgdmlydHVhbCBib29sIHNob3VsZFBvcE92ZXIoKSBjb25z
dCB7IHJldHVybiBmYWxzZTsgfQotICAgIHZpcnR1YWwgYm9vbCB2YWx1ZVNob3VsZENoYW5nZU9u
SG90VHJhY2soKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotICAgIHZpcnR1YWwgdm9pZCBzZXRU
ZXh0RnJvbUl0ZW0odW5zaWduZWQgbGlzdEluZGV4KTsKLSAgICB2aXJ0dWFsIFdlYkNvcmU6OkZv
bnRTZWxlY3RvciogZm9udFNlbGVjdG9yKCkgY29uc3Q7Ci0gICAgdmlydHVhbCBXZWJDb3JlOjpI
b3N0V2luZG93KiBob3N0V2luZG93KCkgY29uc3Q7Ci0gICAgdmlydHVhbCBQYXNzUmVmUHRyPFdl
YkNvcmU6OlNjcm9sbGJhcj4gY3JlYXRlU2Nyb2xsYmFyKAotICAgICAgICBXZWJDb3JlOjpTY3Jv
bGxiYXJDbGllbnQqIGNsaWVudCwKLSAgICAgICAgV2ViQ29yZTo6U2Nyb2xsYmFyT3JpZW50YXRp
b24gb3JpZW50YXRpb24sCi0gICAgICAgIFdlYkNvcmU6OlNjcm9sbGJhckNvbnRyb2xTaXplIHNp
emUpOwogCiBwcml2YXRlOgotICAgIFdlYkNvcmU6OlJlbmRlclN0eWxlKiB0ZXh0RmllbGRTdHls
ZSgpIGNvbnN0OwotCi0gICAgUmVmUHRyPFdlYkNvcmU6OkhUTUxJbnB1dEVsZW1lbnQ+IG1fdGV4
dEZpZWxkOwogICAgIFZlY3RvcjxXZWJDb3JlOjpTdHJpbmc+IG1fc3VnZ2VzdGlvbnM7Ci0gICAg
aW50IG1fc2VsZWN0ZWRJbmRleDsKLSAgICBXZWJWaWV3SW1wbCogbV93ZWJWaWV3OwotICAgIE93
blB0cjxXZWJDb3JlOjpQb3B1cE1lbnVTdHlsZT4gbV9zdHlsZTsKIH07CiAKIH0gLy8gbmFtZXNw
YWNlIFdlYktpdAorCisjZW5kaWYKSW5kZXg6IFdlYktpdC9jaHJvbWl1bS9zcmMvU3VnZ2VzdGlv
bnNQb3B1cE1lbnVDbGllbnQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdC9jaHJvbWl1bS9zcmMv
U3VnZ2VzdGlvbnNQb3B1cE1lbnVDbGllbnQuY3BwCShyZXZpc2lvbiAwKQorKysgV2ViS2l0L2No
cm9taXVtL3NyYy9TdWdnZXN0aW9uc1BvcHVwTWVudUNsaWVudC5jcHAJKHJldmlzaW9uIDApCkBA
IC0wLDAgKzEsMjQ2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3Vy
Y2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFy
ZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisg
KiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3Qg
cmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0
aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdo
dCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJv
dmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5h
bWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBt
YXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisg
KiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9u
LgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xE
RVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJ
RUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1Q
TElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEg
UEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUg
Q09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElS
RUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09O
U0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBS
T0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAor
ICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENB
VVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRS
QUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0Ug
T1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRI
SVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBE
QU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIlN1Z2dlc3Rpb25z
UG9wdXBNZW51Q2xpZW50LmgiCisKKy8vIFRPRE8oamhhd2tpbnMpOiBNYWtlIHN1cmUgd2UgbmVl
ZCBhbGwgb2YgdGhlc2UgaW5jbHVkZXMuCisjaW5jbHVkZSAiQ1NTU3R5bGVTZWxlY3Rvci5oIgor
I2luY2x1ZGUgIkNTU1ZhbHVlS2V5d29yZHMuaCIKKyNpbmNsdWRlICJGcmFtZVZpZXcuaCIKKyNp
bmNsdWRlICJIVE1MSW5wdXRFbGVtZW50LmgiCisjaW5jbHVkZSAiUmVuZGVyVGhlbWUuaCIKKyNp
bmNsdWRlICJXZWJWZWN0b3IuaCIKKyNpbmNsdWRlICJXZWJWaWV3SW1wbC5oIgorCit1c2luZyBu
YW1lc3BhY2UgV2ViQ29yZTsKKworbmFtZXNwYWNlIFdlYktpdCB7CisKK1N1Z2dlc3Rpb25zUG9w
dXBNZW51Q2xpZW50OjpTdWdnZXN0aW9uc1BvcHVwTWVudUNsaWVudChXZWJWaWV3SW1wbCogd2Vi
VmlldykKKyAgICA6IG1fdGV4dEZpZWxkKE5VTEwpCisgICAgLCBtX3NlbGVjdGVkSW5kZXgoMCkK
KyAgICAsIG1fd2ViVmlldyh3ZWJWaWV3KQoreworfQorCitTdWdnZXN0aW9uc1BvcHVwTWVudUNs
aWVudDo6flN1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50KCkKK3sKK30KKworLy8gVE9ETyhqaGF3
a2lucyk6IEltcGxlbWVudCB0aGlzIHBlciBjaGlsZCBjbGFzcz8KK3ZvaWQgU3VnZ2VzdGlvbnNQ
b3B1cE1lbnVDbGllbnQ6OnZhbHVlQ2hhbmdlZCh1bnNpZ25lZCBsaXN0SW5kZXgsIGJvb2wgZmly
ZUV2ZW50cykKK3sKKyAgICBtX3RleHRGaWVsZC0+c2V0VmFsdWUoZ2V0U3VnZ2VzdGlvbihsaXN0
SW5kZXgpKTsKKworICAgIEVkaXRvckNsaWVudEltcGwqIGVkaXRvciA9CisgICAgICAgIHN0YXRp
Y19jYXN0PEVkaXRvckNsaWVudEltcGwqPihtX3dlYlZpZXctPnBhZ2UoKS0+ZWRpdG9yQ2xpZW50
KCkpOworICAgIEFTU0VSVChlZGl0b3IpOworICAgIGVkaXRvci0+b25BdXRvZmlsbFN1Z2dlc3Rp
b25BY2NlcHRlZCgKKyAgICAgICAgc3RhdGljX2Nhc3Q8SFRNTElucHV0RWxlbWVudCo+KG1fdGV4
dEZpZWxkLmdldCgpKSk7Cit9CisKK3ZvaWQgU3VnZ2VzdGlvbnNQb3B1cE1lbnVDbGllbnQ6OnNl
bGVjdGlvbkNoYW5nZWQodW5zaWduZWQgbGlzdEluZGV4LCBib29sIGZpcmVFdmVudHMpCit7Cisg
ICAgcHJpbnRmKCJzZWxlY3Rpb25DaGFuZ2VkXG4iKTsKKyAgICBpZiAobGlzdEluZGV4ICE9IHN0
YXRpY19jYXN0PHVuc2lnbmVkPigtMSkpIHsKKyAgICAgICAgY29uc3QgV2ViU3RyaW5nJiBzdWdn
ZXN0aW9uID0gZ2V0U3VnZ2VzdGlvbihsaXN0SW5kZXgpOworICAgICAgICBzZXRTdWdnZXN0ZWRW
YWx1ZShzdWdnZXN0aW9uKTsKKyAgICB9IGVsc2UgeworICAgICAgbV90ZXh0RmllbGQtPnNldFZh
bHVlKG1fdHlwZWRGaWVsZFZhbHVlKTsKKyAgICAgIGlmIChtX2xhc3RGaWVsZFZhbHVlcy0+Y29u
dGFpbnMobV90ZXh0RmllbGQtPm5hbWUoKSkpCisgICAgICAgICAgbV9sYXN0RmllbGRWYWx1ZXMt
PnNldChtX3RleHRGaWVsZC0+bmFtZSgpLCBtX3R5cGVkRmllbGRWYWx1ZSk7CisgICAgICBlbHNl
CisgICAgICAgICAgbV9sYXN0RmllbGRWYWx1ZXMtPmFkZChtX3RleHRGaWVsZC0+bmFtZSgpLCBt
X3R5cGVkRmllbGRWYWx1ZSk7CisgICAgfQorfQorCitTdHJpbmcgU3VnZ2VzdGlvbnNQb3B1cE1l
bnVDbGllbnQ6Oml0ZW1UZXh0KHVuc2lnbmVkIGxpc3RJbmRleCkgY29uc3QKK3sKKyAgICByZXR1
cm4gZ2V0U3VnZ2VzdGlvbihsaXN0SW5kZXgpOworfQorCitQb3B1cE1lbnVTdHlsZSBTdWdnZXN0
aW9uc1BvcHVwTWVudUNsaWVudDo6aXRlbVN0eWxlKHVuc2lnbmVkIGxpc3RJbmRleCkgY29uc3QK
K3sKKyAgICByZXR1cm4gKm1fc3R5bGU7Cit9CisKK1BvcHVwTWVudVN0eWxlIFN1Z2dlc3Rpb25z
UG9wdXBNZW51Q2xpZW50OjptZW51U3R5bGUoKSBjb25zdAoreworICAgIHJldHVybiAqbV9zdHls
ZTsKK30KKworaW50IFN1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50OjpjbGllbnRQYWRkaW5nTGVm
dCgpIGNvbnN0Cit7CisgICAgLy8gQnVnIGh0dHA6Ly9jcmJ1Zy5jb20vNzcwOCBzZWVtcyB0byBp
bmRpY2F0ZSB0aGUgc3R5bGUgY2FuIGJlIDAuCisgICAgUmVuZGVyU3R5bGUqIHN0eWxlID0gdGV4
dEZpZWxkU3R5bGUoKTsKKyAgICByZXR1cm4gc3R5bGUgPyBtX3dlYlZpZXctPnRoZW1lKCktPnBv
cHVwSW50ZXJuYWxQYWRkaW5nTGVmdChzdHlsZSkgOiAwOworfQorCitpbnQgU3VnZ2VzdGlvbnNQ
b3B1cE1lbnVDbGllbnQ6OmNsaWVudFBhZGRpbmdSaWdodCgpIGNvbnN0Cit7CisgICAgLy8gQnVn
IGh0dHA6Ly9jcmJ1Zy5jb20vNzcwOCBzZWVtcyB0byBpbmRpY2F0ZSB0aGUgc3R5bGUgY2FuIGJl
IDAuCisgICAgUmVuZGVyU3R5bGUqIHN0eWxlID0gdGV4dEZpZWxkU3R5bGUoKTsKKyAgICByZXR1
cm4gc3R5bGUgPyBtX3dlYlZpZXctPnRoZW1lKCktPnBvcHVwSW50ZXJuYWxQYWRkaW5nUmlnaHQo
c3R5bGUpIDogMDsKK30KKwordm9pZCBTdWdnZXN0aW9uc1BvcHVwTWVudUNsaWVudDo6cG9wdXBE
aWRIaWRlKCkKK3sKKyNpZiAwCisgICAgaWYgKGFjY2VwdFN1Z2dlc3Rpb25zKSB7CisgICAgICAg
IFN0cmluZyBzdWdnZXN0ZWRWYWx1ZSA9IG1fdGV4dEZpZWxkLT5zdWdnZXN0ZWRWYWx1ZSgpOwor
ICAgICAgICBpZiAoIXN1Z2dlc3RlZFZhbHVlLmlzTnVsbCgpKQorICAgICAgICAgICAgbV90ZXh0
RmllbGQtPnNldFZhbHVlKHN1Z2dlc3RlZFZhbHVlKTsKKyAgICB9IGVsc2UKKyNlbmRpZgorICAg
ICAgICBtX3RleHRGaWVsZC0+c2V0VmFsdWUobV90eXBlZEZpZWxkVmFsdWUpOworCisgICAgcmVz
ZXRMYXN0U3VnZ2VzdGlvbigpOworICAgIG1fd2ViVmlldy0+c3VnZ2VzdGlvbnNQb3B1cERpZEhp
ZGUoKTsKK30KKwordm9pZCBTdWdnZXN0aW9uc1BvcHVwTWVudUNsaWVudDo6c2V0VGV4dEZyb21J
dGVtKHVuc2lnbmVkIGxpc3RJbmRleCkKK3sKKyAgICBtX3RleHRGaWVsZC0+c2V0VmFsdWUoZ2V0
U3VnZ2VzdGlvbihsaXN0SW5kZXgpKTsKKyAgICByZXNldExhc3RTdWdnZXN0aW9uKCk7Cit9CisK
K3ZvaWQgU3VnZ2VzdGlvbnNQb3B1cE1lbnVDbGllbnQ6OnJlc2V0TGFzdFN1Z2dlc3Rpb24oKQor
eworICAgIGlmIChtX2xhc3RGaWVsZFZhbHVlcy0+Y29udGFpbnMobV90ZXh0RmllbGQtPm5hbWUo
KSkpCisgICAgICAgIG1fbGFzdEZpZWxkVmFsdWVzLT5zZXQobV90ZXh0RmllbGQtPm5hbWUoKSwg
bV90ZXh0RmllbGQtPnZhbHVlKCkpOworICAgIGVsc2UKKyAgICAgICAgbV9sYXN0RmllbGRWYWx1
ZXMtPmFkZChtX3RleHRGaWVsZC0+bmFtZSgpLCBtX3RleHRGaWVsZC0+dmFsdWUoKSk7Cit9CisK
K0ZvbnRTZWxlY3RvciogU3VnZ2VzdGlvbnNQb3B1cE1lbnVDbGllbnQ6OmZvbnRTZWxlY3Rvcigp
IGNvbnN0Cit7CisgICAgcmV0dXJuIG1fdGV4dEZpZWxkLT5kb2N1bWVudCgpLT5zdHlsZVNlbGVj
dG9yKCktPmZvbnRTZWxlY3RvcigpOworfQorCitIb3N0V2luZG93KiBTdWdnZXN0aW9uc1BvcHVw
TWVudUNsaWVudDo6aG9zdFdpbmRvdygpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fdGV4dEZpZWxk
LT5kb2N1bWVudCgpLT52aWV3KCktPmhvc3RXaW5kb3coKTsKK30KKworUGFzc1JlZlB0cjxTY3Jv
bGxiYXI+IFN1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50OjpjcmVhdGVTY3JvbGxiYXIoCisgICAg
U2Nyb2xsYmFyQ2xpZW50KiBjbGllbnQsCisgICAgU2Nyb2xsYmFyT3JpZW50YXRpb24gb3JpZW50
YXRpb24sCisgICAgU2Nyb2xsYmFyQ29udHJvbFNpemUgc2l6ZSkKK3sKKyAgICByZXR1cm4gU2Ny
b2xsYmFyOjpjcmVhdGVOYXRpdmVTY3JvbGxiYXIoY2xpZW50LCBvcmllbnRhdGlvbiwgc2l6ZSk7
Cit9CisKK1JlbmRlclN0eWxlKiBTdWdnZXN0aW9uc1BvcHVwTWVudUNsaWVudDo6dGV4dEZpZWxk
U3R5bGUoKSBjb25zdAoreworICAgIFJlbmRlclN0eWxlKiBzdHlsZSA9IG1fdGV4dEZpZWxkLT5j
b21wdXRlZFN0eWxlKCk7CisgICAgaWYgKCFzdHlsZSkgeworICAgICAgICAvLyBJdCBzZWVtcyB3
ZSBjYW4gb25seSBoYXZlIGEgMCBzdHlsZSBpbiBhIFRleHRGaWVsZCBpZiB0aGUKKyAgICAgICAg
Ly8gbm9kZSBpcyBkZXRhY2hlZCwgaW4gd2hpY2ggY2FzZSB3ZSB0aGUgcG9wdXAgc2hvdWQgbm90
IGJlCisgICAgICAgIC8vIHNob3dpbmcuICBQbGVhc2UgcmVwb3J0IHRoaXMgaW4gaHR0cDovL2Ny
YnVnLmNvbS83NzA4IGFuZAorICAgICAgICAvLyBpbmNsdWRlIHRoZSBwYWdlIHlvdSB3ZXJlIHZp
c2l0aW5nLgorICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICB9CisgICAgcmV0dXJu
IHN0eWxlOworfQorCit2b2lkIFN1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50Ojppbml0aWFsaXpl
KEhUTUxJbnB1dEVsZW1lbnQqIHRleHRGaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgaW50IGRlZmF1bHRTdWdnZXN0aW9uSW5kZXgpCit7CisgICAgaWYg
KCFtX2xhc3RGaWVsZFZhbHVlcykKKyAgICAgICAgbV9sYXN0RmllbGRWYWx1ZXMuc2V0KG5ldyBG
aWVsZFZhbHVlc01hcCk7CisKKyAgICBtX3RleHRGaWVsZCA9IHRleHRGaWVsZDsKKyAgICBtX3R5
cGVkRmllbGRWYWx1ZSA9IHRleHRGaWVsZC0+dmFsdWUoKTsKKyAgICBtX3NlbGVjdGVkSW5kZXgg
PSBkZWZhdWx0U3VnZ2VzdGlvbkluZGV4OworCisgICAgc2V0SW5pdGlhbFN1Z2dlc3Rpb24oKTsK
KworICAgIEZvbnREZXNjcmlwdGlvbiBmb250RGVzY3JpcHRpb247CisgICAgbV93ZWJWaWV3LT50
aGVtZSgpLT5zeXN0ZW1Gb250KENTU1ZhbHVlV2Via2l0Q29udHJvbCwgZm9udERlc2NyaXB0aW9u
KTsKKyAgICAvLyBVc2UgYSBzbWFsbGVyIGZvbnQgc2l6ZSB0byBtYXRjaCBJRS9GaXJlZm94Lgor
ICAgIC8vIEZJWE1FOiBodHRwOi8vY3JidWcuY29tLzczNzYgdXNlIHRoZSBzeXN0ZW0gc2l6ZSBp
bnN0ZWFkIG9mIGEKKyAgICAvLyAgICAgICAgZml4ZWQgZm9udCBzaXplIHZhbHVlLgorICAgIGZv
bnREZXNjcmlwdGlvbi5zZXRDb21wdXRlZFNpemUoMTIuMCk7CisgICAgRm9udCBmb250KGZvbnRE
ZXNjcmlwdGlvbiwgMCwgMCk7CisgICAgZm9udC51cGRhdGUodGV4dEZpZWxkLT5kb2N1bWVudCgp
LT5zdHlsZVNlbGVjdG9yKCktPmZvbnRTZWxlY3RvcigpKTsKKyAgICAvLyBUaGUgZGlyZWN0aW9u
IG9mIHRleHQgaW4gcG9wdXAgbWVudSBpcyBzZXQgdGhlIHNhbWUgYXMgdGhlIGRpcmVjdGlvbiBv
ZgorICAgIC8vIHRoZSBpbnB1dCBlbGVtZW50OiB0ZXh0RmllbGQuCisgICAgbV9zdHlsZS5zZXQo
bmV3IFBvcHVwTWVudVN0eWxlKENvbG9yOjpibGFjaywgQ29sb3I6OndoaXRlLCBmb250LCB0cnVl
LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMZW5ndGgoV2ViQ29yZTo6Rml4
ZWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0RmllbGQtPnJlbmRl
cmVyKCktPnN0eWxlKCktPmRpcmVjdGlvbigpKSk7Cit9CisKK3ZvaWQgU3VnZ2VzdGlvbnNQb3B1
cE1lbnVDbGllbnQ6OnNldEluaXRpYWxTdWdnZXN0aW9uKCkKK3sKKyAgICBpZiAoIWdldFN1Z2dl
c3Rpb25zU2l6ZSgpIHx8ICFtX3RleHRGaWVsZC0+bmFtZSgpLmxlbmd0aCgpIHx8ICFtX3R5cGVk
RmllbGRWYWx1ZS5sZW5ndGgoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgaW50IG5ld0luZGV4
ID0gbV9zZWxlY3RlZEluZGV4ID49IDAgPyBtX3NlbGVjdGVkSW5kZXggOiAwOworICAgIGNvbnN0
IFN0cmluZyYgc3VnZ2VzdGlvbiA9IGdldFN1Z2dlc3Rpb24obmV3SW5kZXgpOworICAgIGJvb2wg
aGFzUHJldmlvdXNWYWx1ZSA9IG1fbGFzdEZpZWxkVmFsdWVzLT5jb250YWlucyhtX3RleHRGaWVs
ZC0+bmFtZSgpKTsKKworICAgIFN0cmluZyBwcmV2VmFsdWU7CisgICAgaWYgKGhhc1ByZXZpb3Vz
VmFsdWUpCisgICAgICAgIHByZXZWYWx1ZSA9IG1fbGFzdEZpZWxkVmFsdWVzLT5nZXQobV90ZXh0
RmllbGQtPm5hbWUoKSk7CisKKyAgICBpZiAoIWhhc1ByZXZpb3VzVmFsdWUgfHwgbV90eXBlZEZp
ZWxkVmFsdWUubGVuZ3RoKCkgPiBtX2xhc3RGaWVsZFZhbHVlcy0+Z2V0KG1fdGV4dEZpZWxkLT5u
YW1lKCkpLmxlbmd0aCgpKSB7CisgICAgICAgICAgaWYgKHN1Z2dlc3Rpb24uc3RhcnRzV2l0aCht
X3R5cGVkRmllbGRWYWx1ZSkpCisgICAgICAgICAgICAgIG1fc2VsZWN0ZWRJbmRleCA9IG5ld0lu
ZGV4OworCisgICAgICAgICAgaW50IHN0YXJ0ID0gMDsKKyAgICAgICAgICBTdHJpbmcgbmV3U3Vn
Z2VzdGlvbiA9IHN1Z2dlc3Rpb247CisgICAgICAgICAgaWYgKHN1Z2dlc3Rpb24uc3RhcnRzV2l0
aChtX3R5cGVkRmllbGRWYWx1ZSwgZmFsc2UpKSB7CisgICAgICAgICAgICAgIG5ld1N1Z2dlc3Rp
b24gPSBtX3R5cGVkRmllbGRWYWx1ZTsKKyAgICAgICAgICAgICAgaWYgKHN1Z2dlc3Rpb24ubGVu
Z3RoKCkgPiBtX3R5cGVkRmllbGRWYWx1ZS5sZW5ndGgoKSkgeworICAgICAgICAgICAgICAgICAg
bmV3U3VnZ2VzdGlvbi5hcHBlbmQoc3VnZ2VzdGlvbi5zdWJzdHJpbmcobV90eXBlZEZpZWxkVmFs
dWUubGVuZ3RoKCksCisgICAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGlvbi5sZW5ndGgoKSAt
IG1fdHlwZWRGaWVsZFZhbHVlLmxlbmd0aCgpKSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgICAgc3RhcnQgPSBtX3R5cGVkRmllbGRWYWx1ZS5sZW5ndGgoKTsKKyAgICAgICAgICB9CisK
KyAgICAgICAgICBtX3RleHRGaWVsZC0+c2V0U3VnZ2VzdGVkVmFsdWUobmV3U3VnZ2VzdGlvbik7
CisgICAgICAgICAgbV90ZXh0RmllbGQtPnNldFNlbGVjdGlvblJhbmdlKHN0YXJ0LCBuZXdTdWdn
ZXN0aW9uLmxlbmd0aCgpKTsKKyAgICB9CisKKyAgICBpZiAoaGFzUHJldmlvdXNWYWx1ZSkKKyAg
ICAgICAgbV9sYXN0RmllbGRWYWx1ZXMtPnNldChtX3RleHRGaWVsZC0+bmFtZSgpLCBtX3R5cGVk
RmllbGRWYWx1ZSk7CisgICAgZWxzZQorICAgICAgICBtX2xhc3RGaWVsZFZhbHVlcy0+YWRkKG1f
dGV4dEZpZWxkLT5uYW1lKCksIG1fdHlwZWRGaWVsZFZhbHVlKTsKK30KKwordm9pZCBTdWdnZXN0
aW9uc1BvcHVwTWVudUNsaWVudDo6c2V0U3VnZ2VzdGVkVmFsdWUoY29uc3QgV2ViU3RyaW5nJiBz
dWdnZXN0aW9uKQoreworICBtX3RleHRGaWVsZC0+c2V0U3VnZ2VzdGVkVmFsdWUoc3VnZ2VzdGlv
bik7CisgIG1fdGV4dEZpZWxkLT5zZXRTZWxlY3Rpb25SYW5nZShtX3R5cGVkRmllbGRWYWx1ZS5s
ZW5ndGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Z2dlc3Rpb24ubGVu
Z3RoKCkpOworfQorCit9IC8vIG5hbWVzcGFjZSBXZWJLaXQKSW5kZXg6IFdlYktpdC9jaHJvbWl1
bS9zcmMvU3VnZ2VzdGlvbnNQb3B1cE1lbnVDbGllbnQuaAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQv
Y2hyb21pdW0vc3JjL1N1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50LmgJKHJldmlzaW9uIDApCisr
KyBXZWJLaXQvY2hyb21pdW0vc3JjL1N1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50LmgJKHJldmlz
aW9uIDApCkBAIC0wLDAgKzEsMTE4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2ds
ZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVz
ZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmlj
YXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlv
bnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBj
b2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJl
ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAq
IGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRl
cmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRo
ZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRy
aWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZl
ZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBw
ZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlS
SUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNT
IE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRP
LCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBG
T1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBT
SEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZP
UiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFS
WSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlU
RUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1Mg
T0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBI
T1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5F
R0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UK
KyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkg
T0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgIlBvcHVwTWVudUNsaWVudC5oIgorCisj
aWZuZGVmIFN1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50X2gKKyNkZWZpbmUgU3VnZ2VzdGlvbnNQ
b3B1cE1lbnVDbGllbnRfaAorCituYW1lc3BhY2UgV2ViQ29yZSB7CitjbGFzcyBIVE1MSW5wdXRF
bGVtZW50OworY2xhc3MgUG9wdXBNZW51U3R5bGU7CitjbGFzcyBSZW5kZXJTdHlsZTsKK30KKwor
bmFtZXNwYWNlIFdlYktpdCB7CitjbGFzcyBXZWJTdHJpbmc7CitjbGFzcyBXZWJWaWV3SW1wbDsK
K3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBjbGFzcyBXZWJWZWN0b3I7CisKKy8vIAorY2xhc3MgU3Vn
Z2VzdGlvbnNQb3B1cE1lbnVDbGllbnQgOiBwdWJsaWMgV2ViQ29yZTo6UG9wdXBNZW51Q2xpZW50
IHsKK3B1YmxpYzoKKyAgICBTdWdnZXN0aW9uc1BvcHVwTWVudUNsaWVudChXZWJWaWV3SW1wbCog
d2Vidmlldyk7CisgICAgdmlydHVhbCB+U3VnZ2VzdGlvbnNQb3B1cE1lbnVDbGllbnQoKTsKKwor
ICAgIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiBzdWdnZXN0aW9ucyBhdmFpbGFibGUuCisgICAg
dmlydHVhbCBzaXplX3QgZ2V0U3VnZ2VzdGlvbnNTaXplKCkgY29uc3QgPSAwOworCisgICAgLy8g
UmV0dXJucyB0aGUgc3VnZ2VzdGlvbiBhdCB8bGlzdEluZGV4fC4KKyAgICB2aXJ0dWFsIFdlYlN0
cmluZyBnZXRTdWdnZXN0aW9uKHVuc2lnbmVkIGxpc3RJbmRleCkgY29uc3QgPSAwOworCisgICAg
Ly8gUmVtb3ZlcyB0aGUgc3VnZ2VzdGlvbiBhdCB8bGlzdEluZGV4fCBmcm9tIHRoZSBsaXN0IG9m
IHN1Z2dlc3Rpb25zLgorICAgIHZpcnR1YWwgdm9pZCByZW1vdmVTdWdnZXN0aW9uQXRJbmRleCh1
bnNpZ25lZCBsaXN0SW5kZXgpID0gMDsKKworICAgIC8vIFdlYkNvcmU6OlBvcHVwTWVudUNsaWVu
dCBtZXRob2RzOgorICAgIHZpcnR1YWwgdm9pZCB2YWx1ZUNoYW5nZWQodW5zaWduZWQgbGlzdElu
ZGV4LCBib29sIGZpcmVFdmVudHMgPSB0cnVlKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2VsZWN0aW9u
Q2hhbmdlZCh1bnNpZ25lZCBsaXN0SW5kZXgsIGJvb2wgZmlyZUV2ZW50cyA9IHRydWUpOworICAg
IHZpcnR1YWwgV2ViQ29yZTo6U3RyaW5nIGl0ZW1UZXh0KHVuc2lnbmVkIGxpc3RJbmRleCkgY29u
c3Q7CisgICAgdmlydHVhbCBXZWJDb3JlOjpTdHJpbmcgaXRlbVRvb2xUaXAodW5zaWduZWQgbGFz
dEluZGV4KSBjb25zdCB7IHJldHVybiBXZWJDb3JlOjpTdHJpbmcoKTsgfQorICAgIHZpcnR1YWwg
Ym9vbCBpdGVtSXNFbmFibGVkKHVuc2lnbmVkIGxpc3RJbmRleCkgY29uc3QgeyByZXR1cm4gdHJ1
ZTsgfQorICAgIHZpcnR1YWwgV2ViQ29yZTo6UG9wdXBNZW51U3R5bGUgaXRlbVN0eWxlKHVuc2ln
bmVkIGxpc3RJbmRleCkgY29uc3Q7CisgICAgdmlydHVhbCBXZWJDb3JlOjpQb3B1cE1lbnVTdHls
ZSBtZW51U3R5bGUoKSBjb25zdDsKKyAgICB2aXJ0dWFsIGludCBjbGllbnRJbnNldExlZnQoKSBj
b25zdCB7IHJldHVybiAwOyB9CisgICAgdmlydHVhbCBpbnQgY2xpZW50SW5zZXRSaWdodCgpIGNv
bnN0IHsgcmV0dXJuIDA7IH0KKyAgICB2aXJ0dWFsIGludCBjbGllbnRQYWRkaW5nTGVmdCgpIGNv
bnN0OworICAgIHZpcnR1YWwgaW50IGNsaWVudFBhZGRpbmdSaWdodCgpIGNvbnN0OworICAgIHZp
cnR1YWwgaW50IGxpc3RTaXplKCkgY29uc3QgeyByZXR1cm4gZ2V0U3VnZ2VzdGlvbnNTaXplKCk7
IH0KKyAgICB2aXJ0dWFsIGludCBzZWxlY3RlZEluZGV4KCkgY29uc3QgeyByZXR1cm4gbV9zZWxl
Y3RlZEluZGV4OyB9CisgICAgdmlydHVhbCB2b2lkIHBvcHVwRGlkSGlkZSgpOworICAgIHZpcnR1
YWwgYm9vbCBpdGVtSXNTZXBhcmF0b3IodW5zaWduZWQgbGlzdEluZGV4KSBjb25zdCB7IHJldHVy
biBmYWxzZTsgfQorICAgIHZpcnR1YWwgYm9vbCBpdGVtSXNMYWJlbCh1bnNpZ25lZCBsaXN0SW5k
ZXgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgICAgdmlydHVhbCBib29sIGl0ZW1Jc1NlbGVj
dGVkKHVuc2lnbmVkIGxpc3RJbmRleCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgICB2aXJ0
dWFsIGJvb2wgc2hvdWxkUG9wT3ZlcigpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgICAgdmly
dHVhbCBib29sIHZhbHVlU2hvdWxkQ2hhbmdlT25Ib3RUcmFjaygpIGNvbnN0IHsgcmV0dXJuIGZh
bHNlOyB9CisgICAgdmlydHVhbCB2b2lkIHNldFRleHRGcm9tSXRlbSh1bnNpZ25lZCBsaXN0SW5k
ZXgpOworICAgIHZpcnR1YWwgV2ViQ29yZTo6Rm9udFNlbGVjdG9yKiBmb250U2VsZWN0b3IoKSBj
b25zdDsKKyAgICB2aXJ0dWFsIFdlYkNvcmU6Okhvc3RXaW5kb3cqIGhvc3RXaW5kb3coKSBjb25z
dDsKKyAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8V2ViQ29yZTo6U2Nyb2xsYmFyPiBjcmVhdGVTY3Jv
bGxiYXIoCisgICAgICAgIFdlYkNvcmU6OlNjcm9sbGJhckNsaWVudCogY2xpZW50LAorICAgICAg
ICBXZWJDb3JlOjpTY3JvbGxiYXJPcmllbnRhdGlvbiBvcmllbnRhdGlvbiwKKyAgICAgICAgV2Vi
Q29yZTo6U2Nyb2xsYmFyQ29udHJvbFNpemUgc2l6ZSk7CisKK3Byb3RlY3RlZDoKKyAgICB2b2lk
IGluaXRpYWxpemUoV2ViQ29yZTo6SFRNTElucHV0RWxlbWVudCogdGV4dEZpZWxkLAorICAgICAg
ICAgICAgICAgICAgICBpbnQgZGVmYXVsdFN1Z2dlc3Rpb25JbmRleCk7CisgICAgdm9pZCBzZXRJ
bml0aWFsU3VnZ2VzdGlvbigpOworCisgICAgaW50IGdldFNlbGVjdGVkSW5kZXgoKSBjb25zdCB7
IHJldHVybiBtX3NlbGVjdGVkSW5kZXg7IH0KKyAgICB2b2lkIHNldFNlbGVjdGVkSW5kZXgoaW50
IGluZGV4KSB7IG1fc2VsZWN0ZWRJbmRleCA9IGluZGV4OyB9CisKKyAgICB2b2lkIHNldFN1Z2dl
c3RlZFZhbHVlKGNvbnN0IFdlYlN0cmluZyYgc3VnZ2VzdGlvbik7CisKKyAgICBXZWJWaWV3SW1w
bCogZ2V0V2ViVmlldygpIGNvbnN0IHsgcmV0dXJuIG1fd2ViVmlldzsgfQorICAgIFdlYkNvcmU6
OkhUTUxJbnB1dEVsZW1lbnQqIGdldFRleHRGaWVsZCgpIGNvbnN0IHsgcmV0dXJuIG1fdGV4dEZp
ZWxkLmdldCgpOyB9CisKK3ByaXZhdGU6CisgICAgV2ViQ29yZTo6UmVuZGVyU3R5bGUqIHRleHRG
aWVsZFN0eWxlKCkgY29uc3Q7CisgICAgdm9pZCByZXNldExhc3RTdWdnZXN0aW9uKCk7CisKKyAg
ICBSZWZQdHI8V2ViQ29yZTo6SFRNTElucHV0RWxlbWVudD4gbV90ZXh0RmllbGQ7CisgICAgaW50
IG1fc2VsZWN0ZWRJbmRleDsKKyAgICBXZWJWaWV3SW1wbCogbV93ZWJWaWV3OworICAgIFdlYkNv
cmU6OlN0cmluZyBtX3R5cGVkRmllbGRWYWx1ZTsKKyAgICBPd25QdHI8V2ViQ29yZTo6UG9wdXBN
ZW51U3R5bGU+IG1fc3R5bGU7CisgICAgdHlwZWRlZiBIYXNoTWFwPFdlYkNvcmU6OlN0cmluZywg
V2ViQ29yZTo6U3RyaW5nPiBGaWVsZFZhbHVlc01hcDsKKyAgICBPd25QdHI8RmllbGRWYWx1ZXNN
YXA+IG1fbGFzdEZpZWxkVmFsdWVzOworfTsKKworfSAgLy8gbmFtZXNwYWNlIFdlYktpdAorCisj
ZW5kaWYKClByb3BlcnR5IGNoYW5nZXMgb246IFdlYktpdC9jaHJvbWl1bS9zcmMvU3VnZ2VzdGlv
bnNQb3B1cE1lbnVDbGllbnQuaApfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCkFkZGVkOiBzdm46ZW9sLXN0eWxlCiAgICsg
TEYKCkluZGV4OiBXZWJLaXQvY2hyb21pdW0vc3JjL1dlYlZpZXdJbXBsLmNwcAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBXZWJLaXQvY2hyb21pdW0vc3JjL1dlYlZpZXdJbXBsLmNwcAkocmV2aXNpb24gNTQ1MDEp
CisrKyBXZWJLaXQvY2hyb21pdW0vc3JjL1dlYlZpZXdJbXBsLmNwcAkod29ya2luZyBjb3B5KQpA
QCAtMzIsNiArMzIsNyBAQAogI2luY2x1ZGUgIldlYlZpZXdJbXBsLmgiCiAKICNpbmNsdWRlICJB
dXRvY29tcGxldGVQb3B1cE1lbnVDbGllbnQuaCIKKyNpbmNsdWRlICJBdXRvRmlsbFBvcHVwTWVu
dUNsaWVudC5oIgogI2luY2x1ZGUgIkFYT2JqZWN0Q2FjaGUuaCIKICNpbmNsdWRlICJDaHJvbWUu
aCIKICNpbmNsdWRlICJDb250ZXh0TWVudS5oIgpAQCAtODEsNiArODIsNyBAQAogI2luY2x1ZGUg
IlNlY3VyaXR5T3JpZ2luLmgiCiAjaW5jbHVkZSAiU2VsZWN0aW9uQ29udHJvbGxlci5oIgogI2lu
Y2x1ZGUgIlNldHRpbmdzLmgiCisjaW5jbHVkZSAiU3VnZ2VzdGlvbnNQb3B1cE1lbnVDbGllbnQu
aCIKICNpbmNsdWRlICJUeXBpbmdDb21tYW5kLmgiCiAjaW5jbHVkZSAiV2ViQWNjZXNzaWJpbGl0
eU9iamVjdC5oIgogI2luY2x1ZGUgIldlYkRldlRvb2xzQWdlbnRQcml2YXRlLmgiCkBAIC00Njgs
NyArNDcwLDcgQEAgYm9vbCBXZWJWaWV3SW1wbDo6a2V5RXZlbnQoY29uc3QgV2ViS2V5YgogICAg
IC8vIGV2ZW50LgogICAgIG1fc3VwcHJlc3NOZXh0S2V5cHJlc3NFdmVudCA9IGZhbHNlOwogCi0g
ICAgLy8gR2l2ZSBhdXRvY29tcGxldGUgYSBjaGFuY2UgdG8gY29uc3VtZSB0aGUga2V5IGV2ZW50
cyBpdCBpcyBpbnRlcmVzdGVkIGluLgorICAgIC8vIEdpdmUgQXV0b2NvbXBsZXRlIGEgY2hhbmNl
IHRvIGNvbnN1bWUgdGhlIGtleSBldmVudHMgaXQgaXMgaW50ZXJlc3RlZCBpbi4KICAgICBpZiAo
YXV0b2NvbXBsZXRlSGFuZGxlS2V5RXZlbnQoZXZlbnQpKQogICAgICAgICByZXR1cm4gdHJ1ZTsK
IApAQCAtNTQxLDcgKzU0Myw3IEBAIGJvb2wgV2ViVmlld0ltcGw6OmF1dG9jb21wbGV0ZUhhbmRs
ZUtleUUKICAgICAgICAgbV9jbGllbnQtPnJlbW92ZUF1dG9maWxsU3VnZ2VzdGlvbnMobmFtZSwg
dmFsdWUpOwogICAgICAgICAvLyBVcGRhdGUgdGhlIGVudHJpZXMgaW4gdGhlIGN1cnJlbnRseSBz
aG93aW5nIHBvcHVwIHRvIHJlZmxlY3QgdGhlCiAgICAgICAgIC8vIGRlbGV0aW9uLgotICAgICAg
ICBtX2F1dG9jb21wbGV0ZVBvcHVwQ2xpZW50LT5yZW1vdmVJdGVtQXRJbmRleChzZWxlY3RlZElu
ZGV4KTsKKyAgICAgICAgbV9hdXRvY29tcGxldGVQb3B1cENsaWVudC0+cmVtb3ZlU3VnZ2VzdGlv
bkF0SW5kZXgoc2VsZWN0ZWRJbmRleCk7CiAgICAgICAgIHJlZnJlc2hTdWdnZXN0aW9uc1BvcHVw
KCk7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CkBAIC0xNTU4LDU4ICsxNTYwLDExNyBA
QCB2b2lkIFdlYlZpZXdJbXBsOjphcHBseUF1dG9maWxsU3VnZ2VzdGlvCiAgICAgY29uc3QgV2Vi
VmVjdG9yPFdlYlN0cmluZz4mIHN1Z2dlc3Rpb25zLAogICAgIGludCBkZWZhdWx0U3VnZ2VzdGlv
bkluZGV4KQogewotICAgIGlmICghbV9wYWdlLmdldCgpIHx8IHN1Z2dlc3Rpb25zLmlzRW1wdHko
KSkgeworICAgIGFwcGx5QXV0b2NvbXBsZXRlU3VnZ2VzdGlvbnMobm9kZSwgc3VnZ2VzdGlvbnMs
IGRlZmF1bHRTdWdnZXN0aW9uSW5kZXgpOworfQorCit2b2lkIFdlYlZpZXdJbXBsOjphcHBseUF1
dG9GaWxsU3VnZ2VzdGlvbnMoCisgICAgY29uc3QgV2ViTm9kZSYgbm9kZSwKKyAgICBjb25zdCBX
ZWJWZWN0b3I8V2ViU3RyaW5nPiYgbmFtZXMsCisgICAgY29uc3QgV2ViVmVjdG9yPFdlYlN0cmlu
Zz4mIGxhYmVscywKKyAgICBpbnQgZGVmYXVsdFN1Z2dlc3Rpb25JbmRleCkKK3sKKyAgICBBU1NF
UlQobmFtZXMuc2l6ZSgpID09IGxhYmVscy5zaXplKCkpOworICAgIEFTU0VSVChkZWZhdWx0U3Vn
Z2VzdGlvbkluZGV4IDwgc3RhdGljX2Nhc3Q8aW50PihuYW1lcy5zaXplKCkpKTsKKworICAgIGlm
IChuYW1lcy5pc0VtcHR5KCkpIHsKICAgICAgICAgaGlkZVN1Z2dlc3Rpb25zUG9wdXAoKTsKICAg
ICAgICAgcmV0dXJuOwogICAgIH0KIAorICAgIFJlZlB0cjxOb2RlPiBmb2N1c2VkTm9kZSA9IGZv
Y3VzZWRXZWJDb3JlTm9kZSgpOworICAgIC8vIElmIHRoZSBub2RlIGZvciB3aGljaCB3ZSBxdWVy
aWVkIHRoZSBBdXRvRmlsbCBzdWdnZXN0aW9ucyBpcyBub3QgdGhlCisgICAgLy8gZm9jdXNlZCBu
b2RlLCB0aGVuIHdlIGhhdmUgbm90aGluZyB0byBkby4gIEZJWE1FOiBhbHNvIGNoZWNrIHRoZQor
ICAgIC8vIGNhcmV0IGlzIGF0IHRoZSBlbmQgYW5kIHRoYXQgdGhlIHRleHQgaGFzIG5vdCBjaGFu
Z2VkLgorICAgIGlmICghZm9jdXNlZE5vZGUgfHwgZm9jdXNlZE5vZGUgIT0gUGFzc1JlZlB0cjxO
b2RlPihub2RlKSkgeworICAgICAgICBoaWRlU3VnZ2VzdGlvbnNQb3B1cCgpOworICAgICAgICBy
ZXR1cm47CisgICAgfQorCisgICAgSFRNTElucHV0RWxlbWVudCogaW5wdXRFbGVtID0KKyAgICAg
ICAgc3RhdGljX2Nhc3Q8SFRNTElucHV0RWxlbWVudCo+KGZvY3VzZWROb2RlLmdldCgpKTsKKwor
ICAgIC8vIFRoZSBmaXJzdCB0aW1lIHRoZSBBdXRvRmlsbCBwb3B1cCBpcyBzaG93biB3ZSdsbCBj
cmVhdGUgdGhlIGNsaWVudCBhbmQKKyAgICAvLyB0aGUgcG9wdXAuCisgICAgaWYgKCFtX2F1dG9G
aWxsUG9wdXBDbGllbnQuZ2V0KCkpIHsKKyAgICAgICAgbV9hdXRvRmlsbFBvcHVwQ2xpZW50LnNl
dChuZXcgQXV0b0ZpbGxQb3B1cE1lbnVDbGllbnQodGhpcykpOworICAgIH0KKworICAgIG1fYXV0
b0ZpbGxQb3B1cENsaWVudC0+aW5pdGlhbGl6ZShpbnB1dEVsZW0sIG5hbWVzLCBsYWJlbHMsCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRTdWdnZXN0aW9uSW5k
ZXgpOworCisgICAgaWYgKG1fc3VnZ2VzdGlvbnNQb3B1cENsaWVudCAhPSBtX2F1dG9GaWxsUG9w
dXBDbGllbnQuZ2V0KCkpIHsKKyAgICAgICAgaGlkZVN1Z2dlc3Rpb25zUG9wdXAoKTsKKyAgICAg
ICAgbV9zdWdnZXN0aW9uc1BvcHVwQ2xpZW50ID0gbV9hdXRvRmlsbFBvcHVwQ2xpZW50LmdldCgp
OworICAgIH0KKworICAgIGlmICghbV9hdXRvRmlsbFBvcHVwLmdldCgpKQorICAgICAgICBtX2F1
dG9GaWxsUG9wdXAgPSBQb3B1cENvbnRhaW5lcjo6Y3JlYXRlKG1fc3VnZ2VzdGlvbnNQb3B1cENs
aWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBz
dWdnZXN0aW9uc1BvcHVwU2V0dGluZ3MpOworCisgICAgaWYgKG1fc3VnZ2VzdGlvbnNQb3B1cCAh
PSBtX2F1dG9GaWxsUG9wdXAuZ2V0KCkpCisgICAgICAgIG1fc3VnZ2VzdGlvbnNQb3B1cCA9IG1f
YXV0b0ZpbGxQb3B1cC5nZXQoKTsKKworICAgIGlmIChtX3N1Z2dlc3Rpb25zUG9wdXBTaG93aW5n
KSB7CisgICAgICAgIG1fYXV0b0ZpbGxQb3B1cENsaWVudC0+c2V0U3VnZ2VzdGlvbnMobmFtZXMs
IGxhYmVscyk7CisgICAgICAgIHJlZnJlc2hTdWdnZXN0aW9uc1BvcHVwKCk7CisgICAgfSBlbHNl
IHsKKyAgICAgICAgbV9zdWdnZXN0aW9uc1BvcHVwLT5zaG93KGZvY3VzZWROb2RlLT5nZXRSZWN0
KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb2N1c2VkTm9kZS0+b3duZXJE
b2N1bWVudCgpLT52aWV3KCksIDApOworICAgICAgICBtX3N1Z2dlc3Rpb25zUG9wdXBTaG93aW5n
ID0gdHJ1ZTsKKyAgICB9Cit9CisKK3ZvaWQgV2ViVmlld0ltcGw6OmFwcGx5QXV0b2NvbXBsZXRl
U3VnZ2VzdGlvbnMoCisgICAgY29uc3QgV2ViTm9kZSYgbm9kZSwKKyAgICBjb25zdCBXZWJWZWN0
b3I8V2ViU3RyaW5nPiYgc3VnZ2VzdGlvbnMsCisgICAgaW50IGRlZmF1bHRTdWdnZXN0aW9uSW5k
ZXgpCit7CiAgICAgQVNTRVJUKGRlZmF1bHRTdWdnZXN0aW9uSW5kZXggPCBzdGF0aWNfY2FzdDxp
bnQ+KHN1Z2dlc3Rpb25zLnNpemUoKSkpOwogCi0gICAgaWYgKFJlZlB0cjxGcmFtZT4gZm9jdXNl
ZCA9IG1fcGFnZS0+Zm9jdXNDb250cm9sbGVyKCktPmZvY3VzZWRGcmFtZSgpKSB7Ci0gICAgICAg
IFJlZlB0cjxEb2N1bWVudD4gZG9jdW1lbnQgPSBmb2N1c2VkLT5kb2N1bWVudCgpOwotICAgICAg
ICBpZiAoIWRvY3VtZW50LmdldCgpKSB7Ci0gICAgICAgICAgICBoaWRlU3VnZ2VzdGlvbnNQb3B1
cCgpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9CisgICAgaWYgKCFtX3BhZ2UuZ2V0
KCkgfHwgc3VnZ2VzdGlvbnMuaXNFbXB0eSgpKSB7CisgICAgICAgIGhpZGVTdWdnZXN0aW9uc1Bv
cHVwKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CiAKLSAgICAgICAgUmVmUHRyPE5vZGU+IGZv
Y3VzZWROb2RlID0gZG9jdW1lbnQtPmZvY3VzZWROb2RlKCk7Ci0gICAgICAgIC8vIElmIHRoZSBu
b2RlIGZvciB3aGljaCB3ZSBxdWVyaWVkIHRoZSBhdXRvZmlsbCBzdWdnZXN0aW9ucyBpcyBub3Qg
dGhlCi0gICAgICAgIC8vIGZvY3VzZWQgbm9kZSwgdGhlbiB3ZSBoYXZlIG5vdGhpbmcgdG8gZG8u
ICBGSVhNRTogYWxzbyBjaGVjayB0aGUKLSAgICAgICAgLy8gY2FycmV0IGlzIGF0IHRoZSBlbmQg
YW5kIHRoYXQgdGhlIHRleHQgaGFzIG5vdCBjaGFuZ2VkLgotICAgICAgICBpZiAoIWZvY3VzZWRO
b2RlLmdldCgpIHx8IGZvY3VzZWROb2RlICE9IFBhc3NSZWZQdHI8Tm9kZT4obm9kZSkpIHsKLSAg
ICAgICAgICAgIGhpZGVTdWdnZXN0aW9uc1BvcHVwKCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0g
ICAgICAgIH0KKyAgICBSZWZQdHI8Tm9kZT4gZm9jdXNlZE5vZGUgPSBmb2N1c2VkV2ViQ29yZU5v
ZGUoKTsKKyAgICAvLyBJZiB0aGUgbm9kZSBmb3Igd2hpY2ggd2UgcXVlcmllZCB0aGUgQXV0b2Nv
bXBsZXRlIHN1Z2dlc3Rpb25zIGlzIG5vdCB0aGUKKyAgICAvLyBmb2N1c2VkIG5vZGUsIHRoZW4g
d2UgaGF2ZSBub3RoaW5nIHRvIGRvLiAgRklYTUU6IGFsc28gY2hlY2sgdGhlCisgICAgLy8gY2Fy
ZXQgaXMgYXQgdGhlIGVuZCBhbmQgdGhhdCB0aGUgdGV4dCBoYXMgbm90IGNoYW5nZWQuCisgICAg
aWYgKCFmb2N1c2VkTm9kZSB8fCBmb2N1c2VkTm9kZSAhPSBQYXNzUmVmUHRyPE5vZGU+KG5vZGUp
KSB7CisgICAgICAgIGhpZGVTdWdnZXN0aW9uc1BvcHVwKCk7CisgICAgICAgIHJldHVybjsKKyAg
ICB9CiAKLSAgICAgICAgaWYgKCFmb2N1c2VkTm9kZS0+aGFzVGFnTmFtZShIVE1MTmFtZXM6Omlu
cHV0VGFnKSkgewotICAgICAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Ci0gICAgICAgICAg
ICByZXR1cm47Ci0gICAgICAgIH0KKyAgICBIVE1MSW5wdXRFbGVtZW50KiBpbnB1dEVsZW0gPQor
ICAgICAgICBzdGF0aWNfY2FzdDxIVE1MSW5wdXRFbGVtZW50Kj4oZm9jdXNlZE5vZGUuZ2V0KCkp
OwogCi0gICAgICAgIEhUTUxJbnB1dEVsZW1lbnQqIGlucHV0RWxlbSA9Ci0gICAgICAgICAgICBz
dGF0aWNfY2FzdDxIVE1MSW5wdXRFbGVtZW50Kj4oZm9jdXNlZE5vZGUuZ2V0KCkpOworICAgIC8v
IFRoZSBmaXJzdCB0aW1lIHRoZSBBdXRvY29tcGxldGUgaXMgc2hvd24gd2UnbGwgY3JlYXRlIHRo
ZSBjbGllbnQgYW5kIHRoZQorICAgIC8vIHBvcHVwLgorICAgIGlmICghbV9hdXRvY29tcGxldGVQ
b3B1cENsaWVudC5nZXQoKSkKKyAgICAgICAgbV9hdXRvY29tcGxldGVQb3B1cENsaWVudC5zZXQo
bmV3IEF1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVudCh0aGlzKSk7CiAKLSAgICAgICAgLy8gVGhl
IGZpcnN0IHRpbWUgdGhlIHN1Z2dlc3Rpb25zIHBvcHVwIGlzIHNob3duIHdlJ2xsIGNyZWF0ZSB0
aGUgY2xpZW50Ci0gICAgICAgIC8vIGFuZCB0aGUgcG9wdXAuCi0gICAgICAgIGlmICghbV9hdXRv
Y29tcGxldGVQb3B1cENsaWVudC5nZXQoKSkKLSAgICAgICAgICAgIG1fYXV0b2NvbXBsZXRlUG9w
dXBDbGllbnQuc2V0KG5ldyBBdXRvY29tcGxldGVQb3B1cE1lbnVDbGllbnQodGhpcykpOwotICAg
ICAgICBtX2F1dG9jb21wbGV0ZVBvcHVwQ2xpZW50LT5pbml0aWFsaXplKGlucHV0RWxlbSwKLSAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWdnZXN0aW9ucywK
LSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0U3Vn
Z2VzdGlvbkluZGV4KTsKLSAgICAgICAgaWYgKCFtX3N1Z2dlc3Rpb25zUG9wdXAuZ2V0KCkpIHsK
LSAgICAgICAgICAgIG1fc3VnZ2VzdGlvbnNQb3B1cCA9Ci0gICAgICAgICAgICAgICAgUG9wdXBD
b250YWluZXI6OmNyZWF0ZShtX2F1dG9jb21wbGV0ZVBvcHVwQ2xpZW50LmdldCgpLAotICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGlvbnNQb3B1cFNldHRpbmdz
KTsKLSAgICAgICAgfQorICAgIG1fYXV0b2NvbXBsZXRlUG9wdXBDbGllbnQtPmluaXRpYWxpemUo
aW5wdXRFbGVtLCBzdWdnZXN0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGRlZmF1bHRTdWdnZXN0aW9uSW5kZXgpOwogCi0gICAgICAgIGlmIChtX3N1Z2dl
c3Rpb25zUG9wdXBTaG93aW5nKSB7Ci0gICAgICAgICAgICBtX2F1dG9jb21wbGV0ZVBvcHVwQ2xp
ZW50LT5zZXRTdWdnZXN0aW9ucyhzdWdnZXN0aW9ucyk7Ci0gICAgICAgICAgICByZWZyZXNoU3Vn
Z2VzdGlvbnNQb3B1cCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbV9zdWdnZXN0
aW9uc1BvcHVwLT5zaG93KGZvY3VzZWROb2RlLT5nZXRSZWN0KCksCi0gICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgZm9jdXNlZE5vZGUtPm93bmVyRG9jdW1lbnQoKS0+dmlldygp
LCAwKTsKLSAgICAgICAgICAgIG1fc3VnZ2VzdGlvbnNQb3B1cFNob3dpbmcgPSB0cnVlOwotICAg
ICAgICB9CisgICAgaWYgKG1fc3VnZ2VzdGlvbnNQb3B1cENsaWVudCAhPSBtX2F1dG9jb21wbGV0
ZVBvcHVwQ2xpZW50LmdldCgpKSB7CisgICAgICAgIGhpZGVTdWdnZXN0aW9uc1BvcHVwKCk7Cisg
ICAgICAgIG1fc3VnZ2VzdGlvbnNQb3B1cENsaWVudCA9IG1fYXV0b2NvbXBsZXRlUG9wdXBDbGll
bnQuZ2V0KCk7CisgICAgfQorCisgICAgaWYgKCFtX2F1dG9jb21wbGV0ZVBvcHVwLmdldCgpKQor
ICAgICAgICBtX2F1dG9jb21wbGV0ZVBvcHVwID0gUG9wdXBDb250YWluZXI6OmNyZWF0ZShtX3N1
Z2dlc3Rpb25zUG9wdXBDbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIHN1Z2dlc3Rpb25zUG9wdXBTZXR0aW5ncyk7CisKKyAgICBpZiAo
bV9zdWdnZXN0aW9uc1BvcHVwICE9IG1fYXV0b2NvbXBsZXRlUG9wdXAuZ2V0KCkpCisgICAgICAg
IG1fc3VnZ2VzdGlvbnNQb3B1cCA9IG1fYXV0b2NvbXBsZXRlUG9wdXAuZ2V0KCk7CisKKyAgICBp
ZiAobV9zdWdnZXN0aW9uc1BvcHVwU2hvd2luZykgeworICAgICAgICBtX2F1dG9jb21wbGV0ZVBv
cHVwQ2xpZW50LT5zZXRTdWdnZXN0aW9ucyhzdWdnZXN0aW9ucyk7CisgICAgICAgIHJlZnJlc2hT
dWdnZXN0aW9uc1BvcHVwKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbV9zdWdnZXN0aW9uc1Bv
cHVwLT5zaG93KGZvY3VzZWROb2RlLT5nZXRSZWN0KCksCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBmb2N1c2VkTm9kZS0+b3duZXJEb2N1bWVudCgpLT52aWV3KCksIDApOworICAg
ICAgICBtX3N1Z2dlc3Rpb25zUG9wdXBTaG93aW5nID0gdHJ1ZTsKICAgICB9CiB9CiAKSW5kZXg6
IFdlYktpdC9jaHJvbWl1bS9zcmMvV2ViVmlld0ltcGwuaAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQv
Y2hyb21pdW0vc3JjL1dlYlZpZXdJbXBsLmgJKHJldmlzaW9uIDU0NTAxKQorKysgV2ViS2l0L2No
cm9taXVtL3NyYy9XZWJWaWV3SW1wbC5oCSh3b3JraW5nIGNvcHkpCkBAIC01OCw2ICs1OCw3IEBA
IGNsYXNzIEtleWJvYXJkRXZlbnQ7CiBjbGFzcyBQYWdlOwogY2xhc3MgUGxhdGZvcm1LZXlib2Fy
ZEV2ZW50OwogY2xhc3MgUG9wdXBDb250YWluZXI7CitjbGFzcyBQb3B1cE1lbnVDbGllbnQ7CiBj
bGFzcyBSYW5nZTsKIGNsYXNzIFJlbmRlclRoZW1lOwogY2xhc3MgV2lkZ2V0OwpAQCAtNjUsNyAr
NjYsOSBAQCBjbGFzcyBXaWRnZXQ7CiAKIG5hbWVzcGFjZSBXZWJLaXQgewogY2xhc3MgQXV0b2Nv
bXBsZXRlUG9wdXBNZW51Q2xpZW50OworY2xhc3MgQXV0b0ZpbGxQb3B1cE1lbnVDbGllbnQ7CiBj
bGFzcyBDb250ZXh0TWVudUNsaWVudEltcGw7CitjbGFzcyBTdWdnZXN0aW9uc1BvcHVwTWVudUNs
aWVudDsKIGNsYXNzIFdlYkFjY2Vzc2liaWxpdHlPYmplY3Q7CiBjbGFzcyBXZWJEZXZUb29sc0Fn
ZW50UHJpdmF0ZTsKIGNsYXNzIFdlYkZyYW1lSW1wbDsKQEAgLTE1Myw2ICsxNTYsMTUgQEAgcHVi
bGljOgogICAgICAgICBjb25zdCBXZWJOb2RlJiwKICAgICAgICAgY29uc3QgV2ViVmVjdG9yPFdl
YlN0cmluZz4mIHN1Z2dlc3Rpb25zLAogICAgICAgICBpbnQgZGVmYXVsdFN1Z2dlc3Rpb25JbmRl
eCk7CisgICAgdmlydHVhbCB2b2lkIGFwcGx5QXV0b0ZpbGxTdWdnZXN0aW9ucygKKyAgICAgICAg
Y29uc3QgV2ViTm9kZSYsCisgICAgICAgIGNvbnN0IFdlYlZlY3RvcjxXZWJTdHJpbmc+JiBuYW1l
cywKKyAgICAgICAgY29uc3QgV2ViVmVjdG9yPFdlYlN0cmluZz4mIGxhYmVscywKKyAgICAgICAg
aW50IGRlZmF1bHRTdWdnZXN0aW9uSW5kZXgpOworICAgIHZpcnR1YWwgdm9pZCBhcHBseUF1dG9j
b21wbGV0ZVN1Z2dlc3Rpb25zKAorICAgICAgICBjb25zdCBXZWJOb2RlJiwKKyAgICAgICAgY29u
c3QgV2ViVmVjdG9yPFdlYlN0cmluZz4mIHN1Z2dlc3Rpb25zLAorICAgICAgICBpbnQgZGVmYXVs
dFN1Z2dlc3Rpb25JbmRleCk7CiAgICAgdmlydHVhbCB2b2lkIGhpZGVBdXRvZmlsbFBvcHVwKCk7
CiAgICAgdmlydHVhbCB2b2lkIGhpZGVTdWdnZXN0aW9uc1BvcHVwKCk7CiAgICAgdmlydHVhbCB2
b2lkIHNldFNjcm9sbGJhckNvbG9ycyh1bnNpZ25lZCBpbmFjdGl2ZUNvbG9yLApAQCAtMzk1LDE2
ICs0MDcsMjkgQEAgcHJpdmF0ZToKICAgICAvLyBjdXJyZW50IGRyb3AgdGFyZ2V0IGluIHRoaXMg
V2ViVmlldyAodGhlIGRyb3AgdGFyZ2V0IGNhbiBhY2NlcHQgdGhlIGRyb3ApLgogICAgIFdlYkRy
YWdPcGVyYXRpb24gbV9kcmFnT3BlcmF0aW9uOwogCi0gICAgLy8gVGhlIHN1Z2dlc3Rpb25zIHBv
cHVwLiAgS2VwdCBhcm91bmQgYW5kIHJldXNlZCBldmVyeS10aW1lIG5ldyBzdWdnZXN0aW9ucwot
ICAgIC8vIHNob3VsZCBiZSBzaG93bi4KLSAgICBSZWZQdHI8V2ViQ29yZTo6UG9wdXBDb250YWlu
ZXI+IG1fc3VnZ2VzdGlvbnNQb3B1cDsKLQotICAgIC8vIFdoZXRoZXIgdGhlIHN1Z2dlc3Rpb25z
IHBvcHVwIGlzIGN1cnJlbnRseSBzaG93aW5nLgorICAgIC8vIFdoZXRoZXIgYSBzdWdnZXN0aW9u
cyBwb3B1cCBpcyBjdXJyZW50bHkgc2hvd2luZy4KICAgICBib29sIG1fc3VnZ2VzdGlvbnNQb3B1
cFNob3dpbmc7CiAKLSAgICAvLyBUaGUgYXV0b2NvbXBsZXRlIGNsaWVudC4KKyAgICAvLyBBIHBv
aW50ZXIgdG8gdGhlIGN1cnJlbnQgc3VnZ2VzdGlvbnMgcG9wdXAgbWVudSBjbGllbnQuICBUaGlz
IGNhbiBiZQorICAgIC8vIGVpdGhlciBhbiBBdXRvRmlsbFBvcHVwTWVudUNsaWVudCBvciBhbiBB
dXRvY29tcGxldGVQb3B1cE1lbnVDbGllbnQuICBXZQorICAgIC8vIGRvIG5vdCBvd24gdGhpcyBw
b2ludGVyLgorICAgIFN1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50KiBtX3N1Z2dlc3Rpb25zUG9w
dXBDbGllbnQ7CisKKyAgICAvLyBUaGUgQXV0b0ZpbGwgcG9wdXAgY2xpZW50LgorICAgIE93blB0
cjxBdXRvRmlsbFBvcHVwTWVudUNsaWVudD4gbV9hdXRvRmlsbFBvcHVwQ2xpZW50OworCisgICAg
Ly8gVGhlIEF1dG9jb21wbGV0ZSBwb3B1cCBjbGllbnQuCiAgICAgT3duUHRyPEF1dG9jb21wbGV0
ZVBvcHVwTWVudUNsaWVudD4gbV9hdXRvY29tcGxldGVQb3B1cENsaWVudDsKIAorICAgIC8vIEEg
cG9pbnRlciB0byB0aGUgY3VycmVudCBzdWdnZXN0aW9ucyBwb3B1cC4gIFdlIGRvIG5vdCBvd24g
dGhpcyBwb2ludGVyLgorICAgIFdlYkNvcmU6OlBvcHVwQ29udGFpbmVyKiBtX3N1Z2dlc3Rpb25z
UG9wdXA7CisKKyAgICAvLyBUaGUgQXV0b0ZpbGwgc3VnZ2VzdGlvbnMgcG9wdXAuCisgICAgUmVm
UHRyPFdlYkNvcmU6OlBvcHVwQ29udGFpbmVyPiBtX2F1dG9GaWxsUG9wdXA7CisKKyAgICAvLyBU
aGUgQXV0b0NvbXBsZXRlIHN1Z2dlc3Rpb25zIHBvcHVwLgorICAgIFJlZlB0cjxXZWJDb3JlOjpQ
b3B1cENvbnRhaW5lcj4gbV9hdXRvY29tcGxldGVQb3B1cDsKKwogICAgIE93blB0cjxXZWJEZXZU
b29sc0FnZW50UHJpdmF0ZT4gbV9kZXZUb29sc0FnZW50OwogCiAgICAgLy8gV2hldGhlciB0aGUg
d2VidmlldyBpcyByZW5kZXJpbmcgdHJhbnNwYXJlbnRseS4K
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>48359</attachid>
            <date>2010-02-08 13:19:01 -0800</date>
            <delta_ts>2010-02-08 15:45:30 -0800</delta_ts>
            <desc>[Chromium] Refactor AutocompletePopupMenuClient [try2]</desc>
            <filename>refactor2.diff</filename>
            <type>text/plain</type>
            <size>49729</size>
            <attacher name="James Hawkins">jhawkins</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYktpdC9jaHJvbWl1bS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0L2No
cm9taXVtL0NoYW5nZUxvZwkocmV2aXNpb24gNTQ1MDUpCisrKyBXZWJLaXQvY2hyb21pdW0vQ2hh
bmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsNzggQEAKKzIwMTAtMDItMDggIEphbWVz
IEhhd2tpbnMgIDxqaGF3a2luc0BjaHJvbWl1bS5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkg
Tk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgW0Nocm9taXVtXSBSZWZhY3RvciBBdXRvY29tcGxl
dGVQb3B1cE1lbnVDbGllbnQgaW50byBhIGJhc2UgY2xhc3MsCisgICAgICAgIFN1Z2dlc3Rpb25z
UG9wdXBNZW51Q2xpZW50LCBhbmQgdHdvIGRlcml2ZWQgY2xhc3NlcywKKyAgICAgICAgQXV0b2Nv
bXBsZXRlUG9wdXBNZW51Q2xpZW50IGFuZCBBdXRvRmlsbFBvcHVwTWVudUNsaWVudC4gIEN1cnJl
bnRseQorICAgICAgICB0aGUgYmVoYXZpb3Igb2Ygc3VnZ2VzdGlvbnMgcG9wdXBzIGhhcyBub3Qg
Y2hhbmdlZC4KKworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/
aWQ9MzQ3MjEKKworICAgICAgICAqIFdlYktpdC5neXA6CisgICAgICAgICogcHVibGljL1dlYlZp
ZXcuaDoKKyAgICAgICAgKiBzcmMvQXV0b0ZpbGxQb3B1cE1lbnVDbGllbnQuY3BwOiBBZGRlZC4K
KyAgICAgICAgKFdlYktpdDo6QXV0b0ZpbGxQb3B1cE1lbnVDbGllbnQ6OkF1dG9GaWxsUG9wdXBN
ZW51Q2xpZW50KToKKyAgICAgICAgKFdlYktpdDo6QXV0b0ZpbGxQb3B1cE1lbnVDbGllbnQ6On5B
dXRvRmlsbFBvcHVwTWVudUNsaWVudCk6CisgICAgICAgIChXZWJLaXQ6OkF1dG9GaWxsUG9wdXBN
ZW51Q2xpZW50OjpnZXRTdWdnZXN0aW9uc1NpemUpOgorICAgICAgICAoV2ViS2l0OjpBdXRvRmls
bFBvcHVwTWVudUNsaWVudDo6Z2V0U3VnZ2VzdGlvbik6CisgICAgICAgIChXZWJLaXQ6OkF1dG9G
aWxsUG9wdXBNZW51Q2xpZW50OjpyZW1vdmVTdWdnZXN0aW9uQXRJbmRleCk6CisgICAgICAgIChX
ZWJLaXQ6OnNlbGVjdGlvbkNoYW5nZWQpOgorICAgICAgICAoV2ViS2l0OjpBdXRvRmlsbFBvcHVw
TWVudUNsaWVudDo6aW5pdGlhbGl6ZSk6CisgICAgICAgIChXZWJLaXQ6OkF1dG9GaWxsUG9wdXBN
ZW51Q2xpZW50OjpzZXRTdWdnZXN0aW9ucyk6CisgICAgICAgICogc3JjL0F1dG9GaWxsUG9wdXBN
ZW51Q2xpZW50Lmg6IEFkZGVkLgorICAgICAgICAqIHNyYy9BdXRvY29tcGxldGVQb3B1cE1lbnVD
bGllbnQuY3BwOgorICAgICAgICAoV2ViS2l0OjpBdXRvY29tcGxldGVQb3B1cE1lbnVDbGllbnQ6
OkF1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVudCk6CisgICAgICAgIChXZWJLaXQ6OkF1dG9jb21w
bGV0ZVBvcHVwTWVudUNsaWVudDo6Z2V0U3VnZ2VzdGlvbnNTaXplKToKKyAgICAgICAgKFdlYktp
dDo6QXV0b2NvbXBsZXRlUG9wdXBNZW51Q2xpZW50OjpnZXRTdWdnZXN0aW9uKToKKyAgICAgICAg
KFdlYktpdDo6QXV0b2NvbXBsZXRlUG9wdXBNZW51Q2xpZW50OjpyZW1vdmVTdWdnZXN0aW9uQXRJ
bmRleCk6CisgICAgICAgIChXZWJLaXQ6OkF1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVudDo6aW5p
dGlhbGl6ZSk6CisgICAgICAgIChXZWJLaXQ6OkF1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVudDo6
c2V0U3VnZ2VzdGlvbnMpOgorICAgICAgICAqIHNyYy9BdXRvY29tcGxldGVQb3B1cE1lbnVDbGll
bnQuaDoKKyAgICAgICAgKiBzcmMvU3VnZ2VzdGlvbnNQb3B1cE1lbnVDbGllbnQuY3BwOiBBZGRl
ZC4KKyAgICAgICAgKFdlYktpdDo6U3VnZ2VzdGlvbnNQb3B1cE1lbnVDbGllbnQ6OlN1Z2dlc3Rp
b25zUG9wdXBNZW51Q2xpZW50KToKKyAgICAgICAgKFdlYktpdDo6U3VnZ2VzdGlvbnNQb3B1cE1l
bnVDbGllbnQ6On5TdWdnZXN0aW9uc1BvcHVwTWVudUNsaWVudCk6CisgICAgICAgIChXZWJLaXQ6
OlN1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50Ojp2YWx1ZUNoYW5nZWQpOgorICAgICAgICAoV2Vi
S2l0OjpTdWdnZXN0aW9uc1BvcHVwTWVudUNsaWVudDo6c2VsZWN0aW9uQ2hhbmdlZCk6CisgICAg
ICAgIChXZWJLaXQ6OlN1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50OjppdGVtVGV4dCk6CisgICAg
ICAgIChXZWJLaXQ6OlN1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50OjppdGVtU3R5bGUpOgorICAg
ICAgICAoV2ViS2l0OjpTdWdnZXN0aW9uc1BvcHVwTWVudUNsaWVudDo6bWVudVN0eWxlKToKKyAg
ICAgICAgKFdlYktpdDo6U3VnZ2VzdGlvbnNQb3B1cE1lbnVDbGllbnQ6OmNsaWVudFBhZGRpbmdM
ZWZ0KToKKyAgICAgICAgKFdlYktpdDo6U3VnZ2VzdGlvbnNQb3B1cE1lbnVDbGllbnQ6OmNsaWVu
dFBhZGRpbmdSaWdodCk6CisgICAgICAgIChXZWJLaXQ6OlN1Z2dlc3Rpb25zUG9wdXBNZW51Q2xp
ZW50Ojpwb3B1cERpZEhpZGUpOgorICAgICAgICAoV2ViS2l0OjpTdWdnZXN0aW9uc1BvcHVwTWVu
dUNsaWVudDo6c2V0VGV4dEZyb21JdGVtKToKKyAgICAgICAgKFdlYktpdDo6U3VnZ2VzdGlvbnNQ
b3B1cE1lbnVDbGllbnQ6OnJlc2V0TGFzdFN1Z2dlc3Rpb24pOgorICAgICAgICAoV2ViS2l0OjpT
dWdnZXN0aW9uc1BvcHVwTWVudUNsaWVudDo6Zm9udFNlbGVjdG9yKToKKyAgICAgICAgKFdlYktp
dDo6U3VnZ2VzdGlvbnNQb3B1cE1lbnVDbGllbnQ6Omhvc3RXaW5kb3cpOgorICAgICAgICAoV2Vi
S2l0OjpTdWdnZXN0aW9uc1BvcHVwTWVudUNsaWVudDo6Y3JlYXRlU2Nyb2xsYmFyKToKKyAgICAg
ICAgKFdlYktpdDo6U3VnZ2VzdGlvbnNQb3B1cE1lbnVDbGllbnQ6OnRleHRGaWVsZFN0eWxlKToK
KyAgICAgICAgKFdlYktpdDo6U3VnZ2VzdGlvbnNQb3B1cE1lbnVDbGllbnQ6OmluaXRpYWxpemUp
OgorICAgICAgICAoV2ViS2l0OjpTdWdnZXN0aW9uc1BvcHVwTWVudUNsaWVudDo6c2V0SW5pdGlh
bFN1Z2dlc3Rpb24pOgorICAgICAgICAoV2ViS2l0OjpTdWdnZXN0aW9uc1BvcHVwTWVudUNsaWVu
dDo6c2V0U3VnZ2VzdGVkVmFsdWUpOgorICAgICAgICAqIHNyYy9TdWdnZXN0aW9uc1BvcHVwTWVu
dUNsaWVudC5oOiBBZGRlZC4KKyAgICAgICAgKFdlYktpdDo6U3VnZ2VzdGlvbnNQb3B1cE1lbnVD
bGllbnQ6Oml0ZW1Ub29sVGlwKToKKyAgICAgICAgKFdlYktpdDo6U3VnZ2VzdGlvbnNQb3B1cE1l
bnVDbGllbnQ6Oml0ZW1Jc0VuYWJsZWQpOgorICAgICAgICAoV2ViS2l0OjpTdWdnZXN0aW9uc1Bv
cHVwTWVudUNsaWVudDo6Y2xpZW50SW5zZXRMZWZ0KToKKyAgICAgICAgKFdlYktpdDo6U3VnZ2Vz
dGlvbnNQb3B1cE1lbnVDbGllbnQ6OmNsaWVudEluc2V0UmlnaHQpOgorICAgICAgICAoV2ViS2l0
OjpTdWdnZXN0aW9uc1BvcHVwTWVudUNsaWVudDo6bGlzdFNpemUpOgorICAgICAgICAoV2ViS2l0
OjpTdWdnZXN0aW9uc1BvcHVwTWVudUNsaWVudDo6c2VsZWN0ZWRJbmRleCk6CisgICAgICAgIChX
ZWJLaXQ6OlN1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50OjppdGVtSXNTZXBhcmF0b3IpOgorICAg
ICAgICAoV2ViS2l0OjpTdWdnZXN0aW9uc1BvcHVwTWVudUNsaWVudDo6aXRlbUlzTGFiZWwpOgor
ICAgICAgICAoV2ViS2l0OjpTdWdnZXN0aW9uc1BvcHVwTWVudUNsaWVudDo6aXRlbUlzU2VsZWN0
ZWQpOgorICAgICAgICAoV2ViS2l0OjpTdWdnZXN0aW9uc1BvcHVwTWVudUNsaWVudDo6c2hvdWxk
UG9wT3Zlcik6CisgICAgICAgIChXZWJLaXQ6OlN1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50Ojp2
YWx1ZVNob3VsZENoYW5nZU9uSG90VHJhY2spOgorICAgICAgICAoV2ViS2l0OjpTdWdnZXN0aW9u
c1BvcHVwTWVudUNsaWVudDo6Z2V0U2VsZWN0ZWRJbmRleCk6CisgICAgICAgIChXZWJLaXQ6OlN1
Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50OjpzZXRTZWxlY3RlZEluZGV4KToKKyAgICAgICAgKFdl
YktpdDo6U3VnZ2VzdGlvbnNQb3B1cE1lbnVDbGllbnQ6OmdldFdlYlZpZXcpOgorICAgICAgICAo
V2ViS2l0OjpTdWdnZXN0aW9uc1BvcHVwTWVudUNsaWVudDo6Z2V0VGV4dEZpZWxkKToKKyAgICAg
ICAgKiBzcmMvV2ViVmlld0ltcGwuY3BwOgorICAgICAgICAoV2ViS2l0OjpXZWJWaWV3SW1wbDo6
a2V5RXZlbnQpOgorICAgICAgICAoV2ViS2l0OjpXZWJWaWV3SW1wbDo6YXV0b2NvbXBsZXRlSGFu
ZGxlS2V5RXZlbnQpOgorICAgICAgICAoV2ViS2l0OjpXZWJWaWV3SW1wbDo6YXBwbHlBdXRvZmls
bFN1Z2dlc3Rpb25zKToKKyAgICAgICAgKFdlYktpdDo6V2ViVmlld0ltcGw6OmFwcGx5QXV0b0Zp
bGxTdWdnZXN0aW9ucyk6CisgICAgICAgIChXZWJLaXQ6OldlYlZpZXdJbXBsOjphcHBseUF1dG9j
b21wbGV0ZVN1Z2dlc3Rpb25zKToKKyAgICAgICAgKiBzcmMvV2ViVmlld0ltcGwuaDoKKwogMjAx
MC0wMi0wOCAgRGlyayBTY2h1bHplICA8a3JpdEB3ZWJraXQub3JnPgogCiAgICAgICAgIFJldmll
d2VkIGJ5IE5pa29sYXMgWmltbWVybWFubi4KSW5kZXg6IFdlYktpdC9jaHJvbWl1bS9XZWJLaXQu
Z3lwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFdlYktpdC9jaHJvbWl1bS9XZWJLaXQuZ3lwCShyZXZpc2lvbiA1
NDUwMSkKKysrIFdlYktpdC9jaHJvbWl1bS9XZWJLaXQuZ3lwCSh3b3JraW5nIGNvcHkpCkBAIC0x
OTksNiArMTk5LDggQEAKICAgICAgICAgICAgICAgICAnc3JjL0Fzc2VydE1hdGNoaW5nRW51bXMu
Y3BwJywKICAgICAgICAgICAgICAgICAnc3JjL0F1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVudC5j
cHAnLAogICAgICAgICAgICAgICAgICdzcmMvQXV0b2NvbXBsZXRlUG9wdXBNZW51Q2xpZW50Lmgn
LAorICAgICAgICAgICAgICAgICdzcmMvQXV0b0ZpbGxQb3B1cE1lbnVDbGllbnQuY3BwJywKKyAg
ICAgICAgICAgICAgICAnc3JjL0F1dG9GaWxsUG9wdXBNZW51Q2xpZW50LmgnLAogICAgICAgICAg
ICAgICAgICdzcmMvQmFja0ZvcndhcmRMaXN0Q2xpZW50SW1wbC5jcHAnLAogICAgICAgICAgICAg
ICAgICdzcmMvQmFja0ZvcndhcmRMaXN0Q2xpZW50SW1wbC5oJywKICAgICAgICAgICAgICAgICAn
c3JjL0JvdW5kT2JqZWN0LmNwcCcsCkBAIC0yNTcsNiArMjU5LDggQEAKICAgICAgICAgICAgICAg
ICAnc3JjL1N0b3JhZ2VFdmVudERpc3BhdGNoZXJJbXBsLmgnLAogICAgICAgICAgICAgICAgICdz
cmMvU3RvcmFnZU5hbWVzcGFjZVByb3h5LmNwcCcsCiAgICAgICAgICAgICAgICAgJ3NyYy9TdG9y
YWdlTmFtZXNwYWNlUHJveHkuaCcsCisgICAgICAgICAgICAgICAgJ3NyYy9TdWdnZXN0aW9uc1Bv
cHVwTWVudUNsaWVudC5jcHAnLAorICAgICAgICAgICAgICAgICdzcmMvU3VnZ2VzdGlvbnNQb3B1
cE1lbnVDbGllbnQuaCcsCiAgICAgICAgICAgICAgICAgJ3NyYy9UZW1wb3JhcnlHbHVlLmgnLAog
ICAgICAgICAgICAgICAgICdzcmMvVG9vbHNBZ2VudC5oJywKICAgICAgICAgICAgICAgICAnc3Jj
L1dlYkFjY2Vzc2liaWxpdHlDYWNoZS5jcHAnLApJbmRleDogV2ViS2l0L2Nocm9taXVtL3B1Ymxp
Yy9XZWJWaWV3LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0L2Nocm9taXVtL3B1YmxpYy9XZWJWaWV3
LmgJKHJldmlzaW9uIDU0NTAxKQorKysgV2ViS2l0L2Nocm9taXVtL3B1YmxpYy9XZWJWaWV3LmgJ
KHdvcmtpbmcgY29weSkKQEAgLTIyNSwxMiArMjI1LDI3IEBAIHB1YmxpYzoKIAogICAgIC8vIEF1
dG9maWxsIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLQogCi0gICAgLy8gTm90aWZpZXMgdGhlIFdlYlZpZXcgdGhhdCBhdXRvZmlsbCBz
dWdnZXN0aW9ucyBhcmUgYXZhaWxhYmxlIGZvciBhIG5vZGUuCisgICAgLy8gREVQUkVDQVRFRDog
V2ViVmlldzo6YXBwbHlBdXRvY29tcGxldGVTdWdnZXN0aW9ucyBpcyB0aGUgbmV3IHdheSB0bwor
ICAgIC8vIGFjY2VzcyB0aGlzLgogICAgIHZpcnR1YWwgdm9pZCBhcHBseUF1dG9maWxsU3VnZ2Vz
dGlvbnMoCiAgICAgICAgIGNvbnN0IFdlYk5vZGUmLAogICAgICAgICBjb25zdCBXZWJWZWN0b3I8
V2ViU3RyaW5nPiYgc3VnZ2VzdGlvbnMsCiAgICAgICAgIGludCBkZWZhdWx0U3VnZ2VzdGlvbklu
ZGV4KSA9IDA7CiAKKyAgICAvLyBOb3RpZmllcyB0aGUgV2ViVmlldyB0aGF0IEF1dG9GaWxsIHN1
Z2dlc3Rpb25zIGFyZSBhdmFpbGFibGUgZm9yIGEgbm9kZS4KKyAgICB2aXJ0dWFsIHZvaWQgYXBw
bHlBdXRvRmlsbFN1Z2dlc3Rpb25zKAorICAgICAgICBjb25zdCBXZWJOb2RlJiwKKyAgICAgICAg
Y29uc3QgV2ViVmVjdG9yPFdlYlN0cmluZz4mIG5hbWVzLAorICAgICAgICBjb25zdCBXZWJWZWN0
b3I8V2ViU3RyaW5nPiYgbGFiZWxzLAorICAgICAgICBpbnQgZGVmYXVsdFN1Z2dlc3Rpb25JbmRl
eCkgPSAwOworCisgICAgLy8gTm90aWZpZXMgdGhlIFdlYlZpZXcgdGhhdCBBdXRvY29tcGxldGUg
c3VnZ2VzdGlvbnMgYXJlIGF2YWlsYWJsZSBmb3IgYQorICAgIC8vIG5vZGUuCisgICAgdmlydHVh
bCB2b2lkIGFwcGx5QXV0b2NvbXBsZXRlU3VnZ2VzdGlvbnMoCisgICAgICAgIGNvbnN0IFdlYk5v
ZGUmLAorICAgICAgICBjb25zdCBXZWJWZWN0b3I8V2ViU3RyaW5nPiYgc3VnZ2VzdGlvbnMsCisg
ICAgICAgIGludCBkZWZhdWx0U3VnZ2VzdGlvbkluZGV4KSA9IDA7CisKICAgICAvLyBERVBSRUNB
VEVEOiBXZWJWaWV3OjpoaWRlU3VnZ2VzdGlvbnNQb3B1cCBpcyB0aGUgbmV3IHdheSB0byBhY2Nl
c3MgdGhpcy4KICAgICB2aXJ0dWFsIHZvaWQgaGlkZUF1dG9maWxsUG9wdXAoKSA9IDA7CiAKSW5k
ZXg6IFdlYktpdC9jaHJvbWl1bS9zcmMvQXV0b0ZpbGxQb3B1cE1lbnVDbGllbnQuY3BwCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFdlYktpdC9jaHJvbWl1bS9zcmMvQXV0b0ZpbGxQb3B1cE1lbnVDbGllbnQuY3Bw
CShyZXZpc2lvbiAwKQorKysgV2ViS2l0L2Nocm9taXVtL3NyYy9BdXRvRmlsbFBvcHVwTWVudUNs
aWVudC5jcHAJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMTIyIEBACisvKgorICogQ29weXJpZ2h0
IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0
cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRo
b3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9s
bG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVj
ZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFu
ZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4K
KyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBv
ZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUg
cHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMg
cHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklE
RUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIg
QU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9U
CisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElU
WSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVE
LiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRP
UlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQ
RUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJV
VCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1Ig
U0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1Mg
SU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElB
QklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisg
KiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkg
T1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBU
SEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5o
IgorI2luY2x1ZGUgIkF1dG9GaWxsUG9wdXBNZW51Q2xpZW50LmgiCisKKyNpbmNsdWRlICJDU1NT
dHlsZVNlbGVjdG9yLmgiCisjaW5jbHVkZSAiQ1NTVmFsdWVLZXl3b3Jkcy5oIgorI2luY2x1ZGUg
IkZyYW1lVmlldy5oIgorI2luY2x1ZGUgIkhUTUxJbnB1dEVsZW1lbnQuaCIKKyNpbmNsdWRlICJS
ZW5kZXJUaGVtZS5oIgorI2luY2x1ZGUgIldlYk5vZGUuaCIKKyNpbmNsdWRlICJXZWJWZWN0b3Iu
aCIKKyNpbmNsdWRlICJXZWJWaWV3Q2xpZW50LmgiCisjaW5jbHVkZSAiV2ViVmlld0ltcGwuaCIK
KwordXNpbmcgbmFtZXNwYWNlIFdlYkNvcmU7CisKK25hbWVzcGFjZSBXZWJLaXQgeworCitBdXRv
RmlsbFBvcHVwTWVudUNsaWVudDo6QXV0b0ZpbGxQb3B1cE1lbnVDbGllbnQoV2ViVmlld0ltcGwq
IHdlYlZpZXcpCisgICAgOiBTdWdnZXN0aW9uc1BvcHVwTWVudUNsaWVudCh3ZWJWaWV3KQorewor
fQorCitBdXRvRmlsbFBvcHVwTWVudUNsaWVudDo6fkF1dG9GaWxsUG9wdXBNZW51Q2xpZW50KCkK
K3sKK30KKworc2l6ZV90IEF1dG9GaWxsUG9wdXBNZW51Q2xpZW50OjpnZXRTdWdnZXN0aW9uc1Np
emUoKSBjb25zdAoreworICAgIHJldHVybiBtX25hbWVzLnNpemUoKTsKK30KKworV2ViU3RyaW5n
IEF1dG9GaWxsUG9wdXBNZW51Q2xpZW50OjpnZXRTdWdnZXN0aW9uKHVuc2lnbmVkIGxpc3RJbmRl
eCkgY29uc3QKK3sKKyAgICAvLyBUT0RPKGpoYXdraW5zKTogTW9kaWZ5IHRoZSBQb3B1cE1lbnUg
dG8gYWRkIHRoZSBsYWJlbCBpbiBncmF5CisgICAgLy8gcmlnaHQtanVzdGlmaWVkLgorICAgIEFT
U0VSVChsaXN0SW5kZXggPj0gMCAmJiBsaXN0SW5kZXggPCBtX25hbWVzLnNpemUoKSk7CisgICAg
cmV0dXJuIG1fbmFtZXNbbGlzdEluZGV4XSArIFdlYlN0cmluZygiICgiKSArIG1fbGFiZWxzW2xp
c3RJbmRleF0gKyBXZWJTdHJpbmcoIikiKTsKK30KKwordm9pZCBBdXRvRmlsbFBvcHVwTWVudUNs
aWVudDo6cmVtb3ZlU3VnZ2VzdGlvbkF0SW5kZXgodW5zaWduZWQgbGlzdEluZGV4KQoreworICAg
IC8vIFRPRE8oamhhd2tpbnMpOiBEbyB3ZSB3YW50IHRvIHJlbW92ZSBBdXRvRmlsbCBzdWdnZXN0
aW9ucz8KKyAgICBBU1NFUlQobGlzdEluZGV4ID49IDAgJiYgbGlzdEluZGV4IDwgc3RhdGljX2Nh
c3Q8aW50PihtX25hbWVzLnNpemUoKSkpOworICAgIG1fbmFtZXMucmVtb3ZlKGxpc3RJbmRleCk7
CisgICAgbV9sYWJlbHMucmVtb3ZlKGxpc3RJbmRleCk7Cit9CisKK3ZvaWQgQXV0b0ZpbGxQb3B1
cE1lbnVDbGllbnQ6OiBzZWxlY3Rpb25DaGFuZ2VkKHVuc2lnbmVkIGxpc3RJbmRleCwKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZmlyZUV2ZW50
cykgeworICAgIGlmIChsaXN0SW5kZXggPT0gc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KC0xKSkgewor
ICAgICAgICBTdWdnZXN0aW9uc1BvcHVwTWVudUNsaWVudDo6c2VsZWN0aW9uQ2hhbmdlZChsaXN0
SW5kZXgsIGZpcmVFdmVudHMpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQVNTRVJU
KGxpc3RJbmRleCA+PSAwICYmIGxpc3RJbmRleCA8IG1fbmFtZXMuc2l6ZSgpKTsKKyAgICBzZXRT
dWdnZXN0ZWRWYWx1ZShtX25hbWVzW2xpc3RJbmRleF0pOworfQorCit2b2lkIEF1dG9GaWxsUG9w
dXBNZW51Q2xpZW50Ojppbml0aWFsaXplKAorICAgIEhUTUxJbnB1dEVsZW1lbnQqIHRleHRGaWVs
ZCwKKyAgICBjb25zdCBXZWJWZWN0b3I8V2ViU3RyaW5nPiYgbmFtZXMsCisgICAgY29uc3QgV2Vi
VmVjdG9yPFdlYlN0cmluZz4mIGxhYmVscywKKyAgICBpbnQgZGVmYXVsdFN1Z2dlc3Rpb25JbmRl
eCkKK3sKKyAgICBBU1NFUlQobmFtZXMuc2l6ZSgpID09IGxhYmVscy5zaXplKCkpOworICAgIEFT
U0VSVChkZWZhdWx0U3VnZ2VzdGlvbkluZGV4IDwgc3RhdGljX2Nhc3Q8aW50PihuYW1lcy5zaXpl
KCkpKTsKKworICAgIC8vIFRoZSBzdWdnZXN0aW9ucyBtdXN0IGJlIHNldCBiZWZvcmUgaW5pdGlh
bGl6aW5nIHRoZQorICAgIC8vIFN1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50LgorICAgIHNldFN1
Z2dlc3Rpb25zKG5hbWVzLCBsYWJlbHMpOworCisgICAgU3VnZ2VzdGlvbnNQb3B1cE1lbnVDbGll
bnQ6OmluaXRpYWxpemUodGV4dEZpZWxkLCBkZWZhdWx0U3VnZ2VzdGlvbkluZGV4KTsKK30KKwor
dm9pZCBBdXRvRmlsbFBvcHVwTWVudUNsaWVudDo6c2V0U3VnZ2VzdGlvbnMoY29uc3QgV2ViVmVj
dG9yPFdlYlN0cmluZz4mIG5hbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgY29uc3QgV2ViVmVjdG9yPFdlYlN0cmluZz4mIGxhYmVscykKK3sKKyAgICBB
U1NFUlQobmFtZXMuc2l6ZSgpID09IGxhYmVscy5zaXplKCkpOworCisgICAgbV9uYW1lcy5jbGVh
cigpOworICAgIG1fbGFiZWxzLmNsZWFyKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBu
YW1lcy5zaXplKCk7ICsraSkgeworICAgICAgICBtX25hbWVzLmFwcGVuZChuYW1lc1tpXSk7Cisg
ICAgICAgIG1fbGFiZWxzLmFwcGVuZChsYWJlbHNbaV0pOworICAgIH0KKworICAgIC8vIFRyeSB0
byBwcmVzZXJ2ZSBzZWxlY3Rpb24gaWYgcG9zc2libGUuCisgICAgaWYgKGdldFNlbGVjdGVkSW5k
ZXgoKSA+PSBzdGF0aWNfY2FzdDxpbnQ+KG5hbWVzLnNpemUoKSkpCisgICAgICAgIHNldFNlbGVj
dGVkSW5kZXgoLTEpOworfQorCit9IC8vIG5hbWVzcGFjZSBXZWJLaXQKSW5kZXg6IFdlYktpdC9j
aHJvbWl1bS9zcmMvQXV0b0ZpbGxQb3B1cE1lbnVDbGllbnQuaAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJL
aXQvY2hyb21pdW0vc3JjL0F1dG9GaWxsUG9wdXBNZW51Q2xpZW50LmgJKHJldmlzaW9uIDApCisr
KyBXZWJLaXQvY2hyb21pdW0vc3JjL0F1dG9GaWxsUG9wdXBNZW51Q2xpZW50LmgJKHJldmlzaW9u
IDApCkBAIC0wLDAgKzEsNzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIElu
Yy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlu
IHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlv
biwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBh
cmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUg
bXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0
cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29w
eXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0
aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0
b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZy
b20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1p
c3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hU
IEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1Ig
SU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRI
RSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgor
ICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxM
IFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFO
WSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBP
UiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBU
TywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBV
U0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VW
RVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4g
Q09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElH
RU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICog
T0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBT
VUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIEF1dG9GaWxsUG9wdXBNZW51Q2xpZW50X2gKKyNk
ZWZpbmUgQXV0b0ZpbGxQb3B1cE1lbnVDbGllbnRfaAorCisjaW5jbHVkZSAiU3VnZ2VzdGlvbnNQ
b3B1cE1lbnVDbGllbnQuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworY2xhc3MgSFRNTElucHV0
RWxlbWVudDsKK2NsYXNzIFBvcHVwTWVudVN0eWxlOworY2xhc3MgUmVuZGVyU3R5bGU7Cit9CisK
K25hbWVzcGFjZSBXZWJLaXQgeworY2xhc3MgV2ViU3RyaW5nOworY2xhc3MgV2ViVmlld0ltcGw7
Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY2xhc3MgV2ViVmVjdG9yOworCisvLyAKK2NsYXNzIEF1
dG9GaWxsUG9wdXBNZW51Q2xpZW50IDogcHVibGljIFN1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50
IHsKK3B1YmxpYzoKKyAgICBBdXRvRmlsbFBvcHVwTWVudUNsaWVudChXZWJWaWV3SW1wbCogd2Vi
Vmlldyk7CisgICAgdmlydHVhbCB+QXV0b0ZpbGxQb3B1cE1lbnVDbGllbnQoKTsKKworICAgIC8v
IFN1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50IGltcGxlbWVudGF0aW9uOgorICAgIHZpcnR1YWwg
c2l6ZV90IGdldFN1Z2dlc3Rpb25zU2l6ZSgpIGNvbnN0OworICAgIHZpcnR1YWwgV2ViU3RyaW5n
IGdldFN1Z2dlc3Rpb24odW5zaWduZWQgbGlzdEluZGV4KSBjb25zdDsKKyAgICB2aXJ0dWFsIHZv
aWQgcmVtb3ZlU3VnZ2VzdGlvbkF0SW5kZXgodW5zaWduZWQgbGlzdEluZGV4KTsKKworICAgIC8v
IFdlYkNvcmU6OlBvcHVwTWVudUNsaWVudCBpbXBsZW1lbnRhdGlvbjoKKyAgICB2aXJ0dWFsIHZv
aWQgc2VsZWN0aW9uQ2hhbmdlZCh1bnNpZ25lZCBsaXN0SW5kZXgsIGJvb2wgZmlyZUV2ZW50cyk7
CisKKyAgICB2b2lkIGluaXRpYWxpemUoV2ViQ29yZTo6SFRNTElucHV0RWxlbWVudCosCisgICAg
ICAgICAgICAgICAgICAgIGNvbnN0IFdlYlZlY3RvcjxXZWJTdHJpbmc+JiBuYW1lcywKKyAgICAg
ICAgICAgICAgICAgICAgY29uc3QgV2ViVmVjdG9yPFdlYlN0cmluZz4mIGxhYmVscywKKyAgICAg
ICAgICAgICAgICAgICAgaW50IGRlZmF1bHRTdWdnZXN0aW9uSW5kZXgpOworCisgICAgdm9pZCBz
ZXRTdWdnZXN0aW9ucyhjb25zdCBXZWJWZWN0b3I8V2ViU3RyaW5nPiYgbmFtZXMsCisgICAgICAg
ICAgICAgICAgICAgICAgICBjb25zdCBXZWJWZWN0b3I8V2ViU3RyaW5nPiYgbGFiZWxzKTsKKwor
cHJpdmF0ZToKKyAgICBWZWN0b3I8V2ViQ29yZTo6U3RyaW5nPiBtX25hbWVzOworICAgIFZlY3Rv
cjxXZWJDb3JlOjpTdHJpbmc+IG1fbGFiZWxzOworfTsKKworfSAvLyBuYW1lc3BhY2UgV2ViS2l0
CisKKyNlbmRpZgoKUHJvcGVydHkgY2hhbmdlcyBvbjogV2ViS2l0L2Nocm9taXVtL3NyYy9BdXRv
RmlsbFBvcHVwTWVudUNsaWVudC5oCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KQWRkZWQ6IHN2bjplb2wtc3R5bGUKICAg
KyBMRgoKSW5kZXg6IFdlYktpdC9jaHJvbWl1bS9zcmMvQXV0b2NvbXBsZXRlUG9wdXBNZW51Q2xp
ZW50LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQvY2hyb21pdW0vc3JjL0F1dG9jb21wbGV0ZVBv
cHVwTWVudUNsaWVudC5jcHAJKHJldmlzaW9uIDU0NTAxKQorKysgV2ViS2l0L2Nocm9taXVtL3Ny
Yy9BdXRvY29tcGxldGVQb3B1cE1lbnVDbGllbnQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xLDUg
KzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBHb29nbGUgSW5jLiBBbGwgcmlnaHRz
IHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCkBAIC00NCw5ICs0
NCw3IEBAIHVzaW5nIG5hbWVzcGFjZSBXZWJDb3JlOwogbmFtZXNwYWNlIFdlYktpdCB7CiAKIEF1
dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVudDo6QXV0b2NvbXBsZXRlUG9wdXBNZW51Q2xpZW50KFdl
YlZpZXdJbXBsKiB3ZWJWaWV3KQotICAgIDogbV90ZXh0RmllbGQoMCkKLSAgICAsIG1fc2VsZWN0
ZWRJbmRleCgwKQotICAgICwgbV93ZWJWaWV3KHdlYlZpZXcpCisgICAgOiBTdWdnZXN0aW9uc1Bv
cHVwTWVudUNsaWVudCh3ZWJWaWV3KQogewogfQogCkBAIC01NCw5NiArNTIsMzUgQEAgQXV0b2Nv
bXBsZXRlUG9wdXBNZW51Q2xpZW50Ojp+QXV0b2NvbXBsZQogewogfQogCi12b2lkIEF1dG9jb21w
bGV0ZVBvcHVwTWVudUNsaWVudDo6aW5pdGlhbGl6ZSgKLSAgICBIVE1MSW5wdXRFbGVtZW50KiB0
ZXh0RmllbGQsCi0gICAgY29uc3QgV2ViVmVjdG9yPFdlYlN0cmluZz4mIHN1Z2dlc3Rpb25zLAot
ICAgIGludCBkZWZhdWx0U3VnZ2VzdGlvbkluZGV4KQorc2l6ZV90IEF1dG9jb21wbGV0ZVBvcHVw
TWVudUNsaWVudDo6Z2V0U3VnZ2VzdGlvbnNTaXplKCkgY29uc3QKIHsKLSAgICBBU1NFUlQoZGVm
YXVsdFN1Z2dlc3Rpb25JbmRleCA8IHN0YXRpY19jYXN0PGludD4oc3VnZ2VzdGlvbnMuc2l6ZSgp
KSk7Ci0gICAgbV90ZXh0RmllbGQgPSB0ZXh0RmllbGQ7Ci0gICAgbV9zZWxlY3RlZEluZGV4ID0g
ZGVmYXVsdFN1Z2dlc3Rpb25JbmRleDsKLSAgICBzZXRTdWdnZXN0aW9ucyhzdWdnZXN0aW9ucyk7
Ci0KLSAgICBGb250RGVzY3JpcHRpb24gZm9udERlc2NyaXB0aW9uOwotICAgIG1fd2ViVmlldy0+
dGhlbWUoKS0+c3lzdGVtRm9udChDU1NWYWx1ZVdlYmtpdENvbnRyb2wsIGZvbnREZXNjcmlwdGlv
bik7Ci0gICAgLy8gVXNlIGEgc21hbGxlciBmb250IHNpemUgdG8gbWF0Y2ggSUUvRmlyZWZveC4K
LSAgICAvLyBGSVhNRTogaHR0cDovL2NyYnVnLmNvbS83Mzc2IHVzZSB0aGUgc3lzdGVtIHNpemUg
aW5zdGVhZCBvZiBhCi0gICAgLy8gICAgICAgIGZpeGVkIGZvbnQgc2l6ZSB2YWx1ZS4KLSAgICBm
b250RGVzY3JpcHRpb24uc2V0Q29tcHV0ZWRTaXplKDEyLjApOwotICAgIEZvbnQgZm9udChmb250
RGVzY3JpcHRpb24sIDAsIDApOwotICAgIGZvbnQudXBkYXRlKHRleHRGaWVsZC0+ZG9jdW1lbnQo
KS0+c3R5bGVTZWxlY3RvcigpLT5mb250U2VsZWN0b3IoKSk7Ci0gICAgLy8gVGhlIGRpcmVjdGlv
biBvZiB0ZXh0IGluIHBvcHVwIG1lbnUgaXMgc2V0IHRoZSBzYW1lIGFzIHRoZSBkaXJlY3Rpb24g
b2YKLSAgICAvLyB0aGUgaW5wdXQgZWxlbWVudDogdGV4dEZpZWxkLgotICAgIG1fc3R5bGUuc2V0
KG5ldyBQb3B1cE1lbnVTdHlsZShDb2xvcjo6YmxhY2ssIENvbG9yOjp3aGl0ZSwgZm9udCwgdHJ1
ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGVuZ3RoKFdlYkNvcmU6OkZp
eGVkKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dEZpZWxkLT5yZW5k
ZXJlcigpLT5zdHlsZSgpLT5kaXJlY3Rpb24oKSkpOwotfQotCi12b2lkIEF1dG9jb21wbGV0ZVBv
cHVwTWVudUNsaWVudDo6dmFsdWVDaGFuZ2VkKHVuc2lnbmVkIGxpc3RJbmRleCwgYm9vbCBmaXJl
RXZlbnRzKQotewotICAgIG1fdGV4dEZpZWxkLT5zZXRWYWx1ZShtX3N1Z2dlc3Rpb25zW2xpc3RJ
bmRleF0pOwotICAgIEVkaXRvckNsaWVudEltcGwqIGVkaXRvciA9Ci0gICAgICAgIHN0YXRpY19j
YXN0PEVkaXRvckNsaWVudEltcGwqPihtX3dlYlZpZXctPnBhZ2UoKS0+ZWRpdG9yQ2xpZW50KCkp
OwotICAgIEFTU0VSVChlZGl0b3IpOwotICAgIGVkaXRvci0+b25BdXRvZmlsbFN1Z2dlc3Rpb25B
Y2NlcHRlZCgKLSAgICAgICAgc3RhdGljX2Nhc3Q8SFRNTElucHV0RWxlbWVudCo+KG1fdGV4dEZp
ZWxkLmdldCgpKSk7CisgICAgcmV0dXJuIG1fc3VnZ2VzdGlvbnMuc2l6ZSgpOwogfQogCi1TdHJp
bmcgQXV0b2NvbXBsZXRlUG9wdXBNZW51Q2xpZW50OjppdGVtVGV4dCh1bnNpZ25lZCBsaXN0SW5k
ZXgpIGNvbnN0CitXZWJTdHJpbmcgQXV0b2NvbXBsZXRlUG9wdXBNZW51Q2xpZW50OjpnZXRTdWdn
ZXN0aW9uKHVuc2lnbmVkIGxpc3RJbmRleCkgY29uc3QKIHsKKyAgICBBU1NFUlQobGlzdEluZGV4
ID49IDAgJiYgbGlzdEluZGV4IDwgbV9zdWdnZXN0aW9ucy5zaXplKCkpOwogICAgIHJldHVybiBt
X3N1Z2dlc3Rpb25zW2xpc3RJbmRleF07CiB9CiAKLVBvcHVwTWVudVN0eWxlIEF1dG9jb21wbGV0
ZVBvcHVwTWVudUNsaWVudDo6aXRlbVN0eWxlKHVuc2lnbmVkIGxpc3RJbmRleCkgY29uc3QKLXsK
LSAgICByZXR1cm4gKm1fc3R5bGU7Ci19Ci0KLVBvcHVwTWVudVN0eWxlIEF1dG9jb21wbGV0ZVBv
cHVwTWVudUNsaWVudDo6bWVudVN0eWxlKCkgY29uc3QKK3ZvaWQgQXV0b2NvbXBsZXRlUG9wdXBN
ZW51Q2xpZW50OjpyZW1vdmVTdWdnZXN0aW9uQXRJbmRleCh1bnNpZ25lZCBsaXN0SW5kZXgpCiB7
Ci0gICAgcmV0dXJuICptX3N0eWxlOworICAgIEFTU0VSVChsaXN0SW5kZXggPj0gMCAmJiBsaXN0
SW5kZXggPCBtX3N1Z2dlc3Rpb25zLnNpemUoKSk7CisgICAgbV9zdWdnZXN0aW9ucy5yZW1vdmUo
bGlzdEluZGV4KTsKIH0KIAotaW50IEF1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVudDo6Y2xpZW50
UGFkZGluZ0xlZnQoKSBjb25zdAotewotICAgIC8vIEJ1ZyBodHRwOi8vY3JidWcuY29tLzc3MDgg
c2VlbXMgdG8gaW5kaWNhdGUgdGhlIHN0eWxlIGNhbiBiZSAwLgotICAgIFJlbmRlclN0eWxlKiBz
dHlsZSA9IHRleHRGaWVsZFN0eWxlKCk7Ci0gICAgcmV0dXJuIHN0eWxlID8gbV93ZWJWaWV3LT50
aGVtZSgpLT5wb3B1cEludGVybmFsUGFkZGluZ0xlZnQoc3R5bGUpIDogMDsKLX0KLQotaW50IEF1
dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVudDo6Y2xpZW50UGFkZGluZ1JpZ2h0KCkgY29uc3QKLXsK
LSAgICAvLyBCdWcgaHR0cDovL2NyYnVnLmNvbS83NzA4IHNlZW1zIHRvIGluZGljYXRlIHRoZSBz
dHlsZSBjYW4gYmUgMC4KLSAgICBSZW5kZXJTdHlsZSogc3R5bGUgPSB0ZXh0RmllbGRTdHlsZSgp
OwotICAgIHJldHVybiBzdHlsZSA/IG1fd2ViVmlldy0+dGhlbWUoKS0+cG9wdXBJbnRlcm5hbFBh
ZGRpbmdSaWdodChzdHlsZSkgOiAwOwotfQotCi12b2lkIEF1dG9jb21wbGV0ZVBvcHVwTWVudUNs
aWVudDo6cG9wdXBEaWRIaWRlKCkKLXsKLSAgICBtX3dlYlZpZXctPnN1Z2dlc3Rpb25zUG9wdXBE
aWRIaWRlKCk7Ci19Ci0KLXZvaWQgQXV0b2NvbXBsZXRlUG9wdXBNZW51Q2xpZW50OjpzZXRUZXh0
RnJvbUl0ZW0odW5zaWduZWQgbGlzdEluZGV4KQotewotICAgIG1fdGV4dEZpZWxkLT5zZXRWYWx1
ZShtX3N1Z2dlc3Rpb25zW2xpc3RJbmRleF0pOwotfQotCi1Gb250U2VsZWN0b3IqIEF1dG9jb21w
bGV0ZVBvcHVwTWVudUNsaWVudDo6Zm9udFNlbGVjdG9yKCkgY29uc3QKK3ZvaWQgQXV0b2NvbXBs
ZXRlUG9wdXBNZW51Q2xpZW50Ojppbml0aWFsaXplKAorICAgIEhUTUxJbnB1dEVsZW1lbnQqIHRl
eHRGaWVsZCwKKyAgICBjb25zdCBXZWJWZWN0b3I8V2ViU3RyaW5nPiYgc3VnZ2VzdGlvbnMsCisg
ICAgaW50IGRlZmF1bHRTdWdnZXN0aW9uSW5kZXgpCiB7Ci0gICAgcmV0dXJuIG1fdGV4dEZpZWxk
LT5kb2N1bWVudCgpLT5zdHlsZVNlbGVjdG9yKCktPmZvbnRTZWxlY3RvcigpOwotfQorICAgIEFT
U0VSVChkZWZhdWx0U3VnZ2VzdGlvbkluZGV4IDwgc3RhdGljX2Nhc3Q8aW50PihzdWdnZXN0aW9u
cy5zaXplKCkpKTsKIAotSG9zdFdpbmRvdyogQXV0b2NvbXBsZXRlUG9wdXBNZW51Q2xpZW50Ojpo
b3N0V2luZG93KCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV90ZXh0RmllbGQtPmRvY3VtZW50KCkt
PnZpZXcoKS0+aG9zdFdpbmRvdygpOwotfQorICAgIC8vIFRoZSBzdWdnZXN0aW9ucyBtdXN0IGJl
IHNldCBiZWZvcmUgaW5pdGlhbGl6aW5nIHRoZQorICAgIC8vIFN1Z2dlc3Rpb25zUG9wdXBNZW51
Q2xpZW50LgorICAgIHNldFN1Z2dlc3Rpb25zKHN1Z2dlc3Rpb25zKTsKIAotUGFzc1JlZlB0cjxT
Y3JvbGxiYXI+IEF1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVudDo6Y3JlYXRlU2Nyb2xsYmFyKAot
ICAgIFNjcm9sbGJhckNsaWVudCogY2xpZW50LAotICAgIFNjcm9sbGJhck9yaWVudGF0aW9uIG9y
aWVudGF0aW9uLAotICAgIFNjcm9sbGJhckNvbnRyb2xTaXplIHNpemUpCi17Ci0gICAgcmV0dXJu
IFNjcm9sbGJhcjo6Y3JlYXRlTmF0aXZlU2Nyb2xsYmFyKGNsaWVudCwgb3JpZW50YXRpb24sIHNp
emUpOworICAgIFN1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50Ojppbml0aWFsaXplKHRleHRGaWVs
ZCwgZGVmYXVsdFN1Z2dlc3Rpb25JbmRleCk7CiB9CiAKIHZvaWQgQXV0b2NvbXBsZXRlUG9wdXBN
ZW51Q2xpZW50OjpzZXRTdWdnZXN0aW9ucyhjb25zdCBXZWJWZWN0b3I8V2ViU3RyaW5nPiYgc3Vn
Z2VzdGlvbnMpCkBAIC0xNTEsMjggKzg4LDEwIEBAIHZvaWQgQXV0b2NvbXBsZXRlUG9wdXBNZW51
Q2xpZW50OjpzZXRTdWcKICAgICBtX3N1Z2dlc3Rpb25zLmNsZWFyKCk7CiAgICAgZm9yIChzaXpl
X3QgaSA9IDA7IGkgPCBzdWdnZXN0aW9ucy5zaXplKCk7ICsraSkKICAgICAgICAgbV9zdWdnZXN0
aW9ucy5hcHBlbmQoc3VnZ2VzdGlvbnNbaV0pOwotICAgIC8vIFRyeSB0byBwcmVzZXJ2ZSBzZWxl
Y3Rpb24gaWYgcG9zc2libGUuCi0gICAgaWYgKG1fc2VsZWN0ZWRJbmRleCA+PSBzdGF0aWNfY2Fz
dDxpbnQ+KHN1Z2dlc3Rpb25zLnNpemUoKSkpCi0gICAgICAgIG1fc2VsZWN0ZWRJbmRleCA9IC0x
OwotfQogCi12b2lkIEF1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVudDo6cmVtb3ZlSXRlbUF0SW5k
ZXgoaW50IGluZGV4KQotewotICAgIEFTU0VSVChpbmRleCA+PSAwICYmIGluZGV4IDwgc3RhdGlj
X2Nhc3Q8aW50PihtX3N1Z2dlc3Rpb25zLnNpemUoKSkpOwotICAgIG1fc3VnZ2VzdGlvbnMucmVt
b3ZlKGluZGV4KTsKLX0KLQotUmVuZGVyU3R5bGUqIEF1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVu
dDo6dGV4dEZpZWxkU3R5bGUoKSBjb25zdAotewotICAgIFJlbmRlclN0eWxlKiBzdHlsZSA9IG1f
dGV4dEZpZWxkLT5jb21wdXRlZFN0eWxlKCk7Ci0gICAgaWYgKCFzdHlsZSkgewotICAgICAgICAv
LyBJdCBzZWVtcyB3ZSBjYW4gb25seSBoYXZlIGEgMCBzdHlsZSBpbiBhIFRleHRGaWVsZCBpZiB0
aGUKLSAgICAgICAgLy8gbm9kZSBpcyBkZXRhY2hlZCwgaW4gd2hpY2ggY2FzZSB3ZSB0aGUgcG9w
dXAgc2hvdWQgbm90IGJlCi0gICAgICAgIC8vIHNob3dpbmcuICBQbGVhc2UgcmVwb3J0IHRoaXMg
aW4gaHR0cDovL2NyYnVnLmNvbS83NzA4IGFuZAotICAgICAgICAvLyBpbmNsdWRlIHRoZSBwYWdl
IHlvdSB3ZXJlIHZpc2l0aW5nLgotICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKLSAgICB9
Ci0gICAgcmV0dXJuIHN0eWxlOworICAgIC8vIFRyeSB0byBwcmVzZXJ2ZSBzZWxlY3Rpb24gaWYg
cG9zc2libGUuCisgICAgaWYgKGdldFNlbGVjdGVkSW5kZXgoKSA+PSBzdGF0aWNfY2FzdDxpbnQ+
KHN1Z2dlc3Rpb25zLnNpemUoKSkpCisgICAgICAgIHNldFNlbGVjdGVkSW5kZXgoLTEpOwogfQog
CiB9IC8vIG5hbWVzcGFjZSBXZWJLaXQKSW5kZXg6IFdlYktpdC9jaHJvbWl1bS9zcmMvQXV0b2Nv
bXBsZXRlUG9wdXBNZW51Q2xpZW50LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0L2Nocm9taXVtL3Ny
Yy9BdXRvY29tcGxldGVQb3B1cE1lbnVDbGllbnQuaAkocmV2aXNpb24gNTQ1MDEpCisrKyBXZWJL
aXQvY2hyb21pdW0vc3JjL0F1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVudC5oCSh3b3JraW5nIGNv
cHkpCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBHb29nbGUgSW5j
LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMu
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAgKiBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJl
CkBAIC0yOCw3ICsyOCwxMCBAQAogICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VE
IE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KICAqLwogCi0jaW5jbHVkZSAiUG9w
dXBNZW51Q2xpZW50LmgiCisjaWZuZGVmIEF1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVudF9oCisj
ZGVmaW5lIEF1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVudF9oCisgCisjaW5jbHVkZSAiU3VnZ2Vz
dGlvbnNQb3B1cE1lbnVDbGllbnQuaCIKIAogbmFtZXNwYWNlIFdlYkNvcmUgewogY2xhc3MgSFRN
TElucHV0RWxlbWVudDsKQEAgLTQyLDU1ICs0NSwyNiBAQCBjbGFzcyBXZWJWaWV3SW1wbDsKIHRl
bXBsYXRlIDx0eXBlbmFtZSBUPiBjbGFzcyBXZWJWZWN0b3I7CiAKIC8vIEF1dG9jb21wbGV0ZVBv
cHVwTWVudUNsaWVudAotY2xhc3MgQXV0b2NvbXBsZXRlUG9wdXBNZW51Q2xpZW50IDogcHVibGlj
IFdlYkNvcmU6OlBvcHVwTWVudUNsaWVudCB7CitjbGFzcyBBdXRvY29tcGxldGVQb3B1cE1lbnVD
bGllbnQgOiBwdWJsaWMgU3VnZ2VzdGlvbnNQb3B1cE1lbnVDbGllbnQgewogcHVibGljOgotICAg
IEF1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVudChXZWJWaWV3SW1wbCogd2Vidmlldyk7Ci0gICAg
fkF1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVudCgpOworICAgIEF1dG9jb21wbGV0ZVBvcHVwTWVu
dUNsaWVudChXZWJWaWV3SW1wbCogd2ViVmlldyk7CisgICAgdmlydHVhbCB+QXV0b2NvbXBsZXRl
UG9wdXBNZW51Q2xpZW50KCk7CisKKyAgICAvLyBTdWdnZXN0aW9uc1BvcHVwTWVudUNsaWVudCBp
bXBsZW1lbnRhdGlvbjoKKyAgICB2aXJ0dWFsIHNpemVfdCBnZXRTdWdnZXN0aW9uc1NpemUoKSBj
b25zdDsKKyAgICB2aXJ0dWFsIFdlYlN0cmluZyBnZXRTdWdnZXN0aW9uKHVuc2lnbmVkIGxpc3RJ
bmRleCkgY29uc3Q7CisgICAgdmlydHVhbCB2b2lkIHJlbW92ZVN1Z2dlc3Rpb25BdEluZGV4KHVu
c2lnbmVkIGxpc3RJbmRleCk7CiAKICAgICB2b2lkIGluaXRpYWxpemUoV2ViQ29yZTo6SFRNTElu
cHV0RWxlbWVudCosCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdlYlZlY3RvcjxXZWJTdHJp
bmc+JiBzdWdnZXN0aW9ucywKICAgICAgICAgICAgICAgICAgICAgaW50IGRlZmF1bHRTdWdnZXN0
aW9uSW5kZXgpOwogCi0gICAgV2ViQ29yZTo6SFRNTElucHV0RWxlbWVudCogdGV4dEZpZWxkKCkg
Y29uc3QgeyByZXR1cm4gbV90ZXh0RmllbGQuZ2V0KCk7IH0KLQogICAgIHZvaWQgc2V0U3VnZ2Vz
dGlvbnMoY29uc3QgV2ViVmVjdG9yPFdlYlN0cmluZz4mKTsKLSAgICB2b2lkIHJlbW92ZUl0ZW1B
dEluZGV4KGludCBpbmRleCk7Ci0KLSAgICAvLyBXZWJDb3JlOjpQb3B1cE1lbnVDbGllbnQgbWV0
aG9kczoKLSAgICB2aXJ0dWFsIHZvaWQgdmFsdWVDaGFuZ2VkKHVuc2lnbmVkIGxpc3RJbmRleCwg
Ym9vbCBmaXJlRXZlbnRzID0gdHJ1ZSk7Ci0gICAgdmlydHVhbCBXZWJDb3JlOjpTdHJpbmcgaXRl
bVRleHQodW5zaWduZWQgbGlzdEluZGV4KSBjb25zdDsKLSAgICB2aXJ0dWFsIFdlYkNvcmU6OlN0
cmluZyBpdGVtVG9vbFRpcCh1bnNpZ25lZCBsYXN0SW5kZXgpIGNvbnN0IHsgcmV0dXJuIFdlYkNv
cmU6OlN0cmluZygpOyB9Ci0gICAgdmlydHVhbCBib29sIGl0ZW1Jc0VuYWJsZWQodW5zaWduZWQg
bGlzdEluZGV4KSBjb25zdCB7IHJldHVybiB0cnVlOyB9Ci0gICAgdmlydHVhbCBXZWJDb3JlOjpQ
b3B1cE1lbnVTdHlsZSBpdGVtU3R5bGUodW5zaWduZWQgbGlzdEluZGV4KSBjb25zdDsKLSAgICB2
aXJ0dWFsIFdlYkNvcmU6OlBvcHVwTWVudVN0eWxlIG1lbnVTdHlsZSgpIGNvbnN0OwotICAgIHZp
cnR1YWwgaW50IGNsaWVudEluc2V0TGVmdCgpIGNvbnN0IHsgcmV0dXJuIDA7IH0KLSAgICB2aXJ0
dWFsIGludCBjbGllbnRJbnNldFJpZ2h0KCkgY29uc3QgeyByZXR1cm4gMDsgfQotICAgIHZpcnR1
YWwgaW50IGNsaWVudFBhZGRpbmdMZWZ0KCkgY29uc3Q7Ci0gICAgdmlydHVhbCBpbnQgY2xpZW50
UGFkZGluZ1JpZ2h0KCkgY29uc3Q7Ci0gICAgdmlydHVhbCBpbnQgbGlzdFNpemUoKSBjb25zdCB7
IHJldHVybiBtX3N1Z2dlc3Rpb25zLnNpemUoKTsgfQotICAgIHZpcnR1YWwgaW50IHNlbGVjdGVk
SW5kZXgoKSBjb25zdCB7IHJldHVybiBtX3NlbGVjdGVkSW5kZXg7IH0KLSAgICB2aXJ0dWFsIHZv
aWQgcG9wdXBEaWRIaWRlKCk7Ci0gICAgdmlydHVhbCBib29sIGl0ZW1Jc1NlcGFyYXRvcih1bnNp
Z25lZCBsaXN0SW5kZXgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0gICAgdmlydHVhbCBib29s
IGl0ZW1Jc0xhYmVsKHVuc2lnbmVkIGxpc3RJbmRleCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0K
LSAgICB2aXJ0dWFsIGJvb2wgaXRlbUlzU2VsZWN0ZWQodW5zaWduZWQgbGlzdEluZGV4KSBjb25z
dCB7IHJldHVybiBmYWxzZTsgfQotICAgIHZpcnR1YWwgYm9vbCBzaG91bGRQb3BPdmVyKCkgY29u
c3QgeyByZXR1cm4gZmFsc2U7IH0KLSAgICB2aXJ0dWFsIGJvb2wgdmFsdWVTaG91bGRDaGFuZ2VP
bkhvdFRyYWNrKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLSAgICB2aXJ0dWFsIHZvaWQgc2V0
VGV4dEZyb21JdGVtKHVuc2lnbmVkIGxpc3RJbmRleCk7Ci0gICAgdmlydHVhbCBXZWJDb3JlOjpG
b250U2VsZWN0b3IqIGZvbnRTZWxlY3RvcigpIGNvbnN0OwotICAgIHZpcnR1YWwgV2ViQ29yZTo6
SG9zdFdpbmRvdyogaG9zdFdpbmRvdygpIGNvbnN0OwotICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxX
ZWJDb3JlOjpTY3JvbGxiYXI+IGNyZWF0ZVNjcm9sbGJhcigKLSAgICAgICAgV2ViQ29yZTo6U2Ny
b2xsYmFyQ2xpZW50KiBjbGllbnQsCi0gICAgICAgIFdlYkNvcmU6OlNjcm9sbGJhck9yaWVudGF0
aW9uIG9yaWVudGF0aW9uLAotICAgICAgICBXZWJDb3JlOjpTY3JvbGxiYXJDb250cm9sU2l6ZSBz
aXplKTsKIAogcHJpdmF0ZToKLSAgICBXZWJDb3JlOjpSZW5kZXJTdHlsZSogdGV4dEZpZWxkU3R5
bGUoKSBjb25zdDsKLQotICAgIFJlZlB0cjxXZWJDb3JlOjpIVE1MSW5wdXRFbGVtZW50PiBtX3Rl
eHRGaWVsZDsKICAgICBWZWN0b3I8V2ViQ29yZTo6U3RyaW5nPiBtX3N1Z2dlc3Rpb25zOwotICAg
IGludCBtX3NlbGVjdGVkSW5kZXg7Ci0gICAgV2ViVmlld0ltcGwqIG1fd2ViVmlldzsKLSAgICBP
d25QdHI8V2ViQ29yZTo6UG9wdXBNZW51U3R5bGU+IG1fc3R5bGU7CiB9OwogCiB9IC8vIG5hbWVz
cGFjZSBXZWJLaXQKKworI2VuZGlmCkluZGV4OiBXZWJLaXQvY2hyb21pdW0vc3JjL1N1Z2dlc3Rp
b25zUG9wdXBNZW51Q2xpZW50LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQvY2hyb21pdW0vc3Jj
L1N1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50LmNwcAkocmV2aXNpb24gMCkKKysrIFdlYktpdC9j
aHJvbWl1bS9zcmMvU3VnZ2VzdGlvbnNQb3B1cE1lbnVDbGllbnQuY3BwCShyZXZpc2lvbiAwKQpA
QCAtMCwwICsxLDI0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBB
bGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291
cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBh
cmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQor
ICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0
IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1
dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmln
aHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHBy
b3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBu
YW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMg
bWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQor
ICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lv
bi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9M
REVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBM
SUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElN
UExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBB
IFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhF
IENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJ
UkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENP
TlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQ
Uk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwK
KyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBD
QVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05U
UkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNF
IE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBU
SElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gg
REFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJTdWdnZXN0aW9u
c1BvcHVwTWVudUNsaWVudC5oIgorCisvLyBUT0RPKGpoYXdraW5zKTogTWFrZSBzdXJlIHdlIG5l
ZWQgYWxsIG9mIHRoZXNlIGluY2x1ZGVzLgorI2luY2x1ZGUgIkNTU1N0eWxlU2VsZWN0b3IuaCIK
KyNpbmNsdWRlICJDU1NWYWx1ZUtleXdvcmRzLmgiCisjaW5jbHVkZSAiRnJhbWVWaWV3LmgiCisj
aW5jbHVkZSAiSFRNTElucHV0RWxlbWVudC5oIgorI2luY2x1ZGUgIlJlbmRlclRoZW1lLmgiCisj
aW5jbHVkZSAiV2ViVmVjdG9yLmgiCisjaW5jbHVkZSAiV2ViVmlld0ltcGwuaCIKKwordXNpbmcg
bmFtZXNwYWNlIFdlYkNvcmU7CisKK25hbWVzcGFjZSBXZWJLaXQgeworCitTdWdnZXN0aW9uc1Bv
cHVwTWVudUNsaWVudDo6U3VnZ2VzdGlvbnNQb3B1cE1lbnVDbGllbnQoV2ViVmlld0ltcGwqIHdl
YlZpZXcpCisgICAgOiBtX3RleHRGaWVsZCgwKQorICAgICwgbV9zZWxlY3RlZEluZGV4KDApCisg
ICAgLCBtX3dlYlZpZXcod2ViVmlldykKK3sKK30KKworU3VnZ2VzdGlvbnNQb3B1cE1lbnVDbGll
bnQ6On5TdWdnZXN0aW9uc1BvcHVwTWVudUNsaWVudCgpCit7Cit9CisKKy8vIFRPRE8oamhhd2tp
bnMpOiBJbXBsZW1lbnQgdGhpcyBwZXIgY2hpbGQgY2xhc3M/Cit2b2lkIFN1Z2dlc3Rpb25zUG9w
dXBNZW51Q2xpZW50Ojp2YWx1ZUNoYW5nZWQodW5zaWduZWQgbGlzdEluZGV4LCBib29sIGZpcmVF
dmVudHMpCit7CisgICAgbV90ZXh0RmllbGQtPnNldFZhbHVlKGdldFN1Z2dlc3Rpb24obGlzdElu
ZGV4KSk7CisKKyAgICBFZGl0b3JDbGllbnRJbXBsKiBlZGl0b3IgPQorICAgICAgICBzdGF0aWNf
Y2FzdDxFZGl0b3JDbGllbnRJbXBsKj4obV93ZWJWaWV3LT5wYWdlKCktPmVkaXRvckNsaWVudCgp
KTsKKyAgICBBU1NFUlQoZWRpdG9yKTsKKyAgICBlZGl0b3ItPm9uQXV0b2ZpbGxTdWdnZXN0aW9u
QWNjZXB0ZWQoCisgICAgICAgIHN0YXRpY19jYXN0PEhUTUxJbnB1dEVsZW1lbnQqPihtX3RleHRG
aWVsZC5nZXQoKSkpOworfQorCit2b2lkIFN1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50OjpzZWxl
Y3Rpb25DaGFuZ2VkKHVuc2lnbmVkIGxpc3RJbmRleCwgYm9vbCBmaXJlRXZlbnRzKQoreworICAg
IHByaW50Zigic2VsZWN0aW9uQ2hhbmdlZFxuIik7CisgICAgaWYgKGxpc3RJbmRleCAhPSBzdGF0
aWNfY2FzdDx1bnNpZ25lZD4oLTEpKSB7CisgICAgICAgIGNvbnN0IFdlYlN0cmluZyYgc3VnZ2Vz
dGlvbiA9IGdldFN1Z2dlc3Rpb24obGlzdEluZGV4KTsKKyAgICAgICAgc2V0U3VnZ2VzdGVkVmFs
dWUoc3VnZ2VzdGlvbik7CisgICAgfSBlbHNlIHsKKyAgICAgIG1fdGV4dEZpZWxkLT5zZXRWYWx1
ZShtX3R5cGVkRmllbGRWYWx1ZSk7CisgICAgICBpZiAobV9sYXN0RmllbGRWYWx1ZXMtPmNvbnRh
aW5zKG1fdGV4dEZpZWxkLT5uYW1lKCkpKQorICAgICAgICAgIG1fbGFzdEZpZWxkVmFsdWVzLT5z
ZXQobV90ZXh0RmllbGQtPm5hbWUoKSwgbV90eXBlZEZpZWxkVmFsdWUpOworICAgICAgZWxzZQor
ICAgICAgICAgIG1fbGFzdEZpZWxkVmFsdWVzLT5hZGQobV90ZXh0RmllbGQtPm5hbWUoKSwgbV90
eXBlZEZpZWxkVmFsdWUpOworICAgIH0KK30KKworU3RyaW5nIFN1Z2dlc3Rpb25zUG9wdXBNZW51
Q2xpZW50OjppdGVtVGV4dCh1bnNpZ25lZCBsaXN0SW5kZXgpIGNvbnN0Cit7CisgICAgcmV0dXJu
IGdldFN1Z2dlc3Rpb24obGlzdEluZGV4KTsKK30KKworUG9wdXBNZW51U3R5bGUgU3VnZ2VzdGlv
bnNQb3B1cE1lbnVDbGllbnQ6Oml0ZW1TdHlsZSh1bnNpZ25lZCBsaXN0SW5kZXgpIGNvbnN0Cit7
CisgICAgcmV0dXJuICptX3N0eWxlOworfQorCitQb3B1cE1lbnVTdHlsZSBTdWdnZXN0aW9uc1Bv
cHVwTWVudUNsaWVudDo6bWVudVN0eWxlKCkgY29uc3QKK3sKKyAgICByZXR1cm4gKm1fc3R5bGU7
Cit9CisKK2ludCBTdWdnZXN0aW9uc1BvcHVwTWVudUNsaWVudDo6Y2xpZW50UGFkZGluZ0xlZnQo
KSBjb25zdAoreworICAgIC8vIEJ1ZyBodHRwOi8vY3JidWcuY29tLzc3MDggc2VlbXMgdG8gaW5k
aWNhdGUgdGhlIHN0eWxlIGNhbiBiZSAwLgorICAgIFJlbmRlclN0eWxlKiBzdHlsZSA9IHRleHRG
aWVsZFN0eWxlKCk7CisgICAgcmV0dXJuIHN0eWxlID8gbV93ZWJWaWV3LT50aGVtZSgpLT5wb3B1
cEludGVybmFsUGFkZGluZ0xlZnQoc3R5bGUpIDogMDsKK30KKworaW50IFN1Z2dlc3Rpb25zUG9w
dXBNZW51Q2xpZW50OjpjbGllbnRQYWRkaW5nUmlnaHQoKSBjb25zdAoreworICAgIC8vIEJ1ZyBo
dHRwOi8vY3JidWcuY29tLzc3MDggc2VlbXMgdG8gaW5kaWNhdGUgdGhlIHN0eWxlIGNhbiBiZSAw
LgorICAgIFJlbmRlclN0eWxlKiBzdHlsZSA9IHRleHRGaWVsZFN0eWxlKCk7CisgICAgcmV0dXJu
IHN0eWxlID8gbV93ZWJWaWV3LT50aGVtZSgpLT5wb3B1cEludGVybmFsUGFkZGluZ1JpZ2h0KHN0
eWxlKSA6IDA7Cit9CisKK3ZvaWQgU3VnZ2VzdGlvbnNQb3B1cE1lbnVDbGllbnQ6OnBvcHVwRGlk
SGlkZSgpCit7CisjaWYgMAorICAgIGlmIChhY2NlcHRTdWdnZXN0aW9ucykgeworICAgICAgICBT
dHJpbmcgc3VnZ2VzdGVkVmFsdWUgPSBtX3RleHRGaWVsZC0+c3VnZ2VzdGVkVmFsdWUoKTsKKyAg
ICAgICAgaWYgKCFzdWdnZXN0ZWRWYWx1ZS5pc051bGwoKSkKKyAgICAgICAgICAgIG1fdGV4dEZp
ZWxkLT5zZXRWYWx1ZShzdWdnZXN0ZWRWYWx1ZSk7CisgICAgfSBlbHNlCisjZW5kaWYKKyAgICAg
ICAgbV90ZXh0RmllbGQtPnNldFZhbHVlKG1fdHlwZWRGaWVsZFZhbHVlKTsKKworICAgIHJlc2V0
TGFzdFN1Z2dlc3Rpb24oKTsKKyAgICBtX3dlYlZpZXctPnN1Z2dlc3Rpb25zUG9wdXBEaWRIaWRl
KCk7Cit9CisKK3ZvaWQgU3VnZ2VzdGlvbnNQb3B1cE1lbnVDbGllbnQ6OnNldFRleHRGcm9tSXRl
bSh1bnNpZ25lZCBsaXN0SW5kZXgpCit7CisgICAgbV90ZXh0RmllbGQtPnNldFZhbHVlKGdldFN1
Z2dlc3Rpb24obGlzdEluZGV4KSk7CisgICAgcmVzZXRMYXN0U3VnZ2VzdGlvbigpOworfQorCit2
b2lkIFN1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50OjpyZXNldExhc3RTdWdnZXN0aW9uKCkKK3sK
KyAgICBpZiAobV9sYXN0RmllbGRWYWx1ZXMtPmNvbnRhaW5zKG1fdGV4dEZpZWxkLT5uYW1lKCkp
KQorICAgICAgICBtX2xhc3RGaWVsZFZhbHVlcy0+c2V0KG1fdGV4dEZpZWxkLT5uYW1lKCksIG1f
dGV4dEZpZWxkLT52YWx1ZSgpKTsKKyAgICBlbHNlCisgICAgICAgIG1fbGFzdEZpZWxkVmFsdWVz
LT5hZGQobV90ZXh0RmllbGQtPm5hbWUoKSwgbV90ZXh0RmllbGQtPnZhbHVlKCkpOworfQorCitG
b250U2VsZWN0b3IqIFN1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50Ojpmb250U2VsZWN0b3IoKSBj
b25zdAoreworICAgIHJldHVybiBtX3RleHRGaWVsZC0+ZG9jdW1lbnQoKS0+c3R5bGVTZWxlY3Rv
cigpLT5mb250U2VsZWN0b3IoKTsKK30KKworSG9zdFdpbmRvdyogU3VnZ2VzdGlvbnNQb3B1cE1l
bnVDbGllbnQ6Omhvc3RXaW5kb3coKSBjb25zdAoreworICAgIHJldHVybiBtX3RleHRGaWVsZC0+
ZG9jdW1lbnQoKS0+dmlldygpLT5ob3N0V2luZG93KCk7Cit9CisKK1Bhc3NSZWZQdHI8U2Nyb2xs
YmFyPiBTdWdnZXN0aW9uc1BvcHVwTWVudUNsaWVudDo6Y3JlYXRlU2Nyb2xsYmFyKAorICAgIFNj
cm9sbGJhckNsaWVudCogY2xpZW50LAorICAgIFNjcm9sbGJhck9yaWVudGF0aW9uIG9yaWVudGF0
aW9uLAorICAgIFNjcm9sbGJhckNvbnRyb2xTaXplIHNpemUpCit7CisgICAgcmV0dXJuIFNjcm9s
bGJhcjo6Y3JlYXRlTmF0aXZlU2Nyb2xsYmFyKGNsaWVudCwgb3JpZW50YXRpb24sIHNpemUpOwor
fQorCitSZW5kZXJTdHlsZSogU3VnZ2VzdGlvbnNQb3B1cE1lbnVDbGllbnQ6OnRleHRGaWVsZFN0
eWxlKCkgY29uc3QKK3sKKyAgICBSZW5kZXJTdHlsZSogc3R5bGUgPSBtX3RleHRGaWVsZC0+Y29t
cHV0ZWRTdHlsZSgpOworICAgIGlmICghc3R5bGUpIHsKKyAgICAgICAgLy8gSXQgc2VlbXMgd2Ug
Y2FuIG9ubHkgaGF2ZSBhIDAgc3R5bGUgaW4gYSBUZXh0RmllbGQgaWYgdGhlCisgICAgICAgIC8v
IG5vZGUgaXMgZGV0YWNoZWQsIGluIHdoaWNoIGNhc2Ugd2UgdGhlIHBvcHVwIHNob3VkIG5vdCBi
ZQorICAgICAgICAvLyBzaG93aW5nLiAgUGxlYXNlIHJlcG9ydCB0aGlzIGluIGh0dHA6Ly9jcmJ1
Zy5jb20vNzcwOCBhbmQKKyAgICAgICAgLy8gaW5jbHVkZSB0aGUgcGFnZSB5b3Ugd2VyZSB2aXNp
dGluZy4KKyAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgfQorICAgIHJldHVybiBz
dHlsZTsKK30KKwordm9pZCBTdWdnZXN0aW9uc1BvcHVwTWVudUNsaWVudDo6aW5pdGlhbGl6ZShI
VE1MSW5wdXRFbGVtZW50KiB0ZXh0RmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGludCBkZWZhdWx0U3VnZ2VzdGlvbkluZGV4KQoreworICAgIGlmICgh
bV9sYXN0RmllbGRWYWx1ZXMpCisgICAgICAgIG1fbGFzdEZpZWxkVmFsdWVzLnNldChuZXcgRmll
bGRWYWx1ZXNNYXApOworCisgICAgbV90ZXh0RmllbGQgPSB0ZXh0RmllbGQ7CisgICAgbV90eXBl
ZEZpZWxkVmFsdWUgPSB0ZXh0RmllbGQtPnZhbHVlKCk7CisgICAgbV9zZWxlY3RlZEluZGV4ID0g
ZGVmYXVsdFN1Z2dlc3Rpb25JbmRleDsKKworICAgIHNldEluaXRpYWxTdWdnZXN0aW9uKCk7CisK
KyAgICBGb250RGVzY3JpcHRpb24gZm9udERlc2NyaXB0aW9uOworICAgIG1fd2ViVmlldy0+dGhl
bWUoKS0+c3lzdGVtRm9udChDU1NWYWx1ZVdlYmtpdENvbnRyb2wsIGZvbnREZXNjcmlwdGlvbik7
CisgICAgLy8gVXNlIGEgc21hbGxlciBmb250IHNpemUgdG8gbWF0Y2ggSUUvRmlyZWZveC4KKyAg
ICAvLyBGSVhNRTogaHR0cDovL2NyYnVnLmNvbS83Mzc2IHVzZSB0aGUgc3lzdGVtIHNpemUgaW5z
dGVhZCBvZiBhCisgICAgLy8gICAgICAgIGZpeGVkIGZvbnQgc2l6ZSB2YWx1ZS4KKyAgICBmb250
RGVzY3JpcHRpb24uc2V0Q29tcHV0ZWRTaXplKDEyLjApOworICAgIEZvbnQgZm9udChmb250RGVz
Y3JpcHRpb24sIDAsIDApOworICAgIGZvbnQudXBkYXRlKHRleHRGaWVsZC0+ZG9jdW1lbnQoKS0+
c3R5bGVTZWxlY3RvcigpLT5mb250U2VsZWN0b3IoKSk7CisgICAgLy8gVGhlIGRpcmVjdGlvbiBv
ZiB0ZXh0IGluIHBvcHVwIG1lbnUgaXMgc2V0IHRoZSBzYW1lIGFzIHRoZSBkaXJlY3Rpb24gb2YK
KyAgICAvLyB0aGUgaW5wdXQgZWxlbWVudDogdGV4dEZpZWxkLgorICAgIG1fc3R5bGUuc2V0KG5l
dyBQb3B1cE1lbnVTdHlsZShDb2xvcjo6YmxhY2ssIENvbG9yOjp3aGl0ZSwgZm9udCwgdHJ1ZSwK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGVuZ3RoKFdlYkNvcmU6OkZpeGVk
KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dEZpZWxkLT5yZW5kZXJl
cigpLT5zdHlsZSgpLT5kaXJlY3Rpb24oKSkpOworfQorCit2b2lkIFN1Z2dlc3Rpb25zUG9wdXBN
ZW51Q2xpZW50OjpzZXRJbml0aWFsU3VnZ2VzdGlvbigpCit7CisgICAgaWYgKCFnZXRTdWdnZXN0
aW9uc1NpemUoKSB8fCAhbV90ZXh0RmllbGQtPm5hbWUoKS5sZW5ndGgoKSB8fCAhbV90eXBlZEZp
ZWxkVmFsdWUubGVuZ3RoKCkpCisgICAgICAgIHJldHVybjsKKworICAgIGludCBuZXdJbmRleCA9
IG1fc2VsZWN0ZWRJbmRleCA+PSAwID8gbV9zZWxlY3RlZEluZGV4IDogMDsKKyAgICBjb25zdCBT
dHJpbmcmIHN1Z2dlc3Rpb24gPSBnZXRTdWdnZXN0aW9uKG5ld0luZGV4KTsKKyAgICBib29sIGhh
c1ByZXZpb3VzVmFsdWUgPSBtX2xhc3RGaWVsZFZhbHVlcy0+Y29udGFpbnMobV90ZXh0RmllbGQt
Pm5hbWUoKSk7CisKKyAgICBTdHJpbmcgcHJldlZhbHVlOworICAgIGlmIChoYXNQcmV2aW91c1Zh
bHVlKQorICAgICAgICBwcmV2VmFsdWUgPSBtX2xhc3RGaWVsZFZhbHVlcy0+Z2V0KG1fdGV4dEZp
ZWxkLT5uYW1lKCkpOworCisgICAgaWYgKCFoYXNQcmV2aW91c1ZhbHVlIHx8IG1fdHlwZWRGaWVs
ZFZhbHVlLmxlbmd0aCgpID4gbV9sYXN0RmllbGRWYWx1ZXMtPmdldChtX3RleHRGaWVsZC0+bmFt
ZSgpKS5sZW5ndGgoKSkgeworICAgICAgICAgIGlmIChzdWdnZXN0aW9uLnN0YXJ0c1dpdGgobV90
eXBlZEZpZWxkVmFsdWUpKQorICAgICAgICAgICAgICBtX3NlbGVjdGVkSW5kZXggPSBuZXdJbmRl
eDsKKworICAgICAgICAgIGludCBzdGFydCA9IDA7CisgICAgICAgICAgU3RyaW5nIG5ld1N1Z2dl
c3Rpb24gPSBzdWdnZXN0aW9uOworICAgICAgICAgIGlmIChzdWdnZXN0aW9uLnN0YXJ0c1dpdGgo
bV90eXBlZEZpZWxkVmFsdWUsIGZhbHNlKSkgeworICAgICAgICAgICAgICBuZXdTdWdnZXN0aW9u
ID0gbV90eXBlZEZpZWxkVmFsdWU7CisgICAgICAgICAgICAgIGlmIChzdWdnZXN0aW9uLmxlbmd0
aCgpID4gbV90eXBlZEZpZWxkVmFsdWUubGVuZ3RoKCkpIHsKKyAgICAgICAgICAgICAgICAgIG5l
d1N1Z2dlc3Rpb24uYXBwZW5kKHN1Z2dlc3Rpb24uc3Vic3RyaW5nKG1fdHlwZWRGaWVsZFZhbHVl
Lmxlbmd0aCgpLAorICAgICAgICAgICAgICAgICAgICAgIHN1Z2dlc3Rpb24ubGVuZ3RoKCkgLSBt
X3R5cGVkRmllbGRWYWx1ZS5sZW5ndGgoKSkpOworICAgICAgICAgICAgICB9CisgICAgICAgICAg
ICAgIHN0YXJ0ID0gbV90eXBlZEZpZWxkVmFsdWUubGVuZ3RoKCk7CisgICAgICAgICAgfQorCisg
ICAgICAgICAgbV90ZXh0RmllbGQtPnNldFN1Z2dlc3RlZFZhbHVlKG5ld1N1Z2dlc3Rpb24pOwor
ICAgICAgICAgIG1fdGV4dEZpZWxkLT5zZXRTZWxlY3Rpb25SYW5nZShzdGFydCwgbmV3U3VnZ2Vz
dGlvbi5sZW5ndGgoKSk7CisgICAgfQorCisgICAgaWYgKGhhc1ByZXZpb3VzVmFsdWUpCisgICAg
ICAgIG1fbGFzdEZpZWxkVmFsdWVzLT5zZXQobV90ZXh0RmllbGQtPm5hbWUoKSwgbV90eXBlZEZp
ZWxkVmFsdWUpOworICAgIGVsc2UKKyAgICAgICAgbV9sYXN0RmllbGRWYWx1ZXMtPmFkZChtX3Rl
eHRGaWVsZC0+bmFtZSgpLCBtX3R5cGVkRmllbGRWYWx1ZSk7Cit9CisKK3ZvaWQgU3VnZ2VzdGlv
bnNQb3B1cE1lbnVDbGllbnQ6OnNldFN1Z2dlc3RlZFZhbHVlKGNvbnN0IFdlYlN0cmluZyYgc3Vn
Z2VzdGlvbikKK3sKKyAgICBtX3RleHRGaWVsZC0+c2V0U3VnZ2VzdGVkVmFsdWUoc3VnZ2VzdGlv
bik7CisgICAgbV90ZXh0RmllbGQtPnNldFNlbGVjdGlvblJhbmdlKG1fdHlwZWRGaWVsZFZhbHVl
Lmxlbmd0aCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWdnZXN0aW9u
Lmxlbmd0aCgpKTsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViS2l0CkluZGV4OiBXZWJLaXQvY2hy
b21pdW0vc3JjL1N1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50LmgKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2Vi
S2l0L2Nocm9taXVtL3NyYy9TdWdnZXN0aW9uc1BvcHVwTWVudUNsaWVudC5oCShyZXZpc2lvbiAw
KQorKysgV2ViS2l0L2Nocm9taXVtL3NyYy9TdWdnZXN0aW9uc1BvcHVwTWVudUNsaWVudC5oCShy
ZXZpc2lvbiAwKQpAQCAtMCwwICsxLDExOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBH
b29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFu
ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9k
aWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25k
aXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3Vy
Y2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAg
KiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3Zl
CisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBO
ZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBj
b250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRl
cml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0
ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBD
T1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQ
UkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRF
RCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F
U1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZF
TlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJM
RSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVN
UExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBM
SU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBM
T1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJQb3B1cE1lbnVDbGllbnQuaCIK
KworI2lmbmRlZiBTdWdnZXN0aW9uc1BvcHVwTWVudUNsaWVudF9oCisjZGVmaW5lIFN1Z2dlc3Rp
b25zUG9wdXBNZW51Q2xpZW50X2gKKworbmFtZXNwYWNlIFdlYkNvcmUgeworY2xhc3MgSFRNTElu
cHV0RWxlbWVudDsKK2NsYXNzIFBvcHVwTWVudVN0eWxlOworY2xhc3MgUmVuZGVyU3R5bGU7Cit9
CisKK25hbWVzcGFjZSBXZWJLaXQgeworY2xhc3MgV2ViU3RyaW5nOworY2xhc3MgV2ViVmlld0lt
cGw7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY2xhc3MgV2ViVmVjdG9yOworCisvLyAKK2NsYXNz
IFN1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50IDogcHVibGljIFdlYkNvcmU6OlBvcHVwTWVudUNs
aWVudCB7CitwdWJsaWM6CisgICAgU3VnZ2VzdGlvbnNQb3B1cE1lbnVDbGllbnQoV2ViVmlld0lt
cGwqIHdlYnZpZXcpOworICAgIHZpcnR1YWwgflN1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50KCk7
CisKKyAgICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2Ygc3VnZ2VzdGlvbnMgYXZhaWxhYmxlLgor
ICAgIHZpcnR1YWwgc2l6ZV90IGdldFN1Z2dlc3Rpb25zU2l6ZSgpIGNvbnN0ID0gMDsKKworICAg
IC8vIFJldHVybnMgdGhlIHN1Z2dlc3Rpb24gYXQgfGxpc3RJbmRleHwuCisgICAgdmlydHVhbCBX
ZWJTdHJpbmcgZ2V0U3VnZ2VzdGlvbih1bnNpZ25lZCBsaXN0SW5kZXgpIGNvbnN0ID0gMDsKKwor
ICAgIC8vIFJlbW92ZXMgdGhlIHN1Z2dlc3Rpb24gYXQgfGxpc3RJbmRleHwgZnJvbSB0aGUgbGlz
dCBvZiBzdWdnZXN0aW9ucy4KKyAgICB2aXJ0dWFsIHZvaWQgcmVtb3ZlU3VnZ2VzdGlvbkF0SW5k
ZXgodW5zaWduZWQgbGlzdEluZGV4KSA9IDA7CisKKyAgICAvLyBXZWJDb3JlOjpQb3B1cE1lbnVD
bGllbnQgbWV0aG9kczoKKyAgICB2aXJ0dWFsIHZvaWQgdmFsdWVDaGFuZ2VkKHVuc2lnbmVkIGxp
c3RJbmRleCwgYm9vbCBmaXJlRXZlbnRzID0gdHJ1ZSk7CisgICAgdmlydHVhbCB2b2lkIHNlbGVj
dGlvbkNoYW5nZWQodW5zaWduZWQgbGlzdEluZGV4LCBib29sIGZpcmVFdmVudHMgPSB0cnVlKTsK
KyAgICB2aXJ0dWFsIFdlYkNvcmU6OlN0cmluZyBpdGVtVGV4dCh1bnNpZ25lZCBsaXN0SW5kZXgp
IGNvbnN0OworICAgIHZpcnR1YWwgV2ViQ29yZTo6U3RyaW5nIGl0ZW1Ub29sVGlwKHVuc2lnbmVk
IGxhc3RJbmRleCkgY29uc3QgeyByZXR1cm4gV2ViQ29yZTo6U3RyaW5nKCk7IH0KKyAgICB2aXJ0
dWFsIGJvb2wgaXRlbUlzRW5hYmxlZCh1bnNpZ25lZCBsaXN0SW5kZXgpIGNvbnN0IHsgcmV0dXJu
IHRydWU7IH0KKyAgICB2aXJ0dWFsIFdlYkNvcmU6OlBvcHVwTWVudVN0eWxlIGl0ZW1TdHlsZSh1
bnNpZ25lZCBsaXN0SW5kZXgpIGNvbnN0OworICAgIHZpcnR1YWwgV2ViQ29yZTo6UG9wdXBNZW51
U3R5bGUgbWVudVN0eWxlKCkgY29uc3Q7CisgICAgdmlydHVhbCBpbnQgY2xpZW50SW5zZXRMZWZ0
KCkgY29uc3QgeyByZXR1cm4gMDsgfQorICAgIHZpcnR1YWwgaW50IGNsaWVudEluc2V0UmlnaHQo
KSBjb25zdCB7IHJldHVybiAwOyB9CisgICAgdmlydHVhbCBpbnQgY2xpZW50UGFkZGluZ0xlZnQo
KSBjb25zdDsKKyAgICB2aXJ0dWFsIGludCBjbGllbnRQYWRkaW5nUmlnaHQoKSBjb25zdDsKKyAg
ICB2aXJ0dWFsIGludCBsaXN0U2l6ZSgpIGNvbnN0IHsgcmV0dXJuIGdldFN1Z2dlc3Rpb25zU2l6
ZSgpOyB9CisgICAgdmlydHVhbCBpbnQgc2VsZWN0ZWRJbmRleCgpIGNvbnN0IHsgcmV0dXJuIG1f
c2VsZWN0ZWRJbmRleDsgfQorICAgIHZpcnR1YWwgdm9pZCBwb3B1cERpZEhpZGUoKTsKKyAgICB2
aXJ0dWFsIGJvb2wgaXRlbUlzU2VwYXJhdG9yKHVuc2lnbmVkIGxpc3RJbmRleCkgY29uc3QgeyBy
ZXR1cm4gZmFsc2U7IH0KKyAgICB2aXJ0dWFsIGJvb2wgaXRlbUlzTGFiZWwodW5zaWduZWQgbGlz
dEluZGV4KSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorICAgIHZpcnR1YWwgYm9vbCBpdGVtSXNT
ZWxlY3RlZCh1bnNpZ25lZCBsaXN0SW5kZXgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgICAg
dmlydHVhbCBib29sIHNob3VsZFBvcE92ZXIoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorICAg
IHZpcnR1YWwgYm9vbCB2YWx1ZVNob3VsZENoYW5nZU9uSG90VHJhY2soKSBjb25zdCB7IHJldHVy
biBmYWxzZTsgfQorICAgIHZpcnR1YWwgdm9pZCBzZXRUZXh0RnJvbUl0ZW0odW5zaWduZWQgbGlz
dEluZGV4KTsKKyAgICB2aXJ0dWFsIFdlYkNvcmU6OkZvbnRTZWxlY3RvciogZm9udFNlbGVjdG9y
KCkgY29uc3Q7CisgICAgdmlydHVhbCBXZWJDb3JlOjpIb3N0V2luZG93KiBob3N0V2luZG93KCkg
Y29uc3Q7CisgICAgdmlydHVhbCBQYXNzUmVmUHRyPFdlYkNvcmU6OlNjcm9sbGJhcj4gY3JlYXRl
U2Nyb2xsYmFyKAorICAgICAgICBXZWJDb3JlOjpTY3JvbGxiYXJDbGllbnQqIGNsaWVudCwKKyAg
ICAgICAgV2ViQ29yZTo6U2Nyb2xsYmFyT3JpZW50YXRpb24gb3JpZW50YXRpb24sCisgICAgICAg
IFdlYkNvcmU6OlNjcm9sbGJhckNvbnRyb2xTaXplIHNpemUpOworCitwcm90ZWN0ZWQ6CisgICAg
dm9pZCBpbml0aWFsaXplKFdlYkNvcmU6OkhUTUxJbnB1dEVsZW1lbnQqIHRleHRGaWVsZCwKKyAg
ICAgICAgICAgICAgICAgICAgaW50IGRlZmF1bHRTdWdnZXN0aW9uSW5kZXgpOworICAgIHZvaWQg
c2V0SW5pdGlhbFN1Z2dlc3Rpb24oKTsKKworICAgIGludCBnZXRTZWxlY3RlZEluZGV4KCkgY29u
c3QgeyByZXR1cm4gbV9zZWxlY3RlZEluZGV4OyB9CisgICAgdm9pZCBzZXRTZWxlY3RlZEluZGV4
KGludCBpbmRleCkgeyBtX3NlbGVjdGVkSW5kZXggPSBpbmRleDsgfQorCisgICAgdm9pZCBzZXRT
dWdnZXN0ZWRWYWx1ZShjb25zdCBXZWJTdHJpbmcmIHN1Z2dlc3Rpb24pOworCisgICAgV2ViVmll
d0ltcGwqIGdldFdlYlZpZXcoKSBjb25zdCB7IHJldHVybiBtX3dlYlZpZXc7IH0KKyAgICBXZWJD
b3JlOjpIVE1MSW5wdXRFbGVtZW50KiBnZXRUZXh0RmllbGQoKSBjb25zdCB7IHJldHVybiBtX3Rl
eHRGaWVsZC5nZXQoKTsgfQorCitwcml2YXRlOgorICAgIFdlYkNvcmU6OlJlbmRlclN0eWxlKiB0
ZXh0RmllbGRTdHlsZSgpIGNvbnN0OworICAgIHZvaWQgcmVzZXRMYXN0U3VnZ2VzdGlvbigpOwor
CisgICAgUmVmUHRyPFdlYkNvcmU6OkhUTUxJbnB1dEVsZW1lbnQ+IG1fdGV4dEZpZWxkOworICAg
IGludCBtX3NlbGVjdGVkSW5kZXg7CisgICAgV2ViVmlld0ltcGwqIG1fd2ViVmlldzsKKyAgICBX
ZWJDb3JlOjpTdHJpbmcgbV90eXBlZEZpZWxkVmFsdWU7CisgICAgT3duUHRyPFdlYkNvcmU6OlBv
cHVwTWVudVN0eWxlPiBtX3N0eWxlOworICAgIHR5cGVkZWYgSGFzaE1hcDxXZWJDb3JlOjpTdHJp
bmcsIFdlYkNvcmU6OlN0cmluZz4gRmllbGRWYWx1ZXNNYXA7CisgICAgT3duUHRyPEZpZWxkVmFs
dWVzTWFwPiBtX2xhc3RGaWVsZFZhbHVlczsKK307CisKK30gLy8gbmFtZXNwYWNlIFdlYktpdAor
CisjZW5kaWYKClByb3BlcnR5IGNoYW5nZXMgb246IFdlYktpdC9jaHJvbWl1bS9zcmMvU3VnZ2Vz
dGlvbnNQb3B1cE1lbnVDbGllbnQuaApfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCkFkZGVkOiBzdm46ZW9sLXN0eWxlCiAg
ICsgTEYKCkluZGV4OiBXZWJLaXQvY2hyb21pdW0vc3JjL1dlYlZpZXdJbXBsLmNwcAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBXZWJLaXQvY2hyb21pdW0vc3JjL1dlYlZpZXdJbXBsLmNwcAkocmV2aXNpb24gNTQ1
MDEpCisrKyBXZWJLaXQvY2hyb21pdW0vc3JjL1dlYlZpZXdJbXBsLmNwcAkod29ya2luZyBjb3B5
KQpAQCAtMzEsNiArMzEsNyBAQAogI2luY2x1ZGUgImNvbmZpZy5oIgogI2luY2x1ZGUgIldlYlZp
ZXdJbXBsLmgiCiAKKyNpbmNsdWRlICJBdXRvRmlsbFBvcHVwTWVudUNsaWVudC5oIgogI2luY2x1
ZGUgIkF1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVudC5oIgogI2luY2x1ZGUgIkFYT2JqZWN0Q2Fj
aGUuaCIKICNpbmNsdWRlICJDaHJvbWUuaCIKQEAgLTgxLDYgKzgyLDcgQEAKICNpbmNsdWRlICJT
ZWN1cml0eU9yaWdpbi5oIgogI2luY2x1ZGUgIlNlbGVjdGlvbkNvbnRyb2xsZXIuaCIKICNpbmNs
dWRlICJTZXR0aW5ncy5oIgorI2luY2x1ZGUgIlN1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50Lmgi
CiAjaW5jbHVkZSAiVHlwaW5nQ29tbWFuZC5oIgogI2luY2x1ZGUgIldlYkFjY2Vzc2liaWxpdHlP
YmplY3QuaCIKICNpbmNsdWRlICJXZWJEZXZUb29sc0FnZW50UHJpdmF0ZS5oIgpAQCAtNDY4LDcg
KzQ3MCw3IEBAIGJvb2wgV2ViVmlld0ltcGw6OmtleUV2ZW50KGNvbnN0IFdlYktleWIKICAgICAv
LyBldmVudC4KICAgICBtX3N1cHByZXNzTmV4dEtleXByZXNzRXZlbnQgPSBmYWxzZTsKIAotICAg
IC8vIEdpdmUgYXV0b2NvbXBsZXRlIGEgY2hhbmNlIHRvIGNvbnN1bWUgdGhlIGtleSBldmVudHMg
aXQgaXMgaW50ZXJlc3RlZCBpbi4KKyAgICAvLyBHaXZlIEF1dG9jb21wbGV0ZSBhIGNoYW5jZSB0
byBjb25zdW1lIHRoZSBrZXkgZXZlbnRzIGl0IGlzIGludGVyZXN0ZWQgaW4uCiAgICAgaWYgKGF1
dG9jb21wbGV0ZUhhbmRsZUtleUV2ZW50KGV2ZW50KSkKICAgICAgICAgcmV0dXJuIHRydWU7CiAK
QEAgLTU0MSw3ICs1NDMsNyBAQCBib29sIFdlYlZpZXdJbXBsOjphdXRvY29tcGxldGVIYW5kbGVL
ZXlFCiAgICAgICAgIG1fY2xpZW50LT5yZW1vdmVBdXRvZmlsbFN1Z2dlc3Rpb25zKG5hbWUsIHZh
bHVlKTsKICAgICAgICAgLy8gVXBkYXRlIHRoZSBlbnRyaWVzIGluIHRoZSBjdXJyZW50bHkgc2hv
d2luZyBwb3B1cCB0byByZWZsZWN0IHRoZQogICAgICAgICAvLyBkZWxldGlvbi4KLSAgICAgICAg
bV9hdXRvY29tcGxldGVQb3B1cENsaWVudC0+cmVtb3ZlSXRlbUF0SW5kZXgoc2VsZWN0ZWRJbmRl
eCk7CisgICAgICAgIG1fYXV0b2NvbXBsZXRlUG9wdXBDbGllbnQtPnJlbW92ZVN1Z2dlc3Rpb25B
dEluZGV4KHNlbGVjdGVkSW5kZXgpOwogICAgICAgICByZWZyZXNoU3VnZ2VzdGlvbnNQb3B1cCgp
OwogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQpAQCAtMTU1OCw1OCArMTU2MCwxMTYgQEAg
dm9pZCBXZWJWaWV3SW1wbDo6YXBwbHlBdXRvZmlsbFN1Z2dlc3RpbwogICAgIGNvbnN0IFdlYlZl
Y3RvcjxXZWJTdHJpbmc+JiBzdWdnZXN0aW9ucywKICAgICBpbnQgZGVmYXVsdFN1Z2dlc3Rpb25J
bmRleCkKIHsKLSAgICBpZiAoIW1fcGFnZS5nZXQoKSB8fCBzdWdnZXN0aW9ucy5pc0VtcHR5KCkp
IHsKKyAgICBhcHBseUF1dG9jb21wbGV0ZVN1Z2dlc3Rpb25zKG5vZGUsIHN1Z2dlc3Rpb25zLCBk
ZWZhdWx0U3VnZ2VzdGlvbkluZGV4KTsKK30KKwordm9pZCBXZWJWaWV3SW1wbDo6YXBwbHlBdXRv
RmlsbFN1Z2dlc3Rpb25zKAorICAgIGNvbnN0IFdlYk5vZGUmIG5vZGUsCisgICAgY29uc3QgV2Vi
VmVjdG9yPFdlYlN0cmluZz4mIG5hbWVzLAorICAgIGNvbnN0IFdlYlZlY3RvcjxXZWJTdHJpbmc+
JiBsYWJlbHMsCisgICAgaW50IGRlZmF1bHRTdWdnZXN0aW9uSW5kZXgpCit7CisgICAgQVNTRVJU
KG5hbWVzLnNpemUoKSA9PSBsYWJlbHMuc2l6ZSgpKTsKKyAgICBBU1NFUlQoZGVmYXVsdFN1Z2dl
c3Rpb25JbmRleCA8IHN0YXRpY19jYXN0PGludD4obmFtZXMuc2l6ZSgpKSk7CisKKyAgICBpZiAo
bmFtZXMuaXNFbXB0eSgpKSB7CiAgICAgICAgIGhpZGVTdWdnZXN0aW9uc1BvcHVwKCk7CiAgICAg
ICAgIHJldHVybjsKICAgICB9CiAKKyAgICBSZWZQdHI8Tm9kZT4gZm9jdXNlZE5vZGUgPSBmb2N1
c2VkV2ViQ29yZU5vZGUoKTsKKyAgICAvLyBJZiB0aGUgbm9kZSBmb3Igd2hpY2ggd2UgcXVlcmll
ZCB0aGUgQXV0b0ZpbGwgc3VnZ2VzdGlvbnMgaXMgbm90IHRoZQorICAgIC8vIGZvY3VzZWQgbm9k
ZSwgdGhlbiB3ZSBoYXZlIG5vdGhpbmcgdG8gZG8uICBGSVhNRTogYWxzbyBjaGVjayB0aGUKKyAg
ICAvLyBjYXJldCBpcyBhdCB0aGUgZW5kIGFuZCB0aGF0IHRoZSB0ZXh0IGhhcyBub3QgY2hhbmdl
ZC4KKyAgICBpZiAoIWZvY3VzZWROb2RlIHx8IGZvY3VzZWROb2RlICE9IFBhc3NSZWZQdHI8Tm9k
ZT4obm9kZSkpIHsKKyAgICAgICAgaGlkZVN1Z2dlc3Rpb25zUG9wdXAoKTsKKyAgICAgICAgcmV0
dXJuOworICAgIH0KKworICAgIEhUTUxJbnB1dEVsZW1lbnQqIGlucHV0RWxlbSA9CisgICAgICAg
IHN0YXRpY19jYXN0PEhUTUxJbnB1dEVsZW1lbnQqPihmb2N1c2VkTm9kZS5nZXQoKSk7CisKKyAg
ICAvLyBUaGUgZmlyc3QgdGltZSB0aGUgQXV0b0ZpbGwgcG9wdXAgaXMgc2hvd24gd2UnbGwgY3Jl
YXRlIHRoZSBjbGllbnQgYW5kCisgICAgLy8gdGhlIHBvcHVwLgorICAgIGlmICghbV9hdXRvRmls
bFBvcHVwQ2xpZW50LmdldCgpKQorICAgICAgICBtX2F1dG9GaWxsUG9wdXBDbGllbnQuc2V0KG5l
dyBBdXRvRmlsbFBvcHVwTWVudUNsaWVudCh0aGlzKSk7CisKKyAgICBtX2F1dG9GaWxsUG9wdXBD
bGllbnQtPmluaXRpYWxpemUoaW5wdXRFbGVtLCBuYW1lcywgbGFiZWxzLAorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0U3VnZ2VzdGlvbkluZGV4KTsKKworICAg
IGlmIChtX3N1Z2dlc3Rpb25zUG9wdXBDbGllbnQgIT0gbV9hdXRvRmlsbFBvcHVwQ2xpZW50Lmdl
dCgpKSB7CisgICAgICAgIGhpZGVTdWdnZXN0aW9uc1BvcHVwKCk7CisgICAgICAgIG1fc3VnZ2Vz
dGlvbnNQb3B1cENsaWVudCA9IG1fYXV0b0ZpbGxQb3B1cENsaWVudC5nZXQoKTsKKyAgICB9CisK
KyAgICBpZiAoIW1fYXV0b0ZpbGxQb3B1cC5nZXQoKSkKKyAgICAgICAgbV9hdXRvRmlsbFBvcHVw
ID0gUG9wdXBDb250YWluZXI6OmNyZWF0ZShtX3N1Z2dlc3Rpb25zUG9wdXBDbGllbnQsCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGlvbnNQ
b3B1cFNldHRpbmdzKTsKKworICAgIGlmIChtX3N1Z2dlc3Rpb25zUG9wdXAgIT0gbV9hdXRvRmls
bFBvcHVwLmdldCgpKQorICAgICAgICBtX3N1Z2dlc3Rpb25zUG9wdXAgPSBtX2F1dG9GaWxsUG9w
dXAuZ2V0KCk7CisKKyAgICBpZiAobV9zdWdnZXN0aW9uc1BvcHVwU2hvd2luZykgeworICAgICAg
ICBtX2F1dG9GaWxsUG9wdXBDbGllbnQtPnNldFN1Z2dlc3Rpb25zKG5hbWVzLCBsYWJlbHMpOwor
ICAgICAgICByZWZyZXNoU3VnZ2VzdGlvbnNQb3B1cCgpOworICAgIH0gZWxzZSB7CisgICAgICAg
IG1fc3VnZ2VzdGlvbnNQb3B1cC0+c2hvdyhmb2N1c2VkTm9kZS0+Z2V0UmVjdCgpLAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9jdXNlZE5vZGUtPm93bmVyRG9jdW1lbnQoKS0+
dmlldygpLCAwKTsKKyAgICAgICAgbV9zdWdnZXN0aW9uc1BvcHVwU2hvd2luZyA9IHRydWU7Cisg
ICAgfQorfQorCit2b2lkIFdlYlZpZXdJbXBsOjphcHBseUF1dG9jb21wbGV0ZVN1Z2dlc3Rpb25z
KAorICAgIGNvbnN0IFdlYk5vZGUmIG5vZGUsCisgICAgY29uc3QgV2ViVmVjdG9yPFdlYlN0cmlu
Zz4mIHN1Z2dlc3Rpb25zLAorICAgIGludCBkZWZhdWx0U3VnZ2VzdGlvbkluZGV4KQorewogICAg
IEFTU0VSVChkZWZhdWx0U3VnZ2VzdGlvbkluZGV4IDwgc3RhdGljX2Nhc3Q8aW50PihzdWdnZXN0
aW9ucy5zaXplKCkpKTsKIAotICAgIGlmIChSZWZQdHI8RnJhbWU+IGZvY3VzZWQgPSBtX3BhZ2Ut
PmZvY3VzQ29udHJvbGxlcigpLT5mb2N1c2VkRnJhbWUoKSkgewotICAgICAgICBSZWZQdHI8RG9j
dW1lbnQ+IGRvY3VtZW50ID0gZm9jdXNlZC0+ZG9jdW1lbnQoKTsKLSAgICAgICAgaWYgKCFkb2N1
bWVudC5nZXQoKSkgewotICAgICAgICAgICAgaGlkZVN1Z2dlc3Rpb25zUG9wdXAoKTsKLSAgICAg
ICAgICAgIHJldHVybjsKLSAgICAgICAgfQorICAgIGlmICghbV9wYWdlLmdldCgpIHx8IHN1Z2dl
c3Rpb25zLmlzRW1wdHkoKSkgeworICAgICAgICBoaWRlU3VnZ2VzdGlvbnNQb3B1cCgpOworICAg
ICAgICByZXR1cm47CisgICAgfQogCi0gICAgICAgIFJlZlB0cjxOb2RlPiBmb2N1c2VkTm9kZSA9
IGRvY3VtZW50LT5mb2N1c2VkTm9kZSgpOwotICAgICAgICAvLyBJZiB0aGUgbm9kZSBmb3Igd2hp
Y2ggd2UgcXVlcmllZCB0aGUgYXV0b2ZpbGwgc3VnZ2VzdGlvbnMgaXMgbm90IHRoZQotICAgICAg
ICAvLyBmb2N1c2VkIG5vZGUsIHRoZW4gd2UgaGF2ZSBub3RoaW5nIHRvIGRvLiAgRklYTUU6IGFs
c28gY2hlY2sgdGhlCi0gICAgICAgIC8vIGNhcnJldCBpcyBhdCB0aGUgZW5kIGFuZCB0aGF0IHRo
ZSB0ZXh0IGhhcyBub3QgY2hhbmdlZC4KLSAgICAgICAgaWYgKCFmb2N1c2VkTm9kZS5nZXQoKSB8
fCBmb2N1c2VkTm9kZSAhPSBQYXNzUmVmUHRyPE5vZGU+KG5vZGUpKSB7Ci0gICAgICAgICAgICBo
aWRlU3VnZ2VzdGlvbnNQb3B1cCgpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Cisg
ICAgUmVmUHRyPE5vZGU+IGZvY3VzZWROb2RlID0gZm9jdXNlZFdlYkNvcmVOb2RlKCk7CisgICAg
Ly8gSWYgdGhlIG5vZGUgZm9yIHdoaWNoIHdlIHF1ZXJpZWQgdGhlIEF1dG9jb21wbGV0ZSBzdWdn
ZXN0aW9ucyBpcyBub3QgdGhlCisgICAgLy8gZm9jdXNlZCBub2RlLCB0aGVuIHdlIGhhdmUgbm90
aGluZyB0byBkby4gIEZJWE1FOiBhbHNvIGNoZWNrIHRoZQorICAgIC8vIGNhcmV0IGlzIGF0IHRo
ZSBlbmQgYW5kIHRoYXQgdGhlIHRleHQgaGFzIG5vdCBjaGFuZ2VkLgorICAgIGlmICghZm9jdXNl
ZE5vZGUgfHwgZm9jdXNlZE5vZGUgIT0gUGFzc1JlZlB0cjxOb2RlPihub2RlKSkgeworICAgICAg
ICBoaWRlU3VnZ2VzdGlvbnNQb3B1cCgpOworICAgICAgICByZXR1cm47CisgICAgfQogCi0gICAg
ICAgIGlmICghZm9jdXNlZE5vZGUtPmhhc1RhZ05hbWUoSFRNTE5hbWVzOjppbnB1dFRhZykpIHsK
LSAgICAgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwotICAgICAgICAgICAgcmV0dXJuOwot
ICAgICAgICB9CisgICAgSFRNTElucHV0RWxlbWVudCogaW5wdXRFbGVtID0KKyAgICAgICAgc3Rh
dGljX2Nhc3Q8SFRNTElucHV0RWxlbWVudCo+KGZvY3VzZWROb2RlLmdldCgpKTsKIAotICAgICAg
ICBIVE1MSW5wdXRFbGVtZW50KiBpbnB1dEVsZW0gPQotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8
SFRNTElucHV0RWxlbWVudCo+KGZvY3VzZWROb2RlLmdldCgpKTsKKyAgICAvLyBUaGUgZmlyc3Qg
dGltZSB0aGUgQXV0b2NvbXBsZXRlIGlzIHNob3duIHdlJ2xsIGNyZWF0ZSB0aGUgY2xpZW50IGFu
ZCB0aGUKKyAgICAvLyBwb3B1cC4KKyAgICBpZiAoIW1fYXV0b2NvbXBsZXRlUG9wdXBDbGllbnQu
Z2V0KCkpCisgICAgICAgIG1fYXV0b2NvbXBsZXRlUG9wdXBDbGllbnQuc2V0KG5ldyBBdXRvY29t
cGxldGVQb3B1cE1lbnVDbGllbnQodGhpcykpOwogCi0gICAgICAgIC8vIFRoZSBmaXJzdCB0aW1l
IHRoZSBzdWdnZXN0aW9ucyBwb3B1cCBpcyBzaG93biB3ZSdsbCBjcmVhdGUgdGhlIGNsaWVudAot
ICAgICAgICAvLyBhbmQgdGhlIHBvcHVwLgotICAgICAgICBpZiAoIW1fYXV0b2NvbXBsZXRlUG9w
dXBDbGllbnQuZ2V0KCkpCi0gICAgICAgICAgICBtX2F1dG9jb21wbGV0ZVBvcHVwQ2xpZW50LnNl
dChuZXcgQXV0b2NvbXBsZXRlUG9wdXBNZW51Q2xpZW50KHRoaXMpKTsKLSAgICAgICAgbV9hdXRv
Y29tcGxldGVQb3B1cENsaWVudC0+aW5pdGlhbGl6ZShpbnB1dEVsZW0sCi0gICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGlvbnMsCi0gICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFN1Z2dlc3Rpb25JbmRl
eCk7Ci0gICAgICAgIGlmICghbV9zdWdnZXN0aW9uc1BvcHVwLmdldCgpKSB7Ci0gICAgICAgICAg
ICBtX3N1Z2dlc3Rpb25zUG9wdXAgPQotICAgICAgICAgICAgICAgIFBvcHVwQ29udGFpbmVyOjpj
cmVhdGUobV9hdXRvY29tcGxldGVQb3B1cENsaWVudC5nZXQoKSwKLSAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIHN1Z2dlc3Rpb25zUG9wdXBTZXR0aW5ncyk7Ci0gICAgICAg
IH0KKyAgICBtX2F1dG9jb21wbGV0ZVBvcHVwQ2xpZW50LT5pbml0aWFsaXplKGlucHV0RWxlbSwg
c3VnZ2VzdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBk
ZWZhdWx0U3VnZ2VzdGlvbkluZGV4KTsKIAotICAgICAgICBpZiAobV9zdWdnZXN0aW9uc1BvcHVw
U2hvd2luZykgewotICAgICAgICAgICAgbV9hdXRvY29tcGxldGVQb3B1cENsaWVudC0+c2V0U3Vn
Z2VzdGlvbnMoc3VnZ2VzdGlvbnMpOwotICAgICAgICAgICAgcmVmcmVzaFN1Z2dlc3Rpb25zUG9w
dXAoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1fc3VnZ2VzdGlvbnNQb3B1cC0+
c2hvdyhmb2N1c2VkTm9kZS0+Z2V0UmVjdCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGZvY3VzZWROb2RlLT5vd25lckRvY3VtZW50KCktPnZpZXcoKSwgMCk7Ci0gICAg
ICAgICAgICBtX3N1Z2dlc3Rpb25zUG9wdXBTaG93aW5nID0gdHJ1ZTsKLSAgICAgICAgfQorICAg
IGlmIChtX3N1Z2dlc3Rpb25zUG9wdXBDbGllbnQgIT0gbV9hdXRvY29tcGxldGVQb3B1cENsaWVu
dC5nZXQoKSkgeworICAgICAgICBoaWRlU3VnZ2VzdGlvbnNQb3B1cCgpOworICAgICAgICBtX3N1
Z2dlc3Rpb25zUG9wdXBDbGllbnQgPSBtX2F1dG9jb21wbGV0ZVBvcHVwQ2xpZW50LmdldCgpOwor
ICAgIH0KKworICAgIGlmICghbV9hdXRvY29tcGxldGVQb3B1cC5nZXQoKSkKKyAgICAgICAgbV9h
dXRvY29tcGxldGVQb3B1cCA9IFBvcHVwQ29udGFpbmVyOjpjcmVhdGUobV9zdWdnZXN0aW9uc1Bv
cHVwQ2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBzdWdnZXN0aW9uc1BvcHVwU2V0dGluZ3MpOworCisgICAgaWYgKG1fc3VnZ2VzdGlv
bnNQb3B1cCAhPSBtX2F1dG9jb21wbGV0ZVBvcHVwLmdldCgpKQorICAgICAgICBtX3N1Z2dlc3Rp
b25zUG9wdXAgPSBtX2F1dG9jb21wbGV0ZVBvcHVwLmdldCgpOworCisgICAgaWYgKG1fc3VnZ2Vz
dGlvbnNQb3B1cFNob3dpbmcpIHsKKyAgICAgICAgbV9hdXRvY29tcGxldGVQb3B1cENsaWVudC0+
c2V0U3VnZ2VzdGlvbnMoc3VnZ2VzdGlvbnMpOworICAgICAgICByZWZyZXNoU3VnZ2VzdGlvbnNQ
b3B1cCgpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1fc3VnZ2VzdGlvbnNQb3B1cC0+c2hvdyhm
b2N1c2VkTm9kZS0+Z2V0UmVjdCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
Zm9jdXNlZE5vZGUtPm93bmVyRG9jdW1lbnQoKS0+dmlldygpLCAwKTsKKyAgICAgICAgbV9zdWdn
ZXN0aW9uc1BvcHVwU2hvd2luZyA9IHRydWU7CiAgICAgfQogfQogCkluZGV4OiBXZWJLaXQvY2hy
b21pdW0vc3JjL1dlYlZpZXdJbXBsLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0L2Nocm9taXVtL3Ny
Yy9XZWJWaWV3SW1wbC5oCShyZXZpc2lvbiA1NDUwMSkKKysrIFdlYktpdC9jaHJvbWl1bS9zcmMv
V2ViVmlld0ltcGwuaAkod29ya2luZyBjb3B5KQpAQCAtNTgsNiArNTgsNyBAQCBjbGFzcyBLZXli
b2FyZEV2ZW50OwogY2xhc3MgUGFnZTsKIGNsYXNzIFBsYXRmb3JtS2V5Ym9hcmRFdmVudDsKIGNs
YXNzIFBvcHVwQ29udGFpbmVyOworY2xhc3MgUG9wdXBNZW51Q2xpZW50OwogY2xhc3MgUmFuZ2U7
CiBjbGFzcyBSZW5kZXJUaGVtZTsKIGNsYXNzIFdpZGdldDsKQEAgLTY1LDcgKzY2LDkgQEAgY2xh
c3MgV2lkZ2V0OwogCiBuYW1lc3BhY2UgV2ViS2l0IHsKIGNsYXNzIEF1dG9jb21wbGV0ZVBvcHVw
TWVudUNsaWVudDsKK2NsYXNzIEF1dG9GaWxsUG9wdXBNZW51Q2xpZW50OwogY2xhc3MgQ29udGV4
dE1lbnVDbGllbnRJbXBsOworY2xhc3MgU3VnZ2VzdGlvbnNQb3B1cE1lbnVDbGllbnQ7CiBjbGFz
cyBXZWJBY2Nlc3NpYmlsaXR5T2JqZWN0OwogY2xhc3MgV2ViRGV2VG9vbHNBZ2VudFByaXZhdGU7
CiBjbGFzcyBXZWJGcmFtZUltcGw7CkBAIC0xNTMsNiArMTU2LDE1IEBAIHB1YmxpYzoKICAgICAg
ICAgY29uc3QgV2ViTm9kZSYsCiAgICAgICAgIGNvbnN0IFdlYlZlY3RvcjxXZWJTdHJpbmc+JiBz
dWdnZXN0aW9ucywKICAgICAgICAgaW50IGRlZmF1bHRTdWdnZXN0aW9uSW5kZXgpOworICAgIHZp
cnR1YWwgdm9pZCBhcHBseUF1dG9GaWxsU3VnZ2VzdGlvbnMoCisgICAgICAgIGNvbnN0IFdlYk5v
ZGUmLAorICAgICAgICBjb25zdCBXZWJWZWN0b3I8V2ViU3RyaW5nPiYgbmFtZXMsCisgICAgICAg
IGNvbnN0IFdlYlZlY3RvcjxXZWJTdHJpbmc+JiBsYWJlbHMsCisgICAgICAgIGludCBkZWZhdWx0
U3VnZ2VzdGlvbkluZGV4KTsKKyAgICB2aXJ0dWFsIHZvaWQgYXBwbHlBdXRvY29tcGxldGVTdWdn
ZXN0aW9ucygKKyAgICAgICAgY29uc3QgV2ViTm9kZSYsCisgICAgICAgIGNvbnN0IFdlYlZlY3Rv
cjxXZWJTdHJpbmc+JiBzdWdnZXN0aW9ucywKKyAgICAgICAgaW50IGRlZmF1bHRTdWdnZXN0aW9u
SW5kZXgpOwogICAgIHZpcnR1YWwgdm9pZCBoaWRlQXV0b2ZpbGxQb3B1cCgpOwogICAgIHZpcnR1
YWwgdm9pZCBoaWRlU3VnZ2VzdGlvbnNQb3B1cCgpOwogICAgIHZpcnR1YWwgdm9pZCBzZXRTY3Jv
bGxiYXJDb2xvcnModW5zaWduZWQgaW5hY3RpdmVDb2xvciwKQEAgLTM5NSwxNiArNDA3LDI5IEBA
IHByaXZhdGU6CiAgICAgLy8gY3VycmVudCBkcm9wIHRhcmdldCBpbiB0aGlzIFdlYlZpZXcgKHRo
ZSBkcm9wIHRhcmdldCBjYW4gYWNjZXB0IHRoZSBkcm9wKS4KICAgICBXZWJEcmFnT3BlcmF0aW9u
IG1fZHJhZ09wZXJhdGlvbjsKIAotICAgIC8vIFRoZSBzdWdnZXN0aW9ucyBwb3B1cC4gIEtlcHQg
YXJvdW5kIGFuZCByZXVzZWQgZXZlcnktdGltZSBuZXcgc3VnZ2VzdGlvbnMKLSAgICAvLyBzaG91
bGQgYmUgc2hvd24uCi0gICAgUmVmUHRyPFdlYkNvcmU6OlBvcHVwQ29udGFpbmVyPiBtX3N1Z2dl
c3Rpb25zUG9wdXA7Ci0KLSAgICAvLyBXaGV0aGVyIHRoZSBzdWdnZXN0aW9ucyBwb3B1cCBpcyBj
dXJyZW50bHkgc2hvd2luZy4KKyAgICAvLyBXaGV0aGVyIGEgc3VnZ2VzdGlvbnMgcG9wdXAgaXMg
Y3VycmVudGx5IHNob3dpbmcuCiAgICAgYm9vbCBtX3N1Z2dlc3Rpb25zUG9wdXBTaG93aW5nOwog
Ci0gICAgLy8gVGhlIGF1dG9jb21wbGV0ZSBjbGllbnQuCisgICAgLy8gQSBwb2ludGVyIHRvIHRo
ZSBjdXJyZW50IHN1Z2dlc3Rpb25zIHBvcHVwIG1lbnUgY2xpZW50LiAgVGhpcyBjYW4gYmUKKyAg
ICAvLyBlaXRoZXIgYW4gQXV0b0ZpbGxQb3B1cE1lbnVDbGllbnQgb3IgYW4gQXV0b2NvbXBsZXRl
UG9wdXBNZW51Q2xpZW50LiAgV2UKKyAgICAvLyBkbyBub3Qgb3duIHRoaXMgcG9pbnRlci4KKyAg
ICBTdWdnZXN0aW9uc1BvcHVwTWVudUNsaWVudCogbV9zdWdnZXN0aW9uc1BvcHVwQ2xpZW50Owor
CisgICAgLy8gVGhlIEF1dG9GaWxsIHBvcHVwIGNsaWVudC4KKyAgICBPd25QdHI8QXV0b0ZpbGxQ
b3B1cE1lbnVDbGllbnQ+IG1fYXV0b0ZpbGxQb3B1cENsaWVudDsKKworICAgIC8vIFRoZSBBdXRv
Y29tcGxldGUgcG9wdXAgY2xpZW50LgogICAgIE93blB0cjxBdXRvY29tcGxldGVQb3B1cE1lbnVD
bGllbnQ+IG1fYXV0b2NvbXBsZXRlUG9wdXBDbGllbnQ7CiAKKyAgICAvLyBBIHBvaW50ZXIgdG8g
dGhlIGN1cnJlbnQgc3VnZ2VzdGlvbnMgcG9wdXAuICBXZSBkbyBub3Qgb3duIHRoaXMgcG9pbnRl
ci4KKyAgICBXZWJDb3JlOjpQb3B1cENvbnRhaW5lciogbV9zdWdnZXN0aW9uc1BvcHVwOworCisg
ICAgLy8gVGhlIEF1dG9GaWxsIHN1Z2dlc3Rpb25zIHBvcHVwLgorICAgIFJlZlB0cjxXZWJDb3Jl
OjpQb3B1cENvbnRhaW5lcj4gbV9hdXRvRmlsbFBvcHVwOworCisgICAgLy8gVGhlIEF1dG9Db21w
bGV0ZSBzdWdnZXN0aW9ucyBwb3B1cC4KKyAgICBSZWZQdHI8V2ViQ29yZTo6UG9wdXBDb250YWlu
ZXI+IG1fYXV0b2NvbXBsZXRlUG9wdXA7CisKICAgICBPd25QdHI8V2ViRGV2VG9vbHNBZ2VudFBy
aXZhdGU+IG1fZGV2VG9vbHNBZ2VudDsKIAogICAgIC8vIFdoZXRoZXIgdGhlIHdlYnZpZXcgaXMg
cmVuZGVyaW5nIHRyYW5zcGFyZW50bHkuCg==
</data>
<flag name="review"
          id="31027"
          type_id="1"
          status="-"
          setter="fishd"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>48368</attachid>
            <date>2010-02-08 15:45:30 -0800</date>
            <delta_ts>2010-02-08 15:54:50 -0800</delta_ts>
            <desc>[Chromium] Refactor AutocompletePopupMenuClient [try3]</desc>
            <filename>refactor3.diff</filename>
            <type>text/plain</type>
            <size>46664</size>
            <attacher name="James Hawkins">jhawkins</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYktpdC9jaHJvbWl1bS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0L2No
cm9taXVtL0NoYW5nZUxvZwkocmV2aXNpb24gNTQ1MTgpCisrKyBXZWJLaXQvY2hyb21pdW0vQ2hh
bmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMzYgQEAKKzIwMTAtMDItMDggIEphbWVz
IEhhd2tpbnMgIDxqaGF3a2luc0BjaHJvbWl1bS5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkg
Tk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgW0Nocm9taXVtXSBSZWZhY3RvciBBdXRvY29tcGxl
dGVQb3B1cE1lbnVDbGllbnQgaW50byBhIGJhc2UgY2xhc3MsCisgICAgICAgIFN1Z2dlc3Rpb25z
UG9wdXBNZW51Q2xpZW50LCBhbmQgdHdvIGRlcml2ZWQgY2xhc3NlcywKKyAgICAgICAgQXV0b2Nv
bXBsZXRlUG9wdXBNZW51Q2xpZW50IGFuZCBBdXRvRmlsbFBvcHVwTWVudUNsaWVudC4gIEN1cnJl
bnRseQorICAgICAgICB0aGUgYmVoYXZpb3Igb2Ygc3VnZ2VzdGlvbnMgcG9wdXBzIGhhcyBub3Qg
Y2hhbmdlZC4KKworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/
aWQ9MzQ3MjEKKworICAgICAgICAqIFdlYktpdC5neXA6CisgICAgICAgICogcHVibGljL1dlYlZp
ZXcuaDoKKyAgICAgICAgKiBzcmMvQXV0b0ZpbGxQb3B1cE1lbnVDbGllbnQuY3BwOiBBZGRlZC4K
KyAgICAgICAgKiBzcmMvQXV0b0ZpbGxQb3B1cE1lbnVDbGllbnQuaDogQWRkZWQuCisgICAgICAg
ICogc3JjL0F1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVudC5jcHA6CisgICAgICAgIChXZWJLaXQ6
OkF1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVudDo6Z2V0U3VnZ2VzdGlvbnNDb3VudCk6CisgICAg
ICAgIChXZWJLaXQ6OkF1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVudDo6Z2V0U3VnZ2VzdGlvbik6
CisgICAgICAgIChXZWJLaXQ6OkF1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVudDo6cmVtb3ZlU3Vn
Z2VzdGlvbkF0SW5kZXgpOgorICAgICAgICAoV2ViS2l0OjpBdXRvY29tcGxldGVQb3B1cE1lbnVD
bGllbnQ6OmluaXRpYWxpemUpOgorICAgICAgICAoV2ViS2l0OjpBdXRvY29tcGxldGVQb3B1cE1l
bnVDbGllbnQ6OnNldFN1Z2dlc3Rpb25zKToKKyAgICAgICAgKiBzcmMvQXV0b2NvbXBsZXRlUG9w
dXBNZW51Q2xpZW50Lmg6CisgICAgICAgICogc3JjL1N1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50
LmNwcDogQWRkZWQuCisgICAgICAgICogc3JjL1N1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50Lmg6
IEFkZGVkLgorICAgICAgICAqIHNyYy9XZWJWaWV3SW1wbC5jcHA6CisgICAgICAgIChXZWJLaXQ6
OldlYlZpZXdJbXBsOjpXZWJWaWV3SW1wbCk6CisgICAgICAgIChXZWJLaXQ6OldlYlZpZXdJbXBs
OjprZXlFdmVudCk6CisgICAgICAgIChXZWJLaXQ6OldlYlZpZXdJbXBsOjphdXRvY29tcGxldGVI
YW5kbGVLZXlFdmVudCk6CisgICAgICAgIChXZWJLaXQ6OldlYlZpZXdJbXBsOjphcHBseUF1dG9m
aWxsU3VnZ2VzdGlvbnMpOgorICAgICAgICAoV2ViS2l0OjpXZWJWaWV3SW1wbDo6YXBwbHlBdXRv
RmlsbFN1Z2dlc3Rpb25zKToKKyAgICAgICAgKFdlYktpdDo6V2ViVmlld0ltcGw6OmFwcGx5QXV0
b2NvbXBsZXRlU3VnZ2VzdGlvbnMpOgorICAgICAgICAqIHNyYy9XZWJWaWV3SW1wbC5oOgorCiAy
MDEwLTAyLTA4ICBQYXZlbCBGZWxkbWFuICA8cGZlbGRtYW5AY2hyb21pdW0ub3JnPgogCiAgICAg
ICAgIFJldmlld2VkIGJ5IERhdmlkIExldmluLgpJbmRleDogV2ViS2l0L2Nocm9taXVtL1dlYktp
dC5neXAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0L2Nocm9taXVtL1dlYktpdC5neXAJKHJldmlzaW9u
IDU0NTAxKQorKysgV2ViS2l0L2Nocm9taXVtL1dlYktpdC5neXAJKHdvcmtpbmcgY29weSkKQEAg
LTE5OSw2ICsxOTksOCBAQAogICAgICAgICAgICAgICAgICdzcmMvQXNzZXJ0TWF0Y2hpbmdFbnVt
cy5jcHAnLAogICAgICAgICAgICAgICAgICdzcmMvQXV0b2NvbXBsZXRlUG9wdXBNZW51Q2xpZW50
LmNwcCcsCiAgICAgICAgICAgICAgICAgJ3NyYy9BdXRvY29tcGxldGVQb3B1cE1lbnVDbGllbnQu
aCcsCisgICAgICAgICAgICAgICAgJ3NyYy9BdXRvRmlsbFBvcHVwTWVudUNsaWVudC5jcHAnLAor
ICAgICAgICAgICAgICAgICdzcmMvQXV0b0ZpbGxQb3B1cE1lbnVDbGllbnQuaCcsCiAgICAgICAg
ICAgICAgICAgJ3NyYy9CYWNrRm9yd2FyZExpc3RDbGllbnRJbXBsLmNwcCcsCiAgICAgICAgICAg
ICAgICAgJ3NyYy9CYWNrRm9yd2FyZExpc3RDbGllbnRJbXBsLmgnLAogICAgICAgICAgICAgICAg
ICdzcmMvQm91bmRPYmplY3QuY3BwJywKQEAgLTI1Nyw2ICsyNTksOCBAQAogICAgICAgICAgICAg
ICAgICdzcmMvU3RvcmFnZUV2ZW50RGlzcGF0Y2hlckltcGwuaCcsCiAgICAgICAgICAgICAgICAg
J3NyYy9TdG9yYWdlTmFtZXNwYWNlUHJveHkuY3BwJywKICAgICAgICAgICAgICAgICAnc3JjL1N0
b3JhZ2VOYW1lc3BhY2VQcm94eS5oJywKKyAgICAgICAgICAgICAgICAnc3JjL1N1Z2dlc3Rpb25z
UG9wdXBNZW51Q2xpZW50LmNwcCcsCisgICAgICAgICAgICAgICAgJ3NyYy9TdWdnZXN0aW9uc1Bv
cHVwTWVudUNsaWVudC5oJywKICAgICAgICAgICAgICAgICAnc3JjL1RlbXBvcmFyeUdsdWUuaCcs
CiAgICAgICAgICAgICAgICAgJ3NyYy9Ub29sc0FnZW50LmgnLAogICAgICAgICAgICAgICAgICdz
cmMvV2ViQWNjZXNzaWJpbGl0eUNhY2hlLmNwcCcsCkluZGV4OiBXZWJLaXQvY2hyb21pdW0vcHVi
bGljL1dlYlZpZXcuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQvY2hyb21pdW0vcHVibGljL1dlYlZp
ZXcuaAkocmV2aXNpb24gNTQ1MDEpCisrKyBXZWJLaXQvY2hyb21pdW0vcHVibGljL1dlYlZpZXcu
aAkod29ya2luZyBjb3B5KQpAQCAtMjIzLDE0ICsyMjMsMjkgQEAgcHVibGljOgogICAgIHZpcnR1
YWwgV2ViQWNjZXNzaWJpbGl0eU9iamVjdCBhY2Nlc3NpYmlsaXR5T2JqZWN0KCkgPSAwOwogCiAK
LSAgICAvLyBBdXRvZmlsbCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBBdXRvRmlsbCAvIEF1dG9jb21wbGV0ZSAtLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotICAgIC8vIE5vdGlm
aWVzIHRoZSBXZWJWaWV3IHRoYXQgYXV0b2ZpbGwgc3VnZ2VzdGlvbnMgYXJlIGF2YWlsYWJsZSBm
b3IgYSBub2RlLgorICAgIC8vIERFUFJFQ0FURUQ6IFdlYlZpZXc6OmFwcGx5QXV0b2NvbXBsZXRl
U3VnZ2VzdGlvbnMgaXMgdGhlIG5ldyB3YXkgdG8KKyAgICAvLyBhY2Nlc3MgdGhpcy4KICAgICB2
aXJ0dWFsIHZvaWQgYXBwbHlBdXRvZmlsbFN1Z2dlc3Rpb25zKAogICAgICAgICBjb25zdCBXZWJO
b2RlJiwKICAgICAgICAgY29uc3QgV2ViVmVjdG9yPFdlYlN0cmluZz4mIHN1Z2dlc3Rpb25zLAog
ICAgICAgICBpbnQgZGVmYXVsdFN1Z2dlc3Rpb25JbmRleCkgPSAwOwogCisgICAgLy8gTm90aWZp
ZXMgdGhlIFdlYlZpZXcgdGhhdCBBdXRvRmlsbCBzdWdnZXN0aW9ucyBhcmUgYXZhaWxhYmxlIGZv
ciBhIG5vZGUuCisgICAgdmlydHVhbCB2b2lkIGFwcGx5QXV0b0ZpbGxTdWdnZXN0aW9ucygKKyAg
ICAgICAgY29uc3QgV2ViTm9kZSYsCisgICAgICAgIGNvbnN0IFdlYlZlY3RvcjxXZWJTdHJpbmc+
JiBuYW1lcywKKyAgICAgICAgY29uc3QgV2ViVmVjdG9yPFdlYlN0cmluZz4mIGxhYmVscywKKyAg
ICAgICAgaW50IGRlZmF1bHRTdWdnZXN0aW9uSW5kZXgpID0gMDsKKworICAgIC8vIE5vdGlmaWVz
IHRoZSBXZWJWaWV3IHRoYXQgQXV0b2NvbXBsZXRlIHN1Z2dlc3Rpb25zIGFyZSBhdmFpbGFibGUg
Zm9yIGEKKyAgICAvLyBub2RlLgorICAgIHZpcnR1YWwgdm9pZCBhcHBseUF1dG9jb21wbGV0ZVN1
Z2dlc3Rpb25zKAorICAgICAgICBjb25zdCBXZWJOb2RlJiwKKyAgICAgICAgY29uc3QgV2ViVmVj
dG9yPFdlYlN0cmluZz4mIHN1Z2dlc3Rpb25zLAorICAgICAgICBpbnQgZGVmYXVsdFN1Z2dlc3Rp
b25JbmRleCkgPSAwOworCiAgICAgLy8gREVQUkVDQVRFRDogV2ViVmlldzo6aGlkZVN1Z2dlc3Rp
b25zUG9wdXAgaXMgdGhlIG5ldyB3YXkgdG8gYWNjZXNzIHRoaXMuCiAgICAgdmlydHVhbCB2b2lk
IGhpZGVBdXRvZmlsbFBvcHVwKCkgPSAwOwogCkluZGV4OiBXZWJLaXQvY2hyb21pdW0vc3JjL0F1
dG9GaWxsUG9wdXBNZW51Q2xpZW50LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQvY2hyb21pdW0v
c3JjL0F1dG9GaWxsUG9wdXBNZW51Q2xpZW50LmNwcAkocmV2aXNpb24gMCkKKysrIFdlYktpdC9j
aHJvbWl1bS9zcmMvQXV0b0ZpbGxQb3B1cE1lbnVDbGllbnQuY3BwCShyZXZpc2lvbiAwKQpAQCAt
MCwwICsxLDExMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwg
cmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl
IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUg
cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICog
bWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJl
dGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlv
bnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3Zp
ZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1l
IG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5
IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICog
dGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4K
KyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVS
UyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVE
IFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJ
RUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBB
UlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENP
UFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNF
UVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9D
VVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAq
IERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJBdXRvRmlsbFBvcHVw
TWVudUNsaWVudC5oIgorCisjaW5jbHVkZSAiQ1NTU3R5bGVTZWxlY3Rvci5oIgorI2luY2x1ZGUg
IkNTU1ZhbHVlS2V5d29yZHMuaCIKKyNpbmNsdWRlICJGcmFtZVZpZXcuaCIKKyNpbmNsdWRlICJI
VE1MSW5wdXRFbGVtZW50LmgiCisjaW5jbHVkZSAiUmVuZGVyVGhlbWUuaCIKKyNpbmNsdWRlICJX
ZWJOb2RlLmgiCisjaW5jbHVkZSAiV2ViVmVjdG9yLmgiCisjaW5jbHVkZSAiV2ViVmlld0NsaWVu
dC5oIgorI2luY2x1ZGUgIldlYlZpZXdJbXBsLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBXZWJDb3Jl
OworCituYW1lc3BhY2UgV2ViS2l0IHsKKwordW5zaWduZWQgQXV0b0ZpbGxQb3B1cE1lbnVDbGll
bnQ6OmdldFN1Z2dlc3Rpb25zQ291bnQoKSBjb25zdAoreworICAgIHJldHVybiBtX25hbWVzLnNp
emUoKTsKK30KKworV2ViU3RyaW5nIEF1dG9GaWxsUG9wdXBNZW51Q2xpZW50OjpnZXRTdWdnZXN0
aW9uKHVuc2lnbmVkIGxpc3RJbmRleCkgY29uc3QKK3sKKyAgICAvLyBGSVhNRTogTW9kaWZ5IHRo
ZSBQb3B1cE1lbnUgdG8gYWRkIHRoZSBsYWJlbCBpbiBncmF5IHJpZ2h0LWp1c3RpZmllZC4KKyAg
ICBBU1NFUlQobGlzdEluZGV4ID49IDAgJiYgbGlzdEluZGV4IDwgbV9uYW1lcy5zaXplKCkpOwor
ICAgIHJldHVybiBtX25hbWVzW2xpc3RJbmRleF0gKyBTdHJpbmcoIiAoIikgKyBtX2xhYmVsc1ts
aXN0SW5kZXhdICsgU3RyaW5nKCIpIik7Cit9CisKK3ZvaWQgQXV0b0ZpbGxQb3B1cE1lbnVDbGll
bnQ6OnJlbW92ZVN1Z2dlc3Rpb25BdEluZGV4KHVuc2lnbmVkIGxpc3RJbmRleCkKK3sKKyAgICAv
LyBGSVhNRTogRG8gd2Ugd2FudCB0byByZW1vdmUgQXV0b0ZpbGwgc3VnZ2VzdGlvbnM/CisgICAg
QVNTRVJUKGxpc3RJbmRleCA+PSAwICYmIGxpc3RJbmRleCA8IHN0YXRpY19jYXN0PGludD4obV9u
YW1lcy5zaXplKCkpKTsKKyAgICBtX25hbWVzLnJlbW92ZShsaXN0SW5kZXgpOworICAgIG1fbGFi
ZWxzLnJlbW92ZShsaXN0SW5kZXgpOworfQorCit2b2lkIEF1dG9GaWxsUG9wdXBNZW51Q2xpZW50
Ojogc2VsZWN0aW9uQ2hhbmdlZCh1bnNpZ25lZCBsaXN0SW5kZXgsCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZpcmVFdmVudHMpIHsKKyAgICBp
ZiAobGlzdEluZGV4ID09IHN0YXRpY19jYXN0PHVuc2lnbmVkPigtMSkpIHsKKyAgICAgICAgU3Vn
Z2VzdGlvbnNQb3B1cE1lbnVDbGllbnQ6OnNlbGVjdGlvbkNoYW5nZWQobGlzdEluZGV4LCBmaXJl
RXZlbnRzKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEFTU0VSVChsaXN0SW5kZXgg
Pj0gMCAmJiBsaXN0SW5kZXggPCBtX25hbWVzLnNpemUoKSk7CisgICAgc2V0U3VnZ2VzdGVkVmFs
dWUobV9uYW1lc1tsaXN0SW5kZXhdKTsKK30KKwordm9pZCBBdXRvRmlsbFBvcHVwTWVudUNsaWVu
dDo6aW5pdGlhbGl6ZSgKKyAgICBIVE1MSW5wdXRFbGVtZW50KiB0ZXh0RmllbGQsCisgICAgY29u
c3QgV2ViVmVjdG9yPFdlYlN0cmluZz4mIG5hbWVzLAorICAgIGNvbnN0IFdlYlZlY3RvcjxXZWJT
dHJpbmc+JiBsYWJlbHMsCisgICAgaW50IGRlZmF1bHRTdWdnZXN0aW9uSW5kZXgpCit7CisgICAg
QVNTRVJUKG5hbWVzLnNpemUoKSA9PSBsYWJlbHMuc2l6ZSgpKTsKKyAgICBBU1NFUlQoZGVmYXVs
dFN1Z2dlc3Rpb25JbmRleCA8IHN0YXRpY19jYXN0PGludD4obmFtZXMuc2l6ZSgpKSk7CisKKyAg
ICAvLyBUaGUgc3VnZ2VzdGlvbnMgbXVzdCBiZSBzZXQgYmVmb3JlIGluaXRpYWxpemluZyB0aGUK
KyAgICAvLyBTdWdnZXN0aW9uc1BvcHVwTWVudUNsaWVudC4KKyAgICBzZXRTdWdnZXN0aW9ucyhu
YW1lcywgbGFiZWxzKTsKKworICAgIFN1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50Ojppbml0aWFs
aXplKHRleHRGaWVsZCwgZGVmYXVsdFN1Z2dlc3Rpb25JbmRleCk7Cit9CisKK3ZvaWQgQXV0b0Zp
bGxQb3B1cE1lbnVDbGllbnQ6OnNldFN1Z2dlc3Rpb25zKGNvbnN0IFdlYlZlY3RvcjxXZWJTdHJp
bmc+JiBuYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGNvbnN0IFdlYlZlY3RvcjxXZWJTdHJpbmc+JiBsYWJlbHMpCit7CisgICAgQVNTRVJUKG5hbWVz
LnNpemUoKSA9PSBsYWJlbHMuc2l6ZSgpKTsKKworICAgIG1fbmFtZXMuY2xlYXIoKTsKKyAgICBt
X2xhYmVscy5jbGVhcigpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbmFtZXMuc2l6ZSgp
OyArK2kpIHsKKyAgICAgICAgbV9uYW1lcy5hcHBlbmQobmFtZXNbaV0pOworICAgICAgICBtX2xh
YmVscy5hcHBlbmQobGFiZWxzW2ldKTsKKyAgICB9CisKKyAgICAvLyBUcnkgdG8gcHJlc2VydmUg
c2VsZWN0aW9uIGlmIHBvc3NpYmxlLgorICAgIGlmIChnZXRTZWxlY3RlZEluZGV4KCkgPj0gc3Rh
dGljX2Nhc3Q8aW50PihuYW1lcy5zaXplKCkpKQorICAgICAgICBzZXRTZWxlY3RlZEluZGV4KC0x
KTsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViS2l0CkluZGV4OiBXZWJLaXQvY2hyb21pdW0vc3Jj
L0F1dG9GaWxsUG9wdXBNZW51Q2xpZW50LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0L2Nocm9taXVt
L3NyYy9BdXRvRmlsbFBvcHVwTWVudUNsaWVudC5oCShyZXZpc2lvbiAwKQorKysgV2ViS2l0L2No
cm9taXVtL3NyYy9BdXRvRmlsbFBvcHVwTWVudUNsaWVudC5oCShyZXZpc2lvbiAwKQpAQCAtMCww
ICsxLDc0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5k
IGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJt
aXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6
CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWlu
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBp
biBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIK
KyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQg
d2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2Yg
R29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUg
dXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlz
IHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoK
KyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFO
RCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FS
UkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBX
QVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElD
VUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJ
R0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVO
VElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVN
RU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFU
QSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBB
TkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBT
VFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09G
VFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
CisgKi8KKworI2lmbmRlZiBBdXRvRmlsbFBvcHVwTWVudUNsaWVudF9oCisjZGVmaW5lIEF1dG9G
aWxsUG9wdXBNZW51Q2xpZW50X2gKKworI2luY2x1ZGUgIlN1Z2dlc3Rpb25zUG9wdXBNZW51Q2xp
ZW50LmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKK2NsYXNzIEhUTUxJbnB1dEVsZW1lbnQ7Citj
bGFzcyBQb3B1cE1lbnVTdHlsZTsKK2NsYXNzIFJlbmRlclN0eWxlOworfQorCituYW1lc3BhY2Ug
V2ViS2l0IHsKK2NsYXNzIFdlYlN0cmluZzsKK2NsYXNzIFdlYlZpZXdJbXBsOwordGVtcGxhdGUg
PHR5cGVuYW1lIFQ+IGNsYXNzIFdlYlZlY3RvcjsKKworLy8gVGhlIEF1dG9GaWxsIHN1Z2dlc3Rp
b25zIHBvcHVwIG1lbnUgY2xpZW50LCB1c2VkIHRvIGRpc3BsYXkgbmFtZSBzdWdnZXN0aW9ucwor
Ly8gd2l0aCByaWdodC1qdXN0aWZpZWQgbGFiZWxzLgorY2xhc3MgQXV0b0ZpbGxQb3B1cE1lbnVD
bGllbnQgOiBwdWJsaWMgU3VnZ2VzdGlvbnNQb3B1cE1lbnVDbGllbnQgeworcHVibGljOgorICAg
IC8vIFN1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50IGltcGxlbWVudGF0aW9uOgorICAgIHZpcnR1
YWwgdW5zaWduZWQgZ2V0U3VnZ2VzdGlvbnNDb3VudCgpIGNvbnN0OworICAgIHZpcnR1YWwgV2Vi
U3RyaW5nIGdldFN1Z2dlc3Rpb24odW5zaWduZWQgbGlzdEluZGV4KSBjb25zdDsKKyAgICB2aXJ0
dWFsIHZvaWQgcmVtb3ZlU3VnZ2VzdGlvbkF0SW5kZXgodW5zaWduZWQgbGlzdEluZGV4KTsKKwor
ICAgIC8vIFdlYkNvcmU6OlBvcHVwTWVudUNsaWVudCBpbXBsZW1lbnRhdGlvbjoKKyAgICB2aXJ0
dWFsIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZCh1bnNpZ25lZCBsaXN0SW5kZXgsIGJvb2wgZmlyZUV2
ZW50cyk7CisKKyAgICB2b2lkIGluaXRpYWxpemUoV2ViQ29yZTo6SFRNTElucHV0RWxlbWVudCos
CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdlYlZlY3RvcjxXZWJTdHJpbmc+JiBuYW1lcywK
KyAgICAgICAgICAgICAgICAgICAgY29uc3QgV2ViVmVjdG9yPFdlYlN0cmluZz4mIGxhYmVscywK
KyAgICAgICAgICAgICAgICAgICAgaW50IGRlZmF1bHRTdWdnZXN0aW9uSW5kZXgpOworCisgICAg
dm9pZCBzZXRTdWdnZXN0aW9ucyhjb25zdCBXZWJWZWN0b3I8V2ViU3RyaW5nPiYgbmFtZXMsCisg
ICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXZWJWZWN0b3I8V2ViU3RyaW5nPiYgbGFiZWxz
KTsKKworcHJpdmF0ZToKKyAgICBWZWN0b3I8V2ViQ29yZTo6U3RyaW5nPiBtX25hbWVzOworICAg
IFZlY3RvcjxXZWJDb3JlOjpTdHJpbmc+IG1fbGFiZWxzOworfTsKKworfSAvLyBuYW1lc3BhY2Ug
V2ViS2l0CisKKyNlbmRpZgoKUHJvcGVydHkgY2hhbmdlcyBvbjogV2ViS2l0L2Nocm9taXVtL3Ny
Yy9BdXRvRmlsbFBvcHVwTWVudUNsaWVudC5oCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KQWRkZWQ6IHN2bjplb2wtc3R5
bGUKICAgKyBMRgoKSW5kZXg6IFdlYktpdC9jaHJvbWl1bS9zcmMvQXV0b2NvbXBsZXRlUG9wdXBN
ZW51Q2xpZW50LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQvY2hyb21pdW0vc3JjL0F1dG9jb21w
bGV0ZVBvcHVwTWVudUNsaWVudC5jcHAJKHJldmlzaW9uIDU0NTAxKQorKysgV2ViS2l0L2Nocm9t
aXVtL3NyYy9BdXRvY29tcGxldGVQb3B1cE1lbnVDbGllbnQuY3BwCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBHb29nbGUgSW5jLiBBbGwg
cmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCBy
aWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ug
YW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAgKiBtb2RpZmljYXRpb24sIGFyZSBw
ZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCkBAIC00
MywxNSArNDMsMjEgQEAgdXNpbmcgbmFtZXNwYWNlIFdlYkNvcmU7CiAKIG5hbWVzcGFjZSBXZWJL
aXQgewogCi1BdXRvY29tcGxldGVQb3B1cE1lbnVDbGllbnQ6OkF1dG9jb21wbGV0ZVBvcHVwTWVu
dUNsaWVudChXZWJWaWV3SW1wbCogd2ViVmlldykKLSAgICA6IG1fdGV4dEZpZWxkKDApCi0gICAg
LCBtX3NlbGVjdGVkSW5kZXgoMCkKLSAgICAsIG1fd2ViVmlldyh3ZWJWaWV3KQordW5zaWduZWQg
QXV0b2NvbXBsZXRlUG9wdXBNZW51Q2xpZW50OjpnZXRTdWdnZXN0aW9uc0NvdW50KCkgY29uc3QK
IHsKKyAgICByZXR1cm4gbV9zdWdnZXN0aW9ucy5zaXplKCk7CiB9CiAKLUF1dG9jb21wbGV0ZVBv
cHVwTWVudUNsaWVudDo6fkF1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVudCgpCitXZWJTdHJpbmcg
QXV0b2NvbXBsZXRlUG9wdXBNZW51Q2xpZW50OjpnZXRTdWdnZXN0aW9uKHVuc2lnbmVkIGxpc3RJ
bmRleCkgY29uc3QKIHsKKyAgICBBU1NFUlQobGlzdEluZGV4ID49IDAgJiYgbGlzdEluZGV4IDwg
bV9zdWdnZXN0aW9ucy5zaXplKCkpOworICAgIHJldHVybiBtX3N1Z2dlc3Rpb25zW2xpc3RJbmRl
eF07Cit9CisKK3ZvaWQgQXV0b2NvbXBsZXRlUG9wdXBNZW51Q2xpZW50OjpyZW1vdmVTdWdnZXN0
aW9uQXRJbmRleCh1bnNpZ25lZCBsaXN0SW5kZXgpCit7CisgICAgQVNTRVJUKGxpc3RJbmRleCA+
PSAwICYmIGxpc3RJbmRleCA8IG1fc3VnZ2VzdGlvbnMuc2l6ZSgpKTsKKyAgICBtX3N1Z2dlc3Rp
b25zLnJlbW92ZShsaXN0SW5kZXgpOwogfQogCiB2b2lkIEF1dG9jb21wbGV0ZVBvcHVwTWVudUNs
aWVudDo6aW5pdGlhbGl6ZSgKQEAgLTYwLDkwICs2NiwxMiBAQCB2b2lkIEF1dG9jb21wbGV0ZVBv
cHVwTWVudUNsaWVudDo6aW5pdGlhCiAgICAgaW50IGRlZmF1bHRTdWdnZXN0aW9uSW5kZXgpCiB7
CiAgICAgQVNTRVJUKGRlZmF1bHRTdWdnZXN0aW9uSW5kZXggPCBzdGF0aWNfY2FzdDxpbnQ+KHN1
Z2dlc3Rpb25zLnNpemUoKSkpOwotICAgIG1fdGV4dEZpZWxkID0gdGV4dEZpZWxkOwotICAgIG1f
c2VsZWN0ZWRJbmRleCA9IGRlZmF1bHRTdWdnZXN0aW9uSW5kZXg7Ci0gICAgc2V0U3VnZ2VzdGlv
bnMoc3VnZ2VzdGlvbnMpOwotCi0gICAgRm9udERlc2NyaXB0aW9uIGZvbnREZXNjcmlwdGlvbjsK
LSAgICBtX3dlYlZpZXctPnRoZW1lKCktPnN5c3RlbUZvbnQoQ1NTVmFsdWVXZWJraXRDb250cm9s
LCBmb250RGVzY3JpcHRpb24pOwotICAgIC8vIFVzZSBhIHNtYWxsZXIgZm9udCBzaXplIHRvIG1h
dGNoIElFL0ZpcmVmb3guCi0gICAgLy8gRklYTUU6IGh0dHA6Ly9jcmJ1Zy5jb20vNzM3NiB1c2Ug
dGhlIHN5c3RlbSBzaXplIGluc3RlYWQgb2YgYQotICAgIC8vICAgICAgICBmaXhlZCBmb250IHNp
emUgdmFsdWUuCi0gICAgZm9udERlc2NyaXB0aW9uLnNldENvbXB1dGVkU2l6ZSgxMi4wKTsKLSAg
ICBGb250IGZvbnQoZm9udERlc2NyaXB0aW9uLCAwLCAwKTsKLSAgICBmb250LnVwZGF0ZSh0ZXh0
RmllbGQtPmRvY3VtZW50KCktPnN0eWxlU2VsZWN0b3IoKS0+Zm9udFNlbGVjdG9yKCkpOwotICAg
IC8vIFRoZSBkaXJlY3Rpb24gb2YgdGV4dCBpbiBwb3B1cCBtZW51IGlzIHNldCB0aGUgc2FtZSBh
cyB0aGUgZGlyZWN0aW9uIG9mCi0gICAgLy8gdGhlIGlucHV0IGVsZW1lbnQ6IHRleHRGaWVsZC4K
LSAgICBtX3N0eWxlLnNldChuZXcgUG9wdXBNZW51U3R5bGUoQ29sb3I6OmJsYWNrLCBDb2xvcjo6
d2hpdGUsIGZvbnQsIHRydWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExl
bmd0aChXZWJDb3JlOjpGaXhlZCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IHRleHRGaWVsZC0+cmVuZGVyZXIoKS0+c3R5bGUoKS0+ZGlyZWN0aW9uKCkpKTsKLX0KLQotdm9p
ZCBBdXRvY29tcGxldGVQb3B1cE1lbnVDbGllbnQ6OnZhbHVlQ2hhbmdlZCh1bnNpZ25lZCBsaXN0
SW5kZXgsIGJvb2wgZmlyZUV2ZW50cykKLXsKLSAgICBtX3RleHRGaWVsZC0+c2V0VmFsdWUobV9z
dWdnZXN0aW9uc1tsaXN0SW5kZXhdKTsKLSAgICBFZGl0b3JDbGllbnRJbXBsKiBlZGl0b3IgPQot
ICAgICAgICBzdGF0aWNfY2FzdDxFZGl0b3JDbGllbnRJbXBsKj4obV93ZWJWaWV3LT5wYWdlKCkt
PmVkaXRvckNsaWVudCgpKTsKLSAgICBBU1NFUlQoZWRpdG9yKTsKLSAgICBlZGl0b3ItPm9uQXV0
b2ZpbGxTdWdnZXN0aW9uQWNjZXB0ZWQoCi0gICAgICAgIHN0YXRpY19jYXN0PEhUTUxJbnB1dEVs
ZW1lbnQqPihtX3RleHRGaWVsZC5nZXQoKSkpOwotfQotCi1TdHJpbmcgQXV0b2NvbXBsZXRlUG9w
dXBNZW51Q2xpZW50OjppdGVtVGV4dCh1bnNpZ25lZCBsaXN0SW5kZXgpIGNvbnN0Ci17Ci0gICAg
cmV0dXJuIG1fc3VnZ2VzdGlvbnNbbGlzdEluZGV4XTsKLX0KLQotUG9wdXBNZW51U3R5bGUgQXV0
b2NvbXBsZXRlUG9wdXBNZW51Q2xpZW50OjppdGVtU3R5bGUodW5zaWduZWQgbGlzdEluZGV4KSBj
b25zdAotewotICAgIHJldHVybiAqbV9zdHlsZTsKLX0KLQotUG9wdXBNZW51U3R5bGUgQXV0b2Nv
bXBsZXRlUG9wdXBNZW51Q2xpZW50OjptZW51U3R5bGUoKSBjb25zdAotewotICAgIHJldHVybiAq
bV9zdHlsZTsKLX0KLQotaW50IEF1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVudDo6Y2xpZW50UGFk
ZGluZ0xlZnQoKSBjb25zdAotewotICAgIC8vIEJ1ZyBodHRwOi8vY3JidWcuY29tLzc3MDggc2Vl
bXMgdG8gaW5kaWNhdGUgdGhlIHN0eWxlIGNhbiBiZSAwLgotICAgIFJlbmRlclN0eWxlKiBzdHls
ZSA9IHRleHRGaWVsZFN0eWxlKCk7Ci0gICAgcmV0dXJuIHN0eWxlID8gbV93ZWJWaWV3LT50aGVt
ZSgpLT5wb3B1cEludGVybmFsUGFkZGluZ0xlZnQoc3R5bGUpIDogMDsKLX0KIAotaW50IEF1dG9j
b21wbGV0ZVBvcHVwTWVudUNsaWVudDo6Y2xpZW50UGFkZGluZ1JpZ2h0KCkgY29uc3QKLXsKLSAg
ICAvLyBCdWcgaHR0cDovL2NyYnVnLmNvbS83NzA4IHNlZW1zIHRvIGluZGljYXRlIHRoZSBzdHls
ZSBjYW4gYmUgMC4KLSAgICBSZW5kZXJTdHlsZSogc3R5bGUgPSB0ZXh0RmllbGRTdHlsZSgpOwot
ICAgIHJldHVybiBzdHlsZSA/IG1fd2ViVmlldy0+dGhlbWUoKS0+cG9wdXBJbnRlcm5hbFBhZGRp
bmdSaWdodChzdHlsZSkgOiAwOwotfQotCi12b2lkIEF1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVu
dDo6cG9wdXBEaWRIaWRlKCkKLXsKLSAgICBtX3dlYlZpZXctPnN1Z2dlc3Rpb25zUG9wdXBEaWRI
aWRlKCk7Ci19Ci0KLXZvaWQgQXV0b2NvbXBsZXRlUG9wdXBNZW51Q2xpZW50OjpzZXRUZXh0RnJv
bUl0ZW0odW5zaWduZWQgbGlzdEluZGV4KQotewotICAgIG1fdGV4dEZpZWxkLT5zZXRWYWx1ZSht
X3N1Z2dlc3Rpb25zW2xpc3RJbmRleF0pOwotfQotCi1Gb250U2VsZWN0b3IqIEF1dG9jb21wbGV0
ZVBvcHVwTWVudUNsaWVudDo6Zm9udFNlbGVjdG9yKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV90
ZXh0RmllbGQtPmRvY3VtZW50KCktPnN0eWxlU2VsZWN0b3IoKS0+Zm9udFNlbGVjdG9yKCk7Ci19
Ci0KLUhvc3RXaW5kb3cqIEF1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVudDo6aG9zdFdpbmRvdygp
IGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fdGV4dEZpZWxkLT5kb2N1bWVudCgpLT52aWV3KCktPmhv
c3RXaW5kb3coKTsKLX0KKyAgICAvLyBUaGUgc3VnZ2VzdGlvbnMgbXVzdCBiZSBzZXQgYmVmb3Jl
IGluaXRpYWxpemluZyB0aGUKKyAgICAvLyBTdWdnZXN0aW9uc1BvcHVwTWVudUNsaWVudC4KKyAg
ICBzZXRTdWdnZXN0aW9ucyhzdWdnZXN0aW9ucyk7CiAKLVBhc3NSZWZQdHI8U2Nyb2xsYmFyPiBB
dXRvY29tcGxldGVQb3B1cE1lbnVDbGllbnQ6OmNyZWF0ZVNjcm9sbGJhcigKLSAgICBTY3JvbGxi
YXJDbGllbnQqIGNsaWVudCwKLSAgICBTY3JvbGxiYXJPcmllbnRhdGlvbiBvcmllbnRhdGlvbiwK
LSAgICBTY3JvbGxiYXJDb250cm9sU2l6ZSBzaXplKQotewotICAgIHJldHVybiBTY3JvbGxiYXI6
OmNyZWF0ZU5hdGl2ZVNjcm9sbGJhcihjbGllbnQsIG9yaWVudGF0aW9uLCBzaXplKTsKKyAgICBT
dWdnZXN0aW9uc1BvcHVwTWVudUNsaWVudDo6aW5pdGlhbGl6ZSh0ZXh0RmllbGQsIGRlZmF1bHRT
dWdnZXN0aW9uSW5kZXgpOwogfQogCiB2b2lkIEF1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVudDo6
c2V0U3VnZ2VzdGlvbnMoY29uc3QgV2ViVmVjdG9yPFdlYlN0cmluZz4mIHN1Z2dlc3Rpb25zKQpA
QCAtMTUxLDI4ICs3OSwxMCBAQCB2b2lkIEF1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVudDo6c2V0
U3VnCiAgICAgbV9zdWdnZXN0aW9ucy5jbGVhcigpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBp
IDwgc3VnZ2VzdGlvbnMuc2l6ZSgpOyArK2kpCiAgICAgICAgIG1fc3VnZ2VzdGlvbnMuYXBwZW5k
KHN1Z2dlc3Rpb25zW2ldKTsKLSAgICAvLyBUcnkgdG8gcHJlc2VydmUgc2VsZWN0aW9uIGlmIHBv
c3NpYmxlLgotICAgIGlmIChtX3NlbGVjdGVkSW5kZXggPj0gc3RhdGljX2Nhc3Q8aW50PihzdWdn
ZXN0aW9ucy5zaXplKCkpKQotICAgICAgICBtX3NlbGVjdGVkSW5kZXggPSAtMTsKLX0KIAotdm9p
ZCBBdXRvY29tcGxldGVQb3B1cE1lbnVDbGllbnQ6OnJlbW92ZUl0ZW1BdEluZGV4KGludCBpbmRl
eCkKLXsKLSAgICBBU1NFUlQoaW5kZXggPj0gMCAmJiBpbmRleCA8IHN0YXRpY19jYXN0PGludD4o
bV9zdWdnZXN0aW9ucy5zaXplKCkpKTsKLSAgICBtX3N1Z2dlc3Rpb25zLnJlbW92ZShpbmRleCk7
Ci19Ci0KLVJlbmRlclN0eWxlKiBBdXRvY29tcGxldGVQb3B1cE1lbnVDbGllbnQ6OnRleHRGaWVs
ZFN0eWxlKCkgY29uc3QKLXsKLSAgICBSZW5kZXJTdHlsZSogc3R5bGUgPSBtX3RleHRGaWVsZC0+
Y29tcHV0ZWRTdHlsZSgpOwotICAgIGlmICghc3R5bGUpIHsKLSAgICAgICAgLy8gSXQgc2VlbXMg
d2UgY2FuIG9ubHkgaGF2ZSBhIDAgc3R5bGUgaW4gYSBUZXh0RmllbGQgaWYgdGhlCi0gICAgICAg
IC8vIG5vZGUgaXMgZGV0YWNoZWQsIGluIHdoaWNoIGNhc2Ugd2UgdGhlIHBvcHVwIHNob3VkIG5v
dCBiZQotICAgICAgICAvLyBzaG93aW5nLiAgUGxlYXNlIHJlcG9ydCB0aGlzIGluIGh0dHA6Ly9j
cmJ1Zy5jb20vNzcwOCBhbmQKLSAgICAgICAgLy8gaW5jbHVkZSB0aGUgcGFnZSB5b3Ugd2VyZSB2
aXNpdGluZy4KLSAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Ci0gICAgfQotICAgIHJldHVy
biBzdHlsZTsKKyAgICAvLyBUcnkgdG8gcHJlc2VydmUgc2VsZWN0aW9uIGlmIHBvc3NpYmxlLgor
ICAgIGlmIChnZXRTZWxlY3RlZEluZGV4KCkgPj0gc3RhdGljX2Nhc3Q8aW50PihzdWdnZXN0aW9u
cy5zaXplKCkpKQorICAgICAgICBzZXRTZWxlY3RlZEluZGV4KC0xKTsKIH0KIAogfSAvLyBuYW1l
c3BhY2UgV2ViS2l0CkluZGV4OiBXZWJLaXQvY2hyb21pdW0vc3JjL0F1dG9jb21wbGV0ZVBvcHVw
TWVudUNsaWVudC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdC9jaHJvbWl1bS9zcmMvQXV0b2NvbXBs
ZXRlUG9wdXBNZW51Q2xpZW50LmgJKHJldmlzaW9uIDU0NTAxKQorKysgV2ViS2l0L2Nocm9taXVt
L3NyYy9BdXRvY29tcGxldGVQb3B1cE1lbnVDbGllbnQuaAkod29ya2luZyBjb3B5KQpAQCAtMSw1
ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgR29vZ2xlIEluYy4gQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRz
IHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBi
aW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0
dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQpAQCAtMjgsNyAr
MjgsMTAgQEAKICAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9T
U0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCiAgKi8KIAotI2luY2x1ZGUgIlBvcHVwTWVudUNsaWVu
dC5oIgorI2lmbmRlZiBBdXRvY29tcGxldGVQb3B1cE1lbnVDbGllbnRfaAorI2RlZmluZSBBdXRv
Y29tcGxldGVQb3B1cE1lbnVDbGllbnRfaAorIAorI2luY2x1ZGUgIlN1Z2dlc3Rpb25zUG9wdXBN
ZW51Q2xpZW50LmgiCiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIGNsYXNzIEhUTUxJbnB1dEVsZW1l
bnQ7CkBAIC00Miw1NSArNDUsMjMgQEAgY2xhc3MgV2ViVmlld0ltcGw7CiB0ZW1wbGF0ZSA8dHlw
ZW5hbWUgVD4gY2xhc3MgV2ViVmVjdG9yOwogCiAvLyBBdXRvY29tcGxldGVQb3B1cE1lbnVDbGll
bnQKLWNsYXNzIEF1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVudCA6IHB1YmxpYyBXZWJDb3JlOjpQ
b3B1cE1lbnVDbGllbnQgeworY2xhc3MgQXV0b2NvbXBsZXRlUG9wdXBNZW51Q2xpZW50IDogcHVi
bGljIFN1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50IHsKIHB1YmxpYzoKLSAgICBBdXRvY29tcGxl
dGVQb3B1cE1lbnVDbGllbnQoV2ViVmlld0ltcGwqIHdlYnZpZXcpOwotICAgIH5BdXRvY29tcGxl
dGVQb3B1cE1lbnVDbGllbnQoKTsKKyAgICAvLyBTdWdnZXN0aW9uc1BvcHVwTWVudUNsaWVudCBp
bXBsZW1lbnRhdGlvbjoKKyAgICB2aXJ0dWFsIHVuc2lnbmVkIGdldFN1Z2dlc3Rpb25zQ291bnQo
KSBjb25zdDsKKyAgICB2aXJ0dWFsIFdlYlN0cmluZyBnZXRTdWdnZXN0aW9uKHVuc2lnbmVkIGxp
c3RJbmRleCkgY29uc3Q7CisgICAgdmlydHVhbCB2b2lkIHJlbW92ZVN1Z2dlc3Rpb25BdEluZGV4
KHVuc2lnbmVkIGxpc3RJbmRleCk7CiAKICAgICB2b2lkIGluaXRpYWxpemUoV2ViQ29yZTo6SFRN
TElucHV0RWxlbWVudCosCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdlYlZlY3RvcjxXZWJT
dHJpbmc+JiBzdWdnZXN0aW9ucywKICAgICAgICAgICAgICAgICAgICAgaW50IGRlZmF1bHRTdWdn
ZXN0aW9uSW5kZXgpOwogCi0gICAgV2ViQ29yZTo6SFRNTElucHV0RWxlbWVudCogdGV4dEZpZWxk
KCkgY29uc3QgeyByZXR1cm4gbV90ZXh0RmllbGQuZ2V0KCk7IH0KLQogICAgIHZvaWQgc2V0U3Vn
Z2VzdGlvbnMoY29uc3QgV2ViVmVjdG9yPFdlYlN0cmluZz4mKTsKLSAgICB2b2lkIHJlbW92ZUl0
ZW1BdEluZGV4KGludCBpbmRleCk7Ci0KLSAgICAvLyBXZWJDb3JlOjpQb3B1cE1lbnVDbGllbnQg
bWV0aG9kczoKLSAgICB2aXJ0dWFsIHZvaWQgdmFsdWVDaGFuZ2VkKHVuc2lnbmVkIGxpc3RJbmRl
eCwgYm9vbCBmaXJlRXZlbnRzID0gdHJ1ZSk7Ci0gICAgdmlydHVhbCBXZWJDb3JlOjpTdHJpbmcg
aXRlbVRleHQodW5zaWduZWQgbGlzdEluZGV4KSBjb25zdDsKLSAgICB2aXJ0dWFsIFdlYkNvcmU6
OlN0cmluZyBpdGVtVG9vbFRpcCh1bnNpZ25lZCBsYXN0SW5kZXgpIGNvbnN0IHsgcmV0dXJuIFdl
YkNvcmU6OlN0cmluZygpOyB9Ci0gICAgdmlydHVhbCBib29sIGl0ZW1Jc0VuYWJsZWQodW5zaWdu
ZWQgbGlzdEluZGV4KSBjb25zdCB7IHJldHVybiB0cnVlOyB9Ci0gICAgdmlydHVhbCBXZWJDb3Jl
OjpQb3B1cE1lbnVTdHlsZSBpdGVtU3R5bGUodW5zaWduZWQgbGlzdEluZGV4KSBjb25zdDsKLSAg
ICB2aXJ0dWFsIFdlYkNvcmU6OlBvcHVwTWVudVN0eWxlIG1lbnVTdHlsZSgpIGNvbnN0OwotICAg
IHZpcnR1YWwgaW50IGNsaWVudEluc2V0TGVmdCgpIGNvbnN0IHsgcmV0dXJuIDA7IH0KLSAgICB2
aXJ0dWFsIGludCBjbGllbnRJbnNldFJpZ2h0KCkgY29uc3QgeyByZXR1cm4gMDsgfQotICAgIHZp
cnR1YWwgaW50IGNsaWVudFBhZGRpbmdMZWZ0KCkgY29uc3Q7Ci0gICAgdmlydHVhbCBpbnQgY2xp
ZW50UGFkZGluZ1JpZ2h0KCkgY29uc3Q7Ci0gICAgdmlydHVhbCBpbnQgbGlzdFNpemUoKSBjb25z
dCB7IHJldHVybiBtX3N1Z2dlc3Rpb25zLnNpemUoKTsgfQotICAgIHZpcnR1YWwgaW50IHNlbGVj
dGVkSW5kZXgoKSBjb25zdCB7IHJldHVybiBtX3NlbGVjdGVkSW5kZXg7IH0KLSAgICB2aXJ0dWFs
IHZvaWQgcG9wdXBEaWRIaWRlKCk7Ci0gICAgdmlydHVhbCBib29sIGl0ZW1Jc1NlcGFyYXRvcih1
bnNpZ25lZCBsaXN0SW5kZXgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0gICAgdmlydHVhbCBi
b29sIGl0ZW1Jc0xhYmVsKHVuc2lnbmVkIGxpc3RJbmRleCkgY29uc3QgeyByZXR1cm4gZmFsc2U7
IH0KLSAgICB2aXJ0dWFsIGJvb2wgaXRlbUlzU2VsZWN0ZWQodW5zaWduZWQgbGlzdEluZGV4KSBj
b25zdCB7IHJldHVybiBmYWxzZTsgfQotICAgIHZpcnR1YWwgYm9vbCBzaG91bGRQb3BPdmVyKCkg
Y29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLSAgICB2aXJ0dWFsIGJvb2wgdmFsdWVTaG91bGRDaGFu
Z2VPbkhvdFRyYWNrKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLSAgICB2aXJ0dWFsIHZvaWQg
c2V0VGV4dEZyb21JdGVtKHVuc2lnbmVkIGxpc3RJbmRleCk7Ci0gICAgdmlydHVhbCBXZWJDb3Jl
OjpGb250U2VsZWN0b3IqIGZvbnRTZWxlY3RvcigpIGNvbnN0OwotICAgIHZpcnR1YWwgV2ViQ29y
ZTo6SG9zdFdpbmRvdyogaG9zdFdpbmRvdygpIGNvbnN0OwotICAgIHZpcnR1YWwgUGFzc1JlZlB0
cjxXZWJDb3JlOjpTY3JvbGxiYXI+IGNyZWF0ZVNjcm9sbGJhcigKLSAgICAgICAgV2ViQ29yZTo6
U2Nyb2xsYmFyQ2xpZW50KiBjbGllbnQsCi0gICAgICAgIFdlYkNvcmU6OlNjcm9sbGJhck9yaWVu
dGF0aW9uIG9yaWVudGF0aW9uLAotICAgICAgICBXZWJDb3JlOjpTY3JvbGxiYXJDb250cm9sU2l6
ZSBzaXplKTsKIAogcHJpdmF0ZToKLSAgICBXZWJDb3JlOjpSZW5kZXJTdHlsZSogdGV4dEZpZWxk
U3R5bGUoKSBjb25zdDsKLQotICAgIFJlZlB0cjxXZWJDb3JlOjpIVE1MSW5wdXRFbGVtZW50PiBt
X3RleHRGaWVsZDsKICAgICBWZWN0b3I8V2ViQ29yZTo6U3RyaW5nPiBtX3N1Z2dlc3Rpb25zOwot
ICAgIGludCBtX3NlbGVjdGVkSW5kZXg7Ci0gICAgV2ViVmlld0ltcGwqIG1fd2ViVmlldzsKLSAg
ICBPd25QdHI8V2ViQ29yZTo6UG9wdXBNZW51U3R5bGU+IG1fc3R5bGU7CiB9OwogCiB9IC8vIG5h
bWVzcGFjZSBXZWJLaXQKKworI2VuZGlmCkluZGV4OiBXZWJLaXQvY2hyb21pdW0vc3JjL1N1Z2dl
c3Rpb25zUG9wdXBNZW51Q2xpZW50LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQvY2hyb21pdW0v
c3JjL1N1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50LmNwcAkocmV2aXNpb24gMCkKKysrIFdlYktp
dC9jaHJvbWl1bS9zcmMvU3VnZ2VzdGlvbnNQb3B1cE1lbnVDbGllbnQuY3BwCShyZXZpc2lvbiAw
KQpAQCAtMCwwICsxLDI0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5j
LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g
c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9u
LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFy
ZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBt
dXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5
cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
IHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRo
ZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRv
cnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJv
bQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlz
c2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQg
SE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJ
TVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhF
IElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisg
KiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwg
VEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5Z
IERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9S
IENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRP
LCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVT
RSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZF
UiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBD
T05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdF
TkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBP
RiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNV
Q0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJTdWdnZXN0
aW9uc1BvcHVwTWVudUNsaWVudC5oIgorCisvLyBGSVhNRTogTWFrZSBzdXJlIHdlIG5lZWQgYWxs
IG9mIHRoZXNlIGluY2x1ZGVzLgorI2luY2x1ZGUgIkNocm9tZS5oIgorI2luY2x1ZGUgIkNTU1N0
eWxlU2VsZWN0b3IuaCIKKyNpbmNsdWRlICJDU1NWYWx1ZUtleXdvcmRzLmgiCisjaW5jbHVkZSAi
RnJhbWVWaWV3LmgiCisjaW5jbHVkZSAiSFRNTElucHV0RWxlbWVudC5oIgorI2luY2x1ZGUgIlJl
bmRlclRoZW1lLmgiCisjaW5jbHVkZSAiV2ViVmVjdG9yLmgiCisjaW5jbHVkZSAiV2ViVmlld0lt
cGwuaCIKKwordXNpbmcgbmFtZXNwYWNlIFdlYkNvcmU7CisKK25hbWVzcGFjZSBXZWJLaXQgewor
CitTdWdnZXN0aW9uc1BvcHVwTWVudUNsaWVudDo6U3VnZ2VzdGlvbnNQb3B1cE1lbnVDbGllbnQo
KQorICAgIDogbV90ZXh0RmllbGQoMCkKKyAgICAsIG1fc2VsZWN0ZWRJbmRleCgwKQoreworfQor
CitTdWdnZXN0aW9uc1BvcHVwTWVudUNsaWVudDo6flN1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50
KCkKK3sKK30KKworLy8gRklYTUU6IEltcGxlbWVudCB0aGlzIHBlci1kZXJpdmVkIGNsYXNzPwor
dm9pZCBTdWdnZXN0aW9uc1BvcHVwTWVudUNsaWVudDo6dmFsdWVDaGFuZ2VkKHVuc2lnbmVkIGxp
c3RJbmRleCwgYm9vbCBmaXJlRXZlbnRzKQoreworICAgIG1fdGV4dEZpZWxkLT5zZXRWYWx1ZShn
ZXRTdWdnZXN0aW9uKGxpc3RJbmRleCkpOworCisgICAgRWRpdG9yQ2xpZW50SW1wbCogZWRpdG9y
ID0KKyAgICAgICAgc3RhdGljX2Nhc3Q8RWRpdG9yQ2xpZW50SW1wbCo+KGdldFdlYlZpZXcoKS0+
cGFnZSgpLT5lZGl0b3JDbGllbnQoKSk7CisgICAgQVNTRVJUKGVkaXRvcik7CisgICAgZWRpdG9y
LT5vbkF1dG9maWxsU3VnZ2VzdGlvbkFjY2VwdGVkKAorICAgICAgICBzdGF0aWNfY2FzdDxIVE1M
SW5wdXRFbGVtZW50Kj4obV90ZXh0RmllbGQuZ2V0KCkpKTsKK30KKwordm9pZCBTdWdnZXN0aW9u
c1BvcHVwTWVudUNsaWVudDo6c2VsZWN0aW9uQ2hhbmdlZCh1bnNpZ25lZCBsaXN0SW5kZXgsIGJv
b2wgZmlyZUV2ZW50cykKK3sKKyAgICBpZiAobGlzdEluZGV4ICE9IHN0YXRpY19jYXN0PHVuc2ln
bmVkPigtMSkpIHsKKyAgICAgICAgY29uc3QgV2ViU3RyaW5nJiBzdWdnZXN0aW9uID0gZ2V0U3Vn
Z2VzdGlvbihsaXN0SW5kZXgpOworICAgICAgICBzZXRTdWdnZXN0ZWRWYWx1ZShzdWdnZXN0aW9u
KTsKKyAgICB9IGVsc2UgeworICAgICAgbV90ZXh0RmllbGQtPnNldFZhbHVlKG1fdHlwZWRGaWVs
ZFZhbHVlKTsKKyAgICAgIGlmIChtX2xhc3RGaWVsZFZhbHVlcy0+Y29udGFpbnMobV90ZXh0Rmll
bGQtPm5hbWUoKSkpCisgICAgICAgICAgbV9sYXN0RmllbGRWYWx1ZXMtPnNldChtX3RleHRGaWVs
ZC0+bmFtZSgpLCBtX3R5cGVkRmllbGRWYWx1ZSk7CisgICAgICBlbHNlCisgICAgICAgICAgbV9s
YXN0RmllbGRWYWx1ZXMtPmFkZChtX3RleHRGaWVsZC0+bmFtZSgpLCBtX3R5cGVkRmllbGRWYWx1
ZSk7CisgICAgfQorfQorCitTdHJpbmcgU3VnZ2VzdGlvbnNQb3B1cE1lbnVDbGllbnQ6Oml0ZW1U
ZXh0KHVuc2lnbmVkIGxpc3RJbmRleCkgY29uc3QKK3sKKyAgICByZXR1cm4gZ2V0U3VnZ2VzdGlv
bihsaXN0SW5kZXgpOworfQorCitQb3B1cE1lbnVTdHlsZSBTdWdnZXN0aW9uc1BvcHVwTWVudUNs
aWVudDo6aXRlbVN0eWxlKHVuc2lnbmVkIGxpc3RJbmRleCkgY29uc3QKK3sKKyAgICByZXR1cm4g
Km1fc3R5bGU7Cit9CisKK1BvcHVwTWVudVN0eWxlIFN1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50
OjptZW51U3R5bGUoKSBjb25zdAoreworICAgIHJldHVybiAqbV9zdHlsZTsKK30KKworaW50IFN1
Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50OjpjbGllbnRQYWRkaW5nTGVmdCgpIGNvbnN0Cit7Cisg
ICAgLy8gQnVnIGh0dHA6Ly9jcmJ1Zy5jb20vNzcwOCBzZWVtcyB0byBpbmRpY2F0ZSB0aGUgc3R5
bGUgY2FuIGJlIDAuCisgICAgUmVuZGVyU3R5bGUqIHN0eWxlID0gdGV4dEZpZWxkU3R5bGUoKTsK
KyAgICBpZiAoIXN0eWxlKQorICAgICAgIHJldHVybiAwOworCisgICAgcmV0dXJuIGdldFdlYlZp
ZXcoKS0+dGhlbWUoKS0+cG9wdXBJbnRlcm5hbFBhZGRpbmdMZWZ0KHN0eWxlKTsKK30KKworaW50
IFN1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50OjpjbGllbnRQYWRkaW5nUmlnaHQoKSBjb25zdAor
eworICAgIC8vIEJ1ZyBodHRwOi8vY3JidWcuY29tLzc3MDggc2VlbXMgdG8gaW5kaWNhdGUgdGhl
IHN0eWxlIGNhbiBiZSAwLgorICAgIFJlbmRlclN0eWxlKiBzdHlsZSA9IHRleHRGaWVsZFN0eWxl
KCk7CisgICAgaWYgKCFzdHlsZSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICByZXR1cm4gZ2V0
V2ViVmlldygpLT50aGVtZSgpLT5wb3B1cEludGVybmFsUGFkZGluZ1JpZ2h0KHN0eWxlKTsKK30K
Kwordm9pZCBTdWdnZXN0aW9uc1BvcHVwTWVudUNsaWVudDo6cG9wdXBEaWRIaWRlKCkKK3sKKyAg
ICBtX3RleHRGaWVsZC0+c2V0VmFsdWUobV90eXBlZEZpZWxkVmFsdWUpOworICAgIHJlc2V0TGFz
dFN1Z2dlc3Rpb24oKTsKKyAgICBnZXRXZWJWaWV3KCktPnN1Z2dlc3Rpb25zUG9wdXBEaWRIaWRl
KCk7Cit9CisKK3ZvaWQgU3VnZ2VzdGlvbnNQb3B1cE1lbnVDbGllbnQ6OnNldFRleHRGcm9tSXRl
bSh1bnNpZ25lZCBsaXN0SW5kZXgpCit7CisgICAgbV90ZXh0RmllbGQtPnNldFZhbHVlKGdldFN1
Z2dlc3Rpb24obGlzdEluZGV4KSk7CisgICAgcmVzZXRMYXN0U3VnZ2VzdGlvbigpOworfQorCit2
b2lkIFN1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50OjpyZXNldExhc3RTdWdnZXN0aW9uKCkKK3sK
KyAgICBpZiAobV9sYXN0RmllbGRWYWx1ZXMtPmNvbnRhaW5zKG1fdGV4dEZpZWxkLT5uYW1lKCkp
KQorICAgICAgICBtX2xhc3RGaWVsZFZhbHVlcy0+c2V0KG1fdGV4dEZpZWxkLT5uYW1lKCksIG1f
dGV4dEZpZWxkLT52YWx1ZSgpKTsKKyAgICBlbHNlCisgICAgICAgIG1fbGFzdEZpZWxkVmFsdWVz
LT5hZGQobV90ZXh0RmllbGQtPm5hbWUoKSwgbV90ZXh0RmllbGQtPnZhbHVlKCkpOworfQorCitG
b250U2VsZWN0b3IqIFN1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50Ojpmb250U2VsZWN0b3IoKSBj
b25zdAoreworICAgIHJldHVybiBtX3RleHRGaWVsZC0+ZG9jdW1lbnQoKS0+c3R5bGVTZWxlY3Rv
cigpLT5mb250U2VsZWN0b3IoKTsKK30KKworSG9zdFdpbmRvdyogU3VnZ2VzdGlvbnNQb3B1cE1l
bnVDbGllbnQ6Omhvc3RXaW5kb3coKSBjb25zdAoreworICAgIHJldHVybiBtX3RleHRGaWVsZC0+
ZG9jdW1lbnQoKS0+dmlldygpLT5ob3N0V2luZG93KCk7Cit9CisKK1Bhc3NSZWZQdHI8U2Nyb2xs
YmFyPiBTdWdnZXN0aW9uc1BvcHVwTWVudUNsaWVudDo6Y3JlYXRlU2Nyb2xsYmFyKAorICAgIFNj
cm9sbGJhckNsaWVudCogY2xpZW50LAorICAgIFNjcm9sbGJhck9yaWVudGF0aW9uIG9yaWVudGF0
aW9uLAorICAgIFNjcm9sbGJhckNvbnRyb2xTaXplIHNpemUpCit7CisgICAgcmV0dXJuIFNjcm9s
bGJhcjo6Y3JlYXRlTmF0aXZlU2Nyb2xsYmFyKGNsaWVudCwgb3JpZW50YXRpb24sIHNpemUpOwor
fQorCitSZW5kZXJTdHlsZSogU3VnZ2VzdGlvbnNQb3B1cE1lbnVDbGllbnQ6OnRleHRGaWVsZFN0
eWxlKCkgY29uc3QKK3sKKyAgICBSZW5kZXJTdHlsZSogc3R5bGUgPSBtX3RleHRGaWVsZC0+Y29t
cHV0ZWRTdHlsZSgpOworICAgIGlmICghc3R5bGUpIHsKKyAgICAgICAgLy8gSXQgc2VlbXMgd2Ug
Y2FuIG9ubHkgaGF2ZSBhIDAgc3R5bGUgaW4gYSBUZXh0RmllbGQgaWYgdGhlCisgICAgICAgIC8v
IG5vZGUgaXMgZGV0YWNoZWQsIGluIHdoaWNoIGNhc2Ugd2UgdGhlIHBvcHVwIHNob3VkIG5vdCBi
ZQorICAgICAgICAvLyBzaG93aW5nLiAgUGxlYXNlIHJlcG9ydCB0aGlzIGluIGh0dHA6Ly9jcmJ1
Zy5jb20vNzcwOCBhbmQKKyAgICAgICAgLy8gaW5jbHVkZSB0aGUgcGFnZSB5b3Ugd2VyZSB2aXNp
dGluZy4KKyAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgfQorICAgIHJldHVybiBz
dHlsZTsKK30KKwordm9pZCBTdWdnZXN0aW9uc1BvcHVwTWVudUNsaWVudDo6aW5pdGlhbGl6ZShI
VE1MSW5wdXRFbGVtZW50KiB0ZXh0RmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGludCBkZWZhdWx0U3VnZ2VzdGlvbkluZGV4KQoreworICAgIGlmICgh
bV9sYXN0RmllbGRWYWx1ZXMpCisgICAgICAgIG1fbGFzdEZpZWxkVmFsdWVzLnNldChuZXcgRmll
bGRWYWx1ZXNNYXApOworCisgICAgbV90ZXh0RmllbGQgPSB0ZXh0RmllbGQ7CisgICAgbV90eXBl
ZEZpZWxkVmFsdWUgPSB0ZXh0RmllbGQtPnZhbHVlKCk7CisgICAgbV9zZWxlY3RlZEluZGV4ID0g
ZGVmYXVsdFN1Z2dlc3Rpb25JbmRleDsKKworICAgIHNldEluaXRpYWxTdWdnZXN0aW9uKCk7CisK
KyAgICBGb250RGVzY3JpcHRpb24gZm9udERlc2NyaXB0aW9uOworICAgIGdldFdlYlZpZXcoKS0+
dGhlbWUoKS0+c3lzdGVtRm9udChDU1NWYWx1ZVdlYmtpdENvbnRyb2wsIGZvbnREZXNjcmlwdGlv
bik7CisgICAgLy8gVXNlIGEgc21hbGxlciBmb250IHNpemUgdG8gbWF0Y2ggSUUvRmlyZWZveC4K
KyAgICAvLyBGSVhNRTogaHR0cDovL2NyYnVnLmNvbS83Mzc2IHVzZSB0aGUgc3lzdGVtIHNpemUg
aW5zdGVhZCBvZiBhCisgICAgLy8gICAgICAgIGZpeGVkIGZvbnQgc2l6ZSB2YWx1ZS4KKyAgICBm
b250RGVzY3JpcHRpb24uc2V0Q29tcHV0ZWRTaXplKDEyLjApOworICAgIEZvbnQgZm9udChmb250
RGVzY3JpcHRpb24sIDAsIDApOworICAgIGZvbnQudXBkYXRlKHRleHRGaWVsZC0+ZG9jdW1lbnQo
KS0+c3R5bGVTZWxlY3RvcigpLT5mb250U2VsZWN0b3IoKSk7CisgICAgLy8gVGhlIGRpcmVjdGlv
biBvZiB0ZXh0IGluIHBvcHVwIG1lbnUgaXMgc2V0IHRoZSBzYW1lIGFzIHRoZSBkaXJlY3Rpb24g
b2YKKyAgICAvLyB0aGUgaW5wdXQgZWxlbWVudDogdGV4dEZpZWxkLgorICAgIG1fc3R5bGUuc2V0
KG5ldyBQb3B1cE1lbnVTdHlsZShDb2xvcjo6YmxhY2ssIENvbG9yOjp3aGl0ZSwgZm9udCwgdHJ1
ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGVuZ3RoKFdlYkNvcmU6OkZp
eGVkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dEZpZWxkLT5yZW5k
ZXJlcigpLT5zdHlsZSgpLT5kaXJlY3Rpb24oKSkpOworfQorCit2b2lkIFN1Z2dlc3Rpb25zUG9w
dXBNZW51Q2xpZW50OjpzZXRJbml0aWFsU3VnZ2VzdGlvbigpCit7CisgICAgaWYgKCFnZXRTdWdn
ZXN0aW9uc0NvdW50KCkgfHwgIW1fdGV4dEZpZWxkLT5uYW1lKCkubGVuZ3RoKCkgfHwgIW1fdHlw
ZWRGaWVsZFZhbHVlLmxlbmd0aCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBpbnQgbmV3SW5k
ZXggPSBtX3NlbGVjdGVkSW5kZXggPj0gMCA/IG1fc2VsZWN0ZWRJbmRleCA6IDA7CisgICAgY29u
c3QgU3RyaW5nJiBzdWdnZXN0aW9uID0gZ2V0U3VnZ2VzdGlvbihuZXdJbmRleCk7CisgICAgYm9v
bCBoYXNQcmV2aW91c1ZhbHVlID0gbV9sYXN0RmllbGRWYWx1ZXMtPmNvbnRhaW5zKG1fdGV4dEZp
ZWxkLT5uYW1lKCkpOworCisgICAgU3RyaW5nIHByZXZWYWx1ZTsKKyAgICBpZiAoaGFzUHJldmlv
dXNWYWx1ZSkKKyAgICAgICAgcHJldlZhbHVlID0gbV9sYXN0RmllbGRWYWx1ZXMtPmdldChtX3Rl
eHRGaWVsZC0+bmFtZSgpKTsKKworICAgIGlmICghaGFzUHJldmlvdXNWYWx1ZSB8fCBtX3R5cGVk
RmllbGRWYWx1ZS5sZW5ndGgoKSA+IG1fbGFzdEZpZWxkVmFsdWVzLT5nZXQobV90ZXh0RmllbGQt
Pm5hbWUoKSkubGVuZ3RoKCkpIHsKKyAgICAgICAgICBpZiAoc3VnZ2VzdGlvbi5zdGFydHNXaXRo
KG1fdHlwZWRGaWVsZFZhbHVlKSkKKyAgICAgICAgICAgICAgbV9zZWxlY3RlZEluZGV4ID0gbmV3
SW5kZXg7CisKKyAgICAgICAgICBpbnQgc3RhcnQgPSAwOworICAgICAgICAgIFN0cmluZyBuZXdT
dWdnZXN0aW9uID0gc3VnZ2VzdGlvbjsKKyAgICAgICAgICBpZiAoc3VnZ2VzdGlvbi5zdGFydHNX
aXRoKG1fdHlwZWRGaWVsZFZhbHVlLCBmYWxzZSkpIHsKKyAgICAgICAgICAgICAgbmV3U3VnZ2Vz
dGlvbiA9IG1fdHlwZWRGaWVsZFZhbHVlOworICAgICAgICAgICAgICBpZiAoc3VnZ2VzdGlvbi5s
ZW5ndGgoKSA+IG1fdHlwZWRGaWVsZFZhbHVlLmxlbmd0aCgpKSB7CisgICAgICAgICAgICAgICAg
ICBuZXdTdWdnZXN0aW9uLmFwcGVuZChzdWdnZXN0aW9uLnN1YnN0cmluZyhtX3R5cGVkRmllbGRW
YWx1ZS5sZW5ndGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICBzdWdnZXN0aW9uLmxlbmd0aCgp
IC0gbV90eXBlZEZpZWxkVmFsdWUubGVuZ3RoKCkpKTsKKyAgICAgICAgICAgICAgfQorICAgICAg
ICAgICAgICBzdGFydCA9IG1fdHlwZWRGaWVsZFZhbHVlLmxlbmd0aCgpOworICAgICAgICAgIH0K
KworICAgICAgICAgIG1fdGV4dEZpZWxkLT5zZXRTdWdnZXN0ZWRWYWx1ZShuZXdTdWdnZXN0aW9u
KTsKKyAgICAgICAgICBtX3RleHRGaWVsZC0+c2V0U2VsZWN0aW9uUmFuZ2Uoc3RhcnQsIG5ld1N1
Z2dlc3Rpb24ubGVuZ3RoKCkpOworICAgIH0KKworICAgIGlmIChoYXNQcmV2aW91c1ZhbHVlKQor
ICAgICAgICBtX2xhc3RGaWVsZFZhbHVlcy0+c2V0KG1fdGV4dEZpZWxkLT5uYW1lKCksIG1fdHlw
ZWRGaWVsZFZhbHVlKTsKKyAgICBlbHNlCisgICAgICAgIG1fbGFzdEZpZWxkVmFsdWVzLT5hZGQo
bV90ZXh0RmllbGQtPm5hbWUoKSwgbV90eXBlZEZpZWxkVmFsdWUpOworfQorCit2b2lkIFN1Z2dl
c3Rpb25zUG9wdXBNZW51Q2xpZW50OjpzZXRTdWdnZXN0ZWRWYWx1ZShjb25zdCBXZWJTdHJpbmcm
IHN1Z2dlc3Rpb24pCit7CisgICAgbV90ZXh0RmllbGQtPnNldFN1Z2dlc3RlZFZhbHVlKHN1Z2dl
c3Rpb24pOworICAgIG1fdGV4dEZpZWxkLT5zZXRTZWxlY3Rpb25SYW5nZShtX3R5cGVkRmllbGRW
YWx1ZS5sZW5ndGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VnZ2Vz
dGlvbi5sZW5ndGgoKSk7Cit9CisKK1dlYlZpZXdJbXBsKiBTdWdnZXN0aW9uc1BvcHVwTWVudUNs
aWVudDo6Z2V0V2ViVmlldygpIGNvbnN0Cit7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PENocm9t
ZUNsaWVudEltcGwqPigKKyAgICAgICAgbV90ZXh0RmllbGQtPmRvY3VtZW50KCktPmZyYW1lKCkt
PnBhZ2UoKS0+Y2hyb21lKCktPmNsaWVudCgpKS0+d2ViVmlldygpOworfQorCit9IC8vIG5hbWVz
cGFjZSBXZWJLaXQKSW5kZXg6IFdlYktpdC9jaHJvbWl1bS9zcmMvU3VnZ2VzdGlvbnNQb3B1cE1l
bnVDbGllbnQuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQvY2hyb21pdW0vc3JjL1N1Z2dlc3Rpb25z
UG9wdXBNZW51Q2xpZW50LmgJKHJldmlzaW9uIDApCisrKyBXZWJLaXQvY2hyb21pdW0vc3JjL1N1
Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50LmgJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMTE4IEBA
CisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICog
ICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkg
Zm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRo
ZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUK
KyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIElu
Yy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBl
bmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJl
IHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMg
U09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklC
VVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywg
SU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVT
IE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQ
T1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBP
V05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwg
SU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1B
R0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNV
QlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJP
RklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5Z
CisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElB
QklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBB
UklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVW
RU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKwor
I2luY2x1ZGUgIlBvcHVwTWVudUNsaWVudC5oIgorCisjaWZuZGVmIFN1Z2dlc3Rpb25zUG9wdXBN
ZW51Q2xpZW50X2gKKyNkZWZpbmUgU3VnZ2VzdGlvbnNQb3B1cE1lbnVDbGllbnRfaAorCituYW1l
c3BhY2UgV2ViQ29yZSB7CitjbGFzcyBIVE1MSW5wdXRFbGVtZW50OworY2xhc3MgUG9wdXBNZW51
U3R5bGU7CitjbGFzcyBSZW5kZXJTdHlsZTsKK30KKworbmFtZXNwYWNlIFdlYktpdCB7CitjbGFz
cyBXZWJTdHJpbmc7CitjbGFzcyBXZWJWaWV3SW1wbDsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBj
bGFzcyBXZWJWZWN0b3I7CisKKy8vIAorY2xhc3MgU3VnZ2VzdGlvbnNQb3B1cE1lbnVDbGllbnQg
OiBwdWJsaWMgV2ViQ29yZTo6UG9wdXBNZW51Q2xpZW50IHsKK3B1YmxpYzoKKyAgICBTdWdnZXN0
aW9uc1BvcHVwTWVudUNsaWVudCgpOworICAgIHZpcnR1YWwgflN1Z2dlc3Rpb25zUG9wdXBNZW51
Q2xpZW50KCk7CisKKyAgICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2Ygc3VnZ2VzdGlvbnMgYXZh
aWxhYmxlLgorICAgIHZpcnR1YWwgdW5zaWduZWQgZ2V0U3VnZ2VzdGlvbnNDb3VudCgpIGNvbnN0
ID0gMDsKKworICAgIC8vIFJldHVybnMgdGhlIHN1Z2dlc3Rpb24gYXQgfGxpc3RJbmRleHwuCisg
ICAgdmlydHVhbCBXZWJTdHJpbmcgZ2V0U3VnZ2VzdGlvbih1bnNpZ25lZCBsaXN0SW5kZXgpIGNv
bnN0ID0gMDsKKworICAgIC8vIFJlbW92ZXMgdGhlIHN1Z2dlc3Rpb24gYXQgfGxpc3RJbmRleHwg
ZnJvbSB0aGUgbGlzdCBvZiBzdWdnZXN0aW9ucy4KKyAgICB2aXJ0dWFsIHZvaWQgcmVtb3ZlU3Vn
Z2VzdGlvbkF0SW5kZXgodW5zaWduZWQgbGlzdEluZGV4KSA9IDA7CisKKyAgICAvLyBXZWJDb3Jl
OjpQb3B1cE1lbnVDbGllbnQgbWV0aG9kczoKKyAgICB2aXJ0dWFsIHZvaWQgdmFsdWVDaGFuZ2Vk
KHVuc2lnbmVkIGxpc3RJbmRleCwgYm9vbCBmaXJlRXZlbnRzID0gdHJ1ZSk7CisgICAgdmlydHVh
bCB2b2lkIHNlbGVjdGlvbkNoYW5nZWQodW5zaWduZWQgbGlzdEluZGV4LCBib29sIGZpcmVFdmVu
dHMgPSB0cnVlKTsKKyAgICB2aXJ0dWFsIFdlYkNvcmU6OlN0cmluZyBpdGVtVGV4dCh1bnNpZ25l
ZCBsaXN0SW5kZXgpIGNvbnN0OworICAgIHZpcnR1YWwgV2ViQ29yZTo6U3RyaW5nIGl0ZW1Ub29s
VGlwKHVuc2lnbmVkIGxhc3RJbmRleCkgY29uc3QgeyByZXR1cm4gV2ViQ29yZTo6U3RyaW5nKCk7
IH0KKyAgICB2aXJ0dWFsIGJvb2wgaXRlbUlzRW5hYmxlZCh1bnNpZ25lZCBsaXN0SW5kZXgpIGNv
bnN0IHsgcmV0dXJuIHRydWU7IH0KKyAgICB2aXJ0dWFsIFdlYkNvcmU6OlBvcHVwTWVudVN0eWxl
IGl0ZW1TdHlsZSh1bnNpZ25lZCBsaXN0SW5kZXgpIGNvbnN0OworICAgIHZpcnR1YWwgV2ViQ29y
ZTo6UG9wdXBNZW51U3R5bGUgbWVudVN0eWxlKCkgY29uc3Q7CisgICAgdmlydHVhbCBpbnQgY2xp
ZW50SW5zZXRMZWZ0KCkgY29uc3QgeyByZXR1cm4gMDsgfQorICAgIHZpcnR1YWwgaW50IGNsaWVu
dEluc2V0UmlnaHQoKSBjb25zdCB7IHJldHVybiAwOyB9CisgICAgdmlydHVhbCBpbnQgY2xpZW50
UGFkZGluZ0xlZnQoKSBjb25zdDsKKyAgICB2aXJ0dWFsIGludCBjbGllbnRQYWRkaW5nUmlnaHQo
KSBjb25zdDsKKyAgICB2aXJ0dWFsIGludCBsaXN0U2l6ZSgpIGNvbnN0IHsgcmV0dXJuIGdldFN1
Z2dlc3Rpb25zQ291bnQoKTsgfQorICAgIHZpcnR1YWwgaW50IHNlbGVjdGVkSW5kZXgoKSBjb25z
dCB7IHJldHVybiBtX3NlbGVjdGVkSW5kZXg7IH0KKyAgICB2aXJ0dWFsIHZvaWQgcG9wdXBEaWRI
aWRlKCk7CisgICAgdmlydHVhbCBib29sIGl0ZW1Jc1NlcGFyYXRvcih1bnNpZ25lZCBsaXN0SW5k
ZXgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgICAgdmlydHVhbCBib29sIGl0ZW1Jc0xhYmVs
KHVuc2lnbmVkIGxpc3RJbmRleCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgICB2aXJ0dWFs
IGJvb2wgaXRlbUlzU2VsZWN0ZWQodW5zaWduZWQgbGlzdEluZGV4KSBjb25zdCB7IHJldHVybiBm
YWxzZTsgfQorICAgIHZpcnR1YWwgYm9vbCBzaG91bGRQb3BPdmVyKCkgY29uc3QgeyByZXR1cm4g
ZmFsc2U7IH0KKyAgICB2aXJ0dWFsIGJvb2wgdmFsdWVTaG91bGRDaGFuZ2VPbkhvdFRyYWNrKCkg
Y29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgICB2aXJ0dWFsIHZvaWQgc2V0VGV4dEZyb21JdGVt
KHVuc2lnbmVkIGxpc3RJbmRleCk7CisgICAgdmlydHVhbCBXZWJDb3JlOjpGb250U2VsZWN0b3Iq
IGZvbnRTZWxlY3RvcigpIGNvbnN0OworICAgIHZpcnR1YWwgV2ViQ29yZTo6SG9zdFdpbmRvdyog
aG9zdFdpbmRvdygpIGNvbnN0OworICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxXZWJDb3JlOjpTY3Jv
bGxiYXI+IGNyZWF0ZVNjcm9sbGJhcigKKyAgICAgICAgV2ViQ29yZTo6U2Nyb2xsYmFyQ2xpZW50
KiBjbGllbnQsCisgICAgICAgIFdlYkNvcmU6OlNjcm9sbGJhck9yaWVudGF0aW9uIG9yaWVudGF0
aW9uLAorICAgICAgICBXZWJDb3JlOjpTY3JvbGxiYXJDb250cm9sU2l6ZSBzaXplKTsKKworcHJv
dGVjdGVkOgorICAgIHZvaWQgaW5pdGlhbGl6ZShXZWJDb3JlOjpIVE1MSW5wdXRFbGVtZW50KiB0
ZXh0RmllbGQsCisgICAgICAgICAgICAgICAgICAgIGludCBkZWZhdWx0U3VnZ2VzdGlvbkluZGV4
KTsKKyAgICB2b2lkIHNldEluaXRpYWxTdWdnZXN0aW9uKCk7CisKKyAgICBpbnQgZ2V0U2VsZWN0
ZWRJbmRleCgpIGNvbnN0IHsgcmV0dXJuIG1fc2VsZWN0ZWRJbmRleDsgfQorICAgIHZvaWQgc2V0
U2VsZWN0ZWRJbmRleChpbnQgaW5kZXgpIHsgbV9zZWxlY3RlZEluZGV4ID0gaW5kZXg7IH0KKwor
ICAgIHZvaWQgc2V0U3VnZ2VzdGVkVmFsdWUoY29uc3QgV2ViU3RyaW5nJiBzdWdnZXN0aW9uKTsK
KworICAgIFdlYlZpZXdJbXBsKiBnZXRXZWJWaWV3KCkgY29uc3Q7CisgICAgV2ViQ29yZTo6SFRN
TElucHV0RWxlbWVudCogZ2V0VGV4dEZpZWxkKCkgY29uc3QgeyByZXR1cm4gbV90ZXh0RmllbGQu
Z2V0KCk7IH0KKworcHJpdmF0ZToKKyAgICBXZWJDb3JlOjpSZW5kZXJTdHlsZSogdGV4dEZpZWxk
U3R5bGUoKSBjb25zdDsKKyAgICB2b2lkIHJlc2V0TGFzdFN1Z2dlc3Rpb24oKTsKKworICAgIFJl
ZlB0cjxXZWJDb3JlOjpIVE1MSW5wdXRFbGVtZW50PiBtX3RleHRGaWVsZDsKKyAgICBpbnQgbV9z
ZWxlY3RlZEluZGV4OworICAgIFdlYlZpZXdJbXBsKiBtX3dlYlZpZXc7CisgICAgV2ViQ29yZTo6
U3RyaW5nIG1fdHlwZWRGaWVsZFZhbHVlOworICAgIE93blB0cjxXZWJDb3JlOjpQb3B1cE1lbnVT
dHlsZT4gbV9zdHlsZTsKKyAgICB0eXBlZGVmIEhhc2hNYXA8V2ViQ29yZTo6U3RyaW5nLCBXZWJD
b3JlOjpTdHJpbmc+IEZpZWxkVmFsdWVzTWFwOworICAgIE93blB0cjxGaWVsZFZhbHVlc01hcD4g
bV9sYXN0RmllbGRWYWx1ZXM7Cit9OworCit9IC8vIG5hbWVzcGFjZSBXZWJLaXQKKworI2VuZGlm
CgpQcm9wZXJ0eSBjaGFuZ2VzIG9uOiBXZWJLaXQvY2hyb21pdW0vc3JjL1N1Z2dlc3Rpb25zUG9w
dXBNZW51Q2xpZW50LmgKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fXwpBZGRlZDogc3ZuOmVvbC1zdHlsZQogICArIExGCgpJ
bmRleDogV2ViS2l0L2Nocm9taXVtL3NyYy9XZWJWaWV3SW1wbC5jcHAKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
V2ViS2l0L2Nocm9taXVtL3NyYy9XZWJWaWV3SW1wbC5jcHAJKHJldmlzaW9uIDU0NTAxKQorKysg
V2ViS2l0L2Nocm9taXVtL3NyYy9XZWJWaWV3SW1wbC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTMx
LDYgKzMxLDcgQEAKICNpbmNsdWRlICJjb25maWcuaCIKICNpbmNsdWRlICJXZWJWaWV3SW1wbC5o
IgogCisjaW5jbHVkZSAiQXV0b0ZpbGxQb3B1cE1lbnVDbGllbnQuaCIKICNpbmNsdWRlICJBdXRv
Y29tcGxldGVQb3B1cE1lbnVDbGllbnQuaCIKICNpbmNsdWRlICJBWE9iamVjdENhY2hlLmgiCiAj
aW5jbHVkZSAiQ2hyb21lLmgiCkBAIC0yNDAsNiArMjQxLDggQEAgV2ViVmlld0ltcGw6OldlYlZp
ZXdJbXBsKFdlYlZpZXdDbGllbnQqIAogICAgICwgbV9vcGVyYXRpb25zQWxsb3dlZChXZWJEcmFn
T3BlcmF0aW9uTm9uZSkKICAgICAsIG1fZHJhZ09wZXJhdGlvbihXZWJEcmFnT3BlcmF0aW9uTm9u
ZSkKICAgICAsIG1fc3VnZ2VzdGlvbnNQb3B1cFNob3dpbmcoZmFsc2UpCisgICAgLCBtX3N1Z2dl
c3Rpb25zUG9wdXBDbGllbnQoMCkKKyAgICAsIG1fc3VnZ2VzdGlvbnNQb3B1cCgwKQogICAgICwg
bV9pc1RyYW5zcGFyZW50KGZhbHNlKQogICAgICwgbV90YWJzVG9MaW5rcyhmYWxzZSkKIHsKQEAg
LTQ2OCw3ICs0NzEsNyBAQCBib29sIFdlYlZpZXdJbXBsOjprZXlFdmVudChjb25zdCBXZWJLZXli
CiAgICAgLy8gZXZlbnQuCiAgICAgbV9zdXBwcmVzc05leHRLZXlwcmVzc0V2ZW50ID0gZmFsc2U7
CiAKLSAgICAvLyBHaXZlIGF1dG9jb21wbGV0ZSBhIGNoYW5jZSB0byBjb25zdW1lIHRoZSBrZXkg
ZXZlbnRzIGl0IGlzIGludGVyZXN0ZWQgaW4uCisgICAgLy8gR2l2ZSBBdXRvY29tcGxldGUgYSBj
aGFuY2UgdG8gY29uc3VtZSB0aGUga2V5IGV2ZW50cyBpdCBpcyBpbnRlcmVzdGVkIGluLgogICAg
IGlmIChhdXRvY29tcGxldGVIYW5kbGVLZXlFdmVudChldmVudCkpCiAgICAgICAgIHJldHVybiB0
cnVlOwogCkBAIC01NDEsNyArNTQ0LDcgQEAgYm9vbCBXZWJWaWV3SW1wbDo6YXV0b2NvbXBsZXRl
SGFuZGxlS2V5RQogICAgICAgICBtX2NsaWVudC0+cmVtb3ZlQXV0b2ZpbGxTdWdnZXN0aW9ucyhu
YW1lLCB2YWx1ZSk7CiAgICAgICAgIC8vIFVwZGF0ZSB0aGUgZW50cmllcyBpbiB0aGUgY3VycmVu
dGx5IHNob3dpbmcgcG9wdXAgdG8gcmVmbGVjdCB0aGUKICAgICAgICAgLy8gZGVsZXRpb24uCi0g
ICAgICAgIG1fYXV0b2NvbXBsZXRlUG9wdXBDbGllbnQtPnJlbW92ZUl0ZW1BdEluZGV4KHNlbGVj
dGVkSW5kZXgpOworICAgICAgICBtX2F1dG9jb21wbGV0ZVBvcHVwQ2xpZW50LT5yZW1vdmVTdWdn
ZXN0aW9uQXRJbmRleChzZWxlY3RlZEluZGV4KTsKICAgICAgICAgcmVmcmVzaFN1Z2dlc3Rpb25z
UG9wdXAoKTsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KQEAgLTE1NTgsNTggKzE1NjEs
MTE4IEBAIHZvaWQgV2ViVmlld0ltcGw6OmFwcGx5QXV0b2ZpbGxTdWdnZXN0aW8KICAgICBjb25z
dCBXZWJWZWN0b3I8V2ViU3RyaW5nPiYgc3VnZ2VzdGlvbnMsCiAgICAgaW50IGRlZmF1bHRTdWdn
ZXN0aW9uSW5kZXgpCiB7Ci0gICAgaWYgKCFtX3BhZ2UuZ2V0KCkgfHwgc3VnZ2VzdGlvbnMuaXNF
bXB0eSgpKSB7CisgICAgYXBwbHlBdXRvY29tcGxldGVTdWdnZXN0aW9ucyhub2RlLCBzdWdnZXN0
aW9ucywgZGVmYXVsdFN1Z2dlc3Rpb25JbmRleCk7Cit9CisKK3ZvaWQgV2ViVmlld0ltcGw6OmFw
cGx5QXV0b0ZpbGxTdWdnZXN0aW9ucygKKyAgICBjb25zdCBXZWJOb2RlJiBub2RlLAorICAgIGNv
bnN0IFdlYlZlY3RvcjxXZWJTdHJpbmc+JiBuYW1lcywKKyAgICBjb25zdCBXZWJWZWN0b3I8V2Vi
U3RyaW5nPiYgbGFiZWxzLAorICAgIGludCBkZWZhdWx0U3VnZ2VzdGlvbkluZGV4KQoreworICAg
IEFTU0VSVChuYW1lcy5zaXplKCkgPT0gbGFiZWxzLnNpemUoKSk7CisgICAgQVNTRVJUKGRlZmF1
bHRTdWdnZXN0aW9uSW5kZXggPCBzdGF0aWNfY2FzdDxpbnQ+KG5hbWVzLnNpemUoKSkpOworCisg
ICAgaWYgKG5hbWVzLmlzRW1wdHkoKSkgewogICAgICAgICBoaWRlU3VnZ2VzdGlvbnNQb3B1cCgp
OwogICAgICAgICByZXR1cm47CiAgICAgfQogCisgICAgUmVmUHRyPE5vZGU+IGZvY3VzZWROb2Rl
ID0gZm9jdXNlZFdlYkNvcmVOb2RlKCk7CisgICAgLy8gSWYgdGhlIG5vZGUgZm9yIHdoaWNoIHdl
IHF1ZXJpZWQgdGhlIEF1dG9GaWxsIHN1Z2dlc3Rpb25zIGlzIG5vdCB0aGUKKyAgICAvLyBmb2N1
c2VkIG5vZGUsIHRoZW4gd2UgaGF2ZSBub3RoaW5nIHRvIGRvLiAgRklYTUU6IGFsc28gY2hlY2sg
dGhlCisgICAgLy8gY2FyZXQgaXMgYXQgdGhlIGVuZCBhbmQgdGhhdCB0aGUgdGV4dCBoYXMgbm90
IGNoYW5nZWQuCisgICAgaWYgKCFmb2N1c2VkTm9kZSB8fCBmb2N1c2VkTm9kZSAhPSBQYXNzUmVm
UHRyPE5vZGU+KG5vZGUpKSB7CisgICAgICAgIGhpZGVTdWdnZXN0aW9uc1BvcHVwKCk7CisgICAg
ICAgIHJldHVybjsKKyAgICB9CisKKyAgICBIVE1MSW5wdXRFbGVtZW50KiBpbnB1dEVsZW0gPQor
ICAgICAgICBzdGF0aWNfY2FzdDxIVE1MSW5wdXRFbGVtZW50Kj4oZm9jdXNlZE5vZGUuZ2V0KCkp
OworCisgICAgLy8gVGhlIGZpcnN0IHRpbWUgdGhlIEF1dG9GaWxsIHBvcHVwIGlzIHNob3duIHdl
J2xsIGNyZWF0ZSB0aGUgY2xpZW50IGFuZAorICAgIC8vIHRoZSBwb3B1cC4KKyAgICBpZiAoIW1f
YXV0b0ZpbGxQb3B1cENsaWVudC5nZXQoKSkKKyAgICAgICAgbV9hdXRvRmlsbFBvcHVwQ2xpZW50
LnNldChuZXcgQXV0b0ZpbGxQb3B1cE1lbnVDbGllbnQpOworCisgICAgbV9hdXRvRmlsbFBvcHVw
Q2xpZW50LT5pbml0aWFsaXplKGlucHV0RWxlbSwgbmFtZXMsIGxhYmVscywKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFN1Z2dlc3Rpb25JbmRleCk7CisKKyAg
ICBpZiAobV9zdWdnZXN0aW9uc1BvcHVwQ2xpZW50ICE9IG1fYXV0b0ZpbGxQb3B1cENsaWVudC5n
ZXQoKSkgeworICAgICAgICBoaWRlU3VnZ2VzdGlvbnNQb3B1cCgpOworICAgICAgICBtX3N1Z2dl
c3Rpb25zUG9wdXBDbGllbnQgPSBtX2F1dG9GaWxsUG9wdXBDbGllbnQuZ2V0KCk7CisgICAgfQor
CisgICAgaWYgKCFtX2F1dG9GaWxsUG9wdXAuZ2V0KCkpIHsKKyAgICAgICAgbV9hdXRvRmlsbFBv
cHVwID0gUG9wdXBDb250YWluZXI6OmNyZWF0ZShtX3N1Z2dlc3Rpb25zUG9wdXBDbGllbnQsCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGlv
bnNQb3B1cFNldHRpbmdzKTsKKyAgICB9CisKKyAgICBpZiAobV9zdWdnZXN0aW9uc1BvcHVwICE9
IG1fYXV0b0ZpbGxQb3B1cC5nZXQoKSkKKyAgICAgICAgbV9zdWdnZXN0aW9uc1BvcHVwID0gbV9h
dXRvRmlsbFBvcHVwLmdldCgpOworCisgICAgaWYgKG1fc3VnZ2VzdGlvbnNQb3B1cFNob3dpbmcp
IHsKKyAgICAgICAgbV9hdXRvRmlsbFBvcHVwQ2xpZW50LT5zZXRTdWdnZXN0aW9ucyhuYW1lcywg
bGFiZWxzKTsKKyAgICAgICAgcmVmcmVzaFN1Z2dlc3Rpb25zUG9wdXAoKTsKKyAgICB9IGVsc2Ug
eworICAgICAgICBtX3N1Z2dlc3Rpb25zUG9wdXAtPnNob3coZm9jdXNlZE5vZGUtPmdldFJlY3Qo
KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvY3VzZWROb2RlLT5vd25lckRv
Y3VtZW50KCktPnZpZXcoKSwgMCk7CisgICAgICAgIG1fc3VnZ2VzdGlvbnNQb3B1cFNob3dpbmcg
PSB0cnVlOworICAgIH0KK30KKwordm9pZCBXZWJWaWV3SW1wbDo6YXBwbHlBdXRvY29tcGxldGVT
dWdnZXN0aW9ucygKKyAgICBjb25zdCBXZWJOb2RlJiBub2RlLAorICAgIGNvbnN0IFdlYlZlY3Rv
cjxXZWJTdHJpbmc+JiBzdWdnZXN0aW9ucywKKyAgICBpbnQgZGVmYXVsdFN1Z2dlc3Rpb25JbmRl
eCkKK3sKICAgICBBU1NFUlQoZGVmYXVsdFN1Z2dlc3Rpb25JbmRleCA8IHN0YXRpY19jYXN0PGlu
dD4oc3VnZ2VzdGlvbnMuc2l6ZSgpKSk7CiAKLSAgICBpZiAoUmVmUHRyPEZyYW1lPiBmb2N1c2Vk
ID0gbV9wYWdlLT5mb2N1c0NvbnRyb2xsZXIoKS0+Zm9jdXNlZEZyYW1lKCkpIHsKLSAgICAgICAg
UmVmUHRyPERvY3VtZW50PiBkb2N1bWVudCA9IGZvY3VzZWQtPmRvY3VtZW50KCk7Ci0gICAgICAg
IGlmICghZG9jdW1lbnQuZ2V0KCkpIHsKLSAgICAgICAgICAgIGhpZGVTdWdnZXN0aW9uc1BvcHVw
KCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KKyAgICBpZiAoIW1fcGFnZS5nZXQo
KSB8fCBzdWdnZXN0aW9ucy5pc0VtcHR5KCkpIHsKKyAgICAgICAgaGlkZVN1Z2dlc3Rpb25zUG9w
dXAoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KIAotICAgICAgICBSZWZQdHI8Tm9kZT4gZm9j
dXNlZE5vZGUgPSBkb2N1bWVudC0+Zm9jdXNlZE5vZGUoKTsKLSAgICAgICAgLy8gSWYgdGhlIG5v
ZGUgZm9yIHdoaWNoIHdlIHF1ZXJpZWQgdGhlIGF1dG9maWxsIHN1Z2dlc3Rpb25zIGlzIG5vdCB0
aGUKLSAgICAgICAgLy8gZm9jdXNlZCBub2RlLCB0aGVuIHdlIGhhdmUgbm90aGluZyB0byBkby4g
IEZJWE1FOiBhbHNvIGNoZWNrIHRoZQotICAgICAgICAvLyBjYXJyZXQgaXMgYXQgdGhlIGVuZCBh
bmQgdGhhdCB0aGUgdGV4dCBoYXMgbm90IGNoYW5nZWQuCi0gICAgICAgIGlmICghZm9jdXNlZE5v
ZGUuZ2V0KCkgfHwgZm9jdXNlZE5vZGUgIT0gUGFzc1JlZlB0cjxOb2RlPihub2RlKSkgewotICAg
ICAgICAgICAgaGlkZVN1Z2dlc3Rpb25zUG9wdXAoKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAg
ICAgICAgfQorICAgIFJlZlB0cjxOb2RlPiBmb2N1c2VkTm9kZSA9IGZvY3VzZWRXZWJDb3JlTm9k
ZSgpOworICAgIC8vIElmIHRoZSBub2RlIGZvciB3aGljaCB3ZSBxdWVyaWVkIHRoZSBBdXRvY29t
cGxldGUgc3VnZ2VzdGlvbnMgaXMgbm90IHRoZQorICAgIC8vIGZvY3VzZWQgbm9kZSwgdGhlbiB3
ZSBoYXZlIG5vdGhpbmcgdG8gZG8uICBGSVhNRTogYWxzbyBjaGVjayB0aGUKKyAgICAvLyBjYXJl
dCBpcyBhdCB0aGUgZW5kIGFuZCB0aGF0IHRoZSB0ZXh0IGhhcyBub3QgY2hhbmdlZC4KKyAgICBp
ZiAoIWZvY3VzZWROb2RlIHx8IGZvY3VzZWROb2RlICE9IFBhc3NSZWZQdHI8Tm9kZT4obm9kZSkp
IHsKKyAgICAgICAgaGlkZVN1Z2dlc3Rpb25zUG9wdXAoKTsKKyAgICAgICAgcmV0dXJuOworICAg
IH0KIAotICAgICAgICBpZiAoIWZvY3VzZWROb2RlLT5oYXNUYWdOYW1lKEhUTUxOYW1lczo6aW5w
dXRUYWcpKSB7Ci0gICAgICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKLSAgICAgICAgICAg
IHJldHVybjsKLSAgICAgICAgfQorICAgIEhUTUxJbnB1dEVsZW1lbnQqIGlucHV0RWxlbSA9Cisg
ICAgICAgIHN0YXRpY19jYXN0PEhUTUxJbnB1dEVsZW1lbnQqPihmb2N1c2VkTm9kZS5nZXQoKSk7
CiAKLSAgICAgICAgSFRNTElucHV0RWxlbWVudCogaW5wdXRFbGVtID0KLSAgICAgICAgICAgIHN0
YXRpY19jYXN0PEhUTUxJbnB1dEVsZW1lbnQqPihmb2N1c2VkTm9kZS5nZXQoKSk7CisgICAgLy8g
VGhlIGZpcnN0IHRpbWUgdGhlIEF1dG9jb21wbGV0ZSBpcyBzaG93biB3ZSdsbCBjcmVhdGUgdGhl
IGNsaWVudCBhbmQgdGhlCisgICAgLy8gcG9wdXAuCisgICAgaWYgKCFtX2F1dG9jb21wbGV0ZVBv
cHVwQ2xpZW50LmdldCgpKQorICAgICAgICBtX2F1dG9jb21wbGV0ZVBvcHVwQ2xpZW50LnNldChu
ZXcgQXV0b2NvbXBsZXRlUG9wdXBNZW51Q2xpZW50KTsKIAotICAgICAgICAvLyBUaGUgZmlyc3Qg
dGltZSB0aGUgc3VnZ2VzdGlvbnMgcG9wdXAgaXMgc2hvd24gd2UnbGwgY3JlYXRlIHRoZSBjbGll
bnQKLSAgICAgICAgLy8gYW5kIHRoZSBwb3B1cC4KLSAgICAgICAgaWYgKCFtX2F1dG9jb21wbGV0
ZVBvcHVwQ2xpZW50LmdldCgpKQotICAgICAgICAgICAgbV9hdXRvY29tcGxldGVQb3B1cENsaWVu
dC5zZXQobmV3IEF1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVudCh0aGlzKSk7Ci0gICAgICAgIG1f
YXV0b2NvbXBsZXRlUG9wdXBDbGllbnQtPmluaXRpYWxpemUoaW5wdXRFbGVtLAotICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Z2dlc3Rpb25zLAotICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRTdWdnZXN0aW9u
SW5kZXgpOwotICAgICAgICBpZiAoIW1fc3VnZ2VzdGlvbnNQb3B1cC5nZXQoKSkgewotICAgICAg
ICAgICAgbV9zdWdnZXN0aW9uc1BvcHVwID0KLSAgICAgICAgICAgICAgICBQb3B1cENvbnRhaW5l
cjo6Y3JlYXRlKG1fYXV0b2NvbXBsZXRlUG9wdXBDbGllbnQuZ2V0KCksCi0gICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBzdWdnZXN0aW9uc1BvcHVwU2V0dGluZ3MpOwotICAg
ICAgICB9CisgICAgbV9hdXRvY29tcGxldGVQb3B1cENsaWVudC0+aW5pdGlhbGl6ZShpbnB1dEVs
ZW0sIHN1Z2dlc3Rpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgZGVmYXVsdFN1Z2dlc3Rpb25JbmRleCk7CiAKLSAgICAgICAgaWYgKG1fc3VnZ2VzdGlvbnNQ
b3B1cFNob3dpbmcpIHsKLSAgICAgICAgICAgIG1fYXV0b2NvbXBsZXRlUG9wdXBDbGllbnQtPnNl
dFN1Z2dlc3Rpb25zKHN1Z2dlc3Rpb25zKTsKLSAgICAgICAgICAgIHJlZnJlc2hTdWdnZXN0aW9u
c1BvcHVwKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtX3N1Z2dlc3Rpb25zUG9w
dXAtPnNob3coZm9jdXNlZE5vZGUtPmdldFJlY3QoKSwKLSAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBmb2N1c2VkTm9kZS0+b3duZXJEb2N1bWVudCgpLT52aWV3KCksIDApOwot
ICAgICAgICAgICAgbV9zdWdnZXN0aW9uc1BvcHVwU2hvd2luZyA9IHRydWU7Ci0gICAgICAgIH0K
KyAgICBpZiAobV9zdWdnZXN0aW9uc1BvcHVwQ2xpZW50ICE9IG1fYXV0b2NvbXBsZXRlUG9wdXBD
bGllbnQuZ2V0KCkpIHsKKyAgICAgICAgaGlkZVN1Z2dlc3Rpb25zUG9wdXAoKTsKKyAgICAgICAg
bV9zdWdnZXN0aW9uc1BvcHVwQ2xpZW50ID0gbV9hdXRvY29tcGxldGVQb3B1cENsaWVudC5nZXQo
KTsKKyAgICB9CisKKyAgICBpZiAoIW1fYXV0b2NvbXBsZXRlUG9wdXAuZ2V0KCkpIHsKKyAgICAg
ICAgbV9hdXRvY29tcGxldGVQb3B1cCA9IFBvcHVwQ29udGFpbmVyOjpjcmVhdGUobV9zdWdnZXN0
aW9uc1BvcHVwQ2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBzdWdnZXN0aW9uc1BvcHVwU2V0dGluZ3MpOworICAgIH0KKworICAgIGlm
IChtX3N1Z2dlc3Rpb25zUG9wdXAgIT0gbV9hdXRvY29tcGxldGVQb3B1cC5nZXQoKSkKKyAgICAg
ICAgbV9zdWdnZXN0aW9uc1BvcHVwID0gbV9hdXRvY29tcGxldGVQb3B1cC5nZXQoKTsKKworICAg
IGlmIChtX3N1Z2dlc3Rpb25zUG9wdXBTaG93aW5nKSB7CisgICAgICAgIG1fYXV0b2NvbXBsZXRl
UG9wdXBDbGllbnQtPnNldFN1Z2dlc3Rpb25zKHN1Z2dlc3Rpb25zKTsKKyAgICAgICAgcmVmcmVz
aFN1Z2dlc3Rpb25zUG9wdXAoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtX3N1Z2dlc3Rpb25z
UG9wdXAtPnNob3coZm9jdXNlZE5vZGUtPmdldFJlY3QoKSwKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGZvY3VzZWROb2RlLT5vd25lckRvY3VtZW50KCktPnZpZXcoKSwgMCk7Cisg
ICAgICAgIG1fc3VnZ2VzdGlvbnNQb3B1cFNob3dpbmcgPSB0cnVlOwogICAgIH0KIH0KIApJbmRl
eDogV2ViS2l0L2Nocm9taXVtL3NyYy9XZWJWaWV3SW1wbC5oCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktp
dC9jaHJvbWl1bS9zcmMvV2ViVmlld0ltcGwuaAkocmV2aXNpb24gNTQ1MDEpCisrKyBXZWJLaXQv
Y2hyb21pdW0vc3JjL1dlYlZpZXdJbXBsLmgJKHdvcmtpbmcgY29weSkKQEAgLTU4LDYgKzU4LDcg
QEAgY2xhc3MgS2V5Ym9hcmRFdmVudDsKIGNsYXNzIFBhZ2U7CiBjbGFzcyBQbGF0Zm9ybUtleWJv
YXJkRXZlbnQ7CiBjbGFzcyBQb3B1cENvbnRhaW5lcjsKK2NsYXNzIFBvcHVwTWVudUNsaWVudDsK
IGNsYXNzIFJhbmdlOwogY2xhc3MgUmVuZGVyVGhlbWU7CiBjbGFzcyBXaWRnZXQ7CkBAIC02NSw3
ICs2Niw5IEBAIGNsYXNzIFdpZGdldDsKIAogbmFtZXNwYWNlIFdlYktpdCB7CiBjbGFzcyBBdXRv
Y29tcGxldGVQb3B1cE1lbnVDbGllbnQ7CitjbGFzcyBBdXRvRmlsbFBvcHVwTWVudUNsaWVudDsK
IGNsYXNzIENvbnRleHRNZW51Q2xpZW50SW1wbDsKK2NsYXNzIFN1Z2dlc3Rpb25zUG9wdXBNZW51
Q2xpZW50OwogY2xhc3MgV2ViQWNjZXNzaWJpbGl0eU9iamVjdDsKIGNsYXNzIFdlYkRldlRvb2xz
QWdlbnRQcml2YXRlOwogY2xhc3MgV2ViRnJhbWVJbXBsOwpAQCAtMTUzLDYgKzE1NiwxNSBAQCBw
dWJsaWM6CiAgICAgICAgIGNvbnN0IFdlYk5vZGUmLAogICAgICAgICBjb25zdCBXZWJWZWN0b3I8
V2ViU3RyaW5nPiYgc3VnZ2VzdGlvbnMsCiAgICAgICAgIGludCBkZWZhdWx0U3VnZ2VzdGlvbklu
ZGV4KTsKKyAgICB2aXJ0dWFsIHZvaWQgYXBwbHlBdXRvRmlsbFN1Z2dlc3Rpb25zKAorICAgICAg
ICBjb25zdCBXZWJOb2RlJiwKKyAgICAgICAgY29uc3QgV2ViVmVjdG9yPFdlYlN0cmluZz4mIG5h
bWVzLAorICAgICAgICBjb25zdCBXZWJWZWN0b3I8V2ViU3RyaW5nPiYgbGFiZWxzLAorICAgICAg
ICBpbnQgZGVmYXVsdFN1Z2dlc3Rpb25JbmRleCk7CisgICAgdmlydHVhbCB2b2lkIGFwcGx5QXV0
b2NvbXBsZXRlU3VnZ2VzdGlvbnMoCisgICAgICAgIGNvbnN0IFdlYk5vZGUmLAorICAgICAgICBj
b25zdCBXZWJWZWN0b3I8V2ViU3RyaW5nPiYgc3VnZ2VzdGlvbnMsCisgICAgICAgIGludCBkZWZh
dWx0U3VnZ2VzdGlvbkluZGV4KTsKICAgICB2aXJ0dWFsIHZvaWQgaGlkZUF1dG9maWxsUG9wdXAo
KTsKICAgICB2aXJ0dWFsIHZvaWQgaGlkZVN1Z2dlc3Rpb25zUG9wdXAoKTsKICAgICB2aXJ0dWFs
IHZvaWQgc2V0U2Nyb2xsYmFyQ29sb3JzKHVuc2lnbmVkIGluYWN0aXZlQ29sb3IsCkBAIC0zOTUs
MTYgKzQwNywyOSBAQCBwcml2YXRlOgogICAgIC8vIGN1cnJlbnQgZHJvcCB0YXJnZXQgaW4gdGhp
cyBXZWJWaWV3ICh0aGUgZHJvcCB0YXJnZXQgY2FuIGFjY2VwdCB0aGUgZHJvcCkuCiAgICAgV2Vi
RHJhZ09wZXJhdGlvbiBtX2RyYWdPcGVyYXRpb247CiAKLSAgICAvLyBUaGUgc3VnZ2VzdGlvbnMg
cG9wdXAuICBLZXB0IGFyb3VuZCBhbmQgcmV1c2VkIGV2ZXJ5LXRpbWUgbmV3IHN1Z2dlc3Rpb25z
Ci0gICAgLy8gc2hvdWxkIGJlIHNob3duLgotICAgIFJlZlB0cjxXZWJDb3JlOjpQb3B1cENvbnRh
aW5lcj4gbV9zdWdnZXN0aW9uc1BvcHVwOwotCi0gICAgLy8gV2hldGhlciB0aGUgc3VnZ2VzdGlv
bnMgcG9wdXAgaXMgY3VycmVudGx5IHNob3dpbmcuCisgICAgLy8gV2hldGhlciBhIHN1Z2dlc3Rp
b25zIHBvcHVwIGlzIGN1cnJlbnRseSBzaG93aW5nLgogICAgIGJvb2wgbV9zdWdnZXN0aW9uc1Bv
cHVwU2hvd2luZzsKIAotICAgIC8vIFRoZSBhdXRvY29tcGxldGUgY2xpZW50LgorICAgIC8vIEEg
cG9pbnRlciB0byB0aGUgY3VycmVudCBzdWdnZXN0aW9ucyBwb3B1cCBtZW51IGNsaWVudC4gIFRo
aXMgY2FuIGJlCisgICAgLy8gZWl0aGVyIGFuIEF1dG9GaWxsUG9wdXBNZW51Q2xpZW50IG9yIGFu
IEF1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVudC4gIFdlCisgICAgLy8gZG8gbm90IG93biB0aGlz
IHBvaW50ZXIuCisgICAgU3VnZ2VzdGlvbnNQb3B1cE1lbnVDbGllbnQqIG1fc3VnZ2VzdGlvbnNQ
b3B1cENsaWVudDsKKworICAgIC8vIFRoZSBBdXRvRmlsbCBwb3B1cCBjbGllbnQuCisgICAgT3du
UHRyPEF1dG9GaWxsUG9wdXBNZW51Q2xpZW50PiBtX2F1dG9GaWxsUG9wdXBDbGllbnQ7CisKKyAg
ICAvLyBUaGUgQXV0b2NvbXBsZXRlIHBvcHVwIGNsaWVudC4KICAgICBPd25QdHI8QXV0b2NvbXBs
ZXRlUG9wdXBNZW51Q2xpZW50PiBtX2F1dG9jb21wbGV0ZVBvcHVwQ2xpZW50OwogCisgICAgLy8g
QSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IHN1Z2dlc3Rpb25zIHBvcHVwLiAgV2UgZG8gbm90IG93
biB0aGlzIHBvaW50ZXIuCisgICAgV2ViQ29yZTo6UG9wdXBDb250YWluZXIqIG1fc3VnZ2VzdGlv
bnNQb3B1cDsKKworICAgIC8vIFRoZSBBdXRvRmlsbCBzdWdnZXN0aW9ucyBwb3B1cC4KKyAgICBS
ZWZQdHI8V2ViQ29yZTo6UG9wdXBDb250YWluZXI+IG1fYXV0b0ZpbGxQb3B1cDsKKworICAgIC8v
IFRoZSBBdXRvQ29tcGxldGUgc3VnZ2VzdGlvbnMgcG9wdXAuCisgICAgUmVmUHRyPFdlYkNvcmU6
OlBvcHVwQ29udGFpbmVyPiBtX2F1dG9jb21wbGV0ZVBvcHVwOworCiAgICAgT3duUHRyPFdlYkRl
dlRvb2xzQWdlbnRQcml2YXRlPiBtX2RldlRvb2xzQWdlbnQ7CiAKICAgICAvLyBXaGV0aGVyIHRo
ZSB3ZWJ2aWV3IGlzIHJlbmRlcmluZyB0cmFuc3BhcmVudGx5Lgo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>48371</attachid>
            <date>2010-02-08 15:54:50 -0800</date>
            <delta_ts>2010-02-09 14:58:18 -0800</delta_ts>
            <desc>[Chromium] Refactor AutocompletePopupMenuClient [try4]</desc>
            <filename>refactor4.diff</filename>
            <type>text/plain</type>
            <size>46664</size>
            <attacher name="James Hawkins">jhawkins</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYktpdC9jaHJvbWl1bS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0L2No
cm9taXVtL0NoYW5nZUxvZwkocmV2aXNpb24gNTQ1MTgpCisrKyBXZWJLaXQvY2hyb21pdW0vQ2hh
bmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMzYgQEAKKzIwMTAtMDItMDggIEphbWVz
IEhhd2tpbnMgIDxqaGF3a2luc0BjaHJvbWl1bS5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkg
Tk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgW0Nocm9taXVtXSBSZWZhY3RvciBBdXRvY29tcGxl
dGVQb3B1cE1lbnVDbGllbnQgaW50byBhIGJhc2UgY2xhc3MsCisgICAgICAgIFN1Z2dlc3Rpb25z
UG9wdXBNZW51Q2xpZW50LCBhbmQgdHdvIGRlcml2ZWQgY2xhc3NlcywKKyAgICAgICAgQXV0b2Nv
bXBsZXRlUG9wdXBNZW51Q2xpZW50IGFuZCBBdXRvRmlsbFBvcHVwTWVudUNsaWVudC4gIEN1cnJl
bnRseQorICAgICAgICB0aGUgYmVoYXZpb3Igb2Ygc3VnZ2VzdGlvbnMgcG9wdXBzIGhhcyBub3Qg
Y2hhbmdlZC4KKworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/
aWQ9MzQ3MjEKKworICAgICAgICAqIFdlYktpdC5neXA6CisgICAgICAgICogcHVibGljL1dlYlZp
ZXcuaDoKKyAgICAgICAgKiBzcmMvQXV0b0ZpbGxQb3B1cE1lbnVDbGllbnQuY3BwOiBBZGRlZC4K
KyAgICAgICAgKiBzcmMvQXV0b0ZpbGxQb3B1cE1lbnVDbGllbnQuaDogQWRkZWQuCisgICAgICAg
ICogc3JjL0F1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVudC5jcHA6CisgICAgICAgIChXZWJLaXQ6
OkF1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVudDo6Z2V0U3VnZ2VzdGlvbnNDb3VudCk6CisgICAg
ICAgIChXZWJLaXQ6OkF1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVudDo6Z2V0U3VnZ2VzdGlvbik6
CisgICAgICAgIChXZWJLaXQ6OkF1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVudDo6cmVtb3ZlU3Vn
Z2VzdGlvbkF0SW5kZXgpOgorICAgICAgICAoV2ViS2l0OjpBdXRvY29tcGxldGVQb3B1cE1lbnVD
bGllbnQ6OmluaXRpYWxpemUpOgorICAgICAgICAoV2ViS2l0OjpBdXRvY29tcGxldGVQb3B1cE1l
bnVDbGllbnQ6OnNldFN1Z2dlc3Rpb25zKToKKyAgICAgICAgKiBzcmMvQXV0b2NvbXBsZXRlUG9w
dXBNZW51Q2xpZW50Lmg6CisgICAgICAgICogc3JjL1N1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50
LmNwcDogQWRkZWQuCisgICAgICAgICogc3JjL1N1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50Lmg6
IEFkZGVkLgorICAgICAgICAqIHNyYy9XZWJWaWV3SW1wbC5jcHA6CisgICAgICAgIChXZWJLaXQ6
OldlYlZpZXdJbXBsOjpXZWJWaWV3SW1wbCk6CisgICAgICAgIChXZWJLaXQ6OldlYlZpZXdJbXBs
OjprZXlFdmVudCk6CisgICAgICAgIChXZWJLaXQ6OldlYlZpZXdJbXBsOjphdXRvY29tcGxldGVI
YW5kbGVLZXlFdmVudCk6CisgICAgICAgIChXZWJLaXQ6OldlYlZpZXdJbXBsOjphcHBseUF1dG9m
aWxsU3VnZ2VzdGlvbnMpOgorICAgICAgICAoV2ViS2l0OjpXZWJWaWV3SW1wbDo6YXBwbHlBdXRv
RmlsbFN1Z2dlc3Rpb25zKToKKyAgICAgICAgKFdlYktpdDo6V2ViVmlld0ltcGw6OmFwcGx5QXV0
b2NvbXBsZXRlU3VnZ2VzdGlvbnMpOgorICAgICAgICAqIHNyYy9XZWJWaWV3SW1wbC5oOgorCiAy
MDEwLTAyLTA4ICBQYXZlbCBGZWxkbWFuICA8cGZlbGRtYW5AY2hyb21pdW0ub3JnPgogCiAgICAg
ICAgIFJldmlld2VkIGJ5IERhdmlkIExldmluLgpJbmRleDogV2ViS2l0L2Nocm9taXVtL1dlYktp
dC5neXAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0L2Nocm9taXVtL1dlYktpdC5neXAJKHJldmlzaW9u
IDU0NTAxKQorKysgV2ViS2l0L2Nocm9taXVtL1dlYktpdC5neXAJKHdvcmtpbmcgY29weSkKQEAg
LTE5OSw2ICsxOTksOCBAQAogICAgICAgICAgICAgICAgICdzcmMvQXNzZXJ0TWF0Y2hpbmdFbnVt
cy5jcHAnLAogICAgICAgICAgICAgICAgICdzcmMvQXV0b2NvbXBsZXRlUG9wdXBNZW51Q2xpZW50
LmNwcCcsCiAgICAgICAgICAgICAgICAgJ3NyYy9BdXRvY29tcGxldGVQb3B1cE1lbnVDbGllbnQu
aCcsCisgICAgICAgICAgICAgICAgJ3NyYy9BdXRvRmlsbFBvcHVwTWVudUNsaWVudC5jcHAnLAor
ICAgICAgICAgICAgICAgICdzcmMvQXV0b0ZpbGxQb3B1cE1lbnVDbGllbnQuaCcsCiAgICAgICAg
ICAgICAgICAgJ3NyYy9CYWNrRm9yd2FyZExpc3RDbGllbnRJbXBsLmNwcCcsCiAgICAgICAgICAg
ICAgICAgJ3NyYy9CYWNrRm9yd2FyZExpc3RDbGllbnRJbXBsLmgnLAogICAgICAgICAgICAgICAg
ICdzcmMvQm91bmRPYmplY3QuY3BwJywKQEAgLTI1Nyw2ICsyNTksOCBAQAogICAgICAgICAgICAg
ICAgICdzcmMvU3RvcmFnZUV2ZW50RGlzcGF0Y2hlckltcGwuaCcsCiAgICAgICAgICAgICAgICAg
J3NyYy9TdG9yYWdlTmFtZXNwYWNlUHJveHkuY3BwJywKICAgICAgICAgICAgICAgICAnc3JjL1N0
b3JhZ2VOYW1lc3BhY2VQcm94eS5oJywKKyAgICAgICAgICAgICAgICAnc3JjL1N1Z2dlc3Rpb25z
UG9wdXBNZW51Q2xpZW50LmNwcCcsCisgICAgICAgICAgICAgICAgJ3NyYy9TdWdnZXN0aW9uc1Bv
cHVwTWVudUNsaWVudC5oJywKICAgICAgICAgICAgICAgICAnc3JjL1RlbXBvcmFyeUdsdWUuaCcs
CiAgICAgICAgICAgICAgICAgJ3NyYy9Ub29sc0FnZW50LmgnLAogICAgICAgICAgICAgICAgICdz
cmMvV2ViQWNjZXNzaWJpbGl0eUNhY2hlLmNwcCcsCkluZGV4OiBXZWJLaXQvY2hyb21pdW0vcHVi
bGljL1dlYlZpZXcuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQvY2hyb21pdW0vcHVibGljL1dlYlZp
ZXcuaAkocmV2aXNpb24gNTQ1MDEpCisrKyBXZWJLaXQvY2hyb21pdW0vcHVibGljL1dlYlZpZXcu
aAkod29ya2luZyBjb3B5KQpAQCAtMjIzLDE0ICsyMjMsMjkgQEAgcHVibGljOgogICAgIHZpcnR1
YWwgV2ViQWNjZXNzaWJpbGl0eU9iamVjdCBhY2Nlc3NpYmlsaXR5T2JqZWN0KCkgPSAwOwogCiAK
LSAgICAvLyBBdXRvZmlsbCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBBdXRvRmlsbCAvIEF1dG9jb21wbGV0ZSAtLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotICAgIC8vIE5vdGlm
aWVzIHRoZSBXZWJWaWV3IHRoYXQgYXV0b2ZpbGwgc3VnZ2VzdGlvbnMgYXJlIGF2YWlsYWJsZSBm
b3IgYSBub2RlLgorICAgIC8vIERFUFJFQ0FURUQ6IFdlYlZpZXc6OmFwcGx5QXV0b2NvbXBsZXRl
U3VnZ2VzdGlvbnMgaXMgdGhlIG5ldyB3YXkgdG8KKyAgICAvLyBhY2Nlc3MgdGhpcy4KICAgICB2
aXJ0dWFsIHZvaWQgYXBwbHlBdXRvZmlsbFN1Z2dlc3Rpb25zKAogICAgICAgICBjb25zdCBXZWJO
b2RlJiwKICAgICAgICAgY29uc3QgV2ViVmVjdG9yPFdlYlN0cmluZz4mIHN1Z2dlc3Rpb25zLAog
ICAgICAgICBpbnQgZGVmYXVsdFN1Z2dlc3Rpb25JbmRleCkgPSAwOwogCisgICAgLy8gTm90aWZp
ZXMgdGhlIFdlYlZpZXcgdGhhdCBBdXRvRmlsbCBzdWdnZXN0aW9ucyBhcmUgYXZhaWxhYmxlIGZv
ciBhIG5vZGUuCisgICAgdmlydHVhbCB2b2lkIGFwcGx5QXV0b0ZpbGxTdWdnZXN0aW9ucygKKyAg
ICAgICAgY29uc3QgV2ViTm9kZSYsCisgICAgICAgIGNvbnN0IFdlYlZlY3RvcjxXZWJTdHJpbmc+
JiBuYW1lcywKKyAgICAgICAgY29uc3QgV2ViVmVjdG9yPFdlYlN0cmluZz4mIGxhYmVscywKKyAg
ICAgICAgaW50IGRlZmF1bHRTdWdnZXN0aW9uSW5kZXgpID0gMDsKKworICAgIC8vIE5vdGlmaWVz
IHRoZSBXZWJWaWV3IHRoYXQgQXV0b2NvbXBsZXRlIHN1Z2dlc3Rpb25zIGFyZSBhdmFpbGFibGUg
Zm9yIGEKKyAgICAvLyBub2RlLgorICAgIHZpcnR1YWwgdm9pZCBhcHBseUF1dG9jb21wbGV0ZVN1
Z2dlc3Rpb25zKAorICAgICAgICBjb25zdCBXZWJOb2RlJiwKKyAgICAgICAgY29uc3QgV2ViVmVj
dG9yPFdlYlN0cmluZz4mIHN1Z2dlc3Rpb25zLAorICAgICAgICBpbnQgZGVmYXVsdFN1Z2dlc3Rp
b25JbmRleCkgPSAwOworCiAgICAgLy8gREVQUkVDQVRFRDogV2ViVmlldzo6aGlkZVN1Z2dlc3Rp
b25zUG9wdXAgaXMgdGhlIG5ldyB3YXkgdG8gYWNjZXNzIHRoaXMuCiAgICAgdmlydHVhbCB2b2lk
IGhpZGVBdXRvZmlsbFBvcHVwKCkgPSAwOwogCkluZGV4OiBXZWJLaXQvY2hyb21pdW0vc3JjL0F1
dG9GaWxsUG9wdXBNZW51Q2xpZW50LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQvY2hyb21pdW0v
c3JjL0F1dG9GaWxsUG9wdXBNZW51Q2xpZW50LmNwcAkocmV2aXNpb24gMCkKKysrIFdlYktpdC9j
aHJvbWl1bS9zcmMvQXV0b0ZpbGxQb3B1cE1lbnVDbGllbnQuY3BwCShyZXZpc2lvbiAwKQpAQCAt
MCwwICsxLDExMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwg
cmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl
IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUg
cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICog
bWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJl
dGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlv
bnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3Zp
ZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1l
IG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5
IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICog
dGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4K
KyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVS
UyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVE
IFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJ
RUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBB
UlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENP
UFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNF
UVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9D
VVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAq
IERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJBdXRvRmlsbFBvcHVw
TWVudUNsaWVudC5oIgorCisjaW5jbHVkZSAiQ1NTU3R5bGVTZWxlY3Rvci5oIgorI2luY2x1ZGUg
IkNTU1ZhbHVlS2V5d29yZHMuaCIKKyNpbmNsdWRlICJGcmFtZVZpZXcuaCIKKyNpbmNsdWRlICJI
VE1MSW5wdXRFbGVtZW50LmgiCisjaW5jbHVkZSAiUmVuZGVyVGhlbWUuaCIKKyNpbmNsdWRlICJX
ZWJOb2RlLmgiCisjaW5jbHVkZSAiV2ViVmVjdG9yLmgiCisjaW5jbHVkZSAiV2ViVmlld0NsaWVu
dC5oIgorI2luY2x1ZGUgIldlYlZpZXdJbXBsLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBXZWJDb3Jl
OworCituYW1lc3BhY2UgV2ViS2l0IHsKKwordW5zaWduZWQgQXV0b0ZpbGxQb3B1cE1lbnVDbGll
bnQ6OmdldFN1Z2dlc3Rpb25zQ291bnQoKSBjb25zdAoreworICAgIHJldHVybiBtX25hbWVzLnNp
emUoKTsKK30KKworV2ViU3RyaW5nIEF1dG9GaWxsUG9wdXBNZW51Q2xpZW50OjpnZXRTdWdnZXN0
aW9uKHVuc2lnbmVkIGxpc3RJbmRleCkgY29uc3QKK3sKKyAgICAvLyBGSVhNRTogTW9kaWZ5IHRo
ZSBQb3B1cE1lbnUgdG8gYWRkIHRoZSBsYWJlbCBpbiBncmF5IHJpZ2h0LWp1c3RpZmllZC4KKyAg
ICBBU1NFUlQobGlzdEluZGV4ID49IDAgJiYgbGlzdEluZGV4IDwgbV9uYW1lcy5zaXplKCkpOwor
ICAgIHJldHVybiBtX25hbWVzW2xpc3RJbmRleF0gKyBTdHJpbmcoIiAoIikgKyBtX2xhYmVsc1ts
aXN0SW5kZXhdICsgU3RyaW5nKCIpIik7Cit9CisKK3ZvaWQgQXV0b0ZpbGxQb3B1cE1lbnVDbGll
bnQ6OnJlbW92ZVN1Z2dlc3Rpb25BdEluZGV4KHVuc2lnbmVkIGxpc3RJbmRleCkKK3sKKyAgICAv
LyBGSVhNRTogRG8gd2Ugd2FudCB0byByZW1vdmUgQXV0b0ZpbGwgc3VnZ2VzdGlvbnM/CisgICAg
QVNTRVJUKGxpc3RJbmRleCA+PSAwICYmIGxpc3RJbmRleCA8IHN0YXRpY19jYXN0PGludD4obV9u
YW1lcy5zaXplKCkpKTsKKyAgICBtX25hbWVzLnJlbW92ZShsaXN0SW5kZXgpOworICAgIG1fbGFi
ZWxzLnJlbW92ZShsaXN0SW5kZXgpOworfQorCit2b2lkIEF1dG9GaWxsUG9wdXBNZW51Q2xpZW50
Ojogc2VsZWN0aW9uQ2hhbmdlZCh1bnNpZ25lZCBsaXN0SW5kZXgsCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZpcmVFdmVudHMpIHsKKyAgICBp
ZiAobGlzdEluZGV4ID09IHN0YXRpY19jYXN0PHVuc2lnbmVkPigtMSkpIHsKKyAgICAgICAgU3Vn
Z2VzdGlvbnNQb3B1cE1lbnVDbGllbnQ6OnNlbGVjdGlvbkNoYW5nZWQobGlzdEluZGV4LCBmaXJl
RXZlbnRzKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEFTU0VSVChsaXN0SW5kZXgg
Pj0gMCAmJiBsaXN0SW5kZXggPCBtX25hbWVzLnNpemUoKSk7CisgICAgc2V0U3VnZ2VzdGVkVmFs
dWUobV9uYW1lc1tsaXN0SW5kZXhdKTsKK30KKwordm9pZCBBdXRvRmlsbFBvcHVwTWVudUNsaWVu
dDo6aW5pdGlhbGl6ZSgKKyAgICBIVE1MSW5wdXRFbGVtZW50KiB0ZXh0RmllbGQsCisgICAgY29u
c3QgV2ViVmVjdG9yPFdlYlN0cmluZz4mIG5hbWVzLAorICAgIGNvbnN0IFdlYlZlY3RvcjxXZWJT
dHJpbmc+JiBsYWJlbHMsCisgICAgaW50IGRlZmF1bHRTdWdnZXN0aW9uSW5kZXgpCit7CisgICAg
QVNTRVJUKG5hbWVzLnNpemUoKSA9PSBsYWJlbHMuc2l6ZSgpKTsKKyAgICBBU1NFUlQoZGVmYXVs
dFN1Z2dlc3Rpb25JbmRleCA8IHN0YXRpY19jYXN0PGludD4obmFtZXMuc2l6ZSgpKSk7CisKKyAg
ICAvLyBUaGUgc3VnZ2VzdGlvbnMgbXVzdCBiZSBzZXQgYmVmb3JlIGluaXRpYWxpemluZyB0aGUK
KyAgICAvLyBTdWdnZXN0aW9uc1BvcHVwTWVudUNsaWVudC4KKyAgICBzZXRTdWdnZXN0aW9ucyhu
YW1lcywgbGFiZWxzKTsKKworICAgIFN1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50Ojppbml0aWFs
aXplKHRleHRGaWVsZCwgZGVmYXVsdFN1Z2dlc3Rpb25JbmRleCk7Cit9CisKK3ZvaWQgQXV0b0Zp
bGxQb3B1cE1lbnVDbGllbnQ6OnNldFN1Z2dlc3Rpb25zKGNvbnN0IFdlYlZlY3RvcjxXZWJTdHJp
bmc+JiBuYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGNvbnN0IFdlYlZlY3RvcjxXZWJTdHJpbmc+JiBsYWJlbHMpCit7CisgICAgQVNTRVJUKG5hbWVz
LnNpemUoKSA9PSBsYWJlbHMuc2l6ZSgpKTsKKworICAgIG1fbmFtZXMuY2xlYXIoKTsKKyAgICBt
X2xhYmVscy5jbGVhcigpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbmFtZXMuc2l6ZSgp
OyArK2kpIHsKKyAgICAgICAgbV9uYW1lcy5hcHBlbmQobmFtZXNbaV0pOworICAgICAgICBtX2xh
YmVscy5hcHBlbmQobGFiZWxzW2ldKTsKKyAgICB9CisKKyAgICAvLyBUcnkgdG8gcHJlc2VydmUg
c2VsZWN0aW9uIGlmIHBvc3NpYmxlLgorICAgIGlmIChnZXRTZWxlY3RlZEluZGV4KCkgPj0gc3Rh
dGljX2Nhc3Q8aW50PihuYW1lcy5zaXplKCkpKQorICAgICAgICBzZXRTZWxlY3RlZEluZGV4KC0x
KTsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViS2l0CkluZGV4OiBXZWJLaXQvY2hyb21pdW0vc3Jj
L0F1dG9GaWxsUG9wdXBNZW51Q2xpZW50LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0L2Nocm9taXVt
L3NyYy9BdXRvRmlsbFBvcHVwTWVudUNsaWVudC5oCShyZXZpc2lvbiAwKQorKysgV2ViS2l0L2No
cm9taXVtL3NyYy9BdXRvRmlsbFBvcHVwTWVudUNsaWVudC5oCShyZXZpc2lvbiAwKQpAQCAtMCww
ICsxLDc0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5k
IGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJt
aXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6
CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWlu
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBp
biBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIK
KyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQg
d2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2Yg
R29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUg
dXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlz
IHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoK
KyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFO
RCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FS
UkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBX
QVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElD
VUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJ
R0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVO
VElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVN
RU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFU
QSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBB
TkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBT
VFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09G
VFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
CisgKi8KKworI2lmbmRlZiBBdXRvRmlsbFBvcHVwTWVudUNsaWVudF9oCisjZGVmaW5lIEF1dG9G
aWxsUG9wdXBNZW51Q2xpZW50X2gKKworI2luY2x1ZGUgIlN1Z2dlc3Rpb25zUG9wdXBNZW51Q2xp
ZW50LmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKK2NsYXNzIEhUTUxJbnB1dEVsZW1lbnQ7Citj
bGFzcyBQb3B1cE1lbnVTdHlsZTsKK2NsYXNzIFJlbmRlclN0eWxlOworfQorCituYW1lc3BhY2Ug
V2ViS2l0IHsKK2NsYXNzIFdlYlN0cmluZzsKK2NsYXNzIFdlYlZpZXdJbXBsOwordGVtcGxhdGUg
PHR5cGVuYW1lIFQ+IGNsYXNzIFdlYlZlY3RvcjsKKworLy8gVGhlIEF1dG9GaWxsIHN1Z2dlc3Rp
b25zIHBvcHVwIG1lbnUgY2xpZW50LCB1c2VkIHRvIGRpc3BsYXkgbmFtZSBzdWdnZXN0aW9ucwor
Ly8gd2l0aCByaWdodC1qdXN0aWZpZWQgbGFiZWxzLgorY2xhc3MgQXV0b0ZpbGxQb3B1cE1lbnVD
bGllbnQgOiBwdWJsaWMgU3VnZ2VzdGlvbnNQb3B1cE1lbnVDbGllbnQgeworcHVibGljOgorICAg
IC8vIFN1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50IGltcGxlbWVudGF0aW9uOgorICAgIHZpcnR1
YWwgdW5zaWduZWQgZ2V0U3VnZ2VzdGlvbnNDb3VudCgpIGNvbnN0OworICAgIHZpcnR1YWwgV2Vi
U3RyaW5nIGdldFN1Z2dlc3Rpb24odW5zaWduZWQgbGlzdEluZGV4KSBjb25zdDsKKyAgICB2aXJ0
dWFsIHZvaWQgcmVtb3ZlU3VnZ2VzdGlvbkF0SW5kZXgodW5zaWduZWQgbGlzdEluZGV4KTsKKwor
ICAgIC8vIFdlYkNvcmU6OlBvcHVwTWVudUNsaWVudCBpbXBsZW1lbnRhdGlvbjoKKyAgICB2aXJ0
dWFsIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZCh1bnNpZ25lZCBsaXN0SW5kZXgsIGJvb2wgZmlyZUV2
ZW50cyk7CisKKyAgICB2b2lkIGluaXRpYWxpemUoV2ViQ29yZTo6SFRNTElucHV0RWxlbWVudCos
CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdlYlZlY3RvcjxXZWJTdHJpbmc+JiBuYW1lcywK
KyAgICAgICAgICAgICAgICAgICAgY29uc3QgV2ViVmVjdG9yPFdlYlN0cmluZz4mIGxhYmVscywK
KyAgICAgICAgICAgICAgICAgICAgaW50IGRlZmF1bHRTdWdnZXN0aW9uSW5kZXgpOworCisgICAg
dm9pZCBzZXRTdWdnZXN0aW9ucyhjb25zdCBXZWJWZWN0b3I8V2ViU3RyaW5nPiYgbmFtZXMsCisg
ICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXZWJWZWN0b3I8V2ViU3RyaW5nPiYgbGFiZWxz
KTsKKworcHJpdmF0ZToKKyAgICBWZWN0b3I8V2ViQ29yZTo6U3RyaW5nPiBtX25hbWVzOworICAg
IFZlY3RvcjxXZWJDb3JlOjpTdHJpbmc+IG1fbGFiZWxzOworfTsKKworfSAvLyBuYW1lc3BhY2Ug
V2ViS2l0CisKKyNlbmRpZgoKUHJvcGVydHkgY2hhbmdlcyBvbjogV2ViS2l0L2Nocm9taXVtL3Ny
Yy9BdXRvRmlsbFBvcHVwTWVudUNsaWVudC5oCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KQWRkZWQ6IHN2bjplb2wtc3R5
bGUKICAgKyBMRgoKSW5kZXg6IFdlYktpdC9jaHJvbWl1bS9zcmMvQXV0b2NvbXBsZXRlUG9wdXBN
ZW51Q2xpZW50LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQvY2hyb21pdW0vc3JjL0F1dG9jb21w
bGV0ZVBvcHVwTWVudUNsaWVudC5jcHAJKHJldmlzaW9uIDU0NTAxKQorKysgV2ViS2l0L2Nocm9t
aXVtL3NyYy9BdXRvY29tcGxldGVQb3B1cE1lbnVDbGllbnQuY3BwCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBHb29nbGUgSW5jLiBBbGwg
cmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCBy
aWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ug
YW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAgKiBtb2RpZmljYXRpb24sIGFyZSBw
ZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCkBAIC00
MywxNSArNDMsMjEgQEAgdXNpbmcgbmFtZXNwYWNlIFdlYkNvcmU7CiAKIG5hbWVzcGFjZSBXZWJL
aXQgewogCi1BdXRvY29tcGxldGVQb3B1cE1lbnVDbGllbnQ6OkF1dG9jb21wbGV0ZVBvcHVwTWVu
dUNsaWVudChXZWJWaWV3SW1wbCogd2ViVmlldykKLSAgICA6IG1fdGV4dEZpZWxkKDApCi0gICAg
LCBtX3NlbGVjdGVkSW5kZXgoMCkKLSAgICAsIG1fd2ViVmlldyh3ZWJWaWV3KQordW5zaWduZWQg
QXV0b2NvbXBsZXRlUG9wdXBNZW51Q2xpZW50OjpnZXRTdWdnZXN0aW9uc0NvdW50KCkgY29uc3QK
IHsKKyAgICByZXR1cm4gbV9zdWdnZXN0aW9ucy5zaXplKCk7CiB9CiAKLUF1dG9jb21wbGV0ZVBv
cHVwTWVudUNsaWVudDo6fkF1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVudCgpCitXZWJTdHJpbmcg
QXV0b2NvbXBsZXRlUG9wdXBNZW51Q2xpZW50OjpnZXRTdWdnZXN0aW9uKHVuc2lnbmVkIGxpc3RJ
bmRleCkgY29uc3QKIHsKKyAgICBBU1NFUlQobGlzdEluZGV4ID49IDAgJiYgbGlzdEluZGV4IDwg
bV9zdWdnZXN0aW9ucy5zaXplKCkpOworICAgIHJldHVybiBtX3N1Z2dlc3Rpb25zW2xpc3RJbmRl
eF07Cit9CisKK3ZvaWQgQXV0b2NvbXBsZXRlUG9wdXBNZW51Q2xpZW50OjpyZW1vdmVTdWdnZXN0
aW9uQXRJbmRleCh1bnNpZ25lZCBsaXN0SW5kZXgpCit7CisgICAgQVNTRVJUKGxpc3RJbmRleCA+
PSAwICYmIGxpc3RJbmRleCA8IG1fc3VnZ2VzdGlvbnMuc2l6ZSgpKTsKKyAgICBtX3N1Z2dlc3Rp
b25zLnJlbW92ZShsaXN0SW5kZXgpOwogfQogCiB2b2lkIEF1dG9jb21wbGV0ZVBvcHVwTWVudUNs
aWVudDo6aW5pdGlhbGl6ZSgKQEAgLTYwLDkwICs2NiwxMiBAQCB2b2lkIEF1dG9jb21wbGV0ZVBv
cHVwTWVudUNsaWVudDo6aW5pdGlhCiAgICAgaW50IGRlZmF1bHRTdWdnZXN0aW9uSW5kZXgpCiB7
CiAgICAgQVNTRVJUKGRlZmF1bHRTdWdnZXN0aW9uSW5kZXggPCBzdGF0aWNfY2FzdDxpbnQ+KHN1
Z2dlc3Rpb25zLnNpemUoKSkpOwotICAgIG1fdGV4dEZpZWxkID0gdGV4dEZpZWxkOwotICAgIG1f
c2VsZWN0ZWRJbmRleCA9IGRlZmF1bHRTdWdnZXN0aW9uSW5kZXg7Ci0gICAgc2V0U3VnZ2VzdGlv
bnMoc3VnZ2VzdGlvbnMpOwotCi0gICAgRm9udERlc2NyaXB0aW9uIGZvbnREZXNjcmlwdGlvbjsK
LSAgICBtX3dlYlZpZXctPnRoZW1lKCktPnN5c3RlbUZvbnQoQ1NTVmFsdWVXZWJraXRDb250cm9s
LCBmb250RGVzY3JpcHRpb24pOwotICAgIC8vIFVzZSBhIHNtYWxsZXIgZm9udCBzaXplIHRvIG1h
dGNoIElFL0ZpcmVmb3guCi0gICAgLy8gRklYTUU6IGh0dHA6Ly9jcmJ1Zy5jb20vNzM3NiB1c2Ug
dGhlIHN5c3RlbSBzaXplIGluc3RlYWQgb2YgYQotICAgIC8vICAgICAgICBmaXhlZCBmb250IHNp
emUgdmFsdWUuCi0gICAgZm9udERlc2NyaXB0aW9uLnNldENvbXB1dGVkU2l6ZSgxMi4wKTsKLSAg
ICBGb250IGZvbnQoZm9udERlc2NyaXB0aW9uLCAwLCAwKTsKLSAgICBmb250LnVwZGF0ZSh0ZXh0
RmllbGQtPmRvY3VtZW50KCktPnN0eWxlU2VsZWN0b3IoKS0+Zm9udFNlbGVjdG9yKCkpOwotICAg
IC8vIFRoZSBkaXJlY3Rpb24gb2YgdGV4dCBpbiBwb3B1cCBtZW51IGlzIHNldCB0aGUgc2FtZSBh
cyB0aGUgZGlyZWN0aW9uIG9mCi0gICAgLy8gdGhlIGlucHV0IGVsZW1lbnQ6IHRleHRGaWVsZC4K
LSAgICBtX3N0eWxlLnNldChuZXcgUG9wdXBNZW51U3R5bGUoQ29sb3I6OmJsYWNrLCBDb2xvcjo6
d2hpdGUsIGZvbnQsIHRydWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExl
bmd0aChXZWJDb3JlOjpGaXhlZCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IHRleHRGaWVsZC0+cmVuZGVyZXIoKS0+c3R5bGUoKS0+ZGlyZWN0aW9uKCkpKTsKLX0KLQotdm9p
ZCBBdXRvY29tcGxldGVQb3B1cE1lbnVDbGllbnQ6OnZhbHVlQ2hhbmdlZCh1bnNpZ25lZCBsaXN0
SW5kZXgsIGJvb2wgZmlyZUV2ZW50cykKLXsKLSAgICBtX3RleHRGaWVsZC0+c2V0VmFsdWUobV9z
dWdnZXN0aW9uc1tsaXN0SW5kZXhdKTsKLSAgICBFZGl0b3JDbGllbnRJbXBsKiBlZGl0b3IgPQot
ICAgICAgICBzdGF0aWNfY2FzdDxFZGl0b3JDbGllbnRJbXBsKj4obV93ZWJWaWV3LT5wYWdlKCkt
PmVkaXRvckNsaWVudCgpKTsKLSAgICBBU1NFUlQoZWRpdG9yKTsKLSAgICBlZGl0b3ItPm9uQXV0
b2ZpbGxTdWdnZXN0aW9uQWNjZXB0ZWQoCi0gICAgICAgIHN0YXRpY19jYXN0PEhUTUxJbnB1dEVs
ZW1lbnQqPihtX3RleHRGaWVsZC5nZXQoKSkpOwotfQotCi1TdHJpbmcgQXV0b2NvbXBsZXRlUG9w
dXBNZW51Q2xpZW50OjppdGVtVGV4dCh1bnNpZ25lZCBsaXN0SW5kZXgpIGNvbnN0Ci17Ci0gICAg
cmV0dXJuIG1fc3VnZ2VzdGlvbnNbbGlzdEluZGV4XTsKLX0KLQotUG9wdXBNZW51U3R5bGUgQXV0
b2NvbXBsZXRlUG9wdXBNZW51Q2xpZW50OjppdGVtU3R5bGUodW5zaWduZWQgbGlzdEluZGV4KSBj
b25zdAotewotICAgIHJldHVybiAqbV9zdHlsZTsKLX0KLQotUG9wdXBNZW51U3R5bGUgQXV0b2Nv
bXBsZXRlUG9wdXBNZW51Q2xpZW50OjptZW51U3R5bGUoKSBjb25zdAotewotICAgIHJldHVybiAq
bV9zdHlsZTsKLX0KLQotaW50IEF1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVudDo6Y2xpZW50UGFk
ZGluZ0xlZnQoKSBjb25zdAotewotICAgIC8vIEJ1ZyBodHRwOi8vY3JidWcuY29tLzc3MDggc2Vl
bXMgdG8gaW5kaWNhdGUgdGhlIHN0eWxlIGNhbiBiZSAwLgotICAgIFJlbmRlclN0eWxlKiBzdHls
ZSA9IHRleHRGaWVsZFN0eWxlKCk7Ci0gICAgcmV0dXJuIHN0eWxlID8gbV93ZWJWaWV3LT50aGVt
ZSgpLT5wb3B1cEludGVybmFsUGFkZGluZ0xlZnQoc3R5bGUpIDogMDsKLX0KIAotaW50IEF1dG9j
b21wbGV0ZVBvcHVwTWVudUNsaWVudDo6Y2xpZW50UGFkZGluZ1JpZ2h0KCkgY29uc3QKLXsKLSAg
ICAvLyBCdWcgaHR0cDovL2NyYnVnLmNvbS83NzA4IHNlZW1zIHRvIGluZGljYXRlIHRoZSBzdHls
ZSBjYW4gYmUgMC4KLSAgICBSZW5kZXJTdHlsZSogc3R5bGUgPSB0ZXh0RmllbGRTdHlsZSgpOwot
ICAgIHJldHVybiBzdHlsZSA/IG1fd2ViVmlldy0+dGhlbWUoKS0+cG9wdXBJbnRlcm5hbFBhZGRp
bmdSaWdodChzdHlsZSkgOiAwOwotfQotCi12b2lkIEF1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVu
dDo6cG9wdXBEaWRIaWRlKCkKLXsKLSAgICBtX3dlYlZpZXctPnN1Z2dlc3Rpb25zUG9wdXBEaWRI
aWRlKCk7Ci19Ci0KLXZvaWQgQXV0b2NvbXBsZXRlUG9wdXBNZW51Q2xpZW50OjpzZXRUZXh0RnJv
bUl0ZW0odW5zaWduZWQgbGlzdEluZGV4KQotewotICAgIG1fdGV4dEZpZWxkLT5zZXRWYWx1ZSht
X3N1Z2dlc3Rpb25zW2xpc3RJbmRleF0pOwotfQotCi1Gb250U2VsZWN0b3IqIEF1dG9jb21wbGV0
ZVBvcHVwTWVudUNsaWVudDo6Zm9udFNlbGVjdG9yKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV90
ZXh0RmllbGQtPmRvY3VtZW50KCktPnN0eWxlU2VsZWN0b3IoKS0+Zm9udFNlbGVjdG9yKCk7Ci19
Ci0KLUhvc3RXaW5kb3cqIEF1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVudDo6aG9zdFdpbmRvdygp
IGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fdGV4dEZpZWxkLT5kb2N1bWVudCgpLT52aWV3KCktPmhv
c3RXaW5kb3coKTsKLX0KKyAgICAvLyBUaGUgc3VnZ2VzdGlvbnMgbXVzdCBiZSBzZXQgYmVmb3Jl
IGluaXRpYWxpemluZyB0aGUKKyAgICAvLyBTdWdnZXN0aW9uc1BvcHVwTWVudUNsaWVudC4KKyAg
ICBzZXRTdWdnZXN0aW9ucyhzdWdnZXN0aW9ucyk7CiAKLVBhc3NSZWZQdHI8U2Nyb2xsYmFyPiBB
dXRvY29tcGxldGVQb3B1cE1lbnVDbGllbnQ6OmNyZWF0ZVNjcm9sbGJhcigKLSAgICBTY3JvbGxi
YXJDbGllbnQqIGNsaWVudCwKLSAgICBTY3JvbGxiYXJPcmllbnRhdGlvbiBvcmllbnRhdGlvbiwK
LSAgICBTY3JvbGxiYXJDb250cm9sU2l6ZSBzaXplKQotewotICAgIHJldHVybiBTY3JvbGxiYXI6
OmNyZWF0ZU5hdGl2ZVNjcm9sbGJhcihjbGllbnQsIG9yaWVudGF0aW9uLCBzaXplKTsKKyAgICBT
dWdnZXN0aW9uc1BvcHVwTWVudUNsaWVudDo6aW5pdGlhbGl6ZSh0ZXh0RmllbGQsIGRlZmF1bHRT
dWdnZXN0aW9uSW5kZXgpOwogfQogCiB2b2lkIEF1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVudDo6
c2V0U3VnZ2VzdGlvbnMoY29uc3QgV2ViVmVjdG9yPFdlYlN0cmluZz4mIHN1Z2dlc3Rpb25zKQpA
QCAtMTUxLDI4ICs3OSwxMCBAQCB2b2lkIEF1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVudDo6c2V0
U3VnCiAgICAgbV9zdWdnZXN0aW9ucy5jbGVhcigpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBp
IDwgc3VnZ2VzdGlvbnMuc2l6ZSgpOyArK2kpCiAgICAgICAgIG1fc3VnZ2VzdGlvbnMuYXBwZW5k
KHN1Z2dlc3Rpb25zW2ldKTsKLSAgICAvLyBUcnkgdG8gcHJlc2VydmUgc2VsZWN0aW9uIGlmIHBv
c3NpYmxlLgotICAgIGlmIChtX3NlbGVjdGVkSW5kZXggPj0gc3RhdGljX2Nhc3Q8aW50PihzdWdn
ZXN0aW9ucy5zaXplKCkpKQotICAgICAgICBtX3NlbGVjdGVkSW5kZXggPSAtMTsKLX0KIAotdm9p
ZCBBdXRvY29tcGxldGVQb3B1cE1lbnVDbGllbnQ6OnJlbW92ZUl0ZW1BdEluZGV4KGludCBpbmRl
eCkKLXsKLSAgICBBU1NFUlQoaW5kZXggPj0gMCAmJiBpbmRleCA8IHN0YXRpY19jYXN0PGludD4o
bV9zdWdnZXN0aW9ucy5zaXplKCkpKTsKLSAgICBtX3N1Z2dlc3Rpb25zLnJlbW92ZShpbmRleCk7
Ci19Ci0KLVJlbmRlclN0eWxlKiBBdXRvY29tcGxldGVQb3B1cE1lbnVDbGllbnQ6OnRleHRGaWVs
ZFN0eWxlKCkgY29uc3QKLXsKLSAgICBSZW5kZXJTdHlsZSogc3R5bGUgPSBtX3RleHRGaWVsZC0+
Y29tcHV0ZWRTdHlsZSgpOwotICAgIGlmICghc3R5bGUpIHsKLSAgICAgICAgLy8gSXQgc2VlbXMg
d2UgY2FuIG9ubHkgaGF2ZSBhIDAgc3R5bGUgaW4gYSBUZXh0RmllbGQgaWYgdGhlCi0gICAgICAg
IC8vIG5vZGUgaXMgZGV0YWNoZWQsIGluIHdoaWNoIGNhc2Ugd2UgdGhlIHBvcHVwIHNob3VkIG5v
dCBiZQotICAgICAgICAvLyBzaG93aW5nLiAgUGxlYXNlIHJlcG9ydCB0aGlzIGluIGh0dHA6Ly9j
cmJ1Zy5jb20vNzcwOCBhbmQKLSAgICAgICAgLy8gaW5jbHVkZSB0aGUgcGFnZSB5b3Ugd2VyZSB2
aXNpdGluZy4KLSAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Ci0gICAgfQotICAgIHJldHVy
biBzdHlsZTsKKyAgICAvLyBUcnkgdG8gcHJlc2VydmUgc2VsZWN0aW9uIGlmIHBvc3NpYmxlLgor
ICAgIGlmIChnZXRTZWxlY3RlZEluZGV4KCkgPj0gc3RhdGljX2Nhc3Q8aW50PihzdWdnZXN0aW9u
cy5zaXplKCkpKQorICAgICAgICBzZXRTZWxlY3RlZEluZGV4KC0xKTsKIH0KIAogfSAvLyBuYW1l
c3BhY2UgV2ViS2l0CkluZGV4OiBXZWJLaXQvY2hyb21pdW0vc3JjL0F1dG9jb21wbGV0ZVBvcHVw
TWVudUNsaWVudC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdC9jaHJvbWl1bS9zcmMvQXV0b2NvbXBs
ZXRlUG9wdXBNZW51Q2xpZW50LmgJKHJldmlzaW9uIDU0NTAxKQorKysgV2ViS2l0L2Nocm9taXVt
L3NyYy9BdXRvY29tcGxldGVQb3B1cE1lbnVDbGllbnQuaAkod29ya2luZyBjb3B5KQpAQCAtMSw1
ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgR29vZ2xlIEluYy4gQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRz
IHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBi
aW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0
dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQpAQCAtMjgsNyAr
MjgsMTAgQEAKICAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9T
U0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCiAgKi8KIAotI2luY2x1ZGUgIlBvcHVwTWVudUNsaWVu
dC5oIgorI2lmbmRlZiBBdXRvY29tcGxldGVQb3B1cE1lbnVDbGllbnRfaAorI2RlZmluZSBBdXRv
Y29tcGxldGVQb3B1cE1lbnVDbGllbnRfaAorIAorI2luY2x1ZGUgIlN1Z2dlc3Rpb25zUG9wdXBN
ZW51Q2xpZW50LmgiCiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIGNsYXNzIEhUTUxJbnB1dEVsZW1l
bnQ7CkBAIC00Miw1NSArNDUsMjMgQEAgY2xhc3MgV2ViVmlld0ltcGw7CiB0ZW1wbGF0ZSA8dHlw
ZW5hbWUgVD4gY2xhc3MgV2ViVmVjdG9yOwogCiAvLyBBdXRvY29tcGxldGVQb3B1cE1lbnVDbGll
bnQKLWNsYXNzIEF1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVudCA6IHB1YmxpYyBXZWJDb3JlOjpQ
b3B1cE1lbnVDbGllbnQgeworY2xhc3MgQXV0b2NvbXBsZXRlUG9wdXBNZW51Q2xpZW50IDogcHVi
bGljIFN1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50IHsKIHB1YmxpYzoKLSAgICBBdXRvY29tcGxl
dGVQb3B1cE1lbnVDbGllbnQoV2ViVmlld0ltcGwqIHdlYnZpZXcpOwotICAgIH5BdXRvY29tcGxl
dGVQb3B1cE1lbnVDbGllbnQoKTsKKyAgICAvLyBTdWdnZXN0aW9uc1BvcHVwTWVudUNsaWVudCBp
bXBsZW1lbnRhdGlvbjoKKyAgICB2aXJ0dWFsIHVuc2lnbmVkIGdldFN1Z2dlc3Rpb25zQ291bnQo
KSBjb25zdDsKKyAgICB2aXJ0dWFsIFdlYlN0cmluZyBnZXRTdWdnZXN0aW9uKHVuc2lnbmVkIGxp
c3RJbmRleCkgY29uc3Q7CisgICAgdmlydHVhbCB2b2lkIHJlbW92ZVN1Z2dlc3Rpb25BdEluZGV4
KHVuc2lnbmVkIGxpc3RJbmRleCk7CiAKICAgICB2b2lkIGluaXRpYWxpemUoV2ViQ29yZTo6SFRN
TElucHV0RWxlbWVudCosCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdlYlZlY3RvcjxXZWJT
dHJpbmc+JiBzdWdnZXN0aW9ucywKICAgICAgICAgICAgICAgICAgICAgaW50IGRlZmF1bHRTdWdn
ZXN0aW9uSW5kZXgpOwogCi0gICAgV2ViQ29yZTo6SFRNTElucHV0RWxlbWVudCogdGV4dEZpZWxk
KCkgY29uc3QgeyByZXR1cm4gbV90ZXh0RmllbGQuZ2V0KCk7IH0KLQogICAgIHZvaWQgc2V0U3Vn
Z2VzdGlvbnMoY29uc3QgV2ViVmVjdG9yPFdlYlN0cmluZz4mKTsKLSAgICB2b2lkIHJlbW92ZUl0
ZW1BdEluZGV4KGludCBpbmRleCk7Ci0KLSAgICAvLyBXZWJDb3JlOjpQb3B1cE1lbnVDbGllbnQg
bWV0aG9kczoKLSAgICB2aXJ0dWFsIHZvaWQgdmFsdWVDaGFuZ2VkKHVuc2lnbmVkIGxpc3RJbmRl
eCwgYm9vbCBmaXJlRXZlbnRzID0gdHJ1ZSk7Ci0gICAgdmlydHVhbCBXZWJDb3JlOjpTdHJpbmcg
aXRlbVRleHQodW5zaWduZWQgbGlzdEluZGV4KSBjb25zdDsKLSAgICB2aXJ0dWFsIFdlYkNvcmU6
OlN0cmluZyBpdGVtVG9vbFRpcCh1bnNpZ25lZCBsYXN0SW5kZXgpIGNvbnN0IHsgcmV0dXJuIFdl
YkNvcmU6OlN0cmluZygpOyB9Ci0gICAgdmlydHVhbCBib29sIGl0ZW1Jc0VuYWJsZWQodW5zaWdu
ZWQgbGlzdEluZGV4KSBjb25zdCB7IHJldHVybiB0cnVlOyB9Ci0gICAgdmlydHVhbCBXZWJDb3Jl
OjpQb3B1cE1lbnVTdHlsZSBpdGVtU3R5bGUodW5zaWduZWQgbGlzdEluZGV4KSBjb25zdDsKLSAg
ICB2aXJ0dWFsIFdlYkNvcmU6OlBvcHVwTWVudVN0eWxlIG1lbnVTdHlsZSgpIGNvbnN0OwotICAg
IHZpcnR1YWwgaW50IGNsaWVudEluc2V0TGVmdCgpIGNvbnN0IHsgcmV0dXJuIDA7IH0KLSAgICB2
aXJ0dWFsIGludCBjbGllbnRJbnNldFJpZ2h0KCkgY29uc3QgeyByZXR1cm4gMDsgfQotICAgIHZp
cnR1YWwgaW50IGNsaWVudFBhZGRpbmdMZWZ0KCkgY29uc3Q7Ci0gICAgdmlydHVhbCBpbnQgY2xp
ZW50UGFkZGluZ1JpZ2h0KCkgY29uc3Q7Ci0gICAgdmlydHVhbCBpbnQgbGlzdFNpemUoKSBjb25z
dCB7IHJldHVybiBtX3N1Z2dlc3Rpb25zLnNpemUoKTsgfQotICAgIHZpcnR1YWwgaW50IHNlbGVj
dGVkSW5kZXgoKSBjb25zdCB7IHJldHVybiBtX3NlbGVjdGVkSW5kZXg7IH0KLSAgICB2aXJ0dWFs
IHZvaWQgcG9wdXBEaWRIaWRlKCk7Ci0gICAgdmlydHVhbCBib29sIGl0ZW1Jc1NlcGFyYXRvcih1
bnNpZ25lZCBsaXN0SW5kZXgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0gICAgdmlydHVhbCBi
b29sIGl0ZW1Jc0xhYmVsKHVuc2lnbmVkIGxpc3RJbmRleCkgY29uc3QgeyByZXR1cm4gZmFsc2U7
IH0KLSAgICB2aXJ0dWFsIGJvb2wgaXRlbUlzU2VsZWN0ZWQodW5zaWduZWQgbGlzdEluZGV4KSBj
b25zdCB7IHJldHVybiBmYWxzZTsgfQotICAgIHZpcnR1YWwgYm9vbCBzaG91bGRQb3BPdmVyKCkg
Y29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLSAgICB2aXJ0dWFsIGJvb2wgdmFsdWVTaG91bGRDaGFu
Z2VPbkhvdFRyYWNrKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLSAgICB2aXJ0dWFsIHZvaWQg
c2V0VGV4dEZyb21JdGVtKHVuc2lnbmVkIGxpc3RJbmRleCk7Ci0gICAgdmlydHVhbCBXZWJDb3Jl
OjpGb250U2VsZWN0b3IqIGZvbnRTZWxlY3RvcigpIGNvbnN0OwotICAgIHZpcnR1YWwgV2ViQ29y
ZTo6SG9zdFdpbmRvdyogaG9zdFdpbmRvdygpIGNvbnN0OwotICAgIHZpcnR1YWwgUGFzc1JlZlB0
cjxXZWJDb3JlOjpTY3JvbGxiYXI+IGNyZWF0ZVNjcm9sbGJhcigKLSAgICAgICAgV2ViQ29yZTo6
U2Nyb2xsYmFyQ2xpZW50KiBjbGllbnQsCi0gICAgICAgIFdlYkNvcmU6OlNjcm9sbGJhck9yaWVu
dGF0aW9uIG9yaWVudGF0aW9uLAotICAgICAgICBXZWJDb3JlOjpTY3JvbGxiYXJDb250cm9sU2l6
ZSBzaXplKTsKIAogcHJpdmF0ZToKLSAgICBXZWJDb3JlOjpSZW5kZXJTdHlsZSogdGV4dEZpZWxk
U3R5bGUoKSBjb25zdDsKLQotICAgIFJlZlB0cjxXZWJDb3JlOjpIVE1MSW5wdXRFbGVtZW50PiBt
X3RleHRGaWVsZDsKICAgICBWZWN0b3I8V2ViQ29yZTo6U3RyaW5nPiBtX3N1Z2dlc3Rpb25zOwot
ICAgIGludCBtX3NlbGVjdGVkSW5kZXg7Ci0gICAgV2ViVmlld0ltcGwqIG1fd2ViVmlldzsKLSAg
ICBPd25QdHI8V2ViQ29yZTo6UG9wdXBNZW51U3R5bGU+IG1fc3R5bGU7CiB9OwogCiB9IC8vIG5h
bWVzcGFjZSBXZWJLaXQKKworI2VuZGlmCkluZGV4OiBXZWJLaXQvY2hyb21pdW0vc3JjL1N1Z2dl
c3Rpb25zUG9wdXBNZW51Q2xpZW50LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQvY2hyb21pdW0v
c3JjL1N1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50LmNwcAkocmV2aXNpb24gMCkKKysrIFdlYktp
dC9jaHJvbWl1bS9zcmMvU3VnZ2VzdGlvbnNQb3B1cE1lbnVDbGllbnQuY3BwCShyZXZpc2lvbiAw
KQpAQCAtMCwwICsxLDI0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5j
LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g
c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9u
LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFy
ZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBt
dXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5
cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
IHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRo
ZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRv
cnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJv
bQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlz
c2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQg
SE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJ
TVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhF
IElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisg
KiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwg
VEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5Z
IERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9S
IENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRP
LCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVT
RSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZF
UiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBD
T05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdF
TkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBP
RiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNV
Q0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJTdWdnZXN0
aW9uc1BvcHVwTWVudUNsaWVudC5oIgorCisvLyBGSVhNRTogTWFrZSBzdXJlIHdlIG5lZWQgYWxs
IG9mIHRoZXNlIGluY2x1ZGVzLgorI2luY2x1ZGUgIkNTU1N0eWxlU2VsZWN0b3IuaCIKKyNpbmNs
dWRlICJDU1NWYWx1ZUtleXdvcmRzLmgiCisjaW5jbHVkZSAiQ2hyb21lLmgiCisjaW5jbHVkZSAi
RnJhbWVWaWV3LmgiCisjaW5jbHVkZSAiSFRNTElucHV0RWxlbWVudC5oIgorI2luY2x1ZGUgIlJl
bmRlclRoZW1lLmgiCisjaW5jbHVkZSAiV2ViVmVjdG9yLmgiCisjaW5jbHVkZSAiV2ViVmlld0lt
cGwuaCIKKwordXNpbmcgbmFtZXNwYWNlIFdlYkNvcmU7CisKK25hbWVzcGFjZSBXZWJLaXQgewor
CitTdWdnZXN0aW9uc1BvcHVwTWVudUNsaWVudDo6U3VnZ2VzdGlvbnNQb3B1cE1lbnVDbGllbnQo
KQorICAgIDogbV90ZXh0RmllbGQoMCkKKyAgICAsIG1fc2VsZWN0ZWRJbmRleCgwKQoreworfQor
CitTdWdnZXN0aW9uc1BvcHVwTWVudUNsaWVudDo6flN1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50
KCkKK3sKK30KKworLy8gRklYTUU6IEltcGxlbWVudCB0aGlzIHBlci1kZXJpdmVkIGNsYXNzPwor
dm9pZCBTdWdnZXN0aW9uc1BvcHVwTWVudUNsaWVudDo6dmFsdWVDaGFuZ2VkKHVuc2lnbmVkIGxp
c3RJbmRleCwgYm9vbCBmaXJlRXZlbnRzKQoreworICAgIG1fdGV4dEZpZWxkLT5zZXRWYWx1ZShn
ZXRTdWdnZXN0aW9uKGxpc3RJbmRleCkpOworCisgICAgRWRpdG9yQ2xpZW50SW1wbCogZWRpdG9y
ID0KKyAgICAgICAgc3RhdGljX2Nhc3Q8RWRpdG9yQ2xpZW50SW1wbCo+KGdldFdlYlZpZXcoKS0+
cGFnZSgpLT5lZGl0b3JDbGllbnQoKSk7CisgICAgQVNTRVJUKGVkaXRvcik7CisgICAgZWRpdG9y
LT5vbkF1dG9maWxsU3VnZ2VzdGlvbkFjY2VwdGVkKAorICAgICAgICBzdGF0aWNfY2FzdDxIVE1M
SW5wdXRFbGVtZW50Kj4obV90ZXh0RmllbGQuZ2V0KCkpKTsKK30KKwordm9pZCBTdWdnZXN0aW9u
c1BvcHVwTWVudUNsaWVudDo6c2VsZWN0aW9uQ2hhbmdlZCh1bnNpZ25lZCBsaXN0SW5kZXgsIGJv
b2wgZmlyZUV2ZW50cykKK3sKKyAgICBpZiAobGlzdEluZGV4ICE9IHN0YXRpY19jYXN0PHVuc2ln
bmVkPigtMSkpIHsKKyAgICAgICAgY29uc3QgV2ViU3RyaW5nJiBzdWdnZXN0aW9uID0gZ2V0U3Vn
Z2VzdGlvbihsaXN0SW5kZXgpOworICAgICAgICBzZXRTdWdnZXN0ZWRWYWx1ZShzdWdnZXN0aW9u
KTsKKyAgICB9IGVsc2UgeworICAgICAgbV90ZXh0RmllbGQtPnNldFZhbHVlKG1fdHlwZWRGaWVs
ZFZhbHVlKTsKKyAgICAgIGlmIChtX2xhc3RGaWVsZFZhbHVlcy0+Y29udGFpbnMobV90ZXh0Rmll
bGQtPm5hbWUoKSkpCisgICAgICAgICAgbV9sYXN0RmllbGRWYWx1ZXMtPnNldChtX3RleHRGaWVs
ZC0+bmFtZSgpLCBtX3R5cGVkRmllbGRWYWx1ZSk7CisgICAgICBlbHNlCisgICAgICAgICAgbV9s
YXN0RmllbGRWYWx1ZXMtPmFkZChtX3RleHRGaWVsZC0+bmFtZSgpLCBtX3R5cGVkRmllbGRWYWx1
ZSk7CisgICAgfQorfQorCitTdHJpbmcgU3VnZ2VzdGlvbnNQb3B1cE1lbnVDbGllbnQ6Oml0ZW1U
ZXh0KHVuc2lnbmVkIGxpc3RJbmRleCkgY29uc3QKK3sKKyAgICByZXR1cm4gZ2V0U3VnZ2VzdGlv
bihsaXN0SW5kZXgpOworfQorCitQb3B1cE1lbnVTdHlsZSBTdWdnZXN0aW9uc1BvcHVwTWVudUNs
aWVudDo6aXRlbVN0eWxlKHVuc2lnbmVkIGxpc3RJbmRleCkgY29uc3QKK3sKKyAgICByZXR1cm4g
Km1fc3R5bGU7Cit9CisKK1BvcHVwTWVudVN0eWxlIFN1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50
OjptZW51U3R5bGUoKSBjb25zdAoreworICAgIHJldHVybiAqbV9zdHlsZTsKK30KKworaW50IFN1
Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50OjpjbGllbnRQYWRkaW5nTGVmdCgpIGNvbnN0Cit7Cisg
ICAgLy8gQnVnIGh0dHA6Ly9jcmJ1Zy5jb20vNzcwOCBzZWVtcyB0byBpbmRpY2F0ZSB0aGUgc3R5
bGUgY2FuIGJlIDAuCisgICAgUmVuZGVyU3R5bGUqIHN0eWxlID0gdGV4dEZpZWxkU3R5bGUoKTsK
KyAgICBpZiAoIXN0eWxlKQorICAgICAgIHJldHVybiAwOworCisgICAgcmV0dXJuIGdldFdlYlZp
ZXcoKS0+dGhlbWUoKS0+cG9wdXBJbnRlcm5hbFBhZGRpbmdMZWZ0KHN0eWxlKTsKK30KKworaW50
IFN1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50OjpjbGllbnRQYWRkaW5nUmlnaHQoKSBjb25zdAor
eworICAgIC8vIEJ1ZyBodHRwOi8vY3JidWcuY29tLzc3MDggc2VlbXMgdG8gaW5kaWNhdGUgdGhl
IHN0eWxlIGNhbiBiZSAwLgorICAgIFJlbmRlclN0eWxlKiBzdHlsZSA9IHRleHRGaWVsZFN0eWxl
KCk7CisgICAgaWYgKCFzdHlsZSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICByZXR1cm4gZ2V0
V2ViVmlldygpLT50aGVtZSgpLT5wb3B1cEludGVybmFsUGFkZGluZ1JpZ2h0KHN0eWxlKTsKK30K
Kwordm9pZCBTdWdnZXN0aW9uc1BvcHVwTWVudUNsaWVudDo6cG9wdXBEaWRIaWRlKCkKK3sKKyAg
ICBtX3RleHRGaWVsZC0+c2V0VmFsdWUobV90eXBlZEZpZWxkVmFsdWUpOworICAgIHJlc2V0TGFz
dFN1Z2dlc3Rpb24oKTsKKyAgICBnZXRXZWJWaWV3KCktPnN1Z2dlc3Rpb25zUG9wdXBEaWRIaWRl
KCk7Cit9CisKK3ZvaWQgU3VnZ2VzdGlvbnNQb3B1cE1lbnVDbGllbnQ6OnNldFRleHRGcm9tSXRl
bSh1bnNpZ25lZCBsaXN0SW5kZXgpCit7CisgICAgbV90ZXh0RmllbGQtPnNldFZhbHVlKGdldFN1
Z2dlc3Rpb24obGlzdEluZGV4KSk7CisgICAgcmVzZXRMYXN0U3VnZ2VzdGlvbigpOworfQorCit2
b2lkIFN1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50OjpyZXNldExhc3RTdWdnZXN0aW9uKCkKK3sK
KyAgICBpZiAobV9sYXN0RmllbGRWYWx1ZXMtPmNvbnRhaW5zKG1fdGV4dEZpZWxkLT5uYW1lKCkp
KQorICAgICAgICBtX2xhc3RGaWVsZFZhbHVlcy0+c2V0KG1fdGV4dEZpZWxkLT5uYW1lKCksIG1f
dGV4dEZpZWxkLT52YWx1ZSgpKTsKKyAgICBlbHNlCisgICAgICAgIG1fbGFzdEZpZWxkVmFsdWVz
LT5hZGQobV90ZXh0RmllbGQtPm5hbWUoKSwgbV90ZXh0RmllbGQtPnZhbHVlKCkpOworfQorCitG
b250U2VsZWN0b3IqIFN1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50Ojpmb250U2VsZWN0b3IoKSBj
b25zdAoreworICAgIHJldHVybiBtX3RleHRGaWVsZC0+ZG9jdW1lbnQoKS0+c3R5bGVTZWxlY3Rv
cigpLT5mb250U2VsZWN0b3IoKTsKK30KKworSG9zdFdpbmRvdyogU3VnZ2VzdGlvbnNQb3B1cE1l
bnVDbGllbnQ6Omhvc3RXaW5kb3coKSBjb25zdAoreworICAgIHJldHVybiBtX3RleHRGaWVsZC0+
ZG9jdW1lbnQoKS0+dmlldygpLT5ob3N0V2luZG93KCk7Cit9CisKK1Bhc3NSZWZQdHI8U2Nyb2xs
YmFyPiBTdWdnZXN0aW9uc1BvcHVwTWVudUNsaWVudDo6Y3JlYXRlU2Nyb2xsYmFyKAorICAgIFNj
cm9sbGJhckNsaWVudCogY2xpZW50LAorICAgIFNjcm9sbGJhck9yaWVudGF0aW9uIG9yaWVudGF0
aW9uLAorICAgIFNjcm9sbGJhckNvbnRyb2xTaXplIHNpemUpCit7CisgICAgcmV0dXJuIFNjcm9s
bGJhcjo6Y3JlYXRlTmF0aXZlU2Nyb2xsYmFyKGNsaWVudCwgb3JpZW50YXRpb24sIHNpemUpOwor
fQorCitSZW5kZXJTdHlsZSogU3VnZ2VzdGlvbnNQb3B1cE1lbnVDbGllbnQ6OnRleHRGaWVsZFN0
eWxlKCkgY29uc3QKK3sKKyAgICBSZW5kZXJTdHlsZSogc3R5bGUgPSBtX3RleHRGaWVsZC0+Y29t
cHV0ZWRTdHlsZSgpOworICAgIGlmICghc3R5bGUpIHsKKyAgICAgICAgLy8gSXQgc2VlbXMgd2Ug
Y2FuIG9ubHkgaGF2ZSBhIDAgc3R5bGUgaW4gYSBUZXh0RmllbGQgaWYgdGhlCisgICAgICAgIC8v
IG5vZGUgaXMgZGV0YWNoZWQsIGluIHdoaWNoIGNhc2Ugd2UgdGhlIHBvcHVwIHNob3VkIG5vdCBi
ZQorICAgICAgICAvLyBzaG93aW5nLiAgUGxlYXNlIHJlcG9ydCB0aGlzIGluIGh0dHA6Ly9jcmJ1
Zy5jb20vNzcwOCBhbmQKKyAgICAgICAgLy8gaW5jbHVkZSB0aGUgcGFnZSB5b3Ugd2VyZSB2aXNp
dGluZy4KKyAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgfQorICAgIHJldHVybiBz
dHlsZTsKK30KKwordm9pZCBTdWdnZXN0aW9uc1BvcHVwTWVudUNsaWVudDo6aW5pdGlhbGl6ZShI
VE1MSW5wdXRFbGVtZW50KiB0ZXh0RmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGludCBkZWZhdWx0U3VnZ2VzdGlvbkluZGV4KQoreworICAgIGlmICgh
bV9sYXN0RmllbGRWYWx1ZXMpCisgICAgICAgIG1fbGFzdEZpZWxkVmFsdWVzLnNldChuZXcgRmll
bGRWYWx1ZXNNYXApOworCisgICAgbV90ZXh0RmllbGQgPSB0ZXh0RmllbGQ7CisgICAgbV90eXBl
ZEZpZWxkVmFsdWUgPSB0ZXh0RmllbGQtPnZhbHVlKCk7CisgICAgbV9zZWxlY3RlZEluZGV4ID0g
ZGVmYXVsdFN1Z2dlc3Rpb25JbmRleDsKKworICAgIHNldEluaXRpYWxTdWdnZXN0aW9uKCk7CisK
KyAgICBGb250RGVzY3JpcHRpb24gZm9udERlc2NyaXB0aW9uOworICAgIGdldFdlYlZpZXcoKS0+
dGhlbWUoKS0+c3lzdGVtRm9udChDU1NWYWx1ZVdlYmtpdENvbnRyb2wsIGZvbnREZXNjcmlwdGlv
bik7CisgICAgLy8gVXNlIGEgc21hbGxlciBmb250IHNpemUgdG8gbWF0Y2ggSUUvRmlyZWZveC4K
KyAgICAvLyBGSVhNRTogaHR0cDovL2NyYnVnLmNvbS83Mzc2IHVzZSB0aGUgc3lzdGVtIHNpemUg
aW5zdGVhZCBvZiBhCisgICAgLy8gICAgICAgIGZpeGVkIGZvbnQgc2l6ZSB2YWx1ZS4KKyAgICBm
b250RGVzY3JpcHRpb24uc2V0Q29tcHV0ZWRTaXplKDEyLjApOworICAgIEZvbnQgZm9udChmb250
RGVzY3JpcHRpb24sIDAsIDApOworICAgIGZvbnQudXBkYXRlKHRleHRGaWVsZC0+ZG9jdW1lbnQo
KS0+c3R5bGVTZWxlY3RvcigpLT5mb250U2VsZWN0b3IoKSk7CisgICAgLy8gVGhlIGRpcmVjdGlv
biBvZiB0ZXh0IGluIHBvcHVwIG1lbnUgaXMgc2V0IHRoZSBzYW1lIGFzIHRoZSBkaXJlY3Rpb24g
b2YKKyAgICAvLyB0aGUgaW5wdXQgZWxlbWVudDogdGV4dEZpZWxkLgorICAgIG1fc3R5bGUuc2V0
KG5ldyBQb3B1cE1lbnVTdHlsZShDb2xvcjo6YmxhY2ssIENvbG9yOjp3aGl0ZSwgZm9udCwgdHJ1
ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGVuZ3RoKFdlYkNvcmU6OkZp
eGVkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dEZpZWxkLT5yZW5k
ZXJlcigpLT5zdHlsZSgpLT5kaXJlY3Rpb24oKSkpOworfQorCit2b2lkIFN1Z2dlc3Rpb25zUG9w
dXBNZW51Q2xpZW50OjpzZXRJbml0aWFsU3VnZ2VzdGlvbigpCit7CisgICAgaWYgKCFnZXRTdWdn
ZXN0aW9uc0NvdW50KCkgfHwgIW1fdGV4dEZpZWxkLT5uYW1lKCkubGVuZ3RoKCkgfHwgIW1fdHlw
ZWRGaWVsZFZhbHVlLmxlbmd0aCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBpbnQgbmV3SW5k
ZXggPSBtX3NlbGVjdGVkSW5kZXggPj0gMCA/IG1fc2VsZWN0ZWRJbmRleCA6IDA7CisgICAgY29u
c3QgU3RyaW5nJiBzdWdnZXN0aW9uID0gZ2V0U3VnZ2VzdGlvbihuZXdJbmRleCk7CisgICAgYm9v
bCBoYXNQcmV2aW91c1ZhbHVlID0gbV9sYXN0RmllbGRWYWx1ZXMtPmNvbnRhaW5zKG1fdGV4dEZp
ZWxkLT5uYW1lKCkpOworCisgICAgU3RyaW5nIHByZXZWYWx1ZTsKKyAgICBpZiAoaGFzUHJldmlv
dXNWYWx1ZSkKKyAgICAgICAgcHJldlZhbHVlID0gbV9sYXN0RmllbGRWYWx1ZXMtPmdldChtX3Rl
eHRGaWVsZC0+bmFtZSgpKTsKKworICAgIGlmICghaGFzUHJldmlvdXNWYWx1ZSB8fCBtX3R5cGVk
RmllbGRWYWx1ZS5sZW5ndGgoKSA+IG1fbGFzdEZpZWxkVmFsdWVzLT5nZXQobV90ZXh0RmllbGQt
Pm5hbWUoKSkubGVuZ3RoKCkpIHsKKyAgICAgICAgICBpZiAoc3VnZ2VzdGlvbi5zdGFydHNXaXRo
KG1fdHlwZWRGaWVsZFZhbHVlKSkKKyAgICAgICAgICAgICAgbV9zZWxlY3RlZEluZGV4ID0gbmV3
SW5kZXg7CisKKyAgICAgICAgICBpbnQgc3RhcnQgPSAwOworICAgICAgICAgIFN0cmluZyBuZXdT
dWdnZXN0aW9uID0gc3VnZ2VzdGlvbjsKKyAgICAgICAgICBpZiAoc3VnZ2VzdGlvbi5zdGFydHNX
aXRoKG1fdHlwZWRGaWVsZFZhbHVlLCBmYWxzZSkpIHsKKyAgICAgICAgICAgICAgbmV3U3VnZ2Vz
dGlvbiA9IG1fdHlwZWRGaWVsZFZhbHVlOworICAgICAgICAgICAgICBpZiAoc3VnZ2VzdGlvbi5s
ZW5ndGgoKSA+IG1fdHlwZWRGaWVsZFZhbHVlLmxlbmd0aCgpKSB7CisgICAgICAgICAgICAgICAg
ICBuZXdTdWdnZXN0aW9uLmFwcGVuZChzdWdnZXN0aW9uLnN1YnN0cmluZyhtX3R5cGVkRmllbGRW
YWx1ZS5sZW5ndGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICBzdWdnZXN0aW9uLmxlbmd0aCgp
IC0gbV90eXBlZEZpZWxkVmFsdWUubGVuZ3RoKCkpKTsKKyAgICAgICAgICAgICAgfQorICAgICAg
ICAgICAgICBzdGFydCA9IG1fdHlwZWRGaWVsZFZhbHVlLmxlbmd0aCgpOworICAgICAgICAgIH0K
KworICAgICAgICAgIG1fdGV4dEZpZWxkLT5zZXRTdWdnZXN0ZWRWYWx1ZShuZXdTdWdnZXN0aW9u
KTsKKyAgICAgICAgICBtX3RleHRGaWVsZC0+c2V0U2VsZWN0aW9uUmFuZ2Uoc3RhcnQsIG5ld1N1
Z2dlc3Rpb24ubGVuZ3RoKCkpOworICAgIH0KKworICAgIGlmIChoYXNQcmV2aW91c1ZhbHVlKQor
ICAgICAgICBtX2xhc3RGaWVsZFZhbHVlcy0+c2V0KG1fdGV4dEZpZWxkLT5uYW1lKCksIG1fdHlw
ZWRGaWVsZFZhbHVlKTsKKyAgICBlbHNlCisgICAgICAgIG1fbGFzdEZpZWxkVmFsdWVzLT5hZGQo
bV90ZXh0RmllbGQtPm5hbWUoKSwgbV90eXBlZEZpZWxkVmFsdWUpOworfQorCit2b2lkIFN1Z2dl
c3Rpb25zUG9wdXBNZW51Q2xpZW50OjpzZXRTdWdnZXN0ZWRWYWx1ZShjb25zdCBXZWJTdHJpbmcm
IHN1Z2dlc3Rpb24pCit7CisgICAgbV90ZXh0RmllbGQtPnNldFN1Z2dlc3RlZFZhbHVlKHN1Z2dl
c3Rpb24pOworICAgIG1fdGV4dEZpZWxkLT5zZXRTZWxlY3Rpb25SYW5nZShtX3R5cGVkRmllbGRW
YWx1ZS5sZW5ndGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VnZ2Vz
dGlvbi5sZW5ndGgoKSk7Cit9CisKK1dlYlZpZXdJbXBsKiBTdWdnZXN0aW9uc1BvcHVwTWVudUNs
aWVudDo6Z2V0V2ViVmlldygpIGNvbnN0Cit7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PENocm9t
ZUNsaWVudEltcGwqPigKKyAgICAgICAgbV90ZXh0RmllbGQtPmRvY3VtZW50KCktPmZyYW1lKCkt
PnBhZ2UoKS0+Y2hyb21lKCktPmNsaWVudCgpKS0+d2ViVmlldygpOworfQorCit9IC8vIG5hbWVz
cGFjZSBXZWJLaXQKSW5kZXg6IFdlYktpdC9jaHJvbWl1bS9zcmMvU3VnZ2VzdGlvbnNQb3B1cE1l
bnVDbGllbnQuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQvY2hyb21pdW0vc3JjL1N1Z2dlc3Rpb25z
UG9wdXBNZW51Q2xpZW50LmgJKHJldmlzaW9uIDApCisrKyBXZWJLaXQvY2hyb21pdW0vc3JjL1N1
Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50LmgJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMTE4IEBA
CisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICog
ICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkg
Zm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRo
ZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUK
KyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIElu
Yy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBl
bmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJl
IHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMg
U09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklC
VVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywg
SU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVT
IE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQ
T1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBP
V05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwg
SU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1B
R0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNV
QlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJP
RklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5Z
CisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElB
QklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBB
UklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVW
RU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKwor
I2luY2x1ZGUgIlBvcHVwTWVudUNsaWVudC5oIgorCisjaWZuZGVmIFN1Z2dlc3Rpb25zUG9wdXBN
ZW51Q2xpZW50X2gKKyNkZWZpbmUgU3VnZ2VzdGlvbnNQb3B1cE1lbnVDbGllbnRfaAorCituYW1l
c3BhY2UgV2ViQ29yZSB7CitjbGFzcyBIVE1MSW5wdXRFbGVtZW50OworY2xhc3MgUG9wdXBNZW51
U3R5bGU7CitjbGFzcyBSZW5kZXJTdHlsZTsKK30KKworbmFtZXNwYWNlIFdlYktpdCB7CitjbGFz
cyBXZWJTdHJpbmc7CitjbGFzcyBXZWJWaWV3SW1wbDsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBj
bGFzcyBXZWJWZWN0b3I7CisKKy8vIAorY2xhc3MgU3VnZ2VzdGlvbnNQb3B1cE1lbnVDbGllbnQg
OiBwdWJsaWMgV2ViQ29yZTo6UG9wdXBNZW51Q2xpZW50IHsKK3B1YmxpYzoKKyAgICBTdWdnZXN0
aW9uc1BvcHVwTWVudUNsaWVudCgpOworICAgIHZpcnR1YWwgflN1Z2dlc3Rpb25zUG9wdXBNZW51
Q2xpZW50KCk7CisKKyAgICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2Ygc3VnZ2VzdGlvbnMgYXZh
aWxhYmxlLgorICAgIHZpcnR1YWwgdW5zaWduZWQgZ2V0U3VnZ2VzdGlvbnNDb3VudCgpIGNvbnN0
ID0gMDsKKworICAgIC8vIFJldHVybnMgdGhlIHN1Z2dlc3Rpb24gYXQgfGxpc3RJbmRleHwuCisg
ICAgdmlydHVhbCBXZWJTdHJpbmcgZ2V0U3VnZ2VzdGlvbih1bnNpZ25lZCBsaXN0SW5kZXgpIGNv
bnN0ID0gMDsKKworICAgIC8vIFJlbW92ZXMgdGhlIHN1Z2dlc3Rpb24gYXQgfGxpc3RJbmRleHwg
ZnJvbSB0aGUgbGlzdCBvZiBzdWdnZXN0aW9ucy4KKyAgICB2aXJ0dWFsIHZvaWQgcmVtb3ZlU3Vn
Z2VzdGlvbkF0SW5kZXgodW5zaWduZWQgbGlzdEluZGV4KSA9IDA7CisKKyAgICAvLyBXZWJDb3Jl
OjpQb3B1cE1lbnVDbGllbnQgbWV0aG9kczoKKyAgICB2aXJ0dWFsIHZvaWQgdmFsdWVDaGFuZ2Vk
KHVuc2lnbmVkIGxpc3RJbmRleCwgYm9vbCBmaXJlRXZlbnRzID0gdHJ1ZSk7CisgICAgdmlydHVh
bCB2b2lkIHNlbGVjdGlvbkNoYW5nZWQodW5zaWduZWQgbGlzdEluZGV4LCBib29sIGZpcmVFdmVu
dHMgPSB0cnVlKTsKKyAgICB2aXJ0dWFsIFdlYkNvcmU6OlN0cmluZyBpdGVtVGV4dCh1bnNpZ25l
ZCBsaXN0SW5kZXgpIGNvbnN0OworICAgIHZpcnR1YWwgV2ViQ29yZTo6U3RyaW5nIGl0ZW1Ub29s
VGlwKHVuc2lnbmVkIGxhc3RJbmRleCkgY29uc3QgeyByZXR1cm4gV2ViQ29yZTo6U3RyaW5nKCk7
IH0KKyAgICB2aXJ0dWFsIGJvb2wgaXRlbUlzRW5hYmxlZCh1bnNpZ25lZCBsaXN0SW5kZXgpIGNv
bnN0IHsgcmV0dXJuIHRydWU7IH0KKyAgICB2aXJ0dWFsIFdlYkNvcmU6OlBvcHVwTWVudVN0eWxl
IGl0ZW1TdHlsZSh1bnNpZ25lZCBsaXN0SW5kZXgpIGNvbnN0OworICAgIHZpcnR1YWwgV2ViQ29y
ZTo6UG9wdXBNZW51U3R5bGUgbWVudVN0eWxlKCkgY29uc3Q7CisgICAgdmlydHVhbCBpbnQgY2xp
ZW50SW5zZXRMZWZ0KCkgY29uc3QgeyByZXR1cm4gMDsgfQorICAgIHZpcnR1YWwgaW50IGNsaWVu
dEluc2V0UmlnaHQoKSBjb25zdCB7IHJldHVybiAwOyB9CisgICAgdmlydHVhbCBpbnQgY2xpZW50
UGFkZGluZ0xlZnQoKSBjb25zdDsKKyAgICB2aXJ0dWFsIGludCBjbGllbnRQYWRkaW5nUmlnaHQo
KSBjb25zdDsKKyAgICB2aXJ0dWFsIGludCBsaXN0U2l6ZSgpIGNvbnN0IHsgcmV0dXJuIGdldFN1
Z2dlc3Rpb25zQ291bnQoKTsgfQorICAgIHZpcnR1YWwgaW50IHNlbGVjdGVkSW5kZXgoKSBjb25z
dCB7IHJldHVybiBtX3NlbGVjdGVkSW5kZXg7IH0KKyAgICB2aXJ0dWFsIHZvaWQgcG9wdXBEaWRI
aWRlKCk7CisgICAgdmlydHVhbCBib29sIGl0ZW1Jc1NlcGFyYXRvcih1bnNpZ25lZCBsaXN0SW5k
ZXgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgICAgdmlydHVhbCBib29sIGl0ZW1Jc0xhYmVs
KHVuc2lnbmVkIGxpc3RJbmRleCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgICB2aXJ0dWFs
IGJvb2wgaXRlbUlzU2VsZWN0ZWQodW5zaWduZWQgbGlzdEluZGV4KSBjb25zdCB7IHJldHVybiBm
YWxzZTsgfQorICAgIHZpcnR1YWwgYm9vbCBzaG91bGRQb3BPdmVyKCkgY29uc3QgeyByZXR1cm4g
ZmFsc2U7IH0KKyAgICB2aXJ0dWFsIGJvb2wgdmFsdWVTaG91bGRDaGFuZ2VPbkhvdFRyYWNrKCkg
Y29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgICB2aXJ0dWFsIHZvaWQgc2V0VGV4dEZyb21JdGVt
KHVuc2lnbmVkIGxpc3RJbmRleCk7CisgICAgdmlydHVhbCBXZWJDb3JlOjpGb250U2VsZWN0b3Iq
IGZvbnRTZWxlY3RvcigpIGNvbnN0OworICAgIHZpcnR1YWwgV2ViQ29yZTo6SG9zdFdpbmRvdyog
aG9zdFdpbmRvdygpIGNvbnN0OworICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxXZWJDb3JlOjpTY3Jv
bGxiYXI+IGNyZWF0ZVNjcm9sbGJhcigKKyAgICAgICAgV2ViQ29yZTo6U2Nyb2xsYmFyQ2xpZW50
KiBjbGllbnQsCisgICAgICAgIFdlYkNvcmU6OlNjcm9sbGJhck9yaWVudGF0aW9uIG9yaWVudGF0
aW9uLAorICAgICAgICBXZWJDb3JlOjpTY3JvbGxiYXJDb250cm9sU2l6ZSBzaXplKTsKKworcHJv
dGVjdGVkOgorICAgIHZvaWQgaW5pdGlhbGl6ZShXZWJDb3JlOjpIVE1MSW5wdXRFbGVtZW50KiB0
ZXh0RmllbGQsCisgICAgICAgICAgICAgICAgICAgIGludCBkZWZhdWx0U3VnZ2VzdGlvbkluZGV4
KTsKKyAgICB2b2lkIHNldEluaXRpYWxTdWdnZXN0aW9uKCk7CisKKyAgICBpbnQgZ2V0U2VsZWN0
ZWRJbmRleCgpIGNvbnN0IHsgcmV0dXJuIG1fc2VsZWN0ZWRJbmRleDsgfQorICAgIHZvaWQgc2V0
U2VsZWN0ZWRJbmRleChpbnQgaW5kZXgpIHsgbV9zZWxlY3RlZEluZGV4ID0gaW5kZXg7IH0KKwor
ICAgIHZvaWQgc2V0U3VnZ2VzdGVkVmFsdWUoY29uc3QgV2ViU3RyaW5nJiBzdWdnZXN0aW9uKTsK
KworICAgIFdlYlZpZXdJbXBsKiBnZXRXZWJWaWV3KCkgY29uc3Q7CisgICAgV2ViQ29yZTo6SFRN
TElucHV0RWxlbWVudCogZ2V0VGV4dEZpZWxkKCkgY29uc3QgeyByZXR1cm4gbV90ZXh0RmllbGQu
Z2V0KCk7IH0KKworcHJpdmF0ZToKKyAgICBXZWJDb3JlOjpSZW5kZXJTdHlsZSogdGV4dEZpZWxk
U3R5bGUoKSBjb25zdDsKKyAgICB2b2lkIHJlc2V0TGFzdFN1Z2dlc3Rpb24oKTsKKworICAgIFJl
ZlB0cjxXZWJDb3JlOjpIVE1MSW5wdXRFbGVtZW50PiBtX3RleHRGaWVsZDsKKyAgICBpbnQgbV9z
ZWxlY3RlZEluZGV4OworICAgIFdlYlZpZXdJbXBsKiBtX3dlYlZpZXc7CisgICAgV2ViQ29yZTo6
U3RyaW5nIG1fdHlwZWRGaWVsZFZhbHVlOworICAgIE93blB0cjxXZWJDb3JlOjpQb3B1cE1lbnVT
dHlsZT4gbV9zdHlsZTsKKyAgICB0eXBlZGVmIEhhc2hNYXA8V2ViQ29yZTo6U3RyaW5nLCBXZWJD
b3JlOjpTdHJpbmc+IEZpZWxkVmFsdWVzTWFwOworICAgIE93blB0cjxGaWVsZFZhbHVlc01hcD4g
bV9sYXN0RmllbGRWYWx1ZXM7Cit9OworCit9IC8vIG5hbWVzcGFjZSBXZWJLaXQKKworI2VuZGlm
CgpQcm9wZXJ0eSBjaGFuZ2VzIG9uOiBXZWJLaXQvY2hyb21pdW0vc3JjL1N1Z2dlc3Rpb25zUG9w
dXBNZW51Q2xpZW50LmgKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fXwpBZGRlZDogc3ZuOmVvbC1zdHlsZQogICArIExGCgpJ
bmRleDogV2ViS2l0L2Nocm9taXVtL3NyYy9XZWJWaWV3SW1wbC5jcHAKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
V2ViS2l0L2Nocm9taXVtL3NyYy9XZWJWaWV3SW1wbC5jcHAJKHJldmlzaW9uIDU0NTAxKQorKysg
V2ViS2l0L2Nocm9taXVtL3NyYy9XZWJWaWV3SW1wbC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTMx
LDYgKzMxLDcgQEAKICNpbmNsdWRlICJjb25maWcuaCIKICNpbmNsdWRlICJXZWJWaWV3SW1wbC5o
IgogCisjaW5jbHVkZSAiQXV0b0ZpbGxQb3B1cE1lbnVDbGllbnQuaCIKICNpbmNsdWRlICJBdXRv
Y29tcGxldGVQb3B1cE1lbnVDbGllbnQuaCIKICNpbmNsdWRlICJBWE9iamVjdENhY2hlLmgiCiAj
aW5jbHVkZSAiQ2hyb21lLmgiCkBAIC0yNDAsNiArMjQxLDggQEAgV2ViVmlld0ltcGw6OldlYlZp
ZXdJbXBsKFdlYlZpZXdDbGllbnQqIAogICAgICwgbV9vcGVyYXRpb25zQWxsb3dlZChXZWJEcmFn
T3BlcmF0aW9uTm9uZSkKICAgICAsIG1fZHJhZ09wZXJhdGlvbihXZWJEcmFnT3BlcmF0aW9uTm9u
ZSkKICAgICAsIG1fc3VnZ2VzdGlvbnNQb3B1cFNob3dpbmcoZmFsc2UpCisgICAgLCBtX3N1Z2dl
c3Rpb25zUG9wdXBDbGllbnQoMCkKKyAgICAsIG1fc3VnZ2VzdGlvbnNQb3B1cCgwKQogICAgICwg
bV9pc1RyYW5zcGFyZW50KGZhbHNlKQogICAgICwgbV90YWJzVG9MaW5rcyhmYWxzZSkKIHsKQEAg
LTQ2OCw3ICs0NzEsNyBAQCBib29sIFdlYlZpZXdJbXBsOjprZXlFdmVudChjb25zdCBXZWJLZXli
CiAgICAgLy8gZXZlbnQuCiAgICAgbV9zdXBwcmVzc05leHRLZXlwcmVzc0V2ZW50ID0gZmFsc2U7
CiAKLSAgICAvLyBHaXZlIGF1dG9jb21wbGV0ZSBhIGNoYW5jZSB0byBjb25zdW1lIHRoZSBrZXkg
ZXZlbnRzIGl0IGlzIGludGVyZXN0ZWQgaW4uCisgICAgLy8gR2l2ZSBBdXRvY29tcGxldGUgYSBj
aGFuY2UgdG8gY29uc3VtZSB0aGUga2V5IGV2ZW50cyBpdCBpcyBpbnRlcmVzdGVkIGluLgogICAg
IGlmIChhdXRvY29tcGxldGVIYW5kbGVLZXlFdmVudChldmVudCkpCiAgICAgICAgIHJldHVybiB0
cnVlOwogCkBAIC01NDEsNyArNTQ0LDcgQEAgYm9vbCBXZWJWaWV3SW1wbDo6YXV0b2NvbXBsZXRl
SGFuZGxlS2V5RQogICAgICAgICBtX2NsaWVudC0+cmVtb3ZlQXV0b2ZpbGxTdWdnZXN0aW9ucyhu
YW1lLCB2YWx1ZSk7CiAgICAgICAgIC8vIFVwZGF0ZSB0aGUgZW50cmllcyBpbiB0aGUgY3VycmVu
dGx5IHNob3dpbmcgcG9wdXAgdG8gcmVmbGVjdCB0aGUKICAgICAgICAgLy8gZGVsZXRpb24uCi0g
ICAgICAgIG1fYXV0b2NvbXBsZXRlUG9wdXBDbGllbnQtPnJlbW92ZUl0ZW1BdEluZGV4KHNlbGVj
dGVkSW5kZXgpOworICAgICAgICBtX2F1dG9jb21wbGV0ZVBvcHVwQ2xpZW50LT5yZW1vdmVTdWdn
ZXN0aW9uQXRJbmRleChzZWxlY3RlZEluZGV4KTsKICAgICAgICAgcmVmcmVzaFN1Z2dlc3Rpb25z
UG9wdXAoKTsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KQEAgLTE1NTgsNTggKzE1NjEs
MTE4IEBAIHZvaWQgV2ViVmlld0ltcGw6OmFwcGx5QXV0b2ZpbGxTdWdnZXN0aW8KICAgICBjb25z
dCBXZWJWZWN0b3I8V2ViU3RyaW5nPiYgc3VnZ2VzdGlvbnMsCiAgICAgaW50IGRlZmF1bHRTdWdn
ZXN0aW9uSW5kZXgpCiB7Ci0gICAgaWYgKCFtX3BhZ2UuZ2V0KCkgfHwgc3VnZ2VzdGlvbnMuaXNF
bXB0eSgpKSB7CisgICAgYXBwbHlBdXRvY29tcGxldGVTdWdnZXN0aW9ucyhub2RlLCBzdWdnZXN0
aW9ucywgZGVmYXVsdFN1Z2dlc3Rpb25JbmRleCk7Cit9CisKK3ZvaWQgV2ViVmlld0ltcGw6OmFw
cGx5QXV0b0ZpbGxTdWdnZXN0aW9ucygKKyAgICBjb25zdCBXZWJOb2RlJiBub2RlLAorICAgIGNv
bnN0IFdlYlZlY3RvcjxXZWJTdHJpbmc+JiBuYW1lcywKKyAgICBjb25zdCBXZWJWZWN0b3I8V2Vi
U3RyaW5nPiYgbGFiZWxzLAorICAgIGludCBkZWZhdWx0U3VnZ2VzdGlvbkluZGV4KQoreworICAg
IEFTU0VSVChuYW1lcy5zaXplKCkgPT0gbGFiZWxzLnNpemUoKSk7CisgICAgQVNTRVJUKGRlZmF1
bHRTdWdnZXN0aW9uSW5kZXggPCBzdGF0aWNfY2FzdDxpbnQ+KG5hbWVzLnNpemUoKSkpOworCisg
ICAgaWYgKG5hbWVzLmlzRW1wdHkoKSkgewogICAgICAgICBoaWRlU3VnZ2VzdGlvbnNQb3B1cCgp
OwogICAgICAgICByZXR1cm47CiAgICAgfQogCisgICAgUmVmUHRyPE5vZGU+IGZvY3VzZWROb2Rl
ID0gZm9jdXNlZFdlYkNvcmVOb2RlKCk7CisgICAgLy8gSWYgdGhlIG5vZGUgZm9yIHdoaWNoIHdl
IHF1ZXJpZWQgdGhlIEF1dG9GaWxsIHN1Z2dlc3Rpb25zIGlzIG5vdCB0aGUKKyAgICAvLyBmb2N1
c2VkIG5vZGUsIHRoZW4gd2UgaGF2ZSBub3RoaW5nIHRvIGRvLiAgRklYTUU6IGFsc28gY2hlY2sg
dGhlCisgICAgLy8gY2FyZXQgaXMgYXQgdGhlIGVuZCBhbmQgdGhhdCB0aGUgdGV4dCBoYXMgbm90
IGNoYW5nZWQuCisgICAgaWYgKCFmb2N1c2VkTm9kZSB8fCBmb2N1c2VkTm9kZSAhPSBQYXNzUmVm
UHRyPE5vZGU+KG5vZGUpKSB7CisgICAgICAgIGhpZGVTdWdnZXN0aW9uc1BvcHVwKCk7CisgICAg
ICAgIHJldHVybjsKKyAgICB9CisKKyAgICBIVE1MSW5wdXRFbGVtZW50KiBpbnB1dEVsZW0gPQor
ICAgICAgICBzdGF0aWNfY2FzdDxIVE1MSW5wdXRFbGVtZW50Kj4oZm9jdXNlZE5vZGUuZ2V0KCkp
OworCisgICAgLy8gVGhlIGZpcnN0IHRpbWUgdGhlIEF1dG9GaWxsIHBvcHVwIGlzIHNob3duIHdl
J2xsIGNyZWF0ZSB0aGUgY2xpZW50IGFuZAorICAgIC8vIHRoZSBwb3B1cC4KKyAgICBpZiAoIW1f
YXV0b0ZpbGxQb3B1cENsaWVudC5nZXQoKSkKKyAgICAgICAgbV9hdXRvRmlsbFBvcHVwQ2xpZW50
LnNldChuZXcgQXV0b0ZpbGxQb3B1cE1lbnVDbGllbnQpOworCisgICAgbV9hdXRvRmlsbFBvcHVw
Q2xpZW50LT5pbml0aWFsaXplKGlucHV0RWxlbSwgbmFtZXMsIGxhYmVscywKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFN1Z2dlc3Rpb25JbmRleCk7CisKKyAg
ICBpZiAobV9zdWdnZXN0aW9uc1BvcHVwQ2xpZW50ICE9IG1fYXV0b0ZpbGxQb3B1cENsaWVudC5n
ZXQoKSkgeworICAgICAgICBoaWRlU3VnZ2VzdGlvbnNQb3B1cCgpOworICAgICAgICBtX3N1Z2dl
c3Rpb25zUG9wdXBDbGllbnQgPSBtX2F1dG9GaWxsUG9wdXBDbGllbnQuZ2V0KCk7CisgICAgfQor
CisgICAgaWYgKCFtX2F1dG9GaWxsUG9wdXAuZ2V0KCkpIHsKKyAgICAgICAgbV9hdXRvRmlsbFBv
cHVwID0gUG9wdXBDb250YWluZXI6OmNyZWF0ZShtX3N1Z2dlc3Rpb25zUG9wdXBDbGllbnQsCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGlv
bnNQb3B1cFNldHRpbmdzKTsKKyAgICB9CisKKyAgICBpZiAobV9zdWdnZXN0aW9uc1BvcHVwICE9
IG1fYXV0b0ZpbGxQb3B1cC5nZXQoKSkKKyAgICAgICAgbV9zdWdnZXN0aW9uc1BvcHVwID0gbV9h
dXRvRmlsbFBvcHVwLmdldCgpOworCisgICAgaWYgKG1fc3VnZ2VzdGlvbnNQb3B1cFNob3dpbmcp
IHsKKyAgICAgICAgbV9hdXRvRmlsbFBvcHVwQ2xpZW50LT5zZXRTdWdnZXN0aW9ucyhuYW1lcywg
bGFiZWxzKTsKKyAgICAgICAgcmVmcmVzaFN1Z2dlc3Rpb25zUG9wdXAoKTsKKyAgICB9IGVsc2Ug
eworICAgICAgICBtX3N1Z2dlc3Rpb25zUG9wdXAtPnNob3coZm9jdXNlZE5vZGUtPmdldFJlY3Qo
KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvY3VzZWROb2RlLT5vd25lckRv
Y3VtZW50KCktPnZpZXcoKSwgMCk7CisgICAgICAgIG1fc3VnZ2VzdGlvbnNQb3B1cFNob3dpbmcg
PSB0cnVlOworICAgIH0KK30KKwordm9pZCBXZWJWaWV3SW1wbDo6YXBwbHlBdXRvY29tcGxldGVT
dWdnZXN0aW9ucygKKyAgICBjb25zdCBXZWJOb2RlJiBub2RlLAorICAgIGNvbnN0IFdlYlZlY3Rv
cjxXZWJTdHJpbmc+JiBzdWdnZXN0aW9ucywKKyAgICBpbnQgZGVmYXVsdFN1Z2dlc3Rpb25JbmRl
eCkKK3sKICAgICBBU1NFUlQoZGVmYXVsdFN1Z2dlc3Rpb25JbmRleCA8IHN0YXRpY19jYXN0PGlu
dD4oc3VnZ2VzdGlvbnMuc2l6ZSgpKSk7CiAKLSAgICBpZiAoUmVmUHRyPEZyYW1lPiBmb2N1c2Vk
ID0gbV9wYWdlLT5mb2N1c0NvbnRyb2xsZXIoKS0+Zm9jdXNlZEZyYW1lKCkpIHsKLSAgICAgICAg
UmVmUHRyPERvY3VtZW50PiBkb2N1bWVudCA9IGZvY3VzZWQtPmRvY3VtZW50KCk7Ci0gICAgICAg
IGlmICghZG9jdW1lbnQuZ2V0KCkpIHsKLSAgICAgICAgICAgIGhpZGVTdWdnZXN0aW9uc1BvcHVw
KCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KKyAgICBpZiAoIW1fcGFnZS5nZXQo
KSB8fCBzdWdnZXN0aW9ucy5pc0VtcHR5KCkpIHsKKyAgICAgICAgaGlkZVN1Z2dlc3Rpb25zUG9w
dXAoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KIAotICAgICAgICBSZWZQdHI8Tm9kZT4gZm9j
dXNlZE5vZGUgPSBkb2N1bWVudC0+Zm9jdXNlZE5vZGUoKTsKLSAgICAgICAgLy8gSWYgdGhlIG5v
ZGUgZm9yIHdoaWNoIHdlIHF1ZXJpZWQgdGhlIGF1dG9maWxsIHN1Z2dlc3Rpb25zIGlzIG5vdCB0
aGUKLSAgICAgICAgLy8gZm9jdXNlZCBub2RlLCB0aGVuIHdlIGhhdmUgbm90aGluZyB0byBkby4g
IEZJWE1FOiBhbHNvIGNoZWNrIHRoZQotICAgICAgICAvLyBjYXJyZXQgaXMgYXQgdGhlIGVuZCBh
bmQgdGhhdCB0aGUgdGV4dCBoYXMgbm90IGNoYW5nZWQuCi0gICAgICAgIGlmICghZm9jdXNlZE5v
ZGUuZ2V0KCkgfHwgZm9jdXNlZE5vZGUgIT0gUGFzc1JlZlB0cjxOb2RlPihub2RlKSkgewotICAg
ICAgICAgICAgaGlkZVN1Z2dlc3Rpb25zUG9wdXAoKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAg
ICAgICAgfQorICAgIFJlZlB0cjxOb2RlPiBmb2N1c2VkTm9kZSA9IGZvY3VzZWRXZWJDb3JlTm9k
ZSgpOworICAgIC8vIElmIHRoZSBub2RlIGZvciB3aGljaCB3ZSBxdWVyaWVkIHRoZSBBdXRvY29t
cGxldGUgc3VnZ2VzdGlvbnMgaXMgbm90IHRoZQorICAgIC8vIGZvY3VzZWQgbm9kZSwgdGhlbiB3
ZSBoYXZlIG5vdGhpbmcgdG8gZG8uICBGSVhNRTogYWxzbyBjaGVjayB0aGUKKyAgICAvLyBjYXJl
dCBpcyBhdCB0aGUgZW5kIGFuZCB0aGF0IHRoZSB0ZXh0IGhhcyBub3QgY2hhbmdlZC4KKyAgICBp
ZiAoIWZvY3VzZWROb2RlIHx8IGZvY3VzZWROb2RlICE9IFBhc3NSZWZQdHI8Tm9kZT4obm9kZSkp
IHsKKyAgICAgICAgaGlkZVN1Z2dlc3Rpb25zUG9wdXAoKTsKKyAgICAgICAgcmV0dXJuOworICAg
IH0KIAotICAgICAgICBpZiAoIWZvY3VzZWROb2RlLT5oYXNUYWdOYW1lKEhUTUxOYW1lczo6aW5w
dXRUYWcpKSB7Ci0gICAgICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKLSAgICAgICAgICAg
IHJldHVybjsKLSAgICAgICAgfQorICAgIEhUTUxJbnB1dEVsZW1lbnQqIGlucHV0RWxlbSA9Cisg
ICAgICAgIHN0YXRpY19jYXN0PEhUTUxJbnB1dEVsZW1lbnQqPihmb2N1c2VkTm9kZS5nZXQoKSk7
CiAKLSAgICAgICAgSFRNTElucHV0RWxlbWVudCogaW5wdXRFbGVtID0KLSAgICAgICAgICAgIHN0
YXRpY19jYXN0PEhUTUxJbnB1dEVsZW1lbnQqPihmb2N1c2VkTm9kZS5nZXQoKSk7CisgICAgLy8g
VGhlIGZpcnN0IHRpbWUgdGhlIEF1dG9jb21wbGV0ZSBpcyBzaG93biB3ZSdsbCBjcmVhdGUgdGhl
IGNsaWVudCBhbmQgdGhlCisgICAgLy8gcG9wdXAuCisgICAgaWYgKCFtX2F1dG9jb21wbGV0ZVBv
cHVwQ2xpZW50LmdldCgpKQorICAgICAgICBtX2F1dG9jb21wbGV0ZVBvcHVwQ2xpZW50LnNldChu
ZXcgQXV0b2NvbXBsZXRlUG9wdXBNZW51Q2xpZW50KTsKIAotICAgICAgICAvLyBUaGUgZmlyc3Qg
dGltZSB0aGUgc3VnZ2VzdGlvbnMgcG9wdXAgaXMgc2hvd24gd2UnbGwgY3JlYXRlIHRoZSBjbGll
bnQKLSAgICAgICAgLy8gYW5kIHRoZSBwb3B1cC4KLSAgICAgICAgaWYgKCFtX2F1dG9jb21wbGV0
ZVBvcHVwQ2xpZW50LmdldCgpKQotICAgICAgICAgICAgbV9hdXRvY29tcGxldGVQb3B1cENsaWVu
dC5zZXQobmV3IEF1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVudCh0aGlzKSk7Ci0gICAgICAgIG1f
YXV0b2NvbXBsZXRlUG9wdXBDbGllbnQtPmluaXRpYWxpemUoaW5wdXRFbGVtLAotICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Z2dlc3Rpb25zLAotICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRTdWdnZXN0aW9u
SW5kZXgpOwotICAgICAgICBpZiAoIW1fc3VnZ2VzdGlvbnNQb3B1cC5nZXQoKSkgewotICAgICAg
ICAgICAgbV9zdWdnZXN0aW9uc1BvcHVwID0KLSAgICAgICAgICAgICAgICBQb3B1cENvbnRhaW5l
cjo6Y3JlYXRlKG1fYXV0b2NvbXBsZXRlUG9wdXBDbGllbnQuZ2V0KCksCi0gICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBzdWdnZXN0aW9uc1BvcHVwU2V0dGluZ3MpOwotICAg
ICAgICB9CisgICAgbV9hdXRvY29tcGxldGVQb3B1cENsaWVudC0+aW5pdGlhbGl6ZShpbnB1dEVs
ZW0sIHN1Z2dlc3Rpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgZGVmYXVsdFN1Z2dlc3Rpb25JbmRleCk7CiAKLSAgICAgICAgaWYgKG1fc3VnZ2VzdGlvbnNQ
b3B1cFNob3dpbmcpIHsKLSAgICAgICAgICAgIG1fYXV0b2NvbXBsZXRlUG9wdXBDbGllbnQtPnNl
dFN1Z2dlc3Rpb25zKHN1Z2dlc3Rpb25zKTsKLSAgICAgICAgICAgIHJlZnJlc2hTdWdnZXN0aW9u
c1BvcHVwKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtX3N1Z2dlc3Rpb25zUG9w
dXAtPnNob3coZm9jdXNlZE5vZGUtPmdldFJlY3QoKSwKLSAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBmb2N1c2VkTm9kZS0+b3duZXJEb2N1bWVudCgpLT52aWV3KCksIDApOwot
ICAgICAgICAgICAgbV9zdWdnZXN0aW9uc1BvcHVwU2hvd2luZyA9IHRydWU7Ci0gICAgICAgIH0K
KyAgICBpZiAobV9zdWdnZXN0aW9uc1BvcHVwQ2xpZW50ICE9IG1fYXV0b2NvbXBsZXRlUG9wdXBD
bGllbnQuZ2V0KCkpIHsKKyAgICAgICAgaGlkZVN1Z2dlc3Rpb25zUG9wdXAoKTsKKyAgICAgICAg
bV9zdWdnZXN0aW9uc1BvcHVwQ2xpZW50ID0gbV9hdXRvY29tcGxldGVQb3B1cENsaWVudC5nZXQo
KTsKKyAgICB9CisKKyAgICBpZiAoIW1fYXV0b2NvbXBsZXRlUG9wdXAuZ2V0KCkpIHsKKyAgICAg
ICAgbV9hdXRvY29tcGxldGVQb3B1cCA9IFBvcHVwQ29udGFpbmVyOjpjcmVhdGUobV9zdWdnZXN0
aW9uc1BvcHVwQ2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBzdWdnZXN0aW9uc1BvcHVwU2V0dGluZ3MpOworICAgIH0KKworICAgIGlm
IChtX3N1Z2dlc3Rpb25zUG9wdXAgIT0gbV9hdXRvY29tcGxldGVQb3B1cC5nZXQoKSkKKyAgICAg
ICAgbV9zdWdnZXN0aW9uc1BvcHVwID0gbV9hdXRvY29tcGxldGVQb3B1cC5nZXQoKTsKKworICAg
IGlmIChtX3N1Z2dlc3Rpb25zUG9wdXBTaG93aW5nKSB7CisgICAgICAgIG1fYXV0b2NvbXBsZXRl
UG9wdXBDbGllbnQtPnNldFN1Z2dlc3Rpb25zKHN1Z2dlc3Rpb25zKTsKKyAgICAgICAgcmVmcmVz
aFN1Z2dlc3Rpb25zUG9wdXAoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtX3N1Z2dlc3Rpb25z
UG9wdXAtPnNob3coZm9jdXNlZE5vZGUtPmdldFJlY3QoKSwKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGZvY3VzZWROb2RlLT5vd25lckRvY3VtZW50KCktPnZpZXcoKSwgMCk7Cisg
ICAgICAgIG1fc3VnZ2VzdGlvbnNQb3B1cFNob3dpbmcgPSB0cnVlOwogICAgIH0KIH0KIApJbmRl
eDogV2ViS2l0L2Nocm9taXVtL3NyYy9XZWJWaWV3SW1wbC5oCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktp
dC9jaHJvbWl1bS9zcmMvV2ViVmlld0ltcGwuaAkocmV2aXNpb24gNTQ1MDEpCisrKyBXZWJLaXQv
Y2hyb21pdW0vc3JjL1dlYlZpZXdJbXBsLmgJKHdvcmtpbmcgY29weSkKQEAgLTU4LDYgKzU4LDcg
QEAgY2xhc3MgS2V5Ym9hcmRFdmVudDsKIGNsYXNzIFBhZ2U7CiBjbGFzcyBQbGF0Zm9ybUtleWJv
YXJkRXZlbnQ7CiBjbGFzcyBQb3B1cENvbnRhaW5lcjsKK2NsYXNzIFBvcHVwTWVudUNsaWVudDsK
IGNsYXNzIFJhbmdlOwogY2xhc3MgUmVuZGVyVGhlbWU7CiBjbGFzcyBXaWRnZXQ7CkBAIC02NSw3
ICs2Niw5IEBAIGNsYXNzIFdpZGdldDsKIAogbmFtZXNwYWNlIFdlYktpdCB7CiBjbGFzcyBBdXRv
Y29tcGxldGVQb3B1cE1lbnVDbGllbnQ7CitjbGFzcyBBdXRvRmlsbFBvcHVwTWVudUNsaWVudDsK
IGNsYXNzIENvbnRleHRNZW51Q2xpZW50SW1wbDsKK2NsYXNzIFN1Z2dlc3Rpb25zUG9wdXBNZW51
Q2xpZW50OwogY2xhc3MgV2ViQWNjZXNzaWJpbGl0eU9iamVjdDsKIGNsYXNzIFdlYkRldlRvb2xz
QWdlbnRQcml2YXRlOwogY2xhc3MgV2ViRnJhbWVJbXBsOwpAQCAtMTUzLDYgKzE1NiwxNSBAQCBw
dWJsaWM6CiAgICAgICAgIGNvbnN0IFdlYk5vZGUmLAogICAgICAgICBjb25zdCBXZWJWZWN0b3I8
V2ViU3RyaW5nPiYgc3VnZ2VzdGlvbnMsCiAgICAgICAgIGludCBkZWZhdWx0U3VnZ2VzdGlvbklu
ZGV4KTsKKyAgICB2aXJ0dWFsIHZvaWQgYXBwbHlBdXRvRmlsbFN1Z2dlc3Rpb25zKAorICAgICAg
ICBjb25zdCBXZWJOb2RlJiwKKyAgICAgICAgY29uc3QgV2ViVmVjdG9yPFdlYlN0cmluZz4mIG5h
bWVzLAorICAgICAgICBjb25zdCBXZWJWZWN0b3I8V2ViU3RyaW5nPiYgbGFiZWxzLAorICAgICAg
ICBpbnQgZGVmYXVsdFN1Z2dlc3Rpb25JbmRleCk7CisgICAgdmlydHVhbCB2b2lkIGFwcGx5QXV0
b2NvbXBsZXRlU3VnZ2VzdGlvbnMoCisgICAgICAgIGNvbnN0IFdlYk5vZGUmLAorICAgICAgICBj
b25zdCBXZWJWZWN0b3I8V2ViU3RyaW5nPiYgc3VnZ2VzdGlvbnMsCisgICAgICAgIGludCBkZWZh
dWx0U3VnZ2VzdGlvbkluZGV4KTsKICAgICB2aXJ0dWFsIHZvaWQgaGlkZUF1dG9maWxsUG9wdXAo
KTsKICAgICB2aXJ0dWFsIHZvaWQgaGlkZVN1Z2dlc3Rpb25zUG9wdXAoKTsKICAgICB2aXJ0dWFs
IHZvaWQgc2V0U2Nyb2xsYmFyQ29sb3JzKHVuc2lnbmVkIGluYWN0aXZlQ29sb3IsCkBAIC0zOTUs
MTYgKzQwNywyOSBAQCBwcml2YXRlOgogICAgIC8vIGN1cnJlbnQgZHJvcCB0YXJnZXQgaW4gdGhp
cyBXZWJWaWV3ICh0aGUgZHJvcCB0YXJnZXQgY2FuIGFjY2VwdCB0aGUgZHJvcCkuCiAgICAgV2Vi
RHJhZ09wZXJhdGlvbiBtX2RyYWdPcGVyYXRpb247CiAKLSAgICAvLyBUaGUgc3VnZ2VzdGlvbnMg
cG9wdXAuICBLZXB0IGFyb3VuZCBhbmQgcmV1c2VkIGV2ZXJ5LXRpbWUgbmV3IHN1Z2dlc3Rpb25z
Ci0gICAgLy8gc2hvdWxkIGJlIHNob3duLgotICAgIFJlZlB0cjxXZWJDb3JlOjpQb3B1cENvbnRh
aW5lcj4gbV9zdWdnZXN0aW9uc1BvcHVwOwotCi0gICAgLy8gV2hldGhlciB0aGUgc3VnZ2VzdGlv
bnMgcG9wdXAgaXMgY3VycmVudGx5IHNob3dpbmcuCisgICAgLy8gV2hldGhlciBhIHN1Z2dlc3Rp
b25zIHBvcHVwIGlzIGN1cnJlbnRseSBzaG93aW5nLgogICAgIGJvb2wgbV9zdWdnZXN0aW9uc1Bv
cHVwU2hvd2luZzsKIAotICAgIC8vIFRoZSBhdXRvY29tcGxldGUgY2xpZW50LgorICAgIC8vIEEg
cG9pbnRlciB0byB0aGUgY3VycmVudCBzdWdnZXN0aW9ucyBwb3B1cCBtZW51IGNsaWVudC4gIFRo
aXMgY2FuIGJlCisgICAgLy8gZWl0aGVyIGFuIEF1dG9GaWxsUG9wdXBNZW51Q2xpZW50IG9yIGFu
IEF1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVudC4gIFdlCisgICAgLy8gZG8gbm90IG93biB0aGlz
IHBvaW50ZXIuCisgICAgU3VnZ2VzdGlvbnNQb3B1cE1lbnVDbGllbnQqIG1fc3VnZ2VzdGlvbnNQ
b3B1cENsaWVudDsKKworICAgIC8vIFRoZSBBdXRvRmlsbCBwb3B1cCBjbGllbnQuCisgICAgT3du
UHRyPEF1dG9GaWxsUG9wdXBNZW51Q2xpZW50PiBtX2F1dG9GaWxsUG9wdXBDbGllbnQ7CisKKyAg
ICAvLyBUaGUgQXV0b2NvbXBsZXRlIHBvcHVwIGNsaWVudC4KICAgICBPd25QdHI8QXV0b2NvbXBs
ZXRlUG9wdXBNZW51Q2xpZW50PiBtX2F1dG9jb21wbGV0ZVBvcHVwQ2xpZW50OwogCisgICAgLy8g
QSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IHN1Z2dlc3Rpb25zIHBvcHVwLiAgV2UgZG8gbm90IG93
biB0aGlzIHBvaW50ZXIuCisgICAgV2ViQ29yZTo6UG9wdXBDb250YWluZXIqIG1fc3VnZ2VzdGlv
bnNQb3B1cDsKKworICAgIC8vIFRoZSBBdXRvRmlsbCBzdWdnZXN0aW9ucyBwb3B1cC4KKyAgICBS
ZWZQdHI8V2ViQ29yZTo6UG9wdXBDb250YWluZXI+IG1fYXV0b0ZpbGxQb3B1cDsKKworICAgIC8v
IFRoZSBBdXRvQ29tcGxldGUgc3VnZ2VzdGlvbnMgcG9wdXAuCisgICAgUmVmUHRyPFdlYkNvcmU6
OlBvcHVwQ29udGFpbmVyPiBtX2F1dG9jb21wbGV0ZVBvcHVwOworCiAgICAgT3duUHRyPFdlYkRl
dlRvb2xzQWdlbnRQcml2YXRlPiBtX2RldlRvb2xzQWdlbnQ7CiAKICAgICAvLyBXaGV0aGVyIHRo
ZSB3ZWJ2aWV3IGlzIHJlbmRlcmluZyB0cmFuc3BhcmVudGx5Lgo=
</data>
<flag name="review"
          id="31042"
          type_id="1"
          status="-"
          setter="fishd"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>48443</attachid>
            <date>2010-02-09 14:58:18 -0800</date>
            <delta_ts>2010-02-09 15:24:43 -0800</delta_ts>
            <desc>[Chromium] Refactor AutocompletePopupMenuClient [try5]</desc>
            <filename>refactor5.diff</filename>
            <type>text/plain</type>
            <size>46841</size>
            <attacher name="James Hawkins">jhawkins</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYktpdC9jaHJvbWl1bS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0L2No
cm9taXVtL0NoYW5nZUxvZwkocmV2aXNpb24gNTQ1NjgpCisrKyBXZWJLaXQvY2hyb21pdW0vQ2hh
bmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMzYgQEAKKzIwMTAtMDItMDkgIEphbWVz
IEhhd2tpbnMgIDxqaGF3a2luc0BjaHJvbWl1bS5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkg
Tk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgW0Nocm9taXVtXSBSZWZhY3RvciBBdXRvY29tcGxl
dGVQb3B1cE1lbnVDbGllbnQgaW50byBhIGJhc2UgY2xhc3MsCisgICAgICAgIFN1Z2dlc3Rpb25z
UG9wdXBNZW51Q2xpZW50LCBhbmQgdHdvIGRlcml2ZWQgY2xhc3NlcywKKyAgICAgICAgQXV0b2Nv
bXBsZXRlUG9wdXBNZW51Q2xpZW50IGFuZCBBdXRvRmlsbFBvcHVwTWVudUNsaWVudC4gIEN1cnJl
bnRseQorICAgICAgICB0aGUgYmVoYXZpb3Igb2Ygc3VnZ2VzdGlvbnMgcG9wdXBzIGhhcyBub3Qg
Y2hhbmdlZC4KKworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/
aWQ9MzQ3MjEKKworICAgICAgICAqIFdlYktpdC5neXA6CisgICAgICAgICogcHVibGljL1dlYlZp
ZXcuaDoKKyAgICAgICAgKiBzcmMvQXV0b0ZpbGxQb3B1cE1lbnVDbGllbnQuY3BwOiBBZGRlZC4K
KyAgICAgICAgKiBzcmMvQXV0b0ZpbGxQb3B1cE1lbnVDbGllbnQuaDogQWRkZWQuCisgICAgICAg
ICogc3JjL0F1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVudC5jcHA6CisgICAgICAgIChXZWJLaXQ6
OkF1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVudDo6Z2V0U3VnZ2VzdGlvbnNDb3VudCk6CisgICAg
ICAgIChXZWJLaXQ6OkF1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVudDo6Z2V0U3VnZ2VzdGlvbik6
CisgICAgICAgIChXZWJLaXQ6OkF1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVudDo6cmVtb3ZlU3Vn
Z2VzdGlvbkF0SW5kZXgpOgorICAgICAgICAoV2ViS2l0OjpBdXRvY29tcGxldGVQb3B1cE1lbnVD
bGllbnQ6OmluaXRpYWxpemUpOgorICAgICAgICAoV2ViS2l0OjpBdXRvY29tcGxldGVQb3B1cE1l
bnVDbGllbnQ6OnNldFN1Z2dlc3Rpb25zKToKKyAgICAgICAgKiBzcmMvQXV0b2NvbXBsZXRlUG9w
dXBNZW51Q2xpZW50Lmg6CisgICAgICAgICogc3JjL1N1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50
LmNwcDogQWRkZWQuCisgICAgICAgICogc3JjL1N1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50Lmg6
IEFkZGVkLgorICAgICAgICAqIHNyYy9XZWJWaWV3SW1wbC5jcHA6CisgICAgICAgIChXZWJLaXQ6
OldlYlZpZXdJbXBsOjpXZWJWaWV3SW1wbCk6CisgICAgICAgIChXZWJLaXQ6OldlYlZpZXdJbXBs
OjprZXlFdmVudCk6CisgICAgICAgIChXZWJLaXQ6OldlYlZpZXdJbXBsOjphdXRvY29tcGxldGVI
YW5kbGVLZXlFdmVudCk6CisgICAgICAgIChXZWJLaXQ6OldlYlZpZXdJbXBsOjphcHBseUF1dG9m
aWxsU3VnZ2VzdGlvbnMpOgorICAgICAgICAoV2ViS2l0OjpXZWJWaWV3SW1wbDo6YXBwbHlBdXRv
RmlsbFN1Z2dlc3Rpb25zKToKKyAgICAgICAgKFdlYktpdDo6V2ViVmlld0ltcGw6OmFwcGx5QXV0
b2NvbXBsZXRlU3VnZ2VzdGlvbnMpOgorICAgICAgICAqIHNyYy9XZWJWaWV3SW1wbC5oOgorCiAy
MDEwLTAyLTA5ICBKaWFuIExpICA8amlhbmxpQGNocm9taXVtLm9yZz4KIAogICAgICAgICBSZXZp
ZXdlZCBieSBEYXJpbiBGaXNoZXIuCkluZGV4OiBXZWJLaXQvY2hyb21pdW0vV2ViS2l0Lmd5cAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBXZWJLaXQvY2hyb21pdW0vV2ViS2l0Lmd5cAkocmV2aXNpb24gNTQ1MDEp
CisrKyBXZWJLaXQvY2hyb21pdW0vV2ViS2l0Lmd5cAkod29ya2luZyBjb3B5KQpAQCAtMTk5LDYg
KzE5OSw4IEBACiAgICAgICAgICAgICAgICAgJ3NyYy9Bc3NlcnRNYXRjaGluZ0VudW1zLmNwcCcs
CiAgICAgICAgICAgICAgICAgJ3NyYy9BdXRvY29tcGxldGVQb3B1cE1lbnVDbGllbnQuY3BwJywK
ICAgICAgICAgICAgICAgICAnc3JjL0F1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVudC5oJywKKyAg
ICAgICAgICAgICAgICAnc3JjL0F1dG9GaWxsUG9wdXBNZW51Q2xpZW50LmNwcCcsCisgICAgICAg
ICAgICAgICAgJ3NyYy9BdXRvRmlsbFBvcHVwTWVudUNsaWVudC5oJywKICAgICAgICAgICAgICAg
ICAnc3JjL0JhY2tGb3J3YXJkTGlzdENsaWVudEltcGwuY3BwJywKICAgICAgICAgICAgICAgICAn
c3JjL0JhY2tGb3J3YXJkTGlzdENsaWVudEltcGwuaCcsCiAgICAgICAgICAgICAgICAgJ3NyYy9C
b3VuZE9iamVjdC5jcHAnLApAQCAtMjU3LDYgKzI1OSw4IEBACiAgICAgICAgICAgICAgICAgJ3Ny
Yy9TdG9yYWdlRXZlbnREaXNwYXRjaGVySW1wbC5oJywKICAgICAgICAgICAgICAgICAnc3JjL1N0
b3JhZ2VOYW1lc3BhY2VQcm94eS5jcHAnLAogICAgICAgICAgICAgICAgICdzcmMvU3RvcmFnZU5h
bWVzcGFjZVByb3h5LmgnLAorICAgICAgICAgICAgICAgICdzcmMvU3VnZ2VzdGlvbnNQb3B1cE1l
bnVDbGllbnQuY3BwJywKKyAgICAgICAgICAgICAgICAnc3JjL1N1Z2dlc3Rpb25zUG9wdXBNZW51
Q2xpZW50LmgnLAogICAgICAgICAgICAgICAgICdzcmMvVGVtcG9yYXJ5R2x1ZS5oJywKICAgICAg
ICAgICAgICAgICAnc3JjL1Rvb2xzQWdlbnQuaCcsCiAgICAgICAgICAgICAgICAgJ3NyYy9XZWJB
Y2Nlc3NpYmlsaXR5Q2FjaGUuY3BwJywKSW5kZXg6IFdlYktpdC9jaHJvbWl1bS9wdWJsaWMvV2Vi
Vmlldy5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdC9jaHJvbWl1bS9wdWJsaWMvV2ViVmlldy5oCShy
ZXZpc2lvbiA1NDUwMSkKKysrIFdlYktpdC9jaHJvbWl1bS9wdWJsaWMvV2ViVmlldy5oCSh3b3Jr
aW5nIGNvcHkpCkBAIC0yMjMsMTQgKzIyMywyOSBAQCBwdWJsaWM6CiAgICAgdmlydHVhbCBXZWJB
Y2Nlc3NpYmlsaXR5T2JqZWN0IGFjY2Vzc2liaWxpdHlPYmplY3QoKSA9IDA7CiAKIAotICAgIC8v
IEF1dG9maWxsIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLQorICAgIC8vIEF1dG9GaWxsIC8gQXV0b2NvbXBsZXRlIC0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi0gICAgLy8gTm90aWZpZXMgdGhl
IFdlYlZpZXcgdGhhdCBhdXRvZmlsbCBzdWdnZXN0aW9ucyBhcmUgYXZhaWxhYmxlIGZvciBhIG5v
ZGUuCisgICAgLy8gREVQUkVDQVRFRDogV2ViVmlldzo6YXBwbHlBdXRvY29tcGxldGVTdWdnZXN0
aW9ucyBpcyB0aGUgbmV3IHdheSB0bworICAgIC8vIGFjY2VzcyB0aGlzLgogICAgIHZpcnR1YWwg
dm9pZCBhcHBseUF1dG9maWxsU3VnZ2VzdGlvbnMoCiAgICAgICAgIGNvbnN0IFdlYk5vZGUmLAog
ICAgICAgICBjb25zdCBXZWJWZWN0b3I8V2ViU3RyaW5nPiYgc3VnZ2VzdGlvbnMsCiAgICAgICAg
IGludCBkZWZhdWx0U3VnZ2VzdGlvbkluZGV4KSA9IDA7CiAKKyAgICAvLyBOb3RpZmllcyB0aGUg
V2ViVmlldyB0aGF0IEF1dG9GaWxsIHN1Z2dlc3Rpb25zIGFyZSBhdmFpbGFibGUgZm9yIGEgbm9k
ZS4KKyAgICB2aXJ0dWFsIHZvaWQgYXBwbHlBdXRvRmlsbFN1Z2dlc3Rpb25zKAorICAgICAgICBj
b25zdCBXZWJOb2RlJiwKKyAgICAgICAgY29uc3QgV2ViVmVjdG9yPFdlYlN0cmluZz4mIG5hbWVz
LAorICAgICAgICBjb25zdCBXZWJWZWN0b3I8V2ViU3RyaW5nPiYgbGFiZWxzLAorICAgICAgICBp
bnQgZGVmYXVsdFN1Z2dlc3Rpb25JbmRleCkgPSAwOworCisgICAgLy8gTm90aWZpZXMgdGhlIFdl
YlZpZXcgdGhhdCBBdXRvY29tcGxldGUgc3VnZ2VzdGlvbnMgYXJlIGF2YWlsYWJsZSBmb3IgYQor
ICAgIC8vIG5vZGUuCisgICAgdmlydHVhbCB2b2lkIGFwcGx5QXV0b2NvbXBsZXRlU3VnZ2VzdGlv
bnMoCisgICAgICAgIGNvbnN0IFdlYk5vZGUmLAorICAgICAgICBjb25zdCBXZWJWZWN0b3I8V2Vi
U3RyaW5nPiYgc3VnZ2VzdGlvbnMsCisgICAgICAgIGludCBkZWZhdWx0U3VnZ2VzdGlvbkluZGV4
KSA9IDA7CisKICAgICAvLyBERVBSRUNBVEVEOiBXZWJWaWV3OjpoaWRlU3VnZ2VzdGlvbnNQb3B1
cCBpcyB0aGUgbmV3IHdheSB0byBhY2Nlc3MgdGhpcy4KICAgICB2aXJ0dWFsIHZvaWQgaGlkZUF1
dG9maWxsUG9wdXAoKSA9IDA7CiAKSW5kZXg6IFdlYktpdC9jaHJvbWl1bS9zcmMvQXV0b0ZpbGxQ
b3B1cE1lbnVDbGllbnQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdC9jaHJvbWl1bS9zcmMvQXV0
b0ZpbGxQb3B1cE1lbnVDbGllbnQuY3BwCShyZXZpc2lvbiAwKQorKysgV2ViS2l0L2Nocm9taXVt
L3NyYy9BdXRvRmlsbFBvcHVwTWVudUNsaWVudC5jcHAJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEs
MTA2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6Cisg
KgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBi
aW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAq
IGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29v
Z2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNl
ZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNv
ZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBD
T05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFO
VElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJS
QU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxB
UiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hU
CisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJ
UkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElB
TCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5U
IE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwg
T1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQg
T04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJX
SVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdB
UkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisg
Ki8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkF1dG9GaWxsUG9wdXBNZW51Q2xp
ZW50LmgiCisKKyNpbmNsdWRlICJIVE1MSW5wdXRFbGVtZW50LmgiCisjaW5jbHVkZSAiV2ViU3Ry
aW5nLmgiCisjaW5jbHVkZSAiV2ViVmVjdG9yLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBXZWJDb3Jl
OworCituYW1lc3BhY2UgV2ViS2l0IHsKKwordW5zaWduZWQgQXV0b0ZpbGxQb3B1cE1lbnVDbGll
bnQ6OmdldFN1Z2dlc3Rpb25zQ291bnQoKSBjb25zdAoreworICAgIHJldHVybiBtX25hbWVzLnNp
emUoKTsKK30KKworV2ViU3RyaW5nIEF1dG9GaWxsUG9wdXBNZW51Q2xpZW50OjpnZXRTdWdnZXN0
aW9uKHVuc2lnbmVkIGxpc3RJbmRleCkgY29uc3QKK3sKKyAgICAvLyBGSVhNRTogTW9kaWZ5IHRo
ZSBQb3B1cE1lbnUgdG8gYWRkIHRoZSBsYWJlbCBpbiBncmF5IHJpZ2h0LWp1c3RpZmllZC4KKyAg
ICBBU1NFUlQobGlzdEluZGV4ID49IDAgJiYgbGlzdEluZGV4IDwgbV9uYW1lcy5zaXplKCkpOwor
ICAgIHJldHVybiBtX25hbWVzW2xpc3RJbmRleF0gKyBTdHJpbmcoIiAoIikgKyBtX2xhYmVsc1ts
aXN0SW5kZXhdICsgU3RyaW5nKCIpIik7Cit9CisKK3ZvaWQgQXV0b0ZpbGxQb3B1cE1lbnVDbGll
bnQ6OnJlbW92ZVN1Z2dlc3Rpb25BdEluZGV4KHVuc2lnbmVkIGxpc3RJbmRleCkKK3sKKyAgICAv
LyBGSVhNRTogRG8gd2Ugd2FudCB0byByZW1vdmUgQXV0b0ZpbGwgc3VnZ2VzdGlvbnM/CisgICAg
QVNTRVJUKGxpc3RJbmRleCA+PSAwICYmIGxpc3RJbmRleCA8IHN0YXRpY19jYXN0PGludD4obV9u
YW1lcy5zaXplKCkpKTsKKyAgICBtX25hbWVzLnJlbW92ZShsaXN0SW5kZXgpOworICAgIG1fbGFi
ZWxzLnJlbW92ZShsaXN0SW5kZXgpOworfQorCit2b2lkIEF1dG9GaWxsUG9wdXBNZW51Q2xpZW50
Ojogc2VsZWN0aW9uQ2hhbmdlZCh1bnNpZ25lZCBsaXN0SW5kZXgsCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZpcmVFdmVudHMpIHsKKyAgICBp
ZiAobGlzdEluZGV4ID09IHN0YXRpY19jYXN0PHVuc2lnbmVkPigtMSkpIHsKKyAgICAgICAgU3Vn
Z2VzdGlvbnNQb3B1cE1lbnVDbGllbnQ6OnNlbGVjdGlvbkNoYW5nZWQobGlzdEluZGV4LCBmaXJl
RXZlbnRzKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEFTU0VSVChsaXN0SW5kZXgg
Pj0gMCAmJiBsaXN0SW5kZXggPCBtX25hbWVzLnNpemUoKSk7CisgICAgc2V0U3VnZ2VzdGVkVmFs
dWUobV9uYW1lc1tsaXN0SW5kZXhdKTsKK30KKwordm9pZCBBdXRvRmlsbFBvcHVwTWVudUNsaWVu
dDo6aW5pdGlhbGl6ZSgKKyAgICBIVE1MSW5wdXRFbGVtZW50KiB0ZXh0RmllbGQsCisgICAgY29u
c3QgV2ViVmVjdG9yPFdlYlN0cmluZz4mIG5hbWVzLAorICAgIGNvbnN0IFdlYlZlY3RvcjxXZWJT
dHJpbmc+JiBsYWJlbHMsCisgICAgaW50IGRlZmF1bHRTdWdnZXN0aW9uSW5kZXgpCit7CisgICAg
QVNTRVJUKG5hbWVzLnNpemUoKSA9PSBsYWJlbHMuc2l6ZSgpKTsKKyAgICBBU1NFUlQoZGVmYXVs
dFN1Z2dlc3Rpb25JbmRleCA8IHN0YXRpY19jYXN0PGludD4obmFtZXMuc2l6ZSgpKSk7CisKKyAg
ICAvLyBUaGUgc3VnZ2VzdGlvbnMgbXVzdCBiZSBzZXQgYmVmb3JlIGluaXRpYWxpemluZyB0aGUK
KyAgICAvLyBTdWdnZXN0aW9uc1BvcHVwTWVudUNsaWVudC4KKyAgICBzZXRTdWdnZXN0aW9ucyhu
YW1lcywgbGFiZWxzKTsKKworICAgIFN1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50Ojppbml0aWFs
aXplKHRleHRGaWVsZCwgZGVmYXVsdFN1Z2dlc3Rpb25JbmRleCk7Cit9CisKK3ZvaWQgQXV0b0Zp
bGxQb3B1cE1lbnVDbGllbnQ6OnNldFN1Z2dlc3Rpb25zKGNvbnN0IFdlYlZlY3RvcjxXZWJTdHJp
bmc+JiBuYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGNvbnN0IFdlYlZlY3RvcjxXZWJTdHJpbmc+JiBsYWJlbHMpCit7CisgICAgQVNTRVJUKG5hbWVz
LnNpemUoKSA9PSBsYWJlbHMuc2l6ZSgpKTsKKworICAgIG1fbmFtZXMuY2xlYXIoKTsKKyAgICBt
X2xhYmVscy5jbGVhcigpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbmFtZXMuc2l6ZSgp
OyArK2kpIHsKKyAgICAgICAgbV9uYW1lcy5hcHBlbmQobmFtZXNbaV0pOworICAgICAgICBtX2xh
YmVscy5hcHBlbmQobGFiZWxzW2ldKTsKKyAgICB9CisKKyAgICAvLyBUcnkgdG8gcHJlc2VydmUg
c2VsZWN0aW9uIGlmIHBvc3NpYmxlLgorICAgIGlmIChnZXRTZWxlY3RlZEluZGV4KCkgPj0gc3Rh
dGljX2Nhc3Q8aW50PihuYW1lcy5zaXplKCkpKQorICAgICAgICBzZXRTZWxlY3RlZEluZGV4KC0x
KTsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViS2l0CkluZGV4OiBXZWJLaXQvY2hyb21pdW0vc3Jj
L0F1dG9GaWxsUG9wdXBNZW51Q2xpZW50LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0L2Nocm9taXVt
L3NyYy9BdXRvRmlsbFBvcHVwTWVudUNsaWVudC5oCShyZXZpc2lvbiAwKQorKysgV2ViS2l0L2No
cm9taXVtL3NyYy9BdXRvRmlsbFBvcHVwTWVudUNsaWVudC5oCShyZXZpc2lvbiAwKQpAQCAtMCww
ICsxLDcxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5k
IGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJt
aXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6
CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWlu
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBp
biBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIK
KyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQg
d2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2Yg
R29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUg
dXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlz
IHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoK
KyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFO
RCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FS
UkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBX
QVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElD
VUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJ
R0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVO
VElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVN
RU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFU
QSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBB
TkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBT
VFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09G
VFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
CisgKi8KKworI2lmbmRlZiBBdXRvRmlsbFBvcHVwTWVudUNsaWVudF9oCisjZGVmaW5lIEF1dG9G
aWxsUG9wdXBNZW51Q2xpZW50X2gKKworI2luY2x1ZGUgIlN1Z2dlc3Rpb25zUG9wdXBNZW51Q2xp
ZW50LmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKK2NsYXNzIEhUTUxJbnB1dEVsZW1lbnQ7Cit9
CisKK25hbWVzcGFjZSBXZWJLaXQgeworY2xhc3MgV2ViU3RyaW5nOwordGVtcGxhdGUgPHR5cGVu
YW1lIFQ+IGNsYXNzIFdlYlZlY3RvcjsKKworLy8gVGhlIEF1dG9GaWxsIHN1Z2dlc3Rpb25zIHBv
cHVwIG1lbnUgY2xpZW50LCB1c2VkIHRvIGRpc3BsYXkgbmFtZSBzdWdnZXN0aW9ucworLy8gd2l0
aCByaWdodC1qdXN0aWZpZWQgbGFiZWxzLgorY2xhc3MgQXV0b0ZpbGxQb3B1cE1lbnVDbGllbnQg
OiBwdWJsaWMgU3VnZ2VzdGlvbnNQb3B1cE1lbnVDbGllbnQgeworcHVibGljOgorICAgIC8vIFN1
Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50IGltcGxlbWVudGF0aW9uOgorICAgIHZpcnR1YWwgdW5z
aWduZWQgZ2V0U3VnZ2VzdGlvbnNDb3VudCgpIGNvbnN0OworICAgIHZpcnR1YWwgV2ViU3RyaW5n
IGdldFN1Z2dlc3Rpb24odW5zaWduZWQgbGlzdEluZGV4KSBjb25zdDsKKyAgICB2aXJ0dWFsIHZv
aWQgcmVtb3ZlU3VnZ2VzdGlvbkF0SW5kZXgodW5zaWduZWQgbGlzdEluZGV4KTsKKworICAgIC8v
IFdlYkNvcmU6OlBvcHVwTWVudUNsaWVudCBpbXBsZW1lbnRhdGlvbjoKKyAgICB2aXJ0dWFsIHZv
aWQgc2VsZWN0aW9uQ2hhbmdlZCh1bnNpZ25lZCBsaXN0SW5kZXgsIGJvb2wgZmlyZUV2ZW50cyk7
CisKKyAgICB2b2lkIGluaXRpYWxpemUoV2ViQ29yZTo6SFRNTElucHV0RWxlbWVudCosCisgICAg
ICAgICAgICAgICAgICAgIGNvbnN0IFdlYlZlY3RvcjxXZWJTdHJpbmc+JiBuYW1lcywKKyAgICAg
ICAgICAgICAgICAgICAgY29uc3QgV2ViVmVjdG9yPFdlYlN0cmluZz4mIGxhYmVscywKKyAgICAg
ICAgICAgICAgICAgICAgaW50IGRlZmF1bHRTdWdnZXN0aW9uSW5kZXgpOworCisgICAgdm9pZCBz
ZXRTdWdnZXN0aW9ucyhjb25zdCBXZWJWZWN0b3I8V2ViU3RyaW5nPiYgbmFtZXMsCisgICAgICAg
ICAgICAgICAgICAgICAgICBjb25zdCBXZWJWZWN0b3I8V2ViU3RyaW5nPiYgbGFiZWxzKTsKKwor
cHJpdmF0ZToKKyAgICBWZWN0b3I8V2ViQ29yZTo6U3RyaW5nPiBtX25hbWVzOworICAgIFZlY3Rv
cjxXZWJDb3JlOjpTdHJpbmc+IG1fbGFiZWxzOworfTsKKworfSAvLyBuYW1lc3BhY2UgV2ViS2l0
CisKKyNlbmRpZgoKUHJvcGVydHkgY2hhbmdlcyBvbjogV2ViS2l0L2Nocm9taXVtL3NyYy9BdXRv
RmlsbFBvcHVwTWVudUNsaWVudC5oCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KQWRkZWQ6IHN2bjplb2wtc3R5bGUKICAg
KyBMRgoKSW5kZXg6IFdlYktpdC9jaHJvbWl1bS9zcmMvQXV0b2NvbXBsZXRlUG9wdXBNZW51Q2xp
ZW50LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQvY2hyb21pdW0vc3JjL0F1dG9jb21wbGV0ZVBv
cHVwTWVudUNsaWVudC5jcHAJKHJldmlzaW9uIDU0NTAxKQorKysgV2ViS2l0L2Nocm9taXVtL3Ny
Yy9BdXRvY29tcGxldGVQb3B1cE1lbnVDbGllbnQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xLDUg
KzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBHb29nbGUgSW5jLiBBbGwgcmlnaHRz
IHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCkBAIC0zMSwyNyAr
MzEsMjkgQEAKICNpbmNsdWRlICJjb25maWcuaCIKICNpbmNsdWRlICJBdXRvY29tcGxldGVQb3B1
cE1lbnVDbGllbnQuaCIKIAotI2luY2x1ZGUgIkNTU1N0eWxlU2VsZWN0b3IuaCIKLSNpbmNsdWRl
ICJDU1NWYWx1ZUtleXdvcmRzLmgiCi0jaW5jbHVkZSAiRnJhbWVWaWV3LmgiCiAjaW5jbHVkZSAi
SFRNTElucHV0RWxlbWVudC5oIgotI2luY2x1ZGUgIlJlbmRlclRoZW1lLmgiCisjaW5jbHVkZSAi
V2ViU3RyaW5nLmgiCiAjaW5jbHVkZSAiV2ViVmVjdG9yLmgiCi0jaW5jbHVkZSAiV2ViVmlld0lt
cGwuaCIKIAogdXNpbmcgbmFtZXNwYWNlIFdlYkNvcmU7CiAKIG5hbWVzcGFjZSBXZWJLaXQgewog
Ci1BdXRvY29tcGxldGVQb3B1cE1lbnVDbGllbnQ6OkF1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVu
dChXZWJWaWV3SW1wbCogd2ViVmlldykKLSAgICA6IG1fdGV4dEZpZWxkKDApCi0gICAgLCBtX3Nl
bGVjdGVkSW5kZXgoMCkKLSAgICAsIG1fd2ViVmlldyh3ZWJWaWV3KQordW5zaWduZWQgQXV0b2Nv
bXBsZXRlUG9wdXBNZW51Q2xpZW50OjpnZXRTdWdnZXN0aW9uc0NvdW50KCkgY29uc3QKIHsKKyAg
ICByZXR1cm4gbV9zdWdnZXN0aW9ucy5zaXplKCk7CiB9CiAKLUF1dG9jb21wbGV0ZVBvcHVwTWVu
dUNsaWVudDo6fkF1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVudCgpCitXZWJTdHJpbmcgQXV0b2Nv
bXBsZXRlUG9wdXBNZW51Q2xpZW50OjpnZXRTdWdnZXN0aW9uKHVuc2lnbmVkIGxpc3RJbmRleCkg
Y29uc3QKIHsKKyAgICBBU1NFUlQobGlzdEluZGV4ID49IDAgJiYgbGlzdEluZGV4IDwgbV9zdWdn
ZXN0aW9ucy5zaXplKCkpOworICAgIHJldHVybiBtX3N1Z2dlc3Rpb25zW2xpc3RJbmRleF07Cit9
CisKK3ZvaWQgQXV0b2NvbXBsZXRlUG9wdXBNZW51Q2xpZW50OjpyZW1vdmVTdWdnZXN0aW9uQXRJ
bmRleCh1bnNpZ25lZCBsaXN0SW5kZXgpCit7CisgICAgQVNTRVJUKGxpc3RJbmRleCA+PSAwICYm
IGxpc3RJbmRleCA8IG1fc3VnZ2VzdGlvbnMuc2l6ZSgpKTsKKyAgICBtX3N1Z2dlc3Rpb25zLnJl
bW92ZShsaXN0SW5kZXgpOwogfQogCiB2b2lkIEF1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVudDo6
aW5pdGlhbGl6ZSgKQEAgLTYwLDkwICs2MiwxMiBAQCB2b2lkIEF1dG9jb21wbGV0ZVBvcHVwTWVu
dUNsaWVudDo6aW5pdGlhCiAgICAgaW50IGRlZmF1bHRTdWdnZXN0aW9uSW5kZXgpCiB7CiAgICAg
QVNTRVJUKGRlZmF1bHRTdWdnZXN0aW9uSW5kZXggPCBzdGF0aWNfY2FzdDxpbnQ+KHN1Z2dlc3Rp
b25zLnNpemUoKSkpOwotICAgIG1fdGV4dEZpZWxkID0gdGV4dEZpZWxkOwotICAgIG1fc2VsZWN0
ZWRJbmRleCA9IGRlZmF1bHRTdWdnZXN0aW9uSW5kZXg7Ci0gICAgc2V0U3VnZ2VzdGlvbnMoc3Vn
Z2VzdGlvbnMpOwotCi0gICAgRm9udERlc2NyaXB0aW9uIGZvbnREZXNjcmlwdGlvbjsKLSAgICBt
X3dlYlZpZXctPnRoZW1lKCktPnN5c3RlbUZvbnQoQ1NTVmFsdWVXZWJraXRDb250cm9sLCBmb250
RGVzY3JpcHRpb24pOwotICAgIC8vIFVzZSBhIHNtYWxsZXIgZm9udCBzaXplIHRvIG1hdGNoIElF
L0ZpcmVmb3guCi0gICAgLy8gRklYTUU6IGh0dHA6Ly9jcmJ1Zy5jb20vNzM3NiB1c2UgdGhlIHN5
c3RlbSBzaXplIGluc3RlYWQgb2YgYQotICAgIC8vICAgICAgICBmaXhlZCBmb250IHNpemUgdmFs
dWUuCi0gICAgZm9udERlc2NyaXB0aW9uLnNldENvbXB1dGVkU2l6ZSgxMi4wKTsKLSAgICBGb250
IGZvbnQoZm9udERlc2NyaXB0aW9uLCAwLCAwKTsKLSAgICBmb250LnVwZGF0ZSh0ZXh0RmllbGQt
PmRvY3VtZW50KCktPnN0eWxlU2VsZWN0b3IoKS0+Zm9udFNlbGVjdG9yKCkpOwotICAgIC8vIFRo
ZSBkaXJlY3Rpb24gb2YgdGV4dCBpbiBwb3B1cCBtZW51IGlzIHNldCB0aGUgc2FtZSBhcyB0aGUg
ZGlyZWN0aW9uIG9mCi0gICAgLy8gdGhlIGlucHV0IGVsZW1lbnQ6IHRleHRGaWVsZC4KLSAgICBt
X3N0eWxlLnNldChuZXcgUG9wdXBNZW51U3R5bGUoQ29sb3I6OmJsYWNrLCBDb2xvcjo6d2hpdGUs
IGZvbnQsIHRydWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExlbmd0aChX
ZWJDb3JlOjpGaXhlZCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRG
aWVsZC0+cmVuZGVyZXIoKS0+c3R5bGUoKS0+ZGlyZWN0aW9uKCkpKTsKLX0KLQotdm9pZCBBdXRv
Y29tcGxldGVQb3B1cE1lbnVDbGllbnQ6OnZhbHVlQ2hhbmdlZCh1bnNpZ25lZCBsaXN0SW5kZXgs
IGJvb2wgZmlyZUV2ZW50cykKLXsKLSAgICBtX3RleHRGaWVsZC0+c2V0VmFsdWUobV9zdWdnZXN0
aW9uc1tsaXN0SW5kZXhdKTsKLSAgICBFZGl0b3JDbGllbnRJbXBsKiBlZGl0b3IgPQotICAgICAg
ICBzdGF0aWNfY2FzdDxFZGl0b3JDbGllbnRJbXBsKj4obV93ZWJWaWV3LT5wYWdlKCktPmVkaXRv
ckNsaWVudCgpKTsKLSAgICBBU1NFUlQoZWRpdG9yKTsKLSAgICBlZGl0b3ItPm9uQXV0b2ZpbGxT
dWdnZXN0aW9uQWNjZXB0ZWQoCi0gICAgICAgIHN0YXRpY19jYXN0PEhUTUxJbnB1dEVsZW1lbnQq
PihtX3RleHRGaWVsZC5nZXQoKSkpOwotfQotCi1TdHJpbmcgQXV0b2NvbXBsZXRlUG9wdXBNZW51
Q2xpZW50OjppdGVtVGV4dCh1bnNpZ25lZCBsaXN0SW5kZXgpIGNvbnN0Ci17Ci0gICAgcmV0dXJu
IG1fc3VnZ2VzdGlvbnNbbGlzdEluZGV4XTsKLX0KLQotUG9wdXBNZW51U3R5bGUgQXV0b2NvbXBs
ZXRlUG9wdXBNZW51Q2xpZW50OjppdGVtU3R5bGUodW5zaWduZWQgbGlzdEluZGV4KSBjb25zdAot
ewotICAgIHJldHVybiAqbV9zdHlsZTsKLX0KLQotUG9wdXBNZW51U3R5bGUgQXV0b2NvbXBsZXRl
UG9wdXBNZW51Q2xpZW50OjptZW51U3R5bGUoKSBjb25zdAotewotICAgIHJldHVybiAqbV9zdHls
ZTsKLX0KLQotaW50IEF1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVudDo6Y2xpZW50UGFkZGluZ0xl
ZnQoKSBjb25zdAotewotICAgIC8vIEJ1ZyBodHRwOi8vY3JidWcuY29tLzc3MDggc2VlbXMgdG8g
aW5kaWNhdGUgdGhlIHN0eWxlIGNhbiBiZSAwLgotICAgIFJlbmRlclN0eWxlKiBzdHlsZSA9IHRl
eHRGaWVsZFN0eWxlKCk7Ci0gICAgcmV0dXJuIHN0eWxlID8gbV93ZWJWaWV3LT50aGVtZSgpLT5w
b3B1cEludGVybmFsUGFkZGluZ0xlZnQoc3R5bGUpIDogMDsKLX0KIAotaW50IEF1dG9jb21wbGV0
ZVBvcHVwTWVudUNsaWVudDo6Y2xpZW50UGFkZGluZ1JpZ2h0KCkgY29uc3QKLXsKLSAgICAvLyBC
dWcgaHR0cDovL2NyYnVnLmNvbS83NzA4IHNlZW1zIHRvIGluZGljYXRlIHRoZSBzdHlsZSBjYW4g
YmUgMC4KLSAgICBSZW5kZXJTdHlsZSogc3R5bGUgPSB0ZXh0RmllbGRTdHlsZSgpOwotICAgIHJl
dHVybiBzdHlsZSA/IG1fd2ViVmlldy0+dGhlbWUoKS0+cG9wdXBJbnRlcm5hbFBhZGRpbmdSaWdo
dChzdHlsZSkgOiAwOwotfQotCi12b2lkIEF1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVudDo6cG9w
dXBEaWRIaWRlKCkKLXsKLSAgICBtX3dlYlZpZXctPnN1Z2dlc3Rpb25zUG9wdXBEaWRIaWRlKCk7
Ci19Ci0KLXZvaWQgQXV0b2NvbXBsZXRlUG9wdXBNZW51Q2xpZW50OjpzZXRUZXh0RnJvbUl0ZW0o
dW5zaWduZWQgbGlzdEluZGV4KQotewotICAgIG1fdGV4dEZpZWxkLT5zZXRWYWx1ZShtX3N1Z2dl
c3Rpb25zW2xpc3RJbmRleF0pOwotfQotCi1Gb250U2VsZWN0b3IqIEF1dG9jb21wbGV0ZVBvcHVw
TWVudUNsaWVudDo6Zm9udFNlbGVjdG9yKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV90ZXh0Rmll
bGQtPmRvY3VtZW50KCktPnN0eWxlU2VsZWN0b3IoKS0+Zm9udFNlbGVjdG9yKCk7Ci19Ci0KLUhv
c3RXaW5kb3cqIEF1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVudDo6aG9zdFdpbmRvdygpIGNvbnN0
Ci17Ci0gICAgcmV0dXJuIG1fdGV4dEZpZWxkLT5kb2N1bWVudCgpLT52aWV3KCktPmhvc3RXaW5k
b3coKTsKLX0KKyAgICAvLyBUaGUgc3VnZ2VzdGlvbnMgbXVzdCBiZSBzZXQgYmVmb3JlIGluaXRp
YWxpemluZyB0aGUKKyAgICAvLyBTdWdnZXN0aW9uc1BvcHVwTWVudUNsaWVudC4KKyAgICBzZXRT
dWdnZXN0aW9ucyhzdWdnZXN0aW9ucyk7CiAKLVBhc3NSZWZQdHI8U2Nyb2xsYmFyPiBBdXRvY29t
cGxldGVQb3B1cE1lbnVDbGllbnQ6OmNyZWF0ZVNjcm9sbGJhcigKLSAgICBTY3JvbGxiYXJDbGll
bnQqIGNsaWVudCwKLSAgICBTY3JvbGxiYXJPcmllbnRhdGlvbiBvcmllbnRhdGlvbiwKLSAgICBT
Y3JvbGxiYXJDb250cm9sU2l6ZSBzaXplKQotewotICAgIHJldHVybiBTY3JvbGxiYXI6OmNyZWF0
ZU5hdGl2ZVNjcm9sbGJhcihjbGllbnQsIG9yaWVudGF0aW9uLCBzaXplKTsKKyAgICBTdWdnZXN0
aW9uc1BvcHVwTWVudUNsaWVudDo6aW5pdGlhbGl6ZSh0ZXh0RmllbGQsIGRlZmF1bHRTdWdnZXN0
aW9uSW5kZXgpOwogfQogCiB2b2lkIEF1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVudDo6c2V0U3Vn
Z2VzdGlvbnMoY29uc3QgV2ViVmVjdG9yPFdlYlN0cmluZz4mIHN1Z2dlc3Rpb25zKQpAQCAtMTUx
LDI4ICs3NSwxMCBAQCB2b2lkIEF1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVudDo6c2V0U3VnCiAg
ICAgbV9zdWdnZXN0aW9ucy5jbGVhcigpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc3Vn
Z2VzdGlvbnMuc2l6ZSgpOyArK2kpCiAgICAgICAgIG1fc3VnZ2VzdGlvbnMuYXBwZW5kKHN1Z2dl
c3Rpb25zW2ldKTsKLSAgICAvLyBUcnkgdG8gcHJlc2VydmUgc2VsZWN0aW9uIGlmIHBvc3NpYmxl
LgotICAgIGlmIChtX3NlbGVjdGVkSW5kZXggPj0gc3RhdGljX2Nhc3Q8aW50PihzdWdnZXN0aW9u
cy5zaXplKCkpKQotICAgICAgICBtX3NlbGVjdGVkSW5kZXggPSAtMTsKLX0KIAotdm9pZCBBdXRv
Y29tcGxldGVQb3B1cE1lbnVDbGllbnQ6OnJlbW92ZUl0ZW1BdEluZGV4KGludCBpbmRleCkKLXsK
LSAgICBBU1NFUlQoaW5kZXggPj0gMCAmJiBpbmRleCA8IHN0YXRpY19jYXN0PGludD4obV9zdWdn
ZXN0aW9ucy5zaXplKCkpKTsKLSAgICBtX3N1Z2dlc3Rpb25zLnJlbW92ZShpbmRleCk7Ci19Ci0K
LVJlbmRlclN0eWxlKiBBdXRvY29tcGxldGVQb3B1cE1lbnVDbGllbnQ6OnRleHRGaWVsZFN0eWxl
KCkgY29uc3QKLXsKLSAgICBSZW5kZXJTdHlsZSogc3R5bGUgPSBtX3RleHRGaWVsZC0+Y29tcHV0
ZWRTdHlsZSgpOwotICAgIGlmICghc3R5bGUpIHsKLSAgICAgICAgLy8gSXQgc2VlbXMgd2UgY2Fu
IG9ubHkgaGF2ZSBhIDAgc3R5bGUgaW4gYSBUZXh0RmllbGQgaWYgdGhlCi0gICAgICAgIC8vIG5v
ZGUgaXMgZGV0YWNoZWQsIGluIHdoaWNoIGNhc2Ugd2UgdGhlIHBvcHVwIHNob3VkIG5vdCBiZQot
ICAgICAgICAvLyBzaG93aW5nLiAgUGxlYXNlIHJlcG9ydCB0aGlzIGluIGh0dHA6Ly9jcmJ1Zy5j
b20vNzcwOCBhbmQKLSAgICAgICAgLy8gaW5jbHVkZSB0aGUgcGFnZSB5b3Ugd2VyZSB2aXNpdGlu
Zy4KLSAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Ci0gICAgfQotICAgIHJldHVybiBzdHls
ZTsKKyAgICAvLyBUcnkgdG8gcHJlc2VydmUgc2VsZWN0aW9uIGlmIHBvc3NpYmxlLgorICAgIGlm
IChnZXRTZWxlY3RlZEluZGV4KCkgPj0gc3RhdGljX2Nhc3Q8aW50PihzdWdnZXN0aW9ucy5zaXpl
KCkpKQorICAgICAgICBzZXRTZWxlY3RlZEluZGV4KC0xKTsKIH0KIAogfSAvLyBuYW1lc3BhY2Ug
V2ViS2l0CkluZGV4OiBXZWJLaXQvY2hyb21pdW0vc3JjL0F1dG9jb21wbGV0ZVBvcHVwTWVudUNs
aWVudC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdC9jaHJvbWl1bS9zcmMvQXV0b2NvbXBsZXRlUG9w
dXBNZW51Q2xpZW50LmgJKHJldmlzaW9uIDU0NTAxKQorKysgV2ViS2l0L2Nocm9taXVtL3NyYy9B
dXRvY29tcGxldGVQb3B1cE1lbnVDbGllbnQuaAkod29ya2luZyBjb3B5KQpAQCAtMSw1ICsxLDUg
QEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2Vy
dmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkg
Zm9ybXMsIHdpdGggb3Igd2l0aG91dAogICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHBy
b3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQpAQCAtMjgsNjkgKzI4LDM4
IEBACiAgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLgogICovCiAKLSNpbmNsdWRlICJQb3B1cE1lbnVDbGllbnQuaCIK
KyNpZm5kZWYgQXV0b2NvbXBsZXRlUG9wdXBNZW51Q2xpZW50X2gKKyNkZWZpbmUgQXV0b2NvbXBs
ZXRlUG9wdXBNZW51Q2xpZW50X2gKKyAKKyNpbmNsdWRlICJTdWdnZXN0aW9uc1BvcHVwTWVudUNs
aWVudC5oIgogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiBjbGFzcyBIVE1MSW5wdXRFbGVtZW50Owot
Y2xhc3MgUG9wdXBNZW51U3R5bGU7Ci1jbGFzcyBSZW5kZXJTdHlsZTsKIH0KIAogbmFtZXNwYWNl
IFdlYktpdCB7CiBjbGFzcyBXZWJTdHJpbmc7Ci1jbGFzcyBXZWJWaWV3SW1wbDsKIHRlbXBsYXRl
IDx0eXBlbmFtZSBUPiBjbGFzcyBXZWJWZWN0b3I7CiAKLS8vIEF1dG9jb21wbGV0ZVBvcHVwTWVu
dUNsaWVudAotY2xhc3MgQXV0b2NvbXBsZXRlUG9wdXBNZW51Q2xpZW50IDogcHVibGljIFdlYkNv
cmU6OlBvcHVwTWVudUNsaWVudCB7CisvLyBUaGUgQXV0b2NvbXBsZXRlIHN1Z2dlc3Rpb25zIHBv
cHVwIG1lbnUgY2xpZW50LCB1c2VkIHRvIGRpc3BsYXkgYSBsaXN0IG9mCisvLyBhdXRvY29tcGxl
dGUgc3VnZ2VzdGlvbnMuCitjbGFzcyBBdXRvY29tcGxldGVQb3B1cE1lbnVDbGllbnQgOiBwdWJs
aWMgU3VnZ2VzdGlvbnNQb3B1cE1lbnVDbGllbnQgewogcHVibGljOgotICAgIEF1dG9jb21wbGV0
ZVBvcHVwTWVudUNsaWVudChXZWJWaWV3SW1wbCogd2Vidmlldyk7Ci0gICAgfkF1dG9jb21wbGV0
ZVBvcHVwTWVudUNsaWVudCgpOworICAgIC8vIFN1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50IGlt
cGxlbWVudGF0aW9uOgorICAgIHZpcnR1YWwgdW5zaWduZWQgZ2V0U3VnZ2VzdGlvbnNDb3VudCgp
IGNvbnN0OworICAgIHZpcnR1YWwgV2ViU3RyaW5nIGdldFN1Z2dlc3Rpb24odW5zaWduZWQgbGlz
dEluZGV4KSBjb25zdDsKKyAgICB2aXJ0dWFsIHZvaWQgcmVtb3ZlU3VnZ2VzdGlvbkF0SW5kZXgo
dW5zaWduZWQgbGlzdEluZGV4KTsKIAogICAgIHZvaWQgaW5pdGlhbGl6ZShXZWJDb3JlOjpIVE1M
SW5wdXRFbGVtZW50KiwKICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2ViVmVjdG9yPFdlYlN0
cmluZz4mIHN1Z2dlc3Rpb25zLAogICAgICAgICAgICAgICAgICAgICBpbnQgZGVmYXVsdFN1Z2dl
c3Rpb25JbmRleCk7CiAKLSAgICBXZWJDb3JlOjpIVE1MSW5wdXRFbGVtZW50KiB0ZXh0RmllbGQo
KSBjb25zdCB7IHJldHVybiBtX3RleHRGaWVsZC5nZXQoKTsgfQotCiAgICAgdm9pZCBzZXRTdWdn
ZXN0aW9ucyhjb25zdCBXZWJWZWN0b3I8V2ViU3RyaW5nPiYpOwotICAgIHZvaWQgcmVtb3ZlSXRl
bUF0SW5kZXgoaW50IGluZGV4KTsKLQotICAgIC8vIFdlYkNvcmU6OlBvcHVwTWVudUNsaWVudCBt
ZXRob2RzOgotICAgIHZpcnR1YWwgdm9pZCB2YWx1ZUNoYW5nZWQodW5zaWduZWQgbGlzdEluZGV4
LCBib29sIGZpcmVFdmVudHMgPSB0cnVlKTsKLSAgICB2aXJ0dWFsIFdlYkNvcmU6OlN0cmluZyBp
dGVtVGV4dCh1bnNpZ25lZCBsaXN0SW5kZXgpIGNvbnN0OwotICAgIHZpcnR1YWwgV2ViQ29yZTo6
U3RyaW5nIGl0ZW1Ub29sVGlwKHVuc2lnbmVkIGxhc3RJbmRleCkgY29uc3QgeyByZXR1cm4gV2Vi
Q29yZTo6U3RyaW5nKCk7IH0KLSAgICB2aXJ0dWFsIGJvb2wgaXRlbUlzRW5hYmxlZCh1bnNpZ25l
ZCBsaXN0SW5kZXgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KLSAgICB2aXJ0dWFsIFdlYkNvcmU6
OlBvcHVwTWVudVN0eWxlIGl0ZW1TdHlsZSh1bnNpZ25lZCBsaXN0SW5kZXgpIGNvbnN0OwotICAg
IHZpcnR1YWwgV2ViQ29yZTo6UG9wdXBNZW51U3R5bGUgbWVudVN0eWxlKCkgY29uc3Q7Ci0gICAg
dmlydHVhbCBpbnQgY2xpZW50SW5zZXRMZWZ0KCkgY29uc3QgeyByZXR1cm4gMDsgfQotICAgIHZp
cnR1YWwgaW50IGNsaWVudEluc2V0UmlnaHQoKSBjb25zdCB7IHJldHVybiAwOyB9Ci0gICAgdmly
dHVhbCBpbnQgY2xpZW50UGFkZGluZ0xlZnQoKSBjb25zdDsKLSAgICB2aXJ0dWFsIGludCBjbGll
bnRQYWRkaW5nUmlnaHQoKSBjb25zdDsKLSAgICB2aXJ0dWFsIGludCBsaXN0U2l6ZSgpIGNvbnN0
IHsgcmV0dXJuIG1fc3VnZ2VzdGlvbnMuc2l6ZSgpOyB9Ci0gICAgdmlydHVhbCBpbnQgc2VsZWN0
ZWRJbmRleCgpIGNvbnN0IHsgcmV0dXJuIG1fc2VsZWN0ZWRJbmRleDsgfQotICAgIHZpcnR1YWwg
dm9pZCBwb3B1cERpZEhpZGUoKTsKLSAgICB2aXJ0dWFsIGJvb2wgaXRlbUlzU2VwYXJhdG9yKHVu
c2lnbmVkIGxpc3RJbmRleCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLSAgICB2aXJ0dWFsIGJv
b2wgaXRlbUlzTGFiZWwodW5zaWduZWQgbGlzdEluZGV4KSBjb25zdCB7IHJldHVybiBmYWxzZTsg
fQotICAgIHZpcnR1YWwgYm9vbCBpdGVtSXNTZWxlY3RlZCh1bnNpZ25lZCBsaXN0SW5kZXgpIGNv
bnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0gICAgdmlydHVhbCBib29sIHNob3VsZFBvcE92ZXIoKSBj
b25zdCB7IHJldHVybiBmYWxzZTsgfQotICAgIHZpcnR1YWwgYm9vbCB2YWx1ZVNob3VsZENoYW5n
ZU9uSG90VHJhY2soKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotICAgIHZpcnR1YWwgdm9pZCBz
ZXRUZXh0RnJvbUl0ZW0odW5zaWduZWQgbGlzdEluZGV4KTsKLSAgICB2aXJ0dWFsIFdlYkNvcmU6
OkZvbnRTZWxlY3RvciogZm9udFNlbGVjdG9yKCkgY29uc3Q7Ci0gICAgdmlydHVhbCBXZWJDb3Jl
OjpIb3N0V2luZG93KiBob3N0V2luZG93KCkgY29uc3Q7Ci0gICAgdmlydHVhbCBQYXNzUmVmUHRy
PFdlYkNvcmU6OlNjcm9sbGJhcj4gY3JlYXRlU2Nyb2xsYmFyKAotICAgICAgICBXZWJDb3JlOjpT
Y3JvbGxiYXJDbGllbnQqIGNsaWVudCwKLSAgICAgICAgV2ViQ29yZTo6U2Nyb2xsYmFyT3JpZW50
YXRpb24gb3JpZW50YXRpb24sCi0gICAgICAgIFdlYkNvcmU6OlNjcm9sbGJhckNvbnRyb2xTaXpl
IHNpemUpOwogCiBwcml2YXRlOgotICAgIFdlYkNvcmU6OlJlbmRlclN0eWxlKiB0ZXh0RmllbGRT
dHlsZSgpIGNvbnN0OwotCi0gICAgUmVmUHRyPFdlYkNvcmU6OkhUTUxJbnB1dEVsZW1lbnQ+IG1f
dGV4dEZpZWxkOwogICAgIFZlY3RvcjxXZWJDb3JlOjpTdHJpbmc+IG1fc3VnZ2VzdGlvbnM7Ci0g
ICAgaW50IG1fc2VsZWN0ZWRJbmRleDsKLSAgICBXZWJWaWV3SW1wbCogbV93ZWJWaWV3OwotICAg
IE93blB0cjxXZWJDb3JlOjpQb3B1cE1lbnVTdHlsZT4gbV9zdHlsZTsKIH07CiAKIH0gLy8gbmFt
ZXNwYWNlIFdlYktpdAorCisjZW5kaWYKSW5kZXg6IFdlYktpdC9jaHJvbWl1bS9zcmMvU3VnZ2Vz
dGlvbnNQb3B1cE1lbnVDbGllbnQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdC9jaHJvbWl1bS9z
cmMvU3VnZ2VzdGlvbnNQb3B1cE1lbnVDbGllbnQuY3BwCShyZXZpc2lvbiAwKQorKysgV2ViS2l0
L2Nocm9taXVtL3NyYy9TdWdnZXN0aW9uc1BvcHVwTWVudUNsaWVudC5jcHAJKHJldmlzaW9uIDAp
CkBAIC0wLDAgKzEsMjQ3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMu
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJl
CisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11
c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJp
YnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHly
aWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMg
cHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhl
IG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9y
cyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9t
CisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNz
aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBI
T0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElN
UExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUg
SU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAq
IEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBU
SEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkg
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1Ig
Q09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8s
IFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNF
LAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9G
IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIlN1Z2dlc3Rp
b25zUG9wdXBNZW51Q2xpZW50LmgiCisKKyNpbmNsdWRlICJDU1NTdHlsZVNlbGVjdG9yLmgiCisj
aW5jbHVkZSAiQ1NTVmFsdWVLZXl3b3Jkcy5oIgorI2luY2x1ZGUgIkNocm9tZS5oIgorI2luY2x1
ZGUgIkZyYW1lVmlldy5oIgorI2luY2x1ZGUgIkhUTUxJbnB1dEVsZW1lbnQuaCIKKyNpbmNsdWRl
ICJSZW5kZXJUaGVtZS5oIgorI2luY2x1ZGUgIldlYlZpZXdJbXBsLmgiCisKK3VzaW5nIG5hbWVz
cGFjZSBXZWJDb3JlOworCituYW1lc3BhY2UgV2ViS2l0IHsKKworU3VnZ2VzdGlvbnNQb3B1cE1l
bnVDbGllbnQ6OlN1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50KCkKKyAgICA6IG1fdGV4dEZpZWxk
KDApCisgICAgLCBtX3NlbGVjdGVkSW5kZXgoMCkKK3sKK30KKworU3VnZ2VzdGlvbnNQb3B1cE1l
bnVDbGllbnQ6On5TdWdnZXN0aW9uc1BvcHVwTWVudUNsaWVudCgpCit7Cit9CisKKy8vIEZJWE1F
OiBJbXBsZW1lbnQgdGhpcyBwZXItZGVyaXZlZCBjbGFzcz8KK3ZvaWQgU3VnZ2VzdGlvbnNQb3B1
cE1lbnVDbGllbnQ6OnZhbHVlQ2hhbmdlZCh1bnNpZ25lZCBsaXN0SW5kZXgsIGJvb2wgZmlyZUV2
ZW50cykKK3sKKyAgICBtX3RleHRGaWVsZC0+c2V0VmFsdWUoZ2V0U3VnZ2VzdGlvbihsaXN0SW5k
ZXgpKTsKKworICAgIEVkaXRvckNsaWVudEltcGwqIGVkaXRvciA9CisgICAgICAgIHN0YXRpY19j
YXN0PEVkaXRvckNsaWVudEltcGwqPihnZXRXZWJWaWV3KCktPnBhZ2UoKS0+ZWRpdG9yQ2xpZW50
KCkpOworICAgIEFTU0VSVChlZGl0b3IpOworICAgIGVkaXRvci0+b25BdXRvZmlsbFN1Z2dlc3Rp
b25BY2NlcHRlZCgKKyAgICAgICAgc3RhdGljX2Nhc3Q8SFRNTElucHV0RWxlbWVudCo+KG1fdGV4
dEZpZWxkLmdldCgpKSk7Cit9CisKK3ZvaWQgU3VnZ2VzdGlvbnNQb3B1cE1lbnVDbGllbnQ6OnNl
bGVjdGlvbkNoYW5nZWQodW5zaWduZWQgbGlzdEluZGV4LCBib29sIGZpcmVFdmVudHMpCit7Cisg
ICAgaWYgKGxpc3RJbmRleCAhPSBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oLTEpKSB7CisgICAgICAg
IGNvbnN0IFdlYlN0cmluZyYgc3VnZ2VzdGlvbiA9IGdldFN1Z2dlc3Rpb24obGlzdEluZGV4KTsK
KyAgICAgICAgc2V0U3VnZ2VzdGVkVmFsdWUoc3VnZ2VzdGlvbik7CisgICAgfSBlbHNlIHsKKyAg
ICAgICAgbV90ZXh0RmllbGQtPnNldFZhbHVlKG1fdHlwZWRGaWVsZFZhbHVlKTsKKyAgICAgICAg
aWYgKG1fbGFzdEZpZWxkVmFsdWVzLT5jb250YWlucyhtX3RleHRGaWVsZC0+bmFtZSgpKSkKKyAg
ICAgICAgICAgIG1fbGFzdEZpZWxkVmFsdWVzLT5zZXQobV90ZXh0RmllbGQtPm5hbWUoKSwgbV90
eXBlZEZpZWxkVmFsdWUpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBtX2xhc3RGaWVsZFZh
bHVlcy0+YWRkKG1fdGV4dEZpZWxkLT5uYW1lKCksIG1fdHlwZWRGaWVsZFZhbHVlKTsKKyAgICB9
Cit9CisKK1N0cmluZyBTdWdnZXN0aW9uc1BvcHVwTWVudUNsaWVudDo6aXRlbVRleHQodW5zaWdu
ZWQgbGlzdEluZGV4KSBjb25zdAoreworICAgIHJldHVybiBnZXRTdWdnZXN0aW9uKGxpc3RJbmRl
eCk7Cit9CisKK1BvcHVwTWVudVN0eWxlIFN1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50OjppdGVt
U3R5bGUodW5zaWduZWQgbGlzdEluZGV4KSBjb25zdAoreworICAgIHJldHVybiAqbV9zdHlsZTsK
K30KKworUG9wdXBNZW51U3R5bGUgU3VnZ2VzdGlvbnNQb3B1cE1lbnVDbGllbnQ6Om1lbnVTdHls
ZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuICptX3N0eWxlOworfQorCitpbnQgU3VnZ2VzdGlvbnNQ
b3B1cE1lbnVDbGllbnQ6OmNsaWVudFBhZGRpbmdMZWZ0KCkgY29uc3QKK3sKKyAgICAvLyBCdWcg
aHR0cDovL2NyYnVnLmNvbS83NzA4IHNlZW1zIHRvIGluZGljYXRlIHRoZSBzdHlsZSBjYW4gYmUg
MC4KKyAgICBSZW5kZXJTdHlsZSogc3R5bGUgPSB0ZXh0RmllbGRTdHlsZSgpOworICAgIGlmICgh
c3R5bGUpCisgICAgICAgcmV0dXJuIDA7CisKKyAgICByZXR1cm4gZ2V0V2ViVmlldygpLT50aGVt
ZSgpLT5wb3B1cEludGVybmFsUGFkZGluZ0xlZnQoc3R5bGUpOworfQorCitpbnQgU3VnZ2VzdGlv
bnNQb3B1cE1lbnVDbGllbnQ6OmNsaWVudFBhZGRpbmdSaWdodCgpIGNvbnN0Cit7CisgICAgLy8g
QnVnIGh0dHA6Ly9jcmJ1Zy5jb20vNzcwOCBzZWVtcyB0byBpbmRpY2F0ZSB0aGUgc3R5bGUgY2Fu
IGJlIDAuCisgICAgUmVuZGVyU3R5bGUqIHN0eWxlID0gdGV4dEZpZWxkU3R5bGUoKTsKKyAgICBp
ZiAoIXN0eWxlKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHJldHVybiBnZXRXZWJWaWV3KCkt
PnRoZW1lKCktPnBvcHVwSW50ZXJuYWxQYWRkaW5nUmlnaHQoc3R5bGUpOworfQorCit2b2lkIFN1
Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50Ojpwb3B1cERpZEhpZGUoKQoreworICAgIG1fdGV4dEZp
ZWxkLT5zZXRWYWx1ZShtX3R5cGVkRmllbGRWYWx1ZSk7CisgICAgcmVzZXRMYXN0U3VnZ2VzdGlv
bigpOworICAgIGdldFdlYlZpZXcoKS0+c3VnZ2VzdGlvbnNQb3B1cERpZEhpZGUoKTsKK30KKwor
dm9pZCBTdWdnZXN0aW9uc1BvcHVwTWVudUNsaWVudDo6c2V0VGV4dEZyb21JdGVtKHVuc2lnbmVk
IGxpc3RJbmRleCkKK3sKKyAgICBtX3RleHRGaWVsZC0+c2V0VmFsdWUoZ2V0U3VnZ2VzdGlvbihs
aXN0SW5kZXgpKTsKKyAgICByZXNldExhc3RTdWdnZXN0aW9uKCk7Cit9CisKK3ZvaWQgU3VnZ2Vz
dGlvbnNQb3B1cE1lbnVDbGllbnQ6OnJlc2V0TGFzdFN1Z2dlc3Rpb24oKQoreworICAgIGlmICht
X2xhc3RGaWVsZFZhbHVlcy0+Y29udGFpbnMobV90ZXh0RmllbGQtPm5hbWUoKSkpCisgICAgICAg
IG1fbGFzdEZpZWxkVmFsdWVzLT5zZXQobV90ZXh0RmllbGQtPm5hbWUoKSwgbV90ZXh0RmllbGQt
PnZhbHVlKCkpOworICAgIGVsc2UKKyAgICAgICAgbV9sYXN0RmllbGRWYWx1ZXMtPmFkZChtX3Rl
eHRGaWVsZC0+bmFtZSgpLCBtX3RleHRGaWVsZC0+dmFsdWUoKSk7Cit9CisKK0ZvbnRTZWxlY3Rv
ciogU3VnZ2VzdGlvbnNQb3B1cE1lbnVDbGllbnQ6OmZvbnRTZWxlY3RvcigpIGNvbnN0Cit7Cisg
ICAgcmV0dXJuIG1fdGV4dEZpZWxkLT5kb2N1bWVudCgpLT5zdHlsZVNlbGVjdG9yKCktPmZvbnRT
ZWxlY3RvcigpOworfQorCitIb3N0V2luZG93KiBTdWdnZXN0aW9uc1BvcHVwTWVudUNsaWVudDo6
aG9zdFdpbmRvdygpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fdGV4dEZpZWxkLT5kb2N1bWVudCgp
LT52aWV3KCktPmhvc3RXaW5kb3coKTsKK30KKworUGFzc1JlZlB0cjxTY3JvbGxiYXI+IFN1Z2dl
c3Rpb25zUG9wdXBNZW51Q2xpZW50OjpjcmVhdGVTY3JvbGxiYXIoCisgICAgU2Nyb2xsYmFyQ2xp
ZW50KiBjbGllbnQsCisgICAgU2Nyb2xsYmFyT3JpZW50YXRpb24gb3JpZW50YXRpb24sCisgICAg
U2Nyb2xsYmFyQ29udHJvbFNpemUgc2l6ZSkKK3sKKyAgICByZXR1cm4gU2Nyb2xsYmFyOjpjcmVh
dGVOYXRpdmVTY3JvbGxiYXIoY2xpZW50LCBvcmllbnRhdGlvbiwgc2l6ZSk7Cit9CisKK1JlbmRl
clN0eWxlKiBTdWdnZXN0aW9uc1BvcHVwTWVudUNsaWVudDo6dGV4dEZpZWxkU3R5bGUoKSBjb25z
dAoreworICAgIFJlbmRlclN0eWxlKiBzdHlsZSA9IG1fdGV4dEZpZWxkLT5jb21wdXRlZFN0eWxl
KCk7CisgICAgaWYgKCFzdHlsZSkgeworICAgICAgICAvLyBJdCBzZWVtcyB3ZSBjYW4gb25seSBo
YXZlIGEgMCBzdHlsZSBpbiBhIFRleHRGaWVsZCBpZiB0aGUKKyAgICAgICAgLy8gbm9kZSBpcyBk
ZXRhY2hlZCwgaW4gd2hpY2ggY2FzZSB3ZSB0aGUgcG9wdXAgc2hvdWQgbm90IGJlCisgICAgICAg
IC8vIHNob3dpbmcuICBQbGVhc2UgcmVwb3J0IHRoaXMgaW4gaHR0cDovL2NyYnVnLmNvbS83NzA4
IGFuZAorICAgICAgICAvLyBpbmNsdWRlIHRoZSBwYWdlIHlvdSB3ZXJlIHZpc2l0aW5nLgorICAg
ICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICB9CisgICAgcmV0dXJuIHN0eWxlOworfQor
Cit2b2lkIFN1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50Ojppbml0aWFsaXplKEhUTUxJbnB1dEVs
ZW1lbnQqIHRleHRGaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgaW50IGRlZmF1bHRTdWdnZXN0aW9uSW5kZXgpCit7CisgICAgaWYgKCFtX2xhc3RGaWVs
ZFZhbHVlcykKKyAgICAgICAgbV9sYXN0RmllbGRWYWx1ZXMuc2V0KG5ldyBGaWVsZFZhbHVlc01h
cCk7CisKKyAgICBtX3RleHRGaWVsZCA9IHRleHRGaWVsZDsKKyAgICBtX3R5cGVkRmllbGRWYWx1
ZSA9IHRleHRGaWVsZC0+dmFsdWUoKTsKKyAgICBtX3NlbGVjdGVkSW5kZXggPSBkZWZhdWx0U3Vn
Z2VzdGlvbkluZGV4OworCisgICAgc2V0SW5pdGlhbFN1Z2dlc3Rpb24oKTsKKworICAgIEZvbnRE
ZXNjcmlwdGlvbiBmb250RGVzY3JpcHRpb247CisgICAgZ2V0V2ViVmlldygpLT50aGVtZSgpLT5z
eXN0ZW1Gb250KENTU1ZhbHVlV2Via2l0Q29udHJvbCwgZm9udERlc2NyaXB0aW9uKTsKKyAgICAv
LyBVc2UgYSBzbWFsbGVyIGZvbnQgc2l6ZSB0byBtYXRjaCBJRS9GaXJlZm94LgorICAgIC8vIEZJ
WE1FOiBodHRwOi8vY3JidWcuY29tLzczNzYgdXNlIHRoZSBzeXN0ZW0gc2l6ZSBpbnN0ZWFkIG9m
IGEKKyAgICAvLyAgICAgICAgZml4ZWQgZm9udCBzaXplIHZhbHVlLgorICAgIGZvbnREZXNjcmlw
dGlvbi5zZXRDb21wdXRlZFNpemUoMTIuMCk7CisgICAgRm9udCBmb250KGZvbnREZXNjcmlwdGlv
biwgMCwgMCk7CisgICAgZm9udC51cGRhdGUodGV4dEZpZWxkLT5kb2N1bWVudCgpLT5zdHlsZVNl
bGVjdG9yKCktPmZvbnRTZWxlY3RvcigpKTsKKyAgICAvLyBUaGUgZGlyZWN0aW9uIG9mIHRleHQg
aW4gcG9wdXAgbWVudSBpcyBzZXQgdGhlIHNhbWUgYXMgdGhlIGRpcmVjdGlvbiBvZgorICAgIC8v
IHRoZSBpbnB1dCBlbGVtZW50OiB0ZXh0RmllbGQuCisgICAgbV9zdHlsZS5zZXQobmV3IFBvcHVw
TWVudVN0eWxlKENvbG9yOjpibGFjaywgQ29sb3I6OndoaXRlLCBmb250LCB0cnVlLAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMZW5ndGgoV2ViQ29yZTo6Rml4ZWQpLAorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0RmllbGQtPnJlbmRlcmVyKCktPnN0
eWxlKCktPmRpcmVjdGlvbigpKSk7Cit9CisKK3ZvaWQgU3VnZ2VzdGlvbnNQb3B1cE1lbnVDbGll
bnQ6OnNldEluaXRpYWxTdWdnZXN0aW9uKCkKK3sKKyAgICBpZiAoIWdldFN1Z2dlc3Rpb25zQ291
bnQoKSB8fCAhbV90ZXh0RmllbGQtPm5hbWUoKS5sZW5ndGgoKSB8fCAhbV90eXBlZEZpZWxkVmFs
dWUubGVuZ3RoKCkpCisgICAgICAgIHJldHVybjsKKworICAgIGludCBuZXdJbmRleCA9IG1fc2Vs
ZWN0ZWRJbmRleCA+PSAwID8gbV9zZWxlY3RlZEluZGV4IDogMDsKKyAgICBjb25zdCBTdHJpbmcm
IHN1Z2dlc3Rpb24gPSBnZXRTdWdnZXN0aW9uKG5ld0luZGV4KTsKKyAgICBib29sIGhhc1ByZXZp
b3VzVmFsdWUgPSBtX2xhc3RGaWVsZFZhbHVlcy0+Y29udGFpbnMobV90ZXh0RmllbGQtPm5hbWUo
KSk7CisKKyAgICBTdHJpbmcgcHJldlZhbHVlOworICAgIGlmIChoYXNQcmV2aW91c1ZhbHVlKQor
ICAgICAgICBwcmV2VmFsdWUgPSBtX2xhc3RGaWVsZFZhbHVlcy0+Z2V0KG1fdGV4dEZpZWxkLT5u
YW1lKCkpOworCisgICAgaWYgKCFoYXNQcmV2aW91c1ZhbHVlIHx8IG1fdHlwZWRGaWVsZFZhbHVl
Lmxlbmd0aCgpID4gbV9sYXN0RmllbGRWYWx1ZXMtPmdldChtX3RleHRGaWVsZC0+bmFtZSgpKS5s
ZW5ndGgoKSkgeworICAgICAgICBpZiAoc3VnZ2VzdGlvbi5zdGFydHNXaXRoKG1fdHlwZWRGaWVs
ZFZhbHVlKSkKKyAgICAgICAgICAgIG1fc2VsZWN0ZWRJbmRleCA9IG5ld0luZGV4OworCisgICAg
ICAgIGludCBzdGFydCA9IDA7CisgICAgICAgIFN0cmluZyBuZXdTdWdnZXN0aW9uID0gc3VnZ2Vz
dGlvbjsKKyAgICAgICAgaWYgKHN1Z2dlc3Rpb24uc3RhcnRzV2l0aChtX3R5cGVkRmllbGRWYWx1
ZSwgZmFsc2UpKSB7CisgICAgICAgICAgICBuZXdTdWdnZXN0aW9uID0gbV90eXBlZEZpZWxkVmFs
dWU7CisgICAgICAgICAgICBpZiAoc3VnZ2VzdGlvbi5sZW5ndGgoKSA+IG1fdHlwZWRGaWVsZFZh
bHVlLmxlbmd0aCgpKSB7CisgICAgICAgICAgICAgICAgbmV3U3VnZ2VzdGlvbi5hcHBlbmQoc3Vn
Z2VzdGlvbi5zdWJzdHJpbmcobV90eXBlZEZpZWxkVmFsdWUubGVuZ3RoKCksCisgICAgICAgICAg
ICAgICAgICAgIHN1Z2dlc3Rpb24ubGVuZ3RoKCkgLSBtX3R5cGVkRmllbGRWYWx1ZS5sZW5ndGgo
KSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhcnQgPSBtX3R5cGVkRmllbGRWYWx1
ZS5sZW5ndGgoKTsKKyAgICAgICAgfQorCisgICAgICAgIG1fdGV4dEZpZWxkLT5zZXRTdWdnZXN0
ZWRWYWx1ZShuZXdTdWdnZXN0aW9uKTsKKyAgICAgICAgbV90ZXh0RmllbGQtPnNldFNlbGVjdGlv
blJhbmdlKHN0YXJ0LCBuZXdTdWdnZXN0aW9uLmxlbmd0aCgpKTsKKyAgICB9CisKKyAgICBpZiAo
aGFzUHJldmlvdXNWYWx1ZSkKKyAgICAgICAgbV9sYXN0RmllbGRWYWx1ZXMtPnNldChtX3RleHRG
aWVsZC0+bmFtZSgpLCBtX3R5cGVkRmllbGRWYWx1ZSk7CisgICAgZWxzZQorICAgICAgICBtX2xh
c3RGaWVsZFZhbHVlcy0+YWRkKG1fdGV4dEZpZWxkLT5uYW1lKCksIG1fdHlwZWRGaWVsZFZhbHVl
KTsKK30KKwordm9pZCBTdWdnZXN0aW9uc1BvcHVwTWVudUNsaWVudDo6c2V0U3VnZ2VzdGVkVmFs
dWUoY29uc3QgV2ViU3RyaW5nJiBzdWdnZXN0aW9uKQoreworICAgIG1fdGV4dEZpZWxkLT5zZXRT
dWdnZXN0ZWRWYWx1ZShzdWdnZXN0aW9uKTsKKyAgICBtX3RleHRGaWVsZC0+c2V0U2VsZWN0aW9u
UmFuZ2UobV90eXBlZEZpZWxkVmFsdWUubGVuZ3RoKCksCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIHN1Z2dlc3Rpb24ubGVuZ3RoKCkpOworfQorCitXZWJWaWV3SW1wbCogU3Vn
Z2VzdGlvbnNQb3B1cE1lbnVDbGllbnQ6OmdldFdlYlZpZXcoKSBjb25zdAoreworICAgIHJldHVy
biBzdGF0aWNfY2FzdDxDaHJvbWVDbGllbnRJbXBsKj4oCisgICAgICAgIG1fdGV4dEZpZWxkLT5k
b2N1bWVudCgpLT5mcmFtZSgpLT5wYWdlKCktPmNocm9tZSgpLT5jbGllbnQoKSktPndlYlZpZXco
KTsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViS2l0CkluZGV4OiBXZWJLaXQvY2hyb21pdW0vc3Jj
L1N1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0L2Nocm9t
aXVtL3NyYy9TdWdnZXN0aW9uc1BvcHVwTWVudUNsaWVudC5oCShyZXZpc2lvbiAwKQorKysgV2Vi
S2l0L2Nocm9taXVtL3NyYy9TdWdnZXN0aW9uc1BvcHVwTWVudUNsaWVudC5oCShyZXZpc2lvbiAw
KQpAQCAtMCwwICsxLDExNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5j
LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g
c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9u
LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFy
ZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBt
dXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5
cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
IHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRo
ZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRv
cnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJv
bQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlz
c2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQg
SE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJ
TVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhF
IElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisg
KiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwg
VEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5Z
IERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9S
IENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRP
LCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVT
RSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZF
UiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBD
T05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdF
TkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBP
RiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNV
Q0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJQb3B1cE1lbnVDbGllbnQuaCIKKworI2lmbmRl
ZiBTdWdnZXN0aW9uc1BvcHVwTWVudUNsaWVudF9oCisjZGVmaW5lIFN1Z2dlc3Rpb25zUG9wdXBN
ZW51Q2xpZW50X2gKKworbmFtZXNwYWNlIFdlYkNvcmUgeworY2xhc3MgSFRNTElucHV0RWxlbWVu
dDsKK2NsYXNzIFBvcHVwTWVudVN0eWxlOworY2xhc3MgUmVuZGVyU3R5bGU7Cit9CisKK25hbWVz
cGFjZSBXZWJLaXQgeworY2xhc3MgV2ViU3RyaW5nOworY2xhc3MgV2ViVmlld0ltcGw7Cit0ZW1w
bGF0ZSA8dHlwZW5hbWUgVD4gY2xhc3MgV2ViVmVjdG9yOworCisvLyBUaGUgU3VnZ2VzdGlvbnMg
cG9wdXAgbWVudSBjbGllbnQsIHVzZWQgdG8gZGlzcGxheSBhIGxpc3Qgb2Ygc3VnZ2VzdGlvbnMu
CitjbGFzcyBTdWdnZXN0aW9uc1BvcHVwTWVudUNsaWVudCA6IHB1YmxpYyBXZWJDb3JlOjpQb3B1
cE1lbnVDbGllbnQgeworcHVibGljOgorICAgIFN1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50KCk7
CisgICAgdmlydHVhbCB+U3VnZ2VzdGlvbnNQb3B1cE1lbnVDbGllbnQoKTsKKworICAgIC8vIFJl
dHVybnMgdGhlIG51bWJlciBvZiBzdWdnZXN0aW9ucyBhdmFpbGFibGUuCisgICAgdmlydHVhbCB1
bnNpZ25lZCBnZXRTdWdnZXN0aW9uc0NvdW50KCkgY29uc3QgPSAwOworCisgICAgLy8gUmV0dXJu
cyB0aGUgc3VnZ2VzdGlvbiBhdCB8bGlzdEluZGV4fC4KKyAgICB2aXJ0dWFsIFdlYlN0cmluZyBn
ZXRTdWdnZXN0aW9uKHVuc2lnbmVkIGxpc3RJbmRleCkgY29uc3QgPSAwOworCisgICAgLy8gUmVt
b3ZlcyB0aGUgc3VnZ2VzdGlvbiBhdCB8bGlzdEluZGV4fCBmcm9tIHRoZSBsaXN0IG9mIHN1Z2dl
c3Rpb25zLgorICAgIHZpcnR1YWwgdm9pZCByZW1vdmVTdWdnZXN0aW9uQXRJbmRleCh1bnNpZ25l
ZCBsaXN0SW5kZXgpID0gMDsKKworICAgIC8vIFdlYkNvcmU6OlBvcHVwTWVudUNsaWVudCBtZXRo
b2RzOgorICAgIHZpcnR1YWwgdm9pZCB2YWx1ZUNoYW5nZWQodW5zaWduZWQgbGlzdEluZGV4LCBi
b29sIGZpcmVFdmVudHMgPSB0cnVlKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2VsZWN0aW9uQ2hhbmdl
ZCh1bnNpZ25lZCBsaXN0SW5kZXgsIGJvb2wgZmlyZUV2ZW50cyA9IHRydWUpOworICAgIHZpcnR1
YWwgV2ViQ29yZTo6U3RyaW5nIGl0ZW1UZXh0KHVuc2lnbmVkIGxpc3RJbmRleCkgY29uc3Q7Cisg
ICAgdmlydHVhbCBXZWJDb3JlOjpTdHJpbmcgaXRlbVRvb2xUaXAodW5zaWduZWQgbGFzdEluZGV4
KSBjb25zdCB7IHJldHVybiBXZWJDb3JlOjpTdHJpbmcoKTsgfQorICAgIHZpcnR1YWwgYm9vbCBp
dGVtSXNFbmFibGVkKHVuc2lnbmVkIGxpc3RJbmRleCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQor
ICAgIHZpcnR1YWwgV2ViQ29yZTo6UG9wdXBNZW51U3R5bGUgaXRlbVN0eWxlKHVuc2lnbmVkIGxp
c3RJbmRleCkgY29uc3Q7CisgICAgdmlydHVhbCBXZWJDb3JlOjpQb3B1cE1lbnVTdHlsZSBtZW51
U3R5bGUoKSBjb25zdDsKKyAgICB2aXJ0dWFsIGludCBjbGllbnRJbnNldExlZnQoKSBjb25zdCB7
IHJldHVybiAwOyB9CisgICAgdmlydHVhbCBpbnQgY2xpZW50SW5zZXRSaWdodCgpIGNvbnN0IHsg
cmV0dXJuIDA7IH0KKyAgICB2aXJ0dWFsIGludCBjbGllbnRQYWRkaW5nTGVmdCgpIGNvbnN0Owor
ICAgIHZpcnR1YWwgaW50IGNsaWVudFBhZGRpbmdSaWdodCgpIGNvbnN0OworICAgIHZpcnR1YWwg
aW50IGxpc3RTaXplKCkgY29uc3QgeyByZXR1cm4gZ2V0U3VnZ2VzdGlvbnNDb3VudCgpOyB9Cisg
ICAgdmlydHVhbCBpbnQgc2VsZWN0ZWRJbmRleCgpIGNvbnN0IHsgcmV0dXJuIG1fc2VsZWN0ZWRJ
bmRleDsgfQorICAgIHZpcnR1YWwgdm9pZCBwb3B1cERpZEhpZGUoKTsKKyAgICB2aXJ0dWFsIGJv
b2wgaXRlbUlzU2VwYXJhdG9yKHVuc2lnbmVkIGxpc3RJbmRleCkgY29uc3QgeyByZXR1cm4gZmFs
c2U7IH0KKyAgICB2aXJ0dWFsIGJvb2wgaXRlbUlzTGFiZWwodW5zaWduZWQgbGlzdEluZGV4KSBj
b25zdCB7IHJldHVybiBmYWxzZTsgfQorICAgIHZpcnR1YWwgYm9vbCBpdGVtSXNTZWxlY3RlZCh1
bnNpZ25lZCBsaXN0SW5kZXgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgICAgdmlydHVhbCBi
b29sIHNob3VsZFBvcE92ZXIoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorICAgIHZpcnR1YWwg
Ym9vbCB2YWx1ZVNob3VsZENoYW5nZU9uSG90VHJhY2soKSBjb25zdCB7IHJldHVybiBmYWxzZTsg
fQorICAgIHZpcnR1YWwgdm9pZCBzZXRUZXh0RnJvbUl0ZW0odW5zaWduZWQgbGlzdEluZGV4KTsK
KyAgICB2aXJ0dWFsIFdlYkNvcmU6OkZvbnRTZWxlY3RvciogZm9udFNlbGVjdG9yKCkgY29uc3Q7
CisgICAgdmlydHVhbCBXZWJDb3JlOjpIb3N0V2luZG93KiBob3N0V2luZG93KCkgY29uc3Q7Cisg
ICAgdmlydHVhbCBQYXNzUmVmUHRyPFdlYkNvcmU6OlNjcm9sbGJhcj4gY3JlYXRlU2Nyb2xsYmFy
KAorICAgICAgICBXZWJDb3JlOjpTY3JvbGxiYXJDbGllbnQqIGNsaWVudCwKKyAgICAgICAgV2Vi
Q29yZTo6U2Nyb2xsYmFyT3JpZW50YXRpb24gb3JpZW50YXRpb24sCisgICAgICAgIFdlYkNvcmU6
OlNjcm9sbGJhckNvbnRyb2xTaXplIHNpemUpOworCitwcm90ZWN0ZWQ6CisgICAgdm9pZCBpbml0
aWFsaXplKFdlYkNvcmU6OkhUTUxJbnB1dEVsZW1lbnQqIHRleHRGaWVsZCwKKyAgICAgICAgICAg
ICAgICAgICAgaW50IGRlZmF1bHRTdWdnZXN0aW9uSW5kZXgpOworICAgIHZvaWQgc2V0SW5pdGlh
bFN1Z2dlc3Rpb24oKTsKKworICAgIGludCBnZXRTZWxlY3RlZEluZGV4KCkgY29uc3QgeyByZXR1
cm4gbV9zZWxlY3RlZEluZGV4OyB9CisgICAgdm9pZCBzZXRTZWxlY3RlZEluZGV4KGludCBpbmRl
eCkgeyBtX3NlbGVjdGVkSW5kZXggPSBpbmRleDsgfQorCisgICAgdm9pZCBzZXRTdWdnZXN0ZWRW
YWx1ZShjb25zdCBXZWJTdHJpbmcmIHN1Z2dlc3Rpb24pOworCisgICAgV2ViVmlld0ltcGwqIGdl
dFdlYlZpZXcoKSBjb25zdDsKKyAgICBXZWJDb3JlOjpIVE1MSW5wdXRFbGVtZW50KiBnZXRUZXh0
RmllbGQoKSBjb25zdCB7IHJldHVybiBtX3RleHRGaWVsZC5nZXQoKTsgfQorCitwcml2YXRlOgor
ICAgIFdlYkNvcmU6OlJlbmRlclN0eWxlKiB0ZXh0RmllbGRTdHlsZSgpIGNvbnN0OworICAgIHZv
aWQgcmVzZXRMYXN0U3VnZ2VzdGlvbigpOworCisgICAgUmVmUHRyPFdlYkNvcmU6OkhUTUxJbnB1
dEVsZW1lbnQ+IG1fdGV4dEZpZWxkOworICAgIGludCBtX3NlbGVjdGVkSW5kZXg7CisgICAgV2Vi
Q29yZTo6U3RyaW5nIG1fdHlwZWRGaWVsZFZhbHVlOworICAgIE93blB0cjxXZWJDb3JlOjpQb3B1
cE1lbnVTdHlsZT4gbV9zdHlsZTsKKyAgICB0eXBlZGVmIEhhc2hNYXA8V2ViQ29yZTo6U3RyaW5n
LCBXZWJDb3JlOjpTdHJpbmc+IEZpZWxkVmFsdWVzTWFwOworICAgIE93blB0cjxGaWVsZFZhbHVl
c01hcD4gbV9sYXN0RmllbGRWYWx1ZXM7Cit9OworCit9IC8vIG5hbWVzcGFjZSBXZWJLaXQKKwor
I2VuZGlmCgpQcm9wZXJ0eSBjaGFuZ2VzIG9uOiBXZWJLaXQvY2hyb21pdW0vc3JjL1N1Z2dlc3Rp
b25zUG9wdXBNZW51Q2xpZW50LmgKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpBZGRlZDogc3ZuOmVvbC1zdHlsZQogICAr
IExGCgpJbmRleDogV2ViS2l0L2Nocm9taXVtL3NyYy9XZWJWaWV3SW1wbC5jcHAKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gV2ViS2l0L2Nocm9taXVtL3NyYy9XZWJWaWV3SW1wbC5jcHAJKHJldmlzaW9uIDU0NTAx
KQorKysgV2ViS2l0L2Nocm9taXVtL3NyYy9XZWJWaWV3SW1wbC5jcHAJKHdvcmtpbmcgY29weSkK
QEAgLTMxLDYgKzMxLDcgQEAKICNpbmNsdWRlICJjb25maWcuaCIKICNpbmNsdWRlICJXZWJWaWV3
SW1wbC5oIgogCisjaW5jbHVkZSAiQXV0b0ZpbGxQb3B1cE1lbnVDbGllbnQuaCIKICNpbmNsdWRl
ICJBdXRvY29tcGxldGVQb3B1cE1lbnVDbGllbnQuaCIKICNpbmNsdWRlICJBWE9iamVjdENhY2hl
LmgiCiAjaW5jbHVkZSAiQ2hyb21lLmgiCkBAIC0yNDAsNiArMjQxLDggQEAgV2ViVmlld0ltcGw6
OldlYlZpZXdJbXBsKFdlYlZpZXdDbGllbnQqIAogICAgICwgbV9vcGVyYXRpb25zQWxsb3dlZChX
ZWJEcmFnT3BlcmF0aW9uTm9uZSkKICAgICAsIG1fZHJhZ09wZXJhdGlvbihXZWJEcmFnT3BlcmF0
aW9uTm9uZSkKICAgICAsIG1fc3VnZ2VzdGlvbnNQb3B1cFNob3dpbmcoZmFsc2UpCisgICAgLCBt
X3N1Z2dlc3Rpb25zUG9wdXBDbGllbnQoMCkKKyAgICAsIG1fc3VnZ2VzdGlvbnNQb3B1cCgwKQog
ICAgICwgbV9pc1RyYW5zcGFyZW50KGZhbHNlKQogICAgICwgbV90YWJzVG9MaW5rcyhmYWxzZSkK
IHsKQEAgLTQ2OCw3ICs0NzEsNyBAQCBib29sIFdlYlZpZXdJbXBsOjprZXlFdmVudChjb25zdCBX
ZWJLZXliCiAgICAgLy8gZXZlbnQuCiAgICAgbV9zdXBwcmVzc05leHRLZXlwcmVzc0V2ZW50ID0g
ZmFsc2U7CiAKLSAgICAvLyBHaXZlIGF1dG9jb21wbGV0ZSBhIGNoYW5jZSB0byBjb25zdW1lIHRo
ZSBrZXkgZXZlbnRzIGl0IGlzIGludGVyZXN0ZWQgaW4uCisgICAgLy8gR2l2ZSBBdXRvY29tcGxl
dGUgYSBjaGFuY2UgdG8gY29uc3VtZSB0aGUga2V5IGV2ZW50cyBpdCBpcyBpbnRlcmVzdGVkIGlu
LgogICAgIGlmIChhdXRvY29tcGxldGVIYW5kbGVLZXlFdmVudChldmVudCkpCiAgICAgICAgIHJl
dHVybiB0cnVlOwogCkBAIC01NDEsNyArNTQ0LDcgQEAgYm9vbCBXZWJWaWV3SW1wbDo6YXV0b2Nv
bXBsZXRlSGFuZGxlS2V5RQogICAgICAgICBtX2NsaWVudC0+cmVtb3ZlQXV0b2ZpbGxTdWdnZXN0
aW9ucyhuYW1lLCB2YWx1ZSk7CiAgICAgICAgIC8vIFVwZGF0ZSB0aGUgZW50cmllcyBpbiB0aGUg
Y3VycmVudGx5IHNob3dpbmcgcG9wdXAgdG8gcmVmbGVjdCB0aGUKICAgICAgICAgLy8gZGVsZXRp
b24uCi0gICAgICAgIG1fYXV0b2NvbXBsZXRlUG9wdXBDbGllbnQtPnJlbW92ZUl0ZW1BdEluZGV4
KHNlbGVjdGVkSW5kZXgpOworICAgICAgICBtX2F1dG9jb21wbGV0ZVBvcHVwQ2xpZW50LT5yZW1v
dmVTdWdnZXN0aW9uQXRJbmRleChzZWxlY3RlZEluZGV4KTsKICAgICAgICAgcmVmcmVzaFN1Z2dl
c3Rpb25zUG9wdXAoKTsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KQEAgLTE1NTgsNTgg
KzE1NjEsMTE4IEBAIHZvaWQgV2ViVmlld0ltcGw6OmFwcGx5QXV0b2ZpbGxTdWdnZXN0aW8KICAg
ICBjb25zdCBXZWJWZWN0b3I8V2ViU3RyaW5nPiYgc3VnZ2VzdGlvbnMsCiAgICAgaW50IGRlZmF1
bHRTdWdnZXN0aW9uSW5kZXgpCiB7Ci0gICAgaWYgKCFtX3BhZ2UuZ2V0KCkgfHwgc3VnZ2VzdGlv
bnMuaXNFbXB0eSgpKSB7CisgICAgYXBwbHlBdXRvY29tcGxldGVTdWdnZXN0aW9ucyhub2RlLCBz
dWdnZXN0aW9ucywgZGVmYXVsdFN1Z2dlc3Rpb25JbmRleCk7Cit9CisKK3ZvaWQgV2ViVmlld0lt
cGw6OmFwcGx5QXV0b0ZpbGxTdWdnZXN0aW9ucygKKyAgICBjb25zdCBXZWJOb2RlJiBub2RlLAor
ICAgIGNvbnN0IFdlYlZlY3RvcjxXZWJTdHJpbmc+JiBuYW1lcywKKyAgICBjb25zdCBXZWJWZWN0
b3I8V2ViU3RyaW5nPiYgbGFiZWxzLAorICAgIGludCBkZWZhdWx0U3VnZ2VzdGlvbkluZGV4KQor
eworICAgIEFTU0VSVChuYW1lcy5zaXplKCkgPT0gbGFiZWxzLnNpemUoKSk7CisgICAgQVNTRVJU
KGRlZmF1bHRTdWdnZXN0aW9uSW5kZXggPCBzdGF0aWNfY2FzdDxpbnQ+KG5hbWVzLnNpemUoKSkp
OworCisgICAgaWYgKG5hbWVzLmlzRW1wdHkoKSkgewogICAgICAgICBoaWRlU3VnZ2VzdGlvbnNQ
b3B1cCgpOwogICAgICAgICByZXR1cm47CiAgICAgfQogCisgICAgUmVmUHRyPE5vZGU+IGZvY3Vz
ZWROb2RlID0gZm9jdXNlZFdlYkNvcmVOb2RlKCk7CisgICAgLy8gSWYgdGhlIG5vZGUgZm9yIHdo
aWNoIHdlIHF1ZXJpZWQgdGhlIEF1dG9GaWxsIHN1Z2dlc3Rpb25zIGlzIG5vdCB0aGUKKyAgICAv
LyBmb2N1c2VkIG5vZGUsIHRoZW4gd2UgaGF2ZSBub3RoaW5nIHRvIGRvLiAgRklYTUU6IGFsc28g
Y2hlY2sgdGhlCisgICAgLy8gY2FyZXQgaXMgYXQgdGhlIGVuZCBhbmQgdGhhdCB0aGUgdGV4dCBo
YXMgbm90IGNoYW5nZWQuCisgICAgaWYgKCFmb2N1c2VkTm9kZSB8fCBmb2N1c2VkTm9kZSAhPSBQ
YXNzUmVmUHRyPE5vZGU+KG5vZGUpKSB7CisgICAgICAgIGhpZGVTdWdnZXN0aW9uc1BvcHVwKCk7
CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBIVE1MSW5wdXRFbGVtZW50KiBpbnB1dEVs
ZW0gPQorICAgICAgICBzdGF0aWNfY2FzdDxIVE1MSW5wdXRFbGVtZW50Kj4oZm9jdXNlZE5vZGUu
Z2V0KCkpOworCisgICAgLy8gVGhlIGZpcnN0IHRpbWUgdGhlIEF1dG9GaWxsIHBvcHVwIGlzIHNo
b3duIHdlJ2xsIGNyZWF0ZSB0aGUgY2xpZW50IGFuZAorICAgIC8vIHRoZSBwb3B1cC4KKyAgICBp
ZiAoIW1fYXV0b0ZpbGxQb3B1cENsaWVudC5nZXQoKSkKKyAgICAgICAgbV9hdXRvRmlsbFBvcHVw
Q2xpZW50LnNldChuZXcgQXV0b0ZpbGxQb3B1cE1lbnVDbGllbnQpOworCisgICAgbV9hdXRvRmls
bFBvcHVwQ2xpZW50LT5pbml0aWFsaXplKGlucHV0RWxlbSwgbmFtZXMsIGxhYmVscywKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFN1Z2dlc3Rpb25JbmRleCk7
CisKKyAgICBpZiAobV9zdWdnZXN0aW9uc1BvcHVwQ2xpZW50ICE9IG1fYXV0b0ZpbGxQb3B1cENs
aWVudC5nZXQoKSkgeworICAgICAgICBoaWRlU3VnZ2VzdGlvbnNQb3B1cCgpOworICAgICAgICBt
X3N1Z2dlc3Rpb25zUG9wdXBDbGllbnQgPSBtX2F1dG9GaWxsUG9wdXBDbGllbnQuZ2V0KCk7Cisg
ICAgfQorCisgICAgaWYgKCFtX2F1dG9GaWxsUG9wdXAuZ2V0KCkpIHsKKyAgICAgICAgbV9hdXRv
RmlsbFBvcHVwID0gUG9wdXBDb250YWluZXI6OmNyZWF0ZShtX3N1Z2dlc3Rpb25zUG9wdXBDbGll
bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vn
Z2VzdGlvbnNQb3B1cFNldHRpbmdzKTsKKyAgICB9CisKKyAgICBpZiAobV9zdWdnZXN0aW9uc1Bv
cHVwICE9IG1fYXV0b0ZpbGxQb3B1cC5nZXQoKSkKKyAgICAgICAgbV9zdWdnZXN0aW9uc1BvcHVw
ID0gbV9hdXRvRmlsbFBvcHVwLmdldCgpOworCisgICAgaWYgKG1fc3VnZ2VzdGlvbnNQb3B1cFNo
b3dpbmcpIHsKKyAgICAgICAgbV9hdXRvRmlsbFBvcHVwQ2xpZW50LT5zZXRTdWdnZXN0aW9ucyhu
YW1lcywgbGFiZWxzKTsKKyAgICAgICAgcmVmcmVzaFN1Z2dlc3Rpb25zUG9wdXAoKTsKKyAgICB9
IGVsc2UgeworICAgICAgICBtX3N1Z2dlc3Rpb25zUG9wdXAtPnNob3coZm9jdXNlZE5vZGUtPmdl
dFJlY3QoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvY3VzZWROb2RlLT5v
d25lckRvY3VtZW50KCktPnZpZXcoKSwgMCk7CisgICAgICAgIG1fc3VnZ2VzdGlvbnNQb3B1cFNo
b3dpbmcgPSB0cnVlOworICAgIH0KK30KKwordm9pZCBXZWJWaWV3SW1wbDo6YXBwbHlBdXRvY29t
cGxldGVTdWdnZXN0aW9ucygKKyAgICBjb25zdCBXZWJOb2RlJiBub2RlLAorICAgIGNvbnN0IFdl
YlZlY3RvcjxXZWJTdHJpbmc+JiBzdWdnZXN0aW9ucywKKyAgICBpbnQgZGVmYXVsdFN1Z2dlc3Rp
b25JbmRleCkKK3sKICAgICBBU1NFUlQoZGVmYXVsdFN1Z2dlc3Rpb25JbmRleCA8IHN0YXRpY19j
YXN0PGludD4oc3VnZ2VzdGlvbnMuc2l6ZSgpKSk7CiAKLSAgICBpZiAoUmVmUHRyPEZyYW1lPiBm
b2N1c2VkID0gbV9wYWdlLT5mb2N1c0NvbnRyb2xsZXIoKS0+Zm9jdXNlZEZyYW1lKCkpIHsKLSAg
ICAgICAgUmVmUHRyPERvY3VtZW50PiBkb2N1bWVudCA9IGZvY3VzZWQtPmRvY3VtZW50KCk7Ci0g
ICAgICAgIGlmICghZG9jdW1lbnQuZ2V0KCkpIHsKLSAgICAgICAgICAgIGhpZGVTdWdnZXN0aW9u
c1BvcHVwKCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KKyAgICBpZiAoIW1fcGFn
ZS5nZXQoKSB8fCBzdWdnZXN0aW9ucy5pc0VtcHR5KCkpIHsKKyAgICAgICAgaGlkZVN1Z2dlc3Rp
b25zUG9wdXAoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KIAotICAgICAgICBSZWZQdHI8Tm9k
ZT4gZm9jdXNlZE5vZGUgPSBkb2N1bWVudC0+Zm9jdXNlZE5vZGUoKTsKLSAgICAgICAgLy8gSWYg
dGhlIG5vZGUgZm9yIHdoaWNoIHdlIHF1ZXJpZWQgdGhlIGF1dG9maWxsIHN1Z2dlc3Rpb25zIGlz
IG5vdCB0aGUKLSAgICAgICAgLy8gZm9jdXNlZCBub2RlLCB0aGVuIHdlIGhhdmUgbm90aGluZyB0
byBkby4gIEZJWE1FOiBhbHNvIGNoZWNrIHRoZQotICAgICAgICAvLyBjYXJyZXQgaXMgYXQgdGhl
IGVuZCBhbmQgdGhhdCB0aGUgdGV4dCBoYXMgbm90IGNoYW5nZWQuCi0gICAgICAgIGlmICghZm9j
dXNlZE5vZGUuZ2V0KCkgfHwgZm9jdXNlZE5vZGUgIT0gUGFzc1JlZlB0cjxOb2RlPihub2RlKSkg
ewotICAgICAgICAgICAgaGlkZVN1Z2dlc3Rpb25zUG9wdXAoKTsKLSAgICAgICAgICAgIHJldHVy
bjsKLSAgICAgICAgfQorICAgIFJlZlB0cjxOb2RlPiBmb2N1c2VkTm9kZSA9IGZvY3VzZWRXZWJD
b3JlTm9kZSgpOworICAgIC8vIElmIHRoZSBub2RlIGZvciB3aGljaCB3ZSBxdWVyaWVkIHRoZSBB
dXRvY29tcGxldGUgc3VnZ2VzdGlvbnMgaXMgbm90IHRoZQorICAgIC8vIGZvY3VzZWQgbm9kZSwg
dGhlbiB3ZSBoYXZlIG5vdGhpbmcgdG8gZG8uICBGSVhNRTogYWxzbyBjaGVjayB0aGUKKyAgICAv
LyBjYXJldCBpcyBhdCB0aGUgZW5kIGFuZCB0aGF0IHRoZSB0ZXh0IGhhcyBub3QgY2hhbmdlZC4K
KyAgICBpZiAoIWZvY3VzZWROb2RlIHx8IGZvY3VzZWROb2RlICE9IFBhc3NSZWZQdHI8Tm9kZT4o
bm9kZSkpIHsKKyAgICAgICAgaGlkZVN1Z2dlc3Rpb25zUG9wdXAoKTsKKyAgICAgICAgcmV0dXJu
OworICAgIH0KIAotICAgICAgICBpZiAoIWZvY3VzZWROb2RlLT5oYXNUYWdOYW1lKEhUTUxOYW1l
czo6aW5wdXRUYWcpKSB7Ci0gICAgICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKLSAgICAg
ICAgICAgIHJldHVybjsKLSAgICAgICAgfQorICAgIEhUTUxJbnB1dEVsZW1lbnQqIGlucHV0RWxl
bSA9CisgICAgICAgIHN0YXRpY19jYXN0PEhUTUxJbnB1dEVsZW1lbnQqPihmb2N1c2VkTm9kZS5n
ZXQoKSk7CiAKLSAgICAgICAgSFRNTElucHV0RWxlbWVudCogaW5wdXRFbGVtID0KLSAgICAgICAg
ICAgIHN0YXRpY19jYXN0PEhUTUxJbnB1dEVsZW1lbnQqPihmb2N1c2VkTm9kZS5nZXQoKSk7Cisg
ICAgLy8gVGhlIGZpcnN0IHRpbWUgdGhlIEF1dG9jb21wbGV0ZSBpcyBzaG93biB3ZSdsbCBjcmVh
dGUgdGhlIGNsaWVudCBhbmQgdGhlCisgICAgLy8gcG9wdXAuCisgICAgaWYgKCFtX2F1dG9jb21w
bGV0ZVBvcHVwQ2xpZW50LmdldCgpKQorICAgICAgICBtX2F1dG9jb21wbGV0ZVBvcHVwQ2xpZW50
LnNldChuZXcgQXV0b2NvbXBsZXRlUG9wdXBNZW51Q2xpZW50KTsKIAotICAgICAgICAvLyBUaGUg
Zmlyc3QgdGltZSB0aGUgc3VnZ2VzdGlvbnMgcG9wdXAgaXMgc2hvd24gd2UnbGwgY3JlYXRlIHRo
ZSBjbGllbnQKLSAgICAgICAgLy8gYW5kIHRoZSBwb3B1cC4KLSAgICAgICAgaWYgKCFtX2F1dG9j
b21wbGV0ZVBvcHVwQ2xpZW50LmdldCgpKQotICAgICAgICAgICAgbV9hdXRvY29tcGxldGVQb3B1
cENsaWVudC5zZXQobmV3IEF1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVudCh0aGlzKSk7Ci0gICAg
ICAgIG1fYXV0b2NvbXBsZXRlUG9wdXBDbGllbnQtPmluaXRpYWxpemUoaW5wdXRFbGVtLAotICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Z2dlc3Rpb25zLAot
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRTdWdn
ZXN0aW9uSW5kZXgpOwotICAgICAgICBpZiAoIW1fc3VnZ2VzdGlvbnNQb3B1cC5nZXQoKSkgewot
ICAgICAgICAgICAgbV9zdWdnZXN0aW9uc1BvcHVwID0KLSAgICAgICAgICAgICAgICBQb3B1cENv
bnRhaW5lcjo6Y3JlYXRlKG1fYXV0b2NvbXBsZXRlUG9wdXBDbGllbnQuZ2V0KCksCi0gICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWdnZXN0aW9uc1BvcHVwU2V0dGluZ3Mp
OwotICAgICAgICB9CisgICAgbV9hdXRvY29tcGxldGVQb3B1cENsaWVudC0+aW5pdGlhbGl6ZShp
bnB1dEVsZW0sIHN1Z2dlc3Rpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgZGVmYXVsdFN1Z2dlc3Rpb25JbmRleCk7CiAKLSAgICAgICAgaWYgKG1fc3VnZ2Vz
dGlvbnNQb3B1cFNob3dpbmcpIHsKLSAgICAgICAgICAgIG1fYXV0b2NvbXBsZXRlUG9wdXBDbGll
bnQtPnNldFN1Z2dlc3Rpb25zKHN1Z2dlc3Rpb25zKTsKLSAgICAgICAgICAgIHJlZnJlc2hTdWdn
ZXN0aW9uc1BvcHVwKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtX3N1Z2dlc3Rp
b25zUG9wdXAtPnNob3coZm9jdXNlZE5vZGUtPmdldFJlY3QoKSwKLSAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBmb2N1c2VkTm9kZS0+b3duZXJEb2N1bWVudCgpLT52aWV3KCks
IDApOwotICAgICAgICAgICAgbV9zdWdnZXN0aW9uc1BvcHVwU2hvd2luZyA9IHRydWU7Ci0gICAg
ICAgIH0KKyAgICBpZiAobV9zdWdnZXN0aW9uc1BvcHVwQ2xpZW50ICE9IG1fYXV0b2NvbXBsZXRl
UG9wdXBDbGllbnQuZ2V0KCkpIHsKKyAgICAgICAgaGlkZVN1Z2dlc3Rpb25zUG9wdXAoKTsKKyAg
ICAgICAgbV9zdWdnZXN0aW9uc1BvcHVwQ2xpZW50ID0gbV9hdXRvY29tcGxldGVQb3B1cENsaWVu
dC5nZXQoKTsKKyAgICB9CisKKyAgICBpZiAoIW1fYXV0b2NvbXBsZXRlUG9wdXAuZ2V0KCkpIHsK
KyAgICAgICAgbV9hdXRvY29tcGxldGVQb3B1cCA9IFBvcHVwQ29udGFpbmVyOjpjcmVhdGUobV9z
dWdnZXN0aW9uc1BvcHVwQ2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBzdWdnZXN0aW9uc1BvcHVwU2V0dGluZ3MpOworICAgIH0KKwor
ICAgIGlmIChtX3N1Z2dlc3Rpb25zUG9wdXAgIT0gbV9hdXRvY29tcGxldGVQb3B1cC5nZXQoKSkK
KyAgICAgICAgbV9zdWdnZXN0aW9uc1BvcHVwID0gbV9hdXRvY29tcGxldGVQb3B1cC5nZXQoKTsK
KworICAgIGlmIChtX3N1Z2dlc3Rpb25zUG9wdXBTaG93aW5nKSB7CisgICAgICAgIG1fYXV0b2Nv
bXBsZXRlUG9wdXBDbGllbnQtPnNldFN1Z2dlc3Rpb25zKHN1Z2dlc3Rpb25zKTsKKyAgICAgICAg
cmVmcmVzaFN1Z2dlc3Rpb25zUG9wdXAoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtX3N1Z2dl
c3Rpb25zUG9wdXAtPnNob3coZm9jdXNlZE5vZGUtPmdldFJlY3QoKSwKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGZvY3VzZWROb2RlLT5vd25lckRvY3VtZW50KCktPnZpZXcoKSwg
MCk7CisgICAgICAgIG1fc3VnZ2VzdGlvbnNQb3B1cFNob3dpbmcgPSB0cnVlOwogICAgIH0KIH0K
IApJbmRleDogV2ViS2l0L2Nocm9taXVtL3NyYy9XZWJWaWV3SW1wbC5oCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFdlYktpdC9jaHJvbWl1bS9zcmMvV2ViVmlld0ltcGwuaAkocmV2aXNpb24gNTQ1MDEpCisrKyBX
ZWJLaXQvY2hyb21pdW0vc3JjL1dlYlZpZXdJbXBsLmgJKHdvcmtpbmcgY29weSkKQEAgLTU4LDYg
KzU4LDcgQEAgY2xhc3MgS2V5Ym9hcmRFdmVudDsKIGNsYXNzIFBhZ2U7CiBjbGFzcyBQbGF0Zm9y
bUtleWJvYXJkRXZlbnQ7CiBjbGFzcyBQb3B1cENvbnRhaW5lcjsKK2NsYXNzIFBvcHVwTWVudUNs
aWVudDsKIGNsYXNzIFJhbmdlOwogY2xhc3MgUmVuZGVyVGhlbWU7CiBjbGFzcyBXaWRnZXQ7CkBA
IC02NSw3ICs2Niw5IEBAIGNsYXNzIFdpZGdldDsKIAogbmFtZXNwYWNlIFdlYktpdCB7CiBjbGFz
cyBBdXRvY29tcGxldGVQb3B1cE1lbnVDbGllbnQ7CitjbGFzcyBBdXRvRmlsbFBvcHVwTWVudUNs
aWVudDsKIGNsYXNzIENvbnRleHRNZW51Q2xpZW50SW1wbDsKK2NsYXNzIFN1Z2dlc3Rpb25zUG9w
dXBNZW51Q2xpZW50OwogY2xhc3MgV2ViQWNjZXNzaWJpbGl0eU9iamVjdDsKIGNsYXNzIFdlYkRl
dlRvb2xzQWdlbnRQcml2YXRlOwogY2xhc3MgV2ViRnJhbWVJbXBsOwpAQCAtMTUzLDYgKzE1Niwx
NSBAQCBwdWJsaWM6CiAgICAgICAgIGNvbnN0IFdlYk5vZGUmLAogICAgICAgICBjb25zdCBXZWJW
ZWN0b3I8V2ViU3RyaW5nPiYgc3VnZ2VzdGlvbnMsCiAgICAgICAgIGludCBkZWZhdWx0U3VnZ2Vz
dGlvbkluZGV4KTsKKyAgICB2aXJ0dWFsIHZvaWQgYXBwbHlBdXRvRmlsbFN1Z2dlc3Rpb25zKAor
ICAgICAgICBjb25zdCBXZWJOb2RlJiwKKyAgICAgICAgY29uc3QgV2ViVmVjdG9yPFdlYlN0cmlu
Zz4mIG5hbWVzLAorICAgICAgICBjb25zdCBXZWJWZWN0b3I8V2ViU3RyaW5nPiYgbGFiZWxzLAor
ICAgICAgICBpbnQgZGVmYXVsdFN1Z2dlc3Rpb25JbmRleCk7CisgICAgdmlydHVhbCB2b2lkIGFw
cGx5QXV0b2NvbXBsZXRlU3VnZ2VzdGlvbnMoCisgICAgICAgIGNvbnN0IFdlYk5vZGUmLAorICAg
ICAgICBjb25zdCBXZWJWZWN0b3I8V2ViU3RyaW5nPiYgc3VnZ2VzdGlvbnMsCisgICAgICAgIGlu
dCBkZWZhdWx0U3VnZ2VzdGlvbkluZGV4KTsKICAgICB2aXJ0dWFsIHZvaWQgaGlkZUF1dG9maWxs
UG9wdXAoKTsKICAgICB2aXJ0dWFsIHZvaWQgaGlkZVN1Z2dlc3Rpb25zUG9wdXAoKTsKICAgICB2
aXJ0dWFsIHZvaWQgc2V0U2Nyb2xsYmFyQ29sb3JzKHVuc2lnbmVkIGluYWN0aXZlQ29sb3IsCkBA
IC0zOTUsMTYgKzQwNywyOSBAQCBwcml2YXRlOgogICAgIC8vIGN1cnJlbnQgZHJvcCB0YXJnZXQg
aW4gdGhpcyBXZWJWaWV3ICh0aGUgZHJvcCB0YXJnZXQgY2FuIGFjY2VwdCB0aGUgZHJvcCkuCiAg
ICAgV2ViRHJhZ09wZXJhdGlvbiBtX2RyYWdPcGVyYXRpb247CiAKLSAgICAvLyBUaGUgc3VnZ2Vz
dGlvbnMgcG9wdXAuICBLZXB0IGFyb3VuZCBhbmQgcmV1c2VkIGV2ZXJ5LXRpbWUgbmV3IHN1Z2dl
c3Rpb25zCi0gICAgLy8gc2hvdWxkIGJlIHNob3duLgotICAgIFJlZlB0cjxXZWJDb3JlOjpQb3B1
cENvbnRhaW5lcj4gbV9zdWdnZXN0aW9uc1BvcHVwOwotCi0gICAgLy8gV2hldGhlciB0aGUgc3Vn
Z2VzdGlvbnMgcG9wdXAgaXMgY3VycmVudGx5IHNob3dpbmcuCisgICAgLy8gV2hldGhlciBhIHN1
Z2dlc3Rpb25zIHBvcHVwIGlzIGN1cnJlbnRseSBzaG93aW5nLgogICAgIGJvb2wgbV9zdWdnZXN0
aW9uc1BvcHVwU2hvd2luZzsKIAotICAgIC8vIFRoZSBhdXRvY29tcGxldGUgY2xpZW50LgorICAg
IC8vIEEgcG9pbnRlciB0byB0aGUgY3VycmVudCBzdWdnZXN0aW9ucyBwb3B1cCBtZW51IGNsaWVu
dC4gIFRoaXMgY2FuIGJlCisgICAgLy8gZWl0aGVyIGFuIEF1dG9GaWxsUG9wdXBNZW51Q2xpZW50
IG9yIGFuIEF1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVudC4gIFdlCisgICAgLy8gZG8gbm90IG93
biB0aGlzIHBvaW50ZXIuCisgICAgU3VnZ2VzdGlvbnNQb3B1cE1lbnVDbGllbnQqIG1fc3VnZ2Vz
dGlvbnNQb3B1cENsaWVudDsKKworICAgIC8vIFRoZSBBdXRvRmlsbCBwb3B1cCBjbGllbnQuCisg
ICAgT3duUHRyPEF1dG9GaWxsUG9wdXBNZW51Q2xpZW50PiBtX2F1dG9GaWxsUG9wdXBDbGllbnQ7
CisKKyAgICAvLyBUaGUgQXV0b2NvbXBsZXRlIHBvcHVwIGNsaWVudC4KICAgICBPd25QdHI8QXV0
b2NvbXBsZXRlUG9wdXBNZW51Q2xpZW50PiBtX2F1dG9jb21wbGV0ZVBvcHVwQ2xpZW50OwogCisg
ICAgLy8gQSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IHN1Z2dlc3Rpb25zIHBvcHVwLiAgV2UgZG8g
bm90IG93biB0aGlzIHBvaW50ZXIuCisgICAgV2ViQ29yZTo6UG9wdXBDb250YWluZXIqIG1fc3Vn
Z2VzdGlvbnNQb3B1cDsKKworICAgIC8vIFRoZSBBdXRvRmlsbCBzdWdnZXN0aW9ucyBwb3B1cC4K
KyAgICBSZWZQdHI8V2ViQ29yZTo6UG9wdXBDb250YWluZXI+IG1fYXV0b0ZpbGxQb3B1cDsKKwor
ICAgIC8vIFRoZSBBdXRvQ29tcGxldGUgc3VnZ2VzdGlvbnMgcG9wdXAuCisgICAgUmVmUHRyPFdl
YkNvcmU6OlBvcHVwQ29udGFpbmVyPiBtX2F1dG9jb21wbGV0ZVBvcHVwOworCiAgICAgT3duUHRy
PFdlYkRldlRvb2xzQWdlbnRQcml2YXRlPiBtX2RldlRvb2xzQWdlbnQ7CiAKICAgICAvLyBXaGV0
aGVyIHRoZSB3ZWJ2aWV3IGlzIHJlbmRlcmluZyB0cmFuc3BhcmVudGx5Lgo=
</data>
<flag name="review"
          id="31130"
          type_id="1"
          status="-"
          setter="fishd"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>48446</attachid>
            <date>2010-02-09 15:24:43 -0800</date>
            <delta_ts>2010-02-09 15:30:29 -0800</delta_ts>
            <desc>[Chromium] Refactor AutocompletePopupMenuClient [try6]</desc>
            <filename>refactor6.diff</filename>
            <type>text/plain</type>
            <size>47159</size>
            <attacher name="James Hawkins">jhawkins</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYktpdC9jaHJvbWl1bS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0L2No
cm9taXVtL0NoYW5nZUxvZwkocmV2aXNpb24gNTQ1NjgpCisrKyBXZWJLaXQvY2hyb21pdW0vQ2hh
bmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMzYgQEAKKzIwMTAtMDItMDkgIEphbWVz
IEhhd2tpbnMgIDxqaGF3a2luc0BjaHJvbWl1bS5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkg
Tk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgW0Nocm9taXVtXSBSZWZhY3RvciBBdXRvY29tcGxl
dGVQb3B1cE1lbnVDbGllbnQgaW50byBhIGJhc2UgY2xhc3MsCisgICAgICAgIFN1Z2dlc3Rpb25z
UG9wdXBNZW51Q2xpZW50LCBhbmQgdHdvIGRlcml2ZWQgY2xhc3NlcywKKyAgICAgICAgQXV0b2Nv
bXBsZXRlUG9wdXBNZW51Q2xpZW50IGFuZCBBdXRvRmlsbFBvcHVwTWVudUNsaWVudC4gIEN1cnJl
bnRseQorICAgICAgICB0aGUgYmVoYXZpb3Igb2Ygc3VnZ2VzdGlvbnMgcG9wdXBzIGhhcyBub3Qg
Y2hhbmdlZC4KKworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/
aWQ9MzQ3MjEKKworICAgICAgICAqIFdlYktpdC5neXA6CisgICAgICAgICogcHVibGljL1dlYlZp
ZXcuaDoKKyAgICAgICAgKiBzcmMvQXV0b0ZpbGxQb3B1cE1lbnVDbGllbnQuY3BwOiBBZGRlZC4K
KyAgICAgICAgKiBzcmMvQXV0b0ZpbGxQb3B1cE1lbnVDbGllbnQuaDogQWRkZWQuCisgICAgICAg
ICogc3JjL0F1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVudC5jcHA6CisgICAgICAgIChXZWJLaXQ6
OkF1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVudDo6Z2V0U3VnZ2VzdGlvbnNDb3VudCk6CisgICAg
ICAgIChXZWJLaXQ6OkF1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVudDo6Z2V0U3VnZ2VzdGlvbik6
CisgICAgICAgIChXZWJLaXQ6OkF1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVudDo6cmVtb3ZlU3Vn
Z2VzdGlvbkF0SW5kZXgpOgorICAgICAgICAoV2ViS2l0OjpBdXRvY29tcGxldGVQb3B1cE1lbnVD
bGllbnQ6OmluaXRpYWxpemUpOgorICAgICAgICAoV2ViS2l0OjpBdXRvY29tcGxldGVQb3B1cE1l
bnVDbGllbnQ6OnNldFN1Z2dlc3Rpb25zKToKKyAgICAgICAgKiBzcmMvQXV0b2NvbXBsZXRlUG9w
dXBNZW51Q2xpZW50Lmg6CisgICAgICAgICogc3JjL1N1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50
LmNwcDogQWRkZWQuCisgICAgICAgICogc3JjL1N1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50Lmg6
IEFkZGVkLgorICAgICAgICAqIHNyYy9XZWJWaWV3SW1wbC5jcHA6CisgICAgICAgIChXZWJLaXQ6
OldlYlZpZXdJbXBsOjpXZWJWaWV3SW1wbCk6CisgICAgICAgIChXZWJLaXQ6OldlYlZpZXdJbXBs
OjprZXlFdmVudCk6CisgICAgICAgIChXZWJLaXQ6OldlYlZpZXdJbXBsOjphdXRvY29tcGxldGVI
YW5kbGVLZXlFdmVudCk6CisgICAgICAgIChXZWJLaXQ6OldlYlZpZXdJbXBsOjphcHBseUF1dG9m
aWxsU3VnZ2VzdGlvbnMpOgorICAgICAgICAoV2ViS2l0OjpXZWJWaWV3SW1wbDo6YXBwbHlBdXRv
RmlsbFN1Z2dlc3Rpb25zKToKKyAgICAgICAgKFdlYktpdDo6V2ViVmlld0ltcGw6OmFwcGx5QXV0
b2NvbXBsZXRlU3VnZ2VzdGlvbnMpOgorICAgICAgICAqIHNyYy9XZWJWaWV3SW1wbC5oOgorCiAy
MDEwLTAyLTA5ICBKaWFuIExpICA8amlhbmxpQGNocm9taXVtLm9yZz4KIAogICAgICAgICBSZXZp
ZXdlZCBieSBEYXJpbiBGaXNoZXIuCkluZGV4OiBXZWJLaXQvY2hyb21pdW0vV2ViS2l0Lmd5cAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBXZWJLaXQvY2hyb21pdW0vV2ViS2l0Lmd5cAkocmV2aXNpb24gNTQ1MDEp
CisrKyBXZWJLaXQvY2hyb21pdW0vV2ViS2l0Lmd5cAkod29ya2luZyBjb3B5KQpAQCAtMTk5LDYg
KzE5OSw4IEBACiAgICAgICAgICAgICAgICAgJ3NyYy9Bc3NlcnRNYXRjaGluZ0VudW1zLmNwcCcs
CiAgICAgICAgICAgICAgICAgJ3NyYy9BdXRvY29tcGxldGVQb3B1cE1lbnVDbGllbnQuY3BwJywK
ICAgICAgICAgICAgICAgICAnc3JjL0F1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVudC5oJywKKyAg
ICAgICAgICAgICAgICAnc3JjL0F1dG9GaWxsUG9wdXBNZW51Q2xpZW50LmNwcCcsCisgICAgICAg
ICAgICAgICAgJ3NyYy9BdXRvRmlsbFBvcHVwTWVudUNsaWVudC5oJywKICAgICAgICAgICAgICAg
ICAnc3JjL0JhY2tGb3J3YXJkTGlzdENsaWVudEltcGwuY3BwJywKICAgICAgICAgICAgICAgICAn
c3JjL0JhY2tGb3J3YXJkTGlzdENsaWVudEltcGwuaCcsCiAgICAgICAgICAgICAgICAgJ3NyYy9C
b3VuZE9iamVjdC5jcHAnLApAQCAtMjU3LDYgKzI1OSw4IEBACiAgICAgICAgICAgICAgICAgJ3Ny
Yy9TdG9yYWdlRXZlbnREaXNwYXRjaGVySW1wbC5oJywKICAgICAgICAgICAgICAgICAnc3JjL1N0
b3JhZ2VOYW1lc3BhY2VQcm94eS5jcHAnLAogICAgICAgICAgICAgICAgICdzcmMvU3RvcmFnZU5h
bWVzcGFjZVByb3h5LmgnLAorICAgICAgICAgICAgICAgICdzcmMvU3VnZ2VzdGlvbnNQb3B1cE1l
bnVDbGllbnQuY3BwJywKKyAgICAgICAgICAgICAgICAnc3JjL1N1Z2dlc3Rpb25zUG9wdXBNZW51
Q2xpZW50LmgnLAogICAgICAgICAgICAgICAgICdzcmMvVGVtcG9yYXJ5R2x1ZS5oJywKICAgICAg
ICAgICAgICAgICAnc3JjL1Rvb2xzQWdlbnQuaCcsCiAgICAgICAgICAgICAgICAgJ3NyYy9XZWJB
Y2Nlc3NpYmlsaXR5Q2FjaGUuY3BwJywKSW5kZXg6IFdlYktpdC9jaHJvbWl1bS9wdWJsaWMvV2Vi
Vmlldy5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdC9jaHJvbWl1bS9wdWJsaWMvV2ViVmlldy5oCShy
ZXZpc2lvbiA1NDUwMSkKKysrIFdlYktpdC9jaHJvbWl1bS9wdWJsaWMvV2ViVmlldy5oCSh3b3Jr
aW5nIGNvcHkpCkBAIC0yMjMsMTQgKzIyMywyOSBAQCBwdWJsaWM6CiAgICAgdmlydHVhbCBXZWJB
Y2Nlc3NpYmlsaXR5T2JqZWN0IGFjY2Vzc2liaWxpdHlPYmplY3QoKSA9IDA7CiAKIAotICAgIC8v
IEF1dG9maWxsIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLQorICAgIC8vIEF1dG9GaWxsIC8gQXV0b2NvbXBsZXRlIC0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi0gICAgLy8gTm90aWZpZXMgdGhl
IFdlYlZpZXcgdGhhdCBhdXRvZmlsbCBzdWdnZXN0aW9ucyBhcmUgYXZhaWxhYmxlIGZvciBhIG5v
ZGUuCisgICAgLy8gREVQUkVDQVRFRDogV2ViVmlldzo6YXBwbHlBdXRvY29tcGxldGVTdWdnZXN0
aW9ucyBpcyB0aGUgbmV3IHdheSB0bworICAgIC8vIGFjY2VzcyB0aGlzLgogICAgIHZpcnR1YWwg
dm9pZCBhcHBseUF1dG9maWxsU3VnZ2VzdGlvbnMoCiAgICAgICAgIGNvbnN0IFdlYk5vZGUmLAog
ICAgICAgICBjb25zdCBXZWJWZWN0b3I8V2ViU3RyaW5nPiYgc3VnZ2VzdGlvbnMsCiAgICAgICAg
IGludCBkZWZhdWx0U3VnZ2VzdGlvbkluZGV4KSA9IDA7CiAKKyAgICAvLyBOb3RpZmllcyB0aGUg
V2ViVmlldyB0aGF0IEF1dG9GaWxsIHN1Z2dlc3Rpb25zIGFyZSBhdmFpbGFibGUgZm9yIGEgbm9k
ZS4KKyAgICB2aXJ0dWFsIHZvaWQgYXBwbHlBdXRvRmlsbFN1Z2dlc3Rpb25zKAorICAgICAgICBj
b25zdCBXZWJOb2RlJiwKKyAgICAgICAgY29uc3QgV2ViVmVjdG9yPFdlYlN0cmluZz4mIG5hbWVz
LAorICAgICAgICBjb25zdCBXZWJWZWN0b3I8V2ViU3RyaW5nPiYgbGFiZWxzLAorICAgICAgICBp
bnQgZGVmYXVsdFN1Z2dlc3Rpb25JbmRleCkgPSAwOworCisgICAgLy8gTm90aWZpZXMgdGhlIFdl
YlZpZXcgdGhhdCBBdXRvY29tcGxldGUgc3VnZ2VzdGlvbnMgYXJlIGF2YWlsYWJsZSBmb3IgYQor
ICAgIC8vIG5vZGUuCisgICAgdmlydHVhbCB2b2lkIGFwcGx5QXV0b2NvbXBsZXRlU3VnZ2VzdGlv
bnMoCisgICAgICAgIGNvbnN0IFdlYk5vZGUmLAorICAgICAgICBjb25zdCBXZWJWZWN0b3I8V2Vi
U3RyaW5nPiYgc3VnZ2VzdGlvbnMsCisgICAgICAgIGludCBkZWZhdWx0U3VnZ2VzdGlvbkluZGV4
KSA9IDA7CisKICAgICAvLyBERVBSRUNBVEVEOiBXZWJWaWV3OjpoaWRlU3VnZ2VzdGlvbnNQb3B1
cCBpcyB0aGUgbmV3IHdheSB0byBhY2Nlc3MgdGhpcy4KICAgICB2aXJ0dWFsIHZvaWQgaGlkZUF1
dG9maWxsUG9wdXAoKSA9IDA7CiAKSW5kZXg6IFdlYktpdC9jaHJvbWl1bS9zcmMvQXV0b0ZpbGxQ
b3B1cE1lbnVDbGllbnQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdC9jaHJvbWl1bS9zcmMvQXV0
b0ZpbGxQb3B1cE1lbnVDbGllbnQuY3BwCShyZXZpc2lvbiAwKQorKysgV2ViS2l0L2Nocm9taXVt
L3NyYy9BdXRvRmlsbFBvcHVwTWVudUNsaWVudC5jcHAJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEs
MTA2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6Cisg
KgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBi
aW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAq
IGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29v
Z2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNl
ZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNv
ZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBD
T05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFO
VElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJS
QU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxB
UiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hU
CisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJ
UkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElB
TCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5U
IE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwg
T1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQg
T04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJX
SVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdB
UkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisg
Ki8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkF1dG9GaWxsUG9wdXBNZW51Q2xp
ZW50LmgiCisKKyNpbmNsdWRlICJIVE1MSW5wdXRFbGVtZW50LmgiCisjaW5jbHVkZSAiV2ViU3Ry
aW5nLmgiCisjaW5jbHVkZSAiV2ViVmVjdG9yLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBXZWJDb3Jl
OworCituYW1lc3BhY2UgV2ViS2l0IHsKKwordW5zaWduZWQgQXV0b0ZpbGxQb3B1cE1lbnVDbGll
bnQ6OmdldFN1Z2dlc3Rpb25zQ291bnQoKSBjb25zdAoreworICAgIHJldHVybiBtX25hbWVzLnNp
emUoKTsKK30KKworV2ViU3RyaW5nIEF1dG9GaWxsUG9wdXBNZW51Q2xpZW50OjpnZXRTdWdnZXN0
aW9uKHVuc2lnbmVkIGxpc3RJbmRleCkgY29uc3QKK3sKKyAgICAvLyBGSVhNRTogTW9kaWZ5IHRo
ZSBQb3B1cE1lbnUgdG8gYWRkIHRoZSBsYWJlbCBpbiBncmF5IHJpZ2h0LWp1c3RpZmllZC4KKyAg
ICBBU1NFUlQobGlzdEluZGV4ID49IDAgJiYgbGlzdEluZGV4IDwgbV9uYW1lcy5zaXplKCkpOwor
ICAgIHJldHVybiBtX25hbWVzW2xpc3RJbmRleF0gKyBTdHJpbmcoIiAoIikgKyBtX2xhYmVsc1ts
aXN0SW5kZXhdICsgU3RyaW5nKCIpIik7Cit9CisKK3ZvaWQgQXV0b0ZpbGxQb3B1cE1lbnVDbGll
bnQ6OnJlbW92ZVN1Z2dlc3Rpb25BdEluZGV4KHVuc2lnbmVkIGxpc3RJbmRleCkKK3sKKyAgICAv
LyBGSVhNRTogRG8gd2Ugd2FudCB0byByZW1vdmUgQXV0b0ZpbGwgc3VnZ2VzdGlvbnM/CisgICAg
QVNTRVJUKGxpc3RJbmRleCA+PSAwICYmIGxpc3RJbmRleCA8IHN0YXRpY19jYXN0PGludD4obV9u
YW1lcy5zaXplKCkpKTsKKyAgICBtX25hbWVzLnJlbW92ZShsaXN0SW5kZXgpOworICAgIG1fbGFi
ZWxzLnJlbW92ZShsaXN0SW5kZXgpOworfQorCit2b2lkIEF1dG9GaWxsUG9wdXBNZW51Q2xpZW50
Ojogc2VsZWN0aW9uQ2hhbmdlZCh1bnNpZ25lZCBsaXN0SW5kZXgsCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZpcmVFdmVudHMpIHsKKyAgICBp
ZiAobGlzdEluZGV4ID09IHN0YXRpY19jYXN0PHVuc2lnbmVkPigtMSkpIHsKKyAgICAgICAgU3Vn
Z2VzdGlvbnNQb3B1cE1lbnVDbGllbnQ6OnNlbGVjdGlvbkNoYW5nZWQobGlzdEluZGV4LCBmaXJl
RXZlbnRzKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEFTU0VSVChsaXN0SW5kZXgg
Pj0gMCAmJiBsaXN0SW5kZXggPCBtX25hbWVzLnNpemUoKSk7CisgICAgc2V0U3VnZ2VzdGVkVmFs
dWUobV9uYW1lc1tsaXN0SW5kZXhdKTsKK30KKwordm9pZCBBdXRvRmlsbFBvcHVwTWVudUNsaWVu
dDo6aW5pdGlhbGl6ZSgKKyAgICBIVE1MSW5wdXRFbGVtZW50KiB0ZXh0RmllbGQsCisgICAgY29u
c3QgV2ViVmVjdG9yPFdlYlN0cmluZz4mIG5hbWVzLAorICAgIGNvbnN0IFdlYlZlY3RvcjxXZWJT
dHJpbmc+JiBsYWJlbHMsCisgICAgaW50IGRlZmF1bHRTdWdnZXN0aW9uSW5kZXgpCit7CisgICAg
QVNTRVJUKG5hbWVzLnNpemUoKSA9PSBsYWJlbHMuc2l6ZSgpKTsKKyAgICBBU1NFUlQoZGVmYXVs
dFN1Z2dlc3Rpb25JbmRleCA8IHN0YXRpY19jYXN0PGludD4obmFtZXMuc2l6ZSgpKSk7CisKKyAg
ICAvLyBUaGUgc3VnZ2VzdGlvbnMgbXVzdCBiZSBzZXQgYmVmb3JlIGluaXRpYWxpemluZyB0aGUK
KyAgICAvLyBTdWdnZXN0aW9uc1BvcHVwTWVudUNsaWVudC4KKyAgICBzZXRTdWdnZXN0aW9ucyhu
YW1lcywgbGFiZWxzKTsKKworICAgIFN1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50Ojppbml0aWFs
aXplKHRleHRGaWVsZCwgZGVmYXVsdFN1Z2dlc3Rpb25JbmRleCk7Cit9CisKK3ZvaWQgQXV0b0Zp
bGxQb3B1cE1lbnVDbGllbnQ6OnNldFN1Z2dlc3Rpb25zKGNvbnN0IFdlYlZlY3RvcjxXZWJTdHJp
bmc+JiBuYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGNvbnN0IFdlYlZlY3RvcjxXZWJTdHJpbmc+JiBsYWJlbHMpCit7CisgICAgQVNTRVJUKG5hbWVz
LnNpemUoKSA9PSBsYWJlbHMuc2l6ZSgpKTsKKworICAgIG1fbmFtZXMuY2xlYXIoKTsKKyAgICBt
X2xhYmVscy5jbGVhcigpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbmFtZXMuc2l6ZSgp
OyArK2kpIHsKKyAgICAgICAgbV9uYW1lcy5hcHBlbmQobmFtZXNbaV0pOworICAgICAgICBtX2xh
YmVscy5hcHBlbmQobGFiZWxzW2ldKTsKKyAgICB9CisKKyAgICAvLyBUcnkgdG8gcHJlc2VydmUg
c2VsZWN0aW9uIGlmIHBvc3NpYmxlLgorICAgIGlmIChnZXRTZWxlY3RlZEluZGV4KCkgPj0gc3Rh
dGljX2Nhc3Q8aW50PihuYW1lcy5zaXplKCkpKQorICAgICAgICBzZXRTZWxlY3RlZEluZGV4KC0x
KTsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViS2l0CkluZGV4OiBXZWJLaXQvY2hyb21pdW0vc3Jj
L0F1dG9GaWxsUG9wdXBNZW51Q2xpZW50LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0L2Nocm9taXVt
L3NyYy9BdXRvRmlsbFBvcHVwTWVudUNsaWVudC5oCShyZXZpc2lvbiAwKQorKysgV2ViS2l0L2No
cm9taXVtL3NyYy9BdXRvRmlsbFBvcHVwTWVudUNsaWVudC5oCShyZXZpc2lvbiAwKQpAQCAtMCww
ICsxLDcxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5k
IGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJt
aXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6
CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWlu
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBp
biBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIK
KyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQg
d2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2Yg
R29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUg
dXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlz
IHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoK
KyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFO
RCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FS
UkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBX
QVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElD
VUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJ
R0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVO
VElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVN
RU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFU
QSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBB
TkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBT
VFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09G
VFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
CisgKi8KKworI2lmbmRlZiBBdXRvRmlsbFBvcHVwTWVudUNsaWVudF9oCisjZGVmaW5lIEF1dG9G
aWxsUG9wdXBNZW51Q2xpZW50X2gKKworI2luY2x1ZGUgIlN1Z2dlc3Rpb25zUG9wdXBNZW51Q2xp
ZW50LmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKK2NsYXNzIEhUTUxJbnB1dEVsZW1lbnQ7Cit9
CisKK25hbWVzcGFjZSBXZWJLaXQgeworY2xhc3MgV2ViU3RyaW5nOwordGVtcGxhdGUgPHR5cGVu
YW1lIFQ+IGNsYXNzIFdlYlZlY3RvcjsKKworLy8gVGhlIEF1dG9GaWxsIHN1Z2dlc3Rpb25zIHBv
cHVwIG1lbnUgY2xpZW50LCB1c2VkIHRvIGRpc3BsYXkgbmFtZSBzdWdnZXN0aW9ucworLy8gd2l0
aCByaWdodC1qdXN0aWZpZWQgbGFiZWxzLgorY2xhc3MgQXV0b0ZpbGxQb3B1cE1lbnVDbGllbnQg
OiBwdWJsaWMgU3VnZ2VzdGlvbnNQb3B1cE1lbnVDbGllbnQgeworcHVibGljOgorICAgIC8vIFN1
Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50IGltcGxlbWVudGF0aW9uOgorICAgIHZpcnR1YWwgdW5z
aWduZWQgZ2V0U3VnZ2VzdGlvbnNDb3VudCgpIGNvbnN0OworICAgIHZpcnR1YWwgV2ViU3RyaW5n
IGdldFN1Z2dlc3Rpb24odW5zaWduZWQgbGlzdEluZGV4KSBjb25zdDsKKyAgICB2aXJ0dWFsIHZv
aWQgcmVtb3ZlU3VnZ2VzdGlvbkF0SW5kZXgodW5zaWduZWQgbGlzdEluZGV4KTsKKworICAgIC8v
IFdlYkNvcmU6OlBvcHVwTWVudUNsaWVudCBpbXBsZW1lbnRhdGlvbjoKKyAgICB2aXJ0dWFsIHZv
aWQgc2VsZWN0aW9uQ2hhbmdlZCh1bnNpZ25lZCBsaXN0SW5kZXgsIGJvb2wgZmlyZUV2ZW50cyk7
CisKKyAgICB2b2lkIGluaXRpYWxpemUoV2ViQ29yZTo6SFRNTElucHV0RWxlbWVudCosCisgICAg
ICAgICAgICAgICAgICAgIGNvbnN0IFdlYlZlY3RvcjxXZWJTdHJpbmc+JiBuYW1lcywKKyAgICAg
ICAgICAgICAgICAgICAgY29uc3QgV2ViVmVjdG9yPFdlYlN0cmluZz4mIGxhYmVscywKKyAgICAg
ICAgICAgICAgICAgICAgaW50IGRlZmF1bHRTdWdnZXN0aW9uSW5kZXgpOworCisgICAgdm9pZCBz
ZXRTdWdnZXN0aW9ucyhjb25zdCBXZWJWZWN0b3I8V2ViU3RyaW5nPiYgbmFtZXMsCisgICAgICAg
ICAgICAgICAgICAgICAgICBjb25zdCBXZWJWZWN0b3I8V2ViU3RyaW5nPiYgbGFiZWxzKTsKKwor
cHJpdmF0ZToKKyAgICBWZWN0b3I8V2ViQ29yZTo6U3RyaW5nPiBtX25hbWVzOworICAgIFZlY3Rv
cjxXZWJDb3JlOjpTdHJpbmc+IG1fbGFiZWxzOworfTsKKworfSAvLyBuYW1lc3BhY2UgV2ViS2l0
CisKKyNlbmRpZgoKUHJvcGVydHkgY2hhbmdlcyBvbjogV2ViS2l0L2Nocm9taXVtL3NyYy9BdXRv
RmlsbFBvcHVwTWVudUNsaWVudC5oCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KQWRkZWQ6IHN2bjplb2wtc3R5bGUKICAg
KyBMRgoKSW5kZXg6IFdlYktpdC9jaHJvbWl1bS9zcmMvQXV0b2NvbXBsZXRlUG9wdXBNZW51Q2xp
ZW50LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQvY2hyb21pdW0vc3JjL0F1dG9jb21wbGV0ZVBv
cHVwTWVudUNsaWVudC5jcHAJKHJldmlzaW9uIDU0NTAxKQorKysgV2ViS2l0L2Nocm9taXVtL3Ny
Yy9BdXRvY29tcGxldGVQb3B1cE1lbnVDbGllbnQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xLDUg
KzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBHb29nbGUgSW5jLiBBbGwgcmlnaHRz
IHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCkBAIC0zMSwyNyAr
MzEsMjkgQEAKICNpbmNsdWRlICJjb25maWcuaCIKICNpbmNsdWRlICJBdXRvY29tcGxldGVQb3B1
cE1lbnVDbGllbnQuaCIKIAotI2luY2x1ZGUgIkNTU1N0eWxlU2VsZWN0b3IuaCIKLSNpbmNsdWRl
ICJDU1NWYWx1ZUtleXdvcmRzLmgiCi0jaW5jbHVkZSAiRnJhbWVWaWV3LmgiCiAjaW5jbHVkZSAi
SFRNTElucHV0RWxlbWVudC5oIgotI2luY2x1ZGUgIlJlbmRlclRoZW1lLmgiCisjaW5jbHVkZSAi
V2ViU3RyaW5nLmgiCiAjaW5jbHVkZSAiV2ViVmVjdG9yLmgiCi0jaW5jbHVkZSAiV2ViVmlld0lt
cGwuaCIKIAogdXNpbmcgbmFtZXNwYWNlIFdlYkNvcmU7CiAKIG5hbWVzcGFjZSBXZWJLaXQgewog
Ci1BdXRvY29tcGxldGVQb3B1cE1lbnVDbGllbnQ6OkF1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVu
dChXZWJWaWV3SW1wbCogd2ViVmlldykKLSAgICA6IG1fdGV4dEZpZWxkKDApCi0gICAgLCBtX3Nl
bGVjdGVkSW5kZXgoMCkKLSAgICAsIG1fd2ViVmlldyh3ZWJWaWV3KQordW5zaWduZWQgQXV0b2Nv
bXBsZXRlUG9wdXBNZW51Q2xpZW50OjpnZXRTdWdnZXN0aW9uc0NvdW50KCkgY29uc3QKIHsKKyAg
ICByZXR1cm4gbV9zdWdnZXN0aW9ucy5zaXplKCk7CiB9CiAKLUF1dG9jb21wbGV0ZVBvcHVwTWVu
dUNsaWVudDo6fkF1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVudCgpCitXZWJTdHJpbmcgQXV0b2Nv
bXBsZXRlUG9wdXBNZW51Q2xpZW50OjpnZXRTdWdnZXN0aW9uKHVuc2lnbmVkIGxpc3RJbmRleCkg
Y29uc3QKIHsKKyAgICBBU1NFUlQobGlzdEluZGV4ID49IDAgJiYgbGlzdEluZGV4IDwgbV9zdWdn
ZXN0aW9ucy5zaXplKCkpOworICAgIHJldHVybiBtX3N1Z2dlc3Rpb25zW2xpc3RJbmRleF07Cit9
CisKK3ZvaWQgQXV0b2NvbXBsZXRlUG9wdXBNZW51Q2xpZW50OjpyZW1vdmVTdWdnZXN0aW9uQXRJ
bmRleCh1bnNpZ25lZCBsaXN0SW5kZXgpCit7CisgICAgQVNTRVJUKGxpc3RJbmRleCA+PSAwICYm
IGxpc3RJbmRleCA8IG1fc3VnZ2VzdGlvbnMuc2l6ZSgpKTsKKyAgICBtX3N1Z2dlc3Rpb25zLnJl
bW92ZShsaXN0SW5kZXgpOwogfQogCiB2b2lkIEF1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVudDo6
aW5pdGlhbGl6ZSgKQEAgLTYwLDkwICs2MiwxMiBAQCB2b2lkIEF1dG9jb21wbGV0ZVBvcHVwTWVu
dUNsaWVudDo6aW5pdGlhCiAgICAgaW50IGRlZmF1bHRTdWdnZXN0aW9uSW5kZXgpCiB7CiAgICAg
QVNTRVJUKGRlZmF1bHRTdWdnZXN0aW9uSW5kZXggPCBzdGF0aWNfY2FzdDxpbnQ+KHN1Z2dlc3Rp
b25zLnNpemUoKSkpOwotICAgIG1fdGV4dEZpZWxkID0gdGV4dEZpZWxkOwotICAgIG1fc2VsZWN0
ZWRJbmRleCA9IGRlZmF1bHRTdWdnZXN0aW9uSW5kZXg7Ci0gICAgc2V0U3VnZ2VzdGlvbnMoc3Vn
Z2VzdGlvbnMpOwotCi0gICAgRm9udERlc2NyaXB0aW9uIGZvbnREZXNjcmlwdGlvbjsKLSAgICBt
X3dlYlZpZXctPnRoZW1lKCktPnN5c3RlbUZvbnQoQ1NTVmFsdWVXZWJraXRDb250cm9sLCBmb250
RGVzY3JpcHRpb24pOwotICAgIC8vIFVzZSBhIHNtYWxsZXIgZm9udCBzaXplIHRvIG1hdGNoIElF
L0ZpcmVmb3guCi0gICAgLy8gRklYTUU6IGh0dHA6Ly9jcmJ1Zy5jb20vNzM3NiB1c2UgdGhlIHN5
c3RlbSBzaXplIGluc3RlYWQgb2YgYQotICAgIC8vICAgICAgICBmaXhlZCBmb250IHNpemUgdmFs
dWUuCi0gICAgZm9udERlc2NyaXB0aW9uLnNldENvbXB1dGVkU2l6ZSgxMi4wKTsKLSAgICBGb250
IGZvbnQoZm9udERlc2NyaXB0aW9uLCAwLCAwKTsKLSAgICBmb250LnVwZGF0ZSh0ZXh0RmllbGQt
PmRvY3VtZW50KCktPnN0eWxlU2VsZWN0b3IoKS0+Zm9udFNlbGVjdG9yKCkpOwotICAgIC8vIFRo
ZSBkaXJlY3Rpb24gb2YgdGV4dCBpbiBwb3B1cCBtZW51IGlzIHNldCB0aGUgc2FtZSBhcyB0aGUg
ZGlyZWN0aW9uIG9mCi0gICAgLy8gdGhlIGlucHV0IGVsZW1lbnQ6IHRleHRGaWVsZC4KLSAgICBt
X3N0eWxlLnNldChuZXcgUG9wdXBNZW51U3R5bGUoQ29sb3I6OmJsYWNrLCBDb2xvcjo6d2hpdGUs
IGZvbnQsIHRydWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExlbmd0aChX
ZWJDb3JlOjpGaXhlZCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRG
aWVsZC0+cmVuZGVyZXIoKS0+c3R5bGUoKS0+ZGlyZWN0aW9uKCkpKTsKLX0KLQotdm9pZCBBdXRv
Y29tcGxldGVQb3B1cE1lbnVDbGllbnQ6OnZhbHVlQ2hhbmdlZCh1bnNpZ25lZCBsaXN0SW5kZXgs
IGJvb2wgZmlyZUV2ZW50cykKLXsKLSAgICBtX3RleHRGaWVsZC0+c2V0VmFsdWUobV9zdWdnZXN0
aW9uc1tsaXN0SW5kZXhdKTsKLSAgICBFZGl0b3JDbGllbnRJbXBsKiBlZGl0b3IgPQotICAgICAg
ICBzdGF0aWNfY2FzdDxFZGl0b3JDbGllbnRJbXBsKj4obV93ZWJWaWV3LT5wYWdlKCktPmVkaXRv
ckNsaWVudCgpKTsKLSAgICBBU1NFUlQoZWRpdG9yKTsKLSAgICBlZGl0b3ItPm9uQXV0b2ZpbGxT
dWdnZXN0aW9uQWNjZXB0ZWQoCi0gICAgICAgIHN0YXRpY19jYXN0PEhUTUxJbnB1dEVsZW1lbnQq
PihtX3RleHRGaWVsZC5nZXQoKSkpOwotfQotCi1TdHJpbmcgQXV0b2NvbXBsZXRlUG9wdXBNZW51
Q2xpZW50OjppdGVtVGV4dCh1bnNpZ25lZCBsaXN0SW5kZXgpIGNvbnN0Ci17Ci0gICAgcmV0dXJu
IG1fc3VnZ2VzdGlvbnNbbGlzdEluZGV4XTsKLX0KLQotUG9wdXBNZW51U3R5bGUgQXV0b2NvbXBs
ZXRlUG9wdXBNZW51Q2xpZW50OjppdGVtU3R5bGUodW5zaWduZWQgbGlzdEluZGV4KSBjb25zdAot
ewotICAgIHJldHVybiAqbV9zdHlsZTsKLX0KLQotUG9wdXBNZW51U3R5bGUgQXV0b2NvbXBsZXRl
UG9wdXBNZW51Q2xpZW50OjptZW51U3R5bGUoKSBjb25zdAotewotICAgIHJldHVybiAqbV9zdHls
ZTsKLX0KLQotaW50IEF1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVudDo6Y2xpZW50UGFkZGluZ0xl
ZnQoKSBjb25zdAotewotICAgIC8vIEJ1ZyBodHRwOi8vY3JidWcuY29tLzc3MDggc2VlbXMgdG8g
aW5kaWNhdGUgdGhlIHN0eWxlIGNhbiBiZSAwLgotICAgIFJlbmRlclN0eWxlKiBzdHlsZSA9IHRl
eHRGaWVsZFN0eWxlKCk7Ci0gICAgcmV0dXJuIHN0eWxlID8gbV93ZWJWaWV3LT50aGVtZSgpLT5w
b3B1cEludGVybmFsUGFkZGluZ0xlZnQoc3R5bGUpIDogMDsKLX0KIAotaW50IEF1dG9jb21wbGV0
ZVBvcHVwTWVudUNsaWVudDo6Y2xpZW50UGFkZGluZ1JpZ2h0KCkgY29uc3QKLXsKLSAgICAvLyBC
dWcgaHR0cDovL2NyYnVnLmNvbS83NzA4IHNlZW1zIHRvIGluZGljYXRlIHRoZSBzdHlsZSBjYW4g
YmUgMC4KLSAgICBSZW5kZXJTdHlsZSogc3R5bGUgPSB0ZXh0RmllbGRTdHlsZSgpOwotICAgIHJl
dHVybiBzdHlsZSA/IG1fd2ViVmlldy0+dGhlbWUoKS0+cG9wdXBJbnRlcm5hbFBhZGRpbmdSaWdo
dChzdHlsZSkgOiAwOwotfQotCi12b2lkIEF1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVudDo6cG9w
dXBEaWRIaWRlKCkKLXsKLSAgICBtX3dlYlZpZXctPnN1Z2dlc3Rpb25zUG9wdXBEaWRIaWRlKCk7
Ci19Ci0KLXZvaWQgQXV0b2NvbXBsZXRlUG9wdXBNZW51Q2xpZW50OjpzZXRUZXh0RnJvbUl0ZW0o
dW5zaWduZWQgbGlzdEluZGV4KQotewotICAgIG1fdGV4dEZpZWxkLT5zZXRWYWx1ZShtX3N1Z2dl
c3Rpb25zW2xpc3RJbmRleF0pOwotfQotCi1Gb250U2VsZWN0b3IqIEF1dG9jb21wbGV0ZVBvcHVw
TWVudUNsaWVudDo6Zm9udFNlbGVjdG9yKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV90ZXh0Rmll
bGQtPmRvY3VtZW50KCktPnN0eWxlU2VsZWN0b3IoKS0+Zm9udFNlbGVjdG9yKCk7Ci19Ci0KLUhv
c3RXaW5kb3cqIEF1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVudDo6aG9zdFdpbmRvdygpIGNvbnN0
Ci17Ci0gICAgcmV0dXJuIG1fdGV4dEZpZWxkLT5kb2N1bWVudCgpLT52aWV3KCktPmhvc3RXaW5k
b3coKTsKLX0KKyAgICAvLyBUaGUgc3VnZ2VzdGlvbnMgbXVzdCBiZSBzZXQgYmVmb3JlIGluaXRp
YWxpemluZyB0aGUKKyAgICAvLyBTdWdnZXN0aW9uc1BvcHVwTWVudUNsaWVudC4KKyAgICBzZXRT
dWdnZXN0aW9ucyhzdWdnZXN0aW9ucyk7CiAKLVBhc3NSZWZQdHI8U2Nyb2xsYmFyPiBBdXRvY29t
cGxldGVQb3B1cE1lbnVDbGllbnQ6OmNyZWF0ZVNjcm9sbGJhcigKLSAgICBTY3JvbGxiYXJDbGll
bnQqIGNsaWVudCwKLSAgICBTY3JvbGxiYXJPcmllbnRhdGlvbiBvcmllbnRhdGlvbiwKLSAgICBT
Y3JvbGxiYXJDb250cm9sU2l6ZSBzaXplKQotewotICAgIHJldHVybiBTY3JvbGxiYXI6OmNyZWF0
ZU5hdGl2ZVNjcm9sbGJhcihjbGllbnQsIG9yaWVudGF0aW9uLCBzaXplKTsKKyAgICBTdWdnZXN0
aW9uc1BvcHVwTWVudUNsaWVudDo6aW5pdGlhbGl6ZSh0ZXh0RmllbGQsIGRlZmF1bHRTdWdnZXN0
aW9uSW5kZXgpOwogfQogCiB2b2lkIEF1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVudDo6c2V0U3Vn
Z2VzdGlvbnMoY29uc3QgV2ViVmVjdG9yPFdlYlN0cmluZz4mIHN1Z2dlc3Rpb25zKQpAQCAtMTUx
LDI4ICs3NSwxMCBAQCB2b2lkIEF1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVudDo6c2V0U3VnCiAg
ICAgbV9zdWdnZXN0aW9ucy5jbGVhcigpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc3Vn
Z2VzdGlvbnMuc2l6ZSgpOyArK2kpCiAgICAgICAgIG1fc3VnZ2VzdGlvbnMuYXBwZW5kKHN1Z2dl
c3Rpb25zW2ldKTsKLSAgICAvLyBUcnkgdG8gcHJlc2VydmUgc2VsZWN0aW9uIGlmIHBvc3NpYmxl
LgotICAgIGlmIChtX3NlbGVjdGVkSW5kZXggPj0gc3RhdGljX2Nhc3Q8aW50PihzdWdnZXN0aW9u
cy5zaXplKCkpKQotICAgICAgICBtX3NlbGVjdGVkSW5kZXggPSAtMTsKLX0KIAotdm9pZCBBdXRv
Y29tcGxldGVQb3B1cE1lbnVDbGllbnQ6OnJlbW92ZUl0ZW1BdEluZGV4KGludCBpbmRleCkKLXsK
LSAgICBBU1NFUlQoaW5kZXggPj0gMCAmJiBpbmRleCA8IHN0YXRpY19jYXN0PGludD4obV9zdWdn
ZXN0aW9ucy5zaXplKCkpKTsKLSAgICBtX3N1Z2dlc3Rpb25zLnJlbW92ZShpbmRleCk7Ci19Ci0K
LVJlbmRlclN0eWxlKiBBdXRvY29tcGxldGVQb3B1cE1lbnVDbGllbnQ6OnRleHRGaWVsZFN0eWxl
KCkgY29uc3QKLXsKLSAgICBSZW5kZXJTdHlsZSogc3R5bGUgPSBtX3RleHRGaWVsZC0+Y29tcHV0
ZWRTdHlsZSgpOwotICAgIGlmICghc3R5bGUpIHsKLSAgICAgICAgLy8gSXQgc2VlbXMgd2UgY2Fu
IG9ubHkgaGF2ZSBhIDAgc3R5bGUgaW4gYSBUZXh0RmllbGQgaWYgdGhlCi0gICAgICAgIC8vIG5v
ZGUgaXMgZGV0YWNoZWQsIGluIHdoaWNoIGNhc2Ugd2UgdGhlIHBvcHVwIHNob3VkIG5vdCBiZQot
ICAgICAgICAvLyBzaG93aW5nLiAgUGxlYXNlIHJlcG9ydCB0aGlzIGluIGh0dHA6Ly9jcmJ1Zy5j
b20vNzcwOCBhbmQKLSAgICAgICAgLy8gaW5jbHVkZSB0aGUgcGFnZSB5b3Ugd2VyZSB2aXNpdGlu
Zy4KLSAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Ci0gICAgfQotICAgIHJldHVybiBzdHls
ZTsKKyAgICAvLyBUcnkgdG8gcHJlc2VydmUgc2VsZWN0aW9uIGlmIHBvc3NpYmxlLgorICAgIGlm
IChnZXRTZWxlY3RlZEluZGV4KCkgPj0gc3RhdGljX2Nhc3Q8aW50PihzdWdnZXN0aW9ucy5zaXpl
KCkpKQorICAgICAgICBzZXRTZWxlY3RlZEluZGV4KC0xKTsKIH0KIAogfSAvLyBuYW1lc3BhY2Ug
V2ViS2l0CkluZGV4OiBXZWJLaXQvY2hyb21pdW0vc3JjL0F1dG9jb21wbGV0ZVBvcHVwTWVudUNs
aWVudC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdC9jaHJvbWl1bS9zcmMvQXV0b2NvbXBsZXRlUG9w
dXBNZW51Q2xpZW50LmgJKHJldmlzaW9uIDU0NTAxKQorKysgV2ViS2l0L2Nocm9taXVtL3NyYy9B
dXRvY29tcGxldGVQb3B1cE1lbnVDbGllbnQuaAkod29ya2luZyBjb3B5KQpAQCAtMSw1ICsxLDUg
QEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2Vy
dmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkg
Zm9ybXMsIHdpdGggb3Igd2l0aG91dAogICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHBy
b3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQpAQCAtMjgsNjkgKzI4LDM4
IEBACiAgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLgogICovCiAKLSNpbmNsdWRlICJQb3B1cE1lbnVDbGllbnQuaCIK
KyNpZm5kZWYgQXV0b2NvbXBsZXRlUG9wdXBNZW51Q2xpZW50X2gKKyNkZWZpbmUgQXV0b2NvbXBs
ZXRlUG9wdXBNZW51Q2xpZW50X2gKKyAKKyNpbmNsdWRlICJTdWdnZXN0aW9uc1BvcHVwTWVudUNs
aWVudC5oIgogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiBjbGFzcyBIVE1MSW5wdXRFbGVtZW50Owot
Y2xhc3MgUG9wdXBNZW51U3R5bGU7Ci1jbGFzcyBSZW5kZXJTdHlsZTsKIH0KIAogbmFtZXNwYWNl
IFdlYktpdCB7CiBjbGFzcyBXZWJTdHJpbmc7Ci1jbGFzcyBXZWJWaWV3SW1wbDsKIHRlbXBsYXRl
IDx0eXBlbmFtZSBUPiBjbGFzcyBXZWJWZWN0b3I7CiAKLS8vIEF1dG9jb21wbGV0ZVBvcHVwTWVu
dUNsaWVudAotY2xhc3MgQXV0b2NvbXBsZXRlUG9wdXBNZW51Q2xpZW50IDogcHVibGljIFdlYkNv
cmU6OlBvcHVwTWVudUNsaWVudCB7CisvLyBUaGUgQXV0b2NvbXBsZXRlIHN1Z2dlc3Rpb25zIHBv
cHVwIG1lbnUgY2xpZW50LCB1c2VkIHRvIGRpc3BsYXkgYSBsaXN0IG9mCisvLyBhdXRvY29tcGxl
dGUgc3VnZ2VzdGlvbnMuCitjbGFzcyBBdXRvY29tcGxldGVQb3B1cE1lbnVDbGllbnQgOiBwdWJs
aWMgU3VnZ2VzdGlvbnNQb3B1cE1lbnVDbGllbnQgewogcHVibGljOgotICAgIEF1dG9jb21wbGV0
ZVBvcHVwTWVudUNsaWVudChXZWJWaWV3SW1wbCogd2Vidmlldyk7Ci0gICAgfkF1dG9jb21wbGV0
ZVBvcHVwTWVudUNsaWVudCgpOworICAgIC8vIFN1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50IGlt
cGxlbWVudGF0aW9uOgorICAgIHZpcnR1YWwgdW5zaWduZWQgZ2V0U3VnZ2VzdGlvbnNDb3VudCgp
IGNvbnN0OworICAgIHZpcnR1YWwgV2ViU3RyaW5nIGdldFN1Z2dlc3Rpb24odW5zaWduZWQgbGlz
dEluZGV4KSBjb25zdDsKKyAgICB2aXJ0dWFsIHZvaWQgcmVtb3ZlU3VnZ2VzdGlvbkF0SW5kZXgo
dW5zaWduZWQgbGlzdEluZGV4KTsKIAogICAgIHZvaWQgaW5pdGlhbGl6ZShXZWJDb3JlOjpIVE1M
SW5wdXRFbGVtZW50KiwKICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2ViVmVjdG9yPFdlYlN0
cmluZz4mIHN1Z2dlc3Rpb25zLAogICAgICAgICAgICAgICAgICAgICBpbnQgZGVmYXVsdFN1Z2dl
c3Rpb25JbmRleCk7CiAKLSAgICBXZWJDb3JlOjpIVE1MSW5wdXRFbGVtZW50KiB0ZXh0RmllbGQo
KSBjb25zdCB7IHJldHVybiBtX3RleHRGaWVsZC5nZXQoKTsgfQotCiAgICAgdm9pZCBzZXRTdWdn
ZXN0aW9ucyhjb25zdCBXZWJWZWN0b3I8V2ViU3RyaW5nPiYpOwotICAgIHZvaWQgcmVtb3ZlSXRl
bUF0SW5kZXgoaW50IGluZGV4KTsKLQotICAgIC8vIFdlYkNvcmU6OlBvcHVwTWVudUNsaWVudCBt
ZXRob2RzOgotICAgIHZpcnR1YWwgdm9pZCB2YWx1ZUNoYW5nZWQodW5zaWduZWQgbGlzdEluZGV4
LCBib29sIGZpcmVFdmVudHMgPSB0cnVlKTsKLSAgICB2aXJ0dWFsIFdlYkNvcmU6OlN0cmluZyBp
dGVtVGV4dCh1bnNpZ25lZCBsaXN0SW5kZXgpIGNvbnN0OwotICAgIHZpcnR1YWwgV2ViQ29yZTo6
U3RyaW5nIGl0ZW1Ub29sVGlwKHVuc2lnbmVkIGxhc3RJbmRleCkgY29uc3QgeyByZXR1cm4gV2Vi
Q29yZTo6U3RyaW5nKCk7IH0KLSAgICB2aXJ0dWFsIGJvb2wgaXRlbUlzRW5hYmxlZCh1bnNpZ25l
ZCBsaXN0SW5kZXgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KLSAgICB2aXJ0dWFsIFdlYkNvcmU6
OlBvcHVwTWVudVN0eWxlIGl0ZW1TdHlsZSh1bnNpZ25lZCBsaXN0SW5kZXgpIGNvbnN0OwotICAg
IHZpcnR1YWwgV2ViQ29yZTo6UG9wdXBNZW51U3R5bGUgbWVudVN0eWxlKCkgY29uc3Q7Ci0gICAg
dmlydHVhbCBpbnQgY2xpZW50SW5zZXRMZWZ0KCkgY29uc3QgeyByZXR1cm4gMDsgfQotICAgIHZp
cnR1YWwgaW50IGNsaWVudEluc2V0UmlnaHQoKSBjb25zdCB7IHJldHVybiAwOyB9Ci0gICAgdmly
dHVhbCBpbnQgY2xpZW50UGFkZGluZ0xlZnQoKSBjb25zdDsKLSAgICB2aXJ0dWFsIGludCBjbGll
bnRQYWRkaW5nUmlnaHQoKSBjb25zdDsKLSAgICB2aXJ0dWFsIGludCBsaXN0U2l6ZSgpIGNvbnN0
IHsgcmV0dXJuIG1fc3VnZ2VzdGlvbnMuc2l6ZSgpOyB9Ci0gICAgdmlydHVhbCBpbnQgc2VsZWN0
ZWRJbmRleCgpIGNvbnN0IHsgcmV0dXJuIG1fc2VsZWN0ZWRJbmRleDsgfQotICAgIHZpcnR1YWwg
dm9pZCBwb3B1cERpZEhpZGUoKTsKLSAgICB2aXJ0dWFsIGJvb2wgaXRlbUlzU2VwYXJhdG9yKHVu
c2lnbmVkIGxpc3RJbmRleCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLSAgICB2aXJ0dWFsIGJv
b2wgaXRlbUlzTGFiZWwodW5zaWduZWQgbGlzdEluZGV4KSBjb25zdCB7IHJldHVybiBmYWxzZTsg
fQotICAgIHZpcnR1YWwgYm9vbCBpdGVtSXNTZWxlY3RlZCh1bnNpZ25lZCBsaXN0SW5kZXgpIGNv
bnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0gICAgdmlydHVhbCBib29sIHNob3VsZFBvcE92ZXIoKSBj
b25zdCB7IHJldHVybiBmYWxzZTsgfQotICAgIHZpcnR1YWwgYm9vbCB2YWx1ZVNob3VsZENoYW5n
ZU9uSG90VHJhY2soKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotICAgIHZpcnR1YWwgdm9pZCBz
ZXRUZXh0RnJvbUl0ZW0odW5zaWduZWQgbGlzdEluZGV4KTsKLSAgICB2aXJ0dWFsIFdlYkNvcmU6
OkZvbnRTZWxlY3RvciogZm9udFNlbGVjdG9yKCkgY29uc3Q7Ci0gICAgdmlydHVhbCBXZWJDb3Jl
OjpIb3N0V2luZG93KiBob3N0V2luZG93KCkgY29uc3Q7Ci0gICAgdmlydHVhbCBQYXNzUmVmUHRy
PFdlYkNvcmU6OlNjcm9sbGJhcj4gY3JlYXRlU2Nyb2xsYmFyKAotICAgICAgICBXZWJDb3JlOjpT
Y3JvbGxiYXJDbGllbnQqIGNsaWVudCwKLSAgICAgICAgV2ViQ29yZTo6U2Nyb2xsYmFyT3JpZW50
YXRpb24gb3JpZW50YXRpb24sCi0gICAgICAgIFdlYkNvcmU6OlNjcm9sbGJhckNvbnRyb2xTaXpl
IHNpemUpOwogCiBwcml2YXRlOgotICAgIFdlYkNvcmU6OlJlbmRlclN0eWxlKiB0ZXh0RmllbGRT
dHlsZSgpIGNvbnN0OwotCi0gICAgUmVmUHRyPFdlYkNvcmU6OkhUTUxJbnB1dEVsZW1lbnQ+IG1f
dGV4dEZpZWxkOwogICAgIFZlY3RvcjxXZWJDb3JlOjpTdHJpbmc+IG1fc3VnZ2VzdGlvbnM7Ci0g
ICAgaW50IG1fc2VsZWN0ZWRJbmRleDsKLSAgICBXZWJWaWV3SW1wbCogbV93ZWJWaWV3OwotICAg
IE93blB0cjxXZWJDb3JlOjpQb3B1cE1lbnVTdHlsZT4gbV9zdHlsZTsKIH07CiAKIH0gLy8gbmFt
ZXNwYWNlIFdlYktpdAorCisjZW5kaWYKSW5kZXg6IFdlYktpdC9jaHJvbWl1bS9zcmMvU3VnZ2Vz
dGlvbnNQb3B1cE1lbnVDbGllbnQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdC9jaHJvbWl1bS9z
cmMvU3VnZ2VzdGlvbnNQb3B1cE1lbnVDbGllbnQuY3BwCShyZXZpc2lvbiAwKQorKysgV2ViS2l0
L2Nocm9taXVtL3NyYy9TdWdnZXN0aW9uc1BvcHVwTWVudUNsaWVudC5jcHAJKHJldmlzaW9uIDAp
CkBAIC0wLDAgKzEsMjYyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMu
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJl
CisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11
c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJp
YnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHly
aWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMg
cHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhl
IG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9y
cyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9t
CisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNz
aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBI
T0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElN
UExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUg
SU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAq
IEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBU
SEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkg
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1Ig
Q09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8s
IFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNF
LAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9G
IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIlN1Z2dlc3Rp
b25zUG9wdXBNZW51Q2xpZW50LmgiCisKKyNpbmNsdWRlICJDU1NTdHlsZVNlbGVjdG9yLmgiCisj
aW5jbHVkZSAiQ1NTVmFsdWVLZXl3b3Jkcy5oIgorI2luY2x1ZGUgIkNocm9tZS5oIgorI2luY2x1
ZGUgIkZyYW1lVmlldy5oIgorI2luY2x1ZGUgIkhUTUxJbnB1dEVsZW1lbnQuaCIKKyNpbmNsdWRl
ICJSZW5kZXJUaGVtZS5oIgorI2luY2x1ZGUgIldlYlZpZXdJbXBsLmgiCisKK3VzaW5nIG5hbWVz
cGFjZSBXZWJDb3JlOworCituYW1lc3BhY2UgV2ViS2l0IHsKKworU3VnZ2VzdGlvbnNQb3B1cE1l
bnVDbGllbnQ6OlN1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50KCkKKyAgICA6IG1fdGV4dEZpZWxk
KDApCisgICAgLCBtX3NlbGVjdGVkSW5kZXgoMCkKK3sKK30KKworU3VnZ2VzdGlvbnNQb3B1cE1l
bnVDbGllbnQ6On5TdWdnZXN0aW9uc1BvcHVwTWVudUNsaWVudCgpCit7Cit9CisKKy8vIEZJWE1F
OiBJbXBsZW1lbnQgdGhpcyBwZXItZGVyaXZlZCBjbGFzcz8KK3ZvaWQgU3VnZ2VzdGlvbnNQb3B1
cE1lbnVDbGllbnQ6OnZhbHVlQ2hhbmdlZCh1bnNpZ25lZCBsaXN0SW5kZXgsIGJvb2wgZmlyZUV2
ZW50cykKK3sKKyAgICBtX3RleHRGaWVsZC0+c2V0VmFsdWUoZ2V0U3VnZ2VzdGlvbihsaXN0SW5k
ZXgpKTsKKworICAgIFdlYlZpZXdJbXBsKiB3ZWJWaWV3ID0gZ2V0V2ViVmlldygpOworICAgIGlm
ICghd2ViVmlldykKKyAgICAgIHJldHVybjsKKworICAgIEVkaXRvckNsaWVudEltcGwqIGVkaXRv
ciA9CisgICAgICAgIHN0YXRpY19jYXN0PEVkaXRvckNsaWVudEltcGwqPih3ZWJWaWV3LT5wYWdl
KCktPmVkaXRvckNsaWVudCgpKTsKKyAgICBBU1NFUlQoZWRpdG9yKTsKKyAgICBlZGl0b3ItPm9u
QXV0b2ZpbGxTdWdnZXN0aW9uQWNjZXB0ZWQoCisgICAgICAgIHN0YXRpY19jYXN0PEhUTUxJbnB1
dEVsZW1lbnQqPihtX3RleHRGaWVsZC5nZXQoKSkpOworfQorCit2b2lkIFN1Z2dlc3Rpb25zUG9w
dXBNZW51Q2xpZW50OjpzZWxlY3Rpb25DaGFuZ2VkKHVuc2lnbmVkIGxpc3RJbmRleCwgYm9vbCBm
aXJlRXZlbnRzKQoreworICAgIGlmIChsaXN0SW5kZXggIT0gc3RhdGljX2Nhc3Q8dW5zaWduZWQ+
KC0xKSkgeworICAgICAgICBjb25zdCBXZWJTdHJpbmcmIHN1Z2dlc3Rpb24gPSBnZXRTdWdnZXN0
aW9uKGxpc3RJbmRleCk7CisgICAgICAgIHNldFN1Z2dlc3RlZFZhbHVlKHN1Z2dlc3Rpb24pOwor
ICAgIH0gZWxzZSB7CisgICAgICAgIG1fdGV4dEZpZWxkLT5zZXRWYWx1ZShtX3R5cGVkRmllbGRW
YWx1ZSk7CisgICAgICAgIGlmIChtX2xhc3RGaWVsZFZhbHVlcy0+Y29udGFpbnMobV90ZXh0Rmll
bGQtPm5hbWUoKSkpCisgICAgICAgICAgICBtX2xhc3RGaWVsZFZhbHVlcy0+c2V0KG1fdGV4dEZp
ZWxkLT5uYW1lKCksIG1fdHlwZWRGaWVsZFZhbHVlKTsKKyAgICAgICAgZWxzZQorICAgICAgICAg
ICAgbV9sYXN0RmllbGRWYWx1ZXMtPmFkZChtX3RleHRGaWVsZC0+bmFtZSgpLCBtX3R5cGVkRmll
bGRWYWx1ZSk7CisgICAgfQorfQorCitTdHJpbmcgU3VnZ2VzdGlvbnNQb3B1cE1lbnVDbGllbnQ6
Oml0ZW1UZXh0KHVuc2lnbmVkIGxpc3RJbmRleCkgY29uc3QKK3sKKyAgICByZXR1cm4gZ2V0U3Vn
Z2VzdGlvbihsaXN0SW5kZXgpOworfQorCitQb3B1cE1lbnVTdHlsZSBTdWdnZXN0aW9uc1BvcHVw
TWVudUNsaWVudDo6aXRlbVN0eWxlKHVuc2lnbmVkIGxpc3RJbmRleCkgY29uc3QKK3sKKyAgICBy
ZXR1cm4gKm1fc3R5bGU7Cit9CisKK1BvcHVwTWVudVN0eWxlIFN1Z2dlc3Rpb25zUG9wdXBNZW51
Q2xpZW50OjptZW51U3R5bGUoKSBjb25zdAoreworICAgIHJldHVybiAqbV9zdHlsZTsKK30KKwor
aW50IFN1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50OjpjbGllbnRQYWRkaW5nTGVmdCgpIGNvbnN0
Cit7CisgICAgLy8gQnVnIGh0dHA6Ly9jcmJ1Zy5jb20vNzcwOCBzZWVtcyB0byBpbmRpY2F0ZSB0
aGUgc3R5bGUgY2FuIGJlIDAuCisgICAgUmVuZGVyU3R5bGUqIHN0eWxlID0gdGV4dEZpZWxkU3R5
bGUoKTsKKyAgICBpZiAoIXN0eWxlKQorICAgICAgIHJldHVybiAwOworCisgICAgcmV0dXJuIFJl
bmRlclRoZW1lOjpkZWZhdWx0VGhlbWUoKS0+cG9wdXBJbnRlcm5hbFBhZGRpbmdMZWZ0KHN0eWxl
KTsKK30KKworaW50IFN1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50OjpjbGllbnRQYWRkaW5nUmln
aHQoKSBjb25zdAoreworICAgIC8vIEJ1ZyBodHRwOi8vY3JidWcuY29tLzc3MDggc2VlbXMgdG8g
aW5kaWNhdGUgdGhlIHN0eWxlIGNhbiBiZSAwLgorICAgIFJlbmRlclN0eWxlKiBzdHlsZSA9IHRl
eHRGaWVsZFN0eWxlKCk7CisgICAgaWYgKCFzdHlsZSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAg
ICByZXR1cm4gUmVuZGVyVGhlbWU6OmRlZmF1bHRUaGVtZSgpLT5wb3B1cEludGVybmFsUGFkZGlu
Z1JpZ2h0KHN0eWxlKTsKK30KKwordm9pZCBTdWdnZXN0aW9uc1BvcHVwTWVudUNsaWVudDo6cG9w
dXBEaWRIaWRlKCkKK3sKKyAgICBtX3RleHRGaWVsZC0+c2V0VmFsdWUobV90eXBlZEZpZWxkVmFs
dWUpOworICAgIHJlc2V0TGFzdFN1Z2dlc3Rpb24oKTsKKyAgICBXZWJWaWV3SW1wbCogd2ViVmll
dyA9IGdldFdlYlZpZXcoKTsKKyAgICBpZiAod2ViVmlldykKKyAgICAgICAgd2ViVmlldy0+c3Vn
Z2VzdGlvbnNQb3B1cERpZEhpZGUoKTsKK30KKwordm9pZCBTdWdnZXN0aW9uc1BvcHVwTWVudUNs
aWVudDo6c2V0VGV4dEZyb21JdGVtKHVuc2lnbmVkIGxpc3RJbmRleCkKK3sKKyAgICBtX3RleHRG
aWVsZC0+c2V0VmFsdWUoZ2V0U3VnZ2VzdGlvbihsaXN0SW5kZXgpKTsKKyAgICByZXNldExhc3RT
dWdnZXN0aW9uKCk7Cit9CisKK3ZvaWQgU3VnZ2VzdGlvbnNQb3B1cE1lbnVDbGllbnQ6OnJlc2V0
TGFzdFN1Z2dlc3Rpb24oKQoreworICAgIGlmIChtX2xhc3RGaWVsZFZhbHVlcy0+Y29udGFpbnMo
bV90ZXh0RmllbGQtPm5hbWUoKSkpCisgICAgICAgIG1fbGFzdEZpZWxkVmFsdWVzLT5zZXQobV90
ZXh0RmllbGQtPm5hbWUoKSwgbV90ZXh0RmllbGQtPnZhbHVlKCkpOworICAgIGVsc2UKKyAgICAg
ICAgbV9sYXN0RmllbGRWYWx1ZXMtPmFkZChtX3RleHRGaWVsZC0+bmFtZSgpLCBtX3RleHRGaWVs
ZC0+dmFsdWUoKSk7Cit9CisKK0ZvbnRTZWxlY3RvciogU3VnZ2VzdGlvbnNQb3B1cE1lbnVDbGll
bnQ6OmZvbnRTZWxlY3RvcigpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fdGV4dEZpZWxkLT5kb2N1
bWVudCgpLT5zdHlsZVNlbGVjdG9yKCktPmZvbnRTZWxlY3RvcigpOworfQorCitIb3N0V2luZG93
KiBTdWdnZXN0aW9uc1BvcHVwTWVudUNsaWVudDo6aG9zdFdpbmRvdygpIGNvbnN0Cit7CisgICAg
cmV0dXJuIG1fdGV4dEZpZWxkLT5kb2N1bWVudCgpLT52aWV3KCktPmhvc3RXaW5kb3coKTsKK30K
KworUGFzc1JlZlB0cjxTY3JvbGxiYXI+IFN1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50OjpjcmVh
dGVTY3JvbGxiYXIoCisgICAgU2Nyb2xsYmFyQ2xpZW50KiBjbGllbnQsCisgICAgU2Nyb2xsYmFy
T3JpZW50YXRpb24gb3JpZW50YXRpb24sCisgICAgU2Nyb2xsYmFyQ29udHJvbFNpemUgc2l6ZSkK
K3sKKyAgICByZXR1cm4gU2Nyb2xsYmFyOjpjcmVhdGVOYXRpdmVTY3JvbGxiYXIoY2xpZW50LCBv
cmllbnRhdGlvbiwgc2l6ZSk7Cit9CisKK1JlbmRlclN0eWxlKiBTdWdnZXN0aW9uc1BvcHVwTWVu
dUNsaWVudDo6dGV4dEZpZWxkU3R5bGUoKSBjb25zdAoreworICAgIFJlbmRlclN0eWxlKiBzdHls
ZSA9IG1fdGV4dEZpZWxkLT5jb21wdXRlZFN0eWxlKCk7CisgICAgaWYgKCFzdHlsZSkgeworICAg
ICAgICAvLyBJdCBzZWVtcyB3ZSBjYW4gb25seSBoYXZlIGEgMCBzdHlsZSBpbiBhIFRleHRGaWVs
ZCBpZiB0aGUKKyAgICAgICAgLy8gbm9kZSBpcyBkZXRhY2hlZCwgaW4gd2hpY2ggY2FzZSB3ZSB0
aGUgcG9wdXAgc2hvdWQgbm90IGJlCisgICAgICAgIC8vIHNob3dpbmcuICBQbGVhc2UgcmVwb3J0
IHRoaXMgaW4gaHR0cDovL2NyYnVnLmNvbS83NzA4IGFuZAorICAgICAgICAvLyBpbmNsdWRlIHRo
ZSBwYWdlIHlvdSB3ZXJlIHZpc2l0aW5nLgorICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsK
KyAgICB9CisgICAgcmV0dXJuIHN0eWxlOworfQorCit2b2lkIFN1Z2dlc3Rpb25zUG9wdXBNZW51
Q2xpZW50Ojppbml0aWFsaXplKEhUTUxJbnB1dEVsZW1lbnQqIHRleHRGaWVsZCwKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlZmF1bHRTdWdnZXN0aW9u
SW5kZXgpCit7CisgICAgaWYgKCFtX2xhc3RGaWVsZFZhbHVlcykKKyAgICAgICAgbV9sYXN0Rmll
bGRWYWx1ZXMuc2V0KG5ldyBGaWVsZFZhbHVlc01hcCk7CisKKyAgICBtX3RleHRGaWVsZCA9IHRl
eHRGaWVsZDsKKyAgICBtX3R5cGVkRmllbGRWYWx1ZSA9IHRleHRGaWVsZC0+dmFsdWUoKTsKKyAg
ICBtX3NlbGVjdGVkSW5kZXggPSBkZWZhdWx0U3VnZ2VzdGlvbkluZGV4OworCisgICAgc2V0SW5p
dGlhbFN1Z2dlc3Rpb24oKTsKKworICAgIEZvbnREZXNjcmlwdGlvbiBmb250RGVzY3JpcHRpb247
CisgICAgUmVuZGVyVGhlbWU6OmRlZmF1bHRUaGVtZSgpLT5zeXN0ZW1Gb250KENTU1ZhbHVlV2Vi
a2l0Q29udHJvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
Zm9udERlc2NyaXB0aW9uKTsKKworICAgIC8vIFVzZSBhIHNtYWxsZXIgZm9udCBzaXplIHRvIG1h
dGNoIElFL0ZpcmVmb3guCisgICAgLy8gRklYTUU6IGh0dHA6Ly9jcmJ1Zy5jb20vNzM3NiB1c2Ug
dGhlIHN5c3RlbSBzaXplIGluc3RlYWQgb2YgYQorICAgIC8vICAgICAgICBmaXhlZCBmb250IHNp
emUgdmFsdWUuCisgICAgZm9udERlc2NyaXB0aW9uLnNldENvbXB1dGVkU2l6ZSgxMi4wKTsKKyAg
ICBGb250IGZvbnQoZm9udERlc2NyaXB0aW9uLCAwLCAwKTsKKyAgICBmb250LnVwZGF0ZSh0ZXh0
RmllbGQtPmRvY3VtZW50KCktPnN0eWxlU2VsZWN0b3IoKS0+Zm9udFNlbGVjdG9yKCkpOworICAg
IC8vIFRoZSBkaXJlY3Rpb24gb2YgdGV4dCBpbiBwb3B1cCBtZW51IGlzIHNldCB0aGUgc2FtZSBh
cyB0aGUgZGlyZWN0aW9uIG9mCisgICAgLy8gdGhlIGlucHV0IGVsZW1lbnQ6IHRleHRGaWVsZC4K
KyAgICBtX3N0eWxlLnNldChuZXcgUG9wdXBNZW51U3R5bGUoQ29sb3I6OmJsYWNrLCBDb2xvcjo6
d2hpdGUsIGZvbnQsIHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExl
bmd0aChXZWJDb3JlOjpGaXhlZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IHRleHRGaWVsZC0+cmVuZGVyZXIoKS0+c3R5bGUoKS0+ZGlyZWN0aW9uKCkpKTsKK30KKwordm9p
ZCBTdWdnZXN0aW9uc1BvcHVwTWVudUNsaWVudDo6c2V0SW5pdGlhbFN1Z2dlc3Rpb24oKQorewor
ICAgIGlmICghZ2V0U3VnZ2VzdGlvbnNDb3VudCgpIHx8ICFtX3RleHRGaWVsZC0+bmFtZSgpLmxl
bmd0aCgpIHx8ICFtX3R5cGVkRmllbGRWYWx1ZS5sZW5ndGgoKSkKKyAgICAgICAgcmV0dXJuOwor
CisgICAgaW50IG5ld0luZGV4ID0gbV9zZWxlY3RlZEluZGV4ID49IDAgPyBtX3NlbGVjdGVkSW5k
ZXggOiAwOworICAgIGNvbnN0IFN0cmluZyYgc3VnZ2VzdGlvbiA9IGdldFN1Z2dlc3Rpb24obmV3
SW5kZXgpOworICAgIGJvb2wgaGFzUHJldmlvdXNWYWx1ZSA9IG1fbGFzdEZpZWxkVmFsdWVzLT5j
b250YWlucyhtX3RleHRGaWVsZC0+bmFtZSgpKTsKKworICAgIFN0cmluZyBwcmV2VmFsdWU7Cisg
ICAgaWYgKGhhc1ByZXZpb3VzVmFsdWUpCisgICAgICAgIHByZXZWYWx1ZSA9IG1fbGFzdEZpZWxk
VmFsdWVzLT5nZXQobV90ZXh0RmllbGQtPm5hbWUoKSk7CisKKyAgICBpZiAoIWhhc1ByZXZpb3Vz
VmFsdWUgfHwgbV90eXBlZEZpZWxkVmFsdWUubGVuZ3RoKCkgPiBtX2xhc3RGaWVsZFZhbHVlcy0+
Z2V0KG1fdGV4dEZpZWxkLT5uYW1lKCkpLmxlbmd0aCgpKSB7CisgICAgICAgIGlmIChzdWdnZXN0
aW9uLnN0YXJ0c1dpdGgobV90eXBlZEZpZWxkVmFsdWUpKQorICAgICAgICAgICAgbV9zZWxlY3Rl
ZEluZGV4ID0gbmV3SW5kZXg7CisKKyAgICAgICAgaW50IHN0YXJ0ID0gMDsKKyAgICAgICAgU3Ry
aW5nIG5ld1N1Z2dlc3Rpb24gPSBzdWdnZXN0aW9uOworICAgICAgICBpZiAoc3VnZ2VzdGlvbi5z
dGFydHNXaXRoKG1fdHlwZWRGaWVsZFZhbHVlLCBmYWxzZSkpIHsKKyAgICAgICAgICAgIG5ld1N1
Z2dlc3Rpb24gPSBtX3R5cGVkRmllbGRWYWx1ZTsKKyAgICAgICAgICAgIGlmIChzdWdnZXN0aW9u
Lmxlbmd0aCgpID4gbV90eXBlZEZpZWxkVmFsdWUubGVuZ3RoKCkpIHsKKyAgICAgICAgICAgICAg
ICBuZXdTdWdnZXN0aW9uLmFwcGVuZChzdWdnZXN0aW9uLnN1YnN0cmluZyhtX3R5cGVkRmllbGRW
YWx1ZS5sZW5ndGgoKSwKKyAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGlvbi5sZW5ndGgoKSAt
IG1fdHlwZWRGaWVsZFZhbHVlLmxlbmd0aCgpKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAg
ICBzdGFydCA9IG1fdHlwZWRGaWVsZFZhbHVlLmxlbmd0aCgpOworICAgICAgICB9CisKKyAgICAg
ICAgbV90ZXh0RmllbGQtPnNldFN1Z2dlc3RlZFZhbHVlKG5ld1N1Z2dlc3Rpb24pOworICAgICAg
ICBtX3RleHRGaWVsZC0+c2V0U2VsZWN0aW9uUmFuZ2Uoc3RhcnQsIG5ld1N1Z2dlc3Rpb24ubGVu
Z3RoKCkpOworICAgIH0KKworICAgIGlmIChoYXNQcmV2aW91c1ZhbHVlKQorICAgICAgICBtX2xh
c3RGaWVsZFZhbHVlcy0+c2V0KG1fdGV4dEZpZWxkLT5uYW1lKCksIG1fdHlwZWRGaWVsZFZhbHVl
KTsKKyAgICBlbHNlCisgICAgICAgIG1fbGFzdEZpZWxkVmFsdWVzLT5hZGQobV90ZXh0RmllbGQt
Pm5hbWUoKSwgbV90eXBlZEZpZWxkVmFsdWUpOworfQorCit2b2lkIFN1Z2dlc3Rpb25zUG9wdXBN
ZW51Q2xpZW50OjpzZXRTdWdnZXN0ZWRWYWx1ZShjb25zdCBXZWJTdHJpbmcmIHN1Z2dlc3Rpb24p
Cit7CisgICAgbV90ZXh0RmllbGQtPnNldFN1Z2dlc3RlZFZhbHVlKHN1Z2dlc3Rpb24pOworICAg
IG1fdGV4dEZpZWxkLT5zZXRTZWxlY3Rpb25SYW5nZShtX3R5cGVkRmllbGRWYWx1ZS5sZW5ndGgo
KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGlvbi5sZW5ndGgo
KSk7Cit9CisKK1dlYlZpZXdJbXBsKiBTdWdnZXN0aW9uc1BvcHVwTWVudUNsaWVudDo6Z2V0V2Vi
VmlldygpIGNvbnN0Cit7CisgICAgRnJhbWUqIGZyYW1lID0gbV90ZXh0RmllbGQtPmRvY3VtZW50
KCktPmZyYW1lKCk7CisgICAgaWYgKCFmcmFtZSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAg
ICBQYWdlKiBwYWdlID0gZnJhbWUtPnBhZ2UoKTsKKyAgICBpZiAoIXBhZ2UpCisgICAgICAgcmV0
dXJuIE5VTEw7CisKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Q2hyb21lQ2xpZW50SW1wbCo+KHBh
Z2UtPmNocm9tZSgpLT5jbGllbnQoKSktPndlYlZpZXcoKTsKK30KKworfSAvLyBuYW1lc3BhY2Ug
V2ViS2l0CkluZGV4OiBXZWJLaXQvY2hyb21pdW0vc3JjL1N1Z2dlc3Rpb25zUG9wdXBNZW51Q2xp
ZW50LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0L2Nocm9taXVtL3NyYy9TdWdnZXN0aW9uc1BvcHVw
TWVudUNsaWVudC5oCShyZXZpc2lvbiAwKQorKysgV2ViS2l0L2Nocm9taXVtL3NyYy9TdWdnZXN0
aW9uc1BvcHVwTWVudUNsaWVudC5oCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDExNyBAQAorLyoK
KyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVk
IHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAq
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9j
dW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBk
aXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5v
ciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3Jz
ZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRo
b3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRX
QVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JT
CisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xV
RElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBN
RVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBB
UkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIg
T1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lE
RU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAo
SU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElU
VVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7
IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICog
VEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElU
WSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lO
RyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElG
IEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNs
dWRlICJQb3B1cE1lbnVDbGllbnQuaCIKKworI2lmbmRlZiBTdWdnZXN0aW9uc1BvcHVwTWVudUNs
aWVudF9oCisjZGVmaW5lIFN1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50X2gKKworbmFtZXNwYWNl
IFdlYkNvcmUgeworY2xhc3MgSFRNTElucHV0RWxlbWVudDsKK2NsYXNzIFBvcHVwTWVudVN0eWxl
OworY2xhc3MgUmVuZGVyU3R5bGU7Cit9CisKK25hbWVzcGFjZSBXZWJLaXQgeworY2xhc3MgV2Vi
U3RyaW5nOworY2xhc3MgV2ViVmlld0ltcGw7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY2xhc3Mg
V2ViVmVjdG9yOworCisvLyBUaGUgU3VnZ2VzdGlvbnMgcG9wdXAgbWVudSBjbGllbnQsIHVzZWQg
dG8gZGlzcGxheSBhIGxpc3Qgb2Ygc3VnZ2VzdGlvbnMuCitjbGFzcyBTdWdnZXN0aW9uc1BvcHVw
TWVudUNsaWVudCA6IHB1YmxpYyBXZWJDb3JlOjpQb3B1cE1lbnVDbGllbnQgeworcHVibGljOgor
ICAgIFN1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50KCk7CisgICAgdmlydHVhbCB+U3VnZ2VzdGlv
bnNQb3B1cE1lbnVDbGllbnQoKTsKKworICAgIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiBzdWdn
ZXN0aW9ucyBhdmFpbGFibGUuCisgICAgdmlydHVhbCB1bnNpZ25lZCBnZXRTdWdnZXN0aW9uc0Nv
dW50KCkgY29uc3QgPSAwOworCisgICAgLy8gUmV0dXJucyB0aGUgc3VnZ2VzdGlvbiBhdCB8bGlz
dEluZGV4fC4KKyAgICB2aXJ0dWFsIFdlYlN0cmluZyBnZXRTdWdnZXN0aW9uKHVuc2lnbmVkIGxp
c3RJbmRleCkgY29uc3QgPSAwOworCisgICAgLy8gUmVtb3ZlcyB0aGUgc3VnZ2VzdGlvbiBhdCB8
bGlzdEluZGV4fCBmcm9tIHRoZSBsaXN0IG9mIHN1Z2dlc3Rpb25zLgorICAgIHZpcnR1YWwgdm9p
ZCByZW1vdmVTdWdnZXN0aW9uQXRJbmRleCh1bnNpZ25lZCBsaXN0SW5kZXgpID0gMDsKKworICAg
IC8vIFdlYkNvcmU6OlBvcHVwTWVudUNsaWVudCBtZXRob2RzOgorICAgIHZpcnR1YWwgdm9pZCB2
YWx1ZUNoYW5nZWQodW5zaWduZWQgbGlzdEluZGV4LCBib29sIGZpcmVFdmVudHMgPSB0cnVlKTsK
KyAgICB2aXJ0dWFsIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZCh1bnNpZ25lZCBsaXN0SW5kZXgsIGJv
b2wgZmlyZUV2ZW50cyA9IHRydWUpOworICAgIHZpcnR1YWwgV2ViQ29yZTo6U3RyaW5nIGl0ZW1U
ZXh0KHVuc2lnbmVkIGxpc3RJbmRleCkgY29uc3Q7CisgICAgdmlydHVhbCBXZWJDb3JlOjpTdHJp
bmcgaXRlbVRvb2xUaXAodW5zaWduZWQgbGFzdEluZGV4KSBjb25zdCB7IHJldHVybiBXZWJDb3Jl
OjpTdHJpbmcoKTsgfQorICAgIHZpcnR1YWwgYm9vbCBpdGVtSXNFbmFibGVkKHVuc2lnbmVkIGxp
c3RJbmRleCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQorICAgIHZpcnR1YWwgV2ViQ29yZTo6UG9w
dXBNZW51U3R5bGUgaXRlbVN0eWxlKHVuc2lnbmVkIGxpc3RJbmRleCkgY29uc3Q7CisgICAgdmly
dHVhbCBXZWJDb3JlOjpQb3B1cE1lbnVTdHlsZSBtZW51U3R5bGUoKSBjb25zdDsKKyAgICB2aXJ0
dWFsIGludCBjbGllbnRJbnNldExlZnQoKSBjb25zdCB7IHJldHVybiAwOyB9CisgICAgdmlydHVh
bCBpbnQgY2xpZW50SW5zZXRSaWdodCgpIGNvbnN0IHsgcmV0dXJuIDA7IH0KKyAgICB2aXJ0dWFs
IGludCBjbGllbnRQYWRkaW5nTGVmdCgpIGNvbnN0OworICAgIHZpcnR1YWwgaW50IGNsaWVudFBh
ZGRpbmdSaWdodCgpIGNvbnN0OworICAgIHZpcnR1YWwgaW50IGxpc3RTaXplKCkgY29uc3QgeyBy
ZXR1cm4gZ2V0U3VnZ2VzdGlvbnNDb3VudCgpOyB9CisgICAgdmlydHVhbCBpbnQgc2VsZWN0ZWRJ
bmRleCgpIGNvbnN0IHsgcmV0dXJuIG1fc2VsZWN0ZWRJbmRleDsgfQorICAgIHZpcnR1YWwgdm9p
ZCBwb3B1cERpZEhpZGUoKTsKKyAgICB2aXJ0dWFsIGJvb2wgaXRlbUlzU2VwYXJhdG9yKHVuc2ln
bmVkIGxpc3RJbmRleCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgICB2aXJ0dWFsIGJvb2wg
aXRlbUlzTGFiZWwodW5zaWduZWQgbGlzdEluZGV4KSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQor
ICAgIHZpcnR1YWwgYm9vbCBpdGVtSXNTZWxlY3RlZCh1bnNpZ25lZCBsaXN0SW5kZXgpIGNvbnN0
IHsgcmV0dXJuIGZhbHNlOyB9CisgICAgdmlydHVhbCBib29sIHNob3VsZFBvcE92ZXIoKSBjb25z
dCB7IHJldHVybiBmYWxzZTsgfQorICAgIHZpcnR1YWwgYm9vbCB2YWx1ZVNob3VsZENoYW5nZU9u
SG90VHJhY2soKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorICAgIHZpcnR1YWwgdm9pZCBzZXRU
ZXh0RnJvbUl0ZW0odW5zaWduZWQgbGlzdEluZGV4KTsKKyAgICB2aXJ0dWFsIFdlYkNvcmU6OkZv
bnRTZWxlY3RvciogZm9udFNlbGVjdG9yKCkgY29uc3Q7CisgICAgdmlydHVhbCBXZWJDb3JlOjpI
b3N0V2luZG93KiBob3N0V2luZG93KCkgY29uc3Q7CisgICAgdmlydHVhbCBQYXNzUmVmUHRyPFdl
YkNvcmU6OlNjcm9sbGJhcj4gY3JlYXRlU2Nyb2xsYmFyKAorICAgICAgICBXZWJDb3JlOjpTY3Jv
bGxiYXJDbGllbnQqIGNsaWVudCwKKyAgICAgICAgV2ViQ29yZTo6U2Nyb2xsYmFyT3JpZW50YXRp
b24gb3JpZW50YXRpb24sCisgICAgICAgIFdlYkNvcmU6OlNjcm9sbGJhckNvbnRyb2xTaXplIHNp
emUpOworCitwcm90ZWN0ZWQ6CisgICAgdm9pZCBpbml0aWFsaXplKFdlYkNvcmU6OkhUTUxJbnB1
dEVsZW1lbnQqIHRleHRGaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgaW50IGRlZmF1bHRTdWdn
ZXN0aW9uSW5kZXgpOworICAgIHZvaWQgc2V0SW5pdGlhbFN1Z2dlc3Rpb24oKTsKKworICAgIGlu
dCBnZXRTZWxlY3RlZEluZGV4KCkgY29uc3QgeyByZXR1cm4gbV9zZWxlY3RlZEluZGV4OyB9Cisg
ICAgdm9pZCBzZXRTZWxlY3RlZEluZGV4KGludCBpbmRleCkgeyBtX3NlbGVjdGVkSW5kZXggPSBp
bmRleDsgfQorCisgICAgdm9pZCBzZXRTdWdnZXN0ZWRWYWx1ZShjb25zdCBXZWJTdHJpbmcmIHN1
Z2dlc3Rpb24pOworCisgICAgV2ViVmlld0ltcGwqIGdldFdlYlZpZXcoKSBjb25zdDsKKyAgICBX
ZWJDb3JlOjpIVE1MSW5wdXRFbGVtZW50KiBnZXRUZXh0RmllbGQoKSBjb25zdCB7IHJldHVybiBt
X3RleHRGaWVsZC5nZXQoKTsgfQorCitwcml2YXRlOgorICAgIFdlYkNvcmU6OlJlbmRlclN0eWxl
KiB0ZXh0RmllbGRTdHlsZSgpIGNvbnN0OworICAgIHZvaWQgcmVzZXRMYXN0U3VnZ2VzdGlvbigp
OworCisgICAgUmVmUHRyPFdlYkNvcmU6OkhUTUxJbnB1dEVsZW1lbnQ+IG1fdGV4dEZpZWxkOwor
ICAgIGludCBtX3NlbGVjdGVkSW5kZXg7CisgICAgV2ViQ29yZTo6U3RyaW5nIG1fdHlwZWRGaWVs
ZFZhbHVlOworICAgIE93blB0cjxXZWJDb3JlOjpQb3B1cE1lbnVTdHlsZT4gbV9zdHlsZTsKKyAg
ICB0eXBlZGVmIEhhc2hNYXA8V2ViQ29yZTo6U3RyaW5nLCBXZWJDb3JlOjpTdHJpbmc+IEZpZWxk
VmFsdWVzTWFwOworICAgIE93blB0cjxGaWVsZFZhbHVlc01hcD4gbV9sYXN0RmllbGRWYWx1ZXM7
Cit9OworCit9IC8vIG5hbWVzcGFjZSBXZWJLaXQKKworI2VuZGlmCgpQcm9wZXJ0eSBjaGFuZ2Vz
IG9uOiBXZWJLaXQvY2hyb21pdW0vc3JjL1N1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50LmgKX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fXwpBZGRlZDogc3ZuOmVvbC1zdHlsZQogICArIExGCgpJbmRleDogV2ViS2l0L2Nocm9t
aXVtL3NyYy9XZWJWaWV3SW1wbC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0L2Nocm9taXVtL3Ny
Yy9XZWJWaWV3SW1wbC5jcHAJKHJldmlzaW9uIDU0NTAxKQorKysgV2ViS2l0L2Nocm9taXVtL3Ny
Yy9XZWJWaWV3SW1wbC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTMxLDYgKzMxLDcgQEAKICNpbmNs
dWRlICJjb25maWcuaCIKICNpbmNsdWRlICJXZWJWaWV3SW1wbC5oIgogCisjaW5jbHVkZSAiQXV0
b0ZpbGxQb3B1cE1lbnVDbGllbnQuaCIKICNpbmNsdWRlICJBdXRvY29tcGxldGVQb3B1cE1lbnVD
bGllbnQuaCIKICNpbmNsdWRlICJBWE9iamVjdENhY2hlLmgiCiAjaW5jbHVkZSAiQ2hyb21lLmgi
CkBAIC0yNDAsNiArMjQxLDggQEAgV2ViVmlld0ltcGw6OldlYlZpZXdJbXBsKFdlYlZpZXdDbGll
bnQqIAogICAgICwgbV9vcGVyYXRpb25zQWxsb3dlZChXZWJEcmFnT3BlcmF0aW9uTm9uZSkKICAg
ICAsIG1fZHJhZ09wZXJhdGlvbihXZWJEcmFnT3BlcmF0aW9uTm9uZSkKICAgICAsIG1fc3VnZ2Vz
dGlvbnNQb3B1cFNob3dpbmcoZmFsc2UpCisgICAgLCBtX3N1Z2dlc3Rpb25zUG9wdXBDbGllbnQo
MCkKKyAgICAsIG1fc3VnZ2VzdGlvbnNQb3B1cCgwKQogICAgICwgbV9pc1RyYW5zcGFyZW50KGZh
bHNlKQogICAgICwgbV90YWJzVG9MaW5rcyhmYWxzZSkKIHsKQEAgLTQ2OCw3ICs0NzEsNyBAQCBi
b29sIFdlYlZpZXdJbXBsOjprZXlFdmVudChjb25zdCBXZWJLZXliCiAgICAgLy8gZXZlbnQuCiAg
ICAgbV9zdXBwcmVzc05leHRLZXlwcmVzc0V2ZW50ID0gZmFsc2U7CiAKLSAgICAvLyBHaXZlIGF1
dG9jb21wbGV0ZSBhIGNoYW5jZSB0byBjb25zdW1lIHRoZSBrZXkgZXZlbnRzIGl0IGlzIGludGVy
ZXN0ZWQgaW4uCisgICAgLy8gR2l2ZSBBdXRvY29tcGxldGUgYSBjaGFuY2UgdG8gY29uc3VtZSB0
aGUga2V5IGV2ZW50cyBpdCBpcyBpbnRlcmVzdGVkIGluLgogICAgIGlmIChhdXRvY29tcGxldGVI
YW5kbGVLZXlFdmVudChldmVudCkpCiAgICAgICAgIHJldHVybiB0cnVlOwogCkBAIC01NDEsNyAr
NTQ0LDcgQEAgYm9vbCBXZWJWaWV3SW1wbDo6YXV0b2NvbXBsZXRlSGFuZGxlS2V5RQogICAgICAg
ICBtX2NsaWVudC0+cmVtb3ZlQXV0b2ZpbGxTdWdnZXN0aW9ucyhuYW1lLCB2YWx1ZSk7CiAgICAg
ICAgIC8vIFVwZGF0ZSB0aGUgZW50cmllcyBpbiB0aGUgY3VycmVudGx5IHNob3dpbmcgcG9wdXAg
dG8gcmVmbGVjdCB0aGUKICAgICAgICAgLy8gZGVsZXRpb24uCi0gICAgICAgIG1fYXV0b2NvbXBs
ZXRlUG9wdXBDbGllbnQtPnJlbW92ZUl0ZW1BdEluZGV4KHNlbGVjdGVkSW5kZXgpOworICAgICAg
ICBtX2F1dG9jb21wbGV0ZVBvcHVwQ2xpZW50LT5yZW1vdmVTdWdnZXN0aW9uQXRJbmRleChzZWxl
Y3RlZEluZGV4KTsKICAgICAgICAgcmVmcmVzaFN1Z2dlc3Rpb25zUG9wdXAoKTsKICAgICAgICAg
cmV0dXJuIGZhbHNlOwogICAgIH0KQEAgLTE1NTgsNTggKzE1NjEsMTE4IEBAIHZvaWQgV2ViVmll
d0ltcGw6OmFwcGx5QXV0b2ZpbGxTdWdnZXN0aW8KICAgICBjb25zdCBXZWJWZWN0b3I8V2ViU3Ry
aW5nPiYgc3VnZ2VzdGlvbnMsCiAgICAgaW50IGRlZmF1bHRTdWdnZXN0aW9uSW5kZXgpCiB7Ci0g
ICAgaWYgKCFtX3BhZ2UuZ2V0KCkgfHwgc3VnZ2VzdGlvbnMuaXNFbXB0eSgpKSB7CisgICAgYXBw
bHlBdXRvY29tcGxldGVTdWdnZXN0aW9ucyhub2RlLCBzdWdnZXN0aW9ucywgZGVmYXVsdFN1Z2dl
c3Rpb25JbmRleCk7Cit9CisKK3ZvaWQgV2ViVmlld0ltcGw6OmFwcGx5QXV0b0ZpbGxTdWdnZXN0
aW9ucygKKyAgICBjb25zdCBXZWJOb2RlJiBub2RlLAorICAgIGNvbnN0IFdlYlZlY3RvcjxXZWJT
dHJpbmc+JiBuYW1lcywKKyAgICBjb25zdCBXZWJWZWN0b3I8V2ViU3RyaW5nPiYgbGFiZWxzLAor
ICAgIGludCBkZWZhdWx0U3VnZ2VzdGlvbkluZGV4KQoreworICAgIEFTU0VSVChuYW1lcy5zaXpl
KCkgPT0gbGFiZWxzLnNpemUoKSk7CisgICAgQVNTRVJUKGRlZmF1bHRTdWdnZXN0aW9uSW5kZXgg
PCBzdGF0aWNfY2FzdDxpbnQ+KG5hbWVzLnNpemUoKSkpOworCisgICAgaWYgKG5hbWVzLmlzRW1w
dHkoKSkgewogICAgICAgICBoaWRlU3VnZ2VzdGlvbnNQb3B1cCgpOwogICAgICAgICByZXR1cm47
CiAgICAgfQogCisgICAgUmVmUHRyPE5vZGU+IGZvY3VzZWROb2RlID0gZm9jdXNlZFdlYkNvcmVO
b2RlKCk7CisgICAgLy8gSWYgdGhlIG5vZGUgZm9yIHdoaWNoIHdlIHF1ZXJpZWQgdGhlIEF1dG9G
aWxsIHN1Z2dlc3Rpb25zIGlzIG5vdCB0aGUKKyAgICAvLyBmb2N1c2VkIG5vZGUsIHRoZW4gd2Ug
aGF2ZSBub3RoaW5nIHRvIGRvLiAgRklYTUU6IGFsc28gY2hlY2sgdGhlCisgICAgLy8gY2FyZXQg
aXMgYXQgdGhlIGVuZCBhbmQgdGhhdCB0aGUgdGV4dCBoYXMgbm90IGNoYW5nZWQuCisgICAgaWYg
KCFmb2N1c2VkTm9kZSB8fCBmb2N1c2VkTm9kZSAhPSBQYXNzUmVmUHRyPE5vZGU+KG5vZGUpKSB7
CisgICAgICAgIGhpZGVTdWdnZXN0aW9uc1BvcHVwKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9
CisKKyAgICBIVE1MSW5wdXRFbGVtZW50KiBpbnB1dEVsZW0gPQorICAgICAgICBzdGF0aWNfY2Fz
dDxIVE1MSW5wdXRFbGVtZW50Kj4oZm9jdXNlZE5vZGUuZ2V0KCkpOworCisgICAgLy8gVGhlIGZp
cnN0IHRpbWUgdGhlIEF1dG9GaWxsIHBvcHVwIGlzIHNob3duIHdlJ2xsIGNyZWF0ZSB0aGUgY2xp
ZW50IGFuZAorICAgIC8vIHRoZSBwb3B1cC4KKyAgICBpZiAoIW1fYXV0b0ZpbGxQb3B1cENsaWVu
dC5nZXQoKSkKKyAgICAgICAgbV9hdXRvRmlsbFBvcHVwQ2xpZW50LnNldChuZXcgQXV0b0ZpbGxQ
b3B1cE1lbnVDbGllbnQpOworCisgICAgbV9hdXRvRmlsbFBvcHVwQ2xpZW50LT5pbml0aWFsaXpl
KGlucHV0RWxlbSwgbmFtZXMsIGxhYmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgZGVmYXVsdFN1Z2dlc3Rpb25JbmRleCk7CisKKyAgICBpZiAobV9zdWdnZXN0aW9u
c1BvcHVwQ2xpZW50ICE9IG1fYXV0b0ZpbGxQb3B1cENsaWVudC5nZXQoKSkgeworICAgICAgICBo
aWRlU3VnZ2VzdGlvbnNQb3B1cCgpOworICAgICAgICBtX3N1Z2dlc3Rpb25zUG9wdXBDbGllbnQg
PSBtX2F1dG9GaWxsUG9wdXBDbGllbnQuZ2V0KCk7CisgICAgfQorCisgICAgaWYgKCFtX2F1dG9G
aWxsUG9wdXAuZ2V0KCkpIHsKKyAgICAgICAgbV9hdXRvRmlsbFBvcHVwID0gUG9wdXBDb250YWlu
ZXI6OmNyZWF0ZShtX3N1Z2dlc3Rpb25zUG9wdXBDbGllbnQsCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGlvbnNQb3B1cFNldHRpbmdzKTsK
KyAgICB9CisKKyAgICBpZiAobV9zdWdnZXN0aW9uc1BvcHVwICE9IG1fYXV0b0ZpbGxQb3B1cC5n
ZXQoKSkKKyAgICAgICAgbV9zdWdnZXN0aW9uc1BvcHVwID0gbV9hdXRvRmlsbFBvcHVwLmdldCgp
OworCisgICAgaWYgKG1fc3VnZ2VzdGlvbnNQb3B1cFNob3dpbmcpIHsKKyAgICAgICAgbV9hdXRv
RmlsbFBvcHVwQ2xpZW50LT5zZXRTdWdnZXN0aW9ucyhuYW1lcywgbGFiZWxzKTsKKyAgICAgICAg
cmVmcmVzaFN1Z2dlc3Rpb25zUG9wdXAoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtX3N1Z2dl
c3Rpb25zUG9wdXAtPnNob3coZm9jdXNlZE5vZGUtPmdldFJlY3QoKSwKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGZvY3VzZWROb2RlLT5vd25lckRvY3VtZW50KCktPnZpZXcoKSwg
MCk7CisgICAgICAgIG1fc3VnZ2VzdGlvbnNQb3B1cFNob3dpbmcgPSB0cnVlOworICAgIH0KK30K
Kwordm9pZCBXZWJWaWV3SW1wbDo6YXBwbHlBdXRvY29tcGxldGVTdWdnZXN0aW9ucygKKyAgICBj
b25zdCBXZWJOb2RlJiBub2RlLAorICAgIGNvbnN0IFdlYlZlY3RvcjxXZWJTdHJpbmc+JiBzdWdn
ZXN0aW9ucywKKyAgICBpbnQgZGVmYXVsdFN1Z2dlc3Rpb25JbmRleCkKK3sKICAgICBBU1NFUlQo
ZGVmYXVsdFN1Z2dlc3Rpb25JbmRleCA8IHN0YXRpY19jYXN0PGludD4oc3VnZ2VzdGlvbnMuc2l6
ZSgpKSk7CiAKLSAgICBpZiAoUmVmUHRyPEZyYW1lPiBmb2N1c2VkID0gbV9wYWdlLT5mb2N1c0Nv
bnRyb2xsZXIoKS0+Zm9jdXNlZEZyYW1lKCkpIHsKLSAgICAgICAgUmVmUHRyPERvY3VtZW50PiBk
b2N1bWVudCA9IGZvY3VzZWQtPmRvY3VtZW50KCk7Ci0gICAgICAgIGlmICghZG9jdW1lbnQuZ2V0
KCkpIHsKLSAgICAgICAgICAgIGhpZGVTdWdnZXN0aW9uc1BvcHVwKCk7Ci0gICAgICAgICAgICBy
ZXR1cm47Ci0gICAgICAgIH0KKyAgICBpZiAoIW1fcGFnZS5nZXQoKSB8fCBzdWdnZXN0aW9ucy5p
c0VtcHR5KCkpIHsKKyAgICAgICAgaGlkZVN1Z2dlc3Rpb25zUG9wdXAoKTsKKyAgICAgICAgcmV0
dXJuOworICAgIH0KIAotICAgICAgICBSZWZQdHI8Tm9kZT4gZm9jdXNlZE5vZGUgPSBkb2N1bWVu
dC0+Zm9jdXNlZE5vZGUoKTsKLSAgICAgICAgLy8gSWYgdGhlIG5vZGUgZm9yIHdoaWNoIHdlIHF1
ZXJpZWQgdGhlIGF1dG9maWxsIHN1Z2dlc3Rpb25zIGlzIG5vdCB0aGUKLSAgICAgICAgLy8gZm9j
dXNlZCBub2RlLCB0aGVuIHdlIGhhdmUgbm90aGluZyB0byBkby4gIEZJWE1FOiBhbHNvIGNoZWNr
IHRoZQotICAgICAgICAvLyBjYXJyZXQgaXMgYXQgdGhlIGVuZCBhbmQgdGhhdCB0aGUgdGV4dCBo
YXMgbm90IGNoYW5nZWQuCi0gICAgICAgIGlmICghZm9jdXNlZE5vZGUuZ2V0KCkgfHwgZm9jdXNl
ZE5vZGUgIT0gUGFzc1JlZlB0cjxOb2RlPihub2RlKSkgewotICAgICAgICAgICAgaGlkZVN1Z2dl
c3Rpb25zUG9wdXAoKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQorICAgIFJlZlB0
cjxOb2RlPiBmb2N1c2VkTm9kZSA9IGZvY3VzZWRXZWJDb3JlTm9kZSgpOworICAgIC8vIElmIHRo
ZSBub2RlIGZvciB3aGljaCB3ZSBxdWVyaWVkIHRoZSBBdXRvY29tcGxldGUgc3VnZ2VzdGlvbnMg
aXMgbm90IHRoZQorICAgIC8vIGZvY3VzZWQgbm9kZSwgdGhlbiB3ZSBoYXZlIG5vdGhpbmcgdG8g
ZG8uICBGSVhNRTogYWxzbyBjaGVjayB0aGUKKyAgICAvLyBjYXJldCBpcyBhdCB0aGUgZW5kIGFu
ZCB0aGF0IHRoZSB0ZXh0IGhhcyBub3QgY2hhbmdlZC4KKyAgICBpZiAoIWZvY3VzZWROb2RlIHx8
IGZvY3VzZWROb2RlICE9IFBhc3NSZWZQdHI8Tm9kZT4obm9kZSkpIHsKKyAgICAgICAgaGlkZVN1
Z2dlc3Rpb25zUG9wdXAoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KIAotICAgICAgICBpZiAo
IWZvY3VzZWROb2RlLT5oYXNUYWdOYW1lKEhUTUxOYW1lczo6aW5wdXRUYWcpKSB7Ci0gICAgICAg
ICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAg
fQorICAgIEhUTUxJbnB1dEVsZW1lbnQqIGlucHV0RWxlbSA9CisgICAgICAgIHN0YXRpY19jYXN0
PEhUTUxJbnB1dEVsZW1lbnQqPihmb2N1c2VkTm9kZS5nZXQoKSk7CiAKLSAgICAgICAgSFRNTElu
cHV0RWxlbWVudCogaW5wdXRFbGVtID0KLSAgICAgICAgICAgIHN0YXRpY19jYXN0PEhUTUxJbnB1
dEVsZW1lbnQqPihmb2N1c2VkTm9kZS5nZXQoKSk7CisgICAgLy8gVGhlIGZpcnN0IHRpbWUgdGhl
IEF1dG9jb21wbGV0ZSBpcyBzaG93biB3ZSdsbCBjcmVhdGUgdGhlIGNsaWVudCBhbmQgdGhlCisg
ICAgLy8gcG9wdXAuCisgICAgaWYgKCFtX2F1dG9jb21wbGV0ZVBvcHVwQ2xpZW50LmdldCgpKQor
ICAgICAgICBtX2F1dG9jb21wbGV0ZVBvcHVwQ2xpZW50LnNldChuZXcgQXV0b2NvbXBsZXRlUG9w
dXBNZW51Q2xpZW50KTsKIAotICAgICAgICAvLyBUaGUgZmlyc3QgdGltZSB0aGUgc3VnZ2VzdGlv
bnMgcG9wdXAgaXMgc2hvd24gd2UnbGwgY3JlYXRlIHRoZSBjbGllbnQKLSAgICAgICAgLy8gYW5k
IHRoZSBwb3B1cC4KLSAgICAgICAgaWYgKCFtX2F1dG9jb21wbGV0ZVBvcHVwQ2xpZW50LmdldCgp
KQotICAgICAgICAgICAgbV9hdXRvY29tcGxldGVQb3B1cENsaWVudC5zZXQobmV3IEF1dG9jb21w
bGV0ZVBvcHVwTWVudUNsaWVudCh0aGlzKSk7Ci0gICAgICAgIG1fYXV0b2NvbXBsZXRlUG9wdXBD
bGllbnQtPmluaXRpYWxpemUoaW5wdXRFbGVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIHN1Z2dlc3Rpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRTdWdnZXN0aW9uSW5kZXgpOwotICAgICAgICBp
ZiAoIW1fc3VnZ2VzdGlvbnNQb3B1cC5nZXQoKSkgewotICAgICAgICAgICAgbV9zdWdnZXN0aW9u
c1BvcHVwID0KLSAgICAgICAgICAgICAgICBQb3B1cENvbnRhaW5lcjo6Y3JlYXRlKG1fYXV0b2Nv
bXBsZXRlUG9wdXBDbGllbnQuZ2V0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBzdWdnZXN0aW9uc1BvcHVwU2V0dGluZ3MpOwotICAgICAgICB9CisgICAgbV9hdXRv
Y29tcGxldGVQb3B1cENsaWVudC0+aW5pdGlhbGl6ZShpbnB1dEVsZW0sIHN1Z2dlc3Rpb25zLAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFN1Z2dlc3Rp
b25JbmRleCk7CiAKLSAgICAgICAgaWYgKG1fc3VnZ2VzdGlvbnNQb3B1cFNob3dpbmcpIHsKLSAg
ICAgICAgICAgIG1fYXV0b2NvbXBsZXRlUG9wdXBDbGllbnQtPnNldFN1Z2dlc3Rpb25zKHN1Z2dl
c3Rpb25zKTsKLSAgICAgICAgICAgIHJlZnJlc2hTdWdnZXN0aW9uc1BvcHVwKCk7Ci0gICAgICAg
IH0gZWxzZSB7Ci0gICAgICAgICAgICBtX3N1Z2dlc3Rpb25zUG9wdXAtPnNob3coZm9jdXNlZE5v
ZGUtPmdldFJlY3QoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb2N1
c2VkTm9kZS0+b3duZXJEb2N1bWVudCgpLT52aWV3KCksIDApOwotICAgICAgICAgICAgbV9zdWdn
ZXN0aW9uc1BvcHVwU2hvd2luZyA9IHRydWU7Ci0gICAgICAgIH0KKyAgICBpZiAobV9zdWdnZXN0
aW9uc1BvcHVwQ2xpZW50ICE9IG1fYXV0b2NvbXBsZXRlUG9wdXBDbGllbnQuZ2V0KCkpIHsKKyAg
ICAgICAgaGlkZVN1Z2dlc3Rpb25zUG9wdXAoKTsKKyAgICAgICAgbV9zdWdnZXN0aW9uc1BvcHVw
Q2xpZW50ID0gbV9hdXRvY29tcGxldGVQb3B1cENsaWVudC5nZXQoKTsKKyAgICB9CisKKyAgICBp
ZiAoIW1fYXV0b2NvbXBsZXRlUG9wdXAuZ2V0KCkpIHsKKyAgICAgICAgbV9hdXRvY29tcGxldGVQ
b3B1cCA9IFBvcHVwQ29udGFpbmVyOjpjcmVhdGUobV9zdWdnZXN0aW9uc1BvcHVwQ2xpZW50LAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWdn
ZXN0aW9uc1BvcHVwU2V0dGluZ3MpOworICAgIH0KKworICAgIGlmIChtX3N1Z2dlc3Rpb25zUG9w
dXAgIT0gbV9hdXRvY29tcGxldGVQb3B1cC5nZXQoKSkKKyAgICAgICAgbV9zdWdnZXN0aW9uc1Bv
cHVwID0gbV9hdXRvY29tcGxldGVQb3B1cC5nZXQoKTsKKworICAgIGlmIChtX3N1Z2dlc3Rpb25z
UG9wdXBTaG93aW5nKSB7CisgICAgICAgIG1fYXV0b2NvbXBsZXRlUG9wdXBDbGllbnQtPnNldFN1
Z2dlc3Rpb25zKHN1Z2dlc3Rpb25zKTsKKyAgICAgICAgcmVmcmVzaFN1Z2dlc3Rpb25zUG9wdXAo
KTsKKyAgICB9IGVsc2UgeworICAgICAgICBtX3N1Z2dlc3Rpb25zUG9wdXAtPnNob3coZm9jdXNl
ZE5vZGUtPmdldFJlY3QoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvY3Vz
ZWROb2RlLT5vd25lckRvY3VtZW50KCktPnZpZXcoKSwgMCk7CisgICAgICAgIG1fc3VnZ2VzdGlv
bnNQb3B1cFNob3dpbmcgPSB0cnVlOwogICAgIH0KIH0KIApJbmRleDogV2ViS2l0L2Nocm9taXVt
L3NyYy9XZWJWaWV3SW1wbC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdC9jaHJvbWl1bS9zcmMvV2Vi
Vmlld0ltcGwuaAkocmV2aXNpb24gNTQ1MDEpCisrKyBXZWJLaXQvY2hyb21pdW0vc3JjL1dlYlZp
ZXdJbXBsLmgJKHdvcmtpbmcgY29weSkKQEAgLTU4LDYgKzU4LDcgQEAgY2xhc3MgS2V5Ym9hcmRF
dmVudDsKIGNsYXNzIFBhZ2U7CiBjbGFzcyBQbGF0Zm9ybUtleWJvYXJkRXZlbnQ7CiBjbGFzcyBQ
b3B1cENvbnRhaW5lcjsKK2NsYXNzIFBvcHVwTWVudUNsaWVudDsKIGNsYXNzIFJhbmdlOwogY2xh
c3MgUmVuZGVyVGhlbWU7CiBjbGFzcyBXaWRnZXQ7CkBAIC02NSw3ICs2Niw5IEBAIGNsYXNzIFdp
ZGdldDsKIAogbmFtZXNwYWNlIFdlYktpdCB7CiBjbGFzcyBBdXRvY29tcGxldGVQb3B1cE1lbnVD
bGllbnQ7CitjbGFzcyBBdXRvRmlsbFBvcHVwTWVudUNsaWVudDsKIGNsYXNzIENvbnRleHRNZW51
Q2xpZW50SW1wbDsKK2NsYXNzIFN1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50OwogY2xhc3MgV2Vi
QWNjZXNzaWJpbGl0eU9iamVjdDsKIGNsYXNzIFdlYkRldlRvb2xzQWdlbnRQcml2YXRlOwogY2xh
c3MgV2ViRnJhbWVJbXBsOwpAQCAtMTUzLDYgKzE1NiwxNSBAQCBwdWJsaWM6CiAgICAgICAgIGNv
bnN0IFdlYk5vZGUmLAogICAgICAgICBjb25zdCBXZWJWZWN0b3I8V2ViU3RyaW5nPiYgc3VnZ2Vz
dGlvbnMsCiAgICAgICAgIGludCBkZWZhdWx0U3VnZ2VzdGlvbkluZGV4KTsKKyAgICB2aXJ0dWFs
IHZvaWQgYXBwbHlBdXRvRmlsbFN1Z2dlc3Rpb25zKAorICAgICAgICBjb25zdCBXZWJOb2RlJiwK
KyAgICAgICAgY29uc3QgV2ViVmVjdG9yPFdlYlN0cmluZz4mIG5hbWVzLAorICAgICAgICBjb25z
dCBXZWJWZWN0b3I8V2ViU3RyaW5nPiYgbGFiZWxzLAorICAgICAgICBpbnQgZGVmYXVsdFN1Z2dl
c3Rpb25JbmRleCk7CisgICAgdmlydHVhbCB2b2lkIGFwcGx5QXV0b2NvbXBsZXRlU3VnZ2VzdGlv
bnMoCisgICAgICAgIGNvbnN0IFdlYk5vZGUmLAorICAgICAgICBjb25zdCBXZWJWZWN0b3I8V2Vi
U3RyaW5nPiYgc3VnZ2VzdGlvbnMsCisgICAgICAgIGludCBkZWZhdWx0U3VnZ2VzdGlvbkluZGV4
KTsKICAgICB2aXJ0dWFsIHZvaWQgaGlkZUF1dG9maWxsUG9wdXAoKTsKICAgICB2aXJ0dWFsIHZv
aWQgaGlkZVN1Z2dlc3Rpb25zUG9wdXAoKTsKICAgICB2aXJ0dWFsIHZvaWQgc2V0U2Nyb2xsYmFy
Q29sb3JzKHVuc2lnbmVkIGluYWN0aXZlQ29sb3IsCkBAIC0zOTUsMTYgKzQwNywyOSBAQCBwcml2
YXRlOgogICAgIC8vIGN1cnJlbnQgZHJvcCB0YXJnZXQgaW4gdGhpcyBXZWJWaWV3ICh0aGUgZHJv
cCB0YXJnZXQgY2FuIGFjY2VwdCB0aGUgZHJvcCkuCiAgICAgV2ViRHJhZ09wZXJhdGlvbiBtX2Ry
YWdPcGVyYXRpb247CiAKLSAgICAvLyBUaGUgc3VnZ2VzdGlvbnMgcG9wdXAuICBLZXB0IGFyb3Vu
ZCBhbmQgcmV1c2VkIGV2ZXJ5LXRpbWUgbmV3IHN1Z2dlc3Rpb25zCi0gICAgLy8gc2hvdWxkIGJl
IHNob3duLgotICAgIFJlZlB0cjxXZWJDb3JlOjpQb3B1cENvbnRhaW5lcj4gbV9zdWdnZXN0aW9u
c1BvcHVwOwotCi0gICAgLy8gV2hldGhlciB0aGUgc3VnZ2VzdGlvbnMgcG9wdXAgaXMgY3VycmVu
dGx5IHNob3dpbmcuCisgICAgLy8gV2hldGhlciBhIHN1Z2dlc3Rpb25zIHBvcHVwIGlzIGN1cnJl
bnRseSBzaG93aW5nLgogICAgIGJvb2wgbV9zdWdnZXN0aW9uc1BvcHVwU2hvd2luZzsKIAotICAg
IC8vIFRoZSBhdXRvY29tcGxldGUgY2xpZW50LgorICAgIC8vIEEgcG9pbnRlciB0byB0aGUgY3Vy
cmVudCBzdWdnZXN0aW9ucyBwb3B1cCBtZW51IGNsaWVudC4gIFRoaXMgY2FuIGJlCisgICAgLy8g
ZWl0aGVyIGFuIEF1dG9GaWxsUG9wdXBNZW51Q2xpZW50IG9yIGFuIEF1dG9jb21wbGV0ZVBvcHVw
TWVudUNsaWVudC4gIFdlCisgICAgLy8gZG8gbm90IG93biB0aGlzIHBvaW50ZXIuCisgICAgU3Vn
Z2VzdGlvbnNQb3B1cE1lbnVDbGllbnQqIG1fc3VnZ2VzdGlvbnNQb3B1cENsaWVudDsKKworICAg
IC8vIFRoZSBBdXRvRmlsbCBwb3B1cCBjbGllbnQuCisgICAgT3duUHRyPEF1dG9GaWxsUG9wdXBN
ZW51Q2xpZW50PiBtX2F1dG9GaWxsUG9wdXBDbGllbnQ7CisKKyAgICAvLyBUaGUgQXV0b2NvbXBs
ZXRlIHBvcHVwIGNsaWVudC4KICAgICBPd25QdHI8QXV0b2NvbXBsZXRlUG9wdXBNZW51Q2xpZW50
PiBtX2F1dG9jb21wbGV0ZVBvcHVwQ2xpZW50OwogCisgICAgLy8gQSBwb2ludGVyIHRvIHRoZSBj
dXJyZW50IHN1Z2dlc3Rpb25zIHBvcHVwLiAgV2UgZG8gbm90IG93biB0aGlzIHBvaW50ZXIuCisg
ICAgV2ViQ29yZTo6UG9wdXBDb250YWluZXIqIG1fc3VnZ2VzdGlvbnNQb3B1cDsKKworICAgIC8v
IFRoZSBBdXRvRmlsbCBzdWdnZXN0aW9ucyBwb3B1cC4KKyAgICBSZWZQdHI8V2ViQ29yZTo6UG9w
dXBDb250YWluZXI+IG1fYXV0b0ZpbGxQb3B1cDsKKworICAgIC8vIFRoZSBBdXRvQ29tcGxldGUg
c3VnZ2VzdGlvbnMgcG9wdXAuCisgICAgUmVmUHRyPFdlYkNvcmU6OlBvcHVwQ29udGFpbmVyPiBt
X2F1dG9jb21wbGV0ZVBvcHVwOworCiAgICAgT3duUHRyPFdlYkRldlRvb2xzQWdlbnRQcml2YXRl
PiBtX2RldlRvb2xzQWdlbnQ7CiAKICAgICAvLyBXaGV0aGVyIHRoZSB3ZWJ2aWV3IGlzIHJlbmRl
cmluZyB0cmFuc3BhcmVudGx5Lgo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>48448</attachid>
            <date>2010-02-09 15:30:29 -0800</date>
            <delta_ts>2010-02-09 15:52:43 -0800</delta_ts>
            <desc>[Chromium] Refactor AutocompletePopupMenuClient [try7]</desc>
            <filename>refactor7.diff</filename>
            <type>text/plain</type>
            <size>47153</size>
            <attacher name="James Hawkins">jhawkins</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYktpdC9jaHJvbWl1bS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0L2No
cm9taXVtL0NoYW5nZUxvZwkocmV2aXNpb24gNTQ1NjgpCisrKyBXZWJLaXQvY2hyb21pdW0vQ2hh
bmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMzYgQEAKKzIwMTAtMDItMDkgIEphbWVz
IEhhd2tpbnMgIDxqaGF3a2luc0BjaHJvbWl1bS5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkg
Tk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgW0Nocm9taXVtXSBSZWZhY3RvciBBdXRvY29tcGxl
dGVQb3B1cE1lbnVDbGllbnQgaW50byBhIGJhc2UgY2xhc3MsCisgICAgICAgIFN1Z2dlc3Rpb25z
UG9wdXBNZW51Q2xpZW50LCBhbmQgdHdvIGRlcml2ZWQgY2xhc3NlcywKKyAgICAgICAgQXV0b2Nv
bXBsZXRlUG9wdXBNZW51Q2xpZW50IGFuZCBBdXRvRmlsbFBvcHVwTWVudUNsaWVudC4gIEN1cnJl
bnRseQorICAgICAgICB0aGUgYmVoYXZpb3Igb2Ygc3VnZ2VzdGlvbnMgcG9wdXBzIGhhcyBub3Qg
Y2hhbmdlZC4KKworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/
aWQ9MzQ3MjEKKworICAgICAgICAqIFdlYktpdC5neXA6CisgICAgICAgICogcHVibGljL1dlYlZp
ZXcuaDoKKyAgICAgICAgKiBzcmMvQXV0b0ZpbGxQb3B1cE1lbnVDbGllbnQuY3BwOiBBZGRlZC4K
KyAgICAgICAgKiBzcmMvQXV0b0ZpbGxQb3B1cE1lbnVDbGllbnQuaDogQWRkZWQuCisgICAgICAg
ICogc3JjL0F1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVudC5jcHA6CisgICAgICAgIChXZWJLaXQ6
OkF1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVudDo6Z2V0U3VnZ2VzdGlvbnNDb3VudCk6CisgICAg
ICAgIChXZWJLaXQ6OkF1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVudDo6Z2V0U3VnZ2VzdGlvbik6
CisgICAgICAgIChXZWJLaXQ6OkF1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVudDo6cmVtb3ZlU3Vn
Z2VzdGlvbkF0SW5kZXgpOgorICAgICAgICAoV2ViS2l0OjpBdXRvY29tcGxldGVQb3B1cE1lbnVD
bGllbnQ6OmluaXRpYWxpemUpOgorICAgICAgICAoV2ViS2l0OjpBdXRvY29tcGxldGVQb3B1cE1l
bnVDbGllbnQ6OnNldFN1Z2dlc3Rpb25zKToKKyAgICAgICAgKiBzcmMvQXV0b2NvbXBsZXRlUG9w
dXBNZW51Q2xpZW50Lmg6CisgICAgICAgICogc3JjL1N1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50
LmNwcDogQWRkZWQuCisgICAgICAgICogc3JjL1N1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50Lmg6
IEFkZGVkLgorICAgICAgICAqIHNyYy9XZWJWaWV3SW1wbC5jcHA6CisgICAgICAgIChXZWJLaXQ6
OldlYlZpZXdJbXBsOjpXZWJWaWV3SW1wbCk6CisgICAgICAgIChXZWJLaXQ6OldlYlZpZXdJbXBs
OjprZXlFdmVudCk6CisgICAgICAgIChXZWJLaXQ6OldlYlZpZXdJbXBsOjphdXRvY29tcGxldGVI
YW5kbGVLZXlFdmVudCk6CisgICAgICAgIChXZWJLaXQ6OldlYlZpZXdJbXBsOjphcHBseUF1dG9m
aWxsU3VnZ2VzdGlvbnMpOgorICAgICAgICAoV2ViS2l0OjpXZWJWaWV3SW1wbDo6YXBwbHlBdXRv
RmlsbFN1Z2dlc3Rpb25zKToKKyAgICAgICAgKFdlYktpdDo6V2ViVmlld0ltcGw6OmFwcGx5QXV0
b2NvbXBsZXRlU3VnZ2VzdGlvbnMpOgorICAgICAgICAqIHNyYy9XZWJWaWV3SW1wbC5oOgorCiAy
MDEwLTAyLTA5ICBKaWFuIExpICA8amlhbmxpQGNocm9taXVtLm9yZz4KIAogICAgICAgICBSZXZp
ZXdlZCBieSBEYXJpbiBGaXNoZXIuCkluZGV4OiBXZWJLaXQvY2hyb21pdW0vV2ViS2l0Lmd5cAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBXZWJLaXQvY2hyb21pdW0vV2ViS2l0Lmd5cAkocmV2aXNpb24gNTQ1MDEp
CisrKyBXZWJLaXQvY2hyb21pdW0vV2ViS2l0Lmd5cAkod29ya2luZyBjb3B5KQpAQCAtMTk5LDYg
KzE5OSw4IEBACiAgICAgICAgICAgICAgICAgJ3NyYy9Bc3NlcnRNYXRjaGluZ0VudW1zLmNwcCcs
CiAgICAgICAgICAgICAgICAgJ3NyYy9BdXRvY29tcGxldGVQb3B1cE1lbnVDbGllbnQuY3BwJywK
ICAgICAgICAgICAgICAgICAnc3JjL0F1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVudC5oJywKKyAg
ICAgICAgICAgICAgICAnc3JjL0F1dG9GaWxsUG9wdXBNZW51Q2xpZW50LmNwcCcsCisgICAgICAg
ICAgICAgICAgJ3NyYy9BdXRvRmlsbFBvcHVwTWVudUNsaWVudC5oJywKICAgICAgICAgICAgICAg
ICAnc3JjL0JhY2tGb3J3YXJkTGlzdENsaWVudEltcGwuY3BwJywKICAgICAgICAgICAgICAgICAn
c3JjL0JhY2tGb3J3YXJkTGlzdENsaWVudEltcGwuaCcsCiAgICAgICAgICAgICAgICAgJ3NyYy9C
b3VuZE9iamVjdC5jcHAnLApAQCAtMjU3LDYgKzI1OSw4IEBACiAgICAgICAgICAgICAgICAgJ3Ny
Yy9TdG9yYWdlRXZlbnREaXNwYXRjaGVySW1wbC5oJywKICAgICAgICAgICAgICAgICAnc3JjL1N0
b3JhZ2VOYW1lc3BhY2VQcm94eS5jcHAnLAogICAgICAgICAgICAgICAgICdzcmMvU3RvcmFnZU5h
bWVzcGFjZVByb3h5LmgnLAorICAgICAgICAgICAgICAgICdzcmMvU3VnZ2VzdGlvbnNQb3B1cE1l
bnVDbGllbnQuY3BwJywKKyAgICAgICAgICAgICAgICAnc3JjL1N1Z2dlc3Rpb25zUG9wdXBNZW51
Q2xpZW50LmgnLAogICAgICAgICAgICAgICAgICdzcmMvVGVtcG9yYXJ5R2x1ZS5oJywKICAgICAg
ICAgICAgICAgICAnc3JjL1Rvb2xzQWdlbnQuaCcsCiAgICAgICAgICAgICAgICAgJ3NyYy9XZWJB
Y2Nlc3NpYmlsaXR5Q2FjaGUuY3BwJywKSW5kZXg6IFdlYktpdC9jaHJvbWl1bS9wdWJsaWMvV2Vi
Vmlldy5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdC9jaHJvbWl1bS9wdWJsaWMvV2ViVmlldy5oCShy
ZXZpc2lvbiA1NDUwMSkKKysrIFdlYktpdC9jaHJvbWl1bS9wdWJsaWMvV2ViVmlldy5oCSh3b3Jr
aW5nIGNvcHkpCkBAIC0yMjMsMTQgKzIyMywyOSBAQCBwdWJsaWM6CiAgICAgdmlydHVhbCBXZWJB
Y2Nlc3NpYmlsaXR5T2JqZWN0IGFjY2Vzc2liaWxpdHlPYmplY3QoKSA9IDA7CiAKIAotICAgIC8v
IEF1dG9maWxsIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLQorICAgIC8vIEF1dG9GaWxsIC8gQXV0b2NvbXBsZXRlIC0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi0gICAgLy8gTm90aWZpZXMgdGhl
IFdlYlZpZXcgdGhhdCBhdXRvZmlsbCBzdWdnZXN0aW9ucyBhcmUgYXZhaWxhYmxlIGZvciBhIG5v
ZGUuCisgICAgLy8gREVQUkVDQVRFRDogV2ViVmlldzo6YXBwbHlBdXRvY29tcGxldGVTdWdnZXN0
aW9ucyBpcyB0aGUgbmV3IHdheSB0bworICAgIC8vIGFjY2VzcyB0aGlzLgogICAgIHZpcnR1YWwg
dm9pZCBhcHBseUF1dG9maWxsU3VnZ2VzdGlvbnMoCiAgICAgICAgIGNvbnN0IFdlYk5vZGUmLAog
ICAgICAgICBjb25zdCBXZWJWZWN0b3I8V2ViU3RyaW5nPiYgc3VnZ2VzdGlvbnMsCiAgICAgICAg
IGludCBkZWZhdWx0U3VnZ2VzdGlvbkluZGV4KSA9IDA7CiAKKyAgICAvLyBOb3RpZmllcyB0aGUg
V2ViVmlldyB0aGF0IEF1dG9GaWxsIHN1Z2dlc3Rpb25zIGFyZSBhdmFpbGFibGUgZm9yIGEgbm9k
ZS4KKyAgICB2aXJ0dWFsIHZvaWQgYXBwbHlBdXRvRmlsbFN1Z2dlc3Rpb25zKAorICAgICAgICBj
b25zdCBXZWJOb2RlJiwKKyAgICAgICAgY29uc3QgV2ViVmVjdG9yPFdlYlN0cmluZz4mIG5hbWVz
LAorICAgICAgICBjb25zdCBXZWJWZWN0b3I8V2ViU3RyaW5nPiYgbGFiZWxzLAorICAgICAgICBp
bnQgZGVmYXVsdFN1Z2dlc3Rpb25JbmRleCkgPSAwOworCisgICAgLy8gTm90aWZpZXMgdGhlIFdl
YlZpZXcgdGhhdCBBdXRvY29tcGxldGUgc3VnZ2VzdGlvbnMgYXJlIGF2YWlsYWJsZSBmb3IgYQor
ICAgIC8vIG5vZGUuCisgICAgdmlydHVhbCB2b2lkIGFwcGx5QXV0b2NvbXBsZXRlU3VnZ2VzdGlv
bnMoCisgICAgICAgIGNvbnN0IFdlYk5vZGUmLAorICAgICAgICBjb25zdCBXZWJWZWN0b3I8V2Vi
U3RyaW5nPiYgc3VnZ2VzdGlvbnMsCisgICAgICAgIGludCBkZWZhdWx0U3VnZ2VzdGlvbkluZGV4
KSA9IDA7CisKICAgICAvLyBERVBSRUNBVEVEOiBXZWJWaWV3OjpoaWRlU3VnZ2VzdGlvbnNQb3B1
cCBpcyB0aGUgbmV3IHdheSB0byBhY2Nlc3MgdGhpcy4KICAgICB2aXJ0dWFsIHZvaWQgaGlkZUF1
dG9maWxsUG9wdXAoKSA9IDA7CiAKSW5kZXg6IFdlYktpdC9jaHJvbWl1bS9zcmMvQXV0b0ZpbGxQ
b3B1cE1lbnVDbGllbnQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdC9jaHJvbWl1bS9zcmMvQXV0
b0ZpbGxQb3B1cE1lbnVDbGllbnQuY3BwCShyZXZpc2lvbiAwKQorKysgV2ViS2l0L2Nocm9taXVt
L3NyYy9BdXRvRmlsbFBvcHVwTWVudUNsaWVudC5jcHAJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEs
MTA2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6Cisg
KgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBi
aW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAq
IGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29v
Z2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNl
ZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNv
ZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBD
T05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFO
VElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJS
QU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxB
UiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hU
CisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJ
UkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElB
TCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5U
IE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwg
T1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQg
T04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJX
SVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdB
UkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisg
Ki8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkF1dG9GaWxsUG9wdXBNZW51Q2xp
ZW50LmgiCisKKyNpbmNsdWRlICJIVE1MSW5wdXRFbGVtZW50LmgiCisjaW5jbHVkZSAiV2ViU3Ry
aW5nLmgiCisjaW5jbHVkZSAiV2ViVmVjdG9yLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBXZWJDb3Jl
OworCituYW1lc3BhY2UgV2ViS2l0IHsKKwordW5zaWduZWQgQXV0b0ZpbGxQb3B1cE1lbnVDbGll
bnQ6OmdldFN1Z2dlc3Rpb25zQ291bnQoKSBjb25zdAoreworICAgIHJldHVybiBtX25hbWVzLnNp
emUoKTsKK30KKworV2ViU3RyaW5nIEF1dG9GaWxsUG9wdXBNZW51Q2xpZW50OjpnZXRTdWdnZXN0
aW9uKHVuc2lnbmVkIGxpc3RJbmRleCkgY29uc3QKK3sKKyAgICAvLyBGSVhNRTogTW9kaWZ5IHRo
ZSBQb3B1cE1lbnUgdG8gYWRkIHRoZSBsYWJlbCBpbiBncmF5IHJpZ2h0LWp1c3RpZmllZC4KKyAg
ICBBU1NFUlQobGlzdEluZGV4ID49IDAgJiYgbGlzdEluZGV4IDwgbV9uYW1lcy5zaXplKCkpOwor
ICAgIHJldHVybiBtX25hbWVzW2xpc3RJbmRleF0gKyBTdHJpbmcoIiAoIikgKyBtX2xhYmVsc1ts
aXN0SW5kZXhdICsgU3RyaW5nKCIpIik7Cit9CisKK3ZvaWQgQXV0b0ZpbGxQb3B1cE1lbnVDbGll
bnQ6OnJlbW92ZVN1Z2dlc3Rpb25BdEluZGV4KHVuc2lnbmVkIGxpc3RJbmRleCkKK3sKKyAgICAv
LyBGSVhNRTogRG8gd2Ugd2FudCB0byByZW1vdmUgQXV0b0ZpbGwgc3VnZ2VzdGlvbnM/CisgICAg
QVNTRVJUKGxpc3RJbmRleCA+PSAwICYmIGxpc3RJbmRleCA8IHN0YXRpY19jYXN0PGludD4obV9u
YW1lcy5zaXplKCkpKTsKKyAgICBtX25hbWVzLnJlbW92ZShsaXN0SW5kZXgpOworICAgIG1fbGFi
ZWxzLnJlbW92ZShsaXN0SW5kZXgpOworfQorCit2b2lkIEF1dG9GaWxsUG9wdXBNZW51Q2xpZW50
Ojogc2VsZWN0aW9uQ2hhbmdlZCh1bnNpZ25lZCBsaXN0SW5kZXgsCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZpcmVFdmVudHMpIHsKKyAgICBp
ZiAobGlzdEluZGV4ID09IHN0YXRpY19jYXN0PHVuc2lnbmVkPigtMSkpIHsKKyAgICAgICAgU3Vn
Z2VzdGlvbnNQb3B1cE1lbnVDbGllbnQ6OnNlbGVjdGlvbkNoYW5nZWQobGlzdEluZGV4LCBmaXJl
RXZlbnRzKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEFTU0VSVChsaXN0SW5kZXgg
Pj0gMCAmJiBsaXN0SW5kZXggPCBtX25hbWVzLnNpemUoKSk7CisgICAgc2V0U3VnZ2VzdGVkVmFs
dWUobV9uYW1lc1tsaXN0SW5kZXhdKTsKK30KKwordm9pZCBBdXRvRmlsbFBvcHVwTWVudUNsaWVu
dDo6aW5pdGlhbGl6ZSgKKyAgICBIVE1MSW5wdXRFbGVtZW50KiB0ZXh0RmllbGQsCisgICAgY29u
c3QgV2ViVmVjdG9yPFdlYlN0cmluZz4mIG5hbWVzLAorICAgIGNvbnN0IFdlYlZlY3RvcjxXZWJT
dHJpbmc+JiBsYWJlbHMsCisgICAgaW50IGRlZmF1bHRTdWdnZXN0aW9uSW5kZXgpCit7CisgICAg
QVNTRVJUKG5hbWVzLnNpemUoKSA9PSBsYWJlbHMuc2l6ZSgpKTsKKyAgICBBU1NFUlQoZGVmYXVs
dFN1Z2dlc3Rpb25JbmRleCA8IHN0YXRpY19jYXN0PGludD4obmFtZXMuc2l6ZSgpKSk7CisKKyAg
ICAvLyBUaGUgc3VnZ2VzdGlvbnMgbXVzdCBiZSBzZXQgYmVmb3JlIGluaXRpYWxpemluZyB0aGUK
KyAgICAvLyBTdWdnZXN0aW9uc1BvcHVwTWVudUNsaWVudC4KKyAgICBzZXRTdWdnZXN0aW9ucyhu
YW1lcywgbGFiZWxzKTsKKworICAgIFN1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50Ojppbml0aWFs
aXplKHRleHRGaWVsZCwgZGVmYXVsdFN1Z2dlc3Rpb25JbmRleCk7Cit9CisKK3ZvaWQgQXV0b0Zp
bGxQb3B1cE1lbnVDbGllbnQ6OnNldFN1Z2dlc3Rpb25zKGNvbnN0IFdlYlZlY3RvcjxXZWJTdHJp
bmc+JiBuYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGNvbnN0IFdlYlZlY3RvcjxXZWJTdHJpbmc+JiBsYWJlbHMpCit7CisgICAgQVNTRVJUKG5hbWVz
LnNpemUoKSA9PSBsYWJlbHMuc2l6ZSgpKTsKKworICAgIG1fbmFtZXMuY2xlYXIoKTsKKyAgICBt
X2xhYmVscy5jbGVhcigpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbmFtZXMuc2l6ZSgp
OyArK2kpIHsKKyAgICAgICAgbV9uYW1lcy5hcHBlbmQobmFtZXNbaV0pOworICAgICAgICBtX2xh
YmVscy5hcHBlbmQobGFiZWxzW2ldKTsKKyAgICB9CisKKyAgICAvLyBUcnkgdG8gcHJlc2VydmUg
c2VsZWN0aW9uIGlmIHBvc3NpYmxlLgorICAgIGlmIChnZXRTZWxlY3RlZEluZGV4KCkgPj0gc3Rh
dGljX2Nhc3Q8aW50PihuYW1lcy5zaXplKCkpKQorICAgICAgICBzZXRTZWxlY3RlZEluZGV4KC0x
KTsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViS2l0CkluZGV4OiBXZWJLaXQvY2hyb21pdW0vc3Jj
L0F1dG9GaWxsUG9wdXBNZW51Q2xpZW50LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0L2Nocm9taXVt
L3NyYy9BdXRvRmlsbFBvcHVwTWVudUNsaWVudC5oCShyZXZpc2lvbiAwKQorKysgV2ViS2l0L2No
cm9taXVtL3NyYy9BdXRvRmlsbFBvcHVwTWVudUNsaWVudC5oCShyZXZpc2lvbiAwKQpAQCAtMCww
ICsxLDcxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5k
IGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJt
aXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6
CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWlu
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBp
biBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIK
KyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQg
d2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2Yg
R29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUg
dXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlz
IHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoK
KyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFO
RCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FS
UkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBX
QVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElD
VUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJ
R0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVO
VElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVN
RU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFU
QSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBB
TkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBT
VFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09G
VFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
CisgKi8KKworI2lmbmRlZiBBdXRvRmlsbFBvcHVwTWVudUNsaWVudF9oCisjZGVmaW5lIEF1dG9G
aWxsUG9wdXBNZW51Q2xpZW50X2gKKworI2luY2x1ZGUgIlN1Z2dlc3Rpb25zUG9wdXBNZW51Q2xp
ZW50LmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKK2NsYXNzIEhUTUxJbnB1dEVsZW1lbnQ7Cit9
CisKK25hbWVzcGFjZSBXZWJLaXQgeworY2xhc3MgV2ViU3RyaW5nOwordGVtcGxhdGUgPHR5cGVu
YW1lIFQ+IGNsYXNzIFdlYlZlY3RvcjsKKworLy8gVGhlIEF1dG9GaWxsIHN1Z2dlc3Rpb25zIHBv
cHVwIG1lbnUgY2xpZW50LCB1c2VkIHRvIGRpc3BsYXkgbmFtZSBzdWdnZXN0aW9ucworLy8gd2l0
aCByaWdodC1qdXN0aWZpZWQgbGFiZWxzLgorY2xhc3MgQXV0b0ZpbGxQb3B1cE1lbnVDbGllbnQg
OiBwdWJsaWMgU3VnZ2VzdGlvbnNQb3B1cE1lbnVDbGllbnQgeworcHVibGljOgorICAgIC8vIFN1
Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50IGltcGxlbWVudGF0aW9uOgorICAgIHZpcnR1YWwgdW5z
aWduZWQgZ2V0U3VnZ2VzdGlvbnNDb3VudCgpIGNvbnN0OworICAgIHZpcnR1YWwgV2ViU3RyaW5n
IGdldFN1Z2dlc3Rpb24odW5zaWduZWQgbGlzdEluZGV4KSBjb25zdDsKKyAgICB2aXJ0dWFsIHZv
aWQgcmVtb3ZlU3VnZ2VzdGlvbkF0SW5kZXgodW5zaWduZWQgbGlzdEluZGV4KTsKKworICAgIC8v
IFdlYkNvcmU6OlBvcHVwTWVudUNsaWVudCBpbXBsZW1lbnRhdGlvbjoKKyAgICB2aXJ0dWFsIHZv
aWQgc2VsZWN0aW9uQ2hhbmdlZCh1bnNpZ25lZCBsaXN0SW5kZXgsIGJvb2wgZmlyZUV2ZW50cyk7
CisKKyAgICB2b2lkIGluaXRpYWxpemUoV2ViQ29yZTo6SFRNTElucHV0RWxlbWVudCosCisgICAg
ICAgICAgICAgICAgICAgIGNvbnN0IFdlYlZlY3RvcjxXZWJTdHJpbmc+JiBuYW1lcywKKyAgICAg
ICAgICAgICAgICAgICAgY29uc3QgV2ViVmVjdG9yPFdlYlN0cmluZz4mIGxhYmVscywKKyAgICAg
ICAgICAgICAgICAgICAgaW50IGRlZmF1bHRTdWdnZXN0aW9uSW5kZXgpOworCisgICAgdm9pZCBz
ZXRTdWdnZXN0aW9ucyhjb25zdCBXZWJWZWN0b3I8V2ViU3RyaW5nPiYgbmFtZXMsCisgICAgICAg
ICAgICAgICAgICAgICAgICBjb25zdCBXZWJWZWN0b3I8V2ViU3RyaW5nPiYgbGFiZWxzKTsKKwor
cHJpdmF0ZToKKyAgICBWZWN0b3I8V2ViQ29yZTo6U3RyaW5nPiBtX25hbWVzOworICAgIFZlY3Rv
cjxXZWJDb3JlOjpTdHJpbmc+IG1fbGFiZWxzOworfTsKKworfSAvLyBuYW1lc3BhY2UgV2ViS2l0
CisKKyNlbmRpZgoKUHJvcGVydHkgY2hhbmdlcyBvbjogV2ViS2l0L2Nocm9taXVtL3NyYy9BdXRv
RmlsbFBvcHVwTWVudUNsaWVudC5oCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KQWRkZWQ6IHN2bjplb2wtc3R5bGUKICAg
KyBMRgoKSW5kZXg6IFdlYktpdC9jaHJvbWl1bS9zcmMvQXV0b2NvbXBsZXRlUG9wdXBNZW51Q2xp
ZW50LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQvY2hyb21pdW0vc3JjL0F1dG9jb21wbGV0ZVBv
cHVwTWVudUNsaWVudC5jcHAJKHJldmlzaW9uIDU0NTAxKQorKysgV2ViS2l0L2Nocm9taXVtL3Ny
Yy9BdXRvY29tcGxldGVQb3B1cE1lbnVDbGllbnQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xLDUg
KzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBHb29nbGUgSW5jLiBBbGwgcmlnaHRz
IHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCkBAIC0zMSwyNyAr
MzEsMjkgQEAKICNpbmNsdWRlICJjb25maWcuaCIKICNpbmNsdWRlICJBdXRvY29tcGxldGVQb3B1
cE1lbnVDbGllbnQuaCIKIAotI2luY2x1ZGUgIkNTU1N0eWxlU2VsZWN0b3IuaCIKLSNpbmNsdWRl
ICJDU1NWYWx1ZUtleXdvcmRzLmgiCi0jaW5jbHVkZSAiRnJhbWVWaWV3LmgiCiAjaW5jbHVkZSAi
SFRNTElucHV0RWxlbWVudC5oIgotI2luY2x1ZGUgIlJlbmRlclRoZW1lLmgiCisjaW5jbHVkZSAi
V2ViU3RyaW5nLmgiCiAjaW5jbHVkZSAiV2ViVmVjdG9yLmgiCi0jaW5jbHVkZSAiV2ViVmlld0lt
cGwuaCIKIAogdXNpbmcgbmFtZXNwYWNlIFdlYkNvcmU7CiAKIG5hbWVzcGFjZSBXZWJLaXQgewog
Ci1BdXRvY29tcGxldGVQb3B1cE1lbnVDbGllbnQ6OkF1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVu
dChXZWJWaWV3SW1wbCogd2ViVmlldykKLSAgICA6IG1fdGV4dEZpZWxkKDApCi0gICAgLCBtX3Nl
bGVjdGVkSW5kZXgoMCkKLSAgICAsIG1fd2ViVmlldyh3ZWJWaWV3KQordW5zaWduZWQgQXV0b2Nv
bXBsZXRlUG9wdXBNZW51Q2xpZW50OjpnZXRTdWdnZXN0aW9uc0NvdW50KCkgY29uc3QKIHsKKyAg
ICByZXR1cm4gbV9zdWdnZXN0aW9ucy5zaXplKCk7CiB9CiAKLUF1dG9jb21wbGV0ZVBvcHVwTWVu
dUNsaWVudDo6fkF1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVudCgpCitXZWJTdHJpbmcgQXV0b2Nv
bXBsZXRlUG9wdXBNZW51Q2xpZW50OjpnZXRTdWdnZXN0aW9uKHVuc2lnbmVkIGxpc3RJbmRleCkg
Y29uc3QKIHsKKyAgICBBU1NFUlQobGlzdEluZGV4ID49IDAgJiYgbGlzdEluZGV4IDwgbV9zdWdn
ZXN0aW9ucy5zaXplKCkpOworICAgIHJldHVybiBtX3N1Z2dlc3Rpb25zW2xpc3RJbmRleF07Cit9
CisKK3ZvaWQgQXV0b2NvbXBsZXRlUG9wdXBNZW51Q2xpZW50OjpyZW1vdmVTdWdnZXN0aW9uQXRJ
bmRleCh1bnNpZ25lZCBsaXN0SW5kZXgpCit7CisgICAgQVNTRVJUKGxpc3RJbmRleCA+PSAwICYm
IGxpc3RJbmRleCA8IG1fc3VnZ2VzdGlvbnMuc2l6ZSgpKTsKKyAgICBtX3N1Z2dlc3Rpb25zLnJl
bW92ZShsaXN0SW5kZXgpOwogfQogCiB2b2lkIEF1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVudDo6
aW5pdGlhbGl6ZSgKQEAgLTYwLDkwICs2MiwxMiBAQCB2b2lkIEF1dG9jb21wbGV0ZVBvcHVwTWVu
dUNsaWVudDo6aW5pdGlhCiAgICAgaW50IGRlZmF1bHRTdWdnZXN0aW9uSW5kZXgpCiB7CiAgICAg
QVNTRVJUKGRlZmF1bHRTdWdnZXN0aW9uSW5kZXggPCBzdGF0aWNfY2FzdDxpbnQ+KHN1Z2dlc3Rp
b25zLnNpemUoKSkpOwotICAgIG1fdGV4dEZpZWxkID0gdGV4dEZpZWxkOwotICAgIG1fc2VsZWN0
ZWRJbmRleCA9IGRlZmF1bHRTdWdnZXN0aW9uSW5kZXg7Ci0gICAgc2V0U3VnZ2VzdGlvbnMoc3Vn
Z2VzdGlvbnMpOwotCi0gICAgRm9udERlc2NyaXB0aW9uIGZvbnREZXNjcmlwdGlvbjsKLSAgICBt
X3dlYlZpZXctPnRoZW1lKCktPnN5c3RlbUZvbnQoQ1NTVmFsdWVXZWJraXRDb250cm9sLCBmb250
RGVzY3JpcHRpb24pOwotICAgIC8vIFVzZSBhIHNtYWxsZXIgZm9udCBzaXplIHRvIG1hdGNoIElF
L0ZpcmVmb3guCi0gICAgLy8gRklYTUU6IGh0dHA6Ly9jcmJ1Zy5jb20vNzM3NiB1c2UgdGhlIHN5
c3RlbSBzaXplIGluc3RlYWQgb2YgYQotICAgIC8vICAgICAgICBmaXhlZCBmb250IHNpemUgdmFs
dWUuCi0gICAgZm9udERlc2NyaXB0aW9uLnNldENvbXB1dGVkU2l6ZSgxMi4wKTsKLSAgICBGb250
IGZvbnQoZm9udERlc2NyaXB0aW9uLCAwLCAwKTsKLSAgICBmb250LnVwZGF0ZSh0ZXh0RmllbGQt
PmRvY3VtZW50KCktPnN0eWxlU2VsZWN0b3IoKS0+Zm9udFNlbGVjdG9yKCkpOwotICAgIC8vIFRo
ZSBkaXJlY3Rpb24gb2YgdGV4dCBpbiBwb3B1cCBtZW51IGlzIHNldCB0aGUgc2FtZSBhcyB0aGUg
ZGlyZWN0aW9uIG9mCi0gICAgLy8gdGhlIGlucHV0IGVsZW1lbnQ6IHRleHRGaWVsZC4KLSAgICBt
X3N0eWxlLnNldChuZXcgUG9wdXBNZW51U3R5bGUoQ29sb3I6OmJsYWNrLCBDb2xvcjo6d2hpdGUs
IGZvbnQsIHRydWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExlbmd0aChX
ZWJDb3JlOjpGaXhlZCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRG
aWVsZC0+cmVuZGVyZXIoKS0+c3R5bGUoKS0+ZGlyZWN0aW9uKCkpKTsKLX0KLQotdm9pZCBBdXRv
Y29tcGxldGVQb3B1cE1lbnVDbGllbnQ6OnZhbHVlQ2hhbmdlZCh1bnNpZ25lZCBsaXN0SW5kZXgs
IGJvb2wgZmlyZUV2ZW50cykKLXsKLSAgICBtX3RleHRGaWVsZC0+c2V0VmFsdWUobV9zdWdnZXN0
aW9uc1tsaXN0SW5kZXhdKTsKLSAgICBFZGl0b3JDbGllbnRJbXBsKiBlZGl0b3IgPQotICAgICAg
ICBzdGF0aWNfY2FzdDxFZGl0b3JDbGllbnRJbXBsKj4obV93ZWJWaWV3LT5wYWdlKCktPmVkaXRv
ckNsaWVudCgpKTsKLSAgICBBU1NFUlQoZWRpdG9yKTsKLSAgICBlZGl0b3ItPm9uQXV0b2ZpbGxT
dWdnZXN0aW9uQWNjZXB0ZWQoCi0gICAgICAgIHN0YXRpY19jYXN0PEhUTUxJbnB1dEVsZW1lbnQq
PihtX3RleHRGaWVsZC5nZXQoKSkpOwotfQotCi1TdHJpbmcgQXV0b2NvbXBsZXRlUG9wdXBNZW51
Q2xpZW50OjppdGVtVGV4dCh1bnNpZ25lZCBsaXN0SW5kZXgpIGNvbnN0Ci17Ci0gICAgcmV0dXJu
IG1fc3VnZ2VzdGlvbnNbbGlzdEluZGV4XTsKLX0KLQotUG9wdXBNZW51U3R5bGUgQXV0b2NvbXBs
ZXRlUG9wdXBNZW51Q2xpZW50OjppdGVtU3R5bGUodW5zaWduZWQgbGlzdEluZGV4KSBjb25zdAot
ewotICAgIHJldHVybiAqbV9zdHlsZTsKLX0KLQotUG9wdXBNZW51U3R5bGUgQXV0b2NvbXBsZXRl
UG9wdXBNZW51Q2xpZW50OjptZW51U3R5bGUoKSBjb25zdAotewotICAgIHJldHVybiAqbV9zdHls
ZTsKLX0KLQotaW50IEF1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVudDo6Y2xpZW50UGFkZGluZ0xl
ZnQoKSBjb25zdAotewotICAgIC8vIEJ1ZyBodHRwOi8vY3JidWcuY29tLzc3MDggc2VlbXMgdG8g
aW5kaWNhdGUgdGhlIHN0eWxlIGNhbiBiZSAwLgotICAgIFJlbmRlclN0eWxlKiBzdHlsZSA9IHRl
eHRGaWVsZFN0eWxlKCk7Ci0gICAgcmV0dXJuIHN0eWxlID8gbV93ZWJWaWV3LT50aGVtZSgpLT5w
b3B1cEludGVybmFsUGFkZGluZ0xlZnQoc3R5bGUpIDogMDsKLX0KIAotaW50IEF1dG9jb21wbGV0
ZVBvcHVwTWVudUNsaWVudDo6Y2xpZW50UGFkZGluZ1JpZ2h0KCkgY29uc3QKLXsKLSAgICAvLyBC
dWcgaHR0cDovL2NyYnVnLmNvbS83NzA4IHNlZW1zIHRvIGluZGljYXRlIHRoZSBzdHlsZSBjYW4g
YmUgMC4KLSAgICBSZW5kZXJTdHlsZSogc3R5bGUgPSB0ZXh0RmllbGRTdHlsZSgpOwotICAgIHJl
dHVybiBzdHlsZSA/IG1fd2ViVmlldy0+dGhlbWUoKS0+cG9wdXBJbnRlcm5hbFBhZGRpbmdSaWdo
dChzdHlsZSkgOiAwOwotfQotCi12b2lkIEF1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVudDo6cG9w
dXBEaWRIaWRlKCkKLXsKLSAgICBtX3dlYlZpZXctPnN1Z2dlc3Rpb25zUG9wdXBEaWRIaWRlKCk7
Ci19Ci0KLXZvaWQgQXV0b2NvbXBsZXRlUG9wdXBNZW51Q2xpZW50OjpzZXRUZXh0RnJvbUl0ZW0o
dW5zaWduZWQgbGlzdEluZGV4KQotewotICAgIG1fdGV4dEZpZWxkLT5zZXRWYWx1ZShtX3N1Z2dl
c3Rpb25zW2xpc3RJbmRleF0pOwotfQotCi1Gb250U2VsZWN0b3IqIEF1dG9jb21wbGV0ZVBvcHVw
TWVudUNsaWVudDo6Zm9udFNlbGVjdG9yKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV90ZXh0Rmll
bGQtPmRvY3VtZW50KCktPnN0eWxlU2VsZWN0b3IoKS0+Zm9udFNlbGVjdG9yKCk7Ci19Ci0KLUhv
c3RXaW5kb3cqIEF1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVudDo6aG9zdFdpbmRvdygpIGNvbnN0
Ci17Ci0gICAgcmV0dXJuIG1fdGV4dEZpZWxkLT5kb2N1bWVudCgpLT52aWV3KCktPmhvc3RXaW5k
b3coKTsKLX0KKyAgICAvLyBUaGUgc3VnZ2VzdGlvbnMgbXVzdCBiZSBzZXQgYmVmb3JlIGluaXRp
YWxpemluZyB0aGUKKyAgICAvLyBTdWdnZXN0aW9uc1BvcHVwTWVudUNsaWVudC4KKyAgICBzZXRT
dWdnZXN0aW9ucyhzdWdnZXN0aW9ucyk7CiAKLVBhc3NSZWZQdHI8U2Nyb2xsYmFyPiBBdXRvY29t
cGxldGVQb3B1cE1lbnVDbGllbnQ6OmNyZWF0ZVNjcm9sbGJhcigKLSAgICBTY3JvbGxiYXJDbGll
bnQqIGNsaWVudCwKLSAgICBTY3JvbGxiYXJPcmllbnRhdGlvbiBvcmllbnRhdGlvbiwKLSAgICBT
Y3JvbGxiYXJDb250cm9sU2l6ZSBzaXplKQotewotICAgIHJldHVybiBTY3JvbGxiYXI6OmNyZWF0
ZU5hdGl2ZVNjcm9sbGJhcihjbGllbnQsIG9yaWVudGF0aW9uLCBzaXplKTsKKyAgICBTdWdnZXN0
aW9uc1BvcHVwTWVudUNsaWVudDo6aW5pdGlhbGl6ZSh0ZXh0RmllbGQsIGRlZmF1bHRTdWdnZXN0
aW9uSW5kZXgpOwogfQogCiB2b2lkIEF1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVudDo6c2V0U3Vn
Z2VzdGlvbnMoY29uc3QgV2ViVmVjdG9yPFdlYlN0cmluZz4mIHN1Z2dlc3Rpb25zKQpAQCAtMTUx
LDI4ICs3NSwxMCBAQCB2b2lkIEF1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVudDo6c2V0U3VnCiAg
ICAgbV9zdWdnZXN0aW9ucy5jbGVhcigpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc3Vn
Z2VzdGlvbnMuc2l6ZSgpOyArK2kpCiAgICAgICAgIG1fc3VnZ2VzdGlvbnMuYXBwZW5kKHN1Z2dl
c3Rpb25zW2ldKTsKLSAgICAvLyBUcnkgdG8gcHJlc2VydmUgc2VsZWN0aW9uIGlmIHBvc3NpYmxl
LgotICAgIGlmIChtX3NlbGVjdGVkSW5kZXggPj0gc3RhdGljX2Nhc3Q8aW50PihzdWdnZXN0aW9u
cy5zaXplKCkpKQotICAgICAgICBtX3NlbGVjdGVkSW5kZXggPSAtMTsKLX0KIAotdm9pZCBBdXRv
Y29tcGxldGVQb3B1cE1lbnVDbGllbnQ6OnJlbW92ZUl0ZW1BdEluZGV4KGludCBpbmRleCkKLXsK
LSAgICBBU1NFUlQoaW5kZXggPj0gMCAmJiBpbmRleCA8IHN0YXRpY19jYXN0PGludD4obV9zdWdn
ZXN0aW9ucy5zaXplKCkpKTsKLSAgICBtX3N1Z2dlc3Rpb25zLnJlbW92ZShpbmRleCk7Ci19Ci0K
LVJlbmRlclN0eWxlKiBBdXRvY29tcGxldGVQb3B1cE1lbnVDbGllbnQ6OnRleHRGaWVsZFN0eWxl
KCkgY29uc3QKLXsKLSAgICBSZW5kZXJTdHlsZSogc3R5bGUgPSBtX3RleHRGaWVsZC0+Y29tcHV0
ZWRTdHlsZSgpOwotICAgIGlmICghc3R5bGUpIHsKLSAgICAgICAgLy8gSXQgc2VlbXMgd2UgY2Fu
IG9ubHkgaGF2ZSBhIDAgc3R5bGUgaW4gYSBUZXh0RmllbGQgaWYgdGhlCi0gICAgICAgIC8vIG5v
ZGUgaXMgZGV0YWNoZWQsIGluIHdoaWNoIGNhc2Ugd2UgdGhlIHBvcHVwIHNob3VkIG5vdCBiZQot
ICAgICAgICAvLyBzaG93aW5nLiAgUGxlYXNlIHJlcG9ydCB0aGlzIGluIGh0dHA6Ly9jcmJ1Zy5j
b20vNzcwOCBhbmQKLSAgICAgICAgLy8gaW5jbHVkZSB0aGUgcGFnZSB5b3Ugd2VyZSB2aXNpdGlu
Zy4KLSAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Ci0gICAgfQotICAgIHJldHVybiBzdHls
ZTsKKyAgICAvLyBUcnkgdG8gcHJlc2VydmUgc2VsZWN0aW9uIGlmIHBvc3NpYmxlLgorICAgIGlm
IChnZXRTZWxlY3RlZEluZGV4KCkgPj0gc3RhdGljX2Nhc3Q8aW50PihzdWdnZXN0aW9ucy5zaXpl
KCkpKQorICAgICAgICBzZXRTZWxlY3RlZEluZGV4KC0xKTsKIH0KIAogfSAvLyBuYW1lc3BhY2Ug
V2ViS2l0CkluZGV4OiBXZWJLaXQvY2hyb21pdW0vc3JjL0F1dG9jb21wbGV0ZVBvcHVwTWVudUNs
aWVudC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdC9jaHJvbWl1bS9zcmMvQXV0b2NvbXBsZXRlUG9w
dXBNZW51Q2xpZW50LmgJKHJldmlzaW9uIDU0NTAxKQorKysgV2ViS2l0L2Nocm9taXVtL3NyYy9B
dXRvY29tcGxldGVQb3B1cE1lbnVDbGllbnQuaAkod29ya2luZyBjb3B5KQpAQCAtMSw1ICsxLDUg
QEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2Vy
dmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkg
Zm9ybXMsIHdpdGggb3Igd2l0aG91dAogICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHBy
b3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQpAQCAtMjgsNjkgKzI4LDM4
IEBACiAgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLgogICovCiAKLSNpbmNsdWRlICJQb3B1cE1lbnVDbGllbnQuaCIK
KyNpZm5kZWYgQXV0b2NvbXBsZXRlUG9wdXBNZW51Q2xpZW50X2gKKyNkZWZpbmUgQXV0b2NvbXBs
ZXRlUG9wdXBNZW51Q2xpZW50X2gKKyAKKyNpbmNsdWRlICJTdWdnZXN0aW9uc1BvcHVwTWVudUNs
aWVudC5oIgogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiBjbGFzcyBIVE1MSW5wdXRFbGVtZW50Owot
Y2xhc3MgUG9wdXBNZW51U3R5bGU7Ci1jbGFzcyBSZW5kZXJTdHlsZTsKIH0KIAogbmFtZXNwYWNl
IFdlYktpdCB7CiBjbGFzcyBXZWJTdHJpbmc7Ci1jbGFzcyBXZWJWaWV3SW1wbDsKIHRlbXBsYXRl
IDx0eXBlbmFtZSBUPiBjbGFzcyBXZWJWZWN0b3I7CiAKLS8vIEF1dG9jb21wbGV0ZVBvcHVwTWVu
dUNsaWVudAotY2xhc3MgQXV0b2NvbXBsZXRlUG9wdXBNZW51Q2xpZW50IDogcHVibGljIFdlYkNv
cmU6OlBvcHVwTWVudUNsaWVudCB7CisvLyBUaGUgQXV0b2NvbXBsZXRlIHN1Z2dlc3Rpb25zIHBv
cHVwIG1lbnUgY2xpZW50LCB1c2VkIHRvIGRpc3BsYXkgYSBsaXN0IG9mCisvLyBhdXRvY29tcGxl
dGUgc3VnZ2VzdGlvbnMuCitjbGFzcyBBdXRvY29tcGxldGVQb3B1cE1lbnVDbGllbnQgOiBwdWJs
aWMgU3VnZ2VzdGlvbnNQb3B1cE1lbnVDbGllbnQgewogcHVibGljOgotICAgIEF1dG9jb21wbGV0
ZVBvcHVwTWVudUNsaWVudChXZWJWaWV3SW1wbCogd2Vidmlldyk7Ci0gICAgfkF1dG9jb21wbGV0
ZVBvcHVwTWVudUNsaWVudCgpOworICAgIC8vIFN1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50IGlt
cGxlbWVudGF0aW9uOgorICAgIHZpcnR1YWwgdW5zaWduZWQgZ2V0U3VnZ2VzdGlvbnNDb3VudCgp
IGNvbnN0OworICAgIHZpcnR1YWwgV2ViU3RyaW5nIGdldFN1Z2dlc3Rpb24odW5zaWduZWQgbGlz
dEluZGV4KSBjb25zdDsKKyAgICB2aXJ0dWFsIHZvaWQgcmVtb3ZlU3VnZ2VzdGlvbkF0SW5kZXgo
dW5zaWduZWQgbGlzdEluZGV4KTsKIAogICAgIHZvaWQgaW5pdGlhbGl6ZShXZWJDb3JlOjpIVE1M
SW5wdXRFbGVtZW50KiwKICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2ViVmVjdG9yPFdlYlN0
cmluZz4mIHN1Z2dlc3Rpb25zLAogICAgICAgICAgICAgICAgICAgICBpbnQgZGVmYXVsdFN1Z2dl
c3Rpb25JbmRleCk7CiAKLSAgICBXZWJDb3JlOjpIVE1MSW5wdXRFbGVtZW50KiB0ZXh0RmllbGQo
KSBjb25zdCB7IHJldHVybiBtX3RleHRGaWVsZC5nZXQoKTsgfQotCiAgICAgdm9pZCBzZXRTdWdn
ZXN0aW9ucyhjb25zdCBXZWJWZWN0b3I8V2ViU3RyaW5nPiYpOwotICAgIHZvaWQgcmVtb3ZlSXRl
bUF0SW5kZXgoaW50IGluZGV4KTsKLQotICAgIC8vIFdlYkNvcmU6OlBvcHVwTWVudUNsaWVudCBt
ZXRob2RzOgotICAgIHZpcnR1YWwgdm9pZCB2YWx1ZUNoYW5nZWQodW5zaWduZWQgbGlzdEluZGV4
LCBib29sIGZpcmVFdmVudHMgPSB0cnVlKTsKLSAgICB2aXJ0dWFsIFdlYkNvcmU6OlN0cmluZyBp
dGVtVGV4dCh1bnNpZ25lZCBsaXN0SW5kZXgpIGNvbnN0OwotICAgIHZpcnR1YWwgV2ViQ29yZTo6
U3RyaW5nIGl0ZW1Ub29sVGlwKHVuc2lnbmVkIGxhc3RJbmRleCkgY29uc3QgeyByZXR1cm4gV2Vi
Q29yZTo6U3RyaW5nKCk7IH0KLSAgICB2aXJ0dWFsIGJvb2wgaXRlbUlzRW5hYmxlZCh1bnNpZ25l
ZCBsaXN0SW5kZXgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KLSAgICB2aXJ0dWFsIFdlYkNvcmU6
OlBvcHVwTWVudVN0eWxlIGl0ZW1TdHlsZSh1bnNpZ25lZCBsaXN0SW5kZXgpIGNvbnN0OwotICAg
IHZpcnR1YWwgV2ViQ29yZTo6UG9wdXBNZW51U3R5bGUgbWVudVN0eWxlKCkgY29uc3Q7Ci0gICAg
dmlydHVhbCBpbnQgY2xpZW50SW5zZXRMZWZ0KCkgY29uc3QgeyByZXR1cm4gMDsgfQotICAgIHZp
cnR1YWwgaW50IGNsaWVudEluc2V0UmlnaHQoKSBjb25zdCB7IHJldHVybiAwOyB9Ci0gICAgdmly
dHVhbCBpbnQgY2xpZW50UGFkZGluZ0xlZnQoKSBjb25zdDsKLSAgICB2aXJ0dWFsIGludCBjbGll
bnRQYWRkaW5nUmlnaHQoKSBjb25zdDsKLSAgICB2aXJ0dWFsIGludCBsaXN0U2l6ZSgpIGNvbnN0
IHsgcmV0dXJuIG1fc3VnZ2VzdGlvbnMuc2l6ZSgpOyB9Ci0gICAgdmlydHVhbCBpbnQgc2VsZWN0
ZWRJbmRleCgpIGNvbnN0IHsgcmV0dXJuIG1fc2VsZWN0ZWRJbmRleDsgfQotICAgIHZpcnR1YWwg
dm9pZCBwb3B1cERpZEhpZGUoKTsKLSAgICB2aXJ0dWFsIGJvb2wgaXRlbUlzU2VwYXJhdG9yKHVu
c2lnbmVkIGxpc3RJbmRleCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLSAgICB2aXJ0dWFsIGJv
b2wgaXRlbUlzTGFiZWwodW5zaWduZWQgbGlzdEluZGV4KSBjb25zdCB7IHJldHVybiBmYWxzZTsg
fQotICAgIHZpcnR1YWwgYm9vbCBpdGVtSXNTZWxlY3RlZCh1bnNpZ25lZCBsaXN0SW5kZXgpIGNv
bnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0gICAgdmlydHVhbCBib29sIHNob3VsZFBvcE92ZXIoKSBj
b25zdCB7IHJldHVybiBmYWxzZTsgfQotICAgIHZpcnR1YWwgYm9vbCB2YWx1ZVNob3VsZENoYW5n
ZU9uSG90VHJhY2soKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotICAgIHZpcnR1YWwgdm9pZCBz
ZXRUZXh0RnJvbUl0ZW0odW5zaWduZWQgbGlzdEluZGV4KTsKLSAgICB2aXJ0dWFsIFdlYkNvcmU6
OkZvbnRTZWxlY3RvciogZm9udFNlbGVjdG9yKCkgY29uc3Q7Ci0gICAgdmlydHVhbCBXZWJDb3Jl
OjpIb3N0V2luZG93KiBob3N0V2luZG93KCkgY29uc3Q7Ci0gICAgdmlydHVhbCBQYXNzUmVmUHRy
PFdlYkNvcmU6OlNjcm9sbGJhcj4gY3JlYXRlU2Nyb2xsYmFyKAotICAgICAgICBXZWJDb3JlOjpT
Y3JvbGxiYXJDbGllbnQqIGNsaWVudCwKLSAgICAgICAgV2ViQ29yZTo6U2Nyb2xsYmFyT3JpZW50
YXRpb24gb3JpZW50YXRpb24sCi0gICAgICAgIFdlYkNvcmU6OlNjcm9sbGJhckNvbnRyb2xTaXpl
IHNpemUpOwogCiBwcml2YXRlOgotICAgIFdlYkNvcmU6OlJlbmRlclN0eWxlKiB0ZXh0RmllbGRT
dHlsZSgpIGNvbnN0OwotCi0gICAgUmVmUHRyPFdlYkNvcmU6OkhUTUxJbnB1dEVsZW1lbnQ+IG1f
dGV4dEZpZWxkOwogICAgIFZlY3RvcjxXZWJDb3JlOjpTdHJpbmc+IG1fc3VnZ2VzdGlvbnM7Ci0g
ICAgaW50IG1fc2VsZWN0ZWRJbmRleDsKLSAgICBXZWJWaWV3SW1wbCogbV93ZWJWaWV3OwotICAg
IE93blB0cjxXZWJDb3JlOjpQb3B1cE1lbnVTdHlsZT4gbV9zdHlsZTsKIH07CiAKIH0gLy8gbmFt
ZXNwYWNlIFdlYktpdAorCisjZW5kaWYKSW5kZXg6IFdlYktpdC9jaHJvbWl1bS9zcmMvU3VnZ2Vz
dGlvbnNQb3B1cE1lbnVDbGllbnQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdC9jaHJvbWl1bS9z
cmMvU3VnZ2VzdGlvbnNQb3B1cE1lbnVDbGllbnQuY3BwCShyZXZpc2lvbiAwKQorKysgV2ViS2l0
L2Nocm9taXVtL3NyYy9TdWdnZXN0aW9uc1BvcHVwTWVudUNsaWVudC5jcHAJKHJldmlzaW9uIDAp
CkBAIC0wLDAgKzEsMjYyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMu
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJl
CisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11
c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJp
YnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHly
aWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMg
cHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhl
IG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9y
cyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9t
CisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNz
aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBI
T0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElN
UExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUg
SU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAq
IEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBU
SEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkg
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1Ig
Q09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8s
IFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNF
LAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9G
IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIlN1Z2dlc3Rp
b25zUG9wdXBNZW51Q2xpZW50LmgiCisKKyNpbmNsdWRlICJDU1NTdHlsZVNlbGVjdG9yLmgiCisj
aW5jbHVkZSAiQ1NTVmFsdWVLZXl3b3Jkcy5oIgorI2luY2x1ZGUgIkNocm9tZS5oIgorI2luY2x1
ZGUgIkZyYW1lVmlldy5oIgorI2luY2x1ZGUgIkhUTUxJbnB1dEVsZW1lbnQuaCIKKyNpbmNsdWRl
ICJSZW5kZXJUaGVtZS5oIgorI2luY2x1ZGUgIldlYlZpZXdJbXBsLmgiCisKK3VzaW5nIG5hbWVz
cGFjZSBXZWJDb3JlOworCituYW1lc3BhY2UgV2ViS2l0IHsKKworU3VnZ2VzdGlvbnNQb3B1cE1l
bnVDbGllbnQ6OlN1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50KCkKKyAgICA6IG1fdGV4dEZpZWxk
KDApCisgICAgLCBtX3NlbGVjdGVkSW5kZXgoMCkKK3sKK30KKworU3VnZ2VzdGlvbnNQb3B1cE1l
bnVDbGllbnQ6On5TdWdnZXN0aW9uc1BvcHVwTWVudUNsaWVudCgpCit7Cit9CisKKy8vIEZJWE1F
OiBJbXBsZW1lbnQgdGhpcyBwZXItZGVyaXZlZCBjbGFzcz8KK3ZvaWQgU3VnZ2VzdGlvbnNQb3B1
cE1lbnVDbGllbnQ6OnZhbHVlQ2hhbmdlZCh1bnNpZ25lZCBsaXN0SW5kZXgsIGJvb2wgZmlyZUV2
ZW50cykKK3sKKyAgICBtX3RleHRGaWVsZC0+c2V0VmFsdWUoZ2V0U3VnZ2VzdGlvbihsaXN0SW5k
ZXgpKTsKKworICAgIFdlYlZpZXdJbXBsKiB3ZWJWaWV3ID0gZ2V0V2ViVmlldygpOworICAgIGlm
ICghd2ViVmlldykKKyAgICAgIHJldHVybjsKKworICAgIEVkaXRvckNsaWVudEltcGwqIGVkaXRv
ciA9CisgICAgICAgIHN0YXRpY19jYXN0PEVkaXRvckNsaWVudEltcGwqPih3ZWJWaWV3LT5wYWdl
KCktPmVkaXRvckNsaWVudCgpKTsKKyAgICBBU1NFUlQoZWRpdG9yKTsKKyAgICBlZGl0b3ItPm9u
QXV0b2ZpbGxTdWdnZXN0aW9uQWNjZXB0ZWQoCisgICAgICAgIHN0YXRpY19jYXN0PEhUTUxJbnB1
dEVsZW1lbnQqPihtX3RleHRGaWVsZC5nZXQoKSkpOworfQorCit2b2lkIFN1Z2dlc3Rpb25zUG9w
dXBNZW51Q2xpZW50OjpzZWxlY3Rpb25DaGFuZ2VkKHVuc2lnbmVkIGxpc3RJbmRleCwgYm9vbCBm
aXJlRXZlbnRzKQoreworICAgIGlmIChsaXN0SW5kZXggIT0gc3RhdGljX2Nhc3Q8dW5zaWduZWQ+
KC0xKSkgeworICAgICAgICBjb25zdCBXZWJTdHJpbmcmIHN1Z2dlc3Rpb24gPSBnZXRTdWdnZXN0
aW9uKGxpc3RJbmRleCk7CisgICAgICAgIHNldFN1Z2dlc3RlZFZhbHVlKHN1Z2dlc3Rpb24pOwor
ICAgIH0gZWxzZSB7CisgICAgICAgIG1fdGV4dEZpZWxkLT5zZXRWYWx1ZShtX3R5cGVkRmllbGRW
YWx1ZSk7CisgICAgICAgIGlmIChtX2xhc3RGaWVsZFZhbHVlcy0+Y29udGFpbnMobV90ZXh0Rmll
bGQtPm5hbWUoKSkpCisgICAgICAgICAgICBtX2xhc3RGaWVsZFZhbHVlcy0+c2V0KG1fdGV4dEZp
ZWxkLT5uYW1lKCksIG1fdHlwZWRGaWVsZFZhbHVlKTsKKyAgICAgICAgZWxzZQorICAgICAgICAg
ICAgbV9sYXN0RmllbGRWYWx1ZXMtPmFkZChtX3RleHRGaWVsZC0+bmFtZSgpLCBtX3R5cGVkRmll
bGRWYWx1ZSk7CisgICAgfQorfQorCitTdHJpbmcgU3VnZ2VzdGlvbnNQb3B1cE1lbnVDbGllbnQ6
Oml0ZW1UZXh0KHVuc2lnbmVkIGxpc3RJbmRleCkgY29uc3QKK3sKKyAgICByZXR1cm4gZ2V0U3Vn
Z2VzdGlvbihsaXN0SW5kZXgpOworfQorCitQb3B1cE1lbnVTdHlsZSBTdWdnZXN0aW9uc1BvcHVw
TWVudUNsaWVudDo6aXRlbVN0eWxlKHVuc2lnbmVkIGxpc3RJbmRleCkgY29uc3QKK3sKKyAgICBy
ZXR1cm4gKm1fc3R5bGU7Cit9CisKK1BvcHVwTWVudVN0eWxlIFN1Z2dlc3Rpb25zUG9wdXBNZW51
Q2xpZW50OjptZW51U3R5bGUoKSBjb25zdAoreworICAgIHJldHVybiAqbV9zdHlsZTsKK30KKwor
aW50IFN1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50OjpjbGllbnRQYWRkaW5nTGVmdCgpIGNvbnN0
Cit7CisgICAgLy8gQnVnIGh0dHA6Ly9jcmJ1Zy5jb20vNzcwOCBzZWVtcyB0byBpbmRpY2F0ZSB0
aGUgc3R5bGUgY2FuIGJlIDAuCisgICAgUmVuZGVyU3R5bGUqIHN0eWxlID0gdGV4dEZpZWxkU3R5
bGUoKTsKKyAgICBpZiAoIXN0eWxlKQorICAgICAgIHJldHVybiAwOworCisgICAgcmV0dXJuIFJl
bmRlclRoZW1lOjpkZWZhdWx0VGhlbWUoKS0+cG9wdXBJbnRlcm5hbFBhZGRpbmdMZWZ0KHN0eWxl
KTsKK30KKworaW50IFN1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50OjpjbGllbnRQYWRkaW5nUmln
aHQoKSBjb25zdAoreworICAgIC8vIEJ1ZyBodHRwOi8vY3JidWcuY29tLzc3MDggc2VlbXMgdG8g
aW5kaWNhdGUgdGhlIHN0eWxlIGNhbiBiZSAwLgorICAgIFJlbmRlclN0eWxlKiBzdHlsZSA9IHRl
eHRGaWVsZFN0eWxlKCk7CisgICAgaWYgKCFzdHlsZSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAg
ICByZXR1cm4gUmVuZGVyVGhlbWU6OmRlZmF1bHRUaGVtZSgpLT5wb3B1cEludGVybmFsUGFkZGlu
Z1JpZ2h0KHN0eWxlKTsKK30KKwordm9pZCBTdWdnZXN0aW9uc1BvcHVwTWVudUNsaWVudDo6cG9w
dXBEaWRIaWRlKCkKK3sKKyAgICBtX3RleHRGaWVsZC0+c2V0VmFsdWUobV90eXBlZEZpZWxkVmFs
dWUpOworICAgIHJlc2V0TGFzdFN1Z2dlc3Rpb24oKTsKKyAgICBXZWJWaWV3SW1wbCogd2ViVmll
dyA9IGdldFdlYlZpZXcoKTsKKyAgICBpZiAod2ViVmlldykKKyAgICAgICAgd2ViVmlldy0+c3Vn
Z2VzdGlvbnNQb3B1cERpZEhpZGUoKTsKK30KKwordm9pZCBTdWdnZXN0aW9uc1BvcHVwTWVudUNs
aWVudDo6c2V0VGV4dEZyb21JdGVtKHVuc2lnbmVkIGxpc3RJbmRleCkKK3sKKyAgICBtX3RleHRG
aWVsZC0+c2V0VmFsdWUoZ2V0U3VnZ2VzdGlvbihsaXN0SW5kZXgpKTsKKyAgICByZXNldExhc3RT
dWdnZXN0aW9uKCk7Cit9CisKK3ZvaWQgU3VnZ2VzdGlvbnNQb3B1cE1lbnVDbGllbnQ6OnJlc2V0
TGFzdFN1Z2dlc3Rpb24oKQoreworICAgIGlmIChtX2xhc3RGaWVsZFZhbHVlcy0+Y29udGFpbnMo
bV90ZXh0RmllbGQtPm5hbWUoKSkpCisgICAgICAgIG1fbGFzdEZpZWxkVmFsdWVzLT5zZXQobV90
ZXh0RmllbGQtPm5hbWUoKSwgbV90ZXh0RmllbGQtPnZhbHVlKCkpOworICAgIGVsc2UKKyAgICAg
ICAgbV9sYXN0RmllbGRWYWx1ZXMtPmFkZChtX3RleHRGaWVsZC0+bmFtZSgpLCBtX3RleHRGaWVs
ZC0+dmFsdWUoKSk7Cit9CisKK0ZvbnRTZWxlY3RvciogU3VnZ2VzdGlvbnNQb3B1cE1lbnVDbGll
bnQ6OmZvbnRTZWxlY3RvcigpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fdGV4dEZpZWxkLT5kb2N1
bWVudCgpLT5zdHlsZVNlbGVjdG9yKCktPmZvbnRTZWxlY3RvcigpOworfQorCitIb3N0V2luZG93
KiBTdWdnZXN0aW9uc1BvcHVwTWVudUNsaWVudDo6aG9zdFdpbmRvdygpIGNvbnN0Cit7CisgICAg
cmV0dXJuIG1fdGV4dEZpZWxkLT5kb2N1bWVudCgpLT52aWV3KCktPmhvc3RXaW5kb3coKTsKK30K
KworUGFzc1JlZlB0cjxTY3JvbGxiYXI+IFN1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50OjpjcmVh
dGVTY3JvbGxiYXIoCisgICAgU2Nyb2xsYmFyQ2xpZW50KiBjbGllbnQsCisgICAgU2Nyb2xsYmFy
T3JpZW50YXRpb24gb3JpZW50YXRpb24sCisgICAgU2Nyb2xsYmFyQ29udHJvbFNpemUgc2l6ZSkK
K3sKKyAgICByZXR1cm4gU2Nyb2xsYmFyOjpjcmVhdGVOYXRpdmVTY3JvbGxiYXIoY2xpZW50LCBv
cmllbnRhdGlvbiwgc2l6ZSk7Cit9CisKK1JlbmRlclN0eWxlKiBTdWdnZXN0aW9uc1BvcHVwTWVu
dUNsaWVudDo6dGV4dEZpZWxkU3R5bGUoKSBjb25zdAoreworICAgIFJlbmRlclN0eWxlKiBzdHls
ZSA9IG1fdGV4dEZpZWxkLT5jb21wdXRlZFN0eWxlKCk7CisgICAgaWYgKCFzdHlsZSkgeworICAg
ICAgICAvLyBJdCBzZWVtcyB3ZSBjYW4gb25seSBoYXZlIGEgMCBzdHlsZSBpbiBhIFRleHRGaWVs
ZCBpZiB0aGUKKyAgICAgICAgLy8gbm9kZSBpcyBkZXRhY2hlZCwgaW4gd2hpY2ggY2FzZSB3ZSB0
aGUgcG9wdXAgc2hvdWQgbm90IGJlCisgICAgICAgIC8vIHNob3dpbmcuICBQbGVhc2UgcmVwb3J0
IHRoaXMgaW4gaHR0cDovL2NyYnVnLmNvbS83NzA4IGFuZAorICAgICAgICAvLyBpbmNsdWRlIHRo
ZSBwYWdlIHlvdSB3ZXJlIHZpc2l0aW5nLgorICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsK
KyAgICB9CisgICAgcmV0dXJuIHN0eWxlOworfQorCit2b2lkIFN1Z2dlc3Rpb25zUG9wdXBNZW51
Q2xpZW50Ojppbml0aWFsaXplKEhUTUxJbnB1dEVsZW1lbnQqIHRleHRGaWVsZCwKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlZmF1bHRTdWdnZXN0aW9u
SW5kZXgpCit7CisgICAgaWYgKCFtX2xhc3RGaWVsZFZhbHVlcykKKyAgICAgICAgbV9sYXN0Rmll
bGRWYWx1ZXMuc2V0KG5ldyBGaWVsZFZhbHVlc01hcCk7CisKKyAgICBtX3RleHRGaWVsZCA9IHRl
eHRGaWVsZDsKKyAgICBtX3R5cGVkRmllbGRWYWx1ZSA9IHRleHRGaWVsZC0+dmFsdWUoKTsKKyAg
ICBtX3NlbGVjdGVkSW5kZXggPSBkZWZhdWx0U3VnZ2VzdGlvbkluZGV4OworCisgICAgc2V0SW5p
dGlhbFN1Z2dlc3Rpb24oKTsKKworICAgIEZvbnREZXNjcmlwdGlvbiBmb250RGVzY3JpcHRpb247
CisgICAgUmVuZGVyVGhlbWU6OmRlZmF1bHRUaGVtZSgpLT5zeXN0ZW1Gb250KENTU1ZhbHVlV2Vi
a2l0Q29udHJvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
Zm9udERlc2NyaXB0aW9uKTsKKworICAgIC8vIFVzZSBhIHNtYWxsZXIgZm9udCBzaXplIHRvIG1h
dGNoIElFL0ZpcmVmb3guCisgICAgLy8gRklYTUU6IGh0dHA6Ly9jcmJ1Zy5jb20vNzM3NiB1c2Ug
dGhlIHN5c3RlbSBzaXplIGluc3RlYWQgb2YgYQorICAgIC8vICAgICAgICBmaXhlZCBmb250IHNp
emUgdmFsdWUuCisgICAgZm9udERlc2NyaXB0aW9uLnNldENvbXB1dGVkU2l6ZSgxMi4wKTsKKyAg
ICBGb250IGZvbnQoZm9udERlc2NyaXB0aW9uLCAwLCAwKTsKKyAgICBmb250LnVwZGF0ZSh0ZXh0
RmllbGQtPmRvY3VtZW50KCktPnN0eWxlU2VsZWN0b3IoKS0+Zm9udFNlbGVjdG9yKCkpOworICAg
IC8vIFRoZSBkaXJlY3Rpb24gb2YgdGV4dCBpbiBwb3B1cCBtZW51IGlzIHNldCB0aGUgc2FtZSBh
cyB0aGUgZGlyZWN0aW9uIG9mCisgICAgLy8gdGhlIGlucHV0IGVsZW1lbnQ6IHRleHRGaWVsZC4K
KyAgICBtX3N0eWxlLnNldChuZXcgUG9wdXBNZW51U3R5bGUoQ29sb3I6OmJsYWNrLCBDb2xvcjo6
d2hpdGUsIGZvbnQsIHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExl
bmd0aChXZWJDb3JlOjpGaXhlZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IHRleHRGaWVsZC0+cmVuZGVyZXIoKS0+c3R5bGUoKS0+ZGlyZWN0aW9uKCkpKTsKK30KKwordm9p
ZCBTdWdnZXN0aW9uc1BvcHVwTWVudUNsaWVudDo6c2V0SW5pdGlhbFN1Z2dlc3Rpb24oKQorewor
ICAgIGlmICghZ2V0U3VnZ2VzdGlvbnNDb3VudCgpIHx8ICFtX3RleHRGaWVsZC0+bmFtZSgpLmxl
bmd0aCgpIHx8ICFtX3R5cGVkRmllbGRWYWx1ZS5sZW5ndGgoKSkKKyAgICAgICAgcmV0dXJuOwor
CisgICAgaW50IG5ld0luZGV4ID0gbV9zZWxlY3RlZEluZGV4ID49IDAgPyBtX3NlbGVjdGVkSW5k
ZXggOiAwOworICAgIGNvbnN0IFN0cmluZyYgc3VnZ2VzdGlvbiA9IGdldFN1Z2dlc3Rpb24obmV3
SW5kZXgpOworICAgIGJvb2wgaGFzUHJldmlvdXNWYWx1ZSA9IG1fbGFzdEZpZWxkVmFsdWVzLT5j
b250YWlucyhtX3RleHRGaWVsZC0+bmFtZSgpKTsKKworICAgIFN0cmluZyBwcmV2VmFsdWU7Cisg
ICAgaWYgKGhhc1ByZXZpb3VzVmFsdWUpCisgICAgICAgIHByZXZWYWx1ZSA9IG1fbGFzdEZpZWxk
VmFsdWVzLT5nZXQobV90ZXh0RmllbGQtPm5hbWUoKSk7CisKKyAgICBpZiAoIWhhc1ByZXZpb3Vz
VmFsdWUgfHwgbV90eXBlZEZpZWxkVmFsdWUubGVuZ3RoKCkgPiBtX2xhc3RGaWVsZFZhbHVlcy0+
Z2V0KG1fdGV4dEZpZWxkLT5uYW1lKCkpLmxlbmd0aCgpKSB7CisgICAgICAgIGlmIChzdWdnZXN0
aW9uLnN0YXJ0c1dpdGgobV90eXBlZEZpZWxkVmFsdWUpKQorICAgICAgICAgICAgbV9zZWxlY3Rl
ZEluZGV4ID0gbmV3SW5kZXg7CisKKyAgICAgICAgaW50IHN0YXJ0ID0gMDsKKyAgICAgICAgU3Ry
aW5nIG5ld1N1Z2dlc3Rpb24gPSBzdWdnZXN0aW9uOworICAgICAgICBpZiAoc3VnZ2VzdGlvbi5z
dGFydHNXaXRoKG1fdHlwZWRGaWVsZFZhbHVlLCBmYWxzZSkpIHsKKyAgICAgICAgICAgIG5ld1N1
Z2dlc3Rpb24gPSBtX3R5cGVkRmllbGRWYWx1ZTsKKyAgICAgICAgICAgIGlmIChzdWdnZXN0aW9u
Lmxlbmd0aCgpID4gbV90eXBlZEZpZWxkVmFsdWUubGVuZ3RoKCkpIHsKKyAgICAgICAgICAgICAg
ICBuZXdTdWdnZXN0aW9uLmFwcGVuZChzdWdnZXN0aW9uLnN1YnN0cmluZyhtX3R5cGVkRmllbGRW
YWx1ZS5sZW5ndGgoKSwKKyAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGlvbi5sZW5ndGgoKSAt
IG1fdHlwZWRGaWVsZFZhbHVlLmxlbmd0aCgpKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAg
ICBzdGFydCA9IG1fdHlwZWRGaWVsZFZhbHVlLmxlbmd0aCgpOworICAgICAgICB9CisKKyAgICAg
ICAgbV90ZXh0RmllbGQtPnNldFN1Z2dlc3RlZFZhbHVlKG5ld1N1Z2dlc3Rpb24pOworICAgICAg
ICBtX3RleHRGaWVsZC0+c2V0U2VsZWN0aW9uUmFuZ2Uoc3RhcnQsIG5ld1N1Z2dlc3Rpb24ubGVu
Z3RoKCkpOworICAgIH0KKworICAgIGlmIChoYXNQcmV2aW91c1ZhbHVlKQorICAgICAgICBtX2xh
c3RGaWVsZFZhbHVlcy0+c2V0KG1fdGV4dEZpZWxkLT5uYW1lKCksIG1fdHlwZWRGaWVsZFZhbHVl
KTsKKyAgICBlbHNlCisgICAgICAgIG1fbGFzdEZpZWxkVmFsdWVzLT5hZGQobV90ZXh0RmllbGQt
Pm5hbWUoKSwgbV90eXBlZEZpZWxkVmFsdWUpOworfQorCit2b2lkIFN1Z2dlc3Rpb25zUG9wdXBN
ZW51Q2xpZW50OjpzZXRTdWdnZXN0ZWRWYWx1ZShjb25zdCBXZWJTdHJpbmcmIHN1Z2dlc3Rpb24p
Cit7CisgICAgbV90ZXh0RmllbGQtPnNldFN1Z2dlc3RlZFZhbHVlKHN1Z2dlc3Rpb24pOworICAg
IG1fdGV4dEZpZWxkLT5zZXRTZWxlY3Rpb25SYW5nZShtX3R5cGVkRmllbGRWYWx1ZS5sZW5ndGgo
KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGlvbi5sZW5ndGgo
KSk7Cit9CisKK1dlYlZpZXdJbXBsKiBTdWdnZXN0aW9uc1BvcHVwTWVudUNsaWVudDo6Z2V0V2Vi
VmlldygpIGNvbnN0Cit7CisgICAgRnJhbWUqIGZyYW1lID0gbV90ZXh0RmllbGQtPmRvY3VtZW50
KCktPmZyYW1lKCk7CisgICAgaWYgKCFmcmFtZSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBQ
YWdlKiBwYWdlID0gZnJhbWUtPnBhZ2UoKTsKKyAgICBpZiAoIXBhZ2UpCisgICAgICAgcmV0dXJu
IDA7CisKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Q2hyb21lQ2xpZW50SW1wbCo+KHBhZ2UtPmNo
cm9tZSgpLT5jbGllbnQoKSktPndlYlZpZXcoKTsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViS2l0
CkluZGV4OiBXZWJLaXQvY2hyb21pdW0vc3JjL1N1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50LmgK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gV2ViS2l0L2Nocm9taXVtL3NyYy9TdWdnZXN0aW9uc1BvcHVwTWVudUNs
aWVudC5oCShyZXZpc2lvbiAwKQorKysgV2ViS2l0L2Nocm9taXVtL3NyYy9TdWdnZXN0aW9uc1Bv
cHVwTWVudUNsaWVudC5oCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDExNyBAQAorLyoKKyAqIENv
cHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAq
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlz
dHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCBy
ZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRh
dGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmli
dXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUg
bmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBw
cm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNw
ZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElT
IFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAi
QVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElT
Q0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09O
VFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUws
CisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVE
SU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdP
T0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJV
U0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZ
IE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1Ig
VE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBB
TlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklT
RUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJQ
b3B1cE1lbnVDbGllbnQuaCIKKworI2lmbmRlZiBTdWdnZXN0aW9uc1BvcHVwTWVudUNsaWVudF9o
CisjZGVmaW5lIFN1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50X2gKKworbmFtZXNwYWNlIFdlYkNv
cmUgeworY2xhc3MgSFRNTElucHV0RWxlbWVudDsKK2NsYXNzIFBvcHVwTWVudVN0eWxlOworY2xh
c3MgUmVuZGVyU3R5bGU7Cit9CisKK25hbWVzcGFjZSBXZWJLaXQgeworY2xhc3MgV2ViU3RyaW5n
OworY2xhc3MgV2ViVmlld0ltcGw7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY2xhc3MgV2ViVmVj
dG9yOworCisvLyBUaGUgU3VnZ2VzdGlvbnMgcG9wdXAgbWVudSBjbGllbnQsIHVzZWQgdG8gZGlz
cGxheSBhIGxpc3Qgb2Ygc3VnZ2VzdGlvbnMuCitjbGFzcyBTdWdnZXN0aW9uc1BvcHVwTWVudUNs
aWVudCA6IHB1YmxpYyBXZWJDb3JlOjpQb3B1cE1lbnVDbGllbnQgeworcHVibGljOgorICAgIFN1
Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50KCk7CisgICAgdmlydHVhbCB+U3VnZ2VzdGlvbnNQb3B1
cE1lbnVDbGllbnQoKTsKKworICAgIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiBzdWdnZXN0aW9u
cyBhdmFpbGFibGUuCisgICAgdmlydHVhbCB1bnNpZ25lZCBnZXRTdWdnZXN0aW9uc0NvdW50KCkg
Y29uc3QgPSAwOworCisgICAgLy8gUmV0dXJucyB0aGUgc3VnZ2VzdGlvbiBhdCB8bGlzdEluZGV4
fC4KKyAgICB2aXJ0dWFsIFdlYlN0cmluZyBnZXRTdWdnZXN0aW9uKHVuc2lnbmVkIGxpc3RJbmRl
eCkgY29uc3QgPSAwOworCisgICAgLy8gUmVtb3ZlcyB0aGUgc3VnZ2VzdGlvbiBhdCB8bGlzdElu
ZGV4fCBmcm9tIHRoZSBsaXN0IG9mIHN1Z2dlc3Rpb25zLgorICAgIHZpcnR1YWwgdm9pZCByZW1v
dmVTdWdnZXN0aW9uQXRJbmRleCh1bnNpZ25lZCBsaXN0SW5kZXgpID0gMDsKKworICAgIC8vIFdl
YkNvcmU6OlBvcHVwTWVudUNsaWVudCBtZXRob2RzOgorICAgIHZpcnR1YWwgdm9pZCB2YWx1ZUNo
YW5nZWQodW5zaWduZWQgbGlzdEluZGV4LCBib29sIGZpcmVFdmVudHMgPSB0cnVlKTsKKyAgICB2
aXJ0dWFsIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZCh1bnNpZ25lZCBsaXN0SW5kZXgsIGJvb2wgZmly
ZUV2ZW50cyA9IHRydWUpOworICAgIHZpcnR1YWwgV2ViQ29yZTo6U3RyaW5nIGl0ZW1UZXh0KHVu
c2lnbmVkIGxpc3RJbmRleCkgY29uc3Q7CisgICAgdmlydHVhbCBXZWJDb3JlOjpTdHJpbmcgaXRl
bVRvb2xUaXAodW5zaWduZWQgbGFzdEluZGV4KSBjb25zdCB7IHJldHVybiBXZWJDb3JlOjpTdHJp
bmcoKTsgfQorICAgIHZpcnR1YWwgYm9vbCBpdGVtSXNFbmFibGVkKHVuc2lnbmVkIGxpc3RJbmRl
eCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQorICAgIHZpcnR1YWwgV2ViQ29yZTo6UG9wdXBNZW51
U3R5bGUgaXRlbVN0eWxlKHVuc2lnbmVkIGxpc3RJbmRleCkgY29uc3Q7CisgICAgdmlydHVhbCBX
ZWJDb3JlOjpQb3B1cE1lbnVTdHlsZSBtZW51U3R5bGUoKSBjb25zdDsKKyAgICB2aXJ0dWFsIGlu
dCBjbGllbnRJbnNldExlZnQoKSBjb25zdCB7IHJldHVybiAwOyB9CisgICAgdmlydHVhbCBpbnQg
Y2xpZW50SW5zZXRSaWdodCgpIGNvbnN0IHsgcmV0dXJuIDA7IH0KKyAgICB2aXJ0dWFsIGludCBj
bGllbnRQYWRkaW5nTGVmdCgpIGNvbnN0OworICAgIHZpcnR1YWwgaW50IGNsaWVudFBhZGRpbmdS
aWdodCgpIGNvbnN0OworICAgIHZpcnR1YWwgaW50IGxpc3RTaXplKCkgY29uc3QgeyByZXR1cm4g
Z2V0U3VnZ2VzdGlvbnNDb3VudCgpOyB9CisgICAgdmlydHVhbCBpbnQgc2VsZWN0ZWRJbmRleCgp
IGNvbnN0IHsgcmV0dXJuIG1fc2VsZWN0ZWRJbmRleDsgfQorICAgIHZpcnR1YWwgdm9pZCBwb3B1
cERpZEhpZGUoKTsKKyAgICB2aXJ0dWFsIGJvb2wgaXRlbUlzU2VwYXJhdG9yKHVuc2lnbmVkIGxp
c3RJbmRleCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgICB2aXJ0dWFsIGJvb2wgaXRlbUlz
TGFiZWwodW5zaWduZWQgbGlzdEluZGV4KSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorICAgIHZp
cnR1YWwgYm9vbCBpdGVtSXNTZWxlY3RlZCh1bnNpZ25lZCBsaXN0SW5kZXgpIGNvbnN0IHsgcmV0
dXJuIGZhbHNlOyB9CisgICAgdmlydHVhbCBib29sIHNob3VsZFBvcE92ZXIoKSBjb25zdCB7IHJl
dHVybiBmYWxzZTsgfQorICAgIHZpcnR1YWwgYm9vbCB2YWx1ZVNob3VsZENoYW5nZU9uSG90VHJh
Y2soKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorICAgIHZpcnR1YWwgdm9pZCBzZXRUZXh0RnJv
bUl0ZW0odW5zaWduZWQgbGlzdEluZGV4KTsKKyAgICB2aXJ0dWFsIFdlYkNvcmU6OkZvbnRTZWxl
Y3RvciogZm9udFNlbGVjdG9yKCkgY29uc3Q7CisgICAgdmlydHVhbCBXZWJDb3JlOjpIb3N0V2lu
ZG93KiBob3N0V2luZG93KCkgY29uc3Q7CisgICAgdmlydHVhbCBQYXNzUmVmUHRyPFdlYkNvcmU6
OlNjcm9sbGJhcj4gY3JlYXRlU2Nyb2xsYmFyKAorICAgICAgICBXZWJDb3JlOjpTY3JvbGxiYXJD
bGllbnQqIGNsaWVudCwKKyAgICAgICAgV2ViQ29yZTo6U2Nyb2xsYmFyT3JpZW50YXRpb24gb3Jp
ZW50YXRpb24sCisgICAgICAgIFdlYkNvcmU6OlNjcm9sbGJhckNvbnRyb2xTaXplIHNpemUpOwor
Citwcm90ZWN0ZWQ6CisgICAgdm9pZCBpbml0aWFsaXplKFdlYkNvcmU6OkhUTUxJbnB1dEVsZW1l
bnQqIHRleHRGaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgaW50IGRlZmF1bHRTdWdnZXN0aW9u
SW5kZXgpOworICAgIHZvaWQgc2V0SW5pdGlhbFN1Z2dlc3Rpb24oKTsKKworICAgIGludCBnZXRT
ZWxlY3RlZEluZGV4KCkgY29uc3QgeyByZXR1cm4gbV9zZWxlY3RlZEluZGV4OyB9CisgICAgdm9p
ZCBzZXRTZWxlY3RlZEluZGV4KGludCBpbmRleCkgeyBtX3NlbGVjdGVkSW5kZXggPSBpbmRleDsg
fQorCisgICAgdm9pZCBzZXRTdWdnZXN0ZWRWYWx1ZShjb25zdCBXZWJTdHJpbmcmIHN1Z2dlc3Rp
b24pOworCisgICAgV2ViVmlld0ltcGwqIGdldFdlYlZpZXcoKSBjb25zdDsKKyAgICBXZWJDb3Jl
OjpIVE1MSW5wdXRFbGVtZW50KiBnZXRUZXh0RmllbGQoKSBjb25zdCB7IHJldHVybiBtX3RleHRG
aWVsZC5nZXQoKTsgfQorCitwcml2YXRlOgorICAgIFdlYkNvcmU6OlJlbmRlclN0eWxlKiB0ZXh0
RmllbGRTdHlsZSgpIGNvbnN0OworICAgIHZvaWQgcmVzZXRMYXN0U3VnZ2VzdGlvbigpOworCisg
ICAgUmVmUHRyPFdlYkNvcmU6OkhUTUxJbnB1dEVsZW1lbnQ+IG1fdGV4dEZpZWxkOworICAgIGlu
dCBtX3NlbGVjdGVkSW5kZXg7CisgICAgV2ViQ29yZTo6U3RyaW5nIG1fdHlwZWRGaWVsZFZhbHVl
OworICAgIE93blB0cjxXZWJDb3JlOjpQb3B1cE1lbnVTdHlsZT4gbV9zdHlsZTsKKyAgICB0eXBl
ZGVmIEhhc2hNYXA8V2ViQ29yZTo6U3RyaW5nLCBXZWJDb3JlOjpTdHJpbmc+IEZpZWxkVmFsdWVz
TWFwOworICAgIE93blB0cjxGaWVsZFZhbHVlc01hcD4gbV9sYXN0RmllbGRWYWx1ZXM7Cit9Owor
Cit9IC8vIG5hbWVzcGFjZSBXZWJLaXQKKworI2VuZGlmCgpQcm9wZXJ0eSBjaGFuZ2VzIG9uOiBX
ZWJLaXQvY2hyb21pdW0vc3JjL1N1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50LmgKX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
XwpBZGRlZDogc3ZuOmVvbC1zdHlsZQogICArIExGCgpJbmRleDogV2ViS2l0L2Nocm9taXVtL3Ny
Yy9XZWJWaWV3SW1wbC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0L2Nocm9taXVtL3NyYy9XZWJW
aWV3SW1wbC5jcHAJKHJldmlzaW9uIDU0NTAxKQorKysgV2ViS2l0L2Nocm9taXVtL3NyYy9XZWJW
aWV3SW1wbC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTMxLDYgKzMxLDcgQEAKICNpbmNsdWRlICJj
b25maWcuaCIKICNpbmNsdWRlICJXZWJWaWV3SW1wbC5oIgogCisjaW5jbHVkZSAiQXV0b0ZpbGxQ
b3B1cE1lbnVDbGllbnQuaCIKICNpbmNsdWRlICJBdXRvY29tcGxldGVQb3B1cE1lbnVDbGllbnQu
aCIKICNpbmNsdWRlICJBWE9iamVjdENhY2hlLmgiCiAjaW5jbHVkZSAiQ2hyb21lLmgiCkBAIC0y
NDAsNiArMjQxLDggQEAgV2ViVmlld0ltcGw6OldlYlZpZXdJbXBsKFdlYlZpZXdDbGllbnQqIAog
ICAgICwgbV9vcGVyYXRpb25zQWxsb3dlZChXZWJEcmFnT3BlcmF0aW9uTm9uZSkKICAgICAsIG1f
ZHJhZ09wZXJhdGlvbihXZWJEcmFnT3BlcmF0aW9uTm9uZSkKICAgICAsIG1fc3VnZ2VzdGlvbnNQ
b3B1cFNob3dpbmcoZmFsc2UpCisgICAgLCBtX3N1Z2dlc3Rpb25zUG9wdXBDbGllbnQoMCkKKyAg
ICAsIG1fc3VnZ2VzdGlvbnNQb3B1cCgwKQogICAgICwgbV9pc1RyYW5zcGFyZW50KGZhbHNlKQog
ICAgICwgbV90YWJzVG9MaW5rcyhmYWxzZSkKIHsKQEAgLTQ2OCw3ICs0NzEsNyBAQCBib29sIFdl
YlZpZXdJbXBsOjprZXlFdmVudChjb25zdCBXZWJLZXliCiAgICAgLy8gZXZlbnQuCiAgICAgbV9z
dXBwcmVzc05leHRLZXlwcmVzc0V2ZW50ID0gZmFsc2U7CiAKLSAgICAvLyBHaXZlIGF1dG9jb21w
bGV0ZSBhIGNoYW5jZSB0byBjb25zdW1lIHRoZSBrZXkgZXZlbnRzIGl0IGlzIGludGVyZXN0ZWQg
aW4uCisgICAgLy8gR2l2ZSBBdXRvY29tcGxldGUgYSBjaGFuY2UgdG8gY29uc3VtZSB0aGUga2V5
IGV2ZW50cyBpdCBpcyBpbnRlcmVzdGVkIGluLgogICAgIGlmIChhdXRvY29tcGxldGVIYW5kbGVL
ZXlFdmVudChldmVudCkpCiAgICAgICAgIHJldHVybiB0cnVlOwogCkBAIC01NDEsNyArNTQ0LDcg
QEAgYm9vbCBXZWJWaWV3SW1wbDo6YXV0b2NvbXBsZXRlSGFuZGxlS2V5RQogICAgICAgICBtX2Ns
aWVudC0+cmVtb3ZlQXV0b2ZpbGxTdWdnZXN0aW9ucyhuYW1lLCB2YWx1ZSk7CiAgICAgICAgIC8v
IFVwZGF0ZSB0aGUgZW50cmllcyBpbiB0aGUgY3VycmVudGx5IHNob3dpbmcgcG9wdXAgdG8gcmVm
bGVjdCB0aGUKICAgICAgICAgLy8gZGVsZXRpb24uCi0gICAgICAgIG1fYXV0b2NvbXBsZXRlUG9w
dXBDbGllbnQtPnJlbW92ZUl0ZW1BdEluZGV4KHNlbGVjdGVkSW5kZXgpOworICAgICAgICBtX2F1
dG9jb21wbGV0ZVBvcHVwQ2xpZW50LT5yZW1vdmVTdWdnZXN0aW9uQXRJbmRleChzZWxlY3RlZElu
ZGV4KTsKICAgICAgICAgcmVmcmVzaFN1Z2dlc3Rpb25zUG9wdXAoKTsKICAgICAgICAgcmV0dXJu
IGZhbHNlOwogICAgIH0KQEAgLTE1NTgsNTggKzE1NjEsMTE4IEBAIHZvaWQgV2ViVmlld0ltcGw6
OmFwcGx5QXV0b2ZpbGxTdWdnZXN0aW8KICAgICBjb25zdCBXZWJWZWN0b3I8V2ViU3RyaW5nPiYg
c3VnZ2VzdGlvbnMsCiAgICAgaW50IGRlZmF1bHRTdWdnZXN0aW9uSW5kZXgpCiB7Ci0gICAgaWYg
KCFtX3BhZ2UuZ2V0KCkgfHwgc3VnZ2VzdGlvbnMuaXNFbXB0eSgpKSB7CisgICAgYXBwbHlBdXRv
Y29tcGxldGVTdWdnZXN0aW9ucyhub2RlLCBzdWdnZXN0aW9ucywgZGVmYXVsdFN1Z2dlc3Rpb25J
bmRleCk7Cit9CisKK3ZvaWQgV2ViVmlld0ltcGw6OmFwcGx5QXV0b0ZpbGxTdWdnZXN0aW9ucygK
KyAgICBjb25zdCBXZWJOb2RlJiBub2RlLAorICAgIGNvbnN0IFdlYlZlY3RvcjxXZWJTdHJpbmc+
JiBuYW1lcywKKyAgICBjb25zdCBXZWJWZWN0b3I8V2ViU3RyaW5nPiYgbGFiZWxzLAorICAgIGlu
dCBkZWZhdWx0U3VnZ2VzdGlvbkluZGV4KQoreworICAgIEFTU0VSVChuYW1lcy5zaXplKCkgPT0g
bGFiZWxzLnNpemUoKSk7CisgICAgQVNTRVJUKGRlZmF1bHRTdWdnZXN0aW9uSW5kZXggPCBzdGF0
aWNfY2FzdDxpbnQ+KG5hbWVzLnNpemUoKSkpOworCisgICAgaWYgKG5hbWVzLmlzRW1wdHkoKSkg
ewogICAgICAgICBoaWRlU3VnZ2VzdGlvbnNQb3B1cCgpOwogICAgICAgICByZXR1cm47CiAgICAg
fQogCisgICAgUmVmUHRyPE5vZGU+IGZvY3VzZWROb2RlID0gZm9jdXNlZFdlYkNvcmVOb2RlKCk7
CisgICAgLy8gSWYgdGhlIG5vZGUgZm9yIHdoaWNoIHdlIHF1ZXJpZWQgdGhlIEF1dG9GaWxsIHN1
Z2dlc3Rpb25zIGlzIG5vdCB0aGUKKyAgICAvLyBmb2N1c2VkIG5vZGUsIHRoZW4gd2UgaGF2ZSBu
b3RoaW5nIHRvIGRvLiAgRklYTUU6IGFsc28gY2hlY2sgdGhlCisgICAgLy8gY2FyZXQgaXMgYXQg
dGhlIGVuZCBhbmQgdGhhdCB0aGUgdGV4dCBoYXMgbm90IGNoYW5nZWQuCisgICAgaWYgKCFmb2N1
c2VkTm9kZSB8fCBmb2N1c2VkTm9kZSAhPSBQYXNzUmVmUHRyPE5vZGU+KG5vZGUpKSB7CisgICAg
ICAgIGhpZGVTdWdnZXN0aW9uc1BvcHVwKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAg
ICBIVE1MSW5wdXRFbGVtZW50KiBpbnB1dEVsZW0gPQorICAgICAgICBzdGF0aWNfY2FzdDxIVE1M
SW5wdXRFbGVtZW50Kj4oZm9jdXNlZE5vZGUuZ2V0KCkpOworCisgICAgLy8gVGhlIGZpcnN0IHRp
bWUgdGhlIEF1dG9GaWxsIHBvcHVwIGlzIHNob3duIHdlJ2xsIGNyZWF0ZSB0aGUgY2xpZW50IGFu
ZAorICAgIC8vIHRoZSBwb3B1cC4KKyAgICBpZiAoIW1fYXV0b0ZpbGxQb3B1cENsaWVudC5nZXQo
KSkKKyAgICAgICAgbV9hdXRvRmlsbFBvcHVwQ2xpZW50LnNldChuZXcgQXV0b0ZpbGxQb3B1cE1l
bnVDbGllbnQpOworCisgICAgbV9hdXRvRmlsbFBvcHVwQ2xpZW50LT5pbml0aWFsaXplKGlucHV0
RWxlbSwgbmFtZXMsIGxhYmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgZGVmYXVsdFN1Z2dlc3Rpb25JbmRleCk7CisKKyAgICBpZiAobV9zdWdnZXN0aW9uc1BvcHVw
Q2xpZW50ICE9IG1fYXV0b0ZpbGxQb3B1cENsaWVudC5nZXQoKSkgeworICAgICAgICBoaWRlU3Vn
Z2VzdGlvbnNQb3B1cCgpOworICAgICAgICBtX3N1Z2dlc3Rpb25zUG9wdXBDbGllbnQgPSBtX2F1
dG9GaWxsUG9wdXBDbGllbnQuZ2V0KCk7CisgICAgfQorCisgICAgaWYgKCFtX2F1dG9GaWxsUG9w
dXAuZ2V0KCkpIHsKKyAgICAgICAgbV9hdXRvRmlsbFBvcHVwID0gUG9wdXBDb250YWluZXI6OmNy
ZWF0ZShtX3N1Z2dlc3Rpb25zUG9wdXBDbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGlvbnNQb3B1cFNldHRpbmdzKTsKKyAgICB9
CisKKyAgICBpZiAobV9zdWdnZXN0aW9uc1BvcHVwICE9IG1fYXV0b0ZpbGxQb3B1cC5nZXQoKSkK
KyAgICAgICAgbV9zdWdnZXN0aW9uc1BvcHVwID0gbV9hdXRvRmlsbFBvcHVwLmdldCgpOworCisg
ICAgaWYgKG1fc3VnZ2VzdGlvbnNQb3B1cFNob3dpbmcpIHsKKyAgICAgICAgbV9hdXRvRmlsbFBv
cHVwQ2xpZW50LT5zZXRTdWdnZXN0aW9ucyhuYW1lcywgbGFiZWxzKTsKKyAgICAgICAgcmVmcmVz
aFN1Z2dlc3Rpb25zUG9wdXAoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtX3N1Z2dlc3Rpb25z
UG9wdXAtPnNob3coZm9jdXNlZE5vZGUtPmdldFJlY3QoKSwKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGZvY3VzZWROb2RlLT5vd25lckRvY3VtZW50KCktPnZpZXcoKSwgMCk7Cisg
ICAgICAgIG1fc3VnZ2VzdGlvbnNQb3B1cFNob3dpbmcgPSB0cnVlOworICAgIH0KK30KKwordm9p
ZCBXZWJWaWV3SW1wbDo6YXBwbHlBdXRvY29tcGxldGVTdWdnZXN0aW9ucygKKyAgICBjb25zdCBX
ZWJOb2RlJiBub2RlLAorICAgIGNvbnN0IFdlYlZlY3RvcjxXZWJTdHJpbmc+JiBzdWdnZXN0aW9u
cywKKyAgICBpbnQgZGVmYXVsdFN1Z2dlc3Rpb25JbmRleCkKK3sKICAgICBBU1NFUlQoZGVmYXVs
dFN1Z2dlc3Rpb25JbmRleCA8IHN0YXRpY19jYXN0PGludD4oc3VnZ2VzdGlvbnMuc2l6ZSgpKSk7
CiAKLSAgICBpZiAoUmVmUHRyPEZyYW1lPiBmb2N1c2VkID0gbV9wYWdlLT5mb2N1c0NvbnRyb2xs
ZXIoKS0+Zm9jdXNlZEZyYW1lKCkpIHsKLSAgICAgICAgUmVmUHRyPERvY3VtZW50PiBkb2N1bWVu
dCA9IGZvY3VzZWQtPmRvY3VtZW50KCk7Ci0gICAgICAgIGlmICghZG9jdW1lbnQuZ2V0KCkpIHsK
LSAgICAgICAgICAgIGhpZGVTdWdnZXN0aW9uc1BvcHVwKCk7Ci0gICAgICAgICAgICByZXR1cm47
Ci0gICAgICAgIH0KKyAgICBpZiAoIW1fcGFnZS5nZXQoKSB8fCBzdWdnZXN0aW9ucy5pc0VtcHR5
KCkpIHsKKyAgICAgICAgaGlkZVN1Z2dlc3Rpb25zUG9wdXAoKTsKKyAgICAgICAgcmV0dXJuOwor
ICAgIH0KIAotICAgICAgICBSZWZQdHI8Tm9kZT4gZm9jdXNlZE5vZGUgPSBkb2N1bWVudC0+Zm9j
dXNlZE5vZGUoKTsKLSAgICAgICAgLy8gSWYgdGhlIG5vZGUgZm9yIHdoaWNoIHdlIHF1ZXJpZWQg
dGhlIGF1dG9maWxsIHN1Z2dlc3Rpb25zIGlzIG5vdCB0aGUKLSAgICAgICAgLy8gZm9jdXNlZCBu
b2RlLCB0aGVuIHdlIGhhdmUgbm90aGluZyB0byBkby4gIEZJWE1FOiBhbHNvIGNoZWNrIHRoZQot
ICAgICAgICAvLyBjYXJyZXQgaXMgYXQgdGhlIGVuZCBhbmQgdGhhdCB0aGUgdGV4dCBoYXMgbm90
IGNoYW5nZWQuCi0gICAgICAgIGlmICghZm9jdXNlZE5vZGUuZ2V0KCkgfHwgZm9jdXNlZE5vZGUg
IT0gUGFzc1JlZlB0cjxOb2RlPihub2RlKSkgewotICAgICAgICAgICAgaGlkZVN1Z2dlc3Rpb25z
UG9wdXAoKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQorICAgIFJlZlB0cjxOb2Rl
PiBmb2N1c2VkTm9kZSA9IGZvY3VzZWRXZWJDb3JlTm9kZSgpOworICAgIC8vIElmIHRoZSBub2Rl
IGZvciB3aGljaCB3ZSBxdWVyaWVkIHRoZSBBdXRvY29tcGxldGUgc3VnZ2VzdGlvbnMgaXMgbm90
IHRoZQorICAgIC8vIGZvY3VzZWQgbm9kZSwgdGhlbiB3ZSBoYXZlIG5vdGhpbmcgdG8gZG8uICBG
SVhNRTogYWxzbyBjaGVjayB0aGUKKyAgICAvLyBjYXJldCBpcyBhdCB0aGUgZW5kIGFuZCB0aGF0
IHRoZSB0ZXh0IGhhcyBub3QgY2hhbmdlZC4KKyAgICBpZiAoIWZvY3VzZWROb2RlIHx8IGZvY3Vz
ZWROb2RlICE9IFBhc3NSZWZQdHI8Tm9kZT4obm9kZSkpIHsKKyAgICAgICAgaGlkZVN1Z2dlc3Rp
b25zUG9wdXAoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KIAotICAgICAgICBpZiAoIWZvY3Vz
ZWROb2RlLT5oYXNUYWdOYW1lKEhUTUxOYW1lczo6aW5wdXRUYWcpKSB7Ci0gICAgICAgICAgICBB
U1NFUlRfTk9UX1JFQUNIRUQoKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQorICAg
IEhUTUxJbnB1dEVsZW1lbnQqIGlucHV0RWxlbSA9CisgICAgICAgIHN0YXRpY19jYXN0PEhUTUxJ
bnB1dEVsZW1lbnQqPihmb2N1c2VkTm9kZS5nZXQoKSk7CiAKLSAgICAgICAgSFRNTElucHV0RWxl
bWVudCogaW5wdXRFbGVtID0KLSAgICAgICAgICAgIHN0YXRpY19jYXN0PEhUTUxJbnB1dEVsZW1l
bnQqPihmb2N1c2VkTm9kZS5nZXQoKSk7CisgICAgLy8gVGhlIGZpcnN0IHRpbWUgdGhlIEF1dG9j
b21wbGV0ZSBpcyBzaG93biB3ZSdsbCBjcmVhdGUgdGhlIGNsaWVudCBhbmQgdGhlCisgICAgLy8g
cG9wdXAuCisgICAgaWYgKCFtX2F1dG9jb21wbGV0ZVBvcHVwQ2xpZW50LmdldCgpKQorICAgICAg
ICBtX2F1dG9jb21wbGV0ZVBvcHVwQ2xpZW50LnNldChuZXcgQXV0b2NvbXBsZXRlUG9wdXBNZW51
Q2xpZW50KTsKIAotICAgICAgICAvLyBUaGUgZmlyc3QgdGltZSB0aGUgc3VnZ2VzdGlvbnMgcG9w
dXAgaXMgc2hvd24gd2UnbGwgY3JlYXRlIHRoZSBjbGllbnQKLSAgICAgICAgLy8gYW5kIHRoZSBw
b3B1cC4KLSAgICAgICAgaWYgKCFtX2F1dG9jb21wbGV0ZVBvcHVwQ2xpZW50LmdldCgpKQotICAg
ICAgICAgICAgbV9hdXRvY29tcGxldGVQb3B1cENsaWVudC5zZXQobmV3IEF1dG9jb21wbGV0ZVBv
cHVwTWVudUNsaWVudCh0aGlzKSk7Ci0gICAgICAgIG1fYXV0b2NvbXBsZXRlUG9wdXBDbGllbnQt
PmluaXRpYWxpemUoaW5wdXRFbGVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIHN1Z2dlc3Rpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGRlZmF1bHRTdWdnZXN0aW9uSW5kZXgpOwotICAgICAgICBpZiAoIW1f
c3VnZ2VzdGlvbnNQb3B1cC5nZXQoKSkgewotICAgICAgICAgICAgbV9zdWdnZXN0aW9uc1BvcHVw
ID0KLSAgICAgICAgICAgICAgICBQb3B1cENvbnRhaW5lcjo6Y3JlYXRlKG1fYXV0b2NvbXBsZXRl
UG9wdXBDbGllbnQuZ2V0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBzdWdnZXN0aW9uc1BvcHVwU2V0dGluZ3MpOwotICAgICAgICB9CisgICAgbV9hdXRvY29tcGxl
dGVQb3B1cENsaWVudC0+aW5pdGlhbGl6ZShpbnB1dEVsZW0sIHN1Z2dlc3Rpb25zLAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFN1Z2dlc3Rpb25JbmRl
eCk7CiAKLSAgICAgICAgaWYgKG1fc3VnZ2VzdGlvbnNQb3B1cFNob3dpbmcpIHsKLSAgICAgICAg
ICAgIG1fYXV0b2NvbXBsZXRlUG9wdXBDbGllbnQtPnNldFN1Z2dlc3Rpb25zKHN1Z2dlc3Rpb25z
KTsKLSAgICAgICAgICAgIHJlZnJlc2hTdWdnZXN0aW9uc1BvcHVwKCk7Ci0gICAgICAgIH0gZWxz
ZSB7Ci0gICAgICAgICAgICBtX3N1Z2dlc3Rpb25zUG9wdXAtPnNob3coZm9jdXNlZE5vZGUtPmdl
dFJlY3QoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb2N1c2VkTm9k
ZS0+b3duZXJEb2N1bWVudCgpLT52aWV3KCksIDApOwotICAgICAgICAgICAgbV9zdWdnZXN0aW9u
c1BvcHVwU2hvd2luZyA9IHRydWU7Ci0gICAgICAgIH0KKyAgICBpZiAobV9zdWdnZXN0aW9uc1Bv
cHVwQ2xpZW50ICE9IG1fYXV0b2NvbXBsZXRlUG9wdXBDbGllbnQuZ2V0KCkpIHsKKyAgICAgICAg
aGlkZVN1Z2dlc3Rpb25zUG9wdXAoKTsKKyAgICAgICAgbV9zdWdnZXN0aW9uc1BvcHVwQ2xpZW50
ID0gbV9hdXRvY29tcGxldGVQb3B1cENsaWVudC5nZXQoKTsKKyAgICB9CisKKyAgICBpZiAoIW1f
YXV0b2NvbXBsZXRlUG9wdXAuZ2V0KCkpIHsKKyAgICAgICAgbV9hdXRvY29tcGxldGVQb3B1cCA9
IFBvcHVwQ29udGFpbmVyOjpjcmVhdGUobV9zdWdnZXN0aW9uc1BvcHVwQ2xpZW50LAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWdnZXN0aW9u
c1BvcHVwU2V0dGluZ3MpOworICAgIH0KKworICAgIGlmIChtX3N1Z2dlc3Rpb25zUG9wdXAgIT0g
bV9hdXRvY29tcGxldGVQb3B1cC5nZXQoKSkKKyAgICAgICAgbV9zdWdnZXN0aW9uc1BvcHVwID0g
bV9hdXRvY29tcGxldGVQb3B1cC5nZXQoKTsKKworICAgIGlmIChtX3N1Z2dlc3Rpb25zUG9wdXBT
aG93aW5nKSB7CisgICAgICAgIG1fYXV0b2NvbXBsZXRlUG9wdXBDbGllbnQtPnNldFN1Z2dlc3Rp
b25zKHN1Z2dlc3Rpb25zKTsKKyAgICAgICAgcmVmcmVzaFN1Z2dlc3Rpb25zUG9wdXAoKTsKKyAg
ICB9IGVsc2UgeworICAgICAgICBtX3N1Z2dlc3Rpb25zUG9wdXAtPnNob3coZm9jdXNlZE5vZGUt
PmdldFJlY3QoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvY3VzZWROb2Rl
LT5vd25lckRvY3VtZW50KCktPnZpZXcoKSwgMCk7CisgICAgICAgIG1fc3VnZ2VzdGlvbnNQb3B1
cFNob3dpbmcgPSB0cnVlOwogICAgIH0KIH0KIApJbmRleDogV2ViS2l0L2Nocm9taXVtL3NyYy9X
ZWJWaWV3SW1wbC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdC9jaHJvbWl1bS9zcmMvV2ViVmlld0lt
cGwuaAkocmV2aXNpb24gNTQ1MDEpCisrKyBXZWJLaXQvY2hyb21pdW0vc3JjL1dlYlZpZXdJbXBs
LmgJKHdvcmtpbmcgY29weSkKQEAgLTU4LDYgKzU4LDcgQEAgY2xhc3MgS2V5Ym9hcmRFdmVudDsK
IGNsYXNzIFBhZ2U7CiBjbGFzcyBQbGF0Zm9ybUtleWJvYXJkRXZlbnQ7CiBjbGFzcyBQb3B1cENv
bnRhaW5lcjsKK2NsYXNzIFBvcHVwTWVudUNsaWVudDsKIGNsYXNzIFJhbmdlOwogY2xhc3MgUmVu
ZGVyVGhlbWU7CiBjbGFzcyBXaWRnZXQ7CkBAIC02NSw3ICs2Niw5IEBAIGNsYXNzIFdpZGdldDsK
IAogbmFtZXNwYWNlIFdlYktpdCB7CiBjbGFzcyBBdXRvY29tcGxldGVQb3B1cE1lbnVDbGllbnQ7
CitjbGFzcyBBdXRvRmlsbFBvcHVwTWVudUNsaWVudDsKIGNsYXNzIENvbnRleHRNZW51Q2xpZW50
SW1wbDsKK2NsYXNzIFN1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50OwogY2xhc3MgV2ViQWNjZXNz
aWJpbGl0eU9iamVjdDsKIGNsYXNzIFdlYkRldlRvb2xzQWdlbnRQcml2YXRlOwogY2xhc3MgV2Vi
RnJhbWVJbXBsOwpAQCAtMTUzLDYgKzE1NiwxNSBAQCBwdWJsaWM6CiAgICAgICAgIGNvbnN0IFdl
Yk5vZGUmLAogICAgICAgICBjb25zdCBXZWJWZWN0b3I8V2ViU3RyaW5nPiYgc3VnZ2VzdGlvbnMs
CiAgICAgICAgIGludCBkZWZhdWx0U3VnZ2VzdGlvbkluZGV4KTsKKyAgICB2aXJ0dWFsIHZvaWQg
YXBwbHlBdXRvRmlsbFN1Z2dlc3Rpb25zKAorICAgICAgICBjb25zdCBXZWJOb2RlJiwKKyAgICAg
ICAgY29uc3QgV2ViVmVjdG9yPFdlYlN0cmluZz4mIG5hbWVzLAorICAgICAgICBjb25zdCBXZWJW
ZWN0b3I8V2ViU3RyaW5nPiYgbGFiZWxzLAorICAgICAgICBpbnQgZGVmYXVsdFN1Z2dlc3Rpb25J
bmRleCk7CisgICAgdmlydHVhbCB2b2lkIGFwcGx5QXV0b2NvbXBsZXRlU3VnZ2VzdGlvbnMoCisg
ICAgICAgIGNvbnN0IFdlYk5vZGUmLAorICAgICAgICBjb25zdCBXZWJWZWN0b3I8V2ViU3RyaW5n
PiYgc3VnZ2VzdGlvbnMsCisgICAgICAgIGludCBkZWZhdWx0U3VnZ2VzdGlvbkluZGV4KTsKICAg
ICB2aXJ0dWFsIHZvaWQgaGlkZUF1dG9maWxsUG9wdXAoKTsKICAgICB2aXJ0dWFsIHZvaWQgaGlk
ZVN1Z2dlc3Rpb25zUG9wdXAoKTsKICAgICB2aXJ0dWFsIHZvaWQgc2V0U2Nyb2xsYmFyQ29sb3Jz
KHVuc2lnbmVkIGluYWN0aXZlQ29sb3IsCkBAIC0zOTUsMTYgKzQwNywyOSBAQCBwcml2YXRlOgog
ICAgIC8vIGN1cnJlbnQgZHJvcCB0YXJnZXQgaW4gdGhpcyBXZWJWaWV3ICh0aGUgZHJvcCB0YXJn
ZXQgY2FuIGFjY2VwdCB0aGUgZHJvcCkuCiAgICAgV2ViRHJhZ09wZXJhdGlvbiBtX2RyYWdPcGVy
YXRpb247CiAKLSAgICAvLyBUaGUgc3VnZ2VzdGlvbnMgcG9wdXAuICBLZXB0IGFyb3VuZCBhbmQg
cmV1c2VkIGV2ZXJ5LXRpbWUgbmV3IHN1Z2dlc3Rpb25zCi0gICAgLy8gc2hvdWxkIGJlIHNob3du
LgotICAgIFJlZlB0cjxXZWJDb3JlOjpQb3B1cENvbnRhaW5lcj4gbV9zdWdnZXN0aW9uc1BvcHVw
OwotCi0gICAgLy8gV2hldGhlciB0aGUgc3VnZ2VzdGlvbnMgcG9wdXAgaXMgY3VycmVudGx5IHNo
b3dpbmcuCisgICAgLy8gV2hldGhlciBhIHN1Z2dlc3Rpb25zIHBvcHVwIGlzIGN1cnJlbnRseSBz
aG93aW5nLgogICAgIGJvb2wgbV9zdWdnZXN0aW9uc1BvcHVwU2hvd2luZzsKIAotICAgIC8vIFRo
ZSBhdXRvY29tcGxldGUgY2xpZW50LgorICAgIC8vIEEgcG9pbnRlciB0byB0aGUgY3VycmVudCBz
dWdnZXN0aW9ucyBwb3B1cCBtZW51IGNsaWVudC4gIFRoaXMgY2FuIGJlCisgICAgLy8gZWl0aGVy
IGFuIEF1dG9GaWxsUG9wdXBNZW51Q2xpZW50IG9yIGFuIEF1dG9jb21wbGV0ZVBvcHVwTWVudUNs
aWVudC4gIFdlCisgICAgLy8gZG8gbm90IG93biB0aGlzIHBvaW50ZXIuCisgICAgU3VnZ2VzdGlv
bnNQb3B1cE1lbnVDbGllbnQqIG1fc3VnZ2VzdGlvbnNQb3B1cENsaWVudDsKKworICAgIC8vIFRo
ZSBBdXRvRmlsbCBwb3B1cCBjbGllbnQuCisgICAgT3duUHRyPEF1dG9GaWxsUG9wdXBNZW51Q2xp
ZW50PiBtX2F1dG9GaWxsUG9wdXBDbGllbnQ7CisKKyAgICAvLyBUaGUgQXV0b2NvbXBsZXRlIHBv
cHVwIGNsaWVudC4KICAgICBPd25QdHI8QXV0b2NvbXBsZXRlUG9wdXBNZW51Q2xpZW50PiBtX2F1
dG9jb21wbGV0ZVBvcHVwQ2xpZW50OwogCisgICAgLy8gQSBwb2ludGVyIHRvIHRoZSBjdXJyZW50
IHN1Z2dlc3Rpb25zIHBvcHVwLiAgV2UgZG8gbm90IG93biB0aGlzIHBvaW50ZXIuCisgICAgV2Vi
Q29yZTo6UG9wdXBDb250YWluZXIqIG1fc3VnZ2VzdGlvbnNQb3B1cDsKKworICAgIC8vIFRoZSBB
dXRvRmlsbCBzdWdnZXN0aW9ucyBwb3B1cC4KKyAgICBSZWZQdHI8V2ViQ29yZTo6UG9wdXBDb250
YWluZXI+IG1fYXV0b0ZpbGxQb3B1cDsKKworICAgIC8vIFRoZSBBdXRvQ29tcGxldGUgc3VnZ2Vz
dGlvbnMgcG9wdXAuCisgICAgUmVmUHRyPFdlYkNvcmU6OlBvcHVwQ29udGFpbmVyPiBtX2F1dG9j
b21wbGV0ZVBvcHVwOworCiAgICAgT3duUHRyPFdlYkRldlRvb2xzQWdlbnRQcml2YXRlPiBtX2Rl
dlRvb2xzQWdlbnQ7CiAKICAgICAvLyBXaGV0aGVyIHRoZSB3ZWJ2aWV3IGlzIHJlbmRlcmluZyB0
cmFuc3BhcmVudGx5Lgo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>48450</attachid>
            <date>2010-02-09 15:52:43 -0800</date>
            <delta_ts>2010-02-09 15:54:26 -0800</delta_ts>
            <desc>[Chromium] Refactor AutocompletePopupMenuClient [try8]</desc>
            <filename>refactor8.diff</filename>
            <type>text/plain</type>
            <size>47155</size>
            <attacher name="James Hawkins">jhawkins</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYktpdC9jaHJvbWl1bS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0L2No
cm9taXVtL0NoYW5nZUxvZwkocmV2aXNpb24gNTQ1NjgpCisrKyBXZWJLaXQvY2hyb21pdW0vQ2hh
bmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMzYgQEAKKzIwMTAtMDItMDkgIEphbWVz
IEhhd2tpbnMgIDxqaGF3a2luc0BjaHJvbWl1bS5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkg
Tk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgW0Nocm9taXVtXSBSZWZhY3RvciBBdXRvY29tcGxl
dGVQb3B1cE1lbnVDbGllbnQgaW50byBhIGJhc2UgY2xhc3MsCisgICAgICAgIFN1Z2dlc3Rpb25z
UG9wdXBNZW51Q2xpZW50LCBhbmQgdHdvIGRlcml2ZWQgY2xhc3NlcywKKyAgICAgICAgQXV0b2Nv
bXBsZXRlUG9wdXBNZW51Q2xpZW50IGFuZCBBdXRvRmlsbFBvcHVwTWVudUNsaWVudC4gIEN1cnJl
bnRseQorICAgICAgICB0aGUgYmVoYXZpb3Igb2Ygc3VnZ2VzdGlvbnMgcG9wdXBzIGhhcyBub3Qg
Y2hhbmdlZC4KKworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/
aWQ9MzQ3MjEKKworICAgICAgICAqIFdlYktpdC5neXA6CisgICAgICAgICogcHVibGljL1dlYlZp
ZXcuaDoKKyAgICAgICAgKiBzcmMvQXV0b0ZpbGxQb3B1cE1lbnVDbGllbnQuY3BwOiBBZGRlZC4K
KyAgICAgICAgKiBzcmMvQXV0b0ZpbGxQb3B1cE1lbnVDbGllbnQuaDogQWRkZWQuCisgICAgICAg
ICogc3JjL0F1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVudC5jcHA6CisgICAgICAgIChXZWJLaXQ6
OkF1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVudDo6Z2V0U3VnZ2VzdGlvbnNDb3VudCk6CisgICAg
ICAgIChXZWJLaXQ6OkF1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVudDo6Z2V0U3VnZ2VzdGlvbik6
CisgICAgICAgIChXZWJLaXQ6OkF1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVudDo6cmVtb3ZlU3Vn
Z2VzdGlvbkF0SW5kZXgpOgorICAgICAgICAoV2ViS2l0OjpBdXRvY29tcGxldGVQb3B1cE1lbnVD
bGllbnQ6OmluaXRpYWxpemUpOgorICAgICAgICAoV2ViS2l0OjpBdXRvY29tcGxldGVQb3B1cE1l
bnVDbGllbnQ6OnNldFN1Z2dlc3Rpb25zKToKKyAgICAgICAgKiBzcmMvQXV0b2NvbXBsZXRlUG9w
dXBNZW51Q2xpZW50Lmg6CisgICAgICAgICogc3JjL1N1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50
LmNwcDogQWRkZWQuCisgICAgICAgICogc3JjL1N1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50Lmg6
IEFkZGVkLgorICAgICAgICAqIHNyYy9XZWJWaWV3SW1wbC5jcHA6CisgICAgICAgIChXZWJLaXQ6
OldlYlZpZXdJbXBsOjpXZWJWaWV3SW1wbCk6CisgICAgICAgIChXZWJLaXQ6OldlYlZpZXdJbXBs
OjprZXlFdmVudCk6CisgICAgICAgIChXZWJLaXQ6OldlYlZpZXdJbXBsOjphdXRvY29tcGxldGVI
YW5kbGVLZXlFdmVudCk6CisgICAgICAgIChXZWJLaXQ6OldlYlZpZXdJbXBsOjphcHBseUF1dG9m
aWxsU3VnZ2VzdGlvbnMpOgorICAgICAgICAoV2ViS2l0OjpXZWJWaWV3SW1wbDo6YXBwbHlBdXRv
RmlsbFN1Z2dlc3Rpb25zKToKKyAgICAgICAgKFdlYktpdDo6V2ViVmlld0ltcGw6OmFwcGx5QXV0
b2NvbXBsZXRlU3VnZ2VzdGlvbnMpOgorICAgICAgICAqIHNyYy9XZWJWaWV3SW1wbC5oOgorCiAy
MDEwLTAyLTA5ICBKaWFuIExpICA8amlhbmxpQGNocm9taXVtLm9yZz4KIAogICAgICAgICBSZXZp
ZXdlZCBieSBEYXJpbiBGaXNoZXIuCkluZGV4OiBXZWJLaXQvY2hyb21pdW0vV2ViS2l0Lmd5cAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBXZWJLaXQvY2hyb21pdW0vV2ViS2l0Lmd5cAkocmV2aXNpb24gNTQ1MDEp
CisrKyBXZWJLaXQvY2hyb21pdW0vV2ViS2l0Lmd5cAkod29ya2luZyBjb3B5KQpAQCAtMTk5LDYg
KzE5OSw4IEBACiAgICAgICAgICAgICAgICAgJ3NyYy9Bc3NlcnRNYXRjaGluZ0VudW1zLmNwcCcs
CiAgICAgICAgICAgICAgICAgJ3NyYy9BdXRvY29tcGxldGVQb3B1cE1lbnVDbGllbnQuY3BwJywK
ICAgICAgICAgICAgICAgICAnc3JjL0F1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVudC5oJywKKyAg
ICAgICAgICAgICAgICAnc3JjL0F1dG9GaWxsUG9wdXBNZW51Q2xpZW50LmNwcCcsCisgICAgICAg
ICAgICAgICAgJ3NyYy9BdXRvRmlsbFBvcHVwTWVudUNsaWVudC5oJywKICAgICAgICAgICAgICAg
ICAnc3JjL0JhY2tGb3J3YXJkTGlzdENsaWVudEltcGwuY3BwJywKICAgICAgICAgICAgICAgICAn
c3JjL0JhY2tGb3J3YXJkTGlzdENsaWVudEltcGwuaCcsCiAgICAgICAgICAgICAgICAgJ3NyYy9C
b3VuZE9iamVjdC5jcHAnLApAQCAtMjU3LDYgKzI1OSw4IEBACiAgICAgICAgICAgICAgICAgJ3Ny
Yy9TdG9yYWdlRXZlbnREaXNwYXRjaGVySW1wbC5oJywKICAgICAgICAgICAgICAgICAnc3JjL1N0
b3JhZ2VOYW1lc3BhY2VQcm94eS5jcHAnLAogICAgICAgICAgICAgICAgICdzcmMvU3RvcmFnZU5h
bWVzcGFjZVByb3h5LmgnLAorICAgICAgICAgICAgICAgICdzcmMvU3VnZ2VzdGlvbnNQb3B1cE1l
bnVDbGllbnQuY3BwJywKKyAgICAgICAgICAgICAgICAnc3JjL1N1Z2dlc3Rpb25zUG9wdXBNZW51
Q2xpZW50LmgnLAogICAgICAgICAgICAgICAgICdzcmMvVGVtcG9yYXJ5R2x1ZS5oJywKICAgICAg
ICAgICAgICAgICAnc3JjL1Rvb2xzQWdlbnQuaCcsCiAgICAgICAgICAgICAgICAgJ3NyYy9XZWJB
Y2Nlc3NpYmlsaXR5Q2FjaGUuY3BwJywKSW5kZXg6IFdlYktpdC9jaHJvbWl1bS9wdWJsaWMvV2Vi
Vmlldy5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdC9jaHJvbWl1bS9wdWJsaWMvV2ViVmlldy5oCShy
ZXZpc2lvbiA1NDUwMSkKKysrIFdlYktpdC9jaHJvbWl1bS9wdWJsaWMvV2ViVmlldy5oCSh3b3Jr
aW5nIGNvcHkpCkBAIC0yMjMsMTQgKzIyMywyOSBAQCBwdWJsaWM6CiAgICAgdmlydHVhbCBXZWJB
Y2Nlc3NpYmlsaXR5T2JqZWN0IGFjY2Vzc2liaWxpdHlPYmplY3QoKSA9IDA7CiAKIAotICAgIC8v
IEF1dG9maWxsIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLQorICAgIC8vIEF1dG9GaWxsIC8gQXV0b2NvbXBsZXRlIC0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi0gICAgLy8gTm90aWZpZXMgdGhl
IFdlYlZpZXcgdGhhdCBhdXRvZmlsbCBzdWdnZXN0aW9ucyBhcmUgYXZhaWxhYmxlIGZvciBhIG5v
ZGUuCisgICAgLy8gREVQUkVDQVRFRDogV2ViVmlldzo6YXBwbHlBdXRvY29tcGxldGVTdWdnZXN0
aW9ucyBpcyB0aGUgbmV3IHdheSB0bworICAgIC8vIGFjY2VzcyB0aGlzLgogICAgIHZpcnR1YWwg
dm9pZCBhcHBseUF1dG9maWxsU3VnZ2VzdGlvbnMoCiAgICAgICAgIGNvbnN0IFdlYk5vZGUmLAog
ICAgICAgICBjb25zdCBXZWJWZWN0b3I8V2ViU3RyaW5nPiYgc3VnZ2VzdGlvbnMsCiAgICAgICAg
IGludCBkZWZhdWx0U3VnZ2VzdGlvbkluZGV4KSA9IDA7CiAKKyAgICAvLyBOb3RpZmllcyB0aGUg
V2ViVmlldyB0aGF0IEF1dG9GaWxsIHN1Z2dlc3Rpb25zIGFyZSBhdmFpbGFibGUgZm9yIGEgbm9k
ZS4KKyAgICB2aXJ0dWFsIHZvaWQgYXBwbHlBdXRvRmlsbFN1Z2dlc3Rpb25zKAorICAgICAgICBj
b25zdCBXZWJOb2RlJiwKKyAgICAgICAgY29uc3QgV2ViVmVjdG9yPFdlYlN0cmluZz4mIG5hbWVz
LAorICAgICAgICBjb25zdCBXZWJWZWN0b3I8V2ViU3RyaW5nPiYgbGFiZWxzLAorICAgICAgICBp
bnQgZGVmYXVsdFN1Z2dlc3Rpb25JbmRleCkgPSAwOworCisgICAgLy8gTm90aWZpZXMgdGhlIFdl
YlZpZXcgdGhhdCBBdXRvY29tcGxldGUgc3VnZ2VzdGlvbnMgYXJlIGF2YWlsYWJsZSBmb3IgYQor
ICAgIC8vIG5vZGUuCisgICAgdmlydHVhbCB2b2lkIGFwcGx5QXV0b2NvbXBsZXRlU3VnZ2VzdGlv
bnMoCisgICAgICAgIGNvbnN0IFdlYk5vZGUmLAorICAgICAgICBjb25zdCBXZWJWZWN0b3I8V2Vi
U3RyaW5nPiYgc3VnZ2VzdGlvbnMsCisgICAgICAgIGludCBkZWZhdWx0U3VnZ2VzdGlvbkluZGV4
KSA9IDA7CisKICAgICAvLyBERVBSRUNBVEVEOiBXZWJWaWV3OjpoaWRlU3VnZ2VzdGlvbnNQb3B1
cCBpcyB0aGUgbmV3IHdheSB0byBhY2Nlc3MgdGhpcy4KICAgICB2aXJ0dWFsIHZvaWQgaGlkZUF1
dG9maWxsUG9wdXAoKSA9IDA7CiAKSW5kZXg6IFdlYktpdC9jaHJvbWl1bS9zcmMvQXV0b0ZpbGxQ
b3B1cE1lbnVDbGllbnQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdC9jaHJvbWl1bS9zcmMvQXV0
b0ZpbGxQb3B1cE1lbnVDbGllbnQuY3BwCShyZXZpc2lvbiAwKQorKysgV2ViS2l0L2Nocm9taXVt
L3NyYy9BdXRvRmlsbFBvcHVwTWVudUNsaWVudC5jcHAJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEs
MTA2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6Cisg
KgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBi
aW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAq
IGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29v
Z2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNl
ZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNv
ZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBD
T05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFO
VElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJS
QU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxB
UiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hU
CisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJ
UkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElB
TCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5U
IE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwg
T1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQg
T04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJX
SVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdB
UkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisg
Ki8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkF1dG9GaWxsUG9wdXBNZW51Q2xp
ZW50LmgiCisKKyNpbmNsdWRlICJIVE1MSW5wdXRFbGVtZW50LmgiCisjaW5jbHVkZSAiV2ViU3Ry
aW5nLmgiCisjaW5jbHVkZSAiV2ViVmVjdG9yLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBXZWJDb3Jl
OworCituYW1lc3BhY2UgV2ViS2l0IHsKKwordW5zaWduZWQgQXV0b0ZpbGxQb3B1cE1lbnVDbGll
bnQ6OmdldFN1Z2dlc3Rpb25zQ291bnQoKSBjb25zdAoreworICAgIHJldHVybiBtX25hbWVzLnNp
emUoKTsKK30KKworV2ViU3RyaW5nIEF1dG9GaWxsUG9wdXBNZW51Q2xpZW50OjpnZXRTdWdnZXN0
aW9uKHVuc2lnbmVkIGxpc3RJbmRleCkgY29uc3QKK3sKKyAgICAvLyBGSVhNRTogTW9kaWZ5IHRo
ZSBQb3B1cE1lbnUgdG8gYWRkIHRoZSBsYWJlbCBpbiBncmF5IHJpZ2h0LWp1c3RpZmllZC4KKyAg
ICBBU1NFUlQobGlzdEluZGV4ID49IDAgJiYgbGlzdEluZGV4IDwgbV9uYW1lcy5zaXplKCkpOwor
ICAgIHJldHVybiBtX25hbWVzW2xpc3RJbmRleF0gKyBTdHJpbmcoIiAoIikgKyBtX2xhYmVsc1ts
aXN0SW5kZXhdICsgU3RyaW5nKCIpIik7Cit9CisKK3ZvaWQgQXV0b0ZpbGxQb3B1cE1lbnVDbGll
bnQ6OnJlbW92ZVN1Z2dlc3Rpb25BdEluZGV4KHVuc2lnbmVkIGxpc3RJbmRleCkKK3sKKyAgICAv
LyBGSVhNRTogRG8gd2Ugd2FudCB0byByZW1vdmUgQXV0b0ZpbGwgc3VnZ2VzdGlvbnM/CisgICAg
QVNTRVJUKGxpc3RJbmRleCA+PSAwICYmIGxpc3RJbmRleCA8IHN0YXRpY19jYXN0PGludD4obV9u
YW1lcy5zaXplKCkpKTsKKyAgICBtX25hbWVzLnJlbW92ZShsaXN0SW5kZXgpOworICAgIG1fbGFi
ZWxzLnJlbW92ZShsaXN0SW5kZXgpOworfQorCit2b2lkIEF1dG9GaWxsUG9wdXBNZW51Q2xpZW50
Ojogc2VsZWN0aW9uQ2hhbmdlZCh1bnNpZ25lZCBsaXN0SW5kZXgsCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZpcmVFdmVudHMpIHsKKyAgICBp
ZiAobGlzdEluZGV4ID09IHN0YXRpY19jYXN0PHVuc2lnbmVkPigtMSkpIHsKKyAgICAgICAgU3Vn
Z2VzdGlvbnNQb3B1cE1lbnVDbGllbnQ6OnNlbGVjdGlvbkNoYW5nZWQobGlzdEluZGV4LCBmaXJl
RXZlbnRzKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEFTU0VSVChsaXN0SW5kZXgg
Pj0gMCAmJiBsaXN0SW5kZXggPCBtX25hbWVzLnNpemUoKSk7CisgICAgc2V0U3VnZ2VzdGVkVmFs
dWUobV9uYW1lc1tsaXN0SW5kZXhdKTsKK30KKwordm9pZCBBdXRvRmlsbFBvcHVwTWVudUNsaWVu
dDo6aW5pdGlhbGl6ZSgKKyAgICBIVE1MSW5wdXRFbGVtZW50KiB0ZXh0RmllbGQsCisgICAgY29u
c3QgV2ViVmVjdG9yPFdlYlN0cmluZz4mIG5hbWVzLAorICAgIGNvbnN0IFdlYlZlY3RvcjxXZWJT
dHJpbmc+JiBsYWJlbHMsCisgICAgaW50IGRlZmF1bHRTdWdnZXN0aW9uSW5kZXgpCit7CisgICAg
QVNTRVJUKG5hbWVzLnNpemUoKSA9PSBsYWJlbHMuc2l6ZSgpKTsKKyAgICBBU1NFUlQoZGVmYXVs
dFN1Z2dlc3Rpb25JbmRleCA8IHN0YXRpY19jYXN0PGludD4obmFtZXMuc2l6ZSgpKSk7CisKKyAg
ICAvLyBUaGUgc3VnZ2VzdGlvbnMgbXVzdCBiZSBzZXQgYmVmb3JlIGluaXRpYWxpemluZyB0aGUK
KyAgICAvLyBTdWdnZXN0aW9uc1BvcHVwTWVudUNsaWVudC4KKyAgICBzZXRTdWdnZXN0aW9ucyhu
YW1lcywgbGFiZWxzKTsKKworICAgIFN1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50Ojppbml0aWFs
aXplKHRleHRGaWVsZCwgZGVmYXVsdFN1Z2dlc3Rpb25JbmRleCk7Cit9CisKK3ZvaWQgQXV0b0Zp
bGxQb3B1cE1lbnVDbGllbnQ6OnNldFN1Z2dlc3Rpb25zKGNvbnN0IFdlYlZlY3RvcjxXZWJTdHJp
bmc+JiBuYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGNvbnN0IFdlYlZlY3RvcjxXZWJTdHJpbmc+JiBsYWJlbHMpCit7CisgICAgQVNTRVJUKG5hbWVz
LnNpemUoKSA9PSBsYWJlbHMuc2l6ZSgpKTsKKworICAgIG1fbmFtZXMuY2xlYXIoKTsKKyAgICBt
X2xhYmVscy5jbGVhcigpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbmFtZXMuc2l6ZSgp
OyArK2kpIHsKKyAgICAgICAgbV9uYW1lcy5hcHBlbmQobmFtZXNbaV0pOworICAgICAgICBtX2xh
YmVscy5hcHBlbmQobGFiZWxzW2ldKTsKKyAgICB9CisKKyAgICAvLyBUcnkgdG8gcHJlc2VydmUg
c2VsZWN0aW9uIGlmIHBvc3NpYmxlLgorICAgIGlmIChnZXRTZWxlY3RlZEluZGV4KCkgPj0gc3Rh
dGljX2Nhc3Q8aW50PihuYW1lcy5zaXplKCkpKQorICAgICAgICBzZXRTZWxlY3RlZEluZGV4KC0x
KTsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViS2l0CkluZGV4OiBXZWJLaXQvY2hyb21pdW0vc3Jj
L0F1dG9GaWxsUG9wdXBNZW51Q2xpZW50LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0L2Nocm9taXVt
L3NyYy9BdXRvRmlsbFBvcHVwTWVudUNsaWVudC5oCShyZXZpc2lvbiAwKQorKysgV2ViS2l0L2No
cm9taXVtL3NyYy9BdXRvRmlsbFBvcHVwTWVudUNsaWVudC5oCShyZXZpc2lvbiAwKQpAQCAtMCww
ICsxLDcxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5k
IGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJt
aXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6
CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWlu
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBp
biBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIK
KyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQg
d2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2Yg
R29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUg
dXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlz
IHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoK
KyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFO
RCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FS
UkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBX
QVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElD
VUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJ
R0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVO
VElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVN
RU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFU
QSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBB
TkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBT
VFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09G
VFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
CisgKi8KKworI2lmbmRlZiBBdXRvRmlsbFBvcHVwTWVudUNsaWVudF9oCisjZGVmaW5lIEF1dG9G
aWxsUG9wdXBNZW51Q2xpZW50X2gKKworI2luY2x1ZGUgIlN1Z2dlc3Rpb25zUG9wdXBNZW51Q2xp
ZW50LmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKK2NsYXNzIEhUTUxJbnB1dEVsZW1lbnQ7Cit9
CisKK25hbWVzcGFjZSBXZWJLaXQgeworY2xhc3MgV2ViU3RyaW5nOwordGVtcGxhdGUgPHR5cGVu
YW1lIFQ+IGNsYXNzIFdlYlZlY3RvcjsKKworLy8gVGhlIEF1dG9GaWxsIHN1Z2dlc3Rpb25zIHBv
cHVwIG1lbnUgY2xpZW50LCB1c2VkIHRvIGRpc3BsYXkgbmFtZSBzdWdnZXN0aW9ucworLy8gd2l0
aCByaWdodC1qdXN0aWZpZWQgbGFiZWxzLgorY2xhc3MgQXV0b0ZpbGxQb3B1cE1lbnVDbGllbnQg
OiBwdWJsaWMgU3VnZ2VzdGlvbnNQb3B1cE1lbnVDbGllbnQgeworcHVibGljOgorICAgIC8vIFN1
Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50IGltcGxlbWVudGF0aW9uOgorICAgIHZpcnR1YWwgdW5z
aWduZWQgZ2V0U3VnZ2VzdGlvbnNDb3VudCgpIGNvbnN0OworICAgIHZpcnR1YWwgV2ViU3RyaW5n
IGdldFN1Z2dlc3Rpb24odW5zaWduZWQgbGlzdEluZGV4KSBjb25zdDsKKyAgICB2aXJ0dWFsIHZv
aWQgcmVtb3ZlU3VnZ2VzdGlvbkF0SW5kZXgodW5zaWduZWQgbGlzdEluZGV4KTsKKworICAgIC8v
IFdlYkNvcmU6OlBvcHVwTWVudUNsaWVudCBpbXBsZW1lbnRhdGlvbjoKKyAgICB2aXJ0dWFsIHZv
aWQgc2VsZWN0aW9uQ2hhbmdlZCh1bnNpZ25lZCBsaXN0SW5kZXgsIGJvb2wgZmlyZUV2ZW50cyk7
CisKKyAgICB2b2lkIGluaXRpYWxpemUoV2ViQ29yZTo6SFRNTElucHV0RWxlbWVudCosCisgICAg
ICAgICAgICAgICAgICAgIGNvbnN0IFdlYlZlY3RvcjxXZWJTdHJpbmc+JiBuYW1lcywKKyAgICAg
ICAgICAgICAgICAgICAgY29uc3QgV2ViVmVjdG9yPFdlYlN0cmluZz4mIGxhYmVscywKKyAgICAg
ICAgICAgICAgICAgICAgaW50IGRlZmF1bHRTdWdnZXN0aW9uSW5kZXgpOworCisgICAgdm9pZCBz
ZXRTdWdnZXN0aW9ucyhjb25zdCBXZWJWZWN0b3I8V2ViU3RyaW5nPiYgbmFtZXMsCisgICAgICAg
ICAgICAgICAgICAgICAgICBjb25zdCBXZWJWZWN0b3I8V2ViU3RyaW5nPiYgbGFiZWxzKTsKKwor
cHJpdmF0ZToKKyAgICBWZWN0b3I8V2ViQ29yZTo6U3RyaW5nPiBtX25hbWVzOworICAgIFZlY3Rv
cjxXZWJDb3JlOjpTdHJpbmc+IG1fbGFiZWxzOworfTsKKworfSAvLyBuYW1lc3BhY2UgV2ViS2l0
CisKKyNlbmRpZgoKUHJvcGVydHkgY2hhbmdlcyBvbjogV2ViS2l0L2Nocm9taXVtL3NyYy9BdXRv
RmlsbFBvcHVwTWVudUNsaWVudC5oCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KQWRkZWQ6IHN2bjplb2wtc3R5bGUKICAg
KyBMRgoKSW5kZXg6IFdlYktpdC9jaHJvbWl1bS9zcmMvQXV0b2NvbXBsZXRlUG9wdXBNZW51Q2xp
ZW50LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQvY2hyb21pdW0vc3JjL0F1dG9jb21wbGV0ZVBv
cHVwTWVudUNsaWVudC5jcHAJKHJldmlzaW9uIDU0NTAxKQorKysgV2ViS2l0L2Nocm9taXVtL3Ny
Yy9BdXRvY29tcGxldGVQb3B1cE1lbnVDbGllbnQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xLDUg
KzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBHb29nbGUgSW5jLiBBbGwgcmlnaHRz
IHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCkBAIC0zMSwyNyAr
MzEsMjkgQEAKICNpbmNsdWRlICJjb25maWcuaCIKICNpbmNsdWRlICJBdXRvY29tcGxldGVQb3B1
cE1lbnVDbGllbnQuaCIKIAotI2luY2x1ZGUgIkNTU1N0eWxlU2VsZWN0b3IuaCIKLSNpbmNsdWRl
ICJDU1NWYWx1ZUtleXdvcmRzLmgiCi0jaW5jbHVkZSAiRnJhbWVWaWV3LmgiCiAjaW5jbHVkZSAi
SFRNTElucHV0RWxlbWVudC5oIgotI2luY2x1ZGUgIlJlbmRlclRoZW1lLmgiCisjaW5jbHVkZSAi
V2ViU3RyaW5nLmgiCiAjaW5jbHVkZSAiV2ViVmVjdG9yLmgiCi0jaW5jbHVkZSAiV2ViVmlld0lt
cGwuaCIKIAogdXNpbmcgbmFtZXNwYWNlIFdlYkNvcmU7CiAKIG5hbWVzcGFjZSBXZWJLaXQgewog
Ci1BdXRvY29tcGxldGVQb3B1cE1lbnVDbGllbnQ6OkF1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVu
dChXZWJWaWV3SW1wbCogd2ViVmlldykKLSAgICA6IG1fdGV4dEZpZWxkKDApCi0gICAgLCBtX3Nl
bGVjdGVkSW5kZXgoMCkKLSAgICAsIG1fd2ViVmlldyh3ZWJWaWV3KQordW5zaWduZWQgQXV0b2Nv
bXBsZXRlUG9wdXBNZW51Q2xpZW50OjpnZXRTdWdnZXN0aW9uc0NvdW50KCkgY29uc3QKIHsKKyAg
ICByZXR1cm4gbV9zdWdnZXN0aW9ucy5zaXplKCk7CiB9CiAKLUF1dG9jb21wbGV0ZVBvcHVwTWVu
dUNsaWVudDo6fkF1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVudCgpCitXZWJTdHJpbmcgQXV0b2Nv
bXBsZXRlUG9wdXBNZW51Q2xpZW50OjpnZXRTdWdnZXN0aW9uKHVuc2lnbmVkIGxpc3RJbmRleCkg
Y29uc3QKIHsKKyAgICBBU1NFUlQobGlzdEluZGV4ID49IDAgJiYgbGlzdEluZGV4IDwgbV9zdWdn
ZXN0aW9ucy5zaXplKCkpOworICAgIHJldHVybiBtX3N1Z2dlc3Rpb25zW2xpc3RJbmRleF07Cit9
CisKK3ZvaWQgQXV0b2NvbXBsZXRlUG9wdXBNZW51Q2xpZW50OjpyZW1vdmVTdWdnZXN0aW9uQXRJ
bmRleCh1bnNpZ25lZCBsaXN0SW5kZXgpCit7CisgICAgQVNTRVJUKGxpc3RJbmRleCA+PSAwICYm
IGxpc3RJbmRleCA8IG1fc3VnZ2VzdGlvbnMuc2l6ZSgpKTsKKyAgICBtX3N1Z2dlc3Rpb25zLnJl
bW92ZShsaXN0SW5kZXgpOwogfQogCiB2b2lkIEF1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVudDo6
aW5pdGlhbGl6ZSgKQEAgLTYwLDkwICs2MiwxMiBAQCB2b2lkIEF1dG9jb21wbGV0ZVBvcHVwTWVu
dUNsaWVudDo6aW5pdGlhCiAgICAgaW50IGRlZmF1bHRTdWdnZXN0aW9uSW5kZXgpCiB7CiAgICAg
QVNTRVJUKGRlZmF1bHRTdWdnZXN0aW9uSW5kZXggPCBzdGF0aWNfY2FzdDxpbnQ+KHN1Z2dlc3Rp
b25zLnNpemUoKSkpOwotICAgIG1fdGV4dEZpZWxkID0gdGV4dEZpZWxkOwotICAgIG1fc2VsZWN0
ZWRJbmRleCA9IGRlZmF1bHRTdWdnZXN0aW9uSW5kZXg7Ci0gICAgc2V0U3VnZ2VzdGlvbnMoc3Vn
Z2VzdGlvbnMpOwotCi0gICAgRm9udERlc2NyaXB0aW9uIGZvbnREZXNjcmlwdGlvbjsKLSAgICBt
X3dlYlZpZXctPnRoZW1lKCktPnN5c3RlbUZvbnQoQ1NTVmFsdWVXZWJraXRDb250cm9sLCBmb250
RGVzY3JpcHRpb24pOwotICAgIC8vIFVzZSBhIHNtYWxsZXIgZm9udCBzaXplIHRvIG1hdGNoIElF
L0ZpcmVmb3guCi0gICAgLy8gRklYTUU6IGh0dHA6Ly9jcmJ1Zy5jb20vNzM3NiB1c2UgdGhlIHN5
c3RlbSBzaXplIGluc3RlYWQgb2YgYQotICAgIC8vICAgICAgICBmaXhlZCBmb250IHNpemUgdmFs
dWUuCi0gICAgZm9udERlc2NyaXB0aW9uLnNldENvbXB1dGVkU2l6ZSgxMi4wKTsKLSAgICBGb250
IGZvbnQoZm9udERlc2NyaXB0aW9uLCAwLCAwKTsKLSAgICBmb250LnVwZGF0ZSh0ZXh0RmllbGQt
PmRvY3VtZW50KCktPnN0eWxlU2VsZWN0b3IoKS0+Zm9udFNlbGVjdG9yKCkpOwotICAgIC8vIFRo
ZSBkaXJlY3Rpb24gb2YgdGV4dCBpbiBwb3B1cCBtZW51IGlzIHNldCB0aGUgc2FtZSBhcyB0aGUg
ZGlyZWN0aW9uIG9mCi0gICAgLy8gdGhlIGlucHV0IGVsZW1lbnQ6IHRleHRGaWVsZC4KLSAgICBt
X3N0eWxlLnNldChuZXcgUG9wdXBNZW51U3R5bGUoQ29sb3I6OmJsYWNrLCBDb2xvcjo6d2hpdGUs
IGZvbnQsIHRydWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExlbmd0aChX
ZWJDb3JlOjpGaXhlZCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRG
aWVsZC0+cmVuZGVyZXIoKS0+c3R5bGUoKS0+ZGlyZWN0aW9uKCkpKTsKLX0KLQotdm9pZCBBdXRv
Y29tcGxldGVQb3B1cE1lbnVDbGllbnQ6OnZhbHVlQ2hhbmdlZCh1bnNpZ25lZCBsaXN0SW5kZXgs
IGJvb2wgZmlyZUV2ZW50cykKLXsKLSAgICBtX3RleHRGaWVsZC0+c2V0VmFsdWUobV9zdWdnZXN0
aW9uc1tsaXN0SW5kZXhdKTsKLSAgICBFZGl0b3JDbGllbnRJbXBsKiBlZGl0b3IgPQotICAgICAg
ICBzdGF0aWNfY2FzdDxFZGl0b3JDbGllbnRJbXBsKj4obV93ZWJWaWV3LT5wYWdlKCktPmVkaXRv
ckNsaWVudCgpKTsKLSAgICBBU1NFUlQoZWRpdG9yKTsKLSAgICBlZGl0b3ItPm9uQXV0b2ZpbGxT
dWdnZXN0aW9uQWNjZXB0ZWQoCi0gICAgICAgIHN0YXRpY19jYXN0PEhUTUxJbnB1dEVsZW1lbnQq
PihtX3RleHRGaWVsZC5nZXQoKSkpOwotfQotCi1TdHJpbmcgQXV0b2NvbXBsZXRlUG9wdXBNZW51
Q2xpZW50OjppdGVtVGV4dCh1bnNpZ25lZCBsaXN0SW5kZXgpIGNvbnN0Ci17Ci0gICAgcmV0dXJu
IG1fc3VnZ2VzdGlvbnNbbGlzdEluZGV4XTsKLX0KLQotUG9wdXBNZW51U3R5bGUgQXV0b2NvbXBs
ZXRlUG9wdXBNZW51Q2xpZW50OjppdGVtU3R5bGUodW5zaWduZWQgbGlzdEluZGV4KSBjb25zdAot
ewotICAgIHJldHVybiAqbV9zdHlsZTsKLX0KLQotUG9wdXBNZW51U3R5bGUgQXV0b2NvbXBsZXRl
UG9wdXBNZW51Q2xpZW50OjptZW51U3R5bGUoKSBjb25zdAotewotICAgIHJldHVybiAqbV9zdHls
ZTsKLX0KLQotaW50IEF1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVudDo6Y2xpZW50UGFkZGluZ0xl
ZnQoKSBjb25zdAotewotICAgIC8vIEJ1ZyBodHRwOi8vY3JidWcuY29tLzc3MDggc2VlbXMgdG8g
aW5kaWNhdGUgdGhlIHN0eWxlIGNhbiBiZSAwLgotICAgIFJlbmRlclN0eWxlKiBzdHlsZSA9IHRl
eHRGaWVsZFN0eWxlKCk7Ci0gICAgcmV0dXJuIHN0eWxlID8gbV93ZWJWaWV3LT50aGVtZSgpLT5w
b3B1cEludGVybmFsUGFkZGluZ0xlZnQoc3R5bGUpIDogMDsKLX0KIAotaW50IEF1dG9jb21wbGV0
ZVBvcHVwTWVudUNsaWVudDo6Y2xpZW50UGFkZGluZ1JpZ2h0KCkgY29uc3QKLXsKLSAgICAvLyBC
dWcgaHR0cDovL2NyYnVnLmNvbS83NzA4IHNlZW1zIHRvIGluZGljYXRlIHRoZSBzdHlsZSBjYW4g
YmUgMC4KLSAgICBSZW5kZXJTdHlsZSogc3R5bGUgPSB0ZXh0RmllbGRTdHlsZSgpOwotICAgIHJl
dHVybiBzdHlsZSA/IG1fd2ViVmlldy0+dGhlbWUoKS0+cG9wdXBJbnRlcm5hbFBhZGRpbmdSaWdo
dChzdHlsZSkgOiAwOwotfQotCi12b2lkIEF1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVudDo6cG9w
dXBEaWRIaWRlKCkKLXsKLSAgICBtX3dlYlZpZXctPnN1Z2dlc3Rpb25zUG9wdXBEaWRIaWRlKCk7
Ci19Ci0KLXZvaWQgQXV0b2NvbXBsZXRlUG9wdXBNZW51Q2xpZW50OjpzZXRUZXh0RnJvbUl0ZW0o
dW5zaWduZWQgbGlzdEluZGV4KQotewotICAgIG1fdGV4dEZpZWxkLT5zZXRWYWx1ZShtX3N1Z2dl
c3Rpb25zW2xpc3RJbmRleF0pOwotfQotCi1Gb250U2VsZWN0b3IqIEF1dG9jb21wbGV0ZVBvcHVw
TWVudUNsaWVudDo6Zm9udFNlbGVjdG9yKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV90ZXh0Rmll
bGQtPmRvY3VtZW50KCktPnN0eWxlU2VsZWN0b3IoKS0+Zm9udFNlbGVjdG9yKCk7Ci19Ci0KLUhv
c3RXaW5kb3cqIEF1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVudDo6aG9zdFdpbmRvdygpIGNvbnN0
Ci17Ci0gICAgcmV0dXJuIG1fdGV4dEZpZWxkLT5kb2N1bWVudCgpLT52aWV3KCktPmhvc3RXaW5k
b3coKTsKLX0KKyAgICAvLyBUaGUgc3VnZ2VzdGlvbnMgbXVzdCBiZSBzZXQgYmVmb3JlIGluaXRp
YWxpemluZyB0aGUKKyAgICAvLyBTdWdnZXN0aW9uc1BvcHVwTWVudUNsaWVudC4KKyAgICBzZXRT
dWdnZXN0aW9ucyhzdWdnZXN0aW9ucyk7CiAKLVBhc3NSZWZQdHI8U2Nyb2xsYmFyPiBBdXRvY29t
cGxldGVQb3B1cE1lbnVDbGllbnQ6OmNyZWF0ZVNjcm9sbGJhcigKLSAgICBTY3JvbGxiYXJDbGll
bnQqIGNsaWVudCwKLSAgICBTY3JvbGxiYXJPcmllbnRhdGlvbiBvcmllbnRhdGlvbiwKLSAgICBT
Y3JvbGxiYXJDb250cm9sU2l6ZSBzaXplKQotewotICAgIHJldHVybiBTY3JvbGxiYXI6OmNyZWF0
ZU5hdGl2ZVNjcm9sbGJhcihjbGllbnQsIG9yaWVudGF0aW9uLCBzaXplKTsKKyAgICBTdWdnZXN0
aW9uc1BvcHVwTWVudUNsaWVudDo6aW5pdGlhbGl6ZSh0ZXh0RmllbGQsIGRlZmF1bHRTdWdnZXN0
aW9uSW5kZXgpOwogfQogCiB2b2lkIEF1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVudDo6c2V0U3Vn
Z2VzdGlvbnMoY29uc3QgV2ViVmVjdG9yPFdlYlN0cmluZz4mIHN1Z2dlc3Rpb25zKQpAQCAtMTUx
LDI4ICs3NSwxMCBAQCB2b2lkIEF1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVudDo6c2V0U3VnCiAg
ICAgbV9zdWdnZXN0aW9ucy5jbGVhcigpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc3Vn
Z2VzdGlvbnMuc2l6ZSgpOyArK2kpCiAgICAgICAgIG1fc3VnZ2VzdGlvbnMuYXBwZW5kKHN1Z2dl
c3Rpb25zW2ldKTsKLSAgICAvLyBUcnkgdG8gcHJlc2VydmUgc2VsZWN0aW9uIGlmIHBvc3NpYmxl
LgotICAgIGlmIChtX3NlbGVjdGVkSW5kZXggPj0gc3RhdGljX2Nhc3Q8aW50PihzdWdnZXN0aW9u
cy5zaXplKCkpKQotICAgICAgICBtX3NlbGVjdGVkSW5kZXggPSAtMTsKLX0KIAotdm9pZCBBdXRv
Y29tcGxldGVQb3B1cE1lbnVDbGllbnQ6OnJlbW92ZUl0ZW1BdEluZGV4KGludCBpbmRleCkKLXsK
LSAgICBBU1NFUlQoaW5kZXggPj0gMCAmJiBpbmRleCA8IHN0YXRpY19jYXN0PGludD4obV9zdWdn
ZXN0aW9ucy5zaXplKCkpKTsKLSAgICBtX3N1Z2dlc3Rpb25zLnJlbW92ZShpbmRleCk7Ci19Ci0K
LVJlbmRlclN0eWxlKiBBdXRvY29tcGxldGVQb3B1cE1lbnVDbGllbnQ6OnRleHRGaWVsZFN0eWxl
KCkgY29uc3QKLXsKLSAgICBSZW5kZXJTdHlsZSogc3R5bGUgPSBtX3RleHRGaWVsZC0+Y29tcHV0
ZWRTdHlsZSgpOwotICAgIGlmICghc3R5bGUpIHsKLSAgICAgICAgLy8gSXQgc2VlbXMgd2UgY2Fu
IG9ubHkgaGF2ZSBhIDAgc3R5bGUgaW4gYSBUZXh0RmllbGQgaWYgdGhlCi0gICAgICAgIC8vIG5v
ZGUgaXMgZGV0YWNoZWQsIGluIHdoaWNoIGNhc2Ugd2UgdGhlIHBvcHVwIHNob3VkIG5vdCBiZQot
ICAgICAgICAvLyBzaG93aW5nLiAgUGxlYXNlIHJlcG9ydCB0aGlzIGluIGh0dHA6Ly9jcmJ1Zy5j
b20vNzcwOCBhbmQKLSAgICAgICAgLy8gaW5jbHVkZSB0aGUgcGFnZSB5b3Ugd2VyZSB2aXNpdGlu
Zy4KLSAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Ci0gICAgfQotICAgIHJldHVybiBzdHls
ZTsKKyAgICAvLyBUcnkgdG8gcHJlc2VydmUgc2VsZWN0aW9uIGlmIHBvc3NpYmxlLgorICAgIGlm
IChnZXRTZWxlY3RlZEluZGV4KCkgPj0gc3RhdGljX2Nhc3Q8aW50PihzdWdnZXN0aW9ucy5zaXpl
KCkpKQorICAgICAgICBzZXRTZWxlY3RlZEluZGV4KC0xKTsKIH0KIAogfSAvLyBuYW1lc3BhY2Ug
V2ViS2l0CkluZGV4OiBXZWJLaXQvY2hyb21pdW0vc3JjL0F1dG9jb21wbGV0ZVBvcHVwTWVudUNs
aWVudC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdC9jaHJvbWl1bS9zcmMvQXV0b2NvbXBsZXRlUG9w
dXBNZW51Q2xpZW50LmgJKHJldmlzaW9uIDU0NTAxKQorKysgV2ViS2l0L2Nocm9taXVtL3NyYy9B
dXRvY29tcGxldGVQb3B1cE1lbnVDbGllbnQuaAkod29ya2luZyBjb3B5KQpAQCAtMSw1ICsxLDUg
QEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2Vy
dmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkg
Zm9ybXMsIHdpdGggb3Igd2l0aG91dAogICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHBy
b3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQpAQCAtMjgsNjkgKzI4LDM4
IEBACiAgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLgogICovCiAKLSNpbmNsdWRlICJQb3B1cE1lbnVDbGllbnQuaCIK
KyNpZm5kZWYgQXV0b2NvbXBsZXRlUG9wdXBNZW51Q2xpZW50X2gKKyNkZWZpbmUgQXV0b2NvbXBs
ZXRlUG9wdXBNZW51Q2xpZW50X2gKKyAKKyNpbmNsdWRlICJTdWdnZXN0aW9uc1BvcHVwTWVudUNs
aWVudC5oIgogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiBjbGFzcyBIVE1MSW5wdXRFbGVtZW50Owot
Y2xhc3MgUG9wdXBNZW51U3R5bGU7Ci1jbGFzcyBSZW5kZXJTdHlsZTsKIH0KIAogbmFtZXNwYWNl
IFdlYktpdCB7CiBjbGFzcyBXZWJTdHJpbmc7Ci1jbGFzcyBXZWJWaWV3SW1wbDsKIHRlbXBsYXRl
IDx0eXBlbmFtZSBUPiBjbGFzcyBXZWJWZWN0b3I7CiAKLS8vIEF1dG9jb21wbGV0ZVBvcHVwTWVu
dUNsaWVudAotY2xhc3MgQXV0b2NvbXBsZXRlUG9wdXBNZW51Q2xpZW50IDogcHVibGljIFdlYkNv
cmU6OlBvcHVwTWVudUNsaWVudCB7CisvLyBUaGUgQXV0b2NvbXBsZXRlIHN1Z2dlc3Rpb25zIHBv
cHVwIG1lbnUgY2xpZW50LCB1c2VkIHRvIGRpc3BsYXkgYSBsaXN0IG9mCisvLyBhdXRvY29tcGxl
dGUgc3VnZ2VzdGlvbnMuCitjbGFzcyBBdXRvY29tcGxldGVQb3B1cE1lbnVDbGllbnQgOiBwdWJs
aWMgU3VnZ2VzdGlvbnNQb3B1cE1lbnVDbGllbnQgewogcHVibGljOgotICAgIEF1dG9jb21wbGV0
ZVBvcHVwTWVudUNsaWVudChXZWJWaWV3SW1wbCogd2Vidmlldyk7Ci0gICAgfkF1dG9jb21wbGV0
ZVBvcHVwTWVudUNsaWVudCgpOworICAgIC8vIFN1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50IGlt
cGxlbWVudGF0aW9uOgorICAgIHZpcnR1YWwgdW5zaWduZWQgZ2V0U3VnZ2VzdGlvbnNDb3VudCgp
IGNvbnN0OworICAgIHZpcnR1YWwgV2ViU3RyaW5nIGdldFN1Z2dlc3Rpb24odW5zaWduZWQgbGlz
dEluZGV4KSBjb25zdDsKKyAgICB2aXJ0dWFsIHZvaWQgcmVtb3ZlU3VnZ2VzdGlvbkF0SW5kZXgo
dW5zaWduZWQgbGlzdEluZGV4KTsKIAogICAgIHZvaWQgaW5pdGlhbGl6ZShXZWJDb3JlOjpIVE1M
SW5wdXRFbGVtZW50KiwKICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2ViVmVjdG9yPFdlYlN0
cmluZz4mIHN1Z2dlc3Rpb25zLAogICAgICAgICAgICAgICAgICAgICBpbnQgZGVmYXVsdFN1Z2dl
c3Rpb25JbmRleCk7CiAKLSAgICBXZWJDb3JlOjpIVE1MSW5wdXRFbGVtZW50KiB0ZXh0RmllbGQo
KSBjb25zdCB7IHJldHVybiBtX3RleHRGaWVsZC5nZXQoKTsgfQotCiAgICAgdm9pZCBzZXRTdWdn
ZXN0aW9ucyhjb25zdCBXZWJWZWN0b3I8V2ViU3RyaW5nPiYpOwotICAgIHZvaWQgcmVtb3ZlSXRl
bUF0SW5kZXgoaW50IGluZGV4KTsKLQotICAgIC8vIFdlYkNvcmU6OlBvcHVwTWVudUNsaWVudCBt
ZXRob2RzOgotICAgIHZpcnR1YWwgdm9pZCB2YWx1ZUNoYW5nZWQodW5zaWduZWQgbGlzdEluZGV4
LCBib29sIGZpcmVFdmVudHMgPSB0cnVlKTsKLSAgICB2aXJ0dWFsIFdlYkNvcmU6OlN0cmluZyBp
dGVtVGV4dCh1bnNpZ25lZCBsaXN0SW5kZXgpIGNvbnN0OwotICAgIHZpcnR1YWwgV2ViQ29yZTo6
U3RyaW5nIGl0ZW1Ub29sVGlwKHVuc2lnbmVkIGxhc3RJbmRleCkgY29uc3QgeyByZXR1cm4gV2Vi
Q29yZTo6U3RyaW5nKCk7IH0KLSAgICB2aXJ0dWFsIGJvb2wgaXRlbUlzRW5hYmxlZCh1bnNpZ25l
ZCBsaXN0SW5kZXgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KLSAgICB2aXJ0dWFsIFdlYkNvcmU6
OlBvcHVwTWVudVN0eWxlIGl0ZW1TdHlsZSh1bnNpZ25lZCBsaXN0SW5kZXgpIGNvbnN0OwotICAg
IHZpcnR1YWwgV2ViQ29yZTo6UG9wdXBNZW51U3R5bGUgbWVudVN0eWxlKCkgY29uc3Q7Ci0gICAg
dmlydHVhbCBpbnQgY2xpZW50SW5zZXRMZWZ0KCkgY29uc3QgeyByZXR1cm4gMDsgfQotICAgIHZp
cnR1YWwgaW50IGNsaWVudEluc2V0UmlnaHQoKSBjb25zdCB7IHJldHVybiAwOyB9Ci0gICAgdmly
dHVhbCBpbnQgY2xpZW50UGFkZGluZ0xlZnQoKSBjb25zdDsKLSAgICB2aXJ0dWFsIGludCBjbGll
bnRQYWRkaW5nUmlnaHQoKSBjb25zdDsKLSAgICB2aXJ0dWFsIGludCBsaXN0U2l6ZSgpIGNvbnN0
IHsgcmV0dXJuIG1fc3VnZ2VzdGlvbnMuc2l6ZSgpOyB9Ci0gICAgdmlydHVhbCBpbnQgc2VsZWN0
ZWRJbmRleCgpIGNvbnN0IHsgcmV0dXJuIG1fc2VsZWN0ZWRJbmRleDsgfQotICAgIHZpcnR1YWwg
dm9pZCBwb3B1cERpZEhpZGUoKTsKLSAgICB2aXJ0dWFsIGJvb2wgaXRlbUlzU2VwYXJhdG9yKHVu
c2lnbmVkIGxpc3RJbmRleCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLSAgICB2aXJ0dWFsIGJv
b2wgaXRlbUlzTGFiZWwodW5zaWduZWQgbGlzdEluZGV4KSBjb25zdCB7IHJldHVybiBmYWxzZTsg
fQotICAgIHZpcnR1YWwgYm9vbCBpdGVtSXNTZWxlY3RlZCh1bnNpZ25lZCBsaXN0SW5kZXgpIGNv
bnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0gICAgdmlydHVhbCBib29sIHNob3VsZFBvcE92ZXIoKSBj
b25zdCB7IHJldHVybiBmYWxzZTsgfQotICAgIHZpcnR1YWwgYm9vbCB2YWx1ZVNob3VsZENoYW5n
ZU9uSG90VHJhY2soKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotICAgIHZpcnR1YWwgdm9pZCBz
ZXRUZXh0RnJvbUl0ZW0odW5zaWduZWQgbGlzdEluZGV4KTsKLSAgICB2aXJ0dWFsIFdlYkNvcmU6
OkZvbnRTZWxlY3RvciogZm9udFNlbGVjdG9yKCkgY29uc3Q7Ci0gICAgdmlydHVhbCBXZWJDb3Jl
OjpIb3N0V2luZG93KiBob3N0V2luZG93KCkgY29uc3Q7Ci0gICAgdmlydHVhbCBQYXNzUmVmUHRy
PFdlYkNvcmU6OlNjcm9sbGJhcj4gY3JlYXRlU2Nyb2xsYmFyKAotICAgICAgICBXZWJDb3JlOjpT
Y3JvbGxiYXJDbGllbnQqIGNsaWVudCwKLSAgICAgICAgV2ViQ29yZTo6U2Nyb2xsYmFyT3JpZW50
YXRpb24gb3JpZW50YXRpb24sCi0gICAgICAgIFdlYkNvcmU6OlNjcm9sbGJhckNvbnRyb2xTaXpl
IHNpemUpOwogCiBwcml2YXRlOgotICAgIFdlYkNvcmU6OlJlbmRlclN0eWxlKiB0ZXh0RmllbGRT
dHlsZSgpIGNvbnN0OwotCi0gICAgUmVmUHRyPFdlYkNvcmU6OkhUTUxJbnB1dEVsZW1lbnQ+IG1f
dGV4dEZpZWxkOwogICAgIFZlY3RvcjxXZWJDb3JlOjpTdHJpbmc+IG1fc3VnZ2VzdGlvbnM7Ci0g
ICAgaW50IG1fc2VsZWN0ZWRJbmRleDsKLSAgICBXZWJWaWV3SW1wbCogbV93ZWJWaWV3OwotICAg
IE93blB0cjxXZWJDb3JlOjpQb3B1cE1lbnVTdHlsZT4gbV9zdHlsZTsKIH07CiAKIH0gLy8gbmFt
ZXNwYWNlIFdlYktpdAorCisjZW5kaWYKSW5kZXg6IFdlYktpdC9jaHJvbWl1bS9zcmMvU3VnZ2Vz
dGlvbnNQb3B1cE1lbnVDbGllbnQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdC9jaHJvbWl1bS9z
cmMvU3VnZ2VzdGlvbnNQb3B1cE1lbnVDbGllbnQuY3BwCShyZXZpc2lvbiAwKQorKysgV2ViS2l0
L2Nocm9taXVtL3NyYy9TdWdnZXN0aW9uc1BvcHVwTWVudUNsaWVudC5jcHAJKHJldmlzaW9uIDAp
CkBAIC0wLDAgKzEsMjYyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMu
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJl
CisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11
c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJp
YnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHly
aWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMg
cHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhl
IG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9y
cyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9t
CisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNz
aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBI
T0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElN
UExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUg
SU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAq
IEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBU
SEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkg
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1Ig
Q09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8s
IFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNF
LAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9G
IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIlN1Z2dlc3Rp
b25zUG9wdXBNZW51Q2xpZW50LmgiCisKKyNpbmNsdWRlICJDU1NTdHlsZVNlbGVjdG9yLmgiCisj
aW5jbHVkZSAiQ1NTVmFsdWVLZXl3b3Jkcy5oIgorI2luY2x1ZGUgIkNocm9tZS5oIgorI2luY2x1
ZGUgIkZyYW1lVmlldy5oIgorI2luY2x1ZGUgIkhUTUxJbnB1dEVsZW1lbnQuaCIKKyNpbmNsdWRl
ICJSZW5kZXJUaGVtZS5oIgorI2luY2x1ZGUgIldlYlZpZXdJbXBsLmgiCisKK3VzaW5nIG5hbWVz
cGFjZSBXZWJDb3JlOworCituYW1lc3BhY2UgV2ViS2l0IHsKKworU3VnZ2VzdGlvbnNQb3B1cE1l
bnVDbGllbnQ6OlN1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50KCkKKyAgICA6IG1fdGV4dEZpZWxk
KDApCisgICAgLCBtX3NlbGVjdGVkSW5kZXgoMCkKK3sKK30KKworU3VnZ2VzdGlvbnNQb3B1cE1l
bnVDbGllbnQ6On5TdWdnZXN0aW9uc1BvcHVwTWVudUNsaWVudCgpCit7Cit9CisKKy8vIEZJWE1F
OiBJbXBsZW1lbnQgdGhpcyBwZXItZGVyaXZlZCBjbGFzcz8KK3ZvaWQgU3VnZ2VzdGlvbnNQb3B1
cE1lbnVDbGllbnQ6OnZhbHVlQ2hhbmdlZCh1bnNpZ25lZCBsaXN0SW5kZXgsIGJvb2wgZmlyZUV2
ZW50cykKK3sKKyAgICBtX3RleHRGaWVsZC0+c2V0VmFsdWUoZ2V0U3VnZ2VzdGlvbihsaXN0SW5k
ZXgpKTsKKworICAgIFdlYlZpZXdJbXBsKiB3ZWJWaWV3ID0gZ2V0V2ViVmlldygpOworICAgIGlm
ICghd2ViVmlldykKKyAgICAgICAgcmV0dXJuOworCisgICAgRWRpdG9yQ2xpZW50SW1wbCogZWRp
dG9yID0KKyAgICAgICAgc3RhdGljX2Nhc3Q8RWRpdG9yQ2xpZW50SW1wbCo+KHdlYlZpZXctPnBh
Z2UoKS0+ZWRpdG9yQ2xpZW50KCkpOworICAgIEFTU0VSVChlZGl0b3IpOworICAgIGVkaXRvci0+
b25BdXRvZmlsbFN1Z2dlc3Rpb25BY2NlcHRlZCgKKyAgICAgICAgc3RhdGljX2Nhc3Q8SFRNTElu
cHV0RWxlbWVudCo+KG1fdGV4dEZpZWxkLmdldCgpKSk7Cit9CisKK3ZvaWQgU3VnZ2VzdGlvbnNQ
b3B1cE1lbnVDbGllbnQ6OnNlbGVjdGlvbkNoYW5nZWQodW5zaWduZWQgbGlzdEluZGV4LCBib29s
IGZpcmVFdmVudHMpCit7CisgICAgaWYgKGxpc3RJbmRleCAhPSBzdGF0aWNfY2FzdDx1bnNpZ25l
ZD4oLTEpKSB7CisgICAgICAgIGNvbnN0IFdlYlN0cmluZyYgc3VnZ2VzdGlvbiA9IGdldFN1Z2dl
c3Rpb24obGlzdEluZGV4KTsKKyAgICAgICAgc2V0U3VnZ2VzdGVkVmFsdWUoc3VnZ2VzdGlvbik7
CisgICAgfSBlbHNlIHsKKyAgICAgICAgbV90ZXh0RmllbGQtPnNldFZhbHVlKG1fdHlwZWRGaWVs
ZFZhbHVlKTsKKyAgICAgICAgaWYgKG1fbGFzdEZpZWxkVmFsdWVzLT5jb250YWlucyhtX3RleHRG
aWVsZC0+bmFtZSgpKSkKKyAgICAgICAgICAgIG1fbGFzdEZpZWxkVmFsdWVzLT5zZXQobV90ZXh0
RmllbGQtPm5hbWUoKSwgbV90eXBlZEZpZWxkVmFsdWUpOworICAgICAgICBlbHNlCisgICAgICAg
ICAgICBtX2xhc3RGaWVsZFZhbHVlcy0+YWRkKG1fdGV4dEZpZWxkLT5uYW1lKCksIG1fdHlwZWRG
aWVsZFZhbHVlKTsKKyAgICB9Cit9CisKK1N0cmluZyBTdWdnZXN0aW9uc1BvcHVwTWVudUNsaWVu
dDo6aXRlbVRleHQodW5zaWduZWQgbGlzdEluZGV4KSBjb25zdAoreworICAgIHJldHVybiBnZXRT
dWdnZXN0aW9uKGxpc3RJbmRleCk7Cit9CisKK1BvcHVwTWVudVN0eWxlIFN1Z2dlc3Rpb25zUG9w
dXBNZW51Q2xpZW50OjppdGVtU3R5bGUodW5zaWduZWQgbGlzdEluZGV4KSBjb25zdAoreworICAg
IHJldHVybiAqbV9zdHlsZTsKK30KKworUG9wdXBNZW51U3R5bGUgU3VnZ2VzdGlvbnNQb3B1cE1l
bnVDbGllbnQ6Om1lbnVTdHlsZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuICptX3N0eWxlOworfQor
CitpbnQgU3VnZ2VzdGlvbnNQb3B1cE1lbnVDbGllbnQ6OmNsaWVudFBhZGRpbmdMZWZ0KCkgY29u
c3QKK3sKKyAgICAvLyBCdWcgaHR0cDovL2NyYnVnLmNvbS83NzA4IHNlZW1zIHRvIGluZGljYXRl
IHRoZSBzdHlsZSBjYW4gYmUgMC4KKyAgICBSZW5kZXJTdHlsZSogc3R5bGUgPSB0ZXh0RmllbGRT
dHlsZSgpOworICAgIGlmICghc3R5bGUpCisgICAgICAgcmV0dXJuIDA7CisKKyAgICByZXR1cm4g
UmVuZGVyVGhlbWU6OmRlZmF1bHRUaGVtZSgpLT5wb3B1cEludGVybmFsUGFkZGluZ0xlZnQoc3R5
bGUpOworfQorCitpbnQgU3VnZ2VzdGlvbnNQb3B1cE1lbnVDbGllbnQ6OmNsaWVudFBhZGRpbmdS
aWdodCgpIGNvbnN0Cit7CisgICAgLy8gQnVnIGh0dHA6Ly9jcmJ1Zy5jb20vNzcwOCBzZWVtcyB0
byBpbmRpY2F0ZSB0aGUgc3R5bGUgY2FuIGJlIDAuCisgICAgUmVuZGVyU3R5bGUqIHN0eWxlID0g
dGV4dEZpZWxkU3R5bGUoKTsKKyAgICBpZiAoIXN0eWxlKQorICAgICAgICByZXR1cm4gMDsKKwor
ICAgIHJldHVybiBSZW5kZXJUaGVtZTo6ZGVmYXVsdFRoZW1lKCktPnBvcHVwSW50ZXJuYWxQYWRk
aW5nUmlnaHQoc3R5bGUpOworfQorCit2b2lkIFN1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50Ojpw
b3B1cERpZEhpZGUoKQoreworICAgIG1fdGV4dEZpZWxkLT5zZXRWYWx1ZShtX3R5cGVkRmllbGRW
YWx1ZSk7CisgICAgcmVzZXRMYXN0U3VnZ2VzdGlvbigpOworICAgIFdlYlZpZXdJbXBsKiB3ZWJW
aWV3ID0gZ2V0V2ViVmlldygpOworICAgIGlmICh3ZWJWaWV3KQorICAgICAgICB3ZWJWaWV3LT5z
dWdnZXN0aW9uc1BvcHVwRGlkSGlkZSgpOworfQorCit2b2lkIFN1Z2dlc3Rpb25zUG9wdXBNZW51
Q2xpZW50OjpzZXRUZXh0RnJvbUl0ZW0odW5zaWduZWQgbGlzdEluZGV4KQoreworICAgIG1fdGV4
dEZpZWxkLT5zZXRWYWx1ZShnZXRTdWdnZXN0aW9uKGxpc3RJbmRleCkpOworICAgIHJlc2V0TGFz
dFN1Z2dlc3Rpb24oKTsKK30KKwordm9pZCBTdWdnZXN0aW9uc1BvcHVwTWVudUNsaWVudDo6cmVz
ZXRMYXN0U3VnZ2VzdGlvbigpCit7CisgICAgaWYgKG1fbGFzdEZpZWxkVmFsdWVzLT5jb250YWlu
cyhtX3RleHRGaWVsZC0+bmFtZSgpKSkKKyAgICAgICAgbV9sYXN0RmllbGRWYWx1ZXMtPnNldCht
X3RleHRGaWVsZC0+bmFtZSgpLCBtX3RleHRGaWVsZC0+dmFsdWUoKSk7CisgICAgZWxzZQorICAg
ICAgICBtX2xhc3RGaWVsZFZhbHVlcy0+YWRkKG1fdGV4dEZpZWxkLT5uYW1lKCksIG1fdGV4dEZp
ZWxkLT52YWx1ZSgpKTsKK30KKworRm9udFNlbGVjdG9yKiBTdWdnZXN0aW9uc1BvcHVwTWVudUNs
aWVudDo6Zm9udFNlbGVjdG9yKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV90ZXh0RmllbGQtPmRv
Y3VtZW50KCktPnN0eWxlU2VsZWN0b3IoKS0+Zm9udFNlbGVjdG9yKCk7Cit9CisKK0hvc3RXaW5k
b3cqIFN1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50Ojpob3N0V2luZG93KCkgY29uc3QKK3sKKyAg
ICByZXR1cm4gbV90ZXh0RmllbGQtPmRvY3VtZW50KCktPnZpZXcoKS0+aG9zdFdpbmRvdygpOwor
fQorCitQYXNzUmVmUHRyPFNjcm9sbGJhcj4gU3VnZ2VzdGlvbnNQb3B1cE1lbnVDbGllbnQ6OmNy
ZWF0ZVNjcm9sbGJhcigKKyAgICBTY3JvbGxiYXJDbGllbnQqIGNsaWVudCwKKyAgICBTY3JvbGxi
YXJPcmllbnRhdGlvbiBvcmllbnRhdGlvbiwKKyAgICBTY3JvbGxiYXJDb250cm9sU2l6ZSBzaXpl
KQoreworICAgIHJldHVybiBTY3JvbGxiYXI6OmNyZWF0ZU5hdGl2ZVNjcm9sbGJhcihjbGllbnQs
IG9yaWVudGF0aW9uLCBzaXplKTsKK30KKworUmVuZGVyU3R5bGUqIFN1Z2dlc3Rpb25zUG9wdXBN
ZW51Q2xpZW50Ojp0ZXh0RmllbGRTdHlsZSgpIGNvbnN0Cit7CisgICAgUmVuZGVyU3R5bGUqIHN0
eWxlID0gbV90ZXh0RmllbGQtPmNvbXB1dGVkU3R5bGUoKTsKKyAgICBpZiAoIXN0eWxlKSB7Cisg
ICAgICAgIC8vIEl0IHNlZW1zIHdlIGNhbiBvbmx5IGhhdmUgYSAwIHN0eWxlIGluIGEgVGV4dEZp
ZWxkIGlmIHRoZQorICAgICAgICAvLyBub2RlIGlzIGRldGFjaGVkLCBpbiB3aGljaCBjYXNlIHdl
IHRoZSBwb3B1cCBzaG91ZCBub3QgYmUKKyAgICAgICAgLy8gc2hvd2luZy4gIFBsZWFzZSByZXBv
cnQgdGhpcyBpbiBodHRwOi8vY3JidWcuY29tLzc3MDggYW5kCisgICAgICAgIC8vIGluY2x1ZGUg
dGhlIHBhZ2UgeW91IHdlcmUgdmlzaXRpbmcuCisgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgp
OworICAgIH0KKyAgICByZXR1cm4gc3R5bGU7Cit9CisKK3ZvaWQgU3VnZ2VzdGlvbnNQb3B1cE1l
bnVDbGllbnQ6OmluaXRpYWxpemUoSFRNTElucHV0RWxlbWVudCogdGV4dEZpZWxkLAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVmYXVsdFN1Z2dlc3Rp
b25JbmRleCkKK3sKKyAgICBpZiAoIW1fbGFzdEZpZWxkVmFsdWVzKQorICAgICAgICBtX2xhc3RG
aWVsZFZhbHVlcy5zZXQobmV3IEZpZWxkVmFsdWVzTWFwKTsKKworICAgIG1fdGV4dEZpZWxkID0g
dGV4dEZpZWxkOworICAgIG1fdHlwZWRGaWVsZFZhbHVlID0gdGV4dEZpZWxkLT52YWx1ZSgpOwor
ICAgIG1fc2VsZWN0ZWRJbmRleCA9IGRlZmF1bHRTdWdnZXN0aW9uSW5kZXg7CisKKyAgICBzZXRJ
bml0aWFsU3VnZ2VzdGlvbigpOworCisgICAgRm9udERlc2NyaXB0aW9uIGZvbnREZXNjcmlwdGlv
bjsKKyAgICBSZW5kZXJUaGVtZTo6ZGVmYXVsdFRoZW1lKCktPnN5c3RlbUZvbnQoQ1NTVmFsdWVX
ZWJraXRDb250cm9sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBmb250RGVzY3JpcHRpb24pOworCisgICAgLy8gVXNlIGEgc21hbGxlciBmb250IHNpemUgdG8g
bWF0Y2ggSUUvRmlyZWZveC4KKyAgICAvLyBGSVhNRTogaHR0cDovL2NyYnVnLmNvbS83Mzc2IHVz
ZSB0aGUgc3lzdGVtIHNpemUgaW5zdGVhZCBvZiBhCisgICAgLy8gICAgICAgIGZpeGVkIGZvbnQg
c2l6ZSB2YWx1ZS4KKyAgICBmb250RGVzY3JpcHRpb24uc2V0Q29tcHV0ZWRTaXplKDEyLjApOwor
ICAgIEZvbnQgZm9udChmb250RGVzY3JpcHRpb24sIDAsIDApOworICAgIGZvbnQudXBkYXRlKHRl
eHRGaWVsZC0+ZG9jdW1lbnQoKS0+c3R5bGVTZWxlY3RvcigpLT5mb250U2VsZWN0b3IoKSk7Cisg
ICAgLy8gVGhlIGRpcmVjdGlvbiBvZiB0ZXh0IGluIHBvcHVwIG1lbnUgaXMgc2V0IHRoZSBzYW1l
IGFzIHRoZSBkaXJlY3Rpb24gb2YKKyAgICAvLyB0aGUgaW5wdXQgZWxlbWVudDogdGV4dEZpZWxk
LgorICAgIG1fc3R5bGUuc2V0KG5ldyBQb3B1cE1lbnVTdHlsZShDb2xvcjo6YmxhY2ssIENvbG9y
Ojp3aGl0ZSwgZm9udCwgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
TGVuZ3RoKFdlYkNvcmU6OkZpeGVkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgdGV4dEZpZWxkLT5yZW5kZXJlcigpLT5zdHlsZSgpLT5kaXJlY3Rpb24oKSkpOworfQorCit2
b2lkIFN1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50OjpzZXRJbml0aWFsU3VnZ2VzdGlvbigpCit7
CisgICAgaWYgKCFnZXRTdWdnZXN0aW9uc0NvdW50KCkgfHwgIW1fdGV4dEZpZWxkLT5uYW1lKCku
bGVuZ3RoKCkgfHwgIW1fdHlwZWRGaWVsZFZhbHVlLmxlbmd0aCgpKQorICAgICAgICByZXR1cm47
CisKKyAgICBpbnQgbmV3SW5kZXggPSBtX3NlbGVjdGVkSW5kZXggPj0gMCA/IG1fc2VsZWN0ZWRJ
bmRleCA6IDA7CisgICAgY29uc3QgU3RyaW5nJiBzdWdnZXN0aW9uID0gZ2V0U3VnZ2VzdGlvbihu
ZXdJbmRleCk7CisgICAgYm9vbCBoYXNQcmV2aW91c1ZhbHVlID0gbV9sYXN0RmllbGRWYWx1ZXMt
PmNvbnRhaW5zKG1fdGV4dEZpZWxkLT5uYW1lKCkpOworCisgICAgU3RyaW5nIHByZXZWYWx1ZTsK
KyAgICBpZiAoaGFzUHJldmlvdXNWYWx1ZSkKKyAgICAgICAgcHJldlZhbHVlID0gbV9sYXN0Rmll
bGRWYWx1ZXMtPmdldChtX3RleHRGaWVsZC0+bmFtZSgpKTsKKworICAgIGlmICghaGFzUHJldmlv
dXNWYWx1ZSB8fCBtX3R5cGVkRmllbGRWYWx1ZS5sZW5ndGgoKSA+IG1fbGFzdEZpZWxkVmFsdWVz
LT5nZXQobV90ZXh0RmllbGQtPm5hbWUoKSkubGVuZ3RoKCkpIHsKKyAgICAgICAgaWYgKHN1Z2dl
c3Rpb24uc3RhcnRzV2l0aChtX3R5cGVkRmllbGRWYWx1ZSkpCisgICAgICAgICAgICBtX3NlbGVj
dGVkSW5kZXggPSBuZXdJbmRleDsKKworICAgICAgICBpbnQgc3RhcnQgPSAwOworICAgICAgICBT
dHJpbmcgbmV3U3VnZ2VzdGlvbiA9IHN1Z2dlc3Rpb247CisgICAgICAgIGlmIChzdWdnZXN0aW9u
LnN0YXJ0c1dpdGgobV90eXBlZEZpZWxkVmFsdWUsIGZhbHNlKSkgeworICAgICAgICAgICAgbmV3
U3VnZ2VzdGlvbiA9IG1fdHlwZWRGaWVsZFZhbHVlOworICAgICAgICAgICAgaWYgKHN1Z2dlc3Rp
b24ubGVuZ3RoKCkgPiBtX3R5cGVkRmllbGRWYWx1ZS5sZW5ndGgoKSkgeworICAgICAgICAgICAg
ICAgIG5ld1N1Z2dlc3Rpb24uYXBwZW5kKHN1Z2dlc3Rpb24uc3Vic3RyaW5nKG1fdHlwZWRGaWVs
ZFZhbHVlLmxlbmd0aCgpLAorICAgICAgICAgICAgICAgICAgICBzdWdnZXN0aW9uLmxlbmd0aCgp
IC0gbV90eXBlZEZpZWxkVmFsdWUubGVuZ3RoKCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgIHN0YXJ0ID0gbV90eXBlZEZpZWxkVmFsdWUubGVuZ3RoKCk7CisgICAgICAgIH0KKworICAg
ICAgICBtX3RleHRGaWVsZC0+c2V0U3VnZ2VzdGVkVmFsdWUobmV3U3VnZ2VzdGlvbik7CisgICAg
ICAgIG1fdGV4dEZpZWxkLT5zZXRTZWxlY3Rpb25SYW5nZShzdGFydCwgbmV3U3VnZ2VzdGlvbi5s
ZW5ndGgoKSk7CisgICAgfQorCisgICAgaWYgKGhhc1ByZXZpb3VzVmFsdWUpCisgICAgICAgIG1f
bGFzdEZpZWxkVmFsdWVzLT5zZXQobV90ZXh0RmllbGQtPm5hbWUoKSwgbV90eXBlZEZpZWxkVmFs
dWUpOworICAgIGVsc2UKKyAgICAgICAgbV9sYXN0RmllbGRWYWx1ZXMtPmFkZChtX3RleHRGaWVs
ZC0+bmFtZSgpLCBtX3R5cGVkRmllbGRWYWx1ZSk7Cit9CisKK3ZvaWQgU3VnZ2VzdGlvbnNQb3B1
cE1lbnVDbGllbnQ6OnNldFN1Z2dlc3RlZFZhbHVlKGNvbnN0IFdlYlN0cmluZyYgc3VnZ2VzdGlv
bikKK3sKKyAgICBtX3RleHRGaWVsZC0+c2V0U3VnZ2VzdGVkVmFsdWUoc3VnZ2VzdGlvbik7Cisg
ICAgbV90ZXh0RmllbGQtPnNldFNlbGVjdGlvblJhbmdlKG1fdHlwZWRGaWVsZFZhbHVlLmxlbmd0
aCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWdnZXN0aW9uLmxlbmd0
aCgpKTsKK30KKworV2ViVmlld0ltcGwqIFN1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50OjpnZXRX
ZWJWaWV3KCkgY29uc3QKK3sKKyAgICBGcmFtZSogZnJhbWUgPSBtX3RleHRGaWVsZC0+ZG9jdW1l
bnQoKS0+ZnJhbWUoKTsKKyAgICBpZiAoIWZyYW1lKQorICAgICAgICByZXR1cm4gMDsKKworICAg
IFBhZ2UqIHBhZ2UgPSBmcmFtZS0+cGFnZSgpOworICAgIGlmICghcGFnZSkKKyAgICAgICByZXR1
cm4gMDsKKworICAgIHJldHVybiBzdGF0aWNfY2FzdDxDaHJvbWVDbGllbnRJbXBsKj4ocGFnZS0+
Y2hyb21lKCktPmNsaWVudCgpKS0+d2ViVmlldygpOworfQorCit9IC8vIG5hbWVzcGFjZSBXZWJL
aXQKSW5kZXg6IFdlYktpdC9jaHJvbWl1bS9zcmMvU3VnZ2VzdGlvbnNQb3B1cE1lbnVDbGllbnQu
aAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBXZWJLaXQvY2hyb21pdW0vc3JjL1N1Z2dlc3Rpb25zUG9wdXBNZW51
Q2xpZW50LmgJKHJldmlzaW9uIDApCisrKyBXZWJLaXQvY2hyb21pdW0vc3JjL1N1Z2dlc3Rpb25z
UG9wdXBNZW51Q2xpZW50LmgJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMTE3IEBACisvKgorICog
Q29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgor
ICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0
aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhh
dCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0
IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3Ry
aWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRo
ZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9y
IHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQg
c3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAq
ICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5H
LCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNI
QU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBE
SVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBD
T05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRB
TCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNM
VURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUg
R09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1Ig
QlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVP
UlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBP
UiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElO
IEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURW
SVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUg
IlBvcHVwTWVudUNsaWVudC5oIgorCisjaWZuZGVmIFN1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50
X2gKKyNkZWZpbmUgU3VnZ2VzdGlvbnNQb3B1cE1lbnVDbGllbnRfaAorCituYW1lc3BhY2UgV2Vi
Q29yZSB7CitjbGFzcyBIVE1MSW5wdXRFbGVtZW50OworY2xhc3MgUG9wdXBNZW51U3R5bGU7Citj
bGFzcyBSZW5kZXJTdHlsZTsKK30KKworbmFtZXNwYWNlIFdlYktpdCB7CitjbGFzcyBXZWJTdHJp
bmc7CitjbGFzcyBXZWJWaWV3SW1wbDsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBjbGFzcyBXZWJW
ZWN0b3I7CisKKy8vIFRoZSBTdWdnZXN0aW9ucyBwb3B1cCBtZW51IGNsaWVudCwgdXNlZCB0byBk
aXNwbGF5IGEgbGlzdCBvZiBzdWdnZXN0aW9ucy4KK2NsYXNzIFN1Z2dlc3Rpb25zUG9wdXBNZW51
Q2xpZW50IDogcHVibGljIFdlYkNvcmU6OlBvcHVwTWVudUNsaWVudCB7CitwdWJsaWM6CisgICAg
U3VnZ2VzdGlvbnNQb3B1cE1lbnVDbGllbnQoKTsKKyAgICB2aXJ0dWFsIH5TdWdnZXN0aW9uc1Bv
cHVwTWVudUNsaWVudCgpOworCisgICAgLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIHN1Z2dlc3Rp
b25zIGF2YWlsYWJsZS4KKyAgICB2aXJ0dWFsIHVuc2lnbmVkIGdldFN1Z2dlc3Rpb25zQ291bnQo
KSBjb25zdCA9IDA7CisKKyAgICAvLyBSZXR1cm5zIHRoZSBzdWdnZXN0aW9uIGF0IHxsaXN0SW5k
ZXh8LgorICAgIHZpcnR1YWwgV2ViU3RyaW5nIGdldFN1Z2dlc3Rpb24odW5zaWduZWQgbGlzdElu
ZGV4KSBjb25zdCA9IDA7CisKKyAgICAvLyBSZW1vdmVzIHRoZSBzdWdnZXN0aW9uIGF0IHxsaXN0
SW5kZXh8IGZyb20gdGhlIGxpc3Qgb2Ygc3VnZ2VzdGlvbnMuCisgICAgdmlydHVhbCB2b2lkIHJl
bW92ZVN1Z2dlc3Rpb25BdEluZGV4KHVuc2lnbmVkIGxpc3RJbmRleCkgPSAwOworCisgICAgLy8g
V2ViQ29yZTo6UG9wdXBNZW51Q2xpZW50IG1ldGhvZHM6CisgICAgdmlydHVhbCB2b2lkIHZhbHVl
Q2hhbmdlZCh1bnNpZ25lZCBsaXN0SW5kZXgsIGJvb2wgZmlyZUV2ZW50cyA9IHRydWUpOworICAg
IHZpcnR1YWwgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKHVuc2lnbmVkIGxpc3RJbmRleCwgYm9vbCBm
aXJlRXZlbnRzID0gdHJ1ZSk7CisgICAgdmlydHVhbCBXZWJDb3JlOjpTdHJpbmcgaXRlbVRleHQo
dW5zaWduZWQgbGlzdEluZGV4KSBjb25zdDsKKyAgICB2aXJ0dWFsIFdlYkNvcmU6OlN0cmluZyBp
dGVtVG9vbFRpcCh1bnNpZ25lZCBsYXN0SW5kZXgpIGNvbnN0IHsgcmV0dXJuIFdlYkNvcmU6OlN0
cmluZygpOyB9CisgICAgdmlydHVhbCBib29sIGl0ZW1Jc0VuYWJsZWQodW5zaWduZWQgbGlzdElu
ZGV4KSBjb25zdCB7IHJldHVybiB0cnVlOyB9CisgICAgdmlydHVhbCBXZWJDb3JlOjpQb3B1cE1l
bnVTdHlsZSBpdGVtU3R5bGUodW5zaWduZWQgbGlzdEluZGV4KSBjb25zdDsKKyAgICB2aXJ0dWFs
IFdlYkNvcmU6OlBvcHVwTWVudVN0eWxlIG1lbnVTdHlsZSgpIGNvbnN0OworICAgIHZpcnR1YWwg
aW50IGNsaWVudEluc2V0TGVmdCgpIGNvbnN0IHsgcmV0dXJuIDA7IH0KKyAgICB2aXJ0dWFsIGlu
dCBjbGllbnRJbnNldFJpZ2h0KCkgY29uc3QgeyByZXR1cm4gMDsgfQorICAgIHZpcnR1YWwgaW50
IGNsaWVudFBhZGRpbmdMZWZ0KCkgY29uc3Q7CisgICAgdmlydHVhbCBpbnQgY2xpZW50UGFkZGlu
Z1JpZ2h0KCkgY29uc3Q7CisgICAgdmlydHVhbCBpbnQgbGlzdFNpemUoKSBjb25zdCB7IHJldHVy
biBnZXRTdWdnZXN0aW9uc0NvdW50KCk7IH0KKyAgICB2aXJ0dWFsIGludCBzZWxlY3RlZEluZGV4
KCkgY29uc3QgeyByZXR1cm4gbV9zZWxlY3RlZEluZGV4OyB9CisgICAgdmlydHVhbCB2b2lkIHBv
cHVwRGlkSGlkZSgpOworICAgIHZpcnR1YWwgYm9vbCBpdGVtSXNTZXBhcmF0b3IodW5zaWduZWQg
bGlzdEluZGV4KSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorICAgIHZpcnR1YWwgYm9vbCBpdGVt
SXNMYWJlbCh1bnNpZ25lZCBsaXN0SW5kZXgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgICAg
dmlydHVhbCBib29sIGl0ZW1Jc1NlbGVjdGVkKHVuc2lnbmVkIGxpc3RJbmRleCkgY29uc3QgeyBy
ZXR1cm4gZmFsc2U7IH0KKyAgICB2aXJ0dWFsIGJvb2wgc2hvdWxkUG9wT3ZlcigpIGNvbnN0IHsg
cmV0dXJuIGZhbHNlOyB9CisgICAgdmlydHVhbCBib29sIHZhbHVlU2hvdWxkQ2hhbmdlT25Ib3RU
cmFjaygpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgICAgdmlydHVhbCB2b2lkIHNldFRleHRG
cm9tSXRlbSh1bnNpZ25lZCBsaXN0SW5kZXgpOworICAgIHZpcnR1YWwgV2ViQ29yZTo6Rm9udFNl
bGVjdG9yKiBmb250U2VsZWN0b3IoKSBjb25zdDsKKyAgICB2aXJ0dWFsIFdlYkNvcmU6Okhvc3RX
aW5kb3cqIGhvc3RXaW5kb3coKSBjb25zdDsKKyAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8V2ViQ29y
ZTo6U2Nyb2xsYmFyPiBjcmVhdGVTY3JvbGxiYXIoCisgICAgICAgIFdlYkNvcmU6OlNjcm9sbGJh
ckNsaWVudCogY2xpZW50LAorICAgICAgICBXZWJDb3JlOjpTY3JvbGxiYXJPcmllbnRhdGlvbiBv
cmllbnRhdGlvbiwKKyAgICAgICAgV2ViQ29yZTo6U2Nyb2xsYmFyQ29udHJvbFNpemUgc2l6ZSk7
CisKK3Byb3RlY3RlZDoKKyAgICB2b2lkIGluaXRpYWxpemUoV2ViQ29yZTo6SFRNTElucHV0RWxl
bWVudCogdGV4dEZpZWxkLAorICAgICAgICAgICAgICAgICAgICBpbnQgZGVmYXVsdFN1Z2dlc3Rp
b25JbmRleCk7CisgICAgdm9pZCBzZXRJbml0aWFsU3VnZ2VzdGlvbigpOworCisgICAgaW50IGdl
dFNlbGVjdGVkSW5kZXgoKSBjb25zdCB7IHJldHVybiBtX3NlbGVjdGVkSW5kZXg7IH0KKyAgICB2
b2lkIHNldFNlbGVjdGVkSW5kZXgoaW50IGluZGV4KSB7IG1fc2VsZWN0ZWRJbmRleCA9IGluZGV4
OyB9CisKKyAgICB2b2lkIHNldFN1Z2dlc3RlZFZhbHVlKGNvbnN0IFdlYlN0cmluZyYgc3VnZ2Vz
dGlvbik7CisKKyAgICBXZWJWaWV3SW1wbCogZ2V0V2ViVmlldygpIGNvbnN0OworICAgIFdlYkNv
cmU6OkhUTUxJbnB1dEVsZW1lbnQqIGdldFRleHRGaWVsZCgpIGNvbnN0IHsgcmV0dXJuIG1fdGV4
dEZpZWxkLmdldCgpOyB9CisKK3ByaXZhdGU6CisgICAgV2ViQ29yZTo6UmVuZGVyU3R5bGUqIHRl
eHRGaWVsZFN0eWxlKCkgY29uc3Q7CisgICAgdm9pZCByZXNldExhc3RTdWdnZXN0aW9uKCk7CisK
KyAgICBSZWZQdHI8V2ViQ29yZTo6SFRNTElucHV0RWxlbWVudD4gbV90ZXh0RmllbGQ7CisgICAg
aW50IG1fc2VsZWN0ZWRJbmRleDsKKyAgICBXZWJDb3JlOjpTdHJpbmcgbV90eXBlZEZpZWxkVmFs
dWU7CisgICAgT3duUHRyPFdlYkNvcmU6OlBvcHVwTWVudVN0eWxlPiBtX3N0eWxlOworICAgIHR5
cGVkZWYgSGFzaE1hcDxXZWJDb3JlOjpTdHJpbmcsIFdlYkNvcmU6OlN0cmluZz4gRmllbGRWYWx1
ZXNNYXA7CisgICAgT3duUHRyPEZpZWxkVmFsdWVzTWFwPiBtX2xhc3RGaWVsZFZhbHVlczsKK307
CisKK30gLy8gbmFtZXNwYWNlIFdlYktpdAorCisjZW5kaWYKClByb3BlcnR5IGNoYW5nZXMgb246
IFdlYktpdC9jaHJvbWl1bS9zcmMvU3VnZ2VzdGlvbnNQb3B1cE1lbnVDbGllbnQuaApfX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fCkFkZGVkOiBzdm46ZW9sLXN0eWxlCiAgICsgTEYKCkluZGV4OiBXZWJLaXQvY2hyb21pdW0v
c3JjL1dlYlZpZXdJbXBsLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQvY2hyb21pdW0vc3JjL1dl
YlZpZXdJbXBsLmNwcAkocmV2aXNpb24gNTQ1MDEpCisrKyBXZWJLaXQvY2hyb21pdW0vc3JjL1dl
YlZpZXdJbXBsLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzEsNiArMzEsNyBAQAogI2luY2x1ZGUg
ImNvbmZpZy5oIgogI2luY2x1ZGUgIldlYlZpZXdJbXBsLmgiCiAKKyNpbmNsdWRlICJBdXRvRmls
bFBvcHVwTWVudUNsaWVudC5oIgogI2luY2x1ZGUgIkF1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVu
dC5oIgogI2luY2x1ZGUgIkFYT2JqZWN0Q2FjaGUuaCIKICNpbmNsdWRlICJDaHJvbWUuaCIKQEAg
LTI0MCw2ICsyNDEsOCBAQCBXZWJWaWV3SW1wbDo6V2ViVmlld0ltcGwoV2ViVmlld0NsaWVudCog
CiAgICAgLCBtX29wZXJhdGlvbnNBbGxvd2VkKFdlYkRyYWdPcGVyYXRpb25Ob25lKQogICAgICwg
bV9kcmFnT3BlcmF0aW9uKFdlYkRyYWdPcGVyYXRpb25Ob25lKQogICAgICwgbV9zdWdnZXN0aW9u
c1BvcHVwU2hvd2luZyhmYWxzZSkKKyAgICAsIG1fc3VnZ2VzdGlvbnNQb3B1cENsaWVudCgwKQor
ICAgICwgbV9zdWdnZXN0aW9uc1BvcHVwKDApCiAgICAgLCBtX2lzVHJhbnNwYXJlbnQoZmFsc2Up
CiAgICAgLCBtX3RhYnNUb0xpbmtzKGZhbHNlKQogewpAQCAtNDY4LDcgKzQ3MSw3IEBAIGJvb2wg
V2ViVmlld0ltcGw6OmtleUV2ZW50KGNvbnN0IFdlYktleWIKICAgICAvLyBldmVudC4KICAgICBt
X3N1cHByZXNzTmV4dEtleXByZXNzRXZlbnQgPSBmYWxzZTsKIAotICAgIC8vIEdpdmUgYXV0b2Nv
bXBsZXRlIGEgY2hhbmNlIHRvIGNvbnN1bWUgdGhlIGtleSBldmVudHMgaXQgaXMgaW50ZXJlc3Rl
ZCBpbi4KKyAgICAvLyBHaXZlIEF1dG9jb21wbGV0ZSBhIGNoYW5jZSB0byBjb25zdW1lIHRoZSBr
ZXkgZXZlbnRzIGl0IGlzIGludGVyZXN0ZWQgaW4uCiAgICAgaWYgKGF1dG9jb21wbGV0ZUhhbmRs
ZUtleUV2ZW50KGV2ZW50KSkKICAgICAgICAgcmV0dXJuIHRydWU7CiAKQEAgLTU0MSw3ICs1NDQs
NyBAQCBib29sIFdlYlZpZXdJbXBsOjphdXRvY29tcGxldGVIYW5kbGVLZXlFCiAgICAgICAgIG1f
Y2xpZW50LT5yZW1vdmVBdXRvZmlsbFN1Z2dlc3Rpb25zKG5hbWUsIHZhbHVlKTsKICAgICAgICAg
Ly8gVXBkYXRlIHRoZSBlbnRyaWVzIGluIHRoZSBjdXJyZW50bHkgc2hvd2luZyBwb3B1cCB0byBy
ZWZsZWN0IHRoZQogICAgICAgICAvLyBkZWxldGlvbi4KLSAgICAgICAgbV9hdXRvY29tcGxldGVQ
b3B1cENsaWVudC0+cmVtb3ZlSXRlbUF0SW5kZXgoc2VsZWN0ZWRJbmRleCk7CisgICAgICAgIG1f
YXV0b2NvbXBsZXRlUG9wdXBDbGllbnQtPnJlbW92ZVN1Z2dlc3Rpb25BdEluZGV4KHNlbGVjdGVk
SW5kZXgpOwogICAgICAgICByZWZyZXNoU3VnZ2VzdGlvbnNQb3B1cCgpOwogICAgICAgICByZXR1
cm4gZmFsc2U7CiAgICAgfQpAQCAtMTU1OCw1OCArMTU2MSwxMTggQEAgdm9pZCBXZWJWaWV3SW1w
bDo6YXBwbHlBdXRvZmlsbFN1Z2dlc3RpbwogICAgIGNvbnN0IFdlYlZlY3RvcjxXZWJTdHJpbmc+
JiBzdWdnZXN0aW9ucywKICAgICBpbnQgZGVmYXVsdFN1Z2dlc3Rpb25JbmRleCkKIHsKLSAgICBp
ZiAoIW1fcGFnZS5nZXQoKSB8fCBzdWdnZXN0aW9ucy5pc0VtcHR5KCkpIHsKKyAgICBhcHBseUF1
dG9jb21wbGV0ZVN1Z2dlc3Rpb25zKG5vZGUsIHN1Z2dlc3Rpb25zLCBkZWZhdWx0U3VnZ2VzdGlv
bkluZGV4KTsKK30KKwordm9pZCBXZWJWaWV3SW1wbDo6YXBwbHlBdXRvRmlsbFN1Z2dlc3Rpb25z
KAorICAgIGNvbnN0IFdlYk5vZGUmIG5vZGUsCisgICAgY29uc3QgV2ViVmVjdG9yPFdlYlN0cmlu
Zz4mIG5hbWVzLAorICAgIGNvbnN0IFdlYlZlY3RvcjxXZWJTdHJpbmc+JiBsYWJlbHMsCisgICAg
aW50IGRlZmF1bHRTdWdnZXN0aW9uSW5kZXgpCit7CisgICAgQVNTRVJUKG5hbWVzLnNpemUoKSA9
PSBsYWJlbHMuc2l6ZSgpKTsKKyAgICBBU1NFUlQoZGVmYXVsdFN1Z2dlc3Rpb25JbmRleCA8IHN0
YXRpY19jYXN0PGludD4obmFtZXMuc2l6ZSgpKSk7CisKKyAgICBpZiAobmFtZXMuaXNFbXB0eSgp
KSB7CiAgICAgICAgIGhpZGVTdWdnZXN0aW9uc1BvcHVwKCk7CiAgICAgICAgIHJldHVybjsKICAg
ICB9CiAKKyAgICBSZWZQdHI8Tm9kZT4gZm9jdXNlZE5vZGUgPSBmb2N1c2VkV2ViQ29yZU5vZGUo
KTsKKyAgICAvLyBJZiB0aGUgbm9kZSBmb3Igd2hpY2ggd2UgcXVlcmllZCB0aGUgQXV0b0ZpbGwg
c3VnZ2VzdGlvbnMgaXMgbm90IHRoZQorICAgIC8vIGZvY3VzZWQgbm9kZSwgdGhlbiB3ZSBoYXZl
IG5vdGhpbmcgdG8gZG8uICBGSVhNRTogYWxzbyBjaGVjayB0aGUKKyAgICAvLyBjYXJldCBpcyBh
dCB0aGUgZW5kIGFuZCB0aGF0IHRoZSB0ZXh0IGhhcyBub3QgY2hhbmdlZC4KKyAgICBpZiAoIWZv
Y3VzZWROb2RlIHx8IGZvY3VzZWROb2RlICE9IFBhc3NSZWZQdHI8Tm9kZT4obm9kZSkpIHsKKyAg
ICAgICAgaGlkZVN1Z2dlc3Rpb25zUG9wdXAoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKwor
ICAgIEhUTUxJbnB1dEVsZW1lbnQqIGlucHV0RWxlbSA9CisgICAgICAgIHN0YXRpY19jYXN0PEhU
TUxJbnB1dEVsZW1lbnQqPihmb2N1c2VkTm9kZS5nZXQoKSk7CisKKyAgICAvLyBUaGUgZmlyc3Qg
dGltZSB0aGUgQXV0b0ZpbGwgcG9wdXAgaXMgc2hvd24gd2UnbGwgY3JlYXRlIHRoZSBjbGllbnQg
YW5kCisgICAgLy8gdGhlIHBvcHVwLgorICAgIGlmICghbV9hdXRvRmlsbFBvcHVwQ2xpZW50Lmdl
dCgpKQorICAgICAgICBtX2F1dG9GaWxsUG9wdXBDbGllbnQuc2V0KG5ldyBBdXRvRmlsbFBvcHVw
TWVudUNsaWVudCk7CisKKyAgICBtX2F1dG9GaWxsUG9wdXBDbGllbnQtPmluaXRpYWxpemUoaW5w
dXRFbGVtLCBuYW1lcywgbGFiZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBkZWZhdWx0U3VnZ2VzdGlvbkluZGV4KTsKKworICAgIGlmIChtX3N1Z2dlc3Rpb25zUG9w
dXBDbGllbnQgIT0gbV9hdXRvRmlsbFBvcHVwQ2xpZW50LmdldCgpKSB7CisgICAgICAgIGhpZGVT
dWdnZXN0aW9uc1BvcHVwKCk7CisgICAgICAgIG1fc3VnZ2VzdGlvbnNQb3B1cENsaWVudCA9IG1f
YXV0b0ZpbGxQb3B1cENsaWVudC5nZXQoKTsKKyAgICB9CisKKyAgICBpZiAoIW1fYXV0b0ZpbGxQ
b3B1cC5nZXQoKSkgeworICAgICAgICBtX2F1dG9GaWxsUG9wdXAgPSBQb3B1cENvbnRhaW5lcjo6
Y3JlYXRlKG1fc3VnZ2VzdGlvbnNQb3B1cENsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBzdWdnZXN0aW9uc1BvcHVwU2V0dGluZ3MpOworICAg
IH0KKworICAgIGlmIChtX3N1Z2dlc3Rpb25zUG9wdXAgIT0gbV9hdXRvRmlsbFBvcHVwLmdldCgp
KQorICAgICAgICBtX3N1Z2dlc3Rpb25zUG9wdXAgPSBtX2F1dG9GaWxsUG9wdXAuZ2V0KCk7CisK
KyAgICBpZiAobV9zdWdnZXN0aW9uc1BvcHVwU2hvd2luZykgeworICAgICAgICBtX2F1dG9GaWxs
UG9wdXBDbGllbnQtPnNldFN1Z2dlc3Rpb25zKG5hbWVzLCBsYWJlbHMpOworICAgICAgICByZWZy
ZXNoU3VnZ2VzdGlvbnNQb3B1cCgpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1fc3VnZ2VzdGlv
bnNQb3B1cC0+c2hvdyhmb2N1c2VkTm9kZS0+Z2V0UmVjdCgpLAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgZm9jdXNlZE5vZGUtPm93bmVyRG9jdW1lbnQoKS0+dmlldygpLCAwKTsK
KyAgICAgICAgbV9zdWdnZXN0aW9uc1BvcHVwU2hvd2luZyA9IHRydWU7CisgICAgfQorfQorCit2
b2lkIFdlYlZpZXdJbXBsOjphcHBseUF1dG9jb21wbGV0ZVN1Z2dlc3Rpb25zKAorICAgIGNvbnN0
IFdlYk5vZGUmIG5vZGUsCisgICAgY29uc3QgV2ViVmVjdG9yPFdlYlN0cmluZz4mIHN1Z2dlc3Rp
b25zLAorICAgIGludCBkZWZhdWx0U3VnZ2VzdGlvbkluZGV4KQorewogICAgIEFTU0VSVChkZWZh
dWx0U3VnZ2VzdGlvbkluZGV4IDwgc3RhdGljX2Nhc3Q8aW50PihzdWdnZXN0aW9ucy5zaXplKCkp
KTsKIAotICAgIGlmIChSZWZQdHI8RnJhbWU+IGZvY3VzZWQgPSBtX3BhZ2UtPmZvY3VzQ29udHJv
bGxlcigpLT5mb2N1c2VkRnJhbWUoKSkgewotICAgICAgICBSZWZQdHI8RG9jdW1lbnQ+IGRvY3Vt
ZW50ID0gZm9jdXNlZC0+ZG9jdW1lbnQoKTsKLSAgICAgICAgaWYgKCFkb2N1bWVudC5nZXQoKSkg
ewotICAgICAgICAgICAgaGlkZVN1Z2dlc3Rpb25zUG9wdXAoKTsKLSAgICAgICAgICAgIHJldHVy
bjsKLSAgICAgICAgfQorICAgIGlmICghbV9wYWdlLmdldCgpIHx8IHN1Z2dlc3Rpb25zLmlzRW1w
dHkoKSkgeworICAgICAgICBoaWRlU3VnZ2VzdGlvbnNQb3B1cCgpOworICAgICAgICByZXR1cm47
CisgICAgfQogCi0gICAgICAgIFJlZlB0cjxOb2RlPiBmb2N1c2VkTm9kZSA9IGRvY3VtZW50LT5m
b2N1c2VkTm9kZSgpOwotICAgICAgICAvLyBJZiB0aGUgbm9kZSBmb3Igd2hpY2ggd2UgcXVlcmll
ZCB0aGUgYXV0b2ZpbGwgc3VnZ2VzdGlvbnMgaXMgbm90IHRoZQotICAgICAgICAvLyBmb2N1c2Vk
IG5vZGUsIHRoZW4gd2UgaGF2ZSBub3RoaW5nIHRvIGRvLiAgRklYTUU6IGFsc28gY2hlY2sgdGhl
Ci0gICAgICAgIC8vIGNhcnJldCBpcyBhdCB0aGUgZW5kIGFuZCB0aGF0IHRoZSB0ZXh0IGhhcyBu
b3QgY2hhbmdlZC4KLSAgICAgICAgaWYgKCFmb2N1c2VkTm9kZS5nZXQoKSB8fCBmb2N1c2VkTm9k
ZSAhPSBQYXNzUmVmUHRyPE5vZGU+KG5vZGUpKSB7Ci0gICAgICAgICAgICBoaWRlU3VnZ2VzdGlv
bnNQb3B1cCgpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9CisgICAgUmVmUHRyPE5v
ZGU+IGZvY3VzZWROb2RlID0gZm9jdXNlZFdlYkNvcmVOb2RlKCk7CisgICAgLy8gSWYgdGhlIG5v
ZGUgZm9yIHdoaWNoIHdlIHF1ZXJpZWQgdGhlIEF1dG9jb21wbGV0ZSBzdWdnZXN0aW9ucyBpcyBu
b3QgdGhlCisgICAgLy8gZm9jdXNlZCBub2RlLCB0aGVuIHdlIGhhdmUgbm90aGluZyB0byBkby4g
IEZJWE1FOiBhbHNvIGNoZWNrIHRoZQorICAgIC8vIGNhcmV0IGlzIGF0IHRoZSBlbmQgYW5kIHRo
YXQgdGhlIHRleHQgaGFzIG5vdCBjaGFuZ2VkLgorICAgIGlmICghZm9jdXNlZE5vZGUgfHwgZm9j
dXNlZE5vZGUgIT0gUGFzc1JlZlB0cjxOb2RlPihub2RlKSkgeworICAgICAgICBoaWRlU3VnZ2Vz
dGlvbnNQb3B1cCgpOworICAgICAgICByZXR1cm47CisgICAgfQogCi0gICAgICAgIGlmICghZm9j
dXNlZE5vZGUtPmhhc1RhZ05hbWUoSFRNTE5hbWVzOjppbnB1dFRhZykpIHsKLSAgICAgICAgICAg
IEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Cisg
ICAgSFRNTElucHV0RWxlbWVudCogaW5wdXRFbGVtID0KKyAgICAgICAgc3RhdGljX2Nhc3Q8SFRN
TElucHV0RWxlbWVudCo+KGZvY3VzZWROb2RlLmdldCgpKTsKIAotICAgICAgICBIVE1MSW5wdXRF
bGVtZW50KiBpbnB1dEVsZW0gPQotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8SFRNTElucHV0RWxl
bWVudCo+KGZvY3VzZWROb2RlLmdldCgpKTsKKyAgICAvLyBUaGUgZmlyc3QgdGltZSB0aGUgQXV0
b2NvbXBsZXRlIGlzIHNob3duIHdlJ2xsIGNyZWF0ZSB0aGUgY2xpZW50IGFuZCB0aGUKKyAgICAv
LyBwb3B1cC4KKyAgICBpZiAoIW1fYXV0b2NvbXBsZXRlUG9wdXBDbGllbnQuZ2V0KCkpCisgICAg
ICAgIG1fYXV0b2NvbXBsZXRlUG9wdXBDbGllbnQuc2V0KG5ldyBBdXRvY29tcGxldGVQb3B1cE1l
bnVDbGllbnQpOwogCi0gICAgICAgIC8vIFRoZSBmaXJzdCB0aW1lIHRoZSBzdWdnZXN0aW9ucyBw
b3B1cCBpcyBzaG93biB3ZSdsbCBjcmVhdGUgdGhlIGNsaWVudAotICAgICAgICAvLyBhbmQgdGhl
IHBvcHVwLgotICAgICAgICBpZiAoIW1fYXV0b2NvbXBsZXRlUG9wdXBDbGllbnQuZ2V0KCkpCi0g
ICAgICAgICAgICBtX2F1dG9jb21wbGV0ZVBvcHVwQ2xpZW50LnNldChuZXcgQXV0b2NvbXBsZXRl
UG9wdXBNZW51Q2xpZW50KHRoaXMpKTsKLSAgICAgICAgbV9hdXRvY29tcGxldGVQb3B1cENsaWVu
dC0+aW5pdGlhbGl6ZShpbnB1dEVsZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgc3VnZ2VzdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgZGVmYXVsdFN1Z2dlc3Rpb25JbmRleCk7Ci0gICAgICAgIGlmICgh
bV9zdWdnZXN0aW9uc1BvcHVwLmdldCgpKSB7Ci0gICAgICAgICAgICBtX3N1Z2dlc3Rpb25zUG9w
dXAgPQotICAgICAgICAgICAgICAgIFBvcHVwQ29udGFpbmVyOjpjcmVhdGUobV9hdXRvY29tcGxl
dGVQb3B1cENsaWVudC5nZXQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIHN1Z2dlc3Rpb25zUG9wdXBTZXR0aW5ncyk7Ci0gICAgICAgIH0KKyAgICBtX2F1dG9jb21w
bGV0ZVBvcHVwQ2xpZW50LT5pbml0aWFsaXplKGlucHV0RWxlbSwgc3VnZ2VzdGlvbnMsCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0U3VnZ2VzdGlvbklu
ZGV4KTsKIAotICAgICAgICBpZiAobV9zdWdnZXN0aW9uc1BvcHVwU2hvd2luZykgewotICAgICAg
ICAgICAgbV9hdXRvY29tcGxldGVQb3B1cENsaWVudC0+c2V0U3VnZ2VzdGlvbnMoc3VnZ2VzdGlv
bnMpOwotICAgICAgICAgICAgcmVmcmVzaFN1Z2dlc3Rpb25zUG9wdXAoKTsKLSAgICAgICAgfSBl
bHNlIHsKLSAgICAgICAgICAgIG1fc3VnZ2VzdGlvbnNQb3B1cC0+c2hvdyhmb2N1c2VkTm9kZS0+
Z2V0UmVjdCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvY3VzZWRO
b2RlLT5vd25lckRvY3VtZW50KCktPnZpZXcoKSwgMCk7Ci0gICAgICAgICAgICBtX3N1Z2dlc3Rp
b25zUG9wdXBTaG93aW5nID0gdHJ1ZTsKLSAgICAgICAgfQorICAgIGlmIChtX3N1Z2dlc3Rpb25z
UG9wdXBDbGllbnQgIT0gbV9hdXRvY29tcGxldGVQb3B1cENsaWVudC5nZXQoKSkgeworICAgICAg
ICBoaWRlU3VnZ2VzdGlvbnNQb3B1cCgpOworICAgICAgICBtX3N1Z2dlc3Rpb25zUG9wdXBDbGll
bnQgPSBtX2F1dG9jb21wbGV0ZVBvcHVwQ2xpZW50LmdldCgpOworICAgIH0KKworICAgIGlmICgh
bV9hdXRvY29tcGxldGVQb3B1cC5nZXQoKSkgeworICAgICAgICBtX2F1dG9jb21wbGV0ZVBvcHVw
ID0gUG9wdXBDb250YWluZXI6OmNyZWF0ZShtX3N1Z2dlc3Rpb25zUG9wdXBDbGllbnQsCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Z2dlc3Rp
b25zUG9wdXBTZXR0aW5ncyk7CisgICAgfQorCisgICAgaWYgKG1fc3VnZ2VzdGlvbnNQb3B1cCAh
PSBtX2F1dG9jb21wbGV0ZVBvcHVwLmdldCgpKQorICAgICAgICBtX3N1Z2dlc3Rpb25zUG9wdXAg
PSBtX2F1dG9jb21wbGV0ZVBvcHVwLmdldCgpOworCisgICAgaWYgKG1fc3VnZ2VzdGlvbnNQb3B1
cFNob3dpbmcpIHsKKyAgICAgICAgbV9hdXRvY29tcGxldGVQb3B1cENsaWVudC0+c2V0U3VnZ2Vz
dGlvbnMoc3VnZ2VzdGlvbnMpOworICAgICAgICByZWZyZXNoU3VnZ2VzdGlvbnNQb3B1cCgpOwor
ICAgIH0gZWxzZSB7CisgICAgICAgIG1fc3VnZ2VzdGlvbnNQb3B1cC0+c2hvdyhmb2N1c2VkTm9k
ZS0+Z2V0UmVjdCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9jdXNlZE5v
ZGUtPm93bmVyRG9jdW1lbnQoKS0+dmlldygpLCAwKTsKKyAgICAgICAgbV9zdWdnZXN0aW9uc1Bv
cHVwU2hvd2luZyA9IHRydWU7CiAgICAgfQogfQogCkluZGV4OiBXZWJLaXQvY2hyb21pdW0vc3Jj
L1dlYlZpZXdJbXBsLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0L2Nocm9taXVtL3NyYy9XZWJWaWV3
SW1wbC5oCShyZXZpc2lvbiA1NDUwMSkKKysrIFdlYktpdC9jaHJvbWl1bS9zcmMvV2ViVmlld0lt
cGwuaAkod29ya2luZyBjb3B5KQpAQCAtNTgsNiArNTgsNyBAQCBjbGFzcyBLZXlib2FyZEV2ZW50
OwogY2xhc3MgUGFnZTsKIGNsYXNzIFBsYXRmb3JtS2V5Ym9hcmRFdmVudDsKIGNsYXNzIFBvcHVw
Q29udGFpbmVyOworY2xhc3MgUG9wdXBNZW51Q2xpZW50OwogY2xhc3MgUmFuZ2U7CiBjbGFzcyBS
ZW5kZXJUaGVtZTsKIGNsYXNzIFdpZGdldDsKQEAgLTY1LDcgKzY2LDkgQEAgY2xhc3MgV2lkZ2V0
OwogCiBuYW1lc3BhY2UgV2ViS2l0IHsKIGNsYXNzIEF1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVu
dDsKK2NsYXNzIEF1dG9GaWxsUG9wdXBNZW51Q2xpZW50OwogY2xhc3MgQ29udGV4dE1lbnVDbGll
bnRJbXBsOworY2xhc3MgU3VnZ2VzdGlvbnNQb3B1cE1lbnVDbGllbnQ7CiBjbGFzcyBXZWJBY2Nl
c3NpYmlsaXR5T2JqZWN0OwogY2xhc3MgV2ViRGV2VG9vbHNBZ2VudFByaXZhdGU7CiBjbGFzcyBX
ZWJGcmFtZUltcGw7CkBAIC0xNTMsNiArMTU2LDE1IEBAIHB1YmxpYzoKICAgICAgICAgY29uc3Qg
V2ViTm9kZSYsCiAgICAgICAgIGNvbnN0IFdlYlZlY3RvcjxXZWJTdHJpbmc+JiBzdWdnZXN0aW9u
cywKICAgICAgICAgaW50IGRlZmF1bHRTdWdnZXN0aW9uSW5kZXgpOworICAgIHZpcnR1YWwgdm9p
ZCBhcHBseUF1dG9GaWxsU3VnZ2VzdGlvbnMoCisgICAgICAgIGNvbnN0IFdlYk5vZGUmLAorICAg
ICAgICBjb25zdCBXZWJWZWN0b3I8V2ViU3RyaW5nPiYgbmFtZXMsCisgICAgICAgIGNvbnN0IFdl
YlZlY3RvcjxXZWJTdHJpbmc+JiBsYWJlbHMsCisgICAgICAgIGludCBkZWZhdWx0U3VnZ2VzdGlv
bkluZGV4KTsKKyAgICB2aXJ0dWFsIHZvaWQgYXBwbHlBdXRvY29tcGxldGVTdWdnZXN0aW9ucygK
KyAgICAgICAgY29uc3QgV2ViTm9kZSYsCisgICAgICAgIGNvbnN0IFdlYlZlY3RvcjxXZWJTdHJp
bmc+JiBzdWdnZXN0aW9ucywKKyAgICAgICAgaW50IGRlZmF1bHRTdWdnZXN0aW9uSW5kZXgpOwog
ICAgIHZpcnR1YWwgdm9pZCBoaWRlQXV0b2ZpbGxQb3B1cCgpOwogICAgIHZpcnR1YWwgdm9pZCBo
aWRlU3VnZ2VzdGlvbnNQb3B1cCgpOwogICAgIHZpcnR1YWwgdm9pZCBzZXRTY3JvbGxiYXJDb2xv
cnModW5zaWduZWQgaW5hY3RpdmVDb2xvciwKQEAgLTM5NSwxNiArNDA3LDI5IEBAIHByaXZhdGU6
CiAgICAgLy8gY3VycmVudCBkcm9wIHRhcmdldCBpbiB0aGlzIFdlYlZpZXcgKHRoZSBkcm9wIHRh
cmdldCBjYW4gYWNjZXB0IHRoZSBkcm9wKS4KICAgICBXZWJEcmFnT3BlcmF0aW9uIG1fZHJhZ09w
ZXJhdGlvbjsKIAotICAgIC8vIFRoZSBzdWdnZXN0aW9ucyBwb3B1cC4gIEtlcHQgYXJvdW5kIGFu
ZCByZXVzZWQgZXZlcnktdGltZSBuZXcgc3VnZ2VzdGlvbnMKLSAgICAvLyBzaG91bGQgYmUgc2hv
d24uCi0gICAgUmVmUHRyPFdlYkNvcmU6OlBvcHVwQ29udGFpbmVyPiBtX3N1Z2dlc3Rpb25zUG9w
dXA7Ci0KLSAgICAvLyBXaGV0aGVyIHRoZSBzdWdnZXN0aW9ucyBwb3B1cCBpcyBjdXJyZW50bHkg
c2hvd2luZy4KKyAgICAvLyBXaGV0aGVyIGEgc3VnZ2VzdGlvbnMgcG9wdXAgaXMgY3VycmVudGx5
IHNob3dpbmcuCiAgICAgYm9vbCBtX3N1Z2dlc3Rpb25zUG9wdXBTaG93aW5nOwogCi0gICAgLy8g
VGhlIGF1dG9jb21wbGV0ZSBjbGllbnQuCisgICAgLy8gQSBwb2ludGVyIHRvIHRoZSBjdXJyZW50
IHN1Z2dlc3Rpb25zIHBvcHVwIG1lbnUgY2xpZW50LiAgVGhpcyBjYW4gYmUKKyAgICAvLyBlaXRo
ZXIgYW4gQXV0b0ZpbGxQb3B1cE1lbnVDbGllbnQgb3IgYW4gQXV0b2NvbXBsZXRlUG9wdXBNZW51
Q2xpZW50LiAgV2UKKyAgICAvLyBkbyBub3Qgb3duIHRoaXMgcG9pbnRlci4KKyAgICBTdWdnZXN0
aW9uc1BvcHVwTWVudUNsaWVudCogbV9zdWdnZXN0aW9uc1BvcHVwQ2xpZW50OworCisgICAgLy8g
VGhlIEF1dG9GaWxsIHBvcHVwIGNsaWVudC4KKyAgICBPd25QdHI8QXV0b0ZpbGxQb3B1cE1lbnVD
bGllbnQ+IG1fYXV0b0ZpbGxQb3B1cENsaWVudDsKKworICAgIC8vIFRoZSBBdXRvY29tcGxldGUg
cG9wdXAgY2xpZW50LgogICAgIE93blB0cjxBdXRvY29tcGxldGVQb3B1cE1lbnVDbGllbnQ+IG1f
YXV0b2NvbXBsZXRlUG9wdXBDbGllbnQ7CiAKKyAgICAvLyBBIHBvaW50ZXIgdG8gdGhlIGN1cnJl
bnQgc3VnZ2VzdGlvbnMgcG9wdXAuICBXZSBkbyBub3Qgb3duIHRoaXMgcG9pbnRlci4KKyAgICBX
ZWJDb3JlOjpQb3B1cENvbnRhaW5lciogbV9zdWdnZXN0aW9uc1BvcHVwOworCisgICAgLy8gVGhl
IEF1dG9GaWxsIHN1Z2dlc3Rpb25zIHBvcHVwLgorICAgIFJlZlB0cjxXZWJDb3JlOjpQb3B1cENv
bnRhaW5lcj4gbV9hdXRvRmlsbFBvcHVwOworCisgICAgLy8gVGhlIEF1dG9Db21wbGV0ZSBzdWdn
ZXN0aW9ucyBwb3B1cC4KKyAgICBSZWZQdHI8V2ViQ29yZTo6UG9wdXBDb250YWluZXI+IG1fYXV0
b2NvbXBsZXRlUG9wdXA7CisKICAgICBPd25QdHI8V2ViRGV2VG9vbHNBZ2VudFByaXZhdGU+IG1f
ZGV2VG9vbHNBZ2VudDsKIAogICAgIC8vIFdoZXRoZXIgdGhlIHdlYnZpZXcgaXMgcmVuZGVyaW5n
IHRyYW5zcGFyZW50bHkuCg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>48451</attachid>
            <date>2010-02-09 15:54:26 -0800</date>
            <delta_ts>2010-02-09 20:48:55 -0800</delta_ts>
            <desc>[Chromium] Refactor AutocompletePopupMenuClient [try9]</desc>
            <filename>refactor9.diff</filename>
            <type>text/plain</type>
            <size>47156</size>
            <attacher name="James Hawkins">jhawkins</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYktpdC9jaHJvbWl1bS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0L2No
cm9taXVtL0NoYW5nZUxvZwkocmV2aXNpb24gNTQ1NjgpCisrKyBXZWJLaXQvY2hyb21pdW0vQ2hh
bmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMzYgQEAKKzIwMTAtMDItMDkgIEphbWVz
IEhhd2tpbnMgIDxqaGF3a2luc0BjaHJvbWl1bS5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkg
Tk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgW0Nocm9taXVtXSBSZWZhY3RvciBBdXRvY29tcGxl
dGVQb3B1cE1lbnVDbGllbnQgaW50byBhIGJhc2UgY2xhc3MsCisgICAgICAgIFN1Z2dlc3Rpb25z
UG9wdXBNZW51Q2xpZW50LCBhbmQgdHdvIGRlcml2ZWQgY2xhc3NlcywKKyAgICAgICAgQXV0b2Nv
bXBsZXRlUG9wdXBNZW51Q2xpZW50IGFuZCBBdXRvRmlsbFBvcHVwTWVudUNsaWVudC4gIEN1cnJl
bnRseQorICAgICAgICB0aGUgYmVoYXZpb3Igb2Ygc3VnZ2VzdGlvbnMgcG9wdXBzIGhhcyBub3Qg
Y2hhbmdlZC4KKworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/
aWQ9MzQ3MjEKKworICAgICAgICAqIFdlYktpdC5neXA6CisgICAgICAgICogcHVibGljL1dlYlZp
ZXcuaDoKKyAgICAgICAgKiBzcmMvQXV0b0ZpbGxQb3B1cE1lbnVDbGllbnQuY3BwOiBBZGRlZC4K
KyAgICAgICAgKiBzcmMvQXV0b0ZpbGxQb3B1cE1lbnVDbGllbnQuaDogQWRkZWQuCisgICAgICAg
ICogc3JjL0F1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVudC5jcHA6CisgICAgICAgIChXZWJLaXQ6
OkF1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVudDo6Z2V0U3VnZ2VzdGlvbnNDb3VudCk6CisgICAg
ICAgIChXZWJLaXQ6OkF1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVudDo6Z2V0U3VnZ2VzdGlvbik6
CisgICAgICAgIChXZWJLaXQ6OkF1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVudDo6cmVtb3ZlU3Vn
Z2VzdGlvbkF0SW5kZXgpOgorICAgICAgICAoV2ViS2l0OjpBdXRvY29tcGxldGVQb3B1cE1lbnVD
bGllbnQ6OmluaXRpYWxpemUpOgorICAgICAgICAoV2ViS2l0OjpBdXRvY29tcGxldGVQb3B1cE1l
bnVDbGllbnQ6OnNldFN1Z2dlc3Rpb25zKToKKyAgICAgICAgKiBzcmMvQXV0b2NvbXBsZXRlUG9w
dXBNZW51Q2xpZW50Lmg6CisgICAgICAgICogc3JjL1N1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50
LmNwcDogQWRkZWQuCisgICAgICAgICogc3JjL1N1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50Lmg6
IEFkZGVkLgorICAgICAgICAqIHNyYy9XZWJWaWV3SW1wbC5jcHA6CisgICAgICAgIChXZWJLaXQ6
OldlYlZpZXdJbXBsOjpXZWJWaWV3SW1wbCk6CisgICAgICAgIChXZWJLaXQ6OldlYlZpZXdJbXBs
OjprZXlFdmVudCk6CisgICAgICAgIChXZWJLaXQ6OldlYlZpZXdJbXBsOjphdXRvY29tcGxldGVI
YW5kbGVLZXlFdmVudCk6CisgICAgICAgIChXZWJLaXQ6OldlYlZpZXdJbXBsOjphcHBseUF1dG9m
aWxsU3VnZ2VzdGlvbnMpOgorICAgICAgICAoV2ViS2l0OjpXZWJWaWV3SW1wbDo6YXBwbHlBdXRv
RmlsbFN1Z2dlc3Rpb25zKToKKyAgICAgICAgKFdlYktpdDo6V2ViVmlld0ltcGw6OmFwcGx5QXV0
b2NvbXBsZXRlU3VnZ2VzdGlvbnMpOgorICAgICAgICAqIHNyYy9XZWJWaWV3SW1wbC5oOgorCiAy
MDEwLTAyLTA5ICBKaWFuIExpICA8amlhbmxpQGNocm9taXVtLm9yZz4KIAogICAgICAgICBSZXZp
ZXdlZCBieSBEYXJpbiBGaXNoZXIuCkluZGV4OiBXZWJLaXQvY2hyb21pdW0vV2ViS2l0Lmd5cAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBXZWJLaXQvY2hyb21pdW0vV2ViS2l0Lmd5cAkocmV2aXNpb24gNTQ1MDEp
CisrKyBXZWJLaXQvY2hyb21pdW0vV2ViS2l0Lmd5cAkod29ya2luZyBjb3B5KQpAQCAtMTk5LDYg
KzE5OSw4IEBACiAgICAgICAgICAgICAgICAgJ3NyYy9Bc3NlcnRNYXRjaGluZ0VudW1zLmNwcCcs
CiAgICAgICAgICAgICAgICAgJ3NyYy9BdXRvY29tcGxldGVQb3B1cE1lbnVDbGllbnQuY3BwJywK
ICAgICAgICAgICAgICAgICAnc3JjL0F1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVudC5oJywKKyAg
ICAgICAgICAgICAgICAnc3JjL0F1dG9GaWxsUG9wdXBNZW51Q2xpZW50LmNwcCcsCisgICAgICAg
ICAgICAgICAgJ3NyYy9BdXRvRmlsbFBvcHVwTWVudUNsaWVudC5oJywKICAgICAgICAgICAgICAg
ICAnc3JjL0JhY2tGb3J3YXJkTGlzdENsaWVudEltcGwuY3BwJywKICAgICAgICAgICAgICAgICAn
c3JjL0JhY2tGb3J3YXJkTGlzdENsaWVudEltcGwuaCcsCiAgICAgICAgICAgICAgICAgJ3NyYy9C
b3VuZE9iamVjdC5jcHAnLApAQCAtMjU3LDYgKzI1OSw4IEBACiAgICAgICAgICAgICAgICAgJ3Ny
Yy9TdG9yYWdlRXZlbnREaXNwYXRjaGVySW1wbC5oJywKICAgICAgICAgICAgICAgICAnc3JjL1N0
b3JhZ2VOYW1lc3BhY2VQcm94eS5jcHAnLAogICAgICAgICAgICAgICAgICdzcmMvU3RvcmFnZU5h
bWVzcGFjZVByb3h5LmgnLAorICAgICAgICAgICAgICAgICdzcmMvU3VnZ2VzdGlvbnNQb3B1cE1l
bnVDbGllbnQuY3BwJywKKyAgICAgICAgICAgICAgICAnc3JjL1N1Z2dlc3Rpb25zUG9wdXBNZW51
Q2xpZW50LmgnLAogICAgICAgICAgICAgICAgICdzcmMvVGVtcG9yYXJ5R2x1ZS5oJywKICAgICAg
ICAgICAgICAgICAnc3JjL1Rvb2xzQWdlbnQuaCcsCiAgICAgICAgICAgICAgICAgJ3NyYy9XZWJB
Y2Nlc3NpYmlsaXR5Q2FjaGUuY3BwJywKSW5kZXg6IFdlYktpdC9jaHJvbWl1bS9wdWJsaWMvV2Vi
Vmlldy5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdC9jaHJvbWl1bS9wdWJsaWMvV2ViVmlldy5oCShy
ZXZpc2lvbiA1NDUwMSkKKysrIFdlYktpdC9jaHJvbWl1bS9wdWJsaWMvV2ViVmlldy5oCSh3b3Jr
aW5nIGNvcHkpCkBAIC0yMjMsMTQgKzIyMywyOSBAQCBwdWJsaWM6CiAgICAgdmlydHVhbCBXZWJB
Y2Nlc3NpYmlsaXR5T2JqZWN0IGFjY2Vzc2liaWxpdHlPYmplY3QoKSA9IDA7CiAKIAotICAgIC8v
IEF1dG9maWxsIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLQorICAgIC8vIEF1dG9GaWxsIC8gQXV0b2NvbXBsZXRlIC0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi0gICAgLy8gTm90aWZpZXMgdGhl
IFdlYlZpZXcgdGhhdCBhdXRvZmlsbCBzdWdnZXN0aW9ucyBhcmUgYXZhaWxhYmxlIGZvciBhIG5v
ZGUuCisgICAgLy8gREVQUkVDQVRFRDogV2ViVmlldzo6YXBwbHlBdXRvY29tcGxldGVTdWdnZXN0
aW9ucyBpcyB0aGUgbmV3IHdheSB0bworICAgIC8vIGFjY2VzcyB0aGlzLgogICAgIHZpcnR1YWwg
dm9pZCBhcHBseUF1dG9maWxsU3VnZ2VzdGlvbnMoCiAgICAgICAgIGNvbnN0IFdlYk5vZGUmLAog
ICAgICAgICBjb25zdCBXZWJWZWN0b3I8V2ViU3RyaW5nPiYgc3VnZ2VzdGlvbnMsCiAgICAgICAg
IGludCBkZWZhdWx0U3VnZ2VzdGlvbkluZGV4KSA9IDA7CiAKKyAgICAvLyBOb3RpZmllcyB0aGUg
V2ViVmlldyB0aGF0IEF1dG9GaWxsIHN1Z2dlc3Rpb25zIGFyZSBhdmFpbGFibGUgZm9yIGEgbm9k
ZS4KKyAgICB2aXJ0dWFsIHZvaWQgYXBwbHlBdXRvRmlsbFN1Z2dlc3Rpb25zKAorICAgICAgICBj
b25zdCBXZWJOb2RlJiwKKyAgICAgICAgY29uc3QgV2ViVmVjdG9yPFdlYlN0cmluZz4mIG5hbWVz
LAorICAgICAgICBjb25zdCBXZWJWZWN0b3I8V2ViU3RyaW5nPiYgbGFiZWxzLAorICAgICAgICBp
bnQgZGVmYXVsdFN1Z2dlc3Rpb25JbmRleCkgPSAwOworCisgICAgLy8gTm90aWZpZXMgdGhlIFdl
YlZpZXcgdGhhdCBBdXRvY29tcGxldGUgc3VnZ2VzdGlvbnMgYXJlIGF2YWlsYWJsZSBmb3IgYQor
ICAgIC8vIG5vZGUuCisgICAgdmlydHVhbCB2b2lkIGFwcGx5QXV0b2NvbXBsZXRlU3VnZ2VzdGlv
bnMoCisgICAgICAgIGNvbnN0IFdlYk5vZGUmLAorICAgICAgICBjb25zdCBXZWJWZWN0b3I8V2Vi
U3RyaW5nPiYgc3VnZ2VzdGlvbnMsCisgICAgICAgIGludCBkZWZhdWx0U3VnZ2VzdGlvbkluZGV4
KSA9IDA7CisKICAgICAvLyBERVBSRUNBVEVEOiBXZWJWaWV3OjpoaWRlU3VnZ2VzdGlvbnNQb3B1
cCBpcyB0aGUgbmV3IHdheSB0byBhY2Nlc3MgdGhpcy4KICAgICB2aXJ0dWFsIHZvaWQgaGlkZUF1
dG9maWxsUG9wdXAoKSA9IDA7CiAKSW5kZXg6IFdlYktpdC9jaHJvbWl1bS9zcmMvQXV0b0ZpbGxQ
b3B1cE1lbnVDbGllbnQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdC9jaHJvbWl1bS9zcmMvQXV0
b0ZpbGxQb3B1cE1lbnVDbGllbnQuY3BwCShyZXZpc2lvbiAwKQorKysgV2ViS2l0L2Nocm9taXVt
L3NyYy9BdXRvRmlsbFBvcHVwTWVudUNsaWVudC5jcHAJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEs
MTA2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6Cisg
KgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBi
aW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAq
IGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29v
Z2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNl
ZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNv
ZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBD
T05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFO
VElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJS
QU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxB
UiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hU
CisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJ
UkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElB
TCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5U
IE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwg
T1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQg
T04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJX
SVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdB
UkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisg
Ki8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkF1dG9GaWxsUG9wdXBNZW51Q2xp
ZW50LmgiCisKKyNpbmNsdWRlICJIVE1MSW5wdXRFbGVtZW50LmgiCisjaW5jbHVkZSAiV2ViU3Ry
aW5nLmgiCisjaW5jbHVkZSAiV2ViVmVjdG9yLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBXZWJDb3Jl
OworCituYW1lc3BhY2UgV2ViS2l0IHsKKwordW5zaWduZWQgQXV0b0ZpbGxQb3B1cE1lbnVDbGll
bnQ6OmdldFN1Z2dlc3Rpb25zQ291bnQoKSBjb25zdAoreworICAgIHJldHVybiBtX25hbWVzLnNp
emUoKTsKK30KKworV2ViU3RyaW5nIEF1dG9GaWxsUG9wdXBNZW51Q2xpZW50OjpnZXRTdWdnZXN0
aW9uKHVuc2lnbmVkIGxpc3RJbmRleCkgY29uc3QKK3sKKyAgICAvLyBGSVhNRTogTW9kaWZ5IHRo
ZSBQb3B1cE1lbnUgdG8gYWRkIHRoZSBsYWJlbCBpbiBncmF5IHJpZ2h0LWp1c3RpZmllZC4KKyAg
ICBBU1NFUlQobGlzdEluZGV4ID49IDAgJiYgbGlzdEluZGV4IDwgbV9uYW1lcy5zaXplKCkpOwor
ICAgIHJldHVybiBtX25hbWVzW2xpc3RJbmRleF0gKyBTdHJpbmcoIiAoIikgKyBtX2xhYmVsc1ts
aXN0SW5kZXhdICsgU3RyaW5nKCIpIik7Cit9CisKK3ZvaWQgQXV0b0ZpbGxQb3B1cE1lbnVDbGll
bnQ6OnJlbW92ZVN1Z2dlc3Rpb25BdEluZGV4KHVuc2lnbmVkIGxpc3RJbmRleCkKK3sKKyAgICAv
LyBGSVhNRTogRG8gd2Ugd2FudCB0byByZW1vdmUgQXV0b0ZpbGwgc3VnZ2VzdGlvbnM/CisgICAg
QVNTRVJUKGxpc3RJbmRleCA+PSAwICYmIGxpc3RJbmRleCA8IHN0YXRpY19jYXN0PGludD4obV9u
YW1lcy5zaXplKCkpKTsKKyAgICBtX25hbWVzLnJlbW92ZShsaXN0SW5kZXgpOworICAgIG1fbGFi
ZWxzLnJlbW92ZShsaXN0SW5kZXgpOworfQorCit2b2lkIEF1dG9GaWxsUG9wdXBNZW51Q2xpZW50
Ojogc2VsZWN0aW9uQ2hhbmdlZCh1bnNpZ25lZCBsaXN0SW5kZXgsCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZpcmVFdmVudHMpIHsKKyAgICBp
ZiAobGlzdEluZGV4ID09IHN0YXRpY19jYXN0PHVuc2lnbmVkPigtMSkpIHsKKyAgICAgICAgU3Vn
Z2VzdGlvbnNQb3B1cE1lbnVDbGllbnQ6OnNlbGVjdGlvbkNoYW5nZWQobGlzdEluZGV4LCBmaXJl
RXZlbnRzKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEFTU0VSVChsaXN0SW5kZXgg
Pj0gMCAmJiBsaXN0SW5kZXggPCBtX25hbWVzLnNpemUoKSk7CisgICAgc2V0U3VnZ2VzdGVkVmFs
dWUobV9uYW1lc1tsaXN0SW5kZXhdKTsKK30KKwordm9pZCBBdXRvRmlsbFBvcHVwTWVudUNsaWVu
dDo6aW5pdGlhbGl6ZSgKKyAgICBIVE1MSW5wdXRFbGVtZW50KiB0ZXh0RmllbGQsCisgICAgY29u
c3QgV2ViVmVjdG9yPFdlYlN0cmluZz4mIG5hbWVzLAorICAgIGNvbnN0IFdlYlZlY3RvcjxXZWJT
dHJpbmc+JiBsYWJlbHMsCisgICAgaW50IGRlZmF1bHRTdWdnZXN0aW9uSW5kZXgpCit7CisgICAg
QVNTRVJUKG5hbWVzLnNpemUoKSA9PSBsYWJlbHMuc2l6ZSgpKTsKKyAgICBBU1NFUlQoZGVmYXVs
dFN1Z2dlc3Rpb25JbmRleCA8IHN0YXRpY19jYXN0PGludD4obmFtZXMuc2l6ZSgpKSk7CisKKyAg
ICAvLyBUaGUgc3VnZ2VzdGlvbnMgbXVzdCBiZSBzZXQgYmVmb3JlIGluaXRpYWxpemluZyB0aGUK
KyAgICAvLyBTdWdnZXN0aW9uc1BvcHVwTWVudUNsaWVudC4KKyAgICBzZXRTdWdnZXN0aW9ucyhu
YW1lcywgbGFiZWxzKTsKKworICAgIFN1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50Ojppbml0aWFs
aXplKHRleHRGaWVsZCwgZGVmYXVsdFN1Z2dlc3Rpb25JbmRleCk7Cit9CisKK3ZvaWQgQXV0b0Zp
bGxQb3B1cE1lbnVDbGllbnQ6OnNldFN1Z2dlc3Rpb25zKGNvbnN0IFdlYlZlY3RvcjxXZWJTdHJp
bmc+JiBuYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGNvbnN0IFdlYlZlY3RvcjxXZWJTdHJpbmc+JiBsYWJlbHMpCit7CisgICAgQVNTRVJUKG5hbWVz
LnNpemUoKSA9PSBsYWJlbHMuc2l6ZSgpKTsKKworICAgIG1fbmFtZXMuY2xlYXIoKTsKKyAgICBt
X2xhYmVscy5jbGVhcigpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbmFtZXMuc2l6ZSgp
OyArK2kpIHsKKyAgICAgICAgbV9uYW1lcy5hcHBlbmQobmFtZXNbaV0pOworICAgICAgICBtX2xh
YmVscy5hcHBlbmQobGFiZWxzW2ldKTsKKyAgICB9CisKKyAgICAvLyBUcnkgdG8gcHJlc2VydmUg
c2VsZWN0aW9uIGlmIHBvc3NpYmxlLgorICAgIGlmIChnZXRTZWxlY3RlZEluZGV4KCkgPj0gc3Rh
dGljX2Nhc3Q8aW50PihuYW1lcy5zaXplKCkpKQorICAgICAgICBzZXRTZWxlY3RlZEluZGV4KC0x
KTsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViS2l0CkluZGV4OiBXZWJLaXQvY2hyb21pdW0vc3Jj
L0F1dG9GaWxsUG9wdXBNZW51Q2xpZW50LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0L2Nocm9taXVt
L3NyYy9BdXRvRmlsbFBvcHVwTWVudUNsaWVudC5oCShyZXZpc2lvbiAwKQorKysgV2ViS2l0L2No
cm9taXVtL3NyYy9BdXRvRmlsbFBvcHVwTWVudUNsaWVudC5oCShyZXZpc2lvbiAwKQpAQCAtMCww
ICsxLDcxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5k
IGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJt
aXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6
CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWlu
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBp
biBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIK
KyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQg
d2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2Yg
R29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUg
dXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlz
IHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoK
KyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFO
RCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FS
UkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBX
QVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElD
VUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJ
R0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVO
VElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVN
RU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFU
QSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBB
TkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBT
VFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09G
VFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
CisgKi8KKworI2lmbmRlZiBBdXRvRmlsbFBvcHVwTWVudUNsaWVudF9oCisjZGVmaW5lIEF1dG9G
aWxsUG9wdXBNZW51Q2xpZW50X2gKKworI2luY2x1ZGUgIlN1Z2dlc3Rpb25zUG9wdXBNZW51Q2xp
ZW50LmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKK2NsYXNzIEhUTUxJbnB1dEVsZW1lbnQ7Cit9
CisKK25hbWVzcGFjZSBXZWJLaXQgeworY2xhc3MgV2ViU3RyaW5nOwordGVtcGxhdGUgPHR5cGVu
YW1lIFQ+IGNsYXNzIFdlYlZlY3RvcjsKKworLy8gVGhlIEF1dG9GaWxsIHN1Z2dlc3Rpb25zIHBv
cHVwIG1lbnUgY2xpZW50LCB1c2VkIHRvIGRpc3BsYXkgbmFtZSBzdWdnZXN0aW9ucworLy8gd2l0
aCByaWdodC1qdXN0aWZpZWQgbGFiZWxzLgorY2xhc3MgQXV0b0ZpbGxQb3B1cE1lbnVDbGllbnQg
OiBwdWJsaWMgU3VnZ2VzdGlvbnNQb3B1cE1lbnVDbGllbnQgeworcHVibGljOgorICAgIC8vIFN1
Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50IGltcGxlbWVudGF0aW9uOgorICAgIHZpcnR1YWwgdW5z
aWduZWQgZ2V0U3VnZ2VzdGlvbnNDb3VudCgpIGNvbnN0OworICAgIHZpcnR1YWwgV2ViU3RyaW5n
IGdldFN1Z2dlc3Rpb24odW5zaWduZWQgbGlzdEluZGV4KSBjb25zdDsKKyAgICB2aXJ0dWFsIHZv
aWQgcmVtb3ZlU3VnZ2VzdGlvbkF0SW5kZXgodW5zaWduZWQgbGlzdEluZGV4KTsKKworICAgIC8v
IFdlYkNvcmU6OlBvcHVwTWVudUNsaWVudCBpbXBsZW1lbnRhdGlvbjoKKyAgICB2aXJ0dWFsIHZv
aWQgc2VsZWN0aW9uQ2hhbmdlZCh1bnNpZ25lZCBsaXN0SW5kZXgsIGJvb2wgZmlyZUV2ZW50cyk7
CisKKyAgICB2b2lkIGluaXRpYWxpemUoV2ViQ29yZTo6SFRNTElucHV0RWxlbWVudCosCisgICAg
ICAgICAgICAgICAgICAgIGNvbnN0IFdlYlZlY3RvcjxXZWJTdHJpbmc+JiBuYW1lcywKKyAgICAg
ICAgICAgICAgICAgICAgY29uc3QgV2ViVmVjdG9yPFdlYlN0cmluZz4mIGxhYmVscywKKyAgICAg
ICAgICAgICAgICAgICAgaW50IGRlZmF1bHRTdWdnZXN0aW9uSW5kZXgpOworCisgICAgdm9pZCBz
ZXRTdWdnZXN0aW9ucyhjb25zdCBXZWJWZWN0b3I8V2ViU3RyaW5nPiYgbmFtZXMsCisgICAgICAg
ICAgICAgICAgICAgICAgICBjb25zdCBXZWJWZWN0b3I8V2ViU3RyaW5nPiYgbGFiZWxzKTsKKwor
cHJpdmF0ZToKKyAgICBWZWN0b3I8V2ViQ29yZTo6U3RyaW5nPiBtX25hbWVzOworICAgIFZlY3Rv
cjxXZWJDb3JlOjpTdHJpbmc+IG1fbGFiZWxzOworfTsKKworfSAvLyBuYW1lc3BhY2UgV2ViS2l0
CisKKyNlbmRpZgoKUHJvcGVydHkgY2hhbmdlcyBvbjogV2ViS2l0L2Nocm9taXVtL3NyYy9BdXRv
RmlsbFBvcHVwTWVudUNsaWVudC5oCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KQWRkZWQ6IHN2bjplb2wtc3R5bGUKICAg
KyBMRgoKSW5kZXg6IFdlYktpdC9jaHJvbWl1bS9zcmMvQXV0b2NvbXBsZXRlUG9wdXBNZW51Q2xp
ZW50LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQvY2hyb21pdW0vc3JjL0F1dG9jb21wbGV0ZVBv
cHVwTWVudUNsaWVudC5jcHAJKHJldmlzaW9uIDU0NTAxKQorKysgV2ViS2l0L2Nocm9taXVtL3Ny
Yy9BdXRvY29tcGxldGVQb3B1cE1lbnVDbGllbnQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xLDUg
KzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBHb29nbGUgSW5jLiBBbGwgcmlnaHRz
IHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCkBAIC0zMSwyNyAr
MzEsMjkgQEAKICNpbmNsdWRlICJjb25maWcuaCIKICNpbmNsdWRlICJBdXRvY29tcGxldGVQb3B1
cE1lbnVDbGllbnQuaCIKIAotI2luY2x1ZGUgIkNTU1N0eWxlU2VsZWN0b3IuaCIKLSNpbmNsdWRl
ICJDU1NWYWx1ZUtleXdvcmRzLmgiCi0jaW5jbHVkZSAiRnJhbWVWaWV3LmgiCiAjaW5jbHVkZSAi
SFRNTElucHV0RWxlbWVudC5oIgotI2luY2x1ZGUgIlJlbmRlclRoZW1lLmgiCisjaW5jbHVkZSAi
V2ViU3RyaW5nLmgiCiAjaW5jbHVkZSAiV2ViVmVjdG9yLmgiCi0jaW5jbHVkZSAiV2ViVmlld0lt
cGwuaCIKIAogdXNpbmcgbmFtZXNwYWNlIFdlYkNvcmU7CiAKIG5hbWVzcGFjZSBXZWJLaXQgewog
Ci1BdXRvY29tcGxldGVQb3B1cE1lbnVDbGllbnQ6OkF1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVu
dChXZWJWaWV3SW1wbCogd2ViVmlldykKLSAgICA6IG1fdGV4dEZpZWxkKDApCi0gICAgLCBtX3Nl
bGVjdGVkSW5kZXgoMCkKLSAgICAsIG1fd2ViVmlldyh3ZWJWaWV3KQordW5zaWduZWQgQXV0b2Nv
bXBsZXRlUG9wdXBNZW51Q2xpZW50OjpnZXRTdWdnZXN0aW9uc0NvdW50KCkgY29uc3QKIHsKKyAg
ICByZXR1cm4gbV9zdWdnZXN0aW9ucy5zaXplKCk7CiB9CiAKLUF1dG9jb21wbGV0ZVBvcHVwTWVu
dUNsaWVudDo6fkF1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVudCgpCitXZWJTdHJpbmcgQXV0b2Nv
bXBsZXRlUG9wdXBNZW51Q2xpZW50OjpnZXRTdWdnZXN0aW9uKHVuc2lnbmVkIGxpc3RJbmRleCkg
Y29uc3QKIHsKKyAgICBBU1NFUlQobGlzdEluZGV4ID49IDAgJiYgbGlzdEluZGV4IDwgbV9zdWdn
ZXN0aW9ucy5zaXplKCkpOworICAgIHJldHVybiBtX3N1Z2dlc3Rpb25zW2xpc3RJbmRleF07Cit9
CisKK3ZvaWQgQXV0b2NvbXBsZXRlUG9wdXBNZW51Q2xpZW50OjpyZW1vdmVTdWdnZXN0aW9uQXRJ
bmRleCh1bnNpZ25lZCBsaXN0SW5kZXgpCit7CisgICAgQVNTRVJUKGxpc3RJbmRleCA+PSAwICYm
IGxpc3RJbmRleCA8IG1fc3VnZ2VzdGlvbnMuc2l6ZSgpKTsKKyAgICBtX3N1Z2dlc3Rpb25zLnJl
bW92ZShsaXN0SW5kZXgpOwogfQogCiB2b2lkIEF1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVudDo6
aW5pdGlhbGl6ZSgKQEAgLTYwLDkwICs2MiwxMiBAQCB2b2lkIEF1dG9jb21wbGV0ZVBvcHVwTWVu
dUNsaWVudDo6aW5pdGlhCiAgICAgaW50IGRlZmF1bHRTdWdnZXN0aW9uSW5kZXgpCiB7CiAgICAg
QVNTRVJUKGRlZmF1bHRTdWdnZXN0aW9uSW5kZXggPCBzdGF0aWNfY2FzdDxpbnQ+KHN1Z2dlc3Rp
b25zLnNpemUoKSkpOwotICAgIG1fdGV4dEZpZWxkID0gdGV4dEZpZWxkOwotICAgIG1fc2VsZWN0
ZWRJbmRleCA9IGRlZmF1bHRTdWdnZXN0aW9uSW5kZXg7Ci0gICAgc2V0U3VnZ2VzdGlvbnMoc3Vn
Z2VzdGlvbnMpOwotCi0gICAgRm9udERlc2NyaXB0aW9uIGZvbnREZXNjcmlwdGlvbjsKLSAgICBt
X3dlYlZpZXctPnRoZW1lKCktPnN5c3RlbUZvbnQoQ1NTVmFsdWVXZWJraXRDb250cm9sLCBmb250
RGVzY3JpcHRpb24pOwotICAgIC8vIFVzZSBhIHNtYWxsZXIgZm9udCBzaXplIHRvIG1hdGNoIElF
L0ZpcmVmb3guCi0gICAgLy8gRklYTUU6IGh0dHA6Ly9jcmJ1Zy5jb20vNzM3NiB1c2UgdGhlIHN5
c3RlbSBzaXplIGluc3RlYWQgb2YgYQotICAgIC8vICAgICAgICBmaXhlZCBmb250IHNpemUgdmFs
dWUuCi0gICAgZm9udERlc2NyaXB0aW9uLnNldENvbXB1dGVkU2l6ZSgxMi4wKTsKLSAgICBGb250
IGZvbnQoZm9udERlc2NyaXB0aW9uLCAwLCAwKTsKLSAgICBmb250LnVwZGF0ZSh0ZXh0RmllbGQt
PmRvY3VtZW50KCktPnN0eWxlU2VsZWN0b3IoKS0+Zm9udFNlbGVjdG9yKCkpOwotICAgIC8vIFRo
ZSBkaXJlY3Rpb24gb2YgdGV4dCBpbiBwb3B1cCBtZW51IGlzIHNldCB0aGUgc2FtZSBhcyB0aGUg
ZGlyZWN0aW9uIG9mCi0gICAgLy8gdGhlIGlucHV0IGVsZW1lbnQ6IHRleHRGaWVsZC4KLSAgICBt
X3N0eWxlLnNldChuZXcgUG9wdXBNZW51U3R5bGUoQ29sb3I6OmJsYWNrLCBDb2xvcjo6d2hpdGUs
IGZvbnQsIHRydWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExlbmd0aChX
ZWJDb3JlOjpGaXhlZCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRG
aWVsZC0+cmVuZGVyZXIoKS0+c3R5bGUoKS0+ZGlyZWN0aW9uKCkpKTsKLX0KLQotdm9pZCBBdXRv
Y29tcGxldGVQb3B1cE1lbnVDbGllbnQ6OnZhbHVlQ2hhbmdlZCh1bnNpZ25lZCBsaXN0SW5kZXgs
IGJvb2wgZmlyZUV2ZW50cykKLXsKLSAgICBtX3RleHRGaWVsZC0+c2V0VmFsdWUobV9zdWdnZXN0
aW9uc1tsaXN0SW5kZXhdKTsKLSAgICBFZGl0b3JDbGllbnRJbXBsKiBlZGl0b3IgPQotICAgICAg
ICBzdGF0aWNfY2FzdDxFZGl0b3JDbGllbnRJbXBsKj4obV93ZWJWaWV3LT5wYWdlKCktPmVkaXRv
ckNsaWVudCgpKTsKLSAgICBBU1NFUlQoZWRpdG9yKTsKLSAgICBlZGl0b3ItPm9uQXV0b2ZpbGxT
dWdnZXN0aW9uQWNjZXB0ZWQoCi0gICAgICAgIHN0YXRpY19jYXN0PEhUTUxJbnB1dEVsZW1lbnQq
PihtX3RleHRGaWVsZC5nZXQoKSkpOwotfQotCi1TdHJpbmcgQXV0b2NvbXBsZXRlUG9wdXBNZW51
Q2xpZW50OjppdGVtVGV4dCh1bnNpZ25lZCBsaXN0SW5kZXgpIGNvbnN0Ci17Ci0gICAgcmV0dXJu
IG1fc3VnZ2VzdGlvbnNbbGlzdEluZGV4XTsKLX0KLQotUG9wdXBNZW51U3R5bGUgQXV0b2NvbXBs
ZXRlUG9wdXBNZW51Q2xpZW50OjppdGVtU3R5bGUodW5zaWduZWQgbGlzdEluZGV4KSBjb25zdAot
ewotICAgIHJldHVybiAqbV9zdHlsZTsKLX0KLQotUG9wdXBNZW51U3R5bGUgQXV0b2NvbXBsZXRl
UG9wdXBNZW51Q2xpZW50OjptZW51U3R5bGUoKSBjb25zdAotewotICAgIHJldHVybiAqbV9zdHls
ZTsKLX0KLQotaW50IEF1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVudDo6Y2xpZW50UGFkZGluZ0xl
ZnQoKSBjb25zdAotewotICAgIC8vIEJ1ZyBodHRwOi8vY3JidWcuY29tLzc3MDggc2VlbXMgdG8g
aW5kaWNhdGUgdGhlIHN0eWxlIGNhbiBiZSAwLgotICAgIFJlbmRlclN0eWxlKiBzdHlsZSA9IHRl
eHRGaWVsZFN0eWxlKCk7Ci0gICAgcmV0dXJuIHN0eWxlID8gbV93ZWJWaWV3LT50aGVtZSgpLT5w
b3B1cEludGVybmFsUGFkZGluZ0xlZnQoc3R5bGUpIDogMDsKLX0KIAotaW50IEF1dG9jb21wbGV0
ZVBvcHVwTWVudUNsaWVudDo6Y2xpZW50UGFkZGluZ1JpZ2h0KCkgY29uc3QKLXsKLSAgICAvLyBC
dWcgaHR0cDovL2NyYnVnLmNvbS83NzA4IHNlZW1zIHRvIGluZGljYXRlIHRoZSBzdHlsZSBjYW4g
YmUgMC4KLSAgICBSZW5kZXJTdHlsZSogc3R5bGUgPSB0ZXh0RmllbGRTdHlsZSgpOwotICAgIHJl
dHVybiBzdHlsZSA/IG1fd2ViVmlldy0+dGhlbWUoKS0+cG9wdXBJbnRlcm5hbFBhZGRpbmdSaWdo
dChzdHlsZSkgOiAwOwotfQotCi12b2lkIEF1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVudDo6cG9w
dXBEaWRIaWRlKCkKLXsKLSAgICBtX3dlYlZpZXctPnN1Z2dlc3Rpb25zUG9wdXBEaWRIaWRlKCk7
Ci19Ci0KLXZvaWQgQXV0b2NvbXBsZXRlUG9wdXBNZW51Q2xpZW50OjpzZXRUZXh0RnJvbUl0ZW0o
dW5zaWduZWQgbGlzdEluZGV4KQotewotICAgIG1fdGV4dEZpZWxkLT5zZXRWYWx1ZShtX3N1Z2dl
c3Rpb25zW2xpc3RJbmRleF0pOwotfQotCi1Gb250U2VsZWN0b3IqIEF1dG9jb21wbGV0ZVBvcHVw
TWVudUNsaWVudDo6Zm9udFNlbGVjdG9yKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV90ZXh0Rmll
bGQtPmRvY3VtZW50KCktPnN0eWxlU2VsZWN0b3IoKS0+Zm9udFNlbGVjdG9yKCk7Ci19Ci0KLUhv
c3RXaW5kb3cqIEF1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVudDo6aG9zdFdpbmRvdygpIGNvbnN0
Ci17Ci0gICAgcmV0dXJuIG1fdGV4dEZpZWxkLT5kb2N1bWVudCgpLT52aWV3KCktPmhvc3RXaW5k
b3coKTsKLX0KKyAgICAvLyBUaGUgc3VnZ2VzdGlvbnMgbXVzdCBiZSBzZXQgYmVmb3JlIGluaXRp
YWxpemluZyB0aGUKKyAgICAvLyBTdWdnZXN0aW9uc1BvcHVwTWVudUNsaWVudC4KKyAgICBzZXRT
dWdnZXN0aW9ucyhzdWdnZXN0aW9ucyk7CiAKLVBhc3NSZWZQdHI8U2Nyb2xsYmFyPiBBdXRvY29t
cGxldGVQb3B1cE1lbnVDbGllbnQ6OmNyZWF0ZVNjcm9sbGJhcigKLSAgICBTY3JvbGxiYXJDbGll
bnQqIGNsaWVudCwKLSAgICBTY3JvbGxiYXJPcmllbnRhdGlvbiBvcmllbnRhdGlvbiwKLSAgICBT
Y3JvbGxiYXJDb250cm9sU2l6ZSBzaXplKQotewotICAgIHJldHVybiBTY3JvbGxiYXI6OmNyZWF0
ZU5hdGl2ZVNjcm9sbGJhcihjbGllbnQsIG9yaWVudGF0aW9uLCBzaXplKTsKKyAgICBTdWdnZXN0
aW9uc1BvcHVwTWVudUNsaWVudDo6aW5pdGlhbGl6ZSh0ZXh0RmllbGQsIGRlZmF1bHRTdWdnZXN0
aW9uSW5kZXgpOwogfQogCiB2b2lkIEF1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVudDo6c2V0U3Vn
Z2VzdGlvbnMoY29uc3QgV2ViVmVjdG9yPFdlYlN0cmluZz4mIHN1Z2dlc3Rpb25zKQpAQCAtMTUx
LDI4ICs3NSwxMCBAQCB2b2lkIEF1dG9jb21wbGV0ZVBvcHVwTWVudUNsaWVudDo6c2V0U3VnCiAg
ICAgbV9zdWdnZXN0aW9ucy5jbGVhcigpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc3Vn
Z2VzdGlvbnMuc2l6ZSgpOyArK2kpCiAgICAgICAgIG1fc3VnZ2VzdGlvbnMuYXBwZW5kKHN1Z2dl
c3Rpb25zW2ldKTsKLSAgICAvLyBUcnkgdG8gcHJlc2VydmUgc2VsZWN0aW9uIGlmIHBvc3NpYmxl
LgotICAgIGlmIChtX3NlbGVjdGVkSW5kZXggPj0gc3RhdGljX2Nhc3Q8aW50PihzdWdnZXN0aW9u
cy5zaXplKCkpKQotICAgICAgICBtX3NlbGVjdGVkSW5kZXggPSAtMTsKLX0KIAotdm9pZCBBdXRv
Y29tcGxldGVQb3B1cE1lbnVDbGllbnQ6OnJlbW92ZUl0ZW1BdEluZGV4KGludCBpbmRleCkKLXsK
LSAgICBBU1NFUlQoaW5kZXggPj0gMCAmJiBpbmRleCA8IHN0YXRpY19jYXN0PGludD4obV9zdWdn
ZXN0aW9ucy5zaXplKCkpKTsKLSAgICBtX3N1Z2dlc3Rpb25zLnJlbW92ZShpbmRleCk7Ci19Ci0K
LVJlbmRlclN0eWxlKiBBdXRvY29tcGxldGVQb3B1cE1lbnVDbGllbnQ6OnRleHRGaWVsZFN0eWxl
KCkgY29uc3QKLXsKLSAgICBSZW5kZXJTdHlsZSogc3R5bGUgPSBtX3RleHRGaWVsZC0+Y29tcHV0
ZWRTdHlsZSgpOwotICAgIGlmICghc3R5bGUpIHsKLSAgICAgICAgLy8gSXQgc2VlbXMgd2UgY2Fu
IG9ubHkgaGF2ZSBhIDAgc3R5bGUgaW4gYSBUZXh0RmllbGQgaWYgdGhlCi0gICAgICAgIC8vIG5v
ZGUgaXMgZGV0YWNoZWQsIGluIHdoaWNoIGNhc2Ugd2UgdGhlIHBvcHVwIHNob3VkIG5vdCBiZQot
ICAgICAgICAvLyBzaG93aW5nLiAgUGxlYXNlIHJlcG9ydCB0aGlzIGluIGh0dHA6Ly9jcmJ1Zy5j
b20vNzcwOCBhbmQKLSAgICAgICAgLy8gaW5jbHVkZSB0aGUgcGFnZSB5b3Ugd2VyZSB2aXNpdGlu
Zy4KLSAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Ci0gICAgfQotICAgIHJldHVybiBzdHls
ZTsKKyAgICAvLyBUcnkgdG8gcHJlc2VydmUgc2VsZWN0aW9uIGlmIHBvc3NpYmxlLgorICAgIGlm
IChnZXRTZWxlY3RlZEluZGV4KCkgPj0gc3RhdGljX2Nhc3Q8aW50PihzdWdnZXN0aW9ucy5zaXpl
KCkpKQorICAgICAgICBzZXRTZWxlY3RlZEluZGV4KC0xKTsKIH0KIAogfSAvLyBuYW1lc3BhY2Ug
V2ViS2l0CkluZGV4OiBXZWJLaXQvY2hyb21pdW0vc3JjL0F1dG9jb21wbGV0ZVBvcHVwTWVudUNs
aWVudC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdC9jaHJvbWl1bS9zcmMvQXV0b2NvbXBsZXRlUG9w
dXBNZW51Q2xpZW50LmgJKHJldmlzaW9uIDU0NTAxKQorKysgV2ViS2l0L2Nocm9taXVtL3NyYy9B
dXRvY29tcGxldGVQb3B1cE1lbnVDbGllbnQuaAkod29ya2luZyBjb3B5KQpAQCAtMSw1ICsxLDUg
QEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2Vy
dmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkg
Zm9ybXMsIHdpdGggb3Igd2l0aG91dAogICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHBy
b3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQpAQCAtMjgsNjkgKzI4LDM4
IEBACiAgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLgogICovCiAKLSNpbmNsdWRlICJQb3B1cE1lbnVDbGllbnQuaCIK
KyNpZm5kZWYgQXV0b2NvbXBsZXRlUG9wdXBNZW51Q2xpZW50X2gKKyNkZWZpbmUgQXV0b2NvbXBs
ZXRlUG9wdXBNZW51Q2xpZW50X2gKKyAKKyNpbmNsdWRlICJTdWdnZXN0aW9uc1BvcHVwTWVudUNs
aWVudC5oIgogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiBjbGFzcyBIVE1MSW5wdXRFbGVtZW50Owot
Y2xhc3MgUG9wdXBNZW51U3R5bGU7Ci1jbGFzcyBSZW5kZXJTdHlsZTsKIH0KIAogbmFtZXNwYWNl
IFdlYktpdCB7CiBjbGFzcyBXZWJTdHJpbmc7Ci1jbGFzcyBXZWJWaWV3SW1wbDsKIHRlbXBsYXRl
IDx0eXBlbmFtZSBUPiBjbGFzcyBXZWJWZWN0b3I7CiAKLS8vIEF1dG9jb21wbGV0ZVBvcHVwTWVu
dUNsaWVudAotY2xhc3MgQXV0b2NvbXBsZXRlUG9wdXBNZW51Q2xpZW50IDogcHVibGljIFdlYkNv
cmU6OlBvcHVwTWVudUNsaWVudCB7CisvLyBUaGUgQXV0b2NvbXBsZXRlIHN1Z2dlc3Rpb25zIHBv
cHVwIG1lbnUgY2xpZW50LCB1c2VkIHRvIGRpc3BsYXkgYSBsaXN0IG9mCisvLyBhdXRvY29tcGxl
dGUgc3VnZ2VzdGlvbnMuCitjbGFzcyBBdXRvY29tcGxldGVQb3B1cE1lbnVDbGllbnQgOiBwdWJs
aWMgU3VnZ2VzdGlvbnNQb3B1cE1lbnVDbGllbnQgewogcHVibGljOgotICAgIEF1dG9jb21wbGV0
ZVBvcHVwTWVudUNsaWVudChXZWJWaWV3SW1wbCogd2Vidmlldyk7Ci0gICAgfkF1dG9jb21wbGV0
ZVBvcHVwTWVudUNsaWVudCgpOworICAgIC8vIFN1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50IGlt
cGxlbWVudGF0aW9uOgorICAgIHZpcnR1YWwgdW5zaWduZWQgZ2V0U3VnZ2VzdGlvbnNDb3VudCgp
IGNvbnN0OworICAgIHZpcnR1YWwgV2ViU3RyaW5nIGdldFN1Z2dlc3Rpb24odW5zaWduZWQgbGlz
dEluZGV4KSBjb25zdDsKKyAgICB2aXJ0dWFsIHZvaWQgcmVtb3ZlU3VnZ2VzdGlvbkF0SW5kZXgo
dW5zaWduZWQgbGlzdEluZGV4KTsKIAogICAgIHZvaWQgaW5pdGlhbGl6ZShXZWJDb3JlOjpIVE1M
SW5wdXRFbGVtZW50KiwKICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2ViVmVjdG9yPFdlYlN0
cmluZz4mIHN1Z2dlc3Rpb25zLAogICAgICAgICAgICAgICAgICAgICBpbnQgZGVmYXVsdFN1Z2dl
c3Rpb25JbmRleCk7CiAKLSAgICBXZWJDb3JlOjpIVE1MSW5wdXRFbGVtZW50KiB0ZXh0RmllbGQo
KSBjb25zdCB7IHJldHVybiBtX3RleHRGaWVsZC5nZXQoKTsgfQotCiAgICAgdm9pZCBzZXRTdWdn
ZXN0aW9ucyhjb25zdCBXZWJWZWN0b3I8V2ViU3RyaW5nPiYpOwotICAgIHZvaWQgcmVtb3ZlSXRl
bUF0SW5kZXgoaW50IGluZGV4KTsKLQotICAgIC8vIFdlYkNvcmU6OlBvcHVwTWVudUNsaWVudCBt
ZXRob2RzOgotICAgIHZpcnR1YWwgdm9pZCB2YWx1ZUNoYW5nZWQodW5zaWduZWQgbGlzdEluZGV4
LCBib29sIGZpcmVFdmVudHMgPSB0cnVlKTsKLSAgICB2aXJ0dWFsIFdlYkNvcmU6OlN0cmluZyBp
dGVtVGV4dCh1bnNpZ25lZCBsaXN0SW5kZXgpIGNvbnN0OwotICAgIHZpcnR1YWwgV2ViQ29yZTo6
U3RyaW5nIGl0ZW1Ub29sVGlwKHVuc2lnbmVkIGxhc3RJbmRleCkgY29uc3QgeyByZXR1cm4gV2Vi
Q29yZTo6U3RyaW5nKCk7IH0KLSAgICB2aXJ0dWFsIGJvb2wgaXRlbUlzRW5hYmxlZCh1bnNpZ25l
ZCBsaXN0SW5kZXgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KLSAgICB2aXJ0dWFsIFdlYkNvcmU6
OlBvcHVwTWVudVN0eWxlIGl0ZW1TdHlsZSh1bnNpZ25lZCBsaXN0SW5kZXgpIGNvbnN0OwotICAg
IHZpcnR1YWwgV2ViQ29yZTo6UG9wdXBNZW51U3R5bGUgbWVudVN0eWxlKCkgY29uc3Q7Ci0gICAg
dmlydHVhbCBpbnQgY2xpZW50SW5zZXRMZWZ0KCkgY29uc3QgeyByZXR1cm4gMDsgfQotICAgIHZp
cnR1YWwgaW50IGNsaWVudEluc2V0UmlnaHQoKSBjb25zdCB7IHJldHVybiAwOyB9Ci0gICAgdmly
dHVhbCBpbnQgY2xpZW50UGFkZGluZ0xlZnQoKSBjb25zdDsKLSAgICB2aXJ0dWFsIGludCBjbGll
bnRQYWRkaW5nUmlnaHQoKSBjb25zdDsKLSAgICB2aXJ0dWFsIGludCBsaXN0U2l6ZSgpIGNvbnN0
IHsgcmV0dXJuIG1fc3VnZ2VzdGlvbnMuc2l6ZSgpOyB9Ci0gICAgdmlydHVhbCBpbnQgc2VsZWN0
ZWRJbmRleCgpIGNvbnN0IHsgcmV0dXJuIG1fc2VsZWN0ZWRJbmRleDsgfQotICAgIHZpcnR1YWwg
dm9pZCBwb3B1cERpZEhpZGUoKTsKLSAgICB2aXJ0dWFsIGJvb2wgaXRlbUlzU2VwYXJhdG9yKHVu
c2lnbmVkIGxpc3RJbmRleCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLSAgICB2aXJ0dWFsIGJv
b2wgaXRlbUlzTGFiZWwodW5zaWduZWQgbGlzdEluZGV4KSBjb25zdCB7IHJldHVybiBmYWxzZTsg
fQotICAgIHZpcnR1YWwgYm9vbCBpdGVtSXNTZWxlY3RlZCh1bnNpZ25lZCBsaXN0SW5kZXgpIGNv
bnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0gICAgdmlydHVhbCBib29sIHNob3VsZFBvcE92ZXIoKSBj
b25zdCB7IHJldHVybiBmYWxzZTsgfQotICAgIHZpcnR1YWwgYm9vbCB2YWx1ZVNob3VsZENoYW5n
ZU9uSG90VHJhY2soKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotICAgIHZpcnR1YWwgdm9pZCBz
ZXRUZXh0RnJvbUl0ZW0odW5zaWduZWQgbGlzdEluZGV4KTsKLSAgICB2aXJ0dWFsIFdlYkNvcmU6
OkZvbnRTZWxlY3RvciogZm9udFNlbGVjdG9yKCkgY29uc3Q7Ci0gICAgdmlydHVhbCBXZWJDb3Jl
OjpIb3N0V2luZG93KiBob3N0V2luZG93KCkgY29uc3Q7Ci0gICAgdmlydHVhbCBQYXNzUmVmUHRy
PFdlYkNvcmU6OlNjcm9sbGJhcj4gY3JlYXRlU2Nyb2xsYmFyKAotICAgICAgICBXZWJDb3JlOjpT
Y3JvbGxiYXJDbGllbnQqIGNsaWVudCwKLSAgICAgICAgV2ViQ29yZTo6U2Nyb2xsYmFyT3JpZW50
YXRpb24gb3JpZW50YXRpb24sCi0gICAgICAgIFdlYkNvcmU6OlNjcm9sbGJhckNvbnRyb2xTaXpl
IHNpemUpOwogCiBwcml2YXRlOgotICAgIFdlYkNvcmU6OlJlbmRlclN0eWxlKiB0ZXh0RmllbGRT
dHlsZSgpIGNvbnN0OwotCi0gICAgUmVmUHRyPFdlYkNvcmU6OkhUTUxJbnB1dEVsZW1lbnQ+IG1f
dGV4dEZpZWxkOwogICAgIFZlY3RvcjxXZWJDb3JlOjpTdHJpbmc+IG1fc3VnZ2VzdGlvbnM7Ci0g
ICAgaW50IG1fc2VsZWN0ZWRJbmRleDsKLSAgICBXZWJWaWV3SW1wbCogbV93ZWJWaWV3OwotICAg
IE93blB0cjxXZWJDb3JlOjpQb3B1cE1lbnVTdHlsZT4gbV9zdHlsZTsKIH07CiAKIH0gLy8gbmFt
ZXNwYWNlIFdlYktpdAorCisjZW5kaWYKSW5kZXg6IFdlYktpdC9jaHJvbWl1bS9zcmMvU3VnZ2Vz
dGlvbnNQb3B1cE1lbnVDbGllbnQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdC9jaHJvbWl1bS9z
cmMvU3VnZ2VzdGlvbnNQb3B1cE1lbnVDbGllbnQuY3BwCShyZXZpc2lvbiAwKQorKysgV2ViS2l0
L2Nocm9taXVtL3NyYy9TdWdnZXN0aW9uc1BvcHVwTWVudUNsaWVudC5jcHAJKHJldmlzaW9uIDAp
CkBAIC0wLDAgKzEsMjYyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMu
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJl
CisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11
c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJp
YnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHly
aWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMg
cHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhl
IG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9y
cyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9t
CisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNz
aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBI
T0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElN
UExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUg
SU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAq
IEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBU
SEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkg
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1Ig
Q09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8s
IFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNF
LAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9G
IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIlN1Z2dlc3Rp
b25zUG9wdXBNZW51Q2xpZW50LmgiCisKKyNpbmNsdWRlICJDU1NTdHlsZVNlbGVjdG9yLmgiCisj
aW5jbHVkZSAiQ1NTVmFsdWVLZXl3b3Jkcy5oIgorI2luY2x1ZGUgIkNocm9tZS5oIgorI2luY2x1
ZGUgIkZyYW1lVmlldy5oIgorI2luY2x1ZGUgIkhUTUxJbnB1dEVsZW1lbnQuaCIKKyNpbmNsdWRl
ICJSZW5kZXJUaGVtZS5oIgorI2luY2x1ZGUgIldlYlZpZXdJbXBsLmgiCisKK3VzaW5nIG5hbWVz
cGFjZSBXZWJDb3JlOworCituYW1lc3BhY2UgV2ViS2l0IHsKKworU3VnZ2VzdGlvbnNQb3B1cE1l
bnVDbGllbnQ6OlN1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50KCkKKyAgICA6IG1fdGV4dEZpZWxk
KDApCisgICAgLCBtX3NlbGVjdGVkSW5kZXgoMCkKK3sKK30KKworU3VnZ2VzdGlvbnNQb3B1cE1l
bnVDbGllbnQ6On5TdWdnZXN0aW9uc1BvcHVwTWVudUNsaWVudCgpCit7Cit9CisKKy8vIEZJWE1F
OiBJbXBsZW1lbnQgdGhpcyBwZXItZGVyaXZlZCBjbGFzcz8KK3ZvaWQgU3VnZ2VzdGlvbnNQb3B1
cE1lbnVDbGllbnQ6OnZhbHVlQ2hhbmdlZCh1bnNpZ25lZCBsaXN0SW5kZXgsIGJvb2wgZmlyZUV2
ZW50cykKK3sKKyAgICBtX3RleHRGaWVsZC0+c2V0VmFsdWUoZ2V0U3VnZ2VzdGlvbihsaXN0SW5k
ZXgpKTsKKworICAgIFdlYlZpZXdJbXBsKiB3ZWJWaWV3ID0gZ2V0V2ViVmlldygpOworICAgIGlm
ICghd2ViVmlldykKKyAgICAgICAgcmV0dXJuOworCisgICAgRWRpdG9yQ2xpZW50SW1wbCogZWRp
dG9yID0KKyAgICAgICAgc3RhdGljX2Nhc3Q8RWRpdG9yQ2xpZW50SW1wbCo+KHdlYlZpZXctPnBh
Z2UoKS0+ZWRpdG9yQ2xpZW50KCkpOworICAgIEFTU0VSVChlZGl0b3IpOworICAgIGVkaXRvci0+
b25BdXRvZmlsbFN1Z2dlc3Rpb25BY2NlcHRlZCgKKyAgICAgICAgc3RhdGljX2Nhc3Q8SFRNTElu
cHV0RWxlbWVudCo+KG1fdGV4dEZpZWxkLmdldCgpKSk7Cit9CisKK3ZvaWQgU3VnZ2VzdGlvbnNQ
b3B1cE1lbnVDbGllbnQ6OnNlbGVjdGlvbkNoYW5nZWQodW5zaWduZWQgbGlzdEluZGV4LCBib29s
IGZpcmVFdmVudHMpCit7CisgICAgaWYgKGxpc3RJbmRleCAhPSBzdGF0aWNfY2FzdDx1bnNpZ25l
ZD4oLTEpKSB7CisgICAgICAgIGNvbnN0IFdlYlN0cmluZyYgc3VnZ2VzdGlvbiA9IGdldFN1Z2dl
c3Rpb24obGlzdEluZGV4KTsKKyAgICAgICAgc2V0U3VnZ2VzdGVkVmFsdWUoc3VnZ2VzdGlvbik7
CisgICAgfSBlbHNlIHsKKyAgICAgICAgbV90ZXh0RmllbGQtPnNldFZhbHVlKG1fdHlwZWRGaWVs
ZFZhbHVlKTsKKyAgICAgICAgaWYgKG1fbGFzdEZpZWxkVmFsdWVzLT5jb250YWlucyhtX3RleHRG
aWVsZC0+bmFtZSgpKSkKKyAgICAgICAgICAgIG1fbGFzdEZpZWxkVmFsdWVzLT5zZXQobV90ZXh0
RmllbGQtPm5hbWUoKSwgbV90eXBlZEZpZWxkVmFsdWUpOworICAgICAgICBlbHNlCisgICAgICAg
ICAgICBtX2xhc3RGaWVsZFZhbHVlcy0+YWRkKG1fdGV4dEZpZWxkLT5uYW1lKCksIG1fdHlwZWRG
aWVsZFZhbHVlKTsKKyAgICB9Cit9CisKK1N0cmluZyBTdWdnZXN0aW9uc1BvcHVwTWVudUNsaWVu
dDo6aXRlbVRleHQodW5zaWduZWQgbGlzdEluZGV4KSBjb25zdAoreworICAgIHJldHVybiBnZXRT
dWdnZXN0aW9uKGxpc3RJbmRleCk7Cit9CisKK1BvcHVwTWVudVN0eWxlIFN1Z2dlc3Rpb25zUG9w
dXBNZW51Q2xpZW50OjppdGVtU3R5bGUodW5zaWduZWQgbGlzdEluZGV4KSBjb25zdAoreworICAg
IHJldHVybiAqbV9zdHlsZTsKK30KKworUG9wdXBNZW51U3R5bGUgU3VnZ2VzdGlvbnNQb3B1cE1l
bnVDbGllbnQ6Om1lbnVTdHlsZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuICptX3N0eWxlOworfQor
CitpbnQgU3VnZ2VzdGlvbnNQb3B1cE1lbnVDbGllbnQ6OmNsaWVudFBhZGRpbmdMZWZ0KCkgY29u
c3QKK3sKKyAgICAvLyBCdWcgaHR0cDovL2NyYnVnLmNvbS83NzA4IHNlZW1zIHRvIGluZGljYXRl
IHRoZSBzdHlsZSBjYW4gYmUgMC4KKyAgICBSZW5kZXJTdHlsZSogc3R5bGUgPSB0ZXh0RmllbGRT
dHlsZSgpOworICAgIGlmICghc3R5bGUpCisgICAgICAgcmV0dXJuIDA7CisKKyAgICByZXR1cm4g
UmVuZGVyVGhlbWU6OmRlZmF1bHRUaGVtZSgpLT5wb3B1cEludGVybmFsUGFkZGluZ0xlZnQoc3R5
bGUpOworfQorCitpbnQgU3VnZ2VzdGlvbnNQb3B1cE1lbnVDbGllbnQ6OmNsaWVudFBhZGRpbmdS
aWdodCgpIGNvbnN0Cit7CisgICAgLy8gQnVnIGh0dHA6Ly9jcmJ1Zy5jb20vNzcwOCBzZWVtcyB0
byBpbmRpY2F0ZSB0aGUgc3R5bGUgY2FuIGJlIDAuCisgICAgUmVuZGVyU3R5bGUqIHN0eWxlID0g
dGV4dEZpZWxkU3R5bGUoKTsKKyAgICBpZiAoIXN0eWxlKQorICAgICAgICByZXR1cm4gMDsKKwor
ICAgIHJldHVybiBSZW5kZXJUaGVtZTo6ZGVmYXVsdFRoZW1lKCktPnBvcHVwSW50ZXJuYWxQYWRk
aW5nUmlnaHQoc3R5bGUpOworfQorCit2b2lkIFN1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50Ojpw
b3B1cERpZEhpZGUoKQoreworICAgIG1fdGV4dEZpZWxkLT5zZXRWYWx1ZShtX3R5cGVkRmllbGRW
YWx1ZSk7CisgICAgcmVzZXRMYXN0U3VnZ2VzdGlvbigpOworICAgIFdlYlZpZXdJbXBsKiB3ZWJW
aWV3ID0gZ2V0V2ViVmlldygpOworICAgIGlmICh3ZWJWaWV3KQorICAgICAgICB3ZWJWaWV3LT5z
dWdnZXN0aW9uc1BvcHVwRGlkSGlkZSgpOworfQorCit2b2lkIFN1Z2dlc3Rpb25zUG9wdXBNZW51
Q2xpZW50OjpzZXRUZXh0RnJvbUl0ZW0odW5zaWduZWQgbGlzdEluZGV4KQoreworICAgIG1fdGV4
dEZpZWxkLT5zZXRWYWx1ZShnZXRTdWdnZXN0aW9uKGxpc3RJbmRleCkpOworICAgIHJlc2V0TGFz
dFN1Z2dlc3Rpb24oKTsKK30KKwordm9pZCBTdWdnZXN0aW9uc1BvcHVwTWVudUNsaWVudDo6cmVz
ZXRMYXN0U3VnZ2VzdGlvbigpCit7CisgICAgaWYgKG1fbGFzdEZpZWxkVmFsdWVzLT5jb250YWlu
cyhtX3RleHRGaWVsZC0+bmFtZSgpKSkKKyAgICAgICAgbV9sYXN0RmllbGRWYWx1ZXMtPnNldCht
X3RleHRGaWVsZC0+bmFtZSgpLCBtX3RleHRGaWVsZC0+dmFsdWUoKSk7CisgICAgZWxzZQorICAg
ICAgICBtX2xhc3RGaWVsZFZhbHVlcy0+YWRkKG1fdGV4dEZpZWxkLT5uYW1lKCksIG1fdGV4dEZp
ZWxkLT52YWx1ZSgpKTsKK30KKworRm9udFNlbGVjdG9yKiBTdWdnZXN0aW9uc1BvcHVwTWVudUNs
aWVudDo6Zm9udFNlbGVjdG9yKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV90ZXh0RmllbGQtPmRv
Y3VtZW50KCktPnN0eWxlU2VsZWN0b3IoKS0+Zm9udFNlbGVjdG9yKCk7Cit9CisKK0hvc3RXaW5k
b3cqIFN1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50Ojpob3N0V2luZG93KCkgY29uc3QKK3sKKyAg
ICByZXR1cm4gbV90ZXh0RmllbGQtPmRvY3VtZW50KCktPnZpZXcoKS0+aG9zdFdpbmRvdygpOwor
fQorCitQYXNzUmVmUHRyPFNjcm9sbGJhcj4gU3VnZ2VzdGlvbnNQb3B1cE1lbnVDbGllbnQ6OmNy
ZWF0ZVNjcm9sbGJhcigKKyAgICBTY3JvbGxiYXJDbGllbnQqIGNsaWVudCwKKyAgICBTY3JvbGxi
YXJPcmllbnRhdGlvbiBvcmllbnRhdGlvbiwKKyAgICBTY3JvbGxiYXJDb250cm9sU2l6ZSBzaXpl
KQoreworICAgIHJldHVybiBTY3JvbGxiYXI6OmNyZWF0ZU5hdGl2ZVNjcm9sbGJhcihjbGllbnQs
IG9yaWVudGF0aW9uLCBzaXplKTsKK30KKworUmVuZGVyU3R5bGUqIFN1Z2dlc3Rpb25zUG9wdXBN
ZW51Q2xpZW50Ojp0ZXh0RmllbGRTdHlsZSgpIGNvbnN0Cit7CisgICAgUmVuZGVyU3R5bGUqIHN0
eWxlID0gbV90ZXh0RmllbGQtPmNvbXB1dGVkU3R5bGUoKTsKKyAgICBpZiAoIXN0eWxlKSB7Cisg
ICAgICAgIC8vIEl0IHNlZW1zIHdlIGNhbiBvbmx5IGhhdmUgYSAwIHN0eWxlIGluIGEgVGV4dEZp
ZWxkIGlmIHRoZQorICAgICAgICAvLyBub2RlIGlzIGRldGFjaGVkLCBpbiB3aGljaCBjYXNlIHdl
IHRoZSBwb3B1cCBzaG91ZCBub3QgYmUKKyAgICAgICAgLy8gc2hvd2luZy4gIFBsZWFzZSByZXBv
cnQgdGhpcyBpbiBodHRwOi8vY3JidWcuY29tLzc3MDggYW5kCisgICAgICAgIC8vIGluY2x1ZGUg
dGhlIHBhZ2UgeW91IHdlcmUgdmlzaXRpbmcuCisgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgp
OworICAgIH0KKyAgICByZXR1cm4gc3R5bGU7Cit9CisKK3ZvaWQgU3VnZ2VzdGlvbnNQb3B1cE1l
bnVDbGllbnQ6OmluaXRpYWxpemUoSFRNTElucHV0RWxlbWVudCogdGV4dEZpZWxkLAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVmYXVsdFN1Z2dlc3Rp
b25JbmRleCkKK3sKKyAgICBpZiAoIW1fbGFzdEZpZWxkVmFsdWVzKQorICAgICAgICBtX2xhc3RG
aWVsZFZhbHVlcy5zZXQobmV3IEZpZWxkVmFsdWVzTWFwKTsKKworICAgIG1fdGV4dEZpZWxkID0g
dGV4dEZpZWxkOworICAgIG1fdHlwZWRGaWVsZFZhbHVlID0gdGV4dEZpZWxkLT52YWx1ZSgpOwor
ICAgIG1fc2VsZWN0ZWRJbmRleCA9IGRlZmF1bHRTdWdnZXN0aW9uSW5kZXg7CisKKyAgICBzZXRJ
bml0aWFsU3VnZ2VzdGlvbigpOworCisgICAgRm9udERlc2NyaXB0aW9uIGZvbnREZXNjcmlwdGlv
bjsKKyAgICBSZW5kZXJUaGVtZTo6ZGVmYXVsdFRoZW1lKCktPnN5c3RlbUZvbnQoQ1NTVmFsdWVX
ZWJraXRDb250cm9sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBmb250RGVzY3JpcHRpb24pOworCisgICAgLy8gVXNlIGEgc21hbGxlciBmb250IHNpemUgdG8g
bWF0Y2ggSUUvRmlyZWZveC4KKyAgICAvLyBGSVhNRTogaHR0cDovL2NyYnVnLmNvbS83Mzc2IHVz
ZSB0aGUgc3lzdGVtIHNpemUgaW5zdGVhZCBvZiBhCisgICAgLy8gICAgICAgIGZpeGVkIGZvbnQg
c2l6ZSB2YWx1ZS4KKyAgICBmb250RGVzY3JpcHRpb24uc2V0Q29tcHV0ZWRTaXplKDEyLjApOwor
ICAgIEZvbnQgZm9udChmb250RGVzY3JpcHRpb24sIDAsIDApOworICAgIGZvbnQudXBkYXRlKHRl
eHRGaWVsZC0+ZG9jdW1lbnQoKS0+c3R5bGVTZWxlY3RvcigpLT5mb250U2VsZWN0b3IoKSk7Cisg
ICAgLy8gVGhlIGRpcmVjdGlvbiBvZiB0ZXh0IGluIHBvcHVwIG1lbnUgaXMgc2V0IHRoZSBzYW1l
IGFzIHRoZSBkaXJlY3Rpb24gb2YKKyAgICAvLyB0aGUgaW5wdXQgZWxlbWVudDogdGV4dEZpZWxk
LgorICAgIG1fc3R5bGUuc2V0KG5ldyBQb3B1cE1lbnVTdHlsZShDb2xvcjo6YmxhY2ssIENvbG9y
Ojp3aGl0ZSwgZm9udCwgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
TGVuZ3RoKFdlYkNvcmU6OkZpeGVkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgdGV4dEZpZWxkLT5yZW5kZXJlcigpLT5zdHlsZSgpLT5kaXJlY3Rpb24oKSkpOworfQorCit2
b2lkIFN1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50OjpzZXRJbml0aWFsU3VnZ2VzdGlvbigpCit7
CisgICAgaWYgKCFnZXRTdWdnZXN0aW9uc0NvdW50KCkgfHwgIW1fdGV4dEZpZWxkLT5uYW1lKCku
bGVuZ3RoKCkgfHwgIW1fdHlwZWRGaWVsZFZhbHVlLmxlbmd0aCgpKQorICAgICAgICByZXR1cm47
CisKKyAgICBpbnQgbmV3SW5kZXggPSBtX3NlbGVjdGVkSW5kZXggPj0gMCA/IG1fc2VsZWN0ZWRJ
bmRleCA6IDA7CisgICAgY29uc3QgU3RyaW5nJiBzdWdnZXN0aW9uID0gZ2V0U3VnZ2VzdGlvbihu
ZXdJbmRleCk7CisgICAgYm9vbCBoYXNQcmV2aW91c1ZhbHVlID0gbV9sYXN0RmllbGRWYWx1ZXMt
PmNvbnRhaW5zKG1fdGV4dEZpZWxkLT5uYW1lKCkpOworCisgICAgU3RyaW5nIHByZXZWYWx1ZTsK
KyAgICBpZiAoaGFzUHJldmlvdXNWYWx1ZSkKKyAgICAgICAgcHJldlZhbHVlID0gbV9sYXN0Rmll
bGRWYWx1ZXMtPmdldChtX3RleHRGaWVsZC0+bmFtZSgpKTsKKworICAgIGlmICghaGFzUHJldmlv
dXNWYWx1ZSB8fCBtX3R5cGVkRmllbGRWYWx1ZS5sZW5ndGgoKSA+IG1fbGFzdEZpZWxkVmFsdWVz
LT5nZXQobV90ZXh0RmllbGQtPm5hbWUoKSkubGVuZ3RoKCkpIHsKKyAgICAgICAgaWYgKHN1Z2dl
c3Rpb24uc3RhcnRzV2l0aChtX3R5cGVkRmllbGRWYWx1ZSkpCisgICAgICAgICAgICBtX3NlbGVj
dGVkSW5kZXggPSBuZXdJbmRleDsKKworICAgICAgICBpbnQgc3RhcnQgPSAwOworICAgICAgICBT
dHJpbmcgbmV3U3VnZ2VzdGlvbiA9IHN1Z2dlc3Rpb247CisgICAgICAgIGlmIChzdWdnZXN0aW9u
LnN0YXJ0c1dpdGgobV90eXBlZEZpZWxkVmFsdWUsIGZhbHNlKSkgeworICAgICAgICAgICAgbmV3
U3VnZ2VzdGlvbiA9IG1fdHlwZWRGaWVsZFZhbHVlOworICAgICAgICAgICAgaWYgKHN1Z2dlc3Rp
b24ubGVuZ3RoKCkgPiBtX3R5cGVkRmllbGRWYWx1ZS5sZW5ndGgoKSkgeworICAgICAgICAgICAg
ICAgIG5ld1N1Z2dlc3Rpb24uYXBwZW5kKHN1Z2dlc3Rpb24uc3Vic3RyaW5nKG1fdHlwZWRGaWVs
ZFZhbHVlLmxlbmd0aCgpLAorICAgICAgICAgICAgICAgICAgICBzdWdnZXN0aW9uLmxlbmd0aCgp
IC0gbV90eXBlZEZpZWxkVmFsdWUubGVuZ3RoKCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgIHN0YXJ0ID0gbV90eXBlZEZpZWxkVmFsdWUubGVuZ3RoKCk7CisgICAgICAgIH0KKworICAg
ICAgICBtX3RleHRGaWVsZC0+c2V0U3VnZ2VzdGVkVmFsdWUobmV3U3VnZ2VzdGlvbik7CisgICAg
ICAgIG1fdGV4dEZpZWxkLT5zZXRTZWxlY3Rpb25SYW5nZShzdGFydCwgbmV3U3VnZ2VzdGlvbi5s
ZW5ndGgoKSk7CisgICAgfQorCisgICAgaWYgKGhhc1ByZXZpb3VzVmFsdWUpCisgICAgICAgIG1f
bGFzdEZpZWxkVmFsdWVzLT5zZXQobV90ZXh0RmllbGQtPm5hbWUoKSwgbV90eXBlZEZpZWxkVmFs
dWUpOworICAgIGVsc2UKKyAgICAgICAgbV9sYXN0RmllbGRWYWx1ZXMtPmFkZChtX3RleHRGaWVs
ZC0+bmFtZSgpLCBtX3R5cGVkRmllbGRWYWx1ZSk7Cit9CisKK3ZvaWQgU3VnZ2VzdGlvbnNQb3B1
cE1lbnVDbGllbnQ6OnNldFN1Z2dlc3RlZFZhbHVlKGNvbnN0IFdlYlN0cmluZyYgc3VnZ2VzdGlv
bikKK3sKKyAgICBtX3RleHRGaWVsZC0+c2V0U3VnZ2VzdGVkVmFsdWUoc3VnZ2VzdGlvbik7Cisg
ICAgbV90ZXh0RmllbGQtPnNldFNlbGVjdGlvblJhbmdlKG1fdHlwZWRGaWVsZFZhbHVlLmxlbmd0
aCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWdnZXN0aW9uLmxlbmd0
aCgpKTsKK30KKworV2ViVmlld0ltcGwqIFN1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50OjpnZXRX
ZWJWaWV3KCkgY29uc3QKK3sKKyAgICBGcmFtZSogZnJhbWUgPSBtX3RleHRGaWVsZC0+ZG9jdW1l
bnQoKS0+ZnJhbWUoKTsKKyAgICBpZiAoIWZyYW1lKQorICAgICAgICByZXR1cm4gMDsKKworICAg
IFBhZ2UqIHBhZ2UgPSBmcmFtZS0+cGFnZSgpOworICAgIGlmICghcGFnZSkKKyAgICAgICAgcmV0
dXJuIDA7CisKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Q2hyb21lQ2xpZW50SW1wbCo+KHBhZ2Ut
PmNocm9tZSgpLT5jbGllbnQoKSktPndlYlZpZXcoKTsKK30KKworfSAvLyBuYW1lc3BhY2UgV2Vi
S2l0CkluZGV4OiBXZWJLaXQvY2hyb21pdW0vc3JjL1N1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50
LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gV2ViS2l0L2Nocm9taXVtL3NyYy9TdWdnZXN0aW9uc1BvcHVwTWVu
dUNsaWVudC5oCShyZXZpc2lvbiAwKQorKysgV2ViS2l0L2Nocm9taXVtL3NyYy9TdWdnZXN0aW9u
c1BvcHVwTWVudUNsaWVudC5oCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDExNyBAQAorLyoKKyAq
IENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoK
KyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJl
ZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVz
dCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1l
bnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0
cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0
aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBv
ciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0
IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJF
IElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisg
KiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUg
RElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1Ig
Q09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5U
QUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5D
TFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRF
IEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9S
IEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhF
T1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwg
T1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJ
TiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFE
VklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRl
ICJQb3B1cE1lbnVDbGllbnQuaCIKKworI2lmbmRlZiBTdWdnZXN0aW9uc1BvcHVwTWVudUNsaWVu
dF9oCisjZGVmaW5lIFN1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50X2gKKworbmFtZXNwYWNlIFdl
YkNvcmUgeworY2xhc3MgSFRNTElucHV0RWxlbWVudDsKK2NsYXNzIFBvcHVwTWVudVN0eWxlOwor
Y2xhc3MgUmVuZGVyU3R5bGU7Cit9CisKK25hbWVzcGFjZSBXZWJLaXQgeworY2xhc3MgV2ViU3Ry
aW5nOworY2xhc3MgV2ViVmlld0ltcGw7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY2xhc3MgV2Vi
VmVjdG9yOworCisvLyBUaGUgU3VnZ2VzdGlvbnMgcG9wdXAgbWVudSBjbGllbnQsIHVzZWQgdG8g
ZGlzcGxheSBhIGxpc3Qgb2Ygc3VnZ2VzdGlvbnMuCitjbGFzcyBTdWdnZXN0aW9uc1BvcHVwTWVu
dUNsaWVudCA6IHB1YmxpYyBXZWJDb3JlOjpQb3B1cE1lbnVDbGllbnQgeworcHVibGljOgorICAg
IFN1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50KCk7CisgICAgdmlydHVhbCB+U3VnZ2VzdGlvbnNQ
b3B1cE1lbnVDbGllbnQoKTsKKworICAgIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiBzdWdnZXN0
aW9ucyBhdmFpbGFibGUuCisgICAgdmlydHVhbCB1bnNpZ25lZCBnZXRTdWdnZXN0aW9uc0NvdW50
KCkgY29uc3QgPSAwOworCisgICAgLy8gUmV0dXJucyB0aGUgc3VnZ2VzdGlvbiBhdCB8bGlzdElu
ZGV4fC4KKyAgICB2aXJ0dWFsIFdlYlN0cmluZyBnZXRTdWdnZXN0aW9uKHVuc2lnbmVkIGxpc3RJ
bmRleCkgY29uc3QgPSAwOworCisgICAgLy8gUmVtb3ZlcyB0aGUgc3VnZ2VzdGlvbiBhdCB8bGlz
dEluZGV4fCBmcm9tIHRoZSBsaXN0IG9mIHN1Z2dlc3Rpb25zLgorICAgIHZpcnR1YWwgdm9pZCBy
ZW1vdmVTdWdnZXN0aW9uQXRJbmRleCh1bnNpZ25lZCBsaXN0SW5kZXgpID0gMDsKKworICAgIC8v
IFdlYkNvcmU6OlBvcHVwTWVudUNsaWVudCBtZXRob2RzOgorICAgIHZpcnR1YWwgdm9pZCB2YWx1
ZUNoYW5nZWQodW5zaWduZWQgbGlzdEluZGV4LCBib29sIGZpcmVFdmVudHMgPSB0cnVlKTsKKyAg
ICB2aXJ0dWFsIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZCh1bnNpZ25lZCBsaXN0SW5kZXgsIGJvb2wg
ZmlyZUV2ZW50cyA9IHRydWUpOworICAgIHZpcnR1YWwgV2ViQ29yZTo6U3RyaW5nIGl0ZW1UZXh0
KHVuc2lnbmVkIGxpc3RJbmRleCkgY29uc3Q7CisgICAgdmlydHVhbCBXZWJDb3JlOjpTdHJpbmcg
aXRlbVRvb2xUaXAodW5zaWduZWQgbGFzdEluZGV4KSBjb25zdCB7IHJldHVybiBXZWJDb3JlOjpT
dHJpbmcoKTsgfQorICAgIHZpcnR1YWwgYm9vbCBpdGVtSXNFbmFibGVkKHVuc2lnbmVkIGxpc3RJ
bmRleCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQorICAgIHZpcnR1YWwgV2ViQ29yZTo6UG9wdXBN
ZW51U3R5bGUgaXRlbVN0eWxlKHVuc2lnbmVkIGxpc3RJbmRleCkgY29uc3Q7CisgICAgdmlydHVh
bCBXZWJDb3JlOjpQb3B1cE1lbnVTdHlsZSBtZW51U3R5bGUoKSBjb25zdDsKKyAgICB2aXJ0dWFs
IGludCBjbGllbnRJbnNldExlZnQoKSBjb25zdCB7IHJldHVybiAwOyB9CisgICAgdmlydHVhbCBp
bnQgY2xpZW50SW5zZXRSaWdodCgpIGNvbnN0IHsgcmV0dXJuIDA7IH0KKyAgICB2aXJ0dWFsIGlu
dCBjbGllbnRQYWRkaW5nTGVmdCgpIGNvbnN0OworICAgIHZpcnR1YWwgaW50IGNsaWVudFBhZGRp
bmdSaWdodCgpIGNvbnN0OworICAgIHZpcnR1YWwgaW50IGxpc3RTaXplKCkgY29uc3QgeyByZXR1
cm4gZ2V0U3VnZ2VzdGlvbnNDb3VudCgpOyB9CisgICAgdmlydHVhbCBpbnQgc2VsZWN0ZWRJbmRl
eCgpIGNvbnN0IHsgcmV0dXJuIG1fc2VsZWN0ZWRJbmRleDsgfQorICAgIHZpcnR1YWwgdm9pZCBw
b3B1cERpZEhpZGUoKTsKKyAgICB2aXJ0dWFsIGJvb2wgaXRlbUlzU2VwYXJhdG9yKHVuc2lnbmVk
IGxpc3RJbmRleCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgICB2aXJ0dWFsIGJvb2wgaXRl
bUlzTGFiZWwodW5zaWduZWQgbGlzdEluZGV4KSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorICAg
IHZpcnR1YWwgYm9vbCBpdGVtSXNTZWxlY3RlZCh1bnNpZ25lZCBsaXN0SW5kZXgpIGNvbnN0IHsg
cmV0dXJuIGZhbHNlOyB9CisgICAgdmlydHVhbCBib29sIHNob3VsZFBvcE92ZXIoKSBjb25zdCB7
IHJldHVybiBmYWxzZTsgfQorICAgIHZpcnR1YWwgYm9vbCB2YWx1ZVNob3VsZENoYW5nZU9uSG90
VHJhY2soKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorICAgIHZpcnR1YWwgdm9pZCBzZXRUZXh0
RnJvbUl0ZW0odW5zaWduZWQgbGlzdEluZGV4KTsKKyAgICB2aXJ0dWFsIFdlYkNvcmU6OkZvbnRT
ZWxlY3RvciogZm9udFNlbGVjdG9yKCkgY29uc3Q7CisgICAgdmlydHVhbCBXZWJDb3JlOjpIb3N0
V2luZG93KiBob3N0V2luZG93KCkgY29uc3Q7CisgICAgdmlydHVhbCBQYXNzUmVmUHRyPFdlYkNv
cmU6OlNjcm9sbGJhcj4gY3JlYXRlU2Nyb2xsYmFyKAorICAgICAgICBXZWJDb3JlOjpTY3JvbGxi
YXJDbGllbnQqIGNsaWVudCwKKyAgICAgICAgV2ViQ29yZTo6U2Nyb2xsYmFyT3JpZW50YXRpb24g
b3JpZW50YXRpb24sCisgICAgICAgIFdlYkNvcmU6OlNjcm9sbGJhckNvbnRyb2xTaXplIHNpemUp
OworCitwcm90ZWN0ZWQ6CisgICAgdm9pZCBpbml0aWFsaXplKFdlYkNvcmU6OkhUTUxJbnB1dEVs
ZW1lbnQqIHRleHRGaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgaW50IGRlZmF1bHRTdWdnZXN0
aW9uSW5kZXgpOworICAgIHZvaWQgc2V0SW5pdGlhbFN1Z2dlc3Rpb24oKTsKKworICAgIGludCBn
ZXRTZWxlY3RlZEluZGV4KCkgY29uc3QgeyByZXR1cm4gbV9zZWxlY3RlZEluZGV4OyB9CisgICAg
dm9pZCBzZXRTZWxlY3RlZEluZGV4KGludCBpbmRleCkgeyBtX3NlbGVjdGVkSW5kZXggPSBpbmRl
eDsgfQorCisgICAgdm9pZCBzZXRTdWdnZXN0ZWRWYWx1ZShjb25zdCBXZWJTdHJpbmcmIHN1Z2dl
c3Rpb24pOworCisgICAgV2ViVmlld0ltcGwqIGdldFdlYlZpZXcoKSBjb25zdDsKKyAgICBXZWJD
b3JlOjpIVE1MSW5wdXRFbGVtZW50KiBnZXRUZXh0RmllbGQoKSBjb25zdCB7IHJldHVybiBtX3Rl
eHRGaWVsZC5nZXQoKTsgfQorCitwcml2YXRlOgorICAgIFdlYkNvcmU6OlJlbmRlclN0eWxlKiB0
ZXh0RmllbGRTdHlsZSgpIGNvbnN0OworICAgIHZvaWQgcmVzZXRMYXN0U3VnZ2VzdGlvbigpOwor
CisgICAgUmVmUHRyPFdlYkNvcmU6OkhUTUxJbnB1dEVsZW1lbnQ+IG1fdGV4dEZpZWxkOworICAg
IGludCBtX3NlbGVjdGVkSW5kZXg7CisgICAgV2ViQ29yZTo6U3RyaW5nIG1fdHlwZWRGaWVsZFZh
bHVlOworICAgIE93blB0cjxXZWJDb3JlOjpQb3B1cE1lbnVTdHlsZT4gbV9zdHlsZTsKKyAgICB0
eXBlZGVmIEhhc2hNYXA8V2ViQ29yZTo6U3RyaW5nLCBXZWJDb3JlOjpTdHJpbmc+IEZpZWxkVmFs
dWVzTWFwOworICAgIE93blB0cjxGaWVsZFZhbHVlc01hcD4gbV9sYXN0RmllbGRWYWx1ZXM7Cit9
OworCit9IC8vIG5hbWVzcGFjZSBXZWJLaXQKKworI2VuZGlmCgpQcm9wZXJ0eSBjaGFuZ2VzIG9u
OiBXZWJLaXQvY2hyb21pdW0vc3JjL1N1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50LmgKX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fXwpBZGRlZDogc3ZuOmVvbC1zdHlsZQogICArIExGCgpJbmRleDogV2ViS2l0L2Nocm9taXVt
L3NyYy9XZWJWaWV3SW1wbC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0L2Nocm9taXVtL3NyYy9X
ZWJWaWV3SW1wbC5jcHAJKHJldmlzaW9uIDU0NTAxKQorKysgV2ViS2l0L2Nocm9taXVtL3NyYy9X
ZWJWaWV3SW1wbC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTMxLDYgKzMxLDcgQEAKICNpbmNsdWRl
ICJjb25maWcuaCIKICNpbmNsdWRlICJXZWJWaWV3SW1wbC5oIgogCisjaW5jbHVkZSAiQXV0b0Zp
bGxQb3B1cE1lbnVDbGllbnQuaCIKICNpbmNsdWRlICJBdXRvY29tcGxldGVQb3B1cE1lbnVDbGll
bnQuaCIKICNpbmNsdWRlICJBWE9iamVjdENhY2hlLmgiCiAjaW5jbHVkZSAiQ2hyb21lLmgiCkBA
IC0yNDAsNiArMjQxLDggQEAgV2ViVmlld0ltcGw6OldlYlZpZXdJbXBsKFdlYlZpZXdDbGllbnQq
IAogICAgICwgbV9vcGVyYXRpb25zQWxsb3dlZChXZWJEcmFnT3BlcmF0aW9uTm9uZSkKICAgICAs
IG1fZHJhZ09wZXJhdGlvbihXZWJEcmFnT3BlcmF0aW9uTm9uZSkKICAgICAsIG1fc3VnZ2VzdGlv
bnNQb3B1cFNob3dpbmcoZmFsc2UpCisgICAgLCBtX3N1Z2dlc3Rpb25zUG9wdXBDbGllbnQoMCkK
KyAgICAsIG1fc3VnZ2VzdGlvbnNQb3B1cCgwKQogICAgICwgbV9pc1RyYW5zcGFyZW50KGZhbHNl
KQogICAgICwgbV90YWJzVG9MaW5rcyhmYWxzZSkKIHsKQEAgLTQ2OCw3ICs0NzEsNyBAQCBib29s
IFdlYlZpZXdJbXBsOjprZXlFdmVudChjb25zdCBXZWJLZXliCiAgICAgLy8gZXZlbnQuCiAgICAg
bV9zdXBwcmVzc05leHRLZXlwcmVzc0V2ZW50ID0gZmFsc2U7CiAKLSAgICAvLyBHaXZlIGF1dG9j
b21wbGV0ZSBhIGNoYW5jZSB0byBjb25zdW1lIHRoZSBrZXkgZXZlbnRzIGl0IGlzIGludGVyZXN0
ZWQgaW4uCisgICAgLy8gR2l2ZSBBdXRvY29tcGxldGUgYSBjaGFuY2UgdG8gY29uc3VtZSB0aGUg
a2V5IGV2ZW50cyBpdCBpcyBpbnRlcmVzdGVkIGluLgogICAgIGlmIChhdXRvY29tcGxldGVIYW5k
bGVLZXlFdmVudChldmVudCkpCiAgICAgICAgIHJldHVybiB0cnVlOwogCkBAIC01NDEsNyArNTQ0
LDcgQEAgYm9vbCBXZWJWaWV3SW1wbDo6YXV0b2NvbXBsZXRlSGFuZGxlS2V5RQogICAgICAgICBt
X2NsaWVudC0+cmVtb3ZlQXV0b2ZpbGxTdWdnZXN0aW9ucyhuYW1lLCB2YWx1ZSk7CiAgICAgICAg
IC8vIFVwZGF0ZSB0aGUgZW50cmllcyBpbiB0aGUgY3VycmVudGx5IHNob3dpbmcgcG9wdXAgdG8g
cmVmbGVjdCB0aGUKICAgICAgICAgLy8gZGVsZXRpb24uCi0gICAgICAgIG1fYXV0b2NvbXBsZXRl
UG9wdXBDbGllbnQtPnJlbW92ZUl0ZW1BdEluZGV4KHNlbGVjdGVkSW5kZXgpOworICAgICAgICBt
X2F1dG9jb21wbGV0ZVBvcHVwQ2xpZW50LT5yZW1vdmVTdWdnZXN0aW9uQXRJbmRleChzZWxlY3Rl
ZEluZGV4KTsKICAgICAgICAgcmVmcmVzaFN1Z2dlc3Rpb25zUG9wdXAoKTsKICAgICAgICAgcmV0
dXJuIGZhbHNlOwogICAgIH0KQEAgLTE1NTgsNTggKzE1NjEsMTE4IEBAIHZvaWQgV2ViVmlld0lt
cGw6OmFwcGx5QXV0b2ZpbGxTdWdnZXN0aW8KICAgICBjb25zdCBXZWJWZWN0b3I8V2ViU3RyaW5n
PiYgc3VnZ2VzdGlvbnMsCiAgICAgaW50IGRlZmF1bHRTdWdnZXN0aW9uSW5kZXgpCiB7Ci0gICAg
aWYgKCFtX3BhZ2UuZ2V0KCkgfHwgc3VnZ2VzdGlvbnMuaXNFbXB0eSgpKSB7CisgICAgYXBwbHlB
dXRvY29tcGxldGVTdWdnZXN0aW9ucyhub2RlLCBzdWdnZXN0aW9ucywgZGVmYXVsdFN1Z2dlc3Rp
b25JbmRleCk7Cit9CisKK3ZvaWQgV2ViVmlld0ltcGw6OmFwcGx5QXV0b0ZpbGxTdWdnZXN0aW9u
cygKKyAgICBjb25zdCBXZWJOb2RlJiBub2RlLAorICAgIGNvbnN0IFdlYlZlY3RvcjxXZWJTdHJp
bmc+JiBuYW1lcywKKyAgICBjb25zdCBXZWJWZWN0b3I8V2ViU3RyaW5nPiYgbGFiZWxzLAorICAg
IGludCBkZWZhdWx0U3VnZ2VzdGlvbkluZGV4KQoreworICAgIEFTU0VSVChuYW1lcy5zaXplKCkg
PT0gbGFiZWxzLnNpemUoKSk7CisgICAgQVNTRVJUKGRlZmF1bHRTdWdnZXN0aW9uSW5kZXggPCBz
dGF0aWNfY2FzdDxpbnQ+KG5hbWVzLnNpemUoKSkpOworCisgICAgaWYgKG5hbWVzLmlzRW1wdHko
KSkgewogICAgICAgICBoaWRlU3VnZ2VzdGlvbnNQb3B1cCgpOwogICAgICAgICByZXR1cm47CiAg
ICAgfQogCisgICAgUmVmUHRyPE5vZGU+IGZvY3VzZWROb2RlID0gZm9jdXNlZFdlYkNvcmVOb2Rl
KCk7CisgICAgLy8gSWYgdGhlIG5vZGUgZm9yIHdoaWNoIHdlIHF1ZXJpZWQgdGhlIEF1dG9GaWxs
IHN1Z2dlc3Rpb25zIGlzIG5vdCB0aGUKKyAgICAvLyBmb2N1c2VkIG5vZGUsIHRoZW4gd2UgaGF2
ZSBub3RoaW5nIHRvIGRvLiAgRklYTUU6IGFsc28gY2hlY2sgdGhlCisgICAgLy8gY2FyZXQgaXMg
YXQgdGhlIGVuZCBhbmQgdGhhdCB0aGUgdGV4dCBoYXMgbm90IGNoYW5nZWQuCisgICAgaWYgKCFm
b2N1c2VkTm9kZSB8fCBmb2N1c2VkTm9kZSAhPSBQYXNzUmVmUHRyPE5vZGU+KG5vZGUpKSB7Cisg
ICAgICAgIGhpZGVTdWdnZXN0aW9uc1BvcHVwKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisK
KyAgICBIVE1MSW5wdXRFbGVtZW50KiBpbnB1dEVsZW0gPQorICAgICAgICBzdGF0aWNfY2FzdDxI
VE1MSW5wdXRFbGVtZW50Kj4oZm9jdXNlZE5vZGUuZ2V0KCkpOworCisgICAgLy8gVGhlIGZpcnN0
IHRpbWUgdGhlIEF1dG9GaWxsIHBvcHVwIGlzIHNob3duIHdlJ2xsIGNyZWF0ZSB0aGUgY2xpZW50
IGFuZAorICAgIC8vIHRoZSBwb3B1cC4KKyAgICBpZiAoIW1fYXV0b0ZpbGxQb3B1cENsaWVudC5n
ZXQoKSkKKyAgICAgICAgbV9hdXRvRmlsbFBvcHVwQ2xpZW50LnNldChuZXcgQXV0b0ZpbGxQb3B1
cE1lbnVDbGllbnQpOworCisgICAgbV9hdXRvRmlsbFBvcHVwQ2xpZW50LT5pbml0aWFsaXplKGlu
cHV0RWxlbSwgbmFtZXMsIGxhYmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgZGVmYXVsdFN1Z2dlc3Rpb25JbmRleCk7CisKKyAgICBpZiAobV9zdWdnZXN0aW9uc1Bv
cHVwQ2xpZW50ICE9IG1fYXV0b0ZpbGxQb3B1cENsaWVudC5nZXQoKSkgeworICAgICAgICBoaWRl
U3VnZ2VzdGlvbnNQb3B1cCgpOworICAgICAgICBtX3N1Z2dlc3Rpb25zUG9wdXBDbGllbnQgPSBt
X2F1dG9GaWxsUG9wdXBDbGllbnQuZ2V0KCk7CisgICAgfQorCisgICAgaWYgKCFtX2F1dG9GaWxs
UG9wdXAuZ2V0KCkpIHsKKyAgICAgICAgbV9hdXRvRmlsbFBvcHVwID0gUG9wdXBDb250YWluZXI6
OmNyZWF0ZShtX3N1Z2dlc3Rpb25zUG9wdXBDbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGlvbnNQb3B1cFNldHRpbmdzKTsKKyAg
ICB9CisKKyAgICBpZiAobV9zdWdnZXN0aW9uc1BvcHVwICE9IG1fYXV0b0ZpbGxQb3B1cC5nZXQo
KSkKKyAgICAgICAgbV9zdWdnZXN0aW9uc1BvcHVwID0gbV9hdXRvRmlsbFBvcHVwLmdldCgpOwor
CisgICAgaWYgKG1fc3VnZ2VzdGlvbnNQb3B1cFNob3dpbmcpIHsKKyAgICAgICAgbV9hdXRvRmls
bFBvcHVwQ2xpZW50LT5zZXRTdWdnZXN0aW9ucyhuYW1lcywgbGFiZWxzKTsKKyAgICAgICAgcmVm
cmVzaFN1Z2dlc3Rpb25zUG9wdXAoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtX3N1Z2dlc3Rp
b25zUG9wdXAtPnNob3coZm9jdXNlZE5vZGUtPmdldFJlY3QoKSwKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGZvY3VzZWROb2RlLT5vd25lckRvY3VtZW50KCktPnZpZXcoKSwgMCk7
CisgICAgICAgIG1fc3VnZ2VzdGlvbnNQb3B1cFNob3dpbmcgPSB0cnVlOworICAgIH0KK30KKwor
dm9pZCBXZWJWaWV3SW1wbDo6YXBwbHlBdXRvY29tcGxldGVTdWdnZXN0aW9ucygKKyAgICBjb25z
dCBXZWJOb2RlJiBub2RlLAorICAgIGNvbnN0IFdlYlZlY3RvcjxXZWJTdHJpbmc+JiBzdWdnZXN0
aW9ucywKKyAgICBpbnQgZGVmYXVsdFN1Z2dlc3Rpb25JbmRleCkKK3sKICAgICBBU1NFUlQoZGVm
YXVsdFN1Z2dlc3Rpb25JbmRleCA8IHN0YXRpY19jYXN0PGludD4oc3VnZ2VzdGlvbnMuc2l6ZSgp
KSk7CiAKLSAgICBpZiAoUmVmUHRyPEZyYW1lPiBmb2N1c2VkID0gbV9wYWdlLT5mb2N1c0NvbnRy
b2xsZXIoKS0+Zm9jdXNlZEZyYW1lKCkpIHsKLSAgICAgICAgUmVmUHRyPERvY3VtZW50PiBkb2N1
bWVudCA9IGZvY3VzZWQtPmRvY3VtZW50KCk7Ci0gICAgICAgIGlmICghZG9jdW1lbnQuZ2V0KCkp
IHsKLSAgICAgICAgICAgIGhpZGVTdWdnZXN0aW9uc1BvcHVwKCk7Ci0gICAgICAgICAgICByZXR1
cm47Ci0gICAgICAgIH0KKyAgICBpZiAoIW1fcGFnZS5nZXQoKSB8fCBzdWdnZXN0aW9ucy5pc0Vt
cHR5KCkpIHsKKyAgICAgICAgaGlkZVN1Z2dlc3Rpb25zUG9wdXAoKTsKKyAgICAgICAgcmV0dXJu
OworICAgIH0KIAotICAgICAgICBSZWZQdHI8Tm9kZT4gZm9jdXNlZE5vZGUgPSBkb2N1bWVudC0+
Zm9jdXNlZE5vZGUoKTsKLSAgICAgICAgLy8gSWYgdGhlIG5vZGUgZm9yIHdoaWNoIHdlIHF1ZXJp
ZWQgdGhlIGF1dG9maWxsIHN1Z2dlc3Rpb25zIGlzIG5vdCB0aGUKLSAgICAgICAgLy8gZm9jdXNl
ZCBub2RlLCB0aGVuIHdlIGhhdmUgbm90aGluZyB0byBkby4gIEZJWE1FOiBhbHNvIGNoZWNrIHRo
ZQotICAgICAgICAvLyBjYXJyZXQgaXMgYXQgdGhlIGVuZCBhbmQgdGhhdCB0aGUgdGV4dCBoYXMg
bm90IGNoYW5nZWQuCi0gICAgICAgIGlmICghZm9jdXNlZE5vZGUuZ2V0KCkgfHwgZm9jdXNlZE5v
ZGUgIT0gUGFzc1JlZlB0cjxOb2RlPihub2RlKSkgewotICAgICAgICAgICAgaGlkZVN1Z2dlc3Rp
b25zUG9wdXAoKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQorICAgIFJlZlB0cjxO
b2RlPiBmb2N1c2VkTm9kZSA9IGZvY3VzZWRXZWJDb3JlTm9kZSgpOworICAgIC8vIElmIHRoZSBu
b2RlIGZvciB3aGljaCB3ZSBxdWVyaWVkIHRoZSBBdXRvY29tcGxldGUgc3VnZ2VzdGlvbnMgaXMg
bm90IHRoZQorICAgIC8vIGZvY3VzZWQgbm9kZSwgdGhlbiB3ZSBoYXZlIG5vdGhpbmcgdG8gZG8u
ICBGSVhNRTogYWxzbyBjaGVjayB0aGUKKyAgICAvLyBjYXJldCBpcyBhdCB0aGUgZW5kIGFuZCB0
aGF0IHRoZSB0ZXh0IGhhcyBub3QgY2hhbmdlZC4KKyAgICBpZiAoIWZvY3VzZWROb2RlIHx8IGZv
Y3VzZWROb2RlICE9IFBhc3NSZWZQdHI8Tm9kZT4obm9kZSkpIHsKKyAgICAgICAgaGlkZVN1Z2dl
c3Rpb25zUG9wdXAoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KIAotICAgICAgICBpZiAoIWZv
Y3VzZWROb2RlLT5oYXNUYWdOYW1lKEhUTUxOYW1lczo6aW5wdXRUYWcpKSB7Ci0gICAgICAgICAg
ICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQor
ICAgIEhUTUxJbnB1dEVsZW1lbnQqIGlucHV0RWxlbSA9CisgICAgICAgIHN0YXRpY19jYXN0PEhU
TUxJbnB1dEVsZW1lbnQqPihmb2N1c2VkTm9kZS5nZXQoKSk7CiAKLSAgICAgICAgSFRNTElucHV0
RWxlbWVudCogaW5wdXRFbGVtID0KLSAgICAgICAgICAgIHN0YXRpY19jYXN0PEhUTUxJbnB1dEVs
ZW1lbnQqPihmb2N1c2VkTm9kZS5nZXQoKSk7CisgICAgLy8gVGhlIGZpcnN0IHRpbWUgdGhlIEF1
dG9jb21wbGV0ZSBpcyBzaG93biB3ZSdsbCBjcmVhdGUgdGhlIGNsaWVudCBhbmQgdGhlCisgICAg
Ly8gcG9wdXAuCisgICAgaWYgKCFtX2F1dG9jb21wbGV0ZVBvcHVwQ2xpZW50LmdldCgpKQorICAg
ICAgICBtX2F1dG9jb21wbGV0ZVBvcHVwQ2xpZW50LnNldChuZXcgQXV0b2NvbXBsZXRlUG9wdXBN
ZW51Q2xpZW50KTsKIAotICAgICAgICAvLyBUaGUgZmlyc3QgdGltZSB0aGUgc3VnZ2VzdGlvbnMg
cG9wdXAgaXMgc2hvd24gd2UnbGwgY3JlYXRlIHRoZSBjbGllbnQKLSAgICAgICAgLy8gYW5kIHRo
ZSBwb3B1cC4KLSAgICAgICAgaWYgKCFtX2F1dG9jb21wbGV0ZVBvcHVwQ2xpZW50LmdldCgpKQot
ICAgICAgICAgICAgbV9hdXRvY29tcGxldGVQb3B1cENsaWVudC5zZXQobmV3IEF1dG9jb21wbGV0
ZVBvcHVwTWVudUNsaWVudCh0aGlzKSk7Ci0gICAgICAgIG1fYXV0b2NvbXBsZXRlUG9wdXBDbGll
bnQtPmluaXRpYWxpemUoaW5wdXRFbGVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIHN1Z2dlc3Rpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGRlZmF1bHRTdWdnZXN0aW9uSW5kZXgpOwotICAgICAgICBpZiAo
IW1fc3VnZ2VzdGlvbnNQb3B1cC5nZXQoKSkgewotICAgICAgICAgICAgbV9zdWdnZXN0aW9uc1Bv
cHVwID0KLSAgICAgICAgICAgICAgICBQb3B1cENvbnRhaW5lcjo6Y3JlYXRlKG1fYXV0b2NvbXBs
ZXRlUG9wdXBDbGllbnQuZ2V0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBzdWdnZXN0aW9uc1BvcHVwU2V0dGluZ3MpOwotICAgICAgICB9CisgICAgbV9hdXRvY29t
cGxldGVQb3B1cENsaWVudC0+aW5pdGlhbGl6ZShpbnB1dEVsZW0sIHN1Z2dlc3Rpb25zLAorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFN1Z2dlc3Rpb25J
bmRleCk7CiAKLSAgICAgICAgaWYgKG1fc3VnZ2VzdGlvbnNQb3B1cFNob3dpbmcpIHsKLSAgICAg
ICAgICAgIG1fYXV0b2NvbXBsZXRlUG9wdXBDbGllbnQtPnNldFN1Z2dlc3Rpb25zKHN1Z2dlc3Rp
b25zKTsKLSAgICAgICAgICAgIHJlZnJlc2hTdWdnZXN0aW9uc1BvcHVwKCk7Ci0gICAgICAgIH0g
ZWxzZSB7Ci0gICAgICAgICAgICBtX3N1Z2dlc3Rpb25zUG9wdXAtPnNob3coZm9jdXNlZE5vZGUt
PmdldFJlY3QoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb2N1c2Vk
Tm9kZS0+b3duZXJEb2N1bWVudCgpLT52aWV3KCksIDApOwotICAgICAgICAgICAgbV9zdWdnZXN0
aW9uc1BvcHVwU2hvd2luZyA9IHRydWU7Ci0gICAgICAgIH0KKyAgICBpZiAobV9zdWdnZXN0aW9u
c1BvcHVwQ2xpZW50ICE9IG1fYXV0b2NvbXBsZXRlUG9wdXBDbGllbnQuZ2V0KCkpIHsKKyAgICAg
ICAgaGlkZVN1Z2dlc3Rpb25zUG9wdXAoKTsKKyAgICAgICAgbV9zdWdnZXN0aW9uc1BvcHVwQ2xp
ZW50ID0gbV9hdXRvY29tcGxldGVQb3B1cENsaWVudC5nZXQoKTsKKyAgICB9CisKKyAgICBpZiAo
IW1fYXV0b2NvbXBsZXRlUG9wdXAuZ2V0KCkpIHsKKyAgICAgICAgbV9hdXRvY29tcGxldGVQb3B1
cCA9IFBvcHVwQ29udGFpbmVyOjpjcmVhdGUobV9zdWdnZXN0aW9uc1BvcHVwQ2xpZW50LAorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWdnZXN0
aW9uc1BvcHVwU2V0dGluZ3MpOworICAgIH0KKworICAgIGlmIChtX3N1Z2dlc3Rpb25zUG9wdXAg
IT0gbV9hdXRvY29tcGxldGVQb3B1cC5nZXQoKSkKKyAgICAgICAgbV9zdWdnZXN0aW9uc1BvcHVw
ID0gbV9hdXRvY29tcGxldGVQb3B1cC5nZXQoKTsKKworICAgIGlmIChtX3N1Z2dlc3Rpb25zUG9w
dXBTaG93aW5nKSB7CisgICAgICAgIG1fYXV0b2NvbXBsZXRlUG9wdXBDbGllbnQtPnNldFN1Z2dl
c3Rpb25zKHN1Z2dlc3Rpb25zKTsKKyAgICAgICAgcmVmcmVzaFN1Z2dlc3Rpb25zUG9wdXAoKTsK
KyAgICB9IGVsc2UgeworICAgICAgICBtX3N1Z2dlc3Rpb25zUG9wdXAtPnNob3coZm9jdXNlZE5v
ZGUtPmdldFJlY3QoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvY3VzZWRO
b2RlLT5vd25lckRvY3VtZW50KCktPnZpZXcoKSwgMCk7CisgICAgICAgIG1fc3VnZ2VzdGlvbnNQ
b3B1cFNob3dpbmcgPSB0cnVlOwogICAgIH0KIH0KIApJbmRleDogV2ViS2l0L2Nocm9taXVtL3Ny
Yy9XZWJWaWV3SW1wbC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdC9jaHJvbWl1bS9zcmMvV2ViVmll
d0ltcGwuaAkocmV2aXNpb24gNTQ1MDEpCisrKyBXZWJLaXQvY2hyb21pdW0vc3JjL1dlYlZpZXdJ
bXBsLmgJKHdvcmtpbmcgY29weSkKQEAgLTU4LDYgKzU4LDcgQEAgY2xhc3MgS2V5Ym9hcmRFdmVu
dDsKIGNsYXNzIFBhZ2U7CiBjbGFzcyBQbGF0Zm9ybUtleWJvYXJkRXZlbnQ7CiBjbGFzcyBQb3B1
cENvbnRhaW5lcjsKK2NsYXNzIFBvcHVwTWVudUNsaWVudDsKIGNsYXNzIFJhbmdlOwogY2xhc3Mg
UmVuZGVyVGhlbWU7CiBjbGFzcyBXaWRnZXQ7CkBAIC02NSw3ICs2Niw5IEBAIGNsYXNzIFdpZGdl
dDsKIAogbmFtZXNwYWNlIFdlYktpdCB7CiBjbGFzcyBBdXRvY29tcGxldGVQb3B1cE1lbnVDbGll
bnQ7CitjbGFzcyBBdXRvRmlsbFBvcHVwTWVudUNsaWVudDsKIGNsYXNzIENvbnRleHRNZW51Q2xp
ZW50SW1wbDsKK2NsYXNzIFN1Z2dlc3Rpb25zUG9wdXBNZW51Q2xpZW50OwogY2xhc3MgV2ViQWNj
ZXNzaWJpbGl0eU9iamVjdDsKIGNsYXNzIFdlYkRldlRvb2xzQWdlbnRQcml2YXRlOwogY2xhc3Mg
V2ViRnJhbWVJbXBsOwpAQCAtMTUzLDYgKzE1NiwxNSBAQCBwdWJsaWM6CiAgICAgICAgIGNvbnN0
IFdlYk5vZGUmLAogICAgICAgICBjb25zdCBXZWJWZWN0b3I8V2ViU3RyaW5nPiYgc3VnZ2VzdGlv
bnMsCiAgICAgICAgIGludCBkZWZhdWx0U3VnZ2VzdGlvbkluZGV4KTsKKyAgICB2aXJ0dWFsIHZv
aWQgYXBwbHlBdXRvRmlsbFN1Z2dlc3Rpb25zKAorICAgICAgICBjb25zdCBXZWJOb2RlJiwKKyAg
ICAgICAgY29uc3QgV2ViVmVjdG9yPFdlYlN0cmluZz4mIG5hbWVzLAorICAgICAgICBjb25zdCBX
ZWJWZWN0b3I8V2ViU3RyaW5nPiYgbGFiZWxzLAorICAgICAgICBpbnQgZGVmYXVsdFN1Z2dlc3Rp
b25JbmRleCk7CisgICAgdmlydHVhbCB2b2lkIGFwcGx5QXV0b2NvbXBsZXRlU3VnZ2VzdGlvbnMo
CisgICAgICAgIGNvbnN0IFdlYk5vZGUmLAorICAgICAgICBjb25zdCBXZWJWZWN0b3I8V2ViU3Ry
aW5nPiYgc3VnZ2VzdGlvbnMsCisgICAgICAgIGludCBkZWZhdWx0U3VnZ2VzdGlvbkluZGV4KTsK
ICAgICB2aXJ0dWFsIHZvaWQgaGlkZUF1dG9maWxsUG9wdXAoKTsKICAgICB2aXJ0dWFsIHZvaWQg
aGlkZVN1Z2dlc3Rpb25zUG9wdXAoKTsKICAgICB2aXJ0dWFsIHZvaWQgc2V0U2Nyb2xsYmFyQ29s
b3JzKHVuc2lnbmVkIGluYWN0aXZlQ29sb3IsCkBAIC0zOTUsMTYgKzQwNywyOSBAQCBwcml2YXRl
OgogICAgIC8vIGN1cnJlbnQgZHJvcCB0YXJnZXQgaW4gdGhpcyBXZWJWaWV3ICh0aGUgZHJvcCB0
YXJnZXQgY2FuIGFjY2VwdCB0aGUgZHJvcCkuCiAgICAgV2ViRHJhZ09wZXJhdGlvbiBtX2RyYWdP
cGVyYXRpb247CiAKLSAgICAvLyBUaGUgc3VnZ2VzdGlvbnMgcG9wdXAuICBLZXB0IGFyb3VuZCBh
bmQgcmV1c2VkIGV2ZXJ5LXRpbWUgbmV3IHN1Z2dlc3Rpb25zCi0gICAgLy8gc2hvdWxkIGJlIHNo
b3duLgotICAgIFJlZlB0cjxXZWJDb3JlOjpQb3B1cENvbnRhaW5lcj4gbV9zdWdnZXN0aW9uc1Bv
cHVwOwotCi0gICAgLy8gV2hldGhlciB0aGUgc3VnZ2VzdGlvbnMgcG9wdXAgaXMgY3VycmVudGx5
IHNob3dpbmcuCisgICAgLy8gV2hldGhlciBhIHN1Z2dlc3Rpb25zIHBvcHVwIGlzIGN1cnJlbnRs
eSBzaG93aW5nLgogICAgIGJvb2wgbV9zdWdnZXN0aW9uc1BvcHVwU2hvd2luZzsKIAotICAgIC8v
IFRoZSBhdXRvY29tcGxldGUgY2xpZW50LgorICAgIC8vIEEgcG9pbnRlciB0byB0aGUgY3VycmVu
dCBzdWdnZXN0aW9ucyBwb3B1cCBtZW51IGNsaWVudC4gIFRoaXMgY2FuIGJlCisgICAgLy8gZWl0
aGVyIGFuIEF1dG9GaWxsUG9wdXBNZW51Q2xpZW50IG9yIGFuIEF1dG9jb21wbGV0ZVBvcHVwTWVu
dUNsaWVudC4gIFdlCisgICAgLy8gZG8gbm90IG93biB0aGlzIHBvaW50ZXIuCisgICAgU3VnZ2Vz
dGlvbnNQb3B1cE1lbnVDbGllbnQqIG1fc3VnZ2VzdGlvbnNQb3B1cENsaWVudDsKKworICAgIC8v
IFRoZSBBdXRvRmlsbCBwb3B1cCBjbGllbnQuCisgICAgT3duUHRyPEF1dG9GaWxsUG9wdXBNZW51
Q2xpZW50PiBtX2F1dG9GaWxsUG9wdXBDbGllbnQ7CisKKyAgICAvLyBUaGUgQXV0b2NvbXBsZXRl
IHBvcHVwIGNsaWVudC4KICAgICBPd25QdHI8QXV0b2NvbXBsZXRlUG9wdXBNZW51Q2xpZW50PiBt
X2F1dG9jb21wbGV0ZVBvcHVwQ2xpZW50OwogCisgICAgLy8gQSBwb2ludGVyIHRvIHRoZSBjdXJy
ZW50IHN1Z2dlc3Rpb25zIHBvcHVwLiAgV2UgZG8gbm90IG93biB0aGlzIHBvaW50ZXIuCisgICAg
V2ViQ29yZTo6UG9wdXBDb250YWluZXIqIG1fc3VnZ2VzdGlvbnNQb3B1cDsKKworICAgIC8vIFRo
ZSBBdXRvRmlsbCBzdWdnZXN0aW9ucyBwb3B1cC4KKyAgICBSZWZQdHI8V2ViQ29yZTo6UG9wdXBD
b250YWluZXI+IG1fYXV0b0ZpbGxQb3B1cDsKKworICAgIC8vIFRoZSBBdXRvQ29tcGxldGUgc3Vn
Z2VzdGlvbnMgcG9wdXAuCisgICAgUmVmUHRyPFdlYkNvcmU6OlBvcHVwQ29udGFpbmVyPiBtX2F1
dG9jb21wbGV0ZVBvcHVwOworCiAgICAgT3duUHRyPFdlYkRldlRvb2xzQWdlbnRQcml2YXRlPiBt
X2RldlRvb2xzQWdlbnQ7CiAKICAgICAvLyBXaGV0aGVyIHRoZSB3ZWJ2aWV3IGlzIHJlbmRlcmlu
ZyB0cmFuc3BhcmVudGx5Lgo=
</data>

          </attachment>
      

    </bug>

</bugzilla>