<?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>33514</bug_id>
          
          <creation_ts>2010-01-11 22:04:14 -0800</creation_ts>
          <short_desc>[Qt] Implement GraphicsLayer for accelerated layer compositing</short_desc>
          <delta_ts>2010-06-14 09:21:19 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>WebKit Qt</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>1</everconfirmed>
          <reporter name="Noam Rosenthal">noam</reporter>
          <assigned_to name="Noam Rosenthal">noam</assigned_to>
          <cc>abarth</cc>
    
    <cc>benjamin</cc>
    
    <cc>hausmann</cc>
    
    <cc>kenneth</cc>
    
    <cc>koivisto</cc>
    
    <cc>laszlo.gombos</cc>
    
    <cc>manishgurnaney</cc>
    
    <cc>vestbo</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>179676</commentid>
    <comment_count>0</comment_count>
    <who name="Noam Rosenthal">noam</who>
    <bug_when>2010-01-11 22:04:14 -0800</bug_when>
    <thetext>Webkit contains an abstraction that allows platform-specific acceleration of CSS opacity and transform animations. This abstraction, however, is not implemented in QtWebkit.

I&apos;ve created a WIP repo. on Gitorious where this is implemented nearly to the full extent using QGraphicsItems - it needs a lot of testing but already works pretty well with the LayoutTests from the repo.

Tracking on the QtWebkit side:
see http://bugreports.qt.nokia.com/browse/QTWEBKIT-15

WIP: 
http://gitorious.org/~noamr/webkit/noamrs-webkit/commits/accel
- [path-to-]/QGVLauncher http://webkit.org/blog-files/leaves/ --accel -graphicssystem raster

Note: This might share some commonalities with what&apos;s needed for webkit tiling, such as painting the contents and the scrollbar separately.

Right now I could use more eyes to look at the code to find architectural issues, before I go to heavy debugging mode.
Note that right now it can only work with QGraphicsWebView and not with QWebView: mainly because for implementing it with QWebView I&apos;d need my own QGraphicsScene rendering inside QWebView, and I&apos;m not sure performance would be that great.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>181567</commentid>
    <comment_count>1</comment_count>
      <attachid>46752</attachid>
    <who name="Noam Rosenthal">noam</who>
    <bug_when>2010-01-16 15:22:25 -0800</bug_when>
    <thetext>Created attachment 46752
compositing layers for Qt 

Since there&apos;s no way I can think of to chop this feature into small commits, I&apos;m posting it now as one patch. 

Composite layers for CSS animations seem to be pretty solid. Some further testing needs to be done, but so far all the LayoutTests work, and I don&apos;t foresee any big architectural changes apart from inevitable bug-fixes.

Currently the compositing-layers feature only works in QGraphicsWebView, and only if QWebSettings::AcceleratedCompositingEnabled is true.

I tried to get all the style issues done in advance but of course I might have overlooked a few things. Hopefully reviewing this won&apos;t be a hassle :)
In my view this could maybe go in and marked as an &quot;experimental&quot; feature and we can make it more solid as we go along - since there&apos;s no new API and it&apos;s an optional feature with QWebSettings, the risk is low. The main changes that can affect other parts are in qgraphicswebview.cpp, and those should probably be reviewed more carefully.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>181601</commentid>
    <comment_count>2</comment_count>
      <attachid>46752</attachid>
    <who name="Kenneth Rohde Christiansen">kenneth</who>
    <bug_when>2010-01-17 03:18:14 -0800</bug_when>
    <thetext>Comment on attachment 46752
compositing layers for Qt 

Great stuff Noam! It is a huge patch and it will take some time to review. There are lots of style errors etc, so please look at my comments below, and then fix this so it will be easier doing a review of the actual contents of the patch.

&gt; Index: WebKit/qt/QGVLauncher/main.cpp
&gt; ===================================================================
&gt; --- WebKit/qt/QGVLauncher/main.cpp	(revision 53357)
&gt; +++ WebKit/qt/QGVLauncher/main.cpp	(working copy)
&gt; @@ -129,6 +129,7 @@
&gt;  
&gt;          setFrameShape(QFrame::NoFrame);
&gt;          setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
&gt; +        setViewportUpdateMode(BoundingRectViewportUpdate);

Would be nice to make this passable as an argument for testing purposes

&gt;      }
&gt;  
&gt;      void setMainWidget(QGraphicsWidget* widget)
&gt; @@ -455,17 +456,24 @@
&gt;      QWebSettings::setMaximumPagesInCache(4);
&gt;      QWebSettings::globalSettings()-&gt;setAttribute(QWebSettings::PluginsEnabled, true);
&gt;      QWebSettings::globalSettings()-&gt;setAttribute(QWebSettings::DeveloperExtrasEnabled, true);
&gt; +    QWebSettings::globalSettings()-&gt;setAttribute(QWebSettings::LocalContentCanAccessRemoteUrls, true);
&gt;      QWebSettings::enablePersistentStorage();
&gt;  
&gt;      const QStringList args = app.arguments();
&gt; -    if (args.count() &gt; 1)
&gt; +    const int idxOfUrl = args.indexOf(&quot;--url&quot;);

No need to abbreviate index to idx

&gt; +    if (idxOfUrl &gt; 0 &amp;&amp; idxOfUrl &lt; args.count()-1)

spacing: add spaces between () and - and 1

&gt; +        url = args.at(idxOfUrl+1);

Same thing

&gt; +    else if (args.count() &gt; 1)
&gt;          url = args.at(1);
&gt; +    if (args.contains(&quot;--accel&quot;))

Better write accel out, I guess

&gt; +        QWebSettings::globalSettings()-&gt;setAttribute(QWebSettings::AcceleratedCompositingEnabled, true);
&gt;  
&gt;      MainWindow* window = new MainWindow;
&gt;      window-&gt;load(url);
&gt;  
&gt;      for (int i = 2; i &lt; args.count(); i++)
&gt; -        window-&gt;newWindow(args.at(i));
&gt; +        if (!args.at(i).startsWith(&quot;-&quot;) &amp;&amp; !args.at(i-1).startsWith(&quot;-&quot;))

Spacing. Doesn&apos;t Qt have anything to deal with command line options? 

&gt; +            window-&gt;newWindow(args.at(i));
&gt;  
&gt;      window-&gt;show();
&gt;      return app.exec();
&gt; Index: WebKit/qt/WebCoreSupport/ChromeClientQt.cpp
&gt; ===================================================================
&gt; --- WebKit/qt/WebCoreSupport/ChromeClientQt.cpp	(revision 53357)
&gt; +++ WebKit/qt/WebCoreSupport/ChromeClientQt.cpp	(working copy)
&gt; @@ -42,6 +42,10 @@
&gt;  #include &quot;QWebPageClient.h&quot;
&gt;  #include &quot;SecurityOrigin.h&quot;
&gt;  
&gt; +#include &lt;qdebug.h&gt;
&gt; +#include &lt;qtextdocument.h&gt;
&gt; +#include &lt;qtooltip.h&gt;
&gt; +
&gt;  #include &quot;qwebpage.h&quot;
&gt;  #include &quot;qwebpage_p.h&quot;
&gt;  #include &quot;qwebframe_p.h&quot;
&gt; @@ -49,9 +53,10 @@
&gt;  #include &quot;qwebsecurityorigin_p.h&quot;
&gt;  #include &quot;qwebview.h&quot;
&gt;  
&gt; -#include &lt;qtooltip.h&gt;
&gt; -#include &lt;qtextdocument.h&gt;
&gt;  
&gt; +#if USE(ACCELERATED_COMPOSITING)
&gt; +#include &quot;GraphicsLayerQt.h&quot;
&gt; +#endif
&gt;  namespace WebCore

Pls run check-webkit-style to make sure your reordering is correct.

&gt;  {
&gt;  
&gt; @@ -465,6 +470,30 @@
&gt;      // See the comment in WebCore/page/ChromeClient.h
&gt;      notImplemented();
&gt;  }
&gt; +#if USE(ACCELERATED_COMPOSITING)

Please add an empty line before that

&gt; +// Pass 0 as the GraphicsLayer to detatch the root layer.

Detach 

&gt; +void ChromeClientQt::attachRootGraphicsLayer(Frame* frame, GraphicsLayer* graphicsLayer)
&gt; +{
&gt; +    if (platformPageClient())
&gt; +        platformPageClient()-&gt;setRootGraphicsLayer(graphicsLayer?graphicsLayer-&gt;nativeLayer():0);

Spacing again, you should really run that check-webkit-style script.

&gt; +}

There should be an empty line after this

&gt; +// Sets a flag to specify that the next time content is drawn to the window,
&gt; +// the changes appear on the screen in synchrony with updates to GraphicsLayers.

We normally add this documentation (in WebCore at least) to the header file. Maybe it would be good to duplicate it there.

&gt; +void ChromeClientQt::setNeedsOneShotDrawingSynchronization()
&gt; +{
&gt; +    if (platformPageClient()) {
&gt; +        platformPageClient()-&gt;markForSync(false);
&gt; +        platformPageClient()-&gt;update(QRect(QPoint(0, 0), m_webPage-&gt;viewportSize()));
&gt; +    }
&gt; +}
&gt; +// Sets a flag to specify that the view needs to be updated, so we need
&gt; +// to do an eager layout before the drawing.
&gt; +void ChromeClientQt::scheduleCompositingLayerSync()
&gt; +{
&gt; +    if (platformPageClient())
&gt; +        platformPageClient()-&gt;markForSync(true);
&gt; +}
&gt; +#endif
&gt;  
&gt;  QtAbstractWebPopup* ChromeClientQt::createPopup()
&gt;  {
&gt; Index: WebKit/qt/WebCoreSupport/ChromeClientQt.h
&gt; ===================================================================
&gt; --- WebKit/qt/WebCoreSupport/ChromeClientQt.h	(revision 53357)
&gt; +++ WebKit/qt/WebCoreSupport/ChromeClientQt.h	(working copy)
&gt; @@ -145,6 +145,11 @@
&gt;          bool toolBarsVisible;
&gt;          bool statusBarVisible;
&gt;          bool menuBarVisible;
&gt; +#if USE(ACCELERATED_COMPOSITING)
&gt; +        virtual void attachRootGraphicsLayer(Frame*, GraphicsLayer*);
&gt; +        virtual void setNeedsOneShotDrawingSynchronization();
&gt; +        virtual void scheduleCompositingLayerSync();
&gt; +#endif

Are these the same as used by other ports? I&apos;m not sure you have added these the most logical place in the header file

&gt;      };
&gt;  }
&gt;  
&gt; Index: WebKit/qt/Api/qgraphicswebview.cpp
&gt; ===================================================================
&gt; --- WebKit/qt/Api/qgraphicswebview.cpp	(revision 53357)
&gt; +++ WebKit/qt/Api/qgraphicswebview.cpp	(working copy)
&gt; @@ -22,24 +22,64 @@
&gt;  #include &quot;qgraphicswebview.h&quot;
&gt;  
&gt;  #include &quot;qwebframe.h&quot;
&gt; +#include &quot;qwebframe_p.h&quot;
&gt;  #include &quot;qwebpage.h&quot;
&gt;  #include &quot;qwebpage_p.h&quot;
&gt;  #include &quot;QWebPageClient.h&quot;
&gt; -#include &lt;QtGui/QGraphicsScene&gt;
&gt; -#include &lt;QtGui/QGraphicsView&gt;
&gt; +#include &lt;FrameView.h&gt;
&gt; +#include &lt;QtCore/qsharedpointer.h&gt;
&gt; +#include &lt;QtCore/qtimer.h&gt;
&gt;  #include &lt;QtGui/qapplication.h&gt;
&gt; +#include &lt;QtGui/qgraphicsscene.h&gt;
&gt;  #include &lt;QtGui/qgraphicssceneevent.h&gt;
&gt; +#include &lt;QtGui/qgraphicsview.h&gt;
&gt; +#include &lt;QtGui/qpixmapcache.h&gt;
&gt;  #include &lt;QtGui/qstyleoption.h&gt;
&gt;  #if defined(Q_WS_X11)
&gt;  #include &lt;QX11Info&gt;
&gt;  #endif
&gt; +#include &lt;Settings.h&gt;
&gt;  
&gt; +#if USE(ACCELERATED_COMPOSITING)
&gt; +class QGraphicsWebViewOverlay : public QGraphicsItem {
&gt; +    friend class QGraphicsWebView;
&gt; +    QGraphicsWebView* q;

These should go at the bottom of the class definition

&gt; +
&gt; +    public:

We normally wouldn&apos;t have spaces before the public here.

&gt; +    QGraphicsWebViewOverlay(QGraphicsWebView* wv)
&gt; +            :QGraphicsItem(wv),

, should be on next line, spacing issue as well

&gt; +            q(wv)

I think view is more explanatory than wv.

&gt; +    {
&gt; +    }
&gt; +
&gt; +    QRectF boundingRect() const
&gt; +    {
&gt; +        return q-&gt;boundingRect();
&gt; +    }
&gt; +
&gt; +    void paint(QPainter* painter, const QStyleOptionGraphicsItem* opt, QWidget*)

write opt out (options)

&gt; +    {
&gt; +        q-&gt;page()-&gt;mainFrame()-&gt;render(painter, (QWebFrame::RenderLayer)(QWebFrame::AllLayers&amp;(~QWebFrame::ContentsLayer)), opt-&gt;exposedRect.toRect());

Remember (you probably did) that opt-&gt;exposedRect is the bounding rect unless you set some graphics view flag.

No C-casts please

&gt; +    }
&gt; +};

Missing new line after this

&gt; +#endif
&gt;  class QGraphicsWebViewPrivate : public QWebPageClient {
&gt;  public:
&gt;      QGraphicsWebViewPrivate(QGraphicsWebView* parent)
&gt;          : q(parent)
&gt;          , page(0)
&gt; -    {}
&gt; +#if USE(ACCELERATED_COMPOSITING)
&gt; +        , rootGraphicsLayer(0),
&gt; +        overlay(new QGraphicsWebViewOverlay(parent)),

Where are you freeing this?

&gt; +        markedForSync(true)
&gt; +#endif
&gt; +    {
&gt; +#if USE(ACCELERATED_COMPOSITING)
&gt; +        overlay-&gt;setZValue(2);
&gt; +        overlay-&gt;setPos(0, 0);
&gt; +        q-&gt;setCacheMode(QGraphicsItem::ItemCoordinateCache);
&gt; +#endif
&gt; +    }
&gt;  
&gt;      virtual ~QGraphicsWebViewPrivate();
&gt;      virtual void scroll(int dx, int dy, const QRect&amp;);
&gt; @@ -60,17 +100,47 @@
&gt;      virtual QWidget* ownerWidget() const;
&gt;  
&gt;      virtual QObject* pluginParent() const;
&gt; -
&gt; +#if USE(ACCELERATED_COMPOSITING)
&gt; +    virtual void setRootGraphicsLayer(QGraphicsItem* layer);
&gt; +    virtual void markForSync(bool now);
&gt; +#endif
&gt;      void _q_doLoadFinished(bool success);
&gt;  
&gt;      QGraphicsWebView* q;
&gt;      QWebPage* page;
&gt; +#if USE(ACCELERATED_COMPOSITING)
&gt; +    QGraphicsItem* rootGraphicsLayer;
&gt; +    QGraphicsWebViewOverlay* overlay;
&gt; +    bool markedForSync;

shouldSync? Could you explain the cases where you need to synchronize and when not?

&gt; +    QPoint scrollDelta;
&gt; +#endif
&gt;  };
&gt;  
&gt;  QGraphicsWebViewPrivate::~QGraphicsWebViewPrivate()
&gt;  {
&gt; +#if USE(ACCELERATED_COMPOSITING)
&gt; +    if (rootGraphicsLayer) {
&gt; +        rootGraphicsLayer-&gt;setParentItem(0);
&gt; +        q-&gt;scene()-&gt;removeItem(rootGraphicsLayer);
&gt; +    }

Should you free the overlay here?

&gt; +#endif
&gt;  }
&gt; -
&gt; +#if USE(ACCELERATED_COMPOSITING)
&gt; +void QGraphicsWebViewPrivate::setRootGraphicsLayer(QGraphicsItem* layer)
&gt; +{
&gt; +    if (rootGraphicsLayer) {
&gt; +        q-&gt;scene()-&gt;removeItem(rootGraphicsLayer);
&gt; +        QWebFramePrivate::core(q-&gt;page()-&gt;mainFrame())-&gt;view()-&gt;syncCompositingStateRecursive();
&gt; +    }
&gt; +    rootGraphicsLayer = layer;
&gt; +    if (layer) {
&gt; +        layer-&gt;setZValue(1);

Maybe define an enum for these two Zvalues 1 and 2, to make it clear what is what

&gt; +        layer-&gt;setParentItem(q);
&gt; +        layer-&gt;moveBy(scrollDelta.x(), scrollDelta.y());
&gt; +        scrollDelta = QPoint();
&gt; +    }
&gt; +}
&gt; +#endif
&gt;  void QGraphicsWebViewPrivate::_q_doLoadFinished(bool success)
&gt;  {
&gt;      // If the page had no title, still make sure it gets the signal
&gt; @@ -83,13 +153,32 @@
&gt;  void QGraphicsWebViewPrivate::scroll(int dx, int dy, const QRect&amp; rectToScroll)
&gt;  {
&gt;      q-&gt;scroll(qreal(dx), qreal(dy), QRectF(rectToScroll));
&gt; +#if USE(ACCELERATED_COMPOSITING)
&gt; +
&gt; +    if (rootGraphicsLayer)
&gt; +        rootGraphicsLayer-&gt;moveBy(dx, dy);
&gt; +    else
&gt; +        scrollDelta += QPoint(dx, dy);

Hard to see frome the contents, but where do you use this scrollDelta?

&gt; +
&gt; +    overlay-&gt;scroll(dx, dy, rectToScroll);
&gt; +#endif
&gt;  }
&gt;  
&gt;  void QGraphicsWebViewPrivate::update(const QRect&amp; dirtyRect)
&gt;  {
&gt;      q-&gt;update(QRectF(dirtyRect));
&gt;  }
&gt; +#if USE(ACCELERATED_COMPOSITING)
&gt; +void QGraphicsWebViewPrivate::markForSync(bool now)

bool now seems strange

&gt; +{
&gt; +    if (now &amp;&amp; !markedForSync) {
&gt; +        q-&gt;syncLayers();
&gt;  
&gt; +        QTimer::singleShot(0, q, SLOT(syncLayers()));
&gt; +    }
&gt; +    markedForSync = true;
&gt; +}
&gt; +#endif
&gt;  
&gt;  void QGraphicsWebViewPrivate::setInputMethodEnabled(bool enable)
&gt;  {
&gt; @@ -248,6 +337,7 @@
&gt;      setAcceptTouchEvents(true);
&gt;  #endif
&gt;      setFocusPolicy(Qt::StrongFocus);
&gt; +    setFlag(QGraphicsItem::ItemClipsChildrenToShape, true);
&gt;  }
&gt;  
&gt;  /*!
&gt; @@ -293,11 +383,27 @@
&gt;      return d-&gt;page;
&gt;  }
&gt;  
&gt; +void QGraphicsWebView::syncLayers()

I don&apos;t think we want this public. And if so, we would need API review and documention

&gt; +{
&gt; +#if USE(ACCELERATED_COMPOSITING)
&gt; +    if (d-&gt;markedForSync) {
&gt; +        QWebFramePrivate::core(page()-&gt;mainFrame())-&gt;view()-&gt;syncCompositingStateRecursive();
&gt; +        d-&gt;markedForSync = false;
&gt; +    }
&gt; +
&gt; +#endif
&gt; +}
&gt; +
&gt;  /*! \reimp
&gt;  */
&gt;  void QGraphicsWebView::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget*)
&gt;  {
&gt; -    page()-&gt;mainFrame()-&gt;render(painter, option-&gt;exposedRect.toRect());
&gt; +#if USE(ACCELERATED_COMPOSITING)
&gt; +    syncLayers();
&gt; +    page()-&gt;mainFrame()-&gt;render(painter, QWebFrame::ContentsLayer, option-&gt;exposedRect.toRect());
&gt; +#else
&gt; +    page()-&gt;mainFrame()-&gt;render(painter, QWebFrame::AllLayers, option-&gt;exposedRect.toRect());
&gt; +#endif

Whoo! Someone is using my new API :-)

&gt;  }
&gt;  
&gt;  /*! \reimp
&gt; @@ -425,6 +531,9 @@
&gt;      d-&gt;page = page;
&gt;      if (!d-&gt;page)
&gt;          return;
&gt; +#if USE(ACCELERATED_COMPOSITING)
&gt; +    d-&gt;overlay-&gt;prepareGeometryChange();
&gt; +#endif
&gt;      d-&gt;page-&gt;d-&gt;client = d; // set the page client
&gt;  
&gt;      QSize size = geometry().size().toSize();
&gt; @@ -528,6 +637,9 @@
&gt;  */
&gt;  void QGraphicsWebView::updateGeometry()
&gt;  {
&gt; +#if USE(ACCELERATED_COMPOSITING)
&gt; +    d-&gt;overlay-&gt;prepareGeometryChange();
&gt; +#endif
&gt;      QGraphicsWidget::updateGeometry();
&gt;  
&gt;      if (!d-&gt;page)
&gt; @@ -542,7 +654,9 @@
&gt;  void QGraphicsWebView::setGeometry(const QRectF&amp; rect)
&gt;  {
&gt;      QGraphicsWidget::setGeometry(rect);
&gt; -
&gt; +#if USE(ACCELERATED_COMPOSITING)
&gt; +    d-&gt;overlay-&gt;prepareGeometryChange();
&gt; +#endif
&gt;      if (!d-&gt;page)
&gt;          return;
&gt;  
&gt; Index: WebKit/qt/Api/qwebsettings.h
&gt; ===================================================================
&gt; --- WebKit/qt/Api/qwebsettings.h	(revision 53357)
&gt; +++ WebKit/qt/Api/qwebsettings.h	(working copy)
&gt; @@ -68,7 +68,8 @@
&gt;  #endif
&gt;          LocalContentCanAccessRemoteUrls,
&gt;          DnsPrefetchEnabled,
&gt; -        XSSAuditorEnabled
&gt; +        XSSAuditorEnabled,
&gt; +        AcceleratedCompositingEnabled
&gt;      };
&gt;      enum WebGraphic {
&gt;          MissingImageGraphic,
&gt; Index: WebKit/qt/Api/qwebsettings.cpp
&gt; ===================================================================
&gt; --- WebKit/qt/Api/qwebsettings.cpp	(revision 53357)
&gt; +++ WebKit/qt/Api/qwebsettings.cpp	(working copy)
&gt; @@ -152,7 +152,12 @@
&gt;          value = attributes.value(QWebSettings::JavascriptEnabled,
&gt;                                        global-&gt;attributes.value(QWebSettings::JavascriptEnabled));
&gt;          settings-&gt;setJavaScriptEnabled(value);
&gt; +#if USE(ACCELERATED_COMPOSITING)
&gt; +        value = attributes.value(QWebSettings::AcceleratedCompositingEnabled,
&gt; +                                      global-&gt;attributes.value(QWebSettings::AcceleratedCompositingEnabled));
&gt;  
&gt; +        settings-&gt;setAcceleratedCompositingEnabled(value);
&gt; +#endif
&gt;          value = attributes.value(QWebSettings::JavascriptCanOpenWindows,
&gt;                                        global-&gt;attributes.value(QWebSettings::JavascriptCanOpenWindows));
&gt;          settings-&gt;setJavaScriptCanOpenWindowsAutomatically(value);
&gt; @@ -389,6 +394,7 @@
&gt;      d-&gt;attributes.insert(QWebSettings::OfflineWebApplicationCacheEnabled, false);
&gt;      d-&gt;attributes.insert(QWebSettings::LocalStorageEnabled, false);
&gt;      d-&gt;attributes.insert(QWebSettings::LocalContentCanAccessRemoteUrls, false);
&gt; +    d-&gt;attributes.insert(QWebSettings::AcceleratedCompositingEnabled, false);
&gt;      d-&gt;offlineStorageDefaultQuota = 5 * 1024 * 1024;
&gt;      d-&gt;defaultTextEncoding = QLatin1String(&quot;iso-8859-1&quot;);
&gt;  }
&gt; Index: WebKit/qt/Api/qgraphicswebview.h
&gt; ===================================================================
&gt; --- WebKit/qt/Api/qgraphicswebview.h	(revision 53357)
&gt; +++ WebKit/qt/Api/qgraphicswebview.h	(working copy)
&gt; @@ -105,7 +105,8 @@
&gt;      void iconChanged();
&gt;      void statusBarMessage(const QString&amp; message);
&gt;      void linkClicked(const QUrl&amp;);
&gt; -
&gt; +protected slots:
&gt; +    void syncLayers();
&gt;  protected:
&gt;      virtual void mousePressEvent(QGraphicsSceneMouseEvent*);
&gt;      virtual void mouseDoubleClickEvent(QGraphicsSceneMouseEvent*);
&gt; Index: WebKit/qt/Api/qwebview.cpp
&gt; ===================================================================
&gt; --- WebKit/qt/Api/qwebview.cpp	(revision 53357)
&gt; +++ WebKit/qt/Api/qwebview.cpp	(working copy)
&gt; @@ -22,10 +22,11 @@
&gt;  #include &quot;config.h&quot;
&gt;  #include &quot;qwebview.h&quot;
&gt;  
&gt; +#include &quot;Page.h&quot;
&gt;  #include &quot;QWebPageClient.h&quot;
&gt; +#include &quot;Settings.h&quot;
&gt;  #include &quot;qwebframe.h&quot;
&gt;  #include &quot;qwebpage_p.h&quot;
&gt; -
&gt;  #include &quot;qbitmap.h&quot;
&gt;  #include &quot;qevent.h&quot;
&gt;  #include &quot;qpainter.h&quot;
&gt; @@ -247,6 +248,9 @@
&gt;                  this, SLOT(_q_pageDestroyed()));
&gt;      }
&gt;      setAttribute(Qt::WA_OpaquePaintEvent, d-&gt;page);
&gt; +#if USE(ACCELERATED_COMPOSITING)
&gt; +    d-&gt;page-&gt;d-&gt;page-&gt;settings()-&gt;setAcceleratedCompositingEnabled(false);
&gt; +#endif
&gt;      update();
&gt;  }
&gt;  
&gt; Index: WebCore/plugins/qt/PluginViewQt.cpp
&gt; ===================================================================
&gt; --- WebCore/plugins/qt/PluginViewQt.cpp	(revision 53357)
&gt; +++ WebCore/plugins/qt/PluginViewQt.cpp	(working copy)
&gt; @@ -53,6 +53,7 @@
&gt;  #include &quot;PluginContainerQt.h&quot;
&gt;  #include &quot;PluginDebug.h&quot;
&gt;  #include &quot;PluginPackage.h&quot;
&gt; +#include &quot;PluginWidget.h&quot;
&gt;  #include &quot;PluginMainThreadScheduler.h&quot;
&gt;  #include &quot;RenderLayer.h&quot;
&gt;  #include &quot;ScriptController.h&quot;
&gt; @@ -844,4 +845,5 @@
&gt;  {
&gt;  }
&gt;  
&gt; +
&gt;  } // namespace WebCore
&gt; Index: WebCore/WebCore.pro
&gt; ===================================================================
&gt; --- WebCore/WebCore.pro	(revision 53357)
&gt; +++ WebCore/WebCore.pro	(working copy)
&gt; @@ -2707,6 +2707,19 @@
&gt;              plugins/win/PaintHooks.asm
&gt;      }
&gt;  }
&gt; +contains(DEFINES, WTF_USE_ACCELERATED_COMPOSITING) {
&gt; +HEADERS += \
&gt; +    rendering/RenderLayerBacking.h \
&gt; +    rendering/RenderLayerCompositor.h \
&gt; +    platform/graphics/GraphicsLayer.h \
&gt; +    platform/graphics/GraphicsLayerClient.h \
&gt; +    platform/graphics/qt/GraphicsLayerQt.h
&gt; +SOURCES += \
&gt; +    platform/graphics/GraphicsLayer.cpp \
&gt; +    platform/graphics/qt/GraphicsLayerQt.cpp \
&gt; +    rendering/RenderLayerBacking.cpp \
&gt; +    rendering/RenderLayerCompositor.cpp
&gt; +}
&gt;  
&gt;  symbian {
&gt;      shared {
&gt; Index: WebCore/platform/qt/QWebPageClient.h
&gt; ===================================================================
&gt; --- WebCore/platform/qt/QWebPageClient.h	(revision 53357)
&gt; +++ WebCore/platform/qt/QWebPageClient.h	(working copy)
&gt; @@ -30,7 +30,7 @@
&gt;  #include &lt;QCursor&gt;
&gt;  #endif
&gt;  #include &lt;QRect&gt;
&gt; -
&gt; +class QGraphicsItem;
&gt;  class QWebPageClient {
&gt;  public:
&gt;      virtual ~QWebPageClient() { }
&gt; @@ -39,6 +39,11 @@
&gt;      virtual void update(const QRect&amp;) = 0;
&gt;      virtual void setInputMethodEnabled(bool enable) = 0;
&gt;      virtual bool inputMethodEnabled() const = 0;
&gt; +#if USE(ACCELERATED_COMPOSITING)
&gt; +    virtual void setRootGraphicsLayer(QGraphicsItem* layer) {}
&gt; +    virtual void markForSync(bool now = false) {}

These API&apos;s here will need some review. We much keep QWebPageClient.h API very clear and under control.

&gt; +#endif
&gt; +
&gt;  #if QT_VERSION &gt;= 0x040600
&gt;      virtual void setInputMethodHint(Qt::InputMethodHint hint, bool enable) = 0;
&gt;  #endif
&gt; Index: WebCore/platform/graphics/qt/GraphicsLayerQt.cpp
&gt; ===================================================================
&gt; --- WebCore/platform/graphics/qt/GraphicsLayerQt.cpp	(revision 0)
&gt; +++ WebCore/platform/graphics/qt/GraphicsLayerQt.cpp	(revision 0)
&gt; @@ -0,0 +1,976 @@
&gt; +/*
&gt; +    Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies)
&gt; +
&gt; +    This library is free software; you can redistribute it and/or
&gt; +    modify it under the terms of the GNU Library General Public
&gt; +    License as published by the Free Software Foundation; either
&gt; +    version 2 of the License, or (at your option) any later version.
&gt; +
&gt; +    This library is distributed in the hope that it will be useful,
&gt; +    but WITHOUT ANY WARRANTY; without even the implied warranty of
&gt; +    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
&gt; +    Library General Public License for more details.
&gt; +
&gt; +    You should have received a copy of the GNU Library General Public License
&gt; +    along with this library; see the file COPYING.LIB.  If not, write to
&gt; +    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
&gt; +    Boston, MA 02110-1301, USA.
&gt; +*/
&gt; +
&gt; +#include &quot;config.h&quot;
&gt; +#include &quot;GraphicsLayerQt.h&quot;
&gt; +
&gt; +#include &quot;CurrentTime.h&quot;
&gt; +#include &quot;FloatRect.h&quot;
&gt; +#include &quot;GraphicsContext.h&quot;
&gt; +#include &quot;Image.h&quot;
&gt; +#include &quot;RefCounted.h&quot;
&gt; +#include &quot;TranslateTransformOperation.h&quot;
&gt; +#include &quot;UnitBezier.h&quot;
&gt; +#include &lt;QtCore/qabstractanimation.h&gt;
&gt; +#include &lt;QtCore/qdebug.h&gt;
&gt; +#include &lt;QtCore/qset.h&gt;
&gt; +#include &lt;QtCore/qtimer.h&gt;
&gt; +#include &lt;QtGui/qbitmap.h&gt;
&gt; +#include &lt;QtGui/qcolor.h&gt;
&gt; +#include &lt;QtGui/qgraphicseffect.h&gt;
&gt; +#include &lt;QtGui/qgraphicsitem.h&gt;
&gt; +#include &lt;QtGui/qgraphicsscene.h&gt;
&gt; +#include &lt;QtGui/qmatrix4x4.h&gt;
&gt; +#include &lt;QtGui/qpainter.h&gt;
&gt; +#include &lt;QtGui/qpalette.h&gt;
&gt; +#include &lt;QtGui/qpixmap.h&gt;
&gt; +#include &lt;QtGui/qstyleoption.h&gt;
&gt; +
&gt; +namespace {
&gt; +    enum StaticContentType { NoContentType, PixmapContentType, ColorContentType};
&gt; +
&gt; +}
&gt; +
&gt; +namespace WebCore {
&gt; +
&gt; +class GraphicsLayerQtPrivate : public QGraphicsObject {
&gt; +    Q_OBJECT


All the friends and the fields should be at the bottom of the class definition.

&gt; +    friend class GraphicsLayerQt;
&gt; +    friend class TransformAnimationQt;
&gt; +    friend class OpacityAnimationQt;
&gt; +    GraphicsLayerQt* layer;
&gt; +    GraphicsLayerClient* client;
&gt; +    QTransform bTransform;
&gt; +    bool transformAnimationRunning, opacityAnimationRunning;
&gt; +    struct ContentData {
&gt; +        QPixmap pixmap;
&gt; +        QRegion regionToUpdate;
&gt; +        bool updateAll, bgcolorValid;

Please declare on separate lines

&gt; +        QColor contentsBgColor, bgcolor;

write out background 

&gt; +        StaticContentType contentType;
&gt; +        float opacity;
&gt; +        ContentData()
&gt; +                :updateAll(false)
&gt; +                , bgcolorValid(false)
&gt; +                , contentType(NoContentType)
&gt; +                , opacity(1)
&gt; +        {
&gt; +        }
&gt; +    } pendingContent, curContent;

current</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>181804</commentid>
    <comment_count>3</comment_count>
      <attachid>46808</attachid>
    <who name="Noam Rosenthal">noam</who>
    <bug_when>2010-01-18 02:35:15 -0800</bug_when>
    <thetext>Created attachment 46808
accelerated compositing in Qt: with massive style improvements and in-code comments

I&apos;ve tried to get the style right this time. 
There&apos;s probably a few substance issues (architecture choices) to review here - is the style at a good enough level to start reviewing those? I&apos;m sure things are not yet perfect but I want to do what&apos;s necessary to get this in soon so we can fill in the gap QtWebkit has with CSS animations.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>181805</commentid>
    <comment_count>4</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-01-18 02:41:21 -0800</bug_when>
    <thetext>Attachment 46808 did not pass style-queue:

Failed to run &quot;WebKitTools/Scripts/check-webkit-style&quot; exit_code: 1
Ignoring WebKit/qt/Api/qwebsettings.cpp; This file is exempt from the style guide.
Ignoring WebKit/qt/Api/qwebview.cpp; This file is exempt from the style guide.
WebCore/platform/graphics/qt/GraphicsLayerQt.cpp:1116:  Alphabetical sorting problem.  [build/include_order] [4]
Ignoring WebKit/qt/Api/qgraphicswebview.cpp; This file is exempt from the style guide.
Ignoring WebKit/qt/Api/qwebsettings.h; This file is exempt from the style guide.
Ignoring WebKit/qt/Api/qgraphicswebview.h; This file is exempt from the style guide.
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>181817</commentid>
    <comment_count>5</comment_count>
    <who name="Kenneth Rohde Christiansen">kenneth</who>
    <bug_when>2010-01-18 04:07:10 -0800</bug_when>
    <thetext>(In reply to comment #4)
&gt; Attachment 46808 [details] did not pass style-queue:
&gt; 
&gt; Failed to run &quot;WebKitTools/Scripts/check-webkit-style&quot; exit_code: 1
&gt; Ignoring WebKit/qt/Api/qwebsettings.cpp; This file is exempt from the style
&gt; guide.
&gt; Ignoring WebKit/qt/Api/qwebview.cpp; This file is exempt from the style guide.
&gt; WebCore/platform/graphics/qt/GraphicsLayerQt.cpp:1116:  Alphabetical sorting
&gt; problem.  [build/include_order] [4]
&gt; Ignoring WebKit/qt/Api/qgraphicswebview.cpp; This file is exempt from the style
&gt; guide.
&gt; Ignoring WebKit/qt/Api/qwebsettings.h; This file is exempt from the style
&gt; guide.
&gt; Ignoring WebKit/qt/Api/qgraphicswebview.h; This file is exempt from the style
&gt; guide.
&gt; Total errors found: 1

Why are these exempted from the style guide? We don&apos;t use Qt style in them, but WebKit style</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>181821</commentid>
    <comment_count>6</comment_count>
    <who name="Noam Rosenthal">noam</who>
    <bug_when>2010-01-18 04:13:12 -0800</bug_when>
    <thetext>This is definitely not something I deliberately asked for... the whole webkit contribution machinery is pure magic to me :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>181828</commentid>
    <comment_count>7</comment_count>
      <attachid>46808</attachid>
    <who name="Kenneth Rohde Christiansen">kenneth</who>
    <bug_when>2010-01-18 04:49:39 -0800</bug_when>
    <thetext>Comment on attachment 46808
accelerated compositing in Qt: with massive style improvements and in-code comments


&gt; Index: WebKit/qt/QGVLauncher/main.cpp
&gt; ===================================================================
&gt; --- WebKit/qt/QGVLauncher/main.cpp	(revision 53364)
&gt; +++ WebKit/qt/QGVLauncher/main.cpp	(working copy)
&gt; @@ -458,14 +458,20 @@
&gt;      QWebSettings::enablePersistentStorage();
&gt;  
&gt;      const QStringList args = app.arguments();
&gt; -    if (args.count() &gt; 1)
&gt; +    const int indexOfUrl = args.indexOf(&quot;--url&quot;);
&gt; +    if (indexOfUrl &gt; 0 &amp;&amp; indexOfUrl &lt; args.count() - 1)
&gt; +        url = args.at(indexOfUrl+1);

spacing issue

&gt; +    else if (args.count() &gt; 1)
&gt;          url = args.at(1);
&gt; +    if (args.contains(&quot;--compositing&quot;))
&gt; +        QWebSettings::globalSettings()-&gt;setAttribute(QWebSettings::AcceleratedCompositingEnabled, true);
&gt;  
&gt;      MainWindow* window = new MainWindow;
&gt;      window-&gt;load(url);
&gt;  
&gt; -    for (int i = 2; i &lt; args.count(); i++)
&gt; -        window-&gt;newWindow(args.at(i));
&gt; +    for (int i = 2; i &lt; args.count(); ++i)
&gt; +        if (!args.at(i).startsWith(&quot;-&quot;) &amp;&amp; !args.at(i - 1).startsWith(&quot;-&quot;))
&gt; +            window-&gt;newWindow(args.at(i));
&gt;  
&gt;      window-&gt;show();
&gt;      return app.exec();
&gt; Index: WebKit/qt/WebCoreSupport/ChromeClientQt.cpp
&gt; ===================================================================
&gt; --- WebKit/qt/WebCoreSupport/ChromeClientQt.cpp	(revision 53364)
&gt; +++ WebKit/qt/WebCoreSupport/ChromeClientQt.cpp	(working copy)
&gt; @@ -25,6 +25,7 @@
&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;ChromeClientQt.h&quot;
&gt;  
&gt; @@ -42,6 +43,10 @@
&gt;  #include &quot;QWebPageClient.h&quot;
&gt;  #include &quot;SecurityOrigin.h&quot;
&gt;  
&gt; +#include &lt;qdebug.h&gt;
&gt; +#include &lt;qtextdocument.h&gt;
&gt; +#include &lt;qtooltip.h&gt;
&gt; +
&gt;  #include &quot;qwebpage.h&quot;
&gt;  #include &quot;qwebpage_p.h&quot;
&gt;  #include &quot;qwebframe_p.h&quot;
&gt; @@ -49,13 +54,12 @@
&gt;  #include &quot;qwebsecurityorigin_p.h&quot;
&gt;  #include &quot;qwebview.h&quot;
&gt;  
&gt; -#include &lt;qtooltip.h&gt;
&gt; -#include &lt;qtextdocument.h&gt;
&gt; +#if USE(ACCELERATED_COMPOSITING)
&gt; +#include &quot;GraphicsLayerQt.h&quot;
&gt; +#endif
&gt;  
&gt; -namespace WebCore
&gt; -{
&gt; +namespace WebCore {
&gt;  
&gt; -
&gt;  ChromeClientQt::ChromeClientQt(QWebPage* webPage)
&gt;      : m_webPage(webPage)
&gt;  {
&gt; @@ -466,6 +470,28 @@
&gt;      notImplemented();
&gt;  }
&gt;  
&gt; +#if USE(ACCELERATED_COMPOSITING)
&gt; +void ChromeClientQt::attachRootGraphicsLayer(Frame* frame, GraphicsLayer* graphicsLayer)
&gt; +{    
&gt; +    if (platformPageClient())
&gt; +        platformPageClient()-&gt;setRootGraphicsLayer(graphicsLayer ? graphicsLayer-&gt;nativeLayer() : 0);
&gt; +}
&gt; +
&gt; +void ChromeClientQt::setNeedsOneShotDrawingSynchronization()
&gt; +{
&gt; +    // we want the layers to synchronize next time we update the screen anyway
&gt; +    if (platformPageClient())
&gt; +        platformPageClient()-&gt;markForSync(false);

I would suggest setNeedsSynchronization, to keep it similar with setNeedsLayout()

&gt; +}
&gt; +
&gt; +void ChromeClientQt::scheduleCompositingLayerSync()
&gt; +{
&gt; +    // we want the layers to synchronize ASAP

Explain why

&gt; +    if (platformPageClient())
&gt; +        platformPageClient()-&gt;markForSync(true);
&gt; +}
&gt; +#endif
&gt; +
&gt;  QtAbstractWebPopup* ChromeClientQt::createPopup()
&gt;  {
&gt;      return new QtFallbackWebPopup;
&gt; Index: WebKit/qt/WebCoreSupport/ChromeClientQt.h
&gt; ===================================================================
&gt; --- WebKit/qt/WebCoreSupport/ChromeClientQt.h	(revision 53364)
&gt; +++ WebKit/qt/WebCoreSupport/ChromeClientQt.h	(working copy)
&gt; @@ -123,6 +123,15 @@
&gt;  #if ENABLE(OFFLINE_WEB_APPLICATIONS)
&gt;          virtual void reachedMaxAppCacheSize(int64_t spaceNeeded);
&gt;  #endif
&gt; +
&gt; +#if USE(ACCELERATED_COMPOSITING)
&gt; +        // see ChromeClient.h
&gt; +        // this is a hook for WebCore to tell us what we need to do with the GraphicsLayers
&gt; +        virtual void attachRootGraphicsLayer(Frame*, GraphicsLayer*);
&gt; +        virtual void setNeedsOneShotDrawingSynchronization();
&gt; +        virtual void scheduleCompositingLayerSync();
&gt; +#endif
&gt; +
&gt;          virtual void runOpenPanel(Frame*, PassRefPtr&lt;FileChooser&gt;);
&gt;  
&gt;          virtual void formStateDidChange(const Node*) { }
&gt; Index: WebKit/qt/Api/qgraphicswebview.cpp
&gt; ===================================================================
&gt; --- WebKit/qt/Api/qgraphicswebview.cpp	(revision 53364)
&gt; +++ WebKit/qt/Api/qgraphicswebview.cpp	(working copy)
&gt; @@ -22,24 +22,73 @@
&gt;  #include &quot;qgraphicswebview.h&quot;
&gt;  
&gt;  #include &quot;qwebframe.h&quot;
&gt; +#include &quot;qwebframe_p.h&quot;
&gt;  #include &quot;qwebpage.h&quot;
&gt;  #include &quot;qwebpage_p.h&quot;
&gt;  #include &quot;QWebPageClient.h&quot;
&gt; -#include &lt;QtGui/QGraphicsScene&gt;
&gt; -#include &lt;QtGui/QGraphicsView&gt;
&gt; +#include &lt;FrameView.h&gt;
&gt; +#include &lt;QtCore/qsharedpointer.h&gt;
&gt; +#include &lt;QtCore/qtimer.h&gt;
&gt;  #include &lt;QtGui/qapplication.h&gt;
&gt; +#include &lt;QtGui/qgraphicsscene.h&gt;
&gt;  #include &lt;QtGui/qgraphicssceneevent.h&gt;
&gt; +#include &lt;QtGui/qgraphicsview.h&gt;
&gt; +#include &lt;QtGui/qpixmapcache.h&gt;
&gt;  #include &lt;QtGui/qstyleoption.h&gt;
&gt;  #if defined(Q_WS_X11)
&gt;  #include &lt;QX11Info&gt;
&gt;  #endif
&gt; +#include &lt;Settings.h&gt;
&gt;  
&gt; +#if USE(ACCELERATED_COMPOSITING)
&gt; +
&gt; +// the overlay is here for one reason only: to have the scroll-bars and other

scrollbars

&gt; +// extra UI elements appear on top of any QGraphicsItems created by CSS compositing layers
&gt; +class QGraphicsWebViewOverlay : public QGraphicsItem {
&gt; +    public:

No space before public: please

&gt; +    QGraphicsWebViewOverlay(QGraphicsWebView* view)
&gt; +            :QGraphicsItem(view)

missing space after :

&gt; +            , q(view)
&gt; +    {
&gt; +        setPos(0, 0);
&gt; +        setFlag(QGraphicsItem::ItemUsesExtendedStyleOption, true);
&gt; +        setCacheMode(QGraphicsItem::DeviceCoordinateCache);

Would be good to add a comment why these are set

&gt; +    }
&gt; +
&gt; +    QRectF boundingRect() const
&gt; +    {
&gt; +        return q-&gt;boundingRect();
&gt; +    }
&gt; +
&gt; +    void paint(QPainter* painter, const QStyleOptionGraphicsItem* options, QWidget*)
&gt; +    {
&gt; +        q-&gt;page()-&gt;mainFrame()-&gt;render(painter, static_cast&lt;QWebFrame::RenderLayer&gt;(QWebFrame::AllLayers&amp;(~QWebFrame::ContentsLayer)), options-&gt;exposedRect.toRect());
&gt; +    }
&gt; +
&gt; +    friend class QGraphicsWebView;
&gt; +    QGraphicsWebView* q;
&gt; +};
&gt; +
&gt; +#endif
&gt; +
&gt;  class QGraphicsWebViewPrivate : public QWebPageClient {
&gt;  public:
&gt;      QGraphicsWebViewPrivate(QGraphicsWebView* parent)
&gt; -        : q(parent)
&gt; -        , page(0)
&gt; -    {}
&gt; +        : q(parent),
&gt; +        page(0),
&gt; +#if USE(ACCELERATED_COMPOSITING)
&gt; +        rootGraphicsLayer(0),
&gt; +        overlay(new QGraphicsWebViewOverlay(parent)),
&gt; +        shouldSync(true)
&gt; +#endif
&gt; +    {
&gt; +#if USE(ACCELERATED_COMPOSITING)
&gt; +        // the overlay and stays alive for the lifetime of
&gt; +        // this QGraphicsWebView as the scrollbars are needed when there&apos;s no compositing
&gt; +        overlay-&gt;setZValue(OverlayZValue);
&gt; +        q-&gt;setFlag(QGraphicsItem::ItemUsesExtendedStyleOption);
&gt; +#endif
&gt; +    }
&gt;  
&gt;      virtual ~QGraphicsWebViewPrivate();
&gt;      virtual void scroll(int dx, int dy, const QRect&amp;);
&gt; @@ -61,16 +110,90 @@
&gt;  
&gt;      virtual QObject* pluginParent() const;
&gt;  
&gt; +#if USE(ACCELERATED_COMPOSITING)
&gt; +    virtual void setRootGraphicsLayer(QGraphicsItem* layer);
&gt; +    virtual void markForSync(bool scheduleSync);
&gt; +    void updateCompositingScrollPosition();

updateComposedScroll.. ? the method name isn&apos;t so clear

updateOverlayScrollPosition ?

&gt; +#endif
&gt; +
&gt; +    void syncLayers();
&gt;      void _q_doLoadFinished(bool success);
&gt;  
&gt;      QGraphicsWebView* q;
&gt;      QWebPage* page;
&gt; +#if USE(ACCELERATED_COMPOSITING)
&gt; +    QGraphicsItem* rootGraphicsLayer;
&gt; +    QGraphicsWebViewOverlay* overlay;
&gt; +
&gt; +    // we need to sync the layers if we get a special call from the WebCore
&gt; +    // compositor telling us to do so. We&apos;ll get that call from ChromeClientQt
&gt; +    bool shouldSync;

syncNeeded ?

&gt; +
&gt; +    // we need to put the root graphics layer behind the overlay (which contains the scrollbar)
&gt; +    enum { RootGraphicsLayerZValue, OverlayZValue };
&gt; +#endif
&gt;  };
&gt;  
&gt;  QGraphicsWebViewPrivate::~QGraphicsWebViewPrivate()
&gt;  {
&gt; +#if USE(ACCELERATED_COMPOSITING)
&gt; +    if (rootGraphicsLayer) {
&gt; +        // we don&apos;t need to delete the root graphics layer
&gt; +        // The lifecycle is managed in GraphicsLayerQt.cpp
&gt; +        rootGraphicsLayer-&gt;setParentItem(0);
&gt; +        q-&gt;scene()-&gt;removeItem(rootGraphicsLayer);
&gt; +    }
&gt; +#endif
&gt;  }
&gt;  
&gt; +#if USE(ACCELERATED_COMPOSITING)
&gt; +void QGraphicsWebViewPrivate::setRootGraphicsLayer(QGraphicsItem* layer)
&gt; +{
&gt; +    if (rootGraphicsLayer) {
&gt; +        rootGraphicsLayer-&gt;setParentItem(0);
&gt; +        q-&gt;scene()-&gt;removeItem(rootGraphicsLayer);
&gt; +        QWebFramePrivate::core(q-&gt;page()-&gt;mainFrame())-&gt;view()-&gt;syncCompositingStateRecursive();
&gt; +    }
&gt; +
&gt; +    rootGraphicsLayer = layer;
&gt; +
&gt; +    if (layer) {
&gt; +        layer-&gt;setFlag(QGraphicsItem::ItemClipsChildrenToShape, true);
&gt; +        layer-&gt;setParentItem(q);
&gt; +        layer-&gt;setZValue(RootGraphicsLayerZValue);
&gt; +        updateCompositingScrollPosition();
&gt; +    }
&gt; +}
&gt; +
&gt; +void QGraphicsWebViewPrivate::markForSync(bool scheduleSync)
&gt; +{
&gt; +    shouldSync = true;
&gt; +    if (scheduleSync)
&gt; +        QTimer::singleShot(0, q, SLOT(syncLayers()));
&gt; +}
&gt; +
&gt; +void QGraphicsWebViewPrivate::updateCompositingScrollPosition()
&gt; +{
&gt; +    if (rootGraphicsLayer &amp;&amp; q-&gt;page() &amp;&amp; q-&gt;page()-&gt;mainFrame()) {
&gt; +        const QPoint scrollPosition = q-&gt;page()-&gt;mainFrame()-&gt;scrollPosition();
&gt; +        rootGraphicsLayer-&gt;setPos(-scrollPosition);
&gt; +    }
&gt; +}
&gt; +
&gt; +#endif
&gt; +
&gt; +
&gt; +void QGraphicsWebViewPrivate::syncLayers()
&gt; +{
&gt; +#if USE(ACCELERATED_COMPOSITING)
&gt; +    if (shouldSync) {
&gt; +        QWebFramePrivate::core(q-&gt;page()-&gt;mainFrame())-&gt;view()-&gt;syncCompositingStateRecursive();
&gt; +        shouldSync = false;
&gt; +    }
&gt; +#endif
&gt; +}
&gt; +
&gt; +
&gt;  void QGraphicsWebViewPrivate::_q_doLoadFinished(bool success)
&gt;  {
&gt;      // If the page had no title, still make sure it gets the signal
&gt; @@ -83,11 +206,18 @@
&gt;  void QGraphicsWebViewPrivate::scroll(int dx, int dy, const QRect&amp; rectToScroll)
&gt;  {
&gt;      q-&gt;scroll(qreal(dx), qreal(dy), QRectF(rectToScroll));
&gt; +#if USE(ACCELERATED_COMPOSITING)
&gt; +    updateCompositingScrollPosition();
&gt; +//    QApplication::instance()-&gt;sendPostedEvents();
&gt; +#endif
&gt;  }
&gt;  
&gt;  void QGraphicsWebViewPrivate::update(const QRect &amp; dirtyRect)
&gt;  {
&gt;      q-&gt;update(QRectF(dirtyRect));
&gt; +#if USE(ACCELERATED_COMPOSITING)
&gt; +    overlay-&gt;update(QRectF(dirtyRect));
&gt; +#endif
&gt;  }
&gt;  
&gt;  
&gt; @@ -248,6 +378,7 @@
&gt;      setAcceptTouchEvents(true);
&gt;  #endif
&gt;      setFocusPolicy(Qt::StrongFocus);
&gt; +    setFlag(QGraphicsItem::ItemClipsChildrenToShape, true);
&gt;  }
&gt;  
&gt;  /*!
&gt; @@ -293,11 +424,17 @@
&gt;      return d-&gt;page;
&gt;  }
&gt;  
&gt; +
&gt;  /*! \reimp
&gt;  */
&gt;  void QGraphicsWebView::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget*)
&gt;  {
&gt; -    page()-&gt;mainFrame()-&gt;render(painter, option-&gt;exposedRect.toRect());
&gt; +#if USE(ACCELERATED_COMPOSITING)
&gt; +    page()-&gt;mainFrame()-&gt;render(painter, QWebFrame::ContentsLayer, option-&gt;exposedRect.toRect());
&gt; +    d-&gt;syncLayers();
&gt; +#else
&gt; +    page()-&gt;mainFrame()-&gt;render(painter, QWebFrame::AllLayers, option-&gt;exposedRect.toRect());
&gt; +#endif
&gt;  }
&gt;  
&gt;  /*! \reimp
&gt; @@ -425,6 +562,9 @@
&gt;      d-&gt;page = page;
&gt;      if (!d-&gt;page)
&gt;          return;
&gt; +#if USE(ACCELERATED_COMPOSITING)
&gt; +    d-&gt;overlay-&gt;prepareGeometryChange();
&gt; +#endif
&gt;      d-&gt;page-&gt;d-&gt;client = d; // set the page client
&gt;  
&gt;      QSize size = geometry().size().toSize();
&gt; @@ -528,6 +668,11 @@
&gt;  */
&gt;  void QGraphicsWebView::updateGeometry()
&gt;  {
&gt; +
&gt; +#if USE(ACCELERATED_COMPOSITING)
&gt; +    d-&gt;overlay-&gt;prepareGeometryChange();
&gt; +#endif
&gt; +
&gt;      QGraphicsWidget::updateGeometry();
&gt;  
&gt;      if (!d-&gt;page)
&gt; @@ -543,6 +688,10 @@
&gt;  {
&gt;      QGraphicsWidget::setGeometry(rect);
&gt;  
&gt; +#if USE(ACCELERATED_COMPOSITING)
&gt; +    d-&gt;overlay-&gt;prepareGeometryChange();
&gt; +#endif
&gt; +
&gt;      if (!d-&gt;page)
&gt;          return;
&gt;  
&gt; Index: WebKit/qt/Api/qwebsettings.h
&gt; ===================================================================
&gt; --- WebKit/qt/Api/qwebsettings.h	(revision 53364)
&gt; +++ WebKit/qt/Api/qwebsettings.h	(working copy)
&gt; @@ -68,7 +68,8 @@
&gt;  #endif
&gt;          LocalContentCanAccessRemoteUrls,
&gt;          DnsPrefetchEnabled,
&gt; -        XSSAuditorEnabled
&gt; +        XSSAuditorEnabled,
&gt; +        AcceleratedCompositingEnabled
&gt;      };
&gt;      enum WebGraphic {
&gt;          MissingImageGraphic,
&gt; Index: WebKit/qt/Api/qwebsettings.cpp
&gt; ===================================================================
&gt; --- WebKit/qt/Api/qwebsettings.cpp	(revision 53364)
&gt; +++ WebKit/qt/Api/qwebsettings.cpp	(working copy)
&gt; @@ -152,7 +152,12 @@
&gt;          value = attributes.value(QWebSettings::JavascriptEnabled,
&gt;                                        global-&gt;attributes.value(QWebSettings::JavascriptEnabled));
&gt;          settings-&gt;setJavaScriptEnabled(value);
&gt; +#if USE(ACCELERATED_COMPOSITING)
&gt; +        value = attributes.value(QWebSettings::AcceleratedCompositingEnabled,
&gt; +                                      global-&gt;attributes.value(QWebSettings::AcceleratedCompositingEnabled));
&gt;  
&gt; +        settings-&gt;setAcceleratedCompositingEnabled(value);
&gt; +#endif
&gt;          value = attributes.value(QWebSettings::JavascriptCanOpenWindows,
&gt;                                        global-&gt;attributes.value(QWebSettings::JavascriptCanOpenWindows));
&gt;          settings-&gt;setJavaScriptCanOpenWindowsAutomatically(value);
&gt; @@ -389,6 +394,7 @@
&gt;      d-&gt;attributes.insert(QWebSettings::OfflineWebApplicationCacheEnabled, false);
&gt;      d-&gt;attributes.insert(QWebSettings::LocalStorageEnabled, false);
&gt;      d-&gt;attributes.insert(QWebSettings::LocalContentCanAccessRemoteUrls, false);
&gt; +    d-&gt;attributes.insert(QWebSettings::AcceleratedCompositingEnabled, false);
&gt;      d-&gt;offlineStorageDefaultQuota = 5 * 1024 * 1024;
&gt;      d-&gt;defaultTextEncoding = QLatin1String(&quot;iso-8859-1&quot;);
&gt;  }
&gt; Index: WebKit/qt/Api/qgraphicswebview.h
&gt; ===================================================================
&gt; --- WebKit/qt/Api/qgraphicswebview.h	(revision 53364)
&gt; +++ WebKit/qt/Api/qgraphicswebview.h	(working copy)
&gt; @@ -105,7 +105,6 @@
&gt;      void iconChanged();
&gt;      void statusBarMessage(const QString&amp; message);
&gt;      void linkClicked(const QUrl&amp;);
&gt; -
&gt;  protected:
&gt;      virtual void mousePressEvent(QGraphicsSceneMouseEvent*);
&gt;      virtual void mouseDoubleClickEvent(QGraphicsSceneMouseEvent*);
&gt; @@ -134,7 +133,9 @@
&gt;  
&gt;  private:
&gt;      Q_PRIVATE_SLOT(d, void _q_doLoadFinished(bool success))
&gt; -
&gt; +    // we don&apos;t want to change the moc based on USE() macro, so this function is here
&gt; +    // but will be empty if ACCLERATED_COMPOSITING is disabled
&gt; +    Q_PRIVATE_SLOT(d, void syncLayers())
&gt;      QGraphicsWebViewPrivate* const d;
&gt;      friend class QGraphicsWebViewPrivate;
&gt;  };
&gt; Index: WebKit/qt/Api/qwebview.cpp
&gt; ===================================================================
&gt; --- WebKit/qt/Api/qwebview.cpp	(revision 53364)
&gt; +++ WebKit/qt/Api/qwebview.cpp	(working copy)
&gt; @@ -22,10 +22,11 @@
&gt;  #include &quot;config.h&quot;
&gt;  #include &quot;qwebview.h&quot;
&gt;  
&gt; +#include &quot;Page.h&quot;
&gt;  #include &quot;QWebPageClient.h&quot;
&gt; +#include &quot;Settings.h&quot;
&gt;  #include &quot;qwebframe.h&quot;
&gt;  #include &quot;qwebpage_p.h&quot;
&gt; -
&gt;  #include &quot;qbitmap.h&quot;
&gt;  #include &quot;qevent.h&quot;
&gt;  #include &quot;qpainter.h&quot;
&gt; @@ -247,6 +248,9 @@
&gt;                  this, SLOT(_q_pageDestroyed()));
&gt;      }
&gt;      setAttribute(Qt::WA_OpaquePaintEvent, d-&gt;page);
&gt; +#if USE(ACCELERATED_COMPOSITING)
&gt; +    d-&gt;page-&gt;d-&gt;page-&gt;settings()-&gt;setAcceleratedCompositingEnabled(false);

This seems like a hack. It should just ignore it nicely. And documentation should say that it only works for the GraphicsView

&gt; +#endif
&gt;      update();
&gt;  }
&gt;  
&gt; Index: WebCore/WebCore.pro
&gt; ===================================================================
&gt; --- WebCore/WebCore.pro	(revision 53364)
&gt; +++ WebCore/WebCore.pro	(working copy)
&gt; @@ -2707,6 +2707,19 @@
&gt;              plugins/win/PaintHooks.asm
&gt;      }
&gt;  }
&gt; +contains(DEFINES, WTF_USE_ACCELERATED_COMPOSITING) {
&gt; +HEADERS += \
&gt; +    rendering/RenderLayerBacking.h \
&gt; +    rendering/RenderLayerCompositor.h \
&gt; +    platform/graphics/GraphicsLayer.h \
&gt; +    platform/graphics/GraphicsLayerClient.h \
&gt; +    platform/graphics/qt/GraphicsLayerQt.h
&gt; +SOURCES += \
&gt; +    platform/graphics/GraphicsLayer.cpp \
&gt; +    platform/graphics/qt/GraphicsLayerQt.cpp \
&gt; +    rendering/RenderLayerBacking.cpp \
&gt; +    rendering/RenderLayerCompositor.cpp
&gt; +}
&gt;  
&gt;  symbian {
&gt;      shared {
&gt; Index: WebCore/platform/qt/QWebPageClient.h
&gt; ===================================================================
&gt; --- WebCore/platform/qt/QWebPageClient.h	(revision 53364)
&gt; +++ WebCore/platform/qt/QWebPageClient.h	(working copy)
&gt; @@ -30,7 +30,7 @@
&gt;  #include &lt;QCursor&gt;
&gt;  #endif
&gt;  #include &lt;QRect&gt;
&gt; -
&gt; +class QGraphicsItem;
&gt;  class QWebPageClient {
&gt;  public:
&gt;      virtual ~QWebPageClient() { }
&gt; @@ -39,6 +39,16 @@
&gt;      virtual void update(const QRect&amp;) = 0;
&gt;      virtual void setInputMethodEnabled(bool enable) = 0;
&gt;      virtual bool inputMethodEnabled() const = 0;
&gt; +#if USE(ACCELERATED_COMPOSITING)
&gt; +    // this gets called when we start/stop compositing.
&gt; +    virtual void setRootGraphicsLayer(QGraphicsItem* layer) {}
&gt; +
&gt; +    // this gets called when the compositor wants us to sync the layers
&gt; +    // if scheduleSync is true, we schedule a sync ourselves. otherwise,
&gt; +    // we wait for the next update and sync the layers then.
&gt; +    virtual void markForSync(bool scheduleSync = false) {}
&gt; +#endif
&gt; +
&gt;  #if QT_VERSION &gt;= 0x040600
&gt;      virtual void setInputMethodHint(Qt::InputMethodHint hint, bool enable) = 0;
&gt;  #endif
&gt; Index: WebCore/platform/graphics/qt/GraphicsLayerQt.cpp
&gt; ===================================================================
&gt; --- WebCore/platform/graphics/qt/GraphicsLayerQt.cpp	(revision 0)
&gt; +++ WebCore/platform/graphics/qt/GraphicsLayerQt.cpp	(revision 0)
&gt; @@ -0,0 +1,1116 @@
&gt; +/*
&gt; +    Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies)
&gt; +
&gt; +    This library is free software; you can redistribute it and/or
&gt; +    modify it under the terms of the GNU Library General Public
&gt; +    License as published by the Free Software Foundation; either
&gt; +    version 2 of the License, or (at your option) any later version.
&gt; +
&gt; +    This library is distributed in the hope that it will be useful,
&gt; +    but WITHOUT ANY WARRANTY; without even the implied warranty of
&gt; +    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
&gt; +    Library General Public License for more details.
&gt; +
&gt; +    You should have received a copy of the GNU Library General Public License
&gt; +    along with this library; see the file COPYING.LIB.  If not, write to
&gt; +    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
&gt; +    Boston, MA 02110-1301, USA.
&gt; +*/
&gt; +
&gt; +#include &quot;config.h&quot;
&gt; +#include &quot;GraphicsLayerQt.h&quot;
&gt; +
&gt; +#include &quot;CurrentTime.h&quot;
&gt; +#include &quot;FloatRect.h&quot;
&gt; +#include &quot;GraphicsContext.h&quot;
&gt; +#include &quot;Image.h&quot;
&gt; +#include &quot;RefCounted.h&quot;
&gt; +#include &quot;TranslateTransformOperation.h&quot;
&gt; +#include &quot;UnitBezier.h&quot;
&gt; +#include &lt;QtCore/qabstractanimation.h&gt;
&gt; +#include &lt;QtCore/qdebug.h&gt;
&gt; +#include &lt;QtCore/qset.h&gt;
&gt; +#include &lt;QtCore/qtimer.h&gt;
&gt; +#include &lt;QtGui/qapplication.h&gt;
&gt; +#include &lt;QtGui/qbitmap.h&gt;
&gt; +#include &lt;QtGui/qcolor.h&gt;
&gt; +#include &lt;QtGui/qgraphicseffect.h&gt;
&gt; +#include &lt;QtGui/qgraphicsitem.h&gt;
&gt; +#include &lt;QtGui/qgraphicsscene.h&gt;
&gt; +#include &lt;QtGui/qmatrix4x4.h&gt;
&gt; +#include &lt;QtGui/qpainter.h&gt;
&gt; +#include &lt;QtGui/qpalette.h&gt;
&gt; +#include &lt;QtGui/qpixmap.h&gt;
&gt; +#include &lt;QtGui/qstyleoption.h&gt;
&gt; +
&gt; +namespace WebCore {
&gt; +
&gt; +
&gt; +class GraphicsLayerQtPrivate : public QGraphicsObject {
&gt; +    Q_OBJECT
&gt; +
&gt; +public:
&gt; +    // this set of flags help us defer which properties of the layer have been
&gt; +    // modified by the compositor, so we can know what to look for in the next flush
&gt; +    enum PossibleChange {
&gt; +        NoChanges       =           0,
&gt; +        ChildrenChange  =           (1L &lt;&lt; 1),
&gt; +        MaskLayerChange =           (1L &lt;&lt; 2),
&gt; +        PositionChange  =           (1L &lt;&lt; 3),
&gt; +        AnchorPointChange =         (1L &lt;&lt; 4),
&gt; +        SizeChange      =           (1L &lt;&lt; 5),
&gt; +        TransformChange =           (1L &lt;&lt; 6),
&gt; +        ContentChange   =           (1L &lt;&lt; 7),
&gt; +        GeometryOrientationChange = (1L &lt;&lt; 8),
&gt; +        ContentsOrientationChange = (1L &lt;&lt; 9),
&gt; +        OpacityChange   =           (1L &lt;&lt; 10),
&gt; +        ContentsRectChange =        (1L &lt;&lt; 11),
&gt; +        Preserves3DChange =         (1L &lt;&lt; 12),
&gt; +        MasksToBoundsChange =       (1L &lt;&lt; 13),
&gt; +        DrawsContentChange =        (1L &lt;&lt; 14),
&gt; +        ContentsOpaqueChange =      (1L &lt;&lt; 15),
&gt; +        BackfaceVisibilityChange =  (1L &lt;&lt; 16),
&gt; +        ChildrenTransformChange =   (1L &lt;&lt; 17),
&gt; +        DisplayChange =             (1L &lt;&lt; 18),
&gt; +        BackgroundColorChange =     (1L &lt;&lt; 19),
&gt; +        ParentChange =              (1L &lt;&lt; 20),
&gt; +        DistributesOpacityChange =  (1L &lt;&lt; 21)
&gt; +    };
&gt; 

where does these come from?

&gt; +    // the compositor lets us special-case images and colors, so we try to do so
&gt; +    enum StaticContentType { HTMLContentType, PixmapContentType, ColorContentType};
&gt; +
&gt; +    GraphicsLayerQtPrivate(GraphicsLayerQt* newLayer, GraphicsLayerClient* newClient);
&gt; +    virtual ~GraphicsLayerQtPrivate();
&gt; +
&gt; +    // reimps from QGraphicsItem
&gt; +    virtual QPainterPath opaqueArea() const;

I believe that QPainterPath can be quite expensive

&gt; +    virtual QRectF boundingRect() const;
&gt; +    virtual void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget);

In header files we don&apos;t add redundant arguments... like QPainter* painter, but just QPainter*. When it is
not redundant (like QRect viewArea) it is added!

Remove painter, option and widget here

&gt; +
&gt; +    // we manage transforms ourselves because transform-origin acts differently in webkit and in Qt
&gt; +    void setBaseTransform(const QTransform&amp; t);    

remove t here

&gt; +    void drawContents(QPainter* painter, const QRectF&amp; r, bool mask = false);

you know the drill now :-)

&gt; +
&gt; +    // let the compositor-API tell us which properties were changed
&gt; +    void noteChange(PossibleChange pc);

remove pc

&gt; +
&gt; +    // called when the compositor is ready for us to show the changes on screen
&gt; +    // this is called indirectly from ChromeClientQt::setNeedsOneShotDrawingSynchronization
&gt; +    // (meaning the sync would happen together with the next draw)
&gt; +    // or ChromeClientQt::scheduleCompositingLayerSync (meaning the sync will happen ASAP)
&gt; +    void flushChanges(bool recursive = true);
&gt; +
&gt; +public slots:
&gt; +    // we need to notify the client (aka the layer compositor) when the animation actually starts
&gt; +    void notifyAnimationStarted();
&gt; +
&gt; +public:
&gt; +    GraphicsLayerQt* layer;
&gt; +    GraphicsLayerClient* client;
&gt; +
&gt; +    QTransform baseTransform;
&gt; +    bool transformAnimationRunning;
&gt; +    bool opacityAnimationRunning;

If these are used from the class itself you should make methods for accessing them instead. They will be inline anyway.

&gt; +
&gt; +    struct ContentData {
&gt; +        QPixmap pixmap;
&gt; +        QRegion regionToUpdate;
&gt; +        bool updateAll;
&gt; +        bool backgroundColorValid;
&gt; +        QColor contentsBackgroundColor;
&gt; +        QColor backgroundColor;
&gt; +        StaticContentType contentType;
&gt; +        float opacity;
&gt; +        ContentData()
&gt; +                : updateAll(false)
&gt; +                , backgroundColorValid(false)
&gt; +                , contentType(HTMLContentType)
&gt; +                , opacity(1)

indentation seems wrong

&gt; +        {
&gt; +        }
&gt; +
&gt; +    };
&gt; +
&gt; +    ContentData pendingContent;
&gt; +    ContentData currentContent;
&gt; +
&gt; +    PossibleChange possibleChanges;
&gt; +
&gt; +    QSizeF size;
&gt; +    QList&lt;QWeakPointer&lt;QAbstractAnimation&gt; &gt; animations;
&gt; +    QTimer suspendTimer;
&gt; +
&gt; +    struct State {
&gt; +        GraphicsLayer* maskLayer;
&gt; +        FloatPoint pos;
&gt; +        FloatPoint3D anchorPoint;
&gt; +        FloatSize size;
&gt; +        TransformationMatrix transform;
&gt; +        TransformationMatrix childrenTransform;
&gt; +        Color backgroundColor;
&gt; +        Color currentColor;
&gt; +        GraphicsLayer::CompositingCoordinatesOrientation geoOrientation;

geo? geometric?

&gt; +        GraphicsLayer::CompositingCoordinatesOrientation contentsOrientation;
&gt; +        float opacity;
&gt; +        QRect contentsRect;
&gt; +
&gt; +        bool preserves3D: 1;
&gt; +        bool masksToBounds: 1;
&gt; +        bool drawsContent: 1;
&gt; +        bool contentsOpaque: 1;
&gt; +        bool backfaceVisibility: 1;
&gt; +        bool distributeOpacity: 1;
&gt; +        bool align: 2;

align what?

&gt; +        State() : maskLayer(0), opacity(1), preserves3D(false), masksToBounds(false),

opacity == 1.0 ?

&gt; +                  drawsContent(false), contentsOpaque(false), backfaceVisibility(false),
&gt; +                  distributeOpacity(false)
&gt; +        {
&gt; +        }
&gt; +    } state;
&gt; +};
&gt; +
&gt; +GraphicsLayerQtPrivate::GraphicsLayerQtPrivate(GraphicsLayerQt* newLayer, GraphicsLayerClient* newClient)
&gt; +        : QGraphicsObject(0)
&gt; +        , layer(newLayer)
&gt; +        , transformAnimationRunning(false)
&gt; +        , possibleChanges(NoChanges)
&gt; +
&gt; +{
&gt; +    this-&gt;client = newClient;

how is the client and layer new when this is a constructor?

&gt; +
&gt; +    // better to calculate the exposed rect in QGraphicsView than over-render in WebCore
&gt; +    // though this might be tweakable
&gt; +    setFlag(QGraphicsItem::ItemUsesExtendedStyleOption, true);
&gt; +
&gt; +    // we use graphics-view for compositing, not for interactivity
&gt; +    setAcceptedMouseButtons(Qt::NoButton);

What about keyevents?

&gt; +    setEnabled(false);
&gt; +
&gt; +    // we&apos;ll set the cache when we know what&apos;s going on
&gt; +    setCacheMode(NoCache);
&gt; +}
&gt; +
&gt; +GraphicsLayerQtPrivate::~GraphicsLayerQtPrivate()
&gt; +{
&gt; +    // the compositor manages item lifecycle - we don&apos;t want the graphics-view
&gt; +    // system to automatically delete our items
&gt; +    foreach (QGraphicsItem* i, childItems()) {
&gt; +        if (scene())
&gt; +            scene()-&gt;removeItem(i);
&gt; +        i-&gt;setParentItem(0);
&gt; +    }

foreach on non-consts is quite slow, consider using stl iterators

&gt; +    
&gt; +    // we do, however, own the animations...
&gt; +    foreach (QWeakPointer&lt;QAbstractAnimation&gt; anim, animations) {
&gt; +        if (anim)
&gt; +            delete anim.data();
&gt; +    }
&gt; +}

here as well

&gt; +
&gt; +void GraphicsLayerQtPrivate::setBaseTransform(const QTransform&amp; t)
&gt; +{
&gt; +    if (layer) {
&gt; +        // webkit has relative-to-size originPoint, graphics-view has a pixel originPoint
&gt; +        // here we convert
&gt; +        QPointF originTranslate(
&gt; +                layer-&gt;anchorPoint().x()*layer-&gt;size().width(), layer-&gt;anchorPoint().y()*layer-&gt;size().height());
&gt; +
&gt; +        resetTransform();
&gt; +
&gt; +        // we have to manage this ourselves because QGraphicsView&apos;s transformOrigin is incomplete
&gt; +        translate(originTranslate.x(), originTranslate.y());
&gt; +        setTransform(t, true);
&gt; +        translate(-originTranslate.x(), -originTranslate.y());
&gt; +        baseTransform = t;
&gt; +    }
&gt; +}</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>181829</commentid>
    <comment_count>8</comment_count>
      <attachid>46808</attachid>
    <who name="Kenneth Rohde Christiansen">kenneth</who>
    <bug_when>2010-01-18 04:50:42 -0800</bug_when>
    <thetext>Comment on attachment 46808
accelerated compositing in Qt: with massive style improvements and in-code comments

Second part!

&gt; +QPainterPath GraphicsLayerQtPrivate::opaqueArea() const
&gt; +{
&gt; +    QPainterPath pp;
&gt; +    // we try out best to return the opaque area, maybe it will help graphics-view render less items
&gt; +    if (currentContent.backgroundColorValid &amp;&amp; currentContent.backgroundColor.alpha() == 0xff)
&gt; +        pp.addRect(boundingRect());
&gt; +    else {
&gt; +        if (state.contentsOpaque
&gt; +            || (currentContent.contentType == ColorContentType &amp;&amp; currentContent.contentsBackgroundColor.alpha() == 0xff)
&gt; +            || (currentContent.contentType == PixmapContentType &amp;&amp; !currentContent.pixmap.hasAlpha())) {
&gt; +
&gt; +            pp.addRect(state.contentsRect);
&gt; +        }
&gt; +    }
&gt; +    return pp;
&gt; +}
&gt; +
&gt; +QRectF GraphicsLayerQtPrivate::boundingRect() const
&gt; +{
&gt; +    return QRectF(QPointF(0, 0), QSizeF(size));
&gt; +}
&gt; +
&gt; +void GraphicsLayerQtPrivate::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget)
&gt; +{
&gt; +    if (state.maskLayer &amp;&amp; state.maskLayer-&gt;platformLayer()) {
&gt; +        // maybe this shouldn&apos;t be in paint (rendering the mask-layer)
&gt; +        // though it does work for now

Why comment on two lines, when it on one line is about the size of the line below? 

&gt; +        GraphicsLayerQtPrivate* otherMask = (GraphicsLayerQtPrivate*)state.maskLayer-&gt;platformLayer();
&gt; +        otherMask-&gt;flushChanges(true);
&gt; +        
&gt; +        // CSS3 mask and QGraphicsOpacityEffect are the same thing! we just need to convert...
&gt; +        if (!graphicsEffect()) {
&gt; +            QPixmap mask(QSize(state.maskLayer-&gt;size().width(), state.maskLayer-&gt;size().height()));
&gt; +            mask.fill(Qt::transparent);
&gt; +            {
&gt; +                QPainter p(&amp;mask);
&gt; +                p.setRenderHints(painter-&gt;renderHints(), true);
&gt; +                p.setCompositionMode(QPainter::CompositionMode_Source);
&gt; +                static_cast&lt;GraphicsLayerQtPrivate*&gt;(state.maskLayer-&gt;platformLayer())-&gt;drawContents(&amp;p, option-&gt;exposedRect, true);
&gt; +            }
&gt; +            QGraphicsOpacityEffect* eff = new QGraphicsOpacityEffect(this);

eff :-) I like fx more :-) hehe.

Is this conversion fast?

&gt; +            eff-&gt;setOpacity(1);
&gt; +            eff-&gt;setOpacityMask(QBrush(mask));
&gt; +            setGraphicsEffect(eff);
&gt; +        }
&gt; +    }
&gt; +    drawContents(painter, option-&gt;exposedRect);
&gt; +}
&gt; +
&gt; +void GraphicsLayerQtPrivate::drawContents(QPainter* painter, const QRectF&amp; r, bool mask)
&gt; +{
&gt; +    // webkit uses IntRect, we use QRectF. we don&apos;t want missing pixels    
&gt; +    QRect rect = r.toRect().adjusted(-1, -1, 1, 1);
&gt; +    
&gt; +    if (currentContent.contentType != HTMLContentType &amp;&amp; !state.contentsRect.isEmpty())
&gt; +        rect = rect.intersected(state.contentsRect);
&gt; +
&gt; +    if (currentContent.backgroundColorValid)
&gt; +        painter-&gt;fillRect(r, QColor(currentContent.backgroundColor));
&gt; +
&gt; +    if (!rect.isEmpty()) {
&gt; +        switch (currentContent.contentType) {
&gt; +        case PixmapContentType:
&gt; +            // we have to scale the image to the contentsRect
&gt; +            // maybe there&apos;s a better way to this, but this works for now
&gt; +            painter-&gt;drawPixmap(rect.topLeft(),
&gt; +                                currentContent.pixmap.scaled(state.contentsRect.size()), r);
&gt; +            break;
&gt; +        case ColorContentType:
&gt; +            painter-&gt;fillRect(rect, currentContent.contentsBackgroundColor);
&gt; +            break;
&gt; +        default:
&gt; +            if (state.drawsContent) {
&gt; +                // this is the &quot;expensive&quot; bit. we try to minimize calls to this
&gt; +                // neck of the woods by proper caching
&gt; +                GraphicsContext gc(painter);
&gt; +                layer-&gt;paintGraphicsLayerContents(gc, rect);
&gt; +            }
&gt; +            break;
&gt; +        }
&gt; +    }
&gt; +}
&gt; +
&gt; +void GraphicsLayerQtPrivate::noteChange(PossibleChange pc)
&gt; +{
&gt; +    if (!this)
&gt; +        return;
&gt; +
&gt; +    possibleChanges = static_cast&lt;PossibleChange&gt;(static_cast&lt;int&gt;(possibleChanges) | static_cast&lt;int&gt;(pc));
&gt; +
&gt; +    if (layer-&gt;client())
&gt; +        layer-&gt;client()-&gt;notifySyncRequired(layer);
&gt; +}
&gt; +
&gt; +void GraphicsLayerQtPrivate::flushChanges(bool recursive)
&gt; +{
&gt; +    // this is the bulk of the work. understanding what the compositor is trying to achieve,
&gt; +    // what graphics-view can do, and trying to find a sane common-grounds
&gt; +    if (layer) {
&gt; +        if (possibleChanges != NoChanges) {
&gt; +
&gt; +            if (currentContent.contentType == HTMLContentType &amp;&amp; (possibleChanges &amp; ParentChange)) {
&gt; +                // the WebCore compositor manages item ownership. We have to make sure
&gt; +                // graphics-view doesn&apos;t try to snatch that ownership...
&gt; +                if (!layer-&gt;parent() &amp;&amp; !parentItem())
&gt; +                    setParentItem(0);
&gt; +                else if (layer &amp;&amp; layer-&gt;parent() &amp;&amp; layer-&gt;parent()-&gt;nativeLayer() != parentItem())
&gt; +                    setParentItem(layer-&gt;parent()-&gt;nativeLayer());
&gt; +            }
&gt; +
&gt; +            if (possibleChanges &amp; ChildrenChange) {
&gt; +                // we basically do an XOR operation on the list of current children
&gt; +                // and the list of wanted children, and remove/add
&gt; +                QSet&lt;QGraphicsItem*&gt; newChildren;
&gt; +                const Vector&lt;GraphicsLayer*&gt; newChildrenVector = (layer-&gt;children());
&gt; +                newChildren.reserve(newChildrenVector.size());
&gt; +
&gt; +                for (size_t i = 0; i &lt; newChildrenVector.size(); ++i)
&gt; +                    newChildren.insert(newChildrenVector[i]-&gt;platformLayer());
&gt; +
&gt; +                const QSet&lt;QGraphicsItem*&gt; curChildren = childItems().toSet();

currentChildren, or maybe just children

&gt; +                const QSet&lt;QGraphicsItem*&gt; childrenToAdd = newChildren - curChildren;
&gt; +                const QSet&lt;QGraphicsItem*&gt; childrenToRemove = curChildren - newChildren;
&gt; +                for (QSet&lt;QGraphicsItem*&gt;::const_iterator it = childrenToAdd.begin(); it != childrenToAdd.end(); ++it) {
&gt; +                     QGraphicsItem* w = *it;
&gt; +                     if (w)
&gt; +                        w-&gt;setParentItem(this);

Here it would probably be OK to do if (QGraphicsItem* w = *it)

&gt; +                }
&gt; +                for (QSet&lt;QGraphicsItem*&gt;::const_iterator it = childrenToRemove.begin(); it != childrenToRemove.end(); ++it) {
&gt; +                    QGraphicsItem* w = *it;
&gt; +                    if (w)
&gt; +                        w-&gt;setParentItem(0);
&gt; +                }
&gt; +
&gt; +                // children are ordered by z-value, let graphics-view know.
&gt; +                for (size_t i = 0; i &lt; newChildrenVector.size(); ++i)
&gt; +                    if (newChildrenVector[i]-&gt;platformLayer())
&gt; +                        newChildrenVector[i]-&gt;platformLayer()-&gt;setZValue(i);
&gt; +            }
&gt; +
&gt; +            if (possibleChanges &amp; MaskLayerChange) {
&gt; +                // we can&apos;t paint here, because we don&apos;t know if the mask layer
&gt; +                // itself is ready... we&apos;ll have to wait till this layer tries to paint
&gt; +                setGraphicsEffect(0);
&gt; +                if (layer-&gt;maskLayer())
&gt; +                    setFlag(ItemClipsChildrenToShape, true);
&gt; +                else
&gt; +                    setFlag(ItemClipsChildrenToShape, layer-&gt;masksToBounds());
&gt; +                update();
&gt; +            }
&gt; +
&gt; +            if (possibleChanges &amp; PositionChange) {   

Maybe instead of possibleChanges use ChangeMask or so? to make it obvious that it is a mask??

             
&gt; +                if (layer-&gt;position() != state.pos) {
&gt; +                    setPos(layer-&gt;position().x(),
&gt; +                           layer-&gt;position().y());

Why wrap here?

&gt; +                }
&gt; +            }
&gt; +
&gt; +            if (possibleChanges &amp; SizeChange) {
&gt; +                if (layer-&gt;size() != state.size) {
&gt; +                    prepareGeometryChange();
&gt; +                    size = QSizeF(layer-&gt;size().width(), layer-&gt;size().height());
&gt; +                }
&gt; +            }
&gt; +
&gt; +            if (possibleChanges &amp; (TransformChange | AnchorPointChange | SizeChange)) {
&gt; +                // since we convert a percentage-based origin-point to a pixel-based one,
&gt; +                // the anchor-point, transform and size from WebCore all affect the one
&gt; +                // that we give Qt
&gt; +                if (state.transform != layer-&gt;transform() || state.anchorPoint != layer-&gt;anchorPoint() || state.size != layer-&gt;size())
&gt; +                    setBaseTransform(QTransform(layer-&gt;transform()));
&gt; +            }
&gt; +
&gt; +            // not sure how this is used; no LayoutTest actually utilized it
&gt; +            if (possibleChanges &amp; ChildrenTransformChange) {
&gt; +                if (state.childrenTransform != layer-&gt;childrenTransform()) {
&gt; +                    const QTransform tr(layer-&gt;childrenTransform());
&gt; +                    QList&lt;QGraphicsItem*&gt; ch = childItems();
&gt; +                    for (QList&lt;QGraphicsItem*&gt;::iterator it = ch.begin(); it != ch.end(); ++it)
&gt; +                        (*it)-&gt;setTransform(tr);
&gt; +                }
&gt; +            }
&gt; +
&gt; +            if (possibleChanges &amp; (ContentChange | DrawsContentChange)) {
&gt; +

not needed new line
&gt; +                switch (pendingContent.contentType) {
&gt; +                case PixmapContentType:
&gt; +                    // we need cache even for images, because they need to be resized
&gt; +                    // to the contents rect. maybe this can be optimized though
&gt; +                    setCacheMode(transformAnimationRunning ? ItemCoordinateCache : DeviceCoordinateCache);
&gt; +                    update();
&gt; +                    setFlag(ItemHasNoContents, false);
&gt; +                    break;
&gt; +
&gt; +                case ColorContentType:
&gt; +                    // no point in caching a solid-color rectangle
&gt; +                    setCacheMode(QGraphicsItem::NoCache);
&gt; +                    if (pendingContent.contentType != currentContent.contentType
&gt; +                        || pendingContent.contentsBackgroundColor != currentContent.contentsBackgroundColor) {
&gt; +                            update();
&gt; +                    }
&gt; +                    state.drawsContent = false;
&gt; +                    setFlag(ItemHasNoContents, false);
&gt; +                    break;
&gt; +
&gt; +                case HTMLContentType:
&gt; +                    if (pendingContent.contentType != currentContent.contentType)
&gt; +                        update();
&gt; +                    if (state.drawsContent != layer-&gt;drawsContent()) {
&gt; +                        if (!state.drawsContent &amp;&amp; layer-&gt;drawsContent())
&gt; +                            update();
&gt; +                    }
&gt; +                    if (layer-&gt;drawsContent())
&gt; +                        setCacheMode(transformAnimationRunning ? ItemCoordinateCache : DeviceCoordinateCache);
&gt; +                    else
&gt; +                        setCacheMode(NoCache);
&gt; +
&gt; +                    setFlag(ItemHasNoContents, !layer-&gt;drawsContent());
&gt; +                    break;
&gt; +                }
&gt; +            }
&gt; +
&gt; +            if ((possibleChanges &amp; OpacityChange) &amp;&amp; state.opacity != layer-&gt;opacity())
&gt; +                    setOpacity(layer-&gt;opacity());
&gt; +
&gt; +            if (possibleChanges &amp; ContentsRectChange) {
&gt; +                const QRect r(layer-&gt;contentsRect());
&gt; +                if (state.contentsRect != r) {
&gt; +                    state.contentsRect = r;
&gt; +                    update();
&gt; +                }
&gt; +            }
&gt; +
&gt; +            if ((possibleChanges &amp; MasksToBoundsChange)
&gt; +                &amp;&amp; state.masksToBounds != layer-&gt;masksToBounds()) {
&gt; +
&gt; +                setFlag(QGraphicsItem::ItemClipsToShape, layer-&gt;masksToBounds());
&gt; +                setFlag(QGraphicsItem::ItemClipsChildrenToShape, layer-&gt;masksToBounds());
&gt; +            }
&gt; +
&gt; +            if ((possibleChanges &amp; ContentsOpaqueChange)
&gt; +                &amp;&amp; state.contentsOpaque != layer-&gt;contentsOpaque())
&gt; +                    prepareGeometryChange();
&gt; +
&gt; +            if (possibleChanges &amp; DisplayChange) {
&gt; +                if (pendingContent.updateAll)
&gt; +                    update();
&gt; +                else
&gt; +                    update(pendingContent.regionToUpdate.boundingRect());
&gt; +            }
&gt; +
&gt; +            if (possibleChanges &amp; BackgroundColorChange) {
&gt; +                if ((pendingContent.backgroundColorValid != currentContent.backgroundColorValid)
&gt; +                    || (pendingContent.backgroundColorValid &amp;&amp; (pendingContent.backgroundColor != currentContent.backgroundColor))) {
&gt; +                    update();
&gt; +
&gt; +                }
&gt; +            }
&gt; +
&gt; +            /*
&gt; +              TODO:
&gt; +              GeometryOrientationChange
&gt; +              ContentsOrientationChange
&gt; +              BackfaceVisibilityChange
&gt; +            */
&gt; +
&gt; +            state.maskLayer = layer-&gt;maskLayer();
&gt; +            state.pos = layer-&gt;position();
&gt; +            state.anchorPoint = layer-&gt;anchorPoint();
&gt; +            state.size = layer-&gt;size();
&gt; +            state.transform = layer-&gt;transform();
&gt; +            state.geoOrientation = layer-&gt;geometryOrientation();
&gt; +            state.contentsOrientation = layer-&gt;contentsOrientation();
&gt; +            state.opacity = layer-&gt;opacity();
&gt; +            state.contentsRect = layer-&gt;contentsRect();
&gt; +            state.preserves3D = layer-&gt;preserves3D();
&gt; +            state.masksToBounds = layer-&gt;masksToBounds();
&gt; +            state.drawsContent = layer-&gt;drawsContent();
&gt; +            state.contentsOpaque = layer-&gt;contentsOpaque();
&gt; +            state.backfaceVisibility = layer-&gt;backfaceVisibility();
&gt; +            currentContent.pixmap = pendingContent.pixmap;
&gt; +            currentContent.contentType = pendingContent.contentType;
&gt; +            currentContent.backgroundColor = pendingContent.backgroundColor;
&gt; +            currentContent.backgroundColorValid = pendingContent.backgroundColorValid;
&gt; +            currentContent.regionToUpdate |= pendingContent.regionToUpdate;
&gt; +            currentContent.updateAll |= pendingContent.updateAll;
&gt; +            currentContent.contentsBackgroundColor = pendingContent.contentsBackgroundColor;
&gt; +            pendingContent.regionToUpdate = QRegion();
&gt; +            pendingContent.updateAll = false;
&gt; +            possibleChanges = NoChanges;
&gt; +        }
&gt; +    }
&gt; +
&gt; +    if (recursive) {
&gt; +        QList&lt;QGraphicsItem*&gt; ch = childItems();
&gt; +        foreach (QGraphicsItem* item, ch) {
&gt; +            GraphicsLayerQtPrivate* wdg = qobject_cast&lt;GraphicsLayerQtPrivate*&gt;(item-&gt;toGraphicsObject());
&gt; +            if (wdg)
&gt; +                wdg-&gt;flushChanges(true);
&gt; +        }
&gt; +    }
&gt; +}
&gt; +
&gt; +void GraphicsLayerQtPrivate::notifyAnimationStarted()
&gt; +{
&gt; +    // WebCore notifies javascript when the animation starts
&gt; +    // here we&apos;re letting it know
&gt; +    client-&gt;notifyAnimationStarted(layer, WTF::currentTime());
&gt; +}
&gt; +
&gt; +
&gt; +GraphicsLayerQt::GraphicsLayerQt(GraphicsLayerClient* client)
&gt; +        :GraphicsLayer(client)

space missing after :

&gt; +        , qtLayer(new GraphicsLayerQtPrivate(this, client))

What is a qtLayer? find a better name

&gt; +{
&gt; +}
&gt; +
&gt; +GraphicsLayerQt::~GraphicsLayerQt()
&gt; +{
&gt; +    delete qtLayer;
&gt; +}
&gt; +
&gt; +
&gt; +PassOwnPtr&lt;GraphicsLayer&gt; GraphicsLayer::create(GraphicsLayerClient* client)
&gt; +{
&gt; +    return new GraphicsLayerQt(client);
&gt; +}
&gt; +
&gt; +GraphicsLayer::CompositingCoordinatesOrientation GraphicsLayer::compositingCoordinatesOrientation()
&gt; +{
&gt; +    return CompositingCoordinatesTopDown;
&gt; +}
&gt; +
&gt; +void GraphicsLayerQt::setNeedsDisplay()

setNeedsToBeDisplayed? or does it really need a display? Maybe the naming can be improved

&gt; +{
&gt; +    qtLayer-&gt;pendingContent.updateAll = true;
&gt; +    qtLayer-&gt;noteChange(GraphicsLayerQtPrivate::DisplayChange);
&gt; +}
&gt; +void GraphicsLayerQt::setNeedsDisplayInRect(const FloatRect&amp; r)
&gt; +{
&gt; +    qtLayer-&gt;pendingContent.regionToUpdate|= QRectF(r).toRect().adjusted(-1, -1, 1, 1);
&gt; +    qtLayer-&gt;noteChange(GraphicsLayerQtPrivate::DisplayChange);
&gt; +}
&gt; +
&gt; +void GraphicsLayerQt::setName(const String&amp; name)
&gt; +{
&gt; +    qtLayer-&gt;setObjectName(QString(name));
&gt; +    GraphicsLayer::setName(name);
&gt; +}
&gt; +bool GraphicsLayerQt::setChildren(const Vector&lt;GraphicsLayer*&gt;&amp; children)
&gt; +{
&gt; +    qtLayer-&gt;noteChange(GraphicsLayerQtPrivate::ChildrenChange);
&gt; +    return GraphicsLayer::setChildren(children);
&gt; +}
&gt; +
&gt; +void GraphicsLayerQt::addChild(GraphicsLayer* layer)
&gt; +{
&gt; +    qtLayer-&gt;noteChange(GraphicsLayerQtPrivate::ChildrenChange);
&gt; +    GraphicsLayer::addChild(layer);
&gt; +}
&gt; +void GraphicsLayerQt::addChildAtIndex(GraphicsLayer* layer, int index)
&gt; +{
&gt; +    GraphicsLayer::addChildAtIndex(layer, index);
&gt; +    qtLayer-&gt;noteChange(GraphicsLayerQtPrivate::ChildrenChange);
&gt; +}
&gt; +void GraphicsLayerQt::addChildAbove(GraphicsLayer* layer, GraphicsLayer* sibling)
&gt; +{
&gt; +     GraphicsLayer::addChildAbove(layer, sibling);
&gt; +     qtLayer-&gt;noteChange(GraphicsLayerQtPrivate::ChildrenChange);
&gt; +}
&gt; +void GraphicsLayerQt::addChildBelow(GraphicsLayer* layer, GraphicsLayer* sibling)
&gt; +{
&gt; +
&gt; +    GraphicsLayer::addChildBelow(layer, sibling);
&gt; +    qtLayer-&gt;noteChange(GraphicsLayerQtPrivate::ChildrenChange);
&gt; +}
&gt; +bool GraphicsLayerQt::replaceChild(GraphicsLayer* oldChild, GraphicsLayer* newChild)
&gt; +{
&gt; +    if (GraphicsLayer::replaceChild(oldChild, newChild)) {
&gt; +       qtLayer-&gt;noteChange(GraphicsLayerQtPrivate::ChildrenChange);
&gt; +       return true;
&gt; +    } else
&gt; +        return false;

indentation problems here

&gt; +}
&gt; +void GraphicsLayerQt::removeFromParent()
&gt; +{
&gt; +    if (parent())
&gt; +        qtLayer-&gt;noteChange(GraphicsLayerQtPrivate::ParentChange);
&gt; +    GraphicsLayer::removeFromParent();
&gt; +}
&gt; +void GraphicsLayerQt::setMaskLayer(GraphicsLayer* layer)
&gt; +{
&gt; +    GraphicsLayer::setMaskLayer(layer);
&gt; +    qtLayer-&gt;noteChange(GraphicsLayerQtPrivate::MaskLayerChange);
&gt; +}
&gt; +void GraphicsLayerQt::setPosition(const FloatPoint&amp; p)
&gt; +{
&gt; +    if (position() != p)
&gt; +       qtLayer-&gt;noteChange(GraphicsLayerQtPrivate::PositionChange);
&gt; +    GraphicsLayer::setPosition(p);
&gt; +}
&gt; +void GraphicsLayerQt::setAnchorPoint(const FloatPoint3D&amp; p)
&gt; +{
&gt; +    if (anchorPoint() != p)
&gt; +        qtLayer-&gt;noteChange(GraphicsLayerQtPrivate::AnchorPointChange);
&gt; +    GraphicsLayer::setAnchorPoint(p);
&gt; +}
&gt; +void GraphicsLayerQt::setSize(const FloatSize&amp; size)
&gt; +{
&gt; +    if (this-&gt;size() != size)
&gt; +        qtLayer-&gt;noteChange(GraphicsLayerQtPrivate::SizeChange);
&gt; +    GraphicsLayer::setSize(size);
&gt; +}
&gt; +void GraphicsLayerQt::setTransform(const TransformationMatrix&amp; t)
&gt; +{
&gt; +    if (!qtLayer-&gt;transformAnimationRunning &amp;&amp; transform() != t)
&gt; +       qtLayer-&gt;noteChange(GraphicsLayerQtPrivate::TransformChange);
&gt; +    GraphicsLayer::setTransform(t);
&gt; +}
&gt; +void GraphicsLayerQt::setChildrenTransform(const TransformationMatrix&amp; t)
&gt; +{
&gt; +    GraphicsLayer::setChildrenTransform(t);
&gt; +    qtLayer-&gt;noteChange(GraphicsLayerQtPrivate::ChildrenTransformChange);
&gt; +}
&gt; +void GraphicsLayerQt::setPreserves3D(bool b)
&gt; +{
&gt; +    if (b != preserves3D());
&gt; +       qtLayer-&gt;noteChange(GraphicsLayerQtPrivate::Preserves3DChange);
&gt; +    GraphicsLayer::setPreserves3D(b);
&gt; +}
&gt; +void GraphicsLayerQt::setMasksToBounds(bool b)
&gt; +{
&gt; +    GraphicsLayer::setMasksToBounds(b);
&gt; +    qtLayer-&gt;noteChange(GraphicsLayerQtPrivate::MasksToBoundsChange);
&gt; +}
&gt; +void GraphicsLayerQt::setDrawsContent(bool b)
&gt; +{
&gt; +    qtLayer-&gt;noteChange(GraphicsLayerQtPrivate::DrawsContentChange);
&gt; +    GraphicsLayer::setDrawsContent(b);
&gt; +}
&gt; +void GraphicsLayerQt::setBackgroundColor(const Color&amp; c)
&gt; +{
&gt; +    qtLayer-&gt;noteChange(GraphicsLayerQtPrivate::BackgroundColorChange);
&gt; +    qtLayer-&gt;pendingContent.backgroundColor = c;
&gt; +    qtLayer-&gt;pendingContent.backgroundColorValid = true;
&gt; +    GraphicsLayer::setBackgroundColor(c);
&gt; +}
&gt; +void GraphicsLayerQt::clearBackgroundColor()
&gt; +{
&gt; +    qtLayer-&gt;pendingContent.backgroundColorValid = false;
&gt; +    qtLayer-&gt;noteChange(GraphicsLayerQtPrivate::BackgroundColorChange);
&gt; +    GraphicsLayer::clearBackgroundColor();
&gt; +}
&gt; +void GraphicsLayerQt::setContentsOpaque(bool b)
&gt; +{
&gt; +    qtLayer-&gt;noteChange(GraphicsLayerQtPrivate::ContentsOpaqueChange);
&gt; +    GraphicsLayer::setContentsOpaque(b);
&gt; +}
&gt; +void GraphicsLayerQt::setBackfaceVisibility(bool b)
&gt; +{
&gt; +    qtLayer-&gt;noteChange(GraphicsLayerQtPrivate::BackfaceVisibilityChange);
&gt; +    GraphicsLayer::setBackfaceVisibility(b);
&gt; +}
&gt; +

I wonder if adding documentation to some of these functions would be a help

&gt; +void GraphicsLayerQt::setOpacity(float o)
&gt; +{
&gt; +    if (!qtLayer-&gt;opacityAnimationRunning &amp;&amp; opacity() != o)
&gt; +       qtLayer-&gt;noteChange(GraphicsLayerQtPrivate::OpacityChange);
&gt; +    GraphicsLayer::setOpacity(o);
&gt; +}
&gt; +void GraphicsLayerQt::setContentsRect(const IntRect&amp; r)
&gt; +{
&gt; +    qtLayer-&gt;noteChange(GraphicsLayerQtPrivate::ContentsRectChange);
&gt; +    GraphicsLayer::setContentsRect(r);
&gt; +}
&gt; +
&gt; +void GraphicsLayerQt::setContentsToImage(Image* image)
&gt; +{
&gt; +    qtLayer-&gt;noteChange(GraphicsLayerQtPrivate::ContentChange);

informChange ???? or notifyChange

&gt; +    qtLayer-&gt;pendingContent.contentType = GraphicsLayerQtPrivate::HTMLContentType;
&gt; +    GraphicsLayer::setContentsToImage(image);
&gt; +    if (image) {
&gt; +        QPixmap* pxm = image-&gt;nativeImageForCurrentFrame();
&gt; +        if (pxm) {
&gt; +            qtLayer-&gt;pendingContent.pixmap = *pxm;
&gt; +            qtLayer-&gt;pendingContent.contentType = GraphicsLayerQtPrivate::PixmapContentType;
&gt; +            return;
&gt; +        }        
&gt; +    }
&gt; +    qtLayer-&gt;pendingContent.pixmap = QPixmap();
&gt; +}
&gt; +
&gt; +void GraphicsLayerQt::setContentsBackgroundColor(const Color&amp; color)
&gt; +{
&gt; +    qtLayer-&gt;noteChange(GraphicsLayerQtPrivate::ContentChange);
&gt; +    qtLayer-&gt;pendingContent.contentType = GraphicsLayerQtPrivate::ColorContentType;
&gt; +    qtLayer-&gt;pendingContent.contentsBackgroundColor = QColor(color);
&gt; +    GraphicsLayer::setContentsBackgroundColor(color);
&gt; +}
&gt; +
&gt; +void GraphicsLayerQt::setGeometryOrientation(CompositingCoordinatesOrientation orientation)
&gt; +{
&gt; +    qtLayer-&gt;noteChange(GraphicsLayerQtPrivate::GeometryOrientationChange);
&gt; +    GraphicsLayer::setGeometryOrientation(orientation);
&gt; +}
&gt; +
&gt; +void GraphicsLayerQt::setContentsOrientation(CompositingCoordinatesOrientation orientation)
&gt; +{
&gt; +    qtLayer-&gt;noteChange(GraphicsLayerQtPrivate::ContentsOrientationChange);
&gt; +    GraphicsLayer::setContentsOrientation(orientation);
&gt; +}
&gt; +
&gt; +void GraphicsLayerQt::distributeOpacity(float o)
&gt; +{
&gt; +    qtLayer-&gt;noteChange(GraphicsLayerQtPrivate::OpacityChange);
&gt; +    qtLayer-&gt;state.distributeOpacity = true;
&gt; +}
&gt; +
&gt; +float GraphicsLayerQt::accumulatedOpacity() const
&gt; +{
&gt; +    return qtLayer-&gt;effectiveOpacity();
&gt; +}
&gt; +
&gt; +void GraphicsLayerQt::syncCompositingState()
&gt; +{
&gt; +    qtLayer-&gt;flushChanges();
&gt; +    GraphicsLayer::syncCompositingState();
&gt; +}
&gt; +
&gt; +NativeLayer GraphicsLayerQt::nativeLayer() const
&gt; +{
&gt; +    return qtLayer;
&gt; +}
&gt; +
&gt; +PlatformLayer* GraphicsLayerQt::platformLayer() const
&gt; +{
&gt; +    return qtLayer;
&gt; +}
&gt; +
&gt; +// now we start dealing with WebCore animations translated to Qt animations
&gt; +
&gt; +template &lt;typename T&gt;
&gt; +struct KeyframeValueQt {
&gt; +    TimingFunction timingFunction;
&gt; +    T value;
&gt; +};
&gt; +
&gt; +// we copy this from the WebCore animation code

from which file... would be nice to add in the comment

&gt; +static inline double solveEpsilon(double duration)
&gt; +{
&gt; +    return 1.0 / (200.0 * duration);
&gt; +}
&gt; +
&gt; +static inline double solveCubicBezierFunction(qreal p1x, qreal p1y, qreal p2x, qreal p2y, double t, double duration)
&gt; +{
&gt; +    UnitBezier bezier(p1x, p1y, p2x, p2y);
&gt; +    return bezier.solve(t, solveEpsilon(duration));
&gt; +}
&gt; +
&gt; +// we want the timing function to be as close as possible to what the web-developer
&gt; +// intended, so we&apos;re using the same function used by WebCore when compositing is disabled
&gt; +static inline qreal applyTimingFunction(const TimingFunction&amp; timingFunction, qreal progress, int duration)
&gt; +{
&gt; +        if (timingFunction.type() == LinearTimingFunction)
&gt; +            return progress;
&gt; +        if (timingFunction.type() == CubicBezierTimingFunction) {
&gt; +            return solveCubicBezierFunction(timingFunction.x1(),
&gt; +                                            timingFunction.y1(),
&gt; +                                            timingFunction.x2(),
&gt; +                                            timingFunction.y2(),
&gt; +                                            double(progress), double(duration) / 1000);
&gt; +        }
&gt; +        return progress;
&gt; +}

So with compositing you never get the same timing function as you use the Qt animation framework??? What if I use keyframes?

&gt; +
&gt; +// helper functions to safely get a value out of WebCore&apos;s AnimationValue*
&gt; +static void webkitAnimationToQtAnimationValue(const AnimationValue* animationValue, TransformOperations&amp; transformOperations)
&gt; +{
&gt; +        if (animationValue) {
&gt; +            const TransformOperations* ops = static_cast&lt;const TransformAnimationValue*&gt;(animationValue)-&gt;value();
&gt; +            transformOperations = ops?*ops:TransformOperations();

spacing missing

&gt; +        } else
&gt; +            transformOperations = TransformOperations();
&gt; +
&gt; +}
&gt; +
&gt; +static void webkitAnimationToQtAnimationValue(const AnimationValue* animationValue, qreal&amp; realValue)
&gt; +{
&gt; +        if (animationValue)
&gt; +            realValue = static_cast&lt;const FloatAnimationValue*&gt;(animationValue)-&gt;value();
&gt; +        else
&gt; +            realValue = 0;
&gt; +}
&gt; +
&gt; +// we put a bit of the functionality in a base class to allow casting and to save some code size
&gt; +class AnimationQtBase : public QAbstractAnimation {
&gt; +public:
&gt; +    AnimationQtBase(GraphicsLayerQtPrivate* aLayer
&gt; +                    , const KeyframeValueList&amp; values
&gt; +                    , const IntSize&amp; aBoxSize
&gt; +                    , const Animation* anim
&gt; +                    , const QString &amp; kfName
&gt; +                    )

We don&apos;t wrap function arguments

&gt; +            : QAbstractAnimation(0)
&gt; +            , target(aLayer)
&gt; +            , boxSize(aBoxSize)
&gt; +            , mDuration(anim-&gt;duration() * 1000)
&gt; +            , isAlternate(anim-&gt;direction() == Animation::AnimationDirectionAlternate)
&gt; +            , webkitPropertyID(values.property())
&gt; +            , keyframesName(kfName)
&gt; +    {
&gt; +    }
&gt; +
&gt; +    virtual void updateState(QAbstractAnimation::State newState, QAbstractAnimation::State oldState)
&gt; +    {
&gt; +        QAbstractAnimation::updateState(newState, oldState);
&gt; +
&gt; +        if (newState == Running &amp;&amp; oldState == Stopped)
&gt; +        // for some reason I have do this asynchronously - or the animation won&apos;t work
&gt; +            QTimer::singleShot(0, target.data(), SLOT(notifyAnimationStarted()));

When adding comments inside an if, you need to add {} according to the style guide

&gt; +    }
&gt; +
&gt; +    virtual int duration() const { return mDuration; }

m_duration!

&gt; +
&gt; +    QWeakPointer&lt;GraphicsLayerQtPrivate&gt; target;
&gt; +    IntSize boxSize;
&gt; +    int mDuration;

again

&gt; +    bool isAlternate;
&gt; +    AnimatedPropertyID webkitPropertyID;

webCorePropertyID ?

&gt; +    QString keyframesName;
&gt; +};
&gt; +
&gt; +// we&apos;d rather have a templatized QAbstractAnimation than QPropertyAnimation / QVariantAnimation;
&gt; +// Since we know the types that we&apos;re dealing with, the QObject/QProperty/QVariant abstraction
&gt; +// buys us very little in this case, for too much overhead
&gt; +template &lt;typename T&gt;
&gt; +class AnimationQt : public AnimationQtBase {
&gt; +
&gt; +public:
&gt; +    AnimationQt(GraphicsLayerQtPrivate* aLayer
&gt; +                , const KeyframeValueList&amp; values
&gt; +                , const IntSize&amp; aBoxSize
&gt; +                , const Animation* anim
&gt; +                , const QString &amp; name)

again!

&gt; +            :AnimationQtBase(aLayer, values, aBoxSize, anim, name)

Space missing before :

&gt; +    {
&gt; +        // copying those WebCore structures is not trivial, we have to do it like this
&gt; +        for (size_t i = 0; i &lt; values.size(); ++i) {
&gt; +            const AnimationValue* animVal = values.at(i);
&gt; +            KeyframeValueQt&lt;T&gt; kfv;
&gt; +            if (animVal-&gt;timingFunction())
&gt; +                kfv.timingFunction = *animVal-&gt;timingFunction();

kfv? bad name

&gt; +            webkitAnimationToQtAnimationValue(animVal, kfv.value);
&gt; +            keyframeValues[animVal-&gt;keyTime()] = kfv;
&gt; +        }
&gt; +    }
&gt; +
&gt; +protected:
&gt; +
&gt; +    // this is the part that differs between animated properties
&gt; +    virtual void applyFrame(const T&amp; fromValue, const T&amp; toValue, qreal progress) = 0;
&gt; +
&gt; +    virtual void updateCurrentTime(int currentTime)
&gt; +    {
&gt; +        if (!target)
&gt; +            return;
&gt; +
&gt; +        qreal progress = qreal(currentLoopTime()) / duration();
&gt; +
&gt; +        if (isAlternate &amp;&amp; currentLoop()%2)
&gt; +            progress = 1-progress;
&gt; +
&gt; +        if (keyframeValues.isEmpty())
&gt; +            return;
&gt; +
&gt; +        // we find the current from-to keyframes in our little map
&gt; +        typename QMap&lt;qreal, KeyframeValueQt&lt;T&gt; &gt;::iterator it = keyframeValues.find(progress);
&gt; +        if (it == keyframeValues.end())
&gt; +            it = keyframeValues.lowerBound(progress)-1;
&gt; +        if (it == keyframeValues.end())
&gt; +            it = keyframeValues.begin();
&gt; +
&gt; +        typename QMap&lt;qreal, KeyframeValueQt&lt;T&gt; &gt;::iterator it2 = it+1;
&gt; +        if (it2 == keyframeValues.end())
&gt; +            it2 = keyframeValues.begin();

if end, begin? maybe add a comment

&gt; +        const KeyframeValueQt&lt;T&gt;&amp; fromKeyframe = it.value();
&gt; +        const KeyframeValueQt&lt;T&gt;&amp; toKeyframe = it2.value();
&gt; +
&gt; +        const TimingFunction&amp; timingFunc = fromKeyframe.timingFunction;
&gt; +        const T&amp; fromValue = fromKeyframe.value;
&gt; +        const T&amp; toValue = toKeyframe.value;
&gt; +
&gt; +        // now we have a source keyframe, origin keyframe and a timing function
&gt; +        // we can now process the progress and apply the frame
&gt; +        qreal normalizedProgress = (it.key() == it2.key()) ? 0 : (progress - it.key()) / (it2.key() - it.key());
&gt; +        normalizedProgress = applyTimingFunction(timingFunc, normalizedProgress, duration() / 1000);
&gt; +        applyFrame(fromValue, toValue, normalizedProgress);
&gt; +    }
&gt; +
&gt; +    QMap&lt;qreal, KeyframeValueQt&lt;T&gt; &gt; keyframeValues;
&gt; +};
&gt; +
&gt; +class TransformAnimationQt : public AnimationQt&lt;TransformOperations&gt; {
&gt; +public:
&gt; +    TransformAnimationQt(GraphicsLayerQtPrivate* aLayer,
&gt; +                                     const KeyframeValueList&amp; values, const IntSize&amp; boxSize, const Animation* anim, const QString &amp; name)

put on one line.

&gt; +                :AnimationQt&lt;TransformOperations&gt;(aLayer, values, boxSize, anim, name)

Space missing

&gt; +    {
&gt; +    }
&gt; +
&gt; +    ~TransformAnimationQt()
&gt; +    {
&gt; +        // this came up during the compositing/animation LayoutTests
&gt; +        // when the animation dies, the transform has to go back to default
&gt; +        target.data()-&gt;setBaseTransform(QTransform(target.data()-&gt;layer-&gt;transform()));
&gt; +    }
&gt; +
&gt; +    // the idea is that we let WebCore manage the transform-operations
&gt; +    // and Qt just manages the animation heartbeat and the bottom-line QTransform
&gt; +    // we get the performance not by using QTransform instead of TransformationMatrix, but by proper caching of
&gt; +    // items that are expensive for WebCore to render. We want the rest to be as close to WebCore&apos;s idea as possible.
&gt; +    virtual void applyFrame(const TransformOperations&amp; fromOps, const TransformOperations&amp; toOps, qreal progress)

maybe source, target instead of fromOps, toOps

&gt; +    {
&gt; +        TransformationMatrix tf;
&gt; +
&gt; +        // this looks simple but is really tricky to get right. Use caution.
&gt; +        for (size_t i = 0; i &lt; toOps.size(); ++i)
&gt; +            toOps.operations()[i]-&gt;blend(fromOps.at(i), progress)-&gt;apply(tf, boxSize);
&gt; +
&gt; +        target.data()-&gt;setBaseTransform(QTransform(tf));

tf? bad name

&gt; +    }
&gt; +
&gt; +    virtual void updateState(QAbstractAnimation::State newState, QAbstractAnimation::State oldState)
&gt; +    {
&gt; +        AnimationQtBase::updateState(newState, oldState);
&gt; +        if (!target)
&gt; +            return;
&gt; +        target.data()-&gt;flushChanges(true);
&gt; +
&gt; +        // to increase FPS, we use a less accurate caching mechanism while animation is going on
&gt; +        // this is a UX choice that should probably be customizable
&gt; +        if (newState == QAbstractAnimation::Running) {
&gt; +            target.data()-&gt;transformAnimationRunning = true;
&gt; +            if (target.data()-&gt;cacheMode() == QGraphicsItem::DeviceCoordinateCache)
&gt; +                target.data()-&gt;setCacheMode(QGraphicsItem::ItemCoordinateCache);
&gt; +        } else {
&gt; +            target.data()-&gt;transformAnimationRunning = false;
&gt; +            if (target.data()-&gt;cacheMode() == QGraphicsItem::ItemCoordinateCache)
&gt; +                target.data()-&gt;setCacheMode(QGraphicsItem::DeviceCoordinateCache);
&gt; +        }
&gt; +    }
&gt; +};
&gt; +
&gt; +class OpacityAnimationQt : public AnimationQt&lt;qreal&gt; {
&gt; +public:
&gt; +    OpacityAnimationQt(GraphicsLayerQtPrivate* aLayer,
&gt; +                                     const KeyframeValueList&amp; values, const IntSize&amp; boxSize, const Animation* anim, const QString &amp; name)

One line

&gt; +                :AnimationQt&lt;qreal&gt;(aLayer, values, boxSize, anim, name)
&gt; +    {
&gt; +    }
&gt; +
&gt; +    virtual void applyFrame(const qreal&amp; fromValue, const qreal&amp; toValue, qreal progress)
&gt; +    {
&gt; +        target.data()-&gt;setOpacity(qMin&lt;qreal&gt;(qMax&lt;qreal&gt;(fromValue + (toValue-fromValue)*progress, 0), 1));
&gt; +    }
&gt; +
&gt; +    virtual void updateState(QAbstractAnimation::State newState, QAbstractAnimation::State oldState)
&gt; +    {
&gt; +        QAbstractAnimation::updateState(newState, oldState);
&gt; +
&gt; +        if (!target)
&gt; +            return;
&gt; +
&gt; +        if (newState == QAbstractAnimation::Running)
&gt; +            target.data()-&gt;opacityAnimationRunning = true;
&gt; +        else
&gt; +            target.data()-&gt;opacityAnimationRunning = false;
&gt; +    }
&gt; +};
&gt; +
&gt; +bool GraphicsLayerQt::addAnimation(const KeyframeValueList&amp; values, const IntSize&amp; boxSize, const Animation* anim, const String&amp; keyframesName, double timeOffset)
&gt; +{
&gt; +    if (!anim-&gt;duration() || !anim-&gt;iterationCount())
&gt; +        return false;
&gt; +
&gt; +    QAbstractAnimation* newAnim;
&gt; +
&gt; +    switch (values.property()) {
&gt; +    case AnimatedPropertyOpacity:
&gt; +        newAnim = new OpacityAnimationQt(qtLayer, values, boxSize, anim, keyframesName);
&gt; +        break;
&gt; +    case AnimatedPropertyWebkitTransform:
&gt; +        newAnim = new TransformAnimationQt(qtLayer, values, boxSize, anim, keyframesName);
&gt; +        break;
&gt; +    default:
&gt; +        return false;
&gt; +    }
&gt; +
&gt; +    // we make sure WebCore::Animation and QAnimation are on the same terms
&gt; +    newAnim-&gt;setLoopCount(anim-&gt;iterationCount());
&gt; +    qtLayer-&gt;animations.append(QWeakPointer&lt;QAbstractAnimation&gt;(newAnim));
&gt; +    QObject::connect(&amp;qtLayer-&gt;suspendTimer, SIGNAL(timeout()), newAnim, SLOT(resume()));
&gt; +    timeOffset += anim-&gt;delay();
&gt; +
&gt; +    // flush now or flicker...
&gt; +    qtLayer-&gt;flushChanges(false);
&gt; +
&gt; +    if (timeOffset)
&gt; +        QTimer::singleShot(timeOffset*1000, newAnim, SLOT(start()));

space *

&gt; +    else
&gt; +        newAnim-&gt;start();
&gt; +
&gt; +    QObject::connect(newAnim, SIGNAL(finished()), newAnim, SLOT(deleteLater()));
&gt; +
&gt; +    return true;
&gt; +}
&gt; +
&gt; +void GraphicsLayerQt::removeAnimationsForProperty(AnimatedPropertyID id)
&gt; +{
&gt; +    for (QList&lt;QWeakPointer&lt;QAbstractAnimation&gt; &gt;::iterator it = qtLayer-&gt;animations.begin();
&gt; +            it != qtLayer-&gt;animations.end(); ++it) {
&gt; +
&gt; +        if (*it) {
&gt; +            AnimationQtBase* anim = static_cast&lt;AnimationQtBase*&gt;(it-&gt;data());
&gt; +            if (anim &amp;&amp; anim-&gt;webkitPropertyID == id) {
&gt; +                delete anim;
&gt; +                it = qtLayer-&gt;animations.erase(it);
&gt; +                --it;
&gt; +            }
&gt; +        }
&gt; +    }
&gt; +}
&gt; +
&gt; +void GraphicsLayerQt::removeAnimationsForKeyframes(const String&amp; kfName)
&gt; +{
&gt; +    for (QList&lt;QWeakPointer&lt;QAbstractAnimation&gt; &gt;::iterator it = qtLayer-&gt;animations.begin(); it != qtLayer-&gt;animations.end(); ++it) {
&gt; +        if (*it) {
&gt; +            AnimationQtBase* anim = static_cast&lt;AnimationQtBase*&gt;((*it).data());
&gt; +            if (anim &amp;&amp; anim-&gt;keyframesName == QString(kfName)) {
&gt; +                (*it).data()-&gt;deleteLater();
&gt; +                it = qtLayer-&gt;animations.erase(it);
&gt; +                --it;
&gt; +            }
&gt; +        }
&gt; +    }
&gt; +}
&gt; +
&gt; +void GraphicsLayerQt::pauseAnimation(const String&amp; kfName, double timeOfs)
&gt; +{
&gt; +    for (QList&lt;QWeakPointer&lt;QAbstractAnimation&gt; &gt;::iterator it = qtLayer-&gt;animations.begin(); it != qtLayer-&gt;animations.end(); ++it) {
&gt; +        if (*it) {
&gt; +            AnimationQtBase* anim = static_cast&lt;AnimationQtBase*&gt;((*it).data());
&gt; +            if (anim &amp;&amp; anim-&gt;keyframesName == QString(kfName))

kfName ..

&gt; +                QTimer::singleShot(timeOfs*1000, anim, SLOT(pause()));
&gt; +        }
&gt; +    }
&gt; +}
&gt; +
&gt; +void GraphicsLayerQt::suspendAnimations(double time)
&gt; +{
&gt; +    if (qtLayer-&gt;suspendTimer.isActive()) {
&gt; +        qtLayer-&gt;suspendTimer.stop();
&gt; +        qtLayer-&gt;suspendTimer.start(time*1000);

space *

&gt; +    } else {
&gt; +        for (QList&lt;QWeakPointer&lt;QAbstractAnimation&gt; &gt;::iterator it = qtLayer-&gt;animations.begin(); it != qtLayer-&gt;animations.end(); ++it) {
&gt; +            QAbstractAnimation* anim = it-&gt;data();
&gt; +            if (anim)
&gt; +                anim-&gt;pause();
&gt; +        }
&gt; +    }
&gt; +}
&gt; +
&gt; +void GraphicsLayerQt::resumeAnimations()
&gt; +{
&gt; +    if (qtLayer-&gt;suspendTimer.isActive()) {
&gt; +        qtLayer-&gt;suspendTimer.stop();
&gt; +        for (QList&lt;QWeakPointer&lt;QAbstractAnimation&gt; &gt;::iterator it = qtLayer-&gt;animations.begin(); it != qtLayer-&gt;animations.end(); ++it) {
&gt; +            QAbstractAnimation* anim = (*it).data();
&gt; +            if (anim)
&gt; +                anim-&gt;resume();
&gt; +        }
&gt; +    }
&gt; +}
&gt; +
&gt; +
&gt; +}
&gt; +
&gt; +#include &lt;GraphicsLayerQt.moc&gt;
&gt; Index: WebCore/platform/graphics/qt/GraphicsLayerQt.h
&gt; ===================================================================
&gt; --- WebCore/platform/graphics/qt/GraphicsLayerQt.h	(revision 0)
&gt; +++ WebCore/platform/graphics/qt/GraphicsLayerQt.h	(revision 0)
&gt; @@ -0,0 +1,83 @@
&gt; +/*
&gt; +    Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies)
&gt; +
&gt; +    This library is free software; you can redistribute it and/or
&gt; +    modify it under the terms of the GNU Library General Public
&gt; +    License as published by the Free Software Foundation; either
&gt; +    version 2 of the License, or (at your option) any later version.
&gt; +
&gt; +    This library is distributed in the hope that it will be useful,
&gt; +    but WITHOUT ANY WARRANTY; without even the implied warranty of
&gt; +    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
&gt; +    Library General Public License for more details.
&gt; +
&gt; +    You should have received a copy of the GNU Library General Public License
&gt; +    along with this library; see the file COPYING.LIB.  If not, write to
&gt; +    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
&gt; +    Boston, MA 02110-1301, USA.
&gt; +*/
&gt; +
&gt; +#ifndef GraphicsLayerQt_h
&gt; +#define GraphicsLayerQt_h
&gt; +
&gt; +#include &quot;GraphicsLayer.h&quot;
&gt; +#include &quot;GraphicsLayerClient.h&quot;
&gt; +
&gt; +namespace WebCore {
&gt; +class GraphicsLayerQtPrivate;
&gt; +class GraphicsLayerQt : public GraphicsLayer {
&gt; +    friend class GraphicsLayerQtPrivate;
&gt; +public:
&gt; +    GraphicsLayerQt(GraphicsLayerClient*);
&gt; +    virtual void setNeedsDisplay();
&gt; +    // mark the given rect (in layer coords) as needing dispay. Never goes deep.
&gt; +    virtual void setNeedsDisplayInRect(const FloatRect&amp;);
&gt; +    virtual NativeLayer nativeLayer() const;
&gt; +    virtual PlatformLayer* platformLayer() const;
&gt; +
&gt; +    virtual ~GraphicsLayerQt();
&gt; +    void setParent(GraphicsLayer* layer);
&gt; +    virtual void setName(const String&amp; name);
&gt; +    virtual bool setChildren(const Vector&lt;GraphicsLayer*&gt;&amp;);
&gt; +    virtual void addChild(GraphicsLayer*);
&gt; +    virtual void addChildAtIndex(GraphicsLayer*, int index);
&gt; +    virtual void addChildAbove(GraphicsLayer* layer, GraphicsLayer* sibling);
&gt; +    virtual void addChildBelow(GraphicsLayer* layer, GraphicsLayer* sibling);
&gt; +    virtual bool replaceChild(GraphicsLayer* oldChild, GraphicsLayer* newChild);
&gt; +    virtual void removeFromParent();
&gt; +    virtual void setMaskLayer(GraphicsLayer* layer);
&gt; +    virtual void setPosition(const FloatPoint&amp; p);
&gt; +    virtual void setAnchorPoint(const FloatPoint3D&amp; p);
&gt; +    virtual void setSize(const FloatSize&amp; size);
&gt; +    virtual void setTransform(const TransformationMatrix&amp; t);
&gt; +    virtual void setChildrenTransform(const TransformationMatrix&amp; t);
&gt; +    virtual void setPreserves3D(bool b);
&gt; +    virtual void setMasksToBounds(bool b);
&gt; +    virtual void setDrawsContent(bool b);
&gt; +    virtual void setBackgroundColor(const Color&amp;);
&gt; +    virtual void clearBackgroundColor();
&gt; +    virtual void setContentsOpaque(bool b);
&gt; +    virtual void setBackfaceVisibility(bool b);
&gt; +    virtual void setOpacity(float opacity);
&gt; +    virtual void setContentsRect(const IntRect&amp; r);
&gt; +    virtual bool addAnimation(const KeyframeValueList&amp;, const IntSize&amp; /*boxSize*/, const Animation*, const String&amp; /*keyframesName*/, double /*timeOffset*/);

why the /* */ ???? just write it out

&gt; +    virtual void removeAnimationsForProperty(AnimatedPropertyID);
&gt; +    virtual void removeAnimationsForKeyframes(const String&amp; /* keyframesName */);
&gt; +    virtual void pauseAnimation(const String&amp; /* keyframesName */, double /*timeOffset*/);
&gt; +    virtual void suspendAnimations(double time);
&gt; +    virtual void resumeAnimations();
&gt; +    virtual void setContentsToImage(Image*);
&gt; +    virtual void setContentsBackgroundColor(const Color&amp;);
&gt; +    virtual void setGeometryOrientation(CompositingCoordinatesOrientation orientation);
&gt; +    virtual void setContentsOrientation(CompositingCoordinatesOrientation orientation);
&gt; +    virtual void distributeOpacity(float);
&gt; +    virtual float accumulatedOpacity() const;
&gt; +    virtual void syncCompositingState();
&gt; +private:
&gt; +    GraphicsLayerQtPrivate* qtLayer;
&gt; +
&gt; +};
&gt; +
&gt; +
&gt; +}
&gt; +#endif // GraphicsLayerQt_h
&gt; Index: WebCore/platform/graphics/GraphicsLayer.h
&gt; ===================================================================
&gt; --- WebCore/platform/graphics/GraphicsLayer.h	(revision 53364)
&gt; +++ WebCore/platform/graphics/GraphicsLayer.h	(working copy)
&gt; @@ -59,6 +59,10 @@
&gt;  typedef WKCACFLayer PlatformLayer;
&gt;  typedef void* NativeLayer;
&gt;  }
&gt; +#elif PLATFORM(QT)
&gt; +class QGraphicsItem;
&gt; +typedef QGraphicsItem PlatformLayer;
&gt; +typedef QGraphicsItem* NativeLayer;
&gt;  #else
&gt;  typedef void* PlatformLayer;
&gt;  typedef void* NativeLayer;
&gt; 
&gt; Index: WebKit.pri
&gt; ===================================================================
&gt; --- WebKit.pri	(revision 53364)
&gt; +++ WebKit.pri	(working copy)
&gt; @@ -45,6 +45,7 @@
&gt;      }
&gt;      DEPENDPATH += $$PWD/WebKit/qt/Api
&gt;  }
&gt; +DEFINES += WTF_USE_ACCELERATED_COMPOSITING
&gt;  
&gt;  !mac:!unix|symbian {
&gt;      DEFINES += USE_SYSTEM_MALLOC</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>181840</commentid>
    <comment_count>9</comment_count>
      <attachid>46808</attachid>
    <who name="Antti Koivisto">koivisto</who>
    <bug_when>2010-01-18 05:44:43 -0800</bug_when>
    <thetext>Comment on attachment 46808
accelerated compositing in Qt: with massive style improvements and in-code comments

Looks great! Some style issues and a few questions inline.


&gt; Index: WebKit/qt/QGVLauncher/main.cpp
&gt; +#if USE(ACCELERATED_COMPOSITING)
&gt; +        rootGraphicsLayer(0),
&gt; +        overlay(new QGraphicsWebViewOverlay(parent)),
&gt; +        shouldSync(true)
&gt; +#endif

Should the overlay be created only if the composition is enabled in settings? Or perhaps it doesn&apos;t hurt even if it is not strictly needed?

&gt;      // If the page had no title, still make sure it gets the signal
&gt; @@ -83,11 +206,18 @@
&gt;  void QGraphicsWebViewPrivate::scroll(int dx, int dy, const QRect&amp; rectToScroll)
&gt;  {
&gt;      q-&gt;scroll(qreal(dx), qreal(dy), QRectF(rectToScroll));
&gt; +#if USE(ACCELERATED_COMPOSITING)
&gt; +    updateCompositingScrollPosition();
&gt; +//    QApplication::instance()-&gt;sendPostedEvents();
&gt; +#endif
&gt;  }

Some commented out code here.

&gt;  }
&gt;  
&gt; +

don&apos;t add the empty line


&gt; Index: WebKit/qt/Api/qgraphicswebview.h
&gt; ===================================================================
&gt; --- WebKit/qt/Api/qgraphicswebview.h	(revision 53364)
&gt; +++ WebKit/qt/Api/qgraphicswebview.h	(working copy)
&gt; @@ -105,7 +105,6 @@
&gt;      void iconChanged();
&gt;      void statusBarMessage(const QString&amp; message);
&gt;      void linkClicked(const QUrl&amp;);
&gt; -
&gt;  protected:

don&apos;t remove the empty line

&gt;      virtual void mousePressEvent(QGraphicsSceneMouseEvent*);
&gt;      virtual void mouseDoubleClickEvent(QGraphicsSceneMouseEvent*);
&gt; @@ -134,7 +133,9 @@
&gt;  
&gt;  private:
&gt;      Q_PRIVATE_SLOT(d, void _q_doLoadFinished(bool success))
&gt; -
&gt; +    // we don&apos;t want to change the moc based on USE() macro, so this function is here
&gt; +    // but will be empty if ACCLERATED_COMPOSITING is disabled
&gt; +    Q_PRIVATE_SLOT(d, void syncLayers())
&gt;      QGraphicsWebViewPrivate* const d;

keep the empty line after private slots


&gt;  #include &lt;QRect&gt;
&gt; -
&gt; +class QGraphicsItem;
&gt;  class QWebPageClient {

don&apos;t remove the empty line

&gt; +
&gt; +namespace WebCore {
&gt; +
&gt; +
&gt; +class GraphicsLayerQtPrivate : public QGraphicsObject {

one empty line only after namespace

&gt; +    Q_OBJECT
&gt; +
&gt; +public:
&gt; +    // this set of flags help us defer which properties of the layer have been
&gt; +    // modified by the compositor, so we can know what to look for in the next flush
&gt; +    enum PossibleChange {
&gt; +        NoChanges       =           0,
&gt; +        ChildrenChange  =           (1L &lt;&lt; 1),
&gt; +        MaskLayerChange =           (1L &lt;&lt; 2),
&gt; +        PositionChange  =           (1L &lt;&lt; 3),
&gt; +        AnchorPointChange =         (1L &lt;&lt; 4),
&gt; +        SizeChange      =           (1L &lt;&lt; 5),
&gt; +        TransformChange =           (1L &lt;&lt; 6),
&gt; +        ContentChange   =           (1L &lt;&lt; 7),
&gt; +        GeometryOrientationChange = (1L &lt;&lt; 8),
&gt; +        ContentsOrientationChange = (1L &lt;&lt; 9),
&gt; +        OpacityChange   =           (1L &lt;&lt; 10),
&gt; +        ContentsRectChange =        (1L &lt;&lt; 11),
&gt; +        Preserves3DChange =         (1L &lt;&lt; 12),
&gt; +        MasksToBoundsChange =       (1L &lt;&lt; 13),
&gt; +        DrawsContentChange =        (1L &lt;&lt; 14),
&gt; +        ContentsOpaqueChange =      (1L &lt;&lt; 15),
&gt; +        BackfaceVisibilityChange =  (1L &lt;&lt; 16),
&gt; +        ChildrenTransformChange =   (1L &lt;&lt; 17),
&gt; +        DisplayChange =             (1L &lt;&lt; 18),
&gt; +        BackgroundColorChange =     (1L &lt;&lt; 19),
&gt; +        ParentChange =              (1L &lt;&lt; 20),
&gt; +        DistributesOpacityChange =  (1L &lt;&lt; 21)
&gt; +    };

What does word &quot;possible&quot; communicate here? Could it be removed?
Maybe call these *ChangeMask? 
Placement of = is inconsistent. 
No need for 1L &lt;&lt; I think, 1 &lt;&lt; should do.

&gt; +
&gt; +    // let the compositor-API tell us which properties were changed
&gt; +    void noteChange(PossibleChange pc);

notifyChanged()? &quot;note&quot; sounds bit strange.

&gt; +
&gt; +    ContentData pendingContent;
&gt; +    ContentData currentContent;
&gt; +
&gt; +    PossibleChange possibleChanges;
&gt; +
&gt; +    QSizeF size;
&gt; +    QList&lt;QWeakPointer&lt;QAbstractAnimation&gt; &gt; animations;
&gt; +    QTimer suspendTimer;

WebKit style is to use m_ prefix for all member variables (pure structs may be an exception).

&gt; +
&gt; +GraphicsLayerQtPrivate::~GraphicsLayerQtPrivate()
&gt; +{
&gt; +    // the compositor manages item lifecycle - we don&apos;t want the graphics-view
&gt; +    // system to automatically delete our items
&gt; +    foreach (QGraphicsItem* i, childItems()) {

I would prefer not to have foreach and similar Qt macros in WebKit code. It may unnecessarily confuse non-Qt developers.

&gt; +
&gt; +void GraphicsLayerQtPrivate::setBaseTransform(const QTransform&amp; t)
&gt; +{
&gt; +    if (layer) {
&gt; +        // webkit has relative-to-size originPoint, graphics-view has a pixel originPoint
&gt; +        // here we convert

Please use early return style:

if (!layer)
   return;
...

&gt; +        QPointF originTranslate(
&gt; +                layer-&gt;anchorPoint().x()*layer-&gt;size().width(), layer-&gt;anchorPoint().y()*layer-&gt;size().height());
&gt; +
&gt; +        resetTransform();
&gt; +
&gt; +        // we have to manage this ourselves because QGraphicsView&apos;s transformOrigin is incomplete
&gt; +        translate(originTranslate.x(), originTranslate.y());
&gt; +        setTransform(t, true);
&gt; +        translate(-originTranslate.x(), -originTranslate.y());
&gt; +        baseTransform = t;
&gt; +    }
&gt; +}
&gt; +
&gt; +QPainterPath GraphicsLayerQtPrivate::opaqueArea() const
&gt; +{
&gt; +    QPainterPath pp;

Please use full words for variable names.

&gt; +
&gt; +void GraphicsLayerQtPrivate::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget)
&gt; +{
&gt; +    if (state.maskLayer &amp;&amp; state.maskLayer-&gt;platformLayer()) {
&gt; +        // maybe this shouldn&apos;t be in paint (rendering the mask-layer)
&gt; +        // though it does work for now

You could use FIXME for comments on things that may need to be looked again later.

&gt; +void GraphicsLayerQtPrivate::drawContents(QPainter* painter, const QRectF&amp; r, bool mask)
&gt; +{
&gt; +    // webkit uses IntRect, we use QRectF. we don&apos;t want missing pixels    
&gt; +    QRect rect = r.toRect().adjusted(-1, -1, 1, 1);

This looks bit hacky, perhaps you should add a FIXME?

&gt; +    if (currentContent.contentType != HTMLContentType &amp;&amp; !state.contentsRect.isEmpty())
&gt; +        rect = rect.intersected(state.contentsRect);
&gt; +
&gt; +    if (currentContent.backgroundColorValid)
&gt; +        painter-&gt;fillRect(r, QColor(currentContent.backgroundColor));


Why is backgroundColorValid bit needed? Why wouldn&apos;t currentContent.backgroundColor.isValid() work?


&gt; +void GraphicsLayerQtPrivate::noteChange(PossibleChange pc)
&gt; +{
&gt; +    if (!this)
&gt; +        return;
&gt; +
&gt; +    possibleChanges = static_cast&lt;PossibleChange&gt;(static_cast&lt;int&gt;(possibleChanges) | static_cast&lt;int&gt;(pc));

This kind if stuff becomes more understandable when you use m_ prefixes for member variables (and full words for local variable names).

&gt; +
&gt; +void GraphicsLayerQtPrivate::flushChanges(bool recursive)
&gt; +{
&gt; +    // this is the bulk of the work. understanding what the compositor is trying to achieve,
&gt; +    // what graphics-view can do, and trying to find a sane common-grounds
&gt; +    if (layer) {
&gt; +        if (possibleChanges != NoChanges) {
&gt; +

Please use early return to avoid indenting the whole function (or possibly goto to end actions).

&gt; +
&gt; +    if (recursive) {
&gt; +        QList&lt;QGraphicsItem*&gt; ch = childItems();
&gt; +        foreach (QGraphicsItem* item, ch) {
&gt; +            GraphicsLayerQtPrivate* wdg = qobject_cast&lt;GraphicsLayerQtPrivate*&gt;(item-&gt;toGraphicsObject());
&gt; +            if (wdg)
&gt; +                wdg-&gt;flushChanges(true);
&gt; +        }
&gt; +    }

Would it be helpful to have a PossibleChange bit that tells if any child layer needs flushing? That way you could avoid recursing to children unnecessarily.


&gt; +
&gt; +GraphicsLayerQt::GraphicsLayerQt(GraphicsLayerClient* client)
&gt; +        :GraphicsLayer(client)
&gt; +        , qtLayer(new GraphicsLayerQtPrivate(this, client))
&gt; +{
&gt; +}

Double indentation.

&gt; +
&gt; +GraphicsLayerQt::~GraphicsLayerQt()
&gt; +{
&gt; +    delete qtLayer;
&gt; +}

Perhaps you could use OwnPtrs?

&gt; +void GraphicsLayerQt::setNeedsDisplay()
&gt; +{
&gt; +    qtLayer-&gt;pendingContent.updateAll = true;
&gt; +    qtLayer-&gt;noteChange(GraphicsLayerQtPrivate::DisplayChange);
&gt; +}
&gt; +void GraphicsLayerQt::setNeedsDisplayInRect(const FloatRect&amp; r)
&gt; +{
&gt; +    qtLayer-&gt;pendingContent.regionToUpdate|= QRectF(r).toRect().adjusted(-1, -1, 1, 1);
&gt; +    qtLayer-&gt;noteChange(GraphicsLayerQtPrivate::DisplayChange);
&gt; +}

Could the separate updateAll flag be removed by simply invalidating full frame sized region instead?

&gt; +void GraphicsLayerQt::setName(const String&amp; name)
&gt; +{
&gt; +    qtLayer-&gt;setObjectName(QString(name));
&gt; +    GraphicsLayer::setName(name);
&gt; +}

I think QString() is unnecessary, the conversion operator should get called automatically.

&gt; +bool GraphicsLayerQt::replaceChild(GraphicsLayer* oldChild, GraphicsLayer* newChild)
&gt; +{
&gt; +    if (GraphicsLayer::replaceChild(oldChild, newChild)) {
&gt; +       qtLayer-&gt;noteChange(GraphicsLayerQtPrivate::ChildrenChange);
&gt; +       return true;
&gt; +    } else
&gt; +        return false;
&gt; +}

No need for else after return.

&gt; +// helper functions to safely get a value out of WebCore&apos;s AnimationValue*
&gt; +static void webkitAnimationToQtAnimationValue(const AnimationValue* animationValue, TransformOperations&amp; transformOperations)
&gt; +{
&gt; +        if (animationValue) {
&gt; +            const TransformOperations* ops = static_cast&lt;const TransformAnimationValue*&gt;(animationValue)-&gt;value();
&gt; +            transformOperations = ops?*ops:TransformOperations();

please add spaces around ? and :

&gt; +        } else
&gt; +            transformOperations = TransformOperations();
&gt; +
&gt; +}
&gt; +
&gt; +static void webkitAnimationToQtAnimationValue(const AnimationValue* animationValue, qreal&amp; realValue)
&gt; +{
&gt; +        if (animationValue)
&gt; +            realValue = static_cast&lt;const FloatAnimationValue*&gt;(animationValue)-&gt;value();
&gt; +        else
&gt; +            realValue = 0;
&gt; +}

ternary operator would look slightly nicer here

&gt; +
&gt; +// we put a bit of the functionality in a base class to allow casting and to save some code size
&gt; +class AnimationQtBase : public QAbstractAnimation {
&gt; +public:
&gt; +    AnimationQtBase(GraphicsLayerQtPrivate* aLayer
&gt; +                    , const KeyframeValueList&amp; values
&gt; +                    , const IntSize&amp; aBoxSize
&gt; +                    , const Animation* anim
&gt; +                    , const QString &amp; kfName
&gt; +                    )
&gt; +            : QAbstractAnimation(0)
&gt; +            , target(aLayer)
&gt; +            , boxSize(aBoxSize)
&gt; +            , mDuration(anim-&gt;duration() * 1000)
&gt; +            , isAlternate(anim-&gt;direction() == Animation::AnimationDirectionAlternate)
&gt; +            , webkitPropertyID(values.property())
&gt; +            , keyframesName(kfName)
&gt; +    {
&gt; +    }

please use m_ prefix for members so you can use cleaner variable names (aLayer -&gt; layer etc).


&gt; +
&gt; +    QMap&lt;qreal, KeyframeValueQt&lt;T&gt; &gt; keyframeValues;

m_ prefix.


&gt; +
&gt; +        // to increase FPS, we use a less accurate caching mechanism while animation is going on
&gt; +        // this is a UX choice that should probably be customizable
&gt; +        if (newState == QAbstractAnimation::Running) {
&gt; +            target.data()-&gt;transformAnimationRunning = true;
&gt; +            if (target.data()-&gt;cacheMode() == QGraphicsItem::DeviceCoordinateCache)
&gt; +                target.data()-&gt;setCacheMode(QGraphicsItem::ItemCoordinateCache);
&gt; +        } else {
&gt; +            target.data()-&gt;transformAnimationRunning = false;
&gt; +            if (target.data()-&gt;cacheMode() == QGraphicsItem::ItemCoordinateCache)
&gt; +                target.data()-&gt;setCacheMode(QGraphicsItem::DeviceCoordinateCache);
&gt; +        }


Is this correct? According to the Qt documentation DeviceCoordinateCache can only be used for translated item but not for rotated, sheared or scaled items. Will this work in these cases too?

&gt; +
&gt; +void GraphicsLayerQt::removeAnimationsForProperty(AnimatedPropertyID id)
&gt; +{
&gt; +    for (QList&lt;QWeakPointer&lt;QAbstractAnimation&gt; &gt;::iterator it = qtLayer-&gt;animations.begin();
&gt; +            it != qtLayer-&gt;animations.end(); ++it) {

Please keep these on the same line.

&gt; +
&gt; +#include &quot;GraphicsLayer.h&quot;
&gt; +#include &quot;GraphicsLayerClient.h&quot;
&gt; +
&gt; +namespace WebCore {
&gt; +class GraphicsLayerQtPrivate;
&gt; +class GraphicsLayerQt : public GraphicsLayer {
&gt; +    friend class GraphicsLayerQtPrivate;
&gt; +public:
&gt; +    GraphicsLayerQt(GraphicsLayerClient*

Please add line breaks after namespace, before class name and before public:

&gt; +    virtual void syncCompositingState();
&gt; +private:
&gt; +    GraphicsLayerQtPrivate* qtLayer;
&gt; +
&gt;

m_qtLayer

Line break before private:</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>181841</commentid>
    <comment_count>10</comment_count>
    <who name="Benjamin Poulain">benjamin</who>
    <bug_when>2010-01-18 05:49:10 -0800</bug_when>
    <thetext>Could you please run the benchmarks with and without the patch to see if there is not any regression for the cases without any transformation?

The memory profile would be interesting for the cycler as well. In that case we expect regressions in exchange of speed, but it would be good to have numbers of how much the memory usage increase.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>181857</commentid>
    <comment_count>11</comment_count>
    <who name="Antti Koivisto">koivisto</who>
    <bug_when>2010-01-18 06:25:12 -0800</bug_when>
    <thetext>(In reply to comment #10)
&gt; Could you please run the benchmarks with and without the patch to see if there
&gt; is not any regression for the cases without any transformation?

I suppose only way this could have any effect in non-transformed case is if the additional scrollbar layer has some impact.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>181945</commentid>
    <comment_count>12</comment_count>
    <who name="Noam Rosenthal">noam</who>
    <bug_when>2010-01-18 11:44:30 -0800</bug_when>
    <thetext>&gt; setNeedsToBeDisplayed? or does it really need a display? Maybe the naming can
&gt; be improved

Maybe, but this is not my call... it&apos;s a reimp from GraphicsLayer.h
Maybe I should add /*! reimp */ everywhere?

Getting on to fixing the other style issues...</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>181947</commentid>
    <comment_count>13</comment_count>
    <who name="Kenneth Rohde Christiansen">kenneth</who>
    <bug_when>2010-01-18 11:46:11 -0800</bug_when>
    <thetext>(In reply to comment #12)
&gt; &gt; setNeedsToBeDisplayed? or does it really need a display? Maybe the naming can
&gt; &gt; be improved
&gt; 
&gt; Maybe, but this is not my call... it&apos;s a reimp from GraphicsLayer.h
&gt; Maybe I should add /*! reimp */ everywhere?
&gt; 
&gt; Getting on to fixing the other style issues...

Personally, I would find that useful.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>181950</commentid>
    <comment_count>14</comment_count>
    <who name="Noam Rosenthal">noam</who>
    <bug_when>2010-01-18 12:00:11 -0800</bug_when>
    <thetext>(In reply to comment #9)
&gt; (From update of attachment 46808 [details])
&gt; Should the overlay be created only if the composition is enabled in settings?
&gt; Or perhaps it doesn&apos;t hurt even if it is not strictly needed?
My guess is that having the overhead of creating/destroying that layer based on settings changes would make things more difficult than always having two items. Also having that extra layer would allow hybrid apps in the future to add graphics-items that go on top of the content layer but under the scrollbar overlay. I believe the current route is good, if the performance overhead is not too bad (which I&apos;m going to test).

&gt; Is this correct? According to the Qt documentation DeviceCoordinateCache can
&gt; only be used for translated item but not for rotated, sheared or scaled items.
This should be configurable (I&apos;ll put that in FIXME). The current implementation makes a choice of slightly degrading the animated object while a scale/rotate animation is going on, otherwise it&apos;d be too slow (it would have to render the HTML for every frame in a scale/rotate animation, which would make compositing completely irrelevant for anything but translate/opacity). 

The other style issues I&apos;ll just fix :)
N</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>182022</commentid>
    <comment_count>15</comment_count>
      <attachid>46859</attachid>
    <who name="Noam Rosenthal">noam</who>
    <bug_when>2010-01-18 15:49:29 -0800</bug_when>
    <thetext>Created attachment 46859
compositing layers for Qt: Take 3

The fixes are:
- many style fixes based on the previous two reviews, GraphicsLayerQt.cpp is hopefully much more readable now
- modified QGVLauncher to enable a more parameterized approach (caching? viewport udpate mode?). This would allow to easily test how compositing reacts to different QGV modes
- The scrollbar overlay item in QGraphicsWebView now only instantiates when compositing is needed - and gets deleted when compositing is cleared. That means that the overhead for non-composited web pages is close to none (a couple of boolean checks)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>182027</commentid>
    <comment_count>16</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-01-18 15:55:07 -0800</bug_when>
    <thetext>Attachment 46859 did not pass style-queue:

Failed to run &quot;WebKitTools/Scripts/check-webkit-style&quot; exit_code: 1
Ignoring WebKit/qt/Api/qwebsettings.cpp; This file is exempt from the style guide.
Ignoring WebKit/qt/Api/qwebview.cpp; This file is exempt from the style guide.
WebCore/platform/graphics/qt/GraphicsLayerQt.cpp:1125:  Alphabetical sorting problem.  [build/include_order] [4]
Ignoring WebKit/qt/Api/qgraphicswebview.cpp; This file is exempt from the style guide.
Ignoring WebKit/qt/Api/qwebsettings.h; This file is exempt from the style guide.
Ignoring WebKit/qt/Api/qgraphicswebview.h; This file is exempt from the style guide.
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>182131</commentid>
    <comment_count>17</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-01-18 21:39:31 -0800</bug_when>
    <thetext>Attachment 46859 did not build on qt:
Build output: http://webkit-commit-queue.appspot.com/results/200126</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>182133</commentid>
    <comment_count>18</comment_count>
      <attachid>46885</attachid>
    <who name="Noam Rosenthal">noam</who>
    <bug_when>2010-01-18 22:03:14 -0800</bug_when>
    <thetext>Created attachment 46885
compositing layers

Apparently I needed to add a check for Qt version.
I&apos;m using too many Qt 4.6 features so I added a test for Qt version that disables accelerated compositing if Qt version is before 4.6</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>182135</commentid>
    <comment_count>19</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-01-18 22:11:43 -0800</bug_when>
    <thetext>Attachment 46885 did not pass style-queue:

Failed to run &quot;WebKitTools/Scripts/check-webkit-style&quot; exit_code: 1
Ignoring WebKit/qt/Api/qwebsettings.cpp; This file is exempt from the style guide.
Ignoring WebKit/qt/Api/qwebview.cpp; This file is exempt from the style guide.
WebCore/platform/graphics/qt/GraphicsLayerQt.cpp:1125:  Alphabetical sorting problem.  [build/include_order] [4]
Ignoring WebKit/qt/Api/qgraphicswebview.cpp; This file is exempt from the style guide.
Ignoring WebKit/qt/Api/qwebsettings.h; This file is exempt from the style guide.
Ignoring WebKit/qt/Api/qgraphicswebview.h; This file is exempt from the style guide.
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>182185</commentid>
    <comment_count>20</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-01-19 02:48:18 -0800</bug_when>
    <thetext>Attachment 46885 did not build on qt:
Build output: http://webkit-commit-queue.appspot.com/results/198505</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>182203</commentid>
    <comment_count>21</comment_count>
      <attachid>46885</attachid>
    <who name="Antti Koivisto">koivisto</who>
    <bug_when>2010-01-19 05:19:41 -0800</bug_when>
    <thetext>Comment on attachment 46885
compositing layers

Just some minor stylistic issues left so r=me. But please consider fixing some of the thing below before landing.

&gt; Index: WebCore/platform/qt/QWebPageClient.h
&gt; ===================================================================
&gt; --- WebCore/platform/qt/QWebPageClient.h	(revision 53427)
&gt; +++ WebCore/platform/qt/QWebPageClient.h	(working copy)
&gt; @@ -29,8 +29,9 @@
&gt;  #ifndef QT_NO_CURSOR
&gt;  #include &lt;QCursor&gt;
&gt;  #endif
&gt; +
&gt;  #include &lt;QRect&gt;
&gt; -
&gt; +class QGraphicsItem;

Don&apos;t remove the empty line here

&gt; +class GraphicsLayerQtImpl : public QGraphicsObject {
&gt; +    Q_OBJECT
&gt; +
&gt; +public:
&gt; +    // this set of flags help us defer which properties of the layer have been
&gt; +    // modified by the compositor, so we can know what to look for in the next flush
&gt; +    enum ChangeFlag {

I would prefer &quot;ChangeFlags&quot; or &quot;ChangeMask&quot; to indicate that this is a bit field, not a single value.

&gt; +    virtual void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget);

Named arguments should not be used in headers unless they add some information (QPainter* painter and QWidget* widget are redundant)) .

&gt; +    // we manage transforms ourselves because transform-origin acts differently in webkit and in Qt
&gt; +    void setBaseTransform(const QTransform&amp; t);

as above

&gt; +    void drawContents(QPainter* painter, const QRectF&amp; r, bool mask = false);

as above (painter and r should be removed)

&gt; +
&gt; +    // let the compositor-API tell us which properties were changed
&gt; +    void notifyChange(ChangeFlag changeFlag);

as above

&gt; +
&gt; +    QTransform m_baseTransfom;
&gt; +    bool m_transformAnimationRunning;
&gt; +    bool opacityAnimationRunning;

m_opacityAnimationRunning

&gt; +
&gt; +    struct ContentData {
&gt; +        QPixmap pixmap;
&gt; +        QRegion regionToUpdate;
&gt; +        bool updateAll;
&gt; +        QColor contentsBackgroundColor;
&gt; +        QColor backgroundColor;
&gt; +        StaticContentType contentType;
&gt; +        float opacity;
&gt; +        ContentData()
&gt; +                : updateAll(false)
&gt; +                , backgroundColor(QColor())

No need for initializer for color

&gt; +                , contentType(HTMLContentType)
&gt; +                , opacity(1)

1.f

&gt; +    struct State {
&gt; +        GraphicsLayer* maskLayer;
&gt; +        FloatPoint pos;
&gt; +        FloatPoint3D anchorPoint;
&gt; +        FloatSize size;
&gt; +        TransformationMatrix transform;
&gt; +        TransformationMatrix childrenTransform;
&gt; +        Color backgroundColor;
&gt; +        Color currentColor;
&gt; +        GraphicsLayer::CompositingCoordinatesOrientation geoOrientation;
&gt; +        GraphicsLayer::CompositingCoordinatesOrientation contentsOrientation;
&gt; +        float opacity;
&gt; +        QRect contentsRect;
&gt; +
&gt; +        bool preserves3D: 1;
&gt; +        bool masksToBounds: 1;
&gt; +        bool drawsContent: 1;
&gt; +        bool contentsOpaque: 1;
&gt; +        bool backfaceVisibility: 1;
&gt; +        bool distributeOpacity: 1;
&gt; +        bool align: 2;

We use space before :

&gt; +GraphicsLayerQtImpl::GraphicsLayerQtImpl(GraphicsLayerQt* newLayer)
&gt; +        : QGraphicsObject(0)
&gt; +        , m_layer(newLayer)
&gt; +        , m_transformAnimationRunning(false)
&gt; +        , m_changeMask(NoChanges)
&gt; +
&gt; +{

We use 4 space indentation for initializer lists.
Extra empty line.

&gt; +
&gt; +GraphicsLayerQt::GraphicsLayerQt(GraphicsLayerClient* client)
&gt; +        : GraphicsLayer(client)
&gt; +        , m_impl(PassOwnPtr&lt;GraphicsLayerQtImpl&gt;(new GraphicsLayerQtImpl(this)))
&gt; +{
&gt; +}

We use 4 space indentation for initializer lists.

&gt; +// we want the timing function to be as close as possible to what the web-developer intended, so we&apos;re using the same function used by WebCore when compositing is disabled
&gt; +// Using easing-curves would probably work for some of the cases, but wouldn&apos;t really buy us anything as we&apos;d have to convert the bezier function back to an easing curve
&gt; +static inline qreal applyTimingFunction(const TimingFunction&amp; timingFunction, qreal progress, int duration)
&gt; +{
&gt; +        if (timingFunction.type() == LinearTimingFunction)
&gt; +            return progress;
&gt; +        if (timingFunction.type() == CubicBezierTimingFunction) {
&gt; +            return solveCubicBezierFunction(timingFunction.x1(),
&gt; +                                            timingFunction.y1(),
&gt; +                                            timingFunction.x2(),
&gt; +                                            timingFunction.y2(),
&gt; +                                            double(progress), double(duration) / 1000);
&gt; +        }
&gt; +        return progress;
&gt; +}

We use 4 space indentation for code.

+static void webkitAnimationToQtAnimationValue(const AnimationValue* animationValue, TransformOperations&amp; transformOperations)
+{
+    transformOperations = TransformOperations();
+    if (!animationValue)
+        return;
+
+    const TransformOperations* ops = static_cast&lt;const TransformAnimationValue*&gt;(animationValue)-&gt;value();
+
+    if (ops)
+        transformOperations = *ops;
+}

Could be written as

    if (const TransformOperations* ops = static_cast&lt;const TransformAnimationValue*&gt;(animationValue)-&gt;value())
        transformOperations = *ops;

&gt; +// we put a bit of the functionality in a base class to allow casting and to save some code size
&gt; +class AnimationQtBase : public QAbstractAnimation {
&gt; +public:
&gt; +    AnimationQtBase(GraphicsLayerQtImpl* layer, const KeyframeValueList&amp; values, const IntSize&amp; boxSize, const Animation* anim, const QString &amp; name)
&gt; +            : QAbstractAnimation(0)
&gt; +            , m_layer(layer)
&gt; +            , m_boxSize(boxSize)
&gt; +            , m_duration(anim-&gt;duration() * 1000)
&gt; +            , m_isAlternate(anim-&gt;direction() == Animation::AnimationDirectionAlternate)
&gt; +            , m_webkitPropertyID(values.property())
&gt; +            , m_keyframesName(name)
&gt; +    {
&gt; +    }

We use 4 space indentation for initializer lists.

&gt; +// buys us very little in this case, for too much overhead
&gt; +template &lt;typename T&gt;
&gt; +class AnimationQt : public AnimationQtBase {
&gt; +
...
&gt; +
&gt; +    QMap&lt;qreal, KeyframeValueQt&lt;T&gt; &gt; keyframeValues;

m_keyframeValues.

&gt; +class OpacityAnimationQt : public AnimationQt&lt;qreal&gt; {
&gt; +public:
&gt; +    OpacityAnimationQt(GraphicsLayerQtImpl* layer, const KeyframeValueList&amp; values, const IntSize&amp; boxSize, const Animation* anim, const QString &amp; name)
&gt; +                : AnimationQt&lt;qreal&gt;(layer, values, boxSize, anim, name)
&gt; +    {
&gt; +    }

We use 4 space indentation for initializer lists.

&gt; +
&gt; +    virtual void applyFrame(const qreal&amp; fromValue, const qreal&amp; toValue, qreal progress)
&gt; +    {
&gt; +        m_layer.data()-&gt;setOpacity(qMin&lt;qreal&gt;(qMax&lt;qreal&gt;(fromValue + (toValue-fromValue)*progress, 0), 1));
&gt; +    }
&gt; +
&gt; +    virtual void updateState(QAbstractAnimation::State newState, QAbstractAnimation::State oldState)
&gt; +    {
&gt; +        QAbstractAnimation::updateState(newState, oldState);
&gt; +
&gt; +        if (!m_layer)
&gt; +            return;
&gt; +
&gt; +        if (newState == QAbstractAnimation::Running)
&gt; +            m_layer.data()-&gt;opacityAnimationRunning = true;
&gt; +        else
&gt; +            m_layer.data()-&gt;opacityAnimationRunning = false;
&gt; +    }

Could be written as
m_layer.data()-&gt;opacityAnimationRunning = (newState == QAbstractAnimation::Running);

&gt; +private:
&gt; +    OwnPtr&lt;GraphicsLayerQtImpl&gt; m_impl;
&gt; +
&gt; +};

unneeded empty line.

&gt; +
&gt; +
&gt; +}

unneeded empty line.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>182205</commentid>
    <comment_count>22</comment_count>
    <who name="Antti Koivisto">koivisto</who>
    <bug_when>2010-01-19 05:22:21 -0800</bug_when>
    <thetext>Also it would be good if it would build in the bot :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>182210</commentid>
    <comment_count>23</comment_count>
    <who name="Kenneth Rohde Christiansen">kenneth</who>
    <bug_when>2010-01-19 05:57:01 -0800</bug_when>
    <thetext>What about renaming markSync to setNeedsSync ?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>182213</commentid>
    <comment_count>24</comment_count>
      <attachid>46885</attachid>
    <who name="Antti Koivisto">koivisto</who>
    <bug_when>2010-01-19 06:09:10 -0800</bug_when>
    <thetext>Comment on attachment 46885
compositing layers

Changing to r- for not building on bot.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>182221</commentid>
    <comment_count>25</comment_count>
    <who name="Noam Rosenthal">noam</who>
    <bug_when>2010-01-19 06:42:53 -0800</bug_when>
    <thetext>hmmm... any idea why the bot doesn&apos;t manage to build it? It seems like it&apos;s using an older Qt version or something? What would be a way to reproduce what the bot tries to do?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>182222</commentid>
    <comment_count>26</comment_count>
    <who name="Kenneth Rohde Christiansen">kenneth</who>
    <bug_when>2010-01-19 06:44:09 -0800</bug_when>
    <thetext>The bugzilla Qt build bot is running 4.5 it appears, so you need some ifdef guards.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>182616</commentid>
    <comment_count>27</comment_count>
      <attachid>46978</attachid>
    <who name="Noam Rosenthal">noam</who>
    <bug_when>2010-01-19 22:32:30 -0800</bug_when>
    <thetext>Created attachment 46978
compositing layers: +Compile fixes for Qt 4.5, ChangeLog

- Tested that it compiles with Qt 4.5, 
- applied recent style comments
- ChangeLog</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>182617</commentid>
    <comment_count>28</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-01-19 22:35:25 -0800</bug_when>
    <thetext>Attachment 46978 did not pass style-queue:

Failed to run &quot;WebKitTools/Scripts/check-webkit-style&quot; exit_code: 1
Ignoring WebKit/qt/Api/qwebsettings.cpp; This file is exempt from the style guide.
ChangeLog:9:  Line contains tab character.  [whitespace/tab] [5]
Ignoring WebKit/qt/Api/qwebview.cpp; This file is exempt from the style guide.
WebCore/platform/graphics/qt/GraphicsLayerQt.cpp:1117:  Alphabetical sorting problem.  [build/include_order] [4]
Ignoring WebKit/qt/Api/qgraphicswebview.cpp; This file is exempt from the style guide.
Ignoring WebKit/qt/Api/qwebsettings.h; This file is exempt from the style guide.
Ignoring WebKit/qt/Api/qgraphicswebview.h; This file is exempt from the style guide.
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>182644</commentid>
    <comment_count>29</comment_count>
      <attachid>46986</attachid>
    <who name="Noam Rosenthal">noam</who>
    <bug_when>2010-01-20 00:02:53 -0800</bug_when>
    <thetext>Created attachment 46986
GraphicsLayers in Qt: +4.5 build +changelog +last minute crash fix

Last minute fix</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>182647</commentid>
    <comment_count>30</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-01-20 00:05:47 -0800</bug_when>
    <thetext>Attachment 46986 did not pass style-queue:

Failed to run &quot;WebKitTools/Scripts/check-webkit-style&quot; exit_code: 1
Ignoring WebKit/qt/Api/qwebsettings.cpp; This file is exempt from the style guide.
ChangeLog:9:  Line contains tab character.  [whitespace/tab] [5]
Ignoring WebKit/qt/Api/qwebview.cpp; This file is exempt from the style guide.
WebCore/platform/graphics/qt/GraphicsLayerQt.cpp:1118:  Alphabetical sorting problem.  [build/include_order] [4]
Ignoring WebKit/qt/Api/qgraphicswebview.cpp; This file is exempt from the style guide.
Ignoring WebKit/qt/Api/qwebsettings.h; This file is exempt from the style guide.
Ignoring WebKit/qt/Api/qgraphicswebview.h; This file is exempt from the style guide.
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>182700</commentid>
    <comment_count>31</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2010-01-20 03:21:19 -0800</bug_when>
    <thetext>&gt; Why are these exempted from the style guide? We don&apos;t use Qt style in them, but
&gt; WebKit style

There&apos;s a bunch of code in there that triggers false positives because that code uses a bunch of Qt specific stuff that doesn&apos;t match WebKit style.  In the long term, we should teach the style checker about these details, but I&apos;m on an anti-false positive rampage at the moment.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>182737</commentid>
    <comment_count>32</comment_count>
    <who name="Kenneth Rohde Christiansen">kenneth</who>
    <bug_when>2010-01-20 04:09:56 -0800</bug_when>
    <thetext>(In reply to comment #30)
&gt; Attachment 46986 [details] did not pass style-queue:
&gt; 
&gt; Failed to run &quot;WebKitTools/Scripts/check-webkit-style&quot; exit_code: 1
&gt; Ignoring WebKit/qt/Api/qwebsettings.cpp; This file is exempt from the style
&gt; guide.
&gt; ChangeLog:9:  Line contains tab character.  [whitespace/tab] [5]

This seems like a real issue though!

&gt; Ignoring WebKit/qt/Api/qwebview.cpp; This file is exempt from the style guide.
&gt; WebCore/platform/graphics/qt/GraphicsLayerQt.cpp:1118:  Alphabetical sorting
&gt; problem.  [build/include_order] [4]

This one probably is as well.

If you fix that, r=me</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>182748</commentid>
    <comment_count>33</comment_count>
      <attachid>46986</attachid>
    <who name="Antti Koivisto">koivisto</who>
    <bug_when>2010-01-20 04:57:11 -0800</bug_when>
    <thetext>Comment on attachment 46986
GraphicsLayers in Qt: +4.5 build +changelog +last minute crash fix

Yeah, looks ready to me as well.

&gt; +void GraphicsLayerQtImpl::notifyChange(ChangeMask changeMask)
&gt; +{
&gt; +    if (!this)
&gt; +        return;
&gt; +
&gt; +    m_changeMask = static_cast&lt;ChangeMask&gt;(static_cast&lt;int&gt;(m_changeMask) | static_cast&lt;int&gt;(changeMask));
&gt; 

Since m_changeMask is an int, most of those static_casts are unnecessary.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>182767</commentid>
    <comment_count>34</comment_count>
    <who name="Kenneth Rohde Christiansen">kenneth</who>
    <bug_when>2010-01-20 06:21:00 -0800</bug_when>
    <thetext>(In reply to comment #33)
&gt; (From update of attachment 46986 [details])
&gt; Yeah, looks ready to me as well.
&gt; 
&gt; &gt; +void GraphicsLayerQtImpl::notifyChange(ChangeMask changeMask)
&gt; &gt; +{
&gt; &gt; +    if (!this)
&gt; &gt; +        return;
&gt; &gt; +
&gt; &gt; +    m_changeMask = static_cast&lt;ChangeMask&gt;(static_cast&lt;int&gt;(m_changeMask) | static_cast&lt;int&gt;(changeMask));
&gt; &gt; 
&gt; 
&gt; Since m_changeMask is an int, most of those static_casts are unnecessary.

Also in C++ a cast to int is normally done as int(boolValue)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>182794</commentid>
    <comment_count>35</comment_count>
    <who name="Noam Rosenthal">noam</who>
    <bug_when>2010-01-20 07:41:56 -0800</bug_when>
    <thetext>&gt; &gt; WebCore/platform/graphics/qt/GraphicsLayerQt.cpp:1118:  Alphabetical sorting
&gt; &gt; problem.  [build/include_order] [4]
&gt; 
&gt; This one probably is as well.

This is the moc at the end of the file, can&apos;t work around it...</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>182800</commentid>
    <comment_count>36</comment_count>
      <attachid>47034</attachid>
    <who name="Noam Rosenthal">noam</who>
    <bug_when>2010-01-20 07:55:22 -0800</bug_when>
    <thetext>Created attachment 47034
accelerated composition layers in Qt: +Still had a stray tab +removed unnecessary static_cast

- as I said, the other style-checker issues is a false positive (we just can&apos;t include the .moc file at the top)
but the other stuff is fixed - hopefully this is enough for our efficient army of bots :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>182813</commentid>
    <comment_count>37</comment_count>
      <attachid>47034</attachid>
    <who name="Antti Koivisto">koivisto</who>
    <bug_when>2010-01-20 08:29:56 -0800</bug_when>
    <thetext>Comment on attachment 47034
accelerated composition layers in Qt: +Still had a stray tab +removed unnecessary static_cast

r=me</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>183022</commentid>
    <comment_count>38</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2010-01-20 18:36:04 -0800</bug_when>
    <thetext>&gt; This is the moc at the end of the file, can&apos;t work around it...

I thought we already fixed that bug.  Will investigate.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>183024</commentid>
    <comment_count>39</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2010-01-20 18:37:48 -0800</bug_when>
    <thetext>https://bugs.webkit.org/show_bug.cgi?id=33934</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>183065</commentid>
    <comment_count>40</comment_count>
    <who name="Noam Rosenthal">noam</who>
    <bug_when>2010-01-20 20:50:46 -0800</bug_when>
    <thetext>Before I request for this to be added to the commit queue, do I need to fix something in the ChangeLog? bug 32461 failed on some obscure ChangeLog-based problem I don&apos;t understand, and I don&apos;t want it to repeat for this one.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>183100</commentid>
    <comment_count>41</comment_count>
    <who name="Kenneth Rohde Christiansen">kenneth</who>
    <bug_when>2010-01-21 00:11:40 -0800</bug_when>
    <thetext>(In reply to comment #40)
&gt; Before I request for this to be added to the commit queue, do I need to fix
&gt; something in the ChangeLog? bug 32461 failed on some obscure ChangeLog-based
&gt; problem I don&apos;t understand, and I don&apos;t want it to repeat for this one.

Just make sure you have no tabs in it, and then please create the patch using webkit-patch or git format-patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>183138</commentid>
    <comment_count>42</comment_count>
    <who name="Simon Hausmann">hausmann</who>
    <bug_when>2010-01-21 01:50:55 -0800</bug_when>
    <thetext>Committed r53618: &lt;http://trac.webkit.org/changeset/53618&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>183160</commentid>
    <comment_count>43</comment_count>
    <who name="Antti Koivisto">koivisto</who>
    <bug_when>2010-01-21 04:23:21 -0800</bug_when>
    <thetext>Woo!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>236746</commentid>
    <comment_count>44</comment_count>
    <who name="Manish Gurnaney">manishgurnaney</who>
    <bug_when>2010-06-11 02:35:43 -0700</bug_when>
    <thetext>Hi, 
   I have gone through the Accel code and also its working fine. but i have a lil problem . when i try to compile code in debug mode it building fine. but when stated debugging and put one breakpoint, it doesn&apos;t shows the source code for the same. 
So can you suggest what settings i need to make to debug WebCore.
I am using the steps mentioned in WebKit org.

Command :- ./build_webkit --qt --debug</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>237198</commentid>
    <comment_count>45</comment_count>
    <who name="Noam Rosenthal">noam</who>
    <bug_when>2010-06-11 18:19:27 -0700</bug_when>
    <thetext>(In reply to comment #44)
&gt; Hi, 
&gt;    I have gone through the Accel code and also its working fine. but i have a lil problem . when i try to compile code in debug mode it building fine. but when stated debugging and put one breakpoint, it doesn&apos;t shows the source code for the same. 
&gt; So can you suggest what settings i need to make to debug WebCore.
&gt; I am using the steps mentioned in WebKit org.
&gt; 
&gt; Command :- ./build_webkit --qt --debug
this looks fine; Looks like a normal debugger configuration problem and not necessarily related to the accel code.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>237793</commentid>
    <comment_count>46</comment_count>
    <who name="Antonio Gomes">tonikitoo</who>
    <bug_when>2010-06-14 06:28:02 -0700</bug_when>
    <thetext>(In reply to comment #44)
&gt; Hi, 
&gt;    I have gone through the Accel code and also its working fine. but i have a lil problem . when i try to compile code in debug mode it building fine. but when stated debugging and put one breakpoint, it doesn&apos;t shows the source code for the same. 
&gt; So can you suggest what settings i need to make to debug WebCore.
&gt; I am using the steps mentioned in WebKit org.
&gt; 
&gt; Command :- ./build_webkit --qt --debug

maybe related to this http://lists.macosforge.org/pipermail/webkit-qt/2010-April/000375.html ? symbols show up fine for me on trunk now.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>237845</commentid>
    <comment_count>47</comment_count>
    <who name="Manish Gurnaney">manishgurnaney</who>
    <bug_when>2010-06-14 09:00:13 -0700</bug_when>
    <thetext>I performed the steps mentioned in the http://lists.macosforge.org/pipermail/webkit-qt/2010-April/000375.html 

can you tell me the source from which to take the code. 
Currently i have downloaded the source from git clone git://gitorious.org/webkit/webkit.git</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>237851</commentid>
    <comment_count>48</comment_count>
    <who name="Noam Rosenthal">noam</who>
    <bug_when>2010-06-14 09:21:19 -0700</bug_when>
    <thetext>That should be fine. Please use the mailing list or IRC for this, not bugzilla.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>46752</attachid>
            <date>2010-01-16 15:22:25 -0800</date>
            <delta_ts>2010-01-18 15:49:29 -0800</delta_ts>
            <desc>compositing layers for Qt </desc>
            <filename>patch-GraphicsLayerQt-1.diff</filename>
            <type>text/plain</type>
            <size>57732</size>
            <attacher name="Noam Rosenthal">noam</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYktpdC9xdC9RR1ZMYXVuY2hlci9tYWluLmNwcAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJL
aXQvcXQvUUdWTGF1bmNoZXIvbWFpbi5jcHAJKHJldmlzaW9uIDUzMzU3KQorKysgV2ViS2l0L3F0
L1FHVkxhdW5jaGVyL21haW4uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xMjksNiArMTI5LDcgQEAK
IAogICAgICAgICBzZXRGcmFtZVNoYXBlKFFGcmFtZTo6Tm9GcmFtZSk7CiAgICAgICAgIHNldFNp
emVQb2xpY3koUVNpemVQb2xpY3k6OkV4cGFuZGluZywgUVNpemVQb2xpY3k6OkV4cGFuZGluZyk7
CisgICAgICAgIHNldFZpZXdwb3J0VXBkYXRlTW9kZShCb3VuZGluZ1JlY3RWaWV3cG9ydFVwZGF0
ZSk7CiAgICAgfQogCiAgICAgdm9pZCBzZXRNYWluV2lkZ2V0KFFHcmFwaGljc1dpZGdldCogd2lk
Z2V0KQpAQCAtNDU1LDE3ICs0NTYsMjQgQEAKICAgICBRV2ViU2V0dGluZ3M6OnNldE1heGltdW1Q
YWdlc0luQ2FjaGUoNCk7CiAgICAgUVdlYlNldHRpbmdzOjpnbG9iYWxTZXR0aW5ncygpLT5zZXRB
dHRyaWJ1dGUoUVdlYlNldHRpbmdzOjpQbHVnaW5zRW5hYmxlZCwgdHJ1ZSk7CiAgICAgUVdlYlNl
dHRpbmdzOjpnbG9iYWxTZXR0aW5ncygpLT5zZXRBdHRyaWJ1dGUoUVdlYlNldHRpbmdzOjpEZXZl
bG9wZXJFeHRyYXNFbmFibGVkLCB0cnVlKTsKKyAgICBRV2ViU2V0dGluZ3M6Omdsb2JhbFNldHRp
bmdzKCktPnNldEF0dHJpYnV0ZShRV2ViU2V0dGluZ3M6OkxvY2FsQ29udGVudENhbkFjY2Vzc1Jl
bW90ZVVybHMsIHRydWUpOwogICAgIFFXZWJTZXR0aW5nczo6ZW5hYmxlUGVyc2lzdGVudFN0b3Jh
Z2UoKTsKIAogICAgIGNvbnN0IFFTdHJpbmdMaXN0IGFyZ3MgPSBhcHAuYXJndW1lbnRzKCk7Ci0g
ICAgaWYgKGFyZ3MuY291bnQoKSA+IDEpCisgICAgY29uc3QgaW50IGlkeE9mVXJsID0gYXJncy5p
bmRleE9mKCItLXVybCIpOworICAgIGlmIChpZHhPZlVybCA+IDAgJiYgaWR4T2ZVcmwgPCBhcmdz
LmNvdW50KCktMSkKKyAgICAgICAgdXJsID0gYXJncy5hdChpZHhPZlVybCsxKTsKKyAgICBlbHNl
IGlmIChhcmdzLmNvdW50KCkgPiAxKQogICAgICAgICB1cmwgPSBhcmdzLmF0KDEpOworICAgIGlm
IChhcmdzLmNvbnRhaW5zKCItLWFjY2VsIikpCisgICAgICAgIFFXZWJTZXR0aW5nczo6Z2xvYmFs
U2V0dGluZ3MoKS0+c2V0QXR0cmlidXRlKFFXZWJTZXR0aW5nczo6QWNjZWxlcmF0ZWRDb21wb3Np
dGluZ0VuYWJsZWQsIHRydWUpOwogCiAgICAgTWFpbldpbmRvdyogd2luZG93ID0gbmV3IE1haW5X
aW5kb3c7CiAgICAgd2luZG93LT5sb2FkKHVybCk7CiAKICAgICBmb3IgKGludCBpID0gMjsgaSA8
IGFyZ3MuY291bnQoKTsgaSsrKQotICAgICAgICB3aW5kb3ctPm5ld1dpbmRvdyhhcmdzLmF0KGkp
KTsKKyAgICAgICAgaWYgKCFhcmdzLmF0KGkpLnN0YXJ0c1dpdGgoIi0iKSAmJiAhYXJncy5hdChp
LTEpLnN0YXJ0c1dpdGgoIi0iKSkKKyAgICAgICAgICAgIHdpbmRvdy0+bmV3V2luZG93KGFyZ3Mu
YXQoaSkpOwogCiAgICAgd2luZG93LT5zaG93KCk7CiAgICAgcmV0dXJuIGFwcC5leGVjKCk7Cklu
ZGV4OiBXZWJLaXQvcXQvV2ViQ29yZVN1cHBvcnQvQ2hyb21lQ2xpZW50UXQuY3BwCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFdlYktpdC9xdC9XZWJDb3JlU3VwcG9ydC9DaHJvbWVDbGllbnRRdC5jcHAJKHJldmlz
aW9uIDUzMzU3KQorKysgV2ViS2l0L3F0L1dlYkNvcmVTdXBwb3J0L0Nocm9tZUNsaWVudFF0LmNw
cAkod29ya2luZyBjb3B5KQpAQCAtNDIsNiArNDIsMTAgQEAKICNpbmNsdWRlICJRV2ViUGFnZUNs
aWVudC5oIgogI2luY2x1ZGUgIlNlY3VyaXR5T3JpZ2luLmgiCiAKKyNpbmNsdWRlIDxxZGVidWcu
aD4KKyNpbmNsdWRlIDxxdGV4dGRvY3VtZW50Lmg+CisjaW5jbHVkZSA8cXRvb2x0aXAuaD4KKwog
I2luY2x1ZGUgInF3ZWJwYWdlLmgiCiAjaW5jbHVkZSAicXdlYnBhZ2VfcC5oIgogI2luY2x1ZGUg
InF3ZWJmcmFtZV9wLmgiCkBAIC00OSw5ICs1MywxMCBAQAogI2luY2x1ZGUgInF3ZWJzZWN1cml0
eW9yaWdpbl9wLmgiCiAjaW5jbHVkZSAicXdlYnZpZXcuaCIKIAotI2luY2x1ZGUgPHF0b29sdGlw
Lmg+Ci0jaW5jbHVkZSA8cXRleHRkb2N1bWVudC5oPgogCisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NP
TVBPU0lUSU5HKQorI2luY2x1ZGUgIkdyYXBoaWNzTGF5ZXJRdC5oIgorI2VuZGlmCiBuYW1lc3Bh
Y2UgV2ViQ29yZQogewogCkBAIC00NjUsNiArNDcwLDMwIEBACiAgICAgLy8gU2VlIHRoZSBjb21t
ZW50IGluIFdlYkNvcmUvcGFnZS9DaHJvbWVDbGllbnQuaAogICAgIG5vdEltcGxlbWVudGVkKCk7
CiB9CisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorLy8gUGFzcyAwIGFzIHRoZSBH
cmFwaGljc0xheWVyIHRvIGRldGF0Y2ggdGhlIHJvb3QgbGF5ZXIuCit2b2lkIENocm9tZUNsaWVu
dFF0OjphdHRhY2hSb290R3JhcGhpY3NMYXllcihGcmFtZSogZnJhbWUsIEdyYXBoaWNzTGF5ZXIq
IGdyYXBoaWNzTGF5ZXIpCit7CisgICAgaWYgKHBsYXRmb3JtUGFnZUNsaWVudCgpKQorICAgICAg
ICBwbGF0Zm9ybVBhZ2VDbGllbnQoKS0+c2V0Um9vdEdyYXBoaWNzTGF5ZXIoZ3JhcGhpY3NMYXll
cj9ncmFwaGljc0xheWVyLT5uYXRpdmVMYXllcigpOjApOworfQorLy8gU2V0cyBhIGZsYWcgdG8g
c3BlY2lmeSB0aGF0IHRoZSBuZXh0IHRpbWUgY29udGVudCBpcyBkcmF3biB0byB0aGUgd2luZG93
LAorLy8gdGhlIGNoYW5nZXMgYXBwZWFyIG9uIHRoZSBzY3JlZW4gaW4gc3luY2hyb255IHdpdGgg
dXBkYXRlcyB0byBHcmFwaGljc0xheWVycy4KK3ZvaWQgQ2hyb21lQ2xpZW50UXQ6OnNldE5lZWRz
T25lU2hvdERyYXdpbmdTeW5jaHJvbml6YXRpb24oKQoreworICAgIGlmIChwbGF0Zm9ybVBhZ2VD
bGllbnQoKSkgeworICAgICAgICBwbGF0Zm9ybVBhZ2VDbGllbnQoKS0+bWFya0ZvclN5bmMoZmFs
c2UpOworICAgICAgICBwbGF0Zm9ybVBhZ2VDbGllbnQoKS0+dXBkYXRlKFFSZWN0KFFQb2ludCgw
LCAwKSwgbV93ZWJQYWdlLT52aWV3cG9ydFNpemUoKSkpOworICAgIH0KK30KKy8vIFNldHMgYSBm
bGFnIHRvIHNwZWNpZnkgdGhhdCB0aGUgdmlldyBuZWVkcyB0byBiZSB1cGRhdGVkLCBzbyB3ZSBu
ZWVkCisvLyB0byBkbyBhbiBlYWdlciBsYXlvdXQgYmVmb3JlIHRoZSBkcmF3aW5nLgordm9pZCBD
aHJvbWVDbGllbnRRdDo6c2NoZWR1bGVDb21wb3NpdGluZ0xheWVyU3luYygpCit7CisgICAgaWYg
KHBsYXRmb3JtUGFnZUNsaWVudCgpKQorICAgICAgICBwbGF0Zm9ybVBhZ2VDbGllbnQoKS0+bWFy
a0ZvclN5bmModHJ1ZSk7Cit9CisjZW5kaWYKIAogUXRBYnN0cmFjdFdlYlBvcHVwKiBDaHJvbWVD
bGllbnRRdDo6Y3JlYXRlUG9wdXAoKQogewpJbmRleDogV2ViS2l0L3F0L1dlYkNvcmVTdXBwb3J0
L0Nocm9tZUNsaWVudFF0LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0L3F0L1dlYkNvcmVTdXBwb3J0
L0Nocm9tZUNsaWVudFF0LmgJKHJldmlzaW9uIDUzMzU3KQorKysgV2ViS2l0L3F0L1dlYkNvcmVT
dXBwb3J0L0Nocm9tZUNsaWVudFF0LmgJKHdvcmtpbmcgY29weSkKQEAgLTE0NSw2ICsxNDUsMTEg
QEAKICAgICAgICAgYm9vbCB0b29sQmFyc1Zpc2libGU7CiAgICAgICAgIGJvb2wgc3RhdHVzQmFy
VmlzaWJsZTsKICAgICAgICAgYm9vbCBtZW51QmFyVmlzaWJsZTsKKyNpZiBVU0UoQUNDRUxFUkFU
RURfQ09NUE9TSVRJTkcpCisgICAgICAgIHZpcnR1YWwgdm9pZCBhdHRhY2hSb290R3JhcGhpY3NM
YXllcihGcmFtZSosIEdyYXBoaWNzTGF5ZXIqKTsKKyAgICAgICAgdmlydHVhbCB2b2lkIHNldE5l
ZWRzT25lU2hvdERyYXdpbmdTeW5jaHJvbml6YXRpb24oKTsKKyAgICAgICAgdmlydHVhbCB2b2lk
IHNjaGVkdWxlQ29tcG9zaXRpbmdMYXllclN5bmMoKTsKKyNlbmRpZgogICAgIH07CiB9CiAKSW5k
ZXg6IFdlYktpdC9xdC9BcGkvcWdyYXBoaWNzd2Vidmlldy5jcHAKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2Vi
S2l0L3F0L0FwaS9xZ3JhcGhpY3N3ZWJ2aWV3LmNwcAkocmV2aXNpb24gNTMzNTcpCisrKyBXZWJL
aXQvcXQvQXBpL3FncmFwaGljc3dlYnZpZXcuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yMiwyNCAr
MjIsNjQgQEAKICNpbmNsdWRlICJxZ3JhcGhpY3N3ZWJ2aWV3LmgiCiAKICNpbmNsdWRlICJxd2Vi
ZnJhbWUuaCIKKyNpbmNsdWRlICJxd2ViZnJhbWVfcC5oIgogI2luY2x1ZGUgInF3ZWJwYWdlLmgi
CiAjaW5jbHVkZSAicXdlYnBhZ2VfcC5oIgogI2luY2x1ZGUgIlFXZWJQYWdlQ2xpZW50LmgiCi0j
aW5jbHVkZSA8UXRHdWkvUUdyYXBoaWNzU2NlbmU+Ci0jaW5jbHVkZSA8UXRHdWkvUUdyYXBoaWNz
Vmlldz4KKyNpbmNsdWRlIDxGcmFtZVZpZXcuaD4KKyNpbmNsdWRlIDxRdENvcmUvcXNoYXJlZHBv
aW50ZXIuaD4KKyNpbmNsdWRlIDxRdENvcmUvcXRpbWVyLmg+CiAjaW5jbHVkZSA8UXRHdWkvcWFw
cGxpY2F0aW9uLmg+CisjaW5jbHVkZSA8UXRHdWkvcWdyYXBoaWNzc2NlbmUuaD4KICNpbmNsdWRl
IDxRdEd1aS9xZ3JhcGhpY3NzY2VuZWV2ZW50Lmg+CisjaW5jbHVkZSA8UXRHdWkvcWdyYXBoaWNz
dmlldy5oPgorI2luY2x1ZGUgPFF0R3VpL3FwaXhtYXBjYWNoZS5oPgogI2luY2x1ZGUgPFF0R3Vp
L3FzdHlsZW9wdGlvbi5oPgogI2lmIGRlZmluZWQoUV9XU19YMTEpCiAjaW5jbHVkZSA8UVgxMUlu
Zm8+CiAjZW5kaWYKKyNpbmNsdWRlIDxTZXR0aW5ncy5oPgogCisjaWYgVVNFKEFDQ0VMRVJBVEVE
X0NPTVBPU0lUSU5HKQorY2xhc3MgUUdyYXBoaWNzV2ViVmlld092ZXJsYXkgOiBwdWJsaWMgUUdy
YXBoaWNzSXRlbSB7CisgICAgZnJpZW5kIGNsYXNzIFFHcmFwaGljc1dlYlZpZXc7CisgICAgUUdy
YXBoaWNzV2ViVmlldyogcTsKKworICAgIHB1YmxpYzoKKyAgICBRR3JhcGhpY3NXZWJWaWV3T3Zl
cmxheShRR3JhcGhpY3NXZWJWaWV3KiB3dikKKyAgICAgICAgICAgIDpRR3JhcGhpY3NJdGVtKHd2
KSwKKyAgICAgICAgICAgIHEod3YpCisgICAgeworICAgIH0KKworICAgIFFSZWN0RiBib3VuZGlu
Z1JlY3QoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIHEtPmJvdW5kaW5nUmVjdCgpOwor
ICAgIH0KKworICAgIHZvaWQgcGFpbnQoUVBhaW50ZXIqIHBhaW50ZXIsIGNvbnN0IFFTdHlsZU9w
dGlvbkdyYXBoaWNzSXRlbSogb3B0LCBRV2lkZ2V0KikKKyAgICB7CisgICAgICAgIHEtPnBhZ2Uo
KS0+bWFpbkZyYW1lKCktPnJlbmRlcihwYWludGVyLCAoUVdlYkZyYW1lOjpSZW5kZXJMYXllciko
UVdlYkZyYW1lOjpBbGxMYXllcnMmKH5RV2ViRnJhbWU6OkNvbnRlbnRzTGF5ZXIpKSwgb3B0LT5l
eHBvc2VkUmVjdC50b1JlY3QoKSk7CisgICAgfQorfTsKKyNlbmRpZgogY2xhc3MgUUdyYXBoaWNz
V2ViVmlld1ByaXZhdGUgOiBwdWJsaWMgUVdlYlBhZ2VDbGllbnQgewogcHVibGljOgogICAgIFFH
cmFwaGljc1dlYlZpZXdQcml2YXRlKFFHcmFwaGljc1dlYlZpZXcqIHBhcmVudCkKICAgICAgICAg
OiBxKHBhcmVudCkKICAgICAgICAgLCBwYWdlKDApCi0gICAge30KKyNpZiBVU0UoQUNDRUxFUkFU
RURfQ09NUE9TSVRJTkcpCisgICAgICAgICwgcm9vdEdyYXBoaWNzTGF5ZXIoMCksCisgICAgICAg
IG92ZXJsYXkobmV3IFFHcmFwaGljc1dlYlZpZXdPdmVybGF5KHBhcmVudCkpLAorICAgICAgICBt
YXJrZWRGb3JTeW5jKHRydWUpCisjZW5kaWYKKyAgICB7CisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NP
TVBPU0lUSU5HKQorICAgICAgICBvdmVybGF5LT5zZXRaVmFsdWUoMik7CisgICAgICAgIG92ZXJs
YXktPnNldFBvcygwLCAwKTsKKyAgICAgICAgcS0+c2V0Q2FjaGVNb2RlKFFHcmFwaGljc0l0ZW06
Okl0ZW1Db29yZGluYXRlQ2FjaGUpOworI2VuZGlmCisgICAgfQogCiAgICAgdmlydHVhbCB+UUdy
YXBoaWNzV2ViVmlld1ByaXZhdGUoKTsKICAgICB2aXJ0dWFsIHZvaWQgc2Nyb2xsKGludCBkeCwg
aW50IGR5LCBjb25zdCBRUmVjdCYpOwpAQCAtNjAsMTcgKzEwMCw0NyBAQAogICAgIHZpcnR1YWwg
UVdpZGdldCogb3duZXJXaWRnZXQoKSBjb25zdDsKIAogICAgIHZpcnR1YWwgUU9iamVjdCogcGx1
Z2luUGFyZW50KCkgY29uc3Q7Ci0KKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCisg
ICAgdmlydHVhbCB2b2lkIHNldFJvb3RHcmFwaGljc0xheWVyKFFHcmFwaGljc0l0ZW0qIGxheWVy
KTsKKyAgICB2aXJ0dWFsIHZvaWQgbWFya0ZvclN5bmMoYm9vbCBub3cpOworI2VuZGlmCiAgICAg
dm9pZCBfcV9kb0xvYWRGaW5pc2hlZChib29sIHN1Y2Nlc3MpOwogCiAgICAgUUdyYXBoaWNzV2Vi
VmlldyogcTsKICAgICBRV2ViUGFnZSogcGFnZTsKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9T
SVRJTkcpCisgICAgUUdyYXBoaWNzSXRlbSogcm9vdEdyYXBoaWNzTGF5ZXI7CisgICAgUUdyYXBo
aWNzV2ViVmlld092ZXJsYXkqIG92ZXJsYXk7CisgICAgYm9vbCBtYXJrZWRGb3JTeW5jOworICAg
IFFQb2ludCBzY3JvbGxEZWx0YTsKKyNlbmRpZgogfTsKIAogUUdyYXBoaWNzV2ViVmlld1ByaXZh
dGU6On5RR3JhcGhpY3NXZWJWaWV3UHJpdmF0ZSgpCiB7CisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NP
TVBPU0lUSU5HKQorICAgIGlmIChyb290R3JhcGhpY3NMYXllcikgeworICAgICAgICByb290R3Jh
cGhpY3NMYXllci0+c2V0UGFyZW50SXRlbSgwKTsKKyAgICAgICAgcS0+c2NlbmUoKS0+cmVtb3Zl
SXRlbShyb290R3JhcGhpY3NMYXllcik7CisgICAgfQorI2VuZGlmCiB9Ci0KKyNpZiBVU0UoQUND
RUxFUkFURURfQ09NUE9TSVRJTkcpCit2b2lkIFFHcmFwaGljc1dlYlZpZXdQcml2YXRlOjpzZXRS
b290R3JhcGhpY3NMYXllcihRR3JhcGhpY3NJdGVtKiBsYXllcikKK3sKKyAgICBpZiAocm9vdEdy
YXBoaWNzTGF5ZXIpIHsKKyAgICAgICAgcS0+c2NlbmUoKS0+cmVtb3ZlSXRlbShyb290R3JhcGhp
Y3NMYXllcik7CisgICAgICAgIFFXZWJGcmFtZVByaXZhdGU6OmNvcmUocS0+cGFnZSgpLT5tYWlu
RnJhbWUoKSktPnZpZXcoKS0+c3luY0NvbXBvc2l0aW5nU3RhdGVSZWN1cnNpdmUoKTsKKyAgICB9
CisgICAgcm9vdEdyYXBoaWNzTGF5ZXIgPSBsYXllcjsKKyAgICBpZiAobGF5ZXIpIHsKKyAgICAg
ICAgbGF5ZXItPnNldFpWYWx1ZSgxKTsKKyAgICAgICAgbGF5ZXItPnNldFBhcmVudEl0ZW0ocSk7
CisgICAgICAgIGxheWVyLT5tb3ZlQnkoc2Nyb2xsRGVsdGEueCgpLCBzY3JvbGxEZWx0YS55KCkp
OworICAgICAgICBzY3JvbGxEZWx0YSA9IFFQb2ludCgpOworICAgIH0KK30KKyNlbmRpZgogdm9p
ZCBRR3JhcGhpY3NXZWJWaWV3UHJpdmF0ZTo6X3FfZG9Mb2FkRmluaXNoZWQoYm9vbCBzdWNjZXNz
KQogewogICAgIC8vIElmIHRoZSBwYWdlIGhhZCBubyB0aXRsZSwgc3RpbGwgbWFrZSBzdXJlIGl0
IGdldHMgdGhlIHNpZ25hbApAQCAtODMsMTMgKzE1MywzMiBAQAogdm9pZCBRR3JhcGhpY3NXZWJW
aWV3UHJpdmF0ZTo6c2Nyb2xsKGludCBkeCwgaW50IGR5LCBjb25zdCBRUmVjdCYgcmVjdFRvU2Ny
b2xsKQogewogICAgIHEtPnNjcm9sbChxcmVhbChkeCksIHFyZWFsKGR5KSwgUVJlY3RGKHJlY3RU
b1Njcm9sbCkpOworI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKKworICAgIGlmIChy
b290R3JhcGhpY3NMYXllcikKKyAgICAgICAgcm9vdEdyYXBoaWNzTGF5ZXItPm1vdmVCeShkeCwg
ZHkpOworICAgIGVsc2UKKyAgICAgICAgc2Nyb2xsRGVsdGEgKz0gUVBvaW50KGR4LCBkeSk7CisK
KyAgICBvdmVybGF5LT5zY3JvbGwoZHgsIGR5LCByZWN0VG9TY3JvbGwpOworI2VuZGlmCiB9CiAK
IHZvaWQgUUdyYXBoaWNzV2ViVmlld1ByaXZhdGU6OnVwZGF0ZShjb25zdCBRUmVjdCYgZGlydHlS
ZWN0KQogewogICAgIHEtPnVwZGF0ZShRUmVjdEYoZGlydHlSZWN0KSk7CiB9CisjaWYgVVNFKEFD
Q0VMRVJBVEVEX0NPTVBPU0lUSU5HKQordm9pZCBRR3JhcGhpY3NXZWJWaWV3UHJpdmF0ZTo6bWFy
a0ZvclN5bmMoYm9vbCBub3cpCit7CisgICAgaWYgKG5vdyAmJiAhbWFya2VkRm9yU3luYykgewor
ICAgICAgICBxLT5zeW5jTGF5ZXJzKCk7CiAKKyAgICAgICAgUVRpbWVyOjpzaW5nbGVTaG90KDAs
IHEsIFNMT1Qoc3luY0xheWVycygpKSk7CisgICAgfQorICAgIG1hcmtlZEZvclN5bmMgPSB0cnVl
OworfQorI2VuZGlmCiAKIHZvaWQgUUdyYXBoaWNzV2ViVmlld1ByaXZhdGU6OnNldElucHV0TWV0
aG9kRW5hYmxlZChib29sIGVuYWJsZSkKIHsKQEAgLTI0OCw2ICszMzcsNyBAQAogICAgIHNldEFj
Y2VwdFRvdWNoRXZlbnRzKHRydWUpOwogI2VuZGlmCiAgICAgc2V0Rm9jdXNQb2xpY3koUXQ6OlN0
cm9uZ0ZvY3VzKTsKKyAgICBzZXRGbGFnKFFHcmFwaGljc0l0ZW06Okl0ZW1DbGlwc0NoaWxkcmVu
VG9TaGFwZSwgdHJ1ZSk7CiB9CiAKIC8qIQpAQCAtMjkzLDExICszODMsMjcgQEAKICAgICByZXR1
cm4gZC0+cGFnZTsKIH0KIAordm9pZCBRR3JhcGhpY3NXZWJWaWV3OjpzeW5jTGF5ZXJzKCkKK3sK
KyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCisgICAgaWYgKGQtPm1hcmtlZEZvclN5
bmMpIHsKKyAgICAgICAgUVdlYkZyYW1lUHJpdmF0ZTo6Y29yZShwYWdlKCktPm1haW5GcmFtZSgp
KS0+dmlldygpLT5zeW5jQ29tcG9zaXRpbmdTdGF0ZVJlY3Vyc2l2ZSgpOworICAgICAgICBkLT5t
YXJrZWRGb3JTeW5jID0gZmFsc2U7CisgICAgfQorCisjZW5kaWYKK30KKwogLyohIFxyZWltcAog
Ki8KIHZvaWQgUUdyYXBoaWNzV2ViVmlldzo6cGFpbnQoUVBhaW50ZXIqIHBhaW50ZXIsIGNvbnN0
IFFTdHlsZU9wdGlvbkdyYXBoaWNzSXRlbSogb3B0aW9uLCBRV2lkZ2V0KikKIHsKLSAgICBwYWdl
KCktPm1haW5GcmFtZSgpLT5yZW5kZXIocGFpbnRlciwgb3B0aW9uLT5leHBvc2VkUmVjdC50b1Jl
Y3QoKSk7CisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorICAgIHN5bmNMYXllcnMo
KTsKKyAgICBwYWdlKCktPm1haW5GcmFtZSgpLT5yZW5kZXIocGFpbnRlciwgUVdlYkZyYW1lOjpD
b250ZW50c0xheWVyLCBvcHRpb24tPmV4cG9zZWRSZWN0LnRvUmVjdCgpKTsKKyNlbHNlCisgICAg
cGFnZSgpLT5tYWluRnJhbWUoKS0+cmVuZGVyKHBhaW50ZXIsIFFXZWJGcmFtZTo6QWxsTGF5ZXJz
LCBvcHRpb24tPmV4cG9zZWRSZWN0LnRvUmVjdCgpKTsKKyNlbmRpZgogfQogCiAvKiEgXHJlaW1w
CkBAIC00MjUsNiArNTMxLDkgQEAKICAgICBkLT5wYWdlID0gcGFnZTsKICAgICBpZiAoIWQtPnBh
Z2UpCiAgICAgICAgIHJldHVybjsKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCisg
ICAgZC0+b3ZlcmxheS0+cHJlcGFyZUdlb21ldHJ5Q2hhbmdlKCk7CisjZW5kaWYKICAgICBkLT5w
YWdlLT5kLT5jbGllbnQgPSBkOyAvLyBzZXQgdGhlIHBhZ2UgY2xpZW50CiAKICAgICBRU2l6ZSBz
aXplID0gZ2VvbWV0cnkoKS5zaXplKCkudG9TaXplKCk7CkBAIC01MjgsNiArNjM3LDkgQEAKICov
CiB2b2lkIFFHcmFwaGljc1dlYlZpZXc6OnVwZGF0ZUdlb21ldHJ5KCkKIHsKKyNpZiBVU0UoQUND
RUxFUkFURURfQ09NUE9TSVRJTkcpCisgICAgZC0+b3ZlcmxheS0+cHJlcGFyZUdlb21ldHJ5Q2hh
bmdlKCk7CisjZW5kaWYKICAgICBRR3JhcGhpY3NXaWRnZXQ6OnVwZGF0ZUdlb21ldHJ5KCk7CiAK
ICAgICBpZiAoIWQtPnBhZ2UpCkBAIC01NDIsNyArNjU0LDkgQEAKIHZvaWQgUUdyYXBoaWNzV2Vi
Vmlldzo6c2V0R2VvbWV0cnkoY29uc3QgUVJlY3RGJiByZWN0KQogewogICAgIFFHcmFwaGljc1dp
ZGdldDo6c2V0R2VvbWV0cnkocmVjdCk7Ci0KKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJ
TkcpCisgICAgZC0+b3ZlcmxheS0+cHJlcGFyZUdlb21ldHJ5Q2hhbmdlKCk7CisjZW5kaWYKICAg
ICBpZiAoIWQtPnBhZ2UpCiAgICAgICAgIHJldHVybjsKIApJbmRleDogV2ViS2l0L3F0L0FwaS9x
d2Vic2V0dGluZ3MuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQvcXQvQXBpL3F3ZWJzZXR0aW5ncy5o
CShyZXZpc2lvbiA1MzM1NykKKysrIFdlYktpdC9xdC9BcGkvcXdlYnNldHRpbmdzLmgJKHdvcmtp
bmcgY29weSkKQEAgLTY4LDcgKzY4LDggQEAKICNlbmRpZgogICAgICAgICBMb2NhbENvbnRlbnRD
YW5BY2Nlc3NSZW1vdGVVcmxzLAogICAgICAgICBEbnNQcmVmZXRjaEVuYWJsZWQsCi0gICAgICAg
IFhTU0F1ZGl0b3JFbmFibGVkCisgICAgICAgIFhTU0F1ZGl0b3JFbmFibGVkLAorICAgICAgICBB
Y2NlbGVyYXRlZENvbXBvc2l0aW5nRW5hYmxlZAogICAgIH07CiAgICAgZW51bSBXZWJHcmFwaGlj
IHsKICAgICAgICAgTWlzc2luZ0ltYWdlR3JhcGhpYywKSW5kZXg6IFdlYktpdC9xdC9BcGkvcXdl
YnNldHRpbmdzLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQvcXQvQXBpL3F3ZWJzZXR0aW5ncy5j
cHAJKHJldmlzaW9uIDUzMzU3KQorKysgV2ViS2l0L3F0L0FwaS9xd2Vic2V0dGluZ3MuY3BwCSh3
b3JraW5nIGNvcHkpCkBAIC0xNTIsNyArMTUyLDEyIEBACiAgICAgICAgIHZhbHVlID0gYXR0cmli
dXRlcy52YWx1ZShRV2ViU2V0dGluZ3M6OkphdmFzY3JpcHRFbmFibGVkLAogICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWwtPmF0dHJpYnV0ZXMudmFsdWUoUVdlYlNl
dHRpbmdzOjpKYXZhc2NyaXB0RW5hYmxlZCkpOwogICAgICAgICBzZXR0aW5ncy0+c2V0SmF2YVNj
cmlwdEVuYWJsZWQodmFsdWUpOworI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKKyAg
ICAgICAgdmFsdWUgPSBhdHRyaWJ1dGVzLnZhbHVlKFFXZWJTZXR0aW5nczo6QWNjZWxlcmF0ZWRD
b21wb3NpdGluZ0VuYWJsZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGdsb2JhbC0+YXR0cmlidXRlcy52YWx1ZShRV2ViU2V0dGluZ3M6OkFjY2VsZXJhdGVkQ29tcG9z
aXRpbmdFbmFibGVkKSk7CiAKKyAgICAgICAgc2V0dGluZ3MtPnNldEFjY2VsZXJhdGVkQ29tcG9z
aXRpbmdFbmFibGVkKHZhbHVlKTsKKyNlbmRpZgogICAgICAgICB2YWx1ZSA9IGF0dHJpYnV0ZXMu
dmFsdWUoUVdlYlNldHRpbmdzOjpKYXZhc2NyaXB0Q2FuT3BlbldpbmRvd3MsCiAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbC0+YXR0cmlidXRlcy52YWx1ZShRV2Vi
U2V0dGluZ3M6OkphdmFzY3JpcHRDYW5PcGVuV2luZG93cykpOwogICAgICAgICBzZXR0aW5ncy0+
c2V0SmF2YVNjcmlwdENhbk9wZW5XaW5kb3dzQXV0b21hdGljYWxseSh2YWx1ZSk7CkBAIC0zODks
NiArMzk0LDcgQEAKICAgICBkLT5hdHRyaWJ1dGVzLmluc2VydChRV2ViU2V0dGluZ3M6Ok9mZmxp
bmVXZWJBcHBsaWNhdGlvbkNhY2hlRW5hYmxlZCwgZmFsc2UpOwogICAgIGQtPmF0dHJpYnV0ZXMu
aW5zZXJ0KFFXZWJTZXR0aW5nczo6TG9jYWxTdG9yYWdlRW5hYmxlZCwgZmFsc2UpOwogICAgIGQt
PmF0dHJpYnV0ZXMuaW5zZXJ0KFFXZWJTZXR0aW5nczo6TG9jYWxDb250ZW50Q2FuQWNjZXNzUmVt
b3RlVXJscywgZmFsc2UpOworICAgIGQtPmF0dHJpYnV0ZXMuaW5zZXJ0KFFXZWJTZXR0aW5nczo6
QWNjZWxlcmF0ZWRDb21wb3NpdGluZ0VuYWJsZWQsIGZhbHNlKTsKICAgICBkLT5vZmZsaW5lU3Rv
cmFnZURlZmF1bHRRdW90YSA9IDUgKiAxMDI0ICogMTAyNDsKICAgICBkLT5kZWZhdWx0VGV4dEVu
Y29kaW5nID0gUUxhdGluMVN0cmluZygiaXNvLTg4NTktMSIpOwogfQpJbmRleDogV2ViS2l0L3F0
L0FwaS9xZ3JhcGhpY3N3ZWJ2aWV3LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0L3F0L0FwaS9xZ3Jh
cGhpY3N3ZWJ2aWV3LmgJKHJldmlzaW9uIDUzMzU3KQorKysgV2ViS2l0L3F0L0FwaS9xZ3JhcGhp
Y3N3ZWJ2aWV3LmgJKHdvcmtpbmcgY29weSkKQEAgLTEwNSw3ICsxMDUsOCBAQAogICAgIHZvaWQg
aWNvbkNoYW5nZWQoKTsKICAgICB2b2lkIHN0YXR1c0Jhck1lc3NhZ2UoY29uc3QgUVN0cmluZyYg
bWVzc2FnZSk7CiAgICAgdm9pZCBsaW5rQ2xpY2tlZChjb25zdCBRVXJsJik7Ci0KK3Byb3RlY3Rl
ZCBzbG90czoKKyAgICB2b2lkIHN5bmNMYXllcnMoKTsKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFs
IHZvaWQgbW91c2VQcmVzc0V2ZW50KFFHcmFwaGljc1NjZW5lTW91c2VFdmVudCopOwogICAgIHZp
cnR1YWwgdm9pZCBtb3VzZURvdWJsZUNsaWNrRXZlbnQoUUdyYXBoaWNzU2NlbmVNb3VzZUV2ZW50
Kik7CkluZGV4OiBXZWJLaXQvcXQvQXBpL3F3ZWJ2aWV3LmNwcAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJL
aXQvcXQvQXBpL3F3ZWJ2aWV3LmNwcAkocmV2aXNpb24gNTMzNTcpCisrKyBXZWJLaXQvcXQvQXBp
L3F3ZWJ2aWV3LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjIsMTAgKzIyLDExIEBACiAjaW5jbHVk
ZSAiY29uZmlnLmgiCiAjaW5jbHVkZSAicXdlYnZpZXcuaCIKIAorI2luY2x1ZGUgIlBhZ2UuaCIK
ICNpbmNsdWRlICJRV2ViUGFnZUNsaWVudC5oIgorI2luY2x1ZGUgIlNldHRpbmdzLmgiCiAjaW5j
bHVkZSAicXdlYmZyYW1lLmgiCiAjaW5jbHVkZSAicXdlYnBhZ2VfcC5oIgotCiAjaW5jbHVkZSAi
cWJpdG1hcC5oIgogI2luY2x1ZGUgInFldmVudC5oIgogI2luY2x1ZGUgInFwYWludGVyLmgiCkBA
IC0yNDcsNiArMjQ4LDkgQEAKICAgICAgICAgICAgICAgICB0aGlzLCBTTE9UKF9xX3BhZ2VEZXN0
cm95ZWQoKSkpOwogICAgIH0KICAgICBzZXRBdHRyaWJ1dGUoUXQ6OldBX09wYXF1ZVBhaW50RXZl
bnQsIGQtPnBhZ2UpOworI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKKyAgICBkLT5w
YWdlLT5kLT5wYWdlLT5zZXR0aW5ncygpLT5zZXRBY2NlbGVyYXRlZENvbXBvc2l0aW5nRW5hYmxl
ZChmYWxzZSk7CisjZW5kaWYKICAgICB1cGRhdGUoKTsKIH0KIApJbmRleDogV2ViQ29yZS9wbHVn
aW5zL3F0L1BsdWdpblZpZXdRdC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbHVnaW5zL3F0
L1BsdWdpblZpZXdRdC5jcHAJKHJldmlzaW9uIDUzMzU3KQorKysgV2ViQ29yZS9wbHVnaW5zL3F0
L1BsdWdpblZpZXdRdC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTUzLDYgKzUzLDcgQEAKICNpbmNs
dWRlICJQbHVnaW5Db250YWluZXJRdC5oIgogI2luY2x1ZGUgIlBsdWdpbkRlYnVnLmgiCiAjaW5j
bHVkZSAiUGx1Z2luUGFja2FnZS5oIgorI2luY2x1ZGUgIlBsdWdpbldpZGdldC5oIgogI2luY2x1
ZGUgIlBsdWdpbk1haW5UaHJlYWRTY2hlZHVsZXIuaCIKICNpbmNsdWRlICJSZW5kZXJMYXllci5o
IgogI2luY2x1ZGUgIlNjcmlwdENvbnRyb2xsZXIuaCIKQEAgLTg0NCw0ICs4NDUsNSBAQAogewog
fQogCisKIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFdlYkNvcmUvV2ViQ29yZS5wcm8K
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gV2ViQ29yZS9XZWJDb3JlLnBybwkocmV2aXNpb24gNTMzNTcpCisrKyBX
ZWJDb3JlL1dlYkNvcmUucHJvCSh3b3JraW5nIGNvcHkpCkBAIC0yNzA3LDYgKzI3MDcsMTkgQEAK
ICAgICAgICAgICAgIHBsdWdpbnMvd2luL1BhaW50SG9va3MuYXNtCiAgICAgfQogfQorY29udGFp
bnMoREVGSU5FUywgV1RGX1VTRV9BQ0NFTEVSQVRFRF9DT01QT1NJVElORykgeworSEVBREVSUyAr
PSBcCisgICAgcmVuZGVyaW5nL1JlbmRlckxheWVyQmFja2luZy5oIFwKKyAgICByZW5kZXJpbmcv
UmVuZGVyTGF5ZXJDb21wb3NpdG9yLmggXAorICAgIHBsYXRmb3JtL2dyYXBoaWNzL0dyYXBoaWNz
TGF5ZXIuaCBcCisgICAgcGxhdGZvcm0vZ3JhcGhpY3MvR3JhcGhpY3NMYXllckNsaWVudC5oIFwK
KyAgICBwbGF0Zm9ybS9ncmFwaGljcy9xdC9HcmFwaGljc0xheWVyUXQuaAorU09VUkNFUyArPSBc
CisgICAgcGxhdGZvcm0vZ3JhcGhpY3MvR3JhcGhpY3NMYXllci5jcHAgXAorICAgIHBsYXRmb3Jt
L2dyYXBoaWNzL3F0L0dyYXBoaWNzTGF5ZXJRdC5jcHAgXAorICAgIHJlbmRlcmluZy9SZW5kZXJM
YXllckJhY2tpbmcuY3BwIFwKKyAgICByZW5kZXJpbmcvUmVuZGVyTGF5ZXJDb21wb3NpdG9yLmNw
cAorfQogCiBzeW1iaWFuIHsKICAgICBzaGFyZWQgewpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9x
dC9RV2ViUGFnZUNsaWVudC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vcXQvUVdl
YlBhZ2VDbGllbnQuaAkocmV2aXNpb24gNTMzNTcpCisrKyBXZWJDb3JlL3BsYXRmb3JtL3F0L1FX
ZWJQYWdlQ2xpZW50LmgJKHdvcmtpbmcgY29weSkKQEAgLTMwLDcgKzMwLDcgQEAKICNpbmNsdWRl
IDxRQ3Vyc29yPgogI2VuZGlmCiAjaW5jbHVkZSA8UVJlY3Q+Ci0KK2NsYXNzIFFHcmFwaGljc0l0
ZW07CiBjbGFzcyBRV2ViUGFnZUNsaWVudCB7CiBwdWJsaWM6CiAgICAgdmlydHVhbCB+UVdlYlBh
Z2VDbGllbnQoKSB7IH0KQEAgLTM5LDYgKzM5LDExIEBACiAgICAgdmlydHVhbCB2b2lkIHVwZGF0
ZShjb25zdCBRUmVjdCYpID0gMDsKICAgICB2aXJ0dWFsIHZvaWQgc2V0SW5wdXRNZXRob2RFbmFi
bGVkKGJvb2wgZW5hYmxlKSA9IDA7CiAgICAgdmlydHVhbCBib29sIGlucHV0TWV0aG9kRW5hYmxl
ZCgpIGNvbnN0ID0gMDsKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCisgICAgdmly
dHVhbCB2b2lkIHNldFJvb3RHcmFwaGljc0xheWVyKFFHcmFwaGljc0l0ZW0qIGxheWVyKSB7fQor
ICAgIHZpcnR1YWwgdm9pZCBtYXJrRm9yU3luYyhib29sIG5vdyA9IGZhbHNlKSB7fQorI2VuZGlm
CisKICNpZiBRVF9WRVJTSU9OID49IDB4MDQwNjAwCiAgICAgdmlydHVhbCB2b2lkIHNldElucHV0
TWV0aG9kSGludChRdDo6SW5wdXRNZXRob2RIaW50IGhpbnQsIGJvb2wgZW5hYmxlKSA9IDA7CiAj
ZW5kaWYKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvcXQvR3JhcGhpY3NMYXllclF0
LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3F0L0dyYXBoaWNz
TGF5ZXJRdC5jcHAJKHJldmlzaW9uIDApCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3F0
L0dyYXBoaWNzTGF5ZXJRdC5jcHAJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsOTc2IEBACisvKgor
ICAgIENvcHlyaWdodCAoQykgMjAwOSBOb2tpYSBDb3Jwb3JhdGlvbiBhbmQvb3IgaXRzIHN1YnNp
ZGlhcnkoLWllcykKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2Fu
IHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9m
IHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVk
IGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMiBv
ZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKwor
ICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwg
YmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRo
ZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9S
IEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMaWJyYXJ5IEdlbmVyYWwg
UHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSBy
ZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UK
KyAgICBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAg
SWYgbm90LCB3cml0ZSB0bworICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4s
IDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisgICAgQm9zdG9uLCBNQSAwMjExMC0x
MzAxLCBVU0EuCisqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiR3JhcGhpY3NM
YXllclF0LmgiCisKKyNpbmNsdWRlICJDdXJyZW50VGltZS5oIgorI2luY2x1ZGUgIkZsb2F0UmVj
dC5oIgorI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgorI2luY2x1ZGUgIkltYWdlLmgiCisj
aW5jbHVkZSAiUmVmQ291bnRlZC5oIgorI2luY2x1ZGUgIlRyYW5zbGF0ZVRyYW5zZm9ybU9wZXJh
dGlvbi5oIgorI2luY2x1ZGUgIlVuaXRCZXppZXIuaCIKKyNpbmNsdWRlIDxRdENvcmUvcWFic3Ry
YWN0YW5pbWF0aW9uLmg+CisjaW5jbHVkZSA8UXRDb3JlL3FkZWJ1Zy5oPgorI2luY2x1ZGUgPFF0
Q29yZS9xc2V0Lmg+CisjaW5jbHVkZSA8UXRDb3JlL3F0aW1lci5oPgorI2luY2x1ZGUgPFF0R3Vp
L3FiaXRtYXAuaD4KKyNpbmNsdWRlIDxRdEd1aS9xY29sb3IuaD4KKyNpbmNsdWRlIDxRdEd1aS9x
Z3JhcGhpY3NlZmZlY3QuaD4KKyNpbmNsdWRlIDxRdEd1aS9xZ3JhcGhpY3NpdGVtLmg+CisjaW5j
bHVkZSA8UXRHdWkvcWdyYXBoaWNzc2NlbmUuaD4KKyNpbmNsdWRlIDxRdEd1aS9xbWF0cml4NHg0
Lmg+CisjaW5jbHVkZSA8UXRHdWkvcXBhaW50ZXIuaD4KKyNpbmNsdWRlIDxRdEd1aS9xcGFsZXR0
ZS5oPgorI2luY2x1ZGUgPFF0R3VpL3FwaXhtYXAuaD4KKyNpbmNsdWRlIDxRdEd1aS9xc3R5bGVv
cHRpb24uaD4KKworbmFtZXNwYWNlIHsKKyAgICBlbnVtIFN0YXRpY0NvbnRlbnRUeXBlIHsgTm9D
b250ZW50VHlwZSwgUGl4bWFwQ29udGVudFR5cGUsIENvbG9yQ29udGVudFR5cGV9OworCit9CisK
K25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgR3JhcGhpY3NMYXllclF0UHJpdmF0ZSA6IHB1
YmxpYyBRR3JhcGhpY3NPYmplY3QgeworICAgIFFfT0JKRUNUCisgICAgZnJpZW5kIGNsYXNzIEdy
YXBoaWNzTGF5ZXJRdDsKKyAgICBmcmllbmQgY2xhc3MgVHJhbnNmb3JtQW5pbWF0aW9uUXQ7Cisg
ICAgZnJpZW5kIGNsYXNzIE9wYWNpdHlBbmltYXRpb25RdDsKKyAgICBHcmFwaGljc0xheWVyUXQq
IGxheWVyOworICAgIEdyYXBoaWNzTGF5ZXJDbGllbnQqIGNsaWVudDsKKyAgICBRVHJhbnNmb3Jt
IGJUcmFuc2Zvcm07CisgICAgYm9vbCB0cmFuc2Zvcm1BbmltYXRpb25SdW5uaW5nLCBvcGFjaXR5
QW5pbWF0aW9uUnVubmluZzsKKyAgICBzdHJ1Y3QgQ29udGVudERhdGEgeworICAgICAgICBRUGl4
bWFwIHBpeG1hcDsKKyAgICAgICAgUVJlZ2lvbiByZWdpb25Ub1VwZGF0ZTsKKyAgICAgICAgYm9v
bCB1cGRhdGVBbGwsIGJnY29sb3JWYWxpZDsKKyAgICAgICAgUUNvbG9yIGNvbnRlbnRzQmdDb2xv
ciwgYmdjb2xvcjsKKyAgICAgICAgU3RhdGljQ29udGVudFR5cGUgY29udGVudFR5cGU7CisgICAg
ICAgIGZsb2F0IG9wYWNpdHk7CisgICAgICAgIENvbnRlbnREYXRhKCkKKyAgICAgICAgICAgICAg
ICA6dXBkYXRlQWxsKGZhbHNlKQorICAgICAgICAgICAgICAgICwgYmdjb2xvclZhbGlkKGZhbHNl
KQorICAgICAgICAgICAgICAgICwgY29udGVudFR5cGUoTm9Db250ZW50VHlwZSkKKyAgICAgICAg
ICAgICAgICAsIG9wYWNpdHkoMSkKKyAgICAgICAgeworICAgICAgICB9CisgICAgfSBwZW5kaW5n
Q29udGVudCwgY3VyQ29udGVudDsKKyAgICBlbnVtIFBvc3NpYmxlQ2hhbmdlIHsKKyAgICAgICAg
Tm9DaGFuZ2VzICAgICAgID0gICAgICAgICAgIDAsCisgICAgICAgIENoaWxkcmVuQ2hhbmdlICA9
ICAgICAgICAgICAoMUwgPDwgMSksCisgICAgICAgIE1hc2tMYXllckNoYW5nZSA9ICAgICAgICAg
ICAoMUwgPDwgMiksCisgICAgICAgIFBvc2l0aW9uQ2hhbmdlICA9ICAgICAgICAgICAoMUwgPDwg
MyksCisgICAgICAgIEFuY2hvclBvaW50Q2hhbmdlID0gICAgICAgICAoMUwgPDwgNCksCisgICAg
ICAgIFNpemVDaGFuZ2UgICAgICA9ICAgICAgICAgICAoMUwgPDwgNSksCisgICAgICAgIFRyYW5z
Zm9ybUNoYW5nZSA9ICAgICAgICAgICAoMUwgPDwgNiksCisgICAgICAgIENvbnRlbnRDaGFuZ2Ug
ICA9ICAgICAgICAgICAoMUwgPDwgNyksCisgICAgICAgIEdlb09yaWVudGF0aW9uQ2hhbmdlID0g
ICAgICAoMUwgPDwgOCksCisgICAgICAgIENvbnRlbnRzT3JpZW50YXRpb25DaGFuZ2UgPSAoMUwg
PDwgOSksCisgICAgICAgIE9wYWNpdHlDaGFuZ2UgICA9ICAgICAgICAgICAoMUwgPDwgMTApLAor
ICAgICAgICBDb250ZW50c1JlY3RDaGFuZ2UgPSAgICAgICAgKDFMIDw8IDExKSwKKyAgICAgICAg
UHJlc2VydmVzM0RDaGFuZ2UgPSAgICAgICAgICgxTCA8PCAxMiksCisgICAgICAgIE1hc2tzVG9C
b3VuZHNDaGFuZ2UgPSAgICAgICAoMUwgPDwgMTMpLAorICAgICAgICBEcmF3c0NvbnRlbnRDaGFu
Z2UgPSAgICAgICAgKDFMIDw8IDE0KSwKKyAgICAgICAgQ29udGVudHNPcGFxdWVDaGFuZ2UgPSAg
ICAgICgxTCA8PCAxNSksCisgICAgICAgIEJhY2tmYWNlVmlzaWJpbGl0eUNoYW5nZSA9ICAoMUwg
PDwgMTYpLAorICAgICAgICBDaGlsZHJlblRyYW5zZm9ybUNoYW5nZSA9ICAgKDFMIDw8IDE3KSwK
KyAgICAgICAgRGlzcGxheUNoYW5nZSA9ICAgICAgICAgICAgICgxTCA8PCAxOCksCisgICAgICAg
IEJhY2tncm91bmRDb2xvckNoYW5nZSA9ICAgICAoMUwgPDwgMTkpLAorICAgICAgICBQYXJlbnRD
aGFuZ2UgPSAgICAgICAgICAgICAgKDFMIDw8IDIwKSwKKyAgICAgICAgRGlzdHJpYnV0ZXNPcGFj
aXR5Q2hhbmdlID0gICgxTCA8PCAyMSkKKyAgICB9IHBvc3NpYmxlQ2hhbmdlczsKKworICAgIFFT
aXplRiBzaXplOworICAgIFFMaXN0PFFXZWFrUG9pbnRlcjxRQWJzdHJhY3RBbmltYXRpb24+ID4g
YW5pbWF0aW9uczsKKyAgICBRVGltZXIgc3VzcGVuZFRpbWVyOworCisgICAgc3RydWN0IFN0YXRl
IHsKKyAgICAgICAgR3JhcGhpY3NMYXllciogbWFza0xheWVyOworICAgICAgICBGbG9hdFBvaW50
IHBvczsKKyAgICAgICAgRmxvYXRQb2ludDNEIGFuY2hvclBvaW50OworICAgICAgICBGbG9hdFNp
emUgc2l6ZTsKKyAgICAgICAgVHJhbnNmb3JtYXRpb25NYXRyaXggdHJhbnNmb3JtLCBjaGlsZHJl
blRyYW5zZm9ybTsKKyAgICAgICAgQ29sb3IgYmdjb2xvcjsKKyAgICAgICAgQ29sb3IgY3VyQ29s
b3I7CisgICAgICAgIEdyYXBoaWNzTGF5ZXI6OkNvbXBvc2l0aW5nQ29vcmRpbmF0ZXNPcmllbnRh
dGlvbiBnZW9PcmllbnRhdGlvbiwgY29udGVudHNPcmllbnRhdGlvbjsKKyAgICAgICAgZmxvYXQg
b3BhY2l0eTsKKyAgICAgICAgUVJlY3QgY29udGVudHNSZWN0OworCisgICAgICAgIGJvb2wgcHJl
c2VydmVzM0Q6MTsKKyAgICAgICAgYm9vbCBtYXNrc1RvQm91bmRzOiAxOworICAgICAgICBib29s
IGRyYXdzQ29udGVudDogMTsKKyAgICAgICAgYm9vbCBjb250ZW50c09wYXF1ZTogMTsKKyAgICAg
ICAgYm9vbCBiYWNrZmFjZVZpc2liaWxpdHk6IDE7CisgICAgICAgIGJvb2wgZGlzdHJpYnV0ZU9w
YWNpdHk6IDE7CisgICAgICAgIGJvb2wgYWxpZ246IDI7CisgICAgICAgIFN0YXRlKCkgOiBtYXNr
TGF5ZXIoMCksIG9wYWNpdHkoMSksIHByZXNlcnZlczNEKGZhbHNlKSwgbWFza3NUb0JvdW5kcyhm
YWxzZSksCisgICAgICAgICAgICAgICAgICBkcmF3c0NvbnRlbnQoZmFsc2UpLCBjb250ZW50c09w
YXF1ZShmYWxzZSksIGJhY2tmYWNlVmlzaWJpbGl0eShmYWxzZSksCisgICAgICAgICAgICAgICAg
ICBkaXN0cmlidXRlT3BhY2l0eShmYWxzZSkKKyAgICAgICAgeworICAgICAgICB9CisgICAgfSBz
dGF0ZTsKKworcHVibGljOgorICAgIEdyYXBoaWNzTGF5ZXJRdFByaXZhdGUoR3JhcGhpY3NMYXll
clF0KiBuZXdMYXllciwgR3JhcGhpY3NMYXllckNsaWVudCogbmV3Q2xpZW50KQorICAgICAgICAg
ICAgOiBRR3JhcGhpY3NPYmplY3QoMCkKKyAgICAgICAgICAgICwgbGF5ZXIobmV3TGF5ZXIpCisg
ICAgICAgICAgICAsIHRyYW5zZm9ybUFuaW1hdGlvblJ1bm5pbmcoZmFsc2UpCisgICAgICAgICAg
ICAsIHBvc3NpYmxlQ2hhbmdlcyhOb0NoYW5nZXMpCisKKyAgICB7CisgICAgICAgIHRoaXMtPmNs
aWVudCA9IG5ld0NsaWVudDsKKworICAgICAgICAvLyBiZXR0ZXIgdG8gY2FsY3VsYXRlIHRoZSBl
eHBvc2VkIHJlY3QgaW4gUUdyYXBoaWNzVmlldyB0aGFuIG92ZXItcmVuZGVyIGluIFdlYkNvcmUK
KyAgICAgICAgLy8gdGhvdWdoIHRoaXMgbWlnaHQgYmUgdHdlYWthYmxlCisgICAgICAgIHNldEZs
YWcoUUdyYXBoaWNzSXRlbTo6SXRlbVVzZXNFeHRlbmRlZFN0eWxlT3B0aW9uLCB0cnVlKTsKKwor
ICAgICAgICAvLyB3ZSB1c2UgZ3JhcGhpY3MtdmlldyBmb3IgY29tcG9zaXRpbmcsIG5vdCBmb3Ig
aW50ZXJhY3Rpdml0eQorICAgICAgICBzZXRBY2NlcHRlZE1vdXNlQnV0dG9ucyhRdDo6Tm9CdXR0
b24pOworICAgICAgICBzZXRFbmFibGVkKGZhbHNlKTsKKworICAgICAgICAvLyB3ZSdsbCBzZXQg
dGhlIGNhY2hlIHdoZW4gd2Uga25vdyB3aGF0J3MgZ29pbmcgb24KKyAgICAgICAgc2V0Q2FjaGVN
b2RlKE5vQ2FjaGUpOworICAgIH0KKworICAgIHZpcnR1YWwgfkdyYXBoaWNzTGF5ZXJRdFByaXZh
dGUoKQorICAgIHsKKyAgICAgICAgZm9yZWFjaCAoUUdyYXBoaWNzSXRlbSogaSwgY2hpbGRJdGVt
cygpKSB7CisgICAgICAgICAgICBpZiAoc2NlbmUoKSkKKyAgICAgICAgICAgICAgICBzY2VuZSgp
LT5yZW1vdmVJdGVtKGkpOworICAgICAgICAgICAgaS0+c2V0UGFyZW50SXRlbSgwKTsKKyAgICAg
ICAgfQorCisgICAgICAgIGZvcmVhY2ggKFFXZWFrUG9pbnRlcjxRQWJzdHJhY3RBbmltYXRpb24+
IGFuaW0sIGFuaW1hdGlvbnMpIHsKKyAgICAgICAgICAgIGlmIChhbmltKQorICAgICAgICAgICAg
ICAgIGRlbGV0ZSBhbmltLmRhdGEoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgc2V0
QmFzZVRyYW5zZm9ybShjb25zdCBRVHJhbnNmb3JtJiB0KQorICAgIHsKKyAgICAgICAgaWYgKGxh
eWVyKSB7CisgICAgICAgICAgICBRUG9pbnRGIG9yaWdpblRyYW5zbGF0ZSgKKyAgICAgICAgICAg
ICAgICAgICAgbGF5ZXItPmFuY2hvclBvaW50KCkueCgpKmxheWVyLT5zaXplKCkud2lkdGgoKSwg
bGF5ZXItPmFuY2hvclBvaW50KCkueSgpKmxheWVyLT5zaXplKCkuaGVpZ2h0KCkpOworICAgICAg
ICAgICAgcmVzZXRUcmFuc2Zvcm0oKTsKKworICAgICAgICAgICAgLy8gd2UgaGF2ZSB0byBtYW5h
Z2UgdGhpcyBvdXJzZWx2ZXMgYmVjYXVzZSBRR3JhcGhpY3NWaWV3J3MgdHJhbnNmb3JtT3JpZ2lu
IGlzIGluY29tcGxldGUKKyAgICAgICAgICAgIHRyYW5zbGF0ZShvcmlnaW5UcmFuc2xhdGUueCgp
LCBvcmlnaW5UcmFuc2xhdGUueSgpKTsKKyAgICAgICAgICAgIHNldFRyYW5zZm9ybSh0LCB0cnVl
KTsKKyAgICAgICAgICAgIHRyYW5zbGF0ZSgtb3JpZ2luVHJhbnNsYXRlLngoKSwgLW9yaWdpblRy
YW5zbGF0ZS55KCkpOworICAgICAgICAgICAgYlRyYW5zZm9ybSA9IHQ7CisgICAgICAgIH0KKyAg
ICB9CisKKyAgICBRVHJhbnNmb3JtIGJhc2VUcmFuc2Zvcm0oKSBjb25zdAorICAgIHsKKyAgICAg
ICAgcmV0dXJuIGJUcmFuc2Zvcm07CisgICAgfQorCisgICAgdmlydHVhbCBRUGFpbnRlclBhdGgg
b3BhcXVlQXJlYSgpIGNvbnN0CisgICAgeworICAgICAgICBRUGFpbnRlclBhdGggcHA7CisgICAg
ICAgIGlmIChjdXJDb250ZW50LmJnY29sb3JWYWxpZCAmJiBjdXJDb250ZW50LmJnY29sb3IuYWxw
aGEoKSA9PSAweGZmKQorICAgICAgICAgICAgcHAuYWRkUmVjdChib3VuZGluZ1JlY3QoKSk7Cisg
ICAgICAgIGVsc2UgeworICAgICAgICAgICAgaWYgKHN0YXRlLmNvbnRlbnRzT3BhcXVlCisgICAg
ICAgICAgICAgICAgfHwgKGN1ckNvbnRlbnQuY29udGVudFR5cGUgPT0gQ29sb3JDb250ZW50VHlw
ZSAmJiBjdXJDb250ZW50LmNvbnRlbnRzQmdDb2xvci5hbHBoYSgpID09IDB4ZmYpCisgICAgICAg
ICAgICAgICAgfHwgKGN1ckNvbnRlbnQuY29udGVudFR5cGUgPT0gUGl4bWFwQ29udGVudFR5cGUg
JiYgIWN1ckNvbnRlbnQucGl4bWFwLmhhc0FscGhhKCkpKSB7CisKKyAgICAgICAgICAgICAgICBw
cC5hZGRSZWN0KHN0YXRlLmNvbnRlbnRzUmVjdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0K
KyAgICAgICAgcmV0dXJuIHBwOworICAgIH0KKworICAgIHZpcnR1YWwgUVJlY3RGIGJvdW5kaW5n
UmVjdCgpIGNvbnN0CisgICAgeworICAgICAgIHJldHVybiBRUmVjdEYoUVBvaW50RigwLCAwKSwg
UVNpemVGKHNpemUpKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgcGFpbnQoUVBhaW50ZXIq
IHBhaW50ZXIsIGNvbnN0IFFTdHlsZU9wdGlvbkdyYXBoaWNzSXRlbSogb3B0LCBRV2lkZ2V0KiB3
aWRnZXQpCisgICAgeworICAgICAgICBpZiAoc3RhdGUubWFza0xheWVyICYmIHN0YXRlLm1hc2tM
YXllci0+cGxhdGZvcm1MYXllcigpKSB7CisgICAgICAgICAgICAvLyBtYXliZSB0aGlzIHNob3Vs
ZG4ndCBiZSBpbiAicGFpbnQiIChyZW5kZXJpbmcgdGhlIG1hc2stbGF5ZXIpCisgICAgICAgICAg
ICAvLyB0aG91Z2ggaXQgZG9lcyB3b3JrIGZvciBub3cKKyAgICAgICAgICAgIEdyYXBoaWNzTGF5
ZXJRdFByaXZhdGUqIG90aGVyTWFzayA9IChHcmFwaGljc0xheWVyUXRQcml2YXRlKilzdGF0ZS5t
YXNrTGF5ZXItPnBsYXRmb3JtTGF5ZXIoKTsKKyAgICAgICAgICAgIG90aGVyTWFzay0+YXBwbHlD
aGFuZ2VzKHRydWUpOworICAgICAgICAgICAgaWYgKCFncmFwaGljc0VmZmVjdCgpKSB7CisgICAg
ICAgICAgICAgICAgUVBpeG1hcCBtYXNrKFFTaXplKHN0YXRlLm1hc2tMYXllci0+c2l6ZSgpLndp
ZHRoKCksIHN0YXRlLm1hc2tMYXllci0+c2l6ZSgpLmhlaWdodCgpKSk7CisgICAgICAgICAgICAg
ICAgbWFzay5maWxsKFF0Ojp0cmFuc3BhcmVudCk7CisgICAgICAgICAgICAgICAgeworICAgICAg
ICAgICAgICAgICAgICBRUGFpbnRlciBwKCZtYXNrKTsKKyAgICAgICAgICAgICAgICAgICAgcC5z
ZXRSZW5kZXJIaW50cyhwYWludGVyLT5yZW5kZXJIaW50cygpLCB0cnVlKTsKKyAgICAgICAgICAg
ICAgICAgICAgcC5zZXRDb21wb3NpdGlvbk1vZGUoUVBhaW50ZXI6OkNvbXBvc2l0aW9uTW9kZV9T
b3VyY2UpOworICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxHcmFwaGljc0xheWVyUXRQ
cml2YXRlKj4oc3RhdGUubWFza0xheWVyLT5wbGF0Zm9ybUxheWVyKCkpLT5kcmF3Q29udGVudHMo
JnAsIG9wdC0+ZXhwb3NlZFJlY3QsIHRydWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgICAgICBRR3JhcGhpY3NPcGFjaXR5RWZmZWN0KiBlZmYgPSBuZXcgUUdyYXBoaWNzT3BhY2l0
eUVmZmVjdCh0aGlzKTsKKyAgICAgICAgICAgICAgICBlZmYtPnNldE9wYWNpdHkoMSk7CisgICAg
ICAgICAgICAgICAgZWZmLT5zZXRPcGFjaXR5TWFzayhRQnJ1c2gobWFzaykpOworICAgICAgICAg
ICAgICAgIHNldEdyYXBoaWNzRWZmZWN0KGVmZik7CisgICAgICAgICAgICB9CisgICAgICAgIH0K
KyAgICAgICAgZHJhd0NvbnRlbnRzKHBhaW50ZXIsIG9wdC0+ZXhwb3NlZFJlY3QpOworICAgIH0K
KworICAgIHZvaWQgZHJhd0NvbnRlbnRzKFFQYWludGVyKiBwYWludGVyLCBjb25zdCBRUmVjdEYm
IHIsIGJvb2wgbWFzayA9IGZhbHNlKQorICAgIHsKKyAgICAgICAgUVJlY3QgcmVjdCA9IHIudG9S
ZWN0KCkuYWRqdXN0ZWQoLTEsIC0xLCAxLCAxKTsKKyAgICAgICAgaWYgKGN1ckNvbnRlbnQuY29u
dGVudFR5cGUgIT0gTm9Db250ZW50VHlwZSAmJiAhc3RhdGUuY29udGVudHNSZWN0LmlzRW1wdHko
KSkKKyAgICAgICAgICAgIHJlY3QgPSByZWN0LmludGVyc2VjdGVkKHN0YXRlLmNvbnRlbnRzUmVj
dCk7CisgICAgICAgIGlmIChjdXJDb250ZW50LmJnY29sb3JWYWxpZCkKKyAgICAgICAgICAgIHBh
aW50ZXItPmZpbGxSZWN0KHIsIFFDb2xvcihjdXJDb250ZW50LmJnY29sb3IpKTsKKyAgICAgICAg
aWYgKCFyZWN0LmlzRW1wdHkoKSkgeworICAgICAgICAgICAgc3dpdGNoIChjdXJDb250ZW50LmNv
bnRlbnRUeXBlKSB7CisgICAgICAgICAgICBjYXNlIFBpeG1hcENvbnRlbnRUeXBlOiB7CisgICAg
ICAgICAgICAgICAgUVBpeG1hcCBweG0gPSBjdXJDb250ZW50LnBpeG1hcC5zY2FsZWQoc3RhdGUu
Y29udGVudHNSZWN0LnNpemUoKSk7CisgICAgICAgICAgICAgICAgcGFpbnRlci0+ZHJhd1BpeG1h
cChyZWN0LnRvcExlZnQoKSwgcHhtLCByKTsKKyAgICAgICAgICAgICAgICB9IGJyZWFrOworICAg
ICAgICAgICAgY2FzZSBDb2xvckNvbnRlbnRUeXBlOgorICAgICAgICAgICAgICAgIHBhaW50ZXIt
PmZpbGxSZWN0KHJlY3QsIGN1ckNvbnRlbnQucGl4bWFwKTsKKyAgICAgICAgICAgICAgICBicmVh
azsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmRyYXdz
Q29udGVudCkgeworICAgICAgICAgICAgICAgICAgICBHcmFwaGljc0NvbnRleHQgZ2MocGFpbnRl
cik7CisgICAgICAgICAgICAgICAgICAgIGxheWVyLT5wYWludEdyYXBoaWNzTGF5ZXJDb250ZW50
cyhnYywgcmVjdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOwor
ICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisKKyAgICB2b2lkIG5vdGVDaGFuZ2Uo
UG9zc2libGVDaGFuZ2UgcGMpCisgICAgeworICAgICAgICBpZiAoIXRoaXMpCisgICAgICAgICAg
ICByZXR1cm47CisKKyAgICAgICAgcG9zc2libGVDaGFuZ2VzID0gKFBvc3NpYmxlQ2hhbmdlKSgo
aW50KXBvc3NpYmxlQ2hhbmdlcyB8IChpbnQpcGMpOworICAgICAgICBpZiAobGF5ZXItPmNsaWVu
dCgpKQorICAgICAgICAgICAgbGF5ZXItPmNsaWVudCgpLT5ub3RpZnlTeW5jUmVxdWlyZWQobGF5
ZXIpOworICAgIH0KKworICAgIHZvaWQgc2F2ZUN1cnJlbnRTdGF0ZSgpCisgICAgeworICAgICAg
ICBzdGF0ZS5tYXNrTGF5ZXIgPSBsYXllci0+bWFza0xheWVyKCk7CisgICAgICAgIHN0YXRlLnBv
cyA9IGxheWVyLT5wb3NpdGlvbigpOworICAgICAgICBzdGF0ZS5hbmNob3JQb2ludCA9IGxheWVy
LT5hbmNob3JQb2ludCgpOworICAgICAgICBzdGF0ZS5zaXplID0gbGF5ZXItPnNpemUoKTsKKyAg
ICAgICAgc3RhdGUudHJhbnNmb3JtID0gbGF5ZXItPnRyYW5zZm9ybSgpOworICAgICAgICBzdGF0
ZS5nZW9PcmllbnRhdGlvbiA9IGxheWVyLT5nZW9tZXRyeU9yaWVudGF0aW9uKCk7CisgICAgICAg
IHN0YXRlLmNvbnRlbnRzT3JpZW50YXRpb24gPSBsYXllci0+Y29udGVudHNPcmllbnRhdGlvbigp
OworICAgICAgICBzdGF0ZS5vcGFjaXR5ID0gbGF5ZXItPm9wYWNpdHkoKTsKKyAgICAgICAgc3Rh
dGUuY29udGVudHNSZWN0ID0gbGF5ZXItPmNvbnRlbnRzUmVjdCgpOworICAgICAgICBzdGF0ZS5w
cmVzZXJ2ZXMzRCA9IGxheWVyLT5wcmVzZXJ2ZXMzRCgpOworICAgICAgICBzdGF0ZS5tYXNrc1Rv
Qm91bmRzID0gbGF5ZXItPm1hc2tzVG9Cb3VuZHMoKTsKKyAgICAgICAgc3RhdGUuZHJhd3NDb250
ZW50ID0gbGF5ZXItPmRyYXdzQ29udGVudCgpOworICAgICAgICBzdGF0ZS5jb250ZW50c09wYXF1
ZSA9IGxheWVyLT5jb250ZW50c09wYXF1ZSgpOworICAgICAgICBzdGF0ZS5iYWNrZmFjZVZpc2li
aWxpdHkgPSBsYXllci0+YmFja2ZhY2VWaXNpYmlsaXR5KCk7CisgICAgICAgIGN1ckNvbnRlbnQu
cGl4bWFwID0gcGVuZGluZ0NvbnRlbnQucGl4bWFwOworICAgICAgICBjdXJDb250ZW50LmNvbnRl
bnRUeXBlID0gcGVuZGluZ0NvbnRlbnQuY29udGVudFR5cGU7CisgICAgICAgIGN1ckNvbnRlbnQu
Ymdjb2xvciA9IHBlbmRpbmdDb250ZW50LmJnY29sb3I7CisgICAgICAgIGN1ckNvbnRlbnQuYmdj
b2xvclZhbGlkID0gcGVuZGluZ0NvbnRlbnQuYmdjb2xvclZhbGlkOworICAgICAgICBjdXJDb250
ZW50LnJlZ2lvblRvVXBkYXRlIHw9IHBlbmRpbmdDb250ZW50LnJlZ2lvblRvVXBkYXRlOworICAg
ICAgICBjdXJDb250ZW50LnVwZGF0ZUFsbCB8PSBwZW5kaW5nQ29udGVudC51cGRhdGVBbGw7Cisg
ICAgICAgIGN1ckNvbnRlbnQuY29udGVudHNCZ0NvbG9yID0gcGVuZGluZ0NvbnRlbnQuY29udGVu
dHNCZ0NvbG9yOworICAgICAgICBwZW5kaW5nQ29udGVudC5yZWdpb25Ub1VwZGF0ZSA9IFFSZWdp
b24oKTsKKyAgICAgICAgcGVuZGluZ0NvbnRlbnQudXBkYXRlQWxsID0gZmFsc2U7CisgICAgICAg
IHBvc3NpYmxlQ2hhbmdlcyA9IE5vQ2hhbmdlczsKKyAgICB9CisgICAgdm9pZCBhcHBseUNoYW5n
ZXMoYm9vbCByZWN1cnNpdmUgPSB0cnVlKQorICAgIHsKKyAgICAgICAgaWYgKGxheWVyKSB7Cisg
ICAgICAgICAgICBpZiAocG9zc2libGVDaGFuZ2VzICE9IE5vQ2hhbmdlcykgeworICAgICAgICAg
ICAgICAgIGlmIChjdXJDb250ZW50LmNvbnRlbnRUeXBlID09IE5vQ29udGVudFR5cGUpCisgICAg
ICAgICAgICAgICAgaWYgKHBvc3NpYmxlQ2hhbmdlcyAmIFBhcmVudENoYW5nZSkgeworICAgICAg
ICAgICAgICAgICAgICBpZiAoIWxheWVyLT5wYXJlbnQoKSAmJiAhcGFyZW50SXRlbSgpKQorICAg
ICAgICAgICAgICAgICAgICAgICAgc2V0UGFyZW50SXRlbSgwKTsKKyAgICAgICAgICAgICAgICAg
ICAgZWxzZSBpZiAobGF5ZXIgJiYgbGF5ZXItPnBhcmVudCgpICYmIGxheWVyLT5wYXJlbnQoKS0+
bmF0aXZlTGF5ZXIoKSAhPSBwYXJlbnRJdGVtKCkpCisgICAgICAgICAgICAgICAgICAgICAgICBz
ZXRQYXJlbnRJdGVtKGxheWVyLT5wYXJlbnQoKS0+bmF0aXZlTGF5ZXIoKSk7CisgICAgICAgICAg
ICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChwb3NzaWJsZUNoYW5nZXMgJiBDaGlsZHJlbkNo
YW5nZSkgeworICAgICAgICAgICAgICAgICAgICBRU2V0PFFHcmFwaGljc0l0ZW0qPiBjdXJDaGls
ZHJlbiwgbmV3Q2hpbGRyZW47CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZlY3RvcjxHcmFw
aGljc0xheWVyKj4gbmV3Q2hpbGRyZW5WZWN0b3IgPSAobGF5ZXItPmNoaWxkcmVuKCkpOworICAg
ICAgICAgICAgICAgICAgICBjdXJDaGlsZHJlbi5yZXNlcnZlKGNoaWxkSXRlbXMoKS5zaXplKCkp
OworICAgICAgICAgICAgICAgICAgICBuZXdDaGlsZHJlbi5yZXNlcnZlKG5ld0NoaWxkcmVuVmVj
dG9yLnNpemUoKSk7CisKKyAgICAgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkg
PCBuZXdDaGlsZHJlblZlY3Rvci5zaXplKCk7ICsraSkKKyAgICAgICAgICAgICAgICAgICAgICAg
IG5ld0NoaWxkcmVuLmluc2VydChuZXdDaGlsZHJlblZlY3RvcltpXS0+cGxhdGZvcm1MYXllcigp
KTsKKworICAgICAgICAgICAgICAgICAgICBmb3IgKFFMaXN0PFFHcmFwaGljc0l0ZW0qPjo6Y29u
c3RfaXRlcmF0b3IgaXQgPSBjaGlsZEl0ZW1zKCkuYmVnaW4oKTsgaXQgIT0gY2hpbGRJdGVtcygp
LmVuZCgpOyArK2l0KQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCppdCkKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBjdXJDaGlsZHJlbi5pbnNlcnQoKml0KTsKKworICAgICAgICAg
ICAgICAgICAgICBjb25zdCBRU2V0PFFHcmFwaGljc0l0ZW0qPiBjaGlsZHJlblRvQWRkID0gbmV3
Q2hpbGRyZW4gLSBjdXJDaGlsZHJlbjsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgUVNldDxR
R3JhcGhpY3NJdGVtKj4gY2hpbGRyZW5Ub1JlbW92ZSA9IGN1ckNoaWxkcmVuIC0gbmV3Q2hpbGRy
ZW47CisgICAgICAgICAgICAgICAgICAgIGZvciAoUVNldDxRR3JhcGhpY3NJdGVtKj46OmNvbnN0
X2l0ZXJhdG9yIGl0ID0gY2hpbGRyZW5Ub0FkZC5iZWdpbigpOyBpdCAhPSBjaGlsZHJlblRvQWRk
LmVuZCgpOyArK2l0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgUUdyYXBoaWNzSXRlbSog
dyA9ICppdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodykKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICB3LT5zZXRQYXJlbnRJdGVtKHRoaXMpOworICAgICAgICAgICAgICAgICAg
ICB9CisgICAgICAgICAgICAgICAgICAgIGZvciAoUVNldDxRR3JhcGhpY3NJdGVtKj46OmNvbnN0
X2l0ZXJhdG9yIGl0ID0gY2hpbGRyZW5Ub1JlbW92ZS5iZWdpbigpOyBpdCAhPSBjaGlsZHJlblRv
UmVtb3ZlLmVuZCgpOyArK2l0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBRR3JhcGhpY3NJ
dGVtKiB3ID0gKml0OworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHcpCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgdy0+c2V0UGFyZW50SXRlbSgwKTsKKyAgICAgICAgICAgICAgICAg
ICAgfQorICAgICAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG5ld0NoaWxk
cmVuVmVjdG9yLnNpemUoKTsgKytpKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld0No
aWxkcmVuVmVjdG9yW2ldLT5wbGF0Zm9ybUxheWVyKCkpCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgbmV3Q2hpbGRyZW5WZWN0b3JbaV0tPnBsYXRmb3JtTGF5ZXIoKS0+c2V0WlZhbHVlKGkp
OworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChwb3NzaWJsZUNoYW5n
ZXMgJiBNYXNrTGF5ZXJDaGFuZ2UpIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0R3JhcGhpY3NF
ZmZlY3QoMCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChsYXllci0+bWFza0xheWVyKCkpCisg
ICAgICAgICAgICAgICAgICAgICAgICBzZXRGbGFnKEl0ZW1DbGlwc0NoaWxkcmVuVG9TaGFwZSwg
dHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAg
IHNldEZsYWcoSXRlbUNsaXBzQ2hpbGRyZW5Ub1NoYXBlLCBsYXllci0+bWFza3NUb0JvdW5kcygp
KTsKKyAgICAgICAgICAgICAgICAgICAgdXBkYXRlKCk7CisgICAgICAgICAgICAgICAgfQorICAg
ICAgICAgICAgICAgIGlmIChwb3NzaWJsZUNoYW5nZXMgJiBQb3NpdGlvbkNoYW5nZSkgeworICAg
ICAgICAgICAgICAgICAgICBpZiAobGF5ZXItPnBvc2l0aW9uKCkgIT0gc3RhdGUucG9zKSB7Cisg
ICAgICAgICAgICAgICAgICAgICAgICBzZXRQb3MobGF5ZXItPnBvc2l0aW9uKCkueCgpLAorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyLT5wb3NpdGlvbigpLnkoKSk7CisgICAg
ICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBp
ZiAocG9zc2libGVDaGFuZ2VzICYgU2l6ZUNoYW5nZSkgeworICAgICAgICAgICAgICAgICAgICBp
ZiAobGF5ZXItPnNpemUoKSAhPSBzdGF0ZS5zaXplKSB7CisgICAgICAgICAgICAgICAgICAgICAg
ICBwcmVwYXJlR2VvbWV0cnlDaGFuZ2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemUg
PSBRU2l6ZUYobGF5ZXItPnNpemUoKS53aWR0aCgpLCBsYXllci0+c2l6ZSgpLmhlaWdodCgpKTsK
KyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAg
ICAgIGlmIChwb3NzaWJsZUNoYW5nZXMgJiAoVHJhbnNmb3JtQ2hhbmdlIHwgQW5jaG9yUG9pbnRD
aGFuZ2UgfCBTaXplQ2hhbmdlKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUudHJh
bnNmb3JtICE9IGxheWVyLT50cmFuc2Zvcm0oKSB8fCBzdGF0ZS5hbmNob3JQb2ludCAhPSBsYXll
ci0+YW5jaG9yUG9pbnQoKSB8fCBzdGF0ZS5zaXplICE9IGxheWVyLT5zaXplKCkpCisgICAgICAg
ICAgICAgICAgICAgICAgICBzZXRCYXNlVHJhbnNmb3JtKFFUcmFuc2Zvcm0obGF5ZXItPnRyYW5z
Zm9ybSgpKSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gIG5vdCBz
dXJlIHRoaXMgaXMgcmlnaHQKKyAgICAgICAgICAgICAgICBpZiAocG9zc2libGVDaGFuZ2VzICYg
Q2hpbGRyZW5UcmFuc2Zvcm1DaGFuZ2UpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRl
LmNoaWxkcmVuVHJhbnNmb3JtICE9IGxheWVyLT5jaGlsZHJlblRyYW5zZm9ybSgpKSB7CisgICAg
ICAgICAgICAgICAgICAgICAgICBjb25zdCBRVHJhbnNmb3JtIHRyKGxheWVyLT5jaGlsZHJlblRy
YW5zZm9ybSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFFMaXN0PFFHcmFwaGljc0l0ZW0q
PiBjaCA9IGNoaWxkSXRlbXMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoUUxpc3Q8
UUdyYXBoaWNzSXRlbSo+OjppdGVyYXRvciBpdCA9IGNoLmJlZ2luKCk7IGl0ICE9IGNoLmVuZCgp
OyArK2l0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqaXQpLT5zZXRUcmFuc2Zvcm0o
dHIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAg
ICAgICAgIGlmIChwb3NzaWJsZUNoYW5nZXMgJiAoQ29udGVudENoYW5nZSB8IERyYXdzQ29udGVu
dENoYW5nZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChwZW5kaW5nQ29udGVudC5j
b250ZW50VHlwZSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIFBpeG1hcENvbnRlbnRUeXBl
OgorICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q2FjaGVNb2RlKFFHcmFwaGljc0l0ZW06Ok5v
Q2FjaGUpOworICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlKCk7CisgICAgICAgICAgICAg
ICAgICAgICAgICBzdGF0ZS5kcmF3c0NvbnRlbnQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAg
ICAgICAgIHNldEZsYWcoSXRlbUhhc05vQ29udGVudHMsIGZhbHNlKTsKKyAgICAgICAgICAgICAg
ICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIENvbG9yQ29udGVudFR5
cGU6CisgICAgICAgICAgICAgICAgICAgICAgICBzZXRDYWNoZU1vZGUoUUdyYXBoaWNzSXRlbTo6
Tm9DYWNoZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGVuZGluZ0NvbnRlbnQuY29u
dGVudFR5cGUgIT0gY3VyQ29udGVudC5jb250ZW50VHlwZQorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIHx8IHBlbmRpbmdDb250ZW50LmNvbnRlbnRzQmdDb2xvciAhPSBjdXJDb250ZW50LmNv
bnRlbnRzQmdDb2xvcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGUo
KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0
YXRlLmRyYXdzQ29udGVudCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgc2V0Rmxh
ZyhJdGVtSGFzTm9Db250ZW50cywgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJl
YWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgTm9Db250ZW50VHlwZToKKyAgICAgICAgICAg
ICAgICAgICAgICAgIGlmIChwZW5kaW5nQ29udGVudC5jb250ZW50VHlwZSAhPSBjdXJDb250ZW50
LmNvbnRlbnRUeXBlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZSgpOworICAg
ICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmRyYXdzQ29udGVudCAhPSBsYXllci0+ZHJh
d3NDb250ZW50KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0YXRlLmRy
YXdzQ29udGVudCAmJiBsYXllci0+ZHJhd3NDb250ZW50KCkpCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIHVwZGF0ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAg
ICAgICAgICAgICAgICAgICAgc2V0Q2FjaGVNb2RlKGxheWVyLT5kcmF3c0NvbnRlbnQoKT9EZXZp
Y2VDb29yZGluYXRlQ2FjaGU6Tm9DYWNoZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXRG
bGFnKEl0ZW1IYXNOb0NvbnRlbnRzLCAhbGF5ZXItPmRyYXdzQ29udGVudCgpKTsKKyAgICAgICAg
ICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHBvc3NpYmxlQ2hhbmdlcyAmIEdlb09yaWVu
dGF0aW9uQ2hhbmdlKSB7CisgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogc29tZSBtaXJyb3Jp
bmcsIG5lZWQgYSB0ZXN0LWNhc2UKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAg
ICBpZiAocG9zc2libGVDaGFuZ2VzICYgQ29udGVudHNPcmllbnRhdGlvbkNoYW5nZSkgeworICAg
ICAgICAgICAgICAgICAgICAvLyBUT0RPCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAg
ICAgIGlmIChwb3NzaWJsZUNoYW5nZXMgJiBPcGFjaXR5Q2hhbmdlKQorICAgICAgICAgICAgICAg
ICAgICBpZiAoc3RhdGUub3BhY2l0eSAhPSBsYXllci0+b3BhY2l0eSgpKQorICAgICAgICAgICAg
ICAgICAgICAgICAgc2V0T3BhY2l0eShsYXllci0+b3BhY2l0eSgpKTsKKworICAgICAgICAgICAg
ICAgIGlmIChwb3NzaWJsZUNoYW5nZXMgJiBDb250ZW50c1JlY3RDaGFuZ2UpIHsKKyAgICAgICAg
ICAgICAgICAgICAgUVJlY3QgcihsYXllci0+Y29udGVudHNSZWN0KCkpOworICAgICAgICAgICAg
ICAgICAgICBpZiAoc3RhdGUuY29udGVudHNSZWN0ICE9IHIpIHsKKyAgICAgICAgICAgICAgICAg
ICAgICAgIHN0YXRlLmNvbnRlbnRzUmVjdCA9IHI7CisgICAgICAgICAgICAgICAgICAgICAgICB1
cGRhdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAg
ICAgICAgICAgICAgIGlmIChwb3NzaWJsZUNoYW5nZXMgJiBNYXNrc1RvQm91bmRzQ2hhbmdlKSB7
ICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLm1hc2tz
VG9Cb3VuZHMgIT0gbGF5ZXItPm1hc2tzVG9Cb3VuZHMoKSkgeworICAgICAgICAgICAgICAgICAg
ICAgICAgc2V0RmxhZyhRR3JhcGhpY3NJdGVtOjpJdGVtQ2xpcHNUb1NoYXBlLCBsYXllci0+bWFz
a3NUb0JvdW5kcygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldEZsYWcoUUdyYXBoaWNz
SXRlbTo6SXRlbUNsaXBzQ2hpbGRyZW5Ub1NoYXBlLCBsYXllci0+bWFza3NUb0JvdW5kcygpKTsK
KyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAg
ICBpZiAocG9zc2libGVDaGFuZ2VzICYgQ29udGVudHNPcGFxdWVDaGFuZ2UpIHsKKyAgICAgICAg
ICAgICAgICAgICAgaWYgKHN0YXRlLmNvbnRlbnRzT3BhcXVlICE9IGxheWVyLT5jb250ZW50c09w
YXF1ZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgcHJlcGFyZUdlb21ldHJ5Q2hhbmdlKCk7
CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChwb3NzaWJsZUNoYW5nZXMg
JiBCYWNrZmFjZVZpc2liaWxpdHlDaGFuZ2UpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVE9E
TworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocG9zc2libGVDaGFuZ2Vz
ICYgRGlzcGxheUNoYW5nZSkgeworICAgICAgICAgICAgICAgICAgICBpZiAocGVuZGluZ0NvbnRl
bnQudXBkYXRlQWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlKCk7CisgICAgICAg
ICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZShwZW5kaW5n
Q29udGVudC5yZWdpb25Ub1VwZGF0ZS5ib3VuZGluZ1JlY3QoKSk7CisgICAgICAgICAgICAgICAg
fQorCisgICAgICAgICAgICAgICAgaWYgKHBvc3NpYmxlQ2hhbmdlcyAmIEJhY2tncm91bmRDb2xv
ckNoYW5nZSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoKHBlbmRpbmdDb250ZW50LmJnY29s
b3JWYWxpZCAhPSBjdXJDb250ZW50LmJnY29sb3JWYWxpZCkKKyAgICAgICAgICAgICAgICAgICAg
ICAgIHx8IChwZW5kaW5nQ29udGVudC5iZ2NvbG9yVmFsaWQgJiYgKHBlbmRpbmdDb250ZW50LmJn
Y29sb3IgIT0gY3VyQ29udGVudC5iZ2NvbG9yKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAg
IHVwZGF0ZSgpOworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9Cisg
ICAgICAgICAgICAgICAgc2F2ZUN1cnJlbnRTdGF0ZSgpOworICAgICAgICAgICAgfQorICAgICAg
ICB9CisgICAgICAgIGlmIChyZWN1cnNpdmUpIHsKKyAgICAgICAgICAgIFFMaXN0PFFHcmFwaGlj
c0l0ZW0qPiBjaCA9IGNoaWxkSXRlbXMoKTsKKyAgICAgICAgICAgIGZvcmVhY2ggKFFHcmFwaGlj
c0l0ZW0qIGl0ZW0sIGNoKSB7CisgICAgICAgICAgICAgICAgR3JhcGhpY3NMYXllclF0UHJpdmF0
ZSogd2RnID0gcW9iamVjdF9jYXN0PEdyYXBoaWNzTGF5ZXJRdFByaXZhdGUqPihpdGVtLT50b0dy
YXBoaWNzT2JqZWN0KCkpOworICAgICAgICAgICAgICAgIGlmICh3ZGcpIAorICAgICAgICAgICAg
ICAgICAgICB3ZGctPmFwcGx5Q2hhbmdlcyh0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAg
fQorICAgIH0KKyAgICBwdWJsaWMgc2xvdHM6CisgICAgdm9pZCBub3RpZnlBbmltU3RhcnRlZCgp
CisgICAgeworICAgICAgICBjbGllbnQtPm5vdGlmeUFuaW1hdGlvblN0YXJ0ZWQobGF5ZXIsIFdU
Rjo6Y3VycmVudFRpbWUoKSk7CisgICAgfQorCit9OworCisKK0dyYXBoaWNzTGF5ZXJRdDo6R3Jh
cGhpY3NMYXllclF0KEdyYXBoaWNzTGF5ZXJDbGllbnQqIGNsaWVudCkKKyAgICAgICAgOkdyYXBo
aWNzTGF5ZXIoY2xpZW50KQorICAgICAgICAsIHF0TGF5ZXIobmV3IEdyYXBoaWNzTGF5ZXJRdFBy
aXZhdGUodGhpcywgY2xpZW50KSkKK3sKK30KK0dyYXBoaWNzTGF5ZXJRdDo6fkdyYXBoaWNzTGF5
ZXJRdCgpCit7CisgICAgZGVsZXRlIHF0TGF5ZXI7Cit9CisKKworUGFzc093blB0cjxHcmFwaGlj
c0xheWVyPiBHcmFwaGljc0xheWVyOjpjcmVhdGUoR3JhcGhpY3NMYXllckNsaWVudCogY2xpZW50
KQoreworICAgIHJldHVybiBuZXcgR3JhcGhpY3NMYXllclF0KGNsaWVudCk7Cit9CisKK0dyYXBo
aWNzTGF5ZXI6OkNvbXBvc2l0aW5nQ29vcmRpbmF0ZXNPcmllbnRhdGlvbiBHcmFwaGljc0xheWVy
Ojpjb21wb3NpdGluZ0Nvb3JkaW5hdGVzT3JpZW50YXRpb24oKQoreworICAgIHJldHVybiBDb21w
b3NpdGluZ0Nvb3JkaW5hdGVzVG9wRG93bjsKK30KKwordm9pZCBHcmFwaGljc0xheWVyUXQ6OnNl
dE5lZWRzRGlzcGxheSgpCit7CisgICAgcXRMYXllci0+cGVuZGluZ0NvbnRlbnQudXBkYXRlQWxs
ID0gdHJ1ZTsKKyAgICBxdExheWVyLT5ub3RlQ2hhbmdlKEdyYXBoaWNzTGF5ZXJRdFByaXZhdGU6
OkRpc3BsYXlDaGFuZ2UpOworfQordm9pZCBHcmFwaGljc0xheWVyUXQ6OnNldE5lZWRzRGlzcGxh
eUluUmVjdChjb25zdCBGbG9hdFJlY3QmIHIpCit7CisgICAgcXRMYXllci0+cGVuZGluZ0NvbnRl
bnQucmVnaW9uVG9VcGRhdGV8PSBRUmVjdEYocikudG9SZWN0KCkuYWRqdXN0ZWQoLTEsIC0xLCAx
LCAxKTsKKyAgICBxdExheWVyLT5ub3RlQ2hhbmdlKEdyYXBoaWNzTGF5ZXJRdFByaXZhdGU6OkRp
c3BsYXlDaGFuZ2UpOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJRdDo6c2V0TmFtZShjb25zdCBT
dHJpbmcmIG5hbWUpCit7CisgICAgcXRMYXllci0+c2V0T2JqZWN0TmFtZShRU3RyaW5nKG5hbWUp
KTsKKyAgICBHcmFwaGljc0xheWVyOjpzZXROYW1lKG5hbWUpOworfQorYm9vbCBHcmFwaGljc0xh
eWVyUXQ6OnNldENoaWxkcmVuKGNvbnN0IFZlY3RvcjxHcmFwaGljc0xheWVyKj4mIGNoaWxkcmVu
KQoreworICAgIHF0TGF5ZXItPm5vdGVDaGFuZ2UoR3JhcGhpY3NMYXllclF0UHJpdmF0ZTo6Q2hp
bGRyZW5DaGFuZ2UpOworICAgIHJldHVybiBHcmFwaGljc0xheWVyOjpzZXRDaGlsZHJlbihjaGls
ZHJlbik7Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllclF0OjphZGRDaGlsZChHcmFwaGljc0xheWVy
KiBsYXllcikKK3sKKyAgICBxdExheWVyLT5ub3RlQ2hhbmdlKEdyYXBoaWNzTGF5ZXJRdFByaXZh
dGU6OkNoaWxkcmVuQ2hhbmdlKTsKKyAgICBHcmFwaGljc0xheWVyOjphZGRDaGlsZChsYXllcik7
Cit9Cit2b2lkIEdyYXBoaWNzTGF5ZXJRdDo6YWRkQ2hpbGRBdEluZGV4KEdyYXBoaWNzTGF5ZXIq
IGxheWVyLCBpbnQgaW5kZXgpCit7CisgICAgR3JhcGhpY3NMYXllcjo6YWRkQ2hpbGRBdEluZGV4
KGxheWVyLCBpbmRleCk7CisgICAgcXRMYXllci0+bm90ZUNoYW5nZShHcmFwaGljc0xheWVyUXRQ
cml2YXRlOjpDaGlsZHJlbkNoYW5nZSk7Cit9Cit2b2lkIEdyYXBoaWNzTGF5ZXJRdDo6YWRkQ2hp
bGRBYm92ZShHcmFwaGljc0xheWVyKiBsYXllciwgR3JhcGhpY3NMYXllciogc2libGluZykKK3sK
KyAgICAgR3JhcGhpY3NMYXllcjo6YWRkQ2hpbGRBYm92ZShsYXllciwgc2libGluZyk7CisgICAg
IHF0TGF5ZXItPm5vdGVDaGFuZ2UoR3JhcGhpY3NMYXllclF0UHJpdmF0ZTo6Q2hpbGRyZW5DaGFu
Z2UpOworfQordm9pZCBHcmFwaGljc0xheWVyUXQ6OmFkZENoaWxkQmVsb3coR3JhcGhpY3NMYXll
ciogbGF5ZXIsIEdyYXBoaWNzTGF5ZXIqIHNpYmxpbmcpCit7CisKKyAgICBHcmFwaGljc0xheWVy
OjphZGRDaGlsZEJlbG93KGxheWVyLCBzaWJsaW5nKTsKKyAgICBxdExheWVyLT5ub3RlQ2hhbmdl
KEdyYXBoaWNzTGF5ZXJRdFByaXZhdGU6OkNoaWxkcmVuQ2hhbmdlKTsKK30KK2Jvb2wgR3JhcGhp
Y3NMYXllclF0OjpyZXBsYWNlQ2hpbGQoR3JhcGhpY3NMYXllciogb2xkQ2hpbGQsIEdyYXBoaWNz
TGF5ZXIqIG5ld0NoaWxkKQoreworICAgIGlmIChHcmFwaGljc0xheWVyOjpyZXBsYWNlQ2hpbGQo
b2xkQ2hpbGQsIG5ld0NoaWxkKSkgeworICAgICAgIHF0TGF5ZXItPm5vdGVDaGFuZ2UoR3JhcGhp
Y3NMYXllclF0UHJpdmF0ZTo6Q2hpbGRyZW5DaGFuZ2UpOworICAgICAgIHJldHVybiB0cnVlOwor
ICAgIH0gZWxzZQorICAgICAgICByZXR1cm4gZmFsc2U7Cit9Cit2b2lkIEdyYXBoaWNzTGF5ZXJR
dDo6cmVtb3ZlRnJvbVBhcmVudCgpCit7CisgICAgaWYgKHBhcmVudCgpKQorICAgICAgICBxdExh
eWVyLT5ub3RlQ2hhbmdlKEdyYXBoaWNzTGF5ZXJRdFByaXZhdGU6OlBhcmVudENoYW5nZSk7Cisg
ICAgR3JhcGhpY3NMYXllcjo6cmVtb3ZlRnJvbVBhcmVudCgpOworfQordm9pZCBHcmFwaGljc0xh
eWVyUXQ6OnNldE1hc2tMYXllcihHcmFwaGljc0xheWVyKiBsYXllcikKK3sKKyAgICBHcmFwaGlj
c0xheWVyOjpzZXRNYXNrTGF5ZXIobGF5ZXIpOworICAgIHF0TGF5ZXItPm5vdGVDaGFuZ2UoR3Jh
cGhpY3NMYXllclF0UHJpdmF0ZTo6TWFza0xheWVyQ2hhbmdlKTsKK30KK3ZvaWQgR3JhcGhpY3NM
YXllclF0OjpzZXRQb3NpdGlvbihjb25zdCBGbG9hdFBvaW50JiBwKQoreworICAgIGlmIChwb3Np
dGlvbigpICE9IHApCisgICAgICAgcXRMYXllci0+bm90ZUNoYW5nZShHcmFwaGljc0xheWVyUXRQ
cml2YXRlOjpQb3NpdGlvbkNoYW5nZSk7CisgICAgR3JhcGhpY3NMYXllcjo6c2V0UG9zaXRpb24o
cCk7Cit9Cit2b2lkIEdyYXBoaWNzTGF5ZXJRdDo6c2V0QW5jaG9yUG9pbnQoY29uc3QgRmxvYXRQ
b2ludDNEJiBwKQoreworICAgIGlmIChhbmNob3JQb2ludCgpICE9IHApCisgICAgICAgIHF0TGF5
ZXItPm5vdGVDaGFuZ2UoR3JhcGhpY3NMYXllclF0UHJpdmF0ZTo6QW5jaG9yUG9pbnRDaGFuZ2Up
OworICAgIEdyYXBoaWNzTGF5ZXI6OnNldEFuY2hvclBvaW50KHApOworfQordm9pZCBHcmFwaGlj
c0xheWVyUXQ6OnNldFNpemUoY29uc3QgRmxvYXRTaXplJiBzaXplKQoreworICAgIGlmICh0aGlz
LT5zaXplKCkgIT0gc2l6ZSkKKyAgICAgICAgcXRMYXllci0+bm90ZUNoYW5nZShHcmFwaGljc0xh
eWVyUXRQcml2YXRlOjpTaXplQ2hhbmdlKTsKKyAgICBHcmFwaGljc0xheWVyOjpzZXRTaXplKHNp
emUpOworfQordm9pZCBHcmFwaGljc0xheWVyUXQ6OnNldFRyYW5zZm9ybShjb25zdCBUcmFuc2Zv
cm1hdGlvbk1hdHJpeCYgdCkKK3sKKyAgICBpZiAoIXF0TGF5ZXItPnRyYW5zZm9ybUFuaW1hdGlv
blJ1bm5pbmcgJiYgdHJhbnNmb3JtKCkgIT0gdCkKKyAgICAgICBxdExheWVyLT5ub3RlQ2hhbmdl
KEdyYXBoaWNzTGF5ZXJRdFByaXZhdGU6OlRyYW5zZm9ybUNoYW5nZSk7CisgICAgR3JhcGhpY3NM
YXllcjo6c2V0VHJhbnNmb3JtKHQpOworfQordm9pZCBHcmFwaGljc0xheWVyUXQ6OnNldENoaWxk
cmVuVHJhbnNmb3JtKGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4JiB0KQoreworICAgIEdyYXBo
aWNzTGF5ZXI6OnNldENoaWxkcmVuVHJhbnNmb3JtKHQpOworICAgIHF0TGF5ZXItPm5vdGVDaGFu
Z2UoR3JhcGhpY3NMYXllclF0UHJpdmF0ZTo6Q2hpbGRyZW5UcmFuc2Zvcm1DaGFuZ2UpOworfQor
dm9pZCBHcmFwaGljc0xheWVyUXQ6OnNldFByZXNlcnZlczNEKGJvb2wgYikKK3sKKyAgICBpZiAo
YiAhPSBwcmVzZXJ2ZXMzRCgpKTsKKyAgICAgICBxdExheWVyLT5ub3RlQ2hhbmdlKEdyYXBoaWNz
TGF5ZXJRdFByaXZhdGU6OlByZXNlcnZlczNEQ2hhbmdlKTsKKyAgICBHcmFwaGljc0xheWVyOjpz
ZXRQcmVzZXJ2ZXMzRChiKTsKK30KK3ZvaWQgR3JhcGhpY3NMYXllclF0OjpzZXRNYXNrc1RvQm91
bmRzKGJvb2wgYikKK3sKKyAgICBHcmFwaGljc0xheWVyOjpzZXRNYXNrc1RvQm91bmRzKGIpOwor
ICAgIHF0TGF5ZXItPm5vdGVDaGFuZ2UoR3JhcGhpY3NMYXllclF0UHJpdmF0ZTo6TWFza3NUb0Jv
dW5kc0NoYW5nZSk7Cit9Cit2b2lkIEdyYXBoaWNzTGF5ZXJRdDo6c2V0RHJhd3NDb250ZW50KGJv
b2wgYikKK3sKKyAgICBxdExheWVyLT5ub3RlQ2hhbmdlKEdyYXBoaWNzTGF5ZXJRdFByaXZhdGU6
OkRyYXdzQ29udGVudENoYW5nZSk7CisgICAgR3JhcGhpY3NMYXllcjo6c2V0RHJhd3NDb250ZW50
KGIpOworfQordm9pZCBHcmFwaGljc0xheWVyUXQ6OnNldEJhY2tncm91bmRDb2xvcihjb25zdCBD
b2xvciYgYykKK3sKKyAgICBxdExheWVyLT5ub3RlQ2hhbmdlKEdyYXBoaWNzTGF5ZXJRdFByaXZh
dGU6OkJhY2tncm91bmRDb2xvckNoYW5nZSk7CisgICAgcXRMYXllci0+cGVuZGluZ0NvbnRlbnQu
Ymdjb2xvciA9IGM7CisgICAgcXRMYXllci0+cGVuZGluZ0NvbnRlbnQuYmdjb2xvclZhbGlkID0g
dHJ1ZTsKKyAgICBHcmFwaGljc0xheWVyOjpzZXRCYWNrZ3JvdW5kQ29sb3IoYyk7Cit9Cit2b2lk
IEdyYXBoaWNzTGF5ZXJRdDo6Y2xlYXJCYWNrZ3JvdW5kQ29sb3IoKQoreworICAgIHF0TGF5ZXIt
PnBlbmRpbmdDb250ZW50LmJnY29sb3JWYWxpZCA9IGZhbHNlOworICAgIHF0TGF5ZXItPm5vdGVD
aGFuZ2UoR3JhcGhpY3NMYXllclF0UHJpdmF0ZTo6QmFja2dyb3VuZENvbG9yQ2hhbmdlKTsKKyAg
ICBHcmFwaGljc0xheWVyOjpjbGVhckJhY2tncm91bmRDb2xvcigpOworfQordm9pZCBHcmFwaGlj
c0xheWVyUXQ6OnNldENvbnRlbnRzT3BhcXVlKGJvb2wgYikKK3sKKyAgICBxdExheWVyLT5ub3Rl
Q2hhbmdlKEdyYXBoaWNzTGF5ZXJRdFByaXZhdGU6OkNvbnRlbnRzT3BhcXVlQ2hhbmdlKTsKKyAg
ICBHcmFwaGljc0xheWVyOjpzZXRDb250ZW50c09wYXF1ZShiKTsKK30KK3ZvaWQgR3JhcGhpY3NM
YXllclF0OjpzZXRCYWNrZmFjZVZpc2liaWxpdHkoYm9vbCBiKQoreworICAgIHF0TGF5ZXItPm5v
dGVDaGFuZ2UoR3JhcGhpY3NMYXllclF0UHJpdmF0ZTo6QmFja2ZhY2VWaXNpYmlsaXR5Q2hhbmdl
KTsKKyAgICBHcmFwaGljc0xheWVyOjpzZXRCYWNrZmFjZVZpc2liaWxpdHkoYik7Cit9CisKK3Zv
aWQgR3JhcGhpY3NMYXllclF0OjpzZXRPcGFjaXR5KGZsb2F0IG8pCit7CisgICAgaWYgKCFxdExh
eWVyLT5vcGFjaXR5QW5pbWF0aW9uUnVubmluZyAmJiBvcGFjaXR5KCkgIT0gbykKKyAgICAgICBx
dExheWVyLT5ub3RlQ2hhbmdlKEdyYXBoaWNzTGF5ZXJRdFByaXZhdGU6Ok9wYWNpdHlDaGFuZ2Up
OworICAgIEdyYXBoaWNzTGF5ZXI6OnNldE9wYWNpdHkobyk7Cit9Cit2b2lkIEdyYXBoaWNzTGF5
ZXJRdDo6c2V0Q29udGVudHNSZWN0KGNvbnN0IEludFJlY3QmIHIpCit7CisgICAgcXRMYXllci0+
bm90ZUNoYW5nZShHcmFwaGljc0xheWVyUXRQcml2YXRlOjpDb250ZW50c1JlY3RDaGFuZ2UpOwor
ICAgIEdyYXBoaWNzTGF5ZXI6OnNldENvbnRlbnRzUmVjdChyKTsKK30KKwordGVtcGxhdGUgPHR5
cGVuYW1lIFQ+CitzdHJ1Y3QgS2V5ZnJhbWVWYWx1ZVF0IHsKKyAgICBUaW1pbmdGdW5jdGlvbiB0
aW1pbmdGdW5jdGlvbjsKKyAgICBUIHZhbHVlOworfTsKKworc3RhdGljIGlubGluZSBkb3VibGUg
c29sdmVFcHNpbG9uKGRvdWJsZSBkdXJhdGlvbikKK3sKKyAgICByZXR1cm4gMS4wIC8gKDIwMC4w
ICogZHVyYXRpb24pOworfQorCitzdGF0aWMgaW5saW5lIGRvdWJsZSBzb2x2ZUN1YmljQmV6aWVy
RnVuY3Rpb24ocXJlYWwgcDF4LCBxcmVhbCBwMXksIHFyZWFsIHAyeCwgcXJlYWwgcDJ5LCBkb3Vi
bGUgdCwgZG91YmxlIGR1cmF0aW9uKQoreworICAgIFVuaXRCZXppZXIgYmV6aWVyKHAxeCwgcDF5
LCBwMngsIHAyeSk7CisgICAgcmV0dXJuIGJlemllci5zb2x2ZSh0LCBzb2x2ZUVwc2lsb24oZHVy
YXRpb24pKTsKK30KKworc3RhdGljIGlubGluZSBxcmVhbCBhcHBseVRpbWluZ0Z1bmN0aW9uKGNv
bnN0IFRpbWluZ0Z1bmN0aW9uJiB0ZiwgcXJlYWwgcHJvZywgaW50IGR1cmF0aW9uKQoreworICAg
ICAgICBpZiAodGYudHlwZSgpID09IExpbmVhclRpbWluZ0Z1bmN0aW9uKQorICAgICAgICAgICAg
cmV0dXJuIHByb2c7CisgICAgICAgIGlmICh0Zi50eXBlKCkgPT0gQ3ViaWNCZXppZXJUaW1pbmdG
dW5jdGlvbikgeworICAgICAgICAgICAgcmV0dXJuIHNvbHZlQ3ViaWNCZXppZXJGdW5jdGlvbih0
Zi54MSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Zi55
MSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Zi54Migp
LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Zi55MigpLAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUocHJvZyks
IGRvdWJsZShkdXJhdGlvbikgLyAxMDAwKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcHJv
ZzsKK30KKworCitzdGF0aWMgdm9pZCB3ZWJraXRBbmltYXRpb25Ub1F0QW5pbWF0aW9uVmFsdWUo
Y29uc3QgQW5pbWF0aW9uVmFsdWUqIGF2LCBUcmFuc2Zvcm1PcGVyYXRpb25zJiB0KQoreworICAg
ICAgICBpZiAoYXYpIHsKKyAgICAgICAgICAgIGNvbnN0IFRyYW5zZm9ybU9wZXJhdGlvbnMqIG9w
cyA9IHN0YXRpY19jYXN0PGNvbnN0IFRyYW5zZm9ybUFuaW1hdGlvblZhbHVlKj4oYXYpLT52YWx1
ZSgpOworICAgICAgICAgICAgdCA9IG9wcz8qb3BzOlRyYW5zZm9ybU9wZXJhdGlvbnMoKTsKKyAg
ICAgICAgfSBlbHNlCisgICAgICAgICAgICB0ID0gVHJhbnNmb3JtT3BlcmF0aW9ucygpOworCit9
CisKK3N0YXRpYyB2b2lkIHdlYmtpdEFuaW1hdGlvblRvUXRBbmltYXRpb25WYWx1ZShjb25zdCBB
bmltYXRpb25WYWx1ZSogYXYsIHFyZWFsJiByKQoreworICAgICAgICBpZiAoYXYpCisgICAgICAg
ICAgICByID0gc3RhdGljX2Nhc3Q8Y29uc3QgRmxvYXRBbmltYXRpb25WYWx1ZSo+KGF2KS0+dmFs
dWUoKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgciA9IDA7Cit9CisKK3RlbXBsYXRlIDx0
eXBlbmFtZSBUPgorY2xhc3MgQW5pbWF0aW9uUXQgOiBwdWJsaWMgUUFic3RyYWN0QW5pbWF0aW9u
IHsKKworcHVibGljOgorICAgIEFuaW1hdGlvblF0KEdyYXBoaWNzTGF5ZXJRdFByaXZhdGUqIGFM
YXllciwgY29uc3QgS2V5ZnJhbWVWYWx1ZUxpc3QmIHZhbHVlcywgY29uc3QgSW50U2l6ZSYgYUJv
eFNpemUsIGNvbnN0IEFuaW1hdGlvbiogYW5pbSkKKyAgICAgICAgICAgIDpRQWJzdHJhY3RBbmlt
YXRpb24oMCkKKyAgICAgICAgICAgICwgdGFyZ2V0KGFMYXllcikKKyAgICAgICAgICAgICwgYm94
U2l6ZShhQm94U2l6ZSkKKyAgICAgICAgICAgICwgZHVyKGFuaW0tPmR1cmF0aW9uKCkqMTAwMCkK
KyAgICAgICAgICAgICwgaXNBbHRlcm5hdGUoYW5pbS0+ZGlyZWN0aW9uKCkgPT0gQW5pbWF0aW9u
OjpBbmltYXRpb25EaXJlY3Rpb25BbHRlcm5hdGUpCisgICAgeworICAgICAgICBmb3IgKHNpemVf
dCBpID0gMDsgaSA8IHZhbHVlcy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgY29uc3QgQW5p
bWF0aW9uVmFsdWUqIGFuaW1WYWwgPSB2YWx1ZXMuYXQoaSk7CisgICAgICAgICAgICBLZXlmcmFt
ZVZhbHVlUXQ8VD4ga2Z2OworICAgICAgICAgICAgaWYgKGFuaW1WYWwtPnRpbWluZ0Z1bmN0aW9u
KCkpCisgICAgICAgICAgICAgICAga2Z2LnRpbWluZ0Z1bmN0aW9uID0gKmFuaW1WYWwtPnRpbWlu
Z0Z1bmN0aW9uKCk7CisgICAgICAgICAgICB3ZWJraXRBbmltYXRpb25Ub1F0QW5pbWF0aW9uVmFs
dWUoYW5pbVZhbCwga2Z2LnZhbHVlKTsKKyAgICAgICAgICAgIGtleWZyYW1lVmFsdWVzW2FuaW1W
YWwtPmtleVRpbWUoKV0gPSBrZnY7CisgICAgICAgIH0KKyAgICB9CisKK3Byb3RlY3RlZDoKKwor
ICAgIHZpcnR1YWwgdm9pZCBhcHBseUZyYW1lKGNvbnN0IFQmIGZyb21WYWx1ZSwgY29uc3QgVCYg
dG9WYWx1ZSwgcXJlYWwgcHJvZ3Jlc3MpID0gMDsKKyAgICB2aXJ0dWFsIGludCBkdXJhdGlvbigp
IGNvbnN0IHsgcmV0dXJuIGR1cjsgfQorICAgIHZpcnR1YWwgdm9pZCB1cGRhdGVDdXJyZW50VGlt
ZShpbnQgY3VycmVudFRpbWUpCisgICAgeworICAgICAgICBpZiAoIXRhcmdldCkKKyAgICAgICAg
ICAgIHJldHVybjsKKyAgICAgICAgaWYgKGtleWZyYW1lVmFsdWVzLmlzRW1wdHkoKSkKKyAgICAg
ICAgICAgIHJldHVybjsKKyAgICAgICAgcXJlYWwgcHJvZ3Jlc3MgPSBxcmVhbChjdXJyZW50TG9v
cFRpbWUoKSkgLyBkdXI7CisgICAgICAgIGlmIChpc0FsdGVybmF0ZSAmJiBjdXJyZW50TG9vcCgp
JTIpCisgICAgICAgICAgICBwcm9ncmVzcyA9IDEtcHJvZ3Jlc3M7CisKKyAgICAgICAgdHlwZW5h
bWUgUU1hcDxxcmVhbCwgS2V5ZnJhbWVWYWx1ZVF0PFQ+ID46Oml0ZXJhdG9yIGl0ID0ga2V5ZnJh
bWVWYWx1ZXMuZmluZChwcm9ncmVzcyk7CisgICAgICAgIGlmIChpdCA9PSBrZXlmcmFtZVZhbHVl
cy5lbmQoKSkKKyAgICAgICAgICAgIGl0ID0ga2V5ZnJhbWVWYWx1ZXMubG93ZXJCb3VuZChwcm9n
cmVzcyktMTsKKyAgICAgICAgaWYgKGl0ID09IGtleWZyYW1lVmFsdWVzLmVuZCgpKQorICAgICAg
ICAgICAgaXQgPSBrZXlmcmFtZVZhbHVlcy5iZWdpbigpOworCisgICAgICAgIHR5cGVuYW1lIFFN
YXA8cXJlYWwsIEtleWZyYW1lVmFsdWVRdDxUPiA+OjppdGVyYXRvciBpdDIgPSBpdCsxOworICAg
ICAgICBpZiAoaXQyID09IGtleWZyYW1lVmFsdWVzLmVuZCgpKQorICAgICAgICAgICAgaXQyID0g
a2V5ZnJhbWVWYWx1ZXMuYmVnaW4oKTsKKyAgICAgICAgY29uc3QgS2V5ZnJhbWVWYWx1ZVF0PFQ+
JiBmcm9tS2V5ZnJhbWUgPSBpdC52YWx1ZSgpOworICAgICAgICBjb25zdCBLZXlmcmFtZVZhbHVl
UXQ8VD4mIHRvS2V5ZnJhbWUgPSBpdDIudmFsdWUoKTsKKworICAgICAgICBjb25zdCBUaW1pbmdG
dW5jdGlvbiYgdGltaW5nRnVuYyA9IGZyb21LZXlmcmFtZS50aW1pbmdGdW5jdGlvbjsKKyAgICAg
ICAgY29uc3QgVCYgZnJvbVZhbHVlID0gZnJvbUtleWZyYW1lLnZhbHVlOworICAgICAgICBjb25z
dCBUJiB0b1ZhbHVlID0gdG9LZXlmcmFtZS52YWx1ZTsKKworICAgICAgICBxcmVhbCBub3JtYWxp
emVkUHJvZ3Jlc3MgPSAoaXQua2V5KCkgPT0gaXQyLmtleSgpKSA/IDAgOiAocHJvZ3Jlc3MgLSBp
dC5rZXkoKSkgLyAoaXQyLmtleSgpIC0gaXQua2V5KCkpOworICAgICAgICBub3JtYWxpemVkUHJv
Z3Jlc3MgPSBhcHBseVRpbWluZ0Z1bmN0aW9uKHRpbWluZ0Z1bmMsIG5vcm1hbGl6ZWRQcm9ncmVz
cywgZHVyYXRpb24oKSAvIDEwMDApOworICAgICAgICBhcHBseUZyYW1lKGZyb21WYWx1ZSwgdG9W
YWx1ZSwgbm9ybWFsaXplZFByb2dyZXNzKTsKKyAgICB9CisKKyAgICBBbmltYXRlZFByb3BlcnR5
SUQgcHJvcDsKKyAgICBRTWFwPHFyZWFsLCBLZXlmcmFtZVZhbHVlUXQ8VD4gPiBrZXlmcmFtZVZh
bHVlczsKKyAgICBRV2Vha1BvaW50ZXI8R3JhcGhpY3NMYXllclF0UHJpdmF0ZT4gdGFyZ2V0Owor
ICAgIEludFNpemUgYm94U2l6ZTsKKyAgICBpbnQgZHVyOworICAgIGJvb2wgaXNBbHRlcm5hdGU7
Cit9OworCitjbGFzcyBUcmFuc2Zvcm1BbmltYXRpb25RdCA6IHB1YmxpYyBBbmltYXRpb25RdDxU
cmFuc2Zvcm1PcGVyYXRpb25zPiB7CitwdWJsaWM6CisgICAgVHJhbnNmb3JtQW5pbWF0aW9uUXQo
R3JhcGhpY3NMYXllclF0UHJpdmF0ZSogYUxheWVyLAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGNvbnN0IEtleWZyYW1lVmFsdWVMaXN0JiB2YWx1ZXMsIGNvbnN0IEludFNp
emUmIGJveFNpemUsIGNvbnN0IEFuaW1hdGlvbiogYW5pbSkKKyAgICAgICAgICAgICAgICA6QW5p
bWF0aW9uUXQ8VHJhbnNmb3JtT3BlcmF0aW9ucz4oYUxheWVyLCB2YWx1ZXMsIGJveFNpemUsIGFu
aW0pCisgICAgeworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBhcHBseUZyYW1lKGNvbnN0IFRy
YW5zZm9ybU9wZXJhdGlvbnMmIGZyb21PcHMsIGNvbnN0IFRyYW5zZm9ybU9wZXJhdGlvbnMmIHRv
T3BzLCBxcmVhbCBwcm9ncmVzcykKKyAgICB7CisgICAgICAgIFRyYW5zZm9ybWF0aW9uTWF0cml4
IHRmOworCisgICAgICAgIC8vIGNhcmVmdWwgd2l0aCB0aGlzIGNvZGUsIHdhcyB0cmlja3kgdG8g
Z2V0IGl0IHRvIGJlIGFjY3VyYXRlCisgICAgICAgIC8vIHRoZSBpZGVhIGlzIHRoYXQgd2UgbGV0
IFdlYkNvcmUgbWFuYWdlIHRoZSB0cmFuc2Zvcm0tb3BlcmF0aW9ucworICAgICAgICAvLyBhbmQg
UXQganVzdCBtYW5hZ2VzIHRoZSBhbmltYXRpb24gaGVhcnRiZWF0IGFuZCB0aGUgYm90dG9tLWxp
bmUgUVRyYW5zZm9ybQorICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHRvT3BzLnNpemUo
KTsgKytpKQorICAgICAgICAgICAgaWYgKGZyb21PcHMuc2l6ZSgpID4gaSkKKyAgICAgICAgICAg
ICAgICB0b09wcy5vcGVyYXRpb25zKClbaV0tPmJsZW5kKGZyb21PcHMuYXQoaSksIHByb2dyZXNz
KS0+YXBwbHkodGYsIGJveFNpemUpOworICAgICAgICB0YXJnZXQuZGF0YSgpLT5sYXllci0+c2V0
VHJhbnNmb3JtKHRmKTsKKyAgICAgICAgdGFyZ2V0LmRhdGEoKS0+c2V0QmFzZVRyYW5zZm9ybShR
VHJhbnNmb3JtKHRmKSk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIHVwZGF0ZVN0YXRlKFFB
YnN0cmFjdEFuaW1hdGlvbjo6U3RhdGUgbmV3U3RhdGUsIFFBYnN0cmFjdEFuaW1hdGlvbjo6U3Rh
dGUgb2xkU3RhdGUpCisgICAgeworICAgICAgICBRQWJzdHJhY3RBbmltYXRpb246OnVwZGF0ZVN0
YXRlKG5ld1N0YXRlLCBvbGRTdGF0ZSk7CisgICAgICAgIGlmICghdGFyZ2V0KQorICAgICAgICAg
ICAgcmV0dXJuOworICAgICAgICBpZiAobmV3U3RhdGUgPT0gUUFic3RyYWN0QW5pbWF0aW9uOjpS
dW5uaW5nKSB7CisgICAgICAgICAgICAvLyB0byBpbmNyZWFzZSBGUFMsIHdlIHVzZSBhIGxlc3Mg
YWNjdXJhdGUgY2FjaGluZyBtZWNoYW5pc20gd2hpbGUgYW5pbWF0aW9uIGlzIGdvaW5nIG9uCisg
ICAgICAgICAgICAvLyB0aGlzIGlzIGEgVVggY2hvaWNlIHRoYXQgc2hvdWxkIHByb2JhYmx5IGJl
IGN1c3RvbWl6YWJsZQorICAgICAgICAgICAgdGFyZ2V0LmRhdGEoKS0+dHJhbnNmb3JtQW5pbWF0
aW9uUnVubmluZyA9IHRydWU7CisgICAgICAgICAgICBpZiAodGFyZ2V0LmRhdGEoKS0+Y2FjaGVN
b2RlKCkgPT0gUUdyYXBoaWNzSXRlbTo6RGV2aWNlQ29vcmRpbmF0ZUNhY2hlKQorICAgICAgICAg
ICAgICAgIHRhcmdldC5kYXRhKCktPnNldENhY2hlTW9kZShRR3JhcGhpY3NJdGVtOjpJdGVtQ29v
cmRpbmF0ZUNhY2hlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRhcmdldC5kYXRh
KCktPnRyYW5zZm9ybUFuaW1hdGlvblJ1bm5pbmcgPSBmYWxzZTsKKyAgICAgICAgICAgIGlmICh0
YXJnZXQuZGF0YSgpLT5jYWNoZU1vZGUoKSA9PSBRR3JhcGhpY3NJdGVtOjpJdGVtQ29vcmRpbmF0
ZUNhY2hlKQorICAgICAgICAgICAgICAgIHRhcmdldC5kYXRhKCktPnNldENhY2hlTW9kZShRR3Jh
cGhpY3NJdGVtOjpEZXZpY2VDb29yZGluYXRlQ2FjaGUpOyAgICAgICAgICAgIAorICAgICAgICB9
CisgICAgfQorfTsKKworY2xhc3MgT3BhY2l0eUFuaW1hdGlvblF0IDogcHVibGljIEFuaW1hdGlv
blF0PHFyZWFsPiB7CitwdWJsaWM6CisgICAgT3BhY2l0eUFuaW1hdGlvblF0KEdyYXBoaWNzTGF5
ZXJRdFByaXZhdGUqIGFMYXllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBjb25zdCBLZXlmcmFtZVZhbHVlTGlzdCYgdmFsdWVzLCBjb25zdCBJbnRTaXplJiBib3hTaXpl
LCBjb25zdCBBbmltYXRpb24qIGFuaW0pCisgICAgICAgICAgICAgICAgOkFuaW1hdGlvblF0PHFy
ZWFsPihhTGF5ZXIsIHZhbHVlcywgYm94U2l6ZSwgYW5pbSkKKyAgICB7CisgICAgfQorCisgICAg
dmlydHVhbCB2b2lkIGFwcGx5RnJhbWUoY29uc3QgcXJlYWwmIGZyb21WYWx1ZSwgY29uc3QgcXJl
YWwmIHRvVmFsdWUsIHFyZWFsIHByb2dyZXNzKQorICAgIHsKKyAgICAgICAgdGFyZ2V0LmRhdGEo
KS0+c2V0T3BhY2l0eShxTWluPHFyZWFsPihxTWF4PHFyZWFsPihmcm9tVmFsdWUgKyAodG9WYWx1
ZS1mcm9tVmFsdWUpKnByb2dyZXNzLCAwKSwgMSkpOworICAgIH0KKworICAgIHZpcnR1YWwgdm9p
ZCB1cGRhdGVTdGF0ZShRQWJzdHJhY3RBbmltYXRpb246OlN0YXRlIG5ld1N0YXRlLCBRQWJzdHJh
Y3RBbmltYXRpb246OlN0YXRlIG9sZFN0YXRlKQorICAgIHsKKyAgICAgICAgUUFic3RyYWN0QW5p
bWF0aW9uOjp1cGRhdGVTdGF0ZShuZXdTdGF0ZSwgb2xkU3RhdGUpOworICAgICAgICBpZiAoIXRh
cmdldCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgaWYgKG5ld1N0YXRlID09IFFBYnN0
cmFjdEFuaW1hdGlvbjo6UnVubmluZykKKyAgICAgICAgICAgIHRhcmdldC5kYXRhKCktPm9wYWNp
dHlBbmltYXRpb25SdW5uaW5nID0gdHJ1ZTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdGFy
Z2V0LmRhdGEoKS0+b3BhY2l0eUFuaW1hdGlvblJ1bm5pbmcgPSBmYWxzZTsgICAgICAgIAorICAg
IH0KK307CisKK2Jvb2wgR3JhcGhpY3NMYXllclF0OjphZGRBbmltYXRpb24oY29uc3QgS2V5ZnJh
bWVWYWx1ZUxpc3QmIHZhbHVlcywgY29uc3QgSW50U2l6ZSYgYm94U2l6ZSwgY29uc3QgQW5pbWF0
aW9uKiBhbmltLCBjb25zdCBTdHJpbmcmIGtleWZyYW1lc05hbWUsIGRvdWJsZSB0aW1lT2Zmc2V0
KQoreworICAgIGlmICghYW5pbS0+ZHVyYXRpb24oKSB8fCAhYW5pbS0+aXRlcmF0aW9uQ291bnQo
KSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIFFBYnN0cmFjdEFuaW1hdGlvbiogbmV3QW5p
bTsKKyAgICBzd2l0Y2ggKHZhbHVlcy5wcm9wZXJ0eSgpKSB7CisgICAgY2FzZSBBbmltYXRlZFBy
b3BlcnR5T3BhY2l0eToKKyAgICAgICAgbmV3QW5pbSA9IG5ldyBPcGFjaXR5QW5pbWF0aW9uUXQo
cXRMYXllciwgdmFsdWVzLCBib3hTaXplLCBhbmltKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2Fz
ZSBBbmltYXRlZFByb3BlcnR5V2Via2l0VHJhbnNmb3JtOiB7CisgICAgICAgIG5ld0FuaW0gPSBu
ZXcgVHJhbnNmb3JtQW5pbWF0aW9uUXQocXRMYXllciwgdmFsdWVzLCBib3hTaXplLCBhbmltKTsK
KyAgICAgICAgVHJhbnNmb3JtT3BlcmF0aW9ucyB0OworICAgICAgICB3ZWJraXRBbmltYXRpb25U
b1F0QW5pbWF0aW9uVmFsdWUodmFsdWVzLmF0KDApLCB0KTsKKyAgICAgICAgcXRMYXllci0+c2V0
RmxhZyhRR3JhcGhpY3NJdGVtOjpJdGVtQ2xpcHNDaGlsZHJlblRvU2hhcGUsIGZhbHNlKTsKKyAg
ICAgICAgfSBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAg
fQorICAgIG5ld0FuaW0tPnNldExvb3BDb3VudChhbmltLT5pdGVyYXRpb25Db3VudCgpKTsKKyAg
ICBuZXdBbmltLT5zZXRQcm9wZXJ0eSgid2twcm9wIiwgdmFsdWVzLnByb3BlcnR5KCkpOworICAg
IG5ld0FuaW0tPnNldFByb3BlcnR5KCJ3a2tmIiwgUVN0cmluZyhrZXlmcmFtZXNOYW1lKSk7Cisg
ICAgcXRMYXllci0+YW5pbWF0aW9ucy5hcHBlbmQoUVdlYWtQb2ludGVyPFFBYnN0cmFjdEFuaW1h
dGlvbj4obmV3QW5pbSkpOworICAgIFFPYmplY3Q6OmNvbm5lY3QoJnF0TGF5ZXItPnN1c3BlbmRU
aW1lciwgU0lHTkFMKHRpbWVvdXQoKSksIG5ld0FuaW0sIFNMT1QocmVzdW1lKCkpKTsKKyAgICB0
aW1lT2Zmc2V0ICs9IGFuaW0tPmRlbGF5KCk7CisgICAgcXRMYXllci0+YXBwbHlDaGFuZ2VzKGZh
bHNlKTsKKyAgICBpZiAodGltZU9mZnNldCkKKyAgICAgICAgUVRpbWVyOjpzaW5nbGVTaG90KHRp
bWVPZmZzZXQqMTAwMCwgbmV3QW5pbSwgU0xPVChzdGFydCgpKSk7CisgICAgZWxzZQorICAgICAg
ICBuZXdBbmltLT5zdGFydCgpOworICAgIFFPYmplY3Q6OmNvbm5lY3QobmV3QW5pbSwgU0lHTkFM
KGZpbmlzaGVkKCkpLCBuZXdBbmltLCBTTE9UKGRlbGV0ZUxhdGVyKCkpKTsKKyAgICBRVGltZXI6
OnNpbmdsZVNob3QodGltZU9mZnNldCoxMDAwLCBxdExheWVyLCBTTE9UKG5vdGlmeUFuaW1TdGFy
dGVkKCkpKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBHcmFwaGljc0xheWVyUXQ6OnJl
bW92ZUFuaW1hdGlvbnNGb3JQcm9wZXJ0eShBbmltYXRlZFByb3BlcnR5SUQgaWQpCit7CisgICAg
Zm9yIChRTGlzdDxRV2Vha1BvaW50ZXI8UUFic3RyYWN0QW5pbWF0aW9uPiA+OjppdGVyYXRvciBp
dCA9IHF0TGF5ZXItPmFuaW1hdGlvbnMuYmVnaW4oKTsKKyAgICAgICAgICAgIGl0ICE9IHF0TGF5
ZXItPmFuaW1hdGlvbnMuZW5kKCk7ICsraXQpIHsKKworICAgICAgICBpZiAoKml0KSB7CisgICAg
ICAgICAgICBRQWJzdHJhY3RBbmltYXRpb24qIGFuaW0gPSBpdC0+ZGF0YSgpOworICAgICAgICAg
ICAgaWYgKGFuaW0pCisgICAgICAgICAgICBpZiAoYW5pbS0+cHJvcGVydHkoIndrcHJvcCIpID09
IGlkKSB7CisgICAgICAgICAgICAgICAgZGVsZXRlIGFuaW07CisgICAgICAgICAgICAgICAgaXQg
PSBxdExheWVyLT5hbmltYXRpb25zLmVyYXNlKGl0KTsKKyAgICAgICAgICAgICAgICAtLWl0Owor
ICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQordm9pZCBHcmFwaGljc0xheWVyUXQ6
OnJlbW92ZUFuaW1hdGlvbnNGb3JLZXlmcmFtZXMoY29uc3QgU3RyaW5nJiBrZk5hbWUpCit7Cisg
ICAgZm9yIChRTGlzdDxRV2Vha1BvaW50ZXI8UUFic3RyYWN0QW5pbWF0aW9uPiA+OjppdGVyYXRv
ciBpdCA9IHF0TGF5ZXItPmFuaW1hdGlvbnMuYmVnaW4oKTsgaXQgIT0gcXRMYXllci0+YW5pbWF0
aW9ucy5lbmQoKTsgKytpdCkgeworICAgICAgICBpZiAoKml0KQorICAgICAgICBpZiAoKCppdCku
ZGF0YSgpLT5wcm9wZXJ0eSgid2trZiIpID09IFFTdHJpbmcoa2ZOYW1lKSkgeworICAgICAgICAg
ICAgKCppdCkuZGF0YSgpLT5kZWxldGVMYXRlcigpOworICAgICAgICAgICAgaXQgPSBxdExheWVy
LT5hbmltYXRpb25zLmVyYXNlKGl0KTsKKyAgICAgICAgICAgIC0taXQ7CisgICAgICAgIH0KKyAg
ICB9Cit9Cit2b2lkIEdyYXBoaWNzTGF5ZXJRdDo6cGF1c2VBbmltYXRpb24oY29uc3QgU3RyaW5n
JiBrZk5hbWUsIGRvdWJsZSB0aW1lT2ZzKQoreworICAgIGZvciAoUUxpc3Q8UVdlYWtQb2ludGVy
PFFBYnN0cmFjdEFuaW1hdGlvbj4gPjo6aXRlcmF0b3IgaXQgPSBxdExheWVyLT5hbmltYXRpb25z
LmJlZ2luKCk7IGl0ICE9IHF0TGF5ZXItPmFuaW1hdGlvbnMuZW5kKCk7ICsraXQpIHsKKyAgICAg
ICAgaWYgKCppdCkKKyAgICAgICAgaWYgKCgqaXQpLmRhdGEoKS0+cHJvcGVydHkoIndra2YiKSA9
PSBRU3RyaW5nKGtmTmFtZSkpIHsKKyAgICAgICAgICAgIFFBYnN0cmFjdEFuaW1hdGlvbiogYW5p
bSA9IGl0LT5kYXRhKCk7CisgICAgICAgICAgICBRVGltZXI6OnNpbmdsZVNob3QodGltZU9mcyox
MDAwLCBhbmltLCBTTE9UKHBhdXNlKCkpKTsKKyAgICAgICAgfQorICAgIH0KK30KK3ZvaWQgR3Jh
cGhpY3NMYXllclF0OjpzdXNwZW5kQW5pbWF0aW9ucyhkb3VibGUgdGltZSkKK3sKKyAgICBpZiAo
cXRMYXllci0+c3VzcGVuZFRpbWVyLmlzQWN0aXZlKCkpIHsKKyAgICAgICAgcXRMYXllci0+c3Vz
cGVuZFRpbWVyLnN0b3AoKTsKKyAgICAgICAgcXRMYXllci0+c3VzcGVuZFRpbWVyLnN0YXJ0KHRp
bWUqMTAwMCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yIChRTGlzdDxRV2Vha1BvaW50ZXI8
UUFic3RyYWN0QW5pbWF0aW9uPiA+OjppdGVyYXRvciBpdCA9IHF0TGF5ZXItPmFuaW1hdGlvbnMu
YmVnaW4oKTsgaXQgIT0gcXRMYXllci0+YW5pbWF0aW9ucy5lbmQoKTsgKytpdCkgeworICAgICAg
ICAgICAgUUFic3RyYWN0QW5pbWF0aW9uKiBhbmltID0gaXQtPmRhdGEoKTsKKyAgICAgICAgICAg
IGlmIChhbmltKQorICAgICAgICAgICAgICAgIGFuaW0tPnBhdXNlKCk7CisgICAgICAgIH0KKyAg
ICB9Cit9Cit2b2lkIEdyYXBoaWNzTGF5ZXJRdDo6cmVzdW1lQW5pbWF0aW9ucygpCit7CisgICAg
aWYgKHF0TGF5ZXItPnN1c3BlbmRUaW1lci5pc0FjdGl2ZSgpKSB7CisgICAgICAgIHF0TGF5ZXIt
PnN1c3BlbmRUaW1lci5zdG9wKCk7CisgICAgICAgIGZvciAoUUxpc3Q8UVdlYWtQb2ludGVyPFFB
YnN0cmFjdEFuaW1hdGlvbj4gPjo6aXRlcmF0b3IgaXQgPSBxdExheWVyLT5hbmltYXRpb25zLmJl
Z2luKCk7IGl0ICE9IHF0TGF5ZXItPmFuaW1hdGlvbnMuZW5kKCk7ICsraXQpIHsKKyAgICAgICAg
ICAgIFFBYnN0cmFjdEFuaW1hdGlvbiogYW5pbSA9IGl0LT5kYXRhKCk7CisgICAgICAgICAgICBp
ZiAoYW5pbSkKKyAgICAgICAgICAgICAgICBhbmltLT5yZXN1bWUoKTsKKyAgICAgICAgfQorICAg
IH0KK30KKwordm9pZCBHcmFwaGljc0xheWVyUXQ6OnNldENvbnRlbnRzVG9JbWFnZShJbWFnZSog
aW1hZ2UpCit7CisgICAgcXRMYXllci0+bm90ZUNoYW5nZShHcmFwaGljc0xheWVyUXRQcml2YXRl
OjpDb250ZW50Q2hhbmdlKTsKKyAgICBxdExheWVyLT5wZW5kaW5nQ29udGVudC5jb250ZW50VHlw
ZSA9IE5vQ29udGVudFR5cGU7CisgICAgR3JhcGhpY3NMYXllcjo6c2V0Q29udGVudHNUb0ltYWdl
KGltYWdlKTsKKyAgICBpZiAoaW1hZ2UpIHsKKyAgICAgICAgUVBpeG1hcCogcHhtID0gaW1hZ2Ut
Pm5hdGl2ZUltYWdlRm9yQ3VycmVudEZyYW1lKCk7CisgICAgICAgIGlmIChweG0pIHsKKyAgICAg
ICAgICAgIHF0TGF5ZXItPnBlbmRpbmdDb250ZW50LnBpeG1hcCA9ICpweG07CisgICAgICAgICAg
ICBxdExheWVyLT5wZW5kaW5nQ29udGVudC5jb250ZW50VHlwZSA9IFBpeG1hcENvbnRlbnRUeXBl
OworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9ICAgICAgICAKKyAgICB9CisgICAgcXRM
YXllci0+cGVuZGluZ0NvbnRlbnQucGl4bWFwID0gUVBpeG1hcCgpOworfQorCit2b2lkIEdyYXBo
aWNzTGF5ZXJRdDo6c2V0Q29udGVudHNCYWNrZ3JvdW5kQ29sb3IoY29uc3QgQ29sb3ImIGNvbG9y
KQoreworICAgIHF0TGF5ZXItPm5vdGVDaGFuZ2UoR3JhcGhpY3NMYXllclF0UHJpdmF0ZTo6Q29u
dGVudENoYW5nZSk7CisgICAgcXRMYXllci0+cGVuZGluZ0NvbnRlbnQuY29udGVudFR5cGUgPSBD
b2xvckNvbnRlbnRUeXBlOworICAgIHF0TGF5ZXItPnBlbmRpbmdDb250ZW50LmNvbnRlbnRzQmdD
b2xvciA9IFFDb2xvcihjb2xvcik7CisgICAgR3JhcGhpY3NMYXllcjo6c2V0Q29udGVudHNCYWNr
Z3JvdW5kQ29sb3IoY29sb3IpOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJRdDo6c2V0R2VvbWV0
cnlPcmllbnRhdGlvbihDb21wb3NpdGluZ0Nvb3JkaW5hdGVzT3JpZW50YXRpb24gb3JpZW50YXRp
b24pCit7CisgICAgcXRMYXllci0+bm90ZUNoYW5nZShHcmFwaGljc0xheWVyUXRQcml2YXRlOjpH
ZW9PcmllbnRhdGlvbkNoYW5nZSk7CisgICAgR3JhcGhpY3NMYXllcjo6c2V0R2VvbWV0cnlPcmll
bnRhdGlvbihvcmllbnRhdGlvbik7Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllclF0OjpzZXRDb250
ZW50c09yaWVudGF0aW9uKENvbXBvc2l0aW5nQ29vcmRpbmF0ZXNPcmllbnRhdGlvbiBvcmllbnRh
dGlvbikKK3sKKyAgICBxdExheWVyLT5ub3RlQ2hhbmdlKEdyYXBoaWNzTGF5ZXJRdFByaXZhdGU6
OkNvbnRlbnRzT3JpZW50YXRpb25DaGFuZ2UpOworICAgIEdyYXBoaWNzTGF5ZXI6OnNldENvbnRl
bnRzT3JpZW50YXRpb24ob3JpZW50YXRpb24pOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJRdDo6
ZGlzdHJpYnV0ZU9wYWNpdHkoZmxvYXQgbykKK3sKKyAgICBxdExheWVyLT5ub3RlQ2hhbmdlKEdy
YXBoaWNzTGF5ZXJRdFByaXZhdGU6Ok9wYWNpdHlDaGFuZ2UpOworICAgIHF0TGF5ZXItPnN0YXRl
LmRpc3RyaWJ1dGVPcGFjaXR5ID0gdHJ1ZTsKK30KKworZmxvYXQgR3JhcGhpY3NMYXllclF0Ojph
Y2N1bXVsYXRlZE9wYWNpdHkoKSBjb25zdAoreworICAgIHJldHVybiBxdExheWVyLT5lZmZlY3Rp
dmVPcGFjaXR5KCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllclF0OjpzeW5jQ29tcG9zaXRpbmdT
dGF0ZSgpCit7CisgICAgcXRMYXllci0+YXBwbHlDaGFuZ2VzKCk7CisgICAgR3JhcGhpY3NMYXll
cjo6c3luY0NvbXBvc2l0aW5nU3RhdGUoKTsKK30KKworTmF0aXZlTGF5ZXIgR3JhcGhpY3NMYXll
clF0OjpuYXRpdmVMYXllcigpIGNvbnN0Cit7CisgICAgcmV0dXJuIHF0TGF5ZXI7Cit9CisKK1Bs
YXRmb3JtTGF5ZXIqIEdyYXBoaWNzTGF5ZXJRdDo6cGxhdGZvcm1MYXllcigpIGNvbnN0Cit7Cisg
ICAgcmV0dXJuIHF0TGF5ZXI7Cit9CisKK30KKworI2luY2x1ZGUgIkdyYXBoaWNzTGF5ZXJRdC5t
b2MiCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3F0L0dyYXBoaWNzTGF5ZXJRdC5o
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvcXQvR3JhcGhpY3NMYXll
clF0LmgJKHJldmlzaW9uIDApCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3F0L0dyYXBo
aWNzTGF5ZXJRdC5oCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDgzIEBACisvKgorICAgIENvcHly
aWdodCAoQykgMjAwOSBOb2tpYSBDb3Jwb3JhdGlvbiBhbmQvb3IgaXRzIHN1YnNpZGlhcnkoLWll
cykKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJp
YnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUg
TGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBG
cmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMiBvZiB0aGUgTGlj
ZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMg
bGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVs
LAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVk
IHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExp
Y2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBh
IGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9u
ZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3
cml0ZSB0bworICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5r
bGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisgICAgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0Eu
CisqLworCisjaWZuZGVmIEdyYXBoaWNzTGF5ZXJRdF9oCisjZGVmaW5lIEdyYXBoaWNzTGF5ZXJR
dF9oCisKKyNpbmNsdWRlICJHcmFwaGljc0xheWVyLmgiCisjaW5jbHVkZSAiR3JhcGhpY3NMYXll
ckNsaWVudC5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CitjbGFzcyBHcmFwaGljc0xheWVyUXRQ
cml2YXRlOworY2xhc3MgR3JhcGhpY3NMYXllclF0IDogcHVibGljIEdyYXBoaWNzTGF5ZXIgewor
ICAgIGZyaWVuZCBjbGFzcyBHcmFwaGljc0xheWVyUXRQcml2YXRlOworcHVibGljOgorICAgIEdy
YXBoaWNzTGF5ZXJRdChHcmFwaGljc0xheWVyQ2xpZW50Kik7CisgICAgdmlydHVhbCB2b2lkIHNl
dE5lZWRzRGlzcGxheSgpOworICAgIC8vIG1hcmsgdGhlIGdpdmVuIHJlY3QgKGluIGxheWVyIGNv
b3JkcykgYXMgbmVlZGluZyBkaXNwYXkuIE5ldmVyIGdvZXMgZGVlcC4KKyAgICB2aXJ0dWFsIHZv
aWQgc2V0TmVlZHNEaXNwbGF5SW5SZWN0KGNvbnN0IEZsb2F0UmVjdCYpOworICAgIHZpcnR1YWwg
TmF0aXZlTGF5ZXIgbmF0aXZlTGF5ZXIoKSBjb25zdDsKKyAgICB2aXJ0dWFsIFBsYXRmb3JtTGF5
ZXIqIHBsYXRmb3JtTGF5ZXIoKSBjb25zdDsKKworICAgIHZpcnR1YWwgfkdyYXBoaWNzTGF5ZXJR
dCgpOworICAgIHZvaWQgc2V0UGFyZW50KEdyYXBoaWNzTGF5ZXIqIGxheWVyKTsKKyAgICB2aXJ0
dWFsIHZvaWQgc2V0TmFtZShjb25zdCBTdHJpbmcmIG5hbWUpOworICAgIHZpcnR1YWwgYm9vbCBz
ZXRDaGlsZHJlbihjb25zdCBWZWN0b3I8R3JhcGhpY3NMYXllcio+Jik7CisgICAgdmlydHVhbCB2
b2lkIGFkZENoaWxkKEdyYXBoaWNzTGF5ZXIqKTsKKyAgICB2aXJ0dWFsIHZvaWQgYWRkQ2hpbGRB
dEluZGV4KEdyYXBoaWNzTGF5ZXIqLCBpbnQgaW5kZXgpOworICAgIHZpcnR1YWwgdm9pZCBhZGRD
aGlsZEFib3ZlKEdyYXBoaWNzTGF5ZXIqIGxheWVyLCBHcmFwaGljc0xheWVyKiBzaWJsaW5nKTsK
KyAgICB2aXJ0dWFsIHZvaWQgYWRkQ2hpbGRCZWxvdyhHcmFwaGljc0xheWVyKiBsYXllciwgR3Jh
cGhpY3NMYXllciogc2libGluZyk7CisgICAgdmlydHVhbCBib29sIHJlcGxhY2VDaGlsZChHcmFw
aGljc0xheWVyKiBvbGRDaGlsZCwgR3JhcGhpY3NMYXllciogbmV3Q2hpbGQpOworICAgIHZpcnR1
YWwgdm9pZCByZW1vdmVGcm9tUGFyZW50KCk7CisgICAgdmlydHVhbCB2b2lkIHNldE1hc2tMYXll
cihHcmFwaGljc0xheWVyKiBsYXllcik7CisgICAgdmlydHVhbCB2b2lkIHNldFBvc2l0aW9uKGNv
bnN0IEZsb2F0UG9pbnQmIHApOworICAgIHZpcnR1YWwgdm9pZCBzZXRBbmNob3JQb2ludChjb25z
dCBGbG9hdFBvaW50M0QmIHApOworICAgIHZpcnR1YWwgdm9pZCBzZXRTaXplKGNvbnN0IEZsb2F0
U2l6ZSYgc2l6ZSk7CisgICAgdmlydHVhbCB2b2lkIHNldFRyYW5zZm9ybShjb25zdCBUcmFuc2Zv
cm1hdGlvbk1hdHJpeCYgdCk7CisgICAgdmlydHVhbCB2b2lkIHNldENoaWxkcmVuVHJhbnNmb3Jt
KGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4JiB0KTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0UHJl
c2VydmVzM0QoYm9vbCBiKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0TWFza3NUb0JvdW5kcyhib29s
IGIpOworICAgIHZpcnR1YWwgdm9pZCBzZXREcmF3c0NvbnRlbnQoYm9vbCBiKTsKKyAgICB2aXJ0
dWFsIHZvaWQgc2V0QmFja2dyb3VuZENvbG9yKGNvbnN0IENvbG9yJik7CisgICAgdmlydHVhbCB2
b2lkIGNsZWFyQmFja2dyb3VuZENvbG9yKCk7CisgICAgdmlydHVhbCB2b2lkIHNldENvbnRlbnRz
T3BhcXVlKGJvb2wgYik7CisgICAgdmlydHVhbCB2b2lkIHNldEJhY2tmYWNlVmlzaWJpbGl0eShi
b29sIGIpOworICAgIHZpcnR1YWwgdm9pZCBzZXRPcGFjaXR5KGZsb2F0IG9wYWNpdHkpOworICAg
IHZpcnR1YWwgdm9pZCBzZXRDb250ZW50c1JlY3QoY29uc3QgSW50UmVjdCYgcik7CisgICAgdmly
dHVhbCBib29sIGFkZEFuaW1hdGlvbihjb25zdCBLZXlmcmFtZVZhbHVlTGlzdCYsIGNvbnN0IElu
dFNpemUmIC8qYm94U2l6ZSovLCBjb25zdCBBbmltYXRpb24qLCBjb25zdCBTdHJpbmcmIC8qa2V5
ZnJhbWVzTmFtZSovLCBkb3VibGUgLyp0aW1lT2Zmc2V0Ki8pOworICAgIHZpcnR1YWwgdm9pZCBy
ZW1vdmVBbmltYXRpb25zRm9yUHJvcGVydHkoQW5pbWF0ZWRQcm9wZXJ0eUlEKTsKKyAgICB2aXJ0
dWFsIHZvaWQgcmVtb3ZlQW5pbWF0aW9uc0ZvcktleWZyYW1lcyhjb25zdCBTdHJpbmcmIC8qIGtl
eWZyYW1lc05hbWUgKi8pOworICAgIHZpcnR1YWwgdm9pZCBwYXVzZUFuaW1hdGlvbihjb25zdCBT
dHJpbmcmIC8qIGtleWZyYW1lc05hbWUgKi8sIGRvdWJsZSAvKnRpbWVPZmZzZXQqLyk7CisgICAg
dmlydHVhbCB2b2lkIHN1c3BlbmRBbmltYXRpb25zKGRvdWJsZSB0aW1lKTsKKyAgICB2aXJ0dWFs
IHZvaWQgcmVzdW1lQW5pbWF0aW9ucygpOworICAgIHZpcnR1YWwgdm9pZCBzZXRDb250ZW50c1Rv
SW1hZ2UoSW1hZ2UqKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0Q29udGVudHNCYWNrZ3JvdW5kQ29s
b3IoY29uc3QgQ29sb3ImKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0R2VvbWV0cnlPcmllbnRhdGlv
bihDb21wb3NpdGluZ0Nvb3JkaW5hdGVzT3JpZW50YXRpb24gb3JpZW50YXRpb24pOworICAgIHZp
cnR1YWwgdm9pZCBzZXRDb250ZW50c09yaWVudGF0aW9uKENvbXBvc2l0aW5nQ29vcmRpbmF0ZXNP
cmllbnRhdGlvbiBvcmllbnRhdGlvbik7CisgICAgdmlydHVhbCB2b2lkIGRpc3RyaWJ1dGVPcGFj
aXR5KGZsb2F0KTsKKyAgICB2aXJ0dWFsIGZsb2F0IGFjY3VtdWxhdGVkT3BhY2l0eSgpIGNvbnN0
OworICAgIHZpcnR1YWwgdm9pZCBzeW5jQ29tcG9zaXRpbmdTdGF0ZSgpOworcHJpdmF0ZToKKyAg
ICBHcmFwaGljc0xheWVyUXRQcml2YXRlKiBxdExheWVyOworCit9OworCisKK30KKyNlbmRpZiAv
LyBHcmFwaGljc0xheWVyUXRfaApJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9HcmFw
aGljc0xheWVyLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9HcmFw
aGljc0xheWVyLmgJKHJldmlzaW9uIDUzMzU3KQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy9HcmFwaGljc0xheWVyLmgJKHdvcmtpbmcgY29weSkKQEAgLTU5LDYgKzU5LDEwIEBACiB0eXBl
ZGVmIFdLQ0FDRkxheWVyIFBsYXRmb3JtTGF5ZXI7CiB0eXBlZGVmIHZvaWQqIE5hdGl2ZUxheWVy
OwogfQorI2VsaWYgUExBVEZPUk0oUVQpCitjbGFzcyBRR3JhcGhpY3NJdGVtOwordHlwZWRlZiBR
R3JhcGhpY3NJdGVtIFBsYXRmb3JtTGF5ZXI7Cit0eXBlZGVmIFFHcmFwaGljc0l0ZW0qIE5hdGl2
ZUxheWVyOwogI2Vsc2UKIHR5cGVkZWYgdm9pZCogUGxhdGZvcm1MYXllcjsKIHR5cGVkZWYgdm9p
ZCogTmF0aXZlTGF5ZXI7CkluZGV4OiBXZWJLaXQucHJpCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdC5w
cmkJKHJldmlzaW9uIDUzMzU3KQorKysgV2ViS2l0LnByaQkod29ya2luZyBjb3B5KQpAQCAtNDUs
NiArNDUsNyBAQAogICAgIH0KICAgICBERVBFTkRQQVRIICs9ICQkUFdEL1dlYktpdC9xdC9BcGkK
IH0KK0RFRklORVMgKz0gV1RGX1VTRV9BQ0NFTEVSQVRFRF9DT01QT1NJVElORwogCiAhbWFjOiF1
bml4fHN5bWJpYW4gewogICAgIERFRklORVMgKz0gVVNFX1NZU1RFTV9NQUxMT0MK
</data>
<flag name="review"
          id="29065"
          type_id="1"
          status="-"
          setter="kenneth"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>46808</attachid>
            <date>2010-01-18 02:35:15 -0800</date>
            <delta_ts>2010-01-18 15:49:29 -0800</delta_ts>
            <desc>accelerated compositing in Qt: with massive style improvements and in-code comments</desc>
            <filename>patch-GraphicsLayerQt-2.diff</filename>
            <type>text/plain</type>
            <size>64692</size>
            <attacher name="Noam Rosenthal">noam</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYktpdC9xdC9RR1ZMYXVuY2hlci9tYWluLmNwcAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJL
aXQvcXQvUUdWTGF1bmNoZXIvbWFpbi5jcHAJKHJldmlzaW9uIDUzMzY0KQorKysgV2ViS2l0L3F0
L1FHVkxhdW5jaGVyL21haW4uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00NTgsMTQgKzQ1OCwyMCBA
QAogICAgIFFXZWJTZXR0aW5nczo6ZW5hYmxlUGVyc2lzdGVudFN0b3JhZ2UoKTsKIAogICAgIGNv
bnN0IFFTdHJpbmdMaXN0IGFyZ3MgPSBhcHAuYXJndW1lbnRzKCk7Ci0gICAgaWYgKGFyZ3MuY291
bnQoKSA+IDEpCisgICAgY29uc3QgaW50IGluZGV4T2ZVcmwgPSBhcmdzLmluZGV4T2YoIi0tdXJs
Iik7CisgICAgaWYgKGluZGV4T2ZVcmwgPiAwICYmIGluZGV4T2ZVcmwgPCBhcmdzLmNvdW50KCkg
LSAxKQorICAgICAgICB1cmwgPSBhcmdzLmF0KGluZGV4T2ZVcmwrMSk7CisgICAgZWxzZSBpZiAo
YXJncy5jb3VudCgpID4gMSkKICAgICAgICAgdXJsID0gYXJncy5hdCgxKTsKKyAgICBpZiAoYXJn
cy5jb250YWlucygiLS1jb21wb3NpdGluZyIpKQorICAgICAgICBRV2ViU2V0dGluZ3M6Omdsb2Jh
bFNldHRpbmdzKCktPnNldEF0dHJpYnV0ZShRV2ViU2V0dGluZ3M6OkFjY2VsZXJhdGVkQ29tcG9z
aXRpbmdFbmFibGVkLCB0cnVlKTsKIAogICAgIE1haW5XaW5kb3cqIHdpbmRvdyA9IG5ldyBNYWlu
V2luZG93OwogICAgIHdpbmRvdy0+bG9hZCh1cmwpOwogCi0gICAgZm9yIChpbnQgaSA9IDI7IGkg
PCBhcmdzLmNvdW50KCk7IGkrKykKLSAgICAgICAgd2luZG93LT5uZXdXaW5kb3coYXJncy5hdChp
KSk7CisgICAgZm9yIChpbnQgaSA9IDI7IGkgPCBhcmdzLmNvdW50KCk7ICsraSkKKyAgICAgICAg
aWYgKCFhcmdzLmF0KGkpLnN0YXJ0c1dpdGgoIi0iKSAmJiAhYXJncy5hdChpIC0gMSkuc3RhcnRz
V2l0aCgiLSIpKQorICAgICAgICAgICAgd2luZG93LT5uZXdXaW5kb3coYXJncy5hdChpKSk7CiAK
ICAgICB3aW5kb3ctPnNob3coKTsKICAgICByZXR1cm4gYXBwLmV4ZWMoKTsKSW5kZXg6IFdlYktp
dC9xdC9XZWJDb3JlU3VwcG9ydC9DaHJvbWVDbGllbnRRdC5jcHAKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2Vi
S2l0L3F0L1dlYkNvcmVTdXBwb3J0L0Nocm9tZUNsaWVudFF0LmNwcAkocmV2aXNpb24gNTMzNjQp
CisrKyBXZWJLaXQvcXQvV2ViQ29yZVN1cHBvcnQvQ2hyb21lQ2xpZW50UXQuY3BwCSh3b3JraW5n
IGNvcHkpCkBAIC0yNSw2ICsyNSw3IEBACiAgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKICAqIE9GIFRISVMgU09G
VFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
CiAgKi8KKwogI2luY2x1ZGUgImNvbmZpZy5oIgogI2luY2x1ZGUgIkNocm9tZUNsaWVudFF0Lmgi
CiAKQEAgLTQyLDYgKzQzLDEwIEBACiAjaW5jbHVkZSAiUVdlYlBhZ2VDbGllbnQuaCIKICNpbmNs
dWRlICJTZWN1cml0eU9yaWdpbi5oIgogCisjaW5jbHVkZSA8cWRlYnVnLmg+CisjaW5jbHVkZSA8
cXRleHRkb2N1bWVudC5oPgorI2luY2x1ZGUgPHF0b29sdGlwLmg+CisKICNpbmNsdWRlICJxd2Vi
cGFnZS5oIgogI2luY2x1ZGUgInF3ZWJwYWdlX3AuaCIKICNpbmNsdWRlICJxd2ViZnJhbWVfcC5o
IgpAQCAtNDksMTMgKzU0LDEyIEBACiAjaW5jbHVkZSAicXdlYnNlY3VyaXR5b3JpZ2luX3AuaCIK
ICNpbmNsdWRlICJxd2Vidmlldy5oIgogCi0jaW5jbHVkZSA8cXRvb2x0aXAuaD4KLSNpbmNsdWRl
IDxxdGV4dGRvY3VtZW50Lmg+CisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorI2lu
Y2x1ZGUgIkdyYXBoaWNzTGF5ZXJRdC5oIgorI2VuZGlmCiAKLW5hbWVzcGFjZSBXZWJDb3JlCi17
CituYW1lc3BhY2UgV2ViQ29yZSB7CiAKLQogQ2hyb21lQ2xpZW50UXQ6OkNocm9tZUNsaWVudFF0
KFFXZWJQYWdlKiB3ZWJQYWdlKQogICAgIDogbV93ZWJQYWdlKHdlYlBhZ2UpCiB7CkBAIC00NjYs
NiArNDcwLDI4IEBACiAgICAgbm90SW1wbGVtZW50ZWQoKTsKIH0KIAorI2lmIFVTRShBQ0NFTEVS
QVRFRF9DT01QT1NJVElORykKK3ZvaWQgQ2hyb21lQ2xpZW50UXQ6OmF0dGFjaFJvb3RHcmFwaGlj
c0xheWVyKEZyYW1lKiBmcmFtZSwgR3JhcGhpY3NMYXllciogZ3JhcGhpY3NMYXllcikKK3sgICAg
CisgICAgaWYgKHBsYXRmb3JtUGFnZUNsaWVudCgpKQorICAgICAgICBwbGF0Zm9ybVBhZ2VDbGll
bnQoKS0+c2V0Um9vdEdyYXBoaWNzTGF5ZXIoZ3JhcGhpY3NMYXllciA/IGdyYXBoaWNzTGF5ZXIt
Pm5hdGl2ZUxheWVyKCkgOiAwKTsKK30KKwordm9pZCBDaHJvbWVDbGllbnRRdDo6c2V0TmVlZHNP
bmVTaG90RHJhd2luZ1N5bmNocm9uaXphdGlvbigpCit7CisgICAgLy8gd2Ugd2FudCB0aGUgbGF5
ZXJzIHRvIHN5bmNocm9uaXplIG5leHQgdGltZSB3ZSB1cGRhdGUgdGhlIHNjcmVlbiBhbnl3YXkK
KyAgICBpZiAocGxhdGZvcm1QYWdlQ2xpZW50KCkpCisgICAgICAgIHBsYXRmb3JtUGFnZUNsaWVu
dCgpLT5tYXJrRm9yU3luYyhmYWxzZSk7Cit9CisKK3ZvaWQgQ2hyb21lQ2xpZW50UXQ6OnNjaGVk
dWxlQ29tcG9zaXRpbmdMYXllclN5bmMoKQoreworICAgIC8vIHdlIHdhbnQgdGhlIGxheWVycyB0
byBzeW5jaHJvbml6ZSBBU0FQCisgICAgaWYgKHBsYXRmb3JtUGFnZUNsaWVudCgpKQorICAgICAg
ICBwbGF0Zm9ybVBhZ2VDbGllbnQoKS0+bWFya0ZvclN5bmModHJ1ZSk7Cit9CisjZW5kaWYKKwog
UXRBYnN0cmFjdFdlYlBvcHVwKiBDaHJvbWVDbGllbnRRdDo6Y3JlYXRlUG9wdXAoKQogewogICAg
IHJldHVybiBuZXcgUXRGYWxsYmFja1dlYlBvcHVwOwpJbmRleDogV2ViS2l0L3F0L1dlYkNvcmVT
dXBwb3J0L0Nocm9tZUNsaWVudFF0LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0L3F0L1dlYkNvcmVT
dXBwb3J0L0Nocm9tZUNsaWVudFF0LmgJKHJldmlzaW9uIDUzMzY0KQorKysgV2ViS2l0L3F0L1dl
YkNvcmVTdXBwb3J0L0Nocm9tZUNsaWVudFF0LmgJKHdvcmtpbmcgY29weSkKQEAgLTEyMyw2ICsx
MjMsMTUgQEAKICNpZiBFTkFCTEUoT0ZGTElORV9XRUJfQVBQTElDQVRJT05TKQogICAgICAgICB2
aXJ0dWFsIHZvaWQgcmVhY2hlZE1heEFwcENhY2hlU2l6ZShpbnQ2NF90IHNwYWNlTmVlZGVkKTsK
ICNlbmRpZgorCisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorICAgICAgICAvLyBz
ZWUgQ2hyb21lQ2xpZW50LmgKKyAgICAgICAgLy8gdGhpcyBpcyBhIGhvb2sgZm9yIFdlYkNvcmUg
dG8gdGVsbCB1cyB3aGF0IHdlIG5lZWQgdG8gZG8gd2l0aCB0aGUgR3JhcGhpY3NMYXllcnMKKyAg
ICAgICAgdmlydHVhbCB2b2lkIGF0dGFjaFJvb3RHcmFwaGljc0xheWVyKEZyYW1lKiwgR3JhcGhp
Y3NMYXllciopOworICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0TmVlZHNPbmVTaG90RHJhd2luZ1N5
bmNocm9uaXphdGlvbigpOworICAgICAgICB2aXJ0dWFsIHZvaWQgc2NoZWR1bGVDb21wb3NpdGlu
Z0xheWVyU3luYygpOworI2VuZGlmCisKICAgICAgICAgdmlydHVhbCB2b2lkIHJ1bk9wZW5QYW5l
bChGcmFtZSosIFBhc3NSZWZQdHI8RmlsZUNob29zZXI+KTsKIAogICAgICAgICB2aXJ0dWFsIHZv
aWQgZm9ybVN0YXRlRGlkQ2hhbmdlKGNvbnN0IE5vZGUqKSB7IH0KSW5kZXg6IFdlYktpdC9xdC9B
cGkvcWdyYXBoaWNzd2Vidmlldy5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0L3F0L0FwaS9xZ3Jh
cGhpY3N3ZWJ2aWV3LmNwcAkocmV2aXNpb24gNTMzNjQpCisrKyBXZWJLaXQvcXQvQXBpL3FncmFw
aGljc3dlYnZpZXcuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yMiwyNCArMjIsNzMgQEAKICNpbmNs
dWRlICJxZ3JhcGhpY3N3ZWJ2aWV3LmgiCiAKICNpbmNsdWRlICJxd2ViZnJhbWUuaCIKKyNpbmNs
dWRlICJxd2ViZnJhbWVfcC5oIgogI2luY2x1ZGUgInF3ZWJwYWdlLmgiCiAjaW5jbHVkZSAicXdl
YnBhZ2VfcC5oIgogI2luY2x1ZGUgIlFXZWJQYWdlQ2xpZW50LmgiCi0jaW5jbHVkZSA8UXRHdWkv
UUdyYXBoaWNzU2NlbmU+Ci0jaW5jbHVkZSA8UXRHdWkvUUdyYXBoaWNzVmlldz4KKyNpbmNsdWRl
IDxGcmFtZVZpZXcuaD4KKyNpbmNsdWRlIDxRdENvcmUvcXNoYXJlZHBvaW50ZXIuaD4KKyNpbmNs
dWRlIDxRdENvcmUvcXRpbWVyLmg+CiAjaW5jbHVkZSA8UXRHdWkvcWFwcGxpY2F0aW9uLmg+Cisj
aW5jbHVkZSA8UXRHdWkvcWdyYXBoaWNzc2NlbmUuaD4KICNpbmNsdWRlIDxRdEd1aS9xZ3JhcGhp
Y3NzY2VuZWV2ZW50Lmg+CisjaW5jbHVkZSA8UXRHdWkvcWdyYXBoaWNzdmlldy5oPgorI2luY2x1
ZGUgPFF0R3VpL3FwaXhtYXBjYWNoZS5oPgogI2luY2x1ZGUgPFF0R3VpL3FzdHlsZW9wdGlvbi5o
PgogI2lmIGRlZmluZWQoUV9XU19YMTEpCiAjaW5jbHVkZSA8UVgxMUluZm8+CiAjZW5kaWYKKyNp
bmNsdWRlIDxTZXR0aW5ncy5oPgogCisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQor
CisvLyB0aGUgb3ZlcmxheSBpcyBoZXJlIGZvciBvbmUgcmVhc29uIG9ubHk6IHRvIGhhdmUgdGhl
IHNjcm9sbC1iYXJzIGFuZCBvdGhlcgorLy8gZXh0cmEgVUkgZWxlbWVudHMgYXBwZWFyIG9uIHRv
cCBvZiBhbnkgUUdyYXBoaWNzSXRlbXMgY3JlYXRlZCBieSBDU1MgY29tcG9zaXRpbmcgbGF5ZXJz
CitjbGFzcyBRR3JhcGhpY3NXZWJWaWV3T3ZlcmxheSA6IHB1YmxpYyBRR3JhcGhpY3NJdGVtIHsK
KyAgICBwdWJsaWM6CisgICAgUUdyYXBoaWNzV2ViVmlld092ZXJsYXkoUUdyYXBoaWNzV2ViVmll
dyogdmlldykKKyAgICAgICAgICAgIDpRR3JhcGhpY3NJdGVtKHZpZXcpCisgICAgICAgICAgICAs
IHEodmlldykKKyAgICB7CisgICAgICAgIHNldFBvcygwLCAwKTsKKyAgICAgICAgc2V0RmxhZyhR
R3JhcGhpY3NJdGVtOjpJdGVtVXNlc0V4dGVuZGVkU3R5bGVPcHRpb24sIHRydWUpOworICAgICAg
ICBzZXRDYWNoZU1vZGUoUUdyYXBoaWNzSXRlbTo6RGV2aWNlQ29vcmRpbmF0ZUNhY2hlKTsKKyAg
ICB9CisKKyAgICBRUmVjdEYgYm91bmRpbmdSZWN0KCkgY29uc3QKKyAgICB7CisgICAgICAgIHJl
dHVybiBxLT5ib3VuZGluZ1JlY3QoKTsKKyAgICB9CisKKyAgICB2b2lkIHBhaW50KFFQYWludGVy
KiBwYWludGVyLCBjb25zdCBRU3R5bGVPcHRpb25HcmFwaGljc0l0ZW0qIG9wdGlvbnMsIFFXaWRn
ZXQqKQorICAgIHsKKyAgICAgICAgcS0+cGFnZSgpLT5tYWluRnJhbWUoKS0+cmVuZGVyKHBhaW50
ZXIsIHN0YXRpY19jYXN0PFFXZWJGcmFtZTo6UmVuZGVyTGF5ZXI+KFFXZWJGcmFtZTo6QWxsTGF5
ZXJzJih+UVdlYkZyYW1lOjpDb250ZW50c0xheWVyKSksIG9wdGlvbnMtPmV4cG9zZWRSZWN0LnRv
UmVjdCgpKTsKKyAgICB9CisKKyAgICBmcmllbmQgY2xhc3MgUUdyYXBoaWNzV2ViVmlldzsKKyAg
ICBRR3JhcGhpY3NXZWJWaWV3KiBxOworfTsKKworI2VuZGlmCisKIGNsYXNzIFFHcmFwaGljc1dl
YlZpZXdQcml2YXRlIDogcHVibGljIFFXZWJQYWdlQ2xpZW50IHsKIHB1YmxpYzoKICAgICBRR3Jh
cGhpY3NXZWJWaWV3UHJpdmF0ZShRR3JhcGhpY3NXZWJWaWV3KiBwYXJlbnQpCi0gICAgICAgIDog
cShwYXJlbnQpCi0gICAgICAgICwgcGFnZSgwKQotICAgIHt9CisgICAgICAgIDogcShwYXJlbnQp
LAorICAgICAgICBwYWdlKDApLAorI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKKyAg
ICAgICAgcm9vdEdyYXBoaWNzTGF5ZXIoMCksCisgICAgICAgIG92ZXJsYXkobmV3IFFHcmFwaGlj
c1dlYlZpZXdPdmVybGF5KHBhcmVudCkpLAorICAgICAgICBzaG91bGRTeW5jKHRydWUpCisjZW5k
aWYKKyAgICB7CisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorICAgICAgICAvLyB0
aGUgb3ZlcmxheSBhbmQgc3RheXMgYWxpdmUgZm9yIHRoZSBsaWZldGltZSBvZgorICAgICAgICAv
LyB0aGlzIFFHcmFwaGljc1dlYlZpZXcgYXMgdGhlIHNjcm9sbGJhcnMgYXJlIG5lZWRlZCB3aGVu
IHRoZXJlJ3Mgbm8gY29tcG9zaXRpbmcKKyAgICAgICAgb3ZlcmxheS0+c2V0WlZhbHVlKE92ZXJs
YXlaVmFsdWUpOworICAgICAgICBxLT5zZXRGbGFnKFFHcmFwaGljc0l0ZW06Okl0ZW1Vc2VzRXh0
ZW5kZWRTdHlsZU9wdGlvbik7CisjZW5kaWYKKyAgICB9CiAKICAgICB2aXJ0dWFsIH5RR3JhcGhp
Y3NXZWJWaWV3UHJpdmF0ZSgpOwogICAgIHZpcnR1YWwgdm9pZCBzY3JvbGwoaW50IGR4LCBpbnQg
ZHksIGNvbnN0IFFSZWN0Jik7CkBAIC02MSwxNiArMTEwLDkwIEBACiAKICAgICB2aXJ0dWFsIFFP
YmplY3QqIHBsdWdpblBhcmVudCgpIGNvbnN0OwogCisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBP
U0lUSU5HKQorICAgIHZpcnR1YWwgdm9pZCBzZXRSb290R3JhcGhpY3NMYXllcihRR3JhcGhpY3NJ
dGVtKiBsYXllcik7CisgICAgdmlydHVhbCB2b2lkIG1hcmtGb3JTeW5jKGJvb2wgc2NoZWR1bGVT
eW5jKTsKKyAgICB2b2lkIHVwZGF0ZUNvbXBvc2l0aW5nU2Nyb2xsUG9zaXRpb24oKTsKKyNlbmRp
ZgorCisgICAgdm9pZCBzeW5jTGF5ZXJzKCk7CiAgICAgdm9pZCBfcV9kb0xvYWRGaW5pc2hlZChi
b29sIHN1Y2Nlc3MpOwogCiAgICAgUUdyYXBoaWNzV2ViVmlldyogcTsKICAgICBRV2ViUGFnZSog
cGFnZTsKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCisgICAgUUdyYXBoaWNzSXRl
bSogcm9vdEdyYXBoaWNzTGF5ZXI7CisgICAgUUdyYXBoaWNzV2ViVmlld092ZXJsYXkqIG92ZXJs
YXk7CisKKyAgICAvLyB3ZSBuZWVkIHRvIHN5bmMgdGhlIGxheWVycyBpZiB3ZSBnZXQgYSBzcGVj
aWFsIGNhbGwgZnJvbSB0aGUgV2ViQ29yZQorICAgIC8vIGNvbXBvc2l0b3IgdGVsbGluZyB1cyB0
byBkbyBzby4gV2UnbGwgZ2V0IHRoYXQgY2FsbCBmcm9tIENocm9tZUNsaWVudFF0CisgICAgYm9v
bCBzaG91bGRTeW5jOworCisgICAgLy8gd2UgbmVlZCB0byBwdXQgdGhlIHJvb3QgZ3JhcGhpY3Mg
bGF5ZXIgYmVoaW5kIHRoZSBvdmVybGF5ICh3aGljaCBjb250YWlucyB0aGUgc2Nyb2xsYmFyKQor
ICAgIGVudW0geyBSb290R3JhcGhpY3NMYXllclpWYWx1ZSwgT3ZlcmxheVpWYWx1ZSB9OworI2Vu
ZGlmCiB9OwogCiBRR3JhcGhpY3NXZWJWaWV3UHJpdmF0ZTo6flFHcmFwaGljc1dlYlZpZXdQcml2
YXRlKCkKIHsKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCisgICAgaWYgKHJvb3RH
cmFwaGljc0xheWVyKSB7CisgICAgICAgIC8vIHdlIGRvbid0IG5lZWQgdG8gZGVsZXRlIHRoZSBy
b290IGdyYXBoaWNzIGxheWVyCisgICAgICAgIC8vIFRoZSBsaWZlY3ljbGUgaXMgbWFuYWdlZCBp
biBHcmFwaGljc0xheWVyUXQuY3BwCisgICAgICAgIHJvb3RHcmFwaGljc0xheWVyLT5zZXRQYXJl
bnRJdGVtKDApOworICAgICAgICBxLT5zY2VuZSgpLT5yZW1vdmVJdGVtKHJvb3RHcmFwaGljc0xh
eWVyKTsKKyAgICB9CisjZW5kaWYKIH0KIAorI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElO
RykKK3ZvaWQgUUdyYXBoaWNzV2ViVmlld1ByaXZhdGU6OnNldFJvb3RHcmFwaGljc0xheWVyKFFH
cmFwaGljc0l0ZW0qIGxheWVyKQoreworICAgIGlmIChyb290R3JhcGhpY3NMYXllcikgeworICAg
ICAgICByb290R3JhcGhpY3NMYXllci0+c2V0UGFyZW50SXRlbSgwKTsKKyAgICAgICAgcS0+c2Nl
bmUoKS0+cmVtb3ZlSXRlbShyb290R3JhcGhpY3NMYXllcik7CisgICAgICAgIFFXZWJGcmFtZVBy
aXZhdGU6OmNvcmUocS0+cGFnZSgpLT5tYWluRnJhbWUoKSktPnZpZXcoKS0+c3luY0NvbXBvc2l0
aW5nU3RhdGVSZWN1cnNpdmUoKTsKKyAgICB9CisKKyAgICByb290R3JhcGhpY3NMYXllciA9IGxh
eWVyOworCisgICAgaWYgKGxheWVyKSB7CisgICAgICAgIGxheWVyLT5zZXRGbGFnKFFHcmFwaGlj
c0l0ZW06Okl0ZW1DbGlwc0NoaWxkcmVuVG9TaGFwZSwgdHJ1ZSk7CisgICAgICAgIGxheWVyLT5z
ZXRQYXJlbnRJdGVtKHEpOworICAgICAgICBsYXllci0+c2V0WlZhbHVlKFJvb3RHcmFwaGljc0xh
eWVyWlZhbHVlKTsKKyAgICAgICAgdXBkYXRlQ29tcG9zaXRpbmdTY3JvbGxQb3NpdGlvbigpOwor
ICAgIH0KK30KKwordm9pZCBRR3JhcGhpY3NXZWJWaWV3UHJpdmF0ZTo6bWFya0ZvclN5bmMoYm9v
bCBzY2hlZHVsZVN5bmMpCit7CisgICAgc2hvdWxkU3luYyA9IHRydWU7CisgICAgaWYgKHNjaGVk
dWxlU3luYykKKyAgICAgICAgUVRpbWVyOjpzaW5nbGVTaG90KDAsIHEsIFNMT1Qoc3luY0xheWVy
cygpKSk7Cit9CisKK3ZvaWQgUUdyYXBoaWNzV2ViVmlld1ByaXZhdGU6OnVwZGF0ZUNvbXBvc2l0
aW5nU2Nyb2xsUG9zaXRpb24oKQoreworICAgIGlmIChyb290R3JhcGhpY3NMYXllciAmJiBxLT5w
YWdlKCkgJiYgcS0+cGFnZSgpLT5tYWluRnJhbWUoKSkgeworICAgICAgICBjb25zdCBRUG9pbnQg
c2Nyb2xsUG9zaXRpb24gPSBxLT5wYWdlKCktPm1haW5GcmFtZSgpLT5zY3JvbGxQb3NpdGlvbigp
OworICAgICAgICByb290R3JhcGhpY3NMYXllci0+c2V0UG9zKC1zY3JvbGxQb3NpdGlvbik7Cisg
ICAgfQorfQorCisjZW5kaWYKKworCit2b2lkIFFHcmFwaGljc1dlYlZpZXdQcml2YXRlOjpzeW5j
TGF5ZXJzKCkKK3sKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCisgICAgaWYgKHNo
b3VsZFN5bmMpIHsKKyAgICAgICAgUVdlYkZyYW1lUHJpdmF0ZTo6Y29yZShxLT5wYWdlKCktPm1h
aW5GcmFtZSgpKS0+dmlldygpLT5zeW5jQ29tcG9zaXRpbmdTdGF0ZVJlY3Vyc2l2ZSgpOworICAg
ICAgICBzaG91bGRTeW5jID0gZmFsc2U7CisgICAgfQorI2VuZGlmCit9CisKKwogdm9pZCBRR3Jh
cGhpY3NXZWJWaWV3UHJpdmF0ZTo6X3FfZG9Mb2FkRmluaXNoZWQoYm9vbCBzdWNjZXNzKQogewog
ICAgIC8vIElmIHRoZSBwYWdlIGhhZCBubyB0aXRsZSwgc3RpbGwgbWFrZSBzdXJlIGl0IGdldHMg
dGhlIHNpZ25hbApAQCAtODMsMTEgKzIwNiwxOCBAQAogdm9pZCBRR3JhcGhpY3NXZWJWaWV3UHJp
dmF0ZTo6c2Nyb2xsKGludCBkeCwgaW50IGR5LCBjb25zdCBRUmVjdCYgcmVjdFRvU2Nyb2xsKQog
ewogICAgIHEtPnNjcm9sbChxcmVhbChkeCksIHFyZWFsKGR5KSwgUVJlY3RGKHJlY3RUb1Njcm9s
bCkpOworI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKKyAgICB1cGRhdGVDb21wb3Np
dGluZ1Njcm9sbFBvc2l0aW9uKCk7CisvLyAgICBRQXBwbGljYXRpb246Omluc3RhbmNlKCktPnNl
bmRQb3N0ZWRFdmVudHMoKTsKKyNlbmRpZgogfQogCiB2b2lkIFFHcmFwaGljc1dlYlZpZXdQcml2
YXRlOjp1cGRhdGUoY29uc3QgUVJlY3QgJiBkaXJ0eVJlY3QpCiB7CiAgICAgcS0+dXBkYXRlKFFS
ZWN0RihkaXJ0eVJlY3QpKTsKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCisgICAg
b3ZlcmxheS0+dXBkYXRlKFFSZWN0RihkaXJ0eVJlY3QpKTsKKyNlbmRpZgogfQogCiAKQEAgLTI0
OCw2ICszNzgsNyBAQAogICAgIHNldEFjY2VwdFRvdWNoRXZlbnRzKHRydWUpOwogI2VuZGlmCiAg
ICAgc2V0Rm9jdXNQb2xpY3koUXQ6OlN0cm9uZ0ZvY3VzKTsKKyAgICBzZXRGbGFnKFFHcmFwaGlj
c0l0ZW06Okl0ZW1DbGlwc0NoaWxkcmVuVG9TaGFwZSwgdHJ1ZSk7CiB9CiAKIC8qIQpAQCAtMjkz
LDExICs0MjQsMTcgQEAKICAgICByZXR1cm4gZC0+cGFnZTsKIH0KIAorCiAvKiEgXHJlaW1wCiAq
Lwogdm9pZCBRR3JhcGhpY3NXZWJWaWV3OjpwYWludChRUGFpbnRlciogcGFpbnRlciwgY29uc3Qg
UVN0eWxlT3B0aW9uR3JhcGhpY3NJdGVtKiBvcHRpb24sIFFXaWRnZXQqKQogewotICAgIHBhZ2Uo
KS0+bWFpbkZyYW1lKCktPnJlbmRlcihwYWludGVyLCBvcHRpb24tPmV4cG9zZWRSZWN0LnRvUmVj
dCgpKTsKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCisgICAgcGFnZSgpLT5tYWlu
RnJhbWUoKS0+cmVuZGVyKHBhaW50ZXIsIFFXZWJGcmFtZTo6Q29udGVudHNMYXllciwgb3B0aW9u
LT5leHBvc2VkUmVjdC50b1JlY3QoKSk7CisgICAgZC0+c3luY0xheWVycygpOworI2Vsc2UKKyAg
ICBwYWdlKCktPm1haW5GcmFtZSgpLT5yZW5kZXIocGFpbnRlciwgUVdlYkZyYW1lOjpBbGxMYXll
cnMsIG9wdGlvbi0+ZXhwb3NlZFJlY3QudG9SZWN0KCkpOworI2VuZGlmCiB9CiAKIC8qISBccmVp
bXAKQEAgLTQyNSw2ICs1NjIsOSBAQAogICAgIGQtPnBhZ2UgPSBwYWdlOwogICAgIGlmICghZC0+
cGFnZSkKICAgICAgICAgcmV0dXJuOworI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykK
KyAgICBkLT5vdmVybGF5LT5wcmVwYXJlR2VvbWV0cnlDaGFuZ2UoKTsKKyNlbmRpZgogICAgIGQt
PnBhZ2UtPmQtPmNsaWVudCA9IGQ7IC8vIHNldCB0aGUgcGFnZSBjbGllbnQKIAogICAgIFFTaXpl
IHNpemUgPSBnZW9tZXRyeSgpLnNpemUoKS50b1NpemUoKTsKQEAgLTUyOCw2ICs2NjgsMTEgQEAK
ICovCiB2b2lkIFFHcmFwaGljc1dlYlZpZXc6OnVwZGF0ZUdlb21ldHJ5KCkKIHsKKworI2lmIFVT
RShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKKyAgICBkLT5vdmVybGF5LT5wcmVwYXJlR2VvbWV0
cnlDaGFuZ2UoKTsKKyNlbmRpZgorCiAgICAgUUdyYXBoaWNzV2lkZ2V0Ojp1cGRhdGVHZW9tZXRy
eSgpOwogCiAgICAgaWYgKCFkLT5wYWdlKQpAQCAtNTQzLDYgKzY4OCwxMCBAQAogewogICAgIFFH
cmFwaGljc1dpZGdldDo6c2V0R2VvbWV0cnkocmVjdCk7CiAKKyNpZiBVU0UoQUNDRUxFUkFURURf
Q09NUE9TSVRJTkcpCisgICAgZC0+b3ZlcmxheS0+cHJlcGFyZUdlb21ldHJ5Q2hhbmdlKCk7Cisj
ZW5kaWYKKwogICAgIGlmICghZC0+cGFnZSkKICAgICAgICAgcmV0dXJuOwogCkluZGV4OiBXZWJL
aXQvcXQvQXBpL3F3ZWJzZXR0aW5ncy5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdC9xdC9BcGkvcXdl
YnNldHRpbmdzLmgJKHJldmlzaW9uIDUzMzY0KQorKysgV2ViS2l0L3F0L0FwaS9xd2Vic2V0dGlu
Z3MuaAkod29ya2luZyBjb3B5KQpAQCAtNjgsNyArNjgsOCBAQAogI2VuZGlmCiAgICAgICAgIExv
Y2FsQ29udGVudENhbkFjY2Vzc1JlbW90ZVVybHMsCiAgICAgICAgIERuc1ByZWZldGNoRW5hYmxl
ZCwKLSAgICAgICAgWFNTQXVkaXRvckVuYWJsZWQKKyAgICAgICAgWFNTQXVkaXRvckVuYWJsZWQs
CisgICAgICAgIEFjY2VsZXJhdGVkQ29tcG9zaXRpbmdFbmFibGVkCiAgICAgfTsKICAgICBlbnVt
IFdlYkdyYXBoaWMgewogICAgICAgICBNaXNzaW5nSW1hZ2VHcmFwaGljLApJbmRleDogV2ViS2l0
L3F0L0FwaS9xd2Vic2V0dGluZ3MuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdC9xdC9BcGkvcXdl
YnNldHRpbmdzLmNwcAkocmV2aXNpb24gNTMzNjQpCisrKyBXZWJLaXQvcXQvQXBpL3F3ZWJzZXR0
aW5ncy5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTE1Miw3ICsxNTIsMTIgQEAKICAgICAgICAgdmFs
dWUgPSBhdHRyaWJ1dGVzLnZhbHVlKFFXZWJTZXR0aW5nczo6SmF2YXNjcmlwdEVuYWJsZWQsCiAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbC0+YXR0cmlidXRlcy52
YWx1ZShRV2ViU2V0dGluZ3M6OkphdmFzY3JpcHRFbmFibGVkKSk7CiAgICAgICAgIHNldHRpbmdz
LT5zZXRKYXZhU2NyaXB0RW5hYmxlZCh2YWx1ZSk7CisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBP
U0lUSU5HKQorICAgICAgICB2YWx1ZSA9IGF0dHJpYnV0ZXMudmFsdWUoUVdlYlNldHRpbmdzOjpB
Y2NlbGVyYXRlZENvbXBvc2l0aW5nRW5hYmxlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgZ2xvYmFsLT5hdHRyaWJ1dGVzLnZhbHVlKFFXZWJTZXR0aW5nczo6QWNjZWxl
cmF0ZWRDb21wb3NpdGluZ0VuYWJsZWQpKTsKIAorICAgICAgICBzZXR0aW5ncy0+c2V0QWNjZWxl
cmF0ZWRDb21wb3NpdGluZ0VuYWJsZWQodmFsdWUpOworI2VuZGlmCiAgICAgICAgIHZhbHVlID0g
YXR0cmlidXRlcy52YWx1ZShRV2ViU2V0dGluZ3M6OkphdmFzY3JpcHRDYW5PcGVuV2luZG93cywK
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsLT5hdHRyaWJ1dGVz
LnZhbHVlKFFXZWJTZXR0aW5nczo6SmF2YXNjcmlwdENhbk9wZW5XaW5kb3dzKSk7CiAgICAgICAg
IHNldHRpbmdzLT5zZXRKYXZhU2NyaXB0Q2FuT3BlbldpbmRvd3NBdXRvbWF0aWNhbGx5KHZhbHVl
KTsKQEAgLTM4OSw2ICszOTQsNyBAQAogICAgIGQtPmF0dHJpYnV0ZXMuaW5zZXJ0KFFXZWJTZXR0
aW5nczo6T2ZmbGluZVdlYkFwcGxpY2F0aW9uQ2FjaGVFbmFibGVkLCBmYWxzZSk7CiAgICAgZC0+
YXR0cmlidXRlcy5pbnNlcnQoUVdlYlNldHRpbmdzOjpMb2NhbFN0b3JhZ2VFbmFibGVkLCBmYWxz
ZSk7CiAgICAgZC0+YXR0cmlidXRlcy5pbnNlcnQoUVdlYlNldHRpbmdzOjpMb2NhbENvbnRlbnRD
YW5BY2Nlc3NSZW1vdGVVcmxzLCBmYWxzZSk7CisgICAgZC0+YXR0cmlidXRlcy5pbnNlcnQoUVdl
YlNldHRpbmdzOjpBY2NlbGVyYXRlZENvbXBvc2l0aW5nRW5hYmxlZCwgZmFsc2UpOwogICAgIGQt
Pm9mZmxpbmVTdG9yYWdlRGVmYXVsdFF1b3RhID0gNSAqIDEwMjQgKiAxMDI0OwogICAgIGQtPmRl
ZmF1bHRUZXh0RW5jb2RpbmcgPSBRTGF0aW4xU3RyaW5nKCJpc28tODg1OS0xIik7CiB9CkluZGV4
OiBXZWJLaXQvcXQvQXBpL3FncmFwaGljc3dlYnZpZXcuaAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQv
cXQvQXBpL3FncmFwaGljc3dlYnZpZXcuaAkocmV2aXNpb24gNTMzNjQpCisrKyBXZWJLaXQvcXQv
QXBpL3FncmFwaGljc3dlYnZpZXcuaAkod29ya2luZyBjb3B5KQpAQCAtMTA1LDcgKzEwNSw2IEBA
CiAgICAgdm9pZCBpY29uQ2hhbmdlZCgpOwogICAgIHZvaWQgc3RhdHVzQmFyTWVzc2FnZShjb25z
dCBRU3RyaW5nJiBtZXNzYWdlKTsKICAgICB2b2lkIGxpbmtDbGlja2VkKGNvbnN0IFFVcmwmKTsK
LQogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgdm9pZCBtb3VzZVByZXNzRXZlbnQoUUdyYXBoaWNz
U2NlbmVNb3VzZUV2ZW50Kik7CiAgICAgdmlydHVhbCB2b2lkIG1vdXNlRG91YmxlQ2xpY2tFdmVu
dChRR3JhcGhpY3NTY2VuZU1vdXNlRXZlbnQqKTsKQEAgLTEzNCw3ICsxMzMsOSBAQAogCiBwcml2
YXRlOgogICAgIFFfUFJJVkFURV9TTE9UKGQsIHZvaWQgX3FfZG9Mb2FkRmluaXNoZWQoYm9vbCBz
dWNjZXNzKSkKLQorICAgIC8vIHdlIGRvbid0IHdhbnQgdG8gY2hhbmdlIHRoZSBtb2MgYmFzZWQg
b24gVVNFKCkgbWFjcm8sIHNvIHRoaXMgZnVuY3Rpb24gaXMgaGVyZQorICAgIC8vIGJ1dCB3aWxs
IGJlIGVtcHR5IGlmIEFDQ0xFUkFURURfQ09NUE9TSVRJTkcgaXMgZGlzYWJsZWQKKyAgICBRX1BS
SVZBVEVfU0xPVChkLCB2b2lkIHN5bmNMYXllcnMoKSkKICAgICBRR3JhcGhpY3NXZWJWaWV3UHJp
dmF0ZSogY29uc3QgZDsKICAgICBmcmllbmQgY2xhc3MgUUdyYXBoaWNzV2ViVmlld1ByaXZhdGU7
CiB9OwpJbmRleDogV2ViS2l0L3F0L0FwaS9xd2Vidmlldy5jcHAKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2Vi
S2l0L3F0L0FwaS9xd2Vidmlldy5jcHAJKHJldmlzaW9uIDUzMzY0KQorKysgV2ViS2l0L3F0L0Fw
aS9xd2Vidmlldy5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTIyLDEwICsyMiwxMSBAQAogI2luY2x1
ZGUgImNvbmZpZy5oIgogI2luY2x1ZGUgInF3ZWJ2aWV3LmgiCiAKKyNpbmNsdWRlICJQYWdlLmgi
CiAjaW5jbHVkZSAiUVdlYlBhZ2VDbGllbnQuaCIKKyNpbmNsdWRlICJTZXR0aW5ncy5oIgogI2lu
Y2x1ZGUgInF3ZWJmcmFtZS5oIgogI2luY2x1ZGUgInF3ZWJwYWdlX3AuaCIKLQogI2luY2x1ZGUg
InFiaXRtYXAuaCIKICNpbmNsdWRlICJxZXZlbnQuaCIKICNpbmNsdWRlICJxcGFpbnRlci5oIgpA
QCAtMjQ3LDYgKzI0OCw5IEBACiAgICAgICAgICAgICAgICAgdGhpcywgU0xPVChfcV9wYWdlRGVz
dHJveWVkKCkpKTsKICAgICB9CiAgICAgc2V0QXR0cmlidXRlKFF0OjpXQV9PcGFxdWVQYWludEV2
ZW50LCBkLT5wYWdlKTsKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCisgICAgZC0+
cGFnZS0+ZC0+cGFnZS0+c2V0dGluZ3MoKS0+c2V0QWNjZWxlcmF0ZWRDb21wb3NpdGluZ0VuYWJs
ZWQoZmFsc2UpOworI2VuZGlmCiAgICAgdXBkYXRlKCk7CiB9CiAKSW5kZXg6IFdlYkNvcmUvV2Vi
Q29yZS5wcm8KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9XZWJDb3JlLnBybwkocmV2aXNpb24gNTMz
NjQpCisrKyBXZWJDb3JlL1dlYkNvcmUucHJvCSh3b3JraW5nIGNvcHkpCkBAIC0yNzA3LDYgKzI3
MDcsMTkgQEAKICAgICAgICAgICAgIHBsdWdpbnMvd2luL1BhaW50SG9va3MuYXNtCiAgICAgfQog
fQorY29udGFpbnMoREVGSU5FUywgV1RGX1VTRV9BQ0NFTEVSQVRFRF9DT01QT1NJVElORykgewor
SEVBREVSUyArPSBcCisgICAgcmVuZGVyaW5nL1JlbmRlckxheWVyQmFja2luZy5oIFwKKyAgICBy
ZW5kZXJpbmcvUmVuZGVyTGF5ZXJDb21wb3NpdG9yLmggXAorICAgIHBsYXRmb3JtL2dyYXBoaWNz
L0dyYXBoaWNzTGF5ZXIuaCBcCisgICAgcGxhdGZvcm0vZ3JhcGhpY3MvR3JhcGhpY3NMYXllckNs
aWVudC5oIFwKKyAgICBwbGF0Zm9ybS9ncmFwaGljcy9xdC9HcmFwaGljc0xheWVyUXQuaAorU09V
UkNFUyArPSBcCisgICAgcGxhdGZvcm0vZ3JhcGhpY3MvR3JhcGhpY3NMYXllci5jcHAgXAorICAg
IHBsYXRmb3JtL2dyYXBoaWNzL3F0L0dyYXBoaWNzTGF5ZXJRdC5jcHAgXAorICAgIHJlbmRlcmlu
Zy9SZW5kZXJMYXllckJhY2tpbmcuY3BwIFwKKyAgICByZW5kZXJpbmcvUmVuZGVyTGF5ZXJDb21w
b3NpdG9yLmNwcAorfQogCiBzeW1iaWFuIHsKICAgICBzaGFyZWQgewpJbmRleDogV2ViQ29yZS9w
bGF0Zm9ybS9xdC9RV2ViUGFnZUNsaWVudC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZv
cm0vcXQvUVdlYlBhZ2VDbGllbnQuaAkocmV2aXNpb24gNTMzNjQpCisrKyBXZWJDb3JlL3BsYXRm
b3JtL3F0L1FXZWJQYWdlQ2xpZW50LmgJKHdvcmtpbmcgY29weSkKQEAgLTMwLDcgKzMwLDcgQEAK
ICNpbmNsdWRlIDxRQ3Vyc29yPgogI2VuZGlmCiAjaW5jbHVkZSA8UVJlY3Q+Ci0KK2NsYXNzIFFH
cmFwaGljc0l0ZW07CiBjbGFzcyBRV2ViUGFnZUNsaWVudCB7CiBwdWJsaWM6CiAgICAgdmlydHVh
bCB+UVdlYlBhZ2VDbGllbnQoKSB7IH0KQEAgLTM5LDYgKzM5LDE2IEBACiAgICAgdmlydHVhbCB2
b2lkIHVwZGF0ZShjb25zdCBRUmVjdCYpID0gMDsKICAgICB2aXJ0dWFsIHZvaWQgc2V0SW5wdXRN
ZXRob2RFbmFibGVkKGJvb2wgZW5hYmxlKSA9IDA7CiAgICAgdmlydHVhbCBib29sIGlucHV0TWV0
aG9kRW5hYmxlZCgpIGNvbnN0ID0gMDsKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcp
CisgICAgLy8gdGhpcyBnZXRzIGNhbGxlZCB3aGVuIHdlIHN0YXJ0L3N0b3AgY29tcG9zaXRpbmcu
CisgICAgdmlydHVhbCB2b2lkIHNldFJvb3RHcmFwaGljc0xheWVyKFFHcmFwaGljc0l0ZW0qIGxh
eWVyKSB7fQorCisgICAgLy8gdGhpcyBnZXRzIGNhbGxlZCB3aGVuIHRoZSBjb21wb3NpdG9yIHdh
bnRzIHVzIHRvIHN5bmMgdGhlIGxheWVycworICAgIC8vIGlmIHNjaGVkdWxlU3luYyBpcyB0cnVl
LCB3ZSBzY2hlZHVsZSBhIHN5bmMgb3Vyc2VsdmVzLiBvdGhlcndpc2UsCisgICAgLy8gd2Ugd2Fp
dCBmb3IgdGhlIG5leHQgdXBkYXRlIGFuZCBzeW5jIHRoZSBsYXllcnMgdGhlbi4KKyAgICB2aXJ0
dWFsIHZvaWQgbWFya0ZvclN5bmMoYm9vbCBzY2hlZHVsZVN5bmMgPSBmYWxzZSkge30KKyNlbmRp
ZgorCiAjaWYgUVRfVkVSU0lPTiA+PSAweDA0MDYwMAogICAgIHZpcnR1YWwgdm9pZCBzZXRJbnB1
dE1ldGhvZEhpbnQoUXQ6OklucHV0TWV0aG9kSGludCBoaW50LCBib29sIGVuYWJsZSkgPSAwOwog
I2VuZGlmCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3F0L0dyYXBoaWNzTGF5ZXJR
dC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9xdC9HcmFwaGlj
c0xheWVyUXQuY3BwCShyZXZpc2lvbiAwKQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9x
dC9HcmFwaGljc0xheWVyUXQuY3BwCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDExMTYgQEAKKy8q
CisgICAgQ29weXJpZ2h0IChDKSAyMDA5IE5va2lhIENvcnBvcmF0aW9uIGFuZC9vciBpdHMgc3Vi
c2lkaWFyeSgtaWVzKQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBj
YW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMg
b2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNo
ZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAy
IG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgor
CisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2ls
bCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4g
dGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBG
T1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExpYnJhcnkgR2VuZXJh
bCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZl
IHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5z
ZQorICAgIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIu
ICBJZiBub3QsIHdyaXRlIHRvCisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5j
LiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAgICBCb3N0b24sIE1BIDAyMTEw
LTEzMDEsIFVTQS4KKyovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJHcmFwaGlj
c0xheWVyUXQuaCIKKworI2luY2x1ZGUgIkN1cnJlbnRUaW1lLmgiCisjaW5jbHVkZSAiRmxvYXRS
ZWN0LmgiCisjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCisjaW5jbHVkZSAiSW1hZ2UuaCIK
KyNpbmNsdWRlICJSZWZDb3VudGVkLmgiCisjaW5jbHVkZSAiVHJhbnNsYXRlVHJhbnNmb3JtT3Bl
cmF0aW9uLmgiCisjaW5jbHVkZSAiVW5pdEJlemllci5oIgorI2luY2x1ZGUgPFF0Q29yZS9xYWJz
dHJhY3RhbmltYXRpb24uaD4KKyNpbmNsdWRlIDxRdENvcmUvcWRlYnVnLmg+CisjaW5jbHVkZSA8
UXRDb3JlL3FzZXQuaD4KKyNpbmNsdWRlIDxRdENvcmUvcXRpbWVyLmg+CisjaW5jbHVkZSA8UXRH
dWkvcWFwcGxpY2F0aW9uLmg+CisjaW5jbHVkZSA8UXRHdWkvcWJpdG1hcC5oPgorI2luY2x1ZGUg
PFF0R3VpL3Fjb2xvci5oPgorI2luY2x1ZGUgPFF0R3VpL3FncmFwaGljc2VmZmVjdC5oPgorI2lu
Y2x1ZGUgPFF0R3VpL3FncmFwaGljc2l0ZW0uaD4KKyNpbmNsdWRlIDxRdEd1aS9xZ3JhcGhpY3Nz
Y2VuZS5oPgorI2luY2x1ZGUgPFF0R3VpL3FtYXRyaXg0eDQuaD4KKyNpbmNsdWRlIDxRdEd1aS9x
cGFpbnRlci5oPgorI2luY2x1ZGUgPFF0R3VpL3FwYWxldHRlLmg+CisjaW5jbHVkZSA8UXRHdWkv
cXBpeG1hcC5oPgorI2luY2x1ZGUgPFF0R3VpL3FzdHlsZW9wdGlvbi5oPgorCituYW1lc3BhY2Ug
V2ViQ29yZSB7CisKKworY2xhc3MgR3JhcGhpY3NMYXllclF0UHJpdmF0ZSA6IHB1YmxpYyBRR3Jh
cGhpY3NPYmplY3QgeworICAgIFFfT0JKRUNUCisKK3B1YmxpYzoKKyAgICAvLyB0aGlzIHNldCBv
ZiBmbGFncyBoZWxwIHVzIGRlZmVyIHdoaWNoIHByb3BlcnRpZXMgb2YgdGhlIGxheWVyIGhhdmUg
YmVlbgorICAgIC8vIG1vZGlmaWVkIGJ5IHRoZSBjb21wb3NpdG9yLCBzbyB3ZSBjYW4ga25vdyB3
aGF0IHRvIGxvb2sgZm9yIGluIHRoZSBuZXh0IGZsdXNoCisgICAgZW51bSBQb3NzaWJsZUNoYW5n
ZSB7CisgICAgICAgIE5vQ2hhbmdlcyAgICAgICA9ICAgICAgICAgICAwLAorICAgICAgICBDaGls
ZHJlbkNoYW5nZSAgPSAgICAgICAgICAgKDFMIDw8IDEpLAorICAgICAgICBNYXNrTGF5ZXJDaGFu
Z2UgPSAgICAgICAgICAgKDFMIDw8IDIpLAorICAgICAgICBQb3NpdGlvbkNoYW5nZSAgPSAgICAg
ICAgICAgKDFMIDw8IDMpLAorICAgICAgICBBbmNob3JQb2ludENoYW5nZSA9ICAgICAgICAgKDFM
IDw8IDQpLAorICAgICAgICBTaXplQ2hhbmdlICAgICAgPSAgICAgICAgICAgKDFMIDw8IDUpLAor
ICAgICAgICBUcmFuc2Zvcm1DaGFuZ2UgPSAgICAgICAgICAgKDFMIDw8IDYpLAorICAgICAgICBD
b250ZW50Q2hhbmdlICAgPSAgICAgICAgICAgKDFMIDw8IDcpLAorICAgICAgICBHZW9tZXRyeU9y
aWVudGF0aW9uQ2hhbmdlID0gKDFMIDw8IDgpLAorICAgICAgICBDb250ZW50c09yaWVudGF0aW9u
Q2hhbmdlID0gKDFMIDw8IDkpLAorICAgICAgICBPcGFjaXR5Q2hhbmdlICAgPSAgICAgICAgICAg
KDFMIDw8IDEwKSwKKyAgICAgICAgQ29udGVudHNSZWN0Q2hhbmdlID0gICAgICAgICgxTCA8PCAx
MSksCisgICAgICAgIFByZXNlcnZlczNEQ2hhbmdlID0gICAgICAgICAoMUwgPDwgMTIpLAorICAg
ICAgICBNYXNrc1RvQm91bmRzQ2hhbmdlID0gICAgICAgKDFMIDw8IDEzKSwKKyAgICAgICAgRHJh
d3NDb250ZW50Q2hhbmdlID0gICAgICAgICgxTCA8PCAxNCksCisgICAgICAgIENvbnRlbnRzT3Bh
cXVlQ2hhbmdlID0gICAgICAoMUwgPDwgMTUpLAorICAgICAgICBCYWNrZmFjZVZpc2liaWxpdHlD
aGFuZ2UgPSAgKDFMIDw8IDE2KSwKKyAgICAgICAgQ2hpbGRyZW5UcmFuc2Zvcm1DaGFuZ2UgPSAg
ICgxTCA8PCAxNyksCisgICAgICAgIERpc3BsYXlDaGFuZ2UgPSAgICAgICAgICAgICAoMUwgPDwg
MTgpLAorICAgICAgICBCYWNrZ3JvdW5kQ29sb3JDaGFuZ2UgPSAgICAgKDFMIDw8IDE5KSwKKyAg
ICAgICAgUGFyZW50Q2hhbmdlID0gICAgICAgICAgICAgICgxTCA8PCAyMCksCisgICAgICAgIERp
c3RyaWJ1dGVzT3BhY2l0eUNoYW5nZSA9ICAoMUwgPDwgMjEpCisgICAgfTsKKworICAgIC8vIHRo
ZSBjb21wb3NpdG9yIGxldHMgdXMgc3BlY2lhbC1jYXNlIGltYWdlcyBhbmQgY29sb3JzLCBzbyB3
ZSB0cnkgdG8gZG8gc28KKyAgICBlbnVtIFN0YXRpY0NvbnRlbnRUeXBlIHsgSFRNTENvbnRlbnRU
eXBlLCBQaXhtYXBDb250ZW50VHlwZSwgQ29sb3JDb250ZW50VHlwZX07CisKKyAgICBHcmFwaGlj
c0xheWVyUXRQcml2YXRlKEdyYXBoaWNzTGF5ZXJRdCogbmV3TGF5ZXIsIEdyYXBoaWNzTGF5ZXJD
bGllbnQqIG5ld0NsaWVudCk7CisgICAgdmlydHVhbCB+R3JhcGhpY3NMYXllclF0UHJpdmF0ZSgp
OworCisgICAgLy8gcmVpbXBzIGZyb20gUUdyYXBoaWNzSXRlbQorICAgIHZpcnR1YWwgUVBhaW50
ZXJQYXRoIG9wYXF1ZUFyZWEoKSBjb25zdDsKKyAgICB2aXJ0dWFsIFFSZWN0RiBib3VuZGluZ1Jl
Y3QoKSBjb25zdDsKKyAgICB2aXJ0dWFsIHZvaWQgcGFpbnQoUVBhaW50ZXIqIHBhaW50ZXIsIGNv
bnN0IFFTdHlsZU9wdGlvbkdyYXBoaWNzSXRlbSogb3B0aW9uLCBRV2lkZ2V0KiB3aWRnZXQpOwor
CisgICAgLy8gd2UgbWFuYWdlIHRyYW5zZm9ybXMgb3Vyc2VsdmVzIGJlY2F1c2UgdHJhbnNmb3Jt
LW9yaWdpbiBhY3RzIGRpZmZlcmVudGx5IGluIHdlYmtpdCBhbmQgaW4gUXQKKyAgICB2b2lkIHNl
dEJhc2VUcmFuc2Zvcm0oY29uc3QgUVRyYW5zZm9ybSYgdCk7ICAgIAorICAgIHZvaWQgZHJhd0Nv
bnRlbnRzKFFQYWludGVyKiBwYWludGVyLCBjb25zdCBRUmVjdEYmIHIsIGJvb2wgbWFzayA9IGZh
bHNlKTsKKworICAgIC8vIGxldCB0aGUgY29tcG9zaXRvci1BUEkgdGVsbCB1cyB3aGljaCBwcm9w
ZXJ0aWVzIHdlcmUgY2hhbmdlZAorICAgIHZvaWQgbm90ZUNoYW5nZShQb3NzaWJsZUNoYW5nZSBw
Yyk7CisKKyAgICAvLyBjYWxsZWQgd2hlbiB0aGUgY29tcG9zaXRvciBpcyByZWFkeSBmb3IgdXMg
dG8gc2hvdyB0aGUgY2hhbmdlcyBvbiBzY3JlZW4KKyAgICAvLyB0aGlzIGlzIGNhbGxlZCBpbmRp
cmVjdGx5IGZyb20gQ2hyb21lQ2xpZW50UXQ6OnNldE5lZWRzT25lU2hvdERyYXdpbmdTeW5jaHJv
bml6YXRpb24KKyAgICAvLyAobWVhbmluZyB0aGUgc3luYyB3b3VsZCBoYXBwZW4gdG9nZXRoZXIg
d2l0aCB0aGUgbmV4dCBkcmF3KQorICAgIC8vIG9yIENocm9tZUNsaWVudFF0OjpzY2hlZHVsZUNv
bXBvc2l0aW5nTGF5ZXJTeW5jIChtZWFuaW5nIHRoZSBzeW5jIHdpbGwgaGFwcGVuIEFTQVApCisg
ICAgdm9pZCBmbHVzaENoYW5nZXMoYm9vbCByZWN1cnNpdmUgPSB0cnVlKTsKKworcHVibGljIHNs
b3RzOgorICAgIC8vIHdlIG5lZWQgdG8gbm90aWZ5IHRoZSBjbGllbnQgKGFrYSB0aGUgbGF5ZXIg
Y29tcG9zaXRvcikgd2hlbiB0aGUgYW5pbWF0aW9uIGFjdHVhbGx5IHN0YXJ0cworICAgIHZvaWQg
bm90aWZ5QW5pbWF0aW9uU3RhcnRlZCgpOworCitwdWJsaWM6CisgICAgR3JhcGhpY3NMYXllclF0
KiBsYXllcjsKKyAgICBHcmFwaGljc0xheWVyQ2xpZW50KiBjbGllbnQ7CisKKyAgICBRVHJhbnNm
b3JtIGJhc2VUcmFuc2Zvcm07CisgICAgYm9vbCB0cmFuc2Zvcm1BbmltYXRpb25SdW5uaW5nOwor
ICAgIGJvb2wgb3BhY2l0eUFuaW1hdGlvblJ1bm5pbmc7CisKKyAgICBzdHJ1Y3QgQ29udGVudERh
dGEgeworICAgICAgICBRUGl4bWFwIHBpeG1hcDsKKyAgICAgICAgUVJlZ2lvbiByZWdpb25Ub1Vw
ZGF0ZTsKKyAgICAgICAgYm9vbCB1cGRhdGVBbGw7CisgICAgICAgIGJvb2wgYmFja2dyb3VuZENv
bG9yVmFsaWQ7CisgICAgICAgIFFDb2xvciBjb250ZW50c0JhY2tncm91bmRDb2xvcjsKKyAgICAg
ICAgUUNvbG9yIGJhY2tncm91bmRDb2xvcjsKKyAgICAgICAgU3RhdGljQ29udGVudFR5cGUgY29u
dGVudFR5cGU7CisgICAgICAgIGZsb2F0IG9wYWNpdHk7CisgICAgICAgIENvbnRlbnREYXRhKCkK
KyAgICAgICAgICAgICAgICA6IHVwZGF0ZUFsbChmYWxzZSkKKyAgICAgICAgICAgICAgICAsIGJh
Y2tncm91bmRDb2xvclZhbGlkKGZhbHNlKQorICAgICAgICAgICAgICAgICwgY29udGVudFR5cGUo
SFRNTENvbnRlbnRUeXBlKQorICAgICAgICAgICAgICAgICwgb3BhY2l0eSgxKQorICAgICAgICB7
CisgICAgICAgIH0KKworICAgIH07CisKKyAgICBDb250ZW50RGF0YSBwZW5kaW5nQ29udGVudDsK
KyAgICBDb250ZW50RGF0YSBjdXJyZW50Q29udGVudDsKKworICAgIFBvc3NpYmxlQ2hhbmdlIHBv
c3NpYmxlQ2hhbmdlczsKKworICAgIFFTaXplRiBzaXplOworICAgIFFMaXN0PFFXZWFrUG9pbnRl
cjxRQWJzdHJhY3RBbmltYXRpb24+ID4gYW5pbWF0aW9uczsKKyAgICBRVGltZXIgc3VzcGVuZFRp
bWVyOworCisgICAgc3RydWN0IFN0YXRlIHsKKyAgICAgICAgR3JhcGhpY3NMYXllciogbWFza0xh
eWVyOworICAgICAgICBGbG9hdFBvaW50IHBvczsKKyAgICAgICAgRmxvYXRQb2ludDNEIGFuY2hv
clBvaW50OworICAgICAgICBGbG9hdFNpemUgc2l6ZTsKKyAgICAgICAgVHJhbnNmb3JtYXRpb25N
YXRyaXggdHJhbnNmb3JtOworICAgICAgICBUcmFuc2Zvcm1hdGlvbk1hdHJpeCBjaGlsZHJlblRy
YW5zZm9ybTsKKyAgICAgICAgQ29sb3IgYmFja2dyb3VuZENvbG9yOworICAgICAgICBDb2xvciBj
dXJyZW50Q29sb3I7CisgICAgICAgIEdyYXBoaWNzTGF5ZXI6OkNvbXBvc2l0aW5nQ29vcmRpbmF0
ZXNPcmllbnRhdGlvbiBnZW9PcmllbnRhdGlvbjsKKyAgICAgICAgR3JhcGhpY3NMYXllcjo6Q29t
cG9zaXRpbmdDb29yZGluYXRlc09yaWVudGF0aW9uIGNvbnRlbnRzT3JpZW50YXRpb247CisgICAg
ICAgIGZsb2F0IG9wYWNpdHk7CisgICAgICAgIFFSZWN0IGNvbnRlbnRzUmVjdDsKKworICAgICAg
ICBib29sIHByZXNlcnZlczNEOiAxOworICAgICAgICBib29sIG1hc2tzVG9Cb3VuZHM6IDE7Cisg
ICAgICAgIGJvb2wgZHJhd3NDb250ZW50OiAxOworICAgICAgICBib29sIGNvbnRlbnRzT3BhcXVl
OiAxOworICAgICAgICBib29sIGJhY2tmYWNlVmlzaWJpbGl0eTogMTsKKyAgICAgICAgYm9vbCBk
aXN0cmlidXRlT3BhY2l0eTogMTsKKyAgICAgICAgYm9vbCBhbGlnbjogMjsKKyAgICAgICAgU3Rh
dGUoKSA6IG1hc2tMYXllcigwKSwgb3BhY2l0eSgxKSwgcHJlc2VydmVzM0QoZmFsc2UpLCBtYXNr
c1RvQm91bmRzKGZhbHNlKSwKKyAgICAgICAgICAgICAgICAgIGRyYXdzQ29udGVudChmYWxzZSks
IGNvbnRlbnRzT3BhcXVlKGZhbHNlKSwgYmFja2ZhY2VWaXNpYmlsaXR5KGZhbHNlKSwKKyAgICAg
ICAgICAgICAgICAgIGRpc3RyaWJ1dGVPcGFjaXR5KGZhbHNlKQorICAgICAgICB7CisgICAgICAg
IH0KKyAgICB9IHN0YXRlOworfTsKKworR3JhcGhpY3NMYXllclF0UHJpdmF0ZTo6R3JhcGhpY3NM
YXllclF0UHJpdmF0ZShHcmFwaGljc0xheWVyUXQqIG5ld0xheWVyLCBHcmFwaGljc0xheWVyQ2xp
ZW50KiBuZXdDbGllbnQpCisgICAgICAgIDogUUdyYXBoaWNzT2JqZWN0KDApCisgICAgICAgICwg
bGF5ZXIobmV3TGF5ZXIpCisgICAgICAgICwgdHJhbnNmb3JtQW5pbWF0aW9uUnVubmluZyhmYWxz
ZSkKKyAgICAgICAgLCBwb3NzaWJsZUNoYW5nZXMoTm9DaGFuZ2VzKQorCit7CisgICAgdGhpcy0+
Y2xpZW50ID0gbmV3Q2xpZW50OworCisgICAgLy8gYmV0dGVyIHRvIGNhbGN1bGF0ZSB0aGUgZXhw
b3NlZCByZWN0IGluIFFHcmFwaGljc1ZpZXcgdGhhbiBvdmVyLXJlbmRlciBpbiBXZWJDb3JlCisg
ICAgLy8gdGhvdWdoIHRoaXMgbWlnaHQgYmUgdHdlYWthYmxlCisgICAgc2V0RmxhZyhRR3JhcGhp
Y3NJdGVtOjpJdGVtVXNlc0V4dGVuZGVkU3R5bGVPcHRpb24sIHRydWUpOworCisgICAgLy8gd2Ug
dXNlIGdyYXBoaWNzLXZpZXcgZm9yIGNvbXBvc2l0aW5nLCBub3QgZm9yIGludGVyYWN0aXZpdHkK
KyAgICBzZXRBY2NlcHRlZE1vdXNlQnV0dG9ucyhRdDo6Tm9CdXR0b24pOworICAgIHNldEVuYWJs
ZWQoZmFsc2UpOworCisgICAgLy8gd2UnbGwgc2V0IHRoZSBjYWNoZSB3aGVuIHdlIGtub3cgd2hh
dCdzIGdvaW5nIG9uCisgICAgc2V0Q2FjaGVNb2RlKE5vQ2FjaGUpOworfQorCitHcmFwaGljc0xh
eWVyUXRQcml2YXRlOjp+R3JhcGhpY3NMYXllclF0UHJpdmF0ZSgpCit7CisgICAgLy8gdGhlIGNv
bXBvc2l0b3IgbWFuYWdlcyBpdGVtIGxpZmVjeWNsZSAtIHdlIGRvbid0IHdhbnQgdGhlIGdyYXBo
aWNzLXZpZXcKKyAgICAvLyBzeXN0ZW0gdG8gYXV0b21hdGljYWxseSBkZWxldGUgb3VyIGl0ZW1z
CisgICAgZm9yZWFjaCAoUUdyYXBoaWNzSXRlbSogaSwgY2hpbGRJdGVtcygpKSB7CisgICAgICAg
IGlmIChzY2VuZSgpKQorICAgICAgICAgICAgc2NlbmUoKS0+cmVtb3ZlSXRlbShpKTsKKyAgICAg
ICAgaS0+c2V0UGFyZW50SXRlbSgwKTsKKyAgICB9CisgICAgCisgICAgLy8gd2UgZG8sIGhvd2V2
ZXIsIG93biB0aGUgYW5pbWF0aW9ucy4uLgorICAgIGZvcmVhY2ggKFFXZWFrUG9pbnRlcjxRQWJz
dHJhY3RBbmltYXRpb24+IGFuaW0sIGFuaW1hdGlvbnMpIHsKKyAgICAgICAgaWYgKGFuaW0pCisg
ICAgICAgICAgICBkZWxldGUgYW5pbS5kYXRhKCk7CisgICAgfQorfQorCit2b2lkIEdyYXBoaWNz
TGF5ZXJRdFByaXZhdGU6OnNldEJhc2VUcmFuc2Zvcm0oY29uc3QgUVRyYW5zZm9ybSYgdCkKK3sK
KyAgICBpZiAobGF5ZXIpIHsKKyAgICAgICAgLy8gd2Via2l0IGhhcyByZWxhdGl2ZS10by1zaXpl
IG9yaWdpblBvaW50LCBncmFwaGljcy12aWV3IGhhcyBhIHBpeGVsIG9yaWdpblBvaW50CisgICAg
ICAgIC8vIGhlcmUgd2UgY29udmVydAorICAgICAgICBRUG9pbnRGIG9yaWdpblRyYW5zbGF0ZSgK
KyAgICAgICAgICAgICAgICBsYXllci0+YW5jaG9yUG9pbnQoKS54KCkqbGF5ZXItPnNpemUoKS53
aWR0aCgpLCBsYXllci0+YW5jaG9yUG9pbnQoKS55KCkqbGF5ZXItPnNpemUoKS5oZWlnaHQoKSk7
CisKKyAgICAgICAgcmVzZXRUcmFuc2Zvcm0oKTsKKworICAgICAgICAvLyB3ZSBoYXZlIHRvIG1h
bmFnZSB0aGlzIG91cnNlbHZlcyBiZWNhdXNlIFFHcmFwaGljc1ZpZXcncyB0cmFuc2Zvcm1Pcmln
aW4gaXMgaW5jb21wbGV0ZQorICAgICAgICB0cmFuc2xhdGUob3JpZ2luVHJhbnNsYXRlLngoKSwg
b3JpZ2luVHJhbnNsYXRlLnkoKSk7CisgICAgICAgIHNldFRyYW5zZm9ybSh0LCB0cnVlKTsKKyAg
ICAgICAgdHJhbnNsYXRlKC1vcmlnaW5UcmFuc2xhdGUueCgpLCAtb3JpZ2luVHJhbnNsYXRlLnko
KSk7CisgICAgICAgIGJhc2VUcmFuc2Zvcm0gPSB0OworICAgIH0KK30KKworUVBhaW50ZXJQYXRo
IEdyYXBoaWNzTGF5ZXJRdFByaXZhdGU6Om9wYXF1ZUFyZWEoKSBjb25zdAoreworICAgIFFQYWlu
dGVyUGF0aCBwcDsKKyAgICAvLyB3ZSB0cnkgb3V0IGJlc3QgdG8gcmV0dXJuIHRoZSBvcGFxdWUg
YXJlYSwgbWF5YmUgaXQgd2lsbCBoZWxwIGdyYXBoaWNzLXZpZXcgcmVuZGVyIGxlc3MgaXRlbXMK
KyAgICBpZiAoY3VycmVudENvbnRlbnQuYmFja2dyb3VuZENvbG9yVmFsaWQgJiYgY3VycmVudENv
bnRlbnQuYmFja2dyb3VuZENvbG9yLmFscGhhKCkgPT0gMHhmZikKKyAgICAgICAgcHAuYWRkUmVj
dChib3VuZGluZ1JlY3QoKSk7CisgICAgZWxzZSB7CisgICAgICAgIGlmIChzdGF0ZS5jb250ZW50
c09wYXF1ZQorICAgICAgICAgICAgfHwgKGN1cnJlbnRDb250ZW50LmNvbnRlbnRUeXBlID09IENv
bG9yQ29udGVudFR5cGUgJiYgY3VycmVudENvbnRlbnQuY29udGVudHNCYWNrZ3JvdW5kQ29sb3Iu
YWxwaGEoKSA9PSAweGZmKQorICAgICAgICAgICAgfHwgKGN1cnJlbnRDb250ZW50LmNvbnRlbnRU
eXBlID09IFBpeG1hcENvbnRlbnRUeXBlICYmICFjdXJyZW50Q29udGVudC5waXhtYXAuaGFzQWxw
aGEoKSkpIHsKKworICAgICAgICAgICAgcHAuYWRkUmVjdChzdGF0ZS5jb250ZW50c1JlY3QpOwor
ICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBwcDsKK30KKworUVJlY3RGIEdyYXBoaWNzTGF5
ZXJRdFByaXZhdGU6OmJvdW5kaW5nUmVjdCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIFFSZWN0RihR
UG9pbnRGKDAsIDApLCBRU2l6ZUYoc2l6ZSkpOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJRdFBy
aXZhdGU6OnBhaW50KFFQYWludGVyKiBwYWludGVyLCBjb25zdCBRU3R5bGVPcHRpb25HcmFwaGlj
c0l0ZW0qIG9wdGlvbiwgUVdpZGdldCogd2lkZ2V0KQoreworICAgIGlmIChzdGF0ZS5tYXNrTGF5
ZXIgJiYgc3RhdGUubWFza0xheWVyLT5wbGF0Zm9ybUxheWVyKCkpIHsKKyAgICAgICAgLy8gbWF5
YmUgdGhpcyBzaG91bGRuJ3QgYmUgaW4gcGFpbnQgKHJlbmRlcmluZyB0aGUgbWFzay1sYXllcikK
KyAgICAgICAgLy8gdGhvdWdoIGl0IGRvZXMgd29yayBmb3Igbm93CisgICAgICAgIEdyYXBoaWNz
TGF5ZXJRdFByaXZhdGUqIG90aGVyTWFzayA9IChHcmFwaGljc0xheWVyUXRQcml2YXRlKilzdGF0
ZS5tYXNrTGF5ZXItPnBsYXRmb3JtTGF5ZXIoKTsKKyAgICAgICAgb3RoZXJNYXNrLT5mbHVzaENo
YW5nZXModHJ1ZSk7CisgICAgICAgIAorICAgICAgICAvLyBDU1MzIG1hc2sgYW5kIFFHcmFwaGlj
c09wYWNpdHlFZmZlY3QgYXJlIHRoZSBzYW1lIHRoaW5nISB3ZSBqdXN0IG5lZWQgdG8gY29udmVy
dC4uLgorICAgICAgICBpZiAoIWdyYXBoaWNzRWZmZWN0KCkpIHsKKyAgICAgICAgICAgIFFQaXht
YXAgbWFzayhRU2l6ZShzdGF0ZS5tYXNrTGF5ZXItPnNpemUoKS53aWR0aCgpLCBzdGF0ZS5tYXNr
TGF5ZXItPnNpemUoKS5oZWlnaHQoKSkpOworICAgICAgICAgICAgbWFzay5maWxsKFF0Ojp0cmFu
c3BhcmVudCk7CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUVBhaW50ZXIgcCgmbWFz
ayk7CisgICAgICAgICAgICAgICAgcC5zZXRSZW5kZXJIaW50cyhwYWludGVyLT5yZW5kZXJIaW50
cygpLCB0cnVlKTsKKyAgICAgICAgICAgICAgICBwLnNldENvbXBvc2l0aW9uTW9kZShRUGFpbnRl
cjo6Q29tcG9zaXRpb25Nb2RlX1NvdXJjZSk7CisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8
R3JhcGhpY3NMYXllclF0UHJpdmF0ZSo+KHN0YXRlLm1hc2tMYXllci0+cGxhdGZvcm1MYXllcigp
KS0+ZHJhd0NvbnRlbnRzKCZwLCBvcHRpb24tPmV4cG9zZWRSZWN0LCB0cnVlKTsKKyAgICAgICAg
ICAgIH0KKyAgICAgICAgICAgIFFHcmFwaGljc09wYWNpdHlFZmZlY3QqIGVmZiA9IG5ldyBRR3Jh
cGhpY3NPcGFjaXR5RWZmZWN0KHRoaXMpOworICAgICAgICAgICAgZWZmLT5zZXRPcGFjaXR5KDEp
OworICAgICAgICAgICAgZWZmLT5zZXRPcGFjaXR5TWFzayhRQnJ1c2gobWFzaykpOworICAgICAg
ICAgICAgc2V0R3JhcGhpY3NFZmZlY3QoZWZmKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBkcmF3
Q29udGVudHMocGFpbnRlciwgb3B0aW9uLT5leHBvc2VkUmVjdCk7Cit9CisKK3ZvaWQgR3JhcGhp
Y3NMYXllclF0UHJpdmF0ZTo6ZHJhd0NvbnRlbnRzKFFQYWludGVyKiBwYWludGVyLCBjb25zdCBR
UmVjdEYmIHIsIGJvb2wgbWFzaykKK3sKKyAgICAvLyB3ZWJraXQgdXNlcyBJbnRSZWN0LCB3ZSB1
c2UgUVJlY3RGLiB3ZSBkb24ndCB3YW50IG1pc3NpbmcgcGl4ZWxzICAgIAorICAgIFFSZWN0IHJl
Y3QgPSByLnRvUmVjdCgpLmFkanVzdGVkKC0xLCAtMSwgMSwgMSk7CisgICAgCisgICAgaWYgKGN1
cnJlbnRDb250ZW50LmNvbnRlbnRUeXBlICE9IEhUTUxDb250ZW50VHlwZSAmJiAhc3RhdGUuY29u
dGVudHNSZWN0LmlzRW1wdHkoKSkKKyAgICAgICAgcmVjdCA9IHJlY3QuaW50ZXJzZWN0ZWQoc3Rh
dGUuY29udGVudHNSZWN0KTsKKworICAgIGlmIChjdXJyZW50Q29udGVudC5iYWNrZ3JvdW5kQ29s
b3JWYWxpZCkKKyAgICAgICAgcGFpbnRlci0+ZmlsbFJlY3QociwgUUNvbG9yKGN1cnJlbnRDb250
ZW50LmJhY2tncm91bmRDb2xvcikpOworCisgICAgaWYgKCFyZWN0LmlzRW1wdHkoKSkgeworICAg
ICAgICBzd2l0Y2ggKGN1cnJlbnRDb250ZW50LmNvbnRlbnRUeXBlKSB7CisgICAgICAgIGNhc2Ug
UGl4bWFwQ29udGVudFR5cGU6CisgICAgICAgICAgICAvLyB3ZSBoYXZlIHRvIHNjYWxlIHRoZSBp
bWFnZSB0byB0aGUgY29udGVudHNSZWN0CisgICAgICAgICAgICAvLyBtYXliZSB0aGVyZSdzIGEg
YmV0dGVyIHdheSB0byB0aGlzLCBidXQgdGhpcyB3b3JrcyBmb3Igbm93CisgICAgICAgICAgICBw
YWludGVyLT5kcmF3UGl4bWFwKHJlY3QudG9wTGVmdCgpLAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBjdXJyZW50Q29udGVudC5waXhtYXAuc2NhbGVkKHN0YXRlLmNvbnRlbnRzUmVj
dC5zaXplKCkpLCByKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENvbG9yQ29u
dGVudFR5cGU6CisgICAgICAgICAgICBwYWludGVyLT5maWxsUmVjdChyZWN0LCBjdXJyZW50Q29u
dGVudC5jb250ZW50c0JhY2tncm91bmRDb2xvcik7CisgICAgICAgICAgICBicmVhazsKKyAgICAg
ICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGlmIChzdGF0ZS5kcmF3c0NvbnRlbnQpIHsKKyAgICAg
ICAgICAgICAgICAvLyB0aGlzIGlzIHRoZSAiZXhwZW5zaXZlIiBiaXQuIHdlIHRyeSB0byBtaW5p
bWl6ZSBjYWxscyB0byB0aGlzCisgICAgICAgICAgICAgICAgLy8gbmVjayBvZiB0aGUgd29vZHMg
YnkgcHJvcGVyIGNhY2hpbmcKKyAgICAgICAgICAgICAgICBHcmFwaGljc0NvbnRleHQgZ2MocGFp
bnRlcik7CisgICAgICAgICAgICAgICAgbGF5ZXItPnBhaW50R3JhcGhpY3NMYXllckNvbnRlbnRz
KGdjLCByZWN0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9
CisgICAgfQorfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJRdFByaXZhdGU6Om5vdGVDaGFuZ2UoUG9z
c2libGVDaGFuZ2UgcGMpCit7CisgICAgaWYgKCF0aGlzKQorICAgICAgICByZXR1cm47CisKKyAg
ICBwb3NzaWJsZUNoYW5nZXMgPSBzdGF0aWNfY2FzdDxQb3NzaWJsZUNoYW5nZT4oc3RhdGljX2Nh
c3Q8aW50Pihwb3NzaWJsZUNoYW5nZXMpIHwgc3RhdGljX2Nhc3Q8aW50PihwYykpOworCisgICAg
aWYgKGxheWVyLT5jbGllbnQoKSkKKyAgICAgICAgbGF5ZXItPmNsaWVudCgpLT5ub3RpZnlTeW5j
UmVxdWlyZWQobGF5ZXIpOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJRdFByaXZhdGU6OmZsdXNo
Q2hhbmdlcyhib29sIHJlY3Vyc2l2ZSkKK3sKKyAgICAvLyB0aGlzIGlzIHRoZSBidWxrIG9mIHRo
ZSB3b3JrLiB1bmRlcnN0YW5kaW5nIHdoYXQgdGhlIGNvbXBvc2l0b3IgaXMgdHJ5aW5nIHRvIGFj
aGlldmUsCisgICAgLy8gd2hhdCBncmFwaGljcy12aWV3IGNhbiBkbywgYW5kIHRyeWluZyB0byBm
aW5kIGEgc2FuZSBjb21tb24tZ3JvdW5kcworICAgIGlmIChsYXllcikgeworICAgICAgICBpZiAo
cG9zc2libGVDaGFuZ2VzICE9IE5vQ2hhbmdlcykgeworCisgICAgICAgICAgICBpZiAoY3VycmVu
dENvbnRlbnQuY29udGVudFR5cGUgPT0gSFRNTENvbnRlbnRUeXBlICYmIChwb3NzaWJsZUNoYW5n
ZXMgJiBQYXJlbnRDaGFuZ2UpKSB7CisgICAgICAgICAgICAgICAgLy8gdGhlIFdlYkNvcmUgY29t
cG9zaXRvciBtYW5hZ2VzIGl0ZW0gb3duZXJzaGlwLiBXZSBoYXZlIHRvIG1ha2Ugc3VyZQorICAg
ICAgICAgICAgICAgIC8vIGdyYXBoaWNzLXZpZXcgZG9lc24ndCB0cnkgdG8gc25hdGNoIHRoYXQg
b3duZXJzaGlwLi4uCisgICAgICAgICAgICAgICAgaWYgKCFsYXllci0+cGFyZW50KCkgJiYgIXBh
cmVudEl0ZW0oKSkKKyAgICAgICAgICAgICAgICAgICAgc2V0UGFyZW50SXRlbSgwKTsKKyAgICAg
ICAgICAgICAgICBlbHNlIGlmIChsYXllciAmJiBsYXllci0+cGFyZW50KCkgJiYgbGF5ZXItPnBh
cmVudCgpLT5uYXRpdmVMYXllcigpICE9IHBhcmVudEl0ZW0oKSkKKyAgICAgICAgICAgICAgICAg
ICAgc2V0UGFyZW50SXRlbShsYXllci0+cGFyZW50KCktPm5hdGl2ZUxheWVyKCkpOworICAgICAg
ICAgICAgfQorCisgICAgICAgICAgICBpZiAocG9zc2libGVDaGFuZ2VzICYgQ2hpbGRyZW5DaGFu
Z2UpIHsKKyAgICAgICAgICAgICAgICAvLyB3ZSBiYXNpY2FsbHkgZG8gYW4gWE9SIG9wZXJhdGlv
biBvbiB0aGUgbGlzdCBvZiBjdXJyZW50IGNoaWxkcmVuCisgICAgICAgICAgICAgICAgLy8gYW5k
IHRoZSBsaXN0IG9mIHdhbnRlZCBjaGlsZHJlbiwgYW5kIHJlbW92ZS9hZGQKKyAgICAgICAgICAg
ICAgICBRU2V0PFFHcmFwaGljc0l0ZW0qPiBuZXdDaGlsZHJlbjsKKyAgICAgICAgICAgICAgICBj
b25zdCBWZWN0b3I8R3JhcGhpY3NMYXllcio+IG5ld0NoaWxkcmVuVmVjdG9yID0gKGxheWVyLT5j
aGlsZHJlbigpKTsKKyAgICAgICAgICAgICAgICBuZXdDaGlsZHJlbi5yZXNlcnZlKG5ld0NoaWxk
cmVuVmVjdG9yLnNpemUoKSk7CisKKyAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsg
aSA8IG5ld0NoaWxkcmVuVmVjdG9yLnNpemUoKTsgKytpKQorICAgICAgICAgICAgICAgICAgICBu
ZXdDaGlsZHJlbi5pbnNlcnQobmV3Q2hpbGRyZW5WZWN0b3JbaV0tPnBsYXRmb3JtTGF5ZXIoKSk7
CisKKyAgICAgICAgICAgICAgICBjb25zdCBRU2V0PFFHcmFwaGljc0l0ZW0qPiBjdXJDaGlsZHJl
biA9IGNoaWxkSXRlbXMoKS50b1NldCgpOworICAgICAgICAgICAgICAgIGNvbnN0IFFTZXQ8UUdy
YXBoaWNzSXRlbSo+IGNoaWxkcmVuVG9BZGQgPSBuZXdDaGlsZHJlbiAtIGN1ckNoaWxkcmVuOwor
ICAgICAgICAgICAgICAgIGNvbnN0IFFTZXQ8UUdyYXBoaWNzSXRlbSo+IGNoaWxkcmVuVG9SZW1v
dmUgPSBjdXJDaGlsZHJlbiAtIG5ld0NoaWxkcmVuOworICAgICAgICAgICAgICAgIGZvciAoUVNl
dDxRR3JhcGhpY3NJdGVtKj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gY2hpbGRyZW5Ub0FkZC5iZWdp
bigpOyBpdCAhPSBjaGlsZHJlblRvQWRkLmVuZCgpOyArK2l0KSB7CisgICAgICAgICAgICAgICAg
ICAgICBRR3JhcGhpY3NJdGVtKiB3ID0gKml0OworICAgICAgICAgICAgICAgICAgICAgaWYgKHcp
CisgICAgICAgICAgICAgICAgICAgICAgICB3LT5zZXRQYXJlbnRJdGVtKHRoaXMpOworICAgICAg
ICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3IgKFFTZXQ8UUdyYXBoaWNzSXRlbSo+Ojpj
b25zdF9pdGVyYXRvciBpdCA9IGNoaWxkcmVuVG9SZW1vdmUuYmVnaW4oKTsgaXQgIT0gY2hpbGRy
ZW5Ub1JlbW92ZS5lbmQoKTsgKytpdCkgeworICAgICAgICAgICAgICAgICAgICBRR3JhcGhpY3NJ
dGVtKiB3ID0gKml0OworICAgICAgICAgICAgICAgICAgICBpZiAodykKKyAgICAgICAgICAgICAg
ICAgICAgICAgIHctPnNldFBhcmVudEl0ZW0oMCk7CisgICAgICAgICAgICAgICAgfQorCisgICAg
ICAgICAgICAgICAgLy8gY2hpbGRyZW4gYXJlIG9yZGVyZWQgYnkgei12YWx1ZSwgbGV0IGdyYXBo
aWNzLXZpZXcga25vdy4KKyAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG5l
d0NoaWxkcmVuVmVjdG9yLnNpemUoKTsgKytpKQorICAgICAgICAgICAgICAgICAgICBpZiAobmV3
Q2hpbGRyZW5WZWN0b3JbaV0tPnBsYXRmb3JtTGF5ZXIoKSkKKyAgICAgICAgICAgICAgICAgICAg
ICAgIG5ld0NoaWxkcmVuVmVjdG9yW2ldLT5wbGF0Zm9ybUxheWVyKCktPnNldFpWYWx1ZShpKTsK
KyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHBvc3NpYmxlQ2hhbmdlcyAmIE1hc2tM
YXllckNoYW5nZSkgeworICAgICAgICAgICAgICAgIC8vIHdlIGNhbid0IHBhaW50IGhlcmUsIGJl
Y2F1c2Ugd2UgZG9uJ3Qga25vdyBpZiB0aGUgbWFzayBsYXllcgorICAgICAgICAgICAgICAgIC8v
IGl0c2VsZiBpcyByZWFkeS4uLiB3ZSdsbCBoYXZlIHRvIHdhaXQgdGlsbCB0aGlzIGxheWVyIHRy
aWVzIHRvIHBhaW50CisgICAgICAgICAgICAgICAgc2V0R3JhcGhpY3NFZmZlY3QoMCk7CisgICAg
ICAgICAgICAgICAgaWYgKGxheWVyLT5tYXNrTGF5ZXIoKSkKKyAgICAgICAgICAgICAgICAgICAg
c2V0RmxhZyhJdGVtQ2xpcHNDaGlsZHJlblRvU2hhcGUsIHRydWUpOworICAgICAgICAgICAgICAg
IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgc2V0RmxhZyhJdGVtQ2xpcHNDaGlsZHJlblRvU2hh
cGUsIGxheWVyLT5tYXNrc1RvQm91bmRzKCkpOworICAgICAgICAgICAgICAgIHVwZGF0ZSgpOwor
ICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocG9zc2libGVDaGFuZ2VzICYgUG9zaXRp
b25DaGFuZ2UpIHsgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgKGxheWVyLT5w
b3NpdGlvbigpICE9IHN0YXRlLnBvcykgeworICAgICAgICAgICAgICAgICAgICBzZXRQb3MobGF5
ZXItPnBvc2l0aW9uKCkueCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXItPnBv
c2l0aW9uKCkueSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAg
ICAgICAgIGlmIChwb3NzaWJsZUNoYW5nZXMgJiBTaXplQ2hhbmdlKSB7CisgICAgICAgICAgICAg
ICAgaWYgKGxheWVyLT5zaXplKCkgIT0gc3RhdGUuc2l6ZSkgeworICAgICAgICAgICAgICAgICAg
ICBwcmVwYXJlR2VvbWV0cnlDaGFuZ2UoKTsKKyAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IFFT
aXplRihsYXllci0+c2l6ZSgpLndpZHRoKCksIGxheWVyLT5zaXplKCkuaGVpZ2h0KCkpOworICAg
ICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHBvc3NpYmxl
Q2hhbmdlcyAmIChUcmFuc2Zvcm1DaGFuZ2UgfCBBbmNob3JQb2ludENoYW5nZSB8IFNpemVDaGFu
Z2UpKSB7CisgICAgICAgICAgICAgICAgLy8gc2luY2Ugd2UgY29udmVydCBhIHBlcmNlbnRhZ2Ut
YmFzZWQgb3JpZ2luLXBvaW50IHRvIGEgcGl4ZWwtYmFzZWQgb25lLAorICAgICAgICAgICAgICAg
IC8vIHRoZSBhbmNob3ItcG9pbnQsIHRyYW5zZm9ybSBhbmQgc2l6ZSBmcm9tIFdlYkNvcmUgYWxs
IGFmZmVjdCB0aGUgb25lCisgICAgICAgICAgICAgICAgLy8gdGhhdCB3ZSBnaXZlIFF0CisgICAg
ICAgICAgICAgICAgaWYgKHN0YXRlLnRyYW5zZm9ybSAhPSBsYXllci0+dHJhbnNmb3JtKCkgfHwg
c3RhdGUuYW5jaG9yUG9pbnQgIT0gbGF5ZXItPmFuY2hvclBvaW50KCkgfHwgc3RhdGUuc2l6ZSAh
PSBsYXllci0+c2l6ZSgpKQorICAgICAgICAgICAgICAgICAgICBzZXRCYXNlVHJhbnNmb3JtKFFU
cmFuc2Zvcm0obGF5ZXItPnRyYW5zZm9ybSgpKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAg
ICAgIC8vIG5vdCBzdXJlIGhvdyB0aGlzIGlzIHVzZWQ7IG5vIExheW91dFRlc3QgYWN0dWFsbHkg
dXRpbGl6ZWQgaXQKKyAgICAgICAgICAgIGlmIChwb3NzaWJsZUNoYW5nZXMgJiBDaGlsZHJlblRy
YW5zZm9ybUNoYW5nZSkgeworICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5jaGlsZHJlblRyYW5z
Zm9ybSAhPSBsYXllci0+Y2hpbGRyZW5UcmFuc2Zvcm0oKSkgeworICAgICAgICAgICAgICAgICAg
ICBjb25zdCBRVHJhbnNmb3JtIHRyKGxheWVyLT5jaGlsZHJlblRyYW5zZm9ybSgpKTsKKyAgICAg
ICAgICAgICAgICAgICAgUUxpc3Q8UUdyYXBoaWNzSXRlbSo+IGNoID0gY2hpbGRJdGVtcygpOwor
ICAgICAgICAgICAgICAgICAgICBmb3IgKFFMaXN0PFFHcmFwaGljc0l0ZW0qPjo6aXRlcmF0b3Ig
aXQgPSBjaC5iZWdpbigpOyBpdCAhPSBjaC5lbmQoKTsgKytpdCkKKyAgICAgICAgICAgICAgICAg
ICAgICAgICgqaXQpLT5zZXRUcmFuc2Zvcm0odHIpOworICAgICAgICAgICAgICAgIH0KKyAgICAg
ICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHBvc3NpYmxlQ2hhbmdlcyAmIChDb250ZW50Q2hh
bmdlIHwgRHJhd3NDb250ZW50Q2hhbmdlKSkgeworCisgICAgICAgICAgICAgICAgc3dpdGNoIChw
ZW5kaW5nQ29udGVudC5jb250ZW50VHlwZSkgeworICAgICAgICAgICAgICAgIGNhc2UgUGl4bWFw
Q29udGVudFR5cGU6CisgICAgICAgICAgICAgICAgICAgIC8vIHdlIG5lZWQgY2FjaGUgZXZlbiBm
b3IgaW1hZ2VzLCBiZWNhdXNlIHRoZXkgbmVlZCB0byBiZSByZXNpemVkCisgICAgICAgICAgICAg
ICAgICAgIC8vIHRvIHRoZSBjb250ZW50cyByZWN0LiBtYXliZSB0aGlzIGNhbiBiZSBvcHRpbWl6
ZWQgdGhvdWdoCisgICAgICAgICAgICAgICAgICAgIHNldENhY2hlTW9kZSh0cmFuc2Zvcm1Bbmlt
YXRpb25SdW5uaW5nID8gSXRlbUNvb3JkaW5hdGVDYWNoZSA6IERldmljZUNvb3JkaW5hdGVDYWNo
ZSk7CisgICAgICAgICAgICAgICAgICAgIHVwZGF0ZSgpOworICAgICAgICAgICAgICAgICAgICBz
ZXRGbGFnKEl0ZW1IYXNOb0NvbnRlbnRzLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIGJy
ZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBDb2xvckNvbnRlbnRUeXBlOgorICAgICAgICAg
ICAgICAgICAgICAvLyBubyBwb2ludCBpbiBjYWNoaW5nIGEgc29saWQtY29sb3IgcmVjdGFuZ2xl
CisgICAgICAgICAgICAgICAgICAgIHNldENhY2hlTW9kZShRR3JhcGhpY3NJdGVtOjpOb0NhY2hl
KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBlbmRpbmdDb250ZW50LmNvbnRlbnRUeXBlICE9
IGN1cnJlbnRDb250ZW50LmNvbnRlbnRUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICB8fCBw
ZW5kaW5nQ29udGVudC5jb250ZW50c0JhY2tncm91bmRDb2xvciAhPSBjdXJyZW50Q29udGVudC5j
b250ZW50c0JhY2tncm91bmRDb2xvcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVw
ZGF0ZSgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHN0YXRl
LmRyYXdzQ29udGVudCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBzZXRGbGFnKEl0ZW1I
YXNOb0NvbnRlbnRzLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAg
ICAgICAgICAgICAgY2FzZSBIVE1MQ29udGVudFR5cGU6CisgICAgICAgICAgICAgICAgICAgIGlm
IChwZW5kaW5nQ29udGVudC5jb250ZW50VHlwZSAhPSBjdXJyZW50Q29udGVudC5jb250ZW50VHlw
ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZSgpOworICAgICAgICAgICAgICAgICAg
ICBpZiAoc3RhdGUuZHJhd3NDb250ZW50ICE9IGxheWVyLT5kcmF3c0NvbnRlbnQoKSkgeworICAg
ICAgICAgICAgICAgICAgICAgICAgaWYgKCFzdGF0ZS5kcmF3c0NvbnRlbnQgJiYgbGF5ZXItPmRy
YXdzQ29udGVudCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZSgpOworICAg
ICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChsYXllci0+ZHJhd3ND
b250ZW50KCkpCisgICAgICAgICAgICAgICAgICAgICAgICBzZXRDYWNoZU1vZGUodHJhbnNmb3Jt
QW5pbWF0aW9uUnVubmluZyA/IEl0ZW1Db29yZGluYXRlQ2FjaGUgOiBEZXZpY2VDb29yZGluYXRl
Q2FjaGUpOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAg
ICBzZXRDYWNoZU1vZGUoTm9DYWNoZSk7CisKKyAgICAgICAgICAgICAgICAgICAgc2V0RmxhZyhJ
dGVtSGFzTm9Db250ZW50cywgIWxheWVyLT5kcmF3c0NvbnRlbnQoKSk7CisgICAgICAgICAgICAg
ICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAg
ICAgICAgaWYgKChwb3NzaWJsZUNoYW5nZXMgJiBPcGFjaXR5Q2hhbmdlKSAmJiBzdGF0ZS5vcGFj
aXR5ICE9IGxheWVyLT5vcGFjaXR5KCkpCisgICAgICAgICAgICAgICAgICAgIHNldE9wYWNpdHko
bGF5ZXItPm9wYWNpdHkoKSk7CisKKyAgICAgICAgICAgIGlmIChwb3NzaWJsZUNoYW5nZXMgJiBD
b250ZW50c1JlY3RDaGFuZ2UpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBRUmVjdCByKGxheWVy
LT5jb250ZW50c1JlY3QoKSk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmNvbnRlbnRzUmVj
dCAhPSByKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXRlLmNvbnRlbnRzUmVjdCA9IHI7Cisg
ICAgICAgICAgICAgICAgICAgIHVwZGF0ZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgIH0KKworICAgICAgICAgICAgaWYgKChwb3NzaWJsZUNoYW5nZXMgJiBNYXNrc1RvQm91bmRz
Q2hhbmdlKQorICAgICAgICAgICAgICAgICYmIHN0YXRlLm1hc2tzVG9Cb3VuZHMgIT0gbGF5ZXIt
Pm1hc2tzVG9Cb3VuZHMoKSkgeworCisgICAgICAgICAgICAgICAgc2V0RmxhZyhRR3JhcGhpY3NJ
dGVtOjpJdGVtQ2xpcHNUb1NoYXBlLCBsYXllci0+bWFza3NUb0JvdW5kcygpKTsKKyAgICAgICAg
ICAgICAgICBzZXRGbGFnKFFHcmFwaGljc0l0ZW06Okl0ZW1DbGlwc0NoaWxkcmVuVG9TaGFwZSwg
bGF5ZXItPm1hc2tzVG9Cb3VuZHMoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlm
ICgocG9zc2libGVDaGFuZ2VzICYgQ29udGVudHNPcGFxdWVDaGFuZ2UpCisgICAgICAgICAgICAg
ICAgJiYgc3RhdGUuY29udGVudHNPcGFxdWUgIT0gbGF5ZXItPmNvbnRlbnRzT3BhcXVlKCkpCisg
ICAgICAgICAgICAgICAgICAgIHByZXBhcmVHZW9tZXRyeUNoYW5nZSgpOworCisgICAgICAgICAg
ICBpZiAocG9zc2libGVDaGFuZ2VzICYgRGlzcGxheUNoYW5nZSkgeworICAgICAgICAgICAgICAg
IGlmIChwZW5kaW5nQ29udGVudC51cGRhdGVBbGwpCisgICAgICAgICAgICAgICAgICAgIHVwZGF0
ZSgpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgdXBkYXRlKHBl
bmRpbmdDb250ZW50LnJlZ2lvblRvVXBkYXRlLmJvdW5kaW5nUmVjdCgpKTsKKyAgICAgICAgICAg
IH0KKworICAgICAgICAgICAgaWYgKHBvc3NpYmxlQ2hhbmdlcyAmIEJhY2tncm91bmRDb2xvckNo
YW5nZSkgeworICAgICAgICAgICAgICAgIGlmICgocGVuZGluZ0NvbnRlbnQuYmFja2dyb3VuZENv
bG9yVmFsaWQgIT0gY3VycmVudENvbnRlbnQuYmFja2dyb3VuZENvbG9yVmFsaWQpCisgICAgICAg
ICAgICAgICAgICAgIHx8IChwZW5kaW5nQ29udGVudC5iYWNrZ3JvdW5kQ29sb3JWYWxpZCAmJiAo
cGVuZGluZ0NvbnRlbnQuYmFja2dyb3VuZENvbG9yICE9IGN1cnJlbnRDb250ZW50LmJhY2tncm91
bmRDb2xvcikpKSB7CisgICAgICAgICAgICAgICAgICAgIHVwZGF0ZSgpOworCisgICAgICAgICAg
ICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICBU
T0RPOgorICAgICAgICAgICAgICBHZW9tZXRyeU9yaWVudGF0aW9uQ2hhbmdlCisgICAgICAgICAg
ICAgIENvbnRlbnRzT3JpZW50YXRpb25DaGFuZ2UKKyAgICAgICAgICAgICAgQmFja2ZhY2VWaXNp
YmlsaXR5Q2hhbmdlCisgICAgICAgICAgICAqLworCisgICAgICAgICAgICBzdGF0ZS5tYXNrTGF5
ZXIgPSBsYXllci0+bWFza0xheWVyKCk7CisgICAgICAgICAgICBzdGF0ZS5wb3MgPSBsYXllci0+
cG9zaXRpb24oKTsKKyAgICAgICAgICAgIHN0YXRlLmFuY2hvclBvaW50ID0gbGF5ZXItPmFuY2hv
clBvaW50KCk7CisgICAgICAgICAgICBzdGF0ZS5zaXplID0gbGF5ZXItPnNpemUoKTsKKyAgICAg
ICAgICAgIHN0YXRlLnRyYW5zZm9ybSA9IGxheWVyLT50cmFuc2Zvcm0oKTsKKyAgICAgICAgICAg
IHN0YXRlLmdlb09yaWVudGF0aW9uID0gbGF5ZXItPmdlb21ldHJ5T3JpZW50YXRpb24oKTsKKyAg
ICAgICAgICAgIHN0YXRlLmNvbnRlbnRzT3JpZW50YXRpb24gPSBsYXllci0+Y29udGVudHNPcmll
bnRhdGlvbigpOworICAgICAgICAgICAgc3RhdGUub3BhY2l0eSA9IGxheWVyLT5vcGFjaXR5KCk7
CisgICAgICAgICAgICBzdGF0ZS5jb250ZW50c1JlY3QgPSBsYXllci0+Y29udGVudHNSZWN0KCk7
CisgICAgICAgICAgICBzdGF0ZS5wcmVzZXJ2ZXMzRCA9IGxheWVyLT5wcmVzZXJ2ZXMzRCgpOwor
ICAgICAgICAgICAgc3RhdGUubWFza3NUb0JvdW5kcyA9IGxheWVyLT5tYXNrc1RvQm91bmRzKCk7
CisgICAgICAgICAgICBzdGF0ZS5kcmF3c0NvbnRlbnQgPSBsYXllci0+ZHJhd3NDb250ZW50KCk7
CisgICAgICAgICAgICBzdGF0ZS5jb250ZW50c09wYXF1ZSA9IGxheWVyLT5jb250ZW50c09wYXF1
ZSgpOworICAgICAgICAgICAgc3RhdGUuYmFja2ZhY2VWaXNpYmlsaXR5ID0gbGF5ZXItPmJhY2tm
YWNlVmlzaWJpbGl0eSgpOworICAgICAgICAgICAgY3VycmVudENvbnRlbnQucGl4bWFwID0gcGVu
ZGluZ0NvbnRlbnQucGl4bWFwOworICAgICAgICAgICAgY3VycmVudENvbnRlbnQuY29udGVudFR5
cGUgPSBwZW5kaW5nQ29udGVudC5jb250ZW50VHlwZTsKKyAgICAgICAgICAgIGN1cnJlbnRDb250
ZW50LmJhY2tncm91bmRDb2xvciA9IHBlbmRpbmdDb250ZW50LmJhY2tncm91bmRDb2xvcjsKKyAg
ICAgICAgICAgIGN1cnJlbnRDb250ZW50LmJhY2tncm91bmRDb2xvclZhbGlkID0gcGVuZGluZ0Nv
bnRlbnQuYmFja2dyb3VuZENvbG9yVmFsaWQ7CisgICAgICAgICAgICBjdXJyZW50Q29udGVudC5y
ZWdpb25Ub1VwZGF0ZSB8PSBwZW5kaW5nQ29udGVudC5yZWdpb25Ub1VwZGF0ZTsKKyAgICAgICAg
ICAgIGN1cnJlbnRDb250ZW50LnVwZGF0ZUFsbCB8PSBwZW5kaW5nQ29udGVudC51cGRhdGVBbGw7
CisgICAgICAgICAgICBjdXJyZW50Q29udGVudC5jb250ZW50c0JhY2tncm91bmRDb2xvciA9IHBl
bmRpbmdDb250ZW50LmNvbnRlbnRzQmFja2dyb3VuZENvbG9yOworICAgICAgICAgICAgcGVuZGlu
Z0NvbnRlbnQucmVnaW9uVG9VcGRhdGUgPSBRUmVnaW9uKCk7CisgICAgICAgICAgICBwZW5kaW5n
Q29udGVudC51cGRhdGVBbGwgPSBmYWxzZTsKKyAgICAgICAgICAgIHBvc3NpYmxlQ2hhbmdlcyA9
IE5vQ2hhbmdlczsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChyZWN1cnNpdmUpIHsKKyAg
ICAgICAgUUxpc3Q8UUdyYXBoaWNzSXRlbSo+IGNoID0gY2hpbGRJdGVtcygpOworICAgICAgICBm
b3JlYWNoIChRR3JhcGhpY3NJdGVtKiBpdGVtLCBjaCkgeworICAgICAgICAgICAgR3JhcGhpY3NM
YXllclF0UHJpdmF0ZSogd2RnID0gcW9iamVjdF9jYXN0PEdyYXBoaWNzTGF5ZXJRdFByaXZhdGUq
PihpdGVtLT50b0dyYXBoaWNzT2JqZWN0KCkpOworICAgICAgICAgICAgaWYgKHdkZykKKyAgICAg
ICAgICAgICAgICB3ZGctPmZsdXNoQ2hhbmdlcyh0cnVlKTsKKyAgICAgICAgfQorICAgIH0KK30K
Kwordm9pZCBHcmFwaGljc0xheWVyUXRQcml2YXRlOjpub3RpZnlBbmltYXRpb25TdGFydGVkKCkK
K3sKKyAgICAvLyBXZWJDb3JlIG5vdGlmaWVzIGphdmFzY3JpcHQgd2hlbiB0aGUgYW5pbWF0aW9u
IHN0YXJ0cworICAgIC8vIGhlcmUgd2UncmUgbGV0dGluZyBpdCBrbm93CisgICAgY2xpZW50LT5u
b3RpZnlBbmltYXRpb25TdGFydGVkKGxheWVyLCBXVEY6OmN1cnJlbnRUaW1lKCkpOworfQorCisK
K0dyYXBoaWNzTGF5ZXJRdDo6R3JhcGhpY3NMYXllclF0KEdyYXBoaWNzTGF5ZXJDbGllbnQqIGNs
aWVudCkKKyAgICAgICAgOkdyYXBoaWNzTGF5ZXIoY2xpZW50KQorICAgICAgICAsIHF0TGF5ZXIo
bmV3IEdyYXBoaWNzTGF5ZXJRdFByaXZhdGUodGhpcywgY2xpZW50KSkKK3sKK30KKworR3JhcGhp
Y3NMYXllclF0Ojp+R3JhcGhpY3NMYXllclF0KCkKK3sKKyAgICBkZWxldGUgcXRMYXllcjsKK30K
KworCitQYXNzT3duUHRyPEdyYXBoaWNzTGF5ZXI+IEdyYXBoaWNzTGF5ZXI6OmNyZWF0ZShHcmFw
aGljc0xheWVyQ2xpZW50KiBjbGllbnQpCit7CisgICAgcmV0dXJuIG5ldyBHcmFwaGljc0xheWVy
UXQoY2xpZW50KTsKK30KKworR3JhcGhpY3NMYXllcjo6Q29tcG9zaXRpbmdDb29yZGluYXRlc09y
aWVudGF0aW9uIEdyYXBoaWNzTGF5ZXI6OmNvbXBvc2l0aW5nQ29vcmRpbmF0ZXNPcmllbnRhdGlv
bigpCit7CisgICAgcmV0dXJuIENvbXBvc2l0aW5nQ29vcmRpbmF0ZXNUb3BEb3duOworfQorCit2
b2lkIEdyYXBoaWNzTGF5ZXJRdDo6c2V0TmVlZHNEaXNwbGF5KCkKK3sKKyAgICBxdExheWVyLT5w
ZW5kaW5nQ29udGVudC51cGRhdGVBbGwgPSB0cnVlOworICAgIHF0TGF5ZXItPm5vdGVDaGFuZ2Uo
R3JhcGhpY3NMYXllclF0UHJpdmF0ZTo6RGlzcGxheUNoYW5nZSk7Cit9Cit2b2lkIEdyYXBoaWNz
TGF5ZXJRdDo6c2V0TmVlZHNEaXNwbGF5SW5SZWN0KGNvbnN0IEZsb2F0UmVjdCYgcikKK3sKKyAg
ICBxdExheWVyLT5wZW5kaW5nQ29udGVudC5yZWdpb25Ub1VwZGF0ZXw9IFFSZWN0RihyKS50b1Jl
Y3QoKS5hZGp1c3RlZCgtMSwgLTEsIDEsIDEpOworICAgIHF0TGF5ZXItPm5vdGVDaGFuZ2UoR3Jh
cGhpY3NMYXllclF0UHJpdmF0ZTo6RGlzcGxheUNoYW5nZSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NM
YXllclF0OjpzZXROYW1lKGNvbnN0IFN0cmluZyYgbmFtZSkKK3sKKyAgICBxdExheWVyLT5zZXRP
YmplY3ROYW1lKFFTdHJpbmcobmFtZSkpOworICAgIEdyYXBoaWNzTGF5ZXI6OnNldE5hbWUobmFt
ZSk7Cit9Citib29sIEdyYXBoaWNzTGF5ZXJRdDo6c2V0Q2hpbGRyZW4oY29uc3QgVmVjdG9yPEdy
YXBoaWNzTGF5ZXIqPiYgY2hpbGRyZW4pCit7CisgICAgcXRMYXllci0+bm90ZUNoYW5nZShHcmFw
aGljc0xheWVyUXRQcml2YXRlOjpDaGlsZHJlbkNoYW5nZSk7CisgICAgcmV0dXJuIEdyYXBoaWNz
TGF5ZXI6OnNldENoaWxkcmVuKGNoaWxkcmVuKTsKK30KKwordm9pZCBHcmFwaGljc0xheWVyUXQ6
OmFkZENoaWxkKEdyYXBoaWNzTGF5ZXIqIGxheWVyKQoreworICAgIHF0TGF5ZXItPm5vdGVDaGFu
Z2UoR3JhcGhpY3NMYXllclF0UHJpdmF0ZTo6Q2hpbGRyZW5DaGFuZ2UpOworICAgIEdyYXBoaWNz
TGF5ZXI6OmFkZENoaWxkKGxheWVyKTsKK30KK3ZvaWQgR3JhcGhpY3NMYXllclF0OjphZGRDaGls
ZEF0SW5kZXgoR3JhcGhpY3NMYXllciogbGF5ZXIsIGludCBpbmRleCkKK3sKKyAgICBHcmFwaGlj
c0xheWVyOjphZGRDaGlsZEF0SW5kZXgobGF5ZXIsIGluZGV4KTsKKyAgICBxdExheWVyLT5ub3Rl
Q2hhbmdlKEdyYXBoaWNzTGF5ZXJRdFByaXZhdGU6OkNoaWxkcmVuQ2hhbmdlKTsKK30KK3ZvaWQg
R3JhcGhpY3NMYXllclF0OjphZGRDaGlsZEFib3ZlKEdyYXBoaWNzTGF5ZXIqIGxheWVyLCBHcmFw
aGljc0xheWVyKiBzaWJsaW5nKQoreworICAgICBHcmFwaGljc0xheWVyOjphZGRDaGlsZEFib3Zl
KGxheWVyLCBzaWJsaW5nKTsKKyAgICAgcXRMYXllci0+bm90ZUNoYW5nZShHcmFwaGljc0xheWVy
UXRQcml2YXRlOjpDaGlsZHJlbkNoYW5nZSk7Cit9Cit2b2lkIEdyYXBoaWNzTGF5ZXJRdDo6YWRk
Q2hpbGRCZWxvdyhHcmFwaGljc0xheWVyKiBsYXllciwgR3JhcGhpY3NMYXllciogc2libGluZykK
K3sKKworICAgIEdyYXBoaWNzTGF5ZXI6OmFkZENoaWxkQmVsb3cobGF5ZXIsIHNpYmxpbmcpOwor
ICAgIHF0TGF5ZXItPm5vdGVDaGFuZ2UoR3JhcGhpY3NMYXllclF0UHJpdmF0ZTo6Q2hpbGRyZW5D
aGFuZ2UpOworfQorYm9vbCBHcmFwaGljc0xheWVyUXQ6OnJlcGxhY2VDaGlsZChHcmFwaGljc0xh
eWVyKiBvbGRDaGlsZCwgR3JhcGhpY3NMYXllciogbmV3Q2hpbGQpCit7CisgICAgaWYgKEdyYXBo
aWNzTGF5ZXI6OnJlcGxhY2VDaGlsZChvbGRDaGlsZCwgbmV3Q2hpbGQpKSB7CisgICAgICAgcXRM
YXllci0+bm90ZUNoYW5nZShHcmFwaGljc0xheWVyUXRQcml2YXRlOjpDaGlsZHJlbkNoYW5nZSk7
CisgICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBlbHNlCisgICAgICAgIHJldHVybiBmYWxzZTsK
K30KK3ZvaWQgR3JhcGhpY3NMYXllclF0OjpyZW1vdmVGcm9tUGFyZW50KCkKK3sKKyAgICBpZiAo
cGFyZW50KCkpCisgICAgICAgIHF0TGF5ZXItPm5vdGVDaGFuZ2UoR3JhcGhpY3NMYXllclF0UHJp
dmF0ZTo6UGFyZW50Q2hhbmdlKTsKKyAgICBHcmFwaGljc0xheWVyOjpyZW1vdmVGcm9tUGFyZW50
KCk7Cit9Cit2b2lkIEdyYXBoaWNzTGF5ZXJRdDo6c2V0TWFza0xheWVyKEdyYXBoaWNzTGF5ZXIq
IGxheWVyKQoreworICAgIEdyYXBoaWNzTGF5ZXI6OnNldE1hc2tMYXllcihsYXllcik7CisgICAg
cXRMYXllci0+bm90ZUNoYW5nZShHcmFwaGljc0xheWVyUXRQcml2YXRlOjpNYXNrTGF5ZXJDaGFu
Z2UpOworfQordm9pZCBHcmFwaGljc0xheWVyUXQ6OnNldFBvc2l0aW9uKGNvbnN0IEZsb2F0UG9p
bnQmIHApCit7CisgICAgaWYgKHBvc2l0aW9uKCkgIT0gcCkKKyAgICAgICBxdExheWVyLT5ub3Rl
Q2hhbmdlKEdyYXBoaWNzTGF5ZXJRdFByaXZhdGU6OlBvc2l0aW9uQ2hhbmdlKTsKKyAgICBHcmFw
aGljc0xheWVyOjpzZXRQb3NpdGlvbihwKTsKK30KK3ZvaWQgR3JhcGhpY3NMYXllclF0OjpzZXRB
bmNob3JQb2ludChjb25zdCBGbG9hdFBvaW50M0QmIHApCit7CisgICAgaWYgKGFuY2hvclBvaW50
KCkgIT0gcCkKKyAgICAgICAgcXRMYXllci0+bm90ZUNoYW5nZShHcmFwaGljc0xheWVyUXRQcml2
YXRlOjpBbmNob3JQb2ludENoYW5nZSk7CisgICAgR3JhcGhpY3NMYXllcjo6c2V0QW5jaG9yUG9p
bnQocCk7Cit9Cit2b2lkIEdyYXBoaWNzTGF5ZXJRdDo6c2V0U2l6ZShjb25zdCBGbG9hdFNpemUm
IHNpemUpCit7CisgICAgaWYgKHRoaXMtPnNpemUoKSAhPSBzaXplKQorICAgICAgICBxdExheWVy
LT5ub3RlQ2hhbmdlKEdyYXBoaWNzTGF5ZXJRdFByaXZhdGU6OlNpemVDaGFuZ2UpOworICAgIEdy
YXBoaWNzTGF5ZXI6OnNldFNpemUoc2l6ZSk7Cit9Cit2b2lkIEdyYXBoaWNzTGF5ZXJRdDo6c2V0
VHJhbnNmb3JtKGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4JiB0KQoreworICAgIGlmICghcXRM
YXllci0+dHJhbnNmb3JtQW5pbWF0aW9uUnVubmluZyAmJiB0cmFuc2Zvcm0oKSAhPSB0KQorICAg
ICAgIHF0TGF5ZXItPm5vdGVDaGFuZ2UoR3JhcGhpY3NMYXllclF0UHJpdmF0ZTo6VHJhbnNmb3Jt
Q2hhbmdlKTsKKyAgICBHcmFwaGljc0xheWVyOjpzZXRUcmFuc2Zvcm0odCk7Cit9Cit2b2lkIEdy
YXBoaWNzTGF5ZXJRdDo6c2V0Q2hpbGRyZW5UcmFuc2Zvcm0oY29uc3QgVHJhbnNmb3JtYXRpb25N
YXRyaXgmIHQpCit7CisgICAgR3JhcGhpY3NMYXllcjo6c2V0Q2hpbGRyZW5UcmFuc2Zvcm0odCk7
CisgICAgcXRMYXllci0+bm90ZUNoYW5nZShHcmFwaGljc0xheWVyUXRQcml2YXRlOjpDaGlsZHJl
blRyYW5zZm9ybUNoYW5nZSk7Cit9Cit2b2lkIEdyYXBoaWNzTGF5ZXJRdDo6c2V0UHJlc2VydmVz
M0QoYm9vbCBiKQoreworICAgIGlmIChiICE9IHByZXNlcnZlczNEKCkpOworICAgICAgIHF0TGF5
ZXItPm5vdGVDaGFuZ2UoR3JhcGhpY3NMYXllclF0UHJpdmF0ZTo6UHJlc2VydmVzM0RDaGFuZ2Up
OworICAgIEdyYXBoaWNzTGF5ZXI6OnNldFByZXNlcnZlczNEKGIpOworfQordm9pZCBHcmFwaGlj
c0xheWVyUXQ6OnNldE1hc2tzVG9Cb3VuZHMoYm9vbCBiKQoreworICAgIEdyYXBoaWNzTGF5ZXI6
OnNldE1hc2tzVG9Cb3VuZHMoYik7CisgICAgcXRMYXllci0+bm90ZUNoYW5nZShHcmFwaGljc0xh
eWVyUXRQcml2YXRlOjpNYXNrc1RvQm91bmRzQ2hhbmdlKTsKK30KK3ZvaWQgR3JhcGhpY3NMYXll
clF0OjpzZXREcmF3c0NvbnRlbnQoYm9vbCBiKQoreworICAgIHF0TGF5ZXItPm5vdGVDaGFuZ2Uo
R3JhcGhpY3NMYXllclF0UHJpdmF0ZTo6RHJhd3NDb250ZW50Q2hhbmdlKTsKKyAgICBHcmFwaGlj
c0xheWVyOjpzZXREcmF3c0NvbnRlbnQoYik7Cit9Cit2b2lkIEdyYXBoaWNzTGF5ZXJRdDo6c2V0
QmFja2dyb3VuZENvbG9yKGNvbnN0IENvbG9yJiBjKQoreworICAgIHF0TGF5ZXItPm5vdGVDaGFu
Z2UoR3JhcGhpY3NMYXllclF0UHJpdmF0ZTo6QmFja2dyb3VuZENvbG9yQ2hhbmdlKTsKKyAgICBx
dExheWVyLT5wZW5kaW5nQ29udGVudC5iYWNrZ3JvdW5kQ29sb3IgPSBjOworICAgIHF0TGF5ZXIt
PnBlbmRpbmdDb250ZW50LmJhY2tncm91bmRDb2xvclZhbGlkID0gdHJ1ZTsKKyAgICBHcmFwaGlj
c0xheWVyOjpzZXRCYWNrZ3JvdW5kQ29sb3IoYyk7Cit9Cit2b2lkIEdyYXBoaWNzTGF5ZXJRdDo6
Y2xlYXJCYWNrZ3JvdW5kQ29sb3IoKQoreworICAgIHF0TGF5ZXItPnBlbmRpbmdDb250ZW50LmJh
Y2tncm91bmRDb2xvclZhbGlkID0gZmFsc2U7CisgICAgcXRMYXllci0+bm90ZUNoYW5nZShHcmFw
aGljc0xheWVyUXRQcml2YXRlOjpCYWNrZ3JvdW5kQ29sb3JDaGFuZ2UpOworICAgIEdyYXBoaWNz
TGF5ZXI6OmNsZWFyQmFja2dyb3VuZENvbG9yKCk7Cit9Cit2b2lkIEdyYXBoaWNzTGF5ZXJRdDo6
c2V0Q29udGVudHNPcGFxdWUoYm9vbCBiKQoreworICAgIHF0TGF5ZXItPm5vdGVDaGFuZ2UoR3Jh
cGhpY3NMYXllclF0UHJpdmF0ZTo6Q29udGVudHNPcGFxdWVDaGFuZ2UpOworICAgIEdyYXBoaWNz
TGF5ZXI6OnNldENvbnRlbnRzT3BhcXVlKGIpOworfQordm9pZCBHcmFwaGljc0xheWVyUXQ6OnNl
dEJhY2tmYWNlVmlzaWJpbGl0eShib29sIGIpCit7CisgICAgcXRMYXllci0+bm90ZUNoYW5nZShH
cmFwaGljc0xheWVyUXRQcml2YXRlOjpCYWNrZmFjZVZpc2liaWxpdHlDaGFuZ2UpOworICAgIEdy
YXBoaWNzTGF5ZXI6OnNldEJhY2tmYWNlVmlzaWJpbGl0eShiKTsKK30KKwordm9pZCBHcmFwaGlj
c0xheWVyUXQ6OnNldE9wYWNpdHkoZmxvYXQgbykKK3sKKyAgICBpZiAoIXF0TGF5ZXItPm9wYWNp
dHlBbmltYXRpb25SdW5uaW5nICYmIG9wYWNpdHkoKSAhPSBvKQorICAgICAgIHF0TGF5ZXItPm5v
dGVDaGFuZ2UoR3JhcGhpY3NMYXllclF0UHJpdmF0ZTo6T3BhY2l0eUNoYW5nZSk7CisgICAgR3Jh
cGhpY3NMYXllcjo6c2V0T3BhY2l0eShvKTsKK30KK3ZvaWQgR3JhcGhpY3NMYXllclF0OjpzZXRD
b250ZW50c1JlY3QoY29uc3QgSW50UmVjdCYgcikKK3sKKyAgICBxdExheWVyLT5ub3RlQ2hhbmdl
KEdyYXBoaWNzTGF5ZXJRdFByaXZhdGU6OkNvbnRlbnRzUmVjdENoYW5nZSk7CisgICAgR3JhcGhp
Y3NMYXllcjo6c2V0Q29udGVudHNSZWN0KHIpOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJRdDo6
c2V0Q29udGVudHNUb0ltYWdlKEltYWdlKiBpbWFnZSkKK3sKKyAgICBxdExheWVyLT5ub3RlQ2hh
bmdlKEdyYXBoaWNzTGF5ZXJRdFByaXZhdGU6OkNvbnRlbnRDaGFuZ2UpOworICAgIHF0TGF5ZXIt
PnBlbmRpbmdDb250ZW50LmNvbnRlbnRUeXBlID0gR3JhcGhpY3NMYXllclF0UHJpdmF0ZTo6SFRN
TENvbnRlbnRUeXBlOworICAgIEdyYXBoaWNzTGF5ZXI6OnNldENvbnRlbnRzVG9JbWFnZShpbWFn
ZSk7CisgICAgaWYgKGltYWdlKSB7CisgICAgICAgIFFQaXhtYXAqIHB4bSA9IGltYWdlLT5uYXRp
dmVJbWFnZUZvckN1cnJlbnRGcmFtZSgpOworICAgICAgICBpZiAocHhtKSB7CisgICAgICAgICAg
ICBxdExheWVyLT5wZW5kaW5nQ29udGVudC5waXhtYXAgPSAqcHhtOworICAgICAgICAgICAgcXRM
YXllci0+cGVuZGluZ0NvbnRlbnQuY29udGVudFR5cGUgPSBHcmFwaGljc0xheWVyUXRQcml2YXRl
OjpQaXhtYXBDb250ZW50VHlwZTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSAgICAg
ICAgCisgICAgfQorICAgIHF0TGF5ZXItPnBlbmRpbmdDb250ZW50LnBpeG1hcCA9IFFQaXhtYXAo
KTsKK30KKwordm9pZCBHcmFwaGljc0xheWVyUXQ6OnNldENvbnRlbnRzQmFja2dyb3VuZENvbG9y
KGNvbnN0IENvbG9yJiBjb2xvcikKK3sKKyAgICBxdExheWVyLT5ub3RlQ2hhbmdlKEdyYXBoaWNz
TGF5ZXJRdFByaXZhdGU6OkNvbnRlbnRDaGFuZ2UpOworICAgIHF0TGF5ZXItPnBlbmRpbmdDb250
ZW50LmNvbnRlbnRUeXBlID0gR3JhcGhpY3NMYXllclF0UHJpdmF0ZTo6Q29sb3JDb250ZW50VHlw
ZTsKKyAgICBxdExheWVyLT5wZW5kaW5nQ29udGVudC5jb250ZW50c0JhY2tncm91bmRDb2xvciA9
IFFDb2xvcihjb2xvcik7CisgICAgR3JhcGhpY3NMYXllcjo6c2V0Q29udGVudHNCYWNrZ3JvdW5k
Q29sb3IoY29sb3IpOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJRdDo6c2V0R2VvbWV0cnlPcmll
bnRhdGlvbihDb21wb3NpdGluZ0Nvb3JkaW5hdGVzT3JpZW50YXRpb24gb3JpZW50YXRpb24pCit7
CisgICAgcXRMYXllci0+bm90ZUNoYW5nZShHcmFwaGljc0xheWVyUXRQcml2YXRlOjpHZW9tZXRy
eU9yaWVudGF0aW9uQ2hhbmdlKTsKKyAgICBHcmFwaGljc0xheWVyOjpzZXRHZW9tZXRyeU9yaWVu
dGF0aW9uKG9yaWVudGF0aW9uKTsKK30KKwordm9pZCBHcmFwaGljc0xheWVyUXQ6OnNldENvbnRl
bnRzT3JpZW50YXRpb24oQ29tcG9zaXRpbmdDb29yZGluYXRlc09yaWVudGF0aW9uIG9yaWVudGF0
aW9uKQoreworICAgIHF0TGF5ZXItPm5vdGVDaGFuZ2UoR3JhcGhpY3NMYXllclF0UHJpdmF0ZTo6
Q29udGVudHNPcmllbnRhdGlvbkNoYW5nZSk7CisgICAgR3JhcGhpY3NMYXllcjo6c2V0Q29udGVu
dHNPcmllbnRhdGlvbihvcmllbnRhdGlvbik7Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllclF0Ojpk
aXN0cmlidXRlT3BhY2l0eShmbG9hdCBvKQoreworICAgIHF0TGF5ZXItPm5vdGVDaGFuZ2UoR3Jh
cGhpY3NMYXllclF0UHJpdmF0ZTo6T3BhY2l0eUNoYW5nZSk7CisgICAgcXRMYXllci0+c3RhdGUu
ZGlzdHJpYnV0ZU9wYWNpdHkgPSB0cnVlOworfQorCitmbG9hdCBHcmFwaGljc0xheWVyUXQ6OmFj
Y3VtdWxhdGVkT3BhY2l0eSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIHF0TGF5ZXItPmVmZmVjdGl2
ZU9wYWNpdHkoKTsKK30KKwordm9pZCBHcmFwaGljc0xheWVyUXQ6OnN5bmNDb21wb3NpdGluZ1N0
YXRlKCkKK3sKKyAgICBxdExheWVyLT5mbHVzaENoYW5nZXMoKTsKKyAgICBHcmFwaGljc0xheWVy
OjpzeW5jQ29tcG9zaXRpbmdTdGF0ZSgpOworfQorCitOYXRpdmVMYXllciBHcmFwaGljc0xheWVy
UXQ6Om5hdGl2ZUxheWVyKCkgY29uc3QKK3sKKyAgICByZXR1cm4gcXRMYXllcjsKK30KKworUGxh
dGZvcm1MYXllciogR3JhcGhpY3NMYXllclF0OjpwbGF0Zm9ybUxheWVyKCkgY29uc3QKK3sKKyAg
ICByZXR1cm4gcXRMYXllcjsKK30KKworLy8gbm93IHdlIHN0YXJ0IGRlYWxpbmcgd2l0aCBXZWJD
b3JlIGFuaW1hdGlvbnMgdHJhbnNsYXRlZCB0byBRdCBhbmltYXRpb25zCisKK3RlbXBsYXRlIDx0
eXBlbmFtZSBUPgorc3RydWN0IEtleWZyYW1lVmFsdWVRdCB7CisgICAgVGltaW5nRnVuY3Rpb24g
dGltaW5nRnVuY3Rpb247CisgICAgVCB2YWx1ZTsKK307CisKKy8vIHdlIGNvcHkgdGhpcyBmcm9t
IHRoZSBXZWJDb3JlIGFuaW1hdGlvbiBjb2RlCitzdGF0aWMgaW5saW5lIGRvdWJsZSBzb2x2ZUVw
c2lsb24oZG91YmxlIGR1cmF0aW9uKQoreworICAgIHJldHVybiAxLjAgLyAoMjAwLjAgKiBkdXJh
dGlvbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgZG91YmxlIHNvbHZlQ3ViaWNCZXppZXJGdW5jdGlv
bihxcmVhbCBwMXgsIHFyZWFsIHAxeSwgcXJlYWwgcDJ4LCBxcmVhbCBwMnksIGRvdWJsZSB0LCBk
b3VibGUgZHVyYXRpb24pCit7CisgICAgVW5pdEJlemllciBiZXppZXIocDF4LCBwMXksIHAyeCwg
cDJ5KTsKKyAgICByZXR1cm4gYmV6aWVyLnNvbHZlKHQsIHNvbHZlRXBzaWxvbihkdXJhdGlvbikp
OworfQorCisvLyB3ZSB3YW50IHRoZSB0aW1pbmcgZnVuY3Rpb24gdG8gYmUgYXMgY2xvc2UgYXMg
cG9zc2libGUgdG8gd2hhdCB0aGUgd2ViLWRldmVsb3BlcgorLy8gaW50ZW5kZWQsIHNvIHdlJ3Jl
IHVzaW5nIHRoZSBzYW1lIGZ1bmN0aW9uIHVzZWQgYnkgV2ViQ29yZSB3aGVuIGNvbXBvc2l0aW5n
IGlzIGRpc2FibGVkCitzdGF0aWMgaW5saW5lIHFyZWFsIGFwcGx5VGltaW5nRnVuY3Rpb24oY29u
c3QgVGltaW5nRnVuY3Rpb24mIHRpbWluZ0Z1bmN0aW9uLCBxcmVhbCBwcm9ncmVzcywgaW50IGR1
cmF0aW9uKQoreworICAgICAgICBpZiAodGltaW5nRnVuY3Rpb24udHlwZSgpID09IExpbmVhclRp
bWluZ0Z1bmN0aW9uKQorICAgICAgICAgICAgcmV0dXJuIHByb2dyZXNzOworICAgICAgICBpZiAo
dGltaW5nRnVuY3Rpb24udHlwZSgpID09IEN1YmljQmV6aWVyVGltaW5nRnVuY3Rpb24pIHsKKyAg
ICAgICAgICAgIHJldHVybiBzb2x2ZUN1YmljQmV6aWVyRnVuY3Rpb24odGltaW5nRnVuY3Rpb24u
eDEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltaW5n
RnVuY3Rpb24ueTEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgdGltaW5nRnVuY3Rpb24ueDIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgdGltaW5nRnVuY3Rpb24ueTIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgZG91YmxlKHByb2dyZXNzKSwgZG91YmxlKGR1cmF0aW9uKSAv
IDEwMDApOworICAgICAgICB9CisgICAgICAgIHJldHVybiBwcm9ncmVzczsKK30KKworLy8gaGVs
cGVyIGZ1bmN0aW9ucyB0byBzYWZlbHkgZ2V0IGEgdmFsdWUgb3V0IG9mIFdlYkNvcmUncyBBbmlt
YXRpb25WYWx1ZSoKK3N0YXRpYyB2b2lkIHdlYmtpdEFuaW1hdGlvblRvUXRBbmltYXRpb25WYWx1
ZShjb25zdCBBbmltYXRpb25WYWx1ZSogYW5pbWF0aW9uVmFsdWUsIFRyYW5zZm9ybU9wZXJhdGlv
bnMmIHRyYW5zZm9ybU9wZXJhdGlvbnMpCit7CisgICAgICAgIGlmIChhbmltYXRpb25WYWx1ZSkg
eworICAgICAgICAgICAgY29uc3QgVHJhbnNmb3JtT3BlcmF0aW9ucyogb3BzID0gc3RhdGljX2Nh
c3Q8Y29uc3QgVHJhbnNmb3JtQW5pbWF0aW9uVmFsdWUqPihhbmltYXRpb25WYWx1ZSktPnZhbHVl
KCk7CisgICAgICAgICAgICB0cmFuc2Zvcm1PcGVyYXRpb25zID0gb3BzPypvcHM6VHJhbnNmb3Jt
T3BlcmF0aW9ucygpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIHRyYW5zZm9ybU9wZXJh
dGlvbnMgPSBUcmFuc2Zvcm1PcGVyYXRpb25zKCk7CisKK30KKworc3RhdGljIHZvaWQgd2Via2l0
QW5pbWF0aW9uVG9RdEFuaW1hdGlvblZhbHVlKGNvbnN0IEFuaW1hdGlvblZhbHVlKiBhbmltYXRp
b25WYWx1ZSwgcXJlYWwmIHJlYWxWYWx1ZSkKK3sKKyAgICAgICAgaWYgKGFuaW1hdGlvblZhbHVl
KQorICAgICAgICAgICAgcmVhbFZhbHVlID0gc3RhdGljX2Nhc3Q8Y29uc3QgRmxvYXRBbmltYXRp
b25WYWx1ZSo+KGFuaW1hdGlvblZhbHVlKS0+dmFsdWUoKTsKKyAgICAgICAgZWxzZQorICAgICAg
ICAgICAgcmVhbFZhbHVlID0gMDsKK30KKworLy8gd2UgcHV0IGEgYml0IG9mIHRoZSBmdW5jdGlv
bmFsaXR5IGluIGEgYmFzZSBjbGFzcyB0byBhbGxvdyBjYXN0aW5nIGFuZCB0byBzYXZlIHNvbWUg
Y29kZSBzaXplCitjbGFzcyBBbmltYXRpb25RdEJhc2UgOiBwdWJsaWMgUUFic3RyYWN0QW5pbWF0
aW9uIHsKK3B1YmxpYzoKKyAgICBBbmltYXRpb25RdEJhc2UoR3JhcGhpY3NMYXllclF0UHJpdmF0
ZSogYUxheWVyCisgICAgICAgICAgICAgICAgICAgICwgY29uc3QgS2V5ZnJhbWVWYWx1ZUxpc3Qm
IHZhbHVlcworICAgICAgICAgICAgICAgICAgICAsIGNvbnN0IEludFNpemUmIGFCb3hTaXplCisg
ICAgICAgICAgICAgICAgICAgICwgY29uc3QgQW5pbWF0aW9uKiBhbmltCisgICAgICAgICAgICAg
ICAgICAgICwgY29uc3QgUVN0cmluZyAmIGtmTmFtZQorICAgICAgICAgICAgICAgICAgICApCisg
ICAgICAgICAgICA6IFFBYnN0cmFjdEFuaW1hdGlvbigwKQorICAgICAgICAgICAgLCB0YXJnZXQo
YUxheWVyKQorICAgICAgICAgICAgLCBib3hTaXplKGFCb3hTaXplKQorICAgICAgICAgICAgLCBt
RHVyYXRpb24oYW5pbS0+ZHVyYXRpb24oKSAqIDEwMDApCisgICAgICAgICAgICAsIGlzQWx0ZXJu
YXRlKGFuaW0tPmRpcmVjdGlvbigpID09IEFuaW1hdGlvbjo6QW5pbWF0aW9uRGlyZWN0aW9uQWx0
ZXJuYXRlKQorICAgICAgICAgICAgLCB3ZWJraXRQcm9wZXJ0eUlEKHZhbHVlcy5wcm9wZXJ0eSgp
KQorICAgICAgICAgICAgLCBrZXlmcmFtZXNOYW1lKGtmTmFtZSkKKyAgICB7CisgICAgfQorCisg
ICAgdmlydHVhbCB2b2lkIHVwZGF0ZVN0YXRlKFFBYnN0cmFjdEFuaW1hdGlvbjo6U3RhdGUgbmV3
U3RhdGUsIFFBYnN0cmFjdEFuaW1hdGlvbjo6U3RhdGUgb2xkU3RhdGUpCisgICAgeworICAgICAg
ICBRQWJzdHJhY3RBbmltYXRpb246OnVwZGF0ZVN0YXRlKG5ld1N0YXRlLCBvbGRTdGF0ZSk7CisK
KyAgICAgICAgaWYgKG5ld1N0YXRlID09IFJ1bm5pbmcgJiYgb2xkU3RhdGUgPT0gU3RvcHBlZCkK
KyAgICAgICAgLy8gZm9yIHNvbWUgcmVhc29uIEkgaGF2ZSBkbyB0aGlzIGFzeW5jaHJvbm91c2x5
IC0gb3IgdGhlIGFuaW1hdGlvbiB3b24ndCB3b3JrCisgICAgICAgICAgICBRVGltZXI6OnNpbmds
ZVNob3QoMCwgdGFyZ2V0LmRhdGEoKSwgU0xPVChub3RpZnlBbmltYXRpb25TdGFydGVkKCkpKTsK
KyAgICB9CisKKyAgICB2aXJ0dWFsIGludCBkdXJhdGlvbigpIGNvbnN0IHsgcmV0dXJuIG1EdXJh
dGlvbjsgfQorCisgICAgUVdlYWtQb2ludGVyPEdyYXBoaWNzTGF5ZXJRdFByaXZhdGU+IHRhcmdl
dDsKKyAgICBJbnRTaXplIGJveFNpemU7CisgICAgaW50IG1EdXJhdGlvbjsKKyAgICBib29sIGlz
QWx0ZXJuYXRlOworICAgIEFuaW1hdGVkUHJvcGVydHlJRCB3ZWJraXRQcm9wZXJ0eUlEOworICAg
IFFTdHJpbmcga2V5ZnJhbWVzTmFtZTsKK307CisKKy8vIHdlJ2QgcmF0aGVyIGhhdmUgYSB0ZW1w
bGF0aXplZCBRQWJzdHJhY3RBbmltYXRpb24gdGhhbiBRUHJvcGVydHlBbmltYXRpb24gLyBRVmFy
aWFudEFuaW1hdGlvbjsKKy8vIFNpbmNlIHdlIGtub3cgdGhlIHR5cGVzIHRoYXQgd2UncmUgZGVh
bGluZyB3aXRoLCB0aGUgUU9iamVjdC9RUHJvcGVydHkvUVZhcmlhbnQgYWJzdHJhY3Rpb24KKy8v
IGJ1eXMgdXMgdmVyeSBsaXR0bGUgaW4gdGhpcyBjYXNlLCBmb3IgdG9vIG11Y2ggb3ZlcmhlYWQK
K3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgQW5pbWF0aW9uUXQgOiBwdWJsaWMgQW5pbWF0
aW9uUXRCYXNlIHsKKworcHVibGljOgorICAgIEFuaW1hdGlvblF0KEdyYXBoaWNzTGF5ZXJRdFBy
aXZhdGUqIGFMYXllcgorICAgICAgICAgICAgICAgICwgY29uc3QgS2V5ZnJhbWVWYWx1ZUxpc3Qm
IHZhbHVlcworICAgICAgICAgICAgICAgICwgY29uc3QgSW50U2l6ZSYgYUJveFNpemUKKyAgICAg
ICAgICAgICAgICAsIGNvbnN0IEFuaW1hdGlvbiogYW5pbQorICAgICAgICAgICAgICAgICwgY29u
c3QgUVN0cmluZyAmIG5hbWUpCisgICAgICAgICAgICA6QW5pbWF0aW9uUXRCYXNlKGFMYXllciwg
dmFsdWVzLCBhQm94U2l6ZSwgYW5pbSwgbmFtZSkKKyAgICB7CisgICAgICAgIC8vIGNvcHlpbmcg
dGhvc2UgV2ViQ29yZSBzdHJ1Y3R1cmVzIGlzIG5vdCB0cml2aWFsLCB3ZSBoYXZlIHRvIGRvIGl0
IGxpa2UgdGhpcworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHZhbHVlcy5zaXplKCk7
ICsraSkgeworICAgICAgICAgICAgY29uc3QgQW5pbWF0aW9uVmFsdWUqIGFuaW1WYWwgPSB2YWx1
ZXMuYXQoaSk7CisgICAgICAgICAgICBLZXlmcmFtZVZhbHVlUXQ8VD4ga2Z2OworICAgICAgICAg
ICAgaWYgKGFuaW1WYWwtPnRpbWluZ0Z1bmN0aW9uKCkpCisgICAgICAgICAgICAgICAga2Z2LnRp
bWluZ0Z1bmN0aW9uID0gKmFuaW1WYWwtPnRpbWluZ0Z1bmN0aW9uKCk7CisgICAgICAgICAgICB3
ZWJraXRBbmltYXRpb25Ub1F0QW5pbWF0aW9uVmFsdWUoYW5pbVZhbCwga2Z2LnZhbHVlKTsKKyAg
ICAgICAgICAgIGtleWZyYW1lVmFsdWVzW2FuaW1WYWwtPmtleVRpbWUoKV0gPSBrZnY7CisgICAg
ICAgIH0KKyAgICB9CisKK3Byb3RlY3RlZDoKKworICAgIC8vIHRoaXMgaXMgdGhlIHBhcnQgdGhh
dCBkaWZmZXJzIGJldHdlZW4gYW5pbWF0ZWQgcHJvcGVydGllcworICAgIHZpcnR1YWwgdm9pZCBh
cHBseUZyYW1lKGNvbnN0IFQmIGZyb21WYWx1ZSwgY29uc3QgVCYgdG9WYWx1ZSwgcXJlYWwgcHJv
Z3Jlc3MpID0gMDsKKworICAgIHZpcnR1YWwgdm9pZCB1cGRhdGVDdXJyZW50VGltZShpbnQgY3Vy
cmVudFRpbWUpCisgICAgeworICAgICAgICBpZiAoIXRhcmdldCkKKyAgICAgICAgICAgIHJldHVy
bjsKKworICAgICAgICBxcmVhbCBwcm9ncmVzcyA9IHFyZWFsKGN1cnJlbnRMb29wVGltZSgpKSAv
IGR1cmF0aW9uKCk7CisKKyAgICAgICAgaWYgKGlzQWx0ZXJuYXRlICYmIGN1cnJlbnRMb29wKCkl
MikKKyAgICAgICAgICAgIHByb2dyZXNzID0gMS1wcm9ncmVzczsKKworICAgICAgICBpZiAoa2V5
ZnJhbWVWYWx1ZXMuaXNFbXB0eSgpKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIC8v
IHdlIGZpbmQgdGhlIGN1cnJlbnQgZnJvbS10byBrZXlmcmFtZXMgaW4gb3VyIGxpdHRsZSBtYXAK
KyAgICAgICAgdHlwZW5hbWUgUU1hcDxxcmVhbCwgS2V5ZnJhbWVWYWx1ZVF0PFQ+ID46Oml0ZXJh
dG9yIGl0ID0ga2V5ZnJhbWVWYWx1ZXMuZmluZChwcm9ncmVzcyk7CisgICAgICAgIGlmIChpdCA9
PSBrZXlmcmFtZVZhbHVlcy5lbmQoKSkKKyAgICAgICAgICAgIGl0ID0ga2V5ZnJhbWVWYWx1ZXMu
bG93ZXJCb3VuZChwcm9ncmVzcyktMTsKKyAgICAgICAgaWYgKGl0ID09IGtleWZyYW1lVmFsdWVz
LmVuZCgpKQorICAgICAgICAgICAgaXQgPSBrZXlmcmFtZVZhbHVlcy5iZWdpbigpOworCisgICAg
ICAgIHR5cGVuYW1lIFFNYXA8cXJlYWwsIEtleWZyYW1lVmFsdWVRdDxUPiA+OjppdGVyYXRvciBp
dDIgPSBpdCsxOworICAgICAgICBpZiAoaXQyID09IGtleWZyYW1lVmFsdWVzLmVuZCgpKQorICAg
ICAgICAgICAgaXQyID0ga2V5ZnJhbWVWYWx1ZXMuYmVnaW4oKTsKKyAgICAgICAgY29uc3QgS2V5
ZnJhbWVWYWx1ZVF0PFQ+JiBmcm9tS2V5ZnJhbWUgPSBpdC52YWx1ZSgpOworICAgICAgICBjb25z
dCBLZXlmcmFtZVZhbHVlUXQ8VD4mIHRvS2V5ZnJhbWUgPSBpdDIudmFsdWUoKTsKKworICAgICAg
ICBjb25zdCBUaW1pbmdGdW5jdGlvbiYgdGltaW5nRnVuYyA9IGZyb21LZXlmcmFtZS50aW1pbmdG
dW5jdGlvbjsKKyAgICAgICAgY29uc3QgVCYgZnJvbVZhbHVlID0gZnJvbUtleWZyYW1lLnZhbHVl
OworICAgICAgICBjb25zdCBUJiB0b1ZhbHVlID0gdG9LZXlmcmFtZS52YWx1ZTsKKworICAgICAg
ICAvLyBub3cgd2UgaGF2ZSBhIHNvdXJjZSBrZXlmcmFtZSwgb3JpZ2luIGtleWZyYW1lIGFuZCBh
IHRpbWluZyBmdW5jdGlvbgorICAgICAgICAvLyB3ZSBjYW4gbm93IHByb2Nlc3MgdGhlIHByb2dy
ZXNzIGFuZCBhcHBseSB0aGUgZnJhbWUKKyAgICAgICAgcXJlYWwgbm9ybWFsaXplZFByb2dyZXNz
ID0gKGl0LmtleSgpID09IGl0Mi5rZXkoKSkgPyAwIDogKHByb2dyZXNzIC0gaXQua2V5KCkpIC8g
KGl0Mi5rZXkoKSAtIGl0LmtleSgpKTsKKyAgICAgICAgbm9ybWFsaXplZFByb2dyZXNzID0gYXBw
bHlUaW1pbmdGdW5jdGlvbih0aW1pbmdGdW5jLCBub3JtYWxpemVkUHJvZ3Jlc3MsIGR1cmF0aW9u
KCkgLyAxMDAwKTsKKyAgICAgICAgYXBwbHlGcmFtZShmcm9tVmFsdWUsIHRvVmFsdWUsIG5vcm1h
bGl6ZWRQcm9ncmVzcyk7CisgICAgfQorCisgICAgUU1hcDxxcmVhbCwgS2V5ZnJhbWVWYWx1ZVF0
PFQ+ID4ga2V5ZnJhbWVWYWx1ZXM7Cit9OworCitjbGFzcyBUcmFuc2Zvcm1BbmltYXRpb25RdCA6
IHB1YmxpYyBBbmltYXRpb25RdDxUcmFuc2Zvcm1PcGVyYXRpb25zPiB7CitwdWJsaWM6CisgICAg
VHJhbnNmb3JtQW5pbWF0aW9uUXQoR3JhcGhpY3NMYXllclF0UHJpdmF0ZSogYUxheWVyLAorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEtleWZyYW1lVmFsdWVMaXN0
JiB2YWx1ZXMsIGNvbnN0IEludFNpemUmIGJveFNpemUsIGNvbnN0IEFuaW1hdGlvbiogYW5pbSwg
Y29uc3QgUVN0cmluZyAmIG5hbWUpCisgICAgICAgICAgICAgICAgOkFuaW1hdGlvblF0PFRyYW5z
Zm9ybU9wZXJhdGlvbnM+KGFMYXllciwgdmFsdWVzLCBib3hTaXplLCBhbmltLCBuYW1lKQorICAg
IHsKKyAgICB9CisKKyAgICB+VHJhbnNmb3JtQW5pbWF0aW9uUXQoKQorICAgIHsKKyAgICAgICAg
Ly8gdGhpcyBjYW1lIHVwIGR1cmluZyB0aGUgY29tcG9zaXRpbmcvYW5pbWF0aW9uIExheW91dFRl
c3RzCisgICAgICAgIC8vIHdoZW4gdGhlIGFuaW1hdGlvbiBkaWVzLCB0aGUgdHJhbnNmb3JtIGhh
cyB0byBnbyBiYWNrIHRvIGRlZmF1bHQKKyAgICAgICAgdGFyZ2V0LmRhdGEoKS0+c2V0QmFzZVRy
YW5zZm9ybShRVHJhbnNmb3JtKHRhcmdldC5kYXRhKCktPmxheWVyLT50cmFuc2Zvcm0oKSkpOwor
ICAgIH0KKworICAgIC8vIHRoZSBpZGVhIGlzIHRoYXQgd2UgbGV0IFdlYkNvcmUgbWFuYWdlIHRo
ZSB0cmFuc2Zvcm0tb3BlcmF0aW9ucworICAgIC8vIGFuZCBRdCBqdXN0IG1hbmFnZXMgdGhlIGFu
aW1hdGlvbiBoZWFydGJlYXQgYW5kIHRoZSBib3R0b20tbGluZSBRVHJhbnNmb3JtCisgICAgLy8g
d2UgZ2V0IHRoZSBwZXJmb3JtYW5jZSBub3QgYnkgdXNpbmcgUVRyYW5zZm9ybSBpbnN0ZWFkIG9m
IFRyYW5zZm9ybWF0aW9uTWF0cml4LCBidXQgYnkgcHJvcGVyIGNhY2hpbmcgb2YKKyAgICAvLyBp
dGVtcyB0aGF0IGFyZSBleHBlbnNpdmUgZm9yIFdlYkNvcmUgdG8gcmVuZGVyLiBXZSB3YW50IHRo
ZSByZXN0IHRvIGJlIGFzIGNsb3NlIHRvIFdlYkNvcmUncyBpZGVhIGFzIHBvc3NpYmxlLgorICAg
IHZpcnR1YWwgdm9pZCBhcHBseUZyYW1lKGNvbnN0IFRyYW5zZm9ybU9wZXJhdGlvbnMmIGZyb21P
cHMsIGNvbnN0IFRyYW5zZm9ybU9wZXJhdGlvbnMmIHRvT3BzLCBxcmVhbCBwcm9ncmVzcykKKyAg
ICB7CisgICAgICAgIFRyYW5zZm9ybWF0aW9uTWF0cml4IHRmOworCisgICAgICAgIC8vIHRoaXMg
bG9va3Mgc2ltcGxlIGJ1dCBpcyByZWFsbHkgdHJpY2t5IHRvIGdldCByaWdodC4gVXNlIGNhdXRp
b24uCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdG9PcHMuc2l6ZSgpOyArK2kpCisg
ICAgICAgICAgICB0b09wcy5vcGVyYXRpb25zKClbaV0tPmJsZW5kKGZyb21PcHMuYXQoaSksIHBy
b2dyZXNzKS0+YXBwbHkodGYsIGJveFNpemUpOworCisgICAgICAgIHRhcmdldC5kYXRhKCktPnNl
dEJhc2VUcmFuc2Zvcm0oUVRyYW5zZm9ybSh0ZikpOworICAgIH0KKworICAgIHZpcnR1YWwgdm9p
ZCB1cGRhdGVTdGF0ZShRQWJzdHJhY3RBbmltYXRpb246OlN0YXRlIG5ld1N0YXRlLCBRQWJzdHJh
Y3RBbmltYXRpb246OlN0YXRlIG9sZFN0YXRlKQorICAgIHsKKyAgICAgICAgQW5pbWF0aW9uUXRC
YXNlOjp1cGRhdGVTdGF0ZShuZXdTdGF0ZSwgb2xkU3RhdGUpOworICAgICAgICBpZiAoIXRhcmdl
dCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgdGFyZ2V0LmRhdGEoKS0+Zmx1c2hDaGFu
Z2VzKHRydWUpOworCisgICAgICAgIC8vIHRvIGluY3JlYXNlIEZQUywgd2UgdXNlIGEgbGVzcyBh
Y2N1cmF0ZSBjYWNoaW5nIG1lY2hhbmlzbSB3aGlsZSBhbmltYXRpb24gaXMgZ29pbmcgb24KKyAg
ICAgICAgLy8gdGhpcyBpcyBhIFVYIGNob2ljZSB0aGF0IHNob3VsZCBwcm9iYWJseSBiZSBjdXN0
b21pemFibGUKKyAgICAgICAgaWYgKG5ld1N0YXRlID09IFFBYnN0cmFjdEFuaW1hdGlvbjo6UnVu
bmluZykgeworICAgICAgICAgICAgdGFyZ2V0LmRhdGEoKS0+dHJhbnNmb3JtQW5pbWF0aW9uUnVu
bmluZyA9IHRydWU7CisgICAgICAgICAgICBpZiAodGFyZ2V0LmRhdGEoKS0+Y2FjaGVNb2RlKCkg
PT0gUUdyYXBoaWNzSXRlbTo6RGV2aWNlQ29vcmRpbmF0ZUNhY2hlKQorICAgICAgICAgICAgICAg
IHRhcmdldC5kYXRhKCktPnNldENhY2hlTW9kZShRR3JhcGhpY3NJdGVtOjpJdGVtQ29vcmRpbmF0
ZUNhY2hlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRhcmdldC5kYXRhKCktPnRy
YW5zZm9ybUFuaW1hdGlvblJ1bm5pbmcgPSBmYWxzZTsKKyAgICAgICAgICAgIGlmICh0YXJnZXQu
ZGF0YSgpLT5jYWNoZU1vZGUoKSA9PSBRR3JhcGhpY3NJdGVtOjpJdGVtQ29vcmRpbmF0ZUNhY2hl
KQorICAgICAgICAgICAgICAgIHRhcmdldC5kYXRhKCktPnNldENhY2hlTW9kZShRR3JhcGhpY3NJ
dGVtOjpEZXZpY2VDb29yZGluYXRlQ2FjaGUpOworICAgICAgICB9CisgICAgfQorfTsKKworY2xh
c3MgT3BhY2l0eUFuaW1hdGlvblF0IDogcHVibGljIEFuaW1hdGlvblF0PHFyZWFsPiB7CitwdWJs
aWM6CisgICAgT3BhY2l0eUFuaW1hdGlvblF0KEdyYXBoaWNzTGF5ZXJRdFByaXZhdGUqIGFMYXll
ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBLZXlmcmFtZVZh
bHVlTGlzdCYgdmFsdWVzLCBjb25zdCBJbnRTaXplJiBib3hTaXplLCBjb25zdCBBbmltYXRpb24q
IGFuaW0sIGNvbnN0IFFTdHJpbmcgJiBuYW1lKQorICAgICAgICAgICAgICAgIDpBbmltYXRpb25R
dDxxcmVhbD4oYUxheWVyLCB2YWx1ZXMsIGJveFNpemUsIGFuaW0sIG5hbWUpCisgICAgeworICAg
IH0KKworICAgIHZpcnR1YWwgdm9pZCBhcHBseUZyYW1lKGNvbnN0IHFyZWFsJiBmcm9tVmFsdWUs
IGNvbnN0IHFyZWFsJiB0b1ZhbHVlLCBxcmVhbCBwcm9ncmVzcykKKyAgICB7CisgICAgICAgIHRh
cmdldC5kYXRhKCktPnNldE9wYWNpdHkocU1pbjxxcmVhbD4ocU1heDxxcmVhbD4oZnJvbVZhbHVl
ICsgKHRvVmFsdWUtZnJvbVZhbHVlKSpwcm9ncmVzcywgMCksIDEpKTsKKyAgICB9CisKKyAgICB2
aXJ0dWFsIHZvaWQgdXBkYXRlU3RhdGUoUUFic3RyYWN0QW5pbWF0aW9uOjpTdGF0ZSBuZXdTdGF0
ZSwgUUFic3RyYWN0QW5pbWF0aW9uOjpTdGF0ZSBvbGRTdGF0ZSkKKyAgICB7CisgICAgICAgIFFB
YnN0cmFjdEFuaW1hdGlvbjo6dXBkYXRlU3RhdGUobmV3U3RhdGUsIG9sZFN0YXRlKTsKKworICAg
ICAgICBpZiAoIXRhcmdldCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBpZiAobmV3
U3RhdGUgPT0gUUFic3RyYWN0QW5pbWF0aW9uOjpSdW5uaW5nKQorICAgICAgICAgICAgdGFyZ2V0
LmRhdGEoKS0+b3BhY2l0eUFuaW1hdGlvblJ1bm5pbmcgPSB0cnVlOworICAgICAgICBlbHNlCisg
ICAgICAgICAgICB0YXJnZXQuZGF0YSgpLT5vcGFjaXR5QW5pbWF0aW9uUnVubmluZyA9IGZhbHNl
OworICAgIH0KK307CisKK2Jvb2wgR3JhcGhpY3NMYXllclF0OjphZGRBbmltYXRpb24oY29uc3Qg
S2V5ZnJhbWVWYWx1ZUxpc3QmIHZhbHVlcywgY29uc3QgSW50U2l6ZSYgYm94U2l6ZSwgY29uc3Qg
QW5pbWF0aW9uKiBhbmltLCBjb25zdCBTdHJpbmcmIGtleWZyYW1lc05hbWUsIGRvdWJsZSB0aW1l
T2Zmc2V0KQoreworICAgIGlmICghYW5pbS0+ZHVyYXRpb24oKSB8fCAhYW5pbS0+aXRlcmF0aW9u
Q291bnQoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgUUFic3RyYWN0QW5pbWF0aW9u
KiBuZXdBbmltOworCisgICAgc3dpdGNoICh2YWx1ZXMucHJvcGVydHkoKSkgeworICAgIGNhc2Ug
QW5pbWF0ZWRQcm9wZXJ0eU9wYWNpdHk6CisgICAgICAgIG5ld0FuaW0gPSBuZXcgT3BhY2l0eUFu
aW1hdGlvblF0KHF0TGF5ZXIsIHZhbHVlcywgYm94U2l6ZSwgYW5pbSwga2V5ZnJhbWVzTmFtZSk7
CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQW5pbWF0ZWRQcm9wZXJ0eVdlYmtpdFRyYW5zZm9y
bToKKyAgICAgICAgbmV3QW5pbSA9IG5ldyBUcmFuc2Zvcm1BbmltYXRpb25RdChxdExheWVyLCB2
YWx1ZXMsIGJveFNpemUsIGFuaW0sIGtleWZyYW1lc05hbWUpOworICAgICAgICBicmVhazsKKyAg
ICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gd2UgbWFr
ZSBzdXJlIFdlYkNvcmU6OkFuaW1hdGlvbiBhbmQgUUFuaW1hdGlvbiBhcmUgb24gdGhlIHNhbWUg
dGVybXMKKyAgICBuZXdBbmltLT5zZXRMb29wQ291bnQoYW5pbS0+aXRlcmF0aW9uQ291bnQoKSk7
CisgICAgcXRMYXllci0+YW5pbWF0aW9ucy5hcHBlbmQoUVdlYWtQb2ludGVyPFFBYnN0cmFjdEFu
aW1hdGlvbj4obmV3QW5pbSkpOworICAgIFFPYmplY3Q6OmNvbm5lY3QoJnF0TGF5ZXItPnN1c3Bl
bmRUaW1lciwgU0lHTkFMKHRpbWVvdXQoKSksIG5ld0FuaW0sIFNMT1QocmVzdW1lKCkpKTsKKyAg
ICB0aW1lT2Zmc2V0ICs9IGFuaW0tPmRlbGF5KCk7CisKKyAgICAvLyBmbHVzaCBub3cgb3IgZmxp
Y2tlci4uLgorICAgIHF0TGF5ZXItPmZsdXNoQ2hhbmdlcyhmYWxzZSk7CisKKyAgICBpZiAodGlt
ZU9mZnNldCkKKyAgICAgICAgUVRpbWVyOjpzaW5nbGVTaG90KHRpbWVPZmZzZXQqMTAwMCwgbmV3
QW5pbSwgU0xPVChzdGFydCgpKSk7CisgICAgZWxzZQorICAgICAgICBuZXdBbmltLT5zdGFydCgp
OworCisgICAgUU9iamVjdDo6Y29ubmVjdChuZXdBbmltLCBTSUdOQUwoZmluaXNoZWQoKSksIG5l
d0FuaW0sIFNMT1QoZGVsZXRlTGF0ZXIoKSkpOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3Zv
aWQgR3JhcGhpY3NMYXllclF0OjpyZW1vdmVBbmltYXRpb25zRm9yUHJvcGVydHkoQW5pbWF0ZWRQ
cm9wZXJ0eUlEIGlkKQoreworICAgIGZvciAoUUxpc3Q8UVdlYWtQb2ludGVyPFFBYnN0cmFjdEFu
aW1hdGlvbj4gPjo6aXRlcmF0b3IgaXQgPSBxdExheWVyLT5hbmltYXRpb25zLmJlZ2luKCk7Cisg
ICAgICAgICAgICBpdCAhPSBxdExheWVyLT5hbmltYXRpb25zLmVuZCgpOyArK2l0KSB7CisKKyAg
ICAgICAgaWYgKCppdCkgeworICAgICAgICAgICAgQW5pbWF0aW9uUXRCYXNlKiBhbmltID0gc3Rh
dGljX2Nhc3Q8QW5pbWF0aW9uUXRCYXNlKj4oaXQtPmRhdGEoKSk7CisgICAgICAgICAgICBpZiAo
YW5pbSAmJiBhbmltLT53ZWJraXRQcm9wZXJ0eUlEID09IGlkKSB7CisgICAgICAgICAgICAgICAg
ZGVsZXRlIGFuaW07CisgICAgICAgICAgICAgICAgaXQgPSBxdExheWVyLT5hbmltYXRpb25zLmVy
YXNlKGl0KTsKKyAgICAgICAgICAgICAgICAtLWl0OworICAgICAgICAgICAgfQorICAgICAgICB9
CisgICAgfQorfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJRdDo6cmVtb3ZlQW5pbWF0aW9uc0Zvcktl
eWZyYW1lcyhjb25zdCBTdHJpbmcmIGtmTmFtZSkKK3sKKyAgICBmb3IgKFFMaXN0PFFXZWFrUG9p
bnRlcjxRQWJzdHJhY3RBbmltYXRpb24+ID46Oml0ZXJhdG9yIGl0ID0gcXRMYXllci0+YW5pbWF0
aW9ucy5iZWdpbigpOyBpdCAhPSBxdExheWVyLT5hbmltYXRpb25zLmVuZCgpOyArK2l0KSB7Cisg
ICAgICAgIGlmICgqaXQpIHsKKyAgICAgICAgICAgIEFuaW1hdGlvblF0QmFzZSogYW5pbSA9IHN0
YXRpY19jYXN0PEFuaW1hdGlvblF0QmFzZSo+KCgqaXQpLmRhdGEoKSk7CisgICAgICAgICAgICBp
ZiAoYW5pbSAmJiBhbmltLT5rZXlmcmFtZXNOYW1lID09IFFTdHJpbmcoa2ZOYW1lKSkgeworICAg
ICAgICAgICAgICAgICgqaXQpLmRhdGEoKS0+ZGVsZXRlTGF0ZXIoKTsKKyAgICAgICAgICAgICAg
ICBpdCA9IHF0TGF5ZXItPmFuaW1hdGlvbnMuZXJhc2UoaXQpOworICAgICAgICAgICAgICAgIC0t
aXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgR3JhcGhpY3NM
YXllclF0OjpwYXVzZUFuaW1hdGlvbihjb25zdCBTdHJpbmcmIGtmTmFtZSwgZG91YmxlIHRpbWVP
ZnMpCit7CisgICAgZm9yIChRTGlzdDxRV2Vha1BvaW50ZXI8UUFic3RyYWN0QW5pbWF0aW9uPiA+
OjppdGVyYXRvciBpdCA9IHF0TGF5ZXItPmFuaW1hdGlvbnMuYmVnaW4oKTsgaXQgIT0gcXRMYXll
ci0+YW5pbWF0aW9ucy5lbmQoKTsgKytpdCkgeworICAgICAgICBpZiAoKml0KSB7CisgICAgICAg
ICAgICBBbmltYXRpb25RdEJhc2UqIGFuaW0gPSBzdGF0aWNfY2FzdDxBbmltYXRpb25RdEJhc2Uq
PigoKml0KS5kYXRhKCkpOworICAgICAgICAgICAgaWYgKGFuaW0gJiYgYW5pbS0+a2V5ZnJhbWVz
TmFtZSA9PSBRU3RyaW5nKGtmTmFtZSkpCisgICAgICAgICAgICAgICAgUVRpbWVyOjpzaW5nbGVT
aG90KHRpbWVPZnMqMTAwMCwgYW5pbSwgU0xPVChwYXVzZSgpKSk7CisgICAgICAgIH0KKyAgICB9
Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllclF0OjpzdXNwZW5kQW5pbWF0aW9ucyhkb3VibGUgdGlt
ZSkKK3sKKyAgICBpZiAocXRMYXllci0+c3VzcGVuZFRpbWVyLmlzQWN0aXZlKCkpIHsKKyAgICAg
ICAgcXRMYXllci0+c3VzcGVuZFRpbWVyLnN0b3AoKTsKKyAgICAgICAgcXRMYXllci0+c3VzcGVu
ZFRpbWVyLnN0YXJ0KHRpbWUqMTAwMCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yIChRTGlz
dDxRV2Vha1BvaW50ZXI8UUFic3RyYWN0QW5pbWF0aW9uPiA+OjppdGVyYXRvciBpdCA9IHF0TGF5
ZXItPmFuaW1hdGlvbnMuYmVnaW4oKTsgaXQgIT0gcXRMYXllci0+YW5pbWF0aW9ucy5lbmQoKTsg
KytpdCkgeworICAgICAgICAgICAgUUFic3RyYWN0QW5pbWF0aW9uKiBhbmltID0gaXQtPmRhdGEo
KTsKKyAgICAgICAgICAgIGlmIChhbmltKQorICAgICAgICAgICAgICAgIGFuaW0tPnBhdXNlKCk7
CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllclF0OjpyZXN1bWVBbmlt
YXRpb25zKCkKK3sKKyAgICBpZiAocXRMYXllci0+c3VzcGVuZFRpbWVyLmlzQWN0aXZlKCkpIHsK
KyAgICAgICAgcXRMYXllci0+c3VzcGVuZFRpbWVyLnN0b3AoKTsKKyAgICAgICAgZm9yIChRTGlz
dDxRV2Vha1BvaW50ZXI8UUFic3RyYWN0QW5pbWF0aW9uPiA+OjppdGVyYXRvciBpdCA9IHF0TGF5
ZXItPmFuaW1hdGlvbnMuYmVnaW4oKTsgaXQgIT0gcXRMYXllci0+YW5pbWF0aW9ucy5lbmQoKTsg
KytpdCkgeworICAgICAgICAgICAgUUFic3RyYWN0QW5pbWF0aW9uKiBhbmltID0gKCppdCkuZGF0
YSgpOworICAgICAgICAgICAgaWYgKGFuaW0pCisgICAgICAgICAgICAgICAgYW5pbS0+cmVzdW1l
KCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKworfQorCisjaW5jbHVkZSA8R3JhcGhpY3NMYXll
clF0Lm1vYz4KSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvcXQvR3JhcGhpY3NMYXll
clF0LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9xdC9HcmFwaGlj
c0xheWVyUXQuaAkocmV2aXNpb24gMCkKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvcXQv
R3JhcGhpY3NMYXllclF0LmgJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsODMgQEAKKy8qCisgICAg
Q29weXJpZ2h0IChDKSAyMDA5IE5va2lhIENvcnBvcmF0aW9uIGFuZC9vciBpdHMgc3Vic2lkaWFy
eSgtaWVzKQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVk
aXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhl
IEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkg
dGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyIG9mIHRo
ZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAg
VGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1
c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGlt
cGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQ
QVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExpYnJhcnkgR2VuZXJhbCBQdWJs
aWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2Vp
dmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAg
IGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBu
b3QsIHdyaXRlIHRvCisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEg
RnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAgICBCb3N0b24sIE1BIDAyMTEwLTEzMDEs
IFVTQS4KKyovCisKKyNpZm5kZWYgR3JhcGhpY3NMYXllclF0X2gKKyNkZWZpbmUgR3JhcGhpY3NM
YXllclF0X2gKKworI2luY2x1ZGUgIkdyYXBoaWNzTGF5ZXIuaCIKKyNpbmNsdWRlICJHcmFwaGlj
c0xheWVyQ2xpZW50LmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKK2NsYXNzIEdyYXBoaWNzTGF5
ZXJRdFByaXZhdGU7CitjbGFzcyBHcmFwaGljc0xheWVyUXQgOiBwdWJsaWMgR3JhcGhpY3NMYXll
ciB7CisgICAgZnJpZW5kIGNsYXNzIEdyYXBoaWNzTGF5ZXJRdFByaXZhdGU7CitwdWJsaWM6Cisg
ICAgR3JhcGhpY3NMYXllclF0KEdyYXBoaWNzTGF5ZXJDbGllbnQqKTsKKyAgICB2aXJ0dWFsIHZv
aWQgc2V0TmVlZHNEaXNwbGF5KCk7CisgICAgLy8gbWFyayB0aGUgZ2l2ZW4gcmVjdCAoaW4gbGF5
ZXIgY29vcmRzKSBhcyBuZWVkaW5nIGRpc3BheS4gTmV2ZXIgZ29lcyBkZWVwLgorICAgIHZpcnR1
YWwgdm9pZCBzZXROZWVkc0Rpc3BsYXlJblJlY3QoY29uc3QgRmxvYXRSZWN0Jik7CisgICAgdmly
dHVhbCBOYXRpdmVMYXllciBuYXRpdmVMYXllcigpIGNvbnN0OworICAgIHZpcnR1YWwgUGxhdGZv
cm1MYXllciogcGxhdGZvcm1MYXllcigpIGNvbnN0OworCisgICAgdmlydHVhbCB+R3JhcGhpY3NM
YXllclF0KCk7CisgICAgdm9pZCBzZXRQYXJlbnQoR3JhcGhpY3NMYXllciogbGF5ZXIpOworICAg
IHZpcnR1YWwgdm9pZCBzZXROYW1lKGNvbnN0IFN0cmluZyYgbmFtZSk7CisgICAgdmlydHVhbCBi
b29sIHNldENoaWxkcmVuKGNvbnN0IFZlY3RvcjxHcmFwaGljc0xheWVyKj4mKTsKKyAgICB2aXJ0
dWFsIHZvaWQgYWRkQ2hpbGQoR3JhcGhpY3NMYXllciopOworICAgIHZpcnR1YWwgdm9pZCBhZGRD
aGlsZEF0SW5kZXgoR3JhcGhpY3NMYXllciosIGludCBpbmRleCk7CisgICAgdmlydHVhbCB2b2lk
IGFkZENoaWxkQWJvdmUoR3JhcGhpY3NMYXllciogbGF5ZXIsIEdyYXBoaWNzTGF5ZXIqIHNpYmxp
bmcpOworICAgIHZpcnR1YWwgdm9pZCBhZGRDaGlsZEJlbG93KEdyYXBoaWNzTGF5ZXIqIGxheWVy
LCBHcmFwaGljc0xheWVyKiBzaWJsaW5nKTsKKyAgICB2aXJ0dWFsIGJvb2wgcmVwbGFjZUNoaWxk
KEdyYXBoaWNzTGF5ZXIqIG9sZENoaWxkLCBHcmFwaGljc0xheWVyKiBuZXdDaGlsZCk7CisgICAg
dmlydHVhbCB2b2lkIHJlbW92ZUZyb21QYXJlbnQoKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0TWFz
a0xheWVyKEdyYXBoaWNzTGF5ZXIqIGxheWVyKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0UG9zaXRp
b24oY29uc3QgRmxvYXRQb2ludCYgcCk7CisgICAgdmlydHVhbCB2b2lkIHNldEFuY2hvclBvaW50
KGNvbnN0IEZsb2F0UG9pbnQzRCYgcCk7CisgICAgdmlydHVhbCB2b2lkIHNldFNpemUoY29uc3Qg
RmxvYXRTaXplJiBzaXplKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0VHJhbnNmb3JtKGNvbnN0IFRy
YW5zZm9ybWF0aW9uTWF0cml4JiB0KTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0Q2hpbGRyZW5UcmFu
c2Zvcm0oY29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgmIHQpOworICAgIHZpcnR1YWwgdm9pZCBz
ZXRQcmVzZXJ2ZXMzRChib29sIGIpOworICAgIHZpcnR1YWwgdm9pZCBzZXRNYXNrc1RvQm91bmRz
KGJvb2wgYik7CisgICAgdmlydHVhbCB2b2lkIHNldERyYXdzQ29udGVudChib29sIGIpOworICAg
IHZpcnR1YWwgdm9pZCBzZXRCYWNrZ3JvdW5kQ29sb3IoY29uc3QgQ29sb3ImKTsKKyAgICB2aXJ0
dWFsIHZvaWQgY2xlYXJCYWNrZ3JvdW5kQ29sb3IoKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0Q29u
dGVudHNPcGFxdWUoYm9vbCBiKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0QmFja2ZhY2VWaXNpYmls
aXR5KGJvb2wgYik7CisgICAgdmlydHVhbCB2b2lkIHNldE9wYWNpdHkoZmxvYXQgb3BhY2l0eSk7
CisgICAgdmlydHVhbCB2b2lkIHNldENvbnRlbnRzUmVjdChjb25zdCBJbnRSZWN0JiByKTsKKyAg
ICB2aXJ0dWFsIGJvb2wgYWRkQW5pbWF0aW9uKGNvbnN0IEtleWZyYW1lVmFsdWVMaXN0JiwgY29u
c3QgSW50U2l6ZSYgLypib3hTaXplKi8sIGNvbnN0IEFuaW1hdGlvbiosIGNvbnN0IFN0cmluZyYg
LyprZXlmcmFtZXNOYW1lKi8sIGRvdWJsZSAvKnRpbWVPZmZzZXQqLyk7CisgICAgdmlydHVhbCB2
b2lkIHJlbW92ZUFuaW1hdGlvbnNGb3JQcm9wZXJ0eShBbmltYXRlZFByb3BlcnR5SUQpOworICAg
IHZpcnR1YWwgdm9pZCByZW1vdmVBbmltYXRpb25zRm9yS2V5ZnJhbWVzKGNvbnN0IFN0cmluZyYg
Lyoga2V5ZnJhbWVzTmFtZSAqLyk7CisgICAgdmlydHVhbCB2b2lkIHBhdXNlQW5pbWF0aW9uKGNv
bnN0IFN0cmluZyYgLyoga2V5ZnJhbWVzTmFtZSAqLywgZG91YmxlIC8qdGltZU9mZnNldCovKTsK
KyAgICB2aXJ0dWFsIHZvaWQgc3VzcGVuZEFuaW1hdGlvbnMoZG91YmxlIHRpbWUpOworICAgIHZp
cnR1YWwgdm9pZCByZXN1bWVBbmltYXRpb25zKCk7CisgICAgdmlydHVhbCB2b2lkIHNldENvbnRl
bnRzVG9JbWFnZShJbWFnZSopOworICAgIHZpcnR1YWwgdm9pZCBzZXRDb250ZW50c0JhY2tncm91
bmRDb2xvcihjb25zdCBDb2xvciYpOworICAgIHZpcnR1YWwgdm9pZCBzZXRHZW9tZXRyeU9yaWVu
dGF0aW9uKENvbXBvc2l0aW5nQ29vcmRpbmF0ZXNPcmllbnRhdGlvbiBvcmllbnRhdGlvbik7Cisg
ICAgdmlydHVhbCB2b2lkIHNldENvbnRlbnRzT3JpZW50YXRpb24oQ29tcG9zaXRpbmdDb29yZGlu
YXRlc09yaWVudGF0aW9uIG9yaWVudGF0aW9uKTsKKyAgICB2aXJ0dWFsIHZvaWQgZGlzdHJpYnV0
ZU9wYWNpdHkoZmxvYXQpOworICAgIHZpcnR1YWwgZmxvYXQgYWNjdW11bGF0ZWRPcGFjaXR5KCkg
Y29uc3Q7CisgICAgdmlydHVhbCB2b2lkIHN5bmNDb21wb3NpdGluZ1N0YXRlKCk7Citwcml2YXRl
OgorICAgIEdyYXBoaWNzTGF5ZXJRdFByaXZhdGUqIHF0TGF5ZXI7CisKK307CisKKworfQorI2Vu
ZGlmIC8vIEdyYXBoaWNzTGF5ZXJRdF9oCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L0dyYXBoaWNzTGF5ZXIuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L0dyYXBoaWNzTGF5ZXIuaAkocmV2aXNpb24gNTMzNjQpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL0dyYXBoaWNzTGF5ZXIuaAkod29ya2luZyBjb3B5KQpAQCAtNTksNiArNTksMTAgQEAK
IHR5cGVkZWYgV0tDQUNGTGF5ZXIgUGxhdGZvcm1MYXllcjsKIHR5cGVkZWYgdm9pZCogTmF0aXZl
TGF5ZXI7CiB9CisjZWxpZiBQTEFURk9STShRVCkKK2NsYXNzIFFHcmFwaGljc0l0ZW07Cit0eXBl
ZGVmIFFHcmFwaGljc0l0ZW0gUGxhdGZvcm1MYXllcjsKK3R5cGVkZWYgUUdyYXBoaWNzSXRlbSog
TmF0aXZlTGF5ZXI7CiAjZWxzZQogdHlwZWRlZiB2b2lkKiBQbGF0Zm9ybUxheWVyOwogdHlwZWRl
ZiB2b2lkKiBOYXRpdmVMYXllcjsKCkluZGV4OiBXZWJLaXQucHJpCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdl
YktpdC5wcmkJKHJldmlzaW9uIDUzMzY0KQorKysgV2ViS2l0LnByaQkod29ya2luZyBjb3B5KQpA
QCAtNDUsNiArNDUsNyBAQAogICAgIH0KICAgICBERVBFTkRQQVRIICs9ICQkUFdEL1dlYktpdC9x
dC9BcGkKIH0KK0RFRklORVMgKz0gV1RGX1VTRV9BQ0NFTEVSQVRFRF9DT01QT1NJVElORwogCiAh
bWFjOiF1bml4fHN5bWJpYW4gewogICAgIERFRklORVMgKz0gVVNFX1NZU1RFTV9NQUxMT0MK
</data>
<flag name="review"
          id="29133"
          type_id="1"
          status="-"
          setter="kenneth"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>46859</attachid>
            <date>2010-01-18 15:49:29 -0800</date>
            <delta_ts>2010-01-18 22:03:14 -0800</delta_ts>
            <desc>compositing layers for Qt: Take 3</desc>
            <filename>patch-GraphicsLayerQt-3.diff</filename>
            <type>text/plain</type>
            <size>65832</size>
            <attacher name="Noam Rosenthal">noam</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYktpdC9xdC9RR1ZMYXVuY2hlci9tYWluLmNwcAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJL
aXQvcXQvUUdWTGF1bmNoZXIvbWFpbi5jcHAJKHJldmlzaW9uIDUzNDI3KQorKysgV2ViS2l0L3F0
L1FHVkxhdW5jaGVyL21haW4uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC03Miw2ICs3Miw4IEBACiAg
ICAgV2ViVmlldyhRR3JhcGhpY3NJdGVtKiBwYXJlbnQgPSAwKQogICAgICAgICA6IFFHcmFwaGlj
c1dlYlZpZXcocGFyZW50KQogICAgIHsKKyAgICAgICAgaWYgKFFBcHBsaWNhdGlvbjo6aW5zdGFu
Y2UoKS0+YXJndW1lbnRzKCkuY29udGFpbnMoIi0tY2FjaGVXZWJWaWV3IikpCisgICAgICAgICAg
ICBzZXRDYWNoZU1vZGUoUUdyYXBoaWNzSXRlbTo6RGV2aWNlQ29vcmRpbmF0ZUNhY2hlKTsKICAg
ICB9CiAgICAgdm9pZCBzZXRZUm90YXRpb24ocXJlYWwgYW5nbGUpCiAgICAgewpAQCAtMjUzLDYg
KzI1NSwxMiBAQAogICAgICAgICBzZXRBdHRyaWJ1dGUoUXQ6OldBX0RlbGV0ZU9uQ2xvc2UpOwog
CiAgICAgICAgIHZpZXctPnNldFNjZW5lKHNjZW5lLT5zY2VuZSgpKTsKKyAgICAgICAgY29uc3Qg
UVN0cmluZ0xpc3QgYXJndW1lbnRzID0gUUFwcGxpY2F0aW9uOjppbnN0YW5jZSgpLT5hcmd1bWVu
dHMoKTsKKyAgICAgICAgY29uc3QgaW50IGluZGV4T2ZWaWV3cG9ydFVwZGF0ZU1vZGUgPSBhcmd1
bWVudHMuaW5kZXhPZigiLS11cGRhdGVNb2RlIik7CisgICAgICAgIGlmIChpbmRleE9mVmlld3Bv
cnRVcGRhdGVNb2RlID4gMSAmJiBpbmRleE9mVmlld3BvcnRVcGRhdGVNb2RlIDwgYXJndW1lbnRz
LmNvdW50KCkgLSAxKSB7CisgICAgICAgICAgICBjb25zdCBRU3RyaW5nIHVwZGF0ZU1vZGUgPSBh
cmd1bWVudHNbaW5kZXhPZlZpZXdwb3J0VXBkYXRlTW9kZSsxXSArICJWaWV3cG9ydFVwZGF0ZSI7
CisgICAgICAgICAgICB2aWV3LT5zZXRWaWV3cG9ydFVwZGF0ZU1vZGUoc3RhdGljX2Nhc3Q8UUdy
YXBoaWNzVmlldzo6Vmlld3BvcnRVcGRhdGVNb2RlPihRR3JhcGhpY3NWaWV3OjpzdGF0aWNNZXRh
T2JqZWN0LmVudW1lcmF0b3IoUUdyYXBoaWNzVmlldzo6c3RhdGljTWV0YU9iamVjdC5pbmRleE9m
RW51bWVyYXRvcigiVmlld3BvcnRVcGRhdGVNb2RlIikpLmtleXNUb1ZhbHVlKHVwZGF0ZU1vZGUu
dG9Bc2NpaSgpKSkpOworICAgICAgICB9CiAKICAgICAgICAgc2V0Q2VudHJhbFdpZGdldCh2aWV3
KTsKIApAQCAtNDQ3LDYgKzQ1NSwxMCBAQAogaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2
KQogewogICAgIFFBcHBsaWNhdGlvbiBhcHAoYXJnYywgYXJndik7CisgICAgaWYgKGFwcC5hcmd1
bWVudHMoKS5jb250YWlucygiLS1oZWxwIikpIHsKKyAgICAgICAgcURlYnVnKCkgPDwgIlVzYWdl
OiBRR1ZMYXVuY2hlciBbLS11cmwgdXJsXSBbLS1jb21wb3NpdGluZ10gWy0tdXBkYXRlTW9kZSBG
dWxsfE1pbmltYWx8U21hcnR8Tm98Qm91bmRpbmdSZWN0XSBbLS1jYWNoZVdlYlZpZXddXG4iOwor
ICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAgICAgUVN0cmluZyB1cmwgPSBRU3RyaW5nKCJmaWxl
Oi8vJTEvJTIiKS5hcmcoUURpcjo6aG9tZVBhdGgoKSkuYXJnKFFMYXRpbjFTdHJpbmcoImluZGV4
Lmh0bWwiKSk7CiAKICAgICBhcHAuc2V0QXBwbGljYXRpb25OYW1lKCJHUVZMYXVuY2hlciIpOwpA
QCAtNDU4LDE0ICs0NzAsMjAgQEAKICAgICBRV2ViU2V0dGluZ3M6OmVuYWJsZVBlcnNpc3RlbnRT
dG9yYWdlKCk7CiAKICAgICBjb25zdCBRU3RyaW5nTGlzdCBhcmdzID0gYXBwLmFyZ3VtZW50cygp
OwotICAgIGlmIChhcmdzLmNvdW50KCkgPiAxKQorICAgIGNvbnN0IGludCBpbmRleE9mVXJsID0g
YXJncy5pbmRleE9mKCItLXVybCIpOworICAgIGlmIChpbmRleE9mVXJsID4gMCAmJiBpbmRleE9m
VXJsIDwgYXJncy5jb3VudCgpIC0gMSkKKyAgICAgICAgdXJsID0gYXJncy5hdChpbmRleE9mVXJs
KzEpOworICAgIGVsc2UgaWYgKGFyZ3MuY291bnQoKSA+IDEpCiAgICAgICAgIHVybCA9IGFyZ3Mu
YXQoMSk7CisgICAgaWYgKGFyZ3MuY29udGFpbnMoIi0tY29tcG9zaXRpbmciKSkKKyAgICAgICAg
UVdlYlNldHRpbmdzOjpnbG9iYWxTZXR0aW5ncygpLT5zZXRBdHRyaWJ1dGUoUVdlYlNldHRpbmdz
OjpBY2NlbGVyYXRlZENvbXBvc2l0aW5nRW5hYmxlZCwgdHJ1ZSk7CiAKICAgICBNYWluV2luZG93
KiB3aW5kb3cgPSBuZXcgTWFpbldpbmRvdzsKICAgICB3aW5kb3ctPmxvYWQodXJsKTsKIAotICAg
IGZvciAoaW50IGkgPSAyOyBpIDwgYXJncy5jb3VudCgpOyBpKyspCi0gICAgICAgIHdpbmRvdy0+
bmV3V2luZG93KGFyZ3MuYXQoaSkpOworICAgIGZvciAoaW50IGkgPSAyOyBpIDwgYXJncy5jb3Vu
dCgpOyArK2kpCisgICAgICAgIGlmICghYXJncy5hdChpKS5zdGFydHNXaXRoKCItIikgJiYgIWFy
Z3MuYXQoaSAtIDEpLnN0YXJ0c1dpdGgoIi0iKSkKKyAgICAgICAgICAgIHdpbmRvdy0+bmV3V2lu
ZG93KGFyZ3MuYXQoaSkpOwogCiAgICAgd2luZG93LT5zaG93KCk7CiAgICAgcmV0dXJuIGFwcC5l
eGVjKCk7CkluZGV4OiBXZWJLaXQvcXQvV2ViQ29yZVN1cHBvcnQvQ2hyb21lQ2xpZW50UXQuY3Bw
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFdlYktpdC9xdC9XZWJDb3JlU3VwcG9ydC9DaHJvbWVDbGllbnRRdC5j
cHAJKHJldmlzaW9uIDUzNDI3KQorKysgV2ViS2l0L3F0L1dlYkNvcmVTdXBwb3J0L0Nocm9tZUNs
aWVudFF0LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjUsNiArMjUsNyBAQAogICogKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFCiAgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLgogICovCisKICNpbmNsdWRlICJjb25maWcuaCIKICNpbmNsdWRl
ICJDaHJvbWVDbGllbnRRdC5oIgogCkBAIC00Miw2ICs0MywxMCBAQAogI2luY2x1ZGUgIlFXZWJQ
YWdlQ2xpZW50LmgiCiAjaW5jbHVkZSAiU2VjdXJpdHlPcmlnaW4uaCIKIAorI2luY2x1ZGUgPHFk
ZWJ1Zy5oPgorI2luY2x1ZGUgPHF0ZXh0ZG9jdW1lbnQuaD4KKyNpbmNsdWRlIDxxdG9vbHRpcC5o
PgorCiAjaW5jbHVkZSAicXdlYnBhZ2UuaCIKICNpbmNsdWRlICJxd2VicGFnZV9wLmgiCiAjaW5j
bHVkZSAicXdlYmZyYW1lX3AuaCIKQEAgLTQ5LDEzICs1NCwxMiBAQAogI2luY2x1ZGUgInF3ZWJz
ZWN1cml0eW9yaWdpbl9wLmgiCiAjaW5jbHVkZSAicXdlYnZpZXcuaCIKIAotI2luY2x1ZGUgPHF0
b29sdGlwLmg+Ci0jaW5jbHVkZSA8cXRleHRkb2N1bWVudC5oPgorI2lmIFVTRShBQ0NFTEVSQVRF
RF9DT01QT1NJVElORykKKyNpbmNsdWRlICJHcmFwaGljc0xheWVyUXQuaCIKKyNlbmRpZgogCi1u
YW1lc3BhY2UgV2ViQ29yZQoteworbmFtZXNwYWNlIFdlYkNvcmUgewogCi0KIENocm9tZUNsaWVu
dFF0OjpDaHJvbWVDbGllbnRRdChRV2ViUGFnZSogd2ViUGFnZSkKICAgICA6IG1fd2ViUGFnZSh3
ZWJQYWdlKQogewpAQCAtNDY2LDYgKzQ3MCwyOCBAQAogICAgIG5vdEltcGxlbWVudGVkKCk7CiB9
CiAKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCit2b2lkIENocm9tZUNsaWVudFF0
OjphdHRhY2hSb290R3JhcGhpY3NMYXllcihGcmFtZSogZnJhbWUsIEdyYXBoaWNzTGF5ZXIqIGdy
YXBoaWNzTGF5ZXIpCit7ICAgIAorICAgIGlmIChwbGF0Zm9ybVBhZ2VDbGllbnQoKSkKKyAgICAg
ICAgcGxhdGZvcm1QYWdlQ2xpZW50KCktPnNldFJvb3RHcmFwaGljc0xheWVyKGdyYXBoaWNzTGF5
ZXIgPyBncmFwaGljc0xheWVyLT5uYXRpdmVMYXllcigpIDogMCk7Cit9CisKK3ZvaWQgQ2hyb21l
Q2xpZW50UXQ6OnNldE5lZWRzT25lU2hvdERyYXdpbmdTeW5jaHJvbml6YXRpb24oKQoreworICAg
IC8vIHdlIHdhbnQgdGhlIGxheWVycyB0byBzeW5jaHJvbml6ZSBuZXh0IHRpbWUgd2UgdXBkYXRl
IHRoZSBzY3JlZW4gYW55d2F5CisgICAgaWYgKHBsYXRmb3JtUGFnZUNsaWVudCgpKQorICAgICAg
ICBwbGF0Zm9ybVBhZ2VDbGllbnQoKS0+bWFya0ZvclN5bmMoZmFsc2UpOworfQorCit2b2lkIENo
cm9tZUNsaWVudFF0OjpzY2hlZHVsZUNvbXBvc2l0aW5nTGF5ZXJTeW5jKCkKK3sKKyAgICAvLyB3
ZSB3YW50IHRoZSBsYXllcnMgdG8gc3luY2hyb25pemUgQVNBUAorICAgIGlmIChwbGF0Zm9ybVBh
Z2VDbGllbnQoKSkKKyAgICAgICAgcGxhdGZvcm1QYWdlQ2xpZW50KCktPm1hcmtGb3JTeW5jKHRy
dWUpOworfQorI2VuZGlmCisKIFF0QWJzdHJhY3RXZWJQb3B1cCogQ2hyb21lQ2xpZW50UXQ6OmNy
ZWF0ZVBvcHVwKCkKIHsKICAgICByZXR1cm4gbmV3IFF0RmFsbGJhY2tXZWJQb3B1cDsKSW5kZXg6
IFdlYktpdC9xdC9XZWJDb3JlU3VwcG9ydC9DaHJvbWVDbGllbnRRdC5oCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFdlYktpdC9xdC9XZWJDb3JlU3VwcG9ydC9DaHJvbWVDbGllbnRRdC5oCShyZXZpc2lvbiA1MzQy
NykKKysrIFdlYktpdC9xdC9XZWJDb3JlU3VwcG9ydC9DaHJvbWVDbGllbnRRdC5oCSh3b3JraW5n
IGNvcHkpCkBAIC0xMjMsNiArMTIzLDE1IEBACiAjaWYgRU5BQkxFKE9GRkxJTkVfV0VCX0FQUExJ
Q0FUSU9OUykKICAgICAgICAgdmlydHVhbCB2b2lkIHJlYWNoZWRNYXhBcHBDYWNoZVNpemUoaW50
NjRfdCBzcGFjZU5lZWRlZCk7CiAjZW5kaWYKKworI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJ
VElORykKKyAgICAgICAgLy8gc2VlIENocm9tZUNsaWVudC5oCisgICAgICAgIC8vIHRoaXMgaXMg
YSBob29rIGZvciBXZWJDb3JlIHRvIHRlbGwgdXMgd2hhdCB3ZSBuZWVkIHRvIGRvIHdpdGggdGhl
IEdyYXBoaWNzTGF5ZXJzCisgICAgICAgIHZpcnR1YWwgdm9pZCBhdHRhY2hSb290R3JhcGhpY3NM
YXllcihGcmFtZSosIEdyYXBoaWNzTGF5ZXIqKTsKKyAgICAgICAgdmlydHVhbCB2b2lkIHNldE5l
ZWRzT25lU2hvdERyYXdpbmdTeW5jaHJvbml6YXRpb24oKTsKKyAgICAgICAgdmlydHVhbCB2b2lk
IHNjaGVkdWxlQ29tcG9zaXRpbmdMYXllclN5bmMoKTsKKyNlbmRpZgorCiAgICAgICAgIHZpcnR1
YWwgdm9pZCBydW5PcGVuUGFuZWwoRnJhbWUqLCBQYXNzUmVmUHRyPEZpbGVDaG9vc2VyPik7CiAK
ICAgICAgICAgdmlydHVhbCB2b2lkIGZvcm1TdGF0ZURpZENoYW5nZShjb25zdCBOb2RlKikgeyB9
CkluZGV4OiBXZWJLaXQvcXQvQXBpL3FncmFwaGljc3dlYnZpZXcuY3BwCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFdlYktpdC9xdC9BcGkvcWdyYXBoaWNzd2Vidmlldy5jcHAJKHJldmlzaW9uIDUzNDI3KQorKysg
V2ViS2l0L3F0L0FwaS9xZ3JhcGhpY3N3ZWJ2aWV3LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjIs
MjQgKzIyLDcxIEBACiAjaW5jbHVkZSAicWdyYXBoaWNzd2Vidmlldy5oIgogCiAjaW5jbHVkZSAi
cXdlYmZyYW1lLmgiCisjaW5jbHVkZSAicXdlYmZyYW1lX3AuaCIKICNpbmNsdWRlICJxd2VicGFn
ZS5oIgogI2luY2x1ZGUgInF3ZWJwYWdlX3AuaCIKICNpbmNsdWRlICJRV2ViUGFnZUNsaWVudC5o
IgotI2luY2x1ZGUgPFF0R3VpL1FHcmFwaGljc1NjZW5lPgotI2luY2x1ZGUgPFF0R3VpL1FHcmFw
aGljc1ZpZXc+CisjaW5jbHVkZSA8RnJhbWVWaWV3Lmg+CisjaW5jbHVkZSA8UXRDb3JlL3FzaGFy
ZWRwb2ludGVyLmg+CisjaW5jbHVkZSA8UXRDb3JlL3F0aW1lci5oPgogI2luY2x1ZGUgPFF0R3Vp
L3FhcHBsaWNhdGlvbi5oPgorI2luY2x1ZGUgPFF0R3VpL3FncmFwaGljc3NjZW5lLmg+CiAjaW5j
bHVkZSA8UXRHdWkvcWdyYXBoaWNzc2NlbmVldmVudC5oPgorI2luY2x1ZGUgPFF0R3VpL3FncmFw
aGljc3ZpZXcuaD4KKyNpbmNsdWRlIDxRdEd1aS9xcGl4bWFwY2FjaGUuaD4KICNpbmNsdWRlIDxR
dEd1aS9xc3R5bGVvcHRpb24uaD4KICNpZiBkZWZpbmVkKFFfV1NfWDExKQogI2luY2x1ZGUgPFFY
MTFJbmZvPgogI2VuZGlmCisjaW5jbHVkZSA8U2V0dGluZ3MuaD4KIAorI2lmIFVTRShBQ0NFTEVS
QVRFRF9DT01QT1NJVElORykKKworLy8gdGhlIG92ZXJsYXkgaXMgaGVyZSBmb3Igb25lIHJlYXNv
biBvbmx5OiB0byBoYXZlIHRoZSBzY3JvbGwtYmFycyBhbmQgb3RoZXIKKy8vIGV4dHJhIFVJIGVs
ZW1lbnRzIGFwcGVhciBvbiB0b3Agb2YgYW55IFFHcmFwaGljc0l0ZW1zIGNyZWF0ZWQgYnkgQ1NT
IGNvbXBvc2l0aW5nIGxheWVycworY2xhc3MgUUdyYXBoaWNzV2ViVmlld092ZXJsYXkgOiBwdWJs
aWMgUUdyYXBoaWNzSXRlbSB7CisgICAgcHVibGljOgorICAgIFFHcmFwaGljc1dlYlZpZXdPdmVy
bGF5KFFHcmFwaGljc1dlYlZpZXcqIHZpZXcpCisgICAgICAgICAgICA6UUdyYXBoaWNzSXRlbSh2
aWV3KQorICAgICAgICAgICAgLCBxKHZpZXcpCisgICAgeworICAgICAgICBzZXRQb3MoMCwgMCk7
CisgICAgICAgIHNldEZsYWcoUUdyYXBoaWNzSXRlbTo6SXRlbVVzZXNFeHRlbmRlZFN0eWxlT3B0
aW9uLCB0cnVlKTsKKyAgICAgICAgc2V0Q2FjaGVNb2RlKFFHcmFwaGljc0l0ZW06OkRldmljZUNv
b3JkaW5hdGVDYWNoZSk7CisgICAgfQorCisgICAgUVJlY3RGIGJvdW5kaW5nUmVjdCgpIGNvbnN0
CisgICAgeworICAgICAgICByZXR1cm4gcS0+Ym91bmRpbmdSZWN0KCk7CisgICAgfQorCisgICAg
dm9pZCBwYWludChRUGFpbnRlciogcGFpbnRlciwgY29uc3QgUVN0eWxlT3B0aW9uR3JhcGhpY3NJ
dGVtKiBvcHRpb25zLCBRV2lkZ2V0KikKKyAgICB7CisgICAgICAgIHEtPnBhZ2UoKS0+bWFpbkZy
YW1lKCktPnJlbmRlcihwYWludGVyLCBzdGF0aWNfY2FzdDxRV2ViRnJhbWU6OlJlbmRlckxheWVy
PihRV2ViRnJhbWU6OkFsbExheWVycyYoflFXZWJGcmFtZTo6Q29udGVudHNMYXllcikpLCBvcHRp
b25zLT5leHBvc2VkUmVjdC50b1JlY3QoKSk7CisgICAgfQorCisgICAgZnJpZW5kIGNsYXNzIFFH
cmFwaGljc1dlYlZpZXc7CisgICAgUUdyYXBoaWNzV2ViVmlldyogcTsKK307CisKKyNlbmRpZgor
CiBjbGFzcyBRR3JhcGhpY3NXZWJWaWV3UHJpdmF0ZSA6IHB1YmxpYyBRV2ViUGFnZUNsaWVudCB7
CiBwdWJsaWM6CiAgICAgUUdyYXBoaWNzV2ViVmlld1ByaXZhdGUoUUdyYXBoaWNzV2ViVmlldyog
cGFyZW50KQogICAgICAgICA6IHEocGFyZW50KQogICAgICAgICAsIHBhZ2UoMCkKLSAgICB7fQor
I2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKKyAgICAgICAgLCByb290R3JhcGhpY3NM
YXllcigwKQorICAgICAgICAsIHNob3VsZFN5bmModHJ1ZSkKKyNlbmRpZgorICAgIHsKKyNpZiBV
U0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCisgICAgICAgIC8vIHRoZSBvdmVybGF5IGFuZCBz
dGF5cyBhbGl2ZSBmb3IgdGhlIGxpZmV0aW1lIG9mCisgICAgICAgIC8vIHRoaXMgUUdyYXBoaWNz
V2ViVmlldyBhcyB0aGUgc2Nyb2xsYmFycyBhcmUgbmVlZGVkIHdoZW4gdGhlcmUncyBubyBjb21w
b3NpdGluZworICAgICAgICBxLT5zZXRGbGFnKFFHcmFwaGljc0l0ZW06Okl0ZW1Vc2VzRXh0ZW5k
ZWRTdHlsZU9wdGlvbik7CisjZW5kaWYKKyAgICB9CiAKICAgICB2aXJ0dWFsIH5RR3JhcGhpY3NX
ZWJWaWV3UHJpdmF0ZSgpOwogICAgIHZpcnR1YWwgdm9pZCBzY3JvbGwoaW50IGR4LCBpbnQgZHks
IGNvbnN0IFFSZWN0Jik7CkBAIC02MSwxNiArMTA4LDk3IEBACiAKICAgICB2aXJ0dWFsIFFPYmpl
Y3QqIHBsdWdpblBhcmVudCgpIGNvbnN0OwogCisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lU
SU5HKQorICAgIHZpcnR1YWwgdm9pZCBzZXRSb290R3JhcGhpY3NMYXllcihRR3JhcGhpY3NJdGVt
KiBsYXllcik7CisgICAgdmlydHVhbCB2b2lkIG1hcmtGb3JTeW5jKGJvb2wgc2NoZWR1bGVTeW5j
KTsKKyAgICB2b2lkIHVwZGF0ZUNvbXBvc2l0aW5nU2Nyb2xsUG9zaXRpb24oKTsKKyNlbmRpZgor
CisgICAgdm9pZCBzeW5jTGF5ZXJzKCk7CiAgICAgdm9pZCBfcV9kb0xvYWRGaW5pc2hlZChib29s
IHN1Y2Nlc3MpOwogCiAgICAgUUdyYXBoaWNzV2ViVmlldyogcTsKICAgICBRV2ViUGFnZSogcGFn
ZTsKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCisgICAgUUdyYXBoaWNzSXRlbSog
cm9vdEdyYXBoaWNzTGF5ZXI7CisKKyAgICAvLyB0aGUgb3ZlcmxheSBnZXRzIGluc3RhbnRpYXRl
ZCB3aGVuIHRoZSByb290IGxheWVyIGlzIGF0dGFjaGVkLCBhbmQgZ2V0IGRlbGV0ZWQgd2hlbiBp
dCdzIGRldGFjaGVkCisgICAgUVNoYXJlZFBvaW50ZXI8UUdyYXBoaWNzV2ViVmlld092ZXJsYXk+
IG92ZXJsYXk7CisKKyAgICAvLyB3ZSBuZWVkIHRvIHN5bmMgdGhlIGxheWVycyBpZiB3ZSBnZXQg
YSBzcGVjaWFsIGNhbGwgZnJvbSB0aGUgV2ViQ29yZQorICAgIC8vIGNvbXBvc2l0b3IgdGVsbGlu
ZyB1cyB0byBkbyBzby4gV2UnbGwgZ2V0IHRoYXQgY2FsbCBmcm9tIENocm9tZUNsaWVudFF0Cisg
ICAgYm9vbCBzaG91bGRTeW5jOworCisgICAgLy8gd2UgbmVlZCB0byBwdXQgdGhlIHJvb3QgZ3Jh
cGhpY3MgbGF5ZXIgYmVoaW5kIHRoZSBvdmVybGF5ICh3aGljaCBjb250YWlucyB0aGUgc2Nyb2xs
YmFyKQorICAgIGVudW0geyBSb290R3JhcGhpY3NMYXllclpWYWx1ZSwgT3ZlcmxheVpWYWx1ZSB9
OworI2VuZGlmCiB9OwogCiBRR3JhcGhpY3NXZWJWaWV3UHJpdmF0ZTo6flFHcmFwaGljc1dlYlZp
ZXdQcml2YXRlKCkKIHsKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCisgICAgaWYg
KHJvb3RHcmFwaGljc0xheWVyKSB7CisgICAgICAgIC8vIHdlIGRvbid0IG5lZWQgdG8gZGVsZXRl
IHRoZSByb290IGdyYXBoaWNzIGxheWVyCisgICAgICAgIC8vIFRoZSBsaWZlY3ljbGUgaXMgbWFu
YWdlZCBpbiBHcmFwaGljc0xheWVyUXQuY3BwCisgICAgICAgIHJvb3RHcmFwaGljc0xheWVyLT5z
ZXRQYXJlbnRJdGVtKDApOworICAgICAgICBxLT5zY2VuZSgpLT5yZW1vdmVJdGVtKHJvb3RHcmFw
aGljc0xheWVyKTsKKyAgICB9CisjZW5kaWYKIH0KIAorI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01Q
T1NJVElORykKK3ZvaWQgUUdyYXBoaWNzV2ViVmlld1ByaXZhdGU6OnNldFJvb3RHcmFwaGljc0xh
eWVyKFFHcmFwaGljc0l0ZW0qIGxheWVyKQoreworICAgIGlmIChyb290R3JhcGhpY3NMYXllcikg
eworICAgICAgICByb290R3JhcGhpY3NMYXllci0+c2V0UGFyZW50SXRlbSgwKTsKKyAgICAgICAg
cS0+c2NlbmUoKS0+cmVtb3ZlSXRlbShyb290R3JhcGhpY3NMYXllcik7CisgICAgICAgIFFXZWJG
cmFtZVByaXZhdGU6OmNvcmUocS0+cGFnZSgpLT5tYWluRnJhbWUoKSktPnZpZXcoKS0+c3luY0Nv
bXBvc2l0aW5nU3RhdGVSZWN1cnNpdmUoKTsKKyAgICB9CisKKyAgICByb290R3JhcGhpY3NMYXll
ciA9IGxheWVyOworCisgICAgaWYgKGxheWVyKSB7CisgICAgICAgIGxheWVyLT5zZXRGbGFnKFFH
cmFwaGljc0l0ZW06Okl0ZW1DbGlwc0NoaWxkcmVuVG9TaGFwZSwgdHJ1ZSk7CisgICAgICAgIGxh
eWVyLT5zZXRQYXJlbnRJdGVtKHEpOworICAgICAgICBsYXllci0+c2V0WlZhbHVlKFJvb3RHcmFw
aGljc0xheWVyWlZhbHVlKTsKKyAgICAgICAgaWYgKCFvdmVybGF5KSB7CisgICAgICAgICAgICBv
dmVybGF5ID0gUVNoYXJlZFBvaW50ZXI8UUdyYXBoaWNzV2ViVmlld092ZXJsYXk+KG5ldyBRR3Jh
cGhpY3NXZWJWaWV3T3ZlcmxheShxKSk7CisgICAgICAgICAgICBvdmVybGF5LT5zZXRaVmFsdWUo
T3ZlcmxheVpWYWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgdXBkYXRlQ29tcG9zaXRpbmdTY3Jv
bGxQb3NpdGlvbigpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIHdlIGRvbid0IGhhdmUgY29t
cG9zaXRpbmcgbGF5ZXJzLCB3ZSBjYW4gcmVuZGVyIHRoZSBzY3JvbGxiYXJzIGFuZCBjb250ZW50
IGluIG9uZSBnbworICAgICAgICBvdmVybGF5LmNsZWFyKCk7CisgICAgfQorfQorCit2b2lkIFFH
cmFwaGljc1dlYlZpZXdQcml2YXRlOjptYXJrRm9yU3luYyhib29sIHNjaGVkdWxlU3luYykKK3sK
KyAgICBzaG91bGRTeW5jID0gdHJ1ZTsKKyAgICBpZiAoc2NoZWR1bGVTeW5jKQorICAgICAgICBR
VGltZXI6OnNpbmdsZVNob3QoMCwgcSwgU0xPVChzeW5jTGF5ZXJzKCkpKTsKK30KKwordm9pZCBR
R3JhcGhpY3NXZWJWaWV3UHJpdmF0ZTo6dXBkYXRlQ29tcG9zaXRpbmdTY3JvbGxQb3NpdGlvbigp
Cit7CisgICAgaWYgKHJvb3RHcmFwaGljc0xheWVyICYmIHEtPnBhZ2UoKSAmJiBxLT5wYWdlKCkt
Pm1haW5GcmFtZSgpKSB7CisgICAgICAgIGNvbnN0IFFQb2ludCBzY3JvbGxQb3NpdGlvbiA9IHEt
PnBhZ2UoKS0+bWFpbkZyYW1lKCktPnNjcm9sbFBvc2l0aW9uKCk7CisgICAgICAgIHJvb3RHcmFw
aGljc0xheWVyLT5zZXRQb3MoLXNjcm9sbFBvc2l0aW9uKTsKKyAgICB9Cit9CisKKyNlbmRpZgor
Cit2b2lkIFFHcmFwaGljc1dlYlZpZXdQcml2YXRlOjpzeW5jTGF5ZXJzKCkKK3sKKyNpZiBVU0Uo
QUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCisgICAgaWYgKHNob3VsZFN5bmMpIHsKKyAgICAgICAg
UVdlYkZyYW1lUHJpdmF0ZTo6Y29yZShxLT5wYWdlKCktPm1haW5GcmFtZSgpKS0+dmlldygpLT5z
eW5jQ29tcG9zaXRpbmdTdGF0ZVJlY3Vyc2l2ZSgpOworICAgICAgICBzaG91bGRTeW5jID0gZmFs
c2U7CisgICAgfQorI2VuZGlmCit9CisKIHZvaWQgUUdyYXBoaWNzV2ViVmlld1ByaXZhdGU6Ol9x
X2RvTG9hZEZpbmlzaGVkKGJvb2wgc3VjY2VzcykKIHsKICAgICAvLyBJZiB0aGUgcGFnZSBoYWQg
bm8gdGl0bGUsIHN0aWxsIG1ha2Ugc3VyZSBpdCBnZXRzIHRoZSBzaWduYWwKQEAgLTgzLDExICsy
MTEsMTggQEAKIHZvaWQgUUdyYXBoaWNzV2ViVmlld1ByaXZhdGU6OnNjcm9sbChpbnQgZHgsIGlu
dCBkeSwgY29uc3QgUVJlY3QmIHJlY3RUb1Njcm9sbCkKIHsKICAgICBxLT5zY3JvbGwocXJlYWwo
ZHgpLCBxcmVhbChkeSksIFFSZWN0RihyZWN0VG9TY3JvbGwpKTsKKyNpZiBVU0UoQUNDRUxFUkFU
RURfQ09NUE9TSVRJTkcpCisgICAgdXBkYXRlQ29tcG9zaXRpbmdTY3JvbGxQb3NpdGlvbigpOwor
I2VuZGlmCiB9CiAKIHZvaWQgUUdyYXBoaWNzV2ViVmlld1ByaXZhdGU6OnVwZGF0ZShjb25zdCBR
UmVjdCAmIGRpcnR5UmVjdCkKIHsKICAgICBxLT51cGRhdGUoUVJlY3RGKGRpcnR5UmVjdCkpOwor
I2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKKyAgICBpZiAob3ZlcmxheSkKKyAgICAg
ICAgb3ZlcmxheS0+dXBkYXRlKFFSZWN0RihkaXJ0eVJlY3QpKTsKKyNlbmRpZgogfQogCiAKQEAg
LTI0OCw2ICszODMsNyBAQAogICAgIHNldEFjY2VwdFRvdWNoRXZlbnRzKHRydWUpOwogI2VuZGlm
CiAgICAgc2V0Rm9jdXNQb2xpY3koUXQ6OlN0cm9uZ0ZvY3VzKTsKKyAgICBzZXRGbGFnKFFHcmFw
aGljc0l0ZW06Okl0ZW1DbGlwc0NoaWxkcmVuVG9TaGFwZSwgdHJ1ZSk7CiB9CiAKIC8qIQpAQCAt
Mjk3LDcgKzQzMywxMiBAQAogKi8KIHZvaWQgUUdyYXBoaWNzV2ViVmlldzo6cGFpbnQoUVBhaW50
ZXIqIHBhaW50ZXIsIGNvbnN0IFFTdHlsZU9wdGlvbkdyYXBoaWNzSXRlbSogb3B0aW9uLCBRV2lk
Z2V0KikKIHsKLSAgICBwYWdlKCktPm1haW5GcmFtZSgpLT5yZW5kZXIocGFpbnRlciwgb3B0aW9u
LT5leHBvc2VkUmVjdC50b1JlY3QoKSk7CisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5H
KQorICAgIHBhZ2UoKS0+bWFpbkZyYW1lKCktPnJlbmRlcihwYWludGVyLCBkLT5vdmVybGF5ID8g
UVdlYkZyYW1lOjpDb250ZW50c0xheWVyIDogUVdlYkZyYW1lOjpBbGxMYXllcnMsIG9wdGlvbi0+
ZXhwb3NlZFJlY3QudG9BbGlnbmVkUmVjdCgpKTsKKyAgICBkLT5zeW5jTGF5ZXJzKCk7CisjZWxz
ZQorICAgIHBhZ2UoKS0+bWFpbkZyYW1lKCktPnJlbmRlcihwYWludGVyLCBRV2ViRnJhbWU6OkFs
bExheWVycywgb3B0aW9uLT5leHBvc2VkUmVjdC50b1JlY3QoKSk7CisjZW5kaWYKIH0KIAogLyoh
IFxyZWltcApAQCAtNDI1LDYgKzU2NiwxMCBAQAogICAgIGQtPnBhZ2UgPSBwYWdlOwogICAgIGlm
ICghZC0+cGFnZSkKICAgICAgICAgcmV0dXJuOworI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJ
VElORykKKyAgICBpZiAoZC0+b3ZlcmxheSkKKyAgICAgICAgZC0+b3ZlcmxheS0+cHJlcGFyZUdl
b21ldHJ5Q2hhbmdlKCk7CisjZW5kaWYKICAgICBkLT5wYWdlLT5kLT5jbGllbnQgPSBkOyAvLyBz
ZXQgdGhlIHBhZ2UgY2xpZW50CiAKICAgICBRU2l6ZSBzaXplID0gZ2VvbWV0cnkoKS5zaXplKCku
dG9TaXplKCk7CkBAIC01MjgsNiArNjczLDEyIEBACiAqLwogdm9pZCBRR3JhcGhpY3NXZWJWaWV3
Ojp1cGRhdGVHZW9tZXRyeSgpCiB7CisKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcp
CisgICAgaWYgKGQtPm92ZXJsYXkpCisgICAgICAgIGQtPm92ZXJsYXktPnByZXBhcmVHZW9tZXRy
eUNoYW5nZSgpOworI2VuZGlmCisKICAgICBRR3JhcGhpY3NXaWRnZXQ6OnVwZGF0ZUdlb21ldHJ5
KCk7CiAKICAgICBpZiAoIWQtPnBhZ2UpCkBAIC01NDMsNiArNjk0LDExIEBACiB7CiAgICAgUUdy
YXBoaWNzV2lkZ2V0OjpzZXRHZW9tZXRyeShyZWN0KTsKIAorI2lmIFVTRShBQ0NFTEVSQVRFRF9D
T01QT1NJVElORykKKyAgICBpZiAoZC0+b3ZlcmxheSkKKyAgICAgICAgZC0+b3ZlcmxheS0+cHJl
cGFyZUdlb21ldHJ5Q2hhbmdlKCk7CisjZW5kaWYKKwogICAgIGlmICghZC0+cGFnZSkKICAgICAg
ICAgcmV0dXJuOwogCkluZGV4OiBXZWJLaXQvcXQvQXBpL3F3ZWJzZXR0aW5ncy5oCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFdlYktpdC9xdC9BcGkvcXdlYnNldHRpbmdzLmgJKHJldmlzaW9uIDUzNDI3KQorKysg
V2ViS2l0L3F0L0FwaS9xd2Vic2V0dGluZ3MuaAkod29ya2luZyBjb3B5KQpAQCAtNjgsNyArNjgs
OCBAQAogI2VuZGlmCiAgICAgICAgIExvY2FsQ29udGVudENhbkFjY2Vzc1JlbW90ZVVybHMsCiAg
ICAgICAgIERuc1ByZWZldGNoRW5hYmxlZCwKLSAgICAgICAgWFNTQXVkaXRvckVuYWJsZWQKKyAg
ICAgICAgWFNTQXVkaXRvckVuYWJsZWQsCisgICAgICAgIEFjY2VsZXJhdGVkQ29tcG9zaXRpbmdF
bmFibGVkCiAgICAgfTsKICAgICBlbnVtIFdlYkdyYXBoaWMgewogICAgICAgICBNaXNzaW5nSW1h
Z2VHcmFwaGljLApJbmRleDogV2ViS2l0L3F0L0FwaS9xZ3JhcGhpY3N3ZWJ2aWV3LmgKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gV2ViS2l0L3F0L0FwaS9xZ3JhcGhpY3N3ZWJ2aWV3LmgJKHJldmlzaW9uIDUzNDI3
KQorKysgV2ViS2l0L3F0L0FwaS9xZ3JhcGhpY3N3ZWJ2aWV3LmgJKHdvcmtpbmcgY29weSkKQEAg
LTEzNCw2ICsxMzQsOSBAQAogCiBwcml2YXRlOgogICAgIFFfUFJJVkFURV9TTE9UKGQsIHZvaWQg
X3FfZG9Mb2FkRmluaXNoZWQoYm9vbCBzdWNjZXNzKSkKKyAgICAvLyB3ZSBkb24ndCB3YW50IHRv
IGNoYW5nZSB0aGUgbW9jIGJhc2VkIG9uIFVTRSgpIG1hY3JvLCBzbyB0aGlzIGZ1bmN0aW9uIGlz
IGhlcmUKKyAgICAvLyBidXQgd2lsbCBiZSBlbXB0eSBpZiBBQ0NMRVJBVEVEX0NPTVBPU0lUSU5H
IGlzIGRpc2FibGVkCisgICAgUV9QUklWQVRFX1NMT1QoZCwgdm9pZCBzeW5jTGF5ZXJzKCkpCiAK
ICAgICBRR3JhcGhpY3NXZWJWaWV3UHJpdmF0ZSogY29uc3QgZDsKICAgICBmcmllbmQgY2xhc3Mg
UUdyYXBoaWNzV2ViVmlld1ByaXZhdGU7CkluZGV4OiBXZWJLaXQvcXQvQXBpL3F3ZWJzZXR0aW5n
cy5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0L3F0L0FwaS9xd2Vic2V0dGluZ3MuY3BwCShyZXZp
c2lvbiA1MzQyNykKKysrIFdlYktpdC9xdC9BcGkvcXdlYnNldHRpbmdzLmNwcAkod29ya2luZyBj
b3B5KQpAQCAtMTUyLDcgKzE1MiwxMiBAQAogICAgICAgICB2YWx1ZSA9IGF0dHJpYnV0ZXMudmFs
dWUoUVdlYlNldHRpbmdzOjpKYXZhc2NyaXB0RW5hYmxlZCwKICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgZ2xvYmFsLT5hdHRyaWJ1dGVzLnZhbHVlKFFXZWJTZXR0aW5nczo6
SmF2YXNjcmlwdEVuYWJsZWQpKTsKICAgICAgICAgc2V0dGluZ3MtPnNldEphdmFTY3JpcHRFbmFi
bGVkKHZhbHVlKTsKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCisgICAgICAgIHZh
bHVlID0gYXR0cmlidXRlcy52YWx1ZShRV2ViU2V0dGluZ3M6OkFjY2VsZXJhdGVkQ29tcG9zaXRp
bmdFbmFibGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWwt
PmF0dHJpYnV0ZXMudmFsdWUoUVdlYlNldHRpbmdzOjpBY2NlbGVyYXRlZENvbXBvc2l0aW5nRW5h
YmxlZCkpOwogCisgICAgICAgIHNldHRpbmdzLT5zZXRBY2NlbGVyYXRlZENvbXBvc2l0aW5nRW5h
YmxlZCh2YWx1ZSk7CisjZW5kaWYKICAgICAgICAgdmFsdWUgPSBhdHRyaWJ1dGVzLnZhbHVlKFFX
ZWJTZXR0aW5nczo6SmF2YXNjcmlwdENhbk9wZW5XaW5kb3dzLAogICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBnbG9iYWwtPmF0dHJpYnV0ZXMudmFsdWUoUVdlYlNldHRpbmdz
OjpKYXZhc2NyaXB0Q2FuT3BlbldpbmRvd3MpKTsKICAgICAgICAgc2V0dGluZ3MtPnNldEphdmFT
Y3JpcHRDYW5PcGVuV2luZG93c0F1dG9tYXRpY2FsbHkodmFsdWUpOwpAQCAtMzg5LDYgKzM5NCw3
IEBACiAgICAgZC0+YXR0cmlidXRlcy5pbnNlcnQoUVdlYlNldHRpbmdzOjpPZmZsaW5lV2ViQXBw
bGljYXRpb25DYWNoZUVuYWJsZWQsIGZhbHNlKTsKICAgICBkLT5hdHRyaWJ1dGVzLmluc2VydChR
V2ViU2V0dGluZ3M6OkxvY2FsU3RvcmFnZUVuYWJsZWQsIGZhbHNlKTsKICAgICBkLT5hdHRyaWJ1
dGVzLmluc2VydChRV2ViU2V0dGluZ3M6OkxvY2FsQ29udGVudENhbkFjY2Vzc1JlbW90ZVVybHMs
IGZhbHNlKTsKKyAgICBkLT5hdHRyaWJ1dGVzLmluc2VydChRV2ViU2V0dGluZ3M6OkFjY2VsZXJh
dGVkQ29tcG9zaXRpbmdFbmFibGVkLCBmYWxzZSk7CiAgICAgZC0+b2ZmbGluZVN0b3JhZ2VEZWZh
dWx0UXVvdGEgPSA1ICogMTAyNCAqIDEwMjQ7CiAgICAgZC0+ZGVmYXVsdFRleHRFbmNvZGluZyA9
IFFMYXRpbjFTdHJpbmcoImlzby04ODU5LTEiKTsKIH0KSW5kZXg6IFdlYktpdC9xdC9BcGkvcXdl
YnZpZXcuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdC9xdC9BcGkvcXdlYnZpZXcuY3BwCShyZXZp
c2lvbiA1MzQyNykKKysrIFdlYktpdC9xdC9BcGkvcXdlYnZpZXcuY3BwCSh3b3JraW5nIGNvcHkp
CkBAIC0yMiwxMCArMjIsMTEgQEAKICNpbmNsdWRlICJjb25maWcuaCIKICNpbmNsdWRlICJxd2Vi
dmlldy5oIgogCisjaW5jbHVkZSAiUGFnZS5oIgogI2luY2x1ZGUgIlFXZWJQYWdlQ2xpZW50Lmgi
CisjaW5jbHVkZSAiU2V0dGluZ3MuaCIKICNpbmNsdWRlICJxd2ViZnJhbWUuaCIKICNpbmNsdWRl
ICJxd2VicGFnZV9wLmgiCi0KICNpbmNsdWRlICJxYml0bWFwLmgiCiAjaW5jbHVkZSAicWV2ZW50
LmgiCiAjaW5jbHVkZSAicXBhaW50ZXIuaCIKQEAgLTI0Nyw2ICsyNDgsOSBAQAogICAgICAgICAg
ICAgICAgIHRoaXMsIFNMT1QoX3FfcGFnZURlc3Ryb3llZCgpKSk7CiAgICAgfQogICAgIHNldEF0
dHJpYnV0ZShRdDo6V0FfT3BhcXVlUGFpbnRFdmVudCwgZC0+cGFnZSk7CisjaWYgVVNFKEFDQ0VM
RVJBVEVEX0NPTVBPU0lUSU5HKQorICAgIGQtPnBhZ2UtPmQtPnBhZ2UtPnNldHRpbmdzKCktPnNl
dEFjY2VsZXJhdGVkQ29tcG9zaXRpbmdFbmFibGVkKGZhbHNlKTsKKyNlbmRpZgogICAgIHVwZGF0
ZSgpOwogfQogCkluZGV4OiBXZWJDb3JlL1dlYkNvcmUucHJvCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNv
cmUvV2ViQ29yZS5wcm8JKHJldmlzaW9uIDUzNDI3KQorKysgV2ViQ29yZS9XZWJDb3JlLnBybwko
d29ya2luZyBjb3B5KQpAQCAtMjcwNyw2ICsyNzA3LDE5IEBACiAgICAgICAgICAgICBwbHVnaW5z
L3dpbi9QYWludEhvb2tzLmFzbQogICAgIH0KIH0KK2NvbnRhaW5zKERFRklORVMsIFdURl9VU0Vf
QUNDRUxFUkFURURfQ09NUE9TSVRJTkcpIHsKK0hFQURFUlMgKz0gXAorICAgIHJlbmRlcmluZy9S
ZW5kZXJMYXllckJhY2tpbmcuaCBcCisgICAgcmVuZGVyaW5nL1JlbmRlckxheWVyQ29tcG9zaXRv
ci5oIFwKKyAgICBwbGF0Zm9ybS9ncmFwaGljcy9HcmFwaGljc0xheWVyLmggXAorICAgIHBsYXRm
b3JtL2dyYXBoaWNzL0dyYXBoaWNzTGF5ZXJDbGllbnQuaCBcCisgICAgcGxhdGZvcm0vZ3JhcGhp
Y3MvcXQvR3JhcGhpY3NMYXllclF0LmgKK1NPVVJDRVMgKz0gXAorICAgIHBsYXRmb3JtL2dyYXBo
aWNzL0dyYXBoaWNzTGF5ZXIuY3BwIFwKKyAgICBwbGF0Zm9ybS9ncmFwaGljcy9xdC9HcmFwaGlj
c0xheWVyUXQuY3BwIFwKKyAgICByZW5kZXJpbmcvUmVuZGVyTGF5ZXJCYWNraW5nLmNwcCBcCisg
ICAgcmVuZGVyaW5nL1JlbmRlckxheWVyQ29tcG9zaXRvci5jcHAKK30KIAogc3ltYmlhbiB7CiAg
ICAgc2hhcmVkIHsKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vcXQvUVdlYlBhZ2VDbGllbnQuaAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL3F0L1FXZWJQYWdlQ2xpZW50LmgJKHJldmlz
aW9uIDUzNDI3KQorKysgV2ViQ29yZS9wbGF0Zm9ybS9xdC9RV2ViUGFnZUNsaWVudC5oCSh3b3Jr
aW5nIGNvcHkpCkBAIC0yOSw4ICsyOSw5IEBACiAjaWZuZGVmIFFUX05PX0NVUlNPUgogI2luY2x1
ZGUgPFFDdXJzb3I+CiAjZW5kaWYKKwogI2luY2x1ZGUgPFFSZWN0PgotCitjbGFzcyBRR3JhcGhp
Y3NJdGVtOwogY2xhc3MgUVdlYlBhZ2VDbGllbnQgewogcHVibGljOgogICAgIHZpcnR1YWwgflFX
ZWJQYWdlQ2xpZW50KCkgeyB9CkBAIC0zOSw2ICs0MCwxNiBAQAogICAgIHZpcnR1YWwgdm9pZCB1
cGRhdGUoY29uc3QgUVJlY3QmKSA9IDA7CiAgICAgdmlydHVhbCB2b2lkIHNldElucHV0TWV0aG9k
RW5hYmxlZChib29sIGVuYWJsZSkgPSAwOwogICAgIHZpcnR1YWwgYm9vbCBpbnB1dE1ldGhvZEVu
YWJsZWQoKSBjb25zdCA9IDA7CisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorICAg
IC8vIHRoaXMgZ2V0cyBjYWxsZWQgd2hlbiB3ZSBzdGFydC9zdG9wIGNvbXBvc2l0aW5nLgorICAg
IHZpcnR1YWwgdm9pZCBzZXRSb290R3JhcGhpY3NMYXllcihRR3JhcGhpY3NJdGVtKiBsYXllcikg
e30KKworICAgIC8vIHRoaXMgZ2V0cyBjYWxsZWQgd2hlbiB0aGUgY29tcG9zaXRvciB3YW50cyB1
cyB0byBzeW5jIHRoZSBsYXllcnMKKyAgICAvLyBpZiBzY2hlZHVsZVN5bmMgaXMgdHJ1ZSwgd2Ug
c2NoZWR1bGUgYSBzeW5jIG91cnNlbHZlcy4gb3RoZXJ3aXNlLAorICAgIC8vIHdlIHdhaXQgZm9y
IHRoZSBuZXh0IHVwZGF0ZSBhbmQgc3luYyB0aGUgbGF5ZXJzIHRoZW4uCisgICAgdmlydHVhbCB2
b2lkIG1hcmtGb3JTeW5jKGJvb2wgc2NoZWR1bGVTeW5jID0gZmFsc2UpIHt9CisjZW5kaWYKKwog
I2lmIFFUX1ZFUlNJT04gPj0gMHgwNDA2MDAKICAgICB2aXJ0dWFsIHZvaWQgc2V0SW5wdXRNZXRo
b2RIaW50KFF0OjpJbnB1dE1ldGhvZEhpbnQgaGludCwgYm9vbCBlbmFibGUpID0gMDsKICNlbmRp
ZgpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9xdC9HcmFwaGljc0xheWVyUXQuY3Bw
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIC9kZXYvbnVsbAorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9x
dC9HcmFwaGljc0xheWVyUXQuY3BwCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDExMjUgQEAKKy8q
CisgICAgQ29weXJpZ2h0IChDKSAyMDA5IE5va2lhIENvcnBvcmF0aW9uIGFuZC9vciBpdHMgc3Vi
c2lkaWFyeSgtaWVzKQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBj
YW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMg
b2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNo
ZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAy
IG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgor
CisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2ls
bCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4g
dGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBG
T1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExpYnJhcnkgR2VuZXJh
bCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZl
IHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5z
ZQorICAgIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIu
ICBJZiBub3QsIHdyaXRlIHRvCisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5j
LiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAgICBCb3N0b24sIE1BIDAyMTEw
LTEzMDEsIFVTQS4KKyovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJHcmFwaGlj
c0xheWVyUXQuaCIKKworI2luY2x1ZGUgIkN1cnJlbnRUaW1lLmgiCisjaW5jbHVkZSAiRmxvYXRS
ZWN0LmgiCisjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCisjaW5jbHVkZSAiSW1hZ2UuaCIK
KyNpbmNsdWRlICJSZWZDb3VudGVkLmgiCisjaW5jbHVkZSAiVHJhbnNsYXRlVHJhbnNmb3JtT3Bl
cmF0aW9uLmgiCisjaW5jbHVkZSAiVW5pdEJlemllci5oIgorI2luY2x1ZGUgPFF0Q29yZS9xYWJz
dHJhY3RhbmltYXRpb24uaD4KKyNpbmNsdWRlIDxRdENvcmUvcWRlYnVnLmg+CisjaW5jbHVkZSA8
UXRDb3JlL3FzZXQuaD4KKyNpbmNsdWRlIDxRdENvcmUvcXRpbWVyLmg+CisjaW5jbHVkZSA8UXRH
dWkvcWJpdG1hcC5oPgorI2luY2x1ZGUgPFF0R3VpL3Fjb2xvci5oPgorI2luY2x1ZGUgPFF0R3Vp
L3FncmFwaGljc2VmZmVjdC5oPgorI2luY2x1ZGUgPFF0R3VpL3FncmFwaGljc2l0ZW0uaD4KKyNp
bmNsdWRlIDxRdEd1aS9xZ3JhcGhpY3NzY2VuZS5oPgorI2luY2x1ZGUgPFF0R3VpL3FtYXRyaXg0
eDQuaD4KKyNpbmNsdWRlIDxRdEd1aS9xcGFpbnRlci5oPgorI2luY2x1ZGUgPFF0R3VpL3FwYWxl
dHRlLmg+CisjaW5jbHVkZSA8UXRHdWkvcXBpeG1hcC5oPgorI2luY2x1ZGUgPFF0R3VpL3FzdHls
ZW9wdGlvbi5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNzIEdyYXBoaWNzTGF5ZXJR
dEltcGwgOiBwdWJsaWMgUUdyYXBoaWNzT2JqZWN0IHsKKyAgICBRX09CSkVDVAorCitwdWJsaWM6
CisgICAgLy8gdGhpcyBzZXQgb2YgZmxhZ3MgaGVscCB1cyBkZWZlciB3aGljaCBwcm9wZXJ0aWVz
IG9mIHRoZSBsYXllciBoYXZlIGJlZW4KKyAgICAvLyBtb2RpZmllZCBieSB0aGUgY29tcG9zaXRv
ciwgc28gd2UgY2FuIGtub3cgd2hhdCB0byBsb29rIGZvciBpbiB0aGUgbmV4dCBmbHVzaAorICAg
IGVudW0gQ2hhbmdlRmxhZyB7CisgICAgICAgIE5vQ2hhbmdlcyA9ICAgICAgICAgICAgICAgICAw
LAorICAgICAgICBDaGlsZHJlbkNoYW5nZSA9ICAgICAgICAgICAgKDFMIDw8IDEpLAorICAgICAg
ICBNYXNrTGF5ZXJDaGFuZ2UgPSAgICAgICAgICAgKDFMIDw8IDIpLAorICAgICAgICBQb3NpdGlv
bkNoYW5nZSA9ICAgICAgICAgICAgKDFMIDw8IDMpLAorICAgICAgICBBbmNob3JQb2ludENoYW5n
ZSA9ICAgICAgICAgKDFMIDw8IDQpLAorICAgICAgICBTaXplQ2hhbmdlICA9ICAgICAgICAgICAg
ICAgKDFMIDw8IDUpLAorICAgICAgICBUcmFuc2Zvcm1DaGFuZ2UgPSAgICAgICAgICAgKDFMIDw8
IDYpLAorICAgICAgICBDb250ZW50Q2hhbmdlID0gICAgICAgICAgICAgKDFMIDw8IDcpLAorICAg
ICAgICBHZW9tZXRyeU9yaWVudGF0aW9uQ2hhbmdlID0gKDFMIDw8IDgpLAorICAgICAgICBDb250
ZW50c09yaWVudGF0aW9uQ2hhbmdlID0gKDFMIDw8IDkpLAorICAgICAgICBPcGFjaXR5Q2hhbmdl
ID0gICAgICAgICAgICAgKDFMIDw8IDEwKSwKKyAgICAgICAgQ29udGVudHNSZWN0Q2hhbmdlID0g
ICAgICAgICgxTCA8PCAxMSksCisgICAgICAgIFByZXNlcnZlczNEQ2hhbmdlID0gICAgICAgICAo
MUwgPDwgMTIpLAorICAgICAgICBNYXNrc1RvQm91bmRzQ2hhbmdlID0gICAgICAgKDFMIDw8IDEz
KSwKKyAgICAgICAgRHJhd3NDb250ZW50Q2hhbmdlID0gICAgICAgICgxTCA8PCAxNCksCisgICAg
ICAgIENvbnRlbnRzT3BhcXVlQ2hhbmdlID0gICAgICAoMUwgPDwgMTUpLAorICAgICAgICBCYWNr
ZmFjZVZpc2liaWxpdHlDaGFuZ2UgPSAgKDFMIDw8IDE2KSwKKyAgICAgICAgQ2hpbGRyZW5UcmFu
c2Zvcm1DaGFuZ2UgPSAgICgxTCA8PCAxNyksCisgICAgICAgIERpc3BsYXlDaGFuZ2UgPSAgICAg
ICAgICAgICAoMUwgPDwgMTgpLAorICAgICAgICBCYWNrZ3JvdW5kQ29sb3JDaGFuZ2UgPSAgICAg
KDFMIDw8IDE5KSwKKyAgICAgICAgUGFyZW50Q2hhbmdlID0gICAgICAgICAgICAgICgxTCA8PCAy
MCksCisgICAgICAgIERpc3RyaWJ1dGVzT3BhY2l0eUNoYW5nZSA9ICAoMUwgPDwgMjEpCisgICAg
fTsKKworICAgIC8vIHRoZSBjb21wb3NpdG9yIGxldHMgdXMgc3BlY2lhbC1jYXNlIGltYWdlcyBh
bmQgY29sb3JzLCBzbyB3ZSB0cnkgdG8gZG8gc28KKyAgICBlbnVtIFN0YXRpY0NvbnRlbnRUeXBl
IHsgSFRNTENvbnRlbnRUeXBlLCBQaXhtYXBDb250ZW50VHlwZSwgQ29sb3JDb250ZW50VHlwZX07
CisKKyAgICBHcmFwaGljc0xheWVyUXRJbXBsKEdyYXBoaWNzTGF5ZXJRdCogbmV3TGF5ZXIpOwor
ICAgIHZpcnR1YWwgfkdyYXBoaWNzTGF5ZXJRdEltcGwoKTsKKworICAgIC8vIHJlaW1wcyBmcm9t
IFFHcmFwaGljc0l0ZW0KKyAgICB2aXJ0dWFsIFFQYWludGVyUGF0aCBvcGFxdWVBcmVhKCkgY29u
c3Q7CisgICAgdmlydHVhbCBRUmVjdEYgYm91bmRpbmdSZWN0KCkgY29uc3Q7CisgICAgdmlydHVh
bCB2b2lkIHBhaW50KFFQYWludGVyKiBwYWludGVyLCBjb25zdCBRU3R5bGVPcHRpb25HcmFwaGlj
c0l0ZW0qIG9wdGlvbiwgUVdpZGdldCogd2lkZ2V0KTsKKworICAgIC8vIHdlIG1hbmFnZSB0cmFu
c2Zvcm1zIG91cnNlbHZlcyBiZWNhdXNlIHRyYW5zZm9ybS1vcmlnaW4gYWN0cyBkaWZmZXJlbnRs
eSBpbiB3ZWJraXQgYW5kIGluIFF0CisgICAgdm9pZCBzZXRCYXNlVHJhbnNmb3JtKGNvbnN0IFFU
cmFuc2Zvcm0mIHQpOworICAgIHZvaWQgZHJhd0NvbnRlbnRzKFFQYWludGVyKiBwYWludGVyLCBj
b25zdCBRUmVjdEYmIHIsIGJvb2wgbWFzayA9IGZhbHNlKTsKKworICAgIC8vIGxldCB0aGUgY29t
cG9zaXRvci1BUEkgdGVsbCB1cyB3aGljaCBwcm9wZXJ0aWVzIHdlcmUgY2hhbmdlZAorICAgIHZv
aWQgbm90aWZ5Q2hhbmdlKENoYW5nZUZsYWcgY2hhbmdlRmxhZyk7CisKKyAgICAvLyBjYWxsZWQg
d2hlbiB0aGUgY29tcG9zaXRvciBpcyByZWFkeSBmb3IgdXMgdG8gc2hvdyB0aGUgY2hhbmdlcyBv
biBzY3JlZW4KKyAgICAvLyB0aGlzIGlzIGNhbGxlZCBpbmRpcmVjdGx5IGZyb20gQ2hyb21lQ2xp
ZW50UXQ6OnNldE5lZWRzT25lU2hvdERyYXdpbmdTeW5jaHJvbml6YXRpb24KKyAgICAvLyAobWVh
bmluZyB0aGUgc3luYyB3b3VsZCBoYXBwZW4gdG9nZXRoZXIgd2l0aCB0aGUgbmV4dCBkcmF3KQor
ICAgIC8vIG9yIENocm9tZUNsaWVudFF0OjpzY2hlZHVsZUNvbXBvc2l0aW5nTGF5ZXJTeW5jICht
ZWFuaW5nIHRoZSBzeW5jIHdpbGwgaGFwcGVuIEFTQVApCisgICAgdm9pZCBmbHVzaENoYW5nZXMo
Ym9vbCByZWN1cnNpdmUgPSB0cnVlKTsKKworcHVibGljIHNsb3RzOgorICAgIC8vIHdlIG5lZWQg
dG8gbm90aWZ5IHRoZSBjbGllbnQgKGFrYSB0aGUgbGF5ZXIgY29tcG9zaXRvcikgd2hlbiB0aGUg
YW5pbWF0aW9uIGFjdHVhbGx5IHN0YXJ0cworICAgIHZvaWQgbm90aWZ5QW5pbWF0aW9uU3RhcnRl
ZCgpOworCitwdWJsaWM6CisgICAgR3JhcGhpY3NMYXllclF0KiBtX2xheWVyOworCisgICAgUVRy
YW5zZm9ybSBtX2Jhc2VUcmFuc2ZvbTsKKyAgICBib29sIG1fdHJhbnNmb3JtQW5pbWF0aW9uUnVu
bmluZzsKKyAgICBib29sIG9wYWNpdHlBbmltYXRpb25SdW5uaW5nOworCisgICAgc3RydWN0IENv
bnRlbnREYXRhIHsKKyAgICAgICAgUVBpeG1hcCBwaXhtYXA7CisgICAgICAgIFFSZWdpb24gcmVn
aW9uVG9VcGRhdGU7CisgICAgICAgIGJvb2wgdXBkYXRlQWxsOworICAgICAgICBRQ29sb3IgY29u
dGVudHNCYWNrZ3JvdW5kQ29sb3I7CisgICAgICAgIFFDb2xvciBiYWNrZ3JvdW5kQ29sb3I7Cisg
ICAgICAgIFN0YXRpY0NvbnRlbnRUeXBlIGNvbnRlbnRUeXBlOworICAgICAgICBmbG9hdCBvcGFj
aXR5OworICAgICAgICBDb250ZW50RGF0YSgpCisgICAgICAgICAgICAgICAgOiB1cGRhdGVBbGwo
ZmFsc2UpCisgICAgICAgICAgICAgICAgLCBiYWNrZ3JvdW5kQ29sb3IoUUNvbG9yKCkpCisgICAg
ICAgICAgICAgICAgLCBjb250ZW50VHlwZShIVE1MQ29udGVudFR5cGUpCisgICAgICAgICAgICAg
ICAgLCBvcGFjaXR5KDEpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgfTsKKworICAgIENv
bnRlbnREYXRhIG1fcGVuZGluZ0NvbnRlbnQ7CisgICAgQ29udGVudERhdGEgbV9jdXJyZW50Q29u
dGVudDsKKworICAgIENoYW5nZUZsYWcgbV9jaGFuZ2VNYXNrOworCisgICAgUVNpemVGIG1fc2l6
ZTsKKyAgICBRTGlzdDxRV2Vha1BvaW50ZXI8UUFic3RyYWN0QW5pbWF0aW9uPiA+IG1fYW5pbWF0
aW9uczsKKyAgICBRVGltZXIgbV9zdXNwZW5kVGltZXI7CisKKyAgICBzdHJ1Y3QgU3RhdGUgewor
ICAgICAgICBHcmFwaGljc0xheWVyKiBtYXNrTGF5ZXI7CisgICAgICAgIEZsb2F0UG9pbnQgcG9z
OworICAgICAgICBGbG9hdFBvaW50M0QgYW5jaG9yUG9pbnQ7CisgICAgICAgIEZsb2F0U2l6ZSBz
aXplOworICAgICAgICBUcmFuc2Zvcm1hdGlvbk1hdHJpeCB0cmFuc2Zvcm07CisgICAgICAgIFRy
YW5zZm9ybWF0aW9uTWF0cml4IGNoaWxkcmVuVHJhbnNmb3JtOworICAgICAgICBDb2xvciBiYWNr
Z3JvdW5kQ29sb3I7CisgICAgICAgIENvbG9yIGN1cnJlbnRDb2xvcjsKKyAgICAgICAgR3JhcGhp
Y3NMYXllcjo6Q29tcG9zaXRpbmdDb29yZGluYXRlc09yaWVudGF0aW9uIGdlb09yaWVudGF0aW9u
OworICAgICAgICBHcmFwaGljc0xheWVyOjpDb21wb3NpdGluZ0Nvb3JkaW5hdGVzT3JpZW50YXRp
b24gY29udGVudHNPcmllbnRhdGlvbjsKKyAgICAgICAgZmxvYXQgb3BhY2l0eTsKKyAgICAgICAg
UVJlY3QgY29udGVudHNSZWN0OworCisgICAgICAgIGJvb2wgcHJlc2VydmVzM0Q6IDE7CisgICAg
ICAgIGJvb2wgbWFza3NUb0JvdW5kczogMTsKKyAgICAgICAgYm9vbCBkcmF3c0NvbnRlbnQ6IDE7
CisgICAgICAgIGJvb2wgY29udGVudHNPcGFxdWU6IDE7CisgICAgICAgIGJvb2wgYmFja2ZhY2VW
aXNpYmlsaXR5OiAxOworICAgICAgICBib29sIGRpc3RyaWJ1dGVPcGFjaXR5OiAxOworICAgICAg
ICBib29sIGFsaWduOiAyOworICAgICAgICBTdGF0ZSgpIDogbWFza0xheWVyKDApLCBvcGFjaXR5
KDEpLCBwcmVzZXJ2ZXMzRChmYWxzZSksIG1hc2tzVG9Cb3VuZHMoZmFsc2UpLAorICAgICAgICAg
ICAgICAgICAgZHJhd3NDb250ZW50KGZhbHNlKSwgY29udGVudHNPcGFxdWUoZmFsc2UpLCBiYWNr
ZmFjZVZpc2liaWxpdHkoZmFsc2UpLAorICAgICAgICAgICAgICAgICAgZGlzdHJpYnV0ZU9wYWNp
dHkoZmFsc2UpCisgICAgICAgIHsKKyAgICAgICAgfQorICAgIH0gbV9zdGF0ZTsKK307CisKK0dy
YXBoaWNzTGF5ZXJRdEltcGw6OkdyYXBoaWNzTGF5ZXJRdEltcGwoR3JhcGhpY3NMYXllclF0KiBu
ZXdMYXllcikKKyAgICAgICAgOiBRR3JhcGhpY3NPYmplY3QoMCkKKyAgICAgICAgLCBtX2xheWVy
KG5ld0xheWVyKQorICAgICAgICAsIG1fdHJhbnNmb3JtQW5pbWF0aW9uUnVubmluZyhmYWxzZSkK
KyAgICAgICAgLCBtX2NoYW5nZU1hc2soTm9DaGFuZ2VzKQorCit7CisgICAgLy8gYmV0dGVyIHRv
IGNhbGN1bGF0ZSB0aGUgZXhwb3NlZCByZWN0IGluIFFHcmFwaGljc1ZpZXcgdGhhbiBvdmVyLXJl
bmRlciBpbiBXZWJDb3JlCisgICAgLy8gRklYTUU6IHRlc3QgZGlmZmVyZW50IGFwcHJvYWNoZXMK
KyAgICBzZXRGbGFnKFFHcmFwaGljc0l0ZW06Okl0ZW1Vc2VzRXh0ZW5kZWRTdHlsZU9wdGlvbiwg
dHJ1ZSk7CisKKyAgICAvLyB3ZSB1c2UgZ3JhcGhpY3MtdmlldyBmb3IgY29tcG9zaXRpbmcsIG5v
dCBmb3IgaW50ZXJhY3Rpdml0eQorICAgIHNldEFjY2VwdGVkTW91c2VCdXR0b25zKFF0OjpOb0J1
dHRvbik7CisgICAgc2V0RW5hYmxlZChmYWxzZSk7CisKKyAgICAvLyB3ZSdsbCBzZXQgdGhlIGNh
Y2hlIHdoZW4gd2Uga25vdyB3aGF0J3MgZ29pbmcgb24KKyAgICBzZXRDYWNoZU1vZGUoTm9DYWNo
ZSk7Cit9CisKK0dyYXBoaWNzTGF5ZXJRdEltcGw6On5HcmFwaGljc0xheWVyUXRJbXBsKCkKK3sK
KyAgICAvLyB0aGUgY29tcG9zaXRvciBtYW5hZ2VzIGl0ZW0gbGlmZWN5Y2xlIC0gd2UgZG9uJ3Qg
d2FudCB0aGUgZ3JhcGhpY3MtdmlldworICAgIC8vIHN5c3RlbSB0byBhdXRvbWF0aWNhbGx5IGRl
bGV0ZSBvdXIgaXRlbXMKKworICAgIGNvbnN0IFFMaXN0PFFHcmFwaGljc0l0ZW0qPiBjaGlsZHJl
biA9IGNoaWxkSXRlbXMoKTsKKyAgICBmb3IgKFFMaXN0PFFHcmFwaGljc0l0ZW0qPjo6Y29uc3Rf
aXRlcmF0b3IgaXQgPSBjaGlsZHJlbi5iZWdpbigpOyBpdCAhPSBjaGlsZHJlbi5lbmQoKTsgKytp
dCkgeworICAgICAgICBpZiAoUUdyYXBoaWNzSXRlbSogaXRlbSA9ICppdCkgeworICAgICAgICAg
ICAgaWYgKHNjZW5lKCkpCisgICAgICAgICAgICAgICAgc2NlbmUoKS0+cmVtb3ZlSXRlbShpdGVt
KTsKKyAgICAgICAgICAgIGl0ZW0tPnNldFBhcmVudEl0ZW0oMCk7CisgICAgICAgIH0KKyAgICB9
CisgICAgCisgICAgLy8gd2UgZG8sIGhvd2V2ZXIsIG93biB0aGUgYW5pbWF0aW9ucy4uLgorICAg
IGZvciAoUUxpc3Q8UVdlYWtQb2ludGVyPFFBYnN0cmFjdEFuaW1hdGlvbj4gPjo6aXRlcmF0b3Ig
aXQgPSBtX2FuaW1hdGlvbnMuYmVnaW4oKTsgaXQgIT0gbV9hbmltYXRpb25zLmVuZCgpOyArK2l0
KQorICAgICAgICBpZiAoUUFic3RyYWN0QW5pbWF0aW9uKiBhbmltID0gaXQtPmRhdGEoKSkKKyAg
ICAgICAgICAgIGRlbGV0ZSBhbmltOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJRdEltcGw6OnNl
dEJhc2VUcmFuc2Zvcm0oY29uc3QgUVRyYW5zZm9ybSYgdHJhbnNmb3JtKQoreworICAgIGlmICgh
bV9sYXllcikKKyAgICAgICAgcmV0dXJuOworICAgIC8vIHdlYmtpdCBoYXMgcmVsYXRpdmUtdG8t
c2l6ZSBvcmlnaW5Qb2ludCwgZ3JhcGhpY3MtdmlldyBoYXMgYSBwaXhlbCBvcmlnaW5Qb2ludAor
ICAgIC8vIGhlcmUgd2UgY29udmVydAorICAgIFFQb2ludEYgb3JpZ2luVHJhbnNsYXRlKAorICAg
ICAgICAgICAgbV9sYXllci0+YW5jaG9yUG9pbnQoKS54KCkgKiBtX2xheWVyLT5zaXplKCkud2lk
dGgoKSwgbV9sYXllci0+YW5jaG9yUG9pbnQoKS55KCkgKiBtX2xheWVyLT5zaXplKCkuaGVpZ2h0
KCkpOworCisgICAgcmVzZXRUcmFuc2Zvcm0oKTsKKworICAgIC8vIHdlIGhhdmUgdG8gbWFuYWdl
IHRoaXMgb3Vyc2VsdmVzIGJlY2F1c2UgUUdyYXBoaWNzVmlldydzIHRyYW5zZm9ybU9yaWdpbiBp
cyBpbmNvbXBsZXRlCisgICAgdHJhbnNsYXRlKG9yaWdpblRyYW5zbGF0ZS54KCksIG9yaWdpblRy
YW5zbGF0ZS55KCkpOworICAgIHNldFRyYW5zZm9ybSh0cmFuc2Zvcm0sIHRydWUpOworICAgIHRy
YW5zbGF0ZSgtb3JpZ2luVHJhbnNsYXRlLngoKSwgLW9yaWdpblRyYW5zbGF0ZS55KCkpOworICAg
IG1fYmFzZVRyYW5zZm9tID0gdHJhbnNmb3JtOworfQorCitRUGFpbnRlclBhdGggR3JhcGhpY3NM
YXllclF0SW1wbDo6b3BhcXVlQXJlYSgpIGNvbnN0Cit7CisgICAgUVBhaW50ZXJQYXRoIHBhaW50
ZXJQYXRoOworICAgIC8vIHdlIHRyeSBvdXQgYmVzdCB0byByZXR1cm4gdGhlIG9wYXF1ZSBhcmVh
LCBtYXliZSBpdCB3aWxsIGhlbHAgZ3JhcGhpY3MtdmlldyByZW5kZXIgbGVzcyBpdGVtcworICAg
IGlmIChtX2N1cnJlbnRDb250ZW50LmJhY2tncm91bmRDb2xvci5pc1ZhbGlkKCkgJiYgbV9jdXJy
ZW50Q29udGVudC5iYWNrZ3JvdW5kQ29sb3IuYWxwaGEoKSA9PSAweGZmKQorICAgICAgICBwYWlu
dGVyUGF0aC5hZGRSZWN0KGJvdW5kaW5nUmVjdCgpKTsKKyAgICBlbHNlIHsKKyAgICAgICAgaWYg
KG1fc3RhdGUuY29udGVudHNPcGFxdWUKKyAgICAgICAgICAgIHx8IChtX2N1cnJlbnRDb250ZW50
LmNvbnRlbnRUeXBlID09IENvbG9yQ29udGVudFR5cGUgJiYgbV9jdXJyZW50Q29udGVudC5jb250
ZW50c0JhY2tncm91bmRDb2xvci5hbHBoYSgpID09IDB4ZmYpCisgICAgICAgICAgICB8fCAobV9j
dXJyZW50Q29udGVudC5jb250ZW50VHlwZSA9PSBQaXhtYXBDb250ZW50VHlwZSAmJiAhbV9jdXJy
ZW50Q29udGVudC5waXhtYXAuaGFzQWxwaGEoKSkpIHsKKworICAgICAgICAgICAgcGFpbnRlclBh
dGguYWRkUmVjdChtX3N0YXRlLmNvbnRlbnRzUmVjdCk7CisgICAgICAgIH0KKyAgICB9CisgICAg
cmV0dXJuIHBhaW50ZXJQYXRoOworfQorCitRUmVjdEYgR3JhcGhpY3NMYXllclF0SW1wbDo6Ym91
bmRpbmdSZWN0KCkgY29uc3QKK3sKKyAgICByZXR1cm4gUVJlY3RGKFFQb2ludEYoMCwgMCksIFFT
aXplRihtX3NpemUpKTsKK30KKwordm9pZCBHcmFwaGljc0xheWVyUXRJbXBsOjpwYWludChRUGFp
bnRlciogcGFpbnRlciwgY29uc3QgUVN0eWxlT3B0aW9uR3JhcGhpY3NJdGVtKiBvcHRpb24sIFFX
aWRnZXQqIHdpZGdldCkKK3sKKyAgICBpZiAobV9zdGF0ZS5tYXNrTGF5ZXIgJiYgbV9zdGF0ZS5t
YXNrTGF5ZXItPnBsYXRmb3JtTGF5ZXIoKSkgeworICAgICAgICAvLyBGSVhNRTogc2VlIGlmIHRo
aXMgaXMgYmV0dGVyIGRvbmUgc29tZXdoZXJlIGVsc2UKKyAgICAgICAgR3JhcGhpY3NMYXllclF0
SW1wbCogb3RoZXJNYXNrID0gc3RhdGljX2Nhc3Q8R3JhcGhpY3NMYXllclF0SW1wbCo+KG1fc3Rh
dGUubWFza0xheWVyLT5wbGF0Zm9ybUxheWVyKCkpOworICAgICAgICBvdGhlck1hc2stPmZsdXNo
Q2hhbmdlcyh0cnVlKTsKKyAgICAgICAgCisgICAgICAgIC8vIENTUzMgbWFzayBhbmQgUUdyYXBo
aWNzT3BhY2l0eUVmZmVjdCBhcmUgdGhlIHNhbWUgdGhpbmchIHdlIGp1c3QgbmVlZCB0byBjb252
ZXJ0Li4uCisgICAgICAgIC8vIFRoZSBjb252ZXJzaW9uIGlzIGFzIGZhc3QgYXMgd2UgY2FuIG1h
a2UgaXQgLSB3ZSByZW5kZXIgdGhlIGxheWVyIG9uY2UgYW5kIHNlbmQgaXQgdG8gdGhlIFFHcmFw
aGljc09wYWNpdHlFZmZlY3QKKyAgICAgICAgaWYgKCFncmFwaGljc0VmZmVjdCgpKSB7CisgICAg
ICAgICAgICBRUGl4bWFwIG1hc2soUVNpemUobV9zdGF0ZS5tYXNrTGF5ZXItPnNpemUoKS53aWR0
aCgpLCBtX3N0YXRlLm1hc2tMYXllci0+c2l6ZSgpLmhlaWdodCgpKSk7CisgICAgICAgICAgICBt
YXNrLmZpbGwoUXQ6OnRyYW5zcGFyZW50KTsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAg
ICBRUGFpbnRlciBwKCZtYXNrKTsKKyAgICAgICAgICAgICAgICBwLnNldFJlbmRlckhpbnRzKHBh
aW50ZXItPnJlbmRlckhpbnRzKCksIHRydWUpOworICAgICAgICAgICAgICAgIHAuc2V0Q29tcG9z
aXRpb25Nb2RlKFFQYWludGVyOjpDb21wb3NpdGlvbk1vZGVfU291cmNlKTsKKyAgICAgICAgICAg
ICAgICBzdGF0aWNfY2FzdDxHcmFwaGljc0xheWVyUXRJbXBsKj4obV9zdGF0ZS5tYXNrTGF5ZXIt
PnBsYXRmb3JtTGF5ZXIoKSktPmRyYXdDb250ZW50cygmcCwgb3B0aW9uLT5leHBvc2VkUmVjdCwg
dHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBRR3JhcGhpY3NPcGFjaXR5RWZmZWN0
KiBvcGFjaXR5RWZmZWN0ID0gbmV3IFFHcmFwaGljc09wYWNpdHlFZmZlY3QodGhpcyk7CisgICAg
ICAgICAgICBvcGFjaXR5RWZmZWN0LT5zZXRPcGFjaXR5KDEpOworICAgICAgICAgICAgb3BhY2l0
eUVmZmVjdC0+c2V0T3BhY2l0eU1hc2soUUJydXNoKG1hc2spKTsKKyAgICAgICAgICAgIHNldEdy
YXBoaWNzRWZmZWN0KG9wYWNpdHlFZmZlY3QpOworICAgICAgICB9CisgICAgfQorICAgIGRyYXdD
b250ZW50cyhwYWludGVyLCBvcHRpb24tPmV4cG9zZWRSZWN0KTsKK30KKwordm9pZCBHcmFwaGlj
c0xheWVyUXRJbXBsOjpkcmF3Q29udGVudHMoUVBhaW50ZXIqIHBhaW50ZXIsIGNvbnN0IFFSZWN0
RiYgciwgYm9vbCBtYXNrKQoreworICAgIFFSZWN0IHJlY3QgPSByLnRvQWxpZ25lZFJlY3QoKTsK
KyAgICAKKyAgICBpZiAobV9jdXJyZW50Q29udGVudC5jb250ZW50VHlwZSAhPSBIVE1MQ29udGVu
dFR5cGUgJiYgIW1fc3RhdGUuY29udGVudHNSZWN0LmlzRW1wdHkoKSkKKyAgICAgICAgcmVjdCA9
IHJlY3QuaW50ZXJzZWN0ZWQobV9zdGF0ZS5jb250ZW50c1JlY3QpOworCisgICAgaWYgKG1fY3Vy
cmVudENvbnRlbnQuYmFja2dyb3VuZENvbG9yLmlzVmFsaWQoKSkKKyAgICAgICAgcGFpbnRlci0+
ZmlsbFJlY3QociwgUUNvbG9yKG1fY3VycmVudENvbnRlbnQuYmFja2dyb3VuZENvbG9yKSk7CisK
KyAgICBpZiAoIXJlY3QuaXNFbXB0eSgpKSB7CisgICAgICAgIHN3aXRjaCAobV9jdXJyZW50Q29u
dGVudC5jb250ZW50VHlwZSkgeworICAgICAgICBjYXNlIFBpeG1hcENvbnRlbnRUeXBlOgorICAg
ICAgICAgICAgLy8gd2UgaGF2ZSB0byBzY2FsZSB0aGUgaW1hZ2UgdG8gdGhlIGNvbnRlbnRzUmVj
dAorICAgICAgICAgICAgLy8gRklYTUU6IGEgYmV0dGVyIHdheSB3b3VsZCBwcm9iYWJseSBiZSBk
cmF3UGl4bWFwIHdpdGggYSBzcmMvdGFyZ2V0IHJlY3QKKyAgICAgICAgICAgIHBhaW50ZXItPmRy
YXdQaXhtYXAocmVjdC50b3BMZWZ0KCksIG1fY3VycmVudENvbnRlbnQucGl4bWFwLnNjYWxlZCht
X3N0YXRlLmNvbnRlbnRzUmVjdC5zaXplKCkpLCByKTsKKyAgICAgICAgICAgIGJyZWFrOworICAg
ICAgICBjYXNlIENvbG9yQ29udGVudFR5cGU6CisgICAgICAgICAgICBwYWludGVyLT5maWxsUmVj
dChyZWN0LCBtX2N1cnJlbnRDb250ZW50LmNvbnRlbnRzQmFja2dyb3VuZENvbG9yKTsKKyAgICAg
ICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgaWYgKG1fc3RhdGUu
ZHJhd3NDb250ZW50KSB7CisgICAgICAgICAgICAgICAgLy8gdGhpcyBpcyB0aGUgImV4cGVuc2l2
ZSIgYml0LiB3ZSB0cnkgdG8gbWluaW1pemUgY2FsbHMgdG8gdGhpcworICAgICAgICAgICAgICAg
IC8vIG5lY2sgb2YgdGhlIHdvb2RzIGJ5IHByb3BlciBjYWNoaW5nCisgICAgICAgICAgICAgICAg
R3JhcGhpY3NDb250ZXh0IGdjKHBhaW50ZXIpOworICAgICAgICAgICAgICAgIG1fbGF5ZXItPnBh
aW50R3JhcGhpY3NMYXllckNvbnRlbnRzKGdjLCByZWN0KTsKKyAgICAgICAgICAgIH0KKyAgICAg
ICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJR
dEltcGw6Om5vdGlmeUNoYW5nZShDaGFuZ2VGbGFnIGNoYW5nZUZsYWcpCit7CisgICAgaWYgKCF0
aGlzKQorICAgICAgICByZXR1cm47CisKKyAgICBtX2NoYW5nZU1hc2sgPSBzdGF0aWNfY2FzdDxD
aGFuZ2VGbGFnPihzdGF0aWNfY2FzdDxpbnQ+KG1fY2hhbmdlTWFzaykgfCBzdGF0aWNfY2FzdDxp
bnQ+KGNoYW5nZUZsYWcpKTsKKworICAgIGlmIChtX2xheWVyLT5jbGllbnQoKSkKKyAgICAgICAg
bV9sYXllci0+Y2xpZW50KCktPm5vdGlmeVN5bmNSZXF1aXJlZChtX2xheWVyKTsKK30KKwordm9p
ZCBHcmFwaGljc0xheWVyUXRJbXBsOjpmbHVzaENoYW5nZXMoYm9vbCByZWN1cnNpdmUpCit7Cisg
ICAgLy8gdGhpcyBpcyB0aGUgYnVsayBvZiB0aGUgd29yay4gdW5kZXJzdGFuZGluZyB3aGF0IHRo
ZSBjb21wb3NpdG9yIGlzIHRyeWluZyB0byBhY2hpZXZlLAorICAgIC8vIHdoYXQgZ3JhcGhpY3Mt
dmlldyBjYW4gZG8sIGFuZCB0cnlpbmcgdG8gZmluZCBhIHNhbmUgY29tbW9uLWdyb3VuZHMKKyAg
ICBpZiAoIW1fbGF5ZXIgfHwgbV9jaGFuZ2VNYXNrID09IE5vQ2hhbmdlcykKKyAgICAgICAgZ290
byBhZnRlckxheWVyQ2hhbmdlczsKKworICAgIGlmIChtX2N1cnJlbnRDb250ZW50LmNvbnRlbnRU
eXBlID09IEhUTUxDb250ZW50VHlwZSAmJiAobV9jaGFuZ2VNYXNrICYgUGFyZW50Q2hhbmdlKSkg
eworICAgICAgICAvLyB0aGUgV2ViQ29yZSBjb21wb3NpdG9yIG1hbmFnZXMgaXRlbSBvd25lcnNo
aXAuIFdlIGhhdmUgdG8gbWFrZSBzdXJlCisgICAgICAgIC8vIGdyYXBoaWNzLXZpZXcgZG9lc24n
dCB0cnkgdG8gc25hdGNoIHRoYXQgb3duZXJzaGlwLi4uCisgICAgICAgIGlmICghbV9sYXllci0+
cGFyZW50KCkgJiYgIXBhcmVudEl0ZW0oKSkKKyAgICAgICAgICAgIHNldFBhcmVudEl0ZW0oMCk7
CisgICAgICAgIGVsc2UgaWYgKG1fbGF5ZXIgJiYgbV9sYXllci0+cGFyZW50KCkgJiYgbV9sYXll
ci0+cGFyZW50KCktPm5hdGl2ZUxheWVyKCkgIT0gcGFyZW50SXRlbSgpKQorICAgICAgICAgICAg
c2V0UGFyZW50SXRlbShtX2xheWVyLT5wYXJlbnQoKS0+bmF0aXZlTGF5ZXIoKSk7CisgICAgfQor
CisgICAgaWYgKG1fY2hhbmdlTWFzayAmIENoaWxkcmVuQ2hhbmdlKSB7CisgICAgICAgIC8vIHdl
IGJhc2ljYWxseSBkbyBhbiBYT1Igb3BlcmF0aW9uIG9uIHRoZSBsaXN0IG9mIGN1cnJlbnQgY2hp
bGRyZW4KKyAgICAgICAgLy8gYW5kIHRoZSBsaXN0IG9mIHdhbnRlZCBjaGlsZHJlbiwgYW5kIHJl
bW92ZS9hZGQKKyAgICAgICAgUVNldDxRR3JhcGhpY3NJdGVtKj4gbmV3Q2hpbGRyZW47CisgICAg
ICAgIGNvbnN0IFZlY3RvcjxHcmFwaGljc0xheWVyKj4gbmV3Q2hpbGRyZW5WZWN0b3IgPSAobV9s
YXllci0+Y2hpbGRyZW4oKSk7CisgICAgICAgIG5ld0NoaWxkcmVuLnJlc2VydmUobmV3Q2hpbGRy
ZW5WZWN0b3Iuc2l6ZSgpKTsKKworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG5ld0No
aWxkcmVuVmVjdG9yLnNpemUoKTsgKytpKQorICAgICAgICAgICAgbmV3Q2hpbGRyZW4uaW5zZXJ0
KG5ld0NoaWxkcmVuVmVjdG9yW2ldLT5wbGF0Zm9ybUxheWVyKCkpOworCisgICAgICAgIGNvbnN0
IFFTZXQ8UUdyYXBoaWNzSXRlbSo+IGN1cnJlbnRDaGlsZHJlbiA9IGNoaWxkSXRlbXMoKS50b1Nl
dCgpOworICAgICAgICBjb25zdCBRU2V0PFFHcmFwaGljc0l0ZW0qPiBjaGlsZHJlblRvQWRkID0g
bmV3Q2hpbGRyZW4gLSBjdXJyZW50Q2hpbGRyZW47CisgICAgICAgIGNvbnN0IFFTZXQ8UUdyYXBo
aWNzSXRlbSo+IGNoaWxkcmVuVG9SZW1vdmUgPSBjdXJyZW50Q2hpbGRyZW4gLSBuZXdDaGlsZHJl
bjsKKyAgICAgICAgZm9yIChRU2V0PFFHcmFwaGljc0l0ZW0qPjo6Y29uc3RfaXRlcmF0b3IgaXQg
PSBjaGlsZHJlblRvQWRkLmJlZ2luKCk7IGl0ICE9IGNoaWxkcmVuVG9BZGQuZW5kKCk7ICsraXQp
IHsKKyAgICAgICAgICAgICBpZiAoUUdyYXBoaWNzSXRlbSogdyA9ICppdCkKKyAgICAgICAgICAg
ICAgICB3LT5zZXRQYXJlbnRJdGVtKHRoaXMpOworICAgICAgICB9CisgICAgICAgIGZvciAoUVNl
dDxRR3JhcGhpY3NJdGVtKj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gY2hpbGRyZW5Ub1JlbW92ZS5i
ZWdpbigpOyBpdCAhPSBjaGlsZHJlblRvUmVtb3ZlLmVuZCgpOyArK2l0KSB7CisgICAgICAgICAg
ICAgaWYgKFFHcmFwaGljc0l0ZW0qIHcgPSAqaXQpCisgICAgICAgICAgICAgICAgdy0+c2V0UGFy
ZW50SXRlbSgwKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGNoaWxkcmVuIGFyZSBvcmRlcmVk
IGJ5IHotdmFsdWUsIGxldCBncmFwaGljcy12aWV3IGtub3cuCisgICAgICAgIGZvciAoc2l6ZV90
IGkgPSAwOyBpIDwgbmV3Q2hpbGRyZW5WZWN0b3Iuc2l6ZSgpOyArK2kpCisgICAgICAgICAgICBp
ZiAobmV3Q2hpbGRyZW5WZWN0b3JbaV0tPnBsYXRmb3JtTGF5ZXIoKSkKKyAgICAgICAgICAgICAg
ICBuZXdDaGlsZHJlblZlY3RvcltpXS0+cGxhdGZvcm1MYXllcigpLT5zZXRaVmFsdWUoaSk7Cisg
ICAgfQorCisgICAgaWYgKG1fY2hhbmdlTWFzayAmIE1hc2tMYXllckNoYW5nZSkgeworICAgICAg
ICAvLyB3ZSBjYW4ndCBwYWludCBoZXJlLCBiZWNhdXNlIHdlIGRvbid0IGtub3cgaWYgdGhlIG1h
c2sgbGF5ZXIKKyAgICAgICAgLy8gaXRzZWxmIGlzIHJlYWR5Li4uIHdlJ2xsIGhhdmUgdG8gd2Fp
dCB0aWxsIHRoaXMgbGF5ZXIgdHJpZXMgdG8gcGFpbnQKKyAgICAgICAgc2V0R3JhcGhpY3NFZmZl
Y3QoMCk7CisgICAgICAgIGlmIChtX2xheWVyLT5tYXNrTGF5ZXIoKSkKKyAgICAgICAgICAgIHNl
dEZsYWcoSXRlbUNsaXBzQ2hpbGRyZW5Ub1NoYXBlLCB0cnVlKTsKKyAgICAgICAgZWxzZQorICAg
ICAgICAgICAgc2V0RmxhZyhJdGVtQ2xpcHNDaGlsZHJlblRvU2hhcGUsIG1fbGF5ZXItPm1hc2tz
VG9Cb3VuZHMoKSk7CisgICAgICAgIHVwZGF0ZSgpOworICAgIH0KKworICAgIGlmICgobV9jaGFu
Z2VNYXNrICYgUG9zaXRpb25DaGFuZ2UpICYmIChtX2xheWVyLT5wb3NpdGlvbigpICE9IG1fc3Rh
dGUucG9zKSkKKyAgICAgICAgc2V0UG9zKG1fbGF5ZXItPnBvc2l0aW9uKCkueCgpLCBtX2xheWVy
LT5wb3NpdGlvbigpLnkoKSk7CisKKyAgICBpZiAobV9jaGFuZ2VNYXNrICYgU2l6ZUNoYW5nZSkg
eworICAgICAgICBpZiAobV9sYXllci0+c2l6ZSgpICE9IG1fc3RhdGUuc2l6ZSkgeworICAgICAg
ICAgICAgcHJlcGFyZUdlb21ldHJ5Q2hhbmdlKCk7CisgICAgICAgICAgICBtX3NpemUgPSBRU2l6
ZUYobV9sYXllci0+c2l6ZSgpLndpZHRoKCksIG1fbGF5ZXItPnNpemUoKS5oZWlnaHQoKSk7Cisg
ICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobV9jaGFuZ2VNYXNrICYgKFRyYW5zZm9ybUNoYW5n
ZSB8IEFuY2hvclBvaW50Q2hhbmdlIHwgU2l6ZUNoYW5nZSkpIHsKKyAgICAgICAgLy8gc2luY2Ug
d2UgY29udmVydCBhIHBlcmNlbnRhZ2UtYmFzZWQgb3JpZ2luLXBvaW50IHRvIGEgcGl4ZWwtYmFz
ZWQgb25lLAorICAgICAgICAvLyB0aGUgYW5jaG9yLXBvaW50LCB0cmFuc2Zvcm0gYW5kIHNpemUg
ZnJvbSBXZWJDb3JlIGFsbCBhZmZlY3QgdGhlIG9uZQorICAgICAgICAvLyB0aGF0IHdlIGdpdmUg
UXQKKyAgICAgICAgaWYgKG1fc3RhdGUudHJhbnNmb3JtICE9IG1fbGF5ZXItPnRyYW5zZm9ybSgp
IHx8IG1fc3RhdGUuYW5jaG9yUG9pbnQgIT0gbV9sYXllci0+YW5jaG9yUG9pbnQoKSB8fCBtX3N0
YXRlLnNpemUgIT0gbV9sYXllci0+c2l6ZSgpKQorICAgICAgICAgICAgc2V0QmFzZVRyYW5zZm9y
bShRVHJhbnNmb3JtKG1fbGF5ZXItPnRyYW5zZm9ybSgpKSk7CisgICAgfQorCisgICAgaWYgKG1f
Y2hhbmdlTWFzayAmIChDb250ZW50Q2hhbmdlIHwgRHJhd3NDb250ZW50Q2hhbmdlKSkgeworICAg
ICAgICBzd2l0Y2ggKG1fcGVuZGluZ0NvbnRlbnQuY29udGVudFR5cGUpIHsKKyAgICAgICAgY2Fz
ZSBQaXhtYXBDb250ZW50VHlwZToKKyAgICAgICAgICAgIC8vIHdlIG5lZWQgY2FjaGUgZXZlbiBm
b3IgaW1hZ2VzLCBiZWNhdXNlIHRoZXkgbmVlZCB0byBiZSByZXNpemVkCisgICAgICAgICAgICAv
LyB0byB0aGUgY29udGVudHMgcmVjdC4gbWF5YmUgdGhpcyBjYW4gYmUgb3B0aW1pemVkIHRob3Vn
aAorICAgICAgICAgICAgc2V0Q2FjaGVNb2RlKG1fdHJhbnNmb3JtQW5pbWF0aW9uUnVubmluZyA/
IEl0ZW1Db29yZGluYXRlQ2FjaGUgOiBEZXZpY2VDb29yZGluYXRlQ2FjaGUpOworICAgICAgICAg
ICAgdXBkYXRlKCk7CisgICAgICAgICAgICBzZXRGbGFnKEl0ZW1IYXNOb0NvbnRlbnRzLCBmYWxz
ZSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIENvbG9yQ29udGVudFR5cGU6
CisgICAgICAgICAgICAvLyBubyBwb2ludCBpbiBjYWNoaW5nIGEgc29saWQtY29sb3IgcmVjdGFu
Z2xlCisgICAgICAgICAgICBzZXRDYWNoZU1vZGUoUUdyYXBoaWNzSXRlbTo6Tm9DYWNoZSk7Cisg
ICAgICAgICAgICBpZiAobV9wZW5kaW5nQ29udGVudC5jb250ZW50VHlwZSAhPSBtX2N1cnJlbnRD
b250ZW50LmNvbnRlbnRUeXBlIHx8IG1fcGVuZGluZ0NvbnRlbnQuY29udGVudHNCYWNrZ3JvdW5k
Q29sb3IgIT0gbV9jdXJyZW50Q29udGVudC5jb250ZW50c0JhY2tncm91bmRDb2xvcikKKyAgICAg
ICAgICAgICAgICB1cGRhdGUoKTsKKyAgICAgICAgICAgIG1fc3RhdGUuZHJhd3NDb250ZW50ID0g
ZmFsc2U7CisgICAgICAgICAgICBzZXRGbGFnKEl0ZW1IYXNOb0NvbnRlbnRzLCBmYWxzZSk7Cisg
ICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEhUTUxDb250ZW50VHlwZToKKyAgICAg
ICAgICAgIGlmIChtX3BlbmRpbmdDb250ZW50LmNvbnRlbnRUeXBlICE9IG1fY3VycmVudENvbnRl
bnQuY29udGVudFR5cGUpCisgICAgICAgICAgICAgICAgdXBkYXRlKCk7CisgICAgICAgICAgICBp
ZiAoIW1fc3RhdGUuZHJhd3NDb250ZW50ICYmIG1fbGF5ZXItPmRyYXdzQ29udGVudCgpKQorICAg
ICAgICAgICAgICAgIHVwZGF0ZSgpOworICAgICAgICAgICAgaWYgKG1fbGF5ZXItPmRyYXdzQ29u
dGVudCgpKQorICAgICAgICAgICAgICAgIHNldENhY2hlTW9kZShtX3RyYW5zZm9ybUFuaW1hdGlv
blJ1bm5pbmcgPyBJdGVtQ29vcmRpbmF0ZUNhY2hlIDogRGV2aWNlQ29vcmRpbmF0ZUNhY2hlKTsK
KyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBzZXRDYWNoZU1vZGUoTm9DYWNoZSk7
CisKKyAgICAgICAgICAgIHNldEZsYWcoSXRlbUhhc05vQ29udGVudHMsICFtX2xheWVyLT5kcmF3
c0NvbnRlbnQoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAg
IGlmICgobV9jaGFuZ2VNYXNrICYgT3BhY2l0eUNoYW5nZSkgJiYgbV9zdGF0ZS5vcGFjaXR5ICE9
IG1fbGF5ZXItPm9wYWNpdHkoKSkKKyAgICAgICAgc2V0T3BhY2l0eShtX2xheWVyLT5vcGFjaXR5
KCkpOworCisgICAgaWYgKG1fY2hhbmdlTWFzayAmIENvbnRlbnRzUmVjdENoYW5nZSkgeworICAg
ICAgICBjb25zdCBRUmVjdCByZWN0KG1fbGF5ZXItPmNvbnRlbnRzUmVjdCgpKTsKKyAgICAgICAg
aWYgKG1fc3RhdGUuY29udGVudHNSZWN0ICE9IHJlY3QpIHsKKyAgICAgICAgICAgIG1fc3RhdGUu
Y29udGVudHNSZWN0ID0gcmVjdDsKKyAgICAgICAgICAgIHVwZGF0ZSgpOworICAgICAgICB9Cisg
ICAgfQorCisgICAgaWYgKChtX2NoYW5nZU1hc2sgJiBNYXNrc1RvQm91bmRzQ2hhbmdlKQorICAg
ICAgICAmJiBtX3N0YXRlLm1hc2tzVG9Cb3VuZHMgIT0gbV9sYXllci0+bWFza3NUb0JvdW5kcygp
KSB7CisKKyAgICAgICAgc2V0RmxhZyhRR3JhcGhpY3NJdGVtOjpJdGVtQ2xpcHNUb1NoYXBlLCBt
X2xheWVyLT5tYXNrc1RvQm91bmRzKCkpOworICAgICAgICBzZXRGbGFnKFFHcmFwaGljc0l0ZW06
Okl0ZW1DbGlwc0NoaWxkcmVuVG9TaGFwZSwgbV9sYXllci0+bWFza3NUb0JvdW5kcygpKTsKKyAg
ICB9CisKKyAgICBpZiAoKG1fY2hhbmdlTWFzayAmIENvbnRlbnRzT3BhcXVlQ2hhbmdlKSAmJiBt
X3N0YXRlLmNvbnRlbnRzT3BhcXVlICE9IG1fbGF5ZXItPmNvbnRlbnRzT3BhcXVlKCkpCisgICAg
ICAgIHByZXBhcmVHZW9tZXRyeUNoYW5nZSgpOworCisgICAgaWYgKG1fY2hhbmdlTWFzayAmIERp
c3BsYXlDaGFuZ2UpCisgICAgICAgIHVwZGF0ZShtX3BlbmRpbmdDb250ZW50LnJlZ2lvblRvVXBk
YXRlLmJvdW5kaW5nUmVjdCgpKTsKKworICAgIGlmICgobV9jaGFuZ2VNYXNrICYgQmFja2dyb3Vu
ZENvbG9yQ2hhbmdlKSAmJiAobV9wZW5kaW5nQ29udGVudC5iYWNrZ3JvdW5kQ29sb3IgIT0gbV9j
dXJyZW50Q29udGVudC5iYWNrZ3JvdW5kQ29sb3IpKQorICAgICAgICB1cGRhdGUoKTsKKworICAg
IC8vIEZJWE1FOiB0aGUgZm9sbG93aW5nIGZsYWdzIGFyZSBjdXJyZW50bHkgbm90IGhhbmRsZWQs
IGFzIHRoZXkgZG9uJ3QgaGF2ZSBhIGNsZWFyIHRlc3Qgb3IgYXJlIGluIGxvdyBwcmlvcml0eQor
ICAgIC8vIEdlb21ldHJ5T3JpZW50YXRpb25DaGFuZ2UsIENvbnRlbnRzT3JpZW50YXRpb25DaGFu
Z2UsIEJhY2tmYWNlVmlzaWJpbGl0eUNoYW5nZSwgQ2hpbGRyZW5UcmFuc2Zvcm1DaGFuZ2UKKwor
ICAgIG1fc3RhdGUubWFza0xheWVyID0gbV9sYXllci0+bWFza0xheWVyKCk7CisgICAgbV9zdGF0
ZS5wb3MgPSBtX2xheWVyLT5wb3NpdGlvbigpOworICAgIG1fc3RhdGUuYW5jaG9yUG9pbnQgPSBt
X2xheWVyLT5hbmNob3JQb2ludCgpOworICAgIG1fc3RhdGUuc2l6ZSA9IG1fbGF5ZXItPnNpemUo
KTsKKyAgICBtX3N0YXRlLnRyYW5zZm9ybSA9IG1fbGF5ZXItPnRyYW5zZm9ybSgpOworICAgIG1f
c3RhdGUuZ2VvT3JpZW50YXRpb24gPSBtX2xheWVyLT5nZW9tZXRyeU9yaWVudGF0aW9uKCk7Cisg
ICAgbV9zdGF0ZS5jb250ZW50c09yaWVudGF0aW9uID1tX2xheWVyLT5jb250ZW50c09yaWVudGF0
aW9uKCk7CisgICAgbV9zdGF0ZS5vcGFjaXR5ID0gbV9sYXllci0+b3BhY2l0eSgpOworICAgIG1f
c3RhdGUuY29udGVudHNSZWN0ID0gbV9sYXllci0+Y29udGVudHNSZWN0KCk7CisgICAgbV9zdGF0
ZS5wcmVzZXJ2ZXMzRCA9IG1fbGF5ZXItPnByZXNlcnZlczNEKCk7CisgICAgbV9zdGF0ZS5tYXNr
c1RvQm91bmRzID0gbV9sYXllci0+bWFza3NUb0JvdW5kcygpOworICAgIG1fc3RhdGUuZHJhd3ND
b250ZW50ID0gbV9sYXllci0+ZHJhd3NDb250ZW50KCk7CisgICAgbV9zdGF0ZS5jb250ZW50c09w
YXF1ZSA9IG1fbGF5ZXItPmNvbnRlbnRzT3BhcXVlKCk7CisgICAgbV9zdGF0ZS5iYWNrZmFjZVZp
c2liaWxpdHkgPSBtX2xheWVyLT5iYWNrZmFjZVZpc2liaWxpdHkoKTsKKyAgICBtX2N1cnJlbnRD
b250ZW50LnBpeG1hcCA9IG1fcGVuZGluZ0NvbnRlbnQucGl4bWFwOworICAgIG1fY3VycmVudENv
bnRlbnQuY29udGVudFR5cGUgPSBtX3BlbmRpbmdDb250ZW50LmNvbnRlbnRUeXBlOworICAgIG1f
Y3VycmVudENvbnRlbnQuYmFja2dyb3VuZENvbG9yID0gbV9wZW5kaW5nQ29udGVudC5iYWNrZ3Jv
dW5kQ29sb3I7CisgICAgbV9jdXJyZW50Q29udGVudC5yZWdpb25Ub1VwZGF0ZSB8PSBtX3BlbmRp
bmdDb250ZW50LnJlZ2lvblRvVXBkYXRlOworICAgIG1fY3VycmVudENvbnRlbnQuY29udGVudHNC
YWNrZ3JvdW5kQ29sb3IgPSBtX3BlbmRpbmdDb250ZW50LmNvbnRlbnRzQmFja2dyb3VuZENvbG9y
OworICAgIG1fcGVuZGluZ0NvbnRlbnQucmVnaW9uVG9VcGRhdGUgPSBRUmVnaW9uKCk7CisgICAg
bV9jaGFuZ2VNYXNrID0gTm9DaGFuZ2VzOworCisKK2FmdGVyTGF5ZXJDaGFuZ2VzOgorICAgIGlm
ICghcmVjdXJzaXZlKQorICAgICAgICByZXR1cm47ICAgIAorCisgICAgY29uc3QgUUxpc3Q8UUdy
YXBoaWNzSXRlbSo+IGNoaWxkcmVuID0gY2hpbGRJdGVtcygpOworCisgICAgZm9yIChRTGlzdDxR
R3JhcGhpY3NJdGVtKj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gY2hpbGRyZW4uYmVnaW4oKTsgaXQg
IT0gY2hpbGRyZW4uZW5kKCk7ICsraXQpIHsKKyAgICAgICAgaWYgKFFHcmFwaGljc0l0ZW0qIGl0
ZW0gPSAqaXQpCisgICAgICAgICAgICBpZiAoR3JhcGhpY3NMYXllclF0SW1wbCogbGF5ZXIgPSBx
b2JqZWN0X2Nhc3Q8R3JhcGhpY3NMYXllclF0SW1wbCo+KGl0ZW0tPnRvR3JhcGhpY3NPYmplY3Qo
KSkpCisgICAgICAgICAgICAgICAgbGF5ZXItPmZsdXNoQ2hhbmdlcyh0cnVlKTsKKyAgICB9Cit9
CisKK3ZvaWQgR3JhcGhpY3NMYXllclF0SW1wbDo6bm90aWZ5QW5pbWF0aW9uU3RhcnRlZCgpCit7
CisgICAgLy8gV2ViQ29yZSBub3RpZmllcyBqYXZhc2NyaXB0IHdoZW4gdGhlIGFuaW1hdGlvbiBz
dGFydHMKKyAgICAvLyBoZXJlIHdlJ3JlIGxldHRpbmcgaXQga25vdworICAgIG1fbGF5ZXItPmNs
aWVudCgpLT5ub3RpZnlBbmltYXRpb25TdGFydGVkKG1fbGF5ZXIsIFdURjo6Y3VycmVudFRpbWUo
KSk7Cit9CisKK0dyYXBoaWNzTGF5ZXJRdDo6R3JhcGhpY3NMYXllclF0KEdyYXBoaWNzTGF5ZXJD
bGllbnQqIGNsaWVudCkKKyAgICAgICAgOiBHcmFwaGljc0xheWVyKGNsaWVudCkKKyAgICAgICAg
LCBtX2ltcGwoUGFzc093blB0cjxHcmFwaGljc0xheWVyUXRJbXBsPihuZXcgR3JhcGhpY3NMYXll
clF0SW1wbCh0aGlzKSkpCit7Cit9CisKK0dyYXBoaWNzTGF5ZXJRdDo6fkdyYXBoaWNzTGF5ZXJR
dCgpCit7Cit9CisKKy8vIHRoaXMgaXMgdGhlIGhvb2sgZm9yIFdlYkNvcmUgY29tcG9zaXRvciB0
byBrbm93IHRoYXQgUXQgaW1wbGVtZW50cyBjb21wb3NpdGluZyB3aXRoIEdyYXBoaWNzTGF5ZXJR
dAorUGFzc093blB0cjxHcmFwaGljc0xheWVyPiBHcmFwaGljc0xheWVyOjpjcmVhdGUoR3JhcGhp
Y3NMYXllckNsaWVudCogY2xpZW50KQoreworICAgIHJldHVybiBuZXcgR3JhcGhpY3NMYXllclF0
KGNsaWVudCk7Cit9CisKKy8vIHJlaW1wIGZyb20gR3JhcGhpY3NMYXllci5oOiBRdCBpcyB0b3At
ZG93bgorR3JhcGhpY3NMYXllcjo6Q29tcG9zaXRpbmdDb29yZGluYXRlc09yaWVudGF0aW9uIEdy
YXBoaWNzTGF5ZXI6OmNvbXBvc2l0aW5nQ29vcmRpbmF0ZXNPcmllbnRhdGlvbigpCit7CisgICAg
cmV0dXJuIENvbXBvc2l0aW5nQ29vcmRpbmF0ZXNUb3BEb3duOworfQorCisvLyByZWltcCBmcm9t
IEdyYXBoaWNzTGF5ZXIuaDogd2UnbGwgbmVlZCB0byB1cGRhdGUgdGhlIHdob2xlIGRpc3BsYXks
IGFuZCB3ZSBjYW4ndCBjb3VudCBvbiB0aGUgY3VycmVudCBzaXplIGJlY2F1c2UgaXQgbWlnaHQg
Y2hhbmdlCit2b2lkIEdyYXBoaWNzTGF5ZXJRdDo6c2V0TmVlZHNEaXNwbGF5KCkKK3sKKyAgICBt
X2ltcGwtPm1fcGVuZGluZ0NvbnRlbnQucmVnaW9uVG9VcGRhdGUgPSBRUmVnaW9uKFFSZWN0KFFQ
b2ludCgwLCAwKSwgUVNpemUoc2l6ZSgpLndpZHRoKCksIHNpemUoKS5oZWlnaHQoKSkpKTsKKyAg
ICBtX2ltcGwtPm5vdGlmeUNoYW5nZShHcmFwaGljc0xheWVyUXRJbXBsOjpEaXNwbGF5Q2hhbmdl
KTsKK30KKworLy8gcmVpbXAgZnJvbSBHcmFwaGljc0xheWVyLmgKK3ZvaWQgR3JhcGhpY3NMYXll
clF0OjpzZXROZWVkc0Rpc3BsYXlJblJlY3QoY29uc3QgRmxvYXRSZWN0JiByKQoreworICAgIG1f
aW1wbC0+bV9wZW5kaW5nQ29udGVudC5yZWdpb25Ub1VwZGF0ZXw9IFFSZWN0RihyKS50b0FsaWdu
ZWRSZWN0KCk7CisgICAgbV9pbXBsLT5ub3RpZnlDaGFuZ2UoR3JhcGhpY3NMYXllclF0SW1wbDo6
RGlzcGxheUNoYW5nZSk7Cit9CisKKy8vIHJlaW1wIGZyb20gR3JhcGhpY3NMYXllci5oCit2b2lk
IEdyYXBoaWNzTGF5ZXJRdDo6c2V0TmFtZShjb25zdCBTdHJpbmcmIG5hbWUpCit7CisgICAgbV9p
bXBsLT5zZXRPYmplY3ROYW1lKG5hbWUpOworICAgIEdyYXBoaWNzTGF5ZXI6OnNldE5hbWUobmFt
ZSk7Cit9CisKKy8vIHJlaW1wIGZyb20gR3JhcGhpY3NMYXllci5oCit2b2lkIEdyYXBoaWNzTGF5
ZXJRdDo6c2V0UGFyZW50KEdyYXBoaWNzTGF5ZXIqIGxheWVyKQoreworICAgIG1faW1wbC0+bm90
aWZ5Q2hhbmdlKEdyYXBoaWNzTGF5ZXJRdEltcGw6OlBhcmVudENoYW5nZSk7CisgICAgR3JhcGhp
Y3NMYXllcjo6c2V0UGFyZW50KGxheWVyKTsKK30KKworLy8gcmVpbXAgZnJvbSBHcmFwaGljc0xh
eWVyLmgKK2Jvb2wgR3JhcGhpY3NMYXllclF0OjpzZXRDaGlsZHJlbihjb25zdCBWZWN0b3I8R3Jh
cGhpY3NMYXllcio+JiBjaGlsZHJlbikKK3sKKyAgICBtX2ltcGwtPm5vdGlmeUNoYW5nZShHcmFw
aGljc0xheWVyUXRJbXBsOjpDaGlsZHJlbkNoYW5nZSk7CisgICAgcmV0dXJuIEdyYXBoaWNzTGF5
ZXI6OnNldENoaWxkcmVuKGNoaWxkcmVuKTsKK30KKworLy8gcmVpbXAgZnJvbSBHcmFwaGljc0xh
eWVyLmgKK3ZvaWQgR3JhcGhpY3NMYXllclF0OjphZGRDaGlsZChHcmFwaGljc0xheWVyKiBsYXll
cikKK3sKKyAgICBtX2ltcGwtPm5vdGlmeUNoYW5nZShHcmFwaGljc0xheWVyUXRJbXBsOjpDaGls
ZHJlbkNoYW5nZSk7CisgICAgR3JhcGhpY3NMYXllcjo6YWRkQ2hpbGQobGF5ZXIpOworfQorCisv
LyByZWltcCBmcm9tIEdyYXBoaWNzTGF5ZXIuaAordm9pZCBHcmFwaGljc0xheWVyUXQ6OmFkZENo
aWxkQXRJbmRleChHcmFwaGljc0xheWVyKiBsYXllciwgaW50IGluZGV4KQoreworICAgIEdyYXBo
aWNzTGF5ZXI6OmFkZENoaWxkQXRJbmRleChsYXllciwgaW5kZXgpOworICAgIG1faW1wbC0+bm90
aWZ5Q2hhbmdlKEdyYXBoaWNzTGF5ZXJRdEltcGw6OkNoaWxkcmVuQ2hhbmdlKTsKK30KKworLy8g
cmVpbXAgZnJvbSBHcmFwaGljc0xheWVyLmgKK3ZvaWQgR3JhcGhpY3NMYXllclF0OjphZGRDaGls
ZEFib3ZlKEdyYXBoaWNzTGF5ZXIqIGxheWVyLCBHcmFwaGljc0xheWVyKiBzaWJsaW5nKQorewor
ICAgICBHcmFwaGljc0xheWVyOjphZGRDaGlsZEFib3ZlKGxheWVyLCBzaWJsaW5nKTsKKyAgICAg
bV9pbXBsLT5ub3RpZnlDaGFuZ2UoR3JhcGhpY3NMYXllclF0SW1wbDo6Q2hpbGRyZW5DaGFuZ2Up
OworfQorCisvLyByZWltcCBmcm9tIEdyYXBoaWNzTGF5ZXIuaAordm9pZCBHcmFwaGljc0xheWVy
UXQ6OmFkZENoaWxkQmVsb3coR3JhcGhpY3NMYXllciogbGF5ZXIsIEdyYXBoaWNzTGF5ZXIqIHNp
YmxpbmcpCit7CisKKyAgICBHcmFwaGljc0xheWVyOjphZGRDaGlsZEJlbG93KGxheWVyLCBzaWJs
aW5nKTsKKyAgICBtX2ltcGwtPm5vdGlmeUNoYW5nZShHcmFwaGljc0xheWVyUXRJbXBsOjpDaGls
ZHJlbkNoYW5nZSk7Cit9CisKKy8vIHJlaW1wIGZyb20gR3JhcGhpY3NMYXllci5oCitib29sIEdy
YXBoaWNzTGF5ZXJRdDo6cmVwbGFjZUNoaWxkKEdyYXBoaWNzTGF5ZXIqIG9sZENoaWxkLCBHcmFw
aGljc0xheWVyKiBuZXdDaGlsZCkKK3sKKyAgICBpZiAoR3JhcGhpY3NMYXllcjo6cmVwbGFjZUNo
aWxkKG9sZENoaWxkLCBuZXdDaGlsZCkpIHsKKyAgICAgICAgbV9pbXBsLT5ub3RpZnlDaGFuZ2Uo
R3JhcGhpY3NMYXllclF0SW1wbDo6Q2hpbGRyZW5DaGFuZ2UpOworICAgICAgICByZXR1cm4gdHJ1
ZTsKKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKy8vIHJlaW1wIGZyb20gR3JhcGhp
Y3NMYXllci5oCit2b2lkIEdyYXBoaWNzTGF5ZXJRdDo6cmVtb3ZlRnJvbVBhcmVudCgpCit7Cisg
ICAgaWYgKHBhcmVudCgpKQorICAgICAgICBtX2ltcGwtPm5vdGlmeUNoYW5nZShHcmFwaGljc0xh
eWVyUXRJbXBsOjpQYXJlbnRDaGFuZ2UpOworICAgIEdyYXBoaWNzTGF5ZXI6OnJlbW92ZUZyb21Q
YXJlbnQoKTsKK30KKworLy8gcmVpbXAgZnJvbSBHcmFwaGljc0xheWVyLmgKK3ZvaWQgR3JhcGhp
Y3NMYXllclF0OjpzZXRNYXNrTGF5ZXIoR3JhcGhpY3NMYXllciogbGF5ZXIpCit7CisgICAgR3Jh
cGhpY3NMYXllcjo6c2V0TWFza0xheWVyKGxheWVyKTsKKyAgICBtX2ltcGwtPm5vdGlmeUNoYW5n
ZShHcmFwaGljc0xheWVyUXRJbXBsOjpNYXNrTGF5ZXJDaGFuZ2UpOworfQorCisvLyByZWltcCBm
cm9tIEdyYXBoaWNzTGF5ZXIuaAordm9pZCBHcmFwaGljc0xheWVyUXQ6OnNldFBvc2l0aW9uKGNv
bnN0IEZsb2F0UG9pbnQmIHApCit7CisgICAgaWYgKHBvc2l0aW9uKCkgIT0gcCkKKyAgICAgICBt
X2ltcGwtPm5vdGlmeUNoYW5nZShHcmFwaGljc0xheWVyUXRJbXBsOjpQb3NpdGlvbkNoYW5nZSk7
CisgICAgR3JhcGhpY3NMYXllcjo6c2V0UG9zaXRpb24ocCk7Cit9CisKKy8vIHJlaW1wIGZyb20g
R3JhcGhpY3NMYXllci5oCit2b2lkIEdyYXBoaWNzTGF5ZXJRdDo6c2V0QW5jaG9yUG9pbnQoY29u
c3QgRmxvYXRQb2ludDNEJiBwKQoreworICAgIGlmIChhbmNob3JQb2ludCgpICE9IHApCisgICAg
ICAgIG1faW1wbC0+bm90aWZ5Q2hhbmdlKEdyYXBoaWNzTGF5ZXJRdEltcGw6OkFuY2hvclBvaW50
Q2hhbmdlKTsKKyAgICBHcmFwaGljc0xheWVyOjpzZXRBbmNob3JQb2ludChwKTsKK30KKworLy8g
cmVpbXAgZnJvbSBHcmFwaGljc0xheWVyLmgKK3ZvaWQgR3JhcGhpY3NMYXllclF0OjpzZXRTaXpl
KGNvbnN0IEZsb2F0U2l6ZSYgc2l6ZSkKK3sKKyAgICBpZiAodGhpcy0+c2l6ZSgpICE9IHNpemUp
CisgICAgICAgIG1faW1wbC0+bm90aWZ5Q2hhbmdlKEdyYXBoaWNzTGF5ZXJRdEltcGw6OlNpemVD
aGFuZ2UpOworICAgIEdyYXBoaWNzTGF5ZXI6OnNldFNpemUoc2l6ZSk7Cit9CisKKy8vIHJlaW1w
IGZyb20gR3JhcGhpY3NMYXllci5oCit2b2lkIEdyYXBoaWNzTGF5ZXJRdDo6c2V0VHJhbnNmb3Jt
KGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4JiB0KQoreworICAgIGlmICghbV9pbXBsLT5tX3Ry
YW5zZm9ybUFuaW1hdGlvblJ1bm5pbmcgJiYgdHJhbnNmb3JtKCkgIT0gdCkKKyAgICAgICBtX2lt
cGwtPm5vdGlmeUNoYW5nZShHcmFwaGljc0xheWVyUXRJbXBsOjpUcmFuc2Zvcm1DaGFuZ2UpOwor
ICAgIEdyYXBoaWNzTGF5ZXI6OnNldFRyYW5zZm9ybSh0KTsKK30KKworLy8gcmVpbXAgZnJvbSBH
cmFwaGljc0xheWVyLmgKK3ZvaWQgR3JhcGhpY3NMYXllclF0OjpzZXRDaGlsZHJlblRyYW5zZm9y
bShjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYgdCkKK3sKKyAgICBHcmFwaGljc0xheWVyOjpz
ZXRDaGlsZHJlblRyYW5zZm9ybSh0KTsKKyAgICBtX2ltcGwtPm5vdGlmeUNoYW5nZShHcmFwaGlj
c0xheWVyUXRJbXBsOjpDaGlsZHJlblRyYW5zZm9ybUNoYW5nZSk7Cit9CisKKy8vIHJlaW1wIGZy
b20gR3JhcGhpY3NMYXllci5oCit2b2lkIEdyYXBoaWNzTGF5ZXJRdDo6c2V0UHJlc2VydmVzM0Qo
Ym9vbCBiKQoreworICAgIGlmIChiICE9IHByZXNlcnZlczNEKCkpOworICAgICAgIG1faW1wbC0+
bm90aWZ5Q2hhbmdlKEdyYXBoaWNzTGF5ZXJRdEltcGw6OlByZXNlcnZlczNEQ2hhbmdlKTsKKyAg
ICBHcmFwaGljc0xheWVyOjpzZXRQcmVzZXJ2ZXMzRChiKTsKK30KKworLy8gcmVpbXAgZnJvbSBH
cmFwaGljc0xheWVyLmgKK3ZvaWQgR3JhcGhpY3NMYXllclF0OjpzZXRNYXNrc1RvQm91bmRzKGJv
b2wgYikKK3sKKyAgICBHcmFwaGljc0xheWVyOjpzZXRNYXNrc1RvQm91bmRzKGIpOworICAgIG1f
aW1wbC0+bm90aWZ5Q2hhbmdlKEdyYXBoaWNzTGF5ZXJRdEltcGw6Ok1hc2tzVG9Cb3VuZHNDaGFu
Z2UpOworfQorCisvLyByZWltcCBmcm9tIEdyYXBoaWNzTGF5ZXIuaAordm9pZCBHcmFwaGljc0xh
eWVyUXQ6OnNldERyYXdzQ29udGVudChib29sIGIpCit7CisgICAgbV9pbXBsLT5ub3RpZnlDaGFu
Z2UoR3JhcGhpY3NMYXllclF0SW1wbDo6RHJhd3NDb250ZW50Q2hhbmdlKTsKKyAgICBHcmFwaGlj
c0xheWVyOjpzZXREcmF3c0NvbnRlbnQoYik7Cit9CisKKy8vIHJlaW1wIGZyb20gR3JhcGhpY3NM
YXllci5oCit2b2lkIEdyYXBoaWNzTGF5ZXJRdDo6c2V0QmFja2dyb3VuZENvbG9yKGNvbnN0IENv
bG9yJiBjKQoreworICAgIG1faW1wbC0+bm90aWZ5Q2hhbmdlKEdyYXBoaWNzTGF5ZXJRdEltcGw6
OkJhY2tncm91bmRDb2xvckNoYW5nZSk7CisgICAgbV9pbXBsLT5tX3BlbmRpbmdDb250ZW50LmJh
Y2tncm91bmRDb2xvciA9IGM7CisgICAgR3JhcGhpY3NMYXllcjo6c2V0QmFja2dyb3VuZENvbG9y
KGMpOworfQorCisvLyByZWltcCBmcm9tIEdyYXBoaWNzTGF5ZXIuaAordm9pZCBHcmFwaGljc0xh
eWVyUXQ6OmNsZWFyQmFja2dyb3VuZENvbG9yKCkKK3sKKyAgICBtX2ltcGwtPm1fcGVuZGluZ0Nv
bnRlbnQuYmFja2dyb3VuZENvbG9yID0gUUNvbG9yKCk7CisgICAgbV9pbXBsLT5ub3RpZnlDaGFu
Z2UoR3JhcGhpY3NMYXllclF0SW1wbDo6QmFja2dyb3VuZENvbG9yQ2hhbmdlKTsKKyAgICBHcmFw
aGljc0xheWVyOjpjbGVhckJhY2tncm91bmRDb2xvcigpOworfQorCisvLyByZWltcCBmcm9tIEdy
YXBoaWNzTGF5ZXIuaAordm9pZCBHcmFwaGljc0xheWVyUXQ6OnNldENvbnRlbnRzT3BhcXVlKGJv
b2wgYikKK3sKKyAgICBtX2ltcGwtPm5vdGlmeUNoYW5nZShHcmFwaGljc0xheWVyUXRJbXBsOjpD
b250ZW50c09wYXF1ZUNoYW5nZSk7CisgICAgR3JhcGhpY3NMYXllcjo6c2V0Q29udGVudHNPcGFx
dWUoYik7Cit9CisKKy8vIHJlaW1wIGZyb20gR3JhcGhpY3NMYXllci5oCit2b2lkIEdyYXBoaWNz
TGF5ZXJRdDo6c2V0QmFja2ZhY2VWaXNpYmlsaXR5KGJvb2wgYikKK3sKKyAgICBtX2ltcGwtPm5v
dGlmeUNoYW5nZShHcmFwaGljc0xheWVyUXRJbXBsOjpCYWNrZmFjZVZpc2liaWxpdHlDaGFuZ2Up
OworICAgIEdyYXBoaWNzTGF5ZXI6OnNldEJhY2tmYWNlVmlzaWJpbGl0eShiKTsKK30KKworLy8g
cmVpbXAgZnJvbSBHcmFwaGljc0xheWVyLmgKK3ZvaWQgR3JhcGhpY3NMYXllclF0OjpzZXRPcGFj
aXR5KGZsb2F0IG8pCit7CisgICAgaWYgKCFtX2ltcGwtPm9wYWNpdHlBbmltYXRpb25SdW5uaW5n
ICYmIG9wYWNpdHkoKSAhPSBvKQorICAgICAgIG1faW1wbC0+bm90aWZ5Q2hhbmdlKEdyYXBoaWNz
TGF5ZXJRdEltcGw6Ok9wYWNpdHlDaGFuZ2UpOworICAgIEdyYXBoaWNzTGF5ZXI6OnNldE9wYWNp
dHkobyk7Cit9CisKKy8vIHJlaW1wIGZyb20gR3JhcGhpY3NMYXllci5oCit2b2lkIEdyYXBoaWNz
TGF5ZXJRdDo6c2V0Q29udGVudHNSZWN0KGNvbnN0IEludFJlY3QmIHIpCit7CisgICAgbV9pbXBs
LT5ub3RpZnlDaGFuZ2UoR3JhcGhpY3NMYXllclF0SW1wbDo6Q29udGVudHNSZWN0Q2hhbmdlKTsK
KyAgICBHcmFwaGljc0xheWVyOjpzZXRDb250ZW50c1JlY3Qocik7Cit9CisKKy8vIHJlaW1wIGZy
b20gR3JhcGhpY3NMYXllci5oCit2b2lkIEdyYXBoaWNzTGF5ZXJRdDo6c2V0Q29udGVudHNUb0lt
YWdlKEltYWdlKiBpbWFnZSkKK3sKKyAgICBtX2ltcGwtPm5vdGlmeUNoYW5nZShHcmFwaGljc0xh
eWVyUXRJbXBsOjpDb250ZW50Q2hhbmdlKTsKKyAgICBtX2ltcGwtPm1fcGVuZGluZ0NvbnRlbnQu
Y29udGVudFR5cGUgPSBHcmFwaGljc0xheWVyUXRJbXBsOjpIVE1MQ29udGVudFR5cGU7CisgICAg
R3JhcGhpY3NMYXllcjo6c2V0Q29udGVudHNUb0ltYWdlKGltYWdlKTsKKyAgICBpZiAoaW1hZ2Up
IHsKKyAgICAgICAgUVBpeG1hcCogcHhtID0gaW1hZ2UtPm5hdGl2ZUltYWdlRm9yQ3VycmVudEZy
YW1lKCk7CisgICAgICAgIGlmIChweG0pIHsKKyAgICAgICAgICAgIG1faW1wbC0+bV9wZW5kaW5n
Q29udGVudC5waXhtYXAgPSAqcHhtOworICAgICAgICAgICAgbV9pbXBsLT5tX3BlbmRpbmdDb250
ZW50LmNvbnRlbnRUeXBlID0gR3JhcGhpY3NMYXllclF0SW1wbDo6UGl4bWFwQ29udGVudFR5cGU7
CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gICAgICAgIAorICAgIH0KKyAgICBtX2lt
cGwtPm1fcGVuZGluZ0NvbnRlbnQucGl4bWFwID0gUVBpeG1hcCgpOworfQorCisvLyByZWltcCBm
cm9tIEdyYXBoaWNzTGF5ZXIuaAordm9pZCBHcmFwaGljc0xheWVyUXQ6OnNldENvbnRlbnRzQmFj
a2dyb3VuZENvbG9yKGNvbnN0IENvbG9yJiBjb2xvcikKK3sKKyAgICBtX2ltcGwtPm5vdGlmeUNo
YW5nZShHcmFwaGljc0xheWVyUXRJbXBsOjpDb250ZW50Q2hhbmdlKTsKKyAgICBtX2ltcGwtPm1f
cGVuZGluZ0NvbnRlbnQuY29udGVudFR5cGUgPSBHcmFwaGljc0xheWVyUXRJbXBsOjpDb2xvckNv
bnRlbnRUeXBlOworICAgIG1faW1wbC0+bV9wZW5kaW5nQ29udGVudC5jb250ZW50c0JhY2tncm91
bmRDb2xvciA9IFFDb2xvcihjb2xvcik7CisgICAgR3JhcGhpY3NMYXllcjo6c2V0Q29udGVudHNC
YWNrZ3JvdW5kQ29sb3IoY29sb3IpOworfQorCisvLyByZWltcCBmcm9tIEdyYXBoaWNzTGF5ZXIu
aAordm9pZCBHcmFwaGljc0xheWVyUXQ6OnNldEdlb21ldHJ5T3JpZW50YXRpb24oQ29tcG9zaXRp
bmdDb29yZGluYXRlc09yaWVudGF0aW9uIG9yaWVudGF0aW9uKQoreworICAgIG1faW1wbC0+bm90
aWZ5Q2hhbmdlKEdyYXBoaWNzTGF5ZXJRdEltcGw6Okdlb21ldHJ5T3JpZW50YXRpb25DaGFuZ2Up
OworICAgIEdyYXBoaWNzTGF5ZXI6OnNldEdlb21ldHJ5T3JpZW50YXRpb24ob3JpZW50YXRpb24p
OworfQorCisvLyByZWltcCBmcm9tIEdyYXBoaWNzTGF5ZXIuaAordm9pZCBHcmFwaGljc0xheWVy
UXQ6OnNldENvbnRlbnRzT3JpZW50YXRpb24oQ29tcG9zaXRpbmdDb29yZGluYXRlc09yaWVudGF0
aW9uIG9yaWVudGF0aW9uKQoreworICAgIG1faW1wbC0+bm90aWZ5Q2hhbmdlKEdyYXBoaWNzTGF5
ZXJRdEltcGw6OkNvbnRlbnRzT3JpZW50YXRpb25DaGFuZ2UpOworICAgIEdyYXBoaWNzTGF5ZXI6
OnNldENvbnRlbnRzT3JpZW50YXRpb24ob3JpZW50YXRpb24pOworfQorCisvLyByZWltcCBmcm9t
IEdyYXBoaWNzTGF5ZXIuaAordm9pZCBHcmFwaGljc0xheWVyUXQ6OmRpc3RyaWJ1dGVPcGFjaXR5
KGZsb2F0IG8pCit7CisgICAgbV9pbXBsLT5ub3RpZnlDaGFuZ2UoR3JhcGhpY3NMYXllclF0SW1w
bDo6T3BhY2l0eUNoYW5nZSk7CisgICAgbV9pbXBsLT5tX3N0YXRlLmRpc3RyaWJ1dGVPcGFjaXR5
ID0gdHJ1ZTsKK30KKworLy8gcmVpbXAgZnJvbSBHcmFwaGljc0xheWVyLmgKK2Zsb2F0IEdyYXBo
aWNzTGF5ZXJRdDo6YWNjdW11bGF0ZWRPcGFjaXR5KCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9p
bXBsLT5lZmZlY3RpdmVPcGFjaXR5KCk7Cit9CisKKy8vIHJlaW1wIGZyb20gR3JhcGhpY3NMYXll
ci5oCit2b2lkIEdyYXBoaWNzTGF5ZXJRdDo6c3luY0NvbXBvc2l0aW5nU3RhdGUoKQoreworICAg
IG1faW1wbC0+Zmx1c2hDaGFuZ2VzKCk7CisgICAgR3JhcGhpY3NMYXllcjo6c3luY0NvbXBvc2l0
aW5nU3RhdGUoKTsKK30KKworLy8gcmVpbXAgZnJvbSBHcmFwaGljc0xheWVyLmgKK05hdGl2ZUxh
eWVyIEdyYXBoaWNzTGF5ZXJRdDo6bmF0aXZlTGF5ZXIoKSBjb25zdAoreworICAgIHJldHVybiBt
X2ltcGwuZ2V0KCk7Cit9CisKKy8vIHJlaW1wIGZyb20gR3JhcGhpY3NMYXllci5oCitQbGF0Zm9y
bUxheWVyKiBHcmFwaGljc0xheWVyUXQ6OnBsYXRmb3JtTGF5ZXIoKSBjb25zdAoreworICAgIHJl
dHVybiBtX2ltcGwuZ2V0KCk7Cit9CisKKy8vIG5vdyB3ZSBzdGFydCBkZWFsaW5nIHdpdGggV2Vi
Q29yZSBhbmltYXRpb25zIHRyYW5zbGF0ZWQgdG8gUXQgYW5pbWF0aW9ucworCit0ZW1wbGF0ZSA8
dHlwZW5hbWUgVD4KK3N0cnVjdCBLZXlmcmFtZVZhbHVlUXQgeworICAgIFRpbWluZ0Z1bmN0aW9u
IHRpbWluZ0Z1bmN0aW9uOworICAgIFQgdmFsdWU7Cit9OworCisvLyB3ZSBjb3B5IHRoaXMgZnJv
bSB0aGUgQW5pbWF0aW9uQmFzZS5jcHAKK3N0YXRpYyBpbmxpbmUgZG91YmxlIHNvbHZlRXBzaWxv
bihkb3VibGUgZHVyYXRpb24pCit7CisgICAgcmV0dXJuIDEuMCAvICgyMDAuMCAqIGR1cmF0aW9u
KTsKK30KKworc3RhdGljIGlubGluZSBkb3VibGUgc29sdmVDdWJpY0JlemllckZ1bmN0aW9uKHFy
ZWFsIHAxeCwgcXJlYWwgcDF5LCBxcmVhbCBwMngsIHFyZWFsIHAyeSwgZG91YmxlIHQsIGRvdWJs
ZSBkdXJhdGlvbikKK3sKKyAgICBVbml0QmV6aWVyIGJlemllcihwMXgsIHAxeSwgcDJ4LCBwMnkp
OworICAgIHJldHVybiBiZXppZXIuc29sdmUodCwgc29sdmVFcHNpbG9uKGR1cmF0aW9uKSk7Cit9
CisKKy8vIHdlIHdhbnQgdGhlIHRpbWluZyBmdW5jdGlvbiB0byBiZSBhcyBjbG9zZSBhcyBwb3Nz
aWJsZSB0byB3aGF0IHRoZSB3ZWItZGV2ZWxvcGVyIGludGVuZGVkLCBzbyB3ZSdyZSB1c2luZyB0
aGUgc2FtZSBmdW5jdGlvbiB1c2VkIGJ5IFdlYkNvcmUgd2hlbiBjb21wb3NpdGluZyBpcyBkaXNh
YmxlZAorLy8gVXNpbmcgZWFzaW5nLWN1cnZlcyB3b3VsZCBwcm9iYWJseSB3b3JrIGZvciBzb21l
IG9mIHRoZSBjYXNlcywgYnV0IHdvdWxkbid0IHJlYWxseSBidXkgdXMgYW55dGhpbmcgYXMgd2Un
ZCBoYXZlIHRvIGNvbnZlcnQgdGhlIGJlemllciBmdW5jdGlvbiBiYWNrIHRvIGFuIGVhc2luZyBj
dXJ2ZQorc3RhdGljIGlubGluZSBxcmVhbCBhcHBseVRpbWluZ0Z1bmN0aW9uKGNvbnN0IFRpbWlu
Z0Z1bmN0aW9uJiB0aW1pbmdGdW5jdGlvbiwgcXJlYWwgcHJvZ3Jlc3MsIGludCBkdXJhdGlvbikK
K3sKKyAgICAgICAgaWYgKHRpbWluZ0Z1bmN0aW9uLnR5cGUoKSA9PSBMaW5lYXJUaW1pbmdGdW5j
dGlvbikKKyAgICAgICAgICAgIHJldHVybiBwcm9ncmVzczsKKyAgICAgICAgaWYgKHRpbWluZ0Z1
bmN0aW9uLnR5cGUoKSA9PSBDdWJpY0JlemllclRpbWluZ0Z1bmN0aW9uKSB7CisgICAgICAgICAg
ICByZXR1cm4gc29sdmVDdWJpY0JlemllckZ1bmN0aW9uKHRpbWluZ0Z1bmN0aW9uLngxKCksCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWluZ0Z1bmN0aW9u
LnkxKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWlu
Z0Z1bmN0aW9uLngyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIHRpbWluZ0Z1bmN0aW9uLnkyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGRvdWJsZShwcm9ncmVzcyksIGRvdWJsZShkdXJhdGlvbikgLyAxMDAwKTsK
KyAgICAgICAgfQorICAgICAgICByZXR1cm4gcHJvZ3Jlc3M7Cit9CisKKy8vIGhlbHBlciBmdW5j
dGlvbnMgdG8gc2FmZWx5IGdldCBhIHZhbHVlIG91dCBvZiBXZWJDb3JlJ3MgQW5pbWF0aW9uVmFs
dWUqCitzdGF0aWMgdm9pZCB3ZWJraXRBbmltYXRpb25Ub1F0QW5pbWF0aW9uVmFsdWUoY29uc3Qg
QW5pbWF0aW9uVmFsdWUqIGFuaW1hdGlvblZhbHVlLCBUcmFuc2Zvcm1PcGVyYXRpb25zJiB0cmFu
c2Zvcm1PcGVyYXRpb25zKQoreworICAgIHRyYW5zZm9ybU9wZXJhdGlvbnMgPSBUcmFuc2Zvcm1P
cGVyYXRpb25zKCk7CisgICAgaWYgKCFhbmltYXRpb25WYWx1ZSkKKyAgICAgICAgcmV0dXJuOwor
CisgICAgY29uc3QgVHJhbnNmb3JtT3BlcmF0aW9ucyogb3BzID0gc3RhdGljX2Nhc3Q8Y29uc3Qg
VHJhbnNmb3JtQW5pbWF0aW9uVmFsdWUqPihhbmltYXRpb25WYWx1ZSktPnZhbHVlKCk7CisKKyAg
ICBpZiAob3BzKQorICAgICAgICB0cmFuc2Zvcm1PcGVyYXRpb25zID0gKm9wczsKK30KKworc3Rh
dGljIHZvaWQgd2Via2l0QW5pbWF0aW9uVG9RdEFuaW1hdGlvblZhbHVlKGNvbnN0IEFuaW1hdGlv
blZhbHVlKiBhbmltYXRpb25WYWx1ZSwgcXJlYWwmIHJlYWxWYWx1ZSkKK3sKKyAgICByZWFsVmFs
dWUgPSBhbmltYXRpb25WYWx1ZSA/IHN0YXRpY19jYXN0PGNvbnN0IEZsb2F0QW5pbWF0aW9uVmFs
dWUqPihhbmltYXRpb25WYWx1ZSktPnZhbHVlKCkgOiAwOworfQorCisvLyB3ZSBwdXQgYSBiaXQg
b2YgdGhlIGZ1bmN0aW9uYWxpdHkgaW4gYSBiYXNlIGNsYXNzIHRvIGFsbG93IGNhc3RpbmcgYW5k
IHRvIHNhdmUgc29tZSBjb2RlIHNpemUKK2NsYXNzIEFuaW1hdGlvblF0QmFzZSA6IHB1YmxpYyBR
QWJzdHJhY3RBbmltYXRpb24geworcHVibGljOgorICAgIEFuaW1hdGlvblF0QmFzZShHcmFwaGlj
c0xheWVyUXRJbXBsKiBsYXllciwgY29uc3QgS2V5ZnJhbWVWYWx1ZUxpc3QmIHZhbHVlcywgY29u
c3QgSW50U2l6ZSYgYm94U2l6ZSwgY29uc3QgQW5pbWF0aW9uKiBhbmltLCBjb25zdCBRU3RyaW5n
ICYgbmFtZSkKKyAgICAgICAgICAgIDogUUFic3RyYWN0QW5pbWF0aW9uKDApCisgICAgICAgICAg
ICAsIG1fbGF5ZXIobGF5ZXIpCisgICAgICAgICAgICAsIG1fYm94U2l6ZShib3hTaXplKQorICAg
ICAgICAgICAgLCBtX2R1cmF0aW9uKGFuaW0tPmR1cmF0aW9uKCkgKiAxMDAwKQorICAgICAgICAg
ICAgLCBtX2lzQWx0ZXJuYXRlKGFuaW0tPmRpcmVjdGlvbigpID09IEFuaW1hdGlvbjo6QW5pbWF0
aW9uRGlyZWN0aW9uQWx0ZXJuYXRlKQorICAgICAgICAgICAgLCBtX3dlYmtpdFByb3BlcnR5SUQo
dmFsdWVzLnByb3BlcnR5KCkpCisgICAgICAgICAgICAsIG1fa2V5ZnJhbWVzTmFtZShuYW1lKQor
ICAgIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlU3RhdGUoUUFic3RyYWN0QW5p
bWF0aW9uOjpTdGF0ZSBuZXdTdGF0ZSwgUUFic3RyYWN0QW5pbWF0aW9uOjpTdGF0ZSBvbGRTdGF0
ZSkKKyAgICB7CisgICAgICAgIFFBYnN0cmFjdEFuaW1hdGlvbjo6dXBkYXRlU3RhdGUobmV3U3Rh
dGUsIG9sZFN0YXRlKTsKKworICAgICAgICAvLyBmb3Igc29tZSByZWFzb24gSSBoYXZlIGRvIHRo
aXMgYXN5bmNocm9ub3VzbHkgLSBvciB0aGUgYW5pbWF0aW9uIHdvbid0IHdvcmsKKyAgICAgICAg
aWYgKG5ld1N0YXRlID09IFJ1bm5pbmcgJiYgb2xkU3RhdGUgPT0gU3RvcHBlZCkKKyAgICAgICAg
ICAgIFFUaW1lcjo6c2luZ2xlU2hvdCgwLCBtX2xheWVyLmRhdGEoKSwgU0xPVChub3RpZnlBbmlt
YXRpb25TdGFydGVkKCkpKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGludCBkdXJhdGlvbigpIGNv
bnN0IHsgcmV0dXJuIG1fZHVyYXRpb247IH0KKworICAgIFFXZWFrUG9pbnRlcjxHcmFwaGljc0xh
eWVyUXRJbXBsPiBtX2xheWVyOworICAgIEludFNpemUgbV9ib3hTaXplOworICAgIGludCBtX2R1
cmF0aW9uOworICAgIGJvb2wgbV9pc0FsdGVybmF0ZTsKKyAgICBBbmltYXRlZFByb3BlcnR5SUQg
bV93ZWJraXRQcm9wZXJ0eUlEOworICAgIFFTdHJpbmcgbV9rZXlmcmFtZXNOYW1lOworfTsKKwor
Ly8gd2UnZCByYXRoZXIgaGF2ZSBhIHRlbXBsYXRpemVkIFFBYnN0cmFjdEFuaW1hdGlvbiB0aGFu
IFFQcm9wZXJ0eUFuaW1hdGlvbiAvIFFWYXJpYW50QW5pbWF0aW9uOworLy8gU2luY2Ugd2Uga25v
dyB0aGUgdHlwZXMgdGhhdCB3ZSdyZSBkZWFsaW5nIHdpdGgsIHRoZSBRT2JqZWN0L1FQcm9wZXJ0
eS9RVmFyaWFudCBhYnN0cmFjdGlvbgorLy8gYnV5cyB1cyB2ZXJ5IGxpdHRsZSBpbiB0aGlzIGNh
c2UsIGZvciB0b28gbXVjaCBvdmVyaGVhZAordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBB
bmltYXRpb25RdCA6IHB1YmxpYyBBbmltYXRpb25RdEJhc2UgeworCitwdWJsaWM6CisgICAgQW5p
bWF0aW9uUXQoR3JhcGhpY3NMYXllclF0SW1wbCogbGF5ZXIsIGNvbnN0IEtleWZyYW1lVmFsdWVM
aXN0JiB2YWx1ZXMsIGNvbnN0IEludFNpemUmIGJveFNpemUsIGNvbnN0IEFuaW1hdGlvbiogYW5p
bSwgY29uc3QgUVN0cmluZyAmIG5hbWUpCisgICAgICAgICAgICA6QW5pbWF0aW9uUXRCYXNlKGxh
eWVyLCB2YWx1ZXMsIGJveFNpemUsIGFuaW0sIG5hbWUpCisgICAgeworICAgICAgICAvLyBjb3B5
aW5nIHRob3NlIFdlYkNvcmUgc3RydWN0dXJlcyBpcyBub3QgdHJpdmlhbCwgd2UgaGF2ZSB0byBk
byBpdCBsaWtlIHRoaXMKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB2YWx1ZXMuc2l6
ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIGNvbnN0IEFuaW1hdGlvblZhbHVlKiBhbmltYXRpb25W
YWx1ZSA9IHZhbHVlcy5hdChpKTsKKyAgICAgICAgICAgIEtleWZyYW1lVmFsdWVRdDxUPiBrZXlm
cmFtZVZhbHVlOworICAgICAgICAgICAgaWYgKGFuaW1hdGlvblZhbHVlLT50aW1pbmdGdW5jdGlv
bigpKQorICAgICAgICAgICAgICAgIGtleWZyYW1lVmFsdWUudGltaW5nRnVuY3Rpb24gPSAqYW5p
bWF0aW9uVmFsdWUtPnRpbWluZ0Z1bmN0aW9uKCk7CisgICAgICAgICAgICB3ZWJraXRBbmltYXRp
b25Ub1F0QW5pbWF0aW9uVmFsdWUoYW5pbWF0aW9uVmFsdWUsIGtleWZyYW1lVmFsdWUudmFsdWUp
OworICAgICAgICAgICAga2V5ZnJhbWVWYWx1ZXNbYW5pbWF0aW9uVmFsdWUtPmtleVRpbWUoKV0g
PSBrZXlmcmFtZVZhbHVlOworICAgICAgICB9CisgICAgfQorCitwcm90ZWN0ZWQ6CisKKyAgICAv
LyB0aGlzIGlzIHRoZSBwYXJ0IHRoYXQgZGlmZmVycyBiZXR3ZWVuIGFuaW1hdGVkIHByb3BlcnRp
ZXMKKyAgICB2aXJ0dWFsIHZvaWQgYXBwbHlGcmFtZShjb25zdCBUJiBmcm9tVmFsdWUsIGNvbnN0
IFQmIHRvVmFsdWUsIHFyZWFsIHByb2dyZXNzKSA9IDA7CisKKyAgICB2aXJ0dWFsIHZvaWQgdXBk
YXRlQ3VycmVudFRpbWUoaW50IGN1cnJlbnRUaW1lKQorICAgIHsKKyAgICAgICAgaWYgKCFtX2xh
eWVyKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIHFyZWFsIHByb2dyZXNzID0gcXJl
YWwoY3VycmVudExvb3BUaW1lKCkpIC8gZHVyYXRpb24oKTsKKworICAgICAgICBpZiAobV9pc0Fs
dGVybmF0ZSAmJiBjdXJyZW50TG9vcCgpJTIpCisgICAgICAgICAgICBwcm9ncmVzcyA9IDEtcHJv
Z3Jlc3M7CisKKyAgICAgICAgaWYgKGtleWZyYW1lVmFsdWVzLmlzRW1wdHkoKSkKKyAgICAgICAg
ICAgIHJldHVybjsKKworICAgICAgICAvLyB3ZSBmaW5kIHRoZSBjdXJyZW50IGZyb20tdG8ga2V5
ZnJhbWVzIGluIG91ciBsaXR0bGUgbWFwCisgICAgICAgIHR5cGVuYW1lIFFNYXA8cXJlYWwsIEtl
eWZyYW1lVmFsdWVRdDxUPiA+OjppdGVyYXRvciBpdCA9IGtleWZyYW1lVmFsdWVzLmZpbmQocHJv
Z3Jlc3MpOworCisgICAgICAgIC8vIHdlIGRpZG4ndCBmaW5kIGFuIGV4YWN0IG1hdGNoLCB3ZSB0
cnkgdGhlIGNsb3Nlc3QgbWF0Y2ggKGxvd2VyIGJvdW5kKQorICAgICAgICBpZiAoaXQgPT0ga2V5
ZnJhbWVWYWx1ZXMuZW5kKCkpCisgICAgICAgICAgICBpdCA9IGtleWZyYW1lVmFsdWVzLmxvd2Vy
Qm91bmQocHJvZ3Jlc3MpLTE7CisKKyAgICAgICAgLy8gd2UgZGlkbid0IGZpbmQgYW55IG1hdGNo
IC0gd2UgdXNlIHRoZSBmaXJzdCBrZXlmcmFtZQorICAgICAgICBpZiAoaXQgPT0ga2V5ZnJhbWVW
YWx1ZXMuZW5kKCkpCisgICAgICAgICAgICBpdCA9IGtleWZyYW1lVmFsdWVzLmJlZ2luKCk7CisK
KyAgICAgICAgdHlwZW5hbWUgUU1hcDxxcmVhbCwgS2V5ZnJhbWVWYWx1ZVF0PFQ+ID46Oml0ZXJh
dG9yIGl0MiA9IGl0KzE7CisgICAgICAgIGlmIChpdDIgPT0ga2V5ZnJhbWVWYWx1ZXMuZW5kKCkp
CisgICAgICAgICAgICBpdDIgPSBrZXlmcmFtZVZhbHVlcy5iZWdpbigpOworICAgICAgICBjb25z
dCBLZXlmcmFtZVZhbHVlUXQ8VD4mIGZyb21LZXlmcmFtZSA9IGl0LnZhbHVlKCk7CisgICAgICAg
IGNvbnN0IEtleWZyYW1lVmFsdWVRdDxUPiYgdG9LZXlmcmFtZSA9IGl0Mi52YWx1ZSgpOworCisg
ICAgICAgIGNvbnN0IFRpbWluZ0Z1bmN0aW9uJiB0aW1pbmdGdW5jID0gZnJvbUtleWZyYW1lLnRp
bWluZ0Z1bmN0aW9uOworICAgICAgICBjb25zdCBUJiBmcm9tVmFsdWUgPSBmcm9tS2V5ZnJhbWUu
dmFsdWU7CisgICAgICAgIGNvbnN0IFQmIHRvVmFsdWUgPSB0b0tleWZyYW1lLnZhbHVlOworCisg
ICAgICAgIC8vIG5vdyB3ZSBoYXZlIGEgc291cmNlIGtleWZyYW1lLCBvcmlnaW4ga2V5ZnJhbWUg
YW5kIGEgdGltaW5nIGZ1bmN0aW9uCisgICAgICAgIC8vIHdlIGNhbiBub3cgcHJvY2VzcyB0aGUg
cHJvZ3Jlc3MgYW5kIGFwcGx5IHRoZSBmcmFtZQorICAgICAgICBxcmVhbCBub3JtYWxpemVkUHJv
Z3Jlc3MgPSAoaXQua2V5KCkgPT0gaXQyLmtleSgpKSA/IDAgOiAocHJvZ3Jlc3MgLSBpdC5rZXko
KSkgLyAoaXQyLmtleSgpIC0gaXQua2V5KCkpOworICAgICAgICBub3JtYWxpemVkUHJvZ3Jlc3Mg
PSBhcHBseVRpbWluZ0Z1bmN0aW9uKHRpbWluZ0Z1bmMsIG5vcm1hbGl6ZWRQcm9ncmVzcywgZHVy
YXRpb24oKSAvIDEwMDApOworICAgICAgICBhcHBseUZyYW1lKGZyb21WYWx1ZSwgdG9WYWx1ZSwg
bm9ybWFsaXplZFByb2dyZXNzKTsKKyAgICB9CisKKyAgICBRTWFwPHFyZWFsLCBLZXlmcmFtZVZh
bHVlUXQ8VD4gPiBrZXlmcmFtZVZhbHVlczsKK307CisKK2NsYXNzIFRyYW5zZm9ybUFuaW1hdGlv
blF0IDogcHVibGljIEFuaW1hdGlvblF0PFRyYW5zZm9ybU9wZXJhdGlvbnM+IHsKK3B1YmxpYzoK
KyAgICBUcmFuc2Zvcm1BbmltYXRpb25RdChHcmFwaGljc0xheWVyUXRJbXBsKiBsYXllciwgY29u
c3QgS2V5ZnJhbWVWYWx1ZUxpc3QmIHZhbHVlcywgY29uc3QgSW50U2l6ZSYgYm94U2l6ZSwgY29u
c3QgQW5pbWF0aW9uKiBhbmltLCBjb25zdCBRU3RyaW5nICYgbmFtZSkKKyAgICAgICAgICAgICAg
ICA6IEFuaW1hdGlvblF0PFRyYW5zZm9ybU9wZXJhdGlvbnM+KGxheWVyLCB2YWx1ZXMsIGJveFNp
emUsIGFuaW0sIG5hbWUpCisgICAgeworICAgIH0KKworICAgIH5UcmFuc2Zvcm1BbmltYXRpb25R
dCgpCisgICAgeworICAgICAgICAvLyB0aGlzIGNhbWUgdXAgZHVyaW5nIHRoZSBjb21wb3NpdGlu
Zy9hbmltYXRpb24gTGF5b3V0VGVzdHMKKyAgICAgICAgLy8gd2hlbiB0aGUgYW5pbWF0aW9uIGRp
ZXMsIHRoZSB0cmFuc2Zvcm0gaGFzIHRvIGdvIGJhY2sgdG8gZGVmYXVsdAorICAgICAgICBtX2xh
eWVyLmRhdGEoKS0+c2V0QmFzZVRyYW5zZm9ybShRVHJhbnNmb3JtKG1fbGF5ZXIuZGF0YSgpLT5t
X2xheWVyLT50cmFuc2Zvcm0oKSkpOworICAgIH0KKworICAgIC8vIHRoZSBpZGVhIGlzIHRoYXQg
d2UgbGV0IFdlYkNvcmUgbWFuYWdlIHRoZSB0cmFuc2Zvcm0tb3BlcmF0aW9ucworICAgIC8vIGFu
ZCBRdCBqdXN0IG1hbmFnZXMgdGhlIGFuaW1hdGlvbiBoZWFydGJlYXQgYW5kIHRoZSBib3R0b20t
bGluZSBRVHJhbnNmb3JtCisgICAgLy8gd2UgZ2V0IHRoZSBwZXJmb3JtYW5jZSBub3QgYnkgdXNp
bmcgUVRyYW5zZm9ybSBpbnN0ZWFkIG9mIFRyYW5zZm9ybWF0aW9uTWF0cml4LCBidXQgYnkgcHJv
cGVyIGNhY2hpbmcgb2YKKyAgICAvLyBpdGVtcyB0aGF0IGFyZSBleHBlbnNpdmUgZm9yIFdlYkNv
cmUgdG8gcmVuZGVyLiBXZSB3YW50IHRoZSByZXN0IHRvIGJlIGFzIGNsb3NlIHRvIFdlYkNvcmUn
cyBpZGVhIGFzIHBvc3NpYmxlLgorICAgIHZpcnR1YWwgdm9pZCBhcHBseUZyYW1lKGNvbnN0IFRy
YW5zZm9ybU9wZXJhdGlvbnMmIHNvdXJjZU9wZXJhdGlvbnMsIGNvbnN0IFRyYW5zZm9ybU9wZXJh
dGlvbnMmIHRhcmdldE9wZXJhdGlvbnMsIHFyZWFsIHByb2dyZXNzKQorICAgIHsKKyAgICAgICAg
VHJhbnNmb3JtYXRpb25NYXRyaXggdHJhbnNmb3JtTWF0cml4OworCisgICAgICAgIC8vIHRoaXMg
bG9va3Mgc2ltcGxlIGJ1dCBpcyByZWFsbHkgdHJpY2t5IHRvIGdldCByaWdodC4gVXNlIGNhdXRp
b24uCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdGFyZ2V0T3BlcmF0aW9ucy5zaXpl
KCk7ICsraSkKKyAgICAgICAgICAgIHRhcmdldE9wZXJhdGlvbnMub3BlcmF0aW9ucygpW2ldLT5i
bGVuZChzb3VyY2VPcGVyYXRpb25zLmF0KGkpLCBwcm9ncmVzcyktPmFwcGx5KHRyYW5zZm9ybU1h
dHJpeCwgbV9ib3hTaXplKTsKKworICAgICAgICBtX2xheWVyLmRhdGEoKS0+c2V0QmFzZVRyYW5z
Zm9ybShRVHJhbnNmb3JtKHRyYW5zZm9ybU1hdHJpeCkpOworICAgIH0KKworICAgIHZpcnR1YWwg
dm9pZCB1cGRhdGVTdGF0ZShRQWJzdHJhY3RBbmltYXRpb246OlN0YXRlIG5ld1N0YXRlLCBRQWJz
dHJhY3RBbmltYXRpb246OlN0YXRlIG9sZFN0YXRlKQorICAgIHsKKyAgICAgICAgQW5pbWF0aW9u
UXRCYXNlOjp1cGRhdGVTdGF0ZShuZXdTdGF0ZSwgb2xkU3RhdGUpOworICAgICAgICBpZiAoIW1f
bGF5ZXIpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIG1fbGF5ZXIuZGF0YSgpLT5mbHVz
aENoYW5nZXModHJ1ZSk7CisKKyAgICAgICAgLy8gdG8gaW5jcmVhc2UgRlBTLCB3ZSB1c2UgYSBs
ZXNzIGFjY3VyYXRlIGNhY2hpbmcgbWVjaGFuaXNtIHdoaWxlIGFuaW1hdGlvbiBpcyBnb2luZyBv
bgorICAgICAgICAvLyB0aGlzIGlzIGEgVVggY2hvaWNlIHRoYXQgc2hvdWxkIHByb2JhYmx5IGJl
IGN1c3RvbWl6YWJsZQorICAgICAgICBpZiAobmV3U3RhdGUgPT0gUUFic3RyYWN0QW5pbWF0aW9u
OjpSdW5uaW5nKSB7CisgICAgICAgICAgICBtX2xheWVyLmRhdGEoKS0+bV90cmFuc2Zvcm1Bbmlt
YXRpb25SdW5uaW5nID0gdHJ1ZTsKKyAgICAgICAgICAgIGlmIChtX2xheWVyLmRhdGEoKS0+Y2Fj
aGVNb2RlKCkgPT0gUUdyYXBoaWNzSXRlbTo6RGV2aWNlQ29vcmRpbmF0ZUNhY2hlKQorICAgICAg
ICAgICAgICAgIG1fbGF5ZXIuZGF0YSgpLT5zZXRDYWNoZU1vZGUoUUdyYXBoaWNzSXRlbTo6SXRl
bUNvb3JkaW5hdGVDYWNoZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtX2xheWVy
LmRhdGEoKS0+bV90cmFuc2Zvcm1BbmltYXRpb25SdW5uaW5nID0gZmFsc2U7CisgICAgICAgICAg
ICBpZiAobV9sYXllci5kYXRhKCktPmNhY2hlTW9kZSgpID09IFFHcmFwaGljc0l0ZW06Okl0ZW1D
b29yZGluYXRlQ2FjaGUpCisgICAgICAgICAgICAgICAgbV9sYXllci5kYXRhKCktPnNldENhY2hl
TW9kZShRR3JhcGhpY3NJdGVtOjpEZXZpY2VDb29yZGluYXRlQ2FjaGUpOworICAgICAgICB9Cisg
ICAgfQorfTsKKworY2xhc3MgT3BhY2l0eUFuaW1hdGlvblF0IDogcHVibGljIEFuaW1hdGlvblF0
PHFyZWFsPiB7CitwdWJsaWM6CisgICAgT3BhY2l0eUFuaW1hdGlvblF0KEdyYXBoaWNzTGF5ZXJR
dEltcGwqIGxheWVyLCBjb25zdCBLZXlmcmFtZVZhbHVlTGlzdCYgdmFsdWVzLCBjb25zdCBJbnRT
aXplJiBib3hTaXplLCBjb25zdCBBbmltYXRpb24qIGFuaW0sIGNvbnN0IFFTdHJpbmcgJiBuYW1l
KQorICAgICAgICAgICAgICAgIDogQW5pbWF0aW9uUXQ8cXJlYWw+KGxheWVyLCB2YWx1ZXMsIGJv
eFNpemUsIGFuaW0sIG5hbWUpCisgICAgeworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBhcHBs
eUZyYW1lKGNvbnN0IHFyZWFsJiBmcm9tVmFsdWUsIGNvbnN0IHFyZWFsJiB0b1ZhbHVlLCBxcmVh
bCBwcm9ncmVzcykKKyAgICB7CisgICAgICAgIG1fbGF5ZXIuZGF0YSgpLT5zZXRPcGFjaXR5KHFN
aW48cXJlYWw+KHFNYXg8cXJlYWw+KGZyb21WYWx1ZSArICh0b1ZhbHVlLWZyb21WYWx1ZSkqcHJv
Z3Jlc3MsIDApLCAxKSk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIHVwZGF0ZVN0YXRlKFFB
YnN0cmFjdEFuaW1hdGlvbjo6U3RhdGUgbmV3U3RhdGUsIFFBYnN0cmFjdEFuaW1hdGlvbjo6U3Rh
dGUgb2xkU3RhdGUpCisgICAgeworICAgICAgICBRQWJzdHJhY3RBbmltYXRpb246OnVwZGF0ZVN0
YXRlKG5ld1N0YXRlLCBvbGRTdGF0ZSk7CisKKyAgICAgICAgaWYgKCFtX2xheWVyKQorICAgICAg
ICAgICAgcmV0dXJuOworCisgICAgICAgIGlmIChuZXdTdGF0ZSA9PSBRQWJzdHJhY3RBbmltYXRp
b246OlJ1bm5pbmcpCisgICAgICAgICAgICBtX2xheWVyLmRhdGEoKS0+b3BhY2l0eUFuaW1hdGlv
blJ1bm5pbmcgPSB0cnVlOworICAgICAgICBlbHNlCisgICAgICAgICAgICBtX2xheWVyLmRhdGEo
KS0+b3BhY2l0eUFuaW1hdGlvblJ1bm5pbmcgPSBmYWxzZTsKKyAgICB9Cit9OworCitib29sIEdy
YXBoaWNzTGF5ZXJRdDo6YWRkQW5pbWF0aW9uKGNvbnN0IEtleWZyYW1lVmFsdWVMaXN0JiB2YWx1
ZXMsIGNvbnN0IEludFNpemUmIGJveFNpemUsIGNvbnN0IEFuaW1hdGlvbiogYW5pbSwgY29uc3Qg
U3RyaW5nJiBrZXlmcmFtZXNOYW1lLCBkb3VibGUgdGltZU9mZnNldCkKK3sKKyAgICBpZiAoIWFu
aW0tPmR1cmF0aW9uKCkgfHwgIWFuaW0tPml0ZXJhdGlvbkNvdW50KCkpCisgICAgICAgIHJldHVy
biBmYWxzZTsKKworICAgIFFBYnN0cmFjdEFuaW1hdGlvbiogbmV3QW5pbTsKKworICAgIHN3aXRj
aCAodmFsdWVzLnByb3BlcnR5KCkpIHsKKyAgICBjYXNlIEFuaW1hdGVkUHJvcGVydHlPcGFjaXR5
OgorICAgICAgICBuZXdBbmltID0gbmV3IE9wYWNpdHlBbmltYXRpb25RdChtX2ltcGwuZ2V0KCks
IHZhbHVlcywgYm94U2l6ZSwgYW5pbSwga2V5ZnJhbWVzTmFtZSk7CisgICAgICAgIGJyZWFrOwor
ICAgIGNhc2UgQW5pbWF0ZWRQcm9wZXJ0eVdlYmtpdFRyYW5zZm9ybToKKyAgICAgICAgbmV3QW5p
bSA9IG5ldyBUcmFuc2Zvcm1BbmltYXRpb25RdChtX2ltcGwuZ2V0KCksIHZhbHVlcywgYm94U2l6
ZSwgYW5pbSwga2V5ZnJhbWVzTmFtZSk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6Cisg
ICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyB3ZSBtYWtlIHN1cmUgV2ViQ29y
ZTo6QW5pbWF0aW9uIGFuZCBRQW5pbWF0aW9uIGFyZSBvbiB0aGUgc2FtZSB0ZXJtcworICAgIG5l
d0FuaW0tPnNldExvb3BDb3VudChhbmltLT5pdGVyYXRpb25Db3VudCgpKTsKKyAgICBtX2ltcGwt
Pm1fYW5pbWF0aW9ucy5hcHBlbmQoUVdlYWtQb2ludGVyPFFBYnN0cmFjdEFuaW1hdGlvbj4obmV3
QW5pbSkpOworICAgIFFPYmplY3Q6OmNvbm5lY3QoJm1faW1wbC0+bV9zdXNwZW5kVGltZXIsIFNJ
R05BTCh0aW1lb3V0KCkpLCBuZXdBbmltLCBTTE9UKHJlc3VtZSgpKSk7CisgICAgdGltZU9mZnNl
dCArPSBhbmltLT5kZWxheSgpOworCisgICAgLy8gZmx1c2ggbm93IG9yIGZsaWNrZXIuLi4KKyAg
ICBtX2ltcGwtPmZsdXNoQ2hhbmdlcyhmYWxzZSk7CisKKyAgICBpZiAodGltZU9mZnNldCkKKyAg
ICAgICAgUVRpbWVyOjpzaW5nbGVTaG90KHRpbWVPZmZzZXQgKiAxMDAwLCBuZXdBbmltLCBTTE9U
KHN0YXJ0KCkpKTsKKyAgICBlbHNlCisgICAgICAgIG5ld0FuaW0tPnN0YXJ0KCk7CisKKyAgICBR
T2JqZWN0Ojpjb25uZWN0KG5ld0FuaW0sIFNJR05BTChmaW5pc2hlZCgpKSwgbmV3QW5pbSwgU0xP
VChkZWxldGVMYXRlcigpKSk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBHcmFwaGlj
c0xheWVyUXQ6OnJlbW92ZUFuaW1hdGlvbnNGb3JQcm9wZXJ0eShBbmltYXRlZFByb3BlcnR5SUQg
aWQpCit7CisgICAgZm9yIChRTGlzdDxRV2Vha1BvaW50ZXI8UUFic3RyYWN0QW5pbWF0aW9uPiA+
OjppdGVyYXRvciBpdCA9IG1faW1wbC0+bV9hbmltYXRpb25zLmJlZ2luKCk7IGl0ICE9IG1faW1w
bC0+bV9hbmltYXRpb25zLmVuZCgpOyArK2l0KSB7CisgICAgICAgIGlmICgqaXQpIHsKKyAgICAg
ICAgICAgIEFuaW1hdGlvblF0QmFzZSogYW5pbSA9IHN0YXRpY19jYXN0PEFuaW1hdGlvblF0QmFz
ZSo+KGl0LT5kYXRhKCkpOworICAgICAgICAgICAgaWYgKGFuaW0gJiYgYW5pbS0+bV93ZWJraXRQ
cm9wZXJ0eUlEID09IGlkKSB7CisgICAgICAgICAgICAgICAgZGVsZXRlIGFuaW07CisgICAgICAg
ICAgICAgICAgaXQgPSBtX2ltcGwtPm1fYW5pbWF0aW9ucy5lcmFzZShpdCk7CisgICAgICAgICAg
ICAgICAgLS1pdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBH
cmFwaGljc0xheWVyUXQ6OnJlbW92ZUFuaW1hdGlvbnNGb3JLZXlmcmFtZXMoY29uc3QgU3RyaW5n
JiBuYW1lKQoreworICAgIGZvciAoUUxpc3Q8UVdlYWtQb2ludGVyPFFBYnN0cmFjdEFuaW1hdGlv
bj4gPjo6aXRlcmF0b3IgaXQgPSBtX2ltcGwtPm1fYW5pbWF0aW9ucy5iZWdpbigpOyBpdCAhPSBt
X2ltcGwtPm1fYW5pbWF0aW9ucy5lbmQoKTsgKytpdCkgeworICAgICAgICBpZiAoKml0KSB7Cisg
ICAgICAgICAgICBBbmltYXRpb25RdEJhc2UqIGFuaW0gPSBzdGF0aWNfY2FzdDxBbmltYXRpb25R
dEJhc2UqPigoKml0KS5kYXRhKCkpOworICAgICAgICAgICAgaWYgKGFuaW0gJiYgYW5pbS0+bV9r
ZXlmcmFtZXNOYW1lID09IFFTdHJpbmcobmFtZSkpIHsKKyAgICAgICAgICAgICAgICAoKml0KS5k
YXRhKCktPmRlbGV0ZUxhdGVyKCk7CisgICAgICAgICAgICAgICAgaXQgPSBtX2ltcGwtPm1fYW5p
bWF0aW9ucy5lcmFzZShpdCk7CisgICAgICAgICAgICAgICAgLS1pdDsKKyAgICAgICAgICAgIH0K
KyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBHcmFwaGljc0xheWVyUXQ6OnBhdXNlQW5pbWF0
aW9uKGNvbnN0IFN0cmluZyYgbmFtZSwgZG91YmxlIHRpbWVPZmZzZXQpCit7CisgICAgZm9yIChR
TGlzdDxRV2Vha1BvaW50ZXI8UUFic3RyYWN0QW5pbWF0aW9uPiA+OjppdGVyYXRvciBpdCA9IG1f
aW1wbC0+bV9hbmltYXRpb25zLmJlZ2luKCk7IGl0ICE9IG1faW1wbC0+bV9hbmltYXRpb25zLmVu
ZCgpOyArK2l0KSB7CisgICAgICAgIGlmICgqaXQpIHsKKyAgICAgICAgICAgIEFuaW1hdGlvblF0
QmFzZSogYW5pbSA9IHN0YXRpY19jYXN0PEFuaW1hdGlvblF0QmFzZSo+KCgqaXQpLmRhdGEoKSk7
CisgICAgICAgICAgICBpZiAoYW5pbSAmJiBhbmltLT5tX2tleWZyYW1lc05hbWUgPT0gUVN0cmlu
ZyhuYW1lKSkKKyAgICAgICAgICAgICAgICBRVGltZXI6OnNpbmdsZVNob3QodGltZU9mZnNldCAq
IDEwMDAsIGFuaW0sIFNMT1QocGF1c2UoKSkpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lk
IEdyYXBoaWNzTGF5ZXJRdDo6c3VzcGVuZEFuaW1hdGlvbnMoZG91YmxlIHRpbWUpCit7CisgICAg
aWYgKG1faW1wbC0+bV9zdXNwZW5kVGltZXIuaXNBY3RpdmUoKSkgeworICAgICAgICBtX2ltcGwt
Pm1fc3VzcGVuZFRpbWVyLnN0b3AoKTsKKyAgICAgICAgbV9pbXBsLT5tX3N1c3BlbmRUaW1lci5z
dGFydCh0aW1lICogMTAwMCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yIChRTGlzdDxRV2Vh
a1BvaW50ZXI8UUFic3RyYWN0QW5pbWF0aW9uPiA+OjppdGVyYXRvciBpdCA9IG1faW1wbC0+bV9h
bmltYXRpb25zLmJlZ2luKCk7IGl0ICE9IG1faW1wbC0+bV9hbmltYXRpb25zLmVuZCgpOyArK2l0
KSB7CisgICAgICAgICAgICBRQWJzdHJhY3RBbmltYXRpb24qIGFuaW0gPSBpdC0+ZGF0YSgpOwor
ICAgICAgICAgICAgaWYgKGFuaW0pCisgICAgICAgICAgICAgICAgYW5pbS0+cGF1c2UoKTsKKyAg
ICAgICAgfQorICAgIH0KK30KKwordm9pZCBHcmFwaGljc0xheWVyUXQ6OnJlc3VtZUFuaW1hdGlv
bnMoKQoreworICAgIGlmIChtX2ltcGwtPm1fc3VzcGVuZFRpbWVyLmlzQWN0aXZlKCkpIHsKKyAg
ICAgICAgbV9pbXBsLT5tX3N1c3BlbmRUaW1lci5zdG9wKCk7CisgICAgICAgIGZvciAoUUxpc3Q8
UVdlYWtQb2ludGVyPFFBYnN0cmFjdEFuaW1hdGlvbj4gPjo6aXRlcmF0b3IgaXQgPSBtX2ltcGwt
Pm1fYW5pbWF0aW9ucy5iZWdpbigpOyBpdCAhPSBtX2ltcGwtPm1fYW5pbWF0aW9ucy5lbmQoKTsg
KytpdCkgeworICAgICAgICAgICAgUUFic3RyYWN0QW5pbWF0aW9uKiBhbmltID0gKCppdCkuZGF0
YSgpOworICAgICAgICAgICAgaWYgKGFuaW0pCisgICAgICAgICAgICAgICAgYW5pbS0+cmVzdW1l
KCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK30KKworI2luY2x1ZGUgPEdyYXBoaWNzTGF5ZXJR
dC5tb2M+CkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3F0L0dyYXBoaWNzTGF5ZXJR
dC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIC9kZXYvbnVsbAorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy9xdC9HcmFwaGljc0xheWVyUXQuaAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSw4NyBAQAorLyoK
KyAgICBDb3B5cmlnaHQgKEMpIDIwMDkgTm9raWEgQ29ycG9yYXRpb24gYW5kL29yIGl0cyBzdWJz
aWRpYXJ5KC1pZXMpCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNh
biByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBv
ZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hl
ZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIg
b2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisK
KyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxs
IGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0
aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGlicmFyeSBHZW5lcmFs
IFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUg
cmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNl
CisgICAgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4g
IElmIG5vdCwgd3JpdGUgdG8KKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMu
LCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICAgIEJvc3RvbiwgTUEgMDIxMTAt
MTMwMSwgVVNBLgorKi8KKworI2lmbmRlZiBHcmFwaGljc0xheWVyUXRfaAorI2RlZmluZSBHcmFw
aGljc0xheWVyUXRfaAorCisjaW5jbHVkZSAiR3JhcGhpY3NMYXllci5oIgorI2luY2x1ZGUgIkdy
YXBoaWNzTGF5ZXJDbGllbnQuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitjbGFzcyBHcmFw
aGljc0xheWVyUXRJbXBsOworCitjbGFzcyBHcmFwaGljc0xheWVyUXQgOiBwdWJsaWMgR3JhcGhp
Y3NMYXllciB7CisgICAgZnJpZW5kIGNsYXNzIEdyYXBoaWNzTGF5ZXJRdEltcGw7CisKK3B1Ymxp
YzoKKyAgICBHcmFwaGljc0xheWVyUXQoR3JhcGhpY3NMYXllckNsaWVudCopOworICAgIHZpcnR1
YWwgfkdyYXBoaWNzTGF5ZXJRdCgpOworCisgICAgLy8gcmVpbXBzIGZyb20gR3JhcGhpY3NMYXll
ci5oCisgICAgdmlydHVhbCBOYXRpdmVMYXllciBuYXRpdmVMYXllcigpIGNvbnN0OworICAgIHZp
cnR1YWwgUGxhdGZvcm1MYXllciogcGxhdGZvcm1MYXllcigpIGNvbnN0OworICAgIHZpcnR1YWwg
dm9pZCBzZXROZWVkc0Rpc3BsYXkoKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0TmVlZHNEaXNwbGF5
SW5SZWN0KGNvbnN0IEZsb2F0UmVjdCYpOworICAgIHZpcnR1YWwgdm9pZCBzZXRQYXJlbnQoR3Jh
cGhpY3NMYXllciogbGF5ZXIpOworICAgIHZpcnR1YWwgdm9pZCBzZXROYW1lKGNvbnN0IFN0cmlu
ZyYgbmFtZSk7CisgICAgdmlydHVhbCBib29sIHNldENoaWxkcmVuKGNvbnN0IFZlY3RvcjxHcmFw
aGljc0xheWVyKj4mKTsKKyAgICB2aXJ0dWFsIHZvaWQgYWRkQ2hpbGQoR3JhcGhpY3NMYXllciop
OworICAgIHZpcnR1YWwgdm9pZCBhZGRDaGlsZEF0SW5kZXgoR3JhcGhpY3NMYXllciosIGludCBp
bmRleCk7CisgICAgdmlydHVhbCB2b2lkIGFkZENoaWxkQWJvdmUoR3JhcGhpY3NMYXllciogbGF5
ZXIsIEdyYXBoaWNzTGF5ZXIqIHNpYmxpbmcpOworICAgIHZpcnR1YWwgdm9pZCBhZGRDaGlsZEJl
bG93KEdyYXBoaWNzTGF5ZXIqIGxheWVyLCBHcmFwaGljc0xheWVyKiBzaWJsaW5nKTsKKyAgICB2
aXJ0dWFsIGJvb2wgcmVwbGFjZUNoaWxkKEdyYXBoaWNzTGF5ZXIqIG9sZENoaWxkLCBHcmFwaGlj
c0xheWVyKiBuZXdDaGlsZCk7CisgICAgdmlydHVhbCB2b2lkIHJlbW92ZUZyb21QYXJlbnQoKTsK
KyAgICB2aXJ0dWFsIHZvaWQgc2V0TWFza0xheWVyKEdyYXBoaWNzTGF5ZXIqIGxheWVyKTsKKyAg
ICB2aXJ0dWFsIHZvaWQgc2V0UG9zaXRpb24oY29uc3QgRmxvYXRQb2ludCYgcCk7CisgICAgdmly
dHVhbCB2b2lkIHNldEFuY2hvclBvaW50KGNvbnN0IEZsb2F0UG9pbnQzRCYgcCk7CisgICAgdmly
dHVhbCB2b2lkIHNldFNpemUoY29uc3QgRmxvYXRTaXplJiBzaXplKTsKKyAgICB2aXJ0dWFsIHZv
aWQgc2V0VHJhbnNmb3JtKGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4JiB0KTsKKyAgICB2aXJ0
dWFsIHZvaWQgc2V0Q2hpbGRyZW5UcmFuc2Zvcm0oY29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgm
IHQpOworICAgIHZpcnR1YWwgdm9pZCBzZXRQcmVzZXJ2ZXMzRChib29sIGIpOworICAgIHZpcnR1
YWwgdm9pZCBzZXRNYXNrc1RvQm91bmRzKGJvb2wgYik7CisgICAgdmlydHVhbCB2b2lkIHNldERy
YXdzQ29udGVudChib29sIGIpOworICAgIHZpcnR1YWwgdm9pZCBzZXRCYWNrZ3JvdW5kQ29sb3Io
Y29uc3QgQ29sb3ImKTsKKyAgICB2aXJ0dWFsIHZvaWQgY2xlYXJCYWNrZ3JvdW5kQ29sb3IoKTsK
KyAgICB2aXJ0dWFsIHZvaWQgc2V0Q29udGVudHNPcGFxdWUoYm9vbCBiKTsKKyAgICB2aXJ0dWFs
IHZvaWQgc2V0QmFja2ZhY2VWaXNpYmlsaXR5KGJvb2wgYik7CisgICAgdmlydHVhbCB2b2lkIHNl
dE9wYWNpdHkoZmxvYXQgb3BhY2l0eSk7CisgICAgdmlydHVhbCB2b2lkIHNldENvbnRlbnRzUmVj
dChjb25zdCBJbnRSZWN0JiByKTsKKyAgICB2aXJ0dWFsIGJvb2wgYWRkQW5pbWF0aW9uKGNvbnN0
IEtleWZyYW1lVmFsdWVMaXN0JiwgY29uc3QgSW50U2l6ZSYgYm94U2l6ZSwgY29uc3QgQW5pbWF0
aW9uKiwgY29uc3QgU3RyaW5nJiBrZXlmcmFtZXNOYW1lLCBkb3VibGUgdGltZU9mZnNldCk7Cisg
ICAgdmlydHVhbCB2b2lkIHJlbW92ZUFuaW1hdGlvbnNGb3JQcm9wZXJ0eShBbmltYXRlZFByb3Bl
cnR5SUQpOworICAgIHZpcnR1YWwgdm9pZCByZW1vdmVBbmltYXRpb25zRm9yS2V5ZnJhbWVzKGNv
bnN0IFN0cmluZyYga2V5ZnJhbWVzTmFtZSk7CisgICAgdmlydHVhbCB2b2lkIHBhdXNlQW5pbWF0
aW9uKGNvbnN0IFN0cmluZyYga2V5ZnJhbWVzTmFtZSwgZG91YmxlIHRpbWVPZmZzZXQpOworICAg
IHZpcnR1YWwgdm9pZCBzdXNwZW5kQW5pbWF0aW9ucyhkb3VibGUgdGltZSk7CisgICAgdmlydHVh
bCB2b2lkIHJlc3VtZUFuaW1hdGlvbnMoKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0Q29udGVudHNU
b0ltYWdlKEltYWdlKik7CisgICAgdmlydHVhbCB2b2lkIHNldENvbnRlbnRzQmFja2dyb3VuZENv
bG9yKGNvbnN0IENvbG9yJik7CisgICAgdmlydHVhbCB2b2lkIHNldEdlb21ldHJ5T3JpZW50YXRp
b24oQ29tcG9zaXRpbmdDb29yZGluYXRlc09yaWVudGF0aW9uIG9yaWVudGF0aW9uKTsKKyAgICB2
aXJ0dWFsIHZvaWQgc2V0Q29udGVudHNPcmllbnRhdGlvbihDb21wb3NpdGluZ0Nvb3JkaW5hdGVz
T3JpZW50YXRpb24gb3JpZW50YXRpb24pOworICAgIHZpcnR1YWwgdm9pZCBkaXN0cmlidXRlT3Bh
Y2l0eShmbG9hdCk7CisgICAgdmlydHVhbCBmbG9hdCBhY2N1bXVsYXRlZE9wYWNpdHkoKSBjb25z
dDsKKyAgICB2aXJ0dWFsIHZvaWQgc3luY0NvbXBvc2l0aW5nU3RhdGUoKTsKKworcHJpdmF0ZToK
KyAgICBPd25QdHI8R3JhcGhpY3NMYXllclF0SW1wbD4gbV9pbXBsOworCit9OworCisKK30KKyNl
bmRpZiAvLyBHcmFwaGljc0xheWVyUXRfaApJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy9HcmFwaGljc0xheWVyLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy9HcmFwaGljc0xheWVyLmgJKHJldmlzaW9uIDUzNDI3KQorKysgV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy9HcmFwaGljc0xheWVyLmgJKHdvcmtpbmcgY29weSkKQEAgLTU5LDYgKzU5LDEwIEBA
CiB0eXBlZGVmIFdLQ0FDRkxheWVyIFBsYXRmb3JtTGF5ZXI7CiB0eXBlZGVmIHZvaWQqIE5hdGl2
ZUxheWVyOwogfQorI2VsaWYgUExBVEZPUk0oUVQpCitjbGFzcyBRR3JhcGhpY3NJdGVtOwordHlw
ZWRlZiBRR3JhcGhpY3NJdGVtIFBsYXRmb3JtTGF5ZXI7Cit0eXBlZGVmIFFHcmFwaGljc0l0ZW0q
IE5hdGl2ZUxheWVyOwogI2Vsc2UKIHR5cGVkZWYgdm9pZCogUGxhdGZvcm1MYXllcjsKIHR5cGVk
ZWYgdm9pZCogTmF0aXZlTGF5ZXI7CkluZGV4OiBXZWJLaXQucHJpCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdl
YktpdC5wcmkJKHJldmlzaW9uIDUzNDI3KQorKysgV2ViS2l0LnByaQkod29ya2luZyBjb3B5KQpA
QCAtNDUsNiArNDUsNyBAQAogICAgIH0KICAgICBERVBFTkRQQVRIICs9ICQkUFdEL1dlYktpdC9x
dC9BcGkKIH0KK0RFRklORVMgKz0gV1RGX1VTRV9BQ0NFTEVSQVRFRF9DT01QT1NJVElORwogCiAh
bWFjOiF1bml4fHN5bWJpYW4gewogICAgIERFRklORVMgKz0gVVNFX1NZU1RFTV9NQUxMT0MK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>46885</attachid>
            <date>2010-01-18 22:03:14 -0800</date>
            <delta_ts>2010-01-19 22:32:30 -0800</delta_ts>
            <desc>compositing layers</desc>
            <filename>patch-GraphicsLayerQt-3.diff</filename>
            <type>text/plain</type>
            <size>65867</size>
            <attacher name="Noam Rosenthal">noam</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYktpdC9xdC9RR1ZMYXVuY2hlci9tYWluLmNwcAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJL
aXQvcXQvUUdWTGF1bmNoZXIvbWFpbi5jcHAJKHJldmlzaW9uIDUzNDI3KQorKysgV2ViS2l0L3F0
L1FHVkxhdW5jaGVyL21haW4uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC03Miw2ICs3Miw4IEBACiAg
ICAgV2ViVmlldyhRR3JhcGhpY3NJdGVtKiBwYXJlbnQgPSAwKQogICAgICAgICA6IFFHcmFwaGlj
c1dlYlZpZXcocGFyZW50KQogICAgIHsKKyAgICAgICAgaWYgKFFBcHBsaWNhdGlvbjo6aW5zdGFu
Y2UoKS0+YXJndW1lbnRzKCkuY29udGFpbnMoIi0tY2FjaGVXZWJWaWV3IikpCisgICAgICAgICAg
ICBzZXRDYWNoZU1vZGUoUUdyYXBoaWNzSXRlbTo6RGV2aWNlQ29vcmRpbmF0ZUNhY2hlKTsKICAg
ICB9CiAgICAgdm9pZCBzZXRZUm90YXRpb24ocXJlYWwgYW5nbGUpCiAgICAgewpAQCAtMjUzLDYg
KzI1NSwxMiBAQAogICAgICAgICBzZXRBdHRyaWJ1dGUoUXQ6OldBX0RlbGV0ZU9uQ2xvc2UpOwog
CiAgICAgICAgIHZpZXctPnNldFNjZW5lKHNjZW5lLT5zY2VuZSgpKTsKKyAgICAgICAgY29uc3Qg
UVN0cmluZ0xpc3QgYXJndW1lbnRzID0gUUFwcGxpY2F0aW9uOjppbnN0YW5jZSgpLT5hcmd1bWVu
dHMoKTsKKyAgICAgICAgY29uc3QgaW50IGluZGV4T2ZWaWV3cG9ydFVwZGF0ZU1vZGUgPSBhcmd1
bWVudHMuaW5kZXhPZigiLS11cGRhdGVNb2RlIik7CisgICAgICAgIGlmIChpbmRleE9mVmlld3Bv
cnRVcGRhdGVNb2RlID4gMSAmJiBpbmRleE9mVmlld3BvcnRVcGRhdGVNb2RlIDwgYXJndW1lbnRz
LmNvdW50KCkgLSAxKSB7CisgICAgICAgICAgICBjb25zdCBRU3RyaW5nIHVwZGF0ZU1vZGUgPSBh
cmd1bWVudHNbaW5kZXhPZlZpZXdwb3J0VXBkYXRlTW9kZSsxXSArICJWaWV3cG9ydFVwZGF0ZSI7
CisgICAgICAgICAgICB2aWV3LT5zZXRWaWV3cG9ydFVwZGF0ZU1vZGUoc3RhdGljX2Nhc3Q8UUdy
YXBoaWNzVmlldzo6Vmlld3BvcnRVcGRhdGVNb2RlPihRR3JhcGhpY3NWaWV3OjpzdGF0aWNNZXRh
T2JqZWN0LmVudW1lcmF0b3IoUUdyYXBoaWNzVmlldzo6c3RhdGljTWV0YU9iamVjdC5pbmRleE9m
RW51bWVyYXRvcigiVmlld3BvcnRVcGRhdGVNb2RlIikpLmtleXNUb1ZhbHVlKHVwZGF0ZU1vZGUu
dG9Bc2NpaSgpKSkpOworICAgICAgICB9CiAKICAgICAgICAgc2V0Q2VudHJhbFdpZGdldCh2aWV3
KTsKIApAQCAtNDQ3LDYgKzQ1NSwxMCBAQAogaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2
KQogewogICAgIFFBcHBsaWNhdGlvbiBhcHAoYXJnYywgYXJndik7CisgICAgaWYgKGFwcC5hcmd1
bWVudHMoKS5jb250YWlucygiLS1oZWxwIikpIHsKKyAgICAgICAgcURlYnVnKCkgPDwgIlVzYWdl
OiBRR1ZMYXVuY2hlciBbLS11cmwgdXJsXSBbLS1jb21wb3NpdGluZ10gWy0tdXBkYXRlTW9kZSBG
dWxsfE1pbmltYWx8U21hcnR8Tm98Qm91bmRpbmdSZWN0XSBbLS1jYWNoZVdlYlZpZXddXG4iOwor
ICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAgICAgUVN0cmluZyB1cmwgPSBRU3RyaW5nKCJmaWxl
Oi8vJTEvJTIiKS5hcmcoUURpcjo6aG9tZVBhdGgoKSkuYXJnKFFMYXRpbjFTdHJpbmcoImluZGV4
Lmh0bWwiKSk7CiAKICAgICBhcHAuc2V0QXBwbGljYXRpb25OYW1lKCJHUVZMYXVuY2hlciIpOwpA
QCAtNDU4LDE0ICs0NzAsMjAgQEAKICAgICBRV2ViU2V0dGluZ3M6OmVuYWJsZVBlcnNpc3RlbnRT
dG9yYWdlKCk7CiAKICAgICBjb25zdCBRU3RyaW5nTGlzdCBhcmdzID0gYXBwLmFyZ3VtZW50cygp
OwotICAgIGlmIChhcmdzLmNvdW50KCkgPiAxKQorICAgIGNvbnN0IGludCBpbmRleE9mVXJsID0g
YXJncy5pbmRleE9mKCItLXVybCIpOworICAgIGlmIChpbmRleE9mVXJsID4gMCAmJiBpbmRleE9m
VXJsIDwgYXJncy5jb3VudCgpIC0gMSkKKyAgICAgICAgdXJsID0gYXJncy5hdChpbmRleE9mVXJs
KzEpOworICAgIGVsc2UgaWYgKGFyZ3MuY291bnQoKSA+IDEpCiAgICAgICAgIHVybCA9IGFyZ3Mu
YXQoMSk7CisgICAgaWYgKGFyZ3MuY29udGFpbnMoIi0tY29tcG9zaXRpbmciKSkKKyAgICAgICAg
UVdlYlNldHRpbmdzOjpnbG9iYWxTZXR0aW5ncygpLT5zZXRBdHRyaWJ1dGUoUVdlYlNldHRpbmdz
OjpBY2NlbGVyYXRlZENvbXBvc2l0aW5nRW5hYmxlZCwgdHJ1ZSk7CiAKICAgICBNYWluV2luZG93
KiB3aW5kb3cgPSBuZXcgTWFpbldpbmRvdzsKICAgICB3aW5kb3ctPmxvYWQodXJsKTsKIAotICAg
IGZvciAoaW50IGkgPSAyOyBpIDwgYXJncy5jb3VudCgpOyBpKyspCi0gICAgICAgIHdpbmRvdy0+
bmV3V2luZG93KGFyZ3MuYXQoaSkpOworICAgIGZvciAoaW50IGkgPSAyOyBpIDwgYXJncy5jb3Vu
dCgpOyArK2kpCisgICAgICAgIGlmICghYXJncy5hdChpKS5zdGFydHNXaXRoKCItIikgJiYgIWFy
Z3MuYXQoaSAtIDEpLnN0YXJ0c1dpdGgoIi0iKSkKKyAgICAgICAgICAgIHdpbmRvdy0+bmV3V2lu
ZG93KGFyZ3MuYXQoaSkpOwogCiAgICAgd2luZG93LT5zaG93KCk7CiAgICAgcmV0dXJuIGFwcC5l
eGVjKCk7CkluZGV4OiBXZWJLaXQvcXQvV2ViQ29yZVN1cHBvcnQvQ2hyb21lQ2xpZW50UXQuY3Bw
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFdlYktpdC9xdC9XZWJDb3JlU3VwcG9ydC9DaHJvbWVDbGllbnRRdC5j
cHAJKHJldmlzaW9uIDUzNDI3KQorKysgV2ViS2l0L3F0L1dlYkNvcmVTdXBwb3J0L0Nocm9tZUNs
aWVudFF0LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjUsNiArMjUsNyBAQAogICogKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFCiAgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLgogICovCisKICNpbmNsdWRlICJjb25maWcuaCIKICNpbmNsdWRl
ICJDaHJvbWVDbGllbnRRdC5oIgogCkBAIC00Miw2ICs0MywxMCBAQAogI2luY2x1ZGUgIlFXZWJQ
YWdlQ2xpZW50LmgiCiAjaW5jbHVkZSAiU2VjdXJpdHlPcmlnaW4uaCIKIAorI2luY2x1ZGUgPHFk
ZWJ1Zy5oPgorI2luY2x1ZGUgPHF0ZXh0ZG9jdW1lbnQuaD4KKyNpbmNsdWRlIDxxdG9vbHRpcC5o
PgorCiAjaW5jbHVkZSAicXdlYnBhZ2UuaCIKICNpbmNsdWRlICJxd2VicGFnZV9wLmgiCiAjaW5j
bHVkZSAicXdlYmZyYW1lX3AuaCIKQEAgLTQ5LDEzICs1NCwxMiBAQAogI2luY2x1ZGUgInF3ZWJz
ZWN1cml0eW9yaWdpbl9wLmgiCiAjaW5jbHVkZSAicXdlYnZpZXcuaCIKIAotI2luY2x1ZGUgPHF0
b29sdGlwLmg+Ci0jaW5jbHVkZSA8cXRleHRkb2N1bWVudC5oPgorI2lmIFVTRShBQ0NFTEVSQVRF
RF9DT01QT1NJVElORykKKyNpbmNsdWRlICJHcmFwaGljc0xheWVyUXQuaCIKKyNlbmRpZgogCi1u
YW1lc3BhY2UgV2ViQ29yZQoteworbmFtZXNwYWNlIFdlYkNvcmUgewogCi0KIENocm9tZUNsaWVu
dFF0OjpDaHJvbWVDbGllbnRRdChRV2ViUGFnZSogd2ViUGFnZSkKICAgICA6IG1fd2ViUGFnZSh3
ZWJQYWdlKQogewpAQCAtNDY2LDYgKzQ3MCwyOCBAQAogICAgIG5vdEltcGxlbWVudGVkKCk7CiB9
CiAKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCit2b2lkIENocm9tZUNsaWVudFF0
OjphdHRhY2hSb290R3JhcGhpY3NMYXllcihGcmFtZSogZnJhbWUsIEdyYXBoaWNzTGF5ZXIqIGdy
YXBoaWNzTGF5ZXIpCit7ICAgIAorICAgIGlmIChwbGF0Zm9ybVBhZ2VDbGllbnQoKSkKKyAgICAg
ICAgcGxhdGZvcm1QYWdlQ2xpZW50KCktPnNldFJvb3RHcmFwaGljc0xheWVyKGdyYXBoaWNzTGF5
ZXIgPyBncmFwaGljc0xheWVyLT5uYXRpdmVMYXllcigpIDogMCk7Cit9CisKK3ZvaWQgQ2hyb21l
Q2xpZW50UXQ6OnNldE5lZWRzT25lU2hvdERyYXdpbmdTeW5jaHJvbml6YXRpb24oKQoreworICAg
IC8vIHdlIHdhbnQgdGhlIGxheWVycyB0byBzeW5jaHJvbml6ZSBuZXh0IHRpbWUgd2UgdXBkYXRl
IHRoZSBzY3JlZW4gYW55d2F5CisgICAgaWYgKHBsYXRmb3JtUGFnZUNsaWVudCgpKQorICAgICAg
ICBwbGF0Zm9ybVBhZ2VDbGllbnQoKS0+bWFya0ZvclN5bmMoZmFsc2UpOworfQorCit2b2lkIENo
cm9tZUNsaWVudFF0OjpzY2hlZHVsZUNvbXBvc2l0aW5nTGF5ZXJTeW5jKCkKK3sKKyAgICAvLyB3
ZSB3YW50IHRoZSBsYXllcnMgdG8gc3luY2hyb25pemUgQVNBUAorICAgIGlmIChwbGF0Zm9ybVBh
Z2VDbGllbnQoKSkKKyAgICAgICAgcGxhdGZvcm1QYWdlQ2xpZW50KCktPm1hcmtGb3JTeW5jKHRy
dWUpOworfQorI2VuZGlmCisKIFF0QWJzdHJhY3RXZWJQb3B1cCogQ2hyb21lQ2xpZW50UXQ6OmNy
ZWF0ZVBvcHVwKCkKIHsKICAgICByZXR1cm4gbmV3IFF0RmFsbGJhY2tXZWJQb3B1cDsKSW5kZXg6
IFdlYktpdC9xdC9XZWJDb3JlU3VwcG9ydC9DaHJvbWVDbGllbnRRdC5oCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFdlYktpdC9xdC9XZWJDb3JlU3VwcG9ydC9DaHJvbWVDbGllbnRRdC5oCShyZXZpc2lvbiA1MzQy
NykKKysrIFdlYktpdC9xdC9XZWJDb3JlU3VwcG9ydC9DaHJvbWVDbGllbnRRdC5oCSh3b3JraW5n
IGNvcHkpCkBAIC0xMjMsNiArMTIzLDE1IEBACiAjaWYgRU5BQkxFKE9GRkxJTkVfV0VCX0FQUExJ
Q0FUSU9OUykKICAgICAgICAgdmlydHVhbCB2b2lkIHJlYWNoZWRNYXhBcHBDYWNoZVNpemUoaW50
NjRfdCBzcGFjZU5lZWRlZCk7CiAjZW5kaWYKKworI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJ
VElORykKKyAgICAgICAgLy8gc2VlIENocm9tZUNsaWVudC5oCisgICAgICAgIC8vIHRoaXMgaXMg
YSBob29rIGZvciBXZWJDb3JlIHRvIHRlbGwgdXMgd2hhdCB3ZSBuZWVkIHRvIGRvIHdpdGggdGhl
IEdyYXBoaWNzTGF5ZXJzCisgICAgICAgIHZpcnR1YWwgdm9pZCBhdHRhY2hSb290R3JhcGhpY3NM
YXllcihGcmFtZSosIEdyYXBoaWNzTGF5ZXIqKTsKKyAgICAgICAgdmlydHVhbCB2b2lkIHNldE5l
ZWRzT25lU2hvdERyYXdpbmdTeW5jaHJvbml6YXRpb24oKTsKKyAgICAgICAgdmlydHVhbCB2b2lk
IHNjaGVkdWxlQ29tcG9zaXRpbmdMYXllclN5bmMoKTsKKyNlbmRpZgorCiAgICAgICAgIHZpcnR1
YWwgdm9pZCBydW5PcGVuUGFuZWwoRnJhbWUqLCBQYXNzUmVmUHRyPEZpbGVDaG9vc2VyPik7CiAK
ICAgICAgICAgdmlydHVhbCB2b2lkIGZvcm1TdGF0ZURpZENoYW5nZShjb25zdCBOb2RlKikgeyB9
CkluZGV4OiBXZWJLaXQvcXQvQXBpL3FncmFwaGljc3dlYnZpZXcuY3BwCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFdlYktpdC9xdC9BcGkvcWdyYXBoaWNzd2Vidmlldy5jcHAJKHJldmlzaW9uIDUzNDI3KQorKysg
V2ViS2l0L3F0L0FwaS9xZ3JhcGhpY3N3ZWJ2aWV3LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjIs
MjQgKzIyLDcxIEBACiAjaW5jbHVkZSAicWdyYXBoaWNzd2Vidmlldy5oIgogCiAjaW5jbHVkZSAi
cXdlYmZyYW1lLmgiCisjaW5jbHVkZSAicXdlYmZyYW1lX3AuaCIKICNpbmNsdWRlICJxd2VicGFn
ZS5oIgogI2luY2x1ZGUgInF3ZWJwYWdlX3AuaCIKICNpbmNsdWRlICJRV2ViUGFnZUNsaWVudC5o
IgotI2luY2x1ZGUgPFF0R3VpL1FHcmFwaGljc1NjZW5lPgotI2luY2x1ZGUgPFF0R3VpL1FHcmFw
aGljc1ZpZXc+CisjaW5jbHVkZSA8RnJhbWVWaWV3Lmg+CisjaW5jbHVkZSA8UXRDb3JlL3FzaGFy
ZWRwb2ludGVyLmg+CisjaW5jbHVkZSA8UXRDb3JlL3F0aW1lci5oPgogI2luY2x1ZGUgPFF0R3Vp
L3FhcHBsaWNhdGlvbi5oPgorI2luY2x1ZGUgPFF0R3VpL3FncmFwaGljc3NjZW5lLmg+CiAjaW5j
bHVkZSA8UXRHdWkvcWdyYXBoaWNzc2NlbmVldmVudC5oPgorI2luY2x1ZGUgPFF0R3VpL3FncmFw
aGljc3ZpZXcuaD4KKyNpbmNsdWRlIDxRdEd1aS9xcGl4bWFwY2FjaGUuaD4KICNpbmNsdWRlIDxR
dEd1aS9xc3R5bGVvcHRpb24uaD4KICNpZiBkZWZpbmVkKFFfV1NfWDExKQogI2luY2x1ZGUgPFFY
MTFJbmZvPgogI2VuZGlmCisjaW5jbHVkZSA8U2V0dGluZ3MuaD4KIAorI2lmIFVTRShBQ0NFTEVS
QVRFRF9DT01QT1NJVElORykKKworLy8gdGhlIG92ZXJsYXkgaXMgaGVyZSBmb3Igb25lIHJlYXNv
biBvbmx5OiB0byBoYXZlIHRoZSBzY3JvbGwtYmFycyBhbmQgb3RoZXIKKy8vIGV4dHJhIFVJIGVs
ZW1lbnRzIGFwcGVhciBvbiB0b3Agb2YgYW55IFFHcmFwaGljc0l0ZW1zIGNyZWF0ZWQgYnkgQ1NT
IGNvbXBvc2l0aW5nIGxheWVycworY2xhc3MgUUdyYXBoaWNzV2ViVmlld092ZXJsYXkgOiBwdWJs
aWMgUUdyYXBoaWNzSXRlbSB7CisgICAgcHVibGljOgorICAgIFFHcmFwaGljc1dlYlZpZXdPdmVy
bGF5KFFHcmFwaGljc1dlYlZpZXcqIHZpZXcpCisgICAgICAgICAgICA6UUdyYXBoaWNzSXRlbSh2
aWV3KQorICAgICAgICAgICAgLCBxKHZpZXcpCisgICAgeworICAgICAgICBzZXRQb3MoMCwgMCk7
CisgICAgICAgIHNldEZsYWcoUUdyYXBoaWNzSXRlbTo6SXRlbVVzZXNFeHRlbmRlZFN0eWxlT3B0
aW9uLCB0cnVlKTsKKyAgICAgICAgc2V0Q2FjaGVNb2RlKFFHcmFwaGljc0l0ZW06OkRldmljZUNv
b3JkaW5hdGVDYWNoZSk7CisgICAgfQorCisgICAgUVJlY3RGIGJvdW5kaW5nUmVjdCgpIGNvbnN0
CisgICAgeworICAgICAgICByZXR1cm4gcS0+Ym91bmRpbmdSZWN0KCk7CisgICAgfQorCisgICAg
dm9pZCBwYWludChRUGFpbnRlciogcGFpbnRlciwgY29uc3QgUVN0eWxlT3B0aW9uR3JhcGhpY3NJ
dGVtKiBvcHRpb25zLCBRV2lkZ2V0KikKKyAgICB7CisgICAgICAgIHEtPnBhZ2UoKS0+bWFpbkZy
YW1lKCktPnJlbmRlcihwYWludGVyLCBzdGF0aWNfY2FzdDxRV2ViRnJhbWU6OlJlbmRlckxheWVy
PihRV2ViRnJhbWU6OkFsbExheWVycyYoflFXZWJGcmFtZTo6Q29udGVudHNMYXllcikpLCBvcHRp
b25zLT5leHBvc2VkUmVjdC50b1JlY3QoKSk7CisgICAgfQorCisgICAgZnJpZW5kIGNsYXNzIFFH
cmFwaGljc1dlYlZpZXc7CisgICAgUUdyYXBoaWNzV2ViVmlldyogcTsKK307CisKKyNlbmRpZgor
CiBjbGFzcyBRR3JhcGhpY3NXZWJWaWV3UHJpdmF0ZSA6IHB1YmxpYyBRV2ViUGFnZUNsaWVudCB7
CiBwdWJsaWM6CiAgICAgUUdyYXBoaWNzV2ViVmlld1ByaXZhdGUoUUdyYXBoaWNzV2ViVmlldyog
cGFyZW50KQogICAgICAgICA6IHEocGFyZW50KQogICAgICAgICAsIHBhZ2UoMCkKLSAgICB7fQor
I2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKKyAgICAgICAgLCByb290R3JhcGhpY3NM
YXllcigwKQorICAgICAgICAsIHNob3VsZFN5bmModHJ1ZSkKKyNlbmRpZgorICAgIHsKKyNpZiBV
U0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCisgICAgICAgIC8vIHRoZSBvdmVybGF5IGFuZCBz
dGF5cyBhbGl2ZSBmb3IgdGhlIGxpZmV0aW1lIG9mCisgICAgICAgIC8vIHRoaXMgUUdyYXBoaWNz
V2ViVmlldyBhcyB0aGUgc2Nyb2xsYmFycyBhcmUgbmVlZGVkIHdoZW4gdGhlcmUncyBubyBjb21w
b3NpdGluZworICAgICAgICBxLT5zZXRGbGFnKFFHcmFwaGljc0l0ZW06Okl0ZW1Vc2VzRXh0ZW5k
ZWRTdHlsZU9wdGlvbik7CisjZW5kaWYKKyAgICB9CiAKICAgICB2aXJ0dWFsIH5RR3JhcGhpY3NX
ZWJWaWV3UHJpdmF0ZSgpOwogICAgIHZpcnR1YWwgdm9pZCBzY3JvbGwoaW50IGR4LCBpbnQgZHks
IGNvbnN0IFFSZWN0Jik7CkBAIC02MSwxNiArMTA4LDk3IEBACiAKICAgICB2aXJ0dWFsIFFPYmpl
Y3QqIHBsdWdpblBhcmVudCgpIGNvbnN0OwogCisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lU
SU5HKQorICAgIHZpcnR1YWwgdm9pZCBzZXRSb290R3JhcGhpY3NMYXllcihRR3JhcGhpY3NJdGVt
KiBsYXllcik7CisgICAgdmlydHVhbCB2b2lkIG1hcmtGb3JTeW5jKGJvb2wgc2NoZWR1bGVTeW5j
KTsKKyAgICB2b2lkIHVwZGF0ZUNvbXBvc2l0aW5nU2Nyb2xsUG9zaXRpb24oKTsKKyNlbmRpZgor
CisgICAgdm9pZCBzeW5jTGF5ZXJzKCk7CiAgICAgdm9pZCBfcV9kb0xvYWRGaW5pc2hlZChib29s
IHN1Y2Nlc3MpOwogCiAgICAgUUdyYXBoaWNzV2ViVmlldyogcTsKICAgICBRV2ViUGFnZSogcGFn
ZTsKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCisgICAgUUdyYXBoaWNzSXRlbSog
cm9vdEdyYXBoaWNzTGF5ZXI7CisKKyAgICAvLyB0aGUgb3ZlcmxheSBnZXRzIGluc3RhbnRpYXRl
ZCB3aGVuIHRoZSByb290IGxheWVyIGlzIGF0dGFjaGVkLCBhbmQgZ2V0IGRlbGV0ZWQgd2hlbiBp
dCdzIGRldGFjaGVkCisgICAgUVNoYXJlZFBvaW50ZXI8UUdyYXBoaWNzV2ViVmlld092ZXJsYXk+
IG92ZXJsYXk7CisKKyAgICAvLyB3ZSBuZWVkIHRvIHN5bmMgdGhlIGxheWVycyBpZiB3ZSBnZXQg
YSBzcGVjaWFsIGNhbGwgZnJvbSB0aGUgV2ViQ29yZQorICAgIC8vIGNvbXBvc2l0b3IgdGVsbGlu
ZyB1cyB0byBkbyBzby4gV2UnbGwgZ2V0IHRoYXQgY2FsbCBmcm9tIENocm9tZUNsaWVudFF0Cisg
ICAgYm9vbCBzaG91bGRTeW5jOworCisgICAgLy8gd2UgbmVlZCB0byBwdXQgdGhlIHJvb3QgZ3Jh
cGhpY3MgbGF5ZXIgYmVoaW5kIHRoZSBvdmVybGF5ICh3aGljaCBjb250YWlucyB0aGUgc2Nyb2xs
YmFyKQorICAgIGVudW0geyBSb290R3JhcGhpY3NMYXllclpWYWx1ZSwgT3ZlcmxheVpWYWx1ZSB9
OworI2VuZGlmCiB9OwogCiBRR3JhcGhpY3NXZWJWaWV3UHJpdmF0ZTo6flFHcmFwaGljc1dlYlZp
ZXdQcml2YXRlKCkKIHsKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCisgICAgaWYg
KHJvb3RHcmFwaGljc0xheWVyKSB7CisgICAgICAgIC8vIHdlIGRvbid0IG5lZWQgdG8gZGVsZXRl
IHRoZSByb290IGdyYXBoaWNzIGxheWVyCisgICAgICAgIC8vIFRoZSBsaWZlY3ljbGUgaXMgbWFu
YWdlZCBpbiBHcmFwaGljc0xheWVyUXQuY3BwCisgICAgICAgIHJvb3RHcmFwaGljc0xheWVyLT5z
ZXRQYXJlbnRJdGVtKDApOworICAgICAgICBxLT5zY2VuZSgpLT5yZW1vdmVJdGVtKHJvb3RHcmFw
aGljc0xheWVyKTsKKyAgICB9CisjZW5kaWYKIH0KIAorI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01Q
T1NJVElORykKK3ZvaWQgUUdyYXBoaWNzV2ViVmlld1ByaXZhdGU6OnNldFJvb3RHcmFwaGljc0xh
eWVyKFFHcmFwaGljc0l0ZW0qIGxheWVyKQoreworICAgIGlmIChyb290R3JhcGhpY3NMYXllcikg
eworICAgICAgICByb290R3JhcGhpY3NMYXllci0+c2V0UGFyZW50SXRlbSgwKTsKKyAgICAgICAg
cS0+c2NlbmUoKS0+cmVtb3ZlSXRlbShyb290R3JhcGhpY3NMYXllcik7CisgICAgICAgIFFXZWJG
cmFtZVByaXZhdGU6OmNvcmUocS0+cGFnZSgpLT5tYWluRnJhbWUoKSktPnZpZXcoKS0+c3luY0Nv
bXBvc2l0aW5nU3RhdGVSZWN1cnNpdmUoKTsKKyAgICB9CisKKyAgICByb290R3JhcGhpY3NMYXll
ciA9IGxheWVyOworCisgICAgaWYgKGxheWVyKSB7CisgICAgICAgIGxheWVyLT5zZXRGbGFnKFFH
cmFwaGljc0l0ZW06Okl0ZW1DbGlwc0NoaWxkcmVuVG9TaGFwZSwgdHJ1ZSk7CisgICAgICAgIGxh
eWVyLT5zZXRQYXJlbnRJdGVtKHEpOworICAgICAgICBsYXllci0+c2V0WlZhbHVlKFJvb3RHcmFw
aGljc0xheWVyWlZhbHVlKTsKKyAgICAgICAgaWYgKCFvdmVybGF5KSB7CisgICAgICAgICAgICBv
dmVybGF5ID0gUVNoYXJlZFBvaW50ZXI8UUdyYXBoaWNzV2ViVmlld092ZXJsYXk+KG5ldyBRR3Jh
cGhpY3NXZWJWaWV3T3ZlcmxheShxKSk7CisgICAgICAgICAgICBvdmVybGF5LT5zZXRaVmFsdWUo
T3ZlcmxheVpWYWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgdXBkYXRlQ29tcG9zaXRpbmdTY3Jv
bGxQb3NpdGlvbigpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIHdlIGRvbid0IGhhdmUgY29t
cG9zaXRpbmcgbGF5ZXJzLCB3ZSBjYW4gcmVuZGVyIHRoZSBzY3JvbGxiYXJzIGFuZCBjb250ZW50
IGluIG9uZSBnbworICAgICAgICBvdmVybGF5LmNsZWFyKCk7CisgICAgfQorfQorCit2b2lkIFFH
cmFwaGljc1dlYlZpZXdQcml2YXRlOjptYXJrRm9yU3luYyhib29sIHNjaGVkdWxlU3luYykKK3sK
KyAgICBzaG91bGRTeW5jID0gdHJ1ZTsKKyAgICBpZiAoc2NoZWR1bGVTeW5jKQorICAgICAgICBR
VGltZXI6OnNpbmdsZVNob3QoMCwgcSwgU0xPVChzeW5jTGF5ZXJzKCkpKTsKK30KKwordm9pZCBR
R3JhcGhpY3NXZWJWaWV3UHJpdmF0ZTo6dXBkYXRlQ29tcG9zaXRpbmdTY3JvbGxQb3NpdGlvbigp
Cit7CisgICAgaWYgKHJvb3RHcmFwaGljc0xheWVyICYmIHEtPnBhZ2UoKSAmJiBxLT5wYWdlKCkt
Pm1haW5GcmFtZSgpKSB7CisgICAgICAgIGNvbnN0IFFQb2ludCBzY3JvbGxQb3NpdGlvbiA9IHEt
PnBhZ2UoKS0+bWFpbkZyYW1lKCktPnNjcm9sbFBvc2l0aW9uKCk7CisgICAgICAgIHJvb3RHcmFw
aGljc0xheWVyLT5zZXRQb3MoLXNjcm9sbFBvc2l0aW9uKTsKKyAgICB9Cit9CisKKyNlbmRpZgor
Cit2b2lkIFFHcmFwaGljc1dlYlZpZXdQcml2YXRlOjpzeW5jTGF5ZXJzKCkKK3sKKyNpZiBVU0Uo
QUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCisgICAgaWYgKHNob3VsZFN5bmMpIHsKKyAgICAgICAg
UVdlYkZyYW1lUHJpdmF0ZTo6Y29yZShxLT5wYWdlKCktPm1haW5GcmFtZSgpKS0+dmlldygpLT5z
eW5jQ29tcG9zaXRpbmdTdGF0ZVJlY3Vyc2l2ZSgpOworICAgICAgICBzaG91bGRTeW5jID0gZmFs
c2U7CisgICAgfQorI2VuZGlmCit9CisKIHZvaWQgUUdyYXBoaWNzV2ViVmlld1ByaXZhdGU6Ol9x
X2RvTG9hZEZpbmlzaGVkKGJvb2wgc3VjY2VzcykKIHsKICAgICAvLyBJZiB0aGUgcGFnZSBoYWQg
bm8gdGl0bGUsIHN0aWxsIG1ha2Ugc3VyZSBpdCBnZXRzIHRoZSBzaWduYWwKQEAgLTgzLDExICsy
MTEsMTggQEAKIHZvaWQgUUdyYXBoaWNzV2ViVmlld1ByaXZhdGU6OnNjcm9sbChpbnQgZHgsIGlu
dCBkeSwgY29uc3QgUVJlY3QmIHJlY3RUb1Njcm9sbCkKIHsKICAgICBxLT5zY3JvbGwocXJlYWwo
ZHgpLCBxcmVhbChkeSksIFFSZWN0RihyZWN0VG9TY3JvbGwpKTsKKyNpZiBVU0UoQUNDRUxFUkFU
RURfQ09NUE9TSVRJTkcpCisgICAgdXBkYXRlQ29tcG9zaXRpbmdTY3JvbGxQb3NpdGlvbigpOwor
I2VuZGlmCiB9CiAKIHZvaWQgUUdyYXBoaWNzV2ViVmlld1ByaXZhdGU6OnVwZGF0ZShjb25zdCBR
UmVjdCAmIGRpcnR5UmVjdCkKIHsKICAgICBxLT51cGRhdGUoUVJlY3RGKGRpcnR5UmVjdCkpOwor
I2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKKyAgICBpZiAob3ZlcmxheSkKKyAgICAg
ICAgb3ZlcmxheS0+dXBkYXRlKFFSZWN0RihkaXJ0eVJlY3QpKTsKKyNlbmRpZgogfQogCiAKQEAg
LTI0OCw2ICszODMsNyBAQAogICAgIHNldEFjY2VwdFRvdWNoRXZlbnRzKHRydWUpOwogI2VuZGlm
CiAgICAgc2V0Rm9jdXNQb2xpY3koUXQ6OlN0cm9uZ0ZvY3VzKTsKKyAgICBzZXRGbGFnKFFHcmFw
aGljc0l0ZW06Okl0ZW1DbGlwc0NoaWxkcmVuVG9TaGFwZSwgdHJ1ZSk7CiB9CiAKIC8qIQpAQCAt
Mjk3LDcgKzQzMywxMiBAQAogKi8KIHZvaWQgUUdyYXBoaWNzV2ViVmlldzo6cGFpbnQoUVBhaW50
ZXIqIHBhaW50ZXIsIGNvbnN0IFFTdHlsZU9wdGlvbkdyYXBoaWNzSXRlbSogb3B0aW9uLCBRV2lk
Z2V0KikKIHsKLSAgICBwYWdlKCktPm1haW5GcmFtZSgpLT5yZW5kZXIocGFpbnRlciwgb3B0aW9u
LT5leHBvc2VkUmVjdC50b1JlY3QoKSk7CisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5H
KQorICAgIHBhZ2UoKS0+bWFpbkZyYW1lKCktPnJlbmRlcihwYWludGVyLCBkLT5vdmVybGF5ID8g
UVdlYkZyYW1lOjpDb250ZW50c0xheWVyIDogUVdlYkZyYW1lOjpBbGxMYXllcnMsIG9wdGlvbi0+
ZXhwb3NlZFJlY3QudG9BbGlnbmVkUmVjdCgpKTsKKyAgICBkLT5zeW5jTGF5ZXJzKCk7CisjZWxz
ZQorICAgIHBhZ2UoKS0+bWFpbkZyYW1lKCktPnJlbmRlcihwYWludGVyLCBRV2ViRnJhbWU6OkFs
bExheWVycywgb3B0aW9uLT5leHBvc2VkUmVjdC50b1JlY3QoKSk7CisjZW5kaWYKIH0KIAogLyoh
IFxyZWltcApAQCAtNDI1LDYgKzU2NiwxMCBAQAogICAgIGQtPnBhZ2UgPSBwYWdlOwogICAgIGlm
ICghZC0+cGFnZSkKICAgICAgICAgcmV0dXJuOworI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJ
VElORykKKyAgICBpZiAoZC0+b3ZlcmxheSkKKyAgICAgICAgZC0+b3ZlcmxheS0+cHJlcGFyZUdl
b21ldHJ5Q2hhbmdlKCk7CisjZW5kaWYKICAgICBkLT5wYWdlLT5kLT5jbGllbnQgPSBkOyAvLyBz
ZXQgdGhlIHBhZ2UgY2xpZW50CiAKICAgICBRU2l6ZSBzaXplID0gZ2VvbWV0cnkoKS5zaXplKCku
dG9TaXplKCk7CkBAIC01MjgsNiArNjczLDEyIEBACiAqLwogdm9pZCBRR3JhcGhpY3NXZWJWaWV3
Ojp1cGRhdGVHZW9tZXRyeSgpCiB7CisKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcp
CisgICAgaWYgKGQtPm92ZXJsYXkpCisgICAgICAgIGQtPm92ZXJsYXktPnByZXBhcmVHZW9tZXRy
eUNoYW5nZSgpOworI2VuZGlmCisKICAgICBRR3JhcGhpY3NXaWRnZXQ6OnVwZGF0ZUdlb21ldHJ5
KCk7CiAKICAgICBpZiAoIWQtPnBhZ2UpCkBAIC01NDMsNiArNjk0LDExIEBACiB7CiAgICAgUUdy
YXBoaWNzV2lkZ2V0OjpzZXRHZW9tZXRyeShyZWN0KTsKIAorI2lmIFVTRShBQ0NFTEVSQVRFRF9D
T01QT1NJVElORykKKyAgICBpZiAoZC0+b3ZlcmxheSkKKyAgICAgICAgZC0+b3ZlcmxheS0+cHJl
cGFyZUdlb21ldHJ5Q2hhbmdlKCk7CisjZW5kaWYKKwogICAgIGlmICghZC0+cGFnZSkKICAgICAg
ICAgcmV0dXJuOwogCkluZGV4OiBXZWJLaXQvcXQvQXBpL3F3ZWJzZXR0aW5ncy5oCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFdlYktpdC9xdC9BcGkvcXdlYnNldHRpbmdzLmgJKHJldmlzaW9uIDUzNDI3KQorKysg
V2ViS2l0L3F0L0FwaS9xd2Vic2V0dGluZ3MuaAkod29ya2luZyBjb3B5KQpAQCAtNjgsNyArNjgs
OCBAQAogI2VuZGlmCiAgICAgICAgIExvY2FsQ29udGVudENhbkFjY2Vzc1JlbW90ZVVybHMsCiAg
ICAgICAgIERuc1ByZWZldGNoRW5hYmxlZCwKLSAgICAgICAgWFNTQXVkaXRvckVuYWJsZWQKKyAg
ICAgICAgWFNTQXVkaXRvckVuYWJsZWQsCisgICAgICAgIEFjY2VsZXJhdGVkQ29tcG9zaXRpbmdF
bmFibGVkCiAgICAgfTsKICAgICBlbnVtIFdlYkdyYXBoaWMgewogICAgICAgICBNaXNzaW5nSW1h
Z2VHcmFwaGljLApJbmRleDogV2ViS2l0L3F0L0FwaS9xZ3JhcGhpY3N3ZWJ2aWV3LmgKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gV2ViS2l0L3F0L0FwaS9xZ3JhcGhpY3N3ZWJ2aWV3LmgJKHJldmlzaW9uIDUzNDI3
KQorKysgV2ViS2l0L3F0L0FwaS9xZ3JhcGhpY3N3ZWJ2aWV3LmgJKHdvcmtpbmcgY29weSkKQEAg
LTEzNCw2ICsxMzQsOSBAQAogCiBwcml2YXRlOgogICAgIFFfUFJJVkFURV9TTE9UKGQsIHZvaWQg
X3FfZG9Mb2FkRmluaXNoZWQoYm9vbCBzdWNjZXNzKSkKKyAgICAvLyB3ZSBkb24ndCB3YW50IHRv
IGNoYW5nZSB0aGUgbW9jIGJhc2VkIG9uIFVTRSgpIG1hY3JvLCBzbyB0aGlzIGZ1bmN0aW9uIGlz
IGhlcmUKKyAgICAvLyBidXQgd2lsbCBiZSBlbXB0eSBpZiBBQ0NMRVJBVEVEX0NPTVBPU0lUSU5H
IGlzIGRpc2FibGVkCisgICAgUV9QUklWQVRFX1NMT1QoZCwgdm9pZCBzeW5jTGF5ZXJzKCkpCiAK
ICAgICBRR3JhcGhpY3NXZWJWaWV3UHJpdmF0ZSogY29uc3QgZDsKICAgICBmcmllbmQgY2xhc3Mg
UUdyYXBoaWNzV2ViVmlld1ByaXZhdGU7CkluZGV4OiBXZWJLaXQvcXQvQXBpL3F3ZWJzZXR0aW5n
cy5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0L3F0L0FwaS9xd2Vic2V0dGluZ3MuY3BwCShyZXZp
c2lvbiA1MzQyNykKKysrIFdlYktpdC9xdC9BcGkvcXdlYnNldHRpbmdzLmNwcAkod29ya2luZyBj
b3B5KQpAQCAtMTUyLDcgKzE1MiwxMiBAQAogICAgICAgICB2YWx1ZSA9IGF0dHJpYnV0ZXMudmFs
dWUoUVdlYlNldHRpbmdzOjpKYXZhc2NyaXB0RW5hYmxlZCwKICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgZ2xvYmFsLT5hdHRyaWJ1dGVzLnZhbHVlKFFXZWJTZXR0aW5nczo6
SmF2YXNjcmlwdEVuYWJsZWQpKTsKICAgICAgICAgc2V0dGluZ3MtPnNldEphdmFTY3JpcHRFbmFi
bGVkKHZhbHVlKTsKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCisgICAgICAgIHZh
bHVlID0gYXR0cmlidXRlcy52YWx1ZShRV2ViU2V0dGluZ3M6OkFjY2VsZXJhdGVkQ29tcG9zaXRp
bmdFbmFibGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWwt
PmF0dHJpYnV0ZXMudmFsdWUoUVdlYlNldHRpbmdzOjpBY2NlbGVyYXRlZENvbXBvc2l0aW5nRW5h
YmxlZCkpOwogCisgICAgICAgIHNldHRpbmdzLT5zZXRBY2NlbGVyYXRlZENvbXBvc2l0aW5nRW5h
YmxlZCh2YWx1ZSk7CisjZW5kaWYKICAgICAgICAgdmFsdWUgPSBhdHRyaWJ1dGVzLnZhbHVlKFFX
ZWJTZXR0aW5nczo6SmF2YXNjcmlwdENhbk9wZW5XaW5kb3dzLAogICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBnbG9iYWwtPmF0dHJpYnV0ZXMudmFsdWUoUVdlYlNldHRpbmdz
OjpKYXZhc2NyaXB0Q2FuT3BlbldpbmRvd3MpKTsKICAgICAgICAgc2V0dGluZ3MtPnNldEphdmFT
Y3JpcHRDYW5PcGVuV2luZG93c0F1dG9tYXRpY2FsbHkodmFsdWUpOwpAQCAtMzg5LDYgKzM5NCw3
IEBACiAgICAgZC0+YXR0cmlidXRlcy5pbnNlcnQoUVdlYlNldHRpbmdzOjpPZmZsaW5lV2ViQXBw
bGljYXRpb25DYWNoZUVuYWJsZWQsIGZhbHNlKTsKICAgICBkLT5hdHRyaWJ1dGVzLmluc2VydChR
V2ViU2V0dGluZ3M6OkxvY2FsU3RvcmFnZUVuYWJsZWQsIGZhbHNlKTsKICAgICBkLT5hdHRyaWJ1
dGVzLmluc2VydChRV2ViU2V0dGluZ3M6OkxvY2FsQ29udGVudENhbkFjY2Vzc1JlbW90ZVVybHMs
IGZhbHNlKTsKKyAgICBkLT5hdHRyaWJ1dGVzLmluc2VydChRV2ViU2V0dGluZ3M6OkFjY2VsZXJh
dGVkQ29tcG9zaXRpbmdFbmFibGVkLCBmYWxzZSk7CiAgICAgZC0+b2ZmbGluZVN0b3JhZ2VEZWZh
dWx0UXVvdGEgPSA1ICogMTAyNCAqIDEwMjQ7CiAgICAgZC0+ZGVmYXVsdFRleHRFbmNvZGluZyA9
IFFMYXRpbjFTdHJpbmcoImlzby04ODU5LTEiKTsKIH0KSW5kZXg6IFdlYktpdC9xdC9BcGkvcXdl
YnZpZXcuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdC9xdC9BcGkvcXdlYnZpZXcuY3BwCShyZXZp
c2lvbiA1MzQyNykKKysrIFdlYktpdC9xdC9BcGkvcXdlYnZpZXcuY3BwCSh3b3JraW5nIGNvcHkp
CkBAIC0yMiwxMCArMjIsMTEgQEAKICNpbmNsdWRlICJjb25maWcuaCIKICNpbmNsdWRlICJxd2Vi
dmlldy5oIgogCisjaW5jbHVkZSAiUGFnZS5oIgogI2luY2x1ZGUgIlFXZWJQYWdlQ2xpZW50Lmgi
CisjaW5jbHVkZSAiU2V0dGluZ3MuaCIKICNpbmNsdWRlICJxd2ViZnJhbWUuaCIKICNpbmNsdWRl
ICJxd2VicGFnZV9wLmgiCi0KICNpbmNsdWRlICJxYml0bWFwLmgiCiAjaW5jbHVkZSAicWV2ZW50
LmgiCiAjaW5jbHVkZSAicXBhaW50ZXIuaCIKQEAgLTI0Nyw2ICsyNDgsOSBAQAogICAgICAgICAg
ICAgICAgIHRoaXMsIFNMT1QoX3FfcGFnZURlc3Ryb3llZCgpKSk7CiAgICAgfQogICAgIHNldEF0
dHJpYnV0ZShRdDo6V0FfT3BhcXVlUGFpbnRFdmVudCwgZC0+cGFnZSk7CisjaWYgVVNFKEFDQ0VM
RVJBVEVEX0NPTVBPU0lUSU5HKQorICAgIGQtPnBhZ2UtPmQtPnBhZ2UtPnNldHRpbmdzKCktPnNl
dEFjY2VsZXJhdGVkQ29tcG9zaXRpbmdFbmFibGVkKGZhbHNlKTsKKyNlbmRpZgogICAgIHVwZGF0
ZSgpOwogfQogCkluZGV4OiBXZWJDb3JlL1dlYkNvcmUucHJvCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNv
cmUvV2ViQ29yZS5wcm8JKHJldmlzaW9uIDUzNDI3KQorKysgV2ViQ29yZS9XZWJDb3JlLnBybwko
d29ya2luZyBjb3B5KQpAQCAtMjcwNyw2ICsyNzA3LDE5IEBACiAgICAgICAgICAgICBwbHVnaW5z
L3dpbi9QYWludEhvb2tzLmFzbQogICAgIH0KIH0KK2NvbnRhaW5zKERFRklORVMsIFdURl9VU0Vf
QUNDRUxFUkFURURfQ09NUE9TSVRJTkcpIHsKK0hFQURFUlMgKz0gXAorICAgIHJlbmRlcmluZy9S
ZW5kZXJMYXllckJhY2tpbmcuaCBcCisgICAgcmVuZGVyaW5nL1JlbmRlckxheWVyQ29tcG9zaXRv
ci5oIFwKKyAgICBwbGF0Zm9ybS9ncmFwaGljcy9HcmFwaGljc0xheWVyLmggXAorICAgIHBsYXRm
b3JtL2dyYXBoaWNzL0dyYXBoaWNzTGF5ZXJDbGllbnQuaCBcCisgICAgcGxhdGZvcm0vZ3JhcGhp
Y3MvcXQvR3JhcGhpY3NMYXllclF0LmgKK1NPVVJDRVMgKz0gXAorICAgIHBsYXRmb3JtL2dyYXBo
aWNzL0dyYXBoaWNzTGF5ZXIuY3BwIFwKKyAgICBwbGF0Zm9ybS9ncmFwaGljcy9xdC9HcmFwaGlj
c0xheWVyUXQuY3BwIFwKKyAgICByZW5kZXJpbmcvUmVuZGVyTGF5ZXJCYWNraW5nLmNwcCBcCisg
ICAgcmVuZGVyaW5nL1JlbmRlckxheWVyQ29tcG9zaXRvci5jcHAKK30KIAogc3ltYmlhbiB7CiAg
ICAgc2hhcmVkIHsKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vcXQvUVdlYlBhZ2VDbGllbnQuaAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL3F0L1FXZWJQYWdlQ2xpZW50LmgJKHJldmlz
aW9uIDUzNDI3KQorKysgV2ViQ29yZS9wbGF0Zm9ybS9xdC9RV2ViUGFnZUNsaWVudC5oCSh3b3Jr
aW5nIGNvcHkpCkBAIC0yOSw4ICsyOSw5IEBACiAjaWZuZGVmIFFUX05PX0NVUlNPUgogI2luY2x1
ZGUgPFFDdXJzb3I+CiAjZW5kaWYKKwogI2luY2x1ZGUgPFFSZWN0PgotCitjbGFzcyBRR3JhcGhp
Y3NJdGVtOwogY2xhc3MgUVdlYlBhZ2VDbGllbnQgewogcHVibGljOgogICAgIHZpcnR1YWwgflFX
ZWJQYWdlQ2xpZW50KCkgeyB9CkBAIC0zOSw2ICs0MCwxNiBAQAogICAgIHZpcnR1YWwgdm9pZCB1
cGRhdGUoY29uc3QgUVJlY3QmKSA9IDA7CiAgICAgdmlydHVhbCB2b2lkIHNldElucHV0TWV0aG9k
RW5hYmxlZChib29sIGVuYWJsZSkgPSAwOwogICAgIHZpcnR1YWwgYm9vbCBpbnB1dE1ldGhvZEVu
YWJsZWQoKSBjb25zdCA9IDA7CisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorICAg
IC8vIHRoaXMgZ2V0cyBjYWxsZWQgd2hlbiB3ZSBzdGFydC9zdG9wIGNvbXBvc2l0aW5nLgorICAg
IHZpcnR1YWwgdm9pZCBzZXRSb290R3JhcGhpY3NMYXllcihRR3JhcGhpY3NJdGVtKiBsYXllcikg
e30KKworICAgIC8vIHRoaXMgZ2V0cyBjYWxsZWQgd2hlbiB0aGUgY29tcG9zaXRvciB3YW50cyB1
cyB0byBzeW5jIHRoZSBsYXllcnMKKyAgICAvLyBpZiBzY2hlZHVsZVN5bmMgaXMgdHJ1ZSwgd2Ug
c2NoZWR1bGUgYSBzeW5jIG91cnNlbHZlcy4gb3RoZXJ3aXNlLAorICAgIC8vIHdlIHdhaXQgZm9y
IHRoZSBuZXh0IHVwZGF0ZSBhbmQgc3luYyB0aGUgbGF5ZXJzIHRoZW4uCisgICAgdmlydHVhbCB2
b2lkIG1hcmtGb3JTeW5jKGJvb2wgc2NoZWR1bGVTeW5jID0gZmFsc2UpIHt9CisjZW5kaWYKKwog
I2lmIFFUX1ZFUlNJT04gPj0gMHgwNDA2MDAKICAgICB2aXJ0dWFsIHZvaWQgc2V0SW5wdXRNZXRo
b2RIaW50KFF0OjpJbnB1dE1ldGhvZEhpbnQgaGludCwgYm9vbCBlbmFibGUpID0gMDsKICNlbmRp
ZgpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9xdC9HcmFwaGljc0xheWVyUXQuY3Bw
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIC9kZXYvbnVsbAorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9x
dC9HcmFwaGljc0xheWVyUXQuY3BwCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDExMjUgQEAKKy8q
CisgICAgQ29weXJpZ2h0IChDKSAyMDA5IE5va2lhIENvcnBvcmF0aW9uIGFuZC9vciBpdHMgc3Vi
c2lkaWFyeSgtaWVzKQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBj
YW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMg
b2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNo
ZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAy
IG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgor
CisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2ls
bCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4g
dGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBG
T1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExpYnJhcnkgR2VuZXJh
bCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZl
IHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5z
ZQorICAgIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIu
ICBJZiBub3QsIHdyaXRlIHRvCisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5j
LiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAgICBCb3N0b24sIE1BIDAyMTEw
LTEzMDEsIFVTQS4KKyovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJHcmFwaGlj
c0xheWVyUXQuaCIKKworI2luY2x1ZGUgIkN1cnJlbnRUaW1lLmgiCisjaW5jbHVkZSAiRmxvYXRS
ZWN0LmgiCisjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCisjaW5jbHVkZSAiSW1hZ2UuaCIK
KyNpbmNsdWRlICJSZWZDb3VudGVkLmgiCisjaW5jbHVkZSAiVHJhbnNsYXRlVHJhbnNmb3JtT3Bl
cmF0aW9uLmgiCisjaW5jbHVkZSAiVW5pdEJlemllci5oIgorI2luY2x1ZGUgPFF0Q29yZS9xYWJz
dHJhY3RhbmltYXRpb24uaD4KKyNpbmNsdWRlIDxRdENvcmUvcWRlYnVnLmg+CisjaW5jbHVkZSA8
UXRDb3JlL3FzZXQuaD4KKyNpbmNsdWRlIDxRdENvcmUvcXRpbWVyLmg+CisjaW5jbHVkZSA8UXRH
dWkvcWJpdG1hcC5oPgorI2luY2x1ZGUgPFF0R3VpL3Fjb2xvci5oPgorI2luY2x1ZGUgPFF0R3Vp
L3FncmFwaGljc2VmZmVjdC5oPgorI2luY2x1ZGUgPFF0R3VpL3FncmFwaGljc2l0ZW0uaD4KKyNp
bmNsdWRlIDxRdEd1aS9xZ3JhcGhpY3NzY2VuZS5oPgorI2luY2x1ZGUgPFF0R3VpL3FtYXRyaXg0
eDQuaD4KKyNpbmNsdWRlIDxRdEd1aS9xcGFpbnRlci5oPgorI2luY2x1ZGUgPFF0R3VpL3FwYWxl
dHRlLmg+CisjaW5jbHVkZSA8UXRHdWkvcXBpeG1hcC5oPgorI2luY2x1ZGUgPFF0R3VpL3FzdHls
ZW9wdGlvbi5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNzIEdyYXBoaWNzTGF5ZXJR
dEltcGwgOiBwdWJsaWMgUUdyYXBoaWNzT2JqZWN0IHsKKyAgICBRX09CSkVDVAorCitwdWJsaWM6
CisgICAgLy8gdGhpcyBzZXQgb2YgZmxhZ3MgaGVscCB1cyBkZWZlciB3aGljaCBwcm9wZXJ0aWVz
IG9mIHRoZSBsYXllciBoYXZlIGJlZW4KKyAgICAvLyBtb2RpZmllZCBieSB0aGUgY29tcG9zaXRv
ciwgc28gd2UgY2FuIGtub3cgd2hhdCB0byBsb29rIGZvciBpbiB0aGUgbmV4dCBmbHVzaAorICAg
IGVudW0gQ2hhbmdlRmxhZyB7CisgICAgICAgIE5vQ2hhbmdlcyA9ICAgICAgICAgICAgICAgICAw
LAorICAgICAgICBDaGlsZHJlbkNoYW5nZSA9ICAgICAgICAgICAgKDFMIDw8IDEpLAorICAgICAg
ICBNYXNrTGF5ZXJDaGFuZ2UgPSAgICAgICAgICAgKDFMIDw8IDIpLAorICAgICAgICBQb3NpdGlv
bkNoYW5nZSA9ICAgICAgICAgICAgKDFMIDw8IDMpLAorICAgICAgICBBbmNob3JQb2ludENoYW5n
ZSA9ICAgICAgICAgKDFMIDw8IDQpLAorICAgICAgICBTaXplQ2hhbmdlICA9ICAgICAgICAgICAg
ICAgKDFMIDw8IDUpLAorICAgICAgICBUcmFuc2Zvcm1DaGFuZ2UgPSAgICAgICAgICAgKDFMIDw8
IDYpLAorICAgICAgICBDb250ZW50Q2hhbmdlID0gICAgICAgICAgICAgKDFMIDw8IDcpLAorICAg
ICAgICBHZW9tZXRyeU9yaWVudGF0aW9uQ2hhbmdlID0gKDFMIDw8IDgpLAorICAgICAgICBDb250
ZW50c09yaWVudGF0aW9uQ2hhbmdlID0gKDFMIDw8IDkpLAorICAgICAgICBPcGFjaXR5Q2hhbmdl
ID0gICAgICAgICAgICAgKDFMIDw8IDEwKSwKKyAgICAgICAgQ29udGVudHNSZWN0Q2hhbmdlID0g
ICAgICAgICgxTCA8PCAxMSksCisgICAgICAgIFByZXNlcnZlczNEQ2hhbmdlID0gICAgICAgICAo
MUwgPDwgMTIpLAorICAgICAgICBNYXNrc1RvQm91bmRzQ2hhbmdlID0gICAgICAgKDFMIDw8IDEz
KSwKKyAgICAgICAgRHJhd3NDb250ZW50Q2hhbmdlID0gICAgICAgICgxTCA8PCAxNCksCisgICAg
ICAgIENvbnRlbnRzT3BhcXVlQ2hhbmdlID0gICAgICAoMUwgPDwgMTUpLAorICAgICAgICBCYWNr
ZmFjZVZpc2liaWxpdHlDaGFuZ2UgPSAgKDFMIDw8IDE2KSwKKyAgICAgICAgQ2hpbGRyZW5UcmFu
c2Zvcm1DaGFuZ2UgPSAgICgxTCA8PCAxNyksCisgICAgICAgIERpc3BsYXlDaGFuZ2UgPSAgICAg
ICAgICAgICAoMUwgPDwgMTgpLAorICAgICAgICBCYWNrZ3JvdW5kQ29sb3JDaGFuZ2UgPSAgICAg
KDFMIDw8IDE5KSwKKyAgICAgICAgUGFyZW50Q2hhbmdlID0gICAgICAgICAgICAgICgxTCA8PCAy
MCksCisgICAgICAgIERpc3RyaWJ1dGVzT3BhY2l0eUNoYW5nZSA9ICAoMUwgPDwgMjEpCisgICAg
fTsKKworICAgIC8vIHRoZSBjb21wb3NpdG9yIGxldHMgdXMgc3BlY2lhbC1jYXNlIGltYWdlcyBh
bmQgY29sb3JzLCBzbyB3ZSB0cnkgdG8gZG8gc28KKyAgICBlbnVtIFN0YXRpY0NvbnRlbnRUeXBl
IHsgSFRNTENvbnRlbnRUeXBlLCBQaXhtYXBDb250ZW50VHlwZSwgQ29sb3JDb250ZW50VHlwZX07
CisKKyAgICBHcmFwaGljc0xheWVyUXRJbXBsKEdyYXBoaWNzTGF5ZXJRdCogbmV3TGF5ZXIpOwor
ICAgIHZpcnR1YWwgfkdyYXBoaWNzTGF5ZXJRdEltcGwoKTsKKworICAgIC8vIHJlaW1wcyBmcm9t
IFFHcmFwaGljc0l0ZW0KKyAgICB2aXJ0dWFsIFFQYWludGVyUGF0aCBvcGFxdWVBcmVhKCkgY29u
c3Q7CisgICAgdmlydHVhbCBRUmVjdEYgYm91bmRpbmdSZWN0KCkgY29uc3Q7CisgICAgdmlydHVh
bCB2b2lkIHBhaW50KFFQYWludGVyKiBwYWludGVyLCBjb25zdCBRU3R5bGVPcHRpb25HcmFwaGlj
c0l0ZW0qIG9wdGlvbiwgUVdpZGdldCogd2lkZ2V0KTsKKworICAgIC8vIHdlIG1hbmFnZSB0cmFu
c2Zvcm1zIG91cnNlbHZlcyBiZWNhdXNlIHRyYW5zZm9ybS1vcmlnaW4gYWN0cyBkaWZmZXJlbnRs
eSBpbiB3ZWJraXQgYW5kIGluIFF0CisgICAgdm9pZCBzZXRCYXNlVHJhbnNmb3JtKGNvbnN0IFFU
cmFuc2Zvcm0mIHQpOworICAgIHZvaWQgZHJhd0NvbnRlbnRzKFFQYWludGVyKiBwYWludGVyLCBj
b25zdCBRUmVjdEYmIHIsIGJvb2wgbWFzayA9IGZhbHNlKTsKKworICAgIC8vIGxldCB0aGUgY29t
cG9zaXRvci1BUEkgdGVsbCB1cyB3aGljaCBwcm9wZXJ0aWVzIHdlcmUgY2hhbmdlZAorICAgIHZv
aWQgbm90aWZ5Q2hhbmdlKENoYW5nZUZsYWcgY2hhbmdlRmxhZyk7CisKKyAgICAvLyBjYWxsZWQg
d2hlbiB0aGUgY29tcG9zaXRvciBpcyByZWFkeSBmb3IgdXMgdG8gc2hvdyB0aGUgY2hhbmdlcyBv
biBzY3JlZW4KKyAgICAvLyB0aGlzIGlzIGNhbGxlZCBpbmRpcmVjdGx5IGZyb20gQ2hyb21lQ2xp
ZW50UXQ6OnNldE5lZWRzT25lU2hvdERyYXdpbmdTeW5jaHJvbml6YXRpb24KKyAgICAvLyAobWVh
bmluZyB0aGUgc3luYyB3b3VsZCBoYXBwZW4gdG9nZXRoZXIgd2l0aCB0aGUgbmV4dCBkcmF3KQor
ICAgIC8vIG9yIENocm9tZUNsaWVudFF0OjpzY2hlZHVsZUNvbXBvc2l0aW5nTGF5ZXJTeW5jICht
ZWFuaW5nIHRoZSBzeW5jIHdpbGwgaGFwcGVuIEFTQVApCisgICAgdm9pZCBmbHVzaENoYW5nZXMo
Ym9vbCByZWN1cnNpdmUgPSB0cnVlKTsKKworcHVibGljIHNsb3RzOgorICAgIC8vIHdlIG5lZWQg
dG8gbm90aWZ5IHRoZSBjbGllbnQgKGFrYSB0aGUgbGF5ZXIgY29tcG9zaXRvcikgd2hlbiB0aGUg
YW5pbWF0aW9uIGFjdHVhbGx5IHN0YXJ0cworICAgIHZvaWQgbm90aWZ5QW5pbWF0aW9uU3RhcnRl
ZCgpOworCitwdWJsaWM6CisgICAgR3JhcGhpY3NMYXllclF0KiBtX2xheWVyOworCisgICAgUVRy
YW5zZm9ybSBtX2Jhc2VUcmFuc2ZvbTsKKyAgICBib29sIG1fdHJhbnNmb3JtQW5pbWF0aW9uUnVu
bmluZzsKKyAgICBib29sIG9wYWNpdHlBbmltYXRpb25SdW5uaW5nOworCisgICAgc3RydWN0IENv
bnRlbnREYXRhIHsKKyAgICAgICAgUVBpeG1hcCBwaXhtYXA7CisgICAgICAgIFFSZWdpb24gcmVn
aW9uVG9VcGRhdGU7CisgICAgICAgIGJvb2wgdXBkYXRlQWxsOworICAgICAgICBRQ29sb3IgY29u
dGVudHNCYWNrZ3JvdW5kQ29sb3I7CisgICAgICAgIFFDb2xvciBiYWNrZ3JvdW5kQ29sb3I7Cisg
ICAgICAgIFN0YXRpY0NvbnRlbnRUeXBlIGNvbnRlbnRUeXBlOworICAgICAgICBmbG9hdCBvcGFj
aXR5OworICAgICAgICBDb250ZW50RGF0YSgpCisgICAgICAgICAgICAgICAgOiB1cGRhdGVBbGwo
ZmFsc2UpCisgICAgICAgICAgICAgICAgLCBiYWNrZ3JvdW5kQ29sb3IoUUNvbG9yKCkpCisgICAg
ICAgICAgICAgICAgLCBjb250ZW50VHlwZShIVE1MQ29udGVudFR5cGUpCisgICAgICAgICAgICAg
ICAgLCBvcGFjaXR5KDEpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgfTsKKworICAgIENv
bnRlbnREYXRhIG1fcGVuZGluZ0NvbnRlbnQ7CisgICAgQ29udGVudERhdGEgbV9jdXJyZW50Q29u
dGVudDsKKworICAgIENoYW5nZUZsYWcgbV9jaGFuZ2VNYXNrOworCisgICAgUVNpemVGIG1fc2l6
ZTsKKyAgICBRTGlzdDxRV2Vha1BvaW50ZXI8UUFic3RyYWN0QW5pbWF0aW9uPiA+IG1fYW5pbWF0
aW9uczsKKyAgICBRVGltZXIgbV9zdXNwZW5kVGltZXI7CisKKyAgICBzdHJ1Y3QgU3RhdGUgewor
ICAgICAgICBHcmFwaGljc0xheWVyKiBtYXNrTGF5ZXI7CisgICAgICAgIEZsb2F0UG9pbnQgcG9z
OworICAgICAgICBGbG9hdFBvaW50M0QgYW5jaG9yUG9pbnQ7CisgICAgICAgIEZsb2F0U2l6ZSBz
aXplOworICAgICAgICBUcmFuc2Zvcm1hdGlvbk1hdHJpeCB0cmFuc2Zvcm07CisgICAgICAgIFRy
YW5zZm9ybWF0aW9uTWF0cml4IGNoaWxkcmVuVHJhbnNmb3JtOworICAgICAgICBDb2xvciBiYWNr
Z3JvdW5kQ29sb3I7CisgICAgICAgIENvbG9yIGN1cnJlbnRDb2xvcjsKKyAgICAgICAgR3JhcGhp
Y3NMYXllcjo6Q29tcG9zaXRpbmdDb29yZGluYXRlc09yaWVudGF0aW9uIGdlb09yaWVudGF0aW9u
OworICAgICAgICBHcmFwaGljc0xheWVyOjpDb21wb3NpdGluZ0Nvb3JkaW5hdGVzT3JpZW50YXRp
b24gY29udGVudHNPcmllbnRhdGlvbjsKKyAgICAgICAgZmxvYXQgb3BhY2l0eTsKKyAgICAgICAg
UVJlY3QgY29udGVudHNSZWN0OworCisgICAgICAgIGJvb2wgcHJlc2VydmVzM0Q6IDE7CisgICAg
ICAgIGJvb2wgbWFza3NUb0JvdW5kczogMTsKKyAgICAgICAgYm9vbCBkcmF3c0NvbnRlbnQ6IDE7
CisgICAgICAgIGJvb2wgY29udGVudHNPcGFxdWU6IDE7CisgICAgICAgIGJvb2wgYmFja2ZhY2VW
aXNpYmlsaXR5OiAxOworICAgICAgICBib29sIGRpc3RyaWJ1dGVPcGFjaXR5OiAxOworICAgICAg
ICBib29sIGFsaWduOiAyOworICAgICAgICBTdGF0ZSgpIDogbWFza0xheWVyKDApLCBvcGFjaXR5
KDEpLCBwcmVzZXJ2ZXMzRChmYWxzZSksIG1hc2tzVG9Cb3VuZHMoZmFsc2UpLAorICAgICAgICAg
ICAgICAgICAgZHJhd3NDb250ZW50KGZhbHNlKSwgY29udGVudHNPcGFxdWUoZmFsc2UpLCBiYWNr
ZmFjZVZpc2liaWxpdHkoZmFsc2UpLAorICAgICAgICAgICAgICAgICAgZGlzdHJpYnV0ZU9wYWNp
dHkoZmFsc2UpCisgICAgICAgIHsKKyAgICAgICAgfQorICAgIH0gbV9zdGF0ZTsKK307CisKK0dy
YXBoaWNzTGF5ZXJRdEltcGw6OkdyYXBoaWNzTGF5ZXJRdEltcGwoR3JhcGhpY3NMYXllclF0KiBu
ZXdMYXllcikKKyAgICAgICAgOiBRR3JhcGhpY3NPYmplY3QoMCkKKyAgICAgICAgLCBtX2xheWVy
KG5ld0xheWVyKQorICAgICAgICAsIG1fdHJhbnNmb3JtQW5pbWF0aW9uUnVubmluZyhmYWxzZSkK
KyAgICAgICAgLCBtX2NoYW5nZU1hc2soTm9DaGFuZ2VzKQorCit7CisgICAgLy8gYmV0dGVyIHRv
IGNhbGN1bGF0ZSB0aGUgZXhwb3NlZCByZWN0IGluIFFHcmFwaGljc1ZpZXcgdGhhbiBvdmVyLXJl
bmRlciBpbiBXZWJDb3JlCisgICAgLy8gRklYTUU6IHRlc3QgZGlmZmVyZW50IGFwcHJvYWNoZXMK
KyAgICBzZXRGbGFnKFFHcmFwaGljc0l0ZW06Okl0ZW1Vc2VzRXh0ZW5kZWRTdHlsZU9wdGlvbiwg
dHJ1ZSk7CisKKyAgICAvLyB3ZSB1c2UgZ3JhcGhpY3MtdmlldyBmb3IgY29tcG9zaXRpbmcsIG5v
dCBmb3IgaW50ZXJhY3Rpdml0eQorICAgIHNldEFjY2VwdGVkTW91c2VCdXR0b25zKFF0OjpOb0J1
dHRvbik7CisgICAgc2V0RW5hYmxlZChmYWxzZSk7CisKKyAgICAvLyB3ZSdsbCBzZXQgdGhlIGNh
Y2hlIHdoZW4gd2Uga25vdyB3aGF0J3MgZ29pbmcgb24KKyAgICBzZXRDYWNoZU1vZGUoTm9DYWNo
ZSk7Cit9CisKK0dyYXBoaWNzTGF5ZXJRdEltcGw6On5HcmFwaGljc0xheWVyUXRJbXBsKCkKK3sK
KyAgICAvLyB0aGUgY29tcG9zaXRvciBtYW5hZ2VzIGl0ZW0gbGlmZWN5Y2xlIC0gd2UgZG9uJ3Qg
d2FudCB0aGUgZ3JhcGhpY3MtdmlldworICAgIC8vIHN5c3RlbSB0byBhdXRvbWF0aWNhbGx5IGRl
bGV0ZSBvdXIgaXRlbXMKKworICAgIGNvbnN0IFFMaXN0PFFHcmFwaGljc0l0ZW0qPiBjaGlsZHJl
biA9IGNoaWxkSXRlbXMoKTsKKyAgICBmb3IgKFFMaXN0PFFHcmFwaGljc0l0ZW0qPjo6Y29uc3Rf
aXRlcmF0b3IgaXQgPSBjaGlsZHJlbi5iZWdpbigpOyBpdCAhPSBjaGlsZHJlbi5lbmQoKTsgKytp
dCkgeworICAgICAgICBpZiAoUUdyYXBoaWNzSXRlbSogaXRlbSA9ICppdCkgeworICAgICAgICAg
ICAgaWYgKHNjZW5lKCkpCisgICAgICAgICAgICAgICAgc2NlbmUoKS0+cmVtb3ZlSXRlbShpdGVt
KTsKKyAgICAgICAgICAgIGl0ZW0tPnNldFBhcmVudEl0ZW0oMCk7CisgICAgICAgIH0KKyAgICB9
CisgICAgCisgICAgLy8gd2UgZG8sIGhvd2V2ZXIsIG93biB0aGUgYW5pbWF0aW9ucy4uLgorICAg
IGZvciAoUUxpc3Q8UVdlYWtQb2ludGVyPFFBYnN0cmFjdEFuaW1hdGlvbj4gPjo6aXRlcmF0b3Ig
aXQgPSBtX2FuaW1hdGlvbnMuYmVnaW4oKTsgaXQgIT0gbV9hbmltYXRpb25zLmVuZCgpOyArK2l0
KQorICAgICAgICBpZiAoUUFic3RyYWN0QW5pbWF0aW9uKiBhbmltID0gaXQtPmRhdGEoKSkKKyAg
ICAgICAgICAgIGRlbGV0ZSBhbmltOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJRdEltcGw6OnNl
dEJhc2VUcmFuc2Zvcm0oY29uc3QgUVRyYW5zZm9ybSYgdHJhbnNmb3JtKQoreworICAgIGlmICgh
bV9sYXllcikKKyAgICAgICAgcmV0dXJuOworICAgIC8vIHdlYmtpdCBoYXMgcmVsYXRpdmUtdG8t
c2l6ZSBvcmlnaW5Qb2ludCwgZ3JhcGhpY3MtdmlldyBoYXMgYSBwaXhlbCBvcmlnaW5Qb2ludAor
ICAgIC8vIGhlcmUgd2UgY29udmVydAorICAgIFFQb2ludEYgb3JpZ2luVHJhbnNsYXRlKAorICAg
ICAgICAgICAgbV9sYXllci0+YW5jaG9yUG9pbnQoKS54KCkgKiBtX2xheWVyLT5zaXplKCkud2lk
dGgoKSwgbV9sYXllci0+YW5jaG9yUG9pbnQoKS55KCkgKiBtX2xheWVyLT5zaXplKCkuaGVpZ2h0
KCkpOworCisgICAgcmVzZXRUcmFuc2Zvcm0oKTsKKworICAgIC8vIHdlIGhhdmUgdG8gbWFuYWdl
IHRoaXMgb3Vyc2VsdmVzIGJlY2F1c2UgUUdyYXBoaWNzVmlldydzIHRyYW5zZm9ybU9yaWdpbiBp
cyBpbmNvbXBsZXRlCisgICAgdHJhbnNsYXRlKG9yaWdpblRyYW5zbGF0ZS54KCksIG9yaWdpblRy
YW5zbGF0ZS55KCkpOworICAgIHNldFRyYW5zZm9ybSh0cmFuc2Zvcm0sIHRydWUpOworICAgIHRy
YW5zbGF0ZSgtb3JpZ2luVHJhbnNsYXRlLngoKSwgLW9yaWdpblRyYW5zbGF0ZS55KCkpOworICAg
IG1fYmFzZVRyYW5zZm9tID0gdHJhbnNmb3JtOworfQorCitRUGFpbnRlclBhdGggR3JhcGhpY3NM
YXllclF0SW1wbDo6b3BhcXVlQXJlYSgpIGNvbnN0Cit7CisgICAgUVBhaW50ZXJQYXRoIHBhaW50
ZXJQYXRoOworICAgIC8vIHdlIHRyeSBvdXQgYmVzdCB0byByZXR1cm4gdGhlIG9wYXF1ZSBhcmVh
LCBtYXliZSBpdCB3aWxsIGhlbHAgZ3JhcGhpY3MtdmlldyByZW5kZXIgbGVzcyBpdGVtcworICAg
IGlmIChtX2N1cnJlbnRDb250ZW50LmJhY2tncm91bmRDb2xvci5pc1ZhbGlkKCkgJiYgbV9jdXJy
ZW50Q29udGVudC5iYWNrZ3JvdW5kQ29sb3IuYWxwaGEoKSA9PSAweGZmKQorICAgICAgICBwYWlu
dGVyUGF0aC5hZGRSZWN0KGJvdW5kaW5nUmVjdCgpKTsKKyAgICBlbHNlIHsKKyAgICAgICAgaWYg
KG1fc3RhdGUuY29udGVudHNPcGFxdWUKKyAgICAgICAgICAgIHx8IChtX2N1cnJlbnRDb250ZW50
LmNvbnRlbnRUeXBlID09IENvbG9yQ29udGVudFR5cGUgJiYgbV9jdXJyZW50Q29udGVudC5jb250
ZW50c0JhY2tncm91bmRDb2xvci5hbHBoYSgpID09IDB4ZmYpCisgICAgICAgICAgICB8fCAobV9j
dXJyZW50Q29udGVudC5jb250ZW50VHlwZSA9PSBQaXhtYXBDb250ZW50VHlwZSAmJiAhbV9jdXJy
ZW50Q29udGVudC5waXhtYXAuaGFzQWxwaGEoKSkpIHsKKworICAgICAgICAgICAgcGFpbnRlclBh
dGguYWRkUmVjdChtX3N0YXRlLmNvbnRlbnRzUmVjdCk7CisgICAgICAgIH0KKyAgICB9CisgICAg
cmV0dXJuIHBhaW50ZXJQYXRoOworfQorCitRUmVjdEYgR3JhcGhpY3NMYXllclF0SW1wbDo6Ym91
bmRpbmdSZWN0KCkgY29uc3QKK3sKKyAgICByZXR1cm4gUVJlY3RGKFFQb2ludEYoMCwgMCksIFFT
aXplRihtX3NpemUpKTsKK30KKwordm9pZCBHcmFwaGljc0xheWVyUXRJbXBsOjpwYWludChRUGFp
bnRlciogcGFpbnRlciwgY29uc3QgUVN0eWxlT3B0aW9uR3JhcGhpY3NJdGVtKiBvcHRpb24sIFFX
aWRnZXQqIHdpZGdldCkKK3sKKyAgICBpZiAobV9zdGF0ZS5tYXNrTGF5ZXIgJiYgbV9zdGF0ZS5t
YXNrTGF5ZXItPnBsYXRmb3JtTGF5ZXIoKSkgeworICAgICAgICAvLyBGSVhNRTogc2VlIGlmIHRo
aXMgaXMgYmV0dGVyIGRvbmUgc29tZXdoZXJlIGVsc2UKKyAgICAgICAgR3JhcGhpY3NMYXllclF0
SW1wbCogb3RoZXJNYXNrID0gc3RhdGljX2Nhc3Q8R3JhcGhpY3NMYXllclF0SW1wbCo+KG1fc3Rh
dGUubWFza0xheWVyLT5wbGF0Zm9ybUxheWVyKCkpOworICAgICAgICBvdGhlck1hc2stPmZsdXNo
Q2hhbmdlcyh0cnVlKTsKKyAgICAgICAgCisgICAgICAgIC8vIENTUzMgbWFzayBhbmQgUUdyYXBo
aWNzT3BhY2l0eUVmZmVjdCBhcmUgdGhlIHNhbWUgdGhpbmchIHdlIGp1c3QgbmVlZCB0byBjb252
ZXJ0Li4uCisgICAgICAgIC8vIFRoZSBjb252ZXJzaW9uIGlzIGFzIGZhc3QgYXMgd2UgY2FuIG1h
a2UgaXQgLSB3ZSByZW5kZXIgdGhlIGxheWVyIG9uY2UgYW5kIHNlbmQgaXQgdG8gdGhlIFFHcmFw
aGljc09wYWNpdHlFZmZlY3QKKyAgICAgICAgaWYgKCFncmFwaGljc0VmZmVjdCgpKSB7CisgICAg
ICAgICAgICBRUGl4bWFwIG1hc2soUVNpemUobV9zdGF0ZS5tYXNrTGF5ZXItPnNpemUoKS53aWR0
aCgpLCBtX3N0YXRlLm1hc2tMYXllci0+c2l6ZSgpLmhlaWdodCgpKSk7CisgICAgICAgICAgICBt
YXNrLmZpbGwoUXQ6OnRyYW5zcGFyZW50KTsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAg
ICBRUGFpbnRlciBwKCZtYXNrKTsKKyAgICAgICAgICAgICAgICBwLnNldFJlbmRlckhpbnRzKHBh
aW50ZXItPnJlbmRlckhpbnRzKCksIHRydWUpOworICAgICAgICAgICAgICAgIHAuc2V0Q29tcG9z
aXRpb25Nb2RlKFFQYWludGVyOjpDb21wb3NpdGlvbk1vZGVfU291cmNlKTsKKyAgICAgICAgICAg
ICAgICBzdGF0aWNfY2FzdDxHcmFwaGljc0xheWVyUXRJbXBsKj4obV9zdGF0ZS5tYXNrTGF5ZXIt
PnBsYXRmb3JtTGF5ZXIoKSktPmRyYXdDb250ZW50cygmcCwgb3B0aW9uLT5leHBvc2VkUmVjdCwg
dHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBRR3JhcGhpY3NPcGFjaXR5RWZmZWN0
KiBvcGFjaXR5RWZmZWN0ID0gbmV3IFFHcmFwaGljc09wYWNpdHlFZmZlY3QodGhpcyk7CisgICAg
ICAgICAgICBvcGFjaXR5RWZmZWN0LT5zZXRPcGFjaXR5KDEpOworICAgICAgICAgICAgb3BhY2l0
eUVmZmVjdC0+c2V0T3BhY2l0eU1hc2soUUJydXNoKG1hc2spKTsKKyAgICAgICAgICAgIHNldEdy
YXBoaWNzRWZmZWN0KG9wYWNpdHlFZmZlY3QpOworICAgICAgICB9CisgICAgfQorICAgIGRyYXdD
b250ZW50cyhwYWludGVyLCBvcHRpb24tPmV4cG9zZWRSZWN0KTsKK30KKwordm9pZCBHcmFwaGlj
c0xheWVyUXRJbXBsOjpkcmF3Q29udGVudHMoUVBhaW50ZXIqIHBhaW50ZXIsIGNvbnN0IFFSZWN0
RiYgciwgYm9vbCBtYXNrKQoreworICAgIFFSZWN0IHJlY3QgPSByLnRvQWxpZ25lZFJlY3QoKTsK
KyAgICAKKyAgICBpZiAobV9jdXJyZW50Q29udGVudC5jb250ZW50VHlwZSAhPSBIVE1MQ29udGVu
dFR5cGUgJiYgIW1fc3RhdGUuY29udGVudHNSZWN0LmlzRW1wdHkoKSkKKyAgICAgICAgcmVjdCA9
IHJlY3QuaW50ZXJzZWN0ZWQobV9zdGF0ZS5jb250ZW50c1JlY3QpOworCisgICAgaWYgKG1fY3Vy
cmVudENvbnRlbnQuYmFja2dyb3VuZENvbG9yLmlzVmFsaWQoKSkKKyAgICAgICAgcGFpbnRlci0+
ZmlsbFJlY3QociwgUUNvbG9yKG1fY3VycmVudENvbnRlbnQuYmFja2dyb3VuZENvbG9yKSk7CisK
KyAgICBpZiAoIXJlY3QuaXNFbXB0eSgpKSB7CisgICAgICAgIHN3aXRjaCAobV9jdXJyZW50Q29u
dGVudC5jb250ZW50VHlwZSkgeworICAgICAgICBjYXNlIFBpeG1hcENvbnRlbnRUeXBlOgorICAg
ICAgICAgICAgLy8gd2UgaGF2ZSB0byBzY2FsZSB0aGUgaW1hZ2UgdG8gdGhlIGNvbnRlbnRzUmVj
dAorICAgICAgICAgICAgLy8gRklYTUU6IGEgYmV0dGVyIHdheSB3b3VsZCBwcm9iYWJseSBiZSBk
cmF3UGl4bWFwIHdpdGggYSBzcmMvdGFyZ2V0IHJlY3QKKyAgICAgICAgICAgIHBhaW50ZXItPmRy
YXdQaXhtYXAocmVjdC50b3BMZWZ0KCksIG1fY3VycmVudENvbnRlbnQucGl4bWFwLnNjYWxlZCht
X3N0YXRlLmNvbnRlbnRzUmVjdC5zaXplKCkpLCByKTsKKyAgICAgICAgICAgIGJyZWFrOworICAg
ICAgICBjYXNlIENvbG9yQ29udGVudFR5cGU6CisgICAgICAgICAgICBwYWludGVyLT5maWxsUmVj
dChyZWN0LCBtX2N1cnJlbnRDb250ZW50LmNvbnRlbnRzQmFja2dyb3VuZENvbG9yKTsKKyAgICAg
ICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgaWYgKG1fc3RhdGUu
ZHJhd3NDb250ZW50KSB7CisgICAgICAgICAgICAgICAgLy8gdGhpcyBpcyB0aGUgImV4cGVuc2l2
ZSIgYml0LiB3ZSB0cnkgdG8gbWluaW1pemUgY2FsbHMgdG8gdGhpcworICAgICAgICAgICAgICAg
IC8vIG5lY2sgb2YgdGhlIHdvb2RzIGJ5IHByb3BlciBjYWNoaW5nCisgICAgICAgICAgICAgICAg
R3JhcGhpY3NDb250ZXh0IGdjKHBhaW50ZXIpOworICAgICAgICAgICAgICAgIG1fbGF5ZXItPnBh
aW50R3JhcGhpY3NMYXllckNvbnRlbnRzKGdjLCByZWN0KTsKKyAgICAgICAgICAgIH0KKyAgICAg
ICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJR
dEltcGw6Om5vdGlmeUNoYW5nZShDaGFuZ2VGbGFnIGNoYW5nZUZsYWcpCit7CisgICAgaWYgKCF0
aGlzKQorICAgICAgICByZXR1cm47CisKKyAgICBtX2NoYW5nZU1hc2sgPSBzdGF0aWNfY2FzdDxD
aGFuZ2VGbGFnPihzdGF0aWNfY2FzdDxpbnQ+KG1fY2hhbmdlTWFzaykgfCBzdGF0aWNfY2FzdDxp
bnQ+KGNoYW5nZUZsYWcpKTsKKworICAgIGlmIChtX2xheWVyLT5jbGllbnQoKSkKKyAgICAgICAg
bV9sYXllci0+Y2xpZW50KCktPm5vdGlmeVN5bmNSZXF1aXJlZChtX2xheWVyKTsKK30KKwordm9p
ZCBHcmFwaGljc0xheWVyUXRJbXBsOjpmbHVzaENoYW5nZXMoYm9vbCByZWN1cnNpdmUpCit7Cisg
ICAgLy8gdGhpcyBpcyB0aGUgYnVsayBvZiB0aGUgd29yay4gdW5kZXJzdGFuZGluZyB3aGF0IHRo
ZSBjb21wb3NpdG9yIGlzIHRyeWluZyB0byBhY2hpZXZlLAorICAgIC8vIHdoYXQgZ3JhcGhpY3Mt
dmlldyBjYW4gZG8sIGFuZCB0cnlpbmcgdG8gZmluZCBhIHNhbmUgY29tbW9uLWdyb3VuZHMKKyAg
ICBpZiAoIW1fbGF5ZXIgfHwgbV9jaGFuZ2VNYXNrID09IE5vQ2hhbmdlcykKKyAgICAgICAgZ290
byBhZnRlckxheWVyQ2hhbmdlczsKKworICAgIGlmIChtX2N1cnJlbnRDb250ZW50LmNvbnRlbnRU
eXBlID09IEhUTUxDb250ZW50VHlwZSAmJiAobV9jaGFuZ2VNYXNrICYgUGFyZW50Q2hhbmdlKSkg
eworICAgICAgICAvLyB0aGUgV2ViQ29yZSBjb21wb3NpdG9yIG1hbmFnZXMgaXRlbSBvd25lcnNo
aXAuIFdlIGhhdmUgdG8gbWFrZSBzdXJlCisgICAgICAgIC8vIGdyYXBoaWNzLXZpZXcgZG9lc24n
dCB0cnkgdG8gc25hdGNoIHRoYXQgb3duZXJzaGlwLi4uCisgICAgICAgIGlmICghbV9sYXllci0+
cGFyZW50KCkgJiYgIXBhcmVudEl0ZW0oKSkKKyAgICAgICAgICAgIHNldFBhcmVudEl0ZW0oMCk7
CisgICAgICAgIGVsc2UgaWYgKG1fbGF5ZXIgJiYgbV9sYXllci0+cGFyZW50KCkgJiYgbV9sYXll
ci0+cGFyZW50KCktPm5hdGl2ZUxheWVyKCkgIT0gcGFyZW50SXRlbSgpKQorICAgICAgICAgICAg
c2V0UGFyZW50SXRlbShtX2xheWVyLT5wYXJlbnQoKS0+bmF0aXZlTGF5ZXIoKSk7CisgICAgfQor
CisgICAgaWYgKG1fY2hhbmdlTWFzayAmIENoaWxkcmVuQ2hhbmdlKSB7CisgICAgICAgIC8vIHdl
IGJhc2ljYWxseSBkbyBhbiBYT1Igb3BlcmF0aW9uIG9uIHRoZSBsaXN0IG9mIGN1cnJlbnQgY2hp
bGRyZW4KKyAgICAgICAgLy8gYW5kIHRoZSBsaXN0IG9mIHdhbnRlZCBjaGlsZHJlbiwgYW5kIHJl
bW92ZS9hZGQKKyAgICAgICAgUVNldDxRR3JhcGhpY3NJdGVtKj4gbmV3Q2hpbGRyZW47CisgICAg
ICAgIGNvbnN0IFZlY3RvcjxHcmFwaGljc0xheWVyKj4gbmV3Q2hpbGRyZW5WZWN0b3IgPSAobV9s
YXllci0+Y2hpbGRyZW4oKSk7CisgICAgICAgIG5ld0NoaWxkcmVuLnJlc2VydmUobmV3Q2hpbGRy
ZW5WZWN0b3Iuc2l6ZSgpKTsKKworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG5ld0No
aWxkcmVuVmVjdG9yLnNpemUoKTsgKytpKQorICAgICAgICAgICAgbmV3Q2hpbGRyZW4uaW5zZXJ0
KG5ld0NoaWxkcmVuVmVjdG9yW2ldLT5wbGF0Zm9ybUxheWVyKCkpOworCisgICAgICAgIGNvbnN0
IFFTZXQ8UUdyYXBoaWNzSXRlbSo+IGN1cnJlbnRDaGlsZHJlbiA9IGNoaWxkSXRlbXMoKS50b1Nl
dCgpOworICAgICAgICBjb25zdCBRU2V0PFFHcmFwaGljc0l0ZW0qPiBjaGlsZHJlblRvQWRkID0g
bmV3Q2hpbGRyZW4gLSBjdXJyZW50Q2hpbGRyZW47CisgICAgICAgIGNvbnN0IFFTZXQ8UUdyYXBo
aWNzSXRlbSo+IGNoaWxkcmVuVG9SZW1vdmUgPSBjdXJyZW50Q2hpbGRyZW4gLSBuZXdDaGlsZHJl
bjsKKyAgICAgICAgZm9yIChRU2V0PFFHcmFwaGljc0l0ZW0qPjo6Y29uc3RfaXRlcmF0b3IgaXQg
PSBjaGlsZHJlblRvQWRkLmJlZ2luKCk7IGl0ICE9IGNoaWxkcmVuVG9BZGQuZW5kKCk7ICsraXQp
IHsKKyAgICAgICAgICAgICBpZiAoUUdyYXBoaWNzSXRlbSogdyA9ICppdCkKKyAgICAgICAgICAg
ICAgICB3LT5zZXRQYXJlbnRJdGVtKHRoaXMpOworICAgICAgICB9CisgICAgICAgIGZvciAoUVNl
dDxRR3JhcGhpY3NJdGVtKj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gY2hpbGRyZW5Ub1JlbW92ZS5i
ZWdpbigpOyBpdCAhPSBjaGlsZHJlblRvUmVtb3ZlLmVuZCgpOyArK2l0KSB7CisgICAgICAgICAg
ICAgaWYgKFFHcmFwaGljc0l0ZW0qIHcgPSAqaXQpCisgICAgICAgICAgICAgICAgdy0+c2V0UGFy
ZW50SXRlbSgwKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGNoaWxkcmVuIGFyZSBvcmRlcmVk
IGJ5IHotdmFsdWUsIGxldCBncmFwaGljcy12aWV3IGtub3cuCisgICAgICAgIGZvciAoc2l6ZV90
IGkgPSAwOyBpIDwgbmV3Q2hpbGRyZW5WZWN0b3Iuc2l6ZSgpOyArK2kpCisgICAgICAgICAgICBp
ZiAobmV3Q2hpbGRyZW5WZWN0b3JbaV0tPnBsYXRmb3JtTGF5ZXIoKSkKKyAgICAgICAgICAgICAg
ICBuZXdDaGlsZHJlblZlY3RvcltpXS0+cGxhdGZvcm1MYXllcigpLT5zZXRaVmFsdWUoaSk7Cisg
ICAgfQorCisgICAgaWYgKG1fY2hhbmdlTWFzayAmIE1hc2tMYXllckNoYW5nZSkgeworICAgICAg
ICAvLyB3ZSBjYW4ndCBwYWludCBoZXJlLCBiZWNhdXNlIHdlIGRvbid0IGtub3cgaWYgdGhlIG1h
c2sgbGF5ZXIKKyAgICAgICAgLy8gaXRzZWxmIGlzIHJlYWR5Li4uIHdlJ2xsIGhhdmUgdG8gd2Fp
dCB0aWxsIHRoaXMgbGF5ZXIgdHJpZXMgdG8gcGFpbnQKKyAgICAgICAgc2V0R3JhcGhpY3NFZmZl
Y3QoMCk7CisgICAgICAgIGlmIChtX2xheWVyLT5tYXNrTGF5ZXIoKSkKKyAgICAgICAgICAgIHNl
dEZsYWcoSXRlbUNsaXBzQ2hpbGRyZW5Ub1NoYXBlLCB0cnVlKTsKKyAgICAgICAgZWxzZQorICAg
ICAgICAgICAgc2V0RmxhZyhJdGVtQ2xpcHNDaGlsZHJlblRvU2hhcGUsIG1fbGF5ZXItPm1hc2tz
VG9Cb3VuZHMoKSk7CisgICAgICAgIHVwZGF0ZSgpOworICAgIH0KKworICAgIGlmICgobV9jaGFu
Z2VNYXNrICYgUG9zaXRpb25DaGFuZ2UpICYmIChtX2xheWVyLT5wb3NpdGlvbigpICE9IG1fc3Rh
dGUucG9zKSkKKyAgICAgICAgc2V0UG9zKG1fbGF5ZXItPnBvc2l0aW9uKCkueCgpLCBtX2xheWVy
LT5wb3NpdGlvbigpLnkoKSk7CisKKyAgICBpZiAobV9jaGFuZ2VNYXNrICYgU2l6ZUNoYW5nZSkg
eworICAgICAgICBpZiAobV9sYXllci0+c2l6ZSgpICE9IG1fc3RhdGUuc2l6ZSkgeworICAgICAg
ICAgICAgcHJlcGFyZUdlb21ldHJ5Q2hhbmdlKCk7CisgICAgICAgICAgICBtX3NpemUgPSBRU2l6
ZUYobV9sYXllci0+c2l6ZSgpLndpZHRoKCksIG1fbGF5ZXItPnNpemUoKS5oZWlnaHQoKSk7Cisg
ICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobV9jaGFuZ2VNYXNrICYgKFRyYW5zZm9ybUNoYW5n
ZSB8IEFuY2hvclBvaW50Q2hhbmdlIHwgU2l6ZUNoYW5nZSkpIHsKKyAgICAgICAgLy8gc2luY2Ug
d2UgY29udmVydCBhIHBlcmNlbnRhZ2UtYmFzZWQgb3JpZ2luLXBvaW50IHRvIGEgcGl4ZWwtYmFz
ZWQgb25lLAorICAgICAgICAvLyB0aGUgYW5jaG9yLXBvaW50LCB0cmFuc2Zvcm0gYW5kIHNpemUg
ZnJvbSBXZWJDb3JlIGFsbCBhZmZlY3QgdGhlIG9uZQorICAgICAgICAvLyB0aGF0IHdlIGdpdmUg
UXQKKyAgICAgICAgaWYgKG1fc3RhdGUudHJhbnNmb3JtICE9IG1fbGF5ZXItPnRyYW5zZm9ybSgp
IHx8IG1fc3RhdGUuYW5jaG9yUG9pbnQgIT0gbV9sYXllci0+YW5jaG9yUG9pbnQoKSB8fCBtX3N0
YXRlLnNpemUgIT0gbV9sYXllci0+c2l6ZSgpKQorICAgICAgICAgICAgc2V0QmFzZVRyYW5zZm9y
bShRVHJhbnNmb3JtKG1fbGF5ZXItPnRyYW5zZm9ybSgpKSk7CisgICAgfQorCisgICAgaWYgKG1f
Y2hhbmdlTWFzayAmIChDb250ZW50Q2hhbmdlIHwgRHJhd3NDb250ZW50Q2hhbmdlKSkgeworICAg
ICAgICBzd2l0Y2ggKG1fcGVuZGluZ0NvbnRlbnQuY29udGVudFR5cGUpIHsKKyAgICAgICAgY2Fz
ZSBQaXhtYXBDb250ZW50VHlwZToKKyAgICAgICAgICAgIC8vIHdlIG5lZWQgY2FjaGUgZXZlbiBm
b3IgaW1hZ2VzLCBiZWNhdXNlIHRoZXkgbmVlZCB0byBiZSByZXNpemVkCisgICAgICAgICAgICAv
LyB0byB0aGUgY29udGVudHMgcmVjdC4gbWF5YmUgdGhpcyBjYW4gYmUgb3B0aW1pemVkIHRob3Vn
aAorICAgICAgICAgICAgc2V0Q2FjaGVNb2RlKG1fdHJhbnNmb3JtQW5pbWF0aW9uUnVubmluZyA/
IEl0ZW1Db29yZGluYXRlQ2FjaGUgOiBEZXZpY2VDb29yZGluYXRlQ2FjaGUpOworICAgICAgICAg
ICAgdXBkYXRlKCk7CisgICAgICAgICAgICBzZXRGbGFnKEl0ZW1IYXNOb0NvbnRlbnRzLCBmYWxz
ZSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIENvbG9yQ29udGVudFR5cGU6
CisgICAgICAgICAgICAvLyBubyBwb2ludCBpbiBjYWNoaW5nIGEgc29saWQtY29sb3IgcmVjdGFu
Z2xlCisgICAgICAgICAgICBzZXRDYWNoZU1vZGUoUUdyYXBoaWNzSXRlbTo6Tm9DYWNoZSk7Cisg
ICAgICAgICAgICBpZiAobV9wZW5kaW5nQ29udGVudC5jb250ZW50VHlwZSAhPSBtX2N1cnJlbnRD
b250ZW50LmNvbnRlbnRUeXBlIHx8IG1fcGVuZGluZ0NvbnRlbnQuY29udGVudHNCYWNrZ3JvdW5k
Q29sb3IgIT0gbV9jdXJyZW50Q29udGVudC5jb250ZW50c0JhY2tncm91bmRDb2xvcikKKyAgICAg
ICAgICAgICAgICB1cGRhdGUoKTsKKyAgICAgICAgICAgIG1fc3RhdGUuZHJhd3NDb250ZW50ID0g
ZmFsc2U7CisgICAgICAgICAgICBzZXRGbGFnKEl0ZW1IYXNOb0NvbnRlbnRzLCBmYWxzZSk7Cisg
ICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEhUTUxDb250ZW50VHlwZToKKyAgICAg
ICAgICAgIGlmIChtX3BlbmRpbmdDb250ZW50LmNvbnRlbnRUeXBlICE9IG1fY3VycmVudENvbnRl
bnQuY29udGVudFR5cGUpCisgICAgICAgICAgICAgICAgdXBkYXRlKCk7CisgICAgICAgICAgICBp
ZiAoIW1fc3RhdGUuZHJhd3NDb250ZW50ICYmIG1fbGF5ZXItPmRyYXdzQ29udGVudCgpKQorICAg
ICAgICAgICAgICAgIHVwZGF0ZSgpOworICAgICAgICAgICAgaWYgKG1fbGF5ZXItPmRyYXdzQ29u
dGVudCgpKQorICAgICAgICAgICAgICAgIHNldENhY2hlTW9kZShtX3RyYW5zZm9ybUFuaW1hdGlv
blJ1bm5pbmcgPyBJdGVtQ29vcmRpbmF0ZUNhY2hlIDogRGV2aWNlQ29vcmRpbmF0ZUNhY2hlKTsK
KyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBzZXRDYWNoZU1vZGUoTm9DYWNoZSk7
CisKKyAgICAgICAgICAgIHNldEZsYWcoSXRlbUhhc05vQ29udGVudHMsICFtX2xheWVyLT5kcmF3
c0NvbnRlbnQoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAg
IGlmICgobV9jaGFuZ2VNYXNrICYgT3BhY2l0eUNoYW5nZSkgJiYgbV9zdGF0ZS5vcGFjaXR5ICE9
IG1fbGF5ZXItPm9wYWNpdHkoKSkKKyAgICAgICAgc2V0T3BhY2l0eShtX2xheWVyLT5vcGFjaXR5
KCkpOworCisgICAgaWYgKG1fY2hhbmdlTWFzayAmIENvbnRlbnRzUmVjdENoYW5nZSkgeworICAg
ICAgICBjb25zdCBRUmVjdCByZWN0KG1fbGF5ZXItPmNvbnRlbnRzUmVjdCgpKTsKKyAgICAgICAg
aWYgKG1fc3RhdGUuY29udGVudHNSZWN0ICE9IHJlY3QpIHsKKyAgICAgICAgICAgIG1fc3RhdGUu
Y29udGVudHNSZWN0ID0gcmVjdDsKKyAgICAgICAgICAgIHVwZGF0ZSgpOworICAgICAgICB9Cisg
ICAgfQorCisgICAgaWYgKChtX2NoYW5nZU1hc2sgJiBNYXNrc1RvQm91bmRzQ2hhbmdlKQorICAg
ICAgICAmJiBtX3N0YXRlLm1hc2tzVG9Cb3VuZHMgIT0gbV9sYXllci0+bWFza3NUb0JvdW5kcygp
KSB7CisKKyAgICAgICAgc2V0RmxhZyhRR3JhcGhpY3NJdGVtOjpJdGVtQ2xpcHNUb1NoYXBlLCBt
X2xheWVyLT5tYXNrc1RvQm91bmRzKCkpOworICAgICAgICBzZXRGbGFnKFFHcmFwaGljc0l0ZW06
Okl0ZW1DbGlwc0NoaWxkcmVuVG9TaGFwZSwgbV9sYXllci0+bWFza3NUb0JvdW5kcygpKTsKKyAg
ICB9CisKKyAgICBpZiAoKG1fY2hhbmdlTWFzayAmIENvbnRlbnRzT3BhcXVlQ2hhbmdlKSAmJiBt
X3N0YXRlLmNvbnRlbnRzT3BhcXVlICE9IG1fbGF5ZXItPmNvbnRlbnRzT3BhcXVlKCkpCisgICAg
ICAgIHByZXBhcmVHZW9tZXRyeUNoYW5nZSgpOworCisgICAgaWYgKG1fY2hhbmdlTWFzayAmIERp
c3BsYXlDaGFuZ2UpCisgICAgICAgIHVwZGF0ZShtX3BlbmRpbmdDb250ZW50LnJlZ2lvblRvVXBk
YXRlLmJvdW5kaW5nUmVjdCgpKTsKKworICAgIGlmICgobV9jaGFuZ2VNYXNrICYgQmFja2dyb3Vu
ZENvbG9yQ2hhbmdlKSAmJiAobV9wZW5kaW5nQ29udGVudC5iYWNrZ3JvdW5kQ29sb3IgIT0gbV9j
dXJyZW50Q29udGVudC5iYWNrZ3JvdW5kQ29sb3IpKQorICAgICAgICB1cGRhdGUoKTsKKworICAg
IC8vIEZJWE1FOiB0aGUgZm9sbG93aW5nIGZsYWdzIGFyZSBjdXJyZW50bHkgbm90IGhhbmRsZWQs
IGFzIHRoZXkgZG9uJ3QgaGF2ZSBhIGNsZWFyIHRlc3Qgb3IgYXJlIGluIGxvdyBwcmlvcml0eQor
ICAgIC8vIEdlb21ldHJ5T3JpZW50YXRpb25DaGFuZ2UsIENvbnRlbnRzT3JpZW50YXRpb25DaGFu
Z2UsIEJhY2tmYWNlVmlzaWJpbGl0eUNoYW5nZSwgQ2hpbGRyZW5UcmFuc2Zvcm1DaGFuZ2UKKwor
ICAgIG1fc3RhdGUubWFza0xheWVyID0gbV9sYXllci0+bWFza0xheWVyKCk7CisgICAgbV9zdGF0
ZS5wb3MgPSBtX2xheWVyLT5wb3NpdGlvbigpOworICAgIG1fc3RhdGUuYW5jaG9yUG9pbnQgPSBt
X2xheWVyLT5hbmNob3JQb2ludCgpOworICAgIG1fc3RhdGUuc2l6ZSA9IG1fbGF5ZXItPnNpemUo
KTsKKyAgICBtX3N0YXRlLnRyYW5zZm9ybSA9IG1fbGF5ZXItPnRyYW5zZm9ybSgpOworICAgIG1f
c3RhdGUuZ2VvT3JpZW50YXRpb24gPSBtX2xheWVyLT5nZW9tZXRyeU9yaWVudGF0aW9uKCk7Cisg
ICAgbV9zdGF0ZS5jb250ZW50c09yaWVudGF0aW9uID1tX2xheWVyLT5jb250ZW50c09yaWVudGF0
aW9uKCk7CisgICAgbV9zdGF0ZS5vcGFjaXR5ID0gbV9sYXllci0+b3BhY2l0eSgpOworICAgIG1f
c3RhdGUuY29udGVudHNSZWN0ID0gbV9sYXllci0+Y29udGVudHNSZWN0KCk7CisgICAgbV9zdGF0
ZS5wcmVzZXJ2ZXMzRCA9IG1fbGF5ZXItPnByZXNlcnZlczNEKCk7CisgICAgbV9zdGF0ZS5tYXNr
c1RvQm91bmRzID0gbV9sYXllci0+bWFza3NUb0JvdW5kcygpOworICAgIG1fc3RhdGUuZHJhd3ND
b250ZW50ID0gbV9sYXllci0+ZHJhd3NDb250ZW50KCk7CisgICAgbV9zdGF0ZS5jb250ZW50c09w
YXF1ZSA9IG1fbGF5ZXItPmNvbnRlbnRzT3BhcXVlKCk7CisgICAgbV9zdGF0ZS5iYWNrZmFjZVZp
c2liaWxpdHkgPSBtX2xheWVyLT5iYWNrZmFjZVZpc2liaWxpdHkoKTsKKyAgICBtX2N1cnJlbnRD
b250ZW50LnBpeG1hcCA9IG1fcGVuZGluZ0NvbnRlbnQucGl4bWFwOworICAgIG1fY3VycmVudENv
bnRlbnQuY29udGVudFR5cGUgPSBtX3BlbmRpbmdDb250ZW50LmNvbnRlbnRUeXBlOworICAgIG1f
Y3VycmVudENvbnRlbnQuYmFja2dyb3VuZENvbG9yID0gbV9wZW5kaW5nQ29udGVudC5iYWNrZ3Jv
dW5kQ29sb3I7CisgICAgbV9jdXJyZW50Q29udGVudC5yZWdpb25Ub1VwZGF0ZSB8PSBtX3BlbmRp
bmdDb250ZW50LnJlZ2lvblRvVXBkYXRlOworICAgIG1fY3VycmVudENvbnRlbnQuY29udGVudHNC
YWNrZ3JvdW5kQ29sb3IgPSBtX3BlbmRpbmdDb250ZW50LmNvbnRlbnRzQmFja2dyb3VuZENvbG9y
OworICAgIG1fcGVuZGluZ0NvbnRlbnQucmVnaW9uVG9VcGRhdGUgPSBRUmVnaW9uKCk7CisgICAg
bV9jaGFuZ2VNYXNrID0gTm9DaGFuZ2VzOworCisKK2FmdGVyTGF5ZXJDaGFuZ2VzOgorICAgIGlm
ICghcmVjdXJzaXZlKQorICAgICAgICByZXR1cm47ICAgIAorCisgICAgY29uc3QgUUxpc3Q8UUdy
YXBoaWNzSXRlbSo+IGNoaWxkcmVuID0gY2hpbGRJdGVtcygpOworCisgICAgZm9yIChRTGlzdDxR
R3JhcGhpY3NJdGVtKj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gY2hpbGRyZW4uYmVnaW4oKTsgaXQg
IT0gY2hpbGRyZW4uZW5kKCk7ICsraXQpIHsKKyAgICAgICAgaWYgKFFHcmFwaGljc0l0ZW0qIGl0
ZW0gPSAqaXQpCisgICAgICAgICAgICBpZiAoR3JhcGhpY3NMYXllclF0SW1wbCogbGF5ZXIgPSBx
b2JqZWN0X2Nhc3Q8R3JhcGhpY3NMYXllclF0SW1wbCo+KGl0ZW0tPnRvR3JhcGhpY3NPYmplY3Qo
KSkpCisgICAgICAgICAgICAgICAgbGF5ZXItPmZsdXNoQ2hhbmdlcyh0cnVlKTsKKyAgICB9Cit9
CisKK3ZvaWQgR3JhcGhpY3NMYXllclF0SW1wbDo6bm90aWZ5QW5pbWF0aW9uU3RhcnRlZCgpCit7
CisgICAgLy8gV2ViQ29yZSBub3RpZmllcyBqYXZhc2NyaXB0IHdoZW4gdGhlIGFuaW1hdGlvbiBz
dGFydHMKKyAgICAvLyBoZXJlIHdlJ3JlIGxldHRpbmcgaXQga25vdworICAgIG1fbGF5ZXItPmNs
aWVudCgpLT5ub3RpZnlBbmltYXRpb25TdGFydGVkKG1fbGF5ZXIsIFdURjo6Y3VycmVudFRpbWUo
KSk7Cit9CisKK0dyYXBoaWNzTGF5ZXJRdDo6R3JhcGhpY3NMYXllclF0KEdyYXBoaWNzTGF5ZXJD
bGllbnQqIGNsaWVudCkKKyAgICAgICAgOiBHcmFwaGljc0xheWVyKGNsaWVudCkKKyAgICAgICAg
LCBtX2ltcGwoUGFzc093blB0cjxHcmFwaGljc0xheWVyUXRJbXBsPihuZXcgR3JhcGhpY3NMYXll
clF0SW1wbCh0aGlzKSkpCit7Cit9CisKK0dyYXBoaWNzTGF5ZXJRdDo6fkdyYXBoaWNzTGF5ZXJR
dCgpCit7Cit9CisKKy8vIHRoaXMgaXMgdGhlIGhvb2sgZm9yIFdlYkNvcmUgY29tcG9zaXRvciB0
byBrbm93IHRoYXQgUXQgaW1wbGVtZW50cyBjb21wb3NpdGluZyB3aXRoIEdyYXBoaWNzTGF5ZXJR
dAorUGFzc093blB0cjxHcmFwaGljc0xheWVyPiBHcmFwaGljc0xheWVyOjpjcmVhdGUoR3JhcGhp
Y3NMYXllckNsaWVudCogY2xpZW50KQoreworICAgIHJldHVybiBuZXcgR3JhcGhpY3NMYXllclF0
KGNsaWVudCk7Cit9CisKKy8vIHJlaW1wIGZyb20gR3JhcGhpY3NMYXllci5oOiBRdCBpcyB0b3At
ZG93bgorR3JhcGhpY3NMYXllcjo6Q29tcG9zaXRpbmdDb29yZGluYXRlc09yaWVudGF0aW9uIEdy
YXBoaWNzTGF5ZXI6OmNvbXBvc2l0aW5nQ29vcmRpbmF0ZXNPcmllbnRhdGlvbigpCit7CisgICAg
cmV0dXJuIENvbXBvc2l0aW5nQ29vcmRpbmF0ZXNUb3BEb3duOworfQorCisvLyByZWltcCBmcm9t
IEdyYXBoaWNzTGF5ZXIuaDogd2UnbGwgbmVlZCB0byB1cGRhdGUgdGhlIHdob2xlIGRpc3BsYXks
IGFuZCB3ZSBjYW4ndCBjb3VudCBvbiB0aGUgY3VycmVudCBzaXplIGJlY2F1c2UgaXQgbWlnaHQg
Y2hhbmdlCit2b2lkIEdyYXBoaWNzTGF5ZXJRdDo6c2V0TmVlZHNEaXNwbGF5KCkKK3sKKyAgICBt
X2ltcGwtPm1fcGVuZGluZ0NvbnRlbnQucmVnaW9uVG9VcGRhdGUgPSBRUmVnaW9uKFFSZWN0KFFQ
b2ludCgwLCAwKSwgUVNpemUoc2l6ZSgpLndpZHRoKCksIHNpemUoKS5oZWlnaHQoKSkpKTsKKyAg
ICBtX2ltcGwtPm5vdGlmeUNoYW5nZShHcmFwaGljc0xheWVyUXRJbXBsOjpEaXNwbGF5Q2hhbmdl
KTsKK30KKworLy8gcmVpbXAgZnJvbSBHcmFwaGljc0xheWVyLmgKK3ZvaWQgR3JhcGhpY3NMYXll
clF0OjpzZXROZWVkc0Rpc3BsYXlJblJlY3QoY29uc3QgRmxvYXRSZWN0JiByKQoreworICAgIG1f
aW1wbC0+bV9wZW5kaW5nQ29udGVudC5yZWdpb25Ub1VwZGF0ZXw9IFFSZWN0RihyKS50b0FsaWdu
ZWRSZWN0KCk7CisgICAgbV9pbXBsLT5ub3RpZnlDaGFuZ2UoR3JhcGhpY3NMYXllclF0SW1wbDo6
RGlzcGxheUNoYW5nZSk7Cit9CisKKy8vIHJlaW1wIGZyb20gR3JhcGhpY3NMYXllci5oCit2b2lk
IEdyYXBoaWNzTGF5ZXJRdDo6c2V0TmFtZShjb25zdCBTdHJpbmcmIG5hbWUpCit7CisgICAgbV9p
bXBsLT5zZXRPYmplY3ROYW1lKG5hbWUpOworICAgIEdyYXBoaWNzTGF5ZXI6OnNldE5hbWUobmFt
ZSk7Cit9CisKKy8vIHJlaW1wIGZyb20gR3JhcGhpY3NMYXllci5oCit2b2lkIEdyYXBoaWNzTGF5
ZXJRdDo6c2V0UGFyZW50KEdyYXBoaWNzTGF5ZXIqIGxheWVyKQoreworICAgIG1faW1wbC0+bm90
aWZ5Q2hhbmdlKEdyYXBoaWNzTGF5ZXJRdEltcGw6OlBhcmVudENoYW5nZSk7CisgICAgR3JhcGhp
Y3NMYXllcjo6c2V0UGFyZW50KGxheWVyKTsKK30KKworLy8gcmVpbXAgZnJvbSBHcmFwaGljc0xh
eWVyLmgKK2Jvb2wgR3JhcGhpY3NMYXllclF0OjpzZXRDaGlsZHJlbihjb25zdCBWZWN0b3I8R3Jh
cGhpY3NMYXllcio+JiBjaGlsZHJlbikKK3sKKyAgICBtX2ltcGwtPm5vdGlmeUNoYW5nZShHcmFw
aGljc0xheWVyUXRJbXBsOjpDaGlsZHJlbkNoYW5nZSk7CisgICAgcmV0dXJuIEdyYXBoaWNzTGF5
ZXI6OnNldENoaWxkcmVuKGNoaWxkcmVuKTsKK30KKworLy8gcmVpbXAgZnJvbSBHcmFwaGljc0xh
eWVyLmgKK3ZvaWQgR3JhcGhpY3NMYXllclF0OjphZGRDaGlsZChHcmFwaGljc0xheWVyKiBsYXll
cikKK3sKKyAgICBtX2ltcGwtPm5vdGlmeUNoYW5nZShHcmFwaGljc0xheWVyUXRJbXBsOjpDaGls
ZHJlbkNoYW5nZSk7CisgICAgR3JhcGhpY3NMYXllcjo6YWRkQ2hpbGQobGF5ZXIpOworfQorCisv
LyByZWltcCBmcm9tIEdyYXBoaWNzTGF5ZXIuaAordm9pZCBHcmFwaGljc0xheWVyUXQ6OmFkZENo
aWxkQXRJbmRleChHcmFwaGljc0xheWVyKiBsYXllciwgaW50IGluZGV4KQoreworICAgIEdyYXBo
aWNzTGF5ZXI6OmFkZENoaWxkQXRJbmRleChsYXllciwgaW5kZXgpOworICAgIG1faW1wbC0+bm90
aWZ5Q2hhbmdlKEdyYXBoaWNzTGF5ZXJRdEltcGw6OkNoaWxkcmVuQ2hhbmdlKTsKK30KKworLy8g
cmVpbXAgZnJvbSBHcmFwaGljc0xheWVyLmgKK3ZvaWQgR3JhcGhpY3NMYXllclF0OjphZGRDaGls
ZEFib3ZlKEdyYXBoaWNzTGF5ZXIqIGxheWVyLCBHcmFwaGljc0xheWVyKiBzaWJsaW5nKQorewor
ICAgICBHcmFwaGljc0xheWVyOjphZGRDaGlsZEFib3ZlKGxheWVyLCBzaWJsaW5nKTsKKyAgICAg
bV9pbXBsLT5ub3RpZnlDaGFuZ2UoR3JhcGhpY3NMYXllclF0SW1wbDo6Q2hpbGRyZW5DaGFuZ2Up
OworfQorCisvLyByZWltcCBmcm9tIEdyYXBoaWNzTGF5ZXIuaAordm9pZCBHcmFwaGljc0xheWVy
UXQ6OmFkZENoaWxkQmVsb3coR3JhcGhpY3NMYXllciogbGF5ZXIsIEdyYXBoaWNzTGF5ZXIqIHNp
YmxpbmcpCit7CisKKyAgICBHcmFwaGljc0xheWVyOjphZGRDaGlsZEJlbG93KGxheWVyLCBzaWJs
aW5nKTsKKyAgICBtX2ltcGwtPm5vdGlmeUNoYW5nZShHcmFwaGljc0xheWVyUXRJbXBsOjpDaGls
ZHJlbkNoYW5nZSk7Cit9CisKKy8vIHJlaW1wIGZyb20gR3JhcGhpY3NMYXllci5oCitib29sIEdy
YXBoaWNzTGF5ZXJRdDo6cmVwbGFjZUNoaWxkKEdyYXBoaWNzTGF5ZXIqIG9sZENoaWxkLCBHcmFw
aGljc0xheWVyKiBuZXdDaGlsZCkKK3sKKyAgICBpZiAoR3JhcGhpY3NMYXllcjo6cmVwbGFjZUNo
aWxkKG9sZENoaWxkLCBuZXdDaGlsZCkpIHsKKyAgICAgICAgbV9pbXBsLT5ub3RpZnlDaGFuZ2Uo
R3JhcGhpY3NMYXllclF0SW1wbDo6Q2hpbGRyZW5DaGFuZ2UpOworICAgICAgICByZXR1cm4gdHJ1
ZTsKKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKy8vIHJlaW1wIGZyb20gR3JhcGhp
Y3NMYXllci5oCit2b2lkIEdyYXBoaWNzTGF5ZXJRdDo6cmVtb3ZlRnJvbVBhcmVudCgpCit7Cisg
ICAgaWYgKHBhcmVudCgpKQorICAgICAgICBtX2ltcGwtPm5vdGlmeUNoYW5nZShHcmFwaGljc0xh
eWVyUXRJbXBsOjpQYXJlbnRDaGFuZ2UpOworICAgIEdyYXBoaWNzTGF5ZXI6OnJlbW92ZUZyb21Q
YXJlbnQoKTsKK30KKworLy8gcmVpbXAgZnJvbSBHcmFwaGljc0xheWVyLmgKK3ZvaWQgR3JhcGhp
Y3NMYXllclF0OjpzZXRNYXNrTGF5ZXIoR3JhcGhpY3NMYXllciogbGF5ZXIpCit7CisgICAgR3Jh
cGhpY3NMYXllcjo6c2V0TWFza0xheWVyKGxheWVyKTsKKyAgICBtX2ltcGwtPm5vdGlmeUNoYW5n
ZShHcmFwaGljc0xheWVyUXRJbXBsOjpNYXNrTGF5ZXJDaGFuZ2UpOworfQorCisvLyByZWltcCBm
cm9tIEdyYXBoaWNzTGF5ZXIuaAordm9pZCBHcmFwaGljc0xheWVyUXQ6OnNldFBvc2l0aW9uKGNv
bnN0IEZsb2F0UG9pbnQmIHApCit7CisgICAgaWYgKHBvc2l0aW9uKCkgIT0gcCkKKyAgICAgICBt
X2ltcGwtPm5vdGlmeUNoYW5nZShHcmFwaGljc0xheWVyUXRJbXBsOjpQb3NpdGlvbkNoYW5nZSk7
CisgICAgR3JhcGhpY3NMYXllcjo6c2V0UG9zaXRpb24ocCk7Cit9CisKKy8vIHJlaW1wIGZyb20g
R3JhcGhpY3NMYXllci5oCit2b2lkIEdyYXBoaWNzTGF5ZXJRdDo6c2V0QW5jaG9yUG9pbnQoY29u
c3QgRmxvYXRQb2ludDNEJiBwKQoreworICAgIGlmIChhbmNob3JQb2ludCgpICE9IHApCisgICAg
ICAgIG1faW1wbC0+bm90aWZ5Q2hhbmdlKEdyYXBoaWNzTGF5ZXJRdEltcGw6OkFuY2hvclBvaW50
Q2hhbmdlKTsKKyAgICBHcmFwaGljc0xheWVyOjpzZXRBbmNob3JQb2ludChwKTsKK30KKworLy8g
cmVpbXAgZnJvbSBHcmFwaGljc0xheWVyLmgKK3ZvaWQgR3JhcGhpY3NMYXllclF0OjpzZXRTaXpl
KGNvbnN0IEZsb2F0U2l6ZSYgc2l6ZSkKK3sKKyAgICBpZiAodGhpcy0+c2l6ZSgpICE9IHNpemUp
CisgICAgICAgIG1faW1wbC0+bm90aWZ5Q2hhbmdlKEdyYXBoaWNzTGF5ZXJRdEltcGw6OlNpemVD
aGFuZ2UpOworICAgIEdyYXBoaWNzTGF5ZXI6OnNldFNpemUoc2l6ZSk7Cit9CisKKy8vIHJlaW1w
IGZyb20gR3JhcGhpY3NMYXllci5oCit2b2lkIEdyYXBoaWNzTGF5ZXJRdDo6c2V0VHJhbnNmb3Jt
KGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4JiB0KQoreworICAgIGlmICghbV9pbXBsLT5tX3Ry
YW5zZm9ybUFuaW1hdGlvblJ1bm5pbmcgJiYgdHJhbnNmb3JtKCkgIT0gdCkKKyAgICAgICBtX2lt
cGwtPm5vdGlmeUNoYW5nZShHcmFwaGljc0xheWVyUXRJbXBsOjpUcmFuc2Zvcm1DaGFuZ2UpOwor
ICAgIEdyYXBoaWNzTGF5ZXI6OnNldFRyYW5zZm9ybSh0KTsKK30KKworLy8gcmVpbXAgZnJvbSBH
cmFwaGljc0xheWVyLmgKK3ZvaWQgR3JhcGhpY3NMYXllclF0OjpzZXRDaGlsZHJlblRyYW5zZm9y
bShjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYgdCkKK3sKKyAgICBHcmFwaGljc0xheWVyOjpz
ZXRDaGlsZHJlblRyYW5zZm9ybSh0KTsKKyAgICBtX2ltcGwtPm5vdGlmeUNoYW5nZShHcmFwaGlj
c0xheWVyUXRJbXBsOjpDaGlsZHJlblRyYW5zZm9ybUNoYW5nZSk7Cit9CisKKy8vIHJlaW1wIGZy
b20gR3JhcGhpY3NMYXllci5oCit2b2lkIEdyYXBoaWNzTGF5ZXJRdDo6c2V0UHJlc2VydmVzM0Qo
Ym9vbCBiKQoreworICAgIGlmIChiICE9IHByZXNlcnZlczNEKCkpOworICAgICAgIG1faW1wbC0+
bm90aWZ5Q2hhbmdlKEdyYXBoaWNzTGF5ZXJRdEltcGw6OlByZXNlcnZlczNEQ2hhbmdlKTsKKyAg
ICBHcmFwaGljc0xheWVyOjpzZXRQcmVzZXJ2ZXMzRChiKTsKK30KKworLy8gcmVpbXAgZnJvbSBH
cmFwaGljc0xheWVyLmgKK3ZvaWQgR3JhcGhpY3NMYXllclF0OjpzZXRNYXNrc1RvQm91bmRzKGJv
b2wgYikKK3sKKyAgICBHcmFwaGljc0xheWVyOjpzZXRNYXNrc1RvQm91bmRzKGIpOworICAgIG1f
aW1wbC0+bm90aWZ5Q2hhbmdlKEdyYXBoaWNzTGF5ZXJRdEltcGw6Ok1hc2tzVG9Cb3VuZHNDaGFu
Z2UpOworfQorCisvLyByZWltcCBmcm9tIEdyYXBoaWNzTGF5ZXIuaAordm9pZCBHcmFwaGljc0xh
eWVyUXQ6OnNldERyYXdzQ29udGVudChib29sIGIpCit7CisgICAgbV9pbXBsLT5ub3RpZnlDaGFu
Z2UoR3JhcGhpY3NMYXllclF0SW1wbDo6RHJhd3NDb250ZW50Q2hhbmdlKTsKKyAgICBHcmFwaGlj
c0xheWVyOjpzZXREcmF3c0NvbnRlbnQoYik7Cit9CisKKy8vIHJlaW1wIGZyb20gR3JhcGhpY3NM
YXllci5oCit2b2lkIEdyYXBoaWNzTGF5ZXJRdDo6c2V0QmFja2dyb3VuZENvbG9yKGNvbnN0IENv
bG9yJiBjKQoreworICAgIG1faW1wbC0+bm90aWZ5Q2hhbmdlKEdyYXBoaWNzTGF5ZXJRdEltcGw6
OkJhY2tncm91bmRDb2xvckNoYW5nZSk7CisgICAgbV9pbXBsLT5tX3BlbmRpbmdDb250ZW50LmJh
Y2tncm91bmRDb2xvciA9IGM7CisgICAgR3JhcGhpY3NMYXllcjo6c2V0QmFja2dyb3VuZENvbG9y
KGMpOworfQorCisvLyByZWltcCBmcm9tIEdyYXBoaWNzTGF5ZXIuaAordm9pZCBHcmFwaGljc0xh
eWVyUXQ6OmNsZWFyQmFja2dyb3VuZENvbG9yKCkKK3sKKyAgICBtX2ltcGwtPm1fcGVuZGluZ0Nv
bnRlbnQuYmFja2dyb3VuZENvbG9yID0gUUNvbG9yKCk7CisgICAgbV9pbXBsLT5ub3RpZnlDaGFu
Z2UoR3JhcGhpY3NMYXllclF0SW1wbDo6QmFja2dyb3VuZENvbG9yQ2hhbmdlKTsKKyAgICBHcmFw
aGljc0xheWVyOjpjbGVhckJhY2tncm91bmRDb2xvcigpOworfQorCisvLyByZWltcCBmcm9tIEdy
YXBoaWNzTGF5ZXIuaAordm9pZCBHcmFwaGljc0xheWVyUXQ6OnNldENvbnRlbnRzT3BhcXVlKGJv
b2wgYikKK3sKKyAgICBtX2ltcGwtPm5vdGlmeUNoYW5nZShHcmFwaGljc0xheWVyUXRJbXBsOjpD
b250ZW50c09wYXF1ZUNoYW5nZSk7CisgICAgR3JhcGhpY3NMYXllcjo6c2V0Q29udGVudHNPcGFx
dWUoYik7Cit9CisKKy8vIHJlaW1wIGZyb20gR3JhcGhpY3NMYXllci5oCit2b2lkIEdyYXBoaWNz
TGF5ZXJRdDo6c2V0QmFja2ZhY2VWaXNpYmlsaXR5KGJvb2wgYikKK3sKKyAgICBtX2ltcGwtPm5v
dGlmeUNoYW5nZShHcmFwaGljc0xheWVyUXRJbXBsOjpCYWNrZmFjZVZpc2liaWxpdHlDaGFuZ2Up
OworICAgIEdyYXBoaWNzTGF5ZXI6OnNldEJhY2tmYWNlVmlzaWJpbGl0eShiKTsKK30KKworLy8g
cmVpbXAgZnJvbSBHcmFwaGljc0xheWVyLmgKK3ZvaWQgR3JhcGhpY3NMYXllclF0OjpzZXRPcGFj
aXR5KGZsb2F0IG8pCit7CisgICAgaWYgKCFtX2ltcGwtPm9wYWNpdHlBbmltYXRpb25SdW5uaW5n
ICYmIG9wYWNpdHkoKSAhPSBvKQorICAgICAgIG1faW1wbC0+bm90aWZ5Q2hhbmdlKEdyYXBoaWNz
TGF5ZXJRdEltcGw6Ok9wYWNpdHlDaGFuZ2UpOworICAgIEdyYXBoaWNzTGF5ZXI6OnNldE9wYWNp
dHkobyk7Cit9CisKKy8vIHJlaW1wIGZyb20gR3JhcGhpY3NMYXllci5oCit2b2lkIEdyYXBoaWNz
TGF5ZXJRdDo6c2V0Q29udGVudHNSZWN0KGNvbnN0IEludFJlY3QmIHIpCit7CisgICAgbV9pbXBs
LT5ub3RpZnlDaGFuZ2UoR3JhcGhpY3NMYXllclF0SW1wbDo6Q29udGVudHNSZWN0Q2hhbmdlKTsK
KyAgICBHcmFwaGljc0xheWVyOjpzZXRDb250ZW50c1JlY3Qocik7Cit9CisKKy8vIHJlaW1wIGZy
b20gR3JhcGhpY3NMYXllci5oCit2b2lkIEdyYXBoaWNzTGF5ZXJRdDo6c2V0Q29udGVudHNUb0lt
YWdlKEltYWdlKiBpbWFnZSkKK3sKKyAgICBtX2ltcGwtPm5vdGlmeUNoYW5nZShHcmFwaGljc0xh
eWVyUXRJbXBsOjpDb250ZW50Q2hhbmdlKTsKKyAgICBtX2ltcGwtPm1fcGVuZGluZ0NvbnRlbnQu
Y29udGVudFR5cGUgPSBHcmFwaGljc0xheWVyUXRJbXBsOjpIVE1MQ29udGVudFR5cGU7CisgICAg
R3JhcGhpY3NMYXllcjo6c2V0Q29udGVudHNUb0ltYWdlKGltYWdlKTsKKyAgICBpZiAoaW1hZ2Up
IHsKKyAgICAgICAgUVBpeG1hcCogcHhtID0gaW1hZ2UtPm5hdGl2ZUltYWdlRm9yQ3VycmVudEZy
YW1lKCk7CisgICAgICAgIGlmIChweG0pIHsKKyAgICAgICAgICAgIG1faW1wbC0+bV9wZW5kaW5n
Q29udGVudC5waXhtYXAgPSAqcHhtOworICAgICAgICAgICAgbV9pbXBsLT5tX3BlbmRpbmdDb250
ZW50LmNvbnRlbnRUeXBlID0gR3JhcGhpY3NMYXllclF0SW1wbDo6UGl4bWFwQ29udGVudFR5cGU7
CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gICAgICAgIAorICAgIH0KKyAgICBtX2lt
cGwtPm1fcGVuZGluZ0NvbnRlbnQucGl4bWFwID0gUVBpeG1hcCgpOworfQorCisvLyByZWltcCBm
cm9tIEdyYXBoaWNzTGF5ZXIuaAordm9pZCBHcmFwaGljc0xheWVyUXQ6OnNldENvbnRlbnRzQmFj
a2dyb3VuZENvbG9yKGNvbnN0IENvbG9yJiBjb2xvcikKK3sKKyAgICBtX2ltcGwtPm5vdGlmeUNo
YW5nZShHcmFwaGljc0xheWVyUXRJbXBsOjpDb250ZW50Q2hhbmdlKTsKKyAgICBtX2ltcGwtPm1f
cGVuZGluZ0NvbnRlbnQuY29udGVudFR5cGUgPSBHcmFwaGljc0xheWVyUXRJbXBsOjpDb2xvckNv
bnRlbnRUeXBlOworICAgIG1faW1wbC0+bV9wZW5kaW5nQ29udGVudC5jb250ZW50c0JhY2tncm91
bmRDb2xvciA9IFFDb2xvcihjb2xvcik7CisgICAgR3JhcGhpY3NMYXllcjo6c2V0Q29udGVudHNC
YWNrZ3JvdW5kQ29sb3IoY29sb3IpOworfQorCisvLyByZWltcCBmcm9tIEdyYXBoaWNzTGF5ZXIu
aAordm9pZCBHcmFwaGljc0xheWVyUXQ6OnNldEdlb21ldHJ5T3JpZW50YXRpb24oQ29tcG9zaXRp
bmdDb29yZGluYXRlc09yaWVudGF0aW9uIG9yaWVudGF0aW9uKQoreworICAgIG1faW1wbC0+bm90
aWZ5Q2hhbmdlKEdyYXBoaWNzTGF5ZXJRdEltcGw6Okdlb21ldHJ5T3JpZW50YXRpb25DaGFuZ2Up
OworICAgIEdyYXBoaWNzTGF5ZXI6OnNldEdlb21ldHJ5T3JpZW50YXRpb24ob3JpZW50YXRpb24p
OworfQorCisvLyByZWltcCBmcm9tIEdyYXBoaWNzTGF5ZXIuaAordm9pZCBHcmFwaGljc0xheWVy
UXQ6OnNldENvbnRlbnRzT3JpZW50YXRpb24oQ29tcG9zaXRpbmdDb29yZGluYXRlc09yaWVudGF0
aW9uIG9yaWVudGF0aW9uKQoreworICAgIG1faW1wbC0+bm90aWZ5Q2hhbmdlKEdyYXBoaWNzTGF5
ZXJRdEltcGw6OkNvbnRlbnRzT3JpZW50YXRpb25DaGFuZ2UpOworICAgIEdyYXBoaWNzTGF5ZXI6
OnNldENvbnRlbnRzT3JpZW50YXRpb24ob3JpZW50YXRpb24pOworfQorCisvLyByZWltcCBmcm9t
IEdyYXBoaWNzTGF5ZXIuaAordm9pZCBHcmFwaGljc0xheWVyUXQ6OmRpc3RyaWJ1dGVPcGFjaXR5
KGZsb2F0IG8pCit7CisgICAgbV9pbXBsLT5ub3RpZnlDaGFuZ2UoR3JhcGhpY3NMYXllclF0SW1w
bDo6T3BhY2l0eUNoYW5nZSk7CisgICAgbV9pbXBsLT5tX3N0YXRlLmRpc3RyaWJ1dGVPcGFjaXR5
ID0gdHJ1ZTsKK30KKworLy8gcmVpbXAgZnJvbSBHcmFwaGljc0xheWVyLmgKK2Zsb2F0IEdyYXBo
aWNzTGF5ZXJRdDo6YWNjdW11bGF0ZWRPcGFjaXR5KCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9p
bXBsLT5lZmZlY3RpdmVPcGFjaXR5KCk7Cit9CisKKy8vIHJlaW1wIGZyb20gR3JhcGhpY3NMYXll
ci5oCit2b2lkIEdyYXBoaWNzTGF5ZXJRdDo6c3luY0NvbXBvc2l0aW5nU3RhdGUoKQoreworICAg
IG1faW1wbC0+Zmx1c2hDaGFuZ2VzKCk7CisgICAgR3JhcGhpY3NMYXllcjo6c3luY0NvbXBvc2l0
aW5nU3RhdGUoKTsKK30KKworLy8gcmVpbXAgZnJvbSBHcmFwaGljc0xheWVyLmgKK05hdGl2ZUxh
eWVyIEdyYXBoaWNzTGF5ZXJRdDo6bmF0aXZlTGF5ZXIoKSBjb25zdAoreworICAgIHJldHVybiBt
X2ltcGwuZ2V0KCk7Cit9CisKKy8vIHJlaW1wIGZyb20gR3JhcGhpY3NMYXllci5oCitQbGF0Zm9y
bUxheWVyKiBHcmFwaGljc0xheWVyUXQ6OnBsYXRmb3JtTGF5ZXIoKSBjb25zdAoreworICAgIHJl
dHVybiBtX2ltcGwuZ2V0KCk7Cit9CisKKy8vIG5vdyB3ZSBzdGFydCBkZWFsaW5nIHdpdGggV2Vi
Q29yZSBhbmltYXRpb25zIHRyYW5zbGF0ZWQgdG8gUXQgYW5pbWF0aW9ucworCit0ZW1wbGF0ZSA8
dHlwZW5hbWUgVD4KK3N0cnVjdCBLZXlmcmFtZVZhbHVlUXQgeworICAgIFRpbWluZ0Z1bmN0aW9u
IHRpbWluZ0Z1bmN0aW9uOworICAgIFQgdmFsdWU7Cit9OworCisvLyB3ZSBjb3B5IHRoaXMgZnJv
bSB0aGUgQW5pbWF0aW9uQmFzZS5jcHAKK3N0YXRpYyBpbmxpbmUgZG91YmxlIHNvbHZlRXBzaWxv
bihkb3VibGUgZHVyYXRpb24pCit7CisgICAgcmV0dXJuIDEuMCAvICgyMDAuMCAqIGR1cmF0aW9u
KTsKK30KKworc3RhdGljIGlubGluZSBkb3VibGUgc29sdmVDdWJpY0JlemllckZ1bmN0aW9uKHFy
ZWFsIHAxeCwgcXJlYWwgcDF5LCBxcmVhbCBwMngsIHFyZWFsIHAyeSwgZG91YmxlIHQsIGRvdWJs
ZSBkdXJhdGlvbikKK3sKKyAgICBVbml0QmV6aWVyIGJlemllcihwMXgsIHAxeSwgcDJ4LCBwMnkp
OworICAgIHJldHVybiBiZXppZXIuc29sdmUodCwgc29sdmVFcHNpbG9uKGR1cmF0aW9uKSk7Cit9
CisKKy8vIHdlIHdhbnQgdGhlIHRpbWluZyBmdW5jdGlvbiB0byBiZSBhcyBjbG9zZSBhcyBwb3Nz
aWJsZSB0byB3aGF0IHRoZSB3ZWItZGV2ZWxvcGVyIGludGVuZGVkLCBzbyB3ZSdyZSB1c2luZyB0
aGUgc2FtZSBmdW5jdGlvbiB1c2VkIGJ5IFdlYkNvcmUgd2hlbiBjb21wb3NpdGluZyBpcyBkaXNh
YmxlZAorLy8gVXNpbmcgZWFzaW5nLWN1cnZlcyB3b3VsZCBwcm9iYWJseSB3b3JrIGZvciBzb21l
IG9mIHRoZSBjYXNlcywgYnV0IHdvdWxkbid0IHJlYWxseSBidXkgdXMgYW55dGhpbmcgYXMgd2Un
ZCBoYXZlIHRvIGNvbnZlcnQgdGhlIGJlemllciBmdW5jdGlvbiBiYWNrIHRvIGFuIGVhc2luZyBj
dXJ2ZQorc3RhdGljIGlubGluZSBxcmVhbCBhcHBseVRpbWluZ0Z1bmN0aW9uKGNvbnN0IFRpbWlu
Z0Z1bmN0aW9uJiB0aW1pbmdGdW5jdGlvbiwgcXJlYWwgcHJvZ3Jlc3MsIGludCBkdXJhdGlvbikK
K3sKKyAgICAgICAgaWYgKHRpbWluZ0Z1bmN0aW9uLnR5cGUoKSA9PSBMaW5lYXJUaW1pbmdGdW5j
dGlvbikKKyAgICAgICAgICAgIHJldHVybiBwcm9ncmVzczsKKyAgICAgICAgaWYgKHRpbWluZ0Z1
bmN0aW9uLnR5cGUoKSA9PSBDdWJpY0JlemllclRpbWluZ0Z1bmN0aW9uKSB7CisgICAgICAgICAg
ICByZXR1cm4gc29sdmVDdWJpY0JlemllckZ1bmN0aW9uKHRpbWluZ0Z1bmN0aW9uLngxKCksCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWluZ0Z1bmN0aW9u
LnkxKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWlu
Z0Z1bmN0aW9uLngyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIHRpbWluZ0Z1bmN0aW9uLnkyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGRvdWJsZShwcm9ncmVzcyksIGRvdWJsZShkdXJhdGlvbikgLyAxMDAwKTsK
KyAgICAgICAgfQorICAgICAgICByZXR1cm4gcHJvZ3Jlc3M7Cit9CisKKy8vIGhlbHBlciBmdW5j
dGlvbnMgdG8gc2FmZWx5IGdldCBhIHZhbHVlIG91dCBvZiBXZWJDb3JlJ3MgQW5pbWF0aW9uVmFs
dWUqCitzdGF0aWMgdm9pZCB3ZWJraXRBbmltYXRpb25Ub1F0QW5pbWF0aW9uVmFsdWUoY29uc3Qg
QW5pbWF0aW9uVmFsdWUqIGFuaW1hdGlvblZhbHVlLCBUcmFuc2Zvcm1PcGVyYXRpb25zJiB0cmFu
c2Zvcm1PcGVyYXRpb25zKQoreworICAgIHRyYW5zZm9ybU9wZXJhdGlvbnMgPSBUcmFuc2Zvcm1P
cGVyYXRpb25zKCk7CisgICAgaWYgKCFhbmltYXRpb25WYWx1ZSkKKyAgICAgICAgcmV0dXJuOwor
CisgICAgY29uc3QgVHJhbnNmb3JtT3BlcmF0aW9ucyogb3BzID0gc3RhdGljX2Nhc3Q8Y29uc3Qg
VHJhbnNmb3JtQW5pbWF0aW9uVmFsdWUqPihhbmltYXRpb25WYWx1ZSktPnZhbHVlKCk7CisKKyAg
ICBpZiAob3BzKQorICAgICAgICB0cmFuc2Zvcm1PcGVyYXRpb25zID0gKm9wczsKK30KKworc3Rh
dGljIHZvaWQgd2Via2l0QW5pbWF0aW9uVG9RdEFuaW1hdGlvblZhbHVlKGNvbnN0IEFuaW1hdGlv
blZhbHVlKiBhbmltYXRpb25WYWx1ZSwgcXJlYWwmIHJlYWxWYWx1ZSkKK3sKKyAgICByZWFsVmFs
dWUgPSBhbmltYXRpb25WYWx1ZSA/IHN0YXRpY19jYXN0PGNvbnN0IEZsb2F0QW5pbWF0aW9uVmFs
dWUqPihhbmltYXRpb25WYWx1ZSktPnZhbHVlKCkgOiAwOworfQorCisvLyB3ZSBwdXQgYSBiaXQg
b2YgdGhlIGZ1bmN0aW9uYWxpdHkgaW4gYSBiYXNlIGNsYXNzIHRvIGFsbG93IGNhc3RpbmcgYW5k
IHRvIHNhdmUgc29tZSBjb2RlIHNpemUKK2NsYXNzIEFuaW1hdGlvblF0QmFzZSA6IHB1YmxpYyBR
QWJzdHJhY3RBbmltYXRpb24geworcHVibGljOgorICAgIEFuaW1hdGlvblF0QmFzZShHcmFwaGlj
c0xheWVyUXRJbXBsKiBsYXllciwgY29uc3QgS2V5ZnJhbWVWYWx1ZUxpc3QmIHZhbHVlcywgY29u
c3QgSW50U2l6ZSYgYm94U2l6ZSwgY29uc3QgQW5pbWF0aW9uKiBhbmltLCBjb25zdCBRU3RyaW5n
ICYgbmFtZSkKKyAgICAgICAgICAgIDogUUFic3RyYWN0QW5pbWF0aW9uKDApCisgICAgICAgICAg
ICAsIG1fbGF5ZXIobGF5ZXIpCisgICAgICAgICAgICAsIG1fYm94U2l6ZShib3hTaXplKQorICAg
ICAgICAgICAgLCBtX2R1cmF0aW9uKGFuaW0tPmR1cmF0aW9uKCkgKiAxMDAwKQorICAgICAgICAg
ICAgLCBtX2lzQWx0ZXJuYXRlKGFuaW0tPmRpcmVjdGlvbigpID09IEFuaW1hdGlvbjo6QW5pbWF0
aW9uRGlyZWN0aW9uQWx0ZXJuYXRlKQorICAgICAgICAgICAgLCBtX3dlYmtpdFByb3BlcnR5SUQo
dmFsdWVzLnByb3BlcnR5KCkpCisgICAgICAgICAgICAsIG1fa2V5ZnJhbWVzTmFtZShuYW1lKQor
ICAgIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlU3RhdGUoUUFic3RyYWN0QW5p
bWF0aW9uOjpTdGF0ZSBuZXdTdGF0ZSwgUUFic3RyYWN0QW5pbWF0aW9uOjpTdGF0ZSBvbGRTdGF0
ZSkKKyAgICB7CisgICAgICAgIFFBYnN0cmFjdEFuaW1hdGlvbjo6dXBkYXRlU3RhdGUobmV3U3Rh
dGUsIG9sZFN0YXRlKTsKKworICAgICAgICAvLyBmb3Igc29tZSByZWFzb24gSSBoYXZlIGRvIHRo
aXMgYXN5bmNocm9ub3VzbHkgLSBvciB0aGUgYW5pbWF0aW9uIHdvbid0IHdvcmsKKyAgICAgICAg
aWYgKG5ld1N0YXRlID09IFJ1bm5pbmcgJiYgb2xkU3RhdGUgPT0gU3RvcHBlZCkKKyAgICAgICAg
ICAgIFFUaW1lcjo6c2luZ2xlU2hvdCgwLCBtX2xheWVyLmRhdGEoKSwgU0xPVChub3RpZnlBbmlt
YXRpb25TdGFydGVkKCkpKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGludCBkdXJhdGlvbigpIGNv
bnN0IHsgcmV0dXJuIG1fZHVyYXRpb247IH0KKworICAgIFFXZWFrUG9pbnRlcjxHcmFwaGljc0xh
eWVyUXRJbXBsPiBtX2xheWVyOworICAgIEludFNpemUgbV9ib3hTaXplOworICAgIGludCBtX2R1
cmF0aW9uOworICAgIGJvb2wgbV9pc0FsdGVybmF0ZTsKKyAgICBBbmltYXRlZFByb3BlcnR5SUQg
bV93ZWJraXRQcm9wZXJ0eUlEOworICAgIFFTdHJpbmcgbV9rZXlmcmFtZXNOYW1lOworfTsKKwor
Ly8gd2UnZCByYXRoZXIgaGF2ZSBhIHRlbXBsYXRpemVkIFFBYnN0cmFjdEFuaW1hdGlvbiB0aGFu
IFFQcm9wZXJ0eUFuaW1hdGlvbiAvIFFWYXJpYW50QW5pbWF0aW9uOworLy8gU2luY2Ugd2Uga25v
dyB0aGUgdHlwZXMgdGhhdCB3ZSdyZSBkZWFsaW5nIHdpdGgsIHRoZSBRT2JqZWN0L1FQcm9wZXJ0
eS9RVmFyaWFudCBhYnN0cmFjdGlvbgorLy8gYnV5cyB1cyB2ZXJ5IGxpdHRsZSBpbiB0aGlzIGNh
c2UsIGZvciB0b28gbXVjaCBvdmVyaGVhZAordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBB
bmltYXRpb25RdCA6IHB1YmxpYyBBbmltYXRpb25RdEJhc2UgeworCitwdWJsaWM6CisgICAgQW5p
bWF0aW9uUXQoR3JhcGhpY3NMYXllclF0SW1wbCogbGF5ZXIsIGNvbnN0IEtleWZyYW1lVmFsdWVM
aXN0JiB2YWx1ZXMsIGNvbnN0IEludFNpemUmIGJveFNpemUsIGNvbnN0IEFuaW1hdGlvbiogYW5p
bSwgY29uc3QgUVN0cmluZyAmIG5hbWUpCisgICAgICAgICAgICA6QW5pbWF0aW9uUXRCYXNlKGxh
eWVyLCB2YWx1ZXMsIGJveFNpemUsIGFuaW0sIG5hbWUpCisgICAgeworICAgICAgICAvLyBjb3B5
aW5nIHRob3NlIFdlYkNvcmUgc3RydWN0dXJlcyBpcyBub3QgdHJpdmlhbCwgd2UgaGF2ZSB0byBk
byBpdCBsaWtlIHRoaXMKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB2YWx1ZXMuc2l6
ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIGNvbnN0IEFuaW1hdGlvblZhbHVlKiBhbmltYXRpb25W
YWx1ZSA9IHZhbHVlcy5hdChpKTsKKyAgICAgICAgICAgIEtleWZyYW1lVmFsdWVRdDxUPiBrZXlm
cmFtZVZhbHVlOworICAgICAgICAgICAgaWYgKGFuaW1hdGlvblZhbHVlLT50aW1pbmdGdW5jdGlv
bigpKQorICAgICAgICAgICAgICAgIGtleWZyYW1lVmFsdWUudGltaW5nRnVuY3Rpb24gPSAqYW5p
bWF0aW9uVmFsdWUtPnRpbWluZ0Z1bmN0aW9uKCk7CisgICAgICAgICAgICB3ZWJraXRBbmltYXRp
b25Ub1F0QW5pbWF0aW9uVmFsdWUoYW5pbWF0aW9uVmFsdWUsIGtleWZyYW1lVmFsdWUudmFsdWUp
OworICAgICAgICAgICAga2V5ZnJhbWVWYWx1ZXNbYW5pbWF0aW9uVmFsdWUtPmtleVRpbWUoKV0g
PSBrZXlmcmFtZVZhbHVlOworICAgICAgICB9CisgICAgfQorCitwcm90ZWN0ZWQ6CisKKyAgICAv
LyB0aGlzIGlzIHRoZSBwYXJ0IHRoYXQgZGlmZmVycyBiZXR3ZWVuIGFuaW1hdGVkIHByb3BlcnRp
ZXMKKyAgICB2aXJ0dWFsIHZvaWQgYXBwbHlGcmFtZShjb25zdCBUJiBmcm9tVmFsdWUsIGNvbnN0
IFQmIHRvVmFsdWUsIHFyZWFsIHByb2dyZXNzKSA9IDA7CisKKyAgICB2aXJ0dWFsIHZvaWQgdXBk
YXRlQ3VycmVudFRpbWUoaW50IGN1cnJlbnRUaW1lKQorICAgIHsKKyAgICAgICAgaWYgKCFtX2xh
eWVyKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIHFyZWFsIHByb2dyZXNzID0gcXJl
YWwoY3VycmVudExvb3BUaW1lKCkpIC8gZHVyYXRpb24oKTsKKworICAgICAgICBpZiAobV9pc0Fs
dGVybmF0ZSAmJiBjdXJyZW50TG9vcCgpJTIpCisgICAgICAgICAgICBwcm9ncmVzcyA9IDEtcHJv
Z3Jlc3M7CisKKyAgICAgICAgaWYgKGtleWZyYW1lVmFsdWVzLmlzRW1wdHkoKSkKKyAgICAgICAg
ICAgIHJldHVybjsKKworICAgICAgICAvLyB3ZSBmaW5kIHRoZSBjdXJyZW50IGZyb20tdG8ga2V5
ZnJhbWVzIGluIG91ciBsaXR0bGUgbWFwCisgICAgICAgIHR5cGVuYW1lIFFNYXA8cXJlYWwsIEtl
eWZyYW1lVmFsdWVRdDxUPiA+OjppdGVyYXRvciBpdCA9IGtleWZyYW1lVmFsdWVzLmZpbmQocHJv
Z3Jlc3MpOworCisgICAgICAgIC8vIHdlIGRpZG4ndCBmaW5kIGFuIGV4YWN0IG1hdGNoLCB3ZSB0
cnkgdGhlIGNsb3Nlc3QgbWF0Y2ggKGxvd2VyIGJvdW5kKQorICAgICAgICBpZiAoaXQgPT0ga2V5
ZnJhbWVWYWx1ZXMuZW5kKCkpCisgICAgICAgICAgICBpdCA9IGtleWZyYW1lVmFsdWVzLmxvd2Vy
Qm91bmQocHJvZ3Jlc3MpLTE7CisKKyAgICAgICAgLy8gd2UgZGlkbid0IGZpbmQgYW55IG1hdGNo
IC0gd2UgdXNlIHRoZSBmaXJzdCBrZXlmcmFtZQorICAgICAgICBpZiAoaXQgPT0ga2V5ZnJhbWVW
YWx1ZXMuZW5kKCkpCisgICAgICAgICAgICBpdCA9IGtleWZyYW1lVmFsdWVzLmJlZ2luKCk7CisK
KyAgICAgICAgdHlwZW5hbWUgUU1hcDxxcmVhbCwgS2V5ZnJhbWVWYWx1ZVF0PFQ+ID46Oml0ZXJh
dG9yIGl0MiA9IGl0KzE7CisgICAgICAgIGlmIChpdDIgPT0ga2V5ZnJhbWVWYWx1ZXMuZW5kKCkp
CisgICAgICAgICAgICBpdDIgPSBrZXlmcmFtZVZhbHVlcy5iZWdpbigpOworICAgICAgICBjb25z
dCBLZXlmcmFtZVZhbHVlUXQ8VD4mIGZyb21LZXlmcmFtZSA9IGl0LnZhbHVlKCk7CisgICAgICAg
IGNvbnN0IEtleWZyYW1lVmFsdWVRdDxUPiYgdG9LZXlmcmFtZSA9IGl0Mi52YWx1ZSgpOworCisg
ICAgICAgIGNvbnN0IFRpbWluZ0Z1bmN0aW9uJiB0aW1pbmdGdW5jID0gZnJvbUtleWZyYW1lLnRp
bWluZ0Z1bmN0aW9uOworICAgICAgICBjb25zdCBUJiBmcm9tVmFsdWUgPSBmcm9tS2V5ZnJhbWUu
dmFsdWU7CisgICAgICAgIGNvbnN0IFQmIHRvVmFsdWUgPSB0b0tleWZyYW1lLnZhbHVlOworCisg
ICAgICAgIC8vIG5vdyB3ZSBoYXZlIGEgc291cmNlIGtleWZyYW1lLCBvcmlnaW4ga2V5ZnJhbWUg
YW5kIGEgdGltaW5nIGZ1bmN0aW9uCisgICAgICAgIC8vIHdlIGNhbiBub3cgcHJvY2VzcyB0aGUg
cHJvZ3Jlc3MgYW5kIGFwcGx5IHRoZSBmcmFtZQorICAgICAgICBxcmVhbCBub3JtYWxpemVkUHJv
Z3Jlc3MgPSAoaXQua2V5KCkgPT0gaXQyLmtleSgpKSA/IDAgOiAocHJvZ3Jlc3MgLSBpdC5rZXko
KSkgLyAoaXQyLmtleSgpIC0gaXQua2V5KCkpOworICAgICAgICBub3JtYWxpemVkUHJvZ3Jlc3Mg
PSBhcHBseVRpbWluZ0Z1bmN0aW9uKHRpbWluZ0Z1bmMsIG5vcm1hbGl6ZWRQcm9ncmVzcywgZHVy
YXRpb24oKSAvIDEwMDApOworICAgICAgICBhcHBseUZyYW1lKGZyb21WYWx1ZSwgdG9WYWx1ZSwg
bm9ybWFsaXplZFByb2dyZXNzKTsKKyAgICB9CisKKyAgICBRTWFwPHFyZWFsLCBLZXlmcmFtZVZh
bHVlUXQ8VD4gPiBrZXlmcmFtZVZhbHVlczsKK307CisKK2NsYXNzIFRyYW5zZm9ybUFuaW1hdGlv
blF0IDogcHVibGljIEFuaW1hdGlvblF0PFRyYW5zZm9ybU9wZXJhdGlvbnM+IHsKK3B1YmxpYzoK
KyAgICBUcmFuc2Zvcm1BbmltYXRpb25RdChHcmFwaGljc0xheWVyUXRJbXBsKiBsYXllciwgY29u
c3QgS2V5ZnJhbWVWYWx1ZUxpc3QmIHZhbHVlcywgY29uc3QgSW50U2l6ZSYgYm94U2l6ZSwgY29u
c3QgQW5pbWF0aW9uKiBhbmltLCBjb25zdCBRU3RyaW5nICYgbmFtZSkKKyAgICAgICAgICAgICAg
ICA6IEFuaW1hdGlvblF0PFRyYW5zZm9ybU9wZXJhdGlvbnM+KGxheWVyLCB2YWx1ZXMsIGJveFNp
emUsIGFuaW0sIG5hbWUpCisgICAgeworICAgIH0KKworICAgIH5UcmFuc2Zvcm1BbmltYXRpb25R
dCgpCisgICAgeworICAgICAgICAvLyB0aGlzIGNhbWUgdXAgZHVyaW5nIHRoZSBjb21wb3NpdGlu
Zy9hbmltYXRpb24gTGF5b3V0VGVzdHMKKyAgICAgICAgLy8gd2hlbiB0aGUgYW5pbWF0aW9uIGRp
ZXMsIHRoZSB0cmFuc2Zvcm0gaGFzIHRvIGdvIGJhY2sgdG8gZGVmYXVsdAorICAgICAgICBtX2xh
eWVyLmRhdGEoKS0+c2V0QmFzZVRyYW5zZm9ybShRVHJhbnNmb3JtKG1fbGF5ZXIuZGF0YSgpLT5t
X2xheWVyLT50cmFuc2Zvcm0oKSkpOworICAgIH0KKworICAgIC8vIHRoZSBpZGVhIGlzIHRoYXQg
d2UgbGV0IFdlYkNvcmUgbWFuYWdlIHRoZSB0cmFuc2Zvcm0tb3BlcmF0aW9ucworICAgIC8vIGFu
ZCBRdCBqdXN0IG1hbmFnZXMgdGhlIGFuaW1hdGlvbiBoZWFydGJlYXQgYW5kIHRoZSBib3R0b20t
bGluZSBRVHJhbnNmb3JtCisgICAgLy8gd2UgZ2V0IHRoZSBwZXJmb3JtYW5jZSBub3QgYnkgdXNp
bmcgUVRyYW5zZm9ybSBpbnN0ZWFkIG9mIFRyYW5zZm9ybWF0aW9uTWF0cml4LCBidXQgYnkgcHJv
cGVyIGNhY2hpbmcgb2YKKyAgICAvLyBpdGVtcyB0aGF0IGFyZSBleHBlbnNpdmUgZm9yIFdlYkNv
cmUgdG8gcmVuZGVyLiBXZSB3YW50IHRoZSByZXN0IHRvIGJlIGFzIGNsb3NlIHRvIFdlYkNvcmUn
cyBpZGVhIGFzIHBvc3NpYmxlLgorICAgIHZpcnR1YWwgdm9pZCBhcHBseUZyYW1lKGNvbnN0IFRy
YW5zZm9ybU9wZXJhdGlvbnMmIHNvdXJjZU9wZXJhdGlvbnMsIGNvbnN0IFRyYW5zZm9ybU9wZXJh
dGlvbnMmIHRhcmdldE9wZXJhdGlvbnMsIHFyZWFsIHByb2dyZXNzKQorICAgIHsKKyAgICAgICAg
VHJhbnNmb3JtYXRpb25NYXRyaXggdHJhbnNmb3JtTWF0cml4OworCisgICAgICAgIC8vIHRoaXMg
bG9va3Mgc2ltcGxlIGJ1dCBpcyByZWFsbHkgdHJpY2t5IHRvIGdldCByaWdodC4gVXNlIGNhdXRp
b24uCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdGFyZ2V0T3BlcmF0aW9ucy5zaXpl
KCk7ICsraSkKKyAgICAgICAgICAgIHRhcmdldE9wZXJhdGlvbnMub3BlcmF0aW9ucygpW2ldLT5i
bGVuZChzb3VyY2VPcGVyYXRpb25zLmF0KGkpLCBwcm9ncmVzcyktPmFwcGx5KHRyYW5zZm9ybU1h
dHJpeCwgbV9ib3hTaXplKTsKKworICAgICAgICBtX2xheWVyLmRhdGEoKS0+c2V0QmFzZVRyYW5z
Zm9ybShRVHJhbnNmb3JtKHRyYW5zZm9ybU1hdHJpeCkpOworICAgIH0KKworICAgIHZpcnR1YWwg
dm9pZCB1cGRhdGVTdGF0ZShRQWJzdHJhY3RBbmltYXRpb246OlN0YXRlIG5ld1N0YXRlLCBRQWJz
dHJhY3RBbmltYXRpb246OlN0YXRlIG9sZFN0YXRlKQorICAgIHsKKyAgICAgICAgQW5pbWF0aW9u
UXRCYXNlOjp1cGRhdGVTdGF0ZShuZXdTdGF0ZSwgb2xkU3RhdGUpOworICAgICAgICBpZiAoIW1f
bGF5ZXIpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIG1fbGF5ZXIuZGF0YSgpLT5mbHVz
aENoYW5nZXModHJ1ZSk7CisKKyAgICAgICAgLy8gdG8gaW5jcmVhc2UgRlBTLCB3ZSB1c2UgYSBs
ZXNzIGFjY3VyYXRlIGNhY2hpbmcgbWVjaGFuaXNtIHdoaWxlIGFuaW1hdGlvbiBpcyBnb2luZyBv
bgorICAgICAgICAvLyB0aGlzIGlzIGEgVVggY2hvaWNlIHRoYXQgc2hvdWxkIHByb2JhYmx5IGJl
IGN1c3RvbWl6YWJsZQorICAgICAgICBpZiAobmV3U3RhdGUgPT0gUUFic3RyYWN0QW5pbWF0aW9u
OjpSdW5uaW5nKSB7CisgICAgICAgICAgICBtX2xheWVyLmRhdGEoKS0+bV90cmFuc2Zvcm1Bbmlt
YXRpb25SdW5uaW5nID0gdHJ1ZTsKKyAgICAgICAgICAgIGlmIChtX2xheWVyLmRhdGEoKS0+Y2Fj
aGVNb2RlKCkgPT0gUUdyYXBoaWNzSXRlbTo6RGV2aWNlQ29vcmRpbmF0ZUNhY2hlKQorICAgICAg
ICAgICAgICAgIG1fbGF5ZXIuZGF0YSgpLT5zZXRDYWNoZU1vZGUoUUdyYXBoaWNzSXRlbTo6SXRl
bUNvb3JkaW5hdGVDYWNoZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtX2xheWVy
LmRhdGEoKS0+bV90cmFuc2Zvcm1BbmltYXRpb25SdW5uaW5nID0gZmFsc2U7CisgICAgICAgICAg
ICBpZiAobV9sYXllci5kYXRhKCktPmNhY2hlTW9kZSgpID09IFFHcmFwaGljc0l0ZW06Okl0ZW1D
b29yZGluYXRlQ2FjaGUpCisgICAgICAgICAgICAgICAgbV9sYXllci5kYXRhKCktPnNldENhY2hl
TW9kZShRR3JhcGhpY3NJdGVtOjpEZXZpY2VDb29yZGluYXRlQ2FjaGUpOworICAgICAgICB9Cisg
ICAgfQorfTsKKworY2xhc3MgT3BhY2l0eUFuaW1hdGlvblF0IDogcHVibGljIEFuaW1hdGlvblF0
PHFyZWFsPiB7CitwdWJsaWM6CisgICAgT3BhY2l0eUFuaW1hdGlvblF0KEdyYXBoaWNzTGF5ZXJR
dEltcGwqIGxheWVyLCBjb25zdCBLZXlmcmFtZVZhbHVlTGlzdCYgdmFsdWVzLCBjb25zdCBJbnRT
aXplJiBib3hTaXplLCBjb25zdCBBbmltYXRpb24qIGFuaW0sIGNvbnN0IFFTdHJpbmcgJiBuYW1l
KQorICAgICAgICAgICAgICAgIDogQW5pbWF0aW9uUXQ8cXJlYWw+KGxheWVyLCB2YWx1ZXMsIGJv
eFNpemUsIGFuaW0sIG5hbWUpCisgICAgeworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBhcHBs
eUZyYW1lKGNvbnN0IHFyZWFsJiBmcm9tVmFsdWUsIGNvbnN0IHFyZWFsJiB0b1ZhbHVlLCBxcmVh
bCBwcm9ncmVzcykKKyAgICB7CisgICAgICAgIG1fbGF5ZXIuZGF0YSgpLT5zZXRPcGFjaXR5KHFN
aW48cXJlYWw+KHFNYXg8cXJlYWw+KGZyb21WYWx1ZSArICh0b1ZhbHVlLWZyb21WYWx1ZSkqcHJv
Z3Jlc3MsIDApLCAxKSk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIHVwZGF0ZVN0YXRlKFFB
YnN0cmFjdEFuaW1hdGlvbjo6U3RhdGUgbmV3U3RhdGUsIFFBYnN0cmFjdEFuaW1hdGlvbjo6U3Rh
dGUgb2xkU3RhdGUpCisgICAgeworICAgICAgICBRQWJzdHJhY3RBbmltYXRpb246OnVwZGF0ZVN0
YXRlKG5ld1N0YXRlLCBvbGRTdGF0ZSk7CisKKyAgICAgICAgaWYgKCFtX2xheWVyKQorICAgICAg
ICAgICAgcmV0dXJuOworCisgICAgICAgIGlmIChuZXdTdGF0ZSA9PSBRQWJzdHJhY3RBbmltYXRp
b246OlJ1bm5pbmcpCisgICAgICAgICAgICBtX2xheWVyLmRhdGEoKS0+b3BhY2l0eUFuaW1hdGlv
blJ1bm5pbmcgPSB0cnVlOworICAgICAgICBlbHNlCisgICAgICAgICAgICBtX2xheWVyLmRhdGEo
KS0+b3BhY2l0eUFuaW1hdGlvblJ1bm5pbmcgPSBmYWxzZTsKKyAgICB9Cit9OworCitib29sIEdy
YXBoaWNzTGF5ZXJRdDo6YWRkQW5pbWF0aW9uKGNvbnN0IEtleWZyYW1lVmFsdWVMaXN0JiB2YWx1
ZXMsIGNvbnN0IEludFNpemUmIGJveFNpemUsIGNvbnN0IEFuaW1hdGlvbiogYW5pbSwgY29uc3Qg
U3RyaW5nJiBrZXlmcmFtZXNOYW1lLCBkb3VibGUgdGltZU9mZnNldCkKK3sKKyAgICBpZiAoIWFu
aW0tPmR1cmF0aW9uKCkgfHwgIWFuaW0tPml0ZXJhdGlvbkNvdW50KCkpCisgICAgICAgIHJldHVy
biBmYWxzZTsKKworICAgIFFBYnN0cmFjdEFuaW1hdGlvbiogbmV3QW5pbTsKKworICAgIHN3aXRj
aCAodmFsdWVzLnByb3BlcnR5KCkpIHsKKyAgICBjYXNlIEFuaW1hdGVkUHJvcGVydHlPcGFjaXR5
OgorICAgICAgICBuZXdBbmltID0gbmV3IE9wYWNpdHlBbmltYXRpb25RdChtX2ltcGwuZ2V0KCks
IHZhbHVlcywgYm94U2l6ZSwgYW5pbSwga2V5ZnJhbWVzTmFtZSk7CisgICAgICAgIGJyZWFrOwor
ICAgIGNhc2UgQW5pbWF0ZWRQcm9wZXJ0eVdlYmtpdFRyYW5zZm9ybToKKyAgICAgICAgbmV3QW5p
bSA9IG5ldyBUcmFuc2Zvcm1BbmltYXRpb25RdChtX2ltcGwuZ2V0KCksIHZhbHVlcywgYm94U2l6
ZSwgYW5pbSwga2V5ZnJhbWVzTmFtZSk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6Cisg
ICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyB3ZSBtYWtlIHN1cmUgV2ViQ29y
ZTo6QW5pbWF0aW9uIGFuZCBRQW5pbWF0aW9uIGFyZSBvbiB0aGUgc2FtZSB0ZXJtcworICAgIG5l
d0FuaW0tPnNldExvb3BDb3VudChhbmltLT5pdGVyYXRpb25Db3VudCgpKTsKKyAgICBtX2ltcGwt
Pm1fYW5pbWF0aW9ucy5hcHBlbmQoUVdlYWtQb2ludGVyPFFBYnN0cmFjdEFuaW1hdGlvbj4obmV3
QW5pbSkpOworICAgIFFPYmplY3Q6OmNvbm5lY3QoJm1faW1wbC0+bV9zdXNwZW5kVGltZXIsIFNJ
R05BTCh0aW1lb3V0KCkpLCBuZXdBbmltLCBTTE9UKHJlc3VtZSgpKSk7CisgICAgdGltZU9mZnNl
dCArPSBhbmltLT5kZWxheSgpOworCisgICAgLy8gZmx1c2ggbm93IG9yIGZsaWNrZXIuLi4KKyAg
ICBtX2ltcGwtPmZsdXNoQ2hhbmdlcyhmYWxzZSk7CisKKyAgICBpZiAodGltZU9mZnNldCkKKyAg
ICAgICAgUVRpbWVyOjpzaW5nbGVTaG90KHRpbWVPZmZzZXQgKiAxMDAwLCBuZXdBbmltLCBTTE9U
KHN0YXJ0KCkpKTsKKyAgICBlbHNlCisgICAgICAgIG5ld0FuaW0tPnN0YXJ0KCk7CisKKyAgICBR
T2JqZWN0Ojpjb25uZWN0KG5ld0FuaW0sIFNJR05BTChmaW5pc2hlZCgpKSwgbmV3QW5pbSwgU0xP
VChkZWxldGVMYXRlcigpKSk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBHcmFwaGlj
c0xheWVyUXQ6OnJlbW92ZUFuaW1hdGlvbnNGb3JQcm9wZXJ0eShBbmltYXRlZFByb3BlcnR5SUQg
aWQpCit7CisgICAgZm9yIChRTGlzdDxRV2Vha1BvaW50ZXI8UUFic3RyYWN0QW5pbWF0aW9uPiA+
OjppdGVyYXRvciBpdCA9IG1faW1wbC0+bV9hbmltYXRpb25zLmJlZ2luKCk7IGl0ICE9IG1faW1w
bC0+bV9hbmltYXRpb25zLmVuZCgpOyArK2l0KSB7CisgICAgICAgIGlmICgqaXQpIHsKKyAgICAg
ICAgICAgIEFuaW1hdGlvblF0QmFzZSogYW5pbSA9IHN0YXRpY19jYXN0PEFuaW1hdGlvblF0QmFz
ZSo+KGl0LT5kYXRhKCkpOworICAgICAgICAgICAgaWYgKGFuaW0gJiYgYW5pbS0+bV93ZWJraXRQ
cm9wZXJ0eUlEID09IGlkKSB7CisgICAgICAgICAgICAgICAgZGVsZXRlIGFuaW07CisgICAgICAg
ICAgICAgICAgaXQgPSBtX2ltcGwtPm1fYW5pbWF0aW9ucy5lcmFzZShpdCk7CisgICAgICAgICAg
ICAgICAgLS1pdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBH
cmFwaGljc0xheWVyUXQ6OnJlbW92ZUFuaW1hdGlvbnNGb3JLZXlmcmFtZXMoY29uc3QgU3RyaW5n
JiBuYW1lKQoreworICAgIGZvciAoUUxpc3Q8UVdlYWtQb2ludGVyPFFBYnN0cmFjdEFuaW1hdGlv
bj4gPjo6aXRlcmF0b3IgaXQgPSBtX2ltcGwtPm1fYW5pbWF0aW9ucy5iZWdpbigpOyBpdCAhPSBt
X2ltcGwtPm1fYW5pbWF0aW9ucy5lbmQoKTsgKytpdCkgeworICAgICAgICBpZiAoKml0KSB7Cisg
ICAgICAgICAgICBBbmltYXRpb25RdEJhc2UqIGFuaW0gPSBzdGF0aWNfY2FzdDxBbmltYXRpb25R
dEJhc2UqPigoKml0KS5kYXRhKCkpOworICAgICAgICAgICAgaWYgKGFuaW0gJiYgYW5pbS0+bV9r
ZXlmcmFtZXNOYW1lID09IFFTdHJpbmcobmFtZSkpIHsKKyAgICAgICAgICAgICAgICAoKml0KS5k
YXRhKCktPmRlbGV0ZUxhdGVyKCk7CisgICAgICAgICAgICAgICAgaXQgPSBtX2ltcGwtPm1fYW5p
bWF0aW9ucy5lcmFzZShpdCk7CisgICAgICAgICAgICAgICAgLS1pdDsKKyAgICAgICAgICAgIH0K
KyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBHcmFwaGljc0xheWVyUXQ6OnBhdXNlQW5pbWF0
aW9uKGNvbnN0IFN0cmluZyYgbmFtZSwgZG91YmxlIHRpbWVPZmZzZXQpCit7CisgICAgZm9yIChR
TGlzdDxRV2Vha1BvaW50ZXI8UUFic3RyYWN0QW5pbWF0aW9uPiA+OjppdGVyYXRvciBpdCA9IG1f
aW1wbC0+bV9hbmltYXRpb25zLmJlZ2luKCk7IGl0ICE9IG1faW1wbC0+bV9hbmltYXRpb25zLmVu
ZCgpOyArK2l0KSB7CisgICAgICAgIGlmICgqaXQpIHsKKyAgICAgICAgICAgIEFuaW1hdGlvblF0
QmFzZSogYW5pbSA9IHN0YXRpY19jYXN0PEFuaW1hdGlvblF0QmFzZSo+KCgqaXQpLmRhdGEoKSk7
CisgICAgICAgICAgICBpZiAoYW5pbSAmJiBhbmltLT5tX2tleWZyYW1lc05hbWUgPT0gUVN0cmlu
ZyhuYW1lKSkKKyAgICAgICAgICAgICAgICBRVGltZXI6OnNpbmdsZVNob3QodGltZU9mZnNldCAq
IDEwMDAsIGFuaW0sIFNMT1QocGF1c2UoKSkpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lk
IEdyYXBoaWNzTGF5ZXJRdDo6c3VzcGVuZEFuaW1hdGlvbnMoZG91YmxlIHRpbWUpCit7CisgICAg
aWYgKG1faW1wbC0+bV9zdXNwZW5kVGltZXIuaXNBY3RpdmUoKSkgeworICAgICAgICBtX2ltcGwt
Pm1fc3VzcGVuZFRpbWVyLnN0b3AoKTsKKyAgICAgICAgbV9pbXBsLT5tX3N1c3BlbmRUaW1lci5z
dGFydCh0aW1lICogMTAwMCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yIChRTGlzdDxRV2Vh
a1BvaW50ZXI8UUFic3RyYWN0QW5pbWF0aW9uPiA+OjppdGVyYXRvciBpdCA9IG1faW1wbC0+bV9h
bmltYXRpb25zLmJlZ2luKCk7IGl0ICE9IG1faW1wbC0+bV9hbmltYXRpb25zLmVuZCgpOyArK2l0
KSB7CisgICAgICAgICAgICBRQWJzdHJhY3RBbmltYXRpb24qIGFuaW0gPSBpdC0+ZGF0YSgpOwor
ICAgICAgICAgICAgaWYgKGFuaW0pCisgICAgICAgICAgICAgICAgYW5pbS0+cGF1c2UoKTsKKyAg
ICAgICAgfQorICAgIH0KK30KKwordm9pZCBHcmFwaGljc0xheWVyUXQ6OnJlc3VtZUFuaW1hdGlv
bnMoKQoreworICAgIGlmIChtX2ltcGwtPm1fc3VzcGVuZFRpbWVyLmlzQWN0aXZlKCkpIHsKKyAg
ICAgICAgbV9pbXBsLT5tX3N1c3BlbmRUaW1lci5zdG9wKCk7CisgICAgICAgIGZvciAoUUxpc3Q8
UVdlYWtQb2ludGVyPFFBYnN0cmFjdEFuaW1hdGlvbj4gPjo6aXRlcmF0b3IgaXQgPSBtX2ltcGwt
Pm1fYW5pbWF0aW9ucy5iZWdpbigpOyBpdCAhPSBtX2ltcGwtPm1fYW5pbWF0aW9ucy5lbmQoKTsg
KytpdCkgeworICAgICAgICAgICAgUUFic3RyYWN0QW5pbWF0aW9uKiBhbmltID0gKCppdCkuZGF0
YSgpOworICAgICAgICAgICAgaWYgKGFuaW0pCisgICAgICAgICAgICAgICAgYW5pbS0+cmVzdW1l
KCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK30KKworI2luY2x1ZGUgPEdyYXBoaWNzTGF5ZXJR
dC5tb2M+CkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3F0L0dyYXBoaWNzTGF5ZXJR
dC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIC9kZXYvbnVsbAorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy9xdC9HcmFwaGljc0xheWVyUXQuaAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSw4NyBAQAorLyoK
KyAgICBDb3B5cmlnaHQgKEMpIDIwMDkgTm9raWEgQ29ycG9yYXRpb24gYW5kL29yIGl0cyBzdWJz
aWRpYXJ5KC1pZXMpCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNh
biByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBv
ZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hl
ZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIg
b2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisK
KyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxs
IGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0
aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGlicmFyeSBHZW5lcmFs
IFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUg
cmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNl
CisgICAgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4g
IElmIG5vdCwgd3JpdGUgdG8KKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMu
LCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICAgIEJvc3RvbiwgTUEgMDIxMTAt
MTMwMSwgVVNBLgorKi8KKworI2lmbmRlZiBHcmFwaGljc0xheWVyUXRfaAorI2RlZmluZSBHcmFw
aGljc0xheWVyUXRfaAorCisjaW5jbHVkZSAiR3JhcGhpY3NMYXllci5oIgorI2luY2x1ZGUgIkdy
YXBoaWNzTGF5ZXJDbGllbnQuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitjbGFzcyBHcmFw
aGljc0xheWVyUXRJbXBsOworCitjbGFzcyBHcmFwaGljc0xheWVyUXQgOiBwdWJsaWMgR3JhcGhp
Y3NMYXllciB7CisgICAgZnJpZW5kIGNsYXNzIEdyYXBoaWNzTGF5ZXJRdEltcGw7CisKK3B1Ymxp
YzoKKyAgICBHcmFwaGljc0xheWVyUXQoR3JhcGhpY3NMYXllckNsaWVudCopOworICAgIHZpcnR1
YWwgfkdyYXBoaWNzTGF5ZXJRdCgpOworCisgICAgLy8gcmVpbXBzIGZyb20gR3JhcGhpY3NMYXll
ci5oCisgICAgdmlydHVhbCBOYXRpdmVMYXllciBuYXRpdmVMYXllcigpIGNvbnN0OworICAgIHZp
cnR1YWwgUGxhdGZvcm1MYXllciogcGxhdGZvcm1MYXllcigpIGNvbnN0OworICAgIHZpcnR1YWwg
dm9pZCBzZXROZWVkc0Rpc3BsYXkoKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0TmVlZHNEaXNwbGF5
SW5SZWN0KGNvbnN0IEZsb2F0UmVjdCYpOworICAgIHZpcnR1YWwgdm9pZCBzZXRQYXJlbnQoR3Jh
cGhpY3NMYXllciogbGF5ZXIpOworICAgIHZpcnR1YWwgdm9pZCBzZXROYW1lKGNvbnN0IFN0cmlu
ZyYgbmFtZSk7CisgICAgdmlydHVhbCBib29sIHNldENoaWxkcmVuKGNvbnN0IFZlY3RvcjxHcmFw
aGljc0xheWVyKj4mKTsKKyAgICB2aXJ0dWFsIHZvaWQgYWRkQ2hpbGQoR3JhcGhpY3NMYXllciop
OworICAgIHZpcnR1YWwgdm9pZCBhZGRDaGlsZEF0SW5kZXgoR3JhcGhpY3NMYXllciosIGludCBp
bmRleCk7CisgICAgdmlydHVhbCB2b2lkIGFkZENoaWxkQWJvdmUoR3JhcGhpY3NMYXllciogbGF5
ZXIsIEdyYXBoaWNzTGF5ZXIqIHNpYmxpbmcpOworICAgIHZpcnR1YWwgdm9pZCBhZGRDaGlsZEJl
bG93KEdyYXBoaWNzTGF5ZXIqIGxheWVyLCBHcmFwaGljc0xheWVyKiBzaWJsaW5nKTsKKyAgICB2
aXJ0dWFsIGJvb2wgcmVwbGFjZUNoaWxkKEdyYXBoaWNzTGF5ZXIqIG9sZENoaWxkLCBHcmFwaGlj
c0xheWVyKiBuZXdDaGlsZCk7CisgICAgdmlydHVhbCB2b2lkIHJlbW92ZUZyb21QYXJlbnQoKTsK
KyAgICB2aXJ0dWFsIHZvaWQgc2V0TWFza0xheWVyKEdyYXBoaWNzTGF5ZXIqIGxheWVyKTsKKyAg
ICB2aXJ0dWFsIHZvaWQgc2V0UG9zaXRpb24oY29uc3QgRmxvYXRQb2ludCYgcCk7CisgICAgdmly
dHVhbCB2b2lkIHNldEFuY2hvclBvaW50KGNvbnN0IEZsb2F0UG9pbnQzRCYgcCk7CisgICAgdmly
dHVhbCB2b2lkIHNldFNpemUoY29uc3QgRmxvYXRTaXplJiBzaXplKTsKKyAgICB2aXJ0dWFsIHZv
aWQgc2V0VHJhbnNmb3JtKGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4JiB0KTsKKyAgICB2aXJ0
dWFsIHZvaWQgc2V0Q2hpbGRyZW5UcmFuc2Zvcm0oY29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgm
IHQpOworICAgIHZpcnR1YWwgdm9pZCBzZXRQcmVzZXJ2ZXMzRChib29sIGIpOworICAgIHZpcnR1
YWwgdm9pZCBzZXRNYXNrc1RvQm91bmRzKGJvb2wgYik7CisgICAgdmlydHVhbCB2b2lkIHNldERy
YXdzQ29udGVudChib29sIGIpOworICAgIHZpcnR1YWwgdm9pZCBzZXRCYWNrZ3JvdW5kQ29sb3Io
Y29uc3QgQ29sb3ImKTsKKyAgICB2aXJ0dWFsIHZvaWQgY2xlYXJCYWNrZ3JvdW5kQ29sb3IoKTsK
KyAgICB2aXJ0dWFsIHZvaWQgc2V0Q29udGVudHNPcGFxdWUoYm9vbCBiKTsKKyAgICB2aXJ0dWFs
IHZvaWQgc2V0QmFja2ZhY2VWaXNpYmlsaXR5KGJvb2wgYik7CisgICAgdmlydHVhbCB2b2lkIHNl
dE9wYWNpdHkoZmxvYXQgb3BhY2l0eSk7CisgICAgdmlydHVhbCB2b2lkIHNldENvbnRlbnRzUmVj
dChjb25zdCBJbnRSZWN0JiByKTsKKyAgICB2aXJ0dWFsIGJvb2wgYWRkQW5pbWF0aW9uKGNvbnN0
IEtleWZyYW1lVmFsdWVMaXN0JiwgY29uc3QgSW50U2l6ZSYgYm94U2l6ZSwgY29uc3QgQW5pbWF0
aW9uKiwgY29uc3QgU3RyaW5nJiBrZXlmcmFtZXNOYW1lLCBkb3VibGUgdGltZU9mZnNldCk7Cisg
ICAgdmlydHVhbCB2b2lkIHJlbW92ZUFuaW1hdGlvbnNGb3JQcm9wZXJ0eShBbmltYXRlZFByb3Bl
cnR5SUQpOworICAgIHZpcnR1YWwgdm9pZCByZW1vdmVBbmltYXRpb25zRm9yS2V5ZnJhbWVzKGNv
bnN0IFN0cmluZyYga2V5ZnJhbWVzTmFtZSk7CisgICAgdmlydHVhbCB2b2lkIHBhdXNlQW5pbWF0
aW9uKGNvbnN0IFN0cmluZyYga2V5ZnJhbWVzTmFtZSwgZG91YmxlIHRpbWVPZmZzZXQpOworICAg
IHZpcnR1YWwgdm9pZCBzdXNwZW5kQW5pbWF0aW9ucyhkb3VibGUgdGltZSk7CisgICAgdmlydHVh
bCB2b2lkIHJlc3VtZUFuaW1hdGlvbnMoKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0Q29udGVudHNU
b0ltYWdlKEltYWdlKik7CisgICAgdmlydHVhbCB2b2lkIHNldENvbnRlbnRzQmFja2dyb3VuZENv
bG9yKGNvbnN0IENvbG9yJik7CisgICAgdmlydHVhbCB2b2lkIHNldEdlb21ldHJ5T3JpZW50YXRp
b24oQ29tcG9zaXRpbmdDb29yZGluYXRlc09yaWVudGF0aW9uIG9yaWVudGF0aW9uKTsKKyAgICB2
aXJ0dWFsIHZvaWQgc2V0Q29udGVudHNPcmllbnRhdGlvbihDb21wb3NpdGluZ0Nvb3JkaW5hdGVz
T3JpZW50YXRpb24gb3JpZW50YXRpb24pOworICAgIHZpcnR1YWwgdm9pZCBkaXN0cmlidXRlT3Bh
Y2l0eShmbG9hdCk7CisgICAgdmlydHVhbCBmbG9hdCBhY2N1bXVsYXRlZE9wYWNpdHkoKSBjb25z
dDsKKyAgICB2aXJ0dWFsIHZvaWQgc3luY0NvbXBvc2l0aW5nU3RhdGUoKTsKKworcHJpdmF0ZToK
KyAgICBPd25QdHI8R3JhcGhpY3NMYXllclF0SW1wbD4gbV9pbXBsOworCit9OworCisKK30KKyNl
bmRpZiAvLyBHcmFwaGljc0xheWVyUXRfaApJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy9HcmFwaGljc0xheWVyLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy9HcmFwaGljc0xheWVyLmgJKHJldmlzaW9uIDUzNDI3KQorKysgV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy9HcmFwaGljc0xheWVyLmgJKHdvcmtpbmcgY29weSkKQEAgLTU5LDYgKzU5LDEwIEBA
CiB0eXBlZGVmIFdLQ0FDRkxheWVyIFBsYXRmb3JtTGF5ZXI7CiB0eXBlZGVmIHZvaWQqIE5hdGl2
ZUxheWVyOwogfQorI2VsaWYgUExBVEZPUk0oUVQpCitjbGFzcyBRR3JhcGhpY3NJdGVtOwordHlw
ZWRlZiBRR3JhcGhpY3NJdGVtIFBsYXRmb3JtTGF5ZXI7Cit0eXBlZGVmIFFHcmFwaGljc0l0ZW0q
IE5hdGl2ZUxheWVyOwogI2Vsc2UKIHR5cGVkZWYgdm9pZCogUGxhdGZvcm1MYXllcjsKIHR5cGVk
ZWYgdm9pZCogTmF0aXZlTGF5ZXI7CkluZGV4OiBXZWJLaXQucHJpCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdl
YktpdC5wcmkJKHJldmlzaW9uIDUzNDI3KQorKysgV2ViS2l0LnByaQkod29ya2luZyBjb3B5KQpA
QCAtNDUsNiArNDUsNyBAQAogICAgIH0KICAgICBERVBFTkRQQVRIICs9ICQkUFdEL1dlYktpdC9x
dC9BcGkKIH0KKyFjb250YWlucyhRVF9WRVJTSU9OLCAiXjRcLlswLTVdIik6REVGSU5FUyArPSBX
VEZfVVNFX0FDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HCiAKICFtYWM6IXVuaXh8c3ltYmlhbiB7CiAg
ICAgREVGSU5FUyArPSBVU0VfU1lTVEVNX01BTExPQwo=
</data>
<flag name="review"
          id="29223"
          type_id="1"
          status="-"
          setter="koivisto"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>46978</attachid>
            <date>2010-01-19 22:32:30 -0800</date>
            <delta_ts>2010-01-20 00:02:53 -0800</delta_ts>
            <desc>compositing layers: +Compile fixes for Qt 4.5, ChangeLog</desc>
            <filename>patch-GraphicsLayerQt-4.diff</filename>
            <type>text/plain</type>
            <size>76738</size>
            <attacher name="Noam Rosenthal">noam</attacher>
            
              <data encoding="base64">SW5kZXg6IENoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBDaGFuZ2VMb2cJKHJldmlzaW9uIDUzNTI0
KQorKysgQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMTMgQEAKKzIwMTAtMDEt
MTkgIE5vJ2FtIFJvc2VudGhhbCAgPG5vYW0ucm9zZW50aGFsQG5va2lhLmNvbT4KKworICAgICAg
ICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBbUXRdIEltcGxlbWVudCBH
cmFwaGljc0xheWVyIGZvciBhY2NlbGVyYXRlZCBsYXllciBjb21wb3NpdGluZworICAgICAgICBo
dHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MzM1MTQKKworICAgICAgICAq
IFdlYktpdC5wcmk6IEFkZGRlZCBjb21waWxlIGZsYWdzIHRvIGVuYWJsZSBhY2NlbGVyYXRlZCBj
b21wb3NpdGluZworCW9uIHZlcnNpb25zIGhpZ2hlciB0aGFuIDQuNQorCiAyMDEwLTAxLTE5ICBH
dXN0YXZvIE5vcm9uaGEgU2lsdmEgIDxnbnNAZ25vbWUub3JnPgogCiAgICAgICAgIFVucmV2aWV3
ZWQuIFNoYXJlZCBsaWJyYXJ5IHZlcnNpb25pbmcgdXBkYXRlIGZvciAxLjEuMTkuCkluZGV4OiBX
ZWJLaXQucHJpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdC5wcmkJKHJldmlzaW9uIDUzNDI3KQorKysg
V2ViS2l0LnByaQkod29ya2luZyBjb3B5KQpAQCAtNDUsNiArNDUsNyBAQCBidWlsZGluZy1saWJz
IHsKICAgICB9CiAgICAgREVQRU5EUEFUSCArPSAkJFBXRC9XZWJLaXQvcXQvQXBpCiB9CitncmVh
dGVyVGhhbihRVF9NSU5PUl9WRVJTSU9OLCA1KTpERUZJTkVTICs9IFdURl9VU0VfQUNDRUxFUkFU
RURfQ09NUE9TSVRJTkcKIAogIW1hYzohdW5peHxzeW1iaWFuIHsKICAgICBERUZJTkVTICs9IFVT
RV9TWVNURU1fTUFMTE9DCkluZGV4OiBXZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBX
ZWJDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gNTM1MjMpCisrKyBXZWJDb3JlL0NoYW5nZUxvZwko
d29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDExNCBAQAorMjAxMC0wMS0xOSAgTm8nYW0gUm9zZW50
aGFsICA8bm9hbS5yb3NlbnRoYWxAbm9raWEuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5P
Qk9EWSAoT09QUyEpLgorCisgICAgICAgIFtRdF0gSW1wbGVtZW50IEdyYXBoaWNzTGF5ZXIgZm9y
IGFjY2VsZXJhdGVkIGxheWVyIGNvbXBvc2l0aW5nCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJr
aXQub3JnL3Nob3dfYnVnLmNnaT9pZD0zMzUxNAorCisgICAgICAgIE5vIG5ldyB0ZXN0czogdGVz
dHMgaW4gTGF5b3V0VGVzdHMvY29tcG9zaXRpbmcgYXJlIG5vdyByZWxldmFudCBmb3IKKyAgICAg
ICAgUXRXZWJraXQhCisKKyAgICAgICAgKiBXZWJDb3JlLnBybzogYWRkZWQgYWNjZWxlcmF0ZWQt
Y29tcG9zaXRpbmcgcmVsYXRlZCBmaWxlcyAKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9H
cmFwaGljc0xheWVyLmg6IGRlZmluZSBRdC1zcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiAgICAgICAg
ICAgb2YgR3JhcGhpY3NMYXllcgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3F0L0dyYXBo
aWNzTGF5ZXJRdC5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllclF0
SW1wbDo6KTogSW1wbGVtZW50YXRpb24gb2YgR3JhcGhpY3NMYXllciB3aXRoCisgICAgICAgIGEg
UUdyYXBoaWNzSXRlbQorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllclF0SW1wbDo6Q29u
dGVudERhdGE6OkNvbnRlbnREYXRhKTogc2F2ZSAKKyAgICAgICAgcGl4bWFwL2NvbG9yIGluZm8g
Zm9yIGRpcmVjdGx5IGNvbXBvc2l0ZWQgY29udGVudAorICAgICAgICAoV2ViQ29yZTo6R3JhcGhp
Y3NMYXllclF0SW1wbDo6U3RhdGU6OlN0YXRlKTogc2F2ZSBpbmZvIGZvciBzeW5jaW5nCisgICAg
ICAgIChXZWJDb3JlOjpHcmFwaGljc0xheWVyUXRJbXBsOjpHcmFwaGljc0xheWVyUXRJbXBsKTog
Y3RvcgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllclF0SW1wbDo6fkdyYXBoaWNzTGF5
ZXJRdEltcGwpOiBkdG9yCisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0xheWVyUXRJbXBsOjpz
ZXRCYXNlVHJhbnNmb3JtKTogc2V0IFF0CisgICAgICAgIHRyYW5zZm9ybWF0aW9uIGluIHRoZSB3
YXkgV2ViQ29yZSB3YW50cyBpdAorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllclF0SW1w
bDo6b3BhcXVlQXJlYSk6IGNhbGN1bGF0ZSBvcGFxdWUgYXJlYQorICAgICAgICBiYXNlZCBvbiBp
bmZvIHdlIGhhdmUKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJRdEltcGw6OmJvdW5k
aW5nUmVjdCk6IHJlaW1wIFFHcmFwaGljc0l0ZW0KKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNz
TGF5ZXJRdEltcGw6OnBhaW50KTogcmVpbXAgUUdyYXBoaWNzSXRlbQorICAgICAgICAoV2ViQ29y
ZTo6R3JhcGhpY3NMYXllclF0SW1wbDo6ZHJhd0NvbnRlbnRzKTogZHJhdyBIVE1ML1BpeG1hcC9D
b2xvcgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllclF0SW1wbDo6bm90aWZ5Q2hhbmdl
KTogbGV0IFdlYkNvcmUga25vdworICAgICAgICBzb21ldGhpbmcgaGFzIGNoYW5nZWQKKyAgICAg
ICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJRdEltcGw6OmZsdXNoQ2hhbmdlcyk6IE1ha2UgdGhl
IGNoYW5nZXMgYXBwZWFyCisgICAgICAgIG9uIHNjcmVlbiBieSBzZXR0aW5nIHRoZW0gdG8gUUdy
YXBoaWNzSXRlbXMKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJRdEltcGw6Om5vdGlm
eUFuaW1hdGlvblN0YXJ0ZWQpOiBsZXQgV2ViQ29yZQorICAgICAgICBrbm93IHRoZSBRQW5pbWF0
aW9uIHN0YXJ0ZWQKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJRdDo6R3JhcGhpY3NM
YXllclF0KTogY3RvcgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllclF0Ojp+R3JhcGhp
Y3NMYXllclF0KTogZHRvcgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllcjo6Y3JlYXRl
KTogaG9vayBmb3IgV2ViQ29yZSB0byBrbm93IHdlJ3JlCisgICAgICAgIGltcGxlbWVudGluZyBj
b21wb3NpdGluZworICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllcjo6Y29tcG9zaXRpbmdD
b29yZGluYXRlc09yaWVudGF0aW9uKTogaG9vayBmb3IKKyAgICAgICAgV2ViQ29yZSB0byBrbm93
IHdlIHVzZSBhIHRvcC1kb3duIHN5c3RlbQorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXll
clF0OjpzZXROZWVkc0Rpc3BsYXkpOiB1cGRhdGUgdGhlIGRpc3BsYXkKKyAgICAgICAgKFdlYkNv
cmU6OkdyYXBoaWNzTGF5ZXJRdDo6c2V0TmVlZHNEaXNwbGF5SW5SZWN0KTogdWRwYXRlIHBhcnQg
b2YgdGhlCisgICAgICAgIGRpc3BsYXkKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJR
dDo6c2V0TmFtZSk6IHJlaW1wCisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0xheWVyUXQ6OnNl
dFBhcmVudCk6IHJlaW1wCisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0xheWVyUXQ6OnNldENo
aWxkcmVuKTogcmVpbXAKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJRdDo6YWRkQ2hp
bGQpOiByZWltcAorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllclF0OjphZGRDaGlsZEF0
SW5kZXgpOiByZWltcAorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllclF0OjphZGRDaGls
ZEFib3ZlKTogcmVpbXAKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJRdDo6YWRkQ2hp
bGRCZWxvdyk6IHJlaW1wCisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0xheWVyUXQ6OnJlcGxh
Y2VDaGlsZCk6IHJlaW1wCisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0xheWVyUXQ6OnJlbW92
ZUZyb21QYXJlbnQpOiByZWltcAorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllclF0Ojpz
ZXRNYXNrTGF5ZXIpOiByZWltcAorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllclF0Ojpz
ZXRQb3NpdGlvbik6IHJlaW1wCisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0xheWVyUXQ6OnNl
dEFuY2hvclBvaW50KTogcmVpbXAKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJRdDo6
c2V0U2l6ZSk6IHJlaW1wCisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0xheWVyUXQ6OnNldFRy
YW5zZm9ybSk6IHJlaW1wCisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0xheWVyUXQ6OnNldENo
aWxkcmVuVHJhbnNmb3JtKTogcmVpbXAKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJR
dDo6c2V0UHJlc2VydmVzM0QpOiByZWltcAorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXll
clF0OjpzZXRNYXNrc1RvQm91bmRzKTogcmVpbXAKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNz
TGF5ZXJRdDo6c2V0RHJhd3NDb250ZW50KTogcmVpbXAKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBo
aWNzTGF5ZXJRdDo6c2V0QmFja2dyb3VuZENvbG9yKTogcmVpbXAKKyAgICAgICAgKFdlYkNvcmU6
OkdyYXBoaWNzTGF5ZXJRdDo6Y2xlYXJCYWNrZ3JvdW5kQ29sb3IpOiByZWltcAorICAgICAgICAo
V2ViQ29yZTo6R3JhcGhpY3NMYXllclF0OjpzZXRDb250ZW50c09wYXF1ZSk6IHJlaW1wCisgICAg
ICAgIChXZWJDb3JlOjpHcmFwaGljc0xheWVyUXQ6OnNldEJhY2tmYWNlVmlzaWJpbGl0eSk6IHJl
aW1wCisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0xheWVyUXQ6OnNldE9wYWNpdHkpOiByZWlt
cAorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllclF0OjpzZXRDb250ZW50c1JlY3QpOiBy
ZWltcAorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllclF0OjpzZXRDb250ZW50c1RvSW1h
Z2UpOiByZWltcAorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllclF0OjpzZXRDb250ZW50
c0JhY2tncm91bmRDb2xvcik6IHJlaW1wCisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0xheWVy
UXQ6OnNldEdlb21ldHJ5T3JpZW50YXRpb24pOiByZWltcAorICAgICAgICAoV2ViQ29yZTo6R3Jh
cGhpY3NMYXllclF0OjpzZXRDb250ZW50c09yaWVudGF0aW9uKTogcmVpbXAKKyAgICAgICAgKFdl
YkNvcmU6OkdyYXBoaWNzTGF5ZXJRdDo6ZGlzdHJpYnV0ZU9wYWNpdHkpOiByZWltcAorICAgICAg
ICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllclF0OjphY2N1bXVsYXRlZE9wYWNpdHkpOiByZWltcAor
ICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllclF0OjpzeW5jQ29tcG9zaXRpbmdTdGF0ZSk6
IHJlaW1wCisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0xheWVyUXQ6Om5hdGl2ZUxheWVyKTog
cmVpbXAgKFFHcmFwaGljc0l0ZW0qKQorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllclF0
OjpwbGF0Zm9ybUxheWVyKTogcmVpbXAgKFFHcmFwaGljc0l0ZW0qKQorICAgICAgICAoV2ViQ29y
ZTo6c29sdmVFcHNpbG9uKTogY29weSBmcm9tIEFuaW1hdGlvbkJhc2UuY3BwCisgICAgICAgIChX
ZWJDb3JlOjpzb2x2ZUN1YmljQmV6aWVyRnVuY3Rpb24pOiBjb3B5IGZyb20gQW5pYW10aW9uQmFz
ZS5jcHAKKyAgICAgICAgKFdlYkNvcmU6OmFwcGx5VGltaW5nRnVuY3Rpb24pOiB1c2UgV2ViQ29y
ZSdzIHRpbWluZyBhbmQgbm90IFF0J3MKKyAgICAgICAgKFdlYkNvcmU6OndlYmtpdEFuaW1hdGlv
blRvUXRBbmltYXRpb25WYWx1ZSk6IHNhZmVseSBmaWd1cmUgb3V0CisgICAgICAgIGFuaW1hdGlv
biB2YWx1ZXMKKyAgICAgICAgKFdlYkNvcmU6OkFuaW1hdGlvblF0QmFzZTo6QW5pbWF0aW9uUXRC
YXNlKTogYmFzZSBjbGFzcyBmb3IgUXQtYmFzZWQKKyAgICAgICAgV2ViY29yZS1pbml0aWF0ZWQg
YW5pbWF0aW9ucworICAgICAgICAoV2ViQ29yZTo6QW5pbWF0aW9uUXRCYXNlOjp1cGRhdGVTdGF0
ZSk6IG5vdGlmeSB3aGVuIGFuIGFuaW1hdGlvbgorICAgICAgICBzdGFydHMKKyAgICAgICAgKFdl
YkNvcmU6OkFuaW1hdGlvblF0QmFzZTo6ZHVyYXRpb24pOiByZWltcCBRQWJzdHJhY3RBbmltYXRp
b24KKyAgICAgICAgKFdlYkNvcmU6OkFuaW1hdGlvblF0Ojo6QW5pbWF0aW9uUXRCYXNlKToKKyAg
ICAgICAgKFdlYkNvcmU6OkFuaW1hdGlvblF0Ojp1cGRhdGVDdXJyZW50VGltZSk6IHJlYWxpemUg
a2V5ZnJhbWVzIGZyb20KKyAgICAgICAgcHJvZ3Jlc3MKKyAgICAgICAgKFdlYkNvcmU6OlRyYW5z
Zm9ybUFuaW1hdGlvblF0OjpUcmFuc2Zvcm1BbmltYXRpb25RdCk6IGN0b3IKKyAgICAgICAgKFdl
YkNvcmU6OlRyYW5zZm9ybUFuaW1hdGlvblF0Ojp+VHJhbnNmb3JtQW5pbWF0aW9uUXQpOiBkdG9y
CisgICAgICAgIChXZWJDb3JlOjpUcmFuc2Zvcm1BbmltYXRpb25RdDo6YXBwbHlGcmFtZSk6IHNl
dCB0aGUgYWN0dWFsIFFUcmFuc2Zvcm0KKyAgICAgICAgYmFzZWQgb24gV2ViQ29yZSBUcmFuc2Zv
cm1PcGVyYXRpb25zCisgICAgICAgIChXZWJDb3JlOjpUcmFuc2Zvcm1BbmltYXRpb25RdDo6dXBk
YXRlU3RhdGUpOiBjaGFuZ2UgY2FjaGUgbW9kZQorICAgICAgICAoV2ViQ29yZTo6T3BhY2l0eUFu
aW1hdGlvblF0OjpPcGFjaXR5QW5pbWF0aW9uUXQpOgorICAgICAgICAoV2ViQ29yZTo6T3BhY2l0
eUFuaW1hdGlvblF0OjphcHBseUZyYW1lKTogY2hhbmdlIGl0ZW0ncyBvcGFjaXR5CisgICAgICAg
IChXZWJDb3JlOjpPcGFjaXR5QW5pbWF0aW9uUXQ6OnVwZGF0ZVN0YXRlKToKKyAgICAgICAgKFdl
YkNvcmU6OkdyYXBoaWNzTGF5ZXJRdDo6YWRkQW5pbWF0aW9uKTogY29udmVydCBXZWJDb3JlIEFu
aW1hdGlvbiB0bworICAgICAgICBRdCBBbmltYXRpb24KKyAgICAgICAgKFdlYkNvcmU6OkdyYXBo
aWNzTGF5ZXJRdDo6cmVtb3ZlQW5pbWF0aW9uc0ZvclByb3BlcnR5KToKKyAgICAgICAgKFdlYkNv
cmU6OkdyYXBoaWNzTGF5ZXJRdDo6cmVtb3ZlQW5pbWF0aW9uc0ZvcktleWZyYW1lcyk6CisgICAg
ICAgIChXZWJDb3JlOjpHcmFwaGljc0xheWVyUXQ6OnBhdXNlQW5pbWF0aW9uKToKKyAgICAgICAg
KFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJRdDo6c3VzcGVuZEFuaW1hdGlvbnMpOgorICAgICAgICAo
V2ViQ29yZTo6R3JhcGhpY3NMYXllclF0OjpyZXN1bWVBbmltYXRpb25zKToKKyAgICAgICAgKiBw
bGF0Zm9ybS9ncmFwaGljcy9xdC9HcmFwaGljc0xheWVyUXQuaDogQWRkZWQuCisgICAgICAgICog
cGxhdGZvcm0vcXQvUVdlYlBhZ2VDbGllbnQuaDogdmlydHVhbCBmdW5jdGlvbnMgZm9yIFFHcmFw
aGljc1dlYlZpZXcKKyAgICAgICAgY29tcG9zaXRpbmcKKyAgICAgICAgKFFXZWJQYWdlQ2xpZW50
OjpzZXRSb290R3JhcGhpY3NMYXllcik6IGxldCBRR3JhcGhpY3NXZWJWaWV3IGtub3cgdGhhdAor
ICAgICAgICBjb21wb3NpdGluZyBoYXMgc3RhcnRlZC9lbmRlZAorICAgICAgICAoUVdlYlBhZ2VD
bGllbnQ6Om1hcmtGb3JTeW5jKTogbGV0IFFHcmFwaGljc1dlYlZpZXcga25vdyB0aGUKKyAgICAg
ICAgY29tcG9zaXRpbmcgbGF5ZXJzIG5lZWQgdG8gc3luYywgZWl0aGVyIHNvb24gb3Igd2l0aCB0
aGUgbmV4dCB1cGRhdGUKKwogMjAxMC0wMS0xOSAgU2ltb24gRnJhc2VyICA8c2ltb24uZnJhc2Vy
QGFwcGxlLmNvbT4KIAogICAgICAgICBSZXZpZXdlZCBieSBEYW4gQmVybnN0ZWluLgpJbmRleDog
V2ViQ29yZS9XZWJDb3JlLnBybwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL1dlYkNvcmUucHJvCShy
ZXZpc2lvbiA1MzQyNykKKysrIFdlYkNvcmUvV2ViQ29yZS5wcm8JKHdvcmtpbmcgY29weSkKQEAg
LTI3MDcsNiArMjcwNywxOSBAQCBDT05GSUcoc3RhbmRhbG9uZV9wYWNrYWdlKTppc0VxdWFsKFFU
X01BCiAgICAgICAgICAgICBwbHVnaW5zL3dpbi9QYWludEhvb2tzLmFzbQogICAgIH0KIH0KK2Nv
bnRhaW5zKERFRklORVMsIFdURl9VU0VfQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpIHsKK0hFQURF
UlMgKz0gXAorICAgIHJlbmRlcmluZy9SZW5kZXJMYXllckJhY2tpbmcuaCBcCisgICAgcmVuZGVy
aW5nL1JlbmRlckxheWVyQ29tcG9zaXRvci5oIFwKKyAgICBwbGF0Zm9ybS9ncmFwaGljcy9HcmFw
aGljc0xheWVyLmggXAorICAgIHBsYXRmb3JtL2dyYXBoaWNzL0dyYXBoaWNzTGF5ZXJDbGllbnQu
aCBcCisgICAgcGxhdGZvcm0vZ3JhcGhpY3MvcXQvR3JhcGhpY3NMYXllclF0LmgKK1NPVVJDRVMg
Kz0gXAorICAgIHBsYXRmb3JtL2dyYXBoaWNzL0dyYXBoaWNzTGF5ZXIuY3BwIFwKKyAgICBwbGF0
Zm9ybS9ncmFwaGljcy9xdC9HcmFwaGljc0xheWVyUXQuY3BwIFwKKyAgICByZW5kZXJpbmcvUmVu
ZGVyTGF5ZXJCYWNraW5nLmNwcCBcCisgICAgcmVuZGVyaW5nL1JlbmRlckxheWVyQ29tcG9zaXRv
ci5jcHAKK30KIAogc3ltYmlhbiB7CiAgICAgc2hhcmVkIHsKSW5kZXg6IFdlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3MvR3JhcGhpY3NMYXllci5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3MvR3JhcGhpY3NMYXllci5oCShyZXZpc2lvbiA1MzQyNykKKysrIFdlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3MvR3JhcGhpY3NMYXllci5oCSh3b3JraW5nIGNvcHkpCkBAIC01OSw2
ICs1OSwxMCBAQCBjbGFzcyBXS0NBQ0ZMYXllcjsKIHR5cGVkZWYgV0tDQUNGTGF5ZXIgUGxhdGZv
cm1MYXllcjsKIHR5cGVkZWYgdm9pZCogTmF0aXZlTGF5ZXI7CiB9CisjZWxpZiBQTEFURk9STShR
VCkKK2NsYXNzIFFHcmFwaGljc0l0ZW07Cit0eXBlZGVmIFFHcmFwaGljc0l0ZW0gUGxhdGZvcm1M
YXllcjsKK3R5cGVkZWYgUUdyYXBoaWNzSXRlbSogTmF0aXZlTGF5ZXI7CiAjZWxzZQogdHlwZWRl
ZiB2b2lkKiBQbGF0Zm9ybUxheWVyOwogdHlwZWRlZiB2b2lkKiBOYXRpdmVMYXllcjsKSW5kZXg6
IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvcXQvR3JhcGhpY3NMYXllclF0LmNwcAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3F0L0dyYXBoaWNzTGF5ZXJRdC5jcHAJ
KHJldmlzaW9uIDApCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3F0L0dyYXBoaWNzTGF5
ZXJRdC5jcHAJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMTExNyBAQAorLyoKKyAgICBDb3B5cmln
aHQgKEMpIDIwMDkgTm9raWEgQ29ycG9yYXRpb24gYW5kL29yIGl0cyBzdWJzaWRpYXJ5KC1pZXMp
CisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1
dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExp
YnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJl
ZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vu
c2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxp
YnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwK
KyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3
YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNl
bnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBj
b3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcg
d2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3Jp
dGUgdG8KKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xp
biBTdHJlZXQsIEZpZnRoIEZsb29yLAorICAgIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgor
Ki8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkdyYXBoaWNzTGF5ZXJRdC5oIgor
CisjaW5jbHVkZSAiQ3VycmVudFRpbWUuaCIKKyNpbmNsdWRlICJGbG9hdFJlY3QuaCIKKyNpbmNs
dWRlICJHcmFwaGljc0NvbnRleHQuaCIKKyNpbmNsdWRlICJJbWFnZS5oIgorI2luY2x1ZGUgIlJl
ZkNvdW50ZWQuaCIKKyNpbmNsdWRlICJUcmFuc2xhdGVUcmFuc2Zvcm1PcGVyYXRpb24uaCIKKyNp
bmNsdWRlICJVbml0QmV6aWVyLmgiCisjaW5jbHVkZSA8UXRDb3JlL3FhYnN0cmFjdGFuaW1hdGlv
bi5oPgorI2luY2x1ZGUgPFF0Q29yZS9xZGVidWcuaD4KKyNpbmNsdWRlIDxRdENvcmUvcXNldC5o
PgorI2luY2x1ZGUgPFF0Q29yZS9xdGltZXIuaD4KKyNpbmNsdWRlIDxRdEd1aS9xYml0bWFwLmg+
CisjaW5jbHVkZSA8UXRHdWkvcWNvbG9yLmg+CisjaW5jbHVkZSA8UXRHdWkvcWdyYXBoaWNzZWZm
ZWN0Lmg+CisjaW5jbHVkZSA8UXRHdWkvcWdyYXBoaWNzaXRlbS5oPgorI2luY2x1ZGUgPFF0R3Vp
L3FncmFwaGljc3NjZW5lLmg+CisjaW5jbHVkZSA8UXRHdWkvcW1hdHJpeDR4NC5oPgorI2luY2x1
ZGUgPFF0R3VpL3FwYWludGVyLmg+CisjaW5jbHVkZSA8UXRHdWkvcXBhbGV0dGUuaD4KKyNpbmNs
dWRlIDxRdEd1aS9xcGl4bWFwLmg+CisjaW5jbHVkZSA8UXRHdWkvcXN0eWxlb3B0aW9uLmg+CisK
K25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgR3JhcGhpY3NMYXllclF0SW1wbCA6IHB1Ymxp
YyBRR3JhcGhpY3NPYmplY3QgeworICAgIFFfT0JKRUNUCisKK3B1YmxpYzoKKyAgICAvLyB0aGlz
IHNldCBvZiBmbGFncyBoZWxwIHVzIGRlZmVyIHdoaWNoIHByb3BlcnRpZXMgb2YgdGhlIGxheWVy
IGhhdmUgYmVlbgorICAgIC8vIG1vZGlmaWVkIGJ5IHRoZSBjb21wb3NpdG9yLCBzbyB3ZSBjYW4g
a25vdyB3aGF0IHRvIGxvb2sgZm9yIGluIHRoZSBuZXh0IGZsdXNoCisgICAgZW51bSBDaGFuZ2VN
YXNrIHsKKyAgICAgICAgTm9DaGFuZ2VzID0gICAgICAgICAgICAgICAgIDAsCisgICAgICAgIENo
aWxkcmVuQ2hhbmdlID0gICAgICAgICAgICAoMUwgPDwgMSksCisgICAgICAgIE1hc2tMYXllckNo
YW5nZSA9ICAgICAgICAgICAoMUwgPDwgMiksCisgICAgICAgIFBvc2l0aW9uQ2hhbmdlID0gICAg
ICAgICAgICAoMUwgPDwgMyksCisgICAgICAgIEFuY2hvclBvaW50Q2hhbmdlID0gICAgICAgICAo
MUwgPDwgNCksCisgICAgICAgIFNpemVDaGFuZ2UgID0gICAgICAgICAgICAgICAoMUwgPDwgNSks
CisgICAgICAgIFRyYW5zZm9ybUNoYW5nZSA9ICAgICAgICAgICAoMUwgPDwgNiksCisgICAgICAg
IENvbnRlbnRDaGFuZ2UgPSAgICAgICAgICAgICAoMUwgPDwgNyksCisgICAgICAgIEdlb21ldHJ5
T3JpZW50YXRpb25DaGFuZ2UgPSAoMUwgPDwgOCksCisgICAgICAgIENvbnRlbnRzT3JpZW50YXRp
b25DaGFuZ2UgPSAoMUwgPDwgOSksCisgICAgICAgIE9wYWNpdHlDaGFuZ2UgPSAgICAgICAgICAg
ICAoMUwgPDwgMTApLAorICAgICAgICBDb250ZW50c1JlY3RDaGFuZ2UgPSAgICAgICAgKDFMIDw8
IDExKSwKKyAgICAgICAgUHJlc2VydmVzM0RDaGFuZ2UgPSAgICAgICAgICgxTCA8PCAxMiksCisg
ICAgICAgIE1hc2tzVG9Cb3VuZHNDaGFuZ2UgPSAgICAgICAoMUwgPDwgMTMpLAorICAgICAgICBE
cmF3c0NvbnRlbnRDaGFuZ2UgPSAgICAgICAgKDFMIDw8IDE0KSwKKyAgICAgICAgQ29udGVudHNP
cGFxdWVDaGFuZ2UgPSAgICAgICgxTCA8PCAxNSksCisgICAgICAgIEJhY2tmYWNlVmlzaWJpbGl0
eUNoYW5nZSA9ICAoMUwgPDwgMTYpLAorICAgICAgICBDaGlsZHJlblRyYW5zZm9ybUNoYW5nZSA9
ICAgKDFMIDw8IDE3KSwKKyAgICAgICAgRGlzcGxheUNoYW5nZSA9ICAgICAgICAgICAgICgxTCA8
PCAxOCksCisgICAgICAgIEJhY2tncm91bmRDb2xvckNoYW5nZSA9ICAgICAoMUwgPDwgMTkpLAor
ICAgICAgICBQYXJlbnRDaGFuZ2UgPSAgICAgICAgICAgICAgKDFMIDw8IDIwKSwKKyAgICAgICAg
RGlzdHJpYnV0ZXNPcGFjaXR5Q2hhbmdlID0gICgxTCA8PCAyMSkKKyAgICB9OworCisgICAgLy8g
dGhlIGNvbXBvc2l0b3IgbGV0cyB1cyBzcGVjaWFsLWNhc2UgaW1hZ2VzIGFuZCBjb2xvcnMsIHNv
IHdlIHRyeSB0byBkbyBzbworICAgIGVudW0gU3RhdGljQ29udGVudFR5cGUgeyBIVE1MQ29udGVu
dFR5cGUsIFBpeG1hcENvbnRlbnRUeXBlLCBDb2xvckNvbnRlbnRUeXBlfTsKKworICAgIEdyYXBo
aWNzTGF5ZXJRdEltcGwoR3JhcGhpY3NMYXllclF0KiBuZXdMYXllcik7CisgICAgdmlydHVhbCB+
R3JhcGhpY3NMYXllclF0SW1wbCgpOworCisgICAgLy8gcmVpbXBzIGZyb20gUUdyYXBoaWNzSXRl
bQorICAgIHZpcnR1YWwgUVBhaW50ZXJQYXRoIG9wYXF1ZUFyZWEoKSBjb25zdDsKKyAgICB2aXJ0
dWFsIFFSZWN0RiBib3VuZGluZ1JlY3QoKSBjb25zdDsKKyAgICB2aXJ0dWFsIHZvaWQgcGFpbnQo
UVBhaW50ZXIqLCBjb25zdCBRU3R5bGVPcHRpb25HcmFwaGljc0l0ZW0qLCBRV2lkZ2V0Kik7CisK
KyAgICAvLyB3ZSBtYW5hZ2UgdHJhbnNmb3JtcyBvdXJzZWx2ZXMgYmVjYXVzZSB0cmFuc2Zvcm0t
b3JpZ2luIGFjdHMgZGlmZmVyZW50bHkgaW4gd2Via2l0IGFuZCBpbiBRdAorICAgIHZvaWQgc2V0
QmFzZVRyYW5zZm9ybShjb25zdCBRVHJhbnNmb3JtJik7CisgICAgdm9pZCBkcmF3Q29udGVudHMo
UVBhaW50ZXIqLCBjb25zdCBRUmVjdEYmLCBib29sIG1hc2sgPSBmYWxzZSk7CisKKyAgICAvLyBs
ZXQgdGhlIGNvbXBvc2l0b3ItQVBJIHRlbGwgdXMgd2hpY2ggcHJvcGVydGllcyB3ZXJlIGNoYW5n
ZWQKKyAgICB2b2lkIG5vdGlmeUNoYW5nZShDaGFuZ2VNYXNrKTsKKworICAgIC8vIGNhbGxlZCB3
aGVuIHRoZSBjb21wb3NpdG9yIGlzIHJlYWR5IGZvciB1cyB0byBzaG93IHRoZSBjaGFuZ2VzIG9u
IHNjcmVlbgorICAgIC8vIHRoaXMgaXMgY2FsbGVkIGluZGlyZWN0bHkgZnJvbSBDaHJvbWVDbGll
bnRRdDo6c2V0TmVlZHNPbmVTaG90RHJhd2luZ1N5bmNocm9uaXphdGlvbgorICAgIC8vIChtZWFu
aW5nIHRoZSBzeW5jIHdvdWxkIGhhcHBlbiB0b2dldGhlciB3aXRoIHRoZSBuZXh0IGRyYXcpCisg
ICAgLy8gb3IgQ2hyb21lQ2xpZW50UXQ6OnNjaGVkdWxlQ29tcG9zaXRpbmdMYXllclN5bmMgKG1l
YW5pbmcgdGhlIHN5bmMgd2lsbCBoYXBwZW4gQVNBUCkKKyAgICB2b2lkIGZsdXNoQ2hhbmdlcyhi
b29sIHJlY3Vyc2l2ZSA9IHRydWUpOworCitwdWJsaWMgc2xvdHM6CisgICAgLy8gd2UgbmVlZCB0
byBub3RpZnkgdGhlIGNsaWVudCAoYWthIHRoZSBsYXllciBjb21wb3NpdG9yKSB3aGVuIHRoZSBh
bmltYXRpb24gYWN0dWFsbHkgc3RhcnRzCisgICAgdm9pZCBub3RpZnlBbmltYXRpb25TdGFydGVk
KCk7CisKK3B1YmxpYzoKKyAgICBHcmFwaGljc0xheWVyUXQqIG1fbGF5ZXI7CisKKyAgICBRVHJh
bnNmb3JtIG1fYmFzZVRyYW5zZm9tOworICAgIGJvb2wgbV90cmFuc2Zvcm1BbmltYXRpb25SdW5u
aW5nOworICAgIGJvb2wgbV9vcGFjaXR5QW5pbWF0aW9uUnVubmluZzsKKworICAgIHN0cnVjdCBD
b250ZW50RGF0YSB7CisgICAgICAgIFFQaXhtYXAgcGl4bWFwOworICAgICAgICBRUmVnaW9uIHJl
Z2lvblRvVXBkYXRlOworICAgICAgICBib29sIHVwZGF0ZUFsbDsKKyAgICAgICAgUUNvbG9yIGNv
bnRlbnRzQmFja2dyb3VuZENvbG9yOworICAgICAgICBRQ29sb3IgYmFja2dyb3VuZENvbG9yOwor
ICAgICAgICBTdGF0aWNDb250ZW50VHlwZSBjb250ZW50VHlwZTsKKyAgICAgICAgZmxvYXQgb3Bh
Y2l0eTsKKyAgICAgICAgQ29udGVudERhdGEoKQorICAgICAgICAgICAgICAgIDogdXBkYXRlQWxs
KGZhbHNlKQorICAgICAgICAgICAgICAgICwgY29udGVudFR5cGUoSFRNTENvbnRlbnRUeXBlKQor
ICAgICAgICAgICAgICAgICwgb3BhY2l0eSgxLmYpCisgICAgICAgIHsKKyAgICAgICAgfQorCisg
ICAgfTsKKworICAgIENvbnRlbnREYXRhIG1fcGVuZGluZ0NvbnRlbnQ7CisgICAgQ29udGVudERh
dGEgbV9jdXJyZW50Q29udGVudDsKKworICAgIGludCBtX2NoYW5nZU1hc2s7CisKKyAgICBRU2l6
ZUYgbV9zaXplOworICAgIFFMaXN0PFFXZWFrUG9pbnRlcjxRQWJzdHJhY3RBbmltYXRpb24+ID4g
bV9hbmltYXRpb25zOworICAgIFFUaW1lciBtX3N1c3BlbmRUaW1lcjsKKworICAgIHN0cnVjdCBT
dGF0ZSB7CisgICAgICAgIEdyYXBoaWNzTGF5ZXIqIG1hc2tMYXllcjsKKyAgICAgICAgRmxvYXRQ
b2ludCBwb3M7CisgICAgICAgIEZsb2F0UG9pbnQzRCBhbmNob3JQb2ludDsKKyAgICAgICAgRmxv
YXRTaXplIHNpemU7CisgICAgICAgIFRyYW5zZm9ybWF0aW9uTWF0cml4IHRyYW5zZm9ybTsKKyAg
ICAgICAgVHJhbnNmb3JtYXRpb25NYXRyaXggY2hpbGRyZW5UcmFuc2Zvcm07CisgICAgICAgIENv
bG9yIGJhY2tncm91bmRDb2xvcjsKKyAgICAgICAgQ29sb3IgY3VycmVudENvbG9yOworICAgICAg
ICBHcmFwaGljc0xheWVyOjpDb21wb3NpdGluZ0Nvb3JkaW5hdGVzT3JpZW50YXRpb24gZ2VvT3Jp
ZW50YXRpb247CisgICAgICAgIEdyYXBoaWNzTGF5ZXI6OkNvbXBvc2l0aW5nQ29vcmRpbmF0ZXNP
cmllbnRhdGlvbiBjb250ZW50c09yaWVudGF0aW9uOworICAgICAgICBmbG9hdCBvcGFjaXR5Owor
ICAgICAgICBRUmVjdCBjb250ZW50c1JlY3Q7CisKKyAgICAgICAgYm9vbCBwcmVzZXJ2ZXMzRDog
MTsKKyAgICAgICAgYm9vbCBtYXNrc1RvQm91bmRzOiAxOworICAgICAgICBib29sIGRyYXdzQ29u
dGVudDogMTsKKyAgICAgICAgYm9vbCBjb250ZW50c09wYXF1ZTogMTsKKyAgICAgICAgYm9vbCBi
YWNrZmFjZVZpc2liaWxpdHk6IDE7CisgICAgICAgIGJvb2wgZGlzdHJpYnV0ZU9wYWNpdHk6IDE7
CisgICAgICAgIGJvb2wgYWxpZ246IDI7CisgICAgICAgIFN0YXRlKCk6IG1hc2tMYXllcigwKSwg
b3BhY2l0eSgxKSwgcHJlc2VydmVzM0QoZmFsc2UpLCBtYXNrc1RvQm91bmRzKGZhbHNlKSwKKyAg
ICAgICAgICAgICAgICAgIGRyYXdzQ29udGVudChmYWxzZSksIGNvbnRlbnRzT3BhcXVlKGZhbHNl
KSwgYmFja2ZhY2VWaXNpYmlsaXR5KGZhbHNlKSwKKyAgICAgICAgICAgICAgICAgIGRpc3RyaWJ1
dGVPcGFjaXR5KGZhbHNlKQorICAgICAgICB7CisgICAgICAgIH0KKyAgICB9IG1fc3RhdGU7Cit9
OworCitHcmFwaGljc0xheWVyUXRJbXBsOjpHcmFwaGljc0xheWVyUXRJbXBsKEdyYXBoaWNzTGF5
ZXJRdCogbmV3TGF5ZXIpCisgICAgOiBRR3JhcGhpY3NPYmplY3QoMCkKKyAgICAsIG1fbGF5ZXIo
bmV3TGF5ZXIpCisgICAgLCBtX3RyYW5zZm9ybUFuaW1hdGlvblJ1bm5pbmcoZmFsc2UpCisgICAg
LCBtX2NoYW5nZU1hc2soTm9DaGFuZ2VzKQoreworICAgIC8vIGJldHRlciB0byBjYWxjdWxhdGUg
dGhlIGV4cG9zZWQgcmVjdCBpbiBRR3JhcGhpY3NWaWV3IHRoYW4gb3Zlci1yZW5kZXIgaW4gV2Vi
Q29yZQorICAgIC8vIEZJWE1FOiB0ZXN0IGRpZmZlcmVudCBhcHByb2FjaGVzCisgICAgc2V0Rmxh
ZyhRR3JhcGhpY3NJdGVtOjpJdGVtVXNlc0V4dGVuZGVkU3R5bGVPcHRpb24sIHRydWUpOworCisg
ICAgLy8gd2UgdXNlIGdyYXBoaWNzLXZpZXcgZm9yIGNvbXBvc2l0aW5nLCBub3QgZm9yIGludGVy
YWN0aXZpdHkKKyAgICBzZXRBY2NlcHRlZE1vdXNlQnV0dG9ucyhRdDo6Tm9CdXR0b24pOworICAg
IHNldEVuYWJsZWQoZmFsc2UpOworCisgICAgLy8gd2UnbGwgc2V0IHRoZSBjYWNoZSB3aGVuIHdl
IGtub3cgd2hhdCdzIGdvaW5nIG9uCisgICAgc2V0Q2FjaGVNb2RlKE5vQ2FjaGUpOworfQorCitH
cmFwaGljc0xheWVyUXRJbXBsOjp+R3JhcGhpY3NMYXllclF0SW1wbCgpCit7CisgICAgLy8gdGhl
IGNvbXBvc2l0b3IgbWFuYWdlcyBpdGVtIGxpZmVjeWNsZSAtIHdlIGRvbid0IHdhbnQgdGhlIGdy
YXBoaWNzLXZpZXcKKyAgICAvLyBzeXN0ZW0gdG8gYXV0b21hdGljYWxseSBkZWxldGUgb3VyIGl0
ZW1zCisKKyAgICBjb25zdCBRTGlzdDxRR3JhcGhpY3NJdGVtKj4gY2hpbGRyZW4gPSBjaGlsZEl0
ZW1zKCk7CisgICAgZm9yIChRTGlzdDxRR3JhcGhpY3NJdGVtKj46OmNvbnN0X2l0ZXJhdG9yIGl0
ID0gY2hpbGRyZW4uYmVnaW4oKTsgaXQgIT0gY2hpbGRyZW4uZW5kKCk7ICsraXQpIHsKKyAgICAg
ICAgaWYgKFFHcmFwaGljc0l0ZW0qIGl0ZW0gPSAqaXQpIHsKKyAgICAgICAgICAgIGlmIChzY2Vu
ZSgpKQorICAgICAgICAgICAgICAgIHNjZW5lKCktPnJlbW92ZUl0ZW0oaXRlbSk7CisgICAgICAg
ICAgICBpdGVtLT5zZXRQYXJlbnRJdGVtKDApOworICAgICAgICB9CisgICAgfQorICAgIAorICAg
IC8vIHdlIGRvLCBob3dldmVyLCBvd24gdGhlIGFuaW1hdGlvbnMuLi4KKyAgICBmb3IgKFFMaXN0
PFFXZWFrUG9pbnRlcjxRQWJzdHJhY3RBbmltYXRpb24+ID46Oml0ZXJhdG9yIGl0ID0gbV9hbmlt
YXRpb25zLmJlZ2luKCk7IGl0ICE9IG1fYW5pbWF0aW9ucy5lbmQoKTsgKytpdCkKKyAgICAgICAg
aWYgKFFBYnN0cmFjdEFuaW1hdGlvbiogYW5pbSA9IGl0LT5kYXRhKCkpCisgICAgICAgICAgICBk
ZWxldGUgYW5pbTsKK30KKwordm9pZCBHcmFwaGljc0xheWVyUXRJbXBsOjpzZXRCYXNlVHJhbnNm
b3JtKGNvbnN0IFFUcmFuc2Zvcm0mIHRyYW5zZm9ybSkKK3sKKyAgICBpZiAoIW1fbGF5ZXIpCisg
ICAgICAgIHJldHVybjsKKyAgICAvLyB3ZWJraXQgaGFzIHJlbGF0aXZlLXRvLXNpemUgb3JpZ2lu
UG9pbnQsIGdyYXBoaWNzLXZpZXcgaGFzIGEgcGl4ZWwgb3JpZ2luUG9pbnQKKyAgICAvLyBoZXJl
IHdlIGNvbnZlcnQKKyAgICBRUG9pbnRGIG9yaWdpblRyYW5zbGF0ZSgKKyAgICAgICAgICAgIG1f
bGF5ZXItPmFuY2hvclBvaW50KCkueCgpICogbV9sYXllci0+c2l6ZSgpLndpZHRoKCksIG1fbGF5
ZXItPmFuY2hvclBvaW50KCkueSgpICogbV9sYXllci0+c2l6ZSgpLmhlaWdodCgpKTsKKworICAg
IHJlc2V0VHJhbnNmb3JtKCk7CisKKyAgICAvLyB3ZSBoYXZlIHRvIG1hbmFnZSB0aGlzIG91cnNl
bHZlcyBiZWNhdXNlIFFHcmFwaGljc1ZpZXcncyB0cmFuc2Zvcm1PcmlnaW4gaXMgaW5jb21wbGV0
ZQorICAgIHRyYW5zbGF0ZShvcmlnaW5UcmFuc2xhdGUueCgpLCBvcmlnaW5UcmFuc2xhdGUueSgp
KTsKKyAgICBzZXRUcmFuc2Zvcm0odHJhbnNmb3JtLCB0cnVlKTsKKyAgICB0cmFuc2xhdGUoLW9y
aWdpblRyYW5zbGF0ZS54KCksIC1vcmlnaW5UcmFuc2xhdGUueSgpKTsKKyAgICBtX2Jhc2VUcmFu
c2ZvbSA9IHRyYW5zZm9ybTsKK30KKworUVBhaW50ZXJQYXRoIEdyYXBoaWNzTGF5ZXJRdEltcGw6
Om9wYXF1ZUFyZWEoKSBjb25zdAoreworICAgIFFQYWludGVyUGF0aCBwYWludGVyUGF0aDsKKyAg
ICAvLyB3ZSB0cnkgb3V0IGJlc3QgdG8gcmV0dXJuIHRoZSBvcGFxdWUgYXJlYSwgbWF5YmUgaXQg
d2lsbCBoZWxwIGdyYXBoaWNzLXZpZXcgcmVuZGVyIGxlc3MgaXRlbXMKKyAgICBpZiAobV9jdXJy
ZW50Q29udGVudC5iYWNrZ3JvdW5kQ29sb3IuaXNWYWxpZCgpICYmIG1fY3VycmVudENvbnRlbnQu
YmFja2dyb3VuZENvbG9yLmFscGhhKCkgPT0gMHhmZikKKyAgICAgICAgcGFpbnRlclBhdGguYWRk
UmVjdChib3VuZGluZ1JlY3QoKSk7CisgICAgZWxzZSB7CisgICAgICAgIGlmIChtX3N0YXRlLmNv
bnRlbnRzT3BhcXVlCisgICAgICAgICAgICB8fCAobV9jdXJyZW50Q29udGVudC5jb250ZW50VHlw
ZSA9PSBDb2xvckNvbnRlbnRUeXBlICYmIG1fY3VycmVudENvbnRlbnQuY29udGVudHNCYWNrZ3Jv
dW5kQ29sb3IuYWxwaGEoKSA9PSAweGZmKQorICAgICAgICAgICAgfHwgKG1fY3VycmVudENvbnRl
bnQuY29udGVudFR5cGUgPT0gUGl4bWFwQ29udGVudFR5cGUgJiYgIW1fY3VycmVudENvbnRlbnQu
cGl4bWFwLmhhc0FscGhhKCkpKSB7CisKKyAgICAgICAgICAgIHBhaW50ZXJQYXRoLmFkZFJlY3Qo
bV9zdGF0ZS5jb250ZW50c1JlY3QpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBwYWlu
dGVyUGF0aDsKK30KKworUVJlY3RGIEdyYXBoaWNzTGF5ZXJRdEltcGw6OmJvdW5kaW5nUmVjdCgp
IGNvbnN0Cit7CisgICAgcmV0dXJuIFFSZWN0RihRUG9pbnRGKDAsIDApLCBRU2l6ZUYobV9zaXpl
KSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllclF0SW1wbDo6cGFpbnQoUVBhaW50ZXIqIHBhaW50
ZXIsIGNvbnN0IFFTdHlsZU9wdGlvbkdyYXBoaWNzSXRlbSogb3B0aW9uLCBRV2lkZ2V0KiB3aWRn
ZXQpCit7CisgICAgaWYgKG1fc3RhdGUubWFza0xheWVyICYmIG1fc3RhdGUubWFza0xheWVyLT5w
bGF0Zm9ybUxheWVyKCkpIHsKKyAgICAgICAgLy8gRklYTUU6IHNlZSBpZiB0aGlzIGlzIGJldHRl
ciBkb25lIHNvbWV3aGVyZSBlbHNlCisgICAgICAgIEdyYXBoaWNzTGF5ZXJRdEltcGwqIG90aGVy
TWFzayA9IHN0YXRpY19jYXN0PEdyYXBoaWNzTGF5ZXJRdEltcGwqPihtX3N0YXRlLm1hc2tMYXll
ci0+cGxhdGZvcm1MYXllcigpKTsKKyAgICAgICAgb3RoZXJNYXNrLT5mbHVzaENoYW5nZXModHJ1
ZSk7CisgICAgICAgIAorICAgICAgICAvLyBDU1MzIG1hc2sgYW5kIFFHcmFwaGljc09wYWNpdHlF
ZmZlY3QgYXJlIHRoZSBzYW1lIHRoaW5nISB3ZSBqdXN0IG5lZWQgdG8gY29udmVydC4uLgorICAg
ICAgICAvLyBUaGUgY29udmVyc2lvbiBpcyBhcyBmYXN0IGFzIHdlIGNhbiBtYWtlIGl0IC0gd2Ug
cmVuZGVyIHRoZSBsYXllciBvbmNlIGFuZCBzZW5kIGl0IHRvIHRoZSBRR3JhcGhpY3NPcGFjaXR5
RWZmZWN0CisgICAgICAgIGlmICghZ3JhcGhpY3NFZmZlY3QoKSkgeworICAgICAgICAgICAgUVBp
eG1hcCBtYXNrKFFTaXplKG1fc3RhdGUubWFza0xheWVyLT5zaXplKCkud2lkdGgoKSwgbV9zdGF0
ZS5tYXNrTGF5ZXItPnNpemUoKS5oZWlnaHQoKSkpOworICAgICAgICAgICAgbWFzay5maWxsKFF0
Ojp0cmFuc3BhcmVudCk7CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUVBhaW50ZXIg
cCgmbWFzayk7CisgICAgICAgICAgICAgICAgcC5zZXRSZW5kZXJIaW50cyhwYWludGVyLT5yZW5k
ZXJIaW50cygpLCB0cnVlKTsKKyAgICAgICAgICAgICAgICBwLnNldENvbXBvc2l0aW9uTW9kZShR
UGFpbnRlcjo6Q29tcG9zaXRpb25Nb2RlX1NvdXJjZSk7CisgICAgICAgICAgICAgICAgc3RhdGlj
X2Nhc3Q8R3JhcGhpY3NMYXllclF0SW1wbCo+KG1fc3RhdGUubWFza0xheWVyLT5wbGF0Zm9ybUxh
eWVyKCkpLT5kcmF3Q29udGVudHMoJnAsIG9wdGlvbi0+ZXhwb3NlZFJlY3QsIHRydWUpOworICAg
ICAgICAgICAgfQorICAgICAgICAgICAgUUdyYXBoaWNzT3BhY2l0eUVmZmVjdCogb3BhY2l0eUVm
ZmVjdCA9IG5ldyBRR3JhcGhpY3NPcGFjaXR5RWZmZWN0KHRoaXMpOworICAgICAgICAgICAgb3Bh
Y2l0eUVmZmVjdC0+c2V0T3BhY2l0eSgxKTsKKyAgICAgICAgICAgIG9wYWNpdHlFZmZlY3QtPnNl
dE9wYWNpdHlNYXNrKFFCcnVzaChtYXNrKSk7CisgICAgICAgICAgICBzZXRHcmFwaGljc0VmZmVj
dChvcGFjaXR5RWZmZWN0KTsKKyAgICAgICAgfQorICAgIH0KKyAgICBkcmF3Q29udGVudHMocGFp
bnRlciwgb3B0aW9uLT5leHBvc2VkUmVjdCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllclF0SW1w
bDo6ZHJhd0NvbnRlbnRzKFFQYWludGVyKiBwYWludGVyLCBjb25zdCBRUmVjdEYmIHIsIGJvb2wg
bWFzaykKK3sKKyAgICBRUmVjdCByZWN0ID0gci50b0FsaWduZWRSZWN0KCk7CisgICAgCisgICAg
aWYgKG1fY3VycmVudENvbnRlbnQuY29udGVudFR5cGUgIT0gSFRNTENvbnRlbnRUeXBlICYmICFt
X3N0YXRlLmNvbnRlbnRzUmVjdC5pc0VtcHR5KCkpCisgICAgICAgIHJlY3QgPSByZWN0LmludGVy
c2VjdGVkKG1fc3RhdGUuY29udGVudHNSZWN0KTsKKworICAgIGlmIChtX2N1cnJlbnRDb250ZW50
LmJhY2tncm91bmRDb2xvci5pc1ZhbGlkKCkpCisgICAgICAgIHBhaW50ZXItPmZpbGxSZWN0KHIs
IFFDb2xvcihtX2N1cnJlbnRDb250ZW50LmJhY2tncm91bmRDb2xvcikpOworCisgICAgaWYgKCFy
ZWN0LmlzRW1wdHkoKSkgeworICAgICAgICBzd2l0Y2ggKG1fY3VycmVudENvbnRlbnQuY29udGVu
dFR5cGUpIHsKKyAgICAgICAgY2FzZSBQaXhtYXBDb250ZW50VHlwZToKKyAgICAgICAgICAgIC8v
IHdlIGhhdmUgdG8gc2NhbGUgdGhlIGltYWdlIHRvIHRoZSBjb250ZW50c1JlY3QKKyAgICAgICAg
ICAgIC8vIEZJWE1FOiBhIGJldHRlciB3YXkgd291bGQgcHJvYmFibHkgYmUgZHJhd1BpeG1hcCB3
aXRoIGEgc3JjL3RhcmdldCByZWN0CisgICAgICAgICAgICBwYWludGVyLT5kcmF3UGl4bWFwKHJl
Y3QudG9wTGVmdCgpLCBtX2N1cnJlbnRDb250ZW50LnBpeG1hcC5zY2FsZWQobV9zdGF0ZS5jb250
ZW50c1JlY3Quc2l6ZSgpKSwgcik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBD
b2xvckNvbnRlbnRUeXBlOgorICAgICAgICAgICAgcGFpbnRlci0+ZmlsbFJlY3QocmVjdCwgbV9j
dXJyZW50Q29udGVudC5jb250ZW50c0JhY2tncm91bmRDb2xvcik7CisgICAgICAgICAgICBicmVh
azsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGlmIChtX3N0YXRlLmRyYXdzQ29udGVu
dCkgeworICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgdGhlICJleHBlbnNpdmUiIGJpdC4gd2Ug
dHJ5IHRvIG1pbmltaXplIGNhbGxzIHRvIHRoaXMKKyAgICAgICAgICAgICAgICAvLyBuZWNrIG9m
IHRoZSB3b29kcyBieSBwcm9wZXIgY2FjaGluZworICAgICAgICAgICAgICAgIEdyYXBoaWNzQ29u
dGV4dCBnYyhwYWludGVyKTsKKyAgICAgICAgICAgICAgICBtX2xheWVyLT5wYWludEdyYXBoaWNz
TGF5ZXJDb250ZW50cyhnYywgcmVjdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVh
azsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBHcmFwaGljc0xheWVyUXRJbXBsOjpub3Rp
ZnlDaGFuZ2UoQ2hhbmdlTWFzayBjaGFuZ2VNYXNrKQoreworICAgIGlmICghdGhpcykKKyAgICAg
ICAgcmV0dXJuOworCisgICAgbV9jaGFuZ2VNYXNrID0gc3RhdGljX2Nhc3Q8Q2hhbmdlTWFzaz4o
c3RhdGljX2Nhc3Q8aW50PihtX2NoYW5nZU1hc2spIHwgc3RhdGljX2Nhc3Q8aW50PihjaGFuZ2VN
YXNrKSk7CisKKyAgICBpZiAobV9sYXllci0+Y2xpZW50KCkpCisgICAgICAgIG1fbGF5ZXItPmNs
aWVudCgpLT5ub3RpZnlTeW5jUmVxdWlyZWQobV9sYXllcik7Cit9CisKK3ZvaWQgR3JhcGhpY3NM
YXllclF0SW1wbDo6Zmx1c2hDaGFuZ2VzKGJvb2wgcmVjdXJzaXZlKQoreworICAgIC8vIHRoaXMg
aXMgdGhlIGJ1bGsgb2YgdGhlIHdvcmsuIHVuZGVyc3RhbmRpbmcgd2hhdCB0aGUgY29tcG9zaXRv
ciBpcyB0cnlpbmcgdG8gYWNoaWV2ZSwKKyAgICAvLyB3aGF0IGdyYXBoaWNzLXZpZXcgY2FuIGRv
LCBhbmQgdHJ5aW5nIHRvIGZpbmQgYSBzYW5lIGNvbW1vbi1ncm91bmRzCisgICAgaWYgKCFtX2xh
eWVyIHx8IG1fY2hhbmdlTWFzayA9PSBOb0NoYW5nZXMpCisgICAgICAgIGdvdG8gYWZ0ZXJMYXll
ckNoYW5nZXM7CisKKyAgICBpZiAobV9jdXJyZW50Q29udGVudC5jb250ZW50VHlwZSA9PSBIVE1M
Q29udGVudFR5cGUgJiYgKG1fY2hhbmdlTWFzayAmIFBhcmVudENoYW5nZSkpIHsKKyAgICAgICAg
Ly8gdGhlIFdlYkNvcmUgY29tcG9zaXRvciBtYW5hZ2VzIGl0ZW0gb3duZXJzaGlwLiBXZSBoYXZl
IHRvIG1ha2Ugc3VyZQorICAgICAgICAvLyBncmFwaGljcy12aWV3IGRvZXNuJ3QgdHJ5IHRvIHNu
YXRjaCB0aGF0IG93bmVyc2hpcC4uLgorICAgICAgICBpZiAoIW1fbGF5ZXItPnBhcmVudCgpICYm
ICFwYXJlbnRJdGVtKCkpCisgICAgICAgICAgICBzZXRQYXJlbnRJdGVtKDApOworICAgICAgICBl
bHNlIGlmIChtX2xheWVyICYmIG1fbGF5ZXItPnBhcmVudCgpICYmIG1fbGF5ZXItPnBhcmVudCgp
LT5uYXRpdmVMYXllcigpICE9IHBhcmVudEl0ZW0oKSkKKyAgICAgICAgICAgIHNldFBhcmVudEl0
ZW0obV9sYXllci0+cGFyZW50KCktPm5hdGl2ZUxheWVyKCkpOworICAgIH0KKworICAgIGlmICht
X2NoYW5nZU1hc2sgJiBDaGlsZHJlbkNoYW5nZSkgeworICAgICAgICAvLyB3ZSBiYXNpY2FsbHkg
ZG8gYW4gWE9SIG9wZXJhdGlvbiBvbiB0aGUgbGlzdCBvZiBjdXJyZW50IGNoaWxkcmVuCisgICAg
ICAgIC8vIGFuZCB0aGUgbGlzdCBvZiB3YW50ZWQgY2hpbGRyZW4sIGFuZCByZW1vdmUvYWRkCisg
ICAgICAgIFFTZXQ8UUdyYXBoaWNzSXRlbSo+IG5ld0NoaWxkcmVuOworICAgICAgICBjb25zdCBW
ZWN0b3I8R3JhcGhpY3NMYXllcio+IG5ld0NoaWxkcmVuVmVjdG9yID0gKG1fbGF5ZXItPmNoaWxk
cmVuKCkpOworICAgICAgICBuZXdDaGlsZHJlbi5yZXNlcnZlKG5ld0NoaWxkcmVuVmVjdG9yLnNp
emUoKSk7CisKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuZXdDaGlsZHJlblZlY3Rv
ci5zaXplKCk7ICsraSkKKyAgICAgICAgICAgIG5ld0NoaWxkcmVuLmluc2VydChuZXdDaGlsZHJl
blZlY3RvcltpXS0+cGxhdGZvcm1MYXllcigpKTsKKworICAgICAgICBjb25zdCBRU2V0PFFHcmFw
aGljc0l0ZW0qPiBjdXJyZW50Q2hpbGRyZW4gPSBjaGlsZEl0ZW1zKCkudG9TZXQoKTsKKyAgICAg
ICAgY29uc3QgUVNldDxRR3JhcGhpY3NJdGVtKj4gY2hpbGRyZW5Ub0FkZCA9IG5ld0NoaWxkcmVu
IC0gY3VycmVudENoaWxkcmVuOworICAgICAgICBjb25zdCBRU2V0PFFHcmFwaGljc0l0ZW0qPiBj
aGlsZHJlblRvUmVtb3ZlID0gY3VycmVudENoaWxkcmVuIC0gbmV3Q2hpbGRyZW47CisgICAgICAg
IGZvciAoUVNldDxRR3JhcGhpY3NJdGVtKj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gY2hpbGRyZW5U
b0FkZC5iZWdpbigpOyBpdCAhPSBjaGlsZHJlblRvQWRkLmVuZCgpOyArK2l0KSB7CisgICAgICAg
ICAgICAgaWYgKFFHcmFwaGljc0l0ZW0qIHcgPSAqaXQpCisgICAgICAgICAgICAgICAgdy0+c2V0
UGFyZW50SXRlbSh0aGlzKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKFFTZXQ8UUdyYXBoaWNz
SXRlbSo+Ojpjb25zdF9pdGVyYXRvciBpdCA9IGNoaWxkcmVuVG9SZW1vdmUuYmVnaW4oKTsgaXQg
IT0gY2hpbGRyZW5Ub1JlbW92ZS5lbmQoKTsgKytpdCkgeworICAgICAgICAgICAgIGlmIChRR3Jh
cGhpY3NJdGVtKiB3ID0gKml0KQorICAgICAgICAgICAgICAgIHctPnNldFBhcmVudEl0ZW0oMCk7
CisgICAgICAgIH0KKworICAgICAgICAvLyBjaGlsZHJlbiBhcmUgb3JkZXJlZCBieSB6LXZhbHVl
LCBsZXQgZ3JhcGhpY3MtdmlldyBrbm93LgorICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8
IG5ld0NoaWxkcmVuVmVjdG9yLnNpemUoKTsgKytpKQorICAgICAgICAgICAgaWYgKG5ld0NoaWxk
cmVuVmVjdG9yW2ldLT5wbGF0Zm9ybUxheWVyKCkpCisgICAgICAgICAgICAgICAgbmV3Q2hpbGRy
ZW5WZWN0b3JbaV0tPnBsYXRmb3JtTGF5ZXIoKS0+c2V0WlZhbHVlKGkpOworICAgIH0KKworICAg
IGlmIChtX2NoYW5nZU1hc2sgJiBNYXNrTGF5ZXJDaGFuZ2UpIHsKKyAgICAgICAgLy8gd2UgY2Fu
J3QgcGFpbnQgaGVyZSwgYmVjYXVzZSB3ZSBkb24ndCBrbm93IGlmIHRoZSBtYXNrIGxheWVyCisg
ICAgICAgIC8vIGl0c2VsZiBpcyByZWFkeS4uLiB3ZSdsbCBoYXZlIHRvIHdhaXQgdGlsbCB0aGlz
IGxheWVyIHRyaWVzIHRvIHBhaW50CisgICAgICAgIHNldEdyYXBoaWNzRWZmZWN0KDApOworICAg
ICAgICBpZiAobV9sYXllci0+bWFza0xheWVyKCkpCisgICAgICAgICAgICBzZXRGbGFnKEl0ZW1D
bGlwc0NoaWxkcmVuVG9TaGFwZSwgdHJ1ZSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHNl
dEZsYWcoSXRlbUNsaXBzQ2hpbGRyZW5Ub1NoYXBlLCBtX2xheWVyLT5tYXNrc1RvQm91bmRzKCkp
OworICAgICAgICB1cGRhdGUoKTsKKyAgICB9CisKKyAgICBpZiAoKG1fY2hhbmdlTWFzayAmIFBv
c2l0aW9uQ2hhbmdlKSAmJiAobV9sYXllci0+cG9zaXRpb24oKSAhPSBtX3N0YXRlLnBvcykpCisg
ICAgICAgIHNldFBvcyhtX2xheWVyLT5wb3NpdGlvbigpLngoKSwgbV9sYXllci0+cG9zaXRpb24o
KS55KCkpOworCisgICAgaWYgKG1fY2hhbmdlTWFzayAmIFNpemVDaGFuZ2UpIHsKKyAgICAgICAg
aWYgKG1fbGF5ZXItPnNpemUoKSAhPSBtX3N0YXRlLnNpemUpIHsKKyAgICAgICAgICAgIHByZXBh
cmVHZW9tZXRyeUNoYW5nZSgpOworICAgICAgICAgICAgbV9zaXplID0gUVNpemVGKG1fbGF5ZXIt
PnNpemUoKS53aWR0aCgpLCBtX2xheWVyLT5zaXplKCkuaGVpZ2h0KCkpOworICAgICAgICB9Cisg
ICAgfQorCisgICAgaWYgKG1fY2hhbmdlTWFzayAmIChUcmFuc2Zvcm1DaGFuZ2UgfCBBbmNob3JQ
b2ludENoYW5nZSB8IFNpemVDaGFuZ2UpKSB7CisgICAgICAgIC8vIHNpbmNlIHdlIGNvbnZlcnQg
YSBwZXJjZW50YWdlLWJhc2VkIG9yaWdpbi1wb2ludCB0byBhIHBpeGVsLWJhc2VkIG9uZSwKKyAg
ICAgICAgLy8gdGhlIGFuY2hvci1wb2ludCwgdHJhbnNmb3JtIGFuZCBzaXplIGZyb20gV2ViQ29y
ZSBhbGwgYWZmZWN0IHRoZSBvbmUKKyAgICAgICAgLy8gdGhhdCB3ZSBnaXZlIFF0CisgICAgICAg
IGlmIChtX3N0YXRlLnRyYW5zZm9ybSAhPSBtX2xheWVyLT50cmFuc2Zvcm0oKSB8fCBtX3N0YXRl
LmFuY2hvclBvaW50ICE9IG1fbGF5ZXItPmFuY2hvclBvaW50KCkgfHwgbV9zdGF0ZS5zaXplICE9
IG1fbGF5ZXItPnNpemUoKSkKKyAgICAgICAgICAgIHNldEJhc2VUcmFuc2Zvcm0oUVRyYW5zZm9y
bShtX2xheWVyLT50cmFuc2Zvcm0oKSkpOworICAgIH0KKworICAgIGlmIChtX2NoYW5nZU1hc2sg
JiAoQ29udGVudENoYW5nZSB8IERyYXdzQ29udGVudENoYW5nZSkpIHsKKyAgICAgICAgc3dpdGNo
IChtX3BlbmRpbmdDb250ZW50LmNvbnRlbnRUeXBlKSB7CisgICAgICAgIGNhc2UgUGl4bWFwQ29u
dGVudFR5cGU6CisgICAgICAgICAgICAvLyB3ZSBuZWVkIGNhY2hlIGV2ZW4gZm9yIGltYWdlcywg
YmVjYXVzZSB0aGV5IG5lZWQgdG8gYmUgcmVzaXplZAorICAgICAgICAgICAgLy8gdG8gdGhlIGNv
bnRlbnRzIHJlY3QuIG1heWJlIHRoaXMgY2FuIGJlIG9wdGltaXplZCB0aG91Z2gKKyAgICAgICAg
ICAgIHNldENhY2hlTW9kZShtX3RyYW5zZm9ybUFuaW1hdGlvblJ1bm5pbmcgPyBJdGVtQ29vcmRp
bmF0ZUNhY2hlIDogRGV2aWNlQ29vcmRpbmF0ZUNhY2hlKTsKKyAgICAgICAgICAgIHVwZGF0ZSgp
OworICAgICAgICAgICAgc2V0RmxhZyhJdGVtSGFzTm9Db250ZW50cywgZmFsc2UpOworICAgICAg
ICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBDb2xvckNvbnRlbnRUeXBlOgorICAgICAgICAg
ICAgLy8gbm8gcG9pbnQgaW4gY2FjaGluZyBhIHNvbGlkLWNvbG9yIHJlY3RhbmdsZQorICAgICAg
ICAgICAgc2V0Q2FjaGVNb2RlKFFHcmFwaGljc0l0ZW06Ok5vQ2FjaGUpOworICAgICAgICAgICAg
aWYgKG1fcGVuZGluZ0NvbnRlbnQuY29udGVudFR5cGUgIT0gbV9jdXJyZW50Q29udGVudC5jb250
ZW50VHlwZSB8fCBtX3BlbmRpbmdDb250ZW50LmNvbnRlbnRzQmFja2dyb3VuZENvbG9yICE9IG1f
Y3VycmVudENvbnRlbnQuY29udGVudHNCYWNrZ3JvdW5kQ29sb3IpCisgICAgICAgICAgICAgICAg
dXBkYXRlKCk7CisgICAgICAgICAgICBtX3N0YXRlLmRyYXdzQ29udGVudCA9IGZhbHNlOworICAg
ICAgICAgICAgc2V0RmxhZyhJdGVtSGFzTm9Db250ZW50cywgZmFsc2UpOworICAgICAgICAgICAg
YnJlYWs7CisKKyAgICAgICAgY2FzZSBIVE1MQ29udGVudFR5cGU6CisgICAgICAgICAgICBpZiAo
bV9wZW5kaW5nQ29udGVudC5jb250ZW50VHlwZSAhPSBtX2N1cnJlbnRDb250ZW50LmNvbnRlbnRU
eXBlKQorICAgICAgICAgICAgICAgIHVwZGF0ZSgpOworICAgICAgICAgICAgaWYgKCFtX3N0YXRl
LmRyYXdzQ29udGVudCAmJiBtX2xheWVyLT5kcmF3c0NvbnRlbnQoKSkKKyAgICAgICAgICAgICAg
ICB1cGRhdGUoKTsKKyAgICAgICAgICAgIGlmIChtX2xheWVyLT5kcmF3c0NvbnRlbnQoKSkKKyAg
ICAgICAgICAgICAgICBzZXRDYWNoZU1vZGUobV90cmFuc2Zvcm1BbmltYXRpb25SdW5uaW5nID8g
SXRlbUNvb3JkaW5hdGVDYWNoZSA6IERldmljZUNvb3JkaW5hdGVDYWNoZSk7CisgICAgICAgICAg
ICBlbHNlCisgICAgICAgICAgICAgICAgc2V0Q2FjaGVNb2RlKE5vQ2FjaGUpOworCisgICAgICAg
ICAgICBzZXRGbGFnKEl0ZW1IYXNOb0NvbnRlbnRzLCAhbV9sYXllci0+ZHJhd3NDb250ZW50KCkp
OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKG1fY2hh
bmdlTWFzayAmIE9wYWNpdHlDaGFuZ2UpICYmIG1fc3RhdGUub3BhY2l0eSAhPSBtX2xheWVyLT5v
cGFjaXR5KCkpCisgICAgICAgIHNldE9wYWNpdHkobV9sYXllci0+b3BhY2l0eSgpKTsKKworICAg
IGlmIChtX2NoYW5nZU1hc2sgJiBDb250ZW50c1JlY3RDaGFuZ2UpIHsKKyAgICAgICAgY29uc3Qg
UVJlY3QgcmVjdChtX2xheWVyLT5jb250ZW50c1JlY3QoKSk7CisgICAgICAgIGlmIChtX3N0YXRl
LmNvbnRlbnRzUmVjdCAhPSByZWN0KSB7CisgICAgICAgICAgICBtX3N0YXRlLmNvbnRlbnRzUmVj
dCA9IHJlY3Q7CisgICAgICAgICAgICB1cGRhdGUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAg
IGlmICgobV9jaGFuZ2VNYXNrICYgTWFza3NUb0JvdW5kc0NoYW5nZSkKKyAgICAgICAgJiYgbV9z
dGF0ZS5tYXNrc1RvQm91bmRzICE9IG1fbGF5ZXItPm1hc2tzVG9Cb3VuZHMoKSkgeworCisgICAg
ICAgIHNldEZsYWcoUUdyYXBoaWNzSXRlbTo6SXRlbUNsaXBzVG9TaGFwZSwgbV9sYXllci0+bWFz
a3NUb0JvdW5kcygpKTsKKyAgICAgICAgc2V0RmxhZyhRR3JhcGhpY3NJdGVtOjpJdGVtQ2xpcHND
aGlsZHJlblRvU2hhcGUsIG1fbGF5ZXItPm1hc2tzVG9Cb3VuZHMoKSk7CisgICAgfQorCisgICAg
aWYgKChtX2NoYW5nZU1hc2sgJiBDb250ZW50c09wYXF1ZUNoYW5nZSkgJiYgbV9zdGF0ZS5jb250
ZW50c09wYXF1ZSAhPSBtX2xheWVyLT5jb250ZW50c09wYXF1ZSgpKQorICAgICAgICBwcmVwYXJl
R2VvbWV0cnlDaGFuZ2UoKTsKKworICAgIGlmIChtX2NoYW5nZU1hc2sgJiBEaXNwbGF5Q2hhbmdl
KQorICAgICAgICB1cGRhdGUobV9wZW5kaW5nQ29udGVudC5yZWdpb25Ub1VwZGF0ZS5ib3VuZGlu
Z1JlY3QoKSk7CisKKyAgICBpZiAoKG1fY2hhbmdlTWFzayAmIEJhY2tncm91bmRDb2xvckNoYW5n
ZSkgJiYgKG1fcGVuZGluZ0NvbnRlbnQuYmFja2dyb3VuZENvbG9yICE9IG1fY3VycmVudENvbnRl
bnQuYmFja2dyb3VuZENvbG9yKSkKKyAgICAgICAgdXBkYXRlKCk7CisKKyAgICAvLyBGSVhNRTog
dGhlIGZvbGxvd2luZyBmbGFncyBhcmUgY3VycmVudGx5IG5vdCBoYW5kbGVkLCBhcyB0aGV5IGRv
bid0IGhhdmUgYSBjbGVhciB0ZXN0IG9yIGFyZSBpbiBsb3cgcHJpb3JpdHkKKyAgICAvLyBHZW9t
ZXRyeU9yaWVudGF0aW9uQ2hhbmdlLCBDb250ZW50c09yaWVudGF0aW9uQ2hhbmdlLCBCYWNrZmFj
ZVZpc2liaWxpdHlDaGFuZ2UsIENoaWxkcmVuVHJhbnNmb3JtQ2hhbmdlCisKKyAgICBtX3N0YXRl
Lm1hc2tMYXllciA9IG1fbGF5ZXItPm1hc2tMYXllcigpOworICAgIG1fc3RhdGUucG9zID0gbV9s
YXllci0+cG9zaXRpb24oKTsKKyAgICBtX3N0YXRlLmFuY2hvclBvaW50ID0gbV9sYXllci0+YW5j
aG9yUG9pbnQoKTsKKyAgICBtX3N0YXRlLnNpemUgPSBtX2xheWVyLT5zaXplKCk7CisgICAgbV9z
dGF0ZS50cmFuc2Zvcm0gPSBtX2xheWVyLT50cmFuc2Zvcm0oKTsKKyAgICBtX3N0YXRlLmdlb09y
aWVudGF0aW9uID0gbV9sYXllci0+Z2VvbWV0cnlPcmllbnRhdGlvbigpOworICAgIG1fc3RhdGUu
Y29udGVudHNPcmllbnRhdGlvbiA9bV9sYXllci0+Y29udGVudHNPcmllbnRhdGlvbigpOworICAg
IG1fc3RhdGUub3BhY2l0eSA9IG1fbGF5ZXItPm9wYWNpdHkoKTsKKyAgICBtX3N0YXRlLmNvbnRl
bnRzUmVjdCA9IG1fbGF5ZXItPmNvbnRlbnRzUmVjdCgpOworICAgIG1fc3RhdGUucHJlc2VydmVz
M0QgPSBtX2xheWVyLT5wcmVzZXJ2ZXMzRCgpOworICAgIG1fc3RhdGUubWFza3NUb0JvdW5kcyA9
IG1fbGF5ZXItPm1hc2tzVG9Cb3VuZHMoKTsKKyAgICBtX3N0YXRlLmRyYXdzQ29udGVudCA9IG1f
bGF5ZXItPmRyYXdzQ29udGVudCgpOworICAgIG1fc3RhdGUuY29udGVudHNPcGFxdWUgPSBtX2xh
eWVyLT5jb250ZW50c09wYXF1ZSgpOworICAgIG1fc3RhdGUuYmFja2ZhY2VWaXNpYmlsaXR5ID0g
bV9sYXllci0+YmFja2ZhY2VWaXNpYmlsaXR5KCk7CisgICAgbV9jdXJyZW50Q29udGVudC5waXht
YXAgPSBtX3BlbmRpbmdDb250ZW50LnBpeG1hcDsKKyAgICBtX2N1cnJlbnRDb250ZW50LmNvbnRl
bnRUeXBlID0gbV9wZW5kaW5nQ29udGVudC5jb250ZW50VHlwZTsKKyAgICBtX2N1cnJlbnRDb250
ZW50LmJhY2tncm91bmRDb2xvciA9IG1fcGVuZGluZ0NvbnRlbnQuYmFja2dyb3VuZENvbG9yOwor
ICAgIG1fY3VycmVudENvbnRlbnQucmVnaW9uVG9VcGRhdGUgfD0gbV9wZW5kaW5nQ29udGVudC5y
ZWdpb25Ub1VwZGF0ZTsKKyAgICBtX2N1cnJlbnRDb250ZW50LmNvbnRlbnRzQmFja2dyb3VuZENv
bG9yID0gbV9wZW5kaW5nQ29udGVudC5jb250ZW50c0JhY2tncm91bmRDb2xvcjsKKyAgICBtX3Bl
bmRpbmdDb250ZW50LnJlZ2lvblRvVXBkYXRlID0gUVJlZ2lvbigpOworICAgIG1fY2hhbmdlTWFz
ayA9IE5vQ2hhbmdlczsKKworCithZnRlckxheWVyQ2hhbmdlczoKKyAgICBpZiAoIXJlY3Vyc2l2
ZSkKKyAgICAgICAgcmV0dXJuOyAgICAKKworICAgIGNvbnN0IFFMaXN0PFFHcmFwaGljc0l0ZW0q
PiBjaGlsZHJlbiA9IGNoaWxkSXRlbXMoKTsKKworICAgIGZvciAoUUxpc3Q8UUdyYXBoaWNzSXRl
bSo+Ojpjb25zdF9pdGVyYXRvciBpdCA9IGNoaWxkcmVuLmJlZ2luKCk7IGl0ICE9IGNoaWxkcmVu
LmVuZCgpOyArK2l0KSB7CisgICAgICAgIGlmIChRR3JhcGhpY3NJdGVtKiBpdGVtID0gKml0KQor
ICAgICAgICAgICAgaWYgKEdyYXBoaWNzTGF5ZXJRdEltcGwqIGxheWVyID0gcW9iamVjdF9jYXN0
PEdyYXBoaWNzTGF5ZXJRdEltcGwqPihpdGVtLT50b0dyYXBoaWNzT2JqZWN0KCkpKQorICAgICAg
ICAgICAgICAgIGxheWVyLT5mbHVzaENoYW5nZXModHJ1ZSk7CisgICAgfQorfQorCit2b2lkIEdy
YXBoaWNzTGF5ZXJRdEltcGw6Om5vdGlmeUFuaW1hdGlvblN0YXJ0ZWQoKQoreworICAgIC8vIFdl
YkNvcmUgbm90aWZpZXMgamF2YXNjcmlwdCB3aGVuIHRoZSBhbmltYXRpb24gc3RhcnRzCisgICAg
Ly8gaGVyZSB3ZSdyZSBsZXR0aW5nIGl0IGtub3cKKyAgICBtX2xheWVyLT5jbGllbnQoKS0+bm90
aWZ5QW5pbWF0aW9uU3RhcnRlZChtX2xheWVyLCBXVEY6OmN1cnJlbnRUaW1lKCkpOworfQorCitH
cmFwaGljc0xheWVyUXQ6OkdyYXBoaWNzTGF5ZXJRdChHcmFwaGljc0xheWVyQ2xpZW50KiBjbGll
bnQpCisgICAgOiBHcmFwaGljc0xheWVyKGNsaWVudCkKKyAgICAsIG1faW1wbChQYXNzT3duUHRy
PEdyYXBoaWNzTGF5ZXJRdEltcGw+KG5ldyBHcmFwaGljc0xheWVyUXRJbXBsKHRoaXMpKSkKK3sK
K30KKworR3JhcGhpY3NMYXllclF0Ojp+R3JhcGhpY3NMYXllclF0KCkKK3sKK30KKworLy8gdGhp
cyBpcyB0aGUgaG9vayBmb3IgV2ViQ29yZSBjb21wb3NpdG9yIHRvIGtub3cgdGhhdCBRdCBpbXBs
ZW1lbnRzIGNvbXBvc2l0aW5nIHdpdGggR3JhcGhpY3NMYXllclF0CitQYXNzT3duUHRyPEdyYXBo
aWNzTGF5ZXI+IEdyYXBoaWNzTGF5ZXI6OmNyZWF0ZShHcmFwaGljc0xheWVyQ2xpZW50KiBjbGll
bnQpCit7CisgICAgcmV0dXJuIG5ldyBHcmFwaGljc0xheWVyUXQoY2xpZW50KTsKK30KKworLy8g
cmVpbXAgZnJvbSBHcmFwaGljc0xheWVyLmg6IFF0IGlzIHRvcC1kb3duCitHcmFwaGljc0xheWVy
OjpDb21wb3NpdGluZ0Nvb3JkaW5hdGVzT3JpZW50YXRpb24gR3JhcGhpY3NMYXllcjo6Y29tcG9z
aXRpbmdDb29yZGluYXRlc09yaWVudGF0aW9uKCkKK3sKKyAgICByZXR1cm4gQ29tcG9zaXRpbmdD
b29yZGluYXRlc1RvcERvd247Cit9CisKKy8vIHJlaW1wIGZyb20gR3JhcGhpY3NMYXllci5oOiB3
ZSdsbCBuZWVkIHRvIHVwZGF0ZSB0aGUgd2hvbGUgZGlzcGxheSwgYW5kIHdlIGNhbid0IGNvdW50
IG9uIHRoZSBjdXJyZW50IHNpemUgYmVjYXVzZSBpdCBtaWdodCBjaGFuZ2UKK3ZvaWQgR3JhcGhp
Y3NMYXllclF0OjpzZXROZWVkc0Rpc3BsYXkoKQoreworICAgIG1faW1wbC0+bV9wZW5kaW5nQ29u
dGVudC5yZWdpb25Ub1VwZGF0ZSA9IFFSZWdpb24oUVJlY3QoUVBvaW50KDAsIDApLCBRU2l6ZShz
aXplKCkud2lkdGgoKSwgc2l6ZSgpLmhlaWdodCgpKSkpOworICAgIG1faW1wbC0+bm90aWZ5Q2hh
bmdlKEdyYXBoaWNzTGF5ZXJRdEltcGw6OkRpc3BsYXlDaGFuZ2UpOworfQorCisvLyByZWltcCBm
cm9tIEdyYXBoaWNzTGF5ZXIuaAordm9pZCBHcmFwaGljc0xheWVyUXQ6OnNldE5lZWRzRGlzcGxh
eUluUmVjdChjb25zdCBGbG9hdFJlY3QmIHIpCit7CisgICAgbV9pbXBsLT5tX3BlbmRpbmdDb250
ZW50LnJlZ2lvblRvVXBkYXRlfD0gUVJlY3RGKHIpLnRvQWxpZ25lZFJlY3QoKTsKKyAgICBtX2lt
cGwtPm5vdGlmeUNoYW5nZShHcmFwaGljc0xheWVyUXRJbXBsOjpEaXNwbGF5Q2hhbmdlKTsKK30K
KworLy8gcmVpbXAgZnJvbSBHcmFwaGljc0xheWVyLmgKK3ZvaWQgR3JhcGhpY3NMYXllclF0Ojpz
ZXROYW1lKGNvbnN0IFN0cmluZyYgbmFtZSkKK3sKKyAgICBtX2ltcGwtPnNldE9iamVjdE5hbWUo
bmFtZSk7CisgICAgR3JhcGhpY3NMYXllcjo6c2V0TmFtZShuYW1lKTsKK30KKworLy8gcmVpbXAg
ZnJvbSBHcmFwaGljc0xheWVyLmgKK3ZvaWQgR3JhcGhpY3NMYXllclF0OjpzZXRQYXJlbnQoR3Jh
cGhpY3NMYXllciogbGF5ZXIpCit7CisgICAgbV9pbXBsLT5ub3RpZnlDaGFuZ2UoR3JhcGhpY3NM
YXllclF0SW1wbDo6UGFyZW50Q2hhbmdlKTsKKyAgICBHcmFwaGljc0xheWVyOjpzZXRQYXJlbnQo
bGF5ZXIpOworfQorCisvLyByZWltcCBmcm9tIEdyYXBoaWNzTGF5ZXIuaAorYm9vbCBHcmFwaGlj
c0xheWVyUXQ6OnNldENoaWxkcmVuKGNvbnN0IFZlY3RvcjxHcmFwaGljc0xheWVyKj4mIGNoaWxk
cmVuKQoreworICAgIG1faW1wbC0+bm90aWZ5Q2hhbmdlKEdyYXBoaWNzTGF5ZXJRdEltcGw6OkNo
aWxkcmVuQ2hhbmdlKTsKKyAgICByZXR1cm4gR3JhcGhpY3NMYXllcjo6c2V0Q2hpbGRyZW4oY2hp
bGRyZW4pOworfQorCisvLyByZWltcCBmcm9tIEdyYXBoaWNzTGF5ZXIuaAordm9pZCBHcmFwaGlj
c0xheWVyUXQ6OmFkZENoaWxkKEdyYXBoaWNzTGF5ZXIqIGxheWVyKQoreworICAgIG1faW1wbC0+
bm90aWZ5Q2hhbmdlKEdyYXBoaWNzTGF5ZXJRdEltcGw6OkNoaWxkcmVuQ2hhbmdlKTsKKyAgICBH
cmFwaGljc0xheWVyOjphZGRDaGlsZChsYXllcik7Cit9CisKKy8vIHJlaW1wIGZyb20gR3JhcGhp
Y3NMYXllci5oCit2b2lkIEdyYXBoaWNzTGF5ZXJRdDo6YWRkQ2hpbGRBdEluZGV4KEdyYXBoaWNz
TGF5ZXIqIGxheWVyLCBpbnQgaW5kZXgpCit7CisgICAgR3JhcGhpY3NMYXllcjo6YWRkQ2hpbGRB
dEluZGV4KGxheWVyLCBpbmRleCk7CisgICAgbV9pbXBsLT5ub3RpZnlDaGFuZ2UoR3JhcGhpY3NM
YXllclF0SW1wbDo6Q2hpbGRyZW5DaGFuZ2UpOworfQorCisvLyByZWltcCBmcm9tIEdyYXBoaWNz
TGF5ZXIuaAordm9pZCBHcmFwaGljc0xheWVyUXQ6OmFkZENoaWxkQWJvdmUoR3JhcGhpY3NMYXll
ciogbGF5ZXIsIEdyYXBoaWNzTGF5ZXIqIHNpYmxpbmcpCit7CisgICAgIEdyYXBoaWNzTGF5ZXI6
OmFkZENoaWxkQWJvdmUobGF5ZXIsIHNpYmxpbmcpOworICAgICBtX2ltcGwtPm5vdGlmeUNoYW5n
ZShHcmFwaGljc0xheWVyUXRJbXBsOjpDaGlsZHJlbkNoYW5nZSk7Cit9CisKKy8vIHJlaW1wIGZy
b20gR3JhcGhpY3NMYXllci5oCit2b2lkIEdyYXBoaWNzTGF5ZXJRdDo6YWRkQ2hpbGRCZWxvdyhH
cmFwaGljc0xheWVyKiBsYXllciwgR3JhcGhpY3NMYXllciogc2libGluZykKK3sKKworICAgIEdy
YXBoaWNzTGF5ZXI6OmFkZENoaWxkQmVsb3cobGF5ZXIsIHNpYmxpbmcpOworICAgIG1faW1wbC0+
bm90aWZ5Q2hhbmdlKEdyYXBoaWNzTGF5ZXJRdEltcGw6OkNoaWxkcmVuQ2hhbmdlKTsKK30KKwor
Ly8gcmVpbXAgZnJvbSBHcmFwaGljc0xheWVyLmgKK2Jvb2wgR3JhcGhpY3NMYXllclF0OjpyZXBs
YWNlQ2hpbGQoR3JhcGhpY3NMYXllciogb2xkQ2hpbGQsIEdyYXBoaWNzTGF5ZXIqIG5ld0NoaWxk
KQoreworICAgIGlmIChHcmFwaGljc0xheWVyOjpyZXBsYWNlQ2hpbGQob2xkQ2hpbGQsIG5ld0No
aWxkKSkgeworICAgICAgICBtX2ltcGwtPm5vdGlmeUNoYW5nZShHcmFwaGljc0xheWVyUXRJbXBs
OjpDaGlsZHJlbkNoYW5nZSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHJl
dHVybiBmYWxzZTsKK30KKworLy8gcmVpbXAgZnJvbSBHcmFwaGljc0xheWVyLmgKK3ZvaWQgR3Jh
cGhpY3NMYXllclF0OjpyZW1vdmVGcm9tUGFyZW50KCkKK3sKKyAgICBpZiAocGFyZW50KCkpCisg
ICAgICAgIG1faW1wbC0+bm90aWZ5Q2hhbmdlKEdyYXBoaWNzTGF5ZXJRdEltcGw6OlBhcmVudENo
YW5nZSk7CisgICAgR3JhcGhpY3NMYXllcjo6cmVtb3ZlRnJvbVBhcmVudCgpOworfQorCisvLyBy
ZWltcCBmcm9tIEdyYXBoaWNzTGF5ZXIuaAordm9pZCBHcmFwaGljc0xheWVyUXQ6OnNldE1hc2tM
YXllcihHcmFwaGljc0xheWVyKiBsYXllcikKK3sKKyAgICBHcmFwaGljc0xheWVyOjpzZXRNYXNr
TGF5ZXIobGF5ZXIpOworICAgIG1faW1wbC0+bm90aWZ5Q2hhbmdlKEdyYXBoaWNzTGF5ZXJRdElt
cGw6Ok1hc2tMYXllckNoYW5nZSk7Cit9CisKKy8vIHJlaW1wIGZyb20gR3JhcGhpY3NMYXllci5o
Cit2b2lkIEdyYXBoaWNzTGF5ZXJRdDo6c2V0UG9zaXRpb24oY29uc3QgRmxvYXRQb2ludCYgcCkK
K3sKKyAgICBpZiAocG9zaXRpb24oKSAhPSBwKQorICAgICAgIG1faW1wbC0+bm90aWZ5Q2hhbmdl
KEdyYXBoaWNzTGF5ZXJRdEltcGw6OlBvc2l0aW9uQ2hhbmdlKTsKKyAgICBHcmFwaGljc0xheWVy
OjpzZXRQb3NpdGlvbihwKTsKK30KKworLy8gcmVpbXAgZnJvbSBHcmFwaGljc0xheWVyLmgKK3Zv
aWQgR3JhcGhpY3NMYXllclF0OjpzZXRBbmNob3JQb2ludChjb25zdCBGbG9hdFBvaW50M0QmIHAp
Cit7CisgICAgaWYgKGFuY2hvclBvaW50KCkgIT0gcCkKKyAgICAgICAgbV9pbXBsLT5ub3RpZnlD
aGFuZ2UoR3JhcGhpY3NMYXllclF0SW1wbDo6QW5jaG9yUG9pbnRDaGFuZ2UpOworICAgIEdyYXBo
aWNzTGF5ZXI6OnNldEFuY2hvclBvaW50KHApOworfQorCisvLyByZWltcCBmcm9tIEdyYXBoaWNz
TGF5ZXIuaAordm9pZCBHcmFwaGljc0xheWVyUXQ6OnNldFNpemUoY29uc3QgRmxvYXRTaXplJiBz
aXplKQoreworICAgIGlmICh0aGlzLT5zaXplKCkgIT0gc2l6ZSkKKyAgICAgICAgbV9pbXBsLT5u
b3RpZnlDaGFuZ2UoR3JhcGhpY3NMYXllclF0SW1wbDo6U2l6ZUNoYW5nZSk7CisgICAgR3JhcGhp
Y3NMYXllcjo6c2V0U2l6ZShzaXplKTsKK30KKworLy8gcmVpbXAgZnJvbSBHcmFwaGljc0xheWVy
LmgKK3ZvaWQgR3JhcGhpY3NMYXllclF0OjpzZXRUcmFuc2Zvcm0oY29uc3QgVHJhbnNmb3JtYXRp
b25NYXRyaXgmIHQpCit7CisgICAgaWYgKCFtX2ltcGwtPm1fdHJhbnNmb3JtQW5pbWF0aW9uUnVu
bmluZyAmJiB0cmFuc2Zvcm0oKSAhPSB0KQorICAgICAgIG1faW1wbC0+bm90aWZ5Q2hhbmdlKEdy
YXBoaWNzTGF5ZXJRdEltcGw6OlRyYW5zZm9ybUNoYW5nZSk7CisgICAgR3JhcGhpY3NMYXllcjo6
c2V0VHJhbnNmb3JtKHQpOworfQorCisvLyByZWltcCBmcm9tIEdyYXBoaWNzTGF5ZXIuaAordm9p
ZCBHcmFwaGljc0xheWVyUXQ6OnNldENoaWxkcmVuVHJhbnNmb3JtKGNvbnN0IFRyYW5zZm9ybWF0
aW9uTWF0cml4JiB0KQoreworICAgIEdyYXBoaWNzTGF5ZXI6OnNldENoaWxkcmVuVHJhbnNmb3Jt
KHQpOworICAgIG1faW1wbC0+bm90aWZ5Q2hhbmdlKEdyYXBoaWNzTGF5ZXJRdEltcGw6OkNoaWxk
cmVuVHJhbnNmb3JtQ2hhbmdlKTsKK30KKworLy8gcmVpbXAgZnJvbSBHcmFwaGljc0xheWVyLmgK
K3ZvaWQgR3JhcGhpY3NMYXllclF0OjpzZXRQcmVzZXJ2ZXMzRChib29sIGIpCit7CisgICAgaWYg
KGIgIT0gcHJlc2VydmVzM0QoKSk7CisgICAgICAgbV9pbXBsLT5ub3RpZnlDaGFuZ2UoR3JhcGhp
Y3NMYXllclF0SW1wbDo6UHJlc2VydmVzM0RDaGFuZ2UpOworICAgIEdyYXBoaWNzTGF5ZXI6OnNl
dFByZXNlcnZlczNEKGIpOworfQorCisvLyByZWltcCBmcm9tIEdyYXBoaWNzTGF5ZXIuaAordm9p
ZCBHcmFwaGljc0xheWVyUXQ6OnNldE1hc2tzVG9Cb3VuZHMoYm9vbCBiKQoreworICAgIEdyYXBo
aWNzTGF5ZXI6OnNldE1hc2tzVG9Cb3VuZHMoYik7CisgICAgbV9pbXBsLT5ub3RpZnlDaGFuZ2Uo
R3JhcGhpY3NMYXllclF0SW1wbDo6TWFza3NUb0JvdW5kc0NoYW5nZSk7Cit9CisKKy8vIHJlaW1w
IGZyb20gR3JhcGhpY3NMYXllci5oCit2b2lkIEdyYXBoaWNzTGF5ZXJRdDo6c2V0RHJhd3NDb250
ZW50KGJvb2wgYikKK3sKKyAgICBtX2ltcGwtPm5vdGlmeUNoYW5nZShHcmFwaGljc0xheWVyUXRJ
bXBsOjpEcmF3c0NvbnRlbnRDaGFuZ2UpOworICAgIEdyYXBoaWNzTGF5ZXI6OnNldERyYXdzQ29u
dGVudChiKTsKK30KKworLy8gcmVpbXAgZnJvbSBHcmFwaGljc0xheWVyLmgKK3ZvaWQgR3JhcGhp
Y3NMYXllclF0OjpzZXRCYWNrZ3JvdW5kQ29sb3IoY29uc3QgQ29sb3ImIGMpCit7CisgICAgbV9p
bXBsLT5ub3RpZnlDaGFuZ2UoR3JhcGhpY3NMYXllclF0SW1wbDo6QmFja2dyb3VuZENvbG9yQ2hh
bmdlKTsKKyAgICBtX2ltcGwtPm1fcGVuZGluZ0NvbnRlbnQuYmFja2dyb3VuZENvbG9yID0gYzsK
KyAgICBHcmFwaGljc0xheWVyOjpzZXRCYWNrZ3JvdW5kQ29sb3IoYyk7Cit9CisKKy8vIHJlaW1w
IGZyb20gR3JhcGhpY3NMYXllci5oCit2b2lkIEdyYXBoaWNzTGF5ZXJRdDo6Y2xlYXJCYWNrZ3Jv
dW5kQ29sb3IoKQoreworICAgIG1faW1wbC0+bV9wZW5kaW5nQ29udGVudC5iYWNrZ3JvdW5kQ29s
b3IgPSBRQ29sb3IoKTsKKyAgICBtX2ltcGwtPm5vdGlmeUNoYW5nZShHcmFwaGljc0xheWVyUXRJ
bXBsOjpCYWNrZ3JvdW5kQ29sb3JDaGFuZ2UpOworICAgIEdyYXBoaWNzTGF5ZXI6OmNsZWFyQmFj
a2dyb3VuZENvbG9yKCk7Cit9CisKKy8vIHJlaW1wIGZyb20gR3JhcGhpY3NMYXllci5oCit2b2lk
IEdyYXBoaWNzTGF5ZXJRdDo6c2V0Q29udGVudHNPcGFxdWUoYm9vbCBiKQoreworICAgIG1faW1w
bC0+bm90aWZ5Q2hhbmdlKEdyYXBoaWNzTGF5ZXJRdEltcGw6OkNvbnRlbnRzT3BhcXVlQ2hhbmdl
KTsKKyAgICBHcmFwaGljc0xheWVyOjpzZXRDb250ZW50c09wYXF1ZShiKTsKK30KKworLy8gcmVp
bXAgZnJvbSBHcmFwaGljc0xheWVyLmgKK3ZvaWQgR3JhcGhpY3NMYXllclF0OjpzZXRCYWNrZmFj
ZVZpc2liaWxpdHkoYm9vbCBiKQoreworICAgIG1faW1wbC0+bm90aWZ5Q2hhbmdlKEdyYXBoaWNz
TGF5ZXJRdEltcGw6OkJhY2tmYWNlVmlzaWJpbGl0eUNoYW5nZSk7CisgICAgR3JhcGhpY3NMYXll
cjo6c2V0QmFja2ZhY2VWaXNpYmlsaXR5KGIpOworfQorCisvLyByZWltcCBmcm9tIEdyYXBoaWNz
TGF5ZXIuaAordm9pZCBHcmFwaGljc0xheWVyUXQ6OnNldE9wYWNpdHkoZmxvYXQgbykKK3sKKyAg
ICBpZiAoIW1faW1wbC0+bV9vcGFjaXR5QW5pbWF0aW9uUnVubmluZyAmJiBvcGFjaXR5KCkgIT0g
bykKKyAgICAgICBtX2ltcGwtPm5vdGlmeUNoYW5nZShHcmFwaGljc0xheWVyUXRJbXBsOjpPcGFj
aXR5Q2hhbmdlKTsKKyAgICBHcmFwaGljc0xheWVyOjpzZXRPcGFjaXR5KG8pOworfQorCisvLyBy
ZWltcCBmcm9tIEdyYXBoaWNzTGF5ZXIuaAordm9pZCBHcmFwaGljc0xheWVyUXQ6OnNldENvbnRl
bnRzUmVjdChjb25zdCBJbnRSZWN0JiByKQoreworICAgIG1faW1wbC0+bm90aWZ5Q2hhbmdlKEdy
YXBoaWNzTGF5ZXJRdEltcGw6OkNvbnRlbnRzUmVjdENoYW5nZSk7CisgICAgR3JhcGhpY3NMYXll
cjo6c2V0Q29udGVudHNSZWN0KHIpOworfQorCisvLyByZWltcCBmcm9tIEdyYXBoaWNzTGF5ZXIu
aAordm9pZCBHcmFwaGljc0xheWVyUXQ6OnNldENvbnRlbnRzVG9JbWFnZShJbWFnZSogaW1hZ2Up
Cit7CisgICAgbV9pbXBsLT5ub3RpZnlDaGFuZ2UoR3JhcGhpY3NMYXllclF0SW1wbDo6Q29udGVu
dENoYW5nZSk7CisgICAgbV9pbXBsLT5tX3BlbmRpbmdDb250ZW50LmNvbnRlbnRUeXBlID0gR3Jh
cGhpY3NMYXllclF0SW1wbDo6SFRNTENvbnRlbnRUeXBlOworICAgIEdyYXBoaWNzTGF5ZXI6OnNl
dENvbnRlbnRzVG9JbWFnZShpbWFnZSk7CisgICAgaWYgKGltYWdlKSB7CisgICAgICAgIFFQaXht
YXAqIHB4bSA9IGltYWdlLT5uYXRpdmVJbWFnZUZvckN1cnJlbnRGcmFtZSgpOworICAgICAgICBp
ZiAocHhtKSB7CisgICAgICAgICAgICBtX2ltcGwtPm1fcGVuZGluZ0NvbnRlbnQucGl4bWFwID0g
KnB4bTsKKyAgICAgICAgICAgIG1faW1wbC0+bV9wZW5kaW5nQ29udGVudC5jb250ZW50VHlwZSA9
IEdyYXBoaWNzTGF5ZXJRdEltcGw6OlBpeG1hcENvbnRlbnRUeXBlOworICAgICAgICAgICAgcmV0
dXJuOworICAgICAgICB9ICAgICAgICAKKyAgICB9CisgICAgbV9pbXBsLT5tX3BlbmRpbmdDb250
ZW50LnBpeG1hcCA9IFFQaXhtYXAoKTsKK30KKworLy8gcmVpbXAgZnJvbSBHcmFwaGljc0xheWVy
LmgKK3ZvaWQgR3JhcGhpY3NMYXllclF0OjpzZXRDb250ZW50c0JhY2tncm91bmRDb2xvcihjb25z
dCBDb2xvciYgY29sb3IpCit7CisgICAgbV9pbXBsLT5ub3RpZnlDaGFuZ2UoR3JhcGhpY3NMYXll
clF0SW1wbDo6Q29udGVudENoYW5nZSk7CisgICAgbV9pbXBsLT5tX3BlbmRpbmdDb250ZW50LmNv
bnRlbnRUeXBlID0gR3JhcGhpY3NMYXllclF0SW1wbDo6Q29sb3JDb250ZW50VHlwZTsKKyAgICBt
X2ltcGwtPm1fcGVuZGluZ0NvbnRlbnQuY29udGVudHNCYWNrZ3JvdW5kQ29sb3IgPSBRQ29sb3Io
Y29sb3IpOworICAgIEdyYXBoaWNzTGF5ZXI6OnNldENvbnRlbnRzQmFja2dyb3VuZENvbG9yKGNv
bG9yKTsKK30KKworLy8gcmVpbXAgZnJvbSBHcmFwaGljc0xheWVyLmgKK3ZvaWQgR3JhcGhpY3NM
YXllclF0OjpzZXRHZW9tZXRyeU9yaWVudGF0aW9uKENvbXBvc2l0aW5nQ29vcmRpbmF0ZXNPcmll
bnRhdGlvbiBvcmllbnRhdGlvbikKK3sKKyAgICBtX2ltcGwtPm5vdGlmeUNoYW5nZShHcmFwaGlj
c0xheWVyUXRJbXBsOjpHZW9tZXRyeU9yaWVudGF0aW9uQ2hhbmdlKTsKKyAgICBHcmFwaGljc0xh
eWVyOjpzZXRHZW9tZXRyeU9yaWVudGF0aW9uKG9yaWVudGF0aW9uKTsKK30KKworLy8gcmVpbXAg
ZnJvbSBHcmFwaGljc0xheWVyLmgKK3ZvaWQgR3JhcGhpY3NMYXllclF0OjpzZXRDb250ZW50c09y
aWVudGF0aW9uKENvbXBvc2l0aW5nQ29vcmRpbmF0ZXNPcmllbnRhdGlvbiBvcmllbnRhdGlvbikK
K3sKKyAgICBtX2ltcGwtPm5vdGlmeUNoYW5nZShHcmFwaGljc0xheWVyUXRJbXBsOjpDb250ZW50
c09yaWVudGF0aW9uQ2hhbmdlKTsKKyAgICBHcmFwaGljc0xheWVyOjpzZXRDb250ZW50c09yaWVu
dGF0aW9uKG9yaWVudGF0aW9uKTsKK30KKworLy8gcmVpbXAgZnJvbSBHcmFwaGljc0xheWVyLmgK
K3ZvaWQgR3JhcGhpY3NMYXllclF0OjpkaXN0cmlidXRlT3BhY2l0eShmbG9hdCBvKQoreworICAg
IG1faW1wbC0+bm90aWZ5Q2hhbmdlKEdyYXBoaWNzTGF5ZXJRdEltcGw6Ok9wYWNpdHlDaGFuZ2Up
OworICAgIG1faW1wbC0+bV9zdGF0ZS5kaXN0cmlidXRlT3BhY2l0eSA9IHRydWU7Cit9CisKKy8v
IHJlaW1wIGZyb20gR3JhcGhpY3NMYXllci5oCitmbG9hdCBHcmFwaGljc0xheWVyUXQ6OmFjY3Vt
dWxhdGVkT3BhY2l0eSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1faW1wbC0+ZWZmZWN0aXZlT3Bh
Y2l0eSgpOworfQorCisvLyByZWltcCBmcm9tIEdyYXBoaWNzTGF5ZXIuaAordm9pZCBHcmFwaGlj
c0xheWVyUXQ6OnN5bmNDb21wb3NpdGluZ1N0YXRlKCkKK3sKKyAgICBtX2ltcGwtPmZsdXNoQ2hh
bmdlcygpOworICAgIEdyYXBoaWNzTGF5ZXI6OnN5bmNDb21wb3NpdGluZ1N0YXRlKCk7Cit9CisK
Ky8vIHJlaW1wIGZyb20gR3JhcGhpY3NMYXllci5oCitOYXRpdmVMYXllciBHcmFwaGljc0xheWVy
UXQ6Om5hdGl2ZUxheWVyKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9pbXBsLmdldCgpOworfQor
CisvLyByZWltcCBmcm9tIEdyYXBoaWNzTGF5ZXIuaAorUGxhdGZvcm1MYXllciogR3JhcGhpY3NM
YXllclF0OjpwbGF0Zm9ybUxheWVyKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9pbXBsLmdldCgp
OworfQorCisvLyBub3cgd2Ugc3RhcnQgZGVhbGluZyB3aXRoIFdlYkNvcmUgYW5pbWF0aW9ucyB0
cmFuc2xhdGVkIHRvIFF0IGFuaW1hdGlvbnMKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1
Y3QgS2V5ZnJhbWVWYWx1ZVF0IHsKKyAgICBUaW1pbmdGdW5jdGlvbiB0aW1pbmdGdW5jdGlvbjsK
KyAgICBUIHZhbHVlOworfTsKKworLy8gd2UgY29weSB0aGlzIGZyb20gdGhlIEFuaW1hdGlvbkJh
c2UuY3BwCitzdGF0aWMgaW5saW5lIGRvdWJsZSBzb2x2ZUVwc2lsb24oZG91YmxlIGR1cmF0aW9u
KQoreworICAgIHJldHVybiAxLjAgLyAoMjAwLjAgKiBkdXJhdGlvbik7Cit9CisKK3N0YXRpYyBp
bmxpbmUgZG91YmxlIHNvbHZlQ3ViaWNCZXppZXJGdW5jdGlvbihxcmVhbCBwMXgsIHFyZWFsIHAx
eSwgcXJlYWwgcDJ4LCBxcmVhbCBwMnksIGRvdWJsZSB0LCBkb3VibGUgZHVyYXRpb24pCit7Cisg
ICAgVW5pdEJlemllciBiZXppZXIocDF4LCBwMXksIHAyeCwgcDJ5KTsKKyAgICByZXR1cm4gYmV6
aWVyLnNvbHZlKHQsIHNvbHZlRXBzaWxvbihkdXJhdGlvbikpOworfQorCisvLyB3ZSB3YW50IHRo
ZSB0aW1pbmcgZnVuY3Rpb24gdG8gYmUgYXMgY2xvc2UgYXMgcG9zc2libGUgdG8gd2hhdCB0aGUg
d2ViLWRldmVsb3BlciBpbnRlbmRlZCwgc28gd2UncmUgdXNpbmcgdGhlIHNhbWUgZnVuY3Rpb24g
dXNlZCBieSBXZWJDb3JlIHdoZW4gY29tcG9zaXRpbmcgaXMgZGlzYWJsZWQKKy8vIFVzaW5nIGVh
c2luZy1jdXJ2ZXMgd291bGQgcHJvYmFibHkgd29yayBmb3Igc29tZSBvZiB0aGUgY2FzZXMsIGJ1
dCB3b3VsZG4ndCByZWFsbHkgYnV5IHVzIGFueXRoaW5nIGFzIHdlJ2QgaGF2ZSB0byBjb252ZXJ0
IHRoZSBiZXppZXIgZnVuY3Rpb24gYmFjayB0byBhbiBlYXNpbmcgY3VydmUKK3N0YXRpYyBpbmxp
bmUgcXJlYWwgYXBwbHlUaW1pbmdGdW5jdGlvbihjb25zdCBUaW1pbmdGdW5jdGlvbiYgdGltaW5n
RnVuY3Rpb24sIHFyZWFsIHByb2dyZXNzLCBpbnQgZHVyYXRpb24pCit7CisgICAgaWYgKHRpbWlu
Z0Z1bmN0aW9uLnR5cGUoKSA9PSBMaW5lYXJUaW1pbmdGdW5jdGlvbikKKyAgICAgICAgcmV0dXJu
IHByb2dyZXNzOworICAgIGlmICh0aW1pbmdGdW5jdGlvbi50eXBlKCkgPT0gQ3ViaWNCZXppZXJU
aW1pbmdGdW5jdGlvbikgeworICAgICAgICByZXR1cm4gc29sdmVDdWJpY0JlemllckZ1bmN0aW9u
KHRpbWluZ0Z1bmN0aW9uLngxKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgdGltaW5nRnVuY3Rpb24ueTEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICB0aW1pbmdGdW5jdGlvbi54MigpLAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIHRpbWluZ0Z1bmN0aW9uLnkyKCksCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgZG91YmxlKHByb2dyZXNzKSwgZG91YmxlKGR1cmF0aW9uKSAv
IDEwMDApOworICAgIH0KKyAgICByZXR1cm4gcHJvZ3Jlc3M7Cit9CisKKy8vIGhlbHBlciBmdW5j
dGlvbnMgdG8gc2FmZWx5IGdldCBhIHZhbHVlIG91dCBvZiBXZWJDb3JlJ3MgQW5pbWF0aW9uVmFs
dWUqCitzdGF0aWMgdm9pZCB3ZWJraXRBbmltYXRpb25Ub1F0QW5pbWF0aW9uVmFsdWUoY29uc3Qg
QW5pbWF0aW9uVmFsdWUqIGFuaW1hdGlvblZhbHVlLCBUcmFuc2Zvcm1PcGVyYXRpb25zJiB0cmFu
c2Zvcm1PcGVyYXRpb25zKQoreworICAgIHRyYW5zZm9ybU9wZXJhdGlvbnMgPSBUcmFuc2Zvcm1P
cGVyYXRpb25zKCk7CisgICAgaWYgKCFhbmltYXRpb25WYWx1ZSkKKyAgICAgICAgcmV0dXJuOwor
CisgICAgY29uc3QgVHJhbnNmb3JtT3BlcmF0aW9ucyogb3BzID0gc3RhdGljX2Nhc3Q8Y29uc3Qg
VHJhbnNmb3JtQW5pbWF0aW9uVmFsdWUqPihhbmltYXRpb25WYWx1ZSktPnZhbHVlKCk7CisKKyAg
ICBpZiAob3BzKQorICAgICAgICB0cmFuc2Zvcm1PcGVyYXRpb25zID0gKm9wczsKK30KKworc3Rh
dGljIHZvaWQgd2Via2l0QW5pbWF0aW9uVG9RdEFuaW1hdGlvblZhbHVlKGNvbnN0IEFuaW1hdGlv
blZhbHVlKiBhbmltYXRpb25WYWx1ZSwgcXJlYWwmIHJlYWxWYWx1ZSkKK3sKKyAgICByZWFsVmFs
dWUgPSBhbmltYXRpb25WYWx1ZSA/IHN0YXRpY19jYXN0PGNvbnN0IEZsb2F0QW5pbWF0aW9uVmFs
dWUqPihhbmltYXRpb25WYWx1ZSktPnZhbHVlKCkgOiAwOworfQorCisvLyB3ZSBwdXQgYSBiaXQg
b2YgdGhlIGZ1bmN0aW9uYWxpdHkgaW4gYSBiYXNlIGNsYXNzIHRvIGFsbG93IGNhc3RpbmcgYW5k
IHRvIHNhdmUgc29tZSBjb2RlIHNpemUKK2NsYXNzIEFuaW1hdGlvblF0QmFzZSA6IHB1YmxpYyBR
QWJzdHJhY3RBbmltYXRpb24geworcHVibGljOgorICAgIEFuaW1hdGlvblF0QmFzZShHcmFwaGlj
c0xheWVyUXRJbXBsKiBsYXllciwgY29uc3QgS2V5ZnJhbWVWYWx1ZUxpc3QmIHZhbHVlcywgY29u
c3QgSW50U2l6ZSYgYm94U2l6ZSwgY29uc3QgQW5pbWF0aW9uKiBhbmltLCBjb25zdCBRU3RyaW5n
ICYgbmFtZSkKKyAgICAgICAgOiBRQWJzdHJhY3RBbmltYXRpb24oMCkKKyAgICAgICAgLCBtX2xh
eWVyKGxheWVyKQorICAgICAgICAsIG1fYm94U2l6ZShib3hTaXplKQorICAgICAgICAsIG1fZHVy
YXRpb24oYW5pbS0+ZHVyYXRpb24oKSAqIDEwMDApCisgICAgICAgICwgbV9pc0FsdGVybmF0ZShh
bmltLT5kaXJlY3Rpb24oKSA9PSBBbmltYXRpb246OkFuaW1hdGlvbkRpcmVjdGlvbkFsdGVybmF0
ZSkKKyAgICAgICAgLCBtX3dlYmtpdFByb3BlcnR5SUQodmFsdWVzLnByb3BlcnR5KCkpCisgICAg
ICAgICwgbV9rZXlmcmFtZXNOYW1lKG5hbWUpCisgICAgeworICAgIH0KKworICAgIHZpcnR1YWwg
dm9pZCB1cGRhdGVTdGF0ZShRQWJzdHJhY3RBbmltYXRpb246OlN0YXRlIG5ld1N0YXRlLCBRQWJz
dHJhY3RBbmltYXRpb246OlN0YXRlIG9sZFN0YXRlKQorICAgIHsKKyAgICAgICAgUUFic3RyYWN0
QW5pbWF0aW9uOjp1cGRhdGVTdGF0ZShuZXdTdGF0ZSwgb2xkU3RhdGUpOworCisgICAgICAgIC8v
IGZvciBzb21lIHJlYXNvbiBJIGhhdmUgZG8gdGhpcyBhc3luY2hyb25vdXNseSAtIG9yIHRoZSBh
bmltYXRpb24gd29uJ3Qgd29yaworICAgICAgICBpZiAobmV3U3RhdGUgPT0gUnVubmluZyAmJiBv
bGRTdGF0ZSA9PSBTdG9wcGVkKQorICAgICAgICAgICAgUVRpbWVyOjpzaW5nbGVTaG90KDAsIG1f
bGF5ZXIuZGF0YSgpLCBTTE9UKG5vdGlmeUFuaW1hdGlvblN0YXJ0ZWQoKSkpOworICAgIH0KKwor
ICAgIHZpcnR1YWwgaW50IGR1cmF0aW9uKCkgY29uc3QgeyByZXR1cm4gbV9kdXJhdGlvbjsgfQor
CisgICAgUVdlYWtQb2ludGVyPEdyYXBoaWNzTGF5ZXJRdEltcGw+IG1fbGF5ZXI7CisgICAgSW50
U2l6ZSBtX2JveFNpemU7CisgICAgaW50IG1fZHVyYXRpb247CisgICAgYm9vbCBtX2lzQWx0ZXJu
YXRlOworICAgIEFuaW1hdGVkUHJvcGVydHlJRCBtX3dlYmtpdFByb3BlcnR5SUQ7CisgICAgUVN0
cmluZyBtX2tleWZyYW1lc05hbWU7Cit9OworCisvLyB3ZSdkIHJhdGhlciBoYXZlIGEgdGVtcGxh
dGl6ZWQgUUFic3RyYWN0QW5pbWF0aW9uIHRoYW4gUVByb3BlcnR5QW5pbWF0aW9uIC8gUVZhcmlh
bnRBbmltYXRpb247CisvLyBTaW5jZSB3ZSBrbm93IHRoZSB0eXBlcyB0aGF0IHdlJ3JlIGRlYWxp
bmcgd2l0aCwgdGhlIFFPYmplY3QvUVByb3BlcnR5L1FWYXJpYW50IGFic3RyYWN0aW9uCisvLyBi
dXlzIHVzIHZlcnkgbGl0dGxlIGluIHRoaXMgY2FzZSwgZm9yIHRvbyBtdWNoIG92ZXJoZWFkCit0
ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIEFuaW1hdGlvblF0IDogcHVibGljIEFuaW1hdGlv
blF0QmFzZSB7CisKK3B1YmxpYzoKKyAgICBBbmltYXRpb25RdChHcmFwaGljc0xheWVyUXRJbXBs
KiBsYXllciwgY29uc3QgS2V5ZnJhbWVWYWx1ZUxpc3QmIHZhbHVlcywgY29uc3QgSW50U2l6ZSYg
Ym94U2l6ZSwgY29uc3QgQW5pbWF0aW9uKiBhbmltLCBjb25zdCBRU3RyaW5nICYgbmFtZSkKKyAg
ICAgICAgOkFuaW1hdGlvblF0QmFzZShsYXllciwgdmFsdWVzLCBib3hTaXplLCBhbmltLCBuYW1l
KQorICAgIHsKKyAgICAgICAgLy8gY29weWluZyB0aG9zZSBXZWJDb3JlIHN0cnVjdHVyZXMgaXMg
bm90IHRyaXZpYWwsIHdlIGhhdmUgdG8gZG8gaXQgbGlrZSB0aGlzCisgICAgICAgIGZvciAoc2l6
ZV90IGkgPSAwOyBpIDwgdmFsdWVzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBjb25zdCBB
bmltYXRpb25WYWx1ZSogYW5pbWF0aW9uVmFsdWUgPSB2YWx1ZXMuYXQoaSk7CisgICAgICAgICAg
ICBLZXlmcmFtZVZhbHVlUXQ8VD4ga2V5ZnJhbWVWYWx1ZTsKKyAgICAgICAgICAgIGlmIChhbmlt
YXRpb25WYWx1ZS0+dGltaW5nRnVuY3Rpb24oKSkKKyAgICAgICAgICAgICAgICBrZXlmcmFtZVZh
bHVlLnRpbWluZ0Z1bmN0aW9uID0gKmFuaW1hdGlvblZhbHVlLT50aW1pbmdGdW5jdGlvbigpOwor
ICAgICAgICAgICAgd2Via2l0QW5pbWF0aW9uVG9RdEFuaW1hdGlvblZhbHVlKGFuaW1hdGlvblZh
bHVlLCBrZXlmcmFtZVZhbHVlLnZhbHVlKTsKKyAgICAgICAgICAgIG1fa2V5ZnJhbWVWYWx1ZXNb
YW5pbWF0aW9uVmFsdWUtPmtleVRpbWUoKV0gPSBrZXlmcmFtZVZhbHVlOworICAgICAgICB9Cisg
ICAgfQorCitwcm90ZWN0ZWQ6CisKKyAgICAvLyB0aGlzIGlzIHRoZSBwYXJ0IHRoYXQgZGlmZmVy
cyBiZXR3ZWVuIGFuaW1hdGVkIHByb3BlcnRpZXMKKyAgICB2aXJ0dWFsIHZvaWQgYXBwbHlGcmFt
ZShjb25zdCBUJiBmcm9tVmFsdWUsIGNvbnN0IFQmIHRvVmFsdWUsIHFyZWFsIHByb2dyZXNzKSA9
IDA7CisKKyAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlQ3VycmVudFRpbWUoaW50IGN1cnJlbnRUaW1l
KQorICAgIHsKKyAgICAgICAgaWYgKCFtX2xheWVyKQorICAgICAgICAgICAgcmV0dXJuOworCisg
ICAgICAgIHFyZWFsIHByb2dyZXNzID0gcXJlYWwoY3VycmVudExvb3BUaW1lKCkpIC8gZHVyYXRp
b24oKTsKKworICAgICAgICBpZiAobV9pc0FsdGVybmF0ZSAmJiBjdXJyZW50TG9vcCgpJTIpCisg
ICAgICAgICAgICBwcm9ncmVzcyA9IDEtcHJvZ3Jlc3M7CisKKyAgICAgICAgaWYgKG1fa2V5ZnJh
bWVWYWx1ZXMuaXNFbXB0eSgpKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIC8vIHdl
IGZpbmQgdGhlIGN1cnJlbnQgZnJvbS10byBrZXlmcmFtZXMgaW4gb3VyIGxpdHRsZSBtYXAKKyAg
ICAgICAgdHlwZW5hbWUgUU1hcDxxcmVhbCwgS2V5ZnJhbWVWYWx1ZVF0PFQ+ID46Oml0ZXJhdG9y
IGl0ID0gbV9rZXlmcmFtZVZhbHVlcy5maW5kKHByb2dyZXNzKTsKKworICAgICAgICAvLyB3ZSBk
aWRuJ3QgZmluZCBhbiBleGFjdCBtYXRjaCwgd2UgdHJ5IHRoZSBjbG9zZXN0IG1hdGNoIChsb3dl
ciBib3VuZCkKKyAgICAgICAgaWYgKGl0ID09IG1fa2V5ZnJhbWVWYWx1ZXMuZW5kKCkpCisgICAg
ICAgICAgICBpdCA9IG1fa2V5ZnJhbWVWYWx1ZXMubG93ZXJCb3VuZChwcm9ncmVzcyktMTsKKwor
ICAgICAgICAvLyB3ZSBkaWRuJ3QgZmluZCBhbnkgbWF0Y2ggLSB3ZSB1c2UgdGhlIGZpcnN0IGtl
eWZyYW1lCisgICAgICAgIGlmIChpdCA9PSBtX2tleWZyYW1lVmFsdWVzLmVuZCgpKQorICAgICAg
ICAgICAgaXQgPSBtX2tleWZyYW1lVmFsdWVzLmJlZ2luKCk7CisKKyAgICAgICAgdHlwZW5hbWUg
UU1hcDxxcmVhbCwgS2V5ZnJhbWVWYWx1ZVF0PFQ+ID46Oml0ZXJhdG9yIGl0MiA9IGl0KzE7Cisg
ICAgICAgIGlmIChpdDIgPT0gbV9rZXlmcmFtZVZhbHVlcy5lbmQoKSkKKyAgICAgICAgICAgIGl0
MiA9IG1fa2V5ZnJhbWVWYWx1ZXMuYmVnaW4oKTsKKyAgICAgICAgY29uc3QgS2V5ZnJhbWVWYWx1
ZVF0PFQ+JiBmcm9tS2V5ZnJhbWUgPSBpdC52YWx1ZSgpOworICAgICAgICBjb25zdCBLZXlmcmFt
ZVZhbHVlUXQ8VD4mIHRvS2V5ZnJhbWUgPSBpdDIudmFsdWUoKTsKKworICAgICAgICBjb25zdCBU
aW1pbmdGdW5jdGlvbiYgdGltaW5nRnVuYyA9IGZyb21LZXlmcmFtZS50aW1pbmdGdW5jdGlvbjsK
KyAgICAgICAgY29uc3QgVCYgZnJvbVZhbHVlID0gZnJvbUtleWZyYW1lLnZhbHVlOworICAgICAg
ICBjb25zdCBUJiB0b1ZhbHVlID0gdG9LZXlmcmFtZS52YWx1ZTsKKworICAgICAgICAvLyBub3cg
d2UgaGF2ZSBhIHNvdXJjZSBrZXlmcmFtZSwgb3JpZ2luIGtleWZyYW1lIGFuZCBhIHRpbWluZyBm
dW5jdGlvbgorICAgICAgICAvLyB3ZSBjYW4gbm93IHByb2Nlc3MgdGhlIHByb2dyZXNzIGFuZCBh
cHBseSB0aGUgZnJhbWUKKyAgICAgICAgcXJlYWwgbm9ybWFsaXplZFByb2dyZXNzID0gKGl0Lmtl
eSgpID09IGl0Mi5rZXkoKSkgPyAwIDogKHByb2dyZXNzIC0gaXQua2V5KCkpIC8gKGl0Mi5rZXko
KSAtIGl0LmtleSgpKTsKKyAgICAgICAgbm9ybWFsaXplZFByb2dyZXNzID0gYXBwbHlUaW1pbmdG
dW5jdGlvbih0aW1pbmdGdW5jLCBub3JtYWxpemVkUHJvZ3Jlc3MsIGR1cmF0aW9uKCkgLyAxMDAw
KTsKKyAgICAgICAgYXBwbHlGcmFtZShmcm9tVmFsdWUsIHRvVmFsdWUsIG5vcm1hbGl6ZWRQcm9n
cmVzcyk7CisgICAgfQorCisgICAgUU1hcDxxcmVhbCwgS2V5ZnJhbWVWYWx1ZVF0PFQ+ID4gbV9r
ZXlmcmFtZVZhbHVlczsKK307CisKK2NsYXNzIFRyYW5zZm9ybUFuaW1hdGlvblF0IDogcHVibGlj
IEFuaW1hdGlvblF0PFRyYW5zZm9ybU9wZXJhdGlvbnM+IHsKK3B1YmxpYzoKKyAgICBUcmFuc2Zv
cm1BbmltYXRpb25RdChHcmFwaGljc0xheWVyUXRJbXBsKiBsYXllciwgY29uc3QgS2V5ZnJhbWVW
YWx1ZUxpc3QmIHZhbHVlcywgY29uc3QgSW50U2l6ZSYgYm94U2l6ZSwgY29uc3QgQW5pbWF0aW9u
KiBhbmltLCBjb25zdCBRU3RyaW5nICYgbmFtZSkKKyAgICAgICAgICAgICAgICA6IEFuaW1hdGlv
blF0PFRyYW5zZm9ybU9wZXJhdGlvbnM+KGxheWVyLCB2YWx1ZXMsIGJveFNpemUsIGFuaW0sIG5h
bWUpCisgICAgeworICAgIH0KKworICAgIH5UcmFuc2Zvcm1BbmltYXRpb25RdCgpCisgICAgewor
ICAgICAgICAvLyB0aGlzIGNhbWUgdXAgZHVyaW5nIHRoZSBjb21wb3NpdGluZy9hbmltYXRpb24g
TGF5b3V0VGVzdHMKKyAgICAgICAgLy8gd2hlbiB0aGUgYW5pbWF0aW9uIGRpZXMsIHRoZSB0cmFu
c2Zvcm0gaGFzIHRvIGdvIGJhY2sgdG8gZGVmYXVsdAorICAgICAgICBtX2xheWVyLmRhdGEoKS0+
c2V0QmFzZVRyYW5zZm9ybShRVHJhbnNmb3JtKG1fbGF5ZXIuZGF0YSgpLT5tX2xheWVyLT50cmFu
c2Zvcm0oKSkpOworICAgIH0KKworICAgIC8vIHRoZSBpZGVhIGlzIHRoYXQgd2UgbGV0IFdlYkNv
cmUgbWFuYWdlIHRoZSB0cmFuc2Zvcm0tb3BlcmF0aW9ucworICAgIC8vIGFuZCBRdCBqdXN0IG1h
bmFnZXMgdGhlIGFuaW1hdGlvbiBoZWFydGJlYXQgYW5kIHRoZSBib3R0b20tbGluZSBRVHJhbnNm
b3JtCisgICAgLy8gd2UgZ2V0IHRoZSBwZXJmb3JtYW5jZSBub3QgYnkgdXNpbmcgUVRyYW5zZm9y
bSBpbnN0ZWFkIG9mIFRyYW5zZm9ybWF0aW9uTWF0cml4LCBidXQgYnkgcHJvcGVyIGNhY2hpbmcg
b2YKKyAgICAvLyBpdGVtcyB0aGF0IGFyZSBleHBlbnNpdmUgZm9yIFdlYkNvcmUgdG8gcmVuZGVy
LiBXZSB3YW50IHRoZSByZXN0IHRvIGJlIGFzIGNsb3NlIHRvIFdlYkNvcmUncyBpZGVhIGFzIHBv
c3NpYmxlLgorICAgIHZpcnR1YWwgdm9pZCBhcHBseUZyYW1lKGNvbnN0IFRyYW5zZm9ybU9wZXJh
dGlvbnMmIHNvdXJjZU9wZXJhdGlvbnMsIGNvbnN0IFRyYW5zZm9ybU9wZXJhdGlvbnMmIHRhcmdl
dE9wZXJhdGlvbnMsIHFyZWFsIHByb2dyZXNzKQorICAgIHsKKyAgICAgICAgVHJhbnNmb3JtYXRp
b25NYXRyaXggdHJhbnNmb3JtTWF0cml4OworCisgICAgICAgIC8vIHRoaXMgbG9va3Mgc2ltcGxl
IGJ1dCBpcyByZWFsbHkgdHJpY2t5IHRvIGdldCByaWdodC4gVXNlIGNhdXRpb24uCisgICAgICAg
IGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdGFyZ2V0T3BlcmF0aW9ucy5zaXplKCk7ICsraSkKKyAg
ICAgICAgICAgIHRhcmdldE9wZXJhdGlvbnMub3BlcmF0aW9ucygpW2ldLT5ibGVuZChzb3VyY2VP
cGVyYXRpb25zLmF0KGkpLCBwcm9ncmVzcyktPmFwcGx5KHRyYW5zZm9ybU1hdHJpeCwgbV9ib3hT
aXplKTsKKworICAgICAgICBtX2xheWVyLmRhdGEoKS0+c2V0QmFzZVRyYW5zZm9ybShRVHJhbnNm
b3JtKHRyYW5zZm9ybU1hdHJpeCkpOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCB1cGRhdGVT
dGF0ZShRQWJzdHJhY3RBbmltYXRpb246OlN0YXRlIG5ld1N0YXRlLCBRQWJzdHJhY3RBbmltYXRp
b246OlN0YXRlIG9sZFN0YXRlKQorICAgIHsKKyAgICAgICAgQW5pbWF0aW9uUXRCYXNlOjp1cGRh
dGVTdGF0ZShuZXdTdGF0ZSwgb2xkU3RhdGUpOworICAgICAgICBpZiAoIW1fbGF5ZXIpCisgICAg
ICAgICAgICByZXR1cm47CisgICAgICAgIG1fbGF5ZXIuZGF0YSgpLT5mbHVzaENoYW5nZXModHJ1
ZSk7CisKKyAgICAgICAgLy8gdG8gaW5jcmVhc2UgRlBTLCB3ZSB1c2UgYSBsZXNzIGFjY3VyYXRl
IGNhY2hpbmcgbWVjaGFuaXNtIHdoaWxlIGFuaW1hdGlvbiBpcyBnb2luZyBvbgorICAgICAgICAv
LyB0aGlzIGlzIGEgVVggY2hvaWNlIHRoYXQgc2hvdWxkIHByb2JhYmx5IGJlIGN1c3RvbWl6YWJs
ZQorICAgICAgICBpZiAobmV3U3RhdGUgPT0gUUFic3RyYWN0QW5pbWF0aW9uOjpSdW5uaW5nKSB7
CisgICAgICAgICAgICBtX2xheWVyLmRhdGEoKS0+bV90cmFuc2Zvcm1BbmltYXRpb25SdW5uaW5n
ID0gdHJ1ZTsKKyAgICAgICAgICAgIGlmIChtX2xheWVyLmRhdGEoKS0+Y2FjaGVNb2RlKCkgPT0g
UUdyYXBoaWNzSXRlbTo6RGV2aWNlQ29vcmRpbmF0ZUNhY2hlKQorICAgICAgICAgICAgICAgIG1f
bGF5ZXIuZGF0YSgpLT5zZXRDYWNoZU1vZGUoUUdyYXBoaWNzSXRlbTo6SXRlbUNvb3JkaW5hdGVD
YWNoZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtX2xheWVyLmRhdGEoKS0+bV90
cmFuc2Zvcm1BbmltYXRpb25SdW5uaW5nID0gZmFsc2U7CisgICAgICAgICAgICBpZiAobV9sYXll
ci5kYXRhKCktPmNhY2hlTW9kZSgpID09IFFHcmFwaGljc0l0ZW06Okl0ZW1Db29yZGluYXRlQ2Fj
aGUpCisgICAgICAgICAgICAgICAgbV9sYXllci5kYXRhKCktPnNldENhY2hlTW9kZShRR3JhcGhp
Y3NJdGVtOjpEZXZpY2VDb29yZGluYXRlQ2FjaGUpOworICAgICAgICB9CisgICAgfQorfTsKKwor
Y2xhc3MgT3BhY2l0eUFuaW1hdGlvblF0IDogcHVibGljIEFuaW1hdGlvblF0PHFyZWFsPiB7Citw
dWJsaWM6CisgICAgT3BhY2l0eUFuaW1hdGlvblF0KEdyYXBoaWNzTGF5ZXJRdEltcGwqIGxheWVy
LCBjb25zdCBLZXlmcmFtZVZhbHVlTGlzdCYgdmFsdWVzLCBjb25zdCBJbnRTaXplJiBib3hTaXpl
LCBjb25zdCBBbmltYXRpb24qIGFuaW0sIGNvbnN0IFFTdHJpbmcgJiBuYW1lKQorICAgICAgICAg
OiBBbmltYXRpb25RdDxxcmVhbD4obGF5ZXIsIHZhbHVlcywgYm94U2l6ZSwgYW5pbSwgbmFtZSkK
KyAgICB7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIGFwcGx5RnJhbWUoY29uc3QgcXJlYWwm
IGZyb21WYWx1ZSwgY29uc3QgcXJlYWwmIHRvVmFsdWUsIHFyZWFsIHByb2dyZXNzKQorICAgIHsK
KyAgICAgICAgbV9sYXllci5kYXRhKCktPnNldE9wYWNpdHkocU1pbjxxcmVhbD4ocU1heDxxcmVh
bD4oZnJvbVZhbHVlICsgKHRvVmFsdWUtZnJvbVZhbHVlKSpwcm9ncmVzcywgMCksIDEpKTsKKyAg
ICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlU3RhdGUoUUFic3RyYWN0QW5pbWF0aW9uOjpT
dGF0ZSBuZXdTdGF0ZSwgUUFic3RyYWN0QW5pbWF0aW9uOjpTdGF0ZSBvbGRTdGF0ZSkKKyAgICB7
CisgICAgICAgIFFBYnN0cmFjdEFuaW1hdGlvbjo6dXBkYXRlU3RhdGUobmV3U3RhdGUsIG9sZFN0
YXRlKTsKKyAgICAgICAgaWYgKG1fbGF5ZXIpCisgICAgICAgICAgICBtX2xheWVyLmRhdGEoKS0+
bV9vcGFjaXR5QW5pbWF0aW9uUnVubmluZyA9IChuZXdTdGF0ZSA9PSBRQWJzdHJhY3RBbmltYXRp
b246OlJ1bm5pbmcpOworICAgIH0KK307CisKK2Jvb2wgR3JhcGhpY3NMYXllclF0OjphZGRBbmlt
YXRpb24oY29uc3QgS2V5ZnJhbWVWYWx1ZUxpc3QmIHZhbHVlcywgY29uc3QgSW50U2l6ZSYgYm94
U2l6ZSwgY29uc3QgQW5pbWF0aW9uKiBhbmltLCBjb25zdCBTdHJpbmcmIGtleWZyYW1lc05hbWUs
IGRvdWJsZSB0aW1lT2Zmc2V0KQoreworICAgIGlmICghYW5pbS0+ZHVyYXRpb24oKSB8fCAhYW5p
bS0+aXRlcmF0aW9uQ291bnQoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgUUFic3Ry
YWN0QW5pbWF0aW9uKiBuZXdBbmltOworCisgICAgc3dpdGNoICh2YWx1ZXMucHJvcGVydHkoKSkg
eworICAgIGNhc2UgQW5pbWF0ZWRQcm9wZXJ0eU9wYWNpdHk6CisgICAgICAgIG5ld0FuaW0gPSBu
ZXcgT3BhY2l0eUFuaW1hdGlvblF0KG1faW1wbC5nZXQoKSwgdmFsdWVzLCBib3hTaXplLCBhbmlt
LCBrZXlmcmFtZXNOYW1lKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBbmltYXRlZFByb3Bl
cnR5V2Via2l0VHJhbnNmb3JtOgorICAgICAgICBuZXdBbmltID0gbmV3IFRyYW5zZm9ybUFuaW1h
dGlvblF0KG1faW1wbC5nZXQoKSwgdmFsdWVzLCBib3hTaXplLCBhbmltLCBrZXlmcmFtZXNOYW1l
KTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIGZhbHNlOwor
ICAgIH0KKworICAgIC8vIHdlIG1ha2Ugc3VyZSBXZWJDb3JlOjpBbmltYXRpb24gYW5kIFFBbmlt
YXRpb24gYXJlIG9uIHRoZSBzYW1lIHRlcm1zCisgICAgbmV3QW5pbS0+c2V0TG9vcENvdW50KGFu
aW0tPml0ZXJhdGlvbkNvdW50KCkpOworICAgIG1faW1wbC0+bV9hbmltYXRpb25zLmFwcGVuZChR
V2Vha1BvaW50ZXI8UUFic3RyYWN0QW5pbWF0aW9uPihuZXdBbmltKSk7CisgICAgUU9iamVjdDo6
Y29ubmVjdCgmbV9pbXBsLT5tX3N1c3BlbmRUaW1lciwgU0lHTkFMKHRpbWVvdXQoKSksIG5ld0Fu
aW0sIFNMT1QocmVzdW1lKCkpKTsKKyAgICB0aW1lT2Zmc2V0ICs9IGFuaW0tPmRlbGF5KCk7CisK
KyAgICAvLyBmbHVzaCBub3cgb3IgZmxpY2tlci4uLgorICAgIG1faW1wbC0+Zmx1c2hDaGFuZ2Vz
KGZhbHNlKTsKKworICAgIGlmICh0aW1lT2Zmc2V0KQorICAgICAgICBRVGltZXI6OnNpbmdsZVNo
b3QodGltZU9mZnNldCAqIDEwMDAsIG5ld0FuaW0sIFNMT1Qoc3RhcnQoKSkpOworICAgIGVsc2UK
KyAgICAgICAgbmV3QW5pbS0+c3RhcnQoKTsKKworICAgIFFPYmplY3Q6OmNvbm5lY3QobmV3QW5p
bSwgU0lHTkFMKGZpbmlzaGVkKCkpLCBuZXdBbmltLCBTTE9UKGRlbGV0ZUxhdGVyKCkpKTsKKwor
ICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJRdDo6cmVtb3ZlQW5pbWF0
aW9uc0ZvclByb3BlcnR5KEFuaW1hdGVkUHJvcGVydHlJRCBpZCkKK3sKKyAgICBmb3IgKFFMaXN0
PFFXZWFrUG9pbnRlcjxRQWJzdHJhY3RBbmltYXRpb24+ID46Oml0ZXJhdG9yIGl0ID0gbV9pbXBs
LT5tX2FuaW1hdGlvbnMuYmVnaW4oKTsgaXQgIT0gbV9pbXBsLT5tX2FuaW1hdGlvbnMuZW5kKCk7
ICsraXQpIHsKKyAgICAgICAgaWYgKCppdCkgeworICAgICAgICAgICAgQW5pbWF0aW9uUXRCYXNl
KiBhbmltID0gc3RhdGljX2Nhc3Q8QW5pbWF0aW9uUXRCYXNlKj4oaXQtPmRhdGEoKSk7CisgICAg
ICAgICAgICBpZiAoYW5pbSAmJiBhbmltLT5tX3dlYmtpdFByb3BlcnR5SUQgPT0gaWQpIHsKKyAg
ICAgICAgICAgICAgICBkZWxldGUgYW5pbTsKKyAgICAgICAgICAgICAgICBpdCA9IG1faW1wbC0+
bV9hbmltYXRpb25zLmVyYXNlKGl0KTsKKyAgICAgICAgICAgICAgICAtLWl0OworICAgICAgICAg
ICAgfQorICAgICAgICB9CisgICAgfQorfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJRdDo6cmVtb3Zl
QW5pbWF0aW9uc0ZvcktleWZyYW1lcyhjb25zdCBTdHJpbmcmIG5hbWUpCit7CisgICAgZm9yIChR
TGlzdDxRV2Vha1BvaW50ZXI8UUFic3RyYWN0QW5pbWF0aW9uPiA+OjppdGVyYXRvciBpdCA9IG1f
aW1wbC0+bV9hbmltYXRpb25zLmJlZ2luKCk7IGl0ICE9IG1faW1wbC0+bV9hbmltYXRpb25zLmVu
ZCgpOyArK2l0KSB7CisgICAgICAgIGlmICgqaXQpIHsKKyAgICAgICAgICAgIEFuaW1hdGlvblF0
QmFzZSogYW5pbSA9IHN0YXRpY19jYXN0PEFuaW1hdGlvblF0QmFzZSo+KCgqaXQpLmRhdGEoKSk7
CisgICAgICAgICAgICBpZiAoYW5pbSAmJiBhbmltLT5tX2tleWZyYW1lc05hbWUgPT0gUVN0cmlu
ZyhuYW1lKSkgeworICAgICAgICAgICAgICAgICgqaXQpLmRhdGEoKS0+ZGVsZXRlTGF0ZXIoKTsK
KyAgICAgICAgICAgICAgICBpdCA9IG1faW1wbC0+bV9hbmltYXRpb25zLmVyYXNlKGl0KTsKKyAg
ICAgICAgICAgICAgICAtLWl0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQor
Cit2b2lkIEdyYXBoaWNzTGF5ZXJRdDo6cGF1c2VBbmltYXRpb24oY29uc3QgU3RyaW5nJiBuYW1l
LCBkb3VibGUgdGltZU9mZnNldCkKK3sKKyAgICBmb3IgKFFMaXN0PFFXZWFrUG9pbnRlcjxRQWJz
dHJhY3RBbmltYXRpb24+ID46Oml0ZXJhdG9yIGl0ID0gbV9pbXBsLT5tX2FuaW1hdGlvbnMuYmVn
aW4oKTsgaXQgIT0gbV9pbXBsLT5tX2FuaW1hdGlvbnMuZW5kKCk7ICsraXQpIHsKKyAgICAgICAg
aWYgKCppdCkgeworICAgICAgICAgICAgQW5pbWF0aW9uUXRCYXNlKiBhbmltID0gc3RhdGljX2Nh
c3Q8QW5pbWF0aW9uUXRCYXNlKj4oKCppdCkuZGF0YSgpKTsKKyAgICAgICAgICAgIGlmIChhbmlt
ICYmIGFuaW0tPm1fa2V5ZnJhbWVzTmFtZSA9PSBRU3RyaW5nKG5hbWUpKQorICAgICAgICAgICAg
ICAgIFFUaW1lcjo6c2luZ2xlU2hvdCh0aW1lT2Zmc2V0ICogMTAwMCwgYW5pbSwgU0xPVChwYXVz
ZSgpKSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllclF0OjpzdXNw
ZW5kQW5pbWF0aW9ucyhkb3VibGUgdGltZSkKK3sKKyAgICBpZiAobV9pbXBsLT5tX3N1c3BlbmRU
aW1lci5pc0FjdGl2ZSgpKSB7CisgICAgICAgIG1faW1wbC0+bV9zdXNwZW5kVGltZXIuc3RvcCgp
OworICAgICAgICBtX2ltcGwtPm1fc3VzcGVuZFRpbWVyLnN0YXJ0KHRpbWUgKiAxMDAwKTsKKyAg
ICB9IGVsc2UgeworICAgICAgICBmb3IgKFFMaXN0PFFXZWFrUG9pbnRlcjxRQWJzdHJhY3RBbmlt
YXRpb24+ID46Oml0ZXJhdG9yIGl0ID0gbV9pbXBsLT5tX2FuaW1hdGlvbnMuYmVnaW4oKTsgaXQg
IT0gbV9pbXBsLT5tX2FuaW1hdGlvbnMuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgICAgIFFBYnN0
cmFjdEFuaW1hdGlvbiogYW5pbSA9IGl0LT5kYXRhKCk7CisgICAgICAgICAgICBpZiAoYW5pbSkK
KyAgICAgICAgICAgICAgICBhbmltLT5wYXVzZSgpOworICAgICAgICB9CisgICAgfQorfQorCit2
b2lkIEdyYXBoaWNzTGF5ZXJRdDo6cmVzdW1lQW5pbWF0aW9ucygpCit7CisgICAgaWYgKG1faW1w
bC0+bV9zdXNwZW5kVGltZXIuaXNBY3RpdmUoKSkgeworICAgICAgICBtX2ltcGwtPm1fc3VzcGVu
ZFRpbWVyLnN0b3AoKTsKKyAgICAgICAgZm9yIChRTGlzdDxRV2Vha1BvaW50ZXI8UUFic3RyYWN0
QW5pbWF0aW9uPiA+OjppdGVyYXRvciBpdCA9IG1faW1wbC0+bV9hbmltYXRpb25zLmJlZ2luKCk7
IGl0ICE9IG1faW1wbC0+bV9hbmltYXRpb25zLmVuZCgpOyArK2l0KSB7CisgICAgICAgICAgICBR
QWJzdHJhY3RBbmltYXRpb24qIGFuaW0gPSAoKml0KS5kYXRhKCk7CisgICAgICAgICAgICBpZiAo
YW5pbSkKKyAgICAgICAgICAgICAgICBhbmltLT5yZXN1bWUoKTsKKyAgICAgICAgfQorICAgIH0K
K30KKworfQorCisjaW5jbHVkZSA8R3JhcGhpY3NMYXllclF0Lm1vYz4KSW5kZXg6IFdlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3MvcXQvR3JhcGhpY3NMYXllclF0LmgKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy9xdC9HcmFwaGljc0xheWVyUXQuaAkocmV2aXNpb24gMCkK
KysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvcXQvR3JhcGhpY3NMYXllclF0LmgJKHJldmlz
aW9uIDApCkBAIC0wLDAgKzEsODUgQEAKKy8qCisgICAgQ29weXJpZ2h0IChDKSAyMDA5IE5va2lh
IENvcnBvcmF0aW9uIGFuZC9vciBpdHMgc3Vic2lkaWFyeSgtaWVzKQorCisgICAgVGhpcyBsaWJy
YXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAg
IG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVi
bGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRh
dGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBv
cHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1
dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQg
QU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBN
RVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUg
dGhlIEdOVQorICAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRh
aWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExp
YnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5
OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgICAgdGhlIEZy
ZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBG
bG9vciwKKyAgICBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyovCisKKyNpZm5kZWYgR3Jh
cGhpY3NMYXllclF0X2gKKyNkZWZpbmUgR3JhcGhpY3NMYXllclF0X2gKKworI2luY2x1ZGUgIkdy
YXBoaWNzTGF5ZXIuaCIKKyNpbmNsdWRlICJHcmFwaGljc0xheWVyQ2xpZW50LmgiCisKK25hbWVz
cGFjZSBXZWJDb3JlIHsKKworY2xhc3MgR3JhcGhpY3NMYXllclF0SW1wbDsKKworY2xhc3MgR3Jh
cGhpY3NMYXllclF0IDogcHVibGljIEdyYXBoaWNzTGF5ZXIgeworICAgIGZyaWVuZCBjbGFzcyBH
cmFwaGljc0xheWVyUXRJbXBsOworCitwdWJsaWM6CisgICAgR3JhcGhpY3NMYXllclF0KEdyYXBo
aWNzTGF5ZXJDbGllbnQqKTsKKyAgICB2aXJ0dWFsIH5HcmFwaGljc0xheWVyUXQoKTsKKworICAg
IC8vIHJlaW1wcyBmcm9tIEdyYXBoaWNzTGF5ZXIuaAorICAgIHZpcnR1YWwgTmF0aXZlTGF5ZXIg
bmF0aXZlTGF5ZXIoKSBjb25zdDsKKyAgICB2aXJ0dWFsIFBsYXRmb3JtTGF5ZXIqIHBsYXRmb3Jt
TGF5ZXIoKSBjb25zdDsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0TmVlZHNEaXNwbGF5KCk7CisgICAg
dmlydHVhbCB2b2lkIHNldE5lZWRzRGlzcGxheUluUmVjdChjb25zdCBGbG9hdFJlY3QmKTsKKyAg
ICB2aXJ0dWFsIHZvaWQgc2V0UGFyZW50KEdyYXBoaWNzTGF5ZXIqIGxheWVyKTsKKyAgICB2aXJ0
dWFsIHZvaWQgc2V0TmFtZShjb25zdCBTdHJpbmcmIG5hbWUpOworICAgIHZpcnR1YWwgYm9vbCBz
ZXRDaGlsZHJlbihjb25zdCBWZWN0b3I8R3JhcGhpY3NMYXllcio+Jik7CisgICAgdmlydHVhbCB2
b2lkIGFkZENoaWxkKEdyYXBoaWNzTGF5ZXIqKTsKKyAgICB2aXJ0dWFsIHZvaWQgYWRkQ2hpbGRB
dEluZGV4KEdyYXBoaWNzTGF5ZXIqLCBpbnQgaW5kZXgpOworICAgIHZpcnR1YWwgdm9pZCBhZGRD
aGlsZEFib3ZlKEdyYXBoaWNzTGF5ZXIqIGxheWVyLCBHcmFwaGljc0xheWVyKiBzaWJsaW5nKTsK
KyAgICB2aXJ0dWFsIHZvaWQgYWRkQ2hpbGRCZWxvdyhHcmFwaGljc0xheWVyKiBsYXllciwgR3Jh
cGhpY3NMYXllciogc2libGluZyk7CisgICAgdmlydHVhbCBib29sIHJlcGxhY2VDaGlsZChHcmFw
aGljc0xheWVyKiBvbGRDaGlsZCwgR3JhcGhpY3NMYXllciogbmV3Q2hpbGQpOworICAgIHZpcnR1
YWwgdm9pZCByZW1vdmVGcm9tUGFyZW50KCk7CisgICAgdmlydHVhbCB2b2lkIHNldE1hc2tMYXll
cihHcmFwaGljc0xheWVyKiBsYXllcik7CisgICAgdmlydHVhbCB2b2lkIHNldFBvc2l0aW9uKGNv
bnN0IEZsb2F0UG9pbnQmIHApOworICAgIHZpcnR1YWwgdm9pZCBzZXRBbmNob3JQb2ludChjb25z
dCBGbG9hdFBvaW50M0QmIHApOworICAgIHZpcnR1YWwgdm9pZCBzZXRTaXplKGNvbnN0IEZsb2F0
U2l6ZSYgc2l6ZSk7CisgICAgdmlydHVhbCB2b2lkIHNldFRyYW5zZm9ybShjb25zdCBUcmFuc2Zv
cm1hdGlvbk1hdHJpeCYgdCk7CisgICAgdmlydHVhbCB2b2lkIHNldENoaWxkcmVuVHJhbnNmb3Jt
KGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4JiB0KTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0UHJl
c2VydmVzM0QoYm9vbCBiKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0TWFza3NUb0JvdW5kcyhib29s
IGIpOworICAgIHZpcnR1YWwgdm9pZCBzZXREcmF3c0NvbnRlbnQoYm9vbCBiKTsKKyAgICB2aXJ0
dWFsIHZvaWQgc2V0QmFja2dyb3VuZENvbG9yKGNvbnN0IENvbG9yJik7CisgICAgdmlydHVhbCB2
b2lkIGNsZWFyQmFja2dyb3VuZENvbG9yKCk7CisgICAgdmlydHVhbCB2b2lkIHNldENvbnRlbnRz
T3BhcXVlKGJvb2wgYik7CisgICAgdmlydHVhbCB2b2lkIHNldEJhY2tmYWNlVmlzaWJpbGl0eShi
b29sIGIpOworICAgIHZpcnR1YWwgdm9pZCBzZXRPcGFjaXR5KGZsb2F0IG9wYWNpdHkpOworICAg
IHZpcnR1YWwgdm9pZCBzZXRDb250ZW50c1JlY3QoY29uc3QgSW50UmVjdCYgcik7CisgICAgdmly
dHVhbCBib29sIGFkZEFuaW1hdGlvbihjb25zdCBLZXlmcmFtZVZhbHVlTGlzdCYsIGNvbnN0IElu
dFNpemUmIGJveFNpemUsIGNvbnN0IEFuaW1hdGlvbiosIGNvbnN0IFN0cmluZyYga2V5ZnJhbWVz
TmFtZSwgZG91YmxlIHRpbWVPZmZzZXQpOworICAgIHZpcnR1YWwgdm9pZCByZW1vdmVBbmltYXRp
b25zRm9yUHJvcGVydHkoQW5pbWF0ZWRQcm9wZXJ0eUlEKTsKKyAgICB2aXJ0dWFsIHZvaWQgcmVt
b3ZlQW5pbWF0aW9uc0ZvcktleWZyYW1lcyhjb25zdCBTdHJpbmcmIGtleWZyYW1lc05hbWUpOwor
ICAgIHZpcnR1YWwgdm9pZCBwYXVzZUFuaW1hdGlvbihjb25zdCBTdHJpbmcmIGtleWZyYW1lc05h
bWUsIGRvdWJsZSB0aW1lT2Zmc2V0KTsKKyAgICB2aXJ0dWFsIHZvaWQgc3VzcGVuZEFuaW1hdGlv
bnMoZG91YmxlIHRpbWUpOworICAgIHZpcnR1YWwgdm9pZCByZXN1bWVBbmltYXRpb25zKCk7Cisg
ICAgdmlydHVhbCB2b2lkIHNldENvbnRlbnRzVG9JbWFnZShJbWFnZSopOworICAgIHZpcnR1YWwg
dm9pZCBzZXRDb250ZW50c0JhY2tncm91bmRDb2xvcihjb25zdCBDb2xvciYpOworICAgIHZpcnR1
YWwgdm9pZCBzZXRHZW9tZXRyeU9yaWVudGF0aW9uKENvbXBvc2l0aW5nQ29vcmRpbmF0ZXNPcmll
bnRhdGlvbiBvcmllbnRhdGlvbik7CisgICAgdmlydHVhbCB2b2lkIHNldENvbnRlbnRzT3JpZW50
YXRpb24oQ29tcG9zaXRpbmdDb29yZGluYXRlc09yaWVudGF0aW9uIG9yaWVudGF0aW9uKTsKKyAg
ICB2aXJ0dWFsIHZvaWQgZGlzdHJpYnV0ZU9wYWNpdHkoZmxvYXQpOworICAgIHZpcnR1YWwgZmxv
YXQgYWNjdW11bGF0ZWRPcGFjaXR5KCkgY29uc3Q7CisgICAgdmlydHVhbCB2b2lkIHN5bmNDb21w
b3NpdGluZ1N0YXRlKCk7CisKK3ByaXZhdGU6CisgICAgT3duUHRyPEdyYXBoaWNzTGF5ZXJRdElt
cGw+IG1faW1wbDsKK307CisKK30KKyNlbmRpZiAvLyBHcmFwaGljc0xheWVyUXRfaApJbmRleDog
V2ViQ29yZS9wbGF0Zm9ybS9xdC9RV2ViUGFnZUNsaWVudC5oCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNv
cmUvcGxhdGZvcm0vcXQvUVdlYlBhZ2VDbGllbnQuaAkocmV2aXNpb24gNTM0MjcpCisrKyBXZWJD
b3JlL3BsYXRmb3JtL3F0L1FXZWJQYWdlQ2xpZW50LmgJKHdvcmtpbmcgY29weSkKQEAgLTI5LDcg
KzI5LDkgQEAKICNpZm5kZWYgUVRfTk9fQ1VSU09SCiAjaW5jbHVkZSA8UUN1cnNvcj4KICNlbmRp
ZgorCiAjaW5jbHVkZSA8UVJlY3Q+CitjbGFzcyBRR3JhcGhpY3NJdGVtOwogCiBjbGFzcyBRV2Vi
UGFnZUNsaWVudCB7CiBwdWJsaWM6CkBAIC0zOSw2ICs0MSwxNiBAQCBwdWJsaWM6CiAgICAgdmly
dHVhbCB2b2lkIHVwZGF0ZShjb25zdCBRUmVjdCYpID0gMDsKICAgICB2aXJ0dWFsIHZvaWQgc2V0
SW5wdXRNZXRob2RFbmFibGVkKGJvb2wgZW5hYmxlKSA9IDA7CiAgICAgdmlydHVhbCBib29sIGlu
cHV0TWV0aG9kRW5hYmxlZCgpIGNvbnN0ID0gMDsKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9T
SVRJTkcpCisgICAgLy8gdGhpcyBnZXRzIGNhbGxlZCB3aGVuIHdlIHN0YXJ0L3N0b3AgY29tcG9z
aXRpbmcuCisgICAgdmlydHVhbCB2b2lkIHNldFJvb3RHcmFwaGljc0xheWVyKFFHcmFwaGljc0l0
ZW0qIGxheWVyKSB7fQorCisgICAgLy8gdGhpcyBnZXRzIGNhbGxlZCB3aGVuIHRoZSBjb21wb3Np
dG9yIHdhbnRzIHVzIHRvIHN5bmMgdGhlIGxheWVycworICAgIC8vIGlmIHNjaGVkdWxlU3luYyBp
cyB0cnVlLCB3ZSBzY2hlZHVsZSBhIHN5bmMgb3Vyc2VsdmVzLiBvdGhlcndpc2UsCisgICAgLy8g
d2Ugd2FpdCBmb3IgdGhlIG5leHQgdXBkYXRlIGFuZCBzeW5jIHRoZSBsYXllcnMgdGhlbi4KKyAg
ICB2aXJ0dWFsIHZvaWQgbWFya0ZvclN5bmMoYm9vbCBzY2hlZHVsZVN5bmMgPSBmYWxzZSkge30K
KyNlbmRpZgorCiAjaWYgUVRfVkVSU0lPTiA+PSAweDA0MDYwMAogICAgIHZpcnR1YWwgdm9pZCBz
ZXRJbnB1dE1ldGhvZEhpbnQoUXQ6OklucHV0TWV0aG9kSGludCBoaW50LCBib29sIGVuYWJsZSkg
PSAwOwogI2VuZGlmCkluZGV4OiBXZWJLaXQvcXQvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdl
YktpdC9xdC9DaGFuZ2VMb2cJKHJldmlzaW9uIDUzNTIzKQorKysgV2ViS2l0L3F0L0NoYW5nZUxv
Zwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDYwIEBACisyMDEwLTAxLTE5ICBObydhbSBSb3Nl
bnRoYWwgIDxub2FtLnJvc2VudGhhbEBub2tpYS5jb20+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkg
Tk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgW1F0XSBJbXBsZW1lbnQgR3JhcGhpY3NMYXllciBm
b3IgYWNjZWxlcmF0ZWQgbGF5ZXIgY29tcG9zaXRpbmcKKyAgICAgICAgaHR0cHM6Ly9idWdzLndl
YmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTMzNTE0CisKKyAgICAgICAgSGVyZSB3ZSBoYXZlIHRo
ZSBRR3JhcGhpY3NXZWJWaWV3IHN1cHBvcnQgZm9yIGFjY2VsZXJhdGVkIGNvbXBvc2l0aW5nCisK
KyAgICAgICAgKiBBcGkvcWdyYXBoaWNzd2Vidmlldy5jcHA6CisgICAgICAgIChRR3JhcGhpY3NX
ZWJWaWV3T3ZlcmxheTo6cSk6IGFjY2VzcyB0byBjb250YWluZXIgb2JqZWN0CisgICAgICAgIChR
R3JhcGhpY3NXZWJWaWV3T3ZlcmxheTo6Ym91bmRpbmdSZWN0KTogb3ZlcmxheSBoYXMgc2FtZSBy
ZWN0IGFzIHRoZQorICAgICAgICB3ZWJ2aWV3CisgICAgICAgIChRR3JhcGhpY3NXZWJWaWV3T3Zl
cmxheTo6cGFpbnQpOiBwYWludCBldmVyeXRoaW5nIGJ1dCB0aGUgY29udGVudHMKKyAgICAgICAg
KFFHcmFwaGljc1dlYlZpZXdQcml2YXRlOjpRR3JhcGhpY3NXZWJWaWV3UHJpdmF0ZSk6IHNvbWUg
dmFycyBuZWVkZWQKKyAgICAgICAgZm9yIGFjY2VsZXJhdGVkIGNvbXBvc2l0aW5nCisgICAgICAg
IChRR3JhcGhpY3NXZWJWaWV3UHJpdmF0ZTo6KToKKyAgICAgICAgKFFHcmFwaGljc1dlYlZpZXdQ
cml2YXRlOjp+UUdyYXBoaWNzV2ViVmlld1ByaXZhdGUpOgorICAgICAgICAoUUdyYXBoaWNzV2Vi
Vmlld1ByaXZhdGU6OnNldFJvb3RHcmFwaGljc0xheWVyKTogbWFrZSBzdXJlIHdlIGhhdmUgYQor
ICAgICAgICBzY3JvbGxiYXIgb3ZlcmxheSwgYW5kIHRoYXQgdGhlIG5ldyBncmFwaGljcyBsYXll
ciBpcyBwYXJlbnRlZCBieSB0aGUKKyAgICAgICAgd2ViLXZpZXcKKyAgICAgICAgKFFHcmFwaGlj
c1dlYlZpZXdQcml2YXRlOjptYXJrRm9yU3luYyk6IGZsdXNoIGNoYW5nZXMgYXQgZWFybGllc3QK
KyAgICAgICAgY29udmVuaWVuY2Ugb3IgZHVyaW5nIHRoZSBuZXh0IGRyYXcKKworICAgICAgICAo
UUdyYXBoaWNzV2ViVmlld1ByaXZhdGU6OnVwZGF0ZUNvbXBvc2l0aW5nU2Nyb2xsUG9zaXRpb24p
OiBzeW5jIHRoZQorICAgICAgICBwb3NpdGlvbiBvZiB0aGUgY29tcG9zaXRpbmcgbGF5ZXIgd2l0
aCB0aGUgc2Nyb2xsIHBvc2l0aW9uCisgICAgICAgIChRR3JhcGhpY3NXZWJWaWV3UHJpdmF0ZTo6
c3luY0xheWVycyk6IGZsdXNoIGNoYW5nZXMgbm93CisgICAgICAgIChRR3JhcGhpY3NXZWJWaWV3
UHJpdmF0ZTo6c2Nyb2xsKTogbWFrZSBzdXJlIHdlIGFsc28gbW92ZSB0aGUKKyAgICAgICAgY29t
cG9zaXRpbmcgbGF5ZXIKKyAgICAgICAgKFFHcmFwaGljc1dlYlZpZXdQcml2YXRlOjp1cGRhdGUp
OiBhbHNvIHVwZGF0ZSB0aGUgb3ZlcmxheSBpZiBuZWVkZWQKKyAgICAgICAgKFFHcmFwaGljc1dl
YlZpZXc6OlFHcmFwaGljc1dlYlZpZXcpOiBpbml0aWFsaXplIG92ZXJsYXkgd2l0aCAwCisgICAg
ICAgIChRR3JhcGhpY3NXZWJWaWV3OjpwYWludCk6IHBhaW50IG9ubHkgY29udGVudHMgaWYgd2Ug
aGF2ZSBhbiBvdmVybGF5LAorICAgICAgICBzeW5jIHRoZSBjb21wb3NpdGluZyBsYXllcnMgbm93
IGlmIG5lZWRlZAorICAgICAgICAoUUdyYXBoaWNzV2ViVmlldzo6c2V0UGFnZSk6IGFsc28gY2xl
YW4gdXAgdGhlIGNvbXBvc2l0aW5nCisgICAgICAgIChRR3JhcGhpY3NXZWJWaWV3Ojp1cGRhdGVH
ZW9tZXRyeSk6IGFsc28gdXBkYXRlIG92ZXJsYXkgZ2VvCisgICAgICAgIChRR3JhcGhpY3NXZWJW
aWV3OjpzZXRHZW9tZXRyeSk6IGFsc28gdXBkYXRlIG92ZXJsYXkgZ2VvCisgICAgICAgICogQXBp
L3FncmFwaGljc3dlYnZpZXcuaDogcmVpbXAgY29tcG9zaXRpbmcgc3R1ZmYgZnJvbSBRV2ViUGFn
ZUNsaWVudAorICAgICAgICAqIEFwaS9xd2Vic2V0dGluZ3MuY3BwOiBpbml0IG5ldyBzZXR0aW5n
cyBmbGFnIGZvciBjb21wb3NpdGluZyBhcworICAgICAgICBmYWxzZQorICAgICAgICAoUVdlYlNl
dHRpbmdzUHJpdmF0ZTo6YXBwbHkpOiBhcHBseSBuZXcgc2V0dGluZ3MgZmxhZyBmb3IgY29tcG9z
aXRpbmcKKyAgICAgICAgKFFXZWJTZXR0aW5nczo6UVdlYlNldHRpbmdzKToKKyAgICAgICAgKiBB
cGkvcXdlYnNldHRpbmdzLmg6IG5ldyBzZXR0aW5ncyBmbGFnIGZvciBjb21wb3NpdGluZworICAg
ICAgICAqIEFwaS9xd2Vidmlldy5jcHA6IAorICAgICAgICAoUVdlYlZpZXc6OnNldFBhZ2UpOiBx
d2VidmlldyBkb2Vzbid0IHN1cHBvcnQgY29tcG9zaXRpbmc6IGFsd2F5cyBmYWxzZQorICAgICAg
ICAqIFFHVkxhdW5jaGVyL21haW4uY3BwOgorICAgICAgICAoV2ViVmlldzo6V2ViVmlldyk6IHNv
bWUgbW9yZSBjbWRsaW5lIGFyZ3VtZW50cyArIGNvbXBvc2l0aW5nCisgICAgICAgIChNYWluV2lu
ZG93Ojppbml0KTogc29tZSBtb3JlIGNtZGxpbmUgYXJndW1lbnRzCisgICAgICAgIChtYWluKTog
ZGl0dG8KKyAgICAgICAgKiBXZWJDb3JlU3VwcG9ydC9DaHJvbWVDbGllbnRRdC5jcHA6CisgICAg
ICAgIChXZWJDb3JlOjpDaHJvbWVDbGllbnRRdDo6YXR0YWNoUm9vdEdyYXBoaWNzTGF5ZXIpOiBy
ZWltcCBmb3IKKyAgICAgICAgYWNjZWwtY29tcG9zaXRpbmcKKyAgICAgICAgKFdlYkNvcmU6OkNo
cm9tZUNsaWVudFF0OjpzZXROZWVkc09uZVNob3REcmF3aW5nU3luY2hyb25pemF0aW9uKToKKyAg
ICAgICAgcmVpbXAgZm9yIGFjY2VsIGNvbXBvc2l0aW5nCisgICAgICAgIChXZWJDb3JlOjpDaHJv
bWVDbGllbnRRdDo6c2NoZWR1bGVDb21wb3NpdGluZ0xheWVyU3luYyk6IHJlaW1wIGZvcgorICAg
ICAgICBhY2NlbCBjb21wb3NpdGluZworICAgICAgICAqIFdlYkNvcmVTdXBwb3J0L0Nocm9tZUNs
aWVudFF0Lmg6IHJlaW1wcyBmb3IgYWNjZWwgY29tcG9zaXRpbmcKKwogMjAxMC0wMS0xOSAgU3Rl
dmUgQmxvY2sgIDxzdGV2ZWJsb2NrQGdvb2dsZS5jb20+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkg
QWRhbSBCYXJ0aC4KSW5kZXg6IFdlYktpdC9xdC9BcGkvcWdyYXBoaWNzd2Vidmlldy5jcHAKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gV2ViS2l0L3F0L0FwaS9xZ3JhcGhpY3N3ZWJ2aWV3LmNwcAkocmV2aXNpb24g
NTM0MjcpCisrKyBXZWJLaXQvcXQvQXBpL3FncmFwaGljc3dlYnZpZXcuY3BwCSh3b3JraW5nIGNv
cHkpCkBAIC0yMiwyNCArMjIsNzEgQEAKICNpbmNsdWRlICJxZ3JhcGhpY3N3ZWJ2aWV3LmgiCiAK
ICNpbmNsdWRlICJxd2ViZnJhbWUuaCIKKyNpbmNsdWRlICJxd2ViZnJhbWVfcC5oIgogI2luY2x1
ZGUgInF3ZWJwYWdlLmgiCiAjaW5jbHVkZSAicXdlYnBhZ2VfcC5oIgogI2luY2x1ZGUgIlFXZWJQ
YWdlQ2xpZW50LmgiCi0jaW5jbHVkZSA8UXRHdWkvUUdyYXBoaWNzU2NlbmU+Ci0jaW5jbHVkZSA8
UXRHdWkvUUdyYXBoaWNzVmlldz4KKyNpbmNsdWRlIDxGcmFtZVZpZXcuaD4KKyNpbmNsdWRlIDxR
dENvcmUvcXNoYXJlZHBvaW50ZXIuaD4KKyNpbmNsdWRlIDxRdENvcmUvcXRpbWVyLmg+CiAjaW5j
bHVkZSA8UXRHdWkvcWFwcGxpY2F0aW9uLmg+CisjaW5jbHVkZSA8UXRHdWkvcWdyYXBoaWNzc2Nl
bmUuaD4KICNpbmNsdWRlIDxRdEd1aS9xZ3JhcGhpY3NzY2VuZWV2ZW50Lmg+CisjaW5jbHVkZSA8
UXRHdWkvcWdyYXBoaWNzdmlldy5oPgorI2luY2x1ZGUgPFF0R3VpL3FwaXhtYXBjYWNoZS5oPgog
I2luY2x1ZGUgPFF0R3VpL3FzdHlsZW9wdGlvbi5oPgogI2lmIGRlZmluZWQoUV9XU19YMTEpCiAj
aW5jbHVkZSA8UVgxMUluZm8+CiAjZW5kaWYKKyNpbmNsdWRlIDxTZXR0aW5ncy5oPgorCisjaWYg
VVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorCisvLyB0aGUgb3ZlcmxheSBpcyBoZXJlIGZv
ciBvbmUgcmVhc29uIG9ubHk6IHRvIGhhdmUgdGhlIHNjcm9sbC1iYXJzIGFuZCBvdGhlcgorLy8g
ZXh0cmEgVUkgZWxlbWVudHMgYXBwZWFyIG9uIHRvcCBvZiBhbnkgUUdyYXBoaWNzSXRlbXMgY3Jl
YXRlZCBieSBDU1MgY29tcG9zaXRpbmcgbGF5ZXJzCitjbGFzcyBRR3JhcGhpY3NXZWJWaWV3T3Zl
cmxheSA6IHB1YmxpYyBRR3JhcGhpY3NJdGVtIHsKKyAgICBwdWJsaWM6CisgICAgUUdyYXBoaWNz
V2ViVmlld092ZXJsYXkoUUdyYXBoaWNzV2ViVmlldyogdmlldykKKyAgICAgICAgICAgIDpRR3Jh
cGhpY3NJdGVtKHZpZXcpCisgICAgICAgICAgICAsIHEodmlldykKKyAgICB7CisgICAgICAgIHNl
dFBvcygwLCAwKTsKKyAgICAgICAgc2V0RmxhZyhRR3JhcGhpY3NJdGVtOjpJdGVtVXNlc0V4dGVu
ZGVkU3R5bGVPcHRpb24sIHRydWUpOworICAgICAgICBzZXRDYWNoZU1vZGUoUUdyYXBoaWNzSXRl
bTo6RGV2aWNlQ29vcmRpbmF0ZUNhY2hlKTsKKyAgICB9CisKKyAgICBRUmVjdEYgYm91bmRpbmdS
ZWN0KCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBxLT5ib3VuZGluZ1JlY3QoKTsKKyAg
ICB9CisKKyAgICB2b2lkIHBhaW50KFFQYWludGVyKiBwYWludGVyLCBjb25zdCBRU3R5bGVPcHRp
b25HcmFwaGljc0l0ZW0qIG9wdGlvbnMsIFFXaWRnZXQqKQorICAgIHsKKyAgICAgICAgcS0+cGFn
ZSgpLT5tYWluRnJhbWUoKS0+cmVuZGVyKHBhaW50ZXIsIHN0YXRpY19jYXN0PFFXZWJGcmFtZTo6
UmVuZGVyTGF5ZXI+KFFXZWJGcmFtZTo6QWxsTGF5ZXJzJih+UVdlYkZyYW1lOjpDb250ZW50c0xh
eWVyKSksIG9wdGlvbnMtPmV4cG9zZWRSZWN0LnRvUmVjdCgpKTsKKyAgICB9CisKKyAgICBmcmll
bmQgY2xhc3MgUUdyYXBoaWNzV2ViVmlldzsKKyAgICBRR3JhcGhpY3NXZWJWaWV3KiBxOworfTsK
KworI2VuZGlmCiAKIGNsYXNzIFFHcmFwaGljc1dlYlZpZXdQcml2YXRlIDogcHVibGljIFFXZWJQ
YWdlQ2xpZW50IHsKIHB1YmxpYzoKICAgICBRR3JhcGhpY3NXZWJWaWV3UHJpdmF0ZShRR3JhcGhp
Y3NXZWJWaWV3KiBwYXJlbnQpCiAgICAgICAgIDogcShwYXJlbnQpCiAgICAgICAgICwgcGFnZSgw
KQotICAgIHt9CisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorICAgICAgICAsIHJv
b3RHcmFwaGljc0xheWVyKDApCisgICAgICAgICwgc2hvdWxkU3luYyh0cnVlKQorI2VuZGlmCisg
ICAgeworI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKKyAgICAgICAgLy8gdGhlIG92
ZXJsYXkgYW5kIHN0YXlzIGFsaXZlIGZvciB0aGUgbGlmZXRpbWUgb2YKKyAgICAgICAgLy8gdGhp
cyBRR3JhcGhpY3NXZWJWaWV3IGFzIHRoZSBzY3JvbGxiYXJzIGFyZSBuZWVkZWQgd2hlbiB0aGVy
ZSdzIG5vIGNvbXBvc2l0aW5nCisgICAgICAgIHEtPnNldEZsYWcoUUdyYXBoaWNzSXRlbTo6SXRl
bVVzZXNFeHRlbmRlZFN0eWxlT3B0aW9uKTsKKyNlbmRpZgorICAgIH0KIAogICAgIHZpcnR1YWwg
flFHcmFwaGljc1dlYlZpZXdQcml2YXRlKCk7CiAgICAgdmlydHVhbCB2b2lkIHNjcm9sbChpbnQg
ZHgsIGludCBkeSwgY29uc3QgUVJlY3QmKTsKQEAgLTYxLDE0ICsxMDgsOTUgQEAgcHVibGljOgog
CiAgICAgdmlydHVhbCBRT2JqZWN0KiBwbHVnaW5QYXJlbnQoKSBjb25zdDsKIAorI2lmIFVTRShB
Q0NFTEVSQVRFRF9DT01QT1NJVElORykKKyAgICB2aXJ0dWFsIHZvaWQgc2V0Um9vdEdyYXBoaWNz
TGF5ZXIoUUdyYXBoaWNzSXRlbSogbGF5ZXIpOworICAgIHZpcnR1YWwgdm9pZCBtYXJrRm9yU3lu
Yyhib29sIHNjaGVkdWxlU3luYyk7CisgICAgdm9pZCB1cGRhdGVDb21wb3NpdGluZ1Njcm9sbFBv
c2l0aW9uKCk7CisjZW5kaWYKKworICAgIHZvaWQgc3luY0xheWVycygpOwogICAgIHZvaWQgX3Ff
ZG9Mb2FkRmluaXNoZWQoYm9vbCBzdWNjZXNzKTsKIAogICAgIFFHcmFwaGljc1dlYlZpZXcqIHE7
CiAgICAgUVdlYlBhZ2UqIHBhZ2U7CisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQor
ICAgIFFHcmFwaGljc0l0ZW0qIHJvb3RHcmFwaGljc0xheWVyOworCisgICAgLy8gdGhlIG92ZXJs
YXkgZ2V0cyBpbnN0YW50aWF0ZWQgd2hlbiB0aGUgcm9vdCBsYXllciBpcyBhdHRhY2hlZCwgYW5k
IGdldCBkZWxldGVkIHdoZW4gaXQncyBkZXRhY2hlZAorICAgIFFTaGFyZWRQb2ludGVyPFFHcmFw
aGljc1dlYlZpZXdPdmVybGF5PiBvdmVybGF5OworCisgICAgLy8gd2UgbmVlZCB0byBzeW5jIHRo
ZSBsYXllcnMgaWYgd2UgZ2V0IGEgc3BlY2lhbCBjYWxsIGZyb20gdGhlIFdlYkNvcmUKKyAgICAv
LyBjb21wb3NpdG9yIHRlbGxpbmcgdXMgdG8gZG8gc28uIFdlJ2xsIGdldCB0aGF0IGNhbGwgZnJv
bSBDaHJvbWVDbGllbnRRdAorICAgIGJvb2wgc2hvdWxkU3luYzsKKworICAgIC8vIHdlIG5lZWQg
dG8gcHV0IHRoZSByb290IGdyYXBoaWNzIGxheWVyIGJlaGluZCB0aGUgb3ZlcmxheSAod2hpY2gg
Y29udGFpbnMgdGhlIHNjcm9sbGJhcikKKyAgICBlbnVtIHsgUm9vdEdyYXBoaWNzTGF5ZXJaVmFs
dWUsIE92ZXJsYXlaVmFsdWUgfTsKKyNlbmRpZgogfTsKIAogUUdyYXBoaWNzV2ViVmlld1ByaXZh
dGU6On5RR3JhcGhpY3NXZWJWaWV3UHJpdmF0ZSgpCiB7CisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NP
TVBPU0lUSU5HKQorICAgIGlmIChyb290R3JhcGhpY3NMYXllcikgeworICAgICAgICAvLyB3ZSBk
b24ndCBuZWVkIHRvIGRlbGV0ZSB0aGUgcm9vdCBncmFwaGljcyBsYXllcgorICAgICAgICAvLyBU
aGUgbGlmZWN5Y2xlIGlzIG1hbmFnZWQgaW4gR3JhcGhpY3NMYXllclF0LmNwcAorICAgICAgICBy
b290R3JhcGhpY3NMYXllci0+c2V0UGFyZW50SXRlbSgwKTsKKyAgICAgICAgcS0+c2NlbmUoKS0+
cmVtb3ZlSXRlbShyb290R3JhcGhpY3NMYXllcik7CisgICAgfQorI2VuZGlmCit9CisKKyNpZiBV
U0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCit2b2lkIFFHcmFwaGljc1dlYlZpZXdQcml2YXRl
OjpzZXRSb290R3JhcGhpY3NMYXllcihRR3JhcGhpY3NJdGVtKiBsYXllcikKK3sKKyAgICBpZiAo
cm9vdEdyYXBoaWNzTGF5ZXIpIHsKKyAgICAgICAgcm9vdEdyYXBoaWNzTGF5ZXItPnNldFBhcmVu
dEl0ZW0oMCk7CisgICAgICAgIHEtPnNjZW5lKCktPnJlbW92ZUl0ZW0ocm9vdEdyYXBoaWNzTGF5
ZXIpOworICAgICAgICBRV2ViRnJhbWVQcml2YXRlOjpjb3JlKHEtPnBhZ2UoKS0+bWFpbkZyYW1l
KCkpLT52aWV3KCktPnN5bmNDb21wb3NpdGluZ1N0YXRlUmVjdXJzaXZlKCk7CisgICAgfQorCisg
ICAgcm9vdEdyYXBoaWNzTGF5ZXIgPSBsYXllcjsKKworICAgIGlmIChsYXllcikgeworICAgICAg
ICBsYXllci0+c2V0RmxhZyhRR3JhcGhpY3NJdGVtOjpJdGVtQ2xpcHNDaGlsZHJlblRvU2hhcGUs
IHRydWUpOworICAgICAgICBsYXllci0+c2V0UGFyZW50SXRlbShxKTsKKyAgICAgICAgbGF5ZXIt
PnNldFpWYWx1ZShSb290R3JhcGhpY3NMYXllclpWYWx1ZSk7CisgICAgICAgIGlmICghb3Zlcmxh
eSkgeworICAgICAgICAgICAgb3ZlcmxheSA9IFFTaGFyZWRQb2ludGVyPFFHcmFwaGljc1dlYlZp
ZXdPdmVybGF5PihuZXcgUUdyYXBoaWNzV2ViVmlld092ZXJsYXkocSkpOworICAgICAgICAgICAg
b3ZlcmxheS0+c2V0WlZhbHVlKE92ZXJsYXlaVmFsdWUpOworICAgICAgICB9CisgICAgICAgIHVw
ZGF0ZUNvbXBvc2l0aW5nU2Nyb2xsUG9zaXRpb24oKTsKKyAgICB9IGVsc2UgeworICAgICAgICAv
LyB3ZSBkb24ndCBoYXZlIGNvbXBvc2l0aW5nIGxheWVycywgd2UgY2FuIHJlbmRlciB0aGUgc2Ny
b2xsYmFycyBhbmQgY29udGVudCBpbiBvbmUgZ28KKyAgICAgICAgb3ZlcmxheS5jbGVhcigpOwor
ICAgIH0KK30KKwordm9pZCBRR3JhcGhpY3NXZWJWaWV3UHJpdmF0ZTo6bWFya0ZvclN5bmMoYm9v
bCBzY2hlZHVsZVN5bmMpCit7CisgICAgc2hvdWxkU3luYyA9IHRydWU7CisgICAgaWYgKHNjaGVk
dWxlU3luYykKKyAgICAgICAgUVRpbWVyOjpzaW5nbGVTaG90KDAsIHEsIFNMT1Qoc3luY0xheWVy
cygpKSk7Cit9CisKK3ZvaWQgUUdyYXBoaWNzV2ViVmlld1ByaXZhdGU6OnVwZGF0ZUNvbXBvc2l0
aW5nU2Nyb2xsUG9zaXRpb24oKQoreworICAgIGlmIChyb290R3JhcGhpY3NMYXllciAmJiBxLT5w
YWdlKCkgJiYgcS0+cGFnZSgpLT5tYWluRnJhbWUoKSkgeworICAgICAgICBjb25zdCBRUG9pbnQg
c2Nyb2xsUG9zaXRpb24gPSBxLT5wYWdlKCktPm1haW5GcmFtZSgpLT5zY3JvbGxQb3NpdGlvbigp
OworICAgICAgICByb290R3JhcGhpY3NMYXllci0+c2V0UG9zKC1zY3JvbGxQb3NpdGlvbik7Cisg
ICAgfQorfQorCisjZW5kaWYKKwordm9pZCBRR3JhcGhpY3NXZWJWaWV3UHJpdmF0ZTo6c3luY0xh
eWVycygpCit7CisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorICAgIGlmIChzaG91
bGRTeW5jKSB7CisgICAgICAgIFFXZWJGcmFtZVByaXZhdGU6OmNvcmUocS0+cGFnZSgpLT5tYWlu
RnJhbWUoKSktPnZpZXcoKS0+c3luY0NvbXBvc2l0aW5nU3RhdGVSZWN1cnNpdmUoKTsKKyAgICAg
ICAgc2hvdWxkU3luYyA9IGZhbHNlOworICAgIH0KKyNlbmRpZgogfQogCiB2b2lkIFFHcmFwaGlj
c1dlYlZpZXdQcml2YXRlOjpfcV9kb0xvYWRGaW5pc2hlZChib29sIHN1Y2Nlc3MpCkBAIC04Mywx
MSArMjExLDE4IEBAIHZvaWQgUUdyYXBoaWNzV2ViVmlld1ByaXZhdGU6Ol9xX2RvTG9hZEYKIHZv
aWQgUUdyYXBoaWNzV2ViVmlld1ByaXZhdGU6OnNjcm9sbChpbnQgZHgsIGludCBkeSwgY29uc3Qg
UVJlY3QmIHJlY3RUb1Njcm9sbCkKIHsKICAgICBxLT5zY3JvbGwocXJlYWwoZHgpLCBxcmVhbChk
eSksIFFSZWN0RihyZWN0VG9TY3JvbGwpKTsKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJ
TkcpCisgICAgdXBkYXRlQ29tcG9zaXRpbmdTY3JvbGxQb3NpdGlvbigpOworI2VuZGlmCiB9CiAK
IHZvaWQgUUdyYXBoaWNzV2ViVmlld1ByaXZhdGU6OnVwZGF0ZShjb25zdCBRUmVjdCAmIGRpcnR5
UmVjdCkKIHsKICAgICBxLT51cGRhdGUoUVJlY3RGKGRpcnR5UmVjdCkpOworI2lmIFVTRShBQ0NF
TEVSQVRFRF9DT01QT1NJVElORykKKyAgICBpZiAob3ZlcmxheSkKKyAgICAgICAgb3ZlcmxheS0+
dXBkYXRlKFFSZWN0RihkaXJ0eVJlY3QpKTsKKyNlbmRpZgogfQogCiAKQEAgLTI0OCw2ICszODMs
NyBAQCBRR3JhcGhpY3NXZWJWaWV3OjpRR3JhcGhpY3NXZWJWaWV3KFFHcmFwCiAgICAgc2V0QWNj
ZXB0VG91Y2hFdmVudHModHJ1ZSk7CiAjZW5kaWYKICAgICBzZXRGb2N1c1BvbGljeShRdDo6U3Ry
b25nRm9jdXMpOworICAgIHNldEZsYWcoUUdyYXBoaWNzSXRlbTo6SXRlbUNsaXBzQ2hpbGRyZW5U
b1NoYXBlLCB0cnVlKTsKIH0KIAogLyohCkBAIC0yOTcsNyArNDMzLDEyIEBAIFFXZWJQYWdlKiBR
R3JhcGhpY3NXZWJWaWV3OjpwYWdlKCkgY29uc3QKICovCiB2b2lkIFFHcmFwaGljc1dlYlZpZXc6
OnBhaW50KFFQYWludGVyKiBwYWludGVyLCBjb25zdCBRU3R5bGVPcHRpb25HcmFwaGljc0l0ZW0q
IG9wdGlvbiwgUVdpZGdldCopCiB7Ci0gICAgcGFnZSgpLT5tYWluRnJhbWUoKS0+cmVuZGVyKHBh
aW50ZXIsIG9wdGlvbi0+ZXhwb3NlZFJlY3QudG9SZWN0KCkpOworI2lmIFVTRShBQ0NFTEVSQVRF
RF9DT01QT1NJVElORykKKyAgICBwYWdlKCktPm1haW5GcmFtZSgpLT5yZW5kZXIocGFpbnRlciwg
ZC0+b3ZlcmxheSA/IFFXZWJGcmFtZTo6Q29udGVudHNMYXllciA6IFFXZWJGcmFtZTo6QWxsTGF5
ZXJzLCBvcHRpb24tPmV4cG9zZWRSZWN0LnRvQWxpZ25lZFJlY3QoKSk7CisgICAgZC0+c3luY0xh
eWVycygpOworI2Vsc2UKKyAgICBwYWdlKCktPm1haW5GcmFtZSgpLT5yZW5kZXIocGFpbnRlciwg
UVdlYkZyYW1lOjpBbGxMYXllcnMsIG9wdGlvbi0+ZXhwb3NlZFJlY3QudG9SZWN0KCkpOworI2Vu
ZGlmCiB9CiAKIC8qISBccmVpbXAKQEAgLTQyNSw2ICs1NjYsMTAgQEAgdm9pZCBRR3JhcGhpY3NX
ZWJWaWV3OjpzZXRQYWdlKFFXZWJQYWdlKgogICAgIGQtPnBhZ2UgPSBwYWdlOwogICAgIGlmICgh
ZC0+cGFnZSkKICAgICAgICAgcmV0dXJuOworI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElO
RykKKyAgICBpZiAoZC0+b3ZlcmxheSkKKyAgICAgICAgZC0+b3ZlcmxheS0+cHJlcGFyZUdlb21l
dHJ5Q2hhbmdlKCk7CisjZW5kaWYKICAgICBkLT5wYWdlLT5kLT5jbGllbnQgPSBkOyAvLyBzZXQg
dGhlIHBhZ2UgY2xpZW50CiAKICAgICBRU2l6ZSBzaXplID0gZ2VvbWV0cnkoKS5zaXplKCkudG9T
aXplKCk7CkBAIC01MjgsNiArNjczLDEyIEBAIHFyZWFsIFFHcmFwaGljc1dlYlZpZXc6Onpvb21G
YWN0b3IoKSBjb24KICovCiB2b2lkIFFHcmFwaGljc1dlYlZpZXc6OnVwZGF0ZUdlb21ldHJ5KCkK
IHsKKworI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKKyAgICBpZiAoZC0+b3Zlcmxh
eSkKKyAgICAgICAgZC0+b3ZlcmxheS0+cHJlcGFyZUdlb21ldHJ5Q2hhbmdlKCk7CisjZW5kaWYK
KwogICAgIFFHcmFwaGljc1dpZGdldDo6dXBkYXRlR2VvbWV0cnkoKTsKIAogICAgIGlmICghZC0+
cGFnZSkKQEAgLTU0Myw2ICs2OTQsMTEgQEAgdm9pZCBRR3JhcGhpY3NXZWJWaWV3OjpzZXRHZW9t
ZXRyeShjb25zdAogewogICAgIFFHcmFwaGljc1dpZGdldDo6c2V0R2VvbWV0cnkocmVjdCk7CiAK
KyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCisgICAgaWYgKGQtPm92ZXJsYXkpCisg
ICAgICAgIGQtPm92ZXJsYXktPnByZXBhcmVHZW9tZXRyeUNoYW5nZSgpOworI2VuZGlmCisKICAg
ICBpZiAoIWQtPnBhZ2UpCiAgICAgICAgIHJldHVybjsKIApJbmRleDogV2ViS2l0L3F0L0FwaS9x
Z3JhcGhpY3N3ZWJ2aWV3LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0L3F0L0FwaS9xZ3JhcGhpY3N3
ZWJ2aWV3LmgJKHJldmlzaW9uIDUzNDI3KQorKysgV2ViS2l0L3F0L0FwaS9xZ3JhcGhpY3N3ZWJ2
aWV3LmgJKHdvcmtpbmcgY29weSkKQEAgLTEzNCw2ICsxMzQsOSBAQCBwcm90ZWN0ZWQ6CiAKIHBy
aXZhdGU6CiAgICAgUV9QUklWQVRFX1NMT1QoZCwgdm9pZCBfcV9kb0xvYWRGaW5pc2hlZChib29s
IHN1Y2Nlc3MpKQorICAgIC8vIHdlIGRvbid0IHdhbnQgdG8gY2hhbmdlIHRoZSBtb2MgYmFzZWQg
b24gVVNFKCkgbWFjcm8sIHNvIHRoaXMgZnVuY3Rpb24gaXMgaGVyZQorICAgIC8vIGJ1dCB3aWxs
IGJlIGVtcHR5IGlmIEFDQ0xFUkFURURfQ09NUE9TSVRJTkcgaXMgZGlzYWJsZWQKKyAgICBRX1BS
SVZBVEVfU0xPVChkLCB2b2lkIHN5bmNMYXllcnMoKSkKIAogICAgIFFHcmFwaGljc1dlYlZpZXdQ
cml2YXRlKiBjb25zdCBkOwogICAgIGZyaWVuZCBjbGFzcyBRR3JhcGhpY3NXZWJWaWV3UHJpdmF0
ZTsKSW5kZXg6IFdlYktpdC9xdC9BcGkvcXdlYnNldHRpbmdzLmNwcAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBX
ZWJLaXQvcXQvQXBpL3F3ZWJzZXR0aW5ncy5jcHAJKHJldmlzaW9uIDUzNDI3KQorKysgV2ViS2l0
L3F0L0FwaS9xd2Vic2V0dGluZ3MuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xNTIsNyArMTUyLDEy
IEBAIHZvaWQgUVdlYlNldHRpbmdzUHJpdmF0ZTo6YXBwbHkoKQogICAgICAgICB2YWx1ZSA9IGF0
dHJpYnV0ZXMudmFsdWUoUVdlYlNldHRpbmdzOjpKYXZhc2NyaXB0RW5hYmxlZCwKICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsLT5hdHRyaWJ1dGVzLnZhbHVlKFFX
ZWJTZXR0aW5nczo6SmF2YXNjcmlwdEVuYWJsZWQpKTsKICAgICAgICAgc2V0dGluZ3MtPnNldEph
dmFTY3JpcHRFbmFibGVkKHZhbHVlKTsKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcp
CisgICAgICAgIHZhbHVlID0gYXR0cmlidXRlcy52YWx1ZShRV2ViU2V0dGluZ3M6OkFjY2VsZXJh
dGVkQ29tcG9zaXRpbmdFbmFibGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBnbG9iYWwtPmF0dHJpYnV0ZXMudmFsdWUoUVdlYlNldHRpbmdzOjpBY2NlbGVyYXRlZENv
bXBvc2l0aW5nRW5hYmxlZCkpOwogCisgICAgICAgIHNldHRpbmdzLT5zZXRBY2NlbGVyYXRlZENv
bXBvc2l0aW5nRW5hYmxlZCh2YWx1ZSk7CisjZW5kaWYKICAgICAgICAgdmFsdWUgPSBhdHRyaWJ1
dGVzLnZhbHVlKFFXZWJTZXR0aW5nczo6SmF2YXNjcmlwdENhbk9wZW5XaW5kb3dzLAogICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWwtPmF0dHJpYnV0ZXMudmFsdWUo
UVdlYlNldHRpbmdzOjpKYXZhc2NyaXB0Q2FuT3BlbldpbmRvd3MpKTsKICAgICAgICAgc2V0dGlu
Z3MtPnNldEphdmFTY3JpcHRDYW5PcGVuV2luZG93c0F1dG9tYXRpY2FsbHkodmFsdWUpOwpAQCAt
Mzg5LDYgKzM5NCw3IEBAIFFXZWJTZXR0aW5nczo6UVdlYlNldHRpbmdzKCkKICAgICBkLT5hdHRy
aWJ1dGVzLmluc2VydChRV2ViU2V0dGluZ3M6Ok9mZmxpbmVXZWJBcHBsaWNhdGlvbkNhY2hlRW5h
YmxlZCwgZmFsc2UpOwogICAgIGQtPmF0dHJpYnV0ZXMuaW5zZXJ0KFFXZWJTZXR0aW5nczo6TG9j
YWxTdG9yYWdlRW5hYmxlZCwgZmFsc2UpOwogICAgIGQtPmF0dHJpYnV0ZXMuaW5zZXJ0KFFXZWJT
ZXR0aW5nczo6TG9jYWxDb250ZW50Q2FuQWNjZXNzUmVtb3RlVXJscywgZmFsc2UpOworICAgIGQt
PmF0dHJpYnV0ZXMuaW5zZXJ0KFFXZWJTZXR0aW5nczo6QWNjZWxlcmF0ZWRDb21wb3NpdGluZ0Vu
YWJsZWQsIGZhbHNlKTsKICAgICBkLT5vZmZsaW5lU3RvcmFnZURlZmF1bHRRdW90YSA9IDUgKiAx
MDI0ICogMTAyNDsKICAgICBkLT5kZWZhdWx0VGV4dEVuY29kaW5nID0gUUxhdGluMVN0cmluZygi
aXNvLTg4NTktMSIpOwogfQpJbmRleDogV2ViS2l0L3F0L0FwaS9xd2Vic2V0dGluZ3MuaAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBXZWJLaXQvcXQvQXBpL3F3ZWJzZXR0aW5ncy5oCShyZXZpc2lvbiA1MzQyNykK
KysrIFdlYktpdC9xdC9BcGkvcXdlYnNldHRpbmdzLmgJKHdvcmtpbmcgY29weSkKQEAgLTY4LDcg
KzY4LDggQEAgcHVibGljOgogI2VuZGlmCiAgICAgICAgIExvY2FsQ29udGVudENhbkFjY2Vzc1Jl
bW90ZVVybHMsCiAgICAgICAgIERuc1ByZWZldGNoRW5hYmxlZCwKLSAgICAgICAgWFNTQXVkaXRv
ckVuYWJsZWQKKyAgICAgICAgWFNTQXVkaXRvckVuYWJsZWQsCisgICAgICAgIEFjY2VsZXJhdGVk
Q29tcG9zaXRpbmdFbmFibGVkCiAgICAgfTsKICAgICBlbnVtIFdlYkdyYXBoaWMgewogICAgICAg
ICBNaXNzaW5nSW1hZ2VHcmFwaGljLApJbmRleDogV2ViS2l0L3F0L0FwaS9xd2Vidmlldy5jcHAK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gV2ViS2l0L3F0L0FwaS9xd2Vidmlldy5jcHAJKHJldmlzaW9uIDUzNDI3
KQorKysgV2ViS2l0L3F0L0FwaS9xd2Vidmlldy5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTIyLDEw
ICsyMiwxMSBAQAogI2luY2x1ZGUgImNvbmZpZy5oIgogI2luY2x1ZGUgInF3ZWJ2aWV3LmgiCiAK
KyNpbmNsdWRlICJQYWdlLmgiCiAjaW5jbHVkZSAiUVdlYlBhZ2VDbGllbnQuaCIKKyNpbmNsdWRl
ICJTZXR0aW5ncy5oIgogI2luY2x1ZGUgInF3ZWJmcmFtZS5oIgogI2luY2x1ZGUgInF3ZWJwYWdl
X3AuaCIKLQogI2luY2x1ZGUgInFiaXRtYXAuaCIKICNpbmNsdWRlICJxZXZlbnQuaCIKICNpbmNs
dWRlICJxcGFpbnRlci5oIgpAQCAtMjQ3LDYgKzI0OCw5IEBAIHZvaWQgUVdlYlZpZXc6OnNldFBh
Z2UoUVdlYlBhZ2UqIHBhZ2UpCiAgICAgICAgICAgICAgICAgdGhpcywgU0xPVChfcV9wYWdlRGVz
dHJveWVkKCkpKTsKICAgICB9CiAgICAgc2V0QXR0cmlidXRlKFF0OjpXQV9PcGFxdWVQYWludEV2
ZW50LCBkLT5wYWdlKTsKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCisgICAgZC0+
cGFnZS0+ZC0+cGFnZS0+c2V0dGluZ3MoKS0+c2V0QWNjZWxlcmF0ZWRDb21wb3NpdGluZ0VuYWJs
ZWQoZmFsc2UpOworI2VuZGlmCiAgICAgdXBkYXRlKCk7CiB9CiAKSW5kZXg6IFdlYktpdC9xdC9R
R1ZMYXVuY2hlci9tYWluLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQvcXQvUUdWTGF1bmNoZXIv
bWFpbi5jcHAJKHJldmlzaW9uIDUzNDI3KQorKysgV2ViS2l0L3F0L1FHVkxhdW5jaGVyL21haW4u
Y3BwCSh3b3JraW5nIGNvcHkpCkBAIC03Miw2ICs3Miw4IEBAIHB1YmxpYzoKICAgICBXZWJWaWV3
KFFHcmFwaGljc0l0ZW0qIHBhcmVudCA9IDApCiAgICAgICAgIDogUUdyYXBoaWNzV2ViVmlldyhw
YXJlbnQpCiAgICAgeworICAgICAgICBpZiAoUUFwcGxpY2F0aW9uOjppbnN0YW5jZSgpLT5hcmd1
bWVudHMoKS5jb250YWlucygiLS1jYWNoZVdlYlZpZXciKSkKKyAgICAgICAgICAgIHNldENhY2hl
TW9kZShRR3JhcGhpY3NJdGVtOjpEZXZpY2VDb29yZGluYXRlQ2FjaGUpOwogICAgIH0KICAgICB2
b2lkIHNldFlSb3RhdGlvbihxcmVhbCBhbmdsZSkKICAgICB7CkBAIC0yNTMsNiArMjU1LDEyIEBA
IHB1YmxpYzoKICAgICAgICAgc2V0QXR0cmlidXRlKFF0OjpXQV9EZWxldGVPbkNsb3NlKTsKIAog
ICAgICAgICB2aWV3LT5zZXRTY2VuZShzY2VuZS0+c2NlbmUoKSk7CisgICAgICAgIGNvbnN0IFFT
dHJpbmdMaXN0IGFyZ3VtZW50cyA9IFFBcHBsaWNhdGlvbjo6aW5zdGFuY2UoKS0+YXJndW1lbnRz
KCk7CisgICAgICAgIGNvbnN0IGludCBpbmRleE9mVmlld3BvcnRVcGRhdGVNb2RlID0gYXJndW1l
bnRzLmluZGV4T2YoIi0tdXBkYXRlTW9kZSIpOworICAgICAgICBpZiAoaW5kZXhPZlZpZXdwb3J0
VXBkYXRlTW9kZSA+IDEgJiYgaW5kZXhPZlZpZXdwb3J0VXBkYXRlTW9kZSA8IGFyZ3VtZW50cy5j
b3VudCgpIC0gMSkgeworICAgICAgICAgICAgY29uc3QgUVN0cmluZyB1cGRhdGVNb2RlID0gYXJn
dW1lbnRzW2luZGV4T2ZWaWV3cG9ydFVwZGF0ZU1vZGUrMV0gKyAiVmlld3BvcnRVcGRhdGUiOwor
ICAgICAgICAgICAgdmlldy0+c2V0Vmlld3BvcnRVcGRhdGVNb2RlKHN0YXRpY19jYXN0PFFHcmFw
aGljc1ZpZXc6OlZpZXdwb3J0VXBkYXRlTW9kZT4oUUdyYXBoaWNzVmlldzo6c3RhdGljTWV0YU9i
amVjdC5lbnVtZXJhdG9yKFFHcmFwaGljc1ZpZXc6OnN0YXRpY01ldGFPYmplY3QuaW5kZXhPZkVu
dW1lcmF0b3IoIlZpZXdwb3J0VXBkYXRlTW9kZSIpKS5rZXlzVG9WYWx1ZSh1cGRhdGVNb2RlLnRv
QXNjaWkoKSkpKTsKKyAgICAgICAgfQogCiAgICAgICAgIHNldENlbnRyYWxXaWRnZXQodmlldyk7
CiAKQEAgLTQ0Nyw2ICs0NTUsMTAgQEAgUVdlYlBhZ2UqIFdlYlBhZ2U6OmNyZWF0ZVdpbmRvdyhR
V2ViUGFnZQogaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KQogewogICAgIFFBcHBsaWNh
dGlvbiBhcHAoYXJnYywgYXJndik7CisgICAgaWYgKGFwcC5hcmd1bWVudHMoKS5jb250YWlucygi
LS1oZWxwIikpIHsKKyAgICAgICAgcURlYnVnKCkgPDwgIlVzYWdlOiBRR1ZMYXVuY2hlciBbLS11
cmwgdXJsXSBbLS1jb21wb3NpdGluZ10gWy0tdXBkYXRlTW9kZSBGdWxsfE1pbmltYWx8U21hcnR8
Tm98Qm91bmRpbmdSZWN0XSBbLS1jYWNoZVdlYlZpZXddXG4iOworICAgICAgICByZXR1cm4gMDsK
KyAgICB9CiAgICAgUVN0cmluZyB1cmwgPSBRU3RyaW5nKCJmaWxlOi8vJTEvJTIiKS5hcmcoUURp
cjo6aG9tZVBhdGgoKSkuYXJnKFFMYXRpbjFTdHJpbmcoImluZGV4Lmh0bWwiKSk7CiAKICAgICBh
cHAuc2V0QXBwbGljYXRpb25OYW1lKCJHUVZMYXVuY2hlciIpOwpAQCAtNDU4LDE0ICs0NzAsMjAg
QEAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KQogICAgIFFXZWJTZXR0aW5nczo6ZW5h
YmxlUGVyc2lzdGVudFN0b3JhZ2UoKTsKIAogICAgIGNvbnN0IFFTdHJpbmdMaXN0IGFyZ3MgPSBh
cHAuYXJndW1lbnRzKCk7Ci0gICAgaWYgKGFyZ3MuY291bnQoKSA+IDEpCisgICAgY29uc3QgaW50
IGluZGV4T2ZVcmwgPSBhcmdzLmluZGV4T2YoIi0tdXJsIik7CisgICAgaWYgKGluZGV4T2ZVcmwg
PiAwICYmIGluZGV4T2ZVcmwgPCBhcmdzLmNvdW50KCkgLSAxKQorICAgICAgICB1cmwgPSBhcmdz
LmF0KGluZGV4T2ZVcmwrMSk7CisgICAgZWxzZSBpZiAoYXJncy5jb3VudCgpID4gMSkKICAgICAg
ICAgdXJsID0gYXJncy5hdCgxKTsKKyAgICBpZiAoYXJncy5jb250YWlucygiLS1jb21wb3NpdGlu
ZyIpKQorICAgICAgICBRV2ViU2V0dGluZ3M6Omdsb2JhbFNldHRpbmdzKCktPnNldEF0dHJpYnV0
ZShRV2ViU2V0dGluZ3M6OkFjY2VsZXJhdGVkQ29tcG9zaXRpbmdFbmFibGVkLCB0cnVlKTsKIAog
ICAgIE1haW5XaW5kb3cqIHdpbmRvdyA9IG5ldyBNYWluV2luZG93OwogICAgIHdpbmRvdy0+bG9h
ZCh1cmwpOwogCi0gICAgZm9yIChpbnQgaSA9IDI7IGkgPCBhcmdzLmNvdW50KCk7IGkrKykKLSAg
ICAgICAgd2luZG93LT5uZXdXaW5kb3coYXJncy5hdChpKSk7CisgICAgZm9yIChpbnQgaSA9IDI7
IGkgPCBhcmdzLmNvdW50KCk7ICsraSkKKyAgICAgICAgaWYgKCFhcmdzLmF0KGkpLnN0YXJ0c1dp
dGgoIi0iKSAmJiAhYXJncy5hdChpIC0gMSkuc3RhcnRzV2l0aCgiLSIpKQorICAgICAgICAgICAg
d2luZG93LT5uZXdXaW5kb3coYXJncy5hdChpKSk7CiAKICAgICB3aW5kb3ctPnNob3coKTsKICAg
ICByZXR1cm4gYXBwLmV4ZWMoKTsKSW5kZXg6IFdlYktpdC9xdC9XZWJDb3JlU3VwcG9ydC9DaHJv
bWVDbGllbnRRdC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0L3F0L1dlYkNvcmVTdXBwb3J0L0No
cm9tZUNsaWVudFF0LmNwcAkocmV2aXNpb24gNTM0MjcpCisrKyBXZWJLaXQvcXQvV2ViQ29yZVN1
cHBvcnQvQ2hyb21lQ2xpZW50UXQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yNSw2ICsyNSw3IEBA
CiAgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBX
QVkgT1VUIE9GIFRIRSBVU0UKICAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBP
RiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCiAgKi8KKwogI2luY2x1ZGUgImNvbmZp
Zy5oIgogI2luY2x1ZGUgIkNocm9tZUNsaWVudFF0LmgiCiAKQEAgLTQyLDYgKzQzLDEwIEBACiAj
aW5jbHVkZSAiUVdlYlBhZ2VDbGllbnQuaCIKICNpbmNsdWRlICJTZWN1cml0eU9yaWdpbi5oIgog
CisjaW5jbHVkZSA8cWRlYnVnLmg+CisjaW5jbHVkZSA8cXRleHRkb2N1bWVudC5oPgorI2luY2x1
ZGUgPHF0b29sdGlwLmg+CisKICNpbmNsdWRlICJxd2VicGFnZS5oIgogI2luY2x1ZGUgInF3ZWJw
YWdlX3AuaCIKICNpbmNsdWRlICJxd2ViZnJhbWVfcC5oIgpAQCAtNDksMTIgKzU0LDExIEBACiAj
aW5jbHVkZSAicXdlYnNlY3VyaXR5b3JpZ2luX3AuaCIKICNpbmNsdWRlICJxd2Vidmlldy5oIgog
Ci0jaW5jbHVkZSA8cXRvb2x0aXAuaD4KLSNpbmNsdWRlIDxxdGV4dGRvY3VtZW50Lmg+Ci0KLW5h
bWVzcGFjZSBXZWJDb3JlCi17CisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorI2lu
Y2x1ZGUgIkdyYXBoaWNzTGF5ZXJRdC5oIgorI2VuZGlmCiAKK25hbWVzcGFjZSBXZWJDb3JlIHsK
IAogQ2hyb21lQ2xpZW50UXQ6OkNocm9tZUNsaWVudFF0KFFXZWJQYWdlKiB3ZWJQYWdlKQogICAg
IDogbV93ZWJQYWdlKHdlYlBhZ2UpCkBAIC00NjYsNiArNDcwLDI4IEBAIHZvaWQgQ2hyb21lQ2xp
ZW50UXQ6OnJlcXVlc3RHZW9sb2NhdGlvblAKICAgICBub3RJbXBsZW1lbnRlZCgpOwogfQogCisj
aWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQordm9pZCBDaHJvbWVDbGllbnRRdDo6YXR0
YWNoUm9vdEdyYXBoaWNzTGF5ZXIoRnJhbWUqIGZyYW1lLCBHcmFwaGljc0xheWVyKiBncmFwaGlj
c0xheWVyKQoreyAgICAKKyAgICBpZiAocGxhdGZvcm1QYWdlQ2xpZW50KCkpCisgICAgICAgIHBs
YXRmb3JtUGFnZUNsaWVudCgpLT5zZXRSb290R3JhcGhpY3NMYXllcihncmFwaGljc0xheWVyID8g
Z3JhcGhpY3NMYXllci0+bmF0aXZlTGF5ZXIoKSA6IDApOworfQorCit2b2lkIENocm9tZUNsaWVu
dFF0OjpzZXROZWVkc09uZVNob3REcmF3aW5nU3luY2hyb25pemF0aW9uKCkKK3sKKyAgICAvLyB3
ZSB3YW50IHRoZSBsYXllcnMgdG8gc3luY2hyb25pemUgbmV4dCB0aW1lIHdlIHVwZGF0ZSB0aGUg
c2NyZWVuIGFueXdheQorICAgIGlmIChwbGF0Zm9ybVBhZ2VDbGllbnQoKSkKKyAgICAgICAgcGxh
dGZvcm1QYWdlQ2xpZW50KCktPm1hcmtGb3JTeW5jKGZhbHNlKTsKK30KKwordm9pZCBDaHJvbWVD
bGllbnRRdDo6c2NoZWR1bGVDb21wb3NpdGluZ0xheWVyU3luYygpCit7CisgICAgLy8gd2Ugd2Fu
dCB0aGUgbGF5ZXJzIHRvIHN5bmNocm9uaXplIEFTQVAKKyAgICBpZiAocGxhdGZvcm1QYWdlQ2xp
ZW50KCkpCisgICAgICAgIHBsYXRmb3JtUGFnZUNsaWVudCgpLT5tYXJrRm9yU3luYyh0cnVlKTsK
K30KKyNlbmRpZgorCiBRdEFic3RyYWN0V2ViUG9wdXAqIENocm9tZUNsaWVudFF0OjpjcmVhdGVQ
b3B1cCgpCiB7CiAgICAgcmV0dXJuIG5ldyBRdEZhbGxiYWNrV2ViUG9wdXA7CkluZGV4OiBXZWJL
aXQvcXQvV2ViQ29yZVN1cHBvcnQvQ2hyb21lQ2xpZW50UXQuaAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJL
aXQvcXQvV2ViQ29yZVN1cHBvcnQvQ2hyb21lQ2xpZW50UXQuaAkocmV2aXNpb24gNTM0MjcpCisr
KyBXZWJLaXQvcXQvV2ViQ29yZVN1cHBvcnQvQ2hyb21lQ2xpZW50UXQuaAkod29ya2luZyBjb3B5
KQpAQCAtMTIzLDYgKzEyMywxNSBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7CiAjaWYgRU5BQkxFKE9G
RkxJTkVfV0VCX0FQUExJQ0FUSU9OUykKICAgICAgICAgdmlydHVhbCB2b2lkIHJlYWNoZWRNYXhB
cHBDYWNoZVNpemUoaW50NjRfdCBzcGFjZU5lZWRlZCk7CiAjZW5kaWYKKworI2lmIFVTRShBQ0NF
TEVSQVRFRF9DT01QT1NJVElORykKKyAgICAgICAgLy8gc2VlIENocm9tZUNsaWVudC5oCisgICAg
ICAgIC8vIHRoaXMgaXMgYSBob29rIGZvciBXZWJDb3JlIHRvIHRlbGwgdXMgd2hhdCB3ZSBuZWVk
IHRvIGRvIHdpdGggdGhlIEdyYXBoaWNzTGF5ZXJzCisgICAgICAgIHZpcnR1YWwgdm9pZCBhdHRh
Y2hSb290R3JhcGhpY3NMYXllcihGcmFtZSosIEdyYXBoaWNzTGF5ZXIqKTsKKyAgICAgICAgdmly
dHVhbCB2b2lkIHNldE5lZWRzT25lU2hvdERyYXdpbmdTeW5jaHJvbml6YXRpb24oKTsKKyAgICAg
ICAgdmlydHVhbCB2b2lkIHNjaGVkdWxlQ29tcG9zaXRpbmdMYXllclN5bmMoKTsKKyNlbmRpZgor
CiAgICAgICAgIHZpcnR1YWwgdm9pZCBydW5PcGVuUGFuZWwoRnJhbWUqLCBQYXNzUmVmUHRyPEZp
bGVDaG9vc2VyPik7CiAKICAgICAgICAgdmlydHVhbCB2b2lkIGZvcm1TdGF0ZURpZENoYW5nZShj
b25zdCBOb2RlKikgeyB9Cg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>46986</attachid>
            <date>2010-01-20 00:02:53 -0800</date>
            <delta_ts>2010-01-20 07:55:22 -0800</delta_ts>
            <desc>GraphicsLayers in Qt: +4.5 build +changelog +last minute crash fix</desc>
            <filename>patch-GraphicsLayerQt-4.diff</filename>
            <type>text/plain</type>
            <size>76764</size>
            <attacher name="Noam Rosenthal">noam</attacher>
            
              <data encoding="base64">SW5kZXg6IENoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBDaGFuZ2VMb2cJKHJldmlzaW9uIDUzNTI0
KQorKysgQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMTMgQEAKKzIwMTAtMDEt
MTkgIE5vJ2FtIFJvc2VudGhhbCAgPG5vYW0ucm9zZW50aGFsQG5va2lhLmNvbT4KKworICAgICAg
ICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBbUXRdIEltcGxlbWVudCBH
cmFwaGljc0xheWVyIGZvciBhY2NlbGVyYXRlZCBsYXllciBjb21wb3NpdGluZworICAgICAgICBo
dHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MzM1MTQKKworICAgICAgICAq
IFdlYktpdC5wcmk6IEFkZGRlZCBjb21waWxlIGZsYWdzIHRvIGVuYWJsZSBhY2NlbGVyYXRlZCBj
b21wb3NpdGluZworCW9uIHZlcnNpb25zIGhpZ2hlciB0aGFuIDQuNQorCiAyMDEwLTAxLTE5ICBH
dXN0YXZvIE5vcm9uaGEgU2lsdmEgIDxnbnNAZ25vbWUub3JnPgogCiAgICAgICAgIFVucmV2aWV3
ZWQuIFNoYXJlZCBsaWJyYXJ5IHZlcnNpb25pbmcgdXBkYXRlIGZvciAxLjEuMTkuCkluZGV4OiBX
ZWJLaXQucHJpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdC5wcmkJKHJldmlzaW9uIDUzNDI3KQorKysg
V2ViS2l0LnByaQkod29ya2luZyBjb3B5KQpAQCAtNDUsNiArNDUsNyBAQCBidWlsZGluZy1saWJz
IHsKICAgICB9CiAgICAgREVQRU5EUEFUSCArPSAkJFBXRC9XZWJLaXQvcXQvQXBpCiB9CitncmVh
dGVyVGhhbihRVF9NSU5PUl9WRVJTSU9OLCA1KTpERUZJTkVTICs9IFdURl9VU0VfQUNDRUxFUkFU
RURfQ09NUE9TSVRJTkcKIAogIW1hYzohdW5peHxzeW1iaWFuIHsKICAgICBERUZJTkVTICs9IFVT
RV9TWVNURU1fTUFMTE9DCkluZGV4OiBXZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBX
ZWJDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gNTM1MjMpCisrKyBXZWJDb3JlL0NoYW5nZUxvZwko
d29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDExNCBAQAorMjAxMC0wMS0xOSAgTm8nYW0gUm9zZW50
aGFsICA8bm9hbS5yb3NlbnRoYWxAbm9raWEuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5P
Qk9EWSAoT09QUyEpLgorCisgICAgICAgIFtRdF0gSW1wbGVtZW50IEdyYXBoaWNzTGF5ZXIgZm9y
IGFjY2VsZXJhdGVkIGxheWVyIGNvbXBvc2l0aW5nCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJr
aXQub3JnL3Nob3dfYnVnLmNnaT9pZD0zMzUxNAorCisgICAgICAgIE5vIG5ldyB0ZXN0czogdGVz
dHMgaW4gTGF5b3V0VGVzdHMvY29tcG9zaXRpbmcgYXJlIG5vdyByZWxldmFudCBmb3IKKyAgICAg
ICAgUXRXZWJraXQhCisKKyAgICAgICAgKiBXZWJDb3JlLnBybzogYWRkZWQgYWNjZWxlcmF0ZWQt
Y29tcG9zaXRpbmcgcmVsYXRlZCBmaWxlcyAKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9H
cmFwaGljc0xheWVyLmg6IGRlZmluZSBRdC1zcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiAgICAgICAg
ICAgb2YgR3JhcGhpY3NMYXllcgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3F0L0dyYXBo
aWNzTGF5ZXJRdC5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllclF0
SW1wbDo6KTogSW1wbGVtZW50YXRpb24gb2YgR3JhcGhpY3NMYXllciB3aXRoCisgICAgICAgIGEg
UUdyYXBoaWNzSXRlbQorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllclF0SW1wbDo6Q29u
dGVudERhdGE6OkNvbnRlbnREYXRhKTogc2F2ZSAKKyAgICAgICAgcGl4bWFwL2NvbG9yIGluZm8g
Zm9yIGRpcmVjdGx5IGNvbXBvc2l0ZWQgY29udGVudAorICAgICAgICAoV2ViQ29yZTo6R3JhcGhp
Y3NMYXllclF0SW1wbDo6U3RhdGU6OlN0YXRlKTogc2F2ZSBpbmZvIGZvciBzeW5jaW5nCisgICAg
ICAgIChXZWJDb3JlOjpHcmFwaGljc0xheWVyUXRJbXBsOjpHcmFwaGljc0xheWVyUXRJbXBsKTog
Y3RvcgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllclF0SW1wbDo6fkdyYXBoaWNzTGF5
ZXJRdEltcGwpOiBkdG9yCisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0xheWVyUXRJbXBsOjpz
ZXRCYXNlVHJhbnNmb3JtKTogc2V0IFF0CisgICAgICAgIHRyYW5zZm9ybWF0aW9uIGluIHRoZSB3
YXkgV2ViQ29yZSB3YW50cyBpdAorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllclF0SW1w
bDo6b3BhcXVlQXJlYSk6IGNhbGN1bGF0ZSBvcGFxdWUgYXJlYQorICAgICAgICBiYXNlZCBvbiBp
bmZvIHdlIGhhdmUKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJRdEltcGw6OmJvdW5k
aW5nUmVjdCk6IHJlaW1wIFFHcmFwaGljc0l0ZW0KKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNz
TGF5ZXJRdEltcGw6OnBhaW50KTogcmVpbXAgUUdyYXBoaWNzSXRlbQorICAgICAgICAoV2ViQ29y
ZTo6R3JhcGhpY3NMYXllclF0SW1wbDo6ZHJhd0NvbnRlbnRzKTogZHJhdyBIVE1ML1BpeG1hcC9D
b2xvcgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllclF0SW1wbDo6bm90aWZ5Q2hhbmdl
KTogbGV0IFdlYkNvcmUga25vdworICAgICAgICBzb21ldGhpbmcgaGFzIGNoYW5nZWQKKyAgICAg
ICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJRdEltcGw6OmZsdXNoQ2hhbmdlcyk6IE1ha2UgdGhl
IGNoYW5nZXMgYXBwZWFyCisgICAgICAgIG9uIHNjcmVlbiBieSBzZXR0aW5nIHRoZW0gdG8gUUdy
YXBoaWNzSXRlbXMKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJRdEltcGw6Om5vdGlm
eUFuaW1hdGlvblN0YXJ0ZWQpOiBsZXQgV2ViQ29yZQorICAgICAgICBrbm93IHRoZSBRQW5pbWF0
aW9uIHN0YXJ0ZWQKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJRdDo6R3JhcGhpY3NM
YXllclF0KTogY3RvcgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllclF0Ojp+R3JhcGhp
Y3NMYXllclF0KTogZHRvcgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllcjo6Y3JlYXRl
KTogaG9vayBmb3IgV2ViQ29yZSB0byBrbm93IHdlJ3JlCisgICAgICAgIGltcGxlbWVudGluZyBj
b21wb3NpdGluZworICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllcjo6Y29tcG9zaXRpbmdD
b29yZGluYXRlc09yaWVudGF0aW9uKTogaG9vayBmb3IKKyAgICAgICAgV2ViQ29yZSB0byBrbm93
IHdlIHVzZSBhIHRvcC1kb3duIHN5c3RlbQorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXll
clF0OjpzZXROZWVkc0Rpc3BsYXkpOiB1cGRhdGUgdGhlIGRpc3BsYXkKKyAgICAgICAgKFdlYkNv
cmU6OkdyYXBoaWNzTGF5ZXJRdDo6c2V0TmVlZHNEaXNwbGF5SW5SZWN0KTogdWRwYXRlIHBhcnQg
b2YgdGhlCisgICAgICAgIGRpc3BsYXkKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJR
dDo6c2V0TmFtZSk6IHJlaW1wCisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0xheWVyUXQ6OnNl
dFBhcmVudCk6IHJlaW1wCisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0xheWVyUXQ6OnNldENo
aWxkcmVuKTogcmVpbXAKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJRdDo6YWRkQ2hp
bGQpOiByZWltcAorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllclF0OjphZGRDaGlsZEF0
SW5kZXgpOiByZWltcAorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllclF0OjphZGRDaGls
ZEFib3ZlKTogcmVpbXAKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJRdDo6YWRkQ2hp
bGRCZWxvdyk6IHJlaW1wCisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0xheWVyUXQ6OnJlcGxh
Y2VDaGlsZCk6IHJlaW1wCisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0xheWVyUXQ6OnJlbW92
ZUZyb21QYXJlbnQpOiByZWltcAorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllclF0Ojpz
ZXRNYXNrTGF5ZXIpOiByZWltcAorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllclF0Ojpz
ZXRQb3NpdGlvbik6IHJlaW1wCisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0xheWVyUXQ6OnNl
dEFuY2hvclBvaW50KTogcmVpbXAKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJRdDo6
c2V0U2l6ZSk6IHJlaW1wCisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0xheWVyUXQ6OnNldFRy
YW5zZm9ybSk6IHJlaW1wCisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0xheWVyUXQ6OnNldENo
aWxkcmVuVHJhbnNmb3JtKTogcmVpbXAKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJR
dDo6c2V0UHJlc2VydmVzM0QpOiByZWltcAorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXll
clF0OjpzZXRNYXNrc1RvQm91bmRzKTogcmVpbXAKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNz
TGF5ZXJRdDo6c2V0RHJhd3NDb250ZW50KTogcmVpbXAKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBo
aWNzTGF5ZXJRdDo6c2V0QmFja2dyb3VuZENvbG9yKTogcmVpbXAKKyAgICAgICAgKFdlYkNvcmU6
OkdyYXBoaWNzTGF5ZXJRdDo6Y2xlYXJCYWNrZ3JvdW5kQ29sb3IpOiByZWltcAorICAgICAgICAo
V2ViQ29yZTo6R3JhcGhpY3NMYXllclF0OjpzZXRDb250ZW50c09wYXF1ZSk6IHJlaW1wCisgICAg
ICAgIChXZWJDb3JlOjpHcmFwaGljc0xheWVyUXQ6OnNldEJhY2tmYWNlVmlzaWJpbGl0eSk6IHJl
aW1wCisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0xheWVyUXQ6OnNldE9wYWNpdHkpOiByZWlt
cAorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllclF0OjpzZXRDb250ZW50c1JlY3QpOiBy
ZWltcAorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllclF0OjpzZXRDb250ZW50c1RvSW1h
Z2UpOiByZWltcAorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllclF0OjpzZXRDb250ZW50
c0JhY2tncm91bmRDb2xvcik6IHJlaW1wCisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0xheWVy
UXQ6OnNldEdlb21ldHJ5T3JpZW50YXRpb24pOiByZWltcAorICAgICAgICAoV2ViQ29yZTo6R3Jh
cGhpY3NMYXllclF0OjpzZXRDb250ZW50c09yaWVudGF0aW9uKTogcmVpbXAKKyAgICAgICAgKFdl
YkNvcmU6OkdyYXBoaWNzTGF5ZXJRdDo6ZGlzdHJpYnV0ZU9wYWNpdHkpOiByZWltcAorICAgICAg
ICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllclF0OjphY2N1bXVsYXRlZE9wYWNpdHkpOiByZWltcAor
ICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllclF0OjpzeW5jQ29tcG9zaXRpbmdTdGF0ZSk6
IHJlaW1wCisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0xheWVyUXQ6Om5hdGl2ZUxheWVyKTog
cmVpbXAgKFFHcmFwaGljc0l0ZW0qKQorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllclF0
OjpwbGF0Zm9ybUxheWVyKTogcmVpbXAgKFFHcmFwaGljc0l0ZW0qKQorICAgICAgICAoV2ViQ29y
ZTo6c29sdmVFcHNpbG9uKTogY29weSBmcm9tIEFuaW1hdGlvbkJhc2UuY3BwCisgICAgICAgIChX
ZWJDb3JlOjpzb2x2ZUN1YmljQmV6aWVyRnVuY3Rpb24pOiBjb3B5IGZyb20gQW5pYW10aW9uQmFz
ZS5jcHAKKyAgICAgICAgKFdlYkNvcmU6OmFwcGx5VGltaW5nRnVuY3Rpb24pOiB1c2UgV2ViQ29y
ZSdzIHRpbWluZyBhbmQgbm90IFF0J3MKKyAgICAgICAgKFdlYkNvcmU6OndlYmtpdEFuaW1hdGlv
blRvUXRBbmltYXRpb25WYWx1ZSk6IHNhZmVseSBmaWd1cmUgb3V0CisgICAgICAgIGFuaW1hdGlv
biB2YWx1ZXMKKyAgICAgICAgKFdlYkNvcmU6OkFuaW1hdGlvblF0QmFzZTo6QW5pbWF0aW9uUXRC
YXNlKTogYmFzZSBjbGFzcyBmb3IgUXQtYmFzZWQKKyAgICAgICAgV2ViY29yZS1pbml0aWF0ZWQg
YW5pbWF0aW9ucworICAgICAgICAoV2ViQ29yZTo6QW5pbWF0aW9uUXRCYXNlOjp1cGRhdGVTdGF0
ZSk6IG5vdGlmeSB3aGVuIGFuIGFuaW1hdGlvbgorICAgICAgICBzdGFydHMKKyAgICAgICAgKFdl
YkNvcmU6OkFuaW1hdGlvblF0QmFzZTo6ZHVyYXRpb24pOiByZWltcCBRQWJzdHJhY3RBbmltYXRp
b24KKyAgICAgICAgKFdlYkNvcmU6OkFuaW1hdGlvblF0Ojo6QW5pbWF0aW9uUXRCYXNlKToKKyAg
ICAgICAgKFdlYkNvcmU6OkFuaW1hdGlvblF0Ojp1cGRhdGVDdXJyZW50VGltZSk6IHJlYWxpemUg
a2V5ZnJhbWVzIGZyb20KKyAgICAgICAgcHJvZ3Jlc3MKKyAgICAgICAgKFdlYkNvcmU6OlRyYW5z
Zm9ybUFuaW1hdGlvblF0OjpUcmFuc2Zvcm1BbmltYXRpb25RdCk6IGN0b3IKKyAgICAgICAgKFdl
YkNvcmU6OlRyYW5zZm9ybUFuaW1hdGlvblF0Ojp+VHJhbnNmb3JtQW5pbWF0aW9uUXQpOiBkdG9y
CisgICAgICAgIChXZWJDb3JlOjpUcmFuc2Zvcm1BbmltYXRpb25RdDo6YXBwbHlGcmFtZSk6IHNl
dCB0aGUgYWN0dWFsIFFUcmFuc2Zvcm0KKyAgICAgICAgYmFzZWQgb24gV2ViQ29yZSBUcmFuc2Zv
cm1PcGVyYXRpb25zCisgICAgICAgIChXZWJDb3JlOjpUcmFuc2Zvcm1BbmltYXRpb25RdDo6dXBk
YXRlU3RhdGUpOiBjaGFuZ2UgY2FjaGUgbW9kZQorICAgICAgICAoV2ViQ29yZTo6T3BhY2l0eUFu
aW1hdGlvblF0OjpPcGFjaXR5QW5pbWF0aW9uUXQpOgorICAgICAgICAoV2ViQ29yZTo6T3BhY2l0
eUFuaW1hdGlvblF0OjphcHBseUZyYW1lKTogY2hhbmdlIGl0ZW0ncyBvcGFjaXR5CisgICAgICAg
IChXZWJDb3JlOjpPcGFjaXR5QW5pbWF0aW9uUXQ6OnVwZGF0ZVN0YXRlKToKKyAgICAgICAgKFdl
YkNvcmU6OkdyYXBoaWNzTGF5ZXJRdDo6YWRkQW5pbWF0aW9uKTogY29udmVydCBXZWJDb3JlIEFu
aW1hdGlvbiB0bworICAgICAgICBRdCBBbmltYXRpb24KKyAgICAgICAgKFdlYkNvcmU6OkdyYXBo
aWNzTGF5ZXJRdDo6cmVtb3ZlQW5pbWF0aW9uc0ZvclByb3BlcnR5KToKKyAgICAgICAgKFdlYkNv
cmU6OkdyYXBoaWNzTGF5ZXJRdDo6cmVtb3ZlQW5pbWF0aW9uc0ZvcktleWZyYW1lcyk6CisgICAg
ICAgIChXZWJDb3JlOjpHcmFwaGljc0xheWVyUXQ6OnBhdXNlQW5pbWF0aW9uKToKKyAgICAgICAg
KFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJRdDo6c3VzcGVuZEFuaW1hdGlvbnMpOgorICAgICAgICAo
V2ViQ29yZTo6R3JhcGhpY3NMYXllclF0OjpyZXN1bWVBbmltYXRpb25zKToKKyAgICAgICAgKiBw
bGF0Zm9ybS9ncmFwaGljcy9xdC9HcmFwaGljc0xheWVyUXQuaDogQWRkZWQuCisgICAgICAgICog
cGxhdGZvcm0vcXQvUVdlYlBhZ2VDbGllbnQuaDogdmlydHVhbCBmdW5jdGlvbnMgZm9yIFFHcmFw
aGljc1dlYlZpZXcKKyAgICAgICAgY29tcG9zaXRpbmcKKyAgICAgICAgKFFXZWJQYWdlQ2xpZW50
OjpzZXRSb290R3JhcGhpY3NMYXllcik6IGxldCBRR3JhcGhpY3NXZWJWaWV3IGtub3cgdGhhdAor
ICAgICAgICBjb21wb3NpdGluZyBoYXMgc3RhcnRlZC9lbmRlZAorICAgICAgICAoUVdlYlBhZ2VD
bGllbnQ6Om1hcmtGb3JTeW5jKTogbGV0IFFHcmFwaGljc1dlYlZpZXcga25vdyB0aGUKKyAgICAg
ICAgY29tcG9zaXRpbmcgbGF5ZXJzIG5lZWQgdG8gc3luYywgZWl0aGVyIHNvb24gb3Igd2l0aCB0
aGUgbmV4dCB1cGRhdGUKKwogMjAxMC0wMS0xOSAgU2ltb24gRnJhc2VyICA8c2ltb24uZnJhc2Vy
QGFwcGxlLmNvbT4KIAogICAgICAgICBSZXZpZXdlZCBieSBEYW4gQmVybnN0ZWluLgpJbmRleDog
V2ViQ29yZS9XZWJDb3JlLnBybwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL1dlYkNvcmUucHJvCShy
ZXZpc2lvbiA1MzQyNykKKysrIFdlYkNvcmUvV2ViQ29yZS5wcm8JKHdvcmtpbmcgY29weSkKQEAg
LTI3MDcsNiArMjcwNywxOSBAQCBDT05GSUcoc3RhbmRhbG9uZV9wYWNrYWdlKTppc0VxdWFsKFFU
X01BCiAgICAgICAgICAgICBwbHVnaW5zL3dpbi9QYWludEhvb2tzLmFzbQogICAgIH0KIH0KK2Nv
bnRhaW5zKERFRklORVMsIFdURl9VU0VfQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpIHsKK0hFQURF
UlMgKz0gXAorICAgIHJlbmRlcmluZy9SZW5kZXJMYXllckJhY2tpbmcuaCBcCisgICAgcmVuZGVy
aW5nL1JlbmRlckxheWVyQ29tcG9zaXRvci5oIFwKKyAgICBwbGF0Zm9ybS9ncmFwaGljcy9HcmFw
aGljc0xheWVyLmggXAorICAgIHBsYXRmb3JtL2dyYXBoaWNzL0dyYXBoaWNzTGF5ZXJDbGllbnQu
aCBcCisgICAgcGxhdGZvcm0vZ3JhcGhpY3MvcXQvR3JhcGhpY3NMYXllclF0LmgKK1NPVVJDRVMg
Kz0gXAorICAgIHBsYXRmb3JtL2dyYXBoaWNzL0dyYXBoaWNzTGF5ZXIuY3BwIFwKKyAgICBwbGF0
Zm9ybS9ncmFwaGljcy9xdC9HcmFwaGljc0xheWVyUXQuY3BwIFwKKyAgICByZW5kZXJpbmcvUmVu
ZGVyTGF5ZXJCYWNraW5nLmNwcCBcCisgICAgcmVuZGVyaW5nL1JlbmRlckxheWVyQ29tcG9zaXRv
ci5jcHAKK30KIAogc3ltYmlhbiB7CiAgICAgc2hhcmVkIHsKSW5kZXg6IFdlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3MvR3JhcGhpY3NMYXllci5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3MvR3JhcGhpY3NMYXllci5oCShyZXZpc2lvbiA1MzQyNykKKysrIFdlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3MvR3JhcGhpY3NMYXllci5oCSh3b3JraW5nIGNvcHkpCkBAIC01OSw2
ICs1OSwxMCBAQCBjbGFzcyBXS0NBQ0ZMYXllcjsKIHR5cGVkZWYgV0tDQUNGTGF5ZXIgUGxhdGZv
cm1MYXllcjsKIHR5cGVkZWYgdm9pZCogTmF0aXZlTGF5ZXI7CiB9CisjZWxpZiBQTEFURk9STShR
VCkKK2NsYXNzIFFHcmFwaGljc0l0ZW07Cit0eXBlZGVmIFFHcmFwaGljc0l0ZW0gUGxhdGZvcm1M
YXllcjsKK3R5cGVkZWYgUUdyYXBoaWNzSXRlbSogTmF0aXZlTGF5ZXI7CiAjZWxzZQogdHlwZWRl
ZiB2b2lkKiBQbGF0Zm9ybUxheWVyOwogdHlwZWRlZiB2b2lkKiBOYXRpdmVMYXllcjsKSW5kZXg6
IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvcXQvR3JhcGhpY3NMYXllclF0LmNwcAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3F0L0dyYXBoaWNzTGF5ZXJRdC5jcHAJ
KHJldmlzaW9uIDApCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3F0L0dyYXBoaWNzTGF5
ZXJRdC5jcHAJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMTExOCBAQAorLyoKKyAgICBDb3B5cmln
aHQgKEMpIDIwMDkgTm9raWEgQ29ycG9yYXRpb24gYW5kL29yIGl0cyBzdWJzaWRpYXJ5KC1pZXMp
CisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1
dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExp
YnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJl
ZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vu
c2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxp
YnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwK
KyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3
YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNl
bnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBj
b3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcg
d2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3Jp
dGUgdG8KKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xp
biBTdHJlZXQsIEZpZnRoIEZsb29yLAorICAgIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgor
Ki8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkdyYXBoaWNzTGF5ZXJRdC5oIgor
CisjaW5jbHVkZSAiQ3VycmVudFRpbWUuaCIKKyNpbmNsdWRlICJGbG9hdFJlY3QuaCIKKyNpbmNs
dWRlICJHcmFwaGljc0NvbnRleHQuaCIKKyNpbmNsdWRlICJJbWFnZS5oIgorI2luY2x1ZGUgIlJl
ZkNvdW50ZWQuaCIKKyNpbmNsdWRlICJUcmFuc2xhdGVUcmFuc2Zvcm1PcGVyYXRpb24uaCIKKyNp
bmNsdWRlICJVbml0QmV6aWVyLmgiCisjaW5jbHVkZSA8UXRDb3JlL3FhYnN0cmFjdGFuaW1hdGlv
bi5oPgorI2luY2x1ZGUgPFF0Q29yZS9xZGVidWcuaD4KKyNpbmNsdWRlIDxRdENvcmUvcXNldC5o
PgorI2luY2x1ZGUgPFF0Q29yZS9xdGltZXIuaD4KKyNpbmNsdWRlIDxRdEd1aS9xYml0bWFwLmg+
CisjaW5jbHVkZSA8UXRHdWkvcWNvbG9yLmg+CisjaW5jbHVkZSA8UXRHdWkvcWdyYXBoaWNzZWZm
ZWN0Lmg+CisjaW5jbHVkZSA8UXRHdWkvcWdyYXBoaWNzaXRlbS5oPgorI2luY2x1ZGUgPFF0R3Vp
L3FncmFwaGljc3NjZW5lLmg+CisjaW5jbHVkZSA8UXRHdWkvcW1hdHJpeDR4NC5oPgorI2luY2x1
ZGUgPFF0R3VpL3FwYWludGVyLmg+CisjaW5jbHVkZSA8UXRHdWkvcXBhbGV0dGUuaD4KKyNpbmNs
dWRlIDxRdEd1aS9xcGl4bWFwLmg+CisjaW5jbHVkZSA8UXRHdWkvcXN0eWxlb3B0aW9uLmg+CisK
K25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgR3JhcGhpY3NMYXllclF0SW1wbCA6IHB1Ymxp
YyBRR3JhcGhpY3NPYmplY3QgeworICAgIFFfT0JKRUNUCisKK3B1YmxpYzoKKyAgICAvLyB0aGlz
IHNldCBvZiBmbGFncyBoZWxwIHVzIGRlZmVyIHdoaWNoIHByb3BlcnRpZXMgb2YgdGhlIGxheWVy
IGhhdmUgYmVlbgorICAgIC8vIG1vZGlmaWVkIGJ5IHRoZSBjb21wb3NpdG9yLCBzbyB3ZSBjYW4g
a25vdyB3aGF0IHRvIGxvb2sgZm9yIGluIHRoZSBuZXh0IGZsdXNoCisgICAgZW51bSBDaGFuZ2VN
YXNrIHsKKyAgICAgICAgTm9DaGFuZ2VzID0gICAgICAgICAgICAgICAgIDAsCisgICAgICAgIENo
aWxkcmVuQ2hhbmdlID0gICAgICAgICAgICAoMUwgPDwgMSksCisgICAgICAgIE1hc2tMYXllckNo
YW5nZSA9ICAgICAgICAgICAoMUwgPDwgMiksCisgICAgICAgIFBvc2l0aW9uQ2hhbmdlID0gICAg
ICAgICAgICAoMUwgPDwgMyksCisgICAgICAgIEFuY2hvclBvaW50Q2hhbmdlID0gICAgICAgICAo
MUwgPDwgNCksCisgICAgICAgIFNpemVDaGFuZ2UgID0gICAgICAgICAgICAgICAoMUwgPDwgNSks
CisgICAgICAgIFRyYW5zZm9ybUNoYW5nZSA9ICAgICAgICAgICAoMUwgPDwgNiksCisgICAgICAg
IENvbnRlbnRDaGFuZ2UgPSAgICAgICAgICAgICAoMUwgPDwgNyksCisgICAgICAgIEdlb21ldHJ5
T3JpZW50YXRpb25DaGFuZ2UgPSAoMUwgPDwgOCksCisgICAgICAgIENvbnRlbnRzT3JpZW50YXRp
b25DaGFuZ2UgPSAoMUwgPDwgOSksCisgICAgICAgIE9wYWNpdHlDaGFuZ2UgPSAgICAgICAgICAg
ICAoMUwgPDwgMTApLAorICAgICAgICBDb250ZW50c1JlY3RDaGFuZ2UgPSAgICAgICAgKDFMIDw8
IDExKSwKKyAgICAgICAgUHJlc2VydmVzM0RDaGFuZ2UgPSAgICAgICAgICgxTCA8PCAxMiksCisg
ICAgICAgIE1hc2tzVG9Cb3VuZHNDaGFuZ2UgPSAgICAgICAoMUwgPDwgMTMpLAorICAgICAgICBE
cmF3c0NvbnRlbnRDaGFuZ2UgPSAgICAgICAgKDFMIDw8IDE0KSwKKyAgICAgICAgQ29udGVudHNP
cGFxdWVDaGFuZ2UgPSAgICAgICgxTCA8PCAxNSksCisgICAgICAgIEJhY2tmYWNlVmlzaWJpbGl0
eUNoYW5nZSA9ICAoMUwgPDwgMTYpLAorICAgICAgICBDaGlsZHJlblRyYW5zZm9ybUNoYW5nZSA9
ICAgKDFMIDw8IDE3KSwKKyAgICAgICAgRGlzcGxheUNoYW5nZSA9ICAgICAgICAgICAgICgxTCA8
PCAxOCksCisgICAgICAgIEJhY2tncm91bmRDb2xvckNoYW5nZSA9ICAgICAoMUwgPDwgMTkpLAor
ICAgICAgICBQYXJlbnRDaGFuZ2UgPSAgICAgICAgICAgICAgKDFMIDw8IDIwKSwKKyAgICAgICAg
RGlzdHJpYnV0ZXNPcGFjaXR5Q2hhbmdlID0gICgxTCA8PCAyMSkKKyAgICB9OworCisgICAgLy8g
dGhlIGNvbXBvc2l0b3IgbGV0cyB1cyBzcGVjaWFsLWNhc2UgaW1hZ2VzIGFuZCBjb2xvcnMsIHNv
IHdlIHRyeSB0byBkbyBzbworICAgIGVudW0gU3RhdGljQ29udGVudFR5cGUgeyBIVE1MQ29udGVu
dFR5cGUsIFBpeG1hcENvbnRlbnRUeXBlLCBDb2xvckNvbnRlbnRUeXBlfTsKKworICAgIEdyYXBo
aWNzTGF5ZXJRdEltcGwoR3JhcGhpY3NMYXllclF0KiBuZXdMYXllcik7CisgICAgdmlydHVhbCB+
R3JhcGhpY3NMYXllclF0SW1wbCgpOworCisgICAgLy8gcmVpbXBzIGZyb20gUUdyYXBoaWNzSXRl
bQorICAgIHZpcnR1YWwgUVBhaW50ZXJQYXRoIG9wYXF1ZUFyZWEoKSBjb25zdDsKKyAgICB2aXJ0
dWFsIFFSZWN0RiBib3VuZGluZ1JlY3QoKSBjb25zdDsKKyAgICB2aXJ0dWFsIHZvaWQgcGFpbnQo
UVBhaW50ZXIqLCBjb25zdCBRU3R5bGVPcHRpb25HcmFwaGljc0l0ZW0qLCBRV2lkZ2V0Kik7CisK
KyAgICAvLyB3ZSBtYW5hZ2UgdHJhbnNmb3JtcyBvdXJzZWx2ZXMgYmVjYXVzZSB0cmFuc2Zvcm0t
b3JpZ2luIGFjdHMgZGlmZmVyZW50bHkgaW4gd2Via2l0IGFuZCBpbiBRdAorICAgIHZvaWQgc2V0
QmFzZVRyYW5zZm9ybShjb25zdCBRVHJhbnNmb3JtJik7CisgICAgdm9pZCBkcmF3Q29udGVudHMo
UVBhaW50ZXIqLCBjb25zdCBRUmVjdEYmLCBib29sIG1hc2sgPSBmYWxzZSk7CisKKyAgICAvLyBs
ZXQgdGhlIGNvbXBvc2l0b3ItQVBJIHRlbGwgdXMgd2hpY2ggcHJvcGVydGllcyB3ZXJlIGNoYW5n
ZWQKKyAgICB2b2lkIG5vdGlmeUNoYW5nZShDaGFuZ2VNYXNrKTsKKworICAgIC8vIGNhbGxlZCB3
aGVuIHRoZSBjb21wb3NpdG9yIGlzIHJlYWR5IGZvciB1cyB0byBzaG93IHRoZSBjaGFuZ2VzIG9u
IHNjcmVlbgorICAgIC8vIHRoaXMgaXMgY2FsbGVkIGluZGlyZWN0bHkgZnJvbSBDaHJvbWVDbGll
bnRRdDo6c2V0TmVlZHNPbmVTaG90RHJhd2luZ1N5bmNocm9uaXphdGlvbgorICAgIC8vIChtZWFu
aW5nIHRoZSBzeW5jIHdvdWxkIGhhcHBlbiB0b2dldGhlciB3aXRoIHRoZSBuZXh0IGRyYXcpCisg
ICAgLy8gb3IgQ2hyb21lQ2xpZW50UXQ6OnNjaGVkdWxlQ29tcG9zaXRpbmdMYXllclN5bmMgKG1l
YW5pbmcgdGhlIHN5bmMgd2lsbCBoYXBwZW4gQVNBUCkKKyAgICB2b2lkIGZsdXNoQ2hhbmdlcyhi
b29sIHJlY3Vyc2l2ZSA9IHRydWUpOworCitwdWJsaWMgc2xvdHM6CisgICAgLy8gd2UgbmVlZCB0
byBub3RpZnkgdGhlIGNsaWVudCAoYWthIHRoZSBsYXllciBjb21wb3NpdG9yKSB3aGVuIHRoZSBh
bmltYXRpb24gYWN0dWFsbHkgc3RhcnRzCisgICAgdm9pZCBub3RpZnlBbmltYXRpb25TdGFydGVk
KCk7CisKK3B1YmxpYzoKKyAgICBHcmFwaGljc0xheWVyUXQqIG1fbGF5ZXI7CisKKyAgICBRVHJh
bnNmb3JtIG1fYmFzZVRyYW5zZm9tOworICAgIGJvb2wgbV90cmFuc2Zvcm1BbmltYXRpb25SdW5u
aW5nOworICAgIGJvb2wgbV9vcGFjaXR5QW5pbWF0aW9uUnVubmluZzsKKworICAgIHN0cnVjdCBD
b250ZW50RGF0YSB7CisgICAgICAgIFFQaXhtYXAgcGl4bWFwOworICAgICAgICBRUmVnaW9uIHJl
Z2lvblRvVXBkYXRlOworICAgICAgICBib29sIHVwZGF0ZUFsbDsKKyAgICAgICAgUUNvbG9yIGNv
bnRlbnRzQmFja2dyb3VuZENvbG9yOworICAgICAgICBRQ29sb3IgYmFja2dyb3VuZENvbG9yOwor
ICAgICAgICBTdGF0aWNDb250ZW50VHlwZSBjb250ZW50VHlwZTsKKyAgICAgICAgZmxvYXQgb3Bh
Y2l0eTsKKyAgICAgICAgQ29udGVudERhdGEoKQorICAgICAgICAgICAgICAgIDogdXBkYXRlQWxs
KGZhbHNlKQorICAgICAgICAgICAgICAgICwgY29udGVudFR5cGUoSFRNTENvbnRlbnRUeXBlKQor
ICAgICAgICAgICAgICAgICwgb3BhY2l0eSgxLmYpCisgICAgICAgIHsKKyAgICAgICAgfQorCisg
ICAgfTsKKworICAgIENvbnRlbnREYXRhIG1fcGVuZGluZ0NvbnRlbnQ7CisgICAgQ29udGVudERh
dGEgbV9jdXJyZW50Q29udGVudDsKKworICAgIGludCBtX2NoYW5nZU1hc2s7CisKKyAgICBRU2l6
ZUYgbV9zaXplOworICAgIFFMaXN0PFFXZWFrUG9pbnRlcjxRQWJzdHJhY3RBbmltYXRpb24+ID4g
bV9hbmltYXRpb25zOworICAgIFFUaW1lciBtX3N1c3BlbmRUaW1lcjsKKworICAgIHN0cnVjdCBT
dGF0ZSB7CisgICAgICAgIEdyYXBoaWNzTGF5ZXIqIG1hc2tMYXllcjsKKyAgICAgICAgRmxvYXRQ
b2ludCBwb3M7CisgICAgICAgIEZsb2F0UG9pbnQzRCBhbmNob3JQb2ludDsKKyAgICAgICAgRmxv
YXRTaXplIHNpemU7CisgICAgICAgIFRyYW5zZm9ybWF0aW9uTWF0cml4IHRyYW5zZm9ybTsKKyAg
ICAgICAgVHJhbnNmb3JtYXRpb25NYXRyaXggY2hpbGRyZW5UcmFuc2Zvcm07CisgICAgICAgIENv
bG9yIGJhY2tncm91bmRDb2xvcjsKKyAgICAgICAgQ29sb3IgY3VycmVudENvbG9yOworICAgICAg
ICBHcmFwaGljc0xheWVyOjpDb21wb3NpdGluZ0Nvb3JkaW5hdGVzT3JpZW50YXRpb24gZ2VvT3Jp
ZW50YXRpb247CisgICAgICAgIEdyYXBoaWNzTGF5ZXI6OkNvbXBvc2l0aW5nQ29vcmRpbmF0ZXNP
cmllbnRhdGlvbiBjb250ZW50c09yaWVudGF0aW9uOworICAgICAgICBmbG9hdCBvcGFjaXR5Owor
ICAgICAgICBRUmVjdCBjb250ZW50c1JlY3Q7CisKKyAgICAgICAgYm9vbCBwcmVzZXJ2ZXMzRDog
MTsKKyAgICAgICAgYm9vbCBtYXNrc1RvQm91bmRzOiAxOworICAgICAgICBib29sIGRyYXdzQ29u
dGVudDogMTsKKyAgICAgICAgYm9vbCBjb250ZW50c09wYXF1ZTogMTsKKyAgICAgICAgYm9vbCBi
YWNrZmFjZVZpc2liaWxpdHk6IDE7CisgICAgICAgIGJvb2wgZGlzdHJpYnV0ZU9wYWNpdHk6IDE7
CisgICAgICAgIGJvb2wgYWxpZ246IDI7CisgICAgICAgIFN0YXRlKCk6IG1hc2tMYXllcigwKSwg
b3BhY2l0eSgxKSwgcHJlc2VydmVzM0QoZmFsc2UpLCBtYXNrc1RvQm91bmRzKGZhbHNlKSwKKyAg
ICAgICAgICAgICAgICAgIGRyYXdzQ29udGVudChmYWxzZSksIGNvbnRlbnRzT3BhcXVlKGZhbHNl
KSwgYmFja2ZhY2VWaXNpYmlsaXR5KGZhbHNlKSwKKyAgICAgICAgICAgICAgICAgIGRpc3RyaWJ1
dGVPcGFjaXR5KGZhbHNlKQorICAgICAgICB7CisgICAgICAgIH0KKyAgICB9IG1fc3RhdGU7Cit9
OworCitHcmFwaGljc0xheWVyUXRJbXBsOjpHcmFwaGljc0xheWVyUXRJbXBsKEdyYXBoaWNzTGF5
ZXJRdCogbmV3TGF5ZXIpCisgICAgOiBRR3JhcGhpY3NPYmplY3QoMCkKKyAgICAsIG1fbGF5ZXIo
bmV3TGF5ZXIpCisgICAgLCBtX3RyYW5zZm9ybUFuaW1hdGlvblJ1bm5pbmcoZmFsc2UpCisgICAg
LCBtX2NoYW5nZU1hc2soTm9DaGFuZ2VzKQoreworICAgIC8vIGJldHRlciB0byBjYWxjdWxhdGUg
dGhlIGV4cG9zZWQgcmVjdCBpbiBRR3JhcGhpY3NWaWV3IHRoYW4gb3Zlci1yZW5kZXIgaW4gV2Vi
Q29yZQorICAgIC8vIEZJWE1FOiB0ZXN0IGRpZmZlcmVudCBhcHByb2FjaGVzCisgICAgc2V0Rmxh
ZyhRR3JhcGhpY3NJdGVtOjpJdGVtVXNlc0V4dGVuZGVkU3R5bGVPcHRpb24sIHRydWUpOworCisg
ICAgLy8gd2UgdXNlIGdyYXBoaWNzLXZpZXcgZm9yIGNvbXBvc2l0aW5nLCBub3QgZm9yIGludGVy
YWN0aXZpdHkKKyAgICBzZXRBY2NlcHRlZE1vdXNlQnV0dG9ucyhRdDo6Tm9CdXR0b24pOworICAg
IHNldEVuYWJsZWQoZmFsc2UpOworCisgICAgLy8gd2UnbGwgc2V0IHRoZSBjYWNoZSB3aGVuIHdl
IGtub3cgd2hhdCdzIGdvaW5nIG9uCisgICAgc2V0Q2FjaGVNb2RlKE5vQ2FjaGUpOworfQorCitH
cmFwaGljc0xheWVyUXRJbXBsOjp+R3JhcGhpY3NMYXllclF0SW1wbCgpCit7CisgICAgLy8gdGhl
IGNvbXBvc2l0b3IgbWFuYWdlcyBpdGVtIGxpZmVjeWNsZSAtIHdlIGRvbid0IHdhbnQgdGhlIGdy
YXBoaWNzLXZpZXcKKyAgICAvLyBzeXN0ZW0gdG8gYXV0b21hdGljYWxseSBkZWxldGUgb3VyIGl0
ZW1zCisKKyAgICBjb25zdCBRTGlzdDxRR3JhcGhpY3NJdGVtKj4gY2hpbGRyZW4gPSBjaGlsZEl0
ZW1zKCk7CisgICAgZm9yIChRTGlzdDxRR3JhcGhpY3NJdGVtKj46OmNvbnN0X2l0ZXJhdG9yIGl0
ID0gY2hpbGRyZW4uYmVnaW4oKTsgaXQgIT0gY2hpbGRyZW4uZW5kKCk7ICsraXQpIHsKKyAgICAg
ICAgaWYgKFFHcmFwaGljc0l0ZW0qIGl0ZW0gPSAqaXQpIHsKKyAgICAgICAgICAgIGlmIChzY2Vu
ZSgpKQorICAgICAgICAgICAgICAgIHNjZW5lKCktPnJlbW92ZUl0ZW0oaXRlbSk7CisgICAgICAg
ICAgICBpdGVtLT5zZXRQYXJlbnRJdGVtKDApOworICAgICAgICB9CisgICAgfQorICAgIAorICAg
IC8vIHdlIGRvLCBob3dldmVyLCBvd24gdGhlIGFuaW1hdGlvbnMuLi4KKyAgICBmb3IgKFFMaXN0
PFFXZWFrUG9pbnRlcjxRQWJzdHJhY3RBbmltYXRpb24+ID46Oml0ZXJhdG9yIGl0ID0gbV9hbmlt
YXRpb25zLmJlZ2luKCk7IGl0ICE9IG1fYW5pbWF0aW9ucy5lbmQoKTsgKytpdCkKKyAgICAgICAg
aWYgKFFBYnN0cmFjdEFuaW1hdGlvbiogYW5pbSA9IGl0LT5kYXRhKCkpCisgICAgICAgICAgICBk
ZWxldGUgYW5pbTsKK30KKwordm9pZCBHcmFwaGljc0xheWVyUXRJbXBsOjpzZXRCYXNlVHJhbnNm
b3JtKGNvbnN0IFFUcmFuc2Zvcm0mIHRyYW5zZm9ybSkKK3sKKyAgICBpZiAoIW1fbGF5ZXIpCisg
ICAgICAgIHJldHVybjsKKyAgICAvLyB3ZWJraXQgaGFzIHJlbGF0aXZlLXRvLXNpemUgb3JpZ2lu
UG9pbnQsIGdyYXBoaWNzLXZpZXcgaGFzIGEgcGl4ZWwgb3JpZ2luUG9pbnQKKyAgICAvLyBoZXJl
IHdlIGNvbnZlcnQKKyAgICBRUG9pbnRGIG9yaWdpblRyYW5zbGF0ZSgKKyAgICAgICAgICAgIG1f
bGF5ZXItPmFuY2hvclBvaW50KCkueCgpICogbV9sYXllci0+c2l6ZSgpLndpZHRoKCksIG1fbGF5
ZXItPmFuY2hvclBvaW50KCkueSgpICogbV9sYXllci0+c2l6ZSgpLmhlaWdodCgpKTsKKworICAg
IHJlc2V0VHJhbnNmb3JtKCk7CisKKyAgICAvLyB3ZSBoYXZlIHRvIG1hbmFnZSB0aGlzIG91cnNl
bHZlcyBiZWNhdXNlIFFHcmFwaGljc1ZpZXcncyB0cmFuc2Zvcm1PcmlnaW4gaXMgaW5jb21wbGV0
ZQorICAgIHRyYW5zbGF0ZShvcmlnaW5UcmFuc2xhdGUueCgpLCBvcmlnaW5UcmFuc2xhdGUueSgp
KTsKKyAgICBzZXRUcmFuc2Zvcm0odHJhbnNmb3JtLCB0cnVlKTsKKyAgICB0cmFuc2xhdGUoLW9y
aWdpblRyYW5zbGF0ZS54KCksIC1vcmlnaW5UcmFuc2xhdGUueSgpKTsKKyAgICBtX2Jhc2VUcmFu
c2ZvbSA9IHRyYW5zZm9ybTsKK30KKworUVBhaW50ZXJQYXRoIEdyYXBoaWNzTGF5ZXJRdEltcGw6
Om9wYXF1ZUFyZWEoKSBjb25zdAoreworICAgIFFQYWludGVyUGF0aCBwYWludGVyUGF0aDsKKyAg
ICAvLyB3ZSB0cnkgb3V0IGJlc3QgdG8gcmV0dXJuIHRoZSBvcGFxdWUgYXJlYSwgbWF5YmUgaXQg
d2lsbCBoZWxwIGdyYXBoaWNzLXZpZXcgcmVuZGVyIGxlc3MgaXRlbXMKKyAgICBpZiAobV9jdXJy
ZW50Q29udGVudC5iYWNrZ3JvdW5kQ29sb3IuaXNWYWxpZCgpICYmIG1fY3VycmVudENvbnRlbnQu
YmFja2dyb3VuZENvbG9yLmFscGhhKCkgPT0gMHhmZikKKyAgICAgICAgcGFpbnRlclBhdGguYWRk
UmVjdChib3VuZGluZ1JlY3QoKSk7CisgICAgZWxzZSB7CisgICAgICAgIGlmIChtX3N0YXRlLmNv
bnRlbnRzT3BhcXVlCisgICAgICAgICAgICB8fCAobV9jdXJyZW50Q29udGVudC5jb250ZW50VHlw
ZSA9PSBDb2xvckNvbnRlbnRUeXBlICYmIG1fY3VycmVudENvbnRlbnQuY29udGVudHNCYWNrZ3Jv
dW5kQ29sb3IuYWxwaGEoKSA9PSAweGZmKQorICAgICAgICAgICAgfHwgKG1fY3VycmVudENvbnRl
bnQuY29udGVudFR5cGUgPT0gUGl4bWFwQ29udGVudFR5cGUgJiYgIW1fY3VycmVudENvbnRlbnQu
cGl4bWFwLmhhc0FscGhhKCkpKSB7CisKKyAgICAgICAgICAgIHBhaW50ZXJQYXRoLmFkZFJlY3Qo
bV9zdGF0ZS5jb250ZW50c1JlY3QpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBwYWlu
dGVyUGF0aDsKK30KKworUVJlY3RGIEdyYXBoaWNzTGF5ZXJRdEltcGw6OmJvdW5kaW5nUmVjdCgp
IGNvbnN0Cit7CisgICAgcmV0dXJuIFFSZWN0RihRUG9pbnRGKDAsIDApLCBRU2l6ZUYobV9zaXpl
KSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllclF0SW1wbDo6cGFpbnQoUVBhaW50ZXIqIHBhaW50
ZXIsIGNvbnN0IFFTdHlsZU9wdGlvbkdyYXBoaWNzSXRlbSogb3B0aW9uLCBRV2lkZ2V0KiB3aWRn
ZXQpCit7CisgICAgaWYgKG1fc3RhdGUubWFza0xheWVyICYmIG1fc3RhdGUubWFza0xheWVyLT5w
bGF0Zm9ybUxheWVyKCkpIHsKKyAgICAgICAgLy8gRklYTUU6IHNlZSBpZiB0aGlzIGlzIGJldHRl
ciBkb25lIHNvbWV3aGVyZSBlbHNlCisgICAgICAgIEdyYXBoaWNzTGF5ZXJRdEltcGwqIG90aGVy
TWFzayA9IHN0YXRpY19jYXN0PEdyYXBoaWNzTGF5ZXJRdEltcGwqPihtX3N0YXRlLm1hc2tMYXll
ci0+cGxhdGZvcm1MYXllcigpKTsKKyAgICAgICAgb3RoZXJNYXNrLT5mbHVzaENoYW5nZXModHJ1
ZSk7CisgICAgICAgIAorICAgICAgICAvLyBDU1MzIG1hc2sgYW5kIFFHcmFwaGljc09wYWNpdHlF
ZmZlY3QgYXJlIHRoZSBzYW1lIHRoaW5nISB3ZSBqdXN0IG5lZWQgdG8gY29udmVydC4uLgorICAg
ICAgICAvLyBUaGUgY29udmVyc2lvbiBpcyBhcyBmYXN0IGFzIHdlIGNhbiBtYWtlIGl0IC0gd2Ug
cmVuZGVyIHRoZSBsYXllciBvbmNlIGFuZCBzZW5kIGl0IHRvIHRoZSBRR3JhcGhpY3NPcGFjaXR5
RWZmZWN0CisgICAgICAgIGlmICghZ3JhcGhpY3NFZmZlY3QoKSkgeworICAgICAgICAgICAgUVBp
eG1hcCBtYXNrKFFTaXplKG1fc3RhdGUubWFza0xheWVyLT5zaXplKCkud2lkdGgoKSwgbV9zdGF0
ZS5tYXNrTGF5ZXItPnNpemUoKS5oZWlnaHQoKSkpOworICAgICAgICAgICAgbWFzay5maWxsKFF0
Ojp0cmFuc3BhcmVudCk7CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUVBhaW50ZXIg
cCgmbWFzayk7CisgICAgICAgICAgICAgICAgcC5zZXRSZW5kZXJIaW50cyhwYWludGVyLT5yZW5k
ZXJIaW50cygpLCB0cnVlKTsKKyAgICAgICAgICAgICAgICBwLnNldENvbXBvc2l0aW9uTW9kZShR
UGFpbnRlcjo6Q29tcG9zaXRpb25Nb2RlX1NvdXJjZSk7CisgICAgICAgICAgICAgICAgc3RhdGlj
X2Nhc3Q8R3JhcGhpY3NMYXllclF0SW1wbCo+KG1fc3RhdGUubWFza0xheWVyLT5wbGF0Zm9ybUxh
eWVyKCkpLT5kcmF3Q29udGVudHMoJnAsIG9wdGlvbi0+ZXhwb3NlZFJlY3QsIHRydWUpOworICAg
ICAgICAgICAgfQorICAgICAgICAgICAgUUdyYXBoaWNzT3BhY2l0eUVmZmVjdCogb3BhY2l0eUVm
ZmVjdCA9IG5ldyBRR3JhcGhpY3NPcGFjaXR5RWZmZWN0KHRoaXMpOworICAgICAgICAgICAgb3Bh
Y2l0eUVmZmVjdC0+c2V0T3BhY2l0eSgxKTsKKyAgICAgICAgICAgIG9wYWNpdHlFZmZlY3QtPnNl
dE9wYWNpdHlNYXNrKFFCcnVzaChtYXNrKSk7CisgICAgICAgICAgICBzZXRHcmFwaGljc0VmZmVj
dChvcGFjaXR5RWZmZWN0KTsKKyAgICAgICAgfQorICAgIH0KKyAgICBkcmF3Q29udGVudHMocGFp
bnRlciwgb3B0aW9uLT5leHBvc2VkUmVjdCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllclF0SW1w
bDo6ZHJhd0NvbnRlbnRzKFFQYWludGVyKiBwYWludGVyLCBjb25zdCBRUmVjdEYmIHIsIGJvb2wg
bWFzaykKK3sKKyAgICBRUmVjdCByZWN0ID0gci50b0FsaWduZWRSZWN0KCk7CisgICAgCisgICAg
aWYgKG1fY3VycmVudENvbnRlbnQuY29udGVudFR5cGUgIT0gSFRNTENvbnRlbnRUeXBlICYmICFt
X3N0YXRlLmNvbnRlbnRzUmVjdC5pc0VtcHR5KCkpCisgICAgICAgIHJlY3QgPSByZWN0LmludGVy
c2VjdGVkKG1fc3RhdGUuY29udGVudHNSZWN0KTsKKworICAgIGlmIChtX2N1cnJlbnRDb250ZW50
LmJhY2tncm91bmRDb2xvci5pc1ZhbGlkKCkpCisgICAgICAgIHBhaW50ZXItPmZpbGxSZWN0KHIs
IFFDb2xvcihtX2N1cnJlbnRDb250ZW50LmJhY2tncm91bmRDb2xvcikpOworCisgICAgaWYgKCFy
ZWN0LmlzRW1wdHkoKSkgeworICAgICAgICBzd2l0Y2ggKG1fY3VycmVudENvbnRlbnQuY29udGVu
dFR5cGUpIHsKKyAgICAgICAgY2FzZSBQaXhtYXBDb250ZW50VHlwZToKKyAgICAgICAgICAgIC8v
IHdlIGhhdmUgdG8gc2NhbGUgdGhlIGltYWdlIHRvIHRoZSBjb250ZW50c1JlY3QKKyAgICAgICAg
ICAgIC8vIEZJWE1FOiBhIGJldHRlciB3YXkgd291bGQgcHJvYmFibHkgYmUgZHJhd1BpeG1hcCB3
aXRoIGEgc3JjL3RhcmdldCByZWN0CisgICAgICAgICAgICBwYWludGVyLT5kcmF3UGl4bWFwKHJl
Y3QudG9wTGVmdCgpLCBtX2N1cnJlbnRDb250ZW50LnBpeG1hcC5zY2FsZWQobV9zdGF0ZS5jb250
ZW50c1JlY3Quc2l6ZSgpKSwgcik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBD
b2xvckNvbnRlbnRUeXBlOgorICAgICAgICAgICAgcGFpbnRlci0+ZmlsbFJlY3QocmVjdCwgbV9j
dXJyZW50Q29udGVudC5jb250ZW50c0JhY2tncm91bmRDb2xvcik7CisgICAgICAgICAgICBicmVh
azsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGlmIChtX3N0YXRlLmRyYXdzQ29udGVu
dCkgeworICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgdGhlICJleHBlbnNpdmUiIGJpdC4gd2Ug
dHJ5IHRvIG1pbmltaXplIGNhbGxzIHRvIHRoaXMKKyAgICAgICAgICAgICAgICAvLyBuZWNrIG9m
IHRoZSB3b29kcyBieSBwcm9wZXIgY2FjaGluZworICAgICAgICAgICAgICAgIEdyYXBoaWNzQ29u
dGV4dCBnYyhwYWludGVyKTsKKyAgICAgICAgICAgICAgICBtX2xheWVyLT5wYWludEdyYXBoaWNz
TGF5ZXJDb250ZW50cyhnYywgcmVjdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVh
azsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBHcmFwaGljc0xheWVyUXRJbXBsOjpub3Rp
ZnlDaGFuZ2UoQ2hhbmdlTWFzayBjaGFuZ2VNYXNrKQoreworICAgIGlmICghdGhpcykKKyAgICAg
ICAgcmV0dXJuOworCisgICAgbV9jaGFuZ2VNYXNrID0gc3RhdGljX2Nhc3Q8Q2hhbmdlTWFzaz4o
c3RhdGljX2Nhc3Q8aW50PihtX2NoYW5nZU1hc2spIHwgc3RhdGljX2Nhc3Q8aW50PihjaGFuZ2VN
YXNrKSk7CisKKyAgICBpZiAobV9sYXllci0+Y2xpZW50KCkpCisgICAgICAgIG1fbGF5ZXItPmNs
aWVudCgpLT5ub3RpZnlTeW5jUmVxdWlyZWQobV9sYXllcik7Cit9CisKK3ZvaWQgR3JhcGhpY3NM
YXllclF0SW1wbDo6Zmx1c2hDaGFuZ2VzKGJvb2wgcmVjdXJzaXZlKQoreworICAgIC8vIHRoaXMg
aXMgdGhlIGJ1bGsgb2YgdGhlIHdvcmsuIHVuZGVyc3RhbmRpbmcgd2hhdCB0aGUgY29tcG9zaXRv
ciBpcyB0cnlpbmcgdG8gYWNoaWV2ZSwKKyAgICAvLyB3aGF0IGdyYXBoaWNzLXZpZXcgY2FuIGRv
LCBhbmQgdHJ5aW5nIHRvIGZpbmQgYSBzYW5lIGNvbW1vbi1ncm91bmRzCisgICAgaWYgKCFtX2xh
eWVyIHx8IG1fY2hhbmdlTWFzayA9PSBOb0NoYW5nZXMpCisgICAgICAgIGdvdG8gYWZ0ZXJMYXll
ckNoYW5nZXM7CisKKyAgICBpZiAobV9jdXJyZW50Q29udGVudC5jb250ZW50VHlwZSA9PSBIVE1M
Q29udGVudFR5cGUgJiYgKG1fY2hhbmdlTWFzayAmIFBhcmVudENoYW5nZSkpIHsKKyAgICAgICAg
Ly8gdGhlIFdlYkNvcmUgY29tcG9zaXRvciBtYW5hZ2VzIGl0ZW0gb3duZXJzaGlwLiBXZSBoYXZl
IHRvIG1ha2Ugc3VyZQorICAgICAgICAvLyBncmFwaGljcy12aWV3IGRvZXNuJ3QgdHJ5IHRvIHNu
YXRjaCB0aGF0IG93bmVyc2hpcC4uLgorICAgICAgICBpZiAoIW1fbGF5ZXItPnBhcmVudCgpICYm
ICFwYXJlbnRJdGVtKCkpCisgICAgICAgICAgICBzZXRQYXJlbnRJdGVtKDApOworICAgICAgICBl
bHNlIGlmIChtX2xheWVyICYmIG1fbGF5ZXItPnBhcmVudCgpICYmIG1fbGF5ZXItPnBhcmVudCgp
LT5uYXRpdmVMYXllcigpICE9IHBhcmVudEl0ZW0oKSkKKyAgICAgICAgICAgIHNldFBhcmVudEl0
ZW0obV9sYXllci0+cGFyZW50KCktPm5hdGl2ZUxheWVyKCkpOworICAgIH0KKworICAgIGlmICht
X2NoYW5nZU1hc2sgJiBDaGlsZHJlbkNoYW5nZSkgeworICAgICAgICAvLyB3ZSBiYXNpY2FsbHkg
ZG8gYW4gWE9SIG9wZXJhdGlvbiBvbiB0aGUgbGlzdCBvZiBjdXJyZW50IGNoaWxkcmVuCisgICAg
ICAgIC8vIGFuZCB0aGUgbGlzdCBvZiB3YW50ZWQgY2hpbGRyZW4sIGFuZCByZW1vdmUvYWRkCisg
ICAgICAgIFFTZXQ8UUdyYXBoaWNzSXRlbSo+IG5ld0NoaWxkcmVuOworICAgICAgICBjb25zdCBW
ZWN0b3I8R3JhcGhpY3NMYXllcio+IG5ld0NoaWxkcmVuVmVjdG9yID0gKG1fbGF5ZXItPmNoaWxk
cmVuKCkpOworICAgICAgICBuZXdDaGlsZHJlbi5yZXNlcnZlKG5ld0NoaWxkcmVuVmVjdG9yLnNp
emUoKSk7CisKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuZXdDaGlsZHJlblZlY3Rv
ci5zaXplKCk7ICsraSkKKyAgICAgICAgICAgIG5ld0NoaWxkcmVuLmluc2VydChuZXdDaGlsZHJl
blZlY3RvcltpXS0+cGxhdGZvcm1MYXllcigpKTsKKworICAgICAgICBjb25zdCBRU2V0PFFHcmFw
aGljc0l0ZW0qPiBjdXJyZW50Q2hpbGRyZW4gPSBjaGlsZEl0ZW1zKCkudG9TZXQoKTsKKyAgICAg
ICAgY29uc3QgUVNldDxRR3JhcGhpY3NJdGVtKj4gY2hpbGRyZW5Ub0FkZCA9IG5ld0NoaWxkcmVu
IC0gY3VycmVudENoaWxkcmVuOworICAgICAgICBjb25zdCBRU2V0PFFHcmFwaGljc0l0ZW0qPiBj
aGlsZHJlblRvUmVtb3ZlID0gY3VycmVudENoaWxkcmVuIC0gbmV3Q2hpbGRyZW47CisgICAgICAg
IGZvciAoUVNldDxRR3JhcGhpY3NJdGVtKj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gY2hpbGRyZW5U
b0FkZC5iZWdpbigpOyBpdCAhPSBjaGlsZHJlblRvQWRkLmVuZCgpOyArK2l0KSB7CisgICAgICAg
ICAgICAgaWYgKFFHcmFwaGljc0l0ZW0qIHcgPSAqaXQpCisgICAgICAgICAgICAgICAgdy0+c2V0
UGFyZW50SXRlbSh0aGlzKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKFFTZXQ8UUdyYXBoaWNz
SXRlbSo+Ojpjb25zdF9pdGVyYXRvciBpdCA9IGNoaWxkcmVuVG9SZW1vdmUuYmVnaW4oKTsgaXQg
IT0gY2hpbGRyZW5Ub1JlbW92ZS5lbmQoKTsgKytpdCkgeworICAgICAgICAgICAgIGlmIChRR3Jh
cGhpY3NJdGVtKiB3ID0gKml0KQorICAgICAgICAgICAgICAgIHctPnNldFBhcmVudEl0ZW0oMCk7
CisgICAgICAgIH0KKworICAgICAgICAvLyBjaGlsZHJlbiBhcmUgb3JkZXJlZCBieSB6LXZhbHVl
LCBsZXQgZ3JhcGhpY3MtdmlldyBrbm93LgorICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8
IG5ld0NoaWxkcmVuVmVjdG9yLnNpemUoKTsgKytpKQorICAgICAgICAgICAgaWYgKG5ld0NoaWxk
cmVuVmVjdG9yW2ldLT5wbGF0Zm9ybUxheWVyKCkpCisgICAgICAgICAgICAgICAgbmV3Q2hpbGRy
ZW5WZWN0b3JbaV0tPnBsYXRmb3JtTGF5ZXIoKS0+c2V0WlZhbHVlKGkpOworICAgIH0KKworICAg
IGlmIChtX2NoYW5nZU1hc2sgJiBNYXNrTGF5ZXJDaGFuZ2UpIHsKKyAgICAgICAgLy8gd2UgY2Fu
J3QgcGFpbnQgaGVyZSwgYmVjYXVzZSB3ZSBkb24ndCBrbm93IGlmIHRoZSBtYXNrIGxheWVyCisg
ICAgICAgIC8vIGl0c2VsZiBpcyByZWFkeS4uLiB3ZSdsbCBoYXZlIHRvIHdhaXQgdGlsbCB0aGlz
IGxheWVyIHRyaWVzIHRvIHBhaW50CisgICAgICAgIHNldEdyYXBoaWNzRWZmZWN0KDApOworICAg
ICAgICBpZiAobV9sYXllci0+bWFza0xheWVyKCkpCisgICAgICAgICAgICBzZXRGbGFnKEl0ZW1D
bGlwc0NoaWxkcmVuVG9TaGFwZSwgdHJ1ZSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHNl
dEZsYWcoSXRlbUNsaXBzQ2hpbGRyZW5Ub1NoYXBlLCBtX2xheWVyLT5tYXNrc1RvQm91bmRzKCkp
OworICAgICAgICB1cGRhdGUoKTsKKyAgICB9CisKKyAgICBpZiAoKG1fY2hhbmdlTWFzayAmIFBv
c2l0aW9uQ2hhbmdlKSAmJiAobV9sYXllci0+cG9zaXRpb24oKSAhPSBtX3N0YXRlLnBvcykpCisg
ICAgICAgIHNldFBvcyhtX2xheWVyLT5wb3NpdGlvbigpLngoKSwgbV9sYXllci0+cG9zaXRpb24o
KS55KCkpOworCisgICAgaWYgKG1fY2hhbmdlTWFzayAmIFNpemVDaGFuZ2UpIHsKKyAgICAgICAg
aWYgKG1fbGF5ZXItPnNpemUoKSAhPSBtX3N0YXRlLnNpemUpIHsKKyAgICAgICAgICAgIHByZXBh
cmVHZW9tZXRyeUNoYW5nZSgpOworICAgICAgICAgICAgbV9zaXplID0gUVNpemVGKG1fbGF5ZXIt
PnNpemUoKS53aWR0aCgpLCBtX2xheWVyLT5zaXplKCkuaGVpZ2h0KCkpOworICAgICAgICB9Cisg
ICAgfQorCisgICAgaWYgKG1fY2hhbmdlTWFzayAmIChUcmFuc2Zvcm1DaGFuZ2UgfCBBbmNob3JQ
b2ludENoYW5nZSB8IFNpemVDaGFuZ2UpKSB7CisgICAgICAgIC8vIHNpbmNlIHdlIGNvbnZlcnQg
YSBwZXJjZW50YWdlLWJhc2VkIG9yaWdpbi1wb2ludCB0byBhIHBpeGVsLWJhc2VkIG9uZSwKKyAg
ICAgICAgLy8gdGhlIGFuY2hvci1wb2ludCwgdHJhbnNmb3JtIGFuZCBzaXplIGZyb20gV2ViQ29y
ZSBhbGwgYWZmZWN0IHRoZSBvbmUKKyAgICAgICAgLy8gdGhhdCB3ZSBnaXZlIFF0CisgICAgICAg
IGlmIChtX3N0YXRlLnRyYW5zZm9ybSAhPSBtX2xheWVyLT50cmFuc2Zvcm0oKSB8fCBtX3N0YXRl
LmFuY2hvclBvaW50ICE9IG1fbGF5ZXItPmFuY2hvclBvaW50KCkgfHwgbV9zdGF0ZS5zaXplICE9
IG1fbGF5ZXItPnNpemUoKSkKKyAgICAgICAgICAgIHNldEJhc2VUcmFuc2Zvcm0oUVRyYW5zZm9y
bShtX2xheWVyLT50cmFuc2Zvcm0oKSkpOworICAgIH0KKworICAgIGlmIChtX2NoYW5nZU1hc2sg
JiAoQ29udGVudENoYW5nZSB8IERyYXdzQ29udGVudENoYW5nZSkpIHsKKyAgICAgICAgc3dpdGNo
IChtX3BlbmRpbmdDb250ZW50LmNvbnRlbnRUeXBlKSB7CisgICAgICAgIGNhc2UgUGl4bWFwQ29u
dGVudFR5cGU6CisgICAgICAgICAgICAvLyB3ZSBuZWVkIGNhY2hlIGV2ZW4gZm9yIGltYWdlcywg
YmVjYXVzZSB0aGV5IG5lZWQgdG8gYmUgcmVzaXplZAorICAgICAgICAgICAgLy8gdG8gdGhlIGNv
bnRlbnRzIHJlY3QuIG1heWJlIHRoaXMgY2FuIGJlIG9wdGltaXplZCB0aG91Z2gKKyAgICAgICAg
ICAgIHNldENhY2hlTW9kZShtX3RyYW5zZm9ybUFuaW1hdGlvblJ1bm5pbmcgPyBJdGVtQ29vcmRp
bmF0ZUNhY2hlIDogRGV2aWNlQ29vcmRpbmF0ZUNhY2hlKTsKKyAgICAgICAgICAgIHVwZGF0ZSgp
OworICAgICAgICAgICAgc2V0RmxhZyhJdGVtSGFzTm9Db250ZW50cywgZmFsc2UpOworICAgICAg
ICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBDb2xvckNvbnRlbnRUeXBlOgorICAgICAgICAg
ICAgLy8gbm8gcG9pbnQgaW4gY2FjaGluZyBhIHNvbGlkLWNvbG9yIHJlY3RhbmdsZQorICAgICAg
ICAgICAgc2V0Q2FjaGVNb2RlKFFHcmFwaGljc0l0ZW06Ok5vQ2FjaGUpOworICAgICAgICAgICAg
aWYgKG1fcGVuZGluZ0NvbnRlbnQuY29udGVudFR5cGUgIT0gbV9jdXJyZW50Q29udGVudC5jb250
ZW50VHlwZSB8fCBtX3BlbmRpbmdDb250ZW50LmNvbnRlbnRzQmFja2dyb3VuZENvbG9yICE9IG1f
Y3VycmVudENvbnRlbnQuY29udGVudHNCYWNrZ3JvdW5kQ29sb3IpCisgICAgICAgICAgICAgICAg
dXBkYXRlKCk7CisgICAgICAgICAgICBtX3N0YXRlLmRyYXdzQ29udGVudCA9IGZhbHNlOworICAg
ICAgICAgICAgc2V0RmxhZyhJdGVtSGFzTm9Db250ZW50cywgZmFsc2UpOworICAgICAgICAgICAg
YnJlYWs7CisKKyAgICAgICAgY2FzZSBIVE1MQ29udGVudFR5cGU6CisgICAgICAgICAgICBpZiAo
bV9wZW5kaW5nQ29udGVudC5jb250ZW50VHlwZSAhPSBtX2N1cnJlbnRDb250ZW50LmNvbnRlbnRU
eXBlKQorICAgICAgICAgICAgICAgIHVwZGF0ZSgpOworICAgICAgICAgICAgaWYgKCFtX3N0YXRl
LmRyYXdzQ29udGVudCAmJiBtX2xheWVyLT5kcmF3c0NvbnRlbnQoKSkKKyAgICAgICAgICAgICAg
ICB1cGRhdGUoKTsKKyAgICAgICAgICAgIGlmIChtX2xheWVyLT5kcmF3c0NvbnRlbnQoKSkKKyAg
ICAgICAgICAgICAgICBzZXRDYWNoZU1vZGUobV90cmFuc2Zvcm1BbmltYXRpb25SdW5uaW5nID8g
SXRlbUNvb3JkaW5hdGVDYWNoZSA6IERldmljZUNvb3JkaW5hdGVDYWNoZSk7CisgICAgICAgICAg
ICBlbHNlCisgICAgICAgICAgICAgICAgc2V0Q2FjaGVNb2RlKE5vQ2FjaGUpOworCisgICAgICAg
ICAgICBzZXRGbGFnKEl0ZW1IYXNOb0NvbnRlbnRzLCAhbV9sYXllci0+ZHJhd3NDb250ZW50KCkp
OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKG1fY2hh
bmdlTWFzayAmIE9wYWNpdHlDaGFuZ2UpICYmIG1fc3RhdGUub3BhY2l0eSAhPSBtX2xheWVyLT5v
cGFjaXR5KCkpCisgICAgICAgIHNldE9wYWNpdHkobV9sYXllci0+b3BhY2l0eSgpKTsKKworICAg
IGlmIChtX2NoYW5nZU1hc2sgJiBDb250ZW50c1JlY3RDaGFuZ2UpIHsKKyAgICAgICAgY29uc3Qg
UVJlY3QgcmVjdChtX2xheWVyLT5jb250ZW50c1JlY3QoKSk7CisgICAgICAgIGlmIChtX3N0YXRl
LmNvbnRlbnRzUmVjdCAhPSByZWN0KSB7CisgICAgICAgICAgICBtX3N0YXRlLmNvbnRlbnRzUmVj
dCA9IHJlY3Q7CisgICAgICAgICAgICB1cGRhdGUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAg
IGlmICgobV9jaGFuZ2VNYXNrICYgTWFza3NUb0JvdW5kc0NoYW5nZSkKKyAgICAgICAgJiYgbV9z
dGF0ZS5tYXNrc1RvQm91bmRzICE9IG1fbGF5ZXItPm1hc2tzVG9Cb3VuZHMoKSkgeworCisgICAg
ICAgIHNldEZsYWcoUUdyYXBoaWNzSXRlbTo6SXRlbUNsaXBzVG9TaGFwZSwgbV9sYXllci0+bWFz
a3NUb0JvdW5kcygpKTsKKyAgICAgICAgc2V0RmxhZyhRR3JhcGhpY3NJdGVtOjpJdGVtQ2xpcHND
aGlsZHJlblRvU2hhcGUsIG1fbGF5ZXItPm1hc2tzVG9Cb3VuZHMoKSk7CisgICAgfQorCisgICAg
aWYgKChtX2NoYW5nZU1hc2sgJiBDb250ZW50c09wYXF1ZUNoYW5nZSkgJiYgbV9zdGF0ZS5jb250
ZW50c09wYXF1ZSAhPSBtX2xheWVyLT5jb250ZW50c09wYXF1ZSgpKQorICAgICAgICBwcmVwYXJl
R2VvbWV0cnlDaGFuZ2UoKTsKKworICAgIGlmIChtX2NoYW5nZU1hc2sgJiBEaXNwbGF5Q2hhbmdl
KQorICAgICAgICB1cGRhdGUobV9wZW5kaW5nQ29udGVudC5yZWdpb25Ub1VwZGF0ZS5ib3VuZGlu
Z1JlY3QoKSk7CisKKyAgICBpZiAoKG1fY2hhbmdlTWFzayAmIEJhY2tncm91bmRDb2xvckNoYW5n
ZSkgJiYgKG1fcGVuZGluZ0NvbnRlbnQuYmFja2dyb3VuZENvbG9yICE9IG1fY3VycmVudENvbnRl
bnQuYmFja2dyb3VuZENvbG9yKSkKKyAgICAgICAgdXBkYXRlKCk7CisKKyAgICAvLyBGSVhNRTog
dGhlIGZvbGxvd2luZyBmbGFncyBhcmUgY3VycmVudGx5IG5vdCBoYW5kbGVkLCBhcyB0aGV5IGRv
bid0IGhhdmUgYSBjbGVhciB0ZXN0IG9yIGFyZSBpbiBsb3cgcHJpb3JpdHkKKyAgICAvLyBHZW9t
ZXRyeU9yaWVudGF0aW9uQ2hhbmdlLCBDb250ZW50c09yaWVudGF0aW9uQ2hhbmdlLCBCYWNrZmFj
ZVZpc2liaWxpdHlDaGFuZ2UsIENoaWxkcmVuVHJhbnNmb3JtQ2hhbmdlCisKKyAgICBtX3N0YXRl
Lm1hc2tMYXllciA9IG1fbGF5ZXItPm1hc2tMYXllcigpOworICAgIG1fc3RhdGUucG9zID0gbV9s
YXllci0+cG9zaXRpb24oKTsKKyAgICBtX3N0YXRlLmFuY2hvclBvaW50ID0gbV9sYXllci0+YW5j
aG9yUG9pbnQoKTsKKyAgICBtX3N0YXRlLnNpemUgPSBtX2xheWVyLT5zaXplKCk7CisgICAgbV9z
dGF0ZS50cmFuc2Zvcm0gPSBtX2xheWVyLT50cmFuc2Zvcm0oKTsKKyAgICBtX3N0YXRlLmdlb09y
aWVudGF0aW9uID0gbV9sYXllci0+Z2VvbWV0cnlPcmllbnRhdGlvbigpOworICAgIG1fc3RhdGUu
Y29udGVudHNPcmllbnRhdGlvbiA9bV9sYXllci0+Y29udGVudHNPcmllbnRhdGlvbigpOworICAg
IG1fc3RhdGUub3BhY2l0eSA9IG1fbGF5ZXItPm9wYWNpdHkoKTsKKyAgICBtX3N0YXRlLmNvbnRl
bnRzUmVjdCA9IG1fbGF5ZXItPmNvbnRlbnRzUmVjdCgpOworICAgIG1fc3RhdGUucHJlc2VydmVz
M0QgPSBtX2xheWVyLT5wcmVzZXJ2ZXMzRCgpOworICAgIG1fc3RhdGUubWFza3NUb0JvdW5kcyA9
IG1fbGF5ZXItPm1hc2tzVG9Cb3VuZHMoKTsKKyAgICBtX3N0YXRlLmRyYXdzQ29udGVudCA9IG1f
bGF5ZXItPmRyYXdzQ29udGVudCgpOworICAgIG1fc3RhdGUuY29udGVudHNPcGFxdWUgPSBtX2xh
eWVyLT5jb250ZW50c09wYXF1ZSgpOworICAgIG1fc3RhdGUuYmFja2ZhY2VWaXNpYmlsaXR5ID0g
bV9sYXllci0+YmFja2ZhY2VWaXNpYmlsaXR5KCk7CisgICAgbV9jdXJyZW50Q29udGVudC5waXht
YXAgPSBtX3BlbmRpbmdDb250ZW50LnBpeG1hcDsKKyAgICBtX2N1cnJlbnRDb250ZW50LmNvbnRl
bnRUeXBlID0gbV9wZW5kaW5nQ29udGVudC5jb250ZW50VHlwZTsKKyAgICBtX2N1cnJlbnRDb250
ZW50LmJhY2tncm91bmRDb2xvciA9IG1fcGVuZGluZ0NvbnRlbnQuYmFja2dyb3VuZENvbG9yOwor
ICAgIG1fY3VycmVudENvbnRlbnQucmVnaW9uVG9VcGRhdGUgfD0gbV9wZW5kaW5nQ29udGVudC5y
ZWdpb25Ub1VwZGF0ZTsKKyAgICBtX2N1cnJlbnRDb250ZW50LmNvbnRlbnRzQmFja2dyb3VuZENv
bG9yID0gbV9wZW5kaW5nQ29udGVudC5jb250ZW50c0JhY2tncm91bmRDb2xvcjsKKyAgICBtX3Bl
bmRpbmdDb250ZW50LnJlZ2lvblRvVXBkYXRlID0gUVJlZ2lvbigpOworICAgIG1fY2hhbmdlTWFz
ayA9IE5vQ2hhbmdlczsKKworCithZnRlckxheWVyQ2hhbmdlczoKKyAgICBpZiAoIXJlY3Vyc2l2
ZSkKKyAgICAgICAgcmV0dXJuOyAgICAKKworICAgIGNvbnN0IFFMaXN0PFFHcmFwaGljc0l0ZW0q
PiBjaGlsZHJlbiA9IGNoaWxkSXRlbXMoKTsKKworICAgIGZvciAoUUxpc3Q8UUdyYXBoaWNzSXRl
bSo+Ojpjb25zdF9pdGVyYXRvciBpdCA9IGNoaWxkcmVuLmJlZ2luKCk7IGl0ICE9IGNoaWxkcmVu
LmVuZCgpOyArK2l0KSB7CisgICAgICAgIGlmIChRR3JhcGhpY3NJdGVtKiBpdGVtID0gKml0KQor
ICAgICAgICAgICAgaWYgKEdyYXBoaWNzTGF5ZXJRdEltcGwqIGxheWVyID0gcW9iamVjdF9jYXN0
PEdyYXBoaWNzTGF5ZXJRdEltcGwqPihpdGVtLT50b0dyYXBoaWNzT2JqZWN0KCkpKQorICAgICAg
ICAgICAgICAgIGxheWVyLT5mbHVzaENoYW5nZXModHJ1ZSk7CisgICAgfQorfQorCit2b2lkIEdy
YXBoaWNzTGF5ZXJRdEltcGw6Om5vdGlmeUFuaW1hdGlvblN0YXJ0ZWQoKQoreworICAgIC8vIFdl
YkNvcmUgbm90aWZpZXMgamF2YXNjcmlwdCB3aGVuIHRoZSBhbmltYXRpb24gc3RhcnRzCisgICAg
Ly8gaGVyZSB3ZSdyZSBsZXR0aW5nIGl0IGtub3cKKyAgICBtX2xheWVyLT5jbGllbnQoKS0+bm90
aWZ5QW5pbWF0aW9uU3RhcnRlZChtX2xheWVyLCBXVEY6OmN1cnJlbnRUaW1lKCkpOworfQorCitH
cmFwaGljc0xheWVyUXQ6OkdyYXBoaWNzTGF5ZXJRdChHcmFwaGljc0xheWVyQ2xpZW50KiBjbGll
bnQpCisgICAgOiBHcmFwaGljc0xheWVyKGNsaWVudCkKKyAgICAsIG1faW1wbChQYXNzT3duUHRy
PEdyYXBoaWNzTGF5ZXJRdEltcGw+KG5ldyBHcmFwaGljc0xheWVyUXRJbXBsKHRoaXMpKSkKK3sK
K30KKworR3JhcGhpY3NMYXllclF0Ojp+R3JhcGhpY3NMYXllclF0KCkKK3sKK30KKworLy8gdGhp
cyBpcyB0aGUgaG9vayBmb3IgV2ViQ29yZSBjb21wb3NpdG9yIHRvIGtub3cgdGhhdCBRdCBpbXBs
ZW1lbnRzIGNvbXBvc2l0aW5nIHdpdGggR3JhcGhpY3NMYXllclF0CitQYXNzT3duUHRyPEdyYXBo
aWNzTGF5ZXI+IEdyYXBoaWNzTGF5ZXI6OmNyZWF0ZShHcmFwaGljc0xheWVyQ2xpZW50KiBjbGll
bnQpCit7CisgICAgcmV0dXJuIG5ldyBHcmFwaGljc0xheWVyUXQoY2xpZW50KTsKK30KKworLy8g
cmVpbXAgZnJvbSBHcmFwaGljc0xheWVyLmg6IFF0IGlzIHRvcC1kb3duCitHcmFwaGljc0xheWVy
OjpDb21wb3NpdGluZ0Nvb3JkaW5hdGVzT3JpZW50YXRpb24gR3JhcGhpY3NMYXllcjo6Y29tcG9z
aXRpbmdDb29yZGluYXRlc09yaWVudGF0aW9uKCkKK3sKKyAgICByZXR1cm4gQ29tcG9zaXRpbmdD
b29yZGluYXRlc1RvcERvd247Cit9CisKKy8vIHJlaW1wIGZyb20gR3JhcGhpY3NMYXllci5oOiB3
ZSdsbCBuZWVkIHRvIHVwZGF0ZSB0aGUgd2hvbGUgZGlzcGxheSwgYW5kIHdlIGNhbid0IGNvdW50
IG9uIHRoZSBjdXJyZW50IHNpemUgYmVjYXVzZSBpdCBtaWdodCBjaGFuZ2UKK3ZvaWQgR3JhcGhp
Y3NMYXllclF0OjpzZXROZWVkc0Rpc3BsYXkoKQoreworICAgIG1faW1wbC0+bV9wZW5kaW5nQ29u
dGVudC5yZWdpb25Ub1VwZGF0ZSA9IFFSZWdpb24oUVJlY3QoUVBvaW50KDAsIDApLCBRU2l6ZShz
aXplKCkud2lkdGgoKSwgc2l6ZSgpLmhlaWdodCgpKSkpOworICAgIG1faW1wbC0+bm90aWZ5Q2hh
bmdlKEdyYXBoaWNzTGF5ZXJRdEltcGw6OkRpc3BsYXlDaGFuZ2UpOworfQorCisvLyByZWltcCBm
cm9tIEdyYXBoaWNzTGF5ZXIuaAordm9pZCBHcmFwaGljc0xheWVyUXQ6OnNldE5lZWRzRGlzcGxh
eUluUmVjdChjb25zdCBGbG9hdFJlY3QmIHIpCit7CisgICAgbV9pbXBsLT5tX3BlbmRpbmdDb250
ZW50LnJlZ2lvblRvVXBkYXRlfD0gUVJlY3RGKHIpLnRvQWxpZ25lZFJlY3QoKTsKKyAgICBtX2lt
cGwtPm5vdGlmeUNoYW5nZShHcmFwaGljc0xheWVyUXRJbXBsOjpEaXNwbGF5Q2hhbmdlKTsKK30K
KworLy8gcmVpbXAgZnJvbSBHcmFwaGljc0xheWVyLmgKK3ZvaWQgR3JhcGhpY3NMYXllclF0Ojpz
ZXROYW1lKGNvbnN0IFN0cmluZyYgbmFtZSkKK3sKKyAgICBtX2ltcGwtPnNldE9iamVjdE5hbWUo
bmFtZSk7CisgICAgR3JhcGhpY3NMYXllcjo6c2V0TmFtZShuYW1lKTsKK30KKworLy8gcmVpbXAg
ZnJvbSBHcmFwaGljc0xheWVyLmgKK3ZvaWQgR3JhcGhpY3NMYXllclF0OjpzZXRQYXJlbnQoR3Jh
cGhpY3NMYXllciogbGF5ZXIpCit7CisgICAgbV9pbXBsLT5ub3RpZnlDaGFuZ2UoR3JhcGhpY3NM
YXllclF0SW1wbDo6UGFyZW50Q2hhbmdlKTsKKyAgICBHcmFwaGljc0xheWVyOjpzZXRQYXJlbnQo
bGF5ZXIpOworfQorCisvLyByZWltcCBmcm9tIEdyYXBoaWNzTGF5ZXIuaAorYm9vbCBHcmFwaGlj
c0xheWVyUXQ6OnNldENoaWxkcmVuKGNvbnN0IFZlY3RvcjxHcmFwaGljc0xheWVyKj4mIGNoaWxk
cmVuKQoreworICAgIG1faW1wbC0+bm90aWZ5Q2hhbmdlKEdyYXBoaWNzTGF5ZXJRdEltcGw6OkNo
aWxkcmVuQ2hhbmdlKTsKKyAgICByZXR1cm4gR3JhcGhpY3NMYXllcjo6c2V0Q2hpbGRyZW4oY2hp
bGRyZW4pOworfQorCisvLyByZWltcCBmcm9tIEdyYXBoaWNzTGF5ZXIuaAordm9pZCBHcmFwaGlj
c0xheWVyUXQ6OmFkZENoaWxkKEdyYXBoaWNzTGF5ZXIqIGxheWVyKQoreworICAgIG1faW1wbC0+
bm90aWZ5Q2hhbmdlKEdyYXBoaWNzTGF5ZXJRdEltcGw6OkNoaWxkcmVuQ2hhbmdlKTsKKyAgICBH
cmFwaGljc0xheWVyOjphZGRDaGlsZChsYXllcik7Cit9CisKKy8vIHJlaW1wIGZyb20gR3JhcGhp
Y3NMYXllci5oCit2b2lkIEdyYXBoaWNzTGF5ZXJRdDo6YWRkQ2hpbGRBdEluZGV4KEdyYXBoaWNz
TGF5ZXIqIGxheWVyLCBpbnQgaW5kZXgpCit7CisgICAgR3JhcGhpY3NMYXllcjo6YWRkQ2hpbGRB
dEluZGV4KGxheWVyLCBpbmRleCk7CisgICAgbV9pbXBsLT5ub3RpZnlDaGFuZ2UoR3JhcGhpY3NM
YXllclF0SW1wbDo6Q2hpbGRyZW5DaGFuZ2UpOworfQorCisvLyByZWltcCBmcm9tIEdyYXBoaWNz
TGF5ZXIuaAordm9pZCBHcmFwaGljc0xheWVyUXQ6OmFkZENoaWxkQWJvdmUoR3JhcGhpY3NMYXll
ciogbGF5ZXIsIEdyYXBoaWNzTGF5ZXIqIHNpYmxpbmcpCit7CisgICAgIEdyYXBoaWNzTGF5ZXI6
OmFkZENoaWxkQWJvdmUobGF5ZXIsIHNpYmxpbmcpOworICAgICBtX2ltcGwtPm5vdGlmeUNoYW5n
ZShHcmFwaGljc0xheWVyUXRJbXBsOjpDaGlsZHJlbkNoYW5nZSk7Cit9CisKKy8vIHJlaW1wIGZy
b20gR3JhcGhpY3NMYXllci5oCit2b2lkIEdyYXBoaWNzTGF5ZXJRdDo6YWRkQ2hpbGRCZWxvdyhH
cmFwaGljc0xheWVyKiBsYXllciwgR3JhcGhpY3NMYXllciogc2libGluZykKK3sKKworICAgIEdy
YXBoaWNzTGF5ZXI6OmFkZENoaWxkQmVsb3cobGF5ZXIsIHNpYmxpbmcpOworICAgIG1faW1wbC0+
bm90aWZ5Q2hhbmdlKEdyYXBoaWNzTGF5ZXJRdEltcGw6OkNoaWxkcmVuQ2hhbmdlKTsKK30KKwor
Ly8gcmVpbXAgZnJvbSBHcmFwaGljc0xheWVyLmgKK2Jvb2wgR3JhcGhpY3NMYXllclF0OjpyZXBs
YWNlQ2hpbGQoR3JhcGhpY3NMYXllciogb2xkQ2hpbGQsIEdyYXBoaWNzTGF5ZXIqIG5ld0NoaWxk
KQoreworICAgIGlmIChHcmFwaGljc0xheWVyOjpyZXBsYWNlQ2hpbGQob2xkQ2hpbGQsIG5ld0No
aWxkKSkgeworICAgICAgICBtX2ltcGwtPm5vdGlmeUNoYW5nZShHcmFwaGljc0xheWVyUXRJbXBs
OjpDaGlsZHJlbkNoYW5nZSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHJl
dHVybiBmYWxzZTsKK30KKworLy8gcmVpbXAgZnJvbSBHcmFwaGljc0xheWVyLmgKK3ZvaWQgR3Jh
cGhpY3NMYXllclF0OjpyZW1vdmVGcm9tUGFyZW50KCkKK3sKKyAgICBpZiAocGFyZW50KCkpCisg
ICAgICAgIG1faW1wbC0+bm90aWZ5Q2hhbmdlKEdyYXBoaWNzTGF5ZXJRdEltcGw6OlBhcmVudENo
YW5nZSk7CisgICAgR3JhcGhpY3NMYXllcjo6cmVtb3ZlRnJvbVBhcmVudCgpOworfQorCisvLyBy
ZWltcCBmcm9tIEdyYXBoaWNzTGF5ZXIuaAordm9pZCBHcmFwaGljc0xheWVyUXQ6OnNldE1hc2tM
YXllcihHcmFwaGljc0xheWVyKiBsYXllcikKK3sKKyAgICBHcmFwaGljc0xheWVyOjpzZXRNYXNr
TGF5ZXIobGF5ZXIpOworICAgIG1faW1wbC0+bm90aWZ5Q2hhbmdlKEdyYXBoaWNzTGF5ZXJRdElt
cGw6Ok1hc2tMYXllckNoYW5nZSk7Cit9CisKKy8vIHJlaW1wIGZyb20gR3JhcGhpY3NMYXllci5o
Cit2b2lkIEdyYXBoaWNzTGF5ZXJRdDo6c2V0UG9zaXRpb24oY29uc3QgRmxvYXRQb2ludCYgcCkK
K3sKKyAgICBpZiAocG9zaXRpb24oKSAhPSBwKQorICAgICAgIG1faW1wbC0+bm90aWZ5Q2hhbmdl
KEdyYXBoaWNzTGF5ZXJRdEltcGw6OlBvc2l0aW9uQ2hhbmdlKTsKKyAgICBHcmFwaGljc0xheWVy
OjpzZXRQb3NpdGlvbihwKTsKK30KKworLy8gcmVpbXAgZnJvbSBHcmFwaGljc0xheWVyLmgKK3Zv
aWQgR3JhcGhpY3NMYXllclF0OjpzZXRBbmNob3JQb2ludChjb25zdCBGbG9hdFBvaW50M0QmIHAp
Cit7CisgICAgaWYgKGFuY2hvclBvaW50KCkgIT0gcCkKKyAgICAgICAgbV9pbXBsLT5ub3RpZnlD
aGFuZ2UoR3JhcGhpY3NMYXllclF0SW1wbDo6QW5jaG9yUG9pbnRDaGFuZ2UpOworICAgIEdyYXBo
aWNzTGF5ZXI6OnNldEFuY2hvclBvaW50KHApOworfQorCisvLyByZWltcCBmcm9tIEdyYXBoaWNz
TGF5ZXIuaAordm9pZCBHcmFwaGljc0xheWVyUXQ6OnNldFNpemUoY29uc3QgRmxvYXRTaXplJiBz
aXplKQoreworICAgIGlmICh0aGlzLT5zaXplKCkgIT0gc2l6ZSkKKyAgICAgICAgbV9pbXBsLT5u
b3RpZnlDaGFuZ2UoR3JhcGhpY3NMYXllclF0SW1wbDo6U2l6ZUNoYW5nZSk7CisgICAgR3JhcGhp
Y3NMYXllcjo6c2V0U2l6ZShzaXplKTsKK30KKworLy8gcmVpbXAgZnJvbSBHcmFwaGljc0xheWVy
LmgKK3ZvaWQgR3JhcGhpY3NMYXllclF0OjpzZXRUcmFuc2Zvcm0oY29uc3QgVHJhbnNmb3JtYXRp
b25NYXRyaXgmIHQpCit7CisgICAgaWYgKCFtX2ltcGwtPm1fdHJhbnNmb3JtQW5pbWF0aW9uUnVu
bmluZyAmJiB0cmFuc2Zvcm0oKSAhPSB0KQorICAgICAgIG1faW1wbC0+bm90aWZ5Q2hhbmdlKEdy
YXBoaWNzTGF5ZXJRdEltcGw6OlRyYW5zZm9ybUNoYW5nZSk7CisgICAgR3JhcGhpY3NMYXllcjo6
c2V0VHJhbnNmb3JtKHQpOworfQorCisvLyByZWltcCBmcm9tIEdyYXBoaWNzTGF5ZXIuaAordm9p
ZCBHcmFwaGljc0xheWVyUXQ6OnNldENoaWxkcmVuVHJhbnNmb3JtKGNvbnN0IFRyYW5zZm9ybWF0
aW9uTWF0cml4JiB0KQoreworICAgIEdyYXBoaWNzTGF5ZXI6OnNldENoaWxkcmVuVHJhbnNmb3Jt
KHQpOworICAgIG1faW1wbC0+bm90aWZ5Q2hhbmdlKEdyYXBoaWNzTGF5ZXJRdEltcGw6OkNoaWxk
cmVuVHJhbnNmb3JtQ2hhbmdlKTsKK30KKworLy8gcmVpbXAgZnJvbSBHcmFwaGljc0xheWVyLmgK
K3ZvaWQgR3JhcGhpY3NMYXllclF0OjpzZXRQcmVzZXJ2ZXMzRChib29sIGIpCit7CisgICAgaWYg
KGIgIT0gcHJlc2VydmVzM0QoKSk7CisgICAgICAgbV9pbXBsLT5ub3RpZnlDaGFuZ2UoR3JhcGhp
Y3NMYXllclF0SW1wbDo6UHJlc2VydmVzM0RDaGFuZ2UpOworICAgIEdyYXBoaWNzTGF5ZXI6OnNl
dFByZXNlcnZlczNEKGIpOworfQorCisvLyByZWltcCBmcm9tIEdyYXBoaWNzTGF5ZXIuaAordm9p
ZCBHcmFwaGljc0xheWVyUXQ6OnNldE1hc2tzVG9Cb3VuZHMoYm9vbCBiKQoreworICAgIEdyYXBo
aWNzTGF5ZXI6OnNldE1hc2tzVG9Cb3VuZHMoYik7CisgICAgbV9pbXBsLT5ub3RpZnlDaGFuZ2Uo
R3JhcGhpY3NMYXllclF0SW1wbDo6TWFza3NUb0JvdW5kc0NoYW5nZSk7Cit9CisKKy8vIHJlaW1w
IGZyb20gR3JhcGhpY3NMYXllci5oCit2b2lkIEdyYXBoaWNzTGF5ZXJRdDo6c2V0RHJhd3NDb250
ZW50KGJvb2wgYikKK3sKKyAgICBtX2ltcGwtPm5vdGlmeUNoYW5nZShHcmFwaGljc0xheWVyUXRJ
bXBsOjpEcmF3c0NvbnRlbnRDaGFuZ2UpOworICAgIEdyYXBoaWNzTGF5ZXI6OnNldERyYXdzQ29u
dGVudChiKTsKK30KKworLy8gcmVpbXAgZnJvbSBHcmFwaGljc0xheWVyLmgKK3ZvaWQgR3JhcGhp
Y3NMYXllclF0OjpzZXRCYWNrZ3JvdW5kQ29sb3IoY29uc3QgQ29sb3ImIGMpCit7CisgICAgbV9p
bXBsLT5ub3RpZnlDaGFuZ2UoR3JhcGhpY3NMYXllclF0SW1wbDo6QmFja2dyb3VuZENvbG9yQ2hh
bmdlKTsKKyAgICBtX2ltcGwtPm1fcGVuZGluZ0NvbnRlbnQuYmFja2dyb3VuZENvbG9yID0gYzsK
KyAgICBHcmFwaGljc0xheWVyOjpzZXRCYWNrZ3JvdW5kQ29sb3IoYyk7Cit9CisKKy8vIHJlaW1w
IGZyb20gR3JhcGhpY3NMYXllci5oCit2b2lkIEdyYXBoaWNzTGF5ZXJRdDo6Y2xlYXJCYWNrZ3Jv
dW5kQ29sb3IoKQoreworICAgIG1faW1wbC0+bV9wZW5kaW5nQ29udGVudC5iYWNrZ3JvdW5kQ29s
b3IgPSBRQ29sb3IoKTsKKyAgICBtX2ltcGwtPm5vdGlmeUNoYW5nZShHcmFwaGljc0xheWVyUXRJ
bXBsOjpCYWNrZ3JvdW5kQ29sb3JDaGFuZ2UpOworICAgIEdyYXBoaWNzTGF5ZXI6OmNsZWFyQmFj
a2dyb3VuZENvbG9yKCk7Cit9CisKKy8vIHJlaW1wIGZyb20gR3JhcGhpY3NMYXllci5oCit2b2lk
IEdyYXBoaWNzTGF5ZXJRdDo6c2V0Q29udGVudHNPcGFxdWUoYm9vbCBiKQoreworICAgIG1faW1w
bC0+bm90aWZ5Q2hhbmdlKEdyYXBoaWNzTGF5ZXJRdEltcGw6OkNvbnRlbnRzT3BhcXVlQ2hhbmdl
KTsKKyAgICBHcmFwaGljc0xheWVyOjpzZXRDb250ZW50c09wYXF1ZShiKTsKK30KKworLy8gcmVp
bXAgZnJvbSBHcmFwaGljc0xheWVyLmgKK3ZvaWQgR3JhcGhpY3NMYXllclF0OjpzZXRCYWNrZmFj
ZVZpc2liaWxpdHkoYm9vbCBiKQoreworICAgIG1faW1wbC0+bm90aWZ5Q2hhbmdlKEdyYXBoaWNz
TGF5ZXJRdEltcGw6OkJhY2tmYWNlVmlzaWJpbGl0eUNoYW5nZSk7CisgICAgR3JhcGhpY3NMYXll
cjo6c2V0QmFja2ZhY2VWaXNpYmlsaXR5KGIpOworfQorCisvLyByZWltcCBmcm9tIEdyYXBoaWNz
TGF5ZXIuaAordm9pZCBHcmFwaGljc0xheWVyUXQ6OnNldE9wYWNpdHkoZmxvYXQgbykKK3sKKyAg
ICBpZiAoIW1faW1wbC0+bV9vcGFjaXR5QW5pbWF0aW9uUnVubmluZyAmJiBvcGFjaXR5KCkgIT0g
bykKKyAgICAgICBtX2ltcGwtPm5vdGlmeUNoYW5nZShHcmFwaGljc0xheWVyUXRJbXBsOjpPcGFj
aXR5Q2hhbmdlKTsKKyAgICBHcmFwaGljc0xheWVyOjpzZXRPcGFjaXR5KG8pOworfQorCisvLyBy
ZWltcCBmcm9tIEdyYXBoaWNzTGF5ZXIuaAordm9pZCBHcmFwaGljc0xheWVyUXQ6OnNldENvbnRl
bnRzUmVjdChjb25zdCBJbnRSZWN0JiByKQoreworICAgIG1faW1wbC0+bm90aWZ5Q2hhbmdlKEdy
YXBoaWNzTGF5ZXJRdEltcGw6OkNvbnRlbnRzUmVjdENoYW5nZSk7CisgICAgR3JhcGhpY3NMYXll
cjo6c2V0Q29udGVudHNSZWN0KHIpOworfQorCisvLyByZWltcCBmcm9tIEdyYXBoaWNzTGF5ZXIu
aAordm9pZCBHcmFwaGljc0xheWVyUXQ6OnNldENvbnRlbnRzVG9JbWFnZShJbWFnZSogaW1hZ2Up
Cit7CisgICAgbV9pbXBsLT5ub3RpZnlDaGFuZ2UoR3JhcGhpY3NMYXllclF0SW1wbDo6Q29udGVu
dENoYW5nZSk7CisgICAgbV9pbXBsLT5tX3BlbmRpbmdDb250ZW50LmNvbnRlbnRUeXBlID0gR3Jh
cGhpY3NMYXllclF0SW1wbDo6SFRNTENvbnRlbnRUeXBlOworICAgIEdyYXBoaWNzTGF5ZXI6OnNl
dENvbnRlbnRzVG9JbWFnZShpbWFnZSk7CisgICAgaWYgKGltYWdlKSB7CisgICAgICAgIFFQaXht
YXAqIHB4bSA9IGltYWdlLT5uYXRpdmVJbWFnZUZvckN1cnJlbnRGcmFtZSgpOworICAgICAgICBp
ZiAocHhtKSB7CisgICAgICAgICAgICBtX2ltcGwtPm1fcGVuZGluZ0NvbnRlbnQucGl4bWFwID0g
KnB4bTsKKyAgICAgICAgICAgIG1faW1wbC0+bV9wZW5kaW5nQ29udGVudC5jb250ZW50VHlwZSA9
IEdyYXBoaWNzTGF5ZXJRdEltcGw6OlBpeG1hcENvbnRlbnRUeXBlOworICAgICAgICAgICAgcmV0
dXJuOworICAgICAgICB9ICAgICAgICAKKyAgICB9CisgICAgbV9pbXBsLT5tX3BlbmRpbmdDb250
ZW50LnBpeG1hcCA9IFFQaXhtYXAoKTsKK30KKworLy8gcmVpbXAgZnJvbSBHcmFwaGljc0xheWVy
LmgKK3ZvaWQgR3JhcGhpY3NMYXllclF0OjpzZXRDb250ZW50c0JhY2tncm91bmRDb2xvcihjb25z
dCBDb2xvciYgY29sb3IpCit7CisgICAgbV9pbXBsLT5ub3RpZnlDaGFuZ2UoR3JhcGhpY3NMYXll
clF0SW1wbDo6Q29udGVudENoYW5nZSk7CisgICAgbV9pbXBsLT5tX3BlbmRpbmdDb250ZW50LmNv
bnRlbnRUeXBlID0gR3JhcGhpY3NMYXllclF0SW1wbDo6Q29sb3JDb250ZW50VHlwZTsKKyAgICBt
X2ltcGwtPm1fcGVuZGluZ0NvbnRlbnQuY29udGVudHNCYWNrZ3JvdW5kQ29sb3IgPSBRQ29sb3Io
Y29sb3IpOworICAgIEdyYXBoaWNzTGF5ZXI6OnNldENvbnRlbnRzQmFja2dyb3VuZENvbG9yKGNv
bG9yKTsKK30KKworLy8gcmVpbXAgZnJvbSBHcmFwaGljc0xheWVyLmgKK3ZvaWQgR3JhcGhpY3NM
YXllclF0OjpzZXRHZW9tZXRyeU9yaWVudGF0aW9uKENvbXBvc2l0aW5nQ29vcmRpbmF0ZXNPcmll
bnRhdGlvbiBvcmllbnRhdGlvbikKK3sKKyAgICBtX2ltcGwtPm5vdGlmeUNoYW5nZShHcmFwaGlj
c0xheWVyUXRJbXBsOjpHZW9tZXRyeU9yaWVudGF0aW9uQ2hhbmdlKTsKKyAgICBHcmFwaGljc0xh
eWVyOjpzZXRHZW9tZXRyeU9yaWVudGF0aW9uKG9yaWVudGF0aW9uKTsKK30KKworLy8gcmVpbXAg
ZnJvbSBHcmFwaGljc0xheWVyLmgKK3ZvaWQgR3JhcGhpY3NMYXllclF0OjpzZXRDb250ZW50c09y
aWVudGF0aW9uKENvbXBvc2l0aW5nQ29vcmRpbmF0ZXNPcmllbnRhdGlvbiBvcmllbnRhdGlvbikK
K3sKKyAgICBtX2ltcGwtPm5vdGlmeUNoYW5nZShHcmFwaGljc0xheWVyUXRJbXBsOjpDb250ZW50
c09yaWVudGF0aW9uQ2hhbmdlKTsKKyAgICBHcmFwaGljc0xheWVyOjpzZXRDb250ZW50c09yaWVu
dGF0aW9uKG9yaWVudGF0aW9uKTsKK30KKworLy8gcmVpbXAgZnJvbSBHcmFwaGljc0xheWVyLmgK
K3ZvaWQgR3JhcGhpY3NMYXllclF0OjpkaXN0cmlidXRlT3BhY2l0eShmbG9hdCBvKQoreworICAg
IG1faW1wbC0+bm90aWZ5Q2hhbmdlKEdyYXBoaWNzTGF5ZXJRdEltcGw6Ok9wYWNpdHlDaGFuZ2Up
OworICAgIG1faW1wbC0+bV9zdGF0ZS5kaXN0cmlidXRlT3BhY2l0eSA9IHRydWU7Cit9CisKKy8v
IHJlaW1wIGZyb20gR3JhcGhpY3NMYXllci5oCitmbG9hdCBHcmFwaGljc0xheWVyUXQ6OmFjY3Vt
dWxhdGVkT3BhY2l0eSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1faW1wbC0+ZWZmZWN0aXZlT3Bh
Y2l0eSgpOworfQorCisvLyByZWltcCBmcm9tIEdyYXBoaWNzTGF5ZXIuaAordm9pZCBHcmFwaGlj
c0xheWVyUXQ6OnN5bmNDb21wb3NpdGluZ1N0YXRlKCkKK3sKKyAgICBtX2ltcGwtPmZsdXNoQ2hh
bmdlcygpOworICAgIEdyYXBoaWNzTGF5ZXI6OnN5bmNDb21wb3NpdGluZ1N0YXRlKCk7Cit9CisK
Ky8vIHJlaW1wIGZyb20gR3JhcGhpY3NMYXllci5oCitOYXRpdmVMYXllciBHcmFwaGljc0xheWVy
UXQ6Om5hdGl2ZUxheWVyKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9pbXBsLmdldCgpOworfQor
CisvLyByZWltcCBmcm9tIEdyYXBoaWNzTGF5ZXIuaAorUGxhdGZvcm1MYXllciogR3JhcGhpY3NM
YXllclF0OjpwbGF0Zm9ybUxheWVyKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9pbXBsLmdldCgp
OworfQorCisvLyBub3cgd2Ugc3RhcnQgZGVhbGluZyB3aXRoIFdlYkNvcmUgYW5pbWF0aW9ucyB0
cmFuc2xhdGVkIHRvIFF0IGFuaW1hdGlvbnMKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1
Y3QgS2V5ZnJhbWVWYWx1ZVF0IHsKKyAgICBUaW1pbmdGdW5jdGlvbiB0aW1pbmdGdW5jdGlvbjsK
KyAgICBUIHZhbHVlOworfTsKKworLy8gd2UgY29weSB0aGlzIGZyb20gdGhlIEFuaW1hdGlvbkJh
c2UuY3BwCitzdGF0aWMgaW5saW5lIGRvdWJsZSBzb2x2ZUVwc2lsb24oZG91YmxlIGR1cmF0aW9u
KQoreworICAgIHJldHVybiAxLjAgLyAoMjAwLjAgKiBkdXJhdGlvbik7Cit9CisKK3N0YXRpYyBp
bmxpbmUgZG91YmxlIHNvbHZlQ3ViaWNCZXppZXJGdW5jdGlvbihxcmVhbCBwMXgsIHFyZWFsIHAx
eSwgcXJlYWwgcDJ4LCBxcmVhbCBwMnksIGRvdWJsZSB0LCBkb3VibGUgZHVyYXRpb24pCit7Cisg
ICAgVW5pdEJlemllciBiZXppZXIocDF4LCBwMXksIHAyeCwgcDJ5KTsKKyAgICByZXR1cm4gYmV6
aWVyLnNvbHZlKHQsIHNvbHZlRXBzaWxvbihkdXJhdGlvbikpOworfQorCisvLyB3ZSB3YW50IHRo
ZSB0aW1pbmcgZnVuY3Rpb24gdG8gYmUgYXMgY2xvc2UgYXMgcG9zc2libGUgdG8gd2hhdCB0aGUg
d2ViLWRldmVsb3BlciBpbnRlbmRlZCwgc28gd2UncmUgdXNpbmcgdGhlIHNhbWUgZnVuY3Rpb24g
dXNlZCBieSBXZWJDb3JlIHdoZW4gY29tcG9zaXRpbmcgaXMgZGlzYWJsZWQKKy8vIFVzaW5nIGVh
c2luZy1jdXJ2ZXMgd291bGQgcHJvYmFibHkgd29yayBmb3Igc29tZSBvZiB0aGUgY2FzZXMsIGJ1
dCB3b3VsZG4ndCByZWFsbHkgYnV5IHVzIGFueXRoaW5nIGFzIHdlJ2QgaGF2ZSB0byBjb252ZXJ0
IHRoZSBiZXppZXIgZnVuY3Rpb24gYmFjayB0byBhbiBlYXNpbmcgY3VydmUKK3N0YXRpYyBpbmxp
bmUgcXJlYWwgYXBwbHlUaW1pbmdGdW5jdGlvbihjb25zdCBUaW1pbmdGdW5jdGlvbiYgdGltaW5n
RnVuY3Rpb24sIHFyZWFsIHByb2dyZXNzLCBpbnQgZHVyYXRpb24pCit7CisgICAgaWYgKHRpbWlu
Z0Z1bmN0aW9uLnR5cGUoKSA9PSBMaW5lYXJUaW1pbmdGdW5jdGlvbikKKyAgICAgICAgcmV0dXJu
IHByb2dyZXNzOworICAgIGlmICh0aW1pbmdGdW5jdGlvbi50eXBlKCkgPT0gQ3ViaWNCZXppZXJU
aW1pbmdGdW5jdGlvbikgeworICAgICAgICByZXR1cm4gc29sdmVDdWJpY0JlemllckZ1bmN0aW9u
KHRpbWluZ0Z1bmN0aW9uLngxKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgdGltaW5nRnVuY3Rpb24ueTEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICB0aW1pbmdGdW5jdGlvbi54MigpLAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIHRpbWluZ0Z1bmN0aW9uLnkyKCksCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgZG91YmxlKHByb2dyZXNzKSwgZG91YmxlKGR1cmF0aW9uKSAv
IDEwMDApOworICAgIH0KKyAgICByZXR1cm4gcHJvZ3Jlc3M7Cit9CisKKy8vIGhlbHBlciBmdW5j
dGlvbnMgdG8gc2FmZWx5IGdldCBhIHZhbHVlIG91dCBvZiBXZWJDb3JlJ3MgQW5pbWF0aW9uVmFs
dWUqCitzdGF0aWMgdm9pZCB3ZWJraXRBbmltYXRpb25Ub1F0QW5pbWF0aW9uVmFsdWUoY29uc3Qg
QW5pbWF0aW9uVmFsdWUqIGFuaW1hdGlvblZhbHVlLCBUcmFuc2Zvcm1PcGVyYXRpb25zJiB0cmFu
c2Zvcm1PcGVyYXRpb25zKQoreworICAgIHRyYW5zZm9ybU9wZXJhdGlvbnMgPSBUcmFuc2Zvcm1P
cGVyYXRpb25zKCk7CisgICAgaWYgKCFhbmltYXRpb25WYWx1ZSkKKyAgICAgICAgcmV0dXJuOwor
CisgICAgY29uc3QgVHJhbnNmb3JtT3BlcmF0aW9ucyogb3BzID0gc3RhdGljX2Nhc3Q8Y29uc3Qg
VHJhbnNmb3JtQW5pbWF0aW9uVmFsdWUqPihhbmltYXRpb25WYWx1ZSktPnZhbHVlKCk7CisKKyAg
ICBpZiAob3BzKQorICAgICAgICB0cmFuc2Zvcm1PcGVyYXRpb25zID0gKm9wczsKK30KKworc3Rh
dGljIHZvaWQgd2Via2l0QW5pbWF0aW9uVG9RdEFuaW1hdGlvblZhbHVlKGNvbnN0IEFuaW1hdGlv
blZhbHVlKiBhbmltYXRpb25WYWx1ZSwgcXJlYWwmIHJlYWxWYWx1ZSkKK3sKKyAgICByZWFsVmFs
dWUgPSBhbmltYXRpb25WYWx1ZSA/IHN0YXRpY19jYXN0PGNvbnN0IEZsb2F0QW5pbWF0aW9uVmFs
dWUqPihhbmltYXRpb25WYWx1ZSktPnZhbHVlKCkgOiAwOworfQorCisvLyB3ZSBwdXQgYSBiaXQg
b2YgdGhlIGZ1bmN0aW9uYWxpdHkgaW4gYSBiYXNlIGNsYXNzIHRvIGFsbG93IGNhc3RpbmcgYW5k
IHRvIHNhdmUgc29tZSBjb2RlIHNpemUKK2NsYXNzIEFuaW1hdGlvblF0QmFzZSA6IHB1YmxpYyBR
QWJzdHJhY3RBbmltYXRpb24geworcHVibGljOgorICAgIEFuaW1hdGlvblF0QmFzZShHcmFwaGlj
c0xheWVyUXRJbXBsKiBsYXllciwgY29uc3QgS2V5ZnJhbWVWYWx1ZUxpc3QmIHZhbHVlcywgY29u
c3QgSW50U2l6ZSYgYm94U2l6ZSwgY29uc3QgQW5pbWF0aW9uKiBhbmltLCBjb25zdCBRU3RyaW5n
ICYgbmFtZSkKKyAgICAgICAgOiBRQWJzdHJhY3RBbmltYXRpb24oMCkKKyAgICAgICAgLCBtX2xh
eWVyKGxheWVyKQorICAgICAgICAsIG1fYm94U2l6ZShib3hTaXplKQorICAgICAgICAsIG1fZHVy
YXRpb24oYW5pbS0+ZHVyYXRpb24oKSAqIDEwMDApCisgICAgICAgICwgbV9pc0FsdGVybmF0ZShh
bmltLT5kaXJlY3Rpb24oKSA9PSBBbmltYXRpb246OkFuaW1hdGlvbkRpcmVjdGlvbkFsdGVybmF0
ZSkKKyAgICAgICAgLCBtX3dlYmtpdFByb3BlcnR5SUQodmFsdWVzLnByb3BlcnR5KCkpCisgICAg
ICAgICwgbV9rZXlmcmFtZXNOYW1lKG5hbWUpCisgICAgeworICAgIH0KKworICAgIHZpcnR1YWwg
dm9pZCB1cGRhdGVTdGF0ZShRQWJzdHJhY3RBbmltYXRpb246OlN0YXRlIG5ld1N0YXRlLCBRQWJz
dHJhY3RBbmltYXRpb246OlN0YXRlIG9sZFN0YXRlKQorICAgIHsKKyAgICAgICAgUUFic3RyYWN0
QW5pbWF0aW9uOjp1cGRhdGVTdGF0ZShuZXdTdGF0ZSwgb2xkU3RhdGUpOworCisgICAgICAgIC8v
IGZvciBzb21lIHJlYXNvbiBJIGhhdmUgZG8gdGhpcyBhc3luY2hyb25vdXNseSAtIG9yIHRoZSBh
bmltYXRpb24gd29uJ3Qgd29yaworICAgICAgICBpZiAobmV3U3RhdGUgPT0gUnVubmluZyAmJiBv
bGRTdGF0ZSA9PSBTdG9wcGVkKQorICAgICAgICAgICAgUVRpbWVyOjpzaW5nbGVTaG90KDAsIG1f
bGF5ZXIuZGF0YSgpLCBTTE9UKG5vdGlmeUFuaW1hdGlvblN0YXJ0ZWQoKSkpOworICAgIH0KKwor
ICAgIHZpcnR1YWwgaW50IGR1cmF0aW9uKCkgY29uc3QgeyByZXR1cm4gbV9kdXJhdGlvbjsgfQor
CisgICAgUVdlYWtQb2ludGVyPEdyYXBoaWNzTGF5ZXJRdEltcGw+IG1fbGF5ZXI7CisgICAgSW50
U2l6ZSBtX2JveFNpemU7CisgICAgaW50IG1fZHVyYXRpb247CisgICAgYm9vbCBtX2lzQWx0ZXJu
YXRlOworICAgIEFuaW1hdGVkUHJvcGVydHlJRCBtX3dlYmtpdFByb3BlcnR5SUQ7CisgICAgUVN0
cmluZyBtX2tleWZyYW1lc05hbWU7Cit9OworCisvLyB3ZSdkIHJhdGhlciBoYXZlIGEgdGVtcGxh
dGl6ZWQgUUFic3RyYWN0QW5pbWF0aW9uIHRoYW4gUVByb3BlcnR5QW5pbWF0aW9uIC8gUVZhcmlh
bnRBbmltYXRpb247CisvLyBTaW5jZSB3ZSBrbm93IHRoZSB0eXBlcyB0aGF0IHdlJ3JlIGRlYWxp
bmcgd2l0aCwgdGhlIFFPYmplY3QvUVByb3BlcnR5L1FWYXJpYW50IGFic3RyYWN0aW9uCisvLyBi
dXlzIHVzIHZlcnkgbGl0dGxlIGluIHRoaXMgY2FzZSwgZm9yIHRvbyBtdWNoIG92ZXJoZWFkCit0
ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIEFuaW1hdGlvblF0IDogcHVibGljIEFuaW1hdGlv
blF0QmFzZSB7CisKK3B1YmxpYzoKKyAgICBBbmltYXRpb25RdChHcmFwaGljc0xheWVyUXRJbXBs
KiBsYXllciwgY29uc3QgS2V5ZnJhbWVWYWx1ZUxpc3QmIHZhbHVlcywgY29uc3QgSW50U2l6ZSYg
Ym94U2l6ZSwgY29uc3QgQW5pbWF0aW9uKiBhbmltLCBjb25zdCBRU3RyaW5nICYgbmFtZSkKKyAg
ICAgICAgOkFuaW1hdGlvblF0QmFzZShsYXllciwgdmFsdWVzLCBib3hTaXplLCBhbmltLCBuYW1l
KQorICAgIHsKKyAgICAgICAgLy8gY29weWluZyB0aG9zZSBXZWJDb3JlIHN0cnVjdHVyZXMgaXMg
bm90IHRyaXZpYWwsIHdlIGhhdmUgdG8gZG8gaXQgbGlrZSB0aGlzCisgICAgICAgIGZvciAoc2l6
ZV90IGkgPSAwOyBpIDwgdmFsdWVzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBjb25zdCBB
bmltYXRpb25WYWx1ZSogYW5pbWF0aW9uVmFsdWUgPSB2YWx1ZXMuYXQoaSk7CisgICAgICAgICAg
ICBLZXlmcmFtZVZhbHVlUXQ8VD4ga2V5ZnJhbWVWYWx1ZTsKKyAgICAgICAgICAgIGlmIChhbmlt
YXRpb25WYWx1ZS0+dGltaW5nRnVuY3Rpb24oKSkKKyAgICAgICAgICAgICAgICBrZXlmcmFtZVZh
bHVlLnRpbWluZ0Z1bmN0aW9uID0gKmFuaW1hdGlvblZhbHVlLT50aW1pbmdGdW5jdGlvbigpOwor
ICAgICAgICAgICAgd2Via2l0QW5pbWF0aW9uVG9RdEFuaW1hdGlvblZhbHVlKGFuaW1hdGlvblZh
bHVlLCBrZXlmcmFtZVZhbHVlLnZhbHVlKTsKKyAgICAgICAgICAgIG1fa2V5ZnJhbWVWYWx1ZXNb
YW5pbWF0aW9uVmFsdWUtPmtleVRpbWUoKV0gPSBrZXlmcmFtZVZhbHVlOworICAgICAgICB9Cisg
ICAgfQorCitwcm90ZWN0ZWQ6CisKKyAgICAvLyB0aGlzIGlzIHRoZSBwYXJ0IHRoYXQgZGlmZmVy
cyBiZXR3ZWVuIGFuaW1hdGVkIHByb3BlcnRpZXMKKyAgICB2aXJ0dWFsIHZvaWQgYXBwbHlGcmFt
ZShjb25zdCBUJiBmcm9tVmFsdWUsIGNvbnN0IFQmIHRvVmFsdWUsIHFyZWFsIHByb2dyZXNzKSA9
IDA7CisKKyAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlQ3VycmVudFRpbWUoaW50IGN1cnJlbnRUaW1l
KQorICAgIHsKKyAgICAgICAgaWYgKCFtX2xheWVyKQorICAgICAgICAgICAgcmV0dXJuOworCisg
ICAgICAgIHFyZWFsIHByb2dyZXNzID0gcXJlYWwoY3VycmVudExvb3BUaW1lKCkpIC8gZHVyYXRp
b24oKTsKKworICAgICAgICBpZiAobV9pc0FsdGVybmF0ZSAmJiBjdXJyZW50TG9vcCgpJTIpCisg
ICAgICAgICAgICBwcm9ncmVzcyA9IDEtcHJvZ3Jlc3M7CisKKyAgICAgICAgaWYgKG1fa2V5ZnJh
bWVWYWx1ZXMuaXNFbXB0eSgpKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIC8vIHdl
IGZpbmQgdGhlIGN1cnJlbnQgZnJvbS10byBrZXlmcmFtZXMgaW4gb3VyIGxpdHRsZSBtYXAKKyAg
ICAgICAgdHlwZW5hbWUgUU1hcDxxcmVhbCwgS2V5ZnJhbWVWYWx1ZVF0PFQ+ID46Oml0ZXJhdG9y
IGl0ID0gbV9rZXlmcmFtZVZhbHVlcy5maW5kKHByb2dyZXNzKTsKKworICAgICAgICAvLyB3ZSBk
aWRuJ3QgZmluZCBhbiBleGFjdCBtYXRjaCwgd2UgdHJ5IHRoZSBjbG9zZXN0IG1hdGNoIChsb3dl
ciBib3VuZCkKKyAgICAgICAgaWYgKGl0ID09IG1fa2V5ZnJhbWVWYWx1ZXMuZW5kKCkpCisgICAg
ICAgICAgICBpdCA9IG1fa2V5ZnJhbWVWYWx1ZXMubG93ZXJCb3VuZChwcm9ncmVzcyktMTsKKwor
ICAgICAgICAvLyB3ZSBkaWRuJ3QgZmluZCBhbnkgbWF0Y2ggLSB3ZSB1c2UgdGhlIGZpcnN0IGtl
eWZyYW1lCisgICAgICAgIGlmIChpdCA9PSBtX2tleWZyYW1lVmFsdWVzLmVuZCgpKQorICAgICAg
ICAgICAgaXQgPSBtX2tleWZyYW1lVmFsdWVzLmJlZ2luKCk7CisKKyAgICAgICAgdHlwZW5hbWUg
UU1hcDxxcmVhbCwgS2V5ZnJhbWVWYWx1ZVF0PFQ+ID46Oml0ZXJhdG9yIGl0MiA9IGl0KzE7Cisg
ICAgICAgIGlmIChpdDIgPT0gbV9rZXlmcmFtZVZhbHVlcy5lbmQoKSkKKyAgICAgICAgICAgIGl0
MiA9IG1fa2V5ZnJhbWVWYWx1ZXMuYmVnaW4oKTsKKyAgICAgICAgY29uc3QgS2V5ZnJhbWVWYWx1
ZVF0PFQ+JiBmcm9tS2V5ZnJhbWUgPSBpdC52YWx1ZSgpOworICAgICAgICBjb25zdCBLZXlmcmFt
ZVZhbHVlUXQ8VD4mIHRvS2V5ZnJhbWUgPSBpdDIudmFsdWUoKTsKKworICAgICAgICBjb25zdCBU
aW1pbmdGdW5jdGlvbiYgdGltaW5nRnVuYyA9IGZyb21LZXlmcmFtZS50aW1pbmdGdW5jdGlvbjsK
KyAgICAgICAgY29uc3QgVCYgZnJvbVZhbHVlID0gZnJvbUtleWZyYW1lLnZhbHVlOworICAgICAg
ICBjb25zdCBUJiB0b1ZhbHVlID0gdG9LZXlmcmFtZS52YWx1ZTsKKworICAgICAgICAvLyBub3cg
d2UgaGF2ZSBhIHNvdXJjZSBrZXlmcmFtZSwgb3JpZ2luIGtleWZyYW1lIGFuZCBhIHRpbWluZyBm
dW5jdGlvbgorICAgICAgICAvLyB3ZSBjYW4gbm93IHByb2Nlc3MgdGhlIHByb2dyZXNzIGFuZCBh
cHBseSB0aGUgZnJhbWUKKyAgICAgICAgcXJlYWwgbm9ybWFsaXplZFByb2dyZXNzID0gKGl0Lmtl
eSgpID09IGl0Mi5rZXkoKSkgPyAwIDogKHByb2dyZXNzIC0gaXQua2V5KCkpIC8gKGl0Mi5rZXko
KSAtIGl0LmtleSgpKTsKKyAgICAgICAgbm9ybWFsaXplZFByb2dyZXNzID0gYXBwbHlUaW1pbmdG
dW5jdGlvbih0aW1pbmdGdW5jLCBub3JtYWxpemVkUHJvZ3Jlc3MsIGR1cmF0aW9uKCkgLyAxMDAw
KTsKKyAgICAgICAgYXBwbHlGcmFtZShmcm9tVmFsdWUsIHRvVmFsdWUsIG5vcm1hbGl6ZWRQcm9n
cmVzcyk7CisgICAgfQorCisgICAgUU1hcDxxcmVhbCwgS2V5ZnJhbWVWYWx1ZVF0PFQ+ID4gbV9r
ZXlmcmFtZVZhbHVlczsKK307CisKK2NsYXNzIFRyYW5zZm9ybUFuaW1hdGlvblF0IDogcHVibGlj
IEFuaW1hdGlvblF0PFRyYW5zZm9ybU9wZXJhdGlvbnM+IHsKK3B1YmxpYzoKKyAgICBUcmFuc2Zv
cm1BbmltYXRpb25RdChHcmFwaGljc0xheWVyUXRJbXBsKiBsYXllciwgY29uc3QgS2V5ZnJhbWVW
YWx1ZUxpc3QmIHZhbHVlcywgY29uc3QgSW50U2l6ZSYgYm94U2l6ZSwgY29uc3QgQW5pbWF0aW9u
KiBhbmltLCBjb25zdCBRU3RyaW5nICYgbmFtZSkKKyAgICAgICAgICAgICAgICA6IEFuaW1hdGlv
blF0PFRyYW5zZm9ybU9wZXJhdGlvbnM+KGxheWVyLCB2YWx1ZXMsIGJveFNpemUsIGFuaW0sIG5h
bWUpCisgICAgeworICAgIH0KKworICAgIH5UcmFuc2Zvcm1BbmltYXRpb25RdCgpCisgICAgewor
ICAgICAgICAvLyB0aGlzIGNhbWUgdXAgZHVyaW5nIHRoZSBjb21wb3NpdGluZy9hbmltYXRpb24g
TGF5b3V0VGVzdHMKKyAgICAgICAgLy8gd2hlbiB0aGUgYW5pbWF0aW9uIGRpZXMsIHRoZSB0cmFu
c2Zvcm0gaGFzIHRvIGdvIGJhY2sgdG8gZGVmYXVsdAorICAgICAgICBpZiAobV9sYXllcikKKyAg
ICAgICAgICAgIG1fbGF5ZXIuZGF0YSgpLT5zZXRCYXNlVHJhbnNmb3JtKFFUcmFuc2Zvcm0obV9s
YXllci5kYXRhKCktPm1fbGF5ZXItPnRyYW5zZm9ybSgpKSk7CisgICAgfQorCisgICAgLy8gdGhl
IGlkZWEgaXMgdGhhdCB3ZSBsZXQgV2ViQ29yZSBtYW5hZ2UgdGhlIHRyYW5zZm9ybS1vcGVyYXRp
b25zCisgICAgLy8gYW5kIFF0IGp1c3QgbWFuYWdlcyB0aGUgYW5pbWF0aW9uIGhlYXJ0YmVhdCBh
bmQgdGhlIGJvdHRvbS1saW5lIFFUcmFuc2Zvcm0KKyAgICAvLyB3ZSBnZXQgdGhlIHBlcmZvcm1h
bmNlIG5vdCBieSB1c2luZyBRVHJhbnNmb3JtIGluc3RlYWQgb2YgVHJhbnNmb3JtYXRpb25NYXRy
aXgsIGJ1dCBieSBwcm9wZXIgY2FjaGluZyBvZgorICAgIC8vIGl0ZW1zIHRoYXQgYXJlIGV4cGVu
c2l2ZSBmb3IgV2ViQ29yZSB0byByZW5kZXIuIFdlIHdhbnQgdGhlIHJlc3QgdG8gYmUgYXMgY2xv
c2UgdG8gV2ViQ29yZSdzIGlkZWEgYXMgcG9zc2libGUuCisgICAgdmlydHVhbCB2b2lkIGFwcGx5
RnJhbWUoY29uc3QgVHJhbnNmb3JtT3BlcmF0aW9ucyYgc291cmNlT3BlcmF0aW9ucywgY29uc3Qg
VHJhbnNmb3JtT3BlcmF0aW9ucyYgdGFyZ2V0T3BlcmF0aW9ucywgcXJlYWwgcHJvZ3Jlc3MpCisg
ICAgeworICAgICAgICBUcmFuc2Zvcm1hdGlvbk1hdHJpeCB0cmFuc2Zvcm1NYXRyaXg7CisKKyAg
ICAgICAgLy8gdGhpcyBsb29rcyBzaW1wbGUgYnV0IGlzIHJlYWxseSB0cmlja3kgdG8gZ2V0IHJp
Z2h0LiBVc2UgY2F1dGlvbi4KKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB0YXJnZXRP
cGVyYXRpb25zLnNpemUoKTsgKytpKQorICAgICAgICAgICAgdGFyZ2V0T3BlcmF0aW9ucy5vcGVy
YXRpb25zKClbaV0tPmJsZW5kKHNvdXJjZU9wZXJhdGlvbnMuYXQoaSksIHByb2dyZXNzKS0+YXBw
bHkodHJhbnNmb3JtTWF0cml4LCBtX2JveFNpemUpOworCisgICAgICAgIG1fbGF5ZXIuZGF0YSgp
LT5zZXRCYXNlVHJhbnNmb3JtKFFUcmFuc2Zvcm0odHJhbnNmb3JtTWF0cml4KSk7CisgICAgfQor
CisgICAgdmlydHVhbCB2b2lkIHVwZGF0ZVN0YXRlKFFBYnN0cmFjdEFuaW1hdGlvbjo6U3RhdGUg
bmV3U3RhdGUsIFFBYnN0cmFjdEFuaW1hdGlvbjo6U3RhdGUgb2xkU3RhdGUpCisgICAgeworICAg
ICAgICBBbmltYXRpb25RdEJhc2U6OnVwZGF0ZVN0YXRlKG5ld1N0YXRlLCBvbGRTdGF0ZSk7Cisg
ICAgICAgIGlmICghbV9sYXllcikKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgbV9sYXll
ci5kYXRhKCktPmZsdXNoQ2hhbmdlcyh0cnVlKTsKKworICAgICAgICAvLyB0byBpbmNyZWFzZSBG
UFMsIHdlIHVzZSBhIGxlc3MgYWNjdXJhdGUgY2FjaGluZyBtZWNoYW5pc20gd2hpbGUgYW5pbWF0
aW9uIGlzIGdvaW5nIG9uCisgICAgICAgIC8vIHRoaXMgaXMgYSBVWCBjaG9pY2UgdGhhdCBzaG91
bGQgcHJvYmFibHkgYmUgY3VzdG9taXphYmxlCisgICAgICAgIGlmIChuZXdTdGF0ZSA9PSBRQWJz
dHJhY3RBbmltYXRpb246OlJ1bm5pbmcpIHsKKyAgICAgICAgICAgIG1fbGF5ZXIuZGF0YSgpLT5t
X3RyYW5zZm9ybUFuaW1hdGlvblJ1bm5pbmcgPSB0cnVlOworICAgICAgICAgICAgaWYgKG1fbGF5
ZXIuZGF0YSgpLT5jYWNoZU1vZGUoKSA9PSBRR3JhcGhpY3NJdGVtOjpEZXZpY2VDb29yZGluYXRl
Q2FjaGUpCisgICAgICAgICAgICAgICAgbV9sYXllci5kYXRhKCktPnNldENhY2hlTW9kZShRR3Jh
cGhpY3NJdGVtOjpJdGVtQ29vcmRpbmF0ZUNhY2hlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAg
ICAgICAgIG1fbGF5ZXIuZGF0YSgpLT5tX3RyYW5zZm9ybUFuaW1hdGlvblJ1bm5pbmcgPSBmYWxz
ZTsKKyAgICAgICAgICAgIGlmIChtX2xheWVyLmRhdGEoKS0+Y2FjaGVNb2RlKCkgPT0gUUdyYXBo
aWNzSXRlbTo6SXRlbUNvb3JkaW5hdGVDYWNoZSkKKyAgICAgICAgICAgICAgICBtX2xheWVyLmRh
dGEoKS0+c2V0Q2FjaGVNb2RlKFFHcmFwaGljc0l0ZW06OkRldmljZUNvb3JkaW5hdGVDYWNoZSk7
CisgICAgICAgIH0KKyAgICB9Cit9OworCitjbGFzcyBPcGFjaXR5QW5pbWF0aW9uUXQgOiBwdWJs
aWMgQW5pbWF0aW9uUXQ8cXJlYWw+IHsKK3B1YmxpYzoKKyAgICBPcGFjaXR5QW5pbWF0aW9uUXQo
R3JhcGhpY3NMYXllclF0SW1wbCogbGF5ZXIsIGNvbnN0IEtleWZyYW1lVmFsdWVMaXN0JiB2YWx1
ZXMsIGNvbnN0IEludFNpemUmIGJveFNpemUsIGNvbnN0IEFuaW1hdGlvbiogYW5pbSwgY29uc3Qg
UVN0cmluZyAmIG5hbWUpCisgICAgICAgICA6IEFuaW1hdGlvblF0PHFyZWFsPihsYXllciwgdmFs
dWVzLCBib3hTaXplLCBhbmltLCBuYW1lKQorICAgIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZv
aWQgYXBwbHlGcmFtZShjb25zdCBxcmVhbCYgZnJvbVZhbHVlLCBjb25zdCBxcmVhbCYgdG9WYWx1
ZSwgcXJlYWwgcHJvZ3Jlc3MpCisgICAgeworICAgICAgICBtX2xheWVyLmRhdGEoKS0+c2V0T3Bh
Y2l0eShxTWluPHFyZWFsPihxTWF4PHFyZWFsPihmcm9tVmFsdWUgKyAodG9WYWx1ZS1mcm9tVmFs
dWUpKnByb2dyZXNzLCAwKSwgMSkpOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCB1cGRhdGVT
dGF0ZShRQWJzdHJhY3RBbmltYXRpb246OlN0YXRlIG5ld1N0YXRlLCBRQWJzdHJhY3RBbmltYXRp
b246OlN0YXRlIG9sZFN0YXRlKQorICAgIHsKKyAgICAgICAgUUFic3RyYWN0QW5pbWF0aW9uOjp1
cGRhdGVTdGF0ZShuZXdTdGF0ZSwgb2xkU3RhdGUpOworICAgICAgICBpZiAobV9sYXllcikKKyAg
ICAgICAgICAgIG1fbGF5ZXIuZGF0YSgpLT5tX29wYWNpdHlBbmltYXRpb25SdW5uaW5nID0gKG5l
d1N0YXRlID09IFFBYnN0cmFjdEFuaW1hdGlvbjo6UnVubmluZyk7CisgICAgfQorfTsKKworYm9v
bCBHcmFwaGljc0xheWVyUXQ6OmFkZEFuaW1hdGlvbihjb25zdCBLZXlmcmFtZVZhbHVlTGlzdCYg
dmFsdWVzLCBjb25zdCBJbnRTaXplJiBib3hTaXplLCBjb25zdCBBbmltYXRpb24qIGFuaW0sIGNv
bnN0IFN0cmluZyYga2V5ZnJhbWVzTmFtZSwgZG91YmxlIHRpbWVPZmZzZXQpCit7CisgICAgaWYg
KCFhbmltLT5kdXJhdGlvbigpIHx8ICFhbmltLT5pdGVyYXRpb25Db3VudCgpKQorICAgICAgICBy
ZXR1cm4gZmFsc2U7CisKKyAgICBRQWJzdHJhY3RBbmltYXRpb24qIG5ld0FuaW07CisKKyAgICBz
d2l0Y2ggKHZhbHVlcy5wcm9wZXJ0eSgpKSB7CisgICAgY2FzZSBBbmltYXRlZFByb3BlcnR5T3Bh
Y2l0eToKKyAgICAgICAgbmV3QW5pbSA9IG5ldyBPcGFjaXR5QW5pbWF0aW9uUXQobV9pbXBsLmdl
dCgpLCB2YWx1ZXMsIGJveFNpemUsIGFuaW0sIGtleWZyYW1lc05hbWUpOworICAgICAgICBicmVh
azsKKyAgICBjYXNlIEFuaW1hdGVkUHJvcGVydHlXZWJraXRUcmFuc2Zvcm06CisgICAgICAgIG5l
d0FuaW0gPSBuZXcgVHJhbnNmb3JtQW5pbWF0aW9uUXQobV9pbXBsLmdldCgpLCB2YWx1ZXMsIGJv
eFNpemUsIGFuaW0sIGtleWZyYW1lc05hbWUpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0
OgorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gd2UgbWFrZSBzdXJlIFdl
YkNvcmU6OkFuaW1hdGlvbiBhbmQgUUFuaW1hdGlvbiBhcmUgb24gdGhlIHNhbWUgdGVybXMKKyAg
ICBuZXdBbmltLT5zZXRMb29wQ291bnQoYW5pbS0+aXRlcmF0aW9uQ291bnQoKSk7CisgICAgbV9p
bXBsLT5tX2FuaW1hdGlvbnMuYXBwZW5kKFFXZWFrUG9pbnRlcjxRQWJzdHJhY3RBbmltYXRpb24+
KG5ld0FuaW0pKTsKKyAgICBRT2JqZWN0Ojpjb25uZWN0KCZtX2ltcGwtPm1fc3VzcGVuZFRpbWVy
LCBTSUdOQUwodGltZW91dCgpKSwgbmV3QW5pbSwgU0xPVChyZXN1bWUoKSkpOworICAgIHRpbWVP
ZmZzZXQgKz0gYW5pbS0+ZGVsYXkoKTsKKworICAgIC8vIGZsdXNoIG5vdyBvciBmbGlja2VyLi4u
CisgICAgbV9pbXBsLT5mbHVzaENoYW5nZXMoZmFsc2UpOworCisgICAgaWYgKHRpbWVPZmZzZXQp
CisgICAgICAgIFFUaW1lcjo6c2luZ2xlU2hvdCh0aW1lT2Zmc2V0ICogMTAwMCwgbmV3QW5pbSwg
U0xPVChzdGFydCgpKSk7CisgICAgZWxzZQorICAgICAgICBuZXdBbmltLT5zdGFydCgpOworCisg
ICAgUU9iamVjdDo6Y29ubmVjdChuZXdBbmltLCBTSUdOQUwoZmluaXNoZWQoKSksIG5ld0FuaW0s
IFNMT1QoZGVsZXRlTGF0ZXIoKSkpOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgR3Jh
cGhpY3NMYXllclF0OjpyZW1vdmVBbmltYXRpb25zRm9yUHJvcGVydHkoQW5pbWF0ZWRQcm9wZXJ0
eUlEIGlkKQoreworICAgIGZvciAoUUxpc3Q8UVdlYWtQb2ludGVyPFFBYnN0cmFjdEFuaW1hdGlv
bj4gPjo6aXRlcmF0b3IgaXQgPSBtX2ltcGwtPm1fYW5pbWF0aW9ucy5iZWdpbigpOyBpdCAhPSBt
X2ltcGwtPm1fYW5pbWF0aW9ucy5lbmQoKTsgKytpdCkgeworICAgICAgICBpZiAoKml0KSB7Cisg
ICAgICAgICAgICBBbmltYXRpb25RdEJhc2UqIGFuaW0gPSBzdGF0aWNfY2FzdDxBbmltYXRpb25R
dEJhc2UqPihpdC0+ZGF0YSgpKTsKKyAgICAgICAgICAgIGlmIChhbmltICYmIGFuaW0tPm1fd2Vi
a2l0UHJvcGVydHlJRCA9PSBpZCkgeworICAgICAgICAgICAgICAgIGRlbGV0ZSBhbmltOworICAg
ICAgICAgICAgICAgIGl0ID0gbV9pbXBsLT5tX2FuaW1hdGlvbnMuZXJhc2UoaXQpOworICAgICAg
ICAgICAgICAgIC0taXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3Zv
aWQgR3JhcGhpY3NMYXllclF0OjpyZW1vdmVBbmltYXRpb25zRm9yS2V5ZnJhbWVzKGNvbnN0IFN0
cmluZyYgbmFtZSkKK3sKKyAgICBmb3IgKFFMaXN0PFFXZWFrUG9pbnRlcjxRQWJzdHJhY3RBbmlt
YXRpb24+ID46Oml0ZXJhdG9yIGl0ID0gbV9pbXBsLT5tX2FuaW1hdGlvbnMuYmVnaW4oKTsgaXQg
IT0gbV9pbXBsLT5tX2FuaW1hdGlvbnMuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgaWYgKCppdCkg
eworICAgICAgICAgICAgQW5pbWF0aW9uUXRCYXNlKiBhbmltID0gc3RhdGljX2Nhc3Q8QW5pbWF0
aW9uUXRCYXNlKj4oKCppdCkuZGF0YSgpKTsKKyAgICAgICAgICAgIGlmIChhbmltICYmIGFuaW0t
Pm1fa2V5ZnJhbWVzTmFtZSA9PSBRU3RyaW5nKG5hbWUpKSB7CisgICAgICAgICAgICAgICAgKCpp
dCkuZGF0YSgpLT5kZWxldGVMYXRlcigpOworICAgICAgICAgICAgICAgIGl0ID0gbV9pbXBsLT5t
X2FuaW1hdGlvbnMuZXJhc2UoaXQpOworICAgICAgICAgICAgICAgIC0taXQ7CisgICAgICAgICAg
ICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllclF0OjpwYXVzZUFu
aW1hdGlvbihjb25zdCBTdHJpbmcmIG5hbWUsIGRvdWJsZSB0aW1lT2Zmc2V0KQoreworICAgIGZv
ciAoUUxpc3Q8UVdlYWtQb2ludGVyPFFBYnN0cmFjdEFuaW1hdGlvbj4gPjo6aXRlcmF0b3IgaXQg
PSBtX2ltcGwtPm1fYW5pbWF0aW9ucy5iZWdpbigpOyBpdCAhPSBtX2ltcGwtPm1fYW5pbWF0aW9u
cy5lbmQoKTsgKytpdCkgeworICAgICAgICBpZiAoKml0KSB7CisgICAgICAgICAgICBBbmltYXRp
b25RdEJhc2UqIGFuaW0gPSBzdGF0aWNfY2FzdDxBbmltYXRpb25RdEJhc2UqPigoKml0KS5kYXRh
KCkpOworICAgICAgICAgICAgaWYgKGFuaW0gJiYgYW5pbS0+bV9rZXlmcmFtZXNOYW1lID09IFFT
dHJpbmcobmFtZSkpCisgICAgICAgICAgICAgICAgUVRpbWVyOjpzaW5nbGVTaG90KHRpbWVPZmZz
ZXQgKiAxMDAwLCBhbmltLCBTTE9UKHBhdXNlKCkpKTsKKyAgICAgICAgfQorICAgIH0KK30KKwor
dm9pZCBHcmFwaGljc0xheWVyUXQ6OnN1c3BlbmRBbmltYXRpb25zKGRvdWJsZSB0aW1lKQorewor
ICAgIGlmIChtX2ltcGwtPm1fc3VzcGVuZFRpbWVyLmlzQWN0aXZlKCkpIHsKKyAgICAgICAgbV9p
bXBsLT5tX3N1c3BlbmRUaW1lci5zdG9wKCk7CisgICAgICAgIG1faW1wbC0+bV9zdXNwZW5kVGlt
ZXIuc3RhcnQodGltZSAqIDEwMDApOworICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAoUUxpc3Q8
UVdlYWtQb2ludGVyPFFBYnN0cmFjdEFuaW1hdGlvbj4gPjo6aXRlcmF0b3IgaXQgPSBtX2ltcGwt
Pm1fYW5pbWF0aW9ucy5iZWdpbigpOyBpdCAhPSBtX2ltcGwtPm1fYW5pbWF0aW9ucy5lbmQoKTsg
KytpdCkgeworICAgICAgICAgICAgUUFic3RyYWN0QW5pbWF0aW9uKiBhbmltID0gaXQtPmRhdGEo
KTsKKyAgICAgICAgICAgIGlmIChhbmltKQorICAgICAgICAgICAgICAgIGFuaW0tPnBhdXNlKCk7
CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllclF0OjpyZXN1bWVBbmlt
YXRpb25zKCkKK3sKKyAgICBpZiAobV9pbXBsLT5tX3N1c3BlbmRUaW1lci5pc0FjdGl2ZSgpKSB7
CisgICAgICAgIG1faW1wbC0+bV9zdXNwZW5kVGltZXIuc3RvcCgpOworICAgICAgICBmb3IgKFFM
aXN0PFFXZWFrUG9pbnRlcjxRQWJzdHJhY3RBbmltYXRpb24+ID46Oml0ZXJhdG9yIGl0ID0gbV9p
bXBsLT5tX2FuaW1hdGlvbnMuYmVnaW4oKTsgaXQgIT0gbV9pbXBsLT5tX2FuaW1hdGlvbnMuZW5k
KCk7ICsraXQpIHsKKyAgICAgICAgICAgIFFBYnN0cmFjdEFuaW1hdGlvbiogYW5pbSA9ICgqaXQp
LmRhdGEoKTsKKyAgICAgICAgICAgIGlmIChhbmltKQorICAgICAgICAgICAgICAgIGFuaW0tPnJl
c3VtZSgpOworICAgICAgICB9CisgICAgfQorfQorCit9CisKKyNpbmNsdWRlIDxHcmFwaGljc0xh
eWVyUXQubW9jPgpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9xdC9HcmFwaGljc0xh
eWVyUXQuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3F0L0dyYXBo
aWNzTGF5ZXJRdC5oCShyZXZpc2lvbiAwKQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9x
dC9HcmFwaGljc0xheWVyUXQuaAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSw4NSBAQAorLyoKKyAg
ICBDb3B5cmlnaHQgKEMpIDIwMDkgTm9raWEgQ29ycG9yYXRpb24gYW5kL29yIGl0cyBzdWJzaWRp
YXJ5KC1pZXMpCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiBy
ZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0
aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBi
eSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIgb2Yg
dGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAg
ICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJl
IHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUg
aW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBB
IFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGlicmFyeSBHZW5lcmFsIFB1
YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVj
ZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisg
ICAgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElm
IG5vdCwgd3JpdGUgdG8KKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1
MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICAgIEJvc3RvbiwgTUEgMDIxMTAtMTMw
MSwgVVNBLgorKi8KKworI2lmbmRlZiBHcmFwaGljc0xheWVyUXRfaAorI2RlZmluZSBHcmFwaGlj
c0xheWVyUXRfaAorCisjaW5jbHVkZSAiR3JhcGhpY3NMYXllci5oIgorI2luY2x1ZGUgIkdyYXBo
aWNzTGF5ZXJDbGllbnQuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitjbGFzcyBHcmFwaGlj
c0xheWVyUXRJbXBsOworCitjbGFzcyBHcmFwaGljc0xheWVyUXQgOiBwdWJsaWMgR3JhcGhpY3NM
YXllciB7CisgICAgZnJpZW5kIGNsYXNzIEdyYXBoaWNzTGF5ZXJRdEltcGw7CisKK3B1YmxpYzoK
KyAgICBHcmFwaGljc0xheWVyUXQoR3JhcGhpY3NMYXllckNsaWVudCopOworICAgIHZpcnR1YWwg
fkdyYXBoaWNzTGF5ZXJRdCgpOworCisgICAgLy8gcmVpbXBzIGZyb20gR3JhcGhpY3NMYXllci5o
CisgICAgdmlydHVhbCBOYXRpdmVMYXllciBuYXRpdmVMYXllcigpIGNvbnN0OworICAgIHZpcnR1
YWwgUGxhdGZvcm1MYXllciogcGxhdGZvcm1MYXllcigpIGNvbnN0OworICAgIHZpcnR1YWwgdm9p
ZCBzZXROZWVkc0Rpc3BsYXkoKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0TmVlZHNEaXNwbGF5SW5S
ZWN0KGNvbnN0IEZsb2F0UmVjdCYpOworICAgIHZpcnR1YWwgdm9pZCBzZXRQYXJlbnQoR3JhcGhp
Y3NMYXllciogbGF5ZXIpOworICAgIHZpcnR1YWwgdm9pZCBzZXROYW1lKGNvbnN0IFN0cmluZyYg
bmFtZSk7CisgICAgdmlydHVhbCBib29sIHNldENoaWxkcmVuKGNvbnN0IFZlY3RvcjxHcmFwaGlj
c0xheWVyKj4mKTsKKyAgICB2aXJ0dWFsIHZvaWQgYWRkQ2hpbGQoR3JhcGhpY3NMYXllciopOwor
ICAgIHZpcnR1YWwgdm9pZCBhZGRDaGlsZEF0SW5kZXgoR3JhcGhpY3NMYXllciosIGludCBpbmRl
eCk7CisgICAgdmlydHVhbCB2b2lkIGFkZENoaWxkQWJvdmUoR3JhcGhpY3NMYXllciogbGF5ZXIs
IEdyYXBoaWNzTGF5ZXIqIHNpYmxpbmcpOworICAgIHZpcnR1YWwgdm9pZCBhZGRDaGlsZEJlbG93
KEdyYXBoaWNzTGF5ZXIqIGxheWVyLCBHcmFwaGljc0xheWVyKiBzaWJsaW5nKTsKKyAgICB2aXJ0
dWFsIGJvb2wgcmVwbGFjZUNoaWxkKEdyYXBoaWNzTGF5ZXIqIG9sZENoaWxkLCBHcmFwaGljc0xh
eWVyKiBuZXdDaGlsZCk7CisgICAgdmlydHVhbCB2b2lkIHJlbW92ZUZyb21QYXJlbnQoKTsKKyAg
ICB2aXJ0dWFsIHZvaWQgc2V0TWFza0xheWVyKEdyYXBoaWNzTGF5ZXIqIGxheWVyKTsKKyAgICB2
aXJ0dWFsIHZvaWQgc2V0UG9zaXRpb24oY29uc3QgRmxvYXRQb2ludCYgcCk7CisgICAgdmlydHVh
bCB2b2lkIHNldEFuY2hvclBvaW50KGNvbnN0IEZsb2F0UG9pbnQzRCYgcCk7CisgICAgdmlydHVh
bCB2b2lkIHNldFNpemUoY29uc3QgRmxvYXRTaXplJiBzaXplKTsKKyAgICB2aXJ0dWFsIHZvaWQg
c2V0VHJhbnNmb3JtKGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4JiB0KTsKKyAgICB2aXJ0dWFs
IHZvaWQgc2V0Q2hpbGRyZW5UcmFuc2Zvcm0oY29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgmIHQp
OworICAgIHZpcnR1YWwgdm9pZCBzZXRQcmVzZXJ2ZXMzRChib29sIGIpOworICAgIHZpcnR1YWwg
dm9pZCBzZXRNYXNrc1RvQm91bmRzKGJvb2wgYik7CisgICAgdmlydHVhbCB2b2lkIHNldERyYXdz
Q29udGVudChib29sIGIpOworICAgIHZpcnR1YWwgdm9pZCBzZXRCYWNrZ3JvdW5kQ29sb3IoY29u
c3QgQ29sb3ImKTsKKyAgICB2aXJ0dWFsIHZvaWQgY2xlYXJCYWNrZ3JvdW5kQ29sb3IoKTsKKyAg
ICB2aXJ0dWFsIHZvaWQgc2V0Q29udGVudHNPcGFxdWUoYm9vbCBiKTsKKyAgICB2aXJ0dWFsIHZv
aWQgc2V0QmFja2ZhY2VWaXNpYmlsaXR5KGJvb2wgYik7CisgICAgdmlydHVhbCB2b2lkIHNldE9w
YWNpdHkoZmxvYXQgb3BhY2l0eSk7CisgICAgdmlydHVhbCB2b2lkIHNldENvbnRlbnRzUmVjdChj
b25zdCBJbnRSZWN0JiByKTsKKyAgICB2aXJ0dWFsIGJvb2wgYWRkQW5pbWF0aW9uKGNvbnN0IEtl
eWZyYW1lVmFsdWVMaXN0JiwgY29uc3QgSW50U2l6ZSYgYm94U2l6ZSwgY29uc3QgQW5pbWF0aW9u
KiwgY29uc3QgU3RyaW5nJiBrZXlmcmFtZXNOYW1lLCBkb3VibGUgdGltZU9mZnNldCk7CisgICAg
dmlydHVhbCB2b2lkIHJlbW92ZUFuaW1hdGlvbnNGb3JQcm9wZXJ0eShBbmltYXRlZFByb3BlcnR5
SUQpOworICAgIHZpcnR1YWwgdm9pZCByZW1vdmVBbmltYXRpb25zRm9yS2V5ZnJhbWVzKGNvbnN0
IFN0cmluZyYga2V5ZnJhbWVzTmFtZSk7CisgICAgdmlydHVhbCB2b2lkIHBhdXNlQW5pbWF0aW9u
KGNvbnN0IFN0cmluZyYga2V5ZnJhbWVzTmFtZSwgZG91YmxlIHRpbWVPZmZzZXQpOworICAgIHZp
cnR1YWwgdm9pZCBzdXNwZW5kQW5pbWF0aW9ucyhkb3VibGUgdGltZSk7CisgICAgdmlydHVhbCB2
b2lkIHJlc3VtZUFuaW1hdGlvbnMoKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0Q29udGVudHNUb0lt
YWdlKEltYWdlKik7CisgICAgdmlydHVhbCB2b2lkIHNldENvbnRlbnRzQmFja2dyb3VuZENvbG9y
KGNvbnN0IENvbG9yJik7CisgICAgdmlydHVhbCB2b2lkIHNldEdlb21ldHJ5T3JpZW50YXRpb24o
Q29tcG9zaXRpbmdDb29yZGluYXRlc09yaWVudGF0aW9uIG9yaWVudGF0aW9uKTsKKyAgICB2aXJ0
dWFsIHZvaWQgc2V0Q29udGVudHNPcmllbnRhdGlvbihDb21wb3NpdGluZ0Nvb3JkaW5hdGVzT3Jp
ZW50YXRpb24gb3JpZW50YXRpb24pOworICAgIHZpcnR1YWwgdm9pZCBkaXN0cmlidXRlT3BhY2l0
eShmbG9hdCk7CisgICAgdmlydHVhbCBmbG9hdCBhY2N1bXVsYXRlZE9wYWNpdHkoKSBjb25zdDsK
KyAgICB2aXJ0dWFsIHZvaWQgc3luY0NvbXBvc2l0aW5nU3RhdGUoKTsKKworcHJpdmF0ZToKKyAg
ICBPd25QdHI8R3JhcGhpY3NMYXllclF0SW1wbD4gbV9pbXBsOworfTsKKworfQorI2VuZGlmIC8v
IEdyYXBoaWNzTGF5ZXJRdF9oCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL3F0L1FXZWJQYWdlQ2xp
ZW50LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9xdC9RV2ViUGFnZUNsaWVudC5o
CShyZXZpc2lvbiA1MzQyNykKKysrIFdlYkNvcmUvcGxhdGZvcm0vcXQvUVdlYlBhZ2VDbGllbnQu
aAkod29ya2luZyBjb3B5KQpAQCAtMjksNyArMjksOSBAQAogI2lmbmRlZiBRVF9OT19DVVJTT1IK
ICNpbmNsdWRlIDxRQ3Vyc29yPgogI2VuZGlmCisKICNpbmNsdWRlIDxRUmVjdD4KK2NsYXNzIFFH
cmFwaGljc0l0ZW07CiAKIGNsYXNzIFFXZWJQYWdlQ2xpZW50IHsKIHB1YmxpYzoKQEAgLTM5LDYg
KzQxLDE2IEBAIHB1YmxpYzoKICAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlKGNvbnN0IFFSZWN0Jikg
PSAwOwogICAgIHZpcnR1YWwgdm9pZCBzZXRJbnB1dE1ldGhvZEVuYWJsZWQoYm9vbCBlbmFibGUp
ID0gMDsKICAgICB2aXJ0dWFsIGJvb2wgaW5wdXRNZXRob2RFbmFibGVkKCkgY29uc3QgPSAwOwor
I2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKKyAgICAvLyB0aGlzIGdldHMgY2FsbGVk
IHdoZW4gd2Ugc3RhcnQvc3RvcCBjb21wb3NpdGluZy4KKyAgICB2aXJ0dWFsIHZvaWQgc2V0Um9v
dEdyYXBoaWNzTGF5ZXIoUUdyYXBoaWNzSXRlbSogbGF5ZXIpIHt9CisKKyAgICAvLyB0aGlzIGdl
dHMgY2FsbGVkIHdoZW4gdGhlIGNvbXBvc2l0b3Igd2FudHMgdXMgdG8gc3luYyB0aGUgbGF5ZXJz
CisgICAgLy8gaWYgc2NoZWR1bGVTeW5jIGlzIHRydWUsIHdlIHNjaGVkdWxlIGEgc3luYyBvdXJz
ZWx2ZXMuIG90aGVyd2lzZSwKKyAgICAvLyB3ZSB3YWl0IGZvciB0aGUgbmV4dCB1cGRhdGUgYW5k
IHN5bmMgdGhlIGxheWVycyB0aGVuLgorICAgIHZpcnR1YWwgdm9pZCBtYXJrRm9yU3luYyhib29s
IHNjaGVkdWxlU3luYyA9IGZhbHNlKSB7fQorI2VuZGlmCisKICNpZiBRVF9WRVJTSU9OID49IDB4
MDQwNjAwCiAgICAgdmlydHVhbCB2b2lkIHNldElucHV0TWV0aG9kSGludChRdDo6SW5wdXRNZXRo
b2RIaW50IGhpbnQsIGJvb2wgZW5hYmxlKSA9IDA7CiAjZW5kaWYKSW5kZXg6IFdlYktpdC9xdC9D
aGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0L3F0L0NoYW5nZUxvZwkocmV2aXNpb24gNTM1
MjMpCisrKyBXZWJLaXQvcXQvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsNjAg
QEAKKzIwMTAtMDEtMTkgIE5vJ2FtIFJvc2VudGhhbCAgPG5vYW0ucm9zZW50aGFsQG5va2lhLmNv
bT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBbUXRd
IEltcGxlbWVudCBHcmFwaGljc0xheWVyIGZvciBhY2NlbGVyYXRlZCBsYXllciBjb21wb3NpdGlu
ZworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MzM1MTQK
KworICAgICAgICBIZXJlIHdlIGhhdmUgdGhlIFFHcmFwaGljc1dlYlZpZXcgc3VwcG9ydCBmb3Ig
YWNjZWxlcmF0ZWQgY29tcG9zaXRpbmcKKworICAgICAgICAqIEFwaS9xZ3JhcGhpY3N3ZWJ2aWV3
LmNwcDoKKyAgICAgICAgKFFHcmFwaGljc1dlYlZpZXdPdmVybGF5OjpxKTogYWNjZXNzIHRvIGNv
bnRhaW5lciBvYmplY3QKKyAgICAgICAgKFFHcmFwaGljc1dlYlZpZXdPdmVybGF5Ojpib3VuZGlu
Z1JlY3QpOiBvdmVybGF5IGhhcyBzYW1lIHJlY3QgYXMgdGhlCisgICAgICAgIHdlYnZpZXcKKyAg
ICAgICAgKFFHcmFwaGljc1dlYlZpZXdPdmVybGF5OjpwYWludCk6IHBhaW50IGV2ZXJ5dGhpbmcg
YnV0IHRoZSBjb250ZW50cworICAgICAgICAoUUdyYXBoaWNzV2ViVmlld1ByaXZhdGU6OlFHcmFw
aGljc1dlYlZpZXdQcml2YXRlKTogc29tZSB2YXJzIG5lZWRlZAorICAgICAgICBmb3IgYWNjZWxl
cmF0ZWQgY29tcG9zaXRpbmcKKyAgICAgICAgKFFHcmFwaGljc1dlYlZpZXdQcml2YXRlOjopOgor
ICAgICAgICAoUUdyYXBoaWNzV2ViVmlld1ByaXZhdGU6On5RR3JhcGhpY3NXZWJWaWV3UHJpdmF0
ZSk6CisgICAgICAgIChRR3JhcGhpY3NXZWJWaWV3UHJpdmF0ZTo6c2V0Um9vdEdyYXBoaWNzTGF5
ZXIpOiBtYWtlIHN1cmUgd2UgaGF2ZSBhCisgICAgICAgIHNjcm9sbGJhciBvdmVybGF5LCBhbmQg
dGhhdCB0aGUgbmV3IGdyYXBoaWNzIGxheWVyIGlzIHBhcmVudGVkIGJ5IHRoZQorICAgICAgICB3
ZWItdmlldworICAgICAgICAoUUdyYXBoaWNzV2ViVmlld1ByaXZhdGU6Om1hcmtGb3JTeW5jKTog
Zmx1c2ggY2hhbmdlcyBhdCBlYXJsaWVzdAorICAgICAgICBjb252ZW5pZW5jZSBvciBkdXJpbmcg
dGhlIG5leHQgZHJhdworCisgICAgICAgIChRR3JhcGhpY3NXZWJWaWV3UHJpdmF0ZTo6dXBkYXRl
Q29tcG9zaXRpbmdTY3JvbGxQb3NpdGlvbik6IHN5bmMgdGhlCisgICAgICAgIHBvc2l0aW9uIG9m
IHRoZSBjb21wb3NpdGluZyBsYXllciB3aXRoIHRoZSBzY3JvbGwgcG9zaXRpb24KKyAgICAgICAg
KFFHcmFwaGljc1dlYlZpZXdQcml2YXRlOjpzeW5jTGF5ZXJzKTogZmx1c2ggY2hhbmdlcyBub3cK
KyAgICAgICAgKFFHcmFwaGljc1dlYlZpZXdQcml2YXRlOjpzY3JvbGwpOiBtYWtlIHN1cmUgd2Ug
YWxzbyBtb3ZlIHRoZQorICAgICAgICBjb21wb3NpdGluZyBsYXllcgorICAgICAgICAoUUdyYXBo
aWNzV2ViVmlld1ByaXZhdGU6OnVwZGF0ZSk6IGFsc28gdXBkYXRlIHRoZSBvdmVybGF5IGlmIG5l
ZWRlZAorICAgICAgICAoUUdyYXBoaWNzV2ViVmlldzo6UUdyYXBoaWNzV2ViVmlldyk6IGluaXRp
YWxpemUgb3ZlcmxheSB3aXRoIDAKKyAgICAgICAgKFFHcmFwaGljc1dlYlZpZXc6OnBhaW50KTog
cGFpbnQgb25seSBjb250ZW50cyBpZiB3ZSBoYXZlIGFuIG92ZXJsYXksCisgICAgICAgIHN5bmMg
dGhlIGNvbXBvc2l0aW5nIGxheWVycyBub3cgaWYgbmVlZGVkCisgICAgICAgIChRR3JhcGhpY3NX
ZWJWaWV3OjpzZXRQYWdlKTogYWxzbyBjbGVhbiB1cCB0aGUgY29tcG9zaXRpbmcKKyAgICAgICAg
KFFHcmFwaGljc1dlYlZpZXc6OnVwZGF0ZUdlb21ldHJ5KTogYWxzbyB1cGRhdGUgb3ZlcmxheSBn
ZW8KKyAgICAgICAgKFFHcmFwaGljc1dlYlZpZXc6OnNldEdlb21ldHJ5KTogYWxzbyB1cGRhdGUg
b3ZlcmxheSBnZW8KKyAgICAgICAgKiBBcGkvcWdyYXBoaWNzd2Vidmlldy5oOiByZWltcCBjb21w
b3NpdGluZyBzdHVmZiBmcm9tIFFXZWJQYWdlQ2xpZW50CisgICAgICAgICogQXBpL3F3ZWJzZXR0
aW5ncy5jcHA6IGluaXQgbmV3IHNldHRpbmdzIGZsYWcgZm9yIGNvbXBvc2l0aW5nIGFzCisgICAg
ICAgIGZhbHNlCisgICAgICAgIChRV2ViU2V0dGluZ3NQcml2YXRlOjphcHBseSk6IGFwcGx5IG5l
dyBzZXR0aW5ncyBmbGFnIGZvciBjb21wb3NpdGluZworICAgICAgICAoUVdlYlNldHRpbmdzOjpR
V2ViU2V0dGluZ3MpOgorICAgICAgICAqIEFwaS9xd2Vic2V0dGluZ3MuaDogbmV3IHNldHRpbmdz
IGZsYWcgZm9yIGNvbXBvc2l0aW5nCisgICAgICAgICogQXBpL3F3ZWJ2aWV3LmNwcDogCisgICAg
ICAgIChRV2ViVmlldzo6c2V0UGFnZSk6IHF3ZWJ2aWV3IGRvZXNuJ3Qgc3VwcG9ydCBjb21wb3Np
dGluZzogYWx3YXlzIGZhbHNlCisgICAgICAgICogUUdWTGF1bmNoZXIvbWFpbi5jcHA6CisgICAg
ICAgIChXZWJWaWV3OjpXZWJWaWV3KTogc29tZSBtb3JlIGNtZGxpbmUgYXJndW1lbnRzICsgY29t
cG9zaXRpbmcKKyAgICAgICAgKE1haW5XaW5kb3c6OmluaXQpOiBzb21lIG1vcmUgY21kbGluZSBh
cmd1bWVudHMKKyAgICAgICAgKG1haW4pOiBkaXR0bworICAgICAgICAqIFdlYkNvcmVTdXBwb3J0
L0Nocm9tZUNsaWVudFF0LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkNocm9tZUNsaWVudFF0Ojph
dHRhY2hSb290R3JhcGhpY3NMYXllcik6IHJlaW1wIGZvcgorICAgICAgICBhY2NlbC1jb21wb3Np
dGluZworICAgICAgICAoV2ViQ29yZTo6Q2hyb21lQ2xpZW50UXQ6OnNldE5lZWRzT25lU2hvdERy
YXdpbmdTeW5jaHJvbml6YXRpb24pOgorICAgICAgICByZWltcCBmb3IgYWNjZWwgY29tcG9zaXRp
bmcKKyAgICAgICAgKFdlYkNvcmU6OkNocm9tZUNsaWVudFF0OjpzY2hlZHVsZUNvbXBvc2l0aW5n
TGF5ZXJTeW5jKTogcmVpbXAgZm9yCisgICAgICAgIGFjY2VsIGNvbXBvc2l0aW5nCisgICAgICAg
ICogV2ViQ29yZVN1cHBvcnQvQ2hyb21lQ2xpZW50UXQuaDogcmVpbXBzIGZvciBhY2NlbCBjb21w
b3NpdGluZworCiAyMDEwLTAxLTE5ICBTdGV2ZSBCbG9jayAgPHN0ZXZlYmxvY2tAZ29vZ2xlLmNv
bT4KIAogICAgICAgICBSZXZpZXdlZCBieSBBZGFtIEJhcnRoLgpJbmRleDogV2ViS2l0L3F0L0Fw
aS9xZ3JhcGhpY3N3ZWJ2aWV3LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQvcXQvQXBpL3FncmFw
aGljc3dlYnZpZXcuY3BwCShyZXZpc2lvbiA1MzQyNykKKysrIFdlYktpdC9xdC9BcGkvcWdyYXBo
aWNzd2Vidmlldy5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTIyLDI0ICsyMiw3MSBAQAogI2luY2x1
ZGUgInFncmFwaGljc3dlYnZpZXcuaCIKIAogI2luY2x1ZGUgInF3ZWJmcmFtZS5oIgorI2luY2x1
ZGUgInF3ZWJmcmFtZV9wLmgiCiAjaW5jbHVkZSAicXdlYnBhZ2UuaCIKICNpbmNsdWRlICJxd2Vi
cGFnZV9wLmgiCiAjaW5jbHVkZSAiUVdlYlBhZ2VDbGllbnQuaCIKLSNpbmNsdWRlIDxRdEd1aS9R
R3JhcGhpY3NTY2VuZT4KLSNpbmNsdWRlIDxRdEd1aS9RR3JhcGhpY3NWaWV3PgorI2luY2x1ZGUg
PEZyYW1lVmlldy5oPgorI2luY2x1ZGUgPFF0Q29yZS9xc2hhcmVkcG9pbnRlci5oPgorI2luY2x1
ZGUgPFF0Q29yZS9xdGltZXIuaD4KICNpbmNsdWRlIDxRdEd1aS9xYXBwbGljYXRpb24uaD4KKyNp
bmNsdWRlIDxRdEd1aS9xZ3JhcGhpY3NzY2VuZS5oPgogI2luY2x1ZGUgPFF0R3VpL3FncmFwaGlj
c3NjZW5lZXZlbnQuaD4KKyNpbmNsdWRlIDxRdEd1aS9xZ3JhcGhpY3N2aWV3Lmg+CisjaW5jbHVk
ZSA8UXRHdWkvcXBpeG1hcGNhY2hlLmg+CiAjaW5jbHVkZSA8UXRHdWkvcXN0eWxlb3B0aW9uLmg+
CiAjaWYgZGVmaW5lZChRX1dTX1gxMSkKICNpbmNsdWRlIDxRWDExSW5mbz4KICNlbmRpZgorI2lu
Y2x1ZGUgPFNldHRpbmdzLmg+CisKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCisK
Ky8vIHRoZSBvdmVybGF5IGlzIGhlcmUgZm9yIG9uZSByZWFzb24gb25seTogdG8gaGF2ZSB0aGUg
c2Nyb2xsLWJhcnMgYW5kIG90aGVyCisvLyBleHRyYSBVSSBlbGVtZW50cyBhcHBlYXIgb24gdG9w
IG9mIGFueSBRR3JhcGhpY3NJdGVtcyBjcmVhdGVkIGJ5IENTUyBjb21wb3NpdGluZyBsYXllcnMK
K2NsYXNzIFFHcmFwaGljc1dlYlZpZXdPdmVybGF5IDogcHVibGljIFFHcmFwaGljc0l0ZW0gewor
ICAgIHB1YmxpYzoKKyAgICBRR3JhcGhpY3NXZWJWaWV3T3ZlcmxheShRR3JhcGhpY3NXZWJWaWV3
KiB2aWV3KQorICAgICAgICAgICAgOlFHcmFwaGljc0l0ZW0odmlldykKKyAgICAgICAgICAgICwg
cSh2aWV3KQorICAgIHsKKyAgICAgICAgc2V0UG9zKDAsIDApOworICAgICAgICBzZXRGbGFnKFFH
cmFwaGljc0l0ZW06Okl0ZW1Vc2VzRXh0ZW5kZWRTdHlsZU9wdGlvbiwgdHJ1ZSk7CisgICAgICAg
IHNldENhY2hlTW9kZShRR3JhcGhpY3NJdGVtOjpEZXZpY2VDb29yZGluYXRlQ2FjaGUpOworICAg
IH0KKworICAgIFFSZWN0RiBib3VuZGluZ1JlY3QoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0
dXJuIHEtPmJvdW5kaW5nUmVjdCgpOworICAgIH0KKworICAgIHZvaWQgcGFpbnQoUVBhaW50ZXIq
IHBhaW50ZXIsIGNvbnN0IFFTdHlsZU9wdGlvbkdyYXBoaWNzSXRlbSogb3B0aW9ucywgUVdpZGdl
dCopCisgICAgeworICAgICAgICBxLT5wYWdlKCktPm1haW5GcmFtZSgpLT5yZW5kZXIocGFpbnRl
ciwgc3RhdGljX2Nhc3Q8UVdlYkZyYW1lOjpSZW5kZXJMYXllcj4oUVdlYkZyYW1lOjpBbGxMYXll
cnMmKH5RV2ViRnJhbWU6OkNvbnRlbnRzTGF5ZXIpKSwgb3B0aW9ucy0+ZXhwb3NlZFJlY3QudG9S
ZWN0KCkpOworICAgIH0KKworICAgIGZyaWVuZCBjbGFzcyBRR3JhcGhpY3NXZWJWaWV3OworICAg
IFFHcmFwaGljc1dlYlZpZXcqIHE7Cit9OworCisjZW5kaWYKIAogY2xhc3MgUUdyYXBoaWNzV2Vi
Vmlld1ByaXZhdGUgOiBwdWJsaWMgUVdlYlBhZ2VDbGllbnQgewogcHVibGljOgogICAgIFFHcmFw
aGljc1dlYlZpZXdQcml2YXRlKFFHcmFwaGljc1dlYlZpZXcqIHBhcmVudCkKICAgICAgICAgOiBx
KHBhcmVudCkKICAgICAgICAgLCBwYWdlKDApCi0gICAge30KKyNpZiBVU0UoQUNDRUxFUkFURURf
Q09NUE9TSVRJTkcpCisgICAgICAgICwgcm9vdEdyYXBoaWNzTGF5ZXIoMCkKKyAgICAgICAgLCBz
aG91bGRTeW5jKHRydWUpCisjZW5kaWYKKyAgICB7CisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBP
U0lUSU5HKQorICAgICAgICAvLyB0aGUgb3ZlcmxheSBhbmQgc3RheXMgYWxpdmUgZm9yIHRoZSBs
aWZldGltZSBvZgorICAgICAgICAvLyB0aGlzIFFHcmFwaGljc1dlYlZpZXcgYXMgdGhlIHNjcm9s
bGJhcnMgYXJlIG5lZWRlZCB3aGVuIHRoZXJlJ3Mgbm8gY29tcG9zaXRpbmcKKyAgICAgICAgcS0+
c2V0RmxhZyhRR3JhcGhpY3NJdGVtOjpJdGVtVXNlc0V4dGVuZGVkU3R5bGVPcHRpb24pOworI2Vu
ZGlmCisgICAgfQogCiAgICAgdmlydHVhbCB+UUdyYXBoaWNzV2ViVmlld1ByaXZhdGUoKTsKICAg
ICB2aXJ0dWFsIHZvaWQgc2Nyb2xsKGludCBkeCwgaW50IGR5LCBjb25zdCBRUmVjdCYpOwpAQCAt
NjEsMTQgKzEwOCw5NSBAQCBwdWJsaWM6CiAKICAgICB2aXJ0dWFsIFFPYmplY3QqIHBsdWdpblBh
cmVudCgpIGNvbnN0OwogCisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorICAgIHZp
cnR1YWwgdm9pZCBzZXRSb290R3JhcGhpY3NMYXllcihRR3JhcGhpY3NJdGVtKiBsYXllcik7Cisg
ICAgdmlydHVhbCB2b2lkIG1hcmtGb3JTeW5jKGJvb2wgc2NoZWR1bGVTeW5jKTsKKyAgICB2b2lk
IHVwZGF0ZUNvbXBvc2l0aW5nU2Nyb2xsUG9zaXRpb24oKTsKKyNlbmRpZgorCisgICAgdm9pZCBz
eW5jTGF5ZXJzKCk7CiAgICAgdm9pZCBfcV9kb0xvYWRGaW5pc2hlZChib29sIHN1Y2Nlc3MpOwog
CiAgICAgUUdyYXBoaWNzV2ViVmlldyogcTsKICAgICBRV2ViUGFnZSogcGFnZTsKKyNpZiBVU0Uo
QUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCisgICAgUUdyYXBoaWNzSXRlbSogcm9vdEdyYXBoaWNz
TGF5ZXI7CisKKyAgICAvLyB0aGUgb3ZlcmxheSBnZXRzIGluc3RhbnRpYXRlZCB3aGVuIHRoZSBy
b290IGxheWVyIGlzIGF0dGFjaGVkLCBhbmQgZ2V0IGRlbGV0ZWQgd2hlbiBpdCdzIGRldGFjaGVk
CisgICAgUVNoYXJlZFBvaW50ZXI8UUdyYXBoaWNzV2ViVmlld092ZXJsYXk+IG92ZXJsYXk7CisK
KyAgICAvLyB3ZSBuZWVkIHRvIHN5bmMgdGhlIGxheWVycyBpZiB3ZSBnZXQgYSBzcGVjaWFsIGNh
bGwgZnJvbSB0aGUgV2ViQ29yZQorICAgIC8vIGNvbXBvc2l0b3IgdGVsbGluZyB1cyB0byBkbyBz
by4gV2UnbGwgZ2V0IHRoYXQgY2FsbCBmcm9tIENocm9tZUNsaWVudFF0CisgICAgYm9vbCBzaG91
bGRTeW5jOworCisgICAgLy8gd2UgbmVlZCB0byBwdXQgdGhlIHJvb3QgZ3JhcGhpY3MgbGF5ZXIg
YmVoaW5kIHRoZSBvdmVybGF5ICh3aGljaCBjb250YWlucyB0aGUgc2Nyb2xsYmFyKQorICAgIGVu
dW0geyBSb290R3JhcGhpY3NMYXllclpWYWx1ZSwgT3ZlcmxheVpWYWx1ZSB9OworI2VuZGlmCiB9
OwogCiBRR3JhcGhpY3NXZWJWaWV3UHJpdmF0ZTo6flFHcmFwaGljc1dlYlZpZXdQcml2YXRlKCkK
IHsKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCisgICAgaWYgKHJvb3RHcmFwaGlj
c0xheWVyKSB7CisgICAgICAgIC8vIHdlIGRvbid0IG5lZWQgdG8gZGVsZXRlIHRoZSByb290IGdy
YXBoaWNzIGxheWVyCisgICAgICAgIC8vIFRoZSBsaWZlY3ljbGUgaXMgbWFuYWdlZCBpbiBHcmFw
aGljc0xheWVyUXQuY3BwCisgICAgICAgIHJvb3RHcmFwaGljc0xheWVyLT5zZXRQYXJlbnRJdGVt
KDApOworICAgICAgICBxLT5zY2VuZSgpLT5yZW1vdmVJdGVtKHJvb3RHcmFwaGljc0xheWVyKTsK
KyAgICB9CisjZW5kaWYKK30KKworI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKK3Zv
aWQgUUdyYXBoaWNzV2ViVmlld1ByaXZhdGU6OnNldFJvb3RHcmFwaGljc0xheWVyKFFHcmFwaGlj
c0l0ZW0qIGxheWVyKQoreworICAgIGlmIChyb290R3JhcGhpY3NMYXllcikgeworICAgICAgICBy
b290R3JhcGhpY3NMYXllci0+c2V0UGFyZW50SXRlbSgwKTsKKyAgICAgICAgcS0+c2NlbmUoKS0+
cmVtb3ZlSXRlbShyb290R3JhcGhpY3NMYXllcik7CisgICAgICAgIFFXZWJGcmFtZVByaXZhdGU6
OmNvcmUocS0+cGFnZSgpLT5tYWluRnJhbWUoKSktPnZpZXcoKS0+c3luY0NvbXBvc2l0aW5nU3Rh
dGVSZWN1cnNpdmUoKTsKKyAgICB9CisKKyAgICByb290R3JhcGhpY3NMYXllciA9IGxheWVyOwor
CisgICAgaWYgKGxheWVyKSB7CisgICAgICAgIGxheWVyLT5zZXRGbGFnKFFHcmFwaGljc0l0ZW06
Okl0ZW1DbGlwc0NoaWxkcmVuVG9TaGFwZSwgdHJ1ZSk7CisgICAgICAgIGxheWVyLT5zZXRQYXJl
bnRJdGVtKHEpOworICAgICAgICBsYXllci0+c2V0WlZhbHVlKFJvb3RHcmFwaGljc0xheWVyWlZh
bHVlKTsKKyAgICAgICAgaWYgKCFvdmVybGF5KSB7CisgICAgICAgICAgICBvdmVybGF5ID0gUVNo
YXJlZFBvaW50ZXI8UUdyYXBoaWNzV2ViVmlld092ZXJsYXk+KG5ldyBRR3JhcGhpY3NXZWJWaWV3
T3ZlcmxheShxKSk7CisgICAgICAgICAgICBvdmVybGF5LT5zZXRaVmFsdWUoT3ZlcmxheVpWYWx1
ZSk7CisgICAgICAgIH0KKyAgICAgICAgdXBkYXRlQ29tcG9zaXRpbmdTY3JvbGxQb3NpdGlvbigp
OworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIHdlIGRvbid0IGhhdmUgY29tcG9zaXRpbmcgbGF5
ZXJzLCB3ZSBjYW4gcmVuZGVyIHRoZSBzY3JvbGxiYXJzIGFuZCBjb250ZW50IGluIG9uZSBnbwor
ICAgICAgICBvdmVybGF5LmNsZWFyKCk7CisgICAgfQorfQorCit2b2lkIFFHcmFwaGljc1dlYlZp
ZXdQcml2YXRlOjptYXJrRm9yU3luYyhib29sIHNjaGVkdWxlU3luYykKK3sKKyAgICBzaG91bGRT
eW5jID0gdHJ1ZTsKKyAgICBpZiAoc2NoZWR1bGVTeW5jKQorICAgICAgICBRVGltZXI6OnNpbmds
ZVNob3QoMCwgcSwgU0xPVChzeW5jTGF5ZXJzKCkpKTsKK30KKwordm9pZCBRR3JhcGhpY3NXZWJW
aWV3UHJpdmF0ZTo6dXBkYXRlQ29tcG9zaXRpbmdTY3JvbGxQb3NpdGlvbigpCit7CisgICAgaWYg
KHJvb3RHcmFwaGljc0xheWVyICYmIHEtPnBhZ2UoKSAmJiBxLT5wYWdlKCktPm1haW5GcmFtZSgp
KSB7CisgICAgICAgIGNvbnN0IFFQb2ludCBzY3JvbGxQb3NpdGlvbiA9IHEtPnBhZ2UoKS0+bWFp
bkZyYW1lKCktPnNjcm9sbFBvc2l0aW9uKCk7CisgICAgICAgIHJvb3RHcmFwaGljc0xheWVyLT5z
ZXRQb3MoLXNjcm9sbFBvc2l0aW9uKTsKKyAgICB9Cit9CisKKyNlbmRpZgorCit2b2lkIFFHcmFw
aGljc1dlYlZpZXdQcml2YXRlOjpzeW5jTGF5ZXJzKCkKK3sKKyNpZiBVU0UoQUNDRUxFUkFURURf
Q09NUE9TSVRJTkcpCisgICAgaWYgKHNob3VsZFN5bmMpIHsKKyAgICAgICAgUVdlYkZyYW1lUHJp
dmF0ZTo6Y29yZShxLT5wYWdlKCktPm1haW5GcmFtZSgpKS0+dmlldygpLT5zeW5jQ29tcG9zaXRp
bmdTdGF0ZVJlY3Vyc2l2ZSgpOworICAgICAgICBzaG91bGRTeW5jID0gZmFsc2U7CisgICAgfQor
I2VuZGlmCiB9CiAKIHZvaWQgUUdyYXBoaWNzV2ViVmlld1ByaXZhdGU6Ol9xX2RvTG9hZEZpbmlz
aGVkKGJvb2wgc3VjY2VzcykKQEAgLTgzLDExICsyMTEsMTggQEAgdm9pZCBRR3JhcGhpY3NXZWJW
aWV3UHJpdmF0ZTo6X3FfZG9Mb2FkRgogdm9pZCBRR3JhcGhpY3NXZWJWaWV3UHJpdmF0ZTo6c2Ny
b2xsKGludCBkeCwgaW50IGR5LCBjb25zdCBRUmVjdCYgcmVjdFRvU2Nyb2xsKQogewogICAgIHEt
PnNjcm9sbChxcmVhbChkeCksIHFyZWFsKGR5KSwgUVJlY3RGKHJlY3RUb1Njcm9sbCkpOworI2lm
IFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKKyAgICB1cGRhdGVDb21wb3NpdGluZ1Njcm9s
bFBvc2l0aW9uKCk7CisjZW5kaWYKIH0KIAogdm9pZCBRR3JhcGhpY3NXZWJWaWV3UHJpdmF0ZTo6
dXBkYXRlKGNvbnN0IFFSZWN0ICYgZGlydHlSZWN0KQogewogICAgIHEtPnVwZGF0ZShRUmVjdEYo
ZGlydHlSZWN0KSk7CisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorICAgIGlmIChv
dmVybGF5KQorICAgICAgICBvdmVybGF5LT51cGRhdGUoUVJlY3RGKGRpcnR5UmVjdCkpOworI2Vu
ZGlmCiB9CiAKIApAQCAtMjQ4LDYgKzM4Myw3IEBAIFFHcmFwaGljc1dlYlZpZXc6OlFHcmFwaGlj
c1dlYlZpZXcoUUdyYXAKICAgICBzZXRBY2NlcHRUb3VjaEV2ZW50cyh0cnVlKTsKICNlbmRpZgog
ICAgIHNldEZvY3VzUG9saWN5KFF0OjpTdHJvbmdGb2N1cyk7CisgICAgc2V0RmxhZyhRR3JhcGhp
Y3NJdGVtOjpJdGVtQ2xpcHNDaGlsZHJlblRvU2hhcGUsIHRydWUpOwogfQogCiAvKiEKQEAgLTI5
Nyw3ICs0MzMsMTIgQEAgUVdlYlBhZ2UqIFFHcmFwaGljc1dlYlZpZXc6OnBhZ2UoKSBjb25zdAog
Ki8KIHZvaWQgUUdyYXBoaWNzV2ViVmlldzo6cGFpbnQoUVBhaW50ZXIqIHBhaW50ZXIsIGNvbnN0
IFFTdHlsZU9wdGlvbkdyYXBoaWNzSXRlbSogb3B0aW9uLCBRV2lkZ2V0KikKIHsKLSAgICBwYWdl
KCktPm1haW5GcmFtZSgpLT5yZW5kZXIocGFpbnRlciwgb3B0aW9uLT5leHBvc2VkUmVjdC50b1Jl
Y3QoKSk7CisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorICAgIHBhZ2UoKS0+bWFp
bkZyYW1lKCktPnJlbmRlcihwYWludGVyLCBkLT5vdmVybGF5ID8gUVdlYkZyYW1lOjpDb250ZW50
c0xheWVyIDogUVdlYkZyYW1lOjpBbGxMYXllcnMsIG9wdGlvbi0+ZXhwb3NlZFJlY3QudG9BbGln
bmVkUmVjdCgpKTsKKyAgICBkLT5zeW5jTGF5ZXJzKCk7CisjZWxzZQorICAgIHBhZ2UoKS0+bWFp
bkZyYW1lKCktPnJlbmRlcihwYWludGVyLCBRV2ViRnJhbWU6OkFsbExheWVycywgb3B0aW9uLT5l
eHBvc2VkUmVjdC50b1JlY3QoKSk7CisjZW5kaWYKIH0KIAogLyohIFxyZWltcApAQCAtNDI1LDYg
KzU2NiwxMCBAQCB2b2lkIFFHcmFwaGljc1dlYlZpZXc6OnNldFBhZ2UoUVdlYlBhZ2UqCiAgICAg
ZC0+cGFnZSA9IHBhZ2U7CiAgICAgaWYgKCFkLT5wYWdlKQogICAgICAgICByZXR1cm47CisjaWYg
VVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorICAgIGlmIChkLT5vdmVybGF5KQorICAgICAg
ICBkLT5vdmVybGF5LT5wcmVwYXJlR2VvbWV0cnlDaGFuZ2UoKTsKKyNlbmRpZgogICAgIGQtPnBh
Z2UtPmQtPmNsaWVudCA9IGQ7IC8vIHNldCB0aGUgcGFnZSBjbGllbnQKIAogICAgIFFTaXplIHNp
emUgPSBnZW9tZXRyeSgpLnNpemUoKS50b1NpemUoKTsKQEAgLTUyOCw2ICs2NzMsMTIgQEAgcXJl
YWwgUUdyYXBoaWNzV2ViVmlldzo6em9vbUZhY3RvcigpIGNvbgogKi8KIHZvaWQgUUdyYXBoaWNz
V2ViVmlldzo6dXBkYXRlR2VvbWV0cnkoKQogeworCisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBP
U0lUSU5HKQorICAgIGlmIChkLT5vdmVybGF5KQorICAgICAgICBkLT5vdmVybGF5LT5wcmVwYXJl
R2VvbWV0cnlDaGFuZ2UoKTsKKyNlbmRpZgorCiAgICAgUUdyYXBoaWNzV2lkZ2V0Ojp1cGRhdGVH
ZW9tZXRyeSgpOwogCiAgICAgaWYgKCFkLT5wYWdlKQpAQCAtNTQzLDYgKzY5NCwxMSBAQCB2b2lk
IFFHcmFwaGljc1dlYlZpZXc6OnNldEdlb21ldHJ5KGNvbnN0CiB7CiAgICAgUUdyYXBoaWNzV2lk
Z2V0OjpzZXRHZW9tZXRyeShyZWN0KTsKIAorI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElO
RykKKyAgICBpZiAoZC0+b3ZlcmxheSkKKyAgICAgICAgZC0+b3ZlcmxheS0+cHJlcGFyZUdlb21l
dHJ5Q2hhbmdlKCk7CisjZW5kaWYKKwogICAgIGlmICghZC0+cGFnZSkKICAgICAgICAgcmV0dXJu
OwogCkluZGV4OiBXZWJLaXQvcXQvQXBpL3FncmFwaGljc3dlYnZpZXcuaAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBXZWJLaXQvcXQvQXBpL3FncmFwaGljc3dlYnZpZXcuaAkocmV2aXNpb24gNTM0MjcpCisrKyBX
ZWJLaXQvcXQvQXBpL3FncmFwaGljc3dlYnZpZXcuaAkod29ya2luZyBjb3B5KQpAQCAtMTM0LDYg
KzEzNCw5IEBAIHByb3RlY3RlZDoKIAogcHJpdmF0ZToKICAgICBRX1BSSVZBVEVfU0xPVChkLCB2
b2lkIF9xX2RvTG9hZEZpbmlzaGVkKGJvb2wgc3VjY2VzcykpCisgICAgLy8gd2UgZG9uJ3Qgd2Fu
dCB0byBjaGFuZ2UgdGhlIG1vYyBiYXNlZCBvbiBVU0UoKSBtYWNybywgc28gdGhpcyBmdW5jdGlv
biBpcyBoZXJlCisgICAgLy8gYnV0IHdpbGwgYmUgZW1wdHkgaWYgQUNDTEVSQVRFRF9DT01QT1NJ
VElORyBpcyBkaXNhYmxlZAorICAgIFFfUFJJVkFURV9TTE9UKGQsIHZvaWQgc3luY0xheWVycygp
KQogCiAgICAgUUdyYXBoaWNzV2ViVmlld1ByaXZhdGUqIGNvbnN0IGQ7CiAgICAgZnJpZW5kIGNs
YXNzIFFHcmFwaGljc1dlYlZpZXdQcml2YXRlOwpJbmRleDogV2ViS2l0L3F0L0FwaS9xd2Vic2V0
dGluZ3MuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdC9xdC9BcGkvcXdlYnNldHRpbmdzLmNwcAko
cmV2aXNpb24gNTM0MjcpCisrKyBXZWJLaXQvcXQvQXBpL3F3ZWJzZXR0aW5ncy5jcHAJKHdvcmtp
bmcgY29weSkKQEAgLTE1Miw3ICsxNTIsMTIgQEAgdm9pZCBRV2ViU2V0dGluZ3NQcml2YXRlOjph
cHBseSgpCiAgICAgICAgIHZhbHVlID0gYXR0cmlidXRlcy52YWx1ZShRV2ViU2V0dGluZ3M6Okph
dmFzY3JpcHRFbmFibGVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBn
bG9iYWwtPmF0dHJpYnV0ZXMudmFsdWUoUVdlYlNldHRpbmdzOjpKYXZhc2NyaXB0RW5hYmxlZCkp
OwogICAgICAgICBzZXR0aW5ncy0+c2V0SmF2YVNjcmlwdEVuYWJsZWQodmFsdWUpOworI2lmIFVT
RShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKKyAgICAgICAgdmFsdWUgPSBhdHRyaWJ1dGVzLnZh
bHVlKFFXZWJTZXR0aW5nczo6QWNjZWxlcmF0ZWRDb21wb3NpdGluZ0VuYWJsZWQsCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbC0+YXR0cmlidXRlcy52YWx1ZShR
V2ViU2V0dGluZ3M6OkFjY2VsZXJhdGVkQ29tcG9zaXRpbmdFbmFibGVkKSk7CiAKKyAgICAgICAg
c2V0dGluZ3MtPnNldEFjY2VsZXJhdGVkQ29tcG9zaXRpbmdFbmFibGVkKHZhbHVlKTsKKyNlbmRp
ZgogICAgICAgICB2YWx1ZSA9IGF0dHJpYnV0ZXMudmFsdWUoUVdlYlNldHRpbmdzOjpKYXZhc2Ny
aXB0Q2FuT3BlbldpbmRvd3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGdsb2JhbC0+YXR0cmlidXRlcy52YWx1ZShRV2ViU2V0dGluZ3M6OkphdmFzY3JpcHRDYW5PcGVu
V2luZG93cykpOwogICAgICAgICBzZXR0aW5ncy0+c2V0SmF2YVNjcmlwdENhbk9wZW5XaW5kb3dz
QXV0b21hdGljYWxseSh2YWx1ZSk7CkBAIC0zODksNiArMzk0LDcgQEAgUVdlYlNldHRpbmdzOjpR
V2ViU2V0dGluZ3MoKQogICAgIGQtPmF0dHJpYnV0ZXMuaW5zZXJ0KFFXZWJTZXR0aW5nczo6T2Zm
bGluZVdlYkFwcGxpY2F0aW9uQ2FjaGVFbmFibGVkLCBmYWxzZSk7CiAgICAgZC0+YXR0cmlidXRl
cy5pbnNlcnQoUVdlYlNldHRpbmdzOjpMb2NhbFN0b3JhZ2VFbmFibGVkLCBmYWxzZSk7CiAgICAg
ZC0+YXR0cmlidXRlcy5pbnNlcnQoUVdlYlNldHRpbmdzOjpMb2NhbENvbnRlbnRDYW5BY2Nlc3NS
ZW1vdGVVcmxzLCBmYWxzZSk7CisgICAgZC0+YXR0cmlidXRlcy5pbnNlcnQoUVdlYlNldHRpbmdz
OjpBY2NlbGVyYXRlZENvbXBvc2l0aW5nRW5hYmxlZCwgZmFsc2UpOwogICAgIGQtPm9mZmxpbmVT
dG9yYWdlRGVmYXVsdFF1b3RhID0gNSAqIDEwMjQgKiAxMDI0OwogICAgIGQtPmRlZmF1bHRUZXh0
RW5jb2RpbmcgPSBRTGF0aW4xU3RyaW5nKCJpc28tODg1OS0xIik7CiB9CkluZGV4OiBXZWJLaXQv
cXQvQXBpL3F3ZWJzZXR0aW5ncy5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdC9xdC9BcGkvcXdlYnNl
dHRpbmdzLmgJKHJldmlzaW9uIDUzNDI3KQorKysgV2ViS2l0L3F0L0FwaS9xd2Vic2V0dGluZ3Mu
aAkod29ya2luZyBjb3B5KQpAQCAtNjgsNyArNjgsOCBAQCBwdWJsaWM6CiAjZW5kaWYKICAgICAg
ICAgTG9jYWxDb250ZW50Q2FuQWNjZXNzUmVtb3RlVXJscywKICAgICAgICAgRG5zUHJlZmV0Y2hF
bmFibGVkLAotICAgICAgICBYU1NBdWRpdG9yRW5hYmxlZAorICAgICAgICBYU1NBdWRpdG9yRW5h
YmxlZCwKKyAgICAgICAgQWNjZWxlcmF0ZWRDb21wb3NpdGluZ0VuYWJsZWQKICAgICB9OwogICAg
IGVudW0gV2ViR3JhcGhpYyB7CiAgICAgICAgIE1pc3NpbmdJbWFnZUdyYXBoaWMsCkluZGV4OiBX
ZWJLaXQvcXQvQXBpL3F3ZWJ2aWV3LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQvcXQvQXBpL3F3
ZWJ2aWV3LmNwcAkocmV2aXNpb24gNTM0MjcpCisrKyBXZWJLaXQvcXQvQXBpL3F3ZWJ2aWV3LmNw
cAkod29ya2luZyBjb3B5KQpAQCAtMjIsMTAgKzIyLDExIEBACiAjaW5jbHVkZSAiY29uZmlnLmgi
CiAjaW5jbHVkZSAicXdlYnZpZXcuaCIKIAorI2luY2x1ZGUgIlBhZ2UuaCIKICNpbmNsdWRlICJR
V2ViUGFnZUNsaWVudC5oIgorI2luY2x1ZGUgIlNldHRpbmdzLmgiCiAjaW5jbHVkZSAicXdlYmZy
YW1lLmgiCiAjaW5jbHVkZSAicXdlYnBhZ2VfcC5oIgotCiAjaW5jbHVkZSAicWJpdG1hcC5oIgog
I2luY2x1ZGUgInFldmVudC5oIgogI2luY2x1ZGUgInFwYWludGVyLmgiCkBAIC0yNDcsNiArMjQ4
LDkgQEAgdm9pZCBRV2ViVmlldzo6c2V0UGFnZShRV2ViUGFnZSogcGFnZSkKICAgICAgICAgICAg
ICAgICB0aGlzLCBTTE9UKF9xX3BhZ2VEZXN0cm95ZWQoKSkpOwogICAgIH0KICAgICBzZXRBdHRy
aWJ1dGUoUXQ6OldBX09wYXF1ZVBhaW50RXZlbnQsIGQtPnBhZ2UpOworI2lmIFVTRShBQ0NFTEVS
QVRFRF9DT01QT1NJVElORykKKyAgICBkLT5wYWdlLT5kLT5wYWdlLT5zZXR0aW5ncygpLT5zZXRB
Y2NlbGVyYXRlZENvbXBvc2l0aW5nRW5hYmxlZChmYWxzZSk7CisjZW5kaWYKICAgICB1cGRhdGUo
KTsKIH0KIApJbmRleDogV2ViS2l0L3F0L1FHVkxhdW5jaGVyL21haW4uY3BwCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFdlYktpdC9xdC9RR1ZMYXVuY2hlci9tYWluLmNwcAkocmV2aXNpb24gNTM0MjcpCisrKyBX
ZWJLaXQvcXQvUUdWTGF1bmNoZXIvbWFpbi5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTcyLDYgKzcy
LDggQEAgcHVibGljOgogICAgIFdlYlZpZXcoUUdyYXBoaWNzSXRlbSogcGFyZW50ID0gMCkKICAg
ICAgICAgOiBRR3JhcGhpY3NXZWJWaWV3KHBhcmVudCkKICAgICB7CisgICAgICAgIGlmIChRQXBw
bGljYXRpb246Omluc3RhbmNlKCktPmFyZ3VtZW50cygpLmNvbnRhaW5zKCItLWNhY2hlV2ViVmll
dyIpKQorICAgICAgICAgICAgc2V0Q2FjaGVNb2RlKFFHcmFwaGljc0l0ZW06OkRldmljZUNvb3Jk
aW5hdGVDYWNoZSk7CiAgICAgfQogICAgIHZvaWQgc2V0WVJvdGF0aW9uKHFyZWFsIGFuZ2xlKQog
ICAgIHsKQEAgLTI1Myw2ICsyNTUsMTIgQEAgcHVibGljOgogICAgICAgICBzZXRBdHRyaWJ1dGUo
UXQ6OldBX0RlbGV0ZU9uQ2xvc2UpOwogCiAgICAgICAgIHZpZXctPnNldFNjZW5lKHNjZW5lLT5z
Y2VuZSgpKTsKKyAgICAgICAgY29uc3QgUVN0cmluZ0xpc3QgYXJndW1lbnRzID0gUUFwcGxpY2F0
aW9uOjppbnN0YW5jZSgpLT5hcmd1bWVudHMoKTsKKyAgICAgICAgY29uc3QgaW50IGluZGV4T2ZW
aWV3cG9ydFVwZGF0ZU1vZGUgPSBhcmd1bWVudHMuaW5kZXhPZigiLS11cGRhdGVNb2RlIik7Cisg
ICAgICAgIGlmIChpbmRleE9mVmlld3BvcnRVcGRhdGVNb2RlID4gMSAmJiBpbmRleE9mVmlld3Bv
cnRVcGRhdGVNb2RlIDwgYXJndW1lbnRzLmNvdW50KCkgLSAxKSB7CisgICAgICAgICAgICBjb25z
dCBRU3RyaW5nIHVwZGF0ZU1vZGUgPSBhcmd1bWVudHNbaW5kZXhPZlZpZXdwb3J0VXBkYXRlTW9k
ZSsxXSArICJWaWV3cG9ydFVwZGF0ZSI7CisgICAgICAgICAgICB2aWV3LT5zZXRWaWV3cG9ydFVw
ZGF0ZU1vZGUoc3RhdGljX2Nhc3Q8UUdyYXBoaWNzVmlldzo6Vmlld3BvcnRVcGRhdGVNb2RlPihR
R3JhcGhpY3NWaWV3OjpzdGF0aWNNZXRhT2JqZWN0LmVudW1lcmF0b3IoUUdyYXBoaWNzVmlldzo6
c3RhdGljTWV0YU9iamVjdC5pbmRleE9mRW51bWVyYXRvcigiVmlld3BvcnRVcGRhdGVNb2RlIikp
LmtleXNUb1ZhbHVlKHVwZGF0ZU1vZGUudG9Bc2NpaSgpKSkpOworICAgICAgICB9CiAKICAgICAg
ICAgc2V0Q2VudHJhbFdpZGdldCh2aWV3KTsKIApAQCAtNDQ3LDYgKzQ1NSwxMCBAQCBRV2ViUGFn
ZSogV2ViUGFnZTo6Y3JlYXRlV2luZG93KFFXZWJQYWdlCiBpbnQgbWFpbihpbnQgYXJnYywgY2hh
cioqIGFyZ3YpCiB7CiAgICAgUUFwcGxpY2F0aW9uIGFwcChhcmdjLCBhcmd2KTsKKyAgICBpZiAo
YXBwLmFyZ3VtZW50cygpLmNvbnRhaW5zKCItLWhlbHAiKSkgeworICAgICAgICBxRGVidWcoKSA8
PCAiVXNhZ2U6IFFHVkxhdW5jaGVyIFstLXVybCB1cmxdIFstLWNvbXBvc2l0aW5nXSBbLS11cGRh
dGVNb2RlIEZ1bGx8TWluaW1hbHxTbWFydHxOb3xCb3VuZGluZ1JlY3RdIFstLWNhY2hlV2ViVmll
d11cbiI7CisgICAgICAgIHJldHVybiAwOworICAgIH0KICAgICBRU3RyaW5nIHVybCA9IFFTdHJp
bmcoImZpbGU6Ly8lMS8lMiIpLmFyZyhRRGlyOjpob21lUGF0aCgpKS5hcmcoUUxhdGluMVN0cmlu
ZygiaW5kZXguaHRtbCIpKTsKIAogICAgIGFwcC5zZXRBcHBsaWNhdGlvbk5hbWUoIkdRVkxhdW5j
aGVyIik7CkBAIC00NTgsMTQgKzQ3MCwyMCBAQCBpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFy
Z3YpCiAgICAgUVdlYlNldHRpbmdzOjplbmFibGVQZXJzaXN0ZW50U3RvcmFnZSgpOwogCiAgICAg
Y29uc3QgUVN0cmluZ0xpc3QgYXJncyA9IGFwcC5hcmd1bWVudHMoKTsKLSAgICBpZiAoYXJncy5j
b3VudCgpID4gMSkKKyAgICBjb25zdCBpbnQgaW5kZXhPZlVybCA9IGFyZ3MuaW5kZXhPZigiLS11
cmwiKTsKKyAgICBpZiAoaW5kZXhPZlVybCA+IDAgJiYgaW5kZXhPZlVybCA8IGFyZ3MuY291bnQo
KSAtIDEpCisgICAgICAgIHVybCA9IGFyZ3MuYXQoaW5kZXhPZlVybCsxKTsKKyAgICBlbHNlIGlm
IChhcmdzLmNvdW50KCkgPiAxKQogICAgICAgICB1cmwgPSBhcmdzLmF0KDEpOworICAgIGlmIChh
cmdzLmNvbnRhaW5zKCItLWNvbXBvc2l0aW5nIikpCisgICAgICAgIFFXZWJTZXR0aW5nczo6Z2xv
YmFsU2V0dGluZ3MoKS0+c2V0QXR0cmlidXRlKFFXZWJTZXR0aW5nczo6QWNjZWxlcmF0ZWRDb21w
b3NpdGluZ0VuYWJsZWQsIHRydWUpOwogCiAgICAgTWFpbldpbmRvdyogd2luZG93ID0gbmV3IE1h
aW5XaW5kb3c7CiAgICAgd2luZG93LT5sb2FkKHVybCk7CiAKLSAgICBmb3IgKGludCBpID0gMjsg
aSA8IGFyZ3MuY291bnQoKTsgaSsrKQotICAgICAgICB3aW5kb3ctPm5ld1dpbmRvdyhhcmdzLmF0
KGkpKTsKKyAgICBmb3IgKGludCBpID0gMjsgaSA8IGFyZ3MuY291bnQoKTsgKytpKQorICAgICAg
ICBpZiAoIWFyZ3MuYXQoaSkuc3RhcnRzV2l0aCgiLSIpICYmICFhcmdzLmF0KGkgLSAxKS5zdGFy
dHNXaXRoKCItIikpCisgICAgICAgICAgICB3aW5kb3ctPm5ld1dpbmRvdyhhcmdzLmF0KGkpKTsK
IAogICAgIHdpbmRvdy0+c2hvdygpOwogICAgIHJldHVybiBhcHAuZXhlYygpOwpJbmRleDogV2Vi
S2l0L3F0L1dlYkNvcmVTdXBwb3J0L0Nocm9tZUNsaWVudFF0LmNwcAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBX
ZWJLaXQvcXQvV2ViQ29yZVN1cHBvcnQvQ2hyb21lQ2xpZW50UXQuY3BwCShyZXZpc2lvbiA1MzQy
NykKKysrIFdlYktpdC9xdC9XZWJDb3JlU3VwcG9ydC9DaHJvbWVDbGllbnRRdC5jcHAJKHdvcmtp
bmcgY29weSkKQEAgLTI1LDYgKzI1LDcgQEAKICAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBP
VEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQogICogT0YgVEhJUyBT
T0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFH
RS4KICAqLworCiAjaW5jbHVkZSAiY29uZmlnLmgiCiAjaW5jbHVkZSAiQ2hyb21lQ2xpZW50UXQu
aCIKIApAQCAtNDIsNiArNDMsMTAgQEAKICNpbmNsdWRlICJRV2ViUGFnZUNsaWVudC5oIgogI2lu
Y2x1ZGUgIlNlY3VyaXR5T3JpZ2luLmgiCiAKKyNpbmNsdWRlIDxxZGVidWcuaD4KKyNpbmNsdWRl
IDxxdGV4dGRvY3VtZW50Lmg+CisjaW5jbHVkZSA8cXRvb2x0aXAuaD4KKwogI2luY2x1ZGUgInF3
ZWJwYWdlLmgiCiAjaW5jbHVkZSAicXdlYnBhZ2VfcC5oIgogI2luY2x1ZGUgInF3ZWJmcmFtZV9w
LmgiCkBAIC00OSwxMiArNTQsMTEgQEAKICNpbmNsdWRlICJxd2Vic2VjdXJpdHlvcmlnaW5fcC5o
IgogI2luY2x1ZGUgInF3ZWJ2aWV3LmgiCiAKLSNpbmNsdWRlIDxxdG9vbHRpcC5oPgotI2luY2x1
ZGUgPHF0ZXh0ZG9jdW1lbnQuaD4KLQotbmFtZXNwYWNlIFdlYkNvcmUKLXsKKyNpZiBVU0UoQUND
RUxFUkFURURfQ09NUE9TSVRJTkcpCisjaW5jbHVkZSAiR3JhcGhpY3NMYXllclF0LmgiCisjZW5k
aWYKIAorbmFtZXNwYWNlIFdlYkNvcmUgewogCiBDaHJvbWVDbGllbnRRdDo6Q2hyb21lQ2xpZW50
UXQoUVdlYlBhZ2UqIHdlYlBhZ2UpCiAgICAgOiBtX3dlYlBhZ2Uod2ViUGFnZSkKQEAgLTQ2Niw2
ICs0NzAsMjggQEAgdm9pZCBDaHJvbWVDbGllbnRRdDo6cmVxdWVzdEdlb2xvY2F0aW9uUAogICAg
IG5vdEltcGxlbWVudGVkKCk7CiB9CiAKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcp
Cit2b2lkIENocm9tZUNsaWVudFF0OjphdHRhY2hSb290R3JhcGhpY3NMYXllcihGcmFtZSogZnJh
bWUsIEdyYXBoaWNzTGF5ZXIqIGdyYXBoaWNzTGF5ZXIpCit7ICAgIAorICAgIGlmIChwbGF0Zm9y
bVBhZ2VDbGllbnQoKSkKKyAgICAgICAgcGxhdGZvcm1QYWdlQ2xpZW50KCktPnNldFJvb3RHcmFw
aGljc0xheWVyKGdyYXBoaWNzTGF5ZXIgPyBncmFwaGljc0xheWVyLT5uYXRpdmVMYXllcigpIDog
MCk7Cit9CisKK3ZvaWQgQ2hyb21lQ2xpZW50UXQ6OnNldE5lZWRzT25lU2hvdERyYXdpbmdTeW5j
aHJvbml6YXRpb24oKQoreworICAgIC8vIHdlIHdhbnQgdGhlIGxheWVycyB0byBzeW5jaHJvbml6
ZSBuZXh0IHRpbWUgd2UgdXBkYXRlIHRoZSBzY3JlZW4gYW55d2F5CisgICAgaWYgKHBsYXRmb3Jt
UGFnZUNsaWVudCgpKQorICAgICAgICBwbGF0Zm9ybVBhZ2VDbGllbnQoKS0+bWFya0ZvclN5bmMo
ZmFsc2UpOworfQorCit2b2lkIENocm9tZUNsaWVudFF0OjpzY2hlZHVsZUNvbXBvc2l0aW5nTGF5
ZXJTeW5jKCkKK3sKKyAgICAvLyB3ZSB3YW50IHRoZSBsYXllcnMgdG8gc3luY2hyb25pemUgQVNB
UAorICAgIGlmIChwbGF0Zm9ybVBhZ2VDbGllbnQoKSkKKyAgICAgICAgcGxhdGZvcm1QYWdlQ2xp
ZW50KCktPm1hcmtGb3JTeW5jKHRydWUpOworfQorI2VuZGlmCisKIFF0QWJzdHJhY3RXZWJQb3B1
cCogQ2hyb21lQ2xpZW50UXQ6OmNyZWF0ZVBvcHVwKCkKIHsKICAgICByZXR1cm4gbmV3IFF0RmFs
bGJhY2tXZWJQb3B1cDsKSW5kZXg6IFdlYktpdC9xdC9XZWJDb3JlU3VwcG9ydC9DaHJvbWVDbGll
bnRRdC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdC9xdC9XZWJDb3JlU3VwcG9ydC9DaHJvbWVDbGll
bnRRdC5oCShyZXZpc2lvbiA1MzQyNykKKysrIFdlYktpdC9xdC9XZWJDb3JlU3VwcG9ydC9DaHJv
bWVDbGllbnRRdC5oCSh3b3JraW5nIGNvcHkpCkBAIC0xMjMsNiArMTIzLDE1IEBAIG5hbWVzcGFj
ZSBXZWJDb3JlIHsKICNpZiBFTkFCTEUoT0ZGTElORV9XRUJfQVBQTElDQVRJT05TKQogICAgICAg
ICB2aXJ0dWFsIHZvaWQgcmVhY2hlZE1heEFwcENhY2hlU2l6ZShpbnQ2NF90IHNwYWNlTmVlZGVk
KTsKICNlbmRpZgorCisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorICAgICAgICAv
LyBzZWUgQ2hyb21lQ2xpZW50LmgKKyAgICAgICAgLy8gdGhpcyBpcyBhIGhvb2sgZm9yIFdlYkNv
cmUgdG8gdGVsbCB1cyB3aGF0IHdlIG5lZWQgdG8gZG8gd2l0aCB0aGUgR3JhcGhpY3NMYXllcnMK
KyAgICAgICAgdmlydHVhbCB2b2lkIGF0dGFjaFJvb3RHcmFwaGljc0xheWVyKEZyYW1lKiwgR3Jh
cGhpY3NMYXllciopOworICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0TmVlZHNPbmVTaG90RHJhd2lu
Z1N5bmNocm9uaXphdGlvbigpOworICAgICAgICB2aXJ0dWFsIHZvaWQgc2NoZWR1bGVDb21wb3Np
dGluZ0xheWVyU3luYygpOworI2VuZGlmCisKICAgICAgICAgdmlydHVhbCB2b2lkIHJ1bk9wZW5Q
YW5lbChGcmFtZSosIFBhc3NSZWZQdHI8RmlsZUNob29zZXI+KTsKIAogICAgICAgICB2aXJ0dWFs
IHZvaWQgZm9ybVN0YXRlRGlkQ2hhbmdlKGNvbnN0IE5vZGUqKSB7IH0K
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>47034</attachid>
            <date>2010-01-20 07:55:22 -0800</date>
            <delta_ts>2010-01-20 08:29:56 -0800</delta_ts>
            <desc>accelerated composition layers in Qt: +Still had a stray tab +removed unnecessary static_cast</desc>
            <filename>patch-GraphicsLayerQt-4.diff</filename>
            <type>text/plain</type>
            <size>76696</size>
            <attacher name="Noam Rosenthal">noam</attacher>
            
              <data encoding="base64">SW5kZXg6IENoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBDaGFuZ2VMb2cJKHJldmlzaW9uIDUzNTI0
KQorKysgQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMTMgQEAKKzIwMTAtMDEt
MTkgIE5vJ2FtIFJvc2VudGhhbCAgPG5vYW0ucm9zZW50aGFsQG5va2lhLmNvbT4KKworICAgICAg
ICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBbUXRdIEltcGxlbWVudCBH
cmFwaGljc0xheWVyIGZvciBhY2NlbGVyYXRlZCBsYXllciBjb21wb3NpdGluZworICAgICAgICBo
dHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MzM1MTQKKworICAgICAgICAq
IFdlYktpdC5wcmk6IEFkZGRlZCBjb21waWxlIGZsYWdzIHRvIGVuYWJsZSBhY2NlbGVyYXRlZCBj
b21wb3NpdGluZworICAgICAgICBvbiB2ZXJzaW9ucyBoaWdoZXIgdGhhbiA0LjUKKwogMjAxMC0w
MS0xOSAgR3VzdGF2byBOb3JvbmhhIFNpbHZhICA8Z25zQGdub21lLm9yZz4KIAogICAgICAgICBV
bnJldmlld2VkLiBTaGFyZWQgbGlicmFyeSB2ZXJzaW9uaW5nIHVwZGF0ZSBmb3IgMS4xLjE5LgpJ
bmRleDogV2ViS2l0LnByaQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQucHJpCShyZXZpc2lvbiA1MzQy
NykKKysrIFdlYktpdC5wcmkJKHdvcmtpbmcgY29weSkKQEAgLTQ1LDYgKzQ1LDcgQEAgYnVpbGRp
bmctbGlicyB7CiAgICAgfQogICAgIERFUEVORFBBVEggKz0gJCRQV0QvV2ViS2l0L3F0L0FwaQog
fQorZ3JlYXRlclRoYW4oUVRfTUlOT1JfVkVSU0lPTiwgNSk6REVGSU5FUyArPSBXVEZfVVNFX0FD
Q0VMRVJBVEVEX0NPTVBPU0lUSU5HCiAKICFtYWM6IXVuaXh8c3ltYmlhbiB7CiAgICAgREVGSU5F
UyArPSBVU0VfU1lTVEVNX01BTExPQwpJbmRleDogV2ViQ29yZS9DaGFuZ2VMb2cKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gV2ViQ29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDUzNTIzKQorKysgV2ViQ29yZS9DaGFu
Z2VMb2cJKHdvcmtpbmcgY29weSkKQEAgLTEsMyArMSwxMTQgQEAKKzIwMTAtMDEtMTkgIE5vJ2Ft
IFJvc2VudGhhbCAgPG5vYW0ucm9zZW50aGFsQG5va2lhLmNvbT4KKworICAgICAgICBSZXZpZXdl
ZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBbUXRdIEltcGxlbWVudCBHcmFwaGljc0xh
eWVyIGZvciBhY2NlbGVyYXRlZCBsYXllciBjb21wb3NpdGluZworICAgICAgICBodHRwczovL2J1
Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MzM1MTQKKworICAgICAgICBObyBuZXcgdGVz
dHM6IHRlc3RzIGluIExheW91dFRlc3RzL2NvbXBvc2l0aW5nIGFyZSBub3cgcmVsZXZhbnQgZm9y
CisgICAgICAgIFF0V2Via2l0IQorCisgICAgICAgICogV2ViQ29yZS5wcm86IGFkZGVkIGFjY2Vs
ZXJhdGVkLWNvbXBvc2l0aW5nIHJlbGF0ZWQgZmlsZXMgCisgICAgICAgICogcGxhdGZvcm0vZ3Jh
cGhpY3MvR3JhcGhpY3NMYXllci5oOiBkZWZpbmUgUXQtc3BlY2lmaWMgaW1wbGVtZW50YXRpb24g
ICAgICAgICAgIG9mIEdyYXBoaWNzTGF5ZXIKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9x
dC9HcmFwaGljc0xheWVyUXQuY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNz
TGF5ZXJRdEltcGw6Oik6IEltcGxlbWVudGF0aW9uIG9mIEdyYXBoaWNzTGF5ZXIgd2l0aAorICAg
ICAgICBhIFFHcmFwaGljc0l0ZW0KKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJRdElt
cGw6OkNvbnRlbnREYXRhOjpDb250ZW50RGF0YSk6IHNhdmUgCisgICAgICAgIHBpeG1hcC9jb2xv
ciBpbmZvIGZvciBkaXJlY3RseSBjb21wb3NpdGVkIGNvbnRlbnQKKyAgICAgICAgKFdlYkNvcmU6
OkdyYXBoaWNzTGF5ZXJRdEltcGw6OlN0YXRlOjpTdGF0ZSk6IHNhdmUgaW5mbyBmb3Igc3luY2lu
ZworICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllclF0SW1wbDo6R3JhcGhpY3NMYXllclF0
SW1wbCk6IGN0b3IKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJRdEltcGw6On5HcmFw
aGljc0xheWVyUXRJbXBsKTogZHRvcgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllclF0
SW1wbDo6c2V0QmFzZVRyYW5zZm9ybSk6IHNldCBRdAorICAgICAgICB0cmFuc2Zvcm1hdGlvbiBp
biB0aGUgd2F5IFdlYkNvcmUgd2FudHMgaXQKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5
ZXJRdEltcGw6Om9wYXF1ZUFyZWEpOiBjYWxjdWxhdGUgb3BhcXVlIGFyZWEKKyAgICAgICAgYmFz
ZWQgb24gaW5mbyB3ZSBoYXZlCisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0xheWVyUXRJbXBs
Ojpib3VuZGluZ1JlY3QpOiByZWltcCBRR3JhcGhpY3NJdGVtCisgICAgICAgIChXZWJDb3JlOjpH
cmFwaGljc0xheWVyUXRJbXBsOjpwYWludCk6IHJlaW1wIFFHcmFwaGljc0l0ZW0KKyAgICAgICAg
KFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJRdEltcGw6OmRyYXdDb250ZW50cyk6IGRyYXcgSFRNTC9Q
aXhtYXAvQ29sb3IKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJRdEltcGw6Om5vdGlm
eUNoYW5nZSk6IGxldCBXZWJDb3JlIGtub3cKKyAgICAgICAgc29tZXRoaW5nIGhhcyBjaGFuZ2Vk
CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0xheWVyUXRJbXBsOjpmbHVzaENoYW5nZXMpOiBN
YWtlIHRoZSBjaGFuZ2VzIGFwcGVhcgorICAgICAgICBvbiBzY3JlZW4gYnkgc2V0dGluZyB0aGVt
IHRvIFFHcmFwaGljc0l0ZW1zCisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0xheWVyUXRJbXBs
Ojpub3RpZnlBbmltYXRpb25TdGFydGVkKTogbGV0IFdlYkNvcmUKKyAgICAgICAga25vdyB0aGUg
UUFuaW1hdGlvbiBzdGFydGVkCisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0xheWVyUXQ6Okdy
YXBoaWNzTGF5ZXJRdCk6IGN0b3IKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJRdDo6
fkdyYXBoaWNzTGF5ZXJRdCk6IGR0b3IKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXI6
OmNyZWF0ZSk6IGhvb2sgZm9yIFdlYkNvcmUgdG8ga25vdyB3ZSdyZQorICAgICAgICBpbXBsZW1l
bnRpbmcgY29tcG9zaXRpbmcKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXI6OmNvbXBv
c2l0aW5nQ29vcmRpbmF0ZXNPcmllbnRhdGlvbik6IGhvb2sgZm9yCisgICAgICAgIFdlYkNvcmUg
dG8ga25vdyB3ZSB1c2UgYSB0b3AtZG93biBzeXN0ZW0KKyAgICAgICAgKFdlYkNvcmU6OkdyYXBo
aWNzTGF5ZXJRdDo6c2V0TmVlZHNEaXNwbGF5KTogdXBkYXRlIHRoZSBkaXNwbGF5CisgICAgICAg
IChXZWJDb3JlOjpHcmFwaGljc0xheWVyUXQ6OnNldE5lZWRzRGlzcGxheUluUmVjdCk6IHVkcGF0
ZSBwYXJ0IG9mIHRoZQorICAgICAgICBkaXNwbGF5CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGlj
c0xheWVyUXQ6OnNldE5hbWUpOiByZWltcAorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXll
clF0OjpzZXRQYXJlbnQpOiByZWltcAorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllclF0
OjpzZXRDaGlsZHJlbik6IHJlaW1wCisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0xheWVyUXQ6
OmFkZENoaWxkKTogcmVpbXAKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJRdDo6YWRk
Q2hpbGRBdEluZGV4KTogcmVpbXAKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJRdDo6
YWRkQ2hpbGRBYm92ZSk6IHJlaW1wCisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0xheWVyUXQ6
OmFkZENoaWxkQmVsb3cpOiByZWltcAorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllclF0
OjpyZXBsYWNlQ2hpbGQpOiByZWltcAorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllclF0
OjpyZW1vdmVGcm9tUGFyZW50KTogcmVpbXAKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5
ZXJRdDo6c2V0TWFza0xheWVyKTogcmVpbXAKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5
ZXJRdDo6c2V0UG9zaXRpb24pOiByZWltcAorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXll
clF0OjpzZXRBbmNob3JQb2ludCk6IHJlaW1wCisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0xh
eWVyUXQ6OnNldFNpemUpOiByZWltcAorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllclF0
OjpzZXRUcmFuc2Zvcm0pOiByZWltcAorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllclF0
OjpzZXRDaGlsZHJlblRyYW5zZm9ybSk6IHJlaW1wCisgICAgICAgIChXZWJDb3JlOjpHcmFwaGlj
c0xheWVyUXQ6OnNldFByZXNlcnZlczNEKTogcmVpbXAKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBo
aWNzTGF5ZXJRdDo6c2V0TWFza3NUb0JvdW5kcyk6IHJlaW1wCisgICAgICAgIChXZWJDb3JlOjpH
cmFwaGljc0xheWVyUXQ6OnNldERyYXdzQ29udGVudCk6IHJlaW1wCisgICAgICAgIChXZWJDb3Jl
OjpHcmFwaGljc0xheWVyUXQ6OnNldEJhY2tncm91bmRDb2xvcik6IHJlaW1wCisgICAgICAgIChX
ZWJDb3JlOjpHcmFwaGljc0xheWVyUXQ6OmNsZWFyQmFja2dyb3VuZENvbG9yKTogcmVpbXAKKyAg
ICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJRdDo6c2V0Q29udGVudHNPcGFxdWUpOiByZWlt
cAorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllclF0OjpzZXRCYWNrZmFjZVZpc2liaWxp
dHkpOiByZWltcAorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllclF0OjpzZXRPcGFjaXR5
KTogcmVpbXAKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJRdDo6c2V0Q29udGVudHNS
ZWN0KTogcmVpbXAKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJRdDo6c2V0Q29udGVu
dHNUb0ltYWdlKTogcmVpbXAKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJRdDo6c2V0
Q29udGVudHNCYWNrZ3JvdW5kQ29sb3IpOiByZWltcAorICAgICAgICAoV2ViQ29yZTo6R3JhcGhp
Y3NMYXllclF0OjpzZXRHZW9tZXRyeU9yaWVudGF0aW9uKTogcmVpbXAKKyAgICAgICAgKFdlYkNv
cmU6OkdyYXBoaWNzTGF5ZXJRdDo6c2V0Q29udGVudHNPcmllbnRhdGlvbik6IHJlaW1wCisgICAg
ICAgIChXZWJDb3JlOjpHcmFwaGljc0xheWVyUXQ6OmRpc3RyaWJ1dGVPcGFjaXR5KTogcmVpbXAK
KyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJRdDo6YWNjdW11bGF0ZWRPcGFjaXR5KTog
cmVpbXAKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJRdDo6c3luY0NvbXBvc2l0aW5n
U3RhdGUpOiByZWltcAorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllclF0OjpuYXRpdmVM
YXllcik6IHJlaW1wIChRR3JhcGhpY3NJdGVtKikKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNz
TGF5ZXJRdDo6cGxhdGZvcm1MYXllcik6IHJlaW1wIChRR3JhcGhpY3NJdGVtKikKKyAgICAgICAg
KFdlYkNvcmU6OnNvbHZlRXBzaWxvbik6IGNvcHkgZnJvbSBBbmltYXRpb25CYXNlLmNwcAorICAg
ICAgICAoV2ViQ29yZTo6c29sdmVDdWJpY0JlemllckZ1bmN0aW9uKTogY29weSBmcm9tIEFuaWFt
dGlvbkJhc2UuY3BwCisgICAgICAgIChXZWJDb3JlOjphcHBseVRpbWluZ0Z1bmN0aW9uKTogdXNl
IFdlYkNvcmUncyB0aW1pbmcgYW5kIG5vdCBRdCdzCisgICAgICAgIChXZWJDb3JlOjp3ZWJraXRB
bmltYXRpb25Ub1F0QW5pbWF0aW9uVmFsdWUpOiBzYWZlbHkgZmlndXJlIG91dAorICAgICAgICBh
bmltYXRpb24gdmFsdWVzCisgICAgICAgIChXZWJDb3JlOjpBbmltYXRpb25RdEJhc2U6OkFuaW1h
dGlvblF0QmFzZSk6IGJhc2UgY2xhc3MgZm9yIFF0LWJhc2VkCisgICAgICAgIFdlYmNvcmUtaW5p
dGlhdGVkIGFuaW1hdGlvbnMKKyAgICAgICAgKFdlYkNvcmU6OkFuaW1hdGlvblF0QmFzZTo6dXBk
YXRlU3RhdGUpOiBub3RpZnkgd2hlbiBhbiBhbmltYXRpb24KKyAgICAgICAgc3RhcnRzCisgICAg
ICAgIChXZWJDb3JlOjpBbmltYXRpb25RdEJhc2U6OmR1cmF0aW9uKTogcmVpbXAgUUFic3RyYWN0
QW5pbWF0aW9uCisgICAgICAgIChXZWJDb3JlOjpBbmltYXRpb25RdDo6OkFuaW1hdGlvblF0QmFz
ZSk6CisgICAgICAgIChXZWJDb3JlOjpBbmltYXRpb25RdDo6dXBkYXRlQ3VycmVudFRpbWUpOiBy
ZWFsaXplIGtleWZyYW1lcyBmcm9tCisgICAgICAgIHByb2dyZXNzCisgICAgICAgIChXZWJDb3Jl
OjpUcmFuc2Zvcm1BbmltYXRpb25RdDo6VHJhbnNmb3JtQW5pbWF0aW9uUXQpOiBjdG9yCisgICAg
ICAgIChXZWJDb3JlOjpUcmFuc2Zvcm1BbmltYXRpb25RdDo6flRyYW5zZm9ybUFuaW1hdGlvblF0
KTogZHRvcgorICAgICAgICAoV2ViQ29yZTo6VHJhbnNmb3JtQW5pbWF0aW9uUXQ6OmFwcGx5RnJh
bWUpOiBzZXQgdGhlIGFjdHVhbCBRVHJhbnNmb3JtCisgICAgICAgIGJhc2VkIG9uIFdlYkNvcmUg
VHJhbnNmb3JtT3BlcmF0aW9ucworICAgICAgICAoV2ViQ29yZTo6VHJhbnNmb3JtQW5pbWF0aW9u
UXQ6OnVwZGF0ZVN0YXRlKTogY2hhbmdlIGNhY2hlIG1vZGUKKyAgICAgICAgKFdlYkNvcmU6Ok9w
YWNpdHlBbmltYXRpb25RdDo6T3BhY2l0eUFuaW1hdGlvblF0KToKKyAgICAgICAgKFdlYkNvcmU6
Ok9wYWNpdHlBbmltYXRpb25RdDo6YXBwbHlGcmFtZSk6IGNoYW5nZSBpdGVtJ3Mgb3BhY2l0eQor
ICAgICAgICAoV2ViQ29yZTo6T3BhY2l0eUFuaW1hdGlvblF0Ojp1cGRhdGVTdGF0ZSk6CisgICAg
ICAgIChXZWJDb3JlOjpHcmFwaGljc0xheWVyUXQ6OmFkZEFuaW1hdGlvbik6IGNvbnZlcnQgV2Vi
Q29yZSBBbmltYXRpb24gdG8KKyAgICAgICAgUXQgQW5pbWF0aW9uCisgICAgICAgIChXZWJDb3Jl
OjpHcmFwaGljc0xheWVyUXQ6OnJlbW92ZUFuaW1hdGlvbnNGb3JQcm9wZXJ0eSk6CisgICAgICAg
IChXZWJDb3JlOjpHcmFwaGljc0xheWVyUXQ6OnJlbW92ZUFuaW1hdGlvbnNGb3JLZXlmcmFtZXMp
OgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllclF0OjpwYXVzZUFuaW1hdGlvbik6Cisg
ICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0xheWVyUXQ6OnN1c3BlbmRBbmltYXRpb25zKToKKyAg
ICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJRdDo6cmVzdW1lQW5pbWF0aW9ucyk6CisgICAg
ICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvcXQvR3JhcGhpY3NMYXllclF0Lmg6IEFkZGVkLgorICAg
ICAgICAqIHBsYXRmb3JtL3F0L1FXZWJQYWdlQ2xpZW50Lmg6IHZpcnR1YWwgZnVuY3Rpb25zIGZv
ciBRR3JhcGhpY3NXZWJWaWV3CisgICAgICAgIGNvbXBvc2l0aW5nCisgICAgICAgIChRV2ViUGFn
ZUNsaWVudDo6c2V0Um9vdEdyYXBoaWNzTGF5ZXIpOiBsZXQgUUdyYXBoaWNzV2ViVmlldyBrbm93
IHRoYXQKKyAgICAgICAgY29tcG9zaXRpbmcgaGFzIHN0YXJ0ZWQvZW5kZWQKKyAgICAgICAgKFFX
ZWJQYWdlQ2xpZW50OjptYXJrRm9yU3luYyk6IGxldCBRR3JhcGhpY3NXZWJWaWV3IGtub3cgdGhl
CisgICAgICAgIGNvbXBvc2l0aW5nIGxheWVycyBuZWVkIHRvIHN5bmMsIGVpdGhlciBzb29uIG9y
IHdpdGggdGhlIG5leHQgdXBkYXRlCisKIDIwMTAtMDEtMTkgIFNpbW9uIEZyYXNlciAgPHNpbW9u
LmZyYXNlckBhcHBsZS5jb20+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgRGFuIEJlcm5zdGVpbi4K
SW5kZXg6IFdlYkNvcmUvV2ViQ29yZS5wcm8KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9XZWJDb3Jl
LnBybwkocmV2aXNpb24gNTM0MjcpCisrKyBXZWJDb3JlL1dlYkNvcmUucHJvCSh3b3JraW5nIGNv
cHkpCkBAIC0yNzA3LDYgKzI3MDcsMTkgQEAgQ09ORklHKHN0YW5kYWxvbmVfcGFja2FnZSk6aXNF
cXVhbChRVF9NQQogICAgICAgICAgICAgcGx1Z2lucy93aW4vUGFpbnRIb29rcy5hc20KICAgICB9
CiB9Citjb250YWlucyhERUZJTkVTLCBXVEZfVVNFX0FDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKSB7
CitIRUFERVJTICs9IFwKKyAgICByZW5kZXJpbmcvUmVuZGVyTGF5ZXJCYWNraW5nLmggXAorICAg
IHJlbmRlcmluZy9SZW5kZXJMYXllckNvbXBvc2l0b3IuaCBcCisgICAgcGxhdGZvcm0vZ3JhcGhp
Y3MvR3JhcGhpY3NMYXllci5oIFwKKyAgICBwbGF0Zm9ybS9ncmFwaGljcy9HcmFwaGljc0xheWVy
Q2xpZW50LmggXAorICAgIHBsYXRmb3JtL2dyYXBoaWNzL3F0L0dyYXBoaWNzTGF5ZXJRdC5oCitT
T1VSQ0VTICs9IFwKKyAgICBwbGF0Zm9ybS9ncmFwaGljcy9HcmFwaGljc0xheWVyLmNwcCBcCisg
ICAgcGxhdGZvcm0vZ3JhcGhpY3MvcXQvR3JhcGhpY3NMYXllclF0LmNwcCBcCisgICAgcmVuZGVy
aW5nL1JlbmRlckxheWVyQmFja2luZy5jcHAgXAorICAgIHJlbmRlcmluZy9SZW5kZXJMYXllckNv
bXBvc2l0b3IuY3BwCit9CiAKIHN5bWJpYW4gewogICAgIHNoYXJlZCB7CkluZGV4OiBXZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL0dyYXBoaWNzTGF5ZXIuaAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL0dyYXBoaWNzTGF5ZXIuaAkocmV2aXNpb24gNTM0MjcpCisrKyBX
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0dyYXBoaWNzTGF5ZXIuaAkod29ya2luZyBjb3B5KQpA
QCAtNTksNiArNTksMTAgQEAgY2xhc3MgV0tDQUNGTGF5ZXI7CiB0eXBlZGVmIFdLQ0FDRkxheWVy
IFBsYXRmb3JtTGF5ZXI7CiB0eXBlZGVmIHZvaWQqIE5hdGl2ZUxheWVyOwogfQorI2VsaWYgUExB
VEZPUk0oUVQpCitjbGFzcyBRR3JhcGhpY3NJdGVtOwordHlwZWRlZiBRR3JhcGhpY3NJdGVtIFBs
YXRmb3JtTGF5ZXI7Cit0eXBlZGVmIFFHcmFwaGljc0l0ZW0qIE5hdGl2ZUxheWVyOwogI2Vsc2UK
IHR5cGVkZWYgdm9pZCogUGxhdGZvcm1MYXllcjsKIHR5cGVkZWYgdm9pZCogTmF0aXZlTGF5ZXI7
CkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3F0L0dyYXBoaWNzTGF5ZXJRdC5jcHAK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9xdC9HcmFwaGljc0xheWVy
UXQuY3BwCShyZXZpc2lvbiAwKQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9xdC9HcmFw
aGljc0xheWVyUXQuY3BwCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDExMTggQEAKKy8qCisgICAg
Q29weXJpZ2h0IChDKSAyMDA5IE5va2lhIENvcnBvcmF0aW9uIGFuZC9vciBpdHMgc3Vic2lkaWFy
eSgtaWVzKQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVk
aXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhl
IEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkg
dGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyIG9mIHRo
ZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAg
VGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1
c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGlt
cGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQ
QVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExpYnJhcnkgR2VuZXJhbCBQdWJs
aWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2Vp
dmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAg
IGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBu
b3QsIHdyaXRlIHRvCisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEg
RnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAgICBCb3N0b24sIE1BIDAyMTEwLTEzMDEs
IFVTQS4KKyovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJHcmFwaGljc0xheWVy
UXQuaCIKKworI2luY2x1ZGUgIkN1cnJlbnRUaW1lLmgiCisjaW5jbHVkZSAiRmxvYXRSZWN0Lmgi
CisjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCisjaW5jbHVkZSAiSW1hZ2UuaCIKKyNpbmNs
dWRlICJSZWZDb3VudGVkLmgiCisjaW5jbHVkZSAiVHJhbnNsYXRlVHJhbnNmb3JtT3BlcmF0aW9u
LmgiCisjaW5jbHVkZSAiVW5pdEJlemllci5oIgorI2luY2x1ZGUgPFF0Q29yZS9xYWJzdHJhY3Rh
bmltYXRpb24uaD4KKyNpbmNsdWRlIDxRdENvcmUvcWRlYnVnLmg+CisjaW5jbHVkZSA8UXRDb3Jl
L3FzZXQuaD4KKyNpbmNsdWRlIDxRdENvcmUvcXRpbWVyLmg+CisjaW5jbHVkZSA8UXRHdWkvcWJp
dG1hcC5oPgorI2luY2x1ZGUgPFF0R3VpL3Fjb2xvci5oPgorI2luY2x1ZGUgPFF0R3VpL3FncmFw
aGljc2VmZmVjdC5oPgorI2luY2x1ZGUgPFF0R3VpL3FncmFwaGljc2l0ZW0uaD4KKyNpbmNsdWRl
IDxRdEd1aS9xZ3JhcGhpY3NzY2VuZS5oPgorI2luY2x1ZGUgPFF0R3VpL3FtYXRyaXg0eDQuaD4K
KyNpbmNsdWRlIDxRdEd1aS9xcGFpbnRlci5oPgorI2luY2x1ZGUgPFF0R3VpL3FwYWxldHRlLmg+
CisjaW5jbHVkZSA8UXRHdWkvcXBpeG1hcC5oPgorI2luY2x1ZGUgPFF0R3VpL3FzdHlsZW9wdGlv
bi5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNzIEdyYXBoaWNzTGF5ZXJRdEltcGwg
OiBwdWJsaWMgUUdyYXBoaWNzT2JqZWN0IHsKKyAgICBRX09CSkVDVAorCitwdWJsaWM6CisgICAg
Ly8gdGhpcyBzZXQgb2YgZmxhZ3MgaGVscCB1cyBkZWZlciB3aGljaCBwcm9wZXJ0aWVzIG9mIHRo
ZSBsYXllciBoYXZlIGJlZW4KKyAgICAvLyBtb2RpZmllZCBieSB0aGUgY29tcG9zaXRvciwgc28g
d2UgY2FuIGtub3cgd2hhdCB0byBsb29rIGZvciBpbiB0aGUgbmV4dCBmbHVzaAorICAgIGVudW0g
Q2hhbmdlTWFzayB7CisgICAgICAgIE5vQ2hhbmdlcyA9ICAgICAgICAgICAgICAgICAwLAorICAg
ICAgICBDaGlsZHJlbkNoYW5nZSA9ICAgICAgICAgICAgKDFMIDw8IDEpLAorICAgICAgICBNYXNr
TGF5ZXJDaGFuZ2UgPSAgICAgICAgICAgKDFMIDw8IDIpLAorICAgICAgICBQb3NpdGlvbkNoYW5n
ZSA9ICAgICAgICAgICAgKDFMIDw8IDMpLAorICAgICAgICBBbmNob3JQb2ludENoYW5nZSA9ICAg
ICAgICAgKDFMIDw8IDQpLAorICAgICAgICBTaXplQ2hhbmdlICA9ICAgICAgICAgICAgICAgKDFM
IDw8IDUpLAorICAgICAgICBUcmFuc2Zvcm1DaGFuZ2UgPSAgICAgICAgICAgKDFMIDw8IDYpLAor
ICAgICAgICBDb250ZW50Q2hhbmdlID0gICAgICAgICAgICAgKDFMIDw8IDcpLAorICAgICAgICBH
ZW9tZXRyeU9yaWVudGF0aW9uQ2hhbmdlID0gKDFMIDw8IDgpLAorICAgICAgICBDb250ZW50c09y
aWVudGF0aW9uQ2hhbmdlID0gKDFMIDw8IDkpLAorICAgICAgICBPcGFjaXR5Q2hhbmdlID0gICAg
ICAgICAgICAgKDFMIDw8IDEwKSwKKyAgICAgICAgQ29udGVudHNSZWN0Q2hhbmdlID0gICAgICAg
ICgxTCA8PCAxMSksCisgICAgICAgIFByZXNlcnZlczNEQ2hhbmdlID0gICAgICAgICAoMUwgPDwg
MTIpLAorICAgICAgICBNYXNrc1RvQm91bmRzQ2hhbmdlID0gICAgICAgKDFMIDw8IDEzKSwKKyAg
ICAgICAgRHJhd3NDb250ZW50Q2hhbmdlID0gICAgICAgICgxTCA8PCAxNCksCisgICAgICAgIENv
bnRlbnRzT3BhcXVlQ2hhbmdlID0gICAgICAoMUwgPDwgMTUpLAorICAgICAgICBCYWNrZmFjZVZp
c2liaWxpdHlDaGFuZ2UgPSAgKDFMIDw8IDE2KSwKKyAgICAgICAgQ2hpbGRyZW5UcmFuc2Zvcm1D
aGFuZ2UgPSAgICgxTCA8PCAxNyksCisgICAgICAgIERpc3BsYXlDaGFuZ2UgPSAgICAgICAgICAg
ICAoMUwgPDwgMTgpLAorICAgICAgICBCYWNrZ3JvdW5kQ29sb3JDaGFuZ2UgPSAgICAgKDFMIDw8
IDE5KSwKKyAgICAgICAgUGFyZW50Q2hhbmdlID0gICAgICAgICAgICAgICgxTCA8PCAyMCksCisg
ICAgICAgIERpc3RyaWJ1dGVzT3BhY2l0eUNoYW5nZSA9ICAoMUwgPDwgMjEpCisgICAgfTsKKwor
ICAgIC8vIHRoZSBjb21wb3NpdG9yIGxldHMgdXMgc3BlY2lhbC1jYXNlIGltYWdlcyBhbmQgY29s
b3JzLCBzbyB3ZSB0cnkgdG8gZG8gc28KKyAgICBlbnVtIFN0YXRpY0NvbnRlbnRUeXBlIHsgSFRN
TENvbnRlbnRUeXBlLCBQaXhtYXBDb250ZW50VHlwZSwgQ29sb3JDb250ZW50VHlwZX07CisKKyAg
ICBHcmFwaGljc0xheWVyUXRJbXBsKEdyYXBoaWNzTGF5ZXJRdCogbmV3TGF5ZXIpOworICAgIHZp
cnR1YWwgfkdyYXBoaWNzTGF5ZXJRdEltcGwoKTsKKworICAgIC8vIHJlaW1wcyBmcm9tIFFHcmFw
aGljc0l0ZW0KKyAgICB2aXJ0dWFsIFFQYWludGVyUGF0aCBvcGFxdWVBcmVhKCkgY29uc3Q7Cisg
ICAgdmlydHVhbCBRUmVjdEYgYm91bmRpbmdSZWN0KCkgY29uc3Q7CisgICAgdmlydHVhbCB2b2lk
IHBhaW50KFFQYWludGVyKiwgY29uc3QgUVN0eWxlT3B0aW9uR3JhcGhpY3NJdGVtKiwgUVdpZGdl
dCopOworCisgICAgLy8gd2UgbWFuYWdlIHRyYW5zZm9ybXMgb3Vyc2VsdmVzIGJlY2F1c2UgdHJh
bnNmb3JtLW9yaWdpbiBhY3RzIGRpZmZlcmVudGx5IGluIHdlYmtpdCBhbmQgaW4gUXQKKyAgICB2
b2lkIHNldEJhc2VUcmFuc2Zvcm0oY29uc3QgUVRyYW5zZm9ybSYpOworICAgIHZvaWQgZHJhd0Nv
bnRlbnRzKFFQYWludGVyKiwgY29uc3QgUVJlY3RGJiwgYm9vbCBtYXNrID0gZmFsc2UpOworCisg
ICAgLy8gbGV0IHRoZSBjb21wb3NpdG9yLUFQSSB0ZWxsIHVzIHdoaWNoIHByb3BlcnRpZXMgd2Vy
ZSBjaGFuZ2VkCisgICAgdm9pZCBub3RpZnlDaGFuZ2UoQ2hhbmdlTWFzayk7CisKKyAgICAvLyBj
YWxsZWQgd2hlbiB0aGUgY29tcG9zaXRvciBpcyByZWFkeSBmb3IgdXMgdG8gc2hvdyB0aGUgY2hh
bmdlcyBvbiBzY3JlZW4KKyAgICAvLyB0aGlzIGlzIGNhbGxlZCBpbmRpcmVjdGx5IGZyb20gQ2hy
b21lQ2xpZW50UXQ6OnNldE5lZWRzT25lU2hvdERyYXdpbmdTeW5jaHJvbml6YXRpb24KKyAgICAv
LyAobWVhbmluZyB0aGUgc3luYyB3b3VsZCBoYXBwZW4gdG9nZXRoZXIgd2l0aCB0aGUgbmV4dCBk
cmF3KQorICAgIC8vIG9yIENocm9tZUNsaWVudFF0OjpzY2hlZHVsZUNvbXBvc2l0aW5nTGF5ZXJT
eW5jIChtZWFuaW5nIHRoZSBzeW5jIHdpbGwgaGFwcGVuIEFTQVApCisgICAgdm9pZCBmbHVzaENo
YW5nZXMoYm9vbCByZWN1cnNpdmUgPSB0cnVlKTsKKworcHVibGljIHNsb3RzOgorICAgIC8vIHdl
IG5lZWQgdG8gbm90aWZ5IHRoZSBjbGllbnQgKGFrYSB0aGUgbGF5ZXIgY29tcG9zaXRvcikgd2hl
biB0aGUgYW5pbWF0aW9uIGFjdHVhbGx5IHN0YXJ0cworICAgIHZvaWQgbm90aWZ5QW5pbWF0aW9u
U3RhcnRlZCgpOworCitwdWJsaWM6CisgICAgR3JhcGhpY3NMYXllclF0KiBtX2xheWVyOworCisg
ICAgUVRyYW5zZm9ybSBtX2Jhc2VUcmFuc2ZvbTsKKyAgICBib29sIG1fdHJhbnNmb3JtQW5pbWF0
aW9uUnVubmluZzsKKyAgICBib29sIG1fb3BhY2l0eUFuaW1hdGlvblJ1bm5pbmc7CisKKyAgICBz
dHJ1Y3QgQ29udGVudERhdGEgeworICAgICAgICBRUGl4bWFwIHBpeG1hcDsKKyAgICAgICAgUVJl
Z2lvbiByZWdpb25Ub1VwZGF0ZTsKKyAgICAgICAgYm9vbCB1cGRhdGVBbGw7CisgICAgICAgIFFD
b2xvciBjb250ZW50c0JhY2tncm91bmRDb2xvcjsKKyAgICAgICAgUUNvbG9yIGJhY2tncm91bmRD
b2xvcjsKKyAgICAgICAgU3RhdGljQ29udGVudFR5cGUgY29udGVudFR5cGU7CisgICAgICAgIGZs
b2F0IG9wYWNpdHk7CisgICAgICAgIENvbnRlbnREYXRhKCkKKyAgICAgICAgICAgICAgICA6IHVw
ZGF0ZUFsbChmYWxzZSkKKyAgICAgICAgICAgICAgICAsIGNvbnRlbnRUeXBlKEhUTUxDb250ZW50
VHlwZSkKKyAgICAgICAgICAgICAgICAsIG9wYWNpdHkoMS5mKQorICAgICAgICB7CisgICAgICAg
IH0KKworICAgIH07CisKKyAgICBDb250ZW50RGF0YSBtX3BlbmRpbmdDb250ZW50OworICAgIENv
bnRlbnREYXRhIG1fY3VycmVudENvbnRlbnQ7CisKKyAgICBpbnQgbV9jaGFuZ2VNYXNrOworCisg
ICAgUVNpemVGIG1fc2l6ZTsKKyAgICBRTGlzdDxRV2Vha1BvaW50ZXI8UUFic3RyYWN0QW5pbWF0
aW9uPiA+IG1fYW5pbWF0aW9uczsKKyAgICBRVGltZXIgbV9zdXNwZW5kVGltZXI7CisKKyAgICBz
dHJ1Y3QgU3RhdGUgeworICAgICAgICBHcmFwaGljc0xheWVyKiBtYXNrTGF5ZXI7CisgICAgICAg
IEZsb2F0UG9pbnQgcG9zOworICAgICAgICBGbG9hdFBvaW50M0QgYW5jaG9yUG9pbnQ7CisgICAg
ICAgIEZsb2F0U2l6ZSBzaXplOworICAgICAgICBUcmFuc2Zvcm1hdGlvbk1hdHJpeCB0cmFuc2Zv
cm07CisgICAgICAgIFRyYW5zZm9ybWF0aW9uTWF0cml4IGNoaWxkcmVuVHJhbnNmb3JtOworICAg
ICAgICBDb2xvciBiYWNrZ3JvdW5kQ29sb3I7CisgICAgICAgIENvbG9yIGN1cnJlbnRDb2xvcjsK
KyAgICAgICAgR3JhcGhpY3NMYXllcjo6Q29tcG9zaXRpbmdDb29yZGluYXRlc09yaWVudGF0aW9u
IGdlb09yaWVudGF0aW9uOworICAgICAgICBHcmFwaGljc0xheWVyOjpDb21wb3NpdGluZ0Nvb3Jk
aW5hdGVzT3JpZW50YXRpb24gY29udGVudHNPcmllbnRhdGlvbjsKKyAgICAgICAgZmxvYXQgb3Bh
Y2l0eTsKKyAgICAgICAgUVJlY3QgY29udGVudHNSZWN0OworCisgICAgICAgIGJvb2wgcHJlc2Vy
dmVzM0Q6IDE7CisgICAgICAgIGJvb2wgbWFza3NUb0JvdW5kczogMTsKKyAgICAgICAgYm9vbCBk
cmF3c0NvbnRlbnQ6IDE7CisgICAgICAgIGJvb2wgY29udGVudHNPcGFxdWU6IDE7CisgICAgICAg
IGJvb2wgYmFja2ZhY2VWaXNpYmlsaXR5OiAxOworICAgICAgICBib29sIGRpc3RyaWJ1dGVPcGFj
aXR5OiAxOworICAgICAgICBib29sIGFsaWduOiAyOworICAgICAgICBTdGF0ZSgpOiBtYXNrTGF5
ZXIoMCksIG9wYWNpdHkoMSksIHByZXNlcnZlczNEKGZhbHNlKSwgbWFza3NUb0JvdW5kcyhmYWxz
ZSksCisgICAgICAgICAgICAgICAgICBkcmF3c0NvbnRlbnQoZmFsc2UpLCBjb250ZW50c09wYXF1
ZShmYWxzZSksIGJhY2tmYWNlVmlzaWJpbGl0eShmYWxzZSksCisgICAgICAgICAgICAgICAgICBk
aXN0cmlidXRlT3BhY2l0eShmYWxzZSkKKyAgICAgICAgeworICAgICAgICB9CisgICAgfSBtX3N0
YXRlOworfTsKKworR3JhcGhpY3NMYXllclF0SW1wbDo6R3JhcGhpY3NMYXllclF0SW1wbChHcmFw
aGljc0xheWVyUXQqIG5ld0xheWVyKQorICAgIDogUUdyYXBoaWNzT2JqZWN0KDApCisgICAgLCBt
X2xheWVyKG5ld0xheWVyKQorICAgICwgbV90cmFuc2Zvcm1BbmltYXRpb25SdW5uaW5nKGZhbHNl
KQorICAgICwgbV9jaGFuZ2VNYXNrKE5vQ2hhbmdlcykKK3sKKyAgICAvLyBiZXR0ZXIgdG8gY2Fs
Y3VsYXRlIHRoZSBleHBvc2VkIHJlY3QgaW4gUUdyYXBoaWNzVmlldyB0aGFuIG92ZXItcmVuZGVy
IGluIFdlYkNvcmUKKyAgICAvLyBGSVhNRTogdGVzdCBkaWZmZXJlbnQgYXBwcm9hY2hlcworICAg
IHNldEZsYWcoUUdyYXBoaWNzSXRlbTo6SXRlbVVzZXNFeHRlbmRlZFN0eWxlT3B0aW9uLCB0cnVl
KTsKKworICAgIC8vIHdlIHVzZSBncmFwaGljcy12aWV3IGZvciBjb21wb3NpdGluZywgbm90IGZv
ciBpbnRlcmFjdGl2aXR5CisgICAgc2V0QWNjZXB0ZWRNb3VzZUJ1dHRvbnMoUXQ6Ok5vQnV0dG9u
KTsKKyAgICBzZXRFbmFibGVkKGZhbHNlKTsKKworICAgIC8vIHdlJ2xsIHNldCB0aGUgY2FjaGUg
d2hlbiB3ZSBrbm93IHdoYXQncyBnb2luZyBvbgorICAgIHNldENhY2hlTW9kZShOb0NhY2hlKTsK
K30KKworR3JhcGhpY3NMYXllclF0SW1wbDo6fkdyYXBoaWNzTGF5ZXJRdEltcGwoKQoreworICAg
IC8vIHRoZSBjb21wb3NpdG9yIG1hbmFnZXMgaXRlbSBsaWZlY3ljbGUgLSB3ZSBkb24ndCB3YW50
IHRoZSBncmFwaGljcy12aWV3CisgICAgLy8gc3lzdGVtIHRvIGF1dG9tYXRpY2FsbHkgZGVsZXRl
IG91ciBpdGVtcworCisgICAgY29uc3QgUUxpc3Q8UUdyYXBoaWNzSXRlbSo+IGNoaWxkcmVuID0g
Y2hpbGRJdGVtcygpOworICAgIGZvciAoUUxpc3Q8UUdyYXBoaWNzSXRlbSo+Ojpjb25zdF9pdGVy
YXRvciBpdCA9IGNoaWxkcmVuLmJlZ2luKCk7IGl0ICE9IGNoaWxkcmVuLmVuZCgpOyArK2l0KSB7
CisgICAgICAgIGlmIChRR3JhcGhpY3NJdGVtKiBpdGVtID0gKml0KSB7CisgICAgICAgICAgICBp
ZiAoc2NlbmUoKSkKKyAgICAgICAgICAgICAgICBzY2VuZSgpLT5yZW1vdmVJdGVtKGl0ZW0pOwor
ICAgICAgICAgICAgaXRlbS0+c2V0UGFyZW50SXRlbSgwKTsKKyAgICAgICAgfQorICAgIH0KKyAg
ICAKKyAgICAvLyB3ZSBkbywgaG93ZXZlciwgb3duIHRoZSBhbmltYXRpb25zLi4uCisgICAgZm9y
IChRTGlzdDxRV2Vha1BvaW50ZXI8UUFic3RyYWN0QW5pbWF0aW9uPiA+OjppdGVyYXRvciBpdCA9
IG1fYW5pbWF0aW9ucy5iZWdpbigpOyBpdCAhPSBtX2FuaW1hdGlvbnMuZW5kKCk7ICsraXQpCisg
ICAgICAgIGlmIChRQWJzdHJhY3RBbmltYXRpb24qIGFuaW0gPSBpdC0+ZGF0YSgpKQorICAgICAg
ICAgICAgZGVsZXRlIGFuaW07Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllclF0SW1wbDo6c2V0QmFz
ZVRyYW5zZm9ybShjb25zdCBRVHJhbnNmb3JtJiB0cmFuc2Zvcm0pCit7CisgICAgaWYgKCFtX2xh
eWVyKQorICAgICAgICByZXR1cm47CisgICAgLy8gd2Via2l0IGhhcyByZWxhdGl2ZS10by1zaXpl
IG9yaWdpblBvaW50LCBncmFwaGljcy12aWV3IGhhcyBhIHBpeGVsIG9yaWdpblBvaW50CisgICAg
Ly8gaGVyZSB3ZSBjb252ZXJ0CisgICAgUVBvaW50RiBvcmlnaW5UcmFuc2xhdGUoCisgICAgICAg
ICAgICBtX2xheWVyLT5hbmNob3JQb2ludCgpLngoKSAqIG1fbGF5ZXItPnNpemUoKS53aWR0aCgp
LCBtX2xheWVyLT5hbmNob3JQb2ludCgpLnkoKSAqIG1fbGF5ZXItPnNpemUoKS5oZWlnaHQoKSk7
CisKKyAgICByZXNldFRyYW5zZm9ybSgpOworCisgICAgLy8gd2UgaGF2ZSB0byBtYW5hZ2UgdGhp
cyBvdXJzZWx2ZXMgYmVjYXVzZSBRR3JhcGhpY3NWaWV3J3MgdHJhbnNmb3JtT3JpZ2luIGlzIGlu
Y29tcGxldGUKKyAgICB0cmFuc2xhdGUob3JpZ2luVHJhbnNsYXRlLngoKSwgb3JpZ2luVHJhbnNs
YXRlLnkoKSk7CisgICAgc2V0VHJhbnNmb3JtKHRyYW5zZm9ybSwgdHJ1ZSk7CisgICAgdHJhbnNs
YXRlKC1vcmlnaW5UcmFuc2xhdGUueCgpLCAtb3JpZ2luVHJhbnNsYXRlLnkoKSk7CisgICAgbV9i
YXNlVHJhbnNmb20gPSB0cmFuc2Zvcm07Cit9CisKK1FQYWludGVyUGF0aCBHcmFwaGljc0xheWVy
UXRJbXBsOjpvcGFxdWVBcmVhKCkgY29uc3QKK3sKKyAgICBRUGFpbnRlclBhdGggcGFpbnRlclBh
dGg7CisgICAgLy8gd2UgdHJ5IG91dCBiZXN0IHRvIHJldHVybiB0aGUgb3BhcXVlIGFyZWEsIG1h
eWJlIGl0IHdpbGwgaGVscCBncmFwaGljcy12aWV3IHJlbmRlciBsZXNzIGl0ZW1zCisgICAgaWYg
KG1fY3VycmVudENvbnRlbnQuYmFja2dyb3VuZENvbG9yLmlzVmFsaWQoKSAmJiBtX2N1cnJlbnRD
b250ZW50LmJhY2tncm91bmRDb2xvci5hbHBoYSgpID09IDB4ZmYpCisgICAgICAgIHBhaW50ZXJQ
YXRoLmFkZFJlY3QoYm91bmRpbmdSZWN0KCkpOworICAgIGVsc2UgeworICAgICAgICBpZiAobV9z
dGF0ZS5jb250ZW50c09wYXF1ZQorICAgICAgICAgICAgfHwgKG1fY3VycmVudENvbnRlbnQuY29u
dGVudFR5cGUgPT0gQ29sb3JDb250ZW50VHlwZSAmJiBtX2N1cnJlbnRDb250ZW50LmNvbnRlbnRz
QmFja2dyb3VuZENvbG9yLmFscGhhKCkgPT0gMHhmZikKKyAgICAgICAgICAgIHx8IChtX2N1cnJl
bnRDb250ZW50LmNvbnRlbnRUeXBlID09IFBpeG1hcENvbnRlbnRUeXBlICYmICFtX2N1cnJlbnRD
b250ZW50LnBpeG1hcC5oYXNBbHBoYSgpKSkgeworCisgICAgICAgICAgICBwYWludGVyUGF0aC5h
ZGRSZWN0KG1fc3RhdGUuY29udGVudHNSZWN0KTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1
cm4gcGFpbnRlclBhdGg7Cit9CisKK1FSZWN0RiBHcmFwaGljc0xheWVyUXRJbXBsOjpib3VuZGlu
Z1JlY3QoKSBjb25zdAoreworICAgIHJldHVybiBRUmVjdEYoUVBvaW50RigwLCAwKSwgUVNpemVG
KG1fc2l6ZSkpOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJRdEltcGw6OnBhaW50KFFQYWludGVy
KiBwYWludGVyLCBjb25zdCBRU3R5bGVPcHRpb25HcmFwaGljc0l0ZW0qIG9wdGlvbiwgUVdpZGdl
dCogd2lkZ2V0KQoreworICAgIGlmIChtX3N0YXRlLm1hc2tMYXllciAmJiBtX3N0YXRlLm1hc2tM
YXllci0+cGxhdGZvcm1MYXllcigpKSB7CisgICAgICAgIC8vIEZJWE1FOiBzZWUgaWYgdGhpcyBp
cyBiZXR0ZXIgZG9uZSBzb21ld2hlcmUgZWxzZQorICAgICAgICBHcmFwaGljc0xheWVyUXRJbXBs
KiBvdGhlck1hc2sgPSBzdGF0aWNfY2FzdDxHcmFwaGljc0xheWVyUXRJbXBsKj4obV9zdGF0ZS5t
YXNrTGF5ZXItPnBsYXRmb3JtTGF5ZXIoKSk7CisgICAgICAgIG90aGVyTWFzay0+Zmx1c2hDaGFu
Z2VzKHRydWUpOworICAgICAgICAKKyAgICAgICAgLy8gQ1NTMyBtYXNrIGFuZCBRR3JhcGhpY3NP
cGFjaXR5RWZmZWN0IGFyZSB0aGUgc2FtZSB0aGluZyEgd2UganVzdCBuZWVkIHRvIGNvbnZlcnQu
Li4KKyAgICAgICAgLy8gVGhlIGNvbnZlcnNpb24gaXMgYXMgZmFzdCBhcyB3ZSBjYW4gbWFrZSBp
dCAtIHdlIHJlbmRlciB0aGUgbGF5ZXIgb25jZSBhbmQgc2VuZCBpdCB0byB0aGUgUUdyYXBoaWNz
T3BhY2l0eUVmZmVjdAorICAgICAgICBpZiAoIWdyYXBoaWNzRWZmZWN0KCkpIHsKKyAgICAgICAg
ICAgIFFQaXhtYXAgbWFzayhRU2l6ZShtX3N0YXRlLm1hc2tMYXllci0+c2l6ZSgpLndpZHRoKCks
IG1fc3RhdGUubWFza0xheWVyLT5zaXplKCkuaGVpZ2h0KCkpKTsKKyAgICAgICAgICAgIG1hc2su
ZmlsbChRdDo6dHJhbnNwYXJlbnQpOworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFFQ
YWludGVyIHAoJm1hc2spOworICAgICAgICAgICAgICAgIHAuc2V0UmVuZGVySGludHMocGFpbnRl
ci0+cmVuZGVySGludHMoKSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgcC5zZXRDb21wb3NpdGlv
bk1vZGUoUVBhaW50ZXI6OkNvbXBvc2l0aW9uTW9kZV9Tb3VyY2UpOworICAgICAgICAgICAgICAg
IHN0YXRpY19jYXN0PEdyYXBoaWNzTGF5ZXJRdEltcGwqPihtX3N0YXRlLm1hc2tMYXllci0+cGxh
dGZvcm1MYXllcigpKS0+ZHJhd0NvbnRlbnRzKCZwLCBvcHRpb24tPmV4cG9zZWRSZWN0LCB0cnVl
KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFFHcmFwaGljc09wYWNpdHlFZmZlY3QqIG9w
YWNpdHlFZmZlY3QgPSBuZXcgUUdyYXBoaWNzT3BhY2l0eUVmZmVjdCh0aGlzKTsKKyAgICAgICAg
ICAgIG9wYWNpdHlFZmZlY3QtPnNldE9wYWNpdHkoMSk7CisgICAgICAgICAgICBvcGFjaXR5RWZm
ZWN0LT5zZXRPcGFjaXR5TWFzayhRQnJ1c2gobWFzaykpOworICAgICAgICAgICAgc2V0R3JhcGhp
Y3NFZmZlY3Qob3BhY2l0eUVmZmVjdCk7CisgICAgICAgIH0KKyAgICB9CisgICAgZHJhd0NvbnRl
bnRzKHBhaW50ZXIsIG9wdGlvbi0+ZXhwb3NlZFJlY3QpOworfQorCit2b2lkIEdyYXBoaWNzTGF5
ZXJRdEltcGw6OmRyYXdDb250ZW50cyhRUGFpbnRlciogcGFpbnRlciwgY29uc3QgUVJlY3RGJiBy
LCBib29sIG1hc2spCit7CisgICAgUVJlY3QgcmVjdCA9IHIudG9BbGlnbmVkUmVjdCgpOworICAg
IAorICAgIGlmIChtX2N1cnJlbnRDb250ZW50LmNvbnRlbnRUeXBlICE9IEhUTUxDb250ZW50VHlw
ZSAmJiAhbV9zdGF0ZS5jb250ZW50c1JlY3QuaXNFbXB0eSgpKQorICAgICAgICByZWN0ID0gcmVj
dC5pbnRlcnNlY3RlZChtX3N0YXRlLmNvbnRlbnRzUmVjdCk7CisKKyAgICBpZiAobV9jdXJyZW50
Q29udGVudC5iYWNrZ3JvdW5kQ29sb3IuaXNWYWxpZCgpKQorICAgICAgICBwYWludGVyLT5maWxs
UmVjdChyLCBRQ29sb3IobV9jdXJyZW50Q29udGVudC5iYWNrZ3JvdW5kQ29sb3IpKTsKKworICAg
IGlmICghcmVjdC5pc0VtcHR5KCkpIHsKKyAgICAgICAgc3dpdGNoIChtX2N1cnJlbnRDb250ZW50
LmNvbnRlbnRUeXBlKSB7CisgICAgICAgIGNhc2UgUGl4bWFwQ29udGVudFR5cGU6CisgICAgICAg
ICAgICAvLyB3ZSBoYXZlIHRvIHNjYWxlIHRoZSBpbWFnZSB0byB0aGUgY29udGVudHNSZWN0Cisg
ICAgICAgICAgICAvLyBGSVhNRTogYSBiZXR0ZXIgd2F5IHdvdWxkIHByb2JhYmx5IGJlIGRyYXdQ
aXhtYXAgd2l0aCBhIHNyYy90YXJnZXQgcmVjdAorICAgICAgICAgICAgcGFpbnRlci0+ZHJhd1Bp
eG1hcChyZWN0LnRvcExlZnQoKSwgbV9jdXJyZW50Q29udGVudC5waXhtYXAuc2NhbGVkKG1fc3Rh
dGUuY29udGVudHNSZWN0LnNpemUoKSksIHIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAg
IGNhc2UgQ29sb3JDb250ZW50VHlwZToKKyAgICAgICAgICAgIHBhaW50ZXItPmZpbGxSZWN0KHJl
Y3QsIG1fY3VycmVudENvbnRlbnQuY29udGVudHNCYWNrZ3JvdW5kQ29sb3IpOworICAgICAgICAg
ICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBpZiAobV9zdGF0ZS5kcmF3
c0NvbnRlbnQpIHsKKyAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIHRoZSAiZXhwZW5zaXZlIiBi
aXQuIHdlIHRyeSB0byBtaW5pbWl6ZSBjYWxscyB0byB0aGlzCisgICAgICAgICAgICAgICAgLy8g
bmVjayBvZiB0aGUgd29vZHMgYnkgcHJvcGVyIGNhY2hpbmcKKyAgICAgICAgICAgICAgICBHcmFw
aGljc0NvbnRleHQgZ2MocGFpbnRlcik7CisgICAgICAgICAgICAgICAgbV9sYXllci0+cGFpbnRH
cmFwaGljc0xheWVyQ29udGVudHMoZ2MsIHJlY3QpOworICAgICAgICAgICAgfQorICAgICAgICAg
ICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllclF0SW1w
bDo6bm90aWZ5Q2hhbmdlKENoYW5nZU1hc2sgY2hhbmdlTWFzaykKK3sKKyAgICBpZiAoIXRoaXMp
CisgICAgICAgIHJldHVybjsKKworICAgIG1fY2hhbmdlTWFzayB8PSBjaGFuZ2VNYXNrOworCisg
ICAgaWYgKG1fbGF5ZXItPmNsaWVudCgpKQorICAgICAgICBtX2xheWVyLT5jbGllbnQoKS0+bm90
aWZ5U3luY1JlcXVpcmVkKG1fbGF5ZXIpOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJRdEltcGw6
OmZsdXNoQ2hhbmdlcyhib29sIHJlY3Vyc2l2ZSkKK3sKKyAgICAvLyB0aGlzIGlzIHRoZSBidWxr
IG9mIHRoZSB3b3JrLiB1bmRlcnN0YW5kaW5nIHdoYXQgdGhlIGNvbXBvc2l0b3IgaXMgdHJ5aW5n
IHRvIGFjaGlldmUsCisgICAgLy8gd2hhdCBncmFwaGljcy12aWV3IGNhbiBkbywgYW5kIHRyeWlu
ZyB0byBmaW5kIGEgc2FuZSBjb21tb24tZ3JvdW5kcworICAgIGlmICghbV9sYXllciB8fCBtX2No
YW5nZU1hc2sgPT0gTm9DaGFuZ2VzKQorICAgICAgICBnb3RvIGFmdGVyTGF5ZXJDaGFuZ2VzOwor
CisgICAgaWYgKG1fY3VycmVudENvbnRlbnQuY29udGVudFR5cGUgPT0gSFRNTENvbnRlbnRUeXBl
ICYmIChtX2NoYW5nZU1hc2sgJiBQYXJlbnRDaGFuZ2UpKSB7CisgICAgICAgIC8vIHRoZSBXZWJD
b3JlIGNvbXBvc2l0b3IgbWFuYWdlcyBpdGVtIG93bmVyc2hpcC4gV2UgaGF2ZSB0byBtYWtlIHN1
cmUKKyAgICAgICAgLy8gZ3JhcGhpY3MtdmlldyBkb2Vzbid0IHRyeSB0byBzbmF0Y2ggdGhhdCBv
d25lcnNoaXAuLi4KKyAgICAgICAgaWYgKCFtX2xheWVyLT5wYXJlbnQoKSAmJiAhcGFyZW50SXRl
bSgpKQorICAgICAgICAgICAgc2V0UGFyZW50SXRlbSgwKTsKKyAgICAgICAgZWxzZSBpZiAobV9s
YXllciAmJiBtX2xheWVyLT5wYXJlbnQoKSAmJiBtX2xheWVyLT5wYXJlbnQoKS0+bmF0aXZlTGF5
ZXIoKSAhPSBwYXJlbnRJdGVtKCkpCisgICAgICAgICAgICBzZXRQYXJlbnRJdGVtKG1fbGF5ZXIt
PnBhcmVudCgpLT5uYXRpdmVMYXllcigpKTsKKyAgICB9CisKKyAgICBpZiAobV9jaGFuZ2VNYXNr
ICYgQ2hpbGRyZW5DaGFuZ2UpIHsKKyAgICAgICAgLy8gd2UgYmFzaWNhbGx5IGRvIGFuIFhPUiBv
cGVyYXRpb24gb24gdGhlIGxpc3Qgb2YgY3VycmVudCBjaGlsZHJlbgorICAgICAgICAvLyBhbmQg
dGhlIGxpc3Qgb2Ygd2FudGVkIGNoaWxkcmVuLCBhbmQgcmVtb3ZlL2FkZAorICAgICAgICBRU2V0
PFFHcmFwaGljc0l0ZW0qPiBuZXdDaGlsZHJlbjsKKyAgICAgICAgY29uc3QgVmVjdG9yPEdyYXBo
aWNzTGF5ZXIqPiBuZXdDaGlsZHJlblZlY3RvciA9IChtX2xheWVyLT5jaGlsZHJlbigpKTsKKyAg
ICAgICAgbmV3Q2hpbGRyZW4ucmVzZXJ2ZShuZXdDaGlsZHJlblZlY3Rvci5zaXplKCkpOworCisg
ICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbmV3Q2hpbGRyZW5WZWN0b3Iuc2l6ZSgpOyAr
K2kpCisgICAgICAgICAgICBuZXdDaGlsZHJlbi5pbnNlcnQobmV3Q2hpbGRyZW5WZWN0b3JbaV0t
PnBsYXRmb3JtTGF5ZXIoKSk7CisKKyAgICAgICAgY29uc3QgUVNldDxRR3JhcGhpY3NJdGVtKj4g
Y3VycmVudENoaWxkcmVuID0gY2hpbGRJdGVtcygpLnRvU2V0KCk7CisgICAgICAgIGNvbnN0IFFT
ZXQ8UUdyYXBoaWNzSXRlbSo+IGNoaWxkcmVuVG9BZGQgPSBuZXdDaGlsZHJlbiAtIGN1cnJlbnRD
aGlsZHJlbjsKKyAgICAgICAgY29uc3QgUVNldDxRR3JhcGhpY3NJdGVtKj4gY2hpbGRyZW5Ub1Jl
bW92ZSA9IGN1cnJlbnRDaGlsZHJlbiAtIG5ld0NoaWxkcmVuOworICAgICAgICBmb3IgKFFTZXQ8
UUdyYXBoaWNzSXRlbSo+Ojpjb25zdF9pdGVyYXRvciBpdCA9IGNoaWxkcmVuVG9BZGQuYmVnaW4o
KTsgaXQgIT0gY2hpbGRyZW5Ub0FkZC5lbmQoKTsgKytpdCkgeworICAgICAgICAgICAgIGlmIChR
R3JhcGhpY3NJdGVtKiB3ID0gKml0KQorICAgICAgICAgICAgICAgIHctPnNldFBhcmVudEl0ZW0o
dGhpcyk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChRU2V0PFFHcmFwaGljc0l0ZW0qPjo6Y29u
c3RfaXRlcmF0b3IgaXQgPSBjaGlsZHJlblRvUmVtb3ZlLmJlZ2luKCk7IGl0ICE9IGNoaWxkcmVu
VG9SZW1vdmUuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgICAgICBpZiAoUUdyYXBoaWNzSXRlbSog
dyA9ICppdCkKKyAgICAgICAgICAgICAgICB3LT5zZXRQYXJlbnRJdGVtKDApOworICAgICAgICB9
CisKKyAgICAgICAgLy8gY2hpbGRyZW4gYXJlIG9yZGVyZWQgYnkgei12YWx1ZSwgbGV0IGdyYXBo
aWNzLXZpZXcga25vdy4KKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuZXdDaGlsZHJl
blZlY3Rvci5zaXplKCk7ICsraSkKKyAgICAgICAgICAgIGlmIChuZXdDaGlsZHJlblZlY3Rvcltp
XS0+cGxhdGZvcm1MYXllcigpKQorICAgICAgICAgICAgICAgIG5ld0NoaWxkcmVuVmVjdG9yW2ld
LT5wbGF0Zm9ybUxheWVyKCktPnNldFpWYWx1ZShpKTsKKyAgICB9CisKKyAgICBpZiAobV9jaGFu
Z2VNYXNrICYgTWFza0xheWVyQ2hhbmdlKSB7CisgICAgICAgIC8vIHdlIGNhbid0IHBhaW50IGhl
cmUsIGJlY2F1c2Ugd2UgZG9uJ3Qga25vdyBpZiB0aGUgbWFzayBsYXllcgorICAgICAgICAvLyBp
dHNlbGYgaXMgcmVhZHkuLi4gd2UnbGwgaGF2ZSB0byB3YWl0IHRpbGwgdGhpcyBsYXllciB0cmll
cyB0byBwYWludAorICAgICAgICBzZXRHcmFwaGljc0VmZmVjdCgwKTsKKyAgICAgICAgaWYgKG1f
bGF5ZXItPm1hc2tMYXllcigpKQorICAgICAgICAgICAgc2V0RmxhZyhJdGVtQ2xpcHNDaGlsZHJl
blRvU2hhcGUsIHRydWUpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzZXRGbGFnKEl0ZW1D
bGlwc0NoaWxkcmVuVG9TaGFwZSwgbV9sYXllci0+bWFza3NUb0JvdW5kcygpKTsKKyAgICAgICAg
dXBkYXRlKCk7CisgICAgfQorCisgICAgaWYgKChtX2NoYW5nZU1hc2sgJiBQb3NpdGlvbkNoYW5n
ZSkgJiYgKG1fbGF5ZXItPnBvc2l0aW9uKCkgIT0gbV9zdGF0ZS5wb3MpKQorICAgICAgICBzZXRQ
b3MobV9sYXllci0+cG9zaXRpb24oKS54KCksIG1fbGF5ZXItPnBvc2l0aW9uKCkueSgpKTsKKwor
ICAgIGlmIChtX2NoYW5nZU1hc2sgJiBTaXplQ2hhbmdlKSB7CisgICAgICAgIGlmIChtX2xheWVy
LT5zaXplKCkgIT0gbV9zdGF0ZS5zaXplKSB7CisgICAgICAgICAgICBwcmVwYXJlR2VvbWV0cnlD
aGFuZ2UoKTsKKyAgICAgICAgICAgIG1fc2l6ZSA9IFFTaXplRihtX2xheWVyLT5zaXplKCkud2lk
dGgoKSwgbV9sYXllci0+c2l6ZSgpLmhlaWdodCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAg
IGlmIChtX2NoYW5nZU1hc2sgJiAoVHJhbnNmb3JtQ2hhbmdlIHwgQW5jaG9yUG9pbnRDaGFuZ2Ug
fCBTaXplQ2hhbmdlKSkgeworICAgICAgICAvLyBzaW5jZSB3ZSBjb252ZXJ0IGEgcGVyY2VudGFn
ZS1iYXNlZCBvcmlnaW4tcG9pbnQgdG8gYSBwaXhlbC1iYXNlZCBvbmUsCisgICAgICAgIC8vIHRo
ZSBhbmNob3ItcG9pbnQsIHRyYW5zZm9ybSBhbmQgc2l6ZSBmcm9tIFdlYkNvcmUgYWxsIGFmZmVj
dCB0aGUgb25lCisgICAgICAgIC8vIHRoYXQgd2UgZ2l2ZSBRdAorICAgICAgICBpZiAobV9zdGF0
ZS50cmFuc2Zvcm0gIT0gbV9sYXllci0+dHJhbnNmb3JtKCkgfHwgbV9zdGF0ZS5hbmNob3JQb2lu
dCAhPSBtX2xheWVyLT5hbmNob3JQb2ludCgpIHx8IG1fc3RhdGUuc2l6ZSAhPSBtX2xheWVyLT5z
aXplKCkpCisgICAgICAgICAgICBzZXRCYXNlVHJhbnNmb3JtKFFUcmFuc2Zvcm0obV9sYXllci0+
dHJhbnNmb3JtKCkpKTsKKyAgICB9CisKKyAgICBpZiAobV9jaGFuZ2VNYXNrICYgKENvbnRlbnRD
aGFuZ2UgfCBEcmF3c0NvbnRlbnRDaGFuZ2UpKSB7CisgICAgICAgIHN3aXRjaCAobV9wZW5kaW5n
Q29udGVudC5jb250ZW50VHlwZSkgeworICAgICAgICBjYXNlIFBpeG1hcENvbnRlbnRUeXBlOgor
ICAgICAgICAgICAgLy8gd2UgbmVlZCBjYWNoZSBldmVuIGZvciBpbWFnZXMsIGJlY2F1c2UgdGhl
eSBuZWVkIHRvIGJlIHJlc2l6ZWQKKyAgICAgICAgICAgIC8vIHRvIHRoZSBjb250ZW50cyByZWN0
LiBtYXliZSB0aGlzIGNhbiBiZSBvcHRpbWl6ZWQgdGhvdWdoCisgICAgICAgICAgICBzZXRDYWNo
ZU1vZGUobV90cmFuc2Zvcm1BbmltYXRpb25SdW5uaW5nID8gSXRlbUNvb3JkaW5hdGVDYWNoZSA6
IERldmljZUNvb3JkaW5hdGVDYWNoZSk7CisgICAgICAgICAgICB1cGRhdGUoKTsKKyAgICAgICAg
ICAgIHNldEZsYWcoSXRlbUhhc05vQ29udGVudHMsIGZhbHNlKTsKKyAgICAgICAgICAgIGJyZWFr
OworCisgICAgICAgIGNhc2UgQ29sb3JDb250ZW50VHlwZToKKyAgICAgICAgICAgIC8vIG5vIHBv
aW50IGluIGNhY2hpbmcgYSBzb2xpZC1jb2xvciByZWN0YW5nbGUKKyAgICAgICAgICAgIHNldENh
Y2hlTW9kZShRR3JhcGhpY3NJdGVtOjpOb0NhY2hlKTsKKyAgICAgICAgICAgIGlmIChtX3BlbmRp
bmdDb250ZW50LmNvbnRlbnRUeXBlICE9IG1fY3VycmVudENvbnRlbnQuY29udGVudFR5cGUgfHwg
bV9wZW5kaW5nQ29udGVudC5jb250ZW50c0JhY2tncm91bmRDb2xvciAhPSBtX2N1cnJlbnRDb250
ZW50LmNvbnRlbnRzQmFja2dyb3VuZENvbG9yKQorICAgICAgICAgICAgICAgIHVwZGF0ZSgpOwor
ICAgICAgICAgICAgbV9zdGF0ZS5kcmF3c0NvbnRlbnQgPSBmYWxzZTsKKyAgICAgICAgICAgIHNl
dEZsYWcoSXRlbUhhc05vQ29udGVudHMsIGZhbHNlKTsKKyAgICAgICAgICAgIGJyZWFrOworCisg
ICAgICAgIGNhc2UgSFRNTENvbnRlbnRUeXBlOgorICAgICAgICAgICAgaWYgKG1fcGVuZGluZ0Nv
bnRlbnQuY29udGVudFR5cGUgIT0gbV9jdXJyZW50Q29udGVudC5jb250ZW50VHlwZSkKKyAgICAg
ICAgICAgICAgICB1cGRhdGUoKTsKKyAgICAgICAgICAgIGlmICghbV9zdGF0ZS5kcmF3c0NvbnRl
bnQgJiYgbV9sYXllci0+ZHJhd3NDb250ZW50KCkpCisgICAgICAgICAgICAgICAgdXBkYXRlKCk7
CisgICAgICAgICAgICBpZiAobV9sYXllci0+ZHJhd3NDb250ZW50KCkpCisgICAgICAgICAgICAg
ICAgc2V0Q2FjaGVNb2RlKG1fdHJhbnNmb3JtQW5pbWF0aW9uUnVubmluZyA/IEl0ZW1Db29yZGlu
YXRlQ2FjaGUgOiBEZXZpY2VDb29yZGluYXRlQ2FjaGUpOworICAgICAgICAgICAgZWxzZQorICAg
ICAgICAgICAgICAgIHNldENhY2hlTW9kZShOb0NhY2hlKTsKKworICAgICAgICAgICAgc2V0Rmxh
ZyhJdGVtSGFzTm9Db250ZW50cywgIW1fbGF5ZXItPmRyYXdzQ29udGVudCgpKTsKKyAgICAgICAg
ICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChtX2NoYW5nZU1hc2sgJiBP
cGFjaXR5Q2hhbmdlKSAmJiBtX3N0YXRlLm9wYWNpdHkgIT0gbV9sYXllci0+b3BhY2l0eSgpKQor
ICAgICAgICBzZXRPcGFjaXR5KG1fbGF5ZXItPm9wYWNpdHkoKSk7CisKKyAgICBpZiAobV9jaGFu
Z2VNYXNrICYgQ29udGVudHNSZWN0Q2hhbmdlKSB7CisgICAgICAgIGNvbnN0IFFSZWN0IHJlY3Qo
bV9sYXllci0+Y29udGVudHNSZWN0KCkpOworICAgICAgICBpZiAobV9zdGF0ZS5jb250ZW50c1Jl
Y3QgIT0gcmVjdCkgeworICAgICAgICAgICAgbV9zdGF0ZS5jb250ZW50c1JlY3QgPSByZWN0Owor
ICAgICAgICAgICAgdXBkYXRlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKG1fY2hh
bmdlTWFzayAmIE1hc2tzVG9Cb3VuZHNDaGFuZ2UpCisgICAgICAgICYmIG1fc3RhdGUubWFza3NU
b0JvdW5kcyAhPSBtX2xheWVyLT5tYXNrc1RvQm91bmRzKCkpIHsKKworICAgICAgICBzZXRGbGFn
KFFHcmFwaGljc0l0ZW06Okl0ZW1DbGlwc1RvU2hhcGUsIG1fbGF5ZXItPm1hc2tzVG9Cb3VuZHMo
KSk7CisgICAgICAgIHNldEZsYWcoUUdyYXBoaWNzSXRlbTo6SXRlbUNsaXBzQ2hpbGRyZW5Ub1No
YXBlLCBtX2xheWVyLT5tYXNrc1RvQm91bmRzKCkpOworICAgIH0KKworICAgIGlmICgobV9jaGFu
Z2VNYXNrICYgQ29udGVudHNPcGFxdWVDaGFuZ2UpICYmIG1fc3RhdGUuY29udGVudHNPcGFxdWUg
IT0gbV9sYXllci0+Y29udGVudHNPcGFxdWUoKSkKKyAgICAgICAgcHJlcGFyZUdlb21ldHJ5Q2hh
bmdlKCk7CisKKyAgICBpZiAobV9jaGFuZ2VNYXNrICYgRGlzcGxheUNoYW5nZSkKKyAgICAgICAg
dXBkYXRlKG1fcGVuZGluZ0NvbnRlbnQucmVnaW9uVG9VcGRhdGUuYm91bmRpbmdSZWN0KCkpOwor
CisgICAgaWYgKChtX2NoYW5nZU1hc2sgJiBCYWNrZ3JvdW5kQ29sb3JDaGFuZ2UpICYmIChtX3Bl
bmRpbmdDb250ZW50LmJhY2tncm91bmRDb2xvciAhPSBtX2N1cnJlbnRDb250ZW50LmJhY2tncm91
bmRDb2xvcikpCisgICAgICAgIHVwZGF0ZSgpOworCisgICAgLy8gRklYTUU6IHRoZSBmb2xsb3dp
bmcgZmxhZ3MgYXJlIGN1cnJlbnRseSBub3QgaGFuZGxlZCwgYXMgdGhleSBkb24ndCBoYXZlIGEg
Y2xlYXIgdGVzdCBvciBhcmUgaW4gbG93IHByaW9yaXR5CisgICAgLy8gR2VvbWV0cnlPcmllbnRh
dGlvbkNoYW5nZSwgQ29udGVudHNPcmllbnRhdGlvbkNoYW5nZSwgQmFja2ZhY2VWaXNpYmlsaXR5
Q2hhbmdlLCBDaGlsZHJlblRyYW5zZm9ybUNoYW5nZQorCisgICAgbV9zdGF0ZS5tYXNrTGF5ZXIg
PSBtX2xheWVyLT5tYXNrTGF5ZXIoKTsKKyAgICBtX3N0YXRlLnBvcyA9IG1fbGF5ZXItPnBvc2l0
aW9uKCk7CisgICAgbV9zdGF0ZS5hbmNob3JQb2ludCA9IG1fbGF5ZXItPmFuY2hvclBvaW50KCk7
CisgICAgbV9zdGF0ZS5zaXplID0gbV9sYXllci0+c2l6ZSgpOworICAgIG1fc3RhdGUudHJhbnNm
b3JtID0gbV9sYXllci0+dHJhbnNmb3JtKCk7CisgICAgbV9zdGF0ZS5nZW9PcmllbnRhdGlvbiA9
IG1fbGF5ZXItPmdlb21ldHJ5T3JpZW50YXRpb24oKTsKKyAgICBtX3N0YXRlLmNvbnRlbnRzT3Jp
ZW50YXRpb24gPW1fbGF5ZXItPmNvbnRlbnRzT3JpZW50YXRpb24oKTsKKyAgICBtX3N0YXRlLm9w
YWNpdHkgPSBtX2xheWVyLT5vcGFjaXR5KCk7CisgICAgbV9zdGF0ZS5jb250ZW50c1JlY3QgPSBt
X2xheWVyLT5jb250ZW50c1JlY3QoKTsKKyAgICBtX3N0YXRlLnByZXNlcnZlczNEID0gbV9sYXll
ci0+cHJlc2VydmVzM0QoKTsKKyAgICBtX3N0YXRlLm1hc2tzVG9Cb3VuZHMgPSBtX2xheWVyLT5t
YXNrc1RvQm91bmRzKCk7CisgICAgbV9zdGF0ZS5kcmF3c0NvbnRlbnQgPSBtX2xheWVyLT5kcmF3
c0NvbnRlbnQoKTsKKyAgICBtX3N0YXRlLmNvbnRlbnRzT3BhcXVlID0gbV9sYXllci0+Y29udGVu
dHNPcGFxdWUoKTsKKyAgICBtX3N0YXRlLmJhY2tmYWNlVmlzaWJpbGl0eSA9IG1fbGF5ZXItPmJh
Y2tmYWNlVmlzaWJpbGl0eSgpOworICAgIG1fY3VycmVudENvbnRlbnQucGl4bWFwID0gbV9wZW5k
aW5nQ29udGVudC5waXhtYXA7CisgICAgbV9jdXJyZW50Q29udGVudC5jb250ZW50VHlwZSA9IG1f
cGVuZGluZ0NvbnRlbnQuY29udGVudFR5cGU7CisgICAgbV9jdXJyZW50Q29udGVudC5iYWNrZ3Jv
dW5kQ29sb3IgPSBtX3BlbmRpbmdDb250ZW50LmJhY2tncm91bmRDb2xvcjsKKyAgICBtX2N1cnJl
bnRDb250ZW50LnJlZ2lvblRvVXBkYXRlIHw9IG1fcGVuZGluZ0NvbnRlbnQucmVnaW9uVG9VcGRh
dGU7CisgICAgbV9jdXJyZW50Q29udGVudC5jb250ZW50c0JhY2tncm91bmRDb2xvciA9IG1fcGVu
ZGluZ0NvbnRlbnQuY29udGVudHNCYWNrZ3JvdW5kQ29sb3I7CisgICAgbV9wZW5kaW5nQ29udGVu
dC5yZWdpb25Ub1VwZGF0ZSA9IFFSZWdpb24oKTsKKyAgICBtX2NoYW5nZU1hc2sgPSBOb0NoYW5n
ZXM7CisKKworYWZ0ZXJMYXllckNoYW5nZXM6CisgICAgaWYgKCFyZWN1cnNpdmUpCisgICAgICAg
IHJldHVybjsgICAgCisKKyAgICBjb25zdCBRTGlzdDxRR3JhcGhpY3NJdGVtKj4gY2hpbGRyZW4g
PSBjaGlsZEl0ZW1zKCk7CisKKyAgICBmb3IgKFFMaXN0PFFHcmFwaGljc0l0ZW0qPjo6Y29uc3Rf
aXRlcmF0b3IgaXQgPSBjaGlsZHJlbi5iZWdpbigpOyBpdCAhPSBjaGlsZHJlbi5lbmQoKTsgKytp
dCkgeworICAgICAgICBpZiAoUUdyYXBoaWNzSXRlbSogaXRlbSA9ICppdCkKKyAgICAgICAgICAg
IGlmIChHcmFwaGljc0xheWVyUXRJbXBsKiBsYXllciA9IHFvYmplY3RfY2FzdDxHcmFwaGljc0xh
eWVyUXRJbXBsKj4oaXRlbS0+dG9HcmFwaGljc09iamVjdCgpKSkKKyAgICAgICAgICAgICAgICBs
YXllci0+Zmx1c2hDaGFuZ2VzKHRydWUpOworICAgIH0KK30KKwordm9pZCBHcmFwaGljc0xheWVy
UXRJbXBsOjpub3RpZnlBbmltYXRpb25TdGFydGVkKCkKK3sKKyAgICAvLyBXZWJDb3JlIG5vdGlm
aWVzIGphdmFzY3JpcHQgd2hlbiB0aGUgYW5pbWF0aW9uIHN0YXJ0cworICAgIC8vIGhlcmUgd2Un
cmUgbGV0dGluZyBpdCBrbm93CisgICAgbV9sYXllci0+Y2xpZW50KCktPm5vdGlmeUFuaW1hdGlv
blN0YXJ0ZWQobV9sYXllciwgV1RGOjpjdXJyZW50VGltZSgpKTsKK30KKworR3JhcGhpY3NMYXll
clF0OjpHcmFwaGljc0xheWVyUXQoR3JhcGhpY3NMYXllckNsaWVudCogY2xpZW50KQorICAgIDog
R3JhcGhpY3NMYXllcihjbGllbnQpCisgICAgLCBtX2ltcGwoUGFzc093blB0cjxHcmFwaGljc0xh
eWVyUXRJbXBsPihuZXcgR3JhcGhpY3NMYXllclF0SW1wbCh0aGlzKSkpCit7Cit9CisKK0dyYXBo
aWNzTGF5ZXJRdDo6fkdyYXBoaWNzTGF5ZXJRdCgpCit7Cit9CisKKy8vIHRoaXMgaXMgdGhlIGhv
b2sgZm9yIFdlYkNvcmUgY29tcG9zaXRvciB0byBrbm93IHRoYXQgUXQgaW1wbGVtZW50cyBjb21w
b3NpdGluZyB3aXRoIEdyYXBoaWNzTGF5ZXJRdAorUGFzc093blB0cjxHcmFwaGljc0xheWVyPiBH
cmFwaGljc0xheWVyOjpjcmVhdGUoR3JhcGhpY3NMYXllckNsaWVudCogY2xpZW50KQoreworICAg
IHJldHVybiBuZXcgR3JhcGhpY3NMYXllclF0KGNsaWVudCk7Cit9CisKKy8vIHJlaW1wIGZyb20g
R3JhcGhpY3NMYXllci5oOiBRdCBpcyB0b3AtZG93bgorR3JhcGhpY3NMYXllcjo6Q29tcG9zaXRp
bmdDb29yZGluYXRlc09yaWVudGF0aW9uIEdyYXBoaWNzTGF5ZXI6OmNvbXBvc2l0aW5nQ29vcmRp
bmF0ZXNPcmllbnRhdGlvbigpCit7CisgICAgcmV0dXJuIENvbXBvc2l0aW5nQ29vcmRpbmF0ZXNU
b3BEb3duOworfQorCisvLyByZWltcCBmcm9tIEdyYXBoaWNzTGF5ZXIuaDogd2UnbGwgbmVlZCB0
byB1cGRhdGUgdGhlIHdob2xlIGRpc3BsYXksIGFuZCB3ZSBjYW4ndCBjb3VudCBvbiB0aGUgY3Vy
cmVudCBzaXplIGJlY2F1c2UgaXQgbWlnaHQgY2hhbmdlCit2b2lkIEdyYXBoaWNzTGF5ZXJRdDo6
c2V0TmVlZHNEaXNwbGF5KCkKK3sKKyAgICBtX2ltcGwtPm1fcGVuZGluZ0NvbnRlbnQucmVnaW9u
VG9VcGRhdGUgPSBRUmVnaW9uKFFSZWN0KFFQb2ludCgwLCAwKSwgUVNpemUoc2l6ZSgpLndpZHRo
KCksIHNpemUoKS5oZWlnaHQoKSkpKTsKKyAgICBtX2ltcGwtPm5vdGlmeUNoYW5nZShHcmFwaGlj
c0xheWVyUXRJbXBsOjpEaXNwbGF5Q2hhbmdlKTsKK30KKworLy8gcmVpbXAgZnJvbSBHcmFwaGlj
c0xheWVyLmgKK3ZvaWQgR3JhcGhpY3NMYXllclF0OjpzZXROZWVkc0Rpc3BsYXlJblJlY3QoY29u
c3QgRmxvYXRSZWN0JiByKQoreworICAgIG1faW1wbC0+bV9wZW5kaW5nQ29udGVudC5yZWdpb25U
b1VwZGF0ZXw9IFFSZWN0RihyKS50b0FsaWduZWRSZWN0KCk7CisgICAgbV9pbXBsLT5ub3RpZnlD
aGFuZ2UoR3JhcGhpY3NMYXllclF0SW1wbDo6RGlzcGxheUNoYW5nZSk7Cit9CisKKy8vIHJlaW1w
IGZyb20gR3JhcGhpY3NMYXllci5oCit2b2lkIEdyYXBoaWNzTGF5ZXJRdDo6c2V0TmFtZShjb25z
dCBTdHJpbmcmIG5hbWUpCit7CisgICAgbV9pbXBsLT5zZXRPYmplY3ROYW1lKG5hbWUpOworICAg
IEdyYXBoaWNzTGF5ZXI6OnNldE5hbWUobmFtZSk7Cit9CisKKy8vIHJlaW1wIGZyb20gR3JhcGhp
Y3NMYXllci5oCit2b2lkIEdyYXBoaWNzTGF5ZXJRdDo6c2V0UGFyZW50KEdyYXBoaWNzTGF5ZXIq
IGxheWVyKQoreworICAgIG1faW1wbC0+bm90aWZ5Q2hhbmdlKEdyYXBoaWNzTGF5ZXJRdEltcGw6
OlBhcmVudENoYW5nZSk7CisgICAgR3JhcGhpY3NMYXllcjo6c2V0UGFyZW50KGxheWVyKTsKK30K
KworLy8gcmVpbXAgZnJvbSBHcmFwaGljc0xheWVyLmgKK2Jvb2wgR3JhcGhpY3NMYXllclF0Ojpz
ZXRDaGlsZHJlbihjb25zdCBWZWN0b3I8R3JhcGhpY3NMYXllcio+JiBjaGlsZHJlbikKK3sKKyAg
ICBtX2ltcGwtPm5vdGlmeUNoYW5nZShHcmFwaGljc0xheWVyUXRJbXBsOjpDaGlsZHJlbkNoYW5n
ZSk7CisgICAgcmV0dXJuIEdyYXBoaWNzTGF5ZXI6OnNldENoaWxkcmVuKGNoaWxkcmVuKTsKK30K
KworLy8gcmVpbXAgZnJvbSBHcmFwaGljc0xheWVyLmgKK3ZvaWQgR3JhcGhpY3NMYXllclF0Ojph
ZGRDaGlsZChHcmFwaGljc0xheWVyKiBsYXllcikKK3sKKyAgICBtX2ltcGwtPm5vdGlmeUNoYW5n
ZShHcmFwaGljc0xheWVyUXRJbXBsOjpDaGlsZHJlbkNoYW5nZSk7CisgICAgR3JhcGhpY3NMYXll
cjo6YWRkQ2hpbGQobGF5ZXIpOworfQorCisvLyByZWltcCBmcm9tIEdyYXBoaWNzTGF5ZXIuaAor
dm9pZCBHcmFwaGljc0xheWVyUXQ6OmFkZENoaWxkQXRJbmRleChHcmFwaGljc0xheWVyKiBsYXll
ciwgaW50IGluZGV4KQoreworICAgIEdyYXBoaWNzTGF5ZXI6OmFkZENoaWxkQXRJbmRleChsYXll
ciwgaW5kZXgpOworICAgIG1faW1wbC0+bm90aWZ5Q2hhbmdlKEdyYXBoaWNzTGF5ZXJRdEltcGw6
OkNoaWxkcmVuQ2hhbmdlKTsKK30KKworLy8gcmVpbXAgZnJvbSBHcmFwaGljc0xheWVyLmgKK3Zv
aWQgR3JhcGhpY3NMYXllclF0OjphZGRDaGlsZEFib3ZlKEdyYXBoaWNzTGF5ZXIqIGxheWVyLCBH
cmFwaGljc0xheWVyKiBzaWJsaW5nKQoreworICAgICBHcmFwaGljc0xheWVyOjphZGRDaGlsZEFi
b3ZlKGxheWVyLCBzaWJsaW5nKTsKKyAgICAgbV9pbXBsLT5ub3RpZnlDaGFuZ2UoR3JhcGhpY3NM
YXllclF0SW1wbDo6Q2hpbGRyZW5DaGFuZ2UpOworfQorCisvLyByZWltcCBmcm9tIEdyYXBoaWNz
TGF5ZXIuaAordm9pZCBHcmFwaGljc0xheWVyUXQ6OmFkZENoaWxkQmVsb3coR3JhcGhpY3NMYXll
ciogbGF5ZXIsIEdyYXBoaWNzTGF5ZXIqIHNpYmxpbmcpCit7CisKKyAgICBHcmFwaGljc0xheWVy
OjphZGRDaGlsZEJlbG93KGxheWVyLCBzaWJsaW5nKTsKKyAgICBtX2ltcGwtPm5vdGlmeUNoYW5n
ZShHcmFwaGljc0xheWVyUXRJbXBsOjpDaGlsZHJlbkNoYW5nZSk7Cit9CisKKy8vIHJlaW1wIGZy
b20gR3JhcGhpY3NMYXllci5oCitib29sIEdyYXBoaWNzTGF5ZXJRdDo6cmVwbGFjZUNoaWxkKEdy
YXBoaWNzTGF5ZXIqIG9sZENoaWxkLCBHcmFwaGljc0xheWVyKiBuZXdDaGlsZCkKK3sKKyAgICBp
ZiAoR3JhcGhpY3NMYXllcjo6cmVwbGFjZUNoaWxkKG9sZENoaWxkLCBuZXdDaGlsZCkpIHsKKyAg
ICAgICAgbV9pbXBsLT5ub3RpZnlDaGFuZ2UoR3JhcGhpY3NMYXllclF0SW1wbDo6Q2hpbGRyZW5D
aGFuZ2UpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7
Cit9CisKKy8vIHJlaW1wIGZyb20gR3JhcGhpY3NMYXllci5oCit2b2lkIEdyYXBoaWNzTGF5ZXJR
dDo6cmVtb3ZlRnJvbVBhcmVudCgpCit7CisgICAgaWYgKHBhcmVudCgpKQorICAgICAgICBtX2lt
cGwtPm5vdGlmeUNoYW5nZShHcmFwaGljc0xheWVyUXRJbXBsOjpQYXJlbnRDaGFuZ2UpOworICAg
IEdyYXBoaWNzTGF5ZXI6OnJlbW92ZUZyb21QYXJlbnQoKTsKK30KKworLy8gcmVpbXAgZnJvbSBH
cmFwaGljc0xheWVyLmgKK3ZvaWQgR3JhcGhpY3NMYXllclF0OjpzZXRNYXNrTGF5ZXIoR3JhcGhp
Y3NMYXllciogbGF5ZXIpCit7CisgICAgR3JhcGhpY3NMYXllcjo6c2V0TWFza0xheWVyKGxheWVy
KTsKKyAgICBtX2ltcGwtPm5vdGlmeUNoYW5nZShHcmFwaGljc0xheWVyUXRJbXBsOjpNYXNrTGF5
ZXJDaGFuZ2UpOworfQorCisvLyByZWltcCBmcm9tIEdyYXBoaWNzTGF5ZXIuaAordm9pZCBHcmFw
aGljc0xheWVyUXQ6OnNldFBvc2l0aW9uKGNvbnN0IEZsb2F0UG9pbnQmIHApCit7CisgICAgaWYg
KHBvc2l0aW9uKCkgIT0gcCkKKyAgICAgICBtX2ltcGwtPm5vdGlmeUNoYW5nZShHcmFwaGljc0xh
eWVyUXRJbXBsOjpQb3NpdGlvbkNoYW5nZSk7CisgICAgR3JhcGhpY3NMYXllcjo6c2V0UG9zaXRp
b24ocCk7Cit9CisKKy8vIHJlaW1wIGZyb20gR3JhcGhpY3NMYXllci5oCit2b2lkIEdyYXBoaWNz
TGF5ZXJRdDo6c2V0QW5jaG9yUG9pbnQoY29uc3QgRmxvYXRQb2ludDNEJiBwKQoreworICAgIGlm
IChhbmNob3JQb2ludCgpICE9IHApCisgICAgICAgIG1faW1wbC0+bm90aWZ5Q2hhbmdlKEdyYXBo
aWNzTGF5ZXJRdEltcGw6OkFuY2hvclBvaW50Q2hhbmdlKTsKKyAgICBHcmFwaGljc0xheWVyOjpz
ZXRBbmNob3JQb2ludChwKTsKK30KKworLy8gcmVpbXAgZnJvbSBHcmFwaGljc0xheWVyLmgKK3Zv
aWQgR3JhcGhpY3NMYXllclF0OjpzZXRTaXplKGNvbnN0IEZsb2F0U2l6ZSYgc2l6ZSkKK3sKKyAg
ICBpZiAodGhpcy0+c2l6ZSgpICE9IHNpemUpCisgICAgICAgIG1faW1wbC0+bm90aWZ5Q2hhbmdl
KEdyYXBoaWNzTGF5ZXJRdEltcGw6OlNpemVDaGFuZ2UpOworICAgIEdyYXBoaWNzTGF5ZXI6OnNl
dFNpemUoc2l6ZSk7Cit9CisKKy8vIHJlaW1wIGZyb20gR3JhcGhpY3NMYXllci5oCit2b2lkIEdy
YXBoaWNzTGF5ZXJRdDo6c2V0VHJhbnNmb3JtKGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4JiB0
KQoreworICAgIGlmICghbV9pbXBsLT5tX3RyYW5zZm9ybUFuaW1hdGlvblJ1bm5pbmcgJiYgdHJh
bnNmb3JtKCkgIT0gdCkKKyAgICAgICBtX2ltcGwtPm5vdGlmeUNoYW5nZShHcmFwaGljc0xheWVy
UXRJbXBsOjpUcmFuc2Zvcm1DaGFuZ2UpOworICAgIEdyYXBoaWNzTGF5ZXI6OnNldFRyYW5zZm9y
bSh0KTsKK30KKworLy8gcmVpbXAgZnJvbSBHcmFwaGljc0xheWVyLmgKK3ZvaWQgR3JhcGhpY3NM
YXllclF0OjpzZXRDaGlsZHJlblRyYW5zZm9ybShjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYg
dCkKK3sKKyAgICBHcmFwaGljc0xheWVyOjpzZXRDaGlsZHJlblRyYW5zZm9ybSh0KTsKKyAgICBt
X2ltcGwtPm5vdGlmeUNoYW5nZShHcmFwaGljc0xheWVyUXRJbXBsOjpDaGlsZHJlblRyYW5zZm9y
bUNoYW5nZSk7Cit9CisKKy8vIHJlaW1wIGZyb20gR3JhcGhpY3NMYXllci5oCit2b2lkIEdyYXBo
aWNzTGF5ZXJRdDo6c2V0UHJlc2VydmVzM0QoYm9vbCBiKQoreworICAgIGlmIChiICE9IHByZXNl
cnZlczNEKCkpOworICAgICAgIG1faW1wbC0+bm90aWZ5Q2hhbmdlKEdyYXBoaWNzTGF5ZXJRdElt
cGw6OlByZXNlcnZlczNEQ2hhbmdlKTsKKyAgICBHcmFwaGljc0xheWVyOjpzZXRQcmVzZXJ2ZXMz
RChiKTsKK30KKworLy8gcmVpbXAgZnJvbSBHcmFwaGljc0xheWVyLmgKK3ZvaWQgR3JhcGhpY3NM
YXllclF0OjpzZXRNYXNrc1RvQm91bmRzKGJvb2wgYikKK3sKKyAgICBHcmFwaGljc0xheWVyOjpz
ZXRNYXNrc1RvQm91bmRzKGIpOworICAgIG1faW1wbC0+bm90aWZ5Q2hhbmdlKEdyYXBoaWNzTGF5
ZXJRdEltcGw6Ok1hc2tzVG9Cb3VuZHNDaGFuZ2UpOworfQorCisvLyByZWltcCBmcm9tIEdyYXBo
aWNzTGF5ZXIuaAordm9pZCBHcmFwaGljc0xheWVyUXQ6OnNldERyYXdzQ29udGVudChib29sIGIp
Cit7CisgICAgbV9pbXBsLT5ub3RpZnlDaGFuZ2UoR3JhcGhpY3NMYXllclF0SW1wbDo6RHJhd3ND
b250ZW50Q2hhbmdlKTsKKyAgICBHcmFwaGljc0xheWVyOjpzZXREcmF3c0NvbnRlbnQoYik7Cit9
CisKKy8vIHJlaW1wIGZyb20gR3JhcGhpY3NMYXllci5oCit2b2lkIEdyYXBoaWNzTGF5ZXJRdDo6
c2V0QmFja2dyb3VuZENvbG9yKGNvbnN0IENvbG9yJiBjKQoreworICAgIG1faW1wbC0+bm90aWZ5
Q2hhbmdlKEdyYXBoaWNzTGF5ZXJRdEltcGw6OkJhY2tncm91bmRDb2xvckNoYW5nZSk7CisgICAg
bV9pbXBsLT5tX3BlbmRpbmdDb250ZW50LmJhY2tncm91bmRDb2xvciA9IGM7CisgICAgR3JhcGhp
Y3NMYXllcjo6c2V0QmFja2dyb3VuZENvbG9yKGMpOworfQorCisvLyByZWltcCBmcm9tIEdyYXBo
aWNzTGF5ZXIuaAordm9pZCBHcmFwaGljc0xheWVyUXQ6OmNsZWFyQmFja2dyb3VuZENvbG9yKCkK
K3sKKyAgICBtX2ltcGwtPm1fcGVuZGluZ0NvbnRlbnQuYmFja2dyb3VuZENvbG9yID0gUUNvbG9y
KCk7CisgICAgbV9pbXBsLT5ub3RpZnlDaGFuZ2UoR3JhcGhpY3NMYXllclF0SW1wbDo6QmFja2dy
b3VuZENvbG9yQ2hhbmdlKTsKKyAgICBHcmFwaGljc0xheWVyOjpjbGVhckJhY2tncm91bmRDb2xv
cigpOworfQorCisvLyByZWltcCBmcm9tIEdyYXBoaWNzTGF5ZXIuaAordm9pZCBHcmFwaGljc0xh
eWVyUXQ6OnNldENvbnRlbnRzT3BhcXVlKGJvb2wgYikKK3sKKyAgICBtX2ltcGwtPm5vdGlmeUNo
YW5nZShHcmFwaGljc0xheWVyUXRJbXBsOjpDb250ZW50c09wYXF1ZUNoYW5nZSk7CisgICAgR3Jh
cGhpY3NMYXllcjo6c2V0Q29udGVudHNPcGFxdWUoYik7Cit9CisKKy8vIHJlaW1wIGZyb20gR3Jh
cGhpY3NMYXllci5oCit2b2lkIEdyYXBoaWNzTGF5ZXJRdDo6c2V0QmFja2ZhY2VWaXNpYmlsaXR5
KGJvb2wgYikKK3sKKyAgICBtX2ltcGwtPm5vdGlmeUNoYW5nZShHcmFwaGljc0xheWVyUXRJbXBs
OjpCYWNrZmFjZVZpc2liaWxpdHlDaGFuZ2UpOworICAgIEdyYXBoaWNzTGF5ZXI6OnNldEJhY2tm
YWNlVmlzaWJpbGl0eShiKTsKK30KKworLy8gcmVpbXAgZnJvbSBHcmFwaGljc0xheWVyLmgKK3Zv
aWQgR3JhcGhpY3NMYXllclF0OjpzZXRPcGFjaXR5KGZsb2F0IG8pCit7CisgICAgaWYgKCFtX2lt
cGwtPm1fb3BhY2l0eUFuaW1hdGlvblJ1bm5pbmcgJiYgb3BhY2l0eSgpICE9IG8pCisgICAgICAg
bV9pbXBsLT5ub3RpZnlDaGFuZ2UoR3JhcGhpY3NMYXllclF0SW1wbDo6T3BhY2l0eUNoYW5nZSk7
CisgICAgR3JhcGhpY3NMYXllcjo6c2V0T3BhY2l0eShvKTsKK30KKworLy8gcmVpbXAgZnJvbSBH
cmFwaGljc0xheWVyLmgKK3ZvaWQgR3JhcGhpY3NMYXllclF0OjpzZXRDb250ZW50c1JlY3QoY29u
c3QgSW50UmVjdCYgcikKK3sKKyAgICBtX2ltcGwtPm5vdGlmeUNoYW5nZShHcmFwaGljc0xheWVy
UXRJbXBsOjpDb250ZW50c1JlY3RDaGFuZ2UpOworICAgIEdyYXBoaWNzTGF5ZXI6OnNldENvbnRl
bnRzUmVjdChyKTsKK30KKworLy8gcmVpbXAgZnJvbSBHcmFwaGljc0xheWVyLmgKK3ZvaWQgR3Jh
cGhpY3NMYXllclF0OjpzZXRDb250ZW50c1RvSW1hZ2UoSW1hZ2UqIGltYWdlKQoreworICAgIG1f
aW1wbC0+bm90aWZ5Q2hhbmdlKEdyYXBoaWNzTGF5ZXJRdEltcGw6OkNvbnRlbnRDaGFuZ2UpOwor
ICAgIG1faW1wbC0+bV9wZW5kaW5nQ29udGVudC5jb250ZW50VHlwZSA9IEdyYXBoaWNzTGF5ZXJR
dEltcGw6OkhUTUxDb250ZW50VHlwZTsKKyAgICBHcmFwaGljc0xheWVyOjpzZXRDb250ZW50c1Rv
SW1hZ2UoaW1hZ2UpOworICAgIGlmIChpbWFnZSkgeworICAgICAgICBRUGl4bWFwKiBweG0gPSBp
bWFnZS0+bmF0aXZlSW1hZ2VGb3JDdXJyZW50RnJhbWUoKTsKKyAgICAgICAgaWYgKHB4bSkgewor
ICAgICAgICAgICAgbV9pbXBsLT5tX3BlbmRpbmdDb250ZW50LnBpeG1hcCA9ICpweG07CisgICAg
ICAgICAgICBtX2ltcGwtPm1fcGVuZGluZ0NvbnRlbnQuY29udGVudFR5cGUgPSBHcmFwaGljc0xh
eWVyUXRJbXBsOjpQaXhtYXBDb250ZW50VHlwZTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAg
ICAgfSAgICAgICAgCisgICAgfQorICAgIG1faW1wbC0+bV9wZW5kaW5nQ29udGVudC5waXhtYXAg
PSBRUGl4bWFwKCk7Cit9CisKKy8vIHJlaW1wIGZyb20gR3JhcGhpY3NMYXllci5oCit2b2lkIEdy
YXBoaWNzTGF5ZXJRdDo6c2V0Q29udGVudHNCYWNrZ3JvdW5kQ29sb3IoY29uc3QgQ29sb3ImIGNv
bG9yKQoreworICAgIG1faW1wbC0+bm90aWZ5Q2hhbmdlKEdyYXBoaWNzTGF5ZXJRdEltcGw6OkNv
bnRlbnRDaGFuZ2UpOworICAgIG1faW1wbC0+bV9wZW5kaW5nQ29udGVudC5jb250ZW50VHlwZSA9
IEdyYXBoaWNzTGF5ZXJRdEltcGw6OkNvbG9yQ29udGVudFR5cGU7CisgICAgbV9pbXBsLT5tX3Bl
bmRpbmdDb250ZW50LmNvbnRlbnRzQmFja2dyb3VuZENvbG9yID0gUUNvbG9yKGNvbG9yKTsKKyAg
ICBHcmFwaGljc0xheWVyOjpzZXRDb250ZW50c0JhY2tncm91bmRDb2xvcihjb2xvcik7Cit9CisK
Ky8vIHJlaW1wIGZyb20gR3JhcGhpY3NMYXllci5oCit2b2lkIEdyYXBoaWNzTGF5ZXJRdDo6c2V0
R2VvbWV0cnlPcmllbnRhdGlvbihDb21wb3NpdGluZ0Nvb3JkaW5hdGVzT3JpZW50YXRpb24gb3Jp
ZW50YXRpb24pCit7CisgICAgbV9pbXBsLT5ub3RpZnlDaGFuZ2UoR3JhcGhpY3NMYXllclF0SW1w
bDo6R2VvbWV0cnlPcmllbnRhdGlvbkNoYW5nZSk7CisgICAgR3JhcGhpY3NMYXllcjo6c2V0R2Vv
bWV0cnlPcmllbnRhdGlvbihvcmllbnRhdGlvbik7Cit9CisKKy8vIHJlaW1wIGZyb20gR3JhcGhp
Y3NMYXllci5oCit2b2lkIEdyYXBoaWNzTGF5ZXJRdDo6c2V0Q29udGVudHNPcmllbnRhdGlvbihD
b21wb3NpdGluZ0Nvb3JkaW5hdGVzT3JpZW50YXRpb24gb3JpZW50YXRpb24pCit7CisgICAgbV9p
bXBsLT5ub3RpZnlDaGFuZ2UoR3JhcGhpY3NMYXllclF0SW1wbDo6Q29udGVudHNPcmllbnRhdGlv
bkNoYW5nZSk7CisgICAgR3JhcGhpY3NMYXllcjo6c2V0Q29udGVudHNPcmllbnRhdGlvbihvcmll
bnRhdGlvbik7Cit9CisKKy8vIHJlaW1wIGZyb20gR3JhcGhpY3NMYXllci5oCit2b2lkIEdyYXBo
aWNzTGF5ZXJRdDo6ZGlzdHJpYnV0ZU9wYWNpdHkoZmxvYXQgbykKK3sKKyAgICBtX2ltcGwtPm5v
dGlmeUNoYW5nZShHcmFwaGljc0xheWVyUXRJbXBsOjpPcGFjaXR5Q2hhbmdlKTsKKyAgICBtX2lt
cGwtPm1fc3RhdGUuZGlzdHJpYnV0ZU9wYWNpdHkgPSB0cnVlOworfQorCisvLyByZWltcCBmcm9t
IEdyYXBoaWNzTGF5ZXIuaAorZmxvYXQgR3JhcGhpY3NMYXllclF0OjphY2N1bXVsYXRlZE9wYWNp
dHkoKSBjb25zdAoreworICAgIHJldHVybiBtX2ltcGwtPmVmZmVjdGl2ZU9wYWNpdHkoKTsKK30K
KworLy8gcmVpbXAgZnJvbSBHcmFwaGljc0xheWVyLmgKK3ZvaWQgR3JhcGhpY3NMYXllclF0Ojpz
eW5jQ29tcG9zaXRpbmdTdGF0ZSgpCit7CisgICAgbV9pbXBsLT5mbHVzaENoYW5nZXMoKTsKKyAg
ICBHcmFwaGljc0xheWVyOjpzeW5jQ29tcG9zaXRpbmdTdGF0ZSgpOworfQorCisvLyByZWltcCBm
cm9tIEdyYXBoaWNzTGF5ZXIuaAorTmF0aXZlTGF5ZXIgR3JhcGhpY3NMYXllclF0OjpuYXRpdmVM
YXllcigpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1faW1wbC5nZXQoKTsKK30KKworLy8gcmVpbXAg
ZnJvbSBHcmFwaGljc0xheWVyLmgKK1BsYXRmb3JtTGF5ZXIqIEdyYXBoaWNzTGF5ZXJRdDo6cGxh
dGZvcm1MYXllcigpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1faW1wbC5nZXQoKTsKK30KKworLy8g
bm93IHdlIHN0YXJ0IGRlYWxpbmcgd2l0aCBXZWJDb3JlIGFuaW1hdGlvbnMgdHJhbnNsYXRlZCB0
byBRdCBhbmltYXRpb25zCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IEtleWZyYW1l
VmFsdWVRdCB7CisgICAgVGltaW5nRnVuY3Rpb24gdGltaW5nRnVuY3Rpb247CisgICAgVCB2YWx1
ZTsKK307CisKKy8vIHdlIGNvcHkgdGhpcyBmcm9tIHRoZSBBbmltYXRpb25CYXNlLmNwcAorc3Rh
dGljIGlubGluZSBkb3VibGUgc29sdmVFcHNpbG9uKGRvdWJsZSBkdXJhdGlvbikKK3sKKyAgICBy
ZXR1cm4gMS4wIC8gKDIwMC4wICogZHVyYXRpb24pOworfQorCitzdGF0aWMgaW5saW5lIGRvdWJs
ZSBzb2x2ZUN1YmljQmV6aWVyRnVuY3Rpb24ocXJlYWwgcDF4LCBxcmVhbCBwMXksIHFyZWFsIHAy
eCwgcXJlYWwgcDJ5LCBkb3VibGUgdCwgZG91YmxlIGR1cmF0aW9uKQoreworICAgIFVuaXRCZXpp
ZXIgYmV6aWVyKHAxeCwgcDF5LCBwMngsIHAyeSk7CisgICAgcmV0dXJuIGJlemllci5zb2x2ZSh0
LCBzb2x2ZUVwc2lsb24oZHVyYXRpb24pKTsKK30KKworLy8gd2Ugd2FudCB0aGUgdGltaW5nIGZ1
bmN0aW9uIHRvIGJlIGFzIGNsb3NlIGFzIHBvc3NpYmxlIHRvIHdoYXQgdGhlIHdlYi1kZXZlbG9w
ZXIgaW50ZW5kZWQsIHNvIHdlJ3JlIHVzaW5nIHRoZSBzYW1lIGZ1bmN0aW9uIHVzZWQgYnkgV2Vi
Q29yZSB3aGVuIGNvbXBvc2l0aW5nIGlzIGRpc2FibGVkCisvLyBVc2luZyBlYXNpbmctY3VydmVz
IHdvdWxkIHByb2JhYmx5IHdvcmsgZm9yIHNvbWUgb2YgdGhlIGNhc2VzLCBidXQgd291bGRuJ3Qg
cmVhbGx5IGJ1eSB1cyBhbnl0aGluZyBhcyB3ZSdkIGhhdmUgdG8gY29udmVydCB0aGUgYmV6aWVy
IGZ1bmN0aW9uIGJhY2sgdG8gYW4gZWFzaW5nIGN1cnZlCitzdGF0aWMgaW5saW5lIHFyZWFsIGFw
cGx5VGltaW5nRnVuY3Rpb24oY29uc3QgVGltaW5nRnVuY3Rpb24mIHRpbWluZ0Z1bmN0aW9uLCBx
cmVhbCBwcm9ncmVzcywgaW50IGR1cmF0aW9uKQoreworICAgIGlmICh0aW1pbmdGdW5jdGlvbi50
eXBlKCkgPT0gTGluZWFyVGltaW5nRnVuY3Rpb24pCisgICAgICAgIHJldHVybiBwcm9ncmVzczsK
KyAgICBpZiAodGltaW5nRnVuY3Rpb24udHlwZSgpID09IEN1YmljQmV6aWVyVGltaW5nRnVuY3Rp
b24pIHsKKyAgICAgICAgcmV0dXJuIHNvbHZlQ3ViaWNCZXppZXJGdW5jdGlvbih0aW1pbmdGdW5j
dGlvbi54MSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWlu
Z0Z1bmN0aW9uLnkxKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
dGltaW5nRnVuY3Rpb24ueDIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICB0aW1pbmdGdW5jdGlvbi55MigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGRvdWJsZShwcm9ncmVzcyksIGRvdWJsZShkdXJhdGlvbikgLyAxMDAwKTsKKyAg
ICB9CisgICAgcmV0dXJuIHByb2dyZXNzOworfQorCisvLyBoZWxwZXIgZnVuY3Rpb25zIHRvIHNh
ZmVseSBnZXQgYSB2YWx1ZSBvdXQgb2YgV2ViQ29yZSdzIEFuaW1hdGlvblZhbHVlKgorc3RhdGlj
IHZvaWQgd2Via2l0QW5pbWF0aW9uVG9RdEFuaW1hdGlvblZhbHVlKGNvbnN0IEFuaW1hdGlvblZh
bHVlKiBhbmltYXRpb25WYWx1ZSwgVHJhbnNmb3JtT3BlcmF0aW9ucyYgdHJhbnNmb3JtT3BlcmF0
aW9ucykKK3sKKyAgICB0cmFuc2Zvcm1PcGVyYXRpb25zID0gVHJhbnNmb3JtT3BlcmF0aW9ucygp
OworICAgIGlmICghYW5pbWF0aW9uVmFsdWUpCisgICAgICAgIHJldHVybjsKKworICAgIGNvbnN0
IFRyYW5zZm9ybU9wZXJhdGlvbnMqIG9wcyA9IHN0YXRpY19jYXN0PGNvbnN0IFRyYW5zZm9ybUFu
aW1hdGlvblZhbHVlKj4oYW5pbWF0aW9uVmFsdWUpLT52YWx1ZSgpOworCisgICAgaWYgKG9wcykK
KyAgICAgICAgdHJhbnNmb3JtT3BlcmF0aW9ucyA9ICpvcHM7Cit9CisKK3N0YXRpYyB2b2lkIHdl
YmtpdEFuaW1hdGlvblRvUXRBbmltYXRpb25WYWx1ZShjb25zdCBBbmltYXRpb25WYWx1ZSogYW5p
bWF0aW9uVmFsdWUsIHFyZWFsJiByZWFsVmFsdWUpCit7CisgICAgcmVhbFZhbHVlID0gYW5pbWF0
aW9uVmFsdWUgPyBzdGF0aWNfY2FzdDxjb25zdCBGbG9hdEFuaW1hdGlvblZhbHVlKj4oYW5pbWF0
aW9uVmFsdWUpLT52YWx1ZSgpIDogMDsKK30KKworLy8gd2UgcHV0IGEgYml0IG9mIHRoZSBmdW5j
dGlvbmFsaXR5IGluIGEgYmFzZSBjbGFzcyB0byBhbGxvdyBjYXN0aW5nIGFuZCB0byBzYXZlIHNv
bWUgY29kZSBzaXplCitjbGFzcyBBbmltYXRpb25RdEJhc2UgOiBwdWJsaWMgUUFic3RyYWN0QW5p
bWF0aW9uIHsKK3B1YmxpYzoKKyAgICBBbmltYXRpb25RdEJhc2UoR3JhcGhpY3NMYXllclF0SW1w
bCogbGF5ZXIsIGNvbnN0IEtleWZyYW1lVmFsdWVMaXN0JiB2YWx1ZXMsIGNvbnN0IEludFNpemUm
IGJveFNpemUsIGNvbnN0IEFuaW1hdGlvbiogYW5pbSwgY29uc3QgUVN0cmluZyAmIG5hbWUpCisg
ICAgICAgIDogUUFic3RyYWN0QW5pbWF0aW9uKDApCisgICAgICAgICwgbV9sYXllcihsYXllcikK
KyAgICAgICAgLCBtX2JveFNpemUoYm94U2l6ZSkKKyAgICAgICAgLCBtX2R1cmF0aW9uKGFuaW0t
PmR1cmF0aW9uKCkgKiAxMDAwKQorICAgICAgICAsIG1faXNBbHRlcm5hdGUoYW5pbS0+ZGlyZWN0
aW9uKCkgPT0gQW5pbWF0aW9uOjpBbmltYXRpb25EaXJlY3Rpb25BbHRlcm5hdGUpCisgICAgICAg
ICwgbV93ZWJraXRQcm9wZXJ0eUlEKHZhbHVlcy5wcm9wZXJ0eSgpKQorICAgICAgICAsIG1fa2V5
ZnJhbWVzTmFtZShuYW1lKQorICAgIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgdXBkYXRl
U3RhdGUoUUFic3RyYWN0QW5pbWF0aW9uOjpTdGF0ZSBuZXdTdGF0ZSwgUUFic3RyYWN0QW5pbWF0
aW9uOjpTdGF0ZSBvbGRTdGF0ZSkKKyAgICB7CisgICAgICAgIFFBYnN0cmFjdEFuaW1hdGlvbjo6
dXBkYXRlU3RhdGUobmV3U3RhdGUsIG9sZFN0YXRlKTsKKworICAgICAgICAvLyBmb3Igc29tZSBy
ZWFzb24gSSBoYXZlIGRvIHRoaXMgYXN5bmNocm9ub3VzbHkgLSBvciB0aGUgYW5pbWF0aW9uIHdv
bid0IHdvcmsKKyAgICAgICAgaWYgKG5ld1N0YXRlID09IFJ1bm5pbmcgJiYgb2xkU3RhdGUgPT0g
U3RvcHBlZCkKKyAgICAgICAgICAgIFFUaW1lcjo6c2luZ2xlU2hvdCgwLCBtX2xheWVyLmRhdGEo
KSwgU0xPVChub3RpZnlBbmltYXRpb25TdGFydGVkKCkpKTsKKyAgICB9CisKKyAgICB2aXJ0dWFs
IGludCBkdXJhdGlvbigpIGNvbnN0IHsgcmV0dXJuIG1fZHVyYXRpb247IH0KKworICAgIFFXZWFr
UG9pbnRlcjxHcmFwaGljc0xheWVyUXRJbXBsPiBtX2xheWVyOworICAgIEludFNpemUgbV9ib3hT
aXplOworICAgIGludCBtX2R1cmF0aW9uOworICAgIGJvb2wgbV9pc0FsdGVybmF0ZTsKKyAgICBB
bmltYXRlZFByb3BlcnR5SUQgbV93ZWJraXRQcm9wZXJ0eUlEOworICAgIFFTdHJpbmcgbV9rZXlm
cmFtZXNOYW1lOworfTsKKworLy8gd2UnZCByYXRoZXIgaGF2ZSBhIHRlbXBsYXRpemVkIFFBYnN0
cmFjdEFuaW1hdGlvbiB0aGFuIFFQcm9wZXJ0eUFuaW1hdGlvbiAvIFFWYXJpYW50QW5pbWF0aW9u
OworLy8gU2luY2Ugd2Uga25vdyB0aGUgdHlwZXMgdGhhdCB3ZSdyZSBkZWFsaW5nIHdpdGgsIHRo
ZSBRT2JqZWN0L1FQcm9wZXJ0eS9RVmFyaWFudCBhYnN0cmFjdGlvbgorLy8gYnV5cyB1cyB2ZXJ5
IGxpdHRsZSBpbiB0aGlzIGNhc2UsIGZvciB0b28gbXVjaCBvdmVyaGVhZAordGVtcGxhdGUgPHR5
cGVuYW1lIFQ+CitjbGFzcyBBbmltYXRpb25RdCA6IHB1YmxpYyBBbmltYXRpb25RdEJhc2Ugewor
CitwdWJsaWM6CisgICAgQW5pbWF0aW9uUXQoR3JhcGhpY3NMYXllclF0SW1wbCogbGF5ZXIsIGNv
bnN0IEtleWZyYW1lVmFsdWVMaXN0JiB2YWx1ZXMsIGNvbnN0IEludFNpemUmIGJveFNpemUsIGNv
bnN0IEFuaW1hdGlvbiogYW5pbSwgY29uc3QgUVN0cmluZyAmIG5hbWUpCisgICAgICAgIDpBbmlt
YXRpb25RdEJhc2UobGF5ZXIsIHZhbHVlcywgYm94U2l6ZSwgYW5pbSwgbmFtZSkKKyAgICB7Cisg
ICAgICAgIC8vIGNvcHlpbmcgdGhvc2UgV2ViQ29yZSBzdHJ1Y3R1cmVzIGlzIG5vdCB0cml2aWFs
LCB3ZSBoYXZlIHRvIGRvIGl0IGxpa2UgdGhpcworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsg
aSA8IHZhbHVlcy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgY29uc3QgQW5pbWF0aW9uVmFs
dWUqIGFuaW1hdGlvblZhbHVlID0gdmFsdWVzLmF0KGkpOworICAgICAgICAgICAgS2V5ZnJhbWVW
YWx1ZVF0PFQ+IGtleWZyYW1lVmFsdWU7CisgICAgICAgICAgICBpZiAoYW5pbWF0aW9uVmFsdWUt
PnRpbWluZ0Z1bmN0aW9uKCkpCisgICAgICAgICAgICAgICAga2V5ZnJhbWVWYWx1ZS50aW1pbmdG
dW5jdGlvbiA9ICphbmltYXRpb25WYWx1ZS0+dGltaW5nRnVuY3Rpb24oKTsKKyAgICAgICAgICAg
IHdlYmtpdEFuaW1hdGlvblRvUXRBbmltYXRpb25WYWx1ZShhbmltYXRpb25WYWx1ZSwga2V5ZnJh
bWVWYWx1ZS52YWx1ZSk7CisgICAgICAgICAgICBtX2tleWZyYW1lVmFsdWVzW2FuaW1hdGlvblZh
bHVlLT5rZXlUaW1lKCldID0ga2V5ZnJhbWVWYWx1ZTsKKyAgICAgICAgfQorICAgIH0KKworcHJv
dGVjdGVkOgorCisgICAgLy8gdGhpcyBpcyB0aGUgcGFydCB0aGF0IGRpZmZlcnMgYmV0d2VlbiBh
bmltYXRlZCBwcm9wZXJ0aWVzCisgICAgdmlydHVhbCB2b2lkIGFwcGx5RnJhbWUoY29uc3QgVCYg
ZnJvbVZhbHVlLCBjb25zdCBUJiB0b1ZhbHVlLCBxcmVhbCBwcm9ncmVzcykgPSAwOworCisgICAg
dmlydHVhbCB2b2lkIHVwZGF0ZUN1cnJlbnRUaW1lKGludCBjdXJyZW50VGltZSkKKyAgICB7Cisg
ICAgICAgIGlmICghbV9sYXllcikKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBxcmVh
bCBwcm9ncmVzcyA9IHFyZWFsKGN1cnJlbnRMb29wVGltZSgpKSAvIGR1cmF0aW9uKCk7CisKKyAg
ICAgICAgaWYgKG1faXNBbHRlcm5hdGUgJiYgY3VycmVudExvb3AoKSUyKQorICAgICAgICAgICAg
cHJvZ3Jlc3MgPSAxLXByb2dyZXNzOworCisgICAgICAgIGlmIChtX2tleWZyYW1lVmFsdWVzLmlz
RW1wdHkoKSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAvLyB3ZSBmaW5kIHRoZSBj
dXJyZW50IGZyb20tdG8ga2V5ZnJhbWVzIGluIG91ciBsaXR0bGUgbWFwCisgICAgICAgIHR5cGVu
YW1lIFFNYXA8cXJlYWwsIEtleWZyYW1lVmFsdWVRdDxUPiA+OjppdGVyYXRvciBpdCA9IG1fa2V5
ZnJhbWVWYWx1ZXMuZmluZChwcm9ncmVzcyk7CisKKyAgICAgICAgLy8gd2UgZGlkbid0IGZpbmQg
YW4gZXhhY3QgbWF0Y2gsIHdlIHRyeSB0aGUgY2xvc2VzdCBtYXRjaCAobG93ZXIgYm91bmQpCisg
ICAgICAgIGlmIChpdCA9PSBtX2tleWZyYW1lVmFsdWVzLmVuZCgpKQorICAgICAgICAgICAgaXQg
PSBtX2tleWZyYW1lVmFsdWVzLmxvd2VyQm91bmQocHJvZ3Jlc3MpLTE7CisKKyAgICAgICAgLy8g
d2UgZGlkbid0IGZpbmQgYW55IG1hdGNoIC0gd2UgdXNlIHRoZSBmaXJzdCBrZXlmcmFtZQorICAg
ICAgICBpZiAoaXQgPT0gbV9rZXlmcmFtZVZhbHVlcy5lbmQoKSkKKyAgICAgICAgICAgIGl0ID0g
bV9rZXlmcmFtZVZhbHVlcy5iZWdpbigpOworCisgICAgICAgIHR5cGVuYW1lIFFNYXA8cXJlYWws
IEtleWZyYW1lVmFsdWVRdDxUPiA+OjppdGVyYXRvciBpdDIgPSBpdCsxOworICAgICAgICBpZiAo
aXQyID09IG1fa2V5ZnJhbWVWYWx1ZXMuZW5kKCkpCisgICAgICAgICAgICBpdDIgPSBtX2tleWZy
YW1lVmFsdWVzLmJlZ2luKCk7CisgICAgICAgIGNvbnN0IEtleWZyYW1lVmFsdWVRdDxUPiYgZnJv
bUtleWZyYW1lID0gaXQudmFsdWUoKTsKKyAgICAgICAgY29uc3QgS2V5ZnJhbWVWYWx1ZVF0PFQ+
JiB0b0tleWZyYW1lID0gaXQyLnZhbHVlKCk7CisKKyAgICAgICAgY29uc3QgVGltaW5nRnVuY3Rp
b24mIHRpbWluZ0Z1bmMgPSBmcm9tS2V5ZnJhbWUudGltaW5nRnVuY3Rpb247CisgICAgICAgIGNv
bnN0IFQmIGZyb21WYWx1ZSA9IGZyb21LZXlmcmFtZS52YWx1ZTsKKyAgICAgICAgY29uc3QgVCYg
dG9WYWx1ZSA9IHRvS2V5ZnJhbWUudmFsdWU7CisKKyAgICAgICAgLy8gbm93IHdlIGhhdmUgYSBz
b3VyY2Uga2V5ZnJhbWUsIG9yaWdpbiBrZXlmcmFtZSBhbmQgYSB0aW1pbmcgZnVuY3Rpb24KKyAg
ICAgICAgLy8gd2UgY2FuIG5vdyBwcm9jZXNzIHRoZSBwcm9ncmVzcyBhbmQgYXBwbHkgdGhlIGZy
YW1lCisgICAgICAgIHFyZWFsIG5vcm1hbGl6ZWRQcm9ncmVzcyA9IChpdC5rZXkoKSA9PSBpdDIu
a2V5KCkpID8gMCA6IChwcm9ncmVzcyAtIGl0LmtleSgpKSAvIChpdDIua2V5KCkgLSBpdC5rZXko
KSk7CisgICAgICAgIG5vcm1hbGl6ZWRQcm9ncmVzcyA9IGFwcGx5VGltaW5nRnVuY3Rpb24odGlt
aW5nRnVuYywgbm9ybWFsaXplZFByb2dyZXNzLCBkdXJhdGlvbigpIC8gMTAwMCk7CisgICAgICAg
IGFwcGx5RnJhbWUoZnJvbVZhbHVlLCB0b1ZhbHVlLCBub3JtYWxpemVkUHJvZ3Jlc3MpOworICAg
IH0KKworICAgIFFNYXA8cXJlYWwsIEtleWZyYW1lVmFsdWVRdDxUPiA+IG1fa2V5ZnJhbWVWYWx1
ZXM7Cit9OworCitjbGFzcyBUcmFuc2Zvcm1BbmltYXRpb25RdCA6IHB1YmxpYyBBbmltYXRpb25R
dDxUcmFuc2Zvcm1PcGVyYXRpb25zPiB7CitwdWJsaWM6CisgICAgVHJhbnNmb3JtQW5pbWF0aW9u
UXQoR3JhcGhpY3NMYXllclF0SW1wbCogbGF5ZXIsIGNvbnN0IEtleWZyYW1lVmFsdWVMaXN0JiB2
YWx1ZXMsIGNvbnN0IEludFNpemUmIGJveFNpemUsIGNvbnN0IEFuaW1hdGlvbiogYW5pbSwgY29u
c3QgUVN0cmluZyAmIG5hbWUpCisgICAgICAgICAgICAgICAgOiBBbmltYXRpb25RdDxUcmFuc2Zv
cm1PcGVyYXRpb25zPihsYXllciwgdmFsdWVzLCBib3hTaXplLCBhbmltLCBuYW1lKQorICAgIHsK
KyAgICB9CisKKyAgICB+VHJhbnNmb3JtQW5pbWF0aW9uUXQoKQorICAgIHsKKyAgICAgICAgLy8g
dGhpcyBjYW1lIHVwIGR1cmluZyB0aGUgY29tcG9zaXRpbmcvYW5pbWF0aW9uIExheW91dFRlc3Rz
CisgICAgICAgIC8vIHdoZW4gdGhlIGFuaW1hdGlvbiBkaWVzLCB0aGUgdHJhbnNmb3JtIGhhcyB0
byBnbyBiYWNrIHRvIGRlZmF1bHQKKyAgICAgICAgaWYgKG1fbGF5ZXIpCisgICAgICAgICAgICBt
X2xheWVyLmRhdGEoKS0+c2V0QmFzZVRyYW5zZm9ybShRVHJhbnNmb3JtKG1fbGF5ZXIuZGF0YSgp
LT5tX2xheWVyLT50cmFuc2Zvcm0oKSkpOworICAgIH0KKworICAgIC8vIHRoZSBpZGVhIGlzIHRo
YXQgd2UgbGV0IFdlYkNvcmUgbWFuYWdlIHRoZSB0cmFuc2Zvcm0tb3BlcmF0aW9ucworICAgIC8v
IGFuZCBRdCBqdXN0IG1hbmFnZXMgdGhlIGFuaW1hdGlvbiBoZWFydGJlYXQgYW5kIHRoZSBib3R0
b20tbGluZSBRVHJhbnNmb3JtCisgICAgLy8gd2UgZ2V0IHRoZSBwZXJmb3JtYW5jZSBub3QgYnkg
dXNpbmcgUVRyYW5zZm9ybSBpbnN0ZWFkIG9mIFRyYW5zZm9ybWF0aW9uTWF0cml4LCBidXQgYnkg
cHJvcGVyIGNhY2hpbmcgb2YKKyAgICAvLyBpdGVtcyB0aGF0IGFyZSBleHBlbnNpdmUgZm9yIFdl
YkNvcmUgdG8gcmVuZGVyLiBXZSB3YW50IHRoZSByZXN0IHRvIGJlIGFzIGNsb3NlIHRvIFdlYkNv
cmUncyBpZGVhIGFzIHBvc3NpYmxlLgorICAgIHZpcnR1YWwgdm9pZCBhcHBseUZyYW1lKGNvbnN0
IFRyYW5zZm9ybU9wZXJhdGlvbnMmIHNvdXJjZU9wZXJhdGlvbnMsIGNvbnN0IFRyYW5zZm9ybU9w
ZXJhdGlvbnMmIHRhcmdldE9wZXJhdGlvbnMsIHFyZWFsIHByb2dyZXNzKQorICAgIHsKKyAgICAg
ICAgVHJhbnNmb3JtYXRpb25NYXRyaXggdHJhbnNmb3JtTWF0cml4OworCisgICAgICAgIC8vIHRo
aXMgbG9va3Mgc2ltcGxlIGJ1dCBpcyByZWFsbHkgdHJpY2t5IHRvIGdldCByaWdodC4gVXNlIGNh
dXRpb24uCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdGFyZ2V0T3BlcmF0aW9ucy5z
aXplKCk7ICsraSkKKyAgICAgICAgICAgIHRhcmdldE9wZXJhdGlvbnMub3BlcmF0aW9ucygpW2ld
LT5ibGVuZChzb3VyY2VPcGVyYXRpb25zLmF0KGkpLCBwcm9ncmVzcyktPmFwcGx5KHRyYW5zZm9y
bU1hdHJpeCwgbV9ib3hTaXplKTsKKworICAgICAgICBtX2xheWVyLmRhdGEoKS0+c2V0QmFzZVRy
YW5zZm9ybShRVHJhbnNmb3JtKHRyYW5zZm9ybU1hdHJpeCkpOworICAgIH0KKworICAgIHZpcnR1
YWwgdm9pZCB1cGRhdGVTdGF0ZShRQWJzdHJhY3RBbmltYXRpb246OlN0YXRlIG5ld1N0YXRlLCBR
QWJzdHJhY3RBbmltYXRpb246OlN0YXRlIG9sZFN0YXRlKQorICAgIHsKKyAgICAgICAgQW5pbWF0
aW9uUXRCYXNlOjp1cGRhdGVTdGF0ZShuZXdTdGF0ZSwgb2xkU3RhdGUpOworICAgICAgICBpZiAo
IW1fbGF5ZXIpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIG1fbGF5ZXIuZGF0YSgpLT5m
bHVzaENoYW5nZXModHJ1ZSk7CisKKyAgICAgICAgLy8gdG8gaW5jcmVhc2UgRlBTLCB3ZSB1c2Ug
YSBsZXNzIGFjY3VyYXRlIGNhY2hpbmcgbWVjaGFuaXNtIHdoaWxlIGFuaW1hdGlvbiBpcyBnb2lu
ZyBvbgorICAgICAgICAvLyB0aGlzIGlzIGEgVVggY2hvaWNlIHRoYXQgc2hvdWxkIHByb2JhYmx5
IGJlIGN1c3RvbWl6YWJsZQorICAgICAgICBpZiAobmV3U3RhdGUgPT0gUUFic3RyYWN0QW5pbWF0
aW9uOjpSdW5uaW5nKSB7CisgICAgICAgICAgICBtX2xheWVyLmRhdGEoKS0+bV90cmFuc2Zvcm1B
bmltYXRpb25SdW5uaW5nID0gdHJ1ZTsKKyAgICAgICAgICAgIGlmIChtX2xheWVyLmRhdGEoKS0+
Y2FjaGVNb2RlKCkgPT0gUUdyYXBoaWNzSXRlbTo6RGV2aWNlQ29vcmRpbmF0ZUNhY2hlKQorICAg
ICAgICAgICAgICAgIG1fbGF5ZXIuZGF0YSgpLT5zZXRDYWNoZU1vZGUoUUdyYXBoaWNzSXRlbTo6
SXRlbUNvb3JkaW5hdGVDYWNoZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtX2xh
eWVyLmRhdGEoKS0+bV90cmFuc2Zvcm1BbmltYXRpb25SdW5uaW5nID0gZmFsc2U7CisgICAgICAg
ICAgICBpZiAobV9sYXllci5kYXRhKCktPmNhY2hlTW9kZSgpID09IFFHcmFwaGljc0l0ZW06Okl0
ZW1Db29yZGluYXRlQ2FjaGUpCisgICAgICAgICAgICAgICAgbV9sYXllci5kYXRhKCktPnNldENh
Y2hlTW9kZShRR3JhcGhpY3NJdGVtOjpEZXZpY2VDb29yZGluYXRlQ2FjaGUpOworICAgICAgICB9
CisgICAgfQorfTsKKworY2xhc3MgT3BhY2l0eUFuaW1hdGlvblF0IDogcHVibGljIEFuaW1hdGlv
blF0PHFyZWFsPiB7CitwdWJsaWM6CisgICAgT3BhY2l0eUFuaW1hdGlvblF0KEdyYXBoaWNzTGF5
ZXJRdEltcGwqIGxheWVyLCBjb25zdCBLZXlmcmFtZVZhbHVlTGlzdCYgdmFsdWVzLCBjb25zdCBJ
bnRTaXplJiBib3hTaXplLCBjb25zdCBBbmltYXRpb24qIGFuaW0sIGNvbnN0IFFTdHJpbmcgJiBu
YW1lKQorICAgICAgICAgOiBBbmltYXRpb25RdDxxcmVhbD4obGF5ZXIsIHZhbHVlcywgYm94U2l6
ZSwgYW5pbSwgbmFtZSkKKyAgICB7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIGFwcGx5RnJh
bWUoY29uc3QgcXJlYWwmIGZyb21WYWx1ZSwgY29uc3QgcXJlYWwmIHRvVmFsdWUsIHFyZWFsIHBy
b2dyZXNzKQorICAgIHsKKyAgICAgICAgbV9sYXllci5kYXRhKCktPnNldE9wYWNpdHkocU1pbjxx
cmVhbD4ocU1heDxxcmVhbD4oZnJvbVZhbHVlICsgKHRvVmFsdWUtZnJvbVZhbHVlKSpwcm9ncmVz
cywgMCksIDEpKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlU3RhdGUoUUFic3Ry
YWN0QW5pbWF0aW9uOjpTdGF0ZSBuZXdTdGF0ZSwgUUFic3RyYWN0QW5pbWF0aW9uOjpTdGF0ZSBv
bGRTdGF0ZSkKKyAgICB7CisgICAgICAgIFFBYnN0cmFjdEFuaW1hdGlvbjo6dXBkYXRlU3RhdGUo
bmV3U3RhdGUsIG9sZFN0YXRlKTsKKyAgICAgICAgaWYgKG1fbGF5ZXIpCisgICAgICAgICAgICBt
X2xheWVyLmRhdGEoKS0+bV9vcGFjaXR5QW5pbWF0aW9uUnVubmluZyA9IChuZXdTdGF0ZSA9PSBR
QWJzdHJhY3RBbmltYXRpb246OlJ1bm5pbmcpOworICAgIH0KK307CisKK2Jvb2wgR3JhcGhpY3NM
YXllclF0OjphZGRBbmltYXRpb24oY29uc3QgS2V5ZnJhbWVWYWx1ZUxpc3QmIHZhbHVlcywgY29u
c3QgSW50U2l6ZSYgYm94U2l6ZSwgY29uc3QgQW5pbWF0aW9uKiBhbmltLCBjb25zdCBTdHJpbmcm
IGtleWZyYW1lc05hbWUsIGRvdWJsZSB0aW1lT2Zmc2V0KQoreworICAgIGlmICghYW5pbS0+ZHVy
YXRpb24oKSB8fCAhYW5pbS0+aXRlcmF0aW9uQ291bnQoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNl
OworCisgICAgUUFic3RyYWN0QW5pbWF0aW9uKiBuZXdBbmltOworCisgICAgc3dpdGNoICh2YWx1
ZXMucHJvcGVydHkoKSkgeworICAgIGNhc2UgQW5pbWF0ZWRQcm9wZXJ0eU9wYWNpdHk6CisgICAg
ICAgIG5ld0FuaW0gPSBuZXcgT3BhY2l0eUFuaW1hdGlvblF0KG1faW1wbC5nZXQoKSwgdmFsdWVz
LCBib3hTaXplLCBhbmltLCBrZXlmcmFtZXNOYW1lKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2Fz
ZSBBbmltYXRlZFByb3BlcnR5V2Via2l0VHJhbnNmb3JtOgorICAgICAgICBuZXdBbmltID0gbmV3
IFRyYW5zZm9ybUFuaW1hdGlvblF0KG1faW1wbC5nZXQoKSwgdmFsdWVzLCBib3hTaXplLCBhbmlt
LCBrZXlmcmFtZXNOYW1lKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAg
cmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIHdlIG1ha2Ugc3VyZSBXZWJDb3JlOjpBbmlt
YXRpb24gYW5kIFFBbmltYXRpb24gYXJlIG9uIHRoZSBzYW1lIHRlcm1zCisgICAgbmV3QW5pbS0+
c2V0TG9vcENvdW50KGFuaW0tPml0ZXJhdGlvbkNvdW50KCkpOworICAgIG1faW1wbC0+bV9hbmlt
YXRpb25zLmFwcGVuZChRV2Vha1BvaW50ZXI8UUFic3RyYWN0QW5pbWF0aW9uPihuZXdBbmltKSk7
CisgICAgUU9iamVjdDo6Y29ubmVjdCgmbV9pbXBsLT5tX3N1c3BlbmRUaW1lciwgU0lHTkFMKHRp
bWVvdXQoKSksIG5ld0FuaW0sIFNMT1QocmVzdW1lKCkpKTsKKyAgICB0aW1lT2Zmc2V0ICs9IGFu
aW0tPmRlbGF5KCk7CisKKyAgICAvLyBmbHVzaCBub3cgb3IgZmxpY2tlci4uLgorICAgIG1faW1w
bC0+Zmx1c2hDaGFuZ2VzKGZhbHNlKTsKKworICAgIGlmICh0aW1lT2Zmc2V0KQorICAgICAgICBR
VGltZXI6OnNpbmdsZVNob3QodGltZU9mZnNldCAqIDEwMDAsIG5ld0FuaW0sIFNMT1Qoc3RhcnQo
KSkpOworICAgIGVsc2UKKyAgICAgICAgbmV3QW5pbS0+c3RhcnQoKTsKKworICAgIFFPYmplY3Q6
OmNvbm5lY3QobmV3QW5pbSwgU0lHTkFMKGZpbmlzaGVkKCkpLCBuZXdBbmltLCBTTE9UKGRlbGV0
ZUxhdGVyKCkpKTsKKworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJR
dDo6cmVtb3ZlQW5pbWF0aW9uc0ZvclByb3BlcnR5KEFuaW1hdGVkUHJvcGVydHlJRCBpZCkKK3sK
KyAgICBmb3IgKFFMaXN0PFFXZWFrUG9pbnRlcjxRQWJzdHJhY3RBbmltYXRpb24+ID46Oml0ZXJh
dG9yIGl0ID0gbV9pbXBsLT5tX2FuaW1hdGlvbnMuYmVnaW4oKTsgaXQgIT0gbV9pbXBsLT5tX2Fu
aW1hdGlvbnMuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgaWYgKCppdCkgeworICAgICAgICAgICAg
QW5pbWF0aW9uUXRCYXNlKiBhbmltID0gc3RhdGljX2Nhc3Q8QW5pbWF0aW9uUXRCYXNlKj4oaXQt
PmRhdGEoKSk7CisgICAgICAgICAgICBpZiAoYW5pbSAmJiBhbmltLT5tX3dlYmtpdFByb3BlcnR5
SUQgPT0gaWQpIHsKKyAgICAgICAgICAgICAgICBkZWxldGUgYW5pbTsKKyAgICAgICAgICAgICAg
ICBpdCA9IG1faW1wbC0+bV9hbmltYXRpb25zLmVyYXNlKGl0KTsKKyAgICAgICAgICAgICAgICAt
LWl0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCit2b2lkIEdyYXBoaWNz
TGF5ZXJRdDo6cmVtb3ZlQW5pbWF0aW9uc0ZvcktleWZyYW1lcyhjb25zdCBTdHJpbmcmIG5hbWUp
Cit7CisgICAgZm9yIChRTGlzdDxRV2Vha1BvaW50ZXI8UUFic3RyYWN0QW5pbWF0aW9uPiA+Ojpp
dGVyYXRvciBpdCA9IG1faW1wbC0+bV9hbmltYXRpb25zLmJlZ2luKCk7IGl0ICE9IG1faW1wbC0+
bV9hbmltYXRpb25zLmVuZCgpOyArK2l0KSB7CisgICAgICAgIGlmICgqaXQpIHsKKyAgICAgICAg
ICAgIEFuaW1hdGlvblF0QmFzZSogYW5pbSA9IHN0YXRpY19jYXN0PEFuaW1hdGlvblF0QmFzZSo+
KCgqaXQpLmRhdGEoKSk7CisgICAgICAgICAgICBpZiAoYW5pbSAmJiBhbmltLT5tX2tleWZyYW1l
c05hbWUgPT0gUVN0cmluZyhuYW1lKSkgeworICAgICAgICAgICAgICAgICgqaXQpLmRhdGEoKS0+
ZGVsZXRlTGF0ZXIoKTsKKyAgICAgICAgICAgICAgICBpdCA9IG1faW1wbC0+bV9hbmltYXRpb25z
LmVyYXNlKGl0KTsKKyAgICAgICAgICAgICAgICAtLWl0OworICAgICAgICAgICAgfQorICAgICAg
ICB9CisgICAgfQorfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJRdDo6cGF1c2VBbmltYXRpb24oY29u
c3QgU3RyaW5nJiBuYW1lLCBkb3VibGUgdGltZU9mZnNldCkKK3sKKyAgICBmb3IgKFFMaXN0PFFX
ZWFrUG9pbnRlcjxRQWJzdHJhY3RBbmltYXRpb24+ID46Oml0ZXJhdG9yIGl0ID0gbV9pbXBsLT5t
X2FuaW1hdGlvbnMuYmVnaW4oKTsgaXQgIT0gbV9pbXBsLT5tX2FuaW1hdGlvbnMuZW5kKCk7ICsr
aXQpIHsKKyAgICAgICAgaWYgKCppdCkgeworICAgICAgICAgICAgQW5pbWF0aW9uUXRCYXNlKiBh
bmltID0gc3RhdGljX2Nhc3Q8QW5pbWF0aW9uUXRCYXNlKj4oKCppdCkuZGF0YSgpKTsKKyAgICAg
ICAgICAgIGlmIChhbmltICYmIGFuaW0tPm1fa2V5ZnJhbWVzTmFtZSA9PSBRU3RyaW5nKG5hbWUp
KQorICAgICAgICAgICAgICAgIFFUaW1lcjo6c2luZ2xlU2hvdCh0aW1lT2Zmc2V0ICogMTAwMCwg
YW5pbSwgU0xPVChwYXVzZSgpKSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgR3JhcGhp
Y3NMYXllclF0OjpzdXNwZW5kQW5pbWF0aW9ucyhkb3VibGUgdGltZSkKK3sKKyAgICBpZiAobV9p
bXBsLT5tX3N1c3BlbmRUaW1lci5pc0FjdGl2ZSgpKSB7CisgICAgICAgIG1faW1wbC0+bV9zdXNw
ZW5kVGltZXIuc3RvcCgpOworICAgICAgICBtX2ltcGwtPm1fc3VzcGVuZFRpbWVyLnN0YXJ0KHRp
bWUgKiAxMDAwKTsKKyAgICB9IGVsc2UgeworICAgICAgICBmb3IgKFFMaXN0PFFXZWFrUG9pbnRl
cjxRQWJzdHJhY3RBbmltYXRpb24+ID46Oml0ZXJhdG9yIGl0ID0gbV9pbXBsLT5tX2FuaW1hdGlv
bnMuYmVnaW4oKTsgaXQgIT0gbV9pbXBsLT5tX2FuaW1hdGlvbnMuZW5kKCk7ICsraXQpIHsKKyAg
ICAgICAgICAgIFFBYnN0cmFjdEFuaW1hdGlvbiogYW5pbSA9IGl0LT5kYXRhKCk7CisgICAgICAg
ICAgICBpZiAoYW5pbSkKKyAgICAgICAgICAgICAgICBhbmltLT5wYXVzZSgpOworICAgICAgICB9
CisgICAgfQorfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJRdDo6cmVzdW1lQW5pbWF0aW9ucygpCit7
CisgICAgaWYgKG1faW1wbC0+bV9zdXNwZW5kVGltZXIuaXNBY3RpdmUoKSkgeworICAgICAgICBt
X2ltcGwtPm1fc3VzcGVuZFRpbWVyLnN0b3AoKTsKKyAgICAgICAgZm9yIChRTGlzdDxRV2Vha1Bv
aW50ZXI8UUFic3RyYWN0QW5pbWF0aW9uPiA+OjppdGVyYXRvciBpdCA9IG1faW1wbC0+bV9hbmlt
YXRpb25zLmJlZ2luKCk7IGl0ICE9IG1faW1wbC0+bV9hbmltYXRpb25zLmVuZCgpOyArK2l0KSB7
CisgICAgICAgICAgICBRQWJzdHJhY3RBbmltYXRpb24qIGFuaW0gPSAoKml0KS5kYXRhKCk7Cisg
ICAgICAgICAgICBpZiAoYW5pbSkKKyAgICAgICAgICAgICAgICBhbmltLT5yZXN1bWUoKTsKKyAg
ICAgICAgfQorICAgIH0KK30KKworfQorCisjaW5jbHVkZSA8R3JhcGhpY3NMYXllclF0Lm1vYz4K
SW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvcXQvR3JhcGhpY3NMYXllclF0LmgKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9xdC9HcmFwaGljc0xheWVyUXQu
aAkocmV2aXNpb24gMCkKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvcXQvR3JhcGhpY3NM
YXllclF0LmgJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsODUgQEAKKy8qCisgICAgQ29weXJpZ2h0
IChDKSAyMDA5IE5va2lhIENvcnBvcmF0aW9uIGFuZC9vciBpdHMgc3Vic2lkaWFyeSgtaWVzKQor
CisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRl
IGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJy
YXJ5IEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUg
U29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNl
LCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJy
YXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisg
ICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2Fy
cmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS
IFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5z
ZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29w
eSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdp
dGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRl
IHRvCisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4g
U3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAgICBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyov
CisKKyNpZm5kZWYgR3JhcGhpY3NMYXllclF0X2gKKyNkZWZpbmUgR3JhcGhpY3NMYXllclF0X2gK
KworI2luY2x1ZGUgIkdyYXBoaWNzTGF5ZXIuaCIKKyNpbmNsdWRlICJHcmFwaGljc0xheWVyQ2xp
ZW50LmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgR3JhcGhpY3NMYXllclF0SW1w
bDsKKworY2xhc3MgR3JhcGhpY3NMYXllclF0IDogcHVibGljIEdyYXBoaWNzTGF5ZXIgeworICAg
IGZyaWVuZCBjbGFzcyBHcmFwaGljc0xheWVyUXRJbXBsOworCitwdWJsaWM6CisgICAgR3JhcGhp
Y3NMYXllclF0KEdyYXBoaWNzTGF5ZXJDbGllbnQqKTsKKyAgICB2aXJ0dWFsIH5HcmFwaGljc0xh
eWVyUXQoKTsKKworICAgIC8vIHJlaW1wcyBmcm9tIEdyYXBoaWNzTGF5ZXIuaAorICAgIHZpcnR1
YWwgTmF0aXZlTGF5ZXIgbmF0aXZlTGF5ZXIoKSBjb25zdDsKKyAgICB2aXJ0dWFsIFBsYXRmb3Jt
TGF5ZXIqIHBsYXRmb3JtTGF5ZXIoKSBjb25zdDsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0TmVlZHNE
aXNwbGF5KCk7CisgICAgdmlydHVhbCB2b2lkIHNldE5lZWRzRGlzcGxheUluUmVjdChjb25zdCBG
bG9hdFJlY3QmKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0UGFyZW50KEdyYXBoaWNzTGF5ZXIqIGxh
eWVyKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0TmFtZShjb25zdCBTdHJpbmcmIG5hbWUpOworICAg
IHZpcnR1YWwgYm9vbCBzZXRDaGlsZHJlbihjb25zdCBWZWN0b3I8R3JhcGhpY3NMYXllcio+Jik7
CisgICAgdmlydHVhbCB2b2lkIGFkZENoaWxkKEdyYXBoaWNzTGF5ZXIqKTsKKyAgICB2aXJ0dWFs
IHZvaWQgYWRkQ2hpbGRBdEluZGV4KEdyYXBoaWNzTGF5ZXIqLCBpbnQgaW5kZXgpOworICAgIHZp
cnR1YWwgdm9pZCBhZGRDaGlsZEFib3ZlKEdyYXBoaWNzTGF5ZXIqIGxheWVyLCBHcmFwaGljc0xh
eWVyKiBzaWJsaW5nKTsKKyAgICB2aXJ0dWFsIHZvaWQgYWRkQ2hpbGRCZWxvdyhHcmFwaGljc0xh
eWVyKiBsYXllciwgR3JhcGhpY3NMYXllciogc2libGluZyk7CisgICAgdmlydHVhbCBib29sIHJl
cGxhY2VDaGlsZChHcmFwaGljc0xheWVyKiBvbGRDaGlsZCwgR3JhcGhpY3NMYXllciogbmV3Q2hp
bGQpOworICAgIHZpcnR1YWwgdm9pZCByZW1vdmVGcm9tUGFyZW50KCk7CisgICAgdmlydHVhbCB2
b2lkIHNldE1hc2tMYXllcihHcmFwaGljc0xheWVyKiBsYXllcik7CisgICAgdmlydHVhbCB2b2lk
IHNldFBvc2l0aW9uKGNvbnN0IEZsb2F0UG9pbnQmIHApOworICAgIHZpcnR1YWwgdm9pZCBzZXRB
bmNob3JQb2ludChjb25zdCBGbG9hdFBvaW50M0QmIHApOworICAgIHZpcnR1YWwgdm9pZCBzZXRT
aXplKGNvbnN0IEZsb2F0U2l6ZSYgc2l6ZSk7CisgICAgdmlydHVhbCB2b2lkIHNldFRyYW5zZm9y
bShjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYgdCk7CisgICAgdmlydHVhbCB2b2lkIHNldENo
aWxkcmVuVHJhbnNmb3JtKGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4JiB0KTsKKyAgICB2aXJ0
dWFsIHZvaWQgc2V0UHJlc2VydmVzM0QoYm9vbCBiKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0TWFz
a3NUb0JvdW5kcyhib29sIGIpOworICAgIHZpcnR1YWwgdm9pZCBzZXREcmF3c0NvbnRlbnQoYm9v
bCBiKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0QmFja2dyb3VuZENvbG9yKGNvbnN0IENvbG9yJik7
CisgICAgdmlydHVhbCB2b2lkIGNsZWFyQmFja2dyb3VuZENvbG9yKCk7CisgICAgdmlydHVhbCB2
b2lkIHNldENvbnRlbnRzT3BhcXVlKGJvb2wgYik7CisgICAgdmlydHVhbCB2b2lkIHNldEJhY2tm
YWNlVmlzaWJpbGl0eShib29sIGIpOworICAgIHZpcnR1YWwgdm9pZCBzZXRPcGFjaXR5KGZsb2F0
IG9wYWNpdHkpOworICAgIHZpcnR1YWwgdm9pZCBzZXRDb250ZW50c1JlY3QoY29uc3QgSW50UmVj
dCYgcik7CisgICAgdmlydHVhbCBib29sIGFkZEFuaW1hdGlvbihjb25zdCBLZXlmcmFtZVZhbHVl
TGlzdCYsIGNvbnN0IEludFNpemUmIGJveFNpemUsIGNvbnN0IEFuaW1hdGlvbiosIGNvbnN0IFN0
cmluZyYga2V5ZnJhbWVzTmFtZSwgZG91YmxlIHRpbWVPZmZzZXQpOworICAgIHZpcnR1YWwgdm9p
ZCByZW1vdmVBbmltYXRpb25zRm9yUHJvcGVydHkoQW5pbWF0ZWRQcm9wZXJ0eUlEKTsKKyAgICB2
aXJ0dWFsIHZvaWQgcmVtb3ZlQW5pbWF0aW9uc0ZvcktleWZyYW1lcyhjb25zdCBTdHJpbmcmIGtl
eWZyYW1lc05hbWUpOworICAgIHZpcnR1YWwgdm9pZCBwYXVzZUFuaW1hdGlvbihjb25zdCBTdHJp
bmcmIGtleWZyYW1lc05hbWUsIGRvdWJsZSB0aW1lT2Zmc2V0KTsKKyAgICB2aXJ0dWFsIHZvaWQg
c3VzcGVuZEFuaW1hdGlvbnMoZG91YmxlIHRpbWUpOworICAgIHZpcnR1YWwgdm9pZCByZXN1bWVB
bmltYXRpb25zKCk7CisgICAgdmlydHVhbCB2b2lkIHNldENvbnRlbnRzVG9JbWFnZShJbWFnZSop
OworICAgIHZpcnR1YWwgdm9pZCBzZXRDb250ZW50c0JhY2tncm91bmRDb2xvcihjb25zdCBDb2xv
ciYpOworICAgIHZpcnR1YWwgdm9pZCBzZXRHZW9tZXRyeU9yaWVudGF0aW9uKENvbXBvc2l0aW5n
Q29vcmRpbmF0ZXNPcmllbnRhdGlvbiBvcmllbnRhdGlvbik7CisgICAgdmlydHVhbCB2b2lkIHNl
dENvbnRlbnRzT3JpZW50YXRpb24oQ29tcG9zaXRpbmdDb29yZGluYXRlc09yaWVudGF0aW9uIG9y
aWVudGF0aW9uKTsKKyAgICB2aXJ0dWFsIHZvaWQgZGlzdHJpYnV0ZU9wYWNpdHkoZmxvYXQpOwor
ICAgIHZpcnR1YWwgZmxvYXQgYWNjdW11bGF0ZWRPcGFjaXR5KCkgY29uc3Q7CisgICAgdmlydHVh
bCB2b2lkIHN5bmNDb21wb3NpdGluZ1N0YXRlKCk7CisKK3ByaXZhdGU6CisgICAgT3duUHRyPEdy
YXBoaWNzTGF5ZXJRdEltcGw+IG1faW1wbDsKK307CisKK30KKyNlbmRpZiAvLyBHcmFwaGljc0xh
eWVyUXRfaApJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9xdC9RV2ViUGFnZUNsaWVudC5oCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vcXQvUVdlYlBhZ2VDbGllbnQuaAkocmV2aXNpb24g
NTM0MjcpCisrKyBXZWJDb3JlL3BsYXRmb3JtL3F0L1FXZWJQYWdlQ2xpZW50LmgJKHdvcmtpbmcg
Y29weSkKQEAgLTI5LDcgKzI5LDkgQEAKICNpZm5kZWYgUVRfTk9fQ1VSU09SCiAjaW5jbHVkZSA8
UUN1cnNvcj4KICNlbmRpZgorCiAjaW5jbHVkZSA8UVJlY3Q+CitjbGFzcyBRR3JhcGhpY3NJdGVt
OwogCiBjbGFzcyBRV2ViUGFnZUNsaWVudCB7CiBwdWJsaWM6CkBAIC0zOSw2ICs0MSwxNiBAQCBw
dWJsaWM6CiAgICAgdmlydHVhbCB2b2lkIHVwZGF0ZShjb25zdCBRUmVjdCYpID0gMDsKICAgICB2
aXJ0dWFsIHZvaWQgc2V0SW5wdXRNZXRob2RFbmFibGVkKGJvb2wgZW5hYmxlKSA9IDA7CiAgICAg
dmlydHVhbCBib29sIGlucHV0TWV0aG9kRW5hYmxlZCgpIGNvbnN0ID0gMDsKKyNpZiBVU0UoQUND
RUxFUkFURURfQ09NUE9TSVRJTkcpCisgICAgLy8gdGhpcyBnZXRzIGNhbGxlZCB3aGVuIHdlIHN0
YXJ0L3N0b3AgY29tcG9zaXRpbmcuCisgICAgdmlydHVhbCB2b2lkIHNldFJvb3RHcmFwaGljc0xh
eWVyKFFHcmFwaGljc0l0ZW0qIGxheWVyKSB7fQorCisgICAgLy8gdGhpcyBnZXRzIGNhbGxlZCB3
aGVuIHRoZSBjb21wb3NpdG9yIHdhbnRzIHVzIHRvIHN5bmMgdGhlIGxheWVycworICAgIC8vIGlm
IHNjaGVkdWxlU3luYyBpcyB0cnVlLCB3ZSBzY2hlZHVsZSBhIHN5bmMgb3Vyc2VsdmVzLiBvdGhl
cndpc2UsCisgICAgLy8gd2Ugd2FpdCBmb3IgdGhlIG5leHQgdXBkYXRlIGFuZCBzeW5jIHRoZSBs
YXllcnMgdGhlbi4KKyAgICB2aXJ0dWFsIHZvaWQgbWFya0ZvclN5bmMoYm9vbCBzY2hlZHVsZVN5
bmMgPSBmYWxzZSkge30KKyNlbmRpZgorCiAjaWYgUVRfVkVSU0lPTiA+PSAweDA0MDYwMAogICAg
IHZpcnR1YWwgdm9pZCBzZXRJbnB1dE1ldGhvZEhpbnQoUXQ6OklucHV0TWV0aG9kSGludCBoaW50
LCBib29sIGVuYWJsZSkgPSAwOwogI2VuZGlmCkluZGV4OiBXZWJLaXQvcXQvQ2hhbmdlTG9nCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFdlYktpdC9xdC9DaGFuZ2VMb2cJKHJldmlzaW9uIDUzNTIzKQorKysgV2Vi
S2l0L3F0L0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDYwIEBACisyMDEwLTAx
LTE5ICBObydhbSBSb3NlbnRoYWwgIDxub2FtLnJvc2VudGhhbEBub2tpYS5jb20+CisKKyAgICAg
ICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgW1F0XSBJbXBsZW1lbnQg
R3JhcGhpY3NMYXllciBmb3IgYWNjZWxlcmF0ZWQgbGF5ZXIgY29tcG9zaXRpbmcKKyAgICAgICAg
aHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTMzNTE0CisKKyAgICAgICAg
SGVyZSB3ZSBoYXZlIHRoZSBRR3JhcGhpY3NXZWJWaWV3IHN1cHBvcnQgZm9yIGFjY2VsZXJhdGVk
IGNvbXBvc2l0aW5nCisKKyAgICAgICAgKiBBcGkvcWdyYXBoaWNzd2Vidmlldy5jcHA6CisgICAg
ICAgIChRR3JhcGhpY3NXZWJWaWV3T3ZlcmxheTo6cSk6IGFjY2VzcyB0byBjb250YWluZXIgb2Jq
ZWN0CisgICAgICAgIChRR3JhcGhpY3NXZWJWaWV3T3ZlcmxheTo6Ym91bmRpbmdSZWN0KTogb3Zl
cmxheSBoYXMgc2FtZSByZWN0IGFzIHRoZQorICAgICAgICB3ZWJ2aWV3CisgICAgICAgIChRR3Jh
cGhpY3NXZWJWaWV3T3ZlcmxheTo6cGFpbnQpOiBwYWludCBldmVyeXRoaW5nIGJ1dCB0aGUgY29u
dGVudHMKKyAgICAgICAgKFFHcmFwaGljc1dlYlZpZXdQcml2YXRlOjpRR3JhcGhpY3NXZWJWaWV3
UHJpdmF0ZSk6IHNvbWUgdmFycyBuZWVkZWQKKyAgICAgICAgZm9yIGFjY2VsZXJhdGVkIGNvbXBv
c2l0aW5nCisgICAgICAgIChRR3JhcGhpY3NXZWJWaWV3UHJpdmF0ZTo6KToKKyAgICAgICAgKFFH
cmFwaGljc1dlYlZpZXdQcml2YXRlOjp+UUdyYXBoaWNzV2ViVmlld1ByaXZhdGUpOgorICAgICAg
ICAoUUdyYXBoaWNzV2ViVmlld1ByaXZhdGU6OnNldFJvb3RHcmFwaGljc0xheWVyKTogbWFrZSBz
dXJlIHdlIGhhdmUgYQorICAgICAgICBzY3JvbGxiYXIgb3ZlcmxheSwgYW5kIHRoYXQgdGhlIG5l
dyBncmFwaGljcyBsYXllciBpcyBwYXJlbnRlZCBieSB0aGUKKyAgICAgICAgd2ViLXZpZXcKKyAg
ICAgICAgKFFHcmFwaGljc1dlYlZpZXdQcml2YXRlOjptYXJrRm9yU3luYyk6IGZsdXNoIGNoYW5n
ZXMgYXQgZWFybGllc3QKKyAgICAgICAgY29udmVuaWVuY2Ugb3IgZHVyaW5nIHRoZSBuZXh0IGRy
YXcKKworICAgICAgICAoUUdyYXBoaWNzV2ViVmlld1ByaXZhdGU6OnVwZGF0ZUNvbXBvc2l0aW5n
U2Nyb2xsUG9zaXRpb24pOiBzeW5jIHRoZQorICAgICAgICBwb3NpdGlvbiBvZiB0aGUgY29tcG9z
aXRpbmcgbGF5ZXIgd2l0aCB0aGUgc2Nyb2xsIHBvc2l0aW9uCisgICAgICAgIChRR3JhcGhpY3NX
ZWJWaWV3UHJpdmF0ZTo6c3luY0xheWVycyk6IGZsdXNoIGNoYW5nZXMgbm93CisgICAgICAgIChR
R3JhcGhpY3NXZWJWaWV3UHJpdmF0ZTo6c2Nyb2xsKTogbWFrZSBzdXJlIHdlIGFsc28gbW92ZSB0
aGUKKyAgICAgICAgY29tcG9zaXRpbmcgbGF5ZXIKKyAgICAgICAgKFFHcmFwaGljc1dlYlZpZXdQ
cml2YXRlOjp1cGRhdGUpOiBhbHNvIHVwZGF0ZSB0aGUgb3ZlcmxheSBpZiBuZWVkZWQKKyAgICAg
ICAgKFFHcmFwaGljc1dlYlZpZXc6OlFHcmFwaGljc1dlYlZpZXcpOiBpbml0aWFsaXplIG92ZXJs
YXkgd2l0aCAwCisgICAgICAgIChRR3JhcGhpY3NXZWJWaWV3OjpwYWludCk6IHBhaW50IG9ubHkg
Y29udGVudHMgaWYgd2UgaGF2ZSBhbiBvdmVybGF5LAorICAgICAgICBzeW5jIHRoZSBjb21wb3Np
dGluZyBsYXllcnMgbm93IGlmIG5lZWRlZAorICAgICAgICAoUUdyYXBoaWNzV2ViVmlldzo6c2V0
UGFnZSk6IGFsc28gY2xlYW4gdXAgdGhlIGNvbXBvc2l0aW5nCisgICAgICAgIChRR3JhcGhpY3NX
ZWJWaWV3Ojp1cGRhdGVHZW9tZXRyeSk6IGFsc28gdXBkYXRlIG92ZXJsYXkgZ2VvCisgICAgICAg
IChRR3JhcGhpY3NXZWJWaWV3OjpzZXRHZW9tZXRyeSk6IGFsc28gdXBkYXRlIG92ZXJsYXkgZ2Vv
CisgICAgICAgICogQXBpL3FncmFwaGljc3dlYnZpZXcuaDogcmVpbXAgY29tcG9zaXRpbmcgc3R1
ZmYgZnJvbSBRV2ViUGFnZUNsaWVudAorICAgICAgICAqIEFwaS9xd2Vic2V0dGluZ3MuY3BwOiBp
bml0IG5ldyBzZXR0aW5ncyBmbGFnIGZvciBjb21wb3NpdGluZyBhcworICAgICAgICBmYWxzZQor
ICAgICAgICAoUVdlYlNldHRpbmdzUHJpdmF0ZTo6YXBwbHkpOiBhcHBseSBuZXcgc2V0dGluZ3Mg
ZmxhZyBmb3IgY29tcG9zaXRpbmcKKyAgICAgICAgKFFXZWJTZXR0aW5nczo6UVdlYlNldHRpbmdz
KToKKyAgICAgICAgKiBBcGkvcXdlYnNldHRpbmdzLmg6IG5ldyBzZXR0aW5ncyBmbGFnIGZvciBj
b21wb3NpdGluZworICAgICAgICAqIEFwaS9xd2Vidmlldy5jcHA6IAorICAgICAgICAoUVdlYlZp
ZXc6OnNldFBhZ2UpOiBxd2VidmlldyBkb2Vzbid0IHN1cHBvcnQgY29tcG9zaXRpbmc6IGFsd2F5
cyBmYWxzZQorICAgICAgICAqIFFHVkxhdW5jaGVyL21haW4uY3BwOgorICAgICAgICAoV2ViVmll
dzo6V2ViVmlldyk6IHNvbWUgbW9yZSBjbWRsaW5lIGFyZ3VtZW50cyArIGNvbXBvc2l0aW5nCisg
ICAgICAgIChNYWluV2luZG93Ojppbml0KTogc29tZSBtb3JlIGNtZGxpbmUgYXJndW1lbnRzCisg
ICAgICAgIChtYWluKTogZGl0dG8KKyAgICAgICAgKiBXZWJDb3JlU3VwcG9ydC9DaHJvbWVDbGll
bnRRdC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpDaHJvbWVDbGllbnRRdDo6YXR0YWNoUm9vdEdy
YXBoaWNzTGF5ZXIpOiByZWltcCBmb3IKKyAgICAgICAgYWNjZWwtY29tcG9zaXRpbmcKKyAgICAg
ICAgKFdlYkNvcmU6OkNocm9tZUNsaWVudFF0OjpzZXROZWVkc09uZVNob3REcmF3aW5nU3luY2hy
b25pemF0aW9uKToKKyAgICAgICAgcmVpbXAgZm9yIGFjY2VsIGNvbXBvc2l0aW5nCisgICAgICAg
IChXZWJDb3JlOjpDaHJvbWVDbGllbnRRdDo6c2NoZWR1bGVDb21wb3NpdGluZ0xheWVyU3luYyk6
IHJlaW1wIGZvcgorICAgICAgICBhY2NlbCBjb21wb3NpdGluZworICAgICAgICAqIFdlYkNvcmVT
dXBwb3J0L0Nocm9tZUNsaWVudFF0Lmg6IHJlaW1wcyBmb3IgYWNjZWwgY29tcG9zaXRpbmcKKwog
MjAxMC0wMS0xOSAgU3RldmUgQmxvY2sgIDxzdGV2ZWJsb2NrQGdvb2dsZS5jb20+CiAKICAgICAg
ICAgUmV2aWV3ZWQgYnkgQWRhbSBCYXJ0aC4KSW5kZXg6IFdlYktpdC9xdC9BcGkvcWdyYXBoaWNz
d2Vidmlldy5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0L3F0L0FwaS9xZ3JhcGhpY3N3ZWJ2aWV3
LmNwcAkocmV2aXNpb24gNTM0MjcpCisrKyBXZWJLaXQvcXQvQXBpL3FncmFwaGljc3dlYnZpZXcu
Y3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yMiwyNCArMjIsNzEgQEAKICNpbmNsdWRlICJxZ3JhcGhp
Y3N3ZWJ2aWV3LmgiCiAKICNpbmNsdWRlICJxd2ViZnJhbWUuaCIKKyNpbmNsdWRlICJxd2ViZnJh
bWVfcC5oIgogI2luY2x1ZGUgInF3ZWJwYWdlLmgiCiAjaW5jbHVkZSAicXdlYnBhZ2VfcC5oIgog
I2luY2x1ZGUgIlFXZWJQYWdlQ2xpZW50LmgiCi0jaW5jbHVkZSA8UXRHdWkvUUdyYXBoaWNzU2Nl
bmU+Ci0jaW5jbHVkZSA8UXRHdWkvUUdyYXBoaWNzVmlldz4KKyNpbmNsdWRlIDxGcmFtZVZpZXcu
aD4KKyNpbmNsdWRlIDxRdENvcmUvcXNoYXJlZHBvaW50ZXIuaD4KKyNpbmNsdWRlIDxRdENvcmUv
cXRpbWVyLmg+CiAjaW5jbHVkZSA8UXRHdWkvcWFwcGxpY2F0aW9uLmg+CisjaW5jbHVkZSA8UXRH
dWkvcWdyYXBoaWNzc2NlbmUuaD4KICNpbmNsdWRlIDxRdEd1aS9xZ3JhcGhpY3NzY2VuZWV2ZW50
Lmg+CisjaW5jbHVkZSA8UXRHdWkvcWdyYXBoaWNzdmlldy5oPgorI2luY2x1ZGUgPFF0R3VpL3Fw
aXhtYXBjYWNoZS5oPgogI2luY2x1ZGUgPFF0R3VpL3FzdHlsZW9wdGlvbi5oPgogI2lmIGRlZmlu
ZWQoUV9XU19YMTEpCiAjaW5jbHVkZSA8UVgxMUluZm8+CiAjZW5kaWYKKyNpbmNsdWRlIDxTZXR0
aW5ncy5oPgorCisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorCisvLyB0aGUgb3Zl
cmxheSBpcyBoZXJlIGZvciBvbmUgcmVhc29uIG9ubHk6IHRvIGhhdmUgdGhlIHNjcm9sbC1iYXJz
IGFuZCBvdGhlcgorLy8gZXh0cmEgVUkgZWxlbWVudHMgYXBwZWFyIG9uIHRvcCBvZiBhbnkgUUdy
YXBoaWNzSXRlbXMgY3JlYXRlZCBieSBDU1MgY29tcG9zaXRpbmcgbGF5ZXJzCitjbGFzcyBRR3Jh
cGhpY3NXZWJWaWV3T3ZlcmxheSA6IHB1YmxpYyBRR3JhcGhpY3NJdGVtIHsKKyAgICBwdWJsaWM6
CisgICAgUUdyYXBoaWNzV2ViVmlld092ZXJsYXkoUUdyYXBoaWNzV2ViVmlldyogdmlldykKKyAg
ICAgICAgICAgIDpRR3JhcGhpY3NJdGVtKHZpZXcpCisgICAgICAgICAgICAsIHEodmlldykKKyAg
ICB7CisgICAgICAgIHNldFBvcygwLCAwKTsKKyAgICAgICAgc2V0RmxhZyhRR3JhcGhpY3NJdGVt
OjpJdGVtVXNlc0V4dGVuZGVkU3R5bGVPcHRpb24sIHRydWUpOworICAgICAgICBzZXRDYWNoZU1v
ZGUoUUdyYXBoaWNzSXRlbTo6RGV2aWNlQ29vcmRpbmF0ZUNhY2hlKTsKKyAgICB9CisKKyAgICBR
UmVjdEYgYm91bmRpbmdSZWN0KCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBxLT5ib3Vu
ZGluZ1JlY3QoKTsKKyAgICB9CisKKyAgICB2b2lkIHBhaW50KFFQYWludGVyKiBwYWludGVyLCBj
b25zdCBRU3R5bGVPcHRpb25HcmFwaGljc0l0ZW0qIG9wdGlvbnMsIFFXaWRnZXQqKQorICAgIHsK
KyAgICAgICAgcS0+cGFnZSgpLT5tYWluRnJhbWUoKS0+cmVuZGVyKHBhaW50ZXIsIHN0YXRpY19j
YXN0PFFXZWJGcmFtZTo6UmVuZGVyTGF5ZXI+KFFXZWJGcmFtZTo6QWxsTGF5ZXJzJih+UVdlYkZy
YW1lOjpDb250ZW50c0xheWVyKSksIG9wdGlvbnMtPmV4cG9zZWRSZWN0LnRvUmVjdCgpKTsKKyAg
ICB9CisKKyAgICBmcmllbmQgY2xhc3MgUUdyYXBoaWNzV2ViVmlldzsKKyAgICBRR3JhcGhpY3NX
ZWJWaWV3KiBxOworfTsKKworI2VuZGlmCiAKIGNsYXNzIFFHcmFwaGljc1dlYlZpZXdQcml2YXRl
IDogcHVibGljIFFXZWJQYWdlQ2xpZW50IHsKIHB1YmxpYzoKICAgICBRR3JhcGhpY3NXZWJWaWV3
UHJpdmF0ZShRR3JhcGhpY3NXZWJWaWV3KiBwYXJlbnQpCiAgICAgICAgIDogcShwYXJlbnQpCiAg
ICAgICAgICwgcGFnZSgwKQotICAgIHt9CisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5H
KQorICAgICAgICAsIHJvb3RHcmFwaGljc0xheWVyKDApCisgICAgICAgICwgc2hvdWxkU3luYyh0
cnVlKQorI2VuZGlmCisgICAgeworI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKKyAg
ICAgICAgLy8gdGhlIG92ZXJsYXkgYW5kIHN0YXlzIGFsaXZlIGZvciB0aGUgbGlmZXRpbWUgb2YK
KyAgICAgICAgLy8gdGhpcyBRR3JhcGhpY3NXZWJWaWV3IGFzIHRoZSBzY3JvbGxiYXJzIGFyZSBu
ZWVkZWQgd2hlbiB0aGVyZSdzIG5vIGNvbXBvc2l0aW5nCisgICAgICAgIHEtPnNldEZsYWcoUUdy
YXBoaWNzSXRlbTo6SXRlbVVzZXNFeHRlbmRlZFN0eWxlT3B0aW9uKTsKKyNlbmRpZgorICAgIH0K
IAogICAgIHZpcnR1YWwgflFHcmFwaGljc1dlYlZpZXdQcml2YXRlKCk7CiAgICAgdmlydHVhbCB2
b2lkIHNjcm9sbChpbnQgZHgsIGludCBkeSwgY29uc3QgUVJlY3QmKTsKQEAgLTYxLDE0ICsxMDgs
OTUgQEAgcHVibGljOgogCiAgICAgdmlydHVhbCBRT2JqZWN0KiBwbHVnaW5QYXJlbnQoKSBjb25z
dDsKIAorI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKKyAgICB2aXJ0dWFsIHZvaWQg
c2V0Um9vdEdyYXBoaWNzTGF5ZXIoUUdyYXBoaWNzSXRlbSogbGF5ZXIpOworICAgIHZpcnR1YWwg
dm9pZCBtYXJrRm9yU3luYyhib29sIHNjaGVkdWxlU3luYyk7CisgICAgdm9pZCB1cGRhdGVDb21w
b3NpdGluZ1Njcm9sbFBvc2l0aW9uKCk7CisjZW5kaWYKKworICAgIHZvaWQgc3luY0xheWVycygp
OwogICAgIHZvaWQgX3FfZG9Mb2FkRmluaXNoZWQoYm9vbCBzdWNjZXNzKTsKIAogICAgIFFHcmFw
aGljc1dlYlZpZXcqIHE7CiAgICAgUVdlYlBhZ2UqIHBhZ2U7CisjaWYgVVNFKEFDQ0VMRVJBVEVE
X0NPTVBPU0lUSU5HKQorICAgIFFHcmFwaGljc0l0ZW0qIHJvb3RHcmFwaGljc0xheWVyOworCisg
ICAgLy8gdGhlIG92ZXJsYXkgZ2V0cyBpbnN0YW50aWF0ZWQgd2hlbiB0aGUgcm9vdCBsYXllciBp
cyBhdHRhY2hlZCwgYW5kIGdldCBkZWxldGVkIHdoZW4gaXQncyBkZXRhY2hlZAorICAgIFFTaGFy
ZWRQb2ludGVyPFFHcmFwaGljc1dlYlZpZXdPdmVybGF5PiBvdmVybGF5OworCisgICAgLy8gd2Ug
bmVlZCB0byBzeW5jIHRoZSBsYXllcnMgaWYgd2UgZ2V0IGEgc3BlY2lhbCBjYWxsIGZyb20gdGhl
IFdlYkNvcmUKKyAgICAvLyBjb21wb3NpdG9yIHRlbGxpbmcgdXMgdG8gZG8gc28uIFdlJ2xsIGdl
dCB0aGF0IGNhbGwgZnJvbSBDaHJvbWVDbGllbnRRdAorICAgIGJvb2wgc2hvdWxkU3luYzsKKwor
ICAgIC8vIHdlIG5lZWQgdG8gcHV0IHRoZSByb290IGdyYXBoaWNzIGxheWVyIGJlaGluZCB0aGUg
b3ZlcmxheSAod2hpY2ggY29udGFpbnMgdGhlIHNjcm9sbGJhcikKKyAgICBlbnVtIHsgUm9vdEdy
YXBoaWNzTGF5ZXJaVmFsdWUsIE92ZXJsYXlaVmFsdWUgfTsKKyNlbmRpZgogfTsKIAogUUdyYXBo
aWNzV2ViVmlld1ByaXZhdGU6On5RR3JhcGhpY3NXZWJWaWV3UHJpdmF0ZSgpCiB7CisjaWYgVVNF
KEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorICAgIGlmIChyb290R3JhcGhpY3NMYXllcikgewor
ICAgICAgICAvLyB3ZSBkb24ndCBuZWVkIHRvIGRlbGV0ZSB0aGUgcm9vdCBncmFwaGljcyBsYXll
cgorICAgICAgICAvLyBUaGUgbGlmZWN5Y2xlIGlzIG1hbmFnZWQgaW4gR3JhcGhpY3NMYXllclF0
LmNwcAorICAgICAgICByb290R3JhcGhpY3NMYXllci0+c2V0UGFyZW50SXRlbSgwKTsKKyAgICAg
ICAgcS0+c2NlbmUoKS0+cmVtb3ZlSXRlbShyb290R3JhcGhpY3NMYXllcik7CisgICAgfQorI2Vu
ZGlmCit9CisKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCit2b2lkIFFHcmFwaGlj
c1dlYlZpZXdQcml2YXRlOjpzZXRSb290R3JhcGhpY3NMYXllcihRR3JhcGhpY3NJdGVtKiBsYXll
cikKK3sKKyAgICBpZiAocm9vdEdyYXBoaWNzTGF5ZXIpIHsKKyAgICAgICAgcm9vdEdyYXBoaWNz
TGF5ZXItPnNldFBhcmVudEl0ZW0oMCk7CisgICAgICAgIHEtPnNjZW5lKCktPnJlbW92ZUl0ZW0o
cm9vdEdyYXBoaWNzTGF5ZXIpOworICAgICAgICBRV2ViRnJhbWVQcml2YXRlOjpjb3JlKHEtPnBh
Z2UoKS0+bWFpbkZyYW1lKCkpLT52aWV3KCktPnN5bmNDb21wb3NpdGluZ1N0YXRlUmVjdXJzaXZl
KCk7CisgICAgfQorCisgICAgcm9vdEdyYXBoaWNzTGF5ZXIgPSBsYXllcjsKKworICAgIGlmIChs
YXllcikgeworICAgICAgICBsYXllci0+c2V0RmxhZyhRR3JhcGhpY3NJdGVtOjpJdGVtQ2xpcHND
aGlsZHJlblRvU2hhcGUsIHRydWUpOworICAgICAgICBsYXllci0+c2V0UGFyZW50SXRlbShxKTsK
KyAgICAgICAgbGF5ZXItPnNldFpWYWx1ZShSb290R3JhcGhpY3NMYXllclpWYWx1ZSk7CisgICAg
ICAgIGlmICghb3ZlcmxheSkgeworICAgICAgICAgICAgb3ZlcmxheSA9IFFTaGFyZWRQb2ludGVy
PFFHcmFwaGljc1dlYlZpZXdPdmVybGF5PihuZXcgUUdyYXBoaWNzV2ViVmlld092ZXJsYXkocSkp
OworICAgICAgICAgICAgb3ZlcmxheS0+c2V0WlZhbHVlKE92ZXJsYXlaVmFsdWUpOworICAgICAg
ICB9CisgICAgICAgIHVwZGF0ZUNvbXBvc2l0aW5nU2Nyb2xsUG9zaXRpb24oKTsKKyAgICB9IGVs
c2UgeworICAgICAgICAvLyB3ZSBkb24ndCBoYXZlIGNvbXBvc2l0aW5nIGxheWVycywgd2UgY2Fu
IHJlbmRlciB0aGUgc2Nyb2xsYmFycyBhbmQgY29udGVudCBpbiBvbmUgZ28KKyAgICAgICAgb3Zl
cmxheS5jbGVhcigpOworICAgIH0KK30KKwordm9pZCBRR3JhcGhpY3NXZWJWaWV3UHJpdmF0ZTo6
bWFya0ZvclN5bmMoYm9vbCBzY2hlZHVsZVN5bmMpCit7CisgICAgc2hvdWxkU3luYyA9IHRydWU7
CisgICAgaWYgKHNjaGVkdWxlU3luYykKKyAgICAgICAgUVRpbWVyOjpzaW5nbGVTaG90KDAsIHEs
IFNMT1Qoc3luY0xheWVycygpKSk7Cit9CisKK3ZvaWQgUUdyYXBoaWNzV2ViVmlld1ByaXZhdGU6
OnVwZGF0ZUNvbXBvc2l0aW5nU2Nyb2xsUG9zaXRpb24oKQoreworICAgIGlmIChyb290R3JhcGhp
Y3NMYXllciAmJiBxLT5wYWdlKCkgJiYgcS0+cGFnZSgpLT5tYWluRnJhbWUoKSkgeworICAgICAg
ICBjb25zdCBRUG9pbnQgc2Nyb2xsUG9zaXRpb24gPSBxLT5wYWdlKCktPm1haW5GcmFtZSgpLT5z
Y3JvbGxQb3NpdGlvbigpOworICAgICAgICByb290R3JhcGhpY3NMYXllci0+c2V0UG9zKC1zY3Jv
bGxQb3NpdGlvbik7CisgICAgfQorfQorCisjZW5kaWYKKwordm9pZCBRR3JhcGhpY3NXZWJWaWV3
UHJpdmF0ZTo6c3luY0xheWVycygpCit7CisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5H
KQorICAgIGlmIChzaG91bGRTeW5jKSB7CisgICAgICAgIFFXZWJGcmFtZVByaXZhdGU6OmNvcmUo
cS0+cGFnZSgpLT5tYWluRnJhbWUoKSktPnZpZXcoKS0+c3luY0NvbXBvc2l0aW5nU3RhdGVSZWN1
cnNpdmUoKTsKKyAgICAgICAgc2hvdWxkU3luYyA9IGZhbHNlOworICAgIH0KKyNlbmRpZgogfQog
CiB2b2lkIFFHcmFwaGljc1dlYlZpZXdQcml2YXRlOjpfcV9kb0xvYWRGaW5pc2hlZChib29sIHN1
Y2Nlc3MpCkBAIC04MywxMSArMjExLDE4IEBAIHZvaWQgUUdyYXBoaWNzV2ViVmlld1ByaXZhdGU6
Ol9xX2RvTG9hZEYKIHZvaWQgUUdyYXBoaWNzV2ViVmlld1ByaXZhdGU6OnNjcm9sbChpbnQgZHgs
IGludCBkeSwgY29uc3QgUVJlY3QmIHJlY3RUb1Njcm9sbCkKIHsKICAgICBxLT5zY3JvbGwocXJl
YWwoZHgpLCBxcmVhbChkeSksIFFSZWN0RihyZWN0VG9TY3JvbGwpKTsKKyNpZiBVU0UoQUNDRUxF
UkFURURfQ09NUE9TSVRJTkcpCisgICAgdXBkYXRlQ29tcG9zaXRpbmdTY3JvbGxQb3NpdGlvbigp
OworI2VuZGlmCiB9CiAKIHZvaWQgUUdyYXBoaWNzV2ViVmlld1ByaXZhdGU6OnVwZGF0ZShjb25z
dCBRUmVjdCAmIGRpcnR5UmVjdCkKIHsKICAgICBxLT51cGRhdGUoUVJlY3RGKGRpcnR5UmVjdCkp
OworI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKKyAgICBpZiAob3ZlcmxheSkKKyAg
ICAgICAgb3ZlcmxheS0+dXBkYXRlKFFSZWN0RihkaXJ0eVJlY3QpKTsKKyNlbmRpZgogfQogCiAK
QEAgLTI0OCw2ICszODMsNyBAQCBRR3JhcGhpY3NXZWJWaWV3OjpRR3JhcGhpY3NXZWJWaWV3KFFH
cmFwCiAgICAgc2V0QWNjZXB0VG91Y2hFdmVudHModHJ1ZSk7CiAjZW5kaWYKICAgICBzZXRGb2N1
c1BvbGljeShRdDo6U3Ryb25nRm9jdXMpOworICAgIHNldEZsYWcoUUdyYXBoaWNzSXRlbTo6SXRl
bUNsaXBzQ2hpbGRyZW5Ub1NoYXBlLCB0cnVlKTsKIH0KIAogLyohCkBAIC0yOTcsNyArNDMzLDEy
IEBAIFFXZWJQYWdlKiBRR3JhcGhpY3NXZWJWaWV3OjpwYWdlKCkgY29uc3QKICovCiB2b2lkIFFH
cmFwaGljc1dlYlZpZXc6OnBhaW50KFFQYWludGVyKiBwYWludGVyLCBjb25zdCBRU3R5bGVPcHRp
b25HcmFwaGljc0l0ZW0qIG9wdGlvbiwgUVdpZGdldCopCiB7Ci0gICAgcGFnZSgpLT5tYWluRnJh
bWUoKS0+cmVuZGVyKHBhaW50ZXIsIG9wdGlvbi0+ZXhwb3NlZFJlY3QudG9SZWN0KCkpOworI2lm
IFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKKyAgICBwYWdlKCktPm1haW5GcmFtZSgpLT5y
ZW5kZXIocGFpbnRlciwgZC0+b3ZlcmxheSA/IFFXZWJGcmFtZTo6Q29udGVudHNMYXllciA6IFFX
ZWJGcmFtZTo6QWxsTGF5ZXJzLCBvcHRpb24tPmV4cG9zZWRSZWN0LnRvQWxpZ25lZFJlY3QoKSk7
CisgICAgZC0+c3luY0xheWVycygpOworI2Vsc2UKKyAgICBwYWdlKCktPm1haW5GcmFtZSgpLT5y
ZW5kZXIocGFpbnRlciwgUVdlYkZyYW1lOjpBbGxMYXllcnMsIG9wdGlvbi0+ZXhwb3NlZFJlY3Qu
dG9SZWN0KCkpOworI2VuZGlmCiB9CiAKIC8qISBccmVpbXAKQEAgLTQyNSw2ICs1NjYsMTAgQEAg
dm9pZCBRR3JhcGhpY3NXZWJWaWV3OjpzZXRQYWdlKFFXZWJQYWdlKgogICAgIGQtPnBhZ2UgPSBw
YWdlOwogICAgIGlmICghZC0+cGFnZSkKICAgICAgICAgcmV0dXJuOworI2lmIFVTRShBQ0NFTEVS
QVRFRF9DT01QT1NJVElORykKKyAgICBpZiAoZC0+b3ZlcmxheSkKKyAgICAgICAgZC0+b3Zlcmxh
eS0+cHJlcGFyZUdlb21ldHJ5Q2hhbmdlKCk7CisjZW5kaWYKICAgICBkLT5wYWdlLT5kLT5jbGll
bnQgPSBkOyAvLyBzZXQgdGhlIHBhZ2UgY2xpZW50CiAKICAgICBRU2l6ZSBzaXplID0gZ2VvbWV0
cnkoKS5zaXplKCkudG9TaXplKCk7CkBAIC01MjgsNiArNjczLDEyIEBAIHFyZWFsIFFHcmFwaGlj
c1dlYlZpZXc6Onpvb21GYWN0b3IoKSBjb24KICovCiB2b2lkIFFHcmFwaGljc1dlYlZpZXc6OnVw
ZGF0ZUdlb21ldHJ5KCkKIHsKKworI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKKyAg
ICBpZiAoZC0+b3ZlcmxheSkKKyAgICAgICAgZC0+b3ZlcmxheS0+cHJlcGFyZUdlb21ldHJ5Q2hh
bmdlKCk7CisjZW5kaWYKKwogICAgIFFHcmFwaGljc1dpZGdldDo6dXBkYXRlR2VvbWV0cnkoKTsK
IAogICAgIGlmICghZC0+cGFnZSkKQEAgLTU0Myw2ICs2OTQsMTEgQEAgdm9pZCBRR3JhcGhpY3NX
ZWJWaWV3OjpzZXRHZW9tZXRyeShjb25zdAogewogICAgIFFHcmFwaGljc1dpZGdldDo6c2V0R2Vv
bWV0cnkocmVjdCk7CiAKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCisgICAgaWYg
KGQtPm92ZXJsYXkpCisgICAgICAgIGQtPm92ZXJsYXktPnByZXBhcmVHZW9tZXRyeUNoYW5nZSgp
OworI2VuZGlmCisKICAgICBpZiAoIWQtPnBhZ2UpCiAgICAgICAgIHJldHVybjsKIApJbmRleDog
V2ViS2l0L3F0L0FwaS9xZ3JhcGhpY3N3ZWJ2aWV3LmgKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0L3F0
L0FwaS9xZ3JhcGhpY3N3ZWJ2aWV3LmgJKHJldmlzaW9uIDUzNDI3KQorKysgV2ViS2l0L3F0L0Fw
aS9xZ3JhcGhpY3N3ZWJ2aWV3LmgJKHdvcmtpbmcgY29weSkKQEAgLTEzNCw2ICsxMzQsOSBAQCBw
cm90ZWN0ZWQ6CiAKIHByaXZhdGU6CiAgICAgUV9QUklWQVRFX1NMT1QoZCwgdm9pZCBfcV9kb0xv
YWRGaW5pc2hlZChib29sIHN1Y2Nlc3MpKQorICAgIC8vIHdlIGRvbid0IHdhbnQgdG8gY2hhbmdl
IHRoZSBtb2MgYmFzZWQgb24gVVNFKCkgbWFjcm8sIHNvIHRoaXMgZnVuY3Rpb24gaXMgaGVyZQor
ICAgIC8vIGJ1dCB3aWxsIGJlIGVtcHR5IGlmIEFDQ0xFUkFURURfQ09NUE9TSVRJTkcgaXMgZGlz
YWJsZWQKKyAgICBRX1BSSVZBVEVfU0xPVChkLCB2b2lkIHN5bmNMYXllcnMoKSkKIAogICAgIFFH
cmFwaGljc1dlYlZpZXdQcml2YXRlKiBjb25zdCBkOwogICAgIGZyaWVuZCBjbGFzcyBRR3JhcGhp
Y3NXZWJWaWV3UHJpdmF0ZTsKSW5kZXg6IFdlYktpdC9xdC9BcGkvcXdlYnNldHRpbmdzLmNwcAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBXZWJLaXQvcXQvQXBpL3F3ZWJzZXR0aW5ncy5jcHAJKHJldmlzaW9uIDUz
NDI3KQorKysgV2ViS2l0L3F0L0FwaS9xd2Vic2V0dGluZ3MuY3BwCSh3b3JraW5nIGNvcHkpCkBA
IC0xNTIsNyArMTUyLDEyIEBAIHZvaWQgUVdlYlNldHRpbmdzUHJpdmF0ZTo6YXBwbHkoKQogICAg
ICAgICB2YWx1ZSA9IGF0dHJpYnV0ZXMudmFsdWUoUVdlYlNldHRpbmdzOjpKYXZhc2NyaXB0RW5h
YmxlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsLT5hdHRy
aWJ1dGVzLnZhbHVlKFFXZWJTZXR0aW5nczo6SmF2YXNjcmlwdEVuYWJsZWQpKTsKICAgICAgICAg
c2V0dGluZ3MtPnNldEphdmFTY3JpcHRFbmFibGVkKHZhbHVlKTsKKyNpZiBVU0UoQUNDRUxFUkFU
RURfQ09NUE9TSVRJTkcpCisgICAgICAgIHZhbHVlID0gYXR0cmlidXRlcy52YWx1ZShRV2ViU2V0
dGluZ3M6OkFjY2VsZXJhdGVkQ29tcG9zaXRpbmdFbmFibGVkLAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBnbG9iYWwtPmF0dHJpYnV0ZXMudmFsdWUoUVdlYlNldHRpbmdz
OjpBY2NlbGVyYXRlZENvbXBvc2l0aW5nRW5hYmxlZCkpOwogCisgICAgICAgIHNldHRpbmdzLT5z
ZXRBY2NlbGVyYXRlZENvbXBvc2l0aW5nRW5hYmxlZCh2YWx1ZSk7CisjZW5kaWYKICAgICAgICAg
dmFsdWUgPSBhdHRyaWJ1dGVzLnZhbHVlKFFXZWJTZXR0aW5nczo6SmF2YXNjcmlwdENhbk9wZW5X
aW5kb3dzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWwtPmF0
dHJpYnV0ZXMudmFsdWUoUVdlYlNldHRpbmdzOjpKYXZhc2NyaXB0Q2FuT3BlbldpbmRvd3MpKTsK
ICAgICAgICAgc2V0dGluZ3MtPnNldEphdmFTY3JpcHRDYW5PcGVuV2luZG93c0F1dG9tYXRpY2Fs
bHkodmFsdWUpOwpAQCAtMzg5LDYgKzM5NCw3IEBAIFFXZWJTZXR0aW5nczo6UVdlYlNldHRpbmdz
KCkKICAgICBkLT5hdHRyaWJ1dGVzLmluc2VydChRV2ViU2V0dGluZ3M6Ok9mZmxpbmVXZWJBcHBs
aWNhdGlvbkNhY2hlRW5hYmxlZCwgZmFsc2UpOwogICAgIGQtPmF0dHJpYnV0ZXMuaW5zZXJ0KFFX
ZWJTZXR0aW5nczo6TG9jYWxTdG9yYWdlRW5hYmxlZCwgZmFsc2UpOwogICAgIGQtPmF0dHJpYnV0
ZXMuaW5zZXJ0KFFXZWJTZXR0aW5nczo6TG9jYWxDb250ZW50Q2FuQWNjZXNzUmVtb3RlVXJscywg
ZmFsc2UpOworICAgIGQtPmF0dHJpYnV0ZXMuaW5zZXJ0KFFXZWJTZXR0aW5nczo6QWNjZWxlcmF0
ZWRDb21wb3NpdGluZ0VuYWJsZWQsIGZhbHNlKTsKICAgICBkLT5vZmZsaW5lU3RvcmFnZURlZmF1
bHRRdW90YSA9IDUgKiAxMDI0ICogMTAyNDsKICAgICBkLT5kZWZhdWx0VGV4dEVuY29kaW5nID0g
UUxhdGluMVN0cmluZygiaXNvLTg4NTktMSIpOwogfQpJbmRleDogV2ViS2l0L3F0L0FwaS9xd2Vi
c2V0dGluZ3MuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQvcXQvQXBpL3F3ZWJzZXR0aW5ncy5oCShy
ZXZpc2lvbiA1MzQyNykKKysrIFdlYktpdC9xdC9BcGkvcXdlYnNldHRpbmdzLmgJKHdvcmtpbmcg
Y29weSkKQEAgLTY4LDcgKzY4LDggQEAgcHVibGljOgogI2VuZGlmCiAgICAgICAgIExvY2FsQ29u
dGVudENhbkFjY2Vzc1JlbW90ZVVybHMsCiAgICAgICAgIERuc1ByZWZldGNoRW5hYmxlZCwKLSAg
ICAgICAgWFNTQXVkaXRvckVuYWJsZWQKKyAgICAgICAgWFNTQXVkaXRvckVuYWJsZWQsCisgICAg
ICAgIEFjY2VsZXJhdGVkQ29tcG9zaXRpbmdFbmFibGVkCiAgICAgfTsKICAgICBlbnVtIFdlYkdy
YXBoaWMgewogICAgICAgICBNaXNzaW5nSW1hZ2VHcmFwaGljLApJbmRleDogV2ViS2l0L3F0L0Fw
aS9xd2Vidmlldy5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0L3F0L0FwaS9xd2Vidmlldy5jcHAJ
KHJldmlzaW9uIDUzNDI3KQorKysgV2ViS2l0L3F0L0FwaS9xd2Vidmlldy5jcHAJKHdvcmtpbmcg
Y29weSkKQEAgLTIyLDEwICsyMiwxMSBAQAogI2luY2x1ZGUgImNvbmZpZy5oIgogI2luY2x1ZGUg
InF3ZWJ2aWV3LmgiCiAKKyNpbmNsdWRlICJQYWdlLmgiCiAjaW5jbHVkZSAiUVdlYlBhZ2VDbGll
bnQuaCIKKyNpbmNsdWRlICJTZXR0aW5ncy5oIgogI2luY2x1ZGUgInF3ZWJmcmFtZS5oIgogI2lu
Y2x1ZGUgInF3ZWJwYWdlX3AuaCIKLQogI2luY2x1ZGUgInFiaXRtYXAuaCIKICNpbmNsdWRlICJx
ZXZlbnQuaCIKICNpbmNsdWRlICJxcGFpbnRlci5oIgpAQCAtMjQ3LDYgKzI0OCw5IEBAIHZvaWQg
UVdlYlZpZXc6OnNldFBhZ2UoUVdlYlBhZ2UqIHBhZ2UpCiAgICAgICAgICAgICAgICAgdGhpcywg
U0xPVChfcV9wYWdlRGVzdHJveWVkKCkpKTsKICAgICB9CiAgICAgc2V0QXR0cmlidXRlKFF0OjpX
QV9PcGFxdWVQYWludEV2ZW50LCBkLT5wYWdlKTsKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9T
SVRJTkcpCisgICAgZC0+cGFnZS0+ZC0+cGFnZS0+c2V0dGluZ3MoKS0+c2V0QWNjZWxlcmF0ZWRD
b21wb3NpdGluZ0VuYWJsZWQoZmFsc2UpOworI2VuZGlmCiAgICAgdXBkYXRlKCk7CiB9CiAKSW5k
ZXg6IFdlYktpdC9xdC9RR1ZMYXVuY2hlci9tYWluLmNwcAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQv
cXQvUUdWTGF1bmNoZXIvbWFpbi5jcHAJKHJldmlzaW9uIDUzNDI3KQorKysgV2ViS2l0L3F0L1FH
VkxhdW5jaGVyL21haW4uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC03Miw2ICs3Miw4IEBAIHB1Ymxp
YzoKICAgICBXZWJWaWV3KFFHcmFwaGljc0l0ZW0qIHBhcmVudCA9IDApCiAgICAgICAgIDogUUdy
YXBoaWNzV2ViVmlldyhwYXJlbnQpCiAgICAgeworICAgICAgICBpZiAoUUFwcGxpY2F0aW9uOjpp
bnN0YW5jZSgpLT5hcmd1bWVudHMoKS5jb250YWlucygiLS1jYWNoZVdlYlZpZXciKSkKKyAgICAg
ICAgICAgIHNldENhY2hlTW9kZShRR3JhcGhpY3NJdGVtOjpEZXZpY2VDb29yZGluYXRlQ2FjaGUp
OwogICAgIH0KICAgICB2b2lkIHNldFlSb3RhdGlvbihxcmVhbCBhbmdsZSkKICAgICB7CkBAIC0y
NTMsNiArMjU1LDEyIEBAIHB1YmxpYzoKICAgICAgICAgc2V0QXR0cmlidXRlKFF0OjpXQV9EZWxl
dGVPbkNsb3NlKTsKIAogICAgICAgICB2aWV3LT5zZXRTY2VuZShzY2VuZS0+c2NlbmUoKSk7Cisg
ICAgICAgIGNvbnN0IFFTdHJpbmdMaXN0IGFyZ3VtZW50cyA9IFFBcHBsaWNhdGlvbjo6aW5zdGFu
Y2UoKS0+YXJndW1lbnRzKCk7CisgICAgICAgIGNvbnN0IGludCBpbmRleE9mVmlld3BvcnRVcGRh
dGVNb2RlID0gYXJndW1lbnRzLmluZGV4T2YoIi0tdXBkYXRlTW9kZSIpOworICAgICAgICBpZiAo
aW5kZXhPZlZpZXdwb3J0VXBkYXRlTW9kZSA+IDEgJiYgaW5kZXhPZlZpZXdwb3J0VXBkYXRlTW9k
ZSA8IGFyZ3VtZW50cy5jb3VudCgpIC0gMSkgeworICAgICAgICAgICAgY29uc3QgUVN0cmluZyB1
cGRhdGVNb2RlID0gYXJndW1lbnRzW2luZGV4T2ZWaWV3cG9ydFVwZGF0ZU1vZGUrMV0gKyAiVmll
d3BvcnRVcGRhdGUiOworICAgICAgICAgICAgdmlldy0+c2V0Vmlld3BvcnRVcGRhdGVNb2RlKHN0
YXRpY19jYXN0PFFHcmFwaGljc1ZpZXc6OlZpZXdwb3J0VXBkYXRlTW9kZT4oUUdyYXBoaWNzVmll
dzo6c3RhdGljTWV0YU9iamVjdC5lbnVtZXJhdG9yKFFHcmFwaGljc1ZpZXc6OnN0YXRpY01ldGFP
YmplY3QuaW5kZXhPZkVudW1lcmF0b3IoIlZpZXdwb3J0VXBkYXRlTW9kZSIpKS5rZXlzVG9WYWx1
ZSh1cGRhdGVNb2RlLnRvQXNjaWkoKSkpKTsKKyAgICAgICAgfQogCiAgICAgICAgIHNldENlbnRy
YWxXaWRnZXQodmlldyk7CiAKQEAgLTQ0Nyw2ICs0NTUsMTAgQEAgUVdlYlBhZ2UqIFdlYlBhZ2U6
OmNyZWF0ZVdpbmRvdyhRV2ViUGFnZQogaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KQog
ewogICAgIFFBcHBsaWNhdGlvbiBhcHAoYXJnYywgYXJndik7CisgICAgaWYgKGFwcC5hcmd1bWVu
dHMoKS5jb250YWlucygiLS1oZWxwIikpIHsKKyAgICAgICAgcURlYnVnKCkgPDwgIlVzYWdlOiBR
R1ZMYXVuY2hlciBbLS11cmwgdXJsXSBbLS1jb21wb3NpdGluZ10gWy0tdXBkYXRlTW9kZSBGdWxs
fE1pbmltYWx8U21hcnR8Tm98Qm91bmRpbmdSZWN0XSBbLS1jYWNoZVdlYlZpZXddXG4iOworICAg
ICAgICByZXR1cm4gMDsKKyAgICB9CiAgICAgUVN0cmluZyB1cmwgPSBRU3RyaW5nKCJmaWxlOi8v
JTEvJTIiKS5hcmcoUURpcjo6aG9tZVBhdGgoKSkuYXJnKFFMYXRpbjFTdHJpbmcoImluZGV4Lmh0
bWwiKSk7CiAKICAgICBhcHAuc2V0QXBwbGljYXRpb25OYW1lKCJHUVZMYXVuY2hlciIpOwpAQCAt
NDU4LDE0ICs0NzAsMjAgQEAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KQogICAgIFFX
ZWJTZXR0aW5nczo6ZW5hYmxlUGVyc2lzdGVudFN0b3JhZ2UoKTsKIAogICAgIGNvbnN0IFFTdHJp
bmdMaXN0IGFyZ3MgPSBhcHAuYXJndW1lbnRzKCk7Ci0gICAgaWYgKGFyZ3MuY291bnQoKSA+IDEp
CisgICAgY29uc3QgaW50IGluZGV4T2ZVcmwgPSBhcmdzLmluZGV4T2YoIi0tdXJsIik7CisgICAg
aWYgKGluZGV4T2ZVcmwgPiAwICYmIGluZGV4T2ZVcmwgPCBhcmdzLmNvdW50KCkgLSAxKQorICAg
ICAgICB1cmwgPSBhcmdzLmF0KGluZGV4T2ZVcmwrMSk7CisgICAgZWxzZSBpZiAoYXJncy5jb3Vu
dCgpID4gMSkKICAgICAgICAgdXJsID0gYXJncy5hdCgxKTsKKyAgICBpZiAoYXJncy5jb250YWlu
cygiLS1jb21wb3NpdGluZyIpKQorICAgICAgICBRV2ViU2V0dGluZ3M6Omdsb2JhbFNldHRpbmdz
KCktPnNldEF0dHJpYnV0ZShRV2ViU2V0dGluZ3M6OkFjY2VsZXJhdGVkQ29tcG9zaXRpbmdFbmFi
bGVkLCB0cnVlKTsKIAogICAgIE1haW5XaW5kb3cqIHdpbmRvdyA9IG5ldyBNYWluV2luZG93Owog
ICAgIHdpbmRvdy0+bG9hZCh1cmwpOwogCi0gICAgZm9yIChpbnQgaSA9IDI7IGkgPCBhcmdzLmNv
dW50KCk7IGkrKykKLSAgICAgICAgd2luZG93LT5uZXdXaW5kb3coYXJncy5hdChpKSk7CisgICAg
Zm9yIChpbnQgaSA9IDI7IGkgPCBhcmdzLmNvdW50KCk7ICsraSkKKyAgICAgICAgaWYgKCFhcmdz
LmF0KGkpLnN0YXJ0c1dpdGgoIi0iKSAmJiAhYXJncy5hdChpIC0gMSkuc3RhcnRzV2l0aCgiLSIp
KQorICAgICAgICAgICAgd2luZG93LT5uZXdXaW5kb3coYXJncy5hdChpKSk7CiAKICAgICB3aW5k
b3ctPnNob3coKTsKICAgICByZXR1cm4gYXBwLmV4ZWMoKTsKSW5kZXg6IFdlYktpdC9xdC9XZWJD
b3JlU3VwcG9ydC9DaHJvbWVDbGllbnRRdC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0L3F0L1dl
YkNvcmVTdXBwb3J0L0Nocm9tZUNsaWVudFF0LmNwcAkocmV2aXNpb24gNTM0MjcpCisrKyBXZWJL
aXQvcXQvV2ViQ29yZVN1cHBvcnQvQ2hyb21lQ2xpZW50UXQuY3BwCSh3b3JraW5nIGNvcHkpCkBA
IC0yNSw2ICsyNSw3IEBACiAgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBB
UklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKICAqIE9GIFRISVMgU09GVFdBUkUsIEVW
RU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCiAgKi8KKwog
I2luY2x1ZGUgImNvbmZpZy5oIgogI2luY2x1ZGUgIkNocm9tZUNsaWVudFF0LmgiCiAKQEAgLTQy
LDYgKzQzLDEwIEBACiAjaW5jbHVkZSAiUVdlYlBhZ2VDbGllbnQuaCIKICNpbmNsdWRlICJTZWN1
cml0eU9yaWdpbi5oIgogCisjaW5jbHVkZSA8cWRlYnVnLmg+CisjaW5jbHVkZSA8cXRleHRkb2N1
bWVudC5oPgorI2luY2x1ZGUgPHF0b29sdGlwLmg+CisKICNpbmNsdWRlICJxd2VicGFnZS5oIgog
I2luY2x1ZGUgInF3ZWJwYWdlX3AuaCIKICNpbmNsdWRlICJxd2ViZnJhbWVfcC5oIgpAQCAtNDks
MTIgKzU0LDExIEBACiAjaW5jbHVkZSAicXdlYnNlY3VyaXR5b3JpZ2luX3AuaCIKICNpbmNsdWRl
ICJxd2Vidmlldy5oIgogCi0jaW5jbHVkZSA8cXRvb2x0aXAuaD4KLSNpbmNsdWRlIDxxdGV4dGRv
Y3VtZW50Lmg+Ci0KLW5hbWVzcGFjZSBXZWJDb3JlCi17CisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NP
TVBPU0lUSU5HKQorI2luY2x1ZGUgIkdyYXBoaWNzTGF5ZXJRdC5oIgorI2VuZGlmCiAKK25hbWVz
cGFjZSBXZWJDb3JlIHsKIAogQ2hyb21lQ2xpZW50UXQ6OkNocm9tZUNsaWVudFF0KFFXZWJQYWdl
KiB3ZWJQYWdlKQogICAgIDogbV93ZWJQYWdlKHdlYlBhZ2UpCkBAIC00NjYsNiArNDcwLDI4IEBA
IHZvaWQgQ2hyb21lQ2xpZW50UXQ6OnJlcXVlc3RHZW9sb2NhdGlvblAKICAgICBub3RJbXBsZW1l
bnRlZCgpOwogfQogCisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQordm9pZCBDaHJv
bWVDbGllbnRRdDo6YXR0YWNoUm9vdEdyYXBoaWNzTGF5ZXIoRnJhbWUqIGZyYW1lLCBHcmFwaGlj
c0xheWVyKiBncmFwaGljc0xheWVyKQoreyAgICAKKyAgICBpZiAocGxhdGZvcm1QYWdlQ2xpZW50
KCkpCisgICAgICAgIHBsYXRmb3JtUGFnZUNsaWVudCgpLT5zZXRSb290R3JhcGhpY3NMYXllcihn
cmFwaGljc0xheWVyID8gZ3JhcGhpY3NMYXllci0+bmF0aXZlTGF5ZXIoKSA6IDApOworfQorCit2
b2lkIENocm9tZUNsaWVudFF0OjpzZXROZWVkc09uZVNob3REcmF3aW5nU3luY2hyb25pemF0aW9u
KCkKK3sKKyAgICAvLyB3ZSB3YW50IHRoZSBsYXllcnMgdG8gc3luY2hyb25pemUgbmV4dCB0aW1l
IHdlIHVwZGF0ZSB0aGUgc2NyZWVuIGFueXdheQorICAgIGlmIChwbGF0Zm9ybVBhZ2VDbGllbnQo
KSkKKyAgICAgICAgcGxhdGZvcm1QYWdlQ2xpZW50KCktPm1hcmtGb3JTeW5jKGZhbHNlKTsKK30K
Kwordm9pZCBDaHJvbWVDbGllbnRRdDo6c2NoZWR1bGVDb21wb3NpdGluZ0xheWVyU3luYygpCit7
CisgICAgLy8gd2Ugd2FudCB0aGUgbGF5ZXJzIHRvIHN5bmNocm9uaXplIEFTQVAKKyAgICBpZiAo
cGxhdGZvcm1QYWdlQ2xpZW50KCkpCisgICAgICAgIHBsYXRmb3JtUGFnZUNsaWVudCgpLT5tYXJr
Rm9yU3luYyh0cnVlKTsKK30KKyNlbmRpZgorCiBRdEFic3RyYWN0V2ViUG9wdXAqIENocm9tZUNs
aWVudFF0OjpjcmVhdGVQb3B1cCgpCiB7CiAgICAgcmV0dXJuIG5ldyBRdEZhbGxiYWNrV2ViUG9w
dXA7CkluZGV4OiBXZWJLaXQvcXQvV2ViQ29yZVN1cHBvcnQvQ2hyb21lQ2xpZW50UXQuaAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBXZWJLaXQvcXQvV2ViQ29yZVN1cHBvcnQvQ2hyb21lQ2xpZW50UXQuaAkocmV2
aXNpb24gNTM0MjcpCisrKyBXZWJLaXQvcXQvV2ViQ29yZVN1cHBvcnQvQ2hyb21lQ2xpZW50UXQu
aAkod29ya2luZyBjb3B5KQpAQCAtMTIzLDYgKzEyMywxNSBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7
CiAjaWYgRU5BQkxFKE9GRkxJTkVfV0VCX0FQUExJQ0FUSU9OUykKICAgICAgICAgdmlydHVhbCB2
b2lkIHJlYWNoZWRNYXhBcHBDYWNoZVNpemUoaW50NjRfdCBzcGFjZU5lZWRlZCk7CiAjZW5kaWYK
KworI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKKyAgICAgICAgLy8gc2VlIENocm9t
ZUNsaWVudC5oCisgICAgICAgIC8vIHRoaXMgaXMgYSBob29rIGZvciBXZWJDb3JlIHRvIHRlbGwg
dXMgd2hhdCB3ZSBuZWVkIHRvIGRvIHdpdGggdGhlIEdyYXBoaWNzTGF5ZXJzCisgICAgICAgIHZp
cnR1YWwgdm9pZCBhdHRhY2hSb290R3JhcGhpY3NMYXllcihGcmFtZSosIEdyYXBoaWNzTGF5ZXIq
KTsKKyAgICAgICAgdmlydHVhbCB2b2lkIHNldE5lZWRzT25lU2hvdERyYXdpbmdTeW5jaHJvbml6
YXRpb24oKTsKKyAgICAgICAgdmlydHVhbCB2b2lkIHNjaGVkdWxlQ29tcG9zaXRpbmdMYXllclN5
bmMoKTsKKyNlbmRpZgorCiAgICAgICAgIHZpcnR1YWwgdm9pZCBydW5PcGVuUGFuZWwoRnJhbWUq
LCBQYXNzUmVmUHRyPEZpbGVDaG9vc2VyPik7CiAKICAgICAgICAgdmlydHVhbCB2b2lkIGZvcm1T
dGF0ZURpZENoYW5nZShjb25zdCBOb2RlKikgeyB9Cg==
</data>
<flag name="review"
          id="29389"
          type_id="1"
          status="+"
          setter="koivisto"
    />
          </attachment>
      

    </bug>

</bugzilla>